gdata/0000755000176200001440000000000014705625112011335 5ustar liggesusersgdata/tests/0000755000176200001440000000000014631624774012512 5ustar liggesusersgdata/tests/test.humanReadable.Rout.save0000644000176200001440000002770414631624774020042 0ustar liggesusers R version 4.3.0 (2023-04-21) -- "Already Tomorrow" Copyright (C) 2023 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(gdata) Attaching package: 'gdata' The following object is masked from 'package:stats': nobs The following object is masked from 'package:utils': object.size The following object is masked from 'package:base': startsWith > > options(humanReadable=FALSE) > > set.seed(123456) > > baseSI <- 10 > powerSI <- seq(from=0, to=27, by=3) > SI0 <- (baseSI)^powerSI > k <- length(SI0) - 1 > SI1 <- SI0 - SI0 / c(2, runif(n=k, min=1.01, max=5.99)) > SI2 <- SI0 + SI0 / c(2, runif(n=k, min=1.01, max=5.99)) > > baseIEC <- 2 > powerIEC <- seq(from=0, to=90, by=10) > IEC0 <- (baseIEC)^powerIEC > IEC1 <- IEC0 - IEC0 / c(2, runif(n=k, min=1.01, max=5.99)) > IEC2 <- IEC0 + IEC0 / c(2, runif(n=k, min=1.01, max=5.99)) > > # Auto units, specify width > cbind(humanReadable(x=SI2, standard="SI", width=7), + humanReadable(x=SI2, standard="SI", width=5), + humanReadable(x=SI2, standard="SI", width=3), + humanReadable(x=IEC2, standard="IEC", width=7), + humanReadable(x=IEC2, standard="IEC", width=5), + humanReadable(x=IEC2, standard="IEC", width=3), + humanReadable(x=IEC2, standard="Unix", width=7), + humanReadable(x=IEC2, standard="Unix", width=5), + humanReadable(x=IEC2, standard="Unix", width=3)) [,1] [,2] [,3] [,4] [,5] [,6] [1,] " 2 B " " 2 B " " 2 B " " 2 B " " 2 B " " 2 B " [2,] "1.54215 kB" "1.542 kB" " 1.5 kB" "1.18582 KiB" "1.186 KiB" " 1.2 KiB" [3,] "1.20064 MB" "1.201 MB" " 1.2 MB" "1.19003 MiB" " 1.19 MiB" " 1.2 MiB" [4,] "1.25207 GB" "1.252 GB" " 1.3 GB" "1.54448 GiB" "1.544 GiB" " 1.5 GiB" [5,] "1.18121 TB" "1.181 TB" " 1.2 TB" "1.27667 TiB" "1.277 TiB" " 1.3 TiB" [6,] " 1.1853 PB" "1.185 PB" " 1.2 PB" "1.18733 PiB" "1.187 PiB" " 1.2 PiB" [7,] " 1.1678 EB" "1.168 EB" " 1.2 EB" "1.46271 EiB" "1.463 EiB" " 1.5 EiB" [8,] "1.18275 ZB" "1.183 ZB" " 1.2 ZB" "1.62382 ZiB" "1.624 ZiB" " 1.6 ZiB" [9,] "1.18568 YB" "1.186 YB" " 1.2 YB" "1.19557 YiB" "1.196 YiB" " 1.2 YiB" [10,] "1501.49 YB" " 1501 YB" "1501 YB" "1750.35 YiB" " 1750 YiB" "1750 YiB" [,7] [,8] [,9] [1,] " 2 B" " 2 B" " 2 B" [2,] "1.18582 K" "1.186 K" " 1.2 K" [3,] "1.19003 M" " 1.19 M" " 1.2 M" [4,] "1.54448 G" "1.544 G" " 1.5 G" [5,] "1.27667 T" "1.277 T" " 1.3 T" [6,] "1.18733 P" "1.187 P" " 1.2 P" [7,] "1.46271 E" "1.463 E" " 1.5 E" [8,] "1.62382 Z" "1.624 Z" " 1.6 Z" [9,] "1.19557 Y" "1.196 Y" " 1.2 Y" [10,] "1750.35 Y" " 1750 Y" "1750 Y" > > # Auto units, specify digits > cbind(humanReadable(x=SI2, standard="SI", width=NULL, digits=7), + humanReadable(x=SI2, standard="SI", width=NULL, digits=3), + humanReadable(x=SI2, standard="SI", width=NULL, digits=2), + humanReadable(x=SI2, standard="SI", width=NULL, digits=1), + humanReadable(x=IEC2, standard="IEC", width=NULL, digits=7), + humanReadable(x=IEC2, standard="IEC", width=NULL, digits=3), + humanReadable(x=IEC2, standard="IEC", width=NULL, digits=2), + humanReadable(x=IEC2, standard="IEC", width=NULL, digits=1), + humanReadable(x=IEC2, standard="Unix", width=NULL, digits=7), + humanReadable(x=IEC2, standard="Unix", width=NULL, digits=3), + humanReadable(x=IEC2, standard="Unix", width=NULL, digits=2), + humanReadable(x=IEC2, standard="Unix", width=NULL, digits=1)) [,1] [,2] [,3] [,4] [1,] " 1.5000000 B " " 1.500 B " " 1.50 B " " 1.5 B " [2,] " 1.5421535 kB" " 1.542 kB" " 1.54 kB" " 1.5 kB" [3,] " 1.2006426 MB" " 1.201 MB" " 1.20 MB" " 1.2 MB" [4,] " 1.2520737 GB" " 1.252 GB" " 1.25 GB" " 1.3 GB" [5,] " 1.1812105 TB" " 1.181 TB" " 1.18 TB" " 1.2 TB" [6,] " 1.1853010 PB" " 1.185 PB" " 1.19 PB" " 1.2 PB" [7,] " 1.1678048 EB" " 1.168 EB" " 1.17 EB" " 1.2 EB" [8,] " 1.1827531 ZB" " 1.183 ZB" " 1.18 ZB" " 1.2 ZB" [9,] " 1.1856788 YB" " 1.186 YB" " 1.19 YB" " 1.2 YB" [10,] "1501.4852409 YB" "1501.485 YB" "1501.49 YB" "1501.5 YB" [,5] [,6] [,7] [,8] [1,] " 1.5000000 B " " 1.500 B " " 1.50 B " " 1.5 B " [2,] " 1.1858248 KiB" " 1.186 KiB" " 1.19 KiB" " 1.2 KiB" [3,] " 1.1900302 MiB" " 1.190 MiB" " 1.19 MiB" " 1.2 MiB" [4,] " 1.5444791 GiB" " 1.544 GiB" " 1.54 GiB" " 1.5 GiB" [5,] " 1.2766723 TiB" " 1.277 TiB" " 1.28 TiB" " 1.3 TiB" [6,] " 1.1873270 PiB" " 1.187 PiB" " 1.19 PiB" " 1.2 PiB" [7,] " 1.4627144 EiB" " 1.463 EiB" " 1.46 EiB" " 1.5 EiB" [8,] " 1.6238214 ZiB" " 1.624 ZiB" " 1.62 ZiB" " 1.6 ZiB" [9,] " 1.1955693 YiB" " 1.196 YiB" " 1.20 YiB" " 1.2 YiB" [10,] "1750.3547972 YiB" "1750.355 YiB" "1750.35 YiB" "1750.4 YiB" [,9] [,10] [,11] [,12] [1,] " 1.5000000 B" " 1.500 B" " 1.50 B" " 1.5 B" [2,] " 1.1858248 K" " 1.186 K" " 1.19 K" " 1.2 K" [3,] " 1.1900302 M" " 1.190 M" " 1.19 M" " 1.2 M" [4,] " 1.5444791 G" " 1.544 G" " 1.54 G" " 1.5 G" [5,] " 1.2766723 T" " 1.277 T" " 1.28 T" " 1.3 T" [6,] " 1.1873270 P" " 1.187 P" " 1.19 P" " 1.2 P" [7,] " 1.4627144 E" " 1.463 E" " 1.46 E" " 1.5 E" [8,] " 1.6238214 Z" " 1.624 Z" " 1.62 Z" " 1.6 Z" [9,] " 1.1955693 Y" " 1.196 Y" " 1.20 Y" " 1.2 Y" [10,] "1750.3547972 Y" "1750.355 Y" "1750.35 Y" "1750.4 Y" > > # Single unit, specify width > cbind(humanReadable(x=SI1, units="GB", standard="SI", width=7), + humanReadable(x=SI1, units="GB", standard="SI", width=5), + humanReadable(x=SI1, units="GB", standard="SI", width=3), + humanReadable(x=IEC1, units="GiB", standard="IEC", width=7), + humanReadable(x=IEC1, units="GiB", standard="IEC", width=5), + humanReadable(x=IEC1, units="GiB", standard="IEC", width=3), + humanReadable(x=IEC1, units="G", standard="Unix", width=7), + humanReadable(x=IEC1, units="G", standard="Unix", width=5), + humanReadable(x=IEC1, units="G", standard="Unix", width=3)) [,1] [,2] [,3] [,4] [,5] [,6] [1,] "5e-10 GB" "5e-10 GB" "5e-10 GB" "5e-10 GiB" "5e-10 GiB" "5e-10 GiB" [2,] "8e-07 GB" "8e-07 GB" "8e-07 GB" "6e-07 GiB" "6e-07 GiB" "6e-07 GiB" [3,] "8e-04 GB" "8e-04 GB" "8e-04 GB" "8e-04 GiB" "8e-04 GiB" "8e-04 GiB" [4,] "7e-01 GB" "7e-01 GB" "7e-01 GB" "4e-01 GiB" "4e-01 GiB" "4e-01 GiB" [5,] "6e+02 GB" "6e+02 GB" "6e+02 GB" "3e+02 GiB" "3e+02 GiB" "3e+02 GiB" [6,] "6e+05 GB" "6e+05 GB" "6e+05 GB" "4e+05 GiB" "4e+05 GiB" "4e+05 GiB" [7,] "5e+08 GB" "5e+08 GB" "5e+08 GB" "5e+08 GiB" "5e+08 GiB" "5e+08 GiB" [8,] "7e+11 GB" "7e+11 GB" "7e+11 GB" "8e+11 GiB" "8e+11 GiB" "8e+11 GiB" [9,] "3e+14 GB" "3e+14 GB" "3e+14 GB" "9e+14 GiB" "9e+14 GiB" "9e+14 GiB" [10,] "8e+17 GB" "8e+17 GB" "8e+17 GB" "9e+17 GiB" "9e+17 GiB" "9e+17 GiB" [,7] [,8] [,9] [1,] "5e-10 G" "5e-10 G" "5e-10 G" [2,] "6e-07 G" "6e-07 G" "6e-07 G" [3,] "8e-04 G" "8e-04 G" "8e-04 G" [4,] "4e-01 G" "4e-01 G" "4e-01 G" [5,] "3e+02 G" "3e+02 G" "3e+02 G" [6,] "4e+05 G" "4e+05 G" "4e+05 G" [7,] "5e+08 G" "5e+08 G" "5e+08 G" [8,] "8e+11 G" "8e+11 G" "8e+11 G" [9,] "9e+14 G" "9e+14 G" "9e+14 G" [10,] "9e+17 G" "9e+17 G" "9e+17 G" > > # Single unit, specify digits > cbind(humanReadable(x=SI1, units="GB", standard="SI", width=NULL, digits=7), + humanReadable(x=SI1, units="GB", standard="SI", width=NULL, digits=3), + humanReadable(x=SI1, units="GB", standard="SI", width=NULL, digits=2), + humanReadable(x=SI1, units="GB", standard="SI", width=NULL, digits=1), + humanReadable(x=IEC1, units="GiB", standard="IEC", width=NULL, digits=7), + humanReadable(x=IEC1, units="GiB", standard="IEC", width=NULL, digits=3), + humanReadable(x=IEC1, units="GiB", standard="IEC", width=NULL, digits=2), + humanReadable(x=IEC1, units="GiB", standard="IEC", width=NULL, digits=1), + humanReadable(x=IEC1, units="G", standard="Unix", width=NULL, digits=7), + humanReadable(x=IEC1, units="G", standard="Unix", width=NULL, digits=3), + humanReadable(x=IEC1, units="G", standard="Unix", width=NULL, digits=2), + humanReadable(x=IEC1, units="G", standard="Unix", width=NULL, digits=1)) [,1] [,2] [,3] [,4] [1,] "5.000000e-10 GB" "5.00e-10 GB" "5.0e-10 GB" "5e-10 GB" [2,] "7.993163e-07 GB" "7.99e-07 GB" "8.0e-07 GB" "8e-07 GB" [3,] "7.900375e-04 GB" "7.90e-04 GB" "7.9e-04 GB" "8e-04 GB" [4,] "6.619855e-01 GB" "6.62e-01 GB" "6.6e-01 GB" "7e-01 GB" [5,] "6.311259e+02 GB" "6.31e+02 GB" "6.3e+02 GB" "6e+02 GB" [6,] "6.440324e+05 GB" "6.44e+05 GB" "6.4e+05 GB" "6e+05 GB" [7,] "4.994386e+08 GB" "4.99e+08 GB" "5.0e+08 GB" "5e+08 GB" [8,] "7.277869e+11 GB" "7.28e+11 GB" "7.3e+11 GB" "7e+11 GB" [9,] "3.291745e+14 GB" "3.29e+14 GB" "3.3e+14 GB" "3e+14 GB" [10,] "8.313511e+17 GB" "8.31e+17 GB" "8.3e+17 GB" "8e+17 GB" [,5] [,6] [,7] [,8] [1,] "4.656613e-10 GiB" "4.66e-10 GiB" "4.7e-10 GiB" "5e-10 GiB" [2,] "5.975956e-07 GiB" "5.98e-07 GiB" "6.0e-07 GiB" "6e-07 GiB" [3,] "7.764672e-04 GiB" "7.76e-04 GiB" "7.8e-04 GiB" "8e-04 GiB" [4,] "4.459146e-01 GiB" "4.46e-01 GiB" "4.5e-01 GiB" "4e-01 GiB" [5,] "2.985889e+02 GiB" "2.99e+02 GiB" "3.0e+02 GiB" "3e+02 GiB" [6,] "4.209112e+05 GiB" "4.21e+05 GiB" "4.2e+05 GiB" "4e+05 GiB" [7,] "4.983449e+08 GiB" "4.98e+08 GiB" "5.0e+08 GiB" "5e+08 GiB" [8,] "7.751081e+11 GiB" "7.75e+11 GiB" "7.8e+11 GiB" "8e+11 GiB" [9,] "8.756173e+14 GiB" "8.76e+14 GiB" "8.8e+14 GiB" "9e+14 GiB" [10,] "9.390947e+17 GiB" "9.39e+17 GiB" "9.4e+17 GiB" "9e+17 GiB" [,9] [,10] [,11] [,12] [1,] "4.656613e-10 G" "4.66e-10 G" "4.7e-10 G" "5e-10 G" [2,] "5.975956e-07 G" "5.98e-07 G" "6.0e-07 G" "6e-07 G" [3,] "7.764672e-04 G" "7.76e-04 G" "7.8e-04 G" "8e-04 G" [4,] "4.459146e-01 G" "4.46e-01 G" "4.5e-01 G" "4e-01 G" [5,] "2.985889e+02 G" "2.99e+02 G" "3.0e+02 G" "3e+02 G" [6,] "4.209112e+05 G" "4.21e+05 G" "4.2e+05 G" "4e+05 G" [7,] "4.983449e+08 G" "4.98e+08 G" "5.0e+08 G" "5e+08 G" [8,] "7.751081e+11 G" "7.75e+11 G" "7.8e+11 G" "8e+11 G" [9,] "8.756173e+14 G" "8.76e+14 G" "8.8e+14 G" "9e+14 G" [10,] "9.390947e+17 G" "9.39e+17 G" "9.4e+17 G" "9e+17 G" > > stopifnot(is.object_sizes(as.object_sizes(2^(1:30)))) > stopifnot(format(as.object_sizes(124)) == "124 bytes") > stopifnot(format(as.object_sizes(124e8), units="auto") == "11.5 GiB") > stopifnot(format(as.object_sizes(124e8), humanReadable=TRUE) == "11.5 GiB") > stopifnot(format(as.object_sizes(124e8), units="bytes") == "1.24e+10 bytes") > > tools::assertError(as.object_sizes(-1)) > tools::assertError(as.object_sizes("a")) > tools::assertError(as.object_sizes(list())) > tools::assertError(as.object_sizes(NULL)) > tools::assertError(as.object_sizes(0+1i)) > > stopifnot(format(as.object_sizes(1e40)) == "1e+40 bytes") > stopifnot(format(as.object_sizes(1e40), units="auto") == "8.271806e+15 YiB") > stopifnot(format(as.object_sizes(1e40), units="bytes") == "1e+40 bytes") > stopifnot(format(as.object_sizes(1e40), humanReadable=TRUE) == "8.271806e+15 YiB") > stopifnot(format(as.object_sizes(1e40), humanReadable=FALSE) == "1e+40 bytes") > > options(humanReadable=TRUE) > stopifnot(format(as.object_sizes(1e40)) == "8.271806e+15 YiB") > options(humanReadable=FALSE) > > proc.time() user system elapsed 0.105 0.008 0.108 gdata/tests/test.humanReadable.R0000644000176200001440000001064514631624774016351 0ustar liggesuserslibrary(gdata) options(humanReadable=FALSE) set.seed(123456) baseSI <- 10 powerSI <- seq(from=0, to=27, by=3) SI0 <- (baseSI)^powerSI k <- length(SI0) - 1 SI1 <- SI0 - SI0 / c(2, runif(n=k, min=1.01, max=5.99)) SI2 <- SI0 + SI0 / c(2, runif(n=k, min=1.01, max=5.99)) baseIEC <- 2 powerIEC <- seq(from=0, to=90, by=10) IEC0 <- (baseIEC)^powerIEC IEC1 <- IEC0 - IEC0 / c(2, runif(n=k, min=1.01, max=5.99)) IEC2 <- IEC0 + IEC0 / c(2, runif(n=k, min=1.01, max=5.99)) # Auto units, specify width cbind(humanReadable(x=SI2, standard="SI", width=7), humanReadable(x=SI2, standard="SI", width=5), humanReadable(x=SI2, standard="SI", width=3), humanReadable(x=IEC2, standard="IEC", width=7), humanReadable(x=IEC2, standard="IEC", width=5), humanReadable(x=IEC2, standard="IEC", width=3), humanReadable(x=IEC2, standard="Unix", width=7), humanReadable(x=IEC2, standard="Unix", width=5), humanReadable(x=IEC2, standard="Unix", width=3)) # Auto units, specify digits cbind(humanReadable(x=SI2, standard="SI", width=NULL, digits=7), humanReadable(x=SI2, standard="SI", width=NULL, digits=3), humanReadable(x=SI2, standard="SI", width=NULL, digits=2), humanReadable(x=SI2, standard="SI", width=NULL, digits=1), humanReadable(x=IEC2, standard="IEC", width=NULL, digits=7), humanReadable(x=IEC2, standard="IEC", width=NULL, digits=3), humanReadable(x=IEC2, standard="IEC", width=NULL, digits=2), humanReadable(x=IEC2, standard="IEC", width=NULL, digits=1), humanReadable(x=IEC2, standard="Unix", width=NULL, digits=7), humanReadable(x=IEC2, standard="Unix", width=NULL, digits=3), humanReadable(x=IEC2, standard="Unix", width=NULL, digits=2), humanReadable(x=IEC2, standard="Unix", width=NULL, digits=1)) # Single unit, specify width cbind(humanReadable(x=SI1, units="GB", standard="SI", width=7), humanReadable(x=SI1, units="GB", standard="SI", width=5), humanReadable(x=SI1, units="GB", standard="SI", width=3), humanReadable(x=IEC1, units="GiB", standard="IEC", width=7), humanReadable(x=IEC1, units="GiB", standard="IEC", width=5), humanReadable(x=IEC1, units="GiB", standard="IEC", width=3), humanReadable(x=IEC1, units="G", standard="Unix", width=7), humanReadable(x=IEC1, units="G", standard="Unix", width=5), humanReadable(x=IEC1, units="G", standard="Unix", width=3)) # Single unit, specify digits cbind(humanReadable(x=SI1, units="GB", standard="SI", width=NULL, digits=7), humanReadable(x=SI1, units="GB", standard="SI", width=NULL, digits=3), humanReadable(x=SI1, units="GB", standard="SI", width=NULL, digits=2), humanReadable(x=SI1, units="GB", standard="SI", width=NULL, digits=1), humanReadable(x=IEC1, units="GiB", standard="IEC", width=NULL, digits=7), humanReadable(x=IEC1, units="GiB", standard="IEC", width=NULL, digits=3), humanReadable(x=IEC1, units="GiB", standard="IEC", width=NULL, digits=2), humanReadable(x=IEC1, units="GiB", standard="IEC", width=NULL, digits=1), humanReadable(x=IEC1, units="G", standard="Unix", width=NULL, digits=7), humanReadable(x=IEC1, units="G", standard="Unix", width=NULL, digits=3), humanReadable(x=IEC1, units="G", standard="Unix", width=NULL, digits=2), humanReadable(x=IEC1, units="G", standard="Unix", width=NULL, digits=1)) stopifnot(is.object_sizes(as.object_sizes(2^(1:30)))) stopifnot(format(as.object_sizes(124)) == "124 bytes") stopifnot(format(as.object_sizes(124e8), units="auto") == "11.5 GiB") stopifnot(format(as.object_sizes(124e8), humanReadable=TRUE) == "11.5 GiB") stopifnot(format(as.object_sizes(124e8), units="bytes") == "1.24e+10 bytes") tools::assertError(as.object_sizes(-1)) tools::assertError(as.object_sizes("a")) tools::assertError(as.object_sizes(list())) tools::assertError(as.object_sizes(NULL)) tools::assertError(as.object_sizes(0+1i)) stopifnot(format(as.object_sizes(1e40)) == "1e+40 bytes") stopifnot(format(as.object_sizes(1e40), units="auto") == "8.271806e+15 YiB") stopifnot(format(as.object_sizes(1e40), units="bytes") == "1e+40 bytes") stopifnot(format(as.object_sizes(1e40), humanReadable=TRUE) == "8.271806e+15 YiB") stopifnot(format(as.object_sizes(1e40), humanReadable=FALSE) == "1e+40 bytes") options(humanReadable=TRUE) stopifnot(format(as.object_sizes(1e40)) == "8.271806e+15 YiB") options(humanReadable=FALSE) gdata/tests/unitTests/0000755000176200001440000000000014631624774014514 5ustar liggesusersgdata/tests/unitTests/runit.reorder.factor.R0000644000176200001440000000246514631624774020725 0ustar liggesusers## Test setup if(FALSE) { library("RUnit") library("gdata") } test.reorder.factor <- function() { tmp <- Sys.getlocale(category="LC_COLLATE") Sys.setlocale(category="LC_COLLATE", locale="C") ## Create a 4 level example factor levs <- c("PLACEBO", "300 MG", "600 MG", "1200 MG") trt <- factor(rep(x=levs, times=c(22, 24, 28, 26))) ## Change the order to something useful ## default "mixedsort" ordering trt2 <- reorder(trt) levsTest <- c("300 MG", "600 MG", "1200 MG", "PLACEBO") checkIdentical(levels(trt2), levsTest) ## Using indexes trt3 <- reorder(trt, new.order=c(4, 2, 3, 1)) levsTest <- c("PLACEBO", "300 MG", "600 MG", "1200 MG") checkIdentical(levels(trt3), levsTest) ## Using label names trt4 <- reorder(trt, new.order=c("PLACEBO", "300 MG", "600 MG", "1200 MG")) levsTest <- c("PLACEBO", "300 MG", "600 MG", "1200 MG") checkIdentical(levels(trt4), levsTest) ## Using frequency trt5 <- reorder(trt, X=as.numeric(trt), FUN=length) levsTest <- c("PLACEBO", "300 MG", "1200 MG", "600 MG") checkIdentical(levels(trt5), levsTest) ## Drop out the '300 MG' level trt6 <- reorder(trt, new.order=c("PLACEBO", "600 MG", "1200 MG")) levsTest <- c("PLACEBO", "600 MG", "1200 MG") checkIdentical(levels(trt6), levsTest) Sys.setlocale(category="LC_COLLATE", locale=tmp) } gdata/tests/unitTests/runit.cbindX.R0000644000176200001440000000412214631624774017205 0ustar liggesusers## Test setup if(FALSE) { library("RUnit") library("gdata") } test.cbindX <- function() { df1 <- data.frame(a=1:3, b=c("A", "B", "C")) df2 <- data.frame(c=as.character(1:5), a=5:1) ma1 <- matrix(as.character(1:4), nrow=2, ncol=2) ma2 <- matrix(1:6, nrow=3, ncol=2) df12test <- cbindX(df1, df2) df12stand <- data.frame(a=c(1:3, NA, NA), b=c("A", "B", "C", NA, NA), c=as.character(1:5), a=5:1) names(df12stand)[4] <- "a" checkEquals(df12test, df12stand) ma12test <- cbindX(ma1, ma2) ma12stand <- matrix(as.character(c(1, 3, 1, 4, 2, 4, 2, 5, NA, NA, 3, 6)), nrow=3, ncol=4, byrow=TRUE) checkEquals(ma12test, ma12stand) da11test <- cbindX(df1, ma1) da11stand <- data.frame(a=1:3, b=c("A", "B", "C"), as.character(c(1:2, NA)), as.character(c(3:4, NA))) names(da11stand)[3:4] <- c("1", "2") checkEquals(da11test, da11stand) tmpTest <- cbindX(df1, df2, ma1, ma2) tmpStand <- data.frame(a=c(1:3, NA, NA), b=c("A", "B", "C", NA, NA), c=as.character(1:5), a=5:1, as.character(c(1:2, NA, NA, NA)), as.character(c(3:4, NA, NA, NA)), c(1:3, NA, NA), c(4:6, NA, NA)) names(tmpStand)[4:8] <- c("a", "1", "2", "1", "2") checkEquals(tmpTest, tmpStand) tmpTest <- cbindX(ma1, ma2, df1, df2) tmpStand <- data.frame(as.character(c(1:2, NA, NA, NA)), as.character(c(3:4, NA, NA, NA)), as.character(c(1:3, NA, NA)), as.character(c(4:6, NA, NA)), a=c(1:3, NA, NA), b=c("A", "B", "C", NA, NA), c=as.character(1:5), a=5:1) names(tmpStand)[c(1:4, 8)] <- c("1", "2", "3", "4", "a") checkEquals(tmpTest, tmpStand) } gdata/tests/unitTests/runit.getDateTimeParts.R0000644000176200001440000000327614631624774021215 0ustar liggesusers## Test setup if(FALSE) { library("RUnit") library("gdata") } num <- 1 cha <- "a" fac <- factor("A") tYear <- as.character(c(2006, 1995, 1005, 3067)) tMonth <- c("01", "04", "06", "12") tDay <- c("01", "12", "22", "04") tDate <- paste(paste(tYear, tMonth, tDay, sep="-"), "GMT") tHour <- c("05", "16", "20", "03") tMin <- c("16", "40", "06", "52") tSec <- c("56", "34", "05", "15") tTime <- paste(tHour, tMin, tSec, sep=":") cDate <- as.Date(tDate) cDatePOSIXct <- as.POSIXct(tDate) cDatePOSIXlt <- as.POSIXlt(tDate) test.getYear <- function() { checkException(getYear(x=num)) checkException(getYear(x=cha)) checkException(getYear(x=fac)) checkIdentical(getYear(x=cDate), tYear) checkIdentical(getYear(x=cDatePOSIXct), tYear) checkIdentical(getYear(x=cDatePOSIXlt), tYear) } test.getMonth <- function() { checkException(getMonth(x=num)) checkException(getMonth(x=cha)) checkException(getMonth(x=fac)) checkIdentical(getMonth(x=cDate), tMonth) checkIdentical(getMonth(x=cDatePOSIXct), tMonth) checkIdentical(getMonth(x=cDatePOSIXlt), tMonth) } test.getDay <- function() { checkException(getDay(x=num)) checkException(getDay(x=cha)) checkException(getDay(x=fac)) checkIdentical(getDay(x=cDate), tDay) checkIdentical(getDay(x=cDatePOSIXct), tDay) checkIdentical(getDay(x=cDatePOSIXlt), tDay) } test.getHour <- function() { checkException(getHour(x=num)) checkException(getHour(x=cha)) checkException(getHour(x=fac)) } test.getMin <- function() { checkException(getMin(x=num)) checkException(getMin(x=cha)) checkException(getMin(x=fac)) } test.getSec <- function() { checkException(getSec(x=num)) checkException(getSec(x=cha)) checkException(getSec(x=fac)) } gdata/tests/unitTests/runit.trim.R0000644000176200001440000000162714631624774016760 0ustar liggesusers## Test setup if(FALSE) { library("RUnit") library("gdata") } test.trim <- function() { tmp <- Sys.getlocale(category="LC_COLLATE") Sys.setlocale(category="LC_COLLATE", locale="C") sTrim <- " this is an example string " sTrimR <- "this is an example string" fTrim <- factor(c(sTrim, sTrim, " A", " B ", " C ", "D ")) fTrimR <- factor(c(sTrimR, sTrimR, "A", "B", "C", "D")) lTrim <- list(s=rep(sTrim, times=6), f=fTrim, i=1:6) lTrimR <- list(s=rep(sTrimR, times=6), f=fTrimR, i=1:6) dfTrim <- as.data.frame(lTrim) dfTrimR <- as.data.frame(lTrimR) checkIdentical(trim(sTrim), sTrimR) checkIdentical(trim(fTrim), fTrimR) checkIdentical(levels(trim(fTrim, recode.factor=FALSE)), c("this is an example string", "C", "A", "B", "D")) checkIdentical(trim(lTrim), lTrimR) checkIdentical(trim(dfTrim), dfTrimR) Sys.setlocale(category="LC_COLLATE", locale=tmp) } gdata/tests/unitTests/runit.nPairs.R0000644000176200001440000000322014631624774017230 0ustar liggesusers## Test setup if(FALSE) { library("RUnit") library("gdata") } test.nPairs <- function() { ## 'x' must be a data.frame or a matrix x <- rpois(100, lambda=10) checkException(nPairs(x=x)) checkException(nPairs(x=table(x))) test <- data.frame(V1=c(1, 2, 3, 4, 5), V2=c(NA, 2, 3, 4, 5), V3=c(1, NA, NA, NA, NA), V4=c(1, 2, 3, NA, NA)) testCheck <- matrix(data=as.integer(c(5, 4, 1, 3, 4, 4, 0, 2, 1, 0, 1, 1, 3, 2, 1, 3)), nrow=4, ncol=4, byrow=TRUE) class(testCheck) <- c("nPairs", class(testCheck)) testCheckNames <- testCheck colnames(testCheckNames) <- rownames(testCheckNames) <- colnames(test) checkIdentical(nPairs(x=test), testCheckNames) checkIdentical(nPairs(x=test, names=FALSE), testCheck) checkIdentical(nPairs(x=as.matrix(test)), testCheckNames) checkIdentical(nPairs(x=as.matrix(test), names=FALSE), testCheck) testCheck <- cbind(testCheckNames, as.integer(c(5, 4, 0, 0))) class(testCheck) <- class(testCheckNames) colnames(testCheck) <- c(colnames(test), "all") checkIdentical(nPairs(x=test, margin=TRUE), testCheck) testCheckSumm <- matrix(data=as.integer(c(0, 1, 4, 2, 0, 0, 4, 2, 0, 1, 0, 0, 0, 1, 2, 0)), nrow=4, ncol=4, byrow=TRUE) dimnames(testCheckSumm) <- dimnames(testCheckNames) tmp <- summary(nPairs(x=test)) checkEquals(tmp, testCheckSumm) } gdata/tests/unitTests/runit.wideByFactor.R0000644000176200001440000000242014631624774020357 0ustar liggesusers## Test setup if(FALSE) { library("RUnit") library("gdata") } test.wideByFactor <- function() { n <- 10 f <- 2 tmp <- data.frame(y1=(1:n)/2, y2=(n:1)*2, f1=factor(rep(letters[1:f], n/2)), f2=factor(c(rep(c("M"), n/2), rep(c("F"), n/2))), c1=1:n, c2=2*(1:n)) ## 'x' must be a data.frame checkException(wideByFactor(x=1:10)) checkException(wideByFactor(x=matrix(1:10))) ## 'factor' can be only of length one checkException(wideByFactor(x=tmp, factor=c("f1", "f2"))) ## Column defined in 'factor' must be a factor checkException(wideByFactor(x=tmp, factor="c1")) tmp2 <- wideByFactor(x=tmp, factor="f1", common=c("c1", "c2"), sort=FALSE) checkEquals(tmp2[c("c1", "c2")], tmp[c("c1", "c2")]) checkEquals(names(tmp2), c("c1", "c2", "f1", "y1.a", "y2.a", "f2.a", "y1.b", "y2.b", "f2.b")) checkEquals(tmp2$y1.a, c(0.5, NA, 1.5, NA, 2.5, NA, 3.5, NA, 4.5, NA)) checkEquals(tmp2$f2.a, factor(c("M", NA, "M", NA, "M", NA, "F", NA, "F", NA))) tmp2 <- wideByFactor(x=tmp, factor="f1", common=c("c1", "c2"), sort=TRUE, keepFactor=FALSE) checkEquals(tmp2$f2.a, factor(c("M", "M", "M", "F", "F", NA, NA, NA, NA, NA))) checkEquals(names(tmp2), c("c1", "c2", "y1.a", "y2.a", "f2.a", "y1.b", "y2.b", "f2.b")) } gdata/tests/unitTests/runit.trimSum.R0000644000176200001440000000142114631624774017435 0ustar liggesusers## Test setup if(FALSE) { library("RUnit") library("gdata") } test.trimSum <- function() { ## 'x' must be a vector - for now checkException(trimSum(matrix(1:10))) checkException(trimSum(data.frame(1:10))) checkException(trimSum(list(1:10))) ## 'x' must be numeric checkException(trimSum(letters)) ## 'n' must be smaller than the length of x checkException(trimSum(x=1:10, n=11)) checkException(trimSum(x=1, n=1)) ## Default x <- trimSum(x=1:10, n=5) x2 <- c(1:4, 45) checkEquals(x, x2) ## Left x <- trimSum(x=1:10, n=5, right=FALSE) x2 <- c(21, 7:10) checkEquals(x, x2) ## NA x <- trimSum(x=c(1:9, NA), n=5) x2 <- c(1:4, NA) checkEquals(x, x2) x <- trimSum(x=c(1:9, NA), n=5, na.rm=TRUE) x2 <- c(1:4, 35) checkEquals(x, x2) } gdata/tests/unitTests/Makefile0000644000176200001440000000056114705613304016143 0ustar liggesusersTOP=../.. PKG=${shell cd ${TOP};pwd} SUITE=runRUnitTests.R test: # Run unit tests Rscript ${SUITE} all: inst test echo: # Echo env. variables @echo "Package folder: ${PKG}" @echo "R binary: ${R}" help: # Help @echo -e '\nTarget: Dependency # Description'; \ echo '=================================================='; \ egrep '^[[:alnum:].+_()%]*:' ./Makefile gdata/tests/unitTests/runit.mapLevels.R0000644000176200001440000002261414631624774017734 0ustar liggesusers## Test setup if(FALSE) { library("RUnit") library("gdata") } test.mapLevels <- function() { ## Integer and numeric checkException(mapLevels(1:3)) # wrong class(x) checkException(mapLevels(1.5)) # wrong class(x) ## Factor f <- factor(c("B", "C", "A")) fMapInt <- list(A=as.integer(1), B=as.integer(2), C=as.integer(3)) fMapInt1 <- list(B=as.integer(1), C=as.integer(2)) fMapCha <- list(A="A", B="B", C="C") fMapInt <- as.levelsMap(fMapInt) fMapInt1 <- as.levelsMap(fMapInt1) fMapCha <- as.levelsMap(fMapCha) fMapCha1 <- fMapCha[c(1, 3)] # this will test also [.levelsMap checkIdentical(mapLevels(f), fMapInt) checkTrue(is.levelsMap(mapLevels(f))) # test for is.levelsMap checkTrue(is.levelsMap(fMapInt)) # test for as.levelsMap checkTrue(!gdata:::.isCharacterMap(fMapInt)) checkIdentical(mapLevels(f, sort=FALSE), fMapInt) # sort is not used for factors checkIdentical(mapLevels(f[1:2], drop=TRUE), fMapInt1) checkIdentical(mapLevels(f, codes=FALSE), fMapCha) checkIdentical(mapLevels(f[c(2, 3)], drop=TRUE, codes=FALSE), fMapCha1) ## Character cha <- c("Z", "M", "A") chaMapInt <- list(A=as.integer(1), M=as.integer(2), Z=as.integer(3)) chaMapIntO <- list(Z=as.integer(1), M=as.integer(2), A=as.integer(3)) chaMapInt1 <- list(M=as.integer(1), Z=as.integer(2)) chaMapCha <- list(A="A", M="M", Z="Z") chaMapInt <- as.levelsMap(chaMapInt) chaMapIntO <- as.levelsMap(chaMapIntO) chaMapInt1 <- as.levelsMap(chaMapInt1) chaMapCha <- as.levelsMap(chaMapCha) checkIdentical(mapLevels(cha), chaMapInt) checkIdentical(mapLevels(cha, sort=FALSE), chaMapIntO) # sort works for characters checkIdentical(mapLevels(cha[1:2], drop=TRUE), chaMapInt1) checkIdentical(mapLevels(cha, codes=FALSE), chaMapCha) ## List l <- list(f=f, cha=cha) l1 <- list(cha=cha, f=f) l2 <- list(cha=cha, f=f, i=1:10) lMapInt <- list(f=fMapInt, cha=chaMapInt) lMapCha <- list(f=fMapCha, cha=chaMapCha) lMapInt <- as.listLevelsMap(lMapInt) lMapCha <- as.listLevelsMap(lMapCha) lMapChaC <- as.list(sort(unique(c(cha, as.character(f))))) lMapChaCO <- as.list(unique(c(cha, as.character(f)))) names(lMapChaC) <- unlist(lMapChaC) names(lMapChaCO) <- unlist(lMapChaCO) lMapChaC <- as.levelsMap(lMapChaC) lMapChaCO <- as.levelsMap(lMapChaCO) checkIdentical(mapLevels(l), lMapInt) checkTrue(is.listLevelsMap(mapLevels(l))) # test for is.listLevelsMap checkTrue(is.listLevelsMap(lMapInt)) # test for as.listLevelsMap checkIdentical(mapLevels(l, codes=FALSE), lMapCha) checkException(mapLevels(l, combine=TRUE)) # can not combine integer maps checkIdentical(mapLevels(l, codes=FALSE, combine=TRUE), lMapChaC) checkIdentical(mapLevels(l1, codes=FALSE, combine=TRUE), lMapChaC) checkIdentical(mapLevels(l1, codes=FALSE, combine=TRUE, sort=FALSE), lMapChaCO) checkException(mapLevels(l2)) # only char and factor ## Data.frame df <- data.frame(f1=factor(c("G", "Abc", "Abc", "D", "F")), f2=factor(c("Abc", "Abc", "B", "D", "K")), cha=c("jkl", "A", "D", "K", "L"), int=1:5) dfMapInt <- list(f1=mapLevels(df$f1), f2=mapLevels(df$f2), cha=mapLevels(df$cha)) dfMapInt <- as.listLevelsMap(dfMapInt) dfMapInt1 <- dfMapInt[c(1, 3)] # this will test also [.listLevelsMap checkException(mapLevels(df)) # wrong class of int checkIdentical(mapLevels(df[, 1:3]), dfMapInt) checkIdentical(mapLevels(df[, c(1, 3)]), dfMapInt1) } test.checkLevelsMap <- function(x) { ## levelsMap ## not a list checkException(gdata:::.checkLevelsMap(x="A", method="raw")) ## list without names checkException(gdata:::.checkLevelsMap(x=list("A"), method="raw")) fMapInt <- list(A=as.integer(1), B=as.integer(2), C=as.integer(3)) ## x should be levelsMap checkException(gdata:::.checkLevelsMap(x=fMapInt, method="class")) ## listLevelsMap map <- list(as.levelsMap(fMapInt), as.levelsMap(fMapInt)) map1 <- list(fMapInt, fMapInt) class(map1) <- "listLevelsMap" ## x should be a listLevelsMap checkException(gdata:::.checkListLevelsMap(x=map, method="class")) ## x should be also a list of levelsMaps checkException(gdata:::.checkListLevelsMap(x=map1, method="class")) ## the rest is done with levelsMap tests } test.cLevelsMap <- function() { f1 <- factor(letters[c(2, 1)]) f2 <- factor(letters[c(3, 1, 2)]) mapCha1 <- mapLevels(f1, codes=FALSE) # get maps mapCha2 <- mapLevels(f2, codes=FALSE) mapCha1S <- mapLevels(as.character(f1), codes=FALSE, sort=FALSE) mapCha2S <- mapLevels(as.character(f2), codes=FALSE, sort=FALSE) mapChaTest <- list(a="a", b="b") mapChaTest1 <- list(a="a", b="b", c="c") mapChaTest2 <- list(c="c", a="a", b="b") class(mapChaTest) <- class(mapChaTest1) <- class(mapChaTest2) <- "levelsMap" mapChaTest3 <- list(mapChaTest, mapChaTest1, mapChaTest, mapChaTest1) class(mapChaTest3) <- "listLevelsMap" checkIdentical(c(mapCha1), mapChaTest) checkIdentical(c(mapCha2, mapCha1), mapChaTest1) checkIdentical(c(mapCha2S, mapCha1S, sort=FALSE), mapChaTest2) l <- list(f1, f2) mapCha <- mapLevels(l, codes=FALSE) checkIdentical(c(mapCha, mapCha), mapChaTest3) checkIdentical(c(mapCha, recursive=TRUE), mapChaTest1) checkException(c(mapLevels(f1))) # can not combine integer "levelsMaps" ## Example with maps of different length of components map1 <- list(A=c("a", "e", "i", "o", "u"), B="b", C="c", C="m", D=c("d", "e"), F="f") map2 <- list(A=c("a", "z", "w", "y", "x"), F="f", G=c("g", "h", "j"), i="i", k=c("k", "l"), B="B") map0Test <- list(A=c("a", "e", "i", "o", "u"), B="b", C="c", C="m", D=c("d", "e"), F="f", A=c("z", "w", "y", "x"), G=c("g", "h", "j"), i="i", k=c("k", "l"), B="B") map0Test <- as.levelsMap(map0Test) mapTest <- sort(map0Test) map1 <- as.levelsMap(map1) map2 <- as.levelsMap(map2) map <- c(map1, map2) map0 <- c(map1, map2, sort=FALSE) checkIdentical(map, mapTest) checkIdentical(map0, map0Test) } test.uniqueLevelsMap <- function() { map <- list(A=c(1, 2, 1, 3), B=4, C=1, C=5, D=c(6, 8), E=7, B=4, D=c(6, 8)) map1 <- map map1[[1]] <- map[[1]][c(1, 2, 4)] map1[[7]] <- NULL # remove B=4 map1[[7]] <- NULL # remove D=c(6, 8) ## unique (used in as.levelsMap), will remove duplicates (A=1) checkIdentical(as.levelsMap(map1), as.levelsMap(map)) } "test.mapLevels<-" <- function() { ## Some errors checkException("mapLevels<-"(1.1, value=2)) # wrong class(x) checkException("mapLevels<-"(complex(1.1), value=2)) # wrong class(x) f <- factor(c("A", "B", "C")) fMapInt <- mapLevels(f) ## Can not apply integer "levelsMap" to "character" checkException("mapLevels<-"(as.character(f), value=fMapInt)) fMapCha <- mapLevels(f, codes=FALSE) ## Can not apply character levelsMap to "integer" checkException("mapLevels<-"(as.integer(f), value=chaMapCha)) fMapFuzz <- fMapInt fMapFuzz[[1]] <- "A" ## All components of 'value' must be of the same class checkException("mapLevels<-"(as.character(f), value=fMapFuzz)) checkException("mapLevels<-"(as.integer(f), value=fMapFuzz)) ## x integer, value integer levelsMap f <- factor(letters[c(10, 15, 1, 2)]) fMapInt <- mapLevels(f) fInt <- as.integer(f) mapLevels(fInt) <- fMapInt checkIdentical(fInt, f) ## x factor, value integer levelsMap fInt <- factor(as.integer(f)) mapLevels(fInt) <- fMapInt checkIdentical(fInt, f) ## Above is essentially the same as levels<-.factor fInt1 <- factor(as.integer(f)) levels(fInt1) <- fMapInt checkIdentical(fInt1, f) ## x character, value character levelsMap cha <- c("B", "A", "C") chaMapCha <- as.levelsMap(list(A1="A", B2="B", C3="C")) mapLevels(cha) <- chaMapCha chaTest <- factor(c("B2", "A1", "C3")) checkIdentical(cha, chaTest) ## and a bit more for components of length > 1 cha <- c("G", "I", "B", "A", "C", "D", "Z") chaMapCha <- as.levelsMap(list(A1=c("A", "G", "I"), B2="B", C3=c("C", "D"))) mapLevels(cha) <- chaMapCha chaTest <- factor(c("A1", "A1", "B2", "A1", "C3", "C3", NA)) checkIdentical(cha, chaTest) ## x factor, value character levelsMap f <- factor(c("G", "I", "B", "A", "C", "D", "Z")) fMapCha <- as.levelsMap(list(A1=c("A", "G", "I"), B2="B", C3=c("C", "D"))) mapLevels(f) <- fMapCha fTest <- factor(c("A1", "A1", "B2", "A1", "C3", "C3", NA)) checkIdentical(f, fTest) ## Two factors and character map f1 <- factor(letters[1:10]) f2 <- factor(letters[5:14]) checkIdentical(as.integer(f1), as.integer(f2)) # the same integer codes mapCha1 <- mapLevels(f1, codes=FALSE) # get maps mapCha2 <- mapLevels(f2, codes=FALSE) mapCha <- c(mapCha1, mapCha2) # combine maps ## apply map mapLevels(f1) <- mapCha # the same as levels(f1) <- mapCha mapLevels(f2) <- mapCha # the same as levels(f2) <- mapCha checkIdentical(as.integer(f1), 1:10) # \ internal codes are now checkIdentical(as.integer(f2), 5:14) # / "consistent" among factors ## The same with list l <- list(f1=f1, f2=f2) mapCha <- mapLevels(l, codes=FALSE, combine=TRUE) mapLevels(l) <- mapCha checkIdentical(as.integer(l$f1), 1:10) # \ internal codes are now checkIdentical(as.integer(l$f2), 5:14) # / "consistent" among factors ## and data.frame df <- data.frame(f1=f1, f2=f2) mapCha <- mapLevels(df, codes=FALSE, combine=TRUE) mapLevels(df) <- mapCha checkIdentical(as.integer(df$f1), 1:10) # \ internal codes are now checkIdentical(as.integer(df$f2), 5:14) # / "consistent" among factors } gdata/tests/unitTests/runit.drop.levels.R0000644000176200001440000000071314631624774020235 0ustar liggesusers## Test setup if(FALSE) { library("RUnit") library("gdata") } test.drop.levels <- function() { f <- factor(c("A", "B", "C", "D"))[1:3] fDrop <- factor(c("A", "B", "C")) l <- list(f=f, i=1:3, c=c("A", "B", "D")) lDrop <- list(f=fDrop, i=1:3, c=c("A", "B", "D")) df <- as.data.frame(l) dfDrop <- as.data.frame(lDrop) checkIdentical(drop.levels(f), fDrop) checkIdentical(drop.levels(l), lDrop) checkIdentical(drop.levels(df), dfDrop) } gdata/tests/unitTests/runit.write.fwf.R0000644000176200001440000001242414631624774017715 0ustar liggesusers## Test setup if(FALSE) { library("RUnit") library("gdata") } test.write.fwf <- function() { ## 'x' must be a data.frame or matrix checkException(write.fwf(1:10)) checkException(write.fwf(list(1:10))) ## Only single value is allowed in 'na' checkException(write.fwf(data.frame(1:10, letters[1:10]), na=c("", " "))) ## Example dataset num <- round(c(733070.345678, 1214213.78765456, 553823.798765678, 1085022.8876545678, 571063.88765456, 606718.3876545678, 1053686.6, 971024.187656, 631193.398765456, 879431.1), digits=3) testData <- data.frame(num1=c(1:10, NA), num2=c(NA, seq(from=1, to=5.5, by=0.5)), num3=c(NA, num), int1=c(as.integer(1:4), NA, as.integer(4:9)), fac1=factor(c(NA, letters[1:9], "hjh")), fac2=factor(c(letters[6:15], NA)), cha1=c(letters[17:26], NA), cha2=c(NA, "longer", letters[25:17]), stringsAsFactors=FALSE) levels(testData$fac1) <- c(levels(testData$fac1), "unusedLevel") testData$Date <- as.Date("1900-1-1") testData$Date[2] <- NA testData$POSIXt <- as.POSIXct(strptime("1900-1-1 01:01:01", format="%Y-%m-%d %H:%M:%S")) testData$POSIXt[5] <- NA ## Output ## is tested with regular tests ## formatInfo ## Default output formatInfoT <- data.frame(colname=c("num1", "num2"), nlevels=c(0, 0), position=c(1, 4), width=c(2, 3), digits=c(0, 1), exp=c(0, 0), stringsAsFactors=FALSE) testData1 <- testData[, c("num1", "num2")] testData1M <- as.matrix(testData1) formatInfo <- write.fwf(testData1, formatInfo=TRUE) checkEquals(formatInfo, formatInfoT) formatInfoM <- write.fwf(testData1M, formatInfo=TRUE) checkEquals(formatInfoM, formatInfoT) ## Scientific notation dd <- options("digits"); options(digits = 7) testData2 <- data.frame(a=123, b=pi, c=1e8, d=1e222) formatInfo <- write.fwf(x=testData2, formatInfo=TRUE) checkEquals(formatInfo$width, c(3, 8, 5, 6)) checkEquals(formatInfo$digits, c(0, 6, 0, 0)) checkEquals(formatInfo$exp, c(0, 0, 2, 3)) options(dd) ## reset old options ## 'na' can either decrease or increase the width ## --> values of int1 have width 1 and using na="" should not increase ## the width formatInfo <- write.fwf(testData[, "int1", drop=FALSE], formatInfo=TRUE, na="") checkEquals(formatInfo$width, 1) ## --> values of int1 have width 1 and using na="1234" should increase ## the width to 4 formatInfo <- write.fwf(testData[, "int1", drop=FALSE], formatInfo=TRUE, na="1234") checkEquals(formatInfo$width, 4) ## rowCol formatInfoTR <- data.frame(colname=c("row", "num1", "num2"), nlevels=c(11, 0, 0), position=c(1, 4, 7), width=c(2, 2, 3), digits=c(0, 0, 1), exp=c(0, 0, 0), stringsAsFactors=FALSE) testData3 <- testData[, c("num1", "num2")] testData3M <- as.matrix(testData3) formatInfoR <- write.fwf(testData3, formatInfo=TRUE, rownames=TRUE, rowCol="row") checkEquals(formatInfoR, formatInfoTR) formatInfoR <- write.fwf(testData3M, formatInfo=TRUE, rownames=TRUE, rowCol="row") checkEquals(formatInfoR, formatInfoTR) ## QuoteInfo alone does not have any effect formatInfoI <- write.fwf(testData3, formatInfo=TRUE, quoteInfo=TRUE) checkEquals(formatInfoI, formatInfoT) formatInfoI <- write.fwf(testData3M, formatInfo=TRUE, quoteInfo=TRUE) checkEquals(formatInfoI, formatInfoT) ## Quote formatInfoTQ <- formatInfoT formatInfoTQ$position <- c(1, 6) formatInfoTQ$width <- c(4, 5) formatInfoQ <- write.fwf(testData3, formatInfo=TRUE, quote=TRUE) checkEquals(formatInfoQ, formatInfoTQ) formatInfoQ <- write.fwf(testData3M, formatInfo=TRUE, quote=TRUE) checkEquals(formatInfoQ, formatInfoTQ) ## Quote without quoteInfo formatInfoTQI <- formatInfoT formatInfoTQI$position <- c(2, 6) formatInfoQI <- write.fwf(testData3, formatInfo=TRUE, quote=TRUE, quoteInfo=FALSE) checkEquals(formatInfoQI, formatInfoTQI) formatInfoQI <- write.fwf(testData3M, formatInfo=TRUE, quote=TRUE, quoteInfo=FALSE) checkEquals(formatInfoQI, formatInfoTQI) ## Width ## --> default width for num1 is 2 testData4 <- testData[, "num1", drop=FALSE] testData4M <- as.matrix(testData[, "num1", drop=FALSE]) formatInfo <- write.fwf(testData4, width=10, formatInfo=TRUE) checkEquals(formatInfo$width, 10) formatInfo <- write.fwf(testData4M, width=10, formatInfo=TRUE) checkEquals(formatInfo$width, 10) ## Too small value in width (this also tests recycling) ## --> proper width for num1 is 2, while for num2 it is 3 checkException(write.fwf(testData[, c("num1", "num2")], width=2)) checkException(write.fwf(testData[, c("num1", "num2")], width=c(2, 1))) ## Done cat("\nDONE.\n\n") } gdata/tests/unitTests/runit.unknown.R0000644000176200001440000005415114631624774017504 0ustar liggesusers## Test setup library("RUnit") library("gdata") ## Vectors intUnk <- 9999 xInt <- as.integer(c(NA, 1:2, NA, 5, 6, 7, 8, 9)) xIntUnk <- as.integer(c(intUnk, 1:2, intUnk, 5, 6, 7, 8, 9)) xIntUnkTest <- xIntUnk %in% intUnk numUnk <- 0 xNum <- c(9999, NA, 1.5, NA, 5, 6, 7, 8, 9) xNumUnk <- c(9999, 0, 1.5, 0, 5, 6, 7, 8, 9) xNumUnkTest <- xNumUnk %in% numUnk chaUnk <- "notAvail" chaUnk1 <- "-" xCha <- c("A", "B", NA, "C", NA, "-", "7", "8", "9") xChaUnk <- c("A", "B", chaUnk, "C", chaUnk, "-", "7", "8", "9") xChaUnk1 <- c("A", "B", chaUnk1, "C", chaUnk1, "-", "7", "8", "9") xChaUnkTest <- xChaUnk %in% chaUnk xChaUnk1Test <- xChaUnk %in% chaUnk1 facUnk <- "notAvail" facUnk1 <- "NA" xFac <- factor(c("A", "0", 0, "NA", "NA", intUnk, numUnk, "-", NA)) xFacUnk <- factor(c("A", "0", 0, "NA", "NA", intUnk, numUnk, "-", facUnk)) xFacUnk1 <- factor(c("A", "0", 0, "NA", "NA", intUnk, numUnk, "-", facUnk1)) xFacUnkTest <- c(0, 0, 0, 0, 0, 0, 0, 0, 1) xFacUnkTest <- as.logical(xFacUnkTest) xFacUnk1Test <- c(0, 0, 0, 1, 1, 0, 0, 0, 1) xFacUnk1Test <- as.logical(xFacUnk1Test) xFac1 <- factor(c("A", "0", 0, NA, NA, intUnk, numUnk, "-", NA)) facLev <- "A" xFacUnkLev <- factor(c("A", "0", 0, "NA", "NA", intUnk, numUnk, "-", "A")) xFacUnkLevTest <- c(1, 0, 0, 0, 0, 0, 0, 0, 1) xFacUnkLevTest <- as.logical(xFacUnkLevTest) dateUnk <- as.Date("2006-08-14") tmp <- as.Date("2006-08-15") xDate <- c(tmp, NA) xDateUnk <- c(tmp, dateUnk) xDateTest <- c(FALSE, TRUE) xDate1Unk <- c(tmp, dateUnk, NA) xDate1Test <- c(FALSE, TRUE, FALSE) POSIXltUnk <- strptime("2006-08-14", format="%Y-%m-%d") tmp <- strptime("2006-08-15", format="%Y-%m-%d") xPOSIXlt <- c(tmp, NA) xPOSIXltUnk <- c(tmp, POSIXltUnk) xPOSIXltTest <- c(FALSE, TRUE) xPOSIXlt1Unk <- c(tmp, POSIXltUnk, NA) xPOSIXlt1Test <- c(FALSE, TRUE, FALSE) POSIXctUnk <- as.POSIXct(strptime("2006-08-14 01:01:01", format="%Y-%m-%d %H:%M:%S")) tmp <- as.POSIXct(strptime("2006-08-15 01:01:01", format="%Y-%m-%d %H:%M:%S")) xPOSIXct <- c(tmp, NA) xPOSIXctUnk <- c(tmp, POSIXctUnk) xPOSIXctTest <- xPOSIXltTest xPOSIXct1Unk <- c(tmp, POSIXctUnk, NA) xPOSIXct1Test <- xPOSIXlt1Test ## Lists and data frames xList <- list(xInt, xCha, xNum, xFac) xListN <- list(int=xInt, cha=xCha, num=xNum, fac=xFac) xListUnk <- list(xIntUnk, xChaUnk, xNumUnk, xFacUnk) xListUnkTest <- list(xIntUnkTest, xChaUnkTest, xNumUnkTest, xFacUnkTest) xListNUnk <- list(int=xIntUnk, cha=xChaUnk, num=xNumUnk, fac=xFacUnk) xListNUnkTest <- list(int=xIntUnkTest, cha=xChaUnkTest, num=xNumUnkTest, fac=xFacUnkTest) xDF <- as.data.frame(xListN) xDF$cha <- as.character(xDF$cha) xDFUnk <- as.data.frame(xListNUnk) xDFUnk$cha <- as.character(xDFUnk$cha) xDFUnkTest <- as.data.frame(xListNUnkTest) unkC <- c(intUnk, chaUnk, numUnk, facUnk) unkL <- list(intUnk, chaUnk, numUnk, facUnk) unkLN <- list(num=numUnk, cha=chaUnk, fac=facUnk, int=intUnk) # mixed as it is named unkLMN <- list(cha=chaUnk, int=intUnk, num=c(intUnk, numUnk), fac=c(chaUnk1, facUnk)) xListMNUnkF <- list(int=as.integer(c(9999, 1, 2, 9999, 5, 6, 7, 8, 9)), cha=c("A", "B", "notAvail", "C", "notAvail", "-", "7", "8", "9"), num=c(9999, 0, 1.5, 0, 5, 6, 7, 8, 9), fac=factor(c("A", "0", "0", "NA", "NA", 9999, "0", "-", "notAvail"))) xListMNUnkFTest <- list(int=c(1, 0, 0, 1, 0, 0, 0, 0, 0), cha=c(0, 0, 1, 0, 1, 0, 0, 0, 0), num=c(1, 1, 0, 1, 0, 0, 0, 0, 0), fac=c(0, 0, 0, 0, 0, 0, 0, 1, 1)) xListMNUnkFTest <- lapply(xListMNUnkFTest, as.logical) xListMNF <- list(int=as.integer(c(NA, 1, 2, NA, 5, 6, 7, 8, 9)), cha=c("A", "B", NA, "C", NA, "-", "7", "8", "9"), num=c(NA, NA, 1.5, NA, 5, 6, 7, 8, 9), fac=factor(c("A", "0", "0", "NA", "NA", "9999", "0", NA, NA))) xDFMUnkF <- as.data.frame(xListMNUnkF) xDFMUnkF$cha <- as.character(xDFMUnkF$cha) xDFMUnkFTest <- as.data.frame(xListMNUnkFTest) xDFMF <- as.data.frame(xListMNF) xDFMF$cha <- as.character(xDFMF$cha) unk1 <- 555555 xListUnk1 <- list(as.integer(c(unk1, 1, 2, unk1, 5, 6, 7, 8, 9)), c("A", "B", unk1, "C", unk1, "-", "7", "8", "9"), c(9999, unk1, 1.5, unk1, 5, 6, 7, 8, 9), factor(c("A", "0", "0", "NA", "NA", "9999", "0", "-", unk1))) xListUnk1Test <- lapply(xListUnk1, function(x) x %in% unk1) xListNUnk1 <- xListUnk1 names(xListNUnk1) <- c("int", "cha", "num", "fac") xDFUnk1 <- as.data.frame(xListNUnk1) xDFUnk1$cha <- as.character(xDFUnk1$cha) xDFUnk1Test <- as.data.frame(xListUnk1Test) names(xDFUnk1Test) <- names(xListNUnk1) unkC2 <- c(0, "notAvail") xListUnk2 <- list(as.integer(c(unkC2[1], 1, 2, unkC2[1], 5, 6, 7, 8, 9)), c("A", "B", unkC2[2], "C", unkC2[2], "-", "7", "8", "9"), c(9999, as.numeric(unkC2[1]), 1.5, as.numeric(unkC2[1]), 5, 6, 7, 8, 9), factor(c("A", "0", "0", "NA", "NA", "9999", "0", "-", unkC2[2]))) xListNUnk2 <- xListUnk2 names(xListNUnk2) <- c("int", "cha", "num", "fac") xDFUnk2 <- as.data.frame(xListNUnk2) xDFUnk2$cha <- as.character(xDFUnk2$cha) xListUnk2Test <- xListUnk2 xListUnk2Test[[1]] <- xListUnk2Test[[1]] %in% unkC2[1] xListUnk2Test[[2]] <- xListUnk2Test[[2]] %in% unkC2[2] xListUnk2Test[[3]] <- xListUnk2Test[[3]] %in% unkC2[1] xListUnk2Test[[4]] <- xListUnk2Test[[4]] %in% unkC2[2] xListNUnk2Test <- xListUnk2Test names(xListNUnk2Test) <- names(xListNUnk2) xDFUnk2Test <- as.data.frame(xListNUnk2Test) unkL2 <- as.list(unkC2) unkLN2 <- unkL2[c(2, 1)] names(unkLN2) <- c("cha", "int") xListUnk2a <- list(as.integer(c(NA, 1, 2, NA, 5, 6, 7, 8, 9)), c("A", "B", unkLN2[[2]], "C", unkLN2[[2]], "-", "7", "8", "9"), c(9999, NA, 1.5, NA, 5, 6, 7, 8, 9), factor(c("A", "0", "0", "NA", "NA", "9999", "0", "-", unkLN2[[2]]))) xListUnk2aTest <- xListUnk2a xListUnk2aTest[[1]] <- xListUnk2aTest[[1]] %in% unkLN2[1] xListUnk2aTest[[2]] <- xListUnk2aTest[[2]] %in% unkLN2[2] xListUnk2aTest[[3]] <- xListUnk2aTest[[3]] %in% unkLN2[1] xListUnk2aTest[[4]] <- xListUnk2aTest[[4]] %in% unkLN2[2] xList2a <- list(xListUnk2a[[1]], c("A", "B", NA, "C", NA, "-", "7", "8", "9"), xListUnk2a[[3]], factor(c("A", NA, NA, "NA", "NA", 9999, NA, "-", NA))) ## Matrix matUnk <- 9999 mat <- matrix(1:25, nrow=5, ncol=5) mat[1, 2] <- NA; mat[1, 4] <- NA; mat[2, 2] <- NA; mat[3, 2] <- NA; mat[3, 5] <- NA; mat[5, 4] <- NA; matUnk1 <- mat matUnk1[1, 2] <- matUnk; matUnk1[1, 4] <- matUnk; matUnk1[2, 2] <- matUnk; matUnk1[3, 2] <- matUnk; matUnk1[3, 5] <- matUnk; matUnk1[5, 4] <- matUnk; matUnkTest <- matUnk1Test <- is.na(mat) matUnk2Test <- matUnkTest | mat == 1 ## Use of unknown=list(.default=, ...) or similarly named vector D1 <- "notAvail" unkLND1 <- list(.default=D1) xListUnkD1 <- list(as.integer(c(NA, 1:2, NA, 5, 6, 7, 8, 9)), c("A", "B", D1, "C", D1, "-", "7", "8", "9"), c(9999, NA, 1.5, NA, 5, 6, 7, 8, 9), factor(c("A", "0", 0, "NA", "NA", intUnk, numUnk, "-", D1))) xListUnkD1Test <- lapply(xListUnkD1, function(x) x %in% D1) xListD1 <- xList xListNUnkD1 <- xListUnkD1 xListNUnkD1Test <- xListUnkD1Test names(xListNUnkD1) <- names(xListNUnkD1Test) <- names(xListNUnk1) xListND1 <- xListN DSO2 <- c("notAvail", 5678) unkLNDSO2 <- as.list(DSO2) names(unkLNDSO2) <- c(".default", "someOther") xListUnkDSO2 <- list(as.integer(c(NA, 1:2, NA, 5, 6, 7, 8, 9)), c("A", "B", DSO2[1], "C", DSO2[1], "-", "7", "8", "9"), c(9999, NA, 1.5, NA, 5, 6, 7, 8, 9), factor(c("A", "0", 0, "NA", "NA", intUnk, numUnk, "-", DSO2[2]))) xListUnkDSO2Test <- lapply(xListUnkDSO2, function(x) x %in% DSO2) unkLND3 <- list(.default="notAvail", num=0, int=9999) xListNUnkD3 <- list(int=as.integer(c(unkLND3[[3]], 1:2, unkLND3[[3]], 5, 6, 7, 8, 9)), cha=c("A", "B", unkLND3[[1]], "C", unkLND3[[1]], "-", "7", "8", "9"), num=c(9999, unkLND3[[2]], 1.5, unkLND3[[2]], 5, 6, 7, 8, 9), fac=factor(c("A", "0", 0, "NA", "NA", intUnk, numUnk, "-", unkLND3[[1]]))) xListNUnkD3Test <- xListNUnkD3 xListNUnkD3Test$int <- xListNUnkD3Test$int %in% unkLND3[[3]] xListNUnkD3Test$cha <- xListNUnkD3Test$cha %in% unkLND3[[1]] xListNUnkD3Test$num <- xListNUnkD3Test$num %in% unkLND3[[2]] xListNUnkD3Test$fac <- xListNUnkD3Test$fac %in% unkLND3[[1]] unkLND2E <- list(.default="notAvail", 9999) ## isUnknown test.isUnknown <- function() { ## Base methods for vectors checkIdentical(isUnknown(xIntUnk, unknown=as.integer(intUnk)), xIntUnkTest) checkIdentical(isUnknown(xIntUnk, unknown=intUnk), xIntUnkTest) checkIdentical(isUnknown(xNumUnk, unknown=numUnk), xNumUnkTest) checkIdentical(isUnknown(xNumUnk, unknown=as.integer(numUnk)), xNumUnkTest) checkIdentical(isUnknown(xChaUnk, unknown=chaUnk), xChaUnkTest) checkIdentical(isUnknown(xFacUnk, unknown=facUnk), xFacUnkTest) ## Multiple values are allowed for vector methods in vector or list form checkIdentical(isUnknown(xIntUnk, unknown=unkC), xIntUnkTest) checkIdentical(isUnknown(xIntUnk, unknown=unkL), xIntUnkTest) ## NA's in factors checkIdentical(isUnknown(xFacUnk1, unknown=facUnk1), xFacUnk1Test) facNA <- factor(c("0", 1, 2, 3, NA, "NA")) facNATest <- c(FALSE, FALSE, FALSE, FALSE, TRUE, FALSE) checkIdentical(isUnknown(facNA), facNATest) ## Date-time classes checkIdentical(isUnknown(xDateUnk, unknown=dateUnk), xDateTest) checkIdentical(isUnknown(xDate1Unk, unknown=dateUnk), xDate1Test) checkIdentical(isUnknown(xPOSIXltUnk, unknown=POSIXltUnk), xPOSIXltTest) checkIdentical(isUnknown(xPOSIXlt1Unk, unknown=POSIXltUnk), xPOSIXlt1Test) checkIdentical(isUnknown(xPOSIXctUnk, unknown=POSIXctUnk), xPOSIXctTest) checkIdentical(isUnknown(xPOSIXct1Unk, unknown=POSIXctUnk), xPOSIXct1Test) ## Lists and data frames ## with vector of single unknown values checkIdentical(isUnknown(xListUnk, unknown=unkC), xListUnkTest) checkIdentical(isUnknown(xDFUnk, unknown=unkC), xDFUnkTest) ## with list of single unknown values checkIdentical(isUnknown(xListUnk, unknown=unkL), xListUnkTest) checkIdentical(isUnknown(xDFUnk, unknown=unkL), xDFUnkTest) ## with named list of single unknown values checkIdentical(isUnknown(xListNUnk, unknown=unkLN), xListNUnkTest) checkIdentical(isUnknown(xDFUnk, unknown=unkLN), xDFUnkTest) ## with named list of multiple unknown values - valid here checkIdentical(isUnknown(xListMNUnkF, unknown=unkLMN), xListMNUnkFTest) checkIdentical(isUnknown(xDFMUnkF, unknown=unkLMN), xDFMUnkFTest) ## with single unknown value - recycling checkIdentical(isUnknown(xListUnk1, unknown=unk1), xListUnk1Test) checkIdentical(isUnknown(xDFUnk1, unknown=unk1), xDFUnk1Test) ## with vector of two unknown values - recycling checkIdentical(isUnknown(xListUnk2, unknown=unkC2), xListUnk2Test) checkIdentical(isUnknown(xDFUnk2, unknown=unkC2), xDFUnk2Test) ## with list of two unknown values - recycling checkIdentical(isUnknown(xListUnk2, unknown=unkL2), xListUnk2Test) checkIdentical(isUnknown(xDFUnk2, unknown=unkL2), xDFUnk2Test) ## list(.default=) checkIdentical(isUnknown(x=xListUnkD1, unknown=unkLND1), xListUnkD1Test) ## list(.default=, someOther=) we do not know someOther, but should work ## as x is not named checkIdentical(isUnknown(x=xListUnkDSO2, unknown=unkLNDSO2), xListUnkDSO2Test) ## list(.default=) in named list checkIdentical(isUnknown(x=xListNUnkD1, unknown=unkLND1), xListNUnkD1Test) ## list(.default=, someOther=) OK if someOther is in the named list checkIdentical(isUnknown(x=xListNUnkD3, unknown=unkLND3), xListNUnkD3Test) ## list(.default=, 99) ERROR as we do not know where to apply 99 checkException(isUnknown(x=xListNUnk, unknown=unkLND2E)) ## Matrix checkIdentical(isUnknown(x=mat, unknown=NA), matUnkTest) checkIdentical(isUnknown(x=matUnk1, unknown=matUnk), matUnkTest) checkIdentical(isUnknown(x=matUnk1, unknown=c(1, matUnk)), matUnk2Test) } ## unknownToNA test.unknownToNA <- function() { ## Base methods for vectors checkIdentical(unknownToNA(xIntUnk, as.integer(intUnk)), xInt) checkIdentical(unknownToNA(xIntUnk, intUnk), xInt) # with numeric checkIdentical(unknownToNA(xNumUnk, numUnk), xNum) checkIdentical(unknownToNA(xNumUnk, as.integer(numUnk)), xNum) checkIdentical(unknownToNA(xChaUnk, chaUnk), xCha) checkIdentical(unknownToNA(xChaUnk, chaUnk), xCha) checkIdentical(unknownToNA(xFacUnk, facUnk), xFac) ## Multiple values are allowed for vector methods in vector or list form checkIdentical(unknownToNA(xIntUnk, unknown=unkC), xInt) checkIdentical(unknownToNA(xIntUnk, unknown=unkL), xInt) ## NA's in factors checkIdentical(unknownToNA(xFacUnk1, unknown=facUnk1), xFac1) facNA <- factor(c("0", 1, 2, 3, NA, "NA")) facNATest <- factor(c("0", 1, 2, 3, NA, NA)) checkIdentical(unknownToNA(x=facNA, unknown="NA"), facNATest) ## Date-time classes checkIdentical(unknownToNA(xDateUnk, unknown=dateUnk), xDate) checkIdentical(unknownToNA(xPOSIXctUnk, unknown=POSIXctUnk), xPOSIXct) ## Per Brian Ripley on 2014-01-15: ## ## On platforms where POSIXlt has a gmtoff component, it does not need to be set. So ## ## > z$gmtoff ## [1] 3600 NA ## > xPOSIXltUnk$gmtoff ## [1] 3600 3600 ## ## (or sometimes 0, not NA). ## ## So although identical() correctly reports that they differ, this ## is allowed for optional components. ## ## It would also be wrong to use identical() to compare isdst ## components: isdst = -1 means unknown. ## ## Replaced: ## checkIdentical(unknownToNA(xPOSIXltUnk, unknown=POSIXltUnk), xPOSIXlt) ## With: tmp_unknownToNA <- unknownToNA(xPOSIXltUnk, unknown=POSIXltUnk) tmp_xPOSIXlt <- xPOSIXlt tmp_unknownToNA$gmtoff <- NULL # Remove $gmtoff to avoid comparison tmp_xPOSIXlt$gmtoff <- NULL isdst.unknown <- unique( c(which(is.na(tmp_unknownToNA$isdst) | tmp_unknownToNA$isdst==-1)), c(which(is.na(tmp_xPOSIXlt$isdst) | tmp_xPOSIXlt$isdst==-1))) checkIdentical(tmp_unknownToNA$isdst[!isdst.unknown], tmp_xPOSIXlt$isds[!isdst.unknown]) tmp_unknownToNA$isdst <- NULL # remove $isdst to avoid comparison tmp_xPOSIXlt$isdst <- NULL # by checkIdentical checkIdentical(tmp_unknownToNA, tmp_xPOSIXlt) ## Lists and data frames ## with vector of single unknown values checkIdentical(unknownToNA(xListUnk, unknown=unkC), xList) checkIdentical(unknownToNA(xDFUnk, unknown=unkC), xDF) ## with list of single unknown values checkIdentical(unknownToNA(xListUnk, unknown=unkL), xList) checkIdentical(unknownToNA(xDFUnk, unknown=unkL), xDF) ## with named list of single unknown values checkIdentical(unknownToNA(xListNUnk, unknown=unkLN), xListN) checkIdentical(unknownToNA(xDFUnk, unknown=unkLN), xDF) ## with names list of multiple unknown values - must be an error checkIdentical(unknownToNA(xListMNUnkF, unknown=unkLMN), xListMNF) checkIdentical(unknownToNA(xDFMUnkF, unknown=unkLMN), xDFMF) ## with single unknown value - recycling checkIdentical(unknownToNA(xListUnk1, unknown=unk1), xList) checkIdentical(unknownToNA(xDFUnk1, unknown=unk1), xDF) ## with vector of two unknown values - recycling checkIdentical(unknownToNA(xListUnk2, unknown=unkC2), xList) checkIdentical(unknownToNA(xDFUnk2, unknown=unkC2), xDF) ## with list of two unknown values - recycling checkIdentical(unknownToNA(xListUnk2, unknown=unkL2), xList) checkIdentical(unknownToNA(xDFUnk2, unknown=unkL2), xDF) ## with named list of two unknown values but x is not named so named list ## does not have any effect --> error as we do not know how to recycle checkException(unknownToNA(xListUnk2a, unknown=unkLN2)) ## but we should get some results with named x checkIdentical(unknownToNA(xListNUnk2, unknown=unkL2), xListN) ## not also necesarily with recycling of names lists, as it is ## not clear how to properly recycle named lists (only names that match ## can be really properly recycled) checkException(unknownToNA(xListNUnk2, unknown=unkLN2)) checkIdentical(unknownToNA(xDFUnk2, unknown=unkL2), xDF) checkException(unknownToNA(xDFUnk2, unknown=unkLN2)) ## list(.default=) checkIdentical(unknownToNA(x=xListUnkD1, unknown=unkLND1), xListD1) ## list(.default=, someOther=) we do not know someOther, but should work ## as x is not named checkIdentical(unknownToNA(x=xListUnkDSO2, unknown=unkLNDSO2), xList) ## list(.default=) in named list checkIdentical(unknownToNA(x=xListNUnkD1, unknown=unkLND1), xListND1) ## list(.default=, someOther=) OK if someOther is in the named list checkIdentical(unknownToNA(x=xListNUnkD3, unknown=unkLND3), xListN) ## list(.default=, 99) ERROR as we do not know where to apply 99 checkException(unknownToNA(x=xListNUnk, unknown=unkLND2E)) ## Matrix checkEquals(unknownToNA(x=matUnk1, unknown=matUnk), mat) } ## NAToUnknown test.NAToUnknown <- function() { ## Base methods for vectors checkIdentical(NAToUnknown(xInt, as.integer(intUnk)), xIntUnk) checkIdentical(NAToUnknown(xInt, intUnk), xIntUnk) # with numeric checkIdentical(NAToUnknown(xNum, numUnk), xNumUnk) checkIdentical(NAToUnknown(xNum, as.integer(numUnk)), xNumUnk) checkIdentical(NAToUnknown(xCha, chaUnk), xChaUnk) checkIdentical(NAToUnknown(xCha, chaUnk), xChaUnk) checkIdentical(NAToUnknown(xFac, facUnk), xFacUnk) ## only single values are allowed for vector methods checkException(NAToUnknown(xInt, unknown=unkC)) checkException(NAToUnknown(xInt, unknown=unkL)) ## and they should not already be in x unless force=TRUE checkException(NAToUnknown(xCha, unknown=chaUnk1)) checkIdentical(NAToUnknown(xCha, unknown=chaUnk1, force=TRUE), xChaUnk1) checkException(NAToUnknown(xFac, unknown=facLev)) checkIdentical(NAToUnknown(xFac, unknown=facLev, force=TRUE), xFacUnkLev) ## NA's in factors checkIdentical(NAToUnknown(xFac, unknown=facUnk1, force=TRUE), xFacUnk1) facNA <- factor(c("0", 1, 2, 3, NA, NA)) facNATest <- factor(c("0", 1, 2, 3, "NA", "NA")) checkIdentical(NAToUnknown(x=facNA, unknown="NA"), facNATest) ## Date-time classes checkIdentical(NAToUnknown(xDate, unknown=dateUnk), xDateUnk) checkIdentical(NAToUnknown(xPOSIXct, unknown=POSIXctUnk), xPOSIXctUnk) ## Per Brian Ripley on 2014-01-15: ## ## On platforms where POSIXlt has a gmtoff component, it does not need to be set. So ## ## > z$gmtoff ## [1] 3600 NA ## > xPOSIXltUnk$gmtoff ## [1] 3600 3600 ## ## (or sometimes 0, not NA). ## ## So although identical() correctly reports that they differ, this ## is allowed for optional components. ## ## It would also be wrong to use identical() to compare isdst ## components: isdst = -1 means unknown. ## ## Replaced: ## checkIdentical(NAToUnknown(xPOSIXlt, unknown=POSIXltUnk), xPOSIXltUnk) ## With: tmp_NAToUnknown <- NAToUnknown(xPOSIXlt, unknown=POSIXltUnk) tmp_xPOSIXltUnk <- xPOSIXltUnk tmp_NAToUnknown$gmtoff <- NULL # remove $gmtoff to avoid comparison tmp_xPOSIXltUnk$gmtoff <- NULL isdst.unknown <- unique( c(which(is.na(tmp_NAToUnknown$isdst) | tmp_NAToUnknown$isdst==-1)), c(which(is.na(tmp_xPOSIXltUnk$isdst) | tmp_xPOSIXltUnk$isdst==-1))) checkIdentical(tmp_NAToUnknown$isdst[!isdst.unknown], tmp_xPOSIXltUnk$isds[!isdst.unknown]) tmp_NAToUnknown$isdst <- NULL # remove $isdst to avoid comparison tmp_xPOSIXltUnk$isdst <- NULL # by checkIdentical checkIdentical(tmp_NAToUnknown, tmp_xPOSIXltUnk) ## Lists and data frames ## with vector of single unknown values checkIdentical(NAToUnknown(xList, unknown=unkC), xListUnk) checkIdentical(NAToUnknown(xDF, unknown=unkC), xDFUnk) ## with list of single unknown values checkIdentical(NAToUnknown(xList, unknown=unkL), xListUnk) checkIdentical(NAToUnknown(xDF, unknown=unkL), xDFUnk) ## with named list of single unknown values checkIdentical(NAToUnknown(xListN, unknown=unkLN), xListNUnk) checkIdentical(NAToUnknown(xDF, unknown=unkLN), xDFUnk) ## with names list of multiple unknown values - must be an error checkException(NAToUnknown(xListN, unknown=unkLMN)) checkException(NAToUnknown(xDF, unknown=unkLMN)) ## with single unknown value - recycling checkIdentical(NAToUnknown(xList, unknown=unk1), xListUnk1) checkIdentical(NAToUnknown(xDF, unknown=unk1), xDFUnk1) ## with vector of two unknown values - recycling checkIdentical(NAToUnknown(xList, unknown=unkC2), xListUnk2) checkIdentical(NAToUnknown(xDF, unknown=unkC2), xDFUnk2) ## with list of two unknown values - recycling checkIdentical(NAToUnknown(xList, unknown=unkL2), xListUnk2) checkIdentical(NAToUnknown(xDF, unknown=unkL2), xDFUnk2) ## with named list of two unknown values but x is not named so named list ## does not have any effect --> error as we do not know how to recycle checkException(NAToUnknown(xList, unknown=unkLN2)) ## but we should get some results with named x checkIdentical(NAToUnknown(xListN, unknown=unkL2), xListNUnk2) ## not also necesarilly with recycling of names lists, as it is ## not clear how to properly recycle named lists (only names that match ## can be really properly recycled) checkException(NAToUnknown(xListN, unknown=unkLN2)) checkIdentical(NAToUnknown(xDF, unknown=unkL2), xDFUnk2) checkException(NAToUnknown(xDF, unknown=unkLN2)) ## list(.default=) checkIdentical(NAToUnknown(x=xList, unknown=unkLND1), xListUnkD1) ## list(.default=, someOther=) we do not know someOther, but should work ## as x is not named checkIdentical(NAToUnknown(x=xList, unknown=unkLNDSO2), xListUnkDSO2) ## list(.default=) in named list checkIdentical(NAToUnknown(x=xListN, unknown=unkLND1), xListNUnkD1) ## list(.default=, someOther=) OK if someOther is in the named list checkIdentical(NAToUnknown(x=xListN, unknown=unkLND3), xListNUnkD3) ## list(.default=, 99) ERROR as we do not know where to apply 99 checkException(NAToUnknown(x=xListN, unknown=unkLND2E)) ## Matrix checkEquals(NAToUnknown(x=mat, unknown=matUnk), matUnk1) } gdata/tests/unitTests/runit.bindData.R0000644000176200001440000000435114631624774017510 0ustar liggesusers## Test setup if(FALSE) { library("RUnit") library("gdata") } test.bindData <- function() { ## 'x'/'y' must be a data.frame checkException(bindData(x=1:10, y=1:10)) checkException(bindData(x=matrix(1:10), y=matrix(1:10))) n1 <- 6; n2 <- 12; n3 <- 4 ## Single trait 1 num <- c(5:n1, 10:13) tmp1 <- data.frame(y1=rnorm(n=n1), f1=factor(rep(c("A", "B"), n1/2)), ch=letters[num], fa=factor(letters[num]), nu=(num) + 0.5, id=factor(num), stringsAsFactors=FALSE) ## Single trait 2 with repeated records, some subjects also in tmp1 num <- 4:9 tmp2 <- data.frame(y2=rnorm(n=n2), f2=factor(rep(c("C", "D"), n2/2)), ch=letters[rep(num, times=2)], fa=factor(letters[rep(c(num), times=2)]), nu=c((num) + 0.5, (num) + 0.25), id=factor(rep(num, times=2)), stringsAsFactors=FALSE) ## Single trait 3 with completely distinct set of subjects num <- 1:4 tmp3 <- data.frame(y3=rnorm(n=n3), f3=factor(rep(c("E", "F"), n3/2)), ch=letters[num], fa=factor(letters[num]), nu=(num) + 0.5, id=factor(num), stringsAsFactors=FALSE) ## Combine all datasets tmp12 <- bindData(x=tmp1, y=tmp2, common=c("id", "nu", "ch", "fa")) tmp123 <- bindData(x=tmp12, y=tmp3, common=c("id", "nu", "ch", "fa")) checkEquals(names(tmp123), c("id", "nu", "ch", "fa", "y1", "f1", "y2", "f2", "y3", "f3")) checkEquals(rbind(tmp1["id"], tmp2["id"], tmp3["id"]), tmp123["id"]) checkEquals(rbind(tmp1["fa"], tmp2["fa"], tmp3["fa"]), tmp123["fa"]) checkEquals(is.na(tmp123$y1), c(rep(FALSE, times=n1), rep(TRUE, times=n2+n3))) checkEquals(is.na(tmp123$f1), c(rep(FALSE, times=n1), rep(TRUE, times=n2+n3))) checkEquals(is.na(tmp123$y2), c(rep(TRUE, times=n1), rep(FALSE, times=n2), rep(TRUE, times=n3))) checkEquals(is.na(tmp123$f2), c(rep(TRUE, times=n1), rep(FALSE, times=n2), rep(TRUE, times=n3))) checkEquals(is.na(tmp123$y3), c(rep(TRUE, times=n1+n2), rep(FALSE, times=n3))) checkEquals(is.na(tmp123$f3), c(rep(TRUE, times=n1+n2), rep(FALSE, times=n3))) } gdata/tests/test.reorder.factor.Rout.save0000644000176200001440000000234514631624774020223 0ustar liggesusers R version 4.3.0 (2023-04-21) -- "Already Tomorrow" Copyright (C) 2023 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > ## Test results before and after loading gdata > > m <- factor(c("a", "b", "c")) > > (m1 <- reorder(m, X=c(3, 2, 1))) [1] a b c attr(,"scores") a b c 3 2 1 Levels: c b a > > library(gdata) Attaching package: 'gdata' The following object is masked from 'package:stats': nobs The following object is masked from 'package:utils': object.size The following object is masked from 'package:base': startsWith > > (m2 <- reorder(m, X=c(3, 2, 1))) [1] a b c attr(,"scores") a b c 3 2 1 Levels: c b a > > stopifnot(identical(m1, m2)) > > proc.time() user system elapsed 0.084 0.009 0.088 gdata/tests/test.write.fwf.eol.R0000644000176200001440000000025214631624774016303 0ustar liggesuserslibrary(gdata) saveto <- tempfile(pattern = "test.txt", tmpdir = tempdir()) write.fwf(x = data.frame(a=1:length(LETTERS), b=LETTERS), file=saveto, eol="\r\n") gdata/tests/test.write.fwf.eol.Rout.save0000644000176200001440000000212714631624774017773 0ustar liggesusers R version 4.3.0 (2023-04-21) -- "Already Tomorrow" Copyright (C) 2023 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(gdata) Attaching package: 'gdata' The following object is masked from 'package:stats': nobs The following object is masked from 'package:utils': object.size The following object is masked from 'package:base': startsWith > saveto <- tempfile(pattern = "test.txt", tmpdir = tempdir()) > > write.fwf(x = data.frame(a=1:length(LETTERS), b=LETTERS), + file=saveto, eol="\r\n") > > proc.time() user system elapsed 0.088 0.008 0.093 gdata/tests/tests.write.fwf.R0000644000176200001440000000333714631624774015717 0ustar liggesuserslibrary(gdata) ## Test data num <- round(c(733070.345678, 1214213.78765456, 553823.798765678, 1085022.8876545678, 571063.88765456, 606718.3876545678, 1053686.6, 971024.187656, 631193.398765456, 879431.1), digits=3) testData <- data.frame(num1=c(1:10, NA), num2=c(NA, seq(from=1, to=5.5, by=0.5)), num3=c(NA, num), int1=c(as.integer(1:4), NA, as.integer(4:9)), fac1=factor(c(NA, letters[1:9], "hjh")), fac2=factor(c(letters[6:15], NA)), cha1=c(letters[17:26], NA), cha2=c(NA, "longer", letters[25:17]), stringsAsFactors=FALSE) levels(testData$fac1) <- c(levels(testData$fac1), "unusedLevel") testData$Date <- as.Date("1900-1-1") testData$Date[2] <- NA testData$POSIXt <- as.POSIXct(strptime("1900-1-1 01:01:01", format="%Y-%m-%d %H:%M:%S")) testData$POSIXt[5] <- NA ## Tests ## Default write.fwf(testData) ## NA should be - write.fwf(x=testData, na="-") ## NA should be -NA- write.fwf(x=testData, na="-NA-") ## Some other separator than space write.fwf(testData[, 1:4], sep="-mySep-") ## Justify right for character columns write.fwf(testData, justify="right") ## Justify right for character columns, track na values write.fwf(testData, justify="right", na="!") ## With quotes write.fwf(testData, quote=TRUE) ## With rownames write.fwf(testData, rownames=TRUE) ## Without colnames write.fwf(testData, colnames=FALSE) ## Without colnames, with rownames write.fwf(testData, colnames=FALSE, rownames=TRUE) ## With rownames and colnames and rowCol write.fwf(testData, rownames=TRUE, rowCol="HI!") gdata/tests/tests.write.fwf.Rout.save0000644000176200001440000002604514631624774017405 0ustar liggesusers R version 4.3.0 (2023-04-21) -- "Already Tomorrow" Copyright (C) 2023 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(gdata) Attaching package: 'gdata' The following object is masked from 'package:stats': nobs The following object is masked from 'package:utils': object.size The following object is masked from 'package:base': startsWith > > ## Test data > > num <- round(c(733070.345678, 1214213.78765456, 553823.798765678, + 1085022.8876545678, 571063.88765456, 606718.3876545678, + 1053686.6, 971024.187656, 631193.398765456, 879431.1), digits=3) > > testData <- data.frame(num1=c(1:10, NA), + num2=c(NA, seq(from=1, to=5.5, by=0.5)), + num3=c(NA, num), + int1=c(as.integer(1:4), NA, as.integer(4:9)), + fac1=factor(c(NA, letters[1:9], "hjh")), + fac2=factor(c(letters[6:15], NA)), + cha1=c(letters[17:26], NA), + cha2=c(NA, "longer", letters[25:17]), + stringsAsFactors=FALSE) > levels(testData$fac1) <- c(levels(testData$fac1), "unusedLevel") > testData$Date <- as.Date("1900-1-1") > testData$Date[2] <- NA > testData$POSIXt <- as.POSIXct(strptime("1900-1-1 01:01:01", + format="%Y-%m-%d %H:%M:%S")) > testData$POSIXt[5] <- NA > > ## Tests > > ## Default > write.fwf(testData) num1 num2 num3 int1 fac1 fac2 cha1 cha2 Date POSIXt 1 1 f q 1900-01-01 1900-01-01 01:01:01 2 1.0 733070.3 2 a g r longer 1900-01-01 01:01:01 3 1.5 1214213.8 3 b h s y 1900-01-01 1900-01-01 01:01:01 4 2.0 553823.8 4 c i t x 1900-01-01 1900-01-01 01:01:01 5 2.5 1085022.9 d j u w 1900-01-01 6 3.0 571063.9 4 e k v v 1900-01-01 1900-01-01 01:01:01 7 3.5 606718.4 5 f l w u 1900-01-01 1900-01-01 01:01:01 8 4.0 1053686.6 6 g m x t 1900-01-01 1900-01-01 01:01:01 9 4.5 971024.2 7 h n y s 1900-01-01 1900-01-01 01:01:01 10 5.0 631193.4 8 i o z r 1900-01-01 1900-01-01 01:01:01 5.5 879431.1 9 hjh q 1900-01-01 1900-01-01 01:01:01 > > ## NA should be - > write.fwf(x=testData, na="-") num1 num2 num3 int1 fac1 fac2 cha1 cha2 Date POSIXt 1 - - 1 - f q - 1900-01-01 1900-01-01 01:01:01 2 1.0 733070.3 2 a g r longer - 1900-01-01 01:01:01 3 1.5 1214213.8 3 b h s y 1900-01-01 1900-01-01 01:01:01 4 2.0 553823.8 4 c i t x 1900-01-01 1900-01-01 01:01:01 5 2.5 1085022.9 - d j u w 1900-01-01 - 6 3.0 571063.9 4 e k v v 1900-01-01 1900-01-01 01:01:01 7 3.5 606718.4 5 f l w u 1900-01-01 1900-01-01 01:01:01 8 4.0 1053686.6 6 g m x t 1900-01-01 1900-01-01 01:01:01 9 4.5 971024.2 7 h n y s 1900-01-01 1900-01-01 01:01:01 10 5.0 631193.4 8 i o z r 1900-01-01 1900-01-01 01:01:01 - 5.5 879431.1 9 hjh - - q 1900-01-01 1900-01-01 01:01:01 > ## NA should be -NA- > write.fwf(x=testData, na="-NA-") num1 num2 num3 int1 fac1 fac2 cha1 cha2 Date POSIXt 1 -NA- -NA- 1 -NA- f q -NA- 1900-01-01 1900-01-01 01:01:01 2 1.0 733070.3 2 a g r longer -NA- 1900-01-01 01:01:01 3 1.5 1214213.8 3 b h s y 1900-01-01 1900-01-01 01:01:01 4 2.0 553823.8 4 c i t x 1900-01-01 1900-01-01 01:01:01 5 2.5 1085022.9 -NA- d j u w 1900-01-01 -NA- 6 3.0 571063.9 4 e k v v 1900-01-01 1900-01-01 01:01:01 7 3.5 606718.4 5 f l w u 1900-01-01 1900-01-01 01:01:01 8 4.0 1053686.6 6 g m x t 1900-01-01 1900-01-01 01:01:01 9 4.5 971024.2 7 h n y s 1900-01-01 1900-01-01 01:01:01 10 5.0 631193.4 8 i o z r 1900-01-01 1900-01-01 01:01:01 -NA- 5.5 879431.1 9 hjh -NA- -NA- q 1900-01-01 1900-01-01 01:01:01 > > ## Some other separator than space > write.fwf(testData[, 1:4], sep="-mySep-") num1-mySep-num2-mySep-num3-mySep-int1 1-mySep- -mySep- -mySep-1 2-mySep-1.0-mySep- 733070.3-mySep-2 3-mySep-1.5-mySep-1214213.8-mySep-3 4-mySep-2.0-mySep- 553823.8-mySep-4 5-mySep-2.5-mySep-1085022.9-mySep- 6-mySep-3.0-mySep- 571063.9-mySep-4 7-mySep-3.5-mySep- 606718.4-mySep-5 8-mySep-4.0-mySep-1053686.6-mySep-6 9-mySep-4.5-mySep- 971024.2-mySep-7 10-mySep-5.0-mySep- 631193.4-mySep-8 -mySep-5.5-mySep- 879431.1-mySep-9 > > ## Justify right for character columns > write.fwf(testData, justify="right") num1 num2 num3 int1 fac1 fac2 cha1 cha2 Date POSIXt 1 1 f q 1900-01-01 1900-01-01 01:01:01 2 1.0 733070.3 2 a g r longer 1900-01-01 01:01:01 3 1.5 1214213.8 3 b h s y 1900-01-01 1900-01-01 01:01:01 4 2.0 553823.8 4 c i t x 1900-01-01 1900-01-01 01:01:01 5 2.5 1085022.9 d j u w 1900-01-01 6 3.0 571063.9 4 e k v v 1900-01-01 1900-01-01 01:01:01 7 3.5 606718.4 5 f l w u 1900-01-01 1900-01-01 01:01:01 8 4.0 1053686.6 6 g m x t 1900-01-01 1900-01-01 01:01:01 9 4.5 971024.2 7 h n y s 1900-01-01 1900-01-01 01:01:01 10 5.0 631193.4 8 i o z r 1900-01-01 1900-01-01 01:01:01 5.5 879431.1 9 hjh q 1900-01-01 1900-01-01 01:01:01 > > ## Justify right for character columns, track na values > write.fwf(testData, justify="right", na="!") num1 num2 num3 int1 fac1 fac2 cha1 cha2 Date POSIXt 1 ! ! 1 ! f q ! 1900-01-01 1900-01-01 01:01:01 2 1.0 733070.3 2 a g r longer ! 1900-01-01 01:01:01 3 1.5 1214213.8 3 b h s y 1900-01-01 1900-01-01 01:01:01 4 2.0 553823.8 4 c i t x 1900-01-01 1900-01-01 01:01:01 5 2.5 1085022.9 ! d j u w 1900-01-01 ! 6 3.0 571063.9 4 e k v v 1900-01-01 1900-01-01 01:01:01 7 3.5 606718.4 5 f l w u 1900-01-01 1900-01-01 01:01:01 8 4.0 1053686.6 6 g m x t 1900-01-01 1900-01-01 01:01:01 9 4.5 971024.2 7 h n y s 1900-01-01 1900-01-01 01:01:01 10 5.0 631193.4 8 i o z r 1900-01-01 1900-01-01 01:01:01 ! 5.5 879431.1 9 hjh ! ! q 1900-01-01 1900-01-01 01:01:01 > > ## With quotes > write.fwf(testData, quote=TRUE) "num1" "num2" "num3" "int1" "fac1" "fac2" "cha1" "cha2" "Date" "POSIXt" " 1" " " " " "1" " " "f" "q" " " "1900-01-01" "1900-01-01 01:01:01" " 2" "1.0" " 733070.3" "2" "a " "g" "r" "longer" " " "1900-01-01 01:01:01" " 3" "1.5" "1214213.8" "3" "b " "h" "s" "y " "1900-01-01" "1900-01-01 01:01:01" " 4" "2.0" " 553823.8" "4" "c " "i" "t" "x " "1900-01-01" "1900-01-01 01:01:01" " 5" "2.5" "1085022.9" " " "d " "j" "u" "w " "1900-01-01" " " " 6" "3.0" " 571063.9" "4" "e " "k" "v" "v " "1900-01-01" "1900-01-01 01:01:01" " 7" "3.5" " 606718.4" "5" "f " "l" "w" "u " "1900-01-01" "1900-01-01 01:01:01" " 8" "4.0" "1053686.6" "6" "g " "m" "x" "t " "1900-01-01" "1900-01-01 01:01:01" " 9" "4.5" " 971024.2" "7" "h " "n" "y" "s " "1900-01-01" "1900-01-01 01:01:01" "10" "5.0" " 631193.4" "8" "i " "o" "z" "r " "1900-01-01" "1900-01-01 01:01:01" " " "5.5" " 879431.1" "9" "hjh" " " " " "q " "1900-01-01" "1900-01-01 01:01:01" > > ## With rownames > write.fwf(testData, rownames=TRUE) num1 num2 num3 int1 fac1 fac2 cha1 cha2 Date POSIXt 1 1 1 f q 1900-01-01 1900-01-01 01:01:01 2 2 1.0 733070.3 2 a g r longer 1900-01-01 01:01:01 3 3 1.5 1214213.8 3 b h s y 1900-01-01 1900-01-01 01:01:01 4 4 2.0 553823.8 4 c i t x 1900-01-01 1900-01-01 01:01:01 5 5 2.5 1085022.9 d j u w 1900-01-01 6 6 3.0 571063.9 4 e k v v 1900-01-01 1900-01-01 01:01:01 7 7 3.5 606718.4 5 f l w u 1900-01-01 1900-01-01 01:01:01 8 8 4.0 1053686.6 6 g m x t 1900-01-01 1900-01-01 01:01:01 9 9 4.5 971024.2 7 h n y s 1900-01-01 1900-01-01 01:01:01 10 10 5.0 631193.4 8 i o z r 1900-01-01 1900-01-01 01:01:01 11 5.5 879431.1 9 hjh q 1900-01-01 1900-01-01 01:01:01 > > ## Without colnames > write.fwf(testData, colnames=FALSE) 1 1 f q 1900-01-01 1900-01-01 01:01:01 2 1.0 733070.3 2 a g r longer 1900-01-01 01:01:01 3 1.5 1214213.8 3 b h s y 1900-01-01 1900-01-01 01:01:01 4 2.0 553823.8 4 c i t x 1900-01-01 1900-01-01 01:01:01 5 2.5 1085022.9 d j u w 1900-01-01 6 3.0 571063.9 4 e k v v 1900-01-01 1900-01-01 01:01:01 7 3.5 606718.4 5 f l w u 1900-01-01 1900-01-01 01:01:01 8 4.0 1053686.6 6 g m x t 1900-01-01 1900-01-01 01:01:01 9 4.5 971024.2 7 h n y s 1900-01-01 1900-01-01 01:01:01 10 5.0 631193.4 8 i o z r 1900-01-01 1900-01-01 01:01:01 5.5 879431.1 9 hjh q 1900-01-01 1900-01-01 01:01:01 > > ## Without colnames, with rownames > write.fwf(testData, colnames=FALSE, rownames=TRUE) 1 1 1 f q 1900-01-01 1900-01-01 01:01:01 2 2 1.0 733070.3 2 a g r longer 1900-01-01 01:01:01 3 3 1.5 1214213.8 3 b h s y 1900-01-01 1900-01-01 01:01:01 4 4 2.0 553823.8 4 c i t x 1900-01-01 1900-01-01 01:01:01 5 5 2.5 1085022.9 d j u w 1900-01-01 6 6 3.0 571063.9 4 e k v v 1900-01-01 1900-01-01 01:01:01 7 7 3.5 606718.4 5 f l w u 1900-01-01 1900-01-01 01:01:01 8 8 4.0 1053686.6 6 g m x t 1900-01-01 1900-01-01 01:01:01 9 9 4.5 971024.2 7 h n y s 1900-01-01 1900-01-01 01:01:01 10 10 5.0 631193.4 8 i o z r 1900-01-01 1900-01-01 01:01:01 11 5.5 879431.1 9 hjh q 1900-01-01 1900-01-01 01:01:01 > > ## With rownames and colnames and rowCol > write.fwf(testData, rownames=TRUE, rowCol="HI!") HI! num1 num2 num3 int1 fac1 fac2 cha1 cha2 Date POSIXt 1 1 1 f q 1900-01-01 1900-01-01 01:01:01 2 2 1.0 733070.3 2 a g r longer 1900-01-01 01:01:01 3 3 1.5 1214213.8 3 b h s y 1900-01-01 1900-01-01 01:01:01 4 4 2.0 553823.8 4 c i t x 1900-01-01 1900-01-01 01:01:01 5 5 2.5 1085022.9 d j u w 1900-01-01 6 6 3.0 571063.9 4 e k v v 1900-01-01 1900-01-01 01:01:01 7 7 3.5 606718.4 5 f l w u 1900-01-01 1900-01-01 01:01:01 8 8 4.0 1053686.6 6 g m x t 1900-01-01 1900-01-01 01:01:01 9 9 4.5 971024.2 7 h n y s 1900-01-01 1900-01-01 01:01:01 10 10 5.0 631193.4 8 i o z r 1900-01-01 1900-01-01 01:01:01 11 5.5 879431.1 9 hjh q 1900-01-01 1900-01-01 01:01:01 > > proc.time() user system elapsed 0.104 0.020 0.119 gdata/tests/test.reorder.factor.R0000644000176200001440000000030014631624774016523 0ustar liggesusers## Test results before and after loading gdata m <- factor(c("a", "b", "c")) (m1 <- reorder(m, X=c(3, 2, 1))) library(gdata) (m2 <- reorder(m, X=c(3, 2, 1))) stopifnot(identical(m1, m2)) gdata/tests/runRUnitTests.R0000644000176200001440000000550314631624774015451 0ustar liggesusers## The setup seems to be quite messy, but it is so to enable use of this in ## several ways as shown below. ## 1. "R CMD check" should be the most authoritative way to run the RUnit ## tests for a developer. RUnit tests are issued during R CMD check of the ## package due to example section of .runRUnitTests() function. If any test ## fails or if there are any R errors during RUnit testing, R CMD check fails. ## These are variable values specific for this way: ## - .path DEVEL/PATH/PKG.Rcheck/PKG/unitTests ## - .way function ## 2. Running ".runRUnitTests()" from within R after library(PKG) is handy for ## package useRs, since it enables useRs to be sure that all tests pass for ## their installation. This is just a convenient wrapper function to run ## the RUnit testing suite. These are variable values specific for this ## way: ## - .path INSTALL/PATH/PKG/unitTests ## - .way function ## 3. The "Shell" is another possibility, mainly for a developer in order to ## skip possibly lengthy R CMD check and perform just RUnit testing with an ## installed version of a pcakage. These are variable values specific for ## this way: ## - .path DEVEL/PATH/PKG/inst/unitTests ## - .way shell ## ## Rscript runRUnitTests.R ## R CMD BATCH runRUnitTests.R ## make ## make all PKG <- "gdata" if(require("RUnit", quietly=TRUE)) { path <- normalizePath("unitTests") cat("\nRunning unit tests\n") print(list(pkg=PKG, getwd=getwd(), pathToUnitTests=path)) library(package=PKG, character.only=TRUE) testFileRegexp <- "^runit.+\\.[rR]$" ## Debugging echo cat("\nRunning RUnit tests\n") print(list(pkg=PKG, getwd=getwd(), pathToRUnitTests=path)) ## Define tests testSuite <- defineTestSuite(name=paste(PKG, "RUnit testing"), dirs=path, testFileRegexp=testFileRegexp) ## Run tests <- runTestSuite(testSuite) if(file.access(path, 02) != 0) { ## Cannot write to path -> use writable one tdir <- tempfile(paste(PKG, "RUnitTests", sep="_")) dir.create(tdir) pathReport <- file.path(tdir, "report") } else { pathReport <- file.path(path, "report") } ## Print results: printTextProtocol(tests) printTextProtocol(tests, fileName=paste0(pathReport, ".txt")) ## Print HTML Version of results: printHTMLProtocol(tests, fileName=paste0(pathReport, ".html")) cat("\nRUnit reports also written to\n", pathReport, ".(txt|html)\n\n", sep="") ## Return stop() to cause R CMD check stop in case of ## - failures i.e. FALSE to RUnit tests or ## - errors i.e. R errors tmp <- getErrors(tests) if(tmp$nFail > 0 || tmp$nErr > 0) { stop("\n\nRUnit testing failed:\n", " - #test failures: ", tmp$nFail, "\n", " - #R errors: ", tmp$nErr, "\n\n") } } else { cat("R package 'RUnit' cannot be loaded - no unit tests run\n", "for package", PKG, "\n") } gdata/MD50000644000176200001440000001411014705625112011642 0ustar liggesusers6b6f69f4bbdc3e766be9fbdb28a2766c *ChangeLog 4dc4dd38a829ded450c89dfb80dd81cd *DESCRIPTION 8832513b8bdfdc39ad73efebbf9919bf *NAMESPACE cc5353b56571c7bbbdb1a972b5bfe001 *NEWS 92e3ca5e31d594044b8325a441142c37 *R/Args.R e5651937af66e256b619a1e05c9d7533 *R/ConvertMedUnits.R 38de1344cd5bc79f32a0b42e48b43965 *R/ans.R e46bf54efe7d8029d1aaea9b397ddafd *R/bindData.R 1fe1f8ba256580187a1a5b069b5b51cc *R/case.R 3b94dada8a7538df60c3cd9e2d213ba5 *R/cbindX.R 86eb2f339983dcc4a78f4666df8a0a46 *R/centerText.R 250089de2f4b896f3719d8079555b07d *R/combine.R 9baa24f0d88a2058eaffb559a969bb52 *R/drop.levels.R 65f088f69a1f7a9c486498d04b398637 *R/duplicated2.R a029c9e4da594fb8c79123f209636acc *R/env.R 757e12fc9a28a4573dad388131df4ec5 *R/first.R ec30fcbd9f6c4b0cd4c6c5ebaed9e214 *R/frameApply.R 9712d51934599dcde7f678e689bf0003 *R/getDateTimeParts.R a8842b866687d6c18a1c31145d2a804d *R/humanReadable.R c5bdeb65e81954a49fec7d53d43ef244 *R/interleave.R 42f544fa6c4dc542ffde62ec141738a6 *R/is.what.R 45389f1cd1683f8e965c3f3eefcb6c2f *R/keep.R 7bf1a96d05ff617bc69bf9e41683cb85 *R/left.R a9d238b5a83c8821b235ccbe004755ff *R/ll.R 613631768fe2aa6b60c0fd2d9f14d356 *R/ls.funs.R 46bf26660dbfc273d929dcf78fcdc024 *R/mapLevels.R 714e97e1ee4f3d6f4fa338b15728d553 *R/matchcols.R d341f1f9f641e3072469e0512c227e2f *R/mv.R 99f0b1f60a25d2307ab31df482788aca *R/nPairs.R 85f339a9534d96289857f4f3d6bf77f4 *R/nobs.R d318c6ae2af047eb7e98290a874900d6 *R/object_size.R d1c93703bf4cb8fbedf7d8de3ba344d2 *R/rename.vars.R 49bebfa00df8beec594f4adfd6d31f13 *R/reorder.R f57521211daaaf62b53dde3ea4095e5e *R/resample.R 6d69b4261d1412396361f388e84d18fd *R/startsWith.R 6ff7e70b153cf189af5f517b5df071a1 *R/trim.R 3b239e0152e841660678d9de57cc52f8 *R/trimSum.R c7ae0254ce5265c8077257cfc5de3198 *R/unknown.R bede546800e176f693994feda498156e *R/unmatrix.R 6aeb92210c09687edf3f2c1ccc3e5e0c *R/update.data.frame.R 937af1ffde030658afdb021fbeb0851d *R/update.list.R 8402ec0c40ced3172df8e357c0acab8b *R/upperTriangle.R 65fbf5e16408d2e622bc0e3a72711895 *R/wideByFactor.R a3610bdc57e76b62acc32e7f1eeba4a6 *R/write.fwf.R 0481460abb1fcc789869731a52a0dd49 *build/vignette.rds f7e8a655c7065f049f78a604d18c78fb *data/MedUnits.rda b19ba078add1b84a300ae1adb5167567 *inst/doc/mapLevels.R ec3dc2f5438f43ccb71dddb2c1de513c *inst/doc/mapLevels.Rnw db10d061446ee82f461f43a5833fa87d *inst/doc/mapLevels.pdf 788f58d8791841c0dd0a9bddfa28b8fe *inst/doc/unknown.R 86db5cd05b30d8f4e83494a55edb308f *inst/doc/unknown.Rnw 5247adcd040fc53e22acce9c6967cbc2 *inst/doc/unknown.pdf c8f145e9ea96bc469fade5f31a616c6c *man/Args.Rd d019aa8a2e84fef5491e890666ff0f9f *man/ConvertMedUnits.Rd 34f00196ebc9a2d5b6d70d08a6b2970c *man/MedUnits.Rd af0b3ce697073c50a072fb394b3d368d *man/ans.Rd c26b42797bf1927ae5ae30b14e80c000 *man/bindData.Rd a5031b1de2894adde1ab0307c9fd33b6 *man/case.Rd 9f11b3bcfe818ab603a2e826d8d6c0ba *man/cbindX.Rd 2adfd067b34674dc8f31a6080e1e6471 *man/centerText.Rd d78d55e6f6485fbd24f8044fd08061d9 *man/combine.Rd eb8d8b527e55aea9ba89f2b970fec1a9 *man/drop.levels.Rd aa0e35fc950e8232fd49f23bf57ab725 *man/duplicated2.Rd c4649e98b6efaf49682292c493095418 *man/env.Rd b0a05c54d99ad9a209b210503671fb8a *man/first.Rd 087180e9debaad67a604ab947d4f748f *man/frameApply.Rd fc485f38a09dcb3a8d238806eec3fd78 *man/gdata-defunct.Rd 588ae95cc134be22372167ab8e53a279 *man/gdata-package.Rd 2f8fe8e68cbc380b860e2e99142f0b64 *man/getDateTimePart.Rd 4a7ace8994dd7747d99ad61904273d36 *man/humanReadable.Rd 143ef489b358b0ceab5bb148b9b7d81b *man/interleave.Rd 44a1a293d752ca911aafd74b69ff6908 *man/is.what.Rd 0e8ad71b67de30adfd7619cce35a99b2 *man/keep.Rd 72ec6690ee9471d704ccc8b0c1fa018a *man/left.Rd c4e8c6a39a2ea78fe7cb7e24fc34467f *man/ll.Rd 9069c1cf6189d8ef66e0f6af167f5e10 *man/ls.funs.Rd b57657caa0a705646ebb0ef6c25fa515 *man/mapLevels.Rd 5bd5d60bac110184e6d45dcd7b72b9bd *man/matchcols.Rd 0a196ab50c3a32bcce116021ef86aa8b *man/mv.Rd e2be80f0fd9b253727d7832c70ac7d17 *man/nPairs.Rd d26c8b2afe6d62f89f9c3225ee9205b3 *man/nobs.Rd b2afcad4d45914d22e913353990ae64c *man/object_size.Rd c4fb4328f158efa0e1f345b0fedbc054 *man/rename.vars.Rd 0cc1b2f7f7a26460f97f1cc27d1b2bb4 *man/reorder.Rd a6d6f437a665cfc66c33854420ad3f88 *man/resample.Rd ee6e6ee66d4a5073338247ec12dcc357 *man/startsWith.Rd dc40531c6c7bad1838b81f89e564cbc5 *man/trim.Rd 813f7e2f4b14a269b620b8bf27271424 *man/trimSum.Rd 396c4089ac30322d2d9cca70c93c3e7c *man/unknown.Rd 2006c6ef35c1356381c76f01f25b77a4 *man/unmatrix.Rd 795838bb055d87c11f9691933466e4a9 *man/update.list.Rd df1d6b7314fb8f4205bba0b8b96354fe *man/upperTriangle.Rd 06c4a498180c876c9f244bd6726b923c *man/wideByFactor.Rd 6339aabb53b609eef67cbcd5d5eec598 *man/write.fwf.Rd 623c12086f1a54e186b40234ffeac7da *tests/runRUnitTests.R 9b929ccb1517cc109e25e81ce9c3016a *tests/test.humanReadable.R 3f5cc977cc864edb324ee9bf8c646668 *tests/test.humanReadable.Rout.save 38097a392eb64ca192984698d7a9cfc2 *tests/test.reorder.factor.R 1a35acdea8fe8693f7a6b26221e4ab26 *tests/test.reorder.factor.Rout.save dee3232474b92bcdf1ad75ca31080792 *tests/test.write.fwf.eol.R 5170ef9fcd9895aa8a85bdd7753a5b4a *tests/test.write.fwf.eol.Rout.save 3bbd1a18e54e73a0ae317bf16eae0a01 *tests/tests.write.fwf.R a4d1fcc74d626d7b2508a24476f87a45 *tests/tests.write.fwf.Rout.save 263cf2cf21a68e51ee2267fa9121f55f *tests/unitTests/Makefile 45e03a43cf845d07351f21d1968f0297 *tests/unitTests/runit.bindData.R 1c6480073863ef8b14645bdc1101857a *tests/unitTests/runit.cbindX.R 43eb8b00017ce4b075dc90bc28da73f7 *tests/unitTests/runit.drop.levels.R 9d4094b7064a700d14910843ecaa02f4 *tests/unitTests/runit.getDateTimeParts.R ed6159cd1daa279d51cc3a275ca3c3e5 *tests/unitTests/runit.mapLevels.R 59a1c806f771a342e095fd23aa241df3 *tests/unitTests/runit.nPairs.R ac86e711c1a0a6958f8dddd7e7ef825f *tests/unitTests/runit.reorder.factor.R e5c51d9263b90c048dc2d3bb789f2ca0 *tests/unitTests/runit.trim.R ce001d1738ebf20a5fb6a08e9dc9b125 *tests/unitTests/runit.trimSum.R b965670b22d55952992c87fab1dd6a00 *tests/unitTests/runit.unknown.R 0084ec1ddcceaa2218bfd85741f909d7 *tests/unitTests/runit.wideByFactor.R 87ec13f0096f4f7fe5a6effa3977514a *tests/unitTests/runit.write.fwf.R a7982b90f82857e34a253df2be42d7c1 *vignettes/Rnews.sty ec3dc2f5438f43ccb71dddb2c1de513c *vignettes/mapLevels.Rnw 86db5cd05b30d8f4e83494a55edb308f *vignettes/unknown.Rnw gdata/R/0000755000176200001440000000000014631624774011551 5ustar liggesusersgdata/R/keep.R0000644000176200001440000000132114631624774012615 0ustar liggesuserskeep <- function(..., list=character(), all=FALSE, sure=FALSE) { if(missing(...) && missing(list)) { warning("keep something, or use rm(list=ls()) to clear workspace - ", "nothing was removed") return(invisible(NULL)) } names <- as.character(substitute(list(...)))[-1] list <- c(list, names) keep.elements <- match(list, ls(1,all.names=all)) if(any(is.na(keep.elements))) { warning("you tried to keep '", list[which(is.na(keep.elements))[1]], "' which doesn't exist in workspace - nothing was removed") return(invisible(NULL)) } obj <- ls(1, all.names=all)[-keep.elements] if(sure) { rm(list=obj, pos=1) invisible(obj) } else { obj } } gdata/R/drop.levels.R0000644000176200001440000000073014631624774014131 0ustar liggesusersdrop.levels <- function(x, reorder=TRUE, ...) UseMethod("drop.levels") drop.levels.default <- function(x, reorder=TRUE, ...) x drop.levels.factor <- function(x, reorder=TRUE, ...) { x <- x[, drop=TRUE] if(reorder) x <- reorder(x, ...) x } drop.levels.list <- function(x, reorder=TRUE, ...) { lapply(x, drop.levels, reorder=reorder, ...) } drop.levels.data.frame <- function(x, reorder=TRUE, ...) { x[] <- drop.levels.list(x, reorder=reorder, ...) x } gdata/R/nobs.R0000644000176200001440000000111014631624774012626 0ustar liggesusers## Redefine here, so that the locally defined methods (particularly ## nobs.default) take precedence over the ones now defined in the ## stats package nobs <- function(object, ...) UseMethod("nobs") nobs.default <- function(object, ...) { if(is.numeric(object) || is.logical(object)) sum(!is.na(object)) else stats::nobs(object, ...) } nobs.data.frame <- function(object, ...) sapply(object, nobs.default) ## Now provided by 'stats' package, so provide alias to satisfy ## dependencies nobs.lm <- stats:::nobs.lm n_obs <- function(object, ...) nobs(object, ...) gdata/R/interleave.R0000644000176200001440000000170014631624774014030 0ustar liggesusersinterleave <- function(..., append.source=TRUE, sep=": ", drop=FALSE) { sources <- list(...) sources[sapply(sources, is.null)] <- NULL sources <- lapply(sources, function(x) if(is.matrix(x) || is.data.frame(x)) x else t(x)) nrows <- sapply(sources, nrow) mrows <- max(nrows) if(any(nrows!=mrows & nrows!=1)) stop("arguments have differing numbers of rows") sources <- lapply(sources, function(x) if(nrow(x)==1) x[rep(1,mrows),,drop=drop] else x) tmp <- do.call("rbind", sources) nsources <- length(sources) indexes <- outer((0:(nsources-1)) * mrows, 1:mrows, "+") retval <- tmp[indexes,,drop=drop] if(append.source && !is.null(names(sources))) { if(!is.null(row.names(tmp))) { row.names(retval) <- paste(format(row.names(retval)), format(names(sources)), sep=sep) } else { row.names(retval) <- rep(names(sources), mrows) } } retval } gdata/R/getDateTimeParts.R0000644000176200001440000000254614631624774015111 0ustar liggesusersgetYear <- function(x, format, ...) UseMethod("getYear") getYear.default <- function(x, format, ...) stop("'getYear' can only be used on objects of a date/time class") getYear.Date <- getYear.POSIXct <- getYear.POSIXlt <- function(x, format="%Y", ...) format(x=x, format=format, ...) getMonth <- function(x, format, ...) UseMethod("getMonth") getMonth.default <- function(x, format, ...) stop("'getMonth' can only be used on objects of a date/time class") getMonth.Date <- getMonth.POSIXct <- getMonth.POSIXlt <- function(x, format="%m", ...) format(x=x, format=format) getDay <- function(x, format, ...) UseMethod("getDay") getDay.default <- function(x, format, ...) stop("'getDay' can only be used on objects of a date/time class") getDay.Date <- getDay.POSIXct <- getDay.POSIXlt <- function(x, format="%d", ...) format(x=x, format=format) getHour <- function(x, format, ...) UseMethod("getHour") getHour.default <- function(x, format, ...) stop("'getHour' can only be used on objects of a date/time class") getMin <- function(x, format, ...) UseMethod("getMin") getMin.default <- function(x, format, ...) stop("'getMin' can only be used on objects of a date/time class") getSec <- function(x, format, ...) UseMethod("getSec") getSec.default <- function(x, format, ...) stop("'getSec' can only be used on objects of a date/time class") gdata/R/humanReadable.R0000644000176200001440000000424514631624774014431 0ustar liggesusershumanReadable <- function(x, units="auto", standard=c("IEC", "SI", "Unix"), digits=1, width=NULL, sep=" ", justify = c("right", "left")) { ## Setup suffix.SI <- c("B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB") suffix.IEC <- c("B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB") suffix.Unix <- c("B" , "K", "M", "G", "T", "P", "E", "Z", "Y") standard <- match.arg(standard) if(length(justify) == 1) justify <- c(justify, justify) ## Functions .applyHuman <- function(x, base, suffix, digits, width, sep) { ## Which suffix should we use? n <- length(suffix) i <- pmax(pmin(floor(log(x, base)), n-1),0) if(!is.finite(i)) i <- 0 x <- x / base^i ## Formatting if(is.null(width)) { ## the same formatting for all x <- format(round(x=x, digits=digits), nsmall=digits) } else { ## similar to ls, du, and df lenX <- nchar(x) if(lenX > width) { digits <- pmax(width - nchar(round(x)) - 1, 0) } if(i == 0) digits <- 0 x <- round(x, digits=digits) } c(x, suffix[i+1]) } ## Work if(any(x < 0)) stop("'x' must be positive") if(standard == "SI") { suffix <- suffix.SI base <- 10^3 } else if (standard=="IEC") { suffix <- suffix.IEC base <- 2^10 } else # (standard=="Unix) { suffix <- suffix.Unix base <- 2^10 } if(!missing(units) && units=="bytes") { retval <- rbind(x, "bytes") } else if(!missing(units) && units!="auto") { units <- suffix[match(toupper(units), toupper(suffix))] power <- match(units, suffix) -1 X <- x / (base^power) X <- format.default(x=X, digits=digits, nsmall=digits) retval <- rbind(X, rep(units, length(X))) } else { retval <- sapply(X=x, FUN=".applyHuman", base=base, suffix=suffix, digits=digits, width=width, sep=sep) } if(all(justify == "none")) { paste(trim(retval[1,]), trim(retval[2,]), sep=sep) } else { paste(format(trim(retval[1,]), justify=justify[1]), format(trim(retval[2,]), justify=justify[2]), sep=sep) } } gdata/R/env.R0000644000176200001440000000205214631624774012463 0ustar liggesusersenv <- function(unit="KB", digits=0) { get.object.size <- function(object.name, pos) { object <- get(object.name, pos=pos) size <- try(unclass(utils::object.size(object)), silent=TRUE) if(inherits(size, "try-error")) size <- 0 size } get.environment.size <- function(pos) { if(search()[pos]=="Autoloads" || length(ls(pos,all.names=TRUE))==0) size <- 0 else size <- sum(sapply(ls(pos,all.names=TRUE), get.object.size, pos=pos)) size } get.environment.nobjects <- function(pos) { length(ls(pos, all.names=TRUE)) } unit <- match.arg(unit, c("bytes","KB","MB")) denominator <- switch(unit, "KB"=1024, "MB"=1024^2, 1) size.vector <- sapply(seq(along=search()), get.environment.size) size.vector <- round(size.vector/denominator, digits) nobjects.vector <- sapply(seq(along=search()), get.environment.nobjects) env.frame <- data.frame(search(), nobjects.vector, size.vector) names(env.frame) <- c("Environment", "Objects", unit) print(env.frame, right=FALSE) invisible(env.frame) } gdata/R/object_size.R0000644000176200001440000000342014631624774014173 0ustar liggesusersobject_size <- function(...) { structure(sapply(list(...), utils::object.size), class=c("object_sizes", "numeric")) } print.object_sizes <- function(x, quote=FALSE, humanReadable=getOption("humanReadable"), standard="IEC", units, digits=1, width=NULL, sep=" ", justify = c("right", "left"), ...) { print(format(x, humanReadable=humanReadable, standard=standard, units=units, digits=digits, width=width, sep=sep, justify=justify), quote=quote, ...) invisible(x) } format.object_sizes <- function(x, humanReadable=getOption("humanReadable"), standard="IEC", units, digits=1, width=NULL, sep=" ", justify = c("right", "left"), ...) { if(!missing(units)) { if (units=="bytes") paste(x, "bytes") else humanReadable(x, standard=standard, units=units, digits=digits, width=width, sep=sep, justify=justify) } else if(is.null(humanReadable) || humanReadable==FALSE) { paste(x, "bytes") } else { humanReadable(x, standard=standard, units=units, digits=digits, width=width, sep=sep, justify=justify) } } is.object_sizes <- function(x) inherits(x, what="object_sizes") as.object_sizes <- function(x) { if(!is.numeric(x) || any(x<0)) stop("'x' must be a positive numeric vector") class(x) <- c("object_sizes", "numeric") x } c.object_sizes <- function(..., recursive=FALSE) { x <- NextMethod() if(is.numeric(x)) class(x) <- c("object_sizes", "numeric") x } object.size <- function(...) { .Deprecated(old="gdata::object.size", new="object_size() or utils::object.size()") object_size(...) } gdata/R/left.R0000644000176200001440000000162514631624774012632 0ustar liggesusersleft <- function(x, n=6L, ...) UseMethod("left") right <- function(x, n=6L, ...) UseMethod("right") .leftright <- function(x, n=6L, add.col.nums = TRUE, direction = c("left", "right"), ...) { stopifnot(length(n) == 1L) ncx <- ncol(x) if (add.col.nums && is.null(colnames(x))) colnames(x) <- paste0("[", 1:ncx, ",]") if (n < 0L) n <- max(ncx + n, 0L) else n <- min(n, ncx) if (direction == "left") sel <- seq.int(from=1, length.out = n) else # direction="right" sel <- seq.int(to = ncx, length.out = n) x[, sel, drop = FALSE] } left.data.frame <- function(x, n=6L, add.col.nums=TRUE, ...) .leftright(x, n=n, add.col.nums=add.col.nums, direction="left") right.data.frame <- function(x, n=6L, add.col.nums=TRUE, ...) .leftright(x, n=n, add.col.nums=add.col.nums, direction="right") left.matrix <- left.data.frame right.matrix <- right.data.frame gdata/R/matchcols.R0000644000176200001440000000132614631624774013653 0ustar liggesusersmatchcols <- function(object, with, without, method=c("and","or"), ...) { method <- match.arg(method) cols <- colnames(object) # Include columns matching 'with' pattern(s) if(method == "and") { for(i in 1:length(with)) { if(length(cols)>0) cols <- grep(with[i], cols, value=TRUE, ...) } } else if(!missing(with)) { if(length(cols)>0) cols <- sapply(with, grep, x=cols, value=TRUE, ...) } # Exclude columns matching 'without' pattern(s) if(!missing(without)) { for(i in 1:length(without)) { if(length(cols) > 0) { omit <- grep(without[i], cols, ...) if(length(omit) > 0) cols <- cols[-omit] } } } cols } gdata/R/unknown.R0000644000176200001440000001254114631624774013376 0ustar liggesusersisUnknown <- function(x, unknown=NA, ...) UseMethod("isUnknown") isUnknown.default <- function(x, unknown=NA, ...) { if(is.list(unknown)) unknown <- unlist(unknown) ret <- x %in% unknown if(any(is.na(unknown))) ret <- ret | is.na(x) ret } isUnknown.POSIXlt <- function(x, unknown=NA, ...) { ## FIXME: codetools say ## isUnknown.POSIXlt: wrong number of arguments to as.character if(is.list(unknown) && !inherits(x=unknown, what="POSIXlt")) { unknown <- lapply(unknown, FUN=as.character, ...) } else { unknown <- as.character(x=unknown, ...) } if(is.list(x) && !inherits(x=x, what="POSIXlt")) { x <- lapply(x, FUN=as.character, ...) } else { x <- as.character(x=x, ...) } isUnknown.default(x=as.character(x), unknown=as.character(unknown)) } isUnknown.list <- function(x, unknown=NA, ...) { unknown <- .unknownList(x=x, unknown=unknown) x <- mapply(FUN="isUnknown", x=x, unknown=unknown, ..., SIMPLIFY=FALSE) x } isUnknown.data.frame <- function(x, unknown=NA, ...) { x[] <- isUnknown.list(x, unknown=unknown, ...) x } isUnknown.matrix <- function(x, unknown=NA, ...) apply(X=x, MARGIN=ifelse(ncol(x) > nrow(x), 1, 2), FUN=isUnknown, unknown=unknown) unknownToNA <- function(x, unknown, warning=FALSE, ...) UseMethod("unknownToNA") unknownToNA.default <- function(x, unknown, warning=FALSE, ...) { if(warning) { if(any(is.na(x))) warning("'x' already has NA") } is.na(x) <- isUnknown(x=x, unknown=unknown) x } unknownToNA.factor <- function(x, unknown, warning=FALSE, ...) { ## could put this func into default method, but I need unlisted unknown ## for levels handling if(warning) { if(any(is.na(x))) warning("'x' already has NA") } if(is.list(unknown)) unknown <- unlist(unknown) ## Levels handling - read help page on this levs <- levels(x) levs <- levs[!(levs %in% unknown)] factor(x, levels=levs) } unknownToNA.list <- function(x, unknown, warning=FALSE, ...) { unknown <- .unknownList(x=x, unknown=unknown) x <- mapply(FUN="unknownToNA", x=x, unknown=unknown, warning=warning, SIMPLIFY=FALSE) return(x) } unknownToNA.data.frame <- function(x, unknown, warning=FALSE, ...) { x[] <- unknownToNA.list(x=x, unknown=unknown, warning=warning) x } NAToUnknown <- function(x, unknown, force=FALSE, call.=FALSE, ...) UseMethod("NAToUnknown") NAToUnknown.default <- function(x, unknown, force=FALSE, call.=FALSE, ...) { if(length(as.character(unknown)) != 1) # as.character allows also POSIXlt stop("'unknown' must be a single value") if(any(isUnknown(x, unknown=unknown)) && !force) stop(sprintf("'x' already has value %s", dQuote(unknown))) classX <- class(x)[1] classUnk <- class(unknown)[1] if(classX != classUnk) { tmp <- c("integer", "numeric") if(!(classX %in% tmp && classUnk %in% tmp)) { warning(sprintf("'unknown' should be %s for %s 'x' - will try to coerce", dQuote(classX), dQuote(classX)), call.=call.) } unknown <- do.call(paste("as.", classX, sep=""), args=list(unknown)) } x[is.na(x)] <- unknown x } NAToUnknown.factor <- function(x, unknown, force=FALSE, call.=FALSE, ...) { if(length(unknown) != 1) stop("'unknown' must be a single value") if(any(isUnknown(x, unknown=unknown))) { if(!force) stop(sprintf("'x' already has level %s", dQuote(unknown))) } else { mapLevels(x) <- c(mapLevels(x, codes=FALSE), mapLevels(as.character(unknown), codes=FALSE)) } x[is.na(x)] <- unknown if(!force) warning(sprintf("new level is introduced: %s", unknown), call.=call.) x } NAToUnknown.list <- function(x, unknown, force=FALSE, call.=FALSE, ...) { unknown <- .unknownList(x=x, unknown=unknown) x <- mapply(FUN="NAToUnknown", x=x, unknown=unknown, force=force, call.=call., SIMPLIFY=FALSE) x } NAToUnknown.data.frame <- function(x, unknown, force=FALSE, call.=FALSE, ...) { x[] <- NAToUnknown.list(x=x, unknown=unknown, force=force, call.=call.) x } .unknownList <- function(x, unknown) { ## Setup n <- length(x) unkN <- length(unknown) namesX <- names(x) namesXNullTest <- is.null(namesX) unkNames <- names(unknown) unkNamesNullTest <- is.null(unkNames) defInNames <- ".default" %in% unkNames defInd <- unkNames %in% ".default" def <- unknown[defInd] if(defInNames) { # remove default unkN <- unkN - 1 unkNames <- unkNames[!defInd] unknown <- unknown[!defInd] } if(!namesXNullTest) { # check for nonexistent name test <- !(unkNames %in% namesX) if(any(test)) stop(sprintf("name(s) %s not in names of 'x'", paste(sQuote(unkNames[test]), collapse=" "))) } ## Recycle if(unkN < n) { if(unkNamesNullTest | defInNames) { if(defInNames) { # handling .default names(def) <- NULL unknownDef <- rep(def, length=(n - unkN)) names(unknownDef) <- namesX[!(namesX %in% unkNames)] unknown <- c(unknownDef, unknown) } else { unknownDef <- unknown unknown <- rep(unknownDef, length=n) } } else { stop("can not propely recycle named 'unknown'") } } ## Names if(!namesXNullTest) { # no need if namesX NULL if(unkNamesNullTest) { # missing unkNames names(unknown) <- namesX } else { # unkNames known unknown <- unknown[match(namesX, names(unknown))] } } unknown } gdata/R/duplicated2.R0000644000176200001440000000030514631624774014072 0ustar liggesusersduplicated2 <- function(x, bothWays=TRUE, ...) { if(!bothWays) { return(duplicated(x, ...)) } else if(bothWays) { return((duplicated(x, ...) | duplicated(x, fromLast=TRUE, ...))) } } gdata/R/unmatrix.R0000644000176200001440000000063014631624774013542 0ustar liggesusersunmatrix <- function(x, byrow=FALSE) { rnames <- rownames(x) cnames <- colnames(x) if(is.null(rnames)) rnames <- paste("r",1:nrow(x),sep='') if(is.null(cnames)) cnames <- paste("c",1:ncol(x),sep='') nmat <- outer(rnames, cnames, paste, sep=":") if(byrow) { vlist <- c(t(x)) names(vlist) <- c(t(nmat)) } else { vlist <- c(x) names(vlist) <- c(nmat) } return(vlist) } gdata/R/update.data.frame.R0000644000176200001440000000162114631624774015157 0ustar liggesusersupdate.data.frame <- function(object, new, by, by.x=by, by.y=by, append=TRUE, verbose=FALSE, ...) { x <- object y <- new retval <- x x.by <- x[[by.x]] y.by <- y[[by.y]] matches.x <- match(y.by, x.by) matches.y <- which(!is.na(matches.x)) nomatch.y <- which(is.na(matches.x)) matches.x <- matches.x[!is.na(matches.x)] if(length(matches.x)>0) retval[matches.x, ] <- y[matches.y,] if(length(nomatch.y) && append) retval <- rbind(retval, y[nomatch.y,]) if(verbose) { cat("\n") cat("Number of rows in x :", nrow(x), "\n") cat("Number of rows in y :", nrow(y), "\n") cat("\n") cat("Number of rows replaced :", length(matches.x), "\n") cat("Number of rows appended :", length(nomatch.y), "\n") cat("\n") cat("Number of rows in result:", nrow(retval), "\n") cat("\n") } retval } gdata/R/write.fwf.R0000644000176200001440000001434714631624774013620 0ustar liggesuserswrite.fwf <- function(x, file="", append=FALSE, quote=FALSE, sep=" ", na="", rownames=FALSE, colnames=TRUE, rowCol=NULL, justify="left", formatInfo=FALSE, quoteInfo=TRUE, width=NULL, eol="\n", qmethod=c("escape", "double"), scientific=TRUE, ...) { ## Setup dapply <- function(x, FUN, ..., simplify=TRUE) { if(is.data.frame(x)) return(sapply(x, FUN, ..., simplify=simplify)) else if(is.matrix(x)) return(apply(x, 2, FUN, ...)) else stop("x must be a data.frame or a matrix") } if(!(is.data.frame(x) || is.matrix(x))) stop("'x' must be a data.frame or matrix") if(length(na) > 1) stop("only single value can be defined for 'na'") if(!scientific) { option.scipen <- getOption("scipen") on.exit(function() options("scipen"=option.scipen)) options("scipen"=100) } if(rownames) { x <- as.data.frame(x) x <- cbind(rownames(x), x) rowColVal <- ifelse(!is.null(rowCol), rowCol, "row") colnames(x)[1] <- rowColVal } colnamesMy <- colnames(x) if(length(colnamesMy) == 0) colnamesMy <- paste0("V", 1:ncol(x)) nRow <- nrow(x) nCol <- length(colnamesMy) widthNULL <- is.null(width) if(!widthNULL && length(width) != nCol) { warning("recycling 'width'") widthOld <- width width <- integer(length=nCol) width[] <- widthOld } ## Format info retFormat <- data.frame(colname=colnamesMy, nlevels=0, position=0, width=0, digits=0, exp=0, stringsAsFactors=FALSE) ## Which columns are numeric like isNum <- dapply(x, is.numeric) ## is.numeric picks also Date and POSIXt isNum <- isNum & !(dapply(x, inherits, what="Date") | dapply(x, inherits, what="POSIXt")) ## Which columns are factors -> convert them to character isFac <- dapply(x, is.factor) if(any(isFac)) { ## This conditional is necessary because if x is a matrix, even if ## all(isFAC==FALSE), this assignment will coerce it to mode ## character. This isn't a problem for data frames. x[, isFac] <- sapply(x[, isFac, drop=FALSE], as.character) } ## Collect information about how format() will format columns. ## We need this info since format will turn all columns to character tmp <- dapply(x, format.info, ..., simplify=FALSE) if(is.matrix(x)) tmp <- as.data.frame(tmp) tmp1 <- sapply(tmp, length) tmp <- t(as.data.frame(tmp)) retFormat$width <- tmp[, 1] ## Collect other details for numeric columns if(any(isNum)) { ## Numeric columns with digits test <- tmp1 > 1 if(any(test)) { retFormat[test, c("digits", "exp")] <- tmp[test, c(2, 3)] ## Numeric columns with scientific notation test2 <- tmp[test, 3] > 0 if(any(test2)) # adding +1; see ?format.info retFormat[test, ][test2, "exp"] <- retFormat[test, ][test2, "exp"] + 1 } } ## Format ## Store original object in 'y' y <- x ## Formatting (to character) for(i in 1:nCol) { if(widthNULL) { tmp <- NULL } else { tmp <- width[i] } ## Due to na.encode bug in format() in 2.7.1; na.encode=TRUE should ## return NA values and not "NA", but even then we rely on the ## following test to "fiddle" with the value in 'na' argument since - ## NA should not increase the width of column with width 1, while wider ## value for 'na' should increase the width test <- is.na(y[, i]) ## Make a copy to make sure we get character after first format() ## Date class caused problems x2 <- character(length=nRow) ## Add formatted values x2[!test] <- format(y[!test, i], justify=justify, width=tmp, ...) ## Add 'na' value x2[test] <- na ## Replace the original x[, i] <- x2 ## Collect width (again) tmp2 <- format.info(x2, ...)[1] ## Reformat if 'na' value change the width of the column if(tmp2 != retFormat[i, "width"]) { retFormat[i, "width"] <- tmp2 ## ifelse() makes sure that numeric columns are justified to right x[, i] <- format(x[, i], justify=ifelse(isNum[i], "right", justify), width=tmp, ...) } ## Reformat 'na' value if it is narrower than the width of the column if(nchar(na) < retFormat[i, "width"]) { x[test, i] <- format(na, justify=ifelse(isNum[i], "right", justify), width=retFormat[i, "width"], ...) } } ## Number of levels for "non-numeric"" columns if(any(!isNum)) { retFormat[!isNum, "nlevels"] <- dapply(x[, !isNum, drop=FALSE], function(z) length(unique(z))) } ## Check that width was not to small if(!widthNULL) { test <- retFormat$width > width if(any(test)) { tmpCol <- paste(colnamesMy[test], collapse=", ") tmpWidth <- paste(width[test], collapse=", ") tmpNeed <- paste(retFormat$width[test], collapse=", ") stop(paste0("'width' (", tmpWidth, ") was too small for columns: ", tmpCol, "\n 'width' should be at least (", tmpNeed, ")")) } } ## Write if(colnames) { if(rownames && is.null(rowCol)) colnamesMy <- colnamesMy[-1] write.table(t(as.matrix(colnamesMy)), file=file, append=append, quote=quote, sep=sep, eol=eol, na=na, row.names=FALSE, col.names=FALSE, qmethod=qmethod) } write.table(x=x, file=file, append=(colnames || append), quote=quote, sep=sep, eol=eol, na=na, row.names=FALSE, col.names=FALSE, qmethod=qmethod) ## Return format and fixed width information if(formatInfo) { ## Be careful with these ifelse constructs retFormat$position[1] <- ifelse(quote, ifelse(quoteInfo, 1, 2), 1) if(ifelse(quote, quoteInfo, FALSE)) retFormat$width <- retFormat$width + 2 N <- nrow(retFormat) if(N > 1) { for(i in 2:N) { retFormat$position[i] <- retFormat$position[i - 1] + retFormat$width[i - 1] + nchar(x=sep, type="chars") + ifelse(quote, ifelse(quoteInfo, 0, 1), 0) } } if(rownames && is.null(rowCol)) { retFormat <- retFormat[-1,] rownames(retFormat) <- 1:(N-1) } return(retFormat) } } gdata/R/mapLevels.R0000644000176200001440000001642314631624774013632 0ustar liggesusersmapLevels <- function(x, codes=TRUE, sort=TRUE, drop=FALSE, combine=FALSE, ...) { UseMethod("mapLevels") } mapLevels.default <- function(x, codes=TRUE, sort=TRUE, drop=FALSE, combine=FALSE, ...) { stop(sprintf("mapLevels can only be used on %s and %s atomic 'x'", dQuote("factor"), dQuote("character"))) } mapLevels.character <- function(x, codes=TRUE, sort=TRUE, drop=FALSE, combine=FALSE, ...) { mapLevels.factor(x=x, codes=codes, sort=sort, drop=drop, ...) } ## Could coerce character to factor and then use factor method, but that ## is more expensive than simple unique and length used below in factor ## method mapLevels.factor <- function(x, codes=TRUE, sort=TRUE, drop=FALSE, combine=FALSE, ...) { ## Argument actions if(is.factor(x)) { # factor if(drop) x <- factor(x) nlevs <- nlevels(x) levs <- levels(x) } else { # character levs <- unique(x) nlevs <- length(levs) if(sort) levs <- sort(levs, ...) } ## Create a map map <- vector(mode="list", length=nlevs) names(map) <- levs if(codes) { map[1:nlevs] <- 1:nlevs } else { map[1:nlevs] <- levs } class(map) <- "levelsMap" map } mapLevels.list <- function(x, codes=TRUE, sort=TRUE, drop=FALSE, combine=FALSE, ...) { map <- lapply(x, mapLevels, codes=codes, sort=sort, drop=drop, ...) class(map) <- "listLevelsMap" if(combine) { if(!codes) { return(c(map, sort=sort, recursive=TRUE)) } else { stop(sprintf("can not combine integer %s", dQuote("levelsMaps"))) } } map } mapLevels.data.frame <- function(x, codes=TRUE, sort=TRUE, drop=FALSE, combine=FALSE, ...) { mapLevels.list(x, codes=codes, sort=sort, drop=drop, combine=combine, ...) } .unlistLevelsMap <- function(x, ind=FALSE) { y <- unlist(x, use.names=FALSE) len <- sapply(x, FUN=length) names(y) <- rep(names(x), times=len) if(ind) { return(list(y, rep(1:length(x), times=len), len)) } else { return(y) } } print.levelsMap <- function(x, ...) { x <- .unlistLevelsMap(x) print(x, ...) } print.listLevelsMap <- function(x, ...) { class(x) <- "list" print(x, ...) } ## We need these two since [.list method drops class "[.levelsMap" <- function(x, i) { classX <- class(x) class(x) <- "list" x <- x[i] class(x) <- classX x } "[.listLevelsMap" <- function(x, i) { classX <- class(x) class(x) <- "list" x <- x[i] class(x) <- classX x } is.levelsMap <- function(x) inherits(x=x, what="levelsMap") is.listLevelsMap <- function(x) inherits(x=x, what="listLevelsMap") .isCharacterMap <- function(x) { if(is(x) == "levelsMap") { return(inherits(x=unlist(x), what="character")) } else { stop(sprintf("can be used only on %s", dQuote("levelsMap"))) } } as.levelsMap <- function(x, check=TRUE, ...) { if(check) .checkLevelsMap(x, method="raw") class(x) <- "levelsMap" unique(x, ...) } as.listLevelsMap <- function(x, check=TRUE) { if(check) .checkListLevelsMap(x, method="raw") class(x) <- "listLevelsMap" x } .checkLevelsMap <- function(x, method) { xLab <- deparse(substitute(x)) also <- "\b" if(method == "class") { also <- "also" if(!is.levelsMap(x)) stop(sprintf("'%s' must be a %s", xLab, dQuote("levelsMap"))) } if(!is.list(x) || is.null(names(x))) stop(sprintf("'%s' must be %s a named list", xLab, also)) ## Components can be of different length ## if(!all(sapply(x, FUN=length) == 1)) ## stop(sprintf("all components of '%s' must have length 1", xLab)) } .checkListLevelsMap <- function(x, method) { xLab <- deparse(substitute(x)) also <- "\b" if(method == "class") { also <- "also" if(!is.listLevelsMap(x)) stop(sprintf("'%s' must be a %s", xLab, dQuote("listLevelsMap"))) } if(!is.list(x) || any(!sapply(x, FUN=is.levelsMap))) stop(sprintf("'%s' must be %s a list of %s", xLab, also, dQuote("levelsMap"))) lapply(x, FUN=.checkLevelsMap, method=method) } c.levelsMap <- function(..., sort=TRUE, recursive=FALSE) { x <- list(...) class(x) <- "listLevelsMap" ## We use recursive=TRUE here because ... is a lists of lists c(x, sort=sort, recursive=TRUE) } c.listLevelsMap <- function(..., sort=TRUE, recursive=FALSE) { x <- list(...) lapply(x, FUN=.checkListLevelsMap, method="class") x <- unlist(x, recursive=FALSE) if(!recursive) { class(x) <- "listLevelsMap" } else { if(any(!sapply(x, FUN=.isCharacterMap))) stop(sprintf("can not combine integer %s", dQuote("levelsMaps"))) if(!is.null(names(x))) names(x) <- NULL x <- unlist(x, recursive=FALSE) ## How to merge components with the same name? class(x) <- "levelsMap" if(sort) x <- sort(x) x <- unique(x) } x } sort.levelsMap <- function(x, decreasing=FALSE, na.last=TRUE, ...) x[order(names(x), na.last=na.last, decreasing=decreasing)] unique.levelsMap <- function(x, incomparables=FALSE, ...) { ## Find duplicates y <- .unlistLevelsMap(x, ind=TRUE) ## Duplicates for values and names combinations test <- duplicated(cbind(y[[1]], names(y[[1]])), incomparables=incomparables, ...) if(any(test)) { if(any(y[[3]] > 1)) { # work with the same structure as in x j <- 1 k <- y[[3]][1] empty <- NULL for(i in seq(along=x)) { # how slow is this loop? tmp <- !test[j:k] if(all(!tmp)) { # these components will be empty empty <- c(empty, i) } else { x[[i]] <- x[[i]][tmp] } j <- j + y[[3]][i] k <- k + y[[3]][i + 1] } if(!is.null(empty)) x[empty] <- NULL } else { # simple one-length components x <- x[!test] } } x } "mapLevels<-" <- function(x, value) UseMethod("mapLevels<-") "mapLevels<-.default" <- function(x, value) { ## Checks classX <- c("integer", "character", "factor") if(any(!(class(x) %in% classX))) stop(sprintf("'x' must be either: %s", paste(dQuote(classX), collapse=", "))) .checkLevelsMap(x=value, method="class") ## Mapping levels in x char <- all(sapply(value, is.character)) int <- all(sapply(value, is.integer)) if(int) { # codes=TRUE if(is.integer(x)) x <- factor(x) if(is.factor(x)) levels(x) <- value if(is.character(x)) stop(sprintf("can not apply integer %s to %s", dQuote("levelsMap"), dQuote("character"))) } else { # codes=FALSE if(!char) stop("all components of 'value' must be of the same class") if(is.character(x)) x <- factor(x) if(is.factor(x)) levels(x) <- value if(is.integer(x)) stop(sprintf("can not apply character %s to %s", dQuote("levelsMap"), dQuote("integer"))) } x } "mapLevels<-.list" <- function(x, value) { if(!is.listLevelsMap(value)) { if(is.levelsMap(value)) { value <- as.listLevelsMap(list(value), check=FALSE) ## No need for check as default method does checking anyway } else { stop(sprintf("'x' must be either %s or %s", dQuote("listLevelsMap"), dQuote("levelsMap"))) } } x <- mapply(FUN="mapLevels<-", x=x, value=value, SIMPLIFY=FALSE) x } "mapLevels<-.data.frame" <- function(x, value) { x[] <- "mapLevels<-.list"(x, value) x } gdata/R/ls.funs.R0000644000176200001440000000044014631624774013262 0ustar liggesusersls.funs <- function (...) { mycall <- match.call() mycall[[1]] <- as.name("ls") nameList <- eval.parent(mycall) if(length(nameList) > 0) { funcFlags <- sapply(nameList, function(x) is.function(get(x))) return(nameList[funcFlags]) } else { return(list()) } } gdata/R/nPairs.R0000644000176200001440000000233314631624774013131 0ustar liggesusers## Number of variable pairs nPairs <- function(x, margin=FALSE, names=TRUE, abbrev=TRUE, ...) { ## Setup if(!is.data.frame(x) & !is.matrix(x)) stop("'x' must be a data.frame or a matrix") k <- ncol(x) if(!margin) { ret <- matrix(nrow=k, ncol=k) } else { ret <- matrix(nrow=k, ncol=k + 1) } ## Count diag(ret)[1:k] <- apply(X=x, MARGIN=2, FUN=function(x) sum(!is.na(x))) for(i in 1:k) { for(j in i:k) { ret[i, j] <- ret[j, i] <- sum(!is.na(x[, i]) & !is.na(x[, j])) if(margin) { if(i == 1) { ret[i, (k + 1)] <- ret[1, 1] } else { ret[i, (k + 1)] <- sum(rowSums(!is.na(x[, c(1:i)])) == i) } } } } ## Names if(names) { tmp <- colnames(x) if(abbrev) tmp <- as.character(abbreviate(tmp, ...)) rownames(ret) <- tmp if(margin) { colnames(ret) <- c(tmp, "all") } else { colnames(ret) <- tmp } } class(ret) <- c("nPairs", class(ret)) ret } summary.nPairs <- function(object, ...) { n <- nrow(object) ret <- matrix(data=0, nrow=n, ncol=n) for(i in 1:n) { tmp <- 1:n tmp <- tmp[!(tmp == i)] ret[i, tmp] <- object[i, i] - object[i, tmp] } dimnames(ret) <- dimnames(object) ret } gdata/R/reorder.R0000644000176200001440000000161714631624774013343 0ustar liggesusersreorder.factor <- function(x, X, FUN, ..., order=is.ordered(x), new.order, sort=mixedsort) { constructor <- if (order) ordered else factor if(!missing(X) || !missing(FUN)) { if(missing(FUN)) FUN <- 'mean' ## I would prefer to call stats::reorder.default directly, ## but it is not exported from stats, so the relevant code is ## replicated here: ## --> scores <- tapply(X = X, INDEX = x, FUN = FUN, ...) levels <- names(base::sort(scores, na.last = TRUE)) if(order) ans <- ordered(x, levels=levels) else ans <- factor(x, levels=levels) attr(ans, "scores") <- scores ## <-- return(ans) } else if (!missing(new.order)) { if (is.numeric(new.order)) new.order <- levels(x)[new.order] else new.order <- new.order } else new.order <- sort(levels(x)) constructor(x, levels=new.order) } gdata/R/ans.R0000644000176200001440000000003614631624774012454 0ustar liggesusersans <- function() .Last.value gdata/R/first.R0000644000176200001440000000044014631624774013021 0ustar liggesusersfirst <- function(x, n=1, ...) head(x, n=n, ...) last <- function(x, n=1, ...) tail(x, n=n, ...) "first<-" <- function(x, n=1, ..., value) { x[1:n] <- value[1:n] x } "last<-" <- function(x, n=1, ..., value) { index <- seq(length(x)-n+1, length(x)) x[index] <- value[1:n] x } gdata/R/wideByFactor.R0000644000176200001440000000203514631624774014256 0ustar liggesuserswideByFactor <- function(x, factor, common, sort=TRUE, keepFactor=TRUE) { ## Setup if(!is.data.frame(x)) stop("'x' must be a data frame") if(length(factor) != 1) stop("'factor' can be only of length one") if(!is.factor(x[[factor]])) stop("column defined in 'factor' must be a factor") if(sort) x <- x[order(x[[factor]]), ] ## Extend by factors levels y <- x[common] if(keepFactor) y[factor] <- x[factor] levs <- levels(x[[factor]]) ## Remove common and factor from the list of column names other <- names(x) other <- other[!(other %in% common) & !(other %in% factor)] ## Add all other columns but as a set for each level of a factor for(level in levs) { for(col in other) { ## Add a column col y[paste(col, level, sep=".")] <- x[col] ## Fill with NA for other levels than level y[x[factor] != level, paste(col, level, sep=".")] <- NA ## This filling might be inefficient if there is large number ## of levels, since there will be quite a lot of filling. } } y } gdata/R/ConvertMedUnits.R0000644000176200001440000000310114631624774014760 0ustar liggesusersConvertMedUnits <- function(x, measurement, abbreviation, to=c("Conventional","SI","US"), exact=!missing(abbreviation)) { MedUnits <- NULL # define to avoid R CMD check warning data(MedUnits, package='gdata', envir=environment()) to=match.arg(to) if(!missing(measurement) && missing(abbreviation)) { if(exact) matchUnits <- MedUnits[tolower(MedUnits$Measurement) == tolower(measurement),] else matchUnits <- MedUnits[grep(measurement, MedUnits$Measurement, ignore.case=TRUE),] } else if(missing(measurement) && !missing(abbreviation)) { if(exact) matchUnits <- MedUnits[tolower(MedUnits$Abbreviation) == tolower(abbreviation),] else matchUnits <- MedUnits[grep(match, MedUnits$Abbrevation, ignore.case=TRUE),] } else # both missing or both specified stop("one of `measurement' or `abbreviation' must be specified") if(nrow(matchUnits) > 1) stop( paste("More than one matching row. Please use 'exact=TRUE' ", "and supply one of these matching strings:", paste('\t"',matchUnits$Measurement, '"', sep='', collapse="\n\t"), sep="\n\t")) else if (nrow(matchUnits) < 1) stop("No match") if (to %in% c("Convetional", "US")) { retval <- x / matchUnits$Conversion attr(retval,"units") <- matchUnits$ConventionalUnits } else { retval <- x * matchUnits$Conversion attr(retval,"units") <- matchUnits$SIUnits } retval } gdata/R/combine.R0000644000176200001440000000101314631624774013303 0ustar liggesuserscombine <- function(..., names=NULL) { tmp <- list(...) if(is.null(names)) names <- names(tmp) if(is.null(names)) names <- sapply(as.list(match.call()), deparse)[-1] if(any(sapply(tmp, is.matrix) | sapply(tmp, is.data.frame))) { len <- sapply(tmp, function(x) c(dim(x),1)[1]) len[is.null(len)] <- 1 data <- rbind(...) } else { len <- sapply(tmp,length) data <- unlist(tmp) } namelist <- factor(rep(names, len), levels=names) return(data.frame(data, source=namelist)) } gdata/R/cbindX.R0000644000176200001440000000147514631624774013112 0ustar liggesuserscbindX <- function(...) { ## Setup x <- list(...) ## Are all objects matrices or data.frames? test <- sapply(x, function(z) is.matrix(z) | is.data.frame(z)) if(any(!test)) stop("only matrices and data.frames can be used") ## Get maximum number of rows tmp <- sapply(x, nrow) maxi <- which.max(tmp) test <- tmp < tmp[maxi] ## Core ## Adding additional 'empty' rows so all objects have same number of rows for(i in 1:length(tmp)) { if(test[i]) { add <- matrix(nrow=tmp[maxi] - tmp[i], ncol=ncol(x[[i]])) if(is.data.frame(x[[i]])) { add <- as.data.frame(add) } colnames(add) <- colnames(x[[i]]) x[[i]] <- rbind(x[[i]], add) } } ## Column-bind all objects ret <- x[[1]] for(i in 2:length(tmp)) { ret <- cbind(ret, x[[i]]) } ## Return ret } gdata/R/trimSum.R0000644000176200001440000000072414631624774013337 0ustar liggesuserstrimSum <- function(x, n, right=TRUE, na.rm=FALSE, ...) { ## Setup if(!is.vector(x) | is.list(x)) stop("'x' must be a vector - for now") if(!is.numeric(x)) stop("'x' must be numeric") if(length(x) <= n) stop("'n' must be smaller than the length of x") ## Trim N <- length(x) if(right) { x2 <- x[1:n] x2[n] <- sum(x[n:N], na.rm=na.rm) } else { k <- (N - n + 1) x2 <- x[k:N] x2[1] <- sum(x[1:k], na.rm=na.rm) } x2 } gdata/R/centerText.R0000644000176200001440000000056014631624774014022 0ustar liggesuserscenterText <- function(x, width=getOption("width")) { retval <- vector(length=length(x), mode="character") for(i in 1:length(x)) { text <- trim(x[i]) textWidth <- nchar(text) nspaces <- floor((width - textWidth)/2) spaces <- paste(rep(" ",nspaces), sep="", collapse="") retval[i] <- paste(spaces, text, sep="", collapse="\n") } retval } gdata/R/startsWith.R0000644000176200001440000000036714631624774014056 0ustar liggesusersstartsWith <- function(x, prefix, trim=FALSE, ignore.case=FALSE) { if(trim) x <- trim(x) if(ignore.case) { x <- toupper(x) prefix <- toupper(prefix) } base::startsWith(x, prefix) } starts_with <- function(...) startsWith(...) gdata/R/resample.R0000644000176200001440000000162714631624774013512 0ustar liggesusers## The base R 'sample' function behaves differently if it is passed a ## sampling vector of length 1 than if it is passed a ## vector of length greater than 1. For the 1-element ## case it samples from the list 1:x, instead of from the contents ## of x. This function remove the special case: it always samples from ## the provided argument, no matter the length. resample <- function(x, size, replace = FALSE, prob = NULL) { if(length(x)<1) { if(!missing(size) && size>0) stop("Requested sample of size ", size, " from list of length 0") else x[FALSE] } else if(length(x)==1) { if(missing(size) || size==1) x else if(size>=1 && replace==TRUE) rep(x, size) else if(size < 1) x[FALSE] else stop("cannot cannot take a sample larger than the population", " when 'replace = FALSE'") } else { sample(x, size, replace, prob) } } gdata/R/update.list.R0000644000176200001440000000052114631624774014126 0ustar liggesusersupdate.list <- function(object, new, unnamed=FALSE, ...) { retval <- object for(name in names(new)) retval[[name]] <- new[[name]] if(unnamed) { if(is.null(names(new))) names(new) <- rep("", length=length(new)) for(i in (1:length(new))[names(new)==""]) retval <- append(retval, new[[i]]) } retval } gdata/R/is.what.R0000644000176200001440000000133014631624774013246 0ustar liggesusersis.what <- function(object, verbose=FALSE) { do.test <- function(test, object) { result <- try(get(test)(object), silent=TRUE) if(length(result)!=1 || !is.logical(result) || is.na(result)) result <- NULL result } ## Get all names starting with "is." is.names <- unlist(sapply(search(), function(name) ls(name,pattern="^is\\."))) ## Narrow to functions is.functions <- is.names[sapply(is.names, function(x) is.function(get(x)))] tests <- sort(unique(is.functions[is.functions!="is.what"])) results <- suppressWarnings(unlist(sapply(tests, do.test, object=object))) if(verbose) output <- data.frame(is=ifelse(results,"T",".")) else output <- names(results)[results] output } gdata/R/frameApply.R0000644000176200001440000000265514631624774014004 0ustar liggesusersframeApply <- function(x, by = NULL, on = by[1], fun = function(xi) c(Count = nrow(xi)) , subset = TRUE, simplify = TRUE, byvar.sep = "\\$\\@\\$", ...) { subset <- eval(substitute(subset), x, parent.frame()) x <- x[subset, , drop = FALSE] if(!is.null(by)) { x[by] <- drop.levels(x[by]) for(i in seq(along = by)) if(length(grep(byvar.sep, as.character(x[[by[i]]])))) stop("Choose a different value for byvar.sep.") byvars <- unique(x[by]) BYVAR <- do.call("paste", c(as.list(x[by]), sep = byvar.sep)) byvars <- byvars[order(unique(BYVAR)), , drop = FALSE] splx <- split(x[on], BYVAR) splres <- lapply(splx, fun, ...) if(!simplify) out <- list(by = byvars, result = splres) else { i <- 1 ; nres <- length(splres) while(inherits(splres[[i]], "try-error") & i < nres) i <- i + 1 nms <- names(splres[[i]]) splres <- lapply(splres, function(xi) { if(inherits(xi, "try-error")) { return(rep(NA, length(nms))) } else xi }) res <- do.call("rbind", splres) res <- as.data.frame(res) names(res) <- nms if(length(intersect(names(byvars), names(res)))) stop("names of 'by' variables are the same as names of result elements") out <- data.frame(byvars, res) } } else { out <- fun(x[on]) if(simplify) out <- as.data.frame(as.list(out)) } out } gdata/R/upperTriangle.R0000644000176200001440000000134114631624774014514 0ustar liggesusersupperTriangle <- function(x, diag=FALSE, byrow=FALSE) { if(byrow) t(x)[rev(upper.tri(x, diag=diag))] else x[upper.tri(x, diag=diag)] } "upperTriangle<-" <- function(x, diag=FALSE, byrow=FALSE, value) { if(byrow) { ret <- t(x) ret[rev(upper.tri(x, diag=diag))] <- value t(ret) } else { x[upper.tri(x, diag=diag)] <- value x } } lowerTriangle <- function(x, diag=FALSE, byrow=FALSE) { if(byrow) t(x)[rev(lower.tri(x, diag=diag))] else x[lower.tri(x, diag=diag)] } "lowerTriangle<-" <- function(x, diag=FALSE, byrow=FALSE, value) { if(byrow) { ret <- t(x) ret[rev(lower.tri(x, diag=diag))] <- value t(ret) } else { x[lower.tri(x, diag=diag)] <- value x } } gdata/R/Args.R0000644000176200001440000000121114631624774012563 0ustar liggesusersArgs <- function(name, sort=FALSE) { a <- formals(get(as.character(substitute(name)), pos=1)) if(is.null(a)) return(NULL) arg.labels <- names(a) arg.values <- as.character(a) char <- sapply(a, is.character) arg.values[char] <- paste("\"", arg.values[char], "\"", sep="") if(sort) { ord <- order(arg.labels) if(any(arg.labels == "...")) ord <- c(ord[-which(arg.labels[ord]=="...")], which(arg.labels=="...")) arg.labels <- arg.labels[ord] arg.values <- arg.values[ord] } output <- data.frame(value=I(arg.values), row.names=arg.labels) print(output, right=FALSE) invisible(output) } gdata/R/bindData.R0000644000176200001440000000164414631624774013407 0ustar liggesusersbindData <- function(x, y, common) { ## Setup if(!is.data.frame(x)) stop("'x' must be a data frame") if(!is.data.frame(y)) stop("'y' must be a data frame") ## New data frame ## First add common column and a dataset indicator column z <- rbind(x[common], y[common]) ## Other columns ## Remove common columns in x and y namesz <- names(z) otherx <- names(x) otherx <- otherx[!(otherx %in% namesz)] othery <- names(y) othery <- othery[!(othery %in% namesz)] ## Add all other columns but as a set for each input data frame rx <- nrow(x); cx <- length(otherx) ry <- nrow(y); cy <- length(othery) z <- cbind(z, rbind(x[otherx], matrix(rep(NA, times=(ry * cx)), nrow=ry, ncol=cx, dimnames=list(NULL, otherx)))) z <- cbind(z, rbind(matrix(rep(NA, times=(rx * cy)), nrow=rx, ncol=cy, dimnames=list(NULL, othery)), y[othery])) z } gdata/R/rename.vars.R0000644000176200001440000000244714631624774014124 0ustar liggesusersrename.vars <- function(data, from="", to="", info=TRUE) { dsn <- deparse(substitute(data)) dfn <- names(data) if (length(from) != length(to)) { cat('--------- from and to not same length ---------\n') stop() } if (length(dfn) < length(to)) { cat('--------- too many new names ---------\n') stop() } chng <- match(from, dfn) frm.in <- from %in% dfn if (!all(frm.in)) { cat('---------- some of the from names not found in', dsn, '\n') stop() } if (length(to) != length(unique(to))) { cat('---------- New names not unique\n') stop() } dfn.new <- dfn dfn.new[chng] <- to if (info) cat('\nChanging in', dsn) tmp <- rbind(from, to) dimnames(tmp)[[1]] <- c('From:', 'To:') dimnames(tmp)[[2]] <- rep('', length(from)) if (info) { print(tmp,quote=FALSE) cat("\n") } names(data) <- dfn.new data } remove.vars <- function(data, names, info=TRUE) { dsn <- deparse(substitute(data)) if (info) cat('\nChanging in', dsn, "\n") flag <- names %in% colnames(data) if(any(!flag)) warning("Variable(s) not found: ", paste(names[!flag], collapse=", ")) if(any(flag)) { if(info) cat("Dropping variables:", paste(names[flag], collapse=", "), "\n\n") for(var in names[flag]) data[[var]] <- NULL } data } gdata/R/trim.R0000644000176200001440000000140114631624774012643 0ustar liggesuserstrim <- function(s, recode.factor=TRUE, ...) UseMethod("trim", s) trim.default <- function(s, recode.factor=TRUE, ...) s trim.character <- function(s, recode.factor=TRUE, ...) { s <- sub(pattern="^[[:blank:]]+", replacement="", x=s) s <- sub(pattern="[[:blank:]]+$", replacement="", x=s) s } trim.factor <- function(s, recode.factor=TRUE, ...) { levels(s) <- trim(levels(s)) if(recode.factor) { dots <- list(x=s, ...) if(is.null(dots$sort)) dots$sort <- sort s <- do.call(what="reorder.factor", args=dots) } s } trim.list <- function(s, recode.factor=TRUE, ...) lapply(s, trim, recode.factor=recode.factor, ...) trim.data.frame <- function(s, recode.factor=TRUE, ...) { s[] <- trim.list(s, recode.factor=recode.factor, ...) s } gdata/R/mv.R0000644000176200001440000000057214631624774012322 0ustar liggesusersmv <- function(from, to, envir=parent.frame()) { if(!is.character(from) || !exists(from, envir=envir, inherits = TRUE)) stop("`from` must be a character string specifying the name of an object.") if(!is.character(to)) stop("`to` must be a characater string.") value <- get(from, envir=envir) assign(x=to, value=value, envir=envir) rm(list=from, envir=envir) } gdata/R/ll.R0000644000176200001440000000555514631624774012315 0ustar liggesusersll <- function(pos=1, unit="KB", digits=0, dim=FALSE, sort=FALSE, class=NULL, invert=FALSE, ...) { get.object.class <- function(object.name, pos) { object <- get(object.name, pos=pos) class <- class(object)[1] class(object)[1] } get.object.dim <- function(object.name, pos) { object <- get(object.name, pos=pos) if(class(object)[1] == "function") dim <- "" else if(!is.null(dim(object))) dim <- paste(dim(object), collapse=" x ") else dim <- length(object) dim } get.object.size <- function(object.name, pos) { object <- get(object.name, pos=pos) size <- try(unclass(utils::object.size(object)), silent=TRUE) if(inherits(size, "try-error")) size <- 0 size } ## 1 Set unit, denominator, original.rank unit <- match.arg(toupper(substring(unit,1,1)), c("B","KB","MB","GB")) denominator <- switch(unit, "KB"=1024, "MB"=1024^2, "GB"=1024^3, 1) original.rank <- NULL ## 2 Detect what 'pos' is like, then get class, size, dim if(is.character(pos)) # pos is an environment name pos <- match(pos, search()) if(isS4(pos)) # pos is an S4 object pos <- sapply(slotNames(pos), slot, object=pos, simplify=FALSE) if(is.list(pos)) # pos is a list-like object { if(length(unique(names(pos))) != length(names(pos))) stop("All elements must be uniquely named") original.rank <- rank(names(pos)) pos <- as.environment(pos) } if(length(ls(pos,...)) == 0) # pos is an empty environment { object.frame <- data.frame() } else if(environmentName(as.environment(pos)) == "Autoloads") { object.frame <- data.frame(rep("function",length(ls(pos,...))), rep(0,length(ls(pos,...))), row.names=ls(pos,...)) if(dim) { object.frame <- cbind(object.frame, rep("",nrow(object.frame))) names(object.frame) <- c("Class", unit, "Dim") } else names(object.frame) <- c("Class", unit) } else { class.vector <- sapply(ls(pos,...), get.object.class, pos=pos) size.vector <- sapply(ls(pos,...), get.object.size, pos=pos) size.vector <- round(size.vector/denominator, digits) object.frame <- data.frame(class.vector=class.vector, size.vector=size.vector, row.names=names(size.vector)) names(object.frame) <- c("Class", unit) if(dim) object.frame <- cbind(object.frame, Dim=sapply(ls(pos,...),get.object.dim,pos=pos)) } ## 3 Retain original order of list elements if(!sort && !is.null(original.rank)) object.frame <- object.frame[original.rank,] ## 4 Filter results given class if(!is.null(class)) { include <- object.frame$Class %in% class if(invert) include <- !include object.frame <- object.frame[include,] } object.frame } gdata/R/case.R0000644000176200001440000000052014631624774012604 0ustar liggesuserscase <- function(x, ..., default=NA) { magic <- "....default...." alternatives <- c(..., "....default...."=magic) x <- as.character(x) retval <- factor(x, levels=alternatives, labels=names(alternatives)) levels(retval)[length(alternatives)] <- as.character(default) retval[is.na(retval) & !is.na(x)] <- default retval } gdata/NEWS0000644000176200001440000005242414705613202012040 0ustar liggesusersChanges in 3.0.1 (2024-10-22) ----------------------------- Other changes: - Changed ll() so it checks that all elements of a list-like object are uniquely named. Changes in 3.0.0 (2023-10-09) ----------------------------- Other changes: - Removed installXLSXsupport(), read.xls(), sheetCount(), sheetNames(), xls2csv(), xls2tab(), xls2tsv(), xls2sep(), and xlsFormats(). See gdata 2.19.0 NEWS entry announcing their deprecation. - Added aliases n_obs(), object_size(), and starts_with(). Deprecated gdata::object.size(). Changes in 2.19.0 (2023-05-06) ------------------------------ New functions: - Added update.data.frame() to replace rows of a data frame. New features: - Added argument 'add.col.nums' to left() and right(). Other changes: - Improved ll() so it handles S4 objects. Also accepts unit="GB" (contributed by Michael Chirico) and unit="B", now case-insensitive. - Improved right() so it returns the rightmost columns of a matrix or data frame. - Renamed first two arguments of startsWith() to 'x' and 'prefix'. - Removed elem() - was deprecated in gregmisc/gdata 2.0.3 (2005-02-25). - Excel file support is now deprecated, to be removed in the near future. At the user level, the functions installXLSXsupport(), read.xls(), sheetCount(), sheetNames(), xls2csv(), xls2sep(), xls2tab(), xls2tsv(), and xlsFormats() now raise a warning about the functionality being deprecated. Excel file support was first introduced in gregmisc/gdata 1.11.0 back in 2004, but today we have packages such as openxlsx, readxl, XLConnect, and xlsx offering dedicated Excel file support with more features. When Excel file support will be removed from the gdata package, it will result in lighter package maintenance and no more Perl warnings on the user side. - Package maintainer is Arni Magnusson. Changes in 2.18.0.1 (2022-05-10) -------------------------------- Other changes: - Syntax improvements to pass CRAN checks, packaged by Brian Ripley. Changes in 2.18.0 (2017-06-05) ------------------------------ New functions: - Add update.list() function to replace named elements a list. - Add mv() function to rename an object. - Add first(), last(), first<-() and last<-() functions to extract or replace first or last vector/list elements. New features: - Add 'byrow' argument to lowerTriangle() and upperTriangle() functions. Other changes: - humanReadable() now properly handles a single value for the argument 'justify'. - Improve logging and error reporting for remove.vars(). - read.xls() now handles latin-1 files properly on MS Windows. - write.fwf() now properly handles matrix arguments. Changes in 2.17.0 (2015-07-02) ------------------------------ New features: - Add new argument 'byrow' to upperTriangle(), lowerTriangle(), upperTriangle<-(), and lowerTriangle<-() to specify by row rather than by column order. This makes it simpler to copy values between the lower and upper triangular areas, e.g. to construct a symmetric matrix. Other changes: - Add inline comments to tests to alert reviewers of expected diffs on systems lacking the libraries for read.xls() to support XLSX formatted files. Changes in 2.16.1 (2015-04-28) ----------------------------- Bug fixes: - mapLevels() no longer generates warnings about conversion of lists to vectors. Other changes: - Requirement for Perl version 5.10.0 or later is specified in the package DESCRITION. - first() and last() are now simply wrappers for calls to 'head(x, n=1)' and 'tail(x, n=1)', respectively. Changes in 2.16.0 (2015-04-25) ------------------------------ New features: - New functions first() and last() to return the first or last element of an object. - New functions left() and right() to return the leftmost or rightmost n (default to 6) columns of a matrix or data frame. - New 'scientific' argument to write.fwf(). Set 'scientific=FALSE' to prevent numeric columns from being displayed using scientific notification. - The 'standard' argument to humanReadable() now accepts three values, 'SI' for base 1000 ('MB'), 'IEC' for base 1024 ('MiB'), and 'Unix' for base 1024 and single-character units ('M') - object.size() now returns objects with S3 class 'object_sizes' (note the final 's') to avoid conflicts with methods in utils for class 'object_size' provided by package 'utils' which can only handle a scalar size. - New 'units' argument to humanReadable()--and hence to print.object_sizes() and format.object_sizes()--that permits specifying the unit to use for all values. Use 'bytes' to display all values with the unit 'bytes', use 'auto' (or leave it missing) to automatically select the best unit, and use a unit from the selected standard to use that unit (i.e. 'MiB'). - The default arguments to humanReadable() have changed. The defaults are now 'width=NULL' and 'digits=1', so that the default behavior is now to show digit after the decimal for all values. Bug fixes: - reorder.factor() was ignoring the argument 'X' unless 'FUN' was supplied, making it incompatible with the behavior of stats:::reorder.default(). This has been corrected, so that calling reorder on a factor with arguments 'X' and/or 'FUN' should now return the same results whether gdata is loaded or not. (Reported by Sam Hunter.) - write.fwf() now properly supports matrix objects, including matrix objects without column names. (Reported by Carl Witthoft.) Other changes: - Replaced deprecated PERL function POSIX::isdigit in xls2csv.pl (which is used by read.xls() ) with an equivalent regular expression. (Reported by both Charles Plessy, Gerrit-jan Schutten, and Paul Johnson. Charles also provided a patch to correct the issue.) - aggregate.table(), which has been defunct gdata 2.13.3 (2014-04-04) has now been completely removed. Changes in 2.14.0 (2014-08-27) ------------------------------ Bug Fixes: - read.xls() can now properly process XLSX files with up to 16385 columns (the maximum generated by Microsoft Excel). - read.xls() now properly handles XLS/XLSX files that use 1904-01-01 as the reference value for dates instead of 1900-01-01 (the default for MS-Excel files created on the Mac). Other changes: - Updated perl libraries and code underlying read.xls() to the latest version, including switching from Spreadsheet::XLSX to Spreadsheet::ParseXLSX. Changes in 2.13.3 (2014-04-04) ------------------------------ Bug Fixes: - Unit tests were incorrectly checking for equality of optional POSIXlt components. (Bug reported by Brian Ripley). Other Changes: - 'aggregate.table' is now defunct. See '?gdata-defunct' for details. - Unit tests and vignettes now follow R standard practice. - Minor changes to clean up R CMD check warnings. Changes in 2.13.2 (2013-06-28) ------------------------------ Enhancements: - Simplify ll() by converting a passed list to an environment, avoiding the need for special casing and the use of attach/detach. - Working of deprecation warning message in aggregate.table clarified. Changes in 2.13.1 (2013-03-24) ------------------------------ Enhancements: - Replaced calls to depreciated function ".path.package" with the new public function "path.package". Changes in 2.13.0 (2012-09-20) ----------------------------- New features: - New 'duplicated2' function which returns TRUE for *all* elements that are duplicated, including the first, contributed by Liviu Andronic. This differs from 'duplicated', which only returns the second and following (second-to last and previous when 'fromLast=TRUE') duplicate elements. - New 'ans' functon to return the value of the last evaluated top-level function (a convenience function for accessing .Last.value), contributed by Liviu Andonic. Bug Fixes: - On windows, warning messages printed to stdout by perl were being included in the return value from 'system', resulting in errors in 'sheetCount' and 'sheetNames'. Corrected. - The 'MedUnits' column names 'SIUnits' and 'ConventionalUnits' were reversed and misspelled. Changes in 2.12.0 (2012-09-12) ------------------------------ Other Changes: - 'stats::aggregate' was made into a generic on 27-Jan-2010, so that attempting to call 'aggregate' on a 'table' object will now incorrectly call 'aggregate.table'. Since 'aggregate.table' can be replaced by a call to tapply using two index vectors, e.g. aggregate.table(x, by1=a, by2=b, mean) can be replaced by tapply(x, INDEX=list(a, b), FUN=mean), the 'aggregate.table' function will now display a warning that it is depreciated and recommending the equivalent call to tapply. It will be removed entirely in a future version of gdata. Changes in 2.11.1 (2012-08-22) ------------------------------ Enhancements: - read.xls() now supports fileEncoding argument to allow non-ascii encoded data to be handled. See the manual page for an example. Bug Fixes: - The perl script utilized by read.xls() was incorrectly appending a space character at the end of each line, causing problems with character and NA entries in the final column. Changes in 2.11.0 (2012-06-18) ------------------------------ New Features: - read.xls() and supporting functions now allow blank lines to be preserved, rather than skipped, by supplying the argument "blank.lines.skip=FALSE". The underlying perl function has been extended to suppor this via an optional "-s" argument which, when present, *preserves* blank lines during the conversion. (The default behavior remains unchanged.) Other Changes: - Add SystemRequirements field specifying that perl is necessary for gdata to function fully. Changes in 2.10.6 (2012-06-12) ------------------------------ Bug fixes: - gdata::nobs.default() needs to handle logical vectors in addition to numeric vectors. Changes in 2.10.5 (2012-06-08) ------------------------------ Bug fixes: - Mark example for installXLSsupport() as dontrun so R CMD check won't fail on systems where PERL is not fully functional. - Correct name of installXLSsupport() in tests/test.read.xls.R. Other Changes: - Add dependency on R 2.13.0, since that is when stats::nobs appeared. Changes in 2.10.2 (2012-06-06) ------------------------------ Bug fixes: - Fix issues in nobs.default identified in testing with the gmodels package. Changes in 2.10.1 (2012-06-06) ------------------------------ Bug fixes: - Undo removal of 'nobs' and 'nobs.lm'. Instead define aliases for 'nobs' and 'nobs.lm' to support backward compatibility for packages depending on gdata. Changes in 2.10.0 (2012-06-05) ------------------------------ New features: - New ls.funs() function to list all objects of class function in the specified environment. - New startsWith() function to determine if a string "starts with" the specified characters. Enhancements: - Add 'na.strings' argument to read.xls() to convert Excel's '#DIV/0!' to NA. Bug fixes: - Correct various R CMD check warnings Other changes: - Base S3 method for nobs() and nobs.lm() method removed since these are now provided in the stats package. Changes in 2.9.0 (2011-09-30) ----------------------------- New features: - Add centerText() function to center text strings for a specified width. - Add case() function, a vectorized variant of the base::switch() function, which is useful for converting numeric codes into factors. Enhancements: - Minor improvements to xls2csv() man page. Changes in 2.8.1 (2011-04-15) ----------------------------- Enhancements: - nPairs() gains a summary method that shows how many times each variable is known, while the other variable of a pair is not Bug fixes: - Fix errors on windows when R or Perl install path includes spaces by properly quoting the path. Changes in 2.8.1 (2010-11-12) ----------------------------- Enhancements: - Minor improvement to Args(), read.xls() man page. Bug fixes: - Modify write.fwf() to capture and pass on additional arguments for write.table(). This resolves a bug reported by Jan Wijffels. - Modify xls2sep.R to avoid use of file.access() which is unreliable on Windows network shares. Changes in 2.8.0 (2010-04-03) ----------------------------- Enhancements: - When loaded, gdata (via an .onAttach() function) now checks: 1) if perl is available 2) whether the perl libraries for XLS support are available 3) whether the perl libraries for XLSX support are available If perl is not available, an appropriate warning message is displayed. If necessary perl libraries are not available, a warning message is displayed, as is a message suggesting the user run the (new) installXLSXsupport() function to attempt to install the necessary perl libraries. - The function installXLSXsupport() has been provided to install the binary perl modules that read.xls needs to support Excel 2007+ 'XLSX' files. Changes in 2.7.3 (2010-04-02) ----------------------------- Enhancements: - New xlsFormats() command to determine which Excel formats are supported (XLS, XLSX). Bug Fixes: - No longer attempt to install perl modules Compress::Raw::Zlib and Spreadsheet::XLSX at build/compile time. This should resolve recent build issues, particularly on Windows. - All perl code can now operate (but generate warnings) when perl modules Compress::Raw::Zlib and Spreadsheet::XLSX when are not installed. - Also update Greg's email address. Changes in 2.7.1 (2010-02-19) ----------------------------- Enhancements: - on Windows attempts to locate ActiveState perl if perl= not specified and Rtools perl would have otherwise been used in read.xls and other perl dependent functions. Changes in 2.7.0 (2010-01-25) ----------------------------- Bug Fixes: - Fix building of Perl libraries on Win32 Changes in 2.7.0 (2010-01-25) ----------------------------- Enhancements: - read.xls() now supports Excel 2007 'xlsx' files. - read.xls() now allows specification of worksheet by name - read.xls() now supports ftp URLs. - Improved ll() so user can limit output to specified classes New Functions: - sheetCount() and sheetNames() to determine the number and names of worksheets in an Excel file, respectively. Bug Fixes: - Fix formatting warning in frameApply(). - Resolve crash of "ll(.GlobalEnv)" Changes in 2.6.1 (2009-07-15) ----------------------------- Bug Fixes - Modify unit tests to avoid issues related to time zones. Changes in 2.6.0 (2009-07-15) ----------------------------- Bug Fixes - Correct minor typos & issues in man pages for write.fwf(), resample() (Greg Warnes) - Correct calculation of object sizes in env() and ll() (Gregor Gorjanc) New Features - Add support for using tab for field separator during translation from xls format in read.xls (Greg Warnes) - Enhanced function object.size that returns the size of multiple objects. There is also a handy print method that can print size of an object in "human readable" format when options(humanReadable=TRUE) or print(object.size(x), humanReadable=TRUE). (Gregor Gorjanc) - New function wideByFactor that reshapes given dataset by a given factor - it creates a "multivariate" data.frame. (Gregor Gorjanc) - New function nPairs that gives the number of variable pairs in a data.frame or a matrix. (Gregor Gorjanc) - New functions getYear, getMonth, getDay, getHour, getMin, and getSec for extracting the date/time parts from objects of a date/time class. (Gregor Gorjanc) - New function bindData that binds two data frames into a multivariate data frame in a different way than merge. (Gregor Gorjanc) Other Changes - Correct Greg's email address Changes in 2.5.0 (2008-12-31) ----------------------------- - New function .runRUnitTestsGdata that enables run of all RUnit tests during the R CMD check as well as directly from within R. - Enhanced function object.size that returns the size of multiple objects. There is also a handy print method that can print size of an object in "human readable" format when options(humanReadable=TRUE) or print(x, humanReadable=TRUE). - New function bindData that binds two data frames into a multivariate data frame in a different way than merge. - New function wideByFactor that reshapes given dataset by a given factor - it creates a "multivariate" data.frame. - New functions getYear, getMonth, getDay, getHour, getMin, and getSec for extracting the date/time parts from objects of a date/time class. - New function nPairs that gives the number of variable pairs in a data.frame or a matrix. - New function trimSum that sums trimmed values. - New function cbindX that can bind objects with different number of rows. - write.fwf gains the width argument. The value for unknown can increase or decrease the width of the columns. Additional tests and documentation fixes. Changes in 2.4.2 (2008-05-11) ----------------------------- - Enhancements and bug fixes for read.xls() and xls2csv(): - More informative log messages when verbose=TRUE - File paths containing spaces or other non-traditional characters are now properly handled - Better error messages, particularly when perl fails to generate an output .csv file. - The 'shortcut' character "~" (meaning user's home directory) is now properly handled in file paths. - XLS files created by OpenOffice are now properly handled. Thanks to Robert Burns for pointing out the patch (http://rt.cpan.org/Public/Bug/Display.html?id=7206) Changes in 2.4.1 (2008-03-24) ----------------------------- - Update perl libraries needed by xls2csv() and read.xls() to latest available versions on CRAN. - Add read.xls() to exported function list - Correct iris.xls example file. It didn't contain the complete & properly formatted iris data set. Fixed. - Fix typo in win32 example for read.xls() Changes in 2.4.0 (2008-01-30) ----------------------------- - The keep() function now includes an 'all' argument to specify how objects with names starting with '.' are handled. - keep() now shows an informative warning message when a requested object does not exist - New vignette "Mapping Levels of a Factor" describing the use of mapLevels(). - New vignette "Working with Unknown Values" describing the use of isUnknown() and unknownToNA(). - Several enhancements to read.xls() (thanks to Gabor Grothendieck): - New function xls2csv(), which handles converting an xls file to a csv file and returns a connection to the temporary csv file - xls2csv() and read.xls() both allow a file or a url to be specified - read.xls() has a new 'pattern' argument which, if supplied, will ignore everything prior to the first line in th csv file that matches the pattern. This is typically used if there are a variable number of comment lines prior to the header in which case one can specify one of the column headings as the pattern. read.xls should be compatible with the old read.xls. - Minor fixes to drop.levels(), is.what(). - Implementation of unit tests for most functions. Changes in 2.3.1 (2006-10-29) ----------------------------- - Arguments as well as their position of reorder.factor have been changed to conform with reorder.factor method in stats package, due to collision bug. Argument 'make.ordered' is now 'order' and old argument 'order' is now 'new.order'! Therefore, you have to implicitly specify new.order i.e. reorder(trt, new.order=c("PLACEBO", "300 MG", "600 MG", "1200 MG")) - trim() gains ... argument. - Added "unknown" methods for matrices. - Added c() method for factors based on mapLevels() functions. - Added write.fwf, which writes file in *F*ixed *W*idth *F*ormat. Changes in 2.3.0 (2006-09-19) ----------------------------- - Added mapLevels(), which produces a map with information on levels and/or internal integer codes. Contributed by Gregor Gorjanc. - Extended dropLevels() to work on the factors contained in a data frame, as well as individual factors. - Add unknown(), which changes given unknown value to NA and vice versa. Contributed by Gregor Gorjanc. - Extended trim() to handle a variety of data types data.frames, lists, factors, etc. Code changes contributed by Gregor Gorjanc. - Added resample() command that acts like sample() except that it _always_ samples from the arguments provided, even if only a single argument is present. This differs from sample() which behaves differently in this case. - Updated my email address. Changes in 2.1.2 (2012-10-29) ----------------------------- - Fixed bug in interleave.R - option to covert 1-column matrices to vector (based on Andrew Burgess's suggestion) - Updated Greg and Jim's email adresses - ll.R: Suppressed warning message in attach() call. - frameApply.Rd, reorder.Rd: Remove explicit loading of gtools in examples, so that failure to import functions from gtools gets properly caught by running the examples. - upperTriangle.R, man/upperTriangle.Rd: Add functions for extracting and modifying the upper and lower trianglular components of matrices. - is.what.R: Replaced the "not.using" vector with a more robust try(get(test)) to find out whether a particular is.* function returns a logical of length one. - DESCRIPTION: Added Suggests field - Updated the example in frameApply Changes in 2.0.8 (2005-06-02) ----------------------------- - Added DESCRIPTION and removed DESCRIPTION.in - Updated ll.Rd documentation - Fixed bug in Args.R, is.what.R, ll.R gdata/vignettes/0000755000176200001440000000000014705613304013345 5ustar liggesusersgdata/vignettes/Rnews.sty0000644000176200001440000001556414631624774015232 0ustar liggesusers%% %% This is file `Rnews.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% Rnews.dtx (with options: `package') %% %% IMPORTANT NOTICE: %% %% For the copyright see the source file. %% %% Any modified versions of this file must be renamed %% with new filenames distinct from Rnews.sty. %% %% For distribution of the original source see the terms %% for copying and modification in the file Rnews.dtx. %% %% This generated file may be distributed as long as the %% original source files, as listed above, are part of the %% same distribution. (The sources need not necessarily be %% in the same archive or directory.) \def\fileversion{v0.3.6} \def\filename{Rnews} \def\filedate{2002/06/02} \def\docdate {2001/10/31} %% %% Package `Rnews' to use with LaTeX2e %% Copyright (C) 2001--2002 by the R Core Development Team %% Please report errors to KH or FL %% %% -*- LaTeX -*- \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesPackage{\filename}[\filedate\space\fileversion\space Rnews package] \typeout{Package: `\filename\space\fileversion \@spaces <\filedate>'} \typeout{English documentation as of <\docdate>} \RequirePackage{ifthen} \newboolean{Rnews@driver} \DeclareOption{driver}{\setboolean{Rnews@driver}{true}} \DeclareOption*{\PackageWarning{\filename}{Unknown option `\CurrentOption'}} \ProcessOptions\relax \ifthenelse{\boolean{Rnews@driver}}{}{ \RequirePackage{multicol,graphicx,color,fancyhdr,hyperref} \newcommand{\volume}[1]{\def\Rnews@volume{#1}} \newcommand{\volnumber}[1]{\def\Rnews@number{#1}} \renewcommand{\date}[1]{\def\Rnews@date{#1}} \setcounter{secnumdepth}{-1} \renewcommand{\author}[1]{\def\Rnews@author{#1}} \renewcommand{\title}[1]{\def\Rnews@title{#1}} \newcommand{\subtitle}[1]{\def\Rnews@subtitle{#1}} \newenvironment{article}{% \author{}\title{}\subtitle{}}{\end{multicols}} \renewcommand{\maketitle}{ \begin{multicols}{2}[\chapter{\Rnews@title}\refstepcounter{chapter}][3cm] \ifx\empty\Rnews@subtitle\else\noindent\textbf{\Rnews@subtitle} \par\nobreak\addvspace{\baselineskip}\fi \ifx\empty\Rnews@author\else\noindent\textit{\Rnews@author} \par\nobreak\addvspace{\baselineskip}\fi \@afterindentfalse\@nobreaktrue\@afterheading} \renewcommand\chapter{\secdef\Rnews@chapter\@schapter} \providecommand{\nohyphens}{% \hyphenpenalty=10000\exhyphenpenalty=10000\relax} \newcommand{\Rnews@chapter}{% \renewcommand{\@seccntformat}[1]{}% \@startsection{chapter}{0}{0mm}{% -2\baselineskip \@plus -\baselineskip \@minus -.2ex}{\p@}{% \normalfont\Huge\bfseries\raggedright}} \renewcommand*\l@chapter{\@dottedtocline{0}{0pt}{1em}} \def\@schapter#1{\section*#1} \renewenvironment{figure}[1][]{% \def\@captype{figure} \noindent \begin{minipage}{\columnwidth}}{% \end{minipage}\par\addvspace{\baselineskip}} \renewcommand{\theequation}{\@arabic\c@equation} \def\equation{% \let\refstepcounter\H@refstepcounter \H@equation \def\newname{\arabic{chapter}.\theequation}% \let\theHequation\newname% \hyper@makecurrent{equation}% \Hy@raisedlink{\hyper@anchorstart{\@currentHref}}% \let\refstepcounter\new@refstepcounter}% \def\endequation{\Hy@raisedlink{\hyper@anchorend}\H@endequation} \renewcommand{\thefigure}{\@arabic\c@figure} \renewcommand{\thetable}{\@arabic\c@table} \renewcommand{\contentsname}{Contents of this issue:} \renewcommand\tableofcontents{% \section*{\contentsname \@mkboth{% \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}% \@starttoc{toc}} \renewcommand{\titlepage}{% \noindent \rule{\textwidth}{1pt}\\[-.8\baselineskip] \rule{\textwidth}{.5pt} \begin{center} \includegraphics[height=2cm]{Rlogo}\hspace{7mm} \fontsize{2cm}{2cm}\selectfont News \end{center} The Newsletter of the R Project\hfill Volume \Rnews@volume/\Rnews@number, \Rnews@date\\[-.5\baselineskip] \rule{\textwidth}{.5pt}\\[-.8\baselineskip] \rule{\textwidth}{1pt} \vspace{1cm} \fancyhf{} \fancyhead[L]{Vol.~\Rnews@volume/\Rnews@number, \Rnews@date} \fancyhead[R]{\thepage} \fancyfoot[L]{R News} \fancyfoot[R]{ISSN 1609-3631} \thispagestyle{empty} \begin{bottombox} \begin{multicols}{2} \setcounter{tocdepth}{0} \tableofcontents \setcounter{tocdepth}{2} \end{multicols} \end{bottombox}} \setlength{\textheight}{250mm} \setlength{\topmargin}{-10mm} \setlength{\textwidth}{17cm} \setlength{\oddsidemargin}{-6mm} \setlength{\columnseprule}{.1pt} \setlength{\columnsep}{20pt} \RequirePackage{ae,mathpple} \RequirePackage[T1]{fontenc} \renewcommand{\rmdefault}{ppl} \renewcommand{\sfdefault}{aess} \renewcommand{\ttdefault}{aett} \definecolor{Red}{rgb}{0.7,0,0} \definecolor{Blue}{rgb}{0,0,0.8} \definecolor{hellgrau}{rgb}{0.55,0.55,0.55} \newcommand{\R}{R} \newcommand{\address}[1]{\addvspace{\baselineskip}\noindent\emph{#1}} \newcommand{\email}[1]{\href{mailto:#1}{\normalfont\texttt{#1}}} \newsavebox{\Rnews@box} \newlength{\Rnews@len} \newenvironment{bottombox}{% \begin{figure*}[b] \begin{center} \noindent \begin{lrbox}{\Rnews@box} \begin{minipage}{0.99\textwidth}}{% \end{minipage} \end{lrbox} \addtolength{\Rnews@len}{\fboxsep} \addtolength{\Rnews@len}{\fboxrule} \hspace*{-\Rnews@len}\fbox{\usebox{\Rnews@box}} \end{center} \end{figure*}} \RequirePackage{verbatim} \def\boxedverbatim{% \def\verbatim@processline{% {\setbox0=\hbox{\the\verbatim@line}% \hsize=\wd0 \the\verbatim@line\par}}% \@minipagetrue \@tempswatrue \setbox0=\vbox \bgroup\small\verbatim } \def\endboxedverbatim{% \endverbatim \unskip\setbox0=\lastbox \egroup \fbox{\box0} } \pagestyle{fancy} } % \ifthenelse{\boolean{Rnews@driver}} \newcommand\code{\bgroup\@codex} \def\@codex#1{{\normalfont\ttfamily\hyphenchar\font=-1 #1}\egroup} \newcommand{\kbd}[1]{{\normalfont\texttt{#1}}} \newcommand{\key}[1]{{\normalfont\texttt{\uppercase{#1}}}} \newcommand\samp{`\bgroup\@noligs\@sampx} \def\@sampx#1{{\normalfont\texttt{#1}}\egroup'} \newcommand{\var}[1]{{\normalfont\textsl{#1}}} \let\env=\code \newcommand{\file}[1]{{`\normalfont\textsf{#1}'}} \let\command=\code \let\option=\samp \newcommand{\dfn}[1]{{\normalfont\textsl{#1}}} \newcommand{\acronym}[1]{{\normalfont\textsc{\lowercase{#1}}}} \newcommand{\strong}[1]{{\normalfont\fontseries{b}\selectfont #1}} \let\pkg=\strong \RequirePackage{alltt} \newenvironment{example}{\begin{alltt}}{\end{alltt}} \newenvironment{smallexample}{\begin{alltt}\small}{\end{alltt}} \newenvironment{display}{\list{}{}\item\relax}{\endlist} \newenvironment{smallverbatim}{\small\verbatim}{\endverbatim} \providecommand{\operatorname}[1]{% \mathop{\operator@font#1}\nolimits} \renewcommand{\P}{% \mathop{\operator@font I\hspace{-1.5pt}P\hspace{.13pt}}} \newcommand{\E}{% \mathop{\operator@font I\hspace{-1.5pt}E\hspace{.13pt}}} \newcommand{\VAR}{\operatorname{var}} \newcommand{\COV}{\operatorname{cov}} \newcommand{\COR}{\operatorname{cor}} \RequirePackage{amsfonts} \endinput %% %% End of file `Rnews.sty'. gdata/vignettes/unknown.Rnw0000644000176200001440000002342314631624774015553 0ustar liggesusers %\VignetteIndexEntry{Working with Unknown Values} %\VignettePackage{gdata} %\VignetteKeywords{unknown, missing, manip} \documentclass[a4paper]{report} \usepackage{Rnews} \usepackage[round]{natbib} \bibliographystyle{abbrvnat} \usepackage{Sweave} \SweaveOpts{strip.white=all, keep.source=TRUE} \SweaveOpts{concordance=TRUE} \begin{document} \begin{article} \title{Working with Unknown Values} \subtitle{The \pkg{gdata} package} \author{by Gregor Gorjanc} \maketitle This vignette has been published as \cite{Gorjanc}. \section{Introduction} Unknown or missing values can be represented in various ways. For example SAS uses \code{.}~(dot), while \R{} uses \code{NA}, which we can read as Not Available. When we import data into \R{}, say via \code{read.table} or its derivatives, conversion of blank fields to \code{NA} (according to \code{read.table} help) is done for \code{logical}, \code{integer}, \code{numeric} and \code{complex} classes. Additionally, the \code{na.strings} argument can be used to specify values that should also be converted to \code{NA}. Inversely, there is an argument \code{na} in \code{write.table} and its derivatives to define value that will replace \code{NA} in exported data. There are also other ways to import/export data into \R{} as described in the {\emph R Data Import/Export} manual \citep{RImportExportManual}. However, all approaches lack the possibility to define unknown value(s) for some particular column. It is possible that an unknown value in one column is a valid value in another column. For example, I have seen many datasets where values such as 0, -9, 999 and specific dates are used as column specific unknown values. This note describes a set of functions in package \pkg{gdata}\footnote{ package version 2.3.1} \citep{WarnesGdata}: \code{isUnknown}, \code{unknownToNA} and \code{NAToUnknown}, which can help with testing for unknown values and conversions between unknown values and \code{NA}. All three functions are generic (S3) and were tested (at the time of writing) to work with: \code{integer}, \code{numeric}, \code{character}, \code{factor}, \code{Date}, \code{POSIXct}, \code{POSIXlt}, \code{list}, \code{data.frame} and \code{matrix} classes. \section{Description with examples} The following examples show simple usage of these functions on \code{numeric} and \code{factor} classes, where value \code{0} (beside \code{NA}) should be treated as an unknown value: <>= library("gdata") xNum <- c(0, 6, 0, 7, 8, 9, NA) isUnknown(x=xNum) @ The default unknown value in \code{isUnknown} is \code{NA}, which means that output is the same as \code{is.na} --- at least for atomic classes. However, we can pass the argument \code{unknown} to define which values should be treated as unknown: <>= isUnknown(x=xNum, unknown=0) @ This skipped \code{NA}, but we can get the expected answer after appropriately adding \code{NA} into the argument \code{unknown}: <>= isUnknown(x=xNum, unknown=c(0, NA)) @ Now, we can change all unknown values to \code{NA} with \code{unknownToNA}. There is clearly no need to add \code{NA} here. This step is very handy after importing data from an external source, where many different unknown values might be used. Argument \code{warning=TRUE} can be used, if there is a need to be warned about ``original'' \code{NA}s: <>= (xNum2 <- unknownToNA(x=xNum, unknown=0)) @ Prior to export from \R{}, we might want to change unknown values (\code{NA} in \R{}) to some other value. Function \code{NAToUnknown} can be used for this: <>= NAToUnknown(x=xNum2, unknown=999) @ Converting \code{NA} to a value that already exists in \code{x} issues an error, but \code{force=TRUE} can be used to overcome this if needed. But be warned that there is no way back from this step: <>= NAToUnknown(x=xNum2, unknown=7, force=TRUE) @ Examples below show all peculiarities with class \code{factor}. \code{unknownToNA} removes \code{unknown} value from levels and inversely \code{NAToUnknown} adds it with a warning. Additionally, \code{"NA"} is properly distinguished from \code{NA}. It can also be seen that the argument \code{unknown} in functions \code{isUnknown} and \code{unknownToNA} need not match the class of \code{x} (otherwise factor should be used) as the test is internally done with \code{\%in\%}, which nicely resolves coercing issues. <>= (xFac <- factor(c(0, "BA", "RA", "BA", NA, "NA"))) isUnknown(x=xFac) isUnknown(x=xFac, unknown=0) isUnknown(x=xFac, unknown=c(0, NA)) isUnknown(x=xFac, unknown=c(0, "NA")) isUnknown(x=xFac, unknown=c(0, "NA", NA)) (xFac <- unknownToNA(x=xFac, unknown=0)) (xFac <- NAToUnknown(x=xFac, unknown=0)) @ These two examples with classes \code{numeric} and \code{factor} are fairly simple and we could get the same results with one or two lines of \R{} code. The real benefit of the set of functions presented here is in \code{list} and \code{data.frame} methods, where \code{data.frame} methods are merely wrappers for \code{list} methods. We need additional flexibility for \code{list}/\code{data.frame} methods, due to possibly having multiple unknown values that can be different among \code{list} components or \code{data.frame} columns. For these two methods, the argument \code{unknown} can be either a \code{vector} or \code{list}, both possibly named. Of course, greater flexibility (defining multiple unknown values per component/column) can be achieved with a \code{list}. When a \code{vector}/\code{list} object passed to the argument \code{unknown} is not named, the first value/component of a \code{vector}/\code{list} matches the first component/column of a \code{list}/\code{data.frame}. This can be quite error prone, especially with \code{vectors}. Therefore, I encourage the use of a \code{list}. In case \code{vector}/\code{list} passed to argument \code{unknown} is named, names are matched to names of \code{list} or \code{data.frame}. If lengths of \code{unknown} and \code{list} or \code{data.frame} do not match, recycling occurs. The example below illustrates the application of the described functions to a list which is composed of previously defined and modified numeric (\code{xNum}) and factor (\code{xFac}) classes. First, function \code{isUnknown} is used with \code{0} as an unknown value. Note that we get \code{FALSE} for \code{NA}s as has been the case in the first example. <>= (xList <- list(a=xNum, b=xFac)) isUnknown(x=xList, unknown=0) @ We need to add \code{NA} as an unknown value. However, we do not get the expected result this way! <>= isUnknown(x=xList, unknown=c(0, NA)) @ This is due to matching of values in the argument \code{unknown} and components in a \code{list}; i.e., \code{0} is used for component \code{a} and \code{NA} for component \code{b}. Therefore, it is less error prone and more flexible to pass a \code{list} (preferably a named list) to the argument \code{unknown}, as shown below. <>= (xList1 <- unknownToNA(x=xList, unknown=list(b=c(0, "NA"), a=0))) @ Changing \code{NA}s to some other value (only one per component/column) can be accomplished as follows: <>= NAToUnknown(x=xList1, unknown=list(b="no", a=0)) @ A named component \code{.default} of a \code{list} passed to argument \code{unknown} has a special meaning as it will match a component/column with that name and any other not defined in \code{unknown}. As such it is very useful if the number of components/columns with the same unknown value(s) is large. Consider a wide \code{data.frame} named \code{df}. Now \code{.default} can be used to define unknown value for several columns: <>= df <- data.frame(col1=c(0, 1, 999, 2), col2=c("a", "b", "c", "unknown"), col3=c(0, 1, 2, 3), col4=c(0, 1, 2, 2)) @ <>= tmp <- list(.default=0, col1=999, col2="unknown") (df2 <- unknownToNA(x=df, unknown=tmp)) @ If there is a need to work only on some components/columns you can of course ``skip'' columns with standard \R{} mechanisms, i.e., by subsetting \code{list} or \code{data.frame} objects: <>= df2 <- df cols <- c("col1", "col2") tmp <- list(col1=999, col2="unknown") df2[, cols] <- unknownToNA(x=df[, cols], unknown=tmp) df2 @ \section{Summary} Functions \code{isUnknown}, \code{unknownToNA} and \code{NAToUnknown} provide a useful interface to work with various representations of unknown/missing values. Their use is meant primarily for shaping the data after importing to or before exporting from \R{}. I welcome any comments or suggestions. % \bibliography{refs} \begin{thebibliography}{1} \providecommand{\natexlab}[1]{#1} \providecommand{\url}[1]{\texttt{#1}} \expandafter\ifx\csname urlstyle\endcsname\relax \providecommand{\doi}[1]{doi: #1}\else \providecommand{\doi}{doi: \begingroup \urlstyle{rm}\Url}\fi \bibitem[Gorjanc(2007)]{Gorjanc} G.~Gorjanc. \newblock Working with unknown values: the gdata package. \newblock \emph{R News}, 7\penalty0 (1):\penalty0 24--26, 2007. \newblock URL \url{http://CRAN.R-project.org/doc/Rnews/Rnews_2007-1.pdf}. \bibitem[{R Development Core Team}(2006)]{RImportExportManual} {R Development Core Team}. \newblock \emph{R Data Import/Export}, 2006. \newblock URL \url{http://cran.r-project.org/manuals.html}. \newblock ISBN 3-900051-10-0. \bibitem[Warnes (2006)]{WarnesGdata} G.~R. Warnes. \newblock \emph{gdata: Various R programming tools for data manipulation}, 2006. \newblock URL \url{http://cran.r-project.org/src/contrib/Descriptions/gdata.html}. \newblock R package version 2.3.1. Includes R source code and/or documentation contributed by Ben Bolker, Gregor Gorjanc and Thomas Lumley. \end{thebibliography} \address{Gregor Gorjanc\\ University of Ljubljana, Slovenia\\ \email{gregor.gorjanc@bfro.uni-lj.si}} \end{article} \end{document} gdata/vignettes/mapLevels.Rnw0000644000176200001440000002024214631624774016000 0ustar liggesusers%\VignetteIndexEntry{Mapping levels of a factor} %\VignettePackage{gdata} %\VignetteKeywords{levels, factor, manip} \documentclass[a4paper]{report} \usepackage{Rnews} \usepackage[round]{natbib} \bibliographystyle{abbrvnat} \usepackage{Sweave} \SweaveOpts{strip.white=all, keep.source=TRUE} \SweaveOpts{concordance=TRUE} \begin{document} \SweaveOpts{concordance=TRUE} \begin{article} \title{Mapping levels of a factor} \subtitle{The \pkg{gdata} package} \author{by Gregor Gorjanc} \maketitle \section{Introduction} Factors use levels attribute to store information on mapping between internal integer codes and character values i.e. levels. First level is mapped to internal integer code 1 and so on. Although some users do not like factors, their use is more efficient in terms of storage than for character vectors. Additionally, there are many functions in base \R{} that provide additional value for factors. Sometimes users need to work with internal integer codes and mapping them back to factor, especially when interfacing external programs. Mapping information is also of interest if there are many factors that should have the same set of levels. This note describes \code{mapLevels} function, which is an utility function for mapping the levels of a factor in \pkg{gdata} \footnote{from version 2.3.1} package \citep{WarnesGdata}. \section{Description with examples} Function \code{mapLevels()} is an (S3) generic function and works on \code{factor} and \code{character} atomic classes. It also works on \code{list} and \code{data.frame} objects with previously mentioned atomic classes. Function \code{mapLevels} produces a so called ``map'' with names and values. Names are levels, while values can be internal integer codes or (possibly other) levels. This will be clarified later on. Class of this ``map'' is \code{levelsMap}, if \code{x} in \code{mapLevels()} was atomic or \code{listLevelsMap} otherwise - for \code{list} and \code{data.frame} classes. The following example shows the creation and printout of such a ``map''. <>= library(gdata) (fac <- factor(c("B", "A", "Z", "D"))) (map <- mapLevels(x=fac)) @ If we have to work with internal integer codes, we can transform factor to integer and still get ``back the original factor'' with ``map'' used as argument in \code{mapLevels<-} function as shown bellow. \code{mapLevels<-} is also an (S3) generic function and works on same classes as \code{mapLevels} plus \code{integer} atomic class. <>= (int <- as.integer(fac)) mapLevels(x=int) <- map int identical(fac, int) @ Internally ``map'' (\code{levelsMap} class) is a \code{list} (see bellow), but its print method unlists it for ease of inspection. ``Map'' from example has all components of length 1. This is not mandatory as \code{mapLevels<-} function is only a wrapper around workhorse function \code{levels<-} and the later can accept \code{list} with components of various lengths. <>= str(map) @ Although not of primary importance, this ``map'' can also be used to remap factor levels as shown bellow. Components ``later'' in the map take over the ``previous'' ones. Since this is not optimal I would rather recommend other approaches for ``remapping'' the levels of a \code{factor}, say \code{recode} in \pkg{car} package \citep{FoxCar}. <>= map[[2]] <- as.integer(c(1, 2)) map int <- as.integer(fac) mapLevels(x=int) <- map int @ Up to now examples showed ``map'' with internal integer codes for values and levels for names. I call this integer ``map''. On the other hand character ``map'' uses levels for values and (possibly other) levels for names. This feature is a bit odd at first sight, but can be used to easily unify levels and internal integer codes across several factors. Imagine you have a factor that is for some reason split into two factors \code{f1} and \code{f2} and that each factor does not have all levels. This is not uncommon situation. <>= (f1 <- factor(c("A", "D", "C"))) (f2 <- factor(c("B", "D", "C"))) @ If we work with this factors, we need to be careful as they do not have the same set of levels. This can be solved with appropriately specifying \code{levels} argument in creation of factors i.e. \code{levels=c("A", "B", "C", "D")} or with proper use of \code{levels<-} function. I say proper as it is very tempting to use: <>= fTest <- f1 levels(fTest) <- c("A", "B", "C", "D") fTest @ Above example extends set of levels, but also changes level of 2nd and 3rd element in \code{fTest}! Proper use of \code{levels<-} (as shown in \code{levels} help page) would be: <>= fTest <- f1 levels(fTest) <- list(A="A", B="B", C="C", D="D") fTest @ Function \code{mapLevels} with character ``map'' can help us in such scenarios to unify levels and internal integer codes across several factors. Again the workhorse under this process is \code{levels<-} function from base \R{}! Function \code{mapLevels<-} just controls the assignment of (integer or character) ``map'' to \code{x}. Levels in \code{x} that match ``map'' values (internal integer codes or levels) are changed to ``map'' names (possibly other levels) as shown in \code{levels} help page. Levels that do not match are converted to \code{NA}. Integer ``map'' can be applied to \code{integer} or \code{factor}, while character ``map'' can be applied to \code{character} or \code{factor}. Result of \code{mapLevels<-} is always a \code{factor} with possibly ``remapped'' levels. To get one joint character ``map'' for several factors, we need to put factors in a \code{list} or \code{data.frame} and use arguments \code{codes=FALSE} and \code{combine=TRUE}. Such map can then be used to unify levels and internal integer codes. <>= (bigMap <- mapLevels(x=list(f1, f2), codes=FALSE, combine=TRUE)) mapLevels(f1) <- bigMap mapLevels(f2) <- bigMap f1 f2 cbind(as.character(f1), as.integer(f1), as.character(f2), as.integer(f2)) @ If we do not specify \code{combine=TRUE} (which is the default behaviour) and \code{x} is a \code{list} or \code{data.frame}, \code{mapLevels} returns ``map'' of class \code{listLevelsMap}. This is internally a \code{list} of ``maps'' (\code{levelsMap} objects). Both \code{listLevelsMap} and \code{levelsMap} objects can be passed to \code{mapLevels<-} for \code{list}/\code{data.frame}. Recycling occurs when length of \code{listLevelsMap} is not the same as number of components/columns of a \code{list}/\code{data.frame}. Additional convenience methods are also implemented to ease the work with ``maps'': \begin{itemize} \item \code{is.levelsMap}, \code{is.listLevelsMap}, \code{as.levelsMap} and \code{as.listLevelsMap} for testing and coercion of user defined ``maps'', \item \code{"["} for subsetting, \item \code{c} for combining \code{levelsMap} or \code{listLevelsMap} objects; argument \code{recursive=TRUE} can be used to coerce \code{listLevelsMap} to \code{levelsMap}, for example \code{c(llm1, llm2, recursive=TRUE)} and \item \code{unique} and \code{sort} for \code{levelsMap}. \end{itemize} \section{Summary} Functions \code{mapLevels} and \code{mapLevels<-} can help users to map internal integer codes to factor levels and unify levels as well as internal integer codes among several factors. I welcome any comments or suggestions. % \bibliography{refs} \begin{thebibliography}{1} \providecommand{\natexlab}[1]{#1} \providecommand{\url}[1]{\texttt{#1}} \expandafter\ifx\csname urlstyle\endcsname\relax \providecommand{\doi}[1]{doi: #1}\else \providecommand{\doi}{doi: \begingroup \urlstyle{rm}\Url}\fi \bibitem[Fox(2006)]{FoxCar} J.~Fox. \newblock \emph{car: Companion to Applied Regression}, 2006. \newblock URL \url{http://socserv.socsci.mcmaster.ca/jfox/}. \newblock R package version 1.1-1. \bibitem[Warnes(2006)]{WarnesGdata} G.~R. Warnes. \newblock \emph{gdata: Various R programming tools for data manipulation}, 2006. \newblock URL \url{http://cran.r-project.org/src/contrib/Descriptions/gdata.html}. \newblock R package version 2.3.1. Includes R source code and/or documentation contributed by Ben Bolker, Gregor Gorjanc and Thomas Lumley. \end{thebibliography} \address{Gregor Gorjanc\\ University of Ljubljana, Slovenia\\ \email{gregor.gorjanc@bfro.uni-lj.si}} \end{article} \end{document} gdata/data/0000755000176200001440000000000014631624774012261 5ustar liggesusersgdata/data/MedUnits.rda0000644000176200001440000000714114705613304014471 0ustar liggesusers‹íškU€7»³ïM²1/ò 4˜P³$Ëfž»[HMÏÎnv–Ì&“ìäQ…Þ™Þ™†žî¦»'ÉD|K±j ©¤ÄR …‰R˜BS¨DAA|¡çöãÜîÙéÝ¡ÄNÕnß{îã;÷œsϽ½;[‡w†;vv44446šáwðkNC ¡žmã|a›$èZCCÓB¨C§†nø9dµ7ÌòlJf†|v}·žTv$ë³oc*9­4ûüéÍ™iól;I-›R[G¼Ãé¿Ê¼ÛÏæôP2”ò»æôè‡km8ëè±Ñ$-Óâ-ŽÒâøÉM™“^ÉÿŸï̳1µGäD×éOwâ›Ìó:W$Y)ñ’%ì&B™ƒ_BžáòBÁ’·r‰ÇªÈI‚³:Y™¬jgR,ȚΫt@[R$*e«¾ IÀ“½ªºAs¡AWE¯Štþîd¹,KÇ9Ù”ŽôXòùI© ’Ä ››”Š‚ RM˜1K8Ï%´¥íI 2EN±‹’’.„ŠjX $«eÙ¡´é%U.OsØ“¼‡•ê5šÕª¢ ÔœŠ, Ь¨@†1IùšI- Ãv$5…S¹"•t yN”%N·EíC‚(¨•I¤¶ŠBÛS½ ¯èT°8bxâNãA* “‚.«¶ñR&/—‘/ó’ŽÂètaGŠó0R¢`C‚N®©ÎKŠ3ઽT™6· óR¼ZeEä4Qm©’(«tPgª$‹Æda`{j”–”¬(¼½¨¥)bjEV•œ¤1Á "d¾âŒ\Ev›¯3¶^Lįe2[sìÆ‚™:`i]“yi_µÌC®Ë ‡z3Ã1{D Ãsx®g\ðyA ZoçgñäÐ8 iz_›‘÷Ìag„µdªš#%sE RÎXO 9áçͼd›“ÔIü9&­º·SÛ&’èA½ Î bµuŒ$Kî¬4o“¬òÓSçfU"+§.Û «“óä°ÃT²y/çHW ³õ!Eª²P¨ÉRs³pû’'áhhXBH)®[V»!Ôeš²%YS`ºŠfk’5MG=Ã!bHøì†d¢N;öOËuE^'Î7®8°Óu^Ãd…ˆÐ¾XœUù¢Î0Nšµ+KLê¾¶ƒÌˆ_´Qֵ͗eÉyJôj Ÿ¦HœÃ…Š®d^ÖtŽ{u©u'³D+ˆˆžöë^­’.dAvd«je·ãµ¥´3×m…lndU&Ï‹"$Õ ^|š·òôÎÓ1ÁÁATu8»e‚wDËP“KŒõ–ÌGn‰æÑ‚[aB.PãöLÈ$ç—áZ+õ¦˜ `æQ¸NXUÞ£—˜)r”©hps±jÖ•ÔÜûr%îûUÑaøÎl™<ÜCæÈ•TÞ¹ææHðکж‘!„k¿Ž!gÌEm…;Ú w9;spÒ¦Èå@B€*Ž|;œ—ƒPá!s÷§ &ßVL둳`ØeQŽÜüˆýǘ Ü —ŸÞ–›ÖÖ‘#Ncq˜:rq$¬¹ÛàbÇHVþ°M·­æPkÙÎ9Œ}ævN“mH®Þ°ÁÀ_ /¼TÝ—ô…Û#BÈqG^F$zÛZj7 Å™ !^0 m7¯ÄæPVŽ•ó`D"³û,³û¤È;U^†ìã>Vδ; 3¡uáXï°`…în[n_YiG薮ߩÝî4R+ØhÛv§Nq4–ì( :ïµ R¾Áý>(ö•í¿‹4—‹}…Ù+gƒTSñ˜ÌÙâ=^qŽwUÊ#—õy´øÒÙwÅÉñîæ½ÐrM‹×z¼¡ŽJàõtŽo-ö…£LI­§N­G|X·¥œé£ošhª?Aãë7ÌàøÚÉ<ê‹_k›ú½ZÊcÛ|Å—¿0\¼†‘§¬dNßsN.,笙= <¬ÑRý­æ”+N«<‚ÐÛi§°Ü·µƒ½Ç¸"ÖKÅ&*÷ìã ^£?hÛÅ­{™ÐúHý$ÓZ63C½õ7y-Í+Ÿ;W6CVr+?I Ôlj/çMK$u5ðI‘üDô4÷û9'ýå[¿iÝ;uy'ß™üïh¦ð?‡Øåûž½sч÷.Ù¿¶±ë‚Ä‘Ài×é‡/awu=Ÿ±«ŒOâËÈ_Éþ›‰[Þz¤¼ëïw°;YCÎv‘áûžKüêßÜÙ=™¸ù„pÇÐC&~gT7%þxÓ»¡)ñª5ÏËŸîßxäЫ8ïÑÏnþåy… Ÿ²ô°žlæîù°[ÿ`èagCËn€Ï‰­ñ?1†ŸŽóÕ̃Ü'­ç³ÖÓ–_×ùì‰cW>ãmùWì¿î™ƒo°´L‘OâaÃ,M¼)$'¾þýkvõ°çì8_¹õ8»äž-¿¿bÕ=ìD÷­Ç;οŒÝnéy`Ù­ÉÇØ~Ò«ã|¶F_ˆg­§Ëš÷/ùÛÏÏzò7ìâãæ|s?K\þò¶óð%Ðò^vèc¦^9ôÊW¾ÕË®_i(ÀÎ1†]ŒzuEÛ•5ìÓÌÃ_úúó9´ßÆí§Kž¸`Îú1»e¹Ûï_C~ƒ½ø6s=÷Þ`>íöÕ5öÊ®4¹§ÑŒ'›»³ÉôçÄBãY;ÞË슣$¼Ò‰#/î}ê_¯}Ç~²ów$>÷õ‰k‡Mýqü7î;ÚýXÏEÐÔ»å·ŒŽ ¼=>ÍÏ[³þ³ñcºí/Øq†#¦¾7ýù×W_uÙ 6û=3Þïx_|A4ð{šáŽy‰ß>ml ÄÞØâÏ|⣷°[_2yµnvNg*]¨o^ɧÇjtÊôiu­åwº“€i=Ç|ùMñ¿ñ€û¯Kx:ØÕmUÖø?(ù×ÐŒos¾¬¿À=YèÜõuö茱q²«ôxߘ=þÝ^ð¹¾™¢Üsí¾”{©oÆ+ùd†½0ÃŒ~çpÆáŒföµyœQaÜÈgÊT…ºêˆë߉äÜì™Ûˆj¡°¯“Ão¸­2Áó2W4þà ‘fþÕŸë©Oò™6=ÔfóÜÓ>êù7S”Õ1>vý,†óšÑ5GMDZÃÜßm–¸2¯5˜7ŸfKØ•œœTùÝ‚ó_ôã<§UTç7lºS²´ªÐ‰É—h-y‡!W5:¸ebÌhw³ÛUyϹN¾}óš² a»`mmŽý ·91»· ývaÀ. Z…ÆÐz,…°ÆRKQ,ŰÇR?–°„Œ02ÂÈ##ŒŒ02ÂÈ##ŒŒ02ÂȈ #‚Œ2"Ȉ #‚Œ2"Ȉ #‚Œ(2¢Èˆ"#ŠŒ(2¢Èˆ"#ŠŒ(2¢Èˆ!#†Œ2bȈ!#†Œ2bȈ!#†Œ82âȈ##ŽŒ82âȈ##ŽŒ82âÈèGF?2ú‘ÑŒ~dô#£ýÈèGF?21€Œd cÈ@Æ21€ŒAd "cƒÈDÆ 2‘1ˆŒAd ÚŒ¦Ðúõ´¢Å0-Fh1J‹1ZŒÓb?-Ð"¥…(-Di!J QZˆÒB”¢´¥…(-DiaJ SZ˜Ò”¦´0¥…)-LiaJ SZ„Ò"”¡´¥E(-BiJ‹PZ„Ò"”¥´(¥E)-JiQJ‹RZ”Ò¢”¥´(¥Å(-Fi1J‹QZŒÒb”£´¥Å(-FiqJ‹SZœÒâ”§´8¥Å) rEÍéš9Í>ÝlaGÓ¹s§T8ø öùù ¶Û¡¨2gdata/ChangeLog0000644000176200001440000012401614631624774013126 0ustar liggesusers2017-06-05 warnes * [r2154] DESCRIPTION: Fix type in DESCRIPTION date field. * [r2153] .Rbuildignore: Specify which file patterns to ignore when building R package file. * [r2152] DESCRIPTION, tests/test.humanReadable.Rout.save, tests/test.read.xls.Rout.save, tests/test.reorder.factor.Rout.save, tests/tests.write.fwf.Rout.save, vignettes/mapLevels.Rnw: Update package version and stored test output. * [r2151] inst/doc/Rnews.sty: Remove obsolete Rnews.sty file from inst/doc. * [r2150] R/startsWith.R: gdata::startsWith() now uses base::startsWith() to do the actual comparison, after hanlding ignore.case and trim arguments. * [r2149] man/trim.Rd: Add reference to 'new' base function 'trimws'. * [r2148] NAMESPACE, R/update.data.frame.R, R/update.list.R, man/update.list.Rd: Drop 'update.data.frame' until there is time to work on it. 2016-08-12 warnes * [r2130] NAMESPACE: Add mv to exported namespace 2016-05-31 warnes * [r2128] R/humanReadable.R: Fix typo that forced users of humanReadable() to provide two elements to the 'justify' argument. The correction allows a single value to be provided which will be expanded to two internally. 2016-02-05 warnes * [r2077] man/update.list.Rd: Add documentation for update() data.frame method. * [r2076] R/mv.R, man/mv.Rd: Add mv() function to rename an object. 2016-02-03 warnes * [r2075] NAMESPACE: - Add update() methods list and data.frame - Add 'first<-' and 'last<-' assignment methods * [r2074] R/update.data.frame.R, R/update.list.R, man/update.list.Rd: Add update() methods for lists and data frames * [r2073] R/first.R, man/first.Rd: Add assignment versions of first() and last() * [r2072] R/rename.vars.R: Improve logging and error reporting for remove.vars() 2015-10-15 warnes * [r2068] R/installXLSXsupport.R: Remove unused call to tempdir(). 2015-07-22 warnes * [r2062] DESCRIPTION, NAMESPACE, tests/test.humanReadable.Rout.save, tests/test.read.xls.R, tests/test.read.xls.Rout.save, tests/test.reorder.factor.Rout.save, tests/tests.write.fwf.Rout.save: Renamed 'test' directory to 'tests', commented out tests for lme4 which has a changed API 2015-07-03 warnes * [r2056] DESCRIPTION, inst/ChangeLog, inst/NEWS: Update for gdata 2.17.0 2015-06-29 warnes * [r2055] inst/ChangeLog: Update ChangeLog * [r2054] tests/test.humanReadable.Rout.save, tests/test.read.xls.R, tests/test.read.xls.Rout.save, tests/test.reorder.factor.Rout.save, tests/tests.write.fwf.Rout.save: Add note for R CMD check to help reviewers not freak out when diffs occur because of absence of a PERL library needed to support XLSX files. * [r2053] R/upperTriangle.R, man/upperTriangle.Rd: Add 'byrow' argument to lowerTriangle()/upperTriangle() functions. 2015-05-02 warnes * [r2018] Rename 'trunk' to 'pkg' for compatibility with R-forge 2015-04-29 warnes * [r1993] Update ChangeLog and NEWS again. * [r1992] Apparentely read.csv() needs different combination of "fileEncoding=`latin1`" and "encoding=`latin1`" on unix and windows platforms. * [r1991] In mapLevels(), use sapply() instead of lapply() to avoid warning message. * [r1990] Displaying all the latin1 characters for diff isn't reliable across platforms. Simply summarize the latin1 data instead. * [r1989] Display read latin1 data so that diff can catch changes. 2015-04-28 warnes * [r1988] Update ChangeLog for gdata 2.16.1 * [r1987] Update NEWS for gdata 2.16.1 * [r1986] Remove no-longer defined methods. * [r1985] Summary: Minor formatting changes, use rnorm() for X in example, and use set.seed() for consistent results. * [r1984] Summary: Replace unicode single-quote characters with ASCII ones. * [r1983] Summary: Call base::sort instead of sort, which has been redefined by arguments. * [r1982] Update NEWS and ChangeLog. * [r1981] Bump version number. * [r1980] Remove CVS header tag. * [r1979] Update version requirement for R (>= 2.3.0) and perl (5.10.0). * [r1978] - first() and last() are now simply wrappers to utils::head() and utils::tail() with a default 'n=1' instead of 'n=6'. - Move code for left() and right() into a separate file. * [r1977] If arguments 'X' or 'FUN' is supplied to reorder.factor(), mimic the behavior of stats::reorder.default() rather than trying to call it via NextMethod. 2015-04-25 warnes * [r1974] List needs a conjuction * [r1973] Fix spelling errors & typos * [r1972] Fix typographical errors * [r1971] Update NEWS and ChangeLog (again) * [r1970] Remove aggregate.table() entirely * [r1969] 'test.humanReadable.R' needed set.seed() to make the results consistent. * [r1968] Update .save files * [r1967] Missed on commit. * [r1966] Modfy write.fwf() to properly handle matrix argument, avoiding conversion to data frame unless rownames=TRUE. Add corresponding unit tests. * [r1965] Installing PERL modules was failing. Adding CPAN configuration option fixed the problem. * [r1964] Error message about executable name was missing one alternative * [r1963] Better describe gdata contents * [r1962] is.* and as.* aren't generics * [r1961] Add 'justify' argument to print and format object_sizes methods * [r1960] Add 'justify' argument to print and format object_sizes methods * [r1959] Remove stray call to 'browser' * [r1958] Update DESCRIPTION, ChangeLog, and NEWS * [r1957] Complete work on object.size(), object_sizes methods, and humanReadable. * [r1956] Add error message if Excel file format is too old 2015-04-23 warnes * [r1953] Update NEWS and ChangeLog * [r1952] - write.fwf() now properly supports matrix objects, including matrix objects wihtout column names. (Reported by Carl Witthoft.) * [r1951] Remove 'use POSIX' from xls2csv.pl since it is no longer needed * [r1939] Update NEWS and ChangeLog * [r1938] reorder.factor() now hands off processing to stats:::reorder.default() when either 'X' or 'FUN' is specified. 2015-04-22 warnes * [r1937] Update NEWS and ChangeLog for changes to humanReadable() * [r1936] Fix 'units' argument of humanReadable() * [r1935] Update object.size() man page to reflect change in class of return value from 'object_size' to 'object_sizes' * [r1934] Update NEWS and ChangeLog for gdata 2.16.0 * [r1933] Modify gdaata:object.size to generate S3 objects of class 'object_sizes' (note the final 's') to avoid conflicts with methods in utils for object_size. * [r1932] Correct behavior of reorder.factor() when argument 'X' is supplied by delgating to stats:::reorder.default() 2015-04-14 warnes * [r1929] Update ChangeLog * [r1928] Remove editorializing * [r1927] Update NEWS and ChangeLog for gdata 2.15.0 * [r1926] Add 'scientific' argument to write.fwf to allow control of whether numeric values can be displated using scientific notation. * [r1925] Replace depricated PERL function POSIX::isnumeric with equivalent regexp * [r1924] Add gdata ChangeLog to SVN 2015-04-10 warnes * [r1922] Update files for gdata 2.15.0 2015-04-08 warnes * [r1919] Move first/last/left/right to from gtools to gdata 2014-08-28 warnes * [r1883] Everything works now! * [r1882] Suppress annoying warnings in Spreadsheet::ParseXLS::FmtDefalt. * [r1881] Add tests and corresponding test files for 1900 and 1904 based XLX/XLSX files * [r1880] Complete transition from Spreadsheet::XLSX to Spreadsheet::ParseXLSX * [r1879] Handle Excel files created on the Mac, where by default Excel uses 1904-01-01 as the baseline for dates, rather than the usual 1900-01-01. * [r1878] Remove dotfiles * [r1877] Update for release * [r1876] Add test for handling fo very wide xls and xlsx files. * [r1875] Add test for handling fo very wide xls and xlsx files. * [r1874] Modify code to use latest version of Spreadsheet::ParseExcel and to replace Spreadsheet::XLSX woth Spreadsheet::ParseXLSX * [r1873] Update Spreadsheet::ParseExcel, add Spreadsheet:ParseXLSX, add dependencies 2014-04-05 warnes * [r1801] Apply same changes to NAToUnknown that were previously applied to unknownToNA for POSIXlt. * [r1800] Update NEWS with latest changes * [r1799] Call stats::nobs instead of stats:::nobs.default within gdata::nobs.default. This avoids R CMD check warning. * [r1798] Don't compare optional POSIXlt field. Explicitly compare POSIXlt, with special handling of '-1' unknown value. * [r1797] Don't use gdata::: prefix to access gdata function * [r1796] Fix syntax error in DESCRIPTION file. * [r1795] Package name needs to be defined outside of if test. * [r1794] Style file needed * [r1793] The issue Brian pointed out was an error in the isUnknown() code, not an error in the unit tests! * [r1792] Apply changes Brian recommned to NAtoUnknown as well as unknownToNA. * [r1791] Update NEWS file * [r1790] Don't need latex .dtx source file * [r1789] Move vignettes from inst/doc/ to vignettes/ * [r1788] Change 'aggregate.table' from deprecated to defunct. * [r1787] Complete changes so that the unit tests are run as part of R CMD check * [r1786] Update NEWS for gdata 2.13.4 * [r1785] Update NAMESPACE file to remove deleted function * [r1784] Move unit test files back to inst/unitTests. Fix up runRUnitTests.R to work properly in the new location * [r1783] - For unit tests, don't check for equality of optional POSIXlt components. (Bug reported by Brian Ripley). * [r1782] Move unit test code into the (now) standard location 2014-03-19 arnima * [r1777] change warning message to R standards 2013-12-18 arnima * [r1758] Retain original list order unless sort=FALSE; also stop if unnamed list 2013-12-16 warnes * [r1757] Trim will now remove all types of leading/trailing whitespace by using the [:blank:] character class. 2013-06-29 warnes * [r1692] Update NEWS for second try for gdata 2.13.2 * [r1691] Simplify ll() by stuffing list arguments into an environment, avoiding the need to use attach/detach. 2013-06-28 warnes * [r1685] Update NEWS for gdata 2.13.2 * [r1684] Minor update to tests/*.Rout.save * [r1683] Add on.exit() handler to ensure a matching detach occurs when attach is used in ll() * [r1682] Update for gdata 2.13.2 * [r1681] Improve deprecated message 2013-03-24 warnes * [r1645] Update test files for code changes * [r1644] Fix formatting in NEWS * [r1643] Replaced calls to depreciated function ".path.package" with the new public function "path.package". 2013-01-14 warnes * [r1639] Replace (obsolete) '.path.package' with 'find.package' function. 2012-09-20 warnes * [r1622] Correct .Rd file errors detected by 'R CMD check'. * [r1621] Add duplicated() and ans() to the NAMESPACE. * [r1620] Update for gdata 2.13.0. * [r1619] Fix typographic error. * [r1618] Add 'ans()' and 'duplicated()' contributed by Liviu Andronic. 2012-09-19 warnes * [r1617] Correct column names. Unit columns were reversed and misspelled. * [r1616] Add ignore.stderr to system command in sheetCmd() to prevent stderr messages from being included in the captured output from the perl script. 2012-09-12 warnes * [r1606] Update for gdata 2.12.0 * [r1605] 'stats::aggregate' was made into a generic on 27-Jan-2010, so that attempting to call 'aggregate' on a 'table' object will now incorrectly call 'aggregate.table'. Since 'aggregate.table' can be replaced by a call to tapply using two index vectors, e.g. aggregate.table(x, by1=a, by2=b, mean) can be replaced by tapply(x, INDEX=list(a, b), FUN=mean), the 'aggregate.table' function will now display a warning that it is depreciated and recommending the equivalent call to tapply. It will be removed entirely in a future version of gdata. * [r1604] Don't ignore .Rnw files, but do ignore .svn files. 2012-09-11 warnes * [r1603] Clarify workding of DROP argument to interleave(). * [r1602] Replace call to aggregate.table() with equivalent tapply() call since aggregate.table() is being depreciated. 2012-08-22 warnes * [r1601] Update DESCRIPTION and NEWS for gdate 2.11.1. * [r1600] Add example for read.xls() that shows how to use the fileEncoding argument to read in latin-1 encoded data. * [r1599] Add XLSX test for latin-1 characters, and look for them in their new location in inst/xls/. * [r1598] add XLSX version of latin-1.xls * [r1597] Add test file and code to ensure that read.xls() can properly handle files with alternative encodings. latin-1.xls contains each of the non-ascii latin-1 special characters in both the column headings and the body of the file. * [r1596] Change code to have R read the csv/tab data from the file rather than from the connetion we made, so that file encodings can be properly handled. * [r1595] Always close the connection. 2012-08-13 warnes * [r1594] Remove trailing space from output line. 2012-06-18 warnes * [r1567] Update NEWS for 2.11.0 release. * [r1566] Bump version number and add SystemRequirements for perl. * [r1565] read.xls() and supporting functions now allow blank lines to be preserved, rather than skipped, by supplying the argument "blank.lines.skip=FALSE". The underlying perl function has been extended to suppor this via an optional "-s" argument which, when present, *preserves* blank lines during the conversion. 2012-06-13 warnes * [r1564] - nobs.default needs to handle logical vectors in addition to numeric vectors. - update DESCRIPTION and NEWS for 2.10.6. * [r1563] nobs.default needs to handle logical as well as numeric vectors. 2012-06-08 warnes * [r1562] Update DESCRIPTION and tests * [r1561] fix incorrect function name * [r1560] Mark example for installXLSXsupport() to not be executed durin R CMD check. * [r1559] stats:::nobs.default and stats::nobs.lm require R > 2.13.0, so add this as a dependency. 2012-06-06 warnes * [r1552] Update for release 2.10.2 * [r1551] Fix bugs in nobs.default. * [r1550] Update to reflect warning on startup that 'nobs' hides 'stats::nobs'. * [r1549] Remove stray non-ASCII characters. * [r1548] The nobs() dispatch method must be defined in the gdata namespace to pick up the definition of gdata::nobs.default. * [r1547] Update DESCRIPTION and NEWS for 2.10.1 release. * [r1546] Define aliases for 'nobs' and 'nobs.lm' to support backward compatibility for packages depending on gdata. * [r1545] Update DESCRIPTION and NEWS for 2.10.0 release * [r1544] - Add manual page and NAMESPACE entry for startsWith(). - Add 'ignore.case' argument to startsWith(). * [r1543] Update to match new code. * [r1542] Replace non-ASCII characters. * [r1541] Add na.strings to read.xls call to convert "#DIV/0!" to NA. 2012-06-05 warnes * [r1540] Remove nobs method dispatch and lm methods since these are now provided by the stats package. * [r1539] Spell out arguments to ls() to avoid R CMD check warnings. * [r1538] Add .Rinstignore file to omit latex style and source files from distributed inst/doc directory. * [r1537] - Add NULL definition of MedUnits to avoid R CMD check warning. - Specify local environment when calling data() so that MedUnits gets defined in the function's environment rather than the global environment. * [r1536] Fix error in ls.funs() that occurs when there are no objects in the environment. * [r1535] Avoid warning by calling utils::object.size rather than Internal(object.size(x)) 2012-05-31 warnes * [r1534] - Remove dispatch function 'nobs' and method 'nobs.lm' since these are now provided by the R 'stats' package. 2012-05-04 warnes * [r1532] Update for next release * [r1531] Add ls.funs() to show functions defined in the specified environment. * [r1530] Fix enumerate syntax. 2012-04-03 warnes * [r1522] Add startsWith() function. 2011-10-05 warnes * [r1516] Fix typo 2011-09-30 warnes * [r1515] Update DESCRIPTION and README for 2.9.0 release. * [r1514] Update DESCRIPTION and README for 2.9.0 release. 2011-09-20 warnes * [r1508] Improve xls2csv() man page * [r1507] Add case() function, a vector equivalent of the switch() function * [r1506] Add case() function, a vector equivalent of the switch() function 2011-09-02 warnes * [r1500] Add 'centerText' function to center text strings for a specified width. * [r1499] Add 'centerText' function to center text strings for a specified width. 2011-04-16 warnes * [r1469] Update for release 2.8.2 2011-04-15 warnes * [r1468] Fix errors on windows when R or Perl install path includes spaces by properly quoting the path. * [r1467] Fix error in xlsFormat() on windows when R or Perl install path includes spaces by quoting the path. 2011-01-15 ggorjan * [r1465] Adding summary method for nPairs 2010-11-12 warnes * [r1462] Update NEWS for gdata 2.8.1 * [r1461] Update DEScription file for 2.8.1 release * [r1460] Update test output to match latest code * [r1459] Modify write.fwf() to capture and pass on additional arguments for write.table(). This resolves a bug reported by Jan Wijffels. 2010-11-01 arnima * [r1453] Minor improvement in Args.Rd help page 2010-10-19 warnes * [r1452] Avoid use of file.access() which is unreliable on Windows network shares. 2010-07-08 ggrothendieck2 * [r1448] findPerl call added to xls2sep 2010-07-07 ggrothendieck2 * [r1447] small improvements to read.xls.Rd 2010-05-03 warnes * [r1439] Rename installXLSXModules() to installXLSXsupport() and provide documentation for it. * [r1438] Update news for gdata 2.8.0 * [r1437] Add .onAttach function to check & inform user if perl is available, to check whether XLS and XLSX formats are avaiable, and to run the (new) installXLSXModules() functon to attempt to install the necessar libraries if not. Added installXLSXModules() function. 2010-05-02 warnes * [r1436] Correct error in xlsFormat example * [r1435] Update perl code to work (but generate warnings) when Zlib or SpreadSheet::XLXS is not instaled. Also update Greg's email address 2010-02-21 ggrothendieck2 * [r1423] isOpen problems fixed (isOpen must have changed in R since this worked in earlier versions). Also nba.xls link in read.xls.Rd disappeared. Replaced with similar link. 2010-02-20 ggrothendieck2 * [r1422] improved INSTALL file 2010-02-19 ggrothendieck2 * [r1421] added findPerl to locate ActiveState Perl on Windows if perl= not specified and Rtools perl would have otherwise been used. Also added INSTALL file. 2010-01-28 warnes * [r1419] Update for release 2.7.1 * [r1418] xls2sep(): Show output of perl call when verbose=T * [r1417] More Win32 fixes * [r1416] More work on Win32 building * [r1415] Support building Compress::Raw::Zlib perl package under windows. 2010-01-26 warnes * [r1413] Fix typos * [r1412] Show more details in sheetCount() when verbose=TRUE 2010-01-24 warnes * [r1411] Replace two calls to 'dQuote', to 'dQuote.ascii' * [r1408] Remove auto-generated pdf files from svn * [r1407] create 'distclean' to remove perl binary dir, currently mac-only * [r1406] Make read.xls() and xls2sep() quieter when verbose=FALSE * [r1405] Add tests for read.xls, sheetCount, and sheetNames * [r1404] Modify makefile to 1) clean up after build, 2) make tar non-verbose * [r1403] Close connections when done. * [r1402] Fix typo * [r1401] Fix R CMD CHECK errors * [r1400] Use the original gz file for Compress::Raw::Zlib to avoid issues with 'non-platform-independent' filename error in R CMD CHECK * [r1399] Rename files to remove R CMD check error * [r1398] Update for 2.7.0 release * [r1397] Add new functions to NAMESPACE * [r1396] Add Compress::Raw::Zlib code * [r1395] Add/Update documentation * [r1394] Minor formatting change * [r1393] Add additional example files * [r1392] Combine sheetCount.pl and sheetNames.pl and modify to support Excel 2007 'xlsx' format * [r1391] Complete changes to handle Excel 2007 'xlsx' files * [r1390] Add additional Perl modules to support Excel 2007 'xlsx' files 2010-01-24 ggrothendieck2 * [r1389] added sheetNames.Rd (documenting sheetNames/sheetCount) and updated NAMESPACE file. * [r1388] fixed spacing problem in NEWS 2010-01-23 warnes * [r1387] Check if parsing the xls file succeeds... Current code doesn't handle new XML-based format * [r1386] Remove perl 'Spreadsheet:XLSX' module since it depends on Compress-Raw-Zlib, which probably won't be available on most machines, and I don't have time to figure out how to get R to build it properly when gdata is installed. * [r1385] Add perl 'Spreadsheet:XLSX' module to support new Excel XML format files * [r1384] Add xls2tsv() convenience wrapper to xls2sep() * [r1383] Update to match new xls2csv.pl code, allow specification of sheets by name, support CSV and TAB delimited files using the same code, other minor changes. * [r1382] Add sheetNames() function to extract the names from XLS files * [r1381] Fix xls2csv.bat * [r1380] If only one sheet is present in the file, don't insert the sheet name into the filename * [r1379] Add additional test/example Excel files * [r1378] Modify xls2csv.pl script to: - Use tab-delimiter and .tsv or .tab extension if called with the name xls2tsv.pl or xls2tab.pl, respectively. This allows a single source file and two symlinks to be used intstead of maintaining several almost-identical files. - Allow selection of sheets by name - Provide better error checking - Other code improvements * [r1377] Add perl scripts to extract worksheet names and sheet count from Excel files 2010-01-22 warnes * [r1376] Upgrade Perl OLE::StorageLight module to version 0.19 * [r1375] Upgrade perl Spreadsheet::ParseExcel to version 0.56 * [r1374] Add complete list of contributors 2010-01-22 arnima * [r1373] Minor improvement in help page * [r1371] Many small improvements to documentation of Arni's five functions 2010-01-22 warnes * [r1370] - Move xls2csv(), xls2tab(), xls2sep() to a separate file - Move qQuote.ascii to a separate file - Bug Fix: xls2csv(), xls2tab() failed to pass the provided 'perl' parameter to xls2sep() - New Feature: xls2sep() (and hence xls2csv, xls2tab, and read.xls) now supports ftp URLs. 2009-12-06 arnima * [r1369] Minor improvements of Args(). * [r1368] Improved ll() so user can limit output to specified classes 2009-11-16 arnima * [r1366] ll(.GlobalEnv) does not crash anymore 2009-08-20 warnes * [r1357] Replace \ldots with \dots to make the new R CMD CHECK happy. 2009-08-19 warnes * [r1355] Update for 2.6.1 release * [r1354] Modify unit tests to avoid issues related to zime zones. 2009-08-05 warnes * [r1353] Update vignettes for 2.6.0 release * [r1352] Fix formatting warning in frameApply man page 2009-07-16 ggorjan * [r1350] Reverting recent change and clarifying the meaning. 2009-07-16 warnes * [r1349] Add contents of \value section for resample() man page * [r1348] Update test output to remove R CMD check warning * [r1347] Update ChangeLog and NEWS for gdata 2.6.0 release * [r1346] Update DESCRIPTION file for gdata 2.6.0 * [r1345] Correct Greg's email address * [r1344] Correct minor typos in write.fwf() man page * [r1343] Correct page for resample() * [r1342] Add support for using tab for field separator during translation from xls format in read.xls 2009-04-19 arnima * [r1314] Changed object.size(object) to unclass(object.size(object)). 2008-12-31 ggorjan * [r1312] Documenting changes and exporting the functions. * [r1311] Enhanced function object.size that returns the size of multiple objects. There is also a handy print method that can print size of an object in "human readable" format when options(humanReadable=TRUE) or print(object.size(x), humanReadable=TRUE). * [r1310] New function wideByFactor that reshapes given dataset by a given factor - it creates a "multivariate" data.frame. * [r1309] New function nPairs that gives the number of variable pairs in a data.frame or a matrix. * [r1308] New functions getYear, getMonth, getDay, getHour, getMin, and getSec for extracting the date/time parts from objects of a date/time class. * [r1307] New function bindData that binds two data frames into a multivariate data frame in a different way than merge. * [r1306] New function .runRUnitTestsGdata that enables run of all RUnit tests during the R CMD check as well as directly from within R. 2008-12-20 ggorjan * [r1305] * [r1304] To remove some output in the R CMD check 2008-08-05 ggorjan * [r1300] - Increased version to 2.5.0 - New function cbindX that can bind objects with different number of rows. - write.fwf gains width argument. Unknown values can increase or decrease the width of the columns. Additional tests and documentation fixes. 2008-06-30 arnima * [r1299] Simplified default 'unit' argument from c("KB","MB","bytes") to "KB". 2008-05-13 warnes * [r1270] Update NEWS file for 2.4.2 * [r1269] Use path.expand() to give proper full path to xls file to be translated by read.xls() * [r1268] Modifed read.xls() failed to return the converted data... fixed. * [r1267] Correct broken patch for open-office support * [r1266] For read.xls() and xls2csv(): - Implement more informative log messages when verbose=TRUE - Quote temporary file name to avoid errors when calling perl to do the work. - Add better error messages, particularly when perl fails to generate an output .csv file. Update version number in DESCRIPTION. 2008-05-12 warnes * [r1265] Patch to correct issue with OpenOffice-created XLS files. Thanks to Robert Burns for pointing out the patch at http://rt.cpan.org/Public/Bug/Display.html?id=7206 2008-03-25 warnes * [r1250] Update for version 2.4.1 * [r1249] Example iris.xls file didn't complete & properly formatted iris data set. Fixed. * [r1248] Update perl modules to latest versions 2008-03-24 warnes * [r1247] Fix typo in win32 example for read.xls() 2008-03-11 warnes * [r1246] Add xls2csv to exported function list 2008-01-30 warnes * [r1241] Update DESCRIPTION and NEWS for release 2.4.0 2008-01-29 arnima * [r1240] Added argument 'all'. * [r1239] Added argument 'all'. 2007-10-22 warnes * [r1196] Clarify GPL version 2007-09-10 ggorjan * [r1169] removed unmatched brace * [r1168] adding alias 2007-09-06 ggorjan * [r1162] keyword 2007-08-21 ggorjan * [r1154] package help page * [r1153] move * [r1152] move 2007-08-20 ggorjan * [r1151] clean * [r1150] a real vignette * [r1149] a real vignette * [r1148] additional keyword for searchig 2007-08-17 ggorjan * [r1147] keyword 2007-07-22 arnima * [r1103] Reverted back to as.character(substitute(x)), so user can run keep(x), keep("x"), Args(x), and Args("x"). 2007-07-21 arnima * [r1102] Changed as.character(substitute()) to deparse(substitute()), following help(substitute) recommendation. * [r1101] Changed as.character(substitute()) to deparse(substitute()), following help(substitute) recommendation. 2007-07-10 warnes * [r1099] Update read.xls() code and docs with enhacements by Gabor Grothendieck 2007-06-06 ggorjan * [r1097] last edits from newsletter * [r1096] drop levels as suggested by Brian Ripley * [r1095] better integration of unit tests * [r1094] making codetools happy 2007-01-28 arnima * [r1042] Throw warnings rather than errors 2007-01-27 arnima * [r1041] Meaningful error message is given when requested object does not exist * [r1040] is.* tests that return NA are not reported is.what recursion is avoided 2006-11-30 ggorjan * [r1035] minor commet to the code * [r1034] description of mapLevels methods * [r1033] description of unknown methods 2006-11-16 ggorjan * [r1013] seems that c.factor was not a good idea and there were better examples posted on r-devel list 2006-11-14 ggorjan * [r1012] Removed executable property 2006-11-10 ggorjan * [r1004] just formatting 2006-11-02 ggorjan * [r1002] typos 2006-10-30 ggorjan * [r1001] some more examples for use of read.fwf after write.fwf * [r1000] ignore for report files * [r999] Id tag from source * [r998] removing unused import * [r997] Id tag * [r996] write.fwf * [r995] Id tag * [r994] added unit tests for reorder.factor * [r993] mapply keeps names in R 2.4; POSIX unit tests solved; $ should work now 2006-10-29 ggorjan * [r992] fixed problem in tests; added unknown methods and tests for matrices * [r991] sort is generic now; mapply keeps names in R 2.4.0; some codetools suggestions fixed * [r990] sort is generic from R 2.4.0 * [r989] trim() gains ... argument; version bump * [r988] Fixed collision bug with stats version of reorder.factor 2006-10-27 warnes * [r987] Add c() method for factor objects, submitted by Gregor Gorjanc 2006-09-19 warnes * [r986] Update NEWS file for 2.3.0 release * [r985] Explicitly set the local in runit.trim.R to one where leading spaces affect sort order so that the unit test works properly. 2006-09-18 warnes * [r984] Update Rnews.sty to the latest version * [r983] Integrate fixes for trim() from Gregor and myself. * [r982] Remove unneeded files. 2006-09-13 warnes * [r981] Add unknown() and unit test files * [r980] More fixes from Gregor Gorjanc * [r979] Add mapLevels functions from Gregor Gorjanc, along with associated unit tests. 2006-08-03 warnes * [r978] Add Gregor Gorjanc's mapFactor() and combineLevels() functions. 2006-08-02 warnes * [r977] Update my email address * [r976] Remove MedUnits.rda to convert to binary format * [r975] Remove MedUnits.rda to convert to binary format * [r974] Update version number * [r973] Integrate changes suggested by Gregor Gorjanc 2006-03-14 nj7w * [r940] Fixed R CMD check errors and added trim.default to NAMESPACE 2006-03-13 nj7w * [r939] Added trim.character and trim.factor as per Gregor's suggestions 2006-01-03 warnes * [r839] Add resample() function, which generates a random sample or permutation from the elements of the supplied vector, even if the vector has length 1. This avoide the problems caused by base::sample()'s special case for vectors of length 1, where it attempts to sample from 1:x. 2005-12-13 nj7w * [r806] Updated news and removed changelog 2005-12-12 nj7w * [r798] Updated version number for CRAN release 2005-12-08 warnes * [r789] Andrew Burgess reported that interleave() converts 1-column matrixes to vectors and provided a patch. A slight modification of his patch has been applied. There is now a 'drop' argument, which controls whether 'unnecessary' dimensions are dropped. The default is FALSE. 2005-12-04 warnes * [r779] Andrew Burgess reported that interleave() converts 1-column matrixes to vectors and provided a patch. A slight modification of his patch has been applied. There is now a 'drop' argument, which controls whether 'unnecessary' dimensions are dropped. The default is FALSE. 2005-12-01 nj7w * [r775] Updated Greg's email address * [r774] Updated Jim's email address 2005-11-21 arnima * [r744] Suppressed warning message in attach() call. 2005-10-27 warnes * [r716] Bump version number again to show that I fixed a bug. * [r715] Update version number * [r714] Remove explicit loading of gtools in examples, so that failure to import functions from gtools gets properly caught by running the examples. * [r713] Add missing close-bracket * [r712] Add upperTriangle and friends * [r711] Add functions for extracting, modifying upper and lower trianglular components of matrices. 2005-10-19 arnima * [r695] Replaced the "not.using" vector with a more robust try(get(test)) to find out whether a particular is.* function returns a logical of length one. 2005-09-12 nj7w * [r671] Updated Greg's email 2005-09-06 nj7w * [r661] Added library(gtools) in the example * [r660] Removed gtools dependency from NAMESPACE, as it was being used only in an example, and was giving warning * [r659] Added Suggests field 2005-09-02 nj7w * [r658] Updated the example in frameApply * [r656] Added NEWS * [r654] ChangeLog 2005-08-31 nj7w * [r644] Added DESCRIPTION file * [r643] removed DESCRIPTION.in 2005-07-20 nj7w * [r631] updated documentation * [r630] ## Args() was using a different search path from args(), e.g. rep <- function(local) return(NULL) args() Args() ## Fixed * [r629] ## is.what() was giving needless warnings for functions, e.g. is.what(plot) ## Fixed * [r628] ## ll() was crashing if argument was a list of length zero, e.g. x <- list() ll(x) ## Fixed, and added sort.elements (see new help page) 2005-06-09 nj7w * [r625] Updating the version number, and various help files to synchronize splitting of gregmisc bundle in 4 individual components. 2005-06-07 nj7w * [r622] Reverting to the previous version of drop.levels.R by replacing sapply(...) with as.data.frame(lapply(...)) because sapply has the undesirable effect of converting the object to a matrix, which in turn coerces the factors to numeric. 2005-05-13 nj7w * [r621] 1) Using dQuote.ascii function in read.xls as the new version of dQuote doesn't work proprly with UTF-8 locale. 2) Modified CrossTable.Rd usage in gmodels 3) Modified heatmap.2 usage in gplots. 2005-04-02 warnes * [r600] Move drop.levels() from gtools to gdata. * [r598] Move frameApply() to gdata package. 2005-03-31 warnes * [r586] Comment out example to avoid R CMD check warnings 2005-03-22 warnes * [r578] Fixes to pass `R CMD check'. * [r577] Integrated fixes from Arni. * [r576] Improve documentation of 'perl' argument and give examples. 2005-03-09 warnes * [r573] - Add ConvertMedUnits() plus documentation - Add documentation for MedUnits data set. * [r572] Update MedUnits data file. * [r571] Don't need both .Rda and .tab forms of the data. * [r570] Add MedUnits data set, which provides conversions between American 'Conventional' and Standard Intertional (SI) medical units. 2005-03-01 warnes * [r566] - Remove 'elem' call from ll example. - Add note to 'elem' man page that it is depreciated and 'll' should be used instead. 2005-02-26 nj7w * [r565] *** empty log message *** 2005-02-25 warnes * [r564] Remove ll methods since the base function now handles lists and data frames. * [r563] Integrate changes submitted by Arni Magnusson 2005-01-31 warnes * [r529] Add ability to specify the perl executable and path. 2005-01-28 warnes * [r526] Add dependency on stats. 2005-01-12 warnes * [r515] Add dependency on R 1.9.0+ to prevent poeple from installing on old versions of R which don't support namespaces. 2004-12-27 warnes * [r509] Update usage to match code. * [r508] Replace 'F' with 'FALSE'. 2004-10-12 warneg * [r465] Add unmatrix() function 2004-09-27 warneg * [r461] Updated to pass R CMD check. 2004-09-03 warneg * [r455] added to cvs. * [r454] Checkin xls2csv.pl. Should have been in long ago, must have been an oversight * [r451] Need to look for files using the new package name. * [r449] Need to use the new package name when looking for iris.xls. * [r448] Add ll.list to the to the list of functions described * [r447] Add ll and friends to the namespace * [r446] initial bundle checkin 2004-09-02 warneg * [r442] Initial revision 2004-08-27 warnes * [r441] Fixed bug in mixedsort, and modified reorder.factor to use mixedsort. 2004-07-29 warnes * [r427] Add perl modules to CVS. 2004-07-27 warnes * [r425] Fix typos/spelling. * [r424] Add note that Perl is required for read.xls to work properly. 2004-07-16 warnes * [r420] Remove the temporary csv file if reading it in fails. 2004-06-22 warnes * [r377] Add S3 methods for data frames and lists. 2004-06-08 warnes * [r371] Moved from gregmisc/src/. * [r370] Remove the files in src, instead provide "pre-installed" perl packages in inst/perl. 2004-06-05 warnes * [r365] Fix typo. * [r364] Fix Unix makefile so that it works when invoked directly. * [r363] Fixes for Windows * [r362] Minor enhancment to read.xls example. * [r361] - Merge Makefile.win into Makefile. Makefile.win now just redirects to Makefile. - Update xls2csv.bat and xls2csv shell script to correctly obtain thier installion path and infer the location of the perl code and libraries. - The xls2csv.pl script now assumes that the libraries it needs are installed into the same directory where it is. 2004-06-04 warnes * [r360] More changes, indended to improve installation reliabilty and to make Makefile and Makefile.win as similar as possible. 2004-05-27 warnes * [r358] Clean should remove scripts from source directory. * [r357] Moved to xls2csv.pl.in. * [r354] More fixes. * [r353] Fix missing brace. * [r352] Add explicit package name to see also links. * [r351] More xls2csv perl module support changes. * [r350] More changes to fix local installation of perl modules. 2004-05-26 warnes * [r345] Escape underscores in email addresses so Latex is happy. 2004-05-25 warnes * [r339] More changes to xls2csv code. * [r337] Add Args() function contributed by Arni Magnusson . * [r335] - Change to call perl directly rather than depending on the installed shell script. This should make the code more portable to MS-Windows systes. - Add additional commants.. * [r332] Makefile now modifies xls2csv.bat xls2csv.pl and xls2csv to contain an explicit path to the perl script/libraries. * [r330] R CMD build calls the clean target to purge build files from the source tree when packaging. To get use this behavior correctly, I've renamed the clean target to cleanup and distclean target to clean. * [r329] Add read.xls(), a function to read Microsoft Excel files by translating them to csv files via the xls2csv.pl script. * [r326] More fixes. Seems to work now. 2004-05-24 warnes * [r325] Add files to enable inclusion and installation of xls2csv.pl as part of the package. 2004-04-01 warnes * [r312] Add function remove.vars(). 2004-03-26 warnes * [r307] Contents of package 'mva' moveed to 'stats'. * [r298] - Fix is.what() for use under R 1.9.0 - is.what() now uses is.* functions found in any attached frame 2004-01-21 warnes * [r282] - Add ... argument to match generic provided in mva. 2004-01-19 warnes * [r275] - Integrated (partial) patch submitted by Arni Magnusson to clarify help text. - Modifed code to use match.arg(). 2003-12-15 warnes * [r271] - Applied patch from Arni that fixed a bug that caused env() to crash if any environment was completely empty 2003-12-03 warnes * [r253] - match function argument defaults with 'usage' 2003-12-02 warnes * [r249] Add one argument, to match code. 2003-12-01 warnes * [r244] - Apply changes submitted by Arni Magnusson 2003-11-19 warnes * [r229] Changes to pass R CMD check. 2003-11-18 warnes * [r224] - Convert from MS-Dos to Unix line endings. - Reformat to 80 columns. 2003-11-17 warnes * [r223] Replace 'T' with 'TRUE' to remove R CMD check error. * [r222] Fix syntax error. 2003-11-10 warnes * [r220] - Add files contributed by Arni Magnusson . As well as some of my own. 2003-06-07 warnes * [r198] - Fixed error in examples. Had sqrt(var(x)/(n-1)) for the standard error of the mean instead of sqrt(var(x)/n). 2003-05-23 warnes * [r197] - Fixed typos * [r196] - library() backported from 1.7-devel. This version of the function adds the "pos=" argument to specify where in the search path the library should be placed. - updated .First.lib to use library(...pos=3) for MASS to avoid the 'genotype' data set in MASS from masking the genotype funciton in genetics when it loads gregmisc - Added logit() inv.logit() matchcols() function and corresponding docs 2003-05-20 warnes * [r195] - Omit NULL variables. * [r194] - Added function trim() and assocated docs. 2003-04-22 warnes * [r188] - The mva package (which is part of recommended) now provides a generic 'reorder' function. Consequently, the 'reorder' function here has been renamed to 'reorder.factor'. - Removed check of whether the argument is a factor object. 2003-03-03 warnes * [r165] - Updated to match reorder.Rd which was exetended to handle factor label names in addition to numeric indices. * [r164] - Added handling of factor level names in addition to numeric indexes. 2002-09-23 warnes * [r118] Added inst/doc directory and contents to CVS. * [r117] - Modified all files to include CVS Id and Log tags. 2002-08-01 warnes * [r112] Added reorder() function to reorder the levels of a factor. 2002-04-09 warneg * [r109] Checkin for version 0.5.3 * [r108] - Properly handle case when some or all arguments are vectors. 2002-03-26 warneg * [r104] - Changed methods to include '...' to match the generic. - Updated for version 0.5.1 * [r102] Added ... to methods. * [r101] Updated to add ... parameter to function calls. * [r98] Initial checkin. * [r95] - Added CVS tags 2002-02-21 warneg * [r87] - Fixed bug where row and column labels didn't always correspond to the contents. This only occured when a factor was used for by1 or by2 and the factors levels weren't in the default sort order. 2002-02-20 warneg * [r86] New function. * [r85] Initial checkin. * [r84] Initial checkin. * [r83] Noted that specialized methods exist. * [r82] Incorrectly had contents of nobs.R here instead of help text. Corrected. * [r81] Minor changes, typo and formatting fixes. * [r79] - initial checkin. 2001-12-12 warneg * [r53] Added omitted documentaton for 'info' parameter. Changed example code not to use 'Orthodont' data set so that the nlme package is not required. 2001-12-08 warneg * [r47] Changed 'T' to 'TRUE' in parameter list. 2001-12-07 warneg * [r45] - Fixed see also link. Mis-typed 'data.frame' as 'dataframe'. * [r44] Added attribution. * [r43] Added proper attribution to Don MacQueen. * [r39] Initial checkin. Unfortunately, I've lost the email of the person who sent this to me. I'll credit him/her when I find out who it was! * [r38] Initial checkin 2001-12-05 warneg * [r34] - Renamed 'concat' function to 'combine' to avoid name conflict with an existing S-Plus function. * [r32] - Changed function name 'concat' to 'combine' and renamed concat.Rd to combine.Rd gdata/NAMESPACE0000644000176200001440000000654114631624774012575 0ustar liggesusersexport(.onAttach, ans, Args, bindData, case, cbindX, centerText, combine, ConvertMedUnits, drop.levels, duplicated2, env, first, "first<-", frameApply, interleave, is.what, keep, last, "last<-", left, ll, ls.funs, lowerTriangle, "lowerTriangle<-", matchcols, nobs, n_obs, nPairs, mv, rename.vars, remove.vars, reorder.factor, resample, right, startsWith, starts_with, trim, trimSum, unmatrix, update.list, update.data.frame, upperTriangle, "upperTriangle<-", wideByFactor, write.fwf, ## Object size stuff object_size, as.object_sizes, is.object_sizes, humanReadable, object.size, ## getDateTime stuff getYear, getMonth, getDay, getHour, getMin, getSec, ## mapLevels stuff mapLevels, as.levelsMap, as.listLevelsMap, is.levelsMap, is.listLevelsMap, "mapLevels<-", ## unknown stuff isUnknown, unknownToNA, NAToUnknown ) importFrom(stats, reorder) importFrom(stats, nobs) importFrom(gtools, mixedsort) importFrom(methods, is, slot, slotNames) importFrom(utils, data, head, read.table, tail, write.table) S3method(reorder, factor) S3method(summary, nPairs) ## drop.levels stuff S3method(drop.levels, default) S3method(drop.levels, factor) S3method(drop.levels, list) S3method(drop.levels, data.frame) ## getDateTime stuff S3method(getYear, default) S3method(getYear, Date) S3method(getYear, POSIXct) S3method(getYear, POSIXlt) S3method(getMonth, default) S3method(getMonth, Date) S3method(getMonth, POSIXct) S3method(getMonth, POSIXlt) S3method(getDay, default) S3method(getDay, Date) S3method(getDay, POSIXct) S3method(getDay, POSIXlt) S3method(getHour, default) S3method(getMin, default) S3method(getSec, default) ## mapLevels stuff S3method(mapLevels, default) S3method(mapLevels, character) S3method(mapLevels, factor) S3method(mapLevels, list) S3method(mapLevels, data.frame) S3method("mapLevels<-", default) S3method("mapLevels<-", list) S3method("mapLevels<-", data.frame) S3method(print, levelsMap) S3method(print, listLevelsMap) S3method("[", levelsMap) S3method("[", listLevelsMap) S3method(c, levelsMap) S3method(c, listLevelsMap) S3method(unique, levelsMap) S3method(sort, levelsMap) ## nobs stuff S3method(nobs, data.frame) S3method(nobs, default) S3method(nobs, lm) ## Object size stuff S3method(c, object_sizes) S3method(format, object_sizes) S3method(print, object_sizes) ## unknown stuff S3method(isUnknown, default) S3method(isUnknown, POSIXlt) S3method(isUnknown, list) S3method(isUnknown, data.frame) S3method(isUnknown, matrix) S3method(unknownToNA, default) S3method(unknownToNA, factor) S3method(unknownToNA, list) S3method(unknownToNA, data.frame) S3method(NAToUnknown, default) S3method(NAToUnknown, factor) S3method(NAToUnknown, list) S3method(NAToUnknown, data.frame) ## trim stuff S3method(trim, character) S3method(trim, default) S3method(trim, factor) S3method(trim, list) S3method(trim, data.frame) ## left, right S3method(left, data.frame) S3method(left, matrix) S3method(right, data.frame) S3method(right, matrix) # update methods for list, data.frame S3method(update, list) S3method(update, data.frame) gdata/inst/0000755000176200001440000000000014705613304012312 5ustar liggesusersgdata/inst/doc/0000755000176200001440000000000014705613304013057 5ustar liggesusersgdata/inst/doc/mapLevels.pdf0000644000176200001440000031720314705613303015507 0ustar liggesusers%PDF-1.5 %ÐÔÅØ 1 0 obj << /Length 282 >> stream concordance:mapLevels.tex:mapLevels.Rnw:1 51 1 1 2 1 0 1 1 6 0 1 1 7 0 1 2 6 1 1 2 6 0 2 1 6 0 1 1 6 0 1 2 7 1 1 2 12 0 1 2 6 1 1 2 1 0 1 1 6 0 3 1 7 0 1 2 9 1 1 2 7 0 1 1 7 0 1 2 6 1 1 2 1 0 2 1 7 0 1 2 4 1 1 2 1 0 1 2 1 0 1 1 7 0 1 2 17 1 1 4 9 0 3 1 6 0 1 1 6 0 1 2 10 0 1 2 68 1 endstream endobj 27 0 obj << /Length 3580 /Filter /FlateDecode >> stream xÚÍÛnãÆõÝ_!y ‹Ë’C²hx³»ƒÜšuZ ›<Ð-±+‘*IYë¿ï¹ /ÒÈkï&@ˆ9s8×3gÎu‚Ùj̾¹xysñ·7©še~f´™ÝÜÍÂ4ðã(›%iæ§&Ý,gï¼ï¯~úéú‡o.ç:¼ï^ÿëõwoþñ —W\¼¹L"ïêë›K•z?þ|ùûÍ·¯o.þ{¡`²`¦fqäg™†±¤z¶Ø^¼û=˜-áß·³À³tv –ÛY”*?ÍÜÌÞ^üó"˜¬WÏtä'i¢pÁvÌ(ô#cd½ùnWV+^Ô¦¸/6-Ãõ—9wù¢«\':P!˜ÍuègЇ»YÜ~µÌ;éºËïóU!}£Ó¾±¬åö;|Ó UŠÌÇõºùO^-úÉU䇑Ñv/ y„ëªkêå~Ñ•u%ÍÍÑ|È‘që7´'Øo˜Þ¾-P=™w]SÞî;ùÕÕŒn‘¸DF—Õ]Ýlsš”þóä8R°½˜§Ûö¤ŽRï¶èEQa%ƒº¢©ò ÿÂÚªh¸²¨—EË­òj)¸uÞ䋹kŽŽú…‰wŸoöÔàÒ/|XXËÞ¨b¼7eÓvÜ‚ð¯”N¸ÚbÉ0ëÏ,‡×¯:ŒZ5CŠ Z;mÍe]Á*L ½«M·®÷«µý½•Žpt4.k×V«&ÆÛ”ï †˜IÛ—ó(H½n]” ÿàÃMxwXn‡„Zq‡•ß‚@/Ê¢’aËŠKØò¶u-oHh2âäo¨à¤yÅè;d_ø¸ºK傹/hHc¼«å²DÞÉ7›‡K¥”÷Ây²ë¢_²ÎW¶yõÀÐݾ"æo¹J{2ï6o¥éÏ\À2;†v4P}_.íÈK'gÙ5â‘(f/µìpB}ØUœÆÞ[8É®Ü-ÿìS{UQ,Ù9öP7ïñâÇÞ¡ìÖ nˆÔø†Ä¦¿!€çÀpÕ ”Ûº8öä¬#Mù^§‰r ™‘…´öŠvW,J:jxXã•Ŧ´ hO³à¯âƒãnÈŽ„Æ«&ß"yrûN"Zž%ßÐ} 1[ÊÂî®cªÛé`Â.ZØE÷좭To¹ð [¸‘›%Ãëü¾°ÿ¥›o ×ÜmAâDtGŒÅMªEK€7µ„Î<8¹Ø¢aŒ„µŠ´¯Ó&aé ÷'‡oßwx—à»—r_ë÷Qæë$´#Ø»Á×k®2åÇFñÞº\ Ë›Òj£ÐË+®ï»rSv\±cqºˆ‰xÍôÂß½Z$ÆA¹©’%¸¬Ê62~”ÅvC¬cí¶?NµÒ É,ôVWâ?IâÙ|ÔÊ*jšÿ· þ}™i`ª@‘ŠH~(ߥ‹ç`“ÀØE¢‘_Ñ ï„V0„½Óܘ|»Ûíµ¥ö)—DÊW*|:“(Ú.ªÄ™‚"ã!¨,!P™¡¾oCêJøUQM¹àÊÀÜe)|phÉ©ŒÃkgϽ­L5Õs®lkꑾƱx |–ôì!+8YƒÑªmp-ƒ7G“g&‰á”CÓOÒÕ[$îd±ÉÛ¶`µx×ì?Ö¾Òz*{Y°E@R¡‚NJ$ÊâÄN‡‡XÊAvŽÅéØOõÇ(örÙ6KÙv'¥ß݈["…ƒ ‰¯¢~]õí@§Ë>ˆÅyï ¬'L]Ú ¸/ë}‹ŠÅÄ™·³X#ÒÎR TUq˜=vŽíÍO˜p¸‘êe®è-0¨YÇ(¨Â(+.ö Y™ÇÞoZ‡ ÿ ˆÁ7›Wù–¯ùl.L¥ªíXÅb´âNا?P/úÑ«/¬°8}f†F½)ƽ^äNü5X:6'lMW¨ˆ9`-(¼õ»ºmË[¶àªWXµzÎ1#k½0Û¡Ül¢U@ 'Û”hu ±ÉÉ~kg‘÷5?ÿ& AÓŽ9¦¹Ë&wêUí&_(—”ü¾g‡Z5~6ÈH<ˆ8EÃÃ1(à oùÁ1– |ezyTºØZŠŠþ8 o´š^~r¹´öÊ‘ j˘+ù‘>2¦éüš£g4ˆûKG¼u(Ñ`GciÎÅsMÆ€‰dž,C_%ÑãÂNL™Ï• ÷R°.Ž®ùX=¤)`?i³©l CU¬q­ÖõX=ëÝ)–¹‚'¶;èÙÀÅ®÷Ý4žÑîëIdct‡Ä¬É‚S$È$¾óp;˜ï–Ô·#j`ù0°ß ¾cZ–<¾¨2ªôÔ=aÿàœA·!ÐO¹À¿À÷RÊÜÁ«SÔ¯§¨W‚¢åN §ÖAÅb𽃖Øúwî%W\üÊÅ+×¹»9ŸŒðÒŽ ã=0»ž)iñqLÚg–ð}99§gÒèü^މ¢øŸæ"ä"rÉQ0ý¢hʫפ/2ïPp)®@äðârµ beŒƒQ¶Æº*¤­û$N¬ZÔÄk_º&¯Zôm¹jýúUci† É–mGÚÁUѹ® ^[öà#mX: P7媤ÕcÍN=Û%‘¶v þž˜,ˆØ·¨Š"µ€%IgDdµßr°(‹ÝŠ lpõŸ£¹˜:KùalŽYž:§XeD²RP·ŠTtÞ|§"C Éžk->²<íG‰;Mq`ƒ1XrÄ€»OˆïÝ'ü9슻ˆû$c»¼§( P+”Šc„5ÃèÜm@Îìs" p´ÙYØmö®yPß½‹€ê¢ùV«G|,ð ÁÖŽÈš(¨µh—tº}Ä’?Ðxa‚B„ÇùÕghúŠ]郉\ ܱÌÝjkØà±lÍ…üI«c2¨Sý÷¹ªR? 2§î©©¬ÔêTãa¾úd0Þœ°ù9-ã(2ï0Èù §ŸªlÍ®lÇëí`)#[r”r ¹Ìæ8ëÇûÿÄs¿ðgø~ïõ#ºr¼òkÑzèái“LU!p½§+I•gÙgyS¸7½l§{ͬƒ³R¬åÜ#ŠÀTŸaüÇQoüãnÚ‚£¸s Vš™cWu®c`€ß’%m@cw-d`3¸-ºu½dx_mÊÖ¶)¥‡H((Y䨤š»XCï¨0Ÿ±™þý^[˜ƒ[® nTÖ¤£TІ1‹z»«+P×ç391¦þª™A±öú)*²<üåRKâ [PR “›®ºuMtâWŸ£eçv¬ÉÚGÆ€’ü–ÂP…*ʹ84˜ÏkǤÛSRNq n]7œ#24¤;»èŽ;¡Í©“ÝsÛ˜v`Æ^é<2Ö¢@‚"’]‰@¾X;—|T ÃÚêáÂX÷—bˆÛi…¦Û±ÿ:ðÐÄ£¼Ï åÙ:²Pë?YËØÀÁHÿ™ä#0Äù°O·&á:ø ³Ø?Â~a…}/÷T¸r1ÁV7œë¥éõêl¯ð‘^¿ží¹z¬Žî”ºúº aQk£´Sß÷KniåÍÐñã²:å¹ 8+š²Â×&`ù‚ H dlóæ+%0aÓåÕ¢@¹lB‰â¯ãh ÓG[Ø|›ç:R¤ y?š³„áP Œ)Y/›ŸŠÔ$©•·ŒQ >œ"¤÷Kæ& ½¯GW*ŒYëÊ}ï]¶ƒ‹—Šéu‚`ò÷‚ªïI¼I+ÇÔ8ø8ö.Ãv…%ØdüÛ(Ë& ,)UJ)YøcŸ]§²aì5ã”6uè²&§|ì<'šW¼Ç%£êá/HiÎùbMÁìD^ €;èÄI^Ì>ŠÍbcfÖ×V"\•N“"?óÒNÐkðsÉ\>p« 3„:¹: |y&žF࡜ĈõDîÓv‹ÜµLþ‹éÕ&;ç"íPaxäl¡oêî è3݈wòi2V{ƒõÓ]¥QÄO rMŸ:Ng|í‘aúˆŽ™úO]=Âzùþ<¯ò)Tùÿóü²Ç<¿—j˜õ¼%‹úeÇ™? /F„å}ªŸÐ¨&Îd 1yŠXs¥í2?¯Ð8T‰ÔëC•¨°%§åu6Aˆ0?HÓÃãŒIKJX¢ã¡Q¶;¨¸ ÏB'ʪßD^%Ae’U˜‡ Í~¬l‡‚‘ú®9i<+šs¬'¾GØS Keq¿ ÄÒ6i7ŒHšÁ¾a²™Øl”ÍÄ0”S·°ÉRñå°dŠbë'Ñï"ïö6a‹û#çâ–| ËKù!Ì…ò›D¨´åjݽp>Ü"O4LÅ– ¶`!LÿdóDmI>=þ­Ê»‡ÑƒÇ–ÑLûñóFB»¥ý K>c£û—g`„圕ªÛ–µ0~C#=z‡¯¯·ùª¬ î÷Pï¹ ÅæÏ¼ JÃÁòJµ¼ÓB,6•'xˆàç“I’¬¥g7ФÝmJÛ«"âàH‡z<|ûñ7w$vÒ ôU4µhÔĸÐO‰Ì Ù4>ÖÌ)— éÄ.k: À²ù (Nw J.눵çøÀ&U' îóHaf|†%% øÆ`ºÙ×LmÙísŽRœ Åʳk£ý8L{Éi±¾8Ë/¸ 8nY’pœ=öÓŒ}œ¼ìJ Y@ï¼C?ÂϵŸf’pb%ä°MÛ¿Ç‚9}5Y¼-}ed Œ|p¦éhúñ¶ÿMí§¡ endstream endobj 46 0 obj << /Length 3429 /Filter /FlateDecode >> stream xÚÕksã¶ñ»…ÒOòô„àI€iÓÛw—¹Ì]r½s:ÓñåMQ–R‰TDÉ>ÿûîàS ’›L?h,I`±Ø÷Btt3¢£NÎ/O¾}kØ(&qÄ£Ñål¤$‰c>Ò&&&2£Ëéèjüù—Î> =þ÷é„kIõøÃÙÇï~ú†ŠŽß¿ù×›÷Ÿ]ÿç·®=sÍÛS-Çg—§ÌŒþtúëå'o.O~?a°<±f¹ˆPÃGéêäêW:šÂ³G”ˆØŒî웫‘4Œ˜ºËÑ瓞ÐöbØbD2îvðÓ‰âbü…*zÊÆ3ø1ù;t'®‹Ð~)ü¶ð+à·Ÿÿ(mºß™o_¹±ûztáAð!ë5@ ½n!NG{Ž´ÃùÊbÉÆ¿ºéÎ\óÚ5ø=~Á‰•r_¼‡·3øÝúv ¿~ßuf¸¨&²tH×Ã`ŸjüHªÿÑT;?šjç!ª™¨…†“²‹Æ»ð?Çw´ŒŽïŠÍ$§~ï’ˬ×v Åz³H¶ÙòÞ½P®³t1»_ä7“f4€†ùí¼Ëà±íŸŽPD1V}åw³›8ºqª‰ý×Áx•å¸óØŒ¸³èíÈlEîžXšÄõÉù×IFBx M(S#ÎÆß?IÉ4äÞÏí6¹Ú2´– µ %c¢uTaYl`O¦:2nظ:°Ì?Ù•™ë-ö7kÂyüØž" à"‰R5.³]ž"é‰ßs̈Šz‡öÎÙ›2¹w¶0¶Òíbë[?¾Í6þ‹m¶Zo‘óܨp-ìò»'kJT†—~‹¥Uˆ!uÉBbâg"TKwðÇÙ_ç9Œ´§wà™´÷ñ:м]TJ÷`óv˜¾>».PJ£ÇÙ×dµ^Öƒm–OK7°;(ýØ:ˆä’ÑøzçŸ&˲VËé<Éo2˜Q©ØM€]§QÄó©ë$UGXVžº×²eæô>ý´OgN9aÆ:š6ExDåÕßxÝÈ áLt±ÿØ+É#§$×a%EÖ;T €OØì¹…W-çÅ]îÖ ’ D ~ˆ¥Ðõzól¹ö„(x¥Cˆur“9ÉC-qWì–S×½þ¿ÔøÝ¢ûõzãû°9o=ê%ÚµF=0pœz©¾è©š×­G´Ê9Þ£>Lå¼õV-€·ÂÔæoå]ì5üÞ?‘—!ø1ÜT3x¿ËD¨}6à²Xñ…áÎÅ*YC#îBgΩ.F‰†°C+¡9ȽkÑC¶ܥsßK³<Ù, û³vÔ~ƒ_çºNkº¾Urn"D tË$tyZRm_»Aìn¦˜¢"Exâ\´¢ôãÖØ¸¢ÊIÏUƒyv“X¬á-ôz«¡³>‡2·…]>µ+ân¬×‹=ï_¤Yé‹2äúICT|¸TDª¸ïU^$ !]Ìg«†éz|X zŸ¾qí<Ç(emžÎtÃhG”0S³ïo»rëVO‹|ëÄãGHußDTv5GR–‹›Ü»ã YÖéöiÍömyÃÝ^3ã»mGÀ¶ÚLØ|TÇ_Cþlm€•Âd·u ¡Hdzâb¹\r9`§cB%{hɘHY‡ Ûy²u³­’m:wÝ®üà6Yî2¿jE¦•‡‡#šEY* çœx‰m4ÅÖI«#(Ž}è‰ꙩ{bEÚRÈ!¦ô³"Në¢ y¹¸¶q ’ãcãºíõql}h+@ —I í¢œ#£Ž`×@{_ÅFîE×Rx¥&1vpG=Œ¸±µ7vª³ká  °¶6PvÑGˆI¡±¨pûÉÚ䀭V–mNÅ ßå“–3#z>i¥S!®ïlxL>ˆXbè¾\Ø3`QöK˜Qô+rïW éo|» i<@^ëV §‰ qÛ½ÝÏ?ΕÁk”^5.®ŒyWëÜÍèý Ú±–‚öiS¥>õ´@C:Dƒ¶½V³ˆöÜoaÓÛÊ&Õ3 ÓŠÍ£ïè:5þ”•»%*b¡ÂÎ>¸ëúĖŠÁ󨑶:¬™,ï’ûªX^QBõsw V4&QO ú”&ÀŸpJ GxüNf ÖÙÔÛxReÆ©B1ßåiÌǨ!v¹Á Rp bž9ÈoÅ"÷°6Ãñž{†€™ÕÊ\µüný›ÉpÀYe w™E­ªÌ¢V.Í¡£ñz·u€&¡›ÿ‚§É€SÑÉj- 1‰¸zX°1n­9hêpë[âÙJJV–›BGª ÑÚô\‰Ü†gÜg­ Seѽ¹n&=ÙSä¡i+àÀxå­‹Å?ÃïM˜cQs&"Øz ³¿îðÚ“5÷ Oðûe`Áˆ“¨ñHHÕyÖøl½v®"°Kkìxu°À¹Ù¬³²±þÔ?+ÜïÔ#¨rêì‰=Å©·¹¸Ú—³–\òÜâDE'´-jÝÓrŸ¢•ü„_=±ã™%_5Á(oJ¯BÛÅ8˜)®ŸÁLOéiœòX%Å;ݼ,¥4Fø®½ðík¯oü'mìš\A/רË3örŒX¬Šz!• ˜B„Ð+²º@HGК=Z!sFâ`ð Rq@0fÇádÆ3×凯í%Q†Šj1qFâdO資66Úç6ÚiOL§Í©&~!â–‡}Â0ÖÚ¨=Ù°ó=Ù‡óh +CA6`~¬/®8áTv‚îÞ:Þ/íWàËx+VSÓÅiÛÝ&·9™^ìŽ[ÃC‡w™”ÁÔ-ÂÂ$6Ò£Ûç4MLöË{ûw—+Dä[ŸÇÃXÇ!&0ü6þ &q“i™¹y=™JrFÞÁ„Û(æ±ÄöC䀀]Åu˜_\× ªˆhuݕ߲tks€˜Ã×f|^@ˆ@Jf^òÈ4àÐ0Ãr ²3q%DÒ !ìf«´2³Av7IkC4i\`ºw lC3€“NZÁô åfLSϘ…u‡"LÅOæCJŒ©gü6TÍè—UE ß§,½O—ö"Š4Ým|UéÎÆÄ]fù f‰„(}C|F˜/ÌŒºÑp‹ŠE¸ ÈÝ ­ ƒÉÝëŠãê^€ìM€ä»Õµ º[×™Òbµ.r̈|›ˆÓn•û×Ý.ûžCHiÂø³ŽŸ=vüærü@ÐÈÚrû€w:]`…ÌæÖ¨q‰ù|‘åiæ« ×žx)ÇM=xõÃöx‡ä¬¦²i÷®Qæêu¶‚U ì½AE[YɶŽþ®7£Ù6X…j{Zðšê¼µŸ#¦Ö\´|òCtY7ù2ù’¨æ$úË+#FØ«,_‹erän'L²Ó½Tü€`Ä4O^zã ÉÐæ‰e·Yéî´ÉØçåší´œ­õó~­?uwuÊÁ]…ó9ºiö…RžWüÛfÈW]†œxîÂp,bæŽÄÈâj(²0`j:æÈÝÜ]—Ù7ÞG£B} 6iˆöDÓABÔ«ëE¾Êµ“Ë:OB±ÇÒéZò—4@&ðJëúfÞaù–fh'­² à?pÝòÒíâÃí¼/=¢·Ïˆá´"¼ñ!œÄýuiÎ\âÚq:Š+û´pº–Š4 © Þ¾Óð"æ,_s£ \,5.å1|"#›VÙÓÚ&''1Þn¬4šÂ~UØ]ƒ ^\ˆy§Zá4Kÿ[u“ãm0oÀ‡þàõe¦DÛ‘ô:¸­‰biïD!ü;Ÿ[@÷h‡¼ ¨4!Ápɧ  ÊÖ_'ÊgB?Áï6âhnézIðÇŽZZ ÄgÒªeUHZ­’Í}`JÌ„jûGžÎ¥·PÄЛˆû P©9­3 ë‹\rD7QŽÕ9‘ˆZ×F™—M¯‰6Ô^Sþfœr¥7a«­Õ]jäneèæ¦[ë3W¨u}_| ùçÖäëºT'µ¬Ku¶·iv—-—mH|^cƒ6¡ÕV… ›@Ç4jª[ð¤xU°$˜ÈÊqÎï@®"kÁŽÏ÷. ínnЯ6"}!çD*ieÜTÙ_Þ¯-ýuâã< endstream endobj 50 0 obj << /Length 889 /Filter /FlateDecode >> stream xÚUÝ“›6÷_¡G˜9t’å)qÚ¸ws3m§N&0‡Èåãšûï»BË;N&;+±_ÚÝß.Œ”„‘Íj½[ݾK8ÑT+¡Èî@"Iµ$N4MTBv9ùè­ïÖw¿o¶oþøíÿÓîžH¦(¸¸*_ýº[ý»â f„õ¨(KÉšÕÇOŒä »'Œ†:!ÿMš ‘ §‰†cMÞ¯þ\±³G Â% ¥ËWFœ2¦ñÕ¾®LÙ¥§Ççé³ýÌÁ‰ZdÊH BªâØ™ßS?àšyïÌjÍA[.´EBÓsÆYÚ½ò‘0ï­iNi[™ÖYÆrî½9êªÈÝÇmQv>O¼¢ï­¢s¾| UJÎÞoÀ5ž`Pf8†Üû°}@³xað˜ÓçTG‘3~ô¹7 €^Ý"õ@(Ãs/óž€è¹åʼ[ž¢|Xø (O1Öè€þ¾Lß¾Í[°FZÍyC² $»0̳ìNiö9- ¨Jļ§¢› :]8å§WO2—à)D¸l š†*o'zûZxi×ýµökEùÒþ2O‡À¼¿üX‚aeÆ=:všznÙ.#˜€$¹H¨©ÚÒ”:¦îíQxÓ¹o6Ž;5²ÓX§Ãw$áÌ£‚È Äã8þ.„Ðð§1”a¿mŸ[컽~ õ¤Ýa×ˆŽ =Qünåå‘êÌÞ zPf¸ŸôÒÔ³#t‰‚ÅC§/– Y1  %Qœ_Ý1ËÊ„<‚ èvŒäÂæL©_¢Â" xžŸßcJ6Õ 6 ·¥˜‹lª¾ÖRÁ(‹³Á…”\‘ˆ¿ÎA$ÔËL C³³~ R˜ Cï®Íê1/z{›°j?öfœÐšîž™¼p i›ßZ4Ú¯¹ÉƦh‡Ôá™aå‚LÈ ¤Ò`Ý]µ»í‡ý³ãë5Ö¦þ\tvpnl ÒÛ¸YÚPVacºcÚfgq0x‘›øÝ£iÒÞƦ.ž}Îmm¿ßi„’2€‡[‹ÖÅB~h«©ÆÃ³S5Œz÷5¥7îþ¾6OE[¥WíÂc‰à) f±E—÷ãbÒ,à^ã,sfmFÔ©¦I´€r¶óV¯Îfçi€*#Iõ‰%þõÃËqûpçðŒ endstream endobj 61 0 obj << /Length1 2129 /Length2 12725 /Length3 0 /Length 14005 /Filter /FlateDecode >> stream xÚveTœÙ¶-îîNaÁÝÝ-¸»S8îîÜ-‚»»… îÜ5 {•îs;}î{?Þ`Œ¢æZs/ûæÚ_ÑP¨j0‹[‚Ì2 'wfv6€¤’†¢¦&;€“…‰†FÓÖÝøÇƒD£ tu³9 ü‹#é 4sÛ¤ÌÜÁT%à­‡€ÀÎ#ÀÎ+ÀÆà`cãÿ"ÈU eæik Pb¼9Ýh$AÎ>®¶Ö6îàLÿó@gA`çççeúë8@ÜèjkaæP2s·:‚3Z˜94@¶@wŸÿ A'dãîî,ÀÊêååÅbæèÆrµ¡gxÙºÛÔn@WO %àwÛe3Gà?ͱ Ñ4mlÝþvi€¬Ü½Ì\°ÁÁÖèä>äád t€ó4ä*Î@§¿ÉŠ˜ÿ€…ýŸpÿ9ý;­Ó_‡Í,,@ŽÎfN>¶NÖ+[ @EF‘ÅÝÛ `ædù›hæàŸ7ó4³u03þ*Þ #®0÷øŸÝ,\mÝÝXÜl~wÉú; xÐÒN–’ GG “»Òïú¤l]àÉû°þóˆí@^N~°•­“¥ÕïV,=œYµœl]<€òRÿaMHlÖ@w7øÁ]@o ÖßI4}œ9Ù›Á}ø9ƒœVàV€¶V@ð?$?73O ÀÝÕà÷oÇ#$vv€¥­…;Àhmë„ô':Ø ´úƒUàjë 0`‹ÀöûïŸoF`Y‚œ|þÐÿzЬr’ZR*êŒÿ4ý[Bä ðcæ`0sprxØy<ü<€€ÿ¤jfûŸBþuTÞÉ àÿ»^ð þ§fÏÿî?{BøïXÊ °€º?z7dãf³°ÿ«þ¯#ÿ/±ÿŽòÿ¡÷ÿ]“Œ‡ƒÃ_ ºÿ¡ü_ 3G[ŸÿpÀöp¯ƒ¼Nÿ›ªü{‹•€–¶ŽÿÛ+ïn^ q'k°´™ùY¸xþ6󼃯z-UmÝ-lþ’Éßf­ßkç`ëT¹Ùþ¾jÌìllÿËÞ5 {ðuâVç_. x•þ;«´“Èò÷ÎqpóÌ\]Í|ØÀ¢âàæø±ƒ—Óèý—ž¬,N wð¸Ã€Èé÷£åá°Šÿ6ýx¬/€Uòâ°JýAüVé/€UæGQüƒÀQ”þA|Võ?ˆÀªñqX5ÿ peZÿ ~pý?ÓìWfþ±ƒ‘«™…=|Í[¹ÿ±sþcÿ[œÿ8À­Xüƒ¸ÀE€o2Ç?á?VËApàŸAüF.`ÿ!€{´ú'¶þÃ;­¿4À*ûC'µùS¸sgðMü‡¶Ùþ ‚[þ“‘\ Ão•üñƒ{rüÁ÷ë¿‚ï"VПt`.øõ/7¸Dç?nðYgðKÃ鿦ÉÅþëÏ,zVgðzƒþÌ‹ ܾ³ƒÇŸâ8Áͺx€Ü–æÿ;Øú¯‰°ƒûýW?ìา€—ÕÝ ô/7xž øÎcõþ×êóü¯Õ±ðp×ïþ×-Þ«ÿÁ½»€@o ÒÊ"ÈB0Ü®1¼û¾^œØ‹y’s€GëîÕƒœ )Þr—ê³2}1Wá-_ú{)Õ1‘Zh%hÈÈ$béx^/{~‰x,ì,(¹¢3–&!e”tÓ—lDÉq™Ž%}¾È]PTÝéшHN`iD‚pƒHïõ\TàˆÉªŠjUŽéùñ~…~W‘sT€›é•b³ ÊD~Û×:ó@ûV¹õì'vM–éÂâ *wÐ|¤,’{ãsb½ ^Þ‰>Ž_6= b½Ÿ˜Jb h¯™JF~®(B§RQ »òªáuÅ<>§•JÉ,žOptÞÊÇ«9{‰LÍ3„ ,¢dÙ!Zy…œ–ØÈ}OðÍç­8 晓£»ø€5Ûg;;nJµóAù^d¡‘MSJ3ìŒÉº¾g3ÍAdžSœF¡â5„/]ÔÂ)âFÓˇ„óÉ~]ν¥ÖôQ aàÚE·ì h²Ÿž_  ÍÉAtè÷C¼VŠÓùtÈÔ"[dV#1Š<ÌÂX~£}c±l€cHd¹þsŒ¡–Ég:9ŦK\±Ê¶€yŸ½âå²yÊB…çO›|þ ²D¦ú¢p ¯­……þ`ÕçDÓŸ¢¾ÚÛ0óK3yO3C E -É·hÿæ} ~Œ~4´U$¢éÁ¯ ÜXöÄ[IR/¤1 ÙJIŸd§éEBsQ’`îMͬ‹ÝùÂÆÕ9 ¯þw†£H;c±8*ŽM_ÛzצaµoòTÑjåN@Â韴nYææ‡Yi4X,çܾ*Rgõöæp¡±½\ðRUÑGß–F2cíoùZc{pr_tSZs9 ¦h¥»[Ü5^ígÖ•ùAs Ö¶=A°Ê¥ èëÓjþR3’Tâ@+ðƒËË,QÉÍãu¶-LªtC ëDƒ³o'"£WbA3ºïoR×3ž{c·é]‹õÓ(ãq^Yò'®çn÷€¸„[Ù`èÒ@sר1ùãú+#’{&n–æip:Ï@¨-À3ýp†Ç—EF‡ Ç³‘”0(irf¡Ô®º+,*Ém¶½œŸ‰á<‚œø­ª™óE°pæêG(7]&8«ãÔàÓ;µð«™;ÈR"P[hËå¡ý¶:Q>¼ob?Gö {à¹Ä„ÞÍ^cl³²z+fõSÂõ‘¥<;zÂQœµ—>´ÉŠª¸Z‡²x¶ˆ6§UÏqvÍ×Tª{Þø²M3yjQ-Iá(ôþV˜+ý44~ YEvJãe„pðwìT'†è¢øq@2º^çÞ³«UÝ!Bþ—Íû/ÍÛY*k]ÙeÞ„ÙyÔÌE«\ôc3z?OY|ňp  ¡‚’¾üZö´Ð=J|PÅÒÖJ˜b!óÔ4øtpQ¿%¯úñr“®(^Õš\tõ¹|gÝæ­ ×Yc³6ŒKÊi¦Ú-æ{e‰6Ü¥Go²²—Ç–}_.¸çŸüJ]Œ±D„Fà¶&Æ|%3ž·ß{óО×}®Ú¸ z„i`sC¹þüÝßÁ¹—$:…ÀG9ô[F`Ž/fz§Ú˘… 9ëXãÃZ6‚Ì“A(­aÈ‘‹qk;yéó„‰TFÉ$¥§˜ÖmŽÏ°IéÝZí¨<ÈTàþòM ¼:¦šdµÜ¾Wú&%+~a¥¦Á±D7†e²¦EœUhBpÙ_–ªüòbò0Æ3½&]åî-D\ ²=näÝO;aŠ/’èÕü©'§\,çe5ß,ŠÅû©ùg>¨'{Æ&¯K÷ô[" «b…„uã}(jëF³™ã" 4Ûas™°3‰ lyx‚òÇs爥!2tÊV‹”¡=ÔáJâîRµ Å%¸ø@ö‹(O1fâ÷˜å[] ŸDÍŠ^ÙU4ÞpRßå·AbÞЯ¡Ôl¤Ë/!µOçÊ’1tsŽÅsãŸsØ|¯B.Šg3bgú $lž4‹YÛ»pMJDâ½räzÉ¥•òxãÚ¯óiš/¾H8°dö/0¶qõÂL¼ÁþñÚãÙÉñiA©…ä•ùØ“ŽÙE{•èö©ã6TÅeü#éLÿ´“âqÿ¬é§MÕ1cŽE†ìé3“ƒ9Œ’ÝÎ4¸õæÅSf/_¨i›<½ŸÕ8Që˜p`ùL´0ÚöœÄØ‚¢ž<œ¤Q("¯}fœ·¼ûå¹)™KÍV}ú…ŠÖÌ– W1}•TÌ ±¹ÐL£ÂÖYÙÜÍ$;4æG™¨gërm¢rj™Ó¡¿»|HÐÔ™ ú¹yâŒ0€ðË!ľxÙ&*øµmyKw^?˜ðL[ûqš@¡Q@+æªßª$DDó¤=â:?³eQ»„´£rUÊÑ‚` IñЊùÆŸñ÷CˆôõØTM,Ò'ܦ·eoùCªcØŠV[]/ÕŒt[|g|ó !—U¦ ²È‡ò'zóÞ'\‹P¦mÊI ×rô™ók1-K‡PlR©‚S¿4&á_;JÁnë^ . º¢pë”-ð7`Û|bÌ`tnˆY9‘ÞnE/ÄÐÅ,#û˜jµÓ•{Lµœ/§Ã“Ë9g\_x®4d «€qšŒˆ'@c2"Р$P®d œéúŸ·¯ò"pí“q”íÒ–‘$ ¦³õF£ ÷ãP ÈÇÂkuÙ™æå¾JuUÉ‘E¥ž½ÃIße ,pÿʺ¹æ‹ù=ÞMΓQŹÎYÏ‹;ÌbÅÏlƒáÀ²›÷r‹³‰€Š¨óÊ^úcO**’Êû§h;f:Ô¼ax]:û§ Ðßý>^œp(Utæ*õcZß–#ܨ'ÍüçˆŽÆ WZ•ï/xjä=f¤/ÊSyÇG~[s}OÄYð³ô$XEjæÒLò(0,‘œþÎyL\»¢šÕ¿"›ÆF¸N_‰Gâ–¡ýÖµHok]>´†m Ó½ŸS'Î1/DR Жˆ|`ÓQÕ³Còr§i|BC½x[Tßaudç*vúÎ6£Œ¢¼¸'s2Éî÷î‘ßGNãK. NFÖÀ¿óʆáíöØk8)x#¿»¶'¿YàwF3ÇøÍâÒñ{h¾”wîø˜äç7¨XdP^!¬¡„íD%»Ìhùà=û7›çG¹Ô®ðШ'¦‰˜øò;Ç’‹»‚a÷g†Àâå—~㾫TE›{]Ý6Ø|_¿qàÞãiQYLîøäÄyœ¶õë¥bgª!Œ°þ—nd ä[Îá’(|­…3ýÛG'8ÍSª|å@̃R’öKçéÁ{q|=àr[j)ð½¨bâá¯íZj»H½ö Ìc<›©KFxaÈÇâW{"XÑØ ž¦ÕåTù©¥ÁÃõê¹tJšò ÕË´j⬉gý+Ȱe1ß"4ËÞ«±™—ÃÚ=[ßU|–ã5‚\÷-*¶ÊDå^¯q¢˜±çaˆ£ 9±ìv3Ížaôì’Ï÷‹Š¦dÚ!2ËV‹µ¬1–A£ ÛLwýÖ‘œ’!œ_$‡>udá.k“[¨øÙº¾ˆ>%Š·Eìr½ÄšX¿n+J¹~Óê¼÷°]:ªkÃáåÌÝì©Zà‰ÕûÞ ¹ŸÂÉ $ì‰$«J!Ù²1(™ÀEààYoßH›T\¼„Ò³xˆc¹©b6ä°Ü¾œÛ)óÊÚ¢çB‚óH^ c~"4P7yiåÅõ^Ì¿n<4èL¾~Ìß±/,®Èy Î1§l*'°èœšuÿHPŸ½D'ŠX R yÎŽ i¾àÏ7;¼LJVIF|bcèPyÖŒœä?i–/Ó%rά7©ë˜:éì®z<£KÆzÜBPžî’¯® ÑmUJ—[¡,m ÖÙl¦ëKF<¶öÕ2ÚÅ ;ÔÎ.ÏA¼KŽ×Ýß âÝ@øt)›}Ð!ko|‹–ˆ!0v ü t/ù]®£T‡p½N¨\Ä—H ó–}&pë^) OûµY%`"ÄÜf¾ RM|Ô"„¼8Í„®¯MM…V. *‡X¸ÒI†°><*8n½)g[+£~†.?æ'S\%™õ<óùŽÐ.S‰•î <âïE¯Å<²+7SªÈZâ]]è”Ôz!†{Âù0;î³KˆQ Ìò ÊzåH)Ùö0ÕÁ¦0ûTë&W_:^ëH–²˜¥–g6çTdÇ…³µ¨`–'a¢Ï±,ùÛ›…LÅÜõ·óQcÛúô⎠^x3>B ç¶qöœG̰’KÄæÁ4ác©îõ» ‡Oª:»qçOS¸[м{ jQ/kˆˆý¸rvŒdí_o˜Ñä³XæY»¾M¯µ‰k»zJåÇt¥ÓGÁ¿²Œ WýþXÄËO·m…ð"¶üÈÐeÂÒã÷6ˆ6­g3\lá·^g¥'j–HŒ¢ÞÇöÜžýt§Âag'™«~30ixCœÏ¾©ûk ˆ$ï,Â>hÃôc÷Ǽ²èó0ûSŽƒøÀ[jeå²àždÿg¢Cõ5ç¥Õf8³Ê¦Ç[^6"eBJ(8¤’n3IiÇÙœ˜^™A}À„wä#~ø¢'ß©`ƒ·=F¶_üqÊ–Í4}Cq§s½¹ C%¡~sé!O[ÞÔ»Id¾5–ò®çÀ¾¬…9ÒþÁÏŒoÛZ@Qk¯FïíW˜-•ñ>0÷LúÙˆË ×}T’ûAcÀÏ,âpù–ÔsN®åC}‰¨ø&+!ÄŒêW6xÿ|3¬çÖz4>hÚØË¶þ÷É:‘…+zj–Ê"Üýì9ü¯æ1È+vÑîi¤l¤‹ïB>¸•N¼yuÂç|Úaªíèån=Wî(| 3»LÑ^yšºyBäT?3ûCzñ÷¸Q¼ç”Xæ P*ñ²=#ucÍ-a ¡NάçJYo.|îˆöµÄY(ù„”OŽwýÚ@¼}ë1%XóJüÈE©¼É_E_SýùxõÈ7ZP¿káBé>ýÞÉOt¹¢ŽP¥-bt‘)vÄ#ú‰<‹’Y:•ÑN‚BþŽˆ»r\ìé—ãÉbàI3ÿɶÄO|&&Á/ ·Y¸†˜šCûu7%% yÖ´‡:`ÛñþۅΦ_†¡µoUö ïþ”,H>D¦aÒ˜a*…™kiqX{ã ]ËA3]’Âk>„G ׸_Üï»1Ä—Ïž“•I¥Xó2cH‘ÈëêaVnªû|çž0ãÆ’;߉™Ïd›8á Aœüqà“¢X 8 Q%2c|O„a=¿4Ú¾®s ¢c­¶“$í}‡÷K2ÈAÞ*ROXØ\ÆöGÞÍ.°ìa¾qG‹Ø°Ã{ßösKÙúb¦Ÿeu¤ñüÖ±hõÔDH'›Ä ÊåK̻֞@“"NßA¡—ŸyË8¡øºP^cIÅÈ5¥%qúœ2Í/S¤‚ÉÐÚ^ÈU upœº†)º¬!½ý1é«5Qü~|2¿†Ö×yiPØC¹Gb<¿„ì(šºhçƒ]V…©L¿'ñú¡¼YË|؇MßënÊÛèÍGÿü挊›- ßL´ƒÒ¤Š”Ò wKœ ºÇ´N¾áfU{„Ì~š^Æ:ó^6BMIÔûlµ/ú±4ýþAFPÑH6¨†]Õˆü×Õâ8ª#Í•=b; …v…ÉÒL‘§“D)í8 s¥¦A𱫹gu¡,Úsˆ‹¶ð €†‡ƒ&C_¿k‚“;ƒó[BêLVÔM¯O½³„û‘J;f‚ÛÑ&·’ýnïá¢s´$dDOÏíâËÂzµ+é«Ûy…“ÚÛçåa}Zß „íº8áYZµFþž®×’@§çÑ$LÀ×þ|õ×PZ¼SÞèšâw.ÅÂa“¬áý§Ðù36vã²³[±RD¾Ñ½¼½ä(2â55pÇM§5úý ü]èÊš¶ ߘ¬Î5j™jgj“~Üt“–ÕÆeµ‰¢NÎVvng=”¾z¶ üzåWöÍ….(73}ŽB<±•§ôú~¢ËyŠš7|{ŠÛ…ùô°Mxä6Ol±8‹ÛÈý¸²³,”;…ZÔïQü†Ât-—‡#w Pn6G'÷ÕDêD’«ø|Тèƒ3žßåŸb©&_ŬÍ[;§£aòº¿yýð‹F61jÚôtùñP·ÿž~`*ô]aÖ:Õc°x¹[LGÈ_ÚjQ?†ø`ð>g¿X…<£6_¨(3Ð(/c.´9Ž2[ù‚ý{žÏÞ¥êÚš™³!sK0­¯#Š…‚± ›Ü¥|ß%›x@TÍÝj²ÆÞØiލö‡S[ud…ŸuÉîX쯤F¼ñùŸ8ØæEÌŠ¸áß"Ï,ŒzaGŸùÍta[Ð å•^.*[Ò9¥µa€6æïz£Tí^jvÃ=î£5‡ó´`9 @åyn€]Ö•þ^×(/ÝÍMg6w\öo|ßGýü˜åÎu•ë ןoÊŒ8Z›ì±àúÓçYHPÝ"üËS=²ß…“lu<é0´‰dÎåÜ—>¼}¨„¼ˆÖõttŸÕ»ŒtÙ‘²½‡È‡2[(·¥š®Â^Ì®¨ dM>—å7æùý]1ð‘xqãä^ÑŸìpg—÷CϹàsirÂùA6)ŒnQ:Åü*Ç>‰ß +e{ »YGp´—ÒN¦QÂØbÚN¤ŽÖ’Ëm_ài„šÃCfûÌ2…hXEŠBŸšž‰?ëÐÎcÞC{CgÖRpáÜÕK=Fª—̰Æ×¸?æ0lÌ[²³…׎Í÷‡užW³XÂuøy',vÓô<µAžÌ&Á”Iö¿4ã ¹y”Û:¿™Ù»~ùvës uÈ"ŸµÈž—)ò!Ü{<÷Ø™»ÁôÊÓ®þ¹Žwó¢D¾¦ÅÀÛ—ItÑÖ`T£pKdÓ1ÃIí6IÜ€j«³g5';Gå/ ‡©5 mº /þ`ìävº$¬³†6t¸r¬ÉÓŸ‹eyXRˆ‚7oÊf;5(]&ù[‹`IT0&eÂÝöCÞ¦qnÝ.²:ÔéwÔú¼›;ãß™yR Ô3í*ï” †ßÕò¿Tìx_¤-´¦«ÔQ@1~tx\-0û®*î;ñq ’]ãšíYÅ­Bñ6yóZµ):ƒèÇO!Íç¾y¡ÙEÎBz4¨záj#oxáòa¸(RwTSj³ôM½úÏ3î±ì×B!Eãø‰H>O4~pyÀ#EÀlü®Ì+µ¬eJKæ>¡””Ì4›¡‚Î®ÂæìT¼hS”Ÿ«B{ õÃYS…o¯Jºý½ÎÅ>O“†ÝÙj9s\N_ø4̯k_±!HWYU5Ks¿ÆY³4á'Þ¤-ê°\a,_r‡~"ùÙirµÀSPfØZšçB4n….‡„È9¿@—/±ÖÄñÞ ÄÈÞklµªÍÉ3ó«<ŽIø(lsƒùLÂó°.™îhò£Ýé¢U@j¯Yioç<Öø 4à° Íøiâ©ëØåGf^­€_óñŠV¯ÕUÖv)=šÐSþg©4:ú‘2ÇÛÃ0Ž1‰ÊKm˜Ž{¡'s¸WbÛNMÉ%aúVùJö UC·×6úλQå©fÆåã¹ÝÑÓ,þ]"CTnF9‰œ‘‚k …*9 ‚é».M£ŽÜŒ5XÀG5¥[¸‚ád7súÇ>¾åº—Ðä¬4<Š\&2®Ù­öŸLëZ‡@· -"tˆüÐb´µî }Û¥•Üoö(—[~‹ÁÑ&yÜåñ/U5ô½òžUߨ…G*7x^é h‹Yf=ËUóæ˜Qã› 3–"ƒö%ºJˆ·4ð=Ö›5õIª{1•:ΞFFnº–&6n¦æ9PôQtuš…]5«&¯Ì©ˬÍx2ñå?`Za¾Ù!18ÈÕš*Rj µåÏj²¨~'¡óuôZ]Õ+ÀÍlŠGƒbÆuúàÍldpífº]®é6(f;ˆ›ëhoBL‘< ÝkgzÙ¸¹8‘8w;ö˜s‰RwšÕ|-è²›kÕÜÑ6l ºi¡Ç ´ï¢G bF$¦¨EÉ.Æf§±’& Q8»¡$_Ý º¶}„œ—Áª'Â7¦¨±»Iššb~¿ç}œ ÷x²•!)çpRν´AÙµÛ«FA3¬àݹˀÃYN­¤–ñ•Ùá–a $< @¸aC3'öÈRŽTeõ"vúI¸ºjk*—8Tô*'ðQ²7‹ïÒæ™ô´×µD½-]½|¶æ„fEh<]¬ŒÂ[Ì‘|}¾»ÿ¨+¼ËýÛp¼8ÎãVû¤²úì Bm­Ñ>3b®J5{QŒîÏ“PF•Ò$$ºÁò‹‚’Bæ5«@qÆ^-b«œ~ø<ÝHa ^ ö3gáõúPq€cØ1®š*¦)™õʶÎý K°ñ²öQOAž7oâϰ~Gôê1B˜¶¦oÜ<ˆØ·…ŒüäÌ,¿àa+>š¹ÙmÀž×šø×ì2ÜCä6@󢋿AÖF—ê¾#“èï²Ç—@‹Ä)Bè¿|Ö›‘§ó~åÌì’«›C;]¶–Žß‘9™A¥ä‚?‘Í·ñÊ×§îbˆwÍÛŸÙh¸CA§Ž7n)n6ÈßÏk pÕ Ý®ÆŠ6‘w5ŸæÝ ŒѲKò;[„ÝÂY‹ÛÃ؇ƭéð³&ÕjÂn$òÎEÚí2æ´u©…Û~â«—6÷¦™ªsl3èñr½2 Ô7XÒÍ¥ýO\Õ-¯eˆòlæF•Ë ‡'Øn*)Wu2L°ý·™öì'5}öÙ¾æ£e´6R†—dÀgi¿Éÿu'õʼnQ2WjÔ äì'ÂÓ÷^˜lp‹¥~õy㾕±eœ§.°•ÝÍ„¢ß¸¸µ¤6Xww¯2÷Éâ ¬®ú7!º8/˜¯-¸ZÛ ƒ{#å?’¢²༚½ãÎýbCQ-¿.VSF˜G~­ÜV½¯Sö¦Œy-}2ù¸e+—Ë ¨×!¹¡ÚeuFko@XàŠ˜†}¥2It”Ÿ¹u´ïiÛ4ÙY³Ï4¬4à]¸T2ÅhQ›a¹°ÄË|™¸RMê(Óv"(¥u"‘VfÝ´ÑÏUº»c&e«HÒ>Q+|ÉnžT 0 Ëb xjiÃmVÔQKS’ ×”¾’Íš C:˜ø–PÇì–‡6ƒ¤“í}±ú.˜*»S(©ÄNtYë¤U¾Á ÉXœË¤‹ñ€ûgR÷ÁÇ>Þ<:—›¯µçÓ\ËuÍs·ÂV~AŸÞ¡Z©_*,Bî¿QºÆXðk /7¼…_ešŠ|¢GãGêº|¼;—p•Αj ;m®b÷‹N~+ÔnÍ1 ¿»ùYQÇwÀoçâ’uß3$8½_äØƒº\jäVd—«6> gE³KÁY”!˜ f'–!T<^•k!ÖL¾­î”Õw±˜§èÒ–­}­U­HÉÆ#6ŒyqmË…µ·ÑòEŸŽ/a§4;ët¿¤ËÖŠg %C†©ËN`RÜ»Š¿ÿ( ïí1•Mç3§"IÖœõ3¶Õk] ÑP'Eë@Wq¬ô>|ÈÌâýH!Hú2‡á+RBJ÷rÿø·6"g% “ «ÿÞáM„–*<=o2±Î¦ÞYI wiá)`r0ÔH\å…kÜc@ {3Njè@Yo×(–ÛÓÛ17¿Œ€°#‘Å@vp“>‚¼×Äž×/H£“|úÕƒ/\U£TrëT³2/ûfÚ±|z©žðsÙ4¼«Zƒ†ƹØõ\£~×LÓ+¹=ùetqJ„ù¹¡ƒå‰®¤žòžsþÈÏ] d\©ŽÂ_ªÐ©™×´gòjzûÂRL§Ur«Òg’lBOçº>î8ýšžÄB!©t€ü¢cŸ‘)‚Òá¸=z0©±Û]º¯ZûJ ·Š§ß,¥Ý‘®+ì£2SƒÙŸ¢÷n5x\Íà—¡i©ywzXòæƒJ”È­ím¬k{w_Aé-MY$Á͹k"DWš‘µ|zŸ„ê…~†ÍbÀqì«ÄZí»¿ArÃoB-v¯‚à›£Ò_¿Ækðô'— ^Ì̾ŠâK‰{ÿ¬Þ†—‡ÂÌïkm#Ï¿êwÚâP˜ÿA³¶áŷ䜰›tv]vwÅMÆhTEŽ~6E\Ã^,s'»¿óØgŽ÷TCÚc9þz±&­æMsì”ó”d¤SGº™€åùÊ‹GÅ_Ã'óñ‘3â¶d=T.T#rKê6KÕ T:nÑÜ;™x°£´Dðîîn[vý;êÂk°q Rœ ß±£ÚÁVhIömÛw}æTZ% f©qMcïqfÁ€úe=^Yí‚ @À]•…2”ÿ­d"a_'q÷[,î`𙬀¤õb#Jš®Ð¥HEV GÁ¹–¹(zâåÊØÓQ{á"ÇD®%8>o)Xœ/dàXè1*kÔ{Ô t¾öøOï 8Ç^{ ÿò)VlîÌh‘플eBt­UU CªŽ"aýûu¹¼Qד;óñès킘¡€˜·|¸R#J†¿ÔüëÈ^ãú¾£S-U­vj•ï~ÅÕ¡:õèewûì ¤¸‘™x§žìÍ{šò€o iM§ç®Ÿ&E±°¾’ÝJó‚NÄHGÄ_k®}Šrs!Ä qÃÄ1|z|Y7Žˆø¶?[ gθ:÷lï`†ÛûzÙKžªyhf©1Á-rå>~)¼TÇêã})P™€%6¥¹w¯gÕñ½œ˜šëNtÃŒAJ㢧Qj¬!ÒWˆ)Øò²Ã6N­#5ËäáÑjB ´b½Ày=‹ªÔèŸ[QÊ×I$„™Ç^4ps4•"¤îF¸å!ÞQÝ·†qfTˆÃ/Ç=Z3”¸§ŸÍWX'pÕ…`ú¶l×[ÏÃÌ÷¿×¼krž•”†ÝëG”?ìFúE}]²ƒT?j"ÒhN¦kŸ;*/&g?+Öê'A˜±ËcÁ꣖>9ßYÿ´»O jãÖèé”çílÈÄ}Æ XÂ|Ÿí—gI'{ц->g¾ë£ZÛîº×I›ûD‰‹\…‘Úê)EiËì•ÃÈ,üm,kÄKDÕ¤çKxµ×j´`Ön9önb¤øÓ!Ó¬Go$ƒ zm##ôj‹ EÚØ«žbÔ0w)´a ×Ýò3?—;†SÓD¦U`A0~Úç¥Zê>Oyî5Jær<-[×›d^Êõ½5&4­Œ¶l ÃkÌ%Ž uâ„^ ŒîÉVv÷ÉÍ\)â0½á•¹ãÎ 9iff¨ö%àØ”Ê²½}¯¿EO­ÛÞw*‹/©M´ÒßhøA†çˆ# Ä‹K´ÆÈ9m³] Øó'ÔïŒý!“2´ï2,òøYâ_ÆÂÁ8§,@óf¹‡¹jŒZóc—Ì}^Cxˆb¾"£;ÀMU$ ð¥Ï†ÙÚ28%FųvQ¤›ãfÎZ…iºÇ¤ßë»ÊðdÎSã¹/¯:ª.ÍHj¹ƒü)aÊ£*æ(¶óÌÖ\´7VÁÝ{5ÙÉ«þ³,Ë€Qy(_žp½ ¬N1-ØÖé3"µw_¬|Yˆ×îlÄ1ñ½‹gS¬lG˜`ÝŠJí ¶ÃuŸžIJ¡-dt5aÈebUœN+ ^/yßeìê·7 ‰§…O]öÅ÷¾­ü\ƒóZå$<ÖqØðIY„Û3¨Î3õ16Šj³äºËZå¬ó"òƒÛvgã¾*F¼ŸØÂï]Eg¹¬RŒZFöjc«S²Ð‘)/ú>ŠÚ—d‚“ð©‚‚pwº±!Ò"Ë¡;KõŸÀpdBâT¥>ÚbHˆëN¸÷„jr¹ÜÍÜAdnÌr³é„Ó_Eº ·vF°Jdá[ù`ã kˆÂ0°ë\̸r0í"±%ϹHMxE4W…Jêüõ£Ö†6wø¬L~:! {–‡Õî8ë´gØþ‰TÎé½¢4Î>S`c˜sNÅ_;RrÊaq­Ï U‰‰^—®“§V˜Ï ¾.{"ùlÕ²ohU:ý{E”ŒÀè%¾ÔvÖ/w‡_Ý„ìðã\#Þ¨2rèú‘V¨‹¤M%c­<vÙ²Zòö±.Ô©>¹½í‹”…H’®üœÙC[Å;æ­Héz F<åWw/`ä/c˜F‹’ 5v&UÏG3|1Z½Q3›Û@‚áø€=-+ CG;Bœ¾ øì §ÒüÜ«å e£²êN ¯Ë¡©îÇTzŒÜÝÑ’pì¨äT¡‘-8wCø(¸È6²E-…S½|Fl.55Þ$Ò«ôì¢NjRXØsóùÑÓƒ&k ;l ~ûóÆê`úÂqšá¤ïA,2²ñ ?BZ± ,> ÇÙ#j[¢ÖˆEÐ3k“Ӝ们¿t6£"5çÉekqû ?­÷XuK7 Üh˜ÉìÊöévµ²(ê0µ•Q°oŒ9 :q`†öB…_NÔ¾xmJlÞšßëÿ|é”'☔N[®šõ´Gæë;µðq}ô€ÿ3ÎÌ£µ–XHzh.£Æußæ·Ñ<ËñOôCK¼,Wò¿Ò­¦Â¥å|ßîÑõç³"Œ*_a*êTút?àç Ù†`½ó¶§ñNh(„Vý0ÜÃtƒޏ%_+€ ƒws½ŠðÕ#ߟ(â¥&¯“;àbtÚ®ÌÆ­Ü8ÑëÀù9ß³ÐÀµÂ¬n㺴pÓ¬1£Ž÷Ž'€ÙÏ$Ë‹Ÿ9Õ ¡óx†]tX&6õàRgˆ_ÏíÌ[Â08Ÿf§”–Puä{”ÇB7’ýkÂU–ׯg—U¼ë¹òúBKz5òÐb“´§³ÔÕV²'™ „%dŠU-7Ö(!:uJh€‰|jo`šÍ¿BÄL(ìL‚#¥‹éíÛg˜x£n[¿è]ûHƒ_ ›aÇ bC_X½„cRPpEéî5ÿH&gûD!Ïw0 3'Ð’+¸â…JÙYÂß&œæ)®>|&äJÚ¡ƒÇOP|7$<ƒX‰Ý0¸—¥UBµ !ïeºú1€„„:u'ÄíxãVpéÄžYS¢Þ«¼ð<£¼ì}ß­¯ìB»—³ôpÔ#ãL^ºøÍĸi uµµEÚ¼À>qÙ èûb“lŽcØ÷Âzfëì™"Å6/ýíÙ-“/£ ,„¾zpWá–¶,­­R(öêuωÙCfý´ÃP ÁCÿ‚¾=òU¥ÊlË„PÿB‰‘rÑùHE¦jÎûíûyY‹½kžœJH|ÔÐÂ3j[»DXI€QIÅUVΞœÖÝÐzD°2õZÆ}®´Mr"Ó¯+s½Ç½„ï @JÔîö¨ ÄžÃé@yÅW±Û!­nwI­{±ÈúnáV#ij+ß ‡•AÞª®–櫟D]äJ3<Ý{ß(Ëô2÷Û4b¥åLW!¼ßŸŒÙvU]Ï85BRã„75?l4vŸ7@.ÕÆ}ƒ„¼^t„ò«ì¦Æ<Ùø|aùî{Å6–½TÊD"æ¸çáY)ß =:ÆBúR„‘s®T¥·7?Š4ÞxÏè”9°…Z”Œ¡L¿'èI4q¯öÊP©äò]"† d’Œ}⛎³ïÑ–§¬j-m¾øØØÂl9»´v¸…)íù¦døœåýËšÅìÈŸ-Aƒn16øÙ‚Õ /mûž{€_JІ‡Èd\?–ÞŒ1-ËË’LÚ ¾+®e†ñ ­‡§ò|ÿjU Q @ð©l®æ˜ž;i>${_J1Èï7‹ŒóÃö̲'òBv&Kòó4€ê}攽Cê"¶ûÅg2Ø ò„ÚÏÜ•²"¦쪱—Î,Î|A …˜:ù‹-oô»Ì>,ÍyùQiÍ›‰ÓoµJr+Ø BÏ æoƒ¯'? °²¨T#,ì€f†úªÒŠP¢/òšíèÍÝ]X„[wðŸpªVçòDt xo›ó'‹&–U.-- ïnFØžÆò$Pï>N}°œ¤åÞøVÝn9‚4ZÁã¨ÐNyˆ­{A¨µŒŠà~zƒ¹zsÏ)Ø"¦î u¦2 Q¾*n‘O=?sKPðZM§ãF5ã"÷kö³6âŽÆÏíǵ‹q£‡'ËûŽCäèû˜›µVF—<\3¼/³A’š<P?N,à•zÚ¿;xlÓ…ºÖ£IõY§œch˜PË $‰–6îk ‘zªvMTDS³Ø“„q•­áÒdÔP˜ )pýê9ÛõN±\JÊõMÞ{š±£mƸ ÂaŸ:Ì'Ó4ž™;¬ed¬©'†q§E^Ÿ²†æéÚ5|ç2–ªc(tÉê—~ϼPÜ ÿžä›(:À$þ¦F¹X2Lj)³ÌƒÒƒÆÿ)äJ endstream endobj 63 0 obj << /Length1 2241 /Length2 15353 /Length3 0 /Length 16699 /Filter /FlateDecode >> stream xÚ÷PÚÒ ãîÁu ¸»ww÷‡ÁÝ=Ü-H$¸»»»»,,Àãœ+9÷ûÿª÷ŠªaVëêÞÝ{×P‘«¨3‰šƒMAR`W&6fV~€¸¢†+€••ƒ™••‰ŠJÃÚÕô9•ÈÙÅìÀÿ qgÐõM&t}3T;äÜìl6n~6~VV;++ß ÁÎü  »µ9@‘ v¹ Q‰ƒ½œ­-­\ßòüç+€ÖŒÀÆÇÇÃø·;@Ôälmt(]­@öoÍ€vu°™5ÈÕëBÐ X¹º:ò³°xxx0í]˜ÁΖBtŒkW+€Èäì2üU2@ húwiÌHT +k—)ÔÁ®@gàM`gmrpysqs09Þ²ÔeÊŽ ‡+üË€ðïæØ˜ÙþîßÞ²vøÛhf¶w:xY;X,¬í@e)fWOWFÐÁü/C  øÍè´¶š¾üMUß*üw}.fÎÖŽ®.Ì.ÖvÕÈòW˜·6K:˜‹ƒííA®.Hñ“°v™½õÝ‹å߇këöpðù²°v0·ø« s7GMk'7¬Ä¿mÞDHd– W+++/;äyšY±ü•@ÃËô·’í/ñ[ ~>Ž`G€Å[ ?k ÐÛ?$ ;àêìòóù§âÀÜÚÌ` ²´v@úýM ²ø~;gkO€>ëÛø±Xÿúûï7÷ 3;Øyý1ÿûˆYUÔDeþ]ò•bb`O€'€‰ƒÀÅÁàæãøýo õ¿YüÃSÖÁ àûÙ·.ý‡°û¿'€ößëAøßXJà·¹hÿŒ¹+«ÙÛÛÿçaÿÛåÿߌÿåÿuÌÿ/#)7;»¿õ´ÿ2øÿÑí­í¼þmñ6·n®o; ~Û‡ÿkª ú×â*‚Ì­Ýìÿ¯VÖø¶ ¢–vÿm¤µ‹”µ'È\ÅÚÕÌêïÙø—Xó¯=³³v©€]¬ÿºYLl¬¬ÿG÷¶\f¶o·‡ËÛHþ­½íÎÿf”t0›ÿµdì\Ü ³3Ð ‰õm’ع¸>loÛhòü{ˆ,Ì`×7À[u~ °3Ò_GÊÍ`ýKô/Ä `ûƒx,â/€Eââ°Hþñ°X¤þ ·( Ð[Å?è-ŠÒ/;€Eíâ°¨ÿAœ?è§æß[>½?è-ð¿ˆó-&Ðåí­]lÿÐ} týãñÆÂôb{CÎ@3[ÐÛ+`ñ+ŽÿÊÿ5ÆÿU¼oö_ÄõÌ l÷v‚ÿ¥Àù—ÄÞþ©¿Ž–Åü¿ã­Cæ`;; ó?,ÞX€þþ 9¹½-ă·Â,þdý Ýþà®å?à «?”Þúgååhrø‡Å›Ìúð”Í?à[Y²s¿ñ·ûkÿèßš`ÿ¾Ý8,ÿˆývDZ€ÿd³}{ÿ¡~cïøGýæëøö9üOû9Ùþ-ýßæs¾Ñt|;]°ù?½•îô§»o•;¹]Aæ¦ÿhÛ›ôÝb{+þO5œo#äbt±ú‡Á[ž?Yß®.W+gПÞ6’ÅÕü‡·nÿ€oýsÿÙßÌ=ÿ†ÿ³¿fnÎoºþ}ž-÷ðß/&ä 2CZ^›}µ© m»¯%ò`ÚŸœ¥Ú×N§còYvnw{DƒO¡«ÌÞtþ%š2܃±¶+I{+²BöìsÚ\Ñ’¤ÚúäûÛ8Amz¿ii w`²ðT´¶Ÿ‘˜ICäÀ÷ÙÉW+Ⱥ²SŽ*ÏÉM¥àݽGŸ´gméêXøÂ¾êA%·<òïÒ¦ÍOAÅsTù¦9óøp®L$ôX—žès·¿f±r'_ÉäüÎb8¾úèm±Ç>Ì{¯—k°»tPèá“@ßbMSûˆ¥Êá-ú”}Ú\üÌJÇ ±9ÖOæ;ÚIþƒ__A ÕÎy™OzŒÒ¯µ–%H§1{_ÝÄ‘¾ÆñmŸÁÂÃCJº@¹©¨Ïè`(ñ.Ò™Á\Ñ=^ÉËç`{æV÷ôVþôGͤ¾÷ˆ¾Å"ÒÎZ£ØºÄs„“¶"ñÍo—o¡MÖ7ÊjŸ^›É3ÇYÏOõö2És74$øÂ” tŒw…™ âÖ0¿¿Ž„ÍÎÞiàí‚ ³ñóDLÞʨ YýºÃAŒÑÉý€GÜð¬bã,½§}Ó<îî÷4ì1¡³5TfçýwåñŽ>¬]¾Ü"e‡¹Ç9 OX*;¬|'§˜ï‹ÕDa6†«äç í³í~­Qk¯âE¯ú6\>ÛKõ®_”‘äÔ¥u­Ìg sÄKÉûËâ†åÁÕà]S|RVA‹bþ»ÿIf„Á:\§úó¿šÄûÏØ6ýº:·’‹nedm_¸[WãÅdÛŠ¶ó£Ô¸¿¿åñ8ª¶Çp²šAÊdÌÍs^ºéŸ¡zè¶÷¦f~ÞÏaoÓwšI]ùò©.[Øê&#ªÉ4{û…~™Š2É|à«I%@% %,ë#EpÞÕ7ºØo¾šÓßN?YàÁ=”½“¨/t½Ç˜3Oë)Î,ÏÊæÿÙÀ@ÔPxnÃÓMuj-òš†»ón“Žr:rTƒbÊ)’PsmJê¸ú.¾™-ÙUr2x¦q½@uº  ÷K”‘šp*SNJÎuO‘n(¼Q6ùÓ'(z6K»Cö®|N–¢¼Ü&ŽN‘²ƒ*ïU ÷É4ñ1ÝÇF歌˟AÑ’žÁº4-C¥w'\‘Rf‚6ì;íóp fØGñl(1¿ïÇŽ8Mse #²£º½šjøcÇöP-ò¿­D'íŸ\=•XXžQu:æ? X_‘)“ÒÒø|‹›¯Eó({Q?PeÑðJ¼^NíÔ²ONtø‘ÞIUŠÍ—€gcZ~¼3‚ éN;×+Ê…C>]~¥I‰¯GƒTö™–JÿØ ÜÎÒ zºŸüÀµž]¨b/:7ħµ8â½>ò%1Ë —,ß„ÃH )Wʼnš°ªj·û¤<ÁðNM-«Tü«8ŒQ%×3ßûÑÛ Âƒb§”‡kƒt'"‰5üÅ´Ú4ŒÐ/býÒ¥(LΉcùá)ó¸ºÖ0è¡bŒ¶9Ð%‡Ôe’YnW­Ëº[ßL.„0§LH!êhS*fiàì3IåiÐåwfQi„r1³%·T”ù|¢Ô9¤ÙÕÐD¸ r·„™.çpubhWn¤p™¬Ò{aït‰r¯Ÿì‚¥%cËJß5Ç‹M**nv2ùªáöŒ±å,gL=ÈwÒPÆÚ\ú‚F4f’!*$º Mƒ‡ùµÈ ¬ò=Z“L^ ¿ÁÀ¢Ùï1Ù²2‚ëAÑЈ“-sù²Ûk(ÀlO¼Ž½ëÍ3ÁZÿµ°”økq@SB깉F+S¦ËÖ|ð«ìcžfçty Ë™ò#¬• õ±O(-¾|??³ø™õ¸<_A§§L?Ó;÷ÉßsœžÆ\¤‘ûqyË-¿£2ûo>›ïØqÑ˜Žš®;1¦Êüb('Uñöo#*)9ÜéõI_ÃÂ;¹“6V/(&CuÜt[>Ï™³@C1ÃøÓ÷µ§bm·t t‚°ïGë‘ØÎküÀèòg´©>¢„S.Š»$&ÂL”Ïõ£~¾X×ÙXX%F3+Å´O+l:¿—Dmâɵ`~†Ør ž PgéæŸY“.{ü õÅ+ÁÏ w¯ŒVyïJÁToÄ›H…ìÈÁ+“w•½xäö~‘d¦ãý"šíjÂ6>Y>IFø^âmr@îûP¤ÿ>n~¨‰OÇì*Klå”°øIJÏ çtØRX)tª„3¨‰ØÏ1@6·ÅƒÞȧìÚ ÏásÉåÌ ý³Ùq`éåi‰~3E;ØIB¡¿½-Ögí‡I vÒ¹G2‘ïb(ª´Ü«7Kcö‘ M‡eèÇeˆŒ%ʼnBޘ­ظ=Œ±ÈXÈBžMŸJÇ ÌÞ;-:ªwXÛG¶#k!¡gàÂßâ~œBz¯ÎCU>­ÎxÝšz¯|’¥¹ sÒß·Ý8ùV„¶LÀNã,Á…ÛþÇhž;©qêa¾Ù|d‹åÂ]:WÌnCbžÒ¦’¿™=´?<…e€»ñ¾Š)ØÚÊ×ûÀóY XZþf„´;ö-£n# œÁGSÒ™£üõ‘¤ÓýýZƒÐæ™ÙqÀxo|M#v„C“úTÆÛ§ÌÃ"í²ø’åW­5”oéJnp |¯+èœ<˜Ñ^Òè´Ó=/››¨%A¨=]QÞ#;h`åãdßr3½bo±Âƒ‘F½@Q²õއ-àgê>‘©pü¡ÅN äë0¼nWØÅyöÞÇc"K±:;˜wË1|šÏR'r•ÂXúކ=È+°#ŽVŸ–ºó&ºK®Â5¡x'瓼ó7:Â…k¡’ð~ó“ÊGø~û˜¯ýJ5¦“z C¹Ág:Ìç¸['edž)6Aº §F ɭϤAÿƒ“<;fÚK„F±þ™¹¡òLjâ»2Ñ÷ ÄŸ(`„Awi/:ÅÔ‰j}’ƒ§È†%ì 'á}Ü0(WÂVt¼Ôc8,b@ ‹_©Iäx-¬‘õ—®ŠýÑÐ:¬Þíl›”Ü”8~OAÚ›l6ûÖ;<܇ϔœÕ ȪºZÀá7…}F÷‰| 7Õ#p3ÿúµà•I½dÝh í®úÈè8+sRge,Û²ùntÈûŸ#²pãZU ñ°Ú‡ë¯šqÕ ;_R~¥´ÈB3&S gå$ýÚ5Ëœú½Èë»¶*=ùycýÂàC‹ ’ÃÀ6œ{äf¥'™Îv¹0ÿÎ6fsê>®ë{ÒÞ-\aªæé»ËÐ(õN¾wf.h"Ì0²iE—ö(q†mÃô†Úw¦Êí~ëíV/b‚ÝhíYg6°n⼊EíÜuHŒŠ&{v‡G·Òl,„‰„ʦ~¢n{¿¯KyfBWØSq;݇¿È…{Þ™‚iˆ|¯†e8%%û]ÃÖó2ËÆÒô³L’93-?R÷ÎEY61ó§)¨4ªBG§ÎÒ!Ü€r!£coOÆ£Äq3Cç¬nð÷ÆðúæÛü¡rW™$5ñçÉE@Šò‡)§ CÞJl¯¦F±H°‚3j  EWC9% @ê¾ßþ6„ê> ë±ôÑÕÜ¥7KRÉÛ¬¡5³ø)˜KÚ<`©§é3pÂM2g^FŒµkhêâMÓ9Ä¿? Ô­+ÍâÄg@z†*ârÛ”#Õ¸~¬H’‰Ää-ÑÝnÄuhz75éó»š)½íþá³ë댟Êï³d×>œ‚b9ÏÚÞÅ¡Y5âÕmf<Ÿ·õW}œH"²úâªãfŽîȸßa<=óÎÁáJrdõ'/Ñ“×ÏyR¶å5ȵ°×Ê6ií„ß7WêàµA„óS.ßçµÒ¢éJïÓSvoÁ—Ê]éj]fñÖu±u?Ù¿—S`Ã~§X7$üŽ¢?Ë´xLµø¢£Ù¬qj6×¹®½YÀÒÎ?æ"-K·R~R0H}ÿÊðÔI$²0Оk^Æe+øév gà„åz§%zÌV‹xÝíÀr/ ù9?záÆÓ.e*y_䡲ÓXYv³™‡ k’Å'ÞÆÛ‹ÉÜyßÕ‚(¿}Œì‹Gnszáê>tq¶ë®N=çÛ.M.!‘·Aó©iý×Y3[Sÿ ˆ%$ÖüêžÞû¢qo¢]ÙÙ òPT¦hµRÊYƯ¤Á%g,yGb…g;AÔ’ép¼Ýµƒ¿=4ï²Ï8Ó–Vú³·¬‹"tM6›éAK†º 1N7Š …ô9þ-D]Þk-^AšâS"áiº_‰r% [F7íÝrÂ'¸Ÿü” $™5Lëõ0ç›ý319¢´ êÎ òàêˆ8ÕŽ)âHp k¦êO.·ÑÐP¿ÃåÒbµ»©;qš}µõhBO¦d‡E"&xÌ•{¿Œ„:iG‡® *×*ð>ó»àQÁ»“ÒS( ŒÁ‘¦{/îØð)ÉÀ¦pÅXͯ£3$E=ì)šÎát3VZ*;Ððâ ÿ*­øNŽG(9Nóä%Œ ±ž=@Cð¨7°;$.™-ÿÅó@‘?a¨1#’J¡J”ìá8a“…“4o¥ÃvWûæ¶d ¶Î¨È ]`’öâgÀc7—tr(ˆÃ88a„LDfŒhžÆ`W¦AáCjÍ]eì¼Š[Žo—z˜\j²iÉ’áÙš_¥4ýc`V“]øÚRü[5¨ û½#’Ÿ®,¼¼~ðC$cÇìhú…šÊ¼Š­µÀ¶ä~Ra<êÖ©I¤ë„rd¢Ê@¦ÝXÜ/ zV äqRª!±•ý<¥<”aXÖä4G‚×/ —uÉ:uÕ¨+É@%¸}!`–sçbÒ¼ÁƒyGiZwò¡{%v-ÔIK6§OÂB¡ÑLPÅêÕ¥lU'—ä%snÊÞ>:0sõƒdE¥ÂIŸa¶Œo…zROUuD#àýíP'|gñåý(I]ñþaUWëz©Ý!Úm ÑCÆ.`è®ä:T ÷!êàTxÞÝIΈ ¦«a‰‘·W퇫‘¯LŸˆ ŽÌ-›„²ÀÉš³Ì-j{¹Ô)2fpMfËg§]@óÙ,¹¿Ø5 Y¬ÊK(+ñV¡Wý–¦¾¨¶oNOvh§ôo)ÎôÍpÄ7l(v7ãþbh|bÖM|ޝÆö½‚Ð,G›ªW7µn7;HW4²ˆJ0­;ÂÃïœlJ¯2èFbO3gk>7ä‹b N“L9ì´~㦖™Jç[°w†õíåq®Áú)ý@Åq-çüÒ °A[f)mÔÓWWë_é©r g(¿³1G€×½¥û¨&1šDqß”L‰-lÑÈCš¶’¹é‡Ùœ¨3º>Š<äøM³Ã òå¹õÏõ¼ç“êH\€I¤`»!]¤'[ï"XA ñ)¹b$†ñ·ºY›¸ŒïÉz ™éù6tcÃRŠéO“ZG-‚.Cg(î žj¶:>røŠ&xKmërþÒ†_R'–I—Û.þ|LçÿŠM•]lªß‰©,Ü{Õÿ'WÍ#b³yP²‚ë‹0Ågí}ßÀóße¹Ïc ’u h Ì£Žän\üØ?ø¨ŠÒyʸÂëlÅâXs¸}RÃâ€ÒÈrâJ0õ%õ?}L8fêâ!0õ ÊÍ üª 3§Ì}øÄ‚AeÂO69wÕU×Y—PBÚ‰sÅkùI’òVš1åuLÑÄËOú¤(oD˜Î,q vãgjæ+϶<29¯ØH{¬ä0ó ø–t·~Þ-ÒI¾1T]xœUO ”¤íZÑè3Xj{á"U@'Ò’G5òÜj d@$GëØ°—nvñ²då*®£ e;.úaPš(—m@QwÁ“Õhü4?ç~µ :ªÏ'CTkµu·£ô­°¾;cur¼lGRõ„˜vïÊ<ªFÖf¸{_fõ‡\‚"—¯8ãLJÇ@ßLïÒ[„Ë´h*ž—8¤(=ôÛ㸈ƒù­þÑŠûââ7¿'ß²ÎP8g¹dM¨‹?€ì™ñAyÒŸ{š3 g*b£¬âRHÞPÄÄ”ezÁO–=‡`‹0Ÿ%ÇwN!ö¾0Ùo»Ù`Fß*† ÉPR³&¥í`®è7©¦ë–aªÝ\ážyh&ll©hË¥î¯cï—äÖ†ÌXä…Cûãmþîšû½T:ɘ‹‘Wž¾ki;l%Éû®Q:=wÉ©ÄbâWŒ~8±sÌÎn ]òè:ŠHË¢ß'²ëûA¼hÂè̽;¯s‹ªÝÄÕ&¡Œûë£êÙG]“’C9c±Ê-R«â9§«ãw¼(䆙¯'‰:éû:ïÊ/³L;“‹å Ò€>¦`ù,Ù‡iÍPp‘Ǽ%É5Gb÷|Œo‚Z‡‰0æeÍã7ôHõǰ삖Aüª¡õ‚†åPtŒ¾ñ¦^½ñ™M8ñ÷//É\…•%4J¼芑Tð ’üF(B¡›fK/¾l'‹S3·ËÀÁ˜nh“Ö¶ûчCôM¥Ë³©ŽZ ?3ãõ´0ÎZ}4-ïÈ›?XßIyò(´3mX—(kçþÝKåfù·ù§Y}Rè`WÌïi½ÓVf_ùR+uPÔyϰ|rÐæstËå8mq\š/i(²\3Ÿ#xèBé6í©£´ÇTçPwx’è*j-6…/þLOh `Žìj{µDbHf=Óï ¡Wá)Žü æç!®¼µ!´ÏJ‡F)%¯§)‚éÄæhöÄî#Ðwœï•ÁœÌ#8uˆ_7ÊpiæÏ5JSôéå“LêoÄž&†ã^ÛuXÑ~Z«í²ŠÈ‘è׃tào8©$ú<í;ô$ÕÚeû:==ÆáÔI5ËêÚp~¼Æ¬ß÷—P•"hÌkþlž¤ÕV¥LþöCÉp|Äã>#…þ+S²ÃD×s£œŽÙ·ÖwpX¿…+¥•”èõƒBh-P~RIÉ!}EžêfÐ<#o^¦‘Œ—íÊ\Ô£™ŸÕÚXéhWt„+Ü„Ï(E㯩CN 0—ý"“„ñŽ™|EÀÍ|'”y`Æe“õM2èL£o«Aßbaª00I©BƒÜh|„ž;I,Ï«Ž`¢xøâ0éÙj¦Š Õ[¤M#²Š2cã¡È‰à¢ßøÐÍwL59ÒËœž ¨Ep)I¯§œˆ’ŒóK CôÉe‹…P£N *@–l¨×Ýr-<#Àv’³¡ÇͩģÊaø*Ç Ñ¶åµv\œ<í÷„ÞÐ4ïò–ÏIÕ¹±Å.Zë@;4×PO‘VÑ ?xC ==&O~r‘D€=þ mTî9q$Ü2°ðÉOfÄfï.užQiô!ZOÿ }õKÝcF8:8,F¹ÉÖ6;\0¨Ô‘–C[8eÉ3}) >%»Ä0в°çŒi=³hvžF½Š›À*;õüzäþâPU[0ù‰üÂb[Ì$²¬ç“®/f‚JïБî)"?ü*{‘˜:{SÏg!pr2„[rÖ@‚±dï‘Ø¤x3©˜<3g}®ôl)ëšÖ¤.Ûùuu/¿ÂT ·[~ÛhÕ1‡óãc‚Öé|^“clü$ÿý¾Å(úš±1™qöú¤R­¡”‡¹…±N€1;8…G‹XD1 YWá]ÚØ1UÝ!ñYE‹ô[åoð’½3Wœzÿ6 ’ÑÎYa!x-yŽoÀ¢JŸá:¹‘ãµ×‘¶ªƒ&ËâŽwrÅßï¾®—³%ïÑöñÕØ.c* Ýàùc6æ»°QõmÆmx¿Ê#z–›øˆÝº»Èß»‰ ¸$èãš øŸà §ž`~ʸí:{÷¸0É¿¯@8P(õ_0ªR‰¦ Cð~]%è56=¤:€Š‡åâöRÉC%²Ò±,~ê‘Ü)£·Æ2¼®i¦ ès¦ô(‡¦‹b7ýŠ¢f·Aã¤Ô¶ÂæLˆW»TœëfºÅ•ö²úa™f&ý”cyyY9¾â• TÛé½›“Rï¸l^¾K{[—Õ^a×굞%sôãj:9<%zÉ zçáNÀqÃÇfå¿hìQ7(ÆØ¨WÈ-ÏÑ7<צõ<kGȽ*SÈxdU÷&7WØO¤èÚx—AãX‡ðKr2À¡ùm¤HÔ£ª qÿBµfhZ’ó]TQҫוƒú† Š6†5}Éi4tò”›d• 6Ä )ïwIí¢»%Ï­£WWôi8¨£.&ÒÖZøâ~àomÀ4æ©“q' ˆκ`>ZëýŽ–-:,;1îõ¯¿Å@RÒÕä]\úpS%*)|(Fù1,éÎU_ÜoƒÀ“‰±ZTÚH5õ€²a¤©ec‚•óiº¹ÒÑÓ·õóÓÙµ¹ÚÊ6¶^Š:õ°ëmÿKP–:‡Kt¡‡#ØÁ} KË6À€à«áLŽli ‡FûÂ|ˆ¨KïøGÜš~Ü=8%)›"9Vá9‘×k„…E¶>?Sʾ§#}™TÆP…²Æ.´{# ì¯E2{íÊß-V ˜ù2œqËTïxñ¾š=YÐúM]5øà¿þ§NŠp°=ÎÒÚd¯¡s‹æÙÊ‹rÛônÆÜdÓ‘²FC—úFpƒ­y1Ô6Á3ê,ã‰kãRP1Âóms8ð¼Õ§ïx.ô¥XQ+š.FªîuQy>FÒdí·œì+Xð®úVú|z;•J÷u=çvá£,³Ãˆ…Ü`ÎéL±Š# Y"ˆ,s-Y€e< œZp´Ç˜$è¸*-¥"ìc¨»6op¶IÚã#üî×Y]ÉC¥îxñ“Ýj´÷õïÚ”/ Ý5ç§•ép ‰W›ÜD¬ÛõUV¡½BN§Èô!ôÐ¥§ƒl Îá8.0.1/¥Ÿðä€442î}o`—fÑ1êäJ†þ½ôógÑšç^.wñJ Ó÷Lˆi¦´÷® “A9ÉeÙî1«4Ž\y~2¢Œò^ÐSAßUQ}šµwaîNž&å$?|¿Ád §l/ôÚ &#ÞS![.ûizëœã¬y'jW*‰‚zéÀ‡äœ¦µ#u§Áq%*ê[„¨ñ™a«i` UÚ7u©þS á‚ï¢¿ÊÆ}(RúPŸÜ—ã0¿SºŠ“$ ¾‰V)P…ãÝìâPuJu†aPB×”¹,UÑ”™©d*ðX0i9ž#FÁЬÊᲟõ㽡‰hü;_ÝõqV•£b$”q3‡¿=ñÖT¯‘¥Ìn»~2ÍqJés½FX„ØèþŸë£ô ^ãÝuëlÕCFÓ'˜K¢©ská6*/]$%*øª=ÎXù15íaƒÝ<ù§p ™úöY,U<fê«¶º5r’Á-íÆÒ©¹eöx§¯·Þl!ì¹¨í³¾§éQnMÏ{;µ»Sú¶ÞyƒÄìÛ•|?šWiUEѾ3¼u¦¥®¬¶‰¶Òôß^?Wï¼õžÃ½×FÙ4i3nO¾†ØÌ©é5ù¸dÜ•#¬CÌx¦h˜;͹¯ºæšÙÈ>žZšÈ;ŸòŠ©06SõÜʦu‚­Ô¨w¥ó=ZïjÊ‹ÈtÆMnb#Ÿ ý‡8*„™çÍlà…ÐîY–1/Âp¾¡ß;pT÷¤O^\ólŠ85MÛ x Šìv(e+á:Ê0gN0oµÎhÂyÑjh-¢Eñ…¤æ±ï¢¢RÞä(Ûby!kkëõ5hNRt:Ó$wNår»C¯ª‚²uÄy²àa_y/N“ë§â¯vüßüÄôÜ‚Â]˜¤{p@y"dh=šF‚EØÁÅžû¦Lv;2$:Ö„–‹¤‹¼ƒôäïéûé ñœ·ÖE Cõƒho8Egᄎ©s Ö6ÌùeK;õ¡`„÷¦öbmÌßKd%øDq^ûÚC©1¤¿ù'Ä‘,9gä®ëÆz ‘üxS7&¼Áíl‹ŒzA¾é÷UdVµ?oDËïæ˜VKµoY â ¯ÅïqêHc IÌ¡ÆJ ]Ë8Ö@<¹R‡Vvx£{'3ÁhÈZ Ga›ñý2$ßÙ×ÄÅû ż¥â© C[Sãj‡¤a7¯1n1ŽÅœ*J ˜Å?ùi(Y@»|tgh¤*¶‰Éæ_‰Ø¾§c¹|ß`ÞŸ/ª˜@O6÷ " I²æE—¨ÚiO–1ª°?Ævºø[Ý@êΣ ž^=ûþÌ`5³‚Å':X÷M+XÜâ˃e>IuA_„0³éF›äNœy¹Qh!ÆafÄlœ‡­Ô"t7gþ,î³å…tV+.ä¾m‡`†r-ÁóŽOCYõÌèŠe<ë“\ãÑÝš¬6ùs›ÓÞ¥¯Y“3º`œ]Â"PU6ÞBóYQúÈÆšº,ó&÷ôµ¡±7êì*#En`zÿ§Ð@ZÃl$yòχc:žlùÈþ¼§amv·F¨ïƒâ”ŠÂvl©–§HŸçN^Pº!àáŠÙºÞëØãÈC™™‘Ør ïuí]ú]aÍR®)ÑgÇ3\ŠÑP]è•!‘\  ß@U|yÔÜ*žÙÆ[„:ǬÆéÈõû„·¡÷jv`„)kŒz­…ãA½¥ôROýîü<༧ŸÒå¾õY7\íç– Ý|Z!µD\¶T -A…Fj;Þå,´¹zQ°‘®U|t2Ú §´Û9ÓŒ0&I1¶Wß×P™Èž=TìD¶¾áÛªÌ:Ç ¼mè>våŸ €lÝ­ÚHKš--líOS—£0ájýqñ LœÉÖ³Œ`Í É®¦ ‚'éuäwãF)/v)ª»G xD¨%¤QxXáÁw¸Ho¿ÿ’'/tö¡)Úñvîâ­f!g·×ãê3÷»á¡Už°épKÕÔk|÷ Õ¿µÝTfÙãâ´zÓÈÚ)\Wî×óiÉ” Ñù ù†î·{ G¸Õ°¬‚[–0Ø›Ô%ýÄ,S¾Ù"Á›Ðýò*¥á¤mÉT$6W_ƒ?[ˆj¥KŒ)Ç•7Q†mZâÌÍ õN>]òa¥\bËèî[w+aAI¯aI›ì¼`÷”åv*üH,þ`±€èìJŒ¶¯ ¬ˆy½MÖTµ©Hö‰ëL`×F‘ax|f,X¬‚F1e´ù™T„ïÕ·\j¿MßþÖ Oûh¡'Î,EÁ5Ðp#C]ª‹ ùZ=E[aŒ÷5oVy5UyRr 2ïKºë%§Ã-¥V’62É _{ýË€Þ:*éVN[#%wtI–ÛÔ²¬âëôo^§XúÖòEü(#3£3sŸ\žRÛ.!†Á¸Ëv¥ë©}G[_¤wGnž‰¼s¶ÊVß…­½Bz'ûõµÆö¥",öí©&ð–\5$i¹ä½òœ¶È‡µ¹ù÷h!´ÂöY%zéÄö]ê Ò:á5,Dé Žq¾Î33¶Ì²ÚÀ%ãeðn÷=ólé¤séròÐãÝÔ•½ôF<É£™§ƒµ8üi:L9Ç$Jóxp?ò3þ-fbç˪äcŸüiq¨„bÖúd›Ê®‹ÏNŠÔT.z.ðš„çÌ !‰c­+”‘IMLˆá*Á‘X)A1¥ÍîD-EÑtø›AÅ* <2ÎçÎÂQ™ýÇW>©4\*Jò°›¦ „ù §lCŒx=@Ï—>‘‰¹ÄˆâËa,+”D·ˆoTÝßh®ÌÇÅ"ýX^èW²=ST±²Ê­Ìto40~!º€v‘a1V­<ð”©J4E?ÛSª¹Díñ0‚c'—yê럒?ìÇj/EL1ô5œEÚ#=jS…Æõâ Ž¬WÉû‡Ýä‚Vë ©\Š~ûháíkÑô©#‹QeSºÙÚ ƒòè¶EJ’ZÖÚdM¯ŸfÝ1î³)‚Âx"4c—Ø;Õ`6Ü„KšÆÈ/Ù+žLÅ+¸™Žs&„H¬jbiUUƒíØë£^f¾d6¢8$Ï‹6çƒIÀ^7Íœ!­$|LÄDÂH‚ÈþeVŒ–S^ÜBmC¶Ñi*ìoŽŒþ‘Z?ÖªætT>ëºî¸Ø¥Á¬I­pÙÛê72â ‡a+ˆ$=¾ÓlK‡‚ÁöXÄ öÁ„†ê5ȨôÂXsUÆb›»Œ~4uæ++* B¹ó+æ—÷wÝ:¶@}Òè^ºêé¹ÇŸ s¹"]¯Ä›Æ†3ÎÑè¥;WzbhÀÞðô¹¶î‹>„òéè©…ôc_8{tz—ŠnH |îb—k e2Žé ÎwãLتvåÕ™s’l˜†yüaí~Õ‰JÖÆå 'HÕ «Ä’àÛA.)¤GäñuàÍǪç^Q.æeS$Ž‚bÃÂ×;K$XŒÅV9ìÆâ¢~ó1dhXÆ$6 öuàúo3+󄸆l=`j ¢<é °~ÞÓ€h•üV;à%C*ÎNˤ`”ø j¼gŠL!Kû¤%½X4tmsšËè~þL²'˜ûµÞ&žËá',m6í+:2£ŸI„ö1{ö±ÕÜO?–ZXj¼ê[7Æóâ¼d/“ ô¢×qá´Ñ™"èðq )hnÐn!2Š.–=&„[Š<³ÃÛA :,¥Â´»ÄΦ«am)Ã4¯Wì‡~¬Ã<*: „ÔÖ½PäZ¡[païÆ¶"„ Teª^ªµÝú,!H°Ï›:tJ¤b6A\ŒD=¸òžu¯2yYßG,Éõ+½R©êyQ¶g°# ²caŸß¹Z[I3íÏuEÑöÛPÝšz¤ãDõOä®ÈМð\ïÂÜ–Kõo“dÅǧcÏ ú(Ð…ÊËⲫîi•áÒ(É/^•ËtE£Š ‰6)g¤éñšôDT¾«ñ÷áàU‹|´Ú‹i«‰xo5]$‘¨ˆùjÊ—…ƒÿŽVß›¤Ñn6Fá‰ÚF°¶4Ï/“V˺᠋aJÄ$qž,.3i/GÑ]i™îV%în£¢1—DÏCâºï*Ðïãk ¡ÒXp‹wyŽëä¥ïÇÈ–Õè­vy Ðo|D_(/©B¥™6Ãem+€;#’ƒæ&Be¾Êz¡ß³÷ƒÛ IÚ»ëãÊÃØ•¾fnáÍwFŠt:Edâ\R'öÙйf–3C¶Ã ÇY6‰’°}î=–âX?žÛ—z-¡¶'öô.Tç™ îÛ L<Ù™ÐX‘˜ Jè¯.Ñ-¾¿o³æÙ³¦Žî‚›½ýêȹ£0¡Où!ñ ˜Î‚?Ãèi†eU˜tãÿø¦L»×Æ1á¼<#†4غpó}3‘z‘ye ':²ÖçY¢³£)ªO2‘Þ&ë ã˜ÕO̸þBZ]‹TïȈõ€QÃÃY„ÅÆìxSA]õ+45²ï &Ú±D­›Í1*ÌžøÃ†ö·¤HÌþL?Mߥ€Æc|ܰ$Ö¦_.h-VNµ“:Pä^_×åˆçàc£Ò''ñeüËÉä² z»J½e3š°=Œ÷9Šà%•ýÌ-qÌ·9Ó‹¶_esö6t–,s%MµJ®Ì7Bèˆà´?úý%™·&ô\[i‡–µ—ÁK·_¥†Ücq…$å±ñQ²›.ÓŒiê@—ïGøk_^]Þ‚õñDëèv„ÕåÕ¨P["’êù&‡Ao{ôg„#$#6#¿ìàôÖŸüß°4:`u7s-à ÌÕŽ¤Ì•È]÷Ë©hÝ•¤ÅX*Ò L­Û¼Tì îä_¡VïDý˜ue 'XêƒBaÝÍÖ¬Ô’m̤+ï–’0÷œ¤‚{º;i¡{¿OÊ”Ð(u ô§aZ¥ÁEléô"I³SçìÕèR qu’I}|ûsWpÒ)IX%j.·îØ"Ç—:·ð)¨†ÜgÈïv²ŸlK_¤Öûh †³ü`kØœý¿ƒ%^þôâå^èΣ4CÒ¿5üïÕû53œm/‹jÖ/3[ª Ãú%ž{&ðÍT?>#8x‘n~–¶¼¹ µ-›])>5g­qø-t¹(´  5]oª.!¯h> ë¿»›žiÖ[uk ¬èVøÙf26-³»š‘@èèœÄt¤ó,TKavÏ%09„¨2wAµ„ç£×шThÞHÅíBÑ7žáƒoúAHn!8épõõÀêeÁFY ÿ J‹à-óä”5§X+ZÂE ¾«¹ËY\pð+u–Gãµ2šŒ˜(aGë´`«ð‹Êô¶ÓR–õ„ lÔöÎRÞc-ÈÌÀüâ«Ë¾ní¤)JR¬z¥ü— ‹ÜØ+ñ•WH¶…Y]ùçD‚‘×qXÌ–ÏMÄ;¬öÈ©´55g¼‹|iHq5fxÃ4l/]:Î5ƒ­¹sõœ s2&íGÖ£Xð†m¸…Ö œXñ«e ¨9¿EY˙ȗf'vì{ŠPÄw­ÄðWù‡U‘_ÍÎ,fž®ÙÐ\ÂçAËô«b}©YËHµŒÂªž)E¼òþ˜™ Üñ²FÓÜ]x›³ðD–*M%‚Š 3«ûKÒ‘º¹úÖ¥]mr³‡ôÇPñÇ9J¿0±KSòË?Oï\ÊAŸM©Nj蘥nÜ糆ÁŽ®¡†’˜RÄÌÍ ;7]rYìKx‡››r²³`Ñ—Ä^ \›–¿÷ P½ƒ™ðŠ:é2¶ü)ªÙNW½TZZ…ï=´ª“½1?0Ø“éVϨ J¡è¤P ám 6Ç uß5ÃÆÄSlu§L €êR~d‚;ÆiÓ"bwŠÙÎnH‰K¶E•ZÒ‡-»u9 ð²šúÖ ß=}ìé©($ƒßWh9ä8ºmºdÔl5”?ËOfÓ[T’’&dü± z^ê$ ØEi‰n›Í¢Ô÷àS(Ó“ÕˆJHšu f¿~VéìÜÓW¡³_`ËZŠ.†ä²k~éÔ]ö7„O™öð¥àåÙÀiÎ þœùìP´Õî«E|toãnfo-ùm—¸:.*Žg/aqŸ(\vࣨ±èå醎[7ãGOÏÀZó=!y>œß5³r*¼Â¾ÌH朂Ý*”#÷%”å˜Ü”¾¯8ä3vzÒU-3Söuò†À°hZyÿ}¯¡×f#oì0tÊë¨Í¹1êÒ-†$%!Û¦¯;¨˜@P¿œm™Ú¹  …õCx#pÐm©ÂÅüéZ9GÌÿ|×HìG#=$-W6Ôy‰vX™¸B©x•—¬šïèó­Ý¥-ÏL¢yü‹çQÖPN„‡U4oä]í7$®ß&QS¥àw’ã>EîÎÔQl@Þ_a”ÞM ÓìN5[~`U|^;x·‰ ºëó;% a>Jêª }vüZ Zw}¶\#½4 F:GµÊ*÷WÁSLµýÁ7ѰÍKÏ\÷¥bšá«„нâÛ5 2µrö*\Ñ—ÛU1DkqÂqGm’VŪ6‹.B3fáj6‚Ì6-ÖmÉ´¦n³²¶‘üyÅÌgÖZ?\$V‹ˆ¡k™øtœšOXpx@ç(¯ºÍÐÅâr]ür·¡¤9dã[À§÷ÕÔ™ožãǘiº\™Î©û#þµMY f?ÊyËõõ9[ûÍæ/tvûû9s¾ç`×üu¿¥ Çðñ Ôº ¹rÙ r ¦iAmg…ôèá8ÙÛ|Ñ'ˆ"ôω>xN­Æõ‹?‘ø¯tªÇ÷|¼“ÝFÿ\m ˆÑ6”©G?©îy• †z†µS|Æep~ñP²¾Ûq¼¬ò¸Ýãó¯±åB¹–ãpV!muKîØtš“4úˆw¢ˆó¦êÕåÉìU\Dïõã/Ïi¼§]œGçÚv!ÃëĘ ûa$ßRuØ‘D âeˆŽ³¡—5_9šwï;¾ëœˆ#Nš·[.â–챞ßÅ™ü˜oK r±G, ‰â¸$âØâÑM͆ìV\Hw_.ßï q|S¶-'G•"µdTßÅ= ‹è-0¢æ!\ä†ñJ4WN¹@™?ûÌàR¶¿¨'ä;é® 9¢gì´_Ø#í×´Úî«Ñsc•šCŽúؽ`3xÖ’ß>GÔëê+åd/d;b÷Þ‡Wº"][E}‰ư…ŽÿкéÁ=ó}[ŽÀ³Ä%X­þH4c:„èñéÎ[ãýE'ÒnOEÕ{÷ç&2†³4O´ssXí>>?ã¥-ù÷JMºæŒÉ»“kœ+Î/Ÿmƒ57q‘‹P¾uá/æ`ña‡^”n}:MêÄ¿)Z)^€¨Øø”kÕ˜>3ËIÃ÷Mב“V‘+ƒ ûd%Ã!ʻʸ(þyõcžTæ4”ˆ‰ìãe+M¹5\…5·+ ©A`c†®í ?•È„kn$ %ˆåu¨h÷Là–‚¼‡°à4,åKCýÚE` žøpíÉ0^Ôo‘Z ¡EwšøYfQ¼Ö´…Y+A¹ @ÉQœMG²çZ×srÓª0´ä&ó´Ab£ »É=ó49£>z‰¹ê{€Ël7ó>l>HÊ|s>Z}.àìQ)ƒò´Œ°ÿh$§I§Ñ­dm™Çòí2ä þNS‚kÙC?‰®IlfBu\êÅð…*?6$ÑÐú=>ÙŠÂÂ5þýîPÔS%½¡1rˆL(ÆØÉ§å•¸[…O*ãÙ/>Øéº¶ƒiä€pÊ:ƒû¾“-Q}G$uø}@b C¼.¶•4ÕD˜S¨éÒ ,Z!D¤êCh5Â\|fGeŸ¨Ç[§ßz†€›…ŒGY]z±»ÂsëœGbÆÄop¥rö@nIhʲÑÑi ÿPå¤CÇãàüÊõ=“G%ªEõ]l ÍØi®n ]&ÙÃFiA•"_nžÆ÷£¯—è60& ÝN´?z1ë ï„?§2Ø’i†,ŽfûÕËÔ¥7iàë´¦”ºvþäMD‹ ’–aò£d>Ë'‘KhØ=s½k8îQ!£ƒÛ\k¿„¾:Zâ…¬xoö)í_Pí—¸tnŽ4I Ìɂ͉—XžÛN.†»†+ÒæºIWÌÆ°‹{T—”õ÷-áúQ›ê1§ÎΘ© V(áV†s¿ück)WŸÓ6Ó u£Lî—kGžøœÍi‚ÍÿY§° endstream endobj 65 0 obj << /Length1 1614 /Length2 13484 /Length3 0 /Length 14314 /Filter /FlateDecode >> stream xÚ­zep\Í’¥Øb‹[ÌL33[Œ-Æ33X,YÌÌ –Åh133ZóÊßÛ™Ùx;¿vçGGÜJ8y2OÕ½QMA¢¤Ê ljo ”°·sf`ad樫h*ÙØ™ZÚË1ˆØÛ˜>Ì𢠠‘³¥½˜‘3  4ˆM¬¬nnnx €¨½ƒÈÒÜÂ@ýACGGÿ_–¿!cÿð|d:YšÛ(?\6ö¶@;çˆÿçDU àl˜YÚ¢ŠJZÒ ’jIu€$Ð2²(¹ÛXšä,M€vN@€™=`ó¯ÀÄÞÎÔòokNŒXÂN#€“ÐÄò# èntøë¢8A¶–NNÏK'€9ÈÈÎùcÎöK;Ó¿>ìföÿrÙDØ~ø>À”ìœL@–΀ªJbÿâélaäü·¶“å‡`oöijoâò·¥|0^g#K;'€3ÐÝùo-c ÀÔÒÉÁÆÈã£ö˜Èò.N–væÿÅ€šLm€NN0اó_}þîl<þɶÿ'ê?9X:;mÌáYX?jš8Ô6·´ƒgú»U¤íÌì,Ìÿ²›º8ü‡Ïúg@Ô÷ Í #S{;€)Ð žIÁÞù£$€úÿMeÆÿ9‘ÿ$þøDÞÿ?qÿ]£ÿãÿÿžç‡–p±±Q0²þ“øw @ð÷%óÙZÚxüwáÿ© üÇÿEÚÙècÂvæb032ÿËhé$aé4U²t6±˜Ù|L黺)dciüPóŸAX˜™ÿͧfaibm÷wìÿríLÿú‡@ÿg’—ÔVÐT£û¿ß¨ÿÄ)}(ï¬æáðAíw"ooúŸ‹¿(""öî/V3ËÇûàÃÍÆáóßTüˆå¿ÖòFÎ Kw€ÎGÛ™›ÿß¿ÿZéýŒ¸‰½éß½¢êldgú±½þÓð×mâ}¨úωÿhú?Öÿlt Ðh¿¼`oÂl•–ñݹ'gpLL§·›r0Ä¡¤A­0߿ھË/-|‹»Âð¥&„±q‚ç­ÍcþÄáuO†v¸Û†ª+x‘GàCFÓ“¶NÙÁE·Ȥ_‚ôýT3ÚërNnJ›“Yc{LYE¿ø†p¢ƒ {yOãOæšïI~ç€ìk’Zÿ ëj#zmÁÉ)eâÑýUÿÈÐà@×tÏ>]ö78 ^#ßä’$gCÐMƒÉô“+G|œ;á—1º ÅàýH¹cÈœ#-ÿ£lM~A’j£2ü¿fÏò‰Ý/SûðNÔÖž¯Šï,ù‘"fwAaÈ"wRB@µ¼:“ÓÁSÅй[Lã€:iàÁR*/i’ófÛ* ®|\JÂ$ÝtÒ(ó7ï(Ðø”,ß*b€?ül—øŽœ¤ÄÁwŒ‹M÷~ËÊÀ!z¾¿àE¤‡æíGä^ì{£S¨Ÿ\º3|HÓ*ħ ÿ¾:r¹£â=$wyè¶kÃiæÛàMý—ÙvTõFãéVݵ‹úï%æü·¥DÄS¬Ø0#Íö‹†ÂÞ½ÆA„Õœ1ŒRàe §ß0囯´Û°J~&Äa¤JЍ5âhçå6ª€"k¼*ïYª'+3rô+iM=M@´ÉÑF€)“0è½{™÷ìdºD3ýúiBnØnñX  góhzzÏi3twæºÌDŽbO¸“›ÄÑü©æðoœº¥âtJ·Š¢'˜V‰¿Ã9ùéó3Ùà¯Á,ªBŒÄòrµ4™aÞ‚a ÓGrãCC@°;í(’/ƒß6‡ˆˆUÏ 4«øóžÒš­;‹MìbÆ7ð™¡J¹×a2°Ÿ ï7£üÄʡΈ*²Ä|f ügÉÃHP’0Ìa‘hñ_5*›ÈÊ¥nx©ïÒŽÜU%sV¼ÏAqÒOîÁ<::(ŠÀ€‘/QúØÎÏçÛ_Pæ1Bt¶Ý¦¬©m–¹%Æv(ýT9‹˜e:Adb [½ïUúƬøJGPâöןòȪ>‰ ¥Jšç åa„£ØÖ²P0tú ©,Ñ‹õ­I|P"(4¡E¾»­ö•„ÿ´m†´Ô“ÛÑÁo-&ïÒ…Uü7ód‹•Î6íL9[þ•ªí8ïvâS2¡ÆŠ…=f‘Œ@D.!2´ï³M£BBª\ãj¯,j‚NO޾$œ÷®…œÆ—o™…œ²„:Akcªù!/ñE'³—éÝR«h(n:çàN¯F!Vï<B ¤³b¤Ø9ÚÌU¡{fÁ+ ‡Õy®?@»Ö ŠmY¢”36þ|`².|?]¼ö2ó=~IJ ú}&zh)O¤SBµ°)ßËÈËÅŸøD×AÈþÕaÜhxÒ³tcö J^Ýq†Sà/ˆ€¡KÒ¯jÐû9Äã#ˆæ ø{5\ð€î/x›R‡ž*®õ_ÊdTio\Ú!ôª²â&·’(ÛÖà`1-IyrIM kVòGšÇ¾ôUѤ_Ê„ÀS§Ëî=Ýw=þiºaä†à2¤A®Ñ6wRHÙ0vç•¡oc÷%UýýMs]ãâÞûâ6èŠEe)Úu«M18”Ñ:*5×Ûü³R*ßr¹ó…Ž¡–’Æ÷³ýí´âVM€ïÕ¦Xt긷wv¯¶*]ùép>uS`°Vöi#¯ü)™ þwòìõfÐþ¤éþCf> MPÚ;ßÁ£7¹–š[MŠsV‚9FhþçÆG²1ôfÒhpèjƒhBHAø%:š0 ±0*±-¡ñq݇¾ÈOœ!ºýkú#1vœª á{(sÃ0¥`ñ#-eŽRì¥Á…É^hÓÛ7æ"k4?׋ôÅ¿gb“Ÿ3 ÔNBÊ äÀÁ«Ê!ç—^Ìwäí°d"e:^‘Xñi)x¦)Z)kÒ{ÉŠ ºŒ`Ûg2ø­ aïG8Ñõ6em=øòOÒߥ»#ÒsŒ 7/f7ûAš&Ÿ*±²¨ãË›ü(RåÔ³HŒ]Fý"—+SÌ^㳂6CÚe1JÄ\]¸{^96ÉHŸoÓ\\¼9¹ú•µº ب™õ0Œˆ„sñ¬ÝúÓ!?‹RWßÄI~Š‚.³øãÞî5 v‡@±î)”ÍSËY£X|ƒ½2Ƽ[ÙUìüâ ËHr<ß/9Ôµ¤Ð\Je1ÐjU¶Û®¸,ù-§¦,ÖÏ}Æ&âê«Òç9Þ ]¹>&ÔØ¶¡„ÀþWR1)*I7›R8ÁŸ0" Ÿô‚ç5Œ‹µ"¼x;n«\uãÒÓâ­ GlK j…¦Ê. &ž²ß:é:²Ã2Ñ÷'‚M=nUÖ€ç8Y#ìB;&ÈÒ~:·¢pØ1©üYLG6„÷}¦@ÑÝmÒ9pñgûè2"?΀i­“JyÌV ±¶ºy©Õï_×bïôÚQ‘ÅÛ÷G‹>3<±ÐÉÑMQž.öî•K¨±LËÜÆóž~Ó¶æáä{é®Åw n6¡‡KiÒEów±ðR-õXæ¦ù§N¬Ä_‹Â°˜U(È—ZLg”q¬@BXM4»y67¤ù&¦ÂÉð¢fÖ\º¬8Ÿ‘d;Ëç öè’†ÃL¾Ž°Š°4úI,»ò“g”@ʧnú÷|ÒXé'ýÝ"Á‰¬…éûG§K`û§ƒ^¤ö¹þË÷Ÿ¾ð«ÏþöÕ¿9‰´™WÜí´rœˆ ~Üx㯼#hD\ÿEÇBs;âÛy;`Cy×^;_)Oî!¼?8êêßë„:£‡Ö¯$qÆVëlùàx ðV/QĨÅ•T,hv8ê‚Ü «êó¸Ô‹ b%k™ÃŠô±:\Ö^®MYÛeÕûø§}ÛSó1e¬-ùñA‰ÉÈľ1Ê$4`å»ÙԙĽD;²Bˆ0âƒ}ú 8Âĵ©*fQÞʸ¿½‰Á/XÇ'ÂØ£Ü~àÖGÖΡ#HÓCãuÙV#‘ô×£Ä[ƒ÷Ã0yòˆ(5Ó_†t b§Ì«§üòTÐ1˜qîêO•O 1æ_~ÐOµê³µŽøííËÐZäã¸NŸ O¨ýúRB²­{‹1÷CÑ¡ŠÇAí’,å ½®¼Œ"° Ïu¢éò¡hj>Œâ,§ýo¹wãRi5 ŽïÏÞ”Ò!‰î_Ü»izÅÚ„9øÜ"Ε;ò"fÞ&Uâ-ùê: -îÞ»‰Æ­€æ]A(Ž6ÐáÆ~ bȆÅIüIdÈݨBýSÓì° Ü>[6•äsÊîxíU0Ï\Ìo¡¨ýGÌøŽÏ¬‚uMR³ó×MÆV’žµ.몇zsNc²Sì§$d ­GË{§c¢6˜sd]¬7¤N>tÊÔ’¬aãëB:™ åê™§0¦fÜ#ˆ‹£Ñõ™]†üÎ'v¯’_É¢¼Îy+ÅÀé°å4˜ýÊ ‹JJèg«ÈW?Þôsè6÷íÌÃûuIPo¿Üç&Fï_þŸŒ}Ùô‡ñ^¯ïhîS¼"j³_`I×Ö¶(•ëj,d.”уJ šDTlÊ9›;|´BŒ’wW¥ˆ-p¸$!ƬeÃ"éô4ˆSq ÙJ * -ž¸kãÔ3;;¢‰FðºŸÌì­„´³¯"µR\iÎ7gÙ]ž{:‡ØÙWÜ0–pÝsæ:öþüfe•Brz«ÑtNZ ÍÞ¾Õ”f]x£ÜòOa¡­«É&ú¾íHuɱ—Ú›9Ü—KC2…ªD%†ëño¼£h¼cÎÔ|²‹+î_YX¾k‚òPh`:UĈïßÚÏ (ù¹ÛHß±x냧ïU–’¸lÁ‘¥#Ü¶£AÀ¼úë÷ÎCÖL="ï‘1¬~Â'\Y"ü[¼ç_-í­—wk²<ÇâÂZ‹H«DV·Ç^uîá‡Þ2~ °Œ§Ìa~[°^¦‰¤QÂwÃÆ -^ƒ'©ñ!(‚CjŠ´‘$/tŠLÅy{ î/ý6^|iWoˆòòŽ0yî¸"îsG6'¿lß!();—©¶Ò/"Ã8»ø´ðG4ç„ Ø‚959г tbV¸Rjƒ“âáq*{¯¦?µbOÄ£Æ÷)Ón΄«œ0—^`³è)nòÓ©œ—‰Ù¯>‚¹î±Hë³pɼ$åÚÒ .}·¢§ÅdÃIˆ#b{â’§=Œ ‰ܺ% õ[¯XUÂY$…ÝnBT•¾R¤RMÖž-°¤B÷fˆá3μÉ#Ÿ}·™×OPb2‚'SK@aBÎVÏ5èETr t¾Ñ™V2¬Uy+â”ë¼”wÐæ­ZUPdV𓍵úøía…+žÌÆÑÈEMànÚÕlIºï|±BjÁD)2C×WõBr'^(%iŒ–ÇfÞÙ+©]ÙG¬b¿ø®<Ù!@vlã.>‘Ë[aüu;'O‡îêŽÓ®Æ!ßÁá6~ u’³ùü¨âx’~䘗6~÷ Œ8Ÿ ðbí ¢[“þž\[a¡¨ ¹¹ÂÏ^8WµÖ$ÒaåôÀKc6ǧ¯`×6=hþUi4 ™Êž?°Ë &åw᢭K°‰¼œzdìSÖC@=/¡pY ©ÖŸ® –jºrkTŸŒ9Òüb«.)§ž)·Žë…‹€ˆ´"ïI,ƒêvçiMŒjüR,ÕÎÍFÍãétƒXüâV•%¾/u[Ý+õD…êåÁfH]=ñÇGž·ÔÓšþøò(½!Á™NÄ#$âµõ*Z|¤¤<-ãä#2:‡?ÚûVj9UÀ Y•ŒDÔ¶Ú(ÅlBŽdæ bj,êP9~\mÛV²Fp˜hÍ7LÓ^*Šñz·±Kíƒõmwø=æ-[ºœãH¸¢SèbúöØù­žn)œ®ˆéêSþŸ°.è14¼TwÆ…ù¾íéInÏAn'Q‘xÄ6¤D·AQ& Ld`:Çš»?Ìû _ûm|YñZÄ!ÞÀ­ò‹àWh ÚrÖDVÆv®K9¯½Øè·KHšK±™Lø3b>3Týháx[à1Z¦O ˜R2°|OÆÞ”sh>°n R]år†ÊšS9 &˜uå£wŠD™wa^yç?ÊéŒtœ²6‡U9_¢gþácŸ¹U¹†ìô€®Ýˆðˆe¢(ÞÞòïwcqîQ”Ç¢¢(ª¹hzÔƒ‘dØfVf¸CÃî|’qr 'ûÙ½;Ø-Úï}j„|JàÍ,& +ƒöÊŽðg 1µî«¬/˜2ªï¡{rïI~É8Ómû{âiÊï’öŸFÚ45ù °q–0xAù©º+ßµ™[1e4÷sz ݶŔPb²P,”iBªN•°e?èZÜ®õSUm³=QÏÔ½xç4¹ÝRën·7¯í|‘Jý5ðŽm#5¹~óNØHH8É‚9s¸ *5 Òœö†¶üþztÛÕgUÅöð½ÊIÍ6î,\¥¿Šøë,CÀÌ®@¿p $ƒ×2è"÷ÂÄŽÉZ]uÍžd&Î °¹<9)é¡ Mi²™;D¤îƒ)aÃ3ÉqцPú™¬S­ã©ØáMÒJ˓ؾþiùTÁåíöBèNçó­çÙ ×&£ÏbQjõ½¹ÏæYYu$Óu ‹%n¶Ô äs*]ÿÒ;ÿ¢3þƒCVG~rg°ØÆÔ¾YÉBƒšeð6¾ÿ«ÑJUBœpïy®ÏçÅŽQðBŒÁ;õQ¡‚ˆ8±¥˜èuÿÎK²ð0»<‡K ž¦!QR¾%÷—5r&Xt1º}3¾7$æý¶.¢@aM‰“ÄØðQVx+ýîp¤O{äìõ•]æPÍõF L‰¯Õ.Ÿë¶ƒ=ÄKÏ«Ž©±!%S_~¨ÂÕ–•¢Ï,„zÞßq\ž†õ®œÔÅŠn»Ø‹Ý0kN;DM#ñÿ~ì3|­ÆðG@:‹yœƒ'Î}Zg7ò†VË9¯ÚŠ\¾S¨WàA©.„J=ý3‰Ke× [nst~îH‚sCF"ŒòŠaœ»ÑêÓŽ’-ýOÂÔµ$ñLÔOÊlr'P<†å_´›ÂJŽö±!ï¹_.º†šjp²‡ C«Çf ŸŸ„HÖb²Q>3§D3˜Z5‰Î(¨L „Ÿ­3zÊI[€« µ…€Q»vl3ü „äȳ}8Ðmˆa›áïpc¯ÇVj‹6¹Y 'Ž«ôø+8'úlFT6ÙwÙ¿šæ‡ßÏuÊTnþùOØqK$Œ|(½edCI,Ÿö-ñƒF¸uƒwy8£vb¤åó'Ú€¦QJ2ÛÇýÎ+£§Ñöz &Gs¸¯plÄéØäPYo#øs…°Ã×,åÇËß¶6ƒ~%z¬o¡¼ÁOTïÜç­ÊtJ¤v½ðé+P#ioÁAm;" GfÓò¼¾l7Å£E|£S”Ã){Pôç|¦j›ÍÄнŠ*<ðC¼$#>ñQÈÝÜp“+ËYKãúÇŽ›Ií~<ÜÇfŽx ]ÛšBK·ƒïKÖ{–´ä¸ˆ]£ñÂa?iÔOýN­ú^x"‡ ‡ž°ÓgÃÅ¡@ü×HT}O]ÀãÑ]PLº 54Ø`s$°¹Ã3½ºVÑØ“Z¸T¸: é×ÙL0ɨ{¢…ZTymqqök›ëI3YàlP+9t,¾ùD”¶ZÁaR¼%¶XL7@b º3W³óSÍJRäYøt+§:0BehcjgX|„¿N[¶Üÿnv„£èü-G×Î;[¼';Cw‹¡,èøªÊ¾=à) p?SiŒcå&w×G.Gynw"Ùç‹_LÀb;9øâ;ÜNEïºD™³6 ¾‰ô©o*ç¥j½ó­<í\ñ•Þœ3ŠºiD S«ë²ó\\÷ ]>©r:ØëKóü¢×лû*£SR¡Å”ú ú‰Ò*ÐÞ`i„_¶Ø¾Øê——g!NÑ«˜·íÍÐæ{DëÍîFÎ;~è )aw|Üd /ÏÒ¯)"õÃ"ŒËF !~Ç=JF^n±™²COÀ/´ä!+«Å?¡wõc×#Q=!Ê sýì$kª­±{ *žvAÑeÇ™{ú7ûwž *ÅÓ('¡Im«®‘з6ì z¸ÂŠi«{bþª‰èò’oÇCt6¥â=È¡ÓÅpšÌèÕ%OPÎ1:·[õÁ§ä}Í¢Â0\õO>`¯˜O](¥P!hh¹NÕó<3Ƥ ;ý¡ÍT¨äºô†ÊþIëHð[p=,>ë ü‘·ÉÇrÈ’2 çk»ZiâåÉj)¦ šëÖ˜0,f î£Ïo_i·Å.i+G´àêòë ˜m¡p@IEóýL=óÆgÂQgÌ›ÐjùY> nEÍ÷ë‚Ðå#8M×¼¹Åw'ǺýŸÎÚË1²jôcþe†ziü?é‘‚ç !át› ‡IýÎ]$Ï ‹wUTz2½ï§ˆ<š\à§œÅГ>¦!›ÎÚ’Ùþ2FeéŠO5¸èC PÝ2û.ºv«š5ü Ê:‰-™™(Jt+9²ê°î"gË9b⦒gähܽŸyqÓ¸ù Ÿ@B¿kŸ°Uȵ1õb‰ ¸”eCzh63íž jGŸÛ=yÏì¸9žp lˆå‘Ûed~q°„*E‹´AéóÕ™fx¢Q%®­½¤>‹àoÊv† š\~&štd€çÚ å“ân­ í@pÂ#ÅüÈ<uéQhÍ)7Ÿ~|M¤ 2¢}5ÎëUúut¸X !1o³ËŸr>8ω™úÕ¾‰a ¼Xê§—†ŸíŸ b/É Õ¼þÕtnZû#‹u±T§ÎSÇ®A¸R–ÞÞ­s9‘ ^¶agÅù,³-[Aa£ˆ÷(eÇ«(xßú挖Ђù©J’+Ä+:—À5öÔ±´c›_é‹’rï¥7Û4Ä6¥/ßÛÓ‡_Xëìœ~†ÄÝýF­äžñ8QuüšÉ»r4h©RÌùLðÇÉüd7c´å¢{ü¶JܯÅÞ<õîi‘¬>¿€ºÂÎÉ´þYFtÒ)U£í€rÀJ /f¥=^Õ¸3ÖòäÍE &géòÙ7XâCëêç§p²ÉOæà 'Á8øåÑì‹|HÂp,–åh{ ^LÙÜRßuˆçœzÛý¢ÆåIÞÚ-iKl_¶ÃFF½Õ¶FžÖ ¿³7ðÔˆòH¢ŽÓá2GÛ.QÄâˆ*¬ñ0s–ž‚.öÌßzpçEo»Px›D‹-âOÜ;«l[‘„ñÆ*`¨?„Á ˜Ñ¿úyV'rŽÂíf3¹]ýŠÛb=ï ¥mPåµUúBœØ`/öîöÍ +Δ_õWè¢Ñ&éë ¿>Åð<1» LFvª2¦ÌÓãRIÿr3GT%4&@ÚÒìZcÝpŒBiíÍ··R©Ïml#ÞÓt´¬çEß"ÓeZ`ÿÆR Ç ù9Çm´v«˜¯â½$Í.]7J#_|ºä©  ûJNè2³›–É;g…ŒûØhÝöpúƒTUŠBÒRÚQA(á2£ŒBI]ðË ÖÏ|¥ç¾'^1#ö*[¯F™®pÀs–g1ˆ›h@Ô 6/4eDfÔó‹|†"û´|ÙåNqÕiÏGÒIé]RfÇgöl•8E˜Îþâ Þ袩>TjŽæ^ø]ܸ…‹oì<Êï8‘O"2U”4q–=E¨Sê¨OÅ_Ÿ]¡™_=ÊO“DËãIcAØpý±¯ŽÚŠ«^؃ N®Û¿zÙD`£³d¯ZR–n¼é…¼Ö+Æû ž ºAíjÝU>$¡?G;õ’±;KäÕeBŸíõ{5šÃêJz_C 5øZíñ’Ü´–îCrœ7š#¯ö«nåe¦ˆ ¥Ø£Êj‡I÷ ÉήÔÖOtHòáGÝ8UŒb¿×” ’Â0zOFSA‘%¢Og'Qo˜V¶Ê$´¾9ŸAÚ·5 ÷Îv*ltE[žžàÎÖ¸Üuyoã:½¡ô˜*6CL{&ÕxP†ò¸ï·Ã€óV*ÆæqO¥êsjò4$^hºâsWñ__@¾ÝÖ#oI­©’­„¨¾~?÷i×4bŸ\äR#Öy{6QD}n¯Œvª¶{E†U÷íE`Íãø:æýj»m!~¡[ýñ”›eçè¿£â¹(—÷ì·ùKTN¦’¯WJ=¢d-4?³©ÂpI5UÄ£Do>i‡°M¶Ô–D@rÁ~lGq&„ܹþÉÙŠARàzÖ¼)ú^†döøJI.¦¡ï¡AŠº©[‘}BE‰Fò‘•¦Á3°QÌ£‰ç¾_ ì[2Ë7Aø-˜qbÍŠåÍÌÑçLwi³ä?y Öƒ@è¹Þ~¥<“šÕâ‚~]­Ø@TV˜?),n4>cLN’ûýÒ7ÐÆ÷Ñko9\ïú3@¦@÷fѧšá¾=P½bÆq§[Ésþý!oÞÏ a‰9òá{)_ƒ l§K:àñ2&/â­i6QbQò| %µÐi/­½ó赺ÄY7†11¤Æ³ÄêÐ7J&¬ùS`Åúø8€¾Q¯å§-zWÞx²¤gçC<}Z•é±&w…†¥¸KíHxž§A½Ëa­é¡ÀŽk‘…³¦2q!rJ,–S×Ãe•C-¬ÛÌ´ùõAî2H…ïÑšÃîêçÙ!›ƒNêì¥+a¯Kº²Œ:›Š\ËC×þ¬Ô@E¨7¹Òé­Dr-±K?mèâ°y4º,ÆlþïU–úQä{3ìŽóüë×?ˆ×_î9óÔ7ü „O=ã_Ò[1CñX½àwûºqUXPpÑŒ¹®®¿ê„'í뽫ò-Zê‹¡¤ÿòŸz¨8öò±b~}ˆxHÆ5Éß„U«XÙࣚ:V&$vѯ~·zÂPåÓ@GGVè © ƒR™íΔ*øìÇ^—oo~kÿêh¼æ‚bí“ Pꎋ´ƒî[78-Ö颚 #1".Cˆ'>˜WIeÚ¨gd¿}k¿ŸŸ‚[°JûÊwIÝ-•çÊÇ?;^"•ùØÎp­Odîn½ž“ïÆÖÊ¢ý¹¥Fb&¡1Ç÷ïã|NwSÐŒ™ß~ª\’—ð‡.šGíƒâaO¸L3!áKU(<{¾¾×Z1ÿ ó@ûòZºBÃGz¡Ë> |6ɱ†[é3a5éK¹eÀ“]ãUyoñBšíYŸ¥U˜k¥n¤mStU_äæÖ)_òB“ÅØ²+ˆ%ç€ZsóñÄ%eÛí¨¥»»­ãrç~—hŽ)ZH׬ý¦Ê7šž@U¥P0Ì[Ø)e¾VGŽì§ faœýb7Œ‡ù‡Âœ~–þÊúA½^–4èןð2ªzûòoš·˜ Qˆ¦†#î`£ „õ¼4¸×­LBà…õ¢D÷ûÓÀÌm„,D!ƒhÆòÜIeW‚ìÏ!›°?"¹]ü¾˜ ~Ó×CËh!~g¯×"ëÎwk¾pžÒ9tø/¤È ¾Ùkt“ÃB¥˜‘Õ^ÑŒûc ]ÌìÆ½¹ ˜ëùØOüµ²@ä¡!¸òàÊã½Ü…"4Ý@9s¥7²…\ë@ÚdT{T±ËænÖ­DÄjg¤ð…MÏ×Ú'œnÒl­ ùS‰þ*$’.µÜüáÚ^Î0"5hfÄyl݉¸Ècÿ©X1f3ý5µ{íì pz©2è×ü”ŸJʱGОÌâÕát­xksöj“‰@ë̆ííZéFÁ$v^Ä%ð·@j0‰U&]Zk g0ÿÜ$¦Þ/]ëѰßz`A¯|Š`ÆÉI)—X!L¨÷†ò?Z9eÄ”À– ³sh‰L½‹©u'F{²Ÿ¡—s§¿½sãzp~/W_þ%íƒYnúÄeÑAOzÁî;Y–ˆJœoïª)Æ[1CèȇÄ”ôqˆÌ¾± %´ ‘ËY~µ°HµKÕ/xÙY»‘Ç=Ï-“pR­¨YKÞÀ©þ$*‰½¡ãÀSÖ..à ¹r»Äa½ÓO*í÷†?­>˜äÔ‡™4â+'2 ÂÖITá™Mò™÷˜ÑTã7~½AÌ¥†sÄÞøþÀ(…cÕš1x†˜Éô«&­p ³Æ10„Wbt“óe‘L\\ªãÌÛûÖŒ±+_Õ:‡B¿áë'>›”¢'ßÓ9š2aÅj¿M]œXÞ_lŸ"ì2ûªoÑVóÜsº¤›bÍPüñ…>UuyÀKIŸz Ì»Á6NÓ¨†n$mg‘u…TÔCñ…+`}ѧÄZ0¬¨@°ÚÇ€æËÂ÷äS$˜\’„~‡›¯ˆ..ÆÁÊPu osI¢iÄ}íÉéÿÚÔ{EóXrÐ1‘dà3¡ÈN…ªAöœø!‡‰žy !"sô h§ Ê ÛTâ •Èÿ˜K?5 endstream endobj 67 0 obj << /Length1 1616 /Length2 18911 /Length3 0 /Length 19746 /Filter /FlateDecode >> stream xÚ¬´ct¦[´%Û¶íTP±mÛÉÛv*¶mÛNŶU±mã«snß¾=n÷¯þúÇ3Ƴ4×\kî½É‰”éMìŒbv¶ÎôÌ L\DªJê †ÖÖ†&v2ôJv6†DÝl0ääÂŽCg ;[Cg‘:À„H`Lôã3''' 9‘°½‡£…™¹3Õ_ jZZºÿòü“BdäñŸ‘¿•Nf¶D\Övö6[ç¿ÿ×…Ê‘³9€ÈÔÂ@$,¯ ))'ND%.§J$°8Z)¸Y[ÉXlÔD¦vŽDÖÿaÛÙšXü3šÃ_,A'"C"'{€±Åß2€»1ÀþŸ‘=ÀÑÆÂÉéï?‘…‘™£¡­óß8ÛYØ[»˜üCà¯ßÔî_BöŽv3lþÆþ‚)Ø99;;ZØ;ýíª "ö<Í ÿéídñ7Ldgú7ÓÄÎØåŸ‘þý…ùu6´°u"r¸;ÿÓË@dbádomèñ·÷_0{G‹i¸8YØšý:"G€™¡£‰5ÀÉé/Ì_ì¶ó_sý/ÓÚÛ[{ü[m÷oÖÿä`áì°6e€aþñ·§±óßÞf¶0ŒÿI[S;"f¦ÿð›¸ØÿgÌàøï‚¨þ93ÔIšØÙZ{™Laåìœÿ¶$¢ú¿S™áÿÈÿ$þ"ðÿyÿÿ‰ûß5ú_.ñÿßûüß¡Å\¬­å mÿýçC$CôÏ#cû¿eÚXX{üŸòÿ{¦:à?Hþa$ ÿ®BÐÖì¯L Lÿá´p³p˜(X8›™ZÿÝÓ¿~U[€£µ…-௞ÿ®’ˆž™‰é¿ÅTÌ-Œ­lÿY<Û„¶&ÿû_‰þeÎ(£,¡,#Oû¿¿©ÿæ)üÕÞYÅÃþ/µÿ1ЬÉÿ4þA²s'ò¢gfg'¢ÿÁÁò÷Êý`&âdeñù?tüˆù¿lYCgG w"í¿c31ÿ;üÿøþËÒýo0¢¶Æv&ÿœegC[“¿ì:þ »8:þÕõß;ÿwèÿ´ÿ=ê€;ÀfmÙΘ;Ø2-3ݹ3wxRD»¿—t8ľ´Q¥¨À¿Æî·_ZØg¥ÁGmCÓ4×W»ÇÒ™ýçÍáh/†5åïÀU>ž)u_òŠÎŸ´‡Œz¥ðéçêQ^׋2Û`ZìLj‡»“ŠJz%øÓ,ŽP×ÏÔþ¤®þhdOö¾Æ© ±è]HM@(u…gç‰'ÏO”ƒc#ÃC¿oÁûpisb¡É¹ 1}“ψ“œ= ¿Àß\Ùâ^Œâ»ÔËÛÓ=¯¢HͶ½MAwBa&°·”•ë„cºX”ø2ålû( fó¨æÿîl’±±'Yy>»`ÎVÚ©z45 äºîlÚC‚åETÅóf^#^µP=Þgzçhþ¾^Ôþmq}ÈÉ,±ÌØ=VBYpN¨~Z—>ŽFá’óOCø´Š’[Tw^=”ÙaÆô¸rà 4Hn+¸b¿Ù˜F-K†ÝlI¹~Ü<£qIò7ºå¶JFлákuשc‚á½`íß<–4B¦w® =4ž6Þä—…óºR‘ht¤ŽE¤ë–¶*—H|®›­³²¾q×aÍÕZ’g¦D­P¿Ð®ÖON˜Ÿ!äÀXÁ‡Ù½ÆŸHB!FÀübŠîâx̳ß8bV3W© ºÓfS‘ûjÝ1­Û /jèEžàTHâ¾Ùn×›õ˜=yÇ'Û uÉÅc{§“í)‡thõ{½Ö’p_ö×ö³5¤ŠÇŽêÈÑRøzªJw֪׊ìç­òD^½Í;ìòŠ9("MÜÉ"¶0íºr'’Ó…^%´í;+Ó¤ÛÙ§þ9TB¯ècB` Mô‚]Æ^¯»C@ÛŸ/ük;æUæJ‰oª¾ƒÄtð6ŒÖ°ý¸™”ø‚\ˆdíƒ×CØôÐîn<‹äk¬Êž†;(KQ²äÉÖÜÁÙ4é’: üQ£õ+Ës¯¿&€Ìn¿ªµ‹”ô¾ÅÄšéðåF…yîØÏ¼LØÆ2ö½®.Ópõnž vxzrj{™ãÀ—%ÞøõÃÔm’¼÷ØoNâ,³ðxñ0›·~'¦np})Q[ïx 2å¾ÜÖ·YQP›ˆŠïOžÕP>—­OÞnÝ|K øÄ£=‹Ö2ÝI…ζ0ÝJÿW°â¥wŸîM¾ŠEns°çÛ˜GàýÚQD3X\d¿²|Ì÷@?;k=«²Pð<‹À½Q£öæ‰ÙZÊ%Á&×!ÔKM€OWý*mLªÂÖ¢ ,Ûœn%„†®aÕýôÑíÖ>P†.Ë4ΤBæé«Kh®@ø ³ÕðUóK²ÕÁo„ Ý jpÆÑWÇùœN¼Öí³ËÏ4pŸµ€Ü*¡Uäç‘”Ëà„PWÔz䨹­Ya í˜ÅÌý\A›9*Ãõ]‹Á“ߺx¾W°OÖD ·xþÍEå€ ®³TòäNZ,=%|šqçr„?:¬=,—2Eä¶Õ¼HZyr\CS̘ ñÆxúe?ìã~B× ŒˆÙ´Æ~Nuöl ¥1’†¨ƒ ›‰ @ÀKØ_Š ’é:Oxn9_'ʸJ2’œs«Çð‚ýÎö½’+ápíä§Ñ®—žì_ð-Òì ¢S\ù½a"÷| &ì©þ[‡…é@_‹M'“Y÷Þ¿^nä3Bõ–‘ŸŠ•Eã^b1I†DÀ‹±,ònt¦ð‰DÆDÙ<ض®`F¨ ìœ>ÎR²„4œ/ghºA=JUÇéåO‹‡ÔwߙӞ6ƒ Ž”aÛüæE)ÎN|¼Bò(â ©ÄÇeÕ§~YÛFƒWëFé¡ÀÏéFdœ‰~ö=ú$ª+èŠÍ××@¾ô¸WÓ2¡K‹Ží*º9ùQÄg°€€¡_&6p‚ɺO?Ô–~2Z–íjx4å÷‰wŠâ–P?r÷ÓÇô! ®ôO^dä´C¯ã¾¨ì@«þVlœÛý¥¥°8} z>òBN0åÕâl>Ûz#ŠÒ‘†c[¦ƒªo@f#~1î&gO|áWö¢Þÿ(GXÑO¼<ìȾ味LsÆóiʉa—¼–^ùx,³ÆFìNìî—ýÅLwçŸF Lj¤}€#ØtÂ]í@ùÛŒ¾tè>².ílrCÿquv¼@¶§)îXÙƒV¿ƒ×åöú™F6w¨¥4õڢϣ¦ÊYÏù=+fkÑd hjk|²ßP:·k?èyž{¢SÙ a!™G'Çd±õlXÜA¥e,þ:3ôr u–Ëó¶6è•×ïÒÙyÙ¿0³Ÿ‰³Z ® B+£#KÁóqíR¯RÏødë¡ ¡“¬vVµu¡n…ßB¶!÷îºï(&ú { |]!Lû™¶y—Eð½p\È,!݉¢^ _t:U" l:Ùt5°kBO‹:Áõ£…•«ØJ´ )JU¢ì˜’Гð”IËqòbHtú|ðãj¿Š'²ÓËœ zDÖÔºF“éS#v ~hbÍúôàÀè0‚šg®KŽ ¶vòtBBÊŽ E¨@o‹%hÂ¥‡öìiDE_Ù; ©wjSÚâ—ÂheìËõè:ë¨Ó¡GþCèOGT7ßžb³ŽFW¡Àu÷ưyO› ¤ÝÎ-im&µD®ŸLó Jë ¾©‡¬5oö¤šÌF?àYá´~åÅTÏaF§ BÖæúq‰gÂsYjx(í}Ê’~·±;‹¶Ä‘éÔÀpXðƒb•àÀë!¸èCˆ®\#L‚ ÚN3Bà}výÀXø%™_ßh€áRórç"!3m+Êí0y£$:XãxŸ‘*0<¡»Q?[㎊qᔵˆ2‚“—=Å$nÜ™_ðº"Möæ[uÝUå¸áÉK—÷È·`uO0´’¼ê_„w˪äy05]ËÑÛ•#€Á\õ“[³`Ò¬ŠÙj“pgoòdMÛR9VgnÎÅ:ËlLK1Bî†ùñ­T*ü)|¶D”Xíª»¤ç´Zm^ÓLƒ5 "¬iiûS^ÄÏð5]ü8ä´yÝZo5 ’ãˆu^rÂU'y(9r¸¦Õu#ÂQ·Õj;møÀÀæ1\¶™!#B¹ûŽiô…Œ·Acyó‘.·o /QZtª^¢äД0þ¨†ˆ¼ ÓË÷ å´§kŸè»¿eoŠ–<ÉEŒ„Kn÷±«ý6|*O3KjûAù)ˆÙàœ/XTŸc¡ƒ7®Â1ó…þþgK†*ôÁ “l?NG®ñÀ÷Z¹X5FI‰/»7Æ¿gÓîᓵsu±ÿqðâ Ž€–É2 ä\ñêç…ƒldó7ç¹Z¬¨ßfÁK^Ùo$Cµ zmˆ/b[ &ÑMˆýâ­%=O*S–ÃòT)(lí9 íL&TòS.=ëlëØ¸mЦÒ£ÑöçÕ­ÔÃ~§Ò5#²‘€þX½Þ™Ù0ðjì`¥J²_lbp3,ÀÄ·bM±ËH»eˆÑªpòg1fÕoÖ„ûÌ6´ÙöËÜæjÕ ù³k[1¤¯7_&sгD1pYÔÞLF¬œŽÙI áèä`ëû±w¥sþj—zPz×ðûƈgQÉ]ªÜgHËÏ€Ôu±{.2³rv‘ب)Y×EßSœ†ËNIcïíÓÙ%L>0[ΖG²ž5I 6ÈÄOEØëÙ¦pÒ2jñ ÅéEŽhÕˆA†&ýßü›©¾v¥lغ5ñ–’¸I`<Û'VÉeßÊt÷2ãtŠYÆKd0oÝ¥ícŸƒg%†˜‚ä~Ç+Lëü¸«¿)Ð;Œ\qTI«èî%ÎC M3ªîôm²ªÎI“ýœpäùï|ˆ‡0ÛØY܇ëX‹rƇ(@Ö6Ou-Ý×é¨ÎãŠÊVÅ™4ÉCóôo I¦˜µÅZÏkeÉ#fý$ËÌ¿5„$€}í$sС"³ß7sð¿¢oJhÌœëUÀ_ÕÑ“¹®ì'·‘:FÑ,Ädºg.¯|ãOLƒ1 ¤£±e½üä·¼œB€÷£"౉84³¦ >˜lP¯i€i?Ýø~9.r‚–{ЧØÝ^˦M§èâeBŸ›NÈXx·G®€Pâ·@I ƒV½%_jCú}ƒ¢ÍëyàÈñ¥);áñ&ùy+ÜžÃ!OnÊ: fˆïM$wºøŸ¤úÌ‚æÓ ÎbÓŽ¶2Â}&Âç<ÎukS¯M‰Znðöv¤Y[Ÿ;!p¦P`A¸tËé—^ëÖšà9:g7ãN½r¼¯¼ÙØQæ‘„=Æݵ÷–Þè3Tƒ?×Óý¼íj|Í,ÊîMΖèvþ1S5DúÅÆ!Ò±¨Þ1Åç7Ïž×ha$vJ­R¨ï-uÃ92·QöD¢è £1ãë.k´WîË"\›yùy ½.d2 º¡ª84ÇAþ³—`NF a)m9÷n±É¼Ò”5AÏ#‹Ì E¸šýÒ<ËÀs†s×È ïøÚÅ””ÆV‘ÇYyÎwwPOaS⃠½Ä_}x¥ßÞ¹f·°ÖT6¾nS†¬Á:¥5ü\¬*§ ZÊâ”i9ý«XØz ºé†ÏݑȊcû\¦„ÅÛ¢Ùwx7î ÍäkkŒ¶ ”¤â©ú—~Ì¢ºâ"ãÔ[EÝîOM2Õ~E®ÞW]‰SäŒj¾*bĤôaÓ ï¶UÁ.!úP¹™%ÊxÄÌýC×Þ \èº/¡‹E¯8 ÊWŒKlra!^´Ý[‹‡R4mýkEsˆˆCd¾[ÙBf*§¶ØàžXQTÃÀg:½ÜÙâ|:ëØþ0ú1wD`ûi-ÏŒÒðX4’çâµocøþ¹´<[ ºßJß³7`9³÷/s1eÄ_QAÓk•[Uœ”dlyj¡Ö„ja÷—pºS&>á}½¥ó£ã¥÷Ú¬ÅY¢¤±ä+áÝ»k(ÌÊ4Uñ6Öìm•Á- ¶-:µ¡Ù@ÃêŒG]‰ŠìV3 ¶k'@FÑâÊ^Á2ö­¯]ÅŽ5DìuÌÅSð!ÓܲɢΰɡñÎ` ÜþûÏb|bÏU¦4mõtËÐøvÉ=B7az hñDØÖšªB«±Àd/Ö#õF™#ïþ‚°ªÎšçpyy_u}h°ø¹ßélñ>6ÀÂÊøŸÑ# :N"íF×È"iA•*Þœ8&“°;| “ûÒ€_jþóvGA°jÌ2Ý›‰l1’¿ªJy{¾hÊ:…Þ6\-ÂóA4'G‚wŒzÀpw#(ŒâP݈ Í>í´¶ï£+´Ú¬esVÜáìFúwG1¯ÁiTVoøÕ ˆÑÝV“Ið[žH2rI‡R÷5—–}m:++‡œÖûõd,hêvkàdÚ2ÑEˆì˜;2­O‘WTztŠ@C ïG@®-£rEZ]×@#V°†;´Ý8‹î´‡Ÿ‚ÐÒµ>Yv8«Õk`ðº¶nôâ¢Å"оƒ¨ï—¨ŸÏèÞ6˜s¬vVmÁ¶ƒzyƒBàæøôî=«4)F:¯Vs4Q<µB&kDÚÝOQ2{rA:æµê „ðÑÏhüaÁפèÖ“ ¬Ñ§CO~²ÝÒx͹©é¶¡eñ 0ì+Y~j°p«âgq§°7EÞ+IЀþžPxG•,þ1ÏÔ›À}º£¬Z Œö£Þƒ«¨õ”Íc´Pcé­-éüuû›´\èù]yn”UºÑ»8 úg ÒQO¬½)Mµ¹ÆÔ$î,`òëL¯ÍK/éÃ3íùO+áBÄ:™9<jçÏ!+Évñd4åC½ùZ”9n¦ÒŒTT†uëØ¾}ˆf´Ä,ú‘Bø‚=Àt¾I¶XWær=uPÍ´d@@¿Òº"[üŒ>fü†[Ó·»=¼í`wv~ÙË2:'úw*4ÓKc67có¾Äöò€w“Éž@Ut{äF7V559Ÿ¬~5+GÀFÄãj)Y€¿¢#l’Àœõh ÂdDÄ ÝKn{˜ ?´—x­Ëž–í®¾ÆÓ³b FTµµ.7ëø÷-±¡Ô’(-¾À=kœv“T²/lé¸B¬Eç°ãÕª0F^Î÷äúayœÍðO+,Ü!¯Ð)BIôçOšÇ· ¡r!‰5¶*¼Ýç¨j9ªùû Ë«sOIâ–ó—jÈö”—€+ˆ‘ýÔøw¬wð}V†"ê'c+f¸óæ³x//ÃdÊànÚžŠ ]¹Š”Çø 1¹,h¡ q%Ÿˆfü.Dû!të؃¶–íAojD bnB¶z‚UU#ÿã\U!òõ|oµ…@‹»®–tÅ"Q_B¢‰$P4Çìj’‰#ã¡^,<åƒùÑÖt©¾2Œ gŸÊøëÉK6}Ú¯ÊO+Í&ÁÍê9®ª{Éߣr‡gAu-àßí5u¦­µÀîLùŽÝ‰äWŸ#VþÀã™k“OјAÇFçÃïÝšM'”t÷gÈQg£èW7WX«¯†özS¥ñJö'­A‘éDíX8YŒ 5ÃfSç‰EáƒãIo¯b3é‡ÂK˜„Þi—Ô._æ{˜è¬]e‘|jü<·ã5™Ì qËu¯} Ħx؆€¬%• øü è k«ì®Ð's™ 6¦kmŒ7S‡´ ¤Õ|Ëõ‘¥:Ò^ñÂnY¹G]†ä³Ñ'ü¹0 Ö g– b›‘Úi<9ó]Ô–ÞòƒDæÍ¯M O<¢|lÕf“רºøVÅâh”rÉö£“‰ñq3‹†”ÄG $ð5¸Â`0Ý~Îŧv>ë¾lÆ¢ÖG`o× ²©^1 @Ïž“QC»Š#÷’xñ‡H¿Üñ.uyARåäJ^îÒ,ÊX’vrtÒ’ Ç·iLg¨û{ÿJbÏHX—hô<ÉrÏ›¢uõËÛ `SP,£ŒW£‹ä÷"uù(!"ÖùcƒQ³ìÃã©OgkŒ.±ÚF…QBNˆ^ÿ†ò?˜Eö)ë´Bb¸§c$VŒÀ°ÚѼ"Èvú b$ Îðti>ô·.!wæû¨x<Ù úZÚŠô_pMÆb¿™aNm*‹Â8=Ã×JBãøG¼âP‰%ôû%HnœNQ êœ óFKçhBL9 ¢V‹! Ë4ó÷ˆU";€×%8/¢P÷ƒŽÖ³[HqéX±]ò›g匳"X£0¸ð+/wG;Ïê9 bù˜I£q¸9N@œè¥I«¡ŽdfÏ¢Û ÝYf|É~¿ZC´x²Ýrô¯F͹¯è\±Àv,ó“FºÁNaÍ¡ö»vÚâ4 ‡"¥$@®Xaqì%ò%h¸û¾”V‹}< è…(;ŽÐ6ýêæ"®˜T¼j©¼1Âfœ´O}èðçšs‚Õvœ‘˜Øèß*ºz†iÛÞ’ÚÉÅúZ«DþÒ®ü[)hÝ —ŸX}ð|vÕú›à5’ ³xð˜‰,¡Ï¼èÒÍL8—ZÇí©R0tÎ’#F‹"sô¨ Ò÷–޲~‚’-¼‚¹Ò¢ h¡ÄÈCDdö´;+Yš>’¿AhèCpÄ (7è6NŽˆb›”í˨T/œ~,úåž“Å--]ìàP>X#’.‡&ŸÈüÉšN\‚à÷ =zÖ,ÈýQý[÷gKê^c×QãkS–ëú=rÃìfe† K4AI10*¾ºbÊbµÉSÞ´¦’`W;[‡Ìl¸‚`7á|¦/ö2¿õ`{ê¯1eû;· Pв‹¹…ý'ŒÏ{Œó{âs/c4$†2¬™,p±b˜IxÈÌ-:öe`C“äOn•-øUJ+õ„ -¹åâv„VÚÖ‘~n¯ ?ä ²-E z¼bÓÞp¯ÊISõr°g{˜º›iÆL½‰óN}v›Àt;Ï>/(a¨Ѽ83) Âuã€bƒR¹÷á &Qâ̪°Ýë‘ê¥È2Ý£Üb!/ra¥ß½5D…Ñ£`ý?Ä-#Ø‘/¡œ›µ9»¬.Úúº³)Ì$1aÁ¬(sî8@³žûLv Ú Ê å6Ó”Xmà†HÃ~"0'>ÂݯùŽ¿&í”…Á7Ì›’‘øª¬0}"ˆ Àg ¨ý¡²ºŒ2¤ÅZ¡}è1\º *¨èB’N­tVüD\¹nãŠV²|&œh’Ù4yMt–Ùl¾s‹AÌÀùy¤ ,ƒÕW´m@a¤èvIùà ‚Co ³áñáSeb¥ç'¥¶NªÌˆ»84k€½û¢#Uhˆ²ìD[z„ôi35ieyÅÖxäVÌÀ§–Ûˆšyo6H†é h…’–•æ' ¶cá‚KÓEQ<˜Ã¶‰ƒâö ~_ᔿ‡"} ¹R¥ yLëѯø¸Þc_„·ŸÛE@€5¤$.Öçr)ÑÙ¤õâ+}òO•0£=‹ ˜Iúµö$Ýô’ ýÚfØÙAÝ•/…ÔXݺ!ÑÑNÓ÷÷Òl’zw,n—µ­•Í ºY#LôÞêçÁ9´‘d9f Yú¼ÞÊW´o .Ì#£ýn’€—ólmÆ}0dà+‰>ÜZLø+C)ÒDlk0‘X…A}Ï„cøçňâa¦ Jñ‹N“×%H`tD+£]ZP¢élÔ°s¨×2&ÞêÈ­«Ø¡¢á>"H¾”?R'¹é@üËa±UT2£¬1ìX——GšÞþæQtõEÉwd‰u~g™ú†·}³Gž—ßÊZk·ºtÜÇŒNº5¨Ä0È¢Õo#ôóðc5&ê?¨Âp§š7 £Q`2×j/U­‹DBƒJÜÛAE9О'YaœÔj fBÈ:K‘>F}ÐÃÏ}Ýì~3SÍìqvâæ Ms)É£…o¯9k x™p¤@ óxönÄ•ûœðØõïÚÄ•«¦^²½d¬³f´¡M‰ö  • ÇâÊ—z"#•F¼†»,¥=ßDz}û/Ð0xl¹ŠŒ0p¬xåµ& 5É2ÿ€'ü\‘¥›ÿ1=Q *“éî wÂ>Õ®–Af棒•VÍÕâ®`'% DŠ'rMC&H¦“Ý]}ÁGö[Âaƒ!ŠsÔU7wáçàœÒP¾-ßdö‹&ÿç<¼þ}íÇl$ûÄUŸ–ó³h;¿øGv%q•­Õ7ú«Èë$ªxÓb5óq};O}Á2ضõJùµÔ˾§Ä©Sœ@§“.,,=˽/®þ¥ÛÖ˜I͆8ñ­ÛGxq%jaxñ¯ÃÜϰŠfKThòš©Z²âØÒRÙRòcj$láw$'4Ýæ­¾nð48]Q—ÀÓ¼ÖÂówp¨2§!±S¹ 8Ûc[,wLBi¯°+œ1 ¶ _zܸù“üZAú:]…ùœO° ikÉH–Ë´<{¬êÀ-ca©¬MÂÀK•XX‘EÏ ‘èÙ ‹©f}Šé€%TdK†Û†·úÊ §¶{ÁŒ×kÀ„´wð̧³À¢7GÙ¹¦ç¤|;,´âºË¤NO¼·Ïëò©?¥ÎEß@YÒ‰Ûrä~,r#?ØPmõøáö\Eáøã›F톻ðE]xŒ{¥š‘€YFdc::mLv‰'Vë¾õ¼tHq×V³*’ºHnúÁ'+§û;Ùzµ—Iia$}rØ¿=ž¯¢¥$ GÁ`ËùôfÅØµN¯ž,žYõ]7GKL>py¼Ÿ¦xB—•„{?¼*àÏX|l+"8x[çnø!NBÔÉÏÑÿºìµOgâá2Xƒg§dWK¾¢îå91 ɼ¹cÝjî蕲—΋Á&Uóé+GYÉgÄuA]§•¼ötH¥0]Âô¼~rC aH_C)N6÷¥8< ¿™* ÿªšg+S†ª¯¶³ÀZF×úX×bPÏhWŠ Œ£½Û4ð Íÿ˜ØÍÄó©t¤¹Ëì¦g—œ¦ÔÕÄ“ÈÀ¥(Â7ÑJÁŠDƒíì-®ã’y)¦» œÙlD¶±ž§d*˜Z?›ºúN·ç]½²+Tæ‡3×£ëÜÕð¯C‰\›îng=Ï[Ùå…)éVI"ÛV)ðÝùð}Hº}Î è±>S|;W”áÃjÔIÇþ¡L¶ð³Új ~Ol‰®cp@jÈîp¸atÈb" .³#éÆÙ[±V,ÖV}~kð‰ÿKÀ5x“Z¿8žáúä±ËÜÒ¸¶oÞt`J–~'ƒÖÚýdt³­îXÈ¡mýw7ËG½¥æhµôœ8JW=Ú˺YEÄ D²ì@n¨ãlCP’§#4Ÿ¢?¸MNy\\yI¾ÖæžÞ½òXç¿»ÑÀï`Ïà«Üâ$„q&×QSã"Zušƒ8E>X¿Ç<[2â«á6$xE$UæbËï?\B๋¢ž¡‚Âý¹a±.ǯ‘qoSš…Á’Z ÅQ öP±>÷ŒÃ^Q(U 2`5W•.‡ŽÓC%ÄõÀºdÄ_èôQB]¼2¬¸þsÙø»5Ò™†F3ÎÚÏéd3þâ{ô( êM&5±ôš»"ˆ§ãR¿ïUm·sõk­Ðoéñ¾úù²×~ˆÓ)œþFŠ5 …Ásè ɲ‰… }?¸Ú·÷4ÜÓÊ}9¿“s¬˜“,d袈v«‡j8´iãØAf0C‡¬Yß/‹4$i.Ê|ÒD‡¾m ‚òóà°hóÞ û‹cÂ>•²Å@±„<÷ì•C2ìÎpÂä%ÃûˆÞº ¯0'‡nñ•jb š±†?—oðúfluëJ8yü ¸‚±ª-Å8²^üÆã0:"ÔR§íö™cdy¾:’), †õÓ Ö®¸ò%õ~Î)ÓþÀ¾´¢G<\me3 ¦œVvµÉ;îÚèœ~B¿—,ƒŸëî¨~˜­IXIxª7¨=tïÌs"ën„†ùVø37P°tA÷k¤˜°A=±•gvÙ—–è-à÷\¸ÊIuWöýq2ˆ Ê=îòfÌ:Ût7)«‡†¶q̉£¨“ømè)CìÊû ¸*3¡2eòZ.CδK/ì_Ïêq â\2 öç2£;¥}´¾ëÃUœö°zÀ ç;]¯ØÁÿ£|àÿtÕwÒÓ^^“ìP±b+Û¿D¢z­Æ‡\«ñÌ×)ß™ÈZùŽ!Äøh.R)È FÇCžAo5ÑðGZt£Ï*•9¹kZR:®Óh$Úî·54ÇC ä<8G1!Ò‚F‚zû<Ô|X¼¨U²‰?fpÓ*Ã8ÖŽïFÖÄÔB©JÅ»–÷é|ªµö¼\ŒæÛ‡à¬Ðm`þxŠT`âº[ë\ä^V»º†ƒ‡Š å,w\Ùò`xç)/,~ò\‹ë#ØÝÍ,êKQEÓóòb2Ö«Üꃡz0 ö´¬Wª¼”ÞåÎ!²Š— ¡ø¦ÓÏG"Hvýå ŒÑbλ ¡$‘,&úá„C‰Ÿ UVT¶‹@¾€``ÆyJ˜ßAa3§¶ Ë+0ï<ÓRPB6U±‹¡ëzûK`86Q¾æâso`ÀjyÕË 4M§5}”úüðó¹Ð—SçU–¨ó2à ínÁþ•~ÑGèЧÐAÖ´òºûåse&iÂAw®s Äý[Ò.îÉôr®¿‰ÐÐUB7‰¹`Ûä|rỊ̄÷Ó9A¼â£ÜCº<*:[ø ùG÷r'ázg7¯µå½¡\³^_jŸø¶S\þý¦ážÕ ¸†Qm= =~T%ÙãÍë´ÅÉvÒ£ÞÚ3ˆ®üVlùš°†Ë8ÇìE›½˜lÔÜß]Ñ g VK–Iƒ­L.8 ¡‡×LÅ£”ðÈæ¾¥„ ;L!`2Ù8œ ‚°ß¾yNùíÁávk댺ÄùÓ­xþM|UvÃ’gy£¦mB@r«e—¿Â¢×™b)’µ5'zð’ÂÚ6¬ n#8:\n[&‰5»–Õêx… ¶‰&åRÙÀÏZññPcSHkóxìŸ{@Ãï¨Ë‚øžÒÎ5Á}ÎÕg~!q\¥ëþ½lû&ÖF©/ìøKCÝV0¯ú‘;È÷e+ ¿lh5ò…)Œ“ðrŠ•©=/u_㈭XÐ#ùÁ’#R®Ã%·š—S¨fæh§,¤¢B|q¿\zBGõå*`ܘ¿D¯¨ˆ¥ð xÛ×%‘ÿQidȉ°Ë²žú’HÄw)y…™ Æä‡ÒöY¼Ò„Cxe—<Ôh$K ¼Y )š§ ÎðI_xfÔª¶^jyœÉlÁ-í\սɶšöO8‚ «†kÄvcX‹OQ÷ U°TÕÛæƒ¤âe•èo•ûþþnªÛ[©²g;l¹›Ü>`ZÁÊbó¦À«eBSœ-¼}˜r¤> ÛäC:§Š5cæ_Æo¹ª^oÊ· ƒÁ¹±ÿ´³(‹¸`ø¨¯­_Ýlh-b7MKwVáfíS¥iV„4\tûÍà`§5t `vRöZr¯ÔI—Ü© H<ίÀÖ9$pÕÙ vȇœ>ž©n"GòÓzÍ{ÖG!j.QâTþ׎AŸ2äÃÄ|4Ä"edŒGˆ:Óìb²¹˜ v yñG6î½qˆŠÉoc\Š,ø'H³dÑ:k°›œ¿­ý³%°ÐsÃmxIµà¾‰Ù Ì!ë?¤ÊYmðÔòˆ£vvéúĸ¶Z"§‡…e–«²º} ÅÜvaÙòñ߸üËt/¡­›y•äßáôÌÏ)hÂ.ȇ¯m é{nÿ´<͵%šˆ‘{¦'5a;¬8ÏÁõ å¶ÐüÙ,ùòÝ­Òà?ž²hÇõæšÐ/œž™zéé~„N¤Qó¨Ÿ48Í”„ãVGëù˜˜ËÕû 4Š ÀΆÞpÓZ¦-ï©ÙÑ·qòp}oÞõ”ÍÅú/yûÍóbµ4±S±#ÇݲÄ(;r&º©˜Ýb4ø]þ‰(4ß«ä"ÆŒœ¼ç8Áúš¨ËÒ‹™cPY?W ´_GhsN8Sjw&±ÃayœqyóXUxì&jŽÜ°t¢¿ò-5 ‘óa±d´)&üú‹A ]x7ç¥UÏ—+\ñõAk#PA²|õfqãº>L¥^øå HCN¢PnTìZ}1Ê#£ä{~Eê/°Å8iTÞ‹¶N,ò~|d Jå)ÂŒKåK~š¦_÷Ñ¿cñ¸”‚w}Ó<ü ê†ÀÎCÍI½^ס5Ü]ªÇ#è\3ýUŠEâ@X£]ìíÛˆéÓU™…(¢ëÀ”Í/ÆÃ7(ÏaªC¹Da¿ ~¾g DÏ<}v$Zï˜ò«Ÿ7éü,Û:0ý§Ù1YÖk€S4q¨md’cîо3¿‚§A8×ê1FQ‚µoÜÚÇmCü-Â¾æ™ Æž‘Ð ;B'•®Yu®¹ì|v&Z¿~YÿÉÓÔ~C(Ñ5êž¹ÃÛ]3Œb}Ñ‘¼1üÅc–ƒõ5L“ĨažˆÍZéêðÚP_ˆžâÑQ1]™Œ÷AêiÜ;Ÿ§àæ ûkÆæuMÜåØrÔ™o’)>?“‘ êúà(É廵ŸÜKqЉ̧ìÌö͈1°¼ªÈÕéÈN}º¯Íö°B^Dej$¤hÑù”¹`”žû'¤ý?*#—Â¥Fˆá9ýƒ81IR€{®Èû[:Àrå«CâÔ%ÂÏ©›ŽûX¸ð`Õ騦ð!w÷Ð_NêG~t:íjåÃQPz¡ ›µ—ŒåùfõU' <ä} ô»Rš‰Uõ|n¬Ìš‡ÅêrU‰’¢Õg6M›-ÒuÎÃÐ2VfYáq^¸k>â¬3?úÈuý|¥<ûûžÖÕÆŒ4ÇzosÞØX ÏZ 3X¼í¤ùÿH÷X?&oÉMǵh+—¦A—?uèK³~æ±ìÿ 4ŽÁ»&ƒpSǘ€ºƒr1¼šì?¦>…²ò=!Knr?ª•ü˜CD€„.›´Ž.Ö ¤þ5ÝF(ÉÖ W•™ör÷ú3õŸ”4\~hªÈG=UÚWç=ªai§3§!ŽŸs>AZªû¥‡XøÌ0Ée í¨èi>2~·“±é†e³¬·*·u†x…™R,z^ 9LùgÝód#fê´fBôm—0éV/yÖò)™U†Áj·cW°¥jYìöç* ¾6㥣ý{¤+}“–@ßÜ03¤t/ûN <Ìq$MB ›÷£êhÉ¥ÌF$&Vc$æ`äÇÊ °Õbù7Ð0Ö¨Gܵe™ÑsEZ)K“…Cô—!WÆlu;»Û PŽH²MÉ ’²Î;rãs–{œ‰ÖÄOÍeÑ1ÆÏ48ÎÆžæMÆfWt¬d…MÅ|…áMˆ-d,2)´9™n㑪QË'FüÁVvç›{J(ª ‰³žÕU‚Ôîªü¯RÈI¿XàíŸn…!O'"Ò‡ÀVÎÈF,™öW(´?g«MøÀоÂTÁH UV%Gù~ø@l®†?ÜÐH-wƒTìªG¿#šÐ¨—á›,Ï‚~¿DfanÅCœâFÿÊÂïÝza±fù-9¾6Dì¥ ãÁÁ¢,^ÆÊ&pH¼¯…˜@zϵIêB"á¸(fXœe{dá.‚ë»Ía% ߦX%{ƒëótî¢ëÔ5‰ =mò×ù?É zDU±àU¡Û²ÐõÔm!ßÎò| ö­Y3J*ÎŒÈöŒâ¹` À0™¯ 46†“\ÍuEA»n®¥Œuév÷¦vÞ©’éÌõSvã”Úy“5ÑŽ9¶áÒ@.Y™>N(™â$¾ƒ<ÌCÕ¡¸c‘Þ‰°6Å»§Ñë[U¦A\fµÛr˜Â|â7f G¬TA}»h»lm×z‹Cc’Í~žH‰cŠ¡¨ÿ~–¶­æLíDRO÷Ò˜Róã@]ýFš 3¥ðXnI í…µó]ñ6Ùþ’_7ehÓ_«Xú`qD)׌5½Õ¥¥Évæ ¦VÖ¦í1SooÈЛ»6>NQy·Ä ?½ØRG,ÂvþZ1WÉ5µ9€;±õñ^1«Qæ*AÒàÀ¶%¯õÒߺ²þtMýβLë}•#Cá'™¢éîùÚ’ü.È«ÉáœÉ2ôocÑo|€øúÕ]ÌÇYß6«¦á§µˆ’ýÄI6Ð@+܉6“¼ÃÛGíÖ ¸_ˆ“ëœ ¯'â}&}v·Wõ"m_T1owh™ÔrÃcˆŸ(R*Ûã‰+ÇƖâÂï#SÃPø¬»ù¼%etú6Z1mPß`VPˆrÝFsoÜpžŽt0w‡°¾¢j–>òßÿ©Ài3ß^öôk¹A“d=,z‡Ç´¥œ…TÈŠ3›Ú^¸áY͹êö½Ïüx›[ø£il“R4‹ºR3­"âîE5þVYÝFÔçÉc(éušíšNa¼É‹pJSaAOIÈ¡Yƒ¾q¢A'Í]%yx©â‹ƒ•%¾¿ÈmbîÚ¥Y¯ ,N²hÎ_Tö}V8çÌEƒélCyá—néñÁ ÉPÅy­í£(”}„¼[5DcW¯œ_¦hÏWM5¢CP‰©W'Ú¿•Bµé£U×'vßäøTr23¯ÔØû*ÙñOõËÊ›žôN;™$ßLK,I©ÇÊ*†Q6á®w/ÑU¼¦*Eˆ»Ö]ì+¨^a]XÕ 2åQþn oà30ä“t™…M:MÑÊN®ÕÑ­Øbù¦ûö[ëØ‚žë÷Ôþ¦ãöû>=Ä*Ð#Tà58C—[×P¹f¤C7DmÁŠGyX¬þ|·õæ6? ÈbÇåõ{Yöt» Ó+Ì˰>ñý)yÇÙ=ͺ{b•ûyµ˜=¹‚dPïÊÉìÙ+Ðú ÜnaÊD1ù~»4XT^kh3dtãVâ2Ÿ“>g` \ P<¦»ò¡0ç;#Òd¶'Fþî jSÙ¾uï‘ôK›Í-ýŸpÿ?¼º{W‚!CŽjO“4Gì¢~fçM…e¢Žr ¥ÎØ{ˆ5-™¿ÇË)›À¶Báôþjÿ ÂL mηÏ"‹ËQnYEÔG):†Q@MtG]Ñ·‡$”[ ÀQ‡TÚQZú…óàußú{‹o‡£ôË~Z«œÖW¾·¯;DZ˜Z¯ÈQàÞ¹ý¼÷9؃żk7-üÖ•x* î:Ö^»j0ØLOf;Ä×ѨX*¯ýñkþBX[m 90g= |K¾¢}FQ½R~8hÆ‘b™ó‡yõ8>õ7ìôºèGW¥ÊÒÞ˜âx¾¿Î†úUhÅñQFÀÌR+Þ Ì`/ûRº¡wòh8¬lbÿýz"˜$aAõ—jÇ…pðV6Þñ K[’y| m¤Ï\¦7ÙnMÌ1Æ#cåZðááò&ñ¯Ã×àÍñë+“Ë6΀-&*Õ-XNqw¨š,É佬?hø^?ú]I©ÝÚDY¸ÂG”ó`ÁÄœ}ø(?™¶x‹Q»&‘!òèP^éhJ2NênLjí¿ÔŒ eI'|×ê6#áß|›T¦¤7xéìšB&yBö;`žZêÔ¶ 8Nsº!ɌѬ µd?̆ líRÃc…ÿQ¹6)iM^e¤Ï_]K*çÖðØ`Á .AÂW®á£‹‡ƒ8{æ<ž…ÆÄ*wŽ¢ï;{3C®á›—œ÷5!è%ÀÉU—$ äô²Y\=*§¸è²èb«Ü$¿ÜªßánïgPàwS o'ÅI²¸E«;ˆªè8‰•Éz Ûb+†É^Záz1( Šç0Íź—7ä¨s/¸@£XM0Ó‰/Ä>ú|»AÝnËè4!V!hjp†fw­{«><ŽCzíõ×>’w0V5ƒ:iÈð'J³úRèÐÝŸ2)-ħH㨬‚‘N㨾S^•Š«ž©‹&er™ƒ¿Aâà…•ãLâT$ªEõÕÁY‚òó?i.b‚‘êŸW}±¢(Ë•Uà¼æ·qã˜ë.4á–Wð• ï*OÀ¥q3ªyž†×‚Ú/‚¤ÌÔ¿ôz†;š•S¼Œ†Óa#\Ù)ìÆéw*úHR›Ž:WáóåWªÐpÞf˜Úº‹b2p±›‰¨ñqÞwÝpbò´2œÑ°£|Måê éÿp†rzø_²VS¼¸Êꊻ0:ÑOÚ[ö|¤j¥¾¥0i¢öbj¹÷ÑbL1–Ø#¡j–R£Õ¼Ò[¨wJŸ\ذøF—«ôËž”Í0‹B«çâoÏ×Èßzf8€Yö±¶'@rdn>¥ƒ¤²”_üB|eE©À@FËÞK¹#N£ BRt¥ ªÁ³×ïduñ#Mà ïfð!¤4ø˜ìp_‚Ï‚q¤·œý‰uŽF^ vJªPTŒlÊo7w=hþŠŸ+ZYi—É ,l{};凾c¤fD X)ˆ^7 k9`QÚòõö«â z͇ƒLý†¤J*Cj2ì;ÙqŸ6e–êìy@ ÷ë¶»E`׸NÑí)ÉîHòdö¼9̩γ¯Xí°­Ö‚ô.Èë ÆñÞw¬ PÇ ƒ(~¦%ßʳeÎ $µkóÆlÂØ@b<$ßC+2ñòÆ7@®Ù'ëPÊpŘã­0ñ¢±c% _Þ:ãɬ̲¨}€ÿäD_óÍ%н àÍzhûUòL}ÆoÑ£z¼š˜[¤HDõ­” ZEà…Í,ªuw¯Á|㈠7¾úpfD—ÑÓÒÐJ4ÎYúoIO‡ŽÍ4 Í;uK†»|oÈJ&¡¬4âTÙÆm¤&“¯3À,4Úk?¤‚Ðê…èD®ûâ8–(…`ªº2û³¶gr¤6ãnr”°¥ ž@ÊÄüªˆä” ­êÉâèW_x-ç_³°¨ámÌQ¯ŽÞ„–3žO8 ôÞóg<)»›%|;ÆÔ¸šXaJYþÀÍ­^ôP ®Ê`üÉ[7¸‰9ãæ»Øˆ®zšÉß™oœy:ÿ'v8þU«ÃŸ–“‘—.á|›Žê”¢Ì¼Køa•9Ch&»¯B„)Íä–|§(¨*W'=4ëÒ9…xóñýÂkP¤ ùAi­å\¡Á=S?‹¾Ç@toC€® ’x•zR±‹MF:èçŸðªÊ¸mçˆÄ“Nç 6'ÿÅÜ/öúFî°Ï±†" ÉŒJ3þ¯ñY´dbnš_"ëk½'­K5‘Sä3雃ýyÆÑýÎYëÎkó:Ï©(ð%¸MÀÖHŒ qÊ^VÑ¥å{;jq¦½i„ÃpCVñèmNáúDÆÙ“Ù‚­LÒÞC¸by‚·Œü6“:>í~¼òŒ9>üÛÓÕº`ÁŠx¬±µùŽ*Í|ý"º™ðRËáh[äÞ”¨?Ödó€‡mjÃt³£!Y_ŠÒ%~ЛC;˜ Púß ÒIäÓ¶üùÕØ?w¼Á¸–'¯V^ɦ£°¢‡ÉÊ1 T±)¦êjP9,½Q>—AÈK§ùìÑ®ªÊ-Pvb¶ÒÛ[DBºRý¹%ÄN[+¼¯´Ÿm;¶gŒ½Än gö”?gúãÉF¿-Rvã×áPÜÏü§™<ªüõÂÛ™ÝjuF>Að¨$ ϦiGÉÓT²[ƒ²2^½3ÝÜ:Û$ÉXÞ}clA8/“§,‰qð ÛW{ßGy¤èl%â& ·ÀU:N¸‡ï}¦J%rÈ|äê²™iôÜ‹›ÁDÑ­7$[¬u¯OúxÆ×–.6:ÍÓ?I-aÇ"Ø& ¸ð׋a8ÁéÆÙ'Öà&1„CŽç0ÝmlGàÞYã‚F^{î`ε ¦™(ã )å&V×JéFr&-híRÉßËwv—"/·5åÀ·uÓ,tc²ì(Özu¡ÔÑ…@›!Ž,ñŠl3åÝ÷:­ŽtHƒs޶;Ídü’€° ±l[È£¦Í[ÆÁÈ´ÖËVn脜à üa»t¦ëv +–I×—GÃÙÖ#–…yö ¢9¾#ü«0A×a¤ 9+³¦o#•ˆ;ªÐóð6ÜëÇ2™*ýu®ºÚ†S?Y¿R¸d^T‚!—Ú^HNžíÌ(뮈«Š‘ÔÎn>úq·&4ÿñÌìJŒ]ê†a—=zšæêå—Á¤R-¦ÞÌzì­ÎOO"¿ôç:Ç%á` ̵¤J ‹¬¾Çvz§ügh33_œ~*ýAö•œê•MÁ P>ÓôLæ‹Ý[ìv“õ1`(r€ú@EþÜéÿ( ×óTf¾r1(ï;@ SŠkŸ÷«o¹âB‚g’~ÄgSþ&[ Ûì,aõp7:‡“¨s¼"+‰´:¼®à͇©=Q7ºƒÉhq×5É…Ân»±†(#è\ÆíÛUÏÔͺ4)3¬÷’h2©8ä7P h@›õ&ê{ÝÇqªKÅ¿%]ä‚ ²H"õ8-®µ+ç¯W¼Ï¡{Œ°†n0Ëi>yñŠÊ(³W¡1št¯ŽsŸA`“Yî̸™]ÿ@Á¾âN0Ž®¨ÚÒ2eó.Hd,Ø·ùÂ}S6¸£¶2oö­´j©òåkQÄ–%Ëaÿ¨¦¹ ¼"ÚG&ø»¬ñ³v¯¥ªÓ«Kdã~¤1¼ $åh[Hk°ö˜½‰éR¼bŸ¡™n<­XÙõã}»mÿT !äŽÍú8Y͉ˆÂÿlrvc9SüÉ/LIvUI&Ý÷0 ÖPÊúÚï:à¤ý1Gzaç×4@ÎŽÁð™¦ù(ýJÇSè‚ O/Dé^pæÁ“[]/G#ò<Ð~˜HÞNG±±1çÐ"Ô$ôW ð€x¹^_YØjƒ9iûW2ÏÀ÷8¥%Y"fƒÂNT¹‹_aöl¬ÕÍHãÐýèäøíÑzÔly<Çïüî1Ž·r'?䩲ØÓŠ»~–Œ;rÕø&à¥Ö[gïÌL‚.IûáË©ìÿð•2`ÅŽ1Ž¿C}¥øÝ{Møç«rçÐËÔ“üàÔ%Ì ¨eÃP<ϨmªlNšËY Ä»îÔaàim)’>I4JÀàä1q,]éE@AÔm[‰ã0RfÉ©£¿:¹Ñˆ?¶°Ž2u•ja·”°hd‰ýX›êùüþ­Åì1IÝ*¬Q¨‚Õìê›–)ÌÚî ê{}ãWŠ“Ò:vÁ|8£iã¦RÒ”0Äå–¨6L}ÄxÉ%UµZdgÿ¹PàQÑkhCL¨–ït¡}9¦º™?‰A±?….Í­ü\ÝÏ•èÔQGÞô_±'|\HÅz%©4lŠ„zw½[¤#"·ªÊY„â°gõd)Ì©Ž†ó@äs Ö7á×ߨ`Q@€Èž°=þ-¸ÌêQ³a¢òTGaHíã›èYá¤a~ÿ]a‹ÊÙ†¾É`Ëjœvhë4~™M ï>J&”¾ø°7—-¯åŒd½ Úª ,ŽÂ;u çuŸÀ©­ÃÊH»âWÀ¨Àå9°YB)dÇhßíeÇæ¦ùÛÛ‘ŒB?iõº•^Äò¶»rˆÁwÓÚ0@Y(m‰’Ê.ØYºÝ@ŒÜtAŒiä¨ R27oöÎ6í9ÁŽ ÙÞõ2UhpÒ‚Í›üª&¢iy€&ËðöK<ÿ*(©ö³1rò ±œÊ$ùž1vÿÅ‘g8 ¦9–Âägƶða¢oýœÚ¢óŸ 9QQÙLÅ­~b¡¼2¼")©Ü` ùþl.M`aŽ9ßÑ_çõ8´žùTp.s+úii‹¢ÍmÞÐÈü"öAPh¨–cñâç#¿…«²Pá9x½ðõ0Îe×·¾òÂïµ=& Üèy>&HC~ Û{Âΰ-ùE¬vÆú£€Çk Ü‹ž6ÓsÏJR¥bìU/CRë|œó·¡bÄíü¯Nè7Üïù¢nÎËúãÖ 6-úÓï§÷€9zª„F…‚3.yèòì¤ÏšZÜó¡&¹Üå=´ øDŸS2J ›Xó¦̉ñ¨6æösZÆcÞÖóØFò|xŸiàuWÓ˜"Ï Y.ÓŽµØ¾y8†jÃ*¥šóZ ×ÓÒ„ßšç@î÷µ´EzqjrÆoVfä¥yJ–ÖƒÈ þiD$&ÿ²®‹çÉ;šP:Ö¢ãô¸¨ãñ)÷þ½v(ß%–‰“wüš+[Ú· 1›…\¶‰KÑBcÿ“À“_]§ÿ³úÝ;‚±É ÍgÌŽ8v´µ¤t™X FIwô(±mÈ#Ÿ,taW˜p3ª ˆ¯ÇBŒM2­²ºW‡Do†É@Œè°¹Ó»u9ÃK¦5â_nP¢íâ8–¨Q4N.U¡˜gÖDŽZ<3Œz M CìMC¥ý"Å®š‘³Ò2ŠmÞ‘oVXãÕœs£*ñvŸ»À’h©àðCUïÂ1õägßC’}FøòÚŒ™|“ rž‘‡.»ósÙ+ZLŒsá#ðô°m”™¶-_2t‰f¡§Ù YK\ï N3‡:]¯6xãõÌ\üINIãüK5¸K£‹Í>—f6ãVÞW…ÝÀÄ ÒcÚTâ²r0ÈÔ¦b<·Ï¡›kxÃäLìF³Ö~ lmÐÈL½F¨ÞA$Ìàòox§<,×Þ2Êщ3sÎ]´&Cª/Ýs¨û(’çëGƒÐ6 ,ä‰ R‘$ÝmÀB›Ðç§šŸß_ %¶¥þj|–)8_(ã6Ì=ªÕðâUÊ}]¤„8 endstream endobj 69 0 obj << /Length1 1630 /Length2 10669 /Length3 0 /Length 11507 /Filter /FlateDecode >> stream xÚ­yUXœ]–5Ü ÁÝ‚Cpww( €Â w®ÁÝ%H‚kpw îîÁ!ð“ïû»{žž¹šé«zÏ^{¯-kŸsSÔ*êÌ¢æSÄÞ…™… ©¦­´µšƒ! Ìj; àÕü™šZÜ tCì%€. ~€6È 2ppØùøø©âO'°¥• €î•ƒž‘‘é_–?.SÏ ¯‘Î`K{Íë‡Èâ`²wy¥ø_ªƒ@+Àl ˆ+«èÊ*I褕4Ò {Рâjj 6(€Í@öÎ z€Ä `û÷`±7ÿiÍ™å•KÔ8;€ÌÀ¯a 3È àr²;;¿~ÀÎK' ½Ëë \ °½™­«ùŸ^í¿ rp‚¼zؽb¯d*gg3'°ƒ à5«Š„ÔßuºX]þäv¿ÂˆÅ«§9ÄÌõOKa¯4¯¨ lï py¸üÉe ˜ƒlž¯¹_ÉœÀ•áê ¶·üWL'%ÐÉÜäìüJóÊýg:ÿêð_º:8Øzþ ùËëŸ5€]œA¶,Èì¯9Í\^s[‚í‘Yÿ¬Š¬½ÀÎö·ÝÜÕá˜Èé¯ÑýÙú×"€æ{[O€9È™U âòš@÷¿S™å?'ò@âÿˆÀÿyÿoâþ»Fÿåÿ_ïó¿SK¹ÚÚ*í@þñÆûÿæ ´ÛzþOþÿî© ú»Èÿ‘FÖø: Q{ËW9˜ùX¸xÙøþÀÎR`¹ ØÅÌ `´}Õ_vM{s“-Øôªé_ã0³³±ý¦a6³±ÿ3ü÷C {ó¯ÿU¦¿ªgÕS—RÖ`üoï*³ºíë~³sóü¡òº .ž ÀÿO§­1ÿç៘ÄàÍÌÎÍ `æàå|½€ì>.Nßÿ!÷_Dìÿ:+]œÀ}666öWÒ?¿lrÿÓ0ü7I{3ˆùŸÝQwÚ›¿®Û? `3W'§W•ÿz^ÛÿÇù¯Å<@fÈ?ç fÁÖi™é.Õø¹ý#ú=]ì°ý!Ÿë4Š *!þiáë|&OU!,õcüÏ-ž³‡¿·åvºÞÚÒv¦€NóI|ßÑw`­Ð´ò0î±}FK?ÒŽö>›QXƒÓãfÓÚÙQU3*yB kåtB<»¥xçV€Kuã€îg–Z‡×†Y…]]xxD“¸{Cû}ðG_ç|÷61cNµß/ù"ÉÅÓÄéªÎìþÁíý§;ÓxÖ6í²–t¯Ó˜Úw–k>°ëaÈÄ«êêÕâ±mœj™JöÝ´dytS¯3a­ëHÚÊG!,˜´—wþ:›XrV}¸†äÎ+Ãy'©áu>¥/ƒS¨ï;¶¾;õ«FÒáaf±ÏÙ2±ÎÌ#NF]tR¬fÌíƒÊ‰0ßJKʆ¦{t{Q ¢#ÕyÆØzí8Lq¼jå N”k†ÓDe9µñ§M4VwŠ’ä<ë5ŒÀû¯m+èr{"ý›Á*Žú‚Ö b—nµ ^vè>Ô'…S†r"Q¸LÞ-ZÛkœ` »-_7M(ú}ª; oøª'{hhB Å=%[Üßg¿EP"ƒã‚ïçö½¡ Cøp[tùI°×*û7îj!s¾ ¶ +m"«g·Êß¶x\É,éxƒªAùéåýÅbƒ»—ÐÐHó5ˆ¥zÛ$½xpóÀd¤%e ·f³Ë6HöêóµÃ™CÆöDå;Õ='m¬9R#MµK[Í3U·ÊﮆuneÕl‰zd {äC¥}Y™±Bï’'Æ–õù±wkÙ9tb¯—õ5!¨‘á#Ò4$c³ËÃ1°yåÜ›ô ¾À^ óB×½½‘ßü¶)|ëÓxÊ:ZA.B²þö¶ÛJzX{; 8ùŒ`š¶£öÑšRÒ„*y¤)„øûD¯|I5˜tÀtñÔúÈ{Û¿— ¤°Ñ£ië*§Â„´þiÑ¿N»Tn•;È“—‰RWI޹ÞÉo¡Ý.¸„ÎÆLMï`°>¾·z¶&:[¦®Pæ=ƽðQdYFü@‘W°{èqfk‡7–“´÷‰§¡RïÉmz˜0€µÛG(ù-¸ÓíZ©÷[¨Ý0ߎ(ÀZ-qwÓÜTj8¢ÒºÔŽ`²Nkp¯W<ûèÛ>®+\>#`w{{m½U5€a‰BŒå_šÿä±5²) ƒÏmÆJš¶4 OT‘ÑΊֻ­÷áœè:‚|ÛjH ìcSUVgDߢ¼Ÿ4¬@Ð1~9eÛ½XÝ‚Ê0ä#Qɶ¢cE*ÊDbU7‹`rK–ÞâyÔ=‹¨U K| ÿn6 înL·â>â)Í~WÜ>ÖúͽˆN:nÞAF¦©AøtGú;”{MöVm×÷S['¾·˜±”6Äý¶_}ŸªðC4£Ý¦T—œŠ7¯œ9ÕäèÚ¦Sv«IïÍK{t÷W|¾O””u–ËÞùŒ7ÏO´d}÷VõæØSɺƒvï Û_R‘Ž+ûrψj¦×¯>pÃf†¢+&j”ňò1¨a½ˆ>ÞîG›“ÌÈÝž¨ ?(ÐF²<öñ^/dÑÎ˾#ƒµLßè$¯ZõcÞ‰sŸd“Ï+°Ðƒ“Ýý)¸Î/$R×ëC›³L+Ut Ó²g ÔSÒ Ë¹ŽþNö6ÎÇ4Õd¹ð`NeJÈ.#™á8ÈóÁ­:ÌÅçdb9brë*–ÕÏ失¯ë×0„ŠóîjœyŒöãLM ¢Œá ÊèS«,²È™å<ü|Ô¨ýy<üæ"p€?zóH@û%Õ1ƒ²ózš$Ëã’)t‘Âó¾ò^q®4”¼mÇ|ù.“»ø¢ŸâÞ½e«ñ©ÑMŒ¶|xR $A9?ú6,ñ+£v¡^¡€>œ—º í‡löJ‰Ø„r}fî&©|©d¤âç«g#3o°º+üé¯û^DÍ~Næ‚€Ü\?G“SûÂÝýGöOM ŒÓË‘aNè½Ô|#è_ßR|Ï!NÆm[ŸGJôaô%­ v>¥µÖhë9¹ÛÌ¥Òö ©¥³7/sÔVf>tZº1RšÐ¦'Zw‚úé?ë2|ÊPŽxÜÜ:}Ša¨<Û¥»ºó ìj­ÐUFC‚[ã!Ô1_8b,tepI ^’AJ'÷»ÃŠùŸ:ä­NiGóhŒ4¹Í¤_À|´c°‘1« ~I-@LêCwåt™£¬çfJR-ÇÐWZ&³Ãhf qÀÎý}'‘¢@1¨VÃêð=å¹FrÆÒq= KTç.õAÕÒ"¶¦çů~sR~kÌâgÞL¢sœ£áò­‹R”žoÐF‚ñUA³\l^Ä~NÍo„›%ª-ÐÞÝÍ_—-<¸êÐȓϲ¾°1ËÝ4¼¡êwÕ®Ïöl¬ªl<šO?Ÿ3ýÀpÁ€wN¯³2FGÓ0‹‘Õþ£nvR"4s' *á‚^­f¼Qtãœí,Oº|G€yùÂI QùpþfÝ(G6ûMP$Aˆ"¥Ù¬¨óéÅ_·ˆ;cAÁw~Ó~tÖ覣‰·tÀûn¡;o§?çÃÉCÿ H×Dv6c« =‹Î¿µähä±Çæ}»’xþ\’ã˜Í¤ çŽìoa?síIù…2–3®J&!æ½ãÁ‰|JkËéÏœ·y`ÂçlìpßËß(} r÷Ð)¤o®Ÿšd£ÑË.÷R”¿Ô¤9˜öšªhò¾›FEÙ¯üIuÀ¥ÿfÕ¼’Œ3 1b›êLN³fizÚL%DwËF쎫̺EìQ·š–*s›HŸ`3…ÕiIމøÕGAò­S¨Žã'¶½bž„øhPLÀ~lá2­aÚåÐþ³¹jùc¥8$W¯ÆŽwÖÈT¿!±>ça&2R€­vר!¸¼-Èâzñ´ÏØTák¥]A¿/U¬?çÎ¥Sùh8ÎÚ¬WbåªÚ 5óöOŸ‚}Ù ìèó¦áÎÀ%§õm<¬#Kn¼Ç mÝä>ß¹¦Í„gÃÝM¡E7ry,S z©,ó6œ$pÜû4¯:3¦Üš$ßs‚$æeâSÐn¿ˆAVQÔÅË¡5Ìí€ã}ß¾šRç‘?3«AlÕ—kÆÂZIPõå‡dèôŠ‚¿»çÏE„l‚¬â¯Íç§qÖ›xwš†Ý]óÆ?$¬q·pêÑ*+O½¾–³xÞòz.«”z©Õn¡ä$‡tÈ4{I‘÷l’ÉfÁÆhhRû |Á_¾ ¶[Eu&ðÕßû®ˆòG§¸\öÂÎs˜ÏN^wN{Fx`©yïaŽxØó¬Ï2 ®S0Õ© ÎÔËfa<>Ñã3þU.Á:¥Nß_KKúÝÜå~º,Z÷å WöþlŠ0¯Ñ'£_H‡QÐy‹ %C!ÃGÅ•°¨ÁH6†< ”o¼K«ãëæZÇ䣸D-Ã@[œey)ÖÂêH(PÀòÜÛÁƈ'¥y\HMA)¯”óìNy\­œ‰/‘ân?õ©ƒÃý.<|³)ÞÕAZ·wõ|‚p4¢4ýã]\:¥‘ÄØ4‰ÓÁ>pŸVHç®#ýCÜr7a3²QodGƒe7tÓ[±žJñ{g½€«Ù€ZÙjWé¨_t ¶n‡!.41Cð†ÝÖrVŽQüª¤UüÛóBZ¢>ƒãL¾8•Ö= óv„Ï­øAvkÐÜn‚q¬9|…õ¬º‰ÉÉ2×qÐ2>Ö2ÏPËø¾#(>s/9Mó©òfÇF™Y޾Ñj ìíç‹K§*žh XEÖ]ô%Òßå}û§¢!¾ª©Éµ§.aþBl‘Yg~.]Í9›Ïô•´]ÇÔ³„Ä“”¡5ú>céW×OË*3•å,ÊÐûBY,Vš£<û íäè´=ßImZÁôCÈ)h®ëF©¼êJ}zˆˆÞVœ56ì{iV“[<Ï÷Äbë PzFü¥2_çBñí¯úA13%Ôõ=Õa9‹s'”Coæ»0 Âr C]ißdK¬È\œäÅn¥Pz¤ÝÕmgv “}?¹÷üâ:æ¸">Û›ú†™élÛP°%· ÏÕ$È|™þNîóݦ‡< sÇRhå´bÌ%&ëÑg°úu"ËüQ³<ó›üŠ3§ü-µL“@Gœ%EÂî—ù¦x6ÄçªQ÷É”ò_¢ÚEW0óÂt£Úîׄ+²TÒ†’–º+sˆK'5zæüÈJOÆo¬51¾xd·©ÌŸ ‹ {ÃøîÈ5Oð6Ám5ÞUs+®^ì·¿¯z“Î]?'¬ˆC¢Ñ`N +aK¼0÷‹ñÚ{}Eɉ³UœFÎ+#˜iLx!º¦¢°¢ØâKÎH¯“…›—ªšI·ädËð» HÂÊÄ·9ÒÑK2Ònô® Ú£B¶k9–Æ–ë< Ï)Q\¥<ø€&ö^ (§Ãv%UN]Ï÷R§<Õ^ížY– ÓäTOõ‚ ;ž7•O7×b1‰ª‘"[HωiK“[ôûÞ„ë+a°–Ie%Å‹ê˜; çhä´þ)ü”-‘ÃÜögf¤…°°¡¦`#pçU­¬;^®n‡G±¾DQÜ¥îZˆ­³Ë?/èy÷wÅÓÊʤGUY‚Z´¯$mãIIN.ÒÜ‘Ñ(k†œöw}P{š€÷Ò´¬;ǃ ‚†ü{EG¹C þXÁ-ä®l… ^7[‘ò‡$ÅŠ-_K´~Nc±‚¶ 5¼°ÐŽM³êÅC+ø÷Ü©c2^Ø[C63âDhúOOó¢¢±@ß“'tw-;%ÑóZL| nYõ·ŽäÔÛ•íÛÊT/òiû{ƒiF$wìSìÑöæòæÏãÚ×§gEïZ+·àY·Ìš¬ñ)î,02råø’Ç€<Ì+&{^?Ï“XvÛc°•i hyý¸P©24fs ²¹fS„©ºû”“1ýñ„?<9th¶qŸ˜êø2óyr© +°{£iïœæÖK-·!Û¼Ä^¦¹?$†”}]?˜µH gZ V©ðZ·ÜeX“M æ?–yúœóÆ»]gDÎ< ÉäRþ>¢–ê›é¢)3´œ0ö¤s?×Öd$ª–|›­Þáî«¥îÝV¬É{¦ÇfPG+m†ŠCÖŒ«\/ýaÀŽúð¥‰VÚ­›Z~\ÌÌþ€ùúr®Ÿ-™õ!Ù´¼à(·JÔó…™ç+¾Ù'ް4s}áÊNç7øµ×kZUb4彉°aÐ&´4éñµXÉÞÓeÄCY” ›+º(6^úuÂÝõ»™¡øž"~ЊÇ5ÐÐXé‡)b`&5‹5YøW"à÷)&¢)‡YÞßA°ÉSýÈe8@™Sœ Žw’6$MÞqZËýÚ3}Y«t·Õ¨ôãZÏß·­ñs_WÿÆ7㻜/qðø-7°.°]dŸfÔóÙñt¡Ýo܃žÙ‚‘,~µ¾ê÷K'<ƒ]—Ö,û•IÓ}yݵÜ=ßÑó9ÉYÚn\j8Æ$<—ÑùElt;§™Q:Í+1ä]´Y¾®e_ƒõ&uü]x ÷FæÏpûú`ɱ¸PûÁp,%£Ñ<ÛVAŒ'>D’Ô¦P‹ïÓ=à)}WýýN8uáò:Úç1˜CC 0AÀéŠM:ƒ3ÃÑ&»!†-+ˆ¯'' ’ƒ.TE=Ií'TdœÓ@¹K|çí›Uî²¾ùs@>æC ‰8bå-Ú'Hº±T! †:Ë©$Æi§Œ3=Ré狵9æEº9ö>ÝÆ>U>fÿÑÀ74»Ñ^¢ê"œìw{˜“ˆ{4œrιvKM2r7Cp‰„í±jazoæí¤6"}ƒ”³Äzu* g‹õü:-\$½~Q¨¶ÖiùÿæéPR0R*êÓŽ;xù¬A)½Ó}•ÞoX-)t“^N4Db“9êð8—»Wq-hñÍ™c·.ìLàvtÙÏý(ø•à{°Öhá -ÅújåŠÄj¹>3/× xzòyv³¶l^Ë•©Îs°j6¡O{‚­X©{ÄÚ§žC½x»´‘:M¾Š Mc_d¦›"ZÓ]°°ɪ-7£#áB…ÍV5”3«mÝtÑ*Èù¥A—q[»±æmŒPÊdôî³²|–çåÄAã%6Ô;„RÏßbá„{І&Ì·…Uˆ-'&znˆÌ#9Ζ û&$õÍ »ŠšÚ#äjÕ˜"ªv0óÁ瑟È1ÄäFa%m?@qìÚ4Ã(-}ü¼ï™äÙÕàçK`%d*Í©. èþCk½!­É‘2Á¬…·0¹{îv(z#É™»`0á/Xs 41"¹NP$a{C˜àksÈð VãBµ{ÉûÂ4jeÅUò­Å~ýÊ9‹Oï–r¨K¹m)CSÌÚ° îC‘Ð#V)‹‘ØŽ™¸øv‰Å?ë–ÙînÉê;-y;Ú ~%wSbš´6"«}W«R‰Ó¼XyZ~¨aÃÀqÒÂ+Ñ btù¶5ÎiØmÓôKÕ]zCP`v©À¾.£]Ån"Â<×—0×À ³Åço•Æ>sm R¨ÖN*ŒBìm>ˆCÍj:Ž~êGáì™h:|ùˆ8­»ü0ÁÎ[¥Ohßé–à~=ö‘¦ñKÍ;iO„šV)‹â#Ö™cû/Aäè†OT²ƒ‹büSÈz»] ·!Aé©Z'pˆ9d˜E„(ªÖŸúBÛšv-òL¶RÀ4ÑE‹¢ø-·cþžöVŸ’ZŠ_鹈±ì6D[ÅŸ1ø Ù´íзâ¾l¿co™zÆÙ‘àÔ¶Nî¡a©ô¾L¢½üRlÖXœ‰mîAÛÁjcœ=‹¹ÈîŠzÿ=ž‹ÈPÃEùͼçÏ]eª6å­È_¾o9Œ[²O£éd\ 䫲È=)k³è¾þ¬ÕaºéŃڱë+Ÿ8dKXóWɸÀ6Yi ¿fviëTµ/Ù\­ƒ[ÔyfœÍ‘å(ô##u”•(¡·•BiîørÝÝ »éÙ¿2HözÖ ãi@>åâ!ˆÔ´øl/óHNâ~ ýº—}þëk¸b$Žû¬tÚ ›K)3—K¼b{ÎOâH­½`Ó<:‚‹«o“PDcn è2 }°Ï›÷£âÝ×:çâ†öšYQe^äëʲß#t¤Vtúùtë™Áè~{î0?ºüíaîã0u¾#êÅżǃ ö8&ЦáÕ±Å(å™Elhd‘‚9o›#¿ŠéÅBJd%[Õ/‚Ãö[ASΣ4JYçQÄÊ­ÓÂ9[ÁÔ4ìiZõ*,wçxQ½{a ” Ð#DQÖå7šƒåƒvðV2¬j(I®Eç¾Æ;Lª‚µ¯C‚Se'eÅÛÛà‡‘FÛÁú ‰HçÛ+ø}6Üœ¢‡Í˜ˆ¦Áж¹/Ša–N'Uä×½Ø(䱆FPTið~(WIjwt£GŸz Yéa˜ŽÒ1uŒ†¶2]Õ~ª2¾¼5£Ê|zRN‘²¬äÑÍ÷ÂWÓ‚iw ë¿‚·‹ÅO@:¬ §íoiܰ»~ãK®ƒˆ?™èAÂ7:¼í®jJíÕ®˜2´‰öØ'ohžýƒ¹0Ž%PÓ?4ã@~r;qŽšå3Õì¯!Læ Kȵ$X™9EM§v&ê­¯2‡óñX{Ìc)ºTáÌ6¶ký ÀHƒ 40$+JËçÕ;‰É÷‹!G´û ³±H°-Ty¦ ©ºáûXQɱ´¶°#圫&ª)(…”ç­\FV&Óô¦©c'¯ºC$¹~AIû‰47M h~ÌuÑ šb,T&Î'ÿ!–ïÏ—KCÃÙý T±´²°D)ÚŸ¡­¢ÊŸÔ!†¿:ÄJÐ )czŒÑÚÁW¦s™Àn‹¥h õ1;z7?À•£ˆ¯< ……Îå•Ä‘×âi­ô,*ä*]À{(z–Þ†®¥ ¢Éô划%Zä2n8—¤4HjÕûÒJÕĻڴͭª+³=ñi 1táb aËRÍ4¿˜â´ÁÐÞ\Ü&ª”1q=¼šˆF~sûbÉz;&©½¹¿ØAÁ‡1ÄVÜúߪÄq|!iØ&ü‰•¡÷Dµ°ÌíÑ}ãHÕ0.ÃáÿÍÜ )dB‰Èåi£w§mw¦Š…= s™4Å­ýÒaUÂ=r9/MÎo½pû]cÔÝP<;ò°¹ƒ8 ®…˜È7J;¥Ø}¼Ó8îÀùo?ÆÛ?b!ôt'O±`u>°Œ§¾íÈô˜¸Zx7—¡³9ÀDxK„Ÿm°½ÅåUôÿH!Ÿª?y4¿ƒ·8É€ Ô*gÖ÷Dþ}ö®Z®N*Í"ÂÙ” µo›ƒÒ.XÕÌŸ2öáØ4|ûÞ7‹~+pZn´jkŒ]OX—0ûPRbU«£'d‚`ÅAyî]sî`í³××̦Ú&õ½ù“¸À¿*£©°éE+4°œÊDzˆ~ÈF‚õp•ZÁ5h…ŽÒÖð|T1j+©‡“­e½ìïö²ß~æ‚ÓhÔök#ƒIÙi0Š›‚d >y®#b¢ÆÑ¤[¤jkË\ù\‘Ku”ŸúãcmãâÜÜÏѬذÓG°‹ôžOæÃ]*ŠÚN¸EiŒcmÐâ!|ú-Ç•Œ°ÈF"cˆX”ºVwyE´°NO/àâ4òDÛw”TÏà ôoût+î=ÇËdZÌUZ&|A%Ozª{×°!ßó1ݤ|õ°*‚5ÛZüà»7X3:•ЖßÁŒÎã®Z.O ÿXˆTèxÖŸ&ÑÇ­†ý›?/%<—UŒŸ¥+Ú‹6Ô€eeÍN ©u,Œ*XÒVn¾îƒíÓ7ÈáÚZìÈ=ËÎýbþˆú?bìò¸qyEŽß^O¹4•»#U1¦£ÁêÈ=kÆ¡š{Ù õƒ…÷w YBÒ&y¤ªÙ+ìšÔcÖÆR§²·¹çª±S%S@ªÙ¢Ïy†›î¡ÚI6Ž~¥¢ÆÞíÃyÉ6¢òS¼|³S‡–Ð2*lx™ÆÛ\›ºQýbncp‚ðÎÄNêª~ÿôÜRÁÛFÈÉt1çyÝ΂wÈŒhSÓûÀ™˜˜~}Á%^†‡ñ¾¼ÏT`¸Ê¶oJyh¿Î¡|mÁš²CW'Ãô¶Øc¬ÑpºEþ8ÓÏü†¢ µñŠçÓH±‡Hî\£ü9¿Ô†ó›RÏY³ö•ðÚÀB>}ø»B ♟rDNÂÇ,…’Vä°ã…Çs³O°‡x³6=ÇÙïHPÛLÑ|†ò¶Ø¼ª«LGœ“Ao\9OÒò¾­š‰Ëe-“ RŒSø{gh ض'G<àR’gŒÑ^ÏV ÉIßF‰[=é'[é¸5yJîò{HŠ>£ÝãÚ#~´¼©ð‚q±¾þž%¼1‹ãïá›P=­6}4‰,%ÖgHSLsÆHà+?ÅœbFI›fÔ9b¦÷*„Rê!׌٪ÃÜ_•1ç. ZÉùšûqCG2Àfµh7Nkù™½v ˆ$kj+Ò¿©øŽa¯ù­I’ç]h„¼ÒÇCÅéJà¥ÆÁ{«Á%ˆ1¢BÒ“]ùK™½šê€Il[„¸nTpöè‚Xß ûû­ “¿Šª,'w.+ŒÉºRQš¹fgÆùa—tņ1¨F·÷ÐZé±ì=¸¥¡È°ÞÙ¥ªý´²‰‚&O‘숓H@ì¯ëÎÎijé—™Á®­Þ3}³ýÈ ®ø´;`ªä/e$:˜”\É5;f&ˆbÞð>i:^e5MÀmpûïqv-züËÙ32elçªØ¡E‰ØëiÉ6êϱu‹xá§C?·â3)kÂ!?ܤ@©£îV8½' Ñ.L˜rŽ 6Uù(æÈ!3D*Q×X¼ŽfCxûkr9µ„–Òïèè&Õ÷á='Hgl>Îx5`JMë™Æ#ò€$À¤*]ƒØ÷žª"˜—Ÿp± u'­*'>¾zØÐ”HÐé­m¦Úø‡}ð“K»È^÷ÌôNÁ9}®D=¤ÆßŒfSºo“’\Ç¿å äÍÄP””¿3Á%l0"·fL²ê]ÈÆñ¢j0³Ë/UØ›qš(ÊŸ²+¾ê[ʽ/Þ–±Sé|W^ü¶ÏbÏÖ¥¡GÉUe‹áܶX®ÿ2•Ä}ÿ`2fIm®µéD|Z’ÏÌuo¿ï¥Ž7ÏåkCè0gÁgÆy„ê ‘VÜ‘ÿ _doàÍ¿­!¹ _ô³Káëç RÚ±§ MÙ¤V¥O‘˜.z‘ œÇsÑÔA›Ê(ª¹Cm4†O'¼G,¥Ga¹• å`ÖF+¥I8¯¦Ë˜ „Èòro坸ó¸˜ðRë·\Äq<}ažÑG`ù’2žj-¥'0?ÃPO¥äµÄîÅšŒÜ59®»UâÉ';Ÿ¼‘ú¦ÈÄPëZA£·¤àÄ=ðãJƧ1ì#’S'Q¤bíÉçÏVNF{1>CzÝøöÛåŠù¯––nô|ÌÝ<ª·äYÚ¾»¨Nͤoo.›5)2 Œ~ax× ü$†=ƒnRêðÝØ™SB¢jb«S_£QÛ±¬Œ5¸µ3Þ(þ²ü˜xÞ•p rcpÈÃú*/Èsù¤M2m(ÿöúŠn¦ð1|ÿG*L•GHø,Ó¸`Ä”4øM·Pgø³i—OUYô˜—‚ÁÄï!ôHõ½ºíËÕ³€÷ìÖUµ.±ŽÇUåÊѪ¢Ô$Qü*•¡ µ{ôÞpDß¿ Ÿ’}⌞ Îšß› ­­qžíI.€ZEÀ[\"UµNF×EÞåTfk|Å7Û·yÐFrã»gÔo|vc K¡¬‰ÕüTƒ¢™®en9TEÖ๷SÒCKÆÖ¾Ý☫¾Î£Öh+×:ÈD¸ÆÊR†§¼ „²Ù„ǃyM›„í»’ê++Á]´ôò®Qù÷á*‡6ô-®¿Ðm}Æ0æŠ9X™~ŽôÖéú©MéÁéÙñ¿÷èÂV®7Ê÷ˆ`nâ¼î¥½Ìe`CÉüžàÜòí—i¢+† T¦‡Ìè”lw/4ÐÐøF/é&4í¦¬8ª‘F 7¶PØÆŽŸ”ȼð»yd.®§óyráÒ‚Ö|]~·–¼&U¤j¶v——áY ]ÑÿX°|6ˆaUT`YT$Në¦uܽCÄ2é¨Y+Wú ù§à™osLQ5„òÍÜã·¾)Ad œŠ’ª‹`î0'¼$Œ-RO‚Fâ!ªÃҨƩHÔëó7¸b #T€Ã­¡G²sfPýÂíeš¦YZ$Óˆy%y‰M«©A;Ç¥þÉ”†çŒ‰Ãä¨O€2¦#˜’~ØÂ1V~ß8è‡üvˆc5ä’MôÍ,"à’µ¬{œüm»„aºai”» £cÙI¡8­~á 3z–äÙø‹EV¬Ð˜êïmÿGøÀÑ%c‚ÃÚõ’Ҭʣ(Ed‘YpdG¢ž·qï÷s}kØ;ãšen¸E| 0Tj°Lž€f—ññ)’,™rÅà.Ç>VÆ‚œŸë¨ñÎ÷›ü7ÑýÕÆ3RùëÑ⑼øœÓÚŸÚ±¬LÐáçm‰Ø!Ì7î5ݬÎj[~è‚¢xÚDªEGXÜôþžUÀþ`ô5T9 +’Ž8;Öº‡©Ö¸ÂåƒÿÖŸÝÍ €nû+扚õºvöZÈhU×°ÙÖß.kž´ÏmµW•Ǭ±øØþÄàú[KÝRZÞË5ê €Øcs¢!R/0}”9jºÕüG/#+ñMÔ±tÿò€åü§þ™VŒØìð{ž-üwÖ|(¦[>nÞ‚õk·t­ÝÝ–¹©œ‹Á<Ýy÷NÕ°u> 3‚ȸoIýÕ:üŠA´÷9›Œ—ói¶ ]¬—Gþœ]qâB–š(˾³8¸8?Ê7œY™p‰Q±wYC¶U3’ôŒõÒ€ŒZU‹)èyÃ…‘ñ\ØH˜½úúÜãêßâ§r§ó[U§†ªJfA²ñÉóe!ë’qšÙȈ!¬m”ˆiÝèüBÁÑ_­¡‡1üœ¤“1L§ZH¢Þ‘ î¼Q€ ûEÍ)Ÿ"g•޽KnBN¦ç¥PAùsû÷LÉÉ€rÏű•_EBŸ[¾þþêÛ¸¥T /"<¦Õ©uj:~”7kD eÔç©ýbI¨ÂÚ"†¶x™qqúä†Óæ~ÌÙ¼‘á:ÂSÅ+^uƒëy²P [ñʵnZOC÷imÏó0¾I”1_Ò¦s—Ìqm:ŽŠ>·«I¦b¨²½1‰qÐ(&LÀ>Âh HìÓcAŠ •SÆÐ9â ,bN?vF£¨•{*¾Tȶàü‚*ÈÙ>›ØqÇÄ&³ÑMe‡³÷+B±©¤Óø¶ÑÒ¾ßÕä§WÎáÊ,ô´žFV…‡­'oê°q5Iya‡*R}QÎÿK«õ¦ endstream endobj 71 0 obj << /Length1 1620 /Length2 11407 /Length3 0 /Length 12232 /Filter /FlateDecode >> stream xÚ­weT\Ý–-Ü!8îî®Á!¸§( VxwwàîîNpœ@p÷Ç÷Ýwû¾w»u÷sÆÙk®5—̽÷‡ŽJ]‹MÊÒÁ$ç²q±s t4õÔÍíìÌ-Á*lŠPs;À«™•ŽNÆd;@dÍ¡ a€È ¸¹\BBB¨tGOg°µ ÀøÊÁÄÂÂú/Ë_. Ï"¯‘.`k€þõà dçàh‚@_)þÛZ jXí@™÷êŠjòFy5€<r~mBÝÕ ¨€ ˆ ˆ `åà °ûÇt€X‚ÿjÍ…ý•KÊ`pqÁ¯a  Èñ/ˆàr¶»¸¼~À.kgsôuP´sµü«€W»•Ãß9:;¼zØ¿b¯dê.P 3Ø xͪ.+÷:¡6æÐ¿r»€_a€ƒÕ«§¥Ðõ¯–þÆ^i^Q¨9 < å²,Á.Žv枯¹_ÉÁ—áê†Xÿ«V€3ÈÚÜÙÒäâòJóÊý×tþÕ'àÿéÞÜÑÑÎóïh‡¿½þ£0ÔdgÅŽÊÅýš}Ím † rüµU!V.ÎØ-]ÿ‰¹œÿã_{†éµsKˆ'Àd…Ê¡æ}M `üï©Ìþ¿'òÿ‚Äÿ+ÿ¯Èû?÷ß5úñÿô<ÿ;µœ«š¹=èï À?ï€ à¯K üOîæö`;Ïÿ*àß=õ@ÿ¨Rdíjgîüïð?è¥ Ö¯Š° ±óýà v‘{€,ÕÁP  ÀÊÜîuVÛu – g;0ôªéßã°qqrþ¦mÚBþ>ß? ÄòßË•éïâ9äuTÕ¥Yþó½ú·Ÿú«þPmOGàÿ&ÑSu°üÅ_,ÒÒo6.N'ßë±{=xB¼\>ÿEÆ¿‰¸þµV5‡:ƒ=†œìœœ\€×÷?Ÿ­Œÿæè`ù׎тšC,_7Ùþ‚®ÎίÚþ}î_›þçúïíy€€¨Kó@‘À©iÐ*Âì1YÞ..ø ÇoµÚy~¾©¡¿„JÍ+ƒØë&„Ÿ›=矶•˜w†ºÞÚ1t&ƒŽsÉ|h˜ºópVé[Xvü9L¾a¤êEzŸÌª¬#|àçÔÝÙÓÐ4)z|C>ÑÊãŒ|rÃäGã–ç‡O{íˆù˜RCІ]ƒ[•pHŸ°sÍÐ7<8Ðßy†Ø½MÊ’ƒB'bNø9é€*êiæ|Y |F¼wpš@»ï Nµ }Œ(S>0ô"ò?ÓZkzÇrÝ+¯q*W”ÜÞt¯§«úø§h@¼¬ŒÉ.ËÝ‹¤ASÊÞ èµ1NÑ®^^‚üÂTˆdÓ2™ÈwвàIå%A õ ·Âž‡Ltv™eh¹úWío40àñ/ œ/ݤÅ;"…Sh\]H΋°üP#Kƒ(¯fØ~Ùæ¿xˆ¸¢Ãý´ß”y{å®§³3@ÂñsÆöìû>·ƒw²wKèéÙ[?cD3ì`ÉINß¿›Å±¹Žò«Þ|ýj†ân>0G:ÉDgüü³ïaÍÕÐc½’>N¢@ çs½„®lìv½Ÿz##Lm+;ž'¡ù±V“nàq*?RèðªU(aeòôO ’Hõq,ùèUâ*×zíà_µò…¬0{ÖY'-š¡:#ÒÞÉV|ޏmèýù wxiÞ/¤¯T®#¾á3¿==1A´•8èOºI'%ÑybÝV¸D™g½QG°ûðV¦…ߨšLð´¸n™ú ©|<&ÏÄ×ä09ª‚(ó¢ç̬Ÿå4Pk"ŒÅŒ.ŸÚ«ó>„ã „ŸNËÏÜÄ<ÛËE™¦åÝgŽ—âíãíÊh‰G”|êáŸ5ô†=t»±»ÎË”jA›{×¥ê¯Æ©žEKÍÑðAÀð£~ÉÙ5$ç)©SŸ€5€uÂì03âæËwže.ÙLœ¡[l³fd“ÀL_?`%J2Uótb$ìw÷;¿J›D~*|&5«`Y¹å º8\ÂÈ<y8Oâí#B¸ ËÕû 𮡅}ÍÛ·»·Ÿ1htð§±C¦Ù‡)úª-šSYõp.¬ŸŽÁúú`ÕËVJ8¯P7a_ÔóUô Éó‰'URR+VV­4ê4žûÌJÑGGì0h·æ‰2‰pïÞkls¥#LœoY/²|ÁõîÕo1Lù3 [‰0g WƒÊø ODJyJ¿u(ú¨,qîð6m*íÜÎËã½ô5Ýúú'Ñ›&¼WlxG®UÜ€•õ™¦qŸàŒ›ž’€m‹Óè´ÊÉŸ r‡cò^Ü륋fÎ ‹J•÷æR#¾eK¶?Ä)(CB)Ú„}¬‚½–ŒÚ?/FÅt8ÇkD*L»¦itìl–N’ ’ÂJlÔDlt›¨ž“ˆˆG†¨2âú§ï×ÿÜßÅ"…î|Â+!O¹Ù’™‡ÿ±65™©5p5Ôî2ÿDxÒóMýy6tÄ{‡µöb09 y«Û«'Pƒÿ.÷yP¯\w¿¦6¿ûåºaõ¹ wJæ=èÀ¶¨¦SPWЄ¹öËj=| ±ì]aæ6à.8h [9zQƒ‹á ¨$„Ýr1Â|°ÑDÕm]›ÓÞq…ÊlQÜG·ná¸xJ%ê¡Höwå%4)L6›¦`û5|x^·U¦øaþ'GMJcâ«ã`ô@jù$^¢WðÇð `«¿]ÔáIi1@¾U†Ù°>V¥È§EZëaÇ)f€$o~1>_Hª‹í«´,ðXké¿ô»•/ª¿<ðÀkÄâ2*µìæ'kñ'1LeÎ3%,XFÄû‚8ðoºä]¤PBWù|.a£lRË¢­ÓZ+wŽ/uQùf/Ó*EÏD½çOÝ=~FÎ,÷ª;D·qðq™ôƒÉáî Ìé QãÛk:ÎDXR™Rl»ãPš²y•+#•ÍV÷Ç¥ é1L‰B†ì2‹4«„\¶Ìjþ‘A"`[=jÐ^ÿÛ›ÈH"jƒr¦É=§8`Hhï7L-Ý\‘õ’ ]ÔùbVdœ¥5uC>°F·X.ªøib ê³–ÎEïT¼&F­žÍ</êð„Ab8IÍäÓ—¸S£9_YS•›4ú¼?>?hk¯éšƒ ,^Ú"ûíõ‚ªV‰Ä¥oN3 æv µñòGÊÍÕùB«~…ª}~Ôº?uÉ@pKPÞ‹°‘Í8M~r*þ!ÄùlðñžYýÈwމ4Õéúñ‹¶ÀC!øÃM¸ò6/ò` Dkµ^ÞS9­>ä§n:6$äK²´ílØ€w©ÒCsõþZ &_ºþí£ò Ӳѣ­œ¬·ð7'9Þé—2\s§ —_’]ì^Q² lvà—âxʪ‹¤šÍj Ù†?£¿™XSqcžRÅœ¥ïƒ¤xú]j’ßJÃÌS©²“¶€¸ÜáÑÑZPÙÃ71dWM1w)ÒxPÁ·4˜T=^­CéS1¥ÂøTâöf¬(Ñn»Ì&ƒá™¾2‘ëa²«Þè »"Å%"¾„y‘Iëùƒ…àjB5á)!î)5vøc±Z6ÀÒ懲YĨë)Æ€{`YiÄÅ"¦‡`©Ù/xË™…Q[ÓŠy×êðcþ÷sUû‚O@é*^8#n™ ^]Ðu¨’·.V©/fýõ½ór»Ú^ÈÇKZé]‘}µïf/ݸ³‡Ñ?-Ììªó‹û½üŽ0£ïÜ5N¢ŠÃ³vBÚ¦œ#Y gPuå®·¿£P}µÀ~ç€÷øCó„Ž%C2¹W÷”$FœðyuN’] Eµ£^z#é#:ï“Åx]Âû¶z:>ïì.ÉDIß±«pÒ˜kÓÐÈå)i™»0vK¨—rJý€+驌WKK:üZ=¦ T-÷¤žg·þ¨Ð ¸¬µ'†8»ôä'ªYóñ:îÍWžõe7 _ïŠ'SîÓÜFÙ/u>y¬ý ±C?¢”¨,<¯6¸ÿ*ÌÕ±wG‘å„ç­A0À*¾Çòý"@<Îÿ3ÊØ"ËçºKÄa» ’ÝíT¸K*óMɶ’oSòσ¾?êâ·æfÜš{g¶™9 aª<×£X9pÙdŸè-ýÛ®&¼5Q~)R¶¡´‰™Ù›8¥µ€1á¥Íí$«ƒ8Ä.Î_¹m3Ù˜3˜5' }BDØþ3“xÁ0«ñ@-ƒòˆÂ?~.â#8k0 J.ñûþZV¸³mÅ0:;>¼³ÙÖ³ÉÇÌÊÄü¸<‹¿ üt""ò¨?år4Î]<² ”è}é"&ÏŽ‘ˆÅá‹ÈÑ¿Ì{íâ6®G¹AÓ&ËãÏjõjŽ]íÜ phß|êÒðd}pÑÌ4rØÃÍRž$¨ ã"(T ŸúÎ?{v­k~Ç#tÀ‰­Ìü†ï»DK­Â gw¹‚j=PnØ-"9A‚ä<6|üÞåiï@Žw+•$¿Î' «~ü™þødî}+ɰY ±T¯Ívàn¸}4é~ŽVœðÒ'ßSÖÑ]CGØUÅËmÔpqÑK*¥Ižˆ‰¥/n$Öq,°\BäØ 'ª¦„@ .óû°ñêtƒsL©T׊]à•0¾)/*ÄÝq07V1ÞDz˜òSÔgi´‰ ËÞ?j?™SrZjÔŽ_¯c*nê³3‰J oÒ‘rn‹¦»ÅÖ¿ïigÃýžŠó,ðBÕ&ê°”¾ðõª^دzˆù¥P™N–ZŸ q8Ù1¦'Üju<‰ÙAc6dU·äín,œÉXâ×Ú+‡çIp6µ¿TÑf,Õŵ"d1£ÏU'°Çߦøþ JR*}eZÞ~‘äK”ÂIÊÊIí¢?44Ñc(^wŽ0>8n¥‰r£ŽË„‚ú& RBÙón¦Ó[¾鹈„ú,¯øå‹ÜHÝëZýÞ ¥=ÖãI¸lÄAÚíðŸPõ 9;^ÐÅ{m‡ÕÄLœÅ¦Ø–Çö¼…™Á§º¤‘; ¢÷ÞpI4ƒœ¤¤:Dcœ~mö2"¤!$»ðZ×xÌCV:=­Ì…_"¹›¨UvÚ»¨Ç„Aij޲\_ša”lô)¬Ç©2X•{ŠL‰i‘ú+¯Ô¢UP?Ø{É?ª‚Öç^ŽJ3ÙxÍõ }س\ ë q¿)UÖ*Sª¢ô„øpì]öÓOÐ,¿!‹]}è.#²’P÷/&D§GbÈuIä]•&é$ͪj16F…|ÑK»éø°SžSfZ£³4ñO;l¨vÑXL"nµq՛㷲7èaY`ŸÜŃõh¨dnD^Tü»‡AiÂûõ»NÕùoôž¯?Ùã`· ŠâèË„é25Ãä—•XÇmÅý‘x7ÃBÄ_LcÏ)ëM¯ÁŽÇu ÎÊÌŸäÝ\ø¹Ž>Ýãq!Ö‰+Ðæ£QIجKïä£_&xÏ1б%7úXÍ€×Ø¨ÔŠe,Âþ ¨~hÿüŒZ /Šôžfbù˜©4©´ ¦ÙNI9xÞK3Ù,ê¸ó\BB|‚~Ác7•Ðt ¬ßö—噟žtTÑ„ô´%Â|À)ž½³ùmºfi›“ÉhVOÎÜmoùÑ›!ÎG¬óòØýž~@¿±ÞnbMàÂÉúa2o,ý¹ì\Àpb”A†ª/xëï¦Ë›à霉s¹ò‘b#â^é0:f’¤€>™çÞrÓ]ÏüÆ+´É¾?ýk—ÅȸÃ{µ&ª©_~¼gÿ½®£¬ éO_¹{ …˜Cê-iö*ļ…FæAxá…â)T‡Ÿ›†?ãï NµN?âT…ÑfÔ1°fg׬#ùÉ|£Õå9¹]? þ›ÌQóV§À—«N †®&²ŸåÑÍ£©‹|È„Ej˜œˆ1oùþ’›>6»:C!m?_Qé‘5‡TÄñ-MÊ…òŒWæ¨q`FòoLg£G*êÁkaB+œ…4ö’sYr¥§´.îƒêlŠ?Añ—ËĆÃÖ¸’¥xl×lQïÑ»€%aþ+dØCI\7°¢›N¥‰’ü ôFg y0_ ¿§ZÝ’Àµ_(ÞW3‹·[<"æÈé¸eõôI©/*æ .YÕƒD׉ó—ŠOxÖRcf]ÑÈYÞ8õ³æUÆÙÈ|Â>”q£XÁ´*üE¿QÑØ Y…þ¦4‘Î+x'MË’ÍŽqt.z°&Rõ¡ÑÔÿ@ÕÓÕÆ¬ Ì2ªÐLËþnéôX§Åü¤ ¬NIa_vPüƒ É·£§ ±°Î×å·æ&«ENûö?ùŽ ~îÙ¢ÁM¾öŽñ ˜Õ§RELeÞó¨ÈåÁP]¥?3Á@áUO¥!:sª@¯b<ìNÖä·CÉoŽsšzÔ„žóûðS?BqÍQ²­¬ÏŠç=ãC ‰Òä8¬ží1gNƒéÅÍÒőޅ(ÉÄëÁǯî÷|.ïpDË_ø #ÍvO¾æ5ý¬S¾R¶ váú]¯z!Êw{qЙ `‘^^Xi¦t¥¡Ý²sâª Ü WÌ ý>ïJ’ßïøüí·2tßc-ä>ÿZOçH(9ðW«Oé®Bu3êpYdÔJ*ˆõ§ä1 DÙê{t‰*’7xýÉ_\ÏqjÇ èñ²¬§2¨¡šltŠd®ö hò®+J ÷}?’@ϫݟ:Õ´b¡!w,Œ‰H×jY?Ò]Çx6¹Ì¥s®ÒùSbïedz}Qï"j[Õ>Sį ±©± ¥±2›ÁÛQA ]°W?¥›Å\.»Ñîg[¦óÝÚb _àªzäçEã#cáoN5HY|̸cAžw¹ gU ã/T¥¦N "0ô6Z/“ÖuQg>±V²—ñMƒ~âµXlz€ÉrÅïí,-5¼‹•±  àeݘ.ß&N5HOQ]ÁŒ˜ä/Sj~F’¿`Ã:É}oÅ_¥ùÙtÎÎcîe]Œd¶Ã=K9n.Î`i%‘ȯ'[æ34CW:€±ÿéGq“cí]o“笟a $C|nÓÍU[®zÇÑÔ¾ñ„ m£)Úïv½j¢ØÈVl±•^±ºzeadžÂÆw´ÊL+¶(‰f‹8ÄCy2ÚíǯËJûblÏ79Ó®µãDæ_<4ö8ÍÄM fdñviX’·ªPJNÒZŽ@_Ö4½AUÊ©Ãq?Ñý’Ny‡ëî.lJþh å¿óŒ&ÆQXnæù6L]%¬ÓŽD]1Îí ðœhxO=! JtbëÇ~ž•Ý"ÎÒON³×(ì¹§PRv½öÙä]œì#Ѓu_Üt­€€÷*¬jy¡û?ïýÛÓQ)b—b(•¸8o)*Ö;a?ö¾èþß18.JG/hä°{aÛüç­1Ez´kÑjÆO½#E‹Øž0I&Žjƒ%ój„ï¸5¹„›!Š8èÅd:0]Ñí+ÇLájOš>Ÿd¶o9×çää™Í`NMѲŠÔ€ñÔ¶syù¼ÛaJÚ`0ˆ/ݳýWøÊ|ÖÌ@@sSL{–œÛŠ[´Éãwrµ!ÒŽÔE  èù R)¾%@%K§„®‰†rØ.۽①9:^¬d|Û†¶Âà{_™×C‡¥%oÀ°cH¶š+éw=)bS)·%ÔœühŸóÀü[YÍ®ëÒ7@Oé%—¯œ'Ù,éËVCnJ%à”XAˆÔ›aZ¸i‹™ë(†ŒÎOø·•¦Y“q1Œ´&Ã27}å}í!n’y#¬AJ/±1mºÕäèÖÖ¦ãbq¡=ÝÅ0‚0|›Y cb^Q÷ e‘™…°GDß)ŠV`ž©O‘¤ê]7ÎßuÃ'E™¦#m؇ .~™¯Ú¯¾àÌ÷ 9²¶.‘µ nv©Z4ïóA˜âË|³^Ñ`¼À"Õ2|ålcWRH•/J6ûÑgò¢ï[ÔŸîÊM?ª3ä[{Ð3Åh1.‹Úãê}Ö¾ƒ[ùØœ0½‹Â«‹#¨àGþ¶Šù*SÎ$ü”¦LFý(ÿš †EþîÜ:ÉÒÝQØfñMhq0î[d'ü3© ½&ì™Ø|­&×õ ¬Ô±!¶ÏØÒžÁNâ ôñÓ˜HÂ=¹pÂÂÑná5–²*‘é¹? jH+bæÎ`¹ã“ÕÚMY2°I‡©' û“:U½?ýûõ‡ñUúlÑ!ƒÔ‚ Å2]¶D3|&°hâÛO#“'z$ Qø_èE­Ý/…VÝE®:Úr'?SÂå×ð!ü´… ·JýÆ0últ4×%ó­©<7g¸€íM¸YÃËš),V×ÁÀÁ¶*„{ãâ¶M)äœBN[.¬Î]ŸfùÏetì]–; SbcåQ-øa%7£óé¨ÜÙîÀȉÔ˜Þ«p¤¸I¦)ì;t„ñÉŠk&ÔÝcAçäå¹AÔlµ ÎÖ ÕVA«™ j¬éç±*n`Å>Šñ;8ÿˆ?Rj›bÔ;ØO7à›ì%8÷+yZ°d[¢Á(Dø¥ïÏÐæÛ‰¤«B¬i23û¶¿ï½ù!a|«WóÀ!)²ŸƒC^3jÓí h8Îv_ ˆÖµbeó„Ë$ç‹Ãôûôó€d@Žy1»MáÏ‘!ϵ°NÚø¥™•™ ”Ìi£2efB½P_~Ò>*JÀ~ÎÅ<¢›‡.ÎÅð¥‘n.s¼Aû Gü]B•%F®òRí¢Ò)鄘‡Þª‚È Ô$>¦J:½%lxûþü»õ± æ¡~û,‚»éNûc"Oçñ³ÒáL™BÚ “É•.ôö³†K|’=Á›×êbÌúyøiD°ûŒÏG”’¤4ó0ñ9:ÙúãQz »“½€>QÞzž~øÒͼŒU"¢$EHéGQ<¼I´!Ï»¶D¯Ýš*„I6Ì|l2»ï_\²ñI#”‘NGØKl¥ ÷n> ä„p ·ýùHå-¼ºRƒFд[•‚fï%â"Q÷\‘ÃÓC<†§Òºà wØ¥ 8`÷ ÚúÌû!ÆmÝâ÷.âŸÃT!6‚Í«œñg—E1Ìk½KQeÅy²ùUŒ^q‡c—ÐC€+üC‘sr™Pw ÙAé@éûJȉ8‘í°ÂšÖedð=“—}˜ÞFfO2KÏOú0k·Ï’…¦rͰÈùþ«¿/7]<·> ¢ÌK+LÜŠvö7™tØO'Â}¸ÑŠÚ'5TòRê¿ÎY§ô‹êê©dÀ¹jç¤F^ŒÃ,G+’s½Q‚õ¤“x{§Ü5Œã[Jü CD†Ñ!£%¨4ðò€èBò¡‰±ñKŸN{XSZù½©’Ž×¤ Þd¼¦#½Å^äl¿6ì;A{D㉱žÄèñ=Ö?#‡°Q€©9ä‹Õ acÞ–SØÁkÀÙ½Ðcô÷4dÉ®}Ķ…bÔÐÝ@Ÿ }gVnÛbšƒ½Tyÿ~„›ù_%uûýw>”yʸõK ¶F1v&¤½úNHñµtÆÄBÛXÄÞ-0sí´Ï©ËEÙEŠÓdÜ7œtX†QÃÏòÀ ß\.õ¨?$R? WâløGÌ0þHP÷¯s¬C¹+™blL—>ïå û>Úéê½—„ÁÆè7¤æM;°Ùžãtvç³Ò«€¶»aÁböÌØ[ù²)4ðÍëM{U[1‘Üß, ÷"Ê7r.èýX©±µ¯Öµ ¦c˜£ Ãòl†°Sê†g—>Ÿã/º²7ÄwÐ<‡¨ íŽÄ:ü’S+Êfì£TÆzýݳ,q]Ò*Xg×è!w9°bý³‰>ošÐmÆí1ìËuµ#™{³J´B)˜mqYô<£¾°Ž4›=³îËJµnÇá[ûÁÙn8{Ç·§”ÑõGD"{Hº°¯ìØ|5u‘r²Ž®ÜéNÝÚ{úâ÷=Ï[Šè¯E„9qH}38ì+ýêËî¢æ7Ð\'Λº—,럪œfñÉi2î-¼2:ãð¡5ÜÄû5Jäê,´â6µGã=F =½wü’á‰Á®¿"¿JLs¤ #˜ ëíÙÅÀ=ÀWuúÈx?¡ÛµíXjÊÐ3xëÂ8Sáðî1Yù´}ž ïw@®U]h¯ñ°ÅÅÓ©ÿ¶W/#$ŒİÔ+¼¨¸UÜR‹ð^”.ê3àƒÙ¯°³ÜÊwx:1rmRÛ\€Ü› ÕvÁÔƒ‚n­íÉ/¹>ƒ©i‡<‘ðž <]x£§uŸ µÊ-{.„å5cÎsüÈãAÑ/% w)–[N‘Wß6Ì*–#†ë¬}k—³¹‡HVfÏïx¡âÕåÉ&áÄ'/åcç|‚Ü-KݘbÛ2œ{ú3pÞr'õÚÞcŒµH>1§MÆå™ž²sGLt[®b2|oOa mv.¾a"ønTm3ëv8 }ÇDœÜôoŸ¥8(ÔŒo‹¦[‹nIXÖ휴‹¦•S:å«Ö[c•QÎä°Òèï€w´ÎÂI’Î2u³ ôÅÊ;Íß-×u¥‹IšðÃ9ëy⬠Wy&Q0¼þIŸy¥ŒÎ·S:·1}M=𰣦QV¢Xâ…6€ûSðI–ÇÜ’¾yœ¿·‘"Z)b²æ4pÖ!Ú ˜¾/ˆXƒvðsÑ!,Þ\—!’m…²Õªaû OYÊÞ¥a^Êåà|[ëà/VúÑ#ä+à1H¼bp§º<È•í+2íÈù|K¦JµTwppK&¼ßgYœÍ³½€^º¯ë!¨‡ôiܳdÅ¥„Yi*K¯  ÚWÑÞþ$^u<6:°_˯“3å8ŸûdþιeÎGæ¢Úâž”¯—Ǽ>F°¬#ÔfŒ^ )áIídªêýŽÐ¬~0¸ùq>¨—ó%C§Ûß+™Ï[¨e'éa¦Ec¨lY¡ŽC!®eÒG“j ¼i1ùË~Q ¶´@ãË¥Â$0 øSÓùá7º’ÿ-öìLPlÌwàM j·mùÛY²ÉÑìÔ=KfB.©‡Á¼ö©76 ×Ô‘m4 þLÏ©¨{8ÉŒñà¯V½‚ Æ½}ªhJÛÀ„Dî[Ú¯ž¹@kJ‰å§Fæ“Eq#ôËž<*ìÅ Å3'XEr›xÛë÷fsÛVéî›—ßA)E h@NÑÓbFÑ„“¤2þ}ïwØõ*æ?‹ï5ÇÝMÎ×~¢í¬ci\çp ¼6 ”lþ£‰ñ^$—XÐÐRVkä!„ÒµšH}ãÍÐÁ+a£¡Øöa YØNç6ÿ·¿/Dž³új\b€V¢²;ó±ùÇ£¡B ðŠX("ìÈšô{è™ö¡®¾ž;âÉÉÿ÷7?Ä‹ wE c[>QgTe=XNiŒIëÊYá1í«û_CÒnªDÄHcÛ<ÕK}昕¢ÞÁÙyàX‰l¿.ŠÅL}1´òâÃÜÙw¡•Ÿj¤RK[ãqLáøEW'Ä;&ëáˆë­ÙºC¶uÕÛ·–þ#;¿"ê%ú÷ØÄ;‰¦é'Õ„g½ÕÓw¯úªa:xK7Ì6{Q Òí1Šà¢dÀœ¥iƒÀnÖî}€úÑ“Ý`Ê2ÖI–…éíá„©ÚžWCÞ“ïDÒ$j‡Ž-ÅÉwó<É@ˆØêí€)ÕÅoº–ƒ |æe„2)7)3̳²*(šDnÍ{+Î ŠX‹h<©‘,8¶üèï—„ËïÙ/â~ì‰ïH˜4éƒ,2´Eçiu Üå“´5kb|6 ´zÆõp°ÜÅ­Ý}Ÿð^°S¢U|7—Ðõ K??ÙgÓ!áð6qSn”ß÷›ü¯œÇû_ötæY.ME³>ÂjJÆ JP%Ã!È•¨¾ôt £ßž~;÷afh:!›zR¦º|‹þƒÍï¢&TÀªB(wô–´P*o\ƒvÌzAÇÉ/:¾ŒÆ°ºWzj^îa@Ëû"½Ç 1ÞW­$»WN¦+½—òÎÏ@K-S*E„Ä+Ê®Nª"‘çð€mSÑ¡QFá<6 ’ƒ4£+Õø›âäù< àU™ÚoõÚ†º<&+!͆f¿˜¾u W5 |'[N˜ä o~¬5å¡ÌÑÙŠy so# 01ÆAu~ÒG*ÛÝKa]E÷¦i´6½à¦+ Ñ l¼GûPÊÀh]_æ5ýŒÜ©\E5Sÿ'„O¥Ó­¦‡íÑ]­’D£"B÷{còNyk"ìÎÆYŸò¯ZV©8ƒáŽfð/3Ù†­Jêäž?v³pËY‹ìXÚ,¤ySrÀ+ˌߗTª–;®mC¸Çp"_¿qÇòYýÆþ)5±æjóØPçò~ý™\k–ÀÆc¬¢ÂRæ@B9·Óç¶{I¢ˆMÜ$@¹Z‚E1K‰0]QŒ¿œÀÊyÐÈšz'Ù “@Yˆ¥3Hz9mä÷fàd=yß,á¤x0-åFˆV#5m í}̺w¼©ž½ÂcÖÎú'²¶rp…¸{óÔÂñK~Gô‘Ä:·c6hIˆ²é.na?l¤B ê Ü£ùóEdV©ñESª}tM%ôí÷xH-´ŠôXúL'†ç£€b cƒ‰5u¥{þ™ÄH¹ãNc÷÷ Æx#†Õ'ÃÇUI¾Ðgùà=À‘ a7~›i\mªÈ†ð6AÕ¢pN1‘⣺ИÂE¼„R¼¹†6•+MÎ|…¹IY'çÏø'ù/ícjkgåîÃ~ôôEÏÃÍjv\¢;†®ì ᯚ9Ý™—£Ê!}Ì–Œ×6Ú\LH;¨‚#)YOư³aŸ‘€åIœ=c}±ÃF‚•¾.l) -4ómQô-\‚ÒÐ|œ|ë›E%ùbªhg‡™%YÀhI»² eH–ÿœö$èDpAìkÎ 'rñýš™³ˆ}4ÇÀ ú³@ê¬Îtö Ðt„!Ö©ž8Ž ½¯T2ñ¡v4ÞäWÌì¨H’¨ƒ–ÁÎ3Nty žR²Ù¼0;AÆ•8'-dSžtŸ¹½M²Úy2Ð>è»0ÈXuáKá×*8ÍÙS9ÁK¯¼_FDâqQHx·AQ‡îrÒ0H³ÁK# õVb0Ò›úÝÛ–à˜K»i³{r]*Dy4{ø¤ÛkšÁÃ벃îš"O¤2JôC ØÑ<ïȻٯy&|Ÿ9Ê’,e ×Ó¿µY1DÅÖŒGk)/0T‡{Uåc\ -ÏÉÚ‹v Ìþ­³îüŸz8Gª_#YU[ò¸œôgª¦†OÁ Ú¬â§ñw?Xq­`9d»œ?˜!Œà‘V#eº.&Nºë;ñf‚< ‘¥…Õeî3ÅëIJ[4וJÕ}n™B(}™¦ŒÐúŒ¦ í)–¨’ñb}¬'êM…n•züþ>z-Kâ„;.mä¶3éì!:VÌÄ¾× ˜×P¡‡Ö?á ‹õ¨wÐ6UçøŒYÅaŽÄŽßócœåç#¢Š¦‚æ¤ ~4ê%à<‡ÛäµÐ÷NnÃ¥óliÅ—Ð}ïéò)ÄçQ#6?œb(²W/ƒÄsgöbiÄ{M®U×Ðu1Ý›m”.k±ÜïIž8}%‹)à˜³'‡àIS;@©›ajéŸF}ÓÍwý蟾n®²,,ˆÔÓ•,òÅè>ñÜÞ.h±²' E¢ýæY2–ݱ|êOg/§àõÈ#ãð:qÄ`„/zÉM'y"œ-€¡f“tÈèþzffÛŸó‹ëˆhívxOލ8¬p'ØÝyüL3“zz'ò V09ÝjHí ®†Öh2™cÞãÈ)4½½™ ÛÛGÍËÀo:æÆ:< ¼1BRÍÖf„Īÿ6ò‘Y¤›˜è2%j§ձj§%6…PËCNÄZìö–=¤b%†¿×&GŸÁƒãþå`èŠ|ü½½WF´.s-À6ÜEw;ÌsòñLôwN`yã½”è9Z[{mSð³l{„Öýå¼êÚ…‘Ñ›-|»¼Qß‘ ¯8y—uí…O¨ûJ“¡Y+[ôÿmù+ï endstream endobj 73 0 obj << /Length 675 /Filter /FlateDecode >> stream xÚu”Ao£0…ïü ï¡R{Hc›IE² H9l[5Õj¯ 8]¤Ä ‡þûõŒCfUm‰óçÙŸ˜»¯»™ªÛƒÅœ½Ù¡½ô•™Ÿû.º»ËÛêr¶n|¶¶¶õôvxb¯}[íìÈîÍ6ߺf|ðæ­«N—ÚN®ÿ›´ýhY »·¿gÕy8£à³Ã¥9›q°¿7ãÉÛ¾q0_f_Ë þ²ýдGι/®6í3Dók 6Ÿ"W÷×Tì#!YÝTãõ ÿ«³¿X¼ûF{Þºc­×lþæ_cÿ‰9¢ùK_Û¾qìþk8ÿrw麓… ŒG› «íÑïéïáy¶lþÍIo®÷ÏÎ2‰Ï"d«ÚÚݾ²ýÞ}ØhÍù†­ËrYWy—„‡ãdͼ•/á/VÉ&ZKáµL¡À½öx™”¡°ô…Y… juÛÃwöÏøÔ¯ú³ï¯Éx¼Šý2Ž$OAËP‡ýy´½º„t4îsíŒkì)$î©Q¯ "7A£?gÉ@‡c(ô„3jok9E u9¹ŒÁ/d86dqð/@cNiЃ9eyD¸H…{f¡®@/ÃZô`~ž£G¡. ¿Ð˜!ÌÂ`½DÈoÐSòc_ ùåBÂZ }%÷m<;4x²àÇ{[þãW<ÜœQ â¥$ñR1ñR â¥â¥Râ¥2â¥ñR:dÈA‡3NUAUI5'ŽZG-‰£Ž‰£^GGGG½$ŽzEµ"ŽZGmˆ£Î‰£.ˆ£.‰£áÄÑâh$q41q1‹/üÂð‹‚/fÒm|T—¾÷“Ž ³·ÙÖµ¬ÂÅiÃÓKýõN‰" endstream endobj 74 0 obj << /Length 672 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öÆ6’*ŠdrضjªÕ^pºH‰A@ýûõŒCf»êô¿™yã'æîÇën¦êö`gñ#govh/}egæç¾‹îîò¶ºœ­Ÿ­­m=Oìµo«Ù½Ùæ[׌ž¼uÕéRÛ‰õ=IÛÆú°ûwû{VÇQðÙáÒœÆÆÍ8ß›ñäIßž3d_ƒ “~Ù~hZ÷ÄÄ#çÜ W›ö c Ñü*…Í'qÇÆÕýU;€ºHHV7ÕxýÂwuö÷É»Ïa´ç­;¶ÑzÍæoþpûOÔøÍ_úÚöû`÷_¥ù£Ý¥ëNd0m6¬¶G_ÑÏÿ¼?[6ÿvÆçý³³Lâ·ºª¶¶C·¯l¿w6Zs¾aë²ÜDÖÕÿ%!ãpœ¨™§ò%¼b•l¢µËÜc€Ã¤ ¥¤ÀÈ ¤ÀPÀP«[ ßuªŸñ©_õgß_•ñxû4Ž$Oˇú<X^\NB8 ë\;c®‚šBbMx¹ ùy˜%ÆPÈ 3jok:E q:¹Œ/d4ˆ8ð€Q§4ÈA2="\¤ÂšYˆ+ÀË‹ÔÏsä(Äè5$ YŒ—Èú rŠÀ‘€ƒ~ì+A¿\HÈ•ÐWr߯{ÇNøxoËøŠ‡û• ¿”$¿TL~©ù¥òK¥ä—ÊÈ/¥È/¥ƒ†p˜1ðsòQä£*ÉGÍÉG-ÈG-ÉG“zA>ê„|Ô)ù¨3òQ/ÉG½"µ"µ&µ!uN>ê‚|Ô%ùh8ùhùh$ùhbòÅ,n~á†üá°nË£ºô½ß+¸´p]À¢hœ½íµ®í \ˆÓ†¯—2ú ¯M„Ç endstream endobj 75 0 obj << /Length 698 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öƆ@LE"¤¶­šjµ×œ.Rˆ$‡þýΛ1i·Z)A3Ï3óžÆ7?ž·“¬îönÝkõâNÝe¨Ü$ÿ¹ëƒ››¢«.Gמ«]=®žÔóÐU[wV·ù¦Ø´ÍùŽŠ7mõ~©ÝXõÿ¢•{kÚÏð¨ÛW÷{Ò÷ï{;Lè§Q÷Úœßiýû’¢\]sÅ¥¿ÜpjºöA™{­5ë¶Î»#tŸ‚©çVÓQÍ¡iëÁ P{È L¨ê¦:ûŒŸÕ‘ @óöãtvÇM{è‚ÅBM_hñt>XÙ]0}j74훺½ª"t{¡ÌAÒÁr©jw a´×ÇÝÑ©é÷M]—_?z§BΨ©ºÚú]å†]ûæ‚…ÖKµ(ËeàÚúÛš‰¥ekªÕs<ÌÌ, X#.˜K±Ié†ÉŒ€ãCîӀЏÀŠç˜©ô2î¹àOê¹0'õ\8·i!¾+e®8çÿI++Ä7>£â¡ÿ\ýéÇ‹ËåzT—a ›‚o ¾ðý7­»^R}×£‹ÿ|»÷'²§2ø ­rN endstream endobj 76 0 obj << /Length 698 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öƆ@LE"¤¶­šhµ×œ.Rˆ$‡þýΛ1i·Z)A3Ï3óžÆ7?ž·“¬î^Ý$º×êźËP¹Iþsß77EW]Ž®=?:W»z\==¨ç¡«¶î¬nóM±i›óoÚêýR»±êÿE+÷Ö´Ÿ%àQ·;÷{Ò÷ïƒ&ôÓ¨Û5çwZÿ¾¤(W×\qé/7œš®}Pæ^kMÀº­óîݧ`ê¹ÕtTshÚzðÔ+ä&TuS}ÆÏêH yûq:»ã¦=tÁb¡¦/´x:¬ì.˜> µšöMÝ^Uº½Pæ @é`¹Tµ;Ð0ÚëãþèÔôû¦®Ë»Þ©s#jª®v§~_¹aß¾¹`¡õR-Êr¸¶þ¶fbiy=Œµ Õê9ff–¬— Ì Œ¥Ø¤ôÃdF@ˆñ!÷iŠ @E\ ` H Ås¤ µ¨¶` ¥%(Ng ˜*R©0fd9ÏÈ0#üb.Àš€´k©(@».°o¶†ôÕ劊 @u)Â(†A£±©þìòü:,RxÊVús}æ¯e#3¸£cé¿¶¯§gˆWC´ÎÙYÂjÍx©†ùM„­æ#Æ¿p'Èg_r¯ÏÄÿbÐhyƒpßÌ….šŒcÍü+Á™StÑI Æê(ç^ÿZ9öïºBÿîÀŸh‰±?+q ÖðÌ~ØPjà‡å=™¬?Ðfc91ا/sŽù4êlƽ¬Ç®‡ËÃÄ<úÉbî]Ë™·äx©çB}êßÌTz÷\ð'õ\˜“z.œÛ´ßÀ•2Wœsÿ¤À•âŸQñЮþôáÃÅår½ªË0ÐMÁ7ßøþ›Ö]/©¾ëÑÅ¾ÝÆûÙSü/Arž endstream endobj 77 0 obj << /Length 699 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öƆ@LE"¤¶­šjµ×œ.RˆCÿ~çÍ8M»])AãÇ̼7ÏÆW?·“¬î^Ü$ºÕêÉ»ÓP¹Iþs×WWEW®ï«]}~{¼SCWmݨ®óM±i›ñ†’7mõvªÝ9ëÿI+÷Ú´—ð¨ëg÷{Ò÷oCc‡ ý4Ÿ›ñ¾½S¨  8ù—ŽM×Þ)s«µ&`ÝÖyw€ôc0õôjz´oÚzðÔ &TuS~ÅÏê@ xû~ÝaÓî»`±PÓ'zy‡wÖvL†Ú Mûª®/²Þžhé Aé`¹TµÛS7š÷~wpjúm®÷Ïï½S!¯è©ºÚû]å†]ûê‚…ÖKµ(ËeàÚúŸw&–’—ý97¡\=ÇÃÌÌ’€5â’yA€±›”a˜ÌÑ>ä:M1ȈK,‰¡xÎt‚¦Ù,¡”¤Å錓@F*&" C,çzdèWÌXP€v-h׿akH/‘]® ˜d—"Œbtv"Öggª?»|¿‹ž„2JB^G—5Äkdwt,uà×VââTâ ñJbˆÖ9;kBX­Ï!Õ0¿‰0ºaþ0büw‚õìÓÚë3ñW M";÷Í\8á¢É8ÖÌ¿œ9EŠa¬Žr®õÛʱßsè ýÞ?Ñc>+q ÖpÏ~ØPrà‡å™L Ö h³±œÌiÅËœc>:‚›q-ë±+Á¡ÁòÁ01÷„~²˜k×2#ó–Ï 3õ\ÈOý¾ñÁL¥–qÏRÏ…>©ç¹M ñ \)sÅ9çøO \Y!¾ñýçêO>\\/÷Auº*øâ[ßÓºkªïzTñŸï·ó%ŠÕCü¢t« endstream endobj 78 0 obj << /Length 699 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öƆ@LE"¤¶­šjµ×œ.RˆCÿ~çÍ8M»])AãÇ̼7ÏÆW?·“¬î^Ü$ºÕêÉ»ÓP¹Iþs×WWEW®ï«]}~{¼SCWmݨ®óM±i›ñ†’7mõvªÝ9ëÿI+÷Ú´—ð¨ëg÷{Ò÷oCg‡ ý4Ÿ›ñ¾½S¨  8ù—ŽM×Þ)s«µ&`ÝÖyw€ôc0õôjz´oÚzðÔ &TuS~ÅÏê@ xû~ÝaÓî»`±PÓ'zy‡wÖvL†Ú Mûª®/²Þžhé Aé`¹TµÛS7š÷~wpjúm®÷Ïï½S!¯è©ºÚû]å†]ûê‚…ÖKµ(ËeàÚúŸw&–’—ý97¡\=ÇÃÌÌ’€5â’yA€±›”a˜ÌÑ>ä:M1ȈK,‰¡xÎt‚¦Ù,¡”¤Å錓@F*&" C,çzdèWÌXP€v-h׿akH/‘]® ˜d—"Œbtv"Öggª?»|¿‹ž„2JB^G—5Äkdwt,uà×VââTâ ñJbˆÖ9;kBX­Ï!Õ0¿‰0ºaþ0büw‚õìÓÚë3ñW M";÷Í\8á¢É8ÖÌ¿œ9EŠa¬Žr®õÛʱßsè ýÞ?Ñc>+q ÖpÏ~ØPrà‡å™L Ö h³±œÌiÅËœc>:‚›q-ë±+Á¡ÁòÁ01÷„~²˜k×2#ó–Ï 3õ\ÈOý¾ñÁL¥–qÏRÏ…>©ç¹M ñ \)sÅ9çøO \Y!¾ñýçêO>\\/÷Auº*øâ[ßÓºkªïzTñŸï·ó%ŠÕCü3tÉ endstream endobj 86 0 obj << /Producer (pdfTeX-1.40.25) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20241022140643+11'00') /ModDate (D:20241022140643+11'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023/Debian) kpathsea version 6.3.5) >> endobj 3 0 obj << /Type /ObjStm /N 68 /First 521 /Length 2862 /Filter /FlateDecode >> stream xÚíZÙrÛF}çWô£5SB£t7R®Ôh‰lg$Û¥%N¬¨¦`’`“@¶<_?ç6¤¨ÅIfæ!ÅÂÖËíÓç.} d!3L f™pš‰I1!˜t† TDLG1ꙎC&b)ÃdÈ"ãF=ÑLJæt̤b±Ã‚„Ä’¤A[Q¡b ½µ6 ÕÍ”„hœPÙh$ðhÀ`Dƒñ$ØP`l MPc,4q06 CFãŠP2 Ð'-@„£HAõÇÕÆŠE¨ `Kâ 4 HBÀѳœ³–J³(b*rŽEM”ù!Ñ.¢¦èO¢B0gÐE ½¡.aÌ0á(^ã˜`Ñ‚ab­D‘  ”Eñ$Z ¡*bÖ; ÒÍl Ú•b.t ™“ÔÎcœlL\ƒË\„I ´3¡¡ØXË"æ¬ïÊœ¥N0Óƒd±µ*’!‰ÂÕâá»Ñó猟0þ"?ÍßgÏÊt\eùüoØbß?zö«²‡ý”Ñ)¡Ó¢;etšÓéŠN¿†:¤ë”N)>ww¾¬ì·ÊétÙ/Iú—]ɘNU×¥ØÚŒ[®ã~Õaô"ŠN΄N7ò®v~Ï(j}”ýn¢e'±è$.î ?Ù/]ouݯóRo;6fÀ%Íå=`õ:Ø“næ³î”tˆ¿® ;‡ß‡ì˜ñƒ¬º iÏŸøé×EÊøÛä*ñ½|^¥óª„ÏQÃ?NËü¦§%9´/9J'Y²›ß²s’ÅQ ­AŠÀÅ#È) €ÌÝ·Þ™Ïsˆ;‡“û‘jüEÕ]_"¹ ù®#~ró¡òχÙüÓˆïæÅ$-üØâ‚¿ä¯øÞ9‰/ì¸bçBÚÀÁ󵂎Ҝ> ”‰Ðj‡­Rüò2Ï+ –6îò0pÛ‡aM`â¨!…4bÞ}0ƼKŠyZ¾˜$UòÇa‘Ba¥Á¢L zþ7X”4Aú(8€ÒP-* œÒ›Ñä·{IñÑ6a´bâ „a~žgýüË{¬°AK„ú8×l~3^ljªë¦FÊêG5µ Ú{\S(ZÈG55NBŠ5Ž~S©Œ Ö¨AËÏꣽ‰FXÞ”hï5­Í½_O›{Kkm}DFùpD:ào‹||’B£ˆbûŒŸ¦·Õj0Y oÚ¬†7­¿!¼-§¯£åôAy`c·Qÿý¶*Œ$g&gôc¨ZN}HÉ€ªŽÎo¤' ×èq¿+ú뎮£TëW«{Âþ&ÿÿx²9+`f†Î8ˆeZ¸³tö¢‹> ðçÏý|Ç/§ü„Ÿ¿¢ãÙuU-¾ã¼ÌÇeZ|è:΂Ùx–”UZㄼÌoùÖ†¸óh „pK¹y#“4& ´SO:.’yPl/Šü#ÄyqÅËbÌÇP^‘}àûi9.²õ-ùÅîບM¿¾Ââá ¥»60!òD•›Å2þÿü!"eü ÿÁ$òct`¢'àŸ%Ù´Ê¿»*Ò«¼p|Læã|¸,òàfžmO?e¶5XtüèEaд]\ÃeîkªÂ Ä&Àª˜Œþ1MM¬Úˆ<5,÷ãK?Dw1èþXs!ËûëøÓŽ‹¿þsÙ5H±QgÂÀâ±%7ôš%ôÖÞ@î@g ôÆ;ù°.!· 7ü|=dJ,¸´Wô‚! ýátˆ\ÏÕåªC¹Ø@í}_\é¹íóÐáÇiú´íJ,­›Öù9Ù0¦7þ>¢·F1§ ”õcZl©.Fåè­‡#9º¾ç3à„äYl÷½å!BÚ£¥©½z`hìA"5 @4€¶±oC "„""»~³cü½sÊ—GšÐ›B.Êå $b~„xï¨6^N®_«¢C€ÃCn¨™ÀDS˜p»Û†3é«FÆ¿O5TîU‰b¯U“W”þ¹5ov(I¥D«Rº6uí3õõíHöšñWCïܳ¦·„=¾dc¦ÔN6ãÒXôLõÔ—úø£Õ(Í c72ÈÁL=SG£73¤{§–½Ûy µ•Tà¼ei¢ãIÖç­®±¾vž-gÇͽ#WlPúA©œÞCjݵkgP[6YÇÃÉ.zI­ëmB•õ:ÿ:™¡æåÞÙþ›ã¿ïžžŠUÓä y~Ýf×§øÛØÔmK?HŽ)UÚ)ǔචÉâeš]]74ÕmK)GüU•L³ñÎüjš²í9V•Î~‚ÿ¹é¤ɸN Jžñ¾Ë÷ø>ÿðC~Ä‘yò3þž'üÿP$ãOi5M/«ö¾ )œÇÙ,ážòô·›dÊ/ùGŽ– yç×üúëâ:óŒOù4-K>ãsžó|žò_ÐnÅ‹ôwµÀEZdù„/¦7%ÿí&¯Òɇ)/xÉ+^}Éùg~Ë¿nÕ,d˜œý­àC´½=ÞyuÚ7“®kÎ#õ»8¿ò×Òýö'+?ñ¤zHSäÉ­&ùtš=m\b •ôTññ©Êøm¨‰rš”פë"M½VnH/­¨'iåÅû×ïNÿ~vüîmô“,?ÜÞͧ“»$"ɶUØD¡XEKÙÐ tde_GÆlБª§$;PÒ.ô Ê!Å'Œ½©_zF3þ TÖ,.#%*¾¬iô:O^ž¾ÒqœÏ’ t`o¸-±‹PRÄR=:D4 Ã…}:Ü&“uºÇÙïªÉðàäÇÆhßð·á¾«£ö6éºiÂ&oÇÓdFF™­šä’ÉGØcc¾º}¨[xûLgY=r™Ýn°V¯"þï´Èz²OÑÓûÝ“ƒ7§ëzÚ>™&óê_ÈTÿd-ûƒ*ûÁ+öçëJû‰ÿ2 !~ ¯ÎŽÞîI Œ¦nCòÝSð]-zS§Ú›z¬¾+6MݺÞÔ‰¡þÔ÷0éC?Qšfí¿«Fé}¹×zàÌöŽç‡ù8Ÿdó+@Î./S,½µ;—0t$Ý#»Ó¬‘´4p™×–K6ê}‚L×1Rn²ldßÍ\:ƒG ¬*µÆD~³T;s²§ùwÌÅüÛ;‚[ß)”„¯†8&´½Ïë8p±nJ½ÏTÝî&eê߂ܑ l¾û—›YQV¤k¦`c‡Ió $¤½Ë&ÕuI£}ÓÓül‚&Ð݆ué>@«9à ýœp 'Zƒ£¿ÎæÅr™YEF àÝDÕ.ß™1}f_…=ê= Ù T· Uö‘êx‰Ô>ŒÔ<é=QlˆÔ®YŸÞh}îa¨öéPµê¬€×,!êvKzMø0f·Ž™¾_”ôㆾ>Œø?³IÙ}“j¾·ÔïBW‚Á››jšÍ©¯ÇÆ!hí}-Ttý2$Áôwšú ý¿Æß5Ÿ>Ú§"ýLÿíè#­;ê®£ØØ±ñ†×ôöTØ;„„­{—Œºßƒ›¶›t³qO=íàž‚fð†ƒmÕŠ£¥?ÛÏÇÛ'URT[ô÷ byø1]Ùºp|,èc ɦ¨ÿ)U‡½ÂÁggU¿Œ~¶€†©»tµùa6˪ m«‹Uœ¾\nÑ¿–ÒÔý«È?÷ÿ/£WŠÐÍ­¡§+ez‹þÛ´‚­·ßl \WmÑß›VDôkû˜ÚÖ]Í «'ää},Ý%ÞŠvîŽåiz˜æW£Úɺo{­çtÖSOÇ5ö}ò%M>§{9ü¸˜$ÈF˜Gæ…ÁùY™.ïÍ"×ß[èj „ÿq<é¹ endstream endobj 87 0 obj << /Type /XRef /Index [0 88] /Size 88 /W [1 3 1] /Root 85 0 R /Info 86 0 R /ID [<8D7387A95FF70FE58BA7B270BDB80B65> <8D7387A95FF70FE58BA7B270BDB80B65>] /Length 234 /Filter /FlateDecode >> stream xÚйJƒA†áóýqIÔø'q_¢ILŒ[Ü÷5Æ:½Øjoc+B@ÄJ¬,,lÄÞ[ð†tÞÓ<¼ gfà˜™ýÉ,¶È,aÒcä•…DÐû€6è‡=h‡]è„$¤  º¡ÒÐ ƒ2û¿1lAÖ!›°k° ° SP‚qÈÃ$ŒÂ,þô燡 c²ü…Ÿ PiX*ÌÀ,ÌÉŠ5¿6/;=óZ=§½j²ßK¯E©òZ’šW^ËÒõWXñÍ{àö)Ðz Ü}î¿}dáêp 8‘~ÂðË«ýŽ+ endstream endobj startxref 105630 %%EOF gdata/inst/doc/unknown.R0000644000176200001440000000627314705613304014711 0ustar liggesusers### R code from vignette source 'unknown.Rnw' ################################################### ### code chunk number 1: ex01 ################################################### library("gdata") xNum <- c(0, 6, 0, 7, 8, 9, NA) isUnknown(x=xNum) ################################################### ### code chunk number 2: ex02 ################################################### isUnknown(x=xNum, unknown=0) ################################################### ### code chunk number 3: ex03 ################################################### isUnknown(x=xNum, unknown=c(0, NA)) ################################################### ### code chunk number 4: ex04 ################################################### (xNum2 <- unknownToNA(x=xNum, unknown=0)) ################################################### ### code chunk number 5: ex05 ################################################### NAToUnknown(x=xNum2, unknown=999) ################################################### ### code chunk number 6: ex06 ################################################### NAToUnknown(x=xNum2, unknown=7, force=TRUE) ################################################### ### code chunk number 7: ex07 ################################################### (xFac <- factor(c(0, "BA", "RA", "BA", NA, "NA"))) isUnknown(x=xFac) isUnknown(x=xFac, unknown=0) isUnknown(x=xFac, unknown=c(0, NA)) isUnknown(x=xFac, unknown=c(0, "NA")) isUnknown(x=xFac, unknown=c(0, "NA", NA)) (xFac <- unknownToNA(x=xFac, unknown=0)) (xFac <- NAToUnknown(x=xFac, unknown=0)) ################################################### ### code chunk number 8: ex08 ################################################### (xList <- list(a=xNum, b=xFac)) isUnknown(x=xList, unknown=0) ################################################### ### code chunk number 9: ex09 ################################################### isUnknown(x=xList, unknown=c(0, NA)) ################################################### ### code chunk number 10: ex10 ################################################### (xList1 <- unknownToNA(x=xList, unknown=list(b=c(0, "NA"), a=0))) ################################################### ### code chunk number 11: ex11 ################################################### NAToUnknown(x=xList1, unknown=list(b="no", a=0)) ################################################### ### code chunk number 12: ex12 ################################################### df <- data.frame(col1=c(0, 1, 999, 2), col2=c("a", "b", "c", "unknown"), col3=c(0, 1, 2, 3), col4=c(0, 1, 2, 2)) ################################################### ### code chunk number 13: ex13 ################################################### tmp <- list(.default=0, col1=999, col2="unknown") (df2 <- unknownToNA(x=df, unknown=tmp)) ################################################### ### code chunk number 14: ex14 ################################################### df2 <- df cols <- c("col1", "col2") tmp <- list(col1=999, col2="unknown") df2[, cols] <- unknownToNA(x=df[, cols], unknown=tmp) df2 gdata/inst/doc/unknown.Rnw0000644000176200001440000002342314631624774015265 0ustar liggesusers %\VignetteIndexEntry{Working with Unknown Values} %\VignettePackage{gdata} %\VignetteKeywords{unknown, missing, manip} \documentclass[a4paper]{report} \usepackage{Rnews} \usepackage[round]{natbib} \bibliographystyle{abbrvnat} \usepackage{Sweave} \SweaveOpts{strip.white=all, keep.source=TRUE} \SweaveOpts{concordance=TRUE} \begin{document} \begin{article} \title{Working with Unknown Values} \subtitle{The \pkg{gdata} package} \author{by Gregor Gorjanc} \maketitle This vignette has been published as \cite{Gorjanc}. \section{Introduction} Unknown or missing values can be represented in various ways. For example SAS uses \code{.}~(dot), while \R{} uses \code{NA}, which we can read as Not Available. When we import data into \R{}, say via \code{read.table} or its derivatives, conversion of blank fields to \code{NA} (according to \code{read.table} help) is done for \code{logical}, \code{integer}, \code{numeric} and \code{complex} classes. Additionally, the \code{na.strings} argument can be used to specify values that should also be converted to \code{NA}. Inversely, there is an argument \code{na} in \code{write.table} and its derivatives to define value that will replace \code{NA} in exported data. There are also other ways to import/export data into \R{} as described in the {\emph R Data Import/Export} manual \citep{RImportExportManual}. However, all approaches lack the possibility to define unknown value(s) for some particular column. It is possible that an unknown value in one column is a valid value in another column. For example, I have seen many datasets where values such as 0, -9, 999 and specific dates are used as column specific unknown values. This note describes a set of functions in package \pkg{gdata}\footnote{ package version 2.3.1} \citep{WarnesGdata}: \code{isUnknown}, \code{unknownToNA} and \code{NAToUnknown}, which can help with testing for unknown values and conversions between unknown values and \code{NA}. All three functions are generic (S3) and were tested (at the time of writing) to work with: \code{integer}, \code{numeric}, \code{character}, \code{factor}, \code{Date}, \code{POSIXct}, \code{POSIXlt}, \code{list}, \code{data.frame} and \code{matrix} classes. \section{Description with examples} The following examples show simple usage of these functions on \code{numeric} and \code{factor} classes, where value \code{0} (beside \code{NA}) should be treated as an unknown value: <>= library("gdata") xNum <- c(0, 6, 0, 7, 8, 9, NA) isUnknown(x=xNum) @ The default unknown value in \code{isUnknown} is \code{NA}, which means that output is the same as \code{is.na} --- at least for atomic classes. However, we can pass the argument \code{unknown} to define which values should be treated as unknown: <>= isUnknown(x=xNum, unknown=0) @ This skipped \code{NA}, but we can get the expected answer after appropriately adding \code{NA} into the argument \code{unknown}: <>= isUnknown(x=xNum, unknown=c(0, NA)) @ Now, we can change all unknown values to \code{NA} with \code{unknownToNA}. There is clearly no need to add \code{NA} here. This step is very handy after importing data from an external source, where many different unknown values might be used. Argument \code{warning=TRUE} can be used, if there is a need to be warned about ``original'' \code{NA}s: <>= (xNum2 <- unknownToNA(x=xNum, unknown=0)) @ Prior to export from \R{}, we might want to change unknown values (\code{NA} in \R{}) to some other value. Function \code{NAToUnknown} can be used for this: <>= NAToUnknown(x=xNum2, unknown=999) @ Converting \code{NA} to a value that already exists in \code{x} issues an error, but \code{force=TRUE} can be used to overcome this if needed. But be warned that there is no way back from this step: <>= NAToUnknown(x=xNum2, unknown=7, force=TRUE) @ Examples below show all peculiarities with class \code{factor}. \code{unknownToNA} removes \code{unknown} value from levels and inversely \code{NAToUnknown} adds it with a warning. Additionally, \code{"NA"} is properly distinguished from \code{NA}. It can also be seen that the argument \code{unknown} in functions \code{isUnknown} and \code{unknownToNA} need not match the class of \code{x} (otherwise factor should be used) as the test is internally done with \code{\%in\%}, which nicely resolves coercing issues. <>= (xFac <- factor(c(0, "BA", "RA", "BA", NA, "NA"))) isUnknown(x=xFac) isUnknown(x=xFac, unknown=0) isUnknown(x=xFac, unknown=c(0, NA)) isUnknown(x=xFac, unknown=c(0, "NA")) isUnknown(x=xFac, unknown=c(0, "NA", NA)) (xFac <- unknownToNA(x=xFac, unknown=0)) (xFac <- NAToUnknown(x=xFac, unknown=0)) @ These two examples with classes \code{numeric} and \code{factor} are fairly simple and we could get the same results with one or two lines of \R{} code. The real benefit of the set of functions presented here is in \code{list} and \code{data.frame} methods, where \code{data.frame} methods are merely wrappers for \code{list} methods. We need additional flexibility for \code{list}/\code{data.frame} methods, due to possibly having multiple unknown values that can be different among \code{list} components or \code{data.frame} columns. For these two methods, the argument \code{unknown} can be either a \code{vector} or \code{list}, both possibly named. Of course, greater flexibility (defining multiple unknown values per component/column) can be achieved with a \code{list}. When a \code{vector}/\code{list} object passed to the argument \code{unknown} is not named, the first value/component of a \code{vector}/\code{list} matches the first component/column of a \code{list}/\code{data.frame}. This can be quite error prone, especially with \code{vectors}. Therefore, I encourage the use of a \code{list}. In case \code{vector}/\code{list} passed to argument \code{unknown} is named, names are matched to names of \code{list} or \code{data.frame}. If lengths of \code{unknown} and \code{list} or \code{data.frame} do not match, recycling occurs. The example below illustrates the application of the described functions to a list which is composed of previously defined and modified numeric (\code{xNum}) and factor (\code{xFac}) classes. First, function \code{isUnknown} is used with \code{0} as an unknown value. Note that we get \code{FALSE} for \code{NA}s as has been the case in the first example. <>= (xList <- list(a=xNum, b=xFac)) isUnknown(x=xList, unknown=0) @ We need to add \code{NA} as an unknown value. However, we do not get the expected result this way! <>= isUnknown(x=xList, unknown=c(0, NA)) @ This is due to matching of values in the argument \code{unknown} and components in a \code{list}; i.e., \code{0} is used for component \code{a} and \code{NA} for component \code{b}. Therefore, it is less error prone and more flexible to pass a \code{list} (preferably a named list) to the argument \code{unknown}, as shown below. <>= (xList1 <- unknownToNA(x=xList, unknown=list(b=c(0, "NA"), a=0))) @ Changing \code{NA}s to some other value (only one per component/column) can be accomplished as follows: <>= NAToUnknown(x=xList1, unknown=list(b="no", a=0)) @ A named component \code{.default} of a \code{list} passed to argument \code{unknown} has a special meaning as it will match a component/column with that name and any other not defined in \code{unknown}. As such it is very useful if the number of components/columns with the same unknown value(s) is large. Consider a wide \code{data.frame} named \code{df}. Now \code{.default} can be used to define unknown value for several columns: <>= df <- data.frame(col1=c(0, 1, 999, 2), col2=c("a", "b", "c", "unknown"), col3=c(0, 1, 2, 3), col4=c(0, 1, 2, 2)) @ <>= tmp <- list(.default=0, col1=999, col2="unknown") (df2 <- unknownToNA(x=df, unknown=tmp)) @ If there is a need to work only on some components/columns you can of course ``skip'' columns with standard \R{} mechanisms, i.e., by subsetting \code{list} or \code{data.frame} objects: <>= df2 <- df cols <- c("col1", "col2") tmp <- list(col1=999, col2="unknown") df2[, cols] <- unknownToNA(x=df[, cols], unknown=tmp) df2 @ \section{Summary} Functions \code{isUnknown}, \code{unknownToNA} and \code{NAToUnknown} provide a useful interface to work with various representations of unknown/missing values. Their use is meant primarily for shaping the data after importing to or before exporting from \R{}. I welcome any comments or suggestions. % \bibliography{refs} \begin{thebibliography}{1} \providecommand{\natexlab}[1]{#1} \providecommand{\url}[1]{\texttt{#1}} \expandafter\ifx\csname urlstyle\endcsname\relax \providecommand{\doi}[1]{doi: #1}\else \providecommand{\doi}{doi: \begingroup \urlstyle{rm}\Url}\fi \bibitem[Gorjanc(2007)]{Gorjanc} G.~Gorjanc. \newblock Working with unknown values: the gdata package. \newblock \emph{R News}, 7\penalty0 (1):\penalty0 24--26, 2007. \newblock URL \url{http://CRAN.R-project.org/doc/Rnews/Rnews_2007-1.pdf}. \bibitem[{R Development Core Team}(2006)]{RImportExportManual} {R Development Core Team}. \newblock \emph{R Data Import/Export}, 2006. \newblock URL \url{http://cran.r-project.org/manuals.html}. \newblock ISBN 3-900051-10-0. \bibitem[Warnes (2006)]{WarnesGdata} G.~R. Warnes. \newblock \emph{gdata: Various R programming tools for data manipulation}, 2006. \newblock URL \url{http://cran.r-project.org/src/contrib/Descriptions/gdata.html}. \newblock R package version 2.3.1. Includes R source code and/or documentation contributed by Ben Bolker, Gregor Gorjanc and Thomas Lumley. \end{thebibliography} \address{Gregor Gorjanc\\ University of Ljubljana, Slovenia\\ \email{gregor.gorjanc@bfro.uni-lj.si}} \end{article} \end{document} gdata/inst/doc/mapLevels.Rnw0000644000176200001440000002024214631624774015512 0ustar liggesusers%\VignetteIndexEntry{Mapping levels of a factor} %\VignettePackage{gdata} %\VignetteKeywords{levels, factor, manip} \documentclass[a4paper]{report} \usepackage{Rnews} \usepackage[round]{natbib} \bibliographystyle{abbrvnat} \usepackage{Sweave} \SweaveOpts{strip.white=all, keep.source=TRUE} \SweaveOpts{concordance=TRUE} \begin{document} \SweaveOpts{concordance=TRUE} \begin{article} \title{Mapping levels of a factor} \subtitle{The \pkg{gdata} package} \author{by Gregor Gorjanc} \maketitle \section{Introduction} Factors use levels attribute to store information on mapping between internal integer codes and character values i.e. levels. First level is mapped to internal integer code 1 and so on. Although some users do not like factors, their use is more efficient in terms of storage than for character vectors. Additionally, there are many functions in base \R{} that provide additional value for factors. Sometimes users need to work with internal integer codes and mapping them back to factor, especially when interfacing external programs. Mapping information is also of interest if there are many factors that should have the same set of levels. This note describes \code{mapLevels} function, which is an utility function for mapping the levels of a factor in \pkg{gdata} \footnote{from version 2.3.1} package \citep{WarnesGdata}. \section{Description with examples} Function \code{mapLevels()} is an (S3) generic function and works on \code{factor} and \code{character} atomic classes. It also works on \code{list} and \code{data.frame} objects with previously mentioned atomic classes. Function \code{mapLevels} produces a so called ``map'' with names and values. Names are levels, while values can be internal integer codes or (possibly other) levels. This will be clarified later on. Class of this ``map'' is \code{levelsMap}, if \code{x} in \code{mapLevels()} was atomic or \code{listLevelsMap} otherwise - for \code{list} and \code{data.frame} classes. The following example shows the creation and printout of such a ``map''. <>= library(gdata) (fac <- factor(c("B", "A", "Z", "D"))) (map <- mapLevels(x=fac)) @ If we have to work with internal integer codes, we can transform factor to integer and still get ``back the original factor'' with ``map'' used as argument in \code{mapLevels<-} function as shown bellow. \code{mapLevels<-} is also an (S3) generic function and works on same classes as \code{mapLevels} plus \code{integer} atomic class. <>= (int <- as.integer(fac)) mapLevels(x=int) <- map int identical(fac, int) @ Internally ``map'' (\code{levelsMap} class) is a \code{list} (see bellow), but its print method unlists it for ease of inspection. ``Map'' from example has all components of length 1. This is not mandatory as \code{mapLevels<-} function is only a wrapper around workhorse function \code{levels<-} and the later can accept \code{list} with components of various lengths. <>= str(map) @ Although not of primary importance, this ``map'' can also be used to remap factor levels as shown bellow. Components ``later'' in the map take over the ``previous'' ones. Since this is not optimal I would rather recommend other approaches for ``remapping'' the levels of a \code{factor}, say \code{recode} in \pkg{car} package \citep{FoxCar}. <>= map[[2]] <- as.integer(c(1, 2)) map int <- as.integer(fac) mapLevels(x=int) <- map int @ Up to now examples showed ``map'' with internal integer codes for values and levels for names. I call this integer ``map''. On the other hand character ``map'' uses levels for values and (possibly other) levels for names. This feature is a bit odd at first sight, but can be used to easily unify levels and internal integer codes across several factors. Imagine you have a factor that is for some reason split into two factors \code{f1} and \code{f2} and that each factor does not have all levels. This is not uncommon situation. <>= (f1 <- factor(c("A", "D", "C"))) (f2 <- factor(c("B", "D", "C"))) @ If we work with this factors, we need to be careful as they do not have the same set of levels. This can be solved with appropriately specifying \code{levels} argument in creation of factors i.e. \code{levels=c("A", "B", "C", "D")} or with proper use of \code{levels<-} function. I say proper as it is very tempting to use: <>= fTest <- f1 levels(fTest) <- c("A", "B", "C", "D") fTest @ Above example extends set of levels, but also changes level of 2nd and 3rd element in \code{fTest}! Proper use of \code{levels<-} (as shown in \code{levels} help page) would be: <>= fTest <- f1 levels(fTest) <- list(A="A", B="B", C="C", D="D") fTest @ Function \code{mapLevels} with character ``map'' can help us in such scenarios to unify levels and internal integer codes across several factors. Again the workhorse under this process is \code{levels<-} function from base \R{}! Function \code{mapLevels<-} just controls the assignment of (integer or character) ``map'' to \code{x}. Levels in \code{x} that match ``map'' values (internal integer codes or levels) are changed to ``map'' names (possibly other levels) as shown in \code{levels} help page. Levels that do not match are converted to \code{NA}. Integer ``map'' can be applied to \code{integer} or \code{factor}, while character ``map'' can be applied to \code{character} or \code{factor}. Result of \code{mapLevels<-} is always a \code{factor} with possibly ``remapped'' levels. To get one joint character ``map'' for several factors, we need to put factors in a \code{list} or \code{data.frame} and use arguments \code{codes=FALSE} and \code{combine=TRUE}. Such map can then be used to unify levels and internal integer codes. <>= (bigMap <- mapLevels(x=list(f1, f2), codes=FALSE, combine=TRUE)) mapLevels(f1) <- bigMap mapLevels(f2) <- bigMap f1 f2 cbind(as.character(f1), as.integer(f1), as.character(f2), as.integer(f2)) @ If we do not specify \code{combine=TRUE} (which is the default behaviour) and \code{x} is a \code{list} or \code{data.frame}, \code{mapLevels} returns ``map'' of class \code{listLevelsMap}. This is internally a \code{list} of ``maps'' (\code{levelsMap} objects). Both \code{listLevelsMap} and \code{levelsMap} objects can be passed to \code{mapLevels<-} for \code{list}/\code{data.frame}. Recycling occurs when length of \code{listLevelsMap} is not the same as number of components/columns of a \code{list}/\code{data.frame}. Additional convenience methods are also implemented to ease the work with ``maps'': \begin{itemize} \item \code{is.levelsMap}, \code{is.listLevelsMap}, \code{as.levelsMap} and \code{as.listLevelsMap} for testing and coercion of user defined ``maps'', \item \code{"["} for subsetting, \item \code{c} for combining \code{levelsMap} or \code{listLevelsMap} objects; argument \code{recursive=TRUE} can be used to coerce \code{listLevelsMap} to \code{levelsMap}, for example \code{c(llm1, llm2, recursive=TRUE)} and \item \code{unique} and \code{sort} for \code{levelsMap}. \end{itemize} \section{Summary} Functions \code{mapLevels} and \code{mapLevels<-} can help users to map internal integer codes to factor levels and unify levels as well as internal integer codes among several factors. I welcome any comments or suggestions. % \bibliography{refs} \begin{thebibliography}{1} \providecommand{\natexlab}[1]{#1} \providecommand{\url}[1]{\texttt{#1}} \expandafter\ifx\csname urlstyle\endcsname\relax \providecommand{\doi}[1]{doi: #1}\else \providecommand{\doi}{doi: \begingroup \urlstyle{rm}\Url}\fi \bibitem[Fox(2006)]{FoxCar} J.~Fox. \newblock \emph{car: Companion to Applied Regression}, 2006. \newblock URL \url{http://socserv.socsci.mcmaster.ca/jfox/}. \newblock R package version 1.1-1. \bibitem[Warnes(2006)]{WarnesGdata} G.~R. Warnes. \newblock \emph{gdata: Various R programming tools for data manipulation}, 2006. \newblock URL \url{http://cran.r-project.org/src/contrib/Descriptions/gdata.html}. \newblock R package version 2.3.1. Includes R source code and/or documentation contributed by Ben Bolker, Gregor Gorjanc and Thomas Lumley. \end{thebibliography} \address{Gregor Gorjanc\\ University of Ljubljana, Slovenia\\ \email{gregor.gorjanc@bfro.uni-lj.si}} \end{article} \end{document} gdata/inst/doc/mapLevels.R0000644000176200001440000000346014705613303015134 0ustar liggesusers### R code from vignette source 'mapLevels.Rnw' ################################################### ### code chunk number 1: ex01 ################################################### library(gdata) (fac <- factor(c("B", "A", "Z", "D"))) (map <- mapLevels(x=fac)) ################################################### ### code chunk number 2: ex02 ################################################### (int <- as.integer(fac)) mapLevels(x=int) <- map int identical(fac, int) ################################################### ### code chunk number 3: ex03 ################################################### str(map) ################################################### ### code chunk number 4: ex04 ################################################### map[[2]] <- as.integer(c(1, 2)) map int <- as.integer(fac) mapLevels(x=int) <- map int ################################################### ### code chunk number 5: ex05 ################################################### (f1 <- factor(c("A", "D", "C"))) (f2 <- factor(c("B", "D", "C"))) ################################################### ### code chunk number 6: ex06 ################################################### fTest <- f1 levels(fTest) <- c("A", "B", "C", "D") fTest ################################################### ### code chunk number 7: ex07 ################################################### fTest <- f1 levels(fTest) <- list(A="A", B="B", C="C", D="D") fTest ################################################### ### code chunk number 8: ex08 ################################################### (bigMap <- mapLevels(x=list(f1, f2), codes=FALSE, combine=TRUE)) mapLevels(f1) <- bigMap mapLevels(f2) <- bigMap f1 f2 cbind(as.character(f1), as.integer(f1), as.character(f2), as.integer(f2)) gdata/inst/doc/unknown.pdf0000644000176200001440000033437214705613304015265 0ustar liggesusers%PDF-1.5 %ÐÔÅØ 1 0 obj << /Length 370 >> stream concordance:unknown.tex:unknown.Rnw:1 59 1 1 2 1 0 2 1 6 0 1 2 5 1 1 2 7 0 1 2 3 1 1 2 7 0 1 2 6 1 1 2 7 0 1 2 4 1 1 2 7 0 1 2 4 1 1 2 7 0 1 2 9 1 1 2 7 0 1 1 5 0 1 1 5 0 1 1 5 0 1 1 5 0 1 1 5 0 1 2 6 0 1 1 7 0 1 2 29 1 1 2 10 0 1 1 9 0 1 2 3 1 1 2 10 0 1 2 6 1 1 4 13 0 1 2 3 1 1 3 12 0 1 2 7 1 1 7 1 4 3 0 1 2 11 0 1 2 4 1 1 2 1 0 1 1 1 2 1 0 1 2 1 0 1 1 10 0 1 2 47 1 endstream endobj 29 0 obj << /Length 4213 /Filter /FlateDecode >> stream xÚÍ;ïsã¶±ßï¯Ðd¦3º !@ :Mg.Í]rmÆéó9½Î$ù@I´Í%ª¢dŸÿû·‹]’ Ù²sïµ8— °ö÷.“Éõ$™|ÿêÛËW_¿ËåÄ g”™\^MR iò‰ÍÈ¡½\N~™~üéâoïÏ¿=S:™~|ùõ~>ÿÛùOÏ鿝¥”Ó7?þüöÃëß.ÿúêíå«¿’°J2‘˜Ô9“‘äj²X½úå·d²„g$"uùäÎ\M²\ŠÜA·ž|xõ?¯’DÕDeÂæV"¦ÝœY*2cÑ×6›6ÛOÕúš°º«v7ŒìúÓº¹[‡Èõ¾lY?õ°Éd¦Rá$ÍyySÒK×ËbWPwS,>×%¿›ÞÍDb-½<¿§¾ß¾–ù´¼n¶|ßlÿU¬<ŽL`ºÕ«–^¹­®×ånÇÈÜ ž—%Ôf?¯«ö¦\Òm7 [ÊßüšèD%‰…VŠþÓe&ÒÌ(^>ÕB¥Š–¿Þm›å~±«šõdS‘¨”F÷{œ%x ئÓUÕ¶þ<xK{îû‹‚GÎKI{´¡¦-×;üPùµq5)…Ó¼5·Å¶jö0YšÊé]qߊ×3­³é;\aåçbµ©K¼QÓo>tßö‡nƒO‘1G‚õ“‹È׿B«~îä²ÙáFžÁÄZMïnªÚ“ isáÅøjzãÐSÙ±õS#R•u³Ÿ¿^Š  ‘e=g4#,¼¸ánI­ß[­4ïi±$0Ò¶çÍŽ:o^;YÕż.!Ÿa>Äýã RY–:¿¶ÕjÓlwÔ'ÆÈÒNj×ìâŒÚ¶¸§ÎmUD·=ÖæÝºÓ®®%\®ßÏáªýó‡û2ëæ9ÀÚ“`šL«’œDËmu[ìªÛ²Eô¬ž.šõm¹m‘¼ýˆæŠ^™×ÅúuMUÖKž¾ïáW(•=œË±Ó›uã°DJ*‹ÆÕ’DWžÆ2‰pÀ°¿s·´ží&¹)ë R1®ª¦^ÚÀêËf]Rï {ˆˆÕÂe¶›jຆ«‚kÁHÔ‘ÅÐu–$üpnئ\dnÄ>8ïš?°äµ°Ý¾h +”î¹ §Ýõê§ì>ãáÔY"rÝŸt±^ÆÈA œÇ,xspöM*rúùÉÙuÑ‚´¹–k;}³\V(‡g,c€OÕ‡2±¨ë{¯ÛP&eùtwSÆdM.”‘á×L=-op·kÞè6NEÙð•…'ßëý ä6¬­r’A)° Êw€ä[…BÚM¹àÏq©°©ùÊ©µýÝMbG¦Óö¦Ù×K‚uÛPÏkh‰³I‡àkQ¾M$|ƒ|žÔ4áûî ¢,GÔŠB¥ÎBÙÏ‚¤1ÜCœ-î’oà ŒJå„vîðÐ"¨‚:v=oWëØL´}?Ñ]pÚk*G@%/à†€ )Íè,½ N­—Á0‹a‚‘Ò0ð …íº$¨?uzÀ‡À»ª® ÆæB],Ê£"Y(’Dz)W;° PÉyªÕ¹WspøÖ¾ÎŸÃcRDpãÜÑ>! §} t³jpÁ¯i]g+Wì‘rMMЦPû!e»ØVs§G£æ-TéÀ²Oz{§w¥{ñù"À nFêë½7¾~Ë(+k§«b½/jìç^»]ø»ò¶¬› I|ö—¦gx|‰¶HY¬Î¶…W£ÕÑ:3ÀR?4w0ÙÍ}”tÖ äÃ}»wCdS,nÊ–`@#Ÿ°'ýžxЦ³t^ÕÕî>¶žßiXh H¼Ûw.ÞxòÄÏkI}¦ ®¼í ÛfÅïlŠí®Zì낟,šz[q¿ZÃÇÙ4¾Ç“wÒKl UoÈ:ɬ€=/_]ˆ•“Óø÷„ª<² k¢QœÒR`%t “TK‚tóá 5Zw„ @šÅ›Þ¶3½S`œ(q{{Å!¨¦÷ØXpdnKêµäÉdž~Äß–(:ðî. ™íµ‚y&pä#=‹äÉ49#©=sÜqÎ!á8/¶üTFžö‚îamO?8¦ço€³C0OÎ;Y>œý¯}è…þduƒÈtY/+!• }?$+Øð²£Gbu~PP[D4_qØÕ~í}6æOÚC¿UÐöäñvòÁ m%ÉV›ØI*Œäƒ•1í 2p#gÁ(d–ÈåÅvíN¯¥îùû1[M -{qT±™ò3›'Ÿ¸EëÎ÷#f•³ùQ{0v‰û£SKRtL¡hPÓ6}Ü>iHª¨a…ç| ¶"S:ð 3à{ö ³,e_;˼µO `È|GzFæ¾ïì;û†ç> ŒÎϸûž—°3¸Uüd^îî<ãMdž,=sdó4”y‰Éf¦o¼éÔ¶»!†. p >í¹Ÿ]—k0Xtƒü!õâÞoc»ù´΀§ÜÏw¸É%?ñߎá7~àT­x¨÷Aq‚m…çBÚÅmøA³ýÛ<<Ò;•‘‹/ëH‘gî%ŽÔ3§F/ê†mÒ-·‹à+¶ÇØ>;y‰«Ñ´Í±MZŽùw<íîˆ h>øô§;ćù~‚ë\ïáúgúK6;1Ý“HlêúËL]3I´G¦ó»!OžnlnçÄ^$²:±¡7uÄW¡›¼ Vêèús4¶ÉöÞ“$äÊZÿ;¯á7>â:Šas@³}$›…Ak½©ëæ®*õ3ø;p ï°—MÛŠ"¥Ý·h"ø.J"‹K:jC’SƒOÓÄüM“ІZ”W’OQ–=›?EYÎг mLвJ3ð l×Ô†ZyfAeHùlÖ/.Ÿ:ç¤ÁŸ1¶œöœ>ØÛ{¸ðÛ¡ùŠÕϘ‹¿¢!2æCðìŸÙ#bò ?AwFÝŰ^g5C7€Ú¡›]7t;ÃìFú£§ Ó'DþnÏŽèVío֙ѿÀH ×o´î;FïGØoÿ#`™dÖ›®¼ocôÊNFH-^Ta¸bY^ûÚG=²À§5iôHD+“Âù{<“ >F4C”;(ºS348‰éo6ÏÓÄMWeá]µ$ïÜ{6ûÝfÏýªZ -VÜ+¢¸æ‰Ð©ïˆàˆE•rHÄüª”åù½–î3±y]å´p°Œ&Ñ㼮쳺ÉÄôÓhZ÷@4'0x|àEu _—Eë©"áð ÆØvÍ rQr“ºqd(·>cåÇÕÛÀxq„ìA˜âñPl¦VäÓÎbDñ8¡²^ñ 9¯lcRVudúô{‘ý9+§<;s$¤Å|fŽ:&¿¸“ôKË3 ùÓß°ˆ~Dô!jÙÑ8ÏMÿ—²ð¹| gö­¶ŸªÍ¦\ÆÓ}I–?;)Œ“Î÷Œ½+)ØêÉ×%?ñÂ;åçM¹ ‚EçøçZdi: h¡W;Ë xÉW»¾Û…\7Û ¯¾gðÒg3#ÒIK‘§æÉïÒ"B)œZ6š]f£{>í2bü=0š>ÂÃJƒç®_ÄÃþNŒfF ÇvpÜÿïL7l™'¹.ý¯äºç™Áœƒ»ã”¥ éDZ±ÔeÓÅM±¾f ¥\hˆ¸¡|GI(jð+íË ¼£™\ã¾Hlò J(P=¦©¬œ3Ð.@ín‘“ñfÝp[úÐ7U'øx<°È%Ø;£hòcl>(ÅÀÎe9KIð”§í®ÄÈ¥!jþž ppË{öb)åA€ ­s€W®;½" ¶¢;.5€Æg˜m¹,„¶ÍÞZ”ž›d˜ÀÑ”·À‘Ëê áWô8š ñY0tš{ Ó:ï) ¬ªëƒNœÛ–KØ©R3}ó¸•2Ž Øz”Ýÿ†iç1~2Îï|fÏ3yB¹}NŠœQZ¾ÂD.Ã|7ލ8YRPÓ‘’dRJz«†W:Ä3A3o¼nÃr6¥Òf[]WpDÐÏ¢ÙîœýÓÌönP•êRI‘¢>Œˆõ@d‡¢Z=pLOgß/n\½@Úƒ„®y²ÜæÜºpÈibùïÛÊ×EÚ”Mb5-ûlrp&Þ]œ±™\Ò=3 vï J,+ž&í$:×Ëï/nÚ܆ú}†a(c͸ʂ A”g NÇs–u ×ç˜ÔûvÏ9ü9ïtŽä3ñ³ ZUR½&UD‚ןÏ}ŒçÔAš2»RÍ«Çbÿ <DjO;ã„("ÌáâðÎv!bæ_>Á¾,;Þy”ŸµO¼ u)˜„<ì€/¾¯«“¿Gp (ç`WÌâ>Poæ M5.}åܲ/â‚`s–{%¯šÛhI|c‡˜ìs|tx3Ñ='w²M¶1,þlbFƒ«ÔÐϸ6HgX×Þt>DÓåÂ)÷%Ô­Q`ªµÅË%£Qí "Xñ€ˆ˜Ê &ÐKHÁ'骆ƒÊà˜‘œ 9˜ _FèW±P±yn‚`ùÌ$é´‹•Þm4‰/ Kzé¨^ïù“«ƒÃ^‰ƒéÙE8+VÓp3¼¢Ê3„œ¥^dM†l®>)>¬ÿGÒKèË‚BÃÑbлϱF„¨²òß•øÈ„~ªžë•F5@¿K €5;6ÉÄ?}Öøc vVÅÎ×.A—Â}øÃ—}ôsÑUŒŠS8ªì1ÛÃïùצS§]-wÂ>^(FïªÖ‹3½*;JAè> p¯²†&ƒÔ—jÝÕœR ¼ÚHµ¦øB-B¥Ÿ0ðר#¡!ÿ,õò[ÿ‡J+fÀ,}‘n~å5©ßÂ-ÿ‡ÕÔT¦`­'mÖ‚ÿçÂP oœ•B™‘wÕîûЇLŠÀLx×ë­±û×h½y¢8û¶gà‹882º“‡Á¨ó`Tèa¿Ð¡H@Ã'Nóâä-\ýþ§`ù?<î1ýÈæÑ-·5K‰?öËbóî=v/ºIãù?þô–¥þÈoNÁ­ìëìò~Z8kI hÿã‹ÆÔÚƒšR ÃÿÓg N°…]ô!ª—ç’Vª¨í~åÂXRÈÜ»vÌ Ëø0^Žsž«‡_ý¿"?“ endstream endobj 46 0 obj << /Length 3322 /Filter /FlateDecode >> stream xÚåk“Û¶ñûý ÕÓ¼© AécÆNíĉ{NíKÓ™$xub#‘‘:Ùÿ¾»Xð%A'éî»Ó<‰Çîbß|t=⣯Î^\ž={•ˆ‘a&–ñèr6R3FŽtbX'£ËéèÇàï/ßùîõw—¯ß^œ¥âÁ¯/¿¦ÚË?ÿÇwo^¾?‹(æ0òöÝ·¯/¾ÚžöýÅ·opÿë\<ó=üöóå7g//Ï~=p>Ýþ1ã‰M–g?þÌGSûfÄYh’ÑÆÎ\Ž¢D°Ä@u1zöÏ3Þ¿’áž+)Á"!éJ;+ù¹*ø¾‡¯€ïW–ðm\ý'®8àû«+_Á—Â7¡a×8êÞ¦|4–‚qÓ~?ÂLßÏ´/.ð¾7ð½‡ïå#u éàêïÜ¥öNµ'€©9±zl=¥•Öw¬€¿ñûóø ÿ–ÝŸ0'ÝJ¼ûëÂÜ‚ùs‚öcÐmüYú Tp?9äꓸg¿ÿUß‹èÕ§%ú€¿Ú¤vä/P†ì¥k÷ö˜lý oßœÈÝô…mŽ…Ò§¦Þï÷üFMØw‚åˆ8Éà»uåÂòƒíº%lõ]³ÚQœÿ(ä4çmñ;ÊÜ{ê1ÜQì‹m¸l®™¸‹uø‘¨HTïì¿(âãržUÙù8Ò*¨7%U²éòf‘UØŠ‚M^Ï©²H« ºw¡$ºg—°‹"8ÔKwø|¹ÅÄî¡"Á¤Žš?ÓbêYN1!â!™Îzø­2WžˆE¡iw€Ã$pªq(Â`–æ«ÅGªWùòí†ð$¶²q“r½p]×YÔs7X¥ËÌ¢qìv “¶¬Ö‹`*#å`*£8(‹ŒºÊ• 8²È‹ÌM/gT¾£‘I9ÍìËDõÑé‚&^eÅØGUÙOœK<{(ì¢XÒ Reƒi¼.&u^õܸ›dEMiò‚ÇqP”uSCZ²Ží¸n$ÁUU»#sWzøú³–•¢@”V-ÃÒ‡4c@òÞiáÑÒñ Ò$Ó¶LëÉž™.oäÖÝ•aq<¼z{i÷˜ðчöî*ŒüïD$L'ág¦(É@qëž#\2æ ¯ç\4š®‡LÄò‹H’äÆò×u^»j¶²tŒR ›¤Š¤ž"«ºÉ&yº°|Æ-oñ)ʰ]d‡Zb¦¢p‹Áxyûe£,£‡¥=c¼†™ÈÐÓk¼Xèhûו« ¶±ÜÇEGe§aÐ(8GAëOÒʧσ6—Xø&?Ñ£Þ1™†ûÉÐ åþ–Æ;B<…¿… 32êó7ÜÎ15"b”R[ØÇ Öp5=ë$JC˜Òˆ=|dú“ë>}Ÿœ'˜'ñÝúŒ`‰ åuGǼ…×3Û"+®ëyE ¹÷ª º&ѽñt·ìc…§ÐœJQ+ùÚºêt–©#h{ߺ1~%SðÜ0µ”ô”4'¢°ÉÇÉ‚Ì'è*'Ð )Ï«Ïe­Ó$”Iã膖»(7ÔŸ/ëª^ŠYQùH`ØÓ‹|’¢éJ#„IX¿¿;¦ó¬è`šU“U~E.“8˜õ*Ú>,S*yUÓ¼Í<ŸÌ©3ws­tDàQt­Û&“æ6/וunE2pz¯=L!çT–å4ÇA\d•OhÐúT=n÷åíçY&‡ß!ܸUñµhþj×»[5Ô(ê°¾çø;õxèñ=êvqçÔÉ t¼Âgú z}@\7˜ò>X°óúöx½!3fËYH¨ŽQZX¨}¢\ïm¶çžåa8n'¤nUkVš©VÝDÄ:¸(ëŒzÉ¡`ИÃ`Êoc }¡>)ÍBÕâfOØrGãïÄúçí¾s±ÏÍ †tÔîLÈÔ–"˜§®ã*C#kö™bŪvV¾=Ô¨­¶‘}pž9°¹Å–g »OäÍ€)oÇB†,»w¤½xÇEÏëîâWw%it1Ž6Ydz"b•.²n+õD´‰'|¤‘¾Ì“þB+OþhOåáfÛÇ&boµµ+WšÁ-ÜðêÀ†Ÿe(g‡š€ýt!âüf‹¶'A—œˆäãÂÊ¿s€çÜÇÑç’âJx‚bè¡…pz¬Y­ÊtêÓ'ux'™ê|>Vን‚F#‚"_—›qãØn{²[°.AV;pã\kV{„Òº_°b£tX!.®qƒ\7Þ·.*×LË]¤d“~üÃÞG×Âí“<º‡&2ý¿¿Êß?îAoó’hRª ))ŒkACi!¤$kþH-†² áß…ûiîþ>à4ðÚ3'Ù¤¦U´j½TQ?:dÛö\Êï×3`q?GÏŸqÙ8ÈYÆžúLÉtç­ö)ÏšuN‡Ü–4r¬9õ5xŸÐ{\˜~£%Ñ­ÕzÕöЄw[ópW~ óEØW¨Ñšæpˆ6ßùâ„騅̕Ïfg²ïOS"Þõ÷gB#"o\½°p’DSS²ÊÖNNhœÔtfk fk›t?5 …›fEþ6˦û²NËEj’Ȇ­=ËV©`…±±v¼v,êA“ÞYœ1¹¾liÝšz‹ä²Mîå¸lá¸í´ 'úª¹É³B‡èìYxœ5ƒì÷‘Sïvå§GÙÿÆ^”VÅêóêê>9­O}"ObÂD·ÛvªÙA©­—Ú=#¢±™¶»~+³éñÒ‡]§ÛU/NHˆëIÜ/çiq{ó""xMò8÷CÏû`óÄJ*«r™Q­tÑ|¨Z9MZ0ÒXYPFšt|OPø¹q8žÜ0#F£bEÑ$Sv¤œ ÜȺáqŸ=ŽÌJð8@õÅѪð6wyÆþÇ'B<ôU?éýÖKNOJ=Q¡îYüñ ¥©H¨0ÍØÔ\ºšÿ-l÷öæRõÞÛpµ#žÞsÊil'TïÒ¤ŒfܘN6 ‘¹ÈCêœa‹==ŠX¶’ѺÎa¿Ô:é¥":1]\Ä…ë\$ƒ3Í·lY ƒÉƒ9 1@Iß76Ô…rÈû‰ûa.fL}Ë,¥Äi&æ5µ7ùbA÷0Š…Zy20‘[í‹Ý0>öº„nšl5Az’ûÕZ ¶òÑà ž)µtF¾6°éÍ;5xe®?ÙD²8x^Ñ^ÕÚÞY; aéFn³ÕGªÉи2$æÕÈ­æõÂÅwfhCFÅzyeÔ)W÷Œ'ÔŠ~"¨ÚP’K„ÙœÍNG¼çs‰8'Áƒ<±"™ð X.E¢OFÇ2ø²,ª|jS®8¦+ÙIèñ³ÅþîHˆºÌpâ »›…!¼*ÕDÎÆÐl‰Tpê­wA)¢{ó°;¾BY|2¡,>(×-;À¼È$Öv€¾,GÕÔj‘† §-4 ½¤´£KÌ>cÌ9#ÒøbàØGúc‘B† ì¬XrÛùÿ_ ÆÉy endstream endobj 54 0 obj << /Length 1877 /Filter /FlateDecode >> stream xÚÕXYoä¸~÷¯æIŒh^ÅAv‘ñ޳“¤Ý“Åbv¨Õê¶löúß§H–º¥¶ìY$Aò@ð*Y×WEQoçQïòìbuvþ}ÌûÛßQÓ™;†ŒHÆÝ%¾^!~·`~ m濾aà† sh-4Cõ )tÚZm -ÖC+ì+h†îµ•œzcD‡¡;ô‹ ŠóS ¨ñ#†éQ›~=ÿ1Ç_á-*hwØš¿r°¹K¡&P¾ ÊÅŸ(ä%þ+œ¿‡öö¨¬_ñzÓç”Â¥/ðª×Ù …9ÊN©Fg”Hɼ€Ç$¨¾©Î­DSM>YO—¤ øÅžœêŒïúÄ Õ ’ñxF?˜¬O泆Ó,aŠ=?ô3Ê#Ñ`ãÁp_ã–Ú ÇÚ…p’Ò %Jb8]m #¿»Éš‹!<ì4oM¯Œ2̴ʲ ÒÕ®¨›;7ª«âÑו[iëÙ¤u æñì±8ûºÊª®=Oë¢/+8‘+ê?Ö½¤Iåõê¾i37þ…sÑÞå{èå°ë˜ÌàCÞÝ ý¶KªMbݘ•È_º2Ko’*oËö5,€ns’;äþúÑ‘¶ýºÍŒ/wyµ›q^ÞÅ(ÐrŠCO­ ôÔÍ\X^FÞ zuØ Òç¥E¹§šFúÀ¥^ßfi×¾q„Ø ¢ˆ€î&~‚`ó<ʸçaj퓯Ó#öÈ;ÅÙWƒ,åé6ÿ<”üâ|ñePþW þ¨}æ<ªdªZæúO¤€Ï{>ó1)öåâstð?›>&súÿ—6Ù¤¾ã:$Z(O¨˜è8>-ðØ¡¼£žˆ9q4WßAe©@Ȉƒ ¼^r…tTÌW¨áæwº‚½1=¹p9: ÇñPÐ67£²¬˜Q1˜ f DDý«ë‹÷wD )…Èš) Ï]ªÐèñB4å5;’¦ÊÚ9ëˆÄòè-.|°žt_(é‰Èrtæ:À¸ám0ÕT=«"mp¼.Z3ä.U˜5‡?fT«qß6}Í>¹aÌ塀 : SJ=‹øágãÇ¿Óiœ4#üŠá ¿iðÑ´>8ÙI6úiGWËñÚŽ†íEN·¿åŠÌø¹"39ziª]5$3‰üû¬iÑPp]÷Ù4Œ‰ Ì8³É½UZô›¬53ë=f±­{ë?¦ 2ó´ÞdŽ ·sãfuS§½Á«d¶D°¾ÈHÃ×U×äë¾³¿W`Áük0ýE†uqU¸²}|IÿÒaßΖ@€©vΦ”´Á¸º©Ë ƒw}Yd Ƙ?P¦[( ¨²úèHÃâ…#?T¹Õq÷ˆeÈO½í×|”¼vó뢾Ϫ<™qýŽ;tž dðTr2¿ù¾q¸?¡wnGžOFOðÜÆ†Ã¼[Ükíú«žTÏœÈÐüB á¤Äð0;y4ý .uÖ endstream endobj 67 0 obj << /Length1 2174 /Length2 13065 /Length3 0 /Length 14368 /Filter /FlateDecode >> stream xÚveT[k·.ÅŠ»+Á­¸»»RÜ]‹ÓâRÜJq‡R(®ÅÝÝŠç¦{gwçÞwdŒ$Ïô9ßg¾kÑP¨¨3‹š;˜‚¥ì]™ÙX€üqEu 6 ä`Ù‘ih4¬]mÁ4È4Z`gk{þÙˆ;ƒA®™Èbªè`s³°qظùÙxø@;È÷?†Îü »µ9@‘ ç`vA¦wpôr¶¶´r…dúŸ¿:3zÓ_îQ;°³µÈ rµÛA2šlêfÖ`W¯ÿ A÷ÖÊÕÕ‘Ÿ•ÕÃÃdçÂâàl)DÏð°vµ¨]ÀÎî`sÀï¶J ;ð?ͱ Ó4¬¬]þV©;X¸z€œÁˆÀÖÚ lïqr³7; ùê² eG°ý߯ 0þ3 Û?áþãý;µý_Î 33;G½—µ½%ÀÂÚ P–R`qõte€ìÍ‚l] þ wµ-ÈbðWñ €”¨*éñ?º˜9[;ºº°¸XÛþî’õwÈ %íÍÅììÀö®.ȿ듰v›A&ïÅúÏÛØ;xØûüÁÖöæ¿[1wsdÕ´·vrËJüÇ "Bþ#³»¸€@ /ä`ÁN°§™ëï$^Žà¿”l¿Å>ü|VÀ~Ö`Ȳ È puvûùü[ñß™ `nmæ 0[ZÛ#ÿ‰ƒ-þÆ8[{ô²€¿?ÿü3„ðÌÜÁÞÖëù_ͪ'-.§ ÇøOÓÿ¨ÅÄ<>Ìì@3;€›ÀÍÇ ðûï@* ëÿò/WY{ ßßõBõ?5»ÿ‡tÿÙzÀÇRr€  ûÃw Ð òÅöÿÍú¿\þ_dÿåÿƒïÿ»&)7[Û¿,èþÇäÿ²ÙYÛzýÇBa7WÈ:(:@–Âþ›jƒÿÞbE°¹µ›ÝÿÖʺ‚ k!jo ¡63 '÷ßbk)kO°¹Šµ«™Õ_4ù[¬ù{íl­íÁ*.Ö¿¯3ø¿t]3³\'.vþ¥CV鿳JÚ›9˜ÿÞ9v.nÈÙä… „Š‹ àÃYNs°ç_|°²Ø;¸B\ýÎÈ¿–› À*ú[ô7â°ŠýA|VÉÀ*õA,þ ^«Ò?ˆ—ÀªöqX5þ H>Í€ôA¢˜þAlä 2³C®k ×?rŽä“ì¤\³'$-äF²ûþ÷xYÍÿ! Àÿ@ÈôXÁÿû·ÞÉ ÂÍ?.Î,þ!¥Xþ±‡(-? üù§ H»V^ŽVKõDfý/™Í¿ d2rCJ¶ý}þô.íþ@ÈÆ³þ‰Í‰eáÍ¿ô&þ”qvø/5¤fÇ?jH0GÈóÁþ¿ÎÉöéÂoVGÈ&;ü)'d޶nªå€‚“›ƒ+ØÜô_SdƒHÿ!óøãÂõÝÿ50.ˆ¹ ä^üãÉü§Èf°ºz8üK ‚Û¿ ¤g?r²þ+;¤9¯? @†ï vþ;Øí™™›3d®]‰%üü׃ ö›!/Ì:˜ „¼« i¿ý"JìÁ¼3ÆÑíyóâFΉüÑz‹æ›M1gÞ5or–„ʰ•Ðg}XEXè°8bÉ<6|b,ˆXØ¡X02‘DÇ,uo•øQ"ÑMœ{ˆâ?¤æˆ{õÉœQTÜèÒ‰b©‡9àÞêíí;)#“UT½RÞŸ¥çû>U–±õWåG˜씾 OE‘ëjœ¼£•ÓCi<þ…]Õe23Û+†Æ0&ìZûÓ”X·Œ‡¿s´‹ýÞªC^¤ú+SQT.íÞ%SÑà¯Ø*jAgU¼¶(€Û·¤b ©Ù“QöÖkÙʆŽBãÓ !ü³¨ŸÞ½²ð:*²’9ñÎæ); äž’¡;ËÁúÑeýcÄ„j.G)ú-^Xž,u¸ø¼vÔ¸åL¨hKÓ1áÍ‹müŽw¼‘q=á+ÝÇ™¤~×utä@ 9­Š=Ì0 ¼3¬²D÷”‰¦-x8­±PáùÒÆŸ,AIUÞåãU"¡¡7°À#îþÀFó:Ôð¥øRéiÚWOÞñž™¡ˆ¢–d)·~ƒ£}P…™h¢7Òc€0üûJLNœÔyØLûG¹¸W¼ýÄ,¡©°2I ךÆÖÙÖ®l^í┘‡_´Áòæp޲]]Sçò¼ÖU¦ úÝgYÃCÁd ³¯š×¬†SÓ,„4ê,æÓ¶.ý ÔŸ:;Ó9ÑÏg<dÃô×ÅaÌX;ëÞ–Øn\gí”–œDŽ š ÄÎ=f7µ—;©ŸJ|`¹^}n:~„b•þžÌ¯§G«q¯j(®ÈŽžëƒ™Z§œ‘ÉãhWî2ŒD׊Ž`Ó,JDF¯È‚nxÛ]§¦k4õæÝšçg¬_†)ÓJâ¿pÝ·Ú{DõÅ\Jzƒçzš˜[Fn¯âóW^‘]Sq?i&s÷[Ü“÷&¹½YDßÏÄË”š×@ŒÔ&èp¯%% ‹›)ƒµ*nò Š2ê­oÃöåü*z˜„Lž¥Ì{uN°É¼«ÁlKÅðâb!?>Ô©öw&±XÇ– ¤©í6¾;)){¹Têhi'Én|.ïæB*ŽøàBõÉY5ÚÀ¢ÃnÄ*ÝYtÊ|eÎþñõHöem]½ðcÃI(9±œ Èñ,P0u1‰Æ…F‡ Áâ 1ðèF5äbòº˜È¡)¸‹å|ÏfC(Ñ;¶›=íÍÿDlT÷j»6ª^Iõu+fåcÌå¾¹,Ûë˜ý–z°Æ *¢ª-†(¢iBZiUý‰T·R<KÖ@²Ôšâ^‚᯻á.ô’Ðṳ̀Ø´¯(òKoب ^ cà“Ñu:®v_,ê|'ä{^»í«ßø¤¼Ü–VâI˜–IÍ\°ÈI4<©ûëˆÅ[”h&& ®ï~ÞÝLg?öNKK3fœ…Ì]CÿëîYùÇuY•üó5º‚*–ä‹O¥›+VrRœÇµõZpN~¨G©ª×˜YJbMüsžd“dÏ ;ÞœO¿øÅòŒ°„Þ"¬{‹§?ž(‰GÒMÙNÝ@A}K¯z_NÚ¥DMvë‹Y×<"k²Ô6·ñã ïôȸ“é$?TÌäùÐ|™MS6Ó'f»Ë’Ú=ÃØÄÙ 7úûçK‡{+û×™·È $KT¦ÃÚ Ÿ³6ÊÍãMh ƒJø~†’©¾I‡…#¾ŸÒ%[4T†ØgÒ&Žw§0òÅÛip¿˜Žƒž ú¨iëÜ=ŸÔî8Ъ™pày51š¶íEj€3nö’¨aµ^“ŽëžÝ²\”ÌŦ†‹^Ý‚ …Ž†Ë¦1óò°‹˜ÞŠÊ¦vØœè&5ï—X® ñõé!&êÕVá韙“aOrb4t…ƾÿZ;tàÕ‡òI'Ä>{Þ Ê½ß0¿¦;ùÒ›†ôDû9‚@¾–_3ò¢Û¢(HHã°9ô2;µ uV«ˆÚa9Rù¢˜½Éšâ®ó/c´ç]äåðxwUòWÜ:¹’ük¾ ÊH`áÌbC¯ó¹ªá®Nƒ÷¤wfô¼òÁ'òï Ù£™Y1—B”Ik2‚ŸÙ»öMù4™æ%ƒ(6¾*W ¨‘ð-ï'`7µÏÐ\P¸´Jçúê×SXÃ\k"%7_çaè`–“å'Z¬DÖÁdFPÍg ÐæÎà˜2*ý˜w¢Ø fz_g?ú‘É@’p?¡£ a\ˆ…£žæ’xaãõ™ˆo˦ÉÚ@£ Q“˜ÐTšù«þÕø™Fx1Šß“AìñS'äFªuãÑÅD–Rõ¥RÎ];µ)Òk¾o=b„G¸.­rS`f™Õµ¥ÎíËʱsÿ>áÒ¶¡º+“yç|ܲû–x\倻œ¥åÐÕšÕº_¶ö–\öi¡€ú8Ç]O£bS yB¸ßT¥Ø6nÈôÏØ= {ÞíqsÏ‹ v_&X2éãnúÍV<™E!ϲ=M”¯œ, ¾z\Ôú&Ö|Oä¶,¸(kð?|ð±³dfº’ÕÐïPΆé?ûO0g]#ÛؽoÝ>DgL1æ­è€í¯e²š' ö”á½Dë[8ÑšVv¥´H%]­ÇmŽsÆaÊ!JS -:—mW¨¤™–©±_ eUt7g1¾â$Ï^È‹šYÑÇd c%x÷«BÅþ5cÁæýyU3EW”Ô\XáxKbvdmŽx˜O@Ë¡½’c´Û‹Hó)AIãŠ41ÎȤ©1î ½ïV(gb]+¨äÆKʼn²ÜïÒ(„Ú·.¦s,\«ÒäÁmºSÜôšÌk°¿&:YSšôº0• ”ål5°¯á¿>cG¾a 2|6½)q%m‰BAí­} •_eŒã/Ç“:<^&I€Þæ{$¢òá­A´i:=wÃZqØdRf²V7‘q¶ ´3™tRC¥½·l›\@÷|™Ä¶àŸh‡&±˜ø²›â³[¡ïoù À…óÏÝF]‰ V·::MðÙÞ>#à퇣‚’*u¸Œ‘±Ñ“Z–/çB¯Z«Ñ àõúÚQÜ0P®9ŠÂµ³5gŽõ®ì4ލ²•ü0ýô‹IšÏW'zoE­ðuÁóM‰Åà,a…ؽûÏÔïj …t›Ë0ð¬ÆÏQ¡ _lˆà…£¸ëçeÇçz÷V‚Ô©§’)ivÉSTΓ*‰?>é]@¿Ÿñ.°E7ïl±ÎO=/cÐêX÷;Uöšÿ¨Îà¼cV¶^",ór‰ÎŒ= GÍñ€Åÿn+ô§û.þd§  fB–«å$5o1û9…5Ã|4`¨fƒé¦Û2ŒC<ˆ£Oüû×v‚O¸³~äZK23_B5®l"Žˆ>Z¿js>Ç]¹l*H¸|ÓäÐzëf½8¾_Ý„ÃѱÖQ1Ã¥{Ú½“ÀÁ&ïí#«H Y·Ò/Å}ÕÃνҼš4¦0{£kv÷媂ـÝ|ã|j³ÄãÓ:='2‚[üâ{æGB}5ãçF\ÏÙìËÚ=ýÖøË‡ìM0ÛÌìò l€§ÀsšR ‹ö‘q`AûÏ$p.õñsD¬ºû¡·ϹøÓõ¶Ïcâeûâ¡_ *÷ªá€½ìW­Þ"ÁyºXŽÉ•:5m{íÂE·§×âQn×P”G[ä‹ ÈoéÖË%K-PçÖª­Ö’uÁE1ƒnë;þj1)Í"Ð-ªÇç'$¬[MÐ×¶ŠÁ01a('Ô«/ÞãnÊCá]f)Ýä|òæý43EÚÝûqU®©Á!|9”ÿÅ0ËfÙ\ /‡¹cÌÇJTV°z8_@Qæ'>³í¹©û”LCΗ"aÑ5VB¨]8•~í} ¢o6ë©ñ :/»,mÔyS_V¼vXžÿ‚®ª¹’W7[ú*ß‹i$ÊÂ;¤Wÿ$ÒP éìjtPŽKñè›{|ŽÇM¦Ï-\'J-yrp?æ)šË׉ì¿Lþø)¹3{ {P+ÚqD,õ,{Þœ’¸ºì’€´ŒT-ê¸PÒ Ù‡Ø¡÷×;päI…†="g“ã]¾Ôo\» T½?pRÊ®ñUÀÐW¦W~;XÜ÷Ž|Ù²r¢tȲ÷ž/«&”‡FmЇšeŠuà…ƒÎA&ÿDÉ,™ÈøNŒBö†ˆ«|Dä+ißÁX!ø°žïpCì>“@®?ØòN]DÕ¶ù²’éüÓ„»`ÃîvéL{Ó'ÅÀÒƒ§"­×{g\ÚA6Hªf̈a<…syv@ku7òµ¦­F²8…Çt¬LíΗƒnïÕï¼Ùl)‘)0©dá UÏ=p±<În R§טI^™“ÍAÓ©ÀÑCΠWc?w½ÊÇT1o ˜1Nã{áXOÎ 7.«]èX«ÀÍ$±ß·O}âôÓQÖ ÔbfÖ–‡™±}Q¶ÒrÍ;X#®\ÑCWÍEð²š~­+YžMv“£.~yõqý@¸r|´ÆA;ÄÆ©ïÓ¶T´¿q‡wïÛç_™ó8Áø:0Ãqê…(UÅêEQú]œ¾qRxX-”Š˜j ƒÖ ÎîÈäÝŪp>^©\¿ûï˱+<4¨lÁ\Fƒ‘î}A› &Nš#Ù·ËŠ÷ª»£‚Y$?U¡×>3ïuaD"vºšð4ø{òÒ?½9¦ââFÇ7Ç#n¡4® ¥ôÀ]e‚í0©–­¹ZÔÚ&’ÙLÂ’"JY¦ÞJ‡ª*Š¡8t>Yì¿yUœ|{'% `(PŦbH~1;‚öÎŽæÂæU3 vɤ@‚SI¢˜tà׺PU#ÉØVÒñm¦$Âó;'m^€†›&E_¯m”ƒ+…c)&qòSøU§×}G1×}åfÌ—ý5 —¢ÍVçÞ¬c„8thGÇõìó(íŒZ¥3鋾ð¤Ì^Uîi~@Ö`Æk”ic“îƒà+nZ_ÕZ¾Ž¶—"û§¡8Lv8@w¶ÚK0-ÞODUa´S¡àû1Öî#ØìI«w#Ò?Ö£$ˆ¼#:Åx:ÉsQ¥D«ªò‡Ý®`~Qì, Ø{¬ëŸV<’¥`è˜ÍUoØ™²b§·òÍü6"på¶;„;¨‡ Wï…²´‰Sß cz[,{?=&n>ß3ãYPŸ0[ß ]|P 0Œ{ÇrlP€¦Þ-üaï<<]ŠAp§½ŠîØ=G^/¡é¼¤ C‚Íö%sËç‹”a»4jp°ñc Ëÿhy Å2â…R!×+ä~QïÁ¢¯¯_ ͬ ]ªo#ó&Dœ1rÔ©&pŽZšÖøÀÄV¨Ïž3‰"»ôMÜk½B}(ÿU¹x1 «t·$±Ë?Òìÿ%µL¢´øùÑñÐŽûsRƨæý™áiä@suû‡Œ8Î#¯¤E~» ê7èöí÷¨…µcGlx¥j"ÖíÒ¬šn5ÜÇ–ßB&´eUÃd¬ŸÍLÊßx»ùUµ<¿—ýnì%ŸlÊt˜6~`þnss-hÓ“:ù³žùÖÜ%G¼€. Šÿòbªùµ}wbðEó»YÕ!Fè¥È´$òòM3]ÙTtíÆˆ¬IÄ›à…e-cÞ™ai (œK´’·¶h­‰uz&ê4-V×)+´Ó±Ò2Z¿Àxá«¥I!®”÷ã°­Í$pÂðǸ€ôØóðD“¿tOSѼáÝVØÈ˦‡¯ë)Ã#·zF"áÌn FÇ|~ l3 õjmhlGU¨Z(N ‚× =œ>€±7å):ûK%þ"ryÚÒ1“ÇõÍKÎ=tlø„ÉÑüá«K@õNbÏxptÞ§ª‡@ÑR—È÷ìm¾’³zépÄ»½·‘8;…Êä)ŸÓðߤúf¦L×G!P¦)±fzmŸ«,/ƒ €Ì ´Þv¨fòFò€vr§Ò§4âaUW‹±*#}ä)¢Ï_¹Ý샀•ae2¼–E[ÃQ÷qÏŒBx#Ó¿p°M ˜pýB–ÂŽÍ ;gᇞb_ñtàСfeŸÏÊ’9$µbáÀV¦Ñá*6öÏU[!n·¯"Œ425á9Jó¹¯À£mH–å¾—¨Ïíõu»ÇV7µœ6o¼³" †å§1*åêGŠÞáiµö8ÆŸNåLå‘­ˆ†$¢uoD¢^[«>ƒV=˜Èž‡)º¹-æ_+׸³œ7µ¸”kM=켉ÒpAox =ÄgÆÍÀàEÙþ@[ÌíI¬&Ýÿ¤å€{‡çÚ}¨*Éàsþ,ø£ƒúf"ìÝ•VqÛ¼ƒ~ôu´·÷x²^j- ¢ùžsµ›C<¡^1Xøi&ÅPáb´i¸ÁvŒ¤$ü9à·÷LG.Vœ¤yG#l½_?®¿¿FþEšAÉn½š+îÅõ˜‹CÔH~Y,­VÛÔIj˜/¯¨e ŒPÖ/d X|¢Úïu:Úº/Þ7®xž„ñ¯@øùæ3 »N_ëjABáHE•õ—ŠûóO’ ŒðÌ]ŒCŸ9±„ó7”8Loï=é~¶¹®øQ˜5c®‰èjDÍÂÔu®å¹Ž&ÃIFÇ!¿êi¯Åw† Ïh½rIJ‹³C3—!?TÔš¼ÊPªéEŒa¹YN‹ ×QWož|,BÝ3`¤HWAÍÏ–#."¥P¸Õvb-GDGÒášD9K.µ½P‘_{^Ò¼‡d)ñgøcèpi¯ŽVýîÚ°®¨]W˜ÆWªRâ»@i,hÂ"ö`.xd¯ZñÝÕX_¼ SÍòå‘ཋhptð×ÇÒb¤E‚q¢NèÊoNèÙ³núï"I•ÈM3=á,I¨ìúÓœÃ|K¡)¦)N[jí\‚mú˜š§hݽ„[ÈãÎø{š_WÄÕÌüò€^¯•ÈGV ìËï*ú…¢z0ûõœRD*†—áYŒËBý ^*UÆHÈâ¥r܉²aÃ¸ßæÂ¯ÞÂt^óÚaàš½)ó3’¬—¼Dv.§4^í ÉÎ ~^òÑ*å`uÍüˆAúáç<äeî‘ýTOLñƒX™[;S¦ü»Æ]ßxÔ¼6Ña’ù¶aÝë› ò/ZêÖ5ÈF?Tu'›m·•ä“Óßn"Þ-ˆÏáuØG”)ðÍ” ´xø2ªFÚ7ëY†ƒæªÌ?ª°/÷¾›ÝŠ@W>— ÊØãW{±Å˜ÃŽŽóÞ%PH{éѾžu¦i?ÔSaTŸTɾô*¤|ÎB¬GS£¸EHb._<¿P¡²v M C¦Àò’ÕyX íc•Z ¹gâ¶â û6‘ÈwÕxˆTY&àÏ–Ž(ÔYÛì‹ÌâPrÍ£AÛÌ/~U ÝuéQˆÂÈÝÍ}T¾‘.<[¡˜jÖ$(·ÞÚS§}Ãf•.¦¾³j ÏRÞìz{ÿnÞi¼ÖÅÞ“Ç÷ƒŠŒG3U`Íu¾“$úesNÖQÀÃÝ:P;)ðŠ8Ð3åÒH+˜4$m~GŸÈþØç»=öæÒÖ±„×^f\é6¥ÛT- ’HÅ8ÉHdš ò‹ôÁ)-‚¿ðâ,r„@^êÆZÌOÎB Žp\é °¾¸[è»Ì#Š vÅl¬iE’š• ¡¬œÐÓ Þ†oñ(JÌ7ŠÕ^©$x…2¾`ÅS‚‹€9#¿ªlJ+¤5À÷Îé›ö-¢G¬^ñVÏÜ †E;!²'óíHÞx»;´on^Ð]-rL[¿6®z{`@:Ø õй=\ôYUdz «d¢ëY+eœ(˜ýâé¥kQ³©áÝ£ÿÙ׺liá£o˜Y tȘl_ºßEwhIŒëåD»Jáð·è] –-cj—ؼ,3¶:ò¾’®ù¨kIÛ‰š}Õœ}e$‹sIº×Û’Šƒ[ÝÜØCmçe)#}’5JDh¶Ýgï~c´–¸ê£\w›$?_CûK 澡ËB…†:¡‘¯@‹ Õ9¶¿ë‘²ü¬àØ ä«![ÊV;{›·è8ºsÉá¡åÑpGéQ6ºÜ0ÖØÔt 2ÇæÛâ`MÎÁïרß,Íx%AWi®Ì‘nH¦pÓ0|¤Jö}’ýÄj’ìé퉃/‹tÚMÖï‹ó¥#âÔ Å‘É63Icz÷†ÀVåKÚ¼àœqØÄ¨Ilyon&û\zìWÍ­b¹I}¾}øt»ŸtûÔ{m<—pOÞÙÍêÒ3f«t6Í7Ò¶úú8z@Бk§ùlÔ\…gœLH€Ù¶ñý–ñ ‚òÊ7Tô·û3±‡Ñ6¥Šbú×våþ¨xõárÕ£ÛŒ“*5®9&°_îåÍ“ jÀݱ2jBùïÖë©QïÓ·®?»B½·z®G„GNÍHô)0cT3w›—xrˆ“ÄŽ;BR4I“ÿ$ê©§ º¬Å+½•é‡zK”¡Š Àb„~Ïo=Ï«ßÔb}±ÛÒúÕoüá /)(wïg¨xüUñá§ÑÒoY6R-èÛL³OȱNsõT‰îä³`;hQG/^¨+Ý|9ìXm_â‚ÆiÉyt ûžiÕÆÉ+"œûªær×GRR#ÝÕC¶ãØÒL ©Dý£hWªÂ5 §±U{§»þÔ^z틳½â7üfûPmo†RØV Aû’o-øÞ{¬õ`9·Ñ„²’´‚~ ƒ'˜Pa° ëîK]Ñ‹§RZå¾²Af²3!I ¸j,ˬ’æù\)ûM4G±ž®z0«R„ ê¯(à’’Ï䨩Q‹vL8U×[¯A?ӨÊhÜ9Ÿ×"D‰…]â˜M, ²wH Ëa(k1¯=FõM³JX†qש²_õ l»X¸tå€a¦ùd×½ ]ÔMxGûùu“øSÔvËèvœ3âÓV}†¤é6ÉOÍ,—j±µT~V'Ü{ ’‚}å¡À£X =͆ÀÇžÎÛÎð¬ëÛÄ|/Òf¶K5±ú#Ç¢>ÛG2cid×Þ·÷'t¸EôSeô'O9’ý¡¢’p[Úfª¾3AEA!y´ ý(Y~}?<pâ#Ë87µâüF¹½txÂ,ª[b;VŽý®:ÖöÈüF´‹Ñ¶dL}#½JÆ6\ås`—t“1>WMª‹ÆÖ,ãæ•å¿¹¹û)ÈíV,;ZºÚ Ï;ªi1écFÅd³Ô¶Ÿ[þMölH¹ÈH2Q¡&¶ a€J!cu¿K½åK‡¹3~Y™|•ø7Ô&+lü‘#:Pú·³:"x‰.̓#ÊZaÙ9•yúña/ ÷ÑÒ©>Ž…Q·F¹Ç¶].Ô\ÑCîñr”Å"ë&u·."­S +Õ¦gWâúC)wy€÷Ë.³è¼zpX_þq—XñÙ4ðš4eø,КšƒºÀ 4㮞ÕeËŠèmqÆ]2íî!CFÌÒ•rÆ®‰¤æË:5›v±ÿÝì7¥[Û;Xô:ù˜ÞNYÕ_ÿ`ؾ¨÷½‹wÜDÔ(ÛUœ… $xߦÄUíHŒg®7ŠÌš:ðo¯ˆ·w~ !(ß-gˆ?®éÖ*Ô¼›|ÒÅ—ècm  ïì,’S+Ã/ÇúDevÖœ¬.P8{ÆÝ•ŒÔ¾ý³ÀWÇy{v°&H´<ÅL“ÛGkµ6Ï®ìMýÅîJ¯ò”•QYŽBKת³¿á9ïÜSŸ¡ò³õGZÁ+I&£è뀣ïR…= Uô&ÖJå‡ÑlÊð¡AtŽõã0=ZÀOX]htŸ‡;¯Åâq&§æAÒ…äœÉb¢;¼Ðî­vÑš i,Ç”dC®¡.:羪 !ÖM%þ¬K·ÔËŽ‚†•ñC0BµÇb¬ÒFï /±ªµå|J·1¦.vç®ÎëÏqמ~êiàTŸ¢0ßàá÷ÙœÚçÛCeš¥û*‘|8æF¡ÆÉ ˜xkÖS:ÏïÓ? yÕÒÖÛ­uñ»gOï0 `2WTÚhôD’%b)ÐNadä΋%aÃ$¼üߪѺç1Y ]® %ZKÔEéÇDH +%`Òh‹B»í÷Ф}wuVÉn¿ÝëJÕ Q}!뚸5%áò÷°ø:-ÏUÌ~¤X¯¡Ü)s5üÕ±îÉ\ ÅÅõeúV×%Úõ„Š¿ªÐ>ª&B · ЦIíI9KÃ+`¾šä †M^z³È¬—ÓÆVÌ4{ØŽKQÁð;G?(Žy»Y·ö?«nlaKÒ©†tD ¤õuY*bU›\¸_·‹ª–GêëG¢¤ÜxX¿F MRÄ &m¥jµŸ4(—Ñ5Îú@å‰+Ëšíz1õ˜^c“îÑÓ‡”޼ ݪI}r‘†¾‚‡£°E؆¬¿û1\œy~yk"¯Rt·Â‡ó,þˆHK£§Éù™¶lGì§–R¦¯Kã }uæ(mZÖ"#½±ý¾ø/^fK|z}AÌnÑg“Fß•ŒpWñ ö½ÝÆwºãjÙdŒÃ4°goÀi_D¡ŒS¯ÊëÅŒ²|ß"Hæ"¿¦ní[ãeíghSMuN¦3s²µïëLôS/4×cº63‘jpr˜sõºdýÝlÊë¥J…¬·á6M?\ j$`8Çq_µÐž‡fâ ô>˜]Ñoâ‘„ZñóгPAWaG¥3ŠPZí':rÌ.¼Np^³~þ~á•ìw¹±ôv-M¬…>2pJ°:ùËÛêLjU.ŸÐššs~á•’é´µ;Ò2mA_¯³U›9šnß°ì¾DvÕÅ“q!E”ÔuÏ×ÜÝÓ4U¯j/2ç{š¦Eä?Ãw»×wþ²ZNñÜ=œàÑ‹iÚýpzêÌì[aT Ÿ“ÐìqÊâ_ÓL*¥ÊÿêîÊÿr …Êê©ÅлžÃ ªW÷s~¶“$œ ‚¯·.mõ÷á*Va'¢;Í gª\'ÄâÏM"öôàÃá¦ÅŒ3ùû=>%_ÄÎ_P¤²6ÉDC«Í“ 2µát»§Uƒð3¹\ûK»jlë{í è’:srÎ,³òæøp…ëdR’¢vp¹Ëv®PwAíjl®$bý–ÀÌ3·ªi¯ån(-i pæÊ£½ÌÈÊŠö\ݤìÜáúúüþsÎlEÌÎÒt"LºãöL@eÿèTIg-‡ëêªÅ{0ý|Éš,JòåiY¯‰¿U…áÕJk¶db%NÉ_”ÞnßÚOºd¿…P «¾X÷§û¨_œÈ$¶ †B3#…ÍŽxGy ¤_?÷a‹MtaŒÁˆa›#:ª$~‰î;>XØ©ÍÁ·v` Ì¡9{¾¬è[~ÁKK»0fJÜZU¤èº0±ë§ðpa×eˆŸÍ ¿‚s-yËLê÷‰Ì#i‹ùEEó…(¥ñvµâÔjvô=6QÖ`Ð]›ºþW—JåµVäjâ`_Ë‚wÄš‹ÕìeN±n]W<LQc¨š®tàò‹¶¿ž²:Þî3¿ >@ùg—í«¦õö•Q ‹«þG]|±hFÊœˆ¡[GF±Æ1–ÐØã·utœï6Ë”'äkèŠe­ååçwʨO¨#¨p ?„yÕ)½$HƳAku2YRYuqçiØæFÈ6àL³i×™0?ƧRž-"®zúÉq»¼sš—r+Ê|¹ï!à*õm¢e¡…¥µ¢øö­â»ÐüæÏ·Pžé9J× §).3-ó>ƒ©ÈCY1velr¦æßŽ[ÖrºtZcÖ¬ÚÍ©ú".ïÕÚÐPRÊômPú¶Ý›Â[_á†wRyÕ©~=;#3Ò'ôJÓ¡S+¸=Ih¶RH)çûÙ.í…xFW F®á˜a1Q§ÅžçYT$Ýj åc9ï}íKªvÊ1fÌšoM‡×|cq€vÛ §òC$”ä¹–ûøòШNe~±ñiœÜ“Ëj™ñIÞ"Ç j2Wœë}¥æêÞj¤O‚·Zòg߯\a{^?èYTO‡Þ—zã TØz »5. ùÑdCɽÑýêL´ANÝàí~ÛÎZZo{nŸPç]ò‰¹+o¹Ö·Pæ;rÌm;¿ÉД“þ1vÿŒ‹<’2gàAó#êwyo}®j¼b_–Þ2ï ŸøÎ žáEš/ùvø/{iqz$zËÁý%Æùîþñé»IªÆñg¶’väuTQzrþB¡—«ëx‚$›‘þ­™éÕIð¹çöÊj3Â#<”Í/µ¶RE¸Éºþm¾eÏi¡2Ù´‘C:º›¼ÜUTعD"OKRܶ«‡rPlϾ?Avë?•t€Ü+:†¼IJ%¡Em’èÛš—o³uGÓã‘€åXyÊU e¸Ö?G¥Æ­t.:¾û;ÔUR5b*v¼]YÒGEª‡›•íuô²¶&´¬Ò M2é"aoöY¢ß=6†1nÄôÊr­>¥†›‰9ë9…à¼ÞëPþ4}Ç%cá›+É»„½™…\UMLýœKIéÚ1.0»ÅüŽ”[bh7~"Œ‡°V.Û|ÕÅéSMnÍì½Ù§`Û‘îÝ |ZÄŽO ‡~÷`/“,yrd}kÁÝ„‰Ñ#k‚‡ú=,ì…I•^Ä,%Kvét¼˧hýRJõ>wdie &æµÃwVó _=qväýk¡hñOn¾ûˆZ–ÌM‹iˆ4W"b´96“ ЇÒ;¶~l<ý•B@,ÔŠÒ¼ò½·uQ“Àôôîç :sgö¹Iu1IÓ7ËñŒ)§äÄ ½ßã³%,ºf¤¥)²f«*й®$ ¤k1¸GS¥µÆ )Íw­{ä…V@ÿèFFt¾?Ç~õ‚ƒ6ìÓeÇ?–ºHq=¶Ío‘ÎöéæîË‚Ô\p{Ë¡L4Œˆ´ì&ò c fÈÍ:—Ô·ìdÏ;hà4•= wG¦…ìÛ¯²‹%øT‚H÷ i Émö»eÓ$túô=[£Eó§Ÿ»Ô#* ,3§È%Dz:îåHbagÁÿDhL endstream endobj 69 0 obj << /Length1 2349 /Length2 16433 /Length3 0 /Length 17828 /Filter /FlateDecode >> stream xÚŒ÷P\ÛÖ ãîN°†àîîî48 4»{àîÁÝ=X‚»[p‚,¸>ι’s¿ÿ¯z¯ºª»Ç”1e͹vm*rUu&13° HlïÂÄÆÌÊPÒÐ`c°²r0³²²#QQiX¹Ø‚þ#G¢Ò99[íùÿa!ẼÉ$.o†J`{€¼«-€ÀÆÍÏÆÃÏÊ `geåû!؉ t³2(1äÁö g$* °ƒ§“•…¥Ë[œÿüКÒØøøxÿvˆÙœ¬Lö% ‹%Èî-¢)Р6µ¹xþ­ ¥‹‹? ‹»»;3ÐΙìd!LÇp·r±¨œANn 3À_%”v —ÆŒDа´rþ—BlîâtÞ¶V¦ {ç7W{3à-:@]N â²ÿ—±â¿ ÿn€™í¿tÿöþ‹ÈÊþog ©)ØÎhïieo0·²T¤™]<\@{³¿ ¶Îà7 ÐÊhòfðwê@€´Øð­Â×çlêdåàâÌìleûW,ѼµYÊÞLlg²wqFú+?I+'é[ß=Yþ}¸6ö`w{ïÿ s+{3ó¿Ê0su`Ñ´·rtÉIþÛæM„ôGfrp±²²òr°@އ©%Ë_4<@+Ùþ¿Õàëív˜¿•òµ2½ý y;Ý@'W¯÷?ÿ‹ØØfV¦.…•=Òö71Èü_øíü¬<z¬oãÇ`ýëóßof¶·õücþ÷³èÊjjˉ3ü»äÿ*ÅÅÁo&N;€‹ƒÀÍÇ ðý_U Õ¿³ø‡§œ½9À÷¯dߺôŸ„Ýþ=´ÿ^:Àÿr)ƒßæ ý3æú¬\¬¦o_lÿŸ‡ýo—ÿ3þËÿë˜ÿߌ¤]mmÿÖÓþËàÿG´³²õü·ÅÛܺº¼í€ømìÿ¯©6è_‹«2³rµû¿Z9àÛ.ˆÙ[Øþ·‘VÎÒV 3U+SË¿gã_bÍ¿öÌÖʤ v¶úëf0±±²þÝÛr™Ú¼ÝÎo#ù· ô¶;ÿQÊÞlö×’±sq€NN@O$Ö·Ibçâx³½m£Èãï!°0Ûƒ]Þ\oÕùÌÁNH)7€Eì/Ñ¿7€Eüâ°HüA¼É?ˆÀ"õ_Äà `‘þƒ8,rЧâôÆ¢ü½±¨üñ¾±¨þAìµ?èSýâ°hüAo5hþAo>þñ½Õü“õ›ÐåòÍÔäb{CN@SÐÛÃÀüVÿ•ÿkšÿ«xËÞô¿ˆëÌlûvÿ‘üuž,fÿ…o0ÛÚþañô‡âÍô?!¸ÿÒ;º¾íÅ—·¾˜ÿqù ]ÿIù–®Å‚7½Å_$Ð?MÞÚ`ù_ÈùÖ>KOKÐ?3“Yý¾%fýøÖT›À·Êÿ$ÈýV´í_#ûGÿÖ'»?ðínbùŠëËþmÔÿ¡«ü'»7gðÿ¨ß*røÓÔ7wÓÛãçOÓ8¹ÿ–YÿÑû·Š]Á. 3“´’íMú¶°½ý'm®¿Èí]áz3w~»•ÿç-¶³-ÐÙòo¡ÿ$òvß±¸X:þqÂoµ»¸ƒÿáðÆáúg¢Þbþýv6;ý³æ·»ý¾õÄýd#ýGVo¶^ §ÅøŸ»ÂÔÕÉé­O_çoÉðßOgÈdŠ´¼6±®ùzW+Fäδ;!4Kµ«FÇä½ìÔéú€ŸLW“´át#–<ü cuGŠöZt…ìÙû¸­>¼=ñCǣϓQ¼ÚônÒÒÞÀdá±XC? "1“†èžÏ³£V  td·†þòca »öj¸ŸÊg˜b4£õKæ¨òM²ç (à\˜Hè±Î=Ðç®of±r'_Éäã|Ob8мu7Ù?ßÏ{­Uj°;÷Rê@_cMS{‹¤Èã/z—Go-æ°Ò1ClŒõ“ùŒv“ÿâ×S”ÃÂgµuZæ“£ôíh` üø1kWÝØ¾Þám‘€ÁÜÝ]Zæ‹JkqŸáÞP8âm„ƒ™’[,¼²§÷ÞÖ2̵ÎñµÂñ¯úI=¯=ómD¤mÜÕñ5ÉçpG_%8â«=ÞŸBëÌ2Ê:ïïÖ“'³{êR§®hHð…ÉéèØ…Í ¼^°f6zžˆÉ[•%kZ³ß‹1<ºpžUj™¥÷°kÇÛÓ©NÅ>YEevÚÅ®Œs0÷f•ìñá­ØÏ=Ì08b©é²ô™œb¾+QƒY®U˜ƒ¶Ë²½1\¥Ö^ ÀZô&mùrþl'Ý÷ní¬‚$»1µ›he>}˜#NZÁO/¬ˆGOƒGlUéQE-’YàóZ\´ìƒUØÇºßú„»œ=ë~×R‹®d_ ¸;~ĉË}-ÞÊTà=•åñ8|èŒád5…”MŸ›çÜ}¶dS¡ËÆœYê·’<¡ÊÌ,®ñß_ýˆš O­yz©Ž­D_Sñ¶±‡0é!§#F5X ¦#Þi®NIÖÝÆµ±%¹HMÍ´¬}Eþ€ÏFø½ ^ÚPM$…);9ûò[±#^¼aùc4=›…ûí>{O>'Kq^n+G·hŶ~-× ×Ñ4ñ!ݧæÍôóßQRA:4íCå·G\Ò¦þBöÖ]ìÛóp ¦8qîl(1Owc&¹ráY‘½ž­õüŸÇ~¢š/ä—­E%î]?–š[œPu;ä? Z]©ÒÒx—ÅÎ×¢¹W¼¨ï©ƒ2ix%_/F§‰¶Ø''zö|Io¥«ÄçKÁ³1íñ¿° a‚{SOu‹sá—_i’ãªÂÐ U¼§¥Ó>}nej>ÞM p­eªÚ‰Í 1äi-Žx­$dšâ‘…sj !媺!Q¿«­Ýé=ªŒ7¸USË,—(’€1¬ázæ{%ök‹AdPü˜ruîH4¡ž¿„V›f:âE¼_¦…É)aL#?,yOÇ*=DœÑ&ºtŸÃ¢BŠ"Óõ¢cYgó¡ÌøLsÚИ¢‘6¹j–Î.ýY]a{•F83KjSU™‘_éÀ;RC†] M”[?wS„é|Þïc MÀƒki™KXxG×qÒ–Áº¥$¨®«^‹ÇÃ93h(fxð/?ú¾Î¬­ö.ô‘nŽÃÝhÛi½/=@â„6åÌ[ìÝ”³Ò‰±%§iÔ—Ãë2 «Ôpf¥„öq…­Û-W òãÓ’˜u¹Ìï`.¡£êLü+Òe÷ßa£>ø¥Ùan5Qª ¯i˜ºõ˜CcéàmyxòžŠ¯üÁïRÌt¼bY.Æ ©à£å£$„ê*Ô€`/ã=rŸÿ* }õ¸Ù¾&r <³‹±¥cüâK)=+tžãi@{]@ð~ˆ2î &b?ÇÙPì&z_ŸŠK³‡OÌ9—+ôï6‡¥—Ç%^ødí4bGIÅþίŸ½W×ã$™¹'ù,† ÊÈ¿z±´dÈÒtéR†|Z†H_Rš(ä)Üü; ‹1ñ²AgûFÑaóû­6ÖÖÍÈ*GpÈIº¸ðIÂÞ—S¸E÷Õi¨Ö»Ã ¿WS÷•Oª&…\ÃP.…óã› ó9ì4JšeˆO.È«ÑBrë1iÐÿâ$ÏŠ™öÔ0¦Qjz¦…F®B¨ù5¢„]¡*ö~À<>@ƒÂœ8šFt›úò±„:A­«OjðÙ ”]1à(¬‚åBÄ’Ž—z —Eˆa|“’HŽßÎÑtî‚Ñ¢$Øý‘Ò«“mƒ’›·Å÷1P[pƒÍz×j›‡{ÿ™²‹³YÛØØ/SÜet›È×pýpnã_»ºð%i’j-¥ÝQgeNì®ù̶N‡löˆüþ÷ˆܸ@G€ª>VçpÓEžd÷KòÓAr»4cÅHfvbàÍŽ‰xîäÄÐÓ"¯Ïê™Éœõµ3}vY$û-8Söˆ²p8ylä"ü›¸[˜m)»x.ïI¿oâ‰PµMß&[„Dªwƒô¼2rA㡾€‘ KºÔÉhk¦‡P„¾•n·k/×Â8Q“`Ĩ~D+FÓ5c§XÔN=ûĨhr'GpX±„±+mF˜¨lêGêf°W»:”§¡Æt…ߪ®§ûùa#ñN»“1 ïÔ° ¦¤åª5l<Î3­-Lrd͘iù‘z·Ï*²ˆ™£§ R© »Ë¯„ñü+… ½<W¼ ÆM œ2·¹ÁÕ-aMm×ùCë•.²‰«Ï“‹€d)Çí@Þ{JÏÖñ°¢j€·yOs%% @ú®ß—þ:˜êž> ë¡üÁÅÌù ^¦¤²—isGFÉc—Œß¸ÿÒ·Öàˆ=Šdά‚ 2rÇÀÄÙ‹¦{ˆw¨-ÖXž.ÌIÀ€ô UÌåº!$OªqùP•( É[ª³Õ‚gߊ=5éýTLjþõî!ÇåuÆWõé$É¥÷K‰¼GC2ïâЬñ-f|}ïc×µW=Ü"²¦’+ªÃ6ŽÞˆØ§PžoúóNöAaÊòdMG/Q“—éÏyÒU6•õÈ °—]*ÖÝ©ïª7VöáµAïæ§œË”æµR£èÊïÒR~÷n—Ë_èh]Œfò6žô°õ>Ù½—WdÃÁVjÁ¦èÏ4)ûЋF|ÖÕfnÚ25›ëÔØYƒ,haës–Ï¥S£0)¨¾{apl†$Q`Ï5/ë¼ôx½Š;pÄr¹Ý5f£E¼æºgñÓ?é9?já׆Ó6y*iWô¾¦ÛHEn£‡0s’Å;ÎÆË“ÉÌiœÀÕœ(¿sŒì‹G~czáâ.dq¶ç¶Q=»l‡&÷‘—7aÛ±ISѬ©ª ‚ß@ Äk~Ý·ïwÅã^D;r³Uä!¨Á­Qj唳ŒE¤A¥',yâ…'ÛÔRip¼½ éƒOJˆîš·Y'œ©K+}ŒY›VÅá:Æmô %†Ç+¥øBú–l¿v¢¯ÕvÁuÏ@Í=‰)ѰT‚0¢\IƒöÑ ;×ì° îG_•CB)f “&]Ìù6¿ L#ŽH­/§„ypDœj‡±$x…õSMGç[hh¨eà0ùÔÏÚ½Ôݸm>Úº´÷!GS²ŠˆÃ¢{á«ò8)ÕøÊnžrJ½,kRªáë¯ÅóƤu¨+ë÷’I@e¸]a` –ÓWÎÅÄyQÂ{³®òÔÞ¤}·.œ¨£ö,.nŸ¤¹C‹©ªÔ«sÅñ¼$/sSvvQ?¤ªjú ²d}ªÔ¿ÕÖ…·Þ_uÃw—œß’4–ìî×öt  —Ûî£]×ݧï†nK/CÔ¹Ñðî#÷ÎA…§½Ýäâ:i0p+pu¾xùÀ´‰ˆ ˆÜŠI(sÜÌ9‹Ü⎹—óÅF .Ilùìtb hÞ¥wg;¦Á‹µyñ¥^ªôFËRÕÕvÍèÉöm•á/Åš`[‡—á@¹wºõ—@³npuÛ}‚f9ØðÿpqÕàj~µýé‚FQæKǶÈ0¶£uùE:ÒÈçãŒÙz†œæ|1¬Ái’)§/ÛeÜÔ²SI| vN°>ßyœê±~ËÜSñ‡_Ê;½4 ®ÓVXÈ~ëklð«ñP=„3 PØ^Ÿ#ÄïÝÔyÐ •M¤¸kM¢Ä1oá!M]ÉØðÅlKø8ú|±Ïñ”E³Í  òá¹öËõ¸ã“îJX€I$ã¸"¥%Yí XB ñ)»`’$„òu¸Z™î9ÿ”pG2ÕõiîÅ¥”Ò›&µŠ\#ÏPÜB<Öov ¼ãð‹÷’ÞÒá¼Ñ†_R'–I“ß*É9¤ó{Å¡Ê*1ÑëÆTù~Ñ/€›«æ¾Ñ6(UÅU B‘£½ë 0_-Ç}•ôŠFß,ò@áþÊÙ—=šÐûƒû;ù#ø›Ÿq­8\£Õ°8 42¹âM|HýŽÙ{xMÄ|CsÓß)~œSáÞdÁ 2æ'›œ»è„jìnŒ/%m‡Ä½àµˆ–ƒ¤¼–aL~S2öô•9*Ρ3MX…]ÿ’ñʳ¥€LÎ+>ÒùÙr˜y |M:‰×4ïᆤТ.2Ϊ+XNòõRÉ0,µµp–„*ø1 R@5ôÜl `@$GëÚ´“is‹ñ´`å.i¤ e;,þ¥_š¨”kFQwÆ—Óh‰žŸs»ÄZ4å“!ªuظÙRúTYÝž°::œw"}ð€˜vïÈ>|ˆhHwóºØÏì>E,_pÆ—ŽÊLnÓÚE*´hj€縤(ßè·Æñó!;ü¢”v%$®¾|ªNºf¡pÊ rΜP—¨Þƒú6ã9‚ò¨7÷8g(HÎTÌFYË¥˜´®„‰)Ç$ü‚7Ÿ$w Ánö> Kžï”:].:ô}`²ßâóF³)}‡8&$Ci¶½Y˜’駱Žkº‰*tKP•[ƾ©ˆ‘…’ —.¸¼†ó“¸4·!xÆé—îˉ×l’Z–Ì9^bó¢ 3_NuÓ÷u+*ÝVžígšt'+)¦½MÀ ™r{öÓš!àV"÷y ’KŽ„ÞùŸxµ.GÌó š‡2ô=Hõ‡°Ü‚–~ü« ‹¡¨=£ Ý&£ë0âê‚—$®ÂšRe^wt¥*x)~·h¤ÈŠèÖÙò³2ÿ­D`±žÀ¤Êgã;”Ûº‰PÌåÙY…‰ó¦•£0cß;]û’陵{ߢASc´EuKàÇbܯ!ʵû–×ܦ—ÕÊØš\èmy~SërŽâ sv$å„&~ ‰8Œ7 A¼¡1>¡î¹p`Â,Á7ÎÃÒhGdó µ¯âž½kv±?Aç\-½±Mæ/F¡&G¥”.7qlGÌ;à ƒ³½¦ÓO5Þ?+3ÝNnW[7ðƼ®ÂÇ!.R†¦ Ö øÆœàÖ š)²L‚\šÓGÒ(=§ÊòµNÚ)ßfæ„ ÖvX¡s0¯ýÉT ÅZ´éIt%†2#UrŽÔYæ±øíA =íp»ê!u\É·L¾<Ÿ‚æð–™z3éñ[å$ªc½Ù†ÚÂÄ"Ó6tû~ÂW:©ÄÓÊ ¿³OÃâÞ!Ãùû…Ïj‡kÃSòYù¶žŒ”Æ]ñ**ä.#V½5Eò!„¶[ƒ§Ò„‰¹[f[á=15ã|˜,|uX0ÆtóW½ óÐ_}¸Ô‰eª=­ÔrXé¯Ç…±VB´è£©y^üAz¾€ Ê£á˜iƒÆü}9[·jOÕ«å'³èY=Rè Ìv¯i÷ŸÓ–¦E|)5‡QÔyO°¼³ãÑæ³u*å9mpÛÎi(2]2žÃ÷xèBè6쨣µÇ>Ì¡î(ò$ÒU5XÜ´†-þŽo¦`ŽèùújˆÀÊ|¦ßFB¯ÅW¹ âç!®¹¶~g—™RNÞDS ÓÃÑæÓG$¨ç8ýYsú)ðØ>nÍ0ݹ}˜?×0UÉû;ŸTb Î41ÔïôšøŽ‹àŠöûãmçˆ ¾ß0÷ü &•Åž§ýÎ>=JwôؼNOq8öGPͲzƒÖE.1›vý$?H¶äµå˜%j}­U!{Q2q¿ ÆH¦/"cJ²ŸèyŽe”ÿhZÖ ‡õ$R#󠬨L¯LkŽò›J†è@©yª—Aó„¼m™F*N®'cQ—f~Vk}¥«SÉî pï*€î‡Måo³ÉÍvdwõmÿÿŽ=”5(M+Ë£,GXLX±N¹>6^{Ù³ïfïR¸‚ûÚqo6¼“h?K¡ÇìàÝ1ÛýÂm`¶‚SÑ$÷¦RS@„MŸ‡Í9)¨í¬Ut"B»zo)ÚÑÛp Üf„v õöN YW±Þ\ͳǽAM+¸B[,s8 ù=ÿÊNv?ÇÅ4‚œ“ÙÒ‡nÈÊ‹ë¹K÷l³PÏÜf`Y—ؼP êü½Gd÷­Ê"Ÿ-QPMuçÈ—¿Gmƒˆu˜#γp>¿\»G÷ €Pú¤Å·©wsñ¤ß„ý¬ä‹^ie¹£Ä×…=õáºCTO½¸_âØجÄî&u¥0&8çŠýœöqˆ7?ßsãfökqSFz’-È%2dì|Ó!RÒDåtíóéOŠXq5GýS.•±×}©=˜Ö¾éšÏ0YË‹•NíÒx_…ê&uöû9äc°ÎÁÆ.ôQ¢vë.>½[ÅqëÆÛê;ïÁ«éÌC’§Ó\xrÿ,€ªI²,¼=•n­l[̳©*pБ©Ç·[i×ÅZ5á7dv™äÒ±ðé¶YîÀv‘öU0u¶e”V‰R¸@ˆ5 3GñüÌ@Ó³ck¾Åùò$â=gü¬óø$µ¥B Îì3~¹"AðCÆâ<<¡¶3geü¡gÌžÛ!Yœžd`½ùƒ*‰ÁqibçH 1¦í?KTzV´{é-ªDie_ìk‹Uùu>÷„ÔÍJYÅÞà Z´ÑúgììpŒ×­eí-‹í±ðÅ^´–PI¾Ò(¶˜ƒõ‘$‚뎥1jüoNh]‹ÑÜSÅW;å:­éP®9±ÍkÝëÜɶ½FOììѰ(ô¼§Nu ™,UúÊ9hÐùŸ¹ï6’ÑhCßÅÕA:0÷ô;.ƒS˜&ϺT c „Ò„¿­Hï-ù Æy²—ÄÂYRM°.Ù×5ntÔiÒ«ö7õ‘T«U"\ÆX쉈łá" ÇKèèÑY:”óÎ¡é ½tÙŸAú¼(}¨ƒÙ ·.I«Cþõ1­Eúq˜—U2ûܧÊ3;ë]de@¦Ù,7oô(õšêÀŸãïI‡¥@Þ>cäK©ŸžÕÖ¶ž¸ïÂj¶RâWPüŽƒIà Ú>Y0Óõ.×|÷¨6 w™~gâz‹VÁ Õ!{'“¤$;Éâȵä?ô¡¸®(šÙ±Á(F@”ᥓ¡Z§N¨É]‘‘2§™Ê‚ ޱ •ounL><Ý}Fx–ð¸ÅFRvÝM3ÍÍA‘ÅA4Rðyà.¾A&v8É‘ŸLËû0˜V)ìvöžÅmxªç¾IPÞþu¼HÃËÌûèój#udóGÂhèHÜö推;ìÑìzÎÑ­lÅ(¢q6Ï|xŸùQJuA#jË Þ º®7Q*6¬èë*&‹L;îo"G)&2ܧº5˜Ÿß[ßÒd9^“®ZOê¯FR0Î;\:IïìoíZm¯sÕº(yh®š B¥ ÕGçïÏO–^¨tÞÞØ€,ïÞE+í5bržX+vÃG^ > ›p†U0½3QùØ¥‘8 o†úYîÒºû1UnåÓo*¨…àNø³ŸÔšÄiu»úKKÏzÒã;Q*©ý(¬cž2Z^|lÊhÄ^ÓB“sH¿¸Dž„ó]S@¯ÓêpS]¶ÏwX¶Ô×Ñ?:2]KÃFٵ칂ôÓG½^æô"”åt„¾5gêHwÔÍpÚÅ T®F›ê„è"ÉÞq¢É>ŠmÎ(ìõh×¹¼+:פ5Ê\ÎØ8H!À6{‚ÙK!2½D4µ~¶‰^àæX³)þ¹×8¬A Ñï6œì:¹ærŽeÌÁ{2A¯TÒøx¨*ŒÉZñ”ùÙ-”PH¡ÖÓ¡39F¡‡ô¡»Îm/À…iÔoÂÅé°“V’%"ÌyD<¤Ú£Ð{[µ+T‚*ÿ¹,f²':gÁ¿¹ZQ6_$öÜÖt°¼æ±¶ÄˆgåúR`Œ3Qzt²îÕNMaJÉ/6»åx²ž,.:wöDѺ"Í—¯¤ïî¹ÊMŒI±ô¸TC‹8›¶nû¾ù •¿órJÎwB’ÒqmÖ–¯\Råq›Ì¾c ± f[tœ3à›-“ÜÍÒúü`ø"[`>ÿ³µà6›®¡Ÿ>t'ÏJu™æÝÀ"oµ¬VÔòggmSs' “½¡ŽusÕƒ—¯iI¡!Th[æ‰+ÊîTÏŸ?ÚãÁzn⢉–¢q¸H°]D•* ]ÍL›—Og¬¢wì˜Z‡3È+ÅÛpL]KªØAŸø|¨ò%©=NŒ4œ´—ð #» ‹â8×7£³¨»¨ÏœjìUð-¯$¾‡ÔÌD#Ê^x¨Ùûn'šðå\Š Ö¼+¿Åµ¤bLé$D#$MÀ%/Ú8ÈŠ_Y?¡z™ó¼ëëGžc?oßl–ˆdùÁŸÚOg Žo<5Å'äjJµ…m÷‚S©r:€!hö“µ ˆž0[ß0y¢ëPŒlS#Æ~äÍ„•ÞÅDãO¤y)vû79ªÓ n›Ö£ÛpÍsÉÚ ÛäkY,jÞ“Y>²çóqØlÚÎϘ ÖEŽ0;¨øÛó(ß¡£YÑK¢øî)^þ2„!O'8¹NŽè!E Mèýpé¡Oqé6ëE{~ë-„p84xÙŠëMgf…Q_$¾Êö5à;úÚì»~8!—;¼¨‘³ß0ˆçr¤çÑï…'ÒÏá_ÊY‹QÚ]AÇ}Ö? .)¶"ü:n]†µ•Ùz0ýìR2o_…–ž^¤]»N~ª¾¢©k™ºð@ÂlR‡AC<!±æ \“m/:Õ¶®Ñ›uæ—Ç`Â~¦š&Mõú¶7o2ÏÖÙØ*ï7hlÀ-, ‡Buh¥ÄíÞwp±¡M8ÇÝð€ŠùQÈ’¿%ÑTu”Ò-¢ßïzÄnáK!¼zÞ€ÛþL£½¢&¯%*7ÿs«PÕ±rÔNèªÖ!ÿ\8,r_ìÚÝúNß»’ïb ¹‡ž­ ó]RnVÇhà|/*ñ!éÇ:q/Z-êO3yÁ$†~“–xdGðJ¶+%9ÚDëÌ·jE‡¶ªöˆÄ”ŠŒ %Ÿ)Hþt±„ôÿ ieÕhv¼,ÒOѯ³P%ˆk:C¸A Ç‘ó/Yߤ™½ŒÆÚ‡¸eV Ê!’Mûy\æ«×Ö"vAÔ‰÷53;^™ø|0í1«%ÿ,CP!®+áÒïÑ´üóñSô·‰ÜîX\‡æñ®kmìkœçÈ8©v×´Ä­–sËß>Ï—³30}µ|¡¯ÓR7vÄ[Ÿ@d›¬¤QÓ{J÷”±Nz1¢~åÔ<ƾ¿¿‹©cTåˆ>ü¢+Äs}4΂ ·O½óÄJþTô"Û)‚w÷ÃZòr’'·Ã½®s ´F9vrÂ߯O“dÇÓ&z¶¤<§¿+'GlÀØ.ñŽû¦MÇ œ_yÆ”;9Ä\äÜ";Þ'°éçd_Ûrsip=KG'½àÌX`å4™¥æÁÄ/;¹q' á^µä>eòíZÞ¡ŽþiôK1×ÜdúÑOæRe Ý9´ÌÈPŸ’‡€÷$Ì´¡¥YJÌt»OÀ¸Àá%Ôbò—©+N~×1¹nƒÙf· ë­:®)S¸Áß[å+ësö´œXø”5×»IáK b•:{ ‡’§-@¼Ó©Bž³Æ>%ë=ˆÈÒ©²HR UGYÂ{¤ÄY³øX^Âù<ÕâpsFu£h?K·@‹Z¯”F—Ö`¾odç¾–ú×?˜øð9g†j ð]Ç?kßÖR–deBÑaDb¯R *ù}kb‰ u Ý¥%,ÿÔJ2kןmú².é5ý{ìÝ)K"ÑÀÓõpV¶¾áMÅ/û=7&Xårèþ'&,©oÌ©+lhgórûðq.Ü€¥ÄúÄ»Ýñ-8ÆÐ¶bMCU ÀÑVÓê¥Gˆ#ºvƲGSòªî¬ù˜K¿r°¾ƒ',ƨ Ÿ›«Å±â(òS‘êO4dxy¤3êrU,øéã;‹µ5V£*¨ß¿ôWQŸék'(åún“,¶=ªw‚5£aZqìÏœ·N‚AÞ“,¹Ìßõwÿyw[©—€ÚÅ„sß5ÏZf·¹ß}’òë2ϰeuç)Å8ë$º"ÛTK·àv1ì,É4©YMN=e(Ò‘„ÆZí7SE5ölo µ¼3ƒ«VìbçÐa:-×S†²üëÚf–µ;X>F)-Ÿ”Œ«´ª:ãQžHð?•:°e 5‘ÞSòð$>§ÇR$^³@ØêPO·è¥[³Å^™Ã%H‰ÙAÝ£¡h¶¶÷»#;¶•¾‘«¿Â_“Èäê5)5Zµ»ÞІ¦k‡x}µ’®?vv³ü Çœ^ËôíN3½B Ùx{ê$á#SRlûWáöÖ"stIⲚw|BÔìä|µÓ¢íš„nÂ%gûÖÔ'ÍQ‡Î‘Ò‚ÍòÅ2Ü?î21öŒ 1¼ö Imlè=eÈ唩@IÛºëüIOëM% yí9Y¡Í*w{SéÀ1ŸÐ)U­õ‚uº/EO¨#QÀg:rÑåù=±º„Ù«V2O*eG¬H¿äÎ5¿—?ðÜG Äoª„ÈÕoÎð­HÕŽx¿ÿ®`WZßÇíÄädúŠDk@¦ ø‰[ÎúeEñ›½ös‰ Žà è“þü±•{/F¶{ŒùCäÀÌϨb¢ *`WÎr$,Ø›« Ÿð;r§T”4õŽ£ÞÂr׸2,ôCú{Þšv¥Å'‘P¸mžªÔc5ÉaK7\ÚŽkZ¬`h .ô»`7KÙñl'“/ \}/J>²Õ1vƒBÄ%:›1ø‘Sˆë„–úõ”ç» 8QH8ò¬”vÛßÞª–E&þ¸uÖ.©FÆÞÊÀh3f·pÄ1½îH-6±Ñ•‹'‹~õªxÒ»¼ï^¿tí8ú@É&Q^¥z2Y†²È¼ÀƒøÃútö6RDØfõsmpc#L£T¾_™Ë)¢š³ìi ¡nu­ãkv~8lMÀÇÎc{ú"js>ÚÂ[ȣī½ùCÿ|ÇM\Ò‰Ošró<(¢».ÿ ?2|·¿øî{ìSŠ&ƒ C²Ú\8ng»Û§)õ"5ª4t-K³pŠ<¥—€feøm’Š@ÄÂÍ·/ ›L\ÝW¦¹Ì¨{l{¥R߯ÛfC±j[‘ŽïK2驊g¡*#"ZÐa»îP Œú\ #úLh—LaÃÏZÌO‰`1êZ„•óòðA­l¾ª‹Á±Ùá~8´ýc¤a7A­¬L-G¬}ðyôŒgù“y£ -UöÔ,Õ •è=™_ƒkhë"¬±À?¹ñÒ¡)íù˜›¡‰å6q0n³RNt[ÒÃËÅÊëb º¦(?vÍï˜ã(Ê$ûƒ>ÈÍlƒ±w?¬…â˜è‚9ßY£)§l4Ì\¡-ÅZ–q9pÌ$m÷ Ÿjs$Óˆg|*`é*P·ñšCâ¡”Z>ø‡çùœwc'#™— ŒúMÑ(â; “­¯«ù»:F“À ÄOÂT‰ïºL¨è B¡u¿ÀRú” Ê¿KŒWðQØCiéÏ©ç–<ýïÍ›ÕÅPö›)FfM~ˈs¨+¿–ª(D‹<]Õ(®<Î dغuÛA‹3ÇȲ´6™Ë ß"ÛŽ–Ýϳì/‹óôžS„Ú+ä•+Š#>lHjG<Û\È쀀O˜œ Ê–ÓÌ(ŠÝæbüªÉ2a$ Ï>îÛc þƒŽïs Q }: ÿ¦ØúTåæ»hósù•;â<ÿ¨FDk6Aiò «×1F÷eñU¨yŸÍ=ÒàO©QñV_<µrBGæ‡ÁȽ¹Í4´"Ž_ÝöÎ$m˜àLôBqÇçI“á÷žgÔ^¯Ã Ó¡ó²)@rnª6ëÓ›6ô}¹z’`+«®J3k­XæöTJjÝ~¥uíà¢zyG‚8Ÿv¤„$Åïk:J[ˆ5¢Žß¼ýͰÅNSËC‹×ÆÁHù)•MtåeŒÞÉ]ëLÖ}pUö»Q³*Í<ýK´ÑÀ³ˆøu9!EOS5ù‡Ã÷ßÛO¸c9ÊÃxq¥8–)5D¢´–h4].¯cC JQãªÞf”rƒ?fh ƒë L <d`çO•ÇJ:¯XŠˆ2=F¦¾P¹»ƒ¢¡Šºˆ„pšWà0&„ $*‡î~ôûeÖ.ÿ™{UŽô¢þ`Vʸšš¥ÔVû£Ê¬æ>W z¨-®žžÑZû¿Ês÷˜b9sê4”¾²Ê¬pÈÛ 4»îUâÓH7¯ÍwÞ'Ñ8:5bXuë-ÈܵĬâ3ô¼îè^{ øÚlweíHÏ×¾Ó:•¤ø‚ÆŸ ø—öùñÚ¯§«ÕæKJ7És#ŠêìB eLÊ¡¸Çîñ*D||n ì2³ [ví´ÁÕ¯Yœ¥j‚úp^Ù9‰Rà ¡7…&þbŽMY‚óm#ªËg¶£L¤ª¿à”$ yaz“ÅÑÙyM-ø iùöÐÛü2‘˜æ5BÄ öÜŠ­ÆróϘÌ%z˜) ¥3,6 ‡nzßO°ˆ¸O_$ñÚÔK©U‹À›Æ3Ñ{HÃJ{Ígs'õf?MÌž›”©’#§[½ÎWçù“¸j_Ir$ÐÃÞçE—GçŒá;/!Ÿº4P1¿ Pt£†ºÚw¤4Aµ¡3³”J¥×ú,Âak¾c]…¼_å× H¨ÏOÆ'ŠzÚ¢rº}ÇÃŒuný‘4ƒžúYc7çvEWËeNMó=g碒ÜfMð¹¦~Ýâ}ÞdðQÄ„à6*S²çPQÌ1\¾·ò‘V‰žX¨–‘¬!{s?´ÆÁÿ›ê‡û«…!îd!¤=âYê”'w1‚·â/¶z‚9éGdjÞÍÐÔ#µª±–6Áq;Jø'áÁb.W—›|Á/@,XôU‹²¬Kù:OUM¥.p•¨¼ID~qG\ëè Ærq†¾uq·„e+ºhÔѵ‹¬mOð#43r‡5GÿR[Æàîcٔ߃×J±Yd,ÉïCwoOpÌ-oì¯À8xžRØ 8 Žâ OZѤºÉzOàLCˆÉl¼NÃË2Ì«¸q~¯ûMXÌc”²n…%OVs]Ï—²±+£j•-´»GºˆÀN^‹4#&oJÜý×÷pPÙIL–;Ÿ¯ îŒqY¹Ì˜:Ÿ+¹ Fkøžt|e ÀĨ™Fõ:§’’ÄõÒù¸råâ¿]¡9P¿žá ·‹a`Ï ¾Ã†ÑÓøÒŠÎ9§˜Ã¸ ÚaÏÒ.úúO‹ì¢GžªÖg6ÙÃ3ɘ'žè¬N—Ši!qzèݘ²¼eÃk~Â'vÆ“ VҌո›|ù˜«o¬q¬-$Ú#)‹GåÅoûEYÀ¯¡Èz '„îëEÉ@·›5Á|·mÁ'ŠSíÃeË,Fé4üº£‹¢´Iñ"­¤ËÝíbͳsP<ë(¥bMƒnÿ&‚»HWW0y^(ÖTzëbêmk«b~ð3Ÿ³x|@ÈÀ½&®Á7é¹›w gâý¸¯ÑÞa!K›0r{¸¶é–z¥k:3J³«õj~ûû¬¯ë™¦²ЉŸ›ªá ¿p<í™Ç’\Ù:ZËŸ–"Ye–$h—µu'îI.Ñi‘.(,†Üj ±†rÞmû]`QÂ8*››ñŽ {×L4ä<{2‘g¥È‹Ð>µ,,cû@Lþƒ£óÑ:Ý™r([z¾ŠS‹l*_=o¦ßì´u+`þ"QÚøG¯BÿùÝÁ™/QÕ³ä‡ùJÓY’~仯ú½@ÁI1)Šwî»:­îIk`릨šÌÖûC֚릻ZÞ/sÖµ^éß[»´‘¾þà;(LxhVÓsf9Qòãwà8‚Ÿ ©-jø¡/JéID¼#”ŽÀ/¹~ž~wÆ&Õ®Ž$u_…âJà¨6ÒŒËÜ‘½¨ck™ÁŸHr¸¿ÇÉ_x:g-]î ·£†¯¬¦ –rY®öûfkàÓ.åäà ‘k,¥pWP1ªªÀY„ˆª¼Ã ¡?æ3'Pdƒ‘ãW.¹» ÖD¦‚ªÇï¶ïXt|½\únvk–Å5S|Æ´B¦Û{s{HwªÓ%óƒŸoÕïYWæZš–½^…´hà€Òu¿½ˆ•!,ò+s$õµö§(}ØyžæŸ}–¨ 郤l¹ì㎠µ“oEƒN?ðísK ²ž_úP-ê‹á´n¥0¹Õ^FëY¡m@ü~ù²<ÔDtT]p+³X)m’Eù §þä„êÑEh(šå† ¢îO¢G„FæS\lÚ›,½taØb^VŽY(S¼dyaüxeÈ®À)Ä‚³¼ dNšÄ›¾ºõa4uÄSdùF±_þéö°ç—ˆ•}Ѝ»ð{’_DH½øPë>GËÙíå “Qº/¼ Á¡f+¼Úã=§ew¨âÄÕõå’¼žÍ,­õ=ÀI#K/aÊNü)ï½ýøþ7‘kkKZº_/‡C&Èã¡PúŽeùxi`¾Ê§G0 : ¡Ä È?IßÓÅt{Iy šš%eYà¿$šp vTö›Oi$„¸]‚žö#´¢ð<p/º'b,5dC`wúÒõ´!÷ê ÚÚÑy7H>¼¸ëgþì:Š}^½É!¾ÝÜ$; H顨ÿŠv8\\ÿk—Fp¼§Ø¸’‘p"ÄmÌAìÐD«RZµÒ1˼N¾e¶»6œ‹ŒävI©µTõûVpã,*èh_ˆV+›µá›~଄ÝÛ»º®âkmâÜ•Þï%‘/AêõŠ 㥠Ü58)9ÒdŽ<×O}”4½…òéÍ |wÁbV”S37­ý.gœì]!轆"u‹ƒKÀ¼ eõ€ñý´£xúžÀÞ”.»Q… taèîmâ÷dgœ\Ÿµ³ ë9\Q·IüSô s2ZÑõËÈV*µ‹prú «ÉèdO·X‘¡¼¢óËz|60ìÖ„kdä ¼eŒ“„ŒÒ£v´¸îV¾ÿýÓv“ø¼×„Í=m«kh^«ôAp§Yç—#ìV€ºI‹Û•q1’V ­…Æm¶/Æ9J˜éË­Ï ü´Wâ, Ÿªê½Km I* VóOêß…êÒæ¨ÓˆÌkîÒÍI<{’d„¦´b@ß^Ϊ’tÐ Nôk}Õçwf55ÝÖc(k±tH˜¸!ÓAC÷¹îŸ4âÜ&?WQÖß­³hä†h<Óžö¢ a±Q˜y6Åe§ÜÔ±l0ë×È¡“Œù),ÛEÊEd‘Ôl}·úŒÇ^ô4(lõÐÂü¬Óe麵F®ÅŪB7/ÊÏ®u£Ü‘™ÝÊyu~ŸñÝP ®Pé§R‘h©Â' \FêäÞ¨"’‘¹­ð/Ë Û›©U\ý eqRm»T§Ù… ;†…y«çQœ²ž†ÚÑ×\Ûúò’¦JïÅ(Ђ>ì½îaíG°fTNiûiž^÷ŽËÄ÷ãM vå™…Sk"TÏC]6Æ¿ÓÉ¡5ʸšTöq–ü(¯o«ø;ñ3RD›Q*×å_y—Ý"-è•—mæþo[½¶ŸZÀŒ ÂýÎõbàw {Gȓ咿Cy±»ÝNQfè©æGŽtüZßó WÈŸÞt‰€œŠK"lŸgt„g˜åDk¦tµ,-“¦ÿp¯öÚ-#µ Úáxµk"[ÁÔ \UFme>˜ãBnŸµeƒ—Uß0Ô¬|ÒòŠ]®£è‚þ±Ð¹xI4(Õï#Žwç«X[¼Íü2¯Ön¡`͆}†wÉ^/{e¥_=nXŸµÜÖ¤G˜# Ÿƒ>xo°Ëoƒvj÷u.;ç(ÂBE+‡UóÛðtÍÒ endstream endobj 71 0 obj << /Length1 1614 /Length2 13308 /Length3 0 /Length 14132 /Filter /FlateDecode >> stream xÚ­wUT]Û–-ÜÝÙ¸»„àînÁ}㲃[pîîÁ]ƒ»»»,¸Ëãœ[·nµ[õU¯>Vkké£Ñçœm-JR%UFaS{c „½#+ @]å«’‘‘©¥½£ˆ½)àÃÌ OI)ê4r²´·3rò¾Mb@€õË—/ð”Q{»ƒ¥¹…€æƒ–žžá_–¿BÆîÿô|d:ZšÛ¨>^\€6ö [ ÓÄÿ:Q8Yf–6@€¨¢’–´‚$€FRA ´:Ù”œm,Mr–&@;G -ÀÌÞ`óÀÄÞÎÔò¯Ö™>°„FGÐÄò# èfýåb€€¶–ŽŽïKG€¹ƒ‘ÓÇ œì–v&6Φø°›ÙÿMä`ÿaûáûS²wtr4q°9>ª*‰Iüƒ§“…‘Ó_µ-?Ü{³HS{ç¿ZúÛ÷óáu2²´s8Ýœþªe ˜Z:‚lŒÜ?j€,ÿ¦áìhigþ/  ¹‘ƒ© ÐÑñæû¯éü«OÀéÞ²qÿ;Ûþï¨ÿä`éä´1c‚geû¨iâôQÛÜÒžù¯­"mgf`eù‡ÝÔôOŸ ÐáïÑüµgh?H™ÚÛÙ¸LfðÌ öN%4ÿ;•™þïDþ?øÿDàÿyÿÿÄýwþË!þÿ=Ïÿ-álc£`d ü; ðÏ; øë’ùoÁF¶–6îÿSø¿G~þƒãÿ„"ídô1a;ó1X˜Xþa´t”°tš*Y:™XÌŒl>¦ô·]ÝÎè`ciüPóïAYYXþͧfaibm÷ר9ÿáÚ™þ;õþ&ά"".­ FÿßoÔ¿ã”>”wRs}PûNäíMÿsñŠˆˆ½À“‘•“ ÀÈÎÂúqà>ø|açüþ?Tüˆõ_ky#'K7€ÎGÛ™5ÿÏ¿Vzÿ#ngboú×^Qu2²3ýØ^ÿiøËmâìàð¡êß'þ£é®ÿÞè@ Ð~yÁÞ„7Ð*%=Õ©'{`LL§§‹r T\§Vç[iß铲õ¥Ìð¥*ˆ©~‚ç­Å}þôº'C·?Ô…mCÝ™<Ï%üNNÛ‡¶NÕö™~ߟY¿)õäk„çŸ9¹M(m.ýí1eý¢h¢‰6vØ?÷´¾ä.y¾˜w do“äÚh¬_¨õ`èÕùÇ'TñG÷wÔ}Ãý—Ÿº÷è³¢á(yp¼IœÜ nêLÞ>=¹pÆþ„S t#â£ßPQ Ü“û ™}¤åëa”õ•_´Ràè'A±O£G7ÅÄ.÷Ô>¼#µÇ«â;«@^çUãì®Ãd‘;)¡z ZnÉÉÀ‰bðÜ-¦±_4ð`)Œ—,Ái³e•O>&)n’~:a„%Ú+Üa|J –oÑÏ~¶S|GNRâÆ ã|Ó­Ïr£Ü“@Oà«xé¦}û ¹õþ“É1Ø·l\®[Ý >¨a¦Ì··†‚Vî¨hÉMþS˵á4Ëmà¦þËl«N²z½ÎïéfݵóÚT€KÞÛR<â VÔ£¯­çuǼ/zõ«Ùc%À ªb.Ÿ!ª7oÇObìC*yü¡‡a*I¢Öˆ#á\¶QÙbUyO“=Ø8Y#^‰Éªjiý"LŽ6üL™…Þ»–y¯d¹‘éãÍôk§‰¾Àv‰GY€$TœÌ#<¦ÍÐ}ÝXj2â9‹<àŽ‡mâGò¦C¢¹tKÄé•nE1­â/B¸øò2Øá˜®Á,*‚ŒÄrs´¾²@¿Â¥ çÄ9Àî´¢H¾ Do“¨žæ­àÏ}~Hi´n/2±‹ß `*ùŒ ¸Žýdx¿±à#öóꔸ,SìûL¾ï,ÅR” sX$:‚WòòR©^š»”#7Uɯ3‡é§ ·@Å| ßðŠw¸>¶ÓóÙÄ67ÊŒh-ìU}†tqãoJz¨¸Ôrÿ”Q¥x¼qn…ЫȌ™ÜzH jYƒƒÅ´$ãÉ!}4)¨ZÉnãî­ Mû#­NŸÕsè@|ßùxÕpÃôâ³!-²p•¶¹£BÒ†±¯ C ‡7™òÈE´׺Æù½×ùlÀ%«Ê"R„ËVšb`0“µ?urŽ—9®R2#ßr©Ó¹Ž¡–’FêéþvJQ?ÛW€÷å¦XDò¸—WV¶*}éÉPMƒ VÖI=%¯ü ¹ A*ÅFÖz£Ãþ¤éþCF-m@Ê;ßÁ£=…–škU’Sfœ9Fpný#ùz#Yø§Jƒ"HAø_Å:_¡£ )UÊ„-¢š‚ccº½‘Ÿ¸‚tûÖô‡#í¸TCöP憠KÀb‡›~~“â( ,HôD³˜Þ¾1Y£íX/ÔOÍÀ¦ø}Æ"P= )/ë¯*_ˆœWr}0ß–»Ãš<“i{Eb#`¢£ä™¦l¦rªJì!/4è4‚mIç·ú{?Ì…®·)këâË;N{—î MË~0.ØX<\˜ÝìsøjSŽ•I[ºØàC™,§žIjì<â¶\ždö›°Ôª(‹¹P sqþÒýʵ°INö|›âììÅõ¹OY«™†E“‘ЈX˜)ßѵ/ W´€¦ò&F&zè§Å•[«çØq 庇PO>,W•b ð öÒónexW±Û+ –‰ô÷|c¬ä`ç’Bc µES°ÔÏÝVÅeÉèìèŸQ>|n36¡—šJ¸s¼éºr½Ì¨Q-ƒq€}M21)jIW›8ÁhFB½Ày ã"­POÞ¶Û •Ë.<:ü5áÐmiÁ­àdÙ‚…øŽ[GÝo°Ì }Æq‚`SãÄÏ[åUàÙŽÖ;dŸ¾ÅÉÒÁœYQ‚vLÊ;Šèé~ â_ Ïä+º¹N:ù/vÔpŒ,#òãô›V;ª”Èlý@£%ÑÂV7/±º½{gÐ+Ú¾?Zü>Ãõ)1¢!ÜÃÙÞ­| 5Šyù‹ñ¼‡Ï´­yÅ^š gÑ]™‚«MðáRŠtáü]¼û¹TYS-–¹iÞ‰# ·á,–Eª:Š¥¦FÓe+!¬ÚÝ\›²<SáDø Q3ëϺl8¸H²í¥ó„{ô C?LRG†9EòYë}$–]xŒ)Ò‹!‰ä“7È|»a4VúÈ.š$¸µ0¿Ã^ét ¬éé…iŸ¼ÖA›óÀÓ¥!sûgå~:ÁIïö”ß|äO¶&ƒ¼Ø€øDdo¿HeRZ°ÒÝ,š ’ƒ¶âY¡ Dhñ^ý8œPáót’êd3Œp/e ¼ /ðs¶ñ‰ᮿðjêçФ>ãwÚV"‘öÕ¢ÄZƒ÷A3{ðö‹(52ü êÄNó›WOõPÐ1˜qêìKž•O2æ_~ÐO{µêµµ½ðòfh-òq\¦O'ÔF¹‹I7"to1æc~)‚*x@jWH²TÇ ºò2ŠÀN|—iˆ†;ÈQ"ÑäphÅK rX.û ¹wãi5B ÎÔg/*é x7n·.Ú±aN>×Ð3å¶ÜЙ·I•XK¾švC‹þ»÷.âq+ ygÊ7›O!Æ>”ubÈ”†E ü äÈ]¨íB}SÓœ°9½¶ì*‰gT]±ßµWÁÓBïjDv—Ñ:€ò£ot¶'óÛBq5ä(u ™·?<ŒÅ§& <µ¨ÓýRĬ˜Î0â ÎØßj\ll„˜\é÷œá¯oêGMšµC«lHZm®2=Å*TíiÐLXvƒß4”Å <­D0ök¿(a?3(:Öû (;‹”ýV™ÖŠÑ“¥iF‚B¸j{Ý(æºÈÙËPÒ2×e]ôPoÎhMvŠ|”„l?}Ò#‚å½Ó± RÈ>².ÒT§´}ûUzˆmájÈ?……¶®&ïý¶K(Õi$ÀQborº/•†dV Ñãß„~GÑÎÇ6œ©‚±‹)ê[YX:ÿÑå®PÇ|¢ˆÛ·/.´ŸëWܱ[Ïжø'ê;¾¾g4XRü²g¦Žp«·’ÚŽ!ËjðèÅÎCæL-5"ï‘1¬~ ž,1Á-þóhSk3ÂNžÁßÌuIrqvì-’Çg4€]¥~ÃøAçU‚voœ‰}µ:;]áGÓñó×*‰Á7J[ ¬Æ «Û$°>×Ñør}h”˜WÕ^”ÍâP†#(«–bÍ^}™ò!.mØûì¡­JÖ†ß-²€…‘‡ª—˜'w» ZWdðà “¡/%IåW~5ùsæ&X™’59€y%Wz憤Jwr劉)pC2Ê‘ƒ ß ÉÌ¢²ü83Ž2×vHäq*çØ g#á¼½ï+T:[ßÐóQ¤½¦‘ 0i÷Þ¥Ò‘Ö°=œuÞ7âï–² eødåÙÌoû½kär²[D4tám»±ÀK Á†e%"ÍìöµœŽ=¶…[(¢tÚoÅ¥*‘ðvñÄm¿\ÉüBJ¬XrŲ éÞ8Ë›D`·¦âß%gÏLÐØ‰Åÿ4-®¥&Êbï ï»â<³/Ô‡­àåçÛ땽¦«¢µ5 ÷­S(ʵJÕ`£9ò„åõ¬Ü€zhk£Å$X*='áüî±€2i—¾püP3Ýc›•óÎüÀ-O€wUWZ‰L°E†7Â~5ƒø¸óN’B’ÄjOäø+£»˜I”i«=ËdyH9«áî佇K76–xrÒÂÂZJRy–oðöÍ}Îj/šÛ›’¼7kåvÜB7Æt1Áÿr}û¤A0Ò1 yâ´ó;öçùă¹4«Æ +%òã¶WTú¹èKCÝ'ˆ«ØoØ0¥Ê†&YÁÜÚ‚:¹\™µÈCˆ¾Á»ü°õkû›ýÀÉÍ #¸ÏZ¿‰‹¢:ÕOá”x/«–⨠Ú#íšNV-yÞ)¬jüÝójt”òÞMøÚÎÇ–¹™ÄI±\0øÛVtû4zšï$]^çÔp[¿Ÿ/÷–—“x~c¹ÓÜ;r}XYŸ3¡» ,è}G×FHIõ\Ùûƒùx€,åŒ3t:âwF4iO‡+bø:ÿó¼<ËNÜ„‰tª+;Ý}QÚšz½²ïíÆê1ú†—ˆüŒz\/M¼*O&:µ 7¹Ìs£-d¦ú Ü ÞN…)LùÀGÍv¬ëJÖï’%‘èÿÔC`œ±‡áHUmGtjÆN½·3—0ßQGšÜ©ÒºŽ«÷ÔÚ׃Z2l6ö‡kNK©’èx>A_¼‚DšÌIÊp=²§ïšÚö`)¼§&ú~ir)ÒiÛå|ÿHQk»¤²Èw{^ôŒ=Ñ ¥ ŽxXP‚Fì‰cwè*½L½?U@q©vÓò”]刭‘¥!k`v#GïIA͈…,|™#OÀ8lE~>>Ú¶ªÛ ¼žH§ÔíÓZ±§‰#m¤¸œÍD3G(!ð‚œw:0 ŒâÏ÷`šÍÝd ÿ.QOÃ'dŠÑl-ko¢Êdý®Òªè.Yî¼Ç¤—Qï0ýø>íÓRTtåž9ìÈš!ɲ/Ê{ïâT¤°À½…b*eú–é€J”2†‹‚ÐFÙÞRkd‰–‰6ššé¹®ŸXv4DÉšÁÔãŸËBxDn¬uʇ  KþÁlø iª\¡·ºXÝK0Ž.è®ÇÓNBÞ‚ ¾ñ,*¬$÷y’Ü–"ó ¼˜Þò¼ÐE¯ ù)BÏ€ÖáH‚”WózتßïøÖ¼ ÁN¾¦à}ƒµsÃsá"EÃýEQôLü¨¨rËkçØSÍ=83U«°³nRï@{ž§§ðèEw ëhÙàÖp°éÖ¢Úl<†ãÒT•«òax4I}ÅÒ'–ðăWØêÙ}[µ-7y¢÷ß`®Žæ8S§kþQÐää*dBù!8™{3—±þ­|ü‚й)¬P¯Ÿîêªô͆ü»JëɤÌù˜œDV=eÙljÊÆpÔnePÜõl©05YqÅœ ý^Æ^`n^¦…½‰[_YTt(ôáߌ⓽|—÷DPh»NI\VlÔaÓ®—õ¿P¼ñFÞ ía@ì'×è2›"–ØÓâHNðyNGF1fU\™PÙ 9ÅÚÉjºqÖ§C”?q øPõå[$ô¡#Zw·ã›áy™;çâ45Ât”z=ú1¯üò‘båºÊ(â7™q5¤¿¼°0Æ"B »CÄŒh˜BÖ«mßð÷÷äÄ%òóbøhv¨š9Qrª—d(¬Nï÷¿6ŠK4B& Tl-Åâ»™šþ,Ίݡœªœ7‚i·P‰à×ÜZ0æŠ=y\ŽÓHEØóØ—‰b¾Ðk±÷Ô^«QÏ ?¡0x*NTQºˆŠÖjiêËQtËù’6Í­æ'Wç:ô$æß.سØ5Ü/’Avwc’ehÈÞ|OÖô÷ÄËžr«ããᙼZ$ÃŒqaM‡¼s­‡‡…á¿øìQI§âž?’¿7à~Fhè,ká]rûKPxÝè9x†¯-Ïœ×û„&îdR|wŒÍÑ_jg8í†o —¦t¾Xó(áùI,”å'æY¯ÑIx‚‘ÅëB„­trn¹ÍbŸn:R£¬Œ¼ö«Z¾N;„ÝiÅuc&Ãÿ[Ô¦) Qk9Âá‹#ê¶LÎe‰›;ë>ˆ aðë·»½zb’ßF¥2{®—‡Å3ÏT.<ä¸r!—×dÑ_q„Ë,5÷^STY ¸-§ÞCSó!#mŠ#Šß£Wüj&ŠÎn¡Ã·V_˜µø×œÞbÌÒt™¬¼E#´RfK({µ"mñ¸¨}qObLiýËJÄRSµZ↠ÚÏGëZ;Í¡üõÝ'²Â¤Í^Ëe[ccQ=0Ù¿ïåUWªQK!uoíÁx[¢h­…GWz ž±Â/à3¢1ÁV;Ëá/àì Ã|K&=Û Žüàn]8'R`êt{¢± ²uðÂàjBný¥c¤Ñ7–±ŽØ$ûW r_ŸãØ+Ý«í:ˆšý­m`c§{50í^8\jŠº4K1(µŽÇ»â“<;(w½š*nd}dÀ@ÆB&áëòÞ¶Ëäù’\u_I¯º° L”iÈø[aNûµZpºâí%ÓRçfLC4È Ô–ñõ›e““ÏÆ´L¶6ÆÒø×ì*OþþÅLHô¶Æâ:ØÂ~¹!QÁ»¥Z ¯]ããªå¨"gKi¿áUÇ$újÇøÎІ¯‡˜Œ„žŒPbÜÂw)tm( Þ¶R­¿ØÐ( ºÁ ~³à"ø¦h€\×쯒ýþ³0szƒa—,°ûõ×|bùc¿kÙÅ|;³Òêíu‹¼^\n»Òiä&°ÑeÀS?Õ°ª0ïϦH õxî6Xv÷×éBÝ[t¯™Ci‰üðQ¼È¯àòvÉ¿¡‹+Õ½Ú~ž`Â5äÚèJYë¬ă”mrü4ª2Øg/ÄÜœ¿~_?Ž®t†WéѤµABcièbf5Q‰ÖW&l"P–Ùd÷ˆQ G¬V~}Ñ ÿªlk-¬>¶LW¬A—yqóõ(šã¨°œŠª<»=q¾‡™*g¢|ÿæoÅIGt¯Aó6R ³§ƒ¨/¨2tL°YbK†x0j3ÃÄ;°›|´¬Š¦†Œ,~ÌvbšF+ õ q‰Øn¾\1¾¹¥‹ÅéøÿK'3Å3¡)ʨ$âŠÇhB‹6Ÿã½½lßZ®¶š·8ÕG‰éØÕƒ œúÇÛÒ­ ¦ˆª—$þLJ´ ‡fˆGBˆ–ÀÛd{½jcxûMŒÁ/íf)-š~\}".±Òå"M%øÐð28½cs‰ÔĆz®Ðk‹î‡îâSý%ùô‚0NÈ7iz$}ÛÄÀ%ë'ŒÌ9§úqÑop»nO<íUVÔŸo-°j²qŒ| W±ð¿¬uéèa @ˆêS´NHYèqyŸ¼05yƒ×… Q•|¯XPUÔrN¡£ì]Eaâ¤6†w}†›rKµï”¼@ú3Šs¿m4¼t ·ýÁz21[I$ÕÂ.4=‰ÒTN~“p^õT¿#k1ÌWöû €Êz^(•Ë¢TMF*¶b5©WÍÙk>4½’¨^°Ýô:n¯È÷À‡·õŠáàÐ[@d4yì‚|beá/¤4îsÐP£Ô‘ 5|¬˜Ú†–ãI.©¦Y¶‰"‹6 Ó–GøLù ÇÑ–9 VDþ¼°÷:ݱäú;\Ny\$½Ds^‘;6īвç›þ§‚Å©²ÀGJU¼XÚ‹$¥3P=+ÌhܹáËà¼Þeæ5s¡¢R<¶ÒÓaËÍ¢Å\ŠËÂÕ½ßY’'J6Y@!팽 ˆœùY,Hëa4h=®Xf!»jµò…ÃÿÇpïS8G±™ÚºÇBœ“Qgë•ð –.1Ô'½S2éU•K„Æ×Ù9r[gfõÖU³ï5à†§„âB¸f‹…ôÚ÷ œ|8"ö”=µ’ïsËÍô¯&ä\#¤›ÂV;nºjŒpF:XðÜíœÉ»ìpýßcÖ8ûJí¡Ž‚ì$zd¯¡Ü./‰f 8~K7™Ru °íe&Ó‡ÒöMAqŽU\rVÆ:ä¥]_êÈžò6Ó±Õ…¤î'¯K•#ÕgðE“c¿&,bä)ДÝJ ]õ$ªŸ-\W;‹p ¡‘¶Ð¾KÂ$Û»ôã.$ê¶S•„•OÂDÙ;MþÞãë1|ú¹LùÃxì÷ÔDcÕKÚ¹œP<ms…lúéXÕb&‡Ì c¾uóY%¡‘C òmn¶òÒ——>ë¼äÑh CçÅ›‹øJ0zûÉ]’¡ãqܾ;òŽ2šE·jJs=.wÆÏ·2 7á3™EKvØcO†øFä‘Õ¼¨X»Ñï&Ú‚_iŽ– ¾uƒ¾p¼ú[ñ;l‘YXJÛxùAf ðÄ0ÅÐÛ ¿n¦Râ’â0”zÁ½'£ ’Ïãp.Ì­kƒ§N!‹rÓß &x³n×<Ê›®lKÖç´í~y{eÅ:mX•Ö]?„F¾5ÎÝ_» „„×âC—ÏŒ÷- D;Žº¦]q±›¿¬HÐ$)z@€éÔ€öë¿=˜*üÜ*³ÀeÞ Ž~„Ôϯ©Ìÿ ±Wäš±SO`B ÜCâÅ&.Ìw ËÓ]<–ÚR¯Œ<¡b¾ôÍ_<:Žý޵™/®=؆÷ìõ5¨`»®[Ð^þ¡Ÿ;}°~½Öš»Îq¯ñš#i4};Þ*<ºNæ;²Ñ“OX$–%ʘÕûF…ãÆÌ­’—ÞBà¸ðPá6>¿‡ßúoÕM’VwBÅ4+‘zÞÐã: x0mÛ{¼«sxîÍNå8;oÊgížEXÞÀʼ·lGQhæòÅC^y@øœ|·&4&a¯öŒ°Ð~JÉõ‚ 3É6€¸u2Áf2ŠŽ´%Yª–?ËÚ;é ‘)>‡afËÖ‹4ï'¦Ä§¬ª×ÏâYì‡sâð·ÞûjÃç­ßþ¡ÎîgÓ.vhS­ˆ4+$ì‹ãŒå êÎ+{œÏšÑ§*˜“‘QlœŸû½ä㥂¨ï¯DýqZ•IÇÌ5‘êfýæÍAxÝÎYÖcq:)c±n—ƒK&Þ%fŸ÷YéJðM †hŠT¸/!Ã1¼BÙ}­ÄpZîÌ!7HÕÉ:ó$ç,åU×HB©D™§ûVAR fìQçýþ$-¶óä ËK"*˜P1?L¨Ùº„§ØV¬>=÷>mïš¿iyÒ¢.Nw](1Ó:õ¬B)ëÒÒ Ù&åÔAâ6É̆yÈ, kVîŽAꇛ-¤[ò‰—œaÏz)æþü#½ø[õX½%5{²Ç†éÂÊ2)dYÞŸGõ­EþZÎÇ7‰Ì蟀im9â8$Âùª¦ûŽløq6^üÛìÜ·Ì Ù¾Ð××ájjg¶ƒ´cJ y‚¥÷.;Ë÷»Þ[–AÛêi›Ö)Áí‘à¾àê•ÜH§Ü"Έ‹L&Î*)äaÜ¿Çâ[*ÑLDzTÕøÙBôî ¿o‘Õh=9HV kÆ y0¤¥šK%lN&8]Inš)3‚ËëzÏ$õŠ&â/4ïC°‹ ¿8ß’õ]wXênR«ã®ïÅåÓ£ v¹ÔÖ/¡–+iS¨ßâŽ!¯±Z1‡}‹]B6¶¨¶Ã|`E“¢F¡yœZe4掾~:Žéºk*ÑÄezyŒÅ ,Yìtv¸ ËÜI#š‡xÚd¶*?R žï/k‹´®ˆÃ@Á7™¤tdù)Lñ>X¼}Ŭ9îûSõ§’ïÀuYg¿.œ?Õ0Öè¥ÛÌ&~š#zÔì.OP}s4ÄÎmQô^¡éÌm …e«¿K§ˆ:ò²cŒË ‹äwqÝïW”4h¡¿O7¾>£à8½ÍZ¨e›ÙîAilO\C²T—ÛñT÷†ÐשFaµto¸6<ù«ÿx_Xû*kA²ôBNÁÃ]Åà ¦™¬ÇòbuXÎl|,23\âP©pv:‘ )ÿ¥m|LòI>B$K÷çö{V¥„AÇýùê™çüb@þ y&×,±&l³ë”åYíNÅ娏ßH>Ô%|a†Å{ìjòÚ†ú=x°!Øã§¬ 5t¦Ñ÷Z~ç ›p;´j<]„̰=à^w2Êû /LÝâ÷jPmÎ’GÞÕN E†h.’.³±)öX¬Sigô -cH’ý-–»Àla·¨mXY¯Í̼€œY’5$Údãñ+ÆÃ`L»ÞQiÚ9Ž'¤`ºan¸­ÝÞþt>€ªa+±k"¾¢~ç­™æÝVæI„“îSW°ÅKÄkp5­ç¯exࡊ‡½ò'Ø~e2äxn]Úž£&3G´. ÚÉÖéÌ"h+ã‡Æ¨“ ml,ä§«à-™þª¡š“;‹vž½HöŽ#êá5™…?v[ÓÚ{ª¤ëð´pô…ð4tô øü{VEE ]²htß&¦Šj»¿Çªèô×Üö—:rÞøä“eF˜P G…ç9ÏwÒ×1©GÚà[¬Iôyb²^¾næNáqžÿ¦1}Ê ".ˆ~k1ÃOëû°û·Ž³w3[gy†Owž‘G¯vÌoxe¡Ä9à4µý‹…NFÙÏO,zºpשÉñhz§} å™öÀBYM6™€«ÆÝTå#™¢ö”Cô‚Gû×rÙ-ÅTÕÑÒªžãñ¼™Ð&džËÝ[ÕΕ*]ywƒý™±™¼Å#¢!Æ>eqw˜Diýz¶ðyY»=ÆÆ²J?öÁöÂ^g¬Z)ô¼Ubåí‰Ê2½ËˆñûR8(ÿÈÃY”ôãê!Á_ÒH ö­lò§ÕÁ£\ýš"X¯;(?Ö ÖÄ7îê+~)õ:-ýàxžFur¸ FgÚ “õ/ÞjúWÁã-õÊžZ7Ê"ˆ0^n~÷³Þl™½§KG†!Í~)¨âÔxÔK¤‹—0æO¤í=-1Ññ€8ªà&>Jj;,ó‡sÒT'›µ3Xõ‡d•ý\qn*éÊLsqFmú“ŸS!Zu”½3­nüªçWçª`$ü†‘c+¥€bTktQHµêÉ™ÂìœÊãJ_˜g3âùÔ'DP†6[4f·ª}‡ù×–Z¼Ïík_ñÈ ÿè)Ñà Ù’á+«?Ê$ °‘ ?+¦ÞÞñ…ÎidÇLmûΤ?)/9Zî–Î!Ÿ Ÿ~mº:Ô•” •±=€=càsð\‚4¶;kt8ÅçâÛ,×YRÔƒsÞJX˧‡Ýàs® hõPB>‚J:é/ 6­âIbN~Ñ=£µP\þaÍU"ÿü½aË8™¢Wuˆ|ŽžPZ_“î©Ïu ˘zH¾Ø±£øT¦ms—I˜b•,÷‹Yº !N‘?ܧe™W¬.ìéš5iˆÇŸwç´ß‰Õ>ppdœô% ¥¾ÕŒ×Óoj7á‹tÍXTÑ”L9‘Aså/S?:ão;8û:`êNŽØo”“k~{a5èMЬ™E8Dµ¯>/Vš\¹Æ­\Íñ§þ¶èÚ¥›z;<;:æ À¬Oe¥4ìóó’ØÎ5~u Ï=ñ kyTsê±éͧϑÑ2f¶)Ÿ“óRº0hÙ$ÀŸIÓ—l}}&Oè'ÛWËá‹‚aœ9v«Œ=sQËd}·¾#Ѻ'çbìËŒóu£ñôxëmÎpP/b%„XíÆ4©äæžÉý¦S~PQÊcOÖD¨2¼¾7gP·›sþ¬áj? U~ ù²`°P• øÍN¼ (Œ<ßd3áÇ}¹/WÖfc$ÔceŠBr+g*ç†o,ô='Ö lƒ¬¤sk_zÞ æ OÒZô…@ÛuY®Ó]Aqÿªz͵¹¼­A3¯ˆáxŽŽ{4iAi—Í”¬¿ÏUBٻŶ‘³ØÓã¿´È=Æ:`žÑ¼ÃŽŽ¾BQ×ÖóZ|¸Ö– ÇÉøæÂ3‘Ëe.Ab¿ Ôž¼åºsxsžu&™ô¤Ưú´"WÐ8ȧr5â^ƒb˜®Ù"iIêÛ6Ÿ1mäN±."Òr ÎPí˜v}Âwfî]Bà…к°0™™ZÂhªþ¼I6ÌwpÑ›¦a’™ƒÑ2.Ö–!²$u „\xï!%‰[!uíiaþÝÜ›ž5žn‘ òdzËȃ˜?´ø:Ž£üy®ÿ±ÀŒm¤·.°Ù.®È(6Ìñrò”NM$d.^bïKÑþTŒ¾Š/*W6îNý>¸~'äWQ•=œjFšƒ¥HÖª02¥b÷rÅMâº÷*Ž ïNƒ5Üëbp¨Y)w.f¶¦ž fͶíßÒ–QåN|¼é†¯uö«¾Ô´`BŸ5ÏL µv÷tu4××³Ð¨ÇØi3޶g>7ã–‡¶;·3Ìç¼Äy¢ÏòrPó‹nByŸžÿøº[sdHž×YÞ+3„ûI‘AH¡yTS>;}ï¸*¢Ž<f}| ˜EúSö Brj<ÒËO&nJ.l'¥á‰°{“3Ñ%Íñ*|xšò׿a¯šÉudŸ“Ū\N7¹Þ£ïF–ÂÎÂõú¥ÎHK§(éíO‡ïÖµï¦a–/+™‘H˜0»ˆtŠ%‚±VÇ×åM‹÷p¸§ª@æeá­t»Þ(»n€Z‡q÷‚†ó¿r¶ï:6§ÑIÇEê/ç:îB0]Ù£vˆw4[s+ã,£d¢–ίäK4î¾Ü¼%ÓzŸ€õ=µA;u¯Pô¾¼ºÉ6¯ùLF8ÕùÖµi™,(yÑÏÌMlÿ6Ÿ/^‘U˜@Czy™º6§1ó 7Ü`ðÍ{©Dà—8rˆH¾$Ý»SØ3p™sŒ,ð“¸Gx«_ýsYi&–”+(_Üøƒ¦ªÊKynÏDº—W΃hP}ý9‰N|æÏ {"c×ÅÇçRóSp|z¯¡Ý°CgS9 ¸¨¢ˆi´´ þ #BG\V~²â|ìJ ¼”ÕžçY­~ù©zÚnypYù¦m/ ÚÎaÜ;Ca;ö›øgk7üf—Ñwíœéw6•¿ïejxÁMDäS.fãrqd¹ªJH÷ŽÎlU8ÌÔF/¤Ji{CA ñk§DÇW:u5…$„ÄóP=šj+Þ?½6­5ÉVoÆìÚtå"¡ÇˆmåºBºvŸìJj¬AÿÞ1»ýúÛgU±¼!ë'ÇåY݆*ºNetÝD‚ñ%­Êüuý6;6n£à]Úbá‡Ä² fF1 “ZýA-VR?‰c‘1ÛQ7i7z#C±þF“½@7ïKïژőXß]—Œg¥÷ËÂiK/ö÷P²‹?²õÐÝCï0£`„:ª ®´d'ÐzŠfƒðeµ•»wDÖP-…¸züèPi‡¢‹ºÒ…\ûâ»”¢iÊh‘›¾SK­ú ¶ªQÛÜMz«'†f„“dÝuýèåXv䀞°5½Zಔè—?€¥ÙÇ«a›îðÒãÄêY3TYH°þc‡f oj/¿rº›i†“#š´A¹êUä·|D2‚bAÂKå3¦ó‡g¨Ð"e Î>[˜ÅL‰ ¿‰Ñ3u¥Ò›­ ­+ÀÓÞ$-æ<¿w1G³”@†©ÙÐd'sr*Ä:vx#v17hŒûBQ·wÕ{¨¤aI1Ÿ—ÂBS`c¥T¥b#œ*)‰µiVÖ [Ó¦œ‚¦mÇ#«|’{ |nF÷Es‘qÉ«C(¶Ù?n7]Úä9Ÿ×ݧþš¡NPÓ$Þ¸«;áÄm’nä–ÖÂuÑÔ‰-GF²–‡³~«S+–uëõ&bo2ÈIÿ. ÞQg¼Þ`NÚó ŽRŽ€Úømh©n Í㜺ÈàÛb«.ZÈoM4|Ï=ž¯ðˆ^þ+°a\]´¨«TtÍÛôêb–Æô°Þõ˵£¶Êå:²Ý®¸þ¬ª.<2¢ÕUEˆÊúÒT-AÊ`Eì6¾Ž(Ñ}Ê 4A:åíЉÙ\{®h1cT)9üG‡ 4çÌîJ’ÍìÏuü·Dª6|2>TÙbŠÙzq9>ºÕš¯Ïå_­§MJzî]ìJ½·ˆž Æ—x¼ƒ%ê? äS/g7°­Xñüø¬ ›Y 7J &ØMŠÁÌ×éÞ†þ˜b÷Üј›> stream xÚ¬zePeÏ“%îîÎÃÝoÜÝ݇»;;4î»»Kã4îîî¶ýûÏÌÎÆì|Ú/âVfÖÉ“yªêÞŠx$Š* B¦öÆfâöv. ,ŒÌ<5e E##S ½,ƒ²½­௙Ž‚BÄÉÌÈho'jäbÆÐ03ˆš™XY,ÜÜÜp{O' …¥ €ú/ ýZþ {þ‡çïLg …€ò™½ƒ­™Ë_ˆÿç‰*ffK3€9ÐÆ ¢ ¨%%/ –WH˜Ù™9Ù]m€&Y ‰™³ ÀÜÞ `óo€‰½)ðŸÒœÿb 9ŒÎf&À¿Ó̳¥­¶ðôŒ2éøé‘jpldx¨ç²oŸ.'–‚×Û/ù”ä§‹§¡Ó}ƒÉ'ä«{ü³qS§Fy[º×eL=™Å–9øvÜJ­Hl'›2¦¼]ÑLõÜßžM25t' £ÎåÃãÌÚÉ8WÍ磖\ÕžnÁºsI²=‹©z]Ïi&H¢j$øNmÎÝÕ‰9¼.¬9[$uC˜xÄIªÍ ×MéQ"ÆÓ*^ðsod0FL©j£¸Gwè×Á8’¯gL«ÔOÂuã·@*õ[ŒiÖ€¸f¨ÓÏ$’þ¢0ˆßEdr')Iþ´ÚRÍ~3z©êÜ@’>,Þý¡è¨ÓóÝŠVØüÖ­¾›ÖËɇâ¢pNOZ0 ƒž Ê©ˆlÕÊNõ…ßmý¡eFÎ/¾á*¼©J[êÔЊqI´z|Ìò%Oñ r˜Ã{Lè‘4 j"à>¶è6þû€eö+WÜýræ2MA}'jÚL*jÿa¶M«Ñy5ƒ˜Kà#‚*iüûÍj“>‹ßødëƒcí¾a2RñØî‰ád[Ê=FÝn¯MT;ÂçƒÃ•CÆþL5™Ò‘“jŒ4¡¾šò­Ú•ÇY –À»·i›CA)M´‘7YÔ®ÍPOþXJrªÐ»ä®m{iŠl+û$ ‡Zøï=eJ j¦ †·ÏØíõp lݸö&¼²gYf©ü¢îÛ?FN‡lÅj ß‹ŸNÙF,È…JÖÙßw;€Oëê"&_áÌSu×ßÂX‘Š’'O¶„àΤqÉ”Ô GW/­Î¼÷ý˜ÍdwúÕl\¥éa÷€+æÃÛTk¿,sÇ8ó2áªÉ9v·;#yÌ#4º¾¯!q 2PÐ8ènO›}ZŒ_m¥né’æ½Å}q“dYDŒ J„ËÚ¾ö;3wAH‹Ùù$P’«ô…䶼Ύê‚ÛCýúúø¾ÖçZ­ýÁ×¥—o‹`¥‰˜t¸ë l)Ó›TìXk GƒÒ Ù¦2 x‘…(^|óíšÖâÿµÀk ñtû` ºW3Šlê_–ýäoo£o]™ Ú3nkš˜©!¢ZjtÛB¿Ðr4óí¬[&±‹MUÜ\‚gŸÕ«€ÒÔ3ª¼d˜:¼ÙÜÉÐc›Â›TÌtüˆ_ßû*aÌk-”ADOÃb7¸õïMíÒz¯B¶Šê»dÌŸ’I.«X©ƒ$€ «:ÍÚÑwL-qTÍTÍ·©i#)û°x…Nty6ЈlšFS¼Ìƒ=Þ vÆ`ÖüGCFnd'õE¸m‹ż‰ÂðNœÎrtÿ-!àqxfx›ùãU¹(oÃû.ªs˜ò’oqHLûqi¾§Il²/îjý[—Æ­êÖ c Qˈ8ÆFóHÀ’»Š>¥ª<ÖþëV9‰k¡¼^èv^fqþå%Å’g­ÄƒóhT`²zâtL\©Ì[ÔÞcô#z§íç÷ä»5ï&ZY¹íúdŒY’Ð=‚Xä¦sÑScibƒ]}úNDš½ ŽHЧõÖšúXŽ»Ïúƒî›‘Øø7 ¢ƒjGp0SMøÐ¢tü0+ÊË2l-pÆ3A`¼ËQÕòT½„W‹v`Èè<þ‰$U\V˜S{–—&¢¡ÍŸ¥øBÁ¾KJÓJ·5íÅ¿ròh^t‚âM¸“‚ßM¹:»á„óo„ÓzYAõ±¡ü( Räíí@ó§lHÛƒ‘¾¢æ.˜œT„ÅȈMRä±4_,ê‘nùŸÇÄi:!e—dtxÄ19M¥Ë•Í Š£cèzm ‹ÿœ£ùÞk··~fBYÖŽ³¸cCq­Ïîw¸óSf,Æ•ï>H2´I›‘.J$Ý2œrO¢ð`äÄÛT©ïý"çÈÚæmp1ò3.^¸Gð/‚N Î© AÄ&»Œ†> d9ÞwZK™Í¹Ì7L„Ð÷Ôl°6«žÙ¥¸ â×ÃùnLn©ãÜ*K;/°úRxr‡øÃ¯ÓaÜzY×¾£n€ÖJª\ßYä‘îõ™}ã ÒÌZ°€Ï·î¾ÚŸñ~9êþ¹0è5XÏ«‹o)Â(¶¤{ݰ¦¢íNIåú© º±[ƒ²kèp²Gðf¯%Çj;AÒÆ“祱Jÿ9;×IÞâ*ys@„ž¶ô|>T µ,>Á¼±´oî:¯v³â=:¯66ªè#o‘ñÉŽj¹SñbÚìéŸ1ðÓŒN-zÃ!Øâ{/BŒ@-ÊGp‹ñ ¦kU­\©SÑÀKŸ1—“üvÖqñ·ç0yGãr ïûr8/N ^Q:#Üy‚*‡ýÂɆN[BÑ·4#â`ÙSL*\QÌ8š.£ï•qÖ‹<"ÚÄòï AM0źöœb&»eèvÎûŠ˜|• šáü³Þ<¶}Ðï?mž×—¹a|ž&÷îyL2>6ÑÇe´Êi”eË 9ŒJ¡(°ôõÞ§T›'BzV»t ùjJÈfÝ%¤ßåµ§íàE&ÕÅ뙯aÓZ¼Ëø^@Gø0Ô‹{†Ší+îÖ})?°";1Ì÷ CéŽkR¨èÔÅPe»R¼÷jBJPȽóŽÞö˜¸oU¦Ê\l˜¢.ïq×äsþ”e?ÉWšÄ=Y6&) Ö~Œ ~±8´œ™>Q©~¥^˜ ŠkðÉ.eÌ/WÊÌßôGü«„kŸî°Ÿn\®yyðEËŒeswÙaD¨ÎÁäË/oênö´NM±VŒ…9:¨õ,*xRP­“²bì!‚=˜\k±hC¯50Y§ù S2ÜdÌ`avÀÏAŠXÑ×rÑNàÛ Â¬ç°Dq ›)AkQUä“Ê”§NB›eK¬ð+)b-*lj¸y Ù^^;x†÷µ½ða6í,Ô¦‘C†ëãÈ¿gŒ“ßr6 à¤gÚ¤² ‡ñ…ÞBŠý˜†±nêÆÁ<1àhò½ÌÌxq¢qžµ­&¸äº¨#£§7ã¬Âðh xô•¸³qÝK®:€@,† ¸ £C0Æ%–ªÕ—KpÚA7#v­´ âòôA#zÛÅÏ2|”¡d[™EénëÅ0®}N)ZÅÅKŠØ¨ ¢àžK”‘.¾Ý±2£ioGtÆ °—ÇÕ,J€w»ÜV>5Úÿ)åc©A+Ol´©?eÛ}×™wB¬ñ˜Ígç _“ÒØ ¢¶úIè¤ÅCFÚ˜¸oýc‘ú3“7‡ØÍA¹›méÝ@Srų•ZÖïÈŠq}›Ï!Í»JÍ¿ã±;gÊÛZ«ÄßKw#Ä"s}>8™rEXÁÛËG³ÉÐQ!×У Ž&è ¼‘˜ôµ^bÐú\4Mc]öéç>¡áh .cv”!aë@a±o1X¼AYj‡ ~ŒîåÀ»…c†¢,”«MÜbÏA™îòØöKÒàçIšFÏ“Œ]÷Ï%‚oG½t×{´¹féÖ ‰İó2–D Ü?ê¥û-: ¬‚ È ž$‰nîk‚u˜õ>ðl °oƒäxV_çÙLKÌD‘,7†p6ǰ *.Ñ#¾—ßN°…èS ^¹ÒÒnhpW¿w†–µÜGgà§ñ15gõV)Bw-–ˆEçõqù°ù‰™çŠ€uþÐÃZ˜éÓ±Ó#E×€¬íÇeðD¨Š“ ËqÀ/À‰TbžkI ßÇ„¤¨¹L=L]75{ºËr@žìŸ8öœ;P¾×»1>Çæ|¢–’[N›mešùELDÒNšRñJâ(B‹Wz¨]©<¿#äZi½Ó f&ôY÷zêñÍÓX#ìboìåÖ ù1O(ˆ”üH½2«!ú_¥âˆÇ»zñŒ,~‰,«Êpz}jV?æ*Æå¼›IqÇ!n¾ô†V$(ö»Ô.x§/–LĨúªåˆ LDÝ÷¬®ª,N)ãü’™âï%*=TìhÔZq»S–ø×O k'^Š÷ѵÀ=,$ú¼»i{´J ›¡±znÖ`Ì+ö·ÕgO˜›pO’¢WÈk‰öÀø×i/Õ0M9kõäR#ô›ß#³8EDŽ=ɬcî¹g°±Xß®QMy–ðÄBRɵØ^.[=Ý;¶èÇ-Zuêì8é+·!ìZ*9.¼â €ÅaZ\.áØ%9~â8×ZØöÐÇIæ1Ûªõ·—¿ÀXbRFÏl$ó˜ qäø¹ oP^ÏóÃz`\••u•µ…äÙ <¤{öÔÏ2ÑóHHŒÆ¶º›.Š_r°%§k‡XÀŸt\§9S¤ž”Œ‰UQ°ùêmûxž»ÄˆÒ÷©èÈ Õäéó eÔ|p@¬-?ÅͱTSɆäàÚí¾ôñ¶C—êŒá‚U"¼Èó7÷&š×ŽõIk6£ëÌÎòœ CùO LW=¥Ø'D%‡jp£"äÊ_³)IŠÍ¸'ML4ƒEåQݞĉ¢&ç›ÛÕùçÔpþǬu¤š°êƒcCi ªv…§Z‘‹w{t[©ˆ_÷ÕZš––žï­éS‰—Š0¹ÌwƒU¦hpñ¦ Ûufºq©¾¹%ÏØ=JÀn)|ðåö)ÐÀBd$’Z–iùüÈ6ÇÒÆŸMäo({MÂó@/~j%oÅm¹t%¡çpÒj&ã \½;#ü7‡ü Š@æ õQPßK×ÅRzuë‰c ¿¹Îë½¹+Ö?5±îkÍÒ8×Èg%Rˆ{~ëø:%:RD)ÿÍ¢†j­±âDÈ„>õãE=ýÖ—×ɱØIoüZ;rÔæEøQWæÇ`|I›¥eUÂ1Üœ™ÑÝY\’´ßíDö.¶$·ÐböŽÍeVâáA~'Aý3n9½‚ùµ ‰ûþù®A®4£‚rã­Á-Ã=øÙêxÜùg^SÛû](~ŠízkÀ‰½¿¾$µ8Ï;³‡ÙkÌÑîBöð Ó°µõ#×LÉ|¼Ði¤êpß}³¾M¤'˜#«w…UVY2êO<Ü£*ºîûÔf%Q‹>ºXú'MµOÄ¥j¡T…›ÞÿÌuêäM€[N>ÏE,‚(Áƒ:-™ôÝ&3˜õ.°°ÆV äFâŸU«/X‰Ä÷¬&‡ZßÛ$Q†¬·_ªø¦!ãf¨ýe¹ËÑ…QaµàTHWn 0²â=½‚Ó¬™YãM$¹jÞågèü’Wã}#I³¡SzÆ:|.òC$ûc·Õ÷–ŽôúáB@¿ ælhZªX_4{]4Äî#ýXMú–zå\ˆ…ÜK§F%Œu&@f«q°]ô¦”ñ¾æ‰ç@óD·®Œ@°Œ<!Ô£îvºÿþÃå*’MiC/,9Ly(6æÝ¦~æÛŒæh_­ãûáÖŒ¦SB)Hœr—IôQ5Ýœ„<Æ‚Z›cÌTN(ìõ¼`Súö‰ ¥7Kㇵ›‘k‹Ýõ†Á´ø|˜‡sÅØ†žAœcûψ°~§‚Íž?Z¶Æk`â^ϲhAöÞw6+ʾøù>ÆëB<@v„Ú4kîv„9~¿óQˆû‚^8XxçÇÔ”Lê.-HTÒÓÌL"d‘oº®Ø /r`ÇϦD&ôM?Ñ©éÇêd Ô‚/IA¸/8²×<¼)ù£+ÝÏ]­m“{²òsL§Wö¾uQ ËUeà ÅËdgâ4~Ï Çª¼³ wF|wæÄŒªâ(ÕaáÍøºeÊ9ç;¼©Q§€ûiaUÍ?>Ræ@ç5_ˆ(½™z6^Â,PsƒvÎÀ†¯ëy]Ã>¨¡u²D¤Éô šu%ïlê¶Êü"䟼£°6ýÙçÎbݔŕ{hÏ¡ñÍófáw8•?h'IË¥€<ø ŽÌסµRÙ–Á(2SØDË$1[®Ô—sŠ¥Š8Ñ)ùãÆBŽGK¼ßˆ¦„xœˆ°<‡û0‚†ômÇÑÅùÎB$6­ë6x}cÏÉXŸAüéñ/æeÂÀö­JúYW…QY¨Npœa-w2ÂÐÑîV¥6›¥žð—J6(ìá)[㚪,‰]=¬î$N|’g,A‘‰!òe;ƒ^8^ìßvl‹Ÿ2‘éXÐð¹׋Òìkåí?íimÅ–SÓȆÝhO„⊧í˜O_`ãß!î—J•èÆPEÈqÛ(Œ3©JY¤{_¾•DˆøaŠ•ƒÅ!Û…Øì¤y۳שôgB×sŠI¾?±0ÁWߍ™¹ˆ =5úõŸLPÐNÛ&K7³É¸7*·,+ ^"un]¬ŠŒëJÍŽ6ƒÜôž1÷a¢FpñDz·ñ­)ìêP4` Ÿ‹·~Kí ª”)–Rµv®õUFjU H loKò„1;nyx§“¡J/Ý9“•àê:]ªã _d”XÄûº ¢^‡¤›•ˆ¯ˆB¦û¾@Ûhá<‰ ^éû¡Þ…¾LHË`sj®µyYà‰¯Â\°j“'a€_¹ÖÌÑ8öë^ˈÂÓu&Eç ⪒Q;("“”ÚÊF™‚4LK¿1óª] A7?nagךëd,Ý•7¼‰˜¿”0ßÌ’ κ?ü9bÛÊ¦Š¬@S4³~ƒµ‚áIì•ä‹9€Ï°µ£þzì&,®† ºà½sDB5L¤b|nÙÚÄ—¥~gòÿéŸÕ›é G—$¼qbP¼ žó6™>=í:ê&±‚ÒZÕj* çAòü¬í­»(‚²ø“ÄXw”ȇži0Ê~àf™×ÁnSÅ^ägJûcÍ\…ò厃y–^ûf ¯ìâ3ÃÔF x–+§²áæð°Ð¶à·3S]rY”""‡> % ¨æÐ/-SéÍc’ð3²ëûÖÝãÏOúE´^Ú‰ÓáXo­ý|~[N(ÿïbú$] ÙžFNõ‹i7ÑlPE¢a¸HWθ²~Us-êb—î‘MîCmOI{°§´O³çÉí¶k…Ik¯Ñß“¶¸Æš·îNß1æìUT)Bêz× [îXv„#vsÉÑ7Úû1#çâ eè³iŒŒðø £å\YVl܇ìÅÇ¢f•NF‡]…Y+yÂûƒšÒ4ÄtËcFªÍ :@²fnªSI†'œsd`TØE¿>#³,-‰0JJ|š¦íÿ¨µ‘ã“#OÔv¸Hén‘€¸ 2Îì´R6¾Ÿ<)™TF¾Ô¡¤GÒèÿ]ÏÔ®o‡Áwê鹕ƒ­ºÉÄSŽÜþ²œîÀÉ­}xî+lçîñ=›;Ýx»–@ï%C4& ÂéÅ`qj‡Š»ø1{»d—§ÿéÜpfŸo†œ_õœ6ùÕˤˆ~Û/<°¡9z®'j¸Hzkˆƒ·ôz+S„Ø¡yPŒ'L²ŒÌtÑM¨š5Ak@Ó{+MgI%”¨rqŠ#`à™{Œ†!úÕÙžLûÙeÔrî·“+­<^,Vr÷ȵy¶—£üB±yJ±õõo„¹ÈâN*–vÁrŒÆÌ€CU!)ͧáâš5”4†þ8O’gaz¾¤ÂEçSµ'óXRTFDAßÛ0õÛ!äé¬Û†©ª6¡h¶¯Ü•%2<+mY–Fükã+vï{Æ»U—dÅ Aº…YãþÜ%%=¡C²Ý» Ãû_tS½§É›}u¬ô,h#q²)ØÊ@! ,{¨¤:°†ß+¡qÞìÚˆÞt}_FK¤o½Ns*ïÀÌ®ÁÛ941Ò'H {fÔÔÝ.óVþwT“" .0™ Èñà°¸QbÃ~˜Õ¤á…sUA³¸i<|^ÿ€Bnú™@ÀÊ-û•ÁËmÒÎw*vÓ4YB- š£ÂûËì52¨šîRmñ0ø©ÀhVEÃÅ,w ’L­ÀQKçŠ*3/ŠÇ £ãNÊ…xpå`x>˜X W®ÂóÕœ R©~Ãp€¡Ä£ "õ|)*)#Êî¯xÈKëbF“¢”ój<»ç$že™Ã}rOLE¶µ_x¶Nè¥}Î’²¿b}±Ö|Î:ß?µ1†ö]ÁÙteT#  𙽑Óg»²¢¶Å'7Œu‰›^ñŽ¯È¿hOô˜HX°·1U¯Ì‡$f+rÑ`ؘQÒçÐû±ûbAÅçî»·ú`<» ©ØšmwdÓ['Xü¹©gríõ±ļGT×vg›Ë.2U-Zã[-ÂÜYÃ]ýà¤ý Ô)M¤%¬«é/®O·«•@,,­Ê1Y*î}2äghEò_Žˆ?P¡$ù?Ñ;[s"ÞFOaLyœVóšC;„e)§‹âÄ‚Zéi`d²L”Ò}ƒÂdåhŸ¨‚®H¡æ8ü-ÒpÖ|}¬2‹‘B "9€’ 嘌 ™Î÷~õ‹fÓ;Úúì+—“E³¨sº•’¬ß¹égýsd²äîd@9v«@².H7Cÿ²=ÒL¡<‹óÊmJÃŽ}´@¨æ¾ÖP”RÝÑÌ#âÛB]Ë6ÑcdSMæOûC¯7A™Hu””:r¤uœ¼Ó¢þØr'ÜÒö s„‹¢ýìØ7àµÉœ(ø{ ÿ°Øwl9%é,1owW lçpÊ=³SƵ}À™ v§Í€fË8½[ÂmXµb‰¢+‘!s5>µÍ¨ý"˜ý0Úñy.µ5ÔÆK¼“d¦ n“?øB*P R PÂUŽúC:p¸L|Cbª=ºá•åwäiD]Á šy¢eyc·4P{_»tW“¢¬Çy§@¬øƒ¡8áIx tµd.+9•wß Îê7¬û¥¯/|?mp›a3ùC(ªL/ï^ÌÏ5<ÕÊÎ/† l¦N9ÎAÉFÎ|Ñ1âÁ¬-ÇîÞÒÐëÇT"“Èä3V$ê;2ã ñ‘…CrvvWã]M%ÜÄ=,)e5!1{n9>Šþé.ðö ½we¼‘¤.êwŠ©ÉÜ.šQÏn-‘;ã3ŽzuS­ø19Vò# Sž^àìîÂã Êe°…ï3VŒ7®œÆåTßGcßIiÓEQ¨†Ÿ*cc ¿ ‘Ô/¨ ¶pº ‰>]K-.0«Þ¼ hµ°¬+,z9ôQ ðÓ+†\b°C°/ƒizþKš}à—LÌ [¡P4JRÎÏGšRU—NVåÉàH|ÌlE$ðˆ‹ç€YÓ,¡4©o÷xª" ªø³ª÷ͦVI ý免¸l;¨â÷+G”uÌw¼ûºãþÒá#Êæ!Ò?KN€‰šDHï~.µáãoXbgR h™u*¸YlÐ:4Úk%Örºhš f÷›„¦×©Q£½œ;j䯉)3&›o0¹½Z!& ,3¢ßjTSg;Z&ö3Ìþ^Ù}sÄÒÕ“EsJ°Ø ªïæ±……Z¾:†zûR©sê bèägñÔZõÆ[x—íT fdÔ:øp¬OÑr%¡~}QÚ!’Q Ÿ|÷–0_ØíͳûêŠTiÄËðòuåÃ8(ùI tÞþ‰±ŒÞŒ§=K—úE°¡péÝ^ü-fÃQ¬nXsæ‹T ¸¯~«|[çkî`º´–]ÝÏÖrŸ›dã’Ðóhl~OH®š£n_dW¬î1×*{œŽIûÿ’nò·Wp]=eôôî"·æ8êª,½qEÓŠ\¬ ¹Ñæ÷:(®Ñª°H§Ë]`ŽkÒºýã4Kó1NOÌï{ αȰ1~Ë8Ý\Ìcôcî5Ä„Œâæ-m²Y9‡X¬ˆjÚêIëÃ¥Îs¤]‘Ð1Ì}Qœ¢¶§wùpÊ%çR¥ÆöƒÛe^bwfË‚¾Éc0±È§ÏÙŽªGò-89÷S‚ä@‰”ƒèž¸ö”áä2Zz†ý«uU–(J˜ÎFàä’m{ƒ—T il¯ºHß ¥uf*@‹‹ 6J×wú.kÔÕj6͇㒠5Qðý²kEQa\É#€=Œ1ñ}º¥NÙ†ˆÖZ!GtÔˆ=6Ô¡ ô†ñ›Œê@{&Þír5ßÕ ©‡Ã€I7QÁ£AÏгÿ,ñ ÃPÒþégÜ.ÝØ66/‡þ袪iÖðM=+ÅÇkº Ë,9õ†’“óÞ¼üÇ®z‘ÿp$4Zú Ò‰òÇvPÁ§×¹)çÜøwÉGmkà­¶žK]#œÝœ Xøsû­Qy³š™G”³ƒ²‹é†ñ¹8³%H‹úÍœeB ¹6¬At «(ó›Õí:*\ãú 5ÜæçõÏ(4XÀÒsúzM’ÕÞݽ7id|{„›ÒÆÙn"Dˆk¹Û3š^ùE×aÛg¾LíæM Q››¤§Ô/˜ WêEA"@>Öf›(ôå'+ÔŽMÉŠZâÂÛÒýxmÅÒ΄O#‡bœÕþ/{OzçÇéæ`¢ô+šóýóê4î¨wÃ$½'Ÿ±› ? o$þ‡*ªM2НYOgvT•^Žñ } ¤•P-t LÂsñ&OôójôýB¥Ù'ÅÊo«šrŒ@ΉçÖ}&HŒAA Õ 2Ó$ÜuΑ‹ èp«°£ëŠÛaOµ‹fÑ@"“™h÷ p†ÁV9{]Œ5…!Ä.Á›<)–L¼€X–û°Ã¤ô*õ†«íkéð )‚Ôè!zØŠ ÙuŠóXÈõs?‘ÀµÏjàÈqãC5´\¡ÉÔ·9H‹uJJÂêÂår|í³`)‘HëOÆU»ŠcoB/¡Ê}ÛåóïDwú—=¥îRøÞ Hï)\üÖÙ‚úã'ŸqdXø.î´¤äï¼ÓÎzŒ}x÷ 3DêMn,%ü¯3SKòM¿ (]¨Jiuq|ÔÄnµÈÖà@D‚þ¹Ñ•™r°@<ApãÓl±ÃOà#ÊÝÁ¦GO° ¹ˆ®ŒN¯v;JrGÝîLðøRñGý9Í’Ýc~8s+Y½Éánr¿Û<þpuE\+½ÆiõѧÂF½1|e®Ú. ìù¼·±1¥tâÒÛϵdÊx›±'³f7¨-('c©þ:¦ ûeb@Þfœœý÷Þ ŠŽÞžR@|Y®æ+¥=«]ÐäÔqaÀž3Ô)H.ÜQÈKi²h*NPlE.ÅÚ¹ìGó«Pµ¢»MFþ÷÷Ç;¹¦óƒ`xŽEñpp»hô޼8»C8hHeH§©N!]ÔšõæÈSœvæ–ƒÜÕdUÎØëûD³ÚŸÍ1/׿a¨‘¯úxmßæBвt¥Œnâ†7ôÑ4~ms® YWwF{"ÌÃg}}Á€]%õE‚|л\½‚h¿ =rù±‘Äè¤T„} €B]¬=¿¶çF˜ÎkþrÛLôçÒõ¶¯­¬ŠŽñ‘Ôo;õEù?’Mmx‰Â²ïqHT>Å9¡Ùê7!*I37+ïYª(Ó£S"ŽÄ%ŠšÇ ÐS!ÌÔH*…<4p²HU8—êªÐëeÉ­¸( ›ÑŽ¿NÓ­h[}U‚t‘¾öHPQØÿΨ›Nåþð®P·!Ž%E‚;ý‰¡x8ŠTOÙˆXªm¤ì*³$jQ,—3 -ºÆboñ?xú©7g Š…B+$ä†q²:®öV•˸…ß$–n°ÿU&ò*Sc_úXM®~™t¤ÆÇ‰ÄÏó5a&iˆ_·±£%1«¦ýí ›€þ¸w$Pø"=Ö¨ßPÄ8¾Ý^»âî’»Mþg ¦ÖÚì›#¿¹xG~ ÔSOІz„­:ÒÆr9()\ê^׿¿BŸU}Pc·³?ùxyáOQº¥NlëŸaÝ.ÂVÄZ ¸%C¹ÉïØ \„-õê²:xj_€›˜_¹!iU n[­nú¥²µåpÆyúH–*eÉœw!£Ye…A©Œ0öAþ/œÂg "_ˆæƒ|lææ¶pÛˆèæ&Ò“aXÆYD{!ón5šUóÆr…»°»¿‘]Œ¨™“¬½º§fVpÈ»˜^ÅÛ®@Å\1/E¬Ñ ö”‚0fM ô÷ì p é¹ný0­vgã]”È.5). o¡/lz7£Ç›!Ž2{‚ ¢bÝÉç*VbØór’÷’Ùé}Çð S¼¤G/uóRÐóìKBòñ=È!ZIúæÄïÆ´Ý~cŸò{&Ä-~î€F<èáO‰l?^ËAw…°±÷à±%¥&6¹¡f̘ÞÅ)â XÂ⬾Št ë½*›Ðè—áÑŸ¿hKÕç0IWæy€Ê6Ö=·uk>P8†ù3i¥óE ˆPw¯Rw^ñâžLPwšhÃvÛsÃd4ùỶð´ %¨ý 2]Ö¯‘èOãßsi6ªŠÐ/Ù#ƾ‚žƒÔ/yÀÊ'~G×MÆ·&ñªVÊÂ~ËÖL£Ç“ïJ®šxrr’©Å:VRz¯ÂÇ“«ÇÛyWvGWU’Rü\1Xï9›R¾Dé\™£?©~á<õ1è’ áïW0ÀÄ¡ð‚ R)tWÓµ™[1¤‡A.Y[GZDG(ЗKBE„gù¦µÅõsA˜J3”w'Wt¬T"òPznŸpD–Üƨ0˜qD½^VaõP«¼¥|ŽÆÃ£Ênáð1ûƒ9—‡*FŸt2¤0¶ë™ÓúÁ£ÉZ†„¥ÎðHxzîšÏÆÀÈí.óY,ÔÔƒ+4Ô»¦±áÿüøÙw¯dÛN¼Æ4†Ÿ•1÷ï÷«/&ÃExV˜_Û7ÉB穾oú“çGR‰:Êå`; ­¾ÍH}šfÐbw·\I“ºþK2úò÷i‘…H•Ñ3¾(¸:>%v_ªñƒzŒLwÊ‘{»|¬ßœnMªœ½¼êþ°%­IóTseíTöªéÊþ»þA¯0ÒΦø•¥ô¦$ž@z€ÞŠ4°75èȬXQ­GzP{XÊû¿úØ•)ˆn;x~ÒÑ«\b´’ÕLC#Q¼%B˜Wåætƒþfbc‚š <‰,† Ž7Ã<ò›#Üò) ±2Š·n!eØg2»ÿIù¼\`3ØB· ûÒÂ3ü¹2×ÿ÷öêhû¡7Ë«å9g£öv¸¼>ïèXaŽ[$ÚaÆÛ/»X`ñ¾tÆÖHL ¢ˆt°rÝø"¨«Àº~g+WÆOß×°‹I› æWŠ ÓE+åcDL<åq3fžF*m|2ql&‚š§g}ƒ Ù@Ÿñ Ölò©_åô<“‚جêñ5ˆpaig°ò¨•{Ø•úé¸ç.EŒ{¿)´%zx‡Ø¡:ĺÿ×ï?gø:7ÏÇÓ!ìÕ ®'ú}?!ÐkØ\Ùá”ìÆ‹Ø•bž?7v¿.•ÐIÁ‰ °‘3£:†¬âV>ÇIú4ÞÕtäRùÉ!àêÞ–í¶^ì<îdæÍTœ4vÈ@þ»?5L«yŠi¤Éw¨‹Íº*j¿á ME±€r¥:Ÿ˜G²xåÖÀ2ùðÉ4?ü\í¼œ¡€’­~Ú(}¥i¶d´†ÎîG[¹ÚÄáÒcÅjD%×CÏ£ï\0œÞ!^ï~ ÂX›ãÙôÜd`oX0×4YÎM’¦¡à‚ò ¨yïéZWóäóýN ÒvkKóŠóºo ¸ð_÷SÙ¡Tgc§76þö ;ÉûnÇ4)ü>óêÜÝÒ…\¾`b+ooÎFýluµW¼+æ”ÕÎWÙ~A`£/2Ã3uw8í›ö@Å šbnµš§™”K(ŠìÒñö(©Ä¬ú]©„­IõA—AÓ‹º˜Õ°ùÌgaÛé6‘ò+ˆ[m zÀ1Õc¿p° u߃.ž“àªY¥ ‡g^„Al#9çW>Aí÷^†´ÆÂ_¹cQ?šYu6{€#c4q Ôê”BÈ Ø·.¯xîþ^i¡|øõ=j…úP(r¶IS޽Ä4#­þEÑ}skX4÷ɰ—-lÿÒW=ÝÉ3|¡$—þûçˆÇ3p<&2óž­GÚÜï­Át:ëBø¨  c€T¡ä×=E܂֫U-&_Ê5Üô:-«kÑiÇð>µpÙM[‚àJº³YZ¹EÖÞšWcßPe5¤æzx”ïHJdî…JR~²aŠ}#‡÷`è„›ÿÝœâsÆàÏ,Æ`@Ÿ!ZÊtM‰ò³ÍçÂW™±‘éê:yU’V>ñ„„XVóP‚¸WÐea%ñeMÆô}·dDHü—Ë[e#ü´ëÝþ Ž5…ƒG‘4³:§Ð T_·+?]З+ ÍW#B.iÂk Êg´ìoÒ²±hÔ¤]Dð†Y•uÜ`µã[8êDqŽõŠ|vOŽ Û2H޲Œ²üXi#ëé½,a¦Ñ‰ÊÝ÷N¾^p)ò ª]-ßùuCm¬;ué¯ÑB¿ß¨¿ä®|—®yù¹æ·ZðA­¢š07Bnúãµ|‘’ê:ÈS»2ÍŒa[M¯Ú‚‘ ë×?o¿“iM.uÁo­mñ“±ùNèà>ÌÁNÄ´—°y)Œ@+SÚ'hÙh.”è%Q¯8y¢Y-íë+&ö&¢ 7cò5l³ñö—ä&#KÂ`û}bƒû†UûL¦:ò=î8syÆP!f€&V¨S7“Qž.i')$Q5´h¡ò[/`¤ñÐýÅŽ÷³“åßOt5Û.ÕaX%ÿÞ àoRC Ðó¥Þâ¯üÏјÎ7%œ*å-¯E Oy€­Ê²eöµ¶>Êrô8GFp8ÞHFû rWT“h“×4Sî1?¿%J& rÙbRðELj©ÇÏÕ5#ÈJQbWñrR Í97ØŽÁ‡£?Åë$l,ÜwÔG'Ô4@P—Š*‚ÓÄA™AïßøsT¼vzÏníþ…Ò̾…žÛ‘gßÂõwŠŒü¾P1ô„Ï=ƒª“@¸bC>!¬¯û ¡±ÚFúÌ™]Ãò¡ºà•‚H´ŒŒ ï'÷N¼9A¬êñ”ÝÈ1X¬†Ÿlò/Íá¹pŸ^ ê? bA£ëHEG 1\x $?¼È#ê¯Q–¦ˆûÀ„~ü°½Ï*^$ ÙÎÜü¬xp©*üŽàªî¶!á˜]³&Çm¶^/“‰7úIJy¦è.Fͨ_,n„—ø`æ6”d³Dséö´\­Ïƒ¦áò~N7°žŠP1ÜAP©{o í’Gõu„6Ë":!õé 2ÚElìˆ"\J7wÿht|ªKÃÌÙéw; nCEžý€„2¤ÚiasÍ:ûBËÒÓò7:D§,EžÔÌÑiÇ8»‰îÀ–¥š³B¿Ï}ý áÿ)7ý5>˜â©AíÏ6°Ó‹ðš8›±$Ĭ„ã½Òø(,D;‡ž{Øý¾ëìôˆ™úh×Ùîtf T‡kwšp§‹ô J\² 8*ã‰ðFÂ#ßüS?δþçnco@ 5Ö{ùtŽGØ% úw%¯NC(~UõCŠÑ€{¨KÍF _9ÆÔNÎ$Þ‚j’ï ¡2'AÍ€d?[îÝÆÐ©Ø€?²#u ‘rö‘¾‚b@`¿Í,’väTÎÓÒrl䬾…þǤ; RØ»‡(ÛvÞ\ˆVÍÊ¡³ôkÌé6Xƒª¤òCíÂ8ÓjìÇØ1QÉ®$lý¸|•øBNZæÂI öª@­©„¡çñ€ÿO=ä¬Ð™xZ¬« û]]b®xòõÒÝÿ<œÔ sÊýbüÍ*/™“»S{Ð: ô˜'Oªx–ˆWü°½U0S˜·T G¦¹J,âš© *zÂXðå *TšÂ¤Þ‡|iÚ¯yŠÖôÂêµ-\ÝÅZo4+÷÷qbZ¡þtkÝEo­Ò¾. ñ»•dhäÉú(±í]β ۔6ÃfUgha[W5ͯ¢{æØ=e4£Üú.¯ÓÏPvÑö[”Ž£„< ÛÒO|`Îð²Vsƒ"¯¼%ó›nÅ'Ïœ²7·l#;•ªl>8}3òßýÙÔ£®H¼D¢ qãJÍò\õm/ô˜OŽYez'F¬ÌEjG×CÔW™Oé ÊÖ4"C\ØCT(Èøz‚ >Ôâs”¶±6”¾Õ„®€km6+Ñ&±-•'›§­MÕ#ÚøBœ ) Ž‹# j,P ®¾ôGp?ªb&)ÆTIÀ˜JçX}¼¨J ´µi¬¶À} ]EË:= 8X2 Ý­W$É=4%#ñ},& ÒyFt©=þ²po••mÕ ÿ&í…ÍÞ”Z‹þ¸5õ¾1-‡ƒÒWáZ·Ø¤"ƒc¦éj/7w†ó~Þ¯ÊËæyØWDzi’¨€¤ë;_Œ©Bq-É?Yã9HyÏ“j`¸1U¼‡TŸ3^c=Ðû /xX`XÐTcó©Œ2? öY³«²Ðæ^2^ÄrêpÂÀµ®4qðƒÖ>8…¼’:¡–Æš¬FÔ~qHõEÏ‘µóYy ¦g¶ãl‰À—¿U‚íC¾àõ!QZÂÐAâÝkk¨( 8'Lh)'tÜ|–Šõ¼âµhBë–;ñ`ƒ^*å¬~ñ¡aøÀHédðŠ‚Úsˆ-ƒ¯‘ZzígE‚LHýñÛEDAì–†úuŽQánõ×DÀÅVN×k!Ĥʃ˜ä9¦f<õ‹lóîÎG_ÇdEÉM}äg"wG^Ð"±‹:¬Ínˆ6eþ>á%S‰¾Î·e9xÍQSþ†GÉqð‚2s ºhƒ~a»xU‰#K„‘["¨ÖqXÍ[ÐÁQíøÎÔŠÓiWch°8ÁÌ*†ÃQÊ¥ñq6Э ½Ì5:kñ”Eõ‘{¢(Uˆv£œoß¾ÝÂø¨S;ç¬É±É~J¯!YãภB mhu2±TÌÈ1°4’<È̪‚›íÓK£Þ•äðPá4¹iÄ=YorY~s–ƒñƒZæ.Àpê§ü.EÏ×·ÂÍ7Þü7ˆ'3ÏeP~CaãÊ0!jCƒ_•ƒ=÷bÒõÑ'>Y5•bR¾ƒeD^nœñ{޽¿Ï9^²µBpcifIÔt:£\7KÒ©ŠÔèÞLÞfÆX H êãçýÁÑÆrYš½Û»ŠôåRuÉ1œXV†¦—dõt/ZG0å|®à^]¬–³L*‡BŸævËdÒC£ H{›OyòvÛí×q³fS‚‘„Ríg‹õÒGdž·H–úJiõTœùxÈŽ—æâw¯òÈ{ðhäÞ0@Ãù?¤r‰=§Öqý©Ë53ÐÒ¾¥|tHÿ΋¨zü'¾xXXûJî6EöœõeNò»Ä²o =K1Ü‘¹æq5zfS»ï²)'7©èíéUfÙ÷m9¦!îÛE¯QˆÊú?r® 5êˆo»®YBðü‘ñЋAX[D×ÁOÕÿä”m¨fŸQ­œT½ãt7o¸ÓnK0R‚î¼(ªëE"VrÒÙ:å:SB¬aÌF]qÔ+Êêè¿éÉl5ý xTfsÔvßD³^øb5w¿Bƒ/0NÊýâ.ë‡ðÉårPƇ£¼  ð¨Yˆj®¨ö_¤lEžæQL"Fn꿦ðäyñÊÚ롊-Âa½v£¦;QÁnûÛ±… ËÜù’º£ÝZ•­ÔðÆé ­Ìùp œô6_ô0(‡œ©lÅÂvO¶$ç0)m@‘7b6"”É–ÖMöäáOj¦á$­ÇNR‰Ê¶xø˜\W­“\³ïãLJX·‘õ¶\X¼G†W2½E”³B{«2P¨¸‘.I6iÊV"àõÒ<ܵkÍÅŸÔÇÝ0S‰ «»åËÞdGŒWÝ‘i(f•†(P=·\ú1cF zˆ·[ÒMeÚ[LH¼‰¶àT Eþýò†TP÷Ìóba/Ô åå™É}~ ç->\¨±áÂÖ«’'ï&;*Ù\~ùÂ^È&Õ¹ªŠõRŠA˜ÅÚp‡“ä§ô•¼°Õ}¿˜ß/âÆw԰̨ý’—ÆT–²´ú—…$ç³®Û(<#¶©—(bTS‰È{M¹T¾ç<_ƒ*2?¤nuÇÒ˜Ç 0jfA9„öøäª>©¨½¤F›áø-ú=¹`+"ÚÕ¡N±qñ‹µ°hꨱ|duUwÒ+Á^Ÿ>9&”Á)ªŒþý*¯(²/áKD>Öÿͪ`´š>¶ÅÕɪ§Ï7€MõùÀ†å‡BÁx GñOÅbÿòTÖýb€Œ$@W÷Äôr¨Ôd0d}³œåÜÛÜ{Õn(>âu#»À“頩뜺]®{BØóófR~ž»aËŸZ%Më²a ú±£“|ý,¶[1“Úv´9Û €hÙ™sy&ñ \·ÍBfdŠ?SŒó°æ–Âã†c-ˆ0Žyà #îã JÒôaÆ-E"ʼn±Õ™Ý“"ôªAdLZ‚~‹ñVÜêÇaÒÐò,>±©óÏßÍÖ¼"PhÀx¦Ä<ô õ¦÷ß•Zoߌ;MC|/Î$=Ñ9eÛÀÇ#\áñ$šìÁm@Æv¸6ËÔ£ ¸‰$®K¹2G…* `zÕÏÃEÅK´BÞ|/²•ùH¦ºØ2S°¢ ϸS ZâÍç‰-°Ô >í„\+e?üà¿ë$È õ€wÃéZišö’Ä@Ÿ!'…ÚÍ»3béá?V_·Sâ9@þGZµ`æ<¬[«&â½ §ÏÎûz8„Jâ°Ý²ú_aZ¾Ùç@©RÕ›xµqI(JÛo®V‰×”<’ÕœŒµÙ½göP&ýÜ…ŸáÚÅMsy®jK¸ CJAÇòÔÏÔñÍ8Ì‹ïù*5¦êCø@5R@¨ÐýÍQdë—žAfËr¦×Ú¼‰¯!dã7>lYÂõŽšÑÍÈt­)ÔöË DøÑHI}`ȶâ÷èr.)ªÜ€˜Õ,ú¥3Ó ÀfœQˆFvnÎcE˲²1NCFŸ©ã„¡xÚë@®\¦ë17žqhïí´¼W<µg¨¢õµËô¯Ï—DÚx0áÌR>Æ`†5§hE–|aû Ë"¥ú0G±¸*AIΟe"ÎÁ’©uÑ9ãÂÚ— o£ R3ÿÁòLêo²+9q=ƒŽu6|Ý­ ¼­‡öŠüE6 ‡HÑX´$ôæaêÖ`ÊR¡Ú}ë_JW$ –'˜Ëÿå¶tR@z±)Òyo˜âP‹2ݯ b1†²WÎɦ蔵/EnÂcoF¹Äp á¨*¹Ëƒ ÉyõBsHòmc¬Ë°ùì@€–Ío%±%&¯¤œ])¯%ü„)Ýd{Êæ½ûkÕnÝ·mÅËTR&üîE4l–ÞñTWÿ‰a$u½ÃÖäöv’û]®K¶@ËöA›¤½lu’´|¼¹W¦îåh\­ã†¬ç\ÊVû@±Fÿ3–A†eàC6˜#lËvÕüåbõ’?ì˜]yÚaT¿Ÿýö$˜¡ò)_ß©`^ÔfÞk„P}m”R3o…Õ{Ë÷Wj8ÄfkŸÖ9„)äÿÁü™«ÍøE(ŠN Áñ…¼I¿†þG·¡;©Pè-´÷<>S«ópAÄLôôw ¿öΟS‚Ú61 ·ú9bÒWrDŸºH»65³‡wm½/*QŠ·(eë]¡¨¦N@ÁX~`íYJD¤VAj¾ ÿÜø©¥‡ˆø±âzmêP›w^ÅÙq½ zøû¿€ù^ÏŠË/í¤.‹…–Ɔóü²tåï "©s9gçw8—Sý HkÓ]¤Âó‘ÐDŒËí³€4ß$òa·žW,¼ üpßÚë*ÝY¨æb­VóèÞEÂ5]ѯéyørþšHç]urV;ãÂp2æšeXJ"Ô™kê<S¥‡¨§j†¥t^ÒÜÓzð@ü¤©‹P©;“ UGuBXÉØ?ÑJ?GM©xb»Ò~ 2p-iá_k`šª¬È« %òÅP+“ÏB6]81“ÝÏÐÞ”‰{£û¤•'Bµîêû ¼ÄCØFúÙÖ)fñï9,ŽƒHr=¯JvˆhùNP¥Ÿýp¾%ç÷^FUÛǹ sÀM¢ŒÐ!Ü”‘ÈÍÌÑÉÐC¾›jIêr:“Mbïˆ.Á20 µF 5Œç½Œ#75ðwŸoÓî'™ÇäG‚lö8Ÿ¥—Â>g£2ðù&ï|&^!5g=N%–lÙµw;Ö¢>=ÂóæÍÙýèøo©¢÷¸¢€ˆN¨…nx®Ø ºíٯסœ°ylÔ°7oëÖ8=üœ“–@ZXmðѧΆ„´œ+7àb7Å ¼òôæªP`=‚uö93RŽû©€Woß©QNTÄBTÕÁ±A·–¸S ]éKë·ÈI|Z%Yîn‰Lp‹‡Ès€mm>ÇÔ£ïh‘v _2³‡Z&¬ߚ0…Žæï¼ÎÏU‰>Q¾ÃåUg«y[øŒú‚5¤/øyFâ^ÞÏF¡ê¯"AG·Û-¤Êà2©]28“v„{ñ.¥Ÿn¨P—šåv7•!÷|Ep}`ÙjÇå×Cd¶ÆIÀAN '‡3ù¢ ñŸDi¸87V¡Ô%u#'™*_VCÍ~?í\([åߤN©~|xÅõwmÏl¯AžÙ‹ÎH‘ä\G°‘˜ïkŽŽÌiÐÇhàŸ·»-Á‘6Qò~F€@ü®¦sýÞËE2P H²† àéQeXâØ§„ žÄ#ÿKb×f²WÛ.ÉTQؘ#p@øÕE¶‘p[Òjiït¥Lú“ƒVxeÛ¤ÛÒ±ð»ÞL!ãÜÜŽûãÀ+ª¿ ܶQŸÈè‰'¨ÙIŠÌe-§žÁ 9ç×Ôo¤]¿¢âeuE˵E>“h¸«ÙYHêÎ>·›Æ àmñ˯S¢¿KoÓñIY7™T6ÿ¬Û`ËÙz(•8¨¿·³ó\¨‰s0SÞ“ú9ÜP¹/ endstream endobj 75 0 obj << /Length1 1630 /Length2 11468 /Length3 0 /Length 12314 /Filter /FlateDecode >> stream xÚ­weX]]“%î\sƒw îîîv‹»»;w ÜÝ îÜÝ î y¿éîy¾é_3ýëœ]«jUíZµ÷sùe:A[# ˜­=#7@UI]ÁÐÊÊÐd+C§dkmø0³!“ ; @¶6"†N@n€:Ð 403˜¸¸¸È¶vî 3s'À×*Úÿ²üu¹ÿòé2³P|¼¸­lí¬6NÿÏÊ@ ÀÉ0YÂò š’r ârªq  ÐÁÐ  àld2È€Œ6Ž@*€©­Àê_ €±­ èïÖé?¸†G; 1è# èf ´û Ñì€Ö GÇwÈ`æ`hãôÑ'[ÈÆØÊÙäovSÛ ²s°ýð°þÀ>Èl@vN€¬ "bÿªÓÉÜÐéonGÐ °5ýð4±5vþ»¥°šÔÉdãpº9ýÍe˜€í¬ Ý?rÙ9€þ)ÃÙdcö_Ѐf†&V@GÇšî¿Ýù¯}þÝÚÙY¹ÿmû×ÖrrZ™Ò#01ä4vúÈm²A`ø;*’6¦¶&ÆÙMœíþs:üÓ ¯g†ê£C[+w€ ÐAÎÖé#%àëÿ›Êôÿs"ÿHü?"ðÿˆ¼ÿâþ»FÿÇ!þÿ=ÏÿN-æle%gh ü'ðw @ð÷’±ù¿¼ ­AVîÿÿ¿{ªÿUäK#édøÑ A³9è¸èY9¹þ€Å@n@“±9ÀÔÐê£WÿØUmL€V à‡¦ÿ´@ÇÄÈøo˜Š9ÈØÒæoóÙþmLþ½þ™þ©žABKBBXŽæÿºWé”­>æKŸ‰ã_ “à¤ânüïtê²¶&ÿ¹øË'$dëð¤cbgÐ1s²|@f&+‹÷“û"¦ÿZË:9€ÜÚŒôŒŒL¤ŸŒsÿ§ ûo4¢6ƶ&gGÙÉÐÆäcÜþÓð6vvpøPùŸàcûÿ±þgð@7 1ÂÒo[ãoA©iNÕ89c"Ú½ÝLÁvÅu*?òý*m»|SÃ6¹Ê ^ª‚éë'¸ßZÜçí^w¥¨÷†º±­(»’çy„Þ¤T=ùèkm4{ zÅÈi'êQžs2PZìŒj{[cŠJzE/0Dm,p÷T~¤.ù~˜dwv(>Æ)µ±Xíhõ`Ÿª ŽO(ïï( ôwýîÙ% ÉŽ…'ÿfˆã“tü%ÑÉÝÀá¦Îø úÉ…-îÁè;C»úÏ–4óèZR³ /SÈÍP„Q¼ueåjá˜v%¾ 9›Jâ©Ü¯3=c¨ëLBŸÉCÄËŸ¶‘v¬˜ÌÃð/º¨>Þ€wå”`yUñ¸œÑø.Q þÝ{bsæºFÔîin¹ßÑ,¡ÊØ-VBYpZ¨fB—9ŽZáŒk->|BE Í5ª#_¯ΞlåsúĈrí$qua Z’Ǧ€&¸ÌsâåÃC¦{9b(VèvÏaÁ;’P˜A(¿›˜Wq<}æYO(œ±7‹‹Tùµíè©S)è½ûUn8V͆§•t¢NþwH*$qïl–ô˜F ÌV¯ª•³”-ühtÉt`“r¥Ô®*Ê¢ku(Š(ȹ @Ÿ¼)ÏÒP@¼‡Î¥%‘ —W€¢™Èu?÷Í×mð“öQ„kj®]ð ÞÖQýl25£òlj7p$JW[\}n†\—r¢`ò»­ª`ØÍ¦ÉãK$@™Æ0#bÎ…Õ㦻˜Ft5ÊK÷PqÖ/FŸµ:ã1±™{ðÁšœ¨Ö¢å3„Àû:æÐH´ÙKbšÙ0 ©}\iˆÕ™Îgcœ–#6lÍXÐD»Ý½çQ~M’‰cÛkù¼­ZadI÷ƒIÇŽÃøw–{~©}]†ÇÕúÚ 1ì-ÅsïÃms”(Öw«Z¢Xy^7-¦žIm²iÊÉ©/¿ƒª‚JÆ:æl+Êò-UXfe¨O` ˜‚ˆsý)DÌw^¼ð.‚p@®^ ô² r*Ã_|žÐZb•[UPSa åWÓÞXîsU@çAØrÞ%gXêyievRKˆýï<-³¿ÝŒ_¯üFõÓc•käUôUÿ¢éþ¤ö[ÐŽh©r„&Ò7¦œÙÙÙúdµ+7Úkf<¥ÿwèÉ’*ã²à(ŠB£«1Áêk0|[[?ë÷߸bø°c1?]ãF`礞``~gÂY°Š<6 )áéØÒáþóJÕùº5[{Ñ©k õÖ°1À ">€ì ,Ú0«iæŽÅ˜Q©`‚㮎IØïÄürZ!`üü—Y‘$ÊHÊk)· Ð_΀+‡“½0Üžya7Z+aÙ­ãúØ£‘Û´ÁŠÎš;˜×Þâ§þ)O“§|Ï©·­Ìöe™`=Õ赸1í¤SZ÷(8¨V¤ÌT0U™€Vš'p)XÿÊ&oø6ò”˜Lý‚DØò<^wË~w²zŠzc¹U†¶r ïjn0‚…Dð–¨ëô‘Pm¯ÞØ$:f{»z¸VWÕ1weRØŸ×Þ-5Ñ`;¸êp-W¤&9’›Q}<¹K°oåÍù–À<Ý|¿GéE`¥âËÊ ±2‹…5wv €]ý"˜,÷I=¡Þêé­ç&µÅ¢ng+`{wÞgÞ0îÐzå˯ܨ®o)…Ë’V1”ÝTZÙr©ò3le®Ø¢–/åOólÜæçè%HÆ×H¿®nà ˜_ôV¼ô#(3Ä1ÑzcóRcËÑ )ôÄ\!OèEgcâø=ù_‰‹Æá \ÍŒVŸÖ›pÅÖ(É Ö›üòÐÚBÜS„ð/ï·=“Hnøª´f®Øi.|‹Å‚]¿ëûcAˆ"°Cи/ö‹çŠå%|ÿ^"LÎcÐYIý’÷ÞéäFY®I]‘tȾiÄZÆÔ›4Û”o!y|”iÈÖV:¦º¼Eø%Ç[2¬óªÑrT±EåÙÖ¦ÒÁ¤áÓ°ùÙ[•V£±¹.^¼Ìb΃÷s?GèŒ÷µ<¿Xû]‘¸¶`ܰ?ì{PÉÉJ\ öeû©ŸQÑ¿¹'QRò믦Ÿß“⪒SБy*ã'ÐÅ´8+F¼{ «ðèܼPI6¿ýcÈáÍ¿xëL ­ô…/êä€wŸ‹)Æ·Ÿô‘$ *öS(’ó=ÆÉn<ýzçX¹xà–I+žO½ÆíøÛ³ ^¶ÏÍTÖòîö%f~-R`:=ufe(’Ñ,Û|çÐt³—ÊÍËj‡æ—¨Æú¶_û¹Žúã ;9ÉU%Ç]»µ·†ž|9èÅ¡D>þšèE ªË©SÙS-ž€oº÷V¹%á: XƒƒÒ¼ŸÛÕúÄ6þàS^ª‚ØöÏãÓÚÄï¼—_g%š"ÔþLŠßv±j-1OrtEN³OÛp2ÀÎßó¹Åù“ªÏ³'Ìžì·‚`èý#Jc²/ì¶¢ÀÉ1¶ÏôÞqO8Aô °³&‚°$wÓ¹ríÃÕôür¼p–µmPÁ¤‘*@޽³ÙÀ@ðL“ÔÖr£ N%Ü|Â…v“¶‰²¹ñöóùiRñª€ÈâLfª‘°´ľd5š¬àë³Ýmöá—^~ô–¨Um{t'˜&ŸúíLÅfM &°Ÿ¡y¬Fü°“TË$æ®Ï7¡Nö§Öü\V›Ã½q¬c¿„ßNP_É=ádc^Ž7]nw¨ÂHXù^i`´Å2aQge†{©¥°ë¹ýì. ôƶ´(Í´ÃÔ>ö2A4R;ùêò&¨hºÒÿÚËæþ1Tï•çO.f°†{ÞápÔrc1N ïzîíaü£Ù‚A³ZsÍãÛô„ a XÿwÓŒØè8É–sׂ¬ÒzmãÕ«&Êß fæpl÷@D»{p–N”ª‹¨kÝ4¥Àè7,¤ôØ ÊiNwMÅÿ´˜ÝÀi!Ýô.lLNÀqsáœÏ¾‹Rú€‘ÜÞù„—Á,ý7­©30a„=§‡ø¾›3áArÙ(O'ú:«X±ì›gªÃùû!”rÐðüù3_´siªøÃÝ_Q –ƒÔÀzâ·~/wöÐÓûlÝr¬üýU#öý¹`±h[DŽÇm¹÷Q5ë&ê3ü¬´9±|‹`ƒ:ʦt¤–í~v¾[’ÌÈ™+Øñ·ö›Ü$®N9ô˜ºU€¡3"2ŠV÷ZÅmW²Ô¡?ç(×E-ÌSBv†˜?æCkP±7´ÇH"ΓÙU|ñþÕŠ(ϱm“>ŽEAU ·Æ½v?‡Šý8¼N§Œö C´1wù‘&Û1é¨~†x³:YëQ²cQ¤üMT ÑÈ<8„ƴχƒYÉLãcå¦×böm°Óht.×6xe·P‹ï2¼Rॠ.¤…òúòcÀ RFÍF#œšjȱL§$ÛçÑ”n°àKî†jT“æ}0MÃ5‹‹-‚‡øoðùP£ÑcÚÀ†ÀP%edS>3?¼I3÷Ø!ùBG [ÒgÈÏä©6…iâ:[jeç¿XÁ»F©ÆGiB½ª1&1ˆÜ2hpeÙþ°òÔdN·t[Ðnqr‰œÀ»ð·ó3×ðÒ¥á=1釽*ëYrêô‚±‡­JGƒá‰~PtÝ/l Í¼Žs'¸¾[²FàF2vص.?~m0Ñ—¥)@rcËÖ4ðq su?›~<•ëì$ò}“§É¼_ (æÐæÑ1¤ ¦H^@D? h?2xÃY;GÔ×<Ήvè‚C ~¨`[ræ½q¾E€çg+ dK d•à™Ïì9®\wý>÷¨‚Q¸®–§±ï³~$¦rŽI-;/¾–‹ÐþNebÔÛ÷†36˜Q“©‡‡Æš:I,eå+ÎH¿á[HÕíÒö‚ý«s3û$G"€¯d¶ì±(h–?ê1Ȳ†>ºKMΩŽUp°jiJaÇKÖÁV0]3™­ûžS}WË›QÙViŽcrå¸ãPÌó»i<9–Ukr‚ÌR··²MÀo§j|&‰ÏƒA#–?ë€3”Íl¢—×Ý$×cCå07³Q·Á4rô¨ï=>†{¾QlÁÅŸ>}~ŒGWèD5ôÂ'KÑξ©ú”p@ÑŽ±ÀšCD徊øÂFGëz@D_½}''KJZó o€i1Ó+‡0¤\NéÑÿóÝ@ž[Œ2ç' F²‹kŸ€¡ÍìçË‘³u­‡FáCxá%¤_<Ú‘â«d´8ÿŸíÓsz/v]ëSjÕ¾ÝѪs:hÈ‚2›Ë ò£bPµ¾b]*²„y]•ùx¿u9CtùÆòcó_(ÑG‹åßSNGn&UÏCëcÁ¢QïóRˆ¹^•ó¿ï0ŠDÁÃr;Þ~~ ¾i&`Y`ZÎå”$p Õ©X@‹$ý1O–»˜¤Ìá…cñ3¥ £éئǨä­mT¿»ñ*Ëÿ7Ö^IÚ‰Èxw,ûy`ðE 2QXT¸ç©$ój´û:JN=vã§T foSŸˆH² W¼²È­ñ JUÉ’—yCÿtúK2A]W8c~ôÒ;±Å€=’íÓr—_e±EF“÷OßèT €ÄÐ)ŽÿÀIåP26ƺµ-:ZŠ=xÔM}VO“ÃFæ'ìZ¿³¡áaÀ± í½0Ot€ãVµ–ÝQ±ÊÐ5—¤Ñ‚¹@‚+‹˜,­öŸ©w/†‰nZ¨\òÔŠYÛ¡ À¦ør£\+ñ…¾ª„e[x»ý©à“ñ aVÞç3Öš Œ:ÎHUVj2£ô6ŽÂ*üÖï‚ u:“êÊêÅÁφ”™áUÌšetC¨Pí,J8äW ^F÷Úê4‚©ô¦cjë¶ íäl×/ïp¤¢M(ßÌR‰2É/žhˆdC fˆ¾âa/ûC<¬Zž?¸gFãÑm}áOÕ²\ÿŠ ý2˜IµËµ¨M¹âZ&oŸdì"Ïn'ÝÙ½¹’)«'$Y¨ò˜Õ:ŽÄƒFÊ—7ëuú|C¤EmÍú,šÈìŠ Åý(Ý=Œ^<î¢òѺ‰ôŒæŽž`ã©÷9v¡©h À7î!¡Õ!jŸ9µíxkjÅ—õå€ýd>úØáÝ6rjm™ q:­eðQ+7êè·Øj œZð,‘}ÏJ¬6òès¦›6²ˆ(gzo#™m¥Wkœ=‰§ÃBO©ÚƒHß´Aš\Ççý‡-I\c¢ròZNö­=}D¶9êwú¨hµ7׿.5Y,Õ[:‚Œú3c/¯r“®[a‚˜áS±+¸ü[€L–ƒ-û¹Œb_€òÇ»œ4Ûc"Ì)SzåJËË##;Ò|Èazp‰pm:Ê‘b+ùg‚a.­Ï±pÉw¾óyÈ6p‘ºÈÑâY o²Ïüíè'A›‘•*¬>Ž*[8ƈŠ'2öIÁ÷×Ç#—ÒŸ,ñ[Ó“ÖXAª¢Í÷.«I¼Zª^© ´\V+ºj•ÜNûu¥æ‚çcAÚ¯!ë¯*Æ®?ƒpýp '½$B…FÂÔ5”„Y q•»ÜRáMÕ_5ã¢'#Z¡0n8)åˆÙEHþçyøÝŠÎò%›€{ ]»C„ųí®poø©àH%þ·”ƒ¡Ì·Q²^sHéÁ@ˆµÆ?„VQAm êK:ó,̲qÆ*Ñü´¶ù¬ L<ü¶ÎÌPTÍ žB‚WhðÊ_šÍ|O@á*3Ÿå©L[VtQ‚Ѥ!”É÷…¬eVhRªé¡}ÛËq#Í@gÿºk;bÝaëÞléðZ³5…5§Ü‘êm'¦Ý²H¹¾Ô‡5-ò®y¡;²ˆ“EY«„•ÿ(µ´3á™þ¡†ØMryóÉ,¡Ù»|³»˜¿ž4¿0ÖÖ­—ƒ‰LåS xàeı*^€¦ƒ]/I³òâWìÔ<ûw †¬©'$éµÉh}Z·T%ÍMÑ×øÜ›—àØÕm9™o£1j2J•yCöüÙY­-ó€:ëáñP½+Úçjû‚¸¾†„çž|’•¢§9 bfÇ–U„§ÁŽ›Û_ÉG.VÓf A¸ §eç3eã¯À×2¥q°ÌL:²Aä†ï# »Â+]I?ùU±¬ß¶ØÙÖ W°º8a×zÅØ)ä¶°»¹Ö'Þȳ°*ÜhÎþ‚$~…— ¹Ä™jÄ0›Išu©æÉT¿Æµ3?í¬J àYxОóáq¯¯pù¸Nd ìt HsTTrqÊô¤Y.Ù^s£z‚:ßz%§$é_7,³¤Òj¹âDKCë »ïÌ o}Š{þiH[…Ýø=šè(ï9þOhCO˜_ìHdáw•E +Ü܆(6ûVÆðDqRÕ— f=Òh¬×wÍ|hÍOߊf %õ挛†¬Í3ÉõÁ±‹Ùˆª0=­$Í¿·\ À8é Šr¨6ŸV®G¸Ž}…×<á‚/ÙÉ·rLŽ"ƒ/í[3áCyÃU÷ó|BŒÃ'n߇É?JY1Ï<\ÕLX«àÑéf0®³‹²o{üf}6•/3Akq,)®F®ÇŠÞHò¼¹ÃÈ¥¢âܬ¡eØ}?y¬ß=l–•ußäAÛM丩!èâ Ñ&} kœPŒ¸†KÜüóØãöÊüLéùKþÃ’b¢; |ŽøJ|hƒ+Y­½PÿZIty®¸P»×–5ß—Ê"3§iOÚ5Î%uy¿[áòïëf]å82Cʇ$ö±þ¶ÜWÌ·á¢c¥Øm‹ûÒKÃ&~¹ ‡n„­OŒO{wé#[Ø6¹ÅÛó”¬t8ñGxHéÝT±û嵞.o©„DN#§ÝíÜá Tþqæ‰Ul4–GÛš®ÔD”¡¤{ßìk DâÿP¸:$ÈQ#™|›L¦!ò¤3ç6°—´>¶ï,ÓþruÀ÷ôm @Ö{‘D¾Þ>uk¬ä(¼Å㊠?3#( ›'TÙ™ëóbx!¾·Í/ÊLï±ï sþø®6ˆ,x+(I‹‚€š{TQÊ"Mú÷™9à¶´¯‰6û5œð¶6ô+ýX÷’Bz>åü– vܧEt!É8²¹ºd‰^×OqbCY ÍÉ@žº*«DÓ.íbÂnf2ø¸q] )Q/DïD@è4š¥öZâüóô~­PÖcQB£ÁÑÈžTdw¨žg’t««ÖɉÄé.C¿|·žôçö­çS?WÏft8YëE½ü”BöXqËW#8G žó,Ýo^%hŸH3ÀÝ'½÷€^ß»˜°Ï=«w>Ó%gW7m¦ NɆE%C—JÞ7­ì]¤§[ûp·í}<—R^š_Ù~t K•ÎÙþ¾±Ò´wA7s@RFH_´¼p:°óˆ^½%nÞì‹B2…^n„jÄÆâ.›#;rû¿£ßø°ÊæÔ5I)Þ&ŒÇ6ìÑhx½‹TgåSù3ÃXÅ^ÛçF6×MÊR†šžµ&í¢‹vsœ‰KvTa™ã"G 1Dú@g9¼ èâès%LЫ»?)·À˜‘&Ýû6l Xšøž°üÅè˃Ð+*O{ÁY› ¸hDŽ{9A ü §µü„@$\y£Åk¶5<^FÞ× GWÌþwllÖˆçÔ¥&ô©•×#!è;èºFBZ?ö?Ž»`|ž¾;ÈLª$‰×•UV™·2鍨-÷ÒçJohD_SÀ²çÒØ“ Ùz«èRQ>¬Ùû4¿f~Vt¡“ô»øEžüvá°£øé u]òÇ€'ŽC|Z$îÄK)”iœ$¬÷’Η!{›çùÏU[8>†RU¬<-ñsî?3z{¶_-^õ—|J1“Ì¿Wgå°ÞvÅãûBÑÄ*î^b)&[xö¸×‚÷ð¬3úEîc2š1µÁB¿GÖÓ£•#UÕ }Ú$CÄ»{¶R”%-þq+ ”“›ÙÀªß±¡0ŸHh¤¥@8¹•¬¢)Ú’»ûj™˜¡b1—EPcx¡Q³iAœõ¼úuA„é:/ž¿ ÿ>#‚otËí¼¡z@³õKÆk;PfˆÛʹ«³º÷Úql5¿3‚R·Ý×T’6HˆcÌP‹û§°Xµðç¯{e?Œbú’F6šöΕ±ú°¹õ€Q‡"s—kMÓ¾ý™UǾß?/ÌüƒB´enت4º^ÈF æFhXú[ätº½'wóÌS¦"gÉDa c\N1(ä@ ºxöãØRàºIŸ"¤ÕW¹ªpùU]*²0¹ôæh¹{ä¢ œÆÔ¯ÍM¬êôYXØÎ¤ýuW9‚ ß·n¸«—Ü0‡]Ði²ö‘h²÷á‘"DϤ3…FÅ7zçë"uŽÎd;´è®0µÔjF‚× ù¦¨2ñ¥ˆµTð0|’yËÅLÄ!b1²2­Æm•—‰ßŒ’Él)Êz+GÒøgºAÐ2BX4àNwreÕÅNü¡•K Uª²Èš¼s=.ÿ¤ãª ‡Nì»v_bÔ”}gºÏ»BFyX˜"¥ÞKTžƒJrEéROèg‘=¸2ˆz&’H3dà:s‰¨þ†râgöPW23P⻌z‘ÙÓ-{­‹œõŸ¶¿%N‹µžF•Š¼Ç‡^Ý쓪iª¢Y0<½MØñ—y—syY†>†#Qò?̘‡zqÃÇþݯÇ9º?V’â uøw!¡Ê5¸Ã$FZ‰ú-0ê›(å±$ÕîÀþ[ÐV^Ý×ìn“ÆeȾ â” Ä{y3[—+üü)2ÓýZ*æìŒ ñÁ0.ªºª$il@WÝ4æ:D–ö— l¨6ís¯<£K’ì–oWQ»¼V¥µuÃV„”Hn;"caFìP—ÅF(¾F°†.WõºßŠÚv GsÞÞ1·„a?ÁæqfwbñùƒËWM6>á*Ω¹}³pÓÕcÅ_…aüß¶DH‘W9VÛLš/RÛ¦¤xT¹³ø‹ i÷¾b‘#ˆÓDöÇä£w‚j²N;àg¸FÕ(qx lãï6ª<‰ó.$ˆ&u¤er3-“º¾hßà·oîJË•ePÕÉͰ¹ "Ï­ÍèCÉ.Lç=ãRšªikþÀ‚/9¿ÏDˆNü¼©fç ¬|o,SæÖY¢•ÿ"=&ù_0ÊÈÆÛé²¥¡U-<¦…X•c‚?×›m~ &°ƒÈ¤Jâ…? _i ´]•|ºâçl;È (°-yé­_Ø–£Á}BÖò,m¦cNžX<šR·ÓsÔ<Ù® “ù „µeØÃŠC›…]î5>v©†çy˜ìnªÏÏ>UÚÊ!øeŸÿ€)qt01§ðñýnð(#dÁ3‚ ½Ö+ãNk‰ºuäñnÒ¥JˆÍ³eÉUMa\œP¹+IóaލÑOæ1„šr¯(ˆ­Üú—¦“Kàx2%·æ«Ÿ­Akq¼ðjÙÒ\Áx}©(ýŽå¶9º2ôî8Á½t•$ü•8˜túÇ«49%~È(Ò~0KƒñºGåET]ÑβŒ»û'(âP¦•Úé Úw7 g;ÿž¨qçÛ|•§â+äagS`/ÌÚ’Fè³´w *”èêBæ¯ÙÆ·Üil°:Û£z¼>ÿ¥q3“Á/J„•ï£U3Ó a=«xv>ƒÜøÁ³CåiY²&ªJË ‚+¿H¥nê*c”‚“lØ—Y ¤Húœp^’ñ¯yÿ$€Woê‘´4–}J7¿BhJôÃx˜LÙÜ*´²œŽ´¼ÆÈ¿vì…²¥³ ܨ·SGÍyòRb æájŘªiÆKк_&õD|Àr-ØIÛ“4†Jl{›j¥9\F ;2KHG¸¬@}Q8å^g…6ê×·ï›Ð öü.Ö“ Öë±²Õïà)kÕ>´Ç³ˆçI§‡X!}dµ>ÈöÙᤋVµŒvXxá–bCM¥‰úªðQC¥IFrŠ_™é‰¸,ó=½é« ©«Á¡ë§+lœbº~òhš´¶Ÿ|!`SG£³L§E`Qý+óK_/×µ¨Åñ`æ¼È]h½S’W”áð>?v!Ê.™G_[ÄÒ6›ÜE šQ’ÛDÆõ’{Ê'¨¬ÆÁOÀ´ü<U‚ ¡³îüJ“«kL=è0T®¢|Þ]$'%å›Ûƒo»W^¿µˆr´¹Õ¤siEÕÑúć]èæ»Î‘Ñ޹DŽ™M³|šœ4?ãÉõœ<Ĉ·®Gy[û)-ëË ÏlGMÍÓ LR$kr3ÞpXœÌË ßUkÉåób–ìrna •H ‘59:ļš8ݹN|ª"Äë•ü/2o¥Pö…ÌŽ/¨˜UŸã1ÏêWýRº—ªP~Ú4f|2q£l?ÍB©‰Ñ^’ Š+2§XÒÌLÒ%‰v®O6CšâÒì—¸"¸#)ê#‘;Ä:Pn/œæ0&:°¯{ŸŠo["âØXªÁfÍŠŽg¿ $ø7¨++‚ P”SN!K<€[0¦ì}ˆÙ8ìÇù“ah—Ë*s”!MˆŽ4añš¬ýX’eˆZ‹Ty3Y‡2µ«ì°E½°~3oœZ~@_“…óqØà½ü$>ž‚¼IÎ?aŠ~ÿ[Ò/ù º¶Ò”½DÞ¾¸—ƒ/KÔœ¨ÆÝ€[B÷5A1„I¯¾BbSçÏKÀ“4†œJ¤?ÕÛ¨‘ã7C?O žv¾¨ô´{(m(œ46â:^J!¥ t…–W›±x¯ÇDU"Bm{^ò±îñÌr¬ÞËL8–í˜(.ø1ÁëÂK$RYg.³¥Ï3ÛÈ58/,nÌʈ¡Pö(*l• ö^]ö¼Zyìötfd[2û²¹¨VÓÚŠÜÒ¨v¿íªlŒT¹ñxLƒÃxÙæ‘²†€",ÍŒ½´È/•~1Êý|}dÁ˜iÓJãÉÔùµ^¬^3F›?êÊrÂV]‘€És§Ï”|€äðÅk‘¢¾-nœ)êq0*Q~ø4¸Dî.§z‡åÐþAÝø3·¾¥\ǛړQ±S$«GœöÔ‡f¢"Aü¦œ"ûÒç¶°‡øµ’!Ûì,#ËYÊPžÞ¸,ùV©OÐåH\ß»žFFwóœS4¨±´Zâ#âqû s7… È›œç¯Ì6ß‹çÖÒ v´ÇTªÞOf‹x n?'HsVðÃ×Pt`¬;R¥…{¬–·ä‘*X%H!ž`“ ‡˜ ÚÝ_ñÓBà¼î¸\íi efñ'‡F7°àN e¨¡^=íöZXŒËŠ•Nì@—Ÿ5ñEAÔLev©Îîý`è&–• y ;ŠºmzpÙËz1¨ÃýÓì‘®9æü›ä˾GÔ%S•™jYQë%ï˜&¬aÏ-ídUíeòP~~ k/Æ« îûŸfƱ0ס€7ý‚üH¸¦ÍQZ˜|¦WŒûCëkyõê­Š+&‹IrŸã·ÃUW÷j­VUn9ôK ÕM½ŽÌ2þB_éIÙ’‡â߀T‡ŸiØFpm¥7ßa²fÃ?…iØÓwOj…a•j·å@"jd[ c†+ixãàߎ§ßŠñ0»~[ž¨9?§±ärĽðÛèpýSt¥“áÓp9ÿ#¥QAŸ;j¶oÖÐZÖ–TÉã€ÇõèÛi“‚ ¹¡HZ¨NšW>¥ÅuÁ»­å–ÐÓUþ„lÓðºQÿbQ»/X1ÓƒÊú½þWt½ÇêãGí¼½%‡à+%(¬MÁÍWÐu.<6¢þª™0… I*Ç(¹ôå< õöq@ÓÜ㣠nyšœ;:”ýcÒ{v%>C‚¤³9ÝŠÛ£ ¥ãpÔoÅÉqð˜,c4q3×ÎA».ýúÆ•ˆMSZV Ž}¬Ÿ s¹åV(pa€rcÏ÷K¸Xí¹ÿÛÃr ÿqëÃÕåÞ–õ~:yó^‘iNJ@XQÓL ä{^IÇEd¡3§÷”¼.ÿ“ibÔu*ázá\–±Œ—Ä•‹ÿTófk6š<ç3éCAY\Ý=ÅQóûS"%AÊâB#-ÛJäy ÈÊ'½ Œ8Ê<éz6ú_u¿'Y gù&>gÆéÕ¡‘FšJLRþ–$ÅͺÎí+.Ô៳…úÌ(cQ²Oå½IiHî°¡œ£^€qd¬•göCŸÉØX.FJoiòÖ Òã…°zö&º2”í÷Êô®¾}ˆÕüF@ЊÙUP6FÀ‘Äò[:„xêçh%¾àêx¬Ÿ$|i'‡îÔû³F7UHߌjíWÚ; A£Ô*]äC¦8S ‘´Yçþ&ýÀ)ð¢+mQ'XÁíYÿ”B'æiQM‰å¹Á•«ý—X@úÏÛp4ÒŠ·3O0ZÞýoaÙõ«bä‚èIÜf´Ö: Ɖd%\Ej3ä~ û3èšñߢ;)°ëáã°_æN£Š·Œ4È/eáÅØöP—y6Û¦ªœm¸Ý q:ŠÖC"KX«ÄÁª¯ íŸßEÓDâß–¸!î$ ƒÀ£FkAM×ó÷úõÚG€qÍ"µ0SÝrõòcior¡Nùx¬UèÄÉxŒî_·SöâÕ8žn!¿ô›ÈÚè:2}‹z/_äœ#S‘Q"SiËñu§ú»ÙD{ŠR…›-ÃRx°„þlS&ÚUàæ|N …9à€!µ«l&ic ÛNãœÇNaëÄë×ì{f‚ôÔ4‰=¸ÅñY:wu¯†œð6!íS¤jJÓ^“iƒIqvBS G{0]íß73AŒ!/XèŽÉ°X?áÑ(2õR÷¢ÁoL~Î@ÕïDË;B"åòÑ$‰è®®kÎÙܽ.ð‡¼Q„l¿ª LHD³‚ïAq°™R*'¼Ñó½ Ë SaöPÜqc1@µwÍ•ªUz®ùùnGØq#ÿ/uFŒ4 endstream endobj 77 0 obj << /Length1 1620 /Length2 12546 /Length3 0 /Length 13375 /Filter /FlateDecode >> stream xÚ­wcx¤í–uÐul§bÛ¶mwX±ÍŽmÛêNÒ±mÛ¶Ù±“/ï{¾3g®3ókf~T]Ͻ×ÞkcÝû¹ªH ”im b¶6N´Œt \U%u++cs[ZI'+À§™†”TØhàdnk#bàä¨"@#€‘““† lkçî`njæ øä ¤¦¦ù—å/€¡û?‘ÏHGsSÙçƒ ÐÊÖÎhãôIñ?TNf@€‰¹ ,¯ ))' —Sˆm€ŸM(8Z™dÌ€6Ž@J€‰­Àꀑ­±ù_­9Ò}r : Žv@#óÏ0 ›Ðî/ˆ`t°6wtü|˜;L lœ>gàd 0·1²r6þ«€O»‰íßÙ9Ø~zXbŸd ¶ŽNŽFævN€Ï¬ "bÿ¨ÓÉÌÀé¯ÜŽæŸ0ÀÖäÓÓØÖÈù¯–þÆ>i>Q'sG€ÐÍé¯\†@€±¹£•ûgîO2;ó¿Ëpv4·1ýW4 ©ƒ±ÐÑñ“æ“û¯éü«OÀêÞÀÎÎÊýïhÛ¿½þ£s'G •  #ÓgN#§Ïܦæ60ô]I[#Ã?ìÆÎvÿÄ\€ˆâ¯;CùY„±­•;ÀhC/gëô™@ñ?S™îÿNäÿ‰ÿOþ?‘÷'î¿kôŸ–ø»ÏÿN-æle%g` ü;ðÏw @ð×KÆÜ迸X›[¹ÿwÿî©üG•J@Sg+‡‡ÿA/hcú©-'ë?¬æŽbæn@cs'#3€‰Õç¬þ¶«Ú¬Ìm€Ÿšþ=N-#ÿa*fæF–6 ŸõÐÆøßËÿ”éïâé5e„´¨ÿë{õo?…OýTÜ퀀ÿŸD]ÖÖø?± Ùº¿ÿùù×I÷ßhDmŒlÿº1ÊN6ÆŸ—ì? ÁFΟÚþ½÷ŸMÿóü÷uÝ€F0Ë ¶FÜ©iNU9c"Ú=]ŒàAv%µ*…ù¾¶>©¡[œeú¯•Atu\ïÍîó'vo{RTûC]èVäÉÀ‹<\obÊî|¤u²Vvê}úï%pi§ê‘ž—s2›_´ØÔö·Ç•¾¿BàM´2;@]>Pú»äû¢’ÜÛÁÿ0J©‰AkC¬A®*89%K8z¸'ïèï¼úÚ½‡CMÊm€ñ#é„0ÑÉ]ßá¶Öèýë³ »ýÄ·ç¬T³Ð׈rémLÿ+åMÞ&Qêû^qÅ?bÅÉíáM§ñêj²¯gÍFšØT+Òðôæåy»£æÜiN)å¢êmS$ë··@ß0[L‘´LJ¼ýoÙà[‚ù ANÚ{ìa ïCzªT"€oywíŠ p਷š·.B|‘\)ÄÎŽØ×ž0‘e‰Áw³´[–n…Üΰ`[ƒÖ;Âèw®êªûØô«‡Ì –W¥GL¶žÉž-¡®Ð}u÷õƒ¿ L2øh7ó!2žTAdeéC» ÌãLR’龯ö½l8k»mV’ÅñÊ!ýÈ%ãW‰Ý«÷Uh¤©m¥Cq§Å0¸Pn²BS ¼Heƒ ^ç' ŨLžY5ÄŽôWG^Ǫr®W Þ÷‘û½˜†kOU6¹ |mû}ÏC¥6Qa“e¾¯ßŽ4Ÿj+xÍP® çÕ‰ø•RA·_Èx½GNŸÆ´Ç'/´î FU€ÿ÷ŒO¯ÏñóIóƒÇó*Dµ´{ÊUòh[v'?©q¨®mÏ'Œo$Þ°§L³K{øÒÛ P÷M?ë × MùÒ+µéqQBÍ»3)6®'@‘ ƒžc Ž©6,ò'ŸjH5ŠãQøàb3†@ ¡àÄLzL_jÖœx5’çOð÷ޅ¨†ì¼íT¢okÍd7Û]n¯¶›LAóž{Š÷`®ö„Ò\sb ЏM&Èø(‹•–‘Zš ö Oá·1×µDºWÕI ær%!¢‘Õ:xÈQQV¨Eçi9ò™nœEJË®ü´âr0Ç6mé pß#JI VÜŸÃ)ÙŒúVT æFüÑÉn»´KC¼bØ .É5|¸úãá‰ìd5‰o&¾°™÷–«Þ"!óŠþA%û`ôfžæNÖm¡OÚJµÂQˆÒpMQ[ a ·G¤J5á9¦C9Ïélù‡‚T ;Š õ^ÌAkÁò”¬+Usú¸㌅ 3/7»¥ÌK¬GØ·MuÌb\ÛYY¦ë‡.°D=JŠ|ÌO“Ç©ùú×âkꬫ"ë{?‡üg™ƒßp;ŠòÕ˜œ™¼ ·º%åS‡ä–¬a´?/–ý²fÞ}ʤ7¦Q„€03BŠî)?_Ì&°é–mž§ÆŽÜ*“Ì!"’*¤)Üë_à( 3;<ŠçjÊ'ÖͦŒÆ†–8ÊÚãàQ42ïNû×ôî{%p-3qØM;ºø[xIí££¶q&¿Ü‹½¸~ÙÜtãV-ö'p3¨¦pív—f¨á |[ÆwÊœ<¿ß‹H¯ò‹ÌH¤Â|¡„ðîj€w—Ò<øâG9ÜI}·¬…¢ù— Â^¦l¼úSŸu#Æ ðB4ÌÜÉüsÓŽ–EaæÜËQ—MàÙL|†´>ekÎùfk¡æÕN˜ÐnÇÌæ5Úº!œ¬lîèƒ!qÙ¡dËÅ!€IÏzV‡ þr^7BÙ¦øBÝ5@³]û¾­YҎ捻VDZչ¡ÉïÞâéöX ÀDz%ötFÅ“;õeWË¥ ÅSŸ#Àf~]˜Í³GL'…Âê¹Óιâ§Ë္ÀÊ¸Š‰6“- s–-WŽRñPp ·Èq”eë†Or{yÅÙŸ~x<‚cO†@•A˜¢iq(H7dö%’e©äÊË]t.ŽGÞ}o’@‹×%eÊ›JÕ„+œQûí&cN#žÒqq¿çrä"îëæðR°:«$æ÷ä½§7®õ0f•)/&¼õ#3”þ°bƒ@(a‹!¼ª~áÜ׆ȹÌs²è”¨°1‡û…ÓеSÑMY{*=bÂE”T9x ÿ*/¼,™#.‘£°Qû™­ù´“úèÔ³õ‘­ð—@µ}‘#!¢M¾œ‹ÉvD?™üû:ÛèÚHùLMÚacd¿E[4pÙ¢0-(üTP%‚s¢ßHšƒ«Õ²+ŒsÈV‘KJ¤Ë¹ü"OšªÀÄ!nÀÊyˆ=š©üÜêÛ“ÔmÓJÉÙÓóNFÌ£ËZ}÷…$¾jpUôö£TmÜMè4ƒ•„ôÚ¼â ;eg“‰%ÉûÙËþ6W¯[\uˆy‚ÁbÅÅáý8]†ëïBèx]VKÊn…Z2fâaÔl­R.÷?n_4¿D ú.o©¡ñ<_}qýSE¹ŒÀ3ÈGFn”¿.'ÖiÈ㰪؈•£jà8†ÜXX½Ù3*ÒÍb2nÂì;b}Ñ<Í je9…dM½r œ!ö³5Ÿ1Ý™¾/\Ekï"k¾s+Øü`;_‹ÒcmŒ\"V£D„¼¯€èâL)8z+ÆWír  ¥Óº!‡˜Z! ^Má)§æ´NÊEÇvBk:†3ŒpÏJç?ÅpŠ4©/Ó1ô¬¥dp¬P”<~>î ú¾á9`øýUp³ó`ÞwÂYÂÚÁâCPÅ€‰ùEÛÉè1s‹°ÃÉ–²ß‰VS 1–ZìdÚ`7,“/‰åb‘qmÒó½Ìmûê«¶žìòVãž &΂å`†¼¡Aµ²Ó0ßãP ³-_T²:œ.P®žh®„j<â:»æ}eSŽ8×Ç %d]ån¨W.5n¢+±§ý ¨,|)‰¥F©'ˆ™ke„—Y{´Þq¡Ú¬·™.;AqUQA ¯ÈE¼e†2úÁŽíoiìEòï"Ëü¹scØI×¼…صB–¡1ñ§n"W¨(5Ú {œR9Eá("U3O¾Ù© )¶)ˆÞø1øCד³Úe‰¿Ïü¶–+æ±íŸæŒýâ£T]Ý€í ±†óÝ1 ±¶a#ƒÍù`ì”l7á½Ó:Ó—$Plç\=ߨŠy%ï©K ›°ÙK`•85Ñð=·,üóEªÚGlÜ" qºçWü`Wjä |ÅUh‘T’ª‡¾»¥’³ƒ8Æ`A->ptžþ`Lîhba³¿w&Qií§‚{©ÔYu1ËV\o› š@7þ!Ý͜őÆÏHˆ:‰¼¤¬Õ«šR|òxºL¨Û–bPLÚÏÏ`#–È#³ºž&§¼ u^s˜ rßï`¦æSa²`RØ )n !f-Apb6sNW‚¶tׄ¾}:'ÁÐäQ„@žy*t¢ýÆÒÞÒs‘Èjò„Ѹ;PcûÐåü3pózòÑjis~À$R¯ƒ½Ýó¶y÷´ßòf‘/ÅîÉPp—duo.Œ¡S}p·%`¯ªœXüUQF†1Z/E§ñ­ýªùxJxFÜ- 0Í–~oGbJŠ`zÆâ…qËI!„õ î‡o£Ósó0XסM2X‰,G}–#º¢ÌûDe3žR°ÒJ±•é·«³ç%Ç-ÕÓ”ÝÐ^é°fx\LãS­Š9g³ö ú ÊÜ=«÷ξ5,Á‰ŸÆ$Ò«%'TC¡ É "Å$õ ƒkqqÄ/_åßhúFðC<$ÍïéŽo »ŽŒï8‚P@¶¥;Y?@#ÔTUÏÞ-Gį/À£ÍóæÅÅϾ•Z9•)=¼›£& kÛxÒæYaPPZ,nh´>zJQîA!üvÎ71Ä]‰\¦P¨ªÂ¥“Á0ÞÈÛ#᦮¹ÿę̀ÖËd”pƒ£ —[ÿÑßXjyËp/&1jŸ1_«Ñ°Ì#1QJó¼dвŸœnxsÙÃpO¤Ü†7$±–=]É áu©úMŸÚHp·Béuw´ÿÕœ©¨ŽR"ÞYÀòîõ4_çšmxH±ñÁ†îhæ[N`FÁp€ËÖœüëUqØžî´°’nàqè/¦I|ÔV/ù¤8Ñ’ÍT6ãKè‹ßyd¼w/`Áékè5&5‘@£ýâé$Ü_´Œ›ú´2Qþ¸m³¯Ã±,Zóîm§Å€%뼄!†-·•b`¤qæ…jP‘Rµ¼$O1{‰<7{íÓ}±=R{<‚-æ7=j­„¥Wù½T êRš yã’¨¿ÙÄ÷¨ËDÏ Ë miéæ… ôBÍ¡¦˜^œ90²¢†Âq¤…ôu,Ío¶Ì¿ùìšÇC¿Éò ÝÉÛbU1©Yiš© Ą³í \/>ºx~ññ˜Ik<=‹±ߘjÜf Â:'Ë8Ÿn¸L£ï/|»ú #}FEiX_0zÔ¨ð¥Øi!¿$ð÷¹Î„Í!þ¤&}8¿æú"Ç?u;²EÏq£‰`K8öuw›“ž2L{ŸO2§žÃ¸|Ç©”c½Û¡öRpAQs¥Û1LÓ“©íC»n=(÷å‘9ÚSB{]’¸nWVõÁùúŒ~ož§˜Â,jÒ©¶óñDÚV’µ>1…°åš¦UŸÞâ¼÷;‹€ü~aÍpMX9ø4w°‚›Ç6O3㊫AuîÌ"X ožT×â“5ˆO²cÆ Í0hCԢ܊¯1kΖð”eß§íçlUʧ}Bð¤9·~í)ÜN½X9>R‹Ò¸ê!VìŒà*ïì° ü¦Dâ`9sç­upÁâ y,† :Câ.섯žÎå¤Û»‹x®ÀÀƒ´B¬4¸.†«Ý"¢(”»p{ò!K ßnf–rRŠ;&^H°êî“ûÉõ#%ÁU¶Y ¦¸ý~= MYìøò䘔Còg+E#!óonfqrw7üØ÷;¤ÝÀ<ÅÆ‚]Q©™^$–Ò®ðÊ®Ç__«^‡L%ïW2=)YNZ´´„9 èûñH”vkÄIQ ›7Ô˜-ô©^††‘6‘ûSí=À ÐRŽ,i´'6ëëí%J:Žbvy H3â|qiwµ}Ù“‚ ù¦0ß-Ôã-AÍH`ˆ×XŽTOðšxX8Pî:ÎÞM÷b›ûË—:‚hå°MaŸ(øàŸK±/ =ÙMûJ×åNÔM_ÁÞ­àFô&醿œ¦Z;$–îËv¤Í@†Êƒ÷«¢„:ª†åbDñ‹®ãâ1%„›>m]‰°½¼.΅ᇖ:l K$—Òxé}ÿWä?؆u¦ E" `“Ûd›„%ËîxòK“‹¹0y´ˆ<”i+îâ—¤¢w²Ê:_éHtúQ,ñxV ÁPM{¿^%nÈ‹dÖíÁ¦³…#A¶a—8É‹ ÈˆÚåøªÃˆx5yÙœ*n$NYäÖeßVç qFênŸ9ò|鎦U§“@ß[zûÄÍ**‹Q-Ïu<ü_Å€L•ö«+¦¸#æ@*x‰qþMç¥>¤Âî &·&> ÿã y_Š*û¡jEᮂ‚ æ&]ä *Ð)u ÊôYºd¸I:žÌ_²Â;XÌâŸÏîD‚¹„ßR“©ÒÙ0ð‘sf§Îim8†/˜ôOÞpq~dVd!Ö f¬lï `E‰ö¾œrzW%>nNd\³^ˆ¯ˆ©OTó‚ÉIkµÄúçËU^ "uÛ#.¶Xo+‹iYÂt¯«¾°ŽÆ^˜žo:ú"‡#ø0ÁFûÓËÐÛ¨s»2àø²®ØÃ.77Ùñ;òB=ÿÛ˲óQ.l{u¡"F É_,I¯Äw4•J’–çIû5_œtœÜï ©L‘B32Vú1–ÚL\Ç µ‰P±zz¥(){Sã Ô{Äo°6U¬ƒ¥óœƒÅ—ê|¯¤³Òµa‘¤½²ËŒWõÙÀú×)]4q }u44à½*»²‰Ù¥&5=(ä~ZvT3Kõ5c” LëÀWïtà”#H¶0甿ÊOMbµ’h¿ŠÜ`e¸ C‹ð³êDk!qK€TèEiͳH⎖õ¦ÍáD¦?Ø/ʯ¬eéÄtø¹ œ‚nØ”‘¡±"tùY4 Íœ567cBPϘcͼ›ìS*¥OºýÑ{/At€‘Y]Ñ߯3É…Â)?)o”—XÇï\6Päú–}¿ÑIM,oÑfO"÷W‹‚¢N˜E¬=Œ™ZâÖ(É`…§2ªŽ&ñdæ›Äì" ç¢~ ^ª­,DUHZKÞH—“>ghÛŸ>E"rí—KÉ›å°O `¶ïü >¶Ý*Oˆé%ò-íªôɺœn "I ÌlNwžH|ãaN ’¶v ¤dÔ\FÏ»¤Åëµt²•~Þ]-“Î>t©s3ÛÍ%`¡§]#‘À„‚WÞ¶ƒ8 %øª¶yº š¯èâ!×f¾µ9`Àõ,Èÿ¡îž10nòòêõdË Hk%Þ-ÅëÄSÿ9Wiï€qÜc*âýÞ®'ªÖTL~,0€²­#DKú{r 4Û•ò(ïB•là9UC-òû¹È†D_»3æQB± é•a_ÙÃ}½Ã%ÀÚ†ðTwÈûýÒ÷”+Z]×»™â/V!0[ÚY¥˜g²˜•*j -WÆ‹/bM}h|ñ.Æmã! ãöõ°}ÀÊüC”P]NTH82:†K@”Øø•I£40vÕ–<-)YOÛÒ¢ÙÒ“Ó RK …Mh¾„TV¸@y«ZšÄ#$,<î>ö[¥±Ýœoò’N_óF–9ú²…¤«3î±DðµÑ5ßW"˜jD<à^HQH[An¸Ø*½qï$Õ6¾J>ÃWÿ‹ô˜­†ü¹¦å0õÚ¯µ©ˆd®ZîtIjW¥ 0£EN¹p© Dz—mXÈVŸmÊ=™ Þ™¦np-ËråŽ[(g¾R¶‡ì!ßHAöáì–OÞ¼†Àz\…Œ›^ÓdYdƒïEEá‰-fR‰^ÅSÓ«#9Ü ¨¯Ñ6{pÂ÷stU\e]œ¡ÊS7÷e¸£bhµsúúž( SZ`öæí÷MP&xÝ~Û¢ÅÚL©,Êå#iOýZD–12B#É,Ũß_ÁAše™[Ê9¸«42o–¯Æ/|3å}²pHê(OYªpxÈV°GøüÔZKŠÊÞUkcõ(IxÑ‚Îds$œü²w±õ)f%}õåäãéyW ¶·6-\T1RGx#‘%°™…ãZ.ž¨š‰ý„>–׋–¿øX7Ûóë.m„‚;; f6ÄûŸ;¦KÀÐOiÔqÞ-øŒJ "u­m&ôFFðÊ¢ü¶ßw|$t¹¢qZ—zHa)º:k.¼9|G¦‘—d/Ÿãˆ®ÿ’Ý;2QCTy˜¬OXNÍ8Wx[[ä§£ð‰oŠ^ͯÙÕNvúºÚø6hò>àníãG·L Â(K[4e¶jk½@+Ï+ ·ÿÍ2!l¯D‚RÄÜ«•mîOù-¤&wñîÚ ¹°í«Žl5øNg¦áÏe±ÞE=ÀÏÛ£š”˜»h{ûÜ·5Çg©R€NÏôˆ‹{ùILèÊu€™fÔ6„,/GÛ[‚NJz²;g*,xž¨=ÚM7¾Óysí•£IÌ´9L¥Ò÷€è¦þ㥖X¢¾QÐõC2uA’¡Çt9MÇÖ)±÷)û%­ù'¯S?ä=&Åı¨¤^¼žR˜‹@ôñÎñœ2¢ý¡þ2BªØx´ïÕŒÒ1¼1†­‹1¯y•;Í‘6xU1¬ ‘‚½ñ_]H™ÆŽ_0½Ì˜o_¿l"ÈlyªÒ1VþLì~¥Û¹e;WቋeiªÀXâQ79kŒ»tڻɱ$z>T¶iÊÛIå”ÝË$ŸÞx±¨ŒVÝJ%Õf÷Û¶ðxUïË_›0n 3~I$gɽ”æ(D/ hÝ­ ¿}í予Pݒ؆¼™æsÓÔi6~aƒN“<"$('ÊĆò 2WêuõG©IQIÌÌB…&õæ·ઔ[J¦_Ž<ìPlw<ŽÄ¡8êÚ;Á¾ v¨ŒW¶ÛtÕúÂ>›á±$¢#IÞÐÊžìÆÍúålyD÷¯ 6TŒ #p>°c«N'øÁý˜0û)ÓB,žÚRâ¿f–Eš£eš§vµ5XÛzâ­T›²—]ów%<à"‘/fÍ·j.?¤ºé´´÷DQT$‚¥Oñ;È ¸ ¬x¢i;ÌH)ÇùM{®yiøÍ`¶7¯z5 Õ;¬¼MŒý:ÕÖ1¬ã3½±‚v.PWÑkPîIg¢^þØÐ0¥oµâëÙYSã[ÛG)L`f¸Ú º¼oNÚ?Hi‰)*[­íëö"Š©Ù„þ°—ˆ‹…(¸üÊvÇ R8 îÀÕ ±eë ¨aÞ£ºÁ¦z ©7vxRIôrÐQygi-à&3š7Cò½šHwViVë=káQ(Ðé8BÚÖX£…àŃàØ};×Ïå?ë9±ýpÑ]p²¬xæ¸I(9Ð`ÛS«Èé‹b?Ô'ø…¡9…ÚÖ—·r]@ÿ;(9vg…yÔÓ·§#š¸ÿröì"³’mHá`~ŽIK5³!%qËó»uñ~+y£Ð­–ËCbÄä×ÕÝ–\³ßÙHG sÙž„y » a›cˆ§D➇˜mœ GáªÅ³ö¬êMN.QP36ÙâcüßêSHp '®íë´B­UæÑåpÿî¼’®þvùZÄΛƒ¶i[ñûJÔ/YC¬¹=‰òü7Ad[¡¾ îèŒ;œ®´a@/”kac+‚VŸ‚²ÉE+NvöãñKèn šàÂ~ª T7>×Xá…õ¶#a‘D½]šgãXK Z“úâ9âÎ-±Ó¹… û¾u²Ç†?BôÌôˆ‘(M_.ŠÅ‘)z{ð:”rœ4j§7¾hqrt½‚Ù1:8Ûýê‘Ò>ë/ñˆy 檿¨õçª)´žhdAøñA4ˆ8Lf¿g2Æ07 òí§¯I«ûì ÈÑììäÎÙð|ÃÿõšOƒñõù±B|@AËoTŽJÒ·ù»…ø¢ D«„È¡sL>ôuJB ŠÓ Ú'%…ófôƒæ¤Ì[…?YUÇ$¤}œœ‚ßÙ¡«÷ÄÇú¢Çø¡êm‚ŒAÕ͵©Š–DI¾ÌýXžde©Âø,‰FÞ¿qwKJ””m*¶pçAþm~š~)óÕhQð µ¾gœÎhÒþ[P©eñnÞú-çY’rïüÑú°Šµ¼± /ÒܻDz RFh•F°â_2=ÄfÑKÜŠ²Ü•šd8é8Lð3(߬Æ/óO<[í¨\Æ ÛÚƒ¤xbZP|íJMI®æò-  * V‰v-Ôwï¢+ïéIá^Õ RiŽ&ó°êƒòÅœH˜ÿA ‡Žœë"û¥kê‚1r!SXã?´Ý¢ÿÕX‰ ·„Ïî¹gìt2å«q'ÙQ¤oе„h£§EÝø¦”ËvZXk÷y}¤+Vµ”=J–@ø Aâ?-µ×>Ê^‚ìHG͎ݶò1Û â=u x‡4(†Ë`‘ÃÌëU¨}«Z&m}+¬ ~ZÌŸëܤś–zdXù@ÁøvMÖðËð±EYË/ËkÊÜ/$ß5áwÑëqrQH‹H\ÐqPg]V‰]0 lúö{Âsã›û¬ëÃpµ%À»Ää':UOY©!Ò#N«Ì¤áÞ|7A ÕB¬ÿ0«µ#ï†çýÒÁÿˆÿÄd¶ÈñøA™ ¾¡.?oyûk´r“§½'Æró qé…!î~êµ””ä5‹s’0…/§ûxëø°¥ž;¾;©Ü8ʵº{U×{(\ dS.J V4DD†ÕaêIjÁ‘É$­=UÿeJq(õ£À›uû@1$ˆØêy S¦ñŠñháñzÞÓ·sÔtÙŸ5¡ÜßhЍ"$nøoÍä)^ë yóXñÀfvŽäB€µz,­†|‘ÎkÑ5˜bÂY"Ù©Êéî…ù¼^ÆØ‹øož5•û¹‚=e"ÂØŸ&'³ðw1BûÓ{·såÀwÒåqJCnx3¶Õ×ò•}Q1ÙûÝÅA¾©¬T—è̘§jª´ÖÐ*ÌÙ‚÷Âæg,)3KÒX÷Ñö¤/`ñ_L~g‘*ºû~¼xp®pë÷IDX<Ú6Ùæ'Šû2}?~[ÈëóVsPûÞæ»…1zD’ŽÚë©Ò/³õ›J‡0‘~6a.8K$erZ×ìâ0N­z9zæÉÒІùÓ”ø±A·HT éõD 2ë’/ŠaBm$Ó`ÌmîI·Peê4xá•›¯cv³Ô"¢¡mÃ!誻/-åøŒ oqÝOi0»Â|ô×Å7þ²ê¼ùãÖI±g®ÃõÇmóg9øŸÌâ­@Ÿ®õ~ø Iêég`f±n¬ò+`•ôZ¢Œ L:ÞÇ»; ô¢‚{ý@¹™ ái’x¨¶JOv1»çú“µ©ÉHЮC%¬”&zöSgŒÝ4Òr¡t]T[½×ðÔnª ìâÑÓ7ÎÁT4ŒÁož(3 pF³³h•.²€›Ž9’Cä«`+£¶dØKpUþ°yÂ@(‚ôóŒÈZE±ÝvÒ“}X{›´¦Æ]4&<Ì&ÚIBзE;Ê#„œ¬¨nÅäÁ;¦"ÝK§ñúK{«TË|œ˜ÌLjbc¶Ì–°™ÒèÖFËoc4;éN ´Zd¦É‘ºæòœ„´b£ìD,ò8Áìíb_N–1M%É? TUñyâÒ׿»Ü ùÿ^Ö/ i–Ç#7m‡ ,çÂ5ˆû ÙÄUEéz„dªß–`°a…cPÁËŠeþ.ä÷Sð¢·|É;xµ${È„–‰§]úëP—Õ± ÐáÔŠ]7›Ù4» 0wÃ)$QÛÏï?¶Ô+-ID‹ÄJöSxC\£BñnË€æõˆ+uaû•; y°ìF”rè¥èN“€a>?<À7ài„µ¯WHj{¸ébÇßü›|ÏKªÐ¼ÊÊâ¨TßûùŠ.wêØ"±N﬽°5ìüÙñž€¦`Ó…S[YzżL¿³5kò†ág"%ËK°®ä‡âtzê`WÒ¼Êð¡å"Ÿ:G©jñF¸ñ—“êÚÎH4Öñ-Yý˨_Ì‘=íŸ)æ/Ñ–b¶aFØàœÓü#~ Ü­U øw GóbT¸Rµüد{S&—Îs Î nÊá3(ù؃„ðÑ67žÂL«ôøfØßÑðÑëc±ãr#Y3i¶‚ݸáî}¬¢‰ªÍk×_¥ç„hêß`Ðh¡LðJÖšÝïÓ Œ+íF=¼!'‚« !KnÀnI-} Åí¾¶â»8 ŸPsB…aý–7x# :µ¢ëÉ q¦ã•PLµ ×§ññ1áò¶mÓ ž¯ŒØÀÇê¸ÅQáÚ–“ÕÃ)ȸewÂSÖÜWWN r¨êš5«œ3åÌ[ѹn“Èé¢+–è%X¸–ìr,&èöÇTžÁôq£%ž¿o'¯ ¼SowÌÆæ*ë}ž ç L™“agL†Sz9áM¤X”t6É w¾/§”SOÖæ¨ÞåûÀ®]³íHÄìâ}áß§_Ò7ÇxV MØkM ÊN=Ûm~;$!$N–‰ôN+4²ÀÚzr¬ ßéÀ¸ú*v®•NáLûîÓÌR©]6AE÷îûŠ.#Q/Üò1“ÞÎBÃí±‚ŸëѨó6 t¿­v’Œvòqc©Ü4„©ÎcÔw¾ñ†ÿéÍÓŒ£Lî‹{¦L¸|YðMWÁoö‡ñ½$lèÆÆvfä&t%”½¶5ðù²"eÍÿ–Ì R. ×_›Ûɼµj…0ä®MOœE1½¼ý9Ñ>-¿³D‰:/.ßõ£¾—m~ 1ºÉSNP*`HÎjn›Ò™.Âj-3¥ÁuþF^X³Ù÷‹6—Ø`ç“ÕµJsÖçÔ®¤½nð+ÃrF”¿¦ ÆŒðˆ)_a@ÉœPÃWË–úw){ó~ªvoö?ÓÂd:‹"ËÓ´h§ÀòÄ}É™d0a-´‡¾‘fl>ë.EçÃì/.u¨’ìñh1Ì…î忨 ª6±hqN±¿wÕÒE3X†ÔÁ¦¯»‰˜êàøFT_ró›!ðýŸi èX 4¿güüázUô¼Ùˆõ+9vˆÎ[Ÿ&wñ¸ ³s™(>ì 9¤p‡sH!Ô 3w¶(éTKäÐùPåèá{Úê2ðÎÇÄì@“Ô(—áÄ7ÂFusÝ£ ü\Î#5æ¹ì˯ùÖÅ1XY‘ÔÚA†ìcæ,sÎ%<~÷CÁhEïÌëB %޵Y =„j¼U‘À¸‹¯ÞØP0Ö0kJ5½ µeŽa0·+•ñóÖ¨d¹ÛW3W|cälUf`àßJÂZÇøyt±QÖh“êU£E^×_…œÚÛ!øÂ¿+Ή­ÝÃf&.AsŒ:…ÇTwñS!àþž¼àöé½iBÄ;ê°Qžˆ-JKƒ-g’|›/‰ŒŸ„SÊŸ«ÜÐæ¿*Wv6ý˜a\•Ȉê,»ðÔ‰â$ÃÏç$÷È&OcÔ8¢çΚv¿„`Q‰ÎJä›óZÿ¦óÞ¾¹š ï$_Ia4=†$ÊW´¨v7¦jI…a{BÞÞ÷ˆ™ ?!d¥¸´·d wý?¥7‘ì endstream endobj 79 0 obj << /Length 675 /Filter /FlateDecode >> stream xÚu”Ao£0…ïü ï¡R{Hc›IE² H9l[5Õj¯ 8]¤Ä ‡þûõŒCfUm‰óçÙŸ˜»¯»™ªÛƒÅœ½Ù¡½ô•™Ÿû.º»ËÛêr¶n|¶¶¶õôvxb¯}[íìÈîÍ6ߺf|ðæ­«N—ÚN®ÿ›´ýhY »·¿gÕy8£à³Ã¥9›q°¿7ãÉÛ¾q0_f_Ë þ²ýдGι/®6í3Dók 6Ÿ"W÷×Tì#!YÝTãõ ÿ«³¿X¼ûF{Þºc­×lþæ_cÿ‰9¢ùK_Û¾qìþk8ÿrw麓… ŒG› «íÑïéïáy¶lþÍIo®÷ÏÎ2‰Ï"d«ÚÚݾ²ýÞ}ØhÍù†­ËrYWy—„‡ãdͼ•/á/VÉ&ZKáµL¡À½öx™”¡°ô…Y… juÛÃwöÏøÔ¯ú³ï¯Éx¼Šý2Ž$OAËP‡ýy´½º„t4îsíŒkì)$î©Q¯ "7A£?gÉ@‡c(ô„3jok9E u9¹ŒÁ/d86dqð/@cNiЃ9eyD¸H…{f¡®@/ÃZô`~ž£G¡. ¿Ð˜!ÌÂ`½DÈoÐSòc_ ùåBÂZ }%÷m<;4x²àÇ{[þãW<ÜœQ â¥$ñR1ñR â¥â¥Râ¥2â¥ñR:dÈA‡3NUAUI5'ŽZG-‰£Ž‰£^GGGG½$ŽzEµ"ŽZGmˆ£Î‰£.ˆ£.‰£áÄÑâh$q41q1‹/üÂð‹‚/fÒm|T—¾÷“Ž ³·ÙÖµ¬ÂÅiÃÓKýõN‰" endstream endobj 80 0 obj << /Length 672 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öÆ6’*ŠdrضjªÕ^pºH‰A@ýûõŒCf»êô¿™yã'æîÇën¦êö`gñ#govh/}egæç¾‹îîò¶ºœ­Ÿ­­m=Oìµo«Ù½Ùæ[׌ž¼uÕéRÛ‰õ=IÛÆú°ûwû{VÇQðÙáÒœÆÆÍ8ß›ñäIßž3d_ƒ “~Ù~hZ÷ÄÄ#çÜ W›ö c Ñü*…Í'qÇÆÕýU;€ºHHV7ÕxýÂwuö÷É»Ïa´ç­;¶ÑzÍæoþpûOÔøÍ_úÚöû`÷_¥ù£Ý¥ëNd0m6¬¶G_ÑÏÿ¼?[6ÿvÆçý³³Lâ·ºª¶¶C·¯l¿w6Zs¾aë²ÜDÖÕÿ%!ãpœ¨™§ò%¼b•l¢µËÜc€Ã¤ ¥¤ÀÈ ¤ÀPÀP«[ ßuªŸñ©_õgß_•ñxû4Ž$Oˇú<X^\NB8 ë\;c®‚šBbMx¹ ùy˜%ÆPÈ 3jok:E q:¹Œ/d4ˆ8ð€Q§4ÈA2="\¤ÂšYˆ+ÀË‹ÔÏsä(Äè5$ YŒ—Èú rŠÀ‘€ƒ~ì+A¿\HÈ•ÐWr߯{ÇNøxoËøŠ‡û• ¿”$¿TL~©ù¥òK¥ä—ÊÈ/¥È/¥ƒ†p˜1ðsòQä£*ÉGÍÉG-ÈG-ÉG“zA>ê„|Ô)ù¨3òQ/ÉG½"µ"µ&µ!uN>ê‚|Ô%ùh8ùhùh$ùhbòÅ,n~á†üá°nË£ºô½ß+¸´p]À¢hœ½íµ®í \ˆÓ†¯—2ú ¯M„Ç endstream endobj 81 0 obj << /Length 698 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öƆ@LE"¤¶­šjµ×œ.Rˆ$‡þýΛ1i·Z)A3Ï3óžÆ7?ž·“¬îönÝkõâNÝe¨Ü$ÿ¹ëƒ››¢«.Gמ«]=®žÔóÐU[wV·ù¦Ø´ÍùŽŠ7mõ~©ÝXõÿ¢•{kÚÏð¨ÛW÷{Ò÷ï{;Lè§Q÷Úœßiýû’¢\]sÅ¥¿ÜpjºöA™{­5ë¶Î»#tŸ‚©çVÓQÍ¡iëÁ P{È L¨ê¦:ûŒŸÕ‘ @óöãtvÇM{è‚ÅBM_hñt>XÙ]0}j74훺½ª"t{¡ÌAÒÁr©jw a´×ÇÝÑ©é÷M]—_?z§BΨ©ºÚú]å†]ûæ‚…ÖKµ(ËeàÚúÛš‰¥ekªÕs<ÌÌ, X#.˜K±Ié†ÉŒ€ãCîӀЏÀŠç˜©ô2î¹àOê¹0'õ\8·i!¾+e®8çÿI++Ä7>£â¡ÿ\ýéÇ‹ËåzT—a ›‚o ¾ðý7­»^R}×£‹ÿ|»÷'²§2ø ­rN endstream endobj 82 0 obj << /Length 698 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öƆ@LE"¤¶­šhµ×œ.Rˆ$‡þýΛ1i·Z)A3Ï3óžÆ7?ž·“¬î^Ý$º×êźËP¹Iþsß77EW]Ž®=?:W»z\==¨ç¡«¶î¬nóM±i›óoÚêýR»±êÿE+÷Ö´Ÿ%àQ·;÷{Ò÷ïƒ&ôÓ¨Û5çwZÿ¾¤(W×\qé/7œš®}Pæ^kMÀº­óîݧ`ê¹ÕtTshÚzðÔ+ä&TuS}ÆÏêH yûq:»ã¦=tÁb¡¦/´x:¬ì.˜> µšöMÝ^Uº½Pæ @é`¹Tµ;Ð0ÚëãþèÔôû¦®Ë»Þ©s#jª®v§~_¹aß¾¹`¡õR-Êr¸¶þ¶fbiy=Œµ Õê9ff–¬— Ì Œ¥Ø¤ôÃdF@ˆñ!÷iŠ @E\ ` H Ås¤ µ¨¶` ¥%(Ng ˜*R©0fd9ÏÈ0#üb.Àš€´k©(@».°o¶†ôÕ劊 @u)Â(†A£±©þìòü:,RxÊVús}æ¯e#3¸£cé¿¶¯§gˆWC´ÎÙYÂjÍx©†ùM„­æ#Æ¿p'Èg_r¯ÏÄÿbÐhyƒpßÌ….šŒcÍü+Á™StÑI Æê(ç^ÿZ9öïºBÿîÀŸh‰±?+q ÖðÌ~ØPjà‡å=™¬?Ðfc91ا/sŽù4êlƽ¬Ç®‡ËÃÄ<úÉbî]Ë™·äx©çB}êßÌTz÷\ð'õ\˜“z.œÛ´ßÀ•2Wœsÿ¤À•âŸQñЮþôáÃÅår½ªË0ÐMÁ7ßøþ›Ö]/©¾ëÑÅ¾ÝÆûÙSü/Arž endstream endobj 83 0 obj << /Length 699 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öƆ@LE"¤¶­šjµ×œ.RˆCÿ~çÍ8M»])AãÇ̼7ÏÆW?·“¬î^Ü$ºÕêÉ»ÓP¹Iþs×WWEW®ï«]}~{¼SCWmݨ®óM±i›ñ†’7mõvªÝ9ëÿI+÷Ú´—ð¨ëg÷{Ò÷oCc‡ ý4Ÿ›ñ¾½S¨  8ù—ŽM×Þ)s«µ&`ÝÖyw€ôc0õôjz´oÚzðÔ &TuS~ÅÏê@ xû~ÝaÓî»`±PÓ'zy‡wÖvL†Ú Mûª®/²Þžhé Aé`¹TµÛS7š÷~wpjúm®÷Ïï½S!¯è©ºÚû]å†]ûê‚…ÖKµ(ËeàÚúŸw&–’—ý97¡\=ÇÃÌÌ’€5â’yA€±›”a˜ÌÑ>ä:M1ȈK,‰¡xÎt‚¦Ù,¡”¤Å錓@F*&" C,çzdèWÌXP€v-h׿akH/‘]® ˜d—"Œbtv"Öggª?»|¿‹ž„2JB^G—5Äkdwt,uà×VââTâ ñJbˆÖ9;kBX­Ï!Õ0¿‰0ºaþ0büw‚õìÓÚë3ñW M";÷Í\8á¢É8ÖÌ¿œ9EŠa¬Žr®õÛʱßsè ýÞ?Ñc>+q ÖpÏ~ØPrà‡å™L Ö h³±œÌiÅËœc>:‚›q-ë±+Á¡ÁòÁ01÷„~²˜k×2#ó–Ï 3õ\ÈOý¾ñÁL¥–qÏRÏ…>©ç¹M ñ \)sÅ9çøO \Y!¾ñýçêO>\\/÷Auº*øâ[ßÓºkªïzTñŸï·ó%ŠÕCü¢t« endstream endobj 84 0 obj << /Length 699 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öƆ@LE"¤¶­šjµ×œ.RˆCÿ~çÍ8M»])AãÇ̼7ÏÆW?·“¬î^Ü$ºÕêÉ»ÓP¹Iþs×WWEW®ï«]}~{¼SCWmݨ®óM±i›ñ†’7mõvªÝ9ëÿI+÷Ú´—ð¨ëg÷{Ò÷oCg‡ ý4Ÿ›ñ¾½S¨  8ù—ŽM×Þ)s«µ&`ÝÖyw€ôc0õôjz´oÚzðÔ &TuS~ÅÏê@ xû~ÝaÓî»`±PÓ'zy‡wÖvL†Ú Mûª®/²Þžhé Aé`¹TµÛS7š÷~wpjúm®÷Ïï½S!¯è©ºÚû]å†]ûê‚…ÖKµ(ËeàÚúŸw&–’—ý97¡\=ÇÃÌÌ’€5â’yA€±›”a˜ÌÑ>ä:M1ȈK,‰¡xÎt‚¦Ù,¡”¤Å錓@F*&" C,çzdèWÌXP€v-h׿akH/‘]® ˜d—"Œbtv"Öggª?»|¿‹ž„2JB^G—5Äkdwt,uà×VââTâ ñJbˆÖ9;kBX­Ï!Õ0¿‰0ºaþ0büw‚õìÓÚë3ñW M";÷Í\8á¢É8ÖÌ¿œ9EŠa¬Žr®õÛʱßsè ýÞ?Ñc>+q ÖpÏ~ØPrà‡å™L Ö h³±œÌiÅËœc>:‚›q-ë±+Á¡ÁòÁ01÷„~²˜k×2#ó–Ï 3õ\ÈOý¾ñÁL¥–qÏRÏ…>©ç¹M ñ \)sÅ9çøO \Y!¾ñýçêO>\\/÷Auº*øâ[ßÓºkªïzTñŸï·ó%ŠÕCü3tÉ endstream endobj 92 0 obj << /Producer (pdfTeX-1.40.25) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20241022140644+11'00') /ModDate (D:20241022140644+11'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023/Debian) kpathsea version 6.3.5) >> endobj 3 0 obj << /Type /ObjStm /N 74 /First 575 /Length 3065 /Filter /FlateDecode >> stream xÚíZYsÛ¶~ׯÀc|;&ˆ•`'Ó¹¶'ne¼4iRO‡‘h›‰$*$8÷×ß¨ÍKêvúб’ÀÁÁ‡³á¤d!³L 1á,!“·‚Iç˜Ðh‰™0L[v¦cÉPa”c2d& =:IælĤ‡Ð0©ÁÂh& *3pÖÊ2 Ö&Âx!ø)°‹Àä.ÔEW1ŒìbÐ`J11zI•P`® ”Ð5’‘,° :#ÍÀ = 5ºÆ‚ Zà1°Ä4b¦4&`SV(f SQ„ÁÐaF†®V3ö8´-q3MbÐB¨"–Z€ MÄ`öV˜¡«A$a銤Cüm…Ù{Ä‹1¾ŸUgÄíñã?ù6K\¤¾—O«tZ• ŽÂ?JËüª¦%ù½¯y‘޲d7¿fï‰\)°E§Eàâ³ø`@Vï©w¦ÓìÞ#Vø‘áÐþ¢ê‹®/¦¾ØúùËÙ`Ÿg4àÇW*ÿ|˜M? øn^ŒÒÂ#gü9?à{xÀPg}XaÆB>gm˜±HÇ\ÙF¸„ÈvزćY•Ïòâc2z™? £àЉL ,ÿ~$ÂÊ FøÖ@CöÒéI[ÄÊlrt0™åEõôšÊÉô*?(Â[¬""€p ÑaÿmÈFç"Ä!VmZ œ Ö%eâÀÉõúz~žçK›Èû ’q.°fCHÐy /š7I1MËg£¤JÐt¤ ÌÁ˜Þõýhz!éíoï˜7ɰœÈ!Øôj<>ÛDªkR+…%û.¤‘‚ÃÝTÙ@È;‘Z\Ex'R©aPÈ n"µq aÀCÊ}Äf/Ü}d#J4ÜIÊ@š{dЦ½7”‘4÷e+õ=²å#9i¿.òáq Åbx²ÏøIz]-GÞ¥•AÛå•AëïXæÓ×f>}=ˆb·ÞÖ `>¡Å‰Îð5zy¢Fþ©%P×0MPÇõSSYÛ€i*Å Kà&/—*¡Gy.»‚@ŒŠs"¤HuÏ:Ç÷~Ïw?ö#ðŸiðc~zt@¿G—U5û‘ó½£—ÁÑö¬È?‚|”ùÑ4ýZÖå2 £mÌFç[bÍ=`G2Pd×pciÇ ©,lت…REšVÚFZG÷†=,’iP,Àžø•­ .«Éøä«4¢ ä‹ÐeTŒõ_þó€j²_¸–¨&ûuú!€–ÅáéEö?IËa‘ͨoÉ/h‰z(ü"öyØt#Ñ~§°Jª>þ Vˆ­.2 D$m\@ ™vÂw‡?I²q•ÿxQ¤y\Ôyì?œyp5Ͷǃ2ÛZHŒºs2Ð'U!òEä ÄÞùvJäSX_Õ”Ò…/X‰¼]Ü‰Ô µ‡ÇߖتøaV¸MiÀÍ+ß{ƒäÿßß_ö;ûW­t-ó…Ž ¯p!³tb“ç vyw Ò†ä$Øv#ɪk¤#ZÿçÛC:» ±EGÐÃBIýèçÒE¨óõªC¹Ø@ô¾/®ôÜö¹íçÇiú´?­é2òcÑœ¢Á ›º7†Î%sŠ<>òcFÒú¶¹¹£SdG|t}µÎKŒŽV‰_$%,Öi­˜Ú«F) Dô"@4€¦ý¯R²2/l©´¦{‡Ý ÕMÖB(±a{)E C ’ ÑGØšO®Œ_«¢C†5äöÈ„&š˜¢ƒÖØ-(±%lçB½a/}ÉøÏéˆê½Ž O ‰±Õ—ב”þ¹µo¨I·¤‡V·tmÚÚgêëéˆ÷-*"Õh:ëû†=ö'{%:ÙŒKcÑ3µS_êã­jintô^ó O³õLÞÌîš÷ngäUÕ6R…ó&º(&úÝË ½ù5fØÎ³•Y'ãæÞ‘O6(ý T:ꯖfP›¸Åÿo;ë¥c´Ø·©[^Ô‹ÿËd‚–wÏö~>|÷ÃÞ‹ãÓ¢iœ\`Ÿ]Óìúç¶ Ù¶ô“çØÒÑK9¤}'°a›Ìž§ÙÅeóHãPÛ¶”rÀªdœ w¦ã”mÇHçªtò+˜ øÛ¦“VÄã2)(sxÄwø.Ê÷ù!Éø ?å ÿÀ?ÉðSZÓóª½/¨7§Ôt2Iøˆ§Üóãégl ø9¿àH“*-øå·Ùe:åÿÄÇ|œ–%Ÿð)ŸfÓ”ç=xyòÃéÑ›× æ7ÊòÃíÝ|}¿µ£Îz¤µfýz:æ£lz dçç)Œ™Ž«ßKïcd-£ K\kõÈŒl ¦Æ j dºÞeÈ¢kÛö>æÎÛ=y3Qí^­W4þÁ¬Yuwè¼oÌÉeaqÔ‹‘çM”ü¸'?w‘²‘:ºÁqéuU9|9[µºÞ[1ª„ì&eêOfÖ$f fJß”ø#ÿý¬(+2 ¦`އIó $¸½ÉFÕeIŸ«xÒ“üt A Ø kÝ€–Ò“E8Qx œpG,Ãqáýáܰ/!“ËÈhQ]/¨::t6Nâ,C÷‡zÃâ¸U/C•}¤¦‡TÝŽT~ÒÍo éŠõéÖ§o‡ªîõNËÔh»b ¦ÚÅsÌövÌz3½Õ+éµÞ"Äÿ’Êîkóî±> ] ¯®ª1âYÙ`c´ö¾f*º~’núB¯~ïGŸìù»æ…`ûT¤_èë¯>Òº£î:Š›ïr^Ò)®ˆÖ0iß:²hºßšÁmÛM.ts¦§žvp/‚fðFÛªeG«4üèI>Ü>®’¢Ú¢ IÊ‹ŸG¨úUç£áe2ÃfÃWé¦já³-zµk?øÐ²G±ð¥n˳IV-ÁZ¥?[žÄ Æã‘ÕæR?Ë-úèqþ¬¶è£EÿÜÿòN/U¡›[ªBO!—¶cöÉV€õ¿ v‰­Ù¢¯&—Øö{ôI;Öµc¸š™«'èÜMò[Ç® :·f-Ûƒ„ÇùÅ öÈîõxëf©ÕSŒ›æã¯iò%ÝËáôÅö2ožÉ ø <242ABBFF933F1799F73DBE8ACD816C6C>] /Length 241 /Filter /FlateDecode >> stream xÚÑÉ.`†á󵨱“yli«5S35´( [±‹nÝ‚»H$BRá,Ü+p-üïÙÞ¼záè‡D¡  ­Ð8„´CtBtCÄ!I’éË_‚=HÃôAva¶`ö¡%˜Q–¥ïýèŒC&!³0&Ë|û.Ó0Y˜‚9˜‡MX€EX‚eYñάÈnb^eY3çµ*ûýñZ“ÊI¯uéöÅkCz¸ ðxxªžë×Ë@óÚ'p 'P‡S8ƒs齯Ÿqû¼É endstream endobj startxref 112398 %%EOF gdata/build/0000755000176200001440000000000014705613304012434 5ustar liggesusersgdata/build/vignette.rds0000644000176200001440000000041514705613304014773 0ustar liggesusers‹uOAjÃ0TjÇ©…ÜÚ‹^àW„\ÚB MÚëË­ˆ, É©è-/»¶%czÐJ3Ìhv>—„;ÏqFøŒ68<OR¼×%èöÄÍöÒyru‘g©œl©±þñ´æò‹ŠÖDUApª”ñЧeÎÂñ꛺ŸèÄ…ÙÿÃu^LÃj¬_ –õTÚ¯Š`Ój;ÜC>òƤ+Ш¼ÉõİðI–ÜZ¬9±ÄMÎ,ʾtâÉxÇ ‚w^õ zÛîüsê-¶L3™‡5ïŸÙ¯Sñ8(5Êe!lÝ´½â¨ëú6Ýè$À†¹Ì¡‚¬0èGtû¦Î8gdata/man/0000755000176200001440000000000014705602635012115 5ustar liggesusersgdata/man/drop.levels.Rd0000644000176200001440000000205114631624774014645 0ustar liggesusers\name{drop.levels} \alias{drop.levels} \title{Drop unused factor levels} \description{Drop unused levels in a factor} \usage{ drop.levels(x, reorder=TRUE, \dots) } \arguments{ \item{x}{object to be processed} \item{reorder}{should factor levels be reordered using \code{\link{reorder.factor}}?} \item{\dots}{additional arguments to \code{\link{reorder.factor}}} } \details{ \code{drop.levels} is a generic function, where default method does nothing, while method for factor \code{s} drops all unused levels. Drop is done with \code{x[, drop=TRUE]}. There are also convenient methods for \code{list} and \code{data.frame}, where all unused levels are dropped in all factors (one by one) in a \code{list} or a \code{data.frame}. } \value{Input object without unused levels.} \author{Jim Rogers \email{james.a.rogers@pfizer.com} and Gregor Gorjanc} \examples{ f <- factor(c("A", "B", "C", "D"))[1:3] drop.levels(f) l <- list(f=f, i=1:3, c=c("A", "B", "D")) drop.levels(l) df <- as.data.frame(l) str(df) str(drop.levels(df)) } \keyword{manip} gdata/man/duplicated2.Rd0000644000176200001440000000356714631624774014625 0ustar liggesusers\name{duplicated2} \alias{duplicated2} \title{Determine Duplicate Elements} \description{ \code{duplicated2()} determines which elements of a vector or data frame are duplicates, and returns a logical vector indicating which elements (rows) are duplicates. } \usage{ duplicated2(x, bothWays=TRUE, \dots) } \arguments{ \item{x}{a vector or a data frame or an array or \code{NULL}.} \item{bothWays}{if \code{TRUE} (the default), duplication should be considered from both sides. For more information see the argument \code{fromLast} to the function \code{\link{duplicated}}.} \item{\dots}{further arguments passed down to \code{duplicated()} and its methods.} } \details{ The standard \code{\link{duplicated}} function (in \code{package:base}) only returns \code{TRUE} for the second and following copies of each duplicated value (second-to-last and earlier when \code{fromLast=TRUE}). This function returns all duplicated elements, including the first (last) value. When \code{bothWays} is \code{FALSE}, \code{duplicated2()} defaults to a \code{\link{duplicated}} call. When \code{bothWays} is \code{TRUE}, the following call is being executed: \code{duplicated(x, \dots) | duplicated(x, fromLast=TRUE, \dots)} } \value{ For a vector input, a logical vector of the same length as \code{x}. For a data frame, a logical vector with one element for each row. For a matrix or array, and when \code{MARGIN = 0}, a logical array with the same dimensions and dimnames. For more details see \code{\link{duplicated}}. } \seealso{ \code{\link[base]{duplicated}}, \code{\link[base]{unique}} } \author{Liviu Andronic} \examples{ iris[duplicated(iris), ] # 2nd duplicated value iris[duplicated(iris, fromLast=TRUE), ] # 1st duplicated value iris[duplicated2(iris), ] # both duplicated values } \keyword{logic} \keyword{manip} gdata/man/rename.vars.Rd0000644000176200001440000000233614631624774014637 0ustar liggesusers\name{rename.vars} \alias{rename.vars} \alias{remove.vars} \title{Remove or rename variables in a data frame} \description{ Remove or rename a variables in a data frame. } \usage{ rename.vars(data, from="", to="", info=TRUE) remove.vars(data, names="", info=TRUE) } \arguments{ \item{data}{data frame to be modified.} \item{from}{character vector containing the current name of each variable to be renamed.} \item{to}{character vector containing the new name of each variable to be renamed.} \item{names}{character vector containing the names of variables to be removed.} \item{info}{boolean value indicating whether to print details of the removal/renaming. Defaults to TRUE.} } \value{ The updated data frame with variables listed in \code{from} renamed to the corresponding element of \code{to}. } \author{Code by Don MacQueen \email{macq@llnl.gov}. Documentation by Gregory R. Warnes \email{greg@warnes.net}.} \seealso{ \code{\link{names}}, \code{\link{colnames}}, \code{\link{data.frame}} } \examples{ data <- data.frame(x=1:10,y=1:10,z=1:10) names(data) data <- rename.vars(data, c("x","y","z"), c("first","second","third")) names(data) data <- remove.vars(data, "second") names(data) } \keyword{manip} gdata/man/trim.Rd0000644000176200001440000000334414631624774013371 0ustar liggesusers\name{trim} \alias{trim} \title{Remove leading and trailing spaces from character strings} \description{ Remove leading and trailing spaces from character strings and other related objects. } \usage{ trim(s, recode.factor=TRUE, \dots) } \arguments{ \item{s}{object to be processed} \item{recode.factor}{should levels of a factor be recoded, see below} \item{\dots}{arguments passed to other methods, currently only to \code{\link{reorder.factor}} for factors} } \details{ \code{trim} is a generic function, where default method does nothing, while method for character \code{s} trims its elements and method for factor \code{s} trims \code{\link{levels}}. There are also methods for \code{list} and \code{data.frame}. Trimming character strings can change the sort order in some locales. For factors, this can affect the coding of levels. By default, factor levels are recoded to match the trimmed sort order, but this can be disabled by setting \code{recode.factor=FALSE}. Recoding is done with \code{\link{reorder.factor}}. } \value{ \code{s} with all leading and trailing spaces removed in its elements. } \author{ Gregory R. Warnes \email{greg@warnes.net} with contributions by Gregor Gorjanc } \seealso{\code{\link[base]{trimws}}, \code{\link[base]{sub}}, \code{\link[base]{gsub}} as well as argument \code{strip.white} in \code{\link{read.table}} and \code{\link{reorder.factor}} } \examples{ s <- " this is an example string " trim(s) f <- factor(c(s, s, " A", " B ", " C ", "D ")) levels(f) trim(f) levels(trim(f)) trim(f, recode.factor=FALSE) levels(trim(f, recode.factor=FALSE)) l <- list(s=rep(s, times=6), f=f, i=1:6) trim(l) df <- as.data.frame(l) trim(df) } \keyword{manip} \keyword{character} gdata/man/getDateTimePart.Rd0000644000176200001440000000267014631624774015442 0ustar liggesusers\name{getYear} \alias{getDateTimeParts} \alias{getYear} \alias{getYear.default} \alias{getYear.Date} \alias{getYear.POSIXct} \alias{getYear.POSIXlt} \alias{getMonth} \alias{getMonth.default} \alias{getMonth.Date} \alias{getMonth.POSIXct} \alias{getMonth.POSIXlt} \alias{getDay} \alias{getDay.default} \alias{getDay.Date} \alias{getDay.POSIXct} \alias{getDay.POSIXlt} \alias{getHour} \alias{getHour.default} \alias{getMin} \alias{getMin.default} \alias{getSec} \alias{getSec.default} \title{Get date/time parts from date and time objects} \description{ Experimental approach for extracting the date/time parts from objects of a date/time class. They are designed to be intiutive and thus lowering the learning curve for work with date and time classes in \R{}.} \usage{ getYear(x, format, \dots) getMonth(x, format, \dots) getDay(x, format, \dots) getHour(x, format, \dots) getMin(x, format, \dots) getSec(x, format, \dots) } \arguments{ \item{x}{generic, date/time object} \item{format}{character, format} \item{\dots}{arguments pased to other methods} } \value{Character} \author{Gregor Gorjanc} \seealso{ \code{\link{Date}}, \code{\link{DateTimeClasses}}, \code{\link{strptime}} } \examples{ ## Date tmp <- Sys.Date() tmp getYear(tmp) getMonth(tmp) getDay(tmp) ## POSIXct tmp <- as.POSIXct(tmp) getYear(tmp) getMonth(tmp) getDay(tmp) ## POSIXlt tmp <- as.POSIXlt(tmp) getYear(tmp) getMonth(tmp) getDay(tmp) } \keyword{manip} \keyword{misc} gdata/man/first.Rd0000644000176200001440000000277014631624774013547 0ustar liggesusers\name{first} \alias{first} \alias{last} \alias{first<-} \alias{last<-} \title{Return first or last element of an object} \description{ Return first or last element of an object. These functions are convenience wrappers for \code{head(x, n=1, \dots)} and \code{tail(x, n=1, \dots)}. } \usage{ first(x, n=1, \dots) last(x, n=1, \dots) first(x, n=1, \dots) <- value last(x, n=1, \dots) <- value } \arguments{ \item{x}{data object} \item{n}{a single integer. If positive, size for the resulting object: number of elements for a vector (including lists), rows for a matrix or data frame or lines for a function. If negative, all but the 'n' last/first number of elements of 'x'.} \item{\dots}{arguments to be passed to or from other methods.} \item{value}{a vector of values to be assigned (should be of length \code{n})} } \value{ An object (usually) like 'x' but generally smaller. } \author{ Gregory R. Warnes \email{greg@warnes.net} } \seealso{ \code{\link[utils]{head}}, \code{\link[utils]{tail}}, \code{\link{left}}, \code{\link{right}} } \examples{ ## Vector v <- 1:10 first(v) last(v) first(v) <- 9 v last(v) <- 20 v ## List l <- list(a=1, b=2, c=3) first(l) last(l) first(l) <- "apple" last(l) <- "banana" l ## Data frame df <- data.frame(a=1:2, b=3:4, c=5:6) first(df) last(df) first(df) <- factor(c("red","green")) last(df) <- list(c(20,30)) # note the enclosing list! df ## Matrix m <- as.matrix(df) first(m) last(m) first(m) <- "z" last(m) <- "q" m } \keyword{manip} gdata/man/is.what.Rd0000644000176200001440000000216714705602635013767 0ustar liggesusers\name{is.what} \alias{is.what} \title{Run Multiple is.* Tests on a Given Object} \description{ Run multiple \code{is.*} tests on a given object: \code{is.na}, \code{is.numeric}, and many others. } \usage{ is.what(object, verbose=FALSE) } \arguments{ \item{object}{any \R object.} \item{verbose}{whether negative tests should be included in output.} } \value{ A character vector containing positive tests, or when \code{verbose} is \code{TRUE}, a data frame showing all test results. } \author{Arni Magnusson, inspired by \code{demo(is.things)}.} \note{ The following procedure is used to look for valid tests: \enumerate{ \item Find all objects named \code{is.*} in all loaded environments. \item Discard objects that are not functions. \item Include test result only if it is of class \code{"logical"}, not an \code{NA}, and of length 1. } } \seealso{ \code{\link{is.na}} and \code{\link{is.numeric}} are commonly used tests. } \examples{ is.what(pi) is.what(NA, verbose=TRUE) is.what(lm(1~1)) is.what(is.what) } \keyword{classes} \keyword{NA} \keyword{programming} \keyword{error} \keyword{utilities} gdata/man/case.Rd0000644000176200001440000000212214631624774013322 0ustar liggesusers\name{case} \alias{case} \title{Map elements of a vector according to the provided 'cases'} \description{ Map elements of a vector according to the provided 'cases'. This function is useful for mapping discrete values to factor labels and is the vector equivalent to the \code{switch} function. } \usage{ case(x, \dots, default = NA) } \arguments{ \item{x}{Vector to be converted} \item{\dots}{Map of alternatives, specified as "name"=value} \item{default}{Value to be assigned to elements of \code{x} not matching any of the alternatives. Defaults to \code{NA}.} } \details{ This function is to \code{switch} what \code{ifelse} is to \code{if}, and is a convenience wrapper for \code{factor}. } \value{ A factor variables with each element of \code{x} mapped into the corresponding level of specified in the mapping. } \author{Gregory R. Warnes \email{greg@warnes.net}} \seealso{\code{factor}, \code{switch}, \code{ifelse}} \examples{ ## default = NA case(c(1,1,4,3), "a"=1, "b"=2, "c"=3) ## default = "foo" case(c(1,1,4,3), "a"=1, "b"=2, "c"=3, default="foo") } \keyword{manip} gdata/man/Args.Rd0000644000176200001440000000161314631624774013307 0ustar liggesusers\name{Args} \alias{Args} \title{Describe Function Arguments} \description{ Display function argument names and corresponding default values, formatted in two columns for easy reading. } \usage{ Args(name, sort=FALSE) } \arguments{ \item{name}{a function or function name.} \item{sort}{whether arguments should be sorted.} } \value{ A data frame with named rows and a single column called \code{value}, containing the default value of each argument. } \note{ Primitive functions like \code{sum} and \code{all} have no formal arguments. See the \code{\link{formals}} help page. } \author{Arni Magnusson} \seealso{ \code{Args} is a verbose alternative to \code{\link{args}}, based on \code{\link{formals}}. \code{\link{help}} also describes function arguments. } \examples{ Args(glm) Args(scan) Args(legend, sort=TRUE) } \keyword{programming} \keyword{utilities} \keyword{documentation} gdata/man/combine.Rd0000644000176200001440000000336414631624774014034 0ustar liggesusers\name{combine} \alias{combine} \title{Combine R Objects With a Column Labeling the Source} \description{ Take a sequence of vector, matrix or data frames and combine into rows of a common data frame with an additional column \code{source} indicating the source object. } \usage{ combine(\dots, names=NULL) } \arguments{ \item{\dots}{vectors or matrices to combine.} \item{names}{character vector of names to use when creating source column.} } \details{ If there are several matrix arguments, they must all have the same number of columns. The number of columns in the result will be one larger than the number of columns in the component matrixes. If all of the arguments are vectors, these are treated as single column matrixes. In this case, the column containing the combineinated vector data is labeled \code{data}. When the arguments consist of a mix of matrices and vectors the number of columns of the result is determined by the number of columns of the matrix arguments. Vectors are considered row vectors and have their values recycled or subsetted (if necessary) to achieve this length. The \code{source} column is created as a factor with levels corresponding to the name of the object from which the each row was obtained. When the \code{names} argument is ommitted, the name of each object is obtained from the specified argument name in the call (if present) or from the name of the object. See below for examples. } \author{Gregory R. Warnes \email{greg@warnes.net}} \seealso{\code{\link{rbind}}, \code{\link{merge}}} \examples{ a <- matrix(rnorm(12),ncol=4,nrow=3) b <- 1:4 combine(a,b) combine(x=a,b) combine(x=a,y=b) combine(a,b,names=c("one","two")) c <- 1:6 combine(b,c) } \keyword{array} \keyword{manip} gdata/man/unknown.Rd0000644000176200001440000001252314631624774014114 0ustar liggesusers\name{unknownToNA} \alias{isUnknown} \alias{isUnknown.default} \alias{isUnknown.POSIXlt} \alias{isUnknown.list} \alias{isUnknown.data.frame} \alias{isUnknown.matrix} \alias{unknownToNA} \alias{unknownToNA.default} \alias{unknownToNA.factor} \alias{unknownToNA.list} \alias{unknownToNA.data.frame} \alias{NAToUnknown} \alias{NAToUnknown.default} \alias{NAToUnknown.factor} \alias{NAToUnknown.list} \alias{NAToUnknown.data.frame} \concept{missing} \title{Change unknown values to NA and vice versa} \description{ Unknown or missing values (\code{NA} in \R) can be represented in various ways (as 0, 999, etc.) in different programs. \code{isUnknown}, \code{unknownToNA}, and \code{NAToUnknown} can help to change unknown values to \code{NA} and vice versa. } \usage{ isUnknown(x, unknown=NA, \dots) unknownToNA(x, unknown, warning=FALSE, \dots) NAToUnknown(x, unknown, force=FALSE, call.=FALSE, \dots) } \arguments{ \item{x}{generic, object with unknown value(s)} \item{unknown}{generic, value used instead of \code{NA}} \item{warning}{logical, issue warning if \code{x} already has \code{NA}} \item{force}{logical, force to apply already existing value in \code{x}} \item{\dots}{arguments pased to other methods (as.character for POSIXlt in case of isUnknown)} \item{call.}{logical, look in \code{\link{warning}}} } \details{ This functions were written to handle different variants of \dQuote{other \code{NA}} like representations that are usually used in various external data sources. \code{unknownToNA} can help to change unknown values to \code{NA} for work in \R, while \code{NAToUnknown} is meant for the opposite and would usually be used prior to export of data from \R. \code{isUnknown} is a utility function for testing for unknown values. All functions are generic and the following classes were tested to work with latest version: \dQuote{integer}, \dQuote{numeric}, \dQuote{character}, \dQuote{factor}, \dQuote{Date}, \dQuote{POSIXct}, \dQuote{POSIXlt}, \dQuote{list}, \dQuote{data.frame} and \dQuote{matrix}. For others default method might work just fine. \code{unknownToNA} and \code{isUnknown} can cope with multiple values in \code{unknown}, but those should be given as a \dQuote{vector}. If not, coercing to vector is applied. Argument \code{unknown} can be feed also with \dQuote{list} in \dQuote{list} and \dQuote{data.frame} methods. If named \dQuote{list} or \dQuote{vector} is passed to argument \code{unknown} and \code{x} is also named, matching of names will occur. Recycling occurs in all \dQuote{list} and \dQuote{data.frame} methods, when \code{unknown} argument is not of the same length as \code{x} and \code{unknown} is not named. Argument \code{unknown} in \code{NAToUnknown} should hold value that is not already present in \code{x}. If it does, error is produced and one can bypass that with \code{force=TRUE}, but be warned that there is no way to distinguish values after this action. Use at your own risk! Anyway, warning is issued about new value in \code{x}. Additionally, caution should be taken when using \code{NAToUnknown} on factors as additional level (value of \code{unknown}) is introduced. Then, as expected, \code{unknownToNA} removes defined level in \code{unknown}. If \code{unknown="NA"}, then \code{"NA"} is removed from factor levels in \code{unknownToNA} due to consistency with conversions back and forth. Unknown representation in \code{unknown} should have the same class as \code{x} in \code{NAToUnknown}, except in factors, where \code{unknown} value is coerced to character anyway. Silent coercing is also applied, when \dQuote{integer} and \dQuote{numeric} are in question. Otherwise warning is issued and coercing is tried. If that fails, \R introduces \code{NA} and the goal of \code{NAToUnknown} is not reached. \code{NAToUnknown} accepts only single value in \code{unknown} if \code{x} is atomic, while \dQuote{list} and \dQuote{data.frame} methods accept also \dQuote{vector} and \dQuote{list}. \dQuote{list/data.frame} methods can work on many components/columns. To reduce the number of needed specifications in \code{unknown} argument, default unknown value can be specified with component ".default". This matches component/column ".default" as well as all other undefined components/columns! Look in examples. } \value{ \code{unknownToNA} and \code{NAToUnknown} return modified \code{x}. \code{isUnknown} returns logical values for object \code{x}. } \author{Gregor Gorjanc} \seealso{\code{\link{is.na}}} \examples{ xInt <- c(0, 1, 0, 5, 6, 7, 8, 9, NA) isUnknown(x=xInt, unknown=0) isUnknown(x=xInt, unknown=c(0, NA)) (xInt <- unknownToNA(x=xInt, unknown=0)) (xInt <- NAToUnknown(x=xInt, unknown=0)) xFac <- factor(c("0", 1, 2, 3, NA, "NA")) isUnknown(x=xFac, unknown=0) isUnknown(x=xFac, unknown=c(0, NA)) isUnknown(x=xFac, unknown=c(0, "NA")) isUnknown(x=xFac, unknown=c(0, "NA", NA)) (xFac <- unknownToNA(x=xFac, unknown="NA")) (xFac <- NAToUnknown(x=xFac, unknown="NA")) xList <- list(xFac=xFac, xInt=xInt) isUnknown(xList, unknown=c("NA", 0)) isUnknown(xList, unknown=list("NA", 0)) tmp <- c(0, "NA") names(tmp) <- c(".default", "xFac") isUnknown(xList, unknown=tmp) tmp <- list(.default=0, xFac="NA") isUnknown(xList, unknown=tmp) (xList <- unknownToNA(xList, unknown=tmp)) (xList <- NAToUnknown(xList, unknown=999)) } \keyword{manip} \keyword{NA} gdata/man/object_size.Rd0000644000176200001440000000724414631624774014721 0ustar liggesusers\name{object_size} \alias{object_size} \alias{c.object_sizes} \alias{as.object_sizes} \alias{is.object_sizes} \alias{format.object_sizes} \alias{print.object_sizes} \alias{object.size} \title{Report the Space Allocated for Objects} \description{ Provides an estimate of the memory that is being used to store \R objects. } \usage{ object_size(\dots) \method{is}{object_sizes}(x) \method{as}{object_sizes}(x) \method{c}{object_sizes}(\dots, recursive=FALSE) \method{format}{object_sizes}(x, humanReadable=getOption("humanReadable"), standard="IEC", units, digits=1, width=NULL, sep=" ", justify=c("right", "left"), \dots) \method{print}{object_sizes}(x, quote=FALSE, humanReadable=getOption("humanReadable"), standard="IEC", units, digits=1, width=NULL, sep=" ", justify=c("right", "left"), \dots) } \arguments{ \item{\dots}{\code{object_size}: \R objects; \code{print} and \code{format}: arguments to be passed to other methods.} \item{x}{output from \code{object_size}.} \item{quote}{whether or not the result should be printed with surrounding quotes.} \item{humanReadable}{whether to use the \dQuote{human readable} format.} \item{standard,units,digits,width,sep,justify}{passed to \code{\link{humanReadable}}.} \item{recursive}{passed to the \code{\link[base]{c}} method.} } \value{ A numeric vector class \code{c("object_sizes", "numeric")} containing estimated memory allocation attributable to the objects in bytes. } \details{ The base R package \code{utils} provides an \code{object.size} function that handles a single object. The \code{gdata} package provides a similar \code{object_size} function that handles multiple objects. Both the \code{utils} and \code{gdata} implementations store the object size in bytes, but offer a slightly different user interface for showing the object size in other formats. The \code{gdata} implementation offers human readable format similar to \code{ls}, \code{df} or \code{du} shell commands, by calling \code{humanReadable} directly, calling \code{print} with the argument \code{humanReadable=TRUE}, or by setting \code{options(humanReadable=TRUE)}. The 3.0.0 release of \code{gdata} renamed this function to \code{object_size}, allowing users to explicitly call the \code{gdata} implementation. This eliminates ambiguity and makes it less likely to get errors when running parts of an existing script without first loading the \code{gdata} package. The old \code{object.size} function name is now deprecated in the \code{gdata} package, pointing users to \code{object_size} and \code{utils::gdata} instead. } \seealso{ \code{\link[utils]{object.size}} in package 'utils' for the base R implementation, \code{\link{Memory-limits}} for the design limitations on object size, \code{\link{humanReadable}} for human readable format. } \examples{ object_size(letters) object_size(ls) # Find the 10 largest objects in the base package allObj <- sapply(ls("package:base"), function(x) object_size(get(x, envir=baseenv()))) (bigObj <- as.object_sizes(rev(sort(allObj))[1:10])) print(bigObj, humanReadable=TRUE) as.object_sizes(14567567) oldopt <- options(humanReadable=TRUE) (z <- object_size(letters, c(letters, letters), rep(letters, 100), rep(letters, 10000))) is.object_sizes(z) as.object_sizes(14567567) options(oldopt) # Comparison # gdata print(object_size(loadNamespace), humanReadable=TRUE) print(bigObj, humanReadable=TRUE) # utils print(utils::object.size(loadNamespace), units="auto") sapply(bigObj, utils:::format.object_size, units="auto") # ll ll("package:base")[order(-ll("package:base")$KB)[1:10],] } \keyword{utilities} gdata/man/upperTriangle.Rd0000644000176200001440000000425314631624774015237 0ustar liggesusers\name{upperTriangle} \alias{upperTriangle} \alias{upperTriangle<-} \alias{lowerTriangle} \alias{lowerTriangle<-} \title{Extract or replace the upper/lower triangular portion of a matrix} \description{ Extract or replace the upper/lower triangular portion of a matrix. } \usage{ upperTriangle(x, diag=FALSE, byrow=FALSE) upperTriangle(x, diag=FALSE, byrow=FALSE) <- value lowerTriangle(x, diag=FALSE, byrow=FALSE) lowerTriangle(x, diag=FALSE, byrow=FALSE) <- value } \arguments{ \item{x}{Matrix} \item{diag}{Logical. If \code{TRUE}, include the matrix diagonal.} \item{byrow}{Logical. If \code{FALSE}, return/replace elements in column-wise order. If \code{TRUE}, return/replace elements in row-wise order.} \item{value}{Either a single value or a vector of length equal to that of the current upper/lower triangular. Should be of a mode which can be coerced to that of \code{x}.} } \value{ \code{upperTriangle(x)} and \code{lowerTriangle(x)} return the upper or lower triangle of matrix x, respectively. The assignment forms replace the upper or lower triangular area of the matrix with the provided value(s). } \note{ By default, the elements are returned/replaced in R's default column-wise order. Thus \preformatted{lowerTriangle(x) <- upperTriangle(x)} will not yield a symmetric matrix. Instead use: \preformatted{lowerTriangle(x) <- upperTriangle(x, byrow=TRUE)} or equivalently: \preformatted{lowerTriangle(x, byrow=TRUE) <- upperTriangle(x)} } \author{Gregory R. Warnes \email{greg@warnes.net}} \seealso{ \code{\link[base]{diag}}, \code{\link[base]{lower.tri}}, \code{\link[base]{upper.tri}} } \examples{ x <- matrix(1:25, nrow=5, ncol=5) x upperTriangle(x) upperTriangle(x, diag=TRUE) upperTriangle(x, diag=TRUE, byrow=TRUE) lowerTriangle(x) lowerTriangle(x, diag=TRUE) lowerTriangle(x, diag=TRUE, byrow=TRUE) upperTriangle(x) <- NA x upperTriangle(x, diag=TRUE) <- 1:15 x lowerTriangle(x) <- NA x lowerTriangle(x, diag=TRUE) <- 1:15 x ## Copy lower triangle into upper triangle to make ## the matrix (diagonally) symmetric x <- matrix(LETTERS[1:25], nrow=5, ncol=5, byrow=TRUE) x lowerTriangle(x) = upperTriangle(x, byrow=TRUE) x } \keyword{array} gdata/man/ans.Rd0000644000176200001440000000160314631624774013173 0ustar liggesusers\name{ans} \alias{ans} \title{Value of Last Evaluated Expression} \usage{ ans() } \description{ The functon returns the value of the last evaluated \emph{top-level} expression, which is always assigned to \code{.Last.value} (in \code{package:base}). } \details{ This function retrieves \code{.Last.value}. For more details see \code{\link[base]{.Last.value}}. } \value{ \code{.Last.value} } \seealso{ \code{\link[base]{.Last.value}}, \code{\link[base]{eval}} } \author{Liviu Andronic} \examples{ 2+2 # Trivial calculation ans() # See the answer again gamma(1:15) # Some intensive calculation fac14 <- ans() # store the results into a variable rnorm(20) # Generate some standard normal values ans()^2 # Convert to Chi-square(1) values stem(ans()) # Now show a stem-and-leaf table } \keyword{programming} gdata/man/gdata-defunct.Rd0000644000176200001440000000126714631624774015126 0ustar liggesusers\name{gdata-defunct} \alias{aggregate.table} \title{Defunct Functions in Package 'gdata'} \description{ The functions or variables listed here are no longer part of 'gdata'. } \usage{ aggregate.table(x, by1, by2, FUN=mean, \dots) } \arguments{ \item{x}{data to be summarized.} \item{by1}{first grouping factor.} \item{by2}{second grouping factor.} \item{FUN}{a scalar function to compute the summary statistics which can be applied to all data subsets. Defaults to \code{mean}.} \item{\dots}{optional arguments for \code{FUN}.} } \details{ \code{aggregate.table(x, by1, by2, FUN=mean, \dots)} should be replaced by \code{tapply(X=x, INDEX=list(by1, by2), FUN=FUN, \dots)}. } gdata/man/humanReadable.Rd0000644000176200001440000001364414631624774015152 0ustar liggesusers\name{humanReadable} \alias{humanReadable} \title{Print Byte Size in Human Readable Format} \description{ Convert integer byte sizes to a human readable units such as kB, MB, GB, etc. } \usage{ humanReadable(x, units="auto", standard=c("IEC", "SI", "Unix"), digits=1, width=NULL, sep=" ", justify=c("right", "left")) } \arguments{ \item{x}{integer, byte size} \item{standard}{character, "IEC" for powers of 1024 ('MiB'), "SI" for powers of 1000 ('MB'), or "Unix" for powers of 1024 ('M'). See details.} \item{units}{character, unit to use for all values (optional), one of "auto", "bytes", or an appropriate unit corresponding to \code{standard}.} \item{digits}{integer, number of digits after decimal point} \item{width}{integer, width of number string} \item{sep}{character, separator between number and unit} \item{justify}{two-element vector specifiy the alignment for the number and unit components of the size. Each element should be one of "none", "left", "right", or "center"} } \details{ The basic unit used to store information in computers is a bit. Bits are represented as zeroes and ones - binary number system. Although, the binary number system is not the same as the decimal number system, decimal prefixes for binary multiples such as kilo and mega are often used. In the decimal system kilo represent 1000, which is close to \eqn{1024 = 2^{10}} in the binary system. This sometimes causes problems as it is not clear which powers (2 or 10) are used in a notation like 1 kB. To overcome this problem International Electrotechnical Commission (IEC) has provided the following solution to this problem: \tabular{lrcll}{ Name \tab System \tab Symbol \tab Size \tab Conversion \cr byte \tab binary \tab B \tab \eqn{2^3} \tab 8 bits \cr kilobyte \tab decimal \tab kB \tab \eqn{10^3} \tab 1000 bytes \cr kibibyte \tab binary \tab KiB \tab \eqn{2^{10}} \tab 1024 bytes \cr megabyte \tab decimal \tab MB \tab \eqn{(10^3)^2} \tab 1000 kilobytes\cr mebibyte \tab binary \tab MiB \tab \eqn{(2^{10})^2} \tab 1024 kibibytes\cr gigabyte \tab decimal \tab GB \tab \eqn{(10^3)^3} \tab 1000 megabytes\cr gibibyte \tab binary \tab GiB \tab \eqn{(2^{10})^3} \tab 1024 mebibytes\cr terabyte \tab decimal \tab TB \tab \eqn{(10^3)^4} \tab 1000 gigabytes\cr tebibyte \tab binary \tab TiB \tab \eqn{(2^{10})^4} \tab 1024 gibibytes\cr petabyte \tab decimal \tab PB \tab \eqn{(10^3)^5} \tab 1000 terabytes\cr pebibyte \tab binary \tab PiB \tab \eqn{(2^{10})^5} \tab 1024 tebibytes\cr exabyte \tab decimal \tab EB \tab \eqn{(10^3)^6} \tab 1000 petabytes\cr exbibyte \tab binary \tab EiB \tab \eqn{(2^{10})^6} \tab 1024 pebibytes\cr zettabyte \tab decimal \tab ZB \tab \eqn{(10^3)^7} \tab 1000 exabytes\cr zebibyte \tab binary \tab ZiB \tab \eqn{(2^{10})^7} \tab 1024 exbibytes\cr yottabyte \tab decimal \tab YB \tab \eqn{(10^3)^8} \tab 1000 zettabytes\cr yebibyte \tab binary \tab YiB \tab \eqn{(2^{10})^8} \tab 1024 zebibytes\cr } where Zi and Yi are GNU extensions to IEC. To get the output in the decimal system (powers of 1000) use \code{standard="SI"}. To obtain IEC standard (powers of 1024) use \code{standard="IEC"}. In addition, single-character units are provided that follow (and extend) the Unix pattern (use \code{standard="Unix"}): \tabular{lrcll}{ Name \tab System \tab Symbol \tab Size \tab Conversion \cr byte \tab binary \tab B \tab \eqn{2^3} \tab 8 bits \cr kibibyte \tab binary \tab K \tab \eqn{2^{10}} \tab 1024 bytes \cr mebibyte \tab binary \tab M \tab \eqn{(2^{10})^2} \tab 1024 kibibytes\cr gibibyte \tab binary \tab G \tab \eqn{(2^{10})^3} \tab 1024 mebibytes\cr tebibyte \tab binary \tab T \tab \eqn{(2^{10})^4} \tab 1024 gibibytes\cr pebibyte \tab binary \tab P \tab \eqn{(2^{10})^5} \tab 1024 tebibytes\cr exbibyte \tab binary \tab E \tab \eqn{(2^{10})^6} \tab 1024 pebibytes\cr zebibyte \tab binary \tab Z \tab \eqn{(2^{10})^7} \tab 1024 exbibytes\cr yottabyte \tab binary \tab Y \tab \eqn{(2^{10})^8} \tab 1024 zebibytes\cr } For printout both \code{digits} and \code{width} can be specified. If \code{width} is \code{NULL}, all values have given number of digits. If \code{width} is not \code{NULL}, output is rounded to a given width and formated similar to human readable format of the Unix \code{ls}, \code{df} or \code{du} shell commands. } \references{ Wikipedia: \url{https://en.wikipedia.org/wiki/Byte} \url{https://en.wikipedia.org/wiki/SI_prefix} \url{https://en.wikipedia.org/wiki/Binary_prefix} GNU manual for coreutils: \url{https://www.gnu.org/software/coreutils/manual/html_node/Block-size.html} } \value{ Byte size in human readable format as character with proper unit symbols added at the end of the string. } \author{Ales Korosec, Gregor Gorjanc, and Gregory R. Warnes \email{greg@warnes.net}} \seealso{ \code{\link{object.size}} in package 'gdata', \code{\link[utils]{object.size}} in package 'utils', \code{\link[gdata]{ll}} } \examples{ # Simple example: maximum addressible size of 32 bit pointer humanReadable(2^32-1) humanReadable(2^32-1, standard="IEC") humanReadable(2^32-1, standard="SI") humanReadable(2^32-1, standard="Unix") humanReadable(2^32-1, unit="MiB") humanReadable(2^32-1, standard="IEC", unit="MiB") humanReadable(2^32-1, standard="SI", unit="MB") humanReadable(2^32-1, standard="Unix", unit="M") # Vector of sizes matrix(humanReadable(c(60810, 124141, 124, 13412513), width=4)) matrix(humanReadable(c(60810, 124141, 124, 13412513), width=4, unit="KiB")) # Specify digits rather than width matrix(humanReadable(c(60810, 124141, 124, 13412513), width=NULL, digits=2)) # Change the justification matrix(humanReadable(c(60810, 124141, 124, 13412513), width=NULL, justify=c("right", "right"))) } \keyword{misc} gdata/man/ll.Rd0000644000176200001440000000410314631624774013017 0ustar liggesusers\name{ll} \alias{ll} \title{Describe Objects or Elements} \description{ Display name, class, size, and dimensions of each object in a given environment. Alternatively, if the main argument is an object, its elements are listed and described. } \usage{ ll(pos=1, unit="KB", digits=0, dim=FALSE, sort=FALSE, class=NULL, invert=FALSE, \dots) } \arguments{ \item{pos}{environment position number, environment name, data frame, list, model, S4 object, or any object that \code{is.list}.} \item{unit}{unit for displaying object size: "B", "KB", "MB", "GB", or first letter (case-insensitive).} \item{digits}{number of decimals to display when rounding object size.} \item{dim}{whether object dimensions should be returned.} \item{sort}{whether elements should be sorted by name.} \item{class}{character vector for limiting the output to specified classes.} \item{invert}{whether to invert the \code{class} filter, so specified classes are excluded.} \item{\dots}{passed to \code{ls}.} } \value{ A data frame with named rows and the following columns: \item{Class}{object class.} \item{KB}{object size \emph{(see note)}.} \item{Dim}{object dimensions \emph{(optional)}.} } \note{The name of the object size column is the same as the unit used.} \author{Arni Magnusson, with contributions by Jim Rogers and Michael Chirico.} \seealso{ \code{ll} is a verbose alternative to \code{\link{ls}} (objects in an environment), \code{\link{names}} (elements in a list-like object), and \code{\link{slotNames}} (S4 object). \code{\link{str}} and \code{\link{summary}} also describe elements in a list-like objects. \code{\link{env}} is a related function that describes all loaded environments. } \examples{ ll() ll(all=TRUE) ll("package:base") ll("package:base", class="function", invert=TRUE) ll(infert) model <- glm(case~spontaneous+induced, family=binomial, data=infert) ll(model, dim=TRUE) ll(model, sort=TRUE) ll(model$family) } \keyword{data} \keyword{attribute} \keyword{classes} \keyword{list} \keyword{environment} \keyword{print} \keyword{utilities} gdata/man/ConvertMedUnits.Rd0000644000176200001440000000423514631624774015507 0ustar liggesusers\name{ConvertMedUnits} \alias{ConvertMedUnits} \title{Convert medical measurements between International Standard (SI) and US 'Conventional' Units.} \description{ Convert Medical measurements between International Standard (SI) and US 'Conventional' Units. } \usage{ ConvertMedUnits(x, measurement, abbreviation, to = c("Conventional", "SI", "US"), exact = !missing(abbreviation)) } \arguments{ \item{x}{Vector of measurement values} \item{measurement}{Name of the measurement} \item{abbreviation}{Measurement abbreviation} \item{to}{Target units} \item{exact}{Logicial indicating whether matching should be exact} } \details{ Medical laboratories and practitioners in the United States use one set of units (the so-called 'Conventional' units) for reporting the results of clinical laboratory measurements, while the rest of the world uses the International Standard (SI) units. It often becomes necessary to translate between these units when participating in international collaborations. This function converts between SI and US 'Conventional' units. If \code{exact=FALSE}, \code{grep} will be used to do a case-insensitive sub-string search for matching measurement names. If more than one match is found, an error will be generated, along with a list of the matching entries. } \value{ Returns a vector of converted values. The attribute 'units' will contain the target units converted. } \seealso{ The data set \code{\link{MedUnits}} provides the conversion factors. } \references{ \url{https://globalrph.com/medical/conventional-units-international-units/} } \author{Gregory R. Warnes \email{greg@warnes.net}} \examples{ data(MedUnits) # Show available conversions MedUnits$Measurement # Convert SI Glucose measurement to 'Conventional' units GlucoseSI <- c(5, 5.4, 5, 5.1, 5.6, 5.1, 4.9, 5.2, 5.5) # in SI Units GlucoseUS <- ConvertMedUnits(GlucoseSI, "Glucose", to="US") cbind(GlucoseSI, GlucoseUS) \dontrun{ # See what happens when there is more than one match ConvertMedUnits(27.5, "Creatin", to="US") } # To solve the problem do: ConvertMedUnits(27.5, "Creatinine", to="US", exact=TRUE) } \keyword{manip} gdata/man/startsWith.Rd0000644000176200001440000000403514631624774014570 0ustar liggesusers\name{startsWith} \alias{startsWith} \alias{starts_with} \title{Does String Start or End With Another String?} \description{ Determines if entries of \code{x} start with a string \code{prefix}, where strings are recycled to common lengths. } \usage{ startsWith(x, prefix, trim=FALSE, ignore.case=FALSE) } \arguments{ \item{x}{character vector whose \dQuote{starts} are considered.} \item{prefix}{character vector, typicall of length one, i.e., a string.} \item{trim}{whether leading and trailing spaces should be removed from \code{x} before testing for a match.} \item{ignore.case}{whether case should be ignored when testing for a match.} } \value{ A logical vector, of \dQuote{common length} of \code{x} and \code{prefix}, i.e., of the longer of the two lengths unless one of them is zero when the result is also of zero length. A shorter input is recycled to the output length. } \note{ The \code{base} package provides the underlying \code{startsWith} function that performs the string comparison. The \code{gdata} package adds the \code{trim} and \code{ignore.case} features. An alias function \code{starts_with} is also provided, equivalent to \code{gdata::startsWith}. Using \code{starts_with} in scripts makes it explicitly clear that the \code{gdata} implementation is being used. } \author{ Gregory R. Warnes \email{greg@warnes.net} } \seealso{ \code{\link[base]{startsWith}} for the 'base' package implementation, \code{\link[base]{grepl}}, \code{\link{substring}} } \examples{ ## Simple example startsWith("Testing", "Test") ## Vector examples s <- c("Testing", " Testing", "testing", "Texting") names(s) <- s startsWith(s, "Test") # " Testing", "testing", and "Texting" do not match startsWith(s, "Test", trim=TRUE) # Now " Testing" matches startsWith(s, "Test", ignore.case=TRUE) # Now "testing" matches # Comparison # gdata startsWith(s, "Test", trim=TRUE) startsWith(s, "Test", ignore.case=TRUE) # base startsWith(trimws(s), "Test") startsWith(tolower(s), tolower("Test")) } \keyword{character} gdata/man/centerText.Rd0000644000176200001440000000211414631624774014535 0ustar liggesusers\name{centerText} \alias{centerText} \title{ Center Text Strings } \description{ Function to center text strings for display on the text console by prepending the necessary number of spaces to each element. } \usage{ centerText(x, width = getOption("width")) } \arguments{ \item{x}{Character vector containing text strings to be centered.} \item{width}{Desired display width. Defaults to the R display width given by \code{getOption("width")}.} } \details{ Each element will be centered individually by prepending the necessary number of spaces to center the text in the specified display width assuming a fixed width font. } \value{ Vector of character strings. } \author{ Gregory R. Warnes \email{greg@warnes.net} } \seealso{ \code{\link[base]{strwrap}} } \examples{ cat(centerText("One Line Test"), "\n\n") mText <-c("This", "is an example", " of a multiline text ", "with ", " leading", " and trailing ", "spaces.") cat("\n", centerText(mText), "\n", sep="\n") } \keyword{manip} \keyword{character} gdata/man/resample.Rd0000644000176200001440000000242714631624774014227 0ustar liggesusers\name{resample} \alias{resample} \title{Consistent Random Samples and Permutations} \description{ Take a sample of the specified size from the elements of \code{x} using either with or without replacement. } \usage{ resample(x, size, replace = FALSE, prob = NULL) } \arguments{ \item{x}{A numeric, complex, character or logical vector from which to choose.} \item{size}{Non-negative integer giving the number of items to choose.} \item{replace}{Should sampling be with replacement?} \item{prob}{A vector of probability weights for obtaining the elements of the vector being sampled.} } \details{ \code{resample} differs from the S/R \code{sample} function in \code{resample} always considers \code{x} to be a vector of elements to select from, while \code{sample} treats a vector of length one as a special case and samples from \code{1:x}. Otherwise, the functions have identical behavior. } \value{ Vector of the same length as the input, with the elements permuted. } \author{Gregory R. Warnes \email{greg@warnes.net}} \seealso{\code{\link{sample}}} \examples{ ## Sample behavior differs if first argument is scalar vs vector sample(c(10)) sample(c(10, 10)) ## Resample has the consistent behavior for both cases resample(c(10)) resample(c(10, 10)) } \keyword{misc} gdata/man/frameApply.Rd0000644000176200001440000000742414631624774014521 0ustar liggesusers\name{frameApply} \alias{frameApply} \title{Subset analysis on data frames} \description{Apply a function to row subsets of a data frame.} \usage{ frameApply(x, by=NULL, on=by[1], fun=function(xi) c(Count=nrow(xi)), subset=TRUE, simplify=TRUE, byvar.sep="\\\\$\\\\@\\\\$", \dots) } \arguments{ \item{x}{a data frame} \item{by}{names of columns in \code{x} specifying the variables to use to form the subgroups. None of the \code{by} variables should have the name "sep" (you will get an error if one of them does; a bit of laziness in the code). Unused levels of the \code{by} variables will be dropped. Use \code{by = NULL} (the default) to indicate that all of the data is to be treated as a single (trivial) subgroup.} \item{on}{names of columns in \code{x} specifying columns over which \code{fun} is to be applied. These can include columns specified in \code{by}, (as with the default) although that is not usually the case.} \item{fun}{a function that can operate on data frames that are row subsets of \code{x[on]}. If \code{simplify = TRUE}, the return value of the function should always be either a try-error (see \code{\link{try}}), or a vector of fixed length (i.e. same length for every subset), preferably with named elements.} \item{subset}{logical vector (can be specified in terms of variables in data). This row subset of \code{x} is taken before doing anything else.} \item{simplify}{logical. If TRUE (the default), return value will be a data frame including the \code{by} columns and a column for each element of the return vector of \code{fun}. If FALSE, the return value will be a list, sometimes necessary for less structured output (see description of return value below).} \item{byvar.sep}{character. This can be any character string not found anywhere in the values of the \code{by} variables. The \code{by} variables will be pasted together using this as the separator, and the result will be used as the index to form the subgroups.} \item{\dots}{additional arguments to \code{fun}.} } \value{ A data frame if \code{simplify = TRUE} (the default), assuming there is sufficiently structured output from \code{fun}. If \code{simplify = FALSE} and \code{by} is not NULL, the return value will be a list with two elements. The first element, named "by", will be a data frame with the unique rows of \code{x[by]}, and the second element, named "result" will be a list where the ith component gives the result for the ith row of the "by" element. } \details{ This function accomplishes something similar to \code{\link{by}}. The main difference is that \code{frameApply} is designed to return data frames and lists instead of objects of class 'by'. Also, \code{frameApply} works only on the unique combinations of the \code{by} that are actually present in the data, not on the entire cartesian product of the \code{by} variables. In some cases this results in great gains in efficiency, although \code{frameApply} is hardly an efficient function. } \examples{ data(ELISA, package="gtools") # Default is slightly unintuitive, but commonly useful: frameApply(ELISA, by = c("PlateDay", "Read")) # Wouldn't actually recommend this model! Just a demo: frameApply(ELISA, on = c("Signal", "Concentration"), by = c("PlateDay", "Read"), fun = function(dat) coef(lm(Signal ~ Concentration, data = dat))) frameApply(ELISA, on = "Signal", by = "Concentration", fun = function(dat) { x <- dat[[1]] out <- c(Mean = mean(x, na.rm=TRUE), SD = sd(x, na.rm=TRUE), N = sum(x, na.rm=TRUE))}, subset = !is.na(Concentration)) } \author{Jim Rogers \email{james.a.rogers@pfizer.com}} \keyword{manip} gdata/man/mapLevels.Rd0000644000176200001440000001544214631624774014350 0ustar liggesusers\name{mapLevels} \alias{mapLevels} \alias{mapLevels.default} \alias{mapLevels.factor} \alias{mapLevels.character} \alias{mapLevels.list} \alias{mapLevels.data.frame} \alias{print.levelsMap} \alias{print.listLevelsMap} \alias{is.levelsMap} \alias{is.listLevelsMap} \alias{as.levelsMap} \alias{as.listLevelsMap} \alias{.checkLevelsMap} \alias{.checkListLevelsMap} \alias{"[.levelsMap"} \alias{"[.listLevelsMap"} \alias{c.levelsMap} \alias{c.listLevelsMap} \alias{unique.levelsMap} \alias{sort.levelsMap} \alias{mapLevels<-} \alias{mapLevels<-.default} \alias{mapLevels<-.factor} \alias{mapLevels<-.character} \alias{mapLevels<-.list} \alias{mapLevels<-.data.frame} \title{Mapping levels} \description{ \code{mapLevels} produces a map with information on levels and/or internal integer codes. As such can be conveniently used to store level mapping when one needs to work with internal codes of a factor and later transfrorm back to factor or when working with several factors that should have the same levels and therefore the same internal coding. } \usage{ mapLevels(x, codes=TRUE, sort=TRUE, drop=FALSE, combine=FALSE, \dots) mapLevels(x) <- value } \arguments{ \item{x}{object whose levels will be mapped, look into details} \item{codes}{boolean, create integer levelsMap (with internal codes) or character levelsMap (with level names)} \item{sort}{boolean, sort levels of character \code{x}, look into details} \item{drop}{boolean, drop unused levels} \item{combine}{boolean, combine levels, look into details} \item{\dots}{additional arguments for \code{sort}} \item{value}{levelsMap or listLevelsMap, output of \code{mapLevels} methods or constructed by user, look into details} } \section{mapLevels}{ The \code{mapLevels} function was written primarly for work with \dQuote{factors}, but is generic and can also be used with \dQuote{character}, \dQuote{list} and \dQuote{data.frame}, while \dQuote{default} method produces error. Here the term levels is also used for unique character values. When \code{codes=TRUE} \bold{integer \dQuote{levelsMap}} with information on mapping internal codes with levels is produced. Output can be used to transform integer to factor or remap factor levels as described below. With \code{codes=FALSE} \bold{character \dQuote{levelsMap}} is produced. The later is usefull, when one would like to remap factors or combine factors with some overlap in levels as described in \code{mapLevels<-} section and shown in examples. \code{sort} argument provides possibility to sort levels of \dQuote{character} \code{x} and has no effect when \code{x} is a \dQuote{factor}. Argument \code{combine} has effect only in \dQuote{list} and \dQuote{data.frame} methods and when \code{codes=FALSE} i.e. with \bold{character \dQuote{levelsMaps}}. The later condition is necesarry as it is not possible to combine maps with different mapping of level names and integer codes. It is assumed that passed \dQuote{list} and \dQuote{data.frame} have all components for which methods exist. Otherwise an error is produced. } \section{levelsMap and listLevelsMap}{ Function \code{mapLevels} returns a map of levels. This map is of class \dQuote{levelsMap}, which is actually a list of length equal to number of levels and with each component of length 1. Components need not be of length 1. There can be either integer or character \dQuote{levelsMap}. \bold{Integer \dQuote{levelsMap}} (when \code{codes=TRUE}) has names equal to levels and components equal to internal codes. \bold{Character \dQuote{levelsMap}} (when \code{codes=FALSE}) has names and components equal to levels. When \code{mapLevels} is applied to \dQuote{list} or \dQuote{data.frame}, result is of class \dQuote{listLevelsMap}, which is a list of \dQuote{levelsMap} components described previously. If \code{combine=TRUE}, result is a \dQuote{levelsMap} with all levels in \code{x} components. For ease of inspection, print methods unlists \dQuote{levelsMap} with proper names. \code{mapLevels<-} methods are fairly general and therefore additional convenience methods are implemented to ease the work with maps: \code{is.levelsMap} and \code{is.listLevelsMap}; \code{as.levelsMap} and \code{as.listLevelsMap} for coercion of user defined maps; generic \code{"["} and \code{c} for both classes (argument \code{recursive} can be used in \code{c} to coerce \dQuote{listLevelsMap} to \dQuote{levelsMap}) and generic \code{unique} and \code{sort} (generic from \R 2.4) for \dQuote{levelsMap}. } \section{mapLevels<-}{ Workhorse under \code{mapLevels<-} methods is \code{\link{levels<-}}. \code{mapLevels<-} just control the assignment of \dQuote{levelsMap} (integer or character) or \dQuote{listLevelsMap} to \code{x}. The idea is that map values are changed to map names as indicated in \code{\link{levels}} examples. \bold{Integer \dQuote{levelsMap}} can be applied to \dQuote{integer} or \dQuote{factor}, while \bold{character \dQuote{levelsMap}} can be applied to \dQuote{character} or \dQuote{factor}. Methods for \dQuote{list} and \dQuote{data.frame} can work only on mentioned atomic components/columns and can accept either \dQuote{levelsMap} or \dQuote{listLevelsMap}. Recycling occurs, if length of \code{value} is not the same as number of components/columns of a \dQuote{list/data.frame}. } \value{ \code{mapLevels()} returns \dQuote{levelsMap} or \dQuote{listLevelsMap} objects as described in levelsMap and listLevelsMap section. Result of \code{mapLevels<-} is always a factor with remapped levels or a \dQuote{list/data.frame} with remapped factors. } \author{Gregor Gorjanc} \seealso{ \code{\link{factor}}, \code{\link{levels}} and \code{\link{unclass}} } \examples{ ## Integer levelsMap (f <- factor(sample(letters, size=20, replace=TRUE))) (mapInt <- mapLevels(f)) ## Integer to factor (int <- as.integer(f)) (mapLevels(int) <- mapInt) all.equal(int, f) ## Remap levels of a factor (fac <- factor(as.integer(f))) (mapLevels(fac) <- mapInt) # the same as levels(fac) <- mapInt all.equal(fac, f) ## Character levelsMap f1 <- factor(letters[1:10]) f2 <- factor(letters[5:14]) ## Internal codes are the same, but levels are not as.integer(f1) as.integer(f2) ## Get character levelsMaps and combine them mapCha1 <- mapLevels(f1, codes=FALSE) mapCha2 <- mapLevels(f2, codes=FALSE) (mapCha <- c(mapCha1, mapCha2)) ## Remap factors mapLevels(f1) <- mapCha # the same as levels(f1) <- mapCha mapLevels(f2) <- mapCha # the same as levels(f2) <- mapCha ## Internal codes are now "consistent" among factors as.integer(f1) as.integer(f2) ## Remap characters to get factors f1 <- as.character(f1); f2 <- as.character(f2) mapLevels(f1) <- mapCha mapLevels(f2) <- mapCha ## Internal codes are now "consistent" among factors as.integer(f1) as.integer(f2) } \keyword{misc} \keyword{manip} gdata/man/left.Rd0000644000176200001440000000345314631624774013351 0ustar liggesusers\name{left} \alias{right} \alias{left} \alias{right.data.frame} \alias{left.data.frame} \alias{right.matrix} \alias{left.matrix} \title{Return the leftmost or rightmost columns of a matrix or data frame} \description{ Return the leftmost or rightmost or columns of a matrix or data frame } \usage{ right(x, n = 6L, \dots) left(x, n=6L, \dots) \method{right}{matrix}(x, n=6L, add.col.nums=TRUE, \dots) \method{left}{matrix}(x, n=6L, add.col.nums=TRUE, \dots) \method{right}{data.frame}(x, n=6L, add.col.nums=TRUE, \dots) \method{left}{data.frame}(x, n=6L, add.col.nums=TRUE, \dots) } \arguments{ \item{x}{Matrix or data frame} \item{n}{If positive, number of columns to return. If negative, number of columns to omit. See examples.} \item{add.col.nums}{Logical. If no column names are present, add names giving original column number. (See example below.)} \item{\dots}{Additional arguments used by methods} } \value{ An object consisting of the leftmost or rightmost \code{n} columns of \code{x}. } \author{ Gregory R. Warnes \email{greg@warnes.net} } \seealso{ \code{\link{first}}, \code{\link{last}}, \code{\link[utils]{head}}, \code{\link[utils]{tail}} } \examples{ m <- matrix(1:100, ncol=10) colnames(m) <- paste("Col",1:10, sep="_") left(m) right(m) # When no column names are present, they are added by default colnames(m) <- NULL left(m) colnames(left(m)) right(m) colnames(right(m)) # Prevent addition of column numbers left(m, add.col.nums = FALSE) colnames(left(m, add.col.nums = FALSE)) right(m, add.col.nums = FALSE) # columns are labeled 1:6 colnames(right(m, add.col.nums = FALSE)) # instead of 5:10 # Works for data frames too! d <- data.frame(m) left(d) right(d) # Use negative n to specify number of columns to omit left(d, -3) right(d, -3) } \keyword{manip} gdata/man/unmatrix.Rd0000644000176200001440000000171714631624774014267 0ustar liggesusers\name{unmatrix} \alias{unmatrix} \title{Convert a matrix into a vector, with appropriate names} \description{ Convert a matrix into a vector, with element names constructed from the row and column names of the matrix. } \usage{ unmatrix(x, byrow=FALSE) } \arguments{ \item{x}{matrix} \item{byrow}{Logical. If \code{FALSE}, the elements within columns will be adjacent in the resulting vector, otherwise elements within rows will be adjacent.} } \value{ A vector with names constructed from the row and column names from the matrix. If the row or column names are missing, ('r1', 'r2', \ldots,) or ('c1', 'c2', \ldots) will be used as appropriate. } \author{Gregory R. Warnes \email{greg@warnes.net}} \seealso{\code{\link[base]{as.vector}}} \examples{ # Simple example m <- matrix(letters[1:10], ncol=5) m unmatrix(m) # Unroll model output x <- rnorm(100) y <- rnorm(100, mean=3+5*x, sd=0.25) m <- coef(summary(lm(y ~ x))) unmatrix(m) } \keyword{manip} gdata/man/trimSum.Rd0000644000176200001440000000173414631624774014057 0ustar liggesusers\name{trimSum} \alias{trimSum} \title{Trim a vector such that the last/first value represents the sum of trimmed values} \description{ Trim (shorten) a vector in such a way that the last or first value represents the sum of trimmed values. User needs to specify the desired length of a trimmed vector. } \usage{trimSum(x, n, right=TRUE, na.rm=FALSE, \dots)} \arguments{ \item{x}{numeric, a vector of numeric values} \item{n}{numeric, desired length of the output} \item{right}{logical, trim on the right/bottom or the left/top side} \item{na.rm}{logical, remove \code{NA} values when applying a function} \item{\dots}{arguments passed to other methods - currently not used} } \value{ Trimmed vector with a last/first value representing the sum of trimmed values } \author{Gregor Gorjanc} \seealso{\code{\link[gdata]{trim}}} \examples{ x <- 1:10 trimSum(x, n=5) trimSum(x, n=5, right=FALSE) x[9] <- NA trimSum(x, n=5) trimSum(x, n=5, na.rm=TRUE) } \keyword{manip} gdata/man/update.list.Rd0000644000176200001440000000531114631624774014646 0ustar liggesusers\name{update.list} \alias{update.list} \alias{update.data.frame} \title{Update the elements of a list, or rows of a data frame} \description{ For a list, update the elements of a list to contain all of the named elements of a new list, overwriting elements with the same name, and (optionally) copying unnamed elements. For a data frame, replace the rows of a data frame by corresponding rows in 'new' with the same value for 'by'. } \usage{ \method{update}{list}(object, new, unnamed=FALSE, \dots) \method{update}{data.frame}(object, new, by, by.x=by, by.y=by, append=TRUE, verbose=FALSE, \dots) } \arguments{ \item{object}{List or data frame to be updated.} \item{new}{List or data frame containing new elements/rows.} \item{unnamed}{Logical. If \code{TRUE}, unnamed list elements of \code{new} will be appended to \code{object}.} \item{by, by.x, by.y}{Character. Name of column to use for matching data frame rows.} \item{append}{Logical. If \code{TRUE}, items in \code{new} with no match in \code{object} will be appended to the data frame.} \item{verbose}{Logical. If \code{TRUE} progress messages will be displayed.} \item{\dots}{optional method arguments (ignored).} } \note{ These methods can be called directly or as via the S3 base method for \code{update}. } \value{ \item{update.list}{a list a constructed from the elements of \code{object}, with named elements of \code{new} replacing corresponding named elements from \code{object}, and non-corresponding elements of \code{new} appended. If \code{unnamed=TRUE}, unnamed elements of \code{new} will be appended.} \item{update.data.frame}{a data frame constructed from the rows of \code{object} with rows where values in \code{by.x} equal the values in \code{by.y} replaced by the corresponding row in \code{new}. If \code{append=TRUE}, any elements of \code{new} without no matching rows in \code{object} will be appended.} } \author{Gregory R. Warnes \email{greg@warnes.net}} \seealso{ \code{\link[stats]{update}}, \code{\link[base]{merge}} } \examples{ # Update list old <- list(a=1,b="red",c=1.37) new <- list(b="green",c=2.4) update(old, new) update.list(old,new) # equivalent older <- list(a=0, b="orange", 4, 5, 6) newer <- list(b="purple", 7, 8, 9) update(older, newer) # ignores unnamed elements of newer update(older, newer, unnamed=TRUE) # appends unnamed elements of newer # Update data frame old <- data.frame(letter=letters[1:5], number=1:5) new <- data.frame(letter=letters[c(5, 1, 7)], number=c(-5, -1, -7)) update(old, new, by="letter") # default is append=TRUE update(old, new, by="letter", append=FALSE) update(old, new, by="letter", verbose=FALSE) } \keyword{data} \keyword{manip} gdata/man/interleave.Rd0000644000176200001440000000414114631624774014550 0ustar liggesusers\name{interleave} \alias{interleave} \title{Interleave Rows of Data Frames or Matrices} \description{ Interleave rows of data frames or matrices. } \usage{ interleave(\dots, append.source=TRUE, sep=": ", drop=FALSE) } \arguments{ \item{\dots}{objects to be interleaved.} \item{append.source}{boolean flag. When \code{TRUE} (the default) the argument name will be appended to the row names to show the source of each row.} \item{sep}{separator between the original row name and the object name.} \item{drop}{boolean flag - when TRUE, matrices containing one column will be converted to vectors.} } \details{ This function creates a new matrix or data frame from its arguments. The new object will have all of the rows from the source objects interleaved. Starting with row 1 of object 1, followed by row 1 of object 2, \ldots, row 1 of object 'n', row 2 of object 1, row 2 of object 2, \ldots, row 2 of object 'n', etc. } \value{ Matrix containing the interleaved rows of the function arguments. } \author{Gregory R. Warnes \email{greg@warnes.net}} \seealso{\code{\link{cbind}}, \code{\link{rbind}}, \code{\link{combine}}} \examples{ # Simple example a <- matrix(1:10,ncol=2,byrow=TRUE) b <- matrix(letters[1:10],ncol=2,byrow=TRUE) c <- matrix(LETTERS[1:10],ncol=2,byrow=TRUE) interleave(a,b,c) # Create a 2-way table of means, standard errors, and nobs g1 <- sample(letters[1:5], 1000, replace=TRUE) g2 <- sample(LETTERS[1:3], 1000, replace=TRUE) dat <- rnorm(1000) stderr <- function(x) sqrt(var(x,na.rm=TRUE) / nobs(x)) means <- tapply(dat, list(g1, g2), mean) stderrs <- tapply(dat, list(g1, g2), stderr) ns <- tapply(dat, list(g1, g2), nobs) blanks <- matrix(" ", nrow=5, ncol=3) tab <- interleave("Mean"=round(means,2), "Std Err"=round(stderrs,2), "N"=ns, " "=blanks, sep=" ") print(tab, quote=FALSE) # Using drop to control coercion to a lower dimensions m1 <- matrix(1:4) m2 <- matrix(5:8) interleave(m1, m2, drop=TRUE) # this will be coerced to a vector interleave(m1, m2, drop=FALSE) # this will remain a matrix } \keyword{category} \keyword{array} gdata/man/matchcols.Rd0000644000176200001440000000517614631624774014400 0ustar liggesusers\name{matchcols} \alias{matchcols} \title{Select columns names matching certain critera} \description{ This function allows easy selection of the column names of an object using a set of inclusion and exclusion critera. } \usage{ matchcols(object, with, without, method=c("and","or"), \dots) } \arguments{ \item{object}{Matrix or data frame} \item{with, without}{Vector of regular expression patterns} \item{method}{One of "and" or "or"} \item{\dots}{Optional arguments to \code{grep}} } \value{ Vector of column names which match all (\code{method="and"}) or any (\code{method="or"}) of the patterns specified in \code{with}, but none of the patterns specified in \code{without}. } \author{Gregory R. Warnes \email{greg@warnes.net}} \seealso{\code{\link[base]{grep}}} \examples{ # Create a matrix with many named columns x <- matrix(ncol=30, nrow=5) colnames(x) <- c("AffyID","Overall Group Means: Control", "Overall Group Means: Moderate", "Overall Group Means: Marked", "Overall Group Means: Severe", "Overall Group StdDev: Control", "Overall Group StdDev: Moderate", "Overall Group StdDev: Marked", "Overall Group StdDev: Severe", "Overall Group CV: Control", "Overall Group CV: Moderate", "Overall Group CV: Marked", "Overall Group CV: Severe", "Overall Model P-value", "Overall Model: (Intercept): Estimate", "Overall Model: Moderate: Estimate", "Overall Model: Marked: Estimate", "Overall Model: Severe: Estimate", "Overall Model: (Intercept): Std. Error", "Overall Model: Moderate: Std. Error", "Overall Model: Marked: Std. Error", "Overall Model: Severe: Std. Error", "Overall Model: (Intercept): t value", "Overall Model: Moderate: t value", "Overall Model: Marked: t value", "Overall Model: Severe: t value", "Overall Model: (Intercept): Pr(>|t|)", "Overall Model: Moderate: Pr(>|t|)", "Overall Model: Marked: Pr(>|t|)", "Overall Model: Severe: Pr(>|t|)") # Get the columns which give estimates or p-values # only for marked and severe groups matchcols(x, with=c("Pr", "Std. Error"), without=c("Intercept","Moderate"), method="or") # Get just the column which give the p-value for the intercept matchcols(x, with=c("Intercept", "Pr")) } \keyword{manip} gdata/man/bindData.Rd0000644000176200001440000000453214631624774014124 0ustar liggesusers\name{bindData} \alias{bindData} \title{Bind two data frames into a multivariate data frame} \description{ Usually data frames represent one set of variables and one needs to bind/join them for multivariate analysis. When \code{\link{merge}} is not the approriate solution, \code{bindData} might perform an appropriate binding for two data frames. This is especially usefull when some variables are measured once, while others are repeated. } \usage{ bindData(x, y, common) } \arguments{ \item{x}{data.frame} \item{y}{data.frame} \item{common}{character, list of column names that are common to both input data frames} } \details{ Data frames are joined in a such a way, that the new data frame has \eqn{c + (n_1 - c) + (n_2 - c)} columns, where \eqn{c} is the number of common columns, and \eqn{n_1} and \eqn{n_2} are the number of columns in the first and in the second data frame, respectively. } \value{ A data frame. } \author{Gregor Gorjanc} \seealso{ \code{\link[base]{merge}}, \code{\link{wideByFactor}} } \examples{ n1 <- 6 n2 <- 12 n3 <- 4 ## Single trait 1 num <- c(5:n1, 10:13) (tmp1 <- data.frame(y1=rnorm(n=n1), f1=factor(rep(c("A", "B"), n1/2)), ch=letters[num], fa=factor(letters[num]), nu=(num) + 0.5, id=factor(num), stringsAsFactors=FALSE)) ## Single trait 2 with repeated records, some subjects also in tmp1 num <- 4:9 (tmp2 <- data.frame(y2=rnorm(n=n2), f2=factor(rep(c("C", "D"), n2/2)), ch=letters[rep(num, times=2)], fa=factor(letters[rep(c(num), times=2)]), nu=c((num) + 0.5, (num) + 0.25), id=factor(rep(num, times=2)), stringsAsFactors=FALSE)) ## Single trait 3 with completely distinct set of subjects num <- 1:4 (tmp3 <- data.frame(y3=rnorm(n=n3), f3=factor(rep(c("E", "F"), n3/2)), ch=letters[num], fa=factor(letters[num]), nu=(num) + 0.5, id=factor(num), stringsAsFactors=FALSE)) ## Combine all datasets (tmp12 <- bindData(x=tmp1, y=tmp2, common=c("id", "nu", "ch", "fa"))) (tmp123 <- bindData(x=tmp12, y=tmp3, common=c("id", "nu", "ch", "fa"))) ## Sort by subject tmp123[order(tmp123$ch), ] } \keyword{manip} \keyword{misc} gdata/man/MedUnits.Rd0000644000176200001440000000410414631624774014141 0ustar liggesusers\name{MedUnits} \alias{MedUnits} \docType{data} \title{ Table of conversions between Intertional Standard (SI) and US 'Conventional' Units for common medical measurements. } \description{ Table of conversions between Intertional Standard (SI) and US 'Conventional' Units for common medical measurements. } \usage{data(MedUnits)} \format{ A data frame with the following 5 variables. \describe{ \item{Abbreviation}{Common Abbreviation (mostly missing)} \item{Measurement}{Measurement Name} \item{ConventionalUnit}{Conventional Unit} \item{Conversion}{Conversion factor} \item{SIUnit}{SI Unit} } } \details{ Medical laboratories and practitioners in the United States use one set of units (the so-called 'Conventional' units) for reporting the results of clinical laboratory measurements, while the rest of the world uses the International Standard (SI) units. It often becomes necessary to translate between these units when participating in international collaborations. This data set provides constants for converting between SI and US 'Conventional' units. To perform the conversion from SI units to US 'Conventional' units do: Measurement in \code{ConventionalUnit} = (Measurement in \code{SIUnit}) / \code{Conversion} To perform conversion from 'Conventional' to SI units do: Measurement in \code{SIUnit} = (Measurement in \code{ConventionalUnit}) * \code{Conversion} } \source{ \url{https://globalrph.com/medical/conventional-units-international-units/} } \seealso{ The function \code{\link{ConvertMedUnits}} automates the conversion task. } \examples{ data(MedUnits) # Show available conversions MedUnits$Measurement # Utility function matchUnits <- function(X) MedUnits[grep(X, MedUnits$Measurement),] # Convert SI Glucose measurement to 'Conventional' units GlucoseSI = c(5, 5.4, 5, 5.1, 5.6, 5.1, 4.9, 5.2, 5.5) # in SI Units GlucoseUS = GlucoseSI / matchUnits("Glucose")$Conversion cbind(GlucoseSI, GlucoseUS) # Also consider using ConvertMedUnits() ConvertMedUnits(GlucoseSI, "Glucose", to="US") } \keyword{datasets} gdata/man/reorder.Rd0000644000176200001440000000576614631624774014072 0ustar liggesusers\name{reorder.factor} \alias{reorder.factor} \title{Reorder the Levels of a Factor} \description{ Reorder the levels of a factor. } \usage{ \method{reorder}{factor}(x, X, FUN, \dots, order=is.ordered(x), new.order, sort=mixedsort) } \arguments{ \item{x}{factor} \item{X}{auxillary data vector} \item{FUN}{function to be applied to subsets of \code{X} determined by \code{x}, to determine factor order} \item{\dots}{optional parameters to \code{FUN}} \item{order}{logical value indicating whether the returned object should be an \code{\link{ordered}} factor} \item{new.order}{a vector of indexes or a vector of label names giving the order of the new factor levels} \item{sort}{function to use to sort the factor level names, used only when \code{new.order} is missing} } \details{ This function changes the order of the levels of a factor. It can do so via three different mechanisms, depending on whether, \code{X} \emph{and} \code{FUN}, \code{new.order} or \code{sort} are provided. If \code{X} \emph{and} \code{FUN} are provided: The data in \code{X} is grouped by the levels of \code{x} and \code{FUN} is applied. The groups are then sorted by this value, and the resulting order is used for the new factor level names. If \code{new.order} is a numeric vector, the new factor level names are constructed by reordering the factor levels according to the numeric values. If \code{new.order} is a chraccter vector, \code{new.order} gives the list of new factor level names. In either case levels omitted from \code{new.order} will become missing (\code{NA}) values. If \code{sort} is provided (as it is by default): The new factor level names are generated by calling the function specified by \code{sort} to the existing factor level \emph{names}. With \code{sort=mixedsort} (the default) the factor levels are sorted so that combined numeric and character strings are sorted in according to character rules on the character sections (including ignoring case), and the numeric rules for the numeric sections. See \code{\link[gtools]{mixedsort}} for details. } \value{A new factor with reordered levels} \author{Gregory R. Warnes \email{greg@warnes.net}} \seealso{ \code{\link{factor}} and \code{\link[stats]{reorder}} } \examples{ \dontshow{ set.seed(123456) } # Create a 4 level example factor trt <- factor(sample(c("PLACEBO", "300 MG", "600 MG", "1200 MG"), 100, replace=TRUE)) summary(trt) # Note that the levels are not in a meaningful order. # Change the order to something useful # - default "mixedsort" ordering trt2 <- reorder(trt) summary(trt2) # - using indexes: trt3 <- reorder(trt, new.order=c(4, 2, 3, 1)) summary(trt3) # - using label names: trt4 <- reorder(trt, new.order=c("PLACEBO", "300 MG", "600 MG", "1200 MG")) summary(trt4) # - using frequency trt5 <- reorder(trt, X=rnorm(100), FUN=mean) summary(trt5) # Drop out the '300 MG' level trt6 <- reorder(trt, new.order=c("PLACEBO", "600 MG", "1200 MG")) summary(trt6) } \keyword{manip} gdata/man/wideByFactor.Rd0000644000176200001440000000315214631624774014775 0ustar liggesusers\name{wideByFactor} \alias{wideByFactor} \title{Create multivariate data by a given factor} \description{ Modify data frame in such a way that variables are \dQuote{separated} into several columns by factor levels. } \usage{ wideByFactor(x, factor, common, sort=TRUE, keepFactor=TRUE) } \arguments{ \item{x}{data frame} \item{factor}{character, column name of a factor by which variables will be divided} \item{common}{character, column names of (common) columns that should not be divided} \item{sort}{logical, sort resulting data frame by factor levels} \item{keepFactor}{logical, keep the \sQuote{factor} column} } \details{ Given data frame is modified so that the output represents a data frame with \eqn{c + f + n * v} columns, where \eqn{c} is a number of common columns for all levels of a factor, \eqn{f} is a factor column, \eqn{n} is a number of levels in factor \eqn{f} and \eqn{v} is a number of variables that should be divided for each level of a factor. Number of rows stays the same. } \value{ A data frame where divided variables have sort of \dQuote{diagonalized} structure. } \author{Gregor Gorjanc} \seealso{ \code{\link[stats]{reshape}} in the \pkg{stats} package. } \examples{ n <- 10 f <- 2 tmp <- data.frame(y1=rnorm(n=n), y2=rnorm(n=n), f1=factor(rep(letters[1:f], n/2)), f2=factor(c(rep("M", n/2), rep("F", n/2))), c1=1:n, c2=2*(1:n)) wideByFactor(x=tmp, factor="f1", common=c("c1", "c2", "f2")) wideByFactor(x=tmp, factor="f1", common=c("c1", "c2")) } \keyword{manip} \keyword{misc} gdata/man/write.fwf.Rd0000644000176200001440000002210314631624774014323 0ustar liggesusers\name{write.fwf} \alias{write.fwf} \concept{data output} \concept{data export} \title{Write object to file in fixed width format} \description{ Write object to file in fixed width (fwf) format. } \usage{ write.fwf(x, file="", append=FALSE, quote=FALSE, sep=" ", na="", rownames=FALSE, colnames=TRUE, rowCol=NULL, justify="left", formatInfo=FALSE, quoteInfo=TRUE, width=NULL, eol="\n", qmethod=c("escape", "double"), scientific=TRUE, \dots) } \arguments{ \item{x}{data.frame or matrix, the object to be written.} \item{file}{character, name of file or connection, look in \code{\link{write.table}} for more.} \item{append}{logical, append to existing data in \code{file}.} \item{quote}{logical, quote data in output.} \item{na}{character, the string to use for missing values (\code{NA}) in the output.} \item{sep}{character, separator between columns in output.} \item{rownames}{logical, print row names.} \item{colnames}{logical, print column names.} \item{rowCol}{character, rownames column name.} \item{justify}{character, alignment of character columns, see \code{\link{format}}.} \item{formatInfo}{logical, return information on number of levels, widths and format.} \item{quoteInfo}{logical, should \code{formatInfo} account for quotes.} \item{width}{numeric, width of the columns in the output.} \item{eol}{the character(s) to print at the end of each line (row). For example, \code{eol="\\r\\n"} will produce Windows line endings on a Unix-alike OS, and \code{eol="\\r"} will produce files as expected by Mac OS Excel 2004.} \item{qmethod}{a character string specifying how to deal with embedded double quote characters when quoting strings. Must be one of \code{"escape"} (default), in which case the quote character is escaped in C style by a backslash, or \code{"double"}, in which case it is doubled. You can specify just the initial letter.} \item{scientific}{logical, allow numeric values to be formatted using scientific notation.} \item{\dots}{further arguments to \code{\link{format.info}} and \code{\link{format}}.} } \details{ Output is similar to \code{print(x)} or \code{format(x)}. Formatting is done completely by \code{\link{format}} on a column basis. Columns in the output are by default separated with a space i.e. empty column with a width of one character, but that can be changed with \code{sep} argument as passed to \code{\link{write.table}} via \dots. As mentioned formatting is done completely by \code{\link{format}}. Arguments can be passed to \code{format} via \code{\dots} to further modify the output. However, note that the returned \code{formatInfo} might not properly account for this, since \code{\link{format.info}} (which is used to collect information about formatting) lacks the arguments of \code{\link{format}}. \code{quote} can be used to quote fields in the output. Since all columns of \code{x} are converted to character (via \code{\link{format}}) during the output, all columns will be quoted! If quotes are used, \code{\link{read.table}} can be easily used to read the data back into \R. Check examples. Do read the details about \code{quoteInfo} argument. Use only true characters, i.e., avoid use of tabs, i.e., \code{"\\t"} or similar separators via argument \code{sep}. Width of the separator is taken as the number of characters evaluated via \code{\link{nchar}(sep)}. Use argument \code{na} to convert missing/unknown values. Only single value can be specified. Use \code{\link{NAToUnknown}} prior to export if you need greater flexibility. If \code{rowCol} is not \code{NULL} and \code{rownames=TRUE}, rownames will also have column name with \code{rowCol} value. This is mainly for flexibility with tools outside \R. Note that it may not be easy to import data back to \R with \code{\link{read.fwf}} if you also export rownames. This is the reason, that default is \code{rownames=FALSE}. Information about format of output will be returned if \code{formatInfo=TRUE}. Returned value is described in value section. This information is gathered by \code{\link{format.info}} and care was taken to handle numeric properly. If output contains rownames, values account for this. Additionally, if \code{rowCol} is not \code{NULL} returned values contain also information about format of rownames. If \code{quote=TRUE}, the output is of course wider due to quotes. Return value (with \code{formatInfo=TRUE}) can account for this in two ways; controlled with argument \code{quoteInfo}. However, note that there is no way to properly read the data back to \R if \code{quote=TRUE} and \code{quoteInfo=FALSE} arguments were used for export. \code{quoteInfo} applies only when \code{quote=TRUE}. Assume that there is a file with quoted data as shown below (column numbers in first three lines are only for demonstration of the values in the output). \preformatted{ 123456789 12345678 # for position 123 1234567 123456 # for width with quoteInfo=TRUE 1 12345 1234 # for width with quoteInfo=FALSE "a" "hsgdh" " 9" " " " bb" " 123" } With \code{quoteInfo=TRUE} \code{write.fwf} will return \preformatted{ colname position width V1 1 3 V2 5 7 V3 13 6 } or (with \code{quoteInfo=FALSE}) \preformatted{ colname position width V1 2 1 V2 6 5 V3 14 4 } Argument \code{width} can be used to increase the width of the columns in the output. This argument is passed to the width argument of \code{\link{format}} function. Values in \code{width} are recycled if there is less values than the number of columns. If the specified width is too short in comparison to the "width" of the data in particular column, error is issued. } \value{ Besides its effect to write/export data \code{write.fwf} can provide information on format and width. If \code{formatInfo = FALSE}, then a data frame is returned with the following columns: \item{colname}{name of the column} \item{nlevels}{number of unique values (unused levels of factors are dropped), 0 for numeric column} \item{position}{starting column number in the output} \item{width}{width of the column} \item{digits}{number of digits after the decimal point} \item{exp}{width of exponent in exponential representation; 0 means there is no exponential representation, while 1 represents exponent of length one i.e. \code{1e+6} and 2 \code{1e+06} or \code{1e+16}} } \author{Gregor Gorjanc.} \seealso{ \code{\link{format.info}}, \code{\link{format}}, \code{\link{NAToUnknown}}, \code{\link{write.table}}, \code{\link{read.fwf}}, \code{\link{read.table}} and \code{\link{trim}}. } \examples{ ## Some data num <- round(c(733070.345678, 1214213.78765456, 553823.798765678, 1085022.8876545678, 571063.88765456, 606718.3876545678, 1053686.6, 971024.187656, 631193.398765456, 879431.1), digits=3) testData <- data.frame(num1=c(1:10, NA), num2=c(NA, seq(from=1, to=5.5, by=0.5)), num3=c(NA, num), int1=c(as.integer(1:4), NA, as.integer(4:9)), fac1=factor(c(NA, letters[1:9], "hjh")), fac2=factor(c(letters[6:15], NA)), cha1=c(letters[17:26], NA), cha2=c(NA, "longer", letters[25:17]), stringsAsFactors=FALSE) levels(testData$fac1) <- c(levels(testData$fac1), "unusedLevel") testData$Date <- as.Date("1900-1-1") testData$Date[2] <- NA testData$POSIXt <- as.POSIXct(strptime("1900-1-1 01:01:01", format="\%Y-\%m-\%d \%H:\%M:\%S")) testData$POSIXt[5] <- NA ## Default write.fwf(x=testData) ## NA should be - write.fwf(x=testData, na="-") ## NA should be -NA- write.fwf(x=testData, na="-NA-") ## Some other separator than space write.fwf(x=testData[, 1:4], sep="-mySep-") ## Force wider columns write.fwf(x=testData[, 1:5], width=20) ## Show effect of 'scientific' option testData$num3 <- testData$num3 * 1e8 write.fwf(testData, scientific=TRUE) write.fwf(testData, scientific=FALSE) testData$num3 <- testData$num3 / 1e8 ## Write to file and report format and fixed width information file <- tempfile() formatInfo <- write.fwf(x=testData, file=file, formatInfo=TRUE) formatInfo ## Read exported data back to R (note +1 due to separator) ## - without header read.fwf(file=file, widths=formatInfo$width + 1, header=FALSE, skip=1, strip.white=TRUE) ## - with header, via postimport modfication tmp <- read.fwf(file=file, widths=formatInfo$width + 1, skip=1, strip.white=TRUE) colnames(tmp) <- read.table(file=file, nrow=1, as.is=TRUE) tmp ## - with header, persuading read.fwf to accept header properly ## (thanks to Marc Schwartz) read.fwf(file=file, widths=formatInfo$width + 1, strip.white=TRUE, skip=1, col.names=read.table(file=file, nrow=1, as.is=TRUE)) ## - with header, using quotes write.fwf(x=testData, file=file, quote=TRUE) read.table(file=file, header=TRUE, strip.white=TRUE) ## Tidy up unlink(file) } \keyword{print} \keyword{file} gdata/man/cbindX.Rd0000644000176200001440000000162314631624774013623 0ustar liggesusers\name{cbindX} \alias{cbindX} \title{Column-bind objects with different number of rows} \description{ \code{cbindX} column-binds objects with different number of rows. } \usage{cbindX(\dots)} \arguments{ \item{\dots}{matrix and data.frame objects} } \details{ First the object with maximal number of rows is found. Other objects that have less rows get (via \code{\link{rbind}}) additional rows with \code{NA} values. Finally, all objects are column-binded (via \code{\link{cbind}}). } \value{See details.} \author{Gregor Gorjanc} \seealso{Regular \code{\link{cbind}} and \code{\link{rbind}}} \examples{ df1 <- data.frame(a=1:3, b=c("A", "B", "C")) df2 <- data.frame(c=as.character(1:5), a=5:1) ma1 <- matrix(as.character(1:4), nrow=2, ncol=2) ma2 <- matrix(1:6, nrow=3, ncol=2) cbindX(df1, df2) cbindX(ma1, ma2) cbindX(df1, ma1) cbindX(df1, df2, ma1, ma2) cbindX(ma1, ma2, df1, df2) } \keyword{misc} gdata/man/env.Rd0000644000176200001440000000164014631624774013203 0ustar liggesusers\name{env} \alias{env} \title{Describe All Loaded Environments} \description{ Display name, number of objects, and size of all loaded environments. } \usage{ env(unit="KB", digits=0) } \arguments{ \item{unit}{unit for displaying environment size: "bytes", "KB", "MB", or first letter.} \item{digits}{number of decimals to display when rounding environment size.} } \value{ A data frame with the following columns: \item{Environment}{environment name.} \item{Objects}{number of objects in environment.} \item{KB}{environment size \emph{(see notes)}.} } \note{ The name of the environment size column is the same as the unit used. } \author{Arni Magnusson} \seealso{ \code{env} is a verbose alternative to \code{\link{search}}. \code{\link{ll}} is a related function that describes objects in an environment. } \examples{ \dontrun{ env() } } \keyword{data} \keyword{environment} \keyword{utilities} gdata/man/ls.funs.Rd0000644000176200001440000000143014631624774014000 0ustar liggesusers\name{ls.funs} \alias{ls.funs} \title{List function objects} \description{ Return a character vector giving the names of function objects in the specified environment. } \usage{ ls.funs(\dots) } \arguments{ \item{\dots}{Arguments passed to \code{ls}. See the help for \code{\link[base]{ls}} for details.} } \details{ This function calls \code{ls} and then returns a character vector containing only the names of only function objects. } \value{ character vector } \author{ Gregory R. Warnes \email{greg@warnes.net} } \seealso{ \code{\link[base]{ls}}, \code{\link[base]{is.function}} } \examples{ ## List functions defined in the global environment: ls.funs() ## List functions available in the base package: ls.funs("package:base") } \keyword{misc} \keyword{environment} gdata/man/gdata-package.Rd0000644000176200001440000000426414631624774015071 0ustar liggesusers\name{gdata-package} \alias{gdata-package} \alias{gdata} \docType{package} \title{Various R Programming Tools for Data Manipulation} \description{ Various R programming tools for data manipulation, including: \itemize{ \item Medical unit conversions: \code{\link{ConvertMedUnits}}, \code{\link{MedUnits}} \item Combining objects: \code{link{bindData}}, \code{\link{cbindX}}, \code{\link{combine}}, \code{\link{interleave}} \item Character vector operations: \code{\link{centerText}}, \code{\link{startsWith}}, \code{\link{trim}} \item Factor manipulation: \code{\link{levels}}, \code{\link{reorder.factor}}, \code{\link{mapLevels}} \item Obtaining information about R objects: \code{\link{object_size}}, \code{\link{env}}, \code{\link{humanReadable}}, \code{\link{is.what}}, \code{\link{ll}}, \code{\link{keep}}, \code{\link{ls.funs}}, \code{\link{Args}}, \code{\link{nPairs}}, \code{\link{nobs}} \item Generating fixed-width format files: \code{\link{write.fwf}} \item Extracting components of date & time objects: \code{\link{getYear}}, \code{\link{getMonth}}, \code{\link{getDay}}, \code{\link{getHour}}, \code{\link{getMin}}, \code{\link{getSec}} \item Operations on columns of data frames: \code{\link{matchcols}}, \code{\link{rename.vars}} \item Matrix operations: \code{\link{unmatrix}}, \code{\link{upperTriangle}}, \code{\link{lowerTriangle}} \item Operations on vectors: \code{\link{case}}, \code{\link{unknownToNA}}, \code{\link{duplicated2}}, \code{\link{trimSum}} \item Operations on data frames: \code{\link{frameApply}}, \code{\link{wideByFactor}} \item Value of last evaluated expression: \code{\link{ans}} \item Wrapper for \code{sample} that ensures consistent behavior for both scalar and vector arguments: \code{\link{resample}} } } \note{\code{browseVignettes()} shows package vignettes.} \author{ Gregory R. Warnes, Gregor Gorjanc, Arni Magnusson, Liviu Andronic, Jim Rogers, Don MacQueen, and Ales Korosec, with contributions by Ben Bolker, Michael Chirico, Gabor Grothendieck, Thomas Lumley, and Brian Ripley. } \keyword{package} gdata/man/nobs.Rd0000644000176200001440000000327314631624774013360 0ustar liggesusers\name{nobs} \alias{nobs} \alias{n_obs} \alias{nobs.data.frame} \alias{nobs.default} \alias{nobs.lm} \title{Compute the Number of Non-Missing Observations} \description{ Compute the number of non-missing observations. Provides a new default method to handle numeric and logical vectors, and a method for data frames. } \usage{ nobs(object, \dots) \method{nobs}{default}(object, \dots) \method{nobs}{data.frame}(object, \dots) \method{nobs}{lm}(object, \dots) n_obs(object, \dots) } \arguments{ \item{object}{Numeric or logical vector, data frame, or a model object.} \item{\dots}{Further arguments to be passed to methods.} } \value{ Either single numeric value (for vectors) or a vector of numeric values (for data frames) giving the number of non-missing values. } \note{ The base R package \code{stats} provides a generic \code{nobs} function with methods for fitted model objects. The \code{gdata} package adds methods for numeric and logical vectors, as well as data frames. An alias function \code{n_obs} is also provided, equivalent to \code{gdata::nobs}. Using \code{n_obs} in scripts makes it explicitly clear that the \code{gdata} implementation is being used. } \author{Gregory R. Warnes \email{greg@warnes.net}} \seealso{ \code{\link[stats]{nobs}} in package 'stats' for the base R implementation, \code{\link{is.na}}, \code{\link{length}} } \examples{ x <- c(1, 2, 3, 5, NA, 6, 7, 1, NA) length(x) nobs(x) df <- data.frame(x=rnorm(100), y=rnorm(100)) df[1,1] <- NA df[1,2] <- NA df[2,1] <- NA nobs(df) fit <- lm(y~x, data=df) nobs(fit) n_obs(fit) # Comparison # gdata nobs(x) nobs(df) # stats length(na.omit(x)) sapply(df, function(x) length(na.omit(x))) } \keyword{attribute} gdata/man/nPairs.Rd0000644000176200001440000000307214631624774013650 0ustar liggesusers\name{nPairs} \alias{nPairs} \concept{pairs} \title{Number of variable pairs} \description{ Count the number of pairs between variables. } \usage{ nPairs(x, margin=FALSE, names=TRUE, abbrev=TRUE, \dots) } \arguments{ \item{x}{data.frame or a matrix} \item{margin}{logical, calculate the cumulative number of \dQuote{pairs}} \item{names}{logical, add row/col-names to the output} \item{abbrev}{logical, abbreviate names} \item{\dots}{other arguments passed to \code{\link{abbreviate}}} } \details{ The class of returned matrix is nPairs and matrix. There is a summary method, which shows the opposite information - counts how many times each variable is known, while the other variable of a pair is not. See examples. } \value{ Matrix of order \eqn{k}, where \eqn{k} is the number of columns in \code{x}. Values in a matrix represent the number of pairs between columns/variables in \code{x}. If \code{margin=TRUE}, the number of columns is \eqn{k+1} and the last column represents the cumulative number of pairing all variables. } \author{Gregor Gorjanc} \seealso{\code{\link{abbreviate}}} \examples{ # Test data test <- data.frame(V1=c(1, 2, 3, 4, 5), V2=c(NA, 2, 3, 4, 5), V3=c(1, NA, NA, NA, NA), V4=c(1, 2, 3, NA, NA)) # Number of variable pairs nPairs(x=test) # Without names nPairs(x=test, names=FALSE) # Longer names colnames(test) <- c("Variable1", "Variable2", "Variable3", "Variable4") nPairs(x=test) # Margin nPairs(x=test, margin=TRUE) # Summary summary(object=nPairs(x=test)) } \keyword{misc} gdata/man/mv.Rd0000644000176200001440000000131414631624774013033 0ustar liggesusers\name{mv} \alias{mv} \title{ Rename an Object } \description{ Rename an object. } \usage{ mv(from, to, envir = parent.frame()) } \arguments{ \item{from}{Character scalar giving the source object name} \item{to}{Character scalar giving the desination object name} \item{envir}{Environment in which to do the rename} } \details{ This function renames an object by the value of object \code{a} to the name \code{b}, and removing \code{a}. } \value{ Invisibly returns the value of the object. } \author{ Gregory R. Warnes \email{greg@warnes.net} } \seealso{ \code{\link[base]{rm}}, \code{\link[base]{assign}} } \examples{ a <- 1:10 a mv("a", "b") b exists("a") } \keyword{environment} \keyword{data} gdata/man/keep.Rd0000644000176200001440000000226714631624774013345 0ustar liggesusers\name{keep} \alias{keep} \title{Remove All Objects, Except Those Specified} \description{ Remove all objects from the user workspace, except those specified. } \usage{ keep(\dots, list=character(), all=FALSE, sure=FALSE) } \arguments{ \item{\dots}{objects to be kept, specified one by one, quoted or unquoted.} \item{list}{character vector of object names to be kept.} \item{all}{whether hidden objects (beginning with a \code{.}) should be removed, unless explicitly kept.} \item{sure}{whether to perform the removal, otherwise return names of objects that would be removed.} } \details{ Implemented with safety caps: objects whose name starts with a \code{.} are not removed unless \code{all=TRUE}, and an explicit \code{sure=TRUE} is required to remove anything. } \value{ A character vector containing object names that are deleted if \code{sure=TRUE}. } \author{Arni Magnusson} \seealso{ \code{keep} is a convenient interface to \code{\link{rm}} for removing most objects from the user workspace. } \examples{ data(trees, CO2) keep(trees) # To remove all objects except trees, run: # keep(trees, sure=TRUE) } \keyword{data} \keyword{environment} \keyword{utilities} gdata/DESCRIPTION0000644000176200001440000000402114705625112013040 0ustar liggesusersPackage: gdata Version: 3.0.1 Date: 2024-10-22 Title: Various R Programming Tools for Data Manipulation Authors@R: c(person(c("Gregory", "R."), "Warnes", role="aut", email="greg@warnes.net"), person("Gregor", "Gorjanc", role="aut"), person("Arni", "Magnusson", role=c("aut","cre"), email="thisisarni@gmail.com"), person("Liviu", "Andronic", role="aut"), person("Jim", "Rogers", role="aut"), person("Don", "MacQueen", role="aut"), person("Ales", "Korosec", role="aut"), person("Ben", "Bolker", role="ctb"), person("Michael", "Chirico", role="ctb"), person("Gabor", "Grothendieck", role="ctb"), person("Thomas", "Lumley", role="ctb"), person("Brian", "Ripley", role="ctb"), person("inoui llc", role="fnd")) Imports: gtools, methods, stats, utils Suggests: RUnit Description: Various R programming tools for data manipulation, including medical unit conversions, combining objects, character vector operations, factor manipulation, obtaining information about R objects, generating fixed-width format files, extracting components of date & time objects, operations on columns of data frames, matrix operations, operations on vectors, operations on data frames, value of last evaluated expression, and a resample() wrapper for sample() that ensures consistent behavior for both scalar and vector arguments. License: GPL-3 URL: https://github.com/r-gregmisc/gdata BugReports: https://github.com/r-gregmisc/gdata/issues NeedsCompilation: no Packaged: 2024-10-22 03:06:44 UTC; arnim Author: Gregory R. Warnes [aut], Gregor Gorjanc [aut], Arni Magnusson [aut, cre], Liviu Andronic [aut], Jim Rogers [aut], Don MacQueen [aut], Ales Korosec [aut], Ben Bolker [ctb], Michael Chirico [ctb], Gabor Grothendieck [ctb], Thomas Lumley [ctb], Brian Ripley [ctb], inoui llc [fnd] Maintainer: Arni Magnusson Repository: CRAN Date/Publication: 2024-10-22 04:30:02 UTC