From 2e47c6508c0b7c54152cf859f5faf00d8971a97e Mon Sep 17 00:00:00 2001 From: tianshu129 Date: Tue, 18 Jan 2022 22:44:14 +0800 Subject: [PATCH] =?UTF-8?q?v2.0.0=20avri:=20Modifies=20the=20output=20form?= =?UTF-8?q?=20of=20the=20results.=20The=20results=20are=20output=20in=20on?= =?UTF-8?q?e=20table=20only,=20containing=20the=20mean=20and=20sd.=20The?= =?UTF-8?q?=20data=20can=20be=20optionally=20expressed=20in=20scientific?= =?UTF-8?q?=20notation.=20trs:=20added=20the=20'fun'=20parameter,=20you=20?= =?UTF-8?q?can=20choose=20the=20resampling=20function,=20such=20as=20the?= =?UTF-8?q?=20maximum=20value.=20prop:=20new=20function=20to=20convert=20t?= =?UTF-8?q?he=20time=20series=20into=20a=20proportional=20time=20series.?= =?UTF-8?q?=20statdf:=20remove=20the=20time=20column=20from=20the=20result?= =?UTF-8?q?.=20The=20'prop'=20function=20can=20be=20called=20internally=20?= =?UTF-8?q?to=20account=20for=20the=20statistics=20of=20proportional=20tim?= =?UTF-8?q?e=20series.=20svri:=20New=20function=20to=20select=20a=20specif?= =?UTF-8?q?ic=20function=20to=20calculate=20the=20variation.=20For=20examp?= =?UTF-8?q?le=20the=20maximum=20value=20of=20during=20all=201:00.=20dm8n?= =?UTF-8?q?=5Fnp=20:=20New=20function,=20a=20simplified=20version=20of=20t?= =?UTF-8?q?he=20dm8n=20function=20without=20the=20drawing=20module.=20dm8n?= =?UTF-8?q?=5Fbatch:=20New=20function,=20batch=20calculate=20the=20maximum?= =?UTF-8?q?=20eight-hour=20ozone=20at=20multiple=20sites.=20geom=5Fts=20?= =?UTF-8?q?=EF=BC=9ANew=20function,=20draw=20time=20series,=20support=20po?= =?UTF-8?q?int,=20line,=20area,=20bar.=20geom=5Fts=5Fbatch:=20new=20functi?= =?UTF-8?q?on,=20plot=20time=20series=20in=20batch.=20geom=5Favri:=20new?= =?UTF-8?q?=20function,=20plot=20the=20average=20variation.=20geom=5Favri?= =?UTF-8?q?=5Fbatch:=20new=20function,=20plot=20the=20average=20variations?= =?UTF-8?q?=20in=20batch.=20geom=5Ftsw:=20new=20function,=20plot=20the=20w?= =?UTF-8?q?ind=20time=20series.=20loh\ofp\vocct=20function=20results=20add?= =?UTF-8?q?ed=20statistics=20tables=20containing:=20variance,=20quantile,?= =?UTF-8?q?=20maximum=20and=20minimum=20values.=20tuv=5Fbatch:=20fixed=20a?= =?UTF-8?q?n=20error.=20Updated=20the=20VOC=20database=20and=20optimized?= =?UTF-8?q?=20the=20matching.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DESCRIPTION | 4 +- NAMESPACE | 28 ++++ R/avri.R | 37 +++-- R/dm8n_batch.R | 58 +++++++ R/dm8n_np.R | 170 +++++++++++++++++++++ R/geom_avri.r | 68 +++++++++ R/geom_avri_batch.r | 87 +++++++++++ R/geom_ts.r | 334 +++++++++++++++++++++++++++++++++++++++++ R/geom_ts_batch.r | 132 ++++++++++++++++ R/geom_tsw.r | 42 ++++++ R/globals.r | 1 + R/loh.R | 128 ++++++++++------ R/ofp.R | 132 +++++++++------- R/prop.R | 20 +++ R/statdf.R | 19 ++- R/svri.R | 156 +++++++++++++++++++ R/sysdata.rda | Bin 71180 -> 71665 bytes R/trs.R | 17 ++- R/tsplotp.R | 2 +- R/tuv.R | 1 + R/tuv_batch.R | 1 + R/tuv_core.R | 8 +- R/vocct.R | 104 +++++++------ man/avri.Rd | 5 +- man/dm8n_batch.Rd | 47 ++++++ man/dm8n_np.Rd | 56 +++++++ man/geom_avri.Rd | 49 ++++++ man/geom_avri_batch.Rd | 67 +++++++++ man/geom_ts.Rd | 97 ++++++++++++ man/geom_ts_batch.Rd | 92 ++++++++++++ man/geom_tsw.Rd | 43 ++++++ man/loh.Rd | 5 +- man/ofp.Rd | 5 +- man/prop.Rd | 24 +++ man/statdf.Rd | 16 +- man/svri.Rd | 79 ++++++++++ man/trs.Rd | 12 +- man/vocct.Rd | 5 +- 38 files changed, 1966 insertions(+), 185 deletions(-) create mode 100644 R/dm8n_batch.R create mode 100644 R/dm8n_np.R create mode 100644 R/geom_avri.r create mode 100644 R/geom_avri_batch.r create mode 100644 R/geom_ts.r create mode 100644 R/geom_ts_batch.r create mode 100644 R/geom_tsw.r create mode 100644 R/globals.r create mode 100644 R/prop.R create mode 100644 R/svri.R create mode 100644 man/dm8n_batch.Rd create mode 100644 man/dm8n_np.Rd create mode 100644 man/geom_avri.Rd create mode 100644 man/geom_avri_batch.Rd create mode 100644 man/geom_ts.Rd create mode 100644 man/geom_ts_batch.Rd create mode 100644 man/geom_tsw.Rd create mode 100644 man/prop.Rd create mode 100644 man/svri.Rd diff --git a/DESCRIPTION b/DESCRIPTION index 575ae68..2dbeac5 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: foqat Type: Package Title: Field Observation Quick Analysis Toolkit -Version: 1.7.2 +Version: 2.0.0 Author: Tianshu Chen Maintainer: Tianshu Chen Description: Tools for quickly processing and analyzing @@ -21,7 +21,7 @@ BugReports: https://github.com/tianshu129/foqat/issues Depends: R (>= 3.5.0) Imports: lubridate, magrittr, dplyr, plyr, stats, stringr, utils, lmodel2, reshape2, ggplot2, ggplotify, gridExtra, - scales, rvest, xml2 + scales, rvest, xml2, ggnewscale, patchwork License: GPL-3 | file LICENSE Encoding: UTF-8 LazyData: true diff --git a/NAMESPACE b/NAMESPACE index d0f00d9..8b4a0be 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -4,12 +4,21 @@ export(afp) export(anylm) export(avri) export(dm8n) +export(dm8n_batch) +export(dm8n_np) export(fm) +export(geom_avri) +export(geom_avri_batch) +export(geom_ts) +export(geom_ts_batch) +export(geom_tsw) export(koh) export(loh) export(nsvp) export(ofp) +export(prop) export(statdf) +export(svri) export(transp) export(trs) export(tsplotp) @@ -19,8 +28,11 @@ export(vocct) import(ggplot2) import(lubridate) import(magrittr) +import(patchwork) importFrom(dplyr,full_join) importFrom(dplyr,left_join) +importFrom(ggnewscale,new_scale_color) +importFrom(ggnewscale,new_scale_fill) importFrom(ggplot2,aes) importFrom(ggplot2,aes_string) importFrom(ggplot2,as_labeller) @@ -28,13 +40,25 @@ importFrom(ggplot2,element_blank) importFrom(ggplot2,element_text) importFrom(ggplot2,facet_wrap) importFrom(ggplot2,geom_abline) +importFrom(ggplot2,geom_area) +importFrom(ggplot2,geom_bar) importFrom(ggplot2,geom_line) importFrom(ggplot2,geom_point) +importFrom(ggplot2,geom_text) importFrom(ggplot2,ggplot) importFrom(ggplot2,ggplotGrob) importFrom(ggplot2,ggtitle) +importFrom(ggplot2,scale_color_discrete) importFrom(ggplot2,scale_color_gradientn) +importFrom(ggplot2,scale_color_manual) importFrom(ggplot2,scale_colour_gradientn) +importFrom(ggplot2,scale_colour_viridis_c) +importFrom(ggplot2,scale_fill_discrete) +importFrom(ggplot2,scale_fill_manual) +importFrom(ggplot2,scale_linetype_manual) +importFrom(ggplot2,scale_shape_manual) +importFrom(ggplot2,scale_x_datetime) +importFrom(ggplot2,scale_y_continuous) importFrom(ggplot2,theme) importFrom(ggplot2,theme_bw) importFrom(ggplotify,as.ggplot) @@ -46,6 +70,7 @@ importFrom(lmodel2,lmodel2) importFrom(lubridate,duration) importFrom(lubridate,hour) importFrom(lubridate,hours) +importFrom(lubridate,is.timepoint) importFrom(lubridate,minute) importFrom(lubridate,minutes) importFrom(lubridate,second) @@ -55,12 +80,15 @@ importFrom(reshape2,dcast) importFrom(reshape2,melt) importFrom(rvest,html_nodes) importFrom(rvest,html_text) +importFrom(scales,hue_pal) importFrom(scales,pretty_breaks) importFrom(scales,rescale) importFrom(stats,aggregate) +importFrom(stats,complete.cases) importFrom(stats,na.omit) importFrom(stats,quantile) importFrom(stats,sd) +importFrom(stats,setNames) importFrom(stringr,str_split_fixed) importFrom(utils,download.file) importFrom(utils,read.delim) diff --git a/R/avri.R b/R/avri.R index 6b71b43..dc42e73 100644 --- a/R/avri.R +++ b/R/avri.R @@ -25,6 +25,7 @@ #' @param wind logical value. if TRUE, please set coliwd, coliws. #' @param coliws numeric value, column index of wind speed in dataframe. #' @param coliwd numeric value, column index of wind direction (degree) in dataframe. +#' @param sn logical value. if TRUE, the results will be presented by scientific notation (string). #' @return a list with 2 dataframe (average and SD). The first column of dataframe is the serial number within the period. The #' average variation (or SD) start from the second column. \cr #' Note that when the pattern USES @@ -32,16 +33,16 @@ #' element in the average variation. For example, if the first timestamp of data is #' "2010-05-01 12:00:00", the resolution is 1 hour, the mode is "ncycle", and the #' value is 24, then the result represents diurnal variation starting from 12 o'clock. - +#' #' @export #' @examples #' avri(met, bkip = "1 hour", mode = "recipes", value = "day", #' st = "2017-05-01 00:00:00", wind = TRUE, coliws = 4, coliwd = 5) -#' @importFrom dplyr full_join +#' @importFrom dplyr full_join left_join #' @importFrom stats aggregate #' @importFrom lubridate duration -avri<-function(df, bkip=NULL, mode = "recipes", value = "day", st = NULL, et = NULL, na.rm = TRUE, digits = 2, wind = FALSE, coliws = 2, coliwd = 3){ +avri<-function(df, bkip=NULL, mode = "recipes", value = "day", st = NULL, et = NULL, na.rm = TRUE, digits = 2, wind = FALSE, coliws = 2, coliwd = 3, sn=FALSE){ #time resampling if(mode!="custom"){ @@ -83,7 +84,7 @@ avri<-function(df, bkip=NULL, mode = "recipes", value = "day", st = NULL, et = N mod_list=month(rs_df[,1]) } }else if(mode=="ncycle"){ - mod_list=seq(0,nrow(rs_df)-1,1)%%value + mod_list=seq(0,nrow(rs_df)-1,1)%%as.numeric(value) }else if(mode=="custom"){ mod_list=rs_df[,1] } @@ -125,18 +126,34 @@ avri<-function(df, bkip=NULL, mode = "recipes", value = "day", st = NULL, et = N #format average data (avoid NA) if(!all(is.na(results[, -1]))){ if(ncol(results)==2){ - results[,-1]=do.call(rbind, lapply(results[,-1], formatC, format = "e", digits = digits)) + if(sn==TRUE){ + results[,-1]=do.call(rbind, lapply(results[,-1], formatC, format = "e", digits = digits)) + }else{ + results[,-1]=do.call(rbind, lapply(results[,-1], as.numeric)) + } }else{ - results[,-1]=lapply(results[,-1], formatC, format = "e", digits = digits) + if(sn==TRUE){ + results[,-1]=lapply(results[,-1], formatC, format = "e", digits = digits) + }else{ + results[,-1]=lapply(results[,-1], as.numeric) + } } } #format sd data (avoid NA) if(!all(is.na(results_sd[, -1]))){ if(ncol(results_sd)==2){ - results_sd[,-1]=do.call(rbind, lapply(results_sd[,-1], formatC, format = "e", digits = digits)) + if(sn==TRUE){ + results_sd[,-1]=do.call(rbind, lapply(results_sd[,-1], formatC, format = "e", digits = digits)) + }else{ + results_sd[,-1]=do.call(rbind, lapply(results_sd[,-1], as.numeric)) + } }else{ - results_sd[,-1]=lapply(results_sd[,-1], formatC, format = "e", digits = digits) + if(sn==TRUE){ + results_sd[,-1]=lapply(results_sd[,-1], formatC, format = "e", digits = digits) + }else{ + results_sd[,-1]=lapply(results_sd[,-1], as.numeric) + } } } @@ -170,6 +187,8 @@ avri<-function(df, bkip=NULL, mode = "recipes", value = "day", st = NULL, et = N #output df_average=results df_sd=results_sd - results <- list(df_average = df_average, df_sd = df_sd) + names(df_average)[-1]=paste0(names(df)[-1],"_ave") + names(df_sd)[-1]=paste0(names(df)[-1],"_sd") + results=left_join(df_average, df_sd, by = names(df_average)[1]) return(results) } diff --git a/R/dm8n_batch.R b/R/dm8n_batch.R new file mode 100644 index 0000000..d4a80ec --- /dev/null +++ b/R/dm8n_batch.R @@ -0,0 +1,58 @@ +#' Calculate daily maximum-8-hour ozone in batch +#' +#' Calculates daily maximum-8-hour ozone in batch +#' +#' This function can calculate daily maximum-8-hour ozone in batch. +#' @param df dataframe of time series for ozone and other related parameters. +#' @param starthour numeric, start hour for calculating 8-hour ozone. By default, it equals to 0. +#' @param endhour numeric, end hour for calculating 8-hour ozone. By default, it equals to 16 which means averaging ozone between 16~23. +#' @param nh numeric. The number of effective hourly concentrations per 8-hour period. +#' @param nc numeric. The number of effective 8-hour average concentrations per day. +#' @param na.rm logical. Should missing values (including NaN) be omitted from the calculations? +#' @param outputmode numeric, the format of the output, possible value: 1 or 2. See 'value' for the results of filling in 1 or 2. +#' @return a dataframe depends on the value of +#' 'outputMode'. Value 1 will output 1 list which incudes +#' 1 table (maximum-8-hour ozone). Value 2 will output +#' 1 list which contains 4 tables (8-hour ozone, +#' statistics of the number of effective hourly +#' concentrations in each 8-hour average concentration, +#' statistics of the number of effective 8-hour average +#' concentrations in each day, maximum-8-hour ozone). +#' +#' @export +#' @importFrom dplyr left_join + +dm8n_batch<-function(df, starthour = 0, endhour=16, nh=6, nc=14, na.rm = TRUE, outputmode = 1){ + xi_df=df[,c(1,2)] + xi=dm8n_np(xi_df, colid = 1, colio = 2, starthour = 0, endhour=16, nh=6, nc=14, na.rm = TRUE, outputmode = 2) + xi_D8_final=xi[["D8"]] + xi_D8_count_final=xi[["D8_count"]] + xi_D8_count_by_day_final=xi[["D8_count_by_day"]] + xi_DMAX8_final=xi[["DMAX8"]] + + if(ncol(df)>2){ + for(i in 3:ncol(df)){ + xi_df=df[,c(1,i)] + xi=dm8n_np(xi_df, colid = 1, colio = 2, starthour = 0, endhour=16, nh=6, nc=14, na.rm = TRUE, outputmode = 2) + xi_D8=xi[["D8"]] + xi_D8_count=xi[["D8_count"]] + xi_D8_count_by_day=xi[["D8_count_by_day"]] + xi_DMAX8=xi[["DMAX8"]] + #left_join + xi_D8_final= left_join(xi_D8_final, xi_D8, by = names(xi_D8_final)[c(1,2,3)]) + xi_D8_count_final= left_join(xi_D8_count_final, xi_D8_count, by = names(xi_D8_count_final)[c(1,2,3)]) + xi_D8_count_by_day_final= left_join(xi_D8_count_by_day_final, xi_D8_count_by_day, by = names(xi_D8_count_by_day_final)[1]) + xi_DMAX8_final= left_join(xi_DMAX8_final, xi_DMAX8, by = names(xi_DMAX8_final)[1]) + } + } + + #set out put + if(outputmode==2){ + names(xi_D8_count_final)[c(-1,-2,-3)]=names(df)[-1] + names(xi_D8_count_by_day_final)[-1]=names(df)[-1] + results = list(D8=xi_D8_final, D8_count=xi_D8_count_final, D8_count_by_day=xi_D8_count_by_day_final, DMAX8=xi_DMAX8_final) + }else{ + results = xi_DMAX8_final + } + +} \ No newline at end of file diff --git a/R/dm8n_np.R b/R/dm8n_np.R new file mode 100644 index 0000000..24b8475 --- /dev/null +++ b/R/dm8n_np.R @@ -0,0 +1,170 @@ +#' Calculate daily maximum-8-hour ozone without printing plot +#' +#' Calculates daily maximum-8-hour ozone from ozone observation data without printing plot +#' +#' This function can calculate daily maximum-8-hour ozone and other parameters corresponding to it. +#' +#' @param df dataframe of time series for ozone and other related parameters. +#' @param colid column index for date-time. By default, it equals to 1. +#' @param colio column index for ozone. By default, it equals to 2. +#' @param starthour numeric, start hour for calculating 8-hour ozone. By default, it equals to 0. +#' @param endhour numeric, end hour for calculating 8-hour ozone. By default, it equals to 16 which means averaging ozone between 16~23. +#' @param nh numeric. The number of effective hourly concentrations per 8-hour period. +#' @param nc numeric. The number of effective 8-hour average concentrations per day. +#' @param na.rm logical. Should missing values (including NaN) be omitted from the calculations? +#' @param outputmode numeric, the format of the output, possible value: 1 or 2. See 'value' for the results of filling in 1 or 2. +#' @return a dataframe depends on the value of +#' 'outputMode'. Value 1 will output 1 list which incudes +#' 1 table (maximum-8-hour ozone). Value 2 will output +#' 1 list which contains 4 tables (8-hour ozone, +#' statistics of the number of effective hourly +#' concentrations in each 8-hour average concentration, +#' statistics of the number of effective 8-hour average +#' concentrations in each day, maximum-8-hour ozone). +#' +#' @export +#' @examples +#' dm8n_np(aqi,colio=6) +#' @import lubridate +#' @importFrom stats aggregate +#' @importFrom utils stack unstack +#' @importFrom plyr ddply . +#' @importFrom dplyr left_join +#' @importFrom reshape2 melt + +dm8n_np<-function(df, colid = 1, colio = 2, starthour = 0, endhour=16, nh=6, nc=14, na.rm = TRUE, outputmode = 1){ + + #In case df is not a dataframe. + df_names <- colnames(df) + df <- data.frame(df,stringsAsFactors = FALSE) + colnames(df) <- df_names + + #move datetime to first column + if(colid != 1){ + df[,c(1,colid)] = df[,c(colid,1)] + colnames(df)[c(1,colid)] = colnames(df)[c(colid,1)] + } + + #move ozone to second column + if(colio != 2){ + df[,c(2,colio)] = df[,c(colio,2)] + colnames(df)[c(2,colio)] = colnames(df)[c(colio,2)] + } + + + df <- trs(df, bkip="1 hour", na.rm = na.rm) + + #get data list + datelist_raw<-as.Date(df[,1]) + datelist<-datelist_raw[!duplicated(datelist_raw)] + + #duplicated column if only 1 site exited. + ncol_ori=ncol(df) + if(ncol_ori==2){ + df$O3foqat=df[,2] + } + + #sstup dataframe by 0-7 in first day + df_tar=df[as.Date(df[,1])==datelist[1],] + st=starthour + en=starthour+7 + + D8=colMeans(df_tar[hour(df_tar[,1])>=st&hour(df_tar[,1])<=en,-1],na.rm = na.rm) + D8=stack(D8) + D8=unstack(D8) + D8=data.frame(t(D8)) + D8=data.frame(date=as.Date(df_tar[1,1]),start_hour=st,end_hour=en,D8) + #setup df_tar fot count by 0-7 in first day + count_col=colSums(!is.na(df_tar[hour(df_tar[,1])>=st&hour(df_tar[,1])<=en,-1])) + count_col=data.frame(t(count_col)) + colnames(count_col)=colnames(df_tar)[-1] + D8_count=data.frame(date=as.Date(df_tar[1,1]),start_hour=st,end_hour=en,count_col) + + #loop for d8 d8_count + for (j in 1:length(datelist)){ + #select day + df_tar=df[as.Date(df[,1])==datelist[j],] + print(datelist[j]) + for (i in seq(starthour,endhour,1)){ + st=i + en=i+7 + #count + count_col=colSums(!is.na(df_tar[hour(df_tar[,1])>=st&hour(df_tar[,1])<=en,-1]), na.rm = na.rm) + count_col_nh=count_col + count_col=data.frame(t(count_col)) + colnames(count_col)=colnames(df_tar)[-1] + D8_count_sam=data.frame(date=datelist[j],start_hour=st,end_hour=en,count_col) + D8_count=rbind(D8_count,D8_count_sam) + #D8 + D8_sam=colMeans(df_tar[hour(df_tar[,1])>=st&hour(df_tar[,1])<=en,-1], na.rm = na.rm) + D8_sam=stack(D8_sam) + D8_sam=unstack(D8_sam) + D8_sam=data.frame(t(D8_sam)) + D8_sam=data.frame(date=datelist[j],start_hour=st,end_hour=en,D8_sam) + D8=rbind(D8,D8_sam) + } + } + #remove first row + D8=D8[-1,] + D8_count=D8_count[-1,] + + #filter by 6/8 for 8-hour + D8[D8_count[,4]=nh,5]=1 + D8_count_by_day=D8_count[,c(1,5)] + D8_count=D8_count[,-5] + D8_count_by_day=data.frame(aggregate(D8_count_by_day[,2], by = list(as.Date(D8_count_by_day[,1])), sum, na.rm=TRUE)) + colnames(D8_count_by_day)[1]="date" + DMAX8=left_join(D8_count_by_day,DMAX8) + DMAX8=DMAX8[,-2] + DMAX8[D8_count_by_day[,2]7]=NA +#' aqi2$NO2=aqi2$NO2*0.3 +#' geom_ts( +#' df=aqi2, +#' yl=c(3,2), +#' yr=6, +#' alist=c(3,2), +#' llist=6, +#' alab=list(bquote(NO[2]~" "), bquote(NO~" ")), +#' llab=list(bquote(O[3]~" ")), +#' yllab=bquote(NO[x]~" "~(ppbv)), +#' yrlab=bquote(O[3]~" "~(ppbv)), +#' lcc="#ff4d4f", +#' aff=c("#096dd9","#69c0ff"), +#' xlab="Datetime") +#' @importFrom reshape2 melt +#' @importFrom ggplot2 ggplot geom_area geom_bar geom_point geom_line scale_fill_discrete scale_fill_manual scale_linetype_manual scale_color_discrete scale_color_manual scale_shape_manual scale_y_continuous scale_x_datetime theme +#' @importFrom ggnewscale new_scale_color new_scale_fill +#' @importFrom stats setNames + +geom_ts <- function(df, +yl=NULL, yr=NULL, +yllab=NULL, yrlab=NULL, xlab=NULL, +llist=NULL, plist=NULL, alist=NULL, blist=NULL, +llab=NULL, plab=NULL, alab=NULL, blab=NULL, +ltype=NULL, pshape=NULL, lsize=1, psize=1, +lcc=NULL, pcc=NULL, aff=NULL, bff=NULL){ + #命名时间列################################# + names(df)[1]="Datetime" + + #副轴数值范围确定################################# + ryl=abs(max(df[,yl],na.rm = TRUE)-min(df[,yl],na.rm = TRUE)) + if(length(yr)!=0){ + ryr=abs(max(df[,yr],na.rm = TRUE)-min(df[,yr],na.rm = TRUE)) + } + + #初始化图层################################# + p = ggplot() + + #绘制面图层################################# + + p=p+new_scale_color()+new_scale_fill() + + ##if area in left + if(length(intersect(alist,yl))!=0){ + ###右Y和面积型交集列号 + yl_alist=intersect(alist,yl) + ###用右Y和面积型交集列号从df取子数据集 + df_yl_alist=df[,c(1,yl_alist)] + ###为因子排序提前提取交集物种名 + fc_yl_alist=names(df_yl_alist)[-1] + ###子数据集变形以供画图 + df_yl_alist=melt(df_yl_alist, id.vars = names(df_yl_alist)[1]) + ###因子排序 + df_yl_alist$variable=factor(df_yl_alist$variable,levels=fc_yl_alist) + ###NA值用0 + df_yl_alist[is.na(df_yl_alist)]=0 + p=p+geom_area(data=df_yl_alist, aes(x = Datetime,y = value, fill = variable), position = 'stack') + } + + ##if area in right + if(length(intersect(alist,yr))!=0){ + ###左Y和面积型交集列号 + yr_alist=intersect(alist,yr) + ###用左Y和面积型交集列号从df取子数据集 + df_yr_alist=df[,c(1,yr_alist)] + ###为因子排序提前提取交集物种名 + fc_yr_alist=names(df_yr_alist)[-1] + ###子数据集变形以供画图 + df_yr_alist=melt(df_yr_alist, id.vars = names(df_yr_alist)[1]) + ###因子排序 + df_yr_alist$variable=factor(df_yr_alist$variable,levels=fc_yr_alist) + ###NA值用0 + df_yr_alist[is.na(df_yr_alist)]=0 + p=p+geom_area(data=df_yr_alist, aes(x = Datetime,y = value*ryl/ryr, fill = variable), position = 'stack') + } + + #if(!exists("yl_alist")){yl_alist=NULL} + #if(!exists("yr_alist")){yr_alist=NULL} + + ##限制legend + if(length(alab)==0){alab=names(df)[alist]} + labs=setNames(alab,names(df)[alist]) + + ##判断填充需求 + if(length(aff)==0){ + p = p + scale_fill_discrete(labels=labs) + }else{ + cols=setNames(aff,names(df[,alist])) + p = p + scale_fill_manual(values=cols, labels=labs) + } + + #绘制柱图层################################# + + p=p+new_scale_color()+new_scale_fill() + + ##if area in left + if(length(intersect(blist,yl))!=0){ + ###右Y和面积型交集列号 + yl_blist=intersect(blist,yl) + ###用右Y和面积型交集列号从df取子数据集 + df_yl_blist=df[,c(1,yl_blist)] + ###为因子排序提前提取交集物种名 + fc_yl_blist=names(df_yl_blist)[-1] + ###子数据集变形以供画图 + df_yl_blist=melt(df_yl_blist, id.vars = names(df_yl_blist)[1]) + ###因子排序 + df_yl_blist$variable=factor(df_yl_blist$variable,levels=fc_yl_blist) + ###NA值用0 + df_yl_blist[is.na(df_yl_blist)]=0 + p=p+geom_bar(data=df_yl_blist, aes(x = Datetime,y = value, fill = variable), stat = 'identity') + } + + ##if area in right + if(length(intersect(blist,yr))!=0){ + ###左Y和面积型交集列号 + yr_blist=intersect(blist,yr) + ###用左Y和面积型交集列号从df取子数据集 + df_yr_blist=df[,c(1,yr_blist)] + ###为因子排序提前提取交集物种名 + fc_yr_blist=names(df_yr_blist)[-1] + ###子数据集变形以供画图 + df_yr_blist=melt(df_yr_blist, id.vars = names(df_yr_blist)[1]) + ###因子排序 + df_yr_blist$variable=factor(df_yr_blist$variable,levels=fc_yr_blist) + ###NA值用0 + df_yr_blist[is.na(df_yr_blist)]=0 + p=p+geom_bar(data=df_yr_blist, aes(x = Datetime,y = value*ryl/ryr, fill = variable), stat = 'identity') + } + + #if(!exists("yl_blist")){yl_blist=NULL} + #if(!exists("yr_blist")){yr_blist=NULL} + + ##限制legend + if(length(blab)==0){blab=names(df)[blist]} + labs=setNames(blab,names(df)[blist]) + + ##判断填充需求 + if(length(bff)==0){ + p = p + scale_fill_discrete(labels=labs) + }else{ + cols=setNames(bff,names(df[,blist])) + p = p + scale_fill_manual(values=cols, labels=labs) + } + + + #绘制线图层################################# + + p=p+new_scale_color()+new_scale_fill() + + ##if line in left + if(length(intersect(llist,yl))!=0){ + ###左Y和线型交集列号 + yl_llist=intersect(llist,yl) + ###用左Y和线型交集列号从df取子数据集 + df_yl_llist=df[,c(1,yl_llist)] + ###为因子排序提前提取交集物种名 + fc_yl_llist=names(df_yl_llist)[-1] + ###子数据集变形以供画图 + df_yl_llist=melt(df_yl_llist, id.vars = names(df_yl_llist)[1]) + ###因子排序 + df_yl_llist$variable=factor(df_yl_llist$variable,levels=fc_yl_llist) + ### + if(length(ltype)==0){ + p=p+geom_line(data=df_yl_llist, aes(x=df_yl_llist[,1], y=value, color=variable), size=lsize) + }else{ + p=p+geom_line(data=df_yl_llist, aes(x=df_yl_llist[,1], y=value, color=variable, linetype=variable), size=lsize) + } + } + + ##if line in right + if(length(intersect(llist,yr))!=0){ + ###右Y和线型交集列号 + yr_llist=intersect(llist,yr) + ###用右Y和线型交集列号从df取子数据集 + df_yr_llist=df[,c(1,yr_llist)] + ###为因子排序提前提取交集物种名 + fc_yr_llist=names(df_yr_llist)[-1] + ###子数据集变形以供画图 + df_yr_llist=melt(df_yr_llist, id.vars = names(df_yr_llist)[1]) + ###因子排序 + df_yr_llist$variable=factor(df_yr_llist$variable,levels=fc_yr_llist) + if(length(ltype)==0){ + p=p+geom_line(data=df_yr_llist, aes(x=df_yr_llist[,1], y=value*ryl/ryr, color=variable), size=lsize) + }else{ + p=p+geom_line(data=df_yr_llist, aes(x=df_yr_llist[,1], y=value*ryl/ryr, color=variable, linetype=variable), size=lsize) + } + } + + #if(!exists("yl_llist")){yl_llist=NULL} + #if(!exists("yr_llist")){yr_llist=NULL} + + ##限制legend + if(length(llab)==0){llab=names(df)[llist]} + labs=setNames(llab,names(df)[llist]) + + ##判断线型需求 + ##判断线型需求 + if(length(ltype)!=0){ + p = p + scale_linetype_manual(values=ltype, labels=labs) + } + + ##判断颜色需求 + if(length(lcc)==0){ + p = p + scale_color_discrete(labels=labs) + }else{ + cols=setNames(lcc,names(df[,llist])) + p = p + scale_color_manual(values=cols, labels=labs) + } + + + #绘制点图层################################# + + p=p+new_scale_color()+new_scale_fill() + + ##if point in left + if(length(intersect(plist,yl))!=0){ + ###左Y和点型交集列号 + yl_plist=intersect(plist,yl) + ###用左Y和点型交集列号从df取子数据集 + df_yl_plist=df[,c(1,yl_plist)] + ###为因子排序提前提取交集物种名 + fc_yl_plist=names(df_yl_plist)[-1] + ###子数据集变形以供画图 + df_yl_plist=melt(df_yl_plist, id.vars = names(df_yl_plist)[1]) + ###因子排序 + df_yl_plist$variable=factor(df_yl_plist$variable,levels=fc_yl_plist) + if(length(pshape)==0){ + p=p+geom_point(data=df_yl_plist, aes(x=df_yl_plist[,1], y=value, color=variable), size=lsize) + }else{ + p=p+geom_point(data=df_yl_plist, aes(x=df_yl_plist[,1], y=value, color=variable, shape=variable), size=lsize) + } + } + + ##if point in right + if(length(intersect(plist,yr))!=0){ + ###右Y和线型交集列号 + yr_plist=intersect(plist,yr) + ###用右Y和线型交集列号从df取子数据集 + df_yr_plist=df[,c(1,yr_plist)] + ###为因子排序提前提取交集物种名 + fc_yr_plist=names(df_yr_plist)[-1] + ###子数据集变形以供画图 + df_yr_plist=melt(df_yr_plist, id.vars = names(df_yr_plist)[1]) + ###因子排序 + df_yr_plist$variable=factor(df_yr_plist$variable,levels=fc_yr_plist) + if(length(pshape)==0){ + p=p+geom_point(data=df_yr_plist, aes(x=df_yr_plist[,1], y=value*ryl/ryr, color=variable), size=lsize) + }else{ + p=p+geom_point(data=df_yr_plist, aes(x=df_yr_plist[,1], y=value*ryl/ryr, color=variable, shape=variable), size=lsize) + } + } + + #if(!exists("yl_plist")){yl_plist=NULL} + #if(!exists("yr_plist")){yr_plist=NULL} + + ##限制legend + if(length(plab)==0){plab=names(df)[plist]} + labs=setNames(plab,names(df)[plist]) + + ##判断点型需求 + if(length(pshape)!=0){ + p = p + scale_shape_manual(values=pshape, labels=labs) + } + + ##判断颜色需求 + + if(length(pcc)==0){ + p = p + scale_color_discrete(labels=labs) + }else{ + cols=setNames(pcc,names(df[,plist])) + p = p + scale_color_manual(values=cols, labels=labs)#, limits = lgorder) + } + + p + + #调节副轴范围################################# + if(length(yr)!=0){ + p = p + scale_y_continuous(expand = c(0, 0), sec.axis = sec_axis(~.*ryr/ryl, name = yrlab)) + }else{ + p = p + scale_y_continuous(expand = c(0, 0)) + } + + #加yl标题################################# + if(length(yllab)!=0){ + p = p + ylab(yllab) + } + + #加x标题################################# + if(length(xlab)!=0){ + p = p + xlab(xlab) + } + + + #时间列格式################################# + p=p+theme_bw()+scale_x_datetime(date_labels="%m/%d", expand = c(0, 0)) + + #调整图层顺序 + #p$layers[c(1,2,3,4,5,6)]=p$layers[c(5,6,1,2,3,4)] + + p=p+theme(legend.margin=margin(t = -0.25, r = 0.25, b = -0.25, l = 0.25, unit = "cm"),legend.title = element_blank(),legend.background = element_rect(fill=alpha('blue', 0))) + + return(p) +} \ No newline at end of file diff --git a/R/geom_ts_batch.r b/R/geom_ts_batch.r new file mode 100644 index 0000000..ca6cd8a --- /dev/null +++ b/R/geom_ts_batch.r @@ -0,0 +1,132 @@ +#' Plot time series in batch +#' +#' Easy way to plot time series in batch. +#' +#' @param df dataframe of time series. +#' @param xlab text expression of x axis label. The default vaule is NULL. +#' @param ylab text expression of y axis label. The default vaule is NULL. +#' @param cclist vector, colors of lines. The default vaule is NULL. +#' @param bquote logical value. Set to TRUE if you want to use bquote in labs (xlab and y lab). The default vaule is FALSE. +#' @param breaks One of: +#' - `NULL` for no breaks +#' - `waiver()` for the breaks specified by `date_breaks` +#' - A `Date`/`POSIXct` vector giving positions of breaks +#' - A function that takes the limits as input and returns breaks as output +#' @param date_breaks A string giving the distance between breaks like "2 +#' weeks", or "10 years". If both `breaks` and `date_breaks` are +#' specified, `date_breaks` wins. +#' @param date_minor_breaks A string giving the distance between minor breaks +#' like "2 weeks", or "10 years". If both `minor_breaks` and +#' `date_minor_breaks` are specified, `date_minor_breaks` wins. +#' @param minor_breaks One of: +#' - `NULL` for no breaks +#' - `waiver()` for the breaks specified by `date_minor_breaks` +#' - A `Date`/`POSIXct` vector giving positions of minor breaks +#' - A function that takes the limits as input and returns minor breaks as +#' output +#' @param date_labels A string giving the formatting specification for the +#' labels. Codes are defined in [strftime()]. If both `labels` +#' and `date_labels` are specified, `date_labels` wins. +#' @param labels One of: +#' - `NULL` no labels +#' - `waiver()` for the default labels computed by the transformation object +#' - A character vector giving labels (must be same length as `breaks`) +#' - A function that takes the breaks as input and returns labels as output. +#' Also accepts rlang lambda function notation. +#' @param expand For position scales, a vector of range expansion constants used +#' to add some padding around the data to ensure that they are placed some +#' distance away from the axes. Use the convenience function expansion() to +#' generate the values for the expand argument. The defaults are to expand the +#' scale by 5% on each side for continuous variables, and by 0.6 units on each +#' side for discrete variables. +#' @param panelgap gap of panels. The default vaule is 0.5. +#' +#' @export +#' @examples +#' #example 1 +#' geom_ts_batch(aqi) +#' #example 2 +#' xlab1="Time" +#' ylab1=c("NO","NO2","CO","SO2","O3") +#' geom_ts_batch(aqi, xlab=xlab1, ylab=ylab1) +#' #example 3 +#' xlab2=bquote(Time~"") +#' ylab2=list(bquote(NO~" "~(ppbv)), bquote(NO[2]~" +#' "~(ppbv)), bquote(CO~" "~(ppmv)), bquote(SO[2]~" +#' "~(ppbv)), bquote(O[3]~" "~(ppbv))) +#' cclist=c("#eb2f96", "#1890ff", "#52c41a", "#faad14", "#f5222d") +#' geom_ts_batch(aqi, xlab=xlab2, ylab=ylab2, cclist=cclist, bquote=TRUE) +#' @importFrom scales hue_pal +#' @import patchwork +#' @importFrom ggplot2 theme + +geom_ts_batch<-function( +df, +xlab=NULL, +ylab=NULL, +cclist=NULL, +bquote=FALSE, +breaks = waiver(), +date_breaks = waiver(), +labels = waiver(), +date_labels = waiver(), +minor_breaks = waiver(), +date_minor_breaks = waiver(), +expand = c(0,0), +panelgap=1 +){ + if(length(cclist)==0){cclist=hue_pal()(ncol(df)-1)} + for(i in 2:ncol(df)){ + plotdf=df[c(1,i)] + if(length(xlab)==0){xlab=names(df)[1]} + if(length(ylab)==0){ylab=names(df)[-1]} + if(bquote==FALSE){ + px=geom_ts(df=plotdf, yl=2, yr=NULL, + yllab=ylab[i-1], yrlab=NULL, xlab=xlab, + llist=2, plist=2, + llab=NULL, plab=NULL, alab=NULL, blab=NULL, + ltype=NULL, pshape=NULL, + lsize=1, psize=1, + lcc=c(cclist[i-1]), pcc=c(cclist[i-1]))+ + scale_x_datetime( + breaks = breaks, + date_breaks = date_breaks, + labels = labels, + date_labels = date_labels, + minor_breaks = minor_breaks, + date_minor_breaks = date_minor_breaks, + expand = expand + ) + }else{ + px=geom_ts(df=plotdf, yl=2, yr=NULL, + yllab=ylab[[i-1]], yrlab=NULL, xlab=xlab, + llist=2, plist=2, + llab=NULL, plab=NULL, alab=NULL, blab=NULL, + ltype=NULL, pshape=NULL, + lsize=1, psize=1, + lcc=c(cclist[i-1]), pcc=c(cclist[i-1]))+ + scale_x_datetime( + breaks = breaks, + date_breaks = date_breaks, + labels = labels, + date_labels = date_labels, + minor_breaks = minor_breaks, + date_minor_breaks = date_minor_breaks, + expand = expand + ) + } + if(i!=ncol(df)){ + px=px+theme(axis.title.x=element_blank(),axis.text.x=element_blank(),axis.ticks.x=element_blank()) + } + eval(parse(text=paste0("p",i-1,"=px"))) + if(i!=2){ + cfig=paste0(cfig,"+p",i-1) + }else{ + cfig=paste0("p",i-1) + } + } + + p=eval(parse(text=paste0("(",cfig," & theme(legend.position = 'none', plot.margin = margin(t=1, r=5, b=", panelgap, ", l=5)))+ plot_layout(guides = 'collect',ncol = 1)"))) + + return(p) +} \ No newline at end of file diff --git a/R/geom_tsw.r b/R/geom_tsw.r new file mode 100644 index 0000000..f438eb6 --- /dev/null +++ b/R/geom_tsw.r @@ -0,0 +1,42 @@ +#' Plot time series +#' +#' Easy way to plot time series. +#' +#' @param df dataframe contains time series. +#' @param coliws column index of wind speed. The default vaule is 2. +#' @param coliwd column index of wind direction. The default vaule is 3. +#' @param lsize size of line (wind speed). The default vaule is 0.8. +#' @param psize size of point (wind speed). The default vaule is NA. +#' @param msize size of mark (wind direction). The default vaule is 8. +#' @param tickx adjust value for the x position of wind direction legend. The default vaule is 0.05. +#' @param ticky adjust value for the y position of wind direction legend. The default vaule is -0.1. +#' @param tickwd direction of wind direction legend. The default vaule is 270. +#' +#' @export +#' @examples +#' geom_tsw(met, coliws=4, coliwd=5) +#' @importFrom ggplot2 ggplot geom_line geom_text scale_y_continuous scale_colour_viridis_c theme_bw + +geom_tsw <- function(df, coliws = 2, coliwd = 3, lsize = 0.8, psize=NA, msize = 8, tickx = 0.05, ticky = -0.1, tickwd = 270){ + met_wind=df + names(met_wind)[c(1, coliws, coliwd)]=c("Datetime", "WSfoqat", "WDfoqat") + met_wind$WSfoqat=met_wind$WSfoqat#*0.01 + max_ws=mean(na.omit(met_wind$WSfoqat)) + # + tickdf=data.frame(Datetime=tickx*(max(met_wind$Datetime)-min(met_wind$Datetime))+min(met_wind$Datetime), WDfoqat=tickwd) + # + fixx=met_wind$Datetime[2]-met_wind$Datetime[1] + # + p=ggplot(data=met_wind) + + geom_line(aes(x = Datetime, y = WSfoqat, color = WSfoqat), size=lsize)+ + geom_point(aes(x = Datetime, y = WSfoqat, color = WSfoqat), size=psize)+ + geom_text(aes(x = Datetime+fixx, y = -0.5*max_ws, angle=ifelse(is.na(WDfoqat), 0, 270-WDfoqat), label=ifelse(is.na(WDfoqat), "", "\U2192"), color = WSfoqat, vjust = 0, hjust = 0),size=msize)+ + scale_y_continuous(limits = c(-1*max_ws, NA), breaks=pretty(met_wind$WSfoqat, n = 4), name = expression("Wind speed (m/s)"), expand=c(0,0))+ + scale_colour_viridis_c(direction = 1)+ + geom_text(data=tickdf, aes(x = Datetime, y = ticky*max_ws, angle=270-WDfoqat, label="\U2192", vjust = 0, hjust = 0),size=msize)+ + geom_text(data=tickdf, aes(x = Datetime, y = ticky*max_ws, label="West wind", vjust = -0.2, hjust = -0.5), size=0.6*msize)+ + theme_bw()+ + scale_x_datetime(expand = c(0, 0))+ + labs(color='Wind speed') + return(p) +} \ No newline at end of file diff --git a/R/globals.r b/R/globals.r new file mode 100644 index 0000000..37e755d --- /dev/null +++ b/R/globals.r @@ -0,0 +1 @@ +utils::globalVariables(c("ymin", "ymax", "Datetime", "value", "variable", "data", "WSfoqat", "WDfoqat", "O3foqat")) \ No newline at end of file diff --git a/R/loh.R b/R/loh.R index 1573069..c11cf06 100644 --- a/R/loh.R +++ b/R/loh.R @@ -24,6 +24,7 @@ #' The default vaule is FALSE. #' @param atk logical. use kOH value from atk or not? If not, kOH comes from 'AopWin v1.92' will be used. The default vaule is TRUE. #' @param chn logical. Dose colnames present as Chinese? The default vaule is FALSE. +#' @param bvoc logical. Whether you want to list BVOC as a separate VOC group? The default vaule is TRUE. #' @return a list contains 5 tables: #' KOH_Result: matched KOH value result; #' LOH_Result: LOH time series of VOC by species; @@ -39,7 +40,7 @@ #' @importFrom stringr str_split_fixed -loh <- function(df, unit = "ppbv", t = 25, p = 101.325, stcd=FALSE, sortd =TRUE, atk=TRUE, chn=FALSE){ +loh <- function(df, unit = "ppbv", t = 25, p = 101.325, stcd=FALSE, sortd =TRUE, atk=TRUE, chn=FALSE, bvoc=TRUE){ #generate datacasv2 according to datacas datacasv2=datacas @@ -70,7 +71,7 @@ loh <- function(df, unit = "ppbv", t = 25, p = 101.325, stcd=FALSE, sortd =TRUE, chemicalnames = gsub("\\i-", "iso-", chemicalnames) #build name_df - name_df = data.frame(name = chemicalnames,CAS = NA, Matched_Name = NA, Koh = NA, Koh_type = NA, MW = NA, Group = NA, stringsAsFactors = FALSE) + name_df = data.frame(Name = chemicalnames,CAS = NA, Matched_Name = NA, Koh = NA, Koh_type = NA, MW = NA, Group = NA, stringsAsFactors = FALSE) #search VOC name to get CAS Number from different sources, add cas, sources, mathed_name to name_df ##firstly by NIST @@ -100,13 +101,13 @@ loh <- function(df, unit = "ppbv", t = 25, p = 101.325, stcd=FALSE, sortd =TRUE, #build name_df colnm_df = colnames(df)[2:ncol(df)] chemicalnames = ifelse(substr(colnm_df, 1, 1) == "X", sub("^.", "", colnm_df), colnm_df) - name_df = data.frame(name = chemicalnames,CAS = NA, Matched_Name = NA, Koh = NA, Koh_type = NA, MW = NA, Group = NA, stringsAsFactors = FALSE) + name_df = data.frame(Name = chemicalnames,CAS = NA, Matched_Name = NA, Koh = NA, Koh_type = NA, MW = NA, Group = NA, stringsAsFactors = FALSE) #match table by chinese name chn_name_db<-data.frame(str_split_fixed(gsub("\\/|\\,|\\-| ", "", datacasv2$chn), ';', 3))#change according to max chinese name vector for(k in 1:nrow(name_df)){ chn_df<-data.frame(str_split_fixed(gsub("\\,|\\-| ", "", datacasv2$chn), ';', 2)) - x=which(chn_df == gsub("\\,|\\,|\\-| ", "", name_df$name[k]), arr.ind = TRUE)[1] + x=which(chn_df == gsub("\\,|\\,|\\-| ", "", name_df$Name[k]), arr.ind = TRUE)[1] df_null=data.frame(datacasv2[x,]) if(nrow(df_null)!=0){ name_df$CAS[as.numeric(k)] = df_null$CAS[1] @@ -125,18 +126,24 @@ loh <- function(df, unit = "ppbv", t = 25, p = 101.325, stcd=FALSE, sortd =TRUE, name_df$Group[is.na(name_df$Group)] = "Unknown" #set GROUP to BVOC for BVOC group - name_df$Group[name_df$CAS %in% c('80-56-8','127-91-3','78-79-5','138-86-3')] = "BVOC" + if(bvoc==TRUE){ + name_df$Group[name_df$CAS %in% c('80-56-8','127-91-3','78-79-5','138-86-3')] = "BVOC" + } #raw_order - name_df$raw_order = seq.int(nrow(name_df)) + name_df$Raw_order = seq.int(nrow(name_df)) #set order for voc species in df and name_df if(sortd==TRUE){ #order by 2 columns - name_df$Group <- factor(name_df$Group, levels = c("Alkanes", "Alkenes", "BVOC", "Alkynes", "Aromatic_Hydrocarbons", "Oxygenated_Organics", "Other_Organic_Compounds", "Unknown")) + if(bvoc==TRUE){ + name_df$Group <- factor(name_df$Group, levels = c("Alkanes", "Alkenes", "BVOC", "Alkynes", "Aromatic_Hydrocarbons", "Oxygenated_Organics", "Other_Organic_Compounds", "Unknown")) + }else{ + name_df$Group <- factor(name_df$Group, levels = c("Alkanes", "Alkenes", "Alkynes", "Aromatic_Hydrocarbons", "Oxygenated_Organics", "Other_Organic_Compounds", "Unknown")) + } name_df = name_df[with(name_df, order(Group, MW, Koh)), ] - df[,2:ncol(df)]=df[,name_df$raw_order+1] - colnames(df)[2:ncol(df)]=colnames(df)[name_df$raw_order+1] + df[,2:ncol(df)]=df[,name_df$Raw_order+1] + colnames(df)[2:ncol(df)]=colnames(df)[name_df$Raw_order+1] } #set concentration df, multiple df with Koh in name_df @@ -167,12 +174,22 @@ loh <- function(df, unit = "ppbv", t = 25, p = 101.325, stcd=FALSE, sortd =TRUE, } #vector of group names - gn_list = c("Alkanes", "Alkenes", "BVOC", "Alkynes", "Aromatic_Hydrocarbons", "Oxygenated_Organics", "Other_Organic_Compounds", "Unknown") + if(bvoc==TRUE){ + gn_list = c("Alkanes", "Alkenes", "BVOC", "Alkynes", "Aromatic_Hydrocarbons", "Oxygenated_Organics", "Other_Organic_Compounds", "Unknown") + }else{ + gn_list = c("Alkanes", "Alkenes", "Alkynes", "Aromatic_Hydrocarbons", "Oxygenated_Organics", "Other_Organic_Compounds", "Unknown") + } #generate group df - Con_ppbv_group=data.frame(Time=df[,1], Alkanes=NA, Alkenes_exclude_BVOC=NA, BVOC=NA, Alkynes=NA, Aromatic_Hydrocarbons=NA, Oxygenated_Organics=NA, Other_Organic_Compounds=NA, Unknown=NA) - Con_ugm_group=data.frame(Time=df[,1], Alkanes=NA, Alkenes_exclude_BVOC=NA, BVOC=NA, Alkynes=NA, Aromatic_Hydrocarbons=NA, Oxygenated_Organics=NA, Other_Organic_Compounds=NA, Unknown=NA) - loh_df_group=data.frame(Time=df[,1], Alkanes=NA, Alkenes_exclude_BVOC=NA, BVOC=NA, Alkynes=NA, Aromatic_Hydrocarbons=NA, Oxygenated_Organics=NA, Other_Organic_Compounds=NA, Unknown=NA) + if(bvoc==TRUE){ + Con_ppbv_group=data.frame(Time=df[,1], Alkanes=NA, Alkenes_exclude_BVOC=NA, BVOC=NA, Alkynes=NA, Aromatic_Hydrocarbons=NA, Oxygenated_Organics=NA, Other_Organic_Compounds=NA, Unknown=NA) + Con_ugm_group=data.frame(Time=df[,1], Alkanes=NA, Alkenes_exclude_BVOC=NA, BVOC=NA, Alkynes=NA, Aromatic_Hydrocarbons=NA, Oxygenated_Organics=NA, Other_Organic_Compounds=NA, Unknown=NA) + loh_df_group=data.frame(Time=df[,1], Alkanes=NA, Alkenes_exclude_BVOC=NA, BVOC=NA, Alkynes=NA, Aromatic_Hydrocarbons=NA, Oxygenated_Organics=NA, Other_Organic_Compounds=NA, Unknown=NA) + }else{ + Con_ppbv_group=data.frame(Time=df[,1], Alkanes=NA, Alkynes=NA, Aromatic_Hydrocarbons=NA, Oxygenated_Organics=NA, Other_Organic_Compounds=NA, Unknown=NA) + Con_ugm_group=data.frame(Time=df[,1], Alkanes=NA, Alkynes=NA, Aromatic_Hydrocarbons=NA, Oxygenated_Organics=NA, Other_Organic_Compounds=NA, Unknown=NA) + loh_df_group=data.frame(Time=df[,1], Alkanes=NA, Alkynes=NA, Aromatic_Hydrocarbons=NA, Oxygenated_Organics=NA, Other_Organic_Compounds=NA, Unknown=NA) + } #sum up columns for(gn in 1:length(gn_list)){ @@ -189,50 +206,61 @@ loh <- function(df, unit = "ppbv", t = 25, p = 101.325, stcd=FALSE, sortd =TRUE, } } } + + #remove NA columns + Con_ppbv_group <- Con_ppbv_group[,colSums(is.na(Con_ppbv_group))_k1{G?|!zD}k#X59fX~gK%my$tu6ogS<+!NII_J@V2qxX+x+t2p(7j?G%&cla%J0I|*uE7z zu~ekFV$;C%Vxv-O-*LwwMF0vZ>t>uUoDT#g6b1@yUU|O0ZA?LU7s#AH+%;P3ve^4G~?sPFQH+ZK#-CE-ho7|9-?hE$-QJ(H8sz07#lkDSuNH7X*m1 z$^xMBVF1%_HuSBfZ^o!az9K74DfQ=AndHDQTQ3#PaNj-U5A%B ztajYb;%OpZjB*}zmWah8F@0LM?QA^ey#72%oBkO)lQMgCc-R&NVm3d(7tBJauZ{Sc;U_>z?Sd&;yA6C>;7t~E` zY?-sBBvvXn{=8m#e4X%Wtd89v)1AD7^4=QtKVKaOT&^QGTY%N15lH3}bvx}7F4yyM zOMfUn+&+!k*RsWFlX7J|vaBwJiN~(Scuu50Nbt2xVM7u+R|kk3FF!nO&Fd?;CID_0`a1|39st1v3H5IP zLNH-K_aQ`-A{5DD!1qxE$;nz41TRper&GvgKorTb0xXk6C}Qv|Ec0ja*kH@zCBV=m z8SsL#nYm<3tQO;W6~*rr&lzkKmZ(xMq87EHWxGlYW&(%Q4GhEQq6J^2u5(s9?;_rUT?E0*Hct1$_6+D2TVR zmE(=UkQItyV|`$qYszFDGeDCJCxM5Dgod7X_lF*`GBFhpHd&WVr^uwNNS>jNAM&)q z%SgVDCVQaBRarz;VK3xkHOgeJ$P|hw0v4QlhzH5x;n^xEox+uSh6*i^C&H7P_uW=! zeE}ESD2f3{9Uuay;55(OjI3 zWGe$l4nK5)1;}pSxNGjv@QkEL0wpv75KtfM9MYL-_lgSlgi**2c9rpr+fk(1J%g`Y z0lTkyd4e?S`vu8C!fHa_RK-Yv`oA8Zn*Zvt*NR%N^;&u6VOiX0#+mW;E@88^@WN&@s!e zbF1ZAVHmLsPDMwW6#V)wU0D5{Rj$e+k{dQWdlG4&fsxT-2@pdaU@J?*sXzlsCah?% z^!svIZa*nKa()ThAW>rOE*L!^5CayHr~?8ODtq(QHeQIG?YL#?BlI31IHF1=qzDqF zR)X|bEJ2Hm#}l*wP+{rTo;D>3hA;z#NI?S;9+OZ2^x$xaz;se7&LRjwt)POvIl=cD zxo+2YC6R2t=UvirQ8B<3_fFXJ+IeTBsHiAXIDFn?V!)D8zmMgIIpJp8(f)>wMy@f4 zmAT8=G2wi%ihzV3DqSG{DLj&DU~|0H8` zQ!;V{GGdVJC&$an$bmg7JDTJOCT1*pX*2(H(E+`7B z55aF*!WwKmnzA=5X=Dx(#qm5C;cU%zCXARS(Zi_w|RezfaljavB z1(?vrqrO+t>6x-DWPckkFJW9H5q;{|KNG!0r?X2hU~sKdkzZ*oKf?GZ{F~K`C@N*} zTygS+8}HaQYeS{%Lc2R7$H2Ck(eK*f$>PkUW+F8Z+j*-Gu&{`6c0nB28DUot{YJ` z5ZDGkTf`WC!#{GpoRG)IKc3Cp`^mhO?Y#?xU4LS4*#2|Ze}mrn|Cep{--`V=7XB~m z|KNeY9y_mBPsCHX9cMNF!GHG&{(tp%_6^(atbejTy&E6;lOOuOSos5a%k1_WB;w$y zPt7D!yxeZM?wFflLsXR&SG78q)m>vuXk$3ICq)r_&7^p6T)3v^D;8C?c(~S%K#bo@ z@F#6f!L`;d*?%@|0yd!H*bNDp}bVpu*krTJ8qn;1R{?>5v@B^5UjzS2j-;JW95# z=?M_hz)+tOTa%IKvR$KHYRg)wX)8tJ*ENPP%iz@af~DT zwn@hK*s8|5JzIu5ZUye4sV{+a!{Pa|+ex`7MV1>1DDp1CU|>pBR8^qh_OGHSFWOqA3E+emlISEL@! z%nh&VR99^c!LA{3`(T=5o^6W~IcqW8?W<@MPrbU>7xsrmq1AiA${y^Z#HePqy$e`bW&97&tEzPqjd}f)h#P;o4#W%Ey{;EFKNyvEdEOLK!e_?XfL{)7ulN1W2Vl#141XGY8l`=VeB7$THA|^F7T0D?=I7O9Miw4Y} z9)byVPl~BS3d8-PKna_)TL*KC7Dv~s3$-$aKhx8{hzxj|?aAdOD5N5`hx|0CAXb5! z*KcK{tIbTgEf(1FUkiBugHl2LMnXpf#^fNSOcSt&Y7SYAr$Q&aZy?BHck7MHh5G6B zWlYoLFxaFKMv)dKgk(cWP&~QZBLa1&ArL~)V{5HY|7FAl4FltT<6-x{*xhSZ!VAtM zvVTNSQDMz_P#jXcwk(gB=;PuVOCb2~`1xOfBVsrHkv-V*`u--ca>KeBdgO!{;#^a` z3{7HjlWDUmDJUo?+A%z^P4tmmAX4h>?|S?7yEn0T75;&-Hh6^TD{a(wG*<*;2}L*W zuo?SEMcdS}bUQ?tyYok6s;ECmvOpn$li!@4N#;%hS+|~ZCs#tfwhn)ooNuk1QEHy* zh&KdnFEG&o(1AQ+1U0yT*McybKjZ+~=Biufq1bMOhbF&i42&mz3DmSu`%8VFZ!xWk za9bq#U;EITf5-sd6H8DpgO;uvdGR+TD@t0`(j`OE_vxFP5BigDV^z6*Ax4xUaZ853 zIXNR{RTs~*q!2Y8dH)zbaQayc3Ahuzf`#%-2fQ0Uev#k3ytrV^R!ZSt5OjAkVT`7~ zT2xBd0$7qY8TdBadi@4MqmFs6%Y@DTDTmz#)aujQiIAYfE!>#mz>@^20n~I)u;U@~ z?NhYR24m5spwXFAM!fX?_V5$6WdLu0J3SsMD^^0{^!tg|hwiWrNW2vQbTt4;&~iii z%sQP$>kbL*mY7W-t^HvGDmoP4JxB2t_8G55|GVqE8#NENb?-Q`l#0Yc$3rwSEcXvr{*N7S1+HX8 zab|J|wKz#?NrAYPRsfia%0l%Y2QyJQwKNfE6d4$R2#+8bm`L+YT9RBU*g_cOA808~ zm7kng0#9ldnLu7{CZ1>%T%4**Lv0}q`OQcbq)1&*n2=8eo1)|~AQ*&Rdq04y=S zVZ<@owQ}bSqx>nzaqCDDN0(sr+Sd-n#Vo-4>lOf2#F*MCv;*;x1b_z-r(SxoY}xIC zP0mSPNUSxSE0h$0;m$-&!GVdewao?^iYmva_d8DuTCu*3Q8*CEb*3lAk-%`K-yTAi>4FPJ|yv5%w ztrf7^bdvaL|JpYyMDAe$z=j3@B0?-0`0jm0B>MC_&OCBk#&6M3YvKaviRFC!3g1ju zs_sS@5kY?sTUS!^icU`e{f$OL>Wg?~CTeFI!?wCTALL+xSF3AM3gGqKh_2b?MiMq%RpTLyHcY5Gw zpS)Hy6kn8oYULBA{ZT} z8P@!V{zI!B8U);FFlOLu6>*er(J5PJ%jIicw2f11Ecz@d!h!FCG$q(yE&$=!`-6M+ z=6z=P3PckR=isk4i~L2wa9&vGoxPd^)7_d`bqa6tHcSv2TH0lp30+F5Sm~UEKi4U} zkJmh`@*Re#(jNx@0Bs>H!~tC#0bz5o0?>hGIp8h(gN6p9ce-0Z!>v{%;m?`Yd~P*- zacFEIda*xwe6V0Re6S#=0cH~{v?3xY+2@^BHz7&4LFJXGZ)Wv9wssTE+3&+|p3{mR z496rSadQYPR>T<4A=c}ZmqxJ4pCgS0~!dR}xZm`*}b%hWp& zc@Sh+RTd&KZ5h0?f_f}K%vA=Ir(zo_l7VYBxoM`o3|==Ot7{|Hm(}S!NWKn0TD%gK zy$dAIW6X=wnwS$;tom}?oJqG}B5gIg=}3?>Ae5Mm+1kot(iU-;=r9SmaqzgvFqfBi}k53jto zAKM<@2|{LP{;tTmtmyhdI->SyHLcsSXUXO3qBPe+xNr{$I57B=bQr!G>z4zDkPjA} zcHVq>J=K#Is$ch}7Y7k6Pue0Y%1RfwmM+=X;H?2Rj`aX*?&>^m{}rtSM%eUzLLuhj zc&>rhi=Nl3mgjxe(szghZ(sl%VfY9S(Ce;cbFMts<6>QFAZV zQ;zf2ob_8P+R(^{twPi5c2;?w)NK6ILg6}NG>ac z|BIo$D(YH4K#RWrD~E`m67rW!A!>SL2l8^oD51P|w7!xH%X2EP6y#8V*nY%g9UJV4 zMH%?g`-JGU5QKW3a=Vrd-)Btv>gMXzGIAFCK#CA9Zkk(6Me^G+2h=*IpVy-mo@>t6 z*|dIeAOnQEObPCb_@d~77F96)SdtZ9NwP$<(T&^L?fD(O8;*S}b z8iVe=#@$GW$ErF*LeVKx+Oy57!qYlz$fwo$IEch(bOK@{e*BK}b%nXi?X!)C#9ti^ zb)eq&jWLs$g(f~fTZo!i%=j;(YuINx@$zoEna7}LzN@|a<_<7XxzjPKNemEXssh_b zd*XZI=2F(Oq0iZSbul_U*d}p@&8R@T<0C>?N&t=ZY-{iZV8U1xrjM!MK@`eO3FSoy zbsQ{`q%U#&zIM#%(v5nU+nF(atZ9xa4$h-}?h$_>7$TJ7PPl2qC854Aqyf_e^QW~8 z5xlzSVu?%wU!Mtm*v->KyLz(pf@mQnx7#^?I(4_oVLtn9kwA9YP-6XxwAM8G+W8m< z0mEHH6t?qGyOMFq%dtlFdLp>fi?(?9+n)Ko{n6|?G3gHr($A`~(dst|5wthr-4m*y zZM)CvH-Tx-&6v(LXP)MRztwR7RMEH%`W@{n6>}jL%fBerJ2B2u;io7BHRwH*Ug>ao zJiev^#%^cu4LLPuB^TGW^(ZXad|p6+6&gBiY}*uN8aeA_5Wj!fm(y1gSfNeV2)X0+ z&kvnXc%F>vvx5B^{i83vLF;o{RY$F_;k%NkBqTO)`*D%1_#y$2Y8b2q5Q3sOI3`Gw zKrwPjwJ+qu|2jU;Bg}Yn)g%T@lS6`{w3rpxs#b-}s^#IK6u5?_$yTfI0ahizZ$dKS zs{gL&dTAKQa76ZB=y{iyX4>^w&EUjfG6X7w=x?SF4&e zed|9gss`69TyCLA12p3V!b4hqBX;zed+KehNHEdZczf+8v?^Aah?)ai*-i%)q$8Zk zr#fjbNe8)BET9*#io39~Iwjx5+bO3fu||v+aJ8qaU?uD7X%(gs?jplgwGoa(sG;jq!@UA^eP@w-Q2hbh zJZuCAM?<7#$NZW-Qa@WONSr)4d!dYaHG=r{<$QuS9@7%;wm!&y_ME5F)0EX+7uj14VBF| zM`pFJ=}{t-?qAa}4dm6x?HU*!vO4P7YoOQdCz_7jp4=q-df7_MdbuC7*jI$&nQZIb z51HS+3&Lrbwu5R$0|$6@hmJ@r{Ym*>mC3nX@dOc+0gQRg-U^6xo9qoWxSQ zZ<4M*?+qv`W>utVSsc@Gjnt@n%sCpfHukf-m2dcG8uxE()f=y{i9?ftzHwo_bwbb( zlH{SGu)VbkH9U`32We@U_e)ZXYJ&4qN0yATgN-?K3$XOaJP&vc=bLOfWl_s(-EzWH z@D-h9usTw6IhxzTz+$`NZe&y3DDH?(4eAoS`H(Ub>xI!c`4VHec1`j)g+hK2ZOTn1 z<`q5N_v9yOuNS%FU-0$dJ9|ZHrTaF^bVr-W1z^?4k_V%>k+>5j>w{MGz)+GRTT*2S zm-<3vQbu@6)nUtpy&DWR^cIX5f0%3M||Ar4o)#~ivDX5?bFHPb^V7VjC0K{_|?!V-@oGJY(C=jyA~w08FI39Rz5x$oQNT2s*rb!XJk+eO?H)n;t6B308W zG^Ay;%1B4B`5OTYDC)u)ZIy^)GBkTrH1uX{nN%jHRL9&@Vq#{sDprORU|{yK>>}oZ zG=$u4uF#=Q8xkW8WBGFr66``ZC!!PC?;TGOVcWN{wfx z{u51!2@IqVH=!u-qDsaFxcCfAQQY<=cDX>$%)q zP2QMetv&6W*ln%7bf*6+JoKU3oJ)$&T6?*<_OJxk&xHLV6lZc8=l2&~-RI$T>g&He zo25n%!mT!clLnUYm&EN+W_JUtCU#E;cd|Yhc^oHf8=B*?XxAHh{ZN01B4&Gf+7y@X z`}|0sH9oBiT0e#!gRup7`pGd?TD=z2`R2Y`5PlO~FM_eU?1!b(=}=oOa9y{JeRi3O z=nF;^cfm(4u)@rM6Aqp~l;L7yr?qHhyJgT054{fi$&X$1rUb0T5vvo9CCs||x6x4NNBo|H|18UW0_ zkA^lr#%kw zx?h|lMxqsyrAQJWLCg$}C)PXg- z%~~N?LO9GCJKt%TwG9JPcc)(Zf!q|%qW;$bQ-8haZnuq0+^=)=2cbmKY~7 zan-V(m9PP#yNVKcOtMnoLSGKdB$gXwETEF0r~3pqyDCxqeyj$yG)n-!nE`=#(Rb_} z`74`p5s)N$0K7?jE?y3YOi)qOV8xKT`{ZCFPpw-l#lTt%)tB{}>w`lERj#sbI+VK> zc`G??Y7ZWlxoz)|9Jicv+w@)dK}7Jr!&nNK&twUkilS0~@qJ^V-aW6a&B{ugPXC9u zojHMZmX&3Jm|#UH*Po-8h$Cf}!|mBW*4WYYM32^{m5sTVTPHDpx?>=nkg|GWX4wwa zx>KsGfy9nF){{sEE>N_E%4Hcj-fH>q^5DTq;NW8A#x_<|ug`bUx9y=J0qfK1$NiI) ztb5uc+Ja&TNtgbv7E8P=&L4#s!NspgTtwdj*Xu)wNe0Ah2v=v%atF(`J z)tSA}XhQ!R1pkMg(kc=F^F#kn@9qAJC*(9jKS@F$Jb578U)={D`&HKp?Gl%zCF&-$ z^b1@!SEc4Ge_`yBCFuY>FqB-5ypE8gtOfc{%J)=JxqyR(CwUtXt|9lqUTVk_A>s!nFwrNr1C2mR` zL6Frx49O*9Alf%sM9HG&eZE5%C=P@nWM$|2?t4+?*T?SIbMr;#u6l-UZN3$xb{w@l z)nfq=0m(xL+B`J;c#Mdp5XB?+Z`Zkg?%-7wz3QpeX^lF-RFo@d{Sq`%iw1i%AS8}5 z3!{vG({=U3f=nd5FaFBaYP|d zG&ur)T+AMyA1oZTAl)hVvt`3Hb_zKL%&I3T!!C_8_2W)IBA*JOJrVJVAGUZVz z^Vt8v4-XBj?~{N7L?e$aE=oZf8Vved4mL+XU-jrUcY0-Miuyw)#~$+(kb)4&M6G?U z$TO^BX0w*h@zZ~0&xTQis7~9R=JcnVQK_a6(+E*jbxoc!U|YH96V{4f(4EK?R9i-+ z;mg`cb;JuZrz>!Ih#OM7)m8mUs2k5vfkwn5vWAKsaEU&8^prJ)-Y#B+8zlsS=uAl? ztKuM(pwQR}@(}w%XLh$y*t+7rOj({juxeYwipt;&=6dynu`K<(LV*TiDyn_+w1;}r zH9&6lavHJLZQVG1?Wtu{{~w0re>Lis+eVlG`qTLS;n0Z)fJDEjz;N;;zI~vz&&uG( zl)l>NlgEYtydZm2hn#?St+3;#b!rpTm`g!_u`y{~-Tn(SJ|^~*)5JRp+Vk~)EcPBO z*v1?^b=m^|5s3e9JM+U1 zi=F}%!0_LgUis`Y`#;;wYd`mMGuv42?>|OZxMj}IF1_;xA3`2NXm38%*5BJH&v69w zQjNLmA%mCNMw)ZX&V;_Hff@pbbh`@e=IfK3K$lp0&0J#|nT*n@jb!8&g^DU1+7Z)@ zNsbgKF6AgRkfm*BScD0{yPG~`QmkZ_3XXerZ-~n|L}|1)J;YlGHZ>3G>~xRs{2W$d ze+$_6L=pyAW6ZRsDlDz$Z@kY|%DNX`-Pj&(=Cha$=He!TJKm!WH@*b?!rq`B3Ud$L zfSrFnCaCj$y4W8GF*oP^{{8!#e(QdH_u?eGZyd3C=jHR;$BN7DTa7@5Pw$IDv_jkX}53i5Uro{=^^{M!k-|Nd%Fh6{_w3pR(H#%+pId|HN z(JOLoSGe=*wY^t~kX9P5bQg)?uquDl@0}%{t2U7^EHrb=>7V41N~H_eAN>PQZ7J_e z0WHICp9EJE6SvQuy%!EuJG2kY)}aa?PxO3T-{?*H>zeSWd4E#})70IQM}H^~&`*pi zNK|_FDJ7V9rY5s4zz*yHxA?~9!Y?l@Y^bpE69noj;2e+t)t5@(mHsrr^&H0?bs9|U zMbE`lm?vppGzgUj9Kv90gw|UW4|V;?>I|JxD17WRmTJ!4A)DpEX$TJtQaw)NHnqs& z9;5X|Nq?#60tu2!2!u@;=#PEM2jq2A0?i>;e>eVw|~7)SVCJrnwqXp1AM zIm z862l`J(I`CaKY#Ed=yVqv_gi%o|*|HLkOfI3YW;|bV9Ds(8lA(s#b$X6iWHv+{iNy zAY#h&m^Nr2ppsIQ3;e5M}D`* z-~&6NBmV@UcYzFgfM_qhdt8RMw_hIl&Huc@F}>?6@Z2K3$Rtx+l#R@P!LZ7qK)O9g zQ3F|`8Pa9oi(Crx{yb@wpCQuYeXE}$cOR533W)Iv^Ml&D99`J3qraJ9p?MJ%^`so| zDe+CY$E0SXoZFB@h^3+ZytrF^Az-UDtH&vt%AR44PfMXbb(R^Dyf^k?U(lB*@}qM? zb5C$*fe(oVrrBH95c*Y8qqaQ>I_$cgEud&@%#5_JU-AsGB2&RN-JF%b>6qj zr`&~Jo&8Q_qwLrjf-XjvgZT@|o3dDM&%2dTKLRJo8>(f7+MM+5?BCuzVd#!`n^~PV zy(vr;a+G>}w3?uTz27J>Q)CTYEi;X=-8otN>9LcQ2uiIi6Y{QUQzGH#q|ON}fpRaC z63I>*1K#Fc%XM(xfU6ndk9Y2woGY@B>7G-(=;OEcqFeAMlB0BqI49|dftkAEYo`y! zzT>jdXUeGQid%_AXghGxm||?mY7t)=`i3{lU4;_k((C&#_08X&KWOh`J&8~7EpX9l^AZ!%{#qiwCF%t3Ev_zvfMGw1U{77j0IAF7QWh; z<7g#Gl}|mX2obrR#4619(V&klFfj6dDeAGfqC^{63QI63ek{9fIlLXdUHyMCaJ z{fB3N2yOF^F)AEnrOLx#>16f9ED89KMp`K-XKKNm(2H@Yo?o&SRu*n737~*eH7(n6 z|FC{~_N=BtYl^Hj#c>$17|g;9DN;I6n5;rV!dvg&#}z>kO9xW~3A!{1NFMdgzSz)D z;R($5@bo#e{p$O){a+jX|Mc8}0swkT@*F-}ZWgh`kTDm~h-ryb#@$yY%rn_CWrh?| zVEWh3_6mr6M8elPm7)9EW&`Tc;L>qUdtK3(wy2@fx&2s>1yCL*cjzKbt@TPod+uy= zrwMJ{iS(nwdl3r529}9UKk@bBFS_g5S(&m3UiLb>m33I~C-+iyr!i~@UJ614=@7^|=1f6w)c0|c&pefq8iZtPdT9bc%Rr-98M zOGNV`nEmLzeEwSRyE&i4S_dZ7#`R zazQwzJCv_yPf%6Yj$$zrW|v#!@-LG;Q5`4_st4Ii$TuA!rQwEU;LR?Z{f_JN6P8H( zR9O4W+Ij2|AT+Mym*`s=d*Yut{Bd1}&eU(HvKQxST}`D~@t8SU3~v{a>63}&NK7Xu$A5J5I}xEG+xoeKL+lmyxmvRt5+&%RH>a|rIQANcyWGL z!iypxs68k~tnAjX&aDXay-l3N?f4F4zSCcKlU*0-vQwyfDR9WvN9<@FR#ogay`5d} z>5px+eB=k(UC&S4yPBnSd z-EP0Hz=-d7eX??0tj9T4JEvt{`u*Rzu}VuX136<`w#*bp>#8xT$b$v{clHdg{h^;i zvtw;tIwXlw$j2QAG4I47lCPeN4zUhW{7Ro5=g0bluh_%ac~M``$x3MV!Z0t&b0t)O z>Ygf9h`FZS#A*E*sCtAKn(Pxp>Vl0T;c!IoycP2N1fAX;?hm8ggQVQ7$oX}`nomzq z=TE*GuIM_hF>)S?fnU=>NA(hj(sPhUCq|+x1CFkc;Bu_>K2P*xVoqV(0j{mKGH28L z`QT1f8&+f*){S*#y-bTuaE3U%;s!o`>}n2=hs(wON-AHGje2-kvP^by%0jEcaIQDl z_K!>A%^}-ie!5sV4Bz9{8OgUIL>08mr&u;E{8=1iz${v6@!Fg!XS0{7tVtKiK zBEKZ6MjWPL6N>&I$)FK)`EI_CF7HqKBf1F9a=jjIJ$)jwZDENfiQcasrN{b=R2b`A z^w>@NXEpfD#zj1aR@0-Kr=hcVZ6jP45i33)eBC`n#C0R0#|xu{k0+z|Nl-_0oPY;iGM%{hC0?`AG zuZI}je-MX`Pq>R3*rG)boJ}mW@DbRjG|ZIAIsS>#BV}E4|FJN!FrCA#XKswZ;&p+qUFIQ? z-u6%%w{$%6{OVFKVl8Mp09C(vGd@T_@)<(x+RdpO8#7b5tC6~bvjSWx zi}>AKy)yA?8O?n`pfEU9vg)wEzP8*?a!?!@K!#=Dvix1GDqxlNMSgVRYK1EuzZdQ> zn`fU*y^I{;x@Jy;w>O}fhZ8>xy zbY{%t5#J8qxRvjPf&G$NV`5rLYN2z0bge1MBrFlg-92oR97xQCvjL9{ z9yBGK@<^;?bvha!Wl49tL&m;`*GD-b(k!zZwMgR{8*oop^p$<(!t2IyM5(yzbeB6L z@Kem?E85XyRh85TE0@N#&=;hU@Reu5nh}`&tLY)$w*^#do}3*<1*M$E0#VM)eOjnh z!*Wrn_{X~3ZAOd%yN4|rW^Bq*vu=dJPJ9{l+tuk`74kn1pd?}ju1XIUf6HoCp{jCp zBAZ*7N0+f>hVWrTgh%irtc3)eoTqORyvdGvDT|J7UAgUr@VqoqXu$NC;I3fD3aT0q zXp{OE?^E_eO-mVG#Bea4emlelX`Bxog^(BOD;INH!U32$2$lCG)v zCp^70oSK_b#oT4%RlxpyhWN=ljt+z#4uk}e!iR^TZ`u6iIr#z)Fv|65{GQzSFphWd zpNiAJ_3vMn{omsffRUiedM`=*wS~I)@LBJZk!$5r#Tp3-@_E<524avcSiLQsjgHVQ zy$CK$G4L7_Ku+W?);r=jFIQXc2QMnMdeQQ9*mG`dx3V#z%wF>TorY)dkMELqcih7L z`)5XiKHGyT{%h(_R>Ud%xu6s*HVzgLvh0V77;Z7%FH8N4RghdexS%*te|h}gwzlw_V#sh_^(A(f_SMyly_yo@4?8mAu~?{_791tN%#xzg zQt%R(X32sKPO+nod%-Wp(gwSXz+ZV(N5>i)Mpe>5cJ4ih+ooLm;SJlb@@4<H7vvO9Aik%Ld-W?1(WxMjDdG z?r@OGxYHix)Cp|O&pnP0oDAISY2((5)?GHPi#u=2aKbP`aS_GXt?_8v(md=V(xkLVQ5991~+0xmUY@_x}>>DalytoUXdh!=e5A!5FjAHuhE`>MYZ0KaST85z z#Li>s7-KuoIadWtAtk%jrjA*qF?XJ6{hp%DwYO!=(B~qO$*uQFR6cFS9Wv9DYq9zq`_j*W<>cI%QnvYAzu(D z$zYY1Nm5)#lm?+*|C6y#uaa|}7y$YsG2hselCm{zFWZZM|6LZ|D7@9c)!UaF$BY#+BnHx?y0A&v} zPjNl1tgI}bNdn>j3;6%TlGd{QJOUto5?JUx^%9d%H1jZlmx;J za5VIgppahM&_bEzalX~eF3c5@t zT7+8VY$6+TsxGo6qEw^x9}S{u*FrfV?us7rNo+$SJp z%}C<3m!A>((MPdH2vq*HLkD68Bn{{g;qU{2Qd144JN<>Q+(Z49`WmU2kQaP>JOV;| zd;$VOAW~8fRTx!|Rt=jo`&MxC4_>=z*io#=F+xj|#I(HQf0Z2EiL3j!-uems-s)f7 zy-qFy=BMr|D7geYT|8c`*L0KV@SKt)J_3ag$FF~g3-rY|qsO0DR49)vA|#h!wi9Ym z$Zz(f-AX?FwD*=*%}YJ5&(uduMlQ!pgc|P5g7$vSul<^xUw1luI!kRioX~BYNn;R~ zHO9&%;O_DDTz7V>0V|2p3U`3_Xk$lcV>eni>^9Kkn?gf-L-r|RXEb8=#Iw{L2Zhco z|M88N+Au#wO}(RyxPST4b^~pgttxZr6w(`9~i+MrX2#>qFkY!G%@` z7zZ{T6RkMQp)~h4T__pcpY9>0i*iaveKA_{M$ zKj9hZIBBm%QT(MK8`dFrxBqpRO1CMK_N{!dqwYc^I4#=<0k?$8G0;Mq>Woul2MyhW z@J~q;N1i}|(t;TCOn`a)qp(_hgh^fM0=&uhfJhvpd3)6!e?3ibja7n1@s!DXnWEDYFVWCamWPE&P)R3-Z zTL5HGYE5GiBe$cBjJ%l(>URnV&zMl=*PH}S0D%|rJaHd!&&Tz)zdHyWJ<`>&aJQye ziO?ZF;~r5G0qKjwkDqG>sR?Q6spprMS1Wggj9STS4?KL>At{w)_NP@xzNmRvB}d3c z>A;V_RK4iFr{CwZ@iubrW`36vA3SPj><~IHq!IgWC1vAq)iR()7y3Yb;7H`2HB)`? zJSM0y&UC$8_;TLeZA=<#A0w(|>#s(aMHCAOf181HrMsIrZBYF-KwsTB7`n-FHVO-I z6~R-obqCyGo+RZhx;|grS@32L04K7g}xC$`0XK(H$#AmS(Ldm z8q<0Wx9CPGBt-abn|{fsV9_=p@&y4Sj_S0d2mWHqmEbAIMRi|~=8nhOt!3+)mp}{m zxYZzh=?whEGb27V&Rs-X=iZu6qzdI}o0c(cdayZjpRVo98EszBRD6IsUxL7xQn~8; z3hi<8KK_aIUg@e$O$JQ!62&rik2@GAxTWGkl}KkN^Ts;O2xq^`v4*RpMkw|)`JIZk z*^M}L+0-TbqKVP_N>O}0e8l@vsUdC_cO%9-d|`jvo|~q1xdWXt#$`Eg?e%Gf)j@AV zM*(X{y#;PrWNT2H-+qJ5B6)Mv=*Zk;0J<2`N3@wZ%qER8gzii6*Z6@l{=ZZED@pO! z*vT+rLK6EjRx1cHD~H^ubUlaHDxV7Qx;^^iX60ji{okUH8HLA>2JPC9r2BoEzo>Av zr!Xyg$k|-jZiQj1;%3NS@AP^McbyT=?7veE+`7B_d}@bN#hnUJ8A$B%Jl){Qv^CP?#qJ#qkBH(=XX?_5hIFIXlI`2EDeR-A&5(JT2C^-Jgo#aMiG z>PmXK#a;Ufwn55Q|J;RK_;pC+m1EF{bwl@Qd$I9Vo4wxUl_>FQ{|QsYhK%F17)u9) z&k;^M7dW}|1J8Pb?xEYmIF5dqS8ULHpxuYYT)}Pg$tU4PKUdLkoRtUE*d#x=&+BQP zRsB_iZT`LEVUz)!8VF0z@nfZ$G60J#roLKy-WK`Fr$UTcjGUSYrZn{R41Xn9)Bc$k z?3B~=-nujPg;jApkOYI!89A3)JUL_j{3jIzTAM@T3?=ZqjWAnfx$R*x8}SZ9~R14Vgp48*TYWTc`}i zqfFc($yKrz=*@I-GQRqQNT>bhVHrUo7Tykxu<_XdGO}Sm?lPC5Ece5@J1%Y&3NMAF z9@otT&BX8e63p%=>Undq5tHD0LfIli21^}AGSCbkvN(V_G2cm~`T3IKw24Rm2;+xQ z^fxEpjX(bnW9JlH$rrZ!%uH-fZ2n_glVoDs*2Fd@#w6LXZQHhO@7T$XwS$wd>YUqC z-@5DSi>|JEd#%;)dY<3om~^vYj%Dx%{O-Lt(y>CIS5?~b!r2v7BXkPZ{~Q=D(8rgm z-GcRRj~D-Y$&Jb#d?}^EyoV60-)$6|)boy!j{Mnq_xfN0P%pc}R6`AZXh#svR;2ckio}+RIwv)s^H)6{@bs z6=nU%9FWg;%|bF)mX6*|3-WT-GCT^_{`Di>{b%0cV(M})$|fqr+sw$c+kTAaag0h1 z|F>uVpXa9GKX}5~{fQC$Yf4uWo=osB+fb@X+NQR*z!#5Kf{n50jUwkkb<|x&l1@@P zpsYSKyaQM5=&Q#W`tU{DKcPqS>j4!ge8Vkn96kN`%c(%$rv+cIVJvUgbvQxX;^X$g z$s9&|!@SmJR8&~@IM;Ubj8D^c9sGE`$pG_v{KeDC%cXFV;~QUmKKeI(^!htrUj7|; zay&y86=Tjr34@R;8pxy=U)i+$Z)HUVE7HQ?Z7#$McSP*poCvg*N6WN2isNi8-oT%CHH@7W z>CcJ^$jN4cO2^P%EMHU8%VjaJUPk(lNg{hR4Q_fL({-#-C zHwFZsfm#l)`=%Nr3*zh zym+e9yEi~jIb8fV3x1j=#n=P#y7l|x*BU9*x96~-rRMjG**@HIDxj?=&?;i4vFGZ& z5GSPR?c$-*mE#I-^%PK`Ly&W$HjrwL9N&S9G@VZbkL=-fgKbKJ&%Ohg)mAIc9|Nx` z;6~x(N|1`7#_CK7h}>4VrsGbdog=#lQ$Qx`El7F)b{Y^vQA8=x#Tb=2Ao%)NU>=!9_ zaNB>DZp+q9KwGfeIacN{jLB$q_T6A%TpxGhBt{R*b?O1WR?N_)uj7X9WBR?7UOkpl=2N*$YRdwP(QBmfP9B>o%uO%y~=8*$V1*W#(r z^g{f?1Wl8_o1l{@xR*Eq_{V>;s2weOLzk_?`EiqmWD&k(f6ZB*Qcc5D7*w5%z?t&RLqy zwa=@0a8A%HkvrKXCGb=Ev)Yz)A2PCQ1gxvue&mb4%8v4({*_YTK8qzl8!I8e->xW7 z8xqXXab4Ix#$%V{k3l~0B7kZUI^Yc&!ed#KuEy$1?{;s}I+wURC#gK+06u~O{5=SB z_R>6C!_S>(`7^4Xpw6nRwhceR?s_CXiJx-TK1%Rjc6_k+%2-*G%)Nzhe8z!KzJUTT zKA99kp%*~gE9})?tmc#LsYq@OFh8oA_cY3d#&nvo) zP_a_b%7VWU*%VpEa7bc~iNk8LJ9hHXY<(HTbhD#oEHwSe)`0&_xR^a}*_KgojRi`f z9!9#b{Y)$nv$^i|I%)Ko{Yp%Dc#%77d)%_=3ADX2@j;Ge_^dg*SnGQCZ9wJN?HcaP*iX^Fp_BlDgFz0Q%K5fwOP>WulV@!(+&!ZbILMROi^@1{0{qzc=tDik*=Y$t?cc=5`yg zi?y9*^U=PX#!6qRx(|Y!v_(HfUAI}?{4T7sZR8Y^sUHYCyv2kOB5B)#7Kz@vqr0@R?-0~bh z2^s1mUjebWE9PFGo~WubTQC1YUb%zYFm?T6q*ZJYr_N!tquat&nS_K3Wy?0iNfSdV!3{luPgy031n1V_K zRYijHT=RwuBfskdXIMp;zj3H_s<5THzqBNNl$ZWhi&IuI)e;fMjX5NVWbJ^tKTx>?%t{73bW;@dq{_^I zG?s|4ilgKgC^e#``!Qynp*Qw|K~rMgBpP9BiBh0ee8Gp;bq24Gqu7i>n#c9NJDWn5 zs7Nw_r-tPw_gd?&PW7Pv;m#2xHwPOz4JyL`G_-HAA-EZ9(hV%1Hbrga@i(+us!`lT zpb?@`of!@iw|t8K69k6< z-j7D0%TCb3wjYbrC;khL(Ob>-ZqVC?x3u5zf?mNdvGIT^qe&KNl4KWpF(f!6ZA`}> ztuV$M5yl<*Y0~!z-*bIaheaWt2KJtTHP)xxL=Tc8HePpkk69L^D6u~BBc3DbKAwPi zbuURU#OSO1u%_3C0hjqlmTo`<{F6Gi#i+9n(b<-BrGNbCI?v5P<1SiYQ=mD%>ljbn zYwDwsKixZ>VB}2vn~@wzA5k0$0{vrGF2|xGUs7D5`ec5ei*H^yzUvF>+_l%ypX z@gAe5DS$9jQdX(Zd+rUoEtZ+Y73Er^53r}3&s-ZIJ<&>rS*fUMO@IUiE+8U%D(<`XFU-sS+ zkbd{3(WLI*^i477yc4;0e9LKd#h*NrP|LKX3mE}wUoni%z~d-mKYB=Rrt!*abV(DK zV-EV;X1ZTDR zGxkg8w-`+TOJ;g8{Dx5DAnY@j+9`L{g_09`i#Qy%&;}yyl+w9Bn)N6L7}-8&YD*1! zVS7)3P%!EF{iAs`_e7p!|C4dKs`g%cluU=^*HI+4o=NHhR>o_TY~wmBCM9B2F02W1 zq;N@#ghOWQ&Pq)1IAswT1-l)5AGzcX{xtr}v}B0H}fV zv+5#-sQqdj`3ePg?|`@io{-<<-LFu+wnB1eAmqCmdiAI!^8WIQ1VqDe60*FZ{{mIBYr5NfVXD2& zp6N#0$e|+OPKBK0n5y{J!j3{Eg%nB}r_#b0qBWc@&1weyxj)V?ef{11Wn^&PS7`jq z$p68<4~o9^_&;zjS2bslA!mZ&-fVpwimUp5I*nIS!^Hd@Cl3$!X+{nqa6Wq@c|{+( z0={#dF06d4t;=0UXvp=)`0dT03rxwE8TGc5gO0&0?k zOH^GWf8cD0Xo_r7H-3KK2iv+>-1}n9sbFMI^tQsnFO+3POUXqo08{2K7%SO*44SUd z-Iwk$+KDt)D)OOs5b$mD1PJ39gY4hG!MPdB&*)K)EE&qFd=@43bF0LHkJ=1vb(8{f z5WdeXv<#8cwwgoq%fuLB7oi(UH;Q z?#^X(b!E4-^>BN06Xi*O>Hu>bcT;rs8&$~m_U@x$lyVy_gh=RmFHm`vLxqp9X z@_u8=%I<7!8BXYHW%g~(KPaA_cboJ#U_vwf^?Wd*OmfhX%%XG;dvppc{P>~$v3M{B z^SE{@K|syL^jbdPS5gyQTwQl5CGj?mUK9=HFI;Ges;M8c3bbspRc0j+U+ zej>F@4HO&$c!|P0FzR(ZX#av#K#F+kwlixZ^2x=je=4p63;@Z8*I;h<8ZuC zb32z#993%8XryHIc;-;BXav{pwpN-8!J`K?)6!}>a%%GPSY%pR#1}24L99&8C<%dY z2HH7QF(m*zm-_yn@U^wSd1G%w)kMZtFh@v`7u&}Mv4R~T*UMFXu`9N_iT>=oB2W&q zA0}(9@sag?=ZFkOds#Sa*(Lsk0TyuiFhG0V1QgwNQJ7x$lf;{5M}{}@qzJk4rx_er zB&}YD8#uq=tm`_zs{?gV7FvEvPvi6XNHpfJyw>ngB)|qs z4_+;>lRfI`ElF;o5IPb8WbJ;egs^+?xZ4vcSy|5~zD8BGKcygY#DwukA1t!Fn^Z;^x1o@gs5sMLxju2! zxi;_}nyr}}C41k>OknG}eWh(a2Z2iHM1BgrZqh_d%PhfBXDRezU(dBpH4J0!-l{uk z7{o30l^pRxG8?&SP57Qvf({Nhs1~z5+6y0HC z>rLgiP==a!EPcFTRyXDtC!U?Rc>`^qHVLdG?X0`pl&Oy+KmIe4Ob2ZG4I4QTq57nN ztLdVKecM0P%Bx;`=)L(I59N+awpV|sf1{1-& zj>QQ&|NTsFK9EdUoH;)bU1Fl}88C~ry`GXD^!?^(sr5MeDtXo4^tSp2GXl;z){RGw ze|r|4mc)4qLGWAsI88K@=e8d%O1F<1GZ63LO}ZKw0I!e0+Klwv)A@OAdmGtP_nbUg zeZWNs0np4d@ET1(AOMuQR70$Pi{NG+`JNZ)%uLLSSG&-EZ!Gve%WoR{MBUke!l%{ezFm z-FE`u%qQC-Wx(t*iZlAfvC|eNPvMi0kNItlnvQJ)o3eZ+UskB>BM+Db`%IMP5eJ^m4x1roKG?p6mH^6-gBKyVZaYohq)?w zxriQeANN;=eZSc6bTCAyS$sX}Oh*eMpl+=crU-OL0A*V&?>Tk<%PcM1aE<4f4_#;W z?6kt+Rnfoe0hcwENCGFmlm;b+^N-yQ^+_D9j&* zR)w?-&?k6g=HhpJ`#1rrx#a$scw}-+xDs!xHkLTVluL>vqj##MFmt-uIMDkxD4m#Q z3MX63>^8bj<2=5G86TsbYbl|kQ0J*GfSBR@(Gao#>hyV1$a}}0zOSGne-vn+`6uYi z-f7cxf1W<*n`crA*)~;Ml^mmQ!J_f8lK}BVrXTpOwoKF1>dPLV z;20ACy%x->FbB;BA;nn$mztcG@wZjLl)IaLaReF`0Eej)7(6v z#$&ywPU1C8q`!mggs7T{O)uwR6Amk`?^Xtqxtmv?B~GRE_Q|D>*;h^ag=AobqCTMu zam1q>S)9WmJrYSN{T#2s_k!?Lf(U{=lm#?yH59p?Mo?efyjs*^eff&OSM} znVkuQ&}h#C@mBlx_x{-k`u8-?kQG=sb)$PM2+F19;dlXf{ubF55946VZ4~{?Tz-Y|!xDPQjA95&T;~8QAvKVD_354ngj%)5)A==jOlBn$I zm;8!Z?g0{*5}ESBeYdQ6N<0v`!Df9z%bT& zjedw?DE)TC&iS^@NB14Y?$ajm{`&(Zb3h+|Trq8wgSN67-jYakoGDKnE1)?5FWQyH zB3&7MChTYFXr&`6_ZRziS(Adt7yQt*(a2oK!rt1glGOOhkMryTCX5}8(5vl^>XH4= zD&|{o-*H%dC(IL(>r<(QCII$0fH>Zyf&@($QufA-ZOeXIF#ayA^iU*x5L1dQM|Q`40Lf{yXp(-virXg(U_9{2d>dFr?c@;Cc@C z1qHng-yT|WY*VDJlz@GpZaj}nlGo`ik+n& zvR^3yo{-9sK--JkWzuO*97;L?;pwY?SyZ|<3Snchj!1(IE`zAoi}BNS);X>b%1a%h zZ*tDatJ()u$)#>L+E8i};Pm=mX2oeG`lss};q;6wOOE`PGU~r`(yT4v1{h>}3;1&1(a6^Nx4R+i?O)_b z4CgXIhSAVa z{r6vyHUOHT9xqQbo?F8n*W@1APyhCBZ*wd(FE&;};C7*9Gn)s#_*Re8Y0B~nGdT7u zHE8XwVZFD`>D zICKlyXMJ+Wp1VbTnpYci*JwP0COsfz__CVOQ^CzVCbk1peb#P(3Tg&D`mN+Ube*^2i9oSR%?(fm1hsnKy zD<`_VCZC@P{W}(p-T07*Dm1PIOor?((N`5RhWAX5+BIR`ys35KH)i5GK>Ru2^_v{D zQ-_1=G@ktZhNOeTiym`qj?={@4`O@Ag%9!;6%M%z`k9-O*jFRZ){ncW;kK6trj}^A zPCtP{5D4XU%rJ=dM9AgE%AZcfrnwUII0yVZ95#0+64E{N=7=}%9?M*Mn3;Ul%Q{=p zsvlYguB6ppJ2`10uf)DhjZcKzGYu@&>bdK-)=V3Mgr0`dLaFM!gv!Zth+9Gi-s}wA z#`%NGZk9Qe)XPye?@4 zmcyt{wWS|RqIXtz7jI9}9E|_H-7H^6yuh z^2nxtvnCjke{J9Fi_%SNsT|q3!M=_q%vq0N1IyOns3(rk9?y&qbD!c4HoMxlG!0%t z%6728lXsqjylRa@oF#Vuhndg@^uI9=Q~xy}-Q7Qc$-4cpBM@&(Z}8Q5HnhPRyuZ$@ zrnLj$d;Y@UF6ZaTfJJKx(Ctufa@h_9E3h=~t*u|uQ|xZk)c#zb^kiEWc`{wA?#r>^ zg?B2~kuz*yGkr+jz1=+^Bw`KjGn0H#xM z_A(ISco9g+yZ2jsr)k(RN2MMr|CFeTsMPUe8B89W8ISzXl*|=Yc2p$oBvC|TP+!Zz zYUyI~l0u6$1^svOp1gB-wiibAX((|d^ZeS2yh({+NdQ;=_|;RtZWXzc_xJ*RcwPc2 zTe&;vWh3(c`%Z=uFqV4V?GsyUYT?P31_H{$Wy|{%j-kT=kGGp;r$=CGe^bD>3v5XV z2SV>~)*eOqR1R>mWX6%%5{$vaip`P#R#Tm!9bfSB#MTy@4gdSS`oj7G?e6Rp9YHlM z*|9Ky;7#23dk(hWaX0;Zf+KCBOp&kbI4VUy9K+_{%!iM%KZpdVmo+n_$iX5?sCesm z&_&Inq^*C$l|W~1`zcIgJ>~|UM8qhcd?qOs#F{q)#apiip{^y522@)s#g0C3op_A^ zXQFtrheN72A(gobolhnk@JdO|m;*sHkwAH?#nS8OJ&A7(Q>Hz!g6@3|Q8mBo@%DS9 z5OUV~VXukha4azlr+pRo49>E5)%;eM#}wCbSL1P$+e{0+Ta31{0YB$%TFKf_JqL{}vCd*-2WUIgwA-dIi8Ekj% z?YO}vPA;2j9cC}YyZCXwTO-ifc3<^mpkdDlX!3SndR2YFo2j}34!keDym-G{weHrC zc{49_pN4w7bTJg(oF;cw?yuCW%x67y-W^Y56LPlv>wg*c^}3z8BIBB9DeG=M4MUFW zMt!zl0Nfw_S@6~Oba%MkC~~_vUws6&luRnz@)`6w?%X=J4Ad=q&XhE+0J6Y6dJ1S8 zHG;n60v~un2)9B|`uw;TzFhZ$nc2h!g4o2e>K+z+99 z;#3z5_H@^&Lc!YmaRXvm8QFRBXM3gMT<}5m-E5!t=5g}9%In}Zl3i2bjz%o#k@sQJ zeN{o)d*DiN?ty>O;pcF${6yfpUAwsr?@&&)~+3y1#JHj7djX9se*sB^H(=}`h3pJ?y78C}-GKT4qKma(dTct|(r`#Np}cZWNkZ|wXMdM`37FIHHshzFt%BFXWXp9=r+*IdxyAAF*Si_rovzGXTF{?Yof6czwcXraw%AkhpFeNhaoC!YJIIql!pSnLTpZt<5LzxeC)6kOiiOcYvd_1N3{!QEE1#^r?B zeIAXtBXRpHTqvX+4sNG|j`@xk>;>Cgimd(n4`=pv`HT!Q#TKtLM*ClVr!O0ri_H#S zST3`3(Ll1TG`L(IEyKl8SfhDIsLMQ0Pc=MR-|s zb9JGgzqTtk@9vi1TiFcqAGwe46Yvh(6gE)A;iEgsF>4dbaZnSs_-4{wj{Hh(_ot`+Yl>rRvG_UptS! zinCThvp?$*)Mfa7EGc^Psxsa2^>c)l{Q~UzImEy(Ano#?&+Jpv2%Nz0RF)yo7ssIl zkM`V_z0tXxQ$Ojts$ty*h@RulX#|eJuBR3%^EjHSCk^)ZoOJ!?saq?_ek=<#xj%W= zV=s?giK2Qjj9fBg66gCStMPupeA-p@UZXb-VU#ofvSxDn@XB#Yte4NX%jHM+&E4 z!hfUQ#TJ(NE#_{)>jPK?CLtrmUDemQ)+s>bwvhTkv#Xzadxyy)?o{ zcRhat^z%RY#CYzR{opz!hIRPkN$_pw-&4ndowfUP()4-yMd6o4(JDKa0>YmaM(E~T z*E86|ueR>4C5V|e$G*&A$>&3#ytS~4>}9TA+&=DBUO}E^qvT+gi&FOCATRGJ86C7yI}i>Ft2 zS+CS+9WI2@PVy9RKx*9`&cv|IWbrV154Tsl9FB84t?%t|nn0@E?2h zz{tm`d`;{M5}alwAZP#aD{iKt0*lK(=>J!sZYsFpey!{L*2CaKeg6XWR@R11u6KZurEz3$6$Z+k|Tj1S+UOylmSzp zUTNi>CNKYbH{`!@2X3B>TERlZLaU-nEysT&Id$p$CNYA4;r|fG&I3qzy5w(@dB^sCqr)4pLD69t5y zA~@@2_4U3QaDsrXuYL@5>$}j9P}o*!PXPlZ(E&^YsbKM-!bBYm^xRfKEXi9OgQTLT zws3e_qQMSbo4N7T6W3hI`_l_$&$TjrX|k{sNfea}JW*DCxK1ouce`pn!iohds>057 zXxbA2BIFl2DwRj^9tb59teYT~gDxSddz)*k>gFhnJMB-b_WOCQ1I3E(!M`@PZVXAk zzlIeULue*AQ*-oC`*Ap7H7y1@Jjf|VW%tb6wfsc32%$(?+_yNABuIOS;tV4LO$P@7 z5+}jS-gOz?cf)UsNEy9*YFWmn4_x+2*UzrlU=~(|+t&O() zQtr_Wd%=;NyE!`&)|(9@9c#_6L$bBzq(A8qDojqQfB5N)jKV>S@ggkwaE+etEpf`% zH@^viy_FFh&;UI%Lrm^imK)!$>_R|2GZX zZ37}aLg$v^V2*3q?vct}Qt)cfCy3)<%7+<4r=VE{(f)^rM^3G;`z3M9m3#R|ncsK7 zsT>>^CLr&}qCfmmlCan}#b?QET&SLvyh}%1XJa2bI^a$*liANL__IfPZO;wM%XJm$ zuO!b+%VDB(BJPrPspCnPR) zd_etwaDG1NgUj}}MMpj}D9X>gM}*F6dhXb#4J(s_qzG3Ke_@}#QDo1?!a*m@AU=J{ z${c*NX{8UF#SFBS(Zi9!j2k6+zgu1v{wBIk1G74%*GaX5YL4m?v7QS?{R=H(VA8Uu zM8AN0-u){my>84y7Mpm5&8u0ygwp)^<^l$F0R@B1#s$_t+N%Oy4~@2vlu>txQ>BLQIi zIP-bPk+5!dGjiRTH+zjYfzyPV&^k)saM|A%TF&@7+TUWea|M)k{NOlZlKvy+f*#{m z>nfDLD)BY=vdqW0)e%fd$r~=D4zWLRK{t-kf@dyGhekZG=G67>hGNHIVeF@QVTJFY zs|f_BTTr`v4u{*#jV%XDTvK7-m`;<2s?ICWNYZP{z!LwXfoaEQuDt(m9d>cpB#L_X zYCzemkXNbVpOmW9ZYaF_V5{jkYvds#H%@p92gm5$y z+n?HYu1VMJ1sV!$SOj~jJ;o0;sGO!@xn+B;{0!EvyDbW{=z{6;eL{{ zyB-=bEwuf)4#YGW2Vl(Mun*&EtfuWv0&lEb9K+pME7jB&E+@V+xAy4KXv@2+phVF` zS!XmpW3WWz;s2Iw&e2hRamx)W-=JqNiSeg$j9&b5KlUr(hw3y@tOtFPp&e+gF;}XM z$WoHN;-|`C^7ALY7iHiw=pi854t(7Bt=^mUA78H*b}NjRu-pmF7W=NsCMt z+$`5ywm1Bl+|Zf#ipybz8nsQ;rW@#x)aAPmA;xZ5bxxV97;DbfT*I8F^0##{}^Z$lSr|sD=Aj zY_t&V^{nJ9z`IbmIAe2H#Pjn@CAlYWR(j9r@D0^DgR*Lqw--PCW z1%v#RH+W*Eunuy&WSVXxL}?Z7P0}iTIvpWp`qd5%M5x$J7+v(2cUj`Z!3Sr*$JZw* z73~wP)ymlbR_;ccKi4CtEyzd9AbswRwb)~>X?k*8O*WOcu%lI9r`DCI9@KtzF1p`z z0U)C-2Fn$mlVNaGUz|$Xef~phQ_7L^DXx*`)m>hHlxXGNMaoMMKW-xKKfHePcQtJ_ zE3TYfNF~5=tE14ETl}6T#QTJoW+FQYql{PB-U=P1S5#81dM*=5W$*B94>-N?FQrD? z$jXd_mWGTrpycEaqc88cgk;WQOU?9U=@lSxfTmlcaW@8aS^g$*IWA#0H>G!$eciC} zmQ#!4`&wxG?=mcF0dk9m-*^I4o4Ik(Z8`|D>?5{SKHtEy4-P#AOD@{o<3e7U$fJF! z3cbM%Tem^J7E zq*?6iLan7Kp{n!2Ez-G)HMVa*O9n>K^>!W$39>1^pRhbbat?d*^fS(gNl-Rn+b&1;yiCMiSk5_f~?dNXWOHh5~Mjwy2G(HF-w2Ww$F zaMVMj>$rMUfA0MWO)Zy@OL=GcTVCt?G*j|gckOIZ?QO5bZ~N^wVP=y4Xn*yBBXDqC zWJIP%@8!JZ4|AH18y3+Prpt zCE0P&tK#dV^ZfMs=vB9o&%9caSZQQtMJ@j)$E8(0!?k$JcA+NYBwQ>Tt$eJiSpO@= ztJ{mUx3)YLdX796nqcekJXnj_%+s|K4?!!N^s+O5sfl=YSP=C@l(0YrCHQuPa7Yg~heL^3$_ z>#oyMojXO}Xe7Rw#8U}y#}_&_(sCvxN=N?w`TKIz^^e_U25fxnk5p51c2UH?iS;-f zW%Nmtjl8&-MF4oU&H+>`*8Y0!d)e8&`(x$nT-T*!0_DnMIc8F7o>sEo+eOmC6sWno z0mqTUbac!iMNxXI7bZ9ZZRUhwJ(QttMxm{R);d#5QFV)OY7{PKO?%kD4B`Pzp53jBND1WO(3XFVcz9uDcu|)ZVic}kYwnbx5ej5K z-Y4}XXhgo2E3M<1m>Ur7a0~Wys)phUi_UfbgD}wXLA-W_&vz zSnfZ3jK&EoI>ufum{-8hWBoY7lrOzI>+W0Zo z!82n~M3#YX3sCJ5Dt1_+zZ}9K=GJRbR_&hpn~%8M{d=<^#l*@hH%c-A4l1^QyqS(* zFb6q|_3tT}B(-ht;`kp@Se)O#*4p=2)6G~2ZH<5LEvgUof}Cu2n-6<`v+5icJxqM< z0!|=X+1*%h*%?LYfv(!|WC#n0bjo0I@y=EKR}(_E@&ft+L6^hwxsY}v{;9jQB-j1} zm!X(*dgdtLqo;8s0DpJy%brIy{*K283-_YEfU}<($?nGNX_jnN2BnF^+-Z+RX=9=T zQ#1rVGM#b%%Xma7X1YsWPa}qo!=OpZNwr{OiH^F)9%Ou4C*V_=OlceRqa&n5)Kq*C ze&4@#0)$^xA@JLw@^Xllf1R{?LVC(}o=1yDnl} z5>i!+J__srKMc_k?;)uQBaX=KFNT|;%S1;P)F2TQ4izDBF`7V1-yQkvWKRr1y6hqg z*lbD~FXb5Lg{h45vmCvExb8k@hfKQ|!3VKivDsggfm8+Xzba{O0UA+zjwEeB&u{A) z!o%EJjQX>{yv}WE4=tciM%l7!`r%>y<9;w(E?X!aJ3!alaVHbk!>KJ-7660L-*@UE zt8bc@3vl6?nA}ey3Bn*z!=^xNa1-vJsy{3LDK;XfisXNk0J-QcrEXrO!ud z)&_fFmhN6T0ejcBf{_@H#A6pJ9pdg5vpo~0$c0v7$8xMDd@*5EnqZbDu4e|Vnk}DJ zmszj!1A-svbO9koU&b+bqh4u#*QHYTH%*4~x1T&6?Rc6y2O}uZr50 zDm`tODtnUlf9(;kgk#evxTH#XxtvxA)CZ=R0u#-nRlDP{(5vop$VUQ&sToLYXCH}l z-^-7FRFHDP_LVjarc!5_{4mbT#xX=4k4@(E4W_7blWt#apz`8rL}r9m|AjyW2We|z zYcFFEe9g4#_9B&1^osbt_3Y;_)=_ok!nHm};`73zq0M(sk$wE>>3WvyfRWLnDyh8S zEknUy7($a=HryfcTQJI2<~}M{^1v+wlL9rbcR#Ycv^XhByU{sDSvyZiC*X1=B^ARk zQo%G}T0A+u;(-PJZ>R`)fMi83w3k`~DOP+r=C1yPn^5yJxvtLho)dhO382loi!&$r z)1KwmR=XVgvA26$aXwY2F5`Shu&!G|%iluUuIowHl3-flop}1nq*B%74fH}x+bk+p z{HoGEXf~Q=4Je4{GRmY}6&x{=2sCo^(G5!6T>7_qpmut#;xx5X)rWA?i!&!@8gJ=IM7FNB{eoBGEl z>BH4^lWYy~Crz^- zr%T)z!30_abWC8tR%Urw$uM8OD01E#15(!Kx}Tw(<)i)nzBE z*&H@`NpM^0PX*^dPN(HwCP{ecy%{Jm8NCoAK0KbfKK$Ysc37ZH!z-=To`QRH2STMX zjZdZ1LQ#wqq{XOW+Z~e=y*4H<#YSK}+!SFhl@3r@-fg}&NBdC?E!9F!HFD-QxwG|N z>_`?4{6=aXz>S7brzN659jPT0o^c~e-Qil9%JhTElxPT7iB__jtPUs61sZNCD&uFP zx!4(|@qLgoqw;UkU3zORy9L%r)<2PFr};SM_kELPW$?OYY~*#HTMc;$o}!QSeLPld zm(EKl=J~w_C$=~Xwm~>E1tYt8;_}b5{|9A2n!i0vWSO9{dh+9cdXYj;sCy4x<}!74 zQ_(Zx`sLq%z0I?W8a5c9XX6i$$FVTB-_$|T}S-);WgYdJ76 z${`J-+k}sQl-&X@6jplWzo*mIs-F_`Vr<7-Z@+$>s-woi>zr{i_9Sw$b-QaU)-%|6 zYudz|P(VzYR16t~^SxDB1X?FaTE_M=O zQd68nn=7D((NswFi=`xsNN@-woC)0rD6|@*OG+Hv&AaK8c3LV|+u}k-xZ zg>_M(BWq0~OzkOWo_SHWy~9hI6&qS<8Z@_P(@iv4RmMcNu*)enU}2V1qst;2S!I-g zjyU0tc9dj6IN0s77})K$fa&6cZU!4|v0w-h0ssj>91wfcRamGJrep~;9VtL0OXGS< z7Fu%4CP4IIIn?++qc5sM*T9{!qKdyZxv+;2sT0og_XG6F`pJzOYCg_o?D~3>CJnT} z8xY$UH%=_j^=XJ^-BqzU7{JpQ(@0p>qYhi-;~;cbM**Z5b~8%kG(2*6&~8E!Ah#3Q=9^zm zd|njt&i%f}SbC`>C$v4N1j_TgFsW>8X=*rvADb>9*tFVgPSJ#EX4zW5okfERFbzrD zB~*xXF0gELxw)>wu2bz1P_Y~r%lMKMG`R$gTO`-(2R`pG=mRjD|>VLmSLH*SUWBaED0%(1p#ZhpF6ddYm}*Q|&#j`|nzF zo0QMfL$QjV057M81KR%fG$mL&E&|-P3n!_Y` z7Y~TzHG`ow?i0Y7CUZQV_aONv^!>-YuaBv z$=c{Y)u+G1Fr-jDN$pCO}~K)K#UnmOU)`J z07YAyvS6?e-DV4eUctj-V;cx)*qCdY^pOW>)cY!0#1t6Dn+lT$JLN)$Q~#t@&Al;~ zjSyvd_Pk!Fhn&!EA_9azY4Lv3heJQgf?9gxp9iK1@d!Y%l0pVu5%^k|a+o>savcL{ z$FJeEu<7}{H@CaPMT1-}Qiybj8`Dp3vb)#okz&@RH~@R!v*)K?hOB)n%MtK&cB@z`cJo0(@YTd1x8okz zY<&!`Jo@~SXjThwAR{D9%~I6iX_z6gD38WrAdsXINL};7B?pHxmUgTUFd&Qo(E<{s zf$KmE9;^-eLWYDT5rrrSQ}up*7q^*c;h^Lxg)KXsyImv(IHOZ66gBCR6+j&-ekY^x zeLkO|hqZcI`gwVIXP$ZWKyC~ZX$>aZ2aZq*%_20@Otr&Za?2KBe1C1ne~LUU((9~_ zkh~#HDWDvb;X0EixtA%3Bo6t813q@S<)$yv=ajmA3k%wheG=d5k zDIkXx8hv^K0IPddH+GPDbk<*ntl*)R1gIWA^DqD)3c>@hb`=~Z8p0r!QdA*G8X6to zbTH~$<@wt5X+sC`kT1ZPRcHzERQ_3m#*o3=`xt&_^RVq8rFu!yAGGjAg3k)bahQr? z1omXPNJR>OsuT!t)gsrOb;77a2gl-E;n2*IM#W$x0zt7sBMmC6t2u_n1DdV-OI%89 z+(eOLSdwb&SC!xQ^e|y{o^g1Cx$C8RTN~0Y#t9=H`TdomFWoB17Z9O{G14bLem**5 z;TW58gd!uHw9weuRYXM*G*ZaXMO0Kx08vQoWZ4c`WknMMNmP+hL1H2o7nwo=r?v>P26-><~BttPwu?4#_B5I17q?jlu3RW5>A($wNZd?MgDV6fS9W_i5 zx*67Z<@PY?=w}f8U%C9by3-)Zh(ahh1xShzretbnXAxk`!r6Cqy5BwB+i@$lLYCWa zjoB=najS4eP(xHGn^-2!DneLF;vp?vPeRSns;liAi3v^SXh@iWB}Qgsgnq|2J1G%D z;Z;-$DM2FcYN%8Jj${JG{-$^2OmUL9DnSxin7QFH#@Q|XMk%f$01CNbOVm&=pRMT9 zPRrKGFQ!UTjSxg(Gd|tZa@7^Eb1B{9B}7|G7j8_PAZY_7#fef5Y{UB*HqfH(#ygpd zO&tEmUjOiYm7}1D;o<)N1XqOMN^&Rcwk;#+X{seco@jBq1 z_};PGg;%xrFn+P1ZaPG?A6=!*pfsmRNJe?A$mmR{P>!pzgt}4)@Zo9{8v=^g4uf$+ zN1h8;b9u?bC|N#^Nuj{VU}ha;Lz;B#y{&(5OfwlwqcOQqL(r~8$}pIH?^1^HBk6?~ z0QTLANp2z$Bb6ZiA4ky>duDJaa)Fc7p>n%sWkU6Nxo%8hOa>50&2^U>mUBv0AWXnUq9CZ6)rt_v`JMEK8zgq^fJ%_&_KJ{DphhVO z_dHeBQ7|Vr%EB1?Cp&9bG7y?7a7Vhh(~!zhZqRm7?;OOiVu9I+A%X6Db&%uoR#YEr z4Y$_QK3BEiZUShq(tBdh@>Y&r@(S#pgE`@|P;ej`#}Z2c*xk^dUm5 zFF?gWIkI&J0cfmImWu1-I*-H!#AsQ^8Vo24dri!s^mi54X`+x;G%&>pHyUgYf+!=2 zz{th``Suiw%hLQ1+^{4Vu1w!TuNn{Q>`>=}AcG{tvY-3~$ZPi*#>q!R#R2H#Exk0Q#9|oatToLH7 zYc3&ok-|X)icf?nfe@1;Bs%P@7KXJ2S(QpwO2o=q)>~_9ODEWxfG)1pMFgT4flAy~ zF-2sVY^f{}6h>OrLgds%bu$18s3w$k6~9=rOj1fw6)6)GK(!jo%p9U9Qh}zSl9HK8 zr4*{bC@6x93YA!kZ3Pudm8i0V6kAG>U;C$-56k`^+noal6Au_jp~OzJ6e$4Xk?aXp zkSSjS++Yuikmo>woLH{-3Q<3g=JopA$UFJ6L&usEkmV$??Z+4eL2LTovDq1sb8Z{Xc2@sSKDG)T$6fZsufTbuk21;$UB-TSsq&37uh|Y4% zK}oEtWh$~PSLt!?)3=I|t&S^d*+FW1<;vQM9JXTxqC`lTfn-paz(p7c$yh2`VNKi? zY65CmNQ)&!fm)&{3mZl{mFc7OM zEEXuB?SYO&Fu9P-67`2!4j@!H;+$QfSSYnxR_sR7PY6_B50|0V3MjM33pcV?m0J%s z=CsWys$#LjMWn0-<`V_9cXWn|?97Z1R4XB!49laC92(LF>!8Ln#7Q`@ zT~t{yfq<5lVtL!geK+;H-WtHnJ_dKYiizm-hN=oQ+?#HEa~(=0zbBz|>kM(?WEb0o z9IpkJ1{geQ3L&nyCoRN86=Ew^&`U-b3Na-^GMSZf1_lCo8BJJftiwe-ZTTH4tZ6s+R{k1@j* zU9~=mSPBu#KmGpq{3E?1`OkgFemc<0It6tp@61}!5ei&HIk=lf%q146qv12OCML0L z=sEIdPQ7(Qe)ZQ2ioY`{S?4AhWUE;6ty09=5q%2lL549NL4m3FyPixtJx<;Imw_}w zNF9p-86tY&0}O!!!8ki+$ZHRCAU9y|~Jc6ZLs^N|mA&Xm=J+&EYO1`79X<^7$Z>rIk$Q`IGm zKImtUo!<-*Lds)^vq?moz7sQ|t>7$KQx=vVqs+`+8N;6j#GF8cbm5VzRar=4Awx1# z7$c~m8PmA#k#4Qs)?OTOrkQRGIH`5E4Qex4Y%S+yocDUhL ztX~eq>fuQEx4rA9 zp(~8^zm4xp$D6(xDW%?3GV>Pw_d2H%UcMcCI}Uf>gWa);D_+=Eu~{26lKPa+x%B7s3$>6$!-XDRs7yrS%^jh1mypc#T0Ef;$mdz0eXQ60lEwOk)h;k%yfK zT!I{^bOc(6@{H$*+SWuALzM?(syfzusU0E&gibVUSt z2J1=82#71OHO%kc#Z5r;cv(!?;_n*J@02Rw5Wq%kYZ@!l0n!GWO`Chnq>cA>-isDi(>t}Bc|U$96hP^Pcw@SZOD6bwETXb zXc9vs)e9Hbr1)mDh)WisDb_;aAz+YaS>v2dJ8ia~PM(g8ip?DAic4|28zDHK5PS~YdU`Rf@Q}bC?Ao#WH)b*YGXP`Hi}k>5t1*|Cx3?? z4PFkGWSrtcT0HDlke#~pa$@@fGz?)Ar#3$-7VdBWJsAKe^bCQhK-Nl@fdUDXg@V?U zGfD_Fy@y1S3a&G85Fd}mbfQY1BqkumL+d~)3>wm;r2~Y9&?i`&k?8bPbqWCb^u#2A zv@Z5Q(74xax)6y>MaSARi|FArH3d?5`if1TC(8mVgnZgBFPjux<3>M#fW@B8&{Q7^xbn7D;Jlprn!_7@{ePmO_g$ z$eC!OAt;H6h{)8kDv?`ZMVt)6WKcjvG*4_REibzQjZ4W%B$a_b7kFpE>Jy7jd(ap# zQLT&%(AR{LnxTM#4*GE_p`kTaU4dpf&QC_OA%(BQ5DGfxL_D+`76zzo4VcA=wW$px z4v~&@HY#x+5QKTpakYH-acJsfA)WqT$R}dHZj3;VZgOqB`X-r)YBXHE4 zBy(sv>&>^${JsyqzP#Zwls>K62 zaf!Cqoil8o+)BBhY~qg1h&pW{Tj8W!5KlckXe!i>7!*wUi#fX+NNpjND0T3LNkVuS z>C3v^0MMzr5QZi7eW(E%VF*a-3MutNz!{0e#xP@8ueg9r^-@;DS=_B+3utfwE zP>8}b`xRIQLNY#P{* zJ1oY+j7b<_%p_@rJ;+tY-?QrPG|{4$^XK#^c8rfry+aXb$I-yiPc2PaP_KSAJrdET z%u9vsGtCW(h>j%~{4Hj_9{MXeK}H}{Hwu?9!7D1JGK!mirzeCKEPU}W#3@8m(}u2~ z`0C^oKc@H06w*cv@`cWZuj4<4`F~sc(^I_3=fnX(_#9v}ivbg|r`&ZaXPUcGvL*zo zsUTSwBv3UaAtez3n~Y?Vn}9w?Ky0ulWsua`ELJA7GQeet8TpaL&CAQmNu}@xH&*I; zx9D_zenUXzo?010rUrRRDUPhqhscR+dyzAt!3jdN5CGR~DQFjaPiP2nRICbthFsC1km-lrw0*;)y}E?$nVWG*ZOpDI z?8`7_fVd#~xXyXpk@--_ppTxFA>XZ15U}9EJM-nXXyGB=d2) zt3E?M64%*2@{8p>r?>t>J zK&&NJ5keZsV1lR)z2OZICQlZicta8st&JdT9>j+bJh0rc%5Cx1!V`z&vZS4`6g!N8 z*urZc79OvT<3Rpe+!LffN*yvzrc<1tFS`S_2B20Gr0qI*;!4loGESA4$qvtj1KvE+ z#oWNg4T|841}m?G#tK6cqrMNxl<#<7&%--P!9^(fnc35ac-lF5g0D2|LwRg>yfBzG zlUXNUiibQ)DpCFmFkpy z2BV027a+v;Q`+H9e#`LA7?@H4ZiHE45nk`(2i#aM=vzlE@5V z9ohvwUtzV#=M0rj9-DnF=MS*gONjM;PmW3}>6jvDfM-lX0BXS1ga80_lp%tuq76%D z)2%YKHHmc3ZK8LaGIgeQv3f>+s}C<%+Kwx4H0zT>jG2JA@waBAlJ3mhyh5wsc&TH^ zQp{zTTE&RPCLSpl5=>+}OU%PDuN!L}8Mc=|l;ynPc^D!|i~$`s=C-A&ein4(YXTp0 zB<;o%S|gMpS=FoMqdp7;pNWC%x1_9CA8RD`PrbweWIkSO77r*?tfyA`WeGuCp5Tz^1|&2 zK8P5AO**8UU_SO3!|OmQ0>uC|lCTBkwG@>bL)39G29iTpduOSgk!+x|1Y$8Zj2tJX zW*=ABe*hT>3aFZIB`r>z8H?nKK2?IRqgPPT!{2AdS<$Cik=nKSZn#rfFk`qTqAG@p zXkscNh@v6_n3@`HX_!exG@VN#p{S^WfC*Y)xcU~23()3(_~;Z6m%h9HVIKtbP( z=O+wOSTS;7h~o(k8&dvXeHk-UMlO|x$u!JV&!O0?#Y=M(Q&%9#j(^h3EtW-6aN#1* z9AQNwZA_Jn*u&ysGm^kScA5|!paW6_OAJZtVT?0UNhQu+yl=ksBJYgR413@}0767p zOf&^uuG)oFEg&DquBzNxPwkJ7usG)ipproFv<(36Z!`nN>Hd@w;&x_zV!?7u7+eYlhZS}*&jv`?0bTYN^00vqkSS194v@t8MA*~`9odW$-ySw)!0>8t$Z&T&Lor&Pd0+j|v6hRrJ= zhlKBmwgz`!R(|KHvQCFijj#3^6&VlbVL;%+8V~Ut9H@waiXBx5A-|!CSow9Q3Vbxf zbLf(cOfpCBIZTx>V`(p#@L)(C>GJ>uST(8voaaErXKBb&9}~VmL99V*VJb__0-)Qh!b(Qu^Nc`5VaKp zP!&Z$ip4iaMp@1`Kv|8fC)rccqi!PLppKAwv%MD=HbDsz)k-xRsO3yrTj<+2HvAQu zy0V5S09`KtT-=5yVj=!+lkJT}e8su}AS2x`EAnI9IJXVQ#y*oBGl|$?s?90*szV9d zD3By4b+L3yET~2Qbi#^j6VTt?Dv?5 znZqi~dRoV_ox*y_UNGi8E9HSuSw1bbiZD~`amU6{RdeuD+O?{aJe*{@4jLsMesCNUCE zR>V`+c)-r|-J|7#kL{M*-p9)oyFKvKK2|*py}UeGj70!Ysn(TOwUte!0ll%1NVr*~ z8v}6Ai-*r^2lE*$mc7>;lc>;)R~R9&Kzb~5S{`vjwguWTo*h6pO3>*664fE5#S zFjEwOn3V`d03N{XdWT1{&D)kEZR(mqCgI&;DjJcY6*PeeRbYg7nfu0TAwPY{8R4f& zc7cmBCoF;3#t^B@l-MFI$B);T*bwk%aL>F4W`hVWhVRn>&GWJ+vm*t5!04;V}OV9uS$JJS2Lv5=7Wi`LIKJB&8`!Q&!ubxue)Q7Y9yd8@(p%eBXvB3(^2Is-V%Ru^WVdPJo(&i6-$!K zop(Ai-dr`)MJW*zv9Xmpa4wfCja7D9jj9k(&AbSPap9}ee5b2eUA7G~J~{ikMp+O_ zS--oJDaD1InBa$>(wU@mm{+~>pB#{)hFXaI)`U7h?WmG|3n7p57E2K!tl|`8 zeOelj#O(n%)DMZq)4mA22{^!IXz=b-%!XpvB}59KISR<5?tAlia`eIvi`WjY$K8Rv z@wz8)D2ho%u64pFZ47g=$aQ54L8@@jm$G|7H zS@}AJoREf~?2VNe%n=YUn1y&ig4Fewd3>dT5dNxAApq~i4`GC_lSz_Xl}?E(2P9fR zGE60)C$hX1e^{wz)VZBms?} zdYpeyRH4H+8kw3M?~4^)c0_f~+m7b)c0HGC5q4RObQ@=l*Ta~j8Tu3YGFvuu*2M`C=F6W!V*Zi;hcUQc_flyAQJPJ z1oOG6h%V7$#$(GW1g(_Ycxiaf78$X-&LoEx8gSaYCnbceW5)|LZv=(h=fv{v5jH@%Y+x3&JygMb;9uT*3OQrTKCooylxqX zH8rjpQ=F8Uq=zfSHj`H#ZOztVRvgN>DD5l^yth+1#Y^d9)2DA#xc(8eLYWKelUCe$pJ(=ywAlYyX&Kv9CQQ@YZWR8Uh@FqKVJP(S-uinNLn!pLgNkqR1{G` zR1~EUO(;+XY-rQJuwET5gS>amP&UTc1#p(mI&j0TW+*PfX(WnU8*Pp$pe!}F9_`m- zDk6)vDt29z|GzgNQ?txGGJV;v8p5HXIO@=H&QF6b zCP{(`SSEswoEXI|Qqn{eBoI`|LQ;_cQZ%I$GC@QWL^4SsGSH<`M8y{#V9XUs6iWot zN>VjJO;AwLF%%I~MKDq{5mGb|O%#NMFtHS)Q7J(%69WVd3`9swK`TR4#L)#2P*fBY z1i%$V0n$5Dlb5udppJ2QIN#l3EOuag?BczV!gFKi#+>X|2woR6?Ar1ek1Xv03ipp~ zaTLmJh)+nEDJ+^*-ZP3=!epXj1jQEg@mER$v$Uc-G*D0+YP8?$B7S1m1>)@gf<^3OX(AEt-+Aqw{==sl9AlU-Fh`RBJUWyTRQ23- z4)HWBs{%W2dc9`N)J2REP{!K^-YyrLDM^})5@5+phMHWBW;!dD;54!zvMrcet_T$% zzZCV#Cpzfo;UCDPILRfP>$wd{4WLg#B;OqUcirDM3JL(kXM%c}0}zHV;qktkdpOBJ zbf=+)xdWT|hV-Yd}| zWtW+h6d4LIg=J^1RK%hO$@7rx%fgr8H@(%ZN6J9<`fgn;h8fxd)O?bOL7r#yzW4Da zj58DnrHBOui9-{0W04GK2o$2Vt($Som7yo8AAK2(TS7o`U}X+E$q)@J357;786EV6 z=FxnW;<3Y*nJ``cuiy@tPI}wYspWtC77Z8lM~8>Bf;+xh zfMKCcsDBUph_4+6!}jkMDP%wITE*sYiT7rCnL;q|^0V&mI6f7F(GzGXEHB=M6fw_? z^`vSh_%_pIC%FoKQfDO5Sn+B}IJ7LNolHPZDiD#$qY%h``&4T#+&p{_Y#Hs_P?!n< z0R)XP4NXFm1xnQk1XL+7RI6>a+e#W6ZUZYp1gG##y!go;`ou4V_bq`Zeeayve_zIj zeP1*8A_`QkrBGfLw`_voked@pp%ButwL{hj1yb4tjZstPA&VMnV$6_y5dhLTy!LOq zI{h!B)ftQxr_FL_ooa!fq3csW2TGRz^_`VTb^UHqhi+nsOydYakMl43X)o zGCIS6;RIx&5TK$gnAQg^kKgaQ2UC<;0Y!q7o#q0_e(jQ-QWv|3&u!0zv4ElokE2F5 zz^bSZDHUK<{ItZ10>u=^A6%fKf+CPr7>4D<5f&yUEf!)KTCkHwc-eIcLrfJ>F)J2C z6m5k8g+(d?g2`M6Y9d;y0Hrddvj$Agx(Zs)#6BQu2k$+Hu5(!%H&SZLyhQKu{{8txh#&G|LJY)kvs~sYS6CmWkD( zkQ9n8D@7WW1&S;Y<;$G6LDs4TF1Ujg5LrZT!N>w4p@^wcikUSbs>2m2PGpt|F)AYo zjYy*7D+*h5UEruBSO}b1``Ehl8I(qWUNyG zQDCG*a>01RU3G<#iwtU1h}bHtTWDKiBr%e%6=X(RXoj#e_idX-)KFL~Sy@%Kg275w z(L{?Ch{P2UXA%nvIM3F~LlTKnDOqT(TEvN@tcz@2N=!TFQ$~p4IWkdEO>)=_5gX&a zhd~i)a>*bX84d!YpI82!lKS^QsgZ|0c}lP$wlvrQN>NEwK~*df1tC-=BtS(HRRvWv zM6`ub&KPLYQZ%R@*MhR3DzPHWAo(UoUNC!J+bkCk6^quCP3*4;2qmFAK#>ducMl3; zHnGSG0s)jPGMAGF3FcE|K~W6}R0SndB@$*}6bdm#Vv$J&X0Kl5Fr0YXh89ld=J_uE z8-Vrk_+<=%+N4?6Sul}UqOB=lOKrMIGYm@!PgV`@mzJhi#}Z-EKo1O(umeyEfsJCL z1yc`9_IW2HkSM6dSgIrx5_9Ks;(=o%1tP3Ag*eo#fzX2zhz@OyA+&*jpwfn75g?3m z%{V5I05TgPA~PI{Sb{8JL_8p3b+jKaawvnARbjTKMMyCqfsq_p86sj5(6%IjV2N8w zDpn_HOl)gN(HR(SZv`}VZQ39%H76c7$FnkTl4b~H+5|-wkUQpKr&&YKr#?H!6hqhH zaXT2ItjGl^8DP>)Q98^6S%auMiWuhRLM&KTu%aInsWfD)AZa|7p*W+GT@o1@+Qk!6 z3Ot9L&L~JQ02r#$7IS$?OU4TYX;xMw0-0AVHgq6?zR3V`LWNR<7)xSIk>*OFg`knb zh^mQc=)=V;i{L}c7_A}`OSHfcO0jf-+T&)%=FG>`}{7F0-%Ik zw^FsD9uNvfxn(a36=j+*WU-{l3@Qpr5+*yWZ4s79UkOTx&dDWQoVf+;0f z}E214SZO6z$=E(Z1l6?I<>V2*6UtnWk! z0<2Jh<`y0pwxtCM!=7{&X5Hyvn!40p8PU`y5Egv^G6WA|c2WzRRIC740)Rux1SLQf zL0M6fpj3*Hu5e?DBP^X9OQRGErSDY$vBic%0_CA8YNAm9A@JViXvkVG1A;rM6?JcS z0D*$KfGD6jSC+tZO|}Rb0yL>e4~hjCV^R!-894dPRW#6)k{9LO}{(SlkmOKo7Wwmqshf95tIkj13V4L+BJL2LLF7ViSZl5Fi3Y@L&3{ z*j?@8G-&|B((n9u!NY=)4zS%dB+~hKoL!_giX`t=EY#D2p5E3MCe%iH31lHLp|OJ)egTXhp@pA~63ObWX6G`r`+MOjQ%Ce1 zdFG_a6cYl{0z$rTN?w$}5(`AI8l^X;Y%{bG5H>d5KAxFiWin2Q*{@R~>o$cGLqv%p zzR;^viNo3<9l+8!jN+*aDU57t2CEvH9PY|ALtkfqT^vS{q^3#?7%Ve>h)>%wZvA&K zhhgd;pK;!K$Wew!>oSKam{y%8XnlJ_S|NwvHK7zIKkEFgR1dH(udlOTCaRxLfP4HY zqsiqe1KaT!P1;SmUcyaOkw(tRq7s&n(np279JX=kGfQ)|YTazRs+DA0L)_G-PpLVOaqkzGD!z5Fl(K!wL{EZ0OSN zo|9=IY4=~5N;f29cyCfLHUhSEN?ETq_I_WfHoc5{O;~%UgA$cGQgsEGGH$7I$co)bRs_Zg9;?vBW%e z=y1JZ!$ke^dS}Z8_+JihV)&W?1Id?aP^lxcu6NjzU|~DY#oC1#R#r#_co_F1eRRj| zur+S@N|uo}ypQ)rrjZ?_vdUsA+74z%2-r0J0f`>6C^&pq2KP_5*rJvYj&B zL@EdaFe(QZCg*HZS11w?2|3;C*Q&S}nBNJ9s!GjCi@TT3QzYr@hUhb#r!~eCUoCWj z+pAAjnE2TDhUOec==!Fz@tqD}Oz)Y-+0a5rB#>m1j;lf{l^xRl%%8wzK~i^o+Ydp7 zWQu6{l2lkJZc*jTWP_6JXjzz2IHiC=M80%8;&1%PgXWDJ|hx2^MS#Y6O5pyBg*0Wfqj&4+aH4rL$9XXqH&bB;B?Ngf#0XCw-XA=PhUw@=rHDBfJWH2j#K;Tg~i)?Yrc|YR^nzA z$CS#H+inhUq$N9VdX#J#!K#_XO$Y;)@V4m zh%;z}tj|*wS=ZBPZ8dAc(g;eK7(}qnAi6ocS&i>&v4K{xXp<4bU1=hb*aNSl+4;Xq z*Tug_pQg60bY47oZ0WxqPo|Di>7-}dIGX1uxAPFYEiG`P> zmQ4Q2mbT5>>=}iNb0f+=f)1se1CdZ9L{N&OKQNMU%g+YksoHJ(#?6n93*9!JO6xTz zEPw<_Umf$|_f8jJJ>Y|&~rA}!X=_RXq6Dy$%O(UH|)q_kx^4KF&w2B ziJ43*C}Jp4gN(T#NJ>#u%LrtO^D}7du{MsuufV-jj4GRJCNhK+89G3ZY3jGQJsE*! z6(NZ!6_OJ@d~=+W4dN2RJY*nYsWgxb@b&iw4P>}Tu8&-pZXf8`*(8&7k3nq(lX6@c64i+tm|=^QqX!c*1!ArvN+=joO1~T^ z7({eSQiviY7_eM$QAA=0ibO(UMX*)2Q2{_$tTNc3ia{=6j70^uN()kuK@m`b%yA}z z3|wgA~wVkK?VpQ zmg9eSfS0c(j00!)$-ahTkhl7-Aie+}J~LY%4@7AVr>E)W%M%L*}J z84w2>aam;`R@IQ0rD80mVQ_{62@97QX9TE_BLfd7F)~#i7XnJ;1OzOOB!UBKT%^nl zq>KPBj^^q>hG^w6JKW8%lUP)hl%#7ZL9|k`#uQ+onT`!^I3g}JwpB$S<0TtmD8b8Y zs|q14ViHhuB?h@D!39V;495%GdMv=@MZL}hytk*CLuEtw26$MQ%wysQqe-dOPC>5gjQV5=O)b|AYM{gl)SR-3bibxOc0`A z+EHZ+*c&q$QMDPOB&w!_mP|D?L}@C(W0EzS_-{91kV}xCyv-r3A=67@HRB~n?KPMq z=A0OgNJ%0>5ZESCmjs5)9Dp)zAk2_PHJL6HDN4ypAtMX{5+OvABNCRaO3H;4mfK1w z3l&8HjbaFts(vxBMKL(rajL8<41_0KG1RP)5fKEGl^BXBA%*mSb)=?{)XMAM-OC)g z#3O?nKCf#rKDLQC*Ou`PJkp&$@b)1uEws$c!Vm}mUO=J06;K83D8)?sR9Xz#6*f=)Y2Ep>qGIRsByHusZX(?uWmjnvrxof_1m&Au(7^> zZ!@oOLv!@}qjCPd{Bb-ZQ3ElLuz2x1aTGU=qjT0Si{ov%$jW}cdt2E4zZ-gaYuFoU z#KuyL`7;oDHO@dal3Aj0DEty|;Y!Xk>~QadtOWc22es3J0mVeDuc8^0QE|zF&@fRI z7^*Z?G$jO(l#x+LRSh#q5QzqugE5FOOS3pRVGDL@>xvAEI(ZoZD?m`RqaY}wm+0ys zWE4#hkrWI-&=WOGMFN1U3p5h6X^0GDMi|QkN)goLj!330LInjB1yTtGS&XczlA&!B z5~VGXv5iOwt!xAekyIN=SV}Qs!lGFyvZb^OjIeTwK}yPiudS#!6cnr_V%9O1(p9^G ziG?gIN+`$-BXWsueDG!SnA(DOWTGDii8d6ISCu+#4!a4jXGb9s| z1z^!3FRzm0S68YZPRI$wg+?@1P(zDc9!_S|98~^>XbW za=Czzi_(or*XmUux?h6vVu*pIGN36+0~k`cMoGzZ;Z4yDAZf5Irg#_)X3|RrfV)S} zOjsrXhf!T_b;GkbB5fw(V~C!f47v9_)hA3Sl41wJ4?M8-L)DUJRkAHn9cDuFB|}Tt z_h)5y)wv#CE@WpgId+<_j>4#;^xs{Ofjzx*3QwjLDyd&~3oC4hQ1u)QA5zO+O+#bl zydqj;!+B?o_!{8e8NrL*Jv-}Cd7A9jmLE9CKDJLkuSxq4r``hnP}{zkGuy_JHlOxU zAF7Mrqd}Wg!x#k#A8}|gqnWC!y7l?ccm!|o@V{KI)7xy(I#xwTV}TXX)^p(M`4D-Tq=ik@A0^43U@V;EmnfUBg0xB>TK}NuA@bh=KZ{-8+ zB*YdCebYjLpLJeH<$<*xs_c|nGCflsrsS*3ZUkhjge%}sRE11vH+d;6W7AAu+P#|c zb# zkIL-x`h^4E(!lUMf*7Ktee9zVj#K87(HDJrmeBS&D81u)arbM8Z|agw;wr_!Xl;Lp z$9lX8oye)iYU|8TnpI>TN?oZt!B5fI>S6+C!Zuf|Dj7 z1lm`p4;LCh6e?86(@Q}}P|!RhBr1qbny5rz0$;bUzwM=rKF2MV*(E~0snQiI0~nx1 z1_=}sX$%w)n;UTB956N4UFn3IUjz`fY|A_h4|ZT08LNgDgL*+LY-zAT#&pLEL3#{; z-I+Ouv=UXJ#xOOB1U=oyjuzRVvM6F!81aQ+jOR4ZlQ@%-q!vnhH}P3D6A0?oZqbj6 z(}~h*cjlE19zSn%%`b&b+ws3m-0@-Ig{C_u7W@e3d7e{_)KQ+bp`#*VqgXqQ7GT43 zFPGruvR^d5uXtV_r_U-LsmRVxjVFVg=wj^ZYZqqYEoEXx+a;~0vZ!#iM<`jML=-_k zC6udjt0W>+2=ORu(MLrsql3*NHrZ}QM#~9f*EL&0)sCW09RxP;w>q!A8%M@CGGt|B z#^w;;j&6Yz>Lx9e=613Vv6s`aRXw5P`X^U<;DfI;Y?lM&BTBYA<7B#q)DDm;fM z#The2YlRR9K!fSelo_}QBrYH$lSEK7a7swfKpv(buKUMFw%O(7UM^lqzVTuAZNUNU*Q zg($9|FCvct1&JPaB7Hn5GwfC*jtvlx2&psO+>@0^XPWOSWn#T~HTLt<)O*NzYpy0S zaVcAjGYi^}bb8LUXLKAd3e5|fC6;q|UTl^c_6n?S+LhBDbH0@Xl_8Z8fF}z(l4?5G zXzKA)l+L~Pb|~g!Ab>#vcu@!$Up$H71Mz%coo$q1X=(PtOoL}UwU zjBRbK37%|_H3?Q4p#O>_l7V5#U~2g)>oZqKq?C@y-pZA=X$q%!s3!MDM*~P*uOnD5 z8oPn?`xTn_ENv)juu)TH4ksRF12qFNWceomEF1BWj6@kZMKPplWV;|tJ)UtvABjM$ zVlf;^eXJ@D{%kNfcZ?H0bLHHrl9Q9sR8K_wnOMbzvopp_!{-@OS@32gHIR8id|tLc z5Z%_!)%0%bG{6k)3t8OeRyveo8A|k*Q@jpkQQJ{N76EL%eCM1d@F5&+d^MZ0$|40; zA6|0`c}kpW3r0a}P;Dz>QK9J;+^c)B&alA;d4Z3XY zpm30RBnMMNoX$H?N`~A30rV zY94aV2>i0;4uG;jA<^5+k^+ap05~047AxkG9Q&^x=tq>;>cB zk8XC}CV=xeM>2*QNIGsHdf$pTE)L;SSaN$R~A&i56>WSk`ej z7g7csdBG2XgSf?DJy6bGeNGch3as7?lCkY;mt(C<_F*F!Rv}gy2#APimS0|`lsty^ z#w<^E;Mz9$_6rgGVh06rOsZyWbYQ@Sn_4h^DoUF=%5EAWfh5hA&WM6MF)~r(opqCI zFp3F;AS#oj!-E1K4bIcTP3Cvt^nFHKgOx~!x0d(ZcgWrFhjrY+!4OsP9QNJ9yJxj`(;>{V z`Ltx`hdSBX1~E|v)3kYXSh7`sK$VWgz{sg~`;#VtDT$nFu~ZSIoJ?S|Aq2hBp^ZsE zJwz$u{5?a5x03hO;R#D_3X3Ktq`{C-r3}d`!?wrK5~DnoYngDxRZwk|Mle*0N#mV- zwiEEPv=2UtsuawiK?y-bgC=-2Bc1P?j6`vCE}K^F7O|s2-!=SHuvdl z!sTXV#~uFX;GF`HRp{iBmb7WwMS{HbR3$_ukI5tUKV$Lj_^P!zUzb0*?K9=|$BmO3 zDhFlxyoxcKH!=CWoEBVVF~W}{DQTzzAA2YzP|L@l3nFI#VyKr&Cs7kj z@25(Jr$O9cPM92Wg(}kab!{(uI?Z9w@U|SDqgq{u%Fly-SH+W=@^tl|ld&Xr zd;NEy&Yb&nnQ^ptMi16K>yf{mP=sYtF?^TP?27#4QJ2U1_D zy>7*)Jr6sZ;}Wt6$T`_jIB-Wk*PFSRVDgm~HnREi-+fLquB^xBxtn`QW4lO(DvXwt zV+ii9R5C}*j^A<>7B8<@j#yYHW8@>YcH^faq7}q-%@4# za!z-C*E8nRI~|Vgv#)GJR!wQvWVp>aV|g6_GSMpA&ZPhVwT6bq4Wz~}5-Xpb&!KDQ z52t!|KbCS{{q13gJut|t3*4DauiD`(_81<1bqbh4$7ZJWn#Cp>oGN!oS$69RkjTdd zL$~3xHl2mu!;2{JXjl-KOFFg$!hl6$2xADoKBcmIPIoq4%1-3j&1@kZ^7HY1yyF<1 zROn2Ix5T~aE1gN;V0xj*8AtZ2E*O}ekeHq`J8|KeYkVLpomA=)!b=`B>fczL=GgJR z7Voy{mT!Y6TzK-B8_6zBGlvOVskAuY8TV5Y!nKv^A2c_iwYDRVI8iN@v{hiuscSWe zU~%nz8pQ{=jP3J z8F{eZ6KYQ<5FrdR-Hi3g?`i{Wjf2dHq;-ATLbA(-v@e7P6(aP&k=BHm`FI(D=MP%F z@;q_8n4g8lximBmw6IQ=qdLs$gjB||uOw;|RA^tZjRfFo&h{kHPkn6ck936PLc+lZ z@?B2%X{eFcm+_yO7#^gbe2z9lzS7&F@88wdXr_Kk4CmAEdU+nYb-fiL<&;lJSO;Ty z!)826H6lo)ff*KXPAox)A}iAk^ygbuH493o)XNak*lrknGdk0l-CB)x^!`rq7h1Q5 zcfLLEPu~6hl<&voPnh>)J$&i&Yd$vs@`p%HZI~etQgqk>DoId~sRH-AyBWfK+{!W% zCGEnhjrp?J)_F4M5)$+fB8;mER8-vXh=j7z?O;S|sD4Z#t{QSJH zk}L=;mxC?VUmpck+~_;3aUMcFZFQ_51d5!GX;`Y`SeF!A+g+_`_VsQ`QtVvq|@3vR$eK_MHvktg{7!?laYqwLS( zyZw16kK`ZcoaZDZ zP0}X#*#P!&0sU$bce+5EmPjmtQ_&1!$vo5=ggB>klp&k&EwFaapZ1qteCMd(NhJLz z!^*KQt&?}^_4m3GVX%i7L_=w>@xQtp2{4@!!5TWiuZf*yMW0o^h!E*KN!2@q-|Utz zId@DhQ4h7z9MfG34v=8LSx9GT{HlortB$Y+Eg`guGu1Jvd$13vAadctf<`KhzE%O^ zSQWg4fMl82P}ek-7GS{IlQVNscPWZG$ogZ7D1OpPB(E{OX$8L_Dr{_!gDD#ldEheu z2~LRskcb4SXrLi!0*HGgmm*BSz}ru95E4*Ml7b$iXJjguGACcM+a^K=sfk&U?UVpo zkc2kzEJi{3hvT>m^v&81G)FFFZkeH6G>C-8v7?exDD|xkSvkTP%Nmk|WkVDDe6N^a zJ|KRRLTwCU$g{lR`D;m777WA~469E_Qa4w^J2R(J^Lhv@fe-7T5(0`CGY<=9=%)n? z3p54^gGQwKb>hQQt5jMc^cje!S!Uwe-@{--*hn;`28d!5xv)~uP?I4=4Fxn5!6gkO zkwya25tY|i=rso+=&7Pzq!SiQ$+NwtQt_T7 zs1v_i37Z|$K!Np^BB?sG zRFcpog-XM*hZF&U6Du;(aoAS1hLoY8ElqN;s;r`oZK5RvEA5$*cEQqunu`<^)>0)w zLa|g(M63#$iw|#yG6BRYD9Hev3@q&ve*-h>yWqbTB7+&|pA3d4mO(`*K{tTl!dM0* zggUr|=o0aD&^go`CQnnmGtMe$%bD=XaM}&%^El=qy5fVegJwk7bx0wE@t3w#tf1lh zbdnD>4JNs~aM4IpO1c5m0sh!l#1d}?jU289jpO;()iIccCB+jYQfTp?P01i?NJ#}M zKm&(VfriMSy9Xc;-LQt}!C-=+CLb*TpXHE&36f5|bF+P$hk)WJy6UC0A0I>{6aGzA zM`Ax+>XL#GEZRsGt1}@whhzN?R!+K>NG%#Tzq;#w{mH}7k|fUJEuWk4US-i2f(04j z3EzwH9b_cgWl=;1a0)l`+av>?JZ|q$hWS1BlcZ8V1P`YA&Uww&9xR?5mY7@hbnsaq zY7Ar<_9_8@wx(ZkA}RnX|K!VF%3VBjue$~W0F+~01#u5z!8W= zZ50Vni6I@NVNJD&AUPqEsf05b043HNvf4;R0YEAX02l*>3<~yeY;t&2_nW%0#wqZ? zaY6yE8-uTn;Z!t4%}mq;Nde5=+HK2lsaPwkXsQU$z4&d_4~7>ZhW~Kq4j`zb0YO0q zb1qMIRY4J3Y<_T|wx1j#Pe;&&h8teytq#FfCJ0M85}}n261z!GNSmNHNSmP3Ca{LV zvAwXpY&t;$Ps+3B>Wt|YaC)bc!o9XVad=gM!6#u`y2!D3=CvJC`)E|&ZYOE6`K?}t z>mj_?R0cGR&R?k-hby3)$Hz@((oq-?M~L|F5=OZy3ty9jvFK3A)b4(Ez|M2Oi5Nh| zjXn!OR^2`)t|nfcrJ}9~O#qUG4vd3XU!|-qGqm?kCLmRes+fWp#yTucSeE)&5&A3d z`O2mwLpib^MuLQpgF>k!YS3zqmpB+(2~67Q@P!pATjbPMqB*->2#b3K5`DB#$9L`e zy?7MKh3|!B)DOt$P4c-NRxsCnh}cMwkRbyyCZ~0DFBBUOK}7|6O42l~^s6yV9#zhW zh}Sx0AKZVpL?if(AVFhj5C)yY_oZi0J^9o$h$|PA8^1>yN-dq{NQ;vRu)=QqGeurm zVk$ZkLwvHN{M>F*AksdG+c*KO>3W6iAcm7f3B!Qm)D|?c@o-pwi5_%> zBmP530L)ql?qH-yyAOi2;jh!mfRXL*6KFAP$;ErJojWlmQ1EmM=i0OMb8s;s6M%#* z2?;GPH9(O8Z^z?EK=BDA7Dzf(gdpzfTP$NsR;(@1b2ZHc5qfNobR6vA9|i^7(9?ETlV&~sw) zk5}O8;*FT{d-ccK;xS9A80ZL(DkZH1vQmKIQ#lo2Nkvhq{&buEcbo3^7HmhmC#u_a z8@Uo@&Y87@YW=)S%oh}ACCT3G5tq>h`g_2 z%1HW&AmDzPKW}Jm#2{gQ%wOSa?@P*fAQCWT54#bt47)6!FER8qNuW@c}L zvxEo`3BtIUL|J8HTPQ^sG+|aXvaprOWihzp7~n`k0Y@0+Z3?gy%F zfC~lyF)(ftFv1d2tfniNkil}wq?BnG2q_a3m@}4^0g(`Z8aCPyNTDf^q%B3ozyb(? z4hFKoAV>sJV-RB^s}a5C3`3W5@V%@IWI6Bp3Wh?5F0c?N z6`&GX3P{NTg7bzeFEx3K{iYu1wltqIT6w4~A!9@X#@>4Li zv1v*uiBzQ)NJD3niD7^czHOW&;bpWc;f)#A^lv#)AXjX<=^#o%(3V(QwwaZ;Gr)K8 zAp-k0Ng?3?kxHID=a@yI0y^r2LO~RO80%!Eu2xpZXtq7xJ1rVK0ApfG07(8nD)tWj zpYUb`+ii`eyE@SR@c!+|Cw3P(_UMh7YOig}ez-7Rm{glmg(%YRYm1;3tBh9_4!s;x zH}by*DxWVCm{8hve?y83IP=-e?tJchNTg7n^`|KPDhq*Uq#k7!nQJ1}gJlRO!R&nM zlgX53R)Wo7*Z8i$v$pzrJszJ|PEGD344zHBCE(RL!oHE2p}gm3q#ihx-EV7A9v-+4 z543w(Yu;gRdY(DA&vn>-OJUe|A$Gz-m;q^EK=@4>fnA^xcSw5~0S%xW0`wleVdvrqL z2seSl29-T6#!(n_`uFcACu;%wtfDXo1|*Q)+0F(SGu7+6E(nX*N-81A0F4MJ?I4dr z1qUEd1m{D{H#O1FYTZJB!oAc9OG@N4_E$ej8M%0IX&viqDnqe1z+GYWIk$~R!!F=n z_pbQ~OKTS^K!89j3p6>(;c}O({0=LEIL4GR1|HwS@6ZJS5q-JG!;dskk8NPOB zwVTzUmcdE%ehJb~7KXFc>uJ)aw{!e&HSTt0*{1wa_G{=H#P}UUnZc@zw(tXOsH7D} zanB7&uwtx8i3Av;kazo=NZ{iG-RctUwC6Pflt%>^MGV%|3=cHn*UuE~X0psCU8HD4 z@X{l?10W9O30EjVX1f_mC=8fjTCf+T#<8GS6PwW5+;0+?l9DPym8A+GK?1(v6R{pg z5eOiOauAY1mv=KMof?{|XS+ueysRKWb&ss%*VkIs9xsscS=ApI9dvZ_0=i}Ib`VUG zs8mq;*nOuSGKu=Xmi`wfp2~u(Iut{ondpl&9tqloX96NV+c;%Aw3ca4CW8U{{xXxz zneOg-q=%~KTp$4X8w<IpDHQK8v-_n;jZn+ei(S9}aMNKR-1EldM95A}B!Orp~UX zqE&Y&QjzNww?l1dn7^~NUFK9q7!nZ@w}D?^_teP@tJ3rwni$~QVZ+VXUDe&)-Q3;hKM}zI z0r>!o9S0|mY!qJKoslO#=peliU8GTf<`SHYXnQK~hOcG3t zN12&(GGTYLhP8?sl%!~(U8V?=Sp_kRDn^@f z<$N=p+Gp6jOx}rvKOXe4p@m@a^|-NP-A682+3eUm!p( z`uhwTBlD^S&E5yorORJGT3I11Mw_dF0#1V?7T9I){kGIrZ8z@3AXoo-f}vNI{`Qim zPhxyT1z3HP;D9V%7Z-{0bTs%QK?o$%?ob;7VXkBbdPQz_Apo$AI;wmj^n>cet0QMK zT2m;cY)8@g&XEQ2NhGk?xQaElcl*>IbQKaP`P~2pSded@Lea_y1h>F}09ASEGu*ZU+P~C_e?ZyV% zIRTt`VO7QP@5T%av=FS(`Yj}Zv;dn)2|xxTE(iqV5Qg{40$&Hjk^n%$sH74|0!DiB zU#o{hPlMya_A+2ogr`OGriXvTA9YxfSA5S` zz^SQq)K^%-l*kq5nff}GHPbo!zI1B@>&e~34#AmaQ5G>wRX}co2Al~sAba4(FANsU ztd)v4M_8oZh$(u~rG|e8Kgjx3yRt?sQktD15;3(yK7XyEqf|az>v*XZ{(UD1RW~2# zpT7$gvXb*#hgHM+HV=$lW1gf4Zbv4IVsrC4Ae4PSs>18&02a7{o_G*~hnL*e31bCG z_UKQ?Uz3GMABA8($DQ!_^@$A9LJXIi)ZEd1eH+)kwdzUNx3<~QC*M@bPZB~*t%(JI zghr@E3X>Iu8u!fMtlc@_^R>~P;q3ed+e%X?KtmFR1Q0TO93~P`0T44ILehl-K~fZn zLX;GXNKjBDz{Ckcl!6rjGDIvvJhJhUs`r-6A0eEisv47N2dYAR-3ADPCL}j3Mhc7k z{h)CXh#)7-C@9N-l%h!hb4lubAlSqN`Fr-wnqMpMyYD%%**!)K!rEJC_0J0}?|J`Vlb=r<~&?#1knEN5zD!hOhx-BET&}x&X*sp>~FVbtq7V z(z-cxY1qs`s+bIA1lk%Rsu~QqCykhdBe!j2Q>?-%F_J6@Rw*P|4I0j^3@BA3+^Z3Z z)dJ0)a%Ndjg35&&#Zlz|v6z5V77(lqmdFKUD-3eeq{ap`LDt0taZc$DCxepLPIZai z-0AVOHP@$Fnajok!0F(fD*)m{9+-2gO*Wz(y}8N!oatDz=e9+h*Q=PCl`A~DuAmx< zEDg3}?Ve$hy1?njJJ_nItlL1tZ9Nv1S=``rPP84Z5yF&`ShCgQK8C0tECtIxiHRZ)>1VH^Wb!mU!(Y?6B=^JD$1Y zeD|Bq_lbA99-^}qgxH0)B1*zG#gesB(uz?4#F}3rcrXtvCr)IrI<{|ADhUwS7nXdrBpM!SYiu|tIG<*la@<6!zs5F)Gt;a zy^isvNe(lnwbXW%2vmh(P@@`9)=5I`z2?@=*R5ugjE;eN*jZ}M=ykPMQjA4n_J$rQ zoXkT}TV42Qo<9g0(-2b_RK#s<5w?QBK~Yg!i6&Nx3M!D8 zD4@u;TLi*|OiGxLMk!JXOKhlWgtRgusUKX(yEns*)#>A|uo0joMHZqmESSQEHnQ44 zSqlRVqU<(TEy3-?a4f2uXmZg(){7g~W2mLmjzbY*%yU)Tl_g-?39NH;u-m$}ZtDof zQL$u*%CRn{=}ZD7Whs=*3DD(dR~`w0H*IWb12k(f7^DbHNLYvp>r~lhCJazTim0I# zagddZ2dWs74Wz9baU39|5M@YFZCuJI*+DL0P}Wd}F}0FZLSz9&B?jqCml6{aVqJ))$I$3eKBSawGrJAjDbth-H;M7B&?W~m{BZ{*$9_F#0EH86GpQDps7df;OwJ9rLqAi zJ4OW?U}I4EtwLQRae_M-8^<7jo3QbpPNQ=3mW~yMzhnkpaYzV&q5v3&avC!;6fCgK zFfxcVFtExZ5R*|C&-yMC7{QO|<>fh5Ng^t$0a_#rdzkKIRF0JHLxd_P2oQLrMNYy^ z8h3Z|qS~o8pMz(<5Zt%Tl6XQaorxAPhM+DEtRlfLyn~F=0DFroO{>t4^Xl&jBp;m- z2FiIg9ElZEG4=o#mc9pt%JC1&7yx8KcWw0K5b|tl2pr|~RC}xe7~`A6yVb(0yMx!g zsNHfmnz=b503hx7%73qm#o7Mf&0|1%nixb9O@!>M$MNo0*Bp#LS_6KkDf`z3`dCxk zI+=)9+^PYa*<^e_DzC-ix&LP{-L@x*e)Bk6_78SmQcxAgf7ah4U%Yx}6dZ!3HOV30 zdmr%n0)5dnR|?Jybvpb9sVl#c`+t3a#2_GlJt+;hyO72Y-_E-He4R{=<5yR|gGm$% zDtqZ_j>+Tvw*|l6Qq=boFKyUSKhJlu_r8XD9dB`iTAy-#X(dRaJu@gP@2G}@YyY}3 zjRWIBA;G}1H$eXJ+z$F#ki zCtJ6`IA$HZa>7vcWj!SQ6o;OJ_@(8C>|^lf)L%{ZA0?yPPlx(%8Kv;|q>%7%cT#mB z>FX2Vt)c2m>b{>ItO?)yT=sMSf4$EW_#M`P=ExsU0lGCO+IdVv_u+pJ#oz|{4s;>v zB|cgn@&xQ|_p%(gWwquR8)gIaKg)Ct)a@z5XwM9kc<`pR9yD6d?7|so6*!lrNKxDIbi5GC+JJ z4*3D~kb}>Unt%^GE6j(MIH69gs;_GRe#8pB+@ijc6#5uPohrN~UQVV0Jt#ojg7$y_ zC=h@r2q(^@5U)cl_@C!mKp=tu`3%U@2#xo+J;ZHnmZz@yZ_eIR6w&xsBe>&rEKVUm zE|#YS{B37Q1OXoZ0C%4};1piZb-lx3FqZ%@o(Jb2#r*c%Jm($W5hhrKB>+M~ASehZ zfQeKfl?aFl2aUK`NONHKgM$3`FAq7 zNzefRc&G@G=i4U$Eg%v{UW9^36Xcz)?sB3Mf-*JnFdJq6s+MeQ;K*^F`SIif3(HT6 zAK~}x<&JqC8Bzp@hBUt_f@KhFf8nddaft+hu^0s5p!tyVbN{sI6&9@eeD45byp){NvKI!OTYmxJ$jKwbgBaKPxj z0Jh%90XK+98N>yoSLqQ!#y{^mJq%Q(=VhimtC<%t2H;WvMLc2pboFT@K(PWs14K}h z-J$b`01v;_!p*e#o|V9XP?rKiCBOmlo#+R|^99Au+u7S>0U#em0VA6`UnJMS#P0k- zxzz;f+{wC~W$9oo^-6>ibWC zUp_aNTraXy`K1@~U<0^2>)77stUYl9xu)uIuLb!jb9)9vi$JurkU%yNj_J;_h;OXB zKty0aa7Gy7#-5yU&e|}$fIz*FCnm8K?BB0_?x7DZg|5vDSS0m=m;v)%*AJZe$L2go zy8SeKTnS1|F){pTy%kF0h z1X;~qkZ+m+6W!($XIIlu<2ZvZIz6|>JK0YIKjgyN*Ze**NH$(~>GarR z-4+YCTmS~Vgpx;zsnJ0*hjc=3hY%m_q~n{ry`i-LeYiUVso&3s|`Wq3Lb>d8|kvIza#v zS&RG(H~u7b!4QLrla_jq=U1KzAo1!^lYnDTc=p}4uK?RxXVDO2r^o~WQZ?i88wl(! z>3x|Z0Q^vAo7W6qguy?@c3^v+eV}_9C_WDGcHt2RvFx~JNF5mQ9b^w1-*~gW;``zb zyW4$eo+(u^3%we(^cfSS+?(>fCAJ$#7bE-&RvAe7BHd`Mlp+FFh2T zk`MxqAYYcs8^)P&6Fo)$KjQWJL1f{6)wi~pRrn~tkpSdFPz`sJPCYUJ09~2+xF2nD94!e95S8&nbfB+ca4N3$0p@xeh6oJJ4*m-{gNA1$@fwCa*7&pkMgaQ5~ zjR5?it6S|tb+OsqOV;OE5&TQs$g8OAqDAT1Bxw_g9s)DL%MG+8k!oj75Vxpob zF=CJuqeMa!(ohW(1k}YuQ87f*Mp#iqRd+rUm+pNB+J-C>KH6LuVknP@^1rRc+kAQZ zoJYSGnf(5D%)%gW5<|}2KD__7Vu#@%6GVa;>T$jLqkfzP$Vk07cvn~aEfJI`mu{{I z9+XlP@;e*gL*;Y7@3!j_9`pD={k!6`zFt`J@V#iYo6gR}(Uxo_L-*6DDUDFrIDUIM%w_NXXZJ+MpoGPrgx*k^zYMQq>0l#95v0Hb zNT2{G)~bO5A|hmI68Z~C>%=;K$1&b2q5U48$s)cXhyY{oyfE}<-$;Kx=N+3D4p_;fIA+E_^ACUplzT|08|06)bPp(?chQqf(fIj$=(~|d{-Mj&m|Mq_@P1v)s8AF zo_=UE;QKe+i;y1>Kup>dLI;8BL3>K*OS*Pn1*pkSo%^^eR}a)}z1+_@JUIBjv4D_q z=m_LT5=W(r%>I$ae!xoNPj12q8&5!jKp0BD!)&`EADucj#$KB1pGpeytFysz4m-H> zJzWfeAPS-oBZ%Z7C<3aZ0+OJpz=0$w`-|j{Z07V(J5Q?f=bGyG6XH)9XUW&S#fCrw ze1H%l4-fI!SWdsh4+pkr<#ZB1CS=csf=vNnhv)j|@V5L;)9e0*2zX(H)xfB*s{qWR zrDG~YRA~L#F*3?BR9J$7trbY%rGm+3NswhCNEl#2wM3}aR4rl_!dQ_4i7HCMEGt@z z5rBz%|J(frn)XnqFF;KwP}J?*4g?T)-*Y}4Pv?gnjlN(IDh5~N$L->BkjKiTs(_spag(3ZQ7l3?$Aq2?%B5+ z+0x-XbAy^8_{J@*od7 z)c%}0bp56m{T@x&eeH=JO(*3%sC+M!fCV;z2d?zqJ=y;>anF`O>E;3Fp;WO6pA_wx zmK2_;tzz4+~uiNFQLImJGA^?z#8Klny0>VHZsVGQP zH6TuS32oNlcK$_X5aylIH!g--47<;Kl*D{{U@bXh*gVk&!yj<@#S%WjtS7Ll*6XBsP6%o{wU?zz!w zm3-We!XiL=|3yu!-`ik7+&Db$u-Wl&cVI_dH2owziUK?I3;L)zQSd1@acdkaLMTL3 zRIE7#k`f}Y|1vq^Nwy&X5-NZWtdj-lRD<5&lsa0!<`^<+@ms#>TuOyX?yo|vF6$#$V5Cmd6ND1j68<7-0&-j0x;J*Ic9&AJd84ypb z&)4qve&>bX3ixOu03m=%1*M)JL3ytDPci%b-@)+n|I9s)as2*RQFD&j-IjOI`q&J8 zzHk5m0vT$7%nG80f8uDt$%C7jP+Fw~&=jKRN&a!RNf)=E0zmH&Dgny0il-xG>SBNc zA%6E5=O?he*HsWh^}jdgbgyPl#tINh9!J;tpTd{LFV67i^S!@<`K}5*a0ndfQ9brW z2d4^sZ@u@|>=x!Xfg5;E-O3@S(^)kmZT#%+@#9DQ*EW$T2{-xzKnFR}Dg`aP?*!H1 zNLrPeKS~|zfxdAlfC7OK1UXQ=22-H;$+rt*`)duXfCq)}X!(1tk46_plr3;2jBU^m zIM%XB16~orp*WNsU3zZQ&VlPl2h45nB|TrzcuRWfN?4+T`Y6z*X|BjT4`>i`$s5o6 zJEZUA^GI+&oVwlpFSh5E00ZQqFN1an4Q|~E_?|yg!{>aV&+^^~we!Pb(^|FCBH_(> z|491G9dc#=wabDBL;lcAoK$~mK>|=&2m>)9w^*mPKyg)Kyb-YD21#+i=u}DS)PYx{P}ro(g1M-tLqbZs^DB;p!Bl>HO8 zOjN&O!NuZWeC=0p27_Nb0LAXRY@PN}KBAbC0_^Wj`JuS)`zFtm417u}c(B*AUo}O? zP9coET&T)aFhk`2xA8JbBv%nOxIbYP4vEHSJLEk7an)$w*8I3nJLgtEH@F%2TzI~J zqasKr$UqSchPVvsg#}d=0bX>I2gn5O;J!fw5ThgG1=Yt*RjcT3C<`ID=B-1Hh|{cU zA^{N(-?iY|GhP6I2Pore@zMo$tyjR&EYo+OhH3~jSDN^@@GkUiNUpvmxl#*Qax zDdKoNp!0Tb;s;gKkv?YaZ; zmE_&a<0D|(^l+Q*&g?rJ$ojN`?Sr7XiNROBeVaV)GLV61z<;$7c3p->`JEM6#*V9Y)e7}PGI%CBUReghcfi{DmX(j@os|&-1n#L zz)y`D0)Y~Af(h*Z2>Oyprxg_)@ROj^cq|uS1=)4C{`HoXhBj8uBgj-%Ra{5=;f$CB z5Kk~2mxekK9y4HtdH5Uol=CuE=m2!m1G#YQNyVVo32Am+kY zP_vQ-%V_s4A_(YDLd0`th9|QMJB-D5gooZPW^r~BKrSIdfdC-1*u7=6xJSOr8f~$) zEEvz|^YuVCvwmF&flQkifI{w%yRw2}SNIIQ$*zM5)xh_@OQSdw``Tb_Ev`w`h96I$ z!n=xXoyQ*a_IsF{xqmbQ6oDo&V;BhzkSUX*oV(Xv!{&RR&mFf-``+V~BcEc;UXB^X zKf}l8{}QB7OC%{mX769Ah;l1h&{zD;RS-zl$~6%Hmczu}+bywnHrrby7Q*f|v{Tph zfBRshEA|ACrN*u+;Zdpg?xmh4xj<3Y-wOs->uH7;yipf>WMHF`TG#;v zi@Fm`CR?h#4FtfueZCL2@bgo9cwcP<{kJy5_WNe0=sia+7+=q3Jr1{Y6W_$jR z*SvU+4T$vPfNwD^XEBVd`gYa71ayG%0A&tBwxIPPWy%0L`uOR91TA;Qsi0q-D8#Kd zb?eXeS1))}MThm)*9s>219=`n2LtvC73;0d#Nq|ESI+)95*Zj$SYEVi$d3=>g$%@%Ijh?;uGr3r?}yOPLrv#4c6=pEl#n}Kw6 ze0cvdFFw0EVIOkfHFbgU%YWYtO+OH>VL=3s5XAuqBzJoJw=sZK);JHh8!9mwSKZa> zZ(0;`IT9isjEE!-5$VVksOjg36kXbo_v(-W03b?I`IQ(2a1uZl+h20VgeZs*U`FTZ z=TZ0of-3KRtRUg4zS9XE^A6yq_;I}Z5VN><*I4pAnKw3-7=P8L{X!+C*CV-G`V4n& z0W`mY=!2a!9xVi*19dBiclS+~)$Q?l@Q22C*=?=|z}tfGA}w=WgXV1Y863KIZjO&j zv(d%=Z=E>-E*Y<5Ie)a|P`v?&6 zllAtDJ3v7IRx{GLPgFWLP{Gl9dCpV2$)a>Q@BA%3WuDm_HSy&5j!DL~ya^xoTa!%a z-#huB9>3SWuszEnKo7@J2sy4J?iQa;Q*Z_)MboLczv=tQ0#D`HX=FX&^XEoy=@1ih zdx2i4lM;h}bI$%S$c3Eq9@gI72VtA+4tHbWZr(Y5v~!(LPc+~JfIorgA`$zd1m!P^ zx_!clXEi948!eO2oIAzlH{^1q_-&RW>H0poR6b@Hy~jE3!0E}A33=@Ycl*2q5&oY_ z4*F-la8oaEbChyq1Elf^45iFCEjNc931F-`bGkom+5gAlwmvY{)ZoZ^xtBm&hU9+@M?jUBlPF|}yQ zVe2v2idO_xq(n&rw3>1Le^2pgP{kXx+G9RHA0`|0wH68=7P;Ns`x~GAznJ^DcJKzI zpxhWp&)1YVosFf+v^z4byJkwX&L=(v#x-I{Q$r3RY881xvGrJZ?c~>NfeROs!m-K- zoDzauN$63cPxQXL1`m()d+*PY2@sp}QQQ6@yOVZ9mez|kEfyYef)}XOed`1ONr>sU zDboY4p|IL(aBpk(BkjJrw;WMV}=JQ z(a+BPlldB|&ZwGB+u*l?9Pc53y;(Y5GZ5V`G83JT&iVA_j!M0HEO=*!KjaxWb?EbL zxG6N5VB25`Gcx!NfPxe3u)?IFjTw(#jK~C#h-D$cCC?y4>UR4(hzA43v2ea@*qXL= zJXl15Q=`4#dkiPd!WTFPv7^H^rdEs!I#Xz^(NZfLJ#fjLOV}4O{>TB;7%7?A*rK9}ii(Pgii#XKXp}NR zDC0*VWpO(#2XiM+Z!7nG+uNO{3uD&ICs~aqe~QQ_Pe}|D_J*@>5;z!uvMupUNz*CI zAz+|_gZ%CV$O>NQAM=dC)@d`sC5<9rrKnk|0q|#+pgfGVH=2ls44| z$a4qN71I!P9YMa0P|#t zV*wDFA~(^BtHke4Pv!UQ_p{aHU|FESp!~`cISsMAs1cVx;r>lN--nf=G6>{vY{iwv zJQ@@sbs-}mI-?13h8W^GXJatI%tNX%5%rNRLkGsePbjSc=_u1)+=xC?D|7*L9(7I! zp@W1*23g6sLvlbaC*=H`y!)zWAOc zjt5;KDcybA`{7ZqJjd^7%FhrH$^g(0^b$9cBp#^}Yh#ZH03E0|tKFvgdu8FvohxNztMN=^|dc=F_D${FzF4>)2y7Lpi2 zj98@7C0N>0gI$^Ae;iU7{WTF%6FN7!d5MPS^`2zb(HG$VV@eH*MK4~)dHPPuI#%9o z5yC)FtcCQGz<7bqx{X&SbtCB)faGa)FY;~LcOlny{V_c>tTjL#o*|J{3ptWZ0uxD% zp@77HTi4&ke_CY8tmQLFGT~}9y07gBPRmuk{9{AG7(+ zTy5KMk2X3`g~;0e_kG2sNe4 z)4#*F&&$id&Yp_is90YQN1~{+#o+LFcs!Yw7)0TODz#iNkja4x6eby2d3h;03+2;D zYw&>+a~1N^h-grQk79yCAVf+sfjGb-V;;U)10FGf^7$W^%jGI8d$;oWJ9VeEy*OEM z9Rnf33LkNEztT@g$cH7wqe>%H5CDjQ5fM>Q3L9;xD!D;PSR+bUl(nT^oIa*r?!xDA zTd$1k?;u;U3CQJWihw{W(5TuS2!RkH0FMp2-1y@kTKLN<=7>dz-OE>m6mVPo;)I@j{j31&*mFCm%5| zDSJv#4X94$(mKUhz(k~rCc`B>#ieRB$oDXDqkzBPYggX`NAcu6eJ)BFk=%EG%d>TW znap6S)C#hNuia{@tx?xr*qE6M_!% z5nBQ}!d*jTKm%AMB)~2??^zaFHF<^k)kybJb#C+W($nw<=jZ3+NdRtETzuHcOw^xy z25*h4)L3#dU_-beSwyR$A&gKX*hLD-i)FeN{zwx?&-lm^A7LEE99^vxA3D*Yz(hPj z#rV5d3D?Z#iKnqp;l$T$0qftgiX>GeBB8a}kwym6^UmSpVC-;040-E2*KX?iFmR${Jf&#q$;BK(yOE-`wta!CeM zJH+TL9KuKmtX%_ktkAd@`lMCk{9hNF%-YgF$MdEdU$f_)+z}`a4O zbkmo1nscn5hnGpxrlEsProh@@n35c)rWMbH547t-=5GPF`HRGl(PQPNAJae_8%- z&(^%J$M*^Cn2L&F{BBx0`;=5=DaVfXJn!RggXHIGzYE7dk(51a_RsL?h8L;!e+JW8 z5eb5+esB;SuY-ud%~)(Rw~I&_-1nu!dap&}tUK>p@t^hgRw(cWhW=%IYVf!V+rad0 z`V&!K64oB#90VVpyWj!Z06eb+&^UIgPo9@Iv>yLj*S3c-G(Q@fhWGoQ!)dcz;z1xp zGn+0zKtMtO7F3%|=fD=Q$C#6vl05`K^m`e*ZdMM?*AP36*XQkQEKIB|NR6qLE}#*$ ziZCb=WPk%uo2BYr-T?GdP6MP60nPg12G{=VzA8#XT!2$uD?>oiK>%tfI3vqFc>VXds>TuDPTR0RjBDJ+Zt3vtsyy(p0D`MLYHdHy39c8gXypDi-uxx#5515mE?s8 z&l#ROuVA)Nq@@TXpKS;!`cV9Zy~tyWXT%CjOo+lY(9Qb!K*-d%^fT! zr}+6``vbN4areJeR-+5%kCm*+xCWymUbpt$tEYmh4GJIck*5Q6(}?t|zB5MmA!f#) z1l3Rt&f4Ff5Db60zobTr*PW_}0IMMHE{X%dC{zjVAkzTQIV)jccI$!O z55zx)Gljz9_->ltd^z82&PC7!$U*&2!zQsaC)0%8R-f@!Q6KF+j^dWDkI@VM1TG+EfiJGc|vA-KCkaEIXTPH+tpTmuAmcb8xXm*DR1e((dqChwi8ucqp| z_09bQ=Gp6quHLIx%YM4|?zMVL=-KeIi|f*A=;k!O6#|}?zJL6GVOR6L0J3FJ+YK3m zY+n9Z5(4}KlwgnzLa$>o=pe{F2=EAS2dL8Hq)kO>L`WqG4(tj%39nrB0sv@r_N(U3 z_8SjaoV_;m_xFAoc4N$-D*@68ESz~3y_WnA_1V>R%@^)r^DkL6jQJ#?DW3f*xekjC^M8ykyb5+1>nNvWNS-m;s5}%j?(H>;GEVyTI>1Li?7|~kAt%yo$#;1 zci@-7fb7H89}jGB+Yzz$}ftV5EttPXRlSz z`Pa`uavHesP946}t&_j}*FY`XX1|>11rGqA{T4@o#?s^&0QBEps1pDe6gjXiz}2he9Nmu(6OKQp~jDurb#l&r(uSnRAqV)0kf*tK>pG3%3ibD0)!L z^!ZW_W5-3BOhqL*%TrJqdAM~%n{{k0)3jpAn`A_;^CiNV(6m3)@Cf(0djfGobMq#?lvSK0|-%v5z zXH_EGGpIAv|EO^Re6v(hxoiMXMHv6LnSTZ_889+wrS1VX8EjIkT(E1XfKm8NsETF) z6nlO;Ez(K4BF3K}+VpflI<2B2QYL0;1{<_V22UxHP&zF=^@0=z1~fFZ1r*odY-uSi zbzW2pjvvEmMP^wGmm@N#5?w_L>Y-wIa6Z=zLh%FFT7m|)7%(>+C0Dmro$f1Pc@WW{7)VU_h55iU#R!I*v) z;#hs!ea{TeosEcyIA#Up^!XB$Sd0J$YA6XYX%kEnOfe{Nty(hoN$nIIYEwj64A~e= z%DhjFTT$J~@%?a)b0f0*a*s3Rw9n@?4T;M-4_}r5qdmYACjm#69m%n=M2Z^tOy3|? zT6eDyh_BFkPWI+CUA^bmhF)R|!}U!7fI6?@9j|Q?_RDMkAeGJcK0zcMTZ*I?=;rV$#l{NA7Uf#r;0Mf<|*a7d9y?myz_qa> zvM)yPqbD}i^CoN|bLuEirjZfmsB-KGVQ2llT&s4nI-2aK?5jmA?`@#)y2i>%hyd@q zQkV5mXSGX0X_Fuk4UwF}{?x^6Mwi{WBzNseAx|EfiISv&=-lR6+c)I^)|a%+43(0% zO-EYfRhrl4fUm4d$kvP_lgoVR+W76B66sVSne%$7ApY~9#d$}EMV`Kk#sFi_^;#a= zy$Gvxrui_|3Xwv`%TsH7>sxQ!D#mC?8^qCGZwasdFYh_zd&YB*@%h{Lx`#PA>VHi5 zKS&QJ|CC$yG5`Nj>Hkpv|G)L$jDW(e&%5n_QFVRW9(v!u z1G!OceX*IQ3OBD)B;t(>UJKwqW8DB*&|pFv;1nmyu7LgB#Al?6(^Q#mB67YsR(>FUYp$kCn4r90!9E4B_Y%tCuqsN%{X zE)G_68oVQdo(ldl(GZO{Es%W(=Nq>}f7LLdF*Kz#KaNr8DD7upkw(OXHS!qh4W;GE zfZ1N@Q8cqgii~X?YBX+Iny;*4U+kVfIWRMJC%at*6Q^XI4R;+I>SS{m=0ID~?*XRn z=ypGy*_l$Zfjq5^=-AN{wdJeg658C9eMH(>X@fVaFhR4RKE`K3)cBSFcL8~{F^1R> zPTuIBrJ0|mzJ1cv?if6l&u+P0u}jq2+IjpTCSX|`q&evn7hSdtGwK2Wb$HRYCE&NcB?tIu3K1~v=s||%a+y5`NKet zHBdQ<#MK6Y%QB;6v z3YLooX-J<13s{BFDrt`EZCPz-P5m<^#J+F1uupE7m^ze49B5h&b8|p3X@Qm`508j)m_k=}ecBP;5MzI#N$MSp8TBfzzjv zdQ3Tk&GcwSDmOx)7aT^toq82!DkTFwpvnL*^%DkP3zIPjj+~sOFH#E%u$3YP`x8zb zQ%wsoKN5n8iMdY+KV7+xt6=ojccZx8-H5igLNHHMU#l+i(4aUCWG__b(gt`f-!lke1Hh|s;O7wU!R z4alZ5SW$;fb5Wg%W7E&vHUt*haE(ypU-J9mHXX$h>r#u-!YlSwak)?T^#o8{UfRz# z$QSYWcz(%i>&q9a>Dm93`uU*m6N(1kDLxr?388xX zFIDMP4zp3!qv#;cWQ+R{w`St(HjiOb#0E#DsPdx5h?$W~uglZGs;W3Ewme0z1N}t@ zv}7K5*0~q$x5}TMkVTUw1r=`|v~e%7A_4T-xagvt;^49Dx1VC%z&2u?eO^AMWx}_1 ztgk2Ck7;2)xzMH{=bW{w2s2``030yE5)|aqjmk^{O74=Epnv6l-5(>JNUFuB@t;nJ zCo{Kly%A-(LYANEcb7f+&<1TTe8+!QP4#LJ?JNGt79D{NLAYWMm~68i2z^UPDNQzc zUCrD`2zOBquW$BUX`({IVu= z|H*Y8j~&=tpz5z}qZe`Urn%-#JOw#c8AzUd z-Y?C%;?U{F#dX;Qh$SIG!%!2HOXEl|z`_OfMZsf=%N9eaGwC2lQBc9l4yuO2MIuYd zex?*B$WII=fJKy+VKU)hK>R@oi%H4;Q=Ji3laih(5`%!rgbf}Mnu9}@3K|$0-7l?W zR{0P0ROC`xp|Du&p#eJPGphWf!MjakmY+4jd{ z{g0&~j!;=QWGzKR^lKu1Nz_oq4H7de`sfn51-_3uMqm#;X#(A0rnVAuvh2}Sv;5}?piX7 z$O8P$x5i$(hGB$%`Stkt?QY%*{iExp+p|xS`F$)don-Lj;>-oeP49;OOIpICoaA+% z!f@$hPqW}_pUNFCpE(oUrLpwV>0hNFrQpLXQvspVz zItGptQ0B#7rEHjLA@nC4|DFVD1cc=sgt#dQ+8;urFuT&b5HCP5>tvVzB+kt>CGQ)q zjr~^~m9#fC_%hvmE*MQZ6jho7!=A9hNL$0&ksjQ_^-IWF+EZYTTjg`@XHmSs!k2-W zP5Ll@U_MzyUR89QNd#RaL_X}G(0Silyq2UDKd1Q~vjwe@-rK{6P0%p6-+i&Gc+IdW zm$8x2BN2uHfW(VDsl8lvotHY()B0its?kpZyq8^OZtOWmN-SWLdbcYjqF_4V3ttg`4;pxE zojO{T)>sciFbdb_c@w(ymG#Qa({yciO7jjWNQiEvLvnn_MUl-fLPx2q@TNz){T?rw z^4ra2MC|C*XsM3Y5T;t(=F=2-M$^3yon@@h)Eh+U=+P|}WPDQOB0<7ThF2OzVJgLi z^ceVDI6QwPa;CFb+2SzZf>)#aJ!Mqmi_G^UEgLG$VYPg}^uRwOcTME_eaqbr4xvBkSlbNL zBMtTZqwP-YfkIC~tDMy$TP2xXurGei*P~zD>}||0+5a0l!WE_B)QJa9se{!zwGcIl zEIrp!bJ3C#BIH=@<0K-4%8EmAEnD*vyo@qd?iYnONvSB*E_}a?|5R_t%6Tov@}S=U?0sde$)D z1OB+RzAG;{lB|w}GuG+n1S$J%N|*1k0{Zb%zcJV`5@D@bu#VjiU-X~514)Dzc_=V&-#TPV5yCU^2~t!I@I-CG{k zxLzY)T?3liG;cWgosa`zFv6us)StQmiltoPdMIBNbo}^li4zL}9t^T&B`*0~h6kg^ zc1@sw))?+we!&DuzF$ILC)>fp7_0)ZjM7ivJPAk%>3e@bi+qcgt!0#@$kQ8LFjXBI zdcS&W&rmIfMkEhGBm;2VvHvKf{#dXaPh&A!8x0yS4nvY8BqYRekwF`Z1?)_aU!8=-8@xFCD{;y5l zwnsiH;lI7}l5460I!De{rQN^Q7jl~RD`Bm8P8;>QXF8&Aysx3mlH~EMjpW(NfS>DF ztxGMSFn|rnoJMpLy>o)xtqt9R8=R439n>U#-1+s?{dowsG3&nm!wKqzV}z*tNA${5~*-xe|#) z?sc@H@6ub`3+>U3n3tNd`%mb_z_E5j)8h3!^e%80sL4vv`*Ei0vJu~1zp|C!Qfe)? zS?fvv^3;dHjQU(;5YVl3m_T$}7DIsz<9Tq`UgKeHi`bp_Y?yc29O_Ky8$9;mHyC7X zSf)Jx*JS}3?jrbM>+XYPchuntn^@~WJ;yQPo#)j;6qW=nTB`a*93x^Hm+l(LDt*U()e-J;sctCHPoLElR|-Eyw>sF5p=Mpz<~kj!SBS7 z1JBp=&RL1Ek3l z?g({2O6s>#{{k%$48tr=jaZb9`;|c9TU0XaS0F=3$hcN>wLYx9zT>xeGqUNcWZF`v za4Rf*$yv_7BB#ok2-Ak7lmxV$jYA360Rx z&)budjB6_U98EX!1J5#qDfp=yug)i;#(zZ|kSPPxCZqd?X<@6%stHqO<=Jpzep|*e z*l)Q;g}Z6al^|MM3>srn!9y(lLRBZx;c22eWn&g3n}s%`Gdr+MGv$0-Ifz!2XQNP& zP8H-;sMAA8C;fin`zuDeG2Rbfo5t?lc@HfN7@DT<=|QsQ-1jo8FuAeV%Pz4G-`Mfy zaU>_wdsez|GhzN(2s>razt2c$exzoJL8ky5WG@QTXbXc%WCD;w_{_&_2eJWfO;2V08E6lO?J3@vI``dn_A=HNj((eF+8yss^OOd;q3EMnq5Q`r&i*r4L`>7fq*g$}aHO(9C_qzjQ zZdUyc9~+-9!_H*xOW^CRZWNQ_5mNnwNiT*AWNu*s{ll6SyJl~s|gs&@!iCWrfuXo=HzP@&~OXh^e+Ef)=F7M@5TLa@-ML(oa! z%jaEb7p^!R%h`&H8UF%VU0V{uYoPXe>`AZEF~F?t0*}jF%=WN0yiX-okh@gQ zz*mut>PL?OS=DL-g;2Io56zq)p3T@S>~7JiF)g$zY|d!c%hmL1zG?pQAgrP2ilKc} zEGkU6V%kpd3=j1u2WD)y6c0UuwAr1-)k0J?pU$-Q8p+gbF;BjVi0*3(v0tIMhzu;w zTK<^uB>BqZ>-Ziqv? z(SF?5b)mIC^aB{{Y84I#`Mt5Yx_5_G(jw>dbrV-KX<~~|{lbCQmn?(n_(8KwnFYDp zwAhSg1#%Pn^{-9H2yboq#gZHh9fnFNkZ!GSf>UM$rr`uy+K3e41STQ4TK;^)>^cLS z=J?%Uza}2`SaX75B)gF=bAoEqjJjArlB`K)Jq~L7{pBZe`G+ra*7n?B*m3E^0Vt^6 zAX!V_Y<{7(y3B1F#;VA4Z@%m<^s#NUPCZ)YZIB*{NQYU92sG(mAf6qQqE4$Tx56ef zc^K3&GkU8d^WTPd%UpFh(t~BveVYRFZcwvOdwbIO zpHK(qzxoB}N5{a^0iDREh)}u)J*G9`$UE6{?$pM$iO5Jsve+y9Psb?Dr@x59d71^12!N+?5Hq9)oPHCJ%-fqjkN$t$lOr z;Ew~w4o|S9ap+j&%C^LWP45WsOBl$BVGYf4H()>)P#1Vqv$X|R^zh#Yf}8@p3U(GF zkf+gD?5A7<-EBrhob;F4eletnbvrj9UGUSZ;yT%<@ zd1x=Ndw}N`6&`C1h?g@)yM$XG54aEuL(K$aPoC`d!fsdGAE}ZIuGZri^lef~%^dIX zsj&~|4Y{>J>f*3BQu(xkyH~koXsCMb)YjOD3$$@ul{8bhF7t!@_8wFViK_2=>38|? z%JzqTNIk5=(CyowOCEo!+aP!nkeX5^Vwux#F@**Q;E9roQ^gOM2Z}6*Z2W+UtJxNs zu0$KidPCnn_&$aIzP8l1`7(0()-(F@5qk6eGr0J_2~+&{CrpU0#O{pR~yciCF z&`RUn_}%bWlb&9bkDZ#$d$**pnp?RW_ zxt-$hzt)ziuUfr58m;!j+ttc%1}Dmb`U6}-sBxNl;-5GzFwt0nCR?=j4keA`Kds0c z`c0GF5Y9C8-=T^exx5@4Te$?OzM#s(avSRntLw`Gen@>ngq_`HT64MnJBYv`2i5A> zqPLJ^xy3b)8<*7LfPx212A-|uxN5s_aS?_J#~UD}64@8q^7q;c9cr^Bg)i{I0&!D= zSCY~pzO9gJ>ZKM_0e*iUaEFKYa)5ikq`HGFFMR}Jt7IPGzFzCswl0Xy1?eS1v_sQQc$;N?Q@s!ZnyU=j4FiP2Q7azBeGj_ ztc>lXD=OqMH5E9``!#Z4zU7ErWMTi(?80=lKwD}H z2#jf#lu#r$A|QU+8ut4eDC*H%doYhEEY}!Yl3q?w`KOnG;s+L-c=j22*<;7-dX9tV z(p^Htu4&0pJe(dSiOOqEc2Dw%*n&8wG@K6W^}EWe(GJl1`FNxAd?cc08+>*1zjN`w z$zg6iq=xS4;|n9Nq-XrV;)-tCdDj$Wb)>+!`C4l}b_XKOdqa#+EixRd+6&!w))QOh zFBnKLr!w*WycC8t0kzrln8R>!QdwCwPyC$2YUuILiMijp<)Fs&?5D-ysbX_*Ob~_y z2Q*mIz_Ri$&%?LHSfT)8QvarKbt2#Fy}kWUBsK5Q{zOo}|9-*ic4R3(m#NcdRl1k# z*aw5S-Zn_c2c7im?cD-O#000l!6ye zl@{9x@7olLpv~>iYDog z#W(FIcf!CQQ3MjQxr*t4lO}z;a-IV$W^t80{T597ChNG=RWm+01`1>iK1f$D;n#sq zC9aH%uUgVtM!bi$9m&dqxZHAYr5)$ANQHK^90$QxTB=uum7w6-j($Rp@=$KYV-AS{ zpw8cqcu)J<;>^E~1?tSN@qXKFJr4rBqAgK=NAFskv3X~H_BTgMZVrh^(CPL}5G`}N z49RV3zE_qP+s%tZ@RRQi^jDZKRSqe`tnmIM2_Yf^rN_%O-*A14|mqGsU($`jIWRS{hE9r6#DTd&C3!J{bhLk?r`8F9ylC z56h%~!Bg=F3-QFhn4nB6+N^ym!ul@@m?zBLk!@0oC@evDipuZ~BFu~y3pm?({YF{Z ziThR)gz>sX8wXS5I{wrVLjl=-FWsPQ5Ucj917(3=%Uf1nx zk&_-1gFiX_RBgihM8=xGVB>i(?GRIax2Bt|Q@ai@-R}O{A!vIeg+R)-hvu@iUpF-M z^7;pe?CiNCe&CY>ub?0uLh&9*VQ%)R;Cfc;*-8kJ`#0Y{6uL%RFP32Aa0Wg8q>p#r+yp)BnF@Bji8^<9R8H5tp}T=0QLa}PMTult zob^D$V5)Fa6GcV!Oq$runNR6eLuxH0EA;^s=+@{+DYi=s+B22WQc}2;s^Pz2aoTX* z!iF@pxmj}+pQ$lB+O@R%e#N%P(s%T7amNGeE9`=Xa-+d}NVF&wbDPR~)v}-GyC6vF zey#~&gSq{Z+n}zFZ^vNB!y|Yw_~Nr3UnqC#Cz0H6*TXllaFL=T03H+SYnOQo+bld zV6zVO+*uXT%f{JZ;!Ck>BM(PA3*%5lNJ@+r6T7}D!_tT@ERum5qZ*vOy+xkBu9j>>R$A^c@ zfz(33t&00w-&(-ReycIO=~kQR=?%1<13lL3@fr4kX09gu^~jw&U+d(Zx0-{i923e1 z(EUDO|2$5-7o9V+O*_h}c;Sb4qQ@lod*p9{jp3KWw||9~Qt29z4q@0{7bsMz3kG{9Rdo4Y~x&&HL zoyCxaE5C+wkf9>9uuy~r>dj9K(yI8n@D8)fR!8Bn?X5}2Ko<_lcnk~ zG2zQ-aUstvF0Sf086$-pGj9jQ-%f2e17kPg>b~n!>ktCm#_$yGWA$OEaAf4qMcS-u zNu{ZN!2SsmHeTCp=GToeml;%5;Z!=<=sg`XIv+Z6F#`A*NB`a2X;b!}rnjwrWxRkr zS$fHfV`>8TC5a)*2D#C3EPB!st<<$hM8A^KdCwFjE9a4lvJ%>9L5@$S;qVmhfA{d! z;?Y@C@(8eyOQflTGg~9dg~< ziB1M~tvfYpCbp*J)bhb%cAnmLYga$+%^%5$q_xPm>Bfm*a zh}Kdw6_kU(Kb^SkVQT8yL7k;~Qq%gd_I<#mhA5bw8&2`>6?_)`*e_%r+x$NQ-sR2k z5bosOT;WyPFg;urd!i~iGycaa0-i@E+{QDfrL?TnO+z-rfdwp>@pQ!Cco*}Ou3Nj* zP4Rud<)KXTS{|bemAu=B`Kf3RV>G9@HFld)vpK!f+*q}s;iw7^G$OWmBGZ+`V%6xr z{%m?TIN?nrcs6$Lvg9MtpfAqXqNQ*0)o+Fd42r058zqY%eW}+43JghPiCtg)Z~=Wi zQevLlpK59*is-)@-rNI1Fu{^nj+3LdUoLsqm?ON{RudY&v-EokHSc+QfS>$7QygfK z%EEpB)X7J&JyBHpx#M^J&5S6zvv%JjH}Y_(IG@^TsI4xG5myqikUPs3eicK6nR;Qm zsT`c{xU=>0a+6ZW`DDL`coX!(mQ~b_l!m*`+?;vV8d0Q}F1?Vhfd45CB2?e;nG*}d zuWIt_&bNDrT$~Xw!q@;sK3s)dPA6Qr&NBaP-ANru&GH^K&4(^);5$<5vJ2SiueBth z;;X}3tDh*(G6Zs*@t*fx_MM!_-1qAJ^WsNXBvFj;+E$+_xatY=@+R!(xog8D{0LPh zAO?JIySun>AMQGNOd_g7PM-Y@Yckz__{Q)SKz4tRkIsa>`yh#NO>sJ+g07-G%@UX^ zc(Y4D7P>$%Ta`y?O`SkyV9 zY2>?xoZ5h72`*OV7AW68yLM5NFw2MxQ@EHPbpun4C)p}wg0nqYA$vJPa*CokEg7!9g2`OHBcTnsl82$S7b-BmgA5{v4ew zU+JyY)<2$0>ffXO^3urr6#Ki=Z_9Vh>-HKEzVBS(g0XuyOuE=0!d2@6M6^GGU*NR) z)T0H+>2eRHRFM|`O5u+e4GDbTEhG=W3&z2)pno*Hy}7=>yL|NHeI%mhE?FP1S#N9l z`VchX?e(x!d7EOszB=f#SyR&*4@%iDRC=b%QMNt!%OBFWUmm%gV=N-%FZBA_>2*gl zXgp%{Y2N*#42_qa$}GpXwL@W)GkjZlDX^@QIbcg)#k|^tV_J|xwm~g~?Y^8_1z|2V zSMc)u@N^UD0s3&%%5{5cYO8it#K(?$Hw(to9%y<$WcrqHyx!e;Dg1IA_X6&?q7Uf{ zRWtK>?wn8bi{Bav)UAl1-Vs7HaV-29v{;Fjiza)ayn9clF#vCnFVvs0t<1j*?g#rbzYGqLOK+;l-OOyD)Mk>^dCZExYWCE zkDN+ykQ+sfeHnJWIR;SGj13PaZ;?{r@Kde1OO>@9f5%8?3+IH%$=80M!m(wqMyA^k zyfioQ6{`^p@$hveG? zy19LpHXD(wXpLaEV0jU$Z@R_Gv7V2bO!(zR*7uapN{F^1{$>uzBa;j5bXEDjDcB9a#{B*^^pi{_Z?Sdd!K(~*YQ7FD zo_{mKg%AU638z=xGPw{Td+}QHKFMY`lCrzwfa(-eBEX&1hUZTqr;Z&##b9dzmbMt* zmD~xP-nYcft=2OI+BrvP$r%qb#>rL~N>TR8rtJ2(0Bdj84V(OHm<;tH*6-F{&Z!=I zaExKf}{&5Emv`Xo&_Sul=sDaypP z)v6WFl~Zxx0BHLF$%0h5kqLUc?eOfSoW#Cg1#H5ahFqt}t@NJ;6>iU6|GJ$Y1Z;t= zJIGZU{?W4g(k~WzIa!CrX_}o~4TE^%3y8WQIs<-M$-XI-8_miQ8D>%g(_6#G#@fq4 zZs-*M$D)iP+YfDE63b0UDNjqyicWA3SX3<=%9Pj*&t=Ni{$vp$vQKsl3uoz%1}v6b z+lfwshRz8My@fgoB?+y+ZnZKI$!~@_y&(AYY}LsApcHXlw;35jIXN{62L@_k+gIa~ ze0uwf>H&!|t~Ycnj~CnEyQ0zkRq!0rgiMkG?(;)AT(Z?ge5`fl6?5&fefQqkjd!$- z&zEWyJL^)jfKR_t}9Iz0U=zclL3ZOXNrte_&h~4|DSu;uLBXz)~tE8ocAWC@>k&4 z&E3I}Q7>En{ey??oLocxL6+Q$k$P8qsTf`-qqj6+&vU0I)KR;gQN#4pBtMf{p%g`Hy5Z1ZnVVCUnuA;kMCoekvths&3eL_jp&vzIw! zi#^SPbD0@?@@YHg{=j4if*WqMA!6CWB6n^jL9#i$AMa5Yu9U?WuOv@-={K(n>cJE% zMboSYUF1z(+GA<#%06~lU)8_#@}!5GwRv|s7oX!0c86hBK;LhvPZ>T1&8yg})faTC z!Pw$6x#v0QnCV;3I>%uWO=XfifO5_H4|Q10p${({66cw zSURH;P@}zMB>_)l=zj25iizWppzCZEldu0WK)JjQCI=J8_^ExE0z0Ue=3$98T|C_mSwojaQP)M70@AfYTy znqw-}vT;q*k^)&hiKSRx|LC`5>4dH>>|ZmBCN7T+aE*y#PE6;={KMaE{qq3l|G^3- zPhS}QPZ%&Upw2ITGk>1{PM*k+h*LnHY;B!j zABR?>!qU)Eqv|tWD?Arg^?Vc!9z0^Xl}zCw7~NkP$DnIxVM8l@voa5BAD>!5K2!0G z^_$C-(%~_xRa$4~&fwnlTyZB*aZ52mo@i%KHKakAO@foLxyiP6c=*|#rD7fM{)G_< z`-!YXeR^w7r1}F&)HSxf^6|Z5|9fFxYF=gp{qe6v{+)8T0NUZ|B%_`h>EXco1?5fA z&L)L-<&Wx;qwS??=bB4T*PXzK&P_veOJiemb4xK9bvRXAMbxn#jCNp1l~&7Xs*A&d zu0zzNjH+f3SQ@sCp0eokXOighv|sK}iK4;5geiSXJVe~dl~s&(rAr9OA&6sz5d#nr zp^snIN5|^}8MU7mbJGVd=8|!hzkTHx_BjzX81!RyelpTXU>wdoEfZ0frJ}|*lU{Ll z4kikn9O9>H2(Gc;ZUZ~6+g+|Z-p{u=4Nzl9m+$9MZG$)o1eEW9I^m_*T~pNyulPCM zvn-s$vUCJRKc}z#m<~?vyp~G7on~!2Nlq(Vi%Q-H{PMuGT;zwYG2NC4+&JHkgMe+% zCC@xyt0ENF&K54wSuQ3wckSjbw#Uz=FsL%E=W}_N4Sf>DLbJJl-x0MUz0sjVUko}J z{H#yBqB3}>rEPEe>;`KpMBWVBOHtjNs?m6qPK+kX;VT<)X|Busl#S zC#8E-{-U|Pk^P}io2fi4-XjANwv6a&9sK>sy(1 z0R4oqF)Uh$OA;*dG?+v&_Acf)|Bgls^tc~99H(-}7Vi{OS!bLs7smV}!;GR6MnfyP zUUQ6O`1Dr0eezNN_+9t)!@(LP7n$y`_k%h`(m6m%@y?E3y~M+-Ys+a?8b|H_5v>0v zZ15ki{r{3?=w9>$?*^b2WqD&@i6<1_?p`-3E6$kP;e4sr(tU3q0O_k$KtfSv~D4yV@KawbK z4HHzZ%3)q<;P>O~Z-`LzLF>3u2>${rPzh+7+EVbcEOPo$At`4bT;=m+8l0Y5!4qa! zZ1?uL6`wYGh^_Th9x&9<3dZ=NHRa zCj)TDZFJ>k{%|j4=55S_P4AArVi{rE>EO(Bqqn;aeS)<~RB5u!R^x&ywxB8F#FuCR z>)S{_?wWD!#Zvz59HEXrz@3c%=eJg`BXCoFTzZ^m``E#^b+>>fko$a$G@DFc{J3jX zeW~5&uG7RF3V8pKS^d@YszaQT*UuCkkVI61urKwYQHGu+j%@+d#i)Z9{ zc>!xkU8^0wJGOSjm*m;b*EW@j`G1jcAsjuf-h3wg5>eK~)}))B>Og9mE(+GjgY zupt)b3VJf8Tbp~4YtWq(vKP3-DA0YkI*on&&TPezI_Gq$Ybu4|1ZYyzaGpM3{3%$O zm>`yj6DL{O^L3<-j$((I9yvNBVK{ZM7Avi8%AHg<5bj#zofXj#WISb6J}TTt6Qe8g z*=pZKE{6-AAwsL2NNhckrgxVo2i$@`b<|gsJ$&W|-#KXH0BbWjW zoiX^meLi=y>%FILFOc&8MfLy1`Ts3JliyNf_5Nk|4gY8m%fSJW{HOC}82T9WfZ=cM z9>F$tzmUm6gURP_tk{vBWmd{(&=ub%;6Zj3B(?o*}iXd@GTZ8v+= zH*F?%clfl>IuVa$;a>$Kr(TLi&;6IBIYC7<5Gpb((+4CoxTLeAX=r4Z{ ztUyDU_HBv38bso91`h?Yb7skT+C|^b!|1m)@r#%KPRLs#OVEn*sBFD)>d{bg=d=I5 z{hIgX-1ES?t|SMpPvv1rr&nmIKfF@F>~ND?F)R#=2;(dVB$DlqZEgcpztK#Q*4XEy ziZ<6aV@r|`{v^rB)-766u;PK4pCWydPcKIuLKyLpSNP%XzXUMe@i}hm94Q+CKV$um z*viZVfa-C5o!x<8phh*o4`MrCya#dS@a(6?0P(QL<4GGd?-_||CnIo22Y2WC3E*u^ zO%!O&W|d%2{bBq%EE%6b@T|azIlKCp%>Jkj_*>G9P#7Q0`>EPelznpa4l$S;(A4r& z$7So<#hBm<`p^pzk8UJ1#ETESv-j?ykYz-3buf-7Pr7;I4t- z?(XjH8r)q67~EY3hyC_`FZQB;LHE<$b?UsQI`FoO=O+s^j z2R!gm-pS7om@1aa9V0MWnsn{lSAgaBx%)D0V_+{8(g>CL4O-gsn?FX0kf*ZQyqiwSum1lPMyI!_KF(mF5hpR8 z&PdnUwGblnRhLyii2ovC%f2|r{`H2;KF%vt)0B~6oBqjctLd+ILN^LKuBlvC#zR2e zW`12+{(2}W%o-CgZn0N0kaNn1b!d4ClO=zOXY zw(~nIa?3LN!QE4RTVKzTk9xu_nSS&Z7gMF#w-f%6$!A`ZARkq;J;xwtAIYQL$M-zm z3G28&aNk=*)xQNwBO_QUeubCF7E}4|Ts{6}UDF<&Qd*M5+{6`~d`<$5OAKl7sVla& z-R{GV+}IQ=4Eh^9t*pn#MF$yjUxurT4Fl~mNbi52{{PQON=a!hs!grRk3cA3{P15B zDQr~~B++lUFGwxnh~hs9ZAa$WH88A44mQs-HIV1e?EAfIbLhydQ(Q-2V}?yO(bSoR z-xrD}D;g$`xLKTiUs1}PZ3EQ58|n+380wqBe^iyv4SY{gin?>3e!VDp1%l5v1ME^> z`9$PN+ugjy*_x+|j|^gqpWZ$@OCk*gOl%|f3^yBBZ0mA1V>eRj%&Z8A-B7_frsmG$ zM>${Gn+xr-NA}vhvlAuPm8d~yo;&oQ7@YQ*ucHyBl8t4v!M_hyjUz^m4v32((-}1ELZxIa&8txBy~ z0G_Hc9P+ZJMYnzpV?`d1atq?hs2qr;onnH4idvV{8<44xRcdb-T) zt}Lq1_DS%}qWkq=iO`7G5m0MF)qOtZ+qzl_&F@B|xw|BI_N_}ngk}~i`haF*#%}8t zkg)Sv=1No)X18Z$_Oq8r&tcvWIJi`Z#BD+@f_6JVX!i8Y(6(Hmw{hX#UC5k`7YjO{ zI{c?aMct!pcsN;|)?q*%(Gql?fLm(+W7Caw`N-w-hJMk&H+V8MnJ@7W$p9cIxA^Gj z;mwz&@v_AuhhI(r;)Q- zaVxai3LLU;A{z%6G;)!>|JhL&hDg-6o1iRcW7C`GWS3}CvY}Gj^{Cbcd^*Q zg04O8H?^^NcEX6?o-Lt?QAJBWxc#jgtq71f8oRQ8O_k^N`f>BKFEu8QyJ9ylKX0pG zP1&&;4?;_D@&Wc{uFi{`P|J}fhXSFkN_mz(9#yo?2p^U+To`HB1EHgzc5Toxq(d^p z-6_9aSO_5PDVV@U?|D>ANBRV{UE9H?S^kL5^nC%)RhO?GJBdq!!)?0uVt6NShG6Rk z)}q4%Tma=54xVtz&H_eHuKyq|4?c{JE4r?Z3s82MtlVS{TuW(Vi-AF?RezfO&s#eW z>!W}@orw0|OQ8G`G4Mb?kIb^`xd^uky?UO&z5yHYCHQ!7l&nZognFLFToh(>4_rml zhn6~e)ptE-vXRDPWanJ`=-aE@Zl7G8*}unpw+LKqoH6yR6?njK*9!f%J2x}4&Dali zPQ5rk470a>hZwU@Y*GdcA?6$nKH)ih*mHnqEFa2|Z4hi)7=L^V!J!XsY7tnk6u!XI zN<@G|Lyf3LE>*7-`=YsT;pw4M@R8l)?z3p0_D>o^I)O+m?<3VR;6xj3Ob!gbzpzvT z11vzp?^*JhkfWhvUVW*?tAV@6bm%)r+|E1Ep)9_>PBd*@^@M=7=G6JYp%l}4d+Tw+ z`sf1rj&VO-=r~?DwxM8Xw5`=$0*T+WD9dxLUBqb`RmdC|GN#~kw^QQ2+j-niB4KkaA(2A!FV4-rYp`<7?4qGpfXO1oK+-LUp>jl2H?VT0`79P~&o&r&?J zOiif2Q`Qr0Hg&3U-)`kd(}iyHh7eCp9Hco6{KvTOu*>V)LieBVlnwt4ixNl>;EBf` za6UPyLVi7qT%Qr<;gVfov&|m31Tg@=`$X>>vYAjHpx1L#3Pp{ zt{R2n;4;Ont_h8^qmY4=3Reg>tljEIlq|?u2S^moZ*Ajx{kDX%vv>%5fz%|^7d81o zR+~GmKblJ^y+}3xMLJv@c!Y#7?UkOMbMim8@YwN%JJ~!~^#jWJ$fYgs(y-P~R1QX3 zR|ED|VzjunV>)+J&QEKl-tN^-&I}G6K`5N8zhea#zmw}|_SbK`f-gtrDol75v59`K-t4M&^C@*S8YW)4v^l2fbF07S-T2=te!xW7ER;Dg< zTE>9R&=JDvYB{=P=e1YrWb~*JvHeh{tq`%M-JD!3MoEy|Sw~Ch7ssg35d&wie~k|Z z1v=byj;SjEVULm+q#)%Y>ddiUc(_k|OT(tuENhxdFv|-+`C&qzrxp3qge7ZJwucBw z?X^H6q4E+Gw5tSm%GmTb4)QHBap9~#c_a@J|A~HH8IVAh6)3{YahmJ0xH1MzqdYtX; zdCx?xNPQsyS0f>5?5LAhC~gt6eBj0|b&HJ1Q7&<*)=oC03Dk-#WsSZXZVbM5m7Vwj zk;&rVp;xvlSqN%LP?xo6k`q0I=A`+WRpIfOm{Hn$t*dTX-^+$m`0+97FotIAqmV>$ z-g%8bb%54N>+7~nR&-;RwwEW{LXW_7RlM>&)+yJ@#;S^^Dx$P9 z9Sj5`emJ>obx#OCF;(_@{k8Dh#P@PWXw>Xeynl&|uX`82Fd<$-CP{N^pR;)0H4^gC z1A1T92}TDy-7)r9EByE5>l7$329+iHs*S7SyU}ace2{|Fdo8@qXPh1u23YlHjI+!o za7s|3^SBN~cb5xx^t3e@tC)~}v;%K+?uC7pWj#9epLiZGB8i1&5DVe;^o&+_i*RVE zwqMV+lbG9;ZA!Tk!nE~-GE-`BoL^!q0}@@Iggi_ds&eNn3IhneAgr2w+IY0f72nr6 zB|{(;?tL~kcGarZB?nFPn`G^ytith;>g?ym4TH@(FlgjVh zhYcbhLMFMZYo}NDRRc@NObNgTb=#@{_VwOO=Cusrn?=2D*xLLns<^jB`DB+L-6^3ImWwA6$1NW8 z?4T~}MYV}Kb%B?EBR&m5G&?olV-n4;9-TI1C`o6Zi(%19&MyV)Freonf_Hq#hjGg0 z*`#SmOVBuVh0fjX3m$V-Iu@!KW4Msg^59|PD!w|$XKr=UwX>wC&=Hv={brioK4scK ze{J50%H|3iW`z2hYl)q5+J=at$8o${g47hKlxfviwaFP0^i}1oX1V{lLM_(ZUwp9Y zu*A_IJT3O$yWVb28f25@8!s^u$H5!nqmUP~)!zCuIBR)q+tjq^6<2BDZ6?QC|AS+x z*Yzf%^Wh@bg<2^B6uPpQ<8O0tD+JeO^rtiOTS!@vV(eWaG9*)n)PSJy;`(-&)6sj+ zchrD)@Zk?t7txP?9U~^a=)Wqgs*CmjoqZValH!5env!!kHJ!SL`!nuK)_bN|#+)v9 zu2P5+BwSFxY^C}bEFQFS~WYv(X;BhH#gBJCq^5C(6s1# z5_43bjZ~e)ZqORVcI;z+3#b|7PkT9XP!^05Z){dONC$1ip1w+euaG)s7|QU)qq9o} za4ZQ$R(qL2KiPnUns&%*TD`2N2_>55htff>%dwjAP!PpQ=pX%O67#Q9M-Tppg;i)X zR_Y3`@R`L8yWLuY05$>BfvbD*uXutfS%hW$8fOFRwJL%`IBNe;B|%;!rORGi>A>z) zT*;t;kcV)O_Z?&>y!g#4bhj%eGw9f3ks8x!sgo4Cj>kGuh*E5=Z>gN{rsw0Uw+8^X zq5RTAuW(D*!2`fG*=(tWCJe!ZGN4@RMDtmY9&xT4s*BS9O z1JUtbRJPYE?JM^Ki_qGKB8*1cQTnT+;F~rJq-~1wEu0IgAvxfMA!{iopf+`+Q0cN! z5$elhvxX91ACruIU2OaxMm?*rB`Fe}P^*9_6G@bbt2I87Yme`RR@V4`+SiY`tFHpy zC|Tbi&g8Hpk&s7$IA@fT>~j`}jgQvxUFo){zoymJAPziu0{J~C97jt9_Fo6m0p_hP z@V=tM^AjlqA%~0%kFE18X%aVD7ItV_}s@ZHA7Wef}i$ZN3` zG&KH?rDVHR>wT!HRB5V?MV5zWO25$*=J@SOM?9kpp)svE;@#h$)jY?%1a+x2*8K9b za|q)>{Xqk~^e*gw@X&jJ`dPaY7eIiFRSrYg(7`1;LKkv5{7s>cl}M*Ep6*#{wPQet zDd^_=!d-9E6^;S0*Sg?C1Z90Nwmk$lCNqqB0N+;S>zLgN7v-W0K1^;}(kSEGr22<* zhkYjhiH^Ht@9Z2B?18UuSYD}=n-}a1sf6=4YW&EaID$31_()CN7dxyM*IRj*BH}|C z1qQAJ9HPpkOibqbb4RCjR?f%7v?#Jn{$;WWv?vV;>|)F~4IFjbG=>>M@(-v>G7Kft zVN~;VxWR{?>{GS!pXj@vEDhbIx9L{F5eQT_6_l*qlBN|uJqceOl}}vJRhkU^Vo6ne z4{JNCUjF9pveJ^JI&W6$Ivn-lE!CT#25wJ?chIi4KawB37uTOw#Y>&!@b2`Lf_VIIeouNpx~zv_$?r4M?*n>W36{} zfy%I`q(H-_KPK3oXK^qocegf!hP?sF+9gqrx5HYki9sLMf#RLC^}C@z_j^~JQm2tNBa_O|wuyuCRa^wQW60z}Ql~O#StteWFWZiB8O#tiw?hu|yFl~8AG)wP-YpNn4i}0nSZMU)sn}7bF7tQa zXdvAK8|m**;3G>Hsxa|3;CPFw@QsOK2V134TjsipVdQl};_VU0>oz4>lrJ_u*VnSN zh%fpguw2mbb;HU=piAySAuvNmU14+S+A@t}C>D$la?K>JG<4uvLqZmHlP64w4TbLa z>MbAEnMH=tqxgZMkBA;O+}ec^8Jdyp13-344AcK1MMOo5M>*WLiZscYge1{7?DLBx zc!rfr0oIwxYLOT-X@QyNq+ykXI&6d`RQPI%A3X1yLSo;Q-`%qyBB_7Zr4gnSN#}bI ze#mwCuigSf|X5hsYMfdV)E%cfyoOI}; z*I@57Ycu4kwnHL;jBr8oN6vqHd4e7p!fWyr`t+_>3J~IcN3Q0%6@EB6?vz56qCKfk zqd}LhLno}NvaBz028~FQB{km`i>Wq*ipU+jQEO&LGxhkl^PkJjiX7Iqh&@5P> z357agc{d-P;p`qfG1xpg{qt1&gke? zg!R9oKc1|hhd-j%P9Dn37#T8AztMkURrm@VFItYPhG>uO|3}!f2+|;KR&m&9zIzz1 znLi|QzI}@bLS8?Ryly(fw!`~peVRPRq@rw`ZaUJArN}k63rhj_$4h5cYu7Bkkt1Ri zn;6FlR#3(8n`!jqAWF%1W~%`+HILz5(SXyds8k{i@Y@C5jiri54A~2F z&zj40MfXpIbr%gZP4sTn{Q|4_U;HfhJM}eMNkNef%N^xAPgG(a?1cq=ce>(8@sT@T zT$q|`8d6vUMMencA29L+&PPXSz8iiZweXxNTYq09KW|X#VjH$d=%oZio@D63JTH@% z@{bGhU3TGk4)fMaWaFgeuXeo6tVENbgw@yN*mB4vf2^v2R9)K(RV>mhTcg-Muy!u| z(5d5@?z5iJL7WhQLMVjjmqD2B`nQ_({4si=1~XzYN&T%-dM7KG=M)IE!lYp1bb0;0W#WH{|qwv!}TLOGmONH{gV57r`;1^lI z{w3QStqk5U+?od`^?_r={`!vC1Ga0 zw(VOmIA<$E=rE0PAyWJfJXgk0+7MomI%9YIm&(2pskumisZqpg}0{jJ|@TAzia!#&W$e z|1K5&a5y%NyMuZI8Qt}gH5d;M9`i33d{nwv;`cFh;(s7~M$JUL7sX49s=rk6GGu_? zCja^?QWcc@w4+>6@CUw-{s_XMh=I#bx6BAHo^`a)_wT3; ze}3NYu~Lrmv0dx~$}yU4y2c&|tOvgInp${ne(SCdLgLMtoE9+o ziz}?YOv+eC^{JV=`g5)`BdC#)EgvQ?p#9p4%e@+=cdy_iFUI9(CRV*gDh`%)gL1}? z%4;rC|B=?SS|$9-$!d~jJ_vqy)UzW^?Ky~73To%QwDz0#bndSs$?rsLKaR}KJs(^| z{mj6-Ax9|R@?&GiaYtwLZf|?kO30sLM{EI|sFatyB7_5pzkPCbM0BN=J0;mD>do9t zplv{RY{C|su`Skpf1sk+?J0E7WAtU3;y3rc5kYtt8xQZ!Gc{H{dliSNLg}Ga;Ya=O z{9%{p(HZ>0zuspW&}O{!F&lnbN6``3JE&kX9bu`K3yjuogN)o09LIT zUjVk~4i(6iV8F0%mYyBqZM=BKOn;-(BEn>;6ta1K;p%W2y_7etT>0bQ;ACZkSqSF> zlT8v++3(~(b^ky==T|cIaPp(=22#cnR(HjdH8ctLpg(OhLO$1emW4QLeHM%f{7LJj)H!fvud1o2zy$lWC9q$Nz50~Y=FBvp2Z>9(5a0qW$NZzB)lJV*i}%=J zDwO>}!p}64M71EG%#^d;|EW$TT;q?>vn2at3GFJ;!Gk1J)L*q!`d?Cxg`5-4FFa}q zaD}5(@S>8YHC5Gr%Acb7mFIpk^-O9Fo!@acj=mG}ot)Ii`V#x{`EGT6Fn3{32t@n% zG-6FnTfpi0vgMeYamdf1p6>lb$HY!UwC!eCRJbmj0yi5w9)vB}Pr3Pntb0;F{|gbp zbCCzbHLW!ZX868U`VxSKW4cz&ECSu$o+AB|7y(#1sl(N^3Az0Jr5tO{&3E&SN{EOg zy<#_9mBacg=HLgl*B-*{H}2ZdV!c5p?UT79xmR1%x3*r^!CAAQmwv}q_gwZD=Y!lR z=N_I%Ru2-Lb*UB5u48%P4O8v{5J+UuWwict{a2}sp~#BRq#CN*%doqx3gtJVwQ$f@ zEXhj7K@7HVL^*8cTHB7nyd2?}Nmk=%SdsqZL4Z2{&^VrlEa24YEclbem$b)d{2M== zqvW)-u>BLRJ5-{?TU>8veB6qjVPWh8!%tZFgCg=NfOxpA$;KrC!x>C*uy6*KX2tgQQzeHagxgFcCx6aGowB;L_DO1e1Bj{Dc#fZGV z*7j}$TyMt1QdA8U~JXAE1KVl3Ebvl6!ViaCzLTV6!N!>_mIok?3Y zo}ewutxZhq!&ZZ>M>LSTRCcQiE&X?z}CWQ9BM6KVZdRC8GOgmc2~#NLPd3-KGme2LB+k0fY;$p zv)@DW0dJ+zlA64mkae%WhYzX$+_=7$!a`NAw`L@%Yr;^&RYdPCRh4TOLS@5Xu-IV% z4DR`v4Q!Yj7DgsABKjA7%|iL#5<1ia&%(@v%sadK)v;5vM~>@)Qp8VIzNjb>h8A$n zas%fdTjI$RItRTQMk1JIr&q)eQq7JYkeBJ*9!r(U=gb}>UXv*=2a`uY345tC(yYaPUxnsX^Ivc%p4mZ}Ha32}B`Mzf}Q|L_tW|ut(FP%w!1}BbP5U*SX zFH1u9{sBy?#&_K{U-dtE`_tCFRd;IV4nKR9bjYeVA3m{4y>cv0iXVux&#_!#-{%=8 zsN@y=tJ`=gRv|=608%^OW2?S4B)HCyt~Lvg|1=8Uv))K-s3t~!imdIL4_oodP~R=v zdcrLW((k3ta8CUU$-@_moHGZg9A{Nx|2auf6`7#K0XE@83kZYla`ORDlcrop{3|)=yUe0+s`t z8J(tWHqb<<^&ju#|5>%AB1yy@!|V1>mkw8LRhi zhyjVTnUCUg2P*6@&k=#60|)+zLyNDtIbCq+V}5?I)E}8OlP>CYz|m~bah-9GfAhH@ zax(J}xTdnslE~t1?VKsca(Z(I3^y?7xV~kJ*eyQeSI6oFhl0ves&^Aq^YO}z)MkEO zN80G_Yu}$@`14-qQ!Ki2>>-U;FJ8sM^)Jf-eFqWDL3!@mo9Bu|F z#l0f*Qztc{i!{d^_@+L41 z67Sw(5|{=?@AGFV@3S`y9|^b<E80~3|kU0Q>YykgT+(h3#UT_l>-6v@5Ju3)aZ<;W3u(ocTorQ9KOT>oVXTrwzt^5z%VSn89n(}N zo6BW{L9d!~Y~t#*c<%?BT5HKRv>3`_%l->cfmXhtiTEVkEzfP2r2a{W5xAZ7Q(Ep> z?q?L`-ybp>Uo~(JwaX*;qmg;d#u^$P9(!od3mRc*ttKmzp-+gmV6R`w2+6@;F9*zQ zQ7gK5>$)J0BO)6WoMf3zuyVC|H2NODg?l)YIy3Mo0x;SXdao1%Pdlf4?S9sV_?ukV<#Km>^?^sK zoDcI*_#YO1aGRNh(To=y$M%ZL{4R_ia?*{p*p3hds(tDk0}TV>{%vXrcpCX3ZFPXf z%5ezx16z2nwj4?QXNd1WK+KZp8%L1yiE!3#m%JN?KRqZX6>+vXjTp_j z#}e7O%+v~RzA1kA>638ojkHPKdem~S6xR3nJn{Cd+?-&pbaZQ_P-yM>y?S`x9R>a8 zRmoH`z}tRW=)b970$%Q|2=;2t6jb|w29F=`yFH)5=+(ef%ic`qlqc@3p6qr2AyoOv zzq4ghf6I)sSMUkibeFOF!^HvW5vU%55A}y{&`Kg2zZoBB(f!edS)pSkg$fe#be{}A)AI(JbKg?QX zzYC*0L%gv2a*cws;ebT?Cw}LTt$FwNUAs;9M}9X37Hvd-c)f1w!+R+Ln`|1FX3xE* zeMtun-;AsZ-$;DALK=Gs6f*&@ESJ;zj}T9<5%8h|@7-haf2viGUyWINddL;(z z`TG~6tShdBTzF@?pMg&dv#Z{Zp0eDDJpdH^kKh615vIWxw~O<2D^8DChNl_(+B(7I zATgVC<@NUoY%Ph!<>e8{-xZl^YFY>cp~47(yvTF-teZp*bHWghcR)8bg{?AqB?6F5pL$1#?gUAhApgP7?<8wNu24?xHOjDN3 zG>@7;`pt-{0s;E>K&xM$DNL=gP@)%pb5joh_)PRzY)$2~Oekn|{qzZhSmdGtD>pps zPre`i5p49U&4mrH|2pCSh4r^>-?40SY!hm*${{+W`FVW9J zudCUVEcMMy7z?=BVitRCEgw3Y*pAl5nE6cU@wPv@U&Z6t44r!)z(Nk!CK4rp#PYcBtr(D$> zR}x$||7IlD|Io`~m@1d6!6}4k6D)hHrP#=4vn3o99ZqL;@6Nz(q5(o0;RP>d6haTi zwl?lMFPhswt|~-|Uvq9Ydr7NGPhqHjDhDzKel1q{l`uH&0+OVg)=`~Lrco`HNyf62 zh~>UADNghEdlVLUx=6j*6#$Je^+0ZjUt5J9+ge5A(l~S4&!R*Oq`1%AK=xrV9rj+? zqsOajem4Vi7c2H^kiJ8Z4df`t{YVyP8#Bh>%%0bt)`541$gz~jo>>Ce@_NZbSp5iA zc-&fH>v_Fu1H1OTp7gw~AM${JnT|bYzK;vOkGSMKVBZjs8K7kvWXCM=-<$>Hmj5DZ zvs+g6!$5%8lTUTwvX8=#k%$ZbNF*aDd|FeH&HI6THCvuStr@1c>1!B4~KLZi08 zGhnZ;dY|XC2Daapn#TC0h=2E!Vav{e%iZ{=?n?LSQOxXF8;#ukyRPc1G)iN|tsY;s zCNQLX&*;VMdUYbVP|hjSjnSB)g(P+?=dGEz=06g#$KNSbZgf3{u~-V2h0kO$lC=<< zi2US5bg|S_J5cs7hUVx~{OjwRuT-LK@D5Cy-1ZwFq;IdiyLf2m=GR^5O%s{Z7p#Xz z;U+s@1^Z*RH||f4q!K2F0e1GTx?X!_Dp#PB8v3*zIRLp0jfNq@x6<+t~Y#QnyX`xr^E*?tTSbL55`1SQL^cR#zjsJ>Lp%|k-+(fmuqY>Zy^z4HA z=?X@jc$>bM-e?nt<_pK&ANR-ZOMh^lZXP9e4sU!q4>q3Lq6`59SGu4a1!WKYX$t zNKExMiSKYfwSf)9P*VellI8m)x%wO z_qwCkd$Q>I@jF>|EDPS%lajfR$$0^?GO=_@c;2P6)~SUBL(x2H%rUiNhA(%-EKm)P^yX8r;*Pb4S%*v_9_W#wNe` z!$&uC`$FvSp{`!Fpfa9|Q5u7`t^JuL6nF+jfP$Vqxo#q);b=zmjNv~{19qipxM;(- zWhq*hoo+t$a|zi8A2si?=M5Giciy{&h7S6@H8X=aBixas?tqw#;MTY$W?T%te zsBVRG4?|@JpZRMif};7EH`PXtLJnp<%uH-~f5L<*N)Oc^*F!Z8UVR9E=@8?&kXm@D zgP?3#s~!Exoe&6i%u4mQ>^$HQ1sG`jMJaRiCws^&6$Bu4k4*0?M*4x@PIII@FM~`z z({B%pl6s}8PVh$sDZD`Yb8pwW{ho%-tYcXZ(q zD0ex;cNO51vp0wSv45WA(>6+JJ}AWx>;IXOtQttBDtMpu0u8*__ROJRpA@c4LEY9b zBKo#pI4RZ{1sqsaxImtw{PG3Uu9ZN4_{)tEwHY(ImUz#p>vYZO?$SuCEO)%O+3qu9 zG>3kQ%E~9r)Gq0wPD3)v+4@s$LNK^OYzE?^dExQ*3(=>y%KWbDdkYG&Qd+ysEX`AU zeDd-3X#`dIS3bt;7@T#_%-L0sWl)YEmfR)~{n4QN%Kq!lC6v9XUEa2vp-6vZf17v0 z(L3!oe+iB4MJy+gzRHQu%<6xz?HMJ}X9NK0jwRi|HuGzlPmc?yRoM9cSyIA?)#p>l zsw3Ln5hCgx8nUF8(&|&ng!Zt8* z#9v_a5x5GE+N=m_Ezs$sDo~5xd$OKMk>vY0u4D9c!m4}mSO1feNqc-h9VCFSs!dm^ zWtQNt{x`$3{uF_AE4qhsg;#(O>15ofUyr;&SeP-cNh9v;pJQf0JZ?4q{Wm#l?+M<1 zAFuZU+r-_<(v{#s#2`$Zb6MM8t*65F-2b)*bT!ln@CU}gx)1Si=c3V9< zi2S=TG7!BWGT>APS?)W*@!pC^cC%M6Pln!y6r+R?<|#okXW}>pA`ZqsxP$Sp*Wwn~ zIe!Jj2+}4UgWs}OZIskQWw{)!>B9wC`xT#35%k+MP11P`I4Hrb))z&0D_QjR+AfeA z@8-oB+|}`a!6k!22I$C{@3|b5IS^0BA@9qVb&n|LzdL)>CUDCncQ-}eKcTWew4W7S zx3ixYYR>AOYz|YW&RWYCDfctL-h&GXiA$%`73zqo_VyS!x?=~zm$p06iLU1btNJAo zdtKYFPub$2(}DyfQ-<|Ld<2DorDd6;Z;Dk2Ch#dZ0fY^rS&%80Sbv6jX}5gp^FSs~ zbsFeYi;~VD?2FCn^Y$kbByuavyl{b!PRkIR!1yq0_6=ZY+M>>g}kHtZ?%mDZ4h z!4VioobSmRMw)-}!}8NDD?djN@@Zg1)h?})6T%7-ST(((lx<>Gr)k2k-9ta^<0coJ zS-~L*@6{&W@Zn7*x1EhR_KQzmu)k3wBpUOStyNa0G$M+Rm+9BZ-gZ_0DGU{ zlG5Wl7us-=L?l{fH|J*UtjCu1U!X@fl?H4c9kplo?q0nWw0G^6y?IOwWvx4t_@bQE zkRB$9iu&ZWEhdY?W^PVX{u~AFDS?i^ny9T?azjXrj?FCT&l!I_$lx;mBcPP`-fWb6 zDZ~KokJ0?VyAiM+(#u|LKTXtLN|EY89OhXRH`6-^MMUc6i(-jF(~gStxuG@xq@T%C>DvIS``j&z zg9oC%NKLcLam8ufC4|EH!RM`*7(|L5mS(bm$o1nf5Y zLRum?^Y zn*b;B(~t#?GkV^X5&l$1brnXA0?%0JAXOaim#Bf{6OU}3axLJENy(qg1hn(G?gOTR z-=;W2P*;lW$*=G}?Mzd}6GyIuA*B7!yiZ2~vHD9-K?!lc?WTzH`{P5Z{Q54Aw*1=$ z$6fZ)0w1zg$diSnzH6b0FRKM3=k|1%#T)M@@*CWJhWIb}SxZX(+TA6;yHfW4e_Jy+9#VO$G1zqHi?$k$>+VGklk)_}kl4 z?UtKaE%3$52-z|OqR9(F3ykVJLo*s|gJGe~qYAm55JC~q6Hm>cpxc#V( zm9=gwF2`Gt2^6hhCjZjKNyKVRPTYOogAdu0wPW{iv%0C2K|cU=X<;cu!q!u+XAh`i z)E6a5$0t;JW@J>^KgxgqCQe-!XcyQddNN~>&&wKktyP<9$tIhL-ng(`PvBnjh|G=W z>G+L#hP4j^p2QD;)}LmU-jIPTTuBff?ds%RERwaB$#o%C+KiwVS(3;zd5#3e` zXH23+Bgk&c!a7Oy=?9ejh}SGwDs2l-b%BHUEU;_OHex>50f&#=Y#^Lo3Ok;xo-I&C zx?r@s9p!>)vr(cvta5ae(kcZ1E8TBaTQ#D==HJ^B9opB$dXsEl)fgF&Cgv3k^_H^b z8Ujafv;ne>KAe34&NEmUS&qxuoJ@2B)1IhB`&pNdNvHD`CoaWwQUex5v3e=^6G)u9 z@zwSZ#ZmS1&=WSeV_gbFp8uu}516I|4yZGd4hFi@Y`yZO=n$c8cuGrEahYw(+wkr< z7*{wv+dIJZ2+!Uo|F&XI;`w7*VzaL@97`IBY)NW^xpow2in@u>r{ZWrv6hQ14J-w~ zh<)>Rfn z%EzPsZ>mT|0)nV2f;gT4O6GEZh&h8z%Q)dH{{3`1G}`^y3GdC-#c5=*>9g#mGkD5! z$1ym;b4H$vSu`#xB=bzwmoubiI?Gk;EE`7eAsMB^Y=We>IL5DWqA|_{!Oh%}A!x@$ zu}mx7CYtN3b_qM1r2ba@27Vz9-f;t9K@#5(er@FUwyN~4sdg!MQn^KpMUvYxZ6Sa# z*<&GUXGCjaQF3Fpj4q6}fWtMoOV80wzlIv=P2Ym8u8QOD(T2J_bPyw% zOu0_w&<1n)KptYtb`^cftY%;9c_ZuZW0Sv=j!pX7p)fz<5{ABqRsF>o9w3vcGJyZ_ z7fs*GtKh^$? z$Q77Mwe3fcP1)`nOz^pJmsa3&t}wBfPfs^;Wba&nX#|yBD%1^$#O-i)pe4iAgUYLU zqe`MmC`y*u4)%0L0tRx-cZ&6_7>H;LiJFfF{PBf zZRCxt&;yMKR^Q^x6vGl-=yF?Mk7F1nZQD~AP2_C@eh>1t!~>w7A81R{KS2c3^-_yg z`a|-+^!_`FK5Gp}V!ajH83@HshoU9?QSDll%1?MC`b4m@%Cx;70o4Czm4 z#x=hRXH$pfRgnjl0~8G8S(B)U6_~!`fP7scK3P$#7O?k?7rb`X0eYv^4cpQ)ytdBY zmUry$cMNL2i|(sjrt`i&Vbe!2_egS9)5p*W!|$xhAUWx`3)DL;XCFelg~T!jLCJ@# zXD7Za`%_G=Q(qUiP~TC_9b$V*RSrAy#_3;m1zafPnGrFjvRDBpw}6;kj8{Dhi)Z{( zPPc2`j{h)=E%5%0sxanot7C^k`??syNR$&&vZRM+8{ zbRcFB%7XxvfjVo+)U=Y3#KXG%7TN+#@qA447mI&W_9@Ecxo(ousE$Hww9*1L`0OKO z|GK-yY|Z%P*;6QP{5Q@ma+3qjR!yFobE<@iy|jASTG7}HhyK~UvdT#(i-QW&S)8y& ziffpeJV~KFAd+Zv6PeM$$t*O;W!mF-g*~$|-Jyo69J~=hcSFh3#}ndCCM};pShPq? z*lrucU~-t+FU#?(!bk=|qPY614rD4yZ4-vKj4HMRzO@WPQ7u^HHn+Mozy)Wl9{=XO zXz7_8q{xL5*imCi-alp3-ptbfe`4c`j80v%4D9g&Q!p zZ%3+Z-pa~be41|kY8Ps}Yga3`@zDw1O1uh2Kr1(wb^J9fxC~dlel_$IxKDJ{4T@+9 zQ!+1Q2tO;qNF%x)KZ{V{$;ZcZ|H=UB>BWAn&71w`SdT(8V~;eiZ&q(lM&e*|Op+~b zW>8IP;2!&Bg(xDJR{r$!ged5h92fTzQ2-q>2NQ~CuSjb#Tu}GJ z$7bGUJ3OL9zwYkQvau;R=fTNQy;jFST6B|8u? z)0)e<;Y>J9@jAP8Yud{=O(oy(8s%N!&F>TZ^4antqUU>hGrNy|cN6%uLW%mY)lKc0 zt>o&})pVxrvCGI4B~gFZp@GgqfbCHc+DJu6ja(w0CVtE1wm^ey`*}zswX8wBv?3MT zO7v`66vwUp173snyb9+l_qr0Lu82s-#%(|c19uk+ z0IE!4U~-(Ld<$r-UTH} zbeswG*IbLQL9P$wcPw}oIN%CDJ1xbjZ$q!0`Z?62Zh;X*8Il3Ljp`Ktp=`oez~#O_ zq*1yk{k-mhcG;b-{y78^q+|_(O`+{WN_qxJ%0rnbKeBSEQ@bhSBl??06DeTomU~#p zPsJ;bmVy&Q;E%~>;b-fqXZ7SyZl_tCc0p`N>>nA8B);{k-%Bksuj+y2*?0+3UrQJz zbThDTk6Ou~x%p6d8cGahh^n$|H5;bbayHjWGcf>SUpWCAbQP~euHDxXr?rt@U>udl z4V2BRMz7;qg{^nbkd-vc=#4c8{hP>gyNhxXTc7hOFJQZp{1MhGM~#76rIHD@Nlz1> zWZn{iuJYj_04!hFFsIrB#+=)7Dts5XxO>O_xQNT0DTN!e#>S75B7fq8I&0vI$p!B@ zoWeGTA<&y`aI*eo8>AG|(2B@60UCXy>Lj*H8YnIpM}jUYm!p@e{||JJE=p=8YUacL z9{^QAs=pR;c0Or7a?>3f@1KIAtvykH$0?9tZ%HcS2%}SEsaA7l~==_&l zQXF;@R#GUd+S7Q1GKC~f@t)t9xj$hmM%s_FnR`Bdr1U{pfGGt@-s8179}hjlisos# z+;2k>7|2cYkq+*>8sH8luNKR1Y zKocv@@WQ3Bv8AZmSNDn81KjI6&W!iIFSkmZAW-(9tZ~$=u*8rE!(VuM@9zA(p|Qe>Oz?qfs#+97xX!)${TbhSYkvir zT~`4tI+TmVJyYmw>c?d`unt8|_FX*BL#gnz$4XBlm1CYX!JOjgzm|hhik$$i9dT4W zlz)BWE2Qn7)3aR7Cfd}r1yNC0z1asal)^&{CxP^5Z!^2QTsmK%ur5)5yi@_8F+pzR zgo7g)3uJ^k8fEVNx&4}1%uJlib>@|2wIWTKr)pPEDyxRl(CuAz6C3E!UCuLD`q{W_ zzgIiDZtYy9Vcqe?K^0C<44A{lHcVK7a`oR=x?^IZpS5ak(;wc`&P`#`RO^;wQr_N& zl)`0^E91??GRRbh7_gqXpLaU-dbId^0*Sxnyn1vP)!9pQvlv`HBaGGycX`b@^HP;E z(I}lbVyG7LSFRIi*Dk|IbO;%odDemuGOo0`)gWl1YPbq- z?*lO1vm2E;nOz?~ik~p+bL4wq#up%FhODActX57;)Y6=h@a|4SP=BjXJ#fC~%8Nf1 zg_XV8&TlZG@m%!n0!x@5sb5MXI^MW+DkT1No6=?^+*!v$oqrd?0-% z_+MKOpUt=JbaHX+DEAY4BoqlY_^R(}OMs+?PAx#fKqm3d zpA_L*Ts{+~>WUk*ADdK)hMJ5Yovxv&lkVf=O9ugQo4XTe3a(k~5Tqb*k{}a`S^}hk zK?)Uzxs{(u`O8nZW_~<6=%$E_P~ntNf;NVVL-1D?KE-3LY5^P!wXHJ6WqTS4RZtof z+Md_sX~Dif$yw(d!8>kv?dbpe+)Z3oVo*w#?sPEIbBfRYp zZ4E-IBai_3|HXIL%fQ%!;(H)@Fl#K@Y3JVq2DHscK-2f9${i2H;jQ=h{X+0&jXMeo z;S0OWoX*WI=%pm8{puDH62eId>c5r9ACu^BPh6ww1tS17K!mAade8!+r9j7YC@>JX zR@lHoU*G$fpDzyCr5IkUQoW4En8e%ViHsdIE>2O3$}PYq}}u=g;-uXnL6=@#-f?ylu;^2Z=) zeomX4tshS(t9hDTgGj=QKqCQY6Hl}5(_AuA z57;Q5g6d^}Ueu?=!OKJ}abI4~h4|QNkW!rzXouQzBEe?L$Yqv_S_I_DS41L(AyiOt z<4-@irkRw&&-*{yeup2E*CaogTgVa<@we{c=4YCBheHA1Gq0JZq?e-ASy~p7MrxB= zp0CltvKr1jYg(hx=gU4CZ>}p;LP&4wzv=X<*V5*a8jzHbH|1By=-1fB{<_@h-B5*B zeX)XyDyWE}F-4JtQAJc#Vt^>Hn$|TXYgH6t5n!tbsGy=EE>kj87*r}E0*M%61!A#K z>6~PkixE~aiv@xtVk~4t9$JXSQCO=6AfTWuks^#lj6p zwGJrIHj)R}``>OVaELHn*gS;bv<%^wcTXF;vpOBzx@PX&+n(FIxsthe0HwCu+UiRu z8*1@My~cI9u;IYq&FU>?YIk;QRL0_sNtv4A^bi@MuM!|bxPs4kh#`;1wMJS4$fs$U zaV43_6;U%HTnlXgJDPrOym^?uTD8fn34=u4zRR>!wfo60JCFc4;v3%yN&P?JdNh-= z^|DLpl9Z!F5g1FqEMUdeFwTMAW7FAYNNLMMRkMRo838S=3ziM&hw?1x$i(#Cy%TmY z@BP1ztNVYCIB-I{rw?CWZ0^C%=&_!6RpRyHSW`W$s;ZmLY{AbEyF!ugPj8=>yG&%! z3fGgKEpojheC*Bg*X`pL=v=$5jIMHyO!|z};rE%Uq_y$w`6Q6h1+~RfTyS(h8#REA zLB!Yy$*$oHXlJgdih=k@n#(c8NFvK0w1>D*-Q~?W!0jh1Zm9_t&~EE;*=1hRcB0% z)pd%Ekx){S9AzLkzbiS^=<=RXgYJoOA?|H3yPiIE-l@G?Y4h@tbFE8_HS|$|EYUR( zC5>yWL_-bD8Je^-o}Dmfw7_7|1v2+pRjpmFxT~*^_Z{4f=cBdV`9A*gxhA~mJb3Z# z*EQ$1XUX|ge@MVu@T*{cLnnIx<&O)HhaNMDUIpB#Q1PBvEygIXUuKvvC>uKLKCx{L z9(XNX&F3c!p=9~FCWb=cVRmVCP2#b-{d0SYDm)R2{La%)Z+r#;o;gUgh-> zuJQFx3A+d$Oe`oC5~$--E%2auhEPWqg|Bl$M-n%J+0q^lV}XCs=LuanmqYF8?GGww zreYeB2eY%s&)4anpXzvfD@NTZRaI40GcylUdX9M179U*h?VA!Df<~o`SgIbnz3VtA zZ?_iJ-OfV@36oi2k zkzqDPljho_FvS8$4=70|0BgtQsAm_`rbCLNDM196BiJN!SObGpBUq!(wAhpoguAYb zydDb%$7~DQO`e}O^@b?26)OYjR+1?f5LVS$1+0-7DQj76t*tDdVrl@oyHykth++jR zaahF_l4Y`_utZT7Ma4-g6%l_6Km}A7vJ(+{%OeIN!H`iEkVYbiNU4_EN}?$svI`X> z1%k#wilUWR1qBdMVN$CRZJ?s5QneOPVvA`~EcJ_OV>B1*7D7P+Fl~fI3xYLLiV`3e z;y5xY$blldMm~T#Y(nw^1uiKh(E(&3`~B-rpEm~|4ajZ11k5u;l^tAhfK(R0vuIELaLj)s%p;3K)e#ZrDv^G}=R4 zL|}~PEW{L=%BE7QBE^1p9_>4Liw3l40yxMnc~+v3B--UN0||sCCLmc9CNL330y0(# zmRM7F1)9j3mQo_gQD9c6iUP*bjGS;`iZy_v5=$A3#KBON0#~N6%T$t}Ho!y$Vg|Ap zkijv5K_Iac5?>aG#xYL~lS#(Ia)ze#+?JHKy2BYTL}DSt#Y_ZZ1yA9;T)M;( zlDw+edABvDX+={Njv6f`U^g(BEu*`nG*@P1#s&#eN`xw;ODa~hvMgA!V4yKlLZlSV z+A7Ru#K3S#`)t-DIi?OryICGKN#&d{F{6uVK}lMIg`sV=fmP{K6n{a_87c`|tfPZ% zf;9z!&F?$m=v?Xa?sc9RV^drZMS69vHYb!ThmP}iFMC0VYSZ>G!J6u!m22SL%__8J zn{XJy#xl0JWr`W4Fw}8Sn{Gd)3!OX6SQ&@8o$lhIdOabkf{iyO+n*fAQi*TL=v_L) z9C(=p_Tfh>!DYdQ4;q4qYpu!4aS;Vriqu&Mv4#SSNl?tDWn6)QfSx8(OARW_PQzIU zVsNV15++-cVqyhkrJdnK`6WdSK}wIM0+h_gF-gM7L<|%e1f-;->Yy1+#|V+^yc8Q2^t*rU&=>yTZYY`>SxK;4WM*{#sg_NlEn2 zae+se;fpTXpERrlfQ5>m*A>!=v_a{avq6G)YJ&)5>_rq&MHNzMRIE{9BtEy-sAweS!%jFZ5RjcSNhc=W;=6QfNeK=pqQzLE zij#JQ6jK!2J)aIGcj27h9cCXO;ZYU}<>pl!WmHs|AyPh@jVDV=CEG??9!Z|nQcB=zy8{c1?n z5Qm3n1Du(hEH@!3I7@6;c?&g$k?K8MTZ>n(lbm#;T<{ts?_+5MMf>Y;<{)DcLNAh) zojp+#nbYX+Db4D{wRfG@r^|WUGW(x(>3vzn3sOQ5o0|9J(FPCGHgG`E#SHsA1JARG z#~R|}5baH&&bPcZ&APYo z)Vk3^HHCJNBqwZ^(e@r(ink(fBHo;0Kst$u@T%DV}SQBAc-cc&{|?f zWN9v9(kZA_2er-K7`duuba>o0yRvY>uDl_QbjoHmy%x<}?S`0hZdcU2(|h!6JL=C= z#GP#doIL62>(&s_HP&qs6MDN0?AI;0m%4$&IG2KuOX~LaK2DO84(T-U-(t?$aG;Ny z(00k&(8$E-xw>}uy>#>?ah{j;9`w9l{-hdo%i7QHZetW z=Tl7#*rz)+=3|a{{O6`CvT@+&)ErseoQyXlbrzy7+-;;y!6a#0uy<=t8W=I&FCAT) zt}71WMfZkPOgL@p6xUHs&0@|bU!E@cd^`h=OT1yBNXZ`&>wy{&bj4ZIk+36zCe@<> z0s$>zdBi=ejgb~tz;@UWp`Az%Oz+w6eP1-!4p@Z@=O+?zi}sc{Vgv>z*feg_pn&|C zBMk(aBP1$o6FV>tDWh{}5qrc`MeBEz;NG4ms%q=t%<6B|mTIHZI|R$)%W@tQgDbDY z#h9tnj&-P)w9WZtGY)ZyY%;pDZG8a}4k8})#qC;&qCw<42M$<248@CT(P%r%V`

9o9*;oZw{Ozj$TLvu(TUKUd|99_1gR6rNXo^Jj1 z<;3DVX&OUW`e}yL=%7Di7l#gK4DXma-mEAa19x`9`dz4FRHrIZoE(XKGjkkz^RpVW zn{c7?4DM(fYm2!$3z+U&AQ?KmMvgaf_qD}mHOgy^hZHeloj!EMi|OaCCh46n`m>7g zeK}%f4x5#v-0Z8E-C}2r1`4jHb|$A93aa98;jQ4B0s=afRFw1HYP=1dG}bs|EF)c$dtx;JNTyrby_U;P#wrwqpuDmaVp(;$~wF}(3#TuGx%8E~3o%)dG zZz(wPyO@&D<(+T0S`NzT(M3(?;xdwYQAWCNWDE+tf_AVC8HQ;3GzoQWz)(LkcF1nu z9@NHkkZlyL5+fvEqPqI`>}IrhXqI=?g|PQ%XB8bhd>c1>gNy`1Cr)gBR4v@#0D3Y2 zPw;Gks6f_Cno$A;+=SY5#tt%3M=f+5Ng!r+-lQNsdd(C`N!Wz67^rw46oUqu6@thH ztPCL!aLQpjdt@b~fD`$VAtVKa^(6>S-1O<-R4ybnA2B;$t%T6j6-ndhQf&D?SP@hs z=Fxd~s>JWENc}Q{c!7p(q1;sQz5YLci{!XW{B%R&6j{K`CPf4ULqzt%veNt* z6lz{e2_&ou`Fq1UJ|TOtzf=QcC3Dc&*9Sh!E;9zi3O!iuGbw~-Q&bHRzBYUL-GK!@~0oT45HV)on->`a(G&m3>Cvv2m z>VS(PgbW}A?d_sM7LpQSkOhFG%1RTvwy#c_-!3X&^|v)R`QGsI=uzR)!#eHCwFnpA z%h`fwC3b9LC*GWIR9OX(MPv^IflL&K$ev7@a)A_*8Aue8egBexhb^iS9xaEXRlwwM z6Hd>fcW*mGEbsL2yw!Tis=6e5fNBV!f{GCsMvoO%0dS0t^B*cxNo|TMy#0n;+RGW~ z=oi2!1dv#;Hom8)#`g8(+q~h~r1hX$2F{a+p@fnfZQd3!41Efm#^1B)-f5#nFXNx# zQ0*BWn|g*K(TPI^JT*NQlrMfZJrdEUCMCl5ndXMYL`M>geeGtx9{MXeK}H}{Hwu?9 z!7D1JGK!mij!y_ISoz{%h*F5Brwv^}@zuyEf6Mr03Sg0gH$tyLrS_k@cYc5J?IyQ# zeV_^lnYDs8pctIAu14_D8%^LV1V}Rlm_cG3BTs9RStkS9a0Xh!GS>;C zhl#fC+DQq-u%9sc3(V%7th(o^2pbKYTJAJFHw*!qo3s}}qXPFz6t@d6r_!rY>Q&z( zvJzC%iU4PwOJGk^9+VWtQm`rpA?Svr6c0IKfy9wwp3JCvp*1^TYkMr|kUL@wVx&W) zD5{{MdI|T*Eo^=EpJ#Fyw=D&a^lSV^WMs@?^$_t?vj>gPgt`mHb1M^Wr#Fd)Uzj@S z?Pt3o(+|67`ANj*PKh&jA}s5ZI)^{(%eQkZDpET?Lt+1LR$s~s(R_^ zhfiFl3Bu9sd$}sSPnvo#^iP8iFYaG)&)t7<-<|$r(yxnQ=#{W&;||mFH7hlrxonBm zC+;$y}|M?m?Ar!+1RZtwRr|%L|KV2qb zOJ|TFj8IrCB*c}FSfaqJl_iu=L1L(kfltTkO86gd-o;q^QlPuhVN!O(7;6b@D9;*U zA^Dhefk7lVz@8FxknOCLU(0H~4)ev+L<+)HVH6>(h6pNv>)sI20%75*2ZS*pI@r<% z!R$zJ1IrD|9H!qLY#}&)Ybr_G0YkXR9gHTi+M&hUSkNC8Rf(b>DjG6PCDEMF3(bMs z15hgo(srFZaV2N(*(XZOWQS+H1K}QNV(wsL2E}kigB91pV+A3JQQrsV%6GgkyfBzGlUXNUmcyPUl_;OWW(*OSu?g#KK2~G(3_hbv zugwoe9vRmQFs&*@3BL5KiXKoURD|-$UzVl=6N%`aWCq{CoL&)QDd~r^4hE7Zbh1 zJ|7OW)Hv6)uGMSH_Gy_?$3dLbz*^!|+YB;UD z)2>YlGG+qf#@(8dOS?02@d~ej;-!xvOEH#VYZfCEn0TaINimS^FEb3wj@xS;4ArI3 z5}UVsF5?7AF@XWoZfj~}7&v}d~kXXRje?ddBP2inO! zlkaf=Sr3<+1%t{JD=F2!nO0C&C&Mh9nKyO?6-s26Y}Gsn$S!Y#X!6XrwdlH(28eWK zTR`1`$u?w;(iIz45Ab|b2(YLdl=|)Yd~dha>(PMd@52{u2q+of*K^U;14Lb#LMRHe zzj{bxA>qV?%C-tNu8j8OBr6E=!tDt@Xc&M^I;5OnKMM?D^`I32Vt^XSSOW6eib{(I znAO!BtgUOO9%mgPrwTMe8;KShFq|_m`hAD(gCPM`6HVl$sndfoe3xGA(U-xR%3;~` zQ|uZzW1F$lIr}bl$2&Gjn5AA?a+Dk>nL10-03 zzhh;Rc5?!K)HROLb?NAGMz%w$A61ubb-t6L=}+P$FQY;MHHttcpaw7mWQHX5 zu*MmwB$DSZUN_;rNW0@SLmv1*0_I9tZlKc6p{*Z!Yasj^FW%SdUzdEqeft(WttnJF z@5xv@Ox>X9zW>J3s9088F$q{gi<=07O}UVJkdkMhdiuSeyBGcH*I`-OBYz>gZn1q2YeoJ>+eN=-iSOGKL5Z92GOwFH zY^xg31&OZ7qA~<%`riF42z(2z(O*3pTZNySwk-O_h9}UY_Z&ZWCw(6Va_^oVqRy$7 zQD!naYX4rj&M3i7sep&J_9}@DnpQy%3EvZJ4DPG9TDsK;Va+ zAJb^=#43c8=3t_i@i#MHXE^M~*2djWx?DFl;SbsFyE1HxB>XpI3y{WteNzX1e?-1L zzP(KClK0#?>5Ty2UNm94=Lu+bBDG6?2kf*dj*($X1+;l<(X3c3%!Y1hkLz17+|OgF zgYvufd}+@ebZ)j4Q)SHUE-#E@N|4eKN|05GnRkv2-cQakNskBRzkN3C-ExW$eWDBJ zY&OSrAfgJJD|H@h)jPS#+qSy87_XP5Wvs9O%jST~IzeEnr%NjSQI%hZI)F$8e8#sw ze_ufDT3Y)9;dSB0ub_uH#!LG7DGTXXkR&6l=xYm2CJNX4Z8UlC`tghgHVW1RUaqe7 z>9z%2>?nLJfDDZ7gz1+gESSTV57)u2de~QY+3j;4OQnu2oZH=K=G|*B&Sj__n zjIDgRe-qiRizeR3)H|6O4lWx@Nd%49SP&|ibAfQ`IbV2ORr4m!BH$Y;Q-w-_722## zjckvitHyTPmIO>zac^ZW*l&dI1e6>)5f*p-z^}e$&*Xxi){Zouf4CPl^$SV)sr@r2 z!jo#Kh@c8d4|61vd)Xu~$O812x=d3n?Ht@md}~$``iVJ<_Q>}K`v`r zAaaM{7p%+wgR8C50xZ9%M5Gr00!T6CM1@EoF&Q8vA^=Yl&(wDMR&yjFU6o3ZNXuC| zD4|qFK@}>1Br32%JIwv2Yau^>$Qj|MN_K%{V+e6z9%({J4orpt5y|-1`WOfs7pyby z6B*sHdF+lf76QU3K}i_Ket#Mu7Jx{yD4?pc3_wyuMIZ|n5s8b}ukwAI8{bd4ck#o+ zyN;;PQ}|lrA9*vx@VvZWcO*F=HX5WBLvj-?L@;n}e)Tr2o^RrE1UJ;7t}yUe3af)R z4C2ky@()c%l&^S6{ol`i{0ZmI<8Z1zje0*q%5)uX$`T3?ggn}ekn%!Ho!X4d^3w}2 zQG<%?RVQy}HG7@T`}{M@UD0*jN2`L=Mq(9zKvDdYIJc&`houDbA@ZbFI~ zY9ser5a|Q9qDlB!41bfdScwlE*$h=@5ThgN(A0(}Xd66X>^974Vk*K7tPyM-RYOET zMd<=r+)I*L!;~#=;p3afnbi@#m$iD&+RYbv>6#~SDl< zHqQJePiK}`0%5S0R?3Lk-%Hfiy7oN%NKW<7hvOrgvL;dGT_zDWg;0gnO=<)UG4UF_ zKMHJAKO~?60pE%q!wFv|lO(w+of1|Ou#sQ|VMav(Ks=ygV-`kgm)HaAs#Z(!_$p=2K%_bP{f057hc?CO@2we% z!(Mp&A6rw2)Qrvj+tWQ6@iWZLzL_JZMJm$P=?ZEPke;tbxG=Pbmb3?*@@N!{VX|A- z94{|At!t?BN*rP4Cfq(2V-qQp4Ib8zG<<<04|2W96O{~MYfRVPIl1Aud`~mmru|&9 zV8NLD#qS;8B78?|_nInV_nXfDkDSyS63oCC%a0>(n?+ERj zE-gS1u@OWD2k+P{TNQa|{;Yaux-QsI zC3VcYZweCbS^Le8v5p)O-(Chu2I!EY#<#qEqsNl(4W^mIl@*`ZuqZ(JVj@GyC2#G{ zO|e{aNPP^K0Ouqfs!0t^nU~+MFp^9p0$y_9o_94d1==iWNq1#Hm9m<*W{b9Lu+2v6 zdr1wfG;GyflXAjVG24Zj8?hmEoA!5ggkMZB>uBDcG|au}%4al`w577{=4o_8mda|~ z-DYddGGs>HZ#bEx>#i4vp0;##TGzg?P2+IPIjOC1(wyOmnj|+}p{h+TJJro;n3aa| zt_nJ(ftPmaGka9NW;{AM^xbG)uN?JwIN8S^mhU?G#BEfsDD59c*#a1L0VydVk9@L;xECq#ORTVL+DkzwNSrLmOiv|d>P*oWv zN(nIXPpfmqJ3faY9TV|8s!et09wLmqPH0tB?lQ_C%j4C1wktz{xn`^aLNEs%=6b?S zWEmqM&iy@!B<+NikUTKyC)aFVm`Xa&1O=11AZb(q)tc)@s7azi-8JyN24(s8siQUm z_m?0V)ZEEi7h`v&R96F`?VC2(#t5Q}6L7gZWe)7#ZdZzi8-86j>~ilD#`I1m*z_IY zi;m)`fl!*blT2k@>gu;sWj9?zTX@p#Q<+Q$rd+i#nY#|RTprWv?I=l5o7nE_cX!@E z?scClH9eUjzSalT#`@%iK+e@52bTN`;qlhe8q_BKUR~Y4MeyH=xjN4p$9(ZK;L4H< zB#Q_N5Lc_A+*Try6h)B`RUzoWra)3LBvp&j6%`eVDuRkADuT!;gBCzoO2K8#JY?6q zvS>{hstSsLXKPcpmuB8PP2g&TAEzWwGs~nlmP|FuzWuq0IoJ5t`HmP%W{YW*;xNm~ zb*^`8JW~Utotj`L0!+^;m3ctv%dj3tBfqvySRx>b2%{B@gBURc86pf&Q^^X5vMR{1 zL==JuD;OySkVFAt7C}WL1QbDvBw)dS#ziC*V2ni{Hj#)b!4zacixxp)6+vRCDHLKN zf-4kQg2E^wu!;yVMS#Fqk|HdGRAdwwfW#sQMIs_F7>F`OBCJLzf{3Up3JL=d1yMlm zJ?9QS#kdvUS8>(;Vk{_m;C<~HeA}1MgWss{LU7jh+-c{UxIz10E*MX%`eRp=&8v4> zd{H>~y}OO{yNrhqt%1O1Ep=!vP)Qg$*^Mpgw)?^_tV^2*_pX zXFZ2X?$Zxiz~0yhy+oFDcwEtw&681(?m)CLwHoWKg22+M2CD<&!#imV>nAk&(sm(? z)nVz@;f2(q{L0{mbqI_Rs8_9opvrKMdE|O+!>OK|biu>7w5OJ)S&p-(VTl9%;~|YT zgp(s69;rRfg-D>Y#?xPyDy>Q~8kl}dedjM{fr4j==WFshWo*HY%+DO7_CgQP#r1g zVXi>xot~b@|6KC-ELu>b6D?&-yG7OBI zsX;=aLkLz@dgV+?Abg)W4$QnMedhPOJ{%vO0rL2DHIsmc9Vj%z-6dQOJWuHUcj?{` z;(TpOL1~6i!`b2L0~!Geg<96vIotj)*xW-2W}R_{B#eL~Q+~`X22TcAsFg3_wtn%4 zev`Y)^7;9b1>fra0O^G1t-UIqSYKMPN~wHP25}3Lk%y~VqETQ-N(d|#va;0xTC4Dc z2xSJ$Xy>@abooI;`0nW~DgRE*-X~>W&3E2#sBP=^==yq&$Fnqh>hz-)hQ6pFgMK}? z{cmJ>XnaP9C8~R^l<15;hYWETDCqHb()?=%8@<+m}d_?y`Hn>1o?F47eRn1 zD6xqKF;YQ@DuGjP{!dYV{CuDJ7?FYNfx z@2lp1^g&9Mw5kij)$7nZ1sMh`M5J3Sn*ogk2Ek_h7E83SX~-cWY_Sm$pci#e3Lv0l zm`zlU!t=wZP=f_Ldkn>M*^j4ya!TJ*Y25sd0>1+X!KE2|zB`$T5GbgI>jhYuB9*{^ zZ*F)RCM}3~-(^by0RU<;0%HJ+eI6a>FW9{k27>ufeqfE5Mquj-g$*i>z%Bg>C@Fxc zR+tskZ@)(`-_K@?D#SsoA9u-TW(4vvuglW}Aa^8yL-F4yN6Xn(udJ=aJ^xz1?BlEe z1D8vg#O2a9QeO^LDEy!*3kkaoP=F~w<~tYzk8wAD_;(Z&#UiX#_5Do9?k&%*P#Nk)r zlaV2bCm0!+41yUNDPRii6SQLiLx8zlFU)F0AvAZ z1YsZ)Sdv8`vH&Rv!D6B)gaJt)j0GfwQUprv{oUaYua^YNK6n%=TFSBm`I3tgagb?8 zX<;J35I{r$RDt}lO9T(Kg#;k66k{R?h(s(HO~P@NCIh1?$jTwCF#r)5>Pn6=WkyIW zT7dDg_u@MHmYh zD#9o+0U)v@S}Q1{1~CO{%8gV(LeiI%E>_cyBt7)AEvDNUmJ|g7sw&juR%1-Cp^a3E zh}x7}5ou_hS}6fYqT;kssZdy=!5&<>%XA%Tpi=9IF;NAICsdUHL{x~1$psaRF@dVX z6)8?+mI*N`BMFU2qT?$HTexGDsVJgKl2leDLoF~%Y!q#QQxGaRlvEI@R4OAv){_Pk z1!9tkW?W>fQvp$6q(pMTc*9+Fg^`O4YE+2WDyv&)TVfo}@7XKiYRMstWfqqD1wTxiW3^} zwtP<-Oip%66EO@)KFp#Jw>y0I`h90|yFI+iP3oZWve+2k_}H_GG~x2_&o$;r+;W~{ zei#)IndzL%_xN2f38W#Zr-_{64%8CHcW}3C8BG{$mXTph3MvaHlU*>+qag$Rtb~#> z5H1ElgfJkmiwH{s2X+v!LST0~;lRr?FyxvWP|BWDhXRZpuq7>wl3Nq+PoEC6FehV{ zSQ4Qk&YH>FQDhb=5rPOJ!IDJu-3%EL28;+XVG{~q$uc4;LnA8`BoTnK#!VO&6p~bs zh0h&s7}O5B1Pr;KTDFIJZItywhyj$4fxIdn7`CMa3d5ds7G~Y)V4AwrUK!EUClD5V zz%m36Vs=ssoK&m;Pz91e@_`9Z1yEIz5rVKJ5m-g&6(|TsMjf>cVY~_9uY8mzpD20= z9i3S*oFudeKQ5(QDoCUHDG9|%B*&@1AQX~f0HT5GC#ynW$7uklLM)J21LA>37}SFy zMovC+RZTP{IVnuE=)8Jn zO}3Szh~|xK{-cfL3_!>dOdSlnR2fs)ObNX!=I+AtX%`eoxGeVHyKiIV3z!husN?&Y6)b6`a? z3l#H8h`~e=55R9n z@wUj03Q`o7!V?|_gxxPZ;yj{1^#@Wny^ zYvgUOqX_;6>uBg@YW*lu*Dr$1QdS7y&XnU(bq6`9=UDbrCDWf_|0ay#`*Fs6Qo zUyBV_D&=u52FNTg9mr4Nn74krm_xAj565xddB{7Aa^Qi_>;BjKjPd;;0eJ#5bhzZMtrC2;oo!~lkCO7I9D4mNy)dFr zG%|d0{=<~Z6U&`=Cj{w69XdHURxVdAnx8?#st?=u_+osF$=DiPtIfVg``__>GHCvL zDG?9fAyIi%FYb50CZVIw^cwu?3lpOyC*!|8(G)oA{-b_>1!n};oX*&@r*Lpgm|U?j z7I>T7F@+jPA+e(bEeZ$(o(!Is;d)t9m*#%HFy$%e)8UHqOhi>!Fk=`nV!|paMUe&~ zCS1b%-``xwh$w%F>V}NlY0t+$6ZL-+Blp1 z6Tyi}ohdqk%yN49@vFA*>V@nJ%gLEe3(V59u5H1Tc5uYT7fV_kX-bh4OEn5ak~4j! zXS4*>3(7?|S7V1dcHZW=sSIA$Whtyw!_$mVi^m+$aXR72%S(fX z4-5d3O{_*(IfgvJE9$q9HNs6waLaUvR1gMWR1L08XE>&pC=w6}H`B+D2w5m&d?p^L zD>WuA?q4}flc%m5t4?zsZIn&EyLA`7vmcf+`eA$y$nw9b`L~_1xelWY&`}Qk}0F+Nl{>>zF23yS=}gWxekTTjbc`UBG&6% zLtGSMZ^+njl%_?PB=M@Rg$l*DMh-aSwMvx5v|xZt(&{5iK?r2 z6$Ig|7~kk;auF7@%AI0Y*4dn)>CSIl7c-kKkg2%*v5xO}9d!O3m;&D8k#VX0c5i+^G6$A@Xy0UV{*94Z1c( zz%J&t>s(D=GxR*^q_D-DvoHjYmRW)Y^rxm>L$99PqH&bB-0Gb~UmZMZ+)OJeJvt>< zfWvu$0RWljeK+v+&q2qZUS59ocGxz#%sX3`00w(^ESC;E{OrPlb~7g$$;hBPy43rj z-FowwnrXqF!AW(Q(Uc`%g6zLg{4l;cyg3=u5sD{yn1a@dv|e8Y5nl&11F)Z35h?_Q zqzxG%Y$u+z6bNjC1~5f|CclW76ZV@fo+CvYek>38eEuZY@_V^qz<}I=q*zEXqg!)8 zS_m55tzbDW&xLb)z62<=E~LbumBlo6>7>=f4lF876X8je@%S{gjMG}2sHri)+N};X zMzHU9P4(AJQ3EX8pkRm{Q6aeLO^7Yj*eh#Sk8BOu4Ak0IhNNAuIb0N>V{&rjY$9#Po#x8{yoU}lb8{F?u?Q1 z)>V>8B$9JjF?+}4NMTn1!outo}Yh{!MNm(t3;2#XMkTeCdu*qfk zilo+;JO^l?j)vA^Gj>x26J|EzTtAUE<4LOGwe?MAw?L{`+Zk*NLLq)e=!T6|!qt94 z+1B#evpMkI^&R|sDRf&Z;xSY{wSGffZYEAQ3an^K*kIOM1z}lWFo+<6#xSE1RI3W9 zVJujW#l!uXnqvGuubT7+3s{0-1nlgkhfcK)@wujZYQKI~Wtp~uRlsbSvtVGNio+p; z1rAy;v=$cKw;7051|hn^L{$`7cTV{-g1IryG)P1t3vg zRm+toL~~qO%akI>ehMl~vP7vxmI4?Uu+}~x>q~%=0MU_vWgut{F~9%{`#iSUmi-UV z`W*Uv+zvO;@9e7Vt6^SvlMqoZr3i@Ejl&d*ikX>+t>4(zbtUAISd=n!kRDigLlE~#xL$~5dN%i-#KDHLTqIXVu1q%%=o#E3 zlXZ*G+6yM+xH2WH5;riz7b!*#CS(f5Tt<{oFr<}!I8ZQ%=$54rL`pGWxZt9Q#1RyT zgv5(rt8AhIfU#I*u|X7qT*DZO3v84Yr67VLpo46%Vui9;utZrHj7Wl_<<|{D#dWbU zE?bqQRJK4XD`X&HO2$PLGSv})#8gocj8%|DA#GyFwJ5PfSrsE?ER$FiO-;(kf~=`6 zq!uYu8)(P9$&4t0Z7UcsVpOBHN)?reGL%swHpCG@1_&UQ7Wf-F`cmaG90U?Kx-g<`_c zsw6~WswgP2O2VRwstCf`polDhVF54@0zio)5MsEiMv+%dsfI)ui~%zp8nYZA83kam zfvhU1n98O!3NfWrY8EXrQ8KYbfs_jrM8^{gQGlTlhB<|p!j2_EikV6!O41@rBNA22 zj1{nvG0AW(gfW0&gfM}GsV%YEWVwRP( z#z!JCXoHg_FymaUMJSkfxrvgf?6?wFARr-RaU>9KWpZLjvk;=Io|`vnD9vofSH?-W zA+&O)Qyfc_#{slbvc?QD1eVgl8dyRF5n==hkfusDgrf&7vaBeCwv|H`$YQn0MhIgD z2Mv|T7~!hZDH=yGakk7G8xW;rw#w#LqDxtq>SnnFOlq_Zh`W!e>LSxA^6M8UM8$`!CSW-_AUToHn* z#URMSn8gt?3eaPcHJkY_H(`)Vke{`hLs&zmmc(nuN|D-YFh|WeF&vPRM1&!zF_2j) z1dXJq1!LeXU_vHZ$wed+yh=_v)lTsTgQ19A-&Mq2wl*kS)0#iUJT2YV`QOomn5HST9qCpWtA`w7i z6=EWSfU65M60~WE3}i+a%LIaun99Od5*9^B0)mPHstE;IjI64Xp=}frr7e-MjYtTs zYy=9CR2xZHN-<)>qFE@irL+r-uyTq)O3Hw*t*AH@6s#p;)-jgSRl9+Sg)A&eD9Y4} z3W05imKB8>R?$cx)D;-B8C+^C2~YzOOlwh0xsa*@F^ptJG_@;X84k@Mrd5K;3g=r{ z!`7XBEWbYeDfRdFXr}_9{p+GwW8g!YviGAkUe7%3#qYffr_Vii>+K9H1L{doSVF2w z!5Az?K~Po&C8eb8s)~Z5!Dhj~9l=ZT+fDUvFh1q;la`*Vql1L!7Wl0}f)NDwRuweDt)7i17ce*i+rprRn_DGvY7$b4$rwPzRl!^b z5e$gOCL;$7R%95+m?TABCXOX*AgI7KqYwciik#d)_w=s{`%}squ78-*|DCs8yv=;| zp3irl#9>(^hUBz0{ufC$3eflWdo?)=bOKE-lyi96iik!P1tlmr@Dhf6IBouTz;8pDbP=QD9JW;gs+2*Cv0fi^NoX8JZM z@l#ll@XG-ffYM(DuEB=1+MSK!na!p@Ch`aDn8~?)0Vdn!;;0y-5bj}^KCQO%H4l0X zjBFqWyS@mp(80CIg3OhGwWV1#dT-r=#1BmHTl{pQ2^gSNND`w~qa}tgiiiz~2y2Wo z&mX;+16e^bbaaie#wd>wh@WdSZ>NlylX#s(@gCM~ST8aY4{9tki?go|jJz)BtooAVm?@N5Q# z(S*QRtzr9`V4%Cq%~bh&q$>h6^}P?&N98+q=V8;qH+<$xzcJT6m3l2?SC!|@vH?bT zDlGc@_}~sVpq}loeEMn6Ayri6uUor!qdm11K#Gh7kWoNW*Y0)G&-H=xEZio{{KgW5 z{LJ@5yJMyvb5yu#Tn~op;U&bJ@5pT0aMr#cS{l%x6L%2g5Ovib;ognCz1hCUuAD|1 z(Zo8}LZxY16vdW`Qb1J}CBE)54pjLUH_l8>LSk4!VM3v+NE>26rUEgR!WQ;cCjR1p z=fa?DIf53VqH!bC%HdIVip3dU5zQ#5eWKGrM?`8?;zi(fE+e;XIj$19VN`-w>q$*YhF+hq85-29p z7%(hRTHiiA9QpI>jjZXe&?<9NhaHWNn&=oOHjvhixT5pT;jc7|^j`iQaL#oI$>%3x zuP{kghSdwyMU7JDn`o<0|H@L#5G(T|JM ziPCC!=9LHrPo3C22EimmHx1e$@YWb0Q@5M7xa2o`yZrOdzRTf!wX;WBbA8PZCIN!MVRG-b@dHS4a|DeY-t7H` z$#!Vg$FA+Lj3Mgs^wV5et2nkNCdskO7OI?-4@_OP*~a=kcx%n!p4Q$GeMwTnFLSew zO^2k0HB1@y(P9H@vbmGzLmbQK)@?M;F`60)Ed;qa)3&vy8s`PstRS;?)(2b7TIX&z zT_fhP^oiav%};N}roCQ=M!m@9iQL%}yB32Ss)BCP!uwA!(G6+x*w38jKyLO3v4Z5r zE+s2*hGBbA?vGx);(he_cV|o|(JeG@TAt*zIr$SPx^pwicjJ!LlB%;twRd15&3y?n z`{ZEatuoCKk6jfBH;1?&5I~Jt-GPSpTt=)9v1?uDH)8FE!;C{-q7_5ZH#6PWj{E5C z@${?Xrq^xvd&q1*1724+7=@Ty6M~$0eaY@6w)sh%jzuB(5jXW1x<}vK8LP;@nbrKJWV8Tdx zG!03FofvV4l-H@kfgv)_SG}pel4&BwLxwo3*qm8369X9W#Gc#LxM$_3TS?HUA4Id( zltw_dsK(aXz?tUB15lhp;RE>4l1fZ=wg$(wr)POE(Bd1-_^U+J!?ebaE=_302BQor zo3Wb}Y*je;dKSF-wX+N{z-O4E=Fx8D!g+^z(){n73m(3%$uk{$s$)pf$#y`PdpzQT zKN5jh#9}y-`&d*R{ah?EYittxXJ)dJ&U|wQ1`^nz zp(v<2bfHMW6^hRpF|(Es*(Q{2*l)hLhR9=TxWl=W+ff)L8J^aMT9ta;yC%5PI2H9_ z@xD5ogRy})FbQl@S1sE?k_I*^9<~#;gbg%MqebUUJSdO}#Nkt#V95#{QgvZzloe%7 zAWcqB(4K!a9P}aANhx=rp1YxnF@-TRI^YAP)|K7vsXLXDLPN2DB1ll2Q$zp`!t$Rt zs~xG$P-b_UH7p? zI94ppQK)&#I3x1QlsW>!2@a0lWRMg+&;xIkFy)+IxDn$G8%1!?R+&^(SBl4~}bk0qh;Ykr<4d=WCpNiXp`aED;G2 zQDif?M)bqC#mYdo2!s|%?8MB|5bs0wTm!MTrfg_fooet86SBMUnjRA1vI;B(QNBfXxDxW$+*knx+x&v3+g@~l$U}u= zwls1?Paj**H9bC#sKRE)-2Bx5KZHl1VP0lfzzD&hXQW zZcJVm5EYOGV!&{^>K^ObGDz^uh8Z^2$U8*GT0H&}SgSq<&$5wD6+S(FO}ax>eF!IY zhlv(zYFO5CE$(0*KCh)K@;o|;Gy~zJ?)P||myL|hF3DzV-*4(oq$8m|EOl4;+Rw{xtvx$rr zWFVKiR57V22dITSUw=^H?c}}nctTR!f}+WZsW4;|DMK55Hy-{aLxF-2Hv&uZ4+ z*JHBS1n;LxhNnT?U{0AlvI5B>#M=lInUdTxefC{l9iLUBCtA9;@IRh@MgD&Z4Cl$y z(EOc=BdPKFb--s1ea6n-jvrm<`B~8iz&n96-dW61GC3 z$%b!q%SumII+E})*IO`}{MTnqE#ee*9M>sJjNU6jW6xXg;hWef!kxyV8gpL^Vcda% zMzMn-&Vni;#IT%&4;XSQAdG{Zl@o^qbM1M%nT8K3QDbW_pFQ`~<2vfheyz;g+G0Jj z6(4T1H2irjG4%*=C`U9>ielmU*AxA^wqnc{Y!RhLDek@z0Pm}0a0WvNs6Nr*1 zMywv+;8$X9AK{bpfshX}V*x;3M;K?DMUJ-HXl#qZQf&D7{GWMmdA;$#=jBtRE?+k? zJh*rk-Zo3^gc9x9*zxlmv#r}9zK*aut9z3iCo2PScC717vfm!1=ZVf>c$_cbDgluU z>KDU9nY1u7BqXeQQBbjnI2d>(^@dHx7?X{cS@Hh&`ImSk*#k+0gby-J=eMUe&QpDJ zgKL%Q$#(sVFOILt-hHfb(DHRu@$;%?k(|74%|zwhzP303;mSq^m&ZD?(Nk~y>5E; zZk&6EG?DP=iO1GS#g2saA=;RBVKyovS*6&dZB(kE1TlnO-g{*AZ=+J{DLN*m^w>f= z@$cIG$06e0iSg-JRq2yXP}c@K}EtC?`0C% zYeiNR+^%Idm9rR#jDnQ`_1T9$H}2C*Gjz>xe9W@SqmO|(<|4MLs8(mr%xy0(*3+_!f&G#m-BqaBgLkW~FVq>Z6s^MOKn6YtGZQwKQPo)pa&P5Z) zaWLS$%7J(Wq8hHu;eP6LyLaB~|0f~6r%^3ywri;XWu32>tW|SZcEY=RUw!2}9M@$y z=KOk&R=@-R1pF-j&CB%Z-rzqbt4*e|o_#3l7@e`EPu}7SK#Q^59mfTyRl~{~wy~FW zv~yIT1cGZ6BWArmr6PW>C*8nlH-AJbgq!B$#3Iyl0Do({v>M*?u&7GKC4aj0cI@3L z87xaC4y@#_WrYYn@%<+B!fj<@l*=j}rUAPkKc!TT-$LOFU~G~p0K!;Vk_#YI^g|SD59QFrf#IBCAcZW@C3G6;$apgZ zak=|QtB)@&$rw`Vi(PmhUxm<<4TLztA{$MAnEvu`B*Jt{1Ze67d`#;qEc#pMfew?z zom03?{?lUfmvqAA5c^#b%{9}Z+IT>om>#`n@i<5sJ04IxvI`-s^-OAB>;vc!IdI`Y zBNay9D**8<3f@RSGED3!Ynn=nFko#-nYpODl*Juncw1^HeWa8mr#9=HQK#>u$3vuq z4i+gR>)=lS86A)b1VANAMF9&)6hql0xe{gu2HJcGKuJM5N(g$5osgQs6k!L3g92Ee@xJE<;BvD+(Wy(&apWe+m%&BX83Hln0e<1G`=+i?%yTC z958NwW5Zq{uO84pX@poJP6m#*xA{5B=Ei}>0kD~4%B72!vb?zC#Mbq}14s~mAOb)! zDFpHPI`wvEiBLLV9uo$QN%QN)hNo7jv_s}I5l*tr$sFsw2p`a}BFHFMkrF}Xg23>1q72&D-Y0#*7pSXvws5Gq7MFgPF`kYtd{D09Vx^0F|5Bf4?$b?Kbt zI_SWR@@(&El)Pt&Dg^J=!e+;G&>($ePpf?CleVUG;hDuw3MEMcOY88WV#Nrcf=DO` z!YITAB%Rn2krheRqNJ9AEGkwVj65I|5sZC zl6Jw;f|`pI6xLEDK|--qP(-W>nu`x_eq;lPR8f)vI2c*lCjJc1rQZeku@o523DV(d zyCATF$slM1q9hsupukCP#GQjC+Gq{w2FY`Yt(U#3Y0H`Kl;N}+(dKc>SDs*fs43`Y zLzx1QzT0|m#%>2^@#K&vI2Q}&x^H%1Et6(KPBXaxQ;5Fs*2*RFPNvvBb^ ziY~gTZ3oBA3<&?SYd{tVJvcm|A|v=x@)P;gV1pz5R=t}6(b}L*(R`A zSVM>$VGbdQoUl+)ef)RMhiOJW`G1GV+Cx!c@;_sV<0pM;%{Cg6awkPM6e`Ur-6iWn;WRNxL0~&)_s{H0!@H}mH_cphPG>wVac6I~Z_PmLWyedun3>+Mu zkGoBdH^*OLTTqjHeLX13xccus&L0O$VU~)F0!dPwB^>I0*E*cI>3)~FxEVyux}uR0 z#N6)O)A4pI`uX}j_c6Ito#{`50|k`>k(nepusOrSQ?T1jt|v`n*;2A&I`Cy@Bs<+T zqN`7gm1otg8})u)lj&eaNEf~(%z!?w;wxs@Z#J@Saz;c548Vp4AVkKEQYz9C1L6^8 z6XETvYd6+NRyH2_(kxP!cU9cekM}D?=^}y_OUeiZ`wUE#P1S%hbzO%lqcyF->ihd~ zaMO;rWmcusP}=ozCKf z2!KXWCcjbR)VrhsUb#K!c`+6 zf~1vIAu2BlS?9C&-p4`Bi^@G-juzBvTba*H?ToimN-scNX@4y|-<&fkE9I<4lBnhX zZb!NJdw)N2#csZR9&fPRyGn#g;s!d3B@z&dfwCtBxN zyNSNUzo~-uAYxhzqa#CXNg$xe6Kf+Qjp2$57e2?r{MWXXv_VMXkCyLqm1~V9AhJ>x z>wEL>%gn(c5V5e%XlW)UvISIrD}wJk)$xWVv($<@(m)`gmOJr_E5cxh*Gb;M?R*$y zG^w*}-(AX*s;a4LYY`<&R5DIvk(#0-7}i3HGT2zea-h^0SRbk9I$&%f;gdO|Bf%%! z%@`_**r3Xx!13XUzS^8Nnn6bjvZ6!T`~6DxPK#UCHk4}Fm<2H#TGuOKq=b<8-gwrC zLxX}dOhN=pVJ){_4yMQuAQNSAGKjLu#UkrCCf@F(HEGl}RYlFc4BEDKKX3ECV7T05mq* z5lEpakfbd|#lQjxfgUc?1w{p7ix`6$6wsywkgUw1nPwD; zAqg6^gehRKsCWx2VED})5H&Jp_L|Q1?Z6r2|O}DP(K6$R!LX~X%CYmH39;X0>aq| zNfeM-10r-l!}n_WXYY5N4r3=II9)|M+E2w{yDb!_DPtyxq?ql#8T{RQ4&zHVHLZV9 z`!w5=7utKdS98CEUw*giSZs4Cfd&nAX*4X1%nMD z3J{Q%LO~!XC`tDqSR$FgwTH<0b()jMeKjS|Pk$!|ohCm!Rmx^njwNE-F$GYz;rF&E zu3NTI77SEVEUK#o6a;6InT4&3N>M~gr6`~yr>&L2ild&_4l-=A+7)odjN@Dy-s&U@ z>dU7@fhh|@Sz&6dwHDr_=g%@^k8#Y*hR6hpQfDD5gRmFiyXj;2kp%wc+`9{?gj69?~uto`a3zHLIFG-Fmuze)W*5Lrq*_cZF0eI zEam%+cmSXxFEX`E0}npjFBxm2H_puVvwE~L*eO15x^$Cjpu;%2VvQMj)xYk&)986{ z^5xgIAEBRkyPr+Sdw*m zdEJ|B?$;|$`RT#K=??z3cxJaNXv7UdDF}UL5Sc)v1JMaH!k}o+B*rBN1U5S54)?L1 zbUFxpK3eeTg2Z63MPMwEWCajS>ukf{%U3E8hol)KC!_V0xUOFCc)kh8n7xoeuN>TL z=L;C40T{)tZ~~x;N}v-+KS`kmFk+!dq29y9%a%}|FTTA^&HE|}u;^i3B7XAp!2BcD zoX-Wf^!n7_K31Hu>|ks^V>DWFqI@?y5PK?VlvQhsh+W?I-qrd6?~h`2#PRFGw^a3% z?8&*@WY&6_(YDsGj+XH8wW8C{up3*vTcAv|Gmo~>*<3#X%4{ecoGape=ev6k zqVM+XzLi8Dwt3ichc0VWi?0rzuS0DUw67uq;pj$s;mYDq;6!$_?@Sc!deHD&UYEc5qkMEHCKjrvJ4cMt~O`jeOWj` zGV<30XCr-;M7)m$=rb_g7IhO{wdXYQzRmGPy))0ZDF$NkQbG$as5X88cH8uYs3 zw;xMB62#1>cdDAIs;a1}zP_W90DS==;5K_a=*0Pb+Ct9%N+{P5HDn-w3$?8I3J1$4 z4983}{kIQeovk_?Z$K0#dF^F4}68JWeZyeD5Auq#%-d^ z+GWd-QcP!VAgdNdIF%v1rm+P^YC4!YmN+gkMNteh5on=^rVSWsNV=9yYTOp3un5_f zK(@){szYu<+C`5jC=H}5DqxaiVm!>tnUgZYX)!Ka)v7aTx18kUoM?h5>I(>=IBA&{ zK+LiRG7AWzl1*X=rm_lS7F3Nk<;w$EHL8h+LAF{S2?pLO#6LxRPM2F_#enIk8k zk;P7PM!;cmHwsXpLg<9c(9B$f0(!IYn=r4~$QqqpkH*HPn(_Fg;R!bwxoSxW;7Z+4 z;q-p5OidOq%~b+x{yqtVFAl#yE0@dTk7)qPAE13Y14CM!uIJR`a{6`1gbO)-R0E(y zIq@hs@~rB4LIF0eUNaw9KNLRwT+$sIyyF}z8PKo0_S{t(?nxxup{WcrryYMf2j&Jz z3_bdQ0mE{RynGESx{3)p>`?$RkpCGlc@#6mx0)XF1dQ?1()gxZ5X+||(Cd46b*^Yg zq%pvw*S0tqa*K{Ni)7n=$$-JtAUD&tg;Tf=HSOCowe9t9M#m0BCX7F?WRMmBMUoOw z2I6WE2;6}M>%xMmfSNH;KoF^R8uI=jrE0uui<4 z+(7IZmQ@jAixE`=h*B(|!x#tYB3V16ohLBm)z_DEy@9>+cyuT6{ePMKT)DQQ+t-8o8 zWCR3=$O;G{7=8qW3=}{_BN#;_Sph-_D*<5zBor1BECmG!F$jo3Nd6MgN zVV#Q6q^7Vz0ErPS2$o{5vjHWF@2d+ykh!H|AhA(5D5%J?Nu%5=B7hR43Hn$}NC2mb z6%rszxS*NgKw>DRzcg+xrFO0_#SvB3!r-B1C@A3U&?zkeV4-+6MYyurK~K?VY;w-> zo0LUY6B7osK}}(z%64u3LS4zh>uu}J;cnsdZ;N57mJw8hAY_Rc!wzMZxfP1A=;7C8RH?N#McG_kx409W@DDJuw`ZMa5GCJ6+u>35O#*{xkY5DOrZ=&7?K!= z%!!C?Jm(oEAel&NJ}f0?-%F_J6@Rw*P|4I0j^3@BA3+^Z3Z)dJ0)a%Ndjg35&&#Zlz| zv6z5V77(lqmdFKUD-3eeq{ap`LDt0taZc$DCxepLPIZai-0AVOHP@$Fnajok!0F(f zD*)m{9+-2gO*Wz(y}8N!Tf0jDYt_t6N|l~nS5OT_76#if_RlcMU0`(Mo$OUq zR&AhRww{Yhtnl%9uUfZt-P_FLb<;6g-R5rQQ4ztjP^O!+oZ$1bO4UnBDMSMjX?%s?z&x;>Ig-HY*}YJxBtu|f)tzxDDJuoLYa~@%YGX3( z-6dcppgPk~DrvNB2Xi-RRSfRbF$XNG%L>DjmP9q#d%BPY<9~ttx+Zb zZ{4SJ(|Dn)+rh~emp0~w_&h@d&T~&2*E5}TNkp22s>r2IGJ3Ouq9CNvD+noB5eo4t z4W;$6yPmf=!`IWJy%!Ue@DXgMU8)rk0Z5Apo${uPGn?xT4Lx~eUpbg@qd6YlXBoTY z=Je#Kxb)?wvpcZjbA0!(y@<1MBjrZB09+S(&+1%QI0qavdQGDQ>=Re;14P^j!|6ABeEDq=wx zrAR3)vZ1OH(8!9UeRCr0-wr!hr;fV7Mu3$RT8PN9V+t7B%V_~*EDSb_u-RO<2e%Qx zvZ`&N%S8uTEN@wkqL)rN3`L7E%~x_%m4j?1vCY!MZtB^)tRoplmVsJjrE_b#;}t4X z95R`KI2^3vi zh~WhwgDOIcYUWW!$_aA{hOtN%Cbfd1LZAvP6gbFMOh`;gjFL`24!M_k)`+epkD<__ zeG*Z$&g?gAr&d_Ol0Ew8zbUUg`7jszN%bQDt>wP?HhSLFvCeSxAm>%8RXtRkA zJfw2fWwzOB0?2e>w(itNYS)Q$W-YP_Drs9Fvq}b=$e3XW67AWLg(kOI->JrNw>DU; zz~y?>WWFmzh8S0@YWFekxiwO)!R9dL8s-H44c@tDqqR`<% z5?2!yn9oaQGEs(I!L%leHqkLyA|@AA0%*Xf9$Ae9l^`5Z)KWC?w-zQ^DO0C0s7y^l zbjr2laMwF>UjL=a@Vq-*eNDRqq?GdwDs%wn zr$`wdF?4`fl1ZdVG(%+cf{6$}BETYc;S4g+6cv!4%R|vDnA3m~QRX0FP&deZrc|C4 z)Il(i3;q5VALI6PmlNi%hQ8K2%}-L*M-6>MBpCpzJ(*b6Rob%)TENR-(8OX=B>}CJ zz3;n}tKJ6p^y;a57E};k6a-shQ)t8JFKCysu!X1qrKkuu5kXT25~8Wk>ukZ=q}qNP zJ{UuC-!@6%2(or0RxvAp*gy5lQHJep=xYGA;^8uU=OTT6*D|U;tdQz)la}+ZX-5zK zK&PipZ=Upe7t*`|y(ceUful#z)hHqC)A-QxstHw#9jp7f%bca1zoxazcAj@@&S0=8 z2=*EpKTn&{^;-p<=KRsM|-UNZf zbvySz*515+{omfVNy6#8O#aWl?pQqfs#Jn5_5I{}j+eE9vvv-O{B}lvGvt3`-3REE z&CtqUG-LD6Zay7Pb3^9+I$^qyfPUX?M`7pho51}$tjDYC^7S2;IbWa&aV!i;^iDe4 zQ@!=>89&#LbA02&WV&mJzE|n}4|$#k`R6cnC+R;SqjI8g;mE?mqCz_F{`#pj4^)Z$ z=82O!ubqPyQ;ch5=QA}|JF7`aNH#!s`ryN`H5K&9KQ+B4MfmzF-}*uTlF>@TdVBbF)E z5z6PkFBk8wdUOZwDss?vcxK`F;(l2nAY4~RRhwLLq={c~#ME>%QnN_h>-5zxDcZy4 zpEd@GC5RU>4vIQuDRl$uj`13=)Dz5yBM;*ZZ*il`M|qnJb$Bnk52AQ*+9xF(COU#- zAo%e3y>E}ktpCv7W3%RIY8dGBkmVq0osR!fW1%26p{2pnGxWNK5>m}LD7jgr%&Y>` z97GJPLxI?7*hKWZss~jAEgt9jP}QdEJ=lg82T26Cpf!4Ik#*e$4qd73JD&^DRT#RGqy|Nf$=?el1WjuI-FC<%j# zCDvw(nT9d|UdQyo42%$PF;v4u3^W&6g~Ug3f|Q63lL5039zF;+_;GLm+9J2;H&D2O zn5e3*E&zIP6?F)ryTlaappE2JZADw0JpmioAXtXc01R|MzD4eGCeCn|>w_EYYa)Un z=Qx9t5}W7ud`!>2hcCB#Irrwy?9uh$Ci!EtsX#YV_kFy+i}ma55Ci~Dhr1llt9%&m zACTj>EyHll2I2aCOb3hdb=~h5jq)vbf*4_dK!6e~QIJe5RiPvlbUuessvWOU=V}{m z`y0=bA!{6Gw=Z7(#qoDl@5!(o(r^p*R#`No*wsWT(I33V9Yao1?@$o1?zBqP}^}CHeTg*Tta1ZWyo-Iyfcoxvt*>T7tV=Pz1)S z*8c15D&~T3`jdw%)&AWdF}+_K_J-H1z98K7)6Kg7dM>L9@zT-3A$naLr=>w~aOwWj zoY^!gD0Jp_cd+#%@9~~w0dmmttZCfIbGqiqqmixg$9FT|9G?5T)N@%@0rK&v4~##w z5McyIk?sRXAK??etGbKB5T3uMExIV6rq!w(Uzu16cDir+t502lQosBuK|~K8Dj~yt z0rrmxeEk;P%xxp6_MXZ6@n?0F%IGWB_uV6I<#&(hdO1PcLjf_^OjsZh{`0yG7lpXut9vg0G=`NkN=cdn(tBWf9>~}1 zelH)d-;fvh!B6pv)RokOb^YB4+H+(1Qmq{sqCm|GJiIQW^OPz zXJ{ML)(vK~RCO|0{Lev;JB?eb67WCho0Gern@K!}ue>v0hR}ufCv?<*AM)C{3zM$W zE3=6;u}(ZvfE-_mLyhBJA58W9#B}(BB9LIk6i`)S$g&^s5P(nwkOKGg6+6!?-aAYu z^~|oNxE%f1{?9^omGb7JE{+?szC?2lQzCa2f@3+I!>Y=1x<(C0c<{~`_x~67Ijko) z$Nt-%w^HZyJaxUZM2qHs+VdNlC>wYD$Rg{=8mG_m@0_;<fo9xu6j>aF-VPvod(9El=DdEd zy5=R1v}#s(L3Y`4TYkyu&uv{nwjRLA@a-NSZQ9kQ<=uA)|P@3C_ZB>j zbY7P*IABR0N0j8OKt7T$mFNJ$9WTbJQW;ovEIhs|ZNFoeih^nXpqZLs>R7DXGa>B+VOA5tBL{MVI5Eeoxi2-84K#DO2D-lr? zVkpImQ$mU&uh9Bje$V$mtNplCh%9t5XfR<32yNQ$rEf>GyPoX}qHKOm=Mw}%!YOLb z#qII`&AToxU}98Cyd4jhqu1K6@K|KRrD&uH1g>y)!x0W$SQT(eLV;s)M>O=CzV$_oQMf`sMTXk3~RQ2_#~X zSh6QhOTQ21wY_opTldF#)#f?e9}!*F{snzq$4j72sXRDQfdCt)!=9o#|D)Q6CyL2c z1C^fmd4E#BFHoPBXPq7Y)uIxei~&R}&HRA{5DSKnN7%BtRVsg9j9*85;5#}!`@?7^Db{d)`(><AlyyJXMVh(=c`iF|S%h{6S6F^$isfHuKEYu$*#dz_t8B zBXz$gMak-a34$L-C1JYWGBG+l2=atecG+kF%OlmH1Sx5#Lyx4fywuSw5O!bA|huZ9N6E|*fVB<5e8G|{5#YcW8U{{ z_t?zW_RrqgkVP97&NlkOw`n*X-@e-KFAK~N33~u1vr0k|NjL0_*~O7RScVh0r5hru zA7=Bbin?P6pfK$6gQH_^CD*6e?>tG9_6Gg+;p7Ma7uj7I(@sF)NvWk9pLrGJC` z{c?J{-sB=0JwISRR_@0J22hRme-iFw!~WNWAX4nOkM+|B4cktl&q?lXT_=)4KToPu z1JSCo_BTqR`J`JN?CwB~IdTqm)s~mxzzg3t^tfGPUM2`K~WGO>A>qSU3L4O@w{1?NioF|=DZrKuI<6?HFi)qNN_fUFOQ#( zwq-4T3@{k6#)G8p-&c3@w!l~+TA_E<{k`T1T>z)eT>iKZI7E8501e%u#h=ES|Lelh z=9CO#c*qmo=UN8eU$SLTz8}{)f!InLUm_$w8d$mWNb#UtrYn;^{7 zUhi~_607V&?v8(7*mzuQ^gsoXKqjE{${_(&OA0LlNKhaoLPz#Z5#qG6iUuc{+KrbL zkB#(Titm^&F=Rjh?T82jq0aq#EGl%I_<%vwmtaC5`&rJ=QO5k|`%M3F`9H_be;ihX zwML6s6tqN$*<~6(ZcK750*Dn91QZrU6jDnG;W9F11pr{$h=pZUu^=cm0G1GCswGBL zl?shQ&`SwyN>nHo2^6d-t4b2EsamQch}H#B3*Yp=&FQaFf`>hY1!AJ3Q1Ffp1Vzkz z%=CF*zeqQXl~N)Lp}+dO*Iz5vDLcu0m{89Y5J2)On6h2mPxRGz$}uVdIW2%y{%Pju zCjbNZ=lH;zArAsV$!Z0u04gbHi%Nl&M1ncd3mmT_(QTIOb(j7lB%Jl_c@Cp>@v=F1 zV6pzqyrVSO>r)>dgCYR_1`46@*U}!$iglfvI|16)qmeTX9_g^kQ0e{N$W26m4fI!f zISW3vuAEU`uZo=S1*w_}&yTSFJ*j>!{`Pytw(#hB(R10#04=kS_5S@=9T*Prhfkvc zGkaOmHwkRDX1Vm(c{%dwH2V&tMOD-?=tqCd2F0qx6-wX&-tM}4TiHU~a8tXQafav~ zwyuks@jEYu+x)!>9g$C;!QL-UJS{)BVy8fQKQ18jvT+In&p?*jkHt8m2ZFOI1#dEO zT>pvJ^w+549{KI}b-z7FWDjOXrgq+E6tCA z-rT=4?CC2%JMAu;STNr#f?4y9mm|OVP0Epq9Todj(RGfvHuiC~hUE!>5+{YS#2AEb|f=^HK z-}Qn3C(QudIN@y<90$o!S}%{04&2?ij@?i`(gFk*;1M(%MgJF()^qh?yo(?4O~apf zY>#gfTKM7ec4tfN$fMz^ou`RUX9G1(lJ^dX(41x+0`W9ZT@(uliXBf^;N*HqU^fv& z3NQptI-lPyW7^W}!Ca&WKmq{(84+XxHn=&M)ihduuV?UmE5L7GHjBnL%O&SKo~8F` z>r^-mYZNLWeruq51t?~;jBk-(&ENpuu{0X!u*n&ves0rMy|dJa;s}TmEPz5HLP(H^ zG7lLjN}&0A$)o>1bGO>SILYr@8eH`=&%Q(i^838~NEm`TIKm&E=xk{RMZ{(Jv!VI9-IoAx-!`4Y-?6Ig zn9)JtJ@$c-h96~_TsrzNI(pCN*Le%9n#GQTP|P44kBh_keJ{7|-1~Y#O)#2~&%qDj zm{ks7h#+z(J;jdIn2e9f$7p(A?hQ#z?BlyHdlSv##kLL{k^kS9RqT1;-}?vEb`D)azoqsx8EW8=zYG}FWc4dFiP3XqYn~z zh&XG~(>AcI&?%t7jkx4-vp^nCCuUZBA)Mx^=R4L^s&JGrnBpVv)0G?%k6u*gh6^3 z5;`|J98C%hDJce?rUs+>1}~^?5fLbFKl~S#*=+FbCyv4POuhNs|MoD0c+ij2SKDuN zkr5J58>acd*rx>jDG+IjahpGVgT2&I=QbLF*Yt4iJi6kKQCq(TQ2&4nHg2bb1)Z7< z$7Y=ketrs({oJ#>!SLfzq#V~R<6#q%^Tz+#@RK`Z2ePOtPkeuL-uY|0ST86WrtTb_ zAlQ&T+AbAA z*RH49&h}btfYItlwW=8n!nYbNcF%93;WTzA1_LwwTFTnzH*B{bZODr*|BU|p-xo3~ zlM$E$%+C0B0S9Iw92rRZGgZ({lc5fG{NhU+uOaMvmHANk_z#y|xI|s2+w`$&m_rMN z;>*9ghWxb}s2Z(5HfxKk`O=?^*|0()`Qy!m?`S8Q#%_KUboXqD=s=!p0PlwTtnS2j zN`RdDfCwaTTqLr^7~I2!f*8Gc);RjD8TC3J7q2bf?rmJ>J^W#_=ZYKW_|rdhe0Im? z+BEeB#A65ujZ6=QxMv{q8G$}g8Nbaw257sk2|S*0)apMF%*5s3eeeCI;;OQh0}u;C@}FC7?iif`sS#H0N0Iq>jmmZ~ zc<#i9ik%AXo?4D8$i$;LZk0e^=~Elt{JNoA|G3e1-SJo10`V#(^*4qMWd%#WbSoH% zPxfBsq+^bRC2u{qVY`hc+o#^D1!NdL5FFm< z{U(pr-pW%J0Bb(Fx-Zd)YGq%KCc%2!*=aA+6bqT-GoIoe9rH+ zU>B8|2fd-DJq|7x@!LJOR$VliMLrsUhzDk$MD$y)qk=$V`1&QUf?E&}!Q{G)E7_%i zP&SQghN`kMLLMpAdH%(}OL~LsW#7Wrs&wdk5#aWiQHgSPIccal>JHf5Zhu=-_9!XV zuAt{g-S{vOE&esu2YlpnR#ZS8JuT7y(fs|dC&Bz<9$Iypo|8Ywydaf*=KBq=LD*_I zGuym;Uq1K8OZ@YHO!UlhqWV6Ve0)ZAogMqg&uzcdz=#IN9y~7tjFX?1kmPvE#`FL7 z>m%uBBM2Z$J@-h&=>h}*UiGx}UD$Z*BniiNI?qY{b!sOYt>%U^s_?QCM@Kmmo^=_R z_yQpQf3HU6yAdiRZ;OFy?3DRpcNv+v)os^{I(QgJl#&TH znuE;ttq3Fb?<3n{KRtsdPBG&06i@`@R^x_f#%5eFcc&*4uJPYx`FZ&GM(L0})b9&c z@ECcG&`ae#akBD;))10qv+$yJnNI4j;)wv5Fg~LI8>>ZV=~@zC<*+Z(UHe!m;}9Zz z()0s*(et1NC-_hgr1D-)-`4eRYlw5AYYA$o)`br&_ZR{=ge2`-d1uWjg&5Hk*kk3^ z7$7ccvRP9Q`i7yqdt_jq6;MYEOpHK6hJsO?y%dMO5DFq@iQ8Xz|H{AL2h~5{FkbhY z)m2qfyTA4y_fkkNPj0{HWx5mmrvFjpVN0&M>#n-#QI>!UqKE|&5Het@_N`pwuCr34 zwMhu^VCGt{c+jYPFRin5y>fe<5%?2c5+roHK^3u zh7Hc}Ir(l7%)t=8QNKd5ouQUOs>&TK<=g%rhxb^_H-}UfF`atuS&r(YSSWRAy>X8h zHvjeioA|z(8zze*Qc61k3lsGW9n;JwesFo`(~hg$=+aR~hiR#JSwK`>1gf!?K?WhnEw?upD1|EJuA*|?Ky4b;&5rtle&_jtZNuRB#;0#_3(i71V;-!{6v>s z4b{x~?vFZ_D2Rv&O1Y9#eOJJMP5iiivn~Q?>oOmgMC3p(+Wh9>qS5+TZRrOk`@wx#sqFt}~M6CNuSf5k%-cWbI-i{0X^=K7ElmNcdeR+eu~QZMZa z!Z0lDGYZ!iv4bS3J)Scj!X`w~7_-IL*40?owYByZ3bqz4WMe07Y~cjBWyvItb6W%q zV;rxTs@J**W=xJKn%33J6VC;ynrqUhGB*M^%<;RY?gn^q*22RrI#N#+`2&1U*d*Eg zf6M-F^rbD)l@>)HEENJHnp#Z^7(v~Dp5AH0liF|QJ9n!Oak1XpwYJV_@uHGsu2o-UaB(^s|)=DP-ZaWptpXESAwlf$(KS5XMwgLMs@EC<;YTQCF%}{@$)e+IaQr zeLCr`nqyn*wxms2wNY?YPH~mIdH~1(jDjsqSG!_K=!4PV*waV5gX{mRpNK2C++XomOhrqz~chuz<#_3bO|7p z05a?OpT>{d@$RNNlC!u~TUms=;$f zS_Bj?IkG}Y7BC437!aOK==GX*$=qqXm(RM~Cgp^)^>o@NwcvIeVPnkfecV2oiOB}H zF;Fr3W%E{#B~&d%kt7H2Us=AihK({HeV?(hZcQ|U^mN-_xv@?)*7p4-{=fXeJrHz* z>=f;9QO_m{nS22NGsCoOn?X%yY1(s}KGC%N`Z-%xfMc-s6rF6$b|@5mPCRKZTEFor z=ESYCWW>`>y^Gijk{9Dq6CwgPz=j7KR|pA0G^+R^jf^F#qA2gJ4fS)v{kH;!uPC+0KtL3s?Ov~Jl9AjT|GXo*%gTGTVv@$EilWs}F`aa<*` zVGII@B6Cz2m0G0X+mmCg0*yowIM8xRZ5Qe;f?_I7esef49xoXs-+rTEwkAG+qA_*1 zEp0i-iQL41d>d%y_PaVh0ze0w%JUD=UNa~fHbV?=aab})0g9lMgpxsHNlGmW3?Pw< z83q9a-%B=f&ih`MO3Qc)Rl_~o@$>?RvM>KGE(_W>4q>VE8*D2`r+omv4Up|y0NiDST>>a!W8j7c$}VFom2v?N4w=hst%oG%rrJ?* zt0VX-q5YW-r<)1&|1a-*Om=BriqG4L>iih1YPQ@tqegn+v!9o)v-5GoYM-c!`P|1| z^Q+hHHQqQ^A@i$%l2=-10EC8`Xf)G7g|1j=qKnYfRMZw$Ue`+Y?YrSO$)wjzu%x#w zyxFXT==*C5E=fZy1CYR?#)Axl`>0?q)+{KP*aQu&uB)-Iu&l9dbD(krh6rqIT!H2z z35395F_9cFt09F^#T^VR0x|?~#>A_stD#1IcM-2l9AO1@UJV)$+f*m{Td5$Tzcmyx z35%XR+Jx?q_4?mmuh)vY9;thMs+8eomKJ|#aGyn;KhA$i`9D9$+pwQe>+Isr2gH=}(*58aiJ}hT0r;2q zx*pGNrso=beK9xNq~um^BMD}3v*8w}1eU`OC7mWJ(rv@)D{DpDfp7_q7Cb?nhQ01G zuF~l-Cs{FWT3YGO(af3#gF8z*%{F~>58hV^D{x3 z^uk!Jii92UORB$h$q&w=dmG<{mvv05gG7o`R;L2=$pEM_HLD~jIhhW}ZAPcufFgKu|?HvL2i zHo}Osjp(8VF+iNe7OO;La&h+50wur2JL5s_ZrJnM<2daEiQtb9&*0pN(ADb^GF54H zhPBcP>mCpU&q;|E#Z?d$DUTy@#=ZE>B;Cso6k(7-wjBcl*x<<&VzSV|hmIJrP)Uo+ zzAU+fHA?UW@Mz|uH0F-Xb8}u5YG+%{n9;|Mw=WZ~o#E})PP}xzsylPfQ+yUZ<+L}G zt{oNX^ziErzpW)+Ke^)bd74&&i~P@>G}brl`mdHj5`l(8PU`BcN%c!r9LfqA z3Wp5jx-58e#L&VwV#Ncq6kTTpxQ|Wr<=unyoZ!^t>?`~U>=%Y0(UlJN;c*%aNs=^j zKtmTez~~&Q8E6%A6|?2C0zZmrLU{HO=brCdwS;`Qa&4-6i+CUj!&o(emJELn=lu)8 zGRKdYja|qjfE4D%?{x=} z_Uv6%)*ljldY*5w`Z2rDEyjAPC|{fIpZbtOAPixyJYSd=_Q)7(_6R$oL=%|Lsk*4R zER>-9$4|&(n2b88_5xuQ;62p`*taGTzXtKY4TN2lV&chcaSPs+o-ymd8t?+`?Y2YZS1 zhmZ1WzNX>m__hxVS;ro4D9gsS04=-WpZXdG>9O2+rl8q<3W?idX7F2>+(W{2dG!ps zyk>5v?#KK!4)vuP!_watND`h(WwuV;|LkZnc%p&)E-kr%70^CiX1-tLYw?1m+q z#%}YE>}WUse;+JERz8w}!@%$~>=x&>Dy4(@oRpI(7l$Wh^;P}o+0ts)@Rsb*d@6t4 z(&@i zIKv6g?3rrAUSmKIB(&=D`^P}^$G|vW0itb}*x&p6yn6*R*4+AEe`f^mF55qo!a?$ zNDZS?N#NjmCXUy8-Y)w-zbC~AMxW5`Ez3pox#n`0o>^W8p~!%sdh3K>+p`)Uk6Cga z2leQSyodnfoIQTbZdjJx$o4sW`eB+h7rC7u`1{u>95QzPPb9tdxJ z&!^M7cfIeA&b=?(xcI(m-SOZG&`18X-)g^~ev)MH>|hj+gDFHJrF@_CpmrI2j%)q1 zg2F(b#ti<Vh|z(Xk*CT s=QBK>zhLkB${&vbjw&&@%3}B|0H}@rB8cSCM1TBU$rRy2LUzmch+ER!$N&HU diff --git a/R/trs.R b/R/trs.R index 9cb449c..8964859 100644 --- a/R/trs.R +++ b/R/trs.R @@ -1,6 +1,6 @@ -#' Resample time series +#' Resample time series for summary statistics #' -#' Resamples time series, and returns complete time series with new time resolution. +#' Resamples time series for summary statistics, and returns complete time series with new time resolution. #' (wind data is acceptable) #' #' If you have wind data (wind speed, and wind direction in dgree), please set 'wind' as 'TRUE', and set values for 'coliwd' and 'coliws'. @@ -9,12 +9,14 @@ #' @param bkip new resolution breaking input of time series, such as '1 hour'. #' @param st start time of resampling. The default value is the fisrt value of datetime column. #' @param et end time of resampling. The default value is the last value of datetime column. +#' @param fun a function to compute the summary statistics which can be applied to all data subsets: 'sum', 'mean', 'median', 'min', 'max', 'sd' and 'quantile'. +#' @param probs numeric vector of probabilities with values in \([0,1]\). #' @param na.rm logical value. Remove NA value or not? #' @param wind logical value. if TRUE, please set coliwd, coliws. #' @param coliws numeric value, column index of wind speed in dataframe. #' @param coliwd numeric value, column index of wind direction (degree) in dataframe. #' @param cpms logical value. Compensate the insufficient amount of the millisecond bit for datetime column. -#' @return a dataframe which contains a time series with a new time resolution. +#' @return a dataframe which contains a time series for summary statistics with a new time resolution. #' @export #' @examples #' trs(met, bkip = "1 hour", st = "2017-05-01 00:00:00", wind = TRUE, coliws = 4, coliwd = 5) @@ -22,7 +24,7 @@ #' @importFrom stats aggregate #' @importFrom lubridate duration -trs <- function(df, bkip, st = NULL, et = NULL, na.rm = TRUE, wind = FALSE, coliws = 2, coliwd = 3, cpms=TRUE){ +trs <- function(df, bkip, st = NULL, et = NULL, fun = 'mean', probs=0.5, na.rm = TRUE, wind = FALSE, coliws = 2, coliwd = 3, cpms=TRUE){ #remove rows showing NA in datatime df=df[!is.na(df[,1]),] @@ -80,8 +82,11 @@ trs <- function(df, bkip, st = NULL, et = NULL, na.rm = TRUE, wind = FALSE, coli #not need to insert et, just need to trunck by et (">="). df <- df[df[,1] <= et,] } - eval(parse(text = paste(c("datat <- aggregate(df[,-1], list(", colnames(df)[1], " = cut(df[,1], breaks = bkip)), mean, na.rm = na.rm)"),collapse = ""))) - + if(fun!="quantile"){ + eval(parse(text = paste(c("datat <- aggregate(df[,-1], list(", colnames(df)[1], " = cut(df[,1], breaks = bkip)), FUN=", fun, ", na.rm = na.rm)"),collapse = ""))) + }else{ + eval(parse(text = paste(c("datat <- aggregate(df[,-1], list(", colnames(df)[1], " = cut(df[,1], breaks = bkip)), FUN = 'quantile', probs=", probs, ", na.rm = na.rm)"),collapse = ""))) + } #convert ts according to type of bkip bkip_str = gsub("[^a-zA-Z]", "", bkip) bkip_str = tolower(bkip_str) diff --git a/R/tsplotp.R b/R/tsplotp.R index 2b2d9e6..d0ce587 100644 --- a/R/tsplotp.R +++ b/R/tsplotp.R @@ -15,7 +15,7 @@ #' @param lsz line size of panel border and axis in plot. #' @param tkl tick length in plot. #' @return a plot for the time series of particle size distribution. \cr - +#' #' @export #' @import ggplot2 #' @importFrom scales rescale pretty_breaks diff --git a/R/tuv.R b/R/tuv.R index a1f404d..c571c02 100644 --- a/R/tuv.R +++ b/R/tuv.R @@ -25,6 +25,7 @@ #' @param colid column index of date. The default value is 1. #' @return a dataframe.The first column is datetime. The second column is the solar altitude Angle. The rates of photolysis for each reaction(Unit: s-1) #' start from third column: 1 = O3 -> O2 + O1D +#' #' @export #' @importFrom stringr str_split_fixed #' @importFrom lubridate hours diff --git a/R/tuv_batch.R b/R/tuv_batch.R index aac0b3c..57da060 100644 --- a/R/tuv_batch.R +++ b/R/tuv_batch.R @@ -31,6 +31,7 @@ #' OutputMode 3: Weighted irradiance (27 weighting functions). \cr #' OutputMode 4: Spectral actinic flux. \cr #' OutputMode 5: Spectral irradiance. \cr +#' #' @export #' @importFrom lubridate hour minute second #' @importFrom utils read.delim setTxtProgressBar txtProgressBar diff --git a/R/tuv_core.R b/R/tuv_core.R index 34df964..0b3a878 100644 --- a/R/tuv_core.R +++ b/R/tuv_core.R @@ -32,6 +32,7 @@ #' OutputMode 3: Weighted irradiance (27 weighting functions). \cr #' OutputMode 4: Spectral actinic flux. \cr #' OutputMode 5: Spectral irradiance. \cr +#' @importFrom stats complete.cases tuv_core=function(wStart=280, wStop=420, wIntervals=140, inputMode=0, latitude=0, longitude=0, date=20150630, timeStamp="12:00:00", zenith=0, ozone=300, albedo=0.1, gAltitude=0, mAltitude=0, taucld=0.00, zbase=4.00, ztop=5.00, tauaer=0.235, ssaaer=0.990, alpha=1.000, time=12, outputMode=2, nStreams=-2, dirsun=1.0, difdn=1.0, difup=NA){ if(is.na(difup)&(outputMode==2|outputMode==4)){ @@ -44,10 +45,9 @@ tuv_core=function(wStart=280, wStop=420, wIntervals=140, inputMode=0, latitude=0 filetext=read.delim("file.txt") if(outputMode==2){ #PHOTOLYSIS RATES (1/sec) - photolysis_rates=filetext[23:135,] - phlydf=do.call(rbind.data.frame,strsplit(photolysis_rates, "\\s{4,}")) - phlydf[34,1]=paste0(" ", strsplit(filetext[56,], "\\s{2,}")[[1]][2]) - phlydf[34,2]=strsplit(filetext[56,], "\\s{2,}")[[1]][3] + photolysis_rates=filetext[19:131,] + phlydf=data.frame(do.call(rbind, strsplit(photolysis_rates, ' (?=[^ ]+$)', perl=TRUE))) + phlydf=phlydf[complete.cases(phlydf),] phlydf_value=data.frame(t(phlydf[,2])) names(phlydf_value)=phlydf[,1] return(phlydf_value) diff --git a/R/vocct.R b/R/vocct.R index 3e67f68..cd19309 100644 --- a/R/vocct.R +++ b/R/vocct.R @@ -24,6 +24,7 @@ #' If TRUE, VOC species in time series will be arranged according to VOC group, #' relative molecular weight, and MIR value. #' @param chn logical. Dose colnames present as Chinese? The default vaule is FALSE. +#' @param bvoc logical. Whether you want to list BVOC as a separate VOC group? The default vaule is TRUE. #' @return a list contains 9 tables: #' MW_Result: matched Molecular Weight (MW) value result; #' Con_ugm: time series of VOC mass concentration by species; @@ -41,7 +42,7 @@ #' @import magrittr #' @importFrom stringr str_split_fixed -vocct <- function(df, unit = "ppbv", t = 25, p = 101.325, stcd=FALSE, sortd =TRUE, chn=FALSE){ +vocct <- function(df, unit = "ppbv", t = 25, p = 101.325, stcd=FALSE, sortd =TRUE, chn=FALSE, bvoc=TRUE){ #In case df is not a dataframe. temp_col_name <- colnames(df) @@ -58,7 +59,7 @@ vocct <- function(df, unit = "ppbv", t = 25, p = 101.325, stcd=FALSE, sortd =TRU chemicalnames = gsub("\\i-", "iso-", chemicalnames) #build name_df - name_df = data.frame(name = chemicalnames,CAS = NA, Matched_Name = NA, MIR = NA, MW = NA, Group = NA, stringsAsFactors = FALSE) + name_df = data.frame(Name = chemicalnames,CAS = NA, Matched_Name = NA, MIR = NA, MW = NA, Group = NA, stringsAsFactors = FALSE) #search VOC name to get CAS Number from different sources, add cas, sources, mathed_name to name_df ##firstly by NIST @@ -87,13 +88,13 @@ vocct <- function(df, unit = "ppbv", t = 25, p = 101.325, stcd=FALSE, sortd =TRU #build name_df colnm_df = colnames(df)[2:ncol(df)] chemicalnames = ifelse(substr(colnm_df, 1, 1) == "X", sub("^.", "", colnm_df), colnm_df) - name_df = data.frame(name = chemicalnames,CAS = NA, Source = NA, Matched_Name = NA, MIR = NA, MW = NA, Group = NA, stringsAsFactors = FALSE) + name_df = data.frame(Name = chemicalnames,CAS = NA, Source = NA, Matched_Name = NA, MIR = NA, MW = NA, Group = NA, stringsAsFactors = FALSE) #match table by chinese name chn_name_db<-data.frame(str_split_fixed(gsub("\\/|\\,|\\-| ", "", datacas$chn), ';', 3))#change according to max chinese name vector for(k in 1:nrow(name_df)){ chn_df<-data.frame(str_split_fixed(gsub("\\,|\\-| ", "", datacas$chn), ';', 2)) - x=which(chn_df == gsub("\\,|\\,|\\-| ", "", name_df$name[k]), arr.ind = TRUE)[1] + x=which(chn_df == gsub("\\,|\\,|\\-| ", "", name_df$Name[k]), arr.ind = TRUE)[1] df_null=data.frame(datacas[x,]) if(nrow(df_null)!=0){ name_df$Matched_Name[as.numeric(k)] = df_null$Description[1] @@ -109,18 +110,24 @@ vocct <- function(df, unit = "ppbv", t = 25, p = 101.325, stcd=FALSE, sortd =TRU name_df$Group[is.na(name_df$Group)] = "Unknown" #set GROUP to BVOC for BVOC group - name_df$Group[name_df$CAS %in% c('80-56-8','127-91-3','78-79-5','138-86-3')] = "BVOC" - + if(bvoc==TRUE){ + name_df$Group[name_df$CAS %in% c('80-56-8','127-91-3','78-79-5','138-86-3')] = "BVOC" + } + #raw_order - name_df$raw_order = seq.int(nrow(name_df)) + name_df$Raw_order = seq.int(nrow(name_df)) #set order for voc species in df and name_df if(sortd==TRUE){ #order by 2 columns - name_df$Group <- factor(name_df$Group, levels = c("Alkanes", "Alkenes", "BVOC", "Alkynes", "Aromatic_Hydrocarbons", "Oxygenated_Organics", "Other_Organic_Compounds", "Unknown")) + if(bvoc==TRUE){ + name_df$Group <- factor(name_df$Group, levels = c("Alkanes", "Alkenes", "BVOC", "Alkynes", "Aromatic_Hydrocarbons", "Oxygenated_Organics", "Other_Organic_Compounds", "Unknown")) + }else{ + name_df$Group <- factor(name_df$Group, levels = c("Alkanes", "Alkenes", "Alkynes", "Aromatic_Hydrocarbons", "Oxygenated_Organics", "Other_Organic_Compounds", "Unknown")) + } name_df = name_df[with(name_df, order(Group, MW, MIR)), ] - df[,2:ncol(df)]=df[,name_df$raw_order+1] - colnames(df)[2:ncol(df)]=colnames(df)[name_df$raw_order+1] + df[,2:ncol(df)]=df[,name_df$Raw_order+1] + colnames(df)[2:ncol(df)]=colnames(df)[name_df$Raw_order+1] } #set concentration df, multiple df with MIR in name_df @@ -146,12 +153,21 @@ vocct <- function(df, unit = "ppbv", t = 25, p = 101.325, stcd=FALSE, sortd =TRU } #vector of group names - gn_list = c("Alkanes", "Alkenes", "BVOC", "Alkynes", "Aromatic_Hydrocarbons", "Oxygenated_Organics", "Other_Organic_Compounds", "Unknown") + if(bvoc==TRUE){ + gn_list = c("Alkanes", "Alkenes", "BVOC", "Alkynes", "Aromatic_Hydrocarbons", "Oxygenated_Organics", "Other_Organic_Compounds", "Unknown") + }else{ + gn_list = c("Alkanes", "Alkenes", "Alkynes", "Aromatic_Hydrocarbons", "Oxygenated_Organics", "Other_Organic_Compounds", "Unknown") + } #generate group df - Con_ppbv_group=data.frame(Time=df[,1], Alkanes=NA, Alkenes_exclude_BVOC=NA, BVOC=NA, Alkynes=NA, Aromatic_Hydrocarbons=NA, Oxygenated_Organics=NA, Other_Organic_Compounds=NA, Unknown=NA) - Con_ugm_group=data.frame(Time=df[,1], Alkanes=NA, Alkenes_exclude_BVOC=NA, BVOC=NA, Alkynes=NA, Aromatic_Hydrocarbons=NA, Oxygenated_Organics=NA, Other_Organic_Compounds=NA, Unknown=NA) - + if(bvoc==TRUE){ + Con_ppbv_group=data.frame(Time=df[,1], Alkanes=NA, Alkenes_exclude_BVOC=NA, BVOC=NA, Alkynes=NA, Aromatic_Hydrocarbons=NA, Oxygenated_Organics=NA, Other_Organic_Compounds=NA, Unknown=NA) + Con_ugm_group=data.frame(Time=df[,1], Alkanes=NA, Alkenes_exclude_BVOC=NA, BVOC=NA, Alkynes=NA, Aromatic_Hydrocarbons=NA, Oxygenated_Organics=NA, Other_Organic_Compounds=NA, Unknown=NA) + }else{ + Con_ppbv_group=data.frame(Time=df[,1], Alkanes=NA, Alkynes=NA, Aromatic_Hydrocarbons=NA, Oxygenated_Organics=NA, Other_Organic_Compounds=NA, Unknown=NA) + Con_ugm_group=data.frame(Time=df[,1], Alkanes=NA, Alkynes=NA, Aromatic_Hydrocarbons=NA, Oxygenated_Organics=NA, Other_Organic_Compounds=NA, Unknown=NA) + } + #sum up columns for(gn in 1:length(gn_list)){ gn_sub_index = which(name_df$Group == gn_list[gn]) @@ -165,42 +181,46 @@ vocct <- function(df, unit = "ppbv", t = 25, p = 101.325, stcd=FALSE, sortd =TRU } } } - - #Con_ugm_mean - Con_ugm_mean=data.frame(species=row.names(statdf(Con_ugm)[-1,]),mean=as.numeric(as.character(statdf(Con_ugm,n = 6)[-1,1]))) - Con_ugm_mean$Proportion=Con_ugm_mean$mean/sum(as.numeric(as.character(statdf(Con_ugm,n = 6)[-1,1])),na.rm = TRUE) - Con_ugm_mean$Proportion=round(Con_ugm_mean$Proportion,4) - Con_ugm_mean=Con_ugm_mean[with(Con_ugm_mean, order(-mean)), ] - - #Con_ppbv_mean - Con_ppbv_mean=data.frame(species=row.names(statdf(Con_ppbv)[-1,]),mean=as.numeric(as.character(statdf(Con_ppbv,n = 6)[-1,1]))) - Con_ppbv_mean$Proportion=Con_ppbv_mean$mean/sum(as.numeric(as.character(statdf(Con_ppbv,n = 6)[-1,1])),na.rm = TRUE) - Con_ppbv_mean$Proportion=round(Con_ppbv_mean$Proportion,4) - Con_ppbv_mean=Con_ppbv_mean[with(Con_ppbv_mean, order(-mean)), ] - - #Con_ugm_group_mean - Con_ugm_group_mean=data.frame(species=row.names(statdf(Con_ugm_group)[-1,]),mean=as.numeric(as.character(statdf(Con_ugm_group,n = 6)[-1,1]))) - Con_ugm_group_mean$Proportion=Con_ugm_group_mean$mean/sum(as.numeric(as.character(statdf(Con_ugm_group,n = 6)[-1,1])),na.rm = TRUE) - Con_ugm_group_mean$Proportion=round(Con_ugm_group_mean$Proportion,4) - Con_ugm_group_mean=Con_ugm_group_mean[with(Con_ugm_group_mean, order(-mean)), ] - - #Con_ppbv_group_mean - Con_ppbv_group_mean=data.frame(species=row.names(statdf(Con_ppbv_group)[-1,]),mean=as.numeric(as.character(statdf(Con_ppbv_group,n = 6)[-1,1]))) - Con_ppbv_group_mean$Proportion=Con_ppbv_group_mean$mean/sum(as.numeric(as.character(statdf(Con_ppbv_group,n = 6)[-1,1])),na.rm = TRUE) - Con_ppbv_group_mean$Proportion=round(Con_ppbv_group_mean$Proportion,4) - Con_ppbv_group_mean=Con_ppbv_group_mean[with(Con_ppbv_group_mean, order(-mean)), ] + + #remove NA columns + Con_ppbv_group <- Con_ppbv_group[,colSums(is.na(Con_ppbv_group))7]=NA +aqi2$NO2=aqi2$NO2*0.3 +geom_ts( + df=aqi2, + yl=c(3,2), + yr=6, + alist=c(3,2), + llist=6, + alab=list(bquote(NO[2]~" "), bquote(NO~" ")), + llab=list(bquote(O[3]~" ")), + yllab=bquote(NO[x]~" "~(ppbv)), + yrlab=bquote(O[3]~" "~(ppbv)), + lcc="#ff4d4f", + aff=c("#096dd9","#69c0ff"), +xlab="Datetime") +} diff --git a/man/geom_ts_batch.Rd b/man/geom_ts_batch.Rd new file mode 100644 index 0000000..618a97a --- /dev/null +++ b/man/geom_ts_batch.Rd @@ -0,0 +1,92 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/geom_ts_batch.r +\name{geom_ts_batch} +\alias{geom_ts_batch} +\title{Plot time series in batch} +\usage{ +geom_ts_batch( + df, + xlab = NULL, + ylab = NULL, + cclist = NULL, + bquote = FALSE, + breaks = waiver(), + date_breaks = waiver(), + labels = waiver(), + date_labels = waiver(), + minor_breaks = waiver(), + date_minor_breaks = waiver(), + expand = c(0, 0), + panelgap = 1 +) +} +\arguments{ +\item{df}{dataframe of time series.} + +\item{xlab}{text expression of x axis label. The default vaule is NULL.} + +\item{ylab}{text expression of y axis label. The default vaule is NULL.} + +\item{cclist}{vector, colors of lines. The default vaule is NULL.} + +\item{bquote}{logical value. Set to TRUE if you want to use bquote in labs (xlab and y lab). The default vaule is FALSE.} + +\item{breaks}{One of: +- `NULL` for no breaks +- `waiver()` for the breaks specified by `date_breaks` +- A `Date`/`POSIXct` vector giving positions of breaks +- A function that takes the limits as input and returns breaks as output} + +\item{date_breaks}{A string giving the distance between breaks like "2 +weeks", or "10 years". If both `breaks` and `date_breaks` are +specified, `date_breaks` wins.} + +\item{labels}{One of: +- `NULL` no labels +- `waiver()` for the default labels computed by the transformation object +- A character vector giving labels (must be same length as `breaks`) +- A function that takes the breaks as input and returns labels as output. + Also accepts rlang lambda function notation.} + +\item{date_labels}{A string giving the formatting specification for the +labels. Codes are defined in [strftime()]. If both `labels` +and `date_labels` are specified, `date_labels` wins.} + +\item{minor_breaks}{One of: +- `NULL` for no breaks +- `waiver()` for the breaks specified by `date_minor_breaks` +- A `Date`/`POSIXct` vector giving positions of minor breaks +- A function that takes the limits as input and returns minor breaks as + output} + +\item{date_minor_breaks}{A string giving the distance between minor breaks +like "2 weeks", or "10 years". If both `minor_breaks` and +`date_minor_breaks` are specified, `date_minor_breaks` wins.} + +\item{expand}{For position scales, a vector of range expansion constants used + to add some padding around the data to ensure that they are placed some +distance away from the axes. Use the convenience function expansion() to +generate the values for the expand argument. The defaults are to expand the +scale by 5% on each side for continuous variables, and by 0.6 units on each +side for discrete variables.} + +\item{panelgap}{gap of panels. The default vaule is 0.5.} +} +\description{ +Easy way to plot time series in batch. +} +\examples{ +#example 1 +geom_ts_batch(aqi) +#example 2 +xlab1="Time" +ylab1=c("NO","NO2","CO","SO2","O3") +geom_ts_batch(aqi, xlab=xlab1, ylab=ylab1) +#example 3 +xlab2=bquote(Time~"") +ylab2=list(bquote(NO~" "~(ppbv)), bquote(NO[2]~" + "~(ppbv)), bquote(CO~" "~(ppmv)), bquote(SO[2]~" + "~(ppbv)), bquote(O[3]~" "~(ppbv))) +cclist=c("#eb2f96", "#1890ff", "#52c41a", "#faad14", "#f5222d") +geom_ts_batch(aqi, xlab=xlab2, ylab=ylab2, cclist=cclist, bquote=TRUE) +} diff --git a/man/geom_tsw.Rd b/man/geom_tsw.Rd new file mode 100644 index 0000000..286db55 --- /dev/null +++ b/man/geom_tsw.Rd @@ -0,0 +1,43 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/geom_tsw.r +\name{geom_tsw} +\alias{geom_tsw} +\title{Plot time series} +\usage{ +geom_tsw( + df, + coliws = 2, + coliwd = 3, + lsize = 0.8, + psize = NA, + msize = 8, + tickx = 0.05, + ticky = -0.1, + tickwd = 270 +) +} +\arguments{ +\item{df}{dataframe contains time series.} + +\item{coliws}{column index of wind speed. The default vaule is 2.} + +\item{coliwd}{column index of wind direction. The default vaule is 3.} + +\item{lsize}{size of line (wind speed). The default vaule is 0.8.} + +\item{psize}{size of point (wind speed). The default vaule is NA.} + +\item{msize}{size of mark (wind direction). The default vaule is 8.} + +\item{tickx}{adjust value for the x position of wind direction legend. The default vaule is 0.05.} + +\item{ticky}{adjust value for the y position of wind direction legend. The default vaule is -0.1.} + +\item{tickwd}{direction of wind direction legend. The default vaule is 270.} +} +\description{ +Easy way to plot time series. +} +\examples{ +geom_tsw(met, coliws=4, coliwd=5) +} diff --git a/man/loh.Rd b/man/loh.Rd index 73547fb..709ae8f 100644 --- a/man/loh.Rd +++ b/man/loh.Rd @@ -12,7 +12,8 @@ loh( stcd = FALSE, sortd = TRUE, atk = TRUE, - chn = FALSE + chn = FALSE, + bvoc = TRUE ) } \arguments{ @@ -39,6 +40,8 @@ If TRUE, VOC species in time series will be arranged according to VOC group, \item{atk}{logical. use kOH value from atk or not? If not, kOH comes from 'AopWin v1.92' will be used. The default vaule is TRUE.} \item{chn}{logical. Dose colnames present as Chinese? The default vaule is FALSE.} + +\item{bvoc}{logical. Whether you want to list BVOC as a separate VOC group? The default vaule is TRUE.} } \value{ a list contains 5 tables: diff --git a/man/ofp.Rd b/man/ofp.Rd index c028559..cbd5fc0 100644 --- a/man/ofp.Rd +++ b/man/ofp.Rd @@ -13,7 +13,8 @@ ofp( stcd = FALSE, sortd = TRUE, chn = FALSE, - mtype = "usa" + mtype = "usa", + bvoc = TRUE ) } \arguments{ @@ -43,6 +44,8 @@ If TRUE, VOC species in time series will be arranged according to VOC group, \item{chn}{logical. Dose colnames present as Chinese? The default vaule is FALSE.} \item{mtype}{text. "usa" for MIR value from USA, "chn" for MIR value from CHINA.} + +\item{bvoc}{logical. Whether you want to list BVOC as a separate VOC group? The default vaule is TRUE.} } \value{ a list contains 5 tables: diff --git a/man/prop.Rd b/man/prop.Rd new file mode 100644 index 0000000..b077acb --- /dev/null +++ b/man/prop.Rd @@ -0,0 +1,24 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/prop.R +\name{prop} +\alias{prop} +\title{Convert time series into proportion time series} +\usage{ +prop(df, cmcase = FALSE) +} +\arguments{ +\item{df}{dataframe of time series.} + +\item{cmcase}{logical value. Set to TRUE if you only +want to retain cases which are complete, i.e., have +no missing values. The default vaule is FALSE.} +} +\value{ +a dataframe with proportion time series. +} +\description{ +Convert time series into proportion time series. +} +\examples{ +prop(voc) +} diff --git a/man/statdf.Rd b/man/statdf.Rd index 6e8124b..e6a2b36 100644 --- a/man/statdf.Rd +++ b/man/statdf.Rd @@ -4,15 +4,23 @@ \alias{statdf} \title{Summary of dataframe} \usage{ -statdf(x, n = 2) +statdf(df, n = 2, cmcase = FALSE, prop = FALSE) } \arguments{ -\item{x}{dataframe of time series.} +\item{df}{dataframe of time series.} \item{n}{digits for reuslt in dataframe.} + +\item{cmcase}{logical value. Set to TRUE if you only +want to summary cases which are complete, i.e., have +no missing values.} + +\item{prop}{logical value. Convert time series into +proportion time series before summary.} } \value{ -a dataframe, columns stands for parameters, rows stands for variables. +a dataframe, columns stands for parameters, +rows stands for variables. } \description{ Summary of dataframe. @@ -22,5 +30,5 @@ Summary of dataframe: mean, standard deviation (sd), minimum (min), percentiles (0.25, 0.50, 0.75), maximum (max). } \examples{ -statdf(aqi) +statdf(voc) } diff --git a/man/svri.Rd b/man/svri.Rd new file mode 100644 index 0000000..79ffbe9 --- /dev/null +++ b/man/svri.Rd @@ -0,0 +1,79 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/svri.R +\name{svri} +\alias{svri} +\title{Compute the variation of summary statistics} +\usage{ +svri( + df, + bkip = NULL, + mode = "recipes", + value = "day", + st = NULL, + et = NULL, + fun = "mean", + probs = 0.5, + na.rm = TRUE, + digits = 2, + wind = FALSE, + coliws = 2, + coliwd = 3, + sn = FALSE +) +} +\arguments{ +\item{df}{dataframe of time series.} + +\item{bkip}{the basic time reslution for variation, such as '1 hour'. If mode "custom" is selected, do not need to enter bkip.} + +\item{mode}{for calculating cycles: "recipes", "ncycle", "custom". +"recipes" means using internal setting for calculation. +"ncycle" means setting number of items for per cycle. +"custom" means using 1 column in dataframe as a list of grouping elements for calculation.} + +\item{value}{for detail setting of mode. Possible values for "recipes" are "day", "week", "month", year". +"day" equals to 24 (hours) values in 1 day. +"week" equals to 7 (days) values in 1 week. +"month" equals to 31 (days) values in 1 month. +"year" equals to 12 (months) values in 1 year. +values for "ncycle" is a number representing number of items in per cycle. +values for "custom" is a number representing column index in dataframe.} + +\item{st}{start time of resampling. The default value is the fisrt value of datetime column.} + +\item{et}{end time of resampling. The default value is the last value of datetime column.} + +\item{fun}{a function to compute the summary statistics which can be applied to all data subsets: 'sum', 'mean', 'median', 'min', 'max', 'sd' and 'quantile'.} + +\item{probs}{numeric vector of probabilities with values in \([0,1]\).} + +\item{na.rm}{logical value. Remove NA value or not?} + +\item{digits}{numeric value, digits for result dataframe.} + +\item{wind}{logical value. if TRUE, please set coliwd, coliws.} + +\item{coliws}{numeric value, column index of wind speed in dataframe.} + +\item{coliwd}{numeric value, column index of wind direction (degree) in dataframe.} + +\item{sn}{logical value. if TRUE, the results will be presented by scientific notation (string).} +} +\value{ +the variation of summary statistics +Note that when the pattern USES +"ncycle" or "custom", the start time determines the start time of the first +element in the average variation. For example, if the first timestamp of data is +"2010-05-01 12:00:00", the resolution is 1 hour, the mode is "ncycle", and the +value is 24, then the result represents diurnal variation starting from 12 o'clock. +} +\description{ +Compute the variation of summary statistics for time series. +} +\details{ +If you have wind data (wind speed, and wind direction in dgree), please set 'wind' as 'TRUE', and set values for 'coliwd' and 'coliws'. +} +\examples{ +svri(met, bkip = "1 hour", mode = "recipes", value = "day", fun = 'quantile', probs=0.5, +st = "2017-05-01 00:00:00") +} diff --git a/man/trs.Rd b/man/trs.Rd index 2b36247..ed7fa8c 100644 --- a/man/trs.Rd +++ b/man/trs.Rd @@ -2,13 +2,15 @@ % Please edit documentation in R/trs.R \name{trs} \alias{trs} -\title{Resample time series} +\title{Resample time series for summary statistics} \usage{ trs( df, bkip, st = NULL, et = NULL, + fun = "mean", + probs = 0.5, na.rm = TRUE, wind = FALSE, coliws = 2, @@ -25,6 +27,10 @@ trs( \item{et}{end time of resampling. The default value is the last value of datetime column.} +\item{fun}{a function to compute the summary statistics which can be applied to all data subsets: 'sum', 'mean', 'median', 'min', 'max', 'sd' and 'quantile'.} + +\item{probs}{numeric vector of probabilities with values in \([0,1]\).} + \item{na.rm}{logical value. Remove NA value or not?} \item{wind}{logical value. if TRUE, please set coliwd, coliws.} @@ -36,10 +42,10 @@ trs( \item{cpms}{logical value. Compensate the insufficient amount of the millisecond bit for datetime column.} } \value{ -a dataframe which contains a time series with a new time resolution. +a dataframe which contains a time series for summary statistics with a new time resolution. } \description{ -Resamples time series, and returns complete time series with new time resolution. +Resamples time series for summary statistics, and returns complete time series with new time resolution. (wind data is acceptable) } \details{ diff --git a/man/vocct.Rd b/man/vocct.Rd index 937b237..6763a59 100644 --- a/man/vocct.Rd +++ b/man/vocct.Rd @@ -11,7 +11,8 @@ vocct( p = 101.325, stcd = FALSE, sortd = TRUE, - chn = FALSE + chn = FALSE, + bvoc = TRUE ) } \arguments{ @@ -35,6 +36,8 @@ If TRUE, VOC species in time series will be arranged according to VOC group, relative molecular weight, and MIR value.} \item{chn}{logical. Dose colnames present as Chinese? The default vaule is FALSE.} + +\item{bvoc}{logical. Whether you want to list BVOC as a separate VOC group? The default vaule is TRUE.} } \value{ a list contains 9 tables: