gstat/0000755000176200001440000000000015162406267011405 5ustar liggesusersgstat/tests/0000755000176200001440000000000015162275253012546 5ustar liggesusersgstat/tests/blockkr.R0000644000176200001440000000214115060550314014305 0ustar liggesuserslibrary(sp) data(meuse) coordinates(meuse) = c("x", "y") new.locs <- SpatialPoints(data.frame( x = c(181170, 180310, 180205, 178673, 178770, 178270), y = c(333250, 332189, 331707, 330066, 330675, 331075))) library(gstat) krige(zinc ~ 1, meuse, new.locs, vgm(1.34e5, "Sph", 800, nug = 2.42e4), block = c(40,40), nmax = 40) new.locs <- SpatialPoints(data.frame(x = c(181170), y = c(333250))) disc = c(-15,-5,5,15) block.irreg <- data.frame(expand.grid(x = disc, y = disc)) block.irreg # first disable default Gaussian quadrature used for block integration, by # setting nblockdiscr explicitly: krige(zinc ~ 1, meuse, new.locs, model = vgm(1.34e5, "Sph", 800, nug = 2.42e4), block = c(40,40), nmax = 40, set = list(nblockdiscr=4)) # now pass the same block discretization as block.irreg: krige(zinc ~ 1, meuse, new.locs, vgm(1.34e5, "Sph", 800, nug = 2.42e4), block = block.irreg, nmax = 40) # check weights argument: block.irreg <- data.frame(expand.grid(x = disc, y = disc), weights = rep(1/16, 16)) krige(zinc ~ 1, meuse, new.locs, vgm(1.34e5, "Sph", 800, nug = 2.42e4), block = block.irreg, nmax = 40) gstat/tests/allier.R0000644000176200001440000000164215060550314014133 0ustar liggesusers# Sytze de Bruin's post to r-sig-geo, Nov 16, 2015: library(sp) library(gstat) # some data x <- c(215, 330, 410, 470, 545) y <- c(230, 310, 330, 340, 365) fc <- c(0.211, 0.251, 0.281, 0.262, 0.242) por <- c(0.438, 0.457, 0.419, 0.430, 0.468) Allier <- data.frame(x, y, fc, por) coordinates(Allier) = ~x+y # gstat object for co-kriging using linear model of co-regionalization g <- gstat(id=c("fc"), formula=fc~1, data=Allier, model=vgm(0.00247, "Sph", 480, 0.00166)) g <- gstat(g, id="por", formula=por~1, data=Allier, model=vgm(0.00239, "Sph", 480, 0.00118)) g <- gstat(g, id=c("fc", "por"), model=vgm(0.00151, "Sph", 480, -0.00124)) # predict at single point g$set = list(choleski = 0) # LDL' A <- predict(g, SpatialPoints(data.frame(x=450, y=350)), debug = 32) g$set = list(choleski = 1) # Choleski B <- predict(g, SpatialPoints(data.frame(x=450, y=350)), debug = 32) all.equal(A,B) # TRUE gstat/tests/na.action.Rout.save0000644000176200001440000000652715060550314016231 0ustar liggesusers R version 3.6.0 (2019-04-26) -- "Planting of a Tree" Copyright (C) 2019 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(sp) > > data(meuse) > data(meuse.grid) > > set.seed(13131) # reproduce results > > # select 10 random rows; > # create two missing values in the coordinates: > m = meuse.grid[sample(nrow(meuse.grid), 10), ] > m[c(2,8), "x"] = NA > > library(gstat) > ## this is not allowed anymore: > try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.pass)) Error in na.fail.default(structure(list(x = c(179220, NA, 178740, 179300, : missing values in object > try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.omit)) Error in na.fail.default(structure(list(x = c(179220, NA, 178740, 179300, : missing values in object > try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.exclude)) Error in na.fail.default(structure(list(x = c(179220, NA, 178740, 179300, : missing values in object > try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.fail)) Error in na.fail.default(structure(list(x = c(179220, NA, 178740, 179300, : missing values in object > > # select 10 random rows; > # create two missing values in the regressor variable: > m = meuse.grid[sample(nrow(meuse.grid), 10), ] > m[c(3,7), "dist"] = NA > krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.pass) [ordinary or weighted least squares prediction] x y var1.pred var1.var 1 178860 330860 6.530134 0.2415196 2 180260 331860 5.389567 0.2406041 3 180100 331860 NA NA 4 180460 331820 5.213370 0.2417197 5 179660 330580 5.550859 0.2398778 6 179740 330300 6.108648 0.2395392 7 180220 330660 NA NA 8 178580 329820 6.533801 0.2415453 9 180100 331900 5.580264 0.2397758 10 180780 331900 5.095967 0.2426499 > krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.omit) [ordinary or weighted least squares prediction] x y var1.pred var1.var 1877 178860 330860 6.530134 0.2415196 1015 180260 331860 5.389567 0.2406041 1056 180460 331820 5.213370 0.2417197 2199 179660 330580 5.550859 0.2398778 2556 179740 330300 6.108648 0.2395392 2985 178580 329820 6.533801 0.2415453 975 180100 331900 5.580264 0.2397758 992 180780 331900 5.095967 0.2426499 > krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.exclude) [ordinary or weighted least squares prediction] x y var1.pred var1.var 1877 178860 330860 6.530134 0.2415196 1015 180260 331860 5.389567 0.2406041 1056 180460 331820 5.213370 0.2417197 2199 179660 330580 5.550859 0.2398778 2556 179740 330300 6.108648 0.2395392 2985 178580 329820 6.533801 0.2415453 975 180100 331900 5.580264 0.2397758 992 180780 331900 5.095967 0.2426499 > try(krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.fail)) Error in na.fail.default(structure(list(dist = c(0.00135803, 0.423804, : missing values in object > > proc.time() user system elapsed 0.490 0.047 0.528 gstat/tests/krige0.R0000644000176200001440000000205515060550314014043 0ustar liggesusers# test -- load data: library(sp) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y library(gstat) # test -- idw meuse.grid$idw <- idw0(zinc~1, meuse, meuse.grid)[,1] x <- idw(zinc~1, meuse, meuse.grid) all.equal(x$var1.pred, meuse.grid$idw) spplot(meuse.grid["idw"],col.regions=bpy.colors()) v = vgm(1, "Exp", 500) # test sk: x0 <- krige0(zinc~1, meuse, meuse.grid, v, beta = 500, computeVar = TRUE) rownames(x0$pred)=NULL x <- krige(zinc~1, meuse, meuse.grid, v, beta = 500) all.equal(x$var1.pred, x0$pred[,1]) all.equal(x$var1.var, x0$var) # test ok: x0 <- krige0(zinc~1, meuse, meuse.grid, v, computeVar = TRUE) rownames(x0$pred)=NULL names(x0$var)=NULL x <- krige(zinc~1, meuse, meuse.grid, v) all.equal(x$var1.pred, x0$pred[,1]) all.equal(x$var1.var, x0$var) # test uk: x0 <- krige0(zinc~sqrt(dist), meuse, meuse.grid, v, computeVar = TRUE) rownames(x0$pred)=NULL names(x0$var)=NULL x <- krige(zinc~sqrt(dist), meuse, meuse.grid, v) all.equal(x$var1.pred, x0$pred[,1]) all.equal(x$var1.var, x0$var)gstat/tests/variogram.R0000644000176200001440000000056615060550314014656 0ustar liggesuserslibrary(sp) library(gstat) data(meuse) variogram(log(zinc)~1, ~x+y, meuse) coordinates(meuse) <- ~ x + y variogram(log(zinc)~1, meuse) ind=seq(1,155,2) var1= meuse[ind,] var2= meuse[-ind,] g <- gstat(NULL, id = "lead", form = lead ~ 1, data=var1) g <- gstat(g, id = "zinc", form = zinc ~ 1, data=var2) v.cross <- variogram(g) plot(v.cross) gstat/tests/na.action.R0000644000176200001440000000156615060550314014542 0ustar liggesuserslibrary(sp) data(meuse) data(meuse.grid) set.seed(13131) # reproduce results # select 10 random rows; # create two missing values in the coordinates: m = meuse.grid[sample(nrow(meuse.grid), 10), ] m[c(2,8), "x"] = NA library(gstat) ## this is not allowed anymore: try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.pass)) try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.omit)) try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.exclude)) try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.fail)) # select 10 random rows; # create two missing values in the regressor variable: m = meuse.grid[sample(nrow(meuse.grid), 10), ] m[c(3,7), "dist"] = NA krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.pass) krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.omit) krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.exclude) try(krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.fail)) gstat/tests/covtable.R0000644000176200001440000000057015060550314014461 0ustar liggesuserslibrary(gstat) d=expand.grid(x=c(-.5,.5), y=c(-.5,.5)) d$z=1:4 vv=vgm(model = "Tab", covtable = variogramLine(vgm(1, "Sph", 1), 1, n=1e4,min = 0, covariance = TRUE)) vv krige(z~1,~x+y,d,data.frame(x=0,y=0),vgm(1, "Sph", 1)) krige(z~1,~x+y,d,data.frame(x=0,y=0),vv) krige(z~1,~x+y,d[1:2,],data.frame(x=0,y=0),vgm(1, "Sph", 1)) krige(z~1,~x+y,d[1:2,],data.frame(x=0,y=0),vv) gstat/tests/stars.Rout.save0000644000176200001440000003061115162275146015514 0ustar liggesusers R Under development (unstable) (2026-02-12 r89409 ucrt) -- "Unsuffered Consequences" Copyright (C) 2026 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 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. > Sys.setenv(TZ = "UTC") > > Sys.unsetenv("KMP_DEVICE_THREAD_LIMIT") > Sys.unsetenv("KMP_ALL_THREADS") > Sys.unsetenv("KMP_TEAMS_THREAD_LIMIT") > Sys.unsetenv("OMP_THREAD_LIMIT") > > # 0. using sp: > > suppressPackageStartupMessages(library(sp)) > demo(meuse, ask = FALSE) demo(meuse) ---- ~~~~~ > require(sp) > crs = CRS("EPSG:28992") > data("meuse") > coordinates(meuse) <- ~x+y > proj4string(meuse) <- crs > data("meuse.grid") > coordinates(meuse.grid) <- ~x+y > gridded(meuse.grid) <- TRUE > proj4string(meuse.grid) <- crs > data("meuse.riv") > meuse.riv <- SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)),"meuse.riv"))) > proj4string(meuse.riv) <- crs > data("meuse.area") > meuse.area = SpatialPolygons(list(Polygons(list(Polygon(meuse.area)), "area"))) > proj4string(meuse.area) <- crs > suppressPackageStartupMessages(library(gstat)) > v = variogram(log(zinc)~1, meuse) > (v.fit = fit.variogram(v, vgm(1, "Sph", 900, 1))) model psill range 1 Nug 0.05066243 0.0000 2 Sph 0.59060780 897.0209 > k_sp = krige(log(zinc)~1, meuse[-(1:5),], meuse[1:5,], v.fit) [using ordinary kriging] > k_sp_grd = krige(log(zinc)~1, meuse, meuse.grid, v.fit) [using ordinary kriging] > > # 1. using sf: > suppressPackageStartupMessages(library(sf)) > demo(meuse_sf, ask = FALSE, echo = FALSE) > # reloads meuse as data.frame, so > demo(meuse, ask = FALSE) demo(meuse) ---- ~~~~~ > require(sp) > crs = CRS("EPSG:28992") > data("meuse") > coordinates(meuse) <- ~x+y > proj4string(meuse) <- crs > data("meuse.grid") > coordinates(meuse.grid) <- ~x+y > gridded(meuse.grid) <- TRUE > proj4string(meuse.grid) <- crs > data("meuse.riv") > meuse.riv <- SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)),"meuse.riv"))) > proj4string(meuse.riv) <- crs > data("meuse.area") > meuse.area = SpatialPolygons(list(Polygons(list(Polygon(meuse.area)), "area"))) > proj4string(meuse.area) <- crs > > v = variogram(log(zinc)~1, meuse_sf) > (v.fit = fit.variogram(v, vgm(1, "Sph", 900, 1))) model psill range 1 Nug 0.05066243 0.0000 2 Sph 0.59060780 897.0209 > k_sf = krige(log(zinc)~1, meuse_sf[-(1:5),], meuse_sf[1:5,], v.fit) [using ordinary kriging] > > all.equal(k_sp, as(k_sf, "Spatial"), check.attributes = FALSE) [1] TRUE > all.equal(k_sp, as(k_sf, "Spatial"), check.attributes = TRUE) [1] "Attributes: < Component \"bbox\": Attributes: < Component \"dimnames\": Component 1: 2 string mismatches > >" [2] "Attributes: < Component \"coords\": Attributes: < Component \"dimnames\": Component 2: 2 string mismatches > >" [3] "Attributes: < Component \"coords.nrs\": Numeric: lengths (2, 0) differ >" > > # 2. using stars for grid: > > suppressPackageStartupMessages(library(stars)) > st = st_as_stars(meuse.grid) > > # compare inputs: > sp = as(st, "Spatial") > fullgrid(meuse.grid) = TRUE > all.equal(sp, meuse.grid["dist"], check.attributes = FALSE) [1] "Names: Lengths (5, 1) differ (string compare on first 1)" [2] "Names: 1 string mismatch" > all.equal(sp, meuse.grid["dist"], check.attributes = TRUE, use.names = FALSE) [1] "Names: Lengths (5, 1) differ (string compare on first 1)" [2] "Names: 1 string mismatch" [3] "Attributes: < Component 3: Names: 1 string mismatch >" [4] "Attributes: < Component 3: Length mismatch: comparison on first 1 components >" [5] "Attributes: < Component 3: Component 1: Mean relative difference: 1.08298 >" [6] "Attributes: < Component 4: Attributes: < Component 2: names for current but not for target > >" [7] "Attributes: < Component 4: Attributes: < Component 3: names for current but not for target > >" > > # kriging: > st_crs(st) = st_crs(meuse_sf) = NA # GDAL roundtrip messes them up! > k_st = if (Sys.getenv("USER") == "travis") { + try(krige(log(zinc)~1, meuse_sf, st, v.fit)) + } else { + krige(log(zinc)~1, meuse_sf, st, v.fit) + } [using ordinary kriging] > k_st stars object with 2 dimensions and 2 attributes attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NAs var1.pred 4.7765547 5.2376293 5.5728839 5.7072287 6.1717619 7.4399911 5009 var1.var 0.0854949 0.1372864 0.1621838 0.1853319 0.2116152 0.5002756 5009 dimension(s): from to offset delta x/y x 1 78 178440 40 [x] y 1 104 333760 -40 [y] > > # handle factors, when going to stars? > k_sp_grd$cls = cut(k_sp_grd$var1.pred, c(0, 5, 6, 7, 8, 9)) > if (require(raster, quietly = TRUE)) { + print(st_as_stars(raster::stack(k_sp_grd))) # check + print(all.equal(st_redimension(st_as_stars(k_sp_grd)), st_as_stars(raster::stack(k_sp_grd)), check.attributes=FALSE)) + } stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NAs var1.pred 0.0854949 0.2116778 2 2.710347 5.237542 7.439991 15027 dimension(s): from to offset delta refsys values x 1 78 178440 40 Amersfoort / RD New NULL y 1 104 333760 -40 Amersfoort / RD New NULL band 1 3 NA NA NA var1.pred, var1.var , cls x/y x [x] y [y] band [1] TRUE > > suppressPackageStartupMessages(library(spacetime)) > > tm = as.POSIXct("2019-02-25 15:37:24 CET") > n = 4 > s = stars:::st_stars(list(foo = array(1:(n^3), rep(n,3))), + stars:::create_dimensions(list( + x = stars:::create_dimension(from = 1, to = n, offset = 10, delta = 0.5), + y = stars:::create_dimension(from = 1, to = n, offset = 0, delta = -0.7), + time = stars:::create_dimension(values = tm + 1:n)), + raster = stars:::get_raster(dimensions = c("x", "y"))) + ) > s stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. foo 1 16.75 32.5 32.5 48.25 64 dimension(s): from to offset delta refsys x/y x 1 4 10 0.5 NA [x] y 1 4 0 -0.7 NA [y] time 1 4 2019-02-25 15:37:25 UTC 1 secs POSIXct > > as.data.frame(s) x y time foo 1 10.25 -0.35 2019-02-25 15:37:25 1 2 10.75 -0.35 2019-02-25 15:37:25 2 3 11.25 -0.35 2019-02-25 15:37:25 3 4 11.75 -0.35 2019-02-25 15:37:25 4 5 10.25 -1.05 2019-02-25 15:37:25 5 6 10.75 -1.05 2019-02-25 15:37:25 6 7 11.25 -1.05 2019-02-25 15:37:25 7 8 11.75 -1.05 2019-02-25 15:37:25 8 9 10.25 -1.75 2019-02-25 15:37:25 9 10 10.75 -1.75 2019-02-25 15:37:25 10 11 11.25 -1.75 2019-02-25 15:37:25 11 12 11.75 -1.75 2019-02-25 15:37:25 12 13 10.25 -2.45 2019-02-25 15:37:25 13 14 10.75 -2.45 2019-02-25 15:37:25 14 15 11.25 -2.45 2019-02-25 15:37:25 15 16 11.75 -2.45 2019-02-25 15:37:25 16 17 10.25 -0.35 2019-02-25 15:37:26 17 18 10.75 -0.35 2019-02-25 15:37:26 18 19 11.25 -0.35 2019-02-25 15:37:26 19 20 11.75 -0.35 2019-02-25 15:37:26 20 21 10.25 -1.05 2019-02-25 15:37:26 21 22 10.75 -1.05 2019-02-25 15:37:26 22 23 11.25 -1.05 2019-02-25 15:37:26 23 24 11.75 -1.05 2019-02-25 15:37:26 24 25 10.25 -1.75 2019-02-25 15:37:26 25 26 10.75 -1.75 2019-02-25 15:37:26 26 27 11.25 -1.75 2019-02-25 15:37:26 27 28 11.75 -1.75 2019-02-25 15:37:26 28 29 10.25 -2.45 2019-02-25 15:37:26 29 30 10.75 -2.45 2019-02-25 15:37:26 30 31 11.25 -2.45 2019-02-25 15:37:26 31 32 11.75 -2.45 2019-02-25 15:37:26 32 33 10.25 -0.35 2019-02-25 15:37:27 33 34 10.75 -0.35 2019-02-25 15:37:27 34 35 11.25 -0.35 2019-02-25 15:37:27 35 36 11.75 -0.35 2019-02-25 15:37:27 36 37 10.25 -1.05 2019-02-25 15:37:27 37 38 10.75 -1.05 2019-02-25 15:37:27 38 39 11.25 -1.05 2019-02-25 15:37:27 39 40 11.75 -1.05 2019-02-25 15:37:27 40 41 10.25 -1.75 2019-02-25 15:37:27 41 42 10.75 -1.75 2019-02-25 15:37:27 42 43 11.25 -1.75 2019-02-25 15:37:27 43 44 11.75 -1.75 2019-02-25 15:37:27 44 45 10.25 -2.45 2019-02-25 15:37:27 45 46 10.75 -2.45 2019-02-25 15:37:27 46 47 11.25 -2.45 2019-02-25 15:37:27 47 48 11.75 -2.45 2019-02-25 15:37:27 48 49 10.25 -0.35 2019-02-25 15:37:28 49 50 10.75 -0.35 2019-02-25 15:37:28 50 51 11.25 -0.35 2019-02-25 15:37:28 51 52 11.75 -0.35 2019-02-25 15:37:28 52 53 10.25 -1.05 2019-02-25 15:37:28 53 54 10.75 -1.05 2019-02-25 15:37:28 54 55 11.25 -1.05 2019-02-25 15:37:28 55 56 11.75 -1.05 2019-02-25 15:37:28 56 57 10.25 -1.75 2019-02-25 15:37:28 57 58 10.75 -1.75 2019-02-25 15:37:28 58 59 11.25 -1.75 2019-02-25 15:37:28 59 60 11.75 -1.75 2019-02-25 15:37:28 60 61 10.25 -2.45 2019-02-25 15:37:28 61 62 10.75 -2.45 2019-02-25 15:37:28 62 63 11.25 -2.45 2019-02-25 15:37:28 63 64 11.75 -2.45 2019-02-25 15:37:28 64 > plot(s, col = sf.colors(), axes = TRUE) > (s.stfdf = as(s, "STFDF")) An object of class "STFDF" Slot "data": foo 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 53 54 54 55 55 56 56 57 57 58 58 59 59 60 60 61 61 62 62 63 63 64 64 Slot "sp": Object of class SpatialPixels Grid topology: cellcentre.offset cellsize cells.dim x 10.25 0.5 4 y -2.45 0.7 4 SpatialPoints: x y [1,] 10.25 -0.35 [2,] 10.75 -0.35 [3,] 11.25 -0.35 [4,] 11.75 -0.35 [5,] 10.25 -1.05 [6,] 10.75 -1.05 [7,] 11.25 -1.05 [8,] 11.75 -1.05 [9,] 10.25 -1.75 [10,] 10.75 -1.75 [11,] 11.25 -1.75 [12,] 11.75 -1.75 [13,] 10.25 -2.45 [14,] 10.75 -2.45 [15,] 11.25 -2.45 [16,] 11.75 -2.45 Coordinate Reference System (CRS) arguments: NA Slot "time": timeIndex 2019-02-25 15:37:25 1 2019-02-25 15:37:26 2 2019-02-25 15:37:27 3 2019-02-25 15:37:28 4 Slot "endTime": [1] "2019-02-25 15:37:26 UTC" "2019-02-25 15:37:27 UTC" [3] "2019-02-25 15:37:28 UTC" "2019-02-25 15:37:29 UTC" > stplot(s.stfdf, scales = list(draw = TRUE)) > > (s2 = st_as_stars(s.stfdf)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. foo 1 16.75 32.5 32.5 48.25 64 dimension(s): from to offset delta refsys x/y x 1 4 10 0.5 NA [x] y 1 4 -1.11e-16 -0.7 NA [y] time 1 4 2019-02-25 15:37:25 UTC 1 secs POSIXct > plot(s2, col = sf.colors(), axes = TRUE) > all.equal(s, s2, check.attributes = FALSE) [1] TRUE > > # multiple simulations: > data(meuse, package = "sp") > data(meuse.grid, package = "sp") > coordinates(meuse.grid) <- ~x+y > gridded(meuse.grid) <- TRUE > meuse.grid = st_as_stars(meuse.grid) > meuse_sf = st_as_sf(meuse, coords = c("x", "y")) > g = gstat(NULL, "zinc", zinc~1, meuse_sf, model = vgm(1, "Exp", 300), nmax = 10) > g = gstat(g, "lead", lead~1, meuse_sf, model = vgm(1, "Exp", 300), nmax = 10, fill.cross = TRUE) > set.seed(123) > ## IGNORE_RDIFF_BEGIN > (p = predict(g, meuse.grid, nsim = 5)) drawing 5 multivariate GLS realisations of beta... [using conditional Gaussian simulation] stars object with 3 dimensions and 2 attributes attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NAs zinc 101.7643 199.48523 300.2140 399.7954 544.0229 1817.2057 25045 lead 32.7799 73.01782 107.9339 133.1702 178.8162 638.9396 25045 dimension(s): from to offset delta values x/y x 1 78 178440 40 NULL [x] y 1 104 333760 -40 NULL [y] sample 1 5 NA NA sim1,...,sim5 > ## IGNORE_RDIFF_END > > proc.time() user system elapsed 11.04 0.64 11.70 gstat/tests/covtable.Rout.save0000644000176200001440000000276515060550314016156 0ustar liggesusers R version 3.2.3 (2015-12-10) -- "Wooden Christmas-Tree" Copyright (C) 2015 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(gstat) > d=expand.grid(x=c(-.5,.5), y=c(-.5,.5)) > d$z=1:4 > vv=vgm(model = "Tab", covtable = + variogramLine(vgm(1, "Sph", 1), 1, n=1e4,min = 0, covariance = TRUE)) > vv model psill maxdist 1 Tab NA 1 covariance table: [1] 1.0000000 0.7039712 0.4319496 0.2080384 0.0560108 0.0000000 > krige(z~1,~x+y,d,data.frame(x=0,y=0),vgm(1, "Sph", 1)) [using ordinary kriging] x y var1.pred var1.var 1 0 0 2.5 1.017767 > krige(z~1,~x+y,d,data.frame(x=0,y=0),vv) [using ordinary kriging] x y var1.pred var1.var 1 0 0 2.5 1.017863 > krige(z~1,~x+y,d[1:2,],data.frame(x=0,y=0),vgm(1, "Sph", 1)) [using ordinary kriging] x y var1.pred var1.var 1 0 0 1.5 1.267767 > krige(z~1,~x+y,d[1:2,],data.frame(x=0,y=0),vv) [using ordinary kriging] x y var1.pred var1.var 1 0 0 1.5 1.267863 > > proc.time() user system elapsed 0.704 0.276 0.670 gstat/tests/cv3d.Rout.save0000644000176200001440000000405215060550314015205 0ustar liggesusers R Under development (unstable) (2025-02-03 r87683 ucrt) -- "Unsuffered Consequences" Copyright (C) 2025 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 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. > options(digits = 4) > set.seed(1131) > d = data.frame(x=runif(50),y=runif(50),z=runif(50),v=rnorm(50)) > library(gstat) > xx = krige.cv(v~1,~x+y+z,d,model=vgm(1,"Exp",1), verbose=F, set=list(debug=0)) > summary(xx) var1.pred var1.var observed residual Min. :-1.163 Min. :0.116 Min. :-2.240 Min. :-2.1755 1st Qu.:-0.571 1st Qu.:0.175 1st Qu.:-0.876 1st Qu.:-0.7881 Median :-0.201 Median :0.192 Median :-0.219 Median : 0.1175 Mean :-0.165 Mean :0.208 Mean :-0.142 Mean : 0.0233 3rd Qu.: 0.161 3rd Qu.:0.240 3rd Qu.: 0.501 3rd Qu.: 0.8508 Max. : 1.085 Max. :0.426 Max. : 1.857 Max. : 2.5224 zscore fold x y Min. :-5.1678 Min. : 1.0 Min. :0.00678 Min. :0.0034 1st Qu.:-1.8749 1st Qu.:13.2 1st Qu.:0.23966 1st Qu.:0.2466 Median : 0.2453 Median :25.5 Median :0.48668 Median :0.4525 Mean : 0.0167 Mean :25.5 Mean :0.49966 Mean :0.4969 3rd Qu.: 2.0201 3rd Qu.:37.8 3rd Qu.:0.74730 3rd Qu.:0.7394 Max. : 7.3541 Max. :50.0 Max. :0.98754 Max. :0.9872 z Min. :0.00164 1st Qu.:0.18646 Median :0.44850 Mean :0.47142 3rd Qu.:0.72403 Max. :0.99420 > > proc.time() user system elapsed 1.23 0.17 1.39 gstat/tests/merge.Rout.save0000644000176200001440000001564515060550314015457 0ustar liggesusers R version 4.2.0 (2022-04-22) -- "Vigorous Calisthenics" Copyright (C) 2022 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. > options(digits=6) > # illustrates the use of merge, for merging parameters accross variables: > # Z1=m+e1(s) > # Z2=m+e2(s) > # Z1 and Z2 each have a different variogram, but share the parameter m > # see documentation of gstat() function > library(gstat) > d1 = data.frame(x=c(0,2),y=c(0,0),z=c(0,1)) > d2 = data.frame(x=c(0,2),y=c(2,2),z=c(4,5)) > g = gstat(NULL,"d1", z~1,~x+y,d1,model=vgm(1, "Exp", 1)) > g = gstat(g,"d2", z~1,~x+y,d2,model=vgm(1, "Exp", 1), merge=c("d1","d2")) > g = gstat(g, c("d1", "d2"), model = vgm(0.5, "Exp", 1)) > predict(g, data.frame(x=1,y=1), debug = 32) Intrinsic Correlation found. Good. [using ordinary cokriging] we're at location X: 1 Y: 1 Z: 0 zero block size we're at point X: 1 Y: 1 Z: 0 # X: #Matrix: 4 by 1 rbind( c( 1.000000), # row 1 c( 1.000000), # row 2 c( 1.000000), # row 3 c( 1.000000) # row 4 ) [using generalized covariances: max_val - semivariance()] # Covariances (x_i, x_j) matrix C (upper triangle): #Matrix: 4 by 4 rbind( c( 1.000000, 0.135335, 0.067668, 0.029553), # row 1 c( 0.135335, 1.000000, 0.029553, 0.067668), # row 2 c( 0.067668, 0.029553, 1.000000, 0.135335), # row 3 c( 0.029553, 0.067668, 0.135335, 1.000000) # row 4 ) # glm->C, Choleski decomposed:: #Matrix: 4 by 4 rbind( c( 1.000000, 0.135335, 0.067668, 0.029553), # row 1 c( 0.000000, 0.990800, 0.020584, 0.064259), # row 2 c( 0.000000, 0.000000, 0.997496, 0.132344), # row 3 c( 0.000000, 0.000000, 0.000000, 0.988677) # row 4 ) # X'C-1 X: #Matrix: 1 by 1 rbind( c( 3.245289) # row 1 ) # beta: #Vector: dim: 1 c( 2.500000) # Cov(beta), (X'C-1 X)-1: #Matrix: 1 by 1 rbind( c( 0.308139) # row 1 ) # Corr(beta): #Matrix: 1 by 1 rbind( c( 1.000000) # row 1 ) # X0 (X values at prediction location x0): #Matrix: 1 by 2 rbind( c( 1.000000, 1.000000) # row 1 ) # BLUE(mu), E(y(x0)) = X0'beta: #Vector: dim: 2 c( 2.500000, 2.500000) # Covariances (x_i, x_0), C0: #Matrix: 4 by 2 rbind( c( 0.243117, 0.121558), # row 1 c( 0.243117, 0.121558), # row 2 c( 0.121558, 0.243117), # row 3 c( 0.121558, 0.243117) # row 4 ) # C-1 C0: #Matrix: 4 by 2 rbind( c( 0.206482, 0.089387), # row 1 c( 0.206482, 0.089387), # row 2 c( 0.089387, 0.206482), # row 3 c( 0.089387, 0.206482) # row 4 ) # [a] Cov_ij(B,B) or Cov_ij(0,0): #Matrix: 2 by 2 rbind( c( 1.000000, 0.500000), # row 1 c( 0.500000, 1.000000) # row 2 ) # [c] (x0-X'C-1 c0)'(X'C-1 X)-1(x0-X'C-1 c0): #Matrix: 2 by 2 rbind( c( 0.051360, 0.051360), # row 1 c( 0.051360, 0.051360) # row 2 ) # [b] c0'C-1 c0: #Matrix: 2 by 2 rbind( c( 0.122130, 0.093662), # row 1 c( 0.093662, 0.122130) # row 2 ) # Best Linear Unbiased Predictor: #Vector: dim: 2 c( 2.031619, 2.968381) # MSPE ([a]-[b]+[c]): #Matrix: 2 by 2 rbind( c( 0.929230, 0.457698), # row 1 c( 0.457698, 0.929230) # row 2 ) # kriging weights: #Matrix: 4 by 2 rbind( c( 0.308548, 0.191452), # row 1 c( 0.308548, 0.191452), # row 2 c( 0.191452, 0.308548), # row 3 c( 0.191452, 0.308548) # row 4 ) x y d1.pred d1.var d2.pred d2.var cov.d1.d2 1 1 1 2.03162 0.92923 2.96838 0.92923 0.457698 > > # Z1 and Z2 share a regression slope: > g = gstat(NULL,"d1", z~x,~x+y,d1,model=vgm(1, "Exp", 1)) > g = gstat(g,"d2", z~x,~x+y,d2,model=vgm(1, "Exp", 1), + merge=list(c("d1",2,"d2",2))) > g = gstat(g, c("d1", "d2"), model = vgm(0.5, "Exp", 1)) > predict(g, data.frame(x=1,y=1), debug = 32) Intrinsic Correlation found. Good. [using universal cokriging] we're at location X: 1 Y: 1 Z: 0 zero block size we're at point X: 1 Y: 1 Z: 0 # X: #Matrix: 4 by 3 rbind( c( 1.000000, 0.000000, 0.000000), # row 1 c( 1.000000, 2.000000, 0.000000), # row 2 c( 0.000000, 0.000000, 1.000000), # row 3 c( 0.000000, 2.000000, 1.000000) # row 4 ) [using generalized covariances: max_val - semivariance()] # Covariances (x_i, x_j) matrix C (upper triangle): #Matrix: 4 by 4 rbind( c( 1.000000, 0.135335, 0.067668, 0.029553), # row 1 c( 0.135335, 1.000000, 0.029553, 0.067668), # row 2 c( 0.067668, 0.029553, 1.000000, 0.135335), # row 3 c( 0.029553, 0.067668, 0.135335, 1.000000) # row 4 ) # glm->C, Choleski decomposed:: #Matrix: 4 by 4 rbind( c( 1.000000, 0.135335, 0.067668, 0.029553), # row 1 c( 0.000000, 0.990800, 0.020584, 0.064259), # row 2 c( 0.000000, 0.000000, 0.997496, 0.132344), # row 3 c( 0.000000, 0.000000, 0.000000, 0.988677) # row 4 ) # X'C-1 X: #Matrix: 3 by 3 rbind( c( 1.774607, 1.622645, -0.151962), # row 1 c( 1.622645, 7.676050, 1.622645), # row 2 c(-0.151962, 1.622645, 1.774607) # row 3 ) # beta: #Vector: dim: 3 c( 0.000000, 0.500000, 4.000000) # Cov(beta), (X'C-1 X)-1: #Matrix: 3 by 3 rbind( c( 0.793363, -0.225695, 0.274305), # row 1 c(-0.225695, 0.225695, -0.225695), # row 2 c( 0.274305, -0.225695, 0.793363) # row 3 ) # Corr(beta): #Matrix: 3 by 3 rbind( c( 1.000000, -0.533366, 0.345750), # row 1 c(-0.533366, 1.000000, -0.533366), # row 2 c( 0.345750, -0.533366, 1.000000) # row 3 ) # X0 (X values at prediction location x0): #Matrix: 3 by 2 rbind( c( 1.000000, 0.000000), # row 1 c( 1.000000, 1.000000), # row 2 c( 0.000000, 1.000000) # row 3 ) # BLUE(mu), E(y(x0)) = X0'beta: #Vector: dim: 2 c( 0.500000, 4.500000) # Covariances (x_i, x_0), C0: #Matrix: 4 by 2 rbind( c( 0.243117, 0.121558), # row 1 c( 0.243117, 0.121558), # row 2 c( 0.121558, 0.243117), # row 3 c( 0.121558, 0.243117) # row 4 ) # C-1 C0: #Matrix: 4 by 2 rbind( c( 0.206482, 0.089387), # row 1 c( 0.206482, 0.089387), # row 2 c( 0.089387, 0.206482), # row 3 c( 0.089387, 0.206482) # row 4 ) # [a] Cov_ij(B,B) or Cov_ij(0,0): #Matrix: 2 by 2 rbind( c( 1.000000, 0.500000), # row 1 c( 0.500000, 1.000000) # row 2 ) # [c] (x0-X'C-1 c0)'(X'C-1 X)-1(x0-X'C-1 c0): #Matrix: 2 by 2 rbind( c( 0.203564, -0.100844), # row 1 c(-0.100844, 0.203564) # row 2 ) # [b] c0'C-1 c0: #Matrix: 2 by 2 rbind( c( 0.122130, 0.093662), # row 1 c( 0.093662, 0.122130) # row 2 ) # Best Linear Unbiased Predictor: #Vector: dim: 2 c( 0.500000, 4.500000) # MSPE ([a]-[b]+[c]): #Matrix: 2 by 2 rbind( c( 1.081434, 0.305494), # row 1 c( 0.305494, 1.081434) # row 2 ) # kriging weights: #Matrix: 4 by 2 rbind( c( 0.500000, 0.000000), # row 1 c( 0.500000, 0.000000), # row 2 c( 0.000000, 0.500000), # row 3 c( 0.000000, 0.500000) # row 4 ) x y d1.pred d1.var d2.pred d2.var cov.d1.d2 1 1 1 0.5 1.08143 4.5 1.08143 0.305494 > > proc.time() user system elapsed 0.551 0.044 0.588 gstat/tests/windst.R0000644000176200001440000000656515060550314014204 0ustar liggesuserssuppressPackageStartupMessages(library(sp)) suppressPackageStartupMessages(library(spacetime)) suppressPackageStartupMessages(library(gstat)) suppressPackageStartupMessages(library(stars)) Sys.unsetenv("KMP_DEVICE_THREAD_LIMIT") Sys.unsetenv("KMP_ALL_THREADS") Sys.unsetenv("KMP_TEAMS_THREAD_LIMIT") Sys.unsetenv("OMP_THREAD_LIMIT") data(wind) wind.loc$y = as.numeric(char2dms(as.character(wind.loc[["Latitude"]]))) wind.loc$x = as.numeric(char2dms(as.character(wind.loc[["Longitude"]]))) coordinates(wind.loc) = ~x+y proj4string(wind.loc) = "+proj=longlat +datum=WGS84 +ellps=WGS84" wind$time = ISOdate(wind$year+1900, wind$month, wind$day) wind$jday = as.numeric(format(wind$time, '%j')) stations = 4:15 windsqrt = sqrt(0.5148 * wind[stations]) # knots -> m/s Jday = 1:366 daymeans = colMeans( sapply(split(windsqrt - colMeans(windsqrt), wind$jday), colMeans)) meanwind = lowess(daymeans ~ Jday, f = 0.1)$y[wind$jday] velocities = apply(windsqrt, 2, function(x) { x - meanwind }) # match order of columns in wind to Code in wind.loc; # convert to utm zone 29, to be able to do interpolation in # proper Euclidian (projected) space: pts = coordinates(wind.loc[match(names(wind[4:15]), wind.loc$Code),]) pts = SpatialPoints(pts) if (require(sp, quietly = TRUE) && require(maps, quietly = TRUE)) { proj4string(pts) = "+proj=longlat +datum=WGS84 +ellps=WGS84" utm29 = "+proj=utm +zone=29 +datum=WGS84 +ellps=WGS84" pts = as(st_transform(st_as_sfc(pts), utm29), "Spatial") # note the t() in: w = STFDF(pts, wind$time, data.frame(values = as.vector(t(velocities)))) library(mapdata) mp = map("worldHires", xlim = c(-11,-5.4), ylim = c(51,55.5), plot=FALSE) sf = st_transform(st_as_sf(mp, fill = FALSE), utm29) m = as(sf, "Spatial") # setup grid grd = SpatialPixels(SpatialPoints(makegrid(m, n = 300)), proj4string = m@proj4string) # grd$t = rep(1, nrow(grd)) #coordinates(grd) = ~x1+x2 #gridded(grd)=TRUE # select april 1961: w = w[, "1961-04"] covfn = function(x, y = x) { du = spDists(coordinates(x), coordinates(y)) t1 = as.numeric(index(x)) # time in seconds t2 = as.numeric(index(y)) # time in seconds dt = abs(outer(t1, t2, "-")) # separable, product covariance model: 0.6 * exp(-du/750000) * exp(-dt / (1.5 * 3600 * 24)) } n = 10 tgrd = seq(min(index(w)), max(index(w)), length=n) pred = krige0(sqrt(values)~1, w, STF(grd, tgrd), covfn) layout = list(list("sp.points", pts, first=F, cex=.5), list("sp.lines", m, col='grey')) wind.pr0 = STFDF(grd, tgrd, data.frame(var1.pred = pred)) v = vgmST("separable", space = vgm(1, "Exp", 750000), time = vgm(1, "Exp", 1.5 * 3600 * 24), sill = 0.6) wind.ST = krigeST(sqrt(values)~1, w, STF(grd, tgrd), v) all.equal(wind.pr0, wind.ST) # stars: df = data.frame(a = rep(NA, 324*10)) s = STF(grd, tgrd) newd = addAttrToGeom(s, df) wind.sta = krigeST(sqrt(values)~1, st_as_stars(w), st_as_stars(newd), v) # 1 plot(stars::st_as_stars(wind.ST), breaks = "equal", col = sf.colors()) # 2 stplot(wind.ST) # 3 plot(wind.sta, breaks = "equal", col = sf.colors()) st_as_stars(wind.ST)[[1]][1:3,1:3,1] (wind.sta)[[1]][1:3,1:3,1] st_bbox(wind.sta) bbox(wind.ST) all.equal(wind.sta, stars::st_as_stars(wind.ST), check.attributes = FALSE) # 4: roundtrip wind.sta->STFDF->stars rt = stars::st_as_stars(as(wind.sta, "STFDF")) plot(rt, breaks = "equal", col = sf.colors()) # 5: stplot(as(wind.sta, "STFDF")) st_bbox(rt) # 6: stplot(as(st_as_stars(wind.ST), "STFDF")) } gstat/tests/cv.R0000644000176200001440000000073415060550314013274 0ustar liggesusers# try bivariate cokriging; cross validate first variable library(sp) data(meuse) library(gstat) g=gstat(NULL, "log-zinc", log(zinc)~1, ~x+y, meuse, nmax=10) g=gstat(g, "log-lead", log(lead)~1, ~x+y, meuse, nmax=10) g=gstat(g, "log-copper", log(copper)~1, ~x+y, meuse, nmax=10) v=variogram(g) g=gstat(g, model=vgm(1, "Sph", 1000), fill.all=T) g=fit.lmc(v, g) g set.seed(13131) summary(gstat.cv(g, remove.all=TRUE, nfold=5)) summary(gstat.cv(g, remove.all=FALSE, nfold=5)) gstat/tests/windst.Rout.save0000644000176200001440000001155515060550314015664 0ustar liggesusers R version 4.5.1 (2025-06-13) -- "Great Square Root" Copyright (C) 2025 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu 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. > suppressPackageStartupMessages(library(sp)) > suppressPackageStartupMessages(library(spacetime)) > suppressPackageStartupMessages(library(gstat)) > suppressPackageStartupMessages(library(stars)) > > Sys.unsetenv("KMP_DEVICE_THREAD_LIMIT") > Sys.unsetenv("KMP_ALL_THREADS") > Sys.unsetenv("KMP_TEAMS_THREAD_LIMIT") > Sys.unsetenv("OMP_THREAD_LIMIT") > > data(wind) > wind.loc$y = as.numeric(char2dms(as.character(wind.loc[["Latitude"]]))) > wind.loc$x = as.numeric(char2dms(as.character(wind.loc[["Longitude"]]))) > coordinates(wind.loc) = ~x+y > proj4string(wind.loc) = "+proj=longlat +datum=WGS84 +ellps=WGS84" > > wind$time = ISOdate(wind$year+1900, wind$month, wind$day) > wind$jday = as.numeric(format(wind$time, '%j')) > stations = 4:15 > windsqrt = sqrt(0.5148 * wind[stations]) # knots -> m/s > Jday = 1:366 > daymeans = colMeans( + sapply(split(windsqrt - colMeans(windsqrt), wind$jday), colMeans)) > meanwind = lowess(daymeans ~ Jday, f = 0.1)$y[wind$jday] > velocities = apply(windsqrt, 2, function(x) { x - meanwind }) > # match order of columns in wind to Code in wind.loc; > # convert to utm zone 29, to be able to do interpolation in > # proper Euclidian (projected) space: > pts = coordinates(wind.loc[match(names(wind[4:15]), wind.loc$Code),]) > pts = SpatialPoints(pts) > if (require(sp, quietly = TRUE) && require(maps, quietly = TRUE)) { + proj4string(pts) = "+proj=longlat +datum=WGS84 +ellps=WGS84" + utm29 = "+proj=utm +zone=29 +datum=WGS84 +ellps=WGS84" + pts = as(st_transform(st_as_sfc(pts), utm29), "Spatial") + # note the t() in: + w = STFDF(pts, wind$time, data.frame(values = as.vector(t(velocities)))) + + library(mapdata) + mp = map("worldHires", xlim = c(-11,-5.4), ylim = c(51,55.5), plot=FALSE) + sf = st_transform(st_as_sf(mp, fill = FALSE), utm29) + m = as(sf, "Spatial") + + # setup grid + grd = SpatialPixels(SpatialPoints(makegrid(m, n = 300)), + proj4string = m@proj4string) + # grd$t = rep(1, nrow(grd)) + #coordinates(grd) = ~x1+x2 + #gridded(grd)=TRUE + + # select april 1961: + w = w[, "1961-04"] + + covfn = function(x, y = x) { + du = spDists(coordinates(x), coordinates(y)) + t1 = as.numeric(index(x)) # time in seconds + t2 = as.numeric(index(y)) # time in seconds + dt = abs(outer(t1, t2, "-")) + # separable, product covariance model: + 0.6 * exp(-du/750000) * exp(-dt / (1.5 * 3600 * 24)) + } + + n = 10 + tgrd = seq(min(index(w)), max(index(w)), length=n) + pred = krige0(sqrt(values)~1, w, STF(grd, tgrd), covfn) + layout = list(list("sp.points", pts, first=F, cex=.5), + list("sp.lines", m, col='grey')) + wind.pr0 = STFDF(grd, tgrd, data.frame(var1.pred = pred)) + + v = vgmST("separable", + space = vgm(1, "Exp", 750000), + time = vgm(1, "Exp", 1.5 * 3600 * 24), + sill = 0.6) + wind.ST = krigeST(sqrt(values)~1, w, STF(grd, tgrd), v) + + all.equal(wind.pr0, wind.ST) + + # stars: + df = data.frame(a = rep(NA, 324*10)) + s = STF(grd, tgrd) + newd = addAttrToGeom(s, df) + wind.sta = krigeST(sqrt(values)~1, st_as_stars(w), st_as_stars(newd), v) + # 1 + plot(stars::st_as_stars(wind.ST), breaks = "equal", col = sf.colors()) + # 2 + stplot(wind.ST) + # 3 + plot(wind.sta, breaks = "equal", col = sf.colors()) + st_as_stars(wind.ST)[[1]][1:3,1:3,1] + (wind.sta)[[1]][1:3,1:3,1] + st_bbox(wind.sta) + bbox(wind.ST) + all.equal(wind.sta, stars::st_as_stars(wind.ST), check.attributes = FALSE) + + # 4: roundtrip wind.sta->STFDF->stars + rt = stars::st_as_stars(as(wind.sta, "STFDF")) + plot(rt, breaks = "equal", col = sf.colors()) + # 5: + stplot(as(wind.sta, "STFDF")) + st_bbox(rt) + + # 6: + stplot(as(st_as_stars(wind.ST), "STFDF")) + } Warning messages: 1: In krigeST(sqrt(values) ~ 1, w, STF(grd, tgrd), v) : The spatio-temporal variogram model does not carry the strongly recommended attribute 'temporal unit'. The unit 'secs' has been assumed. krigeST could not check whether the temporal distances between locations and in the variogram coincide. 2: In krigeST(sqrt(values) ~ 1, st_as_stars(w), st_as_stars(newd), : The spatio-temporal variogram model does not carry the strongly recommended attribute 'temporal unit'. The unit 'secs' has been assumed. krigeST could not check whether the temporal distances between locations and in the variogram coincide. > > proc.time() user system elapsed 4.184 6.669 3.573 gstat/tests/variogram.Rout.save0000644000176200001440000000515215060550314016337 0ustar liggesusers R version 3.0.1 (2013-05-16) -- "Good Sport" Copyright (C) 2013 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(sp) > library(gstat) > data(meuse) > variogram(log(zinc)~1, ~x+y, meuse) np dist gamma dir.hor dir.ver id 1 57 79.29244 0.1234479 0 0 var1 2 299 163.97367 0.2162185 0 0 var1 3 419 267.36483 0.3027859 0 0 var1 4 457 372.73542 0.4121448 0 0 var1 5 547 478.47670 0.4634128 0 0 var1 6 533 585.34058 0.5646933 0 0 var1 7 574 693.14526 0.5689683 0 0 var1 8 564 796.18365 0.6186769 0 0 var1 9 589 903.14650 0.6471479 0 0 var1 10 543 1011.29177 0.6915705 0 0 var1 11 500 1117.86235 0.7033984 0 0 var1 12 477 1221.32810 0.6038770 0 0 var1 13 452 1329.16407 0.6517158 0 0 var1 14 457 1437.25620 0.5665318 0 0 var1 15 415 1543.20248 0.5748227 0 0 var1 > > coordinates(meuse) <- ~ x + y > variogram(log(zinc)~1, meuse) np dist gamma dir.hor dir.ver id 1 57 79.29244 0.1234479 0 0 var1 2 299 163.97367 0.2162185 0 0 var1 3 419 267.36483 0.3027859 0 0 var1 4 457 372.73542 0.4121448 0 0 var1 5 547 478.47670 0.4634128 0 0 var1 6 533 585.34058 0.5646933 0 0 var1 7 574 693.14526 0.5689683 0 0 var1 8 564 796.18365 0.6186769 0 0 var1 9 589 903.14650 0.6471479 0 0 var1 10 543 1011.29177 0.6915705 0 0 var1 11 500 1117.86235 0.7033984 0 0 var1 12 477 1221.32810 0.6038770 0 0 var1 13 452 1329.16407 0.6517158 0 0 var1 14 457 1437.25620 0.5665318 0 0 var1 15 415 1543.20248 0.5748227 0 0 var1 > > ind=seq(1,155,2) > var1= meuse[ind,] > var2= meuse[-ind,] > g <- gstat(NULL, id = "lead", form = lead ~ 1, data=var1) > g <- gstat(g, id = "zinc", form = zinc ~ 1, data=var2) > v.cross <- variogram(g) > plot(v.cross) > > > proc.time() user system elapsed 1.528 0.076 1.612 gstat/tests/sim.Rout.save0000644000176200001440000000352415060550314015141 0ustar liggesusers R version 3.6.0 (2019-04-26) -- "Planting of a Tree" Copyright (C) 2019 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. > options(digits=6) > library(sp) > data(meuse) > set.seed(158229572) > new.locs <- data.frame(x = c(181170, 180310, 180205, 178673, 178770, 178270), + y = c(333250, 332189, 331707, 330066, 330675, 331075)) > library(gstat) > krige(zinc ~ 1, ~ x + y, meuse, newdata = new.locs, + model = vgm(1.34e5, "Sph", 800, nug = 2.42e4), + block = c(40,40), nmax = 40, nsim = 10) drawing 10 GLS realisations of beta... [using conditional Gaussian simulation] x y sim1 sim2 sim3 sim4 sim5 sim6 sim7 1 181170 333250 267.385 27.5686 428.144 381.576 151.119 175.890 293.273 2 180310 332189 429.437 659.6579 564.023 611.666 612.756 619.791 771.961 3 180205 331707 205.978 412.7276 271.827 380.349 169.488 369.822 266.026 4 178673 330066 117.479 684.0663 399.148 585.096 606.396 867.866 807.634 5 178770 330675 780.072 837.4628 682.690 911.052 600.984 783.019 749.476 6 178270 331075 1025.778 1582.0269 614.235 332.377 660.228 589.447 972.018 sim8 sim9 sim10 1 294.107 113.347 279.991 2 776.498 724.160 901.692 3 338.021 630.244 140.272 4 127.301 957.242 444.007 5 533.773 748.144 623.960 6 1084.170 537.604 -214.972 > > proc.time() user system elapsed 0.467 0.020 0.479 gstat/tests/blockkr.Rout.save0000644000176200001440000000513715060550314016002 0ustar liggesusers R version 3.0.1 (2013-05-16) -- "Good Sport" Copyright (C) 2013 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(sp) > data(meuse) > coordinates(meuse) = c("x", "y") > new.locs <- SpatialPoints(data.frame( + x = c(181170, 180310, 180205, 178673, 178770, 178270), + y = c(333250, 332189, 331707, 330066, 330675, 331075))) > library(gstat) > krige(zinc ~ 1, meuse, new.locs, vgm(1.34e5, "Sph", 800, nug = 2.42e4), + block = c(40,40), nmax = 40) [using ordinary kriging] coordinates var1.pred var1.var 1 (181170, 333250) 268.7576 19447.67 2 (180310, 332189) 663.4915 16991.33 3 (180205, 331707) 251.4606 21579.71 4 (178673, 330066) 532.5776 73807.91 5 (178770, 330675) 664.4039 23589.17 6 (178270, 331075) 565.5436 155113.23 > > new.locs <- SpatialPoints(data.frame(x = c(181170), y = c(333250))) > > disc = c(-15,-5,5,15) > block.irreg <- data.frame(expand.grid(x = disc, y = disc)) > block.irreg x y 1 -15 -15 2 -5 -15 3 5 -15 4 15 -15 5 -15 -5 6 -5 -5 7 5 -5 8 15 -5 9 -15 5 10 -5 5 11 5 5 12 15 5 13 -15 15 14 -5 15 15 5 15 16 15 15 > > # first disable default Gaussian quadrature used for block integration, by > # setting nblockdiscr explicitly: > krige(zinc ~ 1, meuse, new.locs, model = vgm(1.34e5, "Sph", 800, nug = 2.42e4), + block = c(40,40), nmax = 40, set = list(nblockdiscr=4)) [using ordinary kriging] coordinates var1.pred var1.var 1 (181170, 333250) 268.7324 19568.76 > # now pass the same block discretization as block.irreg: > krige(zinc ~ 1, meuse, new.locs, vgm(1.34e5, "Sph", 800, nug = 2.42e4), + block = block.irreg, nmax = 40) [using ordinary kriging] coordinates var1.pred var1.var 1 (181170, 333250) 268.7324 19568.76 > # check weights argument: > block.irreg <- data.frame(expand.grid(x = disc, y = disc), weights = rep(1/16, 16)) > krige(zinc ~ 1, meuse, new.locs, vgm(1.34e5, "Sph", 800, nug = 2.42e4), + block = block.irreg, nmax = 40) [using ordinary kriging] coordinates var1.pred var1.var 1 (181170, 333250) 268.7324 19568.76 > > proc.time() user system elapsed 1.080 0.056 1.139 gstat/tests/line.Rout.save0000644000176200001440000001066515060550314015304 0ustar liggesusers R version 4.2.3 (2023-03-15) -- "Shortstop Beagle" 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. > options(digits=5) > library(sp) > data(meuse.grid) > gridded(meuse.grid) = ~x+y > data(meuse) > coordinates(meuse) = ~x+y > > # choose arbitrary line over the grid: > image(meuse.grid["dist"],axes=T) > pp = rbind(c(180000,331000),c(180000,332000),c(181000,333500)) > Sl = SpatialLines(list(Lines(list(Line(pp)), "a"))) > plot(Sl,add=T,col='green') > > # use the default spsample arguments of predict.gstat: > pts=spsample(Sl,n=500,'regular',offset=c(.5,.5)) > plot(pts, pch=3, cex=.2, add=T) > > library(gstat) > v = vgm(.6, "Sph", 900, .06) > out1 = krige(log(zinc)~1, meuse, Sl, v) [using ordinary kriging] > out1 An object of class "SpatialLinesDataFrame" Slot "data": x y var1.pred var1.var a 180333 332167 6.1618 0.008025 Slot "lines": [[1]] An object of class "Lines" Slot "Lines": [[1]] An object of class "Line" Slot "coords": [,1] [,2] [1,] 180000 331000 [2,] 180000 332000 [3,] 181000 333500 Slot "ID": [1] "a" Slot "bbox": min max x 180000 181000 y 331000 333500 Slot "proj4string": Coordinate Reference System: Deprecated Proj.4 representation: NA > > points(180333,332167,pch=3,cex=2) > > # use the same line as block discretization, and predict for (0,0) > # (because the block discretizing points are not centered) > out2 = krige(log(zinc)~1, meuse, SpatialPoints(matrix(0,1,2)), v, block=coordinates(pts)) [using ordinary kriging] > out2 coordinates var1.pred var1.var 1 (0, 0) 6.1618 0.008025 > > compare.krigingLines = function(formula, data, newdata, model) { + out1 = krige(formula, data, newdata, model) + pts = spsample(newdata, n=500, 'regular', offset=.5) + out2 = krige(formula, data, SpatialPoints(matrix(0,1,2)), model, block = coordinates(pts)) + print("difference:") + as.data.frame(out1)[3:4]- as.data.frame(out2)[3:4] + } > > compare.krigingLines(log(zinc)~1, meuse, Sl, v) [using ordinary kriging] [using ordinary kriging] [1] "difference:" var1.pred var1.var a 0 0 > > # one line, consisting of two line segments: > pp2 = rbind(c(181000,333500),c(181000,332500)) > Sl2 = SpatialLines(list(Lines(list(Line(pp),Line(pp2)), "a"))) > krige(log(zinc)~1, meuse, Sl2, v) [using ordinary kriging] An object of class "SpatialLinesDataFrame" Slot "data": x y var1.pred var1.var a 180667 332583 6.0424 0.0053191 Slot "lines": [[1]] An object of class "Lines" Slot "Lines": [[1]] An object of class "Line" Slot "coords": [,1] [,2] [1,] 180000 331000 [2,] 180000 332000 [3,] 181000 333500 [[2]] An object of class "Line" Slot "coords": [,1] [,2] [1,] 181000 333500 [2,] 181000 332500 Slot "ID": [1] "a" Slot "bbox": min max x 180000 181000 y 331000 333500 Slot "proj4string": Coordinate Reference System: Deprecated Proj.4 representation: NA > compare.krigingLines(log(zinc)~1, meuse, Sl2, v) [using ordinary kriging] [using ordinary kriging] [1] "difference:" var1.pred var1.var a 0 0 > > # two seperate line segments: > Sl3 = SpatialLines(list(Lines(list(Line(pp)), "a"),Lines(list(Line(pp2)),"b"))) > krige(log(zinc)~1, meuse, Sl3, v) [using ordinary kriging] An object of class "SpatialLinesDataFrame" Slot "data": x y var1.pred var1.var a 180333 332167 6.1618 0.008025 b 181000 333000 5.7060 0.011043 Slot "lines": [[1]] An object of class "Lines" Slot "Lines": [[1]] An object of class "Line" Slot "coords": [,1] [,2] [1,] 180000 331000 [2,] 180000 332000 [3,] 181000 333500 Slot "ID": [1] "a" [[2]] An object of class "Lines" Slot "Lines": [[1]] An object of class "Line" Slot "coords": [,1] [,2] [1,] 181000 333500 [2,] 181000 332500 Slot "ID": [1] "b" Slot "bbox": min max x 180000 181000 y 331000 333500 Slot "proj4string": Coordinate Reference System: Deprecated Proj.4 representation: NA > > proc.time() user system elapsed 1.703 2.198 1.248 gstat/tests/line.R0000644000176200001440000000305115060550314013606 0ustar liggesusersoptions(digits=5) library(sp) data(meuse.grid) gridded(meuse.grid) = ~x+y data(meuse) coordinates(meuse) = ~x+y # choose arbitrary line over the grid: image(meuse.grid["dist"],axes=T) pp = rbind(c(180000,331000),c(180000,332000),c(181000,333500)) Sl = SpatialLines(list(Lines(list(Line(pp)), "a"))) plot(Sl,add=T,col='green') # use the default spsample arguments of predict.gstat: pts=spsample(Sl,n=500,'regular',offset=c(.5,.5)) plot(pts, pch=3, cex=.2, add=T) library(gstat) v = vgm(.6, "Sph", 900, .06) out1 = krige(log(zinc)~1, meuse, Sl, v) out1 points(180333,332167,pch=3,cex=2) # use the same line as block discretization, and predict for (0,0) # (because the block discretizing points are not centered) out2 = krige(log(zinc)~1, meuse, SpatialPoints(matrix(0,1,2)), v, block=coordinates(pts)) out2 compare.krigingLines = function(formula, data, newdata, model) { out1 = krige(formula, data, newdata, model) pts = spsample(newdata, n=500, 'regular', offset=.5) out2 = krige(formula, data, SpatialPoints(matrix(0,1,2)), model, block = coordinates(pts)) print("difference:") as.data.frame(out1)[3:4]- as.data.frame(out2)[3:4] } compare.krigingLines(log(zinc)~1, meuse, Sl, v) # one line, consisting of two line segments: pp2 = rbind(c(181000,333500),c(181000,332500)) Sl2 = SpatialLines(list(Lines(list(Line(pp),Line(pp2)), "a"))) krige(log(zinc)~1, meuse, Sl2, v) compare.krigingLines(log(zinc)~1, meuse, Sl2, v) # two seperate line segments: Sl3 = SpatialLines(list(Lines(list(Line(pp)), "a"),Lines(list(Line(pp2)),"b"))) krige(log(zinc)~1, meuse, Sl3, v) gstat/tests/rings.R0000644000176200001440000000624415060550314014010 0ustar liggesuserslibrary(sp) library(gstat) set.seed(13331) x = runif(10) y = runif(10) z = rnorm(10) d = data.frame(x=x,y=y,z=z) bl = c(1,1) nd = data.frame(x=.5, y=.5) # single block: library(sp) coordinates(d) = ~x+y nd = SpatialPoints(nd) xx = krige(z~1, d, nd, model=vgm(1, "Exp", 1), block = bl, set = list(nb=4)) ring = cbind(c(0,bl[1],bl[1],0,0), c(0,0,bl[2],bl[2],0)) r1 = SpatialPolygons(list(Polygons(list(Polygon(ring)), ID = "xx"))) a = data.frame(a = 1, b = 2) rownames(a) = "xx" r1df = SpatialPolygonsDataFrame(r1, a) g = gstat(formula=z~1, data=d, model=vgm(1, "Exp", 1)) args = list(type = "regular", n=16, offset=c(0.5,0.5)) yy = predict(g, r1df, block = bl, sps.args = args) xx = as.data.frame(xx) yy = as.data.frame(yy) row.names(xx) = row.names(yy) print(all.equal(xx,yy)) ## multiple blocks of equal size: nd = data.frame(x= 0:4 + .5, y=rep(.5,5)) nd = SpatialPoints(nd) xx = krige(z~1, d, nd, model=vgm(1, "Exp", 1), block = bl, set = list(nb=4)) ring0 = cbind(c(0,bl[1],bl[1],0,0), c(0,0,bl[2],bl[2],0)) ring1 = cbind(c(1+0,1+bl[1],1+bl[1],1+0,1+0), c(0,0,bl[2],bl[2],0)) ring2 = cbind(c(2+0,2+bl[1],2+bl[1],2+0,2+0), c(0,0,bl[2],bl[2],0)) ring3 = cbind(c(3+0,3+bl[1],3+bl[1],3+0,3+0), c(0,0,bl[2],bl[2],0)) ring4 = cbind(c(4+0,4+bl[1],4+bl[1],4+0,4+0), c(0,0,bl[2],bl[2],0)) r1 = SpatialPolygons(list( Polygons(list(Polygon(ring0)), ID = "x0"), Polygons(list(Polygon(ring1)), ID = "x1"), Polygons(list(Polygon(ring2)), ID = "x2"), Polygons(list(Polygon(ring3)), ID = "x3"), Polygons(list(Polygon(ring4)), ID = "x4") )) df = data.frame(a=rep(1,5), b= rep(1,5)) rownames(df) = c("x0", "x1", "x2", "x3", "x4") r1df = SpatialPolygonsDataFrame(r1, df) yy = predict(g, r1, block = bl, sps.args = args) xx = as.data.frame(xx) yy = as.data.frame(yy) row.names(xx) = row.names(yy) all.equal(xx, yy) ## multiple blocks of equal size: args = list(type = "regular", cellsize=.25, offset=c(0.5,0.5), n=16) yy = predict(g, r1, block = bl, sps.args = args) xx = as.data.frame(xx) yy = as.data.frame(yy) row.names(xx) = row.names(yy) print(all.equal(xx, yy)) ## multiple blocks of varying size: nd = data.frame(x=c(0.5, 2, 4.5), y=c(0.5, 1, 1.5)) nd = SpatialPoints(nd) bl = c(1,1) ring0 = cbind(c(0,bl[1],bl[1],0,0), c(0,0,bl[2],bl[2],0)) xx1 = krige(z~1, d, nd[1], model=vgm(1, "Exp", 1), block = bl, set = list(nb=4)) bl = c(2,2) ring1 = cbind(c(1+0,1+bl[1],1+bl[1],1+0,1+0), c(0,0,bl[2],bl[2],0)) xx2 = krige(z~1, d, nd[2], model=vgm(1, "Exp", 1), block = bl, set = list(nb=4)) bl = c(3,3) ring2 = cbind(c(3+0,3+bl[1],3+bl[1],3+0,3+0), c(0,0,bl[2],bl[2],0)) xx3 = krige(z~1, d, nd[3], model=vgm(1, "Exp", 1), block = bl, set = list(nb=4)) r1 = SpatialPolygons(list( Polygons(list(Polygon(ring0)), ID = "x0"), Polygons(list(Polygon(ring1)), ID = "x1"), Polygons(list(Polygon(ring2)), ID = "x2") )) df = data.frame(a = rep(1,3), b = rep(1,3)) rownames(df) = c("x0", "x1", "x2") r1df = SpatialPolygonsDataFrame(r1, df) args = list(type = "regular", n=16, offset=c(0.5,0.5)) yy = predict(g, r1df, block = bl, sps.args = args) xx = rbind(as.data.frame(xx1), as.data.frame(xx2), as.data.frame(xx3)) row.names(xx) = 1:3 xx = as.data.frame(xx) yy = as.data.frame(yy) row.names(xx) = row.names(yy) print(all.equal(xx, yy)) gstat/tests/allier.Rout.save0000644000176200001440000003040415060550314015616 0ustar liggesusers R version 4.2.0 (2022-04-22) -- "Vigorous Calisthenics" Copyright (C) 2022 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. > # Sytze de Bruin's post to r-sig-geo, Nov 16, 2015: > library(sp) > library(gstat) > > # some data > x <- c(215, 330, 410, 470, 545) > y <- c(230, 310, 330, 340, 365) > fc <- c(0.211, 0.251, 0.281, 0.262, 0.242) > por <- c(0.438, 0.457, 0.419, 0.430, 0.468) > Allier <- data.frame(x, y, fc, por) > coordinates(Allier) = ~x+y > > # gstat object for co-kriging using linear model of co-regionalization > g <- gstat(id=c("fc"), formula=fc~1, data=Allier, + model=vgm(0.00247, "Sph", 480, 0.00166)) > g <- gstat(g, id="por", formula=por~1, data=Allier, + model=vgm(0.00239, "Sph", 480, 0.00118)) > g <- gstat(g, id=c("fc", "por"), + model=vgm(0.00151, "Sph", 480, -0.00124)) > > # predict at single point > g$set = list(choleski = 0) # LDL' > A <- predict(g, SpatialPoints(data.frame(x=450, y=350)), debug = 32) Linear Model of Coregionalization found. Good. [using ordinary cokriging] we're at location X: 450 Y: 350 Z: 0 zero block size we're at point X: 450 Y: 350 Z: 0 # X: #Matrix: 10 by 2 rbind( c( 1.000000, 0.000000), # row 1 c( 1.000000, 0.000000), # row 2 c( 1.000000, 0.000000), # row 3 c( 1.000000, 0.000000), # row 4 c( 1.000000, 0.000000), # row 5 c( 0.000000, 1.000000), # row 6 c( 0.000000, 1.000000), # row 7 c( 0.000000, 1.000000), # row 8 c( 0.000000, 1.000000), # row 9 c( 0.000000, 1.000000) # row 10 ) [using generalized covariances: max_val - semivariance()] # Covariances (x_i, x_j) matrix C (upper triangle): #Matrix: 10 by 10 rbind( c( 0.004130, 0.001419, 0.000896, 0.000566, 0.000224, 0.000270, 0.000868, 0.000548, 0.000346, 0.000137), # row 1 c( 0.001419, 0.004130, 0.001840, 0.001398, 0.000879, 0.000868, 0.000270, 0.001125, 0.000854, 0.000537), # row 2 c( 0.000896, 0.001840, 0.004130, 0.002003, 0.001424, 0.000548, 0.001125, 0.000270, 0.001225, 0.000870), # row 3 c( 0.000566, 0.001398, 0.002003, 0.004130, 0.001865, 0.000346, 0.000854, 0.001225, 0.000270, 0.001140), # row 4 c( 0.000224, 0.000879, 0.001424, 0.001865, 0.004130, 0.000137, 0.000537, 0.000870, 0.001140, 0.000270), # row 5 c( 0.000270, 0.000868, 0.000548, 0.000346, 0.000137, 0.003570, 0.001373, 0.000867, 0.000547, 0.000217), # row 6 c( 0.000868, 0.000270, 0.001125, 0.000854, 0.000537, 0.001373, 0.003570, 0.001780, 0.001352, 0.000851), # row 7 c( 0.000548, 0.001125, 0.000270, 0.001225, 0.000870, 0.000867, 0.001780, 0.003570, 0.001938, 0.001378), # row 8 c( 0.000346, 0.000854, 0.001225, 0.000270, 0.001140, 0.000547, 0.001352, 0.001938, 0.003570, 0.001805), # row 9 c( 0.000137, 0.000537, 0.000870, 0.001140, 0.000270, 0.000217, 0.000851, 0.001378, 0.001805, 0.003570) # row 10 ) # glm->C, LDL' decomposed:: #Matrix: 10 by 10 rbind( c( 0.003399, 0.372269, 0.208612, 0.127967, 0.016746, -0.025847, 0.223862, 0.148767, 0.104047, 0.038371), # row 1 c( 0.000000, 0.002661, 0.483725, 0.327484, 0.153742, 0.233021, -0.125118, 0.262410, 0.219271, 0.150536), # row 2 c( 0.000000, 0.000000, 0.002276, 0.540203, 0.303585, 0.058071, 0.314376, -0.175899, 0.295181, 0.243817), # row 3 c( 0.000000, 0.000000, 0.000000, 0.002484, 0.483068, 0.000301, 0.115816, 0.377362, -0.115338, 0.319418), # row 4 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.003690, -0.038142, 0.000474, 0.120915, 0.377730, 0.075630), # row 5 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.003019, 0.354325, 0.235465, 0.164684, 0.060733), # row 6 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.002623, 0.415337, 0.347059, 0.238266), # row 7 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.002458, 0.467207, 0.385909), # row 8 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.002658, 0.505569), # row 9 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.003570) # row 10 ) # X'C-1 X: #Matrix: 2 by 2 rbind( c(665.433994, -232.313340), # row 1 c(-232.313340, 729.440848) # row 2 ) # beta: #Vector: dim: 2 c( 0.244216, 0.440933) # Cov(beta), (X'C-1 X)-1: #Matrix: 2 by 2 rbind( c( 0.001691, 0.000538), # row 1 c( 0.000538, 0.001542) # row 2 ) # Corr(beta): #Matrix: 2 by 2 rbind( c( 1.000000, 0.333447), # row 1 c( 0.333447, 1.000000) # row 2 ) # X0 (X values at prediction location x0): #Matrix: 2 by 2 rbind( c( 1.000000, 0.000000), # row 1 c( 0.000000, 1.000000) # row 2 ) # BLUE(mu), E(y(x0)) = X0'beta: #Vector: dim: 2 c( 0.244216, 0.440933) # Covariances (x_i, x_0), C0: #Matrix: 10 by 2 rbind( c( 0.000638, 0.000390), # row 1 c( 0.001516, 0.000927), # row 2 c( 0.002126, 0.001300), # row 3 c( 0.002298, 0.001405), # row 4 c( 0.001738, 0.001062), # row 5 c( 0.000390, 0.000618), # row 6 c( 0.000927, 0.001467), # row 7 c( 0.001300, 0.002057), # row 8 c( 0.001405, 0.002223), # row 9 c( 0.001062, 0.001681) # row 10 ) # C-1 C0: #Matrix: 10 by 2 rbind( c( 0.008927, -0.017995), # row 1 c( 0.061935, -0.028550), # row 2 c( 0.225195, 0.078344), # row 3 c( 0.356735, 0.190177), # row 4 c( 0.094128, -0.023136), # row 5 c(-0.021119, 0.004935), # row 6 c(-0.033508, 0.055601), # row 7 c( 0.091947, 0.242576), # row 8 c( 0.223200, 0.398927), # row 9 c(-0.027153, 0.088995) # row 10 ) # [a] Cov_ij(B,B) or Cov_ij(0,0): #Matrix: 2 by 2 rbind( c( 0.004130, 0.000270), # row 1 c( 0.000270, 0.003570) # row 2 ) # [c] (x0-X'C-1 c0)'(X'C-1 X)-1(x0-X'C-1 c0): #Matrix: 2 by 2 rbind( c( 0.000129, -0.000107), # row 1 c(-0.000107, 0.000089) # row 2 ) # [b] c0'C-1 c0: #Matrix: 2 by 2 rbind( c( 0.001926, 0.001532), # row 1 c( 0.001532, 0.001931) # row 2 ) # Best Linear Unbiased Predictor: #Vector: dim: 2 c( 0.253090, 0.441258) # MSPE ([a]-[b]+[c]): #Matrix: 2 by 2 rbind( c( 0.002332, -0.001369), # row 1 c(-0.001369, 0.001729) # row 2 ) # kriging weights: #Matrix: 10 by 2 rbind( c( 0.071177, -0.064988), # row 1 c( 0.108451, -0.066123), # row 2 c( 0.268160, 0.043141), # row 3 c( 0.401959, 0.153312), # row 4 c( 0.150253, -0.065342), # row 5 c(-0.076273, 0.056759), # row 6 c(-0.077605, 0.093781), # row 7 c( 0.050632, 0.277731), # row 8 c( 0.179933, 0.435972), # row 9 c(-0.076688, 0.135756) # row 10 ) > g$set = list(choleski = 1) # Choleski > B <- predict(g, SpatialPoints(data.frame(x=450, y=350)), debug = 32) Linear Model of Coregionalization found. Good. [using ordinary cokriging] we're at location X: 450 Y: 350 Z: 0 zero block size we're at point X: 450 Y: 350 Z: 0 # X: #Matrix: 10 by 2 rbind( c( 1.000000, 0.000000), # row 1 c( 1.000000, 0.000000), # row 2 c( 1.000000, 0.000000), # row 3 c( 1.000000, 0.000000), # row 4 c( 1.000000, 0.000000), # row 5 c( 0.000000, 1.000000), # row 6 c( 0.000000, 1.000000), # row 7 c( 0.000000, 1.000000), # row 8 c( 0.000000, 1.000000), # row 9 c( 0.000000, 1.000000) # row 10 ) [using generalized covariances: max_val - semivariance()] # Covariances (x_i, x_j) matrix C (upper triangle): #Matrix: 10 by 10 rbind( c( 0.004130, 0.001419, 0.000896, 0.000566, 0.000224, 0.000270, 0.000868, 0.000548, 0.000346, 0.000137), # row 1 c( 0.001419, 0.004130, 0.001840, 0.001398, 0.000879, 0.000868, 0.000270, 0.001125, 0.000854, 0.000537), # row 2 c( 0.000896, 0.001840, 0.004130, 0.002003, 0.001424, 0.000548, 0.001125, 0.000270, 0.001225, 0.000870), # row 3 c( 0.000566, 0.001398, 0.002003, 0.004130, 0.001865, 0.000346, 0.000854, 0.001225, 0.000270, 0.001140), # row 4 c( 0.000224, 0.000879, 0.001424, 0.001865, 0.004130, 0.000137, 0.000537, 0.000870, 0.001140, 0.000270), # row 5 c( 0.000270, 0.000868, 0.000548, 0.000346, 0.000137, 0.003570, 0.001373, 0.000867, 0.000547, 0.000217), # row 6 c( 0.000868, 0.000270, 0.001125, 0.000854, 0.000537, 0.001373, 0.003570, 0.001780, 0.001352, 0.000851), # row 7 c( 0.000548, 0.001125, 0.000270, 0.001225, 0.000870, 0.000867, 0.001780, 0.003570, 0.001938, 0.001378), # row 8 c( 0.000346, 0.000854, 0.001225, 0.000270, 0.001140, 0.000547, 0.001352, 0.001938, 0.003570, 0.001805), # row 9 c( 0.000137, 0.000537, 0.000870, 0.001140, 0.000270, 0.000217, 0.000851, 0.001378, 0.001805, 0.003570) # row 10 ) # glm->C, Choleski decomposed:: #Matrix: 10 by 10 rbind( c( 0.064265, 0.022086, 0.013942, 0.008801, 0.003487, 0.004201, 0.013502, 0.008523, 0.005380, 0.002132), # row 1 c( 0.000000, 0.060351, 0.025382, 0.019938, 0.013290, 0.012840, -0.000468, 0.015517, 0.012189, 0.008125), # row 2 c( 0.000000, 0.000000, 0.057370, 0.023954, 0.018091, 0.002846, 0.016530, -0.004230, 0.014644, 0.011059), # row 3 c( 0.000000, 0.000000, 0.000000, 0.055509, 0.020471, -0.000277, 0.006286, 0.016960, -0.006686, 0.012514), # row 4 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.056523, -0.001665, 0.001218, 0.006437, 0.014711, -0.005337), # row 5 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.058108, 0.022018, 0.011347, 0.006008, 0.001147), # row 6 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.050877, 0.027084, 0.018381, 0.010720), # row 7 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.045247, 0.026914, 0.017658), # row 8 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.042645, 0.023811), # row 9 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.046872) # row 10 ) # X'C-1 X: #Matrix: 2 by 2 rbind( c(665.433994, -232.313340), # row 1 c(-232.313340, 729.440848) # row 2 ) # beta: #Vector: dim: 2 c( 0.244216, 0.440933) # Cov(beta), (X'C-1 X)-1: #Matrix: 2 by 2 rbind( c( 0.001691, 0.000538), # row 1 c( 0.000538, 0.001542) # row 2 ) # Corr(beta): #Matrix: 2 by 2 rbind( c( 1.000000, 0.333447), # row 1 c( 0.333447, 1.000000) # row 2 ) # X0 (X values at prediction location x0): #Matrix: 2 by 2 rbind( c( 1.000000, 0.000000), # row 1 c( 0.000000, 1.000000) # row 2 ) # BLUE(mu), E(y(x0)) = X0'beta: #Vector: dim: 2 c( 0.244216, 0.440933) # Covariances (x_i, x_0), C0: #Matrix: 10 by 2 rbind( c( 0.000638, 0.000390), # row 1 c( 0.001516, 0.000927), # row 2 c( 0.002126, 0.001300), # row 3 c( 0.002298, 0.001405), # row 4 c( 0.001738, 0.001062), # row 5 c( 0.000390, 0.000618), # row 6 c( 0.000927, 0.001467), # row 7 c( 0.001300, 0.002057), # row 8 c( 0.001405, 0.002223), # row 9 c( 0.001062, 0.001681) # row 10 ) # C-1 C0: #Matrix: 10 by 2 rbind( c( 0.008927, -0.017995), # row 1 c( 0.061935, -0.028550), # row 2 c( 0.225195, 0.078344), # row 3 c( 0.356735, 0.190177), # row 4 c( 0.094128, -0.023136), # row 5 c(-0.021119, 0.004935), # row 6 c(-0.033508, 0.055601), # row 7 c( 0.091947, 0.242576), # row 8 c( 0.223200, 0.398927), # row 9 c(-0.027153, 0.088995) # row 10 ) # [a] Cov_ij(B,B) or Cov_ij(0,0): #Matrix: 2 by 2 rbind( c( 0.004130, 0.000270), # row 1 c( 0.000270, 0.003570) # row 2 ) # [c] (x0-X'C-1 c0)'(X'C-1 X)-1(x0-X'C-1 c0): #Matrix: 2 by 2 rbind( c( 0.000129, -0.000107), # row 1 c(-0.000107, 0.000089) # row 2 ) # [b] c0'C-1 c0: #Matrix: 2 by 2 rbind( c( 0.001926, 0.001532), # row 1 c( 0.001532, 0.001931) # row 2 ) # Best Linear Unbiased Predictor: #Vector: dim: 2 c( 0.253090, 0.441258) # MSPE ([a]-[b]+[c]): #Matrix: 2 by 2 rbind( c( 0.002332, -0.001369), # row 1 c(-0.001369, 0.001729) # row 2 ) # kriging weights: #Matrix: 10 by 2 rbind( c( 0.071177, -0.064988), # row 1 c( 0.108451, -0.066123), # row 2 c( 0.268160, 0.043141), # row 3 c( 0.401959, 0.153312), # row 4 c( 0.150253, -0.065342), # row 5 c(-0.076273, 0.056759), # row 6 c(-0.077605, 0.093781), # row 7 c( 0.050632, 0.277731), # row 8 c( 0.179933, 0.435972), # row 9 c(-0.076688, 0.135756) # row 10 ) > all.equal(A,B) [1] TRUE > > # TRUE > > proc.time() user system elapsed 0.576 0.056 0.625 gstat/tests/fit.R0000644000176200001440000000034715060550314013446 0ustar liggesuserslibrary(sp) data(meuse) library(gstat) v=variogram(log(zinc)~1,~x+y,meuse,cutoff=500,wi=100) v$gamma=c(0.5,1,2,3,3) fit.variogram(v, vgm(1, "Sph", 300, 0),warn.if.neg=TRUE) fit.variogram(v, vgm(1, "Sph", 300, 0),warn.if.neg=FALSE) gstat/tests/krige0.Rout.save0000644000176200001440000000367515060550314015541 0ustar liggesusers R version 3.0.2 (2013-09-25) -- "Frisbee Sailing" Copyright (C) 2013 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 -- load data: > library(sp) > data(meuse) > coordinates(meuse) = ~x+y > data(meuse.grid) > gridded(meuse.grid) = ~x+y > > library(gstat) > # test -- idw > meuse.grid$idw <- idw0(zinc~1, meuse, meuse.grid)[,1] > x <- idw(zinc~1, meuse, meuse.grid) [inverse distance weighted interpolation] > all.equal(x$var1.pred, meuse.grid$idw) [1] TRUE > spplot(meuse.grid["idw"],col.regions=bpy.colors()) > v = vgm(1, "Exp", 500) > # test sk: > x0 <- krige0(zinc~1, meuse, meuse.grid, v, beta = 500, computeVar = TRUE) > rownames(x0$pred)=NULL > x <- krige(zinc~1, meuse, meuse.grid, v, beta = 500) [using simple kriging] > all.equal(x$var1.pred, x0$pred[,1]) [1] TRUE > all.equal(x$var1.var, x0$var) [1] TRUE > # test ok: > x0 <- krige0(zinc~1, meuse, meuse.grid, v, computeVar = TRUE) > rownames(x0$pred)=NULL > names(x0$var)=NULL > x <- krige(zinc~1, meuse, meuse.grid, v) [using ordinary kriging] > all.equal(x$var1.pred, x0$pred[,1]) [1] TRUE > all.equal(x$var1.var, x0$var) [1] TRUE > # test uk: > x0 <- krige0(zinc~sqrt(dist), meuse, meuse.grid, v, computeVar = TRUE) > rownames(x0$pred)=NULL > names(x0$var)=NULL > x <- krige(zinc~sqrt(dist), meuse, meuse.grid, v) [using universal kriging] > all.equal(x$var1.pred, x0$pred[,1]) [1] TRUE > all.equal(x$var1.var, x0$var) [1] TRUE > > proc.time() user system elapsed 3.424 0.064 3.490 gstat/tests/rings.Rout.save0000644000176200001440000001044715060550314015475 0ustar liggesusers R version 3.0.1 (2013-05-16) -- "Good Sport" Copyright (C) 2013 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(sp) > library(gstat) > set.seed(13331) > > x = runif(10) > y = runif(10) > z = rnorm(10) > d = data.frame(x=x,y=y,z=z) > bl = c(1,1) > > nd = data.frame(x=.5, y=.5) > > # single block: > library(sp) > coordinates(d) = ~x+y > nd = SpatialPoints(nd) > xx = krige(z~1, d, nd, model=vgm(1, "Exp", 1), block = bl, + set = list(nb=4)) [using ordinary kriging] > > ring = cbind(c(0,bl[1],bl[1],0,0), c(0,0,bl[2],bl[2],0)) > r1 = SpatialPolygons(list(Polygons(list(Polygon(ring)), ID = "xx"))) > a = data.frame(a = 1, b = 2) > rownames(a) = "xx" > r1df = SpatialPolygonsDataFrame(r1, a) > > g = gstat(formula=z~1, data=d, model=vgm(1, "Exp", 1)) > args = list(type = "regular", n=16, offset=c(0.5,0.5)) > yy = predict(g, r1df, block = bl, sps.args = args) [using ordinary kriging] > > xx = as.data.frame(xx) > yy = as.data.frame(yy) > row.names(xx) = row.names(yy) > print(all.equal(xx,yy)) [1] TRUE > > ## multiple blocks of equal size: > nd = data.frame(x= 0:4 + .5, y=rep(.5,5)) > nd = SpatialPoints(nd) > xx = krige(z~1, d, nd, model=vgm(1, "Exp", 1), block = bl, + set = list(nb=4)) [using ordinary kriging] > ring0 = cbind(c(0,bl[1],bl[1],0,0), c(0,0,bl[2],bl[2],0)) > ring1 = cbind(c(1+0,1+bl[1],1+bl[1],1+0,1+0), c(0,0,bl[2],bl[2],0)) > ring2 = cbind(c(2+0,2+bl[1],2+bl[1],2+0,2+0), c(0,0,bl[2],bl[2],0)) > ring3 = cbind(c(3+0,3+bl[1],3+bl[1],3+0,3+0), c(0,0,bl[2],bl[2],0)) > ring4 = cbind(c(4+0,4+bl[1],4+bl[1],4+0,4+0), c(0,0,bl[2],bl[2],0)) > r1 = SpatialPolygons(list( + Polygons(list(Polygon(ring0)), ID = "x0"), + Polygons(list(Polygon(ring1)), ID = "x1"), + Polygons(list(Polygon(ring2)), ID = "x2"), + Polygons(list(Polygon(ring3)), ID = "x3"), + Polygons(list(Polygon(ring4)), ID = "x4") + )) > df = data.frame(a=rep(1,5), b= rep(1,5)) > rownames(df) = c("x0", "x1", "x2", "x3", "x4") > r1df = SpatialPolygonsDataFrame(r1, df) > > yy = predict(g, r1, block = bl, sps.args = args) [using ordinary kriging] > xx = as.data.frame(xx) > yy = as.data.frame(yy) > row.names(xx) = row.names(yy) > all.equal(xx, yy) [1] TRUE > > ## multiple blocks of equal size: > args = list(type = "regular", cellsize=.25, offset=c(0.5,0.5), n=16) > yy = predict(g, r1, block = bl, sps.args = args) [using ordinary kriging] > xx = as.data.frame(xx) > yy = as.data.frame(yy) > row.names(xx) = row.names(yy) > print(all.equal(xx, yy)) [1] TRUE > > ## multiple blocks of varying size: > nd = data.frame(x=c(0.5, 2, 4.5), y=c(0.5, 1, 1.5)) > nd = SpatialPoints(nd) > bl = c(1,1) > ring0 = cbind(c(0,bl[1],bl[1],0,0), c(0,0,bl[2],bl[2],0)) > xx1 = krige(z~1, d, nd[1], model=vgm(1, "Exp", 1), block = bl, + set = list(nb=4)) [using ordinary kriging] > bl = c(2,2) > ring1 = cbind(c(1+0,1+bl[1],1+bl[1],1+0,1+0), c(0,0,bl[2],bl[2],0)) > xx2 = krige(z~1, d, nd[2], model=vgm(1, "Exp", 1), block = bl, + set = list(nb=4)) [using ordinary kriging] > bl = c(3,3) > ring2 = cbind(c(3+0,3+bl[1],3+bl[1],3+0,3+0), c(0,0,bl[2],bl[2],0)) > xx3 = krige(z~1, d, nd[3], model=vgm(1, "Exp", 1), block = bl, + set = list(nb=4)) [using ordinary kriging] > r1 = SpatialPolygons(list( + Polygons(list(Polygon(ring0)), ID = "x0"), + Polygons(list(Polygon(ring1)), ID = "x1"), + Polygons(list(Polygon(ring2)), ID = "x2") + )) > df = data.frame(a = rep(1,3), b = rep(1,3)) > rownames(df) = c("x0", "x1", "x2") > r1df = SpatialPolygonsDataFrame(r1, df) > > args = list(type = "regular", n=16, offset=c(0.5,0.5)) > yy = predict(g, r1df, block = bl, sps.args = args) [using ordinary kriging] > xx = rbind(as.data.frame(xx1), as.data.frame(xx2), as.data.frame(xx3)) > row.names(xx) = 1:3 > xx = as.data.frame(xx) > yy = as.data.frame(yy) > row.names(xx) = row.names(yy) > print(all.equal(xx, yy)) [1] TRUE > > proc.time() user system elapsed 1.260 0.024 1.288 gstat/tests/vdist.Rout.save0000644000176200001440000000250215060550314015475 0ustar liggesusers R version 4.4.1 (2024-06-14) -- "Race for Your Life" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu 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(sp) > library(gstat) > > data(meuse) > coordinates(meuse) = ~x+y > data(meuse.grid) > gridded(meuse.grid) = ~x+y > > mg = meuse.grid > gridded(mg) = FALSE > mg= mg[1500,] > krige(log(zinc)~1,meuse,mg,vgm(1, "Exp", 300, anis=c(0,0.01)), + vdist=FALSE, maxdist=1000, nmax = 9) [using ordinary kriging] coordinates var1.pred var1.var 1500 (180260, 331300) 5.024413 1.114475 > > ## IGNORE_RDIFF_BEGIN > krige(log(zinc)~1,meuse,mg,vgm(1, "Exp", 300, anis=c(0,0.01)), + vdist=TRUE, maxdist=1000, nmax = 9) [using ordinary kriging] coordinates var1.pred var1.var 1500 (180260, 331300) 5.568531 1.112945 > ## IGNORE_RDIFF_END > > proc.time() user system elapsed 0.593 1.446 0.532 gstat/tests/vdist.R0000644000176200001440000000062515060550314014014 0ustar liggesuserslibrary(sp) library(gstat) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y mg = meuse.grid gridded(mg) = FALSE mg= mg[1500,] krige(log(zinc)~1,meuse,mg,vgm(1, "Exp", 300, anis=c(0,0.01)), vdist=FALSE, maxdist=1000, nmax = 9) ## IGNORE_RDIFF_BEGIN krige(log(zinc)~1,meuse,mg,vgm(1, "Exp", 300, anis=c(0,0.01)), vdist=TRUE, maxdist=1000, nmax = 9) ## IGNORE_RDIFF_END gstat/tests/stars.R0000644000176200001440000000570215162275253014031 0ustar liggesusersSys.setenv(TZ = "UTC") Sys.unsetenv("KMP_DEVICE_THREAD_LIMIT") Sys.unsetenv("KMP_ALL_THREADS") Sys.unsetenv("KMP_TEAMS_THREAD_LIMIT") Sys.unsetenv("OMP_THREAD_LIMIT") # 0. using sp: suppressPackageStartupMessages(library(sp)) demo(meuse, ask = FALSE) suppressPackageStartupMessages(library(gstat)) v = variogram(log(zinc)~1, meuse) (v.fit = fit.variogram(v, vgm(1, "Sph", 900, 1))) k_sp = krige(log(zinc)~1, meuse[-(1:5),], meuse[1:5,], v.fit) k_sp_grd = krige(log(zinc)~1, meuse, meuse.grid, v.fit) # 1. using sf: suppressPackageStartupMessages(library(sf)) demo(meuse_sf, ask = FALSE, echo = FALSE) # reloads meuse as data.frame, so demo(meuse, ask = FALSE) v = variogram(log(zinc)~1, meuse_sf) (v.fit = fit.variogram(v, vgm(1, "Sph", 900, 1))) k_sf = krige(log(zinc)~1, meuse_sf[-(1:5),], meuse_sf[1:5,], v.fit) all.equal(k_sp, as(k_sf, "Spatial"), check.attributes = FALSE) all.equal(k_sp, as(k_sf, "Spatial"), check.attributes = TRUE) # 2. using stars for grid: suppressPackageStartupMessages(library(stars)) st = st_as_stars(meuse.grid) # compare inputs: sp = as(st, "Spatial") fullgrid(meuse.grid) = TRUE all.equal(sp, meuse.grid["dist"], check.attributes = FALSE) all.equal(sp, meuse.grid["dist"], check.attributes = TRUE, use.names = FALSE) # kriging: st_crs(st) = st_crs(meuse_sf) = NA # GDAL roundtrip messes them up! k_st = if (Sys.getenv("USER") == "travis") { try(krige(log(zinc)~1, meuse_sf, st, v.fit)) } else { krige(log(zinc)~1, meuse_sf, st, v.fit) } k_st # handle factors, when going to stars? k_sp_grd$cls = cut(k_sp_grd$var1.pred, c(0, 5, 6, 7, 8, 9)) if (require(raster, quietly = TRUE)) { print(st_as_stars(raster::stack(k_sp_grd))) # check print(all.equal(st_redimension(st_as_stars(k_sp_grd)), st_as_stars(raster::stack(k_sp_grd)), check.attributes=FALSE)) } suppressPackageStartupMessages(library(spacetime)) tm = as.POSIXct("2019-02-25 15:37:24 CET") n = 4 s = stars:::st_stars(list(foo = array(1:(n^3), rep(n,3))), stars:::create_dimensions(list( x = stars:::create_dimension(from = 1, to = n, offset = 10, delta = 0.5), y = stars:::create_dimension(from = 1, to = n, offset = 0, delta = -0.7), time = stars:::create_dimension(values = tm + 1:n)), raster = stars:::get_raster(dimensions = c("x", "y"))) ) s as.data.frame(s) plot(s, col = sf.colors(), axes = TRUE) (s.stfdf = as(s, "STFDF")) stplot(s.stfdf, scales = list(draw = TRUE)) (s2 = st_as_stars(s.stfdf)) plot(s2, col = sf.colors(), axes = TRUE) all.equal(s, s2, check.attributes = FALSE) # multiple simulations: data(meuse, package = "sp") data(meuse.grid, package = "sp") coordinates(meuse.grid) <- ~x+y gridded(meuse.grid) <- TRUE meuse.grid = st_as_stars(meuse.grid) meuse_sf = st_as_sf(meuse, coords = c("x", "y")) g = gstat(NULL, "zinc", zinc~1, meuse_sf, model = vgm(1, "Exp", 300), nmax = 10) g = gstat(g, "lead", lead~1, meuse_sf, model = vgm(1, "Exp", 300), nmax = 10, fill.cross = TRUE) set.seed(123) ## IGNORE_RDIFF_BEGIN (p = predict(g, meuse.grid, nsim = 5)) ## IGNORE_RDIFF_END gstat/tests/cv.Rout.save0000644000176200001440000001115715060550314014762 0ustar liggesusers R Under development (unstable) (2025-02-03 r87683 ucrt) -- "Unsuffered Consequences" Copyright (C) 2025 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 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. > # try bivariate cokriging; cross validate first variable > library(sp) > data(meuse) > library(gstat) > g=gstat(NULL, "log-zinc", log(zinc)~1, ~x+y, meuse, nmax=10) > g=gstat(g, "log-lead", log(lead)~1, ~x+y, meuse, nmax=10) > g=gstat(g, "log-copper", log(copper)~1, ~x+y, meuse, nmax=10) > v=variogram(g) > g=gstat(g, model=vgm(1, "Sph", 1000), fill.all=T) > g=fit.lmc(v, g) > g data: log-zinc : formula = log(zinc)`~`1 ; data dim = 155 x 12 nmax = 10 log-lead : formula = log(lead)`~`1 ; data dim = 155 x 12 nmax = 10 log-copper : formula = log(copper)`~`1 ; data dim = 155 x 12 nmax = 10 variograms: model psill range log-zinc Sph 0.7132435 1000 log-lead Sph 0.6133020 1000 log-copper Sph 0.3634211 1000 log-zinc.log-lead Sph 0.6367012 1000 log-zinc.log-copper Sph 0.4570044 1000 log-lead.log-copper Sph 0.3934910 1000 ~x + y > set.seed(13131) > summary(gstat.cv(g, remove.all=TRUE, nfold=5)) Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] log.zinc.pred log.zinc.var observed residual Min. :4.779 Min. :0.05426 Min. :4.727 Min. :-1.317697 1st Qu.:5.396 1st Qu.:0.10872 1st Qu.:5.288 1st Qu.:-0.230224 Median :5.858 Median :0.13745 Median :5.787 Median :-0.034374 Mean :5.895 Mean :0.15249 Mean :5.886 Mean :-0.009094 3rd Qu.:6.367 3rd Qu.:0.18303 3rd Qu.:6.514 3rd Qu.: 0.244075 Max. :7.358 Max. :0.60571 Max. :7.517 Max. : 1.414147 zscore fold x y Min. :-3.35764 Min. :1.000 Min. :178605 Min. :329714 1st Qu.:-0.58683 1st Qu.:2.000 1st Qu.:179371 1st Qu.:330762 Median :-0.10755 Median :3.000 Median :179991 Median :331633 Mean :-0.02766 Mean :2.852 Mean :180005 Mean :331635 3rd Qu.: 0.70691 3rd Qu.:4.000 3rd Qu.:180630 3rd Qu.:332463 Max. : 3.43370 Max. :5.000 Max. :181390 Max. :333611 Warning message: In checkNames(value) : attempt to set invalid names: this may lead to problems later on. See ?make.names > summary(gstat.cv(g, remove.all=FALSE, nfold=5)) Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] log.zinc.pred log.zinc.var observed residual Min. :4.644 Min. :0.002371 Min. :4.727 Min. :-0.4190976 1st Qu.:5.308 1st Qu.:0.004975 1st Qu.:5.288 1st Qu.:-0.0773273 Median :5.777 Median :0.005875 Median :5.787 Median : 0.0006165 Mean :5.883 Mean :0.006609 Mean :5.886 Mean : 0.0026164 3rd Qu.:6.422 3rd Qu.:0.007419 3rd Qu.:6.514 3rd Qu.: 0.0825770 Max. :7.676 Max. :0.027247 Max. :7.517 Max. : 0.4659503 zscore fold x y Min. :-4.793253 Min. :1.000 Min. :178605 Min. :329714 1st Qu.:-1.080725 1st Qu.:2.000 1st Qu.:179371 1st Qu.:330762 Median : 0.007242 Median :3.000 Median :179991 Median :331633 Mean : 0.050487 Mean :2.974 Mean :180005 Mean :331635 3rd Qu.: 1.117469 3rd Qu.:4.000 3rd Qu.:180630 3rd Qu.:332463 Max. : 6.475831 Max. :5.000 Max. :181390 Max. :333611 Warning message: In checkNames(value) : attempt to set invalid names: this may lead to problems later on. See ?make.names > > proc.time() user system elapsed 1.31 0.09 1.39 gstat/tests/cv3d.R0000644000176200001440000000031515060550314013516 0ustar liggesusersoptions(digits = 4) set.seed(1131) d = data.frame(x=runif(50),y=runif(50),z=runif(50),v=rnorm(50)) library(gstat) xx = krige.cv(v~1,~x+y+z,d,model=vgm(1,"Exp",1), verbose=F, set=list(debug=0)) summary(xx) gstat/tests/merge.R0000644000176200001440000000151515060550314013761 0ustar liggesusersoptions(digits=6) # illustrates the use of merge, for merging parameters accross variables: # Z1=m+e1(s) # Z2=m+e2(s) # Z1 and Z2 each have a different variogram, but share the parameter m # see documentation of gstat() function library(gstat) d1 = data.frame(x=c(0,2),y=c(0,0),z=c(0,1)) d2 = data.frame(x=c(0,2),y=c(2,2),z=c(4,5)) g = gstat(NULL,"d1", z~1,~x+y,d1,model=vgm(1, "Exp", 1)) g = gstat(g,"d2", z~1,~x+y,d2,model=vgm(1, "Exp", 1), merge=c("d1","d2")) g = gstat(g, c("d1", "d2"), model = vgm(0.5, "Exp", 1)) predict(g, data.frame(x=1,y=1), debug = 32) # Z1 and Z2 share a regression slope: g = gstat(NULL,"d1", z~x,~x+y,d1,model=vgm(1, "Exp", 1)) g = gstat(g,"d2", z~x,~x+y,d2,model=vgm(1, "Exp", 1), merge=list(c("d1",2,"d2",2))) g = gstat(g, c("d1", "d2"), model = vgm(0.5, "Exp", 1)) predict(g, data.frame(x=1,y=1), debug = 32) gstat/tests/sim.R0000644000176200001440000000054415060550314013453 0ustar liggesusersoptions(digits=6) library(sp) data(meuse) set.seed(158229572) new.locs <- data.frame(x = c(181170, 180310, 180205, 178673, 178770, 178270), y = c(333250, 332189, 331707, 330066, 330675, 331075)) library(gstat) krige(zinc ~ 1, ~ x + y, meuse, newdata = new.locs, model = vgm(1.34e5, "Sph", 800, nug = 2.42e4), block = c(40,40), nmax = 40, nsim = 10) gstat/tests/fit.Rout.save0000644000176200001440000000227715060550314015137 0ustar liggesusers R version 3.2.2 (2015-08-14) -- "Fire Safety" Copyright (C) 2015 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(sp) > data(meuse) > library(gstat) > v=variogram(log(zinc)~1,~x+y,meuse,cutoff=500,wi=100) > v$gamma=c(0.5,1,2,3,3) > fit.variogram(v, vgm(1, "Sph", 300, 0),warn.if.neg=TRUE) model psill range 1 Nug 0.000000 0.00 2 Sph 7.878195 1567.77 Warning message: In fit.variogram(v, vgm(1, "Sph", 300, 0), warn.if.neg = TRUE) : partial sill or nugget fixed at zero value > fit.variogram(v, vgm(1, "Sph", 300, 0),warn.if.neg=FALSE) model psill range 1 Nug 0.000000 0.00 2 Sph 7.878195 1567.77 > > proc.time() user system elapsed 0.708 0.244 0.718 gstat/CHANGES0000644000176200001440000000031415060550314012364 0ustar liggesusersDec 5, 2002: started porting gstat to R Tue Dec 17 14:35:26 CET 2002 - added multivariate gstat(), Tue Aug 12 14:42:16 CEST 2003 - see src/CHANGES file in main gstat directory for more information gstat/MD50000644000176200001440000003255115162406267011723 0ustar liggesusersb930a1c993354b3d71cc449df073d4be *CHANGES ddceac45c7ccbf01026481ec8ef3deab *DESCRIPTION 3d8f0ef09f46d2ba801c2ffe1f264113 *NAMESPACE 35e43eb81a8c8776f5dc06dbbc020201 *NEWS.md 803f87a68be4ca054847ad578969b279 *R/circEmbed.R 02a9d4ea0f96e71d31a614d441396d5f *R/fit.lmc.R 77ad584fd5edfeb9b97c83dd20a97851 *R/fit.variogram.R 11df50040d29f897a44fbf7c5dcc5a66 *R/fit.variogram.gls.R b6fba7c709ffa4fbb952fa22fb4cd398 *R/fit.variogram.reml.R d3b1befeb3d012d19788a085c61cbc7e *R/get.contr.R 7adf4456be5ce6c97fe41363b1cbfba7 *R/gstat.R 90d1c48f89ef2dd31deac8d8021004df *R/gstat.cv.R 1843b43dc105951027eecd53732028de *R/gstat.debug.R 8d2764bd2a24771a470a8abae6adbb56 *R/gstat.formula.R cc78eaa9fe3d878621b6732cda4dc0fb *R/gstat.formula.predict.R 27f9fd5d4c00effac64ae18d25b121d8 *R/gstatOptions.R 12ad24366cb002879de3426371128796 *R/hscat.R edc9791ebe437b1901380d74972db2cc *R/image.data.frame.R 3bf39dc214ed564238d585fb1834480f *R/krige.R a86941154d557b47154d1f1e00ff40a0 *R/krige.cv.R 9d26d6cb15f8af5cbe89168a1ef60df8 *R/krige0.R f3cead51b48cb85f6362bc34bc723e2d *R/krigeST.R 6a8e3f331a9010d0167936ced6f831a2 *R/krigeTg.R 7ecb72625e1709c19958771d5258f4e5 *R/load.variogram.model.R 5e4ca298349e3841bcd67b74ec2b4b45 *R/map.to.lev.R 8abf80dfb1af614d77fa1f302ee6c264 *R/ossfim.R 437a312fa852e2962ae0c22cea323812 *R/panel.pointPairs.R b337728e2f7ebb444b598cbec7e6daea *R/plot.gstatVariogram.R 0ec356599d0f8b2a46b862681167bbe5 *R/plot.pointPairs.R 6be9f49eb64aa34ba6106147d375d01d *R/plot.variogramCloud.R 6d07dddad0be173c13925cc6105fa066 *R/predict.gstat.R d9f74b4d9ef3b8912e23e083f66c1412 *R/print.gstat.R 95622401bfd68c096e6e800bcef90b0c *R/print.variogram.R ae4124c6ea80101b9eb6866f2ab71ac7 *R/print.variogramCloud.R 0da3bd288649131c94b444b927c3d057 *R/print.variogramModel.R 2d074ecf214c2dcab279eebc5b16170b *R/set.R 9b44096a0bd48a7008c357782cb0560c *R/show.vgms.R e6512625a896a3c6dc22f9c084f43115 *R/spplot.R 0ab4a2623faa69f8d4a46a31164f230a *R/stVariogramModels.R 69f173064b6699bea0256867d43f42cf *R/turningLayers.R 425833489f7d223b4ce8f478464e0d83 *R/variogram.default.R 0190eebcef89a216f6bc6be0cfff6941 *R/variogram.formula.R 0a770b96aea80db9895b544e6c665a0a *R/variogram.gstat.R f036b826d6d2a3b0fc0bcb5d5c1e5b2f *R/variogramLine.R 83681ff709d6be0f72e8e1251d7842cc *R/variogramST.R 627d13473d2a3275f0cda066b5a45623 *R/vgm.R d07099f46a9c8618d8719bd422b96f9f *R/vgm.panel.R 216b232871afa74f72e25e0ba1610fda *R/xyz2img.R fcf925486eda62721c36865214ee21a4 *R/zzz.R 4ef928d0f72d179213286ec18f1bccd3 *build/vignette.rds 420b8870b1ee5885e49e1c6cf85fab8f *cleanup b585eb2b8f2a2de591a2683109fb16a2 *data/DE_RB_2005.rda 601c03689b0ed26ed63ffca4e7f8befb *data/coalash.rda 237b1ad60a0ac282ff8394a369500833 *data/fulmar.rda 266a5ba79d64c4ba1b8b0217f3440cac *data/jura.rda 58de2be8353cd0484dac4d8678aa3c7b *data/meuse.all.rda b5e0e7fe946bdf193524bc8c6d32a3ad *data/meuse.alt.rda 5274153eced1cffd66ae83f05416057d *data/ncp.grid.rda cec50b807271aadfcd0772553869aa4a *data/oxford.rda 92fb5b4ad9ab37c26564145309a10403 *data/pcb.rda bca17f9c78bcef4f250b1dd79b0cfe06 *data/sic2004.rda c02135d57be52ebaab37a7f3de148dae *data/sic97.rda 0b1be3fdf1cfab2aa058a862052e617b *data/tull.rda 8fd6ba0f072a40568ae5b390b7206b74 *data/vv.rda e49ce24ab0af0b224da4c422565539af *data/walker.rda 650e99ff68302bd872d5f689b5c148da *data/wind.rda 4976fe0ea6d97714a1c37c992a379680 *demo/00Index 05081dee734ad48ddc1ad091f437a1e9 *demo/a2p.R 1586ae215a98a5e8a29dbb735bf8a058 *demo/a2pinST.R af173da614ae8cbd853a760f8dce2708 *demo/block.R 83964bc95a07cadc048763aa20d9e2bc *demo/blue.R e76d50bb750c18fdd0a6c11fa384a673 *demo/cc.R 2352f215418d1e242b5d93c4097b8e84 *demo/circEmbeddingMeuse.R 6cff1db47fc6d7e86ce99c0101506bbf *demo/cokriging.R 36401510d481ce47b6d4ad5b924b53ca *demo/comp_geoR.R 962abe21a4a8e97e707ed907d7b5a1ff *demo/cosimulation.R 04280e3a36b00d496e951e196edbd1f3 *demo/depend.R 92670e4c520943a1c1a0fe90c813dcc8 *demo/examples.R 78d4ea634a6c17727c50ab11b18f83eb *demo/fulmar.R 16710a6f62d47804ed6c7ba9f1e4a6ae *demo/grass.R 8e224d6de7dba44672104e226eb324fc *demo/gstat3D.R b6615db4e745f66e8cc8efa59e3c0cf1 *demo/ikr.R cf96a4ef3c82dcb079b394b429a27d69 *demo/krige.R 1b6836515e6152d8e314002f67c0033d *demo/lhs.R b9f170ba90986dc71bdcbfc7f7b9284d *demo/line.R f734df09e2c2bca844623513ec872c94 *demo/lnsim.R 3239742713164de7a1611c3be05c5cb6 *demo/localKrigeST.R db63e4d2290327fdda91ad4c96fd19f0 *demo/pcb.R 0666f28bc4e3fbfbf9de0ffe78af0649 *demo/pcb_sf.R 2ef5e7ba229731b758ca9f053ec6276a *demo/rep.R 362a987292c09dc4be10104598014be9 *demo/sftime.R ba8e22bc0379e0308101ead16bc8745b *demo/sic2004.R e6e0356f19038baeea945d98a962eb8d *demo/snow.R a4df89b8a19499356bf838ec397e0c67 *demo/stkrige-crossvalidation.R 02326c0c05e5a663342be1252e671c43 *demo/stkrige-prediction.R 237b3653834cdbfb4f858d473ecf5ebf *demo/stkrige.R 2a47bc53e3632d65db84504076d6549a *demo/ugsim.R 47d9686778ca770faed9516cdeee881d *demo/uisim.R 4d04a06586ba37b31a14554a53424b28 *demo/weight.R b163d21ad7fa0eee3d2906b9d9bce5af *demo/wind.R e8cc520e632cf37de0b517b047f45020 *demo/zonal.R d25a42d3d51987dc8f9a62ed7b0e6498 *inst/CITATION 4fb7e4c519bf5bea3c4eb66238c55afa *inst/doc/gstat.R a32e6ad6ede836013c11173470ba4486 *inst/doc/gstat.Rnw e29e5c64dacebae19eccce87feea2400 *inst/doc/gstat.pdf 626f14d14182c6fb8b5d3dd6e855f387 *inst/doc/prs.R 4961b8e9071476d87816c5d9052380f0 *inst/doc/prs.Rnw ec4008861416220ade12296f5347dddc *inst/doc/prs.pdf 2334b1dc6475809446ec2206832bf860 *inst/doc/spatio-temporal-kriging.Rnw ed85b79675c31f5d09b400118bd0c2b9 *inst/doc/spatio-temporal-kriging.bib 836290a71c64d39dc76ef94d914d65b6 *inst/doc/spatio-temporal-kriging.pdf 0c0ee17a0c57c55dd00039c634677a47 *inst/doc/st.R 38557ed9da313932c9619ef851b99390 *inst/doc/st.Rnw 52c6c04552bf431a45b85869298e9e5f *inst/doc/st.pdf af529f6f9ce9e52ed054e016fd386af5 *inst/external/cluster.txt bacec53ee233889d6419b0e394bde7a8 *inst/external/ncp.dbf 3692904f850276a958eaa4024e4a8ec7 *inst/external/ncp.shp d7dc006dda153c41d6d102787e3a76c3 *inst/external/ncp.shx 127a9609099cd1f344b51e7f1877c85e *inst/external/no2.csv 0ff201f5692334d490c18661c3052276 *inst/external/oxford.jpg 96c8ff6ea9e99398a1faf5bfa1d9b378 *man/DE_RB_2005.Rd a021fb462be9c7aa235dd384ca36e78f *man/coalash.Rd 6ba0d013bc23fd3cdac5a9489116b29a *man/estiStAni.Rd f5a11c0a4c9ba23bd51089810f1ec03c *man/extractPar.Rd 097f908bb113d72690e9cee7b05f2b60 *man/fit.StVariogram.Rd d4b9ebb4a96fbff8c47084469d888f41 *man/fit.lmc.Rd 522913b2eaa0a4e95611ffef8f0e56d4 *man/fit.variogram.Rd cc6af46d512fec91a09884363602f11b *man/fit.variogram.gls.Rd 5639348c778a32774fc39d231626cb1c *man/fit.variogram.reml.Rd 05bfbe18ee524a457d28f330288dae4e *man/fulmar.Rd 271a24721b2ce0237f39fce337440814 *man/get.contr.Rd ca84fba4fa23c468e614795fcddc898c *man/gstat-internal.Rd a3ee37b449d7b70d63a67c14b428a2c6 *man/gstat.Rd e3f624b2ab577a1e0aceba4797366763 *man/hscat.Rd 7c6aa566ef9c873de1cf4263bd7a6e0f *man/image.Rd 0aae1d7e2118c34ec60459a6c67cfd1e *man/jura.Rd df833f98b93daff40e96857128736179 *man/krige.Rd ae55c56842e87e97c05e24dccec19b34 *man/krige.cv.Rd 634720d62e64082183db263d9f72dcce *man/krigeST.Rd 5f442e7128f579a38fb04c05a011495d *man/krigeSTSimTB.Rd 76113d04d375455608991f702fbb7e62 *man/krigeSimCE.Rd aae5501c93a00d3295e6220b7f6e6e00 *man/krigeTg.Rd ef9f95b6ace5e25d9851b1978ec8a796 *man/map.to.lev.Rd 23996f2435a64a7447f28f128a34546a *man/meuse.all.Rd ca7277abf834a0ea5ce330129c553954 *man/meuse.alt.Rd dbc2e0fef45b60c96b307de014b17e7c *man/ncp.grid.Rd c0fd21ba73c250320c57b5f28597e349 *man/ossfim.Rd a775ef616da51224620e7cc9a832de6f *man/oxford.Rd 08b8ca971cfb973cd3f2d5c3991f7744 *man/pcb.Rd ac181c942d596d630c2407d99faa653e *man/plot.gstatVariogram.Rd c09b19495dc1fcf2dab79cb4d2933380 *man/plot.pointPairs.Rd 530fa34c49655c615c942933fe3cc74e *man/plot.variogramCloud.Rd 2ac1d60a5d1fcf60625502ef4b60a863 *man/predict.gstat.Rd e3b9c69fea5e974be1491666dd9e7f2f *man/progress.Rd e10e4b96524eaeadd6a1c50b66eae252 *man/show.vgms.Rd 2df0826f567627d6fc014755cdf3956b *man/sic2004.Rd e193ecd4d5632107c7b25e14f881e16e *man/sic97.Rd 4856c6bd3604ced90ba111d984d83abc *man/spplot.vcov.Rd ecaaae093b59d257828b5b4cbcf22541 *man/tull.Rd 256c774f06d064876276714003dc4f50 *man/variogram.Rd 533d618caf8af5a60c14e4cd9d1055b8 *man/variogramLine.Rd bd2dc8f20b242f775f858c0dca9bb161 *man/variogramST.Rd 4169384801c30bd594a70d3ef51bcbc6 *man/variogramSurface.Rd 520fbf1b9e29b5a9747e812a6c931eed *man/vgm.Rd 37e915f4092fe91b68a1b31e2d2da4d8 *man/vgm.panel.Rd bd8034339dacae22ef6d14b796517f90 *man/vgmArea.Rd 576f2984d904a947939985f1d26e046b *man/vgmAreaST.Rd 01a7a226446af1c5512d99448bfd5fd8 *man/vgmST.Rd c6589cc4b53810b4bf410a479058c0cd *man/vv.Rd 1395d078750045ef98b71e98703ecef9 *man/walker.Rd c801c75ca84363ce6792c28897080cb0 *man/wind.Rd 2b06c8ace73a4549d8955d507176adbe *src/Makevars cd356c0062dd113425dcea3326c25937 *src/block.c 50f7dca54d782da8fa90376f91379c1a *src/block.h fe6d706346108ff86d4a742d1f1c0851 *src/data.c 8328781e753b45df53635bbb1af114f8 *src/data.h 4ae249002fa3e4d20ca7eb8648865afc *src/debug.h 32676f133e79fe84fcf143ac7c80034f *src/defaults.h 16d84f0d9ca22a3477ca83e49f49d800 *src/defs.h b3af256c7df51a35a368c4d94daf5c0d *src/direct.c 8a8ecbc415ae2102acbf7bea4228f4db *src/direct.h 74cbd4b8851adf813dfb512ebcde091d *src/fit.c ba498786f7fe47bb4e57e63f9bd45164 *src/fit.h f30f0be85eb072459a9e53f444579700 *src/gcdist.c 221e6cadf8e43cff03c39605a02bfa5d *src/gcdist.h 6cdb4ba518990878e84e271f34a0bbda *src/getest.c 60238e9217e0be3e69bd5c8a591818e2 *src/getest.h 7cee9fdcf79499817d80b01db3b57b6a *src/gls.c 46dc3925fa670dd3f277101f52f0fcd7 *src/gls.h f0ee553ab46b93229e7092b34edd22a1 *src/glvars.c d0afd7915c15f4505403db9926ffed7d *src/glvars.h 94f1cbc41e449bde9e99e6c8ac2aeea6 *src/init.c 9e281c2ec38b7ac600690a795b4f6c3b *src/lm.c 88138ca5edceca83cdf4a8934cc42f4a *src/lm.h c8638e72358d70ae27da94274fc303ba *src/mapio.c 4ff06b1d5c8068b68628495867110a5b *src/mapio.h 27144d7f3e44b6807dbfd41f115723f7 *src/msim.c 6381e492f21372736bf7ff42e57d8e13 *src/msim.h 63799d37dfad0bc09da128794153fe7a *src/mtrx.c fdbe09c20a4c7b49d85f8c3e6b4b9820 *src/mtrx.h a1d8427748290b035ff031a1ab6ac0bf *src/nsearch.c cb7c7884a7504da02bfdd19ed10dc665 *src/nsearch.h cd520f7adb1880aab8cc98b35cc60c0d *src/pqueue.c a0c57bd9852efe71fd1323a220816b0a *src/pqueue.h 8a23f9662162c6c1ff6fc028bfa9ef68 *src/reml.c dc58fae97b9abee9228ba2ae92c9a126 *src/reml.h c890da946eef6237bea10bde7801b795 *src/s.c 3b75b902aa067dcbdcfe59c6e79cd943 *src/s.h 8ca1be20f6d08c72bff6928589a1444d *src/select.c f9f9efd4c025607820dd39928231d6e8 *src/select.h cb308ac96305994692d7740e0c3b5a34 *src/sem.c 28c8554fc50566818c33ecdbded5dd89 *src/sem.h 7a540429fb56542a4aca8fca494ad170 *src/sim.c 4481ac8fe298f827274c7f9bc5619990 *src/sim.h b416760f2c731017c4af92f89c30c525 *src/userio.c 1ffb22ab294cb753fa1ff742a41bb4db *src/userio.h cf128f1b5ea70cdfc79c13ad1ac4ffa8 *src/utils.c 03f1efb0993257a26ac527a2cb4d6bb2 *src/utils.h d5839cef04149d18255f99f219974ac0 *src/vario.c 2a89ce5559e7ec536ef4cf4ea27d16c7 *src/vario.h c3b780933c64dafde485584d24cfafbd *src/vario_fn.c 0c7dab4655f331b80ec70570695dd027 *src/vario_fn.h 21cd4d99d24ac09825af86bd41e8ae37 *src/vario_io.c e4c7015f19601d136e2f4bb26b9ba043 *src/vario_io.h c03485b9f7b27533ec0b98d412583b44 *tests/allier.R 63851c34cc8de0b05d9562ef40ff835b *tests/allier.Rout.save 8a119ec5be1b0b9d2ac4281b28e4d303 *tests/blockkr.R 2f3bb7abc17e1ef8a3252133e1d0819f *tests/blockkr.Rout.save 5244b31f26f5fdc216b4069e6d247072 *tests/covtable.R 0f68261efb85437edcf1c0bbda9f07f2 *tests/covtable.Rout.save d4e6a035dbb2acdb54c7d1250726c6f5 *tests/cv.R a588ab2866ed2c33cb220b72c28574e9 *tests/cv.Rout.save 6bb81fcd91cf3f5b22da90c3b67b0d3b *tests/cv3d.R ae722cc710794aa6e2306ee05ae645c6 *tests/cv3d.Rout.save 5b1577d870bc22def0f5b9f4c5b08310 *tests/fit.R 4b14ce151e5eb5ce9963d243340af6cf *tests/fit.Rout.save d9c6a69f63372a0a46b1805dc0600741 *tests/krige0.R 3b05508a8d930bc11e982c1c0c11c3fe *tests/krige0.Rout.save 4a35e9b8d5056270b522e3a8aacbc9af *tests/line.R 58808f9c817a044375a7dfea53dd3859 *tests/line.Rout.save 580757bef9267e0f1b06dd39a1c55efa *tests/merge.R de4ac5b3c0ae4b696c674e9fedfac06b *tests/merge.Rout.save 358b26b2b47408f4d330c7ae619e94fb *tests/na.action.R ab68a094793dc61446114fbe2f48255d *tests/na.action.Rout.save 7e40f0b04b2219fa329b4f0ede19d523 *tests/rings.R 7c115ab4f24d06b8628c4dbc95675838 *tests/rings.Rout.save 3872fee92178c9337d2bd31c3f9d4369 *tests/sim.R a2fd1af159d1d3d2cef3252fa828dc1c *tests/sim.Rout.save 469e66ffd5f2339af8e7689d1565c61d *tests/stars.R 95d9637cb86089b437388854658f6bdb *tests/stars.Rout.save 0ce127ddb2b0c900c6634acef7c4cc9c *tests/variogram.R b7587d353040687e3dc23a7e0e1c9378 *tests/variogram.Rout.save 46df20db1a40656b9bb21b0107bcf663 *tests/vdist.R d90377d4ddc5a87581a8de87ce62c77a *tests/vdist.Rout.save a24a9abe21dbb525609ecae7b23b1fc1 *tests/windst.R 6a2af0b43626873857d03dcaafd26ec2 *tests/windst.Rout.save 20272ee0d92bfda02b0a63d4093c03fc *vignettes/figures/allVgmsDiffWireframe.png 624ded7c12218d06ee90abc27cc7dfdb *vignettes/figures/allVgmsWireframe.png 3873ad3a6d22a95d5597c5548addf558 *vignettes/figures/daily_means_PM10.png 4efaab181b2dc944551ad5c3dfaf0fb9 *vignettes/figures/diffs_daily_means_PM10.png 2728991212e9c87744362f607f3389bc *vignettes/figures/pred_daily_means_PM10.png 41d31a6115115468b11472ba102f84c7 *vignettes/figures/singleStationTimeSeries.png a39e5c29e6e0755bf2479ec93514f307 *vignettes/figures/vgmVsMetricDist.png a32e6ad6ede836013c11173470ba4486 *vignettes/gstat.Rnw 23a8ca706b284fdd73be5e1958601d75 *vignettes/ifgi-logo_int.pdf 4961b8e9071476d87816c5d9052380f0 *vignettes/prs.Rnw 2334b1dc6475809446ec2206832bf860 *vignettes/spatio-temporal-kriging.Rnw ed85b79675c31f5d09b400118bd0c2b9 *vignettes/spatio-temporal-kriging.bib 38557ed9da313932c9619ef851b99390 *vignettes/st.Rnw gstat/R/0000755000176200001440000000000015076447004011604 5ustar liggesusersgstat/R/set.R0000644000176200001440000000304315060550314012512 0ustar liggesusers# $Id: set.q,v 1.7 2008-12-16 14:59:22 edzer Exp $ gstat.set <- function(set) { if(!is.list(set)) stop("set should be a list") if (length(set) == 0) return(NULL) ret = NULL n = names(set) for (i in (1:length(set))) { val = set[[i]] if (n[i] == "method") str = paste("method: ", val, ";", sep="") else { if (is.character(val)) val = paste("'", val, "'", sep = "") str = paste("set ", n[i], " = ", val, ";", sep="") } ret = c(ret, str) } ret } gstat.load.set <- function(set) { if(!is.list(set)) stop("set should be a list") if (length(set) == 0) return(NULL) n = names(set) for (i in (1:length(set))) { if (n[i] == "method") ret = .Call(gstat_set_method, set[[i]]) else ret = .Call(gstat_set_set, n[i], set[[i]]) } invisible(ret) } gstat.load.merge <- function(obj) { if (is.character(obj$merge) && length(obj$merge) == 2) obj$merge = list(c(obj$merge[1], 1, obj$merge[2], 1)) if (!is.list(obj$merge)) stop("merge argument should be list or character vector of lenght 2") ret = NULL for (i in 1:length(obj$merge)) { m = obj$merge[[i]] if (is.character(m) && length(m) == 4) { id = match(m[c(1,3)], names(obj$data)) - 1 # name ->> id if (any(is.na(id))) stop(paste("could not match all ids:", m[c(1,3)])) col = as.integer(m[c(2,4)]) - 1 if (any(is.na(col)) || any(col < 0)) stop("merge: parameters should be positive integers") ret = .Call(gstat_set_merge, id[1], col[1], id[2], col[2]) } else stop( "list elements of merge should be lenght 4 character vectors") } ret } gstat/R/image.data.frame.R0000644000176200001440000000036315060550314015004 0ustar liggesusers# $Id: image.data.frame.q,v 1.4 2006-02-10 19:01:07 edzer Exp $ "image.data.frame" <- function (x, zcol = 3, xcol = 1, ycol = 2, asp = 1, ...) { image.default(xyz2img(xyz = x, zcol = zcol, xcol = xcol, ycol = ycol), asp = asp, ...) } gstat/R/print.variogramCloud.R0000644000176200001440000000054315060550314016032 0ustar liggesusers# $Id: print.variogramCloud.q,v 1.4 2007-10-18 10:13:13 edzer Exp $ as.data.frame.variogramCloud = function(x, row.names, optional, ...) { .BigInt = attr(x, ".BigInt") x$left = x$np %% .BigInt + 1 x$right = x$np %/% .BigInt + 1 x$np = NULL class(x) = "data.frame" x } print.variogramCloud <- function (x, ...) { print(as.data.frame(x), ...) } gstat/R/krigeST.R0000644000176200001440000004452415060550314013300 0ustar liggesusers############################# ## spatio-temporal kriging ## ############################# debug_time_unit = function(tUnit) { # message("Using the following time unit: ", tUnit) } STsolve = function(A, b, X) { # V = A$T %x% A$S -- a separable covariance; solve A x = b for x # kronecker: T %x% S vec(L) = vec(c0) <--> S L T = c0 # solve for L: use Y = L T # S Y = c0 -> Y = solve(S, c0) # L T = Y -> Tt Lt = Yt -> Lt = solve(Tt, Yt) #Tm = chol(A$Tm, LINPACK=TRUE) Tm = chol(A$Tm) #Sm = chol(A$Sm, LINPACK=TRUE) Sm = chol(A$Sm) STbacksolve = function(Tm, Cm, Sm) { MyChSolve = function(A, b) backsolve(A, forwardsolve(A, b, upper.tri = TRUE, transpose = TRUE)) # Y = MyChSolve(Sm, Cm) # L = MyChSolve(Tm, t(Y)) # as.vector(t(L)) as.vector(t(MyChSolve(Tm, t(MyChSolve(Sm, Cm))))) } # b comes separated: ret1 = apply(b$T, 2, function(x1) apply(b$S, 2, function(x2) STbacksolve(Tm, matrix(x1 %x% x2, nrow(Sm), nrow(Tm)), Sm))) d = dim(ret1) dim(ret1) = c(d[1] / ncol(b$S), d[2] * ncol(b$S)) # X comes full: ret2 = apply(X, 2, function(x) STbacksolve(Tm, matrix(x, nrow(Sm), nrow(Tm)), Sm)) cbind(ret1, ret2) } covfn.ST = function(x, y = x, model, ...) { switch(strsplit(model$stModel, "_")[[1]][1], separable=covSeparable(x, y, model, ...), productSumOld=covProdSumOld(x, y, model), productSum=covProdSum(x, y, model), sumMetric=covSumMetric(x, y, model), simpleSumMetric=covSimpleSumMetric(x, y, model), metric=covMetric(x, y, model), stop(paste("Provided spatio-temporal model (",model$stModel,") is not supported.",sep=""))) } ## krigeST krigeST <- function(formula, data, newdata, modelList, beta, y, ..., nmax=Inf, stAni=NULL, computeVar = FALSE, fullCovariance = FALSE, bufferNmax=2, progress=TRUE) { stopifnot(inherits(modelList, "StVariogramModel") || is.function(modelList)) to_sftime = FALSE return_stars = if (inherits(data, c("stars"))) { if (!requireNamespace("sf", quietly = TRUE)) stop("sf required: install that first") # nocov if (!requireNamespace("stars", quietly = TRUE)) stop("stars required: install that first") # nocov if (sf::st_crs(data) != sf::st_crs(newdata)) warning("CRS for data and newdata are not identical; assign CRS or use st_transform to correct") data = as(data, "STFDF") newdata = as(newdata, "STFDF") TRUE } else if (inherits(data, "sftime")) { if (sf::st_crs(data) != sf::st_crs(newdata)) warning("CRS for data and newdata are not identical; assign CRS or use st_transform to correct") data = as(data, "STIDF") if (inherits(newdata, "stars")) { if (length(newdata) == 0) newdata$._dummy = 0. newdata = as(newdata, "STFDF") } if (inherits(newdata, "sftime")) { to_sftime = TRUE newdata = as(newdata, "STIDF") } TRUE } else { if (!identical(data@sp@proj4string@projargs, newdata@sp@proj4string@projargs)) message("please verify that the CRSs of data and newdata are identical, or transform them first to make them identical") FALSE } stopifnot(inherits(data, c("STF", "STS", "STI", "sftime")) && inherits(newdata, c("STF", "STS", "STI", "sftime"))) if (inherits(data, "sftime")) data = as(data, "STIDF") if (inherits(newdata, "sftime")) data = as(data, "STI") stopifnot(class(data@time) == class(newdata@time)) stopifnot(nmax > 0) tUnitModel <- attr(modelList, "temporal unit") tUnitData <- units(abs(outer(index(data@time[1]), index(newdata@time[1]), "-"))) if (is.null(tUnitModel)) { warning("The spatio-temporal variogram model does not carry the strongly recommended attribute 'temporal unit'.\n The unit '", tUnitData, "' has been assumed. krigeST could not check whether the temporal distances between locations and in the variogram coincide.") tUnit <- tUnitData attr(modelList, "temporal unit") <- tUnit } else { tUnit <- tUnitModel debug_time_unit(tUnit) } if(nmax < Inf) { # local neighbourhood ST kriging: ret = krigeST.local( formula = formula, data = data, newdata = newdata, modelList = modelList, beta=beta, # y=y, # for later use nmax = nmax, stAni = stAni, computeVar = computeVar, fullCovariance = fullCovariance, bufferNmax = bufferNmax, progress = progress) if (return_stars) { ret$._dummy = NULL if (to_sftime) sftime::st_as_sftime(ret) else stars::st_as_stars(as(ret, "STFDF")) } else ret } else { df <- krigeST.df(formula = formula, data = data, newdata = newdata, modelList = modelList, beta = beta, y = y, ..., nmax=nmax, stAni=stAni, computeVar = computeVar, fullCovariance = fullCovariance, bufferNmax = bufferNmax, progress = progress) # wrapping the predictions in ST*DF again if (!fullCovariance) { ret = addAttrToGeom(geometry(newdata), df) if (return_stars) { ret$._dummy = NULL if (to_sftime) ret = sftime::st_as_sftime(ret) else ret = stars::st_as_stars(as(ret, "STFDF")) } ret } else df } } krigeST.df <- function(formula, data, newdata, modelList, beta, y, ..., nmax = Inf, stAni = NULL, computeVar = FALSE, fullCovariance = FALSE, bufferNmax = 2, progress = TRUE) { separate <- length(data) > 1 && length(newdata) > 1 && inherits(data, "STF") && inherits(newdata, "STF") lst = extractFormula(formula, data, newdata) X = lst$X x0 = lst$x0 if (missing(y)) y = lst$y if (inherits(modelList, "StVariogramModel")) { V = covfn.ST(data, model = modelList, separate=separate) v0 = covfn.ST(data, newdata, modelList) if (is(data,"STSDF")) d0 <- data[data@index[1,1], data@index[1,2], drop = FALSE] else d0 = data[1, 1, drop=FALSE] c0 = as.numeric(covfn.ST(d0, d0, modelList, separate = FALSE)) } else { V = modelList(data, data, ...) v0 = modelList(data, newdata, ...) if (computeVar) { if (is(newdata@sp, "SpatialLines") || is(newdata@sp, "SpatialPolygons")) stop("Varying target support (SpatialLines, SpatialPolygons) for kriging variance is not implemented.") c0 = as.numeric(modelList(newdata[1, drop=FALSE], newdata[1, drop=FALSE])) } } if (!missing(beta)) { # sk: skwts = CHsolve(V, v0) npts = length(newdata) ViX = skwts[,-(1:npts)] skwts = skwts[,1:npts] if (computeVar) var <- c0 - apply(v0*skwts, 2, sum) } else { if (!is.function(modelList) && (modelList$stModel == "separable" & separate)) skwts <- STsolve(V, v0, X) # use Kronecker trick else skwts <- CHsolve(V, cbind(v0, X)) npts = length(newdata) ViX = skwts[,-(1:npts)] skwts = skwts[,1:npts] beta = solve(t(X) %*% ViX, t(ViX) %*% y) if (computeVar) { # get (x0-X'C-1 c0)'(X'C-1X)-1 (x0-X'C-1 c0) -- precompute term 1+3: if(is.list(v0)) # in the separable case v0 = v0$Tm %x% v0$Sm Q = t(x0) - t(ViX) %*% v0 # suggested by Marius Appel var = c0 - apply(v0 * skwts, 2, sum) + apply(Q * CHsolve(t(X) %*% ViX, Q), 2, sum) if (fullCovariance) { corMat <- cov2cor(covfn.ST(newdata, newdata, modelList)) var <- corMat*matrix(sqrt(var) %x% sqrt(var), nrow(corMat), ncol(corMat)) # var = c0 - t(v0) %*% skwts + t(Q) %*% CHsolve(t(X) %*% ViX, Q) # return(list(pred=pred, var=var)) } } } pred = x0 %*% beta + t(skwts) %*% (y - X %*% beta) if(computeVar) { if (fullCovariance) list(pred=pred, var=var) else data.frame(var1.pred = pred, var1.var = var) } else data.frame(var1.pred = pred) } # local spatio-temporal kriging krigeST.local <- function(formula, data, newdata, modelList, beta, nmax, stAni=NULL, computeVar=FALSE, fullCovariance=FALSE, bufferNmax=2, progress=TRUE) { dimGeom <- ncol(coordinates(data)) if (fullCovariance) stop("fullCovariance cannot be returned for local ST kriging") if(is.null(stAni) & !is.null(modelList$stAni)) { stAni <- modelList$stAni # scale stAni [spatial/temporal] to seconds if(!is.null(attr(modelList,"temporal unit"))) stAni <- stAni/switch(attr(modelList, "temporal unit"), secs=1, mins=60, hours=3600, days=86400, stop("Temporal unit",attr(modelList, "temporal unit"),"not implemented.")) } if(is.null(stAni)) stop("The spatio-temporal model does not provide a spatio-temporal anisotropy scaling nor is the parameter stAni provided. One of these is necessary for local spatio-temporal kriging.") # check whether the model meets the coordinates' unit if(!is.null(attr(modelList, "spatial unit"))) stopifnot((is.projected(data) & (attr(modelList, "spatial unit") %in% c("km","m"))) | (!is.projected(data) & !(attr(modelList, "spatial unit") %in% c("km","m")))) if (inherits(data, c("STFDF", "STSDF", "sftime"))) data <- as(data, "STIDF") clnd <- class(newdata) if(inherits(newdata, c("STFDF", "STSDF", "sftime"))) newdata <- as(newdata, "STIDF") if(inherits(newdata, c("STF", "STS"))) newdata <- as(newdata, "STI") # from here on every data set is assumed to be STI* if(dimGeom == 2) { df = as(data, "data.frame")[,c(1,2,4)] df$time = as.numeric(df$time)*stAni query = as(newdata, "data.frame")[,c(1,2,4)] query$time = as.numeric(query$time)*stAni } else { df = as(data, "data.frame")[,c(1,2,3,5)] df$time = as.numeric(df$time)*stAni query = as(newdata, "data.frame")[,c(1,2,3,5)] query$time = as.numeric(query$time)*stAni } df <- as.matrix(df) query <- as.matrix(query) if (computeVar) { res <- data.frame(var1.pred = rep(NA, nrow(query)), var1.var = rep(NA, nrow(query))) } else { res <- data.frame(var1.pred = rep(NA, nrow(query))) } if(progress) pb = txtProgressBar(style = 3, max = nrow(query)) nb <- t(apply(get.knnx(df, query, ceiling(bufferNmax*nmax))[[1]],1,sort)) for (i in 1:nrow(query)) { nghbrData <- data[nb[i, ], , drop = FALSE] if(bufferNmax > 1) { nghbrCov <- covfn.ST(nghbrData, newdata[i, , drop = FALSE], modelList) nghbrData <- nghbrData[sort(order(nghbrCov, decreasing=T)[1:nmax]), , drop = FALSE] } res[i,] <- krigeST.df(formula, nghbrData, newdata[i, , drop = FALSE], modelList, computeVar=computeVar, beta = beta, fullCovariance=fullCovariance) if(progress) setTxtProgressBar(pb, i) } if(progress) close(pb) if (clnd %in% c("STI", "STS", "STF")) { newdata <- addAttrToGeom(newdata, as.data.frame(res)) newdata <- switch(clnd, STI = as(newdata, "STIDF"), STS = as(newdata, "STSDF"), STF = as(newdata, "STFDF")) } else { newdata@data <- cbind(newdata@data, res) newdata <- as(newdata, clnd) } newdata } ## Area to point kriging # define a spatio-temporal variogram model FUNCTION that can deal with x and y # being of ST* with @sp of class SpatialPolygons OR SpatialPoints; # SpatialGrid/Pixels are coerced to SpatialPolygons -- as in the so case, see # krige0.R # sts <- STS(meuse.grid, stf@time, cbind(sort(sample(length(meuse.grid), 500, replace = T)), # sample(21,500, replace=TRUE))) # # x <- sts # y <- stf # model <- separableModel vgmAreaST = function(x, y = x, model, ndiscrSpace = 16, verbose = FALSE, covariance = TRUE) { if (gridded(x@sp)) x@sp = as(x@sp, "SpatialPolygons") if (gridded(y@sp)) y@sp = as(y@sp, "SpatialPolygons") stopifnot(is(x@sp, "SpatialPolygons") || is(x@sp, "SpatialPoints")) stopifnot(is(y@sp, "SpatialPolygons") || is(y@sp, "SpatialPoints")) stopifnot(is(model, "StVariogramModel")) # make x and y both of type STS/STSDF if ("data" %in% slotNames(x)) { x <- as(x, "STSDF") } else { x <- as(x, "STS") } if ("data" %in% slotNames(y)) { y <- as(y, "STSDF") } else { y <- as(y, "STS") } nx = length(x) ny = length(y) V <- matrix(NA, nx, ny) # switch cases for polygons in x and y if (is(x@sp, "SpatialPolygons")) { # x contains polygons -> loop and sample indexX <- x@index if (verbose) pb <- txtProgressBar(style = 3, max = nx) for (ix in 1:nx) { # ix <- 1 px <- x[indexX[ix,,drop=F],drop=F] ptsx = STF(spsample(px@sp, ndiscrSpace, "regular", offset = c(.5,.5)), px@time, px@endTime) # does y also contain polygons? if (is(y@sp, "SpatialPolygons")) { # yes, also y contains polygons -> loop and sample indexY <- y@index for (iy in 1:ny) { # iy <- 1 py <- y[indexY[iy,,drop=F],drop=F] ptsy = STF(spsample(py@sp, ndiscrSpace, "regular", offset = c(.5,.5)), py@time, py@endTime) suppressMessages(subV <- covfn.ST(ptsx, ptsy, model, separate=FALSE)) V[ix, iy] <- mean(subV) } } else { # no, y contains points -> no second loop, calc covariance suppressMessages(subV <- covfn.ST(ptsx, y, model, separate=FALSE)) V[ix, ] <- apply(subV, 2, mean) } if (verbose) setTxtProgressBar(pb, ix) } if (verbose) close(pb) } else { # none of x and y contain polygons -> no loops, calc covariance suppressMessages(V <- covfn.ST(x, y, model)) } V } #################### ## trans Gaussian ## #################### krigeSTTg <- function(formula, data, newdata, modelList, y, nmax=Inf, stAni=NULL, bufferNmax=2, progress=TRUE, lambda = 0) { if(!is.infinite(nmax)) return(krigeSTTg.local(formula, data, newdata, modelList, y, nmax, stAni, bufferNmax, progress, lambda)) lst <- extractFormula(formula, data, newdata) Y <- lst$y X <- lst$X if (ncol(X) > 1) stop("only formula with intercept allowed, e.g. y ~ 1") data$value = phiInv(Y, lambda) data$value1 = rep(1, length(data$value)) OK = krigeST(value ~ 1, data, newdata, modelList, nmax = nmax, stAni = stAni, computeVar=TRUE, bufferNmax = bufferNmax, progress = progress) separate <- length(data) > 1 && length(newdata) > 1 && inherits(data, "STF") && inherits(newdata, "STF") V <- covfn.ST(data, model = modelList, separate=separate) Vi <- solve(V) muhat <- sum(Vi %*% data$value)/sum(Vi) # find m: v0 <- covfn.ST(data, newdata, model = modelList, separate=separate) m <- (1 - apply(Vi %*% v0,2,sum))/sum(Vi) # compute transGaussian kriging estimate & variance: OK$var1TG.pred = phi(OK$var1.pred, lambda) + phiDouble(muhat, lambda) * (OK$var1.var/2 - m) OK$var1TG.var = phiPrime(muhat, lambda)^2 * OK$var1.var OK } krigeSTTg.local <- function(formula, data, newdata, modelList, y, nmax=Inf, stAni=NULL, bufferNmax=2, progress=TRUE, lambda = 0) { stopifnot(!is.infinite(nmax)) dimGeom <- ncol(coordinates(data)) if(is.null(stAni) & !is.null(modelList$stAni)) { stAni <- modelList$stAni # scale stAni [spatial/temporal] to seconds if(!is.null(attr(modelList,"temporal unit"))) stAni <- stAni/switch(attr(modelList, "temporal unit"), secs=1, mins=60, hours=3600, days=86400, stop("Temporal unit",attr(modelList, "temporal unit"),"not implemented.")) } if(is.null(stAni)) stop("The spatio-temporal model does not provide a spatio-temporal anisotropy scaling nor is the parameter stAni provided. One of these is necessary for local spatio-temporal kriging.") # check whether the model meets the coordinates' unit if(!is.null(attr(modelList, "spatial unit"))) stopifnot((is.projected(data) & (attr(modelList, "spatial unit") %in% c("km","m"))) | (!is.projected(data) & !(attr(modelList, "spatial unit") %in% c("km","m")))) if(is(data, "STFDF") || is(data, "STSDF")) data <- as(data, "STIDF") clnd <- class(newdata) if(is(newdata, "STFDF") || is(newdata, "STSDF")) newdata <- as(newdata, "STIDF") if(is(newdata, "STF") || is(newdata, "STS")) newdata <- as(newdata, "STI") # from here on every data set is assumed to be STI* if(dimGeom == 2) { df = as(data, "data.frame")[,c(1,2,4)] df$time = as.numeric(df$time)*stAni query = as(newdata, "data.frame")[,c(1,2,4)] query$time = as.numeric(query$time)*stAni } else { df = as(data, "data.frame")[,c(1,2,3,5)] df$time = as.numeric(df$time)*stAni query = as(newdata, "data.frame")[,c(1,2,3,5)] query$time = as.numeric(query$time)*stAni } df <- as.matrix(df) query <- as.matrix(query) res <- data.frame(var1.pred = rep(NA, nrow(query)), var1.var = rep(NA, nrow(query)), var1TG.pred = rep(NA, nrow(query)), var1TG.var = rep(NA, nrow(query))) if(progress) pb = txtProgressBar(style = 3, max = nrow(query)) nb <- t(apply(get.knnx(df, query, ceiling(bufferNmax*nmax))[[1]],1,sort)) for (i in 1:nrow(query)) { nghbrData <- data[nb[i, ], , drop = FALSE] if(bufferNmax > 1) { nghbrCov <- covfn.ST(nghbrData, newdata[i, , drop = FALSE], modelList) nghbrData <- nghbrData[sort(order(nghbrCov, decreasing=T)[1:nmax]), , drop = FALSE] } res[i,] <- krigeSTTg(formula, nghbrData, newdata[i, , drop = FALSE], modelList, lambda)@data if(progress) setTxtProgressBar(pb, i) } if(progress) close(pb) if (clnd %in% c("STI", "STS", "STF")) { newdata <- addAttrToGeom(newdata, as.data.frame(res)) newdata <- switch(clnd, STI = as(newdata, "STIDF"), STS = as(newdata, "STSDF"), STF = as(newdata, "STFDF")) } else { newdata@data <- cbind(newdata@data, res) newdata <- as(newdata, clnd) } newdata } gstat/R/gstat.formula.predict.R0000644000176200001440000000427115060550314016142 0ustar liggesusers# $Id: gstat.formula.predict.q,v 1.14 2008-02-19 10:01:22 edzer Exp $ "gstat.formula.predict" <- function (formula, newdata, na.action, BLUE.estimates = FALSE, xlev = NULL) { if (is(newdata, "SpatialPolygons")) { # locs = coordinates(getSpatialPolygonsLabelPoints(newdata)) -- deprecated, now use: locs = t(sapply(slot(newdata, "polygons"), function(x) slot(x, "labpt"))) SpatialPoints(locs, slot(newdata, "proj4string")) locs = coordinates(locs) colnames(locs) = c("x", "y") if (is(newdata, "SpatialPolygonsDataFrame")) newdata = as.data.frame(newdata) else newdata = data.frame(a = rep(1, nrow(locs))) } else if (is(newdata, "SpatialLines")) { # locs = coordinates(getSpatialLinesMidPoints(newdata)) -- deprecated, now use: ret = lapply(newdata@lines, function(x) sapply(x@Lines, function(X) apply(X@coords, 2, mean) ) ) ret = t(sapply(ret, function(x) apply(x, 1, mean))) locs = coordinates(SpatialPoints(ret, slot(newdata, "proj4string"))) colnames(locs) = c("x", "y") if (is(newdata, "SpatialLinesDataFrame")) newdata = as.data.frame(newdata) else newdata = data.frame(a = rep(1, nrow(locs))) } else { if (gridded(newdata)) fullgrid(newdata) = FALSE locs = coordinates(newdata) newdata = as.data.frame(newdata) } # resolve formula: terms.f = delete.response(terms(formula)) mf.f = model.frame(terms.f, newdata, na.action = na.action, xlev = xlev) X = model.matrix(terms.f, mf.f) if (BLUE.estimates) { # fake the whole thing to get a matrix with BLUE parameter estimates: cnames = colnames(X) X = matrix(0, ncol(X), ncol(X)) diag(X) = 1 locs = locs[1,,drop=FALSE] if (ncol(X) > 1) { for (i in 2:ncol(X)) locs = rbind(locs, locs[1,]) } rownames(locs) = cnames } if (NROW(locs) != NROW(X)) { # NA's were filtered in X, but not in coords: mf.f = model.frame(terms.f, newdata, na.action = na.pass) valid.pattern = !(apply(mf.f, 1, function(x) any(is.na(x)))) X = model.matrix(terms.f, mf.f[valid.pattern, , drop = FALSE]) locs = locs[valid.pattern, ] if (NROW(locs) != NROW(X)) stop("NROW(locs) != NROW(X): this should not occur") } list(locations = as.matrix(locs), X = as.matrix(X)) } gstat/R/print.variogramModel.R0000644000176200001440000000130015060550314016014 0ustar liggesusers# $Id: print.variogramModel.q,v 1.5 2009-02-20 13:53:38 edzer Exp $ "print.variogramModel" = function (x, ...) { df = data.frame(x) shape.models = c("Mat", "Exc", "Cau", "Ste") if (!any(match(df[, "model"], shape.models, nomatch=0))) df$kappa = NULL if (!any(df[, "anis2"] != 1)) { df$anis2 = NULL df$ang2 = NULL df$ang3 = NULL if (!any(df[, "anis1"] != 1)) { df$anis1 = NULL df$ang1 = NULL } } if (any(match(df[, "model"], "Tab", nomatch=0))) { df$maxdist = df$range df$range = NULL print(df, ...) cat("covariance table:\n") tab = attr(x, "table") idx = round(seq(1, length(tab), length=6)) print(tab[idx]) } else print(df, ...) invisible(x) } gstat/R/predict.gstat.R0000644000176200001440000002322015060550314014471 0ustar liggesusers# $Id: predict.gstat.q,v 1.35 2009-11-02 21:33:17 edzer Exp $ predict.gstat <- function (object, newdata, block = numeric(0), nsim = 0, indicators = FALSE, BLUE = FALSE, debug.level = 1, mask, na.action = na.pass, sps.args = list(n = 500, type = "regular", offset = c(.5, .5)), ...) { if (missing(object) || length(object$data) < 1) stop("no data available") if (!inherits(object, "gstat")) stop("first argument should be of class gstat") to_stars = FALSE to_sf = if (inherits(newdata, c("sf", "sfc", "stars"))) { to_stars = inherits(newdata, "stars") newdata = as(newdata, "Spatial") TRUE } else FALSE if (!is.null(object$locations) && inherits(object$locations, "formula") && !(is(newdata, "Spatial"))) { coordinates(newdata) = object$locations return.sp = FALSE } else return.sp = TRUE max_dist = getMaxDist(object$data, newdata) .Call(gstat_init, as.integer(debug.level)) bl_weights = numeric(0) if (!missing(mask)) { cat("argument mask is deprecated:") stop("use a missing value pattern in newdata instead") } nvars = length(object$data) new.X = NULL for (i in 1:length(object$data)) { name = names(object$data)[i] d = object$data[[i]] if (!is.null(d$data)) { if (!identical(d$data@proj4string@projargs, newdata@proj4string@projargs)) { print(proj4string(d$data)) print(proj4string(newdata)) stop(paste(name, ": data item in gstat object and newdata have different coordinate reference systems")) } } if (d$nmax == Inf) nmax = as.integer(-1) else nmax = as.integer(d$nmax) nmin = as.integer(max(0, d$nmin)) if (d$maxdist == Inf) maxdist = as.numeric(-1) else maxdist = d$maxdist if (d$dummy) { # tr = terms(d$locations) if (is.null(d$beta) || length(d$beta) == 0) stop("dummy data should have beta defined") if (d$degree != 0) stop("dummy data cannot have non-zero degree arg; use formula") # loc.dim = length(attr(tr, "term.labels")) loc.dim = dim(coordinates(newdata))[[2]] .Call(gstat_new_dummy_data, as.integer(loc.dim), as.integer(d$has.intercept), as.double(d$beta), nmax, nmin, maxdist, as.integer(d$vfn), as.integer(is.projected(newdata)), as.integer(d$vdist)) raw = list(xlevels = NULL) } else { if (is.null(d$weights)) w = numeric(0) else w = d$weights raw = gstat.formula(d$formula, d$data) .Call(gstat_new_data, as.double(raw$y), as.double(raw$locations), as.double(raw$X), as.integer(raw$has.intercept), as.double(d$beta), nmax, nmin, maxdist, as.integer(d$force), as.integer(d$vfn), as.numeric(w), double(0.0), as.integer(d$degree), as.integer(is.projected(d$data)), as.integer(d$vdist), as.double(d$lambda), as.integer(d$omax)) } if (!is.null(object$model[[name]])) load.variogram.model(object$model[[name]], c(i - 1, i - 1), max_dist = max_dist) raw = gstat.formula.predict(d$formula, newdata, na.action = na.action, (length(BLUE) == 2 && BLUE[2]), xlev = raw$xlevels) if (is.null(new.X)) new.X = raw$X else new.X = cbind(new.X, raw$X) if (i > 1) { for (j in 1:(i - 1)) { cross = cross.name(names(object$data)[j], name) if (!is.null(object$model[[cross]])) load.variogram.model(object$model[[cross]], c(i - 1, j - 1), max_dist = max_dist) } } } if (!is.null(object$set)) gstat.load.set(object$set) if (!is.null(object$merge)) gstat.load.merge(object) if (is(newdata, "SpatialPolygons")) { pol = newdata@polygons if (length(pol) != nrow(raw$locations)) stop("polygons and center points length mismatch") block = matrix(NA, 0, 2) nd = as(newdata, "SpatialPolygons") block.cols = rep(as.numeric(NA), length(pol)) for (i in seq(along.with = pol)) { sps.args$x = nd[i] cc = coordinates(do.call("spsample", sps.args)) cc[,1] = cc[,1] - raw$locations[i,1] cc[,2] = cc[,2] - raw$locations[i,2] block.cols[i] = nrow(block) + 1 block = rbind(block, cc) } if (length(pol) == 1) block.cols = 2 } else if (is(newdata, "SpatialLines")) { lin = newdata@lines if (length(lin) != nrow(raw$locations)) stop("lines and line midpoints length mismatch") block = matrix(NA, 0, 2) nd = as(newdata, "SpatialLines") block.cols = rep(as.numeric(NA), length(lin)) for (i in seq(along.with = lin)) { sps.args$x = nd[i] cc = coordinates(do.call("spsample", sps.args)) cc[,1] = cc[,1] - raw$locations[i,1] cc[,2] = cc[,2] - raw$locations[i,2] block.cols[i] = nrow(block) + 1 block = rbind(block, cc) } if (length(lin) == 1) block.cols = 2 } else if (!is.null(dim(block))) { # i.e., block is data.frame or matrix if (is.data.frame(block) && !is.null(block$weights)) { bl_weights = block$weights block$weights = NULL } block = data.matrix(block) # converts to numeric block.cols = ncol(block) } else { block = as.numeric(block) # make sure it's not integer block.cols = numeric(0) } # handle NA's in the parts of newdata used: valid.pattern = NULL if (any(is.na(raw$locations)) || any(is.na(new.X))) { valid.pattern = !(apply(cbind(raw$locations, new.X), 1, function(x) any(is.na(x)))) raw$locations.all = raw$locations raw$locations = as.matrix(raw$locations[valid.pattern, ]) new.X = as.matrix(new.X[valid.pattern, ]) } if (nsim) { if (indicators == TRUE) nsim = -abs(nsim) # random path: randomly permute row indices perm = sample(seq(along.with = new.X[, 1])) ret = .Call(gstat_predict, as.integer(nrow(as.matrix(new.X))), as.double(as.vector(raw$locations[perm, ])), as.double(as.vector(new.X[perm,])), as.integer(block.cols), as.vector(block), as.vector(bl_weights), as.integer(nsim), as.integer(BLUE))[[1]] if (abs(nsim) == 1) colsel = seq(1, by=2, length.out=nvars) # pred1 var1 pred2 var2 ... else colsel = TRUE ret = data.frame(cbind(raw$locations, matrix(ret[order(perm), colsel], nrow(as.matrix(new.X)), abs(nsim) * nvars))) } else { ret = .Call(gstat_predict, as.integer(nrow(as.matrix(new.X))), as.double(as.vector(raw$locations)), as.vector(new.X), as.integer(block.cols), as.vector(block), as.vector(bl_weights), as.integer(nsim), as.integer(BLUE))[[1]] ret = data.frame(cbind(raw$locations, ret)) } .Call(gstat_exit, NULL) if (!is.null(valid.pattern) && any(valid.pattern)) { ret.all = data.frame(matrix(NA, length(valid.pattern), ncol(ret))) ret.all[, 1:ncol(raw$locations.all)] = raw$locations.all ret.all[valid.pattern, ] = ret ret = ret.all } if (abs(nsim) > 0) { names.vars = names(object$data) if (length(names.vars) > 1) names.vars = paste(rep(names.vars, each = abs(nsim)), paste("sim", 1:abs(nsim), sep = ""), sep = ".") else names.vars = paste("sim", 1:abs(nsim), sep = "") } else names.vars = create.gstat.names(names(object$data)) names(ret) = c(dimnames(raw$locations)[[2]], names.vars) if (return.sp) { if (is(newdata, "SpatialPolygons")) { row.names(ret) = sapply(newdata@polygons, function(x) slot(x, "ID")) ret = SpatialPolygonsDataFrame(as(newdata, "SpatialPolygons"), ret, match.ID = TRUE) } else if (is(newdata, "SpatialLines")) { row.names(ret) = sapply(newdata@lines, function(x) slot(x, "ID")) ret = SpatialLinesDataFrame(as(newdata, "SpatialLines"), ret, match.ID = TRUE) } else { coordinates(ret) = dimnames(raw$locations)[[2]] if (gridded(newdata)) { returnFullGrid = fullgrid(newdata) fullgrid(newdata) = FALSE ret = new("SpatialPixelsDataFrame", new("SpatialPixels", as(ret, "SpatialPoints"), grid = newdata@grid, grid.index = newdata@grid.index, bbox = newdata@bbox), data = ret@data, coords.nrs = ret@coords.nrs) fullgrid(ret) = returnFullGrid } } slot(ret, "proj4string") = slot(newdata, "proj4string") if (to_sf) { ret = if (to_stars) { if (!requireNamespace("stars", quietly = TRUE)) stop("stars required: install that first") # nocov if (nsim) sim_to_dimension(stars::st_as_stars(ret), nsim) else stars::st_as_stars(ret) } else { if (gridded(ret) && fullgrid(ret)) fullgrid(ret) = FALSE if (!requireNamespace("sf", quietly = TRUE)) stop("sf required: install that first") # nocov sf::st_as_sf(ret) } } } return(ret) } # call with: create.gstat.names(names(object$data)) # creates the names of the output columns in case of (multivariable) prediction create.gstat.names <- function(ids, names.sep = ".") { nvars = length(ids) names.vars = character(nvars * 2 + nvars * (nvars - 1)/2) pos = 1 for (i in 1:length(ids)) { name = ids[i] names.vars[1 + (i - 1) * 2] = paste(name, "pred", sep = names.sep) names.vars[2 + (i - 1) * 2] = paste(name, "var", sep = names.sep) if (i > 1) { for (j in 1:(i - 1)) { cross = paste(ids[j], name, sep = names.sep) names.vars[nvars * 2 + pos] = paste("cov", cross, sep = names.sep) pos = pos + 1 } } } return(names.vars) } getMaxDist = function(dataLst, newdata) { spBbox <- SpatialPoints(cbind(newdata@bbox[cbind(c(1,1,1,1), c(1,2,1,1))], newdata@bbox[cbind(c(2,2,2,2), c(1,1,1,2))]), proj4string = newdata@proj4string) d <- c(spDists(spBbox)[cbind(c(1,3),c(2,4))]) # d = apply(bbox(newdata), 1, diff) if (!is.null(dataLst[[1]]$data)) { spBbox2 <- SpatialPoints(cbind(dataLst[[1]]$data@bbox[cbind(c(1,1,1,1), c(1,2,1,1))], dataLst[[1]]$data@bbox[cbind(c(2,2,2,2), c(1,1,1,2))]), proj4string = dataLst[[1]]$data@proj4string) d2 <- c(spDists(spBbox2)[cbind(c(1,3),c(2,4))]) # d2 = apply(bbox(dataLst[[1]]$data), 1, diff) d = apply(rbind(d,d2), 2, max) # there are pathetic cases where this would not be sufficient } if (length(d) == 2) d = c(d, 0) stopifnot(length(d) == 3) d } gstat/R/plot.gstatVariogram.R0000644000176200001440000001130615060550314015667 0ustar liggesusers# $Id: plot.gstatVariogram.q,v 1.15 2007-06-08 18:03:25 edzer Exp $ "plot.gstatVariogram" <- function (x, model = NULL, ylim, xlim, xlab = "distance", ylab = attr(x, "what"), panel = vgm.panel.xyplot, multipanel = TRUE, plot.numbers = FALSE, scales = list(), ids = x$id, group.id = TRUE, skip, layout, ...) { if (missing(ylim)) { ylim = c(min(0, 1.04 * min(x$gamma)), 1.04 * max(x$gamma)) ylim.set = FALSE } else ylim.set = TRUE if (missing(xlim)) xlim = c(0, 1.04 * max(x$dist)) labels = NULL shift = 0.03 if (is.numeric(plot.numbers)) { shift = plot.numbers plot.numbers = TRUE } if (plot.numbers == TRUE) labels = as.character(x$np) if (length(unique(x$dir.ver)) > 1 || any(x$dir.ver != 0)) warning("vertical directions are not dealt with -- yet!") if (length(unique(x$dir.hor)) > 1 && group.id == TRUE) { # directional, grouped: if (multipanel) { if (length(levels(ids)) > 1) { # multivariate directional: xyplot(gamma ~ dist | as.factor(dir.hor), data = x, type = c("p", "l"), xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, groups = ids, scales = scales, ...) } else # univariate directional, multipanel: xyplot(gamma ~ dist | as.factor(dir.hor), subscripts = TRUE, panel = panel, data = x, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, direction = x$dir.hor, labels = labels, model = model, shift = shift, mode = "directional", scales = scales, ...) } else { # univariate directional, using symbol/color to distinguish pch = as.integer(as.factor(x$dir.hor)) xyplot(gamma ~ dist, data = x, type = c("p", "l"), groups = pch, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, pch = pch, scales = scales, ...) } } else if (length(unique(ids)) > 1) { # multivariable: n = floor(sqrt(2 * length(unique(ids)))) if (missing(skip)) { skip = NULL for (row in n:1) for (col in 1:n) skip = c(skip, row < col) } if (missing(layout)) layout = c(n,n) if (missing(scales)) scales = list(y = list(relation = "free")) else if (!is.null(scales$relation) && scales$relation == "same") ylim.set = TRUE if (length(unique(x$dir.hor)) > 1) { # multiv.; directional groups if (ylim.set) { xyplot(gamma ~ dist | id, data = x, type = c("p", "l"), xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, groups = as.factor(x$dir.hor), layout = layout, skip = skip, scales = scales, ...) } else { xyplot(gamma ~ dist | id, data = x, type = c("p", "l"), xlim = xlim, xlab = xlab, ylab = ylab, groups = as.factor(x$dir.hor), layout = layout, skip = skip, scales = scales, ...) } } else { # non-multi-directional, multivariable if (ylim.set) { xyplot(gamma ~ dist | id, data = x, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, ids = ids, panel= panel, labels = labels, scales = scales, layout = layout, skip = skip, prepanel = function(x, y) list(ylim = c(min(0, y), max(0, y))), model = model, direction = c(x$dir.hor[1], x$dir.ver[1]), shift = shift, mode = "cross", ...) } else { xyplot(gamma ~ dist | id, data = x, xlim = xlim, xlab = xlab, ylab = ylab, ids = ids, panel = panel, labels = labels, scales = scales, layout = layout, skip = skip, prepanel = function(x, y) list(ylim = c(min(0, y), max(0, y))), model = model, direction = c(x$dir.hor[1], x$dir.ver[1]), shift = shift, mode = "cross", ...) } } } else # non multi-directional, univariable -- mostly used of all: xyplot(gamma ~ dist, data = x, panel = panel, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, labels = labels, model = model, direction = c(x$dir.hor[1], x$dir.ver[1]), shift = shift, mode = "direct", scales = scales, ...) } "plot.variogramMap" <- function(x, np = FALSE, skip, threshold, ...) { x = x$map if (!is(x, "SpatialPixelsDataFrame")) stop("x should be of class, or extend, SpatialPixelsDataFrame") if (np) start = 2 else start = 1 idx = seq(start, ncol(x@data), by=2) n = floor(sqrt(length(idx) * 2)) if (missing(skip)) { skip = NULL for (row in n:1) for (col in 1:n) skip = c(skip, row < col) } if (!(missing(threshold))) x = x[x[[2]] >= threshold, ] levelplot(values ~ dx + dy | ind, as.data.frame(stack(x, select = idx)), asp = mapasp(x), layout = c(n, n), skip = skip, ...) } gstat/R/krige0.R0000644000176200001440000001064415060550314013105 0ustar liggesusersextractFormula = function(formula, data, newdata) { # extract y and X from data: m = model.frame(terms(formula), as(data, "data.frame"), na.action = na.fail) y = model.extract(m, "response") if (length(y) == 0) stop("no response variable present in formula") Terms = attr(m, "terms") X = model.matrix(Terms, m) # extract x0 from newdata: terms.f = delete.response(terms(formula)) mf.f = model.frame(terms.f, newdata) #, na.action = na.action) x0 = model.matrix(terms.f, mf.f) list(y = y, X = X, x0 = x0) } idw0 = function(formula, data, newdata, y, idp = 2.0) { s = coordinates(data) s0 = coordinates(newdata) if (missing(y)) y = extractFormula(formula, data, newdata)$y D = 1.0 / (spDists(s0, s) ^ idp) sumD = apply(D, 1, sum) D %*% y / sumD } CHsolve = function(A, b) { # solves A x = b for x if A is PD symmetric #A = chol(A, LINPACK=TRUE) -> deprecated A = chol(A) # but use pivot=TRUE? backsolve(A, forwardsolve(A, b, upper.tri = TRUE, transpose = TRUE)) } krige0 <- function(formula, data, newdata, model, beta, y, ..., computeVar = FALSE, fullCovariance = FALSE) { if (inherits(data, "ST")) stopifnot(identical(data@sp@proj4string@projargs, newdata@sp@proj4string@projargs)) else stopifnot(identical(data@proj4string@projargs, newdata@proj4string@projargs)) lst = extractFormula(formula, data, newdata) X = lst$X x0 = lst$x0 if (missing(y)) y = lst$y ll = (!is.na(is.projected(data)) && !is.projected(data)) s = coordinates(data) s0 = coordinates(newdata) if (is(model, "variogramModel")) { require(gstat) V = variogramLine(model, dist_vector = spDists(s, s, ll), covariance = TRUE) v0 = variogramLine(model, dist_vector = spDists(s, s0, ll), covariance = TRUE) c0 = variogramLine(model, dist_vector = c(0), covariance = TRUE)$gamma } else { V = model(data, data, ...) v0 = model(data, newdata, ...) if (computeVar) { if (is(newdata, "SpatialLines") || is(newdata, "SpatialPolygons")) stop("varying target support (SpatialLines, SpatialPolygons) is not implemented") c0 = as.numeric(model(newdata[1, drop=FALSE], newdata[1, drop=FALSE])) # ?check this: provide TWO arguments, so model(x,y) can target # eventually Y, instead of measurements Z=Y+e # with e measurement error term e } } if (!missing(beta)) { # sk: skwts = CHsolve(V, v0) if (computeVar) var <- c0 - apply(v0*skwts, 2, sum) } else { # ok/uk -- need to estimate beta: skwts = CHsolve(V, cbind(v0, X)) ViX = skwts[,-(1:nrow(s0))] skwts = skwts[,1:nrow(s0)] beta = solve(t(X) %*% ViX, t(ViX) %*% y) if (computeVar) { Q = t(x0) - t(ViX) %*% v0 var <- c0 - apply(v0*skwts, 2, sum) + apply(Q * CHsolve(t(X) %*% ViX, Q), 2, sum) } } pred = x0 %*% beta + t(skwts) %*% (y - X %*% beta) if (computeVar) { if (fullCovariance) { corMat <- cov2cor(variogramLine(model, dist_vector = spDists(s0, s0), covariance = TRUE)) var <- corMat*matrix(sqrt(var) %x% sqrt(var), nrow(corMat), ncol(corMat)) } list(pred = pred, var = var) } else pred } # define variogram model FUNCTION that can deal with x and y # being of class SpatialPolygons OR SpatialPoints; SpatialGrid/Pixels are coerced to SpatialPolygons vgmArea = function(x, y = x, vgm, ndiscr = 16, verbose = FALSE, covariance = TRUE) { if (gridded(x)) x = as(x, "SpatialPolygons") if (gridded(y)) y = as(y, "SpatialPolygons") stopifnot(is(x, "SpatialPolygons") || is(x, "SpatialPoints")) stopifnot(is(y, "SpatialPolygons") || is(y, "SpatialPoints")) stopifnot(is(vgm, "variogramModel")) nx = length(x) ny = length(y) V = matrix(NA, nx, ny) if (verbose) pb = txtProgressBar(style = 3, max = nx) for (i in 1:nx) { if (is(x, "SpatialPolygons")) px = spsample(x[i,], ndiscr, "regular", offset = c(.5,.5)) else px = x[i,] for (j in 1:ny) { if (is(y, "SpatialPolygons")) py = spsample(y[j,], ndiscr, "regular", offset = c(.5,.5)) else py = y[j,] D = spDists(px, py) D[D == 0] = 1e-10 V[i,j] = mean(variogramLine(vgm, dist_vector = D, covariance = covariance)) } if (verbose) setTxtProgressBar(pb, i) } if (verbose) close(pb) V } gstat/R/plot.variogramCloud.R0000644000176200001440000000437515060550314015663 0ustar liggesusers# $Id: plot.variogramCloud.q,v 1.7 2007-10-18 10:13:13 edzer Exp $ "plot.variogramCloud" <- function (x, identify = FALSE, digitize = FALSE, xlim = c(0, max(x$dist)), ylim, # = c(0, max(x$gamma)), xlab = "distance", ylab = "semivariance", keep = FALSE, ...) { if (identify || digitize) { if (missing(ylim)) ylim = c(0, max(x$gamma)) dots = list(...) if ("log" %in% names(dots)) { log = dots$log if (grep("x", log) & xlim[1] == 0) xlim[1] = min(x$dist)/2 if (grep("y", log) & ylim[1] == 0) ylim[1] = min(x$gamma)/2 } plot(x$dist, x$gamma, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, ...) .BigInt = attr(x, ".BigInt") head = floor(x$np %/% .BigInt) + 1 tail = floor(x$np %% .BigInt) + 1 if (identify) { print("mouse-left identifies, mouse-right or Esc stops") labs = paste(head, tail, sep = ",") sel = identify(x$dist, x$gamma, labs, pos = keep) ret = data.frame(cbind(head, tail)[sel,, drop = FALSE]) } else { print("mouse-left digitizes, mouse-right closes polygon") poly = locator(n = 512, type = "l") if (!is.null(poly)) sel = point.in.polygon(x$dist, x$gamma, poly$x, poly$y) else stop("digitized selection is empty") ret = data.frame(cbind(head, tail)[sel == 1,,drop = FALSE]) } class(ret) = c("pointPairs", "data.frame") if (keep) { if (identify) { attr(x, "sel") = sel attr(x, "text") = labs[sel$ind] } else # digitize attr(x, "poly") = poly attr(x, "ppairs") = ret return(x) } else return(ret) } else { sel = attr(x, "sel") lab = attr(x, "text") poly = attr(x, "poly") if (!is.null(sel) && !is.null(lab)) { if (missing(ylim)) ylim = c(0, max(x$gamma)) plot(x$dist, x$gamma, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, ...) text(x$dist[sel$ind], x$gamma[sel$ind], labels=lab, pos= sel$pos) } else if (!is.null(poly)) { if (missing(ylim)) ylim = c(0, max(x$gamma)) plot(x$dist, x$gamma, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, ...) lines(poly$x, poly$y) } else { x$np = rep(1, length(x$gamma)) plot.gstatVariogram(x, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, ...) } } } gstat/R/ossfim.R0000644000176200001440000000143515060550314013222 0ustar liggesusers# $Id: ossfim.q,v 1.3 2006-02-10 19:01:07 edzer Exp $ "ossfim" <- function(spacings = 1:5, block.sizes = 1:5, model, nmax = 25, debug = 0) { n = floor(sqrt(nmax)) + 1 x = 0:(n-1) + .5 x = sort(c(-x, x)) ret = matrix(NA, length(spacings) * length(block.sizes), 3) r = 1 for (sp in spacings) { for (bl in block.sizes) { data.grid = data.frame(expand.grid(x * sp, x * sp), z = rep(1, length(x)^2)) names(data.grid) = c("x", "y", "z") gridded(data.grid) = c("x", "y") x0 = SpatialPoints(matrix(0, 1, 2)) kr = krige(z~1, data.grid, x0, block = c(bl, bl), model = model, nmax = nmax, set = list(debug = debug)) ret[r, ] = c(sp, bl, sqrt(kr[["var1.var"]][1])) r = r + 1 } } ret = data.frame(ret) names(ret) = c("spacing", "block.size", "kriging.se") ret } gstat/R/panel.pointPairs.R0000644000176200001440000000206615060550314015151 0ustar liggesusers# $Id: panel.pointPairs.q,v 1.3 2008-03-10 10:00:10 edzer Exp $ "panel.pointPairs" <- function (x, y, type = "p", pch = plot.symbol$pch, col, col.line = plot.line$col, col.symbol = plot.symbol$col, lty = plot.line$lty, cex = plot.symbol$cex, lwd = plot.line$lwd, pairs = pairs, line.pch = line.pch, ...) { x = as.numeric(x) y = as.numeric(y) if (length(x) > 0) { if (!missing(col)) { if (missing(col.line)) col.line = col if (missing(col.symbol)) col.symbol = col } plot.symbol = trellis.par.get("plot.symbol") plot.line = trellis.par.get("plot.line") lpoints(x = x, y = y, cex = cex, col = col.symbol, pch = pch, ...) if (!missing(pairs)) { for (i in seq(along.with = pairs[,1])) { xx = c(x[pairs[i,1]], x[pairs[i,2]]) yy = c(y[pairs[i,1]], y[pairs[i,2]]) llines(x = xx, y = yy, lty = lty, col = col.line, lwd = lwd) if (line.pch > 0) lpoints(mean(xx), mean(yy), pch = line.pch, col = col.line) } } } } gstat/R/show.vgms.R0000644000176200001440000000535315060550314013660 0ustar liggesusers# $Id: show.vgms.q,v 1.6 2008-12-15 14:27:29 edzer Exp $ "show.vgms" <- function(min = 1e-12 * max, max = 3, n = 50, sill = 1, range = 1, models = as.character(vgm()$short[c(1:17)]), nugget = 0, kappa.range = 0.5, plot = TRUE, ..., as.groups = FALSE) { zero.range.models = c("Nug", "Int", "Lin", "Err") # print(models) L = max(length(sill), length(range), length(nugget), length(models), length(kappa.range)) sill = rep(sill, length.out = L) range = rep(range, length.out = L) nugget = rep(nugget, length.out = L) i = 0 if (length(kappa.range) > 1) { # loop over kappa values for Matern model: if (missing(models)) models = "Mat" stopifnot(models == "Mat" || models == "Ste" || models == "Exc") data = matrix(NA, n * length(kappa.range), 2) v.level = rep("", n * length(kappa.range)) for (kappa in kappa.range) { v = vgm(sill[i+1], models, range[i+1], nugget = nugget[i+1], kappa = kappa) x = variogramLine(v, 0, 1, 0) data[(i*n+1), ] = as.matrix(x) x = variogramLine(v, max, n - 1, min) data[(i*n+2):((i+1)*n), ] = as.matrix(x) m.name = paste("vgm(", sill[i+1], ",\"", models, "\",", range, sep = "") if (nugget[i+1] > 0) m.name = paste(m.name, ",nugget=", nugget[i+1], sep = "") m.name = paste(m.name, ",kappa=", kappa, ")", sep = "") v.level[(i*n+1):((i+1)*n)] = rep(m.name, n) i = i + 1 } } else { models = rep(models, length.out = L) data = matrix(NA, n * length(models), 2) v.level = rep("", n * length(models)) for (m in models) { this.range = ifelse(!is.na(pmatch(m, zero.range.models)), 0, range[i+1]) v = vgm(sill[i+1], m, this.range, nugget = nugget[i+1], kappa = kappa.range) x = variogramLine(v, 0, 1, 0) data[(i*n+1), ] = as.matrix(x) x = variogramLine(v, max, n - 1, min) data[(i*n+2):((i+1)*n), ] = as.matrix(x) m.name = paste("vgm(", sill[i+1], ",\"", m, "\",", this.range, sep = "") if (nugget[i+1] > 0) m.name = paste(m.name, ",nugget=", nugget[i+1], sep = "") m.name = paste(m.name, ")", sep = "") v.level[(i*n+1):((i+1)*n)] = rep(m.name, n) i = i + 1 } } dframe = data.frame(semivariance = data[,2], distance = data[,1], model = factor(v.level, levels = unique(v.level))) vgm.panel = function(x,y, ...) { n = length(x) lpoints(x[1],y[1]) llines(x[2:n],y[2:n]) } vgm.panel2 = function(x, y, subscripts, groups, ...) { lpoints(0, 0, col = 1) panel.superpose(x, y, subscripts, groups, ...) } if (!plot) dframe else { if (as.groups) { model = 0 # avoid NOTE on cran check xyplot(semivariance ~ distance, groups = model, dframe[dframe$distance > 0,], panel = vgm.panel2, as.table = TRUE, auto.key = TRUE, type = 'l', ...) } else xyplot(semivariance ~ distance | model, dframe, panel = vgm.panel, as.table = TRUE, ...) } } gstat/R/gstat.cv.R0000644000176200001440000000525315060550314013455 0ustar liggesusers# $Id: gstat.cv.q,v 1.9 2009-10-30 16:11:21 edzer Exp $ "gstat.cv" <- function (object, nfold = nrow(object$data[[1]]$data), remove.all = FALSE, verbose = interactive(), all.residuals = FALSE, ...) { if (!inherits(object, "gstat")) stop("first argument should be of class gstat") var1 = object$data[[1]] data = var1$data formula = var1$formula if (all.residuals) { nc = length(object$data) ret = data.frame(matrix(NA, nrow(data), nc)) } else { cc = coordinates(data) rownames(cc) = NULL df = data.frame(matrix(as.numeric(NA), nrow(data), 2)) ret = SpatialPointsDataFrame(cc, df, proj4string = data@proj4string) } if (missing(nfold)) nfold = 1:nrow(data) if (length(nfold) == nrow(data)) fold = nfold else if (nfold < nrow(data)) fold = sample(nfold, nrow(data), replace = TRUE) else fold = 1:nrow(data) if (all.residuals || (remove.all && length(object$data) > 1)) { all.data = list() for (v in 1:length(object$data)) all.data[[v]] = object$data[[v]]$data } if (verbose) pb <- txtProgressBar(1,length(unique(fold)),style=3) for (i in sort(unique(fold))) { if (verbose) setTxtProgressBar(pb, i) sel = which(fold == i) object$data[[1]]$data = data[-sel, ] if (remove.all && length(object$data) > 1) { for (v in 2:length(object$data)) { varv = object$data[[v]] varv$data = all.data[[v]] #atv = gstat.formula(varv$formula, varv$data)$locations #at1 = gstat.formula(formula, data[sel, ])$locations atv = coordinates(varv$data) at1 = coordinates(data[sel,]) cc = rbind(atv, at1) rownames(cc) = NULL # as there will be duplicates all = SpatialPoints(cc, proj4string = data@proj4string) zd = zerodist(all) skip = zd[, 1] object$data[[v]]$data = varv$data[-skip, ] } } x = predict(object, newdata = data[sel, ], ...) if (all.residuals) { for (i in 1:length(object$data)) { var.i = object$data[[i]] data.i = all.data[[i]] formula.i = var.i$formula observed = gstat.formula(formula.i, data.i)$y[sel] pred.name = paste(names(object$data)[i], "pred", sep = ".") residual = as.numeric(observed - x[[pred.name]]) ret[sel, i] = residual } } else { ret[[1]][sel] = x[[1]] ret[[2]][sel] = x[[2]] } } if (verbose) cat("\n") if (! all.residuals) { names(ret) = names(x)[1:2] ret$observed = gstat.formula(formula, data)$y pred.name = paste(names(object$data)[1], "pred", sep = ".") ret$residual = ret$observed - ret[[pred.name]] var.name = paste(names(object$data)[1], "var", sep = ".") ret$zscore = ret$residual/sqrt(ret[[var.name]]) ret$fold = fold } else names(ret) = names(object$data) if (!is.null(object$locations)) ret = as.data.frame(ret) ret } gstat/R/fit.variogram.R0000644000176200001440000000766615060550314014506 0ustar liggesusers# $Id: fit.variogram.q,v 1.10 2008-12-15 14:27:29 edzer Exp $ "fit.variogram" <- function (object, model, fit.sills = TRUE, fit.ranges = TRUE, fit.method = 7, debug.level = 1, warn.if.neg = FALSE, fit.kappa = FALSE) { cl = match.call() if (missing(object)) stop("nothing to fit to") if (!inherits(object, "gstatVariogram") && !inherits(object, "variogramCloud")) stop("object should be of class gstatVariogram or variogramCloud") if (inherits(object, "variogramCloud")) object$np = rep(1, nrow(object)) if (length(unique(object$id)) > 1) stop("to use fit.variogram, variogram object should be univariable") if (missing(model)) stop("no model to fit") if (is(model, "variogramModelList")) { ret = lapply(model, function(x) fit.variogram(object, x, fit.sills = fit.sills, fit.ranges = fit.ranges, fit.method = fit.method, debug.level = debug.level, warn.if.neg = warn.if.neg, fit.kappa = fit.kappa)) sse = sapply(ret, function(x) attr(x, "SSErr")) return(ret[[which.min(sse)]]) } if (!inherits(model, "variogramModel")) stop("model should be of class variogramModel (use vgm)") if (fit.method == 5) stop("use function fit.variogram.reml() to use REML") if (length(fit.sills) < length(model$model)) fit.sills = rep(fit.sills, length(model$model)) if (length(fit.ranges) < length(model$model)) fit.ranges = rep(fit.ranges, length(model$model)) if (fit.method == 7 && any(object$dist == 0)) stop("fit.method 7 will not work with zero distance semivariances; use another fit.method value") if (any(is.na(model$psill)) || any(is.na(model$range))) model = vgm_fill_na(model, object) fit.ranges = fit.ranges & !(model$model %in% c("Nug", "Err")) # no ranges to fit for Nug/Err if (isTRUE(fit.kappa)) fit.kappa = seq(0.3, 5, 0.1) if (any(model$model %in% c("Mat", "Ste")) && length(fit.kappa) > 1) { f = function(x, o, m) { m[m$model %in% c("Mat", "Ste"), "kappa"] = x fit.variogram(o, m, fit.kappa = FALSE, fit.method = fit.method, debug.level = debug.level) # fits range } ret = lapply(fit.kappa, f, object, model) return(ret[[ which.min(sapply(ret, function(x) attr(x, "SSErr"))) ]]) } initialRange = model$range .Call(gstat_init, as.integer(debug.level)) .Call(gstat_load_ev, object$np, object$dist, object$gamma) load.variogram.model(model) ret = .Call(gstat_fit_variogram, as.integer(fit.method), as.integer(fit.sills), as.integer(fit.ranges)) .Call(gstat_exit, 0) model$psill = ret[[1]] model$range = ret[[2]] attr(model, "singular") = as.logical(ret[[3]]); attr(model, "SSErr") = ret[[4]] direct = attr(object, "direct") if (!is.null(direct)) { id = unique(object$id) if (any(direct[direct$id == id, "is.direct"]) && any(model$psill < 0)) { if (warn.if.neg) warning("partial sill or nugget fixed at zero value") fit.sills = model$psill > 0 model$psill[model$psill < 0] = 0.0 model$range = initialRange return(fit.variogram(object, model, fit.sills = fit.sills, fit.ranges = fit.ranges, fit.method = fit.method, debug.level = debug.level, warn.if.neg = warn.if.neg, fit.kappa = fit.kappa)) } } if (attr(model, "singular") && debug.level) { rat = mean(object$gamma) / mean(object$dist) if (rat > 1e6 || rat < 1e-6) print("a possible solution MIGHT be to scale semivariances and/or distances") } attr(model, "call") = cl model } vgm_fill_na = function(model, obj) { if (any(is.na(model$range))) { model[model$model %in% c("Nug", "Err"), "range"] = 0 model[!model$model %in% c("Nug", "Err"), "range"] = max(obj$dist) / 3 } if (any(model$model %in% "Nug") && is.na(model[model$model == "Nug","psill"])) model[model$model == "Nug", "psill"] = mean(head(obj$gamma, 3)) na_sills = is.na(model[model$model != "Nug", "psill"]) if (any(na_sills)) { n = length(model[model$model != "Nug",]$psill) model[model$model != "Nug", "psill"] = mean(tail(obj$gamma, 5)) / n } model } gstat/R/spplot.R0000644000176200001440000000121015060550314013232 0ustar liggesusersspplot.vcov = function(x, ...) { basenames = sub(".pred", "", names(x)[grep(".pred",names(x))]) n = length(basenames) names = NULL skip = NULL for (i in 1:n) { skp = rep(TRUE, n) pos = 1 if (i > 1) { for (j in 1:(i-1)) { names = c(names, paste("cov", basenames[j], basenames[i], sep = ".")) skp[pos] = FALSE pos = pos + 1 } } names = c(names, paste(basenames[i], ".var", sep = "")) skp[pos] = FALSE skip = c(skip, skp) } spplot(x, names, skip = skip, layout = c(n,n), as.table = TRUE, ...) } gstat/R/krige.cv.R0000644000176200001440000000345115060550314013432 0ustar liggesusers# $Id: krige.cv.q,v 1.18 2009-10-30 16:11:21 edzer Exp $ if (!isGeneric("krige.cv")) setGeneric("krige.cv", function(formula, locations, ...) standardGeneric("krige.cv")) krige.cv.locations = function (formula, locations, data = sys.frame(sys.frame(sys.parent())), model = NULL, ..., beta = NULL, nmax = Inf, nmin = 0, maxdist = Inf, nfold = nrow(data), verbose = interactive(), debug.level = 0) { gstat.cv(gstat(g = NULL, id = "var1", formula = formula, locations = locations, data = data, model = model, beta = beta, nmax = nmax, nmin = nmin, maxdist = maxdist, ...), nfold = nfold, verbose = verbose, debug.level = debug.level) } setMethod("krige.cv", c("formula", "formula"), krige.cv.locations) krige.cv.spatial = function (formula, locations, model = NULL, ..., beta = NULL, nmax = Inf, nmin = 0, maxdist = Inf, nfold = nrow(locations), verbose = interactive(), debug.level = 0) { # data = locations gstat.cv(gstat(g = NULL, id = "var1", formula = formula, data = locations, model = model, beta = beta, nmax = nmax, nmin = nmin, maxdist = maxdist, ...), nfold = nfold, verbose = verbose, debug.level = debug.level) } setMethod("krige.cv", c("formula", "Spatial"), krige.cv.spatial) krige.cv.sf = function (formula, locations, model = NULL, ..., beta = NULL, nmax = Inf, nmin = 0, maxdist = Inf, nfold = nrow(locations), verbose = interactive(), debug.level = 0) { # data = locations if (!requireNamespace("sf", quietly = TRUE)) stop("sf required: install that first") # nocov sf::st_as_sf(gstat.cv(gstat(g = NULL, id = "var1", formula = formula, data = as(locations, "Spatial"), model = model, beta = beta, nmax = nmax, nmin = nmin, maxdist = maxdist, ...), nfold = nfold, verbose = verbose, debug.level = debug.level)) } setMethod("krige.cv", c("formula", "sf"), krige.cv.sf) gstat/R/gstat.debug.R0000644000176200001440000000023515060550314014126 0ustar liggesusers# $Id: gstat.debug.q,v 1.3 2006-02-10 19:01:07 edzer Exp $ "gstat.debug" <- function(level = 0) { invisible(.Call(gstat_debug_level, as.integer(level))) } gstat/R/load.variogram.model.R0000644000176200001440000000244315060550314015726 0ustar liggesusers# $Id: load.variogram.model.q,v 1.7 2008-11-12 10:04:22 edzer Exp $ "load.variogram.model" <- function(model, ids = c(0, 0), max_dist = rep(-1.0, 3)) { if (missing(model)) stop("model is missing"); if (!inherits(model, "variogramModel")) stop("model should be of mode variogramModel (use function vgm)") if (any(model$range < 0.0)) { print(model) stop("variogram range can never be negative") } stopifnot(length(max_dist) == 3) anis = c(model$ang1, model$ang2, model$ang3, model$anis1, model$anis2) if (is.null(attr(model, "table"))) covtable = numeric(0) else { covtable = attr(model, "table") if (dim(model)[1] > 1 || model$model != "Tab") stop("table can only have one single model") } # max_dist hack here for Lin(0) models: # if (max_dist > 0) { # w = which(model$model %in% c("Lin") & model$range == 0) # if (length(w) > 0) { # model[w,"psill"] = max_dist * model[w,"psill"] # model[w,"range"] = max_dist # cat("Conversion into equivalent model:\n") # print(model) # } # } if (!any(model$model %in% c("Lin", "Pow"))) max_dist = rep(-1.0, 3) # ignore .Call(gstat_load_variogram, as.integer(ids), as.character(model$model), as.numeric(model$psill), as.numeric(model$range), as.numeric(model$kappa), as.numeric(anis), covtable, as.numeric(max_dist)) } gstat/R/print.gstat.R0000644000176200001440000000451715060550314014203 0ustar liggesusers# $Id: print.gstat.q,v 1.7 2006-02-10 19:01:07 edzer Exp $ "print.gstat" <- function (x, ...) { if (missing(x) || !inherits(x, "gstat")) stop("wrong call") data.names <- names(x$data) if (length(data.names)) cat("data:\n") for (n in data.names) { fstr = paste(x$data[[n]]$formula[c(2, 1, 3)], collapse = "") #lstr = paste(x$data[[n]]$locations[c(1, 2)], collapse = "") cat(n, ": formula =", fstr, ";") if (!is.null(x$data[[n]]$data)) { data.dim = dim(x$data[[n]]$data) cat(" data dim =", data.dim[1], "x", data.dim[2]) } else { if (x$data[[n]]$dummy) cat(" dummy data") else cat(" NULL data") } if (x$data[[n]]$nmax != Inf) cat(" nmax =", x$data[[n]]$nmax) if (x$data[[n]]$nmin > 0) cat(" nmin =", x$data[[n]]$nmin) if (x$data[[n]]$maxdist < Inf) cat(" radius =", x$data[[n]]$maxdist) if (x$data[[n]]$vfn > 1) cat(" variance function =", c("identity", "mu", "mu(1-mu)", "mu^2", "mu^3")[x$data[[n]]$vfn]) if (length(x$data[[n]]$beta) > 0) cat(" beta =", x$data[[n]]$beta) if (x$data[[n]]$degree > 0) cat(" degree =", x$data[[n]]$degree) cat("\n") } xx.names = xx = NULL for (n in data.names) { m = x$model[[n]] if (!is.null(m)) { xx = rbind(xx, m) if (nrow(m) == 1) xx.names = c(xx.names, n) else xx.names = c(xx.names, paste(n, "[", 1:nrow(m), "]", sep = "")) } } if (length(data.names) > 1) { for (j in 2:length(data.names)) { for (i in 1:(j - 1)) { n = cross.name(data.names[i], data.names[j]) m = x$model[[n]] if (!is.null(m)) { xx = rbind(xx, m) if (nrow(m) == 1) xx.names = c(xx.names, n) else xx.names = c(xx.names, paste(n, "[", 1:nrow(m), "]", sep = "")) } } } } if (!is.null(xx)) { cat("variograms:\n") row.names(xx) = xx.names print(xx, ...) } if (!is.null(x$set)) { s = gstat.set(x$set) for (i in 1:length(s)) cat(s[i], "\n") } if (!is.null(x$locations)) print(x$locations) invisible(x) } gstat/R/print.variogram.R0000644000176200001440000000021215060550314015034 0ustar liggesusers# $Id: print.variogram.q,v 1.3 2006-02-10 19:01:07 edzer Exp $ "print.gstatVariogram" <- function(x, ...) { print(data.frame(x), ...) } gstat/R/vgm.R0000644000176200001440000001110015060550314012501 0ustar liggesusers# $Id: vgm.q,v 1.12 2007-02-27 22:09:32 edzer Exp $ warn.angle3 = TRUE "vgm" <- function(psill = NA, model, range = NA, nugget, add.to, anis, kappa = 0.5, ..., covtable, Err = 0) { add.to.df = function(x, y) { x = rbind(x, y) row.names(x) = 1:nrow(x) return(x) } if (is.character(psill)) { # as of ``vgm("Sph")'' if (length(psill) > 1) { ret = lapply(psill, function(x) vgm(x)) class(ret) = c("variogramModelList", "list") return(ret) } # else: if (psill == "Nug") return(vgm(NA, "Nug", NA)) else return(vgm(NA, psill, NA, NA)) } stopifnot(length(psill) == 1) stopifnot(length(range) == 1) stopifnot(missing(nugget) || length(nugget) == 1) stopifnot(length(kappa) == 1) m = .Call(gstat_get_variogram_models, as.integer(0)) n = length(m) mf = factor(m, levels = m) if (missing(model)) { ml = .Call(gstat_get_variogram_models, as.integer(1)) mlf = factor(ml, levels = ml) return(data.frame(short = mf, long = mlf)) } if (length(model) > 1) { ret = lapply(model, function(x) vgm(,x)) class(ret) = c("variogramModelList", "list") return(ret) } table = NULL if (model == "Tab" && !missing(covtable)) { table = as.matrix(covtable) if (NCOL(table) != 2) stop("covtable should be a 2-column matrix with distance and cov.") range = max(table[,1]) if (min(table[,1]) != 0.0) stop("the first covariance value should be at distance 0.0") table = table[,2] mf = factor(c(m, "Tab"), levels = c(m, "Tab")) if (!missing(add.to) || !missing(nugget) || Err > 0) stop("cannot add submodels or nugget to covariance Table model") } else if (!any(m == model)) stop(paste("variogram model", model, "unknown\n")) if (missing(anis)) anis = c(0,0,0,1,1) if (length(anis) == 2) anis = c(anis[1], 0, 0, anis[2], 1) else if (length(anis) != 5) stop("anis vector should have length 2 (2D) or 5 (3D)") if (warn.angle3 && anis[3] != 0.0) { warn.angle3 = FALSE warning("you are using the third rotation angle; this code is based on the GSLIB2 code\nand must contain the bug described at the end of http://pangea.stanford.edu/ERE/research/scrf/software/gslib/bug/") } if (!is.na(range)) { if (model != "Nug") { if (model != "Lin" && model != "Err" && model != "Int") if (range <= 0.0) stop("range should be positive") else if(range < 0.0) stop("range should be non-negative") } else { if (range != 0.0) stop("Nugget should have zero range") if (anis[4] != 1.0 || anis[5] != 1.0) stop("Nugget anisotropy is not meaningful") } } if (!missing(nugget)) { ret = data.frame(model=mf[mf==model], psill=psill, range=range, kappa = kappa, ang1=anis[1], ang2=anis[2], ang3=anis[3], anis1=anis[4], anis2=anis[5]) n.vgm = data.frame(model=mf[mf=="Nug"], psill=nugget, range=0, kappa = 0.0, ang1=0.0, ang2=0.0, ang3=0.0, anis1=1.0, anis2=1.0) ret = add.to.df(n.vgm, ret) } else ret = data.frame(model=mf[mf==model], psill=psill, range=range, kappa = kappa, ang1=anis[1], ang2=anis[2], ang3=anis[3], anis1=anis[4], anis2=anis[5]) if (!missing(add.to)) ret = add.to.df(data.frame(add.to), ret) if (Err > 0) ret = add.to.df(data.frame(model=mf[mf=="Err"], psill=Err, range=0.0, kappa = kappa, ang1=anis[1], ang2=anis[2], ang3=anis[3], anis1=anis[4], anis2=anis[5]), ret) if (!is.null(table)) attr(ret, "table") = table class(ret) = c("variogramModel", "data.frame") ret } as.vgm.variomodel = function(m) { model = NULL if (m$cov.model == "exponential") model = "Exp" else if (m$cov.model == "circular") model = "Cir" else if (m$cov.model == "gaussian") model = "Gau" else if (m$cov.model == "linear") # model = "Lin" stop("no correct conversion available; use power model with power 1?") else if (m$cov.model == "matern") model = "Mat" else if (m$cov.model == "wave") model = "Wav" else if (m$cov.model == "power") model = "Pow" else if (m$cov.model == "spherical") model = "Sph" else if (m$cov.model == "pure.nugget") return(vgm(m$nugget + m$cov.pars[1], "Nug", 0)) else stop("variogram model not supported") # "cauchy", #,"cubic", # "gneiting", # "gneiting.matern", # "powered.exponential", # "wave") ) { vgm(m$cov.pars[1], model, m$cov.pars[2], m$nugget, kappa = m$kappa) } #$lambda #[1] 1 #$trend #[1] "cte" #$max.dist #[1] 1441.83 #attr(,"class") #[1] "variomodel" plot.variogramModel = function(x, cutoff, ..., type = 'l') { if (missing(cutoff)) stop("parameter cutoff needs to be specified") l = variogramLine(x, cutoff, ...) xyplot(gamma ~ dist, l, ylim = c(0, 1.04 * max(l$gamma)), xlim = c(0, max(l$dist)), type = type, xlab = "distance", ylab = "semivariance") } gstat/R/plot.pointPairs.R0000644000176200001440000000121715060550314015025 0ustar liggesusers# $Id: plot.pointPairs.q,v 1.4 2006-02-10 19:01:07 edzer Exp $ "plot.pointPairs" <- function(x, data, xcol = data$x, ycol = data$y, xlab = "x coordinate", ylab = "y coordinate", col.line = 2, line.pch = 0, main = "selected point pairs", ...) { if (inherits(data, "sf")) data = as(data, "Spatial") if (is(data, "SpatialPoints")) { cc = coordinates(data) xcol = cc[,1] ycol = cc[,2] xlab = colnames(cc)[1] ylab = colnames(cc)[2] asp = mapasp(data) } else asp = "iso" xyplot(ycol ~ xcol, aspect = asp, panel = panel.pointPairs, xlab = xlab, ylab = ylab, pairs = x, col.line = col.line, line.pch = line.pch, main = main, ...) } gstat/R/variogram.gstat.R0000644000176200001440000000204415060550314015027 0ustar liggesusers# $Id: variogram.gstat.q,v 1.9 2007-04-06 11:29:58 edzer Exp $ "variogram.gstat" = function (object, ...) { if (!inherits(object, "gstat")) stop("first argument should be of class gstat") y = list() locations = list() X = list() beta = list() grid = list() projected = TRUE for (i in seq(along.with = object$data)) { d = object$data[[i]] beta[[i]] = d$beta if (i > 1 && !identical(object$data[[1]]$data@proj4string@projargs, d$data@proj4string@projargs)) stop("data items in gstat object have different coordinate reference systems") raw = gstat.formula(d$formula, d$data) y[[i]] = raw$y locations[[i]] = raw$locations X[[i]] = raw$X grid[[i]] = raw$grid if (is(d$data, "Spatial")) projected = is.projected(d$data) if (d$degree != 0) stop("degree != 0: residual variograms wrt coord trend using degree not supported") } names(y) = names(locations) = names(X) = names(object$data) # call variogram.default() next: variogram(y, locations, X, trend.beta = beta, grid = grid, g = object, ..., projected = projected) } gstat/R/vgm.panel.R0000644000176200001440000000472515060550314013616 0ustar liggesusers# $Id: vgm.panel.q,v 1.7 2007-06-08 06:45:52 edzer Exp $ "get.direction.unitv" <- function(alpha, beta) { cb = cos(beta) c(cb * sin(alpha), cb * cos(alpha), sin(beta)) } "vgm.panel.xyplot" <- function (x, y, subscripts, type = "p", pch = plot.symbol$pch, col, col.line = plot.line$col, col.symbol = plot.symbol$col, lty = plot.line$lty, cex = plot.symbol$cex, ids, lwd = plot.line$lwd, model = model, direction = direction, labels, shift = shift, mode = mode, ...) { x <- as.numeric(x) y <- as.numeric(y) if (length(x) > 0) { if (!missing(col)) { if (missing(col.line)) col.line <- col if (missing(col.symbol)) col.symbol <- col } plot.symbol <- trellis.par.get("plot.symbol") plot.line <- trellis.par.get("plot.line") lpoints(x = x, y = y, cex = cex, col = col.symbol, pch = pch, type = type, ...) if (!is.null(labels)) ltext(x = x + shift * max(x), y = y, labels = labels[subscripts]) if (mode == "direct") { if (!missing(model) && !is.null(model)) { ang.hor <- pi * (direction[1]/180) ang.ver <- pi * (direction[2]/180) dir <- get.direction.unitv(ang.hor, ang.ver) ret <- variogramLine(model, max(x), dir = dir) llines(x = ret$dist, y = ret$gamma, lty = lty, col = col.line, lwd = lwd) } } else if (mode == "cross") { id <- as.character(ids[subscripts][1]) if (!missing(model) && !is.null(model)) { if (inherits(model, "gstat")) m = model$model else m = model if (!is.list(m)) stop("model argument not of class gstat or list") if (is.list(m) && !is.null(m[[id]])) { ang.hor <- pi * (direction[1]/180) ang.ver <- pi * (direction[2]/180) dir <- get.direction.unitv(ang.hor, ang.ver) ret <- variogramLine(m[[id]], max(x), dir = dir) llines(x = ret$dist, y = ret$gamma, lty = lty, col = col.line, lwd = lwd) } } } else if (mode == "directional") { if (!missing(model) && !is.null(model)) { dir <- c(1, 0, 0) if (!missing(direction)) { ang.hor <- pi * (direction[subscripts][1]/180.0) dir <- get.direction.unitv(ang.hor, 0) } ret <- variogramLine(model, max(x), dir = dir) llines(x = ret$dist, y = ret$gamma, lty = lty, col = col.line, lwd = lwd) } } } } gstat/R/fit.variogram.reml.R0000644000176200001440000000312615060550314015427 0ustar liggesusers# $Id: fit.variogram.reml.q,v 1.14 2009-11-02 21:33:17 edzer Exp $ "fit.variogram.reml" <- function (formula, locations, data, model, debug.level = 1, set, degree = 0) { if (missing(formula)) stop("nothing to fit to") if (!inherits(formula, "formula")) stop("first argument should be of class formula") if (!missing(locations)) { if (inherits(locations, "formula")) coordinates(data) = locations else if (is(locations, "Spatial")) data = as(locations, "SpatialPointsDataFrame") } if (!is(data, "SpatialPointsDataFrame")) stop("data should (now) be of class SpatialPointsDataFrame") if (missing(model)) stop("no model to fit") if (!inherits(model, "variogramModel")) stop("model should be of class variogramModel (use vgm)") fit.sills = rep(TRUE, length(model$model)) fit.ranges = rep(FALSE, length(model$model)) .Call(gstat_init, as.integer(debug.level)) ret = gstat.formula(formula, data) ret$y <- residuals(lm(formula, data)) .Call(gstat_new_data, as.double(ret$y), as.double(ret$locations), as.double(ret$X), as.integer(1), double(0), as.integer(-1), as.integer(0), as.double(-1), as.integer(0), as.integer(1), double(0), double(0), as.integer(degree), as.integer(is.projected(data)), as.integer(0), as.double(1.0), as.integer(0)) load.variogram.model(model) if (!missing(set)) gstat.load.set(set) ret = .Call(gstat_fit_variogram, as.integer(5), as.integer(fit.sills), as.integer(fit.ranges)) .Call(gstat_exit, 0) model$psill = ret[[1]] model$range = ret[[2]] model } gstat/R/hscat.R0000644000176200001440000000151315060550314013021 0ustar liggesusershscat = function(formula, data, breaks, pch = 3, cex = .6, mirror = FALSE, variogram.alpha = 0, as.table = TRUE, ...) { stopifnot(!missing(breaks)) x = variogram(formula, data, cloud = TRUE, cutoff = max(breaks), alpha = variogram.alpha, ...) x = as.data.frame(x) x$class = cut(x$dist, breaks = breaks) y = model.frame(formula, data)[[1]] x$xx = y[x$left] x$yy = y[x$right] if (mirror) x = data.frame( xx = c(x$yy, y[x$left]), yy = c(x$xx, y[x$right]), class = c(x$class, x$class)) lab = as.character(formula)[2] panel = function(x,y,subscripts, ...) { xr = c(min(x),max(x)) llines(xr, xr) lpoints(x,y,...) ltext(min(x), max(y), paste("r =", signif(cor(x,y),3)), adj=c(0,0.5)) } xyplot(xx~yy|class, x, panel = panel, main = "lagged scatterplots", xlab = lab, ylab = lab, as.table = as.table, ...) } gstat/R/krigeTg.R0000644000176200001440000000437315060550314013322 0ustar liggesusers# $Id: krigeTg.q,v 1.4 2009-07-07 15:42:39 edzer Exp $ phiInv <- function (x, lambda) if (lambda==0) log(x) else (x^lambda-1)/lambda phi <- function(x, lambda) if (lambda==0) exp(x) else (x*lambda+1)^(1/lambda) phiPrime <- function (x, lambda) if (lambda==0) exp(x) else (x*lambda+1)^(1/lambda-1) phiDouble <- function (x, lambda) if (lambda==0) exp(x) else lambda * (1/lambda - 1) * (lambda * x + 1)^(1/lambda-2) krigeTg <- function(formula, locations, newdata, model = NULL, ..., nmax = Inf, nmin = 0, maxdist = Inf, block = numeric(0), nsim = 0, na.action = na.pass, debug.level = 1, lambda = 1.0) { m = model.frame(terms(formula), as.data.frame(locations)) Y = model.extract(m, "response") if (length(Y) == 0) stop("no response variable present in formula") Terms = attr(m, "terms") X = model.matrix(Terms, m) has.intercept = attr(Terms, "intercept") if (ncol(X) > 1) stop("only formula with intercept allowed, e.g. y ~ 1") locations$value = phiInv(Y, lambda) locations$value1 = rep(1, length(locations$value)) OK = krige(value ~ 1, locations, newdata, model, nmax = nmax, nmin = nmin, maxdist = maxdist, block = block, nsim = nsim, na.action = na.action, debug.level = debug.level, ...) if (nsim > 0) { OK@data = as.data.frame(phi(OK@data,lambda)) return(OK) } # else: # estimate mu: g = gstat(formula = value ~ 1, # locations = locations, data = locations, model = model, nmax = nmax, nmin = nmin, maxdist = maxdist, ...) mu = predict(g, newdata = newdata, block = block, nsim = nsim, na.action = na.action, debug.level = debug.level, BLUE = TRUE) OK$muhat = mu$var1.pred SK = krige(value1 ~ 1, locations, newdata, model = model, beta = 0.0, nmax = nmax, nmin = nmin, maxdist = maxdist, block = block, nsim = nsim, na.action = na.action, debug.level = debug.level, ...) # find m: OK$m = (OK$var1.var - SK$var1.var)/(1 - SK$var1.pred) # copy SK output: OK$var1SK.pred = SK$var1.pred OK$var1SK.var = SK$var1.var # compute transGaussian kriging estimate & variance: OK$var1TG.pred = phi(OK$var1.pred, lambda) + phiDouble(mu$var1.pred, lambda) * (OK$var1.var/2 - OK$m) OK$var1TG.var = phiPrime(mu$var1.pred, lambda)^2 * OK$var1.var OK } gstat/R/zzz.R0000644000176200001440000000066615060550314012564 0ustar liggesusers# $Id: zzz.q,v 1.10 2006-02-10 19:01:07 edzer Exp $ ### NAMESPACE VERSION: .onLoad <- function(lib, pkg) { # remove the require() call for 2.0.0: # require(lattice) # .Call(gstat_init, as.integer(1)) } ### pre-NAMESPACE VERSION: ## ".First.lib" <- ## function(lib, pkg) { ## require(lattice) ## library.dynam("gstat", pkg, lib) ## .Call(gstat_init, as.integer(1)) ## } variogram <- function(object, ...) UseMethod("variogram") gstat/R/gstat.formula.R0000644000176200001440000000152515060550314014510 0ustar liggesusers# $Id: gstat.formula.q,v 1.8 2007-06-08 06:45:52 edzer Exp $ "gstat.formula" <- function (formula, data) { # check for duplicated pixels; if yes coerce to SpatialPointsDataFrame: if (is(data, "SpatialPixels") && anyDuplicated(data@grid.index) != 0) gridded(data) = FALSE m = model.frame(terms(formula), as(data, "data.frame"), na.action = na.fail) Y = model.extract(m, "response") if (length(Y) == 0) stop("no response variable present in formula") Terms = attr(m, "terms") X = model.matrix(Terms, m) has.intercept = attr(Terms, "intercept") if (gridded(data)) grid = gridparameters(data) else grid = numeric(0) xlevels = .getXlevels(Terms, m) list(y = Y, locations = coordinates(data), X = X, call = call, has.intercept = has.intercept, grid = as.double(unlist(grid)), xlevels = xlevels) } gstat/R/fit.lmc.R0000644000176200001440000000354415060550314013261 0ustar liggesusers# $Id: fit.lmc.q,v 1.8 2009-10-06 07:52:00 edzer Exp $ "fit.lmc" <- function (v, g, model, fit.ranges = FALSE, fit.lmc = !fit.ranges, correct.diagonal = 1.0, ...) { posdef = function(X) { q = eigen(X) d = q$values d[d < 0] = 0 q$vectors %*% diag(d, nrow = length(d)) %*% t(q$vectors) } if (!inherits(v, "gstatVariogram")) stop("v should be of class gstatVariogram") if (!inherits(g, "gstat")) stop("g should be of class gstat") if (!missing(model)) { if (!inherits(model, "variogramModel")) stop("model should be of class variogramModel") } n = names(g$data) for (i in 1:length(n)) { for (j in i:length(n)) { name = ifelse(i == j, n[i], cross.name(n[i], n[j])) x = v[v$id == name, ] if (nrow(x) == 0) stop(paste("gstatVariogram", name, "not present")) m = g$model[[name]] if (!missing(model)) m = model g$model[[name]] = fit.variogram(x, m, fit.ranges = fit.ranges, ...) } } if (fit.lmc) { m = g$model[[n[1]]] for (k in 1:nrow(m)) { psill = matrix(NA, nrow = length(n), ncol = length(n)) for (i in 1:length(n)) { for (j in i:length(n)) { name = ifelse(i == j, n[i], cross.name(n[i], n[j])) psill[i, j] = psill[j, i] = g$model[[name]][k, "psill"] } } psill = posdef(psill) diag(psill) = diag(psill) * correct.diagonal for (i in 1:length(n)) { for (j in i:length(n)) { name = ifelse(i == j, n[i], cross.name(n[i], n[j])) g$model[[name]][k, "psill"] = psill[i, j] } } } } g } gstat/R/gstatOptions.R0000644000176200001440000000061515060550314014417 0ustar liggesusers.gstatOptions <- new.env(FALSE, globalenv()) assign("gstat_progress", TRUE, envir = .gstatOptions) get_gstat_progress <- function() { get("gstat_progress", envir = .gstatOptions) } set_gstat_progress <- function(value) { stopifnot(is.logical(value)) stopifnot(length(value) == 1) assign("gstat_progress", value, envir = .gstatOptions) get_gstat_progress() } gstat/R/circEmbed.R0000644000176200001440000002131515060550314013576 0ustar liggesusers## Benedikt Gräler (52North), 2018-05-25: ## circulant embedding following: Davies, Tilman M., and David Bryant. "On ## circulant embedding for Gaussian random fields in R." Journal of Statistical ## Software 55.9 (2013): 1-21. ## See i.e. the suplementary files at (retreived 2018-05-25): ## https://www.jstatsoft.org/index.php/jss/article/downloadSuppFile/v055i09/v55i09.R # extend the grid # input: SpatialGrid/SpatialPixels/GridTopology # output: extended grid of class GridTopology ceExtGrid <- function(grid, ext=2) { if (!inherits(grid, "GridTopology")) { stopifnot(gridded(grid)) grid <- grid@grid } GridTopology(grid@cellcentre.offset, grid@cellsize, grid@cells.dim*ext) } # only for comaprission following the above paper # expand and wrap a grid on a torus + calc distances # input: SpatialGrid # output: distance matrix ceWrapOnTorusCalcDist <- function(grid, ext=2) { grid <- ceExtGrid(grid, ext) rangeXY <- grid@cellsize * grid@cells.dim MN.ext <- prod(grid@cells.dim) gridCoords <- coordinates(grid) mmat.ext <- matrix(rep(gridCoords[, 1], MN.ext), MN.ext, MN.ext) nmat.ext <- matrix(rep(gridCoords[, 2], MN.ext), MN.ext, MN.ext) mmat.diff <- mmat.ext - t(mmat.ext) nmat.diff <- nmat.ext - t(nmat.ext) mmat.torus <- pmin(abs(mmat.diff), rangeXY[1] - abs(mmat.diff)) nmat.torus <- pmin(abs(nmat.diff), rangeXY[2] - abs(nmat.diff)) sqrt(mmat.torus^2 + nmat.torus^2) } ## FFT preparation with only first row of cov-matrix ceWrapOnTorusCalcCovRow1 <- function(grid, vgmModel, ext=2) { grid <- ceExtGrid(grid, ext) stopifnot("variogramModel" %in% class(vgmModel)) rangeXY <- grid@cellsize * grid@cells.dim cenX <- seq(from = grid@cellcentre.offset[1], by = grid@cellsize[1], length.out = grid@cells.dim[1]) cenY <- seq(from = grid@cellcentre.offset[2], by = grid@cellsize[2], length.out = grid@cells.dim[2]) m.diff.row1 <- abs(cenX[1] - cenX) m.diff.row1 <- pmin(m.diff.row1, rangeXY[1] - m.diff.row1) n.diff.row1 <- abs(cenY[1] - cenY) n.diff.row1 <- pmin(n.diff.row1, rangeXY[2] - n.diff.row1) cent.ext.row1 <- expand.grid(m.diff.row1, n.diff.row1) D.ext.row1 <- matrix(sqrt(cent.ext.row1[, 1]^2 + cent.ext.row1[, 2]^2), grid@cells.dim[1], grid@cells.dim[2]) variogramLine(vgmModel, dist_vector = D.ext.row1, covariance = T) } # simulate GRF with given covariance structure using fft # @input # covMatRow1: the first row of the covariance matrix for the fft # n: number of simulations # cells.dim: the original dimrensions of the grid to clip from the larger embedded simulation # grid.index: grid.index of a SpatialPixels object to select the right pixels from the larger square-grid # @output # matrix where each column holds one simulated GRF corresponding to cells.dim (and grid.index if appropriate) ceSim <- function(covMatRow1, n=1, cells.dim, grid.index) { d <- dim(covMatRow1) dp <- prod(d) sdp <- sqrt(dp) prefix <- sqrt(Re(fft(covMatRow1, TRUE))) simFun <- function(x) { std <- rnorm(dp) realz <- prefix * (fft(matrix(std, d[1], d[2]))/sdp) as.numeric(Re(fft(realz, TRUE)/sdp)[1:cells.dim[1], 1:cells.dim[2]]) } simFunGridIndex <- function(x) { std <- rnorm(dp) realz <- prefix * (fft(matrix(std, d[1], d[2]))/sdp) as.numeric(Re(fft(realz, TRUE)/sdp)[1:cells.dim[1], 1:cells.dim[2]])[grid.index] } if (missing(grid.index)) do.call(cbind, lapply(1:n, simFun)) else do.call(cbind, lapply(1:n, simFunGridIndex)) } # computes the covariance matrixes and weights once, applied to series of # variables/simulations where each variable/simulation is stored in one column of # the multiVarMatrix copied from krige0 to avoid repeted calls to krige with # multiple, identical inversions of the weights matrix krigeMultiple <- function(formula, from, to, model, multiVarMatrix) { lst = extractFormula(formula, from, to) X = lst$X x0 = lst$x0 ll = (!is.na(is.projected(from)) && !is.projected(from)) s = coordinates(from) s0 = coordinates(to) V = variogramLine(model, dist_vector = spDists(s, s, ll), covariance = TRUE) v0 = variogramLine(model, dist_vector = spDists(s, s0, ll), covariance = TRUE) skwts = CHsolve(V, cbind(v0, X)) ViX = skwts[, -(1:nrow(s0))] skwts = skwts[, 1:nrow(s0)] idPredFun <- function(sim) { sim <- matrix(sim, ncol = 1) beta = solve(t(X) %*% ViX, t(ViX) %*% sim) x0 %*% beta + t(skwts) %*% (sim - X %*% beta) } apply(multiVarMatrix, 2, idPredFun) } ### pubic function ### # @input: # formula: definition of the dependent variable # data: optional Spatial*DataFrame for conditional simulation # newdata: SpatialGrid or SpatialPixels # model: variogram model of the GRF # n: number of desired simulations # ext: extension degree of the circulant embedding, default to 2 # @output # SpatialPixels or SpatailGridDataFrame with (additional) n columns holding one (un)conditional simulation each krigeSimCE <- function(formula, data, newdata, model, n = 1, ext = 2) { stopifnot(is(model, "variogramModel")) stopifnot(gridded(newdata)) if (!missing(data)) stopifnot(identical(data@proj4string@projargs, newdata@proj4string@projargs)) varName <- all.vars(formula[[2]]) condSim <- TRUE if (missing(data)) { condSim <- FALSE message("[No data provided: performing unconditional simulation.]") } else { message("[Performing conditional simulation.]") } # prepare covariance matrix covMat <- ceWrapOnTorusCalcCovRow1(newdata, model, ext = ext) # simulate sims <- ceSim(covMat, n, newdata@grid@cells.dim, newdata@grid.index) colnames(sims) <- paste0(varName, ".sim", 1:n) # bind simulations to newdata geometry if (!condSim) { if ("data" %in% slotNames(newdata)) newdata@data <- cbind(newdata@data, sims) else addAttrToGeom(newdata, as.data.frame(sims)) return(newdata) } # function call ends here if no data has been provided -> unconditional case ## conditioning # interpolate the observations to the simulation grid obsMeanField <- krige(formula, data, newdata, model) # interpolate to observation locations from the simulated grids for each simulation simMeanObsLoc <- krigeMultiple(as.formula(paste0("var1.pred ~", formula[[3]])), obsMeanField, data, model, sims) # interpolate from kriged mean sim at observed locations back to the grid for mean surface of the simulations simMeanFields <- krigeMultiple(as.formula(paste0(varName, "~", formula[[3]])), data, newdata, model, simMeanObsLoc) # add up the mean field and the corrected data sims <- obsMeanField@data$var1.pred + sims - simMeanFields # bind simulations to newdata geometry if ("data" %in% slotNames(newdata)) { newdata@data <- cbind(newdata@data, sims) return(newdata) } addAttrToGeom(newdata, as.data.frame(sims)) } ### # Note: to avoid the smoothing effect, the irregular observation locations could also be independently simulated by e.g. their surrounding grid values ### ## circulant embedding for ST-ocvariance functions with grids along one spatial and one temporal axis # inputs: # hDiscrete = c(hStep, hn): spatial step width and number of steps # tDiscrete = c(tStep, tn): temporal step length and number of steps # CAVE: hDiscrete and tDiscrete must have the correct spatial and temporal metrics ceWrapSpaceTimeOnTorusCalcCovRow1 <- function(hDiscrete, tDiscrete, vgmStModel, ext=2, turningLayers=TRUE) { stopifnot(is(vgmStModel) == "StVariogramModel") hDiscrete[2] <- hDiscrete[2]*ext tDiscrete[2] <- tDiscrete[2]*ext rangeST <- c(prod(hDiscrete), prod(tDiscrete)) cenX <- seq(from = 0, by = hDiscrete[1], length.out = hDiscrete[2]) cenY <- seq(from = 0, by = tDiscrete[1], length.out = tDiscrete[2]) m.diff.row1 <- abs(cenX[1] - cenX) m.diff.row1 <- pmin(m.diff.row1, rangeST[1] - m.diff.row1) n.diff.row1 <- abs(cenY[1] - cenY) n.diff.row1 <- pmin(n.diff.row1, rangeST[2] - n.diff.row1) cent.ext.row1 <- expand.grid(m.diff.row1, n.diff.row1) D.ext.row1 <- matrix(sqrt(cent.ext.row1[, 1]^2 + cent.ext.row1[, 2]^2), hDiscrete[2], tDiscrete[2]) colnames(cent.ext.row1) <- c("spacelag", "timelag") if (turningLayers) { return(matrix(tbOperator(vgmStModel, dist_grid = cent.ext.row1)$gamma, hDiscrete[2], tDiscrete[2])) } matrix(variogramSurface(vgmStModel, dist_grid = cent.ext.row1, covariance = TRUE)$gamma, hDiscrete[2], tDiscrete[2]) } gstat/R/stVariogramModels.R0000644000176200001440000010457715060550314015377 0ustar liggesusers# constructiong spatio-temporal variogram models vgmST <- function(stModel, ..., space, time, joint, sill, k, nugget, stAni, temporalUnit) { stopifnot(is.character(stModel) && length(stModel)==1) old.stModel <- stModel stModel <- strsplit(stModel, "_")[[1]][1] if (stModel == "productSum" && !missing(sill)) stop("The sill argument for the product-sum model has been removed due a change in notation of the spatio-temporal models. This affects as well how the spatial and temporal variograms are parameterised. Re-fit your model or use \"productSumOld\" instead.") if(!missing(sill)) if(sill <= 0) stop("\"sill\" must be positive.") if(!missing(k)) if(k <= 0) stop("\"k\" must be positive.") if(!missing(nugget)) if(nugget < 0) stop("\"nugget\" must be non-negative.") if(!missing(stAni)) if(stAni <= 0) stop("\"stAni\" must be positive.") vgmModel <- switch(stModel, separable = list(space = space, time = time, sill = sill), productSum = list(space = space, time = time, k = k), productSumOld = list(space = space, time = time, sill = sill, nugget = nugget), sumMetric = list(space = space, time = time, joint = joint, stAni = stAni), simpleSumMetric = list(space = space, time = time, joint = joint, nugget = nugget, stAni = stAni), metric = list(joint = joint, stAni = stAni), stop(paste("model", stModel, "unknown"))) vgmModel$stModel <- old.stModel if (!missing(temporalUnit)) attr(vgmModel, "temporal unit") = temporalUnit class(vgmModel) <- c("StVariogramModel", "list") vgmModel } # calculating spatio-temporal variogram surfaces variogramSurface <- function(model, dist_grid, covariance=FALSE) { stopifnot(inherits(model, "StVariogramModel")) stopifnot(all(c("spacelag", "timelag") %in% colnames(dist_grid))) if (covariance) { switch(strsplit(model$stModel, "_")[[1]][1], separable=covSurfSeparable(model, dist_grid), productSum=covSurfProdSum(model, dist_grid), productSumOld=covSurfProdSumOld(model, dist_grid), sumMetric=covSurfSumMetric(model, dist_grid), simpleSumMetric=covSurfSimpleSumMetric(model, dist_grid), metric=covSurfMetric(model, dist_grid), stop("Only \"separable\", \"productSum\", \"sumMetric\", \"simpleSumMetric\" and \"metric\" are implemented.")) } else { switch(strsplit(model$stModel, "_")[[1]][1], separable=vgmSeparable(model, dist_grid), productSum=vgmProdSum(model, dist_grid), productSumOld=vgmProdSumOld(model, dist_grid), sumMetric=vgmSumMetric(model, dist_grid), simpleSumMetric=vgmSimpleSumMetric(model, dist_grid), metric=vgmMetric(model, dist_grid), stop("Only \"separable\", \"productSum\", \"sumMetric\", \"simpleSumMetric\" and \"metric\" are implemented.")) } } ################################ ## separable model: C_s * C_t ## ################################ vgmSeparable <- function(model, dist_grid) { vs = variogramLine(model$space, dist_vector=dist_grid$spacelag)$gamma vt = variogramLine(model$time, dist_vector=dist_grid$timelag)$gamma cbind(dist_grid, "gamma" = model$sill*(vs+vt-vs*vt)) } covSeparable <- function(x, y, model, separate) { if(missing(separate)) separate <- inherits(x, "STF") && inherits(y, "STF") && length(x) > 1 && length(y) > 1 # the STF case if (inherits(x, "STF") && inherits(y, "STF")) { # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix Sm = variogramLine(model$space, covariance = TRUE, dist_vector = ds)*model$sill Tm = variogramLine(model$time, covariance = TRUE, dist_vector = dt) if (separate) return(list(Sm = Sm, Tm = Tm)) else return(Tm %x% Sm) # kronecker product } # separate makes only sense if both of x and y inherit STF if (separate) stop("An efficient inversion by separating the covarinace model is only possible if both of \"x\" and \"y\" inherit \"STF\"") # the STI case if (inherits(x, c("STI", "sftime")) || inherits(y, c("STI", "sftime"))) { # make sure that now both are of type STI x <- as(x, "STI") y <- as(y, "STI") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix Sm = variogramLine(model$space, covariance = TRUE, dist_vector = ds)*model$sill Tm = variogramLine(model$time, covariance = TRUE, dist_vector = dt) return(Sm * Tm) } # the remaining cases, none of x and y is STI nor are both STF # make sure both are of type STS x <- as(x, "STS") y <- as(y, "STS") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # re-arrange the spatial and temporal distances sMat <- matrix(NA, nrow(x@index), nrow(y@index)) tMat <- matrix(NA, nrow(x@index), nrow(y@index)) for(r in 1:nrow(x@index)) { sMat[r,] <- ds[x@index[r,1], y@index[,1]] tMat[r,] <- dt[x@index[r,2], y@index[,2]] } # compose the cov-matrix Sm = variogramLine(model$space, covariance = TRUE, dist_vector = sMat)*model$sill Tm = variogramLine(model$time, covariance = TRUE, dist_vector = tMat) return(Sm * Tm) } # covariance for the circulant embedding in ST covSurfSeparable <- function(model, dist_grid) { Sm = variogramLine(model$space, covariance = TRUE, dist_vector = dist_grid$spacelag)$gamma*model$sill Tm = variogramLine(model$time, covariance = TRUE, dist_vector = dist_grid$timelag)$gamma cbind(dist_grid, "gamma" = Tm * Sm) } ########################################### ## productSum model: C_s*C_t + C_s + C_t ## ########################################### vgmProdSumOld <- function(model, dist_grid) { .Deprecated("vgmProdSum", package = "gstat", msg="The former product-sum model is dprecited, consider to refit the new model specification", old = "vgmProdSumOld") vs = variogramLine(model$space, dist_vector=dist_grid$spacelag)$gamma vt = variogramLine(model$time, dist_vector=dist_grid$timelag)$gamma vn <- rep(model$nugget, length(vs)) vn[vs == 0 & vt == 0] <- 0 k <- (sum(model$space$psill)+sum(model$time$psill)-(model$sill+model$nugget))/(sum(model$space$psill)*sum(model$time$psill)) if (k <= 0 || k > 1/max(rev(model$space$psill)[1], rev(model$time$psill)[1])) k <- 10^6*abs(k) # distorting the model to let optim "hopefully" find suitable parameters cbind(dist_grid, "gamma" = as.vector(vs+vt-k*vs*vt+vn)) } covProdSumOld <- function(x, y, model) { .Deprecated("covProdSum", package = "gstat", msg="The former product-sum model is dprecited, consider to refit the new model specification", old = "covProdSumOld") stopifnot(inherits(x, c("STF", "STS", "STI", "sftime")) && inherits(y, c("STF", "STS", "STI", "sftime"))) # double check model for validity, i.e. k: k <- (sum(model$space$psill)+sum(model$time$psill)-model$sill)/(sum(model$space$psill)*sum(model$time$psill)) if (k <= 0 || k > 1/max(model$space$psill[model$space$model!="Nug"], model$time$psill[model$time$model!="Nug"])) stop(paste("k (",k,") is non-positive or too large: no valid model!",sep="")) # the STF case if (inherits(x, "STF") && inherits(y, "STF")) { # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix vs = variogramLine(model$space, dist_vector = ds, covariance = TRUE) vt = variogramLine(model$time, dist_vector = dt, covariance = TRUE) return(model$sill-(vt %x% matrix(1,nrow(vs),ncol(vs)) + matrix(1,nrow(vt),ncol(vt)) %x% vs - k * vt %x% vs)) } # the STI case if(inherits(x, c("STI", "sftime")) || inherits(y, c("STI", "sftime"))) { # make sure that now both are of type STI x <- as(x, "STI") y <- as(y, "STI") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix vs = variogramLine(model$space, dist_vector = ds, covariance = TRUE) vt = variogramLine(model$time, dist_vector = dt, covariance = TRUE) return(model$sill-(vt + vs - k * vt * vs)) } # the remaining cases, none of x and y is STI nor are both STF # make sure both are of type STS x <- as(x, "STS") y <- as(y, "STS") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # re-arrange the spatial and temporal distances sMat <- matrix(NA, nrow(x@index), nrow(y@index)) tMat <- matrix(NA, nrow(x@index), nrow(y@index)) for(r in 1:nrow(x@index)) { sMat[r,] <- ds[x@index[r,1], y@index[,1]] tMat[r,] <- dt[x@index[r,2], y@index[,2]] } # compose the cov-matrix vs = variogramLine(model$space, dist_vector = sMat, covariance = TRUE) vt = variogramLine(model$time, dist_vector = tMat, covariance = TRUE) return(model$sill-(vt + vs - k * vt * vs)) } # covariance for the circulant embedding in ST covSurfProdSumOld <- function(model, dist_grid) { .Deprecated("covSurfProdSum", package = "gstat", msg="The former product-sum model is dprecited, consider to refit the new model specification", old = "covSurfProdSumOld") vs = variogramLine(model$space, dist_vector = dist_grid$spacelag, covariance = TRUE)$gamma vt = variogramLine(model$time, dist_vector = dist_grid$timelag, covariance = TRUE)$gamma k <- (sum(model$space$psill)+sum(model$time$psill)-(model$sill+model$nugget))/(sum(model$space$psill)*sum(model$time$psill)) cbind(dist_grid, "gamma" = model$sill-(vt + vs - k * vt * vs)) } vgmProdSum <- function(model, dist_grid) { if(!is.null(model$sill)) # backwards compatibility vgmProdSumOld(model, dist_grid) vs = variogramLine(model$space, dist_vector=dist_grid$spacelag)$gamma vt = variogramLine(model$time, dist_vector=dist_grid$timelag)$gamma sill_s <- sum(model$space$psill) sill_t <- sum(model$time$psill) k <- model$k cbind(dist_grid, "gamma" = as.vector((k*sill_t+1)*vs + (k*sill_s+1)*vt-k*vs*vt)) } covProdSum <- function(x, y, model) { stopifnot(inherits(x, c("STF", "STS", "STI", "sftime")) && inherits(y, c("STF", "STS", "STI", "sftime"))) if(!is.null(model$sill)) # backwards compatibility covProdSumOld(x, y, model) # the STF case if (inherits(x, "STF") && inherits(y, "STF")) { # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix vs = variogramLine(model$space, dist_vector = ds, covariance =TRUE) vt = variogramLine(model$time, dist_vector = dt, covariance =TRUE) return(vt %x% matrix(1,nrow(vs),ncol(vs)) + matrix(1,nrow(vt),ncol(vt)) %x% vs + model$k * vt %x% vs) } # the STI case if(inherits(x, c("STI", "sftime")) || inherits(y, c("STI", "sftime"))) { # make sure that now both are of type STI x <- as(x, "STI") y <- as(y, "STI") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix vs = variogramLine(model$space, dist_vector = ds, covariance=TRUE) vt = variogramLine(model$time, dist_vector = dt, covariance=TRUE) return(vt + vs + model$k * vt * vs) } # the remaining cases, none of x and y is STI nor are both STF # make sure both are of type STS x <- as(x, "STS") y <- as(y, "STS") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # re-arrange the spatial and temporal distances sMat <- matrix(NA, nrow(x@index), nrow(y@index)) tMat <- matrix(NA, nrow(x@index), nrow(y@index)) for(r in 1:nrow(x@index)) { sMat[r,] <- ds[x@index[r,1], y@index[,1]] tMat[r,] <- dt[x@index[r,2], y@index[,2]] } # compose the cov-matrix vs = variogramLine(model$space, dist_vector = sMat, covariance = TRUE) vt = variogramLine(model$time, dist_vector = tMat, covariance = TRUE) return(vt + vs + model$k * vt * vs) } # covariance for the circulant embedding in ST covSurfProdSum <- function(model, dist_grid) { vs = variogramLine(model$space, dist_vector = dist_grid$spacelag, covariance = TRUE)$gamma vt = variogramLine(model$time, dist_vector = dist_grid$timelag, covariance = TRUE)$gamma cbind(dist_grid, "gamma" = vt + vs + model$k * vt * vs) } ######################################################### # sumMetric model: C_s + C_t + C_st (Gerard Heuvelink) ## ######################################################### vgmSumMetric <- function(model, dist_grid) { vs = variogramLine(model$space, dist_vector=dist_grid$spacelag)$gamma vt = variogramLine(model$time, dist_vector=dist_grid$timelag)$gamma h = sqrt(dist_grid$spacelag^2 + (model$stAni * as.numeric(dist_grid$timelag))^2) vst = variogramLine(model$joint, dist_vector=h)$gamma cbind(dist_grid, "gamma" = vs + vt + vst) } covSumMetric <- function(x, y, model) { stopifnot(inherits(x, c("STF", "STS", "STI", "sftime")) && inherits(y, c("STF", "STS", "STI", "sftime"))) # the STF case if (inherits(x, "STF") && inherits(y, "STF")) { # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix Sm = variogramLine(model$space, covariance = TRUE, dist_vector = ds) Tm = variogramLine(model$time, covariance = TRUE, dist_vector = dt) h = sqrt((matrix(1,nrow(dt),ncol(dt)) %x% ds)^2 + (model$stAni * dt %x% matrix(1,nrow(ds),ncol(ds)))^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h) return(matrix(1,nrow(Tm),ncol(Tm)) %x% Sm + Tm %x% matrix(1,nrow(Sm),ncol(Sm)) + Mm) } # the STI case if(inherits(x, c("STI", "sftime")) || inherits(y, c("STI", "sftime"))) { # make sure that now both are of type STI x <- as(x, "STI") y <- as(y, "STI") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix Sm = variogramLine(model$space, covariance = TRUE, dist_vector = ds) Tm = variogramLine(model$time, covariance = TRUE, dist_vector = dt) h = sqrt(ds^2 + (model$stAni * dt)^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h) return(Sm + Tm + Mm) } # the remaining cases, none of x and y is STI nor are both STF # make sure both are of type STS x <- as(x, "STS") y <- as(y, "STS") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # re-arrange the spatial and temporal distances sMat <- matrix(NA, nrow(x@index), nrow(y@index)) tMat <- matrix(NA, nrow(x@index), nrow(y@index)) for(r in 1:nrow(x@index)) { sMat[r,] <- ds[x@index[r,1], y@index[,1]] tMat[r,] <- dt[x@index[r,2], y@index[,2]] } # compose the cov-matrix Sm = variogramLine(model$space, covariance = TRUE, dist_vector = sMat) Tm = variogramLine(model$time, covariance = TRUE, dist_vector = tMat) h = sqrt(sMat^2 + (model$stAni * tMat)^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h) return(Sm + Tm + Mm) } # covariance for the circulant embedding in ST covSurfSumMetric <- function(model, dist_grid) { Sm = variogramLine(model$space, covariance = TRUE, dist_vector = dist_grid$spacelag)$gamma Tm = variogramLine(model$time, covariance = TRUE, dist_vector = dist_grid$timelag)$gamma h = sqrt(dist_grid$spacelag^2 + (model$stAni * dist_grid$timelag)^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h)$gamma cbind(dist_grid, "gamma" = Sm + Tm + Mm) } ################################ ## simplified sumMetric model ## ################################ vgmSimpleSumMetric <- function(model, dist_grid) { vs = variogramLine(model$space, dist_vector=dist_grid$spacelag)$gamma vt = variogramLine(model$time, dist_vector=dist_grid$timelag)$gamma h = sqrt(dist_grid$spacelag^2 + (model$stAni * as.numeric(dist_grid$timelag))^2) vm = variogramLine(model$joint, dist_vector=h)$gamma vn <- variogramLine(vgm(model$nugget, "Nug", 0), dist_vector=h)$gamma cbind(dist_grid, "gamma" = vs + vt + vm + vn) } covSimpleSumMetric <- function(x, y, model) { modelNew <- vgmST("sumMetric", space=model$space, time=model$time, joint=vgm(model$joint$psill[model$joint$model != "Nug"], model$joint$model[model$joint$model != "Nug"], model$joint$range[model$joint$model != "Nug"], model$nugget), stAni=model$stAni) if (!is.null(attr(model,"temporal unit"))) attr(modelNew,"temporal unit") <- attr(model,"temporal unit") covSumMetric(x, y, modelNew) } # covariance for the circulant embedding in ST covSurfSimpleSumMetric <- function(model, dist_grid) { modelNew <- vgmST("sumMetric", space=model$space, time=model$time, joint=vgm(model$joint$psill[model$joint$model != "Nug"], model$joint$model[model$joint$model != "Nug"], model$joint$range[model$joint$model != "Nug"], model$nugget), stAni=model$stAni) if (!is.null(attr(model,"temporal unit"))) attr(modelNew,"temporal unit") <- attr(model,"temporal unit") covSurfSumMetric(modelNew, dist_grid) } ################## ## metric model ## ################## vgmMetric <- function(model, dist_grid) { h = sqrt(dist_grid$spacelag^2 + (model$stAni * as.numeric(dist_grid$timelag))^2) cbind(dist_grid, "gamma" = variogramLine(model$joint, dist_vector=h)$gamma) } covMetric <- function(x, y, model) { stopifnot(inherits(x, c("STF", "STS", "STI", "sftime")) && inherits(y, c("STF", "STS", "STI", "sftime"))) # the STF case if (inherits(x, "STF") && inherits(y, "STF")) { # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix h = sqrt((matrix(1,nrow(dt),ncol(dt)) %x% ds)^2 + (model$stAni * dt %x% matrix(1,nrow(ds),ncol(ds)))^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h) return(Mm) } # the STI case if (inherits(x, c("STI", "sftime")) || inherits(y, c("STI", "sftime"))) { # make sure that now both are of type STI x <- as(x, "STI") y <- as(y, "STI") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix h = sqrt(ds^2 + (model$stAni * dt)^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h) return(Mm) } # the remaining cases, none of x and y is STI nor are both STF # make sure both are of type STS x <- as(x, "STS") y <- as(y, "STS") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # re-arrange the spatial and temporal distances sMat <- matrix(NA, nrow(x@index), nrow(y@index)) tMat <- matrix(NA, nrow(x@index), nrow(y@index)) for(r in 1:nrow(x@index)) { sMat[r,] <- ds[x@index[r,1], y@index[,1]] tMat[r,] <- dt[x@index[r,2], y@index[,2]] } # compose the cov-matrix h = sqrt(sMat^2 + (model$stAni * tMat)^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h) return(Mm) } # covariance for the circulant embedding in ST covSurfMetric <- function(model, dist_grid) { h = sqrt(dist_grid$spacelag^2 + (model$stAni * dist_grid$timelag)^2) cbind(dist_grid, "gamma" = variogramLine(model$joint, covariance = TRUE, dist_vector = h)$gamma) } ########################### ## fitting ST variograms ## ########################### fit.StVariogram <- function(object, model, ..., method = "L-BFGS-B", lower, upper, fit.method = 6, stAni=NA, wles) { stopifnot(inherits(object, "StVariogram"), inherits(model, "StVariogramModel")) sunit <- attr(object$spacelag, "units") tunit <- attr(object$timelag, "units") tu.obj = attr(model, "temporal unit") if (!is.null(tu.obj)) stopifnot(identical(tunit, tu.obj)) object$timelag = as.numeric(object$timelag) # needed for R 4.1 object <- na.omit(object) ret <- model if(!missing(wles)) { if (wles) fit.method = 1 else fit.method = 6 } if (fit.method == 0) { attr(ret,"optim.output") <- "no fit" attr(ret, "MSE") <- mean((object$gamma - variogramSurface(model, data.frame(spacelag=object$dist, timelag=object$timelag))$gamma)^2) attr(ret, "spatial unit") <- sunit attr(ret, "temporal unit") <- tunit return(ret) } if ((fit.method == 7 || fit.method == 11) && is.null(model$stAni) && is.na(stAni)) { message("[An uninformed spatio-temporal anisotropy value of '1 (spatial unit)/(temporal unit)' is automatically selected. Consider providing a sensible estimate for stAni or using a different fit.method.]") stAni <- 1 } weightingFun <- switch(fit.method, function(obj, ...) obj$np, # 1 function(obj, gamma, ...) obj$np/gamma^2, # 2 function(obj, ...) obj$np, # 3 function(obj, gamma, ...) obj$np/gamma^2, # 4 function(obj, ...) stop("fit.method = 5 (REML), is not yet implemented"), # 5 function(obj, ...) 1, # 6 function(obj, curStAni, ...) if(is.na(stAni)) obj$np/(obj$dist^2+(curStAni*obj$timelag)^2) else obj$np/(obj$dist^2+(stAni*obj$timelag)^2), # 7 function(obj, ...) { dist <- obj$dist dist[dist == 0] <- min(dist[dist != 0], na.rm = TRUE) obj$np/dist^2 # 8, pure space, 0 dist = min (dist > 0) }, function(obj, ...) { dist <- obj$timelag dist[dist == 0] <- min(dist[dist != 0], na.rm = TRUE) obj$np/dist^2 }, # 9, pure time function(obj, gamma, ...) 1/gamma^2, # 10 function(obj, curStAni, ...) { if(is.na(stAni)) 1/(obj$dist^2+(curStAni*obj$timelag)^2) else 1/(obj$dist^2+(stAni*obj$timelag)^2) }, # 11 function(obj, ...) { dist <- obj$dist dist[dist == 0] <- min(dist[dist != 0], na.rm = TRUE) 1/(obj$dist^2) # 12, pure space }, function(obj, ...) { dist <- obj$timelag dist[dist == 0] <- min(dist[dist != 0], na.rm = TRUE) 1/(obj$timelag^2) }) # 13, pure time if(is.null(weightingFun)) stop(paste("fit.method =", fit.method, "is not implementend")) fitFun = function(par, trace = FALSE, ...) { curModel <- insertPar(par, model) gammaMod <- variogramSurface(curModel, data.frame(spacelag=object$dist, timelag=object$timelag))$gamma resSq <- (object$gamma - gammaMod)^2 resSq <- resSq * weightingFun(object, gamma=gammaMod, curStAni=curModel$stAni) if (trace) print(c(par, MSE = mean(resSq))) mean(resSq) # seems numerically more well behaved } if(missing(lower)) { min.s <- min(object$dist[object$dist>0])*0.05 # 5 % of the minimum distance larger 0 min.t <- min(object$dist[object$timelag>0])*0.05 # 5 % of the minimum time lag 0), pos <- sqrt(.Machine$double.eps) # at least positive lower <- switch(strsplit(model$stModel, "_")[[1]][1], separable=c(min.s, 0, min.t, 0, 0), productSum=c(0, min.s, 0, 0, min.t, 0, pos), productSumOld=c(0, min.s, 0, 0, min.t, 0, 0), sumMetric=c(0, min.s, 0, 0, min.t, 0, 0, pos, 0, pos), simpleSumMetric=c(0, min.s, 0, min.t, 0, pos, 0, 0, pos), metric=c(0, pos, 0, pos), stop("Only \"separable\", \"productSum\", \"sumMetric\", \"simpleSumMetric\" and \"metric\" are implemented.")) } if(missing(upper)) upper <- switch(strsplit(model$stModel, "_")[[1]][1], separable=c(Inf, 1, Inf, 1, Inf), productSum=Inf, productSumOld=Inf, sumMetric=Inf, simpleSumMetric=Inf, metric=Inf, stop("Only \"separable\", \"productSum\", \"sumMetric\", \"simpleSumMetric\" and \"metric\" are implemented.")) pars.fit <- optim(extractPar(model), fitFun, ..., method = method, lower = lower, upper = upper) ret <- insertPar(pars.fit$par, model) attr(ret,"optim.output") <- pars.fit attr(ret, "MSE") <- mean((object$gamma - variogramSurface(insertPar(pars.fit$par, model), data.frame(spacelag=object$dist, timelag=object$timelag))$gamma)^2) attr(ret, "spatial unit") <- sunit attr(ret, "temporal unit") <- tunit return(ret) } ########### ## tools ## ########### # insert parameters into models insertPar <- function(par, model) { switch(strsplit(model$stModel, "_")[[1]][1], separable=insertParSeparable(par, model), productSum=insertParProdSum(par, model), productSumOld=insertParProdSumOld(par, model), sumMetric=insertParSumMetric(par, model), simpleSumMetric=insertParSimpleSumMetric(par,model), metric=insertParMetric(par,model), stop("Only \"separable\", \"productSum\", \"sumMetric\", \"simpleSumMetric\" and \"metric\" are implemented.")) } # extract parameters from models extractPar <- function(model) { switch(strsplit(model$stModel, "_")[[1]][1], separable=c(range.s=model$space$range[2], nugget.s=model$space$psill[1], range.t=model$time$range[2], nugget.t=model$time$psill[1], sill= model$sill[[1]]), productSumOld=c(sill.s = rev(model$space$psill)[1], range.s = rev(model$space$range)[1], sill.t = rev(model$time$psill)[1], range.t = rev(model$time$range)[1], sill=model$sill[[1]], nugget=model$nugget[[1]]), productSum=c(sill.s = model$space$psill[2], range.s = model$space$range[2], nugget.s = model$space$psill[1], sill.t = model$time$psill[2], range.t = model$time$range[2], nugget.t = model$time$psill[1], k=model$k), sumMetric=c(sill.s = model$space$psill[2], range.s = model$space$range[2], nugget.s = model$space$psill[1], sill.t = model$time$psill[2], range.t = model$time$range[2], nugget.t = model$time$psill[1], sill.st = model$joint$psill[2], range.st = model$joint$range[2], nugget.st = model$joint$psill[1], anis = model$stAni[[1]]), # simplified sumMetric model simpleSumMetric=c(sill.s = rev(model$space$psill)[1], range.s = rev(model$space$range)[1], sill.t = rev(model$time$psill)[1], range.t = rev(model$time$range)[1], sill.st = rev(model$joint$psill)[1], range.st = rev(model$joint$range)[1], nugget = model$nugget[[1]], anis = model$stAni[[1]]), metric=c(sill = model$joint$psill[2], range = model$joint$range[2], nugget = model$joint$psill[1], anis = model$stAni[[1]]), stop("Only \"separable\", \"productSum\", \"sumMetric\", \"simpleSumMetric\" and \"metric\" are implemented.")) } # extract names extractParNames <- function(model) { names(extractPar(model)) } ## dedicated insertion functions ################################ # separable model insertParSeparable <- function(par, model) { vgmST("separable", space=vgm(1-par[2],as.character(model$space$model[2]),par[1],par[2], kappa=model$space$kappa[2]), time= vgm(1-par[4],as.character(model$time$model[2]),par[3],par[4], kappa=model$time$kappa[2]), sill=par[5]) } # product sum model insertParProdSumOld <- function(par, model) { vgmST("productSumOld", space=vgm(par[1],as.character(rev(model$space$model)[1]),par[2], kappa=rev(model$space$kappa)[1]), time= vgm(par[3],as.character(rev(model$time$model)[1]),par[4], kappa=rev(model$time$kappa)[1]), sill=par[5], nugget=par[6]) } insertParProdSum <- function(par, model) { vgmST("productSum", space=vgm(par[1],as.character(model$space$model[2]),par[2],par[3], kappa=model$space$kappa[2]), time= vgm(par[4],as.character(model$time$model[2]),par[5], par[6], kappa=model$time$kappa[2]), k=par[7]) } # sum metric model insertParSumMetric <- function(par, model) { vgmST("sumMetric", space=vgm(par[1],as.character(model$space$model[2]),par[2],par[3], kappa=model$space$kappa[2]), time= vgm(par[4],as.character(model$time$model[2]),par[5],par[6], kappa=model$time$kappa[2]), joint=vgm(par[7],as.character(model$joint$model[2]),par[8],par[9], kappa=model$joint$kappa[2]), stAni=par[10]) } # simplified sum metric model insertParSimpleSumMetric <- function(par, model) { vgmST("simpleSumMetric", space=vgm(par[1],as.character(rev(model$space$model)[1]),par[2], kappa=rev(model$space$kappa)[1]), time= vgm(par[3],as.character(rev(model$time$model)[1]),par[4], kappa=rev(model$time$kappa)[1]), joint=vgm(par[5],as.character(rev(model$joint$model)[1]),par[6], kappa=rev(model$joint$kappa)[1]), nugget=par[7], stAni=par[8]) } # metric model insertParMetric <- function(par, model) { vgmST("metric", joint=vgm(par[1], as.character(model$joint$model[2]), par[2], par[3], kappa=model$joint$kappa[2]), stAni=par[4]) } gstat/R/krige.R0000644000176200001440000001445015060550314013024 0ustar liggesusers# $Id: krige.q,v 1.15 2009-02-20 13:53:38 edzer Exp $ if (!isGeneric("krige")) setGeneric("krige", function(formula, locations, ...) standardGeneric("krige")) "krige.locations" <- function (formula, locations, data = sys.frame(sys.parent()), newdata, model = NULL, ..., beta = NULL, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block = numeric(0), nsim = 0, indicators = FALSE, na.action = na.pass, debug.level = 1) { g = gstat(formula = formula, locations = locations, data = data, model = model, beta = beta, nmax = nmax, nmin = nmin, omax = omax, maxdist = maxdist, ...) predict(g, newdata = newdata, block = block, nsim = nsim, indicators = indicators, na.action = na.action, debug.level = debug.level) } setMethod("krige", c("formula", "formula"), krige.locations) krige.spatial <- function(formula, locations, newdata, model = NULL, ..., beta = NULL, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block = numeric(0), nsim = 0, indicators = FALSE, na.action = na.pass, debug.level = 1) { # locations = coordinates(arg2) g = gstat(formula = formula, # locations = locations, data = locations, model = model, beta = beta, nmax = nmax, nmin = nmin, omax = omax, maxdist = maxdist, ...) predict(g, newdata = newdata, block = block, nsim = nsim, indicators = indicators, na.action = na.action, debug.level = debug.level) } setMethod("krige", c("formula", "Spatial"), krige.spatial) setMethod("krige", c("formula", "NULL"), function(formula, locations, newdata, ...) { # manual dispatch based on newdata: if (inherits(newdata, c("sf", "sfc", "stars"))) krige.sf(formula, locations, newdata = newdata, ...) else krige.spatial(formula, locations, newdata = newdata, ...) } ) krige.sf <- function(formula, locations, newdata, ..., nsim = 0) { if (!requireNamespace("sf", quietly = TRUE)) stop("sf required: install that first") # nocov if (!requireNamespace("stars", quietly = TRUE)) stop("stars required: install that first") # nocov crs = sf::st_crs(newdata) if (!is.null(locations)) { stopifnot(sf::st_crs(locations) == sf::st_crs(newdata)) crs = sf::st_crs(locations) if (!isTRUE(sf::st_is_longlat(locations))) { sf::st_crs(locations) = sf::NA_crs_ sf::st_crs(newdata) = sf::NA_crs_# to avoid problems not handled by sp... } locations = as(locations, "Spatial") } ret = krige(formula, locations, as(newdata, "Spatial"), ..., nsim = nsim) if (gridded(ret)) { st = stars::st_as_stars(ret) if (nsim > 0) st = sim_to_dimension(st, nsim) sf::st_set_crs(st, crs) } else sf::st_set_crs(sf::st_as_sf(ret), crs) } setMethod("krige", c("formula", "sf"), krige.sf) sim_to_dimension = function(st, nsim) { nms = names(stars::st_dimensions(st)) if (length(st) > nsim) { nvars = length(st) / nsim l = vector("list", nvars) vars = unique(sub("([^.]+)\\.[[:alnum:]]+$", "\\1", names(st))) for (i in 1:nvars) { range = seq((i-1) * nsim + 1, length.out = nsim) m = setNames(st[range], paste0("sim", 1:nsim)) l[[i]] = setNames(stars::st_set_dimensions(merge(m), names = c(nms, "sample")), vars[i]) } do.call(c, l) } else { if (nsim > 1) setNames(stars::st_set_dimensions(merge(st), names = c(nms, "sample")), "var1") else st } } setMethod(krige, signature("formula", "ST"), function(formula, locations, newdata, model, ...) { krigeST(formula, locations, newdata, model,...) } ) if (!isGeneric("idw")) setGeneric("idw", function(formula, locations, ...) standardGeneric("idw")) idw.locations <- function (formula, locations, data = sys.frame(sys.parent()), newdata, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block = numeric(0), na.action = na.pass, idp = 2.0, debug.level = 1) { krige(formula, locations, data, newdata, nmax = nmax, nmin = nmin, omax = omax, maxdist = maxdist, block = block, na.action = na.action, set = list(idp = idp), debug.level = debug.level) } setMethod("idw", c("formula", "formula"), idw.locations) idw.spatial <- function (formula, locations, newdata, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block = numeric(0), na.action = na.pass, idp = 2.0, debug.level = 1) { krige(formula, locations, newdata, nmax = nmax, nmin = nmin, omax = omax, maxdist = maxdist, block = block, na.action = na.action, set = list(idp = idp), debug.level = debug.level, model = NULL) } setMethod("idw", c("formula", "Spatial"), idw.spatial) idw.sf <- function (formula, locations, newdata, ..., idp = 2.0) { if (!requireNamespace("sf", quietly = TRUE)) stop("sf required: install that first") # nocov if (!requireNamespace("stars", quietly = TRUE)) stop("stars required: install that first") # nocov ret = krige(formula, locations, newdata, ..., set = list(idp = idp), model = NULL) if (inherits(newdata, c("sf", "sfc"))) sf::st_as_sf(ret) else if (inherits(newdata, "stars")) stars::st_as_stars(ret) else stop("newdata should be of class sf or stars") } setMethod("idw", c("formula", "sf"), idw.sf) STx2SpatialPoints = function(x, multiplyTimeWith = 1.0) { x = as(geometry(x), "STI") t1 = as.numeric(as.POSIXct(index(x@time))) t2 = as.numeric(x@endTime) time = multiplyTimeWith * (t1 + t2) / 2 cc = cbind(coordinates(x), time) SpatialPoints(cc, proj4string = x@sp@proj4string) } STxDF2SpatialPointsDataFrame = function(x, multiplyTimeWith = 1.0) { pts = STx2SpatialPoints(geometry(x), multiplyTimeWith) SpatialPointsDataFrame(pts, x@data) } SpatialPointsDataFrame2STxDF = function(x, class, tz = "", origin = as.POSIXct("1970-01-01",tz=tz)) { cc = coordinates(x) time = as.POSIXct(cc[,ncol(cc)], tz=tz, origin = origin) sp = SpatialPoints(cc[,-ncol(cc)], proj4string = x@sp@proj4string) st = as(STI(sp, time), class) addAttrToGeom(STI(sp, time), x@data) } idw.ST <- function (formula, locations, newdata, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block = numeric(0), na.action = na.pass, idp = 2.0, debug.level = 1, multiplyTimeWith = 1.0) { stopifnot(ncol(coordinates(locations@sp)) == 2) ret = krige(formula, STxDF2SpatialPointsDataFrame(locations, multiplyTimeWith), STx2SpatialPoints(newdata, multiplyTimeWith), nmax = nmax, nmin = nmin, omax = omax, maxdist = maxdist, block = block, na.action = na.action, set = list(idp = idp), debug.level = debug.level, model = NULL) SpatialPointsDataFrame2STxDF(ret, class(geometry(newdata))) } setMethod("idw", c("formula", "ST"), idw.ST) gstat/R/turningLayers.R0000644000176200001440000003052515060550314014572 0ustar liggesusers# # library(gstat) # # separable model: spatial and temporal sill will be ignored # # and kept constant at 1-nugget respectively. A joint sill is used. # separableModel <- vgmST("separable", # space=vgm(0.9,"Exp", 147, 0.1), # time =vgm(0.9,"Exp", 3.5, 0.1), # sill=40) # # covSTMat <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(250,20), c(1,16), separableModel) # dim(covSTMat) # # image(matrix(ceSim(covSTMat, 1, c(20, 16)), # nrow=20, ncol=16), asp=1, ylab="time", xlab="space") # # # product sum model: spatial and temporal nugget will be ignored and kept # # constant at 0. Only a joint nugget is used. # prodSumModel <- vgmST("productSum", # space=vgm(39, "Sph", 343, 0), # time= vgm(36, "Exp", 3, 0), # k=15) # # covSTMat <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(250,20), c(1,16), prodSumModel) # dim(covSTMat) # # image(matrix(ceSim(covSTMat, 1, c(20, 16)), # nrow=20, ncol=16), asp=1, ylab="time", xlab="space") # # # sum metric model: spatial, temporal and joint nugget will be estimated # sumMetricModel <- vgmST("sumMetric", # space=vgm( 6.9, "Lin", 200, 3.0), # time =vgm(10.3, "Lin", 15, 3.6), # joint=vgm(37.2, "Exp", 84,11.7), # stAni=77.7) # # covSTMat <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(250,20), c(1,16), sumMetricModel) # dim(covSTMat) # # image(matrix(ceSim(covSTMat, 1, c(20, 16)), # nrow=20, ncol=16), asp=1, ylab="time", xlab="space") # # # simplified sumMetric model, only a overall nugget is fitted. The spatial, # # temporal and jont nuggets are set to 0. # simpleSumMetricModel <- vgmST("simpleSumMetric", # space=vgm(20,"Lin", 150, 0), # time =vgm(20,"Lin", 10, 0), # joint=vgm(20,"Exp", 150, 0), # nugget=1, stAni=15) # # covSTMat <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(250,20), c(1,16), simpleSumMetricModel) # dim(covSTMat) # # image(matrix(ceSim(covSTMat, 1, c(20, 16)), # nrow=20, ncol=16), asp=1, ylab="time", xlab="space") # # # metric model # metricModel <- vgmST("metric", # joint=vgm(60, "Exp", 150, 10), # stAni=60) # # covSTMat <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(250,20), c(1,16), metricModel, turningLayers = FALSE) # dim(covSTMat) # # image(matrix(ceSim(covSTMat, 1, c(20, 16)), # nrow=20, ncol=16), asp=1, ylab="time", xlab="space") ## turning bands: # for cov-functions valid in 3-dim # adjust the covariance matrix (Schlahter, Chap. 2, eq 2.25) # simulate several layers (up-right hyper-planes in the 3D+T-cube) with random directions on a unit hemi-sphere # orthogonally project target points onto rndm lyrs and average the values for all rndm lyrs # -> one simulation of a 3d+T Gaussian random field, for 2D use a hyperplane in 3D # the tunring bands operator (numerical, 3-dimensional case) # @input: # model target covariance function # dist_grid: data.frame wtih columns spacelag and timelag for which the covariances are calculated # # @value: data.frame with columns spacelag, timelag and gamma where the latter contains the covariances for the 1-dim spatial and temporal layers # model <- separableModel # dist_grid <- as.data.frame(cbind("spacelag" = rep(1:150*1., each=4), # "timelag" = rep(1:4, 150))) # CAVE: distgrid must ahve the correct spatial and temporal metrics tbOperator <- function(model, dist_grid) { r <- dist_grid$spacelag derFun <- function(r) r * variogramSurface(model, dist_grid = data.frame(spacelag=r, timelag=dist_grid$timelag), covariance = TRUE)$gamma cbind(dist_grid, "gamma" = diag(attr(numericDeriv(quote(derFun(r)), "r"), "gradient"))) } randomDirections <- function(n) { u <- runif(n, 0, 2*pi) v <- runif(n, 0, 1) s <- sqrt(1-v^2) cbind(s*cos(u), s*sin(u), v) } # library(rgl) # plot3d(randomDirections(100), aspect = c(1,1,0.5)) # nLyrs <- 500 # coordMat <- matrix(c(1,5,5, # 1,7,7, # 1,5,7, # 1,7,5), byrow=T, ncol=3) # # coordMat <- matrix(runif(3*1001,1,5), byrow=T, ncol=3) # # # random directions in 3D # rndDir <- randomDirections(nLyrs) # # # how much does each direction contribute to the point # cntrbtn <- rndDir %*% t(coordMat) # # -> each column corresponds to one location, each row i to the "contribution" of the i-th rndDir # # cl_cntrbtn <- ceiling(cntrbtn)+10 # centre for grid; mind spatial index # fl_cntrbtn <- floor(cntrbtn) +10 # # covRow1 <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(250,20), c(1,16), metricModel, turningLayers = TRUE) # # sTime <- Sys.time() # simLyrs <- ceSim(covRow1, nLyrs, c(20,16)) # simLyrs <- lapply(1:nLyrs, function(col) matrix(simLyrs[,col], nrow=20, ncol=16)) # # lambda <- cl_cntrbtn - cntrbtn -10 # # cntrbSngSimLyr <- function(lyrId) { # simLyrs[[lyrId]][cl_cntrbtn[lyrId,],] * (1-lambda)[lyrId,] + simLyrs[[lyrId]][fl_cntrbtn[lyrId,],] * lambda[lyrId,] # } # # # reduce to the one realisation based on the combination of nLyrs turning bands # simTs <- Reduce('+', lapply(1:nLyrs, cntrbSngSimLyr))/sqrt(nLyrs) # eTime <- Sys.time() # # eTime - sTime # 0.7 secs/simulation of 100 random points # # image(simTs) # # dim(simTs) # # 1001 locations at 16 time stamps # # plot(simTs[500,]) # computes the covariance matrixes and weights once, applied to series of # variables/simulations where each variable/simulation is stored in one column of # the multiVarMatrix copied from krigeST to avoid repeted calls to krige with # multiple, identical inversions of the weights matrix # TODO: add functionality for temporal sandwich-wise processing: i.e. use the # +/- nmaxTime time slices to predict one time slice krigeSTMultiple <- function(formula, from, to, modelList, multiVarMatrix, nmaxTime=Inf) { lst = extractFormula(formula, from, to) separate <- length(from) > 1 && length(to) > 1 && inherits(from, "STF") && inherits(to, "STF") X = lst$X x0 = lst$x0 V = covfn.ST(from, model = modelList, separate=separate) v0 = covfn.ST(from, to, modelList) if (modelList$stModel == "separable" & separate) skwts <- STsolve(V, v0, X) # use Kronecker trick else skwts <- CHsolve(V, cbind(v0, X)) npts = length(to) ViX = skwts[,-(1:npts)] skwts = skwts[,1:npts] idPredFun <- function(sim) { sim <- matrix(sim, ncol = 1) beta = solve(t(X) %*% ViX, t(ViX) %*% sim) x0 %*% beta + t(skwts) %*% (sim - X %*% beta) } apply(multiVarMatrix, 2, idPredFun) } # unconcitional ## STFDF # library(sp) # library(spacetime) # library(zoo) # library(xts) # data(meuse, package = "sp") # coordinates(meuse) <- ~x+y # proj4string(meuse) <- CRS("+init=epsg:28992") # krigeST <- function(formula, data, newdata, modelList, y, beta, nmax=Inf, stAni=NULL, # computeVar = FALSE, fullCovariance = FALSE, # bufferNmax=2, progress=TRUE) ## krigeSTSimTB <- function(formula, data, newdata, modelList, nsim, progress=TRUE, nLyrs=500, tGrid=NULL, sGrid=NULL, ceExt=2, nmax=Inf) { stopifnot(zoo::is.regular(newdata@time)) condSim <- TRUE if (missing(data)) { condSim <- FALSE message("[No data provided: performing unconditional simulation.]") } else { message("[Performing conditional simulation.]") } pb <- txtProgressBar(0,nsim,style=3) # ST-simulation grid if (is.null(tGrid)) { tDis <- diff(c(index(newdata@time[1]), newdata@endTime[1])) if (!is.null(attr(modelList, "temporal unit"))) { units(tDis) <- attr(modelList, "temporal unit") } else { message("[The spatio-temporal variogram model does not carry a time unit attribute: krigeST cannot check whether the temporal distance metrics coincide.]") } tGrid <- c(as.numeric(tDis), length(newdata@time)) attr(tGrid, "units") <- c("", units(tDis)) debug_time_unit(units(tDis)) } if (is.null(sGrid)) { if (gridded(newdata@sp)) { # SpatialPixels/SpatialGrid: # based on GridTopology: use minimal cellsize of both directions; take enough to cover the diagonal sDis <- min(newdata@sp@grid@cellsize) sDim <- ceiling(sqrt(sum((newdata@sp@grid@cellsize * newdata@sp@grid@cells.dim)^2))/sDis) sGrid <- c(sDis, sDim) } else { # treat (as) SpatialPoints: # Average area per location --assuming-a-regular-squared-outline-taking-the-sqrt--> length/location --take-later-twice-as-many--> bboxExt <- apply(newdata@sp@bbox, 1, diff) sDis <- sqrt(prod(bboxExt)/length(newdata@sp)) sDim <- ceiling(sqrt(sum((bboxExt/sDis)^2))) sGrid <- c(sDis, sDim) } } # random directions in 3D rndDir <- randomDirections(nLyrs) # coordinates coordMat <- coordinates(newdata@sp) # coordinates (embedded in 3D) shifted + scaled to the grid index of the spatial gridding sGrid coordMat[,1] <- (coordMat[,1] - newdata@sp@bbox[1,1])/sGrid[1] coordMat[,2] <- (coordMat[,2] - newdata@sp@bbox[2,1])/sGrid[1] if (ncol(coordMat) == 2) { coordMat <- cbind(coordMat,1) } else { coordMat[,3] <- (coordMat[,3] - newdata@sp@bbox[3,1])/sGrid[1] } # how much does each direction contribute to the point cntrbtn <- rndDir %*% t(coordMat) # -> each column corresponds to one location, each row i to the "contribution" of the i-th rndDir # ceiling and floor + shifted to avoid negative indices cl_cntrbtn <- ceiling(cntrbtn) + sGrid[2] fl_cntrbtn <- floor(cntrbtn) + sGrid[2] covRow1 <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(sGrid[1], 2*sGrid[2]), tGrid, modelList, turningLayers = TRUE, ext=ceExt) origDim <- c(2*sGrid[2], tGrid[2]) sims <- list() ## for (i in 1:nsim) { setTxtProgressBar(pb, i) simLyrs <- ceSim(covRow1, nLyrs, origDim) simLyrs <- lapply(1:nLyrs, function(col) matrix(simLyrs[,col], nrow=origDim[1], ncol=origDim[2])) lambda <- cl_cntrbtn - cntrbtn - sGrid[2] cntrbSngSimLyr <- function(lyrId) { simLyrs[[lyrId]][cl_cntrbtn[lyrId,],] * (1-lambda)[lyrId,] + simLyrs[[lyrId]][fl_cntrbtn[lyrId,],] * lambda[lyrId,] } # reduce to the one realisation based on the combination of nLyrs turning bands sims[[paste0("sim",i)]] <- Reduce('+', lapply(1:nLyrs, cntrbSngSimLyr))/sqrt(nLyrs) } close(pb) sims <- do.call(cbind, lapply(sims, as.numeric)) # bind simulations to newdata geometry if (!condSim) { if ("data" %in% slotNames(newdata)) newdata@data <- cbind(newdata@data, sims) else newdata <- addAttrToGeom(newdata, as.data.frame(sims)) return(newdata) } # function call ends here if no data has been provided -> unconditional case varName <- all.vars(formula[[2]]) ## conditioning # interpolate the observations to the simulation grid obsMeanField <- krigeST(formula=formula, data=data, newdata=newdata, modelList=modelList) # interpolate to observation locations from the simulated grids for each simulation simMeanObsLoc <- krigeSTMultiple(as.formula(paste0("var1.pred ~", formula[[3]])), obsMeanField, data, modelList, sims) # interpolate from kriged mean sim at observed locations back to the grid for mean surface of the simulations simMeanFields <- krigeSTMultiple(as.formula(paste0(varName, "~", formula[[3]])), data, newdata, modelList, simMeanObsLoc) # add up the mean field and the corrected data sims <- obsMeanField@data$var1.pred + sims - simMeanFields # bind simulations to newdata geometry if ("data" %in% slotNames(newdata)) { newdata@data <- cbind(newdata@data, sims) return(newdata) } addAttrToGeom(newdata, as.data.frame(sims)) } # # sTime <- Sys.time() # krigedSim <- krigeSTUncSimTB(stf, metricModel, 100) # Sys.time() - sTime # # # 27 secs for 100 simulated ST fields of 155 locations and 21 time steps: 325500 values # # # plot one simulation along time # stplot(krigedSim[,1:12]) # # # plot one simulation along time # stplot(krigedSim[1:12,,"sim1"], mode="ts") # # # plot the ten simulations of the first day # spplot(krigedSim[,1], paste0("sim",1:10), as.table=TRUE) gstat/R/variogram.default.R0000644000176200001440000001477215060550314015344 0ustar liggesusers# $Id: variogram.default.q,v 1.29 2009-11-02 21:33:17 edzer Exp $ "variogram.default" <- function(object, locations, X, cutoff, width = cutoff/15.0, alpha = 0, beta = 0, tol.hor = 90/length(alpha), tol.ver = 90/length(beta), cressie = FALSE, dX = numeric(0), boundaries = numeric(0), cloud = FALSE, trend.beta = NULL, debug.level = 1, cross = TRUE, grid, map = FALSE, g = NULL, ..., projected = TRUE, lambda = 1.0, verbose = FALSE, covariogram = FALSE, PR = FALSE, pseudo = -1) { dots = list(...) if (length(dots) > 0) { warning(paste("the following arguments are ignored:", paste(dots, collapse = ", "))) } id1 = id2 = 0 ret = NULL if (missing(cutoff)) { if (is.logical(map) && map == TRUE) stop("for variogram maps, supply at least a cutoff") cutoff = numeric(0) } else if (width <= 0) stop("argument width should be positive") if (missing(width)) width = numeric(0) if (cloud == TRUE) width = 0 if (is.logical(map) && map == TRUE) { cells.dim = length(seq(-cutoff, cutoff, by = width)) grid.topology = GridTopology(rep(-cutoff, 2), rep(width, 2), rep(cells.dim, 2)) map = SpatialGrid(grid = grid.topology) } if (any(is.na(boundaries))) stop("no NA values allowed in boundaries") .Call(gstat_init, as.integer(debug.level)) if (!is.null(g) && !is.null(g$set)) gstat.load.set(g$set) id.names = NULL if (is.list(object) && is.list(locations)) { nvars = length(object) if (!is.null(names(object))) id.names = names(object) for (i in 1:nvars) { if (missing(X)) Xloc = rep(1, length(object[[i]])) else Xloc = X[[i]] t.beta = numeric(0) if (!is.null(trend.beta) && length(trend.beta) > 0) t.beta = trend.beta[[i]] else t.beta = numeric(0) if (missing(grid) || !is.list(grid)) { if (!is.null(g) && gridded(g$data[i]$data)) grd = unlist(gridparameters(g$data[i]$data)) else grd = numeric(0) } else grd = grid[[i]] .Call(gstat_new_data, as.double(object[[i]]), as.double(locations[[i]]), as.double(Xloc), as.integer(1), as.double(t.beta), as.integer(-1), as.integer(0), as.double(-1), as.integer(0), as.integer(1), double(0), grd, as.integer(0), as.integer(projected), as.integer(0), as.double(lambda), as.integer(0)) if (!is.null(g) && !is.null(g$model[[id.names[i]]])) load.variogram.model(g$model[[id.names[i]]], c(i - 1, i - 1)) } } else stop("argument object and locations should be lists") if (inherits(map, "SpatialGrid")) map = as.double(unlist(gridparameters(as(map, "SpatialGrid")))) pos = 0 ids = NULL bnd = NULL is.direct = NULL if (PR) { if (any(object[[1]] <= 0)) warning("pairwise relative variogram assumes non-negative data") covariogram = 2 } if (cross == "ONLY") { stopifnot(nvars >= 2) id.range = 2:nvars } else if (cross == TRUE) id.range = nvars:1 else id.range = 1:nvars for (id1 in id.range) { if (cross == "ST") id2range = 1 else if (cross == "ONLY") id2range = 1:(id1-1) else id2range = ifelse(cross, 1, id1):id1 for (id2 in id2range) { if (verbose) cat(".") if (is.null(id.names)) id = ifelse(id1 == id2, paste(id1), cross.name(id2, id1)) else id = ifelse(id1 == id2, paste(id.names[id1]), cross.name(id.names[id2], id.names[id1])) for (a in alpha) { for (b in beta) { direction = as.numeric(c(a, b, tol.hor, tol.ver)) # boundaries nees to be passed into the c code only ONCE: if (is.null(bnd)) bnd = boundaries else # NOT the first time we're here, so... bnd = numeric(0) ret.call = .Call(gstat_variogram, as.integer(c(id1 - 1, id2 - 1)), as.numeric(cutoff), as.numeric(width), as.numeric(direction), as.integer(cressie), as.numeric(dX), as.numeric(bnd), map, as.integer(covariogram), as.integer(pseudo)) if (is.logical(map) && map == FALSE) { np = ret.call[[1]] sel = np > 0 n.dir = length(sel[sel]) if (n.dir > 0) { dist = ret.call[[2]] gamma = ret.call[[3]] ret_cw = ret.call[[4]] # Sat Jul 16 16:19:59 CEST 2011 dir.a = rep(a, n.dir) dir.b = rep(b, n.dir) ids = c(ids, rep(id, n.dir)) is.direct = c(is.direct, id1 == id2) df = data.frame(np = np[sel], dist = dist[sel], gamma = gamma[sel], dir.hor = dir.a, dir.ver = dir.b) if (pos > 0) ret[(pos + 1):(pos + n.dir), ] = df else ret = df pos = pos + n.dir } } else { if (is.null(ret)) { ret = data.frame(ret.call[[1]], ret.call[[2]], ret.call[[4]], ret.call[[3]]) names = c("dx", "dy", id, paste("np", id, sep=".")) } else { ret = data.frame(ret, ret.call[[4]], ret.call[[3]]) names = c(names, id, paste("np", id, sep=".")) } names(ret) = names } } } } } if (verbose) cat("\n") .Call(gstat_exit, NULL) if (is.logical(map) && map == FALSE) { if (!is.null(ids)) { ret$id = factor(ids, levels = unique(ids)) attr(ret, "direct") = data.frame(id = unique(ids), is.direct = is.direct) if (cloud) { class(ret) = c("variogramCloud", "data.frame") attr(ret, ".BigInt") = 2^(4 * .Machine$sizeof.long) } else { class(ret) = c("gstatVariogram", "data.frame") if (length(boundaries) == 0) { cutoff = ret_cw[1] width = ret_cw[2] boundaries = seq(0, cutoff, width) if (!identical(max(boundaries), cutoff)) boundaries = c(boundaries, cutoff) } attr(ret, "boundaries") = boundaries attr(ret, "pseudo") = ret_cw[3] row.names(ret) = NULL } } } else { coordinates(ret) = c("dx", "dy") gridded(ret) = TRUE ret = list(map = ret) class(ret) = c("variogramMap", "list") } if (!is.null(ret)) { if (PR) attr(ret, "what") = "pairwise relative semivariance" else if (covariogram) attr(ret, "what") = "covariance" else if (cressie) attr(ret, "what") = "Cressie's semivariance" else attr(ret, "what") = "semivariance" } ret } gstat/R/gstat.R0000644000176200001440000001033315060550314013041 0ustar liggesusers# $Id: gstat.q,v 1.28 2009-11-02 21:33:17 edzer Exp $ "cross.name" <- function(id1, id2) { paste(id1, id2, sep = ".") } "gstat" <- function (g, id, formula, locations, data = NULL, model = NULL, beta, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, force = FALSE, dummy = FALSE, set, fill.all = FALSE, fill.cross = TRUE, variance = "identity", weights = NULL, merge, degree = 0, vdist = FALSE, lambda = 1.0) { call = match.call() if (!missing(locations) && inherits(locations, "formula")) { if (!is.null(data)) coordinates(data) = locations # locations = NULL } else if (missing(data) && !missing(locations) && (is(locations, "Spatial") || inherits(locations, "sf"))) { data = locations locations = NULL } if (fill.all) { # fill all variogram models if (missing(g) || is.null(model)) stop("fill.all assumes object g and model are supplied") g.names = names(g$data) for (i in 1:length(g.names)) { g$model[[paste(g.names[i])]] = model if (fill.cross) { for (j in (i+1):length(g.names)) g$model[[cross.name(g.names[i], g.names[j])]] = model } } return(g) } if (!missing(g) && inherits(g, "gstat") && !missing(id) && !missing(model) && missing(formula) && missing(locations)) { # here, only direct or cross variogram model is defined g.names = names(g$data) if (length(id) == 2) { m1 = match(id[1], g.names) m2 = match(id[2], g.names) if (is.na(m1)) stop("first id does not match available data") if (is.na(m1)) stop("second id does not match available data") nm = cross.name(g.names[min(m1, m2)], g.names[max(m1, m2)]) } else if (length(id) == 1) { m1 = match(id, g.names) if (is.na(m1)) stop("id does not match available data") nm = g.names[m1] } else stop("id should have length 1 or 2") g$model[[nm]] = model return(g) } if (!inherits(formula, "formula")) stop("argument formula should be of class formula") #if (!inherits(locations, "formula") && !has.coordinates(data)) # stop("argument locations should be of class formula or matrix") if (inherits(data, "sf")) data = as(data, "Spatial") if (missing(beta) || is.null(beta)) beta = numeric(0) vfn = pmatch(variance, c("identity", "mu", "mu(1-mu)", "mu^2", "mu^3")) if (is.na(vfn)) stop("unknown value for variance function") if (vfn > 1 && length(beta) == 0) stop("non-identity variance function only allowed if beta is supplied") if (missing(g) || is.null(g)) { g = list() g[["data"]] = list() g[["model"]] = list() } else if (!dummy && inherits(g$data[[1]], "Spatial") && !identical(g$data[[1]]$data@proj4string@projargs, data@proj4string@projargs)) stop("data items in gstat object have different coordinate reference systems") if (missing(id)) id = paste("var", length(g$data) + 1, sep = "") g$data[[id]] = list(formula = formula, # locations = locations, data = data, has.intercept = attr(terms(formula), "intercept"), beta = beta, nmax = nmax, nmin = nmin, omax = omax, maxdist = maxdist, force = force, dummy = dummy, vfn = vfn, weights = weights, degree = degree, vdist = vdist, lambda = lambda) g$model[[id]] = model if (!missing(locations)) g$locations = locations if (!missing(set)) { if (!is.list(set)) stop("argument set should be a list") g$set = set } if (!missing(merge)) g$merge = merge g$call = call class(g) = c("gstat", "list") g } "[.gstat" <- function(x, ids) { if (is.numeric(ids)) { if (min(ids) < 1 || max(ids) > length(names(x$data))) stop("selection index(es) out of bound") ids = names(x$data)[ids] } else if (any(is.na(match(ids, names(x$data))))) stop("selected ids do not match those of gstat object") g = list() g$data = x$data[ids] if (length(ids) > 1) { ids.cross = NULL for (i in 2:length(ids)) for (j in 1:(i-1)) ids.cross = c(ids.cross, cross.name(ids[j], ids[i])) g$model = x$model[c(ids, ids.cross)] } else g$model = x$model[ids] if (!is.null(x$set)) g$set = x$set if (!is.null(g$merge)) g$merge = x$merge class(g) = c("gstat", "list") g } gstat/R/xyz2img.R0000644000176200001440000000203115060550314013324 0ustar liggesusers# $Id: xyz2img.q,v 1.4 2006-02-10 19:01:07 edzer Exp $ "xyz2img" <- function (xyz, zcol = 3, xcol = 1, ycol = 2, tolerance = 10 * .Machine$double.eps) { if (ncol(xyz) < 3) stop("xyz object should have at least three columns") z = xyz[, zcol] x = xyz[, xcol] y = xyz[, ycol] xx = sort(unique(x)) yy = sort(unique(y)) nx = length(xx) ny = length(yy) nmax = max(nx, ny) difx = diff(xx) if (diff(range(unique(difx))) > tolerance) stop("x intervals are not constant") dify = diff(yy) if (diff(range(unique(dify))) > tolerance) stop("y intervals are not constant") dx = mean(difx) dy = mean(dify) xmin = min(xx) xmax = max(xx) xrange = xmax - xmin ymin = min(yy) ymax = max(yy) yrange = ymax - ymin row = round((x - xmin)/dx) + 1 col = round((y - ymin)/dy) + 1 zz = rep(as.numeric(NA), nx * ny) zz[row + nx * (col - 1)] = z zz = matrix(zz, nrow = nx, ncol = ny) list(x = seq(xmin, xmax, dx), y = seq(ymin, ymax, dy), z = zz) } gstat/R/map.to.lev.R0000644000176200001440000000146015060550314013703 0ustar liggesusers# $Id: map.to.lev.q,v 1.2 2006-02-10 19:01:07 edzer Exp $ "map.to.lev" <- function (data, xcol = 1, ycol = 2, zcol = c(3, 4), ns = names(data)[zcol]) { len = nrow(data) d = matrix(nrow = len * length(zcol), ncol = 3) xnames = NULL if (length(ns) > 1 && length(ns) != length(zcol)) stop("names should have length 1 or equal to length of zcol") nr = 1 for (i in zcol) { if (length(ns) == 1) nm = rep(paste(ns, nr), len) else nm = rep(ns[nr], len) range = (1 + (nr - 1) * len):(nr * len) d[range, ] = cbind(data[, xcol], data[, ycol], data[, i]) xnames = c(xnames, nm) nr = nr + 1 } nms <- factor(xnames, levels = unique(xnames)) d = data.frame(d, nms) names(d) = c("x", "y", "z", "name") d } gstat/R/fit.variogram.gls.R0000644000176200001440000001152415060550314015256 0ustar liggesusersfit.variogram.gls <- function(formula, data, model, maxiter = 30, eps = .01, trace = TRUE, ignoreInitial = TRUE, cutoff = Inf, plot = FALSE) { v = as.data.frame(variogram(formula, data, cloud = TRUE, cutoff = cutoff)) i = v$left j = v$right y = v$gamma h0 = v$dist dists = spDists(data) n = length(i) iter = 0 converged = FALSE if (model$model[1] == 'Nug') { if (ignoreInitial) init = c(mean(y)/2, mean(y)/2, median(h0)/4) else init = c(model$psill, model$range[2]) gamfn0 = function(h, th, m = as.character(model$model[2])) variogramLine(vgm(th[2], m, th[3], th[1]), dist_vector=h)$gamma minfuncols0 = function(theta=rbind(1,1,1)) { res = y-gamfn0(h0,theta) sum(res^2) } # If variogram is Power model, maximum range should be 2. # Also if ignoreInitial change initial value of range to 1 if (any(model$model == 'Pow')) { upperOptim <- c(max(y), max(y), 2) if (ignoreInitial) init[3] <- 1 } else upperOptim = c(max(y), max(y), max(h0)) th = th0 = th.ols = optim(init, minfuncols0, gr=NULL, method="L-BFGS-B", lower=c(0,1e-9,1e-9), upper=upperOptim)$par if (trace) print(th) while (!converged && iter < maxiter) { comb = function(i,j) cbind(rep(i,length(j)), rep(j,each=length(i))) cov = matrix( variogramLine(model, dist_vector = dists[comb(i,i)])$gamma + variogramLine(model, dist_vector = dists[comb(j,j)])$gamma - variogramLine(model, dist_vector = dists[comb(i,j)])$gamma - variogramLine(model, dist_vector = dists[comb(j,i)])$gamma, length(j), length(j)) cov = 0.5 * cov ^ 2 #cov = solve(cov) cov = qr(cov) minfuncrange = function(range) { res = y-gamfn0(h0,c(th[1],th[2],range)) t(res) %*% solve(cov, res) } minfuncsill = function(sill) { res = y-gamfn0(h0, c(th[1],sill,th[3])) t(res) %*% solve(cov, res) } minfuncnugget = function(nugget) { res = y - gamfn0(h0, c(nugget, th[2], th[3])) t(res) %*% solve(cov, res) } th0 = th # Avoid calculating max every time th[1] = optimize(minfuncnugget,lower=0,upper=upperOptim[1])$minimum th[2] = optimize(minfuncsill,lower=1e-9,upper=upperOptim[2])$minimum th[3] = optimize(minfuncrange,lower=1e-9,upper=upperOptim[3])$minimum converged = sum(abs((th - th0)/th0)) < eps iter = iter + 1 if (trace) print(th) model$psill = c(th[1], th[2]) model$range[2] = th[3] } if (th[3] / max(h0) > .99) warning("range parameter at search space boundary") if (!converged) { warning("no convergence, returning OLS solution") th = th.ols model$psill = c(th[1], th[2]) model$range[2] = th[3] } } else { # No Nugget component. Use only psill = th[1] and range = th[2] parameters if (ignoreInitial) init = c(mean(y)/2, median(h0)/4) else init = c(model$psill, model$range) gamfn = function(h, th, m = as.character(model$model)) variogramLine(vgm(psill = th[1], model = m, range = th[2]), dist_vector=h)$gamma minfuncols = function(theta=rbind(1,1)) { res = y-gamfn(h0,theta) sum(res^2) } # If variogram is Power model, maximum range should be 2. # Also if ignoreInitial change initial value of range to 1 if (any(model$model == 'Pow')) { upperOptim <- c(max(y), 2) if (ignoreInitial) init[2] <- 1 } else { upperOptim = c(max(y), max(h0)) } th = th0 = th.ols = optim(init, minfuncols,gr=NULL, method="L-BFGS-B", lower=c(1e-9,1e-9), upper=upperOptim)$par if (trace) print(th) while (!converged && iter < maxiter) { comb = function(i,j) cbind(rep(i,length(j)), rep(j,each=length(i))) cov = matrix( variogramLine(model, dist_vector = dists[comb(i,i)])$gamma + variogramLine(model, dist_vector = dists[comb(j,j)])$gamma - variogramLine(model, dist_vector = dists[comb(i,j)])$gamma - variogramLine(model, dist_vector = dists[comb(j,i)])$gamma, length(j), length(j)) cov = 0.5 * cov ^ 2 #cov = solve(cov) cov = qr(cov) minfuncrange = function(range) { res = y-gamfn(h0,c(th[1],range)) t(res) %*% solve(cov, res) } minfuncsill = function(sill) { res = y-gamfn(h0, c(sill,th[2])) t(res) %*% solve(cov, res) } th0 = th th[1] = optimize(minfuncsill,lower=1e-9,upper=upperOptim[1])$minimum th[2] = optimize(minfuncrange,lower=1e-9,upper=upperOptim[2])$minimum converged = sum(abs((th - th0)/th0)) < eps iter = iter + 1 if (trace) print(th) model$psill = th[1] model$range = th[2] } if (th[2] / max(h0) > .99) warning("range parameter at search space boundary") if (!converged) { warning("no convergence, returning OLS solution") th = th.ols model$psill = th[1] model$range = th[2] } } if (plot) plot(variogram(formula, data, cloud = TRUE, cutoff = cutoff), model = model) else model } gstat/R/variogramLine.R0000644000176200001440000000176115076447004014533 0ustar liggesusers# $Id: variogramLine.q,v 1.4 2008-08-18 16:32:42 edzer Exp $ "variogramLine" <- function(object, maxdist, n = 200, min=1.0e-6 * maxdist, dir = c(1,0,0), covariance = FALSE, ..., dist_vector = numeric(0), debug.level = 0) { if (missing(object)) stop("model is missing"); if (!inherits(object, "variogramModel")) stop("model should be of mode variogramModel (use function vgm)") if (length(dist_vector) > 0) maxdist = 0.0 else if (missing(maxdist)) stop("maxdist or dist_vector needs to be set"); if (length(dir) != 3) stop("dir should be numeric vector of length 3") .Call(gstat_init, as.integer(debug.level)) pars = c(min,maxdist,n,dir) load.variogram.model(object, c(0,0)) # loads object into gstat ret = .Call(gstat_variogram_values, as.integer(c(0,0)), as.numeric(pars), as.integer(covariance), as.numeric(dist_vector)) .Call(gstat_exit, 0); if (is.matrix(dist_vector)) matrix(ret[[2]], nrow(dist_vector), ncol(dist_vector)) else data.frame(dist=ret[[1]], gamma=ret[[2]]) } gstat/R/get.contr.R0000644000176200001440000000411015060550314013616 0ustar liggesusers# $Id: get.contr.q,v 1.8 2006-03-20 15:18:14 edzer Exp $ "get.contr" <- function (data, gstat.object, X, ids = names(gstat.object$data)) { contr.fun <- function(x, n, pr.idx, cov.idx, contr) { y = matrix(x[pr.idx], n, 1) V = matrix(x[cov.idx], n, n) beta = t(contr) %*% y Vbeta = t(contr) %*% V %*% contr ret = c(beta, diag(Vbeta)) for (j in 1:nrow(Vbeta)) { if (j > 1) for (k in 1:(j - 1)) ret = c(ret, Vbeta[j, k]) } ret } lti <- function(i, j) { # lower triangular matrix index, when repr as array mx = max(i, j) - 1 mn = min(i, j) - 1 ((mx) * (mx - 1))/2 + mn + 1 } n = length(ids) if (!is.matrix(X)) X = as.matrix(X) if (n != nrow(X)) stop("length(ids) should equal nrow(X) or length(X)") gstat.names = create.gstat.names(ids) names.pr = gstat.names[seq(1, 2 * n, 2)] names.cov = matrix("", n, n) for (i in 1:n) for (j in 1:n) names.cov[i, j] = ifelse(i == j, gstat.names[2 * i], gstat.names[2 * n + lti(i, j)]) pr.idx = match(names.pr, names(data)) cov.idx = match(names.cov, names(data)) if (any(is.na(pr.idx)) || any(is.na(cov.idx))) stop("colunn names in data not matched") res = data.frame(t(apply(as.data.frame(data)[names(data)], 1, contr.fun, n = n, pr.idx = pr.idx, cov.idx = cov.idx, contr = X))) col.names = NULL for (j in 1:NCOL(X)) col.names = c(col.names, paste("beta", j, sep = ".")) for (j in 1:NCOL(X)) col.names = c(col.names, paste("var.beta", j, sep = ".")) for (j in 1:NCOL(X)) { if (j > 1) { for (k in 1:(j - 1)) { col.names = c(col.names, paste("cov.beta", k, j, sep = ".")) } } } names(res) = col.names if (is(data, "data.frame")) row.names(res) = row.names(data) else if (is(data, "SpatialPolygonsDataFrame")) { rownames(res) = sapply(data@polygons, function(x) slot(x, "ID")) res = SpatialPolygonsDataFrame(as(data, "SpatialPolygons"), res, match.ID = TRUE) } else if (is(data, "Spatial")) { coordinates(res) = coordinates(data) gridded(res) = gridded(data) } res } gstat/R/variogram.formula.R0000644000176200001440000000166015060550314015355 0ustar liggesusers# $Id: variogram.formula.q,v 1.8 2006-02-10 19:01:07 edzer Exp $ "variogram.formula" <- function (object, locations = coordinates(data), data, ...) { if ((missing(locations) && inherits(data, c("sf", "stars"))) || (inherits(locations, c("sf", "stars")))) { if (!requireNamespace("sf", quietly = TRUE)) stop("sf required: install that first") # nocov if (missing(locations)) data = as(data, "Spatial") else locations = as(locations, "Spatial") } # gstat.formula takes care of the case where locations contains # both data and coordinates --- see there. ## ret = gstat.formula(object, locations, data) ## variogram(object = ret$y, locations = ret$locations, X = ret$X, ...) if ((missing(locations) && is(data, "ST")) || (is(locations, "ST"))) variogramST(formula = object, locations = locations, data = data, ...) else { g = gstat(formula = object, locations = locations, data = data) variogram(g, ...) } } gstat/R/variogramST.R0000644000176200001440000004027115060550314014161 0ustar liggesusersVgmFillNA <- function(x, boundaries) { # pads the sample variogram with NA rows where no data are available. n = length(boundaries) - 1 ix = rep(NA, n) #ix[which(1:n %in% findInterval(x$dist, boundaries))] = 1:nrow(x) ix[ findInterval(x$dist, boundaries, rightmost.closed = TRUE) ] = 1:nrow(x) # x$b = boundaries[-1] x[ix,] } VgmAverage = function(ret, boundaries) { # take out NULL variograms: ret = ret[!sapply(ret, is.null)] # take care of missing rows... ret = lapply(ret, VgmFillNA, boundaries = c(0, 1e-6 * boundaries[2], boundaries[-1])) # weighted average: # sum np, weighted sum of gamma and dist devided by summed np np = apply(do.call(cbind, lapply(ret, function(x) x$np)), 1, sum, na.rm = TRUE) gamma = apply(do.call(cbind, lapply(ret, function(x) x$gamma*x$np)), 1, sum, na.rm = TRUE)/np dist = apply(do.call(cbind, lapply(ret, function(x) x$dist*x$np)), 1, sum, na.rm = TRUE)/np v = data.frame(np = np, dist = dist, gamma = gamma) class(v) = class(ret[[1]]) attr(v, "boundaries") = attr(ret[[1]], "boundaries") v[is.na(v)] = NA v } StVgmLag = function(formula, data, dt, pseudo, ...) { dotLst <- list(...) .ValidObs = function(formula, data) !is.na(data[[as.character(as.list(formula)[[2]])]]) d = dim(data) ret = vector("list", d[2] - dt) if (dt == 0) { for (i in 1:d[2]) { d0 = data[,i] valid = .ValidObs(formula, d0) if(sum(valid) <= 1) ret[[i]] <- NULL else { d0 = d0[valid,] ret[[i]] = variogram(formula, d0, ...) } } } else { for (i in 1:(d[2] - dt)) { d1 = data[, i] valid1 = .ValidObs(formula, d1) d2 = data[, i + dt] valid2 = .ValidObs(formula, d2) if(sum(valid1)==0 || sum(valid2)==0) ret[[i]] <- NULL else { d1 = d1[valid1,] d2 = d2[valid2,] obj = gstat(NULL, paste("D", i, sep=""), formula, d1, set = list(zero_dist = 3), beta = 0) obj = gstat(obj, paste("D", i+dt, sep=""), formula, d2, beta = 0) ret[[i]] = variogram(obj, cross = "ONLY", pseudo = pseudo, ...) } } } if(!is.null(dotLst$cloud)) { if(dotLst$cloud) ret <- do.call("rbind", ret) ret$id <- "var1" return(ret) } else { return(VgmAverage(ret, dotLst$boundaries)) } } variogramST = function(formula, locations, data, ..., tlags = 0:15, cutoff, width = cutoff/15, boundaries=seq(0,cutoff,width), progress = interactive(), pseudo = TRUE, assumeRegular=FALSE, na.omit=FALSE, cores = 1) { if (missing(data)) data = locations if (inherits(data, "stars")) { if (!requireNamespace("stars", quietly = TRUE)) stop("stars required: install that first") # nocov data = as(data, "STFDF") } if(missing(cutoff)) { ll = !is.na(is.projected(data@sp)) && !is.projected(data@sp) cutoff <- spDists(t(data@sp@bbox), longlat = ll)[1,2]/3 } if (formula[[3]] != 1) { # there is a regression model: data$resid = residuals(lm(formula, data, na.action = na.exclude)) formula = resid ~ 1 } if(inherits(data, c("STIDF", "sftime"))) return(variogramST.STIDF(formula, as(data, "STIDF"), tlags, cutoff, width, boundaries, progress, cores = cores, ...)) stopifnot(is(data, "STFDF") || is(data, "STSDF")) it = index(data@time) if (assumeRegular || is.regular(zoo(matrix(1:length(it)), order.by = it), strict = TRUE)) { twidth = diff(it)[1] tlags = tlags[tlags <= min(max(tlags), length(unique(it)) - 1)] } else { warning("strictly irregular time steps were assumed to be regular") twidth = mean(diff(it)) } obj = NULL t = twidth * tlags if (progress) pb = txtProgressBar(style = 3, max = length(tlags)) if (cores == 1) { ret = vector("list", length(tlags)) for (dt in seq(along.with = tlags)) { ret[[dt]] = StVgmLag(formula, data, tlags[dt], pseudo = pseudo, boundaries = boundaries, ...) ret[[dt]]$id = paste("lag", dt - 1, sep="") if (progress) setTxtProgressBar(pb, dt) } } else { if (!requireNamespace("future", quietly = TRUE) || !requireNamespace("future.apply", quietly = TRUE)) stop("For parallelization, future and future.apply packages are required") future::plan('multicore', workers = cores) ret <- split(seq(along.with = tlags), seq(along.with = tlags)) ret <- future.apply::future_lapply(X = ret, FUN = function(x){ xx <- StVgmLag(formula, data, tlags[x], pseudo = pseudo, boundaries = boundaries, ...) xx$id <- paste("lag", x - 1, sep="") if (progress) setTxtProgressBar(pb, x) return(xx) }, future.seed = NULL # silence warning ) } if (progress) close(pb) # add time lag: v = do.call(rbind, ret) v$timelag = rep(t, sapply(ret, nrow)) if (is(t, "yearmon")) class(v$timelag) = "yearmon" b = attr(ret[[min(length(tlags),2)]], "boundaries") b = c(0, b[2]/1e6, b[-1]) # ix = findInterval(v$dist, b) will use all spacelags b = b[-2] # spacelags = c(0, b[-length(b)] + diff(b)/2) will use all spacelags v$spacelag = c(0, b[-length(b)] + diff(b)/2) # spacelags[ix] will use all spacelags v$avgDist <- v$dist * v$np for (lagId in unique(v$spacelag)) { bool <- v$spacelag == lagId v$avgDist[bool] <- sum(v$avgDist[bool], na.rm = TRUE) / sum(v$np[bool], na.rm = TRUE) } class(v) = c("StVariogram", "data.frame") if(na.omit) v <- na.omit(v) # setting attributes to allow krigeST to check units attr(v$timelag, "units") <- attr(twidth,"units") if (isTRUE(!is.projected(data))) attr(v$spacelag, "units") = "km" return(v) } ## very irregular data variogramST.STIDF <- function (formula, data, tlags, cutoff, width, boundaries, progress, twindow, tunit, cores = 1) { ll = !is.na(is.projected(data@sp)) && !is.projected(data@sp) if (missing(cutoff)) cutoff <- spDists(t(data@sp@bbox), longlat = ll)[1, 2]/3 m = model.frame(terms(formula), as(data, "data.frame")) diffTime <- diff(index(data)) if (inherits(diffTime, "difftime")) { timeScale <- units(diffTime) if(missing(tunit)) warning(paste("The argument 'tunit' is missing: tlags are assumed to be given in ", timeScale, ".",sep="")) else { stopifnot(tunit %in% c("secs", "mins", "hours", "days", "weeks")) units(diffTime) <- tunit timeScale <- tunit } diffTime <- as.numeric(diffTime) } else if (!missing(tunit)) stop("'tunit' ignored, as time values are not of class POSIXct or Date") if (missing(twindow)) twindow <- round(2 * max(tlags, na.rm=TRUE) / mean(diffTime, na.rm = TRUE), 0) nData <- nrow(data) # re-using the order propertie of the time slot to only store the next "twindow" distances numTime <- as.numeric(index(data)) diffTimeMat <- matrix(NA, nData, twindow) for (i in 1:nData) { # i <- 1 diffTimeMat[i,1:min(nData,twindow)] <- cumsum(diffTime[i+0:(min(nData,twindow)-1)]) } nSp <- length(boundaries) nTp <- length(tlags) distTp <- matrix(NA, nSp-1, nTp-1) distSp <- matrix(NA, nSp-1, nTp-1) gamma <- matrix(NA, nSp-1, nTp-1) np <- matrix(NA, nSp-1 ,nTp-1) # temporal selection if(progress) pb <- txtProgressBar(0, nTp-1, 0, style=3) for (i in 1:(nTp-1)) { # i <- 1 ind <- which(diffTimeMat >= tlags[i] & diffTimeMat < tlags[i+1]) if (length(ind) < 1) next tmpInd <- matrix(NA,nrow=length(ind),4) tmpInd[,1] <- ind %% nData # row number tmpInd[,2] <- (ind %/% nData)+1 # col number if (cores == 1){ tmpInd[,3] <- apply(tmpInd[,1:2,drop=FALSE], 1, function(x) spDists(data@sp[x[1]], data@sp[x[2]+x[1],])) } else { if(!requireNamespace("future", quietly = TRUE) || !requireNamespace("future.apply", quietly = TRUE)) stop("For parallelization, future and future.apply packages are required") future::plan("multicore", workers = cores) tmpInd[,3] <- future.apply::future_apply(X = tmpInd[,1:2,drop=FALSE], MARGIN = 1, FUN = function(x) spDists(data@sp[x[1]], data@sp[x[2]+x[1],]), future.seed = NULL) } tmpInd[,4] <- diffTimeMat[tmpInd[,1:2, drop=FALSE]] # spatial selection for (j in 1:(nSp-1)) { # j <- 3 indSp <- which(tmpInd[,3] >= boundaries[j] & tmpInd[,3] < boundaries[j+1]) if (length(indSp) < 1) next distSp[j,i] <- mean(tmpInd[indSp,3]) distTp[j,i] <- mean(tmpInd[indSp,4]) indSp <- cbind(ind[indSp] %% nData, (ind[indSp] %/% nData)+1) np[j,i] <- nrow(indSp) # Issue #7, Thanks to Roelof. gamma[j,i] <- 0.5*mean((data[,,colnames(m)[1]]@data[indSp[,1],1] - data[,,colnames(m)[1]]@data[indSp[,1]+indSp[,2],1])^2, na.rm=TRUE) } if(progress) setTxtProgressBar(pb, value=i) } if(progress) close(pb) res <- data.frame(np=as.vector(np), dist=as.vector(distSp), gamma=as.vector(gamma), id=paste("lag",rep(1:(nTp-1),each=nSp-1), sep=""), timelag=rep(tlags[-nTp]+diff(tlags)/2,each=nSp-1), spacelag=rep(boundaries[-nSp]+diff(boundaries)/2, nTp-1)) res$avgDist <- res$dist * res$np for (lagId in unique(res$spacelag)) { bool <- res$spacelag == lagId res$avgDist[bool] <- sum(res$avgDist[bool], na.rm = TRUE) / sum(res$np[bool], na.rm = TRUE) } attr(res$timelag, "units") <- timeScale attr(res$spacelag, "units") <- ifelse(ll, "km", "m") class(res) <- c("StVariogram", "data.frame") return(res) } ## plotting plot.StVariogram = function(x, model=NULL, ..., col = bpy.colors(), xlab, ylab, map = TRUE, convertMonths = FALSE, as.table = TRUE, wireframe = FALSE, diff = FALSE, all=FALSE) { lst = list(...) if (!is.null(lst$col.regions)) col = lst$col.regions if (is(x$timelag, "yearmon")) { if (convertMonths) { x$timelag = as.numeric(x$timelag) * 12 attr(x$timelag, "units") = "months" } else attr(x$timelag, "units") = "years" } if (missing(xlab)) { xlab = "distance" u = attr(x$spacelag, "units") if (!is.null(u)) xlab = paste(xlab, " (", u, ")", sep="") } if (missing(ylab)) { ylab = "time lag" u = attr(x$timelag, "units") if (!is.null(u)) ylab = paste(ylab, " (", u, ")", sep="") } x$timelag = as.numeric(x$timelag) # check for older spatio-temporal variograms and compute avgDist on demand if(is.null(x$avgDist)) { x$avgDist <- x$dist * x$np for (lagId in unique(x$spacelag)) { bool <- x$spacelag == lagId x$avgDist[bool] <- sum(x$avgDist[bool] / sum(x$np[bool], na.rm = TRUE), na.rm = TRUE) } } if(!is.null(model)) { if (is(model,"StVariogramModel")) model <- list(model) for (mod in model) { slag <- x$avgDist slag[slag == 0 & x$timelag == 0] <- sqrt(.Machine$double.eps) x[[mod$stModel]] <- variogramSurface(mod, data.frame(spacelag = slag, timelag = x$timelag))$gamma if (diff) x[[mod$stModel]] <- x[[mod$stModel]] - x$gamma } } x0 = x # needed by wireframe() if (!is.null(model)) { modelNames <- sapply(model, function(x) x$stModel) if (all && !diff) v0 <- x[,c("dist", "id", "avgDist", "timelag")] else v0 <- NULL for (i in modelNames) v0 <- rbind(v0, x[,c("dist", "id", "avgDist", "timelag")]) if(all & !diff) {# we also need the sample v0$what = factor(c(rep("sample", nrow(x)), rep(modelNames, each=nrow(x))), levels=c("sample", modelNames), ordered = TRUE) v0$gamma = c(x$gamma, unlist(x[,modelNames])) } else { v0$what = factor(rep(modelNames, each=nrow(x)), levels=modelNames, ordered=TRUE) v0$gamma = c(unlist(x[,modelNames])) } x = v0 } if (wireframe) { if (!is.null(model)) { if (length(model) > 1 || all) wireframe(gamma ~ avgDist*timelag | what, x, drape = TRUE, col.regions = col, xlab = xlab, ylab = ylab, as.table=as.table, ...) else wireframe(as.formula(paste(model[[1]]$stModel,"~ avgDist*timelag")), x0, drape = TRUE, col.regions = col, xlab = xlab, ylab = ylab, as.table=as.table, ...) } else # without a model, plot only the sample variogram as a wireframe wireframe(gamma ~ avgDist * timelag, x0, drape = TRUE, col.regions = col, xlab = xlab, ylab = ylab, ...) } else if (map) { if (!is.null(model)) f = gamma ~ avgDist + timelag | what else f = gamma ~ avgDist + timelag levelplot(f, x, xlab = xlab, ylab = ylab, col.regions = col, as.table=as.table, ...) } else { # not map, not wireplot if (!is.null(model)) f = gamma ~ dist | what else f = gamma ~ dist x$id = factor(x$id, levels=unique(x$id)) bp = bpy.colors(length(levels(x$id))) ps = list(superpose.line=list(col=bp), superpose.symbol=list(col=bp)) xlim = c(0, max(x$dist) * 1.04) if (diff) { xyplot(f, x, groups = x$id, type='b', xlim = xlim, auto.key = list(space = "right"), xlab = xlab, par.settings = ps, as.table=as.table, ...) } else { ylim = c(0, max(x$gamma) * 1.04) xyplot(f, x, groups = x$id, type='b', ylim = ylim, xlim = xlim, auto.key = list(space = "right"), xlab = xlab, par.settings = ps, as.table=as.table, ...) } } } print.StVariogramModel <- function(x, ...) { possComp <- c("space", "time", "joint") for(comp in possComp[possComp %in% names(x)]) { rownames(x[[comp]]) <- 1:nrow(x[[comp]]) cat(paste(comp,"component: \n")) print(x[[comp]], ...) } possAddPar <- c("sill", "nugget", "stAni", "k") for(addPar in possAddPar[possAddPar %in% names(x)]) { cat(paste(addPar, ": ",x[[addPar]],"\n", sep="")) } } ## guess the spatio-temporal anisotropy without spatio-temporal models ###################################################################### estiStAni <- function(empVgm, interval, method="linear", spatialVgm, temporalVgm, s.range=NA, t.range=NA) { if (!is.na(s.range)) empVgm <- empVgm[empVgm$dist <= s.range,] if (!is.na(t.range)) empVgm <- empVgm[empVgm$timelag <= t.range,] empVgm$timelag = as.numeric(empVgm$timelag) # in case it is of class difftime, messes up on R 4.1 switch(method, linear = estiStAni.lin(empVgm, interval), range = estiAni.range(empVgm, spatialVgm, temporalVgm), vgm = estiAni.vgm(empVgm, spatialVgm, interval), metric = estiAni.metric(empVgm, spatialVgm, interval), stop(paste("Method", method,"is not implemented."))) } # linear estiStAni.lin <- function(empVgm, interval) { lmSp <- lm(gamma~dist, empVgm[empVgm$timelag == 0,]) optFun <- function(stAni, empVgm) { sqrt(mean((predict(lmSp, newdata = data.frame(dist=empVgm[empVgm$spacelag == 0,]$timelag*stAni)) - empVgm[empVgm$spacelag == 0,]$gamma)^2, na.rm=TRUE)) } optimise(optFun, interval, empVgm = empVgm)$minimum } # range estiAni.range <- function(empVgm, spatialVgm, temporalVgm) { spEmpVgm <- empVgm[empVgm$timelag == 0,] class(spEmpVgm) <- c("gstatVariogram","data.frame") spEmpVgm <- spEmpVgm[-1,1:3] spEmpVgm$dir.hor <- 0 spEmpVgm$dir.ver <- 0 spatialVgm <- fit.variogram(spEmpVgm, spatialVgm) tmpEmpVgm <- empVgm[empVgm$spacelag == 0,] class(tmpEmpVgm) <- c("gstatVariogram","data.frame") tmpEmpVgm <- tmpEmpVgm[-1,c("np","timelag","gamma")] colnames(tmpEmpVgm) <- c("np", "dist", "gamma") tmpEmpVgm$dir.hor <- 0 tmpEmpVgm$dir.ver <- 0 temporalVgm <- fit.variogram(tmpEmpVgm, temporalVgm) spatialVgm$range[2]/temporalVgm$range[2] } # variograms estiAni.vgm <- function(empVgm, spatialVgm, interval) { spEmpVgm <- empVgm[empVgm$timelag == 0,] class(spEmpVgm) <- c("gstatVariogram","data.frame") spEmpVgm <- spEmpVgm[-1,1:3] spEmpVgm$dir.hor <- 0 spEmpVgm$dir.ver <- 0 spatialVgm <- fit.variogram(spEmpVgm, spatialVgm) optFun <- function(stAni) { sqrt(mean((variogramLine(spatialVgm, dist_vector = empVgm[empVgm$spacelag == 0,]$timelag*stAni)$gamma - empVgm[empVgm$spacelag == 0,]$gamma)^2, na.rm=TRUE)) } optimise(optFun, interval)$minimum } # metric variogram estiAni.metric <- function(empVgm, spatialVgm, interval) { fit.StVariogram(empVgm, vgmST("metric", joint=spatialVgm, stAni=mean(interval)))$stAni[[1]] } gstat/cleanup0000755000176200001440000000012015162303122012735 0ustar liggesusersrm -f src/*.o src/gstat.so makefile src/makefile src/lex.l src/parse.y src/tags gstat/demo/0000755000176200001440000000000015060550314012317 5ustar liggesusersgstat/demo/fulmar.R0000644000176200001440000000517715060550314013742 0ustar liggesusers# $Id: fulmar.R,v 1.3 2006-02-10 19:05:02 edzer Exp $ library(sp) library(gstat) data(fulmar) data(ncp.grid) glm98 <- glm(formula = fulmar ~ depth + coast, family = quasipoisson, data = fulmar[fulmar$year == 1998, ]) glm99 <- glm(formula = fulmar ~ depth + coast, family = quasipoisson, data = fulmar[fulmar$year == 1999, ]) fulmar98 = data.frame(fulmar[fulmar$year == 1998,], pr98 = predict(glm98, type = "response")) fulmar99 <- data.frame(fulmar[fulmar$year == 1999,], pr99 = predict(glm99, type = "response")) pr98.grd <- predict(glm98, newdata = ncp.grid, type = "response", se.fit=TRUE) pr99.grd <- predict(glm99, newdata = ncp.grid, type = "response", se.fit=TRUE) pr <- data.frame(ncp.grid, pr98=pr98.grd$fit, pr99=pr99.grd$fit, se98 = pr98.grd$se.fit, se99 = pr99.grd$se.fit) # B.3 create gstat object g <- gstat(id = "fulmar98", formula = fulmar~pr98, locations = ~x+y, data = fulmar98, model = vgm(1.89629, "Exp", 50000, 0.852478), beta = c(0,1), variance = "mu") g <- gstat(g, id = "fulmar99", formula = fulmar~pr99, locations = ~x+y, data = fulmar99, model = vgm(2.52259, "Exp", 50000, 1.76474), beta = c(0,1), variance = "mu") h <- g h <- gstat(h, id = c("fulmar98","fulmar99"), model = vgm(2.18, "Exp", 50000, 1.22)) # predict block means for blocks in ncp.grid$area (table 2; cokriging) library(maptools) areas.r = readShapePoly(system.file("external/ncp.shp", package="gstat")) #areas.r <- as.SpatialRings.Shapes(areas.shp$Shapes, areas.shp$att.data$WSVGEB_) coordinates(pr) = ~x+y #pr.df = overlay(pr, areas.r, fn = mean) pr.df = na.omit(as(aggregate(pr, areas.r, FUN = mean), "data.frame")) # match non-empty (and relevant) areas: #areas = SpatialPolygonsDataFrame(areas.r[c(2,3,4,16),"WSVGEB_"], pr.df[c(1,2,3,5),])#,match.ID=F) areas = SpatialPolygonsDataFrame(areas.r[c(1,2,12,7),"WSVGEB_"], pr.df[c(1,2,3,5),], match.ID=F) # areas ID's 0 1 2 14 sk = predict(g, areas) cok = predict(h, areas) spplot(cok, c(3,5), names.attr = c("1998", "1999"), main = "Fulmaris glacialis, density estimates\n(by irregular block cokriging)") sk = as.data.frame(sk) cok = as.data.frame(cok) print(data.frame(area = c(1,2,3,16), SK98 = sk$fulmar98.pred, SE98 = sqrt(sk$fulmar98.var), SK99 = sk$fulmar99.pred, SE99 = sqrt(sk$fulmar99.var), CK98 = cok$fulmar98.pred, SE98 = sqrt(cok$fulmar98.var), CK99 = cok$fulmar99.pred, SE99 = sqrt(cok$fulmar99.var)), digits=3) print(data.frame(area = c(1,2,3,16), dSK = sk$fulmar99.pred - sk$fulmar98.pred, SEdSK = sqrt(sk$fulmar98.var+sk$fulmar99.var), dCOK = cok$fulmar99.pred - cok$fulmar98.pred, SEdCOK = sqrt(cok$fulmar98.var+cok$fulmar99.var - 2*cok$cov.fulmar98.fulmar99)), digits=3) gstat/demo/a2p.R0000644000176200001440000000167715060550314013137 0ustar liggesusersRprof() # import NC SIDS data: library(sp) library(maptools) fname = system.file("shapes/sids.shp", package="maptools")[1] nc = readShapePoly(fname, proj4string = CRS("+proj=longlat +datum=NAD27 +ellps=clrk66")) # reproject to UTM17, so we can use Euclidian distances: library(rgdal) nc = spTransform(nc, CRS("+proj=utm +zone=17 +datum=WGS84 +ellps=WGS84")) # create a target (newdata) grid, and plot: grd = spsample(nc, "regular", n = 1000) class(grd) plot(nc, axes = TRUE) points(grd, pch = 3) library(gstat) # area-to-point kriging: kr = krige0(SID74 ~ 1, nc, grd, vgmArea, ndiscr = 9, vgm = vgm(1, "Exp", 1e5, 0), # point variogram, verbose = TRUE) out = SpatialPixelsDataFrame(grd, data.frame(pred = kr)) pl0 = spplot(nc["SID74"], main = "areas") pl1 = spplot(out, sp.layout = list("sp.polygons", nc, first=F,col='grey'), main = "points on a grid") print(pl0, split = c(1,1,1,2), more = TRUE) print(pl1, split = c(1,2,1,2), more = FALSE) gstat/demo/ikr.R0000644000176200001440000000077715060550314013242 0ustar liggesuserslibrary(sp) library(gstat) data(meuse) data(meuse.grid) coordinates(meuse)=~x+y gridded(meuse.grid)=~x+y v = variogram(I(zinc < 500)~1,meuse) plot(v) vm = fit.variogram(v, vgm(1, "Sph", 300, 1)) plot(v,vm) vm # possibly adjust sum of sill to be max. 0.25? ik = krige(I(zinc>500)~1, meuse, meuse.grid, vm) spplot(ik[1],col.regions=bpy.colors()) summary(ik[[1]]) # adjust values outside [0,1] to nearest limit: ik[[1]][ik[[1]]<0] = 0 ik[[1]][ik[[1]]>1] = 1 summary(ik[[1]]) spplot(ik[1],col.regions=bpy.colors()) gstat/demo/pcb.R0000644000176200001440000001123415060550314013207 0ustar liggesusers# $Id: pcb.R,v 1.9 2008-02-01 22:39:44 edzer Exp $ # FIGURE 1: library(sp) library(gstat) library(maptools) library(lattice) data(pcb) coordinates(pcb) = ~x+y data(ncp.grid) gridded(ncp.grid) = ~x+y wsv = readShapePoly(system.file("external/ncp.shp", package="gstat")) classes = c(.2,1,2,5,10,20) print(xyplot(y ~ x | as.factor(year), groups = sqrt(PCB138)/3, data = as.data.frame(pcb), panel = function(x, y, groups, subscripts, ...) { sp.polygons(wsv, col = grey(.5)) panel.xyplot(x, y, cex = groups[subscripts], ...) }, xlab = "x-coordinate", ylab = "y-coordinate", key = list(corner = c(0,0), x=0.8, y=0.25, points = list(pch = 1, col = 1, cex = sqrt(classes)/3), text = list(as.character(classes))), aspect = "iso", as.table = T, xlim = c(464000, 739000), ylim = c(5696500, 6131500), scales = list(draw = F))) # FIGURE 2: pcb$yf = as.factor(pcb$year) pcb$int = rep(NA, dim(pcb)[1]) c = lm(log(PCB138)~-1+depth+yf,pcb)$coefficients i = 2 for (f in levels(pcb$yf)) { pcb$int[pcb$yf == f] = c[i] i = i+1 } print(xyplot(log(PCB138)~depth | as.factor(year), groups = int, data = as.data.frame(pcb), panel = function(x, y, groups, subscripts, ...) { # panel.grid(h=-1, v= 2) panel.xyplot(x, y) y = c(groups[subscripts][1], groups[subscripts][1] + -0.0641*45) llines(c(0, 45), y, lty = 2) }, scales = list( y = list(at=log(c(.2, .5, 1, 2, 5, 10, 20)), labels=c(".2",".5","1","2","5","10","20"), alternating = F) ), xlab = "water depth", ylab = "PCB138", as.table = T) ) # FIGURE 3: # ps.options(width=2, height=2) pcb$res=residuals(lm(log(PCB138)~year+depth, pcb)) v3 = variogram(res ~ year, pcb, dX=.1, bound=c(0,1000,3000,5000,(1:16)*10000)) print(plot(v3, model = vgm(.224,"Exp",17247,.08), plot.numbers = TRUE)) # FIGURE 4: # next g.pcb = NULL merge = list(c("P1986", 2, "P1991", 2), c("P1986", 2, "P1996", 2), c("P1986", 2, "P2000", 2)) for (f in levels(pcb$yf)[c(1,4,6,7)]) g.pcb= gstat(g.pcb, paste("P", as.character(f), sep = ""), log(PCB138)~depth, pcb[pcb$yf == f,], merge = merge) g.pcb = gstat(g.pcb, model = vgm(.224,"Exp",17247,.08), fill.all=T) v = variogram(g.pcb, cutoff=1e5) #plot(v, model = fit.lmc(v, g)) #plot(v, model = g,plot.numbers = TRUE) PCB.cor = matrix(NA, 4,4) i = 1 for (x in levels(pcb$yf)[c(1,4,6,7)]) { j = 1 for (y in levels(pcb$yf)[c(1,4,6,7)]) { A = log(pcb[pcb$yf == x,]$PCB138) B.tmp = krige(PCB138~1, pcb[pcb$yf == y,], pcb[pcb$yf == x,], nmax = 1, set=list(debug=0)) B = log(B.tmp$var1.pred) # print(paste(x, y, cor(A,B))) PCB.cor[i,j] = cor(A,B) j = j + 1 } i = i + 1 } years=c(1986,1991,1996,2000) dimnames(PCB.cor)=list(years,years) PCB.cor.ns = PCB.cor PCB.cor = 0.5 * (PCB.cor + t(PCB.cor)) i = 1 for (x in levels(pcb$yf)[c(1,4,6,7)]) { j = 1 for (y in levels(pcb$yf)[c(1,4,6,7)]) { if (j > i) { name = paste(paste("P", x, sep=""), paste("P", y, sep=""),sep = ".") print(name) g.pcb$model[[name]]["psill"] = g.pcb$model[[name]]["psill"] * PCB.cor[i,j] } j = j + 1 } i = i + 1 } print(plot(v, model = g.pcb, plot.numbers = FALSE)) print(PCB.cor.ns, digits=3) print(PCB.cor, digits=3) # FIGURE 5: pcb.cok = predict(g.pcb, newdata = ncp.grid, debug.level = 0) levs = c(.1,.2,.5,1,2,5,10,20) spplot(pcb.cok[c(1,3,5,7)], as.table=T, col.regions = bpy.colors(7), at = log(levs), colorkey = list(at = log(levs), labels = as.character(levs), col = bpy.colors(7)), layout = c(4,1) ) spplot(pcb.cok[c(4,11,6,12,13,8,14,15,16,10)-2], skip=c(F,T,T,T,F,F,T,T,F,F,F,T,F,F,F,F), as.table=T, layout=c(4,4), asp="iso", col.regions = bpy.colors()) X = cbind(rep(1,7), c(1986, 1987, 1989, 1991, 1993, 1996, 2000)) X2=X[c(1,4,6,7),] lambda = solve(t(X2) %*% X2) %*% t(X2) dimnames(lambda) = list(NULL, c(1986, 1991, 1996, 2000)) print(lambda[2, ], digits=3) # FIGURE 7: pcb.contr = get.contr(pcb.cok, g.pcb, X=lambda[2, ]) # copy coordinates #pcb.contr$x = pcb.cok$x #pcb.contr$y = pcb.cok$y pl1 = spplot(pcb.contr["beta.1"], main = "log-PCB138: change estimate", col.regions = bpy.colors(100)) pcb.contr$sig = pcb.contr$beta.1 / sqrt(pcb.contr$var.beta.1) pl2 = spplot(pcb.contr["sig"], main = "log-PCB138 change/SE", col.regions = bpy.colors(100)) print(pl1, position=c(0,0,0.5,1), more = TRUE) print(pl2, position=c(0.5,0,1,1), more = FALSE) cat("source:\n\nEdzer J. Pebesma, Richard N.M. Duin (2005) Spatio-temporal mapping of\nsea floor sediment pollution in the North Sea. In: Ph. Renard, and\nR. Froidevaux, eds. Proceedings GeoENV 2004 -- Fifth European Conference\non Geostatistics for Environmental Applications; Springer.\n") gstat/demo/depend.R0000644000176200001440000000252715060550314013707 0ustar liggesusersrequire(tools) packages_to_check <- function(dep, which = c("Depends", "Imports", "LinkingTo", "Suggests"), recursive = FALSE){ download.file("https://cran.R-project.org/web/packages/packages.rds", "packages.rds", mode="wb") x <- readRDS("packages.rds") x <- x[!duplicated(x[,1]),] packages <- x[,1] rdeps <- package_dependencies(packages = dep, x, which = which, recursive = recursive, reverse = TRUE) paste(apply(x[x[,1] %in% rdeps[[1]], 1:2], 1, paste, collapse="_"), ".tar.gz", sep="") } #RCheck = function(x, URL = "http://ftp5.gwdg.de/pub/misc/cran/src/contrib/") { RCheck = function(x, URL = "https://cran.r-project.org/src/contrib/") { if (!file.exists(x)) download.file(paste(URL, x, sep=""), x) cmd = paste("R CMD check --as-cran ", x, " > ", x, ".log", sep = "") print(cmd) ret = system(cmd) print(ret) ret } result <- packages_to_check("gstat") result sel = TRUE library(parallel) ncores_to_use = 2 cl <- makeCluster(getOption("cl.cores", ncores_to_use)) clusterExport(cl, c("RCheck", "sel", "result")) out = parLapply(cl, result[sel], function(x) RCheck(x)) succ = unlist(out) x = which(succ != 0) result[x] bla = lapply(result[x], function(y) { cat(paste(y, ":\n")) system(paste("tail -20 ",y,".log", sep="")) } ) #result <- packages_to_check("sp", recursive=TRUE) gstat/demo/snow.R0000644000176200001440000000206515060550314013433 0ustar liggesuserslibrary(sp) library(gstat) data(meuse.grid) gridded(meuse.grid) = ~x+y data(meuse) coordinates(meuse) = ~x+y ncell = 1000000 # sample 1000000 points over meuse.grid: newd = spsample(meuse.grid, ncell, type="regular") ncell = dim(coordinates(newd))[1] v = vgm(0.6, "Sph", 900, 0.05) library(parallel) nclus = detectCores() clus <- c(rep("localhost", nclus)) # set up cluster and data cl <- makeCluster(clus, type = "SOCK") clusterEvalQ(cl, library(gstat)) clusterExport(cl, list("meuse", "meuse.grid", "v")) # split prediction locations: # either at random: splt = sample(1:nclus, nrow(coordinates(newd)), replace = TRUE) # or regular: splt = rep(1:nclus, each = ceiling(ncell/nclus), length.out = ncell) newdlst = lapply(as.list(1:nclus), function(w) newd[splt == w,]) # no cluster: system.time(out.noclus <- krige(log(zinc)~1, meuse, newd, v)) # with cluster: system.time(out.clus <- do.call("rbind", parLapply(cl, newdlst, function(lst) krige(log(zinc)~1, meuse, lst, v) ))) stopCluster(cl) all.equal(out.clus, out.noclus) gridded(out.clus) = TRUE image(out.clus) gstat/demo/blue.R0000644000176200001440000000154015060550314013371 0ustar liggesusers# how to get the BLUE trend coefficients out of a predict.gstat call? # prepare data library(sp) library(gstat) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y # create a manual, non-automatic intercept meuse$Int = rep(1, length(meuse$zinc)) meuse.grid$Int = rep(1, length(meuse.grid$dist)) # create a gstat object without an automatic intercept: g = gstat(formula = log(zinc)~-1+Int+sqrt(dist), data=meuse, model = vgm(1, "Exp", 300)) newdat = meuse.grid[1:2,c("Int", "dist")] gridded(newdat) = FALSE newdat$dist = c(0,1) newdat$Int = c(1,0) # (in the more general case of n predictors, make sure that the matrix with # predictors, or design matrix, equals the identity matrix.) newdat out = as.data.frame(predict(g, newdat, BLUE = TRUE))[,3:4] rownames(out) = c("Intercept", "slope") colnames(out) = c("BLUE", "Variance") out gstat/demo/grass.R0000644000176200001440000000325115060550314013562 0ustar liggesusers# $Id: grass.R,v 1.4 2006-02-10 19:05:02 edzer Exp $ # this demo assumes quite a lot: # a. it assumes GRASS gis is running # b. it assumes that the meuse data zinc variable is available as a site list # c. it assumes that mask_map is present, and contains the mask map values # (i.e., the study area) library(sp) library(GRASS) # load R GRASS interface G = gmeta() # retrieves active data base locations and topology d = sites.get(G, "zinc") # retrieve zinc observations plot(d$east, d$north, asp=1) names(d)[4] = "zinc" # rename attribute mask = rast.get hist(d$zinc) hist(log(d$zinc)) mask = rast.get(G, "mask_map") plot(G, mask$mask.map) points(d$east,d$north, pch="+") library(gstat) # load gstat library bubble(d, zcol = "zinc", col=c(4,5), maxsize=2) # explain S formulae: ~ v = variogram(log(zinc)~1, ~east+north, d) plot(v) v.mod = vgm(.6, "Sph", 900, .1) plot(v, model = v.mod) v.fit = fit.variogram(v, v.mod) plot(v, model = v.fit) zinc.g = gstat(NULL, "lzinc", log(zinc)~1, ~east+north, d, model = v.fit) new.data = data.frame(east = east(G), north = north(G)) new.data[is.na(mask$mask.map), ] = c(NA,NA) zinc.kr = predict(zinc.g, new.data) image(zinc.kr) library(lattice) levelplot(lzinc.pred~east+north, zinc.kr, asp=1.34, col.regions=bpy.colors(100)) # push prediction and variances grids back into GRASS data base: rast.put(G, "lzinc.pred", zinc.kr$lzinc.pred) rast.put(G, "lzinc.var", zinc.kr$lzinc.var) # push cross validation residuals back to GRASS data base: xv = krige.cv(log(zinc)~1, ~east+north, d, v.fit, nmax = 40, verb=F) sites.put2(G, data = xv, dims = c("east", "north", "residual", "zscore"), lname = "lzinc.xv") gstat/demo/stkrige.R0000644000176200001440000002317015060550314014115 0ustar liggesusers# Ben Graeler, 25 th March, 2016 # # Script reproducing the fit of the vignette "spatio-temporal-kriging # libraries library(sp) library(spacetime) library(gstat) library(rgdal) # load data from package gstat data(DE_RB_2005, package = "gstat") paper <- FALSE set.seed(123) smplDays <- sort(sample(365,8)) # load German boundaries data(air) DE_NUTS1 <- spTransform(DE_NUTS1, CRS("+init=epsg:32632")) if(!paper) plot(DE_NUTS1) # station wise coverage if(!paper) barplot(sort(table(DE_RB_2005@index[,1])), main="reported days per station", ylab="number of days", xaxt="n") # acf if(!paper) { acf(DE_RB_2005[sample(68,1),,drop=F]@data) var(DE_RB_2005@data$PM10) } # a few daily snapshots if(paper) png("vignettes/figures/daily_means_PM10.png", width=9, height=6, "in", res=150) stplot(as(DE_RB_2005[,smplDays],"STFDF"), col.regions=bpy.colors(120)[-(1:20)], sp.layout = list("sp.polygons", DE_NUTS1), scales=list(draw=F), key.space="right", colorkey=T, cuts=0:70, main=NULL) if(paper) dev.off() # number of stations length(DE_RB_2005@sp) # calculate the empirical variogram empVgm <- variogramST(PM10~1, DE_RB_2005, tlags=0:6) if(!paper) { plot(empVgm, wireframe=T, scales=list(arrows=F)) plot(empVgm) } # fit of theoretical purely spatial models # ############################################ spEmpVgm <- empVgm[empVgm$timelag == 0,] class(spEmpVgm) <- c("gstatVariogram", "data.frame") spEmpVgm <- spEmpVgm[-1,1:3] spEmpVgm$dir.hor <- 0 spEmpVgm$dir.ver <- 0 spVgmMod <- fit.variogram(spEmpVgm, vgm(80,"Exp",300000,20)) if(!paper) plot(spEmpVgm, spVgmMod) # fit of theoretical spatio-temporal models # ############################################# linStAni <- estiStAni(empVgm, c(50000,200000)) if(!paper) { plot(gamma~dist, empVgm[empVgm$timelag == 0,], ylim=c(0,100), xlim=c(0,800000)) points(empVgm[empVgm$spacelag == 0,]$timelag*linStAni, empVgm[empVgm$spacelag == 0,]$gamma, col="red") } ## # rescale empVgm and linStAni to km for estimation empVgm$dist <- empVgm$dist/1000 empVgm$avgDist <- empVgm$avgDist/1000 empVgm$spacelag <- empVgm$spacelag/1000 linStAni <- linStAni/1000 # separable separableModel <- vgmST("separable", space=vgm(0.9,"Exp", 200, 0.1), time =vgm(0.9,"Sph", 3.5, 0.1), sill=120) fitSepModel <- fit.StVariogram(empVgm, separableModel, fit.method = 7, stAni = linStAni, method = "L-BFGS-B", control = list(parscale=c(100,1,10,1,100)), lower = c(10,0,.1,0,0.1), upper = c(2000,1,12,1,200)) attr(fitSepModel, "optim.output")$value # Exp+Exp: 9.87, Exp+Sph: 6.82, Sph+Exp: 10.42, Sph+Sph: 7.50 if(!paper) plot(empVgm, fitSepModel, wireframe=T, all=T, scales=list(arrows=F), zlim=c(0,135)) # product-sum prodSumModel <- vgmST("productSum", space=vgm(10, "Exp", 200, 1), time= vgm(10, "Sph", 2, 1), k=2) fitProdSumModel <- fit.StVariogram(empVgm, prodSumModel, fit.method = 7, stAni = linStAni, method = "L-BFGS-B", control = list(parscale = c(1,10,1,1,0.1,1,10)), lower = rep(0.0001,7)) attr(fitProdSumModel, "optim.output")$value # Exp+Exp: 10.09, Exp+Sph: 6.91, Sph+Exp: 10.64, Sph+Sph: 7.59 plot(empVgm, fitProdSumModel, wireframe=T, all=T, scales=list(arrows=F), zlim=c(0,135)) # metric metricModel <- vgmST("metric", joint = vgm(60, "Mat", 150, 10, kappa=0.6), stAni = 60) fitMetricModel <- fit.StVariogram(empVgm, metricModel, fit.method = 7, stAni = linStAni, method = "L-BFGS-B", control = list(parscale = c(10,20,5,10)), lower = c(80,50,5,50), upper = c(200,1500,60,300)) attr(fitMetricModel, "optim.output")$value # Exp: 10.25, Sph: 10.59, # Gau: 21.32, Mat 5: 18.20, Mat 2: 14.43, Mat 1.25: 12.04, # Mat 1: 11.07, Mat 0.75: 10.23, Mat 0.6: 10.05 if(!paper) plot(empVgm, fitMetricModel, wireframe=T, all=T, scales=list(arrows=F), zlim=c(0,135)) # simplified sumMetric model? sumMetricFromsimpleSumMetric <- function(vgm) { vgmST("sumMetric", space=vgm(vgm$space$psill, vgm$space$model, vgm$space$range, vgm$nugget/3), time =vgm(vgm$time$psill, vgm$time$model, vgm$time$range, vgm$nugget/3), joint=vgm(vgm$joint$psill, vgm$joint$model, vgm$joint$range, vgm$nugget/3), stAni=vgm$stAni) } simpleSumMetricModel <- vgmST("simpleSumMetric", space=vgm(120,"Sph", 150), time =vgm(120,"Exp", 10), joint=vgm(120,"Sph", 150), nugget=10, stAni=150) fitSimpleSumMetricModel <- fit.StVariogram(empVgm, simpleSumMetricModel, fit.method = 7, stAni=linStAni, method = "L-BFGS-B", lower = c(sill.s = 0, range.s = 10, sill.t = 0, range.t = 0.1, sill.st= 0, range.st= 10, nugget=0, anis = 40), upper = c(sill.s = 200, range.s = 500, sill.t = 200, range.t = 20, sill.st= 200, range.st = 5000, nugget = 100, anis = 1000), control = list(parscale = c(1,10,1,1,1,100,1,10))) attr(fitSimpleSumMetricModel, "optim.output")$value # Exp+Exp+Exp: 4.10 Exp+Sph+Exp: 3.60 Sph+Exp+Exp: 3.94 Sph+Sph+Exp: 3.32 # Exp+Exp+Sph: 3.74 Exp+Sph+Sph: 3.98 Sph+Exp+Sph: 3.31 Sph+Sph+Sph: 3.56 if(!paper) plot(empVgm,fitSimpleSumMetricModel, wireframe = T, scales = list(arrows = F), all = T , zlim=c(0,130)) # sum-metric # sumMetricModel <- sumMetricFromsimpleSumMetric(fitSimpleSumMetricModel) sumMetricModel <- vgmST("sumMetric", space = vgm(20, "Sph", 150, 1), time = vgm(10, "Exp", 2, 0.5), joint = vgm(80, "Sph", 1500, 2.5), stAni = 120) fitSumMetricModel <- fit.StVariogram(empVgm, sumMetricModel, fit.method = 7, stAni=linStAni, method = "L-BFGS-B", lower = c(sill.s = 0, range.s = 10, nugget.s = 0, sill.t = 0, range.t = 0.1, nugget.t = 0, sill.st= 0, range.st = 10, nugget.st = 0, anis = 40), upper = c(sill.s = 200, range.s = 1E3, nugget.s = 20, sill.t = 200, range.t = 75, nugget.t = 20, sill.st= 200, range.st = 5E3, nugget.st = 20, anis = 500), control = list(parscale = c(1,100,1,1,0.5,1,1,100,1,100), maxit=1e4)) attr(fitSumMetricModel, "optim.output")$value # Exp+Exp+Exp: 4.10 Exp+Sph+Exp: 3.60 Sph+Exp+Exp: 3.89 Sph+Sph+Exp: 3.32 # Exp+Exp+Sph: 3.74 Exp+Sph+Sph: 3.73 Sph+Exp+Sph: 3.31 Sph+Sph+Sph: 3.36 if(!paper) plot(empVgm, fitSumMetricModel, wireframe=T, all=T, scales=list(arrows=F), zlim=c(0,130)) if(!paper) plot(empVgm,fitSumMetricModel, wireframe=T, all=T, scales=list(arrows=F), zlim=c(0,130)) if(paper) png("vignettes/figures/allVgmsWireframe.png", 9, 6, "in", bg="white", res = 150) plot(empVgm, list(fitSepModel, fitProdSumModel, fitMetricModel, fitSumMetricModel, fitSimpleSumMetricModel), wireframe=T, all=T, zlim=c(0,140), ylim=c(0,6.1), xlim=c(0,300), scales=list(arrows = F, cex=.8, x=list(at=0:3*100), y=list(at=0:6, labels=c("0 ","","2 ","","4 ","","6 ")), z=list(at=0:5*25, labels=c("0 ","","50 ","","100 ",""))), at=0:100*1.4, xlab=list("space [km]", rot=27, cex=0.8), ylab=list("time [days]", rot=-40, cex=0.8), zlab=list(NULL, rot=94, cex=0.8)) if(paper) dev.off() if(paper) png("vignettes/figures/allVgmsDiffWireframe.png", 9, 6, "in", bg="white", res = 150) plot(empVgm, list(fitSepModel, fitProdSumModel, fitMetricModel, fitSumMetricModel, fitSimpleSumMetricModel), wireframe=T, all=T, zlim=c(-10,25), ylim=c(0,6.1), xlim=c(0,300), diff=TRUE, scales=list(arrows = F, cex=.8, x=list(at=0:3*100), y=list(at=0:6, labels=c("0 ","","2 ","","4 ","","6 ")), z=list(at=-2:5*5, labels=c("-10 ","","0 ","","10 ","","20 ",""))), xlab=list("space [km]", rot=27, cex=0.8), ylab=list("time [days]", rot=-40, cex=0.8), zlab=list(NULL, rot=94, cex=0.8)) if(paper) dev.off() if(paper) { library(lattice) spacelag <- rep(0:300, 13) timelag <- rep(0:12/2,each=301) cplot <- contourplot(model~spacelag+timelag|type, rbind(cbind(variogramSurface(fitSumMetricModel, data.frame(spacelag=spacelag, timelag=timelag)), data.frame(type = rep("variogram of the sum-metric model", length(spacelag)))), data.frame(spacelag=spacelag, timelag=timelag, gamma=sqrt(spacelag^2+116^2*timelag^2)/10, type="metric distance [10 km]")), at=0:15*10, xlab="space [km]", ylab="timelag [days]") png("vignettes/figures/vgmVsMetricDist.png", 9, 4, "in", bg="white", res = 150) print(cplot) dev.off() }gstat/demo/pcb_sf.R0000644000176200001440000001131715060550314013701 0ustar liggesusers# $Id: pcb.R,v 1.9 2008-02-01 22:39:44 edzer Exp $ # FIGURE 1: library(sf) library(stars) library(gstat) library(ggplot2) data(pcb) pcb = st_as_sf(pcb, coords = c("x", "y"), remove = FALSE) data(ncp.grid) ncp.grid = st_as_stars(ncp.grid) wsv = read_sf(system.file("external/ncp.shp", package="gstat")) classes = c(.2,1,2,5,10,20) print(xyplot(y ~ x | as.factor(year), groups = sqrt(PCB138)/3, data = as.data.frame(pcb), panel = function(x, y, groups, subscripts, ...) { plot(st_geometry(wsv), col = grey(.5), add = TRUE) panel.xyplot(x, y, cex = groups[subscripts], ...) }, xlab = "x-coordinate", ylab = "y-coordinate", key = list(corner = c(0,0), x=0.8, y=0.25, points = list(pch = 1, col = 1, cex = sqrt(classes)/3), text = list(as.character(classes))), aspect = "iso", as.table = T, xlim = c(464000, 739000), ylim = c(5696500, 6131500), scales = list(draw = F))) # FIGURE 2: pcb$yf = as.factor(pcb$year) pcb$int = rep(NA, dim(pcb)[1]) c = lm(log(PCB138)~-1+depth+yf,pcb)$coefficients i = 2 for (f in levels(pcb$yf)) { pcb$int[pcb$yf == f] = c[i] i = i+1 } print(xyplot(log(PCB138)~depth | as.factor(year), groups = int, data = as.data.frame(pcb), panel = function(x, y, groups, subscripts, ...) { # panel.grid(h=-1, v= 2) panel.xyplot(x, y) y = c(groups[subscripts][1], groups[subscripts][1] + -0.0641*45) llines(c(0, 45), y, lty = 2) }, scales = list( y = list(at=log(c(.2, .5, 1, 2, 5, 10, 20)), labels=c(".2",".5","1","2","5","10","20"), alternating = F) ), xlab = "water depth", ylab = "PCB138", as.table = T) ) # FIGURE 3: # ps.options(width=2, height=2) pcb$res=residuals(lm(log(PCB138)~year+depth, pcb)) v3 = variogram(res ~ year, pcb, dX=.1, bound=c(0,1000,3000,5000,(1:16)*10000)) print(plot(v3, model = vgm(.224,"Exp",17247,.08), plot.numbers = TRUE)) # FIGURE 4: # next g.pcb = NULL merge = list(c("P1986", 2, "P1991", 2), c("P1986", 2, "P1996", 2), c("P1986", 2, "P2000", 2)) for (f in levels(pcb$yf)[c(1,4,6,7)]) g.pcb= gstat(g.pcb, paste("P", as.character(f), sep = ""), log(PCB138)~depth, pcb[pcb$yf == f,], merge = merge) g.pcb = gstat(g.pcb, model = vgm(.224,"Exp",17247,.08), fill.all=T) v = variogram(g.pcb, cutoff=1e5) #plot(v, model = fit.lmc(v, g)) #plot(v, model = g,plot.numbers = TRUE) PCB.cor = matrix(NA, 4,4) i = 1 for (x in levels(pcb$yf)[c(1,4,6,7)]) { j = 1 for (y in levels(pcb$yf)[c(1,4,6,7)]) { A = log(pcb[pcb$yf == x,]$PCB138) B.tmp = krige(PCB138~1, pcb[pcb$yf == y,], pcb[pcb$yf == x,], nmax = 1, set=list(debug=0)) B = log(B.tmp$var1.pred) # print(paste(x, y, cor(A,B))) PCB.cor[i,j] = cor(A,B) j = j + 1 } i = i + 1 } years=c(1986,1991,1996,2000) dimnames(PCB.cor)=list(years,years) PCB.cor.ns = PCB.cor PCB.cor = 0.5 * (PCB.cor + t(PCB.cor)) i = 1 for (x in levels(pcb$yf)[c(1,4,6,7)]) { j = 1 for (y in levels(pcb$yf)[c(1,4,6,7)]) { if (j > i) { name = paste(paste("P", x, sep=""), paste("P", y, sep=""),sep = ".") print(name) g.pcb$model[[name]]["psill"] = g.pcb$model[[name]]["psill"] * PCB.cor[i,j] } j = j + 1 } i = i + 1 } print(plot(v, model = g.pcb, plot.numbers = FALSE)) print(PCB.cor.ns, digits=3) print(PCB.cor, digits=3) # FIGURE 5: pcb.cok = predict(g.pcb, newdata = ncp.grid, debug.level = 0) levs = c(.1,.2,.5,1,2,5,10,20) spplot(pcb.cok[c(1,3,5,7)], as.table=T, col.regions = bpy.colors(7), at = log(levs), colorkey = list(at = log(levs), labels = as.character(levs), col = bpy.colors(7)), layout = c(4,1) ) spplot(pcb.cok[c(4,11,6,12,13,8,14,15,16,10)-2], skip=c(F,T,T,T,F,F,T,T,F,F,F,T,F,F,F,F), as.table=T, layout=c(4,4), asp="iso", col.regions = bpy.colors()) X = cbind(rep(1,7), c(1986, 1987, 1989, 1991, 1993, 1996, 2000)) X2=X[c(1,4,6,7),] lambda = solve(t(X2) %*% X2) %*% t(X2) dimnames(lambda) = list(NULL, c(1986, 1991, 1996, 2000)) print(lambda[2, ], digits=3) # FIGURE 7: pcb.contr = get.contr(pcb.cok, g.pcb, X=lambda[2, ]) # copy coordinates #pcb.contr$x = pcb.cok$x #pcb.contr$y = pcb.cok$y pl1 = spplot(pcb.contr["beta.1"], main = "log-PCB138: change estimate", col.regions = bpy.colors(100)) pcb.contr$sig = pcb.contr$beta.1 / sqrt(pcb.contr$var.beta.1) pl2 = spplot(pcb.contr["sig"], main = "log-PCB138 change/SE", col.regions = bpy.colors(100)) print(pl1, position=c(0,0,0.5,1), more = TRUE) print(pl2, position=c(0.5,0,1,1), more = FALSE) cat("source:\n\nEdzer J. Pebesma, Richard N.M. Duin (2005) Spatio-temporal mapping of\nsea floor sediment pollution in the North Sea. In: Ph. Renard, and\nR. Froidevaux, eds. Proceedings GeoENV 2004 -- Fifth European Conference\non Geostatistics for Environmental Applications; Springer.\n") gstat/demo/ugsim.R0000644000176200001440000000126715060550314013574 0ustar liggesusers# $Id: ugsim.R,v 1.2 2006-02-10 19:05:02 edzer Exp $ library(sp) library(gstat) # prediction grid: data(meuse.grid) gridded(meuse.grid) = ~x+y # define variable as dummy data (parameters from log-zinc, meuse) v = vgm(.55, "Sph", 900, .05) g = gstat(NULL, "var1", lzn~1, beta = 5.9, nmax = 20, model = v, dummy = TRUE) # simulation of a single variable out = predict(g, meuse.grid, nsim = 20) spplot(out) # simulation of two negatively correlated variables: v = vgm(.55, "Sph", 900, .05) g = gstat(g, "var2", x~1, beta = 5.9, nmax = 20, model = v, dummy = TRUE) v = vgm(-.3, "Sph", 900, 0.00001) g = gstat(g, c("var1", "var2"), model = v) out = predict(g, meuse.grid, nsim = 10) spplot(out) gstat/demo/cokriging.R0000644000176200001440000000367115060550314014425 0ustar liggesusers# $Id: cokriging.R,v 1.4 2006-02-10 19:05:02 edzer Exp $ library(stars) library(gstat) data(meuse, package = "sp") meuse = st_as_sf(meuse, coords = c("x", "y")) data(meuse.grid, package = "sp") meuse.grid = st_as_stars(meuse.grid) # cokriging of the four heavy metal variables # create gstat object, stepwise: gstat(id="zn", formula=log(zinc)~1, data=meuse, nmax = 10) |> gstat("cu", log(copper)~1, meuse, nmax = 10) |> gstat("cd", log(cadmium)~1, meuse, nmax = 10) |> gstat("pb", log(lead)~1, meuse, nmax = 10) |> gstat(model=vgm(1, "Sph", 900, 1), fill.all=T) -> meuse.g x <- variogram(meuse.g, cutoff=1000) meuse.fit = fit.lmc(x, meuse.g) plot(x, model = meuse.fit) z <- predict(meuse.fit, newdata = meuse.grid) z[c(1,3,5,7)] |> merge() |> plot() # compute & plot standard errors: z[c(2,4,6,9)] |> setNames(paste0(c("zn", "cu", "pb", "cd"), ": se")) |> merge() |> sqrt() |> plot() # old-style, with sp: # indicator cokriging for the 9 percentiles of zinc: q <- quantile(meuse$zinc, seq(.1,.9,.1)) gstat(id = "zn1", formula = I(zinc < q[1])~1, data = meuse, nmax = 7, beta = .1, set = list(order = 4, zero = 1e-5)) |> gstat("zn2", I(zinc < q[2])~1, meuse, nmax = 7, beta=.2) |> gstat("zn3", I(zinc < q[3])~1, meuse, nmax = 7, beta=.3) |> gstat("zn4", I(zinc < q[4])~1, meuse, nmax = 7, beta=.4) |> gstat("zn5", I(zinc < q[5])~1, meuse, nmax = 7, beta=.5) |> gstat("zn6", I(zinc < q[6])~1, meuse, nmax = 7, beta=.6) |> gstat("zn7", I(zinc < q[7])~1, meuse, nmax = 7, beta=.7) |> gstat("zn8", I(zinc < q[8])~1, meuse, nmax = 7, beta=.8) |> gstat("zn9", I(zinc < q[9])~1, meuse, nmax = 7, beta=.9) |> gstat(model=vgm(1, "Sph", 900, 1), fill.all=T) -> meuse.i x <- variogram(meuse.i, cutoff=1000) meuse.fit = fit.lmc(x, meuse.i, correct.diagonal = 1.01) plot(x, model = meuse.fit) z <- predict(meuse.fit, newdata = meuse.grid) z[c(1,3,5,7,9,11,13,15,17)] |> setNames(paste("est.Pr(Zn < ", signif(q,4), ")", sep = "")) |> merge() |> plot() gstat/demo/cosimulation.R0000644000176200001440000000427415060550314015157 0ustar liggesusers# $Id: cosimulation.R,v 1.5 2006-02-10 19:05:02 edzer Exp $ library(sp) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y # cosimulation the four heavy metal variables meuse.g <- gstat(id="zn", formula=zinc~1, data=meuse, nmax = 10, set = list(zero = 1e-10)) meuse.g <- gstat(meuse.g, "cu", copper~1, meuse, nmax = 10) meuse.g <- gstat(meuse.g, "cd", cadmium~1, meuse, nmax = 10) meuse.g <- gstat(meuse.g, "pb", lead~1, meuse, nmax = 10) meuse.g <- gstat(meuse.g, model=vgm(1, "Sph", 900, 1), fill.all=T) x <- variogram(meuse.g, cutoff=1000) meuse.fit = fit.lmc(x, meuse.g) plot(x, model = meuse.fit) z <- predict(meuse.fit, newdata = meuse.grid, nsim = 2) library(lattice) pl1 <- spplot(z, c(1,2), main = "zinc simulations") pl2 <- spplot(z, c(3,4), main = "copper simulations") pl3 <- spplot(z, c(5,6), main = "cadmium simulations") pl4 <- spplot(z, c(7,8), main = "lead simulations") print(pl1, split = c(1,1,2,2), more=TRUE) print(pl2, split = c(1,2,2,2), more=TRUE) print(pl3, split = c(2,1,2,2), more=TRUE) print(pl4, split = c(2,2,2,2)) # indicator cosimulation for the 9 deciles of zinc: q <- quantile(meuse$zinc, seq(.1,.9,.1)) meuse.i <- gstat(id = "zn1", formula = I(zinc < q[1])~1, data = meuse, nmax = 7, beta = .1, set = list(order = 4, zero = 1e-5)) meuse.i <- gstat(meuse.i, "zn2", I(zinc < q[2])~1, meuse, nmax = 7, beta=.2) meuse.i <- gstat(meuse.i, "zn3", I(zinc < q[3])~1, meuse, nmax = 7, beta=.3) meuse.i <- gstat(meuse.i, "zn4", I(zinc < q[4])~1, meuse, nmax = 7, beta=.4) meuse.i <- gstat(meuse.i, "zn5", I(zinc < q[5])~1, meuse, nmax = 7, beta=.5) meuse.i <- gstat(meuse.i, "zn6", I(zinc < q[6])~1, meuse, nmax = 7, beta=.6) meuse.i <- gstat(meuse.i, "zn7", I(zinc < q[7])~1, meuse, nmax = 7, beta=.7) meuse.i <- gstat(meuse.i, "zn8", I(zinc < q[8])~1, meuse, nmax = 7, beta=.8) meuse.i <- gstat(meuse.i, "zn9", I(zinc < q[9])~1, meuse, nmax = 7, beta=.9) meuse.i <- gstat(meuse.i, model=vgm(1, "Sph", 900, 1), fill.all=T) x <- variogram(meuse.i, cutoff=1000) meuse.fit = fit.lmc(x, meuse.i) plot(x, model = meuse.fit) z <- predict(meuse.fit, newdata = meuse.grid, nsim = 2, indicators = TRUE) spplot(z, main = "indicator simulations for 9 deciles") gstat/demo/00Index0000644000176200001440000000440615060550314013455 0ustar liggesusersa2p area-to-point kriging with krige0 a2pinST area-to-point kriging in space-time with krigeST block block kriging -- effect of block size and irregular blocks blue how to get BLUE coefficients out of a predict.gstat call cc collocated cokriging example circEmbeddingMeuse simulation based in circular embedding allowing fft cokriging fitting a linear model of coregionalization and cokriging comp_geoR compare gstat kriging output with that obtained from geoR cosimulation fitting a linear model of coregionalization and cosimulation depend check gstat package dependencies examples how to do the original gstat example files in S grass example grass/R/gstat run; requires grass meuse data set installed gstat3D example of 3D interpolation of random points ikr example indicator kriging on zinc w. threshold 500 ppm krige sample run of ordinary and universal kriging lhs create latin hypercube sample of Gaussian random field lnsim carry out log-normal kriging, based on conditional simulation sic2004 part of sic2004 excercise; see ?sic2004 sftime demo using package sftime, derived from demo(stkrige) pcb pcb North Sea data analysis as used for geoENV2004 paper; see ?pcb pcb_sf pcb North Sea data analysis as used for geoENV2004 paper, using sf, stars and ggplot2; see ?pcb fulmar analysis of Fulmaris glacialis data on Dutch part of the North Sea uisim unconditional indicator simulation, 2 and 3 category examples ugsim unconditional Gaussian simulation snow parallel kriging using package snow (not on Windows) line examples for lines support prediction weight compute (the expensive way) kriging weights for a single prediction location wind space-time kriging with the Irish wind data sets rep 10 x 10 matrix of fitted variograms from 100 simulated fields sftime demonstration for using the classes of sftime, local spatio-temporal kriging stkrige model estimation for Vignette spatio-temporal kriging stkrige-prediction prediction as in Vignette spatio-temporal kriging [!time consuming!] stkrige-crossvalidation crossvalidation as in Vignette spatio-temporal kriging [!very time consuming!] localKrigeST locally krige an irregular spatio-temporal data set to a regular spatio-temporal grid zonal approximate zonal anisotropy with geometrically anistropic model gstat/demo/comp_geoR.R0000644000176200001440000000062415060550314014356 0ustar liggesuserslibrary(sp) library(gstat) library(geoR) xyz = data.frame(x = c(0,0,1), y = c(0, 1, 1), z = c(1,2,3)) coordinates(xyz)=~x+y x0 = SpatialPoints(data.frame(x=0,y=.5)) kr1 = krige(z~1,xyz,x0,vgm(1, "Exp", 1)) kr2 = krige.conv(as.geodata(xyz), locations=coordinates(x0), krige=list(cov.model="exponential", cov.par=c(1,1))) kr1 c(kr2$predict, kr2$krige.var) kr1[[1]] - kr2$predict kr1[[2]] - kr2$krige.var gstat/demo/circEmbeddingMeuse.R0000644000176200001440000000625315060550314016166 0ustar liggesusers############################# ## Example: Meuse data set ## ############################# library(sp) library(gstat) data("meuse") coordinates(meuse) <- ~x+y data("meuse.grid") coordinates(meuse.grid) <- ~x+y gridded(meuse.grid) <- TRUE # variography empVgm <- variogram(zinc~1, meuse) modVgm <- fit.variogram(empVgm, vgm(150000, "Sph", 1000, 25000)) # unconditional simulation unconSim <- krigeSimCE(zinc~1, newdata = meuse.grid, model = modVgm, n=100) unconSim@data$zinc.simMean <- apply(unconSim@data[,-c(1:5)], 1, mean) spplot(unconSim[,6:20], main="15 out of 100 unconditional simulations") spplot(unconSim, "zinc.simMean", main="mean of 100 unconditional simulations") # conditional simulation conSim <- krigeSimCE(zinc~1, meuse, meuse.grid, modVgm, n=100) conSim@data$zinc.simMean <- apply(conSim@data[,-c(1:5)], 1, mean) spplot(conSim[,6:20], main="15 out of 100 conditional simulations") # compare with kriging predictor simKrige <- krige(zinc~1, meuse, meuse.grid, modVgm) spplot(simKrige, "var1.pred", main="interpolated zinc concentrations") spplot(conSim, "zinc.simMean", main="mean of 100 conditional simulations") ################################################ ## turning bands simulation in space and time ## ################################################ separableModel <- vgmST("separable", space=vgm(0.85,"Exp", 831, 0.15), time =vgm(0.9,"Exp", 3.25, 0.1), sill=135000) attr(separableModel,"temporal unit") <- "days" library(spacetime) stf <- STF(meuse, Sys.time()-20:0*24*3600) stf_grid <- STF(geometry(meuse.grid), stf@time) ################### ## unconditional ## ################### sTime <- Sys.time() krigedSim <- krigeSTSimTB(newdata = stf_grid, modelList = separableModel, nsim = 100, nLyrs = 100) Sys.time() - sTime # plot one simulation along time stplot(krigedSim[,,"sim1"], main="unconditional siumulation") # plot one simulation along time as time series stplot(krigedSim[1:21,,"sim1"], mode="ts", main="unconditional siumulation") stplot(krigedSim[1:21,,"sim2"], mode="ts", main="unconditional siumulation") stplot(krigedSim[1:21,,"sim3"], mode="ts", main="unconditional siumulation") stplot(krigedSim[1:21,,"sim4"], mode="ts", main="unconditional siumulation") stplot(krigedSim[1:21,,"sim5"], mode="ts", main="unconditional siumulation") stplot(krigedSim[1:21,,"sim6"], mode="ts", main="unconditional siumulation") # plot the ten simulations of the first day spplot(krigedSim[,1], paste0("sim",1:10), as.table=TRUE, main="unconditional siumulation") ################# ## conditional ## ################# sTime <- Sys.time() krigedSim <- krigeSTSimTB(formula= zinc ~ 1, data = STFDF(geometry(meuse), stf@time, data.frame(zinc=rep(meuse$zinc, 21))), newdata = stf_grid[1:500,], modelList = separableModel, nsim = 10, nLyrs = 500) Sys.time() - sTime # plot one simulation along time stplot(krigedSim[,1:12], main="conditinal simulation") # plot one simulation along time as time series stplot(krigedSim[1:12,,"sim1"], mode="ts", main="conditinal simulation") # plot the ten simulations of the first day spplot(krigedSim[,1], paste0("sim",1:10), as.table=TRUE, main="conditinal simulation")gstat/demo/sftime.R0000644000176200001440000000415115060550314013732 0ustar liggesusers## FNN local prediction ######################## library(sp) library(spacetime) library(gstat) library(lattice) # create n space-time points over [0,1] x [0,1] x [Now, Now+some days] t0 = Sys.time() # now n = 1000 set.seed(13131) # fix outcomes x = runif(n) y = runif(n) t = t0 + 1e6 * runif(n) z = rnorm(n) stidf = STIDF(SpatialPoints(cbind(x,y)), sort(t), data.frame(z=z)) stplot(stidf, number=21, main="random spatio-temporal noise") library(sftime) sft = st_as_sftime(stidf) # create a regular 20 x 20 x 10 grid of prediction locations: grd = as(SpatialGrid(GridTopology(c(0.025,0.025), c(.05, .05), c(20,20))), "SpatialPixels") tgrd = seq(min(t)+10000, max(t)-10000, length.out = 10) stf = STF(grd, tgrd) #stf = STFDF(grd, tgrd, data.frame(x=rep(0,400*10))) library(stars) st = st_as_stars(stf) # define a variogram model sumMetricModel <- vgmST("sumMetric", space=vgm(1/6, "Sph", 0.25, 1/60), time =vgm(2/6, "Exp", 1e5, 1/60), joint=vgm(0.4, "Exp", 0.3, 0.1), stAni=1/1e6) attr(sumMetricModel, "temporal unit") <- "secs" dg <- data.frame(spacelag=rep(c(0.001,1:10)/10,6), timelag=rep(0:5*50e3, each=11)) #wireframe(model~spacelag+timelag, # variogramSurface(sumMetricModel, dist_grid = dg), # scales=list(arrows=F), # drape=T, col.regions=bpy.colors(), # zlim=c(0,1.2), # main="imposed sum-metric model") locKrig_sft <- krigeST(z~1, sft, st, sumMetricModel, nmax=20, computeVar = T) locKrig <- krigeST(z~1, stidf, stf, sumMetricModel, nmax=20, computeVar = T) stplot(locKrig[,,"var1.pred"], col.regions=bpy.colors(), scales=list(draw=T)) plot(locKrig_sft[1], col = sf.colors(), breaks = "equal") stplot(locKrig[,,"var1.var"], col.regions=bpy.colors(), scales=list(draw=T)) plot(locKrig_sft[2], col = sf.colors(), breaks = "equal") st$foo = 0 st_as_sf(st, long = TRUE) |> st_as_sftime() -> st.sftime locKrig_sft <- krigeST(z~1, sft, st.sftime, sumMetricModel, nmax=20, computeVar = T) plot(locKrig_sft["var1.pred"]) gstat/demo/examples.R0000644000176200001440000001616015060550314014264 0ustar liggesusers# $Id: examples.R,v 1.6 2006-02-10 19:05:02 edzer Exp $ ## ex01.cmd, ex02.cmd: ## ## Two variables with (initial estimates of) variograms, ## calcute sample variogram and plot fitted model ## library(sp) par(ask = TRUE) data(meuse) coordinates(meuse)=~x+y x <- variogram(zinc ~ 1, meuse) v <- vgm(140000, "Sph", 800, nug = 10000) plot(x, model = v) plot(x, model = fit.variogram(x, model = v)) x <- variogram(log(zinc) ~ 1, meuse) v <- vgm(.5, "Sph", 800, nug = .1) plot(x, model = v) plot(x, model = fit.variogram(x, model = v)) ## ## ex03.cmd: ## Inverse distance interpolation on a mask map ## data(meuse.grid) gridded(meuse.grid) = ~x+y x <- krige(zinc ~ 1, meuse, meuse.grid, model = NULL) library(lattice) spplot(x[1]) ## ## ex04.cmd ## Local ordinary block kriging at non-gridded locations ## ## the gstat "classic" radius maps into the gstat "S" maxdist argument ## new.locs <- SpatialPoints(cbind(x = c(181170, 180310, 180205, 178673, 178770, 178270), y = c(333250, 332189, 331707, 330066, 330675, 331075))) krige(zinc ~ 1, meuse, new.locs, model = vgm(1.34e5, "Sph", 800, nug = 2.42e4), block = c(40,40), nmax = 40, nmin = 20, maxdist = 1000) ## ## ex05.cmd ## ## Local simple point kriging on a mask map ## v <- vgm(0.581, "Sph", 900, nug = 0.0554) x <- krige(log(zinc) ~ 1, meuse, meuse.grid, model = v, nmax = 40, nmin = 20, maxdist = 1000, beta = 5.9) spplot(x[1], main = "log(zinc) simple kriging prediction") x$se = sqrt(x$var1.var) spplot(x["se"], main = "log(zinc) simple kriging standard errors") ## ## ex06.cmd ## ## Unconditional Gaussian simulation on a mask ## (local neigbourhoods, simple kriging) ## x <- krige(log(zinc) ~ 1, locations = NULL, newdata = meuse.grid, model = v, nmax = 20, beta = c(5.9), nsim = 5, dummy = TRUE) spplot(x, main = "five unconditional realisations of a correlated Gaussian field") ## ## ex07.cmd ## ## Gaussian simulation, conditional upon data ## (local neighbourhoods, simple and ordinary kriging) ## x <- krige(log(zinc) ~ 1, meuse, meuse.grid, model = v, nmax = 20, beta = c(5.9), nsim = 5) spplot(x, main = "five conditional realisations of a correlated Gaussian field") ## ## ex08.cmd ## ## Change of support: local ordinary block kriging on a mask ## x <- krige(log(zinc) ~ 1, meuse, meuse.grid, model = v, nmax = 40, nmin = 20, maxdist = 1000, block = c(40,40)) spplot(x[1], main = "ordinary block kriging predictions") x$se = sqrt(x$var1.var) spplot(x["se"], main = "ordinary block kriging prediction standard errors") ## ## ex09.cmd ## ## Obtain map values at data() locations ## (Point-map overlay) ## # we trick here by using inv.weighted distance interpolation, using the # single nearest observation. It will not fail on points outside the grid. # Note that we reversed meuse.grid and meuse to get these results. x <- krige(part.a ~ 1, meuse.grid, meuse, model = NULL, nmax = 1) meuse$part.a = x$var1.pred x <- krige(part.b ~ 1, meuse.grid, meuse, model = NULL, nmax = 1) meuse$part.b = x$var1.pred ## ## ex10.cmd ## ## Multiple kriging: prediction on more than one variable ## (ordinary kriging of two variables) ## (note that zinc_map.eas wass obtained through ex09.gst) ## x <- variogram(dist~1,meuse) v.dist <- fit.variogram(x, model = vgm(1,"Gau",100)) plot(x, model = v.dist) g <- gstat(id = "ln.zinc", form = log(zinc) ~ 1, data = meuse, nmax = 40, nmin = 20, maxdist = 1000, model = v) g <- gstat(g, id = "dist", form = dist ~ 1, data = meuse, nmax = 40, nmin = 20, maxdist = 1000, model = vgm(.01, "Nug", 0, add.to = v.dist)) # the added nugget variance is necessary to avoid near-singular covariances x <- predict(g, meuse.grid) spplot(x["ln.zinc.pred"], main = "log(zinc) ordinary kriging predictions") x$ln.zinc.se = sqrt(x$ln.zinc.var) spplot(x["ln.zinc.se"], main = "log(zinc) ordinary kriging prediction standard errors") spplot(x["dist.pred"], main = "dist ordinary kriging predictions") x$dist.se = sqrt(x$dist.var) spplot(x["dist.se"], main = "dist ordinary kriging prediction standard errors") ## ## ex11.cmd ## ## Multivariable kriging: ordinary local cokriging of two variables ## For examples of fitting an LMC: see demo(cokriging) ## g <- gstat(id = "ln.zinc", form = log(zinc) ~ 1, data = meuse, nmax = 40, nmin = 20, maxdist = 1000, model = vgm(0.581, "Sph", 900, 0.0554)) g <- gstat(g, id = "sq.dist", form = sqrt(dist) ~ 1, data = meuse, nmax = 40, nmin = 20, maxdist = 1000, model = vgm(0.0631, "Sph", 900, 0.0001)) g <- gstat(g, id = c("ln.zinc", "sq.dist"), model = vgm(-0.156, "Sph", 900, 1e-5)) # small nugget necessary to let gstat recognize LMC x <- predict(g, meuse.grid) spplot(x["ln.zinc.pred"], main = "log(zinc) ordinary cokriging predictions") x$ln.zinc.se = sqrt(x$ln.zinc.var) spplot(x["ln.zinc.se"], main = "log(zinc) ordinary cokriging prediction standard errors") spplot(x["sq.dist.pred"], main = "dist ordinary cokriging predictions") x$sq.dist.se = sqrt(x$sq.dist.var) spplot(x["sq.dist.se"], main = "dist ordinary cokriging prediction standard errors") ## ## ex12.cmd ## ## Stratified ordinary kriging (within-category ordinary kriging) ## # find out in which part the data are: meuse$part.a = krige(part.a~1, meuse.grid, meuse, nmax=1)$var1.pred x1 = krige(log(zinc)~1, meuse[meuse$part.a == 0,], meuse.grid[meuse.grid$part.a == 0,], model = vgm(.548, "Sph", 900, .0654), nmin = 20, nmax = 40, maxdist = 1000) x2 = krige(log(zinc)~1, meuse[meuse$part.a == 1,], meuse.grid[meuse.grid$part.a == 1,], model = vgm(.716, "Sph", 900), nmin = 20, nmax = 40, maxdist = 1000) x = rbind(as.data.frame(x1), as.data.frame(x2)) gridded(x) = ~x+y spplot(x["var1.pred"], main = "stratified kriging predictions") ## ## ex13.cmd ## ## Local universal kriging, using one continuous variable ### ## the variogram should be that of the residual: x <- krige(log(zinc) ~ sqrt(dist), meuse, meuse.grid, model = vgm(.149, "Sph", 700, .0674), nmax = 40, nmin = 20, maxdist = 1000) spplot(x["var1.pred"], main = "universal kriging predictions") x$var1.se = sqrt(x$var1.var) spplot(x["var1.se"], main = "universal kriging prediction standard errors") ## ## ex14.cmd ## ## Universal kriging, using one continuous and ## two binary variables. ## x <- krige(log(zinc) ~ -1 + sqrt(dist)+ part.a + part.b, meuse, meuse.grid, model = vgm(.149, "Sph", 700, .0674)) spplot(meuse.grid["part.a"], main = "the areas defining part.a (1) and part.b (0)") spplot(x["var1.pred"], main = "universal kriging predictions") x$var1.se = sqrt(x$var1.var) spplot(x["var1.se"], main = "universal kriging prediction standard errors") ## ## ex14a.cmd ## ## stratified universal kriging: ## (again: not implemented) ## ## ex15.cmd ## ## Local linear model, using one continuous variable ## x <- krige(log(zinc) ~ sqrt(dist), meuse, meuse.grid, model = NULL, nmax = 40, nmin = 20, maxdist = 1000) spplot(x["var1.pred"], main = "IID local linear model kriging predictions") x$var1.se = sqrt(x$var1.var) spplot(x["var1.se"], main = "IID local linear model prediction standard errors") ## ## ex16.cmd ## ## Multivariable indicator cosimulation ## ==>> see demo(cosimulation) for an extended example how to do this ## ## ## ex17.cmd ## ## global coordinate polynomial trend surfaces ## trend orders 0-3 ==>> better use lm() for this ## gstat/demo/krige.R0000644000176200001440000000203415060550314013542 0ustar liggesusers# $Id: krige.R,v 1.5 2007-02-27 22:09:31 edzer Exp $ library(sp) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y # ordinary kriging v <- variogram(log(zinc)~1, meuse) m <- fit.variogram(v, vgm(1, "Sph", 300, 1)) plot(v, model = m) lzn.kr <- krige(formula = log(zinc)~1, meuse, meuse.grid, model = m) pl1 <- spplot(lzn.kr[1], main = "ordinary kriging prediction of log-zinc") lzn.kr$se = sqrt(lzn.kr$var1.var) pl2 <- spplot(lzn.kr["se"], main = "ordinary kriging prediction error") # universal kriging v <- variogram(log(zinc)~sqrt(dist), meuse) m <- fit.variogram(v, vgm(1, "Exp", 300, 1)) plot(v, model = m) lzn.kr <- krige(log(zinc)~sqrt(dist), meuse, meuse.grid, model = m) pl3 <- spplot(lzn.kr[1], main = "universal kriging prediction of log-zinc") lzn.kr$se = sqrt(lzn.kr$var1.var) pl4 <- spplot(lzn.kr["se"], main = "universal kriging prediction error") print(pl1, split = c(1,1,2,2), more = T) print(pl2, split = c(1,2,2,2), more = T) print(pl3, split = c(2,1,2,2), more = T) print(pl4, split = c(2,2,2,2)) gstat/demo/rep.R0000644000176200001440000000131115060550314013224 0ustar liggesuserslibrary(sp) library(gstat) data(meuse) coordinates(meuse) = ~x + y data(meuse.grid) coordinates(meuse.grid) = ~x + y # Variogram log Zn lzn.vgm = variogram(log(zinc) ~ 1, meuse) lzn.fit = fit.variogram(lzn.vgm, model = vgm(1, "Sph", 900, 1)) #Conditional simulation nsim = 100 lzn.sim = krige(log(zinc) ~ 1, meuse, meuse.grid, model = lzn.fit, nmax = 30, nsim = nsim) # Variogram of all relizations m = out = list() for (i in 1:nsim) { s = paste("sim", i, sep="") f = as.formula(paste(s, "~1")) v = variogram(f, lzn.sim) v$id = rep(s, nrow(v)) out[[s]] = v m[[s]] = fit.variogram(v, lzn.fit) } plot(do.call(rbind, out), m, layout=c(10,10), skip = FALSE, scales = list(y = list(relation = "same"))) gstat/demo/wind.R0000644000176200001440000000340015060550314013400 0ustar liggesusers#pdf("wind.pdf") # PLEASE read the vignette of package spacetime for a more # clever way to do all this! library(sp) library(gstat) library(rgdal) library(maptools) # load wind data, run test: example(wind) m = map2SpatialLines( map("worldHires", xlim = c(-11,-5.4), ylim = c(51,55.5), plot=F)) proj4string(m) = "+proj=longlat +datum=WGS84 +ellps=WGS84" m = spTransform(m, CRS("+proj=utm +zone=29 +datum=WGS84 +ellps=WGS84")) # model temporal autocorrelation acf(wind[7]) tdiscr = 0:40 lines(tdiscr, exp(- tdiscr/1.5)) # set up data, last year years = 61 months = 1 jday = c(1,6,11,16,21,26) sel = wind[wind$year %in% years & wind$month %in% months & wind$jday %in% jday,] #stations = 4:15 stations = 4:15 sels = stack(sel[stations]) sels$t = rep(sel$jday, length(stations)) sels$x = coordinates(wind.loc)[match(sels$ind, wind.loc$Code),1] sels$y = coordinates(wind.loc)[match(sels$ind, wind.loc$Code),2] summary(sels) coordinates(sels) = ~x+y proj4string(sels) = "+proj=longlat +datum=WGS84 +ellps=WGS84" sels = spTransform(sels, CRS("+proj=utm +zone=29 +datum=WGS84 +ellps=WGS84")) grd = makegrid(m, n = 1000) grd$t = rep(1, nrow(grd)) coordinates(grd) = ~x1+x2 gridded(grd)=TRUE proj4string(grd) = proj4string(sels) #sels = as(sels, "data.frame") # setup grid covfn = function(x, y = x) { u = spDists(coordinates(x), coordinates(y)) t = abs(outer(x$t,y$t,"-")) 0.6 * exp(-u/750000) * exp(-t/1.5) } for (i in 1:120) { grd$t = rep(i/4, nrow(grd)) n = paste("t", i/4, sep="") grd[[n]] = krige0(sqrt(values)~1, sels, grd, covfn) } grd$t = NULL #grd$pr = out$pred #library(lattice) #levelplot(pr~x1+x2|t,grd,col.regions=bpy.colors()) spl = list(list("sp.points", sels,first=F, cex=.5), list("sp.lines", m, col='grey')) spplot(grd, sp.layout = spl, col.regions=bpy.colors()) gstat/demo/a2pinST.R0000644000176200001440000000210315060550314013716 0ustar liggesusers## area2point in space and time library(sp) library(gstat) data("meuse") coordinates(meuse) <- ~x+y data("meuse.grid") coordinates(meuse.grid) <- ~x+y gridded(meuse.grid) <- TRUE meuse.coarse.grid <- SpatialGrid(GridTopology(meuse.grid@grid@cellcentre.offset, c(600,600), c(5, 7))) separableModel <- vgmST("separable", space=vgm(0.85,"Exp", 831, 0.15), time =vgm(0.9,"Exp", 3.25, 0.1), sill=135000) attr(separableModel,"temporal unit") <- "days" library(spacetime) stf <- STF(meuse[sample(155, 25),], Sys.time()-2:0*24*3600) stf_grid <- STF(geometry(meuse.coarse.grid), stf@time) krigedSim <- krigeSTSimTB(newdata = stf_grid, modelList = separableModel, nsim = 1, nLyrs = 100) # area-to-point kriging: a2pST = krigeST(sim1 ~ 1, krigedSim, stf, modelList = vgmAreaST, ndiscr = 9, model = separableModel, # point variogram, verbose = TRUE) p1 <- stplot(krigedSim, color.key=F) p2 <- stplot(a2pST, color.key=F) print(p1, position=c(0,0.5,1,1), more=TRUE) print(p2, position=c(0,0,1,0.5)) gstat/demo/cc.R0000644000176200001440000000100215060550314013020 0ustar liggesuserslibrary(sp) demo(meuse, ask = FALSE, echo = FALSE) library(gstat) # use collocated data: g = gstat(NULL, "lzinc", log(zinc)~1, meuse) g.coll = gstat(g, "dist", dist~1, meuse, nmax = 1, merge = c("lzinc", "dist")) g.fit = fit.lmc(variogram(g.coll), g.coll, vgm(1, "Sph", 900, 1), correct.diagonal = 1.01) g.non_coll = gstat(g, "dist", dist~1, meuse.grid, nmax = 1, merge = c("lzinc", "dist")) g.non_coll$model = g.fit$model # collocated cokriging: pr = predict(g.non_coll, meuse.grid) spplot(pr[c(1,3)]) gstat/demo/zonal.R0000644000176200001440000000063515060550314013571 0ustar liggesusers library(sp) demo(meuse,ask=FALSE,echo=FALSE) library(gstat) v = variogram(log(zinc)~1, meuse, alpha = c(0,45,90,135)) vm = vgm(.25, "Sph", 1000, anis = c(45, 0.5)) plot(v, vm, main = "geometric") zonal = vgm(.5, "Sph", 1e9, anis = c(45, 1/1e6)) # range is 1e9, effectively infinity, in 45 direction; # it is 1e9/1e6 = 1000 in 135 direction. vm = vgm(.25, "Sph", 1000, add.to = zonal) plot(v, vm, main = "zonal") gstat/demo/line.R0000644000176200001440000000302715060550314013373 0ustar liggesuserslibrary(sp) library(gstat) data(meuse.grid) gridded(meuse.grid) = ~x+y data(meuse) coordinates(meuse) = ~x+y # choose arbitrary line over the grid: image(meuse.grid["dist"],axes=T) pp = rbind(c(180000,331000),c(180000,332000),c(181000,333500)) Sl = SpatialLines(list(Lines(list(Line(pp)), "a"))) plot(Sl,add=T,col='green') # use the default spsample arguments of predict.gstat: pts=spsample(Sl,n=500,'regular',offset=c(.5,.5)) plot(pts, pch=3, cex=.2, add=T) v = vgm(.6, "Sph", 900, .06) out1 = krige(log(zinc)~1, meuse, Sl, v) out1 points(180333,332167,pch=3,cex=2) # use the same line as block discretization, and predict for (0,0) # (because the block discretizing points are not centered) out2 = krige(log(zinc)~1, meuse, SpatialPoints(matrix(0,1,2)), v, block=coordinates(pts)) out2 compare.krigingLines = function(formula, data, newdata, model) { out1 = krige(formula, data, newdata, model) pts = spsample(newdata, n=500, 'regular', offset=.5) out2 = krige(formula, data, SpatialPoints(matrix(0,1,2)), model, block = coordinates(pts)) print("difference:") as.data.frame(out1)[3:4]- as.data.frame(out2)[3:4] } compare.krigingLines(log(zinc)~1, meuse, Sl, v) # one line, consisting of two line segments: pp2 = rbind(c(181000,333500),c(181000,332500)) Sl2 = SpatialLines(list(Lines(list(Line(pp),Line(pp2)), "a"))) krige(log(zinc)~1, meuse, Sl2, v) compare.krigingLines(log(zinc)~1, meuse, Sl2, v) # two seperate line segments: Sl3 = SpatialLines(list(Lines(list(Line(pp)), "a"),Lines(list(Line(pp2)),"b"))) krige(log(zinc)~1, meuse, Sl3, v) gstat/demo/uisim.R0000644000176200001440000000226115060550314013571 0ustar liggesusers# $Id: uisim.R,v 1.5 2008-09-25 10:26:00 edzer Exp $ library(sp) library(gstat) # prediction grid: data(meuse.grid) gridded(meuse.grid) = ~x+y # define variable as dummy data v = vgm(.25, "Sph", 900) g = gstat(NULL, "var1", x~1, beta = .5, nmax = 20, model = v, dummy = TRUE) # simulation of a single variable out = predict(g, meuse.grid, nsim = 20, indicators = TRUE) spplot(out) # simulation of two correlated variables: v = vgm(.1, "Sph", 900) g = gstat(g, "var2", x~1, beta = .25, nmax = 20, model = v, dummy = TRUE) v = vgm(-.1, "Sph", 900) g = gstat(g, c("var1", "var2"), model = v) out = predict(g, meuse.grid, nsim = 10, indicators = TRUE, set = list(order = 2)) spplot(out) # merge all 10 individual simulations into three-group factors: for (i in 1:10) { v1 = paste("var1.sim", i, sep = "") v2 = paste("var2.sim", i, sep = "") m = cbind(out[[v1]], out[[v2]], 1 - (out[[v1]]+out[[v2]])) mout = factor(apply(m, 1, function(x) which(x == 1))) if (i == 1) out2 = SpatialPixelsDataFrame(as(out, "SpatialPixels"), data.frame(mout)) else out2[[i]] = mout } names(out2) = paste("sim", 1:10, sep="") spplot(out2) require(RColorBrewer) spplot(out2, col.regions=brewer.pal(3, "Set2")) gstat/demo/lhs.R0000644000176200001440000000217215060550314013232 0ustar liggesuserslibrary(sp) library(gstat) # roughly follows the case presented in: # E.J. Pebesma and G.B.M. Heuvelink, 1999. Latin hypercube sampling # of Gaussian random fields. Technometrics 41 (4), pp. 303-312. data(meuse) data(meuse.grid) coordinates(meuse) = ~x+y gridded(meuse.grid) = ~x+y x <- variogram(log(zinc) ~ 1, meuse) v <- vgm(.5, "Sph", 800, nug = .1) v.fit = fit.variogram(x, model = v) plot(x, model = v.fit) n = 100 ok = krige(log(zinc)~1, meuse, meuse.grid, v.fit, nmax=40) sim = krige(log(zinc)~1, meuse, meuse.grid, v.fit, nsim = n, nmax=40) simo = t(apply(as.data.frame(sim)[1:n], 1, order)) # rank order nr = nrow(simo) # number of prediction locations simo = (simo - 1.0 + matrix(runif(n * nr), nr, n))/n summary(simo) # LHS on uniform [0,1] distribution; back to Gaussian: lhs = t(apply(cbind(ok$var1.pred, sqrt(ok$var1.var), simo), 1, function(x) qnorm(x[-(1:2)], x[1], x[2]))) sim2 = sim sim2@data = data.frame(lhs) spplot(sim2[1:10], main = 'lhs', col.regions=bpy.colors()) # verify that simulated and true mean/var are close: m = apply(lhs, 1, mean) v = apply(lhs, 1, var) summary(m - ok$var1.pred) summary(v - ok$var1.var) gstat/demo/localKrigeST.R0000644000176200001440000000311515060550314014765 0ustar liggesusers## FNN local prediction ######################## library(sp) library(spacetime) library(gstat) library(lattice) # create n space-time points over [0,1] x [0,1] x [Now, Now+some days] t0 = Sys.time() # now n = 1000 set.seed(13131) # fix outcomes x = runif(n) y = runif(n) t = t0 + 1e6 * runif(n) z = rnorm(n) stidf = STIDF(SpatialPoints(cbind(x,y)), sort(t), data.frame(z=z)) stplot(stidf, number=21, main="random spatio-temporal noise") # create a regular 20 x 20 x 10 grid of prediction locations: grd = as(SpatialGrid(GridTopology(c(0.025,0.025), c(.05, .05), c(20,20))), "SpatialPixels") tgrd = seq(min(t)+10000, max(t)-10000, length.out = 10) stf = STF(grd, tgrd) # define a variogram model sumMetricModel <- vgmST("sumMetric", space=vgm(1/6, "Sph", 0.25, 1/60), time =vgm(2/6, "Exp", 1e5, 1/60), joint=vgm(0.4, "Exp", 0.3, 0.1), stAni=1/1e6) attr(sumMetricModel, "temporal unit") <- "secs" dg <- data.frame(spacelag=rep(c(0.001,1:10)/10,6), timelag=rep(0:5*50e3, each=11)) wireframe(model~spacelag+timelag, variogramSurface(sumMetricModel, dist_grid = dg), scales=list(arrows=F), drape=T, col.regions=bpy.colors(), zlim=c(0,1.2), main="imposed sum-metric model") locKrig <- krigeST(z~1, stidf, stf, sumMetricModel, nmax=50, computeVar = T) stplot(locKrig[,,"var1.pred"], col.regions=bpy.colors(), scales=list(draw=T)) stplot(locKrig[,,"var1.var"], col.regions=bpy.colors(), scales=list(draw=T))gstat/demo/weight.R0000644000176200001440000000122315060550314013727 0ustar liggesuserskriging.weights = function(x, formula, newdata, model) { weighti = function(x, i, formula,...) { ret =rep(0,nrow(x)) ret[i]=1 x[[1]]=ret krige(formula = formula,locations = x,...) } ret = sapply(1:nrow(x), weighti, x=x, newdata=newdata[1,], model=model,formula=formula) ret = t(sapply(ret, as.data.frame)) unlist(ret[,3]) } # example, at first cell of meuse.grid: require(sp) require(gstat) data(meuse) data(meuse.grid) coordinates(meuse) = ~x+y coordinates(meuse.grid) = ~x+y meuse$wts = kriging.weights(meuse["zinc"], zinc~1, meuse.grid[1,], vgm(1, "Exp", 300)) summary(meuse$wts) spplot(meuse["wts"], col.regions=bpy.colors(), cuts=(0:10)/20) gstat/demo/gstat3D.R0000644000176200001440000000116415060550314013755 0ustar liggesusers# $Id: gstat3D.R,v 1.5 2007-02-23 13:34:07 edzer Exp $ # simple demo of 3D interpolation of 50 points with random normal values, # randomly located in the unit cube library(sp) library(gstat) n <- 50 data3D <- data.frame(x = runif(n), y = runif(n), z = runif(n), v = rnorm(n)) coordinates(data3D) = ~x+y+z range1D <- seq(from = 0, to = 1, length = 20) grid3D <- expand.grid(x = range1D, y = range1D, z = range1D) gridded(grid3D) = ~x+y+z res3D <- krige(formula = v ~ 1, data3D, grid3D, model = vgm(1, "Exp", .2)) library(lattice) levelplot(var1.pred ~ x + y | z, as.data.frame(res3D)) rm(n, data3D, range1D, grid3D, res3D) gstat/demo/lnsim.R0000644000176200001440000000332115060550314013563 0ustar liggesuserslibrary(sp) library(gstat) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y # NLKrige: non-linear kriging (e.g. log-normal kriging), simulation based. # arguments: # formula, data, newdata, vgm: see ?krige # trans: transformation and back-transformation function; # summarize: optional, summarize the simulations, see example below; # nmax, nsim: see ?krige # density: number of points to discretize each block PROVIDED BLOCK SIZES # ARE CONSTANT (note that newdata can also be SpatialPolygons -- if newdata is # a grid, cell size is used as block size) NLKrige = function(formula, data, newdata, vgm, trans = c(log,exp), summarize, nmax = 50, nsim = 100, density = 16, ...) { # transform target: target = as.character(as.list(formula)[[2]]) data[[target]] = trans[[1]](data[[target]]) # conditional simulation sample at finer grid: finegrid = spsample(newdata, n = density * length(newdata), type = "regular", offset = c(.5,.5)) sim = krige(formula, data, finegrid, vgm, nmax = nmax, nsim = nsim) # back transform ALL simulations: sim@data = trans[[2]](sim@data) # spatial aggregation of each simulation, taking block MEAN: aggr = aggregate(sim, newdata, mean) # aggregation to summary: if (!missing(summarize)) { ret = apply(aggr@data, 1, summarize, ...) if (is.matrix(ret)) aggr@data = data.frame(t(ret)) else aggr@data = data.frame(ret) } aggr } aggr = NLKrige(zinc~1, meuse, meuse.grid, vgm(.5, "Sph", 900, .1), nmax = 10, summarize = mean) spplot(aggr, main = "expected value of block means") aggr = NLKrige(zinc~1, meuse, meuse.grid, vgm(.5, "Sph", 900, .1), nmax = 10, summarize = quantile, probs = c(0.025, 0.975)) spplot(aggr, main = "95% CI for block means") gstat/demo/stkrige-prediction.R0000644000176200001440000001172615060550314016257 0ustar liggesusers########################################################### # note that demo(stkrige) needs to be run before this one # ########################################################### # libraries library(sp) library(spacetime) library(gstat) library(rgdal) animate <- FALSE # interpolation # build a grid over Germany gridDE <- SpatialGrid(GridTopology(DE_RB_2005@sp@bbox[,1]%/%10000*10000, c(10000,10000), cells.dim=ceiling(apply(DE_RB_2005@sp@bbox,1,diff)/10000))) proj4string(gridDE) <- CRS("+init=epsg:32632") fullgrid(gridDE) <- F ind <- over(gridDE, as(DE_NUTS1,"SpatialPolygons")) gridDE <- gridDE[!is.na(ind)] # back scale vgms: fitSepModel$space$range <- fitSepModel$space$range*1000 fitProdSumModel$space$range <- fitProdSumModel$space$range*1000 fitMetricModel$joint$range <- fitMetricModel$joint$range*1000 fitMetricModel$stAni <- fitMetricModel$stAni*1000 fitSimpleSumMetricModel$space$range <- fitSimpleSumMetricModel$space$range*1000 fitSimpleSumMetricModel$joint$range <- fitSimpleSumMetricModel$joint$range*1000 fitSimpleSumMetricModel$stAni <- fitSimpleSumMetricModel$stAni*1000 fitSumMetricModel$space$range <- fitSumMetricModel$space$range*1000 fitSumMetricModel$joint$range <- fitSumMetricModel$joint$range*1000 fitSumMetricModel$stAni <- fitSumMetricModel$stAni*1000 if(animate) { DE_pred <- STF(gridDE, DE_RB_2005@time) predMat <- matrix(NA,0,2) for (rd in 15:180) { # rd <- 15 predMat <- rbind(predMat, krigeST(PM10~1, data=DE_RB_2005[,rd+(-5:5)], # start: 12:24 newdata=DE_pred[,rd,drop=F], computeVar=T, fitSumMetricModel, # nmax=50, stAni=linStAni*1000/24/3600)@data) } DE_pred_winter <- DE_pred[,15:180] DE_pred_winter <- addAttrToGeom(DE_pred_winter, predMat) for(i in 1:length(DE_pred_winter@time)) { # i <- 1 pnt <- spplot(DE_pred_winter[,i], "var1.pred", col.regions=bpy.colors(160)[-(1:9)], scales=list(draw=F), at=c(-5,0:150), sp.layout = list(list("sp.polygons", DE_NUTS1, first=FALSE, col=gray(0.5)), list("sp.points", DE_RB_2005[,i+14], col=gray(0.25), pch=3, cex=.5)), main=as.character(index(DE_pred_winter[,i,drop=F]@time))) png(file=paste("vignettes/figures/animate/pred",i,".png", sep=""), width=6, height=6, "in", res=150) print(pnt) dev.off() } } DE_pred <- STF(gridDE, DE_RB_2005@time[smplDays]) tIDS <- unique(pmax(1,pmin(as.numeric(outer(-5:5, smplDays, "+")), 365))) sepPred <- krigeST(PM10~1, data=DE_RB_2005[,tIDS], newdata=DE_pred, fitSepModel, nmax=50, stAni=fitMetricModel$stAni/24/3600) psPred <- krigeST(PM10~1, data=DE_RB_2005[,tIDS], newdata=DE_pred, fitProdSumModel, nmax=50, stAni=fitMetricModel$stAni/24/3600) metPred <- krigeST(PM10~1, data=DE_RB_2005[,tIDS], newdata=DE_pred, fitMetricModel, nmax=50, stAni=fitMetricModel$stAni/24/3600) sumPred <- krigeST(PM10~1, data=DE_RB_2005[,tIDS], newdata=DE_pred, fitSumMetricModel, nmax=50, stAni=fitMetricModel$stAni/24/3600) smplSumPred <- krigeST(PM10~1, data=DE_RB_2005[,tIDS], # start: 12:24 newdata=DE_pred, fitSimpleSumMetricModel, nmax=50, stAni=fitMetricModel$stAni/24/3600) # pure spatial prediction pureSpPred <- matrix(NA, nrow=length(gridDE), length(smplDays)) col <- 1 for(i in smplDays) { # i <- 1 pureSpPred[,col] <- krige(PM10~1, as(DE_RB_2005, "STSDF")[,i], gridDE, model=spVgmMod, nmax=50)$var1.pred col <- col+1 } pureSpPred <- STFDF(gridDE, DE_RB_2005@time[smplDays], data.frame(var1.pred = as.numeric(pureSpPred))) DE_RB_2005 <- as(DE_RB_2005, "STFDF") if(paper) { stpl <- stplot(smplSumPred, col.regions=bpy.colors(120)[-(1:20)], scales=list(draw=F), main=NULL, at=0:70, # "spatio-temporal sum-metric model" sp.layout = list(list("sp.polygons", DE_NUTS1, first=FALSE, col=gray(0.5)), list("sp.points", DE_RB_2005@sp, col=gray(0.25), pch=3, cex=.5))) png(file="vignettes/figures/pred_daily_means_PM10.png", width=9, height=6, "in", res=150) print(stpl) dev.off() } else { stplot(pureSpPred, col.regions=bpy.colors, scales=list(draw=F), main="pure spatial daily prediction") stplot(sepPred, col.regions=bpy.colors(), scales=list(draw=F), main="spatio-temporal separable model") stplot(psPred, col.regions=bpy.colors, scales=list(draw=F), main="spatio-temporal product-sum model") stplot(metPred, col.regions=bpy.colors, scales=list(draw=F), main="spatio-temporal metric model") stplot(sumPred, col.regions=bpy.colors, scales=list(draw=F), main="spatio-temporal sum-metric model") stplot(smplSumPred, col.regions=bpy.colors, scales=list(draw=F), main="spatio-temporal simple sum-metric model") }gstat/demo/sic2004.R0000644000176200001440000000776015060550314013540 0ustar liggesusers# $Id: sic2004.R,v 1.4 2006-11-22 12:54:16 edzer Exp $ # compared to the original submission, two errors # were found; one was corrected (dayx~x -> dayx~1), the other not. # read csv files: #sic.pred = read.csv("SIC2004_out.csv", header=F) #names(sic.pred) = c("record", "x", "y") #input = read.csv("SIC2004_input.csv", header=F) #names(input) = c("record", "x", "y", "dayx") #joker = read.csv("SIC2004_joker.csv", header=F) #names(joker) = c("record", "x", "y", "dayx") library(sp) library(gstat) library(lattice) data(sic2004) # load directly from R data base input = sic.test[,1:4] names(input) = c("record", "x", "y", "dayx") joker = sic.test[,c(1,2,3,5)] names(joker) = c("record", "x", "y", "dayx") do.sic = function(sic.input, sic.output) { require(gstat) # calculate omnidirectional sample variogram, cutoff 500000, intervals 20000 sic.input = sic.input[sic.input$record != 838, ] v.sample = variogram(dayx~1, ~x+y, input, width=2e4, cutoff=5e5) # ^^^^^ the error: this should be sic.input # ^ this error has been corrected # initial spherical model for fit: nug=100, p.sill=400,range=4.5e5 initial.model = vgm(400, "Sph", 450000, 100) # fit the nugget, sill and range to the sample variogram: v.fitted = fit.variogram(v.sample, initial.model, fit.method = 2) # function returns the output from the call to krige(): krige(dayx~1, ~x+y, sic.input, sic.output, model = v.fitted, nmax = 125) } # do the spatial interpolations: output = do.sic(input, sic.pred) joker.output = do.sic(joker, sic.pred) # write csv files: #write.table(output, "sic2004_output.csv", # sep=",", col.names=FALSE, row.names=FALSE) #write.table(joker.output, "sic2004_joker_output.csv", # sep=",", col.names=FALSE, row.names=FALSE) # calculate output: # read csv files: sic.stats = function(obs, pred) { print("observed:") x = obs print(c(min=min(x), max=max(x), mean=mean(x), median=median(x), stddev=sqrt(var(x)))) print("predicted:") x = pred print(c(min=min(x), max=max(x), mean=mean(x), median=median(x), stddev=sqrt(var(x)))) print("error:") x = pred - obs print(c(mae=mean(abs(x)), me=mean(x), corr=cor(pred,obs), rmse=sqrt(mean(x^2)))) } options(digits=4) print("input data first") sic.stats(sic.test[,4], output$var1.pred) print("joker with error variogram") sic.stats(sic.test[,4], joker.output$var1.pred) ################## do.sic = function(sic.input, sic.output) { require(gstat) v.sample = variogram(dayx~1, ~x+y, input, width=2e4, cutoff=5e5) initial.model = vgm(400, "Sph", 450000, 100) v.fitted = fit.variogram(v.sample, initial.model, fit.method = 2) krige(dayx~1, ~x+y, sic.input, sic.output, model = v.fitted, nmax = 125) } # do the spatial interpolations on a grid: grid1 = do.sic(input, sic.grid) grid2 = do.sic(joker, sic.grid) grid1$v2 = grid2$var1.pred grid1$v2.var = grid2$var1.var grid1$var1.pred[grid1$var1.pred>200] = 205 # mask larger values! grid1$v2[grid1$v2>200] = 205 # mask larger values! greys = c(255, 247, 240, 228, 217, 203, 189, 169, 150, 132, 115, 99, 82, 60, 37, 0) panel.sic = function(...){ panel.levelplot(...) lpoints(sic.train$x, sic.train$y, pch=22, cex=.5, col=1) lpoints(sic.pred$x, sic.pred$y, pch="+", cex=1, col=1) } cp1 = contourplot(z~x+y|name, map.to.lev(grid1,z=c(3,5), ns=c("data set 1","data set 2")), asp="iso", col.regions=rgb(greys/255,greys/255,greys/255), at=50+(0:16)*10,region=TRUE,labels=FALSE, xlab = "", ylab = "",scales=list(draw=F),panel=panel.sic) cp2 = contourplot(sqrt(z)~x+y|name, map.to.lev(grid1,z=4, ns="standard error"), asp="iso",scales=list(draw=F), col.regions=rgb(greys/255,greys/255,greys/255), region=TRUE,labels=FALSE, xlab = "", ylab = "", panel=panel.sic) print(cp1, c(0,0,0.625,1), more=T) print(cp2, c(0.625,0,1,1), more=F) wireframe(var1.pred~x+y,grid2,asp=c(diff(range(grid2$y))/diff(range(grid2$x)),0.5), xlab="x",ylab="y",zlab="z",drape=T, col.regions=gray(sqrt(seq(from=1.0, to=0.0, length=100)))) gstat/demo/block.R0000644000176200001440000000254015060550314013535 0ustar liggesusers# $Id: block.R,v 1.5 2006-02-10 19:05:02 edzer Exp $ library(sp) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y vgm.fit = fit.variogram(variogram(zinc~1, meuse), vgm(1, "Sph", 800, 1)) bl0 = krige(zinc~1, meuse, meuse.grid, model = vgm.fit, block = c(0,0)) bl1 = krige(zinc~1, meuse, meuse.grid, model = vgm.fit, block = c(40,40)) bl2 = krige(zinc~1, meuse, meuse.grid, model = vgm.fit,block = c(100,100)) bl3 = krige(zinc~1, meuse, meuse.grid, model = vgm.fit,block = c(400,400)) bl0$"block=0x0" = bl0$var1.pred bl0$"block=40x40" = bl1$var1.pred bl0$"block=100x100" = bl2$var1.pred bl0$"block=400x400" = bl3$var1.pred plt1 = spplot(bl0, 3:6, layout=c(4,1), col.regions=bpy.colors(), main = "kriging predictions") bl0$"block=0x0" = bl0$var1.var bl0$"block=40x40" = bl1$var1.var bl0$"block=100x100" = bl2$var1.var bl0$"block=400x400" = bl3$var1.var plt2 = spplot(bl0, 3:6, layout=c(4,1), col.regions=bpy.colors(), main = "kriging standard errors") print(plt1, split = c(1, 1, 1, 2), more = T) print(plt2, split = c(1, 2, 1, 2), more = F) # block krige the full area: bl = krige(zinc~1, meuse, newdata = SpatialPoints(data.frame(x=0,y=0)), model = vgm.fit, block = coordinates(meuse.grid)) bl # block kriging standard error: sqrt(bl$var1.var) # classical statistical standard error of mean: sqrt(var(meuse$zinc)/155) gstat/demo/stkrige-crossvalidation.R0000644000176200001440000002456515060550314017330 0ustar liggesusers######################################################## # note that demo(stkrige) and demo(stkrige-prediction) # # need to be run before this one # ######################################################## ## cross-validation crossStat <- function(var1, var2="PM10", STxDF=DE_RB_2005, digits=NA) { diff <- STxDF[,,var1,drop=F]@data[[1]] - STxDF[,,var2,drop=F]@data[[1]] RMSE <- sqrt(mean(diff^2)) MAE <- mean(abs(diff)) ME <- mean(diff) COR <- cor(STxDF[,,var1,drop=F]@data[[1]], STxDF[,,var2,drop=F]@data[[1]]) res <- c(RMSE, MAE, ME, COR) names(res) <- c("RMSE", "MAE", "ME", "COR") if(is.na(digits)) return(res) else return(round(res, digits)) } # purely spatial: DE_RB_2005 <- as(DE_RB_2005, "STSDF") pureSp <- NULL for(i in 1:365) { # i <- 1 pureSp <- c(pureSp, krige.cv(PM10~1,DE_RB_2005[,i,"PM10"], model=spVgmMod, nmax=10)$var1.pred) } DE_RB_2005@data$pureSp10Nghbr <- pureSp pureSp <- NULL for(i in 1:365) { # i <- 1 pureSp <- c(pureSp, krige.cv(PM10~1,DE_RB_2005[,i,"PM10"],model=spVgmMod,nmax=50)$var1.pred) } DE_RB_2005@data$pureSp50Nghbr <- pureSp ## spatio-temporal LOOCV target <- as(DE_RB_2005[,,"PM10"],"STFDF") ## seprable model # 10 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitSepModel, nmax=10, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$sepModel10Nghbr <- as.vector(res)[!is.na(as.vector(res))] # 50 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitSepModel, nmax=50, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$sepModel50Nghbr <- as.vector(res)[!is.na(as.vector(res))] ## product-sum model # 10 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitProdSumModel, nmax=10, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$psModel10Nghbr <- as.vector(res)[!is.na(as.vector(res))] # 50 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitProdSumModel, nmax=50, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$psModel50Nghbr <- as.vector(res)[!is.na(as.vector(res))] ## metric model # 10 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitMetricModel, nmax=10, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$metricModel10Nghbr <- as.vector(res)[!is.na(as.vector(res))] # 50 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitMetricModel, nmax=50, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$metricModel50Nghbr <- as.vector(res)[!is.na(as.vector(res))] ## sum-metric model # 10 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitSumMetricModel, nmax=10, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$sumMetricModel10Nghbr <- as.vector(res)[!is.na(as.vector(res))] # 50 neighbours res <- array(NA, c(length(DE_RB_2005@sp), 365,2)) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 38 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"],] <- as.matrix(krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitSumMetricModel, nmax=50, computeVar=T, stAni=linStAni*1000/24/3600)@data[,c("var1.pred","var1.var")]) } DE_RB_2005@data$sumMetricModel50Nghbr <- as.vector(res[,,1])[!is.na(target@data)] DE_RB_2005@data$sumMetricModel50NghbrVar <- as.vector(res[,,2])[!is.na(target@data)] DE_RB_2005@data$sumMetricModel50Nghbr95u <- apply(DE_RB_2005@data, 1, function(x) { qnorm(0.975, x["sumMetricModel50Nghbr"], sqrt(x["sumMetricModel50NghbrVar"])) }) DE_RB_2005@data$sumMetricModel50Nghbr95l <- apply(DE_RB_2005@data, 1, function(x) { qnorm(0.025, x["sumMetricModel50Nghbr"], sqrt(x["sumMetricModel50NghbrVar"])) }) ## simple sum-metric model # 10 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitSimpleSumMetricModel, nmax=10, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$simpleSumMetricModel10Nghbr <- as.vector(res)[!is.na(as.vector(res))] # 50 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitSimpleSumMetricModel, nmax=50, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$simpleSumMetricModel50Nghbr <- as.vector(res)[!is.na(as.vector(res))] ### # cross-stats rbind( crossStat("pureSp10Nghbr", digits=2), crossStat("pureSp50Nghbr", digits=2), crossStat("sepModel10Nghbr", digits=2), crossStat("sepModel50Nghbr", digits=2), crossStat("psModel10Nghbr", digits=2), crossStat("psModel50Nghbr", digits=2), crossStat("metricModel10Nghbr", digits=2), crossStat("metricModel50Nghbr", digits=2), crossStat("sumMetricModel10Nghbr", digits=2), crossStat("sumMetricModel50Nghbr", digits=2)) if(paper) { texRow <- function(x) { paste(paste(x,collapse=" & ")," \\\\ \n") } cat(apply(round(rbind(crossStat("pureSp10Nghbr"), crossStat("sepModel10Nghbr"), crossStat("psModel10Nghbr"), crossStat("metricModel10Nghbr"), crossStat("sumMetricModel10Nghbr"), crossStat("simpleSumMetricModel50Nghbr"), crossStat("pureSp50Nghbr"), crossStat("sepModel50Nghbr"), crossStat("psModel50Nghbr"), crossStat("metricModel50Nghbr"), crossStat("sumMetricModel50Nghbr"), crossStat("simpleSumMetricModel50Nghbr") ), 2),1,texRow)) loc <- 38 # sample(68,1) # 15 tw <- "2005-01-15/2005-04-15" png("vignettes/figures/singleStationTimeSeries.png", 9, 4, "in", bg="white", res = 149) plot(DE_RB_2005[loc,tw][,"sumMetricModel50Nghbr"], main=paste("Location", DE_RB_2005@sp@data$station_european_code[loc]), ylim=c(0,70)) points(DE_RB_2005[loc,tw][,"PM10"], type="l", col="darkgreen", lty=1) points(DE_RB_2005[loc,tw][,"sumMetricModel50Nghbr95u"], type="l", col="darkgrey", lty=2) points(DE_RB_2005[loc,tw][,"sumMetricModel50Nghbr95l"], type="l", col="darkgrey", lty=2) legend("topright",legend = c("observed","sum-metric","95 % prediction band"), lty=c(1,1,2), col=c("darkgreen", "black", "darkgrey") ) dev.off() DE_RB_2005@data$diffPM10 <- DE_RB_2005@data$sumMetricModel50Nghbr - DE_RB_2005@data$PM10 stpl <- stplot(as(DE_RB_2005[,smplDays, "diffPM10"],"STFDF"), col.regions=bpy.colors(5), sp.layout = list("sp.polygons", DE_NUTS1), scales=list(draw=F), key.space="right", colorkey=T, cuts=c(-25,-15,-5,5,15,25), main=NULL) #expression(paste("daily mean ","PM"[10]," concentration"))) png("vignettes/figures/diffs_daily_means_PM10.png", width=9, height=6, "in", res=150) print(stpl) dev.off() }gstat/vignettes/0000755000176200001440000000000015162303120013375 5ustar liggesusersgstat/vignettes/ifgi-logo_int.pdf0000644000176200001440000002421515060550314016630 0ustar liggesusers%PDF-1.4 % 4 0 obj << /Length 37 /Filter /FlateDecode >> stream x+2T0BC]C]\.}\C|@._I endstream endobj 3 0 obj << /Type /Page /Contents 4 0 R /Resources 2 0 R /MediaBox [0 0 240 86] /Parent 5 0 R >> endobj 1 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./ifgi-logos-crop.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 6 0 R /BBox [0 0 254 182] /Resources << /XObject << /Im1 7 0 R >>/ProcSet [ /PDF ] >> /Length 38 /Filter /FlateDecode >> stream x+2T0BC]#K ajj˥km  endstream endobj 6 0 obj << /Producer (pdfTeX-1.40.3) /Creator (TeX) /CreationDate (D:20080508123050+02'00') /ModDate (D:20080508123050+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 \(Web2C 7.5.6\) kpathsea version 3.5.6) >> endobj 7 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./ifgi-logos.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8 0 R /BBox [ 0 0 595 842] /Resources << /ProcSet [/PDF/Text] /ExtGState << /R13 9 0 R /R12 10 0 R /R7 11 0 R >> /Font << /R8 12 0 R /R10 13 0 R >> >> /Length 14 0 R /Filter /FlateDecode >> stream xXn7)xkD,A H$ڻlU"1G#c_v+\譅 X3of#?-*#jt(j!°){FT6:yǭtluxD=[X4כoY2ڤ ߓ1ARkEbmݾ2-Kjqu(bME< ѱKؒ`vxd_ۭYw_m޷n}5 :@Vk;|; Y\+mŒ \' EU;}P ZWtN~5$)7YͽDxUp#lȩvT#mڢ:QiO7?۶9?'vVNi)>wHv"frFh{28 7 XQv㪶%H 3˾ =}.R%`s*Q*%hnܛ;kv s'*JFU0Cfgôa`QX8ycx#&9xU ]19rp!˅BE8?^(c$G)2 QeWY5(C" #SZ5brr!(& _l =N7\e=_H JID+l#'DM#]-}OIIZMq/w9 )P<P FByfҔ_6SCF@[ar4uZXmNм hm_؉c** rlz<c|P] f:20m5ȹ D,ܓ#tNT+F^ML|uhєJt=Nt']5:t1'ܝȶo5MHAW 灃WO^eХ) PxsIj"꫿(/KBq³f"c\~Kҟ RM +iIY]zcдnL7` v"iNFaw,f톝œfgGƹ Mv@cu xCb^ U ly),x 3%E䙣M SUP ZEUj2$A `>)8!<.U5@&%Qƒ+W`.k1"A4 7&ŋ$2/+VUJɪNX؀(7A-$ endstream endobj 8 0 obj << /Producer (GPL Ghostscript SVN PRE-RELEASE 8.61) /CreationDate (D:20080508100429Z) /ModDate (D:20080508100429Z) >> endobj 9 0 obj << /Type /ExtGState /op true >> endobj 10 0 obj << /Type /ExtGState /op false >> endobj 11 0 obj << /Type /ExtGState /TR /Identity /OPM 1 /op true >> endobj 12 0 obj << /BaseFont /KRQJGX#2BDIN-Bold /FontDescriptor 15 0 R /Type /Font /FirstChar 32 /LastChar 117 /Widths [ 232 0 0 0 0 0 0 0 0 0 0 0 0 426 285 0 0 543 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 659 0 0 648 0 305 0 0 575 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 534 0 0 0 548 342 555 0 275 0 0 0 0 573 543 0 0 0 501 0 573] /Encoding /MacRomanEncoding /Subtype /Type1 >> endobj 13 0 obj << /BaseFont /YSWVLP#2BDIN-Regular /FontDescriptor 16 0 R /Type /Font /FirstChar 32 /LastChar 167 /Widths [ 249 0 0 0 0 0 0 0 0 0 0 0 264 426 270 0 522 522 0 0 522 522 522 0 0 0 297 0 0 0 0 0 0 611 668 0 673 600 0 650 0 282 0 0 573 816 0 0 630 0 0 588 548 683 546 0 0 0 0 0 0 0 0 0 0 526 545 490 545 530 314 543 562 253 0 536 297 879 562 530 545 0 421 496 332 562 447 724 0 447 459 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 526 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 530 0 0 0 0 562 0 0 0 0 0 0 0 556] /Encoding /MacRomanEncoding /Subtype /Type1 >> endobj 14 0 obj 1906 endobj 15 0 obj << /Type /FontDescriptor /FontName /KRQJGX#2BDIN-Bold /FontBBox [ 0 -197 608 720] /Flags 4 /Ascent 720 /CapHeight 720 /Descent -197 /ItalicAngle 0 /StemV 91 /MissingWidth 1000 /CharSet (/D/G/I/L/a/e/f/g/hyphen/i/n/o/one/period/s/space/u) /FontFile3 17 0 R >> endobj 16 0 obj << /Type /FontDescriptor /FontName /YSWVLP#2BDIN-Regular /FontBBox [ 0 -226 794 719] /Flags 4 /Ascent 719 /CapHeight 719 /Descent -226 /ItalicAngle 0 /StemV 119 /MissingWidth 1000 /CharSet (/A/B/D/E/G/I/L/M/P/S/T/U/V/a/adieresis/b/c/colon/comma/d/e/f/five/four/g/germandbls/h/hyphen/i/k/l/m/n/o/odieresis/one/p/period/r/s/six/space/t/u/udieresis/v/w/y/z/zero) /FontFile3 18 0 R >> endobj 17 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1282 >> stream x= PTU ܫ^cݥ0- %N!XwXTtMǍD?A4fISTPވS i&`ҙ|]:8uWfsf͙1MAaJ9Õ̓f3Bg&K'3Os|1{}aS. ц yzQkh)?;3Ck(FZD[~Ūmyfz6˒eg>+l2 /̈,c~ F ^`%d."$$NV(7%ђ8r f2}E1ņwSmWJ}龎ۨa} y)^}ج?)Rh2=tT% 8]oȍPaƩig5/bP`TC9m -asL cuGLGaζi-{<XWf [.ƊhjGZxY 0"+A>s7h5}Yۣ6XŁJC UT籯YVlm;g4m)پ+'_s>.rO*(b,;&xzi*Wj`(ٝ/SExGbCt+HƒG`epX R=:ϵ8Q^f  iSJK}u" }(tc BG3[N:N \5by^:xnvP"wE9]=VJ{E_'3Y)ssQ U|Cm@gڢ9;ʹ|LI][BH'%K.\uKn}rQ'{QY7T=YVvrmy&2\gm e9mlk8W=h[s) +`%9yժ/ck܄0\{~o> stream xVyTT0=ƥyS .ɱ5D("Ae}`AM@$h6 "[E@A E n%jIR7i@.==yo~] 26Btw+Yq8[II.æRlj||٥pmO##'z%a)V X& ˰tNLHd!!52%!4561!42*125&rg2>6,%4%cߣAM nkv'F$E\#f}jwφ8ߝ~ll+-|j%%uY(yh'Z6#gZ -@ ?d~&  7-G H9 3$G,4A3Q!ZJCh6ꐘIH %mFKvH.iB<'_Ȏʺe-L\`=fafpV [ml`pӧ5G k9xILV}1'o=}pΘpI3 هnE.;W#j$Rc KRc ^|2q)܏?=UXs l7Zsdrzkϖv+>\[j B (tjH';eS\D|*]Z_}K&Sm|zf>t| Wé2Uq ̝+˔r1kD RB(]!7adn45PD C<;3i;:wH/N. rN s=::55.;Ԫ揮^ܛjR}Jg JgûbٝR]WՅ+T5ɭpn/n9y(--wxQ: >i̷Su%ׄ/ ܟzؖ܅[Kkj [ب6wV+Nf<d͘=(Mv{a ~@J(I1גWRT[z<>[ʃ9k-5Ug޸/9ɛLJXL/>ddg؆4|߳m05E|â3u j-4OxH7@ʨ63xzP:(܂+4+_mE B}  BhջO q4EMI .O\/{oTžZt!?I]Cg`Mٌ.|ts.x6F -էw> YTT˒ŋifq㶿]sOvT3\שM\_[_|@b*aBPP4Ի) ph a6XnN>]aN-=V }T!W ^+?PGw'_D$l Wc5.o n?Љ\[{Cc[y~5>(3?&Z)9(dZ7r.H| ࡺ֎^|Zd 6%\w.,r"|I/A43 K32CucoL+WRer⣫+7a?<q|{Ͷ#.ͣ Mܝ ov UKccG̼B I6?aYnΪEq8{oc<;K˵Wނx$ڮm>bW)~{km:+Z8 _V9lΜCkQ9+vg)7 zO0ӸE͛E#0r$GjR+HxʬB>Ie_,!:\ΤB(|K<x1Av޼ b>%s_a/a LmcL((7Q6k 5L3p!ca?Ue~~N)tf!*MW}N"t;X2-6G;)dKߡlk⫸S};3~{P5P@ :;ɫؤSv qӏ7qDf@6Gir4gFR?}#}խc:tOcz4M87pm~9*$pTL?hkI0 gPlfHA ':h~i$a5CU?XJ!9 M#gcR[qqT˾Pߵǻ u5?_Oep_J^-NE,> /ProcSet [ /PDF ] >> endobj 5 0 obj << /Type /Pages /Count 1 /Kids [3 0 R] >> endobj 19 0 obj << /Type /Catalog /Pages 5 0 R >> endobj 20 0 obj << /Producer (pdfTeX-1.40.3) /Creator (TeX) /CreationDate (D:20080508123111+02'00') /ModDate (D:20080508123111+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) >> endobj xref 0 21 0000000000 65535 f 0000000234 00000 n 0000009362 00000 n 0000000131 00000 n 0000000015 00000 n 0000009427 00000 n 0000000544 00000 n 0000000816 00000 n 0000003058 00000 n 0000003191 00000 n 0000003238 00000 n 0000003287 00000 n 0000003356 00000 n 0000003731 00000 n 0000004275 00000 n 0000004296 00000 n 0000004571 00000 n 0000004968 00000 n 0000006341 00000 n 0000009484 00000 n 0000009534 00000 n trailer << /Size 21 /Root 19 0 R /Info 20 0 R /ID [ ] >> startxref 9805 %%EOF gstat/vignettes/prs.Rnw0000644000176200001440000002004515060550314014700 0ustar liggesusers%% Document started, Sat Jul 3 19:30:52 CEST 2004, my 37th birthday, %% while being stuck for 24 hours at Philadelphia airport, on my way %% back from the joint TIES/Accuracy 2004 symposium in Portland, ME. %% Continued, Oct 28, during the Apmosphere mid-term review. Oh, shame. % \VignetteIndexEntry{ The pairwise relative semivariogram } \documentclass[a4paper]{article} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \usepackage{alltt} \newcommand{\code}[1]{{\tt #1}} \SweaveOpts{echo=TRUE} \title{The pairwise relative semivariogram} \author{ \includegraphics[width=.4\columnwidth]{ifgi-logo_int}\\ \href{mailto:edzer.pebesma@uni-muenster.de}{Edzer Pebesma} } \date{\small Aug 29, 2011 } \begin{document} \maketitle \section{Introduction} The general relative variogram (Deutsch and Journel, 1997) is defined as $$ \gamma(h) = \frac{1}{2N_h} \sum_{i=1}^{N_h} \left(\frac{2(Z(s_i)-Z(s_i+h))}{Z(s_i)+Z(s_i+h)}\right)^2. $$ It is claimed to reveal spatial structure (correlation) better when data are skewed and/or clustered. The \code{cluster.dat} data set used in this vignette, from the GSLIB distribution\footnote{F77 source code for Linux, downloaded Aug 28, 2011 from \code{http://www.gslib.com/}}, seems to confirm this. From version 1.02 on, R package \code{gstat} provides computation of the {\em pairwise relative semivariogram}. The following code provides an example and verification of the computation using direct R code and using the GSLIB program \code{gamv}. The following code imports the \code{cluster.dat} data from GSLIB, which has been converted to have a single-line header containing column names, packaged with the R gstat package, and converts it into a \code{SpatialPointsDataFrame} object: <<>>= library(gstat) cluster = read.table(system.file("external/cluster.txt", package="gstat"), header = TRUE) summary(cluster) library(sp) coordinates(cluster) = ~X+Y @ The following commands specify a sequence of lag boundaries that correspond to the GSLIB conventions, and compute a regular variogram using these boundaries: <<>>= bnd = c(0,2.5,7.5,12.5,17.5,22.5,27.5,32.5,37.5,42.5,47.5,52.5) variogram(Primary~1, cluster, boundaries = bnd) @ To compute the relative pairwise variogram, the logical argument \code{PR} ({\em pairwise relative}) needs to be set to \code{TRUE}: <<>>= variogram(Primary~1, cluster, boundaries=bnd, PR = TRUE) @ Figure \ref{fig:vgm} shows the two variograms, as plots, side by side \begin{figure} <>= pl1 = plot(variogram(Primary~1, cluster, boundaries=bnd, PR = FALSE)) pl2 = plot(variogram(Primary~1, cluster, boundaries=bnd, PR = TRUE)) print(pl1, split = c(1,1,2,1), more = TRUE) print(pl2, split = c(2,1,2,1), more = FALSE) @ \caption{Regular variogram (left) and pairwise relative variogram (right) for the GSLIB data set \code{cluster.dat}.} \label{fig:vgm} \end{figure} \section{Verification with plain R code} The following R code reproduces the relative pairwise semivariogram values for the first three lags, i.e. 0-2.5, 2.5-7.5 and 7.5-12.5. <<>>= z = cluster$Primary d = spDists(cluster) zd = outer(z, z, "-") zs = outer(z, z, "+") pr = (2 * zd / zs )^2 prv = as.vector(pr) dv = as.vector(d) mean(prv[dv > 0 & dv < 2.5])/2 mean(prv[dv > 2.5 & dv < 7.5])/2 mean(prv[dv > 7.5 & dv < 12.5])/2 @ \section{Verification with GSLIB} In a verification with the GSLIB (Deutsch and Journel, 1997) code of \code{gamv}, the following file was used: \begin{alltt} Parameters for GAMV ******************* START OF PARAMETERS: ../data/cluster.dat \\file with data 1 2 0 \\ columns for X, Y, Z coordinates 1 3 \\ number of varables,column numbers -1.0e21 1.0e21 \\ trimming limits gamv.out \\file for variogram output 10 \\number of lags 5.0 \\lag separation distance 2.5 \\lag tolerance 1 \\number of directions 0.0 90.0 50.0 0.0 90.0 50.0 \\azm,atol,bandh,dip,dtol,bandv 0 \\standardize sills? (0=no, 1=yes) 2 \\number of variograms 1 1 1 \\tail var., head var., variogram type 1 1 6 \\tail var., head var., variogram type \end{alltt} Running this program with these parameters gave the following output: \begin{alltt} Semivariogram tail:Primary head:Primary direction 1 1 .000 .00000 280 4.35043 4.35043 2 1.528 58.07709 298 8.62309 8.62309 3 5.473 54.09188 1248 5.41315 5.41315 4 10.151 48.85144 1978 4.42758 4.42758 5 15.112 40.08909 2498 4.25680 4.25680 6 20.033 42.45081 2296 3.74311 3.74311 7 25.020 48.60365 2734 4.09575 4.09575 8 29.996 46.88879 2622 4.15950 4.15950 9 34.907 44.36890 2170 3.77190 3.77190 10 39.876 47.34666 1808 4.54173 4.54173 11 44.717 38.72725 1222 5.15251 5.15251 12 49.387 30.67908 438 4.56539 4.56539 Pairwise Relative tail:Primary head:Primary direction 1 1 .000 .00000 280 4.35043 4.35043 2 1.528 .36084 298 8.62309 8.62309 3 5.473 .63071 1248 5.41315 5.41315 4 10.151 .83764 1978 4.42758 4.42758 5 15.112 .77691 2498 4.25680 4.25680 6 20.033 .87746 2296 3.74311 3.74311 7 25.020 .89610 2734 4.09575 4.09575 8 29.996 .90023 2622 4.15950 4.15950 9 34.907 .96043 2170 3.77190 3.77190 10 39.876 .90554 1808 4.54173 4.54173 11 44.717 .75545 1222 5.15251 5.15251 12 49.387 .82268 438 4.56539 4.56539 \end{alltt} As can be seen, the values in the third column (semivariogram for the first section, pairwise relative semivariogram for the second) correspond to the output generated by \code{variogram} of package \code{gstat}. Two differences with respect to the gstat output are: \begin{itemize} \item for the first lag with distance zero, GSLIB reports that the semivariance value is zero based on 280 point pairs; \item the number of point pairs in GSLIB is double the number reported by gstat. \end{itemize} The ground for these differences seems that the GSLIB \code{gamv} uses a single routine for computing variograms as well as cross variograms and cross covariances. For cross variograms or covariograms, considering two variables $Z_a$ and $Z_b$ each having $N$ observations, the $N^2$ point pairs $Z_a(s_i),Z_b(s_i+h)$ and $Z_a(s_i+h),Z_b(s_i)$ need to be evaluated, and all contribute information. For direct (non-cross) variograms or covariograms, $Z_a=Z_b$ and the $N^2$ pairs considered contain the $N$ trivial pairs $(Z(s_i)-Z(s_i))^2=0$, which contribute no information, as well as all duplicate pairs, i.e. in addition to $(Z(s_i)-Z(s_i+h))^2$, the identical pair $(Z(s_i+h)-Z(s_i))^2$ is also considered. This leads to correct variogram value estimates, but incorrect unique point pair numbers. (Data set \code{cluster} contains $N=140$ observations.) In contrast, \code{gstat} considers (and reports) only the number of unique pairs for each lag. \section*{References} \begin{itemize} \item Deutsch, C.V., A.G. Journel, 1997. GSLIB: Geostatistical Software Library and User's Guide, second edition. Oxford University Press. \end{itemize} \end{document} gstat/vignettes/figures/0000755000176200001440000000000015060550314015047 5ustar liggesusersgstat/vignettes/figures/vgmVsMetricDist.png0000644000176200001440000003672215060550314020661 0ustar liggesusersPNG  IHDRFX6PLTE.:Rf3R3s:f:\R\s\fff::3::::\R:f:s::::ff:f3f:f\fffffff3::ff.:s̐\fRfې寶̶ۀ.ې:۶fRfsېN5 pHYs&? IDATxkc8vXN2FMY)u8NetthޑQH$*qAВZEY(d}|I >˦oUVYK[5,|whuG;,Uk-+uٌ,|EyqjYx)(l3gua)CM9J]6! u/] )(EOmtc=C;J]>[wk]Qj.̬QuisQU]"詍fF=ץnS3([5xM-;\ k*gF\Ѩk5LD4 0s! ,&ոW(_|Hyǝ}ePjY%"Q>{GfHbL.hW5,wh`n@CuOjg/SkYvD4 СT3qg]ee.u58S5FYx(h 4 p8F@NQ'(h 4 OqMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj4@"8NJI q@PxBIW4 %A\(q@PxBIW4?⯽g򭪪?rai?y[?)o$g!ujʮ{ =zl{8&jg*hj'FF.7gٺK]W'uRҜH:tÜC{Մ$FfC7jH[bKj4ꑬ*ZZnX)ё뤤9t9ШGH5^i`^F#IIs"s?V}ojQ^wumMW!9]?ä^O>,>B} `CbqpvCSvѸ ӥq8hOwt7Bhc*XmB9bhT½om~k{i}LЩ"L֨&:(Yg&xbQ3|39v5qt+FquM7V֣t±pb AM,(hT½T673wg [| Wk0Nn^o>b2ʱFr×< OͯF7{h`]4n~Q 1.4N}h?4 ]U΅*po#. ]o]O_+MHfܜFChfAvp>6c%gFqMMkNGCu8ѡ_4Yt.TѨw6A7\r||'nҎqrsǫ㆘f}~g~{GZ0.Jb vBӭ;gcHC~&TѨ?Kukq6f)&'݊jHqi.џV3L\b vB⵿gt}gqE}wuhT]ŔnVdIG4::~Fj=КXը.PX?Uc HvѤFG9k2:b%F9i-vW37}otht|ht.~Йhht|F<pu"'G8ѹOohTJIM//cM5roT}%n7:Ǜ=?t>ۻ<ѾӮM3BSHvюZ3<7ڦ;_~F9i-?]ݛNjzdt6A`jߴFE4z9:=SLB&f S'#x|8NktaP+4*%͉kUFtSFѨ}=hq99Prr8Sf'uv1gF73Cf"zHw&'45тg4*ωޅDƟg_&vǯNnHup5*ȿ?:S.t3.&6`]4n]JS4*@͂?w\ =:)iN$a1}{ظ"'J4zuRҜH:t,2=w\=.&*Dpr4OM Q( >޿TI,@\h^/ wqѷ'_I,A\hza ·h]zjif)(kpNv\j$z( p%h4ơo/+( p@HzzEp.Ev=@SLJfZh(9P7-xԗMF(A8A"yf6=ńFA aĺ0}zga(G(Bwؐ;<-=ʄF jՌwL#F(A8! _zr 4 %A8CRmS%sf@PCjQ=}5~  ThzrBIT^E]囯Q4 %A8Mp^]ABIBu+M(&')o;4|4d>:' /DGCfy!f0<|{uT \($/B7]>b82p(CTk0:L7I2Y@7'FA ¡05:$]x($P,BǝEpuS\ޜ41}M?t=Q@A R6oý׋+z[C2Q Q3ǩͨ^T>;3A4ilL(C_kF,&JhSa}+x~Dx!B!׋sJݭr4 J+@ (Jj[nh˱rDžO)qK)IQpc;?7IO0r[_oz*Ii#tj,ujO8r" .BL?T0聤(8A3zPjS('xGfh\*>W%Q< .9c9ejt1kKr8ѦiԻGG蟵SW$h8dw@E߲dnGϫ4ףօ{Aaz 5ѣeofZ6H5A 4 =r:-X>&aH5^:MQr'?NKtA0qѩ4zk疆=.*uFz^uFFa3uZFhW<@uQQޥ5귍>(f^h>Fw2Ŕ h&QaکYmgSQ–iѷjXj,@ μo^7< hYj3gM/-7{B49Bi2ys_l=T0舵kyǃF? gs'Ɯu/MA]~vO?,fՙz) L@Xc}kkQO/u&- 嫇oz4DDH.7K[{46LSD$Sorl_fĺ (r\ճuzDOf4àYFa#20譽P.34ތFٚ$ (lbLSښ3WAlhvU)kϾ.gNރݬik4ibY3dԨz |062hmpbM^鿰՞- ܟ_̊ &ˠY!hcׯb85zotӥ(v#[#z< 0si.%rI~ pJom1yz'kp?;<)|>S/phoZ|35F^aF\ˑ ^͌Gzs>{&<&Lt-`YkjGD3Nc5zlֱrExun-bSLuN+8r=Qf;T>\dltfaP}msi q589E~1834_i5ؘfy4:BaЉ=zH~Y-rV  Ѧ4Oh"f?nhxzxxSL#֨ i>I8Іa׌ÓEq]gv2(^a4j. 릓v:a?R~^ѨRdَ%D͙P& 5.瓖蜥4ϙr(flrFeNe)g?c${JkU;.K;O9ԳF科nՃEG-g,&ǔY~1)Lkߨڧ.F?$7yQ͐hl*~ofrY^/h[iO&5InpF2֨۽ rK*xw(/[>[s&i,For,4轸I$ר5Өq +E1CAb'ѫuoi=wCnFO؈6:hH$륟odeQ3Ϧ ٓM#A)~CƢ. ȥɚ}劼`šR%0z^l`om`? ׃Fiim5 Uh.("Z[(}j/>Xi)֬T"]SL;Izq4Qk*cSÎr%?9j5J$O[!UN"㔏daA"$ Х7%iiV($8rz<ٚ>ƤnI鵪RBX[#FZ,AGj ֤y)h g_6|FvvID!DFL9ٯYXZF!'?Ť $QW?f_/Ʀ=DpJ-Aʼܜu5EU&~M\ޒgiI%)ڞwqjm7Ʀ=BL~];>Eڅ7+o4M&`k}޸Wj\U;{LU5O=NoPjq][ ojY5k7oӏBRHU,-R}c]"׫)iTB[R^/7w9VYdO"B@-IDATҨI)=PDQa>C6"Jݻ|Lǵx=,W۬67E}lVߪ>w3iTLXn1󪨚)YUUݛϗ&+FjwB"]m1<%Σ#> :vF)jTtm"0g8Ixo4MOȭ%kfialHBcv*JR^\LgJ}hfmKDV6񧷩dkHP6 eb$#Qdӏ~%~6o*&ʀ5j3'Tg]nd=zlk#v9m*\~nvu܀Y8U7\gL.E^-'Þh6)2;(ڿ2uel֨.&\@QQL?w;k5ܩ5*mOyv)m *Y3J{r[0!=^Կ^N;DP#݈A?V \ǂVf9ɤ7GXh{'t/7zrzja*b U qV9Xoڷr4݊-)ةU%F3qoMhL Y5Tͼzb bĭ0"mސ9 ۚ$ofW!xښD#nEǎ6cAK{C\u -w#Ǿ^7_ٶy }&Z(H"^fqn"{t7{iTjBEx㒂}G_{϶=y,(5%D }}LU{i ĭ4_oҨZR4e3U.||cZ4I12#) 1 wQ.-)w15lQ!joBm@S??4⿽G%IiǟL1y'ӐFu^*HPjIvh iuo//oE:gl|괌:&Piuڗxk̬{ϥ? ~\G]?׎1[t,3}#N0X5I 5s9v2Viuk3%-ùU|pjq*d0F?;v&=9R!+8ʱNÓ$iG+ub5øH}@/BV)95*W$`鋘9zrET8V7ߋ\ũ Q޵ǖZgVL5j-ܟ.K>hIR )lOPbƣjH:؃h[Iw4UX[{Btty#uUblKsU_UkdƓIFճg7$Lrf-RASW8\ ǫQt{R]$QHK4"Io׀͟3H@_[N$kMN`6h'FoU$8[j9F [ի;8>FjިHm.VK,WG^w^ӣFk)nքiIb*X~~_źEOSLSD5MprFΣ?4G:Vď\-]l"Em].ˇuޘ3W"T/wj3n&FNjz'ڀ[f4zGB=X:g̦4,RӨ-]н֮5Rj(U=lij"׍NN ߕ_)c#P=6@4F-tpOrĮӈ f Thj2FіFo朷e3O#+fXS|8,UHx[A3z4q4b1.GX+d &8Ƨkt J͕F m! .5T7ȺZ ehdHFJ_Jqf%?DNo<4\]j=͕I_Y+8h4\u>('8]Ѩ:*Bi,[6V'^?5͠HuFɸmGjh5ev'=]'ƪ4EmI9=ըK 8ީ,{ E2[ĬQ5ۗD?à(Uq jcw;ĮQ7;{^?$+uՋkbc㎈ѝ4S lWRTQl4'uSM+Qh6*-U.El G5@U4&q^ŧǨ˕-)( hl׌۠j|^iWP*ZBݗ)&Q4o4ڿ9#czPM3W=-w$}2#-aO=tME۩K$[D@.:Mɡw!4 vLҢ^ѯ{Rd6OulO$=DuSר|9Z=}$U&W@ط8/ vd'tWg5F2~{YM:@UT@ЧB8mᔱñwI$jcS OeM)J*8Hk4H,x,W}\1uű8Z#Fv@w3f^轠*5JFE4il=鉃q_>x[ݱ o/F},w*lS5qmo.Fizx<r+^רH:b?}!BRmB.W̛d޼#>*Ƥѩ1/+z꣠QCWN&0״{ek/h:jR_W,EMߑt-fjTN4 t, 'PӸ㋤l KYb(Nٽ4LirM3 ɆK[2%4y:/Y07}z}I6XW1閴F?(UvK]Js*?SkT+ ߷9S$VtRL`e鐿䦚 3 j{%SmJAbhkzx)RӬҾ2T4R,Th5) Ͷ4ћRS2ZR,=_h5+^ jRUJ)ȱʳUYǖ5J7XeRkH2\֨n=a[?ߴ8d!ԊTޠI>aekF7tU[?KuRT=)!ϕ6*ՐWU:m~>j}~7hT~}:MS)5#Ut>ihTTn)6CƇG:g߄AiZ6ՌVˉѹ37FΠ#IiZEYSjVʼn1lrb%=D]=~N]A'b_/JkčiJ%4arCu>m{pׇ]tRl"`ܤH4&wn.dT4u)Yf_ё2ң6icQUqx|F_:}5'ݰƚZ)~c4 wL^ȨFWD<juìIf:IL/i&DޏȧBkcHΨ5m^-px#y~n,է}qJm^My ~X IL#/ŋ-IS5: FdS7"tW~i42YaD=G>Չ_`h{n"/9+DsGȦ6k{7 zmy)TFQx[U.#TqJMʽSkՎOuGԪ|~oIdS5/e4 ~9]hlǥgE[-eȥ.qkvwYjlڻRE҈"/M6U>"hUu[8uk9#qiS([Dȥ*!5z[&a:~$DXG٢V@O65ivo>W13JɈ4bcE[E[ͤ_\jLj1⩤I><4#" (ir%ɠ \*LW5zU-oN>rFΊXr%zȡL*Jo/ʈ_>;<0<|r"YQJ!`Vnv>27~nzK\ү=&RTH2,ڊ"ZdS4ZtV D;Ds<,­`Vj/T#&ium?;FKѾR""\A4 q{@ <Qi+@O1M` <F6w+M` <jvo7 <~!hJQ( wyㇿjOuiV>.45uG;,Uk+q|<T){PO\>~MC$_հ%ђFj6÷bì|<ԥ(]-j (h 4 p8F@NQ'(h 4 p8F@NQ'(h 4 p8F@NQ'($ͭjzkAy($ QH[O͗u~|A4 IF!ff]]ߏF',8hsw'ɠQǵuh~Ⱥ7I5z~LžFp.hNb5jCk51S?1unAp>N_+ufZ7zѬ%5퓲bhO1 񟆇ǖ~Gf©_d=yx ٠QA=<^_JZƏʸ5mF(^L(xB`(QH4 qW,.&QH4 p8F@NQ'(h 4 p8F@NQ'(h 4 p8F2 IENDB`gstat/vignettes/figures/pred_daily_means_PM10.png0000644000176200001440000024167615060550314021631 0ustar liggesusersPNG  IHDRFZo_PLTE.:Rf3s:\f(.::::::::@@@@LR^dffffjv|3:.̐ \fRs呶̶'+2ۀ.ې:6:BFMQY]ehltx|tpldaRYUMIfF>:s2.'ې# H`Z9^ pHYs&? IDATxu(v\?⊹`$Ob rWV|oIěw?:8uNUWUW >Ғ`sG[l ho`-n[lŢb-Xbct-bQln[,-bE1[l(6Fb-[lŢb-Xbct-bQln[,-bE1[l(6Fb-[lŢb-Xbct-bQln[,-bE1[l(6Fb-[lŢb-Xbct-bQln[,->g?Okct-x%jvtct-x룿)K'WI6FbٟTrtct-xǟ+@tIbct-x;e.Jb9G[l;f|t1zE:bN&1͇ .F7F=bN&s[vre'[rrх?|6F;:#':gsrA_~v+4hY5;>AaL_[PےQ=7!ҽ=Q?/Oγ#>O蛝ɑ_c/OݓtMhaY7;>ADt#?H_r1 w*0ݻF~>DX|'N|pTP|1ic͎O;QWhӴ:;/`4oˉ)VN?xNt❆?fm&VZEd߈cv׬d緪Kł{t~wYW̎Oh*~{~AKs7ԓ(`qƁgǎeSN~p&x whgm&Gf7lmk*<;0dSM'|  zHowўىv1f'hcT_f{xN/`vv2[ݑ῾M'|  Okfv|6FQ4+(P|z;;=kCһwMǿcV͎OhSν1kv$6*G0ٙO?Pcrװ+~2MGicV͎Oh:boWs(|#:@vfMhx?ѵٙ]x7;ݓ#<&z |]8{v;Mز-;ؒ{[lŎ'>0])^x Pw#ewLr\|f$kvNl9qlÃm:SvNmN8>X,h#h=x o߾U[Uw_#:Be'dTI1>U"/w_#Vڱ|C1`?}n˯ɠZ`Tj[^~XQՂ,'c O'A׈Uv3Q1\Bo2Ԕ^~X!$A:WqNNF5au Q'yvQ.vk~_Yuh(NwZѳI;tx`*G5hϾ6:C(2=N*9qhQݱ?쬲cr4G~-( -Dqx[;ڦb(7F OoͮpssgFG3W,d}fcWqwQszǚeT[3LMgc4)Q(dt[3=E輣莒MΎS)dtGi{{XQ(dtGwUS(TtW )dtQՎ0t4c!;۱эt]l*St{(TP\ ;n\=Fy)at7KlөxwFҎ1 ^ 7A0j_/ऒi߫ wve+7Fۦ6TbKuO͎uꔜ.o:,L"mßڍ_3 >S+eǴYFtvVޱwjA[gv[ſbv2$+UpM'(QN/cexqwv xUr Sم5忼nv*Eww7f~j1}z*zkCvVޱ jKO/i:q"OfX2)&fXv2*:40nF5`Tw0 Yy^Q3,jݦ:x{UZѕs5uފ˜cT#~v;;]o(%gD? 볳5SŨtN5 h:f 0VOs}]؎Ɛ3h0f"ͶM4_[qKҊXQ?4,Z(){uN ` سiK03WBFO|<z;:[(ETݞ{BWG)GXPnFnϸ"5/UϤ] $h~קױ}Agg4ƔrE硸UQקۦӬUp\x!+:Oz|\NLvQvuh<p6|Q3Z5N ^ <@(;}dg>=Adgjt"1?C9avj4-Xo“Ĩ٦Sƭyicjlf/}sq9fd.3Sa%`̖6] 囻{vk2:qwo泣zqٱMgg}Fy¦όLS>{m:nҌdCe1SI^ӱѱ5;qֶ= W=Yx>mJ g}O.{hp,0_>O.zu3,=`e\q+͕ 7y2Tx>tɱ?Y5{k:Ž.]*ņgڱpvɟ\"F۲1GPDEF}Q-ݔ0!ԗne?&kEAPq,Kώf2:[cb^SNOhJMu<;,z*QKvBFhujci;h"(K%N)~Urs8)MѽBaߧi<j>0 Xv|}PIu7)~Uۉ􌼵=qs@e2Z'1jesI7F#2QUZD#FOJvB8j ,I*aMըhI3FVzsL9e)z3C[-;(Wjl3󊞜)j;Xڌgl鎵1яw(0J9X*F!;h'&5{gT?P(٩n:}n^TnTg8|F S¨Sv+n)a 3gJRhFXln7B_Ps#K/_NRv`iذVn3Y:m(# n~&2iםكrXl9I,%F ίl[=OHt$XXy!rz}SfSrO)uù1EGF+pEZGc88T2:$foqEm`7:AfT6;(bF=GkCatH0߱4ZG1;Wn-9FFFx"V,C)'\_xK農3W%o^?i"r{٩3:0۱xT2 6;ϰ1Zj2c+dwEJTS쨱QV;9ER/HT#/d4c50Jo:pkzMu<3 /YD޹/eT 3;tnfFMsYySF;FvDP}e}C6*hҠ_vlٱC#dƀxLbΨjJT.9foGAGbnh.9IAA5P\*M۱,%Rv;G|`R96 V6љ2aQ+ڎ^7F+SPou F?0-7{C7Fʔd'Fq-9@%,-9cQxzQU>;hwNy3| v#Ĩ8\J1Z(0ԁjz8dF Rv|CFQM'dTe!2*f'`T^F!ZA[5JlmAq—gCяECRrtn]gŋ0AFeY_eT0Z9SzL8d!+F%FOҧcTβ˫YFRFac4n}zɤF C0V9ZN.<@mr@Q!fT%2Kd.Vd^W(::D^wꏡ0h+ Ӆs7C`Taޔ=y ~=0Auޞ)K ^fG}AʎkY3Bm{psg U#^QxX";j7CP@k폩eGO@cien/D#۱qw3N}~9Žf~sBGy(" >XÇpUU1:1͎w2;gtr4fTFSx]LaY#'LQA϶ҒFkv,I3:h`s`wQVJ0jQU Nf1`|g=gLR IDATSČ~쾲Q99ffY~eQEcT?I=FMV᎕g FA%o&MgUUSb>uM60J<Ǩ)H¡2j3J1"ljj5 j4N'K.9QsNa3s/Gf:᎕etcsL/3 :wQf@-ŷ÷/]]87%۱O1J.d4 eþ7o]|oHڢ/ ʧ ?XEPzP}?LUꨞpΙnJ<2(xsOҙIN4hh{fFCw0K'sbKgZ<rg)AyvsٹJerRF<*JSb;t$;f|j\Q`B!uV%F'EwhUv3C40BJ3JQc2:7bRѨSߍQ F=f y3>& )FQ ][bFWd9j2e>[F?|[ȨzVϖQ,;Ah =֌~nHalj^O!L՗X¹ѧO;0+3芌SjT`t)F-xZјd0F}21zY/^1TQ1$WbT%R(Q3M\e5Q/;Poh2U©" mW%'ڱNSF;yFO 8F/(量IFM5jT)fT-]gx\`4ܹ}mQS Ε1Aed0jgTh-A0Fͺ"FUAj([ҟQ8  ?PҎUƨڱ.=gT%\v1,%'j Os P_P Q;KL3ʹxx}nP Av"9ޚJ 4-ώ˫R!.xBD7.QAf d*;hG {CC\4 sh^~0AcFb1GNeߚ^/n@՟S+h]2`TeQ)`#gv̨C_ԌL1:iFo⩳SF?( m-dt uHg mZP(c3 ;fY:uF.`cTN,ZPz#QuApzE'Fu\ƊƌavҘڐQXQ;h'!gT+҄#بUt=Fݫ79^cqꅱըKϨ"vH\w`OAFKQjX4b4uhFCS(F]#55(xը4`ԝdFݺOkdt3Ꚏf#Gqѕ^X.;hi5jޡQ O5xflv6F5Ķ5:F+0 5cmGjFǢO8X(к | mhKvf=-c i8ROFAjb}jt,c1j劮ĨΎ˹CEKq;]hG!:;"-rA>ݸ( jgG-F~#9{,M%.,!FwZ1vmm|C4%F5q )F z=KQ*Bq1z&QS5mQ=U_ Wڢ]~MFӊٱqQ0{Q+'^ȹ*F2 C1{èN=H"nQu21 E$kQ DFu 2٩g4!BFذ8iQ[?jvRFZ 5ӧU 2 H%(Ey)6 C 7kQx.C]f{*QӛciMv܃m6'N2⟇V%A ]b4M=RP^x҆h$Ȩ@g.ޱRR,dԑqcq b/{9u ;kީF:QӟGGM0(9'i SMv>|gy2 So 3=ƠbԒYFtQQQ<T1>eTס.- Ϩ3kkiBbjֈQԦJR2q#0jUTgg_B)gf0(UknjIHЧ'Vnʎ/ g43룣?w'sOnNM5qQQtTdtj7X3Z7SO5XN}z?QrFc7'kFmuipFy (91 եRR3J甝Qx X>3 告?{w{ͨVQ78xO03(F zl0*W;nTrPp4QVah %ݒ:T3zrW5ݳl5J{Icա;=_ s+ *p\VP7:󍒡>)s\pQhÁ&;Y73)k9?8GqRb\]1o\3޽ށ]hJ_MSkŨ^n#0WP(>'ַow؏ﶽd-d6_. ~+ɓizੋӂ1ǟcM_rtg>Qęm`e|=FaёQUZF0ژ1zN ($zd -br6=2 '1j7zcɓ0B7q;du(h(-tGfMF:QU;])m1=1 f<ͨ9* K c#7F/"F_IFɓ1l҆]~,d9;2 ""fmR(&5fS.`T9'dT%G1]C ̋QS>aT0V^< -,c_dGDeFU5 O1?Ǒ [;OӝbʪQcTA*bT5  %Nc`i+PvVet,fԇ笃T0.%geFQ,;3 e>/bTRvvhJG?cK%k7E zrʌ-'A2+I?eRo,*j4fTO1y Y:62u?]Pg4Ng-=qvZt #hheE*} T7p-ǎ.:AqrF|ic_c퉄ޙu#r~>=)>0 t4ɨ@Zqz+z5Fsف1^B_PJ{<)Bsats3|*~=fQQ Q*0,F1;@rd'"F>|ictb[G11zӓQ  lJBtk9?hT1 N˥<~]6F{2J٩cT٦ ]8Qp{bM12*m%=A Xх٩aԻI?FqXTuz**0ꆍ#z0:teuR&ŒͺPǨwy>lJ,a?WctYv%>;UAgg gtYv=@z3F(egtQr%>;1&2e%gt43-QACߕQ:ib5,;NveBFjtYv*UKЯSNJQ4piRT}!ElyP7%o\h&OUr4uT:v X/"6 R9$ "9哥gӪk|,7@Uj AҋemQ}&3S5bU#MZ=%F];d^~j-|J׈w~䊖߿a{1J*HSGFˇ bF61Jax=-oF_.FBFd(Fg}ۑ*;dW~=/j4Vѧ!M0-0޲xÃ͓t:>wA/o/fGFSvn9[\P%Yf=%Tu> zt?A|(i0*I|JmSvNFTM=ɵƦlL\3#)F f0 oèTד}ч,%ٹEJ2ZնgRB1HrF[ڊ& / A$(g03|btԛmW ]^PRT x:047E[kOlhPtJs&D7uM0*qT cR?rL*ɶێFJfa0 ]at-cU%`TgS̃b9ZhxGf3bgQFKgtbR)g45TXtvϨARFbDvU5ڋQ0EJh;gheӹh/FS]QcTTQW7KvfvPV6}1 uF2*g!05hgTkt((,tje",b͎ -[Sg:0!X:66Zʌ08t.cȷΔQICd( L=a3]1juϑbOZj<'2+ƅ(gQe4KVvfT?EFQ(ufx"e<<8}6x5>MчөgQDQ [01 (%`ԉ ppUFt]D2gcQׇRnj4`Nk8F?bty5gYFӝ^.f)>^0Q=[ߣ =ctUs ^Nr' Qb*v1SHfR1x͡:%)YQhM,,~3FZ sfDc&;KGD-`1*ՠ.hSU;3MgQHj'T 2ؼMըn|C*;G|QF ڕBFF'HCF^o5%1 #F'HCF~a]yI/+oXFbFsM\ѯ eSH!SeGر-eR|F1$҅3<(x@Al*>Ѫb4ӧ.GJNѸl&nمs2/kt^^ v~׌ˎa=1 >iHOVR=_kFy9+F Fm 6 :2KqtQխOB_ñc~cQP(,F$Ք(8F}S 2Gaa5 nhQ?56Jc4ݩfPX@S[:gb9Ϩ6J(& ctԬ\yF N=:*qy%O+J-6٩/d4a(N1jÞa'sR] TQ)զj2\ ^KCFLZ ?5}v޺e3Mv$*sZM9aI:hR#NWKth(֬od1Jw,? Wf Qd ~+ٳOvNMG*xқY=P\ǂZF=G0,Fx{O>F HM 3 dThJO2>Ǩ:Ύ\pu3z;FcEj!iF!(5QE`|Ѯ&G*O?r_Qj{ 3E/!W0 қPy3F!˨{ Qt~T;ܡ9F!Ǩm:)]~VFEGNz^g꟧}gf'bT(2 ȖjG3J+a'FCn\G=^}Q$ѫEpghԳ0Uu!`F? O3~Q<(ͬ{1*9Z_Ɓf9FDZQef:/dGSQUm|P7fDy(2zsN23o4ޟˌhgTp~l49FDy 1*9*N+71Oҗ :;Cd$d6M(\_;J1O2z_dNqhizo:p&Vf@:)F,BKx)Ȏ &$vI{69t((k:B 2O0cť$0'@?0* IDATR9+n5gC9:5M/zFw(o:^%ٜ憎թ/e49S_oh>;!` !~JFFϋ}ىQg69c# !WjAyj⫀+7 ړQV2O0xe]nh1'gL0gƨk:ը0ഀ+ P~" s}3g zK?v0 >. 劶2 +x3fQoѨ$OcjT8J1*գL70&F7F+SfUu}9KnTH~SO=WJgEgA1?6*d4I(̎$q[lf,"XaFnߔ-AIв|xCBF <1z9(?Qu|"Fn~(`4ߡQaAN}ܧmX`D>Ǩv.gvͨĨ&C9/V` 'eӭ3:=Djƴv`});FF+ SL)FM24 ~S:=h30tWj`^<˞,F`Wmp-U͎էX. M1ZjU RW-gKPG,EcL KұQ_XQFPqhc L|`'eP R6)txF' KN]0EE%_c u3%L"eFaޮhX&%3F{3 3*U9D}1{clo`pg)X0u140:3:^1P[癊cTTS%C1)ըN /0:3*")jxD4dѐQoDQ}jtƨ__IՌ{LR*BAwDb&' u-EGMWiQ2Fmr.ā Xu*G!OX͎ͨEjH@iQc}uM5H_rH;1Z<6'3^3*t EBcI39#^Wߚcj5C8+0Z<6ԍQ Sv21wk'@([" zH\Pڧ]'RE {OԩOqDOzu*U^!~ <:Y:R*ZM]fQwSlv=/5hjbFT ʟ=#=-5 v }ģR4$&S(څтg{c3ЗQb|3*Lg.2 d(8JӌRvQPQoGARr8ӗQbQ_'ṥcB]lQ7-؅Q5(dsQ 9Fjف2Q^h\V}2+F3*gQt5ЗQa}'K;1P(E 8`P ET%^, -e4t2d,fN}Li=p/U;3af; 1%oy$o)H}KOŘ]3 ݵ;ϔbt6~DʎY#F4Ũ ujN@~oP*[Z:ţtL2%l)8Y(e/r* ONV BBMc\f F/0t+c//-VUu'{j]s͛ΌYRF7Pͨ3TWOԗQ<%QΨY֗QZ_hG2ጂe<-FjFa¨0:xM _fT/+5yi3jy0:,%KvdtZF<(L[ ՇcTףE)G/XT3jzbN܅сh_fT}J3o'K0vg4ge59FotQnH;,3TwFM=7F/ƳŽh4ϴj3j*,0NhFi~c 6F_,,PP{b:ZŨ gn)Ξީgh9ф+v(tUocH7@JQL)j?yFU-#-u<Ծ]| Z׌PzDg< NyZTbASNs!\Wu^òt>LO),F աmxC V@ok9V )'"¨Qc*tҀ/ 2(^so(u-{7=FXQZQhg4"DэѮR=lFȀeƨԅ(H7F v[їh{5v%Fp=2=Fjt~1dcg5z?FתF1FF0Z0Iݪѣ@sΎITYMOR$(=B38vX5K|\1(/HY*1R?Tk5o };_~ XJmg{EO%3F6!m -7\VUh!Sy=F=zD>>b 0IFR9]Q}L569jt)`\sЌјQ|Ж0g..}:XF(mvUkKuJA32_>F1V hE_Y3ЇQJͧWfԊ̓ F ;0!0Q( nQ(e@! Ռ2 ՄՌ½f[\(RF`T5g?3 Qo1U'8PF_/ftBm^e2ʎAM /q 2OMRhpjsj yA  QڄmKKp]00c (%FV:r^B @f2o^qk;Qh@dt$O&E~WYi WN %Hp(:(RfQL>("bFA`TW2ވ&-cT6x9F]-)Fph9BDX≛ӌFըfјљj1[ږzpT`ԎjH)UF3k jyw%%EҌTW#3|`&}®uMF9.\ҙQ%)V`u1^`TFFu5 2 b,h\`_NhѮz}t?3*j*yXQfю(vA{!F0(]d^5H}0 u}ʳQ(cԛ/`4{qBhsV0TƫKtSZ)b \]U%W .eFeG{0:uQx;(-bB!PЩ1uQtL^5`Tj^`Q0&hFVfdG1u mFըB42S2ʗ>a\1x%uRzygv@h}IMpcb›m}V׷FF/=Q`X:x3+ j;uޚ&]u/#9: O0!N=5QŨdCIfvRiD>$rw08jPfeuEQQ\S5( X/W1)Kq=;]ٽ60׈~1!0z1(nWɨw`EobeYWiFo e3Ima4tTbNߓP'Ql $F@3I`1z%'` X>̔eh 6eC2OЕWQ(gԵR{<UgBc>GR) j^#ktѨLW'ѩ[ Q9+Ӆ*gyQӱ:NnRΙ>Ҍ*D9Q! zXE~>3N5J To[)XEO+6:2:yF!=Lhxj)+]g]v1;zk&b׍ (.uQw}zFgLBF);vIF!V4dT ztd4z(K(A0)0N\LޞA'Ϥv #$QAq<IA1M4 f9tqɹ6uQOx޺|<|N1.NPhӧ./S;7,um6iXX'w -TG0QxEе||3==-b=O:3:=dxY_/aԽ4VQx7%ȨSXE}PzU_Պ>ө.at}è06څQՓä".Ҍ>}X5==61H6x8Yhtp+$vU3 9E[(:A3cT#:ѩd%ъ5yQ)9zP}0t44[N=R~1z8hĨVt'+M.U ѤKdF/Ռ^M?hVvFM^b4temQ3SߵmRtQwF Rt I1GF2p)&Q=\YiF[5?U^kN=j0(`hFѷfu'ٞIN=2G`t((שS1:3BHQkDi:bBH\,-|ш/x)$G734,1*Sn)h~l4XπKPRuRDly"f~~2Fŧm.ZzFsߨn6N Q+8t(8O`TPaui Ռh ZՌo1ZW1Z,c5jFS z2:]ƨ)0s~ShrFm1:5H bԿ0*((F!ϨU6io~#(~ [~Ōf<>fXdfEJ_ CѹgX K=5o3/(a=FbbFFݸk :J2]8f4qW RF;iDӇrFy> ث/F{2FQuT t}ѦjPcUB9j ~R;(˫ўr7FgW bS)RIlHs[FĨREAN綾-;\>S cԫG9{ON}OHJ":Iz{ ftz􂧓DΊ]7 ∸)Fm7ʊ<%hp4YAozcd%F,ZBF/QW1JF.d-` eݻ$uPh~Y(5 h5F}h)3 hƒeըT60jC1:3:QN6F FҌȌ51^Q(%gQySQQUbvaT);3*eg.3 vF홧Ĩ%gЊNb4A)OΨsF}OlM aO* *<4w fC,9=)b5qFn-.;_8LXǍ#SENcT5 Gh&3jIF?(DA3 K*3&;ӾҲ RN\s9٥yIBR*sexRy^b_fM;@@6XEhx4(^NI(M e؅_f(1z^Ũ% FUFJ(0dg%FF@}bEi FmvQ,fԙ)3B>-({9(%g%F ŲN}L.}({r<3Uh~:;ƨaTKQs:dtF:2 ڋ63 0sT=`ѝ1 %( w_ 2JkI+;&F5D!8Y(mZ3ᗌQha3*?(?/IQL4]h^}-̨FΌSƨՔIGs~ Z(Q ZQou[oFTuji~-Bv:1:QTS2ʒӗцZ+&/pke ZZL+!a&@??oq ;fOt>"2Cvy,-CJ5rȎLpa,K#(` +[TcւxػõXqo71jĿ`hN̨BF`*FnetRBJQ^0*Vt)iCic4E;R!F(f.Mc;A[hv[5KjQ"ڟweS_ʎylY(}1:#jKDvQܐ=?Mv1FSߊbv p?[~H6ydEJoU cώACi58P[*0*;yKU cIvJ!k3K)7e4HLp_<6*f4ZB+$QS1FU?8T`4zn O"nVE;0:T1j ZXQT#/k?T1juqjuYUWF/ ctbrD0\Pi1kώ1 ¦w|1:40JhQڍS(+EfʾC=z0 =hUWcTrтr4;uj@j4(?̨Q~Hc^` t~ j4 QTrFurQtj4h`F?|,(]AW &Q:ZʨٱxU7Fhs3sZcgJ/,ԟvfUdP(⺀ьMzP+3JM-F(W7"F ?.gCv,}`[@|jTHRA.,'>Ǧp_5M2Js^0IQh CO10>1?oT/gpTF_,`dNQuj+GjT=bb&;xkQe.FUHm(`f4_ҩ6FU"F3SSK"K:(RFWh3è0Q<3/at)cvǚcEF-ԇh0?q=њxN7](k9F2F˪ѪdS`r53:2^[Q{Mf;p.1z(eT(F\QLw3qk: 0*_Dd4F$u uQEtH2;Ϲ%3.Z/%0z׉^$9 ϏHǂ3W[:;.ӣi%$ 755&wF$_PdE5{Kp?=vNnjnɎ>0:36/2: ~W2j_)dt`zu١B3:=dUFdؤRzzɭMaHؕ_uQhhKrD8EǧvdzJ7tQ0*d&yFA5-b>;iFO [Y(Yëjцf4ٍg=zXQq5T!1Z K1߁Q3^-b:;N/02 p2J_}:Gʼn$Ψї0ڐjX3jFQrUZGѦ윀h4$RT5JDgjTWmzߚa_ dtB4fZ-fg)>jԑ9 yFql4dFyrfg'vFAg}JqigPʌj{9FUBFw3q2 c3U1 5}_39SVŨTl؍ܴ%FSu@ =f.Qdӏؤ,F頥9FW(0jj\嗮_e'&R¦ѷĨNhjtnb+pEeԈå#uꃓe.?iȨqT=k:1}_pl4(N}NH1 O}F/Kry.k05Qcu1zQ¨8q5vSK/M1Mڱ 4DaSo#(QhQLn:f\T`l4(e'өQ=p0/V藴cR4PRt(fK}4F H=^- g|FyaiQU:;܅+Ǖ(;؎u~tk :}J8ufgW?cCu8 jUUDsEԏjTfa$]b@w{ G&KuT/9"`kf)h`qSqjJWQ=9x}_ݗ|5fF!ї>]âz5NKeӝ{hېM:;{f!^@93E=F1 cku&F~Igl01 ;mQzan XF!\3;on0:DLt1VFDQ L|F(5>FPvDTTѦj u I1;軀Q=9I(DM zpWpQ]RjU3_͊L0meT|_س b_U_wrܾ'1c+ZV>-F'GF_:Fժ+։ƒkbtyn);8/hH=Qb1jFAsF);PP! }&;.A!~[$vl;QAjkҮMw,]1D }ʨT~5+Y^cԭj{(^Aep-&ict;#K/ `4FQ+3Pv0z/؛QcASLB5~(fg9F=ըeTذ ˟Cd®o5X* o P5Q3:b{!B8f{eM{X8>^R-¨f+@<#V`.N!&;ԤZUGF0j^-w>94]ώ nFUi`MQ:TG6&3>ZRzFg*et}g'tgQK3gc)gQ֩/fT}<`-Qw$ѮYĨVQZFºN=/SԎB2z7}`To `ìI i8^qO΢Wɠu0:nml?G0OϛӮíF݁53(FQK/;Y&"|])×쀵!)TQ\v*|cj#E{/TU辻vܼ(`w,CgYFa48n)#b SZ,sg5+Y09; 풵<2=ѱBFF (8*>(h˿hF?c)mag,`5ؽTcѮigwbʫљxibgr0kF505;FgP(jFifE G zYQ)f;]~1J51A5}JEQU+99ם,7qs/ *1_ɼ\%0ʿmx(Y4d?>v0(w#t}3I 13_ $"=y LN=N3}jFk{}cÎNGMvQ7T(عSXׇ(a.q]ݏQ? <ĥYUGth:fTW7FQ=c$>Q<-ǎYGct8uM3GF7FgfF1(Û١Q`Gv5K[rWs͌b(=^0: /<F!b;6voO*U~wW+#t6}uM1*YJo^ #1`e4N} 1$=P.MDECAb h1eYA_$#Gy`$=.ۤ5]j뽋y.DOiՎ =42ڥXQ=^jGF{Ԡ-Fћ}U(sMgmF!\Tp:=Ĩ.G(?bFa70g!t|{ 4FcFU8hԣ:hCF,xzl4ft_hݾ/ "d3m &ol<;aQQ`ITF`T>'H<.s4tcwZt_oYNGyvrn?ϥ(:A߫fS|3L_x78Z&)A:۠c10S=NAAO.rtݾv/enet.cT;*1 ;;`_v@gg(aFGc-enhw 3:2=]|Uo䀌P(%ѡQ039ѡ甝`kv=bTm樓&ѷN}sxITŌ&:B;gӉz\v3FMg1jeW icwvN}` b183av2z#wzT82:.fdFYBFݑMk1=9vcA 4mA׌rt<oR})FyF.ѵ3** 5)-`U+",o0*g3+gb_61;慣b'wg22'= ykr\.MجgNʎ3W<X0 7~žIx>+IR>LA{WFմp=0KқGT&N_Ρ?Eoɦ7A~qN0Owtg'0* 0 z,ƌ>16幤9ʡfQqNr>Π++.Q*!QOvsT5SwQV;2 3 ñsz2:ui7e17ڶٌ"QwhWFОvs;Do(Y (.dt:3'}z/WQQ0B:-9+k4߸0e3e~VQ0q.2F6@>ӌ0V×:ք'=kgӾM0>:>Q9d j1;`ؤըY(*IIFX(:ghųނn0_2FA0 aFScNc]_('sFF08Ȅvbtbv(ae(뵕}` 1HXFU_X2FkQ9wTaڜѥQmVL9勝qFvx\ Se((w'>:V/StNΘfp;u+e 6><)3VQbNLU8 OfrK} [av? |TPL~IXFCP]-,"X2e_'eG~&("R#Wb cMPg37рQ=n*,Z1*=ٝ(s23Qt4(xo9(/l95sTb~Fur&2 (`aT+&THQ20n]}.֘2J~ְa3:FQ1CYFǘf-Q|b|inX´j73z3[()L~} AF!Q/՟Wg0ʣ[b 匪TtW7Q3Z?ZMq5#HGQRyY(!G6N4_NўǰQ+AږڡN敥ՌTgg-ӍzS?I}-&@-2ʆe٤7? wJл>d+k*l[NʶD]^3N >pX|FQtdGu Wc9(h3FEa'2;S-F`&4}]чQpA 1 MtQ5UcFEbjԳf4Qk;L߄섫QO3 ,cfQ<ؔ(f=Q0QgMeTNUNa|F4VޏE\F(liFcDQY~Y(hkFՍRF2J]5ŃMYb5Fߖ2Z-h`Sv>Q=Ek-liFchFlFN9>fGp6;*RFT2Jܚj[a}fti],ⱠŅ0:6pʂG@qh!ۓ~jq+N3_O&BQig(MgL1SC3Z,=Y+uuGzwq'2&$LqE0)kOc*tBvvш!FG0Z訙 :Fч0Z(3$Qe<^l1J8q< 0l'-BGwx1 aF06}cѯ}8Ek;Fݷ]u:р`Mx6gcvoNnרy"ȨRc{iӨun DME3Zݨ{U}4l\QgSeљђd1j7Fgv׉0qDUj F'(ZhmvvQ ẂvZW0C=wVtǨHz^%}?p:C'XbT<@G68R OeҖLY7`םQQ߇g1 h}v tFa6F=#gg^FiSeą7lGͩ(!ZM|ӰPlf'(bZF(vvI&'Ex f*;;# 6}L0v e#)9o1Pf isF G3d9 'j3 }3GgbȎR6e'Sh95N2jh_a8Àlyw08 As`iP8ؖ>0O볣?w7WJ;(E[CGau=,"MFM9KdT-O$$4is>)]? ep}=!90:b4:SAXd]\ď]֟ь>Ȩ\*2˨tt&FMv f 5,@hz)݆([^Oc3bXhzi5;`OetF} FeF3f>dwQ߂Q;;Fd*37FeT1ѭFЌZbOFqסٙh*;ͨJ$Fj4̴PCݝ1: o cM#8FZա`a%5dd0; :طx5BvwRgӧ XHqv(7__Ug3mef#eF3J{2/bfKV6e4:ԁQިSKSFkte7K1[2(oup~[F+,2ї R(4c42{R>u `OLFh]eMѬ=+Й^ vXkAVu2 AdTq*0KuHꈷ:irvx[$AovQj$тzIJ 6MΎ̻8d PqBk?u}X7}l^fA`&F"F(FɌ"}'3:4et|Ծ}vqFa2HiFeB-#=9~o3!~.0 הQttvFS0*:{a߄Q3J\ľ3G7QX ;(qnhF.le5J 7i/d'RVf0N0J4QF0uFwQꤦ6A:?/8?-G7Qas@4S@g@qkP3_Oy5ͨ=RnFD_希ɒ:Ѷh4;Ռ~_! EiElОQb0zF;d^sFa]vNsFaMh9.Fg1U:T~F_N5!; ,h$9[[z/Q??ؔ_ݸjC=dg`tMhbשd3N0+S}@xb:w$?T:"4Yxg';:]Fzj';E6<J[=Cg1?cLJ1y1ƍ̕ F  ϒU͌HV1?ծ0*GZ 5bv! ;̨h&dN~]̳f3Y_mH=@'Fa1FgU ;Q.9Ѥ[}[m}huӶǂ:2QO&h)è?Ԡo8XcPt*]TK<`/zdPNeʎ zT|~I9\߶Qn 4Vw?iTҖJ*ZK>; 񙫲eC WKi zfMՅٶY-.5iXv3&ʌQfrIqʃ-*;1 ЃQOKz؊fTvjʨX3WՏ6>F0 R.30ۭ7j`׶w*A32`T.Ư,;}Վը3J9ڗ+}v:m+IKhvQ:*l=CxwGK (D_v$/UXQ*Eg 5\obaTiOy0C|JĄ@t3$h nYjZ Qr`/14;u12;;hz6FY]#ƓqG¨Ѽg3v5اe37귌ѥ̌X{(;a'F%G븡pPx<С,{rZى|XLRQb{{ױͺYhQ)ڙgfMv;'2vh:956}+F}4gt 7q~a4;h(ڻ3'; -d| 2×}ӼQ?{5M`4<ԋю0Z)x֝BW,x=GGfD QFQ(eh6`4̎uXg0F Fc'6btv2ʫQP9څA0ZDUF:(_H10EovMve FC:09;2ޗѮ)R4mNd~SFNތѻs1Zfo 0EVMv(E2j;ڑN ^btde53zF|;;=ђ.l1uB] [,ƞ p Ξz?dn /eup pX0 Ia=\-Lf=34tQyB(2}A1ф%3%pyRl٩blG+Nl&jǮδ0H˕/Mv}d0z5ZQndhu5=;Jb}iry=MTSwdrk1 Cahyvhŝщ9<;(\bu10.fgaЍQޣw{'ϼhɌP8eg*.XX.8?vK߼pWYJࡆxË븤^l{FG! z0|;;` Z¨ Q-!JtQp|)Z>zAFS1҅-2 hFhQ(l/s!umBOFMb?2FKI+`4hFo.o#n9ښ݇[N?Fӵ4F>RߑQцf-7)9= 95; s/gg.[w<9[g,NYw6joQ(u?<;xr6.CXJ(OPkiiwF/~z/ȴfrW-u6F윽w F3:y0v3;;mg4=´01jҷ{c37;=hߥI)1z-,Ռ E ^u;-NyՌOatҁh [[;.Ia) d0m#z4Nmsy&]ް[dF^N17d_9fԹHY{Ja^EZNhRͨ=vd0dK}&#u FR(3YmǨwGQQrڨFU3yOFhA5dQbTF_caty%s5]QߖQs'=wg>;(SW~.F] 1ӨohG)̮F:k7bvFoT IDAT(*:2R~ǂTԼ(p#FjZ= "92r+10FegюF2t)=?wђ׻׌ªg(u*JsF{BhYL(d4\eWr]Y3:a?FάAzuFf|PؽKlASv1;4B+,R`Աde{l+.ate^,Qny gtty5o:(;$g̎q*Gz/, [}dN?$誎Q(^?bGvƍ;x/V3 bFG1 !Fe+$\Zъ!ؾi|;uQZVA  }OΎV Wv$ښ k;[ٱoozW xsc-7}; 7̤yoe ?t&蕝F1_ʾc ykwAgħä~-KIc ;&١~rod Fh5l;ۘn51&F6!gl]KY 6١~roe/2kAqk){;[qozX&A $ ]Q(ooC:J-E49l-KN87$ha_7"0MKߨO'v&GMί'F%sv[?f0J/eS!umOC1ѳ۶fٱ eGom&P[ٱo5'h*ا|b2TDm}~}c ٱ~mmrXٮ̐V1 Zc̾oy30޼v14;O׿ mgrNX[#Uə#;֭K5Z(c|0vΚ| MAmEmv[# nӢ: co%gط}LFp&EVPE .M6Ύw82LԷL=#%gط j>CXZKL7z^r k=P62:;Oo?gmrܭ7nۚ̒Vl^LcUgP'"NQq4?uv&mI,n%;X%9XݧX%;X}%;X%9XݧX%;Xct%Xb0 F< 01wŷ$zѴo"Old 9Q8yz-Tm#`tM`u';u΁,)T No6AE{`U:G©LFyr֝%|(wv`V[s`-Zs0e1Z?]X >o(bp_[fg(ڽUO$'/V5&2mӁ0j1EMmyڎ;;`(+Ffop숽➊@-zvN]/Vw1M9Fp?S~N(QF032; S䬯(bښka4,qD_n{V  ylFv06rv&f<&:axFONNPka0DT>`Œ`tzGX ~&V?Ƞem_XP yO}֞=Y mBe?(ԇ{V1]5|p"3NV6ktd{X'AFrm 3QjF&eZݞ>"%_D%iANQh4&lFg'RVt=Q0v\FM+QQX7dT*~_t`0* }cTVG&=F`4=I_NUcA4eϨ1dPX$5p 9b9*JIʳ[Z47;بFuOu+%Qq`6=g>; ~Ȇj=>JY->+pTkT2.<4-R3:1zq]QW`( rYTwu?;Y1MQ# O#2On*{7gMǖ;+ߩgnFH0jZ/E􊚛C\gwj)w5FKjTW:pf=9[VhFl#x/Et?J&l3i1V ֊LF7ǝr&Zbړ~Kr(ݤoΡ(mRv S"͜Ѭ=#=R15R2*9btN2R2jԥ1F/|I6N2ZgEku Fn7y`QQb>"땴atwQBRwD yxk܀wΓy%S((y9χy mi lL>E\ud+ZQF_lj݉e$s^I3FٸҎ2CaFg0j=!ݲshӺA&=v~ɉhgF=E FX]}_H=vn҇YBF5 :tv2=Bq쌌>xPh-Eg߁uro(QF;v711SV^Ќь0ʯ,O9̬)Q:skdIϨV}`UVyx.ӖM4>+2]͓[v(}jTwfئohFr2w׏L~IlhctUɨ8դHSp7,OxuhFW^}ae_ś1u-;d!Nh6]{f'yVS~]EvAIl"󦈁q,]E'o񓸨Y`~rncrS/E()D.RRnՄQ eeT:}:-;m $LOQtY1Qh ;WBV0z{}NFC֩>U>~.δ!nFc (f jHϾ8C'h ;~$ӹo4hXы <=?뭵:FhJbTg귋0  ;VA:yLԞQV1XMg4/;] 6o45ъka4|5zFad,b+1U2 AE0z$ud+GŌgtaF>Z1z:x}dշRdT_,`4>+ejϿy#EW^͘~wN©c6z>+(.lm(t`bN$'Qq`5cSQ/w1p>C5O.7;5RC=sg%+1etctxV3FՁ3:T3ZQ"zLp7 1t,%1T\LA=KUڊѣf,魑FQ4*4;3'AsR'dRLI<;d{^Y%B,SQzFZOՌ&7bT ԯ7;b9j0:F;F3'8jQA_ɨbZ'30Z,!z r3Od=TRow G9=:;١^JF}FUr*eOor`q ˏV3:g{F%w]xn_pFPVRNeϳuvDfv8Vv$~a)JgF{f;;=xL'LT-F #wN_J_u$5tre(uQaŨ( ({ITv\FYh-D7Qizrq1*F?b 1zs06= u\FYh-O񗖅gЈDvQV.! ftZ>F4рSeF:R>ѓ ftiԛ`(z1cN09[$)]gEd' 6gfN+ʨcF1hFu{2FOE A)F3e6އTvvQaL3 S۹^FGyEvFEO1G(WbJ2NCF$1 6bI iF0 )ȨW#kF]'7j0 rjtѬ]gGd0'<d{~Xf4;4zQ<@9s0jգueQZuv]7:2zw 7wfXD厎=>Fr:;˨(ß4t?1aly8cT9:XV`nl;P^yJa:X(ͨ,F qn=1q`TQpuu`=Q2cc1 f1J0V?F]G:˨}~+F(%βl8ZŞ3*Wy*QQlzFQ&` LmL6|F]'(VjՇ咊uwIFE&Fsu aLHCLˀ0*,XvvQy9aGǒ?q-=RO6~0ķe_}b Q?{},#}4Nѱa1a34EQQsZxv|T jQfT GBf(a0+3Oau"Ĩ؝qG}X2F1Nw"F>Xfԙ:j;j2{TzĖy*͎<axv2ь^S^cb5Bu\\$N&*9QSѦQ3rFY$=FfwԤfbTrFH2ST:L/q?EQ n<"VKgg`t[F=ը(/1 U}U2ۨh{ԯE2 Q{D4;{(jǨ$&(1J2~eǨRM .MdBVy>2j8JNr'0 iFY bT2*/d"ԈQP(Ut,+ 镛8+rԶT^dPx-ð$9U $GUĘ<~g&QْWfYODF#:'&q t-eyL>:.WT3ՔؼhFHi鵘%=b|Ii1z'4qWiA <)Fq Wq;(2o aTHvjP(!٩`/aşf`4\k&*I$)e-ĂttehFZѭ=N BR9_-(xBfoPh>0ʗGEsUw.'`M*E3pQ2*dA*e2( y]~*(?R`ZD*ڞQZ^q/A}QhQO`Tͫ(bt (bFX; jQS5¨^,b4%N. FU`1R $\FbT(+9]5$zHFyr&1*EICFU߰qb'67ιK!=;3TS_XjLQH1fz9Xb]ZohAy7@nBǘBbd3MXZ q\hP <%C_}=stiR`G 1*-$9*;hYt2/]\E0ڃRٰT3:ދbץ%ٙQEiQ6}([@^=|!őoE9 F[Q[h;?gftXT3 d+I32VpIN|EF潵vsvvfd *MIFM ウF^>FOG$fcVoTFgΌrKWjT>pI* 05}28g32 ePqFm:#٢~)0 ͨJ1jSWp“ufo٧g,(`1ze42̌JCMG)Fm:#4)4{>$cjQ}(3G{fgmoC1 Bճapo1nO0+w5th,Feb/`TgBeݸW5pvQq3II:(X(nR>j| O(l=.?\~ >Q` Jw{.hc(~nQ~HJH!!P^2蒹E?=`q.p p"6>Y8:R+xn *Js{uZH,DFg`CQ%ՌgȨ7:#:(+G65Gs cuyQssJeie*;kc,ȨՌ7%0 PQ>#8ԑQw~>F Gu ѧG 8Ue.;FF/|Fev F>2UӜJG5vv(Fo{`Ե0`8g3e;6T.O`T'}oFy9U5aeTgT(՗Q\*.Äz"x\1֢fR5mxǙ $Zv{eLN~5>S,i<24h@Pʫ=RiNu -uco[}hbkP1hQV?Yèr)p/Z0e4b:%>cJ5m(tѩ&wߩza5Q\ n(fwbH1Q=.L"F}5zO &GNgtZrhjTͻMM: AFےMbTMy3RFhKQl1E@i)eVqS:;kbTMyjĨ}6=fT%d4,FQf}&r[ O&$zFjtھS(^dS0f .rUFV}&r~Fmy:_xB&)nP=k} uu7F̌ƨqtC-F[1{E%-hZt5ʶ;]FegSQΰIFo6luQWtv1JWjF\F Qh脙1k-gtJvV¨uẻNT1TA3FFQ6Sx{4-여6$dlwz(%6dnjUGs rVՁE3I~(Ku:;w!H'HO[Ћ=|\w8 4'9zu~s?O *zf!_S]goQ ˁ`ֶPthrMv(RfEߕ3d'hFuoC&Mbz[Us̿/l\Q4}aJɌQn%>73c\?dNF(>`HLqr *Foeg-f9Uh0Y:2c? jFE'):Q9w7ꃌ"qQY!z Q:ъ*hGF+-tFq]b=B8;,3uQj(p3N{Gl;x 70롱oبUiv WP(Mc;}A8}<'* !AZ&;)Z1_].* cѰegF U(~1zYa0:BΞ0Q=18шeof23?Ψu&+Z093jf'QhRVE5LFR(F雋-VT]%g;Qhhh9XgmT &&z6chYFCF߿H{8(b+x~r3Qj߳iM';/ /??"|x;~y PN`4!OC'4 \'F DRMv]TvI<3o<r.Td((톈\0:js,-yQRGP*֠an>1/R`Y-(1rg"b7쬕QBZQ:$h:;ke42F3 )Fٝ6Q0 IFJ#㌢9}Uh匲%67M1c) IF9i#Ҍ"d9ٌ1z(C4{ޮ0ړQ\^1:4`TMaf3zb6b'ըX9os`tH3'zF5:i^s:FÈ`^1*:(:ڌQP#TYhQ/ʙcpr 2ћkԋ]g͌jG3SU& Ey`wI8Rx^F]7%cְWeZ qf,!JNA)Fd9:9;:;#}%wg=Ug^x,P(Buv=bT/A/A7Ϩw{(^Y01Qp<2`4!STWSQ_"Qe45ZQ`>K$ݚG3bTU>0¬F%Ө³ɨA3:::}h,`Tק( HF./?;h&0b1z&`~wgtF)ڒQ=jZ_~m1CѬjt͌2Gur0zd1:Bb4]7ٙm)zQV:cF-FݫjtMmǫQ(f479Q&h07`ԮFG:F/G(SQ(ftoF3AU x$Hy/)H^*K2 ?#\'ui@vRvaFQeitKFͨ}F( 9QNCpQ)S`xgx~Q(;]瞸=ﱊ:j2 M| OF昝nhF gr`(eИ :`tID N3ʞ`Hgf{@ 5س$'0?LGӌ:sVDfط8tEh2j|HY޶M3-$uQGQOR4( ft@Fǂ(%fri˫p+fRhI5MfaWa 5fk(N g4k{Qs,FmVFsgaurvPNzFֻ;2`PQ>`?wS9o4hRѼ.Z}N[>QcfdXQ+Qw1 IDATsщF,0ZQbf4WHaFbv>88?DћјyfAڌQTEoFݓڕ_ͨqR=zoԜYhtf'g y MWb#ןɯ?oo$|/D`XcL |9-1崺=%#3,&BPB](qocqpΣїQdT;j):֘5g˨pB%¬1 .fԻ&0j~ɨ?RY&w6?}?}< +Ok YIl“mv!f4(HlG[3 3W*k7Q́&F.L3j/B2jM;mf/~+!*6XeMrhb*G ՓQ(xըm e2~߁Qm/AV'ZjGg`LGChjQcӦ1V(g1jU`j9o ..F! SߖQuuNYFa$d1jṲQe:T8˨HɃ_S%u]jCݗmص7ݍ\ 4v[Xqz"Z˟!(pz dvA] AL>2}dvrW 1E QF+U02z'."BX"}KDXg LKk [6δB&j2%P|9~?Q 6=Pb؉X*; QFo~yVe/jQ%ь Cه%u(A1>iisbF2(2rr *F'FiQ+2i'ӭ eT0)Dm-=ĨS9ȮE.YO!F1*`4;$?bcϩ_'/e#Fs$}R/`1YQsU#FE`Tg>ӖѲjTuNfTH qFur,vbU=$$%ٱ@3&PƓE(,ѩz>;F#Wm]щsFpv5!HIF[Ug|aj44f4pտSذ8t5^`іёи˖`/i9o\򊔜g47nӎ(NRiĨ6(=f%"潤{(oA$D2Rl"pڢl__ak{BHgC69|XbOchdjeg*9xX?ࡤ ~;n:'޼JBA1XE%(5Raz׹;fȎAsRzPmKe!; 1ʛ"T2j_׮Iea F#:ԜQoϡ1(i!XBƌZsS G1OQ:jf֌5,FŁe0 Qkƌ2F!;xFW&*+c&Mfԏ8TvdI+Fڱ d#+; Zgg+R4atZ=1 c UђїhF=:Z(zJS 䬍ƍiFY1³ǔsmިd7 Uђ3b~F=\=X!Xj =ёQb6-7*ӳIYQ5vF.ӵeO2 meVR*WzYH (,N݂69urik1DQ',?DY-#—b1t[Ӛ³gjFHPG3ROIeT,:jc%@1JXZī(!E8WP1Rh؉7Ñ BJ"a0p=(a#(Yx9(qfW'Q;:yOCQ5GŨ#h)NUd=tųnFYq o'nA3Q(ѿ8F4fT:[dFuvF+~z \1oaFoCVF\ͨ_Q0U]0Z-Zg 0d47ʪϓ&&WvBF^gg5h(d0jߚv]=K2Tӷ` D }gF.c!?J?Ț?Y_֞@j[J uEA`@0ʍ@Kotphbƨ3{iv $h czh1#X@1j[Z7dT5Neղ{xQ _&Ah;F8_GF1'?Un NǏd~dZ1*Χϩ_3T1jbZ1:& 9mѳt5*FӲ.ѧ-i(~}0zCMO,Uy۷wћ-i(~M*¬œ" }Re0*Z4(.3*qj2F$27ڎQ\;ZkQp&H35 N@|3dL%)|<#V}N?Fi>r F)KJ2:bPRP8a΁{v_=B1JXjf(I(^|;b( Y0zz:}p:^ ~689UJkPa(=F_NgtgT$`c V$X2:w!&sI>= 0WzLzA$b>>J.1:Fn@ّ@ AQ tF|F3?=M3ʯt"x1*ABbtS"7FK!VPN0!T0:><+a(iiQ*XeHQf##E4t~FyBV/cT7 6hg3,rHSre 2G_GR| ~-`.C]F_ff# Ό0ʟ _(HC)F!ΨS*:/9)Fe2 1 `~IFaFFFk!XG y>Eaj>`ؓQgQh4w-cfd.Qh?oT2::cT*fdTU;d1 ՐJGj>w 8{HcȧxJLY(&AEpϝtT[*h_at~@_"!Fd5j@@\I1:֣0*ӂRE5PjE@ȷ0ڜpbjrzuz`gwQQycIF!QIbH0:% mUOҨE+¨NN6sZyHFL 3z3zW)0zdTR*=8Vfcכ-h]9ZSbT)J1ʛޢQO;Zhp(ѦGFe׻T`{G0_usS%ѕ=/c5QŨzQ hmYӨ0Ekt.05Ѩ{GUɗ8SըVzu2 Q}{SFv>Zƨ]Q\F4ѫMU}pJ3d0ھRƅ"Fh-j0 $ը&SǨ7$q4q47$w1<GzT-F}FeѱLK1*;F\Fe}FFۺ%Q0 $ը#ZS.2¯2CX6xFkAr1 5Tߦ*WJy|ayOAw _0X-B9vTXRC$T PQO`sSw~QJPE|: u`Uqtp_N!S|2q~:2j=׌'rs]8!4~շ; x*@#%SPʦ1>c񾠕(PF}F31e {4ȥ~AFoNdA3bOG0PQH2jpĿC9fӍ06*E匆I申91zdByV% *DL3dhɸV+( ^5j0|jk\`WFC0QA1F1i`ԻEr 1Vӂpn`Tnd2j7cpŨWjD'0J F)j}ӌFnfsf/'33K>ɨ 0/>OyOEWFo F9Ad]ݺk%ѻVW^pF D)F3cD*~]fTO|}p*>kzèS;5Se8 =cT^DD%g7ֹ7=@*;Ύoݨzچbw> b Lp2 T]mpYcM<4L8X Z}ApðTԦ2(9I}Q֌rI}^( %VՌ#.eQ[ƪўBQ' FoCVIZĨ_^wbT:d8LWE"Btam5j3$D~:?aЬ&0*/5js4`5zLWeT4#js4`5jU9F`^)(ݪ/eyF>lj!jF|21J1 3 Oc92jI2[=i(/{2yJ1jn([ę_oyMf~xu$'vbl1(~ؓ^ Sͺ>ꍳX/EF lԶQpE\(:y(=<yy+i71JWGܐϝ`dG3{c:zqAIOj s`T[ʞ̎1$Ÿ USe MVvLF>.cTNf- KU3b8z8=N5Qf0hqKtۅdvz1bK5ʢQ0,QQ.Fx2՜Rz~I FiΨXlQg4ʨiYɨ ֌"Ph5Ŧ&ɟf2z/(ONsF=KیpbThDXI¨('ֽ] FQ~7g_ zFsU{BVuc`h(G"U T%jTX FӚP0f>KB=:;&A riF5Q T-z[3Q*ΨNNF-z2Oאe&0j:ui%kUޭg̎In0J(GxG j 㖂 3oxPT]߉Ƃx6#E۔AF ڝH}f^iWVKiJ]fu0tR:ln* =1uG KQū̎ɨciQJQ#z 2x1Lցe$ca4QF:s?Q a6(SJwQ-dtGեZFgC%V5 e:H37Q*Ru/ΙP(Y7BFO[3Jd N xaTסAF#5zTr{(1o(èΎd1o5D~r6suIAȨWB)@2 dTVNaDӊQSXҌκ3j.ct 0 I(y3J4[`k'UdvG=Fd Ҍ?QbF &5B(hq(h*XG)fT49n!F/2 N>Q`y)k^`T.gof2:ߋ:\F A5x Tqx~'}odmRJc F%^%JѰ7Gg'/(bT옌:=usO1 %@v25^7 :?T3jI,9,UAT $t&5΍MmDQ?ݹK |@L@v( bW6mTh@(!(Jߜ j:FĨ(D(F-rm3JeFLN \Q':>|FF2:t(8Ln2FQݏ2% bQ5vof3Jtd&0S脌*:|F@')Ĩ(B-at~49I|6eCL:9.RQ~Qq(1jؠ )3*&B-F]FSoMoOj*@v0 &pٌҿQO(bTf:xTpk3 uFC(FmFe2N}5 3 [eO-*F]EjdFJ/jf/Fuh ;atrݤs/Uտ(*@Oby0ͨ3"trS9b=m#6Ho Oi1N*RNMt 83Qla#fv4n9Vo!(zh9j0F'Q%(6陏*97p(g0jÃYur8s!2o{mn7!rF?DQݑ5Đ}'F|F]NN&sr̩H5dߞQmkh¡Ǩ@T/gyѩ/ˇymF9;ŨsfQ] -e'Q8f FߢotG]Gg'Q(..1 41;= O=|蘷Q3v7kU~(^bdJHklFHF ox$2ѽo+BTFm (Eҡ(fX) Uґ({5/c>*F͝1 WQQ@)SBcF!sQjr2?1*F FɇN2z!ИQ1&gǼ}*BNuh;m{1 G,(c9ە:?aVv,(F-DL49Ro 0ƎGʵE2zX vklW; Q@F8#eC"e|K;9|_X ɏ(݅/[ZrKޤw}ͮfTBXKKt kA^L_1!0>>>RS @j`]5gTw0  ګI6ˎu%=m(`Tg'QJ#bvRò(eI5pF76XUͿf?&aFdݳeff{i0_2ݱ4.QQo&מ(J1 <Ҍr2{F0 S m&vk (Z0 N,yp@CS5{aQ?g'Q(].p;;6eyjT<K83ʵM`Wfv*'`]+9(0*QW} t5GM Mx֨FoMѻ;Q(]9aԮFG5:3 4_ /U/QQ>~vFAb0 qFAQ^R6̎èZ`0z3FTeFYA(b uQQhI1}h%B+^(،Bl=CtE娓(X5/RDSdcˌ.&FAgeIQ}IˌH$PŨOӨw 5q5(،Bl=CtEAtΎ}(>)$Z6( " gP_uvWcr>˝HxLU)& 6#dzГaWh A=#(V,KM\PqIyź'*9lt)̩;mfl@ը=oQl)zA^Sb>"p{TvbG*w2ݡccԪFA\#[o<*dvB ˃{wr&=;5oՖ҆}0~`%(T0Eٿ,F C{19&F)JΌ!)AE}F~qQ;rR$AQhY(0j;(Za~.+Fyr F9ݣ&АQ ,Qf0 LXbhFh.hCG>F73oDFe=ZȨ_e2׃b}sbh]f"'˨tQ݈}шbTJxΨp`;H5McdxB*|TK=ICbxq!'_; F mz.Zt-BɌ0eXnQ mM#n/Ϟ\I5bF!(֠⿟$ku.~F^:1Fv&Yߑ(QKQ@ʾPBC /$>;rtF+1 AFeC2Q+y|.ݞ(wQ1z " YJ8mq@F᝷uh-{TT:.yd3}i(&Gk1>6QpTdMrTvT(4h+F(Yhe#wKhK(0;ojGmϨcFFuŗ7ѥG`FZF]V)ȟZ|q1_(88T̼UȨ͞<4i6 CQ3sq1?9ɹNN5wiq H~jQFХS_fT7[5ˮ9eԺ5ij cѬnڠٖ7wRK̍#?Yi:XaU F F!(ȿ5qF hԔ3{b*$f}b\njǨpԀ#*$&gj Fo F F!(%3QF{XC`clUFɩjTu.2Zq1;e>*cu^-0:77+S2FE5ʨ]&2 }U5 U/źTѨ.21o|[j%ZS(`fT_ $Ԩ矘lVRS0gR?FgjaTQF=ˢ6JEM5ʒS¨h3+*G`Q{TQ<Ѣ>X~ͲbQd$(O-FE~3#(F/^[^m@oY&9[aR4Ȩ4b^kc>FtFxiBrn 11?̼lèT3#Dw-Q[+BqZ$8}Ԋ(d !E-e셣S|^I ?tfUԌF-[Ťҙg@؋?yO=C6ώye=A)s(Fu>цrFRb]d3*&i6N9%:;qF/mCړ~Rm}T0 LQɲNN . 2f3:;aJjԛb`ԍjeg)QYʴ/- Փ}l6eaڱmUȨsOb6hsF|QЛ+/2B%+ӾգK ː^d^ʨB4f42FE GF:]`^|_FfǼ]NNNɳ)|T،jK/Dp/UIGKcT[:oə- bS;>:bAvF#pZKZ`T[ lKx@ؔ51~˲!Fο]CǼ]?|I[c;mDϟ 5vV=Ug cOeNQwHi%F[c;$ 6eip蘷K?uLuϦ _h >cfT6률eуc: mh}0:y/-G(FRt[6)gL=+o}\uvҎ^mp1*:>o GbEve׿!ӿB)|؄RG 1K 8%e,ۡQS`=ePDçIvbymyTa(DTF[8:X録0%.4Qn0ʂ3*P^V>G(fTQ0hF7x>УdX"-1`"~9!yo8Qa=2um`4ތn}iŨ[nh 0d!GhurtftkhCQn0jfǼ}nG19څ&(xv36蝚Z0: F7sz1j$[b͉e>FhB]! dT G^K3ʂ>1 Nuy6$64NݔvJBf'(wbT9쐌N>2_Ly13R 1hCGܮftV1[o9nmJFur\^h3c1J];m0ZFuvFP>Z0VnyMF}u5yhhs5]T3zQՎhtFveqvZ0&&ϦLFu޿\A16a<< (s nc_Lbx~#UU Yʖ(p`Ioe75cT˨`T;rKƝ@2Q@xjb13{k|% k+A߆r bQ1F9 $菶B=GQYrBy~z3feߜAEvdTxxY=e=R-  1j8*OW:{!5L}$?_шC9Aȳ(e1e)˳R+Ґ;Qc6ʎ{m%ԉ NךMx1p7z IDATn^ٌbϬnxct!*JQDC8IT*^[,g1 <2*?kOOFO:F_nMΌ6WAFt1)Ъoh29J.Rݪhۇ(~3jO*]jL;2ZE[.`tԞJsӗf%Ũ5ZR*L{2(9DF##kQ{h/q`QB!@U g6GÌѨƮQQF604Q(wӭF`3ڷQzd`[0r87Ag_rQW 'F?~[l#RFoRiGu鵠cL_5aɘg-l|"Q=$%'˨ \6¶J(2;}b߶;~)+B9&5>$Qѐ*,J65;+3-Ua(*v 'kY:*Fu۞ ?kYj*;ro5?=Ǚ, z2T2 zkI,0[3jdQ)Ӛc Q?hW0j$形 Ռq ٰ0zh-Fv# 0}bT'2x[5o";i!F25eFݪQAγgd&)u|Tjfr2ƨeFŜn\Vg>(Fh`VlU2FjT3Z1ԘQ0Qjv.[=)F(6QMZ5}5j0zـp5(( ^fT`ںՌV 3(c`"O@ɨg!dh0`M wl4ąOd|'"eGF}$;:.;_X(F5UӽO,B-7l.3Lne5T穻'pP66:Gxb ")OoM]͒ z[!F5uN~g14,hQ0V6d>FYL`Wz01 Q5o!G0/cTdFݾdF!g=ۛ2ʓ"k*`3gN܀[QQR6OSzؚeըdhF#Uw 2i ZR2bc_FiG3騙st2 0騙`6*Ό G{3za&'~fe_FMG;2A3RЌBA9T?6=1 1ьY>[Ѽ-FQHFovѼ}-F魕b4Q*Cl9Q0 )Q`tj\p.4o2Nx UŌ-NQa4T_OF+]-1F0N72 5}1vیӌŨΎ7˳d,F 02jjj7-k(_@d0:;jBڗ lsF->t[v9j15(SFKs!>+7F:a>D(MRP5HZ/vFC:? kMvè'4JgR`Bn:8gzAEUhAqZlY=Qwuf^KGC8iO|^O8luw#~O8| 1j EB9t ,G{072BvgQ隌ΎgG:ѝQe%92z]FNc`Ԋ(G}5lwaZF@_FWF?delԯjFhQߚh40SF׭F21z<;Өm]]ǙpVQcl-uSQߘsyp٩F I.*9{Ԩdr?P\SOv9GЇ8X8Hh(lF!:C#7;`ffɓ1@F%qM!T,ĥgoׂ3M}zu%Z(5;209Vv}'!56cTY(Jgf4 ([ dtg4F(l¨nׯ=DfhTdgc1z݄Q5Z 2挂jد(ˡ8U_0l(Wc O}2|OJvQLџ }]@?N%|KBPèptUFd:z)p)mF2!9> HJJ5zt}Fsb:zf~X )T̨zI>;S{@R*r תQ*h4XKI_`:; BP+UcQ[P | C[ChKU2;I'w)[Esю;~<jųqR負Yv޽fg0WQUebR u]kG0F +Y;ܓ}r5]Q&`4!fFev.A0Zg)z-&"V2f;`t9zP>tb (xV2F=}r6#{^&WE$ ='jpB3;3dI5G8'3δ=}^4 `԰ X!&(1T8`(u.Wɨ~zoꌪӄQzFkuv Qr0퓳YRa ^iZh4;Q&TF}jͫQV5!;Y6iFrtuFQV5gt9Qz8vγaCv,)Gz/n00cp8F{:¡s~s7`þByQn?ū;=ңdk/Bzu6m^ր2(MdS0)oz;b6񸽅[c+@F1B$ʟV'<7gS OO~j˨bT4ѫ(ɨAn1 pQeSF?4bUsF2˶`#|8yt0`4=~`T6a}{F)GamvԦC`~FG59TFj׾0ꗣفNhQGG5 |Xɏq{;JB} *R LĐ[=\A FHXPdmV721Xf?ZAjGQP:~AXzgY ժP&hZtett FC验ޫ)F1/D1:Ӵ_Z(FbK`kQ5otF3 !i0E0j*҆+eoWЂW`0 B1o4x~37|d*lnQhԫ:2Bò]vbw;ʨl'VX+h+k˼ތn ^xVKFA7eIFgTw,;1z:&4K 厮ʨ.I}ͨ *DzZKK&cT_sfL5:.AYQBPQ}:2))+;84˖M~Z"}62;fIJקԵTyDηV:(M94Ff'jF֌FSzb9bF7:0z2q(tb`4٬h('gVerьk0:3dgT F9^/ >Z KCͼ(%ګ@S)p:Qqmi'i }Di9,%m(ׁXeٹ.sXAPIh/Ƭh7F 2-܉ΥhF!%;E.dKhƨ~كYT1ڒYP誌owa҇vc4R}ҞQUܾ3JX,(Wjh/EFqTtUFg<;WQQ-0<9w[`4Rզo*k0p*1EPj.$gW55ZozdHk=5Bd-5Ph?U8n6K-:F-B,.(Ͱ:Կ,%QRPv Uv?_,Px|Bv 1Il}.RNyI xM5m(lٱhV]<J eQ?9k0i(lќeFQ]vb'Պh4gϘr4g]Cg0b{4oԓRteewjԯ(d=ӡotUFnKFSe}ӣQ.)oA z?Xo]s<-1j\#E$􍆲$FJ8"9~QZON Q>jԔ/q2:+m[N9dP?A@8ᩊI25;Էft8Qvbe2#}d4FAu:JsށQZf%^hCCQhwF˳33FӺӁрퟝ.tftCg:tQ!:5D,1LRQgO?,~5 3g,Ft_TdD)iJMvXZLŹ0"xgն h^_~r6uAJ@K1j:;[@Zus FuF;2fы-2Z"+:oҌz34Z29FF|Ft 2ʫт2 _:G.~YahFM/FhF_h~rlFe9((+0%MɎhSFe1;9{hu|]|G-#4!AӏFcZ @H1N!F3׽5>)JdT}lPK;R'( w4T E3#F2zF+00Z}xyNBWFgGgn'C@GFsMFI߉Qv:ц~hNB_F3/dq7F-`4sRArz2J }]=R?#F3g'W-9އ^3#de_l:E*NCq*ñ4ʨ/cTTӕ7lקLS+Oh i?QKY\ z.3j,^s,]tl~3\Fӑ(7u9:FcF}M흝hۆѾk(^#U ž3USkFw\B7Fa Fks܌NhɐɕZ3:w2WSЎ}F:2Zcۅg,_p#((Ld #A ׇх\Х+J8:))+GUevlK-5v }=ʨc6?E$zȣ:k]ū:/tvd*fo9~N\4h)F F_d]5F 2ѫbF{^a#/֥ux3Z1SжW6`繠FQ6a_vIj b5ڀъk1 F1y-Fґ֌^hG)~NGF_hqvQFw]5ڱV<'11[zscd貔{ CǢmAaj>F3鎈9F F"(e HO`$Q53^a :2^eh'GGFhr5ZhcbhdVbt CL;99ߚlVxC`cvюVT==ќۄѿ4rt]Fk~O¦gbgQj_vtmSsO'MGݝeF{[ǑV0o[¤((63:ϞYKv]њULekA96iΰt<9`QҨ׌ږ>׵+*DчyNFyv2eCѩWm)}2,Ok0@uyɉJ' kK. ^GEyTj!؏uOLF=݂iL$7-j/;'DY Ͼ 6F% i2~ߌ17hCQ4&j{^wpow {? $tAd҄~~7_}B)/7URr|%Ҵ&jʨc(hoq_иy@FmMf# !W.㜇5NhyiZr5Ie;j^6\i~?Y2uۃuOhE# >1nS&ֆiM$ֽ8[  ιM[v)B?54G8R~ĬwBeѠNhE^r5Ie6K`a`oZ<dܺ ~ĬwB٫8{H2*ˢiJ$Qk?gl[Mhowdd#fe'SdTPԃ4 2{.7nK6N(XKm?68g E=(LӖI*}gaͽm _#|Hl5 I&iBk/#;y,%4%j޸m=q׼4[7<"1(_a<$LAE} %Odfx MuNȗQK(G:' > 9!ϩ4 2bvsSa|L F`z;)/>3ʳ mA~Ƅ\MRݟd;- u~o x#/m@o6!DF~wBpWMsZ3JOKB&_e/Ⴞ>D_ho%YmB؝z؏uOJa4' OB&8>tv1W[m~,AF}f|BO ?"?! MTƚfO‰JO+B&gJ3%LetrSB)!̔f*L a0SܔfJ3%䦄0SB)!FQ555դeTL a0SܔfJ3%䦄0SB)!TF'7%L a2:)!̔fJ3M a0SBNnJ3%LeO`aJ3%n?os؉)!̔fJ3>6uL a0{ÄvcJ3%Lem?Oa%L a2”fJR<0SB=` 4%L a2=q%L a2V*k@hAIx!䕠6{'˨`pDsNEjJ6R&!h]\pҷ]HʼfM lu F}_Gv%!{(!%5=!Q,,הfJ3%q9 2B֗|MOHeǶITE*֗|)!.*kiWB8B7E au'x5GI*v!2J*!z7gQB =]F-Hno}Ѝ@UNgJs0gz:"mm7 !V&JZΡvC^B]ϖcMQ gKMAJu%Wn e#2zFDLL˻w%w0g!䈄.71فv ۗ9;?!RVS AޘD7y*!. x]ܭpٗ/JCRSBKHR$oDVBńqB*-hb~ (aAKHP$D^';P]1*΀.7 )勧G%ZT*!!7Njy+!5A3R=ƥtt†,ϑO%Ԕ"/0 %jB& .vَ[=\CO$잖}-P¡Y{"ILW-!rՐ . ^rs1;o;Bh{eo4^GlF(RBFNu%t/J|>284JYC-\%['PPй`=j8Pb%D=V=,{Zy:)=Hm!˲aGhSG%忈Ywa!Ŏ#^8 DM|y)B#W%t)!)־/b8Q{*ˆ8UB B_AB=F Ny_:稫}j %dD )!lzUF+Fm q[6JhQBWRݝ/8{JxS )!JIRݝ&VC|GhA{qPT aNTjB2˷:?[[ֹP+]40aIuPe M ^ea/'T(Z:~=,ўdt] 0 ]I^cu޷#T&K<uiKJD,sy{2< Meo/߾LGL~"͏=0Δe}~B>%uTPpı 9_GM0\8_Lp[Lӯ+"s92YH(| 7E#=FSRGLN#39_L}3*mRZ^ֹ'rd#p|U4ǑC+ (-GrZ4c9z4݄H2Jk?? (%YHh:5xYʷ?}J 9~jɄF~OhGB5ѿ3M&0JW22 c']1KTmI{C™r>Cr[MRFׇQؽ c ` y>!%< }6!2 _Be\tC#(ȿ:˱`_O 'Dч(~B2xwNM_**}f+YX* BrUA^OFA*{n4,eX0Cڭ hI:|` -A!2`g_B2>a W%ɜQ + Sn7T` &JM^_P駘v~)?M`z=t6s 2u,9D&*p =i- zSdoI~_TLHON$ YdK] H^8BsQ&mhB,}bB}~P&" _zY؅`UHp :^; W( b6beP}/|E/(o_ >LLj 0 [[y3B)~ چ2wxR<.7[-z%sY9EPXkEzL\Nm 1نw;U[ oC[q)21q>P){q2gBɯ#EHX%JHUmfUPPt6z0c&5B{9B.$HET"b<$TцΪH(݆HFHXހ2j;Ȇ2?8f}2sDńLLq  oSAFȟ^S3IBm\$0 B6D3 R=Ghcݾ00*JE# MYH N*֬! W:Uۆ"G;I8B '<L&G}uq:9COOr_XmhVn 2x=^s)i@oLjeAcl4BLh/D(Ќ2ҙjˍp# $B4qMV b]1/eDBT !bq%UCjCʨeFtS.yX2Zr$$HHHXFIXWGe\I(,o64CUQ4uDi3TFFISܴ7QBmhfMErebܲ']` lA]@ iKVBд2n&Fk6Gc, BvA vJVKPBjBmE+ B'n'drަ\ZF>Ba""ݠNOQ;":xvU\+>)H$mk zń("BBlSBz.ĝ\yH%԰ I"\{KBg =XFkek%,?-x|ѩtQ:B:"͜*BFGkC3J~zBhh9c:u-X>N=OT[(ABDvOB2o&TFel¶B7letLܳP%[nE i[ΫDk *vDpʵ.:hF!>Fety,6s,k'r!ietO{piT[\7 # K2\fvJɨ2{ymhM~=!FJ; d4O> Lhv-*q@4f# ;xВѐIum|B6?PӅYB' YB*t2*;_v#@|4:z$4HېU##_u't"&4^nt{}rݤ7P EPj75}7M\%bEq{54jE%DM\]PP sǎ"*˦'DWE(7s"eM$#(n_]Ԇny*hy#c,BvB,ŷb3*Nbzb,&pȄHBJ$4㉄2*Ahr%m{mN3cP+TQÀhzҼ9 {#F%Ҽ9 o$TjB(3p9b8Kh)S%%RH%J(TFÔBf;JhbׇJm>PJE&XBI$4o11 g񶤊f~ ?XE(<6RQO% 1dTaJhe@'K_Oa^>9?&PCQ Q7#1)Le4ְb0W߄,&PHPSEyB8¤]> ]Jhgm褄TF䵷ð7+CTgBTFIY{&$؆&`WnIY$[U:j.&^uύOH MH s*"%e)[s\80XF2BNmCqRB3h;Gh%XE'$ۆbPB7b)Pu"!uKׄ|u e_BSg|`ݪEp߄NUBi¬cB3+k;GCuC!݆j SB1 M,m:K $xR;7qj-'ZPByWFo/7^ɯPm~%!2Zmw8@ Iٔf}XF?0JH zPZ\P QRLn |B%(!J)%ZԆhUFߢ+i{;c%xB>%dm(ʨM\ig)_.=!7P 9gP JĄ0mhZ?WRb'Y%gB{V*)s fJHPbU<-!L$ېʨm%&~H|w¯ErRRV$eug>uT YhC);.3s~ʼß=JH P!Jh Udt^?Q[h&s~?m/EvB%(/FPF' $fJ%h΅6 %H] `_LCn,.'$f{(Zz|Ƿ c.|7OG O$$&#\9ZoپVV;B Ao`%\X-!^6޳YVr)]Iym/ t@ ^*LM~n -n6x P zd2ZX130`K:S9!T#222\m~2? q.L-oa&Gӈ B~2࿅Y eZ*LbZRͷ[&=!t[nCMV&?vsCj-Y+i}&>׹hy6h̄~Mqlؾ:p#-ELVBV8WBGHh1}; HMF% ͍9ϕv"q 6:LG蘋]UtLB mC {ل2 '2`F-x.Boi$ jBpfUtPBtDב&De(-86Pvs H$|&奐!bh <*Bhv6zDQU^Ɗ]4L tJ8W*6QBBmHetY8lȊ]G0L V4QJn?:8۷!oQ9w' g|uz$(:MlP}r_?Wo0ͻQWEKuAO09g廀O(N roC~6rѨeE%,](teG1ބPu($$vK–|PI(EF*iJ=%tqɭѸ m~~*Q Pm($T qX+)B> PmІ|nԻE =V1\_(/u?]Dv46 .!EBPHtI ChIڎ( XP|9ȹ9K39 !*ѫ~BNIWbf'^LcOQѭۘlA Qi[}9d2Z>BTtn^>N.[)vf:˾ѭ«P1n\DN@h)$4JUd3O$ H S}"gw]dBݷ!OFBQM* gQN2ngw1/Rn6ZLȔܶ [[B^Pmȕu! m2f+-˜ )7N]8 .!vl4(BLK 2d2L%"/bp|J eBd-!LEO!6#4'ńori{73F|AF a*mSѦTF\E/Q/E ]CHe%>]=urH2ryT- mzoڞ\kTQIF+ys,ħ>>:xBBi*Jh82Y1̨2fL` tZE:XPU?J(se欂 +1%WrٙUg>>8:uZi $$?wA(ԯ?HqM(h *wOgNCQ'O!ļ@B*)dTvbt_c< B< PH4hB I0[2#*ݒq!NAuAF[ėᒾImK(nG"&%JELK YK(FȞRFwl^m޿|&WGJRQ@H=K<5/se71 Z}3~!p_BՄ 맄+ PFsWdNw7zxXP87|uw&q ToP YB[|AQD RFkW ळ:92ZK(vȲP]hJH UJ(\mHW gそ2Bg ֆlO؄XUt*hІgBU?Fίtz?2|$utlOLB6%`ml"+_t4pq|SS2f3'KhCzvM*c4SpJe$ԱP6/mrG5ׯ5jC: ]F9[sli%)MO7RBU]HJ7W:ke;|JQ;\D\LD'2vYBZHN$!tx?j2''t-ύsQTGKLT$2$)Ir72B]DvHՏ%deO1Qe4X#s6/n+u#"pIĞH]NY$T׆ ܆z$T*nC\FBF\EMب.6}qdci8ݎY^Ի6emKB&{ڏGQ'sWeoYz-,萙gE5C6F,.!= r7B.Pl- PP͏ՄoC2{XxQk~ttMfeL-L=09mm~( B` *B/g2*ڎБu +ۣpfM.vȌ,:ѫ%PV#P/N1` t%` >ƶP؆*j'D(5jCVmh;WFSo+T=5a89ɁQjd)8!53s{SE#D7PԆ Ek yhC2ȝ$2,x5\TJ|&jޅ:x2ٸ.'>D(%lC\BU˔)mC@ z< 9aCV( |+#!$DQէ& ~@ ]BnJې16$2FhC2{Dvs7xV{#e&}حҊ2(pBAR𭄐w55%+ J . zk>7#] Kϫ(=MEswҩ0B~eB2hCLBn9x7$ڤ [Fh']h6F[_rlY{ڨp'B~5;CH<7#²C ma%"Bp ClІ$Fe4a22 |r tsے68X!LF*IV3 Gh'5Ak fHaZn1 ,]PYJ -KE4=!xX?BdwwODFm{l_[CJ6/Y3HC ]GB>e/B:_ܞ)E"bkPF!'.5bBby$ĔQ؉TH׽0\@h;Vb~8ߏUtjLN$X}({5X# 1etFB/ZP6G(y<t8\Mv }|}h߳`B/"킐>˕V*/b%" DZ]Fyi p$H(@D=-?!y28;&S.@& ?Bh`upFbey=`vB[r#D"djReo=ٷ.npIh JT} quІtQ媓ߧON?h~w+!8"t@@%G6r?zB,@64.e4ǹ6&Hp*KhC͔bB<@6df!4BqD'8݌i"t 1Dm6t=8eJB{M'[mO(~8$DWQ{3Ŕ*fɴ!3$ee[X/ZBX'`7bDZFe+zBJ-g .}U@ӈ( zCo  "lC\qBv9!2d:} Nhp xW.p;.i,EPpI܆ ZC 1v1;iC*\a|#JhMUɣ:ќJF=<&rǔ6lCkC {D2-.ic>l +A mRB[d tO祉y;nSe{m xZmHz_s/tw<Z'*RG`-Њ6n@vU9mm=ehzBw(iٱqƩp޼uA$ yke3arkCfk2vkU㬝}U%:ſ Ze4xnX6楈y 16΍yymhXr;O.ѕe4,~OMḧ́Zh? Ӳ%e4B/&2˕a|daw32 DŽ/Lhbe(|e|dn&Oe|Dۆcׁn{:B[:Zy\&Ը͞%{.f6^e^Bn,{Q^IhKGVÓQse*CF' &,rB)OHBF(PJsBy=!,Sr|^6X]{ZHGx*М?,SPvJfQwΞ pY%ZkDM BqRF;J!%c M#+i0J16pMvM8'n6TvΜ$2vvO EU(BaRJLHh6$,J(8׷6UX*z0Dޖ*QSD{BXPB6#䄥oB"C[$0'!VjDE[r;! 5 -**w}r+!*Ӷ&TFЂ+U.!J{ !V9 ԁV0!Ѳ:H?ȧà*-mHe<%L'JEk.7s =CF寠_%ټ4B 2ZomoDWQBMLHF#ja PBLHD#j*F(!Ԧ&$Jh1G+!qJdBѢb~}Y""Ƴ%ԼB3KQB*zPGQ!ϧg<+!SmUYha^~-ђ俇i P˼ZjQ2Z"\GkrBkH)R ;r˪TP*!)RS |U 9g|5~QG }@j$}S a>pUG薥bͯEVh)5$U"qOA-V*$c[[q괱Ƕ"q N{TBǶ2*G2F1+Q]\ 2BY'TkPBLIzZ"׊] TQ(~mi:EEZEhPmi* [cRFb+RFkbkvJlF-0)BϐQ._n.&t9$T$M(#)bz[UYWvcZ(Ue]KF(!),Q!SL_EHHE'#@#^Q=@F/Ee^F҇ULP~egz գq}tڠ*xBF('z) ;^ISӄAUB =dyls+R>i)Gzf[GJ!({FPY*J2yjb}U]DL?r3@ <f$4n3~kYoo42 y6F(zeDp?wm ksw^%wE(؄d9!esosH%x:HeBX)!v=@F]?n7w[xMTN PھڜPo +U].Sn ; Yh;..BVBJN/=.U52 Bpk(5;&c^ΚT!G(W%#-(S %T\{\&3˷u*0z_[w9NH<.9}qAGyJ+ B 6:B_^$&}h=ʏSo"MKs(!,G@[E  ?J wױnM"t /%O'`"ĭ}﷩t}/GQYB/!~1Y*TO4IJX/2 ֆ ߿I=1ӼtQaB+wk{;Ы g_6Le4sRq19^"WٿMIkNf-BBázS5h3z6ZK(jK9 Yg;W{ :'xQB7W[5є?nDq N:`{jԭ E,=!ϛ5ϏreO:r6cD _Wx-rv f{7KuN(f}OKMOxQB7 S{* M [W&x]$N#QBЫkuz7AB[ۏ:eoV(lۨ^lo":n%<9ƒQBЫ'dMd.7$Σ|?Jq>Ԧ2jm."`kR'ۂ0" ϾDbB@MPN$J~ɞ}mHI*.7'zJ*Q8ޔM a&'t5Z4oocpUB-JlRr۸* E %|)!TF=Pm %q:$p]NKp RSФv#E ey0eXplttIPBq~(ЄDgIB{u Me4:7RS2#z𞍮%LAHR$|qT dF&$\TFDr[g-xVB$eW%`u%tx!1SBNʫXIk7&NT91˗okhdM o"t%"b%DehTt4somB"q6B*\]H(S'8.PҖHlˡv=ЧO)UBY67zvu#pGњ!!RMΦCDB>tT mRI O=IFa.||tTx!D|uq03䰺>r{WrX]?gV$?.$d|l:p`K yQ%tXBF[:PBFbQ0!zB2(BHJXF@Q{ ԫDHUF2 7e>9Om2(BXE@MՈ! 2ږ 2z~o1%[_s_zBQأ QC QcTF}pP|]vFav?Q뱇.p*!bUBA;FHe6].(XwK/] M+oCJȳHEP`N:B*DAVNC]$ݞ[7,RȪJ%!sl\ܻ@Gx=~%[Z}BsB7eR]lh*/6(ߢ&gA=3 G64!9ې貋D՚f%ճIM[y =AwA2mR͹ܒmk,NMC"Zo Ah62{va K[4j-btE*= A 13OzdT%zO]Ag7Z m4!Dμm2!0THU1szWp>c!؆'D.ӶҟI8*Uf. D >B=!>5 =JFW<=aRGno T"dT | [I5Q.PCU5PmU5(鲺%0 6?uŒxⲎRKz.LLDezBxmU0J!څuK!2j9`7`[?JTwWQ`op C+B=(hxц`u M- }l5h:%ϺkaR" "!x( V Gz2 ᦵ!pk`6 _oI.'9M#p%F)^:֎A' #IAŠm2RQF=gBNVIZͪ F$D8" g֔m>B aDBdԟDXFNaͪ M(n, ڜ(ZACv¨.B(\:jC eTB\bxmhR=4YA; աPuz@R"P$GbmYY2x̤ pdXۗ$>#8 a*z-sz4Dр6Yf2s^r{.YrEB- 'dx OQ !']bɊԼuʷ!7rw2mh2n#!+m<5XE mv܍ ǷߖPBן9z4N"mm(Q4{ej TePB%!4,r<%ډNN EOp&'zЖ4:sLF@2*dgtم&^ l"׈TL QЬ2AJ-Qn9_BHho>B.-+ga&@ M uJhZ^ARF5) _rJv2!b5+cPfGjn7p.E%ٱe4)yrkYh"BnJ(&\}8 G6!!tlPmgtԫ nB:ZeGK0#S * !ΪD\m „TFm-UQIUŤDKʘPB@|B_#DB&2z$vQg.%~eoB |% KG+˦'Bo]ߟ[Fߢ[·IEșG,/eMF UF ^>PBζDOF!2Z,1"L1>)X2*7:!fRuRe.?H~=u B^AINF$$:}ntFdpo)&RѸO K#w4L^ZKHB(\B<7$QQђ{J|B=T4!'a;!9>JFɉ2K/)S;ѻ ɩdT*odku+e, l&Bz9,SBtUFô*ZIJŸ$ԭ|F17+ZB)!̔fTFϴo|6<%eP/\`[F$2$^7rR.KWʨ੓ B)!̔f*aZfr*j.:bj.&jA6!!|2ZTB2j+RPF3 eVD&J3%ʨH 喔Ѣ**2uJ(!toT d Hz.PK(4%Œ12z]|nWE+r =@ 90 ,Y_Ѐҍ]JB%¬cB݇ƴjURijwN(l )>"MzPA![cu(!ߔfTF_z>>"My$!ZInfBT"XŸxAcMyャO$t6W%QBQq{ԖH3[CG RIYcBn{S祒&J+Ih^-]en +[M [JTdg&QsZY]&a'<_9'G)~8r] ]LJ_BY/ 4nQ7a4gwOϺkLl d=ru0,!C=9e.3?p*r55!?A 2J1B>%_v~MLEb8]K?t&Tt.POJhRBLPOf-r)fK=B*Zy$e(+xz&3kfk*e.n p!JWљ y7 ݳJBNPe6n=(2*eoM9?o8Qy-r(h(FA¥ߺ* D.u>5F&#T) d,,YJF_UFs?2r KsUXh5*ы@ %Yѷm2jۤhh-^7SҞfrshPBh?\&2H2}'MjUL8z6dLEKDb|BV#x)!422!k6k_s&-q S)-wu-EB.&'zBflBN/35)58h[_z@l#NWQңɜ4BCBv9NC"ц"V2_;Q(6Vt4#f$Uda B0&!j&!J`>gR%lmସH^y}yY>Z1Mݫ 9*!(mBsZh:Upg./m_VKX y)!Ž!$&]|)ټʅ[X.-{*S}bu%t m,h?#uhBb2T3g"o-4z_ mQ/_N-B5f#{NDI~_[7\^|"5*OűԄ.U3Yr{B+)8#UFNh^5>WOIPĄ-Y4%Qׄv-gh z_)fvS[Ly6 (!{<ź+OPrH yjNBU,cJy*ȼ&P2Մ%)!L&QIi3ɺG1NwgN+!,JȄg81Ќ2:#uPYH&.TBK%|dԐ)/E<,V>L ኲ6W3{JH g2J M&3O3nS{-hn&,~ ! }`O3(%ekt@,0(v+Pθ:M =3I^j1Ә9O9y~bϙ2&05!^)"%POd2Jɾ}/'a\g=/Lj5%(*lJA2JcEnňlsx͗!Fl>NM ۣdBB?uCE|Q C DbB5OƔPO&6)L9!Pl-`XJo"SBTgɨȓ[)DV)-b%{} :AOF@݆%dGQъ6u /3/UǷ-PB QEm(rmhB6-!{<6(8bx `/"+ 흀Y UT Jh7mWBxP\p/Z~Ra|8JD&I|!5q6tfU|ʙ&+oE,`zה}߉1ޢ  xLzB9N럖au}.LrϡuZC^CmOQ{a¶}mRȎ]w 00^I;M))!eD(̯0B2Z\|2tH |^{1NބPN>_"!FWQB޻B2ZaҨeW7,9t.-^ snTB^u3!lBF Ih=WFK,E d*ɗ̥FP^!SO(|;=!H( -hYhmjt(bh%!bQTmOBBfpB2ZHQuBCџ8/@FgmH(Y)([أ YE+=mp@ά0T"7"h %$Bh_ M0ȟT%02&1v33TR.$htN uFhl-k%.?PxV祉JpַN?[Ḧ́D> -zvBFt@hQB٦-Eht-.шw}@e,?Z)cPBlB&H)>"z8J㦅"GQ 0 GU|*!U#B +M&5I+b2%smDuTF QB:u]eTxL}Fou83lu< 윕S<.ROF'dE(&+lj.ɨt=`͙Jq ]5(XJKB*a.{L@|,DT /ǔ[ a/9MT rI/bHn݀Z aO(Xw N\t ֙(28VB&[T/cwy8~R*թdT"Xkqz#W tSŠ3 gBt+ Uɨb#wsih5$ڄoIメa<mH(ԟFF| nX<NkGm%߁O+tZEi:z!w~S*JeȦwOG]ܺ2Y%r C0`} jG)0r>ftlj靦LG|HMR a.9@V!,:BQ:"cY!'9fJErNJ3; "ēQ3G8'Sh4-;& ( a2z-! Yy>8Mˏɨ^ :AtjS;NLG#&`%vK- ONU}?OȞSFrY6턻IUguT p0!T <؅goe%d4hP$>.#̃SZ aey` !AhQB so\Nh^f ʨEkƁ?͗ 0c.] Bne''tzdUDdSYx/Rjp2ZTț&ɷk©8denm|eetףfPMrǔQgQTK4DMTHHTfB9!6T#+!{g@BOхk}LUU%d4VDB^% 6| adԻguгe|ަq&!5Q˦f՝<(&mRFu%2JcI/;*kmN :B60$BEm9ʪ"WFCkCxvu(mDqZ:B6GydBѱU!{<=2zt^wM(aA% B{YB5$iCBe*J մ!{<١|a.qsޞ$?(ZB&JVZ$Ԭ Sn2z#wYڏG\be?dl= t^; =U4t'sPNEڮ#Iڎ\%R6PnAExY(cPuAV[PFE[گ!nCPbB2|Ħ"k/qXj1PP"TY!PBEW'nCab)B2MT%@*%-XE$M)BdΕgPXv<&8$8 !qSD'SͻsBCrz.c ېGHD n( ΰshu=@)VO`! ąv@Ƚ MH [S? x`<eCF$R{U] s PGȻՆ$MH 2jʫ-df'.DTفʥfBB^Yk^:c!r&kC̚~'(Lh64ASyyıdT[y(@#{QJ$Pt)6ddTєCbHU՞ȜImPd@.& y+h>SU<^d '!_ ?Wщdw2ZT*Q[Mc @axr=![ ې8\І /%r y\Mha#قxe;g.mأ్/U>YPXQk6װPsB\E(!{T"B*:!xoyd8b5G F#25ЃeU\ Em0_w[.Ẅ́ ,2znk#|z0NCFQ5R烋퇐 d#iC *B20oNfTGŎD\A׆|@"-!^P&^QTF,['}E5=  @ن /Gv. 7C(脓c8BW؆XE/ ?RF f,&Jcg6H&%@!N u uIm(r\~娗ڎQSE#lҩ1lu ݃q<h(YC'&ZCTBYNjB/Jq*EYDYvM{P#Ju(!ĭ{H气q0=!{P 'J`B<=WFK݌I u!J5%Y#B2*3KOȨg5 )!̝S P3}w)K a&&,2f{%\e(M B{Ȩ|cV%Xt%r(yrB2d>Kk*Vj !fE@;JsX hzBh;㟶~] 扟4SBA'~-~\.+#6 B_Iv%{!*']F{L )h'Ht%$|!2'QF>F ;tPBH '[7z d4 ]F[LnSsXQ] vL%Z|BB @ p]="lvfm ZP %}`A5ZL@F%Nh pdt Tԏӷs%}%}`QBIj Ɨ̍z܃fQn2 ]H(NMoNhx}0Tt?vK]tЈ GP>jt9h%" NhN>~|8F̥"w?DUB"D!>DCBhf6? Wy'D)Bֻz,!"^Fk﬌6J!"B~qB'4&ӟ@;a2[_yZe"..Ȧ0P^6z5[2ĩm{JгcLBVm:B-{2j7xyx_דHEZFFp-!dkCh}xnJBfxB{2( p'2FIs?^pS5zkTqme#蕄SxIB{(F%z[UD(!Uֶ/ Zoœv mWP 'ĮuXJ#D(N:y3/)(۝e4z̶bMjdHFOI?߹9p5"$:z3挣IHe4ˤ۝wH1ZXk:xowPkHJOs w7RJw89W{˘׶|:~\spz}Q4(!J^ HhP^2>Ŀ 12,(2jWj)Q%*M aֶ;0+!a9Q26s*z!Hus*1xTrUAw{>7MU*{o0%<)#Ĩ1b-{2Q piLo7{r**HȭU]+_Eg$jCo%Բ .v= l8oTQq^Yr81TtB|j3ʷY .ɇ~q"9ړTq+3~{A4!@h?&NnIX1%! MJhx]6;+Zu0"4x#OlCv.8s*…,{0=PBmRBE aiP&$GRFo:mqE*sa2(jqx+&tZM~(./DNFс_uz2@ͻ@MJJ?ZFmJF'ߗx- +RoR.}y|k&TXdT Y{l_]|R{zʙJNWc0)d8J͘v!vMH6\mH"-4PTYL6=5՛LU\ݴg˒m sKЇշQ~5^~\64?>+@B$4NiEGQ6 fzb{+WQys?P*BHCŽP>s l4b^;50u BbLq7BIPnvO˻!__יeӟ#O~VTч$]eCBE҇肐F~t*]s}35=K?#&΂ B;|{bP׏?F ~uIZۧ$mՑZj=n=J}. y`F8$ $!tD(f탐G7*,'qvP_3Jb $|vAf?ׇ~I Z9=7nK +j \""sF; d|qOG=S_:mF /nnN3B il‹%l״$jm&xm"E,GWB_R˽n7UY]tHGF,(uOxBV5poKk]PLhH0ÛpBVLhp͓NJiuIE%4*oQIa&ibn,iViqY$Dh\-m(#/`ł vʕ-j7¡6Z:B y!I:6*ƷP-v6-GkAHQQ\,$ $HIutK !I:И6WLvEȴOrCt AmTXl..4nx:]\9!IFWy+*p@%$l ʳ9srC>\ F"4_t_;`zB Cz&4(AHlb` O$ԄQGءETFI!$e<3!lԔkܤ"4ǽ0YԡE6BR`Qw)*70E"!!1YQ߱L/o $2'AHHSAC٨XDm!7㒊[*FۯD Om"2,Ȳ2#2@H* a&m(U Tں.F9?lhDՁom Zt3fRo'[̤!,!yuLFM:BȻC`hJ24F =  !$%6jP9~!Щ4Q盂# ړs67eH6j}T9K zHAHUV6.w%^S*FUnGpK&{ݤgPYGTDh U#<a9uR:{߬0aDMvˎ^RY+2l4K*ϱ_$f W8F+6/Sn ݧ ql;*>фn6›/|qI4#Bt* QlTKɏZ*/1!NJ.nƋ06k.܊fld*A(JI*&Fʏo]{DBYiJ!IXe5}$m)6Z5%!L $鲫 {.jcz Gƻ<%u]BN.:i.L# $„|\t<{\\҄\<BLEѪ:9A+uiB!Q&ب=B)z"Wɇ6f,䤕{ Ke&k2 aUeYsmBb>YAHIp}%!)25h{@XZp1*~(?zL$!BH$dzBrn?B#2‹\{a|6kE2>!cvE6z^ KBe!OCȘ!p2yب"v^3y@{2-[u5,!EChme);M9&%3=}m?QK51CFj&#mRzJCR g¬OM/6CR f;$h*&3^yxB!ЄF <6zBYsȄ܃ ůdr]PN%PBiuAHLҞ6y̆jd{7P?Щ$M[voϔK?j.:<t-B>G b}pn^7#$:Wԣ+ZB#*F iތqczJ׋nҬG@>͕&A㷻;&WB׷Qam^w?B<ٞGLNͣvPHC}Em4e/1Uz.~ !P[~P<~ 1%d=-H^wBR?:$$9Fy{ϓ8ɖlb/;̽‷4YCh'T="BRDB'&4my9]T~FBEʐi ͗#!q7SMU<.6ci9/̡p  #H~ZB=(B-'f[%F1"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(BcI7fIENDB`gstat/vignettes/figures/singleStationTimeSeries.png0000644000176200001440000005170715060550314022404 0ustar liggesusersPNG  IHDR=Tr"PLTE:f:::f:dff::::ff:::ff:ff:ffff:f:ېf:ې۶ې:fېB pHYsC IDATx ۺrw;iOIz&9խy/IP<"xyNstP%'H=@ `O{$  'H=@ `O{$  'H=@ `O{$  'H=@ `O{$  'H=@ `O{$  'H=@ `O{$ ~}k#_f~+OM7qX@@>{>Gmٺ=UIl1.`r1 (=c=U_8d{d9N-e9Hcx,O[̀=`XjK9p|5cד+>ܪ ̞>jjͱm1=/o o'x{NmaJfO},MniFT4zN|0k?MN1;ݲj@gϥQMY8Ce/ѵGO{Z-wmO]|`n'sfzd9qD1vhG)y5s.Cw3S;{=%FfQǬ2$zJOnɞhӞhztR{ȵgO3 C=מzE[ML4y(:t,]`ϯ=t(ҞzpIl3;?f{QG s­iOzpIU6Wo ?ikO&ҾdO\1Ҟp#'ړNSϞӊkϘQ#wj=7MSd]gԌi';cB<b[F y~ -G g,M^ӝ-߻E&`O vԈL/I5XRܼ[ӽRS/^=XRmeú'fƒ;/f뛄k2w qF'=6/xf˓%ԤŞ?{R;ԩ$e)󏞷rYo2x7`O ʕKMC3|f=#JwG6Ơ=ƞK7s '{({zñn\fc]@gO̻pĵfۓC]=?إ=UgA]95 'H=@ `O{$  'H=@ `O{$  'H=@ `O{$  'H=@ `O{$  'H=@ `O{$  'H=@ `O{L|43Þ?>7S,e ϯA>'.D%,4kY2Mth{>-#8wrr=}oC'8wrr=~1mitkh4k{-%=T!a"\{4k {ѣFF1+Ig-mOX#NᘕYKLسg }7[>C#8wrr=>y&dYXYID˽}usO\~8c⧖3'\ƌv,NNg}p NN?h~=bVf-1Y '#Y1+Ig-㔥;yYKLسNaϱ3 ž{Ĭ$Zbžp{/],GJҬ%&Y gpq.g;8wrr{<`O ˹L^UJ^s3{h4kY},s8cVf-1aOؓWj#gNK9z`Ϝ\ܞh4kYgܡwP9aXI&-8 d1+I5s=;_橈ln]zkIcXN*,쉘 gv?C59R?M9F)~,UM98Ht_^T d1+IUST{|GSk+踢9幸=2"чz}|4udNݘtɊQ :.F{ =|/fW=KbVf-1k#ij?i'cW&. d1+I3喝ю ZIQ Z]9 !Qj{ۿ}X#Ns B G{oZg{~NE'=YIĬA=Uo2L+=U%7 `y9SGӶ=gUݚڞSt9ayow=i-,쉘 ˵FsؓuϜ'YIĬ՞ З# [/5~=u1^7'PѺ{NLhT;kOU,Sn}4elFlm0ٴyF'Z{Ĭ$ZbVr1M}m2V9nug `O퉖1+IUس'b*$Yس'b*$Yس'b*$Yس'b*$Y@NN.nOYID˽`y;F.:ח-+<7|t%ugu]E/nOԹn1lS׷ wF9 .n˖[#=O4kY=_Vu9}au}yYKܳsa<.dv9,t΃Q~q؋o=k:܀)TuJZY1OrG{\Xo~FܙKd+?Lrs^6}aO55?UPMK?/0^=K{"BoL݆z^ Z}6ѧ׳nsHϹ>8kg&#uIַ 5Cgxч~D |tGՇS_~:=tFC=\G))zh{ϖ=Z1'#;:۳?#pN';n6\;g9}=瞸l$3t6_y4rWbO{&;< ..k]B iž ؓ{ 9(҄='%lOyyBy4aO{x{JpJ |^L ;.wP3~O`w{6Sz]{怑g|#绰faAR0а79-=r 얘ԖmD3:ONFe6_y4rW=68;D ErP3 {*`Oiyn<=,FNT0oTc̽aɞdO8=^T!hmS-gڶ-1~}bpA1ϐ&Z sJ+Ԟcuq=i}{ iž s{=yNFmў蘩A!} s5|SQLO-H)ӛL=?>ž=}jT{z-^~ .ϭk ӿlϟ_L[6-T{E@ (ϝ}nٳ>oĘEG1'qq{{a2lTlkt%eO-xCEL:-w=/>RSg-w;Od$ױg׿=mGb)ݞy= y۩qLE}}g,e@O^%T)f1\ZĬ;: Ǟ"{*gKgԁ=jLz&|4ƌ9 {J9=zQMWj?_0'$`ʒ9˘}Խpaq)fB%!H ܿmvSxr$6eLznϮS=ppʡ {6{ϝ]ygGeȘߦ>~%_3btN?]iY<r8=}noN9'NcooG{O[Xsm*-c|9:4}O".|m%ӑs?W5x=v%Ӟ"I݊p)o)g(amV)u[==#q0Uϐ={~yz+~؞K3dO2$;r %Xd!qbz=g[6wxKH7//әt{z_9c c3ǎduo3=_峧=\Z~{D+1g2=P,m\sx= {lN-Cw IDATγtu~Etz{N{F=3>vg`{ZcFq{GW>tWG:o+s^UsbGΜWBnRgO|PJq륯6ZϤK2ši_&sWs}H!ٳ >ܑPɩjQmÞ:կmG_FJd j{xCL' +K1% vq{rhzjsЙr{=Stbgak0p7`WXmT{3ώ̻I=\DyyB;$tg{{/8='\{.Şд3fgiizѬ\ʝk -ԗA9)8VxЖgٺ+ƞnPFFO;K'l 2m\g$gB{O-gO~||5>/t۔}TTٳ`gpY8I}:LkW=W)Tjƒ6_O0n !c1(b>Iri>=m̝Ѧ!+={<_fn}m}=KӐTxĽW/z1rLN%Ct{9Gdav{Z;P{jy6BT=}2ҫUgͪ~4sz$ۓn{٦^ǩtw$fg{cj}l s7I,խ*UbOf>ӈHzFL0}.Yĵg(hڶzΞaޤ.ŞǞqy l15h@:Ak4F=&Y Dn%[Ӥ-]0|n= KړV:g;hZe,Ijcy ۺEii74S=ZP绗zz.lkӆ{,(Ѡ{dI1%a#r{ޓU",">[g#iqw=S&ō؈ Z =Qb; *9Iܔ:+31od<ʞ橞؅9ma= c8di-f }ԉN=LgX;ڞZߞvgbi5b[\0KFu*8̞O QUNbOyy{5EA'o `4F\¥ZITw{;z>csk乷QtOX{1=3qdؓr!=luX91JsDŽ܌=}cϾ=N(9iI2_N' ({F5ҋ(46>,՞V՞!͞ϝ(ޔ[w'?ٓ lǸn4Rd[sx {&j$ ozF*]i8Sf8T_JiCEoϵFx=N+޴zhg}+ϞyslRX$/>X {ANk9=+;h絧awWl/*Ǟ˸!kjCafDgݺ?Ϣ]_KF-H^֞ʿStIχnޞwiF $%y-s7ys>*: B{؞OAp#d~m?C+ 3gKW/39nŘODk{ٳ%j7fVt[jNʌiEɞ3CssS9ks,1`A3SjnzeO!}ٳ秉IӐ c8j|%hO^ъߑ!{fbdsv= ײ2WeҔtG\33=5{g=ln{knQ>{ƏpRT w =Ub7q뙇ʧ#O'[7 lXC=gN#.nOE9&)H1=õ>'ii{?`Kl0~D<$smnjx{FH*?ZjO7:C/[&K}e%;>m:C=#H+z/QL!/)f = yn8O$L1-u|#joyW[*&_Nh,”ѧ&$'`/{6{} [sy;J[;K;-]w8oǯ:q*nie޷)2yVIȱFo3n۴Vױe? ߜ~ƺb U.&ۘjXXUz N\N ;_ľWgz;mVkĹ ؐnFF1s H5d{ g ;(l)Q~Oj1DSe^Edh&ɞ3`O]? Ӎ8{ Y/G(%eGŪbE\Q̖aϵ6$T>Q _@'~pP&١L~q=c͋ 3,萈5gJY+iF[[6Kөe;Eݷٓ|p0;}gU>=9u4W5I\*[XEd>w'zuͭ Gmq{ۓ,iψ:mOP T=}tפ ֶh={1{Pîzng,lHQzNŴGؓ3nOZ׬̭_*?_>]3m7δc3=ɕ"Ϙց3G6:.ӗigOxNc==g=c9j=1=-ynqfҬz4%MY_fv؊ayi-v|ű|wcO_bӧ fbU}ʿp?ΞHOHHmm~䯏e>(!eṈI*$M:=A3ٞ4&٤I=ӕJ>Yq/:Z=u兛~O+1tr\Dj;߰VzGbʼTyt*3Hsg}*\-;Ӯz¹b͞2T='",hϨ+^h{FtM`dV}W=aO [t~b$THȷbuT3rD1\*V+{[st1sl{?:;nb^bbt2wGBΓTc D<6ډ)Nh5H{΃I幄kad5lϥnnƤj,j$ U>'^]t(ؓl'S:>wU ܰ6u7u{&3c<9/nؓ v&س_Wh{&RTiU$Z"{37t/ߞᕌ݆6{ ){ObOsh{҇YIwmsƌ•OߞƏZg!Wѧ1?gYe9By_-NYӞY|SOI1Tj [JX4k`ٞwVh|o.K$P2yv՞^dvDUVw[F5̉Ua{O0qn{g=e2aZ4;w\Vm%b={ᮗLnJZ opݞvRnOj~J6nÄb=]fuu]ynYI'?g~pDU=WqL v:ֽCa3IS9՜.h{*B&Kpg=㇍Vwdb=g TC4ٞ;]LoO]'Vƶ< {pglsxTnOz5ŵ uŶ^^#iCsaތgw14NwUV{Oazسi,ij%؞;hH}Zړ9(,`OP4$ȉ |7RԞwL)K<1wŞ[T?CF)\qgsaV3"93p2O$>lH|eO:&$g,F)6:{nlDgy3a23_0r"ڞFݞt_tf|bԞlTJ V&ՂdJKd %=ɞ}ԞS5#۲ڋ֝n 7N W=)KKG]ö5ұqMg=Ϙ|zNnOs;$na]{&gX4iO0fy. ٓv> B} Ԟ1i =CbOVeed iqPf峴=e8LyR̞Kcܝ/$Sӟָ&kPzž=;=[n,tOzMf{No㫞e{cpj{iT~{)KђPEQ|#vTΩhFHȪgm|43Js,bۓ칭b-S#g r9-nKi#: S4]n6tDeT>=-vҐY?>7s1_ȫR{U=^aK홵fgJ=Cg{*WuZķZ ϯA>SZrf]wL359Dj؆I ;}硾4Bw#3wsEaiT=waoO~rA`'Ad{ꘑIUr[L}g{L|۞ߞ}h{ ۓsIVjO>ێ1 TPwg>|}|ϜŮ Wkn}3 l~5N"xRޤeP Lm^@Ky'8*=}ZJkt42z3Og.g ӖM t \C@rgLJdJVd^mϻ0餯v7SܘWUO~3Q );|70ې쌡 %q'ߔWr_0=gg$Vg?eX$ĞYhOfkTtN^Z !70W5spFW>JN^- dhB 9./0ogGQgfn_I+bO׳=:_6}CjL=`OjΜY=IU>)YzRxdϸOIϞ:b{FwzWgO]zt=sħzvEdmO]s'ʭzs{[=_JΖ_#PЗl!Ghi.^[!\n4,aO{Нk!`O|jώigD'yCs7f+-LI&{Cs䕚AO-qNPO 2.ɒws'O{1e3 X4q1Xty3nֲ'DޖV.=uՠۈߌW7JTYzVG|UNMrdSyy=;gVcOos:ҍb7USg{#S;۳~[j}}]ߒ^ؼ8@OL{t!GU׵ο~\c5>1-[?[isוֹ^!wp:FAc1۸cp= {ʋ]i}VyCUO)ݖsmy\ХŅ>juFmhHog yk~-=̍` ۻ6|YV˰sGrat 4#*̭pa1YYZ-{O}q( E5k3S;c}c#(y6p[ ,e1Ӗg>#LU3ƞLmS{9UOghqFWN7_Lgg NGNq./1bt|<3<t+'W,Ny{S*׬VZ߭ >#wLxR0& W';S߸kM)yjy`.hڼֳFzb:%uT4*]Rz=-ws׹;'_/S?=Io0zǙlt[$Mw'_=gw`hqq#L3q=!i=< nc\LK>|78j9I2Q'GL{y߲qWҴM<7KLEZbܣQ>p 3|IKdHRMQunŔTkKy:-n8a fBy=_nJؓ )%KΦQ>Mu4<6O'V>ړ9Uqmc=O7~==}lS6LF<!n\;k=<1au3XY^sgQaNf{D$"Mvd*B{'ăы3bҌy$,ExIY|&䘒xYly,3c)=ia9yy[*I\ p hKF|2;m'n:s3;$w%\mWj!i]<ž6 WaOi)49(?w ՜ЎlcLZ}!|iaoVV44= sj{bϕSZl=:\x:4{۳:+qjm;X֏8h:Yf{i͙=n{CR9zyL=L uf{i@i?+t%;ƞjwɲ$xS@ОCީs.Xr?Zcqƻ)fggPЅ{žDJEx,'nQٳP'M`&MҢyvbBjxq{͖$iu4+Mv(Ui39Ds7 HzEUߧ˜!:Zb%$QsOY3 e/VI'}Jy ݙҼDJҼ[sCyA~8cVf-1+Io"{Js1myG_{^W_5KqV nel>/O+a6UsC6ڟ>ޚ<ؚK?VWZ0fsH:*7ޟ WRg:GˋJ\K_hO+C|?Ef*f<+-yk`n!)pP|U{==,|mqc1|Ľh=7$\>gɛ)/ƛp}2>>O3WCh<-7pEs1[S;yT2tfOZ~X͟i>i}GjRJ_dO;GcNbzV$ *Unfzl͉[-Cp˞CusJ^OtCN8r}5[|3hJ\Y%K/.=ٚy55B=>i#{XKm_B{T:5_^$}͔Kߵcrؽ[Nf>4O# u=N|yjZÉ(m&5yI5{Uu#猿Z~R|=:lYM=2/VH3n1d? Lio\TO_H!ΟIPɎfsҊ1[?Y鐭)ȓ&\JԞ~O9cin͝!)Na }K/Ao[:<_KF'Q|=1}J27ȟ穒_ϖ!՞ Ζ!b9oMa[Se)~2 =UԱ;˨wCPgz 0//Y=3}2'CVS%3cĜ'xN 9yǟJ([S[s6n}de=cQ*,Wl:N"{=//~4{ߞϚi%eJ[7!O1az<6SWɚkĽr;j)sIps_s1U>sn-6G=31jEӟ>7}ElI׹;)&w"OvHo;'e}yYL12[&)Ix7ȸuk }kk*2{%̊r΍6q(7 N,}3wD \{>cfI{<>Heh;VzCoMIGlMzܩ(iO\68zgSe=//>-kVr~O~S{VeO߲`ysff7 4xsry6)#J0v5 | #w|=׏OkS|?ENSAU2 ojf{9hBLPUY^cglquz|sne`R[RMfD@;s2-$ې۶  C`) pHYs&? IDATx콍IzU{朜92bDL%b$$$,$FeaH .$127Nlx ,pYޥGwUS]v=~]  ڷQ"AEF!B  *0 AT$` H(APQ"AEF!B  *0 AT$` H(APQ"AEF!B  *0 AT$` H(APQ"AEF!B  *0 AT$` H(APQ"AEF!TQAB*e%j(Rpa]~S`KF!MB4- h[ 70ڹ^߹ϴW{o4VWG}j}hqK\(}5}2/=zqK\(Ŕ8J%'`sĊ@o.AڋntFuĊ/Vb/UW[(/jK?P(17_o[,D-WMZTm~] 29緖_}1 +&OWiG"YmOӳaaMҭCqiy o1'-ƥىcTu1GtA41jKy<  i/J4~fxŨ8ySKNLFjFvC4Jpcs~7x5eSo-DRDm1*:99XŜLνKkƯc?4~fLMn=1 K^ z7|o-DRD1*pO_X0:Mޤ{BF9M4~fxt_NLF[c-_WJ | ޸2;Q[&M? 6MazksI)c/׻:F6[#o,/]7)O  3aF=Ge[o\Za5y':H]Qq Fb zd5Kk F݌5r"raT4y DKIF0"Ќ]'F;Jz)MK]yj6atzKn`4[.ʎ!q01[rBMob,J[۽tot62|oT<߂{9#+ 5cFӱQr-㕘F4DKn6RojF+z_0Hup 0 Yj3b#y(,ٶDMwԦɋ+Yt8~HFߚF2;QyIk$r0?@&0r~d+x3"m&nڌ'U*'cZbgӯn,$)hc?-'QolRf'jQVmnm31Q|[RJ ٭ 0 Yj3UOLR0<:>69J<5_oY~ŲL}WCḺʵfW~Fy~l,>TgCț r%7caQ+`tS4_X1phF7Ձm=4 Tw`,`tS8ށіC?MuxF[j:F!ZH1JV (C~S`KF!MB4- h[ 7;,` o*`o)T(D#RpQF~S`KF!MB4- h[ 70 o*`o)T(D#Rp_a]~S`KF!MB4- h[ 70 o*`o)T(D#RpQF~S`KF!MB4-J0 [ 70 o*`o)T(D#RpQF~S`KF!MB4- h[ 70 o*`o)T(D#Rpa]~S`KF!MB4- h[ 70 o*`o)T(D#Rp(01 Eu*o)T}χY[ 7U9F߾`+Rl-T,RpaG盫!}su:[n  orNzbUgmbMEQ޲GP`KJ"q\iMrێdZֺ~SlvgξCzvf˶:kMu 0z#&-Ζ 9a[_U:P STuovV]EM*1zηG6(ʂMu8s1PtB=VBbo֥D;$TG?7k.*us嶭d0 եPrT{6ܧ2iz>0j5&~o|mk\^By\uƟ[btsa>,=8Vc:Fӯ;hKpon~JݛΫ7 7F=ݖoV熜=_TWU-uS•~R%~GkJJw{ >ku!vPVNJ>wٖzo3R+3)mUpze*e.qwwU輍%U`.;Nu+ΪsiW[2YP>j!E}Uԍ%f˞R7UnQ 7 >걭r'@>a*P:iK7Q]37[u ?և~9GhhfNA؟UN{?0gWVi3:hg`4gOᢶis?naػMe?͈emؿNjY4n?0ZPJKP^?0zgFm 뻕?{py -fۙpE{=[v*F#R=J(oЖ6H ~4~ b3D4yt3wBSJK։1չʼ os8oi홳hɟQw=Lea +MQ,ܗufĵ] vDX~ܱ-Fm ;u/b(귗cw#F"1we8ULct%o 'D *u0 ^A]^tO B TfuXeh˟ѩw**NVPSkTV+:@F/נb5˦)״m4~`yWWkz\`IEhUmϊQ`Q-~R7ݟ0zHnϊѥrcU8ܟ1zPolnAtB6=@F)J)F5nK3iwD&=@F[Gf=҃ؿ;xQ2PߊhoHpGz9ke$ooAvdaYۣhgǨ\B"jK?O4aj;̴*4~`T|Xa(kBz@QY U~]Az@Q##)[푑C&V!}?߄h͞Oܺ]1*pusBۦ{QF5ƃT;Ro=RO @z`i \m&Ymn+B`T%v{~ qt])-FNH70-O?0~tޗXyяu6}H5Um'蛫U|%|3|(AMG8(ᄃC_~obtiqzR|~̇||?*MɍCqr(`4ྯ_~o8Zo_s;߬-ݏzFCK DJp}sŻ4oFtw.ڞ[{qw߱M쯺z5~Fmu;@?E%VI@2<qt~FSQm2ust'?ݩohFU%boF1݋ [ȇGOjvu ֋90F}-=1[yW p; FGSNM 5 oL~?F7.ky}ǬFGhh4FC-K0٢?hGڲWĨg؟Yksc(hI${7xS>:G#1*q>KRT ۯYHFͮ{.7.dchnuK({:_@_}`,ϊ`t a4=F5({b (U粟 FuF%}|tbbR/c+h$GOdU7cT=:&qustf!x5L9͇hwߙ~O!Ǩ8j<]9z&aWt-thzou;s3GFGw#4~`4eW"1٠] dR&a;scTa9zD'Mږ7{BR1єI$ƨщ+E?c1/QMݢeMhooSF]8*at䨻r EbpKfx:[n+&v-7]=-0pTǨLQ>'9z٥}?Hk11::MS :ECw/~sB}z*F S1ʧ=7=Oѷ/G0:sĨ}l{{+ޟs5\4;_ш6xMhۻ)F'1:qTǨeǙjNz' Z)JBs}JE0a?0Qtt~I$QO3UR_ν")-Nm\Me0#G'Y۞|D1р'hO?`sߟ9*5m{ a9n0t2"¢0*qTƨ@㆐Ǩ x)#G%zMA_8δ I$ۈQQ>f=aTh~Mg$F4~cE]0⨜0L g=mѮ0zïj-c6"х쑁oGY[äצwυ\%W]w^4: b4_"1=`trL@Tfڜ=afEwq솷$눘zctype OĨQ6sT,6hJ0pT Lz{z-J} G9FW *%+(7iL!]q߂QEڕ3@&4HZ8>-9Zbzy 2*؞}>Qѵ+eOdW6< ]`0=>^h?YR) Ś8:bT(ǪQmR dbt1?$-t]b(oIQGY6$IF 9,թm[[Q'VlSIG]ct(cT(zr"kRÍ@F8rGw ^胍8 FoيQ1#T6 *8`t4noٓ n[_bT츊9(:XuQ6QqBvt#7JM1+ǨcOdt-/9jQUMMFlVj0*qMwBmm~~~> n -?sQ+{&GUrz0*8N~dkQPGijQ8*.;&F?5W1+Ei#F6K4FU>9:|ճvTt:F]h~F+G%JH=y(I[jQSL,Q N *h}h\翌oatQv߅Qt38F#b98Qy^c%Vu4Q~ |tsmF%NJ]0:p0:pT28F#bJ0mN ]{9Tt}+#gQbtS`hՄF#up7F-{ݱ[1j<7Rn-&8"ߓE59[G'ۘLQ1gAڧ0$F w:15GQmrc5߳jBk FbtcS|ieQ)稽SF)3-_Y0:qtŪ<%2(: i<4G˘QGmA:>[㑈~W|](:qTsmsԅэ9 Rn/=V(ĨQ'F2!*D59 ҥsA}odtb|6uPt[hTG5V:Ү{0qF`Q'E5lQ'; FG9FI 9Q)zON )_{^e@pԇщk 8:Q 2DQW1tTp4Ч `'FK嶁r ?FUZ0 bj;)jt N{m1c00RtIQBs:ߐx{:23]0GQmC42'FPCR^3WY&G(/b*c<{1A꠺w IDAT#&^ \x;(:Ee.yu2_Rt;V։1rԎ_ѩL[0r7xNH-ǽ*kNQ*&N):a\,r$|"0ѭ8 n,Gh]#Yy!frZeèyxw Wk<Y$FׄT~Ӡ>̤pTrd:(J-U"y^CBCdcw6aTNGG:Q*L娋|ckZhCg{qpJхLF/0r}a˙`Eatd_W飨$ (at0+FUǼ5@jp"k1:_lǨOL税QE?AJN`t[@D̤徽z:QHRiH ST娺dщR_ǼA~uרʉk* PHQϤk]9EI S? rtԍϘӷ3QQEiRD?FG/.g|3,Q}ƨ EqB9S: S$ |9j))0JmD9,Q#Heگbt\\DOm[V )2FGN2HӐsYeʟQoA0 EK a}˸fY(:h(uvW kW RAQ GI-׾f22q_YP`vۨ09jb?\騙Z;cH' F:oJQ rԑSz)KGQH蓕#F- (0*e> uRt> QGO:AX3QQ_2*c7vo}`TNGsD$`tEKMGs?\SQQ Eg.ɣd 8Th^ٌP~Z6VhBA~FctgόJ ;F#`HFhwQ?FSGX E२;hӞ~W- (cA@z'NW`v۸"1m- F )G$㥨3.]| G 1*wYOLAQqύQg:ڝ8TaÙKQ* Vkh /GW~0a^ +GCɨڂFft@Ĩ?EWrgB+Sԙv~FG% U((?~*]oO}K=]FCUC̃QKl QG d陣!~j{rt_蔐$&Ehwľ=S*FGJ>v5 iEm-Q ')05Z.=vg_U8 2Q 6d+{0NOl\F)b1jpxA)iɨOc8.S F? `t W1cthV2*OH ΌсFi$e>J()0T^ޯ) rsTh|G'g#[#vߞjmOh`Qc-9̂x0st?_ pt$Qeѵc?a6Q-$X5;ϘckW70jKGg} ]Ş٦aètFoURR?FTE1?Fş RR2zb^`WD^G5j51`ZuHMɨQK: SbԸ3ẍ́4> Pf_QsӰr2 +uVo>rᲜRةѡ'z$Qh+zLGAQM- 7 F] .0o}Tҹat/gQy&`trBIQ*GU8j^I2¨F1r4 lkd4.mƿ~KzDRT(30: GBRIFokkIsd?G *èjy'%1hO /NG *`Tߖd4&ؒt Rj71*?3bQ)%LFm]eՒ(*cj {FQ. =2/;%¨9ٖ/sƤ=[ |31,*]Hj8m(0JmAfy¨xcoFr g:jbThBؒ&'蒘 vQ)X4E,HFmKZQ[:Ycm,' s@bQ F%z77(*N@2EQ#A,QQ+Gw]$$hEbTNHCѬ vFcthZIpC0 rZQaZ8Rۺat}o7@^Rm&SAiިW@h.FׄԲ, 5f:8Xh FWZTh 0~#$ N"F6Gy$$DQFg6 hWct5/oǨ `2hdKGuU9¨QGс-2 - c1%1 v~ƞZcr|2JGreuIy~1ZZQ F:1z_ W 喤qԏP8{{?C <_:Jx:7QFwbt#$Tk0Z10g1*sgE%bsԚj-1-mkIqʈwxі.cTp4x( FiJbv9*ƿPT?`hau6([͏c3%ХkGܢ8QN>Yl&GQGљ~]'"OFQmb&2GO,JOhjLQG1ju!Q]\s`tNH-騵 VQɨQm b59btx 7: >jtK 1*8`MM3HZQ)U"Y,mAI%`hF܏JGGt?G^}q:I Q`|ےX FuaYXxJGe G0FhF峨oq?Q&z(#GU(7 RFۖƨ 8僧bԝ1Fєp4QS8QQ>9E1'FaxNԱOZŢ0r4%#كt8 Eg>^RMG{ dtT({β1`Z3muby<(K6aT{8'DQX,C'Ѭ?m#f1st~Q``T([s${9.E%`ThFs@jW?k7~8 id--(J̡%sQQ¨6?`T`tMHg*dFQ#1r45(1=FG#1g?n/^QF(;GTJJ{^[(9eɗH.M69U@Nq?=縟"ħwL5 $e+< o.W0PzbFebTY"a%lZσN̍, YOR02`|䲴/ jR- z(պ(.w߁]\Ēk<G8 7& M9Fɷ-.QkcHJ9у`TvFK39z+GSQe-`|۔=X>]P"F Q=_bQr>ݷbtƿ1G#1-kuz0TZ0S&:A^,Q}4=F헰$hGw`?Ya7hLYl+*fѴb_ez #G#1:ʴNMd'ƿ~C~zIDޗRW2P (7Qmc לbaD {0jֿ@NuߏQ3ètt~DtљRg2*sT<wF# HO3Dž1`c>IO{ 4~Q1z0F=sD0uvD|{bn9ѢQ*h(S1/{7k*i~Ͼ0-隟OS\F#jQ:mucc#(a2ڼ+u@j`thF3>QijE,;HwaАDKe~>\f[(Ϣ&.ZIIdZox;9-bb4m)}Ư>2dǨ:XLa-c }x"K DbthF a}Jt4c|^(qתRo:JJ)(Ѷo_ oIo>rVXJ)}87G@u?uNGQ7~BGMhF i?ۊ4_uy*,R6h^:j?JJ 11 a1:[oFcthv^0z|:] .8=]>_s|6FOgè=%h(}oёquV_$ѿ>P30/ȹ/8P ;0j1&Dy [ӡaThèSHG{Ǩ>Hj:QK:j\5~WL`קghtu6>uȒ0ˇ0LPlY{ۉRw 9aTIH0j8DChh&F*'ƨ ʥJ$a;=5"y%S6Z (G9O:ENi!uQB^F`44~aqcn3/FY F{W6{_y{q}7ܗIR^ϷGEQ$t>}wih8*0|$27b>|c}&Oy,#rc jїfu_.)蜐~RdfwŌtHѱ洈*4o}}&c91/r$XfYHg!޹4\.ؚFL}S0z_\t_Iѱ00Q-̫k¨HHلс{}Wd2z#Y^dmicE~FMIGٯo\bړd#8 _eKH˯Z]Ok2daziڬ5q,y=4Ž}ƨ!Z#/O̖~U\)@K_y?+:[n;Ϛ{ҳ8yF Hο&dGatٯ8XWS6~S0zօ(^9:;蛫{?'&CǞ}ƴ f7qDrA6‚G΢0:$́р@ܧl~)U0wKQl.h}aUgm+G[ﲋ95:t3fB7Ɲ|Q62ݏT}ݧmA޷pU2uJR̄i7KΖۊ)muO1糠jNQˈ dԝ֎~ON^;>Bm_? [1)(JZߪ#eqlm}Y8:n*Gz#O]I iy;gn2+¨Q1Qu/Ǖ"qTæl ,O2yIN`x8zgY(#ȅn ˍQaQ?G%35BelH@Av/(ј J,}B~4$o{h[)OKB*|~u)hQ=[Chpw֑z'U]GJ vШi{J _w$P,f&Gc}rkx9Z?QiOuƱ;k Fb#+_ƨlVSa,ceFSwQOˍ$h;(QvݹP=mh~Ũ5e;NstS~8}eO(:\Ypuk986#F;Z+/CEX-#e?!Xz e'ES}Fr\BCYk IDATnN+؎[F35u1kFn?jX F'܏xYZl>Y/b=4~`ԫkOCC U"9XFERT> ը:mChEo `4V{RR0*@rbw]x[ݲvb?0ћ{7[Q(eu^eD64~]1nF=^^jݷ?%JX\Fz]Wm?K(7U[Y9s4ȎF/o_83~ےMh{]Wlȷ]&Khα8G ?u'-T&bP\Banjٽ/J1:)s,z3>=?Ql+/u](-`F{W1_ud^nGٵyX·`n)kČښKo_?[rp(JbzZwnW1ˏmIX3%:Zv!&g/(öwenN׳?^+կaAiㆶW"`u)<~ACZ~4~1z\{jPwxeڔmNeJr&Wr]ZRJ=jjc-[tٟGύQ~SEyu4oP;iq;ZdBQ]4c9O͈k(dO=s73ct0~g΍n=w[cv7b-)] d'[ߑgo(2]coU&ƞ0jz2GeDY5?y?9FkZ\ MZرɩqL_ZO.秝pZX?ʖ DdD5*%{/QS{sč/f#\YLRkoۺ&늭A#H?0/ʗARaQ5Jq C{uY(oi?ĉRJY[uݺVG3עmw?0*4O ,U ,V"J4c?|/X"#urM>J1G層GIEi3S:w?0j1N: ޕa_`u"K7C]Osu?i袷|-l؛K~A|BSB̿Sm>ԩ$XVF{gR7W쏎͇FoO֩0:L2[; \T/~>țkUmbRN~MvTUu[p yWKhQ?/QbZG]C'uk_?SFUͫoysn}7˲7AL}O ֮V@RHiܯlD5?J~]*:뿾eŤx;CI>Dj?w?oOQCjׁ-qci3~9saJ]{N_~+`SԵLbi|7kѐ|Mv1 DKJ{pg ,bϟ/)߯p`sty4.!mŸ]<$Z 5xTk,nk[FRx ~[$w_?SȢ܎jlok?PFzx<7LswƬxLv>t3Ukog_ڻ]atS?0_zͶPa^Q్|`^}`z)g}TA ]}Ȍ &W goi[F=Vl$ok~7un"mH]GL,b.Ը!c9&AiO$~۟5~`)5E`hA,--) xeu\7.M/ h~WX{c)%7pO.?HW: .¿*2-hZ&@j<]ގT"ih?ܿQcyumk^z5?`B(ih?ܿѐ̹V{{]bU*.o!~MF#,Vtm= 2z"Z4~`4iDZ->($n }Ov$op}osJOֆ!8_cb\k~ڏ[_{TߗnhƹhCkWz9?jL<'@ܒ^#ڗLBߗnhnģ93hfLB;Nir؍jXi^1nzPOF#`pKF'U%oR#qjlJoÅz`K~7X0oo]bވ'ަs-[ih$X[Wu"U w$M7:l$ƭxp(mJ-4~`4GbYu͢v{~iˊ,A w 'F _?ܶA&mnl+=oo)Thngy \{oZRܻTտ/d34OB< o*`4_oILѭ/Zxk}+QKoD~yt.սq}Fo*iXM7Wsq2#~?|&TDʂ- [~{+zymq9"C- %ԱD۵c;1F샿~[ 70J#n۵m˦{vY[ 70J7 _'buY%xOxxo)T(=([Ҽ4XO- cNbsg`KFI-jc~+2o)T(Ow_De o*`Lw|z V- MlƖ-J_ u˿[ 70J_`f- h[ 70 o*"Fnr;mVgmbMEeuZQr[X~S`t1UTu*o)TeFUgmbME%b1TgmbME4$0?wu*o)T]^~S!h[ 7(,` o*`o)TH[ 7)F1oĂ-x鼂-+SL [ 7-F$/Fw+Rp0Z:[n  o*`o)T(D#RpQF~S`KR0BvMB4- h[ 70 o#a d? nB-v#`o)`P`K[ F(/Rh7b?0 [ Fh1c__~zW~&\Bdov#`]i5>_oI?}̚Gz?Mh7Fh%~CԥV}1塣۱~n6^V0:@p/iF0@C|K~FZJiF0J/{n"~8ސ|K4 >s9>y1__> +WV38I,꫶sH3vUqwv#`\f矜6b !Ti6cc?xRGI* F-~1W(Ŵ#&`zŦ#SO_|g?O[/SX">2V]_g|%~Y9otv#`\/4mBX)'Y9^N=Di+3:IGگ`uW?^g< pn yR9ΖߊY?\F\X˔[3Fm~.FqB/^N0ڍr4`]%K|?䟆̷ܘXS6oBJ3MEcve F  i0yKt|h;Og~Vm%_0܁?iF0Jnt|+|F';gWsߔJ1N0ڍQ:d|E6zIpχWcTfRi8Mh7F)J̓+?X-f|!+ _Sg| 1dCJ3ʂ?Mh7F|ub, F(NFF|ub?0 0 QQ:B*d2[ w#`o)ߍQ(_~7F|[ w#`o)ߍQ(_~7F|[ w#`o)ߍQ(_~7bVX(do)ߍQ(_~7F|[ w#`o)ߍQ(_~7F|[ w#`o)ߍQ(_~7F|[ w#ݰQ.RpP`KnB-0 F(/RpP`KnB-0 F(/RpP`KnB-,,` F(/RpP`KnB-0 F(/RpP`KnB-0 F(/RpP`KnB-F!`KnB-Q.Fo'Uh-T,Rpb`Snѷ/> [ wLGWFBł-Q&F_? [ wL޲bcV~7ei)hێ$['ֺ>Tl 6voҳcTD.CyurM"=5FLhʞbFK&w{"Q} Rn5/DZt,Q*o OimPF1cQU%}X5 Q=Fm9SY] 211D2qTuh'ǵj.uǵZBF߾͓L;>#PE ::DECLDUhJB΂PE(/>{$0Z]y(];">+w.u/uWM(=w>!`^mF>T&`W{ NuЦbRXhRo]V=iu:Qze]=r5~ױjtZĪIB}QBLmCYm>F(6tweQU.`DᕲuGKE -ICrpm|P ;)p*0Z(0}p_:͏ҁ,`DdQLܶ -5&&D mh0j\7ڳF3vG 5oZ~l8a; b-͉ M])u*ba'qr W絋 hӿr_CeF#wT7R o[ nplG!`4f/c#yUv a0l"ys7{vvGm4jFAnn"`tmp_n)࠳vm;T`˧JC9:8ֽسQ5KHyD.`T|Ir?Wz"z0Ԩi-&{-?V`mbj= 敗Fh2)jQwwV=b Ӷh7F-jn3ٚv#`[6vUpR-Fa\i@TF]?^#'!"o^d dpwY\Dcc<G%}%lɵwd{{c?0ڍѷ/GCގ/Iq ΁>ͦ;r"|BM'-,9[a~Ӗh7:Fy#7덧%b߃ni?0ڍNewEuwtI6 ߃dؿT]Ls4AShZ(.#~h7:՝tQT*a6h'qh7bhX-[YQ{4Ψ&  Z^DcFErr&$s"`?YѬ2:jP/Fa?Y@꙽a~=QZjk?0ڍ2(#E:h~`% ޳P eﳫ24FhI!(݄όMzFh&Χ l]SW;FhaϾiNث흃i$dBO{p"0JPfGp"0J@UKDwE!ۺ?nFRTJ}#at)=v#`9< L(jfcpNFљ1rʨ7Up.7(vk?0ڍΌQBxA%y vm!6E6~`͑Z5qtT%nL|?e@$FcZ?V!kiF(}sL@c}.D./@Fr>> IDATRqͶxl7SL*Fd"N~ τ]R/oc?CF * me2ItT4H~wٸB1_9[F a2Gǘ.)6~c6oYdFXQ[_ܛh7bPXu͛9 Ga'FUa@-{˛+ Emk+h`L*l0ztnw3ctk3UF4ƅg5)Ňmn~`a_}1Uh0(c:FAJFc(0j^.aQPF߾,s D2{bwUS/ob30jh~`*Y0:ıdjJecpjt@QF/SS/Bl݇$e"vms dʑϋ=ӈ_"Rݏi}^ĞO?5@dh^0z0gިdkĨ+G0*8:GQcqDցq?QÛ5!0:tb> *t)0pt rKNm@J X1:'J+]6L vL-Dd:"Y1:pTq}jNQ6St vQc賬ѧ3E厽Mѣ@ L3W>6CF0)*sT 3{* H^ #Gg. ܣP L%6bsucThm ޫQ+EgJW1I&d=ΆXqFN]h]6hAN1OeW1k*Hуl\Gcè *G'y@_0~ULS}U,D))0z09}&ߟ ?'~v֚ )`*Gի*F+t:ZaԈ0F2~}VV )~3Fjew{+F+V}΃јb#yaT(QK2jn倻*f90깊0pw ޛGkݟ}\\FH0PTz{2jTL}1W1 Oul9$j$CFbu_8:]RRdG0*>ՙAFtt]هrKrgD_Ų1:qty(k} q`T uzqTZPG]yu^>5bŰQDG0*aTiie[|臮g_~qg`Tq({^żuO80z4R9eU(:p-pT㙣82#yFojGatpQ,QDCG0*8_fd?FDŽTd0ߢc${=WF=*槨0z4R92 F98)}v4g*9cKFhVF5g_/bGXD;s*0*QW }fF K \ctf? PTOH[,`R9aR)*s8V)*n*aT~OM~;*\+}\'ǨV(. Q F]騍گ@Z@V߰Ĩ*è+^t疀!20cT-G d=@hC { 1TO{ ʉI]8jl;EُQFMMMh:'|[VoCFr0a0:QkGN\Z7ܷQk\0*љi? ppY 3FW1/F嫘E `T*H d=@T}/ CaSMӀ~EcԖcMFԵ7 FO4tbQ.>elu>T,`t-HUj?9Oű24 OaT?֨~e(&S܇2ݮ#af=GA~QO g`8J K _)QQ蚐rLd=]K G`t)1F@vWe2Ev3fw}dV $ӹ0z}b-(YJf G}kFQ:M ٿ,he1KL Pi?0z< |gf>50jp|9*ubʧ;Oh7:=Fr1ʟZ1jR 0Գ[@3CZg{dTo-=&*n%eat|̤@d7Eu.Zp`T~i~`:FFA@.èl HN)g\8Rtu<GXd2d?0z@ efBtΝ!)*HfwިwaELc11oh}Qc4]Vy"r$@f#H8@|e3MSF5Mjbt2_uHH uanG\}PPR0@_4_@3R"y dQ+H=x8:'~}FiSBjynx%u.1>J '>.<18pF2Hn%ksWrw 3(㗱Ct6zJJcI9d)FH^޻JHq83k1 +wK1:/fĞ^s?=A]JRcTD4􀢏Ğa2B=SQG"R_2hFr0^Qʋ.l ih6}xKʺ9ib辺<hgA~.E [9j -~wIHY$EGC kBzGׄ4ꥃs*0Eѕl(Qk$ iƺO<#,Eщ g2FbD_~n e'FGW9(^U8jԍѻuF0)0 d[$'`t^ d-:+GQc"i}h=`rB:Mё @eF}e30}x&!?q,w'm 2ʢX&F#b>J7H-GCܱpch?FeL52Vx4sFr$W1~0Grb#8jaT̘0gG] n.bPֹ1Dr*Fy$3_G=ELsp2¢/brBj?LTXݏ~.bPpY,y8O7(ߛ Wfb"]Ġ2޲5,֨up41:=?2чV8 F 1#9 QǨMUZeYwp|frT_ch?:#F\}">0˒0r4uڢ9BmYue$F} =GfMHwutB}D _ HVݧst DɎy\XQ})qy9E aw?/_h0`5kd(sSm ѧ9j؟Ql2Eуl%yNDZ4Ȅe1Qb*CB'FG廯ѯW1GDŽ_*F@qD [(Dr(ɨD\n<1 W쏾3>(0z2Xc!KǨ_ ;Wl[*$O KӍm &/Q}u?VNҧPIM̩ct·JkU58x8"ci_O5PKa GACUt#}w..!MǨ<ұ'RT29}֛/v,FŸի'\{.bdԁыr+O:/Fc)@~fN٧&Gj2+B ,,}>S|[9|{QE"âv`T֍}"/Ȯ8~{Ql7FcY۔[s腹1za >H՟ MLF-]g;t%|+G9(UFO1EwS1z'*LF/*G}wJvct|.Qz;4`cc??ȇtQLGD{. 0/c?]CLMыJ LYTcT񑥨Hc6s=627&+a&_b3I%}4|`~F}ΈQIbm|#?d3FQ-ehQwȫJI?_櫯 ath&FMiP΍QX:XVȮ88:O2k, Q@vp/8l2ÇGAt*hQFێM?E iꉤa̎ ]i%f~fBjIptrY a܇(U=ctԱ(Ee樉 (k: d#ܿГo:1Jv}T'r/1XF^\98L+bBO Sl \&l RѮ܇HU@(DVѶC" }DO&FW,e>:!*)}Elv'`Wme/{r"UFP Bm/AT0džG6-AMQF~{X/Ulg/!Raԕ'Bm'Ǫ0{J׎'Qb;Dǀ_rZ5"+`["%z;ᄒ S2zs"UF[O" #w&g;`QISVud*hI3,Kk:mv}TE4[֑PVѶKmvc9rzD/_TC* ɫTѶBqjKEXm ݟ7gg|é݇HQyȋ+Bm$_mZ]p4Gq|4ڊ"J V=cVtw#.b=Ev# 5ZM7hRqomZelBQ7WL>hcAqbuaFQQ~$ EBm,}䣡 ==:Kxx>5?/[ .ۗf$AnTvo7pBBmGE81.;զ[_kI+'~iy*F;s)h7*~Ph6{Z0*BY Jah7FSwTKfZ"y;"m~-n&lsZU!=5)vdn~%nu+H1Zy1)S c>cnz v;oh8vS^LHiS4#v#`ԫkˣ1adV.a?U#EakwwL6Xy@vڟ[懲q}BVwȍdx[Z쮫?jE> `ԣw?wqMU<\ {*v`/w_?h+β>Zڟ79bC$:=Fkq+1wms51:s:}3>dgdDCʎBiﰢs1ze 9fc\r̜HDJPfX}>y כh#2Gh̜^HZd+6.F1ˏ*)n| f/(>~f% wյF̽RYŴLinI3/kϫM#8fڨ-_Yhl]6϶5t ;IDAT_uK;kd?0ڍN|2WJ7UB3xsEvmGmd?0ڍQ1b⽷SbA=jJFPh7:=F_?td5gYPc>n[(_lڛh7:3F_ً{ttUɮ;(#vScrRquɭ{0#=ng?0ڍNQ7Wߔ,̈j}͒Gb5KFѹ19%_SJ8&/;7Jl%zmi?0ڍ΍Q.i.xIJb^coK=>4fcSn2sAOEU(~4LLFsҲH`KnNq̈] |Vy<[2+~Zd}v#`Thns=}_)2m~*Տ.znrMsnJ&/2'עJ^<8D~g֏J՝$bnr97" +5*y}i*T}߫>h7b{X'(V⍊dysZz>m3tWDNү>h7FWC9O^Di2m?5F0A#އ|%%;^WMk(ĭ|_-F~]n9 'vn}EFNQEK^܈>Djmŭșh4WF&>FI#Ή-9?2  u/p@C3u,FkCo{S ۓ0cĉjrC3E-O~+|^)~&WUoj?0ڍѐ|/;a@N{9ŐF}_p5K"$%?F:5Fo<&Fqp>ﵽ, )Z{s댥߮DFF_5"`cg!dCǼvj>$ި&YYokMta/!=Hd+ȮY  HYVd "1!0w]r{f_u}NO ^KO*WQfP/. ^Sy@x?m/zo=3FW5㗷t{Yr{ c/z w?W5ga >QKs]m>rBT3kOAh [=y.=Gdv-]^߰NqBgfԨ0;&ϯ8gMo/,|-8׌5ƪvT>9v->n+OAiY8|C1[3qp>naw?t\8kOAycIv9WdM6wGY^1~j jt!쯵ēG*\_)SfPSºnc橕CR ;n|5FpO;َM6Hʎc 긾a{Ew]~ӨQ3ix\F—rsϚQڭf_5~j jt0juT2uU=zQvbWʩOAլro.k(yFzA,NcG\tpZWvASfPs]{USuEkt=9@?i_FF͠Fj_+[n6^M}7qqv}|Işi1;SfP%-aá%969oXUEA"~Q3F~o:ٗ<<l 5fԨ"-H{@ɱ=O3)fԨ"Fx&IF.hO?h'U5F͠FsTaS>yL tk?BSfPn6arbj!uϼ(mCQ3GӨ;Ə;jK8w6m~rhB#DA.{\ky/E'BQ3eQ{Mm0~8&2*}{.|"=DA.&Nm~x׼cmSe\]v+ ~MԨh.ezڙ=5`G\4sϓ-DAol8{'fT|/+t5QfPv~!~'7ttej܅w~{? _5j5}ks_i!{rݬqį5O[kSc;~gkF͠F%n7Avl'S1/Wnji踁Yr s[k2>Ԩ,q W C QRg_7D ,q yG5i5*rmYkF͠Fe|_zQ!~ME"k"}35zi==Yįh7U}75z_!fiӿѓEH a^9Ehμӿ%^#~Mo`f m$/,Ĉ_!Fќ%d]#~MoƬ~5z_(&7E>Df;LC/DfQfk"}3J=Գn&7X"~MoF{w.\Y&7X>%d|g!FH 4Ek"}3Q#~Mo5|į͠F5(&7E>DfPGH j_A"k"}3Q#~Mo5|į8V!!DQF@jDQF@jDQF@jDQF@jDQF@jDQF@jDQF@jDQF@jDQF@jDg-ğIENDB`gstat/vignettes/figures/allVgmsWireframe.png0000644000176200001440000012673715060550314021044 0ustar liggesusersPNG  IHDRFZoUPLTE.3:<FORXafkt}3.3R3s:::f:\s\ffff$+3::::f:::::::\R:f:s:::::AHPW^eff:f3f\.ffff:ffffffsffffffmt{3::::f\ffff.:ېsېů̐ \ff::f۶sې寶̶"&+04ۀ.ې:ې۶f۶ې۶9>BGLPUY^cglquz|wsnie`R[WRMIfD@;s62-($ې۶  &C`qN pHYs&? IDATx.u<C&M#qC3HV.&,`4tkIJ%t;[ E͵^{}us[[k}j DAD}K0*DID"Q"H$H$%I0*DID"Q"H$H$%I0*DID"Q"H$H$%I0*DID"Q"H$H$%I0*DID"Q"H$H$%I0*DID"Q"H$H$%I0*DID"Q"H$H$%I0*DIDԝ0"u,s1`T$:__=/H `T$zz}ɯv}~ؘ`T$޸w.Άw.}f[XkQHtZ0z9!u.CǢ4@H$h}F?U_S~Ui"(7a+/=I5%WU^^*+Fo*+Fq{0S/TUbMUU ֍J$U_S~UU^oqF//>꟮?{0?]2+?T 5{0~h^1zkzei%a$0xe^Qk8_^쁣0OQ]f_0W\vozڔ`q~h^q1[+X|%-9*Ɓ񧟞|3d%sV>] Ԑq}>. ~zdﺚ߆_==M+uVϜz48 <=ߙFџ^EcSCDS3koQohP禍[\Ҍ jh0dN= FK֜}t._v|sk{OӘӟT3kTNYl`ŨdۧRei t71eN= FK{z})c)s:9sZ]G׌qowq0*cThq}OO#6\kԏ"SOzp0.g/+CC֭f-_50Nva;F]M?u.MG:9먀Q,sI`4TcD;Yo3ŜSr9d<H|j~p8ڏЙhQ{izz2ŤOޛS}}1̩'hy\g,qwF?5v0m`4# o]h;0oYGnNYyl_6%G[Oƙuz0m`4|:$4- a5}8D4N1 53A9ocr4k1}Fgcion_è+sI0ZXKN=69͍4V 7Ӭ5YEͿhi~4=S?@Z gpF}0߲>Lk5F")T3ic`^7z4ct]=֍Z?Fո?o (F}0߲j`7~W671:]83]13l?95utk*=]5ꖥI]/o}qrPQ\*F}0߲.ݚ}?"flQSLs,q733l!U5tkۧwp0jO1* OvMYz|yS_ n"0~˚>fTCCwj-C1Z[/hq4*`NeH0ZUӨ܃;!hU FNrZU%mN;=ؿSkV1aT$jH1q/DkJܯ*(J0*#0%kJܯ*(J0*#H)q<kJܯ*(J0*#H)q4~ FEJ0*#H)q<kJܯ*(J0*#H)q<kJܯ* _Q.H)q<kJܯ*(J0*#H)q<kJܯ*(J0*#0W~ FEJ0*#H)q<kJܯ*(J0*#H)q<kJܯ* `TK)q<kJܯ*(J0*#H)q<kJܯ*(J0*#0 "\bMU%_S~U FEy$ה_UQQ5%W`TGbMU%_S~U FEy$ה_UQQ5%Wџ%kJܯ*(J0ښEצ:5.cilHܯ#_0ZUwKc]~MQ F{:V5;=+jgUUut Fk>v_R]U$W1/\X7l/͎boTu%&k@n-&YUbOŶׂ< #Ai3~5|v܏v=T0[աz4DvRObX,h[~r 6HڂѬb/2 A9%8 ERG%B>CzQ[l V^pRXP4Hk~ݧH5~`Q 4Gbi/i-ؿK-w RhUx}5QOSw I[ǃ!QvJQ G_\S%HwƖc`4#Ȁ RA A5cɚ%D;~}[!f_0y /C:W/_#:sH+ܷ@ڽ18mF\<0}{^_u/ϒvh-c>,U {HR,5ndϾ{v8bw,I{q)L)K)C~F+ F;pô+NHء ֬eXv[f'mL@V_~b85Ǝ#=X9ո5\޹w.:^~򫇾<=KءD@:^:]=$}=D?oYd/QjP8'߬} h$F޸+1C[ml?zy?w a}ȶf?hJ_>r֎Z`gorT~:I蝋 jKN sSJ!T*v]e,j51їO7P/H>wEZ3F iavLt3vING&iy/~yk9;}yc= L??S5z3 FF^` qmw?e[蘖78 * TY<~tڅu^ r@ R˓c(ݕzz٩E|"G1@oX2@:Fҷ`~:FZ(00YI"ݢ&j~FWMyrKOۛ$@؟[^|9ӾgYc/ Rc8 5ؽ~z[VW^MhTnqs{D);8f 3F/tFyaWO?s{/c)[YxdM8Zb4dRܴHػzl3UHz7{v ?[W2KqTqQ-KOֻ1/O)Hڿm;wsUyJG d7&@vM=;& 04{ڮcGk}т-Ƿщ?RHϝ(HMGoIѲ:װbt7I;Ֆs=\.!AjTNhvc:t K^N6E~2M!E?W G8jf}z#Y9/fy X2Q 5GRr4{ F_, J ]UO= ҫ{nD~}ܶHf ޙ h;PL 'voA "#)8Z"ȯrmNHJ@=jri\wp޺H G_25bKCcwC84pL F_WaP_mQeQ稲Q3[7aPh Gs_4<2xz[GpQ*\w0: (G$G"z9^ڭ &$Fμ %;,}w8_.gz.^6798JN؛C)%9Z0Ŧ(Q>X,?gvS/\sK`ck7 ObA:B%-:bFG]U; ͎w)Fހ1. *όfGih>5PG㕡Ma4<_E:M(dq IDAT5LjW>?^bm]9hstkS<#G;:8o.\FSmGfLd_*'Ql9Z1(Gm'rtrQ_r4{+F޸!\ %z] 02&-68]ݭ؉Qe>G(F_-[?WzGm u)8* r۝T#6HU B7E9:R¨v-[~ɥ i(}v[oj)46GCQ}m F]drT 9\ UNE9 c(hꤵݭ_Ҙh_z/ώ^qGsQ~k<r_0:Eқ4:}?8r_x.1^񙓣1NrT]rԘXzuFB!C2:F=WG8grTr_gbQ Y?&m.}7+EMjW|W}F5jUO0ێr_Ew pX) 0(鸘tu12/ͿUŅXiST):rw0Rэ0wو]@p/ e8.t9F^{DZQ'F)UO}1,& *:E}Sɸ>E"oF3Dè}6F~d?G.GR@Jdo#+j<>c8ZdptuƨRY (;~р-H/%V^a㨅7+_$p@ӭlnQ=?"0jMm{KxvM&%/ța4.i!Q딦sU(t~p^0|pp=582qܝݭ9F{d1!wקaܧ1Q5&G_|KdN&oRtŨo9}~5E} Fmo;1 5[~hGQs[ }.yiy?R2UD;yͥ( '2#0.C#R(59 X9:ﹶ~ /s4 FK~Hѵc?9(bt)p,·9 3Cc8'.wׂLd0M_3y]hǵyFe)E+aj>}1_QAgp#()TVO0pt?=( / *ͱmӭ8!ёD+HDŽ+v&+/嶢iE9j^}%,{EQآ']gV;¨Q~~BD"19$rt28P4[? P,GW9*Ͷ%FrTY: c E'9qhŧX 51j[Id_& Eѩ ȥd_xVPN ]Nс%ѡ+Ũ{hB9:V"_ֿAh(GnCYakVpt;S45(2,urtg(GPf")9ٓ;(Qsq,` ~}y}dg8 Fmm(Ø24cV5[rG]a4[?pTIc5Y#( RWyF YL0mKv+&G4GN G5GQkһ ap9ڻrԵc: ֭wO^daT rT0mK~+=G%ʡ&8-࿢p`~-G5Hrt__NW~%8(7徎ѠndR`oدvg1>RK@)GA-J9xV %f6f;ߕDv'ّ{s?. ]8XiLF1qT/X0:RqNb}Qxg;KnbL†(n[X}uwuK s4f2ơ)o2ˆR(5hC!ƹ *p";(0Fq@ FY2є19:B4k9z4ullstܸ c~o ڏFv F[Wa^?6G6G0S4'G N3FՋn=qDY:Fހ̃Q; /hf^1jptLP:g(cŨ1={֭o 9їr"m mfZ%cRè[V·S8zL喣d"|'L;FH9~^o`31L70qt^ jgra4,1JpԘ%2.(Q'/?/)2 E1b?w6zPN*G)6y1jl%rqYutwtPYL0ЌEOGƗ=E x9'1V'ݩt9Eb$`4ߖQ8VqèU);EQ4rt/a֋/G']nG9 ]'QYl T[mՌK}(NѸrt(\Gt{ҝL.G3}~⺃{(Q&t0<+.~hP34GM&E0 o~])jsX0#zG+A9w(KdYGo@sa]wpFc4Qko8:tY&GQ)rԙp4f"k)]GaT9ned;s<E9(JcT~1q?`b9jOrT0qv08hrt`h/GхrP"!rtNdhGm5SQ~[Ft"QG)G. 1XHڬP)Q D(c8ژ0ڟP>Qh-۱9:dNF З%r`3х㖵Drt([ߘg1aE(n?Fo:,SU.59ѩeqDRV"<0(m8.gP:79I(GLh,G#(G~;.Y.y4G=GrLdxꩧG0vJ Z5+GIq8,3&H>3{?ܹ |]8:1 (GўcoE<,:Bb@ǖ#8*_{xKx$-YNӒD8]jßf~S1.GaJ'̜eQ7Gh+G)c~n`4vO\ 7r.12̥h0YQ=vnэ1?br=4DSJt5n9jp93Ǖ-/y9iBuDQǢ'{wxtD۟Qn^^UΉe2Uv'Y2_4WٝH F1*kts,n^١rTyn\AJ0ʼe^*\9J֭*G[޽}2rHƗ|lcgǔe-(Liխ7 rv?U`4m~L(c_cJodgi]<ڡ[>#y.+T1Rv(3Q%RFG,6;˴~Í1d9tWj?{)_}OɈQ~ĭBvȖCLs\/W*3Eс&G9zue؟ 1h+?Qn}XgS: !;ՖyZ8F9:Q4bڦkQ/QǜY2>r4}W9Q!b1z ʸ55C[m%7GnE9zek[w9_ rXn tѯ8rT0/0 TV[fjɹIbP0хAͪ!O9j=<s8 ,fSeÈQeM/7d2WKrԼR*F9]Vߴl QxKpƒcj G9jTncat֌`t؎.GFQw~(~q}Ӳ5d%%2y\_[rQ#LLۜŤMm.G ( rG04`Zջ9؉QG/֠1gqg1r4WEZ0T9Qr Q%r@9ːJnƻoHM<,6eb(QG9}|ZQX"-&G5Ο<QHp_>,_7:lX92So*ݚnC&Q@%2-~"tVǹߝ\9Z1zW1M21q(Qo* ;qcy@&2>uwɡ<i-ȌQ~ԭBvh-s6=ErT}0QzІgZ2_9%XOY&4YqcpT2cTq냀jˬM(ǀ(ў!Qiijl-}U≌pthl9Z⋶ٔar~o?}'F7X evh-6ert(R!+Gs=Z,[KQ!W9\q&$i t>(GYwqu5%Ҕ٭0QEzkx5Z,[KF](&GKU,sPIsbQ폙e,K0X/Ggr(-EK5 ]rT%d"s;fQh`tW@ rԁQv9P4/HM@24Q*L7RQ7i4 (YSV9 FfZ8ƨBQ~J䡙Dir54v$~6d:FG,GIM)8RQFE(+,_KQQ-EyFs55w:9 Ԛ'/}IP֠h;NQQ RJ䝎Lgh (Or_7ނwf9Q 2nFuSQWh-c-F9ja) [_;bu?4FcbT߿ FmE܆Q7UEv9kƫ(FOaI&-NVV0zgNDci]LQn921"=V vWREXlF3x^6KCf"0ԭOMLhrt|sihCLkFr> #n_l ^1<;D=(,-G=O⾧υ$2Q2O` IDAT֎6~# F֭ӫfU6lu,^v 80+G fh#[keܷ0H.D3WeIo"ckE1b}I{㛹Z;m fSS)G{Z (GLҷȥܷ~֏QO9zt)Gߛ'~ ^ r4C2YS6.9M١ir߷isgܷёFٓYB ^-QTr"籭! o="t?e޹8sF\Wg>#4u?!**GhY}O}mg{щQC)yO:NO%&r@3 ~0(?e^QL0<:ҖCJhhKsd;01 O {!D3E1$qf5} 3qdqW+~/FS <6v:F8h]r?;.\c㺸]yh\ DC(~Fwm`ԡ;gWta qKdt1xs?¨ct4f_0=ӑױ'1v2j"E;ƨqS!4_0z{g}IQ3(GO1m$ѨCi -*Mc/F޸g$E}|>|\w[H?O}y1M ~_nj~M2P8Gâ{\w'RH?"1OwG#n ݀QU0<>}pш4^rXD<\q]{XC&hLd(4a.ߏcSOk@w1:h|p9 R1ʪ^o5\mq]Lf?!0[5;tt F5 'P C*ڣ.> Ee?(s6_o&ƅۥB]SHG!{˒CnC3?`tԼ*3365R c? 7WuZYQ΂^0:HY>Km?pҕ|j~}W&3Kvgрi`t_ê1g {⪈1:J^֢ʸfg?`TѰn6+gEgG͛>#7k? fݧv_0jXCŻ3 {<=+޽1k~*9E[fݧ,`tU_t{}_>Àk 8CPe?~wEw nv{Ra7#߱c\l=ԨYbO`Ttшы.s3TuӾS3|Pq_I`Te{=mgPBvϵ\L]+Hy2ut=4(X^Ph~Iv^0z5DPwS 90K1~iD*.>ct=Nb ߸Q] է>wk D`{\qw=~롬L_?rhR:spv{7} 1bx==3Nvaz(QmR/twO'<'7Pxzw')ntrF>tO_ƻMZ/Kg_bt{3c ˩xo39pǸGނ_0ѕ8^ b _!&ƈ{nT<:=m(nkuK)`f)Cgo{v5T~?#D/uy`< Կ0f:ڿw(yN7j >!cE6_-=sS`ԡa ac{[d|FMDߍק#?r~K4F1ȑ;ՖMwok7<{^󫸥s d(w2uGGނ?CLG\#ءdhX]<_qas8q*Ber86tK$FgCukү?p9.GK$?{,#? ?bFC[m1~ 8w,)>{:-?(g:bܯe:yV[zGx/{Mɠ{ڙzSZ.;ʞLYy. T5nڗCߗG]ѣ]7jzZ5^qsțWs?2Cyڕ`8v'tq^dh:Qk+\?ߡǂ!hRhh%#ƅ0O874,oy2Ҟ|]ݽo݉r]삧 Mgj)B qK|thmZ:WCbMf FIpWޞ:pO>y;p5 ~hqqQ62<@?7x5t7N k/7]OX6t׵ukON厊2*~3/НqgT8!n|qѷI)q?DP?Js")溯χtt9*g5%W`4^wd\p0Ĵ.L4D>z47ʹg_S~U F2>#e"iJ?3یkJܯ*hypatT ̫@Ɖ$0 \w8|Qas~~f_S~U Fsh~"_>,PIw/a{6.?a~ߑ 5%W`4phɇ'b7n^wbt$ה_U<ns5Q谰o½'.}C%ה_U\C̼'x;³.׍{5%W`49Zf6J0Wk%ה_UF`)j268;#5%W`4y ٧ʿU"%ה_Ulꚧ̡0n%0:-%ה_U|rq%ה_Uь]MbMU%_S~U FEy$ה_UQQ5%Wo%kJܯ*(J0*#H)q<kJܯ*(J0*#H)q4~/_S~U FEy$ה_UQQ5%W`TGbMU%_S~U FEy$ה_UQQ5%W`TGbMUa)"\bMU%_S~U FEy$ה_UQQ5%W`TGbMU%_S~U FEy$ה_UDŽQH$!CO2F?U_S~U FEy$ה_UQQ5%W`TGbMU%_S~U FEy$ה_UQQ5%W`Y_{Oz[^<,7x?a}l( F-SJj +8tM=afq54>`4;>tqX4>ʲ:7kGI0ڎviO?.[ϞL5>SoWPGI0ڎvi_ Qs Tc-VGI0~E5Ѻ(OD^^u[p߭ s#܀F\y]et ˋ_a)bhn筮: FW7;$F]xi\}<k$>H:_IM?MZ 8zz.Zi F;;dДQ%6ϬM>x}k:JS8R-5a-LP9f~3F1;o?uݜ._:$F]x )Hxz>7ؙ"a8y|=v"G//~Ow{Xʺٺ`˺oJuuQ%6G硡Ȯⷦ s\ Y\SMLP]oqq3F1;Yq; 7G\{Gq4>`4Nsa2<0 .5a4aO^Uë?{<,el]t;R8icC/}ڈ-_1jr:uMU=a*{.[K֎( F)eF$125bxԇXgv_7t拔k?Q0 "\bM5vN,J0*#q_0*H쯩F FE)kǨH$Րʡc4^%ה_UQQ5%W`TGbMUaQ"\bMU%_S~U FEy$ה_UQQ5%W`TGbMU%_S~U FEy$ה_UQQ5%W`TGbMUa~ FEJ0*#H)q<kJܯ*(J0*#H)q<kJܯ* %kJܯ*(J0*#ʂ+YjKQ5%WU^YjKQ5%WU^ؼ{_v0s١e_S~Uc}u/?YjKQ5%WU:F\/ ;Ֆ kJܯ* _>\}>N1eXV[2H)q1h8O1 FOXbMU^^ FOYbMUH蝋{*Fφ/'-1tOL K)q1zb=ʺӕ_S~Ucp5M1UL'-0_{cXԳtzyiRAbMUm{ܟkRAbMUvh-E$ה_U= IDATQQ5%W`TGbMU%_S~U FEy$ה_UQQ5%W`TGbMUa+~ FEJ0*#H)q<kJܯ*(J0*#H)q<kJܯ* %kJܯ*hk^VF=!q~h])X_Uc`bioIܯ_0ZI7Ϊ֐0jP;hWUu F7v Kv:RADt\NNvs}|}쥢 ~膢>Ry(}qQ`t+b=%Wձ/Dqc$W /-.H4Kmݨ$Mܤ ~hY1~Sөx ~hAvc/#RCpXjtu~N~ 8w ٠Xjrwٹlqz?z_ J0ZV! :4W۩=5~wmoo=P>6ʭOt:Yμѽt}}6e\ "/VK KdQ'6H[ʵw`U/`4P/іRNfDr+;Z"?+y3ףAC;nDv&H؍FߤDEN˧R/Ѐ 5HП\#g"G`nr-g1 طPUya3ww~dNDTFsB,mkًҗW3Tn/-=I-}y1~4F !}qٗwxn^mbTڳ;c S6F@J~=C`UؙэS%-|]Lv&Q?dnʵ76f0.\ʍ߱,g} F! olH91hbA QЅb\6`h+piB%&hXf aǐhz&~}a0Pw h9ZsY~sCoİ]{ w`_&x|MߋӺZ0POс*FKsh*oo!HμcCXLmpїwt+b`4p8Zѥݖbik ]t -gMǍ)rT/ ͹/URrԼ0Tg8GӢP,mjaмsy}dYLgh} R D"ݪQbmB%sqS0G;99ۯ&Lªٛyo}$ftL;p_:cI=0NhrsY~{8o 6$Zf> @9J `m0;z;M]{9\~m| (YnA泿֗sQD jTy/Sr&&G!Ѭ i&g ^ p$G$60qnFYZBh0u:Hq3sD FӘ;}eGQkH4?GR 7,t@Sg{Kh+OGc5sC9?OkJsQkHGsR~?'uJWG$Vl"簿x4NDg~CFD,4U:e9Q{5;hq51ѥ,sؿځp7@ك_0R..TrQmD$G 1}kIGΤ9[(~}%K~ҙM#?ͅh G~[h)5Gwo?_IGK݀9Q/5[Q }##=D68Jצ w51ԗ+}IggѱҦ6(v:ro}בc}JPLjh$G'8!j>yZFDor IޒmwxtGM_00Bgy69]!Z[o^4FBIeu&ijk} EGD -'Q|:!}28GD{ ~wq%9:yO2-`=Q^uj_d1:lQRΈԡ9]K\ր:0M/8:qD.c=#~NQx/x&Nk G]A֗ G񘫎Q"5!UV+D>˗QGqQ7 Ǩ3{oGɛ4Qx_}d_Qsen$G;~т8QO!V/8sc"@Bѷ98F ik?S9y<[cGDqt(`tnҕ)j`ѵKۻ$F'IvRxEU5< E-mbQF!_QG ]y W:8chQF}j]E6KwU:.Y hy7u?, Fj#k4Gh(GBTh(,96]&tsuο d[J_ndQ BCã󈴏5_04st@"DgrrQÐ>o=ypJ`_܍*G_}}),h2"hjnUDuqTTQ0jRb??'D꘨[_=}b yb1GIV ~ޯ18js1hG!Q型x H*1GOb c4]?EgQ~Qc]X 08xВH(ڐ(Ѱ#8Yg*"mQ/iY=G'9j=5ɇG`,U76ͤ,eqTg7pr4\ɺE R'G pqo;ư>ѵxpu?|AR (@3[CTè9<04~ϜA61ӗ䖣Z(Բ Mmc|\ZSh/9ٱ~1Q{hGGAQ9l ꕘFgpt8%91Z;O@Kr{ G~ȈhQ]GFDOc Kz9j ״.G@OsԼw~,xguD 3Dz*cZ0jQ|D4*Dn=p ~*mc[ZC&G!C_ҍQ{ *‡0 ]ljQ )G縧8 c!ʼGI9ׂQ Gu2GDC9 2. ڵ0)DF{SrH11ʾGI!rA~}~HZ<+7)Qkن=;isTPAã=D *aŹ(4kjTA#Ts5}bm4R9pz*hZ0sZzcqth8F-8ʸ(4ki$Fst]Ð(s"wHh5wr ?+G 1N6H`4Ӗ6]uS9 DMR&q}׸,!QU: h?qM1UDI/ M.#0Fp3㥯 .G9:C_n]6ChWX:YE!hhP3Q}ޱ`>%)ŴqikY4oQyZMdS"#o9 oIzcUV g0 a- ~~}{ՙCaIA][l]TGk/sɯv}~dPѨr4vl-]4GTeLk9:8?H]Y8Zo.77O#kR ~kHfc<~5Dҝ{~X4#H8 kFhD"/y2QtUf8v0ﵟv?>=JR )`I;+/YrIGPODu*L-["W{ɅJx+}<>ŧ ۿoS(qad9Fal5z2n$E7T.}Ӛf (GGֵL98Z`1٭_O_sZ o~ٺ(G^Zi3g2O#\Gʸer5 ]@׭_ pt/epn$q DV][In9brtx9ڙ05¶>\]\'ʸe%^GpTUD8;I;D_3O6!7~}~of:' {Vp_?z _w(90jrtBH$9q*Qc]V$S\D+D WO]v~=} =J^ŵQb[ãt]Xnj蝋H;qйb#.U7yw~!j`t\6I[X8!2ZV9 @ʈ1_|UFmQ[*kyoӚ ƈݡ[^\>QY#DM#\6IsYdoӷȑuL_PBm}4FYvQu4PVx( gZUGDxH2uJ&=}[mQmLkBD <N"c5/LQm*G19j@sQC$f ~GQ͞FQl RrD*G0㖣3D9ŸrނH[^HlpPnfF|Wƚ~_ʲJaj,_cwh-zW=aFDrԵ)FD)/G D^'2s`##G#ݧ>_N6n4c+(G= U>+;WE8GDhyIc&Ga(*4ft;0Z#KP1*ۣkR@qwE8{j*vU71:sZ/GD~>cM0(Th"#DA4O=7([#hB{~KG"FjVzP>+F_LMC)`L~a%9Bjg.]O/+Ĩ2Jbg[ͦ=`4[?+D5u[%rd~5y8&`Qɑ=ϩȥ~ݧ9qg1h-[hQCvgj['2QO(5Qf"O[\X"< F7O0~,K#eBbFf2nTjUGDkrLn>0$<&KD^YDމ+xg[/Q:ڈ(Ub9[D^ ^"[Kt2щg:^"ocTtJRGQF$Q7Gɧ"<Hk&ٓ1e -n=< rM`4F~(Q^"z(<ѩ`"owgruP(i`4ߖ ͘0Lu#CQo9 EQ ~u2#istHp3>urQ~z (lj`4ؘ]5!E5pt(%f"uDVS;FQd}F4.pBDŽH"K DѭGF9K,2Y;qEKc?=/ewјf`e(1^j D#ѧ4_KDV-V"g1Oјf`Cu`tyMY&x&3]ۭbf1'Gw}&Fybt9q_0q˴f@gF}z!([߇h<)QG"H'u{̙{Ĩ~G3B IDATL2m`4C3FYsTX&)iT"O3rLXJJ9ڧbi 'e$+aE0/u(G_pĨ] (u%<:1 !HQ'GhrTi?(n`4㖩D&FDŽ>`4[NR>E(bw&FTj{ ~«f&kʈtDRsQGs?rv_?5bь[q[W+QF'GKfZ< 4FEOFUǓh'NAԘ70q(m?Q F3nގ8aTl3,6ȱyܹXj4RRy)Emܘ"?bvb`'YDY=D]㨞 ,K9:f;LޱN50j;!z%bF威Lz8R'2i%9ݱN/׳-Gy< Fډ(G\Y%2s(yr k"QL1{vi Fra`4W_eڃEO Ff(Galc?hiQ͑D~QG7_w(iT9h? ^4<˳ڛ_!Z|=O_~8"'IF3~GqbAt0zƽL/w.ss.`娓D?׍|BQoy8Ǘh|jzfAqX"WΛ ?L(~UOẍ~=ULNK0: E9Pu2>03MpQr&? >#eiibh\95]^f-Qȉ(C4Gz_7'fQ?|ʯctbe}1U&_FB~ըgV1Ӗ8Y=U' ? qQzg/ͺe֖δG#+! ̾O̕p\7Z^EH`{#HH2h,T[3W]TF.K,'9Yv튊|7OFFF8e zl45sR:h҆(6:W' reirԓoPя~:~ب+U[ZtDtbrXhG]U 4qCqHO"'m']гyZ 7cҏب~2~ب+u[|DFD||J- yWlt=U4L8~~hW(G}D~بJK{l[.}sL@7)GS-(i:<-tӯ?lTѭ% %f䢴Q!UMP8Y7'"h7*G9>_~بNKèN.GT 4qCrt6aȤrԘ ']*W?Q}m9Y ~بRK3&f>}MQQhP SQD nedZ?GUj&FhnQwZS>92Гi8DvT]U+o~;.(ѝIm4GO&QG Ek&nv3"m/29۹oɍOᇍj4@9ʱE>*GGS4qKJ؁TLGPxF5 sfjR٨1'!h]-ؑɞ]hL%rjJzOJ`b>Z?lT)B9:׸Oѓ.f>ϤD]syC*z Fc(GK4 r4FM>@s5%ixD2|4r$UWQ")X浸`㉤amM4G)Q3?oQY"0UτG?G ᇍ^ t5l4裤c#& "ZL6=v"omHE%͘~ПO/uc6*jj$oG"C(L?ӄ "{y"g::Z_Y 6*hjyױQc(JgVK}|yDIcn"ovHE&0:+GS,Ji 6o .yݐ|zU&?Cוbf9!~S4>Z,mDh5}tn_38?z (>Gi㻰QWʚ|)GWmXu&:Qe} -12Ic9jBsƗޥMg'1بPDQ.G{MOy`/!5w6ѴP*Md1}R9Lm=j9: ?>,VEFبi\4>aK5"hT;z9'ۧ?>TQR[iNn|5хR|4@UGk8%gh"JϤO+G+%rC.ʸOPi"Sr4@g'KF_VgNkc.T6>:&}B9:MdN-F4SMLv M7b (G6Xiw#ߖ}B9kza\Oey3|tڽa0D֠/GGlҡD_X.]y 8I-mt!%薷D(9#}<$w$%e|qwh*`98vب+wvn,ZhV<eʪ&~T->Z|jLBzlt.Q:{aK?Z@NLd='5/}t_^ߘD6ܟ{ G c3r4D^s{|4"FJO8ŌLܞо 5~lΓXV1'h"}G9ZcFGƚIr4vY/+Xvry,)GkcV?QYL|6q]7v[ZzJ9:QrȿJFUG.(r4s]Q~,~"./G:ʍlthLkr3SQrOB}ޓ5FǍe?FhZz 潬l\1 *BQ/}Y,+:ܬ;e9jKFy.Ʊ з794(Gsa"K;X7l?uhojƼ[grT޻‰лP9|­lr4@68]/QFڙy{rԚF> Uzch,s_#}{:ѧ{cCSY掾myYt?|GE=:!rT~q]!=#h}6."Ԕy-:rTЭ!JۨQ1)%,z+?~u7ץHͲav=K=Cl|ͳmtYtD>LVP㢧L$rJ9*Α鶖)Ccg1aTuhlLoM+GuҊNk~^꡸Y뼪ӌNkق߁_FU$zw^c:(~W 9Vn:6 KN92H|XKby_vn KŦ6|3hrT+JPǼDVj_1m&[]Ǖz9'y=4R1~A_>ܾxnr8G }tW.Zz͠yF&e}TEf=oFٻ?TlT('l$6[ UC?oA0ب+M$ٓ޵QgPzd]\ ͵&o++q^'hJ-w׬ Dhszǻ?Ϟcd\s(3QmuIk}V=yS$70:6jg~~xo36 W=[YZnI;W$-K'8l4U10Th*Hٺ1?>K3flnvzZlա^yqڦpG#6(G5 Pi"xmffLվhhTR&iӆl[^>cuhWۮwoX6a)&ݙn4#.3}3NcV"+MW_9ܱc۽W? -ZlF]h&SF>֤ HcD#罋ڨf-Blӡ^٨[6;w61 X;no>6hF<#>m8'LQ!<)~2W~vܟeM]t(Ok<#v0/}3vTU΄wwώTN޶NzzQ:G74ǬFf!]&k&.X97ڙb*>:(U7i9KѭȌ2<'WwWN|FrerT8U q(&iy"h!ʃ߁$;6f|>>:hMr[|6ʠ?cr" +~/\ w;o4So6(Ge.ff6^9K[i= 뎊#k3mt'ݧoŻg9&h%FmpQFYHz6ڃl<&ڇ[:+ 5Qdj ݩ'*5+(__mBmԻe.CkF[i6*yFor4l8ꃟlY Ozڔrn (f;{ϖ) Dֿ)q-X\W~hX}/={2ym{H^u0iy4#)?I6^<9~J~+q]zVɃzr'UE^g~4#)?]sѸ\f!FFwш2T'cTDwS}^fn_!gǛb!a!5~NRYlLeHE+y9Md}kdZ@iрn![g 'v]Էz?b"]}[$Dрv~捤ԛ.(h/DWNdug׶jFOqHJe|Q9oLP%SO:DI`5!1pQFzI2IcqM?l1\ =?-Пبh,kڂ)죰os_$\}4Poz(Oy B=WH?eo~9K=Z69:#-rAoCj'- Y5/Mԁ)} 2v}}̇ˀO uNm5O6P0l =&`4(m_K_58~OE{g]Ry>z0׳w^ٰxW]I)}MuhA,Eb%Q룉G1z\P{"{9q~Q8٧ci ~/_Q_l lMcj/F56vEr6)h/7+#?j+hNʡsG׏w$P{#zjC¿} kQ{5ڝg)o&KGRѤ F/m4md# F>p84\#)Y#=IQ&kq1K?u6Kq]?᝝9̟;FTQw,Id=#]1b>lf=)}1sMy ?vґj=o>* +QM]K|/ۘ/~a?Q/}6Koj k o"U 6D7QZhcs )dA(.8mMuۨUq`7YrR6[g}mGb|"i"Lt_@\i7Q{R>%0MljMC{]P\v/>lԥ8"cDzZ?;L}zx4UEOonя?6ڪgO3o\4ܩ'5)wWQxaz{Hd>zǃ0o(/u6L3?DmQ}芞oNbȯŧUćSOZ}ovGPݔ ~OB>jw a5Yi-3Ux8vȑsW_ }B\FGsڵ`I4^|{-C UkeeLJߏF=Ρ; ⬳Ԏl4mp]:!+EL'>,kX ?lfG3[a}O;/Me[%j$tʍۀ)*?ltӗߵe'grDvn`,e IDATP~D^ǚa(˧NViF;3Fn"1>ޙn.jڐjx"gط7/Aro%aS)y}fm6&qx]Zd0ud6K*s⯚w)ѩ6N=cdOm*ntR?[ϋv mFeƻ<>CdfHm$]طqwhzHbѡ`"goBљD)w*]9ǢC;cFL`Olor#*~adwuᯛ27хvKa?ܑ>w˿ iO'.n{o8#D;WD_O6q09Ng}a0Kͅ7G;s诌o-aƑi(8ER1ӽɩAH? X6.mNk X0 }=f=t}}v+I4g;uoCk ~ƋoǺfܿwN_K[qu ?96*ӿdW f[LߎyIi[~o%4uW诊/(u6jSZ{!%%L٘`ӆ=3ԯC/=au޴l~/{a)u\F>۩dw2n!&?7D҃6ꗝ]?Ϥ#=1_i*o5g_ZFjv'S:0>("uTuWQvm~d E)%c"3r^]0_0?lԧ]FPL\1Y<=\G ~?Qv9Εݨl%EU>)_R_T`!yS*gF~sS_R_TQ5'¸@`Zw+@`z x* .&/)/*(#/)/*(#/)/*(#/)/T\Q-/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/d\Q-/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/D\Q-/)/*(#/)/*K5ltҰѝ1z> ݨ@l`^xg>TZ%E`W>9}}QZ%E%ǻg/O<ݟjRJHA_R_Trж(UP+!JCQm 6 A$l H$(AHܩ ڨj7 AQAFto'@ լMB-(AHQ `A"F!DB  6 A$l H$(AHQ `A"F!DB  6 A$l H$(AHQ `A"F!DB  6 A$l H$(AHQ `A"F!DBSjIENDB`gstat/vignettes/figures/daily_means_PM10.png0000644000176200001440000014034215060550314020603 0ustar liggesusersPNG  IHDRFZoYPLTE.:Rf3s:\f(.::::::::@LR^dffffjv|3:.̐ \fRs呶̶'+2ۀ.ې:6:BFMQY]ehltx|tpldaRYUMIfF>:s2.'ې# H`̰w pHYs&? IDATxmIwm&nd 7EiMI6 iYt9k%NH@qsTp>>/n}녪+5jԨbԨQƺjF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF{}wO MQ5ZF=GQFv37MWVjF5{o7F_ǁU5j}A?spi;LJ5j>펇F)=5*jԨQcwZ]BG%DE%xhhQ !QaQ asUE%DE%Fx?T5Z^TBHT@XTBXhtgcQ !QaQ aO#E%DE%FNW10LJg=/OUKhk̢6 X( xBHϚHN;?}0_CQx7m2[FWקQ~BF'np(\FoEe"  =O^B5ߛ2PH0uAxoٟ߂3_:˺r oVyxx@`ϡ2J a,@Z̄4'ԧFIxX5m?eXնAh?5V@aT yx@`u3|H/椪vѯGo~ͦ>kKN`9ߚ^`%{d܄?|O0E2z_2*Q&7!IUJtz?ZeZ_ hz5.}Ӭ<sC#a!ƴetB} V&7!Ic7諫MY;4?O{Fv_UQ<~3vk<\Q: $C}H/椪))Uv+aD>|Y ueq!3 +kVBFe|-u/` ?V{ ht:vy4 y?|߆| ZцFwLHsRhY9Nm'}dpf 0E2zl,S'=e2ҜT5:Lesׄv:`F[7k4!VAѨ#O.і靓cSxB̓椪\B tqjlպ Lw%b3p(Tlc,em\Wb^R+Ah=?ߪG]WNp}n`JXLTBXTvq~YجGBooU]T"Q5^${!T5Z5ꈪQ," A;`2htC2I2c/Qţ376F( PS B;h3YTOj+׷d5By*!G샐تFɢVa5k(!g 啐+vAhmK(A+c*|ֶarcQ%UM%k/+!z2!ZR5 r|>p\Ш%JIUBU!wyM,Hhm B$Q м$T5*H{K$+Bܒd#!ï5:#]f9x]BLX m5:nEPf]Qra&!.VBhڹFǙJ) <)\c4"ľ&ɄSIB{רvtu#t2l^gbB4l  ]rwt9YDFB|*NM@◁,4B\SٹޛF7I(ǑJȓmزFՑ+tHij |H){dzԆ7zIBڝ<+! NP {6j0yъSţみqSmУGG '5KH# Yqrxt%T5J“\akT7g}2oУGG e;˗LHݙwwɉ\Fc6SG5{5!QFB4B?x8 !BDh.BUꖾ2n#G~8==*/Gi]УGG L-Sl,LɉQCU!p,䂼4uPRը FR2AH(3LJ*j4'Qu֏5o9 }rUG8~s fBF+!Kf\F-Q PP)q}XF!kPuB"J.k4Q}/޻Tw:rb8v-Y1["DBEY e"4VBvFh>BUðd;PСLbxR2!yP]eM^$E%^`&T5&~FDjoNa?pd𧟅P 8nÑ~7izzz4).$䐐,2%DKˣUJF3:>vyC=AqvQ2O6ϟ< VxQ/CqW\R %K"Ѝ6.6o蹡%?ߺ}Qآ&~ArBKz(HiGoݸ1y={w;j iԗڕBzsGMPnf\ǏG_ryBY9^qcˣ{&tQ7v%s,/.&:5 k$wG]++OujB |nP< ݽxԩ2 U_((Ո:tmdN&pzX Fs ɔ+dqC(}{W(b U9QpG'k(By>Bf';?!F%T5BQܧ, iO1e'wQ%QBFSLBFSLY 5)Fe"4(F Oaon6ˀQhSQr &[~?V+!ݢr Uj]5BivXS2LEAK"Y`.{'[4/!wV IըQ2Y1].%lbE"^ӥPB9!"k#K [U!tFLU<\P*_YGF@FB9E xўwh6E ^G{BOUBJʎ[%tyўa*ړktڈEPtXiEyܺ\:#EG;BS6wax&|Bюs*M]tG2ʣ!RE{{!Qzv֭0f"4H./=4WGc;rv[=(9ljV<Ћ}(̣$1D=zrLƳH]^{ԜJVОTIsAc4zVG$'JGse1PFON=4){hOF_)ь3*ĤQZr-FI]֯_@Igg ĤpB6d}6M4׫їm`oj9P'j4 25%[OHhBUj>{{t\%j o _F[4F_= h!hN޹{hBͨQ-lFhը+== O4N}pS]X%KvKУ !"'X"У !-29 ZT(/!BemQ ZThB]>{fzTׁm4EЩX6ʄ'V|izGȱI(֢2Uwujn4ܐ zkFIhQpPZTZ7f5L sh! h^Vƥ̻6<nQ.f%0[_XF Oo)%!&h1IZTzt5uLxR .H( *!ׄ'iQQ$zLu9BU;j QnxdhT ǤEGzcK<5a=k ; hLQ\õKm䮘| ^Ĥjt(ml}օPʁ52 pI{^ĤjtE4jg*iu}Pivw!B 1 uoX-Ij{K=7M}!__#ZKW$az4`-);'_UE!z+4ℚe ŞbڔF?rN=3_LS1YESoJCh( %Lb|4N/@!6GA-Fhcʡgٖ[KMܔгï"4l&I,%]n !jCɄԍQ!膨Eg'm?|இVYomQ!Kzr’*dZKq4r[Wa$r[D"z++-EI@ ϣF;0ԣ5)7CNI8hCB`yvo)<0MBTIx KBF!BnIH잂x{E մ'q>BE+!3LPFx ր!Ƅk6#ctir@MЎ qgi7mG(N߽O1FiZkXǸ%sz!s(Gmr{zx _+/HH RnO$A'4nCk%n+M&DkA2Zߊ?bZF"N#ƴ+|QGK„dDDhܣ'ӽ=r {dBzgAQ+ŷ'khmGG  B#yI"!.+! x9/hw$w~j%.>Q3/wGG!& 94 9^PFw^csBY~ˣrv>f34:6*Kcs*!oWBCϝYPFwN{Jbx;FxOU.=FzL( 95Z oy8N)yF?(^jfaw b\_ 4'i4BAzB.j !F_'SW1{XXQ]UBzP#k!i,-BԨeNO(R?uaiE`ӣˮ c,/rY -tK2B; tǶ(JhTӇ_ %Kح^@ 'm$W+ OeP`e]jQ!!nˠ4BEInȠ41N}z̴5̦4tZoyB=P }iGY%!iQ۷C< BҢrS(ţUy5 _Omu w XRsۢ:M|?tBr[T'PAHnj4q 7`5\ ֠e Aʩ5J9ԦáGm@P +4!Fڧ4VZd$DШ~Orΰ:94jըRZ?ժLG(Q3mӢGzӢG?.$ iBN #mGKxVCz2E-r̈ ʦ'e'Dനх3rZ^ 9-jy4Pըg#xiQãPFӢGy3k"䴨rZh(mk4<h6EpZT(-gƟe $䴨QR<|чrZT LiQpBU;>=گ*%~e '4u"!Pij!턬hx3FS ~n )%Dhѩl/>bl?(QZݲ =bl?QRLs#WI5JPx~+3 `V:ʆCãztBϟ%TFYYWG*P,y-фFs| Cݣ7&&'xhVdBϟM %&&uoBQR͒ YFI5F4*/-{l%,vyTyi#,ak'ͣK'djt8fD}=6j]X!;ktn@Fӝ%17!SiN'diTv$=)F k45kNUEIj%Kh*!{(ZɄ 'Uǝ6GEծpBoj6GEծGwUR&6E,EhӢGpXt8r0lKQ!`6s*+YpX9G EmYZG&u IDATss[tG$T$}WzT ۣ0~]zT\j'am֣]ӤQWzAJ#t)or4VfBŭgޕ5iխ.k3̄-zL]cZeJ[ϼD%u% $T5FuX(J$jXegTIhwF'rhtKj [,u (Yђ50+)PFs*Me!{#ĈhrtBU1>qtKG(xc4o/Ps&&xc4oݭP>}TPSP UGEc>uwG(آ1 ˣ4I h!WCD(آ R U2~_uC ‰Oǧtل^_N.MSGS&B];JȥѨѥ 7 \#ߙ 2VI3Wsq!85S4O  eS1Ь;+z-0jT,M4OVƓQ B_{]M_}xޣ|[Ji ƝzA*-iԗ-ţÓS/Zd\{d*PFJ˗G h]$X4LvO`c^D!ʴQ!FƂ^Ci(u=0XP߻ y4 7^5ڌDvLEq(ŪЋ'R5Zw)T,v*bIj5J1M_ѶbQw7LHE'GIn E4vB8@,JXF`e] e`Z^Urh7oe`Fv(!_#K~OH륯O%Gqv%bږF+|;On`o(8ݩעN؟ע9Ehg/Ei6ѮYH#~Nߠt^ x-)᪻BŠעH}X1!-M#%[!M^mTV!ۏC8aAar9&?W0Gm$IbCnUQTF`&﷐;'2f8NRУGGB !Bo=xr< ڇFE&ilB lУ!D1(P|h֣ sO{ըYgApmD4^-uF=<-uߞ =jKP&RBOaB &xZ':JvCpPEA-]X ,aB .ߡF5 DPOE\+AC(V. !&`Q+iX/B8ڊGZd _E%"B>=BŃZ9,nH6fJ#اhOVQkE&EGoޔ "{w:L =!S=zv&=!`%ʢ IO0q#գ׮IG>c"գ7opr&sLwf zLhY lBI7VBgS!{gЍvMhY Vi]?v5zQZ'h#9GVŠ@!E(YggGi՜#܄A]5U:ڈjnBŠWBvM(Е6sQbP+4wzћ7MvyM-$ѳ3ӣ]mxj=|:PF8ZWn\ Ž{M,&kLvyAyMq|ބFIqףoG&Am<~ÇM%$ mC:{4 mޕq G9MOVQ%^}-o{4 8ŽlrxC~lr^Q(hFBlry%W{du9jGx#GCOIB#sI^>|m-5xN0Ub{2x4'!LF]WqJrRNӝ`5ze>5ʡDB>I$NYQmc?2r[Q '"&^ ܥ'ktO5E>ܥ'kc+h|'߃d"/.=YQ1RR)սaX4Xo3xALa.e}Y22,QkME2,˨ќhtm`xtq|;!c 4(!EQ6Ec<BEQ6EcXTtvG8+~IV|A?bQ}S1^B(붖8bQ}  AjG(Fg\qfwh|V 12^i 6>VqXW:8;XT~юPt]MH cĢXv"t[+!r bQm}F;B}3|'+hڶbF1=($8Fx&6E{}@DfK'$1aFA,sсȻCD2^6yAhG,{PQH]꟬U)It sjkRN`N+9mUE01^D)'DF'BڵBиI dM,'DF'BhJ D_ƝmJ{LHhxC;Ƅ2 RݿAUWqisBD(a,ҮM%. z7OBYT%(&;eA JH;DhxVƏ0z]ij9C9jNlw?P/86%LlQqÄ4BxuÎ o٢Ʊ M 3#-j2f꟬V4:7&ER1SSIf`BmQ㓚M"tn貄Bpn(z5"hk~dteω55<ߣ55J!$B#hk1Ѣ<%5j?2d"ZxQHjԬ}L1͑ kU|CQ~Bȶh=:FZۢ#Ģ܄\9ZՌX4cXazEZ `-}$#!j3-ڈip@GZ ,l4F(jr9S)M󍴴]6)!Z)Ӣb͸>d-$5@iр@'Zz5֣! N,WLaUE5JCϦj4!EU,pDF R5DcQG"5:#t jmQG/S`Z( !UE$AA Skl9z,J|NBFsXhoഝӈn<P'g$(ͣ Y GycQG"i4ģ<yjԕS/G8lJoAͧQvhtNB'I!P;o+V4-lsT)OPiTviFBa5$1'!4:'!բگF&vvxa;5v~>BU~{>BUj9 jνV<&F=J. zيxOȘ4xN<=xNHhHk'լa/11nkE'&&q$Uwb`[&Q$!E= zIeJh EQBKph0ԣi0A9A}nǶÍgGۢBbl; % 5'M#|-N??];)=4e| Goܿg E j9,&m=T8HLaQ/A̦rO^ȭ_{+ps4E970ihAEat\G(z`BqQPXhQ.!~2~BJ8~֯G?m~MIH]e)5+L2|x簘ȗ*& KkQ ?ofzG@~4aH?Tw]/lp!VN[%4S=Bi76@nJKBov1 !CVNԷ[ h4EV\i`B`!NZ`$QE6'!aJvU=CH pZ|_v\dk4}_Ǎʗ8B/v9qAD=jÕkQm-'M WݻGYi7-е6\?oyAC.!yShxVn_}Qš^@ȸjɄ=ryTxThTqѰIB =|LqQBmK&tˣ2śoh"M>weXYGo}2.%zJh2۷5@YCأ*![Ʉ]*еkGUB4z]L}ݛ75Lj.QѴ>w/УGG Fxђ =|{Ti4OL5أZ Y`hjej4,QDBFRI#УF @ݺMÇGF  K1'k@5rl~]DW1$k4aO8y:`b:;3|8]BhÙW֨ٙн6|aZ0O1y]}?]oÙW֨Ձ {u&  M>þ-FkU`S!C ]\<4 LxJ"dh4;{\rYu&<#!C ](ҨAÕLN鑸S[3fшN5E;Eg tˣ(!SNB>1R4y@hѸs1q5=Joy݆1,]3Dw]\%lCuT,pP].MEMrn: *M$j\.}&΢GIU7F_+E21քyzPxBORQJѣCZ!Eۢ ݻ(%M}eBom섮_wxגּKO(Os1Šy4yzhNm9д;/(rhLWk:̢^ Kh>ёш,`FDcg] #=YF-lZ̠F_GB 9P襌0BrY 3nvK(|{NڠT\FΊk%25ۺxV"z-Sajy0~IFF/boW35Ԩ x+ŁIG-55xj5>@t84(Q3TF`uOƠQE1R5]ΉW>F}ń4g v+H&(C&ǴQ(LFK|UBtȰF֭#ܣv&PF9}UBXrnq*ڙB)EQ/r]އc(FjQt7|Xb-Q &NB}{웿HjTt>7[ ըލi[w0BݙF}"W_Lp&^6tZY1™C;yQ= Lp&NjEEz61™PB"΢pOr hWh('8kx&HZN4QM0+F5H!,Ѧ ! &4jn*&|FדO?=!(ӝ| "tmt)wFCۣ~5qz ϫ>tǔw.*I! #cmh$ {駐GR ,+X IDATE=RoaX@c-~ OCӊFa2LH5aQnBhxVz#u o׵k 0$@,HmU=r8LYvA3,;ԙҰѮm@cch6BS]} Բˣ!p#PejTx-}eƲe}t>ZT޿{fY#kE3ˣiƪkQr\ik,J'Q&B^vؑ, {" Hh6MLŷFˢ9NV֞%q܄NO?ġ FEAK{h2!a%t—&$mCoXzhnBi[mmxeQУ@AUlx^\h?"n=\!1kV쑳s#A#DG_0R =3=LHJ"vktF%ѥ'k" )m:tPd,*2w-ijܣ<ʦ0BjTWqnS z("DHq>h(,Xth^Wqr^(`QwʫlШ-ky4:|4j>n<4E"5*@ "$O6P d%v@g*駘e^6PjO֭Qhk4!p(tdx"Sz5  4YlԩǏ{RN1%{IHhbh_`)#DQT.,2r)96QgNS71s{O]5-AԨ]bQ!,,z<Dݢ#y5*}'4®nB<]z<o9 b4z 嵼[bCG?#v?7unQ [vGUHfZnj-~BF Y'̴Z .eF Y `BDHEۢ.&Μ5q#|hmþ~waai=D:b['dXFcգ6!fqBڡBG(6!f*r)k<^R?dbv4zuIbeՆy(aޤ]({g=N8&5Дrfѹ g#W4(!W#txB5zUF~(:ںFڧQu/%+[:FH?0F`F05̩ #YU8!{L2׼PdzUa,{jtg^~2hectJ:Ghdޥ{4ѼƜ_C(wmf"Xf%,'{Ѩ#ydmqԨOrnG J(RFYCErbHI2gEg!?٧F# V^`H>ݻM!dX43!2Clzbr܄'kըH`arg»O Zy,:J@]G Lh*4:wPKsVMj2l)jdP*FƨWbj[KHh^B$?6N5B\Y%-e 2cyBÓjTkIdX& = =q]! !G&Bu)s֞T =VBʤPOEg!kte8n;i)}O֪a7,C>E]!e,CZRd\htL#4mGwh#F5k(sYtĻUBhfJ5[U?F`% %;T '4ˆvP=iqyJTBH^ɞ4J]I9:BgЪtBb儦'h\m*N|y=T\jwE>BJ5SH3jJ'ID%!dGUFdFyF%LȪrO֩Ѵיb\ SI(OJp;pӨ ֜9PL`'-1+!NOVncop򤫄t EeNQ&GMFQ5RI>o~u`n0MFBIB/Z{u#'( QaȒ`֋,*!,6ÇG37do<%%VNh:nW 9q& z50LZT3N }9dUBJdBB ÓxQٷ616> ?AȵcB)CУ!r:W44:uyQ$MH_sͣ%ttDK["n6h=ZF3] `5q&ѣ%H"| q#zt-A/]FLT:4:dwMKuHb儬NuJbH,BQFDh=>S?K>^Kh9-Bb IܻQ= xTOB;hXi2L_$fXR4(ӆ9#S4RUaJ' hXJ2f]fQ~Daιz 6EGWMWfQ >6jFv^606E'e#QYt{spf0 ͢G3ʚ}QYth[f_-k.`Q9Oj|A XT~;w4L(k: {E6nPE凾rEv]imѱӧGrp Dͣ&g&<  ^yEh+(XGjTgQ!Eq. A~kt5zB9k"3-𺵇oSl.BD4nB.uituitKVQ[pMBZ 3xF+!%5BҨrO ǡdPfmp#' 1jBYܒH!oų:i1]Bƨ]<mpۦFU#u]k?,ӄ'Fcb?#$FBm('$G86s:9h&BƉ ]"B~ ihWJ*F9| BH'tq{tzu6BϞ1{TAm2uQYu>B''5 ]k#5mt6BW˸%6ͧ]/لq<9{T't e [3zۣƶփ.r d By.Oۣk]% c dZt>BW{tSSGz a,aw‡}~jnrxԩW;G$GuIךG$trQеknzߣ[觟:<+M[P1ɭ[uv܄rkG?&zsʭk<%2Kj[Ou&:A@uQ^lB܄2kG?zT]sʬk|iTQ;ШS@@)RLjkCШS@@rF'%E=QnBF3j:&L̄4f T5*Nd ucP0 uc'+FQZ'rB4JK'Qb-R1BUfM6~6ÑmEhEYzj,mrbةoTfBr5:&آmbĄj}hIEMFyiC'!4@wL]r~)kuFyP._ !j#'7+{Mt98ȉzբ}oi^p2O/Mx2r hF)`$du5:Zt*|~{tx8 zm&hѩy0MȨ6 ,&B>jsM*Yt=VQJEesG:R;EFu&z~ʞlEOgƴ(эZF:Z<9TG8mî *_w _!n^cBza$چF&L5OB#{S"X#䜧_ < m5:>bhf^0B+(W%hV5uB(l~dY F7H. F#{5BFb-6QbQ:5ۍ̾ NngMȩB.25xv }Ղ.#" 9!\Aȱ1}BhHL!i#(#)9_}^hQ(WM[>:U~y&;,I6"Ьf4lDLPaђ=j?a`BHB*!EKh|-٣xCJ9ҢQFax1QB /;,R 59,UڢF[7o<:Ϫ2\18"J%D !厈q#ͣ I̽=&ѣ+YQJ =|b >M YzܸuڬFph42+F8FE40h4ZDC)wQ✬F8F5Z,gI %ktvF9#kkt]3\FBT#tJ([PFg"$f$ԨV4B;h3RQIh|f/dJ(Ox42 %bZhTVR-̸lB>7T6JD(բ ZYitbA6\x{AgѢ_t " zi)j6dS!Eo"ivSԂmȦB gLڽFylQGUGɻ2;OzF="[рzt~B gL-کF6{z*գEXQr'OR=JLh}QrTJ-gLB ._ݹz+θ)A΂R31ӓ' %ۨGiNOJTOy3o:=ͣ"d wkUite xRZc:G,XF#ĖIQjjZ<ͺ^FK#ĖMQj8δ)A'D()F 4Z!J2R).کFE:Dkn^Beb"57ziHL-EFS`%'chqE'<1YH~r4]ӕpipsk4\ ]ܒ:SBW;N<8~֯5:6~;!T$*!,a4x[љzјokt|@+NlEw" Jfyד3T5ez3%IZ"ez3FdeW1e+!<5+!,c5k~/xKԜ3ez3%څF{:oYjr|3תR #JͷB)Mi;FwC sBOSKsTt[Ѹ\9Ove,Q%fB/-Q5jжf!t O #6<6I(ޕ6P販47{-89z,FiWн{^Nhɉףã"F3R{tB%qrh%tףsO'2~q3eJ;~Tz5T}نμTz=TiX.!D9 i?zBjtTz\^J]\}h5{E4\Qu[hR D/GSh&BwHMh&BWJڍF˟mɣI-'X4/<:z&fܙuI;aI3:kziP B|DHd!y"kHp8Ȓ!4@d%&JDH}:Zk]S{[/ AL5*!!{TlSٛFc,]テ*DoTbf ETzHhz4/!x`;ړ]htܶWt\ Ck(HxC,2*!zD yDoh*!FVBT.Ch$:'0 IDATG]m*L -Ph؆L\"4<^<=htڎws~z5VH֐^:@*!^B K5ZF xkB¢¢jtQ !QaQ aQ5zTBHT@XTBXTn=*!$* ,*!,FU[J JQ;L`?W3p W/8zo YπWVelPVKxó_1>FzRۍ8T?qp6|*3>]%x WǬ|@z19ZqDըHԻqf~-_MkǯOb+(/!귲(m 3kF@+%d88UFka(>84R}֖%ov2[?+(3!dNBƫsF/غFV ?o#Q_뻿NPke֘Z&F,Q< -ZVJHuzѪ)\Z?c|Xν(~]ҝwsz C>'{7zdfGbNzf~ʓs>'u2^`ajoC1 | .3h[F\k(/ m,c}2Z'!Un!CTq89o. k52)V pҞee`-deIq b<'mTB8ncv/#+]l:rq'T5f#teb@'CTB8bۄ J< A?"t,)a1Q5&uŕ+(Ӡl֣L7ѪQ5Yը+FŢjtmũy4!B4Z ajtqPn$,E["GF7KhFXe[#O1m)&գ&T5ڏE5B*!GL5nxǖ5:d 1N u~_ ANbkrrl:!ƾ*g+!0^B+3i( 8js Q !JlFC0 X2!zeD%&(Q7e˞M&BhVC_,gFx j۞II&kܫ;L4+JJKD(&HNw\ׇvC=ZFG}'JɓBIAB_JɶuBioOwoz1SM(T) ._%a芒²mPF|UA;?Fie$K(!J^,Q2!Q!PFu 9pr ~8/_5>Q`'tt{P.@Usiݹy}B!E DQ#'e5* ٧!]H.JȎEn~]]˴b#ioeOeT_ a e&m[qTITBPɹEjtMݤd7NF?֊r;+xohcV,i$DQb< X) & A&F3hnIF{yP 7)L50G4w-Zti]2Ohm բ2ls!TGTB@ɹbJ4>p%QڔGFRϿłeC!ydPI(58~$Dhr&BUDZMYѓ{G+Br^B{L!CH^hoWBahS b_umb;mцP@JL0!;hHaqOcAߞqհuqB"!i'BXTգ>Q aC+VBXBbMFA$pL2<\sK_TBֳb U9seFZ)k7NJk!>T؏畐`BU}nK߱oilΕ@}/3Pj&Н'%!Q L(Աm'sŖeT YJjTϝ bzTFܙ vR eT soPը:aɐ_mJ"9C}Sڕ Fk#8uteڝ7pd!TT~ ܁"҆#'"QeO/o.zj }XD$!5xQ!P!_8o4]'..Е+.Ghn0:ɣã`h{ Ԯ+3CbF.BH7pxB{wxX;+W-5/&oByH֊XW.AH7pxBYwY)wxG$$#:P~ѿQ:$71j5MMo8kƟ=cpcHXQ-cPTd)kʦeq8T'NTNp\BUZjWnբ{*RFIE+ R1ˢ!֦Y'!4}^BaɭZ?D-7ޙU8MmO-PN@!1+!-IMSQ=ףX]BW/ڈ5r ;!UJ"'md! BUm /b<U.ۈ KNgL"%%D}5ҽmolC9 ݼchc{F~QsQy"ʣ72ȣOy56Og#tf% "t$?}"ңhQG::J(Fy5{AB[u4bnތD1nH(@H{!q5k1G/^{2УYMAy5Gr|hx`hB7ogSEy%1.N}p[xAG:=%yiԇU0]iP<#ԃfSj͌w*֢)&eHJ!Т2Uu-ڗ;kC&tzj{Ch_ N-DhO|( ORZt(ɉQ/!ȢѠPChWQJIdѮ1ڇFqR_m? 9KhPe }xF) rq-JLQ !Ȣm3qA.n4 ,ږ8><!1hTLif-:nj_A iQG5J#Xll B]P7g#4J#Xt!vqQRXt<!h4$տaoW?pf˗Tw6H7"D>S6Hl.E."qkm]5nǪP%>WdRKGQϺ &4]T?ލ1z%Ŏ 7FuB׺d5!Ԩ *U[G4*ճxQFt" շ#0񔶞i OuhbGP i]{Q!hF>GQ\hO]IyXbblYǴџ(還5?x(CfQBsQ\æF#T5Lۡr*nԂ`,mx5jB,:zdBa= ^=dZF BEGIN?-Ij3qS5:zZsԎ%y4vϠP5J ԀЛF TI;F TIjЛPhh-EZ=*7c^SLBF sBH(tAi4gyyN1Qi%:.pZP)MiTCOP;4Q|)Ѣx;23vQB-|43!4Z4;!c%\nOH<@+iO6ѩ1Lz\A([ajE4&wYmpBd:a[4MjrWՍѡ Fi а-1,ChKMnZ5jUȲ~o)%5 ~m)Yӄ'!P!Z$@H92J jtBlEiO6Q{ӁH2-.zޛFjlBTIxޓb5jsO'45dX؊fmd'msE*si(;LAD!Y"DTP,JHNvDB[(\h1YTLBIִ 1R~]< &D\BE+!8&B(f5?1X;rڂJ;z1R~BEC xB M !A#D,w]HHFP[FwآF{LN {)z@. j0unBEbGT5;6!gsY(njljRFBM !Ff:4!FnEwQzI1aZYqY(%hV YtW ᔎik,{vRb"#6))A͢%f=i4hE)aݱb5SMHnJ0}J"N3n)PըYâ/(X~@; u=qHu&vщPZ>-"UNeKBI{Z-yW B"ԤzѣjZ T5:75B57f.1o.+ BMIHǢG'T5O?A <4JZ2!s}!(DY[UBF m[?ҨHxO%4*;ғ f&dkTvԨl~9Bht#ahTQ M#d܄LVBfX]G(9tF\5~sU2%1溡J C%ڴFg)w1բFE eζѣBc.20E{N]PPQG~ )7i- rXІ5:hѢn%'T/Лo=t~[ Q7iQgvHhɐE!]n>ѫH:ĥzSFsdBSX%h0Bo*APifBJYFH'[{U|`t^" #F ktehj4:`h4QMMnK(&7*Be0}4kICh}sˣ4BUhQ5Zg#h(Bׯu*Nߐ 4.z h sˣDBU 1Lw}ن<ַJ m_xԙK3# &t:QG%τZ<>F=dE<%)LjGC e_R<3\Ɇj4mSb)B=|t0 94%Jokh(!FIJȥQ it6_|~!t*Ǹ58!&?+mF't|{OhKYsktqBM^BArkukT%( IDATM ֛W,(jQKu F'DZth#eO:>&x]isǒwۨUZd\ixRזG)J&DӨ'ŕ+GG.NQO[TpӯM gwdڲFDF_T=QR jգZ4Fd޺zt2l5Jgw%eڲF^QR4˗G_޺zT5lhdwMхW?8.>2ikˣV"W7y xk2MȧQ +m{s OnBBy\}m{ޛ#Lxrhʯ=|JA~/k(!A~&TF:Q2MjTKmtߺ,Šs4 AtyF] e-~1ht5j@R!̢CIehFcEBy!vIqE4:|-*/a9(+'4Z@hF&\rdr Xtme8PecwE[4nX?]DE:D߈qrIE[4!G.a` 4X E ]PoP˹ F~FmlWLh4ڕĪ ahWoQvBЊ@Bע4B[(TH+?PPaZ1E5 #Y$+%h%$ٳFRx a;ZTm8/UBS[`k@I(>w%4>٨FRYD( 5oTSWM$kȌH&BQFWEqPbh0>BMbGrפ3R"h=(D~R#$_oDFtXBA46 tr^1/Iq`*tr(:Q xR%M1?UG$痋~9\È7q賜! z_v )PHo"2V'(@NO'bC2PejBRsM/SrT7GQ]M+42 *J{16Qsgf/7x4{[ U@NN<ﲮT! -O!D cT^~G1>S!FcpSHAa(w0el\mM6g# eb=VB;h g[B^bs[0ԤA/$FYSweB3K8ggR]B3"li y0VVPț˱FYE* =i:#qtq y./b]BhP[1.N!Oؾ5cv~|%[j` D36G < }]BBl^6)BDl>>j+-vgt'cϞQ(I!t'ѩBl.Z!t'Bl^^R8I!O>cc& N:GR*~WB|>{Sbq q(r? c*Ks)M rz6B>F 34>bc3mrF 3BuơnNk :gbch+Š5!۶hW 6G~ si"+Yn}̦AO=:(W T!.F 9z|,t q1zyisPl?uPhX'FaK1:`>sTQH1:@GG*읣BbQM0G9P!ў~ ߭B:1-sgT59fF@!;Zz4ѣ#yrR}:= sX)3Bzn (o_9/ƞRH`ހӧaIW$x 9z|lsem%UH`h|w:p&иNz'@~F.ؓF}Q FcwR!&p \'@|hZؓF}Q FݫLo@J!̦(_pT5F!hLI!,F_)ƨoT͢(_9:T+90L!XLN!e6[!$F_st% YbԷj*Ą6 F 3):ԃ|!rTjLߜLF!t&>V5% Jʤ8Pb~cMUV,Ԅ'Fs%G ;#L&<10=FCQ-P>0]B O +o̶/!0j;h 0jTFͶg&P]h1~lѪt6 9ٺ>f[0EkΡ8]!6$CL+h'F~쬕7a aW"}}V-èwS4Ijx !?T S C!H| ?^~Jyh?@5̡Ly (hͭP=KSH3)4<>Bav޽^1|G͔uIrUp 0]ʆg|R^N ۣ(4RH·A՜Ph\=i~=C9*n12f!auN!ZUò CZxSvkj:F+N1Yoi22B?rhBul.|joĮlCJ 90 T"*4]Y`0 l(/"YˆQW`A^UU0F5RJ$e&c'T8̈́Wڨr.o3aU7J*- 8 3;F y8'%THiXEYˎ yKF7թiwTK?=|"cT^@t `t:/Ѭ"d0:|S+"jDN!ÞcT 3591|[njg@Qc4B%W "ǨBO7E+5>ҐNQ+g< [h ڠtIrRtl6zc{cBy&K4c4n>/E74Γ(䤨m:} n\]mLSJw) 娎Ѭ MPP꧀p5xԜ %5I{ , MPPn):~c{8jQ y20*{w@j@V1 ( \ ˽`B*(¨XAoN=q3*j?c8cTB >nv)(:$@%cPk*B8(tX9:lNEATOջ1QLpdz"QLpBr._oMʨЇ8jW[f!щb;16!xv/a"*iz"Ѯ alk xLɜ Q!Fs(ԯdl2Wʨ[j3 ǏaIJ!1IЋaI3)ĨF!=PBbTLи"uZ5+BHN} ZNQ7GY ʵP/Q(QBN) hޞ IFs+Y:hIF uVQaJ _}E\N*¨]@OB ` FN=Qt&&:GѨBub4M1 Zƽxڢm~u 1Q!s~R]g.ͨ-:BP"n)Ec ֈ]``궭FW WCѮ>ujL! Fn y(WK Fn%8 y(QX<|[X*hP!-*1*Xc;CLBCXoxE/fB>}VJ0t2*gUu_TC!h>BA+Ĩtל?ɑ'}W6 E # ]!(EQHM20*XCEɠrumWSwGHC EPWP(mD]+& VQ۶ʂPQ :'k XuwgpTD!K2Jh"OA!!h=mhPQ BT_]$ ]6x4\B(hVhR~EoL NP븿ݙP\d }t!hG{(`{P(`KWHB;GT?`ZݝQ%Pȍ&1ozhQhbGq ҭGїIfiPK]FH^B 2i֧O nD!ݵE;R!e*T i WQ^(A\Fp7c5r8[BZXB">^YcO]B ]\ݢBڑ5bq Zy0jeq`Q+B]Ʃ?x5|<7LfPjY<_!,g{-&F % :s`us2u^!6FqњIp3HLBE(stRl"9uYʁQt}o3c F=WiDŽ'BF+d!g ]f򽶹ZBF+tshB5bxצfP|yŭ,fP`1T;MY?<*txAQTG*m6Uu{sK!Rt2J6-?NQBO͠5Z^Z>ƽ1$8 R\pPbp,\!mc^&$a4ӧ}p =ysPSP@n<>&yW0E4~sF ֓$^my%FO}T%*c)rP8h2K\)s0:,ƚOׯu FcyuRt~ 1x{x5>6ѬCI2lE<ɥѬHq w=hWs)h4jB,B~F6VQ cLJ 9WO!*$Ȥ0x\o)Љf"v?bUcy0 !>ypT) fxy!B7Nֆxvի)E#ba$W8 Q4щH(FU;hN\EB0Z=hjy</ Ľy3]1QW8BdG9*V0b!JS(]Z 4OM`ۢ0 @rL)k_mV)Jﮔ(Ga{?mZ ] G9 5Ji iDV;>{ GM>B# FA57(q:؏]{6+8FR mQQ#mbD0jbh*du# X!1jbh*# ޫG7F-JLݞp8O4!֨ݷEEꡀ(\!EQko(t}(\!EQko(tU/ph F? k(Jߎwơ0ڕ+^( ŨG2 T@a=\ QBmzSKS}Bb`*h֎ҋ(tuqQB$n!dc3m汭hc4S`ڍ1<|`c4>C8R̓?ko&WPpp Q( bJUQ}+5!I60Z)Xmֳ~rJQG'%L*7Hd )saJQr(e R4BU7)jr$Ԇ̨PꟺF*ꎛKnc M(HvREQDriBJ̼!R1:Gw4] 9!RH˫/\aNx (3B!R{ʤѪ[O|[ q[&F1~?wjJQ'G]E{䨂]H+$ySJpՔNfSe+gU&T:h5ىP4Bӫ6F)Eu^HLvc{VWg ?Д.:*;<6?B=:ݾ)E]u|[!e"9laRQǷ$N?Q!m,VS8k XPvcu UG2d,07W W(_Q!AwװFTHjQ=ΰ#GorF*vQ=ƒBrK!m}N2]Bz1쾇(sZE39<֎wu0RHo``\ѸB BB:Ɓ&J Yҧ`=Nq106Vщf3ͦ"Ÿܓmڅ6F߽҈E!M-QS6F{R )F@!'uI F*|N"74]wv:F(n#ەR\X?V9zCFk}A!vF=kFXxs^Ջ(d d^u|[ v/O9Jom&7dIDAT*0dRXUW+)z*s?駖1^!k؇Z9E}+hwFA~vV "[ކ*f.j՚B=b1B"T&=EIZ0*b[¨QhUH5Sg%(A!t,BvzYB tYd5c6\@BS)JQ(]wqڢB90j(1R5 !N*QZ%kQb\lZBƓvq5bTuKs/P'NQ#dZ_u]ܾV`BStCov|ʴF+;I]STAh1M5zYD!sBeV(dcA 2Ai۝PRjÃщBF͇߬d?>@cIB֌ VPmasf&VfBL!]!B F'o \}y[heqRm'C犲(iV|oӋ(d%!Wɧ56 [!U>-[ءt($*EZ1huZR{;|:3BQ*eTNiʠ7(_f&ͤPFL(M@&5&UHhtJR.T!F#f3{R4f63Y;͢PZ>CYGe(cI|UhJ*BDZN*d,BHZNr(4nY([0RP}aLd0):\$TFy YUH9 Y,ˣv ͤPV*ƔZ mhs B)RzctleQ\# VY6֋QZd6mH6 o& )qHTdb qi-, eh"H46VQ5];^[DȂ$Ǩʍ.ShDEPt? u+h (>^jHO/6I/f(EשPV ɘuQ(y WQ򵋒1Q DQ((ͽdJ1J vHzBRP,^6^m;ݢ Cv\_Eh(4n V 4L8҃qQ(* EV9RB [YFWQZn)J(:|sb9а+J&1D8ת(v:|sb9аRkدlK#K%* Z Pe뗔uG {蘭 8Z9dx- EGa?Gj*>'O9cZH%Q9LPޓ,B~Z~L\rQo=G^}DJ(&q3bPAhMnvLSB߅R5pQ+ ;%D:2c4B+[r~֟(B56k+XZ!{%+4޼qvYs+ I6ݛӖۿ|_SQϘB,ֺz\RQϘB,[[G[!!O!F7>nHcrrԃќ_BLF*$29[(tu[RF`0)"B݇ќ epPȋm+tuQzt~m v+웁qlV:E6(,rmB:Ek|nZ!F+[(s=`2):p"-3m $*GW(F+G q 􈻣;uU+k,V&EMДSʤ^B&G IQ[PvmJPCQLU?ziw #2)st Ů3XLvUyJQj E2)qt; 10*X zN?~48\븦P#}^g( ͭPJw2#(68UZhX)R$F_N7  )v eC*[`tHQctHvVѦWZ$ˉV! #|]BH0 @oA RHm.0 ;$l:nԤtR*l>) 5ZҜ9[Ph4Δr5FNoIK1M3\ MYL %lUX%n΅9᩻N~(X!^!c^iVrlivr"Q/$x 简RxΌeB@}{ȕYZgMa &&Sjӧ!)fc4G' )uzt F)tr"Qb OͧP9Lлi ؖ0ZUjy;OcCLĈ ~MBks6?{W Hsjk\ mhY1MS'Ph4BB+htӘVNc(IDcľ4ƴQH!96iLӠ-orQ(6iL[<-1mR(vFߏJ=>z9|(*٧wovS訐RQGE+deOA8QtM E$8GcYӣPtQ%)uæG?脣xrlm7:5= E'݁BM~B G1y?> s4q˞!~$wy FV\5F=h9B/4Μ1]BYc qN?F٩ρB( V [ZRlB FiXBS?(U (4G!- u(Y!Z6L6Q| )gI!a.Z!_ *$L *$L(6{#.Q+Y5,1h~ yoR!.FkVzEQt9*>FTEѷQl|)(-îp| 9(z[ՊR 19j&zN' U!7E]Bst{ )J:$F ;q 1WKV,qFJ}h6*lV+t{J"FV^_zy*89`(o߲9J̈ ${xIKuno%fDae(F wd_BBo29X 7ݺBLC`/hNU0P |WY FgSh5)6uaw-d\l.V!Иl]֌ ]Bh5hFMV2ct J5aI! @`Ϫ-y@MJ!6ELF$6E)fR=Ĵ 6/Q5RuHP[P_3DbRuH,;F*V@- ˗9jUH7|><09*.SHaiNr)h92J]b{ `Jp>GaSTlb[ q[oS4QhHYFRh8 RgV͛Ga~Z Vehf|p(YV0p}ߊP:y&ѬD0yY1xיbti 15Z0*`4fƬ`4fϲQ 1r.0*3TAʞ:#Q!&P a4YV0q!5$1ᩉ4 1ILxj- bCLhSHj)YV0z("JQ3̈́QBQIP4$P IMxO˭Ԅ|g1|DWj=1>H܇Ax)p.b(Hbwu͵DO$I0;: T[ 7 R(TE]Bèx}d['${ q3Ee+?r;=fZ$+$"evE+T0񥚏55mZB DQ(SH% (.z-aT$F$Iyl -:S;[B;èWQ!TxbN F^e*HX(qvQv#x((UQ(7@ B(9aVC8P%)$0bq( >TC ^Zu(| F9qО!LMC| FYS(@Ƭ.a.a Fl\M-(| Fo.Z1TPFW;N Qh1יP*%;X1d ǢP<9uj p1E+{T.j ZB$n(f&\IJv+}*tq'/u][mŋ %PHbvq F1rwḧ́QL/”XB3E!]\9&Qxһ0G3/م\/”XE]\9'9`mF~͈D\($)dP.^TfMmF(BSa49Q(M fB h2GghBnnF )"Ԋc4Q :r#Baa(C!꙳޿9hbMQ)Q^!D5Q+@IE_gfS W(6ĔHb i~Ռ BFQAי5(^+hn4S`iI.FYr(fDthteQ(L4 e9#Fם0Ec)BaF΢к0y`Y91 V2fwD=1*%-G( 1Cwx0!.:F!!nX!!`=m)9+{tdA!FgRTĨB7QލBcsC (K!*$*, r49.FFxF M4Q43$fQG9:=h$`R`umY1ʘ #=dxV($ #e=8, OY9^&%QTN`kКx)X͎gt2>`Q4;$wb<@.j):rQ E FQ_68J+Y1:Pt(#8f@сRp([/ ҃cJh(&Gɑ5I4 W3؃ ̫eE!w/ 2>W0Qr`i;I={fp{t`_Srex(#t- 丼R Ĩ0 M/{溅QFhN1*dbS Qxr$hAS_'s5FIQgE@2}zƨ3ɆF+xHկHQ:Fhx*1*T(VA6BaňW(DQ`>C)ĹPZ|*r9ۺ1s4M!s"4+hpraThz%dEBM@[t U)>FO;FM#;E@;B*BHT}w zE(d4}aKkr" -z5;FԾV(Dδu- }m+*,/SPA!$|Gp[| mͽT0̩^WE( ·LrCVB)_(DzVuyFJ37kr;J@ys1nO!t/Co 1C] 0-EҜN^~%Mzċ~9 , !QeصBT~|5JޑDV :>Â*l4nrV( dl0뿪?Q !/F^vWa%3[9H154ۃB @Z^~GQR!h/?ьR Ay(X?T3bVHD!Ohu a3PYT <ͣ |_SۺM*Q9%{%Έѕ*/ 'B6RSѾ6J,VXΤE`XboŊ+ƲbŊcYhbŊl֑bŊۀ9oXb6`s>TXb?m&@L}bŊm¾)wFbŊcYhbŊ`XbXV0ZXb,+-VX1+V F+VeŊ+ƲbŊcYhbŊ`XbXV0ZXb,+-VX1+V F+VeŊ+ƲbŊcYhbŊ`XbXV0ZXb,+-VX1+V F+VeŊ+ƲbŊcYhbŊ`XbXV0ZXb,+-VX1!8vcIENDB`gstat/vignettes/spatio-temporal-kriging.bib0000644000176200001440000003167115143625244020650 0ustar liggesusers% Encoding: windows-1252 @Article{bakar2015, author = {Bakar, Khandoker Shuvo and Sahu, Sujit K}, title = {{spTimer}: Spatio-Temporal Bayesian Modelling Using {R}}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {15}, pages = {1--32}, url = {https://dx.doi.org/10.18637/jss.v063.i15} } @Manual{Beygelzimer2013, Title = {{FNN}: Fast Nearest Neighbor Search Algorithms and Applications}, Author = {Alina Beygelzimer and Sham Kakadet and John Langford and Sunil Arya and David Mount and Shengqiao Li}, Note = {R package version 1.1}, Year = {2013}, Url = {https://CRAN.R-project.org/package=FNN} } @Article{Bilonick1988, Title = {Monthly hydrogen ion deposition maps for the northeastern {U.S.} from {J}uly 1982 to {S}eptember 1984}, Author = {Richard A. Bilonick}, Journal = {Atmospheric Environment (1967) }, Year = {1988}, Number = {9}, Pages = {1909 - 1924}, Volume = {22}, ISSN = {0004-6981}, Keywords = {\{NCA\} Precipitation Quality Network}, Url = {https://www.sciencedirect.com/science/article/pii/0004698188900807} } @Article{biondi, Title = {Space-time kriging extension of precipitation variability at 12 km spacing from tree-ring chronologies and its implications for drought analysis }, Author = {Biondi, F.}, Journal = {Hydrology and Earth System Sciences Discussussions}, Year = {2013}, Pages = {4301-4335}, Volume = { 10 }, Url = {https://dx.doi.org/10.5194/hessd-10-4301-2013} } @Book{Cressie2011, Title = {Statistics for spatio-temporal data}, Author = {Cressie, Noel and Wikle, Christopher K}, Publisher = {Wiley}, Year = {2011} } @Article{DeCesare2001, Title = {Estimating and modeling space-time correlation structures}, Author = {L. {De Cesare} and D.E Myers and D Posa}, Journal = {Statistics \& Probability Letters}, Year = {2001}, Number = {1}, Pages = {9--14}, Volume = {51}, Url = {https://dx.doi.org/10.1016/S0167-7152(00)00131-0}, ISSN = {0167-7152}, Keywords = {Space–time correlation}, Owner = {b_grae02}, Timestamp = {2013.04.17} } @Article{DeIaco2001, Title = {Space-time analysis using a general product-sum model}, Author = {De Iaco, S. and D.E. Myers and D. Posa}, Journal = {Statistics \& Probability Letters}, Year = {2001}, Number = {1}, Pages = {21--28}, Volume = {52}, Url = {https://dx.doi.org/10.1016/S0167-7152(00)00200-5}, ISSN = {0167-7152}, Keywords = {Space–time random fields}, Owner = {b_grae02}, Timestamp = {2013.04.17} } @Article{finley2015, author = {Finley, Andrew O and Banerjee, Sudipto and Gelfand, Alan E}, title = {{spBayes} for Large Univariate and Multivariate Point-Referenced Spatio-Temporal Data Models}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {13}, url = {https://dx.doi.org/10.18637/jss.v063.i13} } @Article{Gasch2015, author = {Caley K. Gasch and Tomislav Hengl and Benedikt Gr{\"a}ler and Hanna Meyer and Troy S. Magney and David J. Brown}, title = {Spatio-temporal interpolation of soil water, temperature, and electrical conductivity in {3D} + {T}: The {C}ook Agronomy Farm data set}, journal = {Spatial Statistics}, year = {2015}, volume = {14, Part A}, pages = {70 - 90}, issn = {2211-6753}, keywords = {Digital soil mapping}, url = {https://www.sciencedirect.com/science/article/pii/S2211675315000251} } @Article{hu, Title = {Spatio-temporal Transmission and Environmental Determinants of Schistosomiasis Japonica in Anhui Province, China}, Author = {Yi Hu and Rui Li and Robert Bergquist and Henry Lynn and Fenghua Gao and Qizhi Wang and Shiqing Zhang and Liqian Sun and Zhijie Zhang and Qingwu Jiang}, Journal = {PLoS Neglected Tropical Diseases}, Year = {2015}, Number = {2}, Volume = {9}, Url = {https://dx.doi.org/10.1371/journal.pntd.0003470} } @Article{Kilibarda2014, Title = {Spatio-temporal interpolation of daily temperatures for global land areas at 1 km resolution}, Author = {Kilibarda, Milan and Hengl, Tomislav and Heuvelink, Gerard B. M. and Gr{\"a}ler, Benedikt and Pebesma, Edzer and Per\v{c}ec Tadi{\'c}, Melita and Bajat, Branislav}, Journal = {Journal of Geophysical Research: Atmospheres}, Year = {2014}, Number = {5}, Pages = {2294--2313}, Volume = {119}, ISSN = {2169-8996}, Keywords = {spatio-temporal kriging, spatio-temporal interpolation, daily air temperature, MODIS LST}, Url = {https://dx.doi.org/10.1002/2013JD020803} } @Article{kj99, Title = {Geostatistical Space-Time Models: A Review}, Author = {Kyriakidis, Phaedon C. and Journel, Andr\'{e} G.}, Journal = {Mathematical Geology}, Year = {1999}, Number = {6}, Pages = {651--684}, Volume = {31}, Url = {https://dx.doi.org/10.1023/A:1007528426688}, Publisher = {Kluwer Academic Publishers-Plenum Publishers} } @Article{lindgren2015, author = {Lindgren, Finn and Rue, H{\aa}vard}, title = {Bayesian spatial modelling with {R-INLA}}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {19}, publisher = {University of Bath}, url = {https://dx.doi.org/10.18637/jss.v063.i19} } @Article{marek, Title = {Using geovisual analytics in {G}oogle {E}arth to understand disease distribution: a case study of campylobacteriosis in the {C}zech {R}epublic (2008--2012)}, Author = {Luk\'{a}\u{s} Marek and Pavel Tu\u{c}ek and V\'{i}t P\'{a}szto}, Journal = {International Journal of Health Geographics}, Year = {2015}, Number = {7}, Pages = {1--13}, Volume = {14}, Url = {https://link.springer.com/article/10.1186/1476-072X-14-7} } @Article{Nash2014, Title = {On Best Practice Optimization Methods in {R}}, Author = {John C. Nash}, Journal = {Journal of Statistical Software}, Year = {2014}, Number = {2}, Pages = {1--14}, Volume = {60}, Url = {https://www.jstatsoft.org/v60/i02} } @Article{optim, Title = {Numerical Optimization in {R}: {B}eyond optim}, Author = {Ravi Varadhan}, Journal = {Journal of Statistical Software}, Year = {2014}, Month = {9}, Number = {1}, Pages = {1--3}, Volume = {60}, Url = {https://dx.doi.org/10.18637/jss.v060.i01} } @Article{pe1, Title = {Mapping Sea Bird Densities over the {N}orth {S}ea: Spatially Aggregated Estimates and Temporal Changes}, Author = { Edzer J. Pebesma and Richard N.M. Duin and Peter A. Burrough}, Journal = {Environmetrics}, Year = { 2005 }, Number = {6}, Pages = {573--587}, Volume = {16}, Url = {https://dx.doi.org/10.1002/env.723} } @InCollection{pe2, Title = {Spatio-temporal mapping of sea floor sediment pollution in the {N}orth {S}ea}, Author = {Edzer J. Pebesma and Richard N.M. Duin}, Booktitle = {Fifth European Conference on Geostatistics for Environmental Applications, GeoENV2004}, Publisher = {Springer}, Year = {2005}, Editor = { Philip Renard and Roland Froidevaux }, Pages = { 367--378 }, Url = {https://dx.doi.org/10.1007/3-540-26535-X_31} } @Article{Pebesma2004, Title = {Multivariable geostatistics in {S}: the gstat package}, Author = {Edzer J. Pebesma}, Journal = {Computers \& Geosciences}, Year = {2004}, Pages = {683--691}, Volume = {30}, Owner = {b_grae02}, Timestamp = {2013.04.17}, Url = {https://dx.doi.org/10.1016/j.cageo.2004.03.012} } @Article{Pebesma2012, Title = {{spacetime}: Spatio-Temporal Data in {R}}, Author = {Edzer Pebesma}, Journal = {Journal of Statistical Software}, Year = {2012}, Number = {7}, Pages = {1--30}, Volume = {51}, Url = {https://www.jstatsoft.org/v51/i07/} } @Manual{RCoreTeam2014, Title = {R: A Language and Environment for Statistical Computing}, Address = {Vienna, Austria}, Author = {{R Core Team}}, Organization = {R Foundation for Statistical Computing}, Year = {2014}, Url = {https://www.R-project.org/} } @Manual{RCoreTeam2015, title = {R: A Language and Environment for Statistical Computing}, author = {{R Core Team}}, organization = {R Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2015}, url = {https://www.R-project.org/} } @Article{Schlather2014, Title = {Analysis, Simulation and Prediction of Multivariate Random Fields with Package {RandomFields}}, Author = {Martin Schlather and Alexander Malinowski and Peter J. Menck and Marco Oesting and Kirstin Strokorb}, Journal = {Journal of Statistical Software}, Year = {2014}, Number = {8}, Pages = {1--25}, Volume = {63}, Url = {https://www.jstatsoft.org/v63/i08} } @Article{sigrist2015, author = {Fabio Sigrist and Hans R. K\"unsch and Werner A. Stahel}, title = {{spate}: An {R} Package for Spatio-Temporal Modeling with a Stochastic Advection-Diffusion Process}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {14}, pages = {1--23}, url = {https://www.jstatsoft.org/v63/i14/} } @Article{Snepvangers2003, Title = {Soil water content interpolation using spatio-temporal kriging with external drift}, Author = {J.J.J.C Snepvangers and G.B.M Heuvelink and J.A Huisman}, Journal = {Geoderma}, Year = {2003}, Number = {3 -- 4}, Pages = {253--271}, Volume = {112}, Url = {https://dx.doi.org/10.1016/S0016-7061(02)00310-5}, ISSN = {0016-7061}, Keywords = {Geostatistics}, Owner = {b_grae02}, Timestamp = {2013.04.17} } @Article{yoon, author = {Seo Youn Yoon and Srinath K. Ravulaparthy and Konstadinos G. Goulias}, title = {Dynamic diurnal social taxonomy of urban environments using data from a geocoded time use activity-travel diary and point-based business establishment inventory }, journal = {Transportation Research Part A: Policy and Practice }, year = {2014}, volume = {68}, number = {0}, pages = {3 - 17}, url = {https://dx.doi.org/10.1016/j.tra.2014.01.004}, issn = {0965-8564} } gstat/vignettes/.install_extras0000644000176200001440000000003315060550314016434 0ustar liggesusersspatio-temporal-kriging.bibgstat/vignettes/st.Rnw0000644000176200001440000003631015143634646014541 0ustar liggesusers%% Document started, Sat Jul 3 19:30:52 CEST 2004, my 37th birthday, %% while being stuck for 24 hours at Philadelphia airport, on my way %% back from the joint TIES/Accuracy 2004 symposium in Portland, ME. %% Continued, Oct 28, during the Apmosphere mid-term review. Oh, shame. \documentclass[a4paper]{article} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \newcommand{\code}[1]{{\tt #1}} \SweaveOpts{echo=TRUE} \title{Introduction to Spatio-Temporal Variography } % \VignetteIndexEntry{ Introduction to Spatio-Temporal Variography } \author{ \includegraphics[width=.4\columnwidth]{ifgi-logo_int}\\ \href{mailto:edzer.pebesma@uni-muenster.de}{Edzer Pebesma}, \href{mailto:ben.graeler@uni-muenster.de}{Benedikt Gr\"{a}ler} } \date{\small \today } \begin{document} \setkeys{Gin}{width=0.9\textwidth} \maketitle \section{Introduction} Since \code{gstat} package version 1.0-0, a dependency of gstat on the R package \code{spacetime} was introduced, allowing the code in \code{gstat} to exploit spatio-temporal data structures from that package. This vignette describes the possibilities and limitations of the package for spatio-temporal geostatistics. To understand some of the possibilities and limitations, some knowledge of the history of the software is needed. The original \code{gstat} software (Pebesma and Wesseling, 1998) was a standalone computer {\em program} written in around 25,000 lines of C code, and would do geostatistical modelling, prediction and simulation. The \code{gstat} R package (Pebesma, 2004) consisted mostly of an R interface to this C code, together with convenience functions to use R's modelling interface (formula's, see \code{?lm}) and graphic capabilities (trellis graphics in package \code{lattice} to show cross variogram as matrix plots; interaction with variogram clouds using base plots). Starting 2003, a group of programmers developed a set of classes and methods for dealing with spatial data in R (points, lines, polygons, grids), which was supported by the publications of the well-known ASDAR book (Bivand et al. 2008; see also \url{https://asdar-book.org/}) and helped convergence in the user community, with in 2011 over 2000 subscribers on the {\tt r-sig-geo} mailing list. Package \code{gstat} was one of the first packages that adopted and benefited from these classes. To realize a particular idea, writing code in C typically takes about 10-20 times as long as writing it in R. C code can be more efficient, gives more control over memory usage, but is also more error prone--mistakes in C code make an R session crash, something that is hard to do when writing R code. The original C code of \code{gstat} (Pebesma and Wesseling, 1998) provides all kriging varieties (universal, ordinary, simple; univariable, or multivariable as in cokriging) for two- or three-dimensional data. When the spatial domain is constrained to two dimensions (and this might cover over 99\% of the use cases!), the third dimension might be used to represent time. As such, the {\em metric} variogram model, which allows for geometric anisotropy definition in three dimensions, can be used for spatio-temporal kriging. When defining the three-dimensional variogram as the sum of 2 or more nested variogram (summed) models, one can choose anisotropy coefficients for a single model such that this model is {\em effectively} zero in some directions, e.g. in space {\em or} in time; this allows one to approximate the so-called space-time sum model. It should be noted that at the C code there is no knowledge whether a third dimension represents space, or time. As such, particular characteristics of time cannot be taken care of. Since the second half of 2010, the development of an R package \code{spacetime} started. It provides methods and classes for spatio-temporal data, and builds on the spatial data classes in \code{sp} and time series classes in \code{xts}. This document will explain how data in this form, and methods provided by this package, can be used for spatio-temporal geostatistics. We will work with a data set with air quality (PM10) measurements over germany, taken from rural background stations available in the data sets provided by the European Environmental Agency. <<>>= library(spacetime) rm(list = ls()) data(air) ls() @ \section{Variography} \subsection{Temporal autocorrelation and cross correlation} We will look into a subset of the data, ranging from 2005 to 2010, and remove stations that have only missing values in this period: <<>>= if (!exists("rural")) rural = STFDF(stations, dates, data.frame(PM10 = as.vector(air))) rr = rural[,"2005::2010"] unsel = which(apply(as(rr, "xts"), 2, function(x) all(is.na(x)))) r5to10 = rr[-unsel,] summary(r5to10) @ Next, we will (rather arbitrarily) select four stations, which have the following labels: <<>>= rn = row.names(r5to10@sp)[4:7] rn @ In the following, autocorrelation functions are computed and plotted. The resulting plot is shown in Figure~\ref{fig:acf}. <>= par(mfrow=c(2,2)) # select 4, 5, 6, 7 for (i in rn) { acf(na.omit(r5to10[i,]$PM10), main = i) } par(mfrow=c(1,1)) @ \begin{figure}[hbt] \begin{center} <>= par(mfrow=c(2,2)) # select 4, 5, 6, 7 rn = row.names(r5to10@sp)[4:7] for (i in rn) { x <- as.numeric(na.omit(r5to10[i, ])) acf(x, main = i) } @ \end{center} \caption{Autocorrelations for PM10; time lag unit in days.} \label{fig:acf} \end{figure} Auto- and cross correlations can be computed when a multivariate time series object is passed to {\tt acf}: <>= acf(na.omit(as(r5to10[rn,], "xts"))) @ The resulting plot is shown in Figure~\ref{fig:ccf}. \begin{figure}[hbt] \begin{center} <>= acf(na.omit(as(r5to10[rn,], "xts"))) @ \end{center} \caption{autocorrelations (diagonal) and cross correlations (off-diagonal) for the four stations selected; time lag unit in days. } \label{fig:ccf} \end{figure} From these graphs one should be able to observe the following \begin{itemize} \item autocorrelations for lag 0 are always 1 \item cross correlations for lag 0 are not always 1 \item cross correlations can be asymmetric, meaning that when $\rho_{AB}(h)$ is the correlation between $Z(s_A,t)$ and $Z(s_B,t+h)$, $$\rho_{AB}(h) = \rho_{BA}(-h) \ne \rho_{AB}(-h)$$ with $s_A$ and $s_B$ the two stations between which a cross correlation is computed, and $h$ the (directional!) lag between the series. \end{itemize} The plot further more shows that for these four stations the asymmetry is not very strong, but that cross correlations are fairly strong and of a similar form of autocorrelations. This kind of plot does not work very well in layouts of e.g. 10 x 10 sub-plots; {\tt acf} automatically chooses 4 x 4 as the maximum a single plot. To try this out, do a 7 x 7 plot <>= acf(na.omit(as(r5to10[4:10,], "xts"))) @ and note that here we see in the last figure (DESH \& DESN04) a pair of plots with nearly no cross correlation. This might have to do with the spatial distance between these two stations: <<>>= library(sp) print(spDists(r5to10[4:10,]@sp), digits=3) @ (What is the spatial distance between stations DESH and DESN04?) \subsection{Spatial correlation, variograms} In the next steps, we will sample 100 time instances randomly, <<>>= rs = sample(dim(r5to10)[2], 100) @ we select these instances as a {\tt SpatialPointsDataFrame} and add a time index to them. After this we bind them together in a single {\tt SpatialPointsDataFrame} which has a time index {\tt ti}: <<>>= lst = lapply(rs, function(i) { x = r5to10[,i]; x$ti = i; rownames(x@coords) = NULL; x} ) pts = do.call(rbind, lst) @ Then, we can compute the pooled variogram <<>>= library(gstat) v = variogram(PM10~ti, pts[!is.na(pts$PM10),], dX=0) @ and plot it (Figure~\ref{fig:vgm}): <>= # plot(v, fit.variogram(v, vgm(1, "Exp", 200, 1))) vmod = fit.variogram(v, vgm(100, "Exp", 200)) plot(v, vmod) @ \begin{figure}[hbt] \begin{center} <>= # plot(v, fit.variogram(v, vgm(1, "Exp", 200, 1))) vmod = fit.variogram(v, vgm(100, "Exp", 200)) print(plot(v, vmod)) @ \end{center} \caption{sample spatial variogram, averaged over 100 randomly chosen time steps} \label{fig:vgm} \end{figure} The fitted model is this: <<>>= vmod @ One should note that the fit is rather poor, and not forget that we only have 53 stations selected. The time resolution is rich (1862 days) but the number of stations is small: <<>>= dim(r5to10) @ We can fit a spatio-temporal variogram the usual way, by passing an object of class {\tt STFDF} (Pebesma, 2012): <>= vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) @ Alternatively, if this takes too long, a temporal subset can be taken, e.g. using the first 200 days: <>= vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) @ taking random days from the full period will lead to the a wrong assumption that every time index increment reflect a constant lag increase. As an alternative, we will here load the precomputed S/T variogram: <<>>= data(vv) @ % remove the model column to keep text and figures in line. <>= vv <- vv[c("np", "dist", "gamma", "id", "timelag", "spacelag")] @ Plotting this object can be done in several ways, two 2D-plots are shown in Figure~\ref{fig:map} and a 3D wireplot is shown in Figure~\ref{fig:wire}: <>= plot(vv) plot(vv, map = FALSE) @ \begin{figure}[hbt] \begin{center} <>= print(plot(vv), split = c(1,1,1,2), more = TRUE) print(plot(vv, map = FALSE), split = c(1,2,1,2)) @ \end{center} \caption{Spatio-temporal sample variogram map (top) and sample variograms for each time lag (bottom); both figures depict the information of object {\tt vv}.} \label{fig:map} \end{figure} \subsection{Fitting a spatio-temporal variogram model} At first, we try to fit a metric model with spatio-temporal anisotropy: <<>>== metricVgm <- vgmST("metric", joint=vgm(50,"Exp",100,0), stAni=50) metricVgm <- fit.StVariogram(vv, metricVgm) @ As numerical criterion to judge the goodness of fit of model and sample variogram, the root-mean-squared-difference between the surfaces can be obtained by: <<>>= attr(metricVgm, "optim")$value @ The final model can be plotted with the sample variogram (Figure~\ref{fig:mm}): <>= plot(vv, metricVgm) @ \begin{figure}[hbt] \begin{center} <>= print(plot(vv, metricVgm)) @ \end{center} \caption{Sample variogram map (left) and fitted metric model (right).} \label{fig:mm} \end{figure} \pagebreak Now, let us try to fit and plot a separable model (Figure~\ref{fig:sm}): <<>>== sepVgm <- vgmST("separable", space=vgm(0.9,"Exp", 123, 0.1), time =vgm(0.9,"Exp", 2.9, 0.1), sill=100) sepVgm <- fit.StVariogram(vv, sepVgm, method = "L-BFGS-B", lower = c(10,0,0.01,0,1), upper = c(500,1,20,1,200)) @ To compare this model with the previous one, we look at the optimized root-mean-squared-differences between the two surfaces and plot sample and both models: <<>>= attr(sepVgm, "optim")$value plot(vv, list(sepVgm, metricVgm)) @ \begin{figure}[hbt] \begin{center} <>= print(plot(vv, list(sepVgm, metricVgm))) @ \end{center} \caption{Sample variogram map (left), fitted separable model (middle) and fittted metric model (right).} \label{fig:sm} \end{figure} A wireframe (3D) plot of sample variogram and fitted variogram models can be obtained e.g. by <>= library(lattice) plot(vv, list(sepVgm, metricVgm), all=T, wireframe=T, zlim=c(0,120), zlab=NULL, xlab=list("distance (km)", rot=30), ylab=list("time lag (days)", rot=-35), scales=list(arrows=F, z = list(distance = 5))) @ which is shown in Figure~\ref{fig:wire}. Further spatio-temporal model definitions can be found in the help pages of {\tt fit.StVariogram} and {\tt variogramSurface}. The demo {\tt stkrige} presents further examples and illustrates an interactive 3D-plot of sample variogram and the fitted variogram model. \begin{figure}[hbt] \begin{center} <>= library(lattice) print(plot(vv, list(sepVgm, metricVgm), all=T, wireframe=T, zlim=c(0,120), zlab=NULL, xlab=list("distance (km)", rot=30), ylab=list("time lag (days)", rot=-35), scales=list(arrows=F, z = list(distance = 5)))) @ \end{center} \caption{Wireframe plots of sample and fitted space-time variograms.} \label{fig:wire} \end{figure} \clearpage \section{Spatio-temporal prediction} The vignette in package \code{spacetime} gives an example of using the gstat function \code{krigeST} for spatio-temporal kriging of the Irish wind data. The \code{krigeST} function uses global kriging, but only needs to invert the purely spatial and purely time covariance matrices in the separable case. For more generic spatio-temporal kriging where space is two-dimensional, one could use \code{krige}, defining the observations and prediction locations as three-dimensional data sets, see for an example <>= demo(gstat3D) @ It needs to be pointed out that in that case, the time (typically the third dimension) needs to be numeric, and three-dimensional anisotropy needs to be defined properly (see \code{?vgm}). In case the data set is too large for global kriging, one could try to use local kriging, and select data within some distance, or by specifying \code{nmax} (the nearest $n$ observations). In both cases, it is advisable to transform time such that one can use an {\em isotropic} variogram model in the three dimensions, as only in that case the nearest $n$ observations correspond to the $n$ most correlated observations. \code{krigeST} provides a solution where a \code{bufferNmax}-times larger neighbourhood is evaluated within the covariance model and the strongest correlated \code{nmax} neighbours are selected. An additional consideration is that in space-time, observations may not be regularly spaced. In some cases, the nearest $n$ observations may come from a single measurement location, which may lead to sharp jumps/boundaries in the interpolated values. This might be solved by using larger neighbourhoods, or by setting the \code{omax} in \code{krige} or \code{gstat} calls to the neighbourhood size to select {\em per octant} (this should be combined with specifying \code{maxdist}). %\section{Spatio-temporal simulation} \section*{References} \begin{itemize} \item Bivand, R., E. Pebesma and V. Gomez-Rubio, 2008. Applied Spatial Data Analysis with R. Springer. \item Cressie, N.A.C., 1993. Statistics for Spatial Data. Wiley. \item Cressie, N. and C. Wikle, 2011. Statistics for Spatio-temporal Data. Wiley. \item Pebesma, E., 2012. spacetime: Spatio-Temporal Data in R. Journal of Statistical Software, volume 51, issue 7; \href{https://www.jstatsoft.org/v51/i07/}{1-30}. \item Pebesma, E.J., Wesseling, C.G., 1998. Gstat, a program for geostatistical modelling, prediction and simulation. Computers \& Geosciences, 24 (1), pp. 17--31. \item Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers \& Geosciences \href{http://www.sciencedirect.com/science/journal/00983004}{30: 683-691} \item Ver Hoef, J.M., Cressie, N.A.C, 1993. Multivariable Spatial Prediction. Mathematical Geology, 25 (2), pp. 219--240. \end{itemize} \end{document} gstat/vignettes/spatio-temporal-kriging.Rnw0000644000176200001440000015627515162303064020664 0ustar liggesusers\documentclass[a4paper]{article} \usepackage[colorlinks=true,urlcolor=blue,citecolor=blue]{hyperref} \usepackage{alltt} \usepackage{amsfonts} \usepackage{enumerate} \usepackage{graphicx} \usepackage{multirow} \usepackage{natbib} %% following the RJournal.sty \usepackage{geometry} \usepackage{booktabs} \usepackage{amsmath} \RequirePackage{fancyvrb} \RequirePackage{alltt} \DefineVerbatimEnvironment{example}{Verbatim}{} \renewenvironment{example*}{\begin{alltt}}{\end{alltt}} \RequirePackage[font=small,labelfont=bf]{caption} \geometry{a4paper, textwidth=14cm, top=1cm, bottom=1cm, includehead,includefoot,centering, footskip=1.5cm} \raggedbottom \RequirePackage{setspace} \renewcommand{\abstract}[1]{% \setstretch{1}% \noindent% \small% \textbf{Abstract} #1 } \newcommand{\address}[1]{\addvspace{\baselineskip}\noindent\emph{#1}} \date{\footnotesize Mar 25, 2016} \newcommand{\code}[1]{{\footnotesize\tt #1}} \newcommand{\samp}[1]{{\tt #1}} \newcommand{\pkg}[1]{{\bf #1}} \newcommand{\CRANpkg}[1]{{\href{https://cran.r-project.org/package=#1}{\bf #1}}} \newcommand{\email}[1]{{\href{mailto:#1}{#1}}} \newcommand{\dfn}[1]{{\normalfont\textsl{#1}}} \bibliographystyle{plainnat} % \VignetteIndexEntry{Spatio-Temporal Geostatistics using gstat} \title{Spatio-Temporal Interpolation using \pkg{gstat}} % \VignetteIndexEntry{Spatio-Temporal Geostatistics using gstat} \author{by Benedikt Gr{\"a}ler, Edzer Pebesma and Gerard Heuvelink} \graphicspath{{figures/}} \begin{document} \SweaveOpts{concordance=TRUE} \maketitle \abstract{ We present new spatio-temporal geostatistical modelling and interpolation capabilities of the R package \pkg{gstat}. Various spatio-temporal covariance models have been implemented, such as the separable, product-sum, metric and sum-metric models. In a real-world application we compare spatio-temporal interpolations using these models with a purely spatial kriging approach. The target variable of the application is the daily mean $\rm{PM}_{10}$ concentration measured at rural air quality monitoring stations across Germany in 2005. R code for variogram fitting and interpolation is presented in this paper to illustrate the workflow of spatio-temporal interpolation using \pkg{gstat}. We conclude that the system works properly and that the extension of \pkg{gstat} facilitates and eases spatio-temporal geostatistical modelling and prediction for R users. } %% main text \section{Introduction}\label{sec:intro} The collection and processing of spatio-temporal data is rapidly increasing due to technological advances and the societal need for analysis of variables that vary in space and time, such as weather and air quality variables, and crop yields. Analysis of spatial and temporal correlations is useful in itself to get insight into the character and causes of variability, but they are also important to predict values at points from neighbouring observations. Spatio-temporal interpolation can potentially provide more accurate predictions than spatial interpolation because observations taken at other times can be included. In addition, spatio-temporal interpolation allows predictions to be made at single locations or entire fields in between and beyond observation times. However, adding the temporal domain implies that variability in space and time must be modelled, which is more complicated than modelling purely spatial or purely temporal variability. The spatial, temporal and spatio-temporal dependence structures, for instance represented as variograms, do not necessarily coincide with each other in terms of their parameters nor in terms of their family. In the simplest case, a spatio-temporal anisotropy parameter might be enough to deal with the different dependence structures, but this poses strong assumptions on the process. Interpolation of spatial random fields is a common task in geostatistics. Simple approaches like inverse distance weighted predictions or the well known kriging procedures have routinely been applied for many years. Nowadays, modern sensors allow to monitor different variables at an increasing temporal resolution producing rich spatio-temporal data sets. This calls as well for theory and methods to deal with these data sets to gain a better understanding of the observed spatio-temporal processes. While the theoretical aspects of spatio-temporal geostatistics show good progress \citep{Cressie2011}, implementations lack behind. This hinders a wide application of spatio-temporal modelling, as typically extensive scripting and thorough understanding is necessary to build spatio-temporal models. Handling of spatio-temporal data in R is provided by the \CRANpkg{spacetime} package \citep{Pebesma2012}. In this paper, we present an extension of the \CRANpkg{gstat} package \citep{Pebesma2004} (version 1.1-3) that reuses the \pkg{spacetime} classes for the estimation of spatio-temporal covariance/variogram models and to perform spatio-temporal interpolation. Our implementation handles various types of spatio-temporal covariance structures and facilitates spatio-temporal interpolation. The notation of functions in \pkg{gstat} are extended in a way closely following the purely spatial design. This allows a researcher acquainted with \pkg{gstat} to readily use spatio-temporal tools. The use of the newly implemented functions is presented and illustrated by mapping spatio-temporal air-quality data. Another package that offers extensive spatio-temporal geostatistical functionality is \CRANpkg{RandomFields} \citep{Schlather2014}; further packages are mentioned in the SpatioTemporal CRAN task view. The paper is organised as follows. The next section introduces the general interpolation routine and describes the different spatio-temporal covariance models, followed by a section introducing the German rural background data set for 2005 and performing the parameter estimation (i.e.\ covariance model fitting). Cross-validation results are presented and discussed in the section thereafter. Conclusions are drawn in the closing section. R scripts reproducing this study are available from within the \pkg{gstat} package as demos. \code{stkrige} re-estimates the variogram models, \code{stkrige-prediction} re-executes the prediction for a time series and a couple of stations, and \code{stkrige-crossvalidation} re-runs the entire leave-one-out cross-validation (note that the latter takes a few hours). \section{Spatio-temporal dependence modelling and kriging}\label{sec:theory} In the following, we will assume a Gaussian spatio-temporal random field $Z$ defined over a spatial domain $\mathcal{S}$ and temporal domain $\mathcal{T}$. Typically, a sample $\mathbf{z} = \left(z(s_1,t_1),\dots,z(s_n,t_n)\right)$ has been observed at a set of distinct spatio-temporal locations $(s_1, t_1), \dots, (s_n,t_n) \in \mathcal{S}\times \mathcal{T} \subseteq \mathbb{R}^2 \times \mathbb{R}$ that may include repeated measurements at the same location or simultaneous measurements at multiple spatial locations. Often, one is interested in modelling $Z$ from the sample $\mathbf{z}$ in order to predict at unobserved locations in space and time or simulate from the conditional distribution. Across our domain of interest $\mathcal{S} \times \mathcal{T}$, we assume the random field $Z$ to be stationary and spatially isotropic. Hence, the field can be characterised through a mean $\mu$ and a covariance function $C_{\rm st}$ where the spatio-temporal covariance only depends on the separating distances across space $h \in \mathbb{R}_{\geq 0}$ and time $u \in \mathbb{R}_{\geq 0}$. Note that extensions beyond this set-up can easily be derived as has been done for the pure spatial case using for instance universal kriging to overcome the stationarity of the mean. The general spatio-temporal covariance function is given by $C_{\rm st}(h,u) = {\rm Cov}\left(Z(s,t), Z(\tilde{s},\tilde{t})\right)$ for a separating spatial distance $h$ and temporal distance $u$ and any pair of points $(s,t), (\tilde{s},\tilde{t}) \in \mathcal{S}\times\mathcal{T}$ with $||s-\tilde{s}||=h$ and $|t-\tilde{t}|=u$. In general, this covariance function is hard to estimate but a couple of models using simplifying assumptions will be presented in the following together with their spatio-temporal variograms $\gamma_{\rm st}(h,u) = C_{\rm st}(0,0)-C_{\rm st}(h,u)$ and encoding in \pkg{gstat}. Given a valid covariance function, the covariance matrices used in the linear predictor are easily obtained and the same algebraic operations as in the well known spatial case yield predictions of the desired random field \citep{Cressie2011}. A major difference is, however, the computational complexity of the matrix inversion. Typically, observations are made at a rather high temporal frequency leading to a number of spatio-temporal locations that is too large for global kriging. Hence, interpolation based on a selected neighbourhood of a subset of all data points becomes beneficial. Additionally, this relaxes the assumption of stationarity, as smooth variations in the mean value across the domain can be respected. The related class of dynamic models also addresses the computational complexity resulting in a temporal Markov structure. Implementations can be found in \CRANpkg{spTimer} by \citet{bakar2015}, \CRANpkg{spBayes} by \citet{finley2015}, \CRANpkg{spate} by \citet{sigrist2015} or \pkg{INLA} by \citet{lindgren2015}. \subsection{Covariance models} The covariance models implemented in \pkg{gstat} and presented in this paper are introduced in the following. Besides further extensions we focus on the basic classes of the \emph{separable}, \emph{product-sum}, \emph{metric} and \emph{sum-metric} spatio-temporal covariance functions. The building blocks (in the following denoted as \code{spatialVgm}, \code{temporalVgm} or \code{jointVgm}) of the spatio-temporal covariance functions are any of the purely spatial variogram models already available in \pkg{gstat}. Each one of the building blocks is created by a call of the function \code{gstat::vgm()}. Remaining arguments such as \code{sill} (the joint sill), \code{nug} (the joint nugget component) or \code{stAni} (the spatio-temporal anisotropy used in the \code{jointVgm}) are scalars and refer to parameters of the entire spatio-temporal covariance function: \begin{enumerate}[a)] \item The \dfn{separable covariance model} assumes that the spatio-temporal covariance function can be represented as the product of a spatial and temporal term: $$C_{\rm sep}(h,u)=C_{\rm s}(h)C_t(u)$$ Its variogram is given by (see Appendix for details): $$\gamma_{\rm sep}(h,u) = {\rm sill} \cdot \left( \bar{\gamma}_s(h)+\bar{\gamma}_t(u)-\bar{\gamma}_s(h)\bar{\gamma}_t(u) \right)$$ where $\bar{\gamma}_s$ and $\bar{\gamma}_t$ are standardised spatial and temporal variograms with separate nugget effects and (joint) sill of 1. The overall sill parameter is denoted by "sill". The R package \pkg{gstat} encodes this model as: \code{vgmST("separable", space = spatialVgm, time = temporalVgm, sill = sill)} The separable model has a strong computational advantage in the setting where each spatial location has an observation at each temporal instance (a \code{"STFDF"} without \samp{NA}s, \cite{Pebesma2012}). In these cases, the covariance matrix (and its inverse) can be composed using the Kronecker-product of the purely spatial and purely temporal covariance matrices (respectively their inverse). \item The above model extends to the \dfn{product-sum covariance model} that we give here in a slightly different notation as \citet{DeCesare2001} and \citet{DeIaco2001} by $$C_{\rm ps}(h,u)=k C_{\rm s}(h)C_{\rm t}(u) + C_{\rm s}(h) + C_{\rm t}(u)$$ with $k > 0$. The corresponding variogram can be written as $$\gamma_{\rm ps}(h,u) = \left(k \cdot {\rm sill}_{\rm t} + 1\right) \gamma_{\rm s}(h) + \left(k \cdot {\rm sill}_{\rm s} + 1\right) \gamma_{\rm t}(u) - k \gamma_{\rm s}(h) \gamma_{\rm t}(u)$$ where ${\gamma}_{\rm s}$ and $\gamma_{\rm t}$ are spatial and temporal variograms (see Appendix for details). The parameter $k$ needs to be positive and the following identity defines the overall sill (${\rm sill}_{\rm st}$) of the model in terms of the model's spatial and temporal sills: $${\rm sill}_{\rm st} = k \cdot {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} + {\rm sill}_{\rm s} + {\rm sill}_{\rm t}$$ The above equation can also be used to estimate $k$ based on the three sill values. An alternative formulation of the product-sum variogram can be found in \citet{DeIaco2001}. The \pkg{gstat} definition of this model reads: \begin{example*} vgmST("productSum", space = spatialVgm, time = temporalVgm, k = k) \end{example*} \item Assuming identical spatial and temporal covariance functions except for spatio-temporal anisotropy, allows to use a spatio-temporal \dfn{metric covariance model} where, after matching space and time by an anisotropy correction $\kappa$ (\code{stAni}), the spatial, temporal and spatio-temporal distances are treated equally resulting in a single covariance model $C_{\rm joint}$: $$C_{\rm m}(h,u)=C_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ The variogram evaluates to $$ \gamma_{\rm m} (h,u) = \gamma_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right) $$ where $\gamma_{\rm joint}$ (\code{jointVgm}) is any known variogram that may include a nugget effect. The following line generates the model in \pkg{gstat}: \begin{example*} vgmST("metric", joint = jointVgm, stAni = stAni) \end{example*} The spatio-temporal anisotropy parameter $\kappa$ (\code{stAni}) is given as spatial unit per temporal unit. In many cases, this will be in m/second, as these are the base units in our implementation. All temporal distances are hence internally re-scaled to an equivalent spatial distance using \code{stAni} and treated as metric 3D-space. \item A combination of spatial, temporal and a metric model including an anisotropy parameter $\kappa$ is found in \citet{Bilonick1988} and revisited by \citet{Snepvangers2003} as the \dfn{sum-metric covariance model}: $$C_{\rm sm}(h,u)=C_{\rm s}(h)+C_{\rm t}(u)+C_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ This model allows for spatial, temporal and joint nugget effects. Thus, the variogram is given by $$ \gamma_{\rm sm}(h,u)= \gamma_{\rm s}(h) + \gamma_{\rm t}(u) + \gamma_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ where $\gamma_{\rm s}$, $\gamma_{\rm t}$ and $\gamma_{\rm joint}$ are spatial, temporal and joint variograms with separate nugget-effects. This model can be defined in \pkg{gstat} through: \begin{example*} vgmST("sumMetric", space = spatialVgm, time = temporalVgm, joint = jointVgm, stAni = stAni) \end{example*} \item A simplified version of the above model is to restrict the spatial, temporal and joint variograms to nugget free models. Additionally, a single spatio-temporal nugget is introduced and the variogram takes the representation: $$\gamma_{\rm ssm}(h,u) = {\rm nug}\cdot {\bf1}_{h>0 \vee u>0} + \gamma_{\rm s}(h) + \gamma_{\rm t}(u) + \gamma_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ The \dfn{simple sum-metric covariance model} can be obtained by: \begin{example*} vgmST("simpleSumMetric", space = spatialVgm, time = temporalVgm, joint = jointVgm, nugget = nug, stAni = stAni) \end{example*} \end{enumerate} \noindent Note that the above mentioned spatial, temporal and joint components of the spatio-temporal covariance and variogram models need not necessarily exhibit the same structure. Taking for instance the product-sum and sum-metric models that both contain single temporal and spatial variogram models: the best fits of the respective spatio-temporal models might suggest different variogram families and parameters for the pure spatial and temporal ones. This is due to the target of finding the best overall variogram surface resulting in (potentially) different marginal models. \subsection{Parameter estimation} Fitting routines for the above variogram models are implemented in \pkg{gstat} through the function \code{fit.StVariogram()}, which calls \code{optim()} from the R core package \pkg{stats}. Additional parameters to improve the numerical optimisation can be provided to \code{fit.StVariogram()} and will be passed on to \code{optim()} (using R's three-dots mechanism). As some of the parameters are limited to certain ranges (nuggets need to be non-negative, ranges must be positive), it is advised to use an optimisation routine that allows to impose limits on the search space (i.e.\ \code{L-BFGS-B}) and provide sensible limits via \code{lower} and \code{upper}. By default, the method \code{L-BFGS-B} is called and the smallest lower and largest upper bounds supported by the model are given. The estimation of the spatio-temporal variogram models relies on a sample variogram empirically derived from the data. In contrast to the spatial variogram line, the spatio-temporal variogram is represented by a surface for lag classes composed of a spatial and temporal separation distance. Different from the spatial case, a spatio-temporal sample variogram contains lag-classes of zero spatial separation describing pure temporal dependencies. Without duplicate observations, no estimates can be made for the lag-class with both zero spatial and zero temporal separation. The sample variogram is calculated through the function \code{variogram()} that dispatches the call for spatio-temporal data objects (of class \code{"STFDF"}, \code{"STSDF"}, or \code{"STIDF"}) from \pkg{spacetime}. For a visual judgement of the fit between sample and fitted variograms the \code{plot()} function can be called to show the variogram surfaces next to each other as coloured level plots. Alternatively, a wireframe plot is obtained by setting the parameter \code{wireframe = TRUE} (Figure~\ref{fig:allVgmsWireframe}). A further option is to plot the differences between the sample and model variogram surfaces by setting \code{diff = TRUE}, see Figure~\ref{fig:allVgmsDiffWireframe}. Additionally to visual comparison, \code{fit.StVariogram()} provides the output of \code{optim} as attribute \code{optim.out} of the returned S3-class \code{"StVariogram"}. This attribute includes valuable information to diagnose the success of the \code{optim} routine. It contains for instance the convergence code (\code{\$convergence}) or message (\code{\$message}) and the optimised value (\code{\$value}), which is the mean of the (weighted) squared deviations between sample and fitted variogram surface. Furthermore, it is advised to check the estimated parameters against the parameter boundaries and starting values. Additionally, starting values might also influence the success and result of the optimisation, as local optima may occur due to the interdependence of the parameters. Alternatively, the user might want to start a grid search in order to better asses the sensitivity of the estimates. The fitting approach is identical for all covariance models. However, with the flexibility of the model also the number of parameters increases, making a numerical estimation at times cumbersome. Starting values can in most cases be read from the sample variogram. Parameters of the spatial and temporal variograms can be assessed from the spatio-temporal surface fixing the counterpart at 0. The overall spatio-temporal sill including the nugget can be deducted from the plateau that a nicely behaving sample variogram reaches for 'large' spatial and temporal distances. An important issue is the potentially different orders of magnitude of the parameters. It is at times advisable to rescale spatial and temporal distances to ranges similar to the ones of sills and nuggets using the parameter \code{parscale}. \code{parscale} needs to be provided via \code{control = list(parscale=\dots)} and holds a vector of the same length as the number of parameters to be optimised (see the documentation of \code{optim} for further details). \begin{table} \center \caption{List of implemented weighting schemes for variogram optimisation. Methods 3, 4, and 5 are kept for compatibility reasons with the purely spatial \code{fit.variogram} function. The following notation is used: $N_j$ number of pairs, $h_j$ mean spatial distance and $u_j$ mean temporal distance for each bin $j$, $\gamma$ the actual proposed variogram model and \code{stAni} a spatio-temporal anisotropy scaling.}\label{tab:weighting} {\small \begin{tabular}{ll} \toprule \code{fit.method} & weights \\ \midrule 0 & no fitting\\ 1 and 3 & $N_j$ \\ 2 and 4 & $N_j/\gamma\left(h_j, u_j\right)^2$ \\ 5 & reserved for REML \\ 6 & 1, no weighting\\ 7 & $N_j/\left(h_j^2 + {\rm stAni}^2\cdot u_j^2\right)$ \\ 8 & $N_j/h_j^2$ \\ 9 & $N_j/u_j^2$ \\ 10 & $1/\gamma\left(h_j,u_j\right)^2$ \\ 11 & $1/\left(h_j^2 + {\rm stAni}^2\cdot u_j^2\right)$ \\ 12 & $1/h_j^2$ \\ 13 & $1/u_j^2$ \\ \bottomrule \end{tabular}} \end{table} Currently, the implemented fitting routines are based on the (weighted) mean squared difference between model and sample variogram surfaces. By default, all values are associated the same weight (\code{fit.method = 6}), but other options are available that allow for different weighting schemes based on the number of pairs, spatial, temporal and spatio-temporal distances or the variogram's value. Table~\ref{tab:weighting} lists all currently implemented options. Depending on the target neighbourhood size of the desired interpolation, it might be beneficial to narrow down the spatial and temporal distances and to introduce a cutoff. This ensures that the model is fitted to the differences over space and time actually used in the interpolation, and reduces the risk of overfitting the variogram model to large distances not used for prediction. Please note that methods 2 and 10 (Table~\ref{tab:weighting}) involve weights based on the fitted variogram that might lead to bad convergence properties of the parameter estimates. Furthermore, the scalar \code{stAni} in methods 7 and 11 will either be the actual fitted spatio-temporal anisotropy if it is included in the model or a fixed value that has to be passed as \code{stAni} by the user to \code{fit.StVariogram}. The latter is advised, as the former might lead to bad convergence properties as in the case of weights based on the fitted variogram mentioned above. As the estimation of an anisotropy scaling might be cumbersome on a visual basis, we provide the function \code{estiStAni} that provides estimates based on the empirical spatio-temporal variogram. Four heuristics are available based on (i) rescaling a linear model (\code{linear}), (ii) estimating equal ranges (\code{range}), (iii) rescaling a pure spatial variogram (\code{vgm}) or (iv) estimating a complete spatio-temporal metric variogram model and returning its spatio-temporal anisotropy parameter (\code{metric}). The choice of the weighting scheme will influence the selected model and different weightings might be further assessed in a cross-validation of the selected model. To increase numerical stability, it is advisable to use weights that do not change with the current model fit. \subsection{Kriging} Standard kriging (\code{krigeST}) and trans Gaussian kriging (\code{krigeSTTg}) have been implemented. As spatio-temporal kriging based on the complete data set might be too computationally expensive, local kriging is an attractive alternative. This poses the question of how to select the "nearest" neighbours from the spatio-temporal space $\mathcal{S}\times\mathcal{T}$. A natural choice would be to select the spatio-temporal locations exhibiting the strongest correlation to the unobserved location. Depending on the spatio-temporal covariance model, the relation between spatial and temporal distance in determining the strength of correlation will vary. As a proxy, we use a spatio-temporal anisotropy parameter that relates spatial and temporal distances in the same manner as in the metric covariance models. The k-nearest neighbours within this metric spatio-temporal space $\mathcal{S}\times\mathcal{T}$ are selected using the R package \CRANpkg{FNN} \citep{Beygelzimer2013}. The interpolation performs iteratively for each spatio-temporal prediction location with a local subset of the data set. Without neighbourhood selection, kriging uses all data. As the metric induced by the spatial and rescaled temporal distances are only proxies to the strength of correlation between locations (see Figure~\ref{fig:vgmVsDist}), we provide an option to search a larger metric neighbourhood. Within this larger neighbourhood, the covariance function is evaluated for all spatio-temporal locations and the neighbouring locations with the largest covariance values are then selected for prediction. However, this approach might still suffer from a clustering of locations and alternatives such as a staged search (find spatial neighbours first and select a set of temporal instances for each spatial neighbour) or an octant search (select neighbours per spatial quadrant from preceding and following time stamps separately) could be considered. However, these alternatives are not yet available in \pkg{gstat}. \begin{figure} \centering \includegraphics[width=0.9\textwidth]{vgmVsMetricDist.png} \caption{A contourplot showing how the spatio-temporal sum-metric variogram model (as estimated in the application below) and a metric distance relate to each other. Distances are rescaled by 1/5 for easy plotting.}\label{fig:vgmVsDist} \end{figure} \section{Application and illustration}\label{sec:data} The data set used is taken from AirBase\footnote{\href{https://www.eea.europa.eu/data-and-maps/data/airbase-the-european-air-quality-database-6}{AirBase - The European air quality database}}, the air quality data base for Europe provided by the European Environmental Agency (EEA). We focus on a single air quality indicator, particulate matter with a diameter less than 10~$\mu\rm m$, measured at rural background stations for 2005 (${\rm PM}_{10}$). The data base contains data for many years. Besides rural, also urban areas are monitored and not only at background locations (e.g.\ traffic stations). However, these processes are considered to be of a different nature and should be treated separately. As a use case, we therefore limit our data set to the rural background stations in Germany. Figure \ref{fig:dailyMeans} shows for 8 randomly chosen days daily mean values of ${\rm PM}_{10}$ concentrations for the entire monitoring network over Germany in 2005 with 69 rural background stations. \begin{figure} \centering \includegraphics[width=0.95\textwidth]{daily_means_PM10.png} \caption{Daily mean $\rm{PM}_{10}$ concentration $[\mu\rm{g/m}^3]$ at 8 randomly selected days in 2005.}\label{fig:dailyMeans} \end{figure} In order to fit a spatio-temporal model to the air quality data set, the empirical variogram surface is computed and used as input for the fitting routines of the different models. The empirical variogram is based on spatio-temporal bins that span regularly over space and time. Regular measurements over time (i.e.\ hourly, daily) motivate regular binning intervals of the same temporal resolution. Nevertheless, flexible binning boundaries can be passed for spatial and temporal dimensions. This allows for instance to use smaller bins at small distances and larger ones for large distances. Temporal boundaries, instead of lags, are required when the sampling of the data is non-regular. In cases where regular temporal observations can be assumed, this is utilised in the sample variogram calculations and any two temporal consecutive observations are assumed to have the same temporal distance. Figure~\ref{fig:allVgmsWireframe} shows the empirical variogram along with the proposed best fitting model of each spatio-temporal variogram family as perspective wireframe plots. In order to better identify structural shortcomings of the selected model, a difference plot (Figure~\ref{fig:allVgmsDiffWireframe}) is a helpful visual diagnostic plot. Beyond the selection of the spatio-temporal variogram family, each component of this model can be chosen from any implemented one-dimensional variogram. In Table~\ref{tab:vgmFits} a selection of fitted models in terms of their residuals compared to the sample variogram surface are shown. The best fitting spatio-temporal model of each family is given as: \begin{enumerate}[a)] \item separable model (weighted MSE: 6.82): \nopagebreak \begin{tabular}{l|rlrlrr} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & sp.-temp. sill \\ \midrule space & 0.86 & Exp & 558 & \hspace{-2\tabcolsep}~km & 0.14 & \multirow{2}{*}{124} \\ time & 1.00 & Sph & 5.6 & \hspace{-2\tabcolsep}~days & 0.00 & \\ \bottomrule \end{tabular} obtained via: \begin{example*} separableModel <- vgmST("separable", space = vgm(0.9, "Exp", 200, 0.1), time = vgm(0.9, "Sph", 3.5, 0.1), sill = 124) fit.StVariogram(empVgm, separableModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(100, 1, 10, 1, 100)), lower = c(10, 0, 0.1, 0, 0.1), upper = c(2000, 1, 12, 1, 200)) \end{example*} \item product-sum model (weighted MSE: 6.91) \nopagebreak \begin{tabular}{l|rlrlrc} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & k\\ \midrule space & 6.8 & Exp & 542 & \hspace{-2\tabcolsep}~km & 1.2 & \multirow{2}{*}{1.61} \\ time & 8.7 & Sph & 5.5 & \hspace{-2\tabcolsep}~days & 0.0 & \\ \bottomrule \end{tabular} obtained via \begin{example*} prodSumModel <- vgmST("productSum", space = vgm(10, "Exp", 200, 1), time = vgm(10, "Sph", 2, 1), k=2) fit.StVariogram(empVgm, prodSumModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(1, 10, 1, 1, 0.1, 1, 10)), lower = rep(0.0001, 7)) \end{example*} \item metric model (weighted MSE: 10.05) \nopagebreak \begin{tabular}{l|rlrlrrl} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & \multicolumn{2}{c}{anisotropy}\\ \midrule joint & 123.4 & ${\rm Mat}_{\kappa=0.6}$ & 453 & \hspace{-2\tabcolsep}~km & 17.4 & 189 & \hspace{-2\tabcolsep}~km/day \\ \bottomrule \end{tabular} obtained via \begin{example*} metricModel <- vgmST("metric", joint = vgm(60, "Mat", 150, 10, kappa = 0.6), stAni = 60) fit.StVariogram(empVgm, metricModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(10, 20, 5, 10)), lower = c(80, 50, 5, 50), upper = c(200, 1500, 60, 300)) \end{example*} \item\label{bestfit} sum-metric model (weighted MSE: 3.31) \nopagebreak \begin{tabular}{l|rlrlrrl} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & \multicolumn{2}{c}{anisotropy}\\ \midrule space & 16.4 & Sph & 67 & \hspace{-2\tabcolsep}~km & 0 & & \\ time & 9.3 & Exp & 0.9 & \hspace{-2\tabcolsep}~days & 0 & & \\ joint & 91.5 & Sph & 999 & \hspace{-2\tabcolsep}~km & 7.3 & 185 & \hspace{-2\tabcolsep}~km/day \\ \bottomrule \end{tabular} obtained via \begin{example*} sumMetricModel <- vgmST("sumMetric", space = vgm(20, "Sph", 150, 1), time = vgm(10, "Exp", 2, 0.5), joint = vgm(80, "Sph", 1500, 2.5), stAni = 120) fit.StVariogram(empVgm, sumMetricModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(1, 100, 1, 1, 0.5, 1, 1, 100, 1, 100), maxit=10000), lower = c(sill.s = 0, range.s = 10, nugget.s = 0, sill.t = 0, range.t = 0.1, nugget.t = 0, sill.st = 0, range.st = 10, nugget.st = 0, anis = 40), upper = c(sill.s = 200, range.s = 1000, nugget.s = 20, sill.t = 200, range.t = 75, nugget.t = 20, sill.st= 200, range.st = 5000, nugget.st = 20, anis = 500)) \end{example*} \item simple sum-metric model (weighted MSE: 3.31) \nopagebreak \begin{tabular}{l|rlrlrlc} \toprule & partial sill & model & \multicolumn{2}{c}{range} & \multicolumn{2}{c}{anisotropy} & sp.-temp. nugget \\ \midrule space & 16.4 & Sph & 67 & \hspace{-2\tabcolsep}~km & & & \multirow{3}{*}{$\Bigg\}$ 7.3} \\ time & 9.3 & Exp & 0.9 & \hspace{-2\tabcolsep}~days & & & \\ joint & 91.5 & Sph & 999 & \hspace{-2\tabcolsep}~km & 185 & \hspace{-2\tabcolsep}~km/day & \\ \bottomrule \end{tabular} obtained via \begin{example*} simpleSumMetricModel <- vgmST("simpleSumMetric", space=vgm(120, "Sph", 150), time =vgm(120, "Exp", 10), joint=vgm(120, "Sph", 150), nugget = 10, stAni = 150) fit.StVariogram(empVgm, simpleSumMetricModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(1, 10, 1, 1, 1, 100, 1, 10)) lower = c(sill.s = 0, range.s = 10, sill.t = 0, range.t = 0.1, sill.st= 0, range.st= 10, nugget = 0, anis = 40), upper = c(sill.s = 200, range.s = 500, sill.t = 200, range.t = 20, sill.st= 200, range.st = 5000#, nugget = 100, anis = 1000)) \end{example*} \end{enumerate} The variogram parameters are numerically optimised using the function \code{fit.StVariogram} and the \code{L-BFGS-B} routine of \code{optim}. The parameter \code{fit.method} that controls the weighing of the residuals between empirical and model surface of \code{fit.StVariogram} is set to \code{7} (the spatio-temporal analog to the commonly used spatial weighting). A full list of all weighting schemes is presented in Table~\ref{tab:weighting}. In our application, the residuals are multiplied by the number of pairs in the corresponding spatio-temporal bin divided by the metric distance: $N_j/(h_j^2 + {\rm stAni}^2\cdot u_j^2)$. The spatio-temporal anisotropy is estimated beforehand and fixed at 118~km/day. This weighting scheme puts higher confidence in lags filled with many pairs of spatio-temporal locations, but respects to some degree the need of an accurate model for short distances, as these short distances are the main source of information in the prediction step. Note, that different weighting schemes will in general result in different model parameters generating different interpolation values. Our selection is based on the assumption that well filled bins provide more reliable empirical variogram estimates and the fact that short distances are the most important ones for a local interpolation. \begin{table}[t!] \centering \caption{Weighted MSE (\code{fit.method = 7, see Table~\ref{tab:weighting}}) for different spatio-temporal variogram families and different choices for the one-dimensional variogram components. Columns denote the spatial and temporal variogram choices. The metric model is only applicable if both domains use the same family.}\label{tab:vgmFits} \begin{tabular}{ll|rrrrr} \toprule model & joint & Exp+Exp & Exp+Sph & Sph+Exp & Sph+Sph & ${\rm Mat}_{\kappa=0.6}$ \\ \midrule {separable} & $~~\cdot$ & 9.87 & \bf{6.82} & 10.42 & 7.50 & $\cdot~~$ \\ {product-sum} & $~~\cdot$ & 10.09 & \bf{6.91} & 10.64 & 7.59 & $\cdot~~$ \\ {metric} & $~~\cdot$ & 10.25 & $\cdot~~$ & $\cdot~~$ & 10.59 & \bf{10.05} \\ \multirow{2}{*}{sum-metric} & Exp & 4.10 & 3.60 & 3.89 & 3.32 & $\cdot~~$ \\ & Sph & 3.74 & 3.73 & \bf{3.31} & 3.36 & $\cdot~~$ \\ \multirow{2}{*}{simple sum-metric}& Exp & 4.10 & 3.60 & 3.94 & 3.32 & $\cdot~~$ \\ & Sph & 3.74 & 3.98 & \bf{3.31} & 3.56 & $\cdot~~$ \\ \bottomrule \end{tabular} \end{table} \begin{figure} \centering \includegraphics[width=0.95\textwidth]{allVgmsWireframe.png} \caption{Sample and the best fitting spatio-temporal variogram of each family.}\label{fig:allVgmsWireframe} \end{figure} \begin{figure} \centering \includegraphics[width=0.95\textwidth]{allVgmsDiffWireframe.png} \caption{Differences between the sample and the best fitting spatio-temporal variogram of each family.}\label{fig:allVgmsDiffWireframe} \end{figure} \begin{figure}[b!] \centering \includegraphics[width=0.95\textwidth]{pred_daily_means_PM10.png} \caption{Spatio-temporal interpolation of daily mean $\rm{PM}_{10}$ concentrations using the sum-metric covariance model with the closest 50 neighbouring spatio-temporal locations. The crosses indicate sampling locations. The cell size of the grid in UTM projection is $10~\rm{km}\times10~\rm{km}$.}\label{fig:pred_daily} \end{figure} For comparison with classical approaches, we interpolate across Germany iteratively for each single day using all available data for variogram estimation. The purely spatial empirical variogram can directly be obtained from the empirical spatio-temporal variogram, by fixing the temporal lag at 0 separation. From the same set of variogram models as investigated for the spatio-temporal models, the exponential model (partial sill:~66.5, range:~224~km, nugget:~13.5) is the best suited based on the optimisation criterion. Alternatively, we could have fitted the spatial variogram for each day separately using observations from that day only. However, given the small number of observation stations, this produced unstable variograms for several days and we decided to use the single spatial variogram derived from all spatio-temporal locations treating time slices as uncorrelated copies of the spatial random field. Once the best fitting spatio-temporal variogram model is identified, the interpolation can be executed with the help of the function \code{krigeST}. We use the sum-metric model that obtained the smallest RMSE (compare Table~\ref{tab:vgmFits}) to produce a gridded prediction. The interpolation domain consists of daily values for a regular grid spanning over Germany in UTM projection. The cell size is $10~\rm{km}\times10~\rm{km}$. Figure~\ref{fig:pred_daily} shows the interpolated grid for the same days as Figure~\ref{fig:dailyMeans} alongside with all sampling locations. Additionally, maps depicting the differences from a leave-one-out cross-validation are presented in Figure~\ref{fig:diffs_daily}. A time series view is presented in Figure~\ref{fig:timeseries} showing the observed and predicted time series at a single location along with its 95~\% prediction intervals. The interpolated maps are generated for a set of time stamps \code{tIDs} and a grid over Germany \code{DE\_pred} by \begin{example*} krigeST(PM10~1, data = DE_RB_2005[ , tIDS], newdata = DE_pred, fitSumMetricModel, nmax = 50, stAni = fitMetricModel$stAni/24/3600) \end{example*} \begin{figure}[t!] \centering \includegraphics[width=0.95\textwidth]{diffs_daily_means_PM10.png} \caption{Differences of spatio-temporal predictions and observed daily mean $\rm{PM}_{10}$ concentrations using the sum-metric covariance model with the closest (approx. strongest correlated) 50 neighbouring spatio-temporal locations.}\label{fig:diffs_daily} \end{figure} \begin{figure}[h!] \centering \includegraphics[width=0.9\textwidth]{singleStationTimeSeries.png} \caption{Subset of the time series of observed and predicted ${\rm PM}_{10}$ at a single station in Lower Saxony along with its 95~\% prediction intervals.}\label{fig:timeseries} \end{figure} To further compare the different approaches, a leave-one-out cross-validation was carried out. The spatio-temporal interpolations are done for the closest 50 and 10 neighbours assessing the impact of the neighbourhood size. Inspection of the ranges of the variograms in the temporal domain, suggests that any station more than at most 6 days apart does not meaningfully contribute. Furthermore, the local estimation allows the spatio-temporal random field to have a varying mean value over space and time. The purely spatial interpolation can be considered as the extreme temporally local case, where only observations from the same time instance are considered. \begin{table} \caption{Leave-one-out cross-validation results. The column wMSE refers to the optimised value from the variogram estimation.}\label{tab:cv} \centering \begin{tabular}{lrr|rrrr} \toprule covariance model & wMSE & neigh. & RMSE & MAE & ME & COR \\ \midrule pure Spatial & & 10 & 6.15 & 4.09 & -0.01 & 0.84 \\ separable &\hspace{-\tabcolsep}[6.82]& 10 & 6.08 & 4.04 & -0.01 & 0.84 \\ product-sum &\hspace{-\tabcolsep}[6.91]& 10 & 6.08& 4.04& -0.01 & 0.84 \\ metric &\hspace{-\tabcolsep}[10.05]& 10 & 6.11 & 4.07 & 0.03 & 0.84 \\ sum-metric &\hspace{-\tabcolsep}[3.31]& 10 & 6.16 & 4.08 & -0.06 & 0.84 \\ simple sum-metric &\hspace{-\tabcolsep}[3.31]& 10 & 6.14 & 4.08 & -0.02 & 0.84 \\ \midrule pure Spatial & & 50 & 6.10 & 4.07 & 0.00 & 0.84 \\ separable &\hspace{-\tabcolsep}[6.82]& 50 & 6.05 & 4.04 & 0.01 & 0.84 \\ product-sum &\hspace{-\tabcolsep}[6.91]& 50 & 6.05 & 4.04 & 0.00 & 0.84 \\ metric &\hspace{-\tabcolsep}[10.05]& 50 & 6.07 & 4.08 & 0.03 & 0.84 \\ sum-metric &\hspace{-\tabcolsep}[3.31]& 50 & 6.14 & 4.09 & -0.01 & 0.84 \\ simple sum-metric &\hspace{-\tabcolsep}[3.31]& 50 & 6.14 & 4.08 & -0.02 & 0.84 \\ \bottomrule \end{tabular} \end{table} \section{Results and discussion}\label{sec:resultsDiscuss} In terms of added value of spatio-temporal kriging measured in cross-validation results, Table~\ref{tab:cv} shows hardly any benefit in the illustrative example. This effect can to a large degree already be explained from the spatio-temporal variograms: a temporal lag of one or a few days leads already to a large variability compared to spatial distances of few hundred kilometres, implying that the temporal correlation is too weak to considerably improve the overall prediction. Nevertheless, investigating a process with a higher temporal frequency will likely show a stronger correlation in the temporal domain. Looking into station-wise cross-validation statistics (not shown), the four stations with an RMSE of 10 and larger correspond to the locations with the largest annual mean concentrations ($>22~\mu{\rm g}/{\rm m}^3$). The added value of spatio-temporal kriging lies in the flexibility of the model. We are now in the position to not only interpolate at unobserved locations in space, but also at unobserved time instances. This makes spatio-temporal kriging a suitable tool to fill gaps in time series not only based on the time series solely, but also including some of its spatial neighbours. A very irregular sampled data set would as well largely benefit from a spatio-temporal approach, as spatially close but unobserved locations in one time slice are not of any help in a purely spatial approach, but the spatio-temporal model would benefit from the observed value nearby at another time instance. In a completely regular data set, the distance to a spatio-temporal neighbour is at least as large as the pure spatial distance and hence the correlation is weaker. Furthermore, being able to capture the covariance structure over space and time might foster a better understanding of the process under study. While we see spatio-temporal modelling being a powerful tool, the cross-validation results in Table~\ref{tab:cv} show that spatio-temporal kriging will not solve the problem of all poorly spatially captured phenomena. Further preprocessing steps might be necessary to improve the modelling of this $\rm{PM}_{10}$ data set such as for instance a temporal AR-model followed by spatio-temporal residual kriging or using further covariates in a preceding (linear) modelling step. Providing the best possible model of $\rm{PM}_{10}$ concentrations across Germany was beyond the scope of this paper. The selection of a spatio-temporal covariance model should not only be made based on the (weighted) mean squared difference between the empirical and model variogram surfaces (presented in Table~\ref{tab:vgmFits}), but also on conceptional choices and visual (Figure~\ref{fig:allVgmsWireframe}) judgement of the fits. Even though the function \code{fit.StVariogram} provides optimisation routines to fit different spatio-temporal variogram models, the numerical routines in the background may struggle to find the optimal parameters. Besides the lower and upper boundaries of the parameter space, the control parameter \code{parscale} of the \code{optim} function is a valuable option to improve the convergence of the optimisation. With passing \code{parscale} as entry of the list \code{control} a vector of scalars must be passed that controls the different levels of magnitude of the variogram parameters. In most applications, a change of 1 in the sills will have a stronger influence on the variogram surface than a change of 1 in the ranges. The problem becomes more difficult with an increasing number of parameters. In our application, using the simple sum-metric model as starting values for the full sum-metric model improved the convergence speed of the more complex model. In the presented application, the sum-metric models turns out to be the same as the simple sum-metric model. While this might at first sight be due to using the simpler model to generate starting values, different non simplified starting models converged to the same result. Generally, it is important to keep in mind the strong interaction of the model parameters. It is typically not easy to distinguish how much of the spatio-temporal nugget and sill is attributed to spatial, temporal or joint components. In this paper we considered a joint numerical approach, but step-wise approaches where the components are estimated separately could as well be considered. The interested reader is also referred to \cite{Nash2014}. However, all optimisation approaches follow the premise that the studied process can be approximated with the given model and available data. If this premise fails, no optimal model can be selected. An extension towards a restricted maximum likelihood method (REML) to fit the spatio-temporal variogram model would be desirable, as it overcomes some of the above mentioned drawbacks of the method of moments based approaches and would additionally provide standard errors for the parameter estimates. A REML approach would allow to take into account that sample variogram values are correlated. However, for large datasets (as in the spatio-temporal case), it is computationally more feasible to use a least squares fitting. To reduce the correlation of the variogram values, some randomisation could be implemented in large data sets, to calculate the sample variogram based on partially overlapping or even disjoint sets of observations. The selected anisotropy as proxy to the relation of spatial and temporal distance in determining the strongest correlated neighbours might show a distortion for some models when only few neighbours are used towards the true set of the most correlated locations. However, this effect vanishes as soon as the spatio-temporal range of the model is sufficiently represented through the set of nearest neighbours. As mentioned by \cite{kj99}, an alternative to space-time kriging might be co-kriging. However, this is only feasible if the number of time replicates is (very) small, as the number of cross variograms to be modelled equals the number of {\em pairs} of time replicates. Also, co-kriging can only interpolate for these time slices, and not inbetween or beyond them. It does however provide prediction error covariances, which can help assessing the significance of estimated {\em change} parameters \citep{pe1,pe2}. Several of the space-time variograms presented here may be approximated by sets of direct variograms and cross-variograms. Fitting variogram models to sample space-time variograms is in our implementation done by \code{stats::optim}. Our example script uses method \code{L-BFGS-B} and provides upper and lower parameter boundaries, e.g.\ to make sure sill parameters do not become negative. There has been a lot of research in optimization since the methods in \code{optim}, some of which has been reported in the special issue of the Journal of Statistical Software \citep{optim}, and we do see potential to improve the options in this respect. The approximate selection of the most correlated neighbours solves the lack of a natural notion of a joint distance across space and time. However, other sampling properties might introduce a bias in the prediction. The prediction at an unobserved location with a cluster of observations at one side will be biased towards this cluster and neglect the locations towards the other directions. Similar as the quadrant search in the pure spatial case an octant wise search strategy for the local neighbourhood would solve this limitation. A simpler stepwise approach to define an $n$-dimensional neighbourhood might already be sufficient in which at first $n_s$ spatial neighbours and then from each spatial neighbour $n_t$ time instances are selected, such that $n_s \cdot n_t \approx n$. The presented example considers stationary random fields that are isotropic in space. Further extensions towards more sophisticated variogram estimations allowing also for spatial geometric anisotropy are desirable. One could for instance plot variogram maps for spatial separation in North and South direction for each temporal lag. However, the current implementation does not allow to use the anisotropy parameter \code{anis} of the pure spatial variogram definition. Nevertheless, a preliminary rescaling of coordinates would be a possible workaround. This route has for instance been taken by \citet{Gasch2015} performing 3D+T kriging . The soil profiles in their study show a clear difference in horizontal and vertical variography. To correct for this, the depth dimension of the data has been rescaled to correspond with the dimensions of the horizontal distances before hand. In the subsequent study, these pseudo 3D coordinates have been used to fit the spatio-temporal variograms and perform kriging. The code in model definitions is meant to be kept both flexible and simple. This is based on i) re-producing the notion of the geostatistical models in the R code and in ii) reusing existing definitions and functions of the pure spatial cases that have been available for many years in \pkg{gstat}. The data handling benefits to a large degree from the implementations in the \pkg{spacetime} R package. \section{Conclusions}\label{sec:conclusions} The spatio-temporal extensions to \pkg{gstat} allow to model a set of spatio-temporal covariance functions. The implemented functionality eases estimation, visualisation and understanding of spatio-temporal covariance functions. The extension and reuse of already available function structures and nomenclature facilitates an easy translation of spatial workflows to handle spatio-temporal data. The numerical estimation of the variogram parameters might be tricky and needs a large degree of the users attention. It is advised to carefully check the outcome of the \code{optim} routine after optimisation. Spatio-temporal kriging predictions can be made in a global and a local neighbourhood set-up, while the latter will be the preferred solution for most spatio-temporal data sets and common computer hardware configurations. Spatio-temporal covariance structures carry valuable information, but a spatio-temporal model is not guaranteed to outperform pure spatial predictions. The benefit in terms of prediction quality of spatio-temporal kriging becomes only apparent if sufficiently strong correlated locations are added with the temporal dimension (i.e.\, if the model permits strong correlation across time). Nevertheless, the spatio-temporal covariance model might be of interest in itself. Besides some publications where the authors of this paper were involved in, such as \cite{Kilibarda2014}, the software presented here has proven useful in several independent publications, examples of which are \citep{marek, biondi, hu, yoon}. \section{Acknowledgements} This research has partly been funded by the German Research Foundation (DFG) under project number PE 1632/4-1. We thank two anonymous reviewers for their valuable comments. \bibliography{spatio-temporal-kriging} \pagebreak \address{Benedikt Gr{\"a}ler\\ Institute for Geoinformatics, University of M{\"u}nster\\ Heisenbergstr. 2, 48149, M{\"u}nster\\ Germany}\\ \email{ben.graeler@uni-muenster.de} \address{Edzer Pebesma\\ Institute for Geoinformatics, University of M{\"u}nster\\ Heisenbergstr. 2, 48149, M{\"u}nster\\ Germany}\\ \email{edzer.pebesma@uni-muenster.de} \address{Gerard Heuvelink\\ Department of Environmental Sciences, Wageningen University\\ PO Box 47, 6700AA, Wageningen\\ The Netherlands}\\ \email{gerard.heuvelink@wur.nl} \section{Appendix} \subsection{Derivation of the separable covariance and variogram identities}\label{sec:derivSep} The separable covariance and variogram identity is readily available through \begin{align*} C_{\rm sep}(h,u) &= C_{\rm s}(h)C_{\rm t}(u) = sill \cdot \bar{c}_s(h)\bar{c}_t(u) \\ \gamma_{\rm sep}(h,u) &= C_{\rm sep}(0,0) - C_{\rm sep}(h,u) \\ &= sill \left(1- \bar{c}_s(h) \cdot \bar{c}_t(u) \right) \\ &= sill \left(1- \left(1-\bar{\gamma}_s(h)\right)\left(1-\bar{\gamma}_t(u)\right) \right) \\ &= sill \left(1- \left(1-\bar{\gamma}_s(h) -\bar{\gamma}_t(u) + \bar{\gamma}_s(h)\bar{\gamma}_t(u)\right) \right) \\ &= sill \left(\bar{\gamma}_s(h) + \bar{\gamma}_t(u) - \bar{\gamma}_s(h)\bar{\gamma}_t(u)\right) \end{align*} where $\bar{c}$ and $\bar{\gamma}$ are normalised correlation and correlogram functions respectively. \subsection{Derivation of the product-sum covariance and variogram identities}\label{sec:derivPs} The product-sum covariance and variogram identity is readily available through: \begin{align*} C_{\rm ps}(h,u) = & \ k \cdot C_{\rm s}(h)C_{\rm t}(u) + C_{\rm s}(h) + C_{\rm t}(u) \\ \gamma_{\rm ps}(h,u) = & \ C_{\rm ps}(0,0) - C_{\rm ps}(h,u) \\ = & \ k \cdot C_{\rm s}(0)C_{\rm t}(0) + C_{\rm s}(0) + C_{\rm t}(0) \\ & - \left(k \cdot C_{\rm s}(h)C_{\rm t}(u) + C_{\rm s}(h) + C_{\rm t}(u)\right) \\ = & \ k \cdot {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} + {\rm sill}_{\rm s} + {\rm sill}_{\rm t} \\ & - k \cdot \left[ \left({\rm sill}_{\rm s} - \gamma_{\rm s}(h)\right)\left({\rm sill}_{\rm t} - \gamma_{\rm t}(u)\right)\right] - \left({\rm sill}_{\rm s} - \gamma_{\rm s}(h)\right) - \left({\rm sill}_{\rm t} - \gamma_{\rm t}(u)\right) \\ = & \ k \cdot {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} + {\rm sill}_{\rm s} + {\rm sill}_{\rm t} \\ & - k \cdot \left[ {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} - {\rm sill}_{\rm s} \cdot \gamma_{\rm t}(u) - {\rm sill}_{\rm t} \cdot \gamma_{\rm s}(h) + \gamma_{\rm s}(h) \gamma_{\rm t}(u) \right] \\ & - {\rm sill}_{\rm s} + \gamma_{\rm s}(h) - {\rm sill}_{\rm t} + \gamma_{\rm t}(u) \\ = & \ k \cdot {\rm sill}_{\rm t} \gamma_{\rm s}(h) + k \cdot {\rm sill}_{\rm s} \gamma_{\rm t}(u) - k \gamma_{\rm s}(h) \gamma_{\rm t}(u) + \gamma_{\rm s}(h) + \gamma_{\rm t}(u) \\ = & \ (k \cdot {\rm sill}_{\rm t} + 1) \gamma_{\rm s}(h) + (k \cdot {\rm sill}_{\rm s} + 1) \gamma_{\rm t}(u) - k \gamma_{\rm s}(h) \gamma_{\rm t}(u) \end{align*} %%%%%%%%%% \end{document} gstat/vignettes/gstat.Rnw0000644000176200001440000003154015060550314015220 0ustar liggesusers%% Document started, Sat Jul 3 19:30:52 CEST 2004, my 37th birthday, %% while being stuck for 24 hours at Philadelphia airport, on my way %% back from the joint TIES/Accuracy 2004 symposium in Portland, ME. %% Continued, Oct 28, during the Apmosphere mid-term review. Oh, shame. % \VignetteIndexEntry{ The meuse data set: a tutorial for the gstat R package } \documentclass[a4paper]{article} \usepackage{hyperref} \newcommand{\code}[1]{{\tt #1}} \SweaveOpts{echo=TRUE} \title{The meuse data set: a brief tutorial\\ for the {\tt gstat} R package } \author{\href{mailto:edzer.pebesma@uni-muenster.de}{Edzer Pebesma}} \date{\today} \begin{document} \maketitle \section{Introduction} The \code{meuse} data set provided by package \code{sp} is a data set comprising of four heavy metals measured in the top soil in a flood plain along the river Meuse, along with a handful of covariates. The process governing heavy metal distribution seems that polluted sediment is carried by the river, and mostly deposited close to the river bank, and areas with low elevation. This document shows a geostatistical analysis of this data set. The data set was introduced by Burrough and McDonnell, 1998. This tutorial introduced the functionality of the R package \code{gstat}, used in conjunction with package \code{sp}. Package \code{gstat} provides a wide range of univariable and multivariable geostatistical modelling, prediction and simulation functions, where package \code{sp} provides general purpose classes and methods for defining, importing/exporting and visualizing spatial data. \section{R geostatistics packages} Package \code{gstat} (Pebesma, 2004) is an R package that provides basic functionality for univariable and multivariable geostatistical analysis, including \begin{itemize} \item variogram modelling, residual variogram modelling, and cross variogram modelling using fitting of parametric models to sample variograms \item geometric anisotropy specfied for each partial variogram model \item restricted maximum likelihood fitting of partial sills \item variogram and cross variogram maps \item simple, ordinary, universal and external drift (co)kriging \item (sequential) Gaussian (co)simulation equivalents for each of the kriging varieties \item indicator (co)kriging and sequential indicator (co)simulation \item kriging in a local or global neighbourhood \item block (co)kriging or simulation for each of the varieties, for rectangular or irregular blocks \end{itemize} Other geostatistical packages for R usually lack part of these options (e.g. block kriging, local kriging, or cokriging) but provide others: e.g. package \code{geoR} and \code{geoRglm} (by Paulo Ribeiro and Ole Christensen) provide the model-based geostatistics framework described in Diggle et al. (1998), package \code{fields} (Doug Nychka and others) provides thin plate spline interpolation, covariance functions for spherical coordinates (unprojected data), and routines for spatial sampling design optimization. \section{Spatial data frames} As an example, we will look at the meuse data set, which is a regular data frame that comes with package \code{gstat} (remove the 88 from the colour strings to make a plot without alpha transparency on windows or X11): <>= library(sp) data(meuse) class(meuse) names(meuse) coordinates(meuse) = ~x+y class(meuse) summary(meuse) coordinates(meuse)[1:5,] bubble(meuse, "zinc", col=c("#00ff0088", "#00ff0088"), main = "zinc concentrations (ppm)") @ % the following is needed because lattice plots (bubble wraps xyplot) do not % show without an explicit print; in order not to confuse users, we hide this: <>= print(bubble(meuse, "zinc", col=c("#00ff0088", "#00ff0088"), main = "zinc concentrations (ppm)") ) @ and note the following: \begin{enumerate} \item the function \code{coordinates}, when assigned (i.e. on the left-hand side of an \verb|=| or \verb|<-| sign), promotes the \code{data.frame} meuse into a \code{SpatialPointsDataFrame}, which knows about its spatial coordinates; coordinates may be specified by a formula, a character vector, or a numeric matrix or data frame with the actual coordinates \item the function \code{coordinates}, when not assigned, {\em retrieves} the spatial coordinates from a \code{SpatialPointsDataFrame}. \item the two plotting functions used, \code{plot} and \code{bubble} assume that the $x$- and $y$-axis are the spatial coordinates. \end{enumerate} \section{Spatial data on a regular grid} <>= data(meuse.grid) summary(meuse.grid) class(meuse.grid) coordinates(meuse.grid) = ~x+y class(meuse.grid) gridded(meuse.grid) = TRUE class(meuse.grid) image(meuse.grid["dist"]) title("distance to river (red = 0)") library(gstat) zinc.idw = idw(zinc~1, meuse, meuse.grid) class(zinc.idw) spplot(zinc.idw["var1.pred"], main = "zinc inverse distance weighted interpolations") @ <>= print(spplot(zinc.idw["var1.pred"], main = "zinc inverse distance weighted interpolations")) @ If you compare the bubble plot of zinc measurements with the map with distances to the river, it becomes evident that the larger concentrations are measured at locations close to the river. This relationship can be linearized by log-transforming the zinc concentrations, and taking the square root of distance to the river: <>= plot(log(zinc)~sqrt(dist), meuse) abline(lm(log(zinc)~sqrt(dist), meuse)) @ \section{Variograms } Variograms are calculated using the function \code{variogram}, which takes a formula as its first argument: \verb|log(zinc)~1| means that we assume a constant trend for the variable log(zinc). <>= lzn.vgm = variogram(log(zinc)~1, meuse) lzn.vgm lzn.fit = fit.variogram(lzn.vgm, model = vgm(1, "Sph", 900, 1)) lzn.fit plot(lzn.vgm, lzn.fit) @ <>= print(plot(lzn.vgm, lzn.fit)) @ Instead of the constant mean, denoted by \verb|~1|, we can specify a mean function, e.g. using \verb|~sqrt(dist)| as a predictor variable: <>= lznr.vgm = variogram(log(zinc)~sqrt(dist), meuse) lznr.fit = fit.variogram(lznr.vgm, model = vgm(1, "Exp", 300, 1)) lznr.fit plot(lznr.vgm, lznr.fit) @ <>= print(plot(lznr.vgm, lznr.fit)) @ In this case, the variogram of residuals with respect to a fitted mean function are shown. Residuals were calculated using ordinary least squares. \section{Kriging} <>= lzn.kriged = krige(log(zinc)~1, meuse, meuse.grid, model = lzn.fit) spplot(lzn.kriged["var1.pred"]) @ <>= print(spplot(lzn.kriged["var1.pred"])) @ \section{Conditional simulation} <>= lzn.condsim = krige(log(zinc)~1, meuse, meuse.grid, model = lzn.fit, nmax = 30, nsim = 4) spplot(lzn.condsim, main = "four conditional simulations") @ <>= print(spplot(lzn.condsim, main = "four conditional simulations")) @ For UK/residuals: <>= lzn.condsim2 = krige(log(zinc)~sqrt(dist), meuse, meuse.grid, model = lznr.fit, nmax = 30, nsim = 4) spplot(lzn.condsim2, main = "four UK conditional simulations") @ <>= print(spplot(lzn.condsim2, main = "four UK conditional simulations")) @ \section{Directional variograms} The following command calculates a directional sample variogram, where directions are binned by direction angle alone. For two point pairs, $Z(s)$ and $Z(s+h)$, the separation vector is $h$, and it has a direction. Here, we will classify directions into four direction intervals: <>= lzn.dir = variogram(log(zinc)~1, meuse, alpha = c(0, 45, 90, 135)) lzndir.fit = vgm(.59, "Sph", 1200, .05, anis = c(45, .4)) plot(lzn.dir, lzndir.fit, as.table = TRUE) @ <>= print(plot(lzn.dir, lzndir.fit, as.table = TRUE)) @ Looking at directions between 180 and 360 degrees will repeat the image shown above, because the variogram is a symmetric measure: $(Z(s)-Z(s+h))^2=(Z(s+h)-Z(s))^2$. The first plot gives the variogram in the zero direction, which is North; 90 degrees is East. By default, point pairs are assigned to the directional variorgram panel with their nearest direction, so North contains everything between -22.5 and 22.5 degrees (North-West to North-East). After classifying by direction, point pairs are binned by separation distance class, as is done in the usual omnidirectional case. In the figure, the partial sill, nugget and model type of the model are equal to those of the omnidirectional model fitted above; the range is that in the direction with the largest range (45$^o$), and the anisotropy ratio, the range in the 135 direction and the range in the 45 direction, estimated ``by eye'' by comparing the 45 and 135 degrees sample variograms. Gstat does not fit anisotropy parameters automatically. We do not claim that the model fitted here is ``best'' in some way; in order to get to a better model we may want to look at more directions, other directions (e.g. try {\tt alpha = c(22, 67, 112, 157) }), and to variogram maps (see below). More elaborate approaches may use directions in three dimensions, and want to further control the direction tolerance (which may be set such that direction intervals overlap). For the residual variogram from the linear regression model using \code{sqrt(dist)} as covariate, the directional dependence is much less obvious; the fitted model here is the fitted isotropic model (equal in all directions). <>= lznr.dir = variogram(log(zinc)~sqrt(dist), meuse, alpha = c(0, 45, 90, 135)) plot(lznr.dir, lznr.fit, as.table = TRUE) @ <>= print(plot(lznr.dir, lznr.fit, as.table = TRUE)) @ \section{Variogram maps} Another means of looking at directional dependence in semivariograms is obtained by looking at variogram maps. Instead of classifying point pairs $Z(s)$ and $Z(s+h)$ by direction and distance class {\em separately}, we can classify them {\em jointly}. If $h=\{x,y\}$ be the two-dimentional coordinates of the separation vector, in the variogram map the semivariance contribution of each point pair $(Z(s)-Z(s+h))^2$ is attributed to the grid cell in which $h$ lies. The map is centered around $(0,0)$, as $h$ is geographical distance rather than geographical location. Cutoff and width correspond to some extent to map extent and cell size; the semivariance map is point symmetric around $(0,0)$, as $\gamma(h)=\gamma(-h)$. <>= vgm.map = variogram(log(zinc)~sqrt(dist), meuse, cutoff = 1500, width = 100, map = TRUE) plot(vgm.map, threshold = 5) @ <>= print(plot(vgm.map, threshold = 5)) @ The threshold assures that only semivariogram map values based on at least 5 point pairs are shown, removing too noisy estimation. % The plot is plagued by one or two extreme values, corresponding to cells % with very small number of point pairs, which should be removed. \section{Cross variography} Fitting a linear model of coregionalization. <>= g = gstat(NULL, "log(zn)", log(zinc)~sqrt(dist), meuse) g = gstat(g, "log(cd)", log(cadmium)~sqrt(dist), meuse) g = gstat(g, "log(pb)", log(lead)~sqrt(dist), meuse) g = gstat(g, "log(cu)", log(copper)~sqrt(dist), meuse) v = variogram(g) g = gstat(g, model = vgm(1, "Exp", 300, 1), fill.all = TRUE) g.fit = fit.lmc(v, g) g.fit plot(v, g.fit) vgm.map = variogram(g, cutoff = 1500, width = 100, map = TRUE) plot(vgm.map, threshold = 5, col.regions = bpy.colors(), xlab = "", ylab = "") @ <>= print(plot(v, g.fit)) @ <>= print(plot(vgm.map, threshold = 5, col.regions = bpy.colors(), ylab = "", xlab = "")) @ \section*{References} \begin{itemize} % \item Abrahamsen, P., F. Espen Benth, 2001. Kriging with inequality % constraints. Mathematical Geology 33 (6), 719--744. % \item Bivand, R.S., 2003. Approaches to classes for spatial data in R. % In: K.~Hornik \& F.~Leisch (Eds.), Proceedings of the 3rd International % Workshop on Distributed Statistical Computing (DSC 2003) March 20--22, % Vienna, Austria. ISSN 1609-395X; available from [1]. \item Burrough, P.A., R.A. McDonnell, 1998. Principles of Geographical Information Systems, 2nd Edition. Oxford University Press. \item Diggle, P.J., J.A. Tawn, R.A. Moyeed, 1998. Model-based geostatistics. Applied Statistics 47(3), pp 299-350. % \item Pebesma, E.J., Wesseling, C.G., 1998. Gstat, a program for % geostatistical modelling, prediction and simulation. Computers \& % Geosciences, 24 (1), pp. 17--31. \item Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers \& Geosciences \href{http://dx.doi.org/10.1016/j.cageo.2004.03.012}{30: 683-691}. % \item Ver Hoef, J.M., Cressie, N.A.C, 1993. Multivariable Spatial % Prediction. Mathematical Geology, 25 (2), pp. 219--240. \item Wackernagel, H., 1998. Multivariate Geostatistics; an introduction with applications, $2^{\mbox{nd}}$ edn., Springer, Berlin, 291 pp. \end{itemize} \end{document} # g = gstat(NULL, "log.zinc", log(zinc)~1, meuse) # g = gstat(g, "log.zinc.res", log(zinc)~sqrt(dist), meuse) # lplot(vgm.map[["map"]], c("log.zinc", "log.zinc.res")) % vim:syntax=tex gstat/data/0000755000176200001440000000000015060550314012304 5ustar liggesusersgstat/data/oxford.rda0000644000176200001440000000544715162303122014303 0ustar liggesusersBZh91AY&SYR lA$t@@@F@@@@@I ]3oFiOE3MOPFj=LihAzLQLGfz&f@=L 4=FAA0~44 4@@h&M142bb22bi`Ʉ1@@4'Th2@h A44H@hhIЉhAjMF@4d h42Gds;jMHJcUMJGfl<ݭkU))`45MUf+ٖlj:CϢx;G/?7`9${#@){3XK!i+vB%bPBLɴѻgoPn # mM^?SjK+sqi_+t͕kNq3Y %Ê10Ȁg{NBiKD&`0MpRLՓl٨ ֍@dE#^;Ffy;Pi?Sn2m+se7W2h*wk˻;/ 1溪z)PmV"!cwGIHd5T7 Ց@&A^ISYh (3lƦ5T`K(jHBBj7ܚgBOݯt !@HP%%UG]F>Hb!UUdPV6#?s]umtw|mXg2V&*Z7!ufv6F{6 lKtVzݢHVPJb^_jfiJ@HRP)ݕV.U6rll8EQXq.f!|~Q\ (lUMvvp 8e'aidnjz ;aX,4g䭾9u\M wFk4K?Iv0q\ʑ 2B~e q!{BV#e·]m z\ybY½%Ks?GG(W\$r D^WY:]\z{1-I'oxiqWV#4IzOW~oK;~n=e]1n!5EZt%wsN"ΉgjmZyywxxbww XzA&8RFEݮk#Hnp.]ǢmT}U"$|U.NJWܸ jX4-w  %w[{nGpI$I$I$I$I$I$I$I$I$I$I%ffffbI$I$YZ862L*Zgg(^Ndi 0*"?wq[[q; ڊn[w;wqw]ܮwN]nwvӥܹɢtP jKbNuV۪55j-?m_" @c (q Z@u4@6 bVEG(ȣy 6+,(@ Z4 !D o4fOۢ?P"A8 AY4 gF1c7~'ykb*@I$,Zl,&*ȹ!$I ȩOUUUUUU4@@=>L:}Ӡ^va$(eUw[w\nzׯ^h B İ@3333X QTDZֵjj0Dьc3D 2@Q(xcx~Y{w>]su+2^:˗'ZW NLP7_.dʊƚDRFadY("s?J% $fB,%2 () "׉b[rkEWW[Ex^M^M0afY !t (B`̶Z"ecT)IJЋ]$K2K^"FjZ%u+l;F⹮\\g7JM4(%*ͻt\Mss[^o&ռ+xkkywV/VIky-FQ]*\V5Y4hآT61Q 2[BXf&I+ $%i2#,v@ѨQ@QTUEkCDEZ JQZ5mHHBA"I*h܅翛vܗ)M6dfJ6u հMR}>\v>[ϔ{7>og̿N~k[x}~q$i h "Ɖ<@PA g @ 8 GYfH0bjGAr Hќp F4 -!bHhzi0&$@/.-"q=3 Erc@iF-"E $3LR+H5J -״%g,4.  7ѧm_v~}{fzo#>rB}7vulo/پBvlџ>|e|U|vIr;vny<IbAx2-^cb<ȂBY,R Di$b9Eĉr h0,zj)^Yy"% @f@0: f6~mKp<ڼ%x;Z#[\?B"GiIwTkI~WL$%~qwYH\-]E XyYF|W/;{꡹ IcsDzv\$7.xtovt&&W a9Yh=aEз"hw!hΣ ƽX%s%bz04UDF-8 I@˞\y1$%R\+?NO-`>*wD;KOܦ;~$l'I~=kkCŵxaH۴|ӄNs5C@N#Ȝ3}~KL[r?&p '?Gp;js8֧?GYo%{IP B@x?@"+կg[I"Pb\!>l5ts9̾!`Gv]Gl*zhQv=Ҭ/5HoY5CcZ5UڪU اϳ1ۂoң4>[:\<>@@x[RpMz>0skK[3Ƶ72#1kL#d 8ǚCOphba*)* QNᰦԵ"!Zl8EnQMvڑu+PcJC#8mtw\?¸Ev*i@3hVcՉ/35X:ىb '\nٖ&m19S|A`~|@d*CA~P;}>,%zo\͵X,R @}W"+Tpo=8Ez1m=N~@Óo/dk0L6$oI) 0GmByG [ogN /^yTCy׿lyH [w|<8* )J KjǹVwmWJV0$h5k3ιW m2?(fFN$%z}QeסBRWu|=1 a/_/޲QO+ &v<%!{,QP4R Q(pWIM/ٓm1OawKz1A9X%fz=砊@+ ։Hb#}c` UW9FZ{&Uׇo j!o Q'q˳0A@! 0VjZ!dd @Sv 4Q5-tO8_X*.h~GS2uhVR@,aBg~\pP'Iw\R-pWfX`0I EK& b ! w=sDT0&`dAdp(PÀiA5 Z`4H^b:n1 U`ek|fk"5.KP` ]Cj *gL %4D]fDJk?J"_=_70) QVfTXRԿy<&,X@aA W O]FӇ[B3A~! |XZ"`~Lb#8N A9OӸ lF͡P~Pcu1l1թ.:6)4 !0Tiw( (Pc @.;+H bjJ2 չggw#/0Ay-gm rUpfSd@  E;┱Ljy=O1f*5 X-pHvbcL%^HLƁ]BO5u: ٍedf3 J$aj!rVh(l<[YhRڛ?ˢ̖/rG[ ,%$oN{ KįFh^ b2ޤD,5M;՘+X,!7?cs%S;voN+[r B. ];OQEpkd 4UՋ֭ oeO3ZfP -n8 eٜNug/*0JL[ͩ2 B ~V.Wj,3 'xcڝ#MӲoF*vcZj|-wjN)tdT& ܃c~3GܿzfS_NUs'ڶ6BlP!4`@ ;lXBb MqUS4 :+.x\F/f+XhJxLIKL8 ۦ>̺,zZF!7rklx`x82)Z{/6qI2wOGHokh I6,'Qrz.?<#r1$ή'*|㘮扥tΗA V=cpiJ^AvA8/Yk uKcQ QPt/;ث1pINi*$KW6Tjw`_S`^|*6&|Pa%Ze`q-TQ٤+u5#DnK7>et0*{RTזP߆=j?$Zmx4P=5˻îqf\ tɝMQ̈-ۦW[< p1 SFA\5v[6窻n/|>֍ "%=CPidLy)sM:n*lgȕ9Jey~OFۖP\T"4j Wl;4JEa5b^3*0EL.5ۥEGVb[U"l-&:3H㍐DraIc [g߶^(̀9[J c||6ŭ%B41צՅ*f@k'=8!C\^J5͚ q2m^B8n=NiR%YA`6?y0볒ΐ`ŽA~n3^75lfP{V/OCPS^B.USDOgUSa]=gpm%pIaMמ*YX.%4W:Wm$jO1O2t1F۞N-SF]7bԿ7HxqXANr=/F%ng^=@t1=.KfvV=銕). y@siZQU-̊?>qN6VopӚ3nND!IH˧U*a|o@[F-˯Fp8RM24BumZw-5*d%q8>a=c9E=EuC\% PC иoh%)+.ftli轀n?H9 a֚5>;zWc߹Z> 5Kw/yVJ@s=)11#v|.҇hxXݸx|*QB+&|SO[&\#]_riȰRZ"gxTu\B7kDN쫫Vc\_ω`:㞍zVmmMj0*/l vy.<2рT<@h&έZsxՕ. w[}(vXC^>c$tro+k Le}_ȃ;qW^:kG*K|ɰafX @2krtNtY}˿#/}Phc둗w 8kwM(ЛVZZntzktğcwߍM2$>3ŝ[F: K/ʼn oQܙ? YSxF;r\c zq`-ӣU`E-͋\~jf8&Y?8jD ؑ݀Zh)\9n"=cۛoj@ ŕeḱ6"WvzQ;y˺վ/ML+<{Zha1 !>d0Yl{K+G#Y u1nx:#LJkOܪﳓ*Y.?JE)Waz kU'frC ie9^ v7`Ve(r~&}l[N[qgVX  (B3"jq *8l|࠶{Y;!^Y8/FSBz) Xbd+4QpQlSR;Qqu|S 9]YPi%[ŠXYA4;8[1sJ毅ÆgSܑzYl![6-jF>-M i<2;QhsI ?í+ME|RVc=Ɍ9~77vQxFhsBI]O[3SL< K 3MF~"8U 0Хtj/ŨLolˮ#p~6o%vV%)8Zg=) Bu 04 ]q ԎECs }9og! & z'K 8N**)"k›FTaZtnjQB_7)^aK;p˞IWuR^Q-I" (w&V pCO\>2cUBelR05wRY!wNjk)Z0amYJc1Q=be-S;:Ƌ-KaBj*꡻e}y1ٟA2#b.cI5ڧFû:0!RZ$x}\!݇v<]^1uW-¶膃G(Zb9WgVJ ^u(hBʦ#Xdu״߂Ug MG xyҳn '+6Zn"vxz3'VeR933zgm`' hp|Y+8g.[ %~b!M<| tTG ^ 4Mfۿ2lijn]K6񮼗Pf86kSa +slɸV*Yy"\An}D-=N̄Û/c4Cèy^ZW"22ANى5-Vza7Pɴ-axճ &zn%܀gd3pdƦWq~J/f;c ^WZd F7&}hDG-7DI4(UT*?mW>D@ÉL!Y3U š!PugYԟБT5=S;{zҲKq8(A|1XH5J,P.O=ٺO Gs{ddV֘HV=/&Zp.-tqac fVn^ Ĭ^@IrTpB4}Ք^\vn!c Ӯg gO1 11QW܍Z0ydaȲ- #w}U{.ZY"q ]2r 4 vQF`>Ƕ>&7oH2\( V{K]sFnWUSjjE8e! 7KmV}e;󚣜GcOfjlmb^ldr*wWp \==9?rcy۔ޝ3E(&;u~w'j!i(, ĉsrNc[?L+GiZ:s-)TpjyV]S3A+R@n5 J=NƜT*&'@2yޔ!skYm+tQd9g%:Nهy^ tZ )9HCx^$)Gѳ1nT^a270Km/ao%vnfR#~Fz3Vq;? k䛫,58#j "(dbQHNVvb ֳޥ!O=WhNp#oEi*po*Sw k._sJK%C<%PmAnϐe6}5C}7W`N.a܋@O3} X.{=zoO\_P>3r@$]BnXH!uc{Ί#*_߶%ct4%j&]@t-TGDԢrk\yF5|@&֒Ljnpd(KĽ};Vz\(c\Q)bf-+vT1زnDRd{氆\B\|IlUd&st1tϊJ$TtK^f \)zڸgqKtP6mᘣcd寸t;}OK8{'$'t3H\~t?Fu@ P\m @Nߺ!?9 Qq 4eQ(M&^Z!Z{} 8,|F?F|o}*˷+ݏl 8\+sz-KzË́$}ǁuq  \fv;Dy]iL}8觹DsҀr?TQbqRc k]iϦxߥ:hԧ2`5مƢ*AkH*IP=8rv8M~p^6@uf\BΘ6hp&9rP+x(nF]6 @D7Ssm9hQoʩAhRu~ݥ[c%Ba Er'R-κˊy3/Cod\,֫2qW$`4j9.}vepgX/'& 8@Nڤ2=6.%B˽lLP2RI~5.EloBRqc1|A?Qp]nN``~LoGa嚠PF9m|CU~tLcPݹã.x֥7ydy۟hu^5Bxt<R11Wޖ5C֧o+9(K>8uqث2)#򤥮$l#(GpYł?WH\]6M)Ze7 4#!Ftz2w)DE-T@id<!À v*wm~v84z׫DS.|j CRrXeQpg(6PnatO nN.\=]^i,Aq)TF|h1gQo]f\1"L 3j/l4,Ӓ=^́ks}b6Pln /GNaHu ^xy^d歆=f0 iKڼ7,]ߌGG.{"u] im/5Y*"Tfηy#v]y|OmfZ_) z2AJ=aj^ԕ'$}ULf?RQ{ @ @*g,Sh6%!Z&m}%NPi/1Q֛s`ݞp0FWGPY֒9Ӻcv-k=:Òd-d5yZzbUC!JLXy`0oonBkIc>Z?&"B䑝 Go . d$)?kʯz4lYVA߻źwVˇbn`-dg]~Nuӛnf[aVP hx!=Fg;-e$L:0?lG!~UD}=G'Iw'gz zIgd7z5 WyπoMnڸXrх4q"`<mjֈY`_) ieP#F}>2o5N-_CsZzwS{3}lnm̗dO0> AoDS(@rAn[ IyWvko.L4H{".,P_A^2naKKlqu ?po }# 10Z0ECOַj5\^\UJRw)cA^;6}hYz1@7pcyU֥"?XAv*1?M;)JV5ϟQX>h{-uߒDsS:'VwT9¸!Fr4+G{ztXXv ˭20{D68ţM [ >V1(H^t8& j_bVx17U1o0?ja<;}j2.s?l#D,;"H@@hފ*b9/a/&\e\Y"epPף?܃ Pt8Q:_.xyAV OKf=D7qtrN|)Rar3Z뿕i ~׊d>ϐX 9w!^elCԫHuP,*KЯ,19F7b~XL mɱm; %d:E/Vx:n4nwwL^QWJ8/½-a qnU[e#W֒7k]ͦ~>'#̵ mwE&0b!;x={piI GޛV p֝&,͔6rx!;PQdD8>֊x3k^I*BDK ' 4\XVl0RwWrRSl:I&Nߪ,>DžZ>"~&)]5ij&Fzb*$ML)Dy?;f/%n^^CO}[^0* Le^zj ^Z8Ճ5؅&㒰u_$dIB,[ˌxf|' b33rQ5#a1dĒwtVDV@$m1 tGqOYtɓ <5/Asg9ߖm{չKddxyoI*u%sBR'wpG>IH4d= dSԴ=f&lgbً{Szyթ}xv͖RU9Lp;  aeǞ@7ɂ("GvKPMFKG+4VM׿|G^MU˞Jx̠R4"R咭k"˕1uge:ҮK'P@I l[+w{m^Y7D3 Lhfs"ggy=60B OKvaHc#/?4b{q6ѩ;^ƊGuO tH.a\ qXŵ"qٸuҵU$"ȉ5_mp֦i ,(&^(wk$vzIJ#=㼚 [Ͼ®MpiE#V0NÞȨaIcEsqGkd< =qw׃'Sbԫ0^Ϲ.z =)L&P6z1_ͧ^]{||CI D?r3Lm ְ4{COzW> {}~E @9`@hx& P`g6X+j.Z:+"/pn A7{QX d:t_&w`EÉ?Nbkk%#e5cb~ *r"Ay ,ȄZ^r-{g1`!j֒݀Ly qRi}'E7{zϻIs<)Ȋk)$b_`7{c1FS"İ!Y6 @њrŧ^3X Z_H=Q[a9.*+/Üx n BXQ`^f}X&n0ޟVs!`pS܁6;$+6.Xqq~"J7iV*;Ai~.䴜Cb\ /$ KQp)' FwJ]Y34p憩xLL>\LyoҶjX]TN7ۼz_^64ĩs+ N^E!{j (@Ep" `iOV uٔq``A7C@%wnݻ,\[vE(9~FxX _q(-B\1P2?+f_ihscVt2wbs)ç\;j ce2oX @%,>RXf?Uwbj.4F( ,.T|j)rR?izM˃tv 6=ϼ|𨸦=\h7% K7cHBd{GAِ|J[ۄ_S4z*ew+WG {$$_eRvG9jlXp^$6-؟z2|#++p 1ef+MF4B[vF:n1@Qԯ>rߝIwU#@ %=p&oBsչ 47`Y߳0سʹ[gN}`i]VjޫU?tQu2i'kG1Tt>< mDHt"j:K y mzwZa˫ӹ=osxδ]&њ h].[߳D<̯`Tq{i>` `#rF+޲1:h$1A`8F"uԈRp2AKV[Y]oUUUN(iRZnruRnT,c6I1sY| +-Y9ލN Z88Mc.^4p|у7x;=ø>x:bh%=C5u#~іpf㵶3[:L!mpxC.G ۿ3AP SŁMGn ":Z*X}Iԁ/$y+%(MJ0RDot<aVNJom5܈ {%xТlZйEl^_"slNCZ/El 6lr:}{)C:;݅zmCiwώ,)υ)ml1>pB,Q>zuokHzl& ֹ @>ƀ}Xq&<-" 9ryZFXĪO{=; %A}Yh&r9P!z?ow߹E5ծ9~ ˨_k%+/:k~:7_Ն쵐/CuӾU"mm#ZIFD<@Z@\w]WI8W`MD ZrUe0nIn ?-ƘSk!rG,ZX+)`=<5 *x+xpwȔXx.9~J3 mgxY3/Tq"<'huSj8Bmx$܆0<. h4 V_BGO<F]:*:NCf]ߖ4Ù"+9]:C *NyKw@4g ǝ$"OQ G d4+]%ċWcI4e"zߤ~f+$+&aZ|\I۴\٭#|(/i!Z+}gVk#/ZX |ms U: };}CA _ Q26Z;eԞ^01, `޳m@v L.rM^K}U3ˁ8jq@k쵸2.x, }^8"4ѬJGmZj;F 7_<& N\&Ak3 c {w ɗzhL%%G1fMP&_: cxe܀ZyTaq2@ӻc^>! /f,`u}7++ِm[5Q+,#`p32n #+Ad_"u\9x<҅D4@P3[[{Dמg7iݸN'+ aEl jhxc[h\ubGd⻙?V /0ڸ0tw-9!~{hpn?7:##)ZX﷚AYjw uG*K1Zq1x2w.!NF8S XGtk R7Ilw`R[<"MwG;6D;w>ASƓ`Yśv;?"Ye ezw~q?ZH'􄌳 _gĤpegV*}/1?'OZve|+UfA,+ c7H4*:cPKjtm~)}+=$"đpI'8`!2Xh-.3SboTIL0*ZlEK<0X`@ދ_(ɫ ,(!Abn@bN|r\8^E,ȡ\dqu$#^Sb).dӌhKD1=b "qovgQH@J 0KhF,T!K ruS²Ѹk>{<,*-1M17JϧSh7fĦP wʿH́ XY"K[g5i`?`|S/m+kCvT_Q*o6X..^9HƌA|k؞_Q};ſRwZ[|7y-%PR8Þd42!\Kd Z +hG0kê-bwF ;aX+V4>юc׿" ᭥v}:_tz@^pO7dj w@?Mw3齟V&mL BPl._D "Ax99Ȇg6,VyN%.bu䪟GʢqI OTQc`msN>"~Xi!֫\ec ><;̏ ˋ?l ȌG G#\CtIAO v84]tNC([Zjk-\"ue  )m7?;\?)`W.xiW8@8SN7aqAJGM"l<1Y%A3N`n4&8dqp9؅%wo#ʫIj&^4j;}v5^/y* gVXCWF#'` n>?%OJV#q=}Xm1 g07H&塵+ Sbq|%xft[<~SW_LzNw ;B^J9PRRlĭuwrgkZM[#=JTMkU8kٵm44;q; Rav=mֿUFTlHm h8_S*7E~ 8`9;%&p9sY{iC_ 6rE4cQ^,='U]̓qPq|  oN:.V:[R/ѓPGiCX&o}j7ysB>ޢJ] AILo Iɡ&3Ug, zkI0kFe!feN [!#IM:.GdLRtxvi(V.;h#;j=΅ZLz#l#| a† /ct+l&Uw[2lßNeRɒIvuy.!)aN ;Ye8+ޤ4~] KF]A-61^?N1srsJYb]fHU 0o=p.[;1'u]X%D:^ZQTĿCǷԆCgq+vU23}{OTzn8h^/Qn`O3SѪ=S&㷎o{oݡ{Z:E[6)eYM,ЍVSkh=l% q{)&K •ECyD/mC&68壉0*-zzh !Kx_ ]dHE¦pqxϘ2C)w)&r@{BHJfd D oV%F  Z!k:di2Dx0Uyyw[) C _@I[q7 eʶyԌà yfLɷ~\^+帰0:MJp<(b"0قOۘ[@\x(o3mzs8i@KJЉ|KiP|m Mh뵉>I>ŀCNlRko-v3ZPGnKr _ooGmZskS,\0%Œ`2Ɲ䫾 uQgՒ0 Ne/}4~~}c{Qf=#,j)=)-2XŃ|YL֏J$8{!jߘ㕾p?]*)WڀhB1o4r@ɑj XژSAQ3+W4)"2(Ȭ3m-"x%n(4l emUsvJej8Yf\MU4)%SG0q#T5 zg ;cYfd&րV`l.'rݑ5 r<ӓs5E$ .sX*ͫy氎8\{5< ށ,ڼkߒm:} I qĔ$Pt痵حS#a v=cwaEw{nmvp|v4ʇΒb  h_Dx\-ߌ PKs^W)!2*LEw:1zH8=rL'&JiG4 @1=w?wͰ =75#;fg֓HTw'߯0#44gIbWPݶJ`ӸEk҅zk<+͐ϼwc8-ߝGHʌ3`ʲA<ծ9 kײT6 $YQ䀷ۡ7psֳy(Vg &G[ݿ*42w\*Ǜl#h{Y&+(hRLp^JOHTNdlI28 K~eq. ş9Ӝ8 < JS*B4 |/Ok3hzq*rY5_2:8/}An-,rG9rOFi%.4<}mcx!4bcXB9[Ƭ)ba+N \$%h^JΓ\(PAkT0[on;{2ȍZo,kGz8H;H dtQ;8gqcy T:¿CCȻy?15'Pr%{5 W.L m5jRQ+W!lNF +I6dngQjubֲMAgl>)o N.gºy@/[!z8M>LK̦:Vӟ_`r{c{':#>8ux{Yvc藭1_v{fK+~MW p՘LrnF<7>k˭kPn"[ʤi}aLżt3S\$ϖ O$ *SfstЎ(u@KV P?i`)a"NXnvM 7XɊ9{+&ӂ!5C O4+"R>tB{\ۅyyE|>ܷ#.C@8>p8,hhO*93mu l= ƫxR&1㠀?YX cC褺ci*(Yŋl/1Q`SaC΅,7-_QzGf!VP؁ްXwLF Bfix\п8}D3`?PDcL͋aVe1˘2cU;Nw1@a4&h8H$""QYV3 *bߠD0ɟZ"ő"4ċ3R*oSLюvX tpidZApbz [> j0_n2)ef5Q}GCsKhj\îPI3'P@,2w^(%'{ TqT8.M5F7&Ǟ^raDa9脧._;tY  Î1n k  v+Hl3D q >\ypbLjR|%>:x@t8$% l'=i'_U'nM"ny-5ɰbe~lMPSxlʕ{AC}@v:W3Xi`*_`߾J= 4oV)XkJϧ깚*tHD]M5S)˲1߿--C (~ Q)Kw; m?`Q64 Jx}2/?&?Z] tθG9nyT|Zx-c(*EmZͬ:pS^-Iʹv) ^eb(dY 4ѰLfY "lSut&,(pr٭}RV)*C$*YvEqH{G},5tfxFUhEcHK/ov {!m| ^erC@:a\=ȂmJP$4 v#s*tvknMQ5Х%R6kEƀ%j 0K lB:R~8TޟCtt:nnwj;ReY}K~%l:42@ᆵےij۱ğ$ B.ʸ1mnSj!* :_?-U  ?g٦`072^nA c 8GPA %g>`|I%q?E,]8@SYD'fCaM!YX#QTMXg )Ko\?;srhv^wRw-ߩ!A/5|rWc/" 7/&NrY138SM;Wi-^EN 8Q#6$ wgޖjҽgY#mYR-4#Qo*si6e{heѩ2h1NG=/^2|VAi1I7v3a v]o\#9 L}5Q/=j(x(O 뿏ɶKu+fcilJcζÛCn{26e _7h 0P_ܬ+`wQMcՎ(TIc/;DT qEaxnsozPu t碍y+.7:A閊:#ʱd1BY"yyصBsaBrK:/,b g#֍HVuH}2F8b>~S:g <+ᬕLJpo#_KjP6!|A}́$p{q.ľ-?>OHM>Ղ*  q 7pijEI伊 }TmļzV5F8.Md1N]%}wYTCޯw )ۘJj+O0b 3/%=9 _iy9 fvwmukɏgޖ#t8JYaЌ_Gm5et1pLs-:Bv:T{s #x`5fT˿^b%u X=й{94APJAR={ Li%r-4L:TgWgƅpݵ'V9q w 8ڋQQӲUȥiǤ1v Oތ-v_O-Yp#@t7ōxZ z: E^k0Gj}:8ږWo_gn4(e}81cK4dzjTfPxfT)^A ]}Bm! RSB/exb^N)ZG6X gH`\oo_7(O_mpHױ{|m]ou۱n1bU*Mb#>xjko=Iمt>S 5P_!Kw)8@Q]mHa[+ R|ws/‰V50D"HÇ$s{qQ~o5kmA=! =FjpxUvϋՃTHgvUs>n4?pxOy[+HHH2<*N>Dxw\XN캨Y+PN#9ٞB}3+-YE@o|sRպ0*ќ. *!wG7.ZQ!43 oJ"#ؼnE$R )46 S^j!w_k͖Z(C2ݳ2M:cD &&W9n_uv(öU (ZdmeuO`#iH_9N&W PSpԅ Iq1 3Ld 25C8,LR RrRނ 0/cl6vi 0laD*ςVcbz|(s󶾶길7 ,K^P԰o^t lR!!]uk5s%L7?bfgUks]-|N5\} iDmf(7'oSFi>r@"Eb3Ov:JJ7E|LJͶh1B? [& 閭΢$]#梲]8ŝC1J Ē } +E i}=En2-9s BȐfACb yuNx|T*lfwS$#+}|6E@.pfHn&p$oL2TSѕwSy>Π!L4ܾoH3{vxK{ؽvH j\zG<A2 JY)2{!j+GmȣTfGM O6S郐X24N_\dz1;z=@)q |3gi|g$ I63uHjz>R|3܉-z.cߚtfܴ(hddŶb h-lמRv@,~ xLxPT83hP۲2~k|xk[)!{d 8jl[ <8. eg#ܦ`ci`M6c }3m1;l4ן2c:p;om.=E>Fa(\%<;fnm.lKԌ^M1܊/ = U]% .5BKVC;bՖq70 K¦d;XtY\: h5fFryb%α>@H x=`8B.uqxtM-+moݥ phX$m͔yNbVHe`;[H #mǴⲸ΄u`cľ%=!wh{ᛞq6/>~ۼ]~*8y- .s94gLuH3ձsqKrC&s1 S ,M'IA{v[mѢm5 lI< dpgs.D>qC(g3&FbQ]wG{']̬"j%ɱ'4yaˋC w6W82LJMn?/ /W[}_1bK4X;VH.Pi(UBg&,"7/vw}v]XPޝ-r~Zf, +FI"# w,ԯ䍎~Cu{uC@,B?y+LGǻ]|zcii%Ui䒊. [3v럔D׋x%{% v5bOWV"^pAƷ-pf~_Ravq^)XF*CQE!q40{ 2Ujp%vG6wHDnu/j*_xt,~Dk@qH8U6$J\zt?+A !fAMfe`ZR 1=zPZe >Zi+..(lBڸߊ#qK?#T %ن>6.{y]\GW}{-8r{iŞۧa}#թo|||z~&]h!x/eV6ʤ|M*|ǩw2:.]* *mXP{T hj&֯9ZOKE15*r/R_2Tdžz$æ'q wYLNLJQUb!X! ~zD,rgwsԃPqI_6Z|zt\!MyY=h?:_5U9ȕIכ,KF8^JdɦD!F~K\bp-ytEg$w-51taԻ9 (DT*!d+GW%ކO:$ݫ8?L:/s8A+u+ $)*u).s_3t.Fzcq֋9gxewPqnwK8[BCU1BuPqyMϪ6@Kn8tBV3f`]gE|Ux4ೡBn"3 yƳOTgStX]M_ ˲T7V/X8I욒rq.up8(޲=ڞh7,#CcFq'I2M*֊D~LW@ kĦ Ȕީt%5AlJ[n'L N4{D'F٘U, Lצ|$=Lq ̼8o nd-1- AQǸB9 dsƏrAa{yFQ\3&  ط< & V;"KמЦ*+``GC44<:T-D~򇜮&GC Kp\gp}y<:`i?dz[]Y%Q4y- &jY•Ÿ5>k\p3*^_/mv!n:0&y~f?oNFDAX \}/כTK %?nJvfv+eG^41mW$c!QQ|zI=>$w :_K#|H.!(`-2ƣ<3HL\BKپpj򈒮ҁS!"5}3Ap\_=Dl_ |J~k8Z`W-؊{cÜ({>9iQX}6qͤH.ɰ0 i52kdk?2Nl}F5QR!Zd҈}v l,ۊ! 'uXiuRm<#QdM@?d^?NV~JH/IIp躒i|$}י+]zpBC<,nl"< ;_tٻxX+Hެ0WApo[|Y*Vmj`'; 9C`ꥉzF~#wE4WZfS1A=ؗGLL2aǒ KƄXqAK%ۥHPaXS)U/_E(B90@ b62sTc%F!lCyz3|%Iqy ۡ[qkga 1N|a4SYy1i1$;k侼Id֨>BÝv;&Հ|ֱ CgWTjaM㨺Syͤ]b 2"L,ԖOV̻e;%=1Gc hhU_+!idWj.j GQ=;yx@T7;.R8#oMy~o,?nj/ !qȒ17.*Yx)b:7sv>aIbDu`A,fΜmxCF,e+>ݓ(J^GA2#CM,8I1PjK 嫞 g%-*+Le2>@? &s ݿqYuP"he PN%Irv*İ4IWEr I> 8.ccB';?Z|`cuOaNZ3\hpqcB2G(<6/KլJQݥ@:>nP}[&YJ$b^Z;X*c%XUjBhPm#NYݱq*30c,Gx(ڂ\ w <̪R?Tط6fV2'D(ܤhNU3+dv~jfj-_τ!- *_~-x`y6́ѨaIS !}oc#ֳ,T7IrlHSuտ_<^m4`R|]!S/YF #U]pm)tGfdVD*W5pya:߿ l!ySCj#b59~o!ī؆=Hr?Oز{Ej%MNWdj{)6(a '<0\XJR ;[m^&Ɨ;m.}NtYhVlMh }$c6[J20ԑrMo/831sn$[~{j: /%N8 EliZ~C%]+X,? ]͡XO iݍBg`I+ {"Tau߶B1e[gQNeH̍>@Cb[|ٟ#ė)SV/Gx)\_ SVnYcni6M숊3C0oz2?6wN+>,Kj]EkhHOdQaPZIjVW,t[8R3™2X|L gKСFaPu$&LXJ=CvXsEoY <2 Pe7&6۫`~|̓1dWC(]o#/ѦpͣKSK >3o5jw 1iLMHЌLEr3>oœ&?N;,{-? +,)|-f>,o׎v)!Ӑhle'q ưЖxjs59 h(y(. t3:mg0m`(H HHJ+(2 2j\Q3'Ęd#)޴OuaT;;|ҨT8k@x5tbvՀ@ƉZ|:Nk,0x&atB .%V5 K, ٸ S'5]ܵzb\^ɑ#8>h9 P,EH ޿9x]7=bxB{_ ʅΒj mZZ_ťP[SJ$V[p.72dK}9H#%_7QZϘ+36W"ߧEZ8y)3"r`o.Id6!cՃ$VUdrad֓PD؄h3LسUQoW+c&CϵS㬦HdX}*=/wNrE7N+0ۚAY{+So'p@E]^N+ gBڝI56.\ 6Rp-44AETu(`֞ dȥ!27;pLy sؔE8.W:ozkow(u,OC;5~|qk"]n|{tcTBJ /ּm vB@'iBNW:K]ǀĞM PƫXcc5;@BNCp&ض1{`IJ'#?u~/ cB .V+ zYcwr3d:3dtA6R ɦlot lڏN:tǸvF6H @tV )*XzqcJDʯ«3'C\6A[$fXu#c;:[J}F_'L@t4sLH8Ql:fO]Mcf@3Dd9Q q9AHUi2DnZ$QPVɪ^ocZ&pP]2aq']T]ԁKQ 1]=!IߟoHnvF`1=-N hMqğm+nW,2[nd^ YN,.'" vߌf9vAg6PY}샹!P+gȴ63-#@D垘[HϮCh 14rJe\=Uf/XH!J%QŇ$Ҟ ̋w.n$en+BZaL 1ɶ-4Wo])cu~ѱ%ʥt'%%y O'GS-^h}b 5j,4BC[ähz_%EJ3a-߲:=@؊ YY3z?z?oʹ]\{T%? \NUE@\!Յ#މ\HAe !.#k9..BTLMeg0{qYACMwB?RT ~3ʤq " K O.pN?"vk΋<[ǃ!HBł'RP-,:msRPքNUk|ř5ʂQ T АMa`\AĎbGc>β:@y S}*hM-y 8}YO1m~0zmm q>913],m\P{$f=TnkH[u;HSL\6sʹUTѩG&&Y` 3A` J"-Ћq$(B6[,[pMv} U5ݧOj**xϞEI%ֶ'F̌PG+gL<|C0*u,k*.obqVZ|Q0t lEX`fBr1R(^sX rtIf< "׃KϿv)'O,3׍" Rf#vL$|/e:}u§-6,B.5޲-]J e{+7yng08\ǭK\XX~bG]{Y!|N>\>=eZց5U 捸> (%7I-N.fO^Νh=g>kP2HEs udczԎ@shnT,b w,h-gܛl8 /-إKZE0Ij="cI4#+"{=WcP]B#Wi'V2 ׏Hg+. Wi |g".B EݐZV"$^ ;W"X_1bo9j~DSߏR#3pdpˋ* OleU6CV;~W] Zh sq/4vnfp:N$R{(OA+*1@-aMt6oߛC8_k^~wexWFܡk)Ϛ,)03U#1I cp0pQH#O7 ݙwWT- xTKWVLasBSM}E%MK*̄},/jxSK8ZD>-s3K^yk㾬+*-Zڹ7W:A2X }TlˡE=%EF%"|du-~>oZ݄\ӧ%RxBoPh5{h0Es!_~ w@ $;`̠w3tAy6E9W\pkS׃I1FF# s8UY r֨Ga<&#9z̤'Vk܏l-b:$?Pq6daB+CKIdA?4hIQb58M@]9 Q'Ѫ;ՙLoPP2^ɯvX'4Ra t@%>CXFJp3nNa7D=[l8f 4Z[3X*l,>"1<&9N+m=]sQ p}i ;ʚ dAZ%ˉFrXhwb@AT5Hre|Aч%0zZT橩|U]KDɏhDש6PacJqEB3I0<ܹ#^e/<\+xߺͰtRGBm@C2RJiq+_SQtaA9uE<tuM8NNb3^]K|IYkaӬ&ήh֫FyXj=[4Pz D' s :Huԑ` Ny)].q( =mPdΗ#;_C!3 0*E#^/-IO*fA!Zh\x>n)e&D0i>&;9忉za_2}>| @37B8@2 ޼μ$$cKl9/A2 ;’>.|xLpӊg{'J ΟXzeڌ + lUɁ1}mE9C3P]pë`wH/'_h ] &nuT[L^Ev $Q4u?t M/=^B+/Ij -ۅ`@4@1Nq-_Wkuj0!J#h~Wy3=ʘw/EE *8xRC uV.}#R[Vj֯M'䇷7N-W}&xZC\Hf_?|)Ύc顣ˏMEQK#\=qW&Ke)i6.C"^eZU`-t66J'8 b#q뗬X Aܯ!"bnI=żGYrM]Eoe 2DQ5ךvU|p*1+%9d-sZˢד^c}%)QޠČ-/mf^uSt`DǨ.(W LQ4A ])b` -˶IvM4nvF  S>*RZ- obku6= 6pi1ǢW凼6pnBrrBtNzIeAi̙<"(;cm2V2*_٥aÁ4-vJͿ[FRO&.K !'z<q!^~^bš{QRetodb|™uAR`Aa*m!KMfi)*wrԼ Vv~?@ X3ЩHv'=٬+E̘F9xJnphZb #>he /zm#/tPaZ `^. J3}/xE1nLLpEVz&D y{(pjwR=~Q9wP/>| wZupxBѼ#^txZ*ۥ0CK5@gtS a8z +C&6YC|};QN.Sn snP@hnOm+zbGޯ*,KHֈb4Aڼjm~Y} GO؝g+zbƞw' q''{L[=L6ɶiܩI5#҄FfF͑m$9LGK~[^ [95yov\ Iot\oB hУqˑRg# /yE; &Ibda/@CpZl{[aSҔ)KgF+wս+I [H2S'L18-.œ <64)‚ېEfF@ҟjV6Ltst?YEh?D;lm~@YwSq}AQeN :ur]isyJoJv' UKS)ڹwo*)|b]vĦ>j&$TwWavk[IBUgnfb^1Ƿ\yAs>zB/mvF@mÆ#`F=:jJ.uhPX .pHZoEl_ͮP3@3@:NYtIY7eRB(.Q%muW0'̴tħÃ/XBfYG tUsOkN>B4yxkX @j4 /( 8ڇ4u KHkfYw\86]vUDá4Tt#]gkz(ox<[Uczxg )5[+:ekqlIP>M pkZ.p\?٧@;Gz(Ip49k`s;]Rf3Q `L>sm3wC:4:~BOB/3rN2@^b')ODZwuk`FiKp Fej4mF:gь,ׯ#جtunAʘD,Wv^vH쫂9df'^ĢZyLn&}#LN;-KP56=9+Vg! =5n ]&Y`j/qyT1*z3y? >qϴɶ@@h@n9<$-q0,`!b*˄p52!:tC8Z=! ^2`C@96c^C/]O0l;+,gJƢX'<ӍAZ` &FF5=g5uLKVjyQPFA{!R4C_SJC%aɀoWB!;uy95jev܇-h&8O,5i~SdY7:w5iM;~sn(zœP0_ JJz JvZS1]oP@\IQLz 62I֧grI`DyN4c-judЖp(Nye셭sng-޸yI5^(o^5 )19 ΄e)o"CVKV`37B}~O/Z@p#6y dT"UJ>1+'% ^&.g^~/,]JPʟQ^Wp^B<2\:R\ul.GvMa M,O,:%/{9cȴ3u}z?*/ڈWo=U󡅤A[H%bM^_oD2_Km 4~Wje t߷J? z#txcE>*;6CEL起RHv]`pBEcY׫|3VՊwyI 1[RT4,;ބ @IN//="mb!k 潁Q@0S:X|B앓`wK;1~o;tZ3 -9Le=)'<)!5S ig̲ʶGb_Jj?/_q9 ^Ԩ?rp '#&}T J2 a<'*#)Ojk3`SΨbI۝i,ZŨ}mI0uwrQXb~ b|zp|&K;E ^J* >rq.;K̸cbpQߒ/CM<+-*UѠЀ5_k1]G"֓9]|L2nM)z6^|Y.>a}Qݭ*˂]e "l7_ܞ680=^|x\D;~3Kʃw,Inw)ZUo/U;F/a<4U\y`"u=imG>TT Rg.B6FY&N a7;\S{n4UƱkhy V] +gC w/QN!B7ԉ C򝜎̂T @$UjS,Z_#{^=7w x+#f#lO o,xNО/v􈒒sgp>5Łz> KE;Lvfг8p@ RdK2s da>}MBۯcWlUu|'Q UB%ߖ!ɩ&ТPƣkC98|S6pբHlvH fzo:PGB725 Ba3sTK|ģpobqg zn8HOa^~u3Z:+d>o ʖcgj5*w!]Ď#Qxw}"ܲ/`'g06  s۲jVr(Ѭ),aT)ùbg6^}͐TyY} ;iV:UO8 R/DG:;oJ#[я# :+ힰ*`_5Rpj%竬ȚXb[eA\l7|-(2OvG1+ 3GC3OPJzI6Cū2p)%44jf `UK"G[ ~S`%NդNUrᣯCAy4%[e蘆/]fc28Y[ڀ#s_(BJTTFB888f8܂ṉG %onQ1\źRBЁ:)w&5|Oi#Ila+)ctS:Z!pT gm|4O:q9hL][2~bZ ɎMR ^$iƗ *a9\j U֯&OKlN׌ ~$'M fRp)bE[#QqgCBVlhC_֔f,Y*`ʬ9}'c"P:k2UăCvaBǗ. [z{B{jx ,K*蚾5H4+3Q/2DC L e!?.m \VY,Hy lIO^8ڽƷCV6QL^No]6rSg|aun)5?PVC2 ;(4|vI3Gc@7DŽF̓YH~ z#.BɁK?&X)u\.\%3 a`C8ȸRa~"+ܟēxÍHpqԍ]q4DC(S CH@. +Y5Q޴m`x߲D7H*-R[.zZqŮ3N'Dp'>Pņ4r=ϊN5= 뻪|53ë́s̴ C R?./ dZV\Z1cKwOka؋`e~eB VʛuT\LR# ×& c.}fY𠿘z(>l@h[t֍H>ljw;}z^טVͫRB(F:20y6 <;(~ 7x9h))A+h6> , {zH= F P  )#kܣ,(oM/ȅ#rGt %v#$Gϼ(i<*,D$p#.2=fʵ7\XLFX4TI㥝SbTs%~"|Pr5 +YC`LPzDKZ5LnLEPp]]O) OB`[D/ 5"s2(}vv]@W e1W& HO6\4GYn)U\:R͡1I>ĒM(\Njp(\*)@ iRAɷq(IrJ,'R&߷3v(x c 5/aBb|ITx4HҲ[A'7$K$snRׅU/^NfX8"5D 1"÷X=Y58$# &'rfa'& I8 }=7q̨`ܦ;Ex+X]'II*BV~`h?ULxڧ9] % ۶C>:> oܹU s7g܋E('m>y$57FuL x@),0-4$ FAϋZQUUPjIh l|Kr;ԸA&P ,oƀ+"jWjqu/RԴ ./ySRމNNlkRwZ6> y{ninu,ÈL-vNGBp~ HnJەؤ >:TkU/{R8c~.? ;3p.t11z  ,ܨR>W"ob<*~d}^q6\#(ךuTS41բ-e-BD%hKN \U,} ,6!oFgT)Gܳ[ҲnCR1ld !bb@S;{YN^'m]:~мs߷ mid;Ttuhk aw|y}hr¯`keba=t %յYMh lX?h*I3@ߔG,/kl83|VX9G~XKsgY0\7b/2n 9 ƹ|}%Mx>>ZcW7bdo*^Nڍ:k74ݏ=>$pa~#)&Vg.MTz'{1O 9ShR΁ U]^oH0WdjWaLy`ڥz09Z;V槹? 5ib*wJ3|k-Koe;?$ \<|NvsӰlUѣ }zzLAZ `w@c*0_Z2[Nba?vz3;k!$ÛxVB* ^Ыi`qi'~Ǩ}ϋHIFZxi\dduǰB|KQ`Ck"D{HcjY}`H$2UzF$ٝ/}?iF4O9YG?,ۂM,QH3d=@ZWhJ٫n;ƕ~W>C=YKoLVf2d Lo / AV-G9euPNg&0荕cmx%P5076TRiU3i|~R`@8q#fc~[-Nv.1+7\Hc dXWB)*ҮaY k+}džmfZC*aTq-sU"{$Kc_bnubL)HB{ l.s\R$z.jzDd5UڮܳK|I6U8B+p_]~ł,p&:]zՐ\:@~qLm1%VSw(ǠftNb) qxiAZ!rG{WU_BI sթ'gz̡`RO!@[I^ fY ۘb=_c B;’uTVNF&2x k6~()s׍ѓ, U|#܉-T+Kj _\. )Ze`ɥ,/`0NE:w@#%[Q]K6Èy'\ zIo[kL&) ]!]w<<4qAd糝:~lQl .!Ł0/nG,!ܺ lv&w@l=tT>ƅPYKߴj]MVSGR!?hߴMI(Ey*}G_p{"!w*`I@G} _M#AH )"ıK~'HP˵wCf唣Iґ*#T |mbO5=e^rT'Kr.}=潙e4Gë7V ϡv+V 9-OsF| !R"f)BbP*ӯ.Q65Υrڤ`ZtKqMuȆ0KrQtgy<8.k½6RoJ!WfяNAp7 Syh7㋿pZV>B(ה6EpoN?W_MP)S :QPC"^jh٨9GSff A $q#527yV" 39]X6CsO&XkQX-Z؂胐 1[D"߹qU/ײ.s[xؒA^qp͈[{&RV˲/DLjݱ.hݟvzxd?ں9|Y>jY\gI3ё.0PHl}掷6dw憁6Aia+ݨQQN~yԗƩnp¶w@{쳈ga9N0"{Icm0^M}*(aZYqR-FwTU>q7R S.#ZaOUWI9V[aE~3j|-p A6!+%,&Bt`$Euo9YCNTLFgX=]3QCs?4NWL9h"]:bMsm(^K$ZA7B b-~pIU@"cY)KʡPh%hY#Tp62' ߰a ;w})u185iRϰ{=BgOA@ u>O!^,tvi WٯjP:sE-qǫꥸ ]B`QCb T`RB]b(Mw=M  v1@ BIyIQHfDl_@X\]-gT]m*/C)ݟ%IHVvB?b1*yz<5rDt,&Ԛ ˋAF*0<_ر4TCI0.Pm{ތaC6kƬG>cdY8eyD]C㌲kčПֹ pii-C qUX%PL?mӴ_TbUTZo?C)EouᾍT)qN=܆q-arolo?vI@үkx9hTkdPP"X {}oZLrөS)Ќu> ljonuR2*^|2 ] $HJ>gъmgĐ~s,$Q@;OjVm@wQ"gd`KH{t%>T_n%ASKH C*X?%9$q6H'Z`yv@np#w  >WlKK|*b"~( yֆզɔ4$w,R-D˿ n5v.9`yW ,A8q;=xw$(;Ň\GUƷgD2cz +xwP+1ccHV7I0x:i~w'[Y&|D[*t,Y/{V7@KMѦ+Kr}cHfcܰyuDڍ|E"[ZbnX/ {{2_$yJzBbhёȲ9zWkۉ+ģׄE(41%ეr@%~l6`_b~(ח[J@hཿz1[1.xCHQv ;&#VXqy6t>׾odk +#_RrP: R:$kbpVkʺG*݄MNAHc=j`ZLʶ(k*hϺ/&xY !|v!rp+„02SY}I540'W,cj)5 |Yn[`͡|+<߄"|+BJ|S-(Dfqg-\HUb8oo!ۡhw]ڔ9ꔺil*w">5r¼h=dݖ4{C bڜu[-K]e_5~X/r%<Ο&4ѵ묘B aOAu[J%τwϿ}rحI# e]o*ե04N B)nohI:?V8Y:y7 "A̦qg}ʋl}f &xWT}7ժAdwǿ)sA 1K8"zy]@W!Us|LSY%v-! *me ИJfΊB2w[G(oNYawE$5dc `Q䬓O\pY0'`!QA[nn/ҹ?hLV #5x)^]*yh(> 7CXIib3v!udqXz_?9bܻ'}J % F*aF| ,"aMK5V\hs0)_#$XY*uècAjB4߲r${zy|6y|5`BKcǜZ, H9éM.bWmrOoґePq+Ɏ50Thcg`6D` xumk}L,nh\%9Z9[$L1kx](/^4|NH'S,Yelh+>im`8L(wpx>?E5Ods%% ʸs$؛pDڗ&Ak݄H8Lzs>nsPtg  @aa<{Ykh&Y8pm2@~n?-GmDPx&C<ڔG JFlq|]=dhu8?.[3^ɱ|֙ |=f3N0ƫ47ѽ2 r\Er`mz”ƶygɕ\ӣ4U/]@ njtfIzIYV >Na`;K7"r3Mpo@*']JxP/nM[t0?] ^o)F܊ysl5Qד!nwsK막6ƠZʉKݬ6 USa b}X_ y. Jx],|>,E d 0D7{Cֱ QqeU|t9v9g8,g^B)a m=Z)I[~RlWc3+YgF1sPbP\:uB$!7&NU'OvjUUZ)s(vKk?>ڿ=x1CjQ=x=nwQt4_M0?+#7z< Rw٬|ߘk. h@o*UKJa BN#TAAQ4 m>ۙ4v1x#B{ `nZ+bm?o#lr/bƦQ]'y}EI%I+[Q;n&GA*;>NT(c=}Hu5ΏV*w'_)@&4Cu%WoFhu`S{y^o|[ :SG WcW֔e>$eMN)</H z4 RH@" G]ɑ%YtT"ʿl~~n4P%< J4eCH&.j $08>%įPPV:1]ʆOI!+B ,n^6c]S-zɦr5.v%q Y6רE=7 F=@&b5poo@ԎmODVB_J!򷀰@ d+H{j0[tRޣ=-ll _7q"keڸ ͑WrV^ˁ#dUd>q9D287HPPzپbJ { 5ߨo8Hn&y̳ďrb=5"q'~0*{W1f˦' 2ūssxrAdQ0Y,9̤hR!i[B%6!\ap\;\EQ΀ 6r դc[-Sѽe 5!*xB,buA2KjÉY N߶R% -XfTǺdwk[wvDWTY7uo;Gjq>ToHpdΗUiPܻYzf""@Z 6eUс'xY 3kzZ牟7BC oIa0rAOQ#RC;,,:$Mt:CI*wp07aB"BAD4NDE$9c SFV(>Z&m6Y;ˋTJdr=J[?jgYc73J/b|B>F7,pl "o<7%}MwwAzVgfΔ{雚\_+IfK]3b!&0L|.ZW \*!{]ȿ[kz_rp$_, m2DDﳸ'nH _5g]Cumc_Bq e h%LDĻ}QK>1) 3 4*5G1=d)p.Iˣu$sAd1wE}8 <i\7궀Ƕi)advcs=c`\ie?c3io DӫÔwRF`N[v O<«ƩyKr^ rOk}Vxb)S -/XFY!v!rVЧ?|; ,96DMJJ^$q$힪3F(Ke*-'v,'6*ޫu"#o_әgX $X~ xQC#-{//Ձ·p;ۣV҇26씧gkhWB~yIB,b]`4nEOQnEvie%W3` ]L#_ .G?x]$1v^>;AX Hd%wK*z0m͝²qnexS?ma3xrP1+ z/{E,ԌmTF 5= 17?"qU6w4_档Ī-Be3j64P$#_)gd K+"'BFJ1^lS0Xִ hBضvITd;zM8(S( |르<9-( 5_K:ηW3k8n|Ŗr9tt纤UnV J坚}]ߞ8sEGW 8kH7tA 6zv؅xh>дKQ`a k' a=돠kc'fYkz?8:5\%}BӋ)„,aߖO9*]=aK'p2sjWrfNϥ}CskZ4JRՀ{-6FQ4`|SfALc觙3[#(ͳTi+hόo2c# pb3e5UF8W.NY:EL@=Fu~$F(/ $J drb:[A aGkuYMq&ʁCI *ɖ+[a>xXr+{j9B8Xa]AaBMfR#gˇ? ;7c As7K=EU <"88̤_>Ԫ:[HKT~q++W󕪔3΢򌌅{\ sZ7bAYV^>yALit2*iy9Ǫ`tRwCMϣBz\UeO2M=ou#UG\cU@i3v kG2=0¼uo \5[/22XIJGp i\6E~LYBմ-ygY<>55f^{ !k9<^u@(:Аw5Xgz΅]Pl9啟8l\o\$W1[Ikѕ酐:F TB`ɼjT-(?Nq|EUǮN(BJ&Lm/A; jYU  E#?.I} ,*`кkV0o֐?$f^z2+aok|Jfљ8gef|q#pҟ>C}ǬܟLx6ᢹƌwtZZ@GDKC7oglBo6`)ƢQ4_Qvgf޻J\wMS#z2^!**RkŠө(&V]$v{eUPbvdkM8,zU2,rH98xI#5!>Q!>HxMɪ fL$.]-.TF_p\HuAW#8%9벝;`"bPpy{x'o_whW&f_jwhB+{ެpN'X欦7cGFZe Sb9yL[04hYtqS 2;_м) b0-^$ g1;[ %J&Ρ W6ƛ<\by/Rc'їX2*pJ׌[QrZ{E8E&אdw i ãz^Y0nqw $4]G-f@u(?=MM,CI0L}7 F!p%eNe%7ۙf&"ݷ (|x- $סQw^~v/BJz/^"zws{M&?&" Wd~'ı~׃hJx8J)3OITxrgQ~A{0VX j6%[TĄLzs3V=z֒՘iS`,x,^y,`'5^]Nѯfcv+VU+hkx ZǺc I_jG;Jj5K#סXlΰF5?=ЋTqb` )p0K=߂[54dXw+$Bz }G2OOիHlD_Lzق"ipt vKcj~6>ړ< ј^"*{`NRt7OXBWd~Fo+XD+ܰ'n Oݴa*snk:,̖ _IX&e&ȭYU=#u &ň3ps"XUpH|'ÕreY#fp Iv% ,D?[ j j}حִyMme 6@^CSh:Wҩsv7u yh vo]zģMΎNSZ#w#YKnΤt v/ Jq24X3u oQ) Lm J)JW36ؗ9(D ͺQ/3l>m=@ŽګTTUP%Bf߱K["Vff\@Uro!$a$SpV;PRǂi篙m(jkGto|0]+; g{=f! ?/4*-(HAS%`80|A:-E O!+>,DhӬj1}><$p *;n)}>{ڹlV؍*D~YT@aq?hƮ#&lŒ8Vp 'ڱ'yފy$]-҄(rR2(:v k b+$DJ;҃ A dDBeCuI Cu.Y>}-4`L)\ HdWTuVc;:xƖ>ud)Yy!eyx/:fk~"J;kx?p &g@K4Д{:kS'_'/6'0uAƙC]%|ff"Lx~F PU% Ӈj0RaME3@ y1qr؆jF6a)NlrrgmP Et 21 ,UR/ټqrS~ٷ'9QCY\yu蟲'T]ќUp7?9<\se"7Z|MAf[&Xkg7Ejcv1bzR`}eԬ`[ɥ~sd[f}6H&{Qf[|8J@^TNHޅԟ,9l6T>^S G.BTCEڲΟ4<akLrzx 쪟ǻOͲFn8P?ɢg) ~PYd8k4zec#pzPßdXeqؒW9%/meQRwGdH$B2eH TH>;@ċ?wgGt( /*~ '^C}jiݍy@ $V V/>'@ՌmlDӇkBCǟ>2IZP侫ADclP3$.:@tyT~-1Od.6[7 JϬ]]) |kAq_no/3,[he vPkjvl2sD9K|16T(Zk].RgLZPjخ ߚJIn hQjR`6NgGcg&]N@I+kJI:L.$1S R0fzq0Ǯ\aS<6t8C/2v&x Jq1+jD++E~5_|Ν.B+MٟsXsE,'tu(J _cF}塻U.k\ęoDۅT;bu#f@b5%Z2Q2?5r"O\.~ۖqkN/~![` i : !Yf8ZX8 |uO⻙N38vq9Tvց/`3shL _07GM~%4n ͧҶN{& |h:RD6Atnj^0 VIoړLLZߥ%1i׬/3**mE27臶[S{K )NSE/Y~(@Jb]2IBP}s!7:T6ߒa/Xq'McFdz,$AҒo4 )}$\|6 .C@)AiaW$ь v(?j7z C]iT4e=XP\$7v ~H(P0'|ؖKb({V0ؤ֧\viJة;_G4(߳7b=_[o@d"t2CphM hpQp PGMC/ t1# (p_<$0j<:}U}Wv9u BcwLɱ%R*0`ZദPi:GRɘmC8lޞ@ruв_c6O)lܝ٤l P@ذMg5OGN蓰ty`MoRx:>RP)]‡RU}5`M?+HTZQ[.Eك $V/Ը3 *!dؿf@ۼ_XX|ϋ.5|zN a긾j7[R:&xGV Nx3tp6Qe-RШ?ؿTzl&Fm o啜:dL ja)ԝXWɖ>na;=]fY $y\N߁Jp@qFcxt|ˢ!T$y{b~(Pٙ3Wy%#\Y-nt":8W&SKj 9^w_ɲkY'sD "Gl:FNvxm\054hkjHC-TT ]M^reD#:oGnZz' AyZ9r̹ۊ(PV R#7+cE2_,xN\]Ca(Wv[$Qw.Qg#$1.6,Xٖm3}{=nSZ(lf`5Dcv1|@  vvq} )veޞڂ\Qļo3. fo5XFr,\? :]c>˅c25=a| +-3ȂB;Ts_{0 YaQ~=RU6l2riSep_`]%P%2u-Dڪ' KCwyNhϝި}Sp&'d򙅾 IPMQкq۬`2 >M68ЂO /J.4 jV @L2ko㽍=@~Uޗ\&ߦ%7&@9vh6  MGdocoKPEТ$,i ٕX11'aeB25UZ.^Gk,UmUGDG"a&K dB)BKfKI\9㤌D6Tֵ%3U%eH8hσ$sAhCYMgghDIu_|]@:6צtVd%!KSвKrMOQ`Ar5<:1nq':K:DM樭X[Osm8bM"*|YD~Ŷ G#Vf"&x4 j}Qk PplX05CQt%i{%e)[Ū]tl9AN=&(%Spwx({+StaekȵWß 0{ =Vs+YhSfۼ /Tw1N$SsBc!b0,lK@˝|h -mmg_&(>,uѼG[Z+E|a6O=ު>0hN V lY.E[ʅPann!ʸ$Q8 UṚ6 D6bh[RZkI}*F{z(Veيmm>RjCwo!r kl dL.Xر3"lqxd+ҬAI}øH-}ϗl L($*^%t#.4ڀ;kYrB'.,cK;QC4JjRaӛ6udTH?&0Ti7HAf%C'Vnwٗwv1E:Y=:r2oURZf&@ mAеÂA"e(&{,YWUT67AJ<,'x 6BA5FWgp?29 zms9y_ȃx3jfDAgнl؄v3F7kU :䨟nP8MQtm+rfaŲՠL-l?xӠN[H a5FDd<ĦVo/d@ ؈6t xzTx%1VnP[Pı3ew]u_[,I=P8QiKؕKH6(0@ Ch{'24/VWGbH՚u : N6T,iwDKՂCs%3Ebn^j:|R hDΈG\&싋0@AEߧ\>I2ĽݹTGVzUD1!%Vܢ#;9$Xgѷu&kXJ?&γ]aöO>UQgLKؗI8 ]NmU wi !_Eŕ.`=*iH+/.Rv'{]LM EeŐtHtÒ,\٫=rQP= 7ɽ7_."ϑKF;q叅_׶s/"TU=(q>xwʧiO^c", uZ˛9D :Kw"sfqJ4pNܩ9=FH L8UM̻Z74%vş[/BC>:}vl$LtN<}FhJ֦X`P˕O 3Z>E2f2Y˥f¢6LKx? xR=JYYZxROѣ<y_m:நotL KZcyQ!.jp0SitbM_E#_vPm? +SdxìeNIy񍋳D[BneeT9l;JKa>V=v6O#qGfo}IC5DVI(7r= 5)`qV\_IHjJ{c̻pWلhgۏ:>]+lR$xN;C.{ǧM3q.V)WK3A,7bX3Tq-F/AU>rjij'zTL^%OMb5a׶FU#bh~5+l.pmL 4bhdyP~^M+.>FcIÒR& 0М^9cO[5\qSE,tlkl1@pv޺W_[# SdLr|nsT'WCzGY7l%MYY}R݂|8 #̢K6Rx7K[*t+¦WLn) 琵i= &PRUfßl7x6I=K >s17 f~|拰S85Ak`>EiW>6|FG>@?=BT"3'o `LݼDZ+ ;\1i@nj'g5w|~/U}F,|JAQh`Q*wT8*5QOl%޺)݆IW&TX-|;Ġ9~'>VV PM%n#KjW/M1-U s\]?sMxA#dsMo\&of^hŞS00 غdG̙xIƞ@;$*oA0"GaYzfc4B K /EBr'YZhɫxDLq}WY+;_Pd}[kYEd\|FFs:*MO)M3zY< dtJDu?67?OGJ#/FsC\WyJ}Du3pjdVI%4R0NvZsÛqB鏞@\xUήԊplO[E%czf9U.Y]{UiIqd~1~G\\j? k3ݤK4 ]9w, k$@=whq"F4qQ6aĉ 3f"Q5QbRdOi^ z!6e,}Vf)صE JYwA:W]E~E7)?Mkarıl7WWYSE~`,W"_]~1Ow(ʱhr㣢'=xS vn*K7,۸TsڪQP :V$NIb$J9x-J`<l!6JU su g+2;\=bp˟Cf{%_%W{%o&7߲DP$as⏐7:?}|6N]R,gU4D,&@vxR鱆9c@ 0WB!KkŊ1$-3ÍɐoJ׮0Uc)7~y)6-AѣyaA z`K:Kw!{;5Aϓ<tFX`Zն$y,_Vڍe # *GVwq}[]񃄪0:29i=:({XM Zsq>}[%_}UvP 0T\~JaqpIUQFO#}c)B{e2Xh >hV|vɔFoT5TđƳÃYOPM!ИQiJq(gX<YMF[ GH丨cqoi}'K~e/  *,BݓNƂ%Rp - x}ǾG(3kx>aQZ)ߍO~/1$ڣu:Y>Y7m$qHW\nRB Ú&?KDF^ G4޻<VJH6AEJh:K[KHmM" {TrcChSۢvv !;#F&AU״ʴUxޖZ~5f fi7:f;Pɗ /|`NZ, >M=E3XHz,_"-&-گHHggnӼފYWcy&*( m3SݚS.{ԙs7vD׀hTxW@ok6"??騰h)gK8 >u=l!&CzGt)m/.kC[ 1E " (h$#8-PϬ*1$CQuhڲ[".>njWfҀu Q_29ϳ@/ b}#~](|0 ' l3*P!h6K@=:gvmΥô@\}l Ҏ!ggH#'6!S;knGGص+&1;rNy-[;=*0ZJ0bl<#qjE4[eIҐ޵\Ru՘Fi9U9̼'c#ꍮQeKJUQ1}$n ?W:w͓BlN@S&6kwvL믤_R;F MU˷SԷ!\&9HE'Q #Xc,5Wa`Lj?0 Ιp$%߻4\*0\ajKP9B[s ף*""+fq/B"< .Il=ȁ?(d}BZ 0c{*]5cAJBSqoSC ɄC@-Vn+Ph~ioMV8{DR mFDO3 "= ]| $b0w߫U\Z6Z"|t 75T1ȅϓMP+{&㭽BB$$,"=Ң\􃝖nCv.|h?_/t):VXʎ9ʹ YVŠR5Oĺn n٪pCDA4_a(EL({FDs) : ?v >j]%N `eTNNLYxݽ%mأ NUA$aD-T['ґ5\m<GcQNo~e<>f+[,h55:9c߫tYzK]^<&X;K`=Yž=Cg`D&i-e~s] θ/N|zWS=rI,~ai|ݟ/pqVˀ?&! yVyW !FU ^S=xt7n&j3AcO4@ ͨ*}>FYVѫ-,SHNqLьDe)gCoS/U ;O(w>OVqKxXOiC9Rf3Z{,|*D op!s9OqR~k3>3(/j=.̙7ظ؜$=D;{$L{u2#q?נWZ v"ybԽBA:Eƫ 1) y:Y51ZuA>amm 7q\&F;hKB,' FpPMnPGgkG[O/dž||ލdO!rn"ԗ(OR* &3Z=dո,}VjJb\/%4رU=Z@ih-T3)${!ttjfhq'0LV-SXtF`Ƥ+T|. \b{*-~ [DTS^8q /ԫF GV+q*Ck4y 롂B6<++U7+/.. 0i+l}d;JF 0;x) ZRn惡\0G:C:1.ӿzkfH1{zQ@Sƴ,:/դ\6w3:*mn'g:m&F)wĢ㝮t6pd@0e  u oܕz/,Pc/3.~_pqgU=Bk(v"JdJ)z"xy3ը~49E~gT8{9'315V3zC#U['T^wxWDG,G)}I,;#īmKDe(K)A$ZՀAIߺi\WYx::[:CewpUT}@L4[Igy1UQԄ\yA!Ht ECY_,"@yi!o(bFϻG@'"ӳL4U/cL{MwK@!iyy0YEع+_4 ڴ>E{ZjU\1*PlT_i¶٣چYy$TAVPͮLՋhտ}^͆YsQhH)YŧdI N07'@(z@ 3ڲYQ:mݏa5[oJ->̊b@q 9?AqD;lXhsqN݀GF=F/1]Tҵ{1mqf61mLf@0⩝v4: 7z!N5u/1Le! zW8C?cO@]G_ üy3&# 6qq4%΂amMO+w ?J6l)Y[,Oc*2>I1d$+ U"? {]rWHU~T6N49ڽ{pf3b'3Q j^Gɪ;f7 i*~HJtE$u}s2+ L/f\-Mr(jWq`& ڱ^$x[}RsjVJV5}ɵS . WTICnsnR_^ #1>@ًfMoU4{)G(je]˰XʲbB.]Tl }睏Ek:V{;OB$5+nwky"Px6G?]T,Ejg(kZ@gˏ~_AKb?yG.6d,#XΜ:&sԊe؀WP;]?n-ej-`8=0ԷF~Juv玄3;7۫ sLY;l W6K~Ut <(rpFa2TSCÅãox[ݠ.`5>{UjP83 o6LZ2^ԕEZu1V7N@ZW]4s%?ޛ^?&w ;;۝X^;sθ2pVN΂!K XkWc,7Je4;4<:z=A vz9д)M 1KX'*mJHC*OCa@iI{@ Rԙ m^+ 8ѿ\L]='ڬKlb^!A>>4";FDʭs| J> zk>t[/e=mo%7Kr #hJPނ,l| hY;6K}"܀/6'uMBrt kბ+~xVؼ"0G^;%w1ipLv2  .L_[2WS[|,W'~F^q֏Ϟ\O[%Ut~թCW}U,pRؒ{**^)2:jSUmUe>D{$c6ut'; UפxEun>W܏,lXขg!z+YJ~kBѯ۠sw7a{Rctm2B\f'+IX\*졾OTDn^ƐKbW%O#Ý^~kץ92X/І|nYPoKiGJ}NȮ7o-23  YɹQ lۘYE69!@-$#X'DKv~CA6Q@u5 zŃ~W߭–~4-PxF-D[ETsДe1#)7a72]Ӥ>in#[QBh^O "~nu!z_^{y!5 {Ap RWG]*QCSi/_$kµ_tGOauP̵h倴-?`xְ(+1U~ie'/V9am6C⫍PCP',ʠL:!4DaܰRï'E$K~b;h_`M Z%B_;ď{fa6\)Pc;紦ә |VÝplÏBGe"c M$-jӟik}X3I&65zU)Gb;ݗm˲fW^Rh !|OwB2܅ 8F7z)y$Qr8λS綎h:L^8""<"`fYEnje g,Njtte:c/! ԧ ~-6쌓"If/QPDvB ]m5$xx AJ6}5Kz.NvFHڡ"UęIFsc_BG%+&2/=xƻD!%YIhɳЋINRk9OPO2W_λk<ncDXFLuе `hR;b;b y*ؤ4|J ⠵dXs?a.a7xdc\>LG) F+/_Q!TM9ĺ7 $dz2jo[? 3w8Ѫ |%#hCV, ֟-byiK{ni;o5~S;m6hIiXk;Ҋ{ k#_d$ȧy&-^qA2ڪYe0 CHϓn n8X&j.^U_!b. _4(gKk>͢%o+‹/J/+)P>wⳬwUg<(O1^;N%~EczJ _tgdZgakc8KƊy`63N|8{D  sP7 qJhq[#o<*~ SwGExyv&ƭ {Y滽zSBwrrLh_vE0!}Ƌuu\uĪ$*w/I/OMלy:@?J͍e䶴qYJx7-4[:][z#^:̡UY$hT6_̄OV:˜bC^2[ؚl< >^HWTΈSa)t@JWX 5)1MMf(NL N7ec q]#U累d77eJA1 \ƣ׌ {_-.ƊvԾөG?FjDS6\}8[ZT0= H<{ =oșYI愾FGyXTO-&jtZurX'CPOɟøv7θ5yt+"ͧg^n^;DYS3>z Zd!Y7ֺ3՞x 9֜[{x̣ Q9JF]㚌 Ϡ E>h+M|BEb:TRaicnΎH>ʑ8jv(OF)d.P>wyXG݉D;;IeYmL7 g ԟښkٗcYR,ֲӉj4狕-DQ,j ZhUfug"bkuoW3c4k3ie񣸣;M,6W(lm4Nqԩj baWZjojB82Ur;DG[X#3S,>\2ǯCz0kl|Nc·x)"aQ!-  UCD6ЪL4&=ɄuJX+/Ya;K] -R+4U_0`=]-5Tr,Kr>>REv1}]ܖ^Aʻ,jWs4,vY,Ķ싿cza1U~Jmxf:Hj( ;͗ENXGf͢^boo og{FX7Bz,qU]H,mG/vAHþ!q;Cv 9Way#v)+ zgaU#.=r-Xm;}.[ %wv1AK@Df*IL2ir3/ka ۂ2Չùmh K ccvKr1-~x&`~ԝwJZT^}FfӘ1U5[E.љ3LBy02O[\ۥd-xŢnh&2OE ~57 K> @O4){`|[XǴ 8䀈3Ut>We~P9.Qe&1Xk ;̷ ңszP`$ wc.B--e:'*?re9'L qN7,LF˗v{޽s1Qչ\ڞE.?  νZAB0k1HK0wzx%$}Nڻt݁optڀ"Y4IM-#{f@@<*_$QrU7[fqu0 ?5V|^x*)v͗5`=`ٵSVi.&/N"w`%mÇKIX8 y! A>PƑc.\r@q,}Y%׊`[l֧(!^+ɍ} 8f.jK6_.H*q+$tִjw^w*<+W( O}ɐ%60QK~!~FY:=ȋ o fG y/ (%g2́.pN Ӻ\%O|nwSh:?]g֖bؔ6vQ>>1~_NF+'H!Jbv䄯IgX+$="Fˈ*CЂ0^>nGw+J,F"5HCl|7$clGHw$!ՉR({ (K4I8g0_a&Ӂ],RPωjLMfT?UKum:;1# u #ׁ5&gv^\? Q&N[rfttᇣOpa/= aeHt\}'vpw;)r'?ȃgrM*:93=77Tc; Wr[3%~P|Uk[ڣI˕Onï]} J^2U:pPcZ|{to@Vp ?+ׅ[xc* yhv̯KjyXU9eA46?F'+39l )㓧>Vnq {Ex(|D$_.\HEWP%[ ňosp/8FEÈ%5UQØC+)@=U5ow 5BmΰZIk3ZJ``B?v󡽷(p~Oe4ڊxmv Q3K{.`cNh O8b6&6yj;|9T/6'̸I'Wƺ0;bC^~CDtQGOۑ6 &|Cݻ@C y:!)6C)Y6DsQkJ|RPf\?~Xr9H;.r=u,?[WV6K&-ޜ>X(F N=|$Vy${ŏߚ箇Z4 lb-NGTTAYP[x>O̶Vvƚdi<˴`!xsiDg[!2$i쐣ka e|"d+wo/c[9Sïq\J[GdJ1x7-5j؊nZ'@\lÜld5}>}g*i˰B5O~8 7p>>hIu?~,(E ^^9CID@/׽sT+C9$]A# 'tm6Թ W#}w<$^ $0`Crs1t(R.ZE'LwsT#O6׈f̔`f"m+YYAI5#_o $l愐WB|ʦ^mf5;^D=΍JJ?Tgʆ aaFڨ`@5;`ѪB_&.]nV*sqW0UO*;*zhcq8];H,^2}WA휕mFêU/H^o{ d݀Z/0 "DL p7!Y"fy1}s}jhI{](7Nݥr9OX# }\6V[SscD%g ߂Top 1!M 4ZvTk#NZa1{)(s؇iiͥ1Z)PQ;gb?AH{d GMXH]|ëbRPޢ 0yTgy&30fK>9hw ZZ'/ǽ2tՆOܧwF`}!.#dKڟM?u9&- x#0G_Rt^v-6ؾo"gAv&>(D@.4x)߮<: -!16L.Y/<_9wr[;@23ip[k^RD|X!(sPIkT![h=G,jf]ny+h# M1+T :|tfAE9ee<:9*C]+GR|ðy{}fVPx`?r%`v~`2R5=4ߨßt ̓2~Brfޕ)G#'Abxl[1_+H"OXbUqI͍hFh\3]ӾNrn?p=!|?/e7m< !I1p^=nQdcu[;-yyI.}8Vtn\v>Ќڿ~3Zǜ:M\J{U+< 5 Z'jD[i(copx&FO*Q/y~Q+"9;3§ )g ud6.n=4Ke-@kA~l`dd(NlP,xgØN&wiuCdY4Nн_+M_ו/.*Z͢$&0[*vc[!,P sڙ=N %uIͦz^-<;/̗pnj0fDui>!uOR0-trP;pܭ)\]y!Pf8CXfbTKp|HDDr;`r~Uքq{D'E(kvs+_NNgP ]V;9ftoL/V+粱@ ck:_QWIaPc@ːCWmrU=rݍ@}p{գ<:y߫76Z`Ta(动-Z57ߪH|twIY>vU/ÈV }}k@)+̲kkeܝ H-kᩑ-r A#@#Ӵ7 X2IO`&Qq]Bh%l5& P% uڻ, 1T*> Exy&Z30Th51 dZGИ~8]//(=6Q3IHh0OSJ`wdPΩ`l .xeEWM'k$ 8n<[R.SdC3)MY&3:}J&zj!Twj?sR>Hn8+BMsO,OiJ#P5F@T!?WS8.5uڌPq?K+ ߲T,ۚ}> MI;rJS uq~ 6d$ C͡~ŏKE[cbAO6A,ZXAcݑ17e;7f$kQuRlhAˌJ^gT48r7fʳ2m!>{_ [;p?BFv 1_gA^UL^cƧU=w8?mϘ:t{6&QdvteÊ%U/L;1]^WAۚV,5W~|=GYu҇Pʪ'M7p/ٕz,@٘%Zb`&8ASvHv[q?y0 (&::bQJ7r\ G&'ϟ{JTQ~%2M=6ĘlW Df׹/'Oԩ+mtjױ8ek[bӷ9ϳl ؜\d]Q9y[ʋ7# G-3mŬܙ>ܿVrR'=|Rc)0 _ql(Kҏ<銭1C|8tcQf@DŸ&tD9 |n\6sBakh2 -CALj"Sw"XGDL"4OJ׸>)Bi2G<+JXB)=,/ZAkxlzXpŒ[x-VcƤ԰{yr\1S(dY؟[tp©S/ ^񻦴OSKs# w[A 75v z%]*0JJ؄bY洓/>NeQ&vp;h_>b{J0>L0;iOF4D-rXIl#|$T36[wF(}?@s4^xg7dkll ǩ(xbmߌƓ)]С &5*lx=f3lGj,`x;DWA o(6^@?0 Yie3&-J96Z L^^J3#7Pc$0}6 ,SGd)0Fg6b">#Պ(Zsc$& ' |@1KFw[)|ve`P%Ȝ|/w`Z<=W{k'P)&-8K: u00#`,'@@>K }bbYrL? V0eؼM@~|(|H%JiD@3Cd}!"zlL6uS 3Ý z}jU'-ogU/DD~'bЊpN*(q;r&Лg@ndGPв{X͆\達Y^rQ 8ٻr< .-Zd §{~>(ќ~RNo`>:;~9)Vc:<@ ǻ&"NS-0Wx"hP0 tguž;0A^7#=3[D-:L;md S^8/=4JK7fTNq(f)ywUS?jLtu?$! ww@!Ut<2[Bvze5M7/G~W\OCy0#&BSd2AgnD󚧃X2Z5o`^c~|M~e4#?DaJ0 f͏ }-vwE&O\/ فOt@=p1|4Y=RG^X&54' ]}~䖖,˨zp3㠏g %dq!'ƶ&de ٜ7{8{ ˠn ߸6K) Ta ME]n:JJsy8I/xajc`vŖu1MC@,WόbN6Х;Ч m{7oI:b%復Gs8"iIxY6J~.>E(⿭"Hͦ y@}f);e$ဝ' Vh~T~LǠ/ B_*( @ƒ6xvV*)po쏃E\kFZy`EyH,> Ό3XȄKԅ>$ÉFn B,eL1-On$n&XEV't…O!]VK/-}v0\]U{>^ܭ$) F^WA?yTHu%KE=o_gUVdgkd$_}:N#]] HA-oh, Q>D%RNӥ­:L'zf0i5"lpR %T}aJA5ͯr'Dg4r\]F~ G?<P`ʹ͖])-p s >3׼(0YA2?9a\ڰqוJC?X`N!l=,O -l47=!{~ Zb(-uǮO;P@@iiLi'LmRwB4Ik]wSIc *l3Hp}Pdy_k tu Xf:H޳foS "`\kE_>'*&Jӯ/-X&%% >WMS`S* ]86[r#[[#a $2T -q@n傱iGf5JO4sb8t_e ݿî ԫ" [3sϘ D[Œ R?Z󫉅4jS?>X#/V];C=C]O˗I2umJg+)$9 lB5kVbf━1Z]ʶJzX wCH4 W3,p2&WINM/Gzw7u&*[F"p+I!P!_мJ]&p7`P. !ױ {+f2rb?h2R|Ͼx|4Et;9Gk6@KآٽI L*^.$}E[ph=30-[/ڿ, _42+D$Ʀu{8W:l>T]ޤ9%V.Ylhxڱ; WeT*i~CZк9#8ˎB}}L) 2|xsp U(e(do6z䢘:]͓gRUy{ ׹KSd@>p5ݢoF薋hx[`1C f'qGT>CKu`lq[r[<(~0g41[B9 (qw嵈;P\a29g!m@ɢ4\ys 삺)$clMOiF"م>! {yr!q/yjG0wc[۟9K>sMZ*&izWLe9.q?ovZ. kqZ.r \F:diʍ ' w4ɤE &/=$;=hw A=g0yR\IͺS@(TgHH/P+EMha[fU:wSEHe +g}g)58bՆ.>sg|&nKV'e쟂ùK^ Y_$tb9tξeӮ*,UMG9dϽ\q$: 31O\c`loV#6&ZriMdՃa* ,t *KAO2`ݛI_ m_*f_pbaSq 27ZGwsrG.p引J5Ki+!a_c#oj vM&+CK~ڰΥUXjBqGj;;bĠC`Eц]e8X@L9{d "`F+)KIL?1sTyfܳܩs@=irݸRs!2i$B)2=0^/`e<]y :j<51~#SK *D+=Dyw!K۬ 9rrxNR7z$OH{\Ffluv:wnf$$/77#r?t ƒaWu)}kUo21ϰ$88 ;̛E ߾*aE) s Vk*ʺX,% @S Aco62N gcW| `Ju1o8C׌NX:*w`&Tvaok y,xsg)68e7~>)G/G\KHcԖ/vZH !+k\+sOԡNH!~D3D#fy/]=5xE_qd@hDﴴ,޸-xvtfheol矿7<_IOnsuָJm{uT~1[Zx('ȁ2aAT V26۟Uweb6X#cNR3tsS> X_M{_T 0HJ{s! sQK6B֔1: +7 E͕{H,$>WB$$$!X!$$`D&Ya=Q$ 1$!'IE$dD"F@@`BC !C$ O)I$$XH,Ebi TUKxI@3,IIHEv\BTRGnͨfH]lphnf \HB$ H~!$$*I$L@!Ē@$P TBIACI!.81 HKC h D(b 橓aI(h b<ܒщV9eMcEu!%Bn0Nf"E,]]j@`,$ @Ir Cq$M$P R@&! !I_*ݬ$*@PPQڂI"$,]QC)cfgW Ne٤D<9fĻXFw㓆ʗgum()O3$#I7@ EIB!I7`@@5!7IH2!jLʭ$++ԖIZZwŶw h)naB*-'r)ׇ eš֏'I$I$R!tbIi]ĊI)vQdoR DІUW-XOPGHo bN3cĂRYX̹rrӾjބ9!'}$!d NI߉!֍dXIRuI!d8#%mH6u4K÷,5%URe}*1k1}kM D4>[k);٭7uUsbBɤ@4+mE$+  L9f|PV %; DhK\nٻJݾHJ!XF[0#z(+x\$淞 Z^Ax)+/}ǞC׈ {X@ zP!_``z`, dcY1LxeVRk_KnHŋo"p@Zvp;O-׳X,""+T B fHVpTS10!4- }LuJ7pZFϲQFG/M&[~o?'x0Wҡ'}VT I0 [LU`TՠbTkYnJ}9\) c沚Z%YPHBٻ`irJgb?9EVV,X<\@iq%1ƹ|`D(4,_$Za fS[6+Ԝr'/H8қ%7_$ERu2LM$E+Dm"1aP+m!X۰s%yXPkU{g\m_۵c\ŕ1̖ 5ƌn_-;$Z+d͘QDQX82E`,PANrf< EXEXPv²+IyXHUWm.]u fKd6d!,dNLl( 5fɤ Dfa*r˲`$\)m.V #\1H"DUhrms`d:'G)%! D,`XJ)\Duj[b85vm  B_VhA<ͅcؐIIjKeu~ӧ4+H-L1(@1zٻV)7hU2"ܲ*"ՖkbKi}[ )+OדmE Ɇ+ T%d&RX@fIȒ0 C2RTή6EB<R6$2Vwe;Ma UQL UQs) a5MOo'==I NjI+P&PH9b(Nin [>LA!n4S d m/6۠&t"$+QPYRnWtRֲiK]caamkB|NݲՎ%4X Gs]Ynnq HLAjH""@Pb0&clAYk<rmCy,`N1TTF#$D1sߥʫѥ8/]Rle%,f;q8<ۆkaUc~@믑~>:a=FuC*D2!X+zNeP1%3ް ֱiB4MB{xPm&>Bmp+׆Å+ L™~Q|Ff Eb!%a%@P Xd93ʑpv$Mڀsf6I%@K ,#h6'wȤ$! ӌ2"E[ulEåDX:% ljh:E ͖i44ûۅPf5\3>g>}0EɲB,Ax% R U 1eb8tII5:%ȮYa,mm۔wxR$L[&pV HU|=ϐr8NL) S,8RdL&Jd5L)vXQ,#c4yv.@!Ie~(X& mX{,ߥnw9Xk&Xl 3i ,P(AbB$b&&l 8dxK5qwa4 isIi Seݔ `BO(-|~Ox! 6I$Y$QX]+ [B1h#X|:\ *y LO&;ea5eLJ[7h~Ĝ ɓICg8 b!Y¦bp0'LXRe s,13.زK~>vnJ;ZwF9J=ɈCAL`0>ЮFeԬ!>v͚|QaO5ś-w9T=gCȱQX/D N&a]PkŌ'+!I e#Z-l=jV[hf%\\ӬRoi?HICHBQ,CfVT%fDcOtRS˜ZR$k7[޳!gvlRF/Yxt kf֣P񞱼!,ߦBBTDX1'6ABVUESfsO"I8frЩ̈́Җ!+hR|Hď6l045ژyLc~?yO=XAa$"Qk UKrE&0+Yd |nuT%eFՆ"m!6KY$f0 3K>sHs9 ZB EXHsa "DF(9EpLVs-l٦aX% k6*!ggv|Nf$b7XT1 1hԩDupƲ6'k ݚVtede\DICJD[e1 ᳿zO;FUI@V" VV(DNetB֒5!|@턻iZX'PRWng8-cc]9zJT9K;@r6@0Y$Q]T!Y:Nݍ#+R)F+HM()m;2QܴfQb*j׾=ϼ6HCuUvT;Y YLL\ppD-meH$.M$ V0ۺ!(wU-7Cp2,F%C$"3 4˺`kInѷ[}lhp4 Z{M3\4ھ̧&|gNI%@Q'F$:AdciBT*2*"/AӮp$ }q1m8s]XVTaDZK%}r8\z{K{6ydm TIrJ dJԕ)te0&e.`BpkKkP¸_l l 'v@Hvx>RJtڶT11& \!J+7tp8Cm'cIJHLƸ3+eg(e*O $9215Ѭ7K.d*E~mI+HQE (Z R(|,l>MFDUA[ "@g+PB0g!G.89 TǁVyc*to1~o.~~PAT b1UbEV,EQEUPrdX EI`("X"R  )"XE@QAda,AdUYAE 4 vHĂZE$+EYPCIxX*PM%*@1$lYX$-`9O@ EXf6 > F2Q-oxQ`?O>/y^P  " ͨ1#XǚVAA +*mQ IIyu7IsK$=aSM:w& ķ1479;I Œ90"+ !P-(.Ĩ8VZƥ@;r=4V]H6^i6Y2vM~S͞\y1rI# VJ#mQ`;*GYn4OmK)c14%(J̡͔)i{VBĉPE8'}Gwwݑ@TEX*;(, 0&B"f`EŎumP X]e %b,mxֺ$~H}_:t DY$VEEY\1.(URٍB8e8ZP͡ɻy0.)52UPўNgr+R! ā`8:)J@,-mWJ+kHCʊځRI 5dB,RiR)F*+W3^P*$RP&˵p06P<2ټqN[.e[KSfs<"U"",;DgvM߻/fhŧ bRL ! kQ-/Hw䛬Dv NS)EcqD;$Th@ U4laYW}%bL%DdIr1nZFm6%on ˮ,OkROcgLMO_r:!0: yJb) P:2,FVAIHЖբMi+B HQn1Kq>1Z̈́3M#54l6?o+7I$3,T &+ RJĊ f23LrUkE3{p'8+FGE4Za6tcx[vx/= Ӣ=HtANcUB%C8@ʐV@`S(H`XKbV `z2蕖}WU1,cF  NY|~E #u-#AP%A+E+PLbm2֌,~S?Tn[5/NFlN P6]9̾|~nnnT7LR1FŘőP twYd@j$P0!ʹb*$rV˒6eؐΘHĚ-6m]6;sXcvڜg|$ @6<Ā((XR4&E0-*6ت^Q/U tABzҼKń;ca qqnıt28YĨ) m2bPp=| N;ØjdRkvC*XMJm$H$-uqu'{g'c 2Ld!nhGHVbE*6D'ٰ Ffɦ&"f(;i!k8YSvAh8mP(d@7B)(sc(Ԯ͌cdcV>]!–J|PN_]s>y??c|E !PX(J4 *P 0ZAO%luXZ~wU?8#)V)CPAa;rxiI;5uݘj6)CҚU3^YMb6Kn3'-Oܤ}lIߏ?zOdUN$ d+ dIn eYcYihe-hv5LwMҩakl=-3eW>p # Xb W0 ɐph`uv% By7-%!6Qr[%k涰]555a|ipD3[?Gng{uAFVhTyyE NEѕI*uPX")<2ǰ 5n]-ciͼ[*^G]h)#'ߡ;<×9{箁!@ٙxc"E iˆiX\`pդ,e4@Ākm[VSMѣ+l>v<"<Ԇ ?_|xXxRI6<, E O@a\1FH~&v婆,`@@`Q7l)D6V>I*3%ۜSI-5˃Xx/+g<#;w${ Q E;;9hE brmh>IOM*hu,B.oi !~#c4w( n\U*w놵mmL(ǿϯ~wSuadP:Z됄I{BJ ' (im#JQ>,v&r Jm\!+4"TVAT|-C1** tP\LIXɢ?)y47c b@mv)X|%jT᭥2fm( &"UACt *Q-.!aj#LL) \0x400-vm#4`~# eVsr@ꅆ )XLAH,Bʂʔ!ΆXtDF puJBηa y1Liۭ.kZrk|ߞ3ƉJ@E$ 6 IRJl(- &J E3,̕5脋"%\IԸJwDNw[Lf3?9!xw6ܐQvTR@P2tdarLbKY oPTmO,kӊdYɷsݾ9L[%tG271ͽ=s uџ@<șaCY . TB R& n}#}ÔeRib?-R}ffQGSAmH(CyE9;m7Z * P CI%`0OqJTQB2~y$a]emojje۔e tҢ??I#ji$ח|3?q}.`V,)լPPEI}Ԏ({OI D# Z_xTˬTtm,N[ 崆$$*AbI6Պ )j*qE:H&&00N0 P)-iwCMi+:ۛ[esl!읐8Kic|}L</?3?W?~_Y'dSA`>2{d, +pADSoLZ6pp,bn8L F bOjnS+.Bd&61!SG'xW2Ǩ2I ֆ+Y1*, ɂ{ FF B6TQ3r+whs]kJ5K i<}RĪE!"RQX<(H(@¢FxJTT[fZ*&"ğq.}8>r>I] cͩ[g<'߿)ca1"RLdT1+$+؅f%V[kb @8(f/# "ixmBR;vPti 4-KbFYepu,)#{3_?{:@6jRjE@j%BTʈХiCFcMCLUiό7(GM 6SO{tx8@JBBI؂N^(U"H~I uƟUmbM;-n $#%n{B606i'*ܧ=?:tIm 2H@X)ZADPLIH@ib"җL(:G9sYl['HGwlec<;p鬺U]\S}iϨ.ӛ=N޷+'k&2A`ǂh@HNeWZX )%e%Rlؗi+ sy$%>/nebEPunR*{qeqկoS?C}?#?v='}!+VgjTƵYXDVVVv%aXYCJ$#>4 $ʉOv $IfA cknZԄy6 '~~idžI ދU V "@a2,$cRH)HȤʔT~bm Q2l~rX\4mq1mU 5KM~e_?dT6[d@S 2ELKsmhjUdRTERHe)6X֤Di:M!%({z`ZKQ6Gx%ʍ+J^ - 2Mv ȵ V`ʘX Fڢ-9QL`)rN^pKvM(]:9M 2Ծi'cXJ6q@1$gkD(VIM6TuJb *0Z""}Wrk5Z߭A٢Y=`-\Ǎ-/a/ߚCvsdHd^yfd(TfbI䔔eЈՏIH PK7#FE-[b:bRJ c+t[K\޿=ߞ~۟t:â@'6"$tEG#*CMUуķX_UֳPe i+ @=[@-o-ΝzrQFETIJ8H10CV!W4eSED`E`wYwbPTM\XgBA R4'?BI9'YU@0Fb&3mLD H`m@!;;e-d$.4nnwiWs҃ɮ&y/9a/>gu$REhS+UZ´h҈C$I=nHmK%Ex1sαf踄QbpIO$RRlmDIm ͙8DeMr7L Rߓzgnf:l9aMh[KYp;dK)ٴ04wd$ @F$g&l$`c &b5 PCH$찄_MC&2$0=6YLyjYsgm?+}[v@P jU@ Hd6slp>,F6Ҷ@ YU +&i3)!Bx4}3cgٞ7J,*QJ<$L ."MԚFSܶ0ɷUZEMfxkNi>=w{$H`c,Rc** (TB>"T3I`Se]t0',bGVv\|[+el+ +l|~#BEnR,(** У%AFDJ69H\|*f1m!JC,<ZK|TSI:\iZ-vS7k}s}ЕJ RJ3(UQe,\BF 1<LmxZ\mh $*]",;0  BzT(,S> OqռʏB!)ddTR HbE籁ٙ%J0-j ѯe̔Q1c>*U%m)}vn%#Sjrhi| d nȱJE T*U2iLX˗q!bRՐgb5# -e,XBV@ጴc2g{>{.骒v! i@* (EF8@r4\Q% ;w+[jB[-YblPݛprsfRnP?hJd=lb1 ,Ha12 maB{+P =!=[v(0; 8ۻj5嵝:Q{ ؒTU@zY!RT$12$ FȁUdsԯŐo֤\Hẅ́f{[wmajqnYF,s#ǟ>>zEDG+ d3HG]7Jp6҈2MncK. ȕe@H>|OS~?7vxNC},$mAHsH%i)!6Z@OSPm9Dz^CB'i, ыzypx'()82VVQFX@PET,82# (wPn뚰*֑)(\ 0Hw-Yݢ[ZF" _m٥#YTD*°VE"Vʋ, A1'feulګ۳cZ}r4`R{1 饗{ϗ{ޝ: EaRJjJeb"cFڶ̔;Dk) H"z |i(1"ͷư}1sqO!@Dl&H -mRmQcT0cE9 WEPeBܡ;vP>b]C P#=PhI Zaw2e`) r`EU<ĬQ$Te-l $ wܑeYCٰJƤFwc> c\[Bדyk^-kmQUdB nȲ(([HXhGVVcS*o)j[qMt j6ҚTn):uS{FCBAC+֕d BekQa0Pi6!`k~Rl4VQ~,M{6SrXAJBV"D 27^ ~竪>ױ &}~E]'/~um=Uzmao[MW ϯl}8l@U@ (3pQPmjJQ-dI> W3ϤƖъ&wa?K)(1UpSewV+?K# U6d eq@:, k bw]@$Ҭz27nG9t":97"*ܽGmo射ْA`$TSfJEGULjl[1sZ©KwarGk6i hнZUj弍;{H ѐaJ"0XC3Ѧ{Yw(Hc(vI9Z9]*-4UA"Ț%UyʽG}nnn,ɻ1XC"Ecᑈt] @gͅ[`G ݭR\,Sb`_{oyHT$b#mV)!% ()<W)C+"HzeH *5IOLa;`\$)=$>Mm%XY_^4Ld "TKhUwT@6D%X" 60VX$IP.%,tjT[wٹw׷/==>P$肈KQdSci%aхJZ*L]RU&3.`9^-X RYI!K-0MA{+  "$rbWADZ$! 1SIHa-w #Yrv;anUw\ ҍ>y7ِ"( 3-RI BGR)F!>/88CDiOx)#?gu:U `P%Bub)4Bܛq ZYwZɣmSAyϯ#^EF]ٲZiZ Ogv\"AaD1.̘Y -$p$vf!0RJPF3 !-m\ P굒:6fB5Mq교_OGtΉ dP^tW,cn o([[[v՛vXNeV@نCk,+ 8"E VTrʫ[ZraCp\m]#XbêX;wIL]嗛nmE]4V˗rܘmvE$ d-TBbtE$b:bJXbb;zcn˔ ')ŧ|u|b;G݉t}a0D^"epBX0+஖Rˊ] ΄{ebi|JjtlEZzJ|D!qG+tFUw=L:m!-A \Pbp,bC岪 bc, *A$?M<غ)`^(Vj~,pEq:(X&2&5__/>Go}4VHO{XA1b*VX"E)RQAEYAbȫ$X!P((Q@X(( ,PX*ńR>鄒CAV,$2< @Ӧi%Dj-DnJ̴\#!qhA!m~f0'`cm۴\RS*E9r$6yIC A8Z;!X@+;UFTU[EF )xRP*DavNo' jXBTfA4FW ZCS{7?j? dd40:#eBiXʱ@-s҃ =Ml6UCJ U[+Rmsf=tv?h~omR*h"̵Pt +"=-sIe$%yY5RKPY)4YPin-ҍZ֪xUqO_'OO{aoNH,(VMG@*IU+8`LWa˷i(2j.7S?Fˑ', ݎ҄V~u\UqӕTߙֳ^M,7RMtAdE%j3%EQcZnbJPR!mkn)a <!51een͞7l4 ՜'2M?ԝ: E!TV@:((hTbiF[4ʯ-[yhkl,-eycr55\[&^B0E,'&F8Jwn^,+(,XZp`dLB{ݨ%j[%>HᎳ3I^':'u$Re*XJV@0q"LIgEcHbQ34 Κ[RmYmWvU!s_[7?7$*B}!eAF %k"*-INObTPRCke}зnGuSL>oB+. >wg<~QIف $kBE7aXD!>aJRDV xT@ƶkic00 &Ћ%vڎ\rIEk<^?yHG~mPa aEdPydg;1 iW[]wv_<nvHnw|7|ѭݔӞfm?}w;}z$0ĀYH$rcD&~"F&&Lc>X_ۦKH tg uS3WViUO܏>!iQm`@ʌ-e gj 2Ds6La Ԃu=0w )( )}ݡVWLn 4[ 1Ru/3;A!ʬ/`C119eH)ePtqF%'Ԡl\vl$4W<r2jiہm~?xOZI<'`ȰPUT!-hP!ࡋ4iK`j,̴ >Yaba im&~e h:_!ḡCB%Tb+fY+9@mUըլI5 ]Z %'!%psgH :$b,F Ma-n<7{+Q|?N@{`T!*u@: YRb S&%ŠT+- S&{C=I$~mUX(U݉lnQcJؾlFIOS?i ͉$X!y(e!yڬ9M/#RJJr,JyݖM[mZH/-";G%2V2Ny|?I؏ޡ@ĝRR : dHV(Ҡ Pstq`@ 1zPiiv<[PH(iR>HSqδz߇)a_;IͅX@"HKo+R]5L V6> v|}4A @[ieVh'LS`d b,X,c!0u1P.`-$:z+iNZ1cN١ жζFk6Ȳpla`@Y~ay 67$I YP*"6ư/NHkCI@,lnmJk_KPteS]ՆJ D^6RtJ, 48.bagRhzl%YDqKAQ }[4C6m8T1l5צKy8Sg^0+m@ )!+ %AJ Yr ,PY{hi =RW9~S0Iֻes]NWKLG4 3*L})R_?:H/F^Qa1IX)1\\l (=pb{Nqh<㴋 dl٦ .JU F[=D$Ab,$Ԯ&FDCr4saJIY%CĻ-'{O.46یIhr,cAcxw? }:gNHBvRIXV""-%`fPȨ/[JBfI/5ip%G !%{7wel}˺6ݶ]d~ l5PCVf9DkXvB\DrFI1"H閕vm [ 8эnCD5Nn͊հjQ4a^{=!g}_А8H !,1R,*1EۖQ9J%`,-DLE &[mػMͨpK!y)Lj*qJX,Vb$ Qj^I*ĕFvж$d0 , G [B{TXnڠC@ٯ}tYa  QA 'kَ2dDUvOHiT.4^sTa! ݹ;8Vs d$B.wfK-~cQ6BAٓd!*(5EIXaYwl$`0E#tAr.J[WJm<+Z"6ml7wR,r|{|+:bXta X,XI:Yօ` X )Uhȋ֜5uteIFJ>wX0͹4@Yuvo (-niռ:۬{ EEE؁6@Yr@6d0M*(%`(b@ٕWY\șILc:xJw%sj2mb*CRTY5mH,:tl:)X~~߁ nDdLHI"UVkE B\C IP[QV,+[YIBvZg :*,< -L--r3dBCXH*WbՋ2TX +Evf!PP-iPѣdE;(5sF0 ;ֺFj64z%iTsn OHē?zCvHM  lY8ڦ*#bɳ$ݐAo2[aDKL%$kn$ڵfq<EbdژeM}CQ?4$Y'udVYV@F k ¼K%|XxU#;-! E))<q-᫘𢨮\mPd{Isq *ETU Heeb*J&2i<]<]YFx4$C:wLh-j Q*Yۗb S>枏oh:jBIEPԅbq13TCGª@cjXZBeX:lfbCM›Yg%$弬 X@ Z0\Ŋb37f(#k fZg^.pClHT8&G:&b9f~ҖTѥ[w=/$~}:WT>Z|-BQE%d@HvIYN\\LIj2$]GJFQ`kBExr.[/ mGQEDOK*DЄ:3TdX++T]#FƨLjL&jHj16i_Rګ !'Xa( _N6݄%#Jx3k3}>O4BUF(Nic D\C2ZD [#bm٤\77ic4; cO;.K4=´((|:U lʇVx'T+JVݩ!gg8mՠa*鮳K[&I1̝0MzgsbEd$6b쐢lʌِMhőɫ!2^N^r&nKleYP z9f8-HΓvF)N!֩UPmH b@ē *ZvɔI/eCPB&ݬ@.ځ=*uRfZ^=t'ߝ)$P$ej* !6TMqI1$ܗ ܘc%#Hp[fZ:ܭxFWn )YH":#S״\dYYɕP%HVwYX͑JHJB<5m*TPJ`ʛ"˭fU#XG(IݗvRRX7&YG=o†}n !%"$1T0Z.m%q[n񛪑' W@!QYf6Ny-IHd;'y@,ZBTvBQ; 8k_ҬA[m M媣._ZXEqI&3I6P`""vd)j"I([VȄ ,ȉ3M&[+GZYݬ( gndE1E9!BDH,XAB"WUl5=\i`BێVKV h96sv&B@(!5&Lyfnݏvw2<8O&nswVN! aj"IX* PmYEҥBbuiNQ*"#e AHqSHV`UXp D^ci߬xJ.p Ͼgstat/data/vv.rda0000644000176200001440000000320615162303123013425 0ustar liggesusersyPSW *u @Eq_' HiBb+2AqQAT TV ޗ{Lq799'wN;Yb1EC(XldЛNi1q VQsOU+Xfcߺs,x{Rkg*|*$)bFyjJ(e5SFc֞q$a^k dan=掤0Wkλ)՞ ڸ>\5]yujbUxW Χ]0$̍R`⼋x wޟ| >&!?t1WN0WM/r"L0/&bǯ\> y'AXE :6L ~cyςYcw PdJmW5(^l&'/1qw]> zF"nKv1<ì2 #ErXu7nͲzkMg7>q7 Dܱ>.v[}Q@ܚ#, 7XxxBuhq4qOB$A)d!nǦ}s5]4qGdI#Eʪ?bqܦA\kUL/?sCܟƎ!|sĽ>`=I@\GkƊz姘zw{ՌrLETSmnڼ֞Bcoy#fBU%-LEq|f/Ƽ-Քf8iLK6l9L ;a3 lVRv Q6, :q4p4!`L޲^iN'L\˳W'noi 8Yx0,{moܼ\pq18-|%.[NMjX⢶;zYLB8pAVp{rgu^gZ]^畲8\&!M>p}:時K]su9G:k?WÎk@%cy ohς@pڱJ rp`;َivAt'xVNL/7Vz ۃ)K58.9֥S%xoN_4wR' ܸvx`nd*xJqL=A}&ZʒWE5\0;=dP30 y¨I})}i}ǜ__֊QzI5{Iu{I {G?5"C$ bb]6&jEԁ(?7Q?_5q&bMVRv',2IQ9`46ϞFAcH8ҀFjv1#a_.h$2|.3j5/D\=Z:z8 xI"dT1-ҪXDvՌZ.c = ]eZ{ M4lDm.Qf2-L#jGԙ+QOˈ%"rKTĞ[LGE2!*&TNKUhmUgstat/data/pcb.rda0000644000176200001440000001264415162303122013543 0ustar liggesusers[yxLWDJVA4$s' u=L&!9#*EbƒjbޒˋTWZ"RR眯\<=O<9s>|;#Mw5{b,~|-|,~Z;__ZMjirTnʎAvEU9ܶXW_&m -Z֮[w{Eᖿ$8s,*uGLy';d mt6 V| lk-mmdѤ,ӫLۺt3Wmh{mo/zWMR *3K]m<'W'Gi%kF½F[4[@r_4 2Xo}O{Nuۏd rN\۱uWݻw֥pnG; zk`?R]o؍>a__z// 1<p䁑F2ՄZg0<1c<^Y3!o UʥvK.o?dǷ@|Dڬ7Z_o-p]n4a1pi7zp_^fm_8͸j\<# ֆ#02GzZƼ5Am\nQ7 '`8ըvklW.cġ0oYHڥ_ ̈́z =󛍈m>+~&5ƺ\zRn^/aex\gzX |aQkB<חua?c(V >/ `vZ~֞wvrƆ^cfׄ8sB/dqP?O; ^৷: "qpQ ^;cL7POcza<?!X)o2CUqqqJ9fq4Njk+\~7W<Ǽ[^ޚ^|vy}X~yTq u Gz>\kO{dzDqaM1oڨ69wnyކǓy5v-YTdt?=:bGTR8yW]̝ړ_+8@mf&[A}MK߉oxO׿0?TϛwJoSF|Oq&gI}^>ʶl]N~}BU {} Uk?<>9t7oO5g?k-u?=>z<||旰S2x3%c)#.{[@zl< S~;v-sGz]x~ u$3`}zQ7!=~>݋ݿ ^S v\'scDMIó~y.~oڢ ?`όCݲɕp}y׍ ލ87_}}Q!xx݊vGγ3]7qce.0p-};} v.}OvtwWܟn+B?|sPi/uoyiw_靌}w1avV|g}ΛؿO/ xGY4 PUxyܪP<~P&i^?˟c:k:kREdw)ZiO-J{ͭ4vTCsϟ*kA11lj;=g?/463f\?&VSzx,3?m̤Y:I3p|oɎk‰g6ݷ|~&kl-٬am.k_K 64ke<ϯ,beU\|~ E䗲O~}kjxJmq*q0hkub_Gs]OUUV֚v_>\~8nsjիerkIOZ-i̭zA͎Ӕ/: Oڼ<{t֜T) YB[m?_|t0* :MPځ|qaVk:UK?WqN1>|5ķi(UFL&_N7;1[=? yY4vC%.ES^QmЅ<[`n37[9#Mv&_ٸA?/ESGt?hu3_^%u7}Ujot4Uy?Mȏ(f*My^iQ.]3-qErTՃT24i[{3xѨ)ߜ O_<Ow;nOKw&޻SgE5]|D:|+}M9D4a_Jp[%ac}?B]Ao2m+%iiWJ[jE] c/贂^틞e~-dwBկH&v^SdNՌgFuReuQZ}oה*5+hl6ڇ̣)7F?FIZXߣg'm6y u(k_W||{7lRyrivջ LK~|V?Nf_+c}*)xX>ӏ{l=<2>zy#:y-"&|Ǎq#y'g !66d9,GVA#X\ >Gr6ڰ~ $A$X`UjUM2 8'X)`LI29p!9H$G{8HIug&y3MP855߰u,&ojh lf&<7oT4jxo #4߲ 6DSBhMb4ѿQD&:A&5ѿ$Y&)ֿlegSԤ&5yQS&,YhG;8gstat/data/ncp.grid.rda0000644000176200001440000001124415162303122014476 0ustar liggesusers7zXZi"6!XHe])TW"nRʟ$dxYFg5~ bFܱxFh'P,H)̤Sc7DN@\tLm:*gRXo8ߧTEqqoթ:ţ>[MZs}1ّB%c]/) `ݟ)V6ATc0ݽ DHa{dW{Ej y1)_K"pMq+"fhH%\-BZICoOW8j<듎7ͬ%p7Ӓp43 Z*Qab*@5n$蹣'(=<̠el7X_)}#X^=Ac`gzRiox 䴭M ';KGInO*hNm)[ \E-(35r0e|[)Wn=t.ͅG>h8o޻> /XYZJ[N"(,N<1巗^F{ʯ{Y7aKiOXC)+kGJm`Pw] ^Y>W@Z41> g.Vv jMll S%7ʿFA_`LsQaΫ.wo4>p$DqyzlEm ☝PrceDՒNQԵ9KpI#Ĥ-b]2#b -yɀGVP/!#Kl*]J+^ e";1?q.noIfmT{C#xZ)`٫= xP+s$!&3yPBsGK]f7Xad( v]1o&Ď^@ .Byf0VV^38洄$k*CTGU_:WʑLiӵ#oyUf L=lˤI!n,{v:6]+v{siM1XcO}oKOڈ[ Wُ _ P^ƴY9q&#7 eog.1M\I6[08Xu'4UzG5uI@N۰R(|?ۅ(nQv^:|OL I~ ]-f&KY4bU7aBRv$A&ţ3ts,9SðCb8Ov˂R} Ka]\vVЇgGJtA+䟱z3OR%ԓtbSk"Q sRXK%ܧ9lFNAczk[; s.LTF;,GB, eTFJG* mI1+* (hD ZY{ZeFEJ?m)Q G}#@өF"9Fŋq!l'x^v#:Q~p I౫%:^CW8G46G&BVҨ^}Q*kSĢw_7^oMI(nFJâv\cqގ5sUg[7}p9y mVώnMf1Sw/k2>ڋt=/z}hҎ(xdEF cēFrobsxa?fώX;h!NaksHbTy 녣+mw']_?jZr^f{_ K?d-j Vgq`@QE md<3#H:qho%ٯKXX *# êkH,L65NNVEuV R4KkpE X.oջwsXUUqiM5'gǡ0 iRLI 6Q3i-*_Osu(%K=ak"w {e:}3=e"nbPЄk"\*Yxm lY| K[M%fpL+"VJՎ'N• QBUGݬ堭,~{+hyp*Bi6#YKeQt \k32V4YM>~{!omGS_̓6s7Kqq[|8;߃vO vὕHۄ FqNg,fH ̈iGT+kU%"Wܑq&ѹgGVi VnH-T؅J.I0i8]mNIg( P͏*9Dž۷_^~J9PwBe~R'FaDTLchܲ+>JeJFU#q }PB$6T=ĖU ϴ~n E;:[bͻ?[%*d8̠xe(َey5*| ɔe: ҈N(de,ȱn[.r678hTxp{1wѤj85i7n휋ܧ)uBիSu6ޠVCkQ+a:@o CEU?hd"DFe/u'~7`-?h$ɞo>0 YZgstat/data/fulmar.rda0000644000176200001440000004151015162303122014257 0ustar liggesusers7zXZi"6!X3'C ])TW"nRʟ$dxYFg5~ P~-OL,=.G\XeN _Me>? H1saM/8PMAzd :e\-=1o +<';\U %ُTT[ۚ!2֭/t\=N|5IR;xzΎv}ґP(IM§*z f]4NQ\Xg._r~bAO n\u.}#?@Xd~NLc#}7c$>ys - wqΥ?nj@aj.!3Oc)4 Fic~ib#c^n ‹M iNr}8mUe7j1A:ߙItKVVf275ۆebM\p߈3x,!>WEմ.IU }arGX#ұ/ɠ˵A߾:hT(V;Vr5aD |xEq.z _Cte AC~wvy'{!4MubV=ʄ+ZeltNpH*Ӡ|m+~e=UirW;-Jqo"1_/Xaei%3`~P e{QHDV7%.DR%s?zGkFř]^0w֢{nO XmcW- 0O =E/-=e3ѕ^~/~[ܚIո!޳֎oCCfCL@L LJ) ^w\}-wkCg-?j,)tKE`B7"K~};@۹~nO&s'rض1s .jvZ~Ena*y6O)KsM}$Ȍ`cυp ѹŬ;|jqcBwD-C:BJ2E~@BomOxW E<) ZDC%Qr#tOMTN^ѐ@;pVOӮ*egβ#z o877u>a\:87RH2vks!<-h(0Ə-5[I{bA@Q^;j,||= '՜_ wmۺ[<隻F.]vHל8lC1 uwxԯmú(,z]ukD,d#?n[.N wD7*gٓx}԰sꄟ;s K~ ;FhR)}K 8x]]y_tR` >-Ux6>el@f P0AKR ,򑄡p Vz(kM;_ZhYj03u?+)Vɞp9v TqY>?%oϳܾWE"BHA(2d"cBA L uF>Jf/_}\Ys1)SŽZbȸ>ƎhciG!l~c)ooh/WrFs]q@ΔX<hc[w]R\g!D*|<LMN&)UܕOVhua5M&v U>N|G/*Ec *ZXi@Z5`0wIJE}N6 ^񋧰 )ɳufgځzt-*s,<ͳdT°.:Lt[+"!}~3foʑai8 w+?Kr,MFޚ2#V2HJY,5g[IQXtKfd́sj] (@ވyϿ8{qWwrPX_`S XP ll Պqu!]Θ;-^4vϞ^.PF QO~s떔 h2E ϩ+/ svp+: ub`]N uaqVS& ~M^+vpz_k6a 16U.[AFEMjm쥯*c-(TE̾xXLO!ӿmYQOmX9ag 8I>,ҸX Z 0*"P\(sJf9O .O_06/֐\u 0kM. #Q)W.w ϺsZBGt$fnCQg{bqG&h*|}!mn>)oGwpZ.0 DWNX%bp|cũTk_|mT}$طY[kF#x-M׮ Vt˂33ؾصhM5=_@G<<k2)4B}nmQǕqgSi?~4 dqW/zH/,$pj 95]w;u2 uli}#ԏV^a6k10JG 9:d6+XKz$R5cp4ں.fJw< k /HK6pB!:Aɹ/%!Pѻx:2'3yEDuH GyD8hF+Sv-G#F߸!D:i۷ j~1Ma-zI$m -΃ },? ‰Zlk"z1P#~ס)ǝ^yMƏ ](ᓬ&tpgfT{$2OJ צ-wz dro`JgMŻ%vFtA@z_ \M"MK h'żl ̼?S;9tci q?SsN@%?vՇQj!JC_pL}Ff Wܙ%DIH5$,ןSxʃ&v6*Tpe$E$7n\K}oHqCC:]@=YFԧ55b,K\,cu#%HW( ϶,kk+77TMu5HN ЙR A)^D,"i_TRݳŏjWe-5 ^ׅ7T硳ˉ>_ߏk$D!X8;6 H݅( n,F0Z틮MO0T#I䮃l%Cf3߂e'H1@ll|zyHO]T,χoR6Ϙb[fyG,p{֙Qs y\ۢs D1`4[e"ﲘE;l<2/(&ߧ|#Rő74\.Lcr'f^

+]~${x7ݾnєpc|F9aOOuX"wl J!>Ǫhۏnm(cQW*OѬJ?񸸖vcC01N#/<݌L(m*PmUSҡVB#%>֐_߉QYf9 {U 6QC7xVbgWpLt=mi C$"G b+(QA8CYnx>>lB~jYEN_9kD?Cj^Vr%ӭwMkFܥVҐe5xչ4bEnlTr>váR 5= X,Έ⯼|'^I kR*jZ\VTQ"rL2DS "h\љԕ%yI?Txe A5?l Έa/ 4v3A`zH[C9g/iSLZ yߜ>ҙ+cO-,->zhNv,0:T %|rdI$Nݢ2좖X:5C ZFYys.ٮ(&Vwv,{pړԕwCX_`v6 rQewa[lϨU%j|/TAwne(Ka|LStNY&rfN{1W3Ǭ=wCʌnniOv!o-l:yKin4 L2(K^n!Zz7Ҥ6N'LTՠIdUH1SAVd2=&!nňdKT>?&ا6]HRL~֎~0/D-{#hÂ/\^;ddNy4ݏ ҴwpgNvmp4TJm@1.?:o(oHaq XxQ͎$x+P@;C۳>]KSj/"mB%2.0QHFoW;y1^t?8@gH~;@snۗc,PZ1TBk%a|ҟ^{~aIn Zyto\R[G0~֢z=LǚM ɦqaJ /ݹG-{Q3t (b  cbP)n:+iěXY m[ ӉL7ĊJ1d):j4m RCD`˥|]q," \D uN0喇pɷ_^J&FVTId5K ٞ+lgztiFgqxGH6p#?@RD\ v\FFMQ}ac1@N1IW'*dCIVIA!q/hRrIآ§L͛w&Q;gSIŐ OlN\Ռ%Yg@1fݫd%ܓ^CjG*{ZuƤ7اW{~4w >vv;9ɗ&UnWsm;-?qC~U\S2~TyُxWOXe4-Ce ;iͿ~Y}*HG'Q3Q7-Nh{ZRb G\k~?\"ЮFT"^WI"E/QK)$DTl 3ZeY8=Dimc·q5H hb}EȞY٧:PBɳPAo <}-\~Z|G&AX]B}mK3cu;ǽB9gjyI#4X n1>M;``ܤNP‡#Ͻ-U[wL@x/Y/]> 94LOj<^[Րexfu*`ETPAY.gVN?51Cx`S'6Cq_XD2&JYrE)i;* kz+u$n4$Zs,ӊl]{6Dn$͋rUJ9y$npO k:b#GPyT`L}JQZmVALDAąvud;:_Ɩd~6"8\# C=|v`m/["<#ϗ!*[ 14{vtHK[S"v})$v kFt.N1I'#иm{}Q'>]q"05-!rY#ƉQ1E去޵$ )|c)n*=!t3jpS'@IUh^6=c ;pPFPjla%&JF T!te1+ oG1M`gH~xdg`>(GVᴡ>yw2slSMe1p.) ټ(qZ|uƘ]-V.>g˜'GCz;$>;4Erc6Y-Ye4.QsQhyv@,4cA[?MٹYW+jdX,4Ur ~Vye)tE_ fpw<ӧPzhx-|ELIc8 RpT3|S3W\ *NT =f((ᎀ$ g7.X&KH}Aj0,DÉ%}٘}I.k+KJ2/B^T>A" +__&YBT`1SRC%iCݹDfWkǚ 8E{p0%|^:wW_9?`گiRZ񓝗)0ճ>BYsldshj#^,yG \#+ڰP _1Rqd!=@ 3 j{˔>րߓ 9Ul"gRaA-`"~zV=#!) ]g9_&-9|S""b{-妈`]++ʧtYcAvNz0&gд^?{Lspj%h?>ut]p+L"6f9+͡ niiN5]'zx4&X//K fRN0kҝ,mf'lƒ xz; Caz@I0oݮE@ 9{/#c£ UI"?ҷ<,!`QLO:;B8DڬL#3 9N u͠B=fi ]I2 rOPҙwXUd^;~ {С ?BDaXW=4u|5ݳ Ҋ@5OĈ#gLTZB^XQ~9?25mk!,H naHF T/ ,fUF-ūNgD$;Fsk0hr1 ;DV+VIɾB,eX;xsˡtrN.u;, Hco._g %> n =<4y,jkM׸5.\6qoq]$)'{?V0{HcHhI{wo+J6X*ßc#Zrefq&xCV))|ei7:I L]^U)DH ]]W r(E2Decy&a*m&g |kԟ&ãN"HeNw3NK*Y+~ϰX"G yN.#y#Yk _s/mkEj{G;>a|>UXΰ5|z䡺TIo|YA2hZ3]vA{0ۅ\Ie0%KGbsxҢ46-!bYcF.Eg;t#x+K,_ESǞ #F\IJ8j[n/Xt#DOތf-ތUDP~ X6s@8!E!ͮe^p9 >9+}x ^YBnsR(~Y?J9BqMEu3TWAk(}gemJ,w?Z4\?l<m `r`7(v8] B׉uqIRȡhGWChrWw bț]UcV|PQTuDS%ꮛ֊Mof,$'8*0D YF]>& tO ֘8a;H6GtY2W\ `N3$êi3"B$&gТj}'?E{;׫@MgzR,c^kWKOLÌH(h^9X"]"<m/gź o+P3s@sQ?wu@Lق/fqZX918;,qhN*v0HD컰 1}ǨnN=qdV`f4KD:soLdzKffav1KbsO.r }Mp[$3Ijb#! Ѣ-l˒-"r iM~< jE%!}%!U(aLqS]z?yzi#R,TtrǤЭi րv*-vmkpOװ=t[8lg E{8&={?ֿ@g9+euBLz&-miojiX&&ޕCF+\b)> ,B~j!Ud9>}6YfɺHguGTi2}U4p0PKd;ˋmW5^+5Ҷ ~-I:'Y-2:GNR oHt|6憦(uUJ0GQCrFgRSg w_1rUY*^5;;_;f~)"aPP4ىEl ?dF͸'|ki+M WH@Y|'KLQЩ]cam/# jq t}qNa[fn ٕų,wh-Yz X8ʜRqg3XIȕkX/3wJf-4!I |Bچ$ ZM_"{;"UkA!WO/N&hzꉤȻ4[^6TqT**[t Hn ؅-dNכUNʤSlH:Z\,G+/._PLv0ȕGc8# ڲ{wܹJ50Xczd&/M+y:=r@Dpx4V}nf 12DQᙉКHn[slEm΢a2:N|_p'MWePpB7_&˸HQjy(g?6fL:?)x>،Κ}a%[ٿ\Zk=7ծ(Ԏ2|0P)}dQmYod_%۰'?SQ(\.QSPCh4r.݀&;0UGE^9+ T,XH T$.vu{C|0km]5`;]#Qo ݪotddQYa%zրűa!+hdWqjߟ4Y'b܍6 Zaʮ"ֶ^'m؁GջrGiU.A.l:9OTc$2dC5??փh aq7YfS\~ܷأtS5jus{ ʍRG 좛b~/z]AyX(LK5H&]i Raͷ)Aa|@+dvE\wp8V}-$y@qIJ?8_ŵ7[EtIx3rEPU3"YI< P.7 Pcq?O|0֫37 KYg#In;IEc,e1SSD9m^<>mm6 5x_ˑE?n0CoŒ*xb1<ԓk&?W᎑TeW: X؝DP_n+5ē:~!r8Bؼ)Êm %fC4'ߔp9t~$q2nLvc:on ӊ7ZTFYx+R~=<:b5~cYOoJnÒ)hTY-NEXڱ R#fCGI 75(U-.sC ?Ƹ|ӆMFrՍ2e}ocKt3uZd?ϒő(or@׉KVtig5 1`b3 qE]Húp(РizTSpΛ}&2yQ=`͈`ljki)ExqVWЛi_M0ijĜ24 e/⃭Ala*]zڷ>xlcAsLƘ; .̸BsF:WVKw/}1d/#;Y$Cb* 2b$n]9Qk+aZ_ *E%R^堙O+AǔOC VJ=kl^"Ty>aچ[x`|qw̋k-?[5r9놙= iBrׇ]~&r R z,i/R\&u)8 >eI\q— A#mIW0 W @WyVzHRW?Q:ZgOR.$8ϩ~y DKҠH7e~]V2㋾Gi`ʔK'n d8'ZsqT0>={R6{±MDHªZS7VZ3u\w*j8dc]pʐ\~P> +7gccG)2`|[Mx]MmĠ:۔4w0݀Ze.LXy72 1c]p̝q >c.Yv-e-p&z #@Uy: L!Ff{\wo[b_'U ,ҍU#eiD,G̍^ܐђ;lÆ䆃̎KG;OtRasޚ.$TD8S-Dt=0*gLzh+0+s%uoo$gؐԤˆiu 1ϙ"),.jeMė ٪<2&PD#̫$k6W?ۡλd~-wj~S-?*n6AD_ᔖ@wZm:voFE~Dz Q\<d<'/Jvc+ ?.E ϔl˩c$;Y qo.Ot=_%Rjɒ 0>? 6G}HƧ,-ϸkV + U3XmA'eFDjf! ]ѷy&]1r8 >ٺ-2ަ^VadɅℕ 74c;eoN e@cx !syYQT}(Ÿ5l>Yj!FLn?,`Fk#J]X5ժm'1{ j)qb5fUe!)W)׶UTr, kS9"YrCv^{.g}bfi}EY/» uV*h|j+1|H.R( U=u{r l_'DV: b<߫<#J_^:R,f$W fzji-\XƯ vxrmVOORXRXٟ"sz#갞O ޫ*نM߽MzeάN4;lNPon* ٍz-u=;KAO #<ߙP7AlU}#a]m*G<{J2&fr Px3c:zCQPj~ 2M(ɢ- IcYJ8Ѓ-hg$j7w ^vC-ԡg ߕ[.#ӡhnѯ"T;2]&mSH ²Sb]e1WC-G%u]Lvۙ}>3~rrUsʡaN5}5bؑ3/Y3JB-<$ᮬx3 F* p~8#27&3 0 YZgstat/data/DE_RB_2005.rda0000644000176200001440000017340015162303122014316 0ustar liggesusers7zXZi"6!X])TW"nRʟ$dxYFg5~ qqͭi34ՉU$'vHqw)L~ *b.UV'Mh 7{&yn] _O5CӼ.q6&7Z<$ ƾ +N)n-QhF'̤dO?2kVm^,JfKtyw!_(CutN\-]On Vzp깯H{`IY9?6G+5%Poj!%2pT9K#y|?PWvpE)YTa~Z:,.8Y^3tUؔ9K}?rXhrͩ IFn!*odթP!𿘦v;}p,pgodKx^␉b-2J_&T9g%r/[CjH38 ^ j@5#6#[kJr(n4Zx{ oFX b?Hqyq^lNIPې XӰXPœv!&Ħ`V%4ArRPF)z.誧gќa+g2*ySwqb keaG :nq*,m.-YRgP㭜Sh¸:F"H˥OOz%U ^%N) ˎrD"/_)Тf7R"x S,Z*,og1(ƣ1 e2F(~/\pF+th* Pd=P^ciwDgb7"$ʃ7ydr07`1ӵ[KY0{0Cf`yUid(Jw,II-eD =~_x ѐ)u"%TOťl46āru+,;eIF435Y@;&b̶PB:\ǰ9I *5!-Fhc1`Ab"f##S u<8!,paGTV**؏ 2^:i--y)"@wpX=H?f{s)byBã:"<ogR=yon'Fki@vfqE>hUY͚f~J2CqV|u炏)?5ߝvUfQt~#%5 9,KɓsL=Zr YLJSP\rIrdZy̵x{(QWچ/`xlU4tLNƋ׏H:ϭףVie'Q ;y%BoW)G%:=V)$,3ƒ_òb9w\>-!-U9S,`c9|!.ߚ N{$uZ {0kG=$n׾pWP6z@稹1BBkSB}Ƙ3+6o?DOץr bNШIy}?lq<ǹ\.39#XS'g @~ٮ0g}IIi\+o&qm^ 8;L?Tp۶[ #AH([)aJb[=\.bO| ᷅jq.:jGhU\G T!*Lj1?&u1> 2 -ͳC*U57Gө9;j`$e7J95-E\谶Nt6YBKJUWn,a$9CF8R'&V|f_VG-jPgck.7*Lސ)%RL8RӠXAPu{$RVp n> :3p غ,G"kzD/O8 WR9Jt/&#i2[?f&MM t߫#NBeO ;We_⎤bp8F4MryUOe&n6+# sM|dr~ksXow~1g@Ғ@gH,҇|Y5;bW~8_7xdYӫ\,V_;A.q.ИΞ]ߪz?V:ENf:S2훺(0v7 /xk~sDW9#X%eA̟l)ܳ788ax 8R؎6 x˘ Enn@-:b{~W½hX@'lpTRaCgzfdåXzOY%W'Lсvy殢o ŝf'-nJ9%|lza%-]4|KH+cL#ŏq9v:sYO/j Q4J㰚sO̔m8odRZ1 E)G)u5KU4-^Ὺ}AaMdE_4 WM"5YAy/^Xq:?q56u3tl@B&;xjFQ#m(zAœ}ZʒrTg'xd ^Ͼ ( ǔ:i, -ܒ 튡\aR 2-f 達) Eu #/ecvA|/YG5ZđHYCVѱ}s'Ǻsw>콟c,xLØڎY. AX8Cy]==nZdk6`g*QWxa.QEopŵ_!sq%KhA;V>m77I-KDs} Q=2rVC@3< y@SM3GS'yŜ'_1tɏ$]eϠTT1W˭Ȓp Y]E@LZW7ue0* U$f(*x.#D۵*Kr*?RA0,=>ӫhH.>g}q1VHF-έ<_rqhS1dyR'#Jz5,BpƣldEYt DDoQ\={#B u &D_}Qo!}.^RHǽ x2ѣzã%~zݍ%Q 3Yd--߬@5E~7ۧD:ӑ[&1E FNq[CS /o7,l8/Z*,o{=;RM,SV _('`{bz:@wճ a~?Ię eSy(V _M1NdV.wwPoT`@B)ToU"r742Uw.(#|jjf((!vIRDUNDF{N$29&Ev`HyZ7p $(6]e$G׾K$A%uD3^!W zk:/l~ƛt6 WKDxzKO_۟l3ߊ`&Ljy̕ǘ\SY3CILn_+ .{39!ɕPz'g\ܺP)=֟vnz]u/}JR?'Of@~*`fJ9>a9: 'u֪"W`J摞Ѳϐ2UV?K\41Ak8XߴCl֍=oo7) X{'f:M2@?L>X@YOmL8աɉ^M?}T9߈B A8sZÀi.xp׵hߣ}uXB ;ݸH"8kk"7N ߴ_D@mF-w%Vx.#'y ߾g\X'Q'`úu#57_Ͷ;u隖fvPMLzumъjG5L35"55@mfr%"S>H/rJ"aM] lg#3 :$zQYGܳb#rQk-13T֦ܚp2` F פrP[k 8So)? tM]I ʈ-az!KBZ[)z+njX$!A^Vo*{aO|g%Ę{83rGY>J$)̛eh7QMFIzqI5 z%5E1 >E̞Lǘ11軺CJb2Ov)Yi=׌M.#=$4ڇOZŦlۙo!hك@ LwaI>GN-sݱkf*b$kM*vJR'sfmr9;DyӶZ`Ue7 U)wWa"[wi KehGM7bAZfU1bklfE(os%r$#X^ꛪ —hxGZm/%k*\} 8LӹVJtz7ȒảM6A n] :t-X*d*hMKnkpAQ%ֿ ?#;mpJ߻q\ 3u0 PJ!:q,$lxcz"*_3E$z}pkI¯ +Nɉw\/'RUoa?^WVm+dVD崫ȏV]niߠ<wY7դ!l9!Z,TzC_0tHBI2C_͜fO ٢)% ]$sO­D`ٳ\8VdM#Nn4ҡ.G钽9R6Ũ|is }wYFs^EzPGnosa. _dL M ϡ뷵S,)yu\11*|FZ^}VV"x3E@=rPݹN1Hk{OSaI#pU!Xո^h^r.af1&ԡr7ÔtJÉ~IZ!mgxtU}-བྷm D);-.c ?T˴Uׇ|Mԫ;dl\DNneVNF-yg)֦)f5h a^J*S.6cAZZl`ƙ[ek. ~̉IBشǿ4 E} ;2upNܜ00CG=2y l@,/+`qS$} =Kү*)j8Ĵ"! j)Fr4JΙ4+" zM5M7u$eb݁S>+NE ckǟ(ݕH_O5| eR@B/6R4]!ɯ q*E8 qT EDA;\dק#nn l^^zc-ջEY)|:WܠnйxWP]^{=4E)k86 ǴSe,Bby a,6.|g<45XQk-?=)TASɅܗ kb}j?>G?iT;Fn;Ŵ)oB↓^c\7 lF3hé>LOvJX]c^ &+/ǞG(6ְ֚ V}ո;$rewi[UmR8Bcg{'2.*`|-(nߟYtR w(Bh8 bf" G6|NbΫ޳K([Wx@Z>o9ťAyU'iU0˦"v-Ӑ-XTA_ O-w'z6י^#8H0b`*b(tt7 eh㤚 )mr=?P\א ~r=a'KNZ#I;;dBYvk{fXYMd*x->d d쀨p|.i4b ,lYۍ|!vZKJyhqZnlB ?>og~a؂L0 ~e1/k$|N! ^R`u@D:Gz搱q]1$br`61~v;/ٛ5I'E g[%<:(10C u\VѣbVfXoDB{zuit3q%դTF3tID5B67+r(̞tj;8ψ| >kɺN 驣~0=U7؂ 18{N޲0vV$(py ܇U1349KP1n^382 ٚ(TXb;CeB(L2K?-#' {/"ח9~s"aZLjPDK a܂"ryϽlǞ'^.zhC]4'kl)TL;gd$+rISKF&@TP OV#sTjlȥ[!&Bo0'/sb~+oP)"[4<2tO=Kj)I2:Z],cM6^[N 'Ρ3aLBDQBScS QY9-rPqߝz/fQfFiMe@BEխ;fkǎ˃L&?Zـ%PVANYW`:lԥZ>EM @>X0"_T2 Iȭ ~º4@cM,+*NS&׻~:mʰͨ&)"<46yq['<9IiD}D6ikeߋfEtODmYƅ*$2e:4>v[Rk ѳrGV]*IgѶY/pcQr`G{Q^N[scjzkoEF ( EejL7aZ-z5gpNһ! n9 5Wx{tIfI!|r(4f<99աaN }L} 1Uu Q;FDžW``[2!X҉LĠ_̢f8֪I$J"<{l0I#[ Pl nl?uUIȓ-q1JD~y1fa3hIpR n.BPdp(z@ h@f*=J"-I ٷ9صC &ek֬)<+^pz˔cq_9w9-JĭvliQD&xxS>јNhU{Ry7M2pAۓorqJew(IT lfQ5@ǟTWτ\-60"#2wù16kQ%ˆUV^Gk.8"lg=[ZƮ9CH)]z}RR:X|7u%rn ta-ܱXsKs,.}p9 (@u' Ŝ1Iޟ qpqJ_'"Y\METO KTZGpsX 1rg~V,`tK]8mR.0fCxBS1&.FݕD|5gyق];i1Q{A{Ĩ )1vmp4|WnڳüK"d$Z$9j7Dprml:Elp}:ޥ"[;[YFVEӊʬVΧqWnu9S sAhc6 H}TQx31jpsi"Ln,kH瘸#o{Aq6)QiA,' .ky'3TRϛqOjF"_ X# d8M0L`y0=抐Y!oĘ+DZ<PӬ[Տ9 ߓ _&e[0w~u/9[vdZm߿SBCD+UysMk:? zq5-nc6 `;ð-/0$#Q̈́QI3s4sTn4U 2m"+wF.U&hEoIQo91,$hkJ,cQ8*}4͏ \6੣mz)NfқoO$*^<`dc3XkXK7ԏ;BVw*~ũ&B%XYU4PT.!}35bư:~jev*=C[̷LE\b@ҍĭZŵկA x\x' m-Yʡr`4zjݾGpމ-O މ7!H7NȦLU0͓hQZ̼s5+ n'A(~nmhj\j;LjUoDƐ}':MӠ*v % ,˔]*7s}xV$=w@^Kl\2L۱WFo<sP vbm6*-p)`Tdc~GEC&'3΀-ku{L鮁/[' T![חf 4͂ٙ!xk5 !3f}10DDYϘ=w%55l-SDN^=6ݕQ?af?نJ Cej~(o)g f %E!CBkH" _xBXO%=5g~BSl{3=䜵x+M8Cվ|ΊҸHءZD=Rk֠7ko='< I)dyj5 $` C2Л~2KI]몖|vn9oŘ %Nw0ӸuK-C(AjAh/ZzPbny䖯gSڬ?*OΌ;JvI*Yc(*fm:*|")>4Wjij6JncmJ ĺ/ O ͓jGku*m*0Ow6f\@Q{!*5>OwyT˃>HK"1ׅ[sAàpYp2! [,pp~`!]0iͺgIs#O#M:<:N+RJĿh lph= 헌o rJ6^ 1ToSHqdU*r|3 to ݌1`gaIu~i$CNvؾmWM&g-b64Z!l*?UsZp&:%O\}v ӱ;3:oJq/o24 {/.D.R%&ʱb0eI-C|#-!{%Fbα6÷~"NLGpX{Gs:ȩSN ApQyUdk!YH[+](᳞S_8H]=?&JrAT+.8')j4KHBB4 e0Lء Ȁ$g\6 0FCOVsΥ(#FLWMt5ANXϺ[Y2SwdPp&m(Yݏ7_E?[ZF[틝Ԭx)mBi\FG hz>\ݩH M $p#Hgh0 ]BVga=|JFrK}o(سed(K*Y7m4arnQ:ǻ84;T&RHN1.*Ӧ׍S+L 4^nrO2|.lݩ+ JB*~9U?wj÷[ mc):H3Viׅ 9sҳ wj<>7)xqğgy24 Ӽ+Xҥ 1N{3an(BzɄM&[`,LӾ گ?]tmZo].4<ˍ{1$x2 W:fs &mӑ="!yҹޠ?:ѫ.̯Np ppn`^N-#AwNlX1;_tVӫV!G  ^ N7`TX1*1nmc@UE1Q䥭k5 ;LB"pWØ I[qea'j`)"@[v 0S9ۿf3CZrͧA\xB;_U^S8)aŒUvyk"7 *_)*u= , _C24'coغhӿ9z)%uL[lϝ_0e VVK`ݿKuf\%q)jk4r6Lb'?rއ_4wn2pA9+#6Ձ2mO p /Ȯ/V3>X٢C608G6@&y0X,k]5/٘ qGj 0Ie_XjL7]$oz&dZވ k '3 -zn36=D3vJ&"e,EKu>Cj$}E%2Lֈ͑4(EKBݖ(brD޸*1[V"r5R$K6šԐʮjLTQZ?O\6ؔƢp;jZ4Ub׽)(1=oy:J P vK*,meCWo Eey=227tdu?r*C~Er溷S 1Zn8N|ۛKMh囝^EsUf`o@j|mx9#鼅żU1ӁX[;L1T3Dф,VdB_ 9w<_fEsRΘN ߍ`; >*0^(:g&!~4"(^!|2{e xJJ1ji92f!YʋӢpFNĆZ5BvtE~i;5p#|PQՆ `rimw"8(b%60 .Ū;!J,+O8r}8x -YĹvzΪN1x~WmOj:_D坕Pn阩o9kv`po^3@&ZP_+ş&9DpMeUT\I{xꋽf-Njq`::([-i6ӣaILx/|K@eK5xDyX3ڏqHNA/_p \VLIϨ'U?ǻ.nŐpo gݪ8-z 0Q TdRH-\X'N- 5 xwoSI :A$ ¬*6[j<m4n|\Zm9SeXpc֬ =q;{,!NxHw <=7RqVuZSy4Y^ d^UbדPT jpk*w}>2ai# ob\n4&b4}w$@(Nkfd|ι?۴Ǩ}ht4@] L,Kfo颇Ixp=9b#t.вEf݆PUh)' Y 4>!Sp훗owȾ,F<; _{| /^O6z,wl}laATFɮr@rOmXzG hHVLsĘy&Zyn=NOpDnw(~Gˁ$Y4ȓ`<٠D>eSEFփ-1BS:^͞HA1tm"/æꞹ*JS]!s$AR2}Js}siw17ɂ"G9G~O~2M#8PL#Cw^9[,Zi`Q'!+m.Ø3ۦ =AOOo Pt:AI|Y{ # \)7Yԥ8"HanZʤҤ$?BZnx}pS'د0K-xKi˺l-U" 3vc3V;˽Skbo(ui7=LC ~=+UVM)uDZha6K>xv)'3\O$s@9@ϚH ˩>6{e4[f(Y8FbnoTWbt}Ua–9+Ce>%8P޳XvOj1"nb_!8H<&<"c͢UWL9s;BL4"XV 7|zW" %okRuD3Bce#'imk@ZnK1 fFz?u%e v x7]WhhQڬ("A kq•k-Xb|."cu lј~ :i?lV'?i}5꘩ /ވbnqm˩.E%^\;2Y#rqYx" A]3]wOş0f ő0@#)i{^EE@1MJ;ŪYgΗ*/S;ݩ/^ Io$M'ZE͕*iu4l9sq쥠c" aAq=̻aj%ճԗ~U<ۥc޳┰ fhg0PڅyEl Kz~wѿG ,-+om6oE%%ȩWC`rvq7O2ė({)Gn< ?H{բtv:VÍh)rӌģ)X{ Imǿ3yڭ5\"eY0 C[j$tWj1ׅ ?ʑ#%Sqq56lD $(/8 mUx`LwlIjre'˼.AduYhs2R"AOZ>TfV=.HGtB#VC_ cJ`@4z~=3#(Y0' Xu{ɫ;{`@&?t.mM*7؟dVqt#Q7 ,GmD-11[g7_M4z:>BX,-#Y6"iJ詿-I2Wl@?EZddPxg{DSΣVާ;I=>" ţ ^ j!p!{h N'i4`Ǟ`cJZW//CLDz^%rlh=!\1iP$Joyil>:'4لi`O3&ak@7?OyzW%=SJ#cЍRg$CKW0gb+3+f A1E9R'@YB E2A'9iC*Ij89%xVd]UJ!2> /unr2Dv0(2l%c [>5,"~ۻܡlDXmy/ Y}K =DQ/Dwh4hd@5=m+>V/'*^E}Ww %"=_Gug./rF;J}uzr"4$vϺy[P[d$.Jߓ*WeVRTZXPϖF+[sHc>v3?tH{_]KQS]X.*: uf'-62UtMr'%gNeh_*1j]$Z^o m@e TPՈ-Ӣx7A갭w&XfB?]sY~z|xm v@\&TnzsVA6At50:و(-#ǣA+b/irs<{my i3Ar"$.ndZnb-3z܉mS C?w SF緘`Lv<{YV5czeunPIv@IJ96ō|%IY`&9x堓?_/\ ƀ:hy2p7\8)xѡ~htE0,a4z0?뚬tg[uwֱ,pߑz1bMsUAcKG_ oVb5Piw岋Y$]öU fK ޺k28hc)K_?K<)/zFuQI*W/%kzxnR.w&dNO?ZD/7Lv}ۑhVQ$2dHs^-p$wwZ2SG+CKj?GzA Cg#2p&Cg$rhi0ӤKDžXgӚ~ɩJc}DL)67E_cs*a\T`ǻ?CQS1Y?-lE>t)a[iy)ݯ&\dr 14xYh/'@N/%$ /)1.GL$d>68uͰ:XA&3"̅`dixgO~氬0 f~%d^vTj}pYzJh7V"2Ue^+9i㽜h> bۯ]^[{O,S1EITS2G!rO3m8sqa@_S%hgC(j?bnZXQAEƮ>v# H=n7FznM:y GJ&V9Boyt#}uBܱ.c LbD5Ƞ2FÏa.ķbG6ځY7u1X_4aG̢FSShG {{( SiX=63?!HR~SwR{ͻќ2W=w=k%AyF6t5+_. ,# UDzo;A,\c5qٕk-묌iCd(SDS@4Р%V=̬F /coi;]襘;p}\MW-L[?Ojډo+gO\n|gؼV zn[S}*9<1S883QR_=7*v2" r`svK7O~BZYI 1rtGU9qBaEֈyPBTČے8bٰΘ {.t8T̲j32԰acȓъ@RaKAq-uJ0` Uƽgn XOZoKA8G&񰚹)@-2LjDuG"z'X#4lޑfNWA5 *T @#zPZwuE6tD;ZRi)&M&{S2v^` ϟoޞ Dʪn SP͟]xqrܴJH+oL c!wQ9 :8ai-$sQ*}6]t3&+W|".&8qI1^#j _}ӇfƎ0NU!:-l1б)0) wIshEM_@[G'ss.ֺ(hKA $@6732w;ӉSϊð>T& ^|Ő *ҕ|0 O ] ( 9FdK`qn.#Ċ-G6 ۫+Ҁ=7vnQ2#ݕ7UJym=y[)Rhg&:uW=Uc_AV[_idv^:b(3W.w vWJ`c h!lO;Zgw]X@bpr:߰LU]faj|ʟO30}')B;$n ~kkn'B,*fo[H`L8 OCS:`TtJsD\en!raxO3@bf LȪ6%}(*hC/U~Шw@/uh|{G+%,^$qfҲm+Ǖ/Qƒê,'"x[zK'1RSj= O-*΍nF$K;j7@8f 9!Pg{BOаUmu@cͨѵ ~(ndܘh̺m>i1|D5|2;j .Zq|2ܰJHiVE["erW[OJ %aWNr@fP`,a|ݵe;,Ny6 ,!3-YWa]z)iI#]Z3+DUf!y!b6O*0G͕m*DJ<_@oܠ'J+ ʯ'qgciW>i,$Bl~Ũ`BhஊSF445-kf+ U]i=m.*rX*ąċމ:Ƭ6a6FLWYů=kxԑZ. ~EZ;Ic “|H5;ㅪT_ѯZ}p.|4Fp_? 㯍8&*|W{4a]Զ!kZsHwGb͖l܂m|%ӯDj.riʵ{ѺC|6!Q('& 2#@'&My~3^/2.]:WH#7igۢpY-_ׂҁotlT,~k+FF4Ѭ%͒K n$Q)ӻr2 f* ,bk@fJ9g$_0n02encr77 T!V#+=wQCJ3vlHʖv7A+%U isI+߾>v|;Fb5\cԿ2#í(C~'h"S.7O,WHdKsFBH3PH:h82 ^pd*۔7? _<ߛ#xkdH myx#ҟ9ׂp&:PC u>X'[aTtf> ˢL\0=yvzaW@Cy[w#+6 W[mJ$I,Dv™[K*Oi' N0~)Tyр@W]9B9R3Snˢ^⦹~9bN 0c9j.uZFi7/sLƿgܩB='G#]Uf[:ym.jl=Fmjzupw3g6\A}sŽHa$@rͧ?͚kx,>`U9TAS vKۢPaF3]Lfk]^[*ߎ׳'^o)魪GR"EoÛP6~<0am~DjdsI;+֜Jcf_lF {M|4cЯb] O3 I<D/DzeWNi۽>nƣKoCCu=7:M4Ŏ(VR`Cs5JdIbV;"!.4KMk#7~W2 wQd%i@!R<2{yoSHPdd55e0s%aq L&`#{*[|kL>W*(*rΣe45D7@F:i>qEd$1D7d> ik,m7Ji;6J(#*stfRr >c&ȺZgzWez*;@bR=+2E. JS?^&r-s:" \ gҗI 9d]'Qٿ9*pb/Kg_wR0PrPYZK$ g,|,4+H۔a}mrWI J}#BkyCvW`AT)#v9zT<Wxܩj!4f,']AOi=d5׉V|l+nK4~UKzC; x=!$6YguXc)C*텍:%n<8-ο ?}Usm\X,VvT̥mmuD6|¡ª0]ɶ?WA UZŵ:igd1*딅o˹+p* Uz3ONkYY"u`0Alٕ#Eԑ5rt RBQGnasv,Sf[tY9šDKMdh# c, ď-'ۧT% s G ~ *pQ)%UX~&~- 5ͨ ݬIs6oecgٞ $ʔV0(wu7xHcK80$Ӎ$*rYj:"cK^2|p ]|6hOTOa'#v6dHN+j,c1OH+]kP|PX (2 p%<4 ulL&\áͫ^;n/j LGGƢpV2P)i!4W̯)A`2YHI;4 3@ZAC}3oEބNI^6tOkHyi?^\ש{G-#}8n0JABBnV%"uq{@ˏZcT򆻈}|# vsۏhQLiN9e"ňlnvܰC7'>k"E/$"8%)lwUBzArQ NA9ﲁ{j}N ۜ$un$u@јsih꿉j% c ,^u2'@+YzHfZ v_!&;{>s2܄6׎н[&Su;>AaP*?HNLPף{U'diYԗOMP:B5O!UX'KN}jV3ePFLEQ-b ͭPܡPGmтj6׾S0r /6BE9R4D(|VWɳ\Sdk_XShseM?h~q-֋pğqdZs 9|>Jڷ_x˩OP`a$:yB=S臷62RfLR$b=)7ow9"Ѧ2x ^E􅇧0o-Pj,x-^C)Ǩ+WBAs+T eS^P]9:SGIdqh2~*9pI,ܑt!( lU@:t~_PQL7mu,x}n!QDN.Bp+:Y 2SɄzAߠ/C$h ֎?P ئ.#Z,7ѭ*P7c{`5WuR0\"$a)]T7&:',^nȢ3LĿďckoHp9F}+7{/x;3O9ʡq*$.{+ Q͝˙ݸ}ഹ/73U,:s{| 8e9bE?o) LK1=Jzr!^hR=CQ$|_ՃpÝ =Lg)fN; |% ZNJnNF^Uy$'pΟIU-O6#-d7o<"YJ\0辇@\ ms =8Z1\wwIYN]LEDF#e>3}J4g 8 1RS,T;6$uO) ^ZXupSuF"> =@ AԮp6DHəA1 ߘelﻵqC_O%ߑ|5#~#aW}"gnRgnVTO];a\E7=[ΨEYkoyP3Ѝ⛭7eG:U:JT 09:ΉK«e(K.~T%_ߚCtɽ=#I͟aPˣP5c,PM,8v&oD7'=Ie{e*B|hu VouՑ`pR/k Rق@p"u Tsܵyij y Dj^B\cZ1I//A10#]> FTv;8KJvDI]j9/L8LkgsIeA|s!5al^;! uiȑ![9_b$I -2{ 94V4j ]ģ$٦\KD"@K`BS AνAt.X@~h"aڇRY`iHQ<9.9ǐv31s1/J9\,Cvs}*hr}H'bO嶴JN FwmapkXKۊ&G)<^V~h!LB4Qn(9@٣]ԒuN:R\fV%oJ?Gj0am>oIAX NZ^ #qP[kG5YUn)K<$k pY ?Y "沶RAVdg;9-.L!4y?A.ºX|6@[(pYoOB栤^2i!2wtʆBLG&^* 7R@{Ry5V:k`@)xGq6µI oINVt* 3|3>u,@dߏe[I \>N TF#ӘTb=,S- O&<}),۳A%٦@ڊ7/GE3I#XE j[.ޑԃl^$NOJUV׆Njv~J2uCWZ mx=F4RxX9O+DkM@qhI]d(jrqj RS%2Av]{I]z&󊵌Y^iܺEj!͛}ڄ4|~/*/DEuƈݺH  5Jd2WPO]EIYD)coS*2:j!t)8;֜ky,.\3Q% jk!IӉ|d6!"[C1hQjJ]`Vuvzn} ?N~86]xZ!6{(pcn`Mq~QF uW*:!zJ݌e[~|N֟Xzj@n:Jb!3?gNg+D=SA!#du2-H%jpHyl -fVT⸻4ds(ͯʶ+K^!-E9VW,dg36 &C;1x[Q>^?8?W˷ vzɻ3;aߡԌ@e^P;c;Qܔ?!slEUuy xe8Qg_:!uTAʅޙ:GuFzԑw$wfioM<`T}mcN\ww3ȃu4S>^qj.6RanoC<߫aEBfxa_D`nrAhאf`bN,7m$^3`:8fqa:kgi꾙g& t+;b ݪ,>\[7}@I}OPl UUA6M ؊(@`TSXY%9Gy-1V¯n1 𞋎@`DY^5hnpc?GerIA>KºrB0oŝ%2,XmրҸTrQ}mW_x T^ԅ; 4sW&K7p _ڐp2սڲ HM'|3?vάfN dSxYD\ d}khcFCPMԔ~FxP(]%nTWs8'/d"FB8T3){ {̞]o+8lyFԬw>>n;10_{𴕏}۔ [zS8sНx Xs~.G Ch\NeT*upHzJT9yeɁ@4Ѥ z>md+bJq ~v Ȼ EÀ?s{Ct (^j:_3y]kW GoۈG$"B4J#uZX.vg.Ġ1B-SiD pi,,^5dϱ>dYD1 CϣU` s6;H fOPe'c^b%3@pEh84mpx4Mc0-y!Gg Acf9&:րR@D="Pm!88N봤 彘5]r_4 zRve-io_+AT]+ qQlUOFNVNxCAǝ$}%Q8tJ{ڟ+^Bo;3A,_fEk!iHg5 }P]B0ǡ/eأ퓏|Sr"%-lжdz.jZeW>z.gvGg`{}td/o"Qb#^UoTƄ{eUJ7 I09ImL}ҿy4}[k Q]Pͻ 4m;Lk>}cK>CAY^ƴ6ݹ <⽋Q: :7bh}`bl/nH F6u^g[j:,YnE,8.>M%S!ƣ6>ɢ$~kP8>Fi ].*L b5ɽ %0(ڇ62D.Wد #j`Ag6hD(u gݘmL1o5tGW?|iN*m8gh.$8#Ҝ?1}633ohJE=+t. ڡUa/6V'CBgB j_rF#=T}lRDŽ㊊SMPC4#dh5g] aY:XJ\hJ 9 8cY\1SYŌp:鯊;T\l, c&^i^)&۩.fB4ꁮd9 A%a7ۿ2)\{uQ?voT:wUr)x,:2n2Z43oӓGz*C#oj)zTtxƣC j+>w: HHY+˟J+,6}.}?'?dz)" qZW pzыbRBTkA~Uvq3A=%h($8 ?}|..% KC7f9Vg 7sX[ˍAaۘW2Us.>6 qp(r'PCP7y-eEBŎ^7-$ 0('U$^ ;*'_\$`G^\@EsE?1^Z%fpZ5z3gF#=q/aA. tz]3U_Y@zq(sjmnsJq,ar\]R ,OZ-n>CwwT BLdumU (b+WR:, (GǏm܆V&/^[kaUB~Ky@߭}g ތC) \m4E:0MJVҡd W_g9g ||}*(|e(% hn;;Ycxx(a!Zƥ11{hn=vw.%9t02"/ }V1e.QUakDC6g1 ;C>g[!WyP FY8D V am(P΢._n\֍H ʑRy7ׂVrV ʢt,5;hrsQ$E8r#j+ .혉#thqgq >Sݶ9ɄQ >e$)u-&]QԷ >ZTt77K\zQ̌4=nZ?dBdΆSHQ@b+֕J M8tNd:P#=!+VOk\9%Gٔ@͚%UƝ-8-Q4z !D-iMk=hH ii"O>U#x 5EYY}콟ONѮ;zb P㧗' ]2䰰+&9XjlL)P(0O44GXj#J~vl;L}EgYg̭Pæ0WoHͪr#E6JG[Ecv+R₸WO> *I~UlfJD\ .Do=kSi7! իOK)5[W^6GɀY_='6m@7!\:wpUXhPEW:0LRhu44mνx3/H u`#-}z̖WJE-W2DTC"$(X(H؞; h8O_aJj!Ev?bzLV]FVvA.# {QyS􇳐 } >: ۊ6B˿F4B2$raqg=NQLcK YΤ]sw_ /nhCjS^.ǫϦV:ݾ).9x=:In646&)d4P%;+*HI*a@+rG]u)(@yOnqZǠ&5 Cg؎csI}9;;%tL+^32 -JyPl[ԚտjM`Q,;^Q$@UDAЃKLnإfYFP/,e=$޼=I!l4AX8s1=^H;֏F8(s;GՈ2,յ 3BԀ@8+jLYȄxG}܇^'.AhU¬-"9vڤD߭R]d7ʫyuR;:z@9M,8\oh1#g=ϣYv%]8Rzߏ9_J"VZ-..f;6wʳܖ,cͧݐ?O( n҇XdUM&A"Eчߔ?<UMZx<̶ХUi=6 L_&K;c?⾕+ït%bIt!j?oe2GDK8UAlc%~CQI7>V2t9ԌzBr`"_فh)sA䑣漎GVFVۇ;-p^[?WȂ^DŽ/,EmΧ$ ȂBD 8; Ύ&"hW1Sh'6OTB@FzCȯX0')VY4+x1 ,coo6E{B=K?i( ^Ԫ~@aGU9 7?菬#CY$) kc5]x)3qt1*Rsl":|[b\6ЗgpDZLmN)U<9˃DuT=k̫)k>=5uӔ ʙ -<40{ܩړ0CgS偌qc6ɭcMPY]؆ ϧ N iX$ BV@w=[*鉴_j C+=3~5f36cQP^0fMJqO];`ȥl",)OZȫ V K!頰ϣY9ڕOF*46%R5_R fu,cqM."HȒ/,.{jR 88¬̐:ߺ~=/GL:wn-QΈ{ B{R:9qGKi9 G¤grߍD@- tHuNWt26d[l&+EiBq8xLJ mA߸o63tri[<9hv| z$^VLCԬ_isQ.-QK"&"Kq3 5yN{Ӎ\sNim֌: XBSHM춸l`b&mu҈*FcE (El^b\G hъHv.x`#A&.ۭc`7o KGO7A\9_iWXő(ܰ& ðGY&q~ 9%N$01gwq҉@~+s:>.,jѢozzƬ},p|pQQO|+] HEmpY/W%g8{+`JZ -Yey{D cM@ܤZM}A3k;8IR201䲬鱡>-1qJq `e 9#JYùq W^ wނ3\uyxu/|Is7T a?gexu].Uט0;=JC Qr/ќ(Zvyj0&1^ @:[:[K r[%Un擠m|ߣDˆa1HJ3XmlT-w(C}ʚw^LЃϞni6*%L9o{otA Eǝ#bq?cv9\2{BwtgT`MqYA3X)}rj=4 Vc\ay :9mL] ͦѡV a,_cPcϘI?A惃#StLbtHI 5 :U{d `>tbZVzSC}ZD9s}IO.b)Igv!Eҍ}R)o˫9 ]]-?b3;qGm_GKƟ"3 5sRapn9$'!ޅC}xAPL/@r/ +5O {v-t(`3J| ד/4%h`t| 4I[,,J ?k!pNM2Jy3y7ѕ lh 0stlt%נ1 zS9ɲv Z͖%)c11 NG=5cSOy<ϲs9 ^$ `]F?},_NLa_ 2UWlYRElz^bqXˍo,T^ ;z{vj]d̢ըhi9+}]Ҁ&7>:G՝;t|2ۀ(]MUbN[k=[Kt5쎡ͭn'ωӻaI.],|.b{6Ϭ,2۹C]NAH  I{r0sD]]o>R@t2/8q9MRF1)\K6o@CVaC/XV2Ce]`,% ˢss#-/bXdEUTwl%+>wˣ}4 nKzOҏ۱RJL&m ο4g.6x]?G.=ί.ik ܮlmVSxG >@Fhx(MI!^34vۅRzWߋ{hnSS&҂@1%1:ϫܧ9{::(g@$$u[%C^&[ "/H촻6VGԄa[lL}灉u1C}7c=+UgsA*䂨wٹ a4 @XxSv'ad\OICq |hDSn${*$A5bK${޾GtLLUe*yMI~O/! wE췻~v 蝟!`W8$ mVզwH򶦁-fû95}]k's1t }u؆=݁oG9c7uw~8s=P\:ősB+_LB0創mz qTX8OOWGW:ׅ&.JlAҽ7]ao ⸄t2$YŗKғB^zIGγ[W G[жbBe־tw\`@_KuP.]#ϑ'qΌ/8G$ -GCkc-50:bB^BLџH~{m(\>I_@yJgYsi*̂ T@g6Žo-hXXM|s?:E^4'`MS4xT :]UO9@o~Fi^8a[6qɎ*#]d`BGN='ټ,nqh@'yIzz9.T&̟xOU_D+-c׷U_.CA{aUE #3: MN]ua _.yEn p0 F1;Ť; ˓FaxU_hڙf]j0>*oؑ,H7BSIqP/@uߖŔω4cCI:y`3pč?n' H`J+; lQO,#_Eb"D0@p<~3_ ~D S#at`( T*)0?+Ae DOC#.*o 0fe|tT _Gr*'ʣDuók Sn.]u=d<ZStx ,_TkGT7 Iͳ)#]DA(%.'ȬU^?|w y~xe^ԘlHeX T;#pysFt)^ *Wl2VXeYԕH3Ւ)kj7K6a?y\W-^} d|z8'I2 ?GPБ AA3R}ۺ*]@԰[q_m(XUwABҹILβhźQrDcZo>|`imةBL00(d:'h"xhtV@0ƊYT,Bv$P 40A*>JS%i?(R<Jjkl HёӞ HoY=ȱG˦w[`32ZxMyn,n!(pq:IA =u{U^rPoT j1s0kر 6n659\$iҋu,Q;RP#NЂǹ/b"(ۇꏈ(& .x=ta,5%rD2z\[Je&3fPfm ~rs]{x p=qa9" zt܎Y֍PO]\1hL  ۟2>化']:t}:7n>l.˭| gH˴dIJ JK&`f>seNM$PxzlI_\W./BH]R@B*ymir~3T42ETH))!Xvفm`@.gnSffO=y*,^/rJkoov}0ȦA,`Gyp F%#2mܠB=J 25ш689=fVA\7/$~FzrP4KBVs=)N!!Ŵ2u6oZ'Y0 .@q+a `w.(вrpQ;v@'-W\cHÔ--B.٩Ǫ|q֥E"$A )dO3MoTernV{lnX uO/R)aJo{ϼbvUD7M/יWrgzJ0Qb/J|ĻWƏ ~?vy{ / :Zp>lx[ņ9 cv:X" 0ܢT{sr!sI٫CމZoZW Mۄ K~A nOJ,#uE:JG`6jxlTQ~ 73J+cJD^*.ug&޲x Ԧe4Gm _ eI"΀-|Ǵ4 #00(EL 3^ԃ h?jwֈa(Uq0'&o>(ɜbit=)iSְynTىI˞5s-쇕3N9yWٽK?. ;c)%jkSq?s͘vv +׳ ~! 7D\'V˙LvA"d1!MW ԫOi?M5G+ίJ,o&Q#Bmn\a_7#\ׯGYn=DOBN!:znGUc=EljdQ8g?F2f_B| Xr7&n&[<M˾F{aYs"?%oNnSZ=Y䅧y/>q lgݍ 9ڍ+C=Dan+YO)yݒc"mA;8!AH.V߶H(w9ӇZZ鼵xvpP 3=XpO3O7Eņ+5Tx><ۜZ)5anQUgz)#>ep)^|)v 4{~tm6A_;vlm!U=括/2P`̐aQ*%:[ȯ:?S d\l~P/A,IјU8N]&+| :Z9&`w%U.& E~ 2q'e ʲgq#I#Qd_Z\n%x=אBo6 3G1/Ɵ{xOZD0 ^{f> uVߝ # xmiЬ@5ohy,HLC[KC+& 㷘/:+s zmD`L`LxQr,d$U|%ӡdkLo,@uI3Q'լ3>v%@LH/wc7\isVα7 ~uG)d(iy+=Y$x%D.s9n׃9ո;Ozq}uД*ʠF|Bq>ܑ:ՃiB˼pc|1r>SZ^ (ncBU4Ѽ9dBkV} `^9?Hka$ڸ$m__/JV!1EA.a?GXp`QLF_2<5+.NV=?uTZݻ$W?SJ5HG¡_dMކ Ѐ[au\ìA' ˻g;F9;'.w{Cv,漂1cN`WͿO"% s,+y35쳌H~\w'jwi@33'Q@gXZDo\vY4clb#_}<<غ]:Z/)y\_I3I){ǰTjx5@8O@48fq [,KʵYη7GMДB7VEk{vX n |8mQAՖ/,emKWN'XRp Zg23%]aien-F)}t<EuTmZ&q!fJg("vyxsjhz\+Ř,|U2ui䉕c:Z ﹛*!Z1v+ Z-ݹ7 XrƬuka.G9y&gM"z=#|xW*wZ"j5x5pc*>*S;Lzgc-;V]d8>}U+0!C1I*B}&WC;ϙgx}L8Xs2*y_${%d?(I +YyU9F/ Kt8]wA|Oal[ޥEQ4IZ\Xŵ@.>?Q+-Uёk u$P2mPp0x& E3} )%,P=ӝ{znps1Š8B@\G|#=htj;m!/"mb̬Rd}OO·[Ks޼[z#b6ź<1" dz-7ufCE3Yl{Wj F\t$:mIP:z VY gnp$"wUD(G7GuWV'R&EUE'etqIlf\ݲ=52󈧨 lYuCO8M`?ahZ$+9~j1uP,lÄTe D*gQj|C)j$;VJ kG$_BSEB\ZY~ɳ0"͉ۢG?K4r a1T|!)y$%ĕ^eX=g}`~dQ:^ d,^N;X},,Xx-jjF;u}M⃚X7ʥR5h .XY)85;:7=C?])+տ:TEP6-E?jr8!_-< )Q~cc14YF9ab6w*OxՏ;\|galdE.wUεDu 5Pcۈ)HU6z?\,߱Z6c[hI -fNelz V(|dɗg W6raRuK-VOD\K=\4OϺ 5fv%c ^<_SvRћ2pFv_$_0F"m._UmuFLem#EKz~`&)Sg̚CXa݇!w$?v휸-!)0jm$Ǐ<=UL'u756T2R}sԘi^!8ml`wڃ9 dwgb0@Ugܜ;!e 08OiƵ]]d6RߐWI3lq B#(tdCJ=nyJⰣFZIKS2 UhȊ L~ԣۄz0R>Z^HB*hrQ)/MQ\<}9L5;r>`m!wJ֏M9EdgFY g1JV},SF/<ԍ܊HU@z vrߘxkԫ%Ӷx6|:Ì+Uw5Ǣ$Yh}(' \y#Ch,Z֩MGfdt ]%NarktGbhwhO2Q Wz)FQ[ɑ G&$7,n?-$ِJTvmﶤEHK\7&˺j|ꏻFkဆD,:+~t>7rKXI%ef I+$jc$(ne# #◉jgEZ>` I uS)(PTH>o ۶o" -]⛼C' a3t~*Pn;'ﮍ}?jXP&O]R( ri>%6@049Ĵܻ߯_* ?wu} G;VA:8.-Y`w5􌷟N yߡwJ㭠GVաN9|ۓK5A:pE~I7(cVrmȵy-G ÆQa(D?l/lԍ}7iJ#Q!'d2I[p{.la!慴om8шu+ ړ`kc\:WY/W"]N&ߚQ$c&vOtɕBhP&s8L&y˞i~j܁L }7QLR!" l #DsyZ{RĄs*j_wcyPG0z&?вRl~TMN\iRr@R{*h 4aFؚoz'@r>$%@rL_, 3\ЇLfڬ4\GYx-?T7T-w=ʕZF/mwG])T_3?a&~dCjRZz=M\2`KYؠ7k"*Sڨ=C*bGܨ]݄ (s6}/kjF$oPlj3 [Ir)"Ј׾&v@֍4^R_78vP^*GO/x FY'칿I g}m .£oQ_$8t$s"o&`߾&o'e⯀Vw߳ o _hySimO e+.mώ( L1f^8PFU%Yܺ;^}bn>v,p;Ȗq >MD5)9&$ 2 +A؉TuotGg4N=mSG} OAK/ƈpq bf }dlt! *~2;u\IiarWoF cͷÅwI8̒^ΰ<8jW )#M-ȿkm"W>{N#-Yf-?tvoQp tMP /4dz|GsAis@<}RgAY[?Uяs*Z*-n-.KRH/D8HR>i)ʱJ)?ZԋM߳~2S-S> ױʱ9<7ŵGU˂>a1x=YV=kTN< <1P&uF1UV#unfI ;ISD IѤ5HF)E +]K1{Zm1piC"Lr`7`(WƖ[+|N۔]CdRAŴ.sU};{L[ tHȹx՟`z!P/ 1f1?kcMYNr8dТe;AT-K6Ž>HFİmPs7,[J-I K`seYRh^/+??2%j~" t跥y|OldB9,5վڧz>E۷qնO-K2J@[Ӈ2AlqEG;kjԪ1αab?|iF,ײYF@Q$m@k ';wJ5WH)G7u v74˭־ݠO^a.yVFʺȖ!|P/z>ǧKS6_컘ܣ_uF \9>țh'G=uel 'A5} hV)`uToMB1K!S=tժ{NF)\,Yw #Ts4*,cx C#$<~cIY}ψh ޾4nB\= ,`r7l}k'X ,@w e;I6a E +xOHDB mIrs^Se†*#d{d`%dz@\d}|CZUn{C[`Mȍ(S⋖1CyвHuA|?(\K6_;-RTQrӑIN9 R P-uE)6_e78s(#e 0Z}I| :O/t0Xt`ۗ >vP.Vj vI鏒ǜS,S/8r/@h0G$9>.>԰7 (62(vWw8\br~AZ"{?xpzc>ONKJM).=j`P H ~L"b"8~d9#mg~tf4wZHu=l:Vm/U(euC |a%P9zΞt<.^!.F4A^Gm+A ^1Ykp;0HEE0+2x(4<֋%:-kO'f9,օ?x8p_ŗALĐ[VqY{8 _KWWYrx{a:_+?BpJ^V$l8.r H}6Czd^F\-vj4; <*PJs&n(29q|溊4A/ $铀$=Hz^退dR[,=5FC+o2ʇcѥn [.5{ۘy^Ggz(Zsy{JU](6ݧ~ځob'5XM6dcⅅRy'rjn+ ba3 |V7:bm9hSe4СZRU_-HgaaWh-9^Mc묙}Q p|X6߲٭[JRwO<z.h]\_,s =cJȮqmݼ6˗fvڡK+ \19Ǔ8ػ-dš3ڨ17u TV@^eWk4ɭ+'\qݣwdZo_mKJ$YF9ů :Z^x٭B O1` 8EFfx>MEǏU͢ϪާC5Ջ0s'N5N}ܤqO+k:HSd3IsoZ#p?܅_CǾJ?̴IGc2Lɽd%O\ P=5@c44T߭PQ >9$DF |[ьo7gmL 0#u14mOb( iڐ;m)P8doh=_OPv"Ai>~8nB>lN.j⴩1w)j]9q FßF7k')65Y\XdILvSq_*smYҎrm_}uqpgj|GFo/l\Aj/P2,JRm[QƻߚVHmw"B~YÅϮyXֵX^AU-hWE;-xoL\gtkeU8sm/j (WI[&~mr-9F,oQ&=t쩄J̤@t)l]i'lj+%4% 6}%f8?C7w8ff רJT:rzwTM9AԖ=sM?gȳni1'A 9VrJWgr x9c-̎`)7Z[Ά4NffAh Yȓr~<0j[i}8ܬS}')XRTzw lE+J꧄h6T' }A,RX4G5HK;=yvu$l29i35ٍ~+PEPA0.ϤၷQ(7 \fi8ኝ1Ǚ'KNhĎiji#vޖwu_X=}9bA35N63 wv=c 8 *TW2ɹ dB=a1}N*%3ўǂ+oobeB43$sK?I`轮nqpRx2z0+Uk,Qa]/0,[ !RLEđA&hm{B7A#:^=B::1=Մ|8pFH5<)ATgeNKaNeev!1|3 {k'ᦚ5vFCjNaDaP^YŒPbƃ<|wjUTa3( JIQn!㛜rZ`WxP"'g9“%V JL*ciLhj3̄H#NySV.9[>YuT{\SK%븩볧2Fߙqr{?LRwy2Y?4EHiE )d[#okb֡א^ a}G>a3X+ln]E}A 6!DŽeʌ|w4"=$\4v6- 1㛊l ?˴[W?nxFѐI͊9UsNnv;a\Qv/Ais#Np٩{q^WJx{ljC*5~9¹ގX8{"bTgA; s~U 0ЈNUk# y8Y?0E|*f.HW ȵvy{|Jt|a=bmɉ)uxspHhgz32K s.of4KiG@4] Ao L뺶ZB_6,$ү8c3op|RF#ECвPJ0ǰ7(Rtz``oلsǞ.# x qx)#a"LS\?2_Y֛?W6x nprsjp&ݜF(^yaQ $Yڝ FZ2/ NEA%0Zמ=׿T|8g _{`4F+o }ݹd+rXrY"/4g+ 3X/O.gn6wAkE (?k=g-uò1$14@(Z}{=o?aٟE;$؁?O )O' -?':+E(nc T<gh2dnjW%)}4TE^LeP*(h(xD- (<*7~n᲻PdpiyNR8?`i Q95C=ؘ{]8Wc3Z + 7tGS== _oNN#>S)5rUeYݣˀ>D.wg)x=NX*͉a'+ś{hmntij`*mr W.9.Uu(hC@e۾rp"m\}mVu%fbDbDrhٓ[5¥Q>J3̸u B#WlGl )c2Gt8ˎ^3#DG\LZ_sf z¯ "p'y+rZQJmVsgh?wuS+E/ǪP(*9iGM5oJc={ ڎt~m*Bix["ncv=CGi 4L;Y\KPӨ} )"CY$JMҖ #M ݣNYB@A6޹ k4#;>J{XϤ.񎬡㮓ǝ.ܔD>ъ~6umq}"u:;f{w9Ť lm)ښ[AƪV6gqr;=~O­(n;WxMۆPf'| uDNuJš`8'QXƙW-\Phdbli}(p_jޖvFtm$lKȣS7du! HUJV6 -(PW_wexELowXm`-7լ%9ֻlHiHrnV6c}ȱ7B~J2i~~Z6JָS >%ظ\o>#ё c5 Nf0T+HFCX9kl2HB^In٢iRko8SQ_cW#6/s.K=dKzg3/BgE1yI{`NV] P/ ,NcDEk_ΔAOvy<r)a,äW.zrgQM Y&;ШsZAld4 l+f'B * :6KM SF9>v[DN7!1?.oD5td!h2T F*VRQ-o] `8N t#Ͽu"YŃX}B4ԅ8t{PF_Ɉ:nV) ́?i=e]s~a6W-*80 Q߉9u v&>zaI :m:Nu`qibfRW}fz}ǚ'))' 5|w=*mꭥ&c~l޼=\[J3t>2Ҽ`gq &+$E9“&2&13A}g-kwkn"u]B!6.)Rk?9`mJJW(|cRSTokak_KGXr`EmٕF[~Z/4wDj9&w7qt#Ŵd"GdILqKE&pK3|Qjb@Ȅ:2o'q˾R&UI' N C}zm}-#.[Iʬ399 rn ):pԙ"<2xם/\9QI yֹ`E׍{kޓb(W]+_o=SJFTʬGO:ntRjoŔy[ӴUTZ*1VhiA@kXBZE1|}ЂbxO10O8:vH.Mm7-FG~70 1䌇}zG'" mQmˁ{lO~ۇ,Y-t\A(F߱,>bVYpJ;"?Kw0BAm+Kq4 e*&ߡ! nasĭ^ҍJ,!Ӊ skRQZ !CIޗqEȁG&TU/C1MJ3̬R;r֌Mz-?Ȍ>{i JPsn ;2I,gFr H,چ\Iv=4$bNh]`6~lXJB檤*oPbJ8ꗠЕ6+ Bȶ$ŬxA?$# "S}b!l922V(Z,Ȩj_0?h6zYXw 8d %(wt@Zx& *?H @~Zt?d: ^*5KwjaFg"w`4{Iu1x^heJ۱%3S0[xuPos:炭:x @3+1\ndD8y>|P,>Z/.#ZL~MaZm .~}RBC|6e~^U. ݢHٻ4܋n>~sr掜Y޹x\aFyfjmD0Gmse2Ha8}A7Ʈcb9ht?pFlŶݚ0(皹D`ĸ>(, acv-`{ڲnGܖX"ĺZ5(CyGe(5#'30lg*sT84'Tw"]g>)0~ճ,3>ґÇ (%oG>0 YZgstat/data/wind.rda0000644000176200001440000027770215162303123013751 0ustar liggesusersBZh91AY&SYXBƱmIr[vwH" O3=P/{>! >E w@)|P""( J> .cETH wTHP_ԝP R`pTq,HH> US@ QЌ d&CAѦщiT E=CmSҚzFFAi =@4dhhSDJ% FL~Sj<LbC@ &4Ɂ LCM4O )(=C@44I$=4Ѣz ё0SODFi0@ Mi4 11#@4 l%QP&$51GA3O!ȢCL':^:{pvPoU.\'[~A?wAhcӭki(k4vH.YxL۶3j;RR^+tB\ iam^@Nj73[%׆{_reXq{Q8cĺv7s XsNKJ .jXV6 :9QQ9L[#ilCa= goEmGO5Dƾ\Gdz}G?I{1|:FUs}b*|NO^#z 3 gDv ^bcmwa6p!3b{geB XFg3cѐ~(xte&UP~.º.+b0er 1i %7^)׳+n5%qpa >Nqű蠍*, UȞ}Y%~Z n=m^sWM> _Ix߿`ZGD2rC o@McCF8[/6;u;*_ <{b.Г}0"XXO1:¹!@E襡#9 [+ٍ`t1O#fa?ulsPt_*𞘊0/8_lng'A#ޔ4:Rw рTW){ T҈H rbHEMx%Džx{uPu9 {crv\dQ >3;8F#FҪH ^}-ܤz *>jGoЮ'P?yx'=UqS1jNRU@(sZϐ="@{ڢua0G{- el(x<3%(D87NX:o#T/O@Z+&1z `7oNאm^=}żu+l8ЙL}7VoNn!]zlD5`!;{ >F}GLU$*/Nj!T,{XH*HGy>`m´QղTD 'D%f7 J|±]GM&>b%/}g3dʶ(UzK}?Wׯ7AV߿}zy_ڰU]5}O&ݓx#< Ѷ~u.;:t3zȑwvg&k..,&!Ue?^E~v|_pA^4>#EjdZPTʸWl'|%˼8_v@ t~k+7^# 'Ф Ǔ܉hrQ_IhTDzBuTA_¾\1j;8 qCd&eBg+v5uwy۞5_PĂK@~wF&Y>˔ۃp786J[ZgQ[ڜoNƇC_wvYfS4:wvLToz=Я~\j#7hP0:6ʘ)rkA\p|~vRp^5~t%*p_~=4~ݩͿOIk7DTy[vR1ɽ$簽dUb{F:}¿&;_ƸDl&&dn@I?$e?>Ǹ:ekHz;_ύOz+oI |ton:'ӕfPuX{-4/kB%i3 ᵷ ~c2TGw?Hd=Piިo2.q%$ yu$^)ڍ1~(AہKgF}"N2NS;Y5q؁.ؗLr 9pG̻ nöz* 0^|uei J~kվWM׸O&Dm`Kj?D>:l|#~~^9]70TX l~ 1ݻ륱Mǝ҄'\q'5M3}>PU=ͤ7c?PemW|C]?} I3ܭ[*8 BO|zfă#о_ӗEK1ߌt˅&0@u|h(#uB'Ήq|3AA|ӠohUͺ_dmyrZ!鯎=ͿEGq)oqLֽ*5=Uڕcdq#'xuBњaهgpgDtdz`/MwnWQZshX.vsZ=/nbω94D./$*PU~8=C==kT!)?]Oj1xFE+۪yg h{nA${=77 IλPyz;3;pnr~h}~Sx.1_%&ؽ zcC~Դ*z{`S`PNdRh &k| O@:__v)jK˱0LUndÏVrmb1^R~ʞy?~NAzZ#=|o3% -j9ߗjIiOD[~ޤ /﷧oxЗHtBeTEw:o< ^q-:|?0g!wom:ѐIsx#!w`*xh7S,S:WpSOwL:nB4!z@%|=7Czr/”Ҹ tx /oCJ'oǕ|IH(wOHM֟#0J8np RWj_<+߯q߷ 7lӿW}`E6-_PzȋIQ׷י|:!z{yu/:g?^e2#zߍ$ U_}}E!JtX0:ܺE^B9=$CՃS+:d˥`ԁ6&?W^rQO)=t۷טԑNz}X=Ҍ&K~"I۟BJ{x]M ѷ&WַgBcB^?~ŕd'VߎE6fЏ~[^G׳ڔrpwAiD- 8V=&O A7V$pI N(Hʣ 0Z(*;o x~}/WWbޢ|^x ۻO=SL8!ӑG2*gɴ|`:ƪ~`H+\'62&lXzhTv%LidQC~[mEmۧESdq@}ҥlv,G#" nZzib /Bi4}?'svc Lf4I`IIL}tS@#F3E A:Os2d~'_sz2gxRfd{[[^ZokZKLխW|)-lk}wUZ_|[j[[|~Kk_CV-_kUJK_歵RC|m_%U*GU?'|m_%mmoWԞ|+mTk|=ʾOֵTk|_WƶJERzV5}[[S$O_6~Zԙ&i$ffd x^}w8c/?]ObzܓG'2wy^Ǿ÷W˾$2d֫}6֪-ZվmojU%[mݵYu[X5Q*-kF֬bƍEkE-QmX(QUT5cZߵrZjXV5XXXڱQVmE(b嵹+TmFƋlh+[mTZFsbQDlm-E6 Z4E "6jmb+d5-N\ֹVᵓܴhr5r\zmZ|mm-5mk_jmVQ[Xլcmb[lkQsUVj-6-FՍmcU+mb֋lVƣmjƍlmXZ\jkQ[j6V--ElZ6ʮl[ljڵsV[XXգjhklm [cjkZŬVU[FƮ\5i6,ZQVkbj6֍XrְVIAչZZ-F-b+c[jۖ6W,mrmVV3}µ*[jZmU&նkjc^ZUfR|jͭfZmJk+jmZ6W]Uɓ3$쏳},fĻt-*Wvt-ۮ۪J\*Fjcat&Z۷ 04S`ŠXn6pfۣaPnmda[[Vxm6I֭j +hg/q d:4Jd3P65v\Tݖi LnG^Sil7MK[,!vCَ<ʗA)/Ѥ8_@3՞xTt$O.҂Ba#֩?c׮pmk\V h`S!H%`ȫ- 6_!X  Wz3j'/UYm,;%>Qh : U^UYE])g⹚AgrdtKbTOâpuarBV8!զ Dv԰d2.]Gً ́LbgBouj([:sbῨ KŲƅ B?X )B>z*1Lip4/S% `SΊLV/2Y>3Et~ٽ7A361Zƍ mEIQ-cFR&ґX,X(F2QDFئjj4llZDTElhj6hhXvI`DXQ1F椬hة*Di5F56,b6#lQI"4jCY#I4#AI QBQXB5  ьbQ$dUE%FѤIPRiM1% dV#ˣ&,bLh(L 0 XAQd6 RJlmID&P(6"EѤ5@lFEY#IF4FHi4H4&IAb4d2hFl!, J4CKH6J@(&#cj1i)(DLY)5 1d0rE$IQb*X I6JMLCHZeFLEfX`LQJFRe,ibH1DQ 4i64dL j6 1RX,Y,F*3J !F4I0hK%L'u`,M&DM+P4ED(0DQEDL"-%&LQb$I%DR1)LQdؤĆ1I$RX4d b@)I dh6Pccd"@bdHQ! i4Qi %ADɐH)6L4bLX3l2)1HP M6J0&i`&DICI a4BU !3DM SRTLBC,X#$%"&eH!(M& 2ED(dcbdu`KrhcQFBI̒!ytјd́,IMY4DF#E%6 A!$CE&4je4L f5)##ƈDL\FF *d. 1EH`(PhK"Y!5# 2ɑI0\4<&(HƈhHE ĽlA$)ȆhQcK,cfBr$ɆWDd%Q^둙 $1ΤAf.tb&#!Qcn(I0FJes!F3JEMݹ4^tAzC4!11O:&6f@@=ݦ $Pđ3P$I $FWf!2]$d+C#1"204PY{ЃJb)3(]"&12ADL$14fDe&D(HB4@&E%&$)1!=y=ƌK@H&ILY31 d5a2"#E.ib\f F"K $^lD3DLXf 2Ț^u3]=֙13 H% Wu{j`%A1aJeрćqG/w!  1F(IIle\FfڿDm_V֦VkUkUZ~6µi+kl߂ڭikk-m]^[+m[[WUڶ[Yj.kv[W[YֶVmYɒI'cׯ~n%nސ#dYt P[Fe? !A'O@Ang> VRL#օkqxX^ɏ/x٥??G#8_'c`J}I0x @7o}OكآK j`fO6^EQm4,+.?ox ^ 0"߶^=sr@2wDT &PKx0avm#&Z%՛LjXRJbp3`|sܢF]> ҧ&NIcm;H1(~WHrsI$/Ic_rkt V1?Y~ϙ4(wַ{ge.5mxKC6eQ#:. Ͻ% A7.Ǝ8x+e[^K~d(uЃŪX*#Q;eT"S[83Q?5dI?~.(4OקUY0nO_dr/lh#"&R[9 d1P`1u%x@/}8=3i;ߨ[g")j<Kf-(g䜧$<%'Sڂ-4S4@O=}m"s7%_v搞kއ9xnˢ}yq򙼔!b?c+q~ )cgР3&]206ybu݈XkhX50jA^Y~#2?`TÇ_,8BBڇ4nGO/㽆+3U0>M[~L4d 8 + % viTA eQ9z  {z@QBI!i*SR޿L%:B^?gT՞yJYI ڧ·TиCݫ\TeOH -cm?oQ:9o9׆MS%:ǾaKEaM͹+#dnKTĪv/GҢn}M͵f^\y2k>aSuQ3/Ee'޿G**i0S$( Y%S!L(P!J 9ɲ% )` BOFH`)P0p[gGR?$Q.Z wѯ{y>%'} u/NؼG Idbhci4*Lds@~'ЃH:y{#cz}j|d  e e BF&" TsIQu S܃3\2䷆؀MV߫sPCk&So!{Jh|]L9np"u2~"sên~"-Bq`rf/ ^kx?Gz./-&p4!@v[OzƪNt)Dt5w&x^N8[ *J$!%44` mc56!VcafBɺ:0>ڰ@œ$fx%x\:a})Ҙ")] LJ@χU HJPIvF IƶjkMzkHaV`\2@%c|4"i=mD+sr CηHu14PO;(*Y)d@j!j/y" C<jr-_; N$BЩ&L.ZU#c]oGC?bNp'ۍjv]Bo)ym v%*(.1L‘T0m@RB0F4he]'Og&x=߿"W:(K,.]|.]1+ ȧܻC^ruQ0L1FIm#1dw6mPѹ*g"7$lJD8E+,P3"W* NtNXP[5[@{TpE!LKZE5  E ͪAC _KlAUjC)EkʁnRu1'-Jg$5'T7f,p&Un `ZA,))@ XW C'Phy~$7/aÝ(9m-ʕV`5 bxZ2Р٥h/&)Nt]= Gbb\ddSVp<h'eZ-!/f¥rCWc\Q-ɹwmYYHI'h ((öX)L\@eD R%( :NsQ"Ng2Sr`#9LQEeǠ/aœ,𛤋٩ YDsw)# ,፸ Dikښ-nIIC\* C[yl㡙]TygS [$$͸_RkJ%¡̤"GB6K\Q Ql]y2, &VcſCJXSB(!R ~SMND.9ADWa&: hBPDD ]+IM0ڸl ;UCs)-)3[Th8tXFTz(bGHL`E%Ӷz #K9{5 w)0ХSj D|LRWPے XHEmZٷWkzCmFhb{,  i` >А t!iFHmJzpɛTxT|9$Ֆ 2$_ A9_t9j7Ĩ'؍hjݶ^oGUMd!ˊY1!֔*X6L%9DԆ޹1t( x'("Je8ƋX0IKN6KŌ'MS kQģK4qo[ (kWXiEbAs;"6Ԑb*E%NhRVF+iفT'mTNtAQ0|K 53 hj@Њ)2<]3Ufu8AYHF<-Xc2۴әI( n֢qK*gT[+斊HMTB;Q (!ڳψ (KlMluNpL yqD9# 't,@Ѫ0ZIwT DB7SJh\3Jn&~w&BF⭅|hl,ːɩ׳Y;VA cMJ pOb#jQUpE([) T4}5dpsd>)@9ׄ`ia%(рb f31YN FР@>I$SLHĚ@ttԴoxB>*xY`BbGa,*FZV%OcI.ʓ5ڇ:+aTE1+E+\A*IN6,QubmJxF%RZ%%cl0cbQhPmXh28YO_-JjժЩVDVuކ˕IXZF.C1{p iCp TH!Ϫ1i$EдCg[ ohF `bꑖmL:圪կA*x>'ԀeQ,%=7Fh)LWuXbF ЖR!2D$2 21hK='`;P`J`d yRXsUh}=7u0zhRJEAt)ؖh8VF{`p7t :w ldդPB-U <Qml`Gj :[@hdX:QdqWUqJDU⨦; /D1+erX4FaAI! 2&Ƃig.s48uJcr bls41Ց`cPaK3t5H1@xIwBVv:lIY2Yf mZԌ-R$ЙX'EÂ!.u攵 s~^Du$د͡d K&$;mxf 5(G$*cZ!RUNٹt&[KHgb4؁I"@9˸`(M ^H3SZPRrIje5aUen*[ԽӓhY7dCb\,IDGIH[LYf%6f,:0(^)如FUkh$F2T{bXԦ uW;Y",,kAm‘(ck@ (MʖE X-(z1#9n%$,~**tޫ MTZq7K3'$W',֝ M$5 V LГjMT" $UQdӎk8kf2/%OJUG5@C[ !wSx3Z4j$ @=2u!bJ3ݪ @4B/7-35]lq03a$,Ao '/I3(f˳9`MEİ׺#J ;sp^mFUzgDn#D `OJJ6!F7:ąT u􅖈EV(Jڎ\}*qݛhⓇZtF-6+CffdI>)&d'0>7DMXliF)j26.J keMK1M&ȅw\Me3 LaFYrY6 rdP\04v)mtV3m je1Dc.Ŏ с@26mYi%ZꮺPvգcP V4Ke-1uصͻZWM۱e(Jm6]ԱauCmV,MT5Yt]V.廩]#67mٸ!KWml`QֶY]M]B֩,mZlX˻̙$Lɓ>ɓ3$7jjokmKVS[Zmmz֯|I[VVڵ~R>wUW;mW-j6jҶ=ڵZկi~/tWuЎqw\w]5;\"u~5U_J֭y[_O65MVB2OWO'q072gkL'q2fI7z;r0Ĉ2B-U۹H7*zFDGJi8x2*4Ty4l7FA_LE5(1VnȲ^@nKAF;"""Iu`hbInRnjBM^vH)s2D2KTBjr^~g $乞N8%ok䣥\۽нOdxKrf&fdI*Vխ}Eݖګ|ʭmj:m&mV} -,vl牛ӕ6GEy7iΆ\Nzݺ "dȨBq,Tua&v)^-dުDXn̻4̢#5)+2VH\pܳ *rR[l9RNo-وtm8e^@)DW[m8H:@paН:"2kwzXi2SlDдKVܛ†]eC,B1Yγ͝3mhWL,%ЭJr:ae;MwFOtkr@72˶Qn7`,tBT7l5Y+d nbb&$RxAywȡE:2eкCwEdw)i! Y-F{ e I&nt`tjv&u4:)'آ)˹IT{n꾕ݝȅp*@b˒ 41 uz+X³GMn \jHTAh;M+Ujld͇A64{!;LkQ{FFQ)ȡBIzb85å9+X4Vw7"ٲX}+ӷy3qiה65Ù]ۖU'pܻ28( \t1KQ llLCtܗYa:ͅxVc AݺrՑTlΞ9ۭ?I&@2I}61o-W \u+sjw-汶зz95b/.nQ\ @)5Il1dDS *-BY*w"aXضk$YHI)2d kePpEZ6 jJ$*[Xa\ 0HV , -A#caF %k%UD , FG/m6VhB5 nBR (aaQ#mlIrdlR"Rж-1i!-e6!ih)LmLmH ZiU`[HЫA[(XZܲѡKerYakB["%T)@`aKm2QQY` 5VFE +je(VcZa,%[B#nVY.4* KhR(J$*QUV@JAkҹH,R,I@%mmmZKDr C B`2R%@`ֶVV(U,[mۺ bVrV[؀e+EmVYX+m`T%9nƭmF e7-RKSLU֐RP൒IA[k qk. ͻwm٭zo^G? s\_zYkXĶ]U~н_^tWr>ǟ? ?H:x5Ct Ny@ldF7ZPwjGpݖ3!!&0 19fJ`y* IZW]Rm!AT![! [+V BNb0j!B|Mtm6މt{V:ry(c7~y_7{gB.%A/*:/'L3 жY٨ڙ,㊶ȎUS;?8]>1-f_?%0KTZd2&*ș/C, iOl"Lb^kt/L)5 c?A3qް1MS:=HI= "=k[lmfI3Rp\#g#2ၹ  _јX״B[%8~n}l/k-36?<ޞz?Jl&ǂԩ0Hбߺ'nIя:3]=EE7Br~Ӆ >-?R'^"%cEITp&dQ}7ZeB(~l|Ϳ?x4 ~\'Zh"]Ji)3f+b}c8HB"d Dpe{ _Ft`ogH?Fu0ʃ<9N(^10gу~I MQH[@dU>]bM} )ʷBgR>ET00}P#0J|^ҡ}=Oe{K5T0PjN$MOdT GQN*ET҅싹xĺ Đ4n3KiF[Dl]p͙7hυ6(=sIQނYva ‡Pٳ5LO\j-j~md+,EO &aU|(~Q ~:~(tXDz:_/YT{TpRZW`?ʇ #hL HN`:,Vntp큸{R|LX]ɂed\wzzD$r G;@ Ɓ..ddjU*V⾨pZN|O%Mͧj`$ ֔\iߜ;x:XGw7 W=n׎w$'0m `L'?tdn\=| $Q^!`PjiG3 /Z IM >3}WERT?$.Ox1q Qn@=ד]HH̒&{ Ff,$w CF'\V0F?Q'Nʹ)E6m\Nn0Y[wh)/iWмvI`U1`#%S/a pĤp\:֍DBPIǘ>֪vs0R0O [ZVF?OW!{UHOg$T|p=|wc5TVj` iN^'ԭ!oօ-W/s}qN4_THytU^ޚ\ Mw$?4p)Z5 8㐶N.{l7lp0"lcow@^\:js}VH{m| fY?%?- fCJYK1,?o4h%v7X0s<'s4! 'ZG`UhLifS`+RKGt_c1xbHD&߰ՆcQRu#Ŋk+S]e^>/M5s޵Oce$fU< P@hOpiW+/>@eyFQtKHr\fvG->@  nD[<A^N]zϭm| ql@I^_dLQ(^EL3E0K_Ԏgo2f4m7(dV3uٟclMBRw̜gozs_eʣr-Լ>n=mcTYSI0ngf}M%&& !I{@ oZL_ !OZ| IBとQ.m5ÁonЖ7;bNc>JJRqpg ! pöꎘD%74Bl#BF M{(#Ե#}mwk5c$gh ZZ'*]Y޿s@|cubbzw@ؙUCLg68[37~㵮CG`'o^I2:pNTx馶Pfemˡ#  헸vFgnsiƋb kTF$}M X6f!?Ra"v" u3jJTD<5sΧPO@ &BSJWu@ȱ0Y8^j5HFiPB}yE=IP}oP,\H]~*}6)u8]2m#2(x{SNIZ.}G0|-Tqr02pFn!/Xe@$@3Y1,)HㆢX^4/|C-] 2k_8633= Z4FZ}X>)/Rq+* a"&XR?e`8.3dRY!! ޒKB8D dʇT8p"/Edfte`+Ag ] u&Fڸ H֏S2KsUer  뚊}'{AaؖWh85ksl$c5+$.A7< x0px.}< 1Q1ݾ?1P7 !Zf{? 'g>p3ng7'| T{w}.>[eVcxllkt$5 A„+Dz9%'!H<)D.ěXE'Jseîj"L3#gEP0C3 N0]>D "1X#!MH!:KV'W&WP  kI> t[=gcrVCfԪI6?tQ|o:><K' y^m*^2!LCEAB$:zR 5a~6ZG&C옡m[Oo߽PHoh=GӞ-b gnmDJPȃoO ~"ώSC) l7xML:绸p/3NodL1rC^oŎG%a ){ VA9|X3.AcV24 :" 4Ȣ0b_d2v&"|_ "Ay 2Đ5|lw a>SCI.&ВlZbY+ƁJ٭,ZHyoO,j# a<$_zTeO`EW3;Tz(TMnu/qnLf͡pTTP&*a"p K{'ylSҬLkF2TV,oLq(C1&nCbcl֊IJe$j%GŘ#TgEZ5~_cAFVV˩gR9&"ix|2dqam~(a/, Ra+NhFlN"kL >#0AmöC~mJPPusf鸛SRⳐg^ġq@T)bFmI:skh9kfa[i38`kr/2zujVE Y}2_Z_` ew{|3auGbMє@}wrP2DI`J'?MބPT(>)~(f"bdD[ĄT} RJp4wt" {Lgⳳ_,2!#z뻹A8 ]XK6jN h^qfҵ?Mi5j +ğo[ 'd@t騺9[Dޜ3#i+ƃV-FsE䟭!aSΰeH`<ȑS>ˣ{5uΘ¼S!`$Yl@Ń-mxEo qs`M  $,e)x%,68 pp `qJn| ]lb0cTБz&51"D9nꄐ(VWngڸ7rZ.&.R0"Duk^?T{pX /ߍj˗W՘c;,ls(b PL:cȌI [u`v ۳|?59: {sx~o&ś,2ęڑS )d5!͕ӘT`Hi0:1>U#4ޒ& @Jp%mo<X蚛w3ZѢx˹/wT;h6;B((TrRw[ntYPdit*kZ_f , ~1Q >ۢFc{@&{raKAA (B.$ ѿj92:u[7xIl4+{RPft_̚5hx5[#'p%Ģ̟ɡo0f:bXB NuMq8EMPC@0k%u88Z/)ieFKj69D h{ª4}Q 0)D¸HѣFl$5/vK !TNw 1Cr#(U :C p&wwd̖0)CiPlJn6w4I~#ĘB,n*1:ٻH35+t:'F!sBBOϳ0OqO[3Z"p-("F5&IdBC>rCBp%P% w/;~(ԧ[8⿯ 2 'po59ܓ6tB5ӑE* pUL/QC,)94Fm[!20\3.WQ$QXR$sETOiSzY{^aW}SwNliŝt^tf6Lgj +;yҘ> Ⱦ X6*PeLd8;V FJbGKl9ys:؁m@ \Q=/ظOLqH,z@ [i|I.c)^sd]f,ۃݶ˲-i*5J= $2}=_(yk72YwJ7- `~DMP: K3GŽu\1 LƤДL* إ+IF W:eǚ9EO6Zi;J-[KZxI.Kxtrb|SY>#9y!!7Ik(:,{ىIY=RqB6*.iI R.L-޿%ߚkF5^/Ɛ u崕B>0=DGn|uV"AUᮢR*WV{EF@;n!H ܠh[aNUߊ 'MsXtŹ+NP a L`iC;pRw`׭eׄcjERZys>=RSR+{I`8:$={x l@Î߳VVk 5cb"oxs}\rDzf6Y- ͵xgeT26l}̀I)eKpDQ{X'@ZUT.^Nm7BNb$ 6IoLJQm-0o|'j_>Cr; Xqb4ungÙ2CXՏTRPX-;3N6S8P8$Ee2ڸ'ŏǨз,w扻9 T`@ I ^z ֱ(Tg8`K- m  ٷ!հ];}[]t$l'$,g;Qbc 맻hȚB2- rvh}II{w1K٬ȕF7 8^-Ҫa` 8q4BzRJ&iAMYu\ѷ-41F12)Fۂ?ݠ2?;W9&. n<20M]ÅL_|"`CSf6pu&™=fL rۡ;vHD薾b N 3B`|VI.aU7$]P2K1FAs5pB0m=nb=WQؖvSL&*4!LaL`Ab*0IOKmxI[F$;FuFI '8EHw"-DxA >Rп1A<X]|[5imG¼qC4HA4d.-F7ѩj^oJPXnIwf8Aga3PR˵h̒ 5#b$UOc349qW@pbLll0n_@B¡j=C_CR&r{XBjL wYL9Oug+G7[cEs&drry`g8Cf;@lDFRpLiN -2g'ˍg^Ok㰯 ~5ϲ#M2HH/23O.49nVM#BkC_:&5 %gw~U*j! ԗYߊY 3<@<;ʖH#|ԛ:g!{@Hy0H BW4)uŎbS ==C>hgNN?B=SgKMy]/භ҃ЁxhT."*JZx4"~ה`QPy݌GS*^RZ9S;*IWhKҾS\H[4};|PPZQ 0Ѵ4 G#2O=ι-Pf]1HbEYʨ*m}P݅Dg[% e;n6  gObLHRF$v2ED ET$0d(~H=/'BJ3h6ݨcRݵGé4l!b" vʗ5I(`ǭ<ÕAN 8edQ8iډv>2LjQ;&$ كE!ʑcI)8ثX+q5HR!֏OZ9RóoQ`=a@pϪJ,Ŭ%O@*/S)m%+ժE3Sj?Q\Zg0*: =n{ab-{wG4@C-$~Oάr)PEbU5B(^ al(}x.)<Ǧd 2m_[[ߎy9ſwm|/YC[>u:sSX#7 @&M/Zp%Zq=r/P>"+W: Beߛ(5P9*@AtE;rtJ{B56@Uʜ2Qց+Hc:Ҋb 1K³<5MpMkhad·|懠s2MO:9 H"( j. ӳRM`J 2!$ Fh^ǡQ6wpJ7Rġ̏T , Nd]K[K2}º2{ᢀOi.T=sm7'6%֨..CD~|kkvz d7uAeMk\*WA|HV.̀ݝn  #aKز|C/ϘFϛm?9mA+:D.g՞R%hjK2D,X A&~D[Z._ǃ4FH,!Ev4_\3r׏ߑP9tMts؉W$WTFR:x.=+`rQgDQzY6`q/ro(5'=)qft荣&3Sm7 uARk jk c5ߙpW1w0MwbѢh[2]@ã 6IIhIMԯ)A]JQKDNQ=pc]0lC+˜fRFMCCj1b㢧M4P(xD#؈Ȓ[RW/JUNY*Ε}{ 0fq(IBgxG =&Ȯ \y"0&@UnO|U*~%a.CǤ&~issS3 ŠeYZ`F05ً۲3`H4Yʸs38K߱>yu nI 'D:+ t>^ne?嬌9P~CUȸv%}9D{9Ȕ)7XVw*&'Q,0*>Ns%}DZmntf_SW #k $9&焫EiNKPxMd  ;yaBEx2WLr>:gQKhS&dq.nDk1i~ ^'Gvkç4BԉA+[q͕\Ĭ@6}^q HXUA ! FqkNyL#\rAawhY P,Η N!d<ri4zwsk,sfw2jTrI=,mv@ 4ts;+7bEtF-`e'hw! Z7 SbU.tY/ uS7jǬ]f<}bM`dcpp$ʵIVk46#QTzl+1R 3 MO]m"?)RrWgI/”%|W|?F>yBpL.Ke|zo^nZS*!Ja‐BTmar\e)n\0`mn*'3^M&lB"䶡U8bl*uICgq%MTrCijHgf 'h10ALJ0!ԙ!%Oq_P?`ԛȔH3n72'&6 #C03@7?n3><%*z/+ })M~9:ʞ "0VDW4{+*' ">PsґpٯQ+5lBxdt"qmqxmN[q*r@'f[wŀx5$Y&\MY 4lx jTWaw$NSGS4/w;5vяesGQ& (I Aubg2LRiR06 QQ=XѶAu;|&C2)zʘx4PbgAME~vx<0u&udt.b[kOe.' 5:<7ҁģM*|A箉d >GlAsi0081?O:jpʦ~ o:t#)5Ta(& RBu梴,!%dVSA֭q`h #9|J EɄZ%ЌxtH0lf6 ++ CS1bpMH+DE"Trq'Aހ Vώm뫚/OX:YnZ']?8U$X­\ /~Ȃ9Q;I݊LnzYc~;PM˞sH#LLO:`zn ŭM(E*ܼg3F:RP d.]TJmaYTEPơP`wDr %Q w +kk6bDFQ(xyLMMREi8BA.qv7m1ui)P-fCޅU:.$ ԉiqC?C F4#Ic C+!)'"0LH>|"\DþЛ5CQkrZ~ L@^]~=(why,&KT33`zfm#^ݸM*{D:,Gc?+!:p:/9߬w)ѭ%W!Kv|YWBfcPyZ2)b#'|0.P++x[@O#yY "hxb6fF#alI*ӀČ*l,O$hv V[ a 5DXlñ!MvkP+$K/^%: =_|#x;gTLaL-;yVZŔ$v![j/`q˳Q&2?Q>"qD4ѰGT!EPָoxB: բ3edkth6H#ݶ @Raw"lɮS JR6r~/cl#b<4u[qŪh0ST`?A\ [yt2A tY(緿 >̲NE##I !^ zɓBt x@@V$VuB r$fB'Zo|`m%\iٌ5I# ؘE?.Z`. rk}N|$2W S5^@:nсp9:]>iڑ`9´zEV(v8ovu~) 259O0L-%9v BW$.#DЪ!+uQ+ %AG՜&_"Yu"ۼ@*P#6 @,' DJDvu t&\>Ho*X bv`IQ9W}E'&lurcLF g=Jjt0l("4ŁX dΥ308t%Y]qS=D7<ɗ~lC zV ADkв[njO6f 3Q:s9,V,m1jQkLEG%,R*,O >]k)b j\3ؖ}ώeSoₛ9xqGY [suu-nC9T{BbH#{Q6pPDہh2Dva;9:(?sHL?8m;o* hEÜdpZ? n>e0៊t^cc¦AG#$2pt* zO$+ל<0j(rn?${_ŝ|1ݛW<]=Ei*|ȐhoE}XL/w 0XvDS3%+I.@Сko/"e;֪8R|yeWEѫSwoFt1[ $5@ ̫%cJ`z@⺹E8'V/UgsQ b0濞=T0c{ ~}Uh"9pf8FUFl;:t3zca U @b SEl9=dJӜ{P3,n=86[zQ6 7~U!vJvl67'.cz2!~,bz?q56hiǗi$EPBG(bp QB2uZ{\hd "y$u)o{JĈO,DyN{Rm)*#|,޵# $QMKϤnɖ1! w-2M9T2$^iޮq+#2)% י=LJ2ퟯĮ單 xnC&d;T$!jw\q4!ao0 A6%,\`YN뫓ovTD37JI:),(IJ?$ )A5~쥸9;coy_"dpN,1ʁJ9܆:{,b#9  AD]EYY~"1c)AI4S)=dbg MσBbtEӞ(d~'^ fPMY qk5B B up|(( *T[!986'S֐i9xlaϠνҕ8;v|İqr P<mT`^0t1{2,MԩSc,Ȩm}8('[ܫ %hJZ Te/.X|r͎SR,r teڈ4f{uW$) (vQآ Dp5KZ)Ni6Am7=~۟1x mlq!r\Sڑwz:5ₓvRpcBp&D7Ui#k3-f7!i}dYW%EAT.U|7D(D?H;03mRISUJEB+gVPQ;bOr:D`Lϳꍽ$gg !rm a>/$>٘/X]:x) 3UGK+ !CDǣbb7X`D˒ٝRAwծ_R)y) *4 ;qL8vD}yo0XR}`MGQpІ8q7vHdR;xDf3=CZ :MK}4baϸSlCB0T$3I-/ggī3&5c2XX QDGvXǐ'*!^;BN+){>g:upYὐZ3 9Rt݁h_e2]d]Ϗun#CFRg#Fng[m/[rқxKldXo).X=:f@QQƓ""?PCD *m?0w;agO;j@82־Y<~ /t{wh"= Z4}ϓOz;* yޝɐSx0Bf%"vN3Lv !f~ZCV\;]m'*p9J "-L/! nR>o>9ތbJ[uegC&@5P=4w ]X1@Bp[tQ7h%9 WraȦgC׆\wQsF!ljƅ(֔BA\~9-d~OBYPv0x?1sJiOUE3>ҜV0D@0%d-M%YNԦ/reRRֈ\N{oMV*Tui<TolJq֋jHLwsL/&& LUlF#.T# H.QX\HD`(=0!*S2]ońJa3^Ă"J|@Zx#2|륙䫘95ɝ< h (ӇOMF;5bb଄$EH4%N7TFˁVOɕqO?|/3 u5,1)ZTL5<2[ K ׋K)q#a:h" MPl&iw|#[2]e:M]l()UTC6Jœhb((а MPwgRvL;yܯkh `iN1^Q0"tY/.z=@ﹻz"ژ L9KDO-CJ.v=h =^] C駅 2w@ hF3} >)Eh1*o _MBO A͞T7DŽ2á!X$=y4\ڊeA<0mjy4]aX=Wv,zƐvx}Wr]6<_҈;a#MNخ?x^$q"T7GD"ĨTrKOnX!ٞ< kXY*b0fh4@p0Bf3 lE Y X!F:4rQyy)V%@͛> aui洨Z(3Q9/dz7t#ҹЊ%U -% p!j4)B(8FV| =귙qM_Q|Fqr[Š%0YߧɆUکi]#e}E+:Aw4!I$\ Be;IPcz&%_c^$31mqǵTG#D! oɔJn D[{q+&Ļ&8AB֩GVfFIgUO4bS$Ns˴ ס(I=/PfD.HBEb̍Ti15ݞ.Q!4LFX;2Cg"" +T-$6`(0 FR}*Y/̺%Me/p=2Ŷ<B"NhӺwa]1pecwbEi%h V"ؓz@梣Sê[[2" 0Q{7L6ޑ6}>USs㒦Eύ/;8ZOoHv")eT;XyO/-S`:nʢf$ymf* X613n(;:kkp3!"Kkv|]tG pt2^֍@TÚ e<@Ԑٟ1ED.FQpȝU%m0--ORvSU;JѱܪΏVmJqM0x_D`@V[[I=m4O!DwYt: \iq_+ f$jcJŝ DH@T!V#GDIX8MbUf62 BA$%P{l%R@-?clWÖǪ {ʍ5Ynee~V71O@ =Բk3ә0%'-?Gw~X~ DDCD+w/'V,Tcn=G펵Dy1BYxמL ^Z 4 S%16('(|J*ejVg`uZu7"7cICtPJi;*4L)WP&GB'W2보lCÁ/uC]?Kj(', ث *a t ˑ<6Lj/o:چlT@my.K# JU$'+b%\*6mZv($sjsJ5" &67,F^Ozj]7A9QGN5H0 _(gea*:TBN(f阎Zd0ͯL`]Td%pApz IŶ3e$Q'ʓIcaVhTjGif ֲD!ᮻ9!C:xɶ[ڕMbtr<6߼~wS-y*#R#_:ԴڀE]J d˪C|8:Ďɝ+ # Cb=HJ MںZ)z'+P9wnD2aS0N@H";`2nLQprSzht>Z|{?a˩&0e@. 26hJaeq D!(h]Եm(W#0KVWQM&<;9jeCd@ar@]pX/X}r@Ɩ2L!u6i7`7"vFz׽Nu}pU"k;ޭG4j3hibS0mQLkyo?IޡqIT*zgg5ĺlq\x6!jSe8m,#HD)${?RΒgE>Y[P)aIoa!tIɒN2!Lx!raƟU`I 4vrCK|UB#G3L\&>~-X冀Vn#A҉c=8#ƇꞨ*[ p*jڭ-4, Npwa* g B;/|Ӻu2YS~/O Vu=st}L& 3lv߻ ,^}ApX寶HvG[ SmhoKK&WncglVABEZυpԻ FLȆ;$N ?v:'qbD)^[crI W\PZ=E$i'J%g01BϗtKG kHT% MX1Z"k f88n*Qtm\L"I賲v7Ee[.ZU nZgEV2—efa0$G1p $%.|0 D˪њ{A,^;USsW4hv`GQI]{tqb}eKԮ^P dp`33'UZ"GE|%"e ;\<={gAJcJWaixzWfH^d$ܘs'Q @I$S1Hb&9^j|Md7>֯zL&z5c[U^CaEUT5e&ʙK WK/|[fS;FNz76`V^G*5Y$'i;mdԛ|XB8)He|6MJphBI)d3ށ q X;U\2t(M<" Z5)]3ڔ;zl7&zX[8gv 2@ <@׏aۢ$Yہd=kިɔ.iM [K.)c8M~6īw&8hN% mtj)rZ*S>]6vB^=>T(i[l\oI'_`X7e_tH@9ޗNdkRpÅu+@tz vZ8VVLb^j{!iz0hC0㽔(umM06AJK$,K7,84ε' N;0Ѧ]WEMz^G+sxŴivfsu ѽd a*S6WEEqx(i|#U)KOi>?+HJqO4A/U*6tJJ x"Yh.rO"-B2h};PE8RWTφf(By 1b 2fvꖾ ܪ?KQ8ClY?j3*qc5 yva~1hȫ}v-ёjY<~QY)!YbzNL`IwlFL0 c?sVP:,0Vl ~3RܪMF";B$%8]UpTX͂\YzTc= 9;>8qı87 ȩܷ6|Gr6ϬM\GsUƕ{˱I̡ T0 i!X(d0e>٤FB U.V>Sоc98Oy>So-V+B;]6'=mPH} {/JRi/0BKc "0H&so ^ $]y樯PKtuQ*PհXʎ6d q }Ӫc@'xCQj}Lhӻg1$m[7]x1]`G}!h6E(A 9s$Ի+|ʂi5X=Un[Jl Hl,pUHqe_/Pn@t/O:v# #3^hA#LXN4hwc*u F#PZ^Um-_{`?<'tCߠBLTyO ȍf>^;EYVy:L%5lȉ%*hM ThIŶj(~fRwj-勗.K' 4D^"+H}MlZ~ԾǍȭsrBݗ+xj%ͼ07=DތhNM9!GT|8ZpJ 0q`D(p[`&LP b9y8#2Rm>Xh" l Ɣ>S⫺_Vo tG)5m6a;5NeN5L#퀒t%ڛ9vD%>Bg4׾ !;0)TI5ly37]̛`a1K]L4$Pj-pxQ3otce 4Vc Ø+5H$֢/$VS _j׼#27=t^y_Vݔ%ӱЌ|0o U {v.h`#9:n8xa" װGp-Yʐ_Sy.?ZDA-->i@!5#."pQ(ꯛdt1EQPy8c?X#kV-`s _([M+x.5{ծg89TP)" &>Tᆫk=u}voj;5X{4J UitDW88MA3=9,t:M_SfJܞF G R©3t8`{M- d8u'u/zz/HwtR1[M9Ohj@kn4:ҹ T!dn* ;g> Xxki8> G…䋫'v."8j`|Rg,õ2uoʠs3<λ9< ?WeL5}G-WcJY+ O$FbF'p뒉>لd=Lx8 0-Vz~0YET`k-hJ P(y !7W~Y]Ck&"o M3/VJѲ&j=5ݐ+TS2>qL:%"gMT.} ʼn{FY|_OP쭣'9d vώY"Ra IIM Ǐ;$>d;, 6jZ Q.ϭ h&R XIQ'`2՝,unL^I}f[=3BLO?f*T(~.St}JAG\ B`M`:$A5\dO)dN(a|oցDTE - :YBp7t嬆p*Q9jeզC<`)[B/iΥ}EtzM &USϢN8K .?ya9;SIo UC!G XZVlcq(&DQJ2.d 7p%W$CM Z tO'?7!Cb #"=T>o]hOVt@}a gҊ;'N6gW#wʞ'h.?e4JʠDj|Ռף,aU]^UG=SK1MywdFC"Ҍ}#bƶ̷|QB<=l,6[U FI.DRUzϛJUL}PO<;f/ʯ&)zR઴j^~D'!׭ZN6M0>i,ȑL*MxzX'U Ds-50LMtҝz\-4&2] 3؂9CFdFB* $˦L^'y|LFgb/&.er?)(D(c١=j-ӏm6h 3Io=}rT Zo \ 8ĺQl}BuAlܶC _}b({tp>('9*gopV+VOI ~`))8 WIP t-A0%! Y $ 6`@f(Xm h IUBYV$Q'?Q͂L y |AˁS f#1*9<}9AtPmV}0mupH] }rnAB,4ї-wYG|`g[0s T`-I|,@ $$zN3$n=ΜX|ynm2;K9'M ]&ܛ'I13 W%6cAwew/Zr$4@R>U;qd8&bD@r^n" OzwU^g+RBRFFmR~MX\t,b)FؘY$/`)ɫOGP -E Y% H!]-Pe6Զ@DbcAuJ6_Z{\Ú`ܜKѻ#> h˘+MD! 1C$V+:ƌhpӌ벩מEd) Gtn1fHq\c_,"Q`I ] v {>10cSG1$SE2䱊q@ć> (? D$GmC;1*F/}\KKb=iP0DcP*@-|bBI{(]fK]BHF/)݈'dx<5P2]P/X Yh:rq4ۂ԰JLk.%4`ቑ/Wgm %vi?a:"i}lݔTDN#S3 աSH 7R:"&tPnY&WHv37RX$d"iŕNr ݛ30 X^ mXLuB MHM{:I+%9XT nwILOѩ{$b2X DMTBRvHO,yrRi}5ܰoݥªi#NdI)kAɬz+ySC2u)H;֥!q=Vcl˽@{QD(*#-]69bj6k{;,#ytP~-^fRPޯHouRoa")0!q 4萎hHTLqJb@leRFC^H1iRFn!Y8Odp6> 潖ZɛQ!U-e0oKI zӂ^\$VЪˀZ! 0!d*_csUy`qˆ*o.Y>y1&Y(STѕ`bB]Vo*{q|*!➲!,AU2.7IOR@, \WM jfbX+T%%w5N 8Iԉ}#T#YpD duY*FU&bdS%UWIVq+R"m+Hm )hlը.fDoZ QZ2N`E<iJ(»-qv"I CdTktmLW.E)wG$WiЃJ}lXJZL0>!㛑~;o' "jP#pjmN* xZ2*J^{0TW.37tu  x NU:%I"͠uA PM(>l3F-Er m'x2ebBhf,zEpmNP[z$1˪`Hhu&$o^ >c,hYИ@O$]ž#^6 :) QZJ`Ikb`(vw+ FǜDLT\st>&( ̌] >vl臊= -P+jC WW("f#5 apy18д.vIQ>X!=51GN8=f'eVhi1 *J9Y+ѨA- +RiLЎVԀHɨx[ATcVj.C])!"q$g9J+*y]7p=Z=H!)WʼɽxؖAaf4aD-HhƘ196X U$ fũĸ @H4v> t1RKE'yfU;4Z|R$~#-YSY{52^Tx(x;ht;=I(lTTɢrMܦ( ]W|ӻo#ވfw,#~ n7g.W;rID}C.XLpA|.%JxG8@"b 6 ZxP3ylOA/Sq7'x`=e!Ja@%'B^;`2b>,x9 4&S0;͆JL#l(y@c(HQ*FV5)uO"DIа$*pħ\֖=_`g9PDB#"|r1L \HkUP0{BqY;j@mF 3˽tis=1arxr9mɮΩQ#A˖[X5i"4M%ZhqX*sxa"o"b[Tiʩ6l@vQp'rld1Rby;{u(s&YK(aZ؎ =c-<ۑ5}s{J՞SdVI('@"P0m\iiTRTX듨 W}MLQ%%R[aXq[3U t&a!n(\j+p=_x|k%Uň`3nSU'}ufV0E@iXߎ ~iǛ%H3I8%fnT^S( 0]-\TorҊ6 2 bEb,u$֨``FV rr|˰}^`*E0L.;nT*:pT#[զ`hfɊIZƮ4s\$ݻF9ʒlОVuS!2vt;Nr'+.RwYV5R$];L.H]a iL)sUY塳dV]|8?W dY)煚(rXyƝ,fy;oNד'!Q%TPpp ]RE-wG0K2nYqfV`VfMzx>Kt`]g./Ys\!j₊Gw=Lb-2%S]i0WG>C鵦1dCqcp׌(2n GV+o]{wn=+}yx%~В @`hqPI+F_@zmIi ˪Ѱnu .'Ęp&hq vGjƥ$6**^ 白/doA&W(|>'!E$90*PUN6ҏB55Ggڈ^8]or4I7 (91)ƒxzJQ: ,ruk*{C&ċuH5 A zcN_^[ë,ɧ&)jv8ajA:K_lCyK r̲]HNЖT'MD?&xy.&T2R4v]T-o7Oz+sӻX{ju[-cCDOFgl 7l䊫&iCڦ"MR`A8i6 %/MOsit+[T/_+6aډz`-'PZq4%'FYMezͩ&Rmꢘ1JS6IC)RM:ʤ"^ JlŔDN) U84oH.bSˉWPsT9jNtQ[巄J_1Z|)f('Ȧzetnw]^cbao;T[L Ơ<5<6jk 5|ow}9"r,-x=( },hn)EK:. NI"|pMȗw FYYT+{XgL`fTbGdOX=@O"@JH 8SIj mKO٨`,)y7lSq!JH2R/ЩR"7SCGLT=m!5grzZnV$!hDr͹WT N 7* zT3 ^Nh]i9I仴<5G(!qM4S._Qυ`豴|(HxgTH]N m y%<QєN $bȠIIEz3=M(8j\X/x%mAsmhv_ /cjI!,}ePt/QɜL)74n[JSWNѭts)HI(NC)6o>QDk~.o q3F\JtD-%0f5bѲxe" B]HypDI[n`3̾҈}Q #8сN4B by$ӈS+I mE`#0M%(Il G@g"yAt)9vxTQ[h+^֮nz  jFBkEIdl4fነ c(8nƕw]N Mo5c\VMKv[- ıܿC,KdL(ZEHI&ɭ&HYfTnwSHc"Gd<i۽X`igJøqA$ZqpnQ9H4{b KUCiNL !i".h`,dw"C!ct8ssKG"d!`NYՕLO'( !2PaO>SV7h(w[-֪TQJA$5Xb8D$dйdޒFC@( ;+`eLEi@6a2`խ)E0aHmpιDtz%F7!Y(^iL`qm|y3bY w5krFeb’{bKEb.Vkc\eSn8CyINZ,㐓d$/[oolikVlInsU]jN 66#O,C^O k.i@v 'yQmM'J1@kk1FKE]x3&כPh"`"~PAYm*X2*[M i LAG>(CA9bH"?kY^>>,WoH׆=.GUok6V!5ZBB 2E-={`8Ag[mtl꘤Z/Ɯh-%E&1F("!,"2aDw!c F!19h*2 nWXDe[v/'s#"aўK9a鿄be297KuAp=j짍#weRXzpfO6&芎2\ _xӦ˜΢$%Nj8YCcߪv;%]JG魌⹆:U7}(6T_%yV0Qڸ\ +U 4CY}.Ev/y"31\ DfwΆV$+]IujNO i4_~yyW8S[-^j E s1-{zT8Pwd&Evr^Z+/」]y;{!)grDAMQ\ -@*5[ ^-P(/wB<`mHZ&EdZV ˗- h#?թs8ךa m)[ud+҂x&7>JEIP mхsq ^?U\v 2ebeԅ.i?WÆ_0%:3Mt z¥X}337/M̞afg~/烙'Y3&d!>s?j;vMυ6qNT/n8W>W5JԴ5}:5Ir#F#VJ"QȻvUța-,TA$0PbP-\A!Te# %>hٶЫI,%eU,)]u 0+leBFdA$4(+zת6VѻActUI*((dHRTQ1vU B2DeB($NRFhFDA݅$lY0R42KkN aBmnX趩9"6FD\n&aS:VpR}i)z*-jTX)Tpt J. de#""HduvDd)bU6յE۫-0EG@H:Qf ] E!)WN0U-AWErE]Ҡn1 nw"Ђ9bã,YnmCjP![.u$;+4PM!KIJKҦUniM1H@Xl$eR*E]")@Q THn#lOE]A$"e ʫ&3:j.6LeH) u#ePc-Ei]u:k']xY3&d2x$'g&fLIrkk/z᭭;Zխ,IXDe%()K *IaK+`FBWq"ZG.D[*1 [ `JJdmRbBܰFDC )Ed+T $؅ $#,XkG)idJXZ6VW0 Y- 2),ee{nm(0*(RҬelF#؅T-BD̫h屖VTdV0,-Hcڋ pت5e"k+21Єi!kqpH*UjBR[((b~-}=DI)%$S A FrAEE\ 2TnJ&Ati#$"HFOP SpdhB+MbBgS% rF7^GIm̓&I>kkkk?~%Ϯ&͡oVk:qaMEiˈ&`C `Uv =r2BNBf) \ є+ANН lT/r1 DvX),RoL] 9R݉iI1aYb\iAۣZ㈳82PK4(7;N2_6odw]́9fy}W]W]WU뮫=?* :#>XB .$V&̙'۶̙Ozd{2I~w|ߛN>gv,O^`V N/Uz~5M\W^ o!_gy( ??})? ʿIGg_U>O0mcE=uUOw\~.hekf0u_vh7dp.sk.aD9k ƜܔVNd ?d:9 Lϔ݌wW\,&S/sغܗ| }-'cy]rP}۫0bn),"U|+D2(_bIC"Ѵ ڸ1QwN~*5oox}?Fȵ::-&~~}Ը\ y ?yy}KxΟ[m5;q׾GEsoۙ\eΫ#=_L{:hE ??86髿ߵ(w'U%:VOw%(EEJ0_ rF(BjRTRzjGIE)Xk5rh([5ɤ4 n$'E `&VJڡe1 "(Ҋ[ a>/2^M ]}g=p/!#V>utw[Ue?^qnlI `衒x !I2juI@N}ӂ䗷_AIC6ɥrhx_ZT JA$49|P#T6&"S,%VM$t"IID2Ld>OX8X& _Me8*NT::c{>eF h0T ,?>_?>&t~}Jj~߾z5o)޷?_> wOx~EkC[/oɺۃt͇{ךd6<ϰ {Cc,yzu@~}*?GP4za!Hf$*!q Q(4IBlnzz]{Z8X'3 w0Ll'1׺j l25eF=I8~F5~Et?:=OЮS{R$4u s}BpjRǎNלhj#Z#؝A ))5J`zvz[29O#ӟgν<A0&] ,g7>/OJ7ѿȬT眏ʁgZEW2'U\0LHΣ*kS8,i6 P 4xs2 ]Gc焞SWݓGtk=8DnOfHGrǯk?x!tJUg':~8 騴|7O!̨7wʟ~{F5-Q>Axcxe9vc.!_ͯ`p&QOԑn `PJo#a .q&u;﫿=БA=D}JhJW1'?ے/͑qk,&+anjk>ZUԪc^M7K2jZbD_sozd?{e:#}kO?3Ww~~awל/Wk/ #L=:wNU~/BHg}p}D 4%j /MClq_Kǿf9"/7C/ZJ6(> ,oR!g,83%_h'=ϕ*u] 7pnU_C{ҍ5u$s76y&Msk~v8SOץm]:ex"ml~ߣ: &0(\%Y=]Z~{0+׿~NZ,пA#mq?RcP-bl|Ј6TP063sj-B3A. VIA DeU!C|Abe:ļ+ ސfj]yS2+>Wx |#ڵ; 8qq=?6A0db ϛ"n:˥{N^fϾUt$ЃhlR3UvݓrfCs0~p!-E Z]f ax-NSto+>aF"exPZwy-)׉=`)m!TH7OZ)2P=D4ΩsǴf@~Y/m.V ]-)wRc}mNEnRwʝUfSo"# R3>OiV`t'O:T p9}B{V)%H=n-">3B/]z|~5*)4UrDwYofH;t:GzTiCɉZuglwHQxoeb}jw\_7;6š V>]Iir]u]̅!~kjC,[<ó>,. C(\Lyn:ۇ!Ki 2-񂏁eM^'ks~|5hK#dTS&LFPe^BTPF1cYlTdQP4.55pfWzǘ*.-*1wv ZRP0B.XlzcZ6t˳imWSq`] t;X׬hw3;JŒ/p#loO`7kC0CPτOiM!`Ҽi:R+`V6,AisfYӠۤ:S 7Hn.1cY4vx9[z: u _(cUw)U1usgSIi8͉yz+>'g7?x-Оoϓ|_/;`2?~.{=w;ߣxSֳ͙&IRd'_$s;{{_e)(Ж# Kevc,ݷ@!Zl&ŴƜݼ)7:0R"Pf!H4GB( `P h١D3A$(-Eג~?3뼿>;|ڿF@Ř[FO)omY ?QBym /m^VWݼ6/9!+-p?z;(Ԗtp)\qYȞ0k+pk N=CnTW7z#flAŬL N 0mdH+RS㸋i5TpJ#O<\Z ^edStbl\`$=ϙgqu|Ho#$UJ=u# P& \gR.iLp@C(j=A)1˻zn,2ǸGo~Z8{`-`ŘJ+٢#le'犉q8!i(PTNﶗ6;, I\ulA40-{1ZHEb^+;Y 칯ZP~x2Er*;[4ߌE2 ZKBVWG@ ܸr8,3ԄSACAOjv$ wh{-Bl|A$ζˡv j"^7&@ftoSxyÛ}HBFsA*'X/N-OM9Oy|&PCiڠ,}y޼ <ԟ%Ԓjt6$?-{Tx79gzyKQݺtf#BN+8#꯾lp%xM'OV~q]zܝ|tߵ/8-Ds6bԛgqּZFTmcAnېIׯvw܅JqS{93,LӻydDe !'X-b.,0a3x&|/9[ݒ6{pR6_!:~w|Я:_߽<дfB"\*SKYy^yw}Q3?5k 蟬-Kz }so0߳ 51y$1f?N<{'B_re:9^w|f" zA496 `7S"HB ҄21@|`mVMs~G?i>;{{~#>o~.iP4()(f (ę `P3 $M&DhęAI"IMXD#HD&aH2da `h!E!F$R"0afR$0Dihi@BJIL h"B&Bdc21 2 Fdc$ L 0a 0 4 HɒICLF "d$ PAI&0l  ̠IT$,eY1FaY"12 &I 1!1$`M$"iC6C$fiY!M2je DIe&RLɉ($JRX@4dP2hFlj LH4H&fd ` $Q%&DƑI4 `i$fQbh$( DH``$" 1"CH"FJcS2a"b#!AE" @!@FȈd)1DMb`IM Ea !"cD I b)2fĔH78&v2L?+AHQ F C "D@IXX*($VzI32IIϯ~3,c't3S`\jB\5ШS,a:)K2LRtC $@0)~B@ps淤/1$iAdd@n؋|O3TWzyr]w, *ժURTOVR[ThquLeo`2p %d7F=p\Jj"5Wy?>_^7O??kꪪi{QX661TRTDCLLDfP"lIib04~rJ! I%/udLEI"J03l*&]DJ ˀF{H 77d PI!ܻ#v4]LE(3$uH ̀$`Id4{ ,#% S(rHF ̄Av((sK])1Ɠ Ddǜsѐ˱$00CF{hDk%帤@dJQΉPw]ˢSY"Ag1hL +qO8LyQ)X!z0@i!0%syr$!& &.)s2u(wqBaCi1M ,2q.Җ1T+`{FtК`ҍ0I.9spL`ғ)HfD"L:IH{'o˓EL%f D0Q.;nF9p!{v{Xˈ$s %ι \` X+u %$O.Ό=Stф,M]DQr.&{(3D͈csw27H󻝸wdQ0cFe2 &IDK4RaL\<-a .͛GuuV.o rs-7FJBE3H%Gp'Dh*F2@Q(J Л\hNnƎ!-nH] LbqJn8(58a9Sm-ټK] jnrtգL +fuk*8]8*$StiЉ[ 6hcJ5R7iu9$sw3CffI31~kO~)2*OhSiMa9M{Vh;~,ꢇڮj ChDvzIGFq!mOyukW\>%ZI*ŒZm~O4U+`$ lx_* MsIKd. F~uR;so7; ! 7P2nxW# H2@AJd61 #,߬K? ovۂ{"v¾f%ezDΖˎE&.u>nK"/I5"{sXk}U_78PiDݿ.~-cI I.$*btt})rGI 56)CMXqu 9)e&1{+,~B^Q2V= ?_v"gސ+E rKL?/>KVK#= UNV6o_]g:YLg79)7;rX.Q+Cx|uw^nA\G)\r RưNL̬^4kq Pv'ʳ6۽<.Dq"yXLˏk{gD)n*3JYIrkٷnb0+3C87(6vJF΢D7fq+b'E<-՞W:+eGU+*:eqRe.^U۬e5Vv${Z-V$#d]51ЏyʕȩjNj5h%Vl e|zfkoJrǑUլyA 4noyjY{3xE5j*Z()l)┵+cn6M,͢aۉ9㰹\o`LFg k$+)' [ǍN \c$88aՎV!Z o)kEkEZX/ut]XwP)}Xy'4ػGZ{\پgcexB6]xx7v_醓 ݾ$ZNHv('oV0gUPXg-0F&h0  ʻ7Xj,Z/)q-KAIjմm͵pnN0jo86!Noɐg 09.t3,|ZPo.Tv"0pfdJ&;-y849ZrTQXUzt!V䢏38_ Yͧv^nۤ0m;bPQQdF)kX|nJnIfy\W9em3D86Qfk].Yern `N\aڊj)bK97V4wNc @DU~&vf ..aֽ^kP6u%oǠI$H!I1Q3˔gw 3LFFPD "R&I&3BTA4"I"!`bJrdL I,F*e qfSndC L^b hFA tdd$ F@*2b"LIHa0Ƌ˷0RhI &ɒy e%#ou$) dSH #i&D&IC(SӃ5 B$aS"MDE0c@I=Qt:F$et"B2A`2!I9A2%xtid$ M/9Hw^k˹نJlB$H qwrns{ ˗c\ HY)A&Srb\I0$=icBd )\v=vJb Wu2ldFi4SErEDL12D "47uc1owB1^0 \uB2% 4fJSJbc"Hv'۩1 2h$ae.bPf;Ġ@nt%%")LD !2F K7bty]-ΰE #&1% 0]@S;& cI@/uĽ dws!&{RQWX Nkn`);Wzws@]Bl.J &B{-qbD@*,2 Dp:u{;\n]:NC @&BysHwq˅ PHv^w"nBť%1lHytA!<-,v{9s RneyΑ3)w3{A4RLdP3H%˺CwWH `es!rvA1IDѣ{pC.k"b{=pf]w<w\f[Dswyw݃˷wM˻sHw]GyuezH<1zB/:^ˈt%8X]:^y븹{볺κ^Љ ˘1 L%mDƵX 11 1#+\FŻ1z.;^6O.wrt;y H4a$D{78%P(Y) U ᣽.Hьwo q44/un=?˾ ęCF'5* nzg @ &K ?ʸJY(eV@$H$E%#+!("guGWEäu۴.ؓn%!+.- ([$#lH.0B211RːBdi-,XQrJH֒$ V&U[0K5GD- X!1d@+0q-l5X#El*e G1ťlRYAB -[iK$`P eVеlD)KB#!@-aa,n! RR\#,m!)pe!rŒL33I`$H t$%Au/ IK7- n5+m XnHmSvƒqoXcӢ'DԘ$8K׍@B?Å!Ȥ';hE N˦AE.˟|X2FzWEh8DzGTTʕ<: ()?FP 4|;mzgWV t r)m[ %AY6Vp^v&@ɠ^vKTAn<ߛw,σa$CWkrSNӜ֑qԊi!M|:p7?b?۪?|F߁Ku~yMfG[O }>x&ALg{zdː`SPpzLJJ b8vJ:l`8Rē"'Ϊ}tBm_t*_"/$5I`$hXTi#,ȝh3O= }g;B{/{-Þ&~q0޷i UNi*;u{И\kqd%\dHY3G2[# 3p՚x3=IZ 17ݿtlRUM3CևNC6 xB |})\=ı2֡C,w]XP, 'h 7jnЁAӧ}vIkNEC^AFFqTIZ T aUM 6s =k eFWfrWkpLFP&mAJK|Hأnօk햫}'rJUrHp·L2It.úxdWe-`yZbH% >7 ,5vN;= S5U m LIA N..OZp A h31 `,FeqԵ)A i sWPT,z8̴ۨ,]kVGNo AZ5cTUzR 1:4Zt!a\X\l/:i )JC:򍈬@F Ńb 7;"$Td投 ͑A1M* ̴n^lnyy DŽ_Rń(X@l]0  hlTpȌ^L=&LDhJ;PZ 30'F?Y~u߮): Ue[Ĵg|B;Vj*Ⱥ9; 6.j*MPԇKBuWAL"ZԾV1. *P9DFRLۑ;-O܋$)f+^9Oʈ ncNZt%KMJ䕧`@]f s[wu=ަ*R=;7J3<Ѳ R.3@pUѿGeu)V V\xǙT ]&\: LKBwhe8oI''J~j:$̙$LSχ_#Dv0iS~oPϭ8)qᚏyN0^lƜ>hO/ra"1%.٘ ѠSlȟ;ւ{P/.oN0O5LlHpY"9/<5>iܛ1<,$miT$5(1ۍMV* 1D<{~Nx sTsbd w v|iVp:g{+;"VW=""7;);uFw{g4m0ӹCs if*>N⋎,71AR,(`+ư3u!0$ \PTȚoqC)6 )yu4ˈgg$t,7]n(!StvcgddÁЮ|3ax0M>uhb3فbMD4Rbb崨1wEOgS|؛_;3KYM +6T5dl t!3hH)l/7DX`H^ ATl-^hFE]6\ҷ+͢l+%-ycsMkMQ8 x;PT35^H'i!uhbcV80P*1x;ADfF ۝B 3":)4uP QQ+٢PEw1o;,(xWm'pPtSmٱq<}7| k<:ecGf,6RYBt7 %<)soҖCq4JjҋC{4~pWEkK)Ȭ2h [N#{g*܋jq!->#rA?+`^:V؎dit8*0.첑5- *vcD&/l{}Tguף/CCqW.)ݺiA @`G K Wn wGm A<IukWj7wd%o⦓[bi54I˧rZ26#*S@2I$ɒO_~E^EWeށs~W˾!+`M@ڍL?SOxmM-[li}NNWf0ClG\`QCeKlu﫥$D{ s`0DQt1ΐ5>%f=[/KoW\8ӼLOx 44` IJADu]+igP&B]`L~Geů̄7o|=zCVb*ọk{X.~/ǿwϦycuv_2c?M#W\`od«$N?;X\XZ0 mv 1޴0V@$ְ-z-;9.(T :1*~?h\#>~.ݫx¼T^vPVZ4I {&L>HaJ/ah>! KT<j5dk>@o?{wX_$~3Ɨ}: =^GtRTc[ݝnoϽ!\3 &OŎPcזϷtsъPFu%ȗ|WZ.(T &|IN՘.Tε`7 +;hUu %&jD:H)`(SFNM&NA ̴H&'+4$2cr`,U0Q FŻ_Vq?(SxJ;OKhIfr#.3V8iޥ()A:5u.Gw[hj㧹/s?}M}:XVks\{u[b/heߡH*ˑyyj ;k`=#޳E1?Re4 5֙>ӭfym4Dn5?_)M$!7(eH/β4}V3!q@t(H04>^4_WobS蓑Wv+Q=Dtf2N3I+J=oTI:KT_[6`%XT#=J}ǁ \ CTyC"Z^Du@O<߾O'/:{Ͽ^Qe8x>~Oy;LӶG7|h%92uV%yVq1Ov|V7I`:};Ho-cK_y|(%ؙy֥D1fzef!ZdN,SQN4rSrW >[?k C_o`oǩ[_/R )4胾i~E_kGYp"}嚙Z0dTX# !P;:i 98ñlIIם(ˢS?u7U?1ܿ߿~0xg8|  Q3Y6;IM~w.t!v?5]Ih=S7z޶T5g|'#~{r<'B5ې a~L۲ ZltD?W8W︻fux0⹳B<_P֍pUHm-\_%I]`')d3?Kr')k,>“|2迫\]~f3NjÊZh.49*vx! [?{:v|+w{3q[i!v.P:uFs XnHX)3= HQB?|YjǭJiO6_Kc{X љ Z˙1Aʾ(f.)5av}ymS?I;F:,FzuU_@LJ:/Yd,e 'p`r_ksWhC"Qrɨhe|I\  [/G^'G^|2fI&N$05Ek[XXڨڵmo~hL #w_{|k32YDŽA ,%v"=14Sl% cy;Es_P:IG* ]& O6KN [`ۨQ$rZy9"W6ޙ?>rʟ́6o4yr3^sDЉ8o9 7nņA 4MDQm6AmX4嶩ȧ7s[`;) u( #e56 %J(% '8^s9Ѹ(Y͜Nsg.ԙ>Fc.vםwL1)$mkH"ŠXF#Rlrmk#Xс`4 HJ2E-#U"\hȨF,b-9 XEARJ$(R Eqj UʴIڵ0\ suÙa cFRh9bJ` 85 -i-r2NKUFŶ!kaZ60 q!b6,-2EeJ5iKaPm+m[-Չ %V"mĔV4ŵ2L&fLs'>/ִ.$.~g`ik.A.:p+-,"6SVU) D`0ܒ+AUbPh^:FPV +n+f#ӖH˺Mz˥бDP *enBE`tB,m:jՒ1*Iꔆ優:QX).=7EDaґ nZHՕ-  [2V/SZBT* hiLHQMkS#:,ٲou4bjҭu:B&㎌ +ܼVnȴƆtB/NeW,#y.GK62hvh;:Iڽt]iPi,-]fy0ݍTqmrTKTUYB)YVJU•vӹ*RaMu6 VZmVAHPFBt & 1P0I;LHrtnYJPn9 VYbXwWA(iRNTf ̄&-.2U fADƀhFZZRVqȍiB]$2 &BL+#,Jq+]Tp+a2K%RQĝq"mmT 틻tC*aH!`iQ6=|ֿ:EmyUy&kmt5Wwb`&[ %,)9)[`%Ѵ0ZĤAh6`bS JIq %25jP0#mAe))l#)Prʌ”,YcmHb# G(R[alp[e%ի+meK0RpZ(ZQmF[E+!J aPe$l ۈزe[-Yli[l *%#%.E h`%81"[`HVЄX™Q+ka-JZZ -`\1[.1liH -!rXĩEJR6n0[e*EGT[HmbTl* -pK)tbm%c"9Y(YJZ1e+մ#q9nR(A [XƤdKJQrQSFTa apeBnʱ`0bF-B,@DDl6VR)ErpV۔%qQ!mH0cdEnTs$̙3&}׉3=W<^1`'wy~GA~j.OgˍЉC\>?~0HZ g$c;8c pmQe2o#!!dLF2fBFZ`^Ap}'94K)ȗWj&cR{ 4{Os.qd2O[ ,ʲg! sbW7 h&XsާKLT0m5@JJZfRTƘQ*F C̷!ȃ ѯFV1u%ih^8 Ar> 1P&zm[f/] 6Rx*/zܕ*ishIgG.V"pƦKbXEXsCy2/d)ʱцzuټ $ΈVNbъVf3(1E 4HiA/je^B-sVj ;txh)L1P7%qSowQ`g{$Ь"7{ć,tp'j7f9 jzB@hp z0Ue)qox\  cT [fB*!kc`R30Fc E5p7F6&,- EMZ+ZODF-t % [\{𢠥V$.t9#Dq-evv^cc2/JYѶCdaXAa.$%ibVu0Vz´`k>6cZ:aNS)67N:A- s^@Q{ڌ*؅х BL %a)iDRo_ȹ5#T_ *>,pC,2ԒFmn7B/4H Os;H`X ǒhEGh`ԲMpXT풆cqBPvPp E۶S7]k2DmfJ 6 "kE;{12n(TTR#\c@eĀ/ؠ3vh 7Bȡ{DPW\|cKwPQZdB P4r 3# }5{E|4" <J9h6dE[Fy@Ͳ9rJ--vXP=a5|ei\Zg g k/^64h~H#ŹՐi8 ѱRulV+\;B73ȗQ7\ M0OjTcJ$8 Lv B[ˏt>V&5:|71*"*Q`ӧMXs5xݔkf(ƓEE:8uQd5nlN2y^NML@DESxP6 LX;.sՑhxY(| = #*+9UCʚ0EpOH#B v[@Q*>*u[$A6\5(! \º{6̕ !ZfȺK@ OC T 4K=ȴS{k:&¤c-7(e߁pWSGGM\p U*o.An2[im82|PBKT TeQRkrYc%jt VLGvn/R2`fN1!䖌kc#n,yK7f yP3Q1Y8n2^"^.6U`E L;|!GGWb+PDU =[" \^!;7aJ`-3yla4AEXw}:TqhMzwrm@W$Q8.` 1LYN3uc X>iX%MQsDQwj3ԃL /U4Drg^YlMaeJ,ړ_[!oڦ$bpŭw$؆ғ&P"^=w/*(LYG)x˞`n7}{ ԛL$v(p,$7\7+3!Uu3܏1ѩnwㄗ nnScVWÈN'#djv,% $ȼA8N! $:ox%\G K(ߞ*9FL6tK mvhC;-r!Nu+A j쎝 X=>o 7,ǁtBgZާ2U-q|oT<,MvUQ$\ T5177іtzc(Bj;izW:쒝O0]ʉ]j[Vu>BHؔ+Q>$ebS --ȥz(+lĊt5Y6,SB!")l 9r<ث<dUl rhVKKZƟʘXK,d-$*l)2pd ^nM0-+43*4J) HP|bD K ug\hxo{ћEoC(fϕ-ڙ,y9B)-=;: `L丩{bS KyY!qFZzZʀ-@PW<vlY˙ɍ6} TeG 327X˽!ضw"0)#Dܒѧj)Q,Y:[8#)}9>H"yQ6]d.論7;wmicR`A"u#a y0Y;Ts+Wӊ/SoD~pKAtf f b6$ LDD$ lG ƫ|/"[/>\X*D-44XKT`\ .SP]KTIZҲTJZIt'6HIPAX¼fcbu?s5ٍ0Gq4{ÖAD QG$焭O9x;Gwn_W޾=3$d Ngo4 M3] ]R %A"` 7vwO~7ɶڪ֫ _{;yv׭œQ Jb`f ;o  ߩގk%H}gZmYBBkb p JnrwPvKdA|rEѮ[Qb)k']U3&Lɓܙ3/ЩQX*-܌Vb\K_F8t\壖N?!O [qX\A;ZlZ^?Dz1o͋X6zԧҽ7a>VJ{-b9g(mNCt>x8w]A3. !mm#e䢛v=XUq'eQsVi;W S2a+#&DP53.;bxb?ffk2AkR'z DN:7&b6 @}}ꧡ57y?JO?|* 'Vw TRŨyMt_ik=rƓ "6r".ё>5SeG~90k5p5?4biLާ/=[H٤)̴@# :q997~hR(?4Ej[^muϊ_8,!eo$p#@A.lޑ}䜼4J^ 8=hʽ\/}L{I]÷vnjZʇV5~t%BG{,#}voXjz`V3_;kη|ڵ?5!>yϿ 䓶Aohc3hCq(Ri쭱2cEV*D!n.Vh Ք˾{:v?=MȽz{̩Ӛ~=mI <9e%{UCC}օ @z7Q} 8`Gւ|? ?fܻDu4CF([gHV zB]](vlߩQ;[:+4T I?>dtMnAgKʪ{_HHoVMPm~9ǜ UwXph;McOiv KM"俴=|5k|>qڂ[`+EXj5sU1i,cEF(bт%j"Z4[(ɢ[&cbXň4Ai%(1FcccEmMIFi6#щ,Q,jKѠѨEQb릋RZ(@A5"4i( 6"1d4m(rESXƣPlD&bsaQFUQ!bض#HPMD3b0" ,D-ƌSݹlEh,[ hƓl(ٓ,Em5sp؊6)*11l*BJcQMF1LhFFcQl 1P%JcbCDQ(2ѣF@TA$lhт4b̡dHk(2#фIQd26K&fd(#&*5&XL25(z2 CfP->r2E CKY TTv F+^`*Ar9\,&n1ǐEX# H75/E ӛSgƋcԆS?y"#ҠP 흿ȡ,OtexZ, 7^e\&{'T^JO;8Ao[ѻ\Om%|Xx' &d@AVR5mWq~'ʰxDp8$je%wXIKAFNvxT;DGJ;Db]PVYj,I5f.gVF).HQ)?z?t=}>{}8D^BN$(HfG5t4,~y]y H%7PD508k|] *a.->@W3 _+6n,!}C䫇;JSjW.dwse{C,>gY!R^{#x_E) nMBLίbP RO QCkPF 5pcwEihk 3jN&^51}oK^SZs&YI^("6QA)XvGNRnY ~2<ޜ:A2t~q{*#]KKw yDIv'Dh9ۡCQ^6푾j:n{vΕZlZOqSVZ}ԓ/d;y׺,CwD{ǜseSh~'v.VFǀAJNepܗ}&wExUM~ 9FX~piR)^'$_~*l˭y7ok4 -,p+2) JB@==Cd<2Z%cV$*h&]<'@ަ:0B_9030̋ׄ +t ts*)Y $h{siO2`K $ =m0p.+Gፖ'lL>d[<*Z` Őrǁx&O r3s?p$;)p V#.w(JB 2LQ67<׾42?SUiB< ~ vxYd(K$8J]&Ė+>2$B 2!O$\?d2&@b}bVX!ivStv)/z~F 깡)-~7q֔!*Lg !_#cyGR,J|0 r-͋@޳\t귴{=o=9⧲lm*3PWOӘ` |%Рt_3"y'>İоg`L%Q)w„]suy_)8?l2ZOlJ[]bJ× _ùr :ڽ?|/(> }K[07O:dž7C GtCvbѫf@d)U6N񦩷]櫏Ԇ#d@r30l-a3]G1&o 7 +_Ki)`D/-EAw!Z#;p.3*ƀ<5x(l2oNÆu]2X ̞TQV2q&Hu }c i֭РlKe|+V@M] kS}u{װ٪$+T+9dYj{{MT65sװ4W:ZvrswOU4FNJ.R|-Z@|Lj?0퉿NZbuP!5G MzO{P X"ϯ(oJ@`2AqU c#v;No9wP?m9%S}+d^XeX'Dϫ_̺e5vA`G'>=&8Y^%Q5fى@}`ᖻbc1uڻ/gpdb,DGնY&ܲ2?I )Dג`Jlœ8na^cwRD t$@X 2VԆ)`Vj%*:fpzgh9"ϡ?Fut9gHP7:`M|~Q766ɀeuN%-[ŀN:YfkZI6 ?v2,d-OCa074m4ܦF8: gus۩١m#%1W ޏi;(`҄Ϙ%%MQT}S@@Q"״U?P X|gek]/}1B0yNJO'I:~[+{2nϬK =E˻l mgj&{",Bw6yC~0iȬfo"w6EHdWQe=mL)pmTD:>=m`Gf +-WPϺa+ wՁ(p"xJUb~ņ jt'&xv1\Mѹ CS<4]':#nG"yK`!jL,>]ԲèßI[\Tz."h|v\ܓg50+7d{*Q__{ k !֯3xlG Q荤LD_ y` KoRj~FowsMkc +h 6!6lrC3$kno=y? ^J#O_]wު%hF]BbQw*{:2[=si-9 Đc|G??YCT(dXv(e5/dY v$^|;Ϸ Mz^kgEVDֆ I}UԹu{Ri NB 56 5sv t?E#dA8>r)'XZ¨LlF9}@ÂH8!Ng(0";(ss$4䡥f11kFA+fM/bEBl/H$nUU,Cc@K a)` +N5yʣnJ(:)H]bdw& #0TPbot) a|iT1X¡)a  e!(21nK!ʞ 9$>ټճYkCA]a64Bf`ɫ cO9pcQOR&> 6ܲ} T>Dy%{9^I]EfOUera1ߏZeBZ^R_ϭUdLȱS^R"qo|~8RӅ*I3v‹FV 7.ZxEۙ!|y2ZPJ:Dz~gbj|pԌteWNE>습6f2"_8dDQڃCX]z{R3{7`߮/kq5Nsspی^&ږlbɃ6eZ8%SPȵ/-'[A SXtR|ǹAO鵜Yb.e%+0"q㜾;=g%AЇFª!3Oy1w4[ Emu;m0O7'sǤzD`)XS0zC .8gVL!*/cI HC3M3|7㶣%O{s~47`;9~gEtޣ zD /%3oY,pm3$ˬmCgqLl+uf >tuB-|.>Mkڙ>Ø50y'H_7 Plfˣەt=.Md$g$g ׋@Vf|'%1}70[b51\=VxR~#E:Vg2?ce{=J^ a'?>+b L\#=yil<3G.6PAb@f\贛|msћRM9?y_̓TLWI۰?_r,7RJkEvԺ;>E.T4+ZR'}ܞ)̅084#4߅[7ȿ\F1Ac ٻbr-6pbh׍+T@eiˈ@JhTBV=wD[@F*}n+p]. x.<7dV'⬪Oj#NZW^^ 'MΘ35^Z,MoKFo$3'jG[H>PI6OE'MLʫ!Ls#4& 2eڭvf}cCMm szAqÆ_FJE#w<-Ǒe/`D\%u=(eve!({X~в2銯6&"Jdcc308dZkɶRNj w (,礆/|e=]MOXS5퍅D ŭ!т,zy=ݹ񋀂Dt~4tIeqmF0/ ~pspR9d-8UX1tb wCFzV*aq=IS^zeR^8ȝn=N{|RP*8py:^1-S*7GU (Nt̉ KQsiSncq%xE!!0t׀OO|Gg[(ns4u(o^JGRg6<3-q/MH/-M}\$?hgb/¤EbQێ 531{8m7rnm+^vJ󐄂(*o? :rM0b_'N؉jbmٙ$cO=''-H|>$Qg],zl6r*ZI/@Ʌ r"JÉGp k̹ |vu G:dL߶O;—UÕq1Y(>OA?E5^V9{l,7>[5QWgFgt1p B u@M!q.$%vYi F݌J.^z =(Q ,,&BLx=QxkCpA W#F#d\h灪?•3C+.d^eaJYȺx`Wž獬 ~ mb8S;35٫awjoT=u5N][;s:sIAŲ-{2!xgYmhƾn"O%wed;5Di3tkAšI9co{E`9r9*!1brCCv$$On˾AtTʜ~Аx7wOR(5wMPG ZFyy;bk"]` >#4B~GJ>B;-8l0Ⱦ%qNR';H{QSʭϹT&ٙk\.*xSfPU/DUE{p$pƻ|O1KyQ-le4,qMꀐ_‡Ŷ! aFC/z븍g-"a$Fqp^+j@0  L]j J%J] ]_a `j|FMDUUbA^w?Oޯ1§Hsocb];g64+k=cʣ} ^t6%d_^V1Tz x pczqv!0/_8]6 W/`ljowͽb MEWv~-C)M;Pd_WFCQ%V A ˜.YL|P9p4BKxn*X8 Ɇ ~Ve,H彜;? F2IzKNmTI<9Z-;Wwp|8y YX*\(m)bv;6®Ϻ;_{GH…_JX|DzrbR BK{. ]d"{nJC^S*omm|0i!*Vm-8__#!WOV9 G1:`Uȿ2 I|'[z 8n (VڠJa>4=iXiIl`>ٌ%7$=p$8 p龭qK|wMcpUMuз# Z]f"Q, h9/ŐPgZieF>zM1J;R4U=[LHm{REEu;e?9 nmf-I{ ^~rf2R1;$ ;\-eb0Z⛷8ɠ3^Ϗ0h/1xx@ PNބ&gZ0%t2<q ׀aR#@@/ޡ!.fKv5c%_z8p%i{B듸a'gi4*K%l3t1c[I|٩gf^0+6g >-3(-$rJpйt גJ"3'|+w3uYL7+h6Kojvq(/*4BO΃- ءř ƵpMxm+yoo2 ֟, E%u&xbH.F:џoi|\~zy0󨬠i5z^Eruσ25??%BwL*j~`W;:J6# rP W'Rj= ba-ZJ0w%odt~5TqYjK̚0)eVU:F-R-@Jf܋Bt:bH)7; *ssڍ/5 ubj'ldpS:-|!E i dmu "{< "W2L$>7l_dxcJN@u_ICl Zno3\@xZ̄iF 9%{]@0MGբmqw/=.W(]6S cy&zk]6d I]`&n =+^Dˣ17Y^6^AםZwX7c{D6])إF{u%a`Y5(C+q~K38#5YfT%C5v~WJނvA؞]u3Q>$G"XԐ/ry8&aqy"o0srҮl8*J-Lr*ɓƀ8&$!o-vZ腼tNLMt>h)e7X/7$r(.!SA^DnaSS!UK,yAP*2;IuWDQ$\Fle{l`}b^dv%;w3 %8cMmX=9L+.Q)t>']5[R{ɰѺ0;MD2#|/HAQD?`HS?.yz>W(G/nL50Vm&'C}y//}NlL/l qRqBςS{ɫ. X[Aœ o9IUཌྷ~yT0 tʄ0}Alx+:rvI3E94dD ddQB|[rˠ+e7IqU(_.3crʉuBCF%Ct7gpϯ ;v)_Wm`cK]Ap|cN1Xe<|l_I0(=t=BDٹ +GRYL/"~Uʉ|MjNEp>E_'&zL;9OZ?kE{E1DNmE2FOf4sXLӪįdC!2sLRG-HgUI?\kzZ$KJmb<?&xX!0a`sf=hG(FSvw lMWFkn'M?L ^nw gY"-+wɼ0 JEV26W '>hՌ G٭╧+zq֍iXnZxkۍe1Ə$>uYȧ{Z*Y..חO jTw%(]ΓSb 0ް-.FxUuE9 3Kc]nU`(]6 /E.Nv6E"=tZJ,HݿO)gX@8~&ʛgϩ ^gk^$YJ>0bXcU\bdivf^T;Ef,gi4qUAү.J`)pɳ>fDMa_^RY> a3~Ds,,BIѧ+eڱE7KI]:krL`'|yk);g8.,Fz d.1L2l;@RCmf*xD @|z,l/̍l{P'ɼ$0!4iH d {<5PR[ƒo!Y<\m,/ K6 %k%aˑ4Β_o ]0eF 7kRRu䆔x97,)"1L-T,QW6C.inAS7# gK9`-gNtsWNUR߭H G&m'mG'-[MD|/kOgJ)Rx->x%ƯJqtwp1AVaiyf!# u q.d]Tw`]4&#`j&R?~iN<(ՁqQm;,Vu "̚%DZ)| xI<#{ܨc+zj%ɂ .`xp\PkDBB5-+ASN^5jwGk^45idGI53\omb 3T{/b"e9=ꐤ*~iJ?!)hR;84St ڒE7azӟ7/U\0Ccr ECjo% rZhBu3Ts <%$C,fcXDKd{/t&p^N`%bGY֚' H:z%燮Qc O?5fՖ[U*,Z x;PkBey3]OsVE}֐p@)Wx(d4 <أM2 L0wC2H h%\n"K(<΃e/}púX8h|uBq=;^أv45OjEn)S};-Sbq "4sO YA5n$hgk6sO ^i]XF4fYwLrjW_GVM>Gܩg<2|BU-"JeȬ\S}w$c4pAnN/y= orR~4d'1O;.6®`4(6k[LJ31jh]BƉxD68';8 QzoArf`Ƕ^uIʤ7Pm;+2A$廜/(B0C\w}댿 }u$*rLwuj[~Q[vj/{Se`I-}F~)}7iVTNQxxI=9h-ԃ;LO߬L7 x jQekC鰿XC)Q:M}AUiؒ>%:ax"\ VL\cMԘͺ?ԥXG9>aϹB*2d8&K%69.Og`If=k])lRJ0u*~uϟGAH3])_k]5O)a~ۛ}1r?m?86JDSa-zdx?Fm/ldXE,뉼tQ\9ɏY?&\Ǐ 0 ,̿|XȄvU++P4$nWs ֜e0u$=0;jξFl+e^uרPWƢcccP靖ْ|A6>G) g8 F3$pyPEAŋyj"Jk! [ۛ*$ URe*6{C*зHQ*N7jͨL!v!APqm :EE+)Haugs4\U~g˧/b qx6ujc=b6!\o2eמ.{vsFa&t1Yw$!K ϊb NBnDM$n0NeD9&b05 ǨV!Z::h;X da:S/l's{}z2CNt0@.&QtSJD0vxs;Eγ/yH=~Q\]:DAֻ[|\#upt9>80o~leƬax P8v^s(b(Hؽ]7Ù$wIPBdt+~B2xh_,4 ykGC45o( LJYk>9h N{u`nϼ޿")iղ,4`C\%csgjyDFgmϥ5+I4V[B UQT%n[#9Gw͈QH7h^Zq*;kTh̨46l+LɭS0w9dὔjOX]=pk-UPfWLD E{A|3uM۳Oյ1G\wD,Ӫ>"[e`e(.¯\5' ]͵#CK3o1 wj{ [+HqtxLg/c=ϦsǗTm?!` )L)E򏶢ɋ1#" 穈;qՅ]Dɧ1~58) ((<@њט)v5KeBÔ\7._Bu=^yS?QKcTyZ\6AVYN/ͰXflqUBa>>sU-'n)V5Uiѳ,yYb\PjuzP Qo[\7L҈Qlۣ{Ef]t 4Z;0V'"lR}ҝ-+Wᠫ$;)EE[.]k =ߺM3&c*.L3O.6jx=_\ر*V#0<ۘ+Bsr{#NАlIzxk+2-4o JV}yg.iQgM|"&0V*Z3b(Az^QXm*kK?;"x%eYK`K/h 濳lAGB}^T:; 'vNvwȧY Bڀ*Qs^ZG?SeJ^*GUE U*\ZvXvp-> ̉=ϓfkjHֹTG%&nQnCN'b>` L|/Q VݙMAnqFpZ.:L0;_(ױo18M2WZ$r%hhOq̖ f 2Qn,6-Jpx> 3i32A#r.$Xɋ}+&O<^ao pb|Se!𝳈2qoKV}:rLI/ۯmo2nmS~ܵC 9di"[?00$ͳIRYicPGHL{j/&HڒUdʏ#p-*(0Z0qo%}ḇ BzAGҔ! \N!E|IM! I1sWB)3Z+ gC %3:ϗO>nZ ;46p;jKR>6i_ p!:Vm/: e><5sJ b2S$aڔ&]2)ǡ/:O8C]7&1!ujJK.Iǃde|0R>'p\| g[d<Is%)SZEٴ¥Dg Bz-ߞ3+ ~J.,޸K'=xYT7m};sOViG뿂Fh3 b_:vC8]nvJ>{"ġq{tuNO/]\XCx;Mm aw}ॡ/. J) 0 '0.'rBtc'- 29FW`'i#G.gԟs,Nj"׎$F5dÒsPX[>eFԻ;cr>*m D-W'Zy=iVG?1+&xJ=8c.-./JX \HYhuXs*Hw𠱆A 5:d!"/gZ<1VsQG]G'A3ʑ;K #uhMX$<颺}tz[G $* @r% {(^#^2X{ ur_NxQVPPrp+<&1N +xB͒?(x).TLbR'q+:7|&'ԶrcN*V( N$~1Vv"g`ҏ s]o}=MQ׀<5SKcy;<@s0N5-VS~-$7Gg~w; P.aL8Ė*gW:C#Ae{nb ɚ1T3/# @Z { -IWSQ@'9XIYaEp=F=/z5" Fw?ӋϪ+ ū>RPqu3Hr8AT6gieb@0%sΰ.',!<@ ,.RixSjF{SWR>O 9Hcg[QkXg\زZ]LQSeEFwb2o'7zY5,8h8aI6=T97\^o?f2{sj! >R/F}&*ri\\GORh=ى\0b5"ϝOù5`@U& w{_.07u$Rr[Uư6 [wtYFҜ Vn{uCCBa_Ǚknc2Ǡ"zk' l.6 ߲(oz\o c懟_5w#Sp2/Ɠ0jV b !;E0Ӥ3kQ>`yS5c)j?n2ߓy\}ڭDo(V.:f҈^>H2g@QI”` SKCAːgs݈u}:W}BѢ"b 8k&d&!'-ڷޝ;9ti2[~m/` X~>=TIfQK^P $ ']%5әP4r?pĎ!! i4"{ ՘;UC.Uyap;:{p[TZx nz}܊1HԷBCSw(j.٘ZF_FjΘ@h^w Wu7x;Ոq_U}p1%>чn~Vhi5m%!sw׽&o)EIg? v%su(q/Rm~]㍕ё͇fCK'LV*R84;>]l8ym0k-~mK @DͶV(-n 8.$p]FweO),""LnzzÔ-p8H(&٠s!N7x{/߭?hEF 0Ɍ(n1Aﻖ%|-|+XoBϿ,'HjY5`&F jEjEOʪ4d`f.&n1n5}JQP V,D$w͊XLyɻ>@kB!uG[o .UII dG}u l|E=7)V@q0’4`sJQ}[?y$O!Al%'\j_y!PL yYT;?и> T6b e}O7L1N\mlm$݈įNjAYC;KZG\I+&h/FU0xF^a52e?( %{3Cg<-%G !dg}X^~uK4!v7hx "K !Kz*Tp؎yw6J 1/ V KM`LH-Ä ]Iz~p[pZo|bW2|0xA)njia V|*. TDLL&H?`\Е.I*-Ecښby0IY|%وʕ+D?Z;Ax+fmi|n,(nPʾ1Yʟ=(=o-$i%:/8K}DUtq=eDIҧ`K`#\b#iS؟n46w% 1w{)l{‰zy8]kS0sK:X؟XLVuԻJO]b|޴Q޸ ~Fhuvuqf˲ ocdG "5f%TY70lPEZpvv1m2X@4>`\+.r8ơyYwmb+9LK"G_D8hd!NĵNVlOdzcBU!Cv/4$bLJl2QM٨e4HS,!kI 5qPs|c4xˣrtMS,/rա;* ˄ٽ^p$ DzEfe8hMhnķt Nk`d֢iL 6b9tm*m} 5s\V}\v†BǰɈ'Ua XO-qCy_ZDrDB_+,t NՏ${g'k^,#^Qq(ݚA$3}\L.8l)Vpy:L҅"6 yAyKI;J7#gtjJRYr)U%GueCez!N\N:Zޤލv)ڞ#xEMfܬ4w9\|bdPj" @nrf1 q{6{ Ԁ0cl?7fnrBNp[]Hܰ[IJ2x"q5M@#[(ASѩ2EL4gt4-tYɠaTd%MR wD'/,V묵f3#BcXO{⃦\,zEnlfuW239tsBWB MȖΈ+ȭhCuNo1-\h]* ̠rvݧΣqovųo`OU!⃮^&:О7N.>tEdҷ8FQ袋xuz5$*V #FWJĕ?bHVfLm24*8_>0x V~SGZ~&GCۃ<Ȱun%|"ޚvn|PkF:U=* % b³8{PfEϡKeXSd:+B6+KPxčVW,9S"o`f@5pW`h<8z?hJMcz< BNRJYfm4"[ߡV %y% uTϥȠzSX$hlN#hWCԉ 2Tn2Y4.uڸӃ@Ӧ1B֍ǁ7@r=G+l~!&Ac3ͮ,!ʤQ^!c^h6fdDF.^ moػT@u)+lDivj0k2}| C9N:CHC`ˢEtmg08R 7|׻& aE*JltLJ%7dwOvTpdr^FP% eSDң/tQ9ztl-!ger kjT߻:kyא_;?ۦw2wG,)@e^˂$hDZ(o\Sg.h*!:-xHw>ȱ^=y5[?(@?'Bo]%Kj bP1wirEck^ c>*nCgl)*֯ouD$ig f `@./ *HiŶ+anG w)Γ`!fY(]!/RPÑqH{ke/ Lt1('hh XF콊PB̂t cR!1&80ZEcQ`1KљL.4WDWҘ5&""ONzc񷏱kdP$ nqtQ?PJcρo<erH+ޛ?`V< fw DM#7 xj '2pi{Ð4Ŕ2e[նx.Tv@G5 赘c9f,yOgr踛5 yb 3!(iAPEL\\{S0 IK1{'(q5M3fb>g4RQÆwbnK4ب7 ˛kס=VP |VV=ILH!y{ 6{u[ ?!6̌Mzge~D7~ȉTiyL77b{[n QΓmiYa3G(AYPg?Q-|wL OM[b1L |6:=i.m{~SG&:'FPb%ȣ! p "/V6KGX4J/0Œ~ԸGгmdք@A ^%SN2 kavҪHCj2b (q a¢ܵZEЛnGe͊ߵ1\.uR0Ӽ z¯?%}8,x3}+ 8^$H{_'RISc})ڹLN`F H U V#LE&&%Ya;K_lR$. @Ϛ9@RbWk°w;]p&4{֌031E'DXDlĒQ^FpKhۆF5Yj๩6a\)aLxmj/$ Poz塞PzU)Mnr)R p!b@F(Hj0em6X)i3u`QOrMta%0'G\,@~ hX(A4 cb4JQd m &bGw8M DZ/;NuSS5oN\A6Mlt|;i{AD+أھv8ҊK[j8WXOE*ɺƇCngJV2^ymoNTyGcI GS^ιTM>=_FTC a9Rz;={鿐ba%GI7ҁ VQbp Sb[8O)?9,U+fz/4o9ob5"+:Ӷ-CwFb7Ck7yE!b'kk|)݄f. Kt,bGJK#-<xuьk k2ς^Lڃ/Bs#۝sF8.࿺mkLReT@&rlYɰl+9휶(\7>2 pJѹ[wZ?mvF~4vZq,D3@EiD%1Aȅyx;c~ ˇ5 9EŬw/^(e vPظEP^ʤ֣x 0 %Q'ԣSa[MAuD߻4Vx}/:tnҖ4dcd=J+ݓK Ey&L1R#'E4U*,4(~U{$Nl+t),̧/M"f2[N{_lZ7{|}+P1"(r(1`-H9p΋Dx.ɩ'>rCiNXZuWQc:D} Al!K;r<ࠨyfx+A3n9ë<wL%]i7g'Lfih3\+ܱݑm0 "E ~8@Wb}X+`gX\ñ?/RVD"'VL+s U Ьzt}N\^&o{e~Zd䡲do20O{w͵O0/Tck|͎Z0KxAU9R`D rJovږSXb']$Kh{k+"#OU3F.GCC37%㦂{CHjĒ,͠#}_#VV!`/NdܯUS@NLAkZ̞KrHY%YYCvtwsEh\%ą_߹Fו^R;3}H ,lvbmUJ *Iv~UɌmwS dI[StTAU5=Pcn9^wC2KMSTXm=DYWLN9/i\wxq`H”5/? mTՁjjGwq:Fl-i{t2׎+`HC,xEz7@Е˔`S[b9->̖Dܥj4Ƃ2ojNj7J%\]< aa(jO-\E⪻ix{D ])z 9t6L׾=3lYы6F6뻉d 5Ҙ<&ӎXxGʘ!Whge^.5.ewW1\T:3z8d`4TŌ _Pe#od,oYXO 9"fv }j,pܴ0-QdzsvLo`=*.q81gJ|`cH'c' 5R8 h-P<2LS~l0 wnNsw\7JīM{FB{mP 3 L~. ~-s/0#h8.yS2]+J؝0yn:ITMaSMaJky+t W*#I8U ƙ M&I.(}@7 Kx#mS\* h6 ^rت,Lpwh^9C3ԧ8TG m[a'Fx 4f㊏W27zyPmGR%& "nzR]yFuɒTl+Yp шE1;=_Xbtb啡Ag(aGGM>XJ Qg7-P?3]je?PڛPÆV{WjܩA@%!^kS悓$tZtM,ʉ6qqA~QSA\|"ix3aMLɼ<"!X7X^TJPZψ (`r{?rK45 Ѿ>W٢3jcE[uM>VKHvnҸ\->N?v\ǝWi@yS6Ʋˠڣj= YȄz_K"uM%lHD'/2k%CzNηņEW|#{ꉗ~fh'1ޅkxĝ2wޡ|;:8Jʴ48GjE|H*b^ݸE};n|rj~>$c] 2J2 n\*LNbY >Ҿ^OσJVlteueM%IX3(^4V (~Va\Amg*L_Ӭ~,Y#{U9D!n yؖX4i ;#}ֵ'LT)J[2;Ӎ 0.~Q)kG^XttۤʶXX2*)#a/|҃894 4`wBL+wٓ#-Us]O-4VL|q zH|b%i^A%vEg7z~ fUZ8E@ta9-W%9ZPe#%#V:)f|>X.ؑ]bz#fJO'NdZW;G=ݹxNiQ& PTV1@TJcGn9žWC푆nu.GJg"H='MNym.P,*K)UǻZRohEqH&zqo,(r_iOyDYe;Di!O,*{9KqN[*=!NM ̃eM뮚0&efÒ3|*AMW )ʯoDURhW hNty]3|tl7ĹC ƪފ5"빲@UB Aovړ)<$ x,"hm'9CI* +2_B U#ͧCRPˆ.w6ގj,Wxè]&3yQ4HN4f:-{t3i#5lg ,J쉂\L%_ц6 ᘈ{JC$vxfeNS|?4P?Y-&!KvQD|u  zTyCF ڥ )iPf0#H0vNoecP!9z PDiRt;Ww`+8c&Jgľf?gT'=G2CkqSGLԤc˚'1|ոi ~bt[YKI3bt<-϶)34=On"wb:de5p,f{ұ6X {5>pT원:2p.@q}Q44u'1(j<uVF^Ahև .hqpat:xQ ,-2j޺%›cPVcXgE؎,lJzVɁD}u6g09T_`"Ԟ~uCnF ubH-D 3;PcKx4}7sYbMzt? "2ICP$S@ee4nFL+ @'iE :R >X,GM%X>'ll*7N \τY|se(wAdpd\qәZa纷ʺpoh2mR9jnu=58RBew↺&[sAقJuV[mY4(Hl<xpLPv %ƥH I-T?Ҕذ&I@yԊЯ+/ +po`?0/_h,,n,Jہ)av_JoCX,!!t ~؈CSq5;:X?. V %uڭ~̢͞t3Bô+@@:EoyGCE^t.*G۠ICMv9ͦk\V"ld5)ln$|V)92Ȭey3dXMTet _|,OdOI퇧92zTLaTYMYqb6Ud3onu?*aSVxf 9tGUe}agr&b1JrDm>I##9E'sV%~iKqP:`a)6a|ybo6vbba{pƩ8 D .YuHٰ?"V} ;p)F)Ψ}:At;<*riڅ&G5Q/z)uZ IVvt,yC2d29/͐B;* 46@.F1eQ&BWrU3 r0BUvH %rgE=C56^%a1n18z!HbiJUde!SR1.5_$&hE.g'KqxMb;u? kZ"]6>C[~X7' ֿTο_\D.0 X*GeLbK`N^|VEs礣6 %HW~sk'7Stujr%0I]EY?DHէV[+  `u)@ )ѷ_)kքuH2ZZwbKk-,4̸4iF$s!ڋ}FE갪N@Eu@3] nnjUֲſ~.nмXW^XpgY0C;?|vf:/I*"2\tdig3 caZ8ۏ%=IZR3B+^FQɒMN~E ɫ(.gEwDg0GkRЧI@õeVVg],~r_pPX"#/k)>_&q8IŒj*~hhGI(5e^[IۘQ@$RuTsdX~"w"5 =`#~PY+5+FƒgYuT˗O(ᯣ#M+r>kU*#EBO DSV>TM-ݻa]3 Z?3*yFZԱ286TE&GV Bd!}Է.2u03^-8>i@)%]NWFSݘס;UQ!9ҶʄrSl۩: @}Z߬A)E@с~bS$xImى5 *[ROaTXmLEzӻY]@Df|(7-5ߛmM?ۧ;a]?ϙ0  tݽm#YLzէr?>^#^bSɫ !4pq'TrΏHFZunbE"ݎaLY[88UxI"G%?%×c(1QburFr@ۭCDž%-q_8ܰӕf{iǬE/:>>M?ɭJ Nq,R7)`_mA$%R7[K9=jE\vd78yAdNTF3\| "1^8IpE-iZ6Apޓ*8e&׎=fsmU|`:~r6 *(&oݟs'lG% ov\x+@+r_%G C.@B#pBDMf,F93^|JHmЂ.:JDT6u9YEl ӆc<{n;_}̍.#{WgUX^C&ҸD*x+/rLYj_zp֗n+ryQ"/)R,(@?ϋv3KJq$]^>cU쁁hʴώ,@K N[:BELhH6Ѻ]fLx})nĦit:Qwh< K&#N-f< =,-b} w AbrW⸩I)~zťf=Y]_+b7lc}5F4^KԪ 1XR;6(%R6>ly*&,@ڟ!uK˿`ڟ=7\bx/;)Kf0 7+DQt*"7[B&nRFCgݬ8w6uu<PUF9˔xP @$+4ʰY2M-w`3Yz]MXq vQQ xSSUl%gBY"(n9~W'Njv 7'5.l"J}8|/6Yf#RtS}D\s$k~$%6 !ZtTS ?D`)Yy>,zԧN w."dJJ{D ˑ_TaOv--3,ʤN6&5° nW˃ox`t8˯R{[rO}0uʍPYt Iץ/xpZz&Ҟ/p[u X? ?/~V;CAn^q.i;e'Q,1ҧ-N'i2%9Cd2OKF1zF'rR^}eGlس e~P]Ӫ{dae]^vӂjԤ*nQU!|4,w[E9){W_'c(y[_*1[|A9~lL ̵vhqˊs!j`4`D?^;/w味Pd[y0~ `@<PPp> lQxp~^ 0١5&G@U8 *w5臏60*Xa(-;77򱸎_!fc㸟1$Tq+\п3+i?#ol}R &$7HV#}1/,}:zߞ5&}=^:W{&,X%؟XTX:]8>i;Spn.ɢђg(뛇a +W{Ga#Р;e?.8rwb>HD0@({_gc1e 2l_1\,yDK9̑P ~ݐd#5c%_å-wٲ85^!lvt@AH;OS1Gl8*PM*{=ؽWyK5 OxuUt1G조H^ܢ/Bun+DwiKSsb,dC-oBpV+R8Jn[یFA][{'(v$,,\fDV}o&mvnv Aes#7G_{僽ia >iv^(b4~JVH tV8׉D!hY z# n ݥd;eOFvHh@ -5\,\w:$t{!`H=g!uă,b&?Ll<ՓsG|sD{_Pe7S@aD[_ض~/t<Z2@ޣh86) 'jeξBPC,-,_IuBT=iTbgJIV!%Ik8Zk=w(+F;pr&VbJꤪx<"^ RS< Y|z3m9L_ ʢ96,@UmqjeƚhuGR3dSnIL?/'s슴|lUz2mfw 7a7spɂJvU˩[k F覅^]$^!)sby)>MG~q!F7xe|5mxr45eJ{^Nۊy_j,뒙W4Q6ǶdHU:)úRƤ{o#5$ Ű,lJf֖rܺ> \-Z;bƉ珇&! cC=zF< 鲿8G&Xid8(`e_cɐx\JiJC V-QHn|bᙉ3aX]'pKg,Ī#w&RPgz2͹,DQj1vHw`>q,ꭘ~)"/Ք90Hѹ'j}D_ui)8ז;815X;"?7NSuW :!T|򹹡==_Wr;}uuY{KUc\>{Űl}m%Iw|DZl(SWfwi0`d#9vuF۹]=׬qG d/7?gx} ׋_,aqN.?tPӻtj` 5E%׊+.wP;`uxcIz,$ieb@&qE*8, O&=6ȣRB$ll+zX&H"K'ηHEz\u{C<S82˽W@ONZNoxx9+/KYn$amzʁW)~%kQX ZJj%yS35(;|_tQ]=ɻ7HqKw^/ Xͱ .o68NPJd_@Z4O+]ӼMigN?zغܣ7>_O*,َxIn|TESjk}bL/: xj@NKaQc8`TqL3y1|7~rs}V[2KM I<g*a|b:V[z覞 cEI^T*)rK}~xh /" [ [Q;yOF|6jyo!uXT9Y *V0܉°hiP:/*cG.-< /8k;OQT.8#P18h`OO %N<to!@6v `H4R_afr MVSQG;>m0 WmFOn_"mɻV7jQ.;o<hN窂$[a~(1-c|={αP{v=(Vup2rjw0Tg 4UxTp%9 -O!!$-v ݘVš(Kj>N )m<\h6Տ3!0xT@G%P4)uBTWx0vJ%*f1.l5ٯ<'"󠳦.$(Tuy0!ow۲ Cm-tdMO&F0U`hc_lD엋嫁`7ʄpwn!0ّz?גO(x(=섶^e̗ $vqd-Îa%z=WpRDzB$ޗOcwzNN: @򤦮@By5}vKAޅ}>TDDDqO!Q|<+B:x0{ЬLL :A\ ZyZ8kKPw;'n\nӞ)4EY P7&e7poO m녚Ș Ns{`aff`iY8>VLܽuVFA*$Ty@MVfd,(rDY҃JǤZ'f &HĥzZ\LX;Vd@<բ(_t>Lw_9(ϥU+Vvk ^|;a Xg+G^&R ,|j4QIP{-sG@%=V B0nbSBRdE7l $ܚsd= X77ސ/nI-@:hR6",v%ekN]C2=k)C'wwwhW642]`_TGt~^6^~޿dP񤹖|Z5*vITAV>?ac_VVxmntqzAr%+)Tñe_9AV7 'w_@Lf{*Z`<ƹ1A2(;K%`0KޫYD! qfq_L;z-kSap֬Z8t6a-Ua9{|0L+fv[``V"e3Ozn9H`kҊWr6?΃ (Nd\d.;mvhP}|f56]]̟˼Bu;lqb&a0{ ʶbWNU܉fSҭ`sYs6`im0w-x#u VĻ-Ɲqب +X5+y|r=,|Ϭ ]:,`kX36 5ppuv;KxF;2 Y*W([0gD43}frqATleo%:bג*p)lX~lAǢU*X$PO̡Pidej+xZ02*&F&yW-IϢF+f63T51!|BݵzZ%{wGК8֍d /+}$lhXFz6x9lN5L[F}Mz?^[(Müؗ/umUu6 RV2iUC8K}5h/8Bv>WქI`FmSş6Ik\K*r  r,<)g's0n::'K˖wR1D]'ؕnAE28,1lHfEVm_bhOW샇6~LG=9SVmt,da9+Z'dN5#S~KnE\̥Q QO iv PD!HnkH94K҃3`PMZSrx!5ҒؑY(gD˱Q~ݳ"tvی-n2%tf\,w7t&9b!9ݷܔEU|Zj_x˲! r!IO_(maI]MeT=NFIK;%/:?(A]RuS[wφ+@[8m "Tpag8b=~ɩS \ԨLDu܇_>nfy~::NTC;gd *U4~ck9_vf̶[=oL?$"Ғ򕞽_^ݎjAq3фⱞZ)>4w%2K*W`t-f?uE^g➳?;r:c.pjth 9s^82ZK3G?: [I%64q"}G0nd) |2 G^Ӏ9\SWs_:^ C0D.-Z^IR)$9rPIWDJU}wʳ9E/ s_Q:rYg+'E{LT{?GBYÚn gu㷄~.14h8j>dN:c40Xrx0i1ia ߖq^r Gwjݪntzf@8d(Js WYC;6mM1l[k99o椨 +(3d:H2k2+ѶNIodJJ8g1g_lyCLs/nFQx&QFCnH;/*Gfk=%s(EBu\6~bɭ`(pl\'m.ms~=.IJqFb)E%mCFw8V`|Y ϖ)lyf?|-`X<ά1"]" 3_^bCk:,7Nd6F!hX6A6HhĸJ5v (&#M7rFOVI< iz:l,X>Q@[ d* 6hw**?zqqbjlZ 5tre Gُ` &6_]Tj k,FUjee"][3pR Y珻a땫YPAqzSԍ'j;#l. l %dw,׸+FGMRɹs Eg q* <{)_[$<Bh<<.xvJxP᦭ <[y$s: L97Hf~ae TduYf.Njz) /)oM>f^ŀ4_GՉ#c.ݧŨE"IQ]Swh5f"kt5we_ffX${6VLT GߗAvŕώ 3UQg; #&?逦di!I=QѸ8+;!ԯ`Ge"o=T|Z1ZV -F9K.j/2IP27SFP6+@UBs7ևs>+ⲵ h((C4Q6dk?-LQy)[=݇; &>6lRѥ6r7o0`Gd{b++*Xf!Ngmw* N3Fv͖[A!HV콃K^4룴,+I3CM.ۅ.Q:|e|͠oTUÎ | lfbӲܓ;VK(\>6ؚ[̶^S(H$smŧL=XG&b!FGyqA\[NVnzpⓈ;uFm܆ Jh21"tAWfs5,@R:VW䋑3\ yУ u Mhs0 |Dۂ3 J!J,MXWWY [7YeGb 5.eDOYU Md|e Q>NG ?r=[|+pL?S*fUv竟nT X3(:"h(u:Zk_8v#K)D6Uz ½>RA\ ʦȁih/L ^!3N U-'9jkkwk{><3<}~8J4NT'(0Q#L+`pڂB pF5ϧ Ē9't Glۥ!ELFXg .> R;v^;tjqXl ny#:PVO:SŠy&b@KPL/TifVaN&#Ȩ0  VI#ӢF).\Cň#!Q @Ol]$4-iA gsÖk{C%'Ħ/D.@ڄz}:6oFa8CQ"P ۉcX50=q,}E5?iAȬb|ȧl2-k5e,x_{t#Xזl؛(Ŭ\jRuU<:+؀_,hȻq@OqYq[2/K2kQؖ [ y\AxVַ}R_1fUŋVRw=(t3>KRrDצ~RW%G:6ߞL ezFR&fJGp9t8ƳsAfjR[;VjP^)]$d8 z8|]Z ZM U.H|}C@bWKvuj8#լ:k//b7adܟMo *؏wuwYU"o䴚6qϩ0]Ik0LÓ0#xubʢ };H=" D{X8#"+4F @ϗv^)'-B[ c(3[FX0oYϐ e:']ˁ@ū8Q[$< r4Ł8KEj@w2,88`F)ǣJ Yk**/= k<Q'?~}ߍ⒩ǹ1]}x]Zm{T ;N7;5ϵ (v:r}ui. [|⯵~xpUi!kێ80)PPйRh[To})@2R@dI:GKO>U;8nNG2̇>=sDP Q _sog.!oz[hͼ>fzЮ$Y_VD/zqNP. Ý[bRt~-hd ?ݦ2\0Dp|˒bRm CzW^E&;8& NHaOt3έ4E'$!~a`kD֏:4qW,t޲Q6 T3ga:.DI2d`*ѧ t(ypp4%Ɉ59"y BuOOsd;HQ b*rr6lȫvIs4VܝXmeZYS)Gq[O9wRt8`hw9w9m0Y24N}YtHN$^jgX|;]cQifZ}Ö(e.G敼Xsgsګku[23hA,D",G_ZT3u'G"'u /.}SEA9fXZ@`F+ l2@ D({F2 X[麗GMԆƛ .W'Dq]Cñ&>f,&`X3$yڝ݈ -Dɳ]rGel(^! pWWU7 ԓ9fi j6۩ɺ8頇R,>"4>=lzaqLX~KTGlU@q qlt E9V* pS M@+XQ/rYmKdW!GrЋ5k&w|gM|0kM6q,!5RiJ &f*G8tIfx|4t,*Jp(/LQ-A.ScBs&3E|.I],YeFqd'ˌ Rz*. @s 8'lz].`{I~Y ':,NKS6%t<a,zmc%PZd!#_BCJv(I|v qfd!ߎȉRbT FPKUG{R^p+{u=\Q\ Yڲ fS`RUT;q?X"B|*0/:xP\Gj3x٧4r)M(G'ưԨ`)JvVO_)`V;F ؽBrl=.&*DX[2I=NWzɵ,ɸ%Id>*s)ȵORmRM["6@H~e{nYHb0<5w&ڔ͂0I+Gc;zf{JEK_42j˘ȌzX-&72o08h4J R} rZɽϭvIP$ea:0s JFaF,Jz}]Jp=z Pϲepy(VQ5>|%@+ 75qCZ¢B-4woc$t7@:T%p6Ш=4U\X 6ޛ) BD@Rth)J2HÈ=KB/ys#!lt,>+.+GoRy9$&/[`)`⾟h/F')6 fS>}w6!*>uaPs'mѣ;O M[)Вe[dJZokx-Etg,iϩx- =h&^,8b>[:NmG3Ly9G@*׻L%!ak)Ȫslf/`lls:`SrJX=fZl[q:r&?L͑l%!C }ۅE9%eV2ĵDZ5У`0UEQbree9%ҹKu˱t (Ē4)o 3`hXiQg(O9 N?ن2^uxz|H 딨SJVZE ?BdtR+4 ܀ӭg:Q߯_&mx"Y.ɘK1)0\]2k6j=X_턻NNѤŔi!ۇ°G~ԛCC!* 2QPA9|Tb 9Lūkno;ʼnUܢ {2))ZQ<  jp'UoEP&b,U@N&aj|!p[kvĸqu@cz@h#ʼh"6/']0 Ŭd^r8Pmtja앛ֽE dzȂ'#6j+ թp869s[4K2/q()7/XZ*)"m:&<ɨuClc}d>{ zM(g}9k!fCjW9+Bğ e'P𹓆0wk^q?i 5&K`hyBO!Azr9?ҝRcx*`*kB'pT8ƺIC 0-G=xtSqqeǖ#['> +,̫6bi-_(!f(Qf`$7[]ki>Wr3@Qw`Tt)L|Dڮ]~ R%VI`4Idq4@ӮHe I"Ai/(;$!CKCh+6pII!bN'l~zazkrIПb .a10c!p Q./Bl2Q:u9,ZpocvtP!7i"$=%PnwvoL^Y $DADW r bINyؐD)HcC =WFVZB rw!g!0c#_I3,! @@+N]=&FPlGIBKsoCWzLg ?Ͳπ%ƒXؚ=¤K\Q<"}SۗoٓA+@Dn@8ՏZ@/`@0HԖթ'oq w_QT?RIE8ZTT0bŚC@/(穓2g2M%:z%;CYzz܍`&-=洔ȇq1dre; bye~l\'q('){s%:EЌnN&Vg=}cṶL:`@Ј^O]i?]9`,l*^"6/9h h1*1E#32ii4E8v@h( Jzfj!*=^LJOk(Y+AvH,RKe3D ,K>qJq8:P:Өܛ<:xh- Έ\6pRPJ>+oݓCFlI\Ze6( L%>-6q?.SZaY(%*0ؕ:~<2f9u*8g9x)iw?=7rH[ &F*<6qKSF"P!!QG-.cѐU;#|cP "?RXZ軭SFvd/AƦ[${b6V],[k2_qqV=qj:\>] WrQoL 4m >@:>:X7X.w|jNi l {^ȧqׁvo405p}Bk fJC!7?>u&;鰜7m!\:;$oI?&ӂ `.3B3FCaF{--+ sg#1LePAf.DYueś4.jEc{"tG̣ΚuWh|)jv`^3,`:ӡXj-a~JXNyeg(zOk7t{B0yn1"4-P3${Nitk;uq/.v?&&=QxRr/j6tkJjgQ^: {QZ>b(1Ph7j0($lz)m=?sNa{n_;<J BVw3ID dDڹYq R +<#ޯ8 $~llnIa BeҙBc%C:yc-rRnU0q)=(XB2wь<V6o}˒U *a7e*3bYb"B_lZsBN%SM>.bdfLn;+_6]h5kJo=oh |vnMhyjj/JlmCXShFnS%+ꙴJk2%p p/ײ=~EKͤ 'ܹδSqRLt )'뮝=+t̛|dUo9&MD0d2!i02Q\FȕZϕ5nI$ L|ր(*@{etDmߨ3gHwj?.,v xPИ{KWU>S&BSN#N4s,п+"Hf\*®^݄[BqwE%QX^Z( /:-.QY'z[ @ QSNyP?ᨑ$W?Y4S;"ȶUev,iXeO!Q!H)h3 հ9GhS̔5/o @]Xkuچxgvi1\pӼeɆKe6[lE*rMWMܺ,/kg"K>3ѵd'6 {`'NT-f`pH9×.{Kcy]ꗒ!d)@>H=z*ȤY}ގ|iDF\$ ʌ¦u /k#Iw?eNK~N "rHl殠,jI+ {28 "K" vgvt:&Kia3X@KQj?pbvRYURhpl黂`@\Ș?qi6͚݊a\'/xVhs쳫CJ`.sF?aa͠[f9#HGON.wi8R> Yi,Ch{^4e ^ . N+Q"ZPc◇k98݋T`ХV7e%HuXz cAxg4,09{CPLڣc{&d v ~$ F F at[״P0q$unK5ڃlq #sikVw4VڕF9a.ua͇>R^|OFVAs /iqOG]rOjsv? 0!S켮Nݩa-;+Ć_CU\G-MU] V8ԯGH cCS)<CpW%C+tҵ;{B2۲SRzn_ȿN I 8 IFNeg$Cj "8-~ ɚ5f1ڴ} ,.u2ާyJ7}pk:A. 7qyi|H_7 Fl5lR+"'!>aɳee0ҟ6X$/8fXz)jO#H)p;p[- &80^:W @NaS@*9H\/"@;h*s)MQlwB g1*wl4F5e Q1!f?+^z5KuĝX~;N]q: HxZs5?MU1 =:fH{-wP;XQKK( b)Z)Q[2k>Z6US ˖ ŭhO\]YR"/D!~6xrKZd O>'w|cwq] |9z ick`6I֊]( rP娊'5 v<ؗZ )sms^VE8ij8m^\1[a]-RձܳSZE{к7H֦NēVP *፻O4LANݠ60x.PZn 䧏Ͻõ6(2rp)!^ -AUX.lDmH]^tF?AB<?"U\)ѩPܩ1"@N a6bdA600ǓӇiD;8]E32||J^|#  Vܟq>{g7A#dŒa<Φ|hUjNl]Q_4?&4l>u{L/lZ#W1M?HiZ==wx[)S'+ܣ0gw$è;I ĵRo娛G21rBլ~*Ң̯R\WBEs}S5daeo.6fju\&>msf>GQbö a"9YFolm;}.FE ܄JA+/Rl2K SAȂzG;}ȜRWTk^K(T-tY^K2P'PR/paM1Z!1P|ZQR[XBC ݙq+3{;8E`[{jܧ Z h*jyEB (6qϯ]:i#JՕhPV$ WShÓD6P|˄׾1a\*A'Ǻug+JUrS`~Ѯ]okt4ѫ{('|rmTc|+ f㚎y_6gG)G,c3J S3g_^0jz"Tؽ0+Z'0>$UJY%reF?.kals 1V4jjҩè7-~*ދݮ^gpw%S=eȾ:, q:VH杵jټ3 m4MTwP Yuu."iYzpsI5ֲ*6 (Oj?1ɵMLTb\)W$7gCKAu(^8c_ޕ/e^X/"#Ё]EF1O yP*'|]UϪ|:  (STBwGI6-o 57o!˭EvvsKk%5&! nkTfx=#|CK{@b=UK%D0VYo䟃e5C([ Q@'X| ,u)yᚭcH<ϭe̼˦`@oh|x>_7,d[JXe&lGu?q_.#/x$(Ycpc4kI{}7һ;G6?9'8P^@/XRc1 $ʶRPLQi"cFR9NfYd$~6}$ p1\3==P+[pmggY1eIdB\pV(d6Qtd Kh ŤKeq䬚?{fw '7]7a3ALT`7z:Fډu,@ $?{<["51U7P$3(_kXU(9BtJioحR.8'z=,"~9;U2؃j =|?9HwjfSgշ[^{U8t) *@$:Aqo!eP ` .(em5;$Hm]>`W,qɃh׸eO2>ԥ_ǂGw΄TW*/1BZcěDE7/ی eE "4E8_: ' #ۏ MQrabci?W3 \nƝWCy [ C ֋misbs+9f_6=/6;[eV~Cmtͫ[ | [qs6_p:x|r!Vs`iE/<] T+{g._D˭j[ؖg?fub`..tB5+" 8%L'|̈H79{!dtyۂ1]ZR-:Æ ڟ~s E6X|EQ?( pzlnRɦYCӓWR,r~]яDVEoH#}kfwМdp,ϸ~p>˝Inn:{>uzFX|nя@H]u R;uyzS_| $3ՅW6{j)ԝ_"{f, XNpzt%ed;u}̫}w"F˕ PMno))9B%ٰϟ fzfp~hYҘ -R$#<ш E8BU &6әŸuQX_D&(ACgPk L+=O^-^>p~Bf ra[Y+kLGMJ;@KI" !` n{r-+1oFs2kEpRd {9)su-#VC'2 ,52K/Zewa:'Qm{60Z_IW\ߋF%\h.Pfy<3Cs$5r]]>aE85)UJ}OVׂ"b yn_)NF_"ӹ&&Y璢cS֪P@9Fc?q߽b:I;*팣5Ơ>myt3 fF#}nTJk2"P! jID:qkVu4$)O6ƣ rOsmp |ըyHB65 p-e2ra$0))`Djl)Vi<`LcY,s>zx2_3Lz"LRC$i7NcyPARU6_nzj`>H)dt.+)0f1>%)Ml/UG$Zln Jco{|<(:\E !q`\mһ;CWK#F; s拃#:og6{QWlP'^1!L8޽`(>b uXZ#6!8rz2%Jl½g-J':JvWClXWiRȖcc  6_sI#ݷ*')jѓsae%ҐG:Q+&8qw5gf^A֢4A Ȧ»z,+LP,o)p ;ΌbN9 3:x M;O7W?8Wv99usՑ? Q66 GqEn#(uX5{Ddf>G1x[Ao b?/X71?0XDCtcd' O+g$/! 9A,(=i@Jjb pY]ax2͇%D}e]gRaM4^ҙG귥T&0_QHcw;nqchgsŝwt &M[Rd8 [l%GpNW16_4hUn|z? ra?c:BVtWŮ_gОyPj& D|'.z7izV*Kų5reǦgeEԩ>~?- ?Ikt8ׁ{ 0pBmEM0tsЭpgm p+BpHMx{?ݱm&R)0&Wn ?xS#b(&FUIq]v`$yE-(°=d}Yq,b(ƥ)4f$ 3WQlO^Yiؽ_ww|[ok5|iуYV&,11g̸~M&!׶3+ j(BbnYTP #N4LD܍$RC,(UBGX+mhPQ4K$Y,H$>LxtNטM\ f\>{b\oUhn#߆z6]>b. 3̅ZlM𺣊O}pA֊c ex_TSWi: ܚuFewq,e)~)^# G{n3qf5d\cXo\Ce]BC W}7ϹdE dB+@ޑJۺַ4{ ClbX8x|0;h5EĆǵj4ڭ^y{_iÏELjtex"n@cNi3DE݇+!*,"3axaN .C*|qOײ9FEs^#:T7r.iDxvg1_ M+~# 9&d}[?+2t'@wBZMts)2y{O,J2%Gn{:!_L0@J#䁧Aʑ2hb Tf=!BڟL"Ԭ#rVAIh{Jnk`xJyKi|??V4/bݍ4W6BE[L;wGWeTJo }T;gklH69?K'GkGK ;1#^&L o+{m$8}L"ㆍjR|PBmr#plƗ֬<5͒>6a'Y)Z(M3X۶7vN/価2NQO *x;{0 Fk Hvaح 2Il"JᎺc2#iW) ޼ sRӢ$7Mz̒Ѿ;o* ?ce4saAD/lu>AOtD3SGq BQ7 Xs܌:YoQx҃{@X d.߃e3\ KK-F`DN离+Ҁ#/ n aIEwN 韵c~]"T[Sq\aնd\+Q̭Љ_]/`%k|kݢ/b,$mn@+"9lYӋB/pFװD[e"y[ä)RIH+@eK Prs Gakr9~lr6 >?5Λ5bmV^PL4)?L`OT4xw Ňs垌rཱྀ[ա X??Ga%{|ZaeL~&}.M68\6jF;SAW?·#8WB<" |!5`ݴ>1sJI>$?Z@+ yLkJOΒ]ӝ0nWD+AC"^i`= 2,f:y{ |)v&CǠ{V ǂ5PQ3ը(Qt`n?a 7K[5~Y[.!qs1Gbh\?ɘgLeP8or 3u 7`pdE& ;rʬej^Oʅܴ&7<|o%]} Nyv)E1pE48ݒI)cLˮAȵoGm(GC~ 9]q!pfxyX7wI"^+WpM nb'㷞+UN{*jz %M\{9)ԋ&$[0sq~FѾMI }&'J [>w+zRb2 I 3 #LJfM]I_),"OD*4,H"%)\pb1wMkous@3'ATOLW/-N5:,{D6‘IQbN8<7KQLfe*[ٲw.H4<;5:c*p[b W/E@"UչfO9bd>K4!Uemb>[iLGLޜj#&k`faγI>O"sD ~UD,XAH5?QFCS x( AqtZXX{[$Ax2oL?Sҕ&L  %^-%2W 9Md,[UxJIpjM>Ex܇zAA&k/5QLM_ʜ…;&s&e'pWbw”b>"ٌٜi0MaU(ZCt$6$ w S&2b^zӥϠ{Ds-!*3Zoq[ #Կ͜D(\' j-oE)^솈ƊK޲0ctMr- n~j4Zzڎ)c@]=o"n3e^wyt3f)4nY;u @6#'_/W2.XP@p=Ďd輰/\a4) z\&ނadY@eyY@Q|Gٍ=1AP'$4vӵe\WW|_XO350GKuR;}DsZKZE[lw-Je$?MC-J䄧v?)]T+U-aѶ$ :]c;v6KK?i',yVlZA#4T zh9\hϔ~vi:z"HCSN(|@mи|jdh H+û y13z< D6|=J9n~s7:FDƻ>打]JCZiB$ٴV PKQ"Pq/8F&1wE]^t0ih} o]YUjO] 6k|!>VKRuU.ֶm!AA|&ʛl^p :J8ejB#p"Y{tDLca GW4rFq&/AR ?aQl9@Co=&g%hBIMY=KFTagI8 Puǻ|N}]XW #ù=,.3BgxZKuSYw˷yC,=I"JCi˩"ۤ|.&`i=nO6,v@ɢۓkIKu:ɟ{1U.5bi9]Y@ʍ~_mYr T@fGziJKR9<TgvɃ,.R mVK檬b̓#Q ZHABDi㪷iăo3Ne{9je(O>e60&l@W;iJ8L\ vDpHjYt;@VO=epK!  JO*$~Zۆ&K MߥSmNnؾ@\6kW‘'2٪<+;n=z@#ev-k /A 3Ob};]f^;p (Swoe 2D_3/?&:*o>dYڜbݧI]].lu|EV'RL9X:`>:Km]*]2o})[wh(T-3Ldq=k)_mֶ4i@5xgsݸ3ΓW)o?7w8[4ޥ*laڒ e)# qzw`2`;y'uM$y1`k LIykʃJDxX*UĀ=3^7OPns[OPׁCiƜ;)M;w避`L7_b'̋bC_XeBWUUHkr0W%b5d9Z.}R(m,AN_KX+Y5%ViLE*kW8QOV|xUnal,nD2=y2FmiU5|Pz5VΩZ"7Sw۬ oo< * )ʄEx9"v/6$.. :MTL@Yhb#n :4ㄳoA%veU\ h (X.l94d( cnꠅZć'd'Gj,Vő(?MP|xEgrNDC2:a6j6؉7Ow`ѶZ &|`Q:!{SٓBjO"rRDpGՇ'ǡsT]c;"hra~.Bjaf^^ H%i=,bϡ5/K93|Gt&jBl:\;q>Rh32k6xU)v.O(,5eaz$)J O&l~#]NB]YZJ8}VZ&%u~hx;c<'2ɔ',9~*<ܴ̔m"b6>ۂa&a>S6!M.* +.  FQ7I[~CFvfpJk<)b(y~^y 5C_}gY.`@[ [kHy0µ uO‰%qnB[8; MQZm92[)OEA"ą˼>5v^"g~/w!bq Qt%r:G"Z4' ]mKӐ}H?f+7Y(:?xb,2 P@:Q]~)zMH s&BSo2& DJ1Pm>}]:[nw49 8{޾sZk&3"cr ҴC.Zlk _X3%Ҋݛb?EצM|.|i5?[hD,pGRqL莜vjIdt{=;M͓4ǧalg#uaJcqėWNai-YNAۿ[8|^+21HXF\}{+1jw D-s[wVSXBZ,YN\[9;@DF] mDc@ryɕ0CAcym^GPJw"Ҕ4&恞|)Bp?.1QUjE;H=t uGы2=>0 YZgstat/data/meuse.all.rda0000644000176200001440000001111615162303122014655 0ustar liggesusersBZh91AY&SYi]]H϶yxNjnwxe []9!hCS)U?J~6M4i觵OjlƚC?JdyI&D&dʞALzG&P=GM=P=M=FGE=!C &yISڌ= 44Fd4OP@h@z@h !h4h@(h@ M)SU6zQU\KΟ3"GAsRH~h kIh|7LENg1/GbmY9DQh*zVjՀe!+f)֎ҷ7MQ:SEVޮ*I6Iz}}bwq1лoseTݥ٥S_ͿՍJV}-:vV /VNBǏb㰶TIp^vZKEMgbf)Z F*/hQ'k-—emFDg26t12PVK1#PQlZUcËkm<CdRBT(hv U\P)G LWxY,d]V@1f 'r`QD#Z_,^1T`ɡz) VFJi=FG c9%[,Z]˶4Q8I]IṶ\ rdc N@XBV<$)C{Ҡ$iИ:] X8g|P8;; Ęf0/0 8Z͋ԟ}kˬƖ2nmm"|Ȑdd0-3@(ǚw$! i i i i6P,-U؛VrI$ .i[sAt, }Vҫ?Aj]z&65V;6Fa7&pnZkU3uN(Ϙ|!##ԕIBEX8tK<5ol} E<NyZ]rw)nL!+nϵK .ƐȀNW.,f3OHXp =nll8*NQY[^ BBrd@tC`CFzn ѬiU-"WZcZ$le׳O7嘌*+wz%W}KK"1M0zݮe##+4wLFHލvu hFYv=_(jv_;?Ci\rٟ)+QhK8x"Zȟa#m sԁkӧ (kЭFZԬOGm99q'̉l|uMwahl7jKA` }"]FlqIܢ3NG7A/vϩD䘮H@[Meh1X̶ D}y=U;J(xk]^R"&gH-D򠏲Se6cI.Fe+cMF3hPo7٘-QsZ<G{7]e GNJ/`Vm¾!My< _#խB|hx39 ?@$R2nFc3[8rM}@GWX~pV32A:z `fz&NQq:ػ?`:?ҍ\adz{ ymf|&ϒ:m 1zv@iS,N]ۑx\S}뇹/HT#va%}%R/Ɍwwmy~Kgz(iؤBkU7f=,6̇\ju9¿7൜p}63y* &ztk,w+]lgaWM>"rx!iѨ_70{z)Oion[P?E7 賒aNX:df_ ׊a~m-){?bY3Axcn@s'IԾ>- S{Ŗ%Z@^5b| = N 9d҄M@O\ И<+9~gX2<)H{9ipviMrn%0#ĐNOXl*0yn`NbEN#@V>O:mexz/"C _%ͯ{џ {*. Bٝ"oI>Srvܙ՗HmIq/ |E>?#JcuJm+،h4\Á@7mq9B(|Icw/3WbUD[n""$py-bfMyT[[8_/i6XyڪJr´izY`ɸ })9xդLM~3xQrcm.yԺü¥ʎ}lP*JFVbҲLq5pp'xLi,dd/\\_`vetmhCj@lkZW~pƹ4Q(Ö:k z ݕcZ/mL 8?uM2"~ӅG+Z0fʤBu{,K2VyѿKGn{KVwPBְlREW /X>=ޟdҨ_wT7A]ڐB@\'y.z6V:^\hknOg"Ϯ< i7BY"ty;RL{3o}@Jx+:]*Mo ^s[5hGR~VŶmu-wݷH8k ﻱh l,ոě޲rqdɤ'3Jl J.N",36f!PhmKx΃!hoaY*kwu[(~Yqt0>=]jcm&&s':xx{ga6&Jm?PD'Iq?P8U[̎ЀI m1%FZ{Ul7T_3>>WFzSS,8~z^{ زq3.\\򃡒5Z+7"}/pkJk TxX}al-`kcCS}xҡ<mSN+% P*%b0IJ O1rM:9y/g$Ƌ.)! GcO|HD89w;VpD$lU}FLclB UN)"q+~>^rƑGYq a{?O6-9焨n$:-ush7T`+qr!x]<7y'z,GiرrqnmifU#;1Zr/AEc]PTeܨ<3F_,`=;RlDbῲf3DJ^8t:!ebFRo&<Dw.rC>l'^`Ұzc:c}r7scÉ)I5Fhi>ڹTȠ0u ,d抜=PL 4fAw]hR2D%f)5D01J 륉/Mcb9r"ŴsMQf4ˁ&3b\É8޳C/%[Zgy4iG/S:F/}5oq–pԁ0Wfƫ\7vLqROz/SQĬW3+jO$JnuA~.ZL|%_ Fz6'/aPs?ѥ⏣Y/L3/_gxn:6r(釻 '/#)tNP:ON]2,MCb£QdyHA[őT"_ mߒ H\ɓU5T'JZ/AYJj/(Fif# _J3rt~w&^vߖˆPs>nJvf0"g^wιә!hG4'b2q0+̜IwZPBL2 w%@uh[pb$bzc&>G?o;X34y\gX@x;{#y=R٢]ίgwFy,ĄVជ";/=Eߙ, J GE&Mo} nhĞT2J~iTMTXݹx5W)1B䄱ZN;wS8qy v~eELE? ck(-MZh<ڜLsuRv%xs+]pkҏ :F5mJ Z˃4v삈)O%zSWU4V^`Flm2;6zNz BEO&j/{[pCYMZ8+[B:?3PnߣJ=ƂG ^(?ެ&1l(n,!< .ۋԮq4@(Sѭ'Sf}ݓׄԍbojC(|0#c$p<_^ ՓY?Yw;]{, Jٰ8=7PKp?|{j2 bn MW+;$,Z:D!d.oLљ:^:k4=:iRd8`kt$?'/  !ˠX%PBbٕ݌95&f?}?Tn=&4Mζjwc_*),P5ʽZ} y6/k)'04MO6J1ۿgL"`_BEf"sz[+/xR8z뜗vNQ9$Pl1E/ "kZzKS`D_W˜ߎa _)ܐ )yq 6N ؟ pBȇv܍w*ڸF>1A= j.\v ?1gyS{7kg/&~jqF?4I5&σPhjsHȚ @ʹ [~<89r5AΪP>״VjJ͓Dx7/K7#9`'*q߷ZJT`Ǭ|}z٢WfɛT&UL?^IuƏR&x Vߠف(?|˝cZIJPV ynwDD5>BUEFC]#AEؓz.p S7aYy|&"K#!.uJ afiJ.Ȃj~܆d@WpW7iρoGHx;|-rlL\ gda.Y^!ϯ6?3J%$fd3j "{k諿"CS9Tߣ+ L(>\SrGtLyGFpD ٺר'2?_=(Duy&wzW1z{T Qy"bl6XOm\2 RPgY1Xx96\+VGf*L~(-5g'Q /=D|v,է$mRPytܺ+١i#CYhtu81=2n,Z ëZL蛎-NY +]xq،J<8\jKKkmA}Q,18z)! mn#/4JHv8a$~ZW]ny6;k>pq6禶 9Qc.M*L5-7E++%]d=niĤ#&U1 8-O~+Z>U,;m׷9N`qS el o#3qͬ5 ;~r0 Ke;cg֯2X'&(*Rs`ix)| ,D,i"nNW`lAU{7BDBjaeOkaz! ̌/ea2o(,ռ-sˑV*i(Tq|~Uq:Uk }mPTNjzx2FL=`@{-= DX޿k/3BhG N嘙XSJ-j2a%؊^ 2O`v[EhS KǶ;BhI?1 >9 SX3tcR_M3SdJ iGQ#]vE;PHc GVI$5D] <5S_%b`FOWL/ 4 Vs pKT2&qK$t^t&4ĉ5SS4mǙؼ/ n5Zئ Yfўfk^TTl ;!NeC'Hr) 0Zv0_-&`26f،I:@~8oMq.\CIiNtɔ"8 ? Gqj>AɏbDmr¹+nů&t5R\7`Plmv]KR! NdƥzM3jF~yܯ zdlK~o4Qt 86]6,0 XhrI{2`;B/hmPCR")t:|$)+Yvr%¬N6Gjκ#A)nuf# s:񰷕JǮlXvUpI<:cR{rpp3._ByN6cd3BOzZ$rpL ȏCч*-cf $2Az@(8?b='}?`A{(լ \M@(M{ gA e;r,.$_Xeos2>,p9KwA }WӬ8곲72< \b O6~YCl])D}w{֩KC$3ASah$)LpF%U?R6`z[\ c*9[*._y][s0‚9֭y 'yn\ s4s*~/(bK5itԫ(k{G:̇ռ!K$`r]w@!Նf$!kC֓찚SυTC5O|f>p> AuQ(4C PRH￴?]$]Qi|=$t!HYY2&Z3̋3U֙NCDW7+R LL[c|n7,b_㨝*M!4w[FIO*ڤwvg'!Agw5r>)o.l;;3性@2l@43҄@rB@8A-q8Rv0` k_}W}B>a_YS5@t(]Jvn 2 * HR­F9Z ,X۟OK"~S8Hvn ADrCh?$sQ.YHn")` S6c{b8@ػOGؑwͦ'V?P鰾gF rC':6j5|9(^1\毮M*c~#.̙=zCd'W~O/,Mcy %뼭 LGm{p\\ӓ׮=N1F:4L .#*X@jXѿrͫft #0< ?Df׈ۼ[&\={@| 1u~qFšrJo.?fRm?op7_TmYrm ѯ4!hlf_9T4>"Üj3X1`Mv=ɮnrEkxnVTW 4󧚯V0mnEWd5AxVϧ}hOV6!lZ.ǬqT8UQ'h]4ݱ#F j פdl\%%?5ȸ[uCM"nWc/tlZioƓUk8\m(dՅz. _Jm%Tj2gbAG#T ćt#7" A-jR{voՏ`8^)6Ia( e&Ot%1~_샥 NހE-5r R?f 9/?šKE4,!Ji%zd=z_iYzbl:s>qs&s4oUnnG;믠9HJO)ys@pbAL#-Eh)*i<a,d"l} UEo*=IJR{P06œϻjAi\mwy/\Gtؿ1#@]^_dPfw?`1qcVǭ٣DInxH9xB)?sUW50+~Fg1!Yvc*$6-=ιFbB/;)ѻWyhԅaji&|xu;K/e1 >.%SUr.sthݲS-TLBbFP x%YϪ;̎[H/]E![WXrkςӉ!="T,&3uOJG. A u8}-৊r<%vkSCKM֮o'x [}~02E`~FJQ2[Pio<[U$Vo`e[$GyζS35X΢{(^7r'lp₂=qp(Bݟw]rcHp U^-bOG(s>˪ɩ*@SטZJޔ٧_*yUf&K)`Ŝ(N̞)jK5sr<$dD0kobUs<-eM] p(Kx)K-6ddc4D)65v4BNmTȝ`gqi Z`{nLmg^A 9qDo,E%0׎f,iq"s#jt7Xy?r9+eTQ$޶\0L7;BVLb= "ϾG?uX Ȑ7YT<ry *۾UKW~ Ap<7p;S}y@RMy:#\ӁGѱEO7g_1͜yB[YYX u)ž#pt3 v'4_5xƅ8r ywk2](>×7;H* r̀QZ;{ju6@cuY^iQu<2Cʨ-:fz[#X"'MރkUKw{PUȵ= ywvS7G\1? De*Tt /x@Jy];[`ĉc%8ϧ"ϽzҰ\p|nu<(6c>V.> #.;9ǝMP@\a#R(_|KruAЏΕ#fbN XhLek̫Wm.A o&J'tH ﻯg@hJ'y_! ) w/c51Aݘr9id>Hm`"I1OcSA7~$zϐm̍=1}u@IhۣS1ȋHHW==6]ӤRW g"zA&%2rݖ8V ;.kDt35qngVG Eȭw zF*=J9`(HI4x&,*qvf K@/@x cbPu;i xB8E=]Lfj4Wx%OZmw7r~A~ (3*K.>'~e{OE7ַ`zI,W z(.A,Fن\ى{5C ˺BJ~)#zȆc(n Sv@.]ӵ|5~7%ipM)0_{*g+`)(kn}=gJ ;?ߨ|h`2ĞOʝIяd,!VoZTg1K ;9R70be"zdcrm'hTB.,($3ϭDkC$7;tj+W JQۗ*aRm`:pԠz9l8Ln.KW !8zwQDTիo=؝P K0KA|qQSo?όF/ч !Ja޷4Pj~_b9uOʶFgpі)=;cˌ_ 7o/2}54 k.qm< 'Ջ O`~bN̓R}Scn]A:@٪ C5u{Q;;8ȳ꼏#SF =gbhUA[uC쇊©[_x gl 9#]J-,|ڻuϐ;;FZ6JP>?]HIPsqiCӵNxh3vl?6Rå~,MZ1ĔI@@l<`n8 ۨ+xwcVxL^ŬB 4sx}G#*/9C ^bT8\dڷ̶|کL FgQKdPɓ+rn}B/kcfm@_u2% `@f{/P4wߐY`fܰ3t"w&*t&` 80@}2|!=\AD8%XD5rƣuWvE`f-Œy_2S9|.H~jmM권c=]Dq8Dklm߲ȣ[Q 5 0lܿi%{d f!k)l%.tVN2S&qWMtFG+c>DGA }B)3 [0: y<x.?[1R$uA)-Ԯr= xcP_6Rm6ag.oQѯ>bN,!eA_b=TM D<͆X!jLg: MHQt( Q":um$Af;A4}͖E 'ޠ_8+O7 Q' Dy5J[m+ 'XІ;ZK%VڰkG.c]l 6[ec;wQ)z#.dC(QJ(I(is]kbߦh+WN~*kixpcAΣoTf P~sH3Lwe[^XuXkH@'Mܵx晭Qe=H<-/at{t)Ll̉!6!KMf*3SR(Wa aǍzNmS$t!Ov.Yj!>(.޾Q78xv?J'7rq&Ow|i0 bQ.x+fؔ> 9FgSp1E[|4vᇍyZ0R61lV9R^`XQ뚘6%&\q2rbjzV|9(.1_@ʃx~8|0 Y*(QF5tN)I i`ydE|c}xHƴY B*5=a]^}Hr7\IA'+] n&_R2nkp ڕVEZpS<1i/kiߛ-/+NAJ@̉fo_JD@@8\aN'~?y*!0t|9$y!Y賳_6g+{>7 :Ln%ia:x%鸠w+D|#Tf U8ͶT1_o~X =gj4(A cDR3#rh)UJY &] |g"\>ub|t@tpfl(#F\_̨\Vy8|=A;&E؂Cy5%HOm_ۃe#.u_q{3lIr} ߏcܔrˏ<} +uCe}esq%oZ[o 7 e%Ma%w.ƝCm|ٚ2%_М+䯶YF(H7_v]\jP,~`C*qFu}Ep1 hM/t)YqDMVMF*_EFU!|1cWd[yrKWk0y$2F;6~@Q(={9Wvb;'UgU ۆbwbk .m/uj{%d[-IK:0{l`Pnq;u d_-` >=B1[MȘH<8*>Qyʀ~6CT8[=2&-<5Ƣ:?@X5:Yn6VUXWp-wIX[nĚQ=TV=;I A5oUE=I5\mٔ&iu?xxi׌ю$CJWkэҠ7 ZrC* Ty"7dbOD ^OC}ev/`@XCpWHE'Sa7J,'1}#du~ 4ٸøOu6߾l?9`w9/&D$ߐ -V *7@?^]o.N|y;f6ڹa.73)VJ*8dCf CJYRK:^`9ܵ:w ႎJT(2*T^)i-59M,I 꺔D8~ sO%ARV{C9řMEӈcܼ=갯qh;4+-CU=*~ÿ(; K/GQ ‰EEw- *d]U .,+v *5a> Ӎ)za7NstN = E B& dNژj @]s]B:hYD0u.| ߺw'1tZDv$ ;$-_m"VQ V~>:F<-Er3&m5:Èu e潋r:3aN/ PؖCD|hGxE@3jIYy/ ?hEuu Ch~SnP?Qyҝ+B4&K Im:L= r~2΀RFf)6)H\ 2ˢGNB"aR]ykHbmj( k\wOfR޺K۾. N G^gw t ͘Fdv4`!IG֦ɩ>'ȃR¤Ac-W""]O0%J[! twBv nV@lj^/ _t+(ޑcA F=Ä,˖򫄻)RN悥W#wBo"*((-WͮʉYJ=F',Ľ{iq6k㍛76k}lP`K,uXSװ*Y@l)JJ oeOh-/J/Z5G^lVD0+,hd8f-Kf +.@X^UtU؂ں9q\BuyЩ2ͪG!X E|f - 7LI4q鲅pAD.O~`{.mǎ2U͜.yrE3ɖb=|#6/aOf| ",슲="ͯ "1<#8n0zgÐCH#\'IͭA'|tnixkBAB' i30ٍMyBT9-G{7eZ\N|1Yl#Q-+z#vR')>xt/4|eTU;r#N<',C'I !tTs ^Y/c/xH.[ƃ N:a[Chk[WxqϠYTGk\V*}b7\Œ{$U((V- R`18AqG_*hR,<^酤q}i3p^'V \4]/#FJ)ے ^2t4 э tDoZul-^?\jIGtG<ć>ݎwZ W6}1lDyO?gR>f3JK9S]-%X΁n xYez1|+#f]"7=gM+OR$<0X\dz=Pt>r/(ωZX/G|b,Ic"ˍ+<bVi 6<؂'R2NSi+M!o%fYOs,0?uمI(aFoxƗu践:"TgfE)TL뭨]V/KWCt~a1epgb[iڒh3=.Y#$옷)?h𬀇3O"j7UYħ`>MQo9LEk䴡Wz* oP%?Mcwc%-7*M/0+r1݄va9a%BaYx^`Y+ ychxaT/&nkp7,6G_gs6|S [NJtiM} vLX0*ޛ>:kZDBvSC^tP SHsl`)ecEHIJetEpګd}G9ki&yoA}5AXݠPƮMB"‹x"ΌiQF oD!vV'xqڇ mpmzX}.0cAJwei3lR\8S_\x*>K@q;4,`3@#JRQX`K9Ѷ8XA xm.jaFc=QdNOkx\jSHh(s2Պ}3*Uçil  (cqp4Fcgt)^fP z61)^tm7\ Gc .d×ܼu$72Sm6mg\@H1̾Y=4n8Ͷ]?t=!-3M )&. Jh"s_4 T|1> QZ[*\TDZi S bHZhXXa:U<x׽JNe<zƭX+l[s珊a> H.K0} /GDqRMX3Gg ^t-Ү?+x`)b?eN*&9ِ^37W`Zx}hxVK4ՠsUzF/&;(DʗVlh2 y]BEeIJ%&TZR$\N?Awg;oK$,@O@0k|^Z뿢uAj .ШOjs&ēj@ ^;*V18Rk&^A?ʃ ;$4:3FRZ$4hmGXmLBnyK˹RgXzs%JKצ(Cicw! o/(ex Pus?ʣ̉GVm`*Cj_)?fQ(tB4 QeDЌ\bGv< +Y?nGA^8h8d88wp D4aV HL!lbd0#z٠OEZ. ,$Fwn~Fʏb@/ɤn5[;c:>ai n$I8K80U5p(hT,NyxG[ˮuLBX7ڏb+WG'؆2ҞȬTC6q]53InfXԒ!w}Pu="Oٽ2yY# \J͍qrrbI4)ǯD{!l1()øf-WZ sG4G1T@k< ;֐Hzͧ8lM?yS9`ۂ|ERN&>?ۃA0 ɳ$567t_=sD{4 b,ibH'#>Y^0'+%,*ORBm.lAۆ,?3RhT/7DѶI (|:: rPNuq-_)0cN*z'J'ʜ)$g k-Keʪ/,-^{wᰈO ꆜW F)pSHo6E5%bqKZZGČQM' mr7w=?!;W5н>uXp}}^Ґ#+[GbgK1 aPi??»D(@0Uǘ{QZR0WO2/a8zn qѭt~Pt18-:ƃ#O{pq ve8kA i]L0_pKx=߾c0MG8Y%aiCUq7Jl$m(qy>O\MfM'O] ۦrנ4oP~--̭jGMд^gbu%[7WUMoyz~sF7 B.4VP+!cd2{{JlyS* |ؙOEB$DZ Ň)ޗ`3i0Y $ջع֠vꔨ>QqFl '/jKL?b5 s)0/-Ѓ`jV6' z.Nedǁ'ZBl:QOt.2٧)+k-Ev-dRO=L> 4rOYaq~.I㙿o}D/_ qbXg)V?[_toṋp^=f/1!{sɾXцFM$^H l#dx5z͓TcO+lW`x)PZ故ט 7_{m*U!ojsnp2U->{HLm2b(;oۛQ_~YzTq^"кEt"t(!bO72Y?z5=cMp)TllefՊ;2ixd aww#TL~.T_U!)}aa0`]OVK1O?{ۮw2,._P]gG F͕ #.<lc#Pʈƾh}**喐}Fˉ:|z8[Cŕ32?uʞ;冩BBTHU)˖(Ǩy$r?N\x<bj^DX`*ß\EpηP>w~&nAo1B8˦\B lOB@Qn.;i(0xNMH?d# H2 iF:Pe^BB5 ݖfdۍ:^T>E/r Z}SV%A &g+sv<* S ߕ -i]4_v59`djE+H?Bb97'~* ba~L|׿ox12ՒȮ+&<[EZ/ctu% r)cƍl`WfZQ!* &!V qoC'Uk8ud#cQAX⯷vJ}ϠLֽF13Q.}%g%\J̬c[ϒmXY\Z^̖.\r~|7?0̞'sp6lbKQjFa/LͭvL\ꓤzf㓗$&#K/s*#6(F#x<>TƊtJz((u ]U,q~@ZIC,Y_#_lbȉ%E` , ELдS'Z7W ^:!M[?IlɂS## jk=Ab6ߋ_w_BvOucN6BíŤtᄓ.,6Jj^,KSPBoӱ2XٛűkH; aq[uZvτ T(x~%_P@BiWbqrvJt&cvcau_:ZI\BL3xU[^PQڴmŊQ˧B$;Y$]=xp#tHQ8:vHvt >-UA!|LjHZ/=G7<)M:|]q[! r*jGD؋$_%d&^~<P7ܡSi.~ӎN 0/OzU\^2Z#*l:U:,|uӿG2U{j8 g0yM7¿B)u)u$ܡbP$=+`[`GWxP/fs\0|Y*v+UiJ̃Xn^.2Q Ũ\L#'170ZtoobA>=HlwM=VƑN߮xz"&azѰf,@/N'Xz v.`i#w(k_!p.QbS#~c>&] 9Xv'F[,6QvyQ(]`V 0G5,HLC ! Ƀc^)լrA00|!D0b3ms୑ _5PZRy a|?LX*VnO|b IAows=Z XI.n-9_lf &?/DE2vm_<#!+͙o-x0_!lv]9VQf~lZž\.bǥi,-!}PW˹U2 =0\1XzlXѫ#G.Ϧ^0r\E{c˩GU!~q`la6sne?p>%( Fhꏄ7ot"3˂0"ѻ%>G̪߮fڷ&oxű!ZrUrs}Q{bhe;[Dk,D,;i~@$( B]vny?AN \DC <ʡ0 :ӱ& V CJHNϰ`VXYwE }E$!'S ps80*ɒW#; ~rD%X϶9!a ϑ,,kyKz)m)pq-Dv :LE}bVIopY!:9mf rȋMn(>hav> 7fΖr8 fZVg-\{Gr~]z*fj|.*"E֔5~\iW̒\1ٷC|(rBK0m|nÃ>"/u2}{8 Y?žX L߳z?!+pU \F*͸{A~ERc^xs]nIßU4CW/Kf yf'e[%ȋzKxS@G{sy.0` Qx/F8tG0B.,KZH =.dYVmj"ȱ|2[%ZѧFpnw̑*}jpA>Sq+׌</<])O^|0ʺB{=uxՉbWXa5k2+}l!x|ݐu!qlD6CP9uɨL-Y:ZE}PSiSA@)>]X ;L$R+&!uGnl&jncj?ns0epFoEyEZ_i7MdDtxvN11g91駺 nF}MxT*QwY,zp.R!u*:aY!W "]?nQ헤3\z瑑>Уdݗ@AqZ):t~B Y}ˌ-@d/6u9X?!<']-gAFؒPJoX(Vd۠ctA v//eq_Vd^duq F V$.} @Ʊ_u CWA߅XnmLPy%&Q )WYi-qHRCL"_5鄾(_MOLhbЫC]K#c?Fx8ht\C'OY,ȁtߎ +Q`miC( m|&dGضb̆Ǒ<;+^&T53aGmَVHjYïq)-$}!c\*]*rMg!? RkU^ [{!_GܔG&:)Z+3$蚨+k䝆YGD ۿr;uWJ^6MC!8Y#!,j3kP;JBHu,:k!+\?CnCUjp0W&1f(G!b -e;(BΗrΗt/ڋ7P U _9lrkm<"D&}Q~iďe`.1gݜsTl[%?9UqKJYl]XM+ED0~ `>T%NdFd˟iuj%,xU|{Bc[ewa)X )ygd,(?Hqpbfԭ`,Aڲ%"\†YWo7qb筑GD 2_iA< ŅezTp?FU蘨dXzU=tᄎ[!uIiВ!3D9A6z63pCVSޱ8CFlbϥf@r9):RuķTXI2 ;m#09nzDX̼& >IXµZ Λty W)iW̕Rǩc*rtaw<=Ǖ4Z+F#r;}L22UZ6u'+QkI9Ƨw/`*Nq4O3?MhԏWnH$n${N%T|j^pV@'g2h*i7!$һV6 }(x^ңR.@}/߶f"~V|dR*veݚ**nU@VeA'c<_TbV\ 53~/=AisH?.G#LuvC}ڒN_]VIXk(hnU'$tZJ~6&}N m5Ob0}I8cljDmȬ@P{;]id8* {]~fѻX(ۃk޴NF{~(_AsZ1 I;Sǣ9/3x@NxĀum~c]ߎ8C:g#;7j:I980+%fم7A.9g~)r(]N8^H/u]0{·Kpj*B R;X&-*kO{ $nŔy?7ͪ0+Sw$'<ѰbrtOt!t1vfqhy%S<q :T勻Nct~yC|yRW/?q{g/J.IM/OJqG.߿o;V>p+4ǗzwdL/W9!^?-` ?a:z[.gIWqWuk aI:3ܭ(`o?/߼nT3?y1M yi?(m||VLںyj~`;T2s d ŸǎZ<}ѣTeSXL|e,XZS+P5{_sҮȘ/e wI~FAš0ҩ U;(on?^ S:Fvb/!oI-sԩ ̚bݼZFV|1F.j:O0 -)YWar&^|Nr΢M<ͤ7pL!jj(s$9`)磎oN(/R̫@P0/JD;F =Ė!PI2XOEόR|m8o 7z&jӺ!1wq$"7Ok Y_G;&S9w'L\ڋR/IbA\L@Fnd*MȠ~34q27!ӓ[lVVYi#&D9toڲY`5JSC"J+քSV*`{n8q&7Mq`s\]IG$fVADe(P gW' )+w1D2oO2W $!#|U)7ż>0Lu"]~~L e'v],_w@UZGwcul({Œٳ.ZkR#R$HV|='~{p-/zvy@ &hpfI[3'/\K"}/32!ACED~%t݇1;a@w敦~5\+'ʹ ??.poV?|ȴi|cel➥B9y:&w.̍qSqzL2pn5g4Υƽ}X >z?tANW>r1 F"r5fs4mH0m U$0r7T}TJ&*ΰz)[(/=8T+m??8"ů2' }o`[*GF )"].ߔӀy`iX(:gR"mDCL2R}g";ݜeq9i`43=w<>MWqY>-^q 8vOx 8KTqwWn>uֻ RoU@|/CF1UHqFK' J^QC-mPs'"ˏ#s\<ˢՒ 9}hY!#jZ`!rx0q_vk廆 Û"cE, z\3I(h(!3B-w0%iŰ^b>cu#A{#)_H{Guju[Vm<:Tlu>o ܱ&tHTi>ƺCbV㨲WY uI?8:ASM9 $G9JQ--V2It1q=vV!Dͺ7'uůS ;M{Z*:ZaI6KL3=TXAErYh\:`7L@~6&YsR=ni^'ZCF9v^JLLxMaJ5(NOS x컎5T+sEжaz9H4?c7sP@ e0_ = #֔1jvuJ ~O\B}9P` t%ݷ g)$_&:*"- K2R񍰕XhU-A*T+  Ybm]ɥHLt}/_>Ar!Wo?A[3iW3mux $EcQ%ˣ/2Z#yLp.MAs>lՄ5EXC\ \@N@`oc12u,Py9z|ٻMlxaըުB%2ÛUuha»5ЇYQ6kAJ/ y2Ҁ=#wݝqBeYSbFS5A_OL(S]D,bAb5F[`4n̊&r@\‚ MV:聞".'%[SµK_$'=nAH ۲։{j9jmLO:tDGǬUIU9P;<䅘. ;шAۧ?63Ly GyR[_*\Į%׹ ܽ-g`FN34"# ,WƍOAY7|vKwYy sv n_D"[e$7N,YG 1f2Փ'X ]Fn*E)X@p B9FmCL R3Q<~8zu;bp9 #O%7f LWiJgv-H8^&xAǽ ҽ"o) k8DiZUXPSFd@oIBr Frd'- 36IDƨ@Bu\i$nԊߗHZg~ًsi]xAcmc]ݼ+;ũ+˶jl;UZn{Wmz)SQƄBmmy*U-M: fF֙+o%/q{jo?ʓà瞸t$bSXulV$jpE`:f5LIpR>|O*Uq(sw+tE/e#s:X HOk͘|Ňoܦ r'[M4wK?p ۈ%!HXm$˔Gn)oi@.P]ъCˍ9NҪT߯S<\b@[7[: BP45R⦉5^--'@[m^TBV8l<>3\O ߁©3Dvvz?Wqiu F|wZ\.F$,Saw 2={Rd}U|(=D ^>(1;/XήL@yύDl MS>X$Ӟd`\sHDnsWjM= I'v VVC$CP/P3jc/q6g Uq,A#[nl-zD(KMݗ2GfLn"yr1Fp ≋XK 7OmQ*c'j鲞4Nd> v EmTF ^/)wԻ03O:}|Imްyp+r&+)%m'rH]"g0tyK׹l1%z'yTlNJ~/gV]̻\5à?7 kq *Ph; zM;`ºU@1k^j7t#2M9 v{ hz듈?D},liE"4;qe֌q)NwUK&kvgYĎN`9Ga VbDqH",kԓ`u%&wf1 |>aMRp\EZ6e{N-SE+<[uw53 ljԯʳhW[{o}| xN.9>jU|#w̲ c{Z6 w:vHwc~9I`س&ÊF<]Db4fDRPV~ x`=O7pGp4 &Ѱ?R cSq*l) Mؚ[ѸF6!| %aE+5jOZ~o֐L+2! 6;O.qL .>||dئJ& /~1*[)[6IѲ(l5ϋ !j=͗kfm)agƜHrHnl߇ξ[ؘFn*UCQnN|9)6MH+!o\ B~H% OC+n^uK>.zy5j )plF 1<  tᑵc52AuOL,_'S3|-b/ ex˛^B3&{м@ځ)]>\Ung훼KW^X!=Gd}o`AKs%gTUR2qjrsATegvZK$`4c$ NxλjY𚰩Au+"yUi=NhlQﰿmFTyDpeyoVozUl\;;gq„dF%2_Fhߋ7̋S;PK~>r\iFDăAƃd R% R;-'" M:&MxTi4]̴I`_]'0z䜭WZaP&ݡb wem;H{Ri-\n"^I3lڕ- -fy5d[Ԫ6zŀ|' h(2H(ű~A)"U?< 7iE]eK٦Ln|Z.3Յ6W^7QrYD} [l0r aP ԃG ::e~poܞ,nKk͕_"Am֚_N噜}![%&rUAl0"P'tL q: v+mDlo ́7q!\莇kۋS~L(to+i-'p?Z1> iM8b5Hl^8y175Xe]HmVO*(MWiw؆6nO4'7/Y/C2ڒdcTM^lzVZZ4pi/&ߙႣWڑ?.h1aG6mYLqs%;1,Bc He/҆DT Y_S#_6h\vC{:~#*rET'@5j0B)HK;ф]TUs^I@ىY u4s2LX~DF #ϡvǍmn䀹f%5ځB"P׶_`0ܥ!O!U~ r ~l!ЊĔ%0Y)2{@C5KyF͵TP:qdJCT\gnwgbF ϥ,KZNavHo?YEVG0F6Fw?z?<;z:aj^ձZy4jvӞ#7M9<47q<9#ͷ.'cHZc `VCuC[(ėxMafDYxFܩGyliRpˍNX;ozE YDHZL|JfPiU:.ueb$6.vBCHyEBjE]?nU]B.#G=Kvl[~WfS.7\=T>À KР)yY"_蒴M<\%Hޡ5bOnl{0뼏rn"c\U(Iac+΂]qSPdH|T2zyq(nH/յͅ>anpɞ/b5}@%Rщ`[{1Z~ST(y+[|vJ\5iPVٗX&-qpwX*~#09dc$KXY${;-T{.D̷KWƳh1L$-(p`"v9|3O*9fx}&-3>]5TT*.3+6,9v 7bHucFd?nTzXcz L+ɱA2,Ȃs`esZU7YDRpeGe.g=ܛj!Žce/RC?"j4+VĎdP;Z 5OvHwLI q';vcߓʨu\< %7֦Tz`^e\ywHQ=coGJ+S IRvQب(y mOrI?s*+S9Q;՘V:.PZyi3%fd5(BФ+q? [ 1}Rj6 ]9hM&AzS )K bfh27t.DCɌAºGEdT)gvv'~ޜ0tS{GĂ}R_EE]LX H܁R-H x%Nj&ʽ{A}}g8JZzF;Y6(|?n&49,~#Oqۈ3'z%~mr5ua X٪eR 7ߘA۷+]SYW#sJLjmu/( t"ǃ5䘦r2|uX'B{|!ZQ93jLEDj +Ļ ;|;;q҂ #w= 3 aΌ营1ޛoJvNb>[,cphy\I#|ɳը`kΕέ%Qg)]s\9[iN[,ɴVXgo9vwBK]{vjP&퐉!*xƥKKQRODײ:BjBÃzAP)tfcj"pLEz ]&olWiQ閶 2 /)Y=}K{U'96p̷gbHVBT"hzT530l-jFֺ;恔ߖ)x-NMzHm=JEY_?~!LѦ̪Xo6SiސB|$&gEźuwDK wD5^h|TPl֤.e1x%H<%L2m02Dx^9jc@џȤg-pq&Fy1S0^ JS[X z9a5o@Ga|ɴg8P,OkajH'8*]d"-dv--yvC<گmV} +|{jD(Sl V0ǿ[U=paIIi*,5^ rBvQk+* v{)(e%zhvo3HDVtC8(410ѻ~Z͂By|yH-ѻUN+#lU;B&ᯯPjEozϚakCJZO>gyXba܍ N^NPyF-,<*yPN+,0:/wK7EQE$"<1/a5m֔$:9LUéA,o`i,8zPAҶ\dHH-].1/X`53.32ui;;>DN,m / n)iC':pZs.%eY%;HUDUU'WPxK J&ʆ^fee“'f 4|e32yVvn#ibm>Z9F|wvD(UGW|4"1GJF-\-jAROh˶+^i`z/ܲCD<}&a҅>XY[^N%ݐ!vf"8+ߚBkC]C=N4 _.I6N`"6Ap5]RyR@mۍΒX=W-r״Z&"q>* :%&zJl/;17A[1d?2+v7~'ď7^rF@L.jn0<_ ϯ O9!"҇vNE1d6E4SlAhoLK_-'仪"ޡ9cg5WSo_ۂL~d'95m~KfFŌ;e C<#B#@EPi +ͳI J;X q) MD{]Xyof%D.}R@k'VmH-qvOEAr9,! /mڮ ~FO]^d4sMh 鲝$Ck 5fRz"ɨ^4. 6(O k.bbوy|@>4{=Y1xc-njTDm]Hi >oʙG>E6/nb9 baiB:K8h8 SFu^bj_WˋcP?Hct|Ñ>%Q^ZXp&@eh-LNf3Ԛ#@B%*)-\kY_iRmv('ݢ>ɶ9LT{Ǚq'Y J&_:Ӱ2:R,qXEt&*5z\LnJ8ֱpr$M63-N|\+kٴ1ӇЂmcH@mt#:<\>^ .1r=E$@܍ݷSv{K1uk3Z5xx?y[iͶw~x{itW56>oKڒl@ .DWq2 u[{M=嚼.]9Y x%=&4=%XfҶ 9q|1W *49- R#}Ure䷜n ,f>T,O]@>ioc6$LZ*U|E:Ԃ''4fQtV,^_g:4 gJvP,LJJ}r"aUin+ܒ[s)TbKN QЮS4F^^Abȸ%*v%'Տ1"Ԗ3H~ 4\tl#Qt-烚s2b>%\WU$`!1iD)*,5]A$=(4/8-O.r*rBm=hvfHw\SeIuwze㉁I$SzxTWD|:̻ 2 /cYWޛʩL0r9G4UZfD͂9Mlr>>KRI27QZQ+pf/swT)ZTD"6p9B!Nn!ͦ.<Ԁ`}A,rw *E|&Pl9u6@OI7秉װ@#uObX#MB[6`P.PS(<cĸwg&" '\|3K9%K3vE%Dq~&nAn\Sd-557N&eۿ0>pi`D6@آ@jn¡ŒUuSdi30g{:iT{g8a<{ܠ\gh[o_DπNU7ΛI;SY/@GrSP|SZGW"_pw.3 u >dl.aA?sI:׹HT9NxH*R.K~].E>R7b|Ưn8b \x_`G3!$7]BI 0J~a7EAtĒZ}dcQ4#FH}/ j_( L#uDz#TfqRoLfriGpң07eϠ ~7zl}0CYvLڮ)5S0!3*C<g y:GJ2FW뽬ɒ6ˎzh8PeP=`S/=9m ^P(0PXJ;6"^( #FxHzOqE:#2@ egҦڞR!Ud&5 )i9yq(vV(ޒg3V6_LPr/J4tu U# O}_aOc(8(|9=mz wrp4Oym2 ,Ӣ_r-K*m*O#%F1$n@׶闢籤$W}s5ijKڠb-+ͪ)^ bQ4u=cIfczQw9q )uTtBDZ*j62{oϬW8̃,cdN^@|a"i7:MWw@W1I7:ûZAmbԷ%z2"OHlsyB!F~=2gW:.?'y7W"$y'!+p$=% c]Mώ4g#>1.%gMksC3Qεݽ} <&pt^4i _;}>.+.BV>qEソT;+lW[Y; *ztRyXl{ Q /ߠ1 +g@&E0שӺ? T 1eW]s uPPKj>"okGX@5j)Sɕ4_2\~zԶ4X):k dtR}g_qӂQdPo4̆ʁvkPV@v҈hmY)ORo PGp_ `+εmv%4&}:l ZveÓ̵M_=T'_;[~]y$eks'֬Vyb#'%Я>smj!EյKE Pbf$j5cU`UUz2<-ᦐ܋q4ؓph䎠 ⪁}ZzVfq ]9l~b#yv haLO~&E,p߀gQ$ $GdZq*,+ 2al_PQ 6"_UrjuZHd˻Шf֬ /GL ŒU0#r+sJVjԤ- f;帷 yme+]a:IECӕʘg!hP)%sx'Bb 4dW}m/*&UR7@B7rri*)n?ٵ3c;Mݰy<C/g4 #VȹtW `P|AD]n"s=8#]-vD2`sDKCYwH.6*zDdAErޫͥ")/:B8_8 FmH% u;Og]R97/C!1$7]E4h'~s[ ek*tp4yZ+hI}^Y`T2r@ާ1 {Џ5AiBP%"+V.26ˀ9H 5.g7C0m@+\!}}?) {hƇj75mX{\-Xɩv\PU5+`m`-+ r8sߝټkaeD:"wg7^Ũ:ޏJnxhkc #-|VVܖX5ԭyT0ڮ0mi!`E} Oa>f %X֘z"z׿o>`9I=c8۵uZUH(vR𪬔2Y촔 [-nհ7ЬFKad4D]ނ_} zڅmVNj,O{n'n?) +Itcx:3At:Bg3ؠfu_U&.6U\^!QuWd899/E-;3EX54S$ֽzZ&!T)45sK_XIvFҾȬƒ,.(? 6#y!%p*wdSlN>/]5 |NjeXm'\eA}!0R RP6Ki܅YLcJjJ@_5]xd\ aygF0 %|rִ16|GyT_!\qްC|eu+>@1|OR_gRߨ粅&M t4 {0Bj@CG,06 3Oh( nA|)L4Q MAx~%4}R2`w6@nΚ/$Gv^'_CTWAFѰ+J*hyPbp儼X0^`RuV8Bmޘ1vW^_'i~xJ`&Է<{)iJdz-5d<Ūuլ뉾UsjL;ó_P@J/%,78>@oniVٵ̒UUĉlb 9rEVe^:Fzf^D]5a2gVC%5detM&jTxYQ2*j>%NxO?&@Ya0Ʀr{#jfQ$R[ig%*f";ƙvAz,FXc\H-G79g<_CxmhazT츢|&*?jBhrj~CϹCNFvP H(ň&bXJ캬5 Zlj&NʤvG?|c?3lAJe% +@ΐh*8ͼƬ*3Vxϰfo5˧.*LtUt]]C=(`"#`iaH%ux ։pV*vM*CE?87J gs0FݫmD$Qqlƀ<+PkI 3>.r5M+vؤg_H9RC'w\׏Ry|SZ+6IT]U#5\QLǭ1z Ի8!f؀j>a=$A7K6U4T.:X J "Fw/g *i5Մ4Ħs[Q~w2|t*Q6*8-qe@)cԡ֯_]4#VIt-׎YZ!xPA >3IC-OV! aQcHrLY\@,t( L*(㱵Rǒ9/TRmTH2zl1ܨ/78dl@SUĈ:3ɢq29R۷` y|*Xl>q\jG0ptz*06w#! tOߊsRC}T G8;bG"M]̱%sʅA7`OYd PXM0Fe;97G53LwxJ={-$Ս:V4y (I;:Zl.cyv{pTܮbC-vѝ Sjg?h`+)ʊmo5mZ7=!AVCbjM$X< ;ɢ6Vg>!#lUC*kX@ADJ4|:Q^2:HLV#"gSfQza'n1G)1NuRcd[ΓҤbqQיŞZ©|\_] f!bjwh2MNO/Wc&_UCir_"\i )JDG5CzSuёQehgkP&OD8颏J0,:5'Nx*^;uQLnhZ裆3`l^fdnI5qqj+޷0pj> WRRP{Y̰aqE߇9GP'GyRnڦeSHFBw.0%aNy+֓l6 -^k_+J?Qqb/`CqUI;j VެXKKpVHSK\o@)Nnz:A{`W0W ::ci7| ŵٯ^wO Jʧ(:*"FMkCPlʶXn ֖DVDC1]<$Te՜- &pI^d G|_16%ܡ$ju(-p25 _˺BE.Ac@e[CfeA&!T ݞLndM=(h%'5ZO›Ԫ4,) WnH܋o0WܞQ4Bmx?YM>^N$}бPw^{aD%9?645wcz;qA0P\4 G3|^ ǵkHR)^0~Mv;Ȕ ZKza}y2@cJ~=ۻTX̋^8p.Z,ZUc'*tW2}Q0(%Hp,q A_{Wj5}*WK1?)1] y32_ O5 vz%؞LuaH>ל͒A?IN&lJkY+4SNb: M+~k| 1e _MЀxp4)sR"KҲ3-rE?h$A<X5|l;=3'# 3Ģ#CB<)@ѿ5Iߓ#=p[Σծ{諿 zYy\71EE6nN^%=d[8q1gh DJS ^3/\OjF!  ߷%S<7|e{8ߢ2(\~ZW`y*P' jxHPAf)c, 6AACE@CX:@T*o;k:̏T[_ms5E_K;;쾊QpC0 \gLJ]Ľf.Y>QtsԭB q_R.zնu@9alpe' -xECz]FhX:E&ru#J{㫱|gLF^}XַF V'&-J2NBw=]z7gy"xmɹIpG|옓% Lؾ$f^0ͮ+Ԁo t.3¹Vrm^΍)? ֭9W`OiY0U.1l9e{*5 jd-Qve "oM?'Vr; Y:a&Cկ= g8EKJ"#h7/!-k[[gCh*c#lRB0T-hL΁,^rp }8Hgˈve{>ҀIvL4Ӯ=,cc:*>٨~"F@𜊗\[xV&|_突vGhW1Nyض o^W5gkcsƽBD[&7ɿz;:@"6^z3 B.iI8C܋VXɐm% dK/a?}ɚqP#v7Տ-m>-#iڭlV:$+)Zl=O<:;tÿ)k@!ח.u4x-C$ *A5s!6[b >_\MHCBSa/}! W; &bFraJa|"bfts\|~ |Bկ#966Aa16B[؎|".8*]>bLTů$ک⠿26wգ |(1NXaøۺXH~A$ o-c%=&@b l|G'}L¿ȕldT- :HٴEMZ@cw 1)X 0? {3E1CM(Wڍz[,2Om5;(ۍ LS2s<ˆ8[)'fyhIO(gSX}܂%<-z wLh[*@`JðF|9ىs0ՙBZ*:y&Ie}}p)XͿŢp]N!f Gr/4z1:u6.zFZ,uDuU[N iEZ̖M"jZ녠ɣ#O0,<+Zݩ͏+`HTs@xF~LsB`SD2" r^!0J2FniC} fwBUQ+s v퓳vK7CW>܆v' 0#MJ6rSRY|V>C9]7 _{v s]ĽU3HsN>VɃ%ɼ}I"1K37c,=?qN!E_DWvq5VS /PT&V>~qd<)[hi"|l|6;Z -q#@OB'B|.Z&>B˧^ rB=U1Hr'&{ i^gВ>Ըq|fU-GUo(uO0N Jnټ5GEqaglqYC&[(X!n6޵01`ZqvOZkеGB}~m] Z& 6mԠh*^$_=Y<;㵁Pi]xč .eVROEEK7 l%J:Ы`e4E)3ĚsWzT+."H_=c"^Fe]s'Elu(,ഇ(\5?E+tO2ܦ _fbxeㅞ ] ܁:b@ 3;Jq#ٸ $acHJ9gٌdbpޮDZ%X6?_R%<ʞitE!)'ŏzzA:+Ĥ|X]4+NJ UN"^6&Y(FlMV¯-ʄ䷘#v,J EӁ^S(AOf;2u@TgE@ofIFb)#>0By2֐ , ZKO6;d(;dqK69q`O ?xgjKĦMڦft)smoIP:VI`׫]@fbWg-@h9Nq>WĬTb Z qNaܰWifV{I@t@ՙ}NU/$d˄V|\l mmD!_.vQF>PWЬB[7|+T%P\jnK P;Qg&/$b4WJER lvˀKe}_תf) e,h:@: &!χ:k~ DYT DK `+eď&]ky-n<HŲs ?mҸ:^EP;s[ ) = lu oj=XUa>L:˳@nrm 4*V@غBamݝ?Jr"U9vD(pp'J6IGu~7ř;5[Zꨣ]a >6[s(. B0iʐԊr5*nѯE, ]aFqU ?w#3JC-($| YQJ|6V' nnDb 0a9i&t 3wZPb:Ua>l8>#UïOw~= ̶D|TY=*5r׿BBfh96ĕ1>y-(K5yݰ(⩌]WQ7NxˇI1w:w1[Wyh40-'h WRݍXU!a7,^!@tEdLiqw8X&G8m~ h9 lY;E| ﰃRb)-g'ܮjz2l8\bwB1Hw~_s@S-x]-g0ܹE$ qYtS[N|_EdΥv.azufqqm'MO"tc8<뗁J(I1.4)I=fn*j7<8I(;eV_ W!)"6֡YQ )tcy2'(Il&U2=[j셿sgGA 0]"?2ER.])rSD3bt_4%D$JHkhBGezA})!cĜ鹱˯"vޗ ^y/FzO#:XωOvRؖdq0H1/cB[ e7pgCȭM+X:P{Q ^(YXRQi"% k(e.[t|B p'HAiW:Pˆ'.]q {W]2\d8Nr6n&HN! #jYϯ9O`#O^N.RgZhNP2&BE|iTΙHؚR^,!+Q݌ke_+p WVpQT8jK@($|'%3%I^/[t%S Neˌ_| tokRr  7/^qVc7h W)(!L%ԹŎ\Z@vV]֡_o e푖U|X f. ."l2SH;jK֪JI,0DL5r@uG3Bl߶V)h*{EXyVJיm.3]fK5{@\(b-O7De9CO9n ^4š|wyqwJ/(tʝW/ ꥫ25r0.y \=:4&'е p<8!a|M߆2Vǯ4]J651G/s> 3IviuSʼni65k3Xk ! UY)OP*(u:9#{Kiݴ'6Y@"8qw\{owzބ3)f,UIUV̖(Q_tI36b2 Dcl~ܑҰ^0,h"Ӟﶀױ$"̊w\W+imӽUZϱydkAMF/ 8t`͍ ׈ = :%WWYx\[s:;̠,rotw_.O<Ӆջ;nۭmfK{P+tȼLPZI +q﹈j[w J:N+CHot'v&/<yQ<;5͑mRhY5 !F5[ӿ:SxbOG)Xd.KD7$V5"`ZzYMמ .HS=N:+Ͷ:^EVMR7j_ML@-[hh 8;nv}e4Y]1c*zI!@9) AVƖR:I] u^W#/MSՏ~G)|(0,p X@;<ÚvDc'uA[}GgwR$@PzB8*t- 8T);Zm'SĝtA'}ss#oI+r <9Cry ^]l?onK@qM@Z9D;) wY+=eh2Ճ/v+S"^'1>)|(6B-{AXSPL&ڽ񘴒]ȋӉnoֵ|&K<ڠv]be^770i~gFQ/idw-1T`afbQHY#o>N2\@bzz똤R?%opGM"(&~} yYlVi~SBrK+`&8,$Hs7 z\zܱ2 Bx9iZɒ6(-@ ^)QtADҹiDg2d(漌j uOgt[*;fG5\ %qU΃V_\g΋)Qx_[sV|!LDEܩ>Hs))_5IJF\;͍-$쥧\1ҸA؄ ldRBRCO=@NSaON edl`:6PE䄟Hh8m'@tRf#o x@βFu+^:%\S,o:”FHt10~Β3Zh G*^|}#wK_Låײ~a#=CDZ;d?>[1p=[̋y8q{HNCGO;e"|m /㴗|" Õxē>=0_$NQSs:lƇ?~1r? {NI&1T[-[$uN sm(EP3.NA:'}UMakrTOPd7Z+#)^ ±4-O:zr7*&u1 ZRsnqY$Cr5eob)]V"" m23EQ'ޭ!xCY˗}5UUeQR/ kP]i,uu}[`#6P_ڠіt $IF!.qP $sJ|b1^Cŭ0ǼL%i`-FqX5{|q)D͞@ZB"O/2u}5\ E9`Bʺը(@D[enSaWYXx)0j.u%$8E:uvvC!ԼI]I1ޭftd?!PWKC^t ˦r3c[xNm+6vjVh9RWPҧld0<,d.E]^ w #'} pL>0ZIq.I4W]5uvae Ui`3OyMʷ2E'ϴO N'Ͱ$k c@.b@wp7q ^NG7D&C0z0H5((w0RHVS@㶋|=4;MR4fTs; $$7X fkx]B"tTL,eƍm9iٰs{EbԃXz1!LLslw?l<* )kDi&\ ;Fs0T8aCO.EзNQ 铿:/kyUVyЄƋ1d &dqiK1-Mv>?8fLvyhhђݨ$Be'nn<vf-c#}^FrMt"rQ |?pELF'p9/ Оlh-jjCɼYf{Q~ƛKGHTI dMT"nQ2%,\gUt{^lu,ܵR 4}#BϺDܲ- y0D3pC-Հ?[w8HU#TL[,O0\5!pZtM)QP h]18*=^ 7lH'Ss2;>qqڥ8(gfH1@@6ߨM?74dpyӸWD : ~ 2Mc@ ɒ7W`1 REtlA5K6Grx ^%(?fl`(yRw8$ 9ƋHQSOB22&ϲYP˟t !B,L۳7;Tտk94i\Gl=.g0vX7rxCк**.Ŵ`;hXT!t F;ĨYtd?OUk~TcVݎdMw5Ő׃$M{HxҳքUխ)7}KP)fyQ,x3K&epz94}icCߍ#z( 6@nH9kmG׺ 1}3&7gCXڡlΆ@0ݫ5sfivcUi zP,X@&(==\cpkhhxAv|+~5'g?"[o5U*x3^+?y 8]/J-YP_ʪ7w5+-VUc0G;_`.GK=C)a xY/BSXЦQE搉~aق\7jNc`*t^ @BPe'1mVF.w-ʁ9- =t4z8q 7=j;*zu B !'IR[-::$-ZM3$P_ETx6A8d\`vӱqV Kx?5<)ã3o50 ^~UżzF>dǚ\-o>8 LhOۙM4giJhDXݏp_=YK?{JdJy۰ OVRr0NE»!B]8tOvuh~I:3vI|zŽ[ !fcX *Cx#׻M2O^g͖+^2-:P[H=llMd~:@TH>[%V*PX ipȉNdتIQBPQ5zpfB( UDý&:֝FF_GQ_]$ah^f* Y&yaluG]OWAeO kǘ<]tg-KrHۼI ޞL+c4"x熆![k9.Ӻ^4l{b]қo,2C6UP#ufLT#4&4 Z.XKʹ7"jK4 _ˁ <)c_sng[m)mVqB#vtD[n5.It! %"'xX .m}!Itm4/PB7pBoJ}Ghc~f< 61Nl%'rFKm0>-GI䟿Wĥ;e";G2yZSϜO}H([_l$->nl]dط0)s[`a%HPڔ)cR L_znrKF!(<m$qu{qMDmx|}QKO [6*1(n?^$THVb`>"DL-JMHX$@M3r NtP7~Yƅ+z崔sH3yCr60>1N鵟kVr"R8CRn.+$HI9F5h 4ZmLE 4F*U(74`#e`P]H<5G\ ;sd7PۊyUm-Sg0 /B]];c(vHrY;{7<=hڂK*Zp 6S eMbuzXKvn<ߤkEAדhvmn#`Sh Il<Υ1d_D&6Po5ؽCs43;GI=;dɋέ:܂j1 mYW 8Fɤ'^xj<lGwYLh??!?xaʮ i2Kir-5VNs.+|: ǓOkP_DQB<s$n^F.f  'o;tל&oG)a&'Qa=~W{z|ǐ}-P}g<)$sê6 qh'TpC젿29WV)fZLREJk X7a,|y[~~Cޅh e" db{4&I2!5ЙA3{ GI@Zېx;+*CW9FMH,w|K;+P+%'fv5{D"PnU>3Uz+ӫͮ?ۗD+q0$PD+Z*5&Y Oj$I8%hp oN5YIZ?/p3[xRɨ qS} h>#R(r]'aK1 W4=Ac!KݜѹȨYD mSI^yCY@f94 'KWJMT zɊ4M/:j-G:JlZӽ\r)T0wi?,mn ܌;YmʸGB1PQ.%|τKX8P^) ~u$)K]gT@?Ő#8tWmG-UJI44$]8ſ=>t]S:AwZ!cbJ_(O&)1IIgWrM1Tٕma-а0TސkԠȱ HTd><.Gpٶ5MlOe:>_09 X^s}IpM1r,h~b)d=7uAِFJm/Yb`i\>'`[%ѕIDQ_1]mE'!Q:WsLs4JRSU sިKwR "0&qh˕<]<Cݥy+Ƶ :SE֭N l iw|, ~q |r£\1T{ְ70i1#7·Իj @qo[S*3`y1)ݢ48vG$fɴF[ƪtgܪdG(d̲XiXn'| HDBR! "H$ gއڭjxƹr`U_S9!\SOwHq8ӡR~$F)1)&WtZkmMXET婫u1`OաorWIYP:٩z쇻 2m\˦g]@N>5J]U א 4K .FV>ƁT|;c8ږ:3\ q,DJnuy%$h1T8o!K-s% bY(OكBb`l^4K@f[߫V.a'zi#fpd8g'$w- r?c.w]uAm[{cm}ೃ}_ 맡@7x/"î>B0J+!wD ~z')MX&6^EmN*n\X\A&cq1}t>ݲd 咅Pop b6V150;b3?7/c)+z*^lCQ;rܢ;8G) 0gLxaZ z:4`mX)䧅X 18˚N2͑hP-{R+Z)E~T1Qfb1*ZzYZ2x<@nĘ{SIy<{̜QЕg{GsB嵱&cQ?8´| y)e L"t0- dDRG0>X=X$"Ժm>Ʈ7 ,KW<EZ=#4ԵRU E,m)ZX'b} K(K8ЀHFU=ǵ{t;_g {D 1A]k#ܚ]A:?V.2>zd.DAWl4?KSzpB-E"̚I 5^Lrl"a]l>P?БiP)<~Xmb<=@b+]TRVg9l@^0r p']={vi2  }2wMV2ua`AO6cťCtܐ9w?]҃$2-=DeYKfМ:6y ؾ2v8?iISh [{e0*t4lժhdj#eu{5 ev?G-mvDYN(}= mŗb3#P}%/ANi/ ^p]T]ep9a(H^"2(ԹCs&$LitzlluW_~"|PJE [cQ #ob:-`oY˥9PJj/f`0kilZޑ3UotgQXC%CrYe5{!WՆ5~g3BT!1`!-"y%WƹoT+ӗSx^U4OfJ+AQMxeL^ZT'E2=ϊof`~{3n#?ʆ^32yfcK^ &&u"Dd,l.M`WP^$m[Ws+6b7&bi̸j~}xMf+ks^l]jh2y% /ÃА6 {w!M:MI25]*SLNu @~3+4V2z kZ<,b8GpJ>fVx XבZ{husul<)6S?̶>ʴXq+o^Drt~Ztaz ٔQf BR^W.U$tjn+[gVأizk1w@p7'΋Q[bq$p_eSEf_%/2fȓWw#jf5@Nx,u7 RһޙuM7I\I+E~f_>4b'O*Up+Kt?pǩh6ԋOWe*خ)_)z2ݪ'.frW4!t rӾwR@$d¿FQŠEv:qݏݽBgzL#J4 -cmt:2%a|&0(!V >ELr!9Kh(%}R+>%HBM`u.$-Ȭ%NI]SO[;_XC/U }Jͳl14%REWd5[F}vaNrxg"jG(N,L40Wb%k";=h]b$Xˀ,-`Ѓ5֬^"0+I ͵BTOqD\=zP;䞥M!o;?2919xZjiAv5 !BJvUMMf:,M)l~411rJaG8i;<Ή'r;/g(ҍq uR)m{ij-+ GIE릗 zJ`;Wu!փԖ~-I抐8Z|7pm CU]V{cZh!5%DY^Faq̎ `bLz?O#1N^߾H_ɫ5)[$ 3*o'$ +J2Md bXl's{u:ٍ/Ix;v,K PkfUTQsmguC:^Q2C.d;p<q+;.ĭZ9p ^E"gG4 ^#'; lZcR/Fh_EŋەFB $%%m*2^+JQxBۥe\GzY9:q);DO𕕆6`+NMetֺ0|jw YϾ۴RHܯ1U89%fUvjި\Hb?*T¼86gz}:j|izkr"hQe25uaQkj_FPzHEQaYc{B1~׉r'$ts=d)pKz[b CaFd mޞ|df$k$U88Zw'3?1=2)RS(K  YV k S>.}\<+3o'UٸRG^_mܘ_Lwl9h&lZ?!{ڮ< 8D[H{qhY-xÖOl{.tAj)ȜXf!hS2~>1 pk6Ɨ`xS/@/$hLit=zq KWv K@K!ph0 }0uslu"?F%]m?r--#J~ {c_1Df͢t( =XXvhx{lVȖ:((\pYwj.~2G6[sĎQi9|60& 0"t~F :=mDVn_!6 f4cCBI]Ͷ-@+L$ *piYՊvz#\x M>Gq8fWvYmaD_A ̺$uFQ3$?`害iCnm &l0*mYl‰-ӡ[U,]hԁ Vy[R)64nv1*%ar~m#6񉜦q]R.QiǟA2%bcN T):0 kxwEy6&m1vl:9:c(vJho)0*čԣN8U I%H_ׇ̲ڟ[xO0A'Uh<,!eȋ`2ќu1R /G+HgY?g%UxebT3 H8 [nUֱ1`i/SY]@tj9.0E^UG"ي\M_LFf Kr),Gq1 QU2Yu+8tAon8rd̚.>=tb XD#+dh7RߎA+_%lLvŵlp`X\:rKgŚġH 4(+%eUbddfOeB]݇3#ӶH.*Tr4Q-iIlc9DǷ#YJ~rϖNRi:X\G \10E\8R0_vj~$H$1vs%hw_畝UL.>?<,7 Må:5Pi;'"z0E cZS 5·)%).(6뙫Z 7Wc?<:4k37DLfLuh"' BA\VZhBփU"m }zXo/No@pj -zo}^^Ncff 6A Te7C"Gh̉&$K Pr3ήd Wmc[7GXÎl.,;}t YBK$akgд%~VK^(kbuwL"f!6CUX1f:;Ux. .mBכ0 q.n韗Jec3QqRo\ Lj|{^e_+~QُP0̸j[}'(f.4i8e`21"=|&!O$h~$UŹZˈɭUSޒ:0yff`FO@Ib"}`ifpi3p렵ѸjAeFMaw 8}˶p5$_y,2DE?><{;؜`pZk_`Poo_ѳ@lNRf0?.9S)4S+bWT轤c M& h=Jsl?ڥO-G'{&9n74(B*J?6йg{IB0{Ү'vau#ipn: H.BI*20Eefi!ұYLIaP'Ņ{9zSэ99TT;O- GŁg _:أh/gش&m=3 ;s!n~9olK }nV%C?Y  a Nc.Kkas:َlo;B$BRBevϡj^wsu݆^O1Rsq2l3 靦 SOTFЃ%&R2Vkp-$uMhF.E]c&ű>4Ðx*A@-b 8·X؏T)g?= H"zkDjgYh 0 fF}EQ{k];8ϜSZ_olϝ ,P݊"=4]ܗ'%9*E%Q4ȠkO5*|njNslnXKx!T.շXovz|+ ̓y9\Ds\GpX} ڭYdd W/ k" Z/ݨ8141xV`_un0m690`q)YEc!Śd4ZJ'תg3]뼦hoG VFa}7t3OXT.d墌G}qvkA)| }UTy\Hpw _ƈʿ?D- dy}s]Zf+,;{Xe7LqFXshp;o# W[`sAE;E1_&j|<˫g)`50Tu9ݹo_aLH ~- /riA >JP>)?UVq3i]ROaM D=1J9kϣ6j]O4Qd4 _6Ebp.'?*`"R"><KrgG%+vg2G^K{bB|y8+iYl 4X婥"Du uw6B5HQM77΀@L^ՈPdnN`âwF~ܦZhyFN%SMCiId09^ܑKO$ukxp]#:fGègd<ڮ Ml\[\" z&|~u·SbN:C0]0 =9 m*0ghDx/woHX6NG4I:h]b.bX7(qPVd՛5/ohoD3\0 k,Z SXÀ('T{yn*,Z΍|Tԉ#BcHP&IErLpsvtz\ uiH!#n?*ȄKF&~>ψ]#-t#SPB7.I4B+ݔ㏿Ll .x5Gk&zr}z;2Av(ԅh` g>7:9ܱzN}QW98\XM34^FPiAE/TwR!%ߖKqQ"U^lxBv0^@;2PzֽTs옩 v2g-;6K'AS W74)~ѽٻK$'&X#r df>*wʧ-b@"H<#.sv m =sfRCweZ/ siCQŴ2V*)@~1ӲxZ?-7*όCMpiɶhNcGMH=0:ແ40+e{uwCyۋ#kkhl`&,O}W'+'͇r$ pcۖIs1N-:MȈS0W, N| R",FrS]).XPV.S*1,L{bpCċZQ{S#azvaqesge.+*Po2hw< L6Hg` ٲ>ޛ%P n 6 ObnQ" h uVQh8i#j2otiRemG: 3nm:6WL!'4$4i,i;AuYK+: Q#|.ycᰶH KS0?%Ҁ7J0O {P .c <tAHngo$h40P`ay Q^ve+W`t~i8{@%VPQS'58.[sV1\zoEˆp TR * >2ilflϯR4sԟ<n,&d^{(n=#I׍ ,5 /*sD{9{y8Y5Y`Z|$P"1V= y#<f!}<ߝ9nX҈!j&B q&j9$d~߿GbfI}~Js7YG}] 8ՅyI?H1_D8kc1v9x 58߹xNa}~U~(Hh-#Y4=%u7MDn\J' A`D=fo̗xVdbk73\łd4k(">.e<ƅ,DtT10IKTOƽ `nбea-e|[X6N-Nv Ŵ]lWf "rTeH)I%1y &M*{Ef.Kcqi-wס(AJfyttrpmT1 B1oi#xr:=.`CGFM9C"t%O8*L#U᎑m0Y|#6bs/=6P[䗃ΌFl7 ÓRjR̭:NW vq?_r6$2D Ǻ^GYX<ӧw9ށ~r"g$tWUޘY ,6s^+ `wB 5Kw Q=*ɌUp簓JCVҧ ]EИagGi0g8$dt\J!e[~kzZ-g8QHa * 2 vO4VC|`,ۅ ]Z&{68&O 9]GJNZ_:zĢ#? F+ϓʔU2<:$<\p/ѤGǥCP0?6WNjUNb8piݞ9;GIR37x͖ 8#:g>=) qQ 4S0N!,ܙk}M37iVVG.+zX,x웏S!g*5p6 Ojc˓.pd7,߅>}q#,?y#wf*7)ܚZorbs_ ѩXio\eÏBY吺"D FQ<7 sc3TTUɹZ;'-y ;m=dL^Z1Q]5B?3N Ȭj*P/9 ̻jěxͧvzm.JBЌD#y=Jڶ^y+?10ghys[6 ~ē(}p~Y"XZLm~0+GZ;XPZRp j/tf_˦S=fEυl=N랉~! P5 39To\dE ՚ު0}Z6 .b袎S [JbK4a>:LUkul^+35Fmill멐*ޝx7'o,ri q\(ۘ^DJR"c=­_/!m@[Mu*g-,%K5+cpq~E(E/ÌED*̘Gѯ-(kbۢ^eu1dv̤"F?$:(J\3ٮĿ @įƽYxz Qڡ,gyiM 38 H&*K&5btV&k`bioVT ںƦ5onaIQ挦]' g㌳bjNdFQSנb4R5/jF6z )q YK#nd֛@NńԛnBt@*= D fU,۶;ruAJelNfגDZXt"L;O3j|Ut$#;1vR# 4zp4@YD(ӃH_T#<w;erlت+0? FK(3 +qM;gsgRnM=K͙^u-6l=zb*A[ȇB͂H<7]%aP<sulC0&-L:7(mP(? 8[]~RY@GvGZYoǗ4@ֻJla/1FEm6GV B ^ V@+ [i®E賁@ KP&o8cE?j.37~etuΤ$mWI0K]4[B{?jo;崡E[_Lz*ߍf AJ/znWj ݸ:Gr:SR5~)-\oD,NpX tsbko8(;^,/ D}v)I!dǍO|V ˨-.iyL5",ϯ՞i#$79fD_Vێ1ZQ#WU*[FQ$1I~OEu:43v49(6 8].9ZӑgĞkfWUyO>Jx|1<ѷ" v-Яf۾}zD@v~B{^WYiK w'Yԇ^$T.+d"]7 pA615+N Mt< ]]%a5Z;S{qmG D^8kO_ Xl2w `gzvi3PQUEndrQC7xDKt)KA2[ " S#Q7-a-n0!la:ܓ&n@1#azYh- @#ZQ]iDLDݟ_'i \-=u 'NEs!teӔ!.N%NX_-:0+3j]JRKnek_w8%Z,6,^WK%MD:}L(?');.TC~)AA4R(-?`V€9ÝQ ^P;fvG~ԩl~`{M$/2ZX\7?$9\̏ ț*@~wJ1byBԈ:z#NɈ"lqB}nmS5j_\Bpی =h/5Q[Q<D@.Zi6T(E#f@;eM>[C"9 `xKT%MB〙D;Kv/⅜2f6CYG⣣*`mrn.g9J5s|תh+wDA|a‡#BjcRBkz#M9?@)65cle9wkʑ5e,6cl^QuNkOl0,M)GOR#| Ҕic4iq|J(}:P˘[M<01oG^fXZU8S[өY˚VF8t sūb>]K4ӟt[YLzoM8ء\#&qDWDÎ Ms4L Q/GĔh($vi|/ykRurm4[$`}K_p/#?Fld-(мʛ eVyeH2 E;9#p#8n~F !UoVz@4Bn@"ev46yYMF<6MdHl4nׁsE3rZğ d|OY 3Ķsܜ=LܵQ6c/DZu+:xCzB wɿ|O{tic|önin|ӌS .?P63 cU3xPEJU"JtTq4B&&YZ+;j;9msA?s#A(.p#Pf' Mo542 PlInG?y90.y,7]{3S4Md^K؊~,DP.C}rQGUEfu5Ү\z6o+;PSQ?Ƅr>hSo4jXMlޮ9cvGtQ9/ =tDĜW9yNVmvG_<; IV=a;B݁nj"714U ~[@l6C0P<0bilW fLo^k;FVL3~h,VвTn{6ě`R]xyiFBbsy6v:ȏ-]к*DY yyPMo@kq #y:OT)v3L_ֿhd.=&KA،'$AŽ}Sj'i.$̩H9Ɯ( W"lCgYU>YPaTM"%h<⒴CULh lb{fI DWSؿlN(guH\^A_H } |5{'۳\14z֦Gk=D$!:_6f2birज#4w<*湯%y#]Z_7>6)WcTQZ=7 .9D6,< 1IB}kg#?WFs#]( Ƚ2c廳mji57P6:ߦi7ɹD_/$!ͦ*Zj}'IG]&6Q/s}S;i)>ٚA|# juM4 ![Wen?({ s )҂-ػ%`o9dxrMViҒJ6e5#74WeD+ZOo;bu/;b)w%$Q U71Sm_ueϺ7|k=Մy󁯻RkuK{sAEbʮaӏ{ moo .?_fhDh0MIX<ac Brz6>?e>U8zgau@sNJMS d dM Rx9` \xk-@H'~"Z9Ao$QT F>G)W#Xu"|*G@2xe8ˇtW j3/ F4`Sa_Gl97I^gZ'DR?5Q8Js8$ti;5S * GQ\fW7Ig޽#5`?ʻr ʠ 'm܅QA]p0R(Uz N4ʾ [IS l~ 0%]ʿT4/=km>ehue֚ϒ?M1ˮP@^@_#jM,#_7BDu A$/ʡu 2faH lb䭸?T5 SYS )V+G`DZ HI5{]uļDQؾ&H{'B7ހ'wӭ 6ReW;²e,ਚVAR5Ҭ|,hμaNQу.f>qn2x.Iby@!/"ȷ畿C'(E|mX'w8+)A0&׾vƊ<_ZEC3ME!*M|n!7xts'o~F7뱑ʒxQdx^KjWiZר4sn*i{B']XcTf* 7 u)X pt|U@=aah LSq]n{03B=伜E, e?o^֜U V4Rk: #!K;,RQE6iBU#ʢ-2oߕV*R5bTybO#!s(S1'Ʊc}Gia#YUPЏ6*$~#so|]`7n 0|;".dvOmvrVE)d1g¦x9{P\aPaqA+t*$&:8x$ +Y栓ofGvޣt^y%Evc NwsDMQcLF">pnt%`4[%P nDz;=k[l&}z p?Sƻ_npږj"cb&;q|5HK "~*خ~̳Q_z||2W|??\L比qa XUmCl E74ѹ}N0Z)!unAzi?*3(*kj &:}0%f ȸ*(ʝM=\Vy-D (Hèdɼh?PGA\`~Gapp  gzogǁY",G*tMѳ'PdM0UW<@:"}4s3/tdT1Սϔl"&eEL&s㒓e!᭢LAܚ{*+\Vώw1q\eheê ؒyeIxWhϤLWVڼ9 ~}* `^-Ǵ #@FA 4>%Vjs~s Y\ڑj$-V$y'DVþ??E*?ȉ qEꣻ{iנomeiй⇖¸e{&Ѻsm͑gdx wP昑&!*QZJL$ҧ6~3RX`*{i+r !i(HW6{Ma jo ouM\ }~ZE=Np닿arTsҲA?2#z"Pl,>$MNHj G{F'Ӝo\b{C/t  U\gq*$U)X5ԨKwJW7Xv,eNu03>X]ZCETrW~Ld3 oIG܁ JAʙE Es$G; ҙ*Ϥ8*V78g(7$ҞhybXkHiv'cht<_ņ:."#4rKJ#rSOƙY*iU;ş5ˊqiD/>.Ld, /up]ƀ&fJ߽e s{/L黸B]gNάmY`80 d4Mhjc Gd*Xή :NVE9V[lS{YY9d㱜5Xz<7b藁!W %~I')BxH7蒉Lr]I [Pw"Pw煯EʿŁ饎 5]M::ޛ=mi>Ϻ}i2reXYOn O%aۯMK3x>VoN녘 -H XPK_5ZM3cKYyp2G,dF.%ڎTסDu;}%F*fCI(x'?qYJ4V6l%y_gt ^!+.2g/)a"V蛭l.PoGԮ7W: Hz/G 8iX*ڕIM:"2u@Sb,~XW6)[xLAmbƣ\"TEUW?1_&(eU!@܊[5xöidW~$Oi{J&4rփ$Hm2oW+З`{OͿN}NmQ.(,<˗*ʼgp0m|2'oqi\/uZ:#D; ^k8(3^!;/JN꘨ Y6aF:Y;vQ}tQZ0:I+ZR4 V=X+|~P6V H^Z^c۴n~"$d=]Je.>_Iͥ)'K2B&VkԚ,vFeIeXW_M(>Fya %jx )Oq};ܶʽw4D#tS u O1`Η1c Qʊf>,6]r}#o𾛜/,<f^R K75Yo hпYsO]#}~1SCN@U1$%gє7ݐj h6o[ִT|d}4i̅\Re-cW=fuj`Nَ,\ީهJ0U"*z[_!uģدsh'd` >ןSmDY,r`b5m̠@y q7MӪԂ|=t@Q 9b>p[n*? ` NPLCLoǝҴC AߕJ矶;~d^{f !ЄUA ɢ[XL.h5{Ku J _nZ9 JC؊~eN~j&љ'cPM}SDv0Exe t_g=+z]ݨ-5*ѥ9e=sjO/wk62}[4yumQ sӳe].0$+:y/Z Ae fm; :'>?%p'[B"”[TzG`tO==_8T& .b qJFHh֗o?b'@~FT(Ep3ן$ee@,tY;-+^M⁢I\G5GHae`L|1ցɣYՕy$ x\2J`p Pv+6._>~J4=#H|hڶ8+fBLJܷ%%8(0tyc446_>x#\Vawyf½KS Џ ˌ#?Vai5. -?{,0h|(YЇpmr!AfA NOpgH`;=;2T>m@ >pOjd#*W.`"Z`w$I!+N=Ԩ4FL{ ζsx :`6ݑ!>Iav>A?TmWeY*z$o*6-ˮ<1-RtAP") ,rc-Lԃ$o|,#Hb=Tf*^c_@b#tGdZ/6GAcOA)B¸>y˧_JiQQ>8T1\v_БIF"C:OV9œTo>c\@'h帰FQM/krtD 8V8k?۰ r! 5\d NwLC8OXmt"Рy x.ncىj+P.p[_egX\νtچbr]X>|v1CA"Å瘇ot$?,ֲiYsk.`@R;)oQ.w4%'IޫOϒئ󥰣]<bL9F#3[tz-ZH,3璚!=m*[&̩?ĝgV=g"نufOY9K>:*ʚʋ.WW')0s.{}>`d a$5FkaIФ|0\A_TcI!Z?CL zݐ`1> Y&P]s?KOC.ٷb՚r#.M& aǏ3XÚCUzd Y8f1UH8Ķ'7"m" }g{+,Ż>-]95'䌾iDҵֽDr{JELݜC U0eJ*eʖbK(q W1k,u wU v [Kب?V7\B k(KTw>)k:ȳWL֬,wQ@XCnpP(]8Hlc l"…x,@dH M=\k+<mJ$ehw<6RPu¤L){ # @:$t8{v|#.P *(ހ49>Cb<ڨpHj.#r_ 2ʂ`:SGf6ZH1Ԋ[v0n1W,veR|Od*飫a5>`lB9H/en5 3c$PZvsҒ0f%`|L0b}S)]t+  M%ڴJ!\Y 9OUOl˽LUO*#ca?/ )Ck81۵9w>-zs SDS!3#u`^;'LB5fu8ߍ;]̤D[q]{k+UA=‰K`UKSM܊ QEsP AS q=nMhGp;B-4]W,;1x5yv0;8L42§;q&֎[[CXY c$Jҡ^NJ;wb B[wK|i_8 N;UU=*3?Q1&Hs>h]H@k = C| #|B\?!( yqWxe^%_ XhTX/p{֤P5jH&\\{&bҍ0ab>*]+sQ׍*@:Lzʲ %PHr3-m\/.CZZέox:I[E9+3%t #,SѭG| iS&VKLd{d(h慨T葜$W^j=&GpZ*S[_TŦi2<_ӧOAy:vvlnNk]u7L^p&D Ќ_ĹЖe.Umj.o &zc~|CpWDSٲ%}RGI_ؗڨTDčΪ}-D?]yRa7خ߱՛zOL>˂+M0L{EVM낝>Ō%9dNp&y1̮?C8c4A*cvg}ّ1l|Oct'.}KA v&ɸDB={9WTl@gz[> a_2^G60-0P@X¥/-a`Gjƽ(Yk]kLAVpY/73h˭:>\Ϝ1P ۧpȵs,?m*x[ (W+7!vfͻE:1;W0䅩w4VF%̆% u5ٓNT֝eb05.C>!T@~ã5}UFb*N/ x ߓ,2W=>AMڍ^d袤:mdPg#5yU&+$(@LCﳂ(Ď&==c~ңi0C${ Z*ՙ:KF*kSCU_S &+} mAe"RJ2d}y,cQA\/ ?-wX9v$R" .-oqc}GNbsu;ۢ?Ec3°!".%O=${XʲA%Jb gP}g/i[5`6?5G]^_t-iP2;r<DbOHڻaiB/u<6&sDsRzn\\M`')koLǀĜ5@϶ʓX\\GN_̷$o&CYҘ.^yob#W]H]R*4~Xl=Mv| S) ~fWѢDŎBNI ZNu1ust9aa.ll^x.,aPCŵ IԪP /N?$;7,sAo>)*ޞFS5 C byEO6vP DuY]-_ 7ƨS{[t/'j3ueȐ.I%u];xSw=ZqC;UWe-i0徼f;[&~<^eqZ ʻ˷u@'筰 JsT _Z2F.xnoվ`སPA辷`Lg^3?\vg: n"(lc<f}WAcɪȳuExpɘ[%bS`̈́C lʥDİ} )W?Sgt ?6/I]sWVp'L hP4c>&O]AU w;)rN2oØ9qlGk4|gFYP*fR etz5.ζ͐|}`J\V m㚿qzإHS6$$ QRpN=f&1JjjGT0y`6,|Q;3ggBm)2zs!~R{)~M"x%Q4e2sZ'oZp;9NȴtTu+5@;vx^AEщU\V 0[Ku\JGFغ./$v ݷ_DcmA.4gWi_C2@/X +d]Rz8SW^aIV= ,8m:-AO,{jX,K'io\;7$=0Jm~ Ym} ހ/o~&~uysHq'e& %]NO %x32f4BN<\ zxM[qamM'i/I[扻ۊ` L̲c;Y hmÅ߅%RUDx'?K>M5c0-) NF ؂1u+ؗ|baOP>˶N;,d.l/[] 7k{Sj#|ӟ3hWϝDf [B(\6̷USjZ%|&h+9Wd`, s"mA8(_yJuufI@P)g,UmfOzKt/n!pg&T!b1@FL(cB\ J<TE8 D)c`? t޵O؍#&o%ݧWufH3~ɟIݽ +j@/9#7 8R\>`+DMY3}e " uos*Ts!b-(r&D84ϲ*)Cpů|ZzƷASE3C網0Hq*2TB"k? 50O%<[a4r ]o0&_C:|NB˩rrh5Q>㤍Um{.؎SCh]=p?sDl\mi@&}:N+qwҚ*M]wD9hco3aqӛgbO\ d!e;~Qz6zV1nlzc}4\dS{p-%}ťr.ǣ;VDRb-3^x-Ɵ4t:GA( eQq%V1JVxXg {<נ:Kll] C-ONL&0TtE!)/<S@aJ#.0)u)T8'B"_D@N ҚLޓ`!ׯ9pv-qAZo€4en㝜N$ÎIyRS&ˠ~t[H KKjJ'/& 7x.]=niF/m۬g! 8 >0<YF2(]ՋMH)b? ^o?x^.n\7<]y\!sS!^?F ,̎l%qZ؇#:y_G\C$@ 2˦ .GE]a5{1\k;.jUb qu2׻N?T,.\s9DNbrZlIk;,'j~XP"ii _G[NWrÂ.Y=]{"7h_ISAWV]Kʂ>c ^5'~zvQ+R;Ӑ![;ӬPeBO~ @1QGy<1KWvnyc USѽQce4B,QFhoBz?+r`/tᩈAjx\+aZvCD)rϘ{^7t!(= {Nx1i jjm_U%v:=AO"5݇*wvVp}b+ޝm /%7QLrd9">i C}%S|>pE<Lz;sJT_i+#(a[^ |^ۺD)sG Lf~1؟-m"=Wx+Jp\LO(}NW.ɮ{bnO_p 7#7'mm)$"9G2FB5țcmN/>#~D*NKD,N]rH_3hrӗbU*}qe+AmDQlЁ9,fqՋȼHO514=ZÃ^?9=3hrU&o 4?ePu--ΝNQ#bO76 -WƑi,%vsC._8p؃[UNPRV C#]Wty].GS7?ZqT96DRސ)u.5~G*v}Io\yp(,S?;l)j gr%Iyٴ tR0SDF}k2zgwݥ]Zkv$j,i-}~K?F2&4p.y }H&.jzWGb,,jA܆3[aY0 6:3,u e` ZGŚT1򼐵ʁ̥Gnp!e^Y>nHH` D:CZZz>Φz w$igP g $c&;,RXy=['OCC"q ӡ$g} q;3Hd]pxfp`(޸gv)EjC:x|~@>k`=( 7FAdR(mqgDU9@z#ʌ0Wc7ZD"YRM)9JOC0j=G?ԟiފY'߿l_\JFy>RjyY@6HVԣo!HP9JP9msxc.ϡntzg}S\e=yQJKVĭz8 ?DSw]<+VD56nK`fd }O+p[癜Y11~1:yYM؃`` 5{lGѸH)5e_^#+H\tEC<=}I/ȗĖ(˩_!|h]^C]β|ŝ)qƣȜo֑h 633g ѐy$iL:P26WͮlJ{ xqwKSi]GH%xբϕ~ua!jлooUÉYNzIOWE1&.V, RL_MeFzOa֣(w54ITmXĽfZαB)6Dߐ}k$ z@_X6TWf0&բޣNi17+;ӧdli#F)D= v-_@k2#y{F-L( Ϫ5{mJ/5>7nIpϸdדo%xr{2lZRB5eUq(}}քEP!3%=De`D(&qZi-+iC!91ZC=b^Ir߿# צ6Z:̃>Pv0ぷÚSk ~)j by9r4渔՜}L3!ȵfqҙv>qdBrH>2q)q&wu}8o!sٍ̳ "Ȭ; N$aB"@T[Ԣ&~xac3< 6JU?EE5@) Rˎ%am_z0 [̼o+45Zړ2&3BnӊqqϰRdLdѡ"Hs)лVQ}6QsenVWF԰[KKC*J,Ď'4PvLV~ȷ /J&>E8.ml >h3h\aWAb{. 3]T_uP*;Ҝ#`;`8SHɶ|!ܚG pXHNh'kDL6jnt֬ E2ZCCӯ%h\ 6RAAG챶pPqAԆm[M=j*\GN3y]$tؿQIA iHsr+uKA%Ĺ pATP#AW7sI 5(u!QCtjsnhSm5X44~?O n4-ZLvW\`b@=ïG«ZVd үdѣ(x|Ad1=>r%OJu)ޓ؞F,ܟnW{Ku N0OGS,'<:;ܵFv3ҍ&bD(b从:Y{@ĺp>8]ԗ~\m6ƑӶ.#B,:k-Bi'Mu}cA;9>am8W||)cڴuᆈʚ?AVk1zbSUbD64~vN6HӧÇzcûUߧDG '4;kqn vÞ.gi~sUk5?cEƽRG`lHzH0xE/|uQsk[Յ 7ޟ1V 6B#_XP0pm$􅴳%>'ՠ>%z:'tXObUE`˪l/o}iKmoR#@өQ&E戱6rZ{%|)%GAWVF|#us<.LIldzҰ혮l=m(pSc;=+mw+%i}soKa "[(us,50'~6ˬd7^m_{ɦvvEtU߃VSR9Mq{5=ױHol+kӈ"0V%کǓ0&eծ K8+(#?׎yWIOWXL [&&\0K"ib0~Sq$5yY6)X-R!|ul7K#=YNu7O6%gRwRAtd%jV޲1> 5PIm㠊|'r8a; Qաy) mВ^ ['o/)qOqzjҡ^8~7ԧ" =*,yp D5336:N7"$8\֯ t;Cs]rj|Wm1" ¬A3D( 9|Д?†-"%1f@IS<Ǝ„H w1= ~9PnSzcxISjgK`$P'Qq(ÌOr#FMu/2$Aa'bLU7s9!)c%~mvN͕hNj~^%>IQLWZu7М c>%[TN OVtI3ɠP^ݍ=ji*JG^QtX.-0tT%eQɂ S<dBIe(|)[ "ۨA= 7&-|gӓOpPw%d4Boߢw0`S`k1tby~vIB425[M:DB3F'S딌.^"|zoroI)PvX0@Ri߶6+ ]/g[ VAN; B<,*1ƾrUd9S%" %78VVZ>$yȎwufIF)dh"LroLb9Ϣ|+M}~s}saņmqDuP+׃@Lk!JEI _W@JQٞO5/+YkfDy2Yٲܺa?-FZVV\p[ѽDUS.c VF >Ⳓ !j 1[O5NU[e8iԊ*yW' &LYۦ?" -!WWZ 浡1,ks̛8ӘR\ q۴l  |kQA{9[.{rLĤWx %45@4(`Җ"71;2jk=.2x4ĐM'LD`AF<0G!DP)!f&pעR >W,mY`:JS?i姟Sz%f4tG ꛹D[FC t8}ֳpnJd6xR>Oe, -#?>7\ O0C[b%dH,ǿq D^3Svjd] !G2`[R4jtAZ ׷-PFkwpp̙םf!%`#U3 ?TbJ=O@Y^”-S63M*6p JW& `WH!4ŏ٬DKUJc~܅*',=rڲ E}AI%]q4t C۰N&?y T~%w4EihԋmᏢ~NE}j.<FCNVdKje6̈R+XvH"FS য+egV #v$Ğ=>J1IYd =$L|!+OHPd?%riXh1u!͡O/ZvwުQEGޭ/N'[?1Vq<_ =e&OH5b#ɘZvf rщ a; >\Q lfH#e8={o6f *.ZdRFB#gK.uHLDMMP0b \v՜Ѫw:1S+<*[&z+7J׃ vW_-| Mky^֝D:Ǣ~K]û^tEちDW>P#pr|9Nc逸 PMUm |M>}-5Ix4EQ.hj-E_u=6Ɏ׻ĝ$AZX.zDgF ; ƆٳQĭRgZg۴_a"/";HI֬RnGXҹ\.̽WDZJ 8sTA7'[Yl}d}>8G2B,nf]ZH)㹥GD ;Hyeb`:SٽĵV xkt5ӰWf^x ڹit8hc| :]8)Kԛ%@nO rd>=e=xӷ5HFiO[\4hY)/O a;f$1aUɱlD5"rcD!uA*TܵI=7*% 1­MUG W!T4,Nqr =sl `x/|C}{$ocLWc1*%}ٜ/NG:OHثJýTJDBB !髏_e=^2_v5W ޤu7d7+,є_}NP˜USA$Hpdw817%% :/=-%ѼIm"jUѤ_W|xfpmQ+|A 5Bjy+~Oo^OD6lR zyzPos:L8 .+%"kv\"=zΆ 6)o[ߡq]\x⷇3bXmх>?~ɍ-yDY~@@2W|A…Æ)c= 4 Ǖ7kv+-'Fe5@pAA Gqyι&~8[uFAKZ}2 S#\?eEJ Z|h˫̫̊JQ5Ez@Q+l>A`-zM;5YTK$b.f5P:yI$dbl ^a4;82*9~Z .ȯ.#vOgCM a[gdmFQwN.F쇖SE7%SGa0Ytș7<'6{- tcry9! n+]Ze%E|ElX #GEkEVS"!#=bK9#=˓{ bO;FnY'-jO.WE&]N2N1s$9b.Hm^=+@TN al#%}?zxdH\-S OUՁ!2J8ZkXL.)0+6ݬ }GYn'{maTKg[-YVeŌNq|d{5H0Q6 #qm,E2m>ӕ{ =a1 FI$L )c!*5UoNτ"/Ne B**T_l_%rQL `AHe^q5@`1 "ߚ:>E4SM } suڃ`G^tDِR=.trF [#5~FRJh[tAħ&I$T7 A"7֘zbsDRzC- ڐ4Rfn[G_H?nr+c!VQAqUK:h, Fp[iG6/}+nёi+Nv5e]6#nYV51<$o%!S܊ׁx=hǘ:Vĭ.zWBҙKzr<x,.R\:SEF l8!`kIYJA;ןW*9y㲩눟=%Ƕ: qfseiҗjo21/eqgJ8.SL(2(Q;t]Q͕:v(&lrW}cj$ TXJF_gBPOZSb8Wܐ)ĻpgpCؒ(ϷnuP_⁝ X38 (SeP2nڞqQI P^ni>Gs9P$C~!_)mpGyñ6~&)m`EiDxd FW+1 tcG~@ٲBb0e2,/WݾVIX0˨;-歌>pC!3(sl \zieq,d}`҃>}4vo>dv4kcp%s>fEsdl*WOLtFbtOZGЋSD $lK!9AZ/ǫ&[ ZʀcEr[-ٜw9h?+A:N,e]IjuPh2%wj{OEg B'J: d -xR8/gb2EOgҝƥmE RFfzˠkc0};گNyjS>d**YԒl@0(7ǭl! 35 (po9jAjh{1J9z8@"bCx卵!XHAPSWXL,8V q AkiNc{)b} S 8f2eјr;G ZL1 ,RA’rK#} *HXq ,B1,ͳ;o1ƾ^c\ ]K+?d2<%6 jSUњy K}dN0Z-USsf {Gm! ɅC0TlbeУLPݗ#@'קRk^Y!733>OL(u?AK" :@}#U㹎~d\z5?Wf690w-P?ɴ9`RҒJB|s(SU7j-^V&=$N':^o\͕%Br Hv/" &ӜPEʞOS& 0!lܷHրzuܿ/R c9 w^43k:=}ФE 3*#ccQR N >@fs/ɓ[iv g{Rp)H __D*swP N]fWU`?7xK54x+LaE|}dY_1OZ!.aiQ3B:$^ SĸEt//_y$Oxi>7c8>_:f[.dc4a2T!.ײI9h>z/C@>w댳-Å۫39?0Z/ϒZг˚` Ҭ^蹑+LQ3U[F0 P݌>?դzDPoTـZ ҉P]S)ϧ <3 (R O?Rvm 5γx VNriEL`_|\[RU)>UXD~4 ' ?U#̖ )~%[a>^NsǺ"H}_#뱜hEKdEc {7TպㅐJb] ).Yg85Nx=[$@6EwK5",Y_oPi H )|1V`h}^)aPW YB+\KlWA"u(/FƓL:Hv+6>60^q)iy"|U8 Gc nM\iyZjA" WQ˧ܢ@m-kJz'%s%<͔(،YeCuќ|wZM<Zu=oocHeSLqr>UڇL־%Ӑ i3Ib/~GFBGV-[KR&a2݊ɡXdRJX[yU /Gߙ gT2s1N Ï}.cY͔hx$;aׂ]>Ŀ,=n/:~^('>Y-o6g7XvER-|,UhG?^oocˆp -s*uĦ@:cc,'#+XMHs&]dRewA-;s=ZB?Jɻ %=an wmض͝ 0QeiuC; 1TvfAx3ɰvbyKy&Y8tHo ɸ<׈*+B$U̦l||kaz @" ~7n@MV,D^5`\4q n P΂ekpn}R tV5$pKS;'MFFPZ,v 1|ݻûW a_g/;L蓌6=C>bc-eO(m_¤Ɯ!mN#4x7O n_v B94FkfɘlBU ·H *Qݕ[r5 J+ϏqLV } ;SXI$ [O j)J%{>>33}e&DL:hh?hyD7"Yc]aіaBk2f@&՝L"[RcO$Qқ $[!=@к}A"9:,i00"׌5V0!'F'\qͨӂ3{b3uoJrvi[򲿊 |i@ݨ6<=~s,&G9"DB:bڡlnU+80&õl=2'V6nH^^]%$%߮-c;AUN?xs,rYX] ㆖6r-g+"qB%JN\(`5il bTi2sD‘ G3Zտ\p6(:fμP/6Q )pd2X3OC!_߬':ir cx 5V V]rs#%hTzA |,-=ؚ+` V,6n IãaepnH 3Ѱ[6%= h~nl_0ZB}\Lc/A6*h%D󑘹C>>AOԀKuSjH9s"LF`қ^6$)w1z#i@%8c]1!u3U%Ѩ86)A!ᑎ~EHݢO {E$wcNr$`&T )y5WKwfwcG n/Ǵp3I`|::j_~L7;zi%Κ $ϐк*C3vNe'6u5[ω[DLm/_s;MMn~|W x` SSahE"B; HK\sD*ʵR.@%pq$yJ=9(d+7ɱ{?Oax5)!DW#HXhȾs>44.p@TM34(xd`WL.~h_syK#9s.9M+zwZ%bu˾%i!oCmM%e ))M\Leŧ-VA哜n=JscLtDGU\2sC7k\6dI>tT#֫n,r ;'#KBiNPTܝ5"gI2g`>tp,:9g6I40KLUS.DKիlL4Xe .#'VMq]ӱJwdƈP5o,[-_XRPcXXkpΔ~*<N'[r$cWqKPL X^πiE)ݐBpmĘLYobeR1 1G '&Q'hZ(}ܼ +#]zxHzգmF+eB1D(3\+UD#%za,{p.a7&/SX4EڈqF%?BaV܍r$A HFZG1U`=3[[<9I2eu @Gu &Z0bץbK\\Њb7Vc?ٲc<`?d>x}\ m}DS9-*E/VhpqpJu48+Y~;4~ksU}5ˇJXMs"SJjYHZE"cp\~zP9Y_yq@U^PޫK0u4Jh]xEv@S2bNԃ5kqinSx3= oÖ[4x$"Rn% ǫKW8FjoUuq|N+(|겠 ,'pxN<&w3fӪ;}޺N#odbƒӳMڅ/AY+\cJ8}cCb%zFg f(w ͼi >w v;[R?EsV7唳JP 絬6=h<[!p$4cVV|{y.X(_ȑ9#J|r# XJ* >Rˌd &5.Y'Cy65qaMa3SkWp?z?}ݒ_DT+df 㒕QN<{ ?addrVD`CNOM$*]Je}?깈h5Ruu x-e fO&&?;@Mk#zzc(\q֘9ム®6;|_Ym h-Jn#ʱ #7AܱygGgsKph!wxXuO6p-=/?S4Ae7r]F蓍Z0+AʺOy.Z›$A.Ec.[2w)xjE DTna*VҾx6yo5WVYuj0LR{ :u6bxnWڮW pݩS2CbNYGmۜϑ#{",_YV[Sq<'OdT=Uj kva 7p|3 ,*LIeS ą YKVI 苮ZnLGu"'{7XLWl)(٫<\ɩ[ƪm]. "ѳֹsˉZL!P`Cƪ w|k0sY-vuˁ j ɜ O7Uؐ`j/NbwpݽVM1ذ993:(mt3_j<2ee 1)NEإJC|j({2CSr.s8b<ZmVpu V lwdL)!Hݑ8_$$噖P2_U4%90sAJΕ6*`G?,2*cSiQ|/|}p:e1J/38 cqU] ^uMKA.H\ԍuŘLS ǻEł_T6]|%D$n=mhM(,DRXL|hZtݶTW,8VA&?1B&fhlS u"YUoѸ& znb5Xn52N<[#)sRbxR/(Sc9 W3̰- R {|AWt*HQOңM m' +1EOd۩?ң0S۞Uf[b}\.;,oUFc~2D1ycgnyf#DT]0 &Qo}Պ\mK~ܖ&}." ҆}KֻEν/Զ-Iˆ3AOs3A~>4D,|9, ˽q!ߖ N_DY)2S3nnc[8 ]݇z*58 ۗX&cuOm:OW =Tke5,s\Xh<,ܮfJhnU.oWU*h0['6'],Su3 XZDf 㽾}&V?bg5EbPIT-ܑP={H\B_݁ ?(OV9s.#zvgW8 9tuŴ9xo+u##e4dyXcE92_ M'3Q @kj7XQ (?qxи_U@{[1l)wa5uVq1OlU oMނhM8L1z_} {p<^$ 5tذ|X<_rn/玧pT҅GicVkaiBSN>n шl7%y ޅ}(iK*yqW<hZ84P)Eve) ^LJ^^ky`Fn ^;ЀU 2p8d_"r$ :G! l1)g ں*uvj yc)Uk$tB@kv_xDY +WD!Æ{uNMSR!%3CySloF?(I ר+,k\wߜɢ*uhKeBܱkl`d E)x":l$0<;F :"QZ)q85$9Wx\pg<2{3Ex]U:;tTx`%) ΂jПg !J 4MuMP-,tUP"#aju]؃iOs#2XaL֤$Lg'cm죸(@pm=!H~nep>cy3UA@wDDA+!Ay-;;%mĢ Zyk=WC.\5rњ0ml@w/ƪMh-SRv{*%8 )scv8sl.NxFl<;SWٙ]~" uQa֯5yvAIV-U XV+rIȇ>=H|q2b?^xHm4 {,?=i8ե΋z~Gr5a'h"._$dn$jezg4Sw1̥]B1ַ%bMĝ_DzfƲOfacRk7͐f>wȦTx'VkElљvS;qb˻eZXzzkʩ0NoOa=U]YVA)j=Fdc_{GN Ƭ0opK,ĻC6zCLY"Yhz=]7aS\,$Y:༖,J_LIPwLPA\PJX(̽)XR_;Jw*M͠3ij'ډܟ_īa3焫hVCS舶z mehcOmnw.|GRxԼ=ST Z⟕Xj$J nGnU 7p/{ð'pA8.OM-uHl%~Pa*p1aa Ѕ۹odo\!W1ROx)8E6<ӇX$p}VVV=OBC!ݘ؏@yKLO $HEUFJ)PE!Í|)=.ea0ɕ#zW1"a0Fכ X:u*v^dw Բd,+4Zk죐ݜ%HJfB`a*C;}%=* (W 1']ߴ5W= }`SM&kƩ}e<2?XIX/\D1:WkbD43ުHƷLN2@)y ~#| +)%¡ 9~dCoD$ SI]yWb{ >> .hF'~2SB-'?;,]&9hC bz ,;^Aeez"N| o6yw<U`V EA}kiSwS>Yan%QMA2qe פ&k-Ϲ"e{ޞ&|TȬ2*ZecP ]jOҙCG&u9_Nok4.R۔n3?9$B=W+8Ӎ2{2W.Cޚ@>vR lVmsUnU P?y)%(P{AJwad@v9Կa+LUjUJc.*jzWPX.SjItUVփ&'~oI{c~}Rlc5JMX$E[WUf(Bh0!BN-VdMpt\v2 0I =^ݭaFtQtk3ģMT|$Rvw׳-k)4]@ Yi&ؚ>Uښ:ѣ@>rԟžf>@yh$ԙl;JEBߞ=z] f(,P.&s:;jURi Ŝ ;?CH@Sk+XUE悸zs$Rya5uB7qp+'.'2,\z aP8FD\ |A 6M~QĎKI1uV&vd:"?& h|&cWZ, l2&i6I9:AYHl&|G\2W3ck*"= {#UPWAxn>Ati# 0G0 k'/[p"3|xmnfmQPCd{dϫ?TrNu%{$ ѩ=_Ҭ{F2R4<%aTI:fA}#Ku G[Nz$vqO^L t#qY1Mٟ*~J,6dStox08vj.BĴ;hŒocdA~^etU~h#K}_ a<A|U8ۓ;߻#~nFpsKou2zHĦGjuCPE^2Yumifd(Bsoт=GU8?<~i$̙6z0[O(jo97_8`aޘ.rx&n,Cbuت5ޭ+|҃Da;xZ99wnXOi J4 <3/8Bf$6RJ$/|v\4"CU˯^9~y- |JeڗrPuf?ğoBp|`ˆN'+}9:2lQB>|KYX4[W-Nt{~"vle.45q$DJbu̸Hf6W7?\JpCSTe 8\hl P>#i Qh"j}BqLs~_Z'y4)1AUJ^<˲m9'-7\)q6;*\EIR%1ze '#,HόT)PB BΦ~N!FƏD ùt$mhP= Zw_.@|  T%_Ѵv7-,`$4ik kN ,/g1"{td_pnCxb]QxWC:G/&&fk6Ա* dj#OF-(Kh"kQ///X%k4I>'NRV+]MǨ/Kq#ݐ ZЍ'qXPN `S(֙39i:D:h 1㺡E*%vrfx^=}"1-C#qͷzo4g+NrtnͨV<*"dt[_i'&͊st3G!eQm< j6&8ݞ:s5lxEgGbCWQT[\_X.ԻZLH)BprҐW}wV u.OD(ڿM /?c[IBdھ}O툦5 ct .+z1` > m 3qe}rTn ^.NTfE5 uNUCȤ'T[/[839'M{VoSFsYWA˵;Qk͆stX-Hb<Nyuw@gYs.+FЅL{;E=S'KzM܅~te.T+ %JmЛ}zjDAxta㓞^6$Έi!=,鞱g#Ӛ.wF@AAPVyE!7Csd@'@|4OS2*/zL:dZ:hŠ~ svqޖq ᫤QlQcպ2 "CDE'i5X:C5a~Aq ^.z_wy-j/5a]U6'Z"iPRuޙK7KzX:ɓ*᫼$f +iMjUK6ز2NU@6 sb XSdFxUD}5mbuc?(*B `b:j8?": "iy&2ә#y? *] m>Uo 4\#xc@CCV0m_U605F-Fw^%Zrzы'3uSY=mʡo+f>hGTp%(GVI 9vf3Wc;Tw, *wX,] A@(E}$7 kbG;TsꞤ#蘜=^IcC+2@%,CЃAa}&(M g-~鄛-pqW{~uWO" 'I,Lp'UCURYm iZ(B'T,g Ԯ _[8 AO:݂yVve  F7-2t}YTFO.ER, :^I|AG+t0ŵsʇjƘ9P+^Gx՞Dg.o ( )v-s?${Kbhs6cA=¦jێ!:rx::FfI#'1zyUzjɋY^2nie׶,C/ItGݞ@;Au_ƒ˸[gx[3Y++[FSiBJE|H+tsfje%YbT̵ly6*#JƋdz085.3rxGWv8I$+BT\$WDi|Xa¶MnrKNNJ{!ShH/ 9LÙi%/Q4ٔX3X\}9k4D-R[U ^#!49Fjpڶp߄QHx\RɯX_m`@2.P{hDLg뾌_7ʇP= WNe/ a5xN##@ n!"B\wuq8<+y3X $EvuF\-Ÿ N&`xTA R=̤Π @u=#VLT$pgp0Qk ·Z\Rtijiխ$-e2 ?4LP{Yz(;B"xԲK$n+Լ_GQ[lkjr28ԗH&: w縍<`E(BG^R=.W(("y =0 <Â'񔉫$n |Ơ&IM"g}U~gF#gʢ3\V5N=*qC'K &gSNo̜●Tyݑ§Wɒ!14x-Y{ ,N sBKpKB.9"VE8XhG|TǸP8h ȢzfAVئXvq iYF &މXcNn*.IZP*R.SHnu)<,{/ψUHN3FS>jDm! ҥ<4&7!bjܛ2dܧ#3Ɨn.ނVn>z&w9>hA}nݚfz@vvٔ|hD*+ԣYb?_ U tTƉwUҘC`i CBac|Bbz 5z=a;g|)@\gY%6G?<2"T;ϷӻPkC(HDoqhhQTCBԉ@}X(?epd `d.m@)L[!Ş$?=GYMIP} U?'x&²E+u/#IOF):gTe b'A9WŞg|FI Su2q.ȕ5s"̬C 1z C4tkOn Z2x~;`ML$˵Ymtz&:s5}yq\z"@o]G$Ц+GtcFJn{-΍S`֦Fn`B*-Zfyt /Z$njYCTk+4{ft(!M%44tv?DAzO[em-I#qmې:R*68E4crZiV6[XD"LZ/[yvfPxz8Rɮ \Nʬ&50MN'&&W+kz6{rRu+N>44nKɧ#L&at5P ;UqO8hz5 Aw'V[W3szZe·ټ"dG$}SqxhZfZSNSFM_otQQ/fV38* Q:į斔;N@u I%)d&!nawF\œ1HgyeִV5m9EmEz @h{Ht8r9dVnvvݩ _:@^ ϕ7`hIrC8'SK/dz)GXW' akӖʼnGk4Oϐ*_D蕮nbdaw|f4AfUڷ@݁Usat\Eĥ1Y&}__r|{eiaMl d7QNqsS?yC zBjaǧ1hK@ZXc(mӷbw֠Lm`U 8(2LaV!+_B~Bë"~T\px$l$ܞG>diQ@GPnD쌕8ۓyL`"9( N\`<~_mNv,1r$ԗv'%izԁ^CvQɎi V~AL(-tyq4V| 0H{q"ʖA(IL.Mh҄ S.Z!{)Z:ڣd hN ;O]sDBtTd@+]SYG}夢[Y4sK/>c0&\ nb<OAe4.y?JY-nYW^N֧ .7C$B,~6er^˘pE )iTAEJRA?#IKthCxd) ̱jz iyUOC%"1eweӰȔ :h kʬ ͽ;V܊Ȃ1x647\"54dDFpz,ݳ2Ip;vURapr6UU9Z.a76LU.ݛ@[>wbˬᥠ~Z$C;| Q"͸kXlfNUUld]OWj.W(qu{|qA4U;H\Q(InzGVIQ}D7UR!rB1GvAO] 놊8 u,yKyLVb,j6"⫊{1( ^]<oHs7r$$rJx-%{p>;pB46 >'7̆f)u8U]iÛX >5eqHuߴBt3<'u)-=`+GYO<ʜs>FX`J9[t;+yi;o/LCP ա?kְ  ǀi^+mOF97KB^>)Sm/V g%JQ4.+7eV`&ӎꐞ}xfN7N+ov&wyf qP Ro*ݑۅ )f)FjA@h 97 u GQ"!~ @ge` _w{gu*JfD=pw/pjwʫNvj0Z"W Bۻ ZF^& k->pr&FTZW KD$kN@)KH{gkV|K{+ߖ%m9LN9 aA9I.`Ի"|*.;Gzo*r:)_=MZVa;3^dK܌72YȵeGՍVK98OL! C1pW= 9G5#*2vqFZįLкڧ"Θo ÃbyʟpHsu Q&T R~7e8'*̑$Ck?UqeH)1T9 5y5VE=Vj^|PZRbs+mDK 􅃳Gk (՟8MD#`L0;ATrd~/J 3y5G|yaAb5tH{ +]J O GX`Cptͮ{M Ns !D/UQ7?q#BVa9->:}hXlJO] 9a#ʂ5=w Z3̮͆r׼$SI}ToV*"%0uZ2wH|G$ƿv睋Yi*VsIyAL4wPpY7_e-~'og{Up7M$`}3=;V"~M4_,kr rL>nq )]!?57׫dB;%P̄;Ə H!\ 1mhE`IӘgGspC$ij^dJږ5Cq׺ވ"-(cx6ʽmpf^.K Q>KB򙓈~hiBQd0E0mMok5JW'3>װFbƔ{>Œ{x6L>$S߄\cs)vg/%y^=XB;?Q 7/h&rOP%`T 2FJfk q;PBIƬx+*-\A+&;1%Eܢ𛯂gO늕/\ve7.dr)ݭv&aW;V/vm&Jh*|>(~nn.0_6ur:b{ :cAʭ[(VWwl 8G`tZ5j `y|/,(1n$JG ꢢ8x&UVoy $E֥޼hW*A4@%ջ!aN~L^9%5$􈯨l ;Xê.fZtl!J谷 j#] CˁFdʲ#o^0 ܜ~Cf&YHչ,`߳[}ݱ2e tJC}!mեu-.`KS,6G 2_U \P?SJ{lX焘Kf@0AA-׾$~6 f1W4 Ize\""go?л!79!6hQқ΁mH$hoF%W:C*5@.W܈[aS)+b2 L5X~Z].{ܯ,!+m'*C(kbT FQLt¬` Vw fubjÑW>7TitTcb+GcŰAQwN65x[W i)&p'^R XS|緦!@հ 6#M&/@XjV4R?lk ?ܗ㗈rmސ% N2d5mlX fnkHtIZ%َTxi' %7^Dk%B *KŤLQIbpw|PI_!h%/ڔ_Qt/XXrKg<Į̂Au9Zť1 dOƯ` kz5F?,Z?jJ(A5 U"Фa:#Sԛ8O؄)( cRaҳTyĥ(r(QUï֧ݭVzP۬jI[%`ҭ98$&|/[5a*zAPaOhyRE14ļ~[M\p~v+dg0xkӴi=(P>?*]C I8AB }?sco^֯FpUV~Bi~'{eMyv0U#54v{0pC5O8Zd', &xu/vkj1gL%φზz[reGTn;zy/ci1;h;t 2,办x}+>Wv`l@y`#6ck>n4 鞣wn䞃nkyaQ:9ҌJ; ?-߂Geo2|F#$ vv8g&cZ `d;dSs^STR1ո= : oԙ]+W1|-j` 2ŭPkk>꺡=Ч/+QXPSf60zt$=$ӻ6N>b2q)v xy<ܘy ׇOg)kS{|fuI6&폝-:D1v9=""7I[*3SU 'O-IݒТ\^d/$"'!zs\UeƸ^tfb:]¬皜U'隊[B6Ew&o3տE>f+7VBH/1G>5.tl5h`W t睼ȋCV&Wk`'a3Ƨ"§~.]v;JSq |ʀCŚ})oXw"6h|&ؠjTyhu[DifG%2k- eipI#ָjpitlemȍ)j{ufn. qCQ U w0MJ}wB/ҁ1Q #H麾WCcwOhhbD2'xfn$ KQ FY̡;vukըW_;WDP?"? #[tFHT ,є?{ШƀpU$#Z?SF!jʪ籬漖\gdYx͕JfMڵ眾4TZ1r%u<*}f < }ʧIе9):ٜ#o pxg5{ zKnCL^Ƽ XHtXUF1-vjs5`{bA_SS=r^H}ƊK:LS f>%J[V|<#~y?8!h1 WZ!/^l! qev]Y_CŁB0';&= Wz76C !]+g|#UǞLǕ n6"c =%L]Ҋ'H$Q ^(Qw Eke2iX!ޮݜ}r>S'#9?.7HET@f)H[e`'"k6&ܟ"jLWX2~}h*!AC_taiCC!˥tW[uQ?1E9Pl,n1x]@ҘEH= Nm9A;W!j?$:d=ߑH,E0Quab^Km2c&}׍opbBeZV=8xguy T4xt; dx\,FV:hW5u3󈞙l `P .LB҄Y0'>L`Pffg=sW6uf7e!]y&_{( f͂]` sCOVMr;愕9ԅv+K\5jAybm9\ٮiC6^P 2y}5<?R8*PG= A Ë`Z1Hl~15Es..>+G`GR<{j\JK7MjaO n&tVv<3ezHǖx=ZbduO2s!,re:Nes5~d>|7ƀzcZJD)ldrY ,Wi!FinvkS[93 c*Qk+Z2LCښ V؞_ 4_1K5h|IyNnx֢P)򉔋@%%#V+^řx$ , TI h d쟍NtJG>n]=h/؁'*SS+C3*l(%~9=n"b)hFztréAaoV|r)xGO*UY uͨ-X*$Nz>u6-nHx{\E)a?hZYPPU3E\eߠnR4]T{DrU($ d3JH Yd\S3jm:h4ZEg񨱪<2cв?_؝2ءCiBnf=4ӥee@Xz=˹7e;I^Mm RC[[,kA8i'پ+3<(vȒ F!B+XcU˶?/zglKR$05fQX> l.k&"HFQ_LY4eۏt$vGzwt]+$jr~ޞ:&_ i!c9ю^z8,t90ƕ 6΀6J۳^,[V~%*TB8ͯ}'T>AOt;>G896_2N#VyYm N_Rlf|236!3Y;:#Q,?c=lWd-a܏ ۖ.O@~ z*YJNԚOͷ_¬$_x}jXצj۰zKhOD3,JY5s<}^ "k;r/D'k+ \m6L>0h׉+CpC?(?0YWޣ`Bn.Ť~d8P,dC$y9XnIwA̎ɼ]2`): 92}DGb ;Iaddg :"TF,g٦<^Hw5J!I_N_;0UI+='*BͱuL*Mkq#QRaKAmhqvm/k 08?GEZK pf9+/zP_1u1ӟsALV2zg5ccx-:z ^nT20Mx¼/jwB+04"L>)Y$XgpaٍLE{8 ׸Xԑ\(Bq`}`+((J?Aۢ>A|DVw(ågLOeӋmqKA =5Nq?qxL ukvLJr`LE.kFTe T)+t-At-3TDk]m<'pmG3 !Xf@:]lB_aFDTZ??<џyVAbzV%YF +KQvMoDv[}?(t/[ > Pgu fڰ,>:eyܝW:7V[AK"9 ύ&WZfM^, gkbxp S.>0\;%ZT#:9]8(E]diҾzl-gqsei4<* 4LL~i*-\Ǒ vvMdu:gĖSl\tLpf  o;DTB*h f^zMOWK8Q[`GȀxr>{ 5y#dڒ, C81(b.lQ:'Br;=@zy/ҭ `ܙ_Q_!|[3X؜7qB/ZJV9Jͫfſ|s_"?Ҕ5s{:$%697'HOy^?\dʙ]+07@"KS Hil-6%;g%ȇȶL6T֡qᾸ{BG)>j5 "u&a=6,lbT84CDRk +~$($}%~4 \_"LIFMMȼHΨEuհ:䎞?*˄rq w'W۴aJ{p(ohCtY44.ZNG|'fHY#h&H@˹$ ""( nxeȆE^ĭ\[$57"O䝭h6_}8ײz:>8o4_pL" 4KfoX~4GF[^+=ﰾ_&쎑ȗc5EFt5Mc%N@!"chMI6@X$ӗ T̏ %W~D-,Z$P*qZv4bts9v9k?گvbIg:Ѡ#]1ӥ$f8.jhkcbV{ZcB_ VFB1/S43Hd ۼF0!84`<+m8WGYr\¬O&1`7n,85;)׫g5*DN+ /zhd-TaԾm_CppP޺|khJqFCfnlV0lMJ(˃bk/%j>Q5Cldit%]"ȟď6"i&\* m@Ŭ S`QX6{?`X VI8]Nw[b`%P%%fTa~a ~%\:TMg.0>}O'cno;? usӍB]66tnXdx˲W9I\VϟRn;pQ]!ӿ ceBoSK^5} %tрSG}0ȑĿP܅so #<,,>mhg sakPXys RCt3pKgG]+Nx'JahqMx|eDiO(co_.Mׂ-~&b̰0(C+[m#L+~Ho}%Wcn,^j%i`ld(}jx+M^4[<[gD# vE]7IP -]S?QN~6n$>SDn!36 6Dky`G{<Öz5cXw.ٹ?huIsN:Ha'.2RF6=xciI`,F+SuN_{tSJi˜O`6ב4 =fl,iW𰵂YK+Re* QH8WZCwxLz_i#2uymeICHR'5_(Y* T'l|ډS=RM'BzKBKSuԲwT:uJ)tSA^8 pUP%% x?9ztp,_FجahE !!ZJF1\{A^j@+LLQ/u.oj;MwAjFxi)[vYE>UIl0& bWGm/4[~Ȝ ! h J߅2r=y!?ݞzy p? qEy%cd{I+8ֈHR2*GMLB <]#e%}g˵[:ΜQI<$JNvT2nCv;RMEb]azWM1'&6h < LYcG~^ hQ$>|>BВD4X{uNg>x\AmڑeHlSxh,Qyeƶ_eU},87EPwj<39x`71sAǫәCF*Z3yJKI}@S`U^9[BU{\&aЊZz'N` Y/j |35ڱr.o oEa}M*mٞ#WRfp^rr{lkbmj&^ c\t~szve|p>˳iK!IkP@ܤ`fYYMӾ>wsmS$+="\2ST1qcMe7-.I²[Up+msr!_ʮ"ҝbӕf+S''@4!MK0TqrFϼjLs *{4Z9X&I1*n_JuN@F+w[TFz_Y~Maك43e  ̅Tc~t.ͩNS +p7R)_k|Dw˟VJ4w`Yֻ ~!W{H}i:Y!TTꌿ58F9KqO$v0c'=}h&-tt4x7Z%8C6"=21u۰FzR#PJܤ><&=a>Kkξbx2:/7PM;Gܥiryidro}utE,J}˚( d_iJ'Lqĕj=,`Lwy íGrZ)IG>c -h>BC:e鲊y a16@Ż\S>=sP&ؚ%CC \sǻ_?47ϫgy;3|9NkLq};9ԯDEF'(46 o.lN,+ɯMYUKYC_6y:p# oscovwaW# X]TXAr:E咫p\+xKoWO? )=UIJ{zSpssXXeNy Ai$ÅE{UjC14 $~'KYr\I OmDUgOSЅͨKE=~t6ct1R>uئ4O )*eke!K&h.y8Q=Y6\כ2V WN'wDx[4'29([go,hBMFTtOݹzيZ/ cIdaN? |Wݩ^EJML<6"9`GR.r1zG͡X!H:Pela)(N'E*\_P+ QގrTX >~h(pp+C:.9%ʏC]]A]}8$RK ȋ|wvkki sz,>eV_mm Ac; ,p-UOrp*^}{`aV9 gJI@/;m  %N8iӟ6Q)h(3L\wwct@$/[A4gY| x'A,Z 9N UYg^}eI:,д=-OeC̺iNv~6r2:ӦsAxp=n ]y",߄H1O|Zy FEtngm]Ie&J66w`3 6recEosاMecoÖE$f!Wa\[mǺ拮$5MUPu l|+T9(n120Lޝދ%0  p8PHD[뭦ԑaR"{hGךɱ3.o;/bf[3QvI4h8yrZs*?E17Y`5ʷqNGe\%T(y/͂DK~CJaU&[Od FV<<fѷpP\2ӦpX!S'6[T#\d屐Sr!8-(ƫUű_12vtW Paj_A{pv>ϡ5 ƨ8FLt@_կP;oѹĜϞDYY:^ iM(mrj۶)\Sف]etm ɥg3:w|ByNRWrt![wZS6/"Ћa x2my 4lZ?g&p=v(yɷP7M+sqpq3z؇t3*q72 cr>ȏNXEXG+?f "JZ>)bih`Ti6Ty ۿN5(ޟ_aŜmoLjmqp\ΆK|e9p8+nM[(__É56F8Vy@A]d,qo thz8­jYV!pW4BA"ܲ7;` ң;0DӸxR 6Ra$/_sIYjv1>B+9Yf VxӆcB-f)Oa7h 8w5]:v3{S/=.ѯv@Ilϙ3ʡBZ.WT)D0FbJ]+&Y{@In(ic瞐Hj9,8"ls < ];5vB\`uMnF&]}`~e3(E/u;62 pJN(0u%x ͅTߴ 5DF .ھTQ]?W;>a4ȷx3P9*cxWcz:Bb?ǼKʿ$đ/8h4Z#oxB |ߧ|g.RnV@ GHz`k, @ܝNaW 4כܒ+7mdX( z3̤K kTqDA 0Ԫ-4j뾊mKtQvQ*rb/zWM k;վX,=A\TO<>ۼFa=wdSD"Qqنw $Hh3:L<[vtR۾tDQ}ዓYXiGw9r5xPG^Uݻ]37}c 0mVqIݗnY3o*rT v!8ORad AcUeJTvE7$]*{w"`FFhJz wU#iBI&o|l 0xeSpeLri,^̖>eNWmD2 +PDz8Q)W!k@*Aw]g5jX{~n׹e8??aul]# Y=AmmIhXal 0HGž01h[DKkr /PU1[jvC]E<- W9Ymd!]66J!Y ZALaT/"U q*H6 R2u#lAx>Gdc6UǛDEnaƤ7@6|B|pXx(of=Z;8PRJϬje^P^>5w'~Z@FՒT+k}+"S[)"׽柖xGh~.I4`OT\"Zpe^T`Ay:0RO",P7{\R%H7S47c&QR4[M!BҞ'@\g{0SsfpkW NezN82wx0@R'< Ȯ`:DYX;0%zLt3VG%HBw [>S tfE3.h{b @-}]=4v*97 10@O[ ZsS ;<@RzȌǧm1VV,["=;e#Vj8.Yb`ok5S<3繟67|e2 X@зlVuxi=@7?ԫcﰔ^,p34 ީd+c.~,;F|#}^~b Y* ANbXTkޝ,Hw`KH(ϯՇOm=A~I"_0`*C}9hߒ'{u L{\C6wO$`kmAw m뿩Ndz!W@wJ/D(_cbծ渟.4)WѪXaJ] 亅 GPvz{4مs@cVV.w/$GҔ=奷/Ap){7koOjޱ})a䳧n8PN:@C~tN d ϻ㘋#n8ϒT3~k*[sqkpMd)@USU ;Q~4)6ȅȗw= 1J/l<WF=x !Trtҝ/UCX%^;6'Ay/GҗiN9j$k0VyLsęqPDV_ﵗ݀UR G#:<\񺓌'il'tw\ՠ2D8v[˹dJϫ=yiFf|OU!pHǛ>%7T D08&ļa<ut86ZW5PϤr)hb V^`vSP&r#zh$IZ9mgcG) C,( 3rA)4>sYX. 1.q<<01"&aB:X||#,c,zDԋ.pk Au\7ϓH0tjfw348s9g99wbXMx`\!Gs]q&TrNf]tG>;n|kHw*,fm7wl~Z4& z$yzӞ9 @HC~H'pҰ7,E<"{nBW P|T(r^p7,a.iËcόkjK7E^W2F"TeWucgi5+PiExWI:X,FEٖг#oj >=/o5lHagbp'h˪sazP/:|!BJc82;['a8g=@]*gVM:)8­;tk`}qι[x [(VN6 _7ʊFm'{P> mVH4ٗ{(9 di#T%#Fm5JF+>>j579qlDfF*Wصۤ}њDžf`=΅}䐭M_ڕb\) $w9 s|hkG Z ʡ (R|Mr R|kq{q;2[`_*25fjOؒ^o-h@+ϐ^4NT@$k6o}b*CnU-LϠ m+3u#-<BnVtj4][mkHLR$NL2\Ak kN5,qh48M߁`ulUsL׾aձ#\D+2qk^bb/pc^y1|Sð{=[s т]3t=}an J%"ӇsAyz d R[-֨CWHojry] Ybq,]\BFaq9|T F1IpЧyoMmiT;VEn=Ǎ"rQ'p10Y2G[¦DRt$YpsTA5ByQZd(^Z[CF%ּ](SvH]022WS8:V¸ufj]iňQB|d>Ŷ]Q4}4W&$`#]e|L}x )ITa5ҚFRac`IvFk3f޴1q@Uy5y 1#kpqRٺfCI,bqth/! Z_l<o{JzMoS6Gpv!oXOD)mt+*U,+J.J{{AܥT4@, ĘH0{f=3~ޱUiLŐocv*I~ Xdà-hWgBcHဈI=jlE!}j,%ZO9sLɷ;6jES10nnEWÃvy"~_uFƣ:* o or0g=|ERF^;iӔ5cox>Ω5\? w"Lxhig^E9-9L1>9fuё ab1Ybv6*O京P4 ͤ.1g)gLilJs>6\Q^:YE ^d{kDA$eUF}pjWmdK<*ǾZD=l!i OX)~ 刳"xgmƔQh61RXk!S7, "w$ηLXoA9%q ӟ8YN?Nn:U. h%:L7)Kg5 cẢbm\Zpshi<}>zaֺzR?\{72'cbʴN{k[Ae#=7KlX$,%h$:vOK"W-ܖ:5K5}pKqŞrsLJ8# .~RpwWad Tt^G$y7; Rµ0$f a5A~s7;`i2r^\o=?:6򅦮.6P5.">滣l ֹI)uZ_V!?9;*aL PEIϐirS]e#@R\ue'FנSb?AƯĊ+"vAa 1kZQ5DYy_/0.rZ|Nr { 7Pu>]\ W%>@( W 9x"9}LHS TD'v?KK*Z+=юixvVmQZ1p$ܽN&_BFZ[$"߰.x"UF z;7Tdě( ܩkmf"_Ad9~X'^yakA|25`I`1~TcfL74)U~b .bZTj8wܺ6E$##hߑ+T|j%""Ơ dΙKkorU1h51xtjfm٭sPFٮ @"g[5+$ZJ0aQ _b;LۓJ4*’cKY3P,KNugS`ъjAƤ{9 #`/zZ EEۻM`qOį:eoH 7Ӫ"A rŠΗ! (%XFEEK.@:cӧ?_{Ԑ W!@iNo+9)/ +vT}Qn1 y6x(x)?J.M>¥QhmNܞ*<^~hRr9lO0M<5T0an|o _Jj tDCs >w?Ǟ+jdsN7-Bw=/p5 <bQ]P8'; fggtO7_jH6?:azpEta_~zcKab1*4^ߚD4/f7=x;I'nt`NlffU>$ƨzMW!$_icd cqs/; hd`N(<9Y9Wgts)(RhwY74$!BUMFM' 9R KA&IgY:x|2Ò(S<@E=9,Өȶ'W9i<ޏ[vy˕SO% ѭܩDd&:ݮƭm m󐷬號6{Xu#a'e0}׬p 0J2򧶓K:2N2>iPg$xb B㹟/(q \KzB| \lӽN4ߴE6ϑ (eCDOvXGe^aT<.ߙ0EJٜ?T!K avɦD+?d)K\_˪.-[c(+%wvz8dJ r$\ſ:L AsL=Jn>թwNVrUV/`#IA:j{)w.0d?AFʟ{<%D79g{EV@iO*#3QD!.X/nC5:wQU>gJ\8J _uߪ 뭽@[O0+p)c"yBˆoǺy}"y}@gݎTλߘ@~wm akps22~RbvBİs75(_MLd+TE_>W ȋLo7eMSw3Yo_vl_@dŝ%';anvkdBv8 ۖhalkxr]JiN,XnUx&G('N==[d  * е8_ppu*ǀ#Vq' \V+D:I!ȏ ड़mhKH(uS8[EEg]k|5c[_"ʉ/}; Ԉy8%a|DՅ_]'q4yyv%G۳y#ɀ*RHrӋը&fM mc^6~j )㙽}):b&f+ip\ZކCө쀌_S̐K^h/ m8TyS&Y_pWMnL8~J% `R~h b/ه֝}O <ȨeM%#bW)G1jO &V9azal4I,k-8{axt/+He-ΒԋURbͷL9q G*C$]&+v' hn@%8x4P7H>ya~Aj}.Uf#C]0`&%nM}%`t?Φz]=颹.qxZ?EVF G.⵺=oCP I.eڧ) Eg#սB923"c~9L=jZPUիsgjm >*];Ykr1cmψ O 0RוR2LUypgNzsXͮ+zY}UaJ٣D[FL>뚰G.2hǪX^^V ݋kJ[2<DEwS{پS'$by%JE΃*NYa>2USS²U0S~'&% iBmGiPQljHh&YE+ݚhiF-Gt{~ of'N|q&>w}/2rou";k@@ 덦 /!lJ֥=tMV{+sy:18˄RgLμD>!!">^L&Dޤ ؒS2,S|J=OjhptP .ݱdS~1RQ5:܃"t6}%7F ?9\omTf[?3oP?8 cgUר]Q›RuC'[^Ev1dx|8U;F64XAWi%BpvTb[S]%ԑc}I2G u(`;e?Y%>)d%?>0A)"E]HvZWژ*qbۮX^WA'y\J(EV%Q@Q ! xR71~f#B~%fQެ *pbdna4Uhm Q2GL|+Na)n/}^WC% UDœm(7Q_ߟ(sWI (xׇjVą*ﰩPmH];`vI z|顊jۛ _sؽ?*w 9ؗ2+4<] yc 橺#W S9QbސnFSw0jRF9};;XBAd#Su.wɪ}xF@.ڂF ed k|G ek gyJaF%V[ fŔ ꉝyi2ʜ2NfRNϞp-pkly<鍸hHнT ۚ@"C4k<{ :Lor>&Q@k6Vy؂֥_'8ѝs Gz -l}[tpDH‡?ڭEb0,K8 Zr=S14-o'gjE d #Ptl1ZpLI-U\J?fS*p; S+JUmuՈ |)_+d&ؒΨJݵm5w{IYlc)|~ǻZ "-̈́ǒ9kaiB¹2'(]E*L%2.< !#^mt͒ڈ-I/:FV Uw |$p*fꪪU<ړ&_Fy O @W3twPu$ޕ/f B&Uv1| .[W,@qWr~rR ^K0UT-Y.H]8P/XxCu_yyVgw3yO Нdx!UݪBc3卲RO͙ܼM(~l'ڭu*s! 3Ő+>yh>&&v`&Df l.7 (GRL{993hH֞\>"JkRr>C?Fm,\ozWa !S}3 I6ȟ q)>Ӳ G;>6̇$Iu4h\, 炓<"$)CW=OnMaU`Tc+'52!?b]]~CEYpmTnl8g* Y߃Z'#^ 2a6:@O$3}#wsE2Awc)!bGv=*9H snoV=w\JJq8Q꟟% ErhbQ\nۙm?[jO(f8 ;ec_M.>Ek#G'+M)Mj^[7xgƱ=)4đ  Hd$o+M-k[j$JpR(r-_-]~ǵs`/ӻD?{EK,`]}Yv #Uk̶u5 !Y>E]> gOY/k /otF 1 >Zs`r7@I[:ȝڧRR8;W辽 c]^#g> KAʾfe5p|\ Z1B ѬJvDhs[=FT4%! vxy.i;WȨ?@KhL^\r쀎e۵͝(#V1D ٗW@&m,9/ elí/o-ID(-w70КU>\DjB惨la,߈ppNx6֮4j/2-|k :QJy8.ݛhOFzE\Q9T : `,IŻ+zv#.[.jh]TކqNhL[ڃ^f ASgքYVKJ+B㝭"ORk?>X`,w-~!bS̡6r9wNCf%D<;`}Us!ۚ O˹SF}^zBt ܇O$XED YrĪH>Ű1\l"&bk ?!2_,g-g̃Ǡ&?a:G[{5-Up_s{x">'5;ɥ!L'N-ę"i!F@}Ε",4Xo<QiP8X+I6f!ol.bϦt-F\hT1oH(-)w'lw_O8V52rE9`6΄DT㮧P&' !~m\c'3~j+4}x~1?9PTm c&pA]r5wDN=#QnXa*RIx[S Ju߽{@:="yd[(SI'<=F3d gcǘS!2Mf,ײp;bi?=27\c O9GDݴ~Wcnۊ~gjg4X3fmǕsaJXxHC=Zl>O-~VBN)~OZau##U5|\y=Ɖj[= MsBZ5RN?q{%rZvMe/!gMxSֶ]N\Ït;+b +U%=sp D3`cg:#N!DǨ|hF[,!Y9 5/Gcxod'Ao O0 !+pcKhx˅X9S75X)p4x x.l2 =H:К*Y")gp(WboXX?G/|K*, BY{AOq`M5{ḍ`#^B1ew-/.|ȲF0)\qf38)53fqn?X'knF0#Q6l~1relҋ\اØnVG|J^? 5fP?g%e) $wigX{J M3c| ,J RځV_t`6v]~N0>S5*P¯IfZnd~9 S`EUi V5nU:q6 Fc'd5-19s[1mA89^KAC/γq7Z4ͨC_6#h2LV9W, H|V7Z6(t}0=_A]z ydhDKpCXka2C@fa73)wc ?~Y["%2t9-DJ4!=9h^8Db[;AH>"(%HM ]'ER"n[;At}R:1Rc&0A4cМ;,gE 2H-6rü|ᐩяp]kVGcgin `6s+m916fKݞT)pj-Oy^ 9lkdk.M8[^R>7\1od{2th(92ȱn e|Łwtvea+%?(vXa*?zg@҄Kd 7q. :|Z-,#Y,]%' ~>*Sb~ UεKX9 1(LaS:MKy={p!t-qC<< /Gv!WD '΂( 7c n&:{P9l3On'9ߐ+$l$YAq;QmHTNz""u; KX5WP%TB|3 HHd={ gtq1'nHM3ӖY:- Tk{,s6~#hEc ٓwoC{(t$+VK4˧3sjo#+4>[X{J3JAj=%P,$tT!H]L8Pet+w%E}W%Fpvltɴ~(9*}R) OLuU\jmL'ؿ5? icŊ.3I'5-N7sDKtI//4xj"9Vh{Ԇ?%"1. wt._DM}7{6+;Wm[cBZnn w]͝I~#1t\ПI9\0l#'&x 1>{SЙYNYo~W,=ۖZ'ߞ]躷B+^wmq."U ϸDQEW㍝*y&rߔQGŏ*+-q62]r|u 1/Ý\(q(AVkU7G[^gW_s.M=qܳDpYbJbmFugnA8Ӌ&\]W`;n=g!5#^*U%g[ڰi ~7Zl.*羽LWJHԊeWm7byfl>A@)Ow0Tj2nv WD{Bsi/6(c"K Ff\&BY'Xy+6yʮnՓف;[nmŀ׷flV"9p!tC6LM0y3"&̓Z~{ɯfҏQC7EQh<$M{EjNv]}y'y&=(ʒ]!O=P&jaſ7]Oٕ;ijf_h G޴prT8SzO,*@zm^?4zj_dY0 % ۹\dA&<^LT*`y?5!Dy\>0PƎw=V exC R8ՠ\Ž{oI7=Ú4>rF pvp"xV>~0V> i҇9a|6C\0Zj ue Xj&Br %C#!J$)zI&h#z%ƍ8m`aJ!Ϧla{(vR1bLa_ӎ1{xYե|(>i8 0Rx 2B^SaivjZJcFxL<-ۗAl˳W(IY:]`\ԕFYol(L8l0cSJ#PMQY#^*AfuS0-WlϬ@V`+ =?ު}3[ğFLu;=svtHdÉ9P`}7&A(qQ#K\{=⤾LzDlAW ڪ|ĦSrTL!R]pOp&o#Qʗs<:FTq߳˦2+~o_e)>Gr0W ;O%Ov (,Mַd!qNŀӛLxTaWXfcɎdP^.6Tl3>[drRPS<$fE9 4pR>|37SzQ\X6(JPe^CBW'h)bbNC)C/``NjMX5ySCyXB^h@ 6.H,j*Z 9>bS2ރnXyX BC{Pjֹ~ t'|ajR7ī? ԆY,.(MR )>ŏc6 uVFS wA"*{A6cQဣZ@LxN¸V<]U#ޡո# 3i-ptp[rT~ږL>&WDRnro*BY͏ }EY 9z.{|?TQ1\HtePtGQ#_X72%_Xaklzh ñȶ&%;% X 'w0BФ>-CRg/Bk\( $}fX0ݒ6(uaA'v&DrE7r?|#n.R"7zǏzDFwvb slP(6o)jj'_:p5Hmr=QiBem mٗZZgJ{4yptEb.^p,a$.)bUs)Pvg.Ɨ;! ;=yS8^-}<X-AF YiD{`|y 7E0.(r ǰRbEK팞 cTqk#rsuaVχP#_]E4%rXWUqyM?:ףIx =ĥ ɫknx#Oo{nyb(W<\X 4 ee*F8{JS"3qj$e^^JQ1Ir Fɇ $J`<5Lh&2i_)JH^ b1pEs Y*:Gy1ˌyX3-pVR=H~M$F_C5&.m'#E _Bv  ?;>k▦ K’V_fӃxtRmd& GYFX"K<v W$n]Hvf~"TSzJ-Pnte2FHɛ 5=HM'i{zB "ڗ4e._['Ȋ.BO/EvBOtcᅙ UF{H3]d "\t1gOFgj&kP$!n ÕE#撤iiW"sz'ײI|Tj7a(mzp<'^N$т MU4@JYa$ p10MKeRO*ey3u8>J))+ { +ޭ,?H+૦xwo/ =J7}w7-P4O+ JӥGQi' Moӟ㕚ٻ(?ߤ!ho+FKcB);<4@>=ʬC)apG%3_sivKhŒb8y0?9)AuLڌ g(=ӎOsϸor=h;w a09in n'.jC5oJPPA{N sUߔ(+|ݡ}y\ 1Ҽo2w'l>U]f^إ@ϯ;dͿrmq5h(h, Hѳ$MtQuKnz0U-ehwGR}*O5|x>xW0 8/K%%QL;a;z 7INd\ WaXL WԂ'#fIo%3/-V龸Q,xPQXuJ1nz~oCUNC؏O]sD?^*& P l_e1חOŌCfx?ư!PbPMq) 2O99@u6}%+P;`KfNwhĭ.wP[ aaU:CBKmݗޢqVHD0h{k܇ǧ## _%%[^аVD9p{oK)8/4^@Es{FJ\]a%"cCb|ƙUPRntsߎMURKRbߣ ^, L8@L’M+-W3>9:Ӟ/ugZuڽL"]dnvss=$YHAKbo?erw׶*jsTJ( l!RpSTնFnK+団Ȭq0.,to%K{dys@8=uPqMeerLtO.ZgRQf#I]!NOC㩩rL,lѥs2NaIf8ށ$Y`LŃW4QD9'k@x1O] DK\оHhP#cR(+dAu{Z) & 9+y' Ǥe쿉FXwjij=/~&gA uJ*FM$ s< "a g +F=b_XصUBfמ9lT =s3RSFŠ_x(Jh+Kf.q{'He`aB[d!۩0;e/pDjc>GPrsS)`<[KVu GGE5tiAf3҆.9 pa<Ց!T]b $ߓ[ r6j A1yB6қ a(];Ct:Q%C:4\wK aO}?+Hunri!Qz!RV:@>r͹8}]Q6w9 8ամ \..3"1Ͽk@KBR+ { 8"u'~@ )6'LV&8Nǝ.#RAm8lfY`Rかȥ~Lb/2ц6jv,3HSE3m q#Ybۮ|=h)5.0/u>ti6}vy |m ㋱O兣i hO`跹<Ѱ3-Q0* 6j)t˥3t 1NDmj{VN;ĺ}&>L. 00KrSam%[ ud//5[m_^XGorkķoXMZsn>ٯ@aFgϘawD*Y8sϽ~dF*~:A.}ɀ.au-8{;yMcQ7ThLIoPôyoGğѢ_̻=U"Z UFVz~vcRpyMԣ=<U#zQ1CX40) aϕ<{z_xOwIKpΠˀ;աb WzKD[& εkLzEp˷95i}'tS|ꏌ{xd∆wǹ^PS:tV~Q˂0?(7w /eHI |L7'F 4Q6B Rڿ½V-y瀕~Z뼌2$m4)7CMԢ4$l/_ DzS<$+nCx6ۡV0rtt2szEQ/;aڄ_͝jTqxgqA9"1*1=hujz8 P9b7Ӆgۮn9Ӄp${ˊS!>rtlkBsv-̠RF1ɹ @R sf ZHOFޠw~jJ@1:zv" EҶjv 'nI[O"-׬bŎ.ۑ ͼHN*i ~d~AiBpM;z\M*g6-I@B@ltN+MtV3S-~ЩWdzTN-8N!XvxF:&VXvwey"G=$ `΋JUa.5\̋ˌHFIˀ$؄IqJ$7Ʈj;{nu]Ck'WFQnO=JG*3+٦H9 vP?oLѱ(F꥜3º5D|-a ̸z61J)h4T3Z<ˆ6ʶl(Y GXk ͂aU*ԗ DQ]i>T *G/KDerj@7TpBL}fLТFHU]Jd޺GMGOԬpx4FjxU3; 'LPet:j+ZOc6~uͪ=- wZGO\=m&UB7P GxkJ8wdmܠ ͰX\!U )"…NNCc^ Y$.!0h=S@-b4۔*?[zDj{ "n^5m(6arzv`A<1^0OhP}n">#$ J`PGBFn8QV%+j4צfHk1ZsU!CIkVc|5Ϻ.;UEUhq F##LMlQ~>C޲1a0nm%L]/Ö "c>$=LRTaCASł^! n~֭T؍Vj2t]uvύq6z X;K&QD}1B  ",8 ҕG5tܗʑq U`=6` h˵ї9(I^u҉voX?b)84HB UԳn(Jkj^P_&ɂL?{'+SY7bBYܬXc?AM>rW+g/~$,7w}>#A[ $}qKq#!2?"F1X46I"NP]0B 9٣(OǼΖ8`a2vDIXN n`r6?T$>ȎγlLsvU#DJ;)]0 Rh޶:CC8EOƍ,po$\*`p7Mn[VeB3~A~eن3=צHd Y<'N?}5!(9fq7cOQwo #)SUmZolטQ}k󳆽r-өq B#;zy@B N+mfe.$}#IM̬k5_2|~gGv@r;S(_ଞߌ;w y{ i-[q{ ^Jan5CQM+ yȩ]FSfzƆTxe:I m4KFT=eNTX0x(=Ŷɣސci gdt!-F*kov c.v/x1#fxm<#T%R(ՐL9m6T[c] =Z{JŏK}.=IxM)d0+mB@¯B0czBj8L.g/c4 GHڡ@ovUӱLMnu#X#;6z-3\䮾<&#`2]9?]p1{' xq4d.lk&oky1뉖TgUk)zKK9 ,L8R>kkv 3Ņ ՞ap-7~l=g#<] H[)AL+TNw):̚3Iۜn{EZe?Ž=&aO %V'mbSj(ߌDSܨ,5F$sTHAUl}%d]?S*NJL}0ՄBe`GwczBPuFgN}}fJ&ɑ Ϲ/FH1]|bOZV~d8 Y|7?G\io @ ϭQP4*ɬ]*/zZ, `:]2l;/آ?e_q|] ?; \z!_o&pGe`bUgzӰ +B9~u򉺰A72 ]7Vu~npmk&Jz;aGۮ :{vv?[ߔΧ,M?},v盈e6+^ؙrɠEDr;:JQa@ϱM-!#`0Ғ(V aFhZa򄿙@ٸ^5jE<=eU{i* *z*T*s4oV9<$62WఄAN4X۟ޥS SW,&eenjm\V@P}Y28SD0鍛,ppߗ#(K";SuJjL+5Vg@XE"΁ÇX_dvu&p%0GX:0ꝨD(zߨTd _e'_Źz%U»:t7e6-/0K# Y 8Lڗt &lod  9 HnAQn 3Kp岈+OT!ms1NTyE65ɂ=a(s*{%# +BH:s4 "]PRk~;1"egY`I>HԖ2 y[mz1I^i}p=P|gYFY,LK)|]gV QïU*tE] ïRQ6oK^2Ig?zJa!8U r&x, ?mCޖ # a\7xH6!j1MXs}{t`NIQF/7J!LOR @'pq@(*-YZ\`60.FE5<>5|FEHQA~('HpyhF iL}aC1@:|{QjV"c&ka~}V%h =&zh Od*8ڤ"z]A y |QMCHcAy _[*^ c>DzemFs[Mt lGbm&'D|ĘN &`дӝ WM< U[ Z m0ӫ踈E;9v]1jDbp0@f 91(9[uoi&ʄ!@oX|eE91lZwE x"W~n\ ^Z 'E3*-S@p8鏹TS-b&}Py>)m rkcDC5X wȐf͚d)9/@=YCš{⦊) F<Au&Ir2bO =r/Vaxn#s5g{?~ odLOף#YK?Êi,Q^m!\?ZybY f3eB.=R5o 7BJL=EG1\S 8jC)?'/0:~<JcxkN6_v!1`b$67K[0;߷5m94m ݣFC;W>y=5 Hzk2ֈ%nah!.j=Ag]>bdjDzpaNb19="?$R̨b"ZD7u `g ,]^!*ZHf7~k)5L7ݵؠL:CObZ󈟙*.Qຏl߂H܂aH(cMȊzy7QBaw& >lFn}U1ͯ,(.$BUMυ+ 7eR)"P ڹȫ٪ǀbV҄ "GmUO)P& A/rDwDE 9cw$"Hj@6j~ѝ8kL6_ܲ#(6U;!A?XCu{7)o:`"UB%KWUy{d17P0RHgv,7_{nXr"aY H:_gUI.+𤸕VBnP\|NL D?5!1(Dw2J ϡVZ 5BJQm\'qFPy9XX]D37.[ݞ<]czяsGlL5V|Yj3ΏJ:fK^{eygɭ9̸GoauiQ@%@qvCzJJ_5iMMyO 9swzeW}` t/[f&W:.^H⊑?YMЁ>^ke=/MA\_}j_Ѝ ˢB O[Hw-{d(Z3͈ݡLUBpT]mRXM:*4`a3qEb$C[(aKAPKȮ^c[<^DUc,y?=(g쟮y1\ v6uVH:cZ'26& oe&.pC/ ϊ3K05@qJKKd^&,&0dG&-|\+w\Np셙v̽؏N3x7]xui"%ײ7i72}Mc2Eʾ^Mv{rB#y=~@1._ۆ([?1UϾ#4!I %]3;ߠ3l*&=.+TNB{E,pJl/3唽ȈGbxdutclC<c։B;f^;LQ/|-`ƢfҪBl9by&wTB$cҤJ@Ր]+<; zdFF  4Ky) Lp],8=IֵԞ_d3"p ĴJE*:֐h.v}>83b`V޵oat5GH8mF"?5Fx;y/WTAs ḃTyGjT| w-}#u,Gsm{;XC0 _+,pg 6[͞#aᷳHI9I1 :)ؑ,Do1zֺr\rv .0m ̍P m`PӝeǀQO_+7 ^9p>OV~q _"ͭ"Lx6 C˔L0ы7Vzamw2brߠ&CCIGF_e {q9fBİ [pk^;2D>AϾۉ3U.QnRwn8IVIٰ>ǦH/RM~YץyMqX8l+ _A7:SEyp~5݉qQM:Y%`N0$Hh a_;kl5#Cw+"<ɄY4-Qm9e aUU+o 3((7&h&z:+>j3-]J/|cF @+Y,{vN|O\hcRI<}#P*FDzY~L,I/d8bBEWfxXRC y5Q&M|fd-nߎݼJ7‹?|zZeC&J6=[ZMc+r g/V-@k~^e*6kJ8Yׄf^*rOu=q5!Vn0Pj.Ռ:a w8P*AEnZ, Mp߱{"apjr89LoWP`RC#E~|1C'k\n01Rd |vG >>lztFL¡:tH [[MK4 0͍:% 9)ï.M 8RM 7!h<8@gq b@tVi㷫m bF>IF9Y1q)NVQԾ_ MfXrBb lRԻ QCаm>gY@>=s)o`kFߙ_F/sTvk u )ƧPؑxMRX3V:^[eY 럍 Yb缤'P{Lc`A":Խ;V>JkF#+d2RyK rr;ܣၙXפ2aꞛ&8=e@=t5HѦiJyR%fZ5 BTղ&HNcF|i.77XmZvks1s{9b;jC(Zkt&1wU͖ =#eN ژ#\܂ho$ rh9^Y]ݹ8Sc2vK[wgw&uh3N/ 6PZ]SrK=F́~kpP!3aMbP~> ;۹x_ͬ]NJxIFkEP0%LJ;0G~!@&*Ze-4 V Dg0Ǩ -<n3dth,we)D$XX lFࡇlu>֖ ڽe qLy(IeJg `:SA)r'mƦkadV_m7)`{ G2wm[z 3xL}OKf=}N] ?aQ5bqNFNWG%:grdE`M w[I P^v]{PWj 9`QȼӬ_qj:a5B Pzia?0=4 S!`¹ z(=S+}+!V(O;րsEaST㑟F:i.NG0. G\h G]|$'D|g(MT6ge)MAY;VlN&m(T_aA*u`5)r6/ޑpix؜@zPgFiIʈ&y տHۚ3ivz? Bk׋G W+T%K Y͡ 0Cl(RYvM4کAȶ }(0 pg?“Qgଁ]*(]Pm[T6FH?J2t,UKfVZ yU5llJK WMS3];~m?zmO}=Q*tjg0 iriXTnۘYP94{FE.%y,eܽWPB϶%%#fV;RZSg+6rTo6)|>*~QU܄|(X?mѤ w ]I'ѡvvZ|nlsހLr="[w`, ["! ]ſQ!O(x{~GlN&Xٽ۝$-]}:[,@[Wp5dFQ+1׏\X262A3myz09ʶ QdXoZI(Fu2}C }"kj+ Қ3eכEj[Իŋ?_EU֥WS m!SǗ,]Q}NcњM??r=1FfS{?TÎs`9w=u"q?$# #~X]9+9E[9|XN)n&#61L=3]A{9hO~dBe|`~H%XUK$crņ> Ij t f{]@v!0F+f؏ y+I5i{9s E/<іH]OJ6)V\CVhTt* cP1"xSwh/.&2v񒦿MR l(prZ}kTۼ6Eu$Ic]ǯ4` &G?JE+ cuW8pDiѽ4۝'e%Bs `Ӝ6v;+vӅ:ĺaDoTACp%6G%!bv?AYR!c1aNx6[(a߬tI}cg^Yh6Q|iB4GAѸ'mL:) ")A"&$0*݇iWYзC=E#:<1tUtS ^cevg.YUЙf>«TuAh]SieޘSOsyU%SCV $HC.ՉDQy]vTa?.# ߇˶O]tD)@,J:$_ Ƙe zY d4Q4SoPH@]W3ˎ J"9r0 V<'EvH)&db{6r+kFuVC5?y`H5Q,x*y\L9wMG@\]#ulT]݃JL( )K=&.-UNG-1}zh!6,X<^u /{Eun%.5Y,6#DNHvrRaYO;䌡?>s}ۢ;M~~\̻e!%MJt#elw2Eͥǣ³5;D ]q]@WE?aȻ؏ Z-WiIs+>dV 1р#E5i|jDbFbںA;ΗgX늻c zc21g" TI᝸n98Ť<{K ,*A ᑶgBpIH,LkCq;Ud6sEAvڡ(M(؛'֖R~4 Wm1n3(EjXozgdCA L{/LRYn[*PR J,-dA>f'sg^$H7 OIp9Z~qn ++& 5v:? jhdOXvleN^:OAgCB#zFhHJ$]Vɹ`ҁՠ3(&TxPJ)N`ilV.YTj$7CC!Cᾝy0, ~ ')XuSC])UCPNcCi%lt>,5hRxcF˻9 <<Ӄ9>fg6P6o?Am;SL Cv:%CC {coirNζ0Eʸ^Sv[ ]ҧ/U/ -eK4,Bb5#X)P1IP#ħg}5Ю%BP_gMochU>mfYc `V5 U)!Myї'bh']+?8+g2LiF ju$}4ɢ`3uZ(b> W%Ջjc5ʠ_'+.[=Z` Y?~RgZJD̞O[cb^yz#z`4wABY;dmo&־U. {\{\B*4I:U=0đ/QU#w<9wۋ`0mZ_:d֧bXs(i ٲ 6 n4y36Z):v9dA\g!牪%]q03n% 2 CX2"5<*vcR("GjOq e{H;^_Ι576 ݖ|>]ɩĹ tؙ4L8?sj!v[Q3)end:NS'(+*v>ڗS*r~#f`=qbI3(N`s@ib1̜XwdM 6Ļ{+.`jvOlIKB׸s5i~}~#751 Z՞s!gfxZp[*Ʊc4̶w#|)Gx@;TjZugrC Vt;dbM[w2`tZޗʆpɬGG}jq- ĎBNf7>qmHv=^b;v-~Ng59/.1ͦ2=*3VICCP8{^ LI#6̚rlDjNWR-t-;6DLn/u8A50M;~7g`EmG|B06iCL `xȭ]+3ӨS`Q 2/;v'v2"eU,Tz t9? D$ L@EwQ[Ung6wn0o #Y V|%WkX gF%dž*h])JfoRSUs4PPl!Gi)uC%v(ǧA'tD."5MЃ|8L)T H^aіe/w hM 7_~ϗb)*zbErY67dDp)Π-ױz .X"*?ϟEl@$T;tE8b|o>,hsG=Et^#Ǟə~CFoЮ< 4@ߞVoD*e0C "ZWzStn_kN.‹F@ 5Z/sGՓ#M؊ZWQ1窇▉:jP=Mǒ ]lTuMh;)]})Q|aQ߲(\-_BU6ގ Xa "AmS#]ZȏV05r.)-ďtH)-": W_rZʋT2N[Vʩ'j|pM[cud})ڱ5 BLWg`:SZ8yYbpqqu䕙:zo[72+ +LʂZKJf7 yT~fe@ FF}Odu8&FrH_To7#3NjbZ l维Pa=.:(Nt]5] Ȅb)ff(0@+ ,:W{kj]a3BP/.Г{9#@*cSz3S-m]I.ʂ_(C:j6✲?|`b宔p8.1.t :ܢ mE3шRy g=#1O{ x-­M2%``{2#ޝbcCGx$ts/ڌWE&L[&Zom">[%ۀ\uȮʇ;JBkst+݃"R~3?jaQߎe""r7 $!/Icw]BK,4"vOL(BUJ$Jef(LWN灅KWhr#H>bWM u3# תEأ9WwG0J{mjwżTrБ^rsGT  w5,5.#& H,yƝb^jPcЖQ4-DVKhǿ2vwƅwKFz4kǙXrY J-,+Εʩ%L.խi iEr}H <9NkRG@!puWLG8}۔oDxH,.&;ퟡ gZ5B"Bgn`}`4|dr4g6_ 9ZߵA~P.p b"h7`zoO2 M;#xypLYQ)P\i&!?/R[aG2;c-zaYR̩]  8 ;*|Շ.wǓe)0Eʳ' ɭb |[I;qIp,w~ܹߛQ]kJgpOܝs:~M>DЬ@E_JAewJזE:,6l/ Ў547ma0|+0Yb1Õ0EajJ g/'%]:?3?eOqwLEcu%u .<4 b$|i?*XC# .u-n2"kZݱc [A^B0v\q[n7OUa@}d ы!n=Xlp`Ay_v)TFcR-Mps]qϾpg @_˙'M55H)aWHW)F?4>lBM=*;g- *jkۡP*K]A5dey$|BV%3{Ng8NQyҺ̍еZLx-5b)v.C3ii]2Aoz@zJ8*(rAel(Mv=7Ľ ɭ$M}gt r[3U*4X㹏 6o]CO9*+-Գ͹vZf*u ttGF :&JewpUTE׸ PI`f"YD;/'}(HkxBR3dOꌈƘV_[]}ノCfx@8/[wz5ҟz;\U)q\nyk>lv$Q'069z_d}gB䊣MyHV.׉GTG8F,2NoJu wB"o'LFXnB*w{:ȻvvF'ENˠa25kp!>U(S~!^d.i1 +WFu׏,t^c)u=ե94H[@M:2"H_~`I9j-<`Ux| 1X 0Њ%n(3z Ci]f.a5bWN4f8cPK<誎<ܰT%O= k>d>=P? kҖ#KJ lcPnz*RJ0:6CJ}:-^% fDSi\8xG) ;Eצq*Y8.toqo0>{.UV2Mv'k=$߷Ǹ֏Ÿ?aCzAk90CvjD[% +USV$t!iǿ->Z %*CQ%DXfq*j>ʓEqM6)(oo㮽E>d *5߁KV؃d09Ar)zĨ(Y%qa+:!=N7!8WEɏldy~-&p)ƭ=1tږ2ԛ;t!iػ㵥Nj tP?&6[阦xuW54o۸|ZT,5׆2' .Fw]ck})s@( H1?˗ D*PsK͎S2r$J'v{nr DwAP{GBp$ʒBi`$, QJ wПY[Lg6S-hުښ_-޷ࡥFHc9߮VWW6ҧ3VVod &DWndd 𮺲 }(PО_Φ逢Rq*]o@O;*wB 1+Ԃ-sKM< W|vT G%ߖd9vP5PpR%<%tGC"ɛ?GܙaAi-eqX7] _jy#΅/T=^%6kQ'`ߌ`uL `l^Sm,nNE犘c5S爡V&P%}B-0ZK݊ ͨ].,P$-nu-%ʸ64VL g"I .IqR7\i{4J/j߬ ˅B܌rRV5v)ix:qkLM9.Vnj| D"y(Ex1!6~7],G{)mNMPGm1*b.[,"uP‘rH'gr= }^YamC(2:kHε5^Os.'"bv\ Uv06OZ!%P؃,Q";>s6biAu6'k(n uZn""@SIi(E{!8խCJ-ؼ38t8WR2a"G@/(\LwozTN7݉5Y3hR;Gכ?1@v {M#u%V{"Rse-އ#'Q+o5ju_]6:]$.~TJX+q|~B75PӪGud?*iBZH* %EJlӯc,*8rZxܨ9ddz8cgO6_꩒V:2u'UE-b؍ހF&./MƣňZ1q-fR[x.pʨ3^48#Q/gA4mQW͊O0ǂj7U{\=h`iww32TIOeD*^.7hZ9\H :8R{RLO5##\ cvzȊ@xЇr݇H- KF-|vނfG/4kD2вg*# TRF}.M! ;8H'Eu_l ~ۨ$K7()Xai2qh4O0N55"ųQ8͉WH=y2AjHxߨrsfH* °˲=?U#wcVԯ`G'RHRpY #R Ȓu{Jw 7|QcL1.WƧ8Ei$L?vJdED i++0x*P{vcT!&a}ʜ}Omn{Y&& . aM_x<@@pN U2 .\4_e|^~s$|O+r9T bw c,}$:3K\h(x$)ܨG;C,3GMsL֏Jx {$jvp~Lhzېѻ&kcP\=WD=#kpq*zYB\+)?`5CW 2~?BEHEB@:zYQy'ToAz~|b?&>Wѵ;z0.ʟ>laAW} VY( AiR?g_a#B C'LƂۈviRfwfȾy&w2t{ufTC_?vR#Om1C^) $+(4_* Qm05 MZ 4 M&.{^_&ǥdDRze#ْ Y}0bi{xWͤL"a14y6<GO\3hQy63f}$ ^n)@sDmيY<![߶1\j_;ORSx.A,e5=,k OWb D|Vl .irHṇy^6\\JH+}+Ier(yDw԰c]6"&_g:08[Z. ae+S79?XP{76pqBS'j~pw0up1%6΢R&/=,cʿų\G[M n)i śl78\m׮ {Tm-%Hp0V*PVtXuP7HV)=Kj/)=Nd}߮E%ev'`$NΜYLHtuI5[i~j}){ԎVPiVBz՟_9߳WjWEoIE~Gȱe3/+Q ydm=b9xvr~XEj"[r7t1V-1ݘX)*o , :kSx$NΕ5DDVmXz_31VbCV)}A% ,b!ꔴB*.d1IMd0e%"߈Vx>Ytl/-BC{%BE_6qqަ:q*"qpa椇Kmȥ fpL-nZuXum=O@~ U5}ё<`\F$]-Y+ Xڻ =$WNc 3Ʒ $ZÑKx2Me_Ḯ (1CUYFD"&)Pɭda[naLM~lh;)WtGneĬ$GReT>-Fs $-LGC|&"\];rT R.tg w5m,a*@%O u6w_Twɚg[@]PHŊO_w^WԧLBtz>2 E?v-8,>jاm2ׂ~h&6ŸxReDe-AI>"Ê 譝10Eț+Ϛf#ktպx_8L'DW=bX0?tY5{z ֤01sp)ȦO}/_psz]B0N$8ߕEl$vQkDAZ6񮟵)ԚM*cg$2HH| M&K#[4M!qݳf6޸^Y d$IUt>Ew9 oNtc"QJ4n/%]fq;Zϐڮ6wZc}$gWûV(F*8d5 Xv`菙֑][LG ]M#cF v(kD*8_Qm~}^$.rcz>yea{Zj]Y18myb N}uaWZC cuF鸯3h>̣+w/ (wPFS)]N-R@*Qah.3{Sh2%*@0#cٛ'eb2Zi QwlDU4'CY!t.tmUSCY?~vSTHT 7|uRWazA<p fRT o{=DL֚8%WO!B*CZգ@-MM\UG-,> D]̴c"ҠM,mH )˔N7#qB{?KPֳ .Gj@'2%Ǜ@w咿kN''4T3`PP g\P~ZH-^*Ƽ,Uhpy8<;(hno%x4E[jOvfO罹-!, Cy_ /7m~ϯ tL[ >k%vlit")|Շ ~Wd`C[Xgχc–M̯VxɻoklwG~_yUU>-@K!o4d!Ud~ݑ4\d̂IS&Υd˨AG}<~nG{uHbXB}t֑{AQz=@ fV1p ʝrF;q?@hrA\GKh>wW.wk-`MdׄuB S1T@38©$ sc99yJbRB2_.;,ѹe/|H۪_(8g.VÈWt}>WH9V.Zgu cՒW16lZo>ҊCQ'2  A q˶ i+`ᅧTvP>rINYVIAZGC贲@pl7Z` yK?ȩzp/uH\DOR+$j&@?2&$hDC8f 9ZQ|/%:8n.OI2]_eI ImύlO.(J2P=mS L%\ka|OƜ  R`xr+]9&ELlq3dL[3; ՠ-juQ/JS^ J +R~A(4{6O=?Q{&C&Cɥ+ d}EK fXK[~m FM _h2S 1&i^>~ql~–MuQ*<)(izEM֌\ -="8YIH*l嫮qC̯L&8:^槠*p䉕Qv^^G*i[MYV \km=O/[輲Vo9W"0-0c:afKq7pԚA9lkzEwUSD#pS.0DDQL<{.^c=%@Bjvgk^}^+P蓱 ezp6W?؟e Y9^@7МzzQ*LwTіMA:I0)1Ӗ;t8U.w@kyԘ1Iܡ';j(a%u'CGf4O^GT$'ܮ5=]}ߚ?.tavW8.럆lYf_:idרg9('˓B2oIFk&76gI);*Ug&ls]H]Z\M}1D"(!(%OLx1Ì %H'Kh&5q-eOUE$5]tJ؇ kq$ 3\`g6ޤ&Ҝ48R-l3le.ku}r~Oq$IuUL"P}%ެb] l.qnZ qXLobl:W'NE("gl3x =E#^0.C!Q.V1UZ#ReR<3G.$;kzș82GO1ZVT}#}`CAP[6_L^Z@#KVt3r'ݣ R*4iz-C%4_%Ho;[Q|Sf;L3NQ"vVo:w0 DiycV;P}6JuRWZЮə3^ b\ew :5tP朩݇|?4f(2<,Ō):7jzFq;l֢ʾe_NGLlLM.*^MiM}Okҩ[({'|Q|6C7vKlwZ1455?aMx_e!4l;ucĩ&$&EwXKG@k0_I:`g1o+Gܣ陦8or'bS0 R ^(3N"̠ۆ# J\Ktj<5L[&sΗ.x)}`G f 7@TBcc<5ZeH A ir~&4{IEMmJPp]݆:=#j6,!8^2d.*6a &1% ^](ʐD*f WY]uDt/ET|[ёacbhZSϲBYQ9Km8<'σ.ZD9;mIID`_> Ox}/Β9u6`3jf[z323ӃqsW5lrȷs(fh/Rn[ E -ۦ WVImʑi;~4SM/rVVJK;SӪ|l$Z%^w:薎+eϗk {E%s f+[TT^LhBb D% p{"(`Q\ٴJK-[Dl}u'F_"?5O`/Z<X=|lᬿaEg(ktUZrhY|TN'w[yzp:m 4C/ bx0 {y1餀\":&hXlG}fՋD/ qCЃd+XC$<:7L8fó402rVdvq}R3)\:x"uFl|qLNc Aҳ8+;ϞcC,y&*=$ClGs0C_$-zG\ ]",~ ueaWP߀*H M i5ZQw"2*G+dZ#BB-^GXv4 T3'6Wz2P=􎭹gp״|ЉxԖqQ5"CKG!ا27tRm!Һ3aQ M!Fnb||,cEIc& )yC;%6%3^a4/ o~uQAqA"I4=-y_PxYgitiOMe$3= "o9" ՚W49DC$8[?|V|]kVa!0%~nf62KyݝR;Q<koh7fjb^QDl+֢ ŸK&ٚw6Sm;6P|4-\:_ak?pN"R6)F2୦_t[V6J'/՜+0xjoV׼}hI3k"uIz5bNZ@ ±QßBZ{X&d"zr שvWv ISWa}=p/A -tO X"I;‡t@q~Y eFIm)lnx'@IO )-G 4``>;0^0V1*ܖ@C$]~/)蛢o;F/[[< 8&Pi 7s41XJ2E͏2D|N{O>"rsV&qC31qPrJq5TW7{?T_m16!8w"3|aA[N/GNԍ::-(cVtGTsI;+)p> \a!bE4`0-P'BJ4m&`D[ezUFx`Pqoo$B"vl<(* lZxT3Dzrug+Uq%J?~Vb/BeA;S06xǣ8:12t<Ԯ'2@01D{&n9 Wy/a n|T^YچoY,l>?VN5 ?5dRlj]IehsGჿi5ͅw*z{4TIAM<[UN)>q 7vy4|5Uaki ΓLEHcrIL 1{ZvW¦C\´3K3|vVavD^mb!Ueݐoh^ęW@Lˆi931D;09*ǐEU YX:5Cm~ڞlBT?}`E{ fiIJx<:mPE[׎vS>$иNg:ёs;߈E$M\1:g#{Dz&ʱ#![2C(<da}s<V {RG8s 17s֞V2'o#rc'L9(Rq%]iU1+=}uxe9fv[39o(^)%d}v(^Y§F}*H9UTD uviɹƘݤp6bK88o 50s۠wv:xz]"|h#^2O?ni J 2߲ `4䰣V% CNoW@.(Qw~Ї\{Ԯ+\T%" +gu q: Ήk$@CsN92uFx+_\{[fǨHY@#;6,ċCr~}muP&vz՟Lhţ^¬UCmT.VɭJ5]Ig,s-ec{3DTs'f UkÆL'^U7pus$F>RvMVi'^G#?<(\ %$|UJoqDOZMt?G{_XGdn9L@O [Xt)Zz| -5X[\+>sXA1 -WFxqǡQ) pnnK66RD*UX7_˴øR7+`/`5W?:߲RrUh==W<.:xJǐ_B>!NRGěH?Sl]+S ،r®WI-u&KcjO~hQQW_utX2[i(JaO0tmz UGbMXOaZY!CBKh}ʞpJ zsN澹䚯*W!Ė!5cW,$TD<>G HCؙkKZ p18R@ǯ>L0k0oujǾ:Y0X$ n?9j'ЊO]S>M YqPJ$A&8y)P;wCxf2pFg B]]<R:±N s}D"!zt.VYh]ZZJ(%׿na9w,'h1JI8!7n{6X(4yQw&YC]`{]ɩ<Cbᑽe5oԪѮ'N\U$f@a8lk4q9](Oƣ|9ޝ~B3Og?WK{ĩ㑯zZh]Ẋ4V rl OU _3GrG4vLYdpƻ!3=Uٞ@x`ⰨywW$~涁=ƶMܷ t/ k+">Z]@tNV<"߹C3K`nw2!5;ʨQv^^QEmpfTU qXA~b?],ةf)9X)*"9.i;FAHWt@VzY0.LuQ0^R:܆V. !1a6k>!к#t[Y?,&?2ƞi @2IѽUB? 0`^Sd2,4," Hǯ6uP} @aH|xl_iG} I蔈`dq}$^Ke*@;**ǻs#VTKa8cpDŽO/Sc‚B`(Xy2Lې_17WO+ r4>_ TR JO!{EHk1*N_4̟Dᐸyx`|(x30,XO-d ~ &] voU@p;ұj;vUչ"މ1pmO'& ;uя~r 0SJZvhjc*,4Qqz4yqu'PJO'Ȗf`⋯[e ے\Ʌŷ<.xY%aw}Y0&QTXa%xꃕ&7^ ٝ5C4tM&7ubTP}[}9cɤ?d-Ԃ3f(b]Icn?"b#36tw@)2U.ZB@ht7I0h悩춃2wOOvyVXQw4]0Y@,j|aF@bBoT3*CJe> X2OGx$'VY=qC|%a=A F;PFEy`h>"UN ӭ0(bJB}ܛo,}c?:! V%\C  PS i2Z+~ *c1ŌSiʡxt!!N{“d=&fۍǜ1mU_kϏ`{fsDyHlWa%_;C3[nԶY#RPmU!읩\Ό/>o"7M SHpp+D#T$jX V fV}6S*B$i'5 8fˋQG`mLFB)̤[`tNKwJ>}mFN;S}jӬ nQߥpVWi_mMߝRS;{^ 91tf]A'?|"zzI[$3 y6𿅶tVהEc3)NQ ȨZd`65ϕ[(Js>B-Gc.yVBim#i-\@JFZJZ9(Ttdː>\hΌ"\ѫMgno hRj8v\\2 z` S|(?v骹ğ<:=2ԊAln[3T0}wN*Me_p3 LkNluAl)1d/RxG p,&+;Y&_2X`Eu\^{AC$606x=-Ba)6#tr{l2OZ/y} eX )PveY*NOc4w= "P0mݑYRfjYqݑeKߥg9Zf\c$ ɑ $uoDDóޑÇy)nEޱ6gK0UQ1x5<J( -Cow>ڊE^b}UVsiW/c9x.?bSM`#esTAEYuf.D ەWSWazqO^ySU(W@((§(T.İ](: ̓n]8EGk "l0XHu6 9܈{,ܢ}puY?"px2= +(ON`O VZ #8^!A'Gmg3."ϠvZAn?%m"]jYVql) >-w~5Bb`$M..g~7դphgrVm%-b=:0 E,^Dr^YY"au0$xW7Eq)+]udHh9x,{_Y"qd^{?.۬;$y\~@S1QZ>#j4r&7.!NlPX}E쐝`)pɹ#{g?q6pHɚ}Ί wdC fk'vuYjaE{#,}֌b=CzI(6OИ&E&re"MwGרj*žbH=!NI=׮^!G ZޤKǍ:(fh{co:?D55吾խ15r\k^6C5:c'KvYVU{JǨLq@-}8ܶ;oFoS)Wj=U3uƝB%OSˎd0-%JObwGWo ~/'Lj;ҞP=,@k[]ax1F_rcfH/pcp^,? / #g*+ፇ-MK=6 Tî;ak8x㡍q7mn{0ĴqQSb>'+D{*_ 'omTrux͌/90"ߢL,lj3 b!'^ȿ]BZ'y.#"gn_2_-O*,7+|]SwX( \Μ^'%'`Y|%?5x\qA"f=?&VJ6h]lw WYKBNsnW|`sJ'z|D%ڦ4 cŢ- tjjzUކT`=]+IP:gΩ#^0qw[ҿҒ%8KIx 9<b8ȑp(\P% \XϪHO B\<$Cq Ip;·]DXxZ]%x6ξe'=j;Om-gDy 9@(-=mh"}qu F=A$K=֨PJ:E}M`Ns am_#FP<9oP;+?pH~lqb\(va6J*q,+|xRplcOGO*B.e[Oݷ{^N8O>QPez=@HB~Pr^$j3ͱFkxLh4,xKm7yd!FY3uRDGu#Wpym9^H)Ѻf,A:)XCi"}:S7"a-"G:<ƍ U׺W<ɿIqٕT;iy9Ljg}$ en%[ȝ!/ {/=~pm4I;oT/zU2]BMѨ<5_91f Pj*8)/IH nrQS6+7'͋VId6iA xN9Se|/Ǿc]2E^F|^JE๗Fj&;UK+3;K\16<\[W)fjΦ TKlU`um'2 'DY 1VAhR߭ςpŞN٭p nZBX mTN?E*{xq_4nބ1v/r:f)گiX1B>5jvwg|M>-~Kb^:09T+mP{;ԩF c9[|֓d3}8'o&^ Gȿv8ZI GvJΝᖊUu5oeWqL 5Kdl?T0o@=Pc|oƋ1BH`%9mD7Ň%Ì[Y<[`[jn6e~D=AO92 •PEZ]~%R/l$nӬA $0. <2rqw,`J=%A2RD^e~%䵹=j4| ܕOx g\a2r3B 1q@[cw#.XNX[pSZ!~mU!=+Lb⚶Zk-S=LRdU!-+m qE9d*k*Ql ^ToZs8A(_c6׷jSNuv0X3!/1b.AidLQqVuN]#zs.^yWBt('EA\: _L 8=khH -j^d]h^ /_9.L!WV׃>ñZg R$0xT3O2qS\oDr󴂶yI| eT"Ә^8 Ub%vPq1wLbwa[4c_ cyo2F1m0!A:K$dKzGSr;H_<&o+)K>mԍe(5`&/EF7Me {yYfq6L}+OF:&5ueăd2 r-9|v(,J-7c7rĚs_Ueg̝-Q+V]%o$S'Ge ȾeUP'ӓHy;ρD*Kz85xNv9])6 )=,8<|:EiwJ N8(ƱؖtX {Ffީϡ 4 sQN5g5.ԋL'CXl uMeAY\zgA:EԪ?ARoC4vv/f]BIJPp)ۻǡ(2f*-,O?rT8z`&cFNh U2b:9(,Vׁ,}h-_K o߸œ NY&t'R^\J j/ &/E<  aD*eR7A[ш#oB,Csm" eٗ{Y g@6ɝWkoUΪ5`ѬFVї&xv(&;;,KO'Dզ3WF5'uJ 'į R3{Gk˨w7WǯNq M{TSqU`7ٱ;nu5y\((]ͅd"ZQJWeo+6 12gI~v 3fryEΘI(m9" }:RP%Z)wf\PW[+6 ߕ:z62,6۔+o+[w0JܜzDM_s$9..hK&5d-R,rМ_9xBKjI_d 1I`b=ֈ3y,5C`*!ьDڢM 7[i}$ݼ5\@DϤ(A{6 Xdh˂5.R=p7"BW.vDCÕ'lƟ?+{5$ ULcX:h KoZɒ&^h(tuC8,YEU#wV[&9M%8^>1YQw`ZWC^yczH縱D0u.mJ6(2ޣ12|a>/DR8hFPX?:vg޹ۣu;fьEsR8jU]AUAn8,PZȮv*`>m1V5pXmӓ58:K,t/|@ED#3sxg~f[<`+x mp*[i[lHeۥsz[?>{m6 vDN8M&.a?|ZoY_Y:_VTƶ=]abW[ٌr6VutWcN/7Ҷf1ܘ3drXNr/q൳61NJVmQhQ-*҅[,JPaп_zRP o=ez%.)IpoCԦ#Lpy͝}ؚe&#t^P2]mռ$8H MۧW癟o4k43:3~D0fgrg0՛;[ dz-Rjd?LWL3j`i JA|nt]M륟`_U̪OPv׏?wCz:SJTHwA6XuT5(TȆ(ES^gYG7798(~D "71u(=6JLpY),-pmCj`IaPŲVgi:Kmں'Jr1g2tb8lGԾ{$݇[$Yy_ǤE|`i xI0GÕnY..W[T_,B1M0w%ZzޜM*Oߌ ԅN3^2i0 ފR7J دv 漦$na:C@4wF*wŵtWMQms,`_}O[adFAEC%՝'\&Gp'kar ̃ *zZn}00!u )`Uf.K^:Yskܬ/npP)x63RY6G8^YPҹX#+m K|Z] *ag(Րp%:Ӏo2g*}pF7*M޿"fI_BRʺzc\x(??oO6cJ\杌n)/^xh4+ޥ ^Dc 9s{5[HLTny/eмg-|;|\a\L1xOq#exq oqBky ^W&7 xvʝJ-^ƝHQYfG8l'i;ѶÌlBMR4{l2Ne@~K>)eduUx^p\e EIL=F7^`?^;T~lLQ!yb#"jK-~;ACk`PNZK6!m7B^n#MȨ? reʙ\0 3׍ՠ*szۍm)uG9)McRVC>е.ʂ+h[ODRt؛HcV;To9)0E1e5̻|ʹ^x .DsӃU EB{qZOĥT]CdUP8keTADިhypS iv` XYB\FL<]3{ K.pPWvLcnqn@aVޢyJ7|}7jkBsX_Ԉ`ȑdV)Z̻'axEO)Ys/SԶHw:)'}TcJ+{ U "T >rIy~r\PJJ)7*%GhZB 3 SKސ#1+WZ6yJ4rJa,(҂Jw22+;$/$H|-208?';>ueC ]b#y%=g12T`>yPr5HѣqG 89Kt4:-;[6f#]1/r§aS9ntS:^ڃ<)$EKA-ܨNDGVM~D"6!Os K5i6pu6\3x'Mף53jyuv80\u~{]~m3l`J}. .ҟߝ@(3%_bBUdI'I+~ }QKS(Q5{!(XҬMn*9.yǕX/Gxj dֹadO!}KTB n,%!ܮL~\s~qh(&:|YT]`iY(IğHT7y=2~'@.-#N+\2>M;&$ⱱ+J~/hJ3amZ~̈́jˣϢh=h;5=8 ~-Ep@uң%!CmZn[E~7_#PZZt*>\PҋZ5P aUbUٺWH}\ !w[X8H3#,M(<0̆rGeldZ66JrYn$9ҨiyTWUтRH3Eԓ/?_!Լ`jEOuCdkQRÏΩ*6{gߛޭG!0,d97?I#ND!oޫnN"AQz1scQQv oc(WAW˻]Iۂ%[l⚿ןeO3|ϦkP;C*z=c`ޡ?v R~Iqql81óKtV_^ f%2V:YItˬ8.E3wˍ9+rXk]$%O!(vRU9Eoj. ׄM7ȳ{ʴsg tD{1FDҦ{[ |.XDH4?OK%oWģ(E,+&Pwq*"ZeZRwK8H0vP"`F$hS#܃$I㐵0kW w}V :y4Y_G`AheW9D(l E7;$rI~&C3$H*Rw &=TYCVa{V" ̬{5!#%xDjN8=LVj\{1;/]vT0U#B:/xFS" Fu9leMܲݤ7_C*< KULTBB )K1tHg>Sbz"w_mjfKFHkEv"m7e|^xz֪>Pkrrg_gF4 uQɞL/<ƴ`:;?K|@kì1!V7yŷiJZQQk\ S~ӓeyeȏ'w>.xqT>lʾX1sEɧP-#DЭ=أcC-7Hb,Tw]FD>t0΁:ȄEуG=ѯ3V1]' B =OC2c|'07_:XEѪmD$Jڥ}߻l+C+X,ux#a_qkzQ/E( N( lŸ/ocPN.ll˞'4g<7D^/W Jx60@S'Pb h>ReL$u}yfLk:̒Hoټ:Unӏ벓ȲEpR wӅ䝛QOVtK%}a#Q]Yia&Zfrl#Ní)褄Ò:@HW(4\] qE† |\P0F}@j%< 4JVgfH@ )ye-kqޮ:Zj5R=mC%QҁYjJl;~>կ8*~;jNԑV1?+[v}$ߛr _<&a`*Vm_.(_Mcxp巙k;z2t9oʵ zW∅($`+Z>=vrPld()V:LdON":+rPT)ZIYnz~};<\k_YD&+EXS$A>Ia,5E`pjAuPcVS1t"H@ ߫l⃛?A;`8Γ" EbA`qI'I[I F^en7tu1j:T7Vqs 0`1*:q`">nݽsrQQ8gZF-bjD&6СU5'&XoE_oVUÃBPcZIxE|da25@tHkְ֗W%|cBY3E*ؕ0rSGxsC Q9#e=`tgVLl] 瓲*Ɇ9Y_+°.0bPFD zڛK@x"W޶%Ͻ:*u\`y xIY_ӭlD3 _ B<'(j;Ѽ- 21ctP ^A?}xb),A1ϋzfngϺ,^=UQxoUyh S0ts Di3}o(< Q0)^< 9-]b%eUڷ'c& + MqN.(I]5 |;AU-z&[#8F?~`92WDݰbi!N #>gAka qܫSxQ v!>OB-f]'q <8}!$UlƳkNYoUm$ݧ؏x<٥be@FĊ= qsL3e18im 񔙲RK=j 6lu\<*hXaC4d23=\؉\;VF r\+qC€deG]s-C - ;CmGUXU^}V9MBߒ 5Tpu? BJᕃG#< EEF)vi{QW_]0&Er]TKEf;eC i Csu9Ls2垎}: ^4.Q%z1$ޝ`i:yX7 @4 dOc3_I/!o9r۬pI@áuNeo\t9lM xx~UϷ>$_DK~>/x`l^ɻ*y9 s(8H2rR|x{N_搵&ыtk!vqFM$`k5uMRysP08%\-wG޳?ŚJ굝s:i>AK. u%ͰByq=29}i)4ZBҐ4iK#}g[6&3[L$jC[n_*u$SȍGVi$䢩 }sj>01tyjm}?1%(@o'y*dfZGP&TA7/jJs 4%*|s2Sn r(A!9zN7޺r X=4soYM?93Q: hߎ۲!J$ve*;!bRZ9!|XNrݜbN%YA;aP"fг?o> DDؒ)F\]-$]?sLԷ2tgXB c J{y9\@',:[.r%U6yb@j'ZʶkOQc3|s-qݕXlJclE$x! w|Qԑhinpɕŗ'3ILkEb6|`-uq,p#BF:DhY+q+EU2hҁ*e|&':CXc߅S?z z.DK\5^01GJWFg9(v>Z}עA;9Ȗ>!x}mؑC b#mc נ 'ݒ y?ߑ?@`St|29 ݸ=󨐽\αF(JW OL3@ ݆"-\$\($X)hfx0"L0v',V>C Q1k5!+N䠁ݝH BŌB^n`q$- c6DgR}Gld&r<It?: 1;9x~!!1TZ=Ykold^VKXpcxFa0CsR[Vn!6wYD^l_:<`U3kк)lfEjaIQI9* ՃF2 #5`huA6˅Բlk/Zau>R&?1hYTOQң`co/DgRo~(2FW`Zr~">Zф9$jVГ1Ė7KP^&ly*8&@ çlX_pH hbX$V!W{xJˌ@cџ1A"ow/9_' Yj+=M5Bq$X+tm9#rWhɱ|Ԣ5p~;á0H!S!E&5&bRi<>ػE {/]J;NHXmZlw4$pdPC ٔqcV" EdtSLbkvXNR\ߵSMSAbz0`t/v=V!6 Qp"~^D^[=,`iweWiW2H(/D }ؠ$ hvŶssSᔭA3(7'Ow %ŮD+.6}ܸZƑZV1KRS倂'ğa~IsC xA>':űjr6c'ќ5 =DNA.90A\i ?q%z| IW& HXdž@\*.~}T-0V!tuXJKE"9r 7ܓ<$5~gO^͏F1M,bϼxDgM_Y/.J} ݋E{ 7v(qU0Vg+c&?!W8{arɡk9,.4JhPKPD ~q8ϛxw r43{:MUI~嗉|7!]G1CE:o!0/O9LW7A%gnwN'lꤤ$u~Õ ˚?ݨL 'wDhE6^5dLʠn =C)1d|,CT B#`YeӨY]Pyzd :㏋_-Ȉگg@EE߬z| əMtǦ@lBlcD 7HFkqc͡~,Մ3EGlejđx[₯s+T iɁ٢0 \*rU:YhCSNf%퉽uk m]W7hH2nI fzO1 tkO;C֫Y-:K:e)6@>p#>wiCU:ڍpBRC:kX` Dqthvﻁ r7kp31')$:uu!1Kxu/\g1%CxW'bG&cݧ묇7e㲓hf5&%tgeb]I!",PHr:`ɁmB^thSlC?g^bsQ;Eq ?Ą;1ebfB˂R}YfS2զo>rdESqo7ϛ.M7&|WO%=[DZ$.Vt+qc=NYq:tESiv7䊫@Le2R勶w0c#uRFNeDᅌ dzOVmo4'_K#Y/S`;F| k *nǪaged B.ҽ_llt\JbcуT6FJ2;'>' D ,)`&1ǜ ZwBtNU`KaYئ-@IC֓nv8YľH;QEW $4diݡ \u(~"7c|=Q|])O8ll@(0,,Kuŋ>f#6ߐv(IۻB)فC^)iX~zUE6z|X_9&&4{˂*޳\U! EgmPFs~erK|֎jT]e5qS(PT"&b^yi +aM?^{f˳4YQ>)0Z+x$X % \LsDD-QO _8 X, z` Dž (R2 }}`a3J-18`-&c*2cjٖ+AhۨM+"Y,Oc31!Vs Gb@!n7yh\;ׁi^8.0?FICǢAss(6#`iƺ"`xQI=zLXIf^B2="]FKg2R$71Rst?c<(X(L2dD:ӔRyv/"&L1=y93E~I%SDZfm;pAGI^[Y,=V8J9JE;L *(ѷ yR, A!_8X40z|e[ٷCn!C&JLsV E; $S ֙¬= 7Z.6~8RupIña5w 8nJ>8+*.7 Eݥq9AdxN]j!^!uC a-gv7OhE?%j s.tVOӡCKwjVM:m$ f4*\?C?.@,0yNXvS?Y>ri78SuU$ ~Sx"*4ro_vf ClhW^\ڧAe#+ ɣ|G(qlZ?Į Xo;aQ?Cb;YzEk % D ςxxp&kGZ [I5VkS}=;/(q5D~ s'ju`ͨLL8~ Z @^UXplV%ޞb -&'3^ ߂rr H!Mj3YlT?B>6,2*;ѮX.Tq) d\w+jAJBv(KɩGn'zK)KHM L(l/2eYڅo}5ZGЉna\[`ls:5wȀKc5:ҁOH+$TC2V ٺ5П|cXn3<9o5L}mwyh*zsIx(?fJQP:RR=FFqpĥ7jVھYRb)ɐ g81 J0ʁF1LƧizk+[W Q_dD۱%+DZ(Se'~75M|AVM)t< &mC{\2QhDnTzQ#-Qjᘷ{>DK.{q?M¿}܏{FC]H2y ڝTe58 \*alBTiLR]x'!-Fib^%>FUV{ -c^VFr#$Fuy):cq$!*<2}k7KҠdTUJ:ߢᇡ$[Hgбk?g'ߓEm1_b\soͅk݇#7Bp5(orG.?9<8: >i k1 IiՍ7BВSZGLl}؆+F/S |(YZtK3!n\I$-%5|[Ǧ|}{u'hFh|sQU)j<::f+HO_Q 09^lA 48إc3axCF1' ~m' #|dwK!Mrpp~|".ڛ2-(AyYbßgGskGQf2)c闤< R))CA [}23aHjSx>&#VV$_Kg,[T!a;GF>=:쁲ndJgr~`-1㖖RCZrhPoc~oYiyaiAxivqiy ʆlL=}@5:`:jݫg1ud韷 _1Mu 4 74Zۊl%Ƅ޽QEj\:Y"jO 9G}OPʸթ|Z'- .IHg = L,*t? ~X2̫'WGY36"I{1hW2[tdl ݎw ;qAe3V|0b"H?&[!Zw]DtG3嵊l7sh@$}[V'B[~3\ D mPF=NfΙY'[B3ۀ.r}nsg%Nڑ!1lΟ#pɢ\2wմ 2c,ҋ-qp BFmZO^"a&‹k͉~&w̽,xk~v)5d8Zϲ-YEYJdw(QT7pu:8@D8uבHU6.qB^J0Xխ44dV1ğ)1 fihfKE5wXʵCh\%T,BeeVUGBrV cc7MR@3pf%%UE=_hh3:uKj;/pW28P y茭*v54NT I9l2 K_V#!LRBkˣj-jtW+Qz[εbڸɔ0^~LV/#HH5"ih0Sa!QX"ՇEAnB9 9nL#q~>wEC#+䭜L$S jLW fCBE9XԝD2M90XhN;7 5ʼ0'8L"\Cz%%w 9q$Y,Vxj p<~0ځJ fnML 6x7 $7;Kgje^D=mVވB""}DuXv0Pr/!qyn5ȵ!.k!&H6]k Gܰ)3-PDDyiEmӤm"4}|/ܟ3JtJ \a^jSh|$uRMwA~e5H(տUf0a۱o {>.zOo,o)!x/<\ٺݫL|zջRZ| %dViNЀ=%kKs4O 4 P!'H*Q*Cʆ1TFp!@C32f6_J.'Z^m*W*s%@4WHgOy{nn\G%Ucd;ەXkӖwIv"|A 4FY7iGp=Y6-i;::\J[HV@|7Db24i<0˻i|(=vG4y|3CO/q]dw~XCw EPWHD%t.,-jH-@>O~;(ß ۄ+p`TwѬAt`p rItCj0LiV@KۙIj8G>d4Zs 4wyoݥR &ִA!OZhb6;BP5s a.*CaYѲ1\3~zG7\8]lTzd>͜rB rкUU:iΟaZHIx+Y$jFmX`_-kX(ײ1}O{r42TpgS-Ȉۿ\/l PF >Z/5tmT5AR>Sj<5qt\ c@@sG $]#W"Uc[c,0N/ōm~*kZH[!(&3_'^=5w<`r!l z5YƲݜ7fu/(`JbD쏂Q-8Ɗn}vZI^" `-0*|MW-yn`3J"dڤ\9{)wTlXб*43e[.B 91?oT5$QUn&=&)$d݂otZvgYxY g>:` ) emV^Ѷ otk?)|iC$ 7!lD^R[UnN9bزsDi:XZ\Mp mg {<_?Pܕ\b (Uq|w5H;"5ћ٩+b7 "JlO}99蠃7L7.[f˘+ x"'\y4#CPy$h|3LSټ<{A MR-aS!'豎TJl*lگ괺&؁L0A;[TEyPwjLqlzzZca/A_;zA[R7RfP =Xa!3?(Ja[Tf^5~ÞNCeһ_~>z =N&sg 7Tg@ ݭ (#8KKJX/!u3?"v-Sd=lSXh"z(a)A`yRX 3Tn5o>F$ b7 cns%K}܊ԁ4ٽݑ8,߇ZE֧Y1E%t!peÁa|V[G״h끞U\MSUpC<;R;Eݻfg@r2Vhx2W'm֥wϴf0Mkٛ=ӁbH[PZ4kr8Pʛ94xM{z:ܩE&A[?Tnu*iiu!ZK'r{ڔ?%h%%V@Q(=ɧ2mp /0稯C= Գ,EPOM2%upUTY %PF^u\wb" Xeʅ%\ȸmz{dy t|ufil(>9 _q8z< lR\N}̞.)fb'C5"ڵ.Û[Sivpcwm;=֚/kC ޛqPܯB;)ٗ-' ϕm~>9bJ ~*x)l'd4P+el'p#dΘ%}.KayOSd'}V)V9H4`dQRFe*WL&aiUL- &JYyrR)J4]s[fu|xr qLoҵ hM[X 38l:rc/ OɑH g5KohPYc-T@\V}AlWjivs]|^@N8qE\]S{6Wn6HR*+ơψchcY9S1jKˌKC:N5^cb +V}͇풸Ѿ{ a='v5a6(C#bԸWOTл`:缜^HJ%c2a]nwA ZkwQ_sjʑy4WB uB/72}`Q܌!lxkiqz8(ۏ~JY,Tu RhWQ 6Avh;nv#_8`hU@~ r{ S1劶N[YhStW5&'ikapG]w͵S2Ӹkߐ&B 0;}@Tv!HB$I4'5oX1~Ek3T##UPWY0}ZgC?P)7dϥ [b6._y?wJʃ?Q:)IuGM6]@XT)+w 3eHIfǴ.㢘0KGD'xOΰo̠f<1fЏOOXmfYK0x%^tp:V%f6 ;u0lJTZO)0~-.r.;'YH*O_kD.?q1cE1@ѭh&l%NqcaN@7~GVa.'sזrh`n`3߂OPrS0 0L]?Lj*vҗ N;+dwJȥ~OLyڳVɭ(B  7/)g̾@eSg*#hg -vB"iY\1ʻJLBAIjP9crlR}!US.*^')~$YA/t |_3!^"2BDMmMMtuLd2n(?N3=ItCr*\2@F*h ]-A5kr{*dUÑ.{AaخK 0F %5$PC3Ju5A[QkpqZcϛ6 TK64BHBA0xgdB0Tq#M3,qik$>}#\dQtmw*೷$8|Gl(HNj֡ :lufU ~YesK=c}KI΄~TLq#yrǛJ 檵Kɛz>Hy6!ib)uRi}0|D-}6/4;&52L@=s` RvhLan!]Rhw꣭/1cYE< be4ĥ1|Kd.RxXRQmDJV1we%g)-iRoMe㽘aF.pm}UpCxWG)R4vZ-WV|?9L(3ӭuE'"P,q5ɧWE AQ\t]Ri3(|k8֟FI,m{C*X6ԃv4 ferHyUmEqz B CQ%VYZu? {$|'2ޯ,fntJoxsgB4u:2HB䇃iٴmD|1L1RRm G6ƜxAw'e Cp%J5%QhBV5 a#(E=iPҹp I/ "=aNz7@]9iA:Cw@1oFMgfҀ_saemGFW<Υ5j+@c5/N\%y1qm$K?z]OEH( L~L~(=o·}t7uK^lW y!ZSGC[0'2dBi[=dZ@+++1mw-Ls)[ͨ}oSDЂϵ͜W Xz#.D~1Xt1T9\N}X T4>pegnpP0xfhh8{ gDeML%ݜ츣ɩSUM aMg}R3"7yrї9Xބa& `ac\yldOiǓsͽ R},k'>367Vb 8clXJ|hM7n35ԍ^stq'a( 8*!s|^Ÿce8! TcIXR(h^i29+9+T>:qP "hMΘkEt˫aL -wLFܚMrrd/b#CYLu]w f‘[Cdu+dlb=wdIY+7InzHPc*Xx\R*34XsC.H' TTٱvEQV %]2fu@ ٤㧝lcWcYEЎ: Wsc`s3rt.]ū&(--.wGq4)_E4^| Jl0A ]g\֤D=:с,}@6:^|v`9(ѡ1䪸z W1P]/E žO{%$_v^(_0~^~{H-S><ٗj> RʵVVcyQGQVY8b LS*rr2:h0]tvUqTY@n12>!}9HzQPeuxB{>3-Ώ1x>]Ymc0L<Ē ZpN;u)F_ ʹNP4DDSps!6c/,j7[0Uɟg7TS1r)DT!#5%pdPGO(/ՍH!濺0u#kC 76jeSŴ6aӫjMz@I^Q5QS녓ӾGA(e.В-uy*ž]lM^[@Csh+oA^,1|J]/v\Tt¤@\2 Gɷ`=+MLӈ 7#7_xgwyGL**Y$yF1E9FM4R"Ң/Láܱ{ngVb: }9ccfv-> w ;.`]KEguRՆj: !(: PE"@ubj+nGe1{7Wwv$,17:;S˖Wy6H؆ $t9xvbfПu*Z%&ܚ4#I L bH|6nfpVxlmʒcR(F4Si)we! Q0-.>\,Q#?܀W?j ]9 nq\`tgc' Rǰ{"#RHЫ*DpBjn|~IA $mmt}|(^9ϥ- H=yuR{=8LL@s&h _wZqCǽ7yi1;ð)* | wPSN#WSek[iXhMWqˍo! YUmȘA:փtℐcɣq+ Qubu&V>cD:7|ӳz r9s%Uqwj鱿/n'((Gu7 -[NP"t) & գN|SБϷ际[g_W 8 }-&ϕGi yv-N+}4SrO[PdtATׇf~0tmL!G5]vCbU*vTDvnJH^,R`q.Ioe퀤OMS\Z7yY%}Y:$Ur-9sEc#/;)ΒyqI4q_ju\nK  [x U<HcDQ1)5,RQm{<%A2(G 'bb>.fĐ)hf-bЃ5N-$Ρ>GЯc v-[6|.97 %ZVmvt {2l%j~? iNQ]xh 'B )Y1全*শ Z~f Jw_#H#O˘N@"HJ4I8q׫v,hѰ h)8ؑ Mblyzg`Įdr;yY:IvqLo)K>>bv:- ۭy8S߳7O_ iX#X]>+7rGL`PxII+KSD<$n:7aQg ,+i#TPZ%<|`P$6S}^+@j.]F}yrDH/_FBő  >fQSP=m '.Eh[i*9Tq}IԜIg (G+Kk`䋱-UejK E<haaMi%𣮲O(<i؞_$GKujB'1Jm:B*A}j ]F]3@ !3Oro+J0ivQNf)ZM@@KT1@{ oI; Mʄ5yCz^@w9&yaAF!I,K&hGFB|N/z(Z whߣd*/iAıe2PBU;j4BAgvS!*iSH2l$,QGpfʻSAgw}KUxЕCxKY\W9\ B2<{ǒ\sPЏM hh|Rd?R0}c]Ilo_TPk>aWj? N;" XkK"L*Nh~[$DTH&GSIO55]oYth)]E@d1-a(KWok:+ұpCA$ۣT<Q-C~./1~ca!!gݜyv.UбQ^ 1ZU1.QN)#B=P&p٢=zQRF>1i^_5dpM BOGL{g Grn7τ5젬DN 6״؞P!tㆌ.ul!(PeSyŧ\bzV2\s5D!dYխqOjaWaKw- ·ꞡo+eB).iۡYW9g &9;hnˌ5" H].ԆHcge21K MixT2$=8iT݉N.W}a0aIgOrӛ{yy+8сJ3tzmE'a9ZA$$UÎLY4YU"&R{.[V Kt-`X .C;:(<8e"1peP6մQ: !E\'ge3t.[RS# #!*sJWr#:|C)|C$cO%K;Zm-Ic pm\Uhr)lsbcjQwn P?  ̃9- > olM0= Sɋs.A*(y;.#+/ɁH1$z̕= ~_AUkV$&@ӣn;z?4jjy>]R =}R?[Ӏ֦1]FɺLQ U!{ڞ \lޖv4Q W*g"OnƖ<._`Y pEY=$jQ q!:2k_Ti':툧nI0CvYpZ~.ɤWӅ:~e#\Qɓ Zb N;V:O;\HL"N5}ݏH75lˮ\rlDt8nG|`PFa)p^S[ BEGd%3_JѼ}"t)~CӃvx{e >ŒشnCnhɆf:&ư:e0r7JlkFDEcO\<;(R_pZ**@< [ΑIxyج/&]XRSU©gk 9y=e < :t'Uܠ~5́+LPj6(岸W\w]=bg8gd Z3G~5+*-lʌB~EeUo,ȡ 86Կ:e"TpP%% dy-~x2bdB7Ţ+<#Cyn_|Ȟ$nq$i +/.4^ˊKs ӳDK!n\=ʠS]6!bԷ,R3#pgAY,A'&R=먏IlӭxS/"pi1_[|rδ"vwo ǁJI05ޫ8Y!v>Z'7rK"6Mt2o.$cGXi9v,' ,ftSgn lf13f4W4O ua 2o$ \0lm':>ƯcȃW/_B^=X*ȟS PN;EQa4Y=Y@) Z# FZMe] 370|b wEE["QA? Bq{QJ%Y1eSc#x-mrhsyU^y|d:e"Bw3[ ,Դ8S8FD\ֻSWD8?Hty{IX|QAF'7#x E/YzwB#qH N8{۵ Qd^Ð|++/וd,aHӡPGޫ!a5 _'DLrwM;NW7~9[QPiiPBG`xE!#hjru]Cҍ];qhssz'+(xP&0d x_I?^Np*f9о2b l9 KCSG[gg}I¢^ 8M07dqbigًicJv"WEPhWxpu{Iڳ|b mf/ឈ.cQ5f< ϚWd8BKܺ{As5]Cr@VI֝IZBn[1:UW߹Ka޸^/G$!z6c /%o63^<2eS5n kio`w~@ȌLA-2ƔI;P_*敆'Dff3t=ţuG _@hoۇ>5g溤nE9_qQ@9YFjy$-x)͠ns,{?_0x]=^^I`;o]c0sV=Ks y:zq7R>$Z(qZ~oֶ{̏PX|'D/"սw=gɒs9#QTLt@c<7aX&qJo֦dpӊ2 Eq`, a%mF,舓@ ^{k8*eWݦ̖`1%0-`BxCtG6"ޱ_mrLdDIәՍ|\p0VfE+m=_GUW2H];_`uwZ:qoGkg +gp~B]2x"6!u`!z{z+\@պGA/KG)| ̐:(l ~8 59>D~TIޫ'00?V3 [ n23!9>X}5q?tJɅD|gȒfඣQPQjJ1{/Vc.t0f%D`XC`Ndm75O1O?>I^yZ%l`ӥtܝxS&[*g"䰑%э6gV :.qaHe5{ 8 zϜD?CNPBWEtv/h ДDC'hb5 N$(%!:e uvm0Iw5F!D%Ƚ)b$YG7kZq#'jPh+4QRﻈP-xn!hmY Cps̍2@AW~S,\ȱj̑v!F)N.FekxF21\"2`eDhx >bR􍞐_Qu_#%e"2*~I7*Neu:|6J=V\feHl)ƕe$M0 AnmTIn^.W͹#yӈ_Ҫ>2'3Jٶj.DwÒ] O| y=oH5Ø!%, +dqHQN _8;6%K5 O$Rt fstV[H%Ozm5-nAy _0knq Yhsrng2_gR7ʻ@~œrWJeoZ,OT' El>{ qƻ(!n~Y?y!CUTlDuR(5!xjdsh+xR8C;K;RGc`hj`HIu9\0̌ՙO5A=J+KCen0t-{R,:=zy 8,Ąӏӫch k<}>2N=wl#1FG͍j=k .kœ.w{)AWfq{)|z.pHQdI,hOG.k_ׄvNАD;cnln؋(@}KhQ`ڎ|:C`pX!e{ǭ? j1AN}q4?/$EE_bk^E鈴s1hʈ,3SR)xϳpCIudׄrph m9'h#,pqTh85g FNzV~j~ҜTw5e![ABbeG"Sgl8 agZv;?%/)uX=uT;:Q(LCK޵n5\)hc, %| YW[uG@]b9LY%Iߘ'{z[mJ EOJ–a+om$6\&\F,^U f9CQ?xIz=d˽jy!Ŭ&ȁw>@_ܷ*m{ oJ~ B' eIR.,'X5-l|n;W ɨ 2힕֘C5))4H㘦d!˧f|FC/PͲ^+7 3B6w28wDd{Ԁ`%I1C`4^E_E^`*RsxQ|“ 'p= 'VʔYK99?Y%ֹi%XR/~#IND+>UZt8 ZcF%ЂUrףA+4g'{UԦuJpQWq^D7AC)V}|e^75wkxlYQ&>\F僫Ps "N$&IP/ݐ?S>;]+)BP@0u1}aW{CQr'P:P*<Ӈw+ͤ\Yb<%xuu <@HB3G몳Q -VRs.r y&\!] :属HRW-Un;6˼"09{}Dg[7.Pn4g@E2x#L[+9Cf!F%u]D*`n{F uj6$QkZ72{ ]b+ebnyֱ2!-,w#4VvHt7(l<+qj <+: &1$}qmƿ؁I>(bUo!C7 Dֳ=.1,KZn׷b : ܏2$ݟ'H7@߽C'P}+qYk!jDDM48j,=YݻkZY$uo&kV*:o`h)/>Vm8geg)c~s "dSQ8s5¦GIյ9xM[#+ᖄ4}lM94Z O+:oU)eRRy!"43" =ӄlzzi(6錩lwkb_aVE[F#냱Ŝ52}00<e[s'%vm(&e0XIHEQ$EhA,a_ 152^"JsۍѣT(jx~c"xȒ|'N>_1P?Jb݈j*#c,BG~:*AnGI/yq;I!y[]VOQ/ܾ T.!ns5ʴ˥GW06d`}(glA6p[ ߘ/]* *w{ ]&QE\Ovg8c,yՁuw^[:P/o|U>2'FOF9 p_[!A_K;V$ūFv(pWg[,,>|JuhXpܩڈNjH_4n\q\2d1ee 9q2 7 -SNkc8 asN;#G'9xES)vlA4-tk-NzñDv8l~VɩB4ە/Qiz MAm˼Yq7=uxփ)'AZk8 ٭x񆜱0W6_{Sehn=bsI_|3gZ}Nw8ߠ;ؐorXW"X 39a/>6I[U4.tZ q8 =:$s9a~/d 7 禹׃ep |#kH:5JZ3,(11QyI:<AK~ŦJ{<]XGnR%be2 g<}LX:* xEO"=ڷ8z1 ħ^IM ǟ/H]mOţ?my xn_TCѤTCb^}..:F(Ѓyp=`t|n50NXT.N r/޹rf\uķl_s,\`H8.a&N_e=}6cn] ^,gQN8II2>?kgwsd D܋!?2]pP$Ȋj! 8\68d<Ə .:";y$:!T'- mI9qz|Ke>%4kJU(2OQkX\BBb55†^Gw׬خs>kϤ6Zn{Ŧ*LXCg8θ w<#E4YlOKV!5zT(›-e|2ޘYI쭥/[`&u/Pi'_I cˌըPʁ} 6 "}kzxas+`J\xh7~ ]NzYE.dlʻE VrtٺSAr/rqnu>,%xLȶevJ%\Qdυatk!| >TL(stAB>6_WB*ѡCN% Utr]QO$m(9VIfQY5lcHR{Zkq[UiV+Y" cU&O+(=qQwb} n*ADb@(ڔEIvg\gZQR) QLOhFpDP1{dԸ]5gwm"Z!J0[xެ Ja[ٵ,x(#%53/\e5(E+tD$r(\'~FmŖ¼W2^w ,Pl@"JmC\JsثU<]Flk]<"gy4s"i) tyYR*LHi$pa,7*R˙hV&O巚U2%WCeV8ڼV1ijhv޻a@pR5=o@`Q35Uh:*nEՅ2Ƌ9go#^@9%L[NK.cOk ~ﴘc&:_7VW_#A.^@"F(cX 0坽8sC:7Eԇj^<#O׹҃2/4uLP(K* }]Q J5aճwի}b-dR,C(*!*MǴE7hMF)Q'ms9zyM+;̫qIW)#S#(5)5(?Gcā M䙙=2gv% 8*|lWL8B~D4h _w"|~KBY< HG}H{@\!@<=%.6̤-ڬ0֗t '_qFUUҺk4;,ѶaFU1?y19iORVJS*#KgRo |\6}pNTv@J!)nO=i߅dWŬ:dS TݠA1vl#+붪P\ZU%B'LCC $39ݒsz&\?+H]*id];'/]0w8~M9;FTk#)yu ;C|(}:E5ꄛ/#ǹz뵃30>Yr A#rwȸ9#rBp_ қ'q L3$Q~sa5ӠoUtD9w[d` &jبνd=}6FFP[)nӏ {ץ-MvArDrf Zű=g;&%)WIQOD"R| e+G'~ ;B/" VxuFsL4A)Ō"$`]zVەu`ʙrr-32BL!FpI%'{v!h0 B3pj~;]VsagIR ÈkyFEE{0WvwZO0V\tJwZS PWPy7Ģ 8Q;S!|(<*&5=p[l-?UX9DlY,"V1ܫU5yT 0f+F.v#L%j~ʢz`HwMн6zdA<hR9j# `2"{Ny10U9}siPv q4 tC$}ej֠cS &uEdF|wp83|W$ Ϊ)bf/BQݩOv^""r'µk=&GL} OxAwdR~B6,R=O̾y 5ǘ>!p/u4x =MBhCʒh X|Q+T_D_\ T+HHLt~B.]|:S XY M9.S[Oy̎w;,xU!2epc\܋`Ӎk"ݗC(T 6'Rx7tj{:|mS$c1O۟gE1I ]GtR(}As6Ԝ"8n'wmzc (ϦnT"lv9k&\ lsȔ_Tł+= (s:W)YҨEJ#)KUF-H6[.sιWO UrYºl{bӊu)uPB8.FOLQ2WMa$㷉i=;*Da͈Myi /+g[0c 7כ!{%n(vYq~Nj1Ï|=;nS(Mz1IXyB}cFgh@4"Lw0ͰZrY H$ZknBz/hwMnhɒH-ζwVd[@SH!/jmV'` I3iEc\n)M mӸD.(PoJ ++GpkUo8I5"fO+\.̛~?12{Z2^sV| 78)ȝ ?pWp_tA􇺾i@c>gdfڿU!h1ݾ׆uDQ_/Q j+ 8*'6"+SZ/xQIyc b0(h EԅC{/MC>зwn"EPH^JOH =]=aVӦ'$왪CD/dٍY_tuފ;kLco*k8w~(~ZQE"\lZe؃+I]ת7S]m#DVC^3qG4zT-ʅUqE$"nz!6*UF=^- ͷ] n`DŝAi>~h|#gB2D9 .9suNzhNhq3tKʾI+`p ׳͏yP*r.s}+5 _z"9a4*6 ?*i\_~p]fJ5bc˶m F8r[NxSgN83«Z@cC:\4ko5?vI2v/C.d}A(a-ӂu(Y:Aתœc:`)ߙ ٴNSv$ǀʂ2dY͈vl!CTd% ʐRB* ςzFIAlK""hW o {kEJGFl O}Ծ|.Ds71zNsF򣌓 .f]"dsB83q+gQ%˽&\ SPṋH\3Nv:1aua=U}83[<wBҶ6u8DĠ:w60=]KC .uAг+J4r)%B۞J@&KNБ{VRSb_o3fGHRG0Yk @ƹ9 suSe u5q'3T\+u_whhU`a۪ w(JnqmlcĎ|l+4iT{}KL0pRzz2l}qcMk)ȦgRH+8.hڥn sg>ZQIv6.dA~v>7 퇰Q1ghǺtz( BE=k/tMdZM&7Z&!xBox-:GobQ 2$H0PNg Z"}f%hp<Ĭ1Z,@(.v!̮12}0on[(i+#5O%ggGDJP!U]0aL} Y"M3e;-p$udҔGOe;L"ӆ!\( z|*~DTd< %qol/Ň$Ge)qh`>%-c,S޻!o9sη)= |vҥx@0-rj,͸ΊRU K6վp#Zhm|'?'Uis%8t+7`H TuwL&sJv]S޸ΈORnqR9GݯFh_SZ3Y/C^7Ԙ D ,ni 3$zw NRB^fS]c mDgY,FYEB|*\z|ѿs,^w'Nn+#0P @c@pOLu;2@gp$_btHj+=fRBjÀw{3|I|_lg]d\_^IKq<;ds=`OYt$ :%.&&f\5{*io^4&Ǿ.l[Ep xptP ȅ%f>5ՈU-(^jU .erh$+{iyD[$NR 㐍Sٵq)Y (5i m S@*G40B6#yBCZev>܂ɧd\^R;W;}bhVl{+pUCE#:ulͯk]6}k^=FW_`K1^zHU`Qcg$ա7g[:a~NI7h;S$Îe kP-<t8''# `rd6[x'L:# oBa[B`$"/^5Cl #` EuAmp]6Ɂ)#o5n-08 !vĊpѺhN=˫ j+"v@§?OMܠTiXE?Ŏp_y8h _sbT=1caLI&ыbt*:!ʠYE4ptM] Sy 9g9{3[ UAxM3%=ם$}'Xf6?Ju<=]e'KB'L*!v&{lv'<ܽPn wPqZ594KKKzl7p],9SeĐC :GC(xΕI*@ N?|XEFy5'49JAHM4 U)*o, ӥ 'Hb(.~Y7*NpW=t:Zo(-`pk Or1êͯ#LE,IxvJYE󛟥\>JCJ(y{rQAbѤ a]*} P #1oAsf?g.^}WLs42I W[^Z%~VB,P2@f\ȫ*PmǴwC8\X$dxDS\ϩ>|[y.xiזAҲLApu2JEm|wj8&kUyƁj/Y@6r &e\Ś:֒NK rY=5/J.Qp Texu]/uJ1й2348!g:Tܠɺ,. .g)[XA eD{`Z"κa3!ӡ?ی$D0S^C3%a)eb7u >^3Ɇ6TfꛁPL]Eqg_y-!Gt58T  LyQ2m2kaEuY L6y)f |_8`mBθe-Մ\|Tʩ| ꫇\>p~LY;u-2tn4*[>?Ԧa/g!]G6+O}^*I`EArJ Ù`;,ɢTG-žVDӋG Q}QF(s{";9 ͕S }+Vt]Cڵ (/J rDLF,;ӵ| !02sDox@p۲?yuVtLi7NF[\̇;p%"g#ƛ:ojK\6f'=kXs(g2o| RF~= R͸~%`:UIk;)ث%&eNBGRZ-̨9:8\-Һ6D{d~I@/FIIIϔE< ѱ羝Kd=V _ ,aS#pB/"s2+ϼ+373sn, ,=dQj93 R4;M@2f%<> +b<<ʻˣm=xivOWQjS.{(skQhD%*;\๟KdG&.q+nH(ѵҸͲ`\ұgl}ji0!VI6С΍dw !9x~$D!gE*dZzK!je D71`vȹǔʢَ緽/DCT YTn[ݿ֔h9U5l/fEtR[*?5;v 4.0a@ԧV,kxv:=:4˾, s8 {'в<~! x('̠Q>4C30[H3{h/pG5쥅"?xeM{h$"9<rw>vWg`ۡ BY5fȝs$$6"9'i<:S\0GѲSu|j@S蝀!ZVvs}e )* I+|?I^ƑEyv\I%^6ym%?A?3Dʠy2|+?hI'h5f1Gpm7#{F5JAW|=J C z2`+'P^ n\utӿʎ2v|H=lcCtɮr%cQ(t8C ۫}L3)YY v4OOtԘwVvGc/, b}#w{Eűg2h8& U>ܧ^8j"-b?Q7;YxS[E:6)KelQd)e^|7 ^y01%/DW :wk,t߇ӂlpaƑmxP4Yrr}-jĴFI_$W ]Riv׵Yo\: qU*p t7D+8)<^ (y3.h7gz@~PS `Q'V $QNld'JHlu.kx 1`si<$ZMܠ35ϔۄ|`@*~ 0MTpF [}YA)}@-7{ːu0<5\FS}"׊짋Z*G\%"}〯J**罝_#,V4U/p뫊xdXl4'7=Gy wQmn?Cv$w>(10E<3|t)dÀp"7SYSO(t|c's)3x%Xܘ[ͼ*`\YAdp»s}1݋qА]AK4*L?0)c3^6''@p8MLY3(uG1}?cM؞} 8-'XTN瞄 uz] 2]rlFʠ(2 /wGF1;!S=z0dm![!OԣO-e9.nf_pj0SǨQeZHohg|mA5ȫr`It>8z9L?ׁcjdu z*5FPFᛲ*~nB`Ng+;JG<$ka5̪[m1 SvXf(yjmjlVZ/f.26| ;Tf(2_hYªJykE'g(|6zA H`Vk'}ͰGC&)8e:(_s_{{? `GlҢj~Fb|Ϣ ,M` UD H.h7Wq{=ե ͣh:s u&n0JD3w 5;I{Rdğ\ $r=Bধi|MPܺ#^!{糕N$K3Kڠp^U%S E A+Rs"ԔՍ9rk[`e8اPk鑼SBc;ve9 꽓[A~L_)'zhP[, qgm+]:DC1O $c7\jS]7&KmΠyVZOoEZ|Q_`5B y$)1kt5ꑀ]q A"BR^ۿ/&|FJ/ X,iYu,KNhߢgJ!nq g L:7jzx:G5oL>>skM:6!7蕷:t_!ãG{GuRP̊HO@sO)b]M 1N$FGMa"j)m7h}SYGε7U ޤVֳhd2PЬndP 2]@`qų838 NfGJ'idqY᤹Ck~ sU ,^# J tTCwÚ/G @ BfStY$1T&on4]*'M"x졃Cr\'i &iR @hf`jә)S N jppxT=&\y)nE2+QמA׍32 {aXiޜj5 .qI8O(YcXb|t{(=wb c2C,$y dbgKazBo$vbg XH@E ?8 S+8_Ԝ}}mQS[J*Zލ+ [/ ,= w꿕*0l&Fo }J'T޵JdpڃIJK?l[{b]6)ı#LmdcD|Fԧ0A;O@A=N4~oʗ`dT[4!P @NeYCc nၤ[ioluTW1 6]*i k6`OXvZ,%ËFU;o6 M8)._;z<챆wL2untN()h>^N8oEB<2<F5(`a%я rlKt*V_<~ͳdKV+o> d*9\Y,\:fHmg)p"sxEUx*#>dW\Aq_xUZP|d"CK p6*VzP]77d烱m/{Zw8P4&Yֲ)G Aa@ ݯOw)$."!վ`7[Z@B,++=c_ s[jAU%n^y0d=UiAHɮR<0i 6: CM=IOqqט5jCV4(f 0"nI,#ڳm>b3] hk"1QD I(~kKSXwhvxs(h0H"D:fyƫ+Lnn#-O;UQ:vO/2zdQ^2LQ`T0g eeaͧ F-H Y|ϧ|p!Pݙglf}>/`+֘cApQ:ҊCrX._ yoNv{E!g0ں$+?uCCYgs䕁.) ~/"P0Uѿ><ʱ[\doӋꏗq!)p $^m0]`[9Z-yrvR~%IϤxwjrr"ډɨL;d_ ᬄKW ŠG'jB 1M X'YB l|c ["nEІE"oba!?y͘`P1e4iM>lDdz=:/<`YDv0l/u# l7zD=;ҧcdPp7'anA*ϾU[?0w ŅPIj4@$Y-%#%dun 塤(xÝį{;^ OAb~Z̼|ܕy#R~TUfi\6@r$(1pآ fs no^D2k7Zb)`zXLuD9 Z$K 4L"`sK+,-"(Ts?P%3K‡#^gz)LlEO;c }8/WM҂$<b_m>識 C̹lZؑ3ܧBUFbٚ>AdLj qhƋ?XQ\~ϱmӹn@N":ϸdrl7V^=]' pXy6{aQ|8!=OIIqU,Nca3wuQi*7'w9ȟ72߶BPsOfi ݄ *Te+K)CmGVn8WgwsO!x& i(YSJq5r$P.=r<l䋠TzNe]hLC|B@OnZ+\2HQPb|1tΊ86Ch5RlV;j,~Gb^v)Ȅxjk#U5v%^r VGX2%d Vp,c ]OE}șEHl٦ hJ?pq%|T5B\?j{j@ >~_n&eۢkU46 ӤAZxѬxV,^NRj#L3Id]nJ(`A2刮 0];7kV0ьgmsN=)ijCMjv'7|-NbA= YED)pxl&5 #-T15< *nM@c>gطeb3MH,|ҤI*]D;5PB2)spLzIhVGZTM({MbJw~zw$'*O3U4x&'SwB=OHII"da1Ds $)a ExGA* V_nE>P/S/gԤSJ>Pw&m/&>-Q@uTؔi4s6K *އꝔCě8c?9iXd Prb6jfq~5=IVƴ#tnJxX8#)7L2,1\n].*Q707L"4hN<2?ALNũjGa_꩞lҢl`9&0tqPRmr C[OS}QyF@lEi~@NfYW9C_W,_~w!liB{ʊ>vzz;rѬj=-nlӄ]ip/F_X/8ޓ{rJқ=È'zDB!>!.,{\G%NTнX;yTUճMrKZ1tY3}p"9a ʖCvb>oE?*#e)܃;ԘgD ΋ +h57_&{8:*  ;&%H4t ^MڔC n/m0ZiEVM^8W!3;~x?8zm}.JI 9C rhPiX_V\*>Bfm4,L#M&Z?_+='6M4my3/ Z7sy=q9V~:w(S dN1Jyv#]c|Siqc"ʤ dgHp"KNpaQ+pJ`p+.Dgq/A A| df&?;,D4RT|O@C%wKNPd7 HJBoyҢ25HPuTq<7}OK@ TZޔryTl{ne#p-xX%x-c|2O0lΜ2`B0@wWli~k,mBٸ3"d:JrS^ˀRm[]ѻXaUcaLa-T!{9qėa|E/%{Y _#i4L[-IS9qȗ{kׯ)L(?}<*w9ĬPL KJahGWJ 5;x^QىA">ZK'c S׃ngs}nZV6PmLƽlUzJSRa C1J.6Af'H jX }Br<緃8MR> Pɚ^]6(.'JC:DЧy1c<jQT[~=5ު\Hr4cC4U Vh hVGhTy7cq-RMg=%|jr/Sl7.0To Uc'ZS 0:F|ͲFy(`P||^PS4mJ˿7=-cjs_~2 PbOǥzbRi~]wu׉u!ui.wh]Sևs6p#P|`x>0R&_?Q#k$  zS3YS%iMqbyFL}˱Y8O1^}TZ hCM$cg~Z&f 2vChdo{!M/Oi1筙٩HބD rFL ? $u JSbS־x'Kr B̭kF"lp^HjpV@⑙/u!%G.j?A(՗ITVt8"ZSd]yOe'̋ڤQ*䎆qz(YA2vfLҚ"ٍ_<: h?B?*3U؈vd ɧn;7Eg T"+PV KGOPyJdz--]G{;{l![Ur_˻A7y%B>S|y@~劺F|' Vc`#TY $ Y;phXL I(PF DxҢK`㢘:;UKǺ֯DvcfR2+̽Pd '-}/htIƹH,}gƜ ŕĹBdOۛZQ9q UƩw^+[S3]gVȀU`N1m8"+,ZNkԶONksxtף)i[|6~GNT6V%m-y/IfA>ЀM+ ob*si\+E o>#܋ &Ju7ՍP\BJX?X@ \ (3VF)fvHR. J}>컗W ?ڢǝ6^ܮ.(=*p?b?t/Y&I\*=D`صB J;ܦi$'Vvr>>dͅZ5B(~ K'<1F6 ԝRP˥ME|t7`[ct(p KOdO]V+$&hpէv /I_ǹwo9O }Q$ioz9fxK+mU -=cb؄Cc*AJsE1|Wl%Pc hjK #\EjF墚&nO~M=nƜ189~Haܞ_A&)j/VV쁟>)`3VaÂ뜅 A ( ]/ﵴpdM\h=? ^oU3Tfǘr.KT"whq32ʀTn+z${V?tN#RXNr"VafB'҅%bcSBM7iC~EPMT=tݘ}yM1T䷢.;⦨nj7s,`o5 h/wqzZv2?u-})50YU?91u?.Z&GnofOqL%]2 P\ tft}/s~~UznR,%»ΰVT>od]ܛKw̋c6S,8%KjĶހ=:jG[&Oi{1 ćQ6 &sFEϳY aF80R.0N@1J%j$kAI稿\Q[Z꼚M+ ?э6gF|)_~n>`'i^U 6nVhtah[oX$_C0d;E?T;~ήkw $OPڜL|MƉ?Y@Frh fFc_J TTO bE k61G"hlM:_|W8[ktMij,ztbX 0-zѝ ) X>\Wd"&{G.j P 9;M0QQꍾ̈́c8kiR  {].fC#LS,o? @D :,) 7*ش0E!?}d]3}Y*ilPpHBDXw sܑ"ӅזTYU D~Ҿ PqnJYgc}R^ C/- .h0vL럄=]4і!)qN#'%©_w^_\bU>'C$Q'ZGM7&w?K%¸&{W 5!qyNoZIL!NrawȿxyJEɀ:hI#:S4G"BG2 7:5F%)+};u&JflURYD=9p~BS&N[d/p׶M{Ώ"=)ԮSurzkz3l`Gȫ&RUKq!d֯g&isY 7TwDaY=ν/$LV !y;lP".(D]}XH ,KK_Uz"hDpdF yw< ؿҫ %)UWeS[Ÿz)?VʗR(mpD.D߉)"C$`.ZC9n~M*8ҧO >$ !vw̅Jm>PjP2L6дi^øQaVx>`m<]Fr1Q&eAţ:9Y@vxt)z$s15/d~&("yiNċ@Y@}t:6h.s/BfBB( O EQa7]@vNjv|\F+8G@33q!0R<-C+)'hpW!FF`љ%:eKт~쮭zƋň5qb~a;K6' hMRcJR;޻P3Szn*ePXW nwpJEM`dPbRLv)"cN} PXĿMz0q6"V3L‡K{.xIlEcf]CIߣDGvU~sJՒ\` ZMeF+9p}$.EnbyQ'Po' i/ð!٤LFV4n}i5k p?s1s}[mĪ]ŠAqc9(]=ie"Gxꅩ),$52x{QU %E=XI"w@!bH݊-/wU%i3A`9[UIF^ tf*0&ĥA7h3,6Si?tC` 1~n1A\y;BSzAsR3~bu@DcZfo.ڟ,$dt jp`+ɡ1> &ǒ/4@t tAn-:X,[h!Hk3Wrq~y4z%E^R9N;]rzx8P%\(T3̉2s2 ;9`#JT]CW*MjEN6NDn*#᜞)4\1s \.#c ctFjw(8̀FJ4,*q#;k"0$&j@=G{;0gr.OɃ#;e T䪮_tjC:COtT;f=6U&(<M/amX=僆%'&W*^Cs @]{cV` VU* ZE(6(Ur7 T u}{6L;SwKn"sN$I6F@C[08RȪر V}E52bUTOO^B:>7`tbG.|= *hp1Cn&U \+&_w5д{Sgֱ/[F"Tc8ٗ8>ei\ !P !Pd>mX{6%B9Z*ٻS ]^^ ^JnY1aCs||HuKC+SL M~M)PܑYQijQ2'3~ 3?i|lθN|e;`sw$;YSb'2Zgu`̄RduPI W3-}寀 3Ft5r Tڏ|;sŔ#S@J\4,="T=u.pNF/q -g3$} o_Y`8=5x4;Oܪ@9V[dao)oxvc(.+ͻJ: F*0-D%zr@R_5=mO lMpApoj2jf,nmF볋wm՟gg3Vn,=r;ψ`Z׹7D{_?K`vF2)cԣUeqn?3.T%Vp~BUڌxAm_VyVQqvr!, hYzJDta1xL|(f37@B4\!;a+G9j*$dv}-_BD3!Bě9mAxM-~, ׺cFJ}Acyp@jʙN:_ts/C8h8@dRJ3#e\-9;,8Z!/4 sy0gڣb=l $Qy6@I:#MV-6Lfkqu>ěf*] @\Lq@/OXVMB,66o E>JJY6LwAw>~$* D IX7e jl=]/4>Gdބ(\B Hu+ 2Y:۶yb^H]pa*o6ĈyZ ϻ߭r*L@бۛo \\',lȮX&'kalŹjSl7O W$Ѯ߹Sybz0 KQ'/~E+ r8cɽLKRU 10 5z.&xT,{xCMD+RRt/%>].r=?`qĖhcUEʟ\2BDYyæÍM}r+_t7E#n$LMSj+1wMmQdMzҳgeZٺ.dAPmi3LGއ qO̟3vdKJ4oHQ8#M7Cl{l!婿/Yh٭Tu,g'SNA7Q\RemF9:KdCSI]N$Pe</lc.>/[b[1ۣ Oَ6Gk\,Am*ikQ|Z&~"Y|sڹ[hDIXvFNt[zd "Jm2 ߉j>M&Ar.d|J (  J?A liu||z>Ϊ1Q4x{2aҩ֕5<왧6)Ԅ $E2g5C4Xy]8AѺ޵3.2ycdYچy;Z+zJ${H}=MV||yTG7O-5MGy U*tfz]<-]Gt7>S8 F" pf 9? *\9[÷Gqbn,zR6 ˞v]&@&pzw^O2nɲI 匿iÙ@IvFiC2{ZqmS/`Y-Seqb|j;/hңH V{@u pPGvYI6BsvR9`ZI&w{Y@ZP@3<ʠ&V;2eaϽRay_h?.4Bi"p*qWIpi SҎW2[A$I6s=AqBt 8zYB'o`p|u-D 롟=kB48- Sf&T]̞?.VM4azImlzDK}" Խh}NaKZ$e(2|ɒ=tC{{s* JK՘rJaZ@Mz6{ #oSm:_28鐐 _ucSí(v[ΩIs8" yh\QyLhCҳeIhڐd|le:AVW6Q&ݜxGwQ<'$wQ<;3)ԓj4#o~sFa/_8wݰyI{5_޽^sO2sq;iu<-l>נ40^k" OyJj/y&i.%4bp=3|dDࠊ.JYm&S+He.Y8;6C$%bMu42$軫L@ 6B Qi,} l+Ζ˼ʇ]oG Om5y) xK'k@|JHB&̓4Y4Tw3.WqˀaSXvA7ك9uS0eh:p)@9[ZV;[PL>I Pa+PGu<ƚvzN&ՓgmR4޿#_E}ԵLI6$MNG,rA%zȜ{'vT'eKliwc_w=Kt6(_8 ȰsAwa>^XXh]qO;q ܺZPC'&:}uU)9vSS? /!Iv iz)\|.Ԉߺ>y;j?jWgOCM$:Wqx.9#BWWC%懋9Tp .Ppr$I *ϛUB*m21캄KÔ٭Ե8uN24>i+LSmsx߼Yז+yY& PuFB;Ĵro@MSGaԒA3YC0#׬$AAsXNA d>:B!\>lDDa o_XM4 6|XH E*lAYᖓ[P7ES~"9=ѿ&䉃mG^ޝvTnDDS ֭<^Fj%I2絭LlYⴰbeD„ ]W_.8Z?mXk)Y%&|^_L#h JB|d#!2IPq̪`p^7ԪpRϞm.y{1}*5` ׋OK{V'2ʂE} ++ÚPm;gux#< 9G ;!x능LPIA%|jqR\)uQW3[Դ\n'TkVE|( (ɋ<8RBxEL !(N ,'-_`Wj2R=. f#]z+&#'P}NjzQ#ٝ}6Y¢%(lTɇPθAM(] $h*X[-y$|d@c?Yݞ1P4u6dx]Z5.qn/mRۃSIxv  4=22 vJY=YU{\LȌx؋Yf'SkO]s$TsHM4 {yH;$P&b*&~L[6¤tЪSC`Zr:_S<):|0 02L4K$ F(7s]ͥ rx[x=GyܞFIa, Z?jJN2=/Ԅp.rfZA̢[#zހl} -ʶ{dOZ1YQP{DAOaĦhZ44h7jkJ1=cPӺ^~1x1/E"K*# mC 8k֬]_`0=ɃAfi&O(-PFf|[*>Q e@u?HDyLe2A(ogr0` 1֚yH">xD*tҲ~ۄ ɜ4ϟL|w;ϢQe0cd4;A|;BVx(GwjL!YʔĖ /+[ebgx"`t@XojD~!_h`bݔ&VׁƥhUñRh IasM/zVAï=a8/Hͦ8Za+{agNf鯊<'%)RQëI_A^2FUD0>;Z10,´1ixG:Ik̖,H?^< -pǂ8t2eH.`Zn$1WE3tL[ʯoXEC@JMXBPz30ibHWt6î,I/UcXT77\_b6,ytTp`hVkJ79@ 0ަjd5^^>>d'vz)˹wM%gM&f1dFᑌttM4p٤ؚnX~X6e-0S((`?k[ͯURӚ-UN5k|j/BٳA݊qgw:r9 f>XY}褀v$N|ڛWyU[ur$^ J9N/ï ̒5;Aɒ l6U%޸ʴpuۗS\+C3P`Z@p[.tBw5 z5!.ͨTjԜݿ  w41Ok@"AX*-'+}s+,dO0c6heHS8,69ۡVD*١Yp:Kik,.}^sFL`0snC cpQ8`f96e9f͵eaEnV7]xߔAUVe~~S}=,`<}@C[!=9\Ʉ*2Hsr-vmjBYu7Y\!!|b- Κik{h8=Re̜ =XO+tQhZMCA%-^rqVj1et"g1⑛5>0U5%N'q$CzXGe?\b]+&>Alzm!sW^r1=tMXlni==?՞d !Pe?^h2ᰇO )ZHq>H\EAľD{4ѯK}DI(h{"#\Y@R'2x2؝Fۛ6_\e?qqԼtpV=HZC3rݍF9,du+PY9[MG>ㆾ焥55CiY!>&D3#d~&T1g{xxqe#%`LTAJK6)o\ ~cߣ? L>[#oP?3LN:7+ %fHs{{<6΁CHvQ l4^wx,=PwKt@ʌ=b)I|b> WEV*OJNs| `hynߴ5`47ʟ }8q:M9c K%+}D8=t.ħ 'LUuA>ť$*l6ej@֨F-7~,{70<Հ@t~Ē'2*@_h4!=rxICaDDR]~ƜcٿRۚ60z^IbP}W] tbr۽#0,H2_ }&gɣBwT͆ .ӕ^I'DLn{)X`T,#|4GV_涒Pt95AMr K)"0_.Pq%!`1[)}L>Ř2}.b捐 >;=o8KS3~5L4Ca[~^괥1DU0JKi1O*&d>T&pRaM5WVO(|%h=q9`3_{uǔ-͒iB!awL#5>:&OfQ^2<~5Pf/j)fZaz'xo^žՆP\┨㾲LLR'OXD+}1lf"KHQqGvQk'cFF^C9>ˑ; /Bz}kA'_8K 雗*G7vm X>l[azW̵fsdٹ:=}~1@Uܾ7+|}/@` >q3s1@6G@-*f!yz,mj>6eº}J{M AGsa()zjk9Vh rUlMdʨ_iRRPUC˾) 1a,P#E')K+Է{P+'|_+4do`ZH;&Lf;z)y„|B2{Gfb&B^Øh "BܘDyU`,_yo1e&[lsa2Tʡ':hT/K70{'c:`xK7@@8wXMz17?Y!F.?҃ƠWzN@ >{B X O_pN)`$DTOaԞÍ\Vx~Bf+7-Tg^)WS(~ 8c*۫=ȴ瘿,k@Qꥼvkl ٙ컣,d?R>rA(ܰ R>r9i*.Y4 u؞mܓe(諄7o)Bn.bHpB[4c4$gS <;rܢJE/魲w9M;L27ܓoo+Ar\O+w*Q^8SFR^%TE0v=3l2pe._S#9o?ePT"R>>M}n@@kB` B[,NCPRc﫣BrՑ˞cǵ W5t}u'v~cg4뒓3[-:m QWw0aq>۹#Ȩ1n5#&AqQOae[? sԷߩR,xRzhȗfc]쑤"@"VGLi +k] g`ZգxW AhGs?59,.ONFE6 Bc;\j(_.te0V䎝1W,e<1T0dj nފX łl [ Xs|Ώ0`3xY\~ N]ejiu R|ʔj| RߞE=ܔy7>1;5TeP]z.zw.gOA-7*Fq!+j wZX ugnӵDnrIU*z.FxG.wVGCxqB&6eI xCl[FnhL84oa*H2;7VZM lIt0 Ff+eAr}pwhu3a~Q+ma8vbuX*Ft6NX{ZK<.;4z\E⮢# =ȤR=%(|0X`;yi^r]tNpqH*K";cZ097+}Dy9.t,Ds,jK+Ê.&z_%Kwa ǁ-,DQwPst0*] ynA$PEߩ6O3>|g#0-~ !kD C8^Nx򉚥:܇$(@"XS+TZsRdAurC9`:AzukGUﺿZ}f%ֿO<*l>lӐVmtݬPwvTmSumŀrw{D^1g6Ŋн< R\h괺gO<p> ?Wj@^и}b0iiarYRԘ<6pYc-8O:} ijxohs4eEG#zHɐ֞k{”2.P 8*mMkx|9Yvh >GUxAu0fݠPgBcg\j2K6RIa3?جb!)F-F"RYHM&8hd\tIEPj@$8t8P\J/}JL@-! @BڅZޅ˘]ZtRz8W o4[.2H"Jr4tEm>{$? ٮ?ᇢ(LԆ[/O#_X?c IqIcݧ\kE>8 Ϥd7~Z U+|oM*I#@<㞛twMcےV|qK>1:">x+^N7noSfѳc] mtsfQI,6Xt~^:5m^h>xbqtʹ`#Vn6W;? X]]{N4({V}D=ݽr^ T<!౫[5|?Pٞʷ78:0m%W|czS5)'̓YyV| e2#eR3h* Kӷ%G\ BP]rɺjl97ʩ]/CKv%T=E1q|RNZד[Rm6+TO&I0o /J. {#5˕zpi I}̡ͦtiMźd\P=7\Q(A[C:>{cYAQhqmP uL\/1T\qݚw4EjU220O'|'][]/,WNfS1}Ή "Di䲈 wĭ 0O?dwWL]Ԓl;PXO3[˓ze++ -\2VҴ,R6REXM𗽚;N|m|QvVt:l] ʶ2 |m?D*=EY٩ 8c,m׽AM["ܺP_W$m4 byַu>3pDrA_{;(GjTۨLG+&ݯGˁ[`bNœ2Z6@ށO>-Ė!$G#`e55$jE\iA}s8>4L%(j~?# 00Kv| 涌v8?p ;ʼxdާfz }:RF{iS5VG6nD>De(Hي{@ B'O p%j0ېlG.KׇsqzXlF~xaLCkBn4+?:l(Tb;}S&$<B{i52\:f{o5ᣍ?_+;qRUT]Hgp"HE.d^|6#%pQ9R}v.L[ߴ<,%"2'#A"* /V RBMQAul~`VLm6oN᪀G~A\%RZ|D嬵ҁh>5u3l| V!H|5;α~<:e"]¬AF#7PV#QFp%. ֵǃuTRڀ;8Ek>[4 !`K>rTJ@|ޯP(zv+g ݸjzqԔ񿓧$4ٶ#J }mH]DGEgX#BoV 6 ~Ȗ\U )ԙ3rNI^`cR\8*Ыϑ HYY.@kQENcdq)Z=s3cJi[LSO5ԓm H@/ T#./#'%pݏ 3:7F^ĹV+HE|"m J>tO?:l9JFU @M;nUIZJj-ڻ}9B!ؼBF^KtsKJ?&B#{s8(15lEh7T،},q}Jg!HkdSZQ3pơ9N (rH|Ծ/JyZ\wmv Qm0,wy۟- i;\>];:=g<k[Bswɡ=j,tIɎ^։fxӡCѴ_@8mu"nh"8OQ}"7ʹ,LWE*3zՇÛwsQ$- ) .mՕ ~ _BkE}.Krw9Mã~g,ļW޵tIr9`o!-_ k]+>0& rJ G۔ 5p C>fGk(+Fcf1nC\\>ғZb)1)P;kN [,=ԃz3^mDA=6RU6 u=eǝ9ս.cWä^_nȾ}nu1Nr~vYOwT9iu4R߈>37`Ҡ8*Oj%7O?i3 ohJp |FE,;+TaCGiϣkByP-釿PR\3!>M$-;ǚz8l,',5!лj/~w\E^yK3E<BdH\ myO@' fXF`Ev9P;"UwߗQuKZ ׾T]nQ>- ٓ_6yw!7]" "&M$!K/%hQ{cw^ Vğb##OʛC{P}؋-r)()'|@m@xARS3#)?Us촢1`ڀ+!!D2r zx-e1\8LAţtQIJ SÐIW)?^eK2oWQ8ZtYH.YN>Udޤ.^7A2IȢK%sWCVQ߭w;Ĩ,%3ᕡOcn\⮕;/)@EGCp:x*,+FG߮xÞdc+44b[7 qDެޜ" $>bbPD0ionL EC%|gW(ck}NXtMHjLoаM{OTkshx` ^O`싥is] c1]ڪ8?j"C4q}IJpbiZÏ/:&g [R+?2I@7V#"m#'aL"yGbTukUtj Ҧfy]9b<,(.w ,c=eJj:wעLr/!%?M( XmeWx|Bٲaܬ g.Jn ]bFlڞ%8 }PpI!AbWRdၵ`̐ugwڟjÝ n3#>kv P Qq8Ųd>bڇ%{X+"S!~$x䆊"a[F 0*=vr T\qGu6XLjYmDZ ʊpV8KO9^yxX|1y];}hrCjjg2hZ.A|4&KvCO;`^ΡW)˫ tfl38Tn%V\=I‚L0,*3O[}}PP{ZD0A;ɩF&[1~2Yrq愈(RP"IJPTB`8&JMFf?r8H:q6Ϙro+}H٤q1xN ̔(V+%ئ?$G} ֳJ5w=z+TǭKǷn8nz8{`]Raߥ@O1lw]j_0>c/0f ~mk`HOgy~(A]Vĝuf/X _ kٱ(%pd8wc D Do ҨW<{pq |DL4ݑalG[mԄ^PY NZo(gSY+Z?xfpJix(RsZ^7:&fƍZu.Qs[o]*'6kF#Q{8lm$Y`98Z3BeYs(pa+2}Xh#_3-9 1.SC0W ጙ~ܯȎhPm*yHZ,M}ۃ6&}'qu u߯ Gs|cL/:?v&lބ~yAJ}bmnN1p$$sR^K5*d&tt?F2`L J銿UeE+D',9ZYs19!|HFXtc\w;q%%QqL2c@aCZUoۺJ:>uԇTp-'E>}Ģ a" v8O#dlK}_wdpzq5Oi$n#5p}՟ԛ"FӣRg W^\LEq[)4u|R,2[zA}f w\9ЗǢ53hx߿'tdU|:J)'ERcWoZAOlAK4.ǫ"+:lJBn s>[ X }Gs\nۈx3uCw/*~wZk6qAuɹC!zpyzQ){TwUŽ{P>%]Ԏhw },zPWq-h=lH@\o ?%=3hȋcXwN%u@5V'rG"ſVpַ=%/Vnbb'zr42pog~=+1@nU ym B~Ƶhxm7`c2cP:;pm76 +%{Ӝ+vSS`ʼnoPe%Tw(uL>ADB% fp B<džej]‡mBBmf2Z| i"B)np[B/ݹiu?b M m<6Rqj 1$.Xp@BtǤ_ <zY8=URD!ȉ!ł5a'oV 7^qf \t򦸜K BkH '4?v]vvwl+_"UilƜYwo]F45#(N_XeđOKU.)ͭX\1m $P)]X*:1\Z],(e+tSy sę&y2Adaä-tQ/<_p3?dÀq̑Su6*#hrU/t'&QkD@F4I.m{Ŀ2@4 'mNIcxy"h'EfEH\FSφƜNs&Pl)aB5ty% o M~_gOOMk."erϳiVHP9OZQ(wQo2OGQL.'{FtzDB&?EV涳]>Qy%hN9@nn|FX1^vO"3T$'96-A†ugöQC|7Kݚ摮Z[Dž^VD.ru8GEIܻwRek[^K+eLw˔ s5iӤAe^v7C2LE[g~OiH hsqՄz&aOZS!{ϗn Qi}sW8ͻ*< )e%Q M7FqK6tqfn?-d;ڢ ZasQj*`Q?s@x3V}QKzS_>\G%ֲs3Qg!2:ٜȑBZN M'7A|g$W%EFN#u R,BY 1QTSBCpU,Gf9NDPK!r`(rWooA|hM N#`)"Ro[#Cî:Qn c<3# (H3RNyk:tQ" ʜO]،-wQ\4Uɿ:1&sIv'ԜR :NB|E2Lѥȇٜ hjsGc RkS!oW̥d >_T3 )"5tSYb`]l.y+!Y ҃O4͟A»q ( %AM!k}bmTfa/OFw {8P sk<͕ )F]et4TDv~(:zL#]N6FdC@CT "E?lJiwefIץU*s%q^ۺ [˃R#Ӵ.&pT1'DŽQfճMcڧ[;#b"t/.uQ2xe <*$8W`6HtKw֞}jڻ{mMcXb2QW<c&)x KڰNV6`|-_>s*WV^]$Z A;xS5we¢5-xVYE~\_'j N5V+X>8O TTIq8Z5o:T}ukySeeƺm\rrҡEIGhJDTg<V>ƂlZKd)jEj:C‚?j'c[6."TfS&U +4u ;*@qIULr~L@ 'nnT,r#Ti̒4w.ZL)M^s1lXI؂$loN}O:-8n %U_Я`wkKԩQ}*'iˢ \O,5T@JȟEreڡ<=wep3Cb%ELq]-pIPM@[C>Q[15K!Yi934@o:mBw IE[SjfkS.2B!݈Fߤ=~3#Ѣ^O#9#-ſ}XPWM*@'N}ҫIJ/|qz%UPԈNa2dIJ  LNfM0XY¯DXDWIN>X3@jy2I`ޏm),f3ۚy5}i TY8*ߪ3]ns *V2L' DY mϹȅJjr"i}h`P.Jq(SHh6hWY??r`Z[v?:.ȾgA[?_SD88o'kzP 0X 7:Ï?WD),>e9'q8`6 ʜ^1۴vD*4r ~rꍰk܄Anh~#{N!|HBC6 " )$8=M46W{Gg+;Xy$uʋKk5l~5ƒs^ K_t<2p~N$h*{)LjWwܜnM=dWE݋L]ISY) :Ux4 [UN SJ8z-U v Rˍ3rm7'^86L7^~i^ /3y=S(7\W1u/)LABrk ܇{>]X$E) X_} &7 2K\{0@Oh8ݡd&=mC ?y" Y,{+1J p8 ^@ЃAlyNv:F>GI{g$(6*B°+oOl!vc7n_QRYSW]ZwC?cǮ _=t3G+LN -u`Żr 9 jpxH3ݰF1A@1r9XЊL Ek05pkbb4XÐ&aܻ' .TB5 H梍}K> ϗ0zsCcӮ!ݮ.'Nu? /u#JkhdRJ˗7ͦCiCm- NJՂ_qriD0ڑ0V+PgՔJGX-c$xJk8 'h 3ZXOƐf cpJAp>P0D]#b笗c +Ϯ O<yhA|-vlҵ:,6PLv8/IA#1?E/ޗ#(tNQMJUA]`rTB8"ٕK~# ZG4n}ߖ{qJ01MQ9dW=8Nɗ}iM0:IװײO8HbED<9%Oڌ021:EDfɠ0(O]@14x>,#zjelUUoi>.UJ. DFR#ߩum #cN`3@O}9b\AZQQk]ِ֟Ыj{i d;& 4 ` -}L{]Mﺔ-ze1p#?syQ0Ac\[20R{yx:\`&@VLYR`Q66^:Y6|9yԭ0cd"Z acC@Q@G `xb`҇uFR*ϒ˪ٶ%V9JĔYd80ߎX<=导0&pt$'EH 7w?+E-=7>{rˉɖZ_zEǻSYuoLCjv[=`XN ./*.)~L}_ t[wxl0U](?ؕQgZqR "{L#LX=&zsfg_vF8lep猰[J:`Dsr0?r__bp=ܡ&)ԇ=;/ tC\藶wGW|E1q(k.>KSkShىL a ns8zU]Ҡyuj(o[<{wHk{=2ncW#=[G*0qc)eBQ:P_.^pqA 8ҪqC(/bN`EQGloM<T ua3^[Q="\pGQ%Jp&ʪDAo%nxbĄ$o, |DM Pl -=w/hz[ٔrұX%/CI,M^HǢ;Jd\jj{M!*!K@l38VNoz5ۚ_v ~P6&UxT)Ĝ vT$'TA.2#D:[ صUΊ]0"&xk b_&^Ucmہ~M*](}bB\@7؃_>@W}ᇣh{`Rv%|20U PGzH\8p&yb,Bj{t#d/q} ko)YK{Z3d ;#KjeBJb^u;b,5P! )F'>K"F]ZvS@Qȃtd9_pJu"聖QX ѽ/|[S?)0P%c839Ʌ2U!)~ πNDRȔ͂d_Re[2I=b} $b~nRxokC"ES64%N4Y0dtC}JTjZ6*24]>ZJk_5hNaf%<=eȁ z,7i/JJ_zws.Uڌb(Tz@ݧEBJv{Ðsccy|B3:e], @@^UKrAg0N@j$Gxg#~se VE#F@6MCPQcE[)dt!XB<]=~`~^I<]\ìo )((NPɾ=~{uC{T=+|)ǐ%0crDm4UQV*v$`~Ҵ=j^JU^5}}|^%R ++v%eXׄ\AT,cԶxՕGy"eGfVђk9_ Ú( -]e*QcA5D1ʅ܃ K B=vN6{q7YZy*)KB 7ڕXa*?D˙g1aXʙ'ZhUlD7˟>z;<ŏH"Ez'(+ߤǝ&mmOv~ MhƸ`ԙI# Jk,`~Qi%B]dI|1a I>u`N%ޤY>)،0ʱfX]We{8ZokCu5hKa.]z+TLFbw45oL~GKea1c[򥤳:[ŻnK)Mc+x0>²T5,| mAʹG{˴>磶ǁ~d%X[ 툏չAG77dv%V҅kdl d[lYk_kBmR~Y 6z5ge,[_Շ4]( e1:Y ,Y5HqF>WPڰP$}IU{u ʢr4*9Wo,L1J rf976fḃ1\[zf77&*Ұ 7ق` SJǪ:l_ZhKȈ($ b>sl Pg]d6l22B%Wx ?Ȗ{Tƍ3WS|E 「#Ka|O ~gh-GVn$W20> DOQ{8ԼGs?jnF(]36LMlcM=Jp㑃1r;7߷"U?thFH$3۳,ֲ`W@`N>Ǵ$G~$g405QT}EPPgHyPrظf]o۸1h6ff cHMS]C \J|X)q#bVқ25۞g}eV9$91ұy. l[e~Vڿ*/='𯴄SR1]8,kQda&he,dh.3ilhjnA.| 1Vӓ/gb>{& LTDAYTPM0~oسuktAv2hGSꚕ4bҁ46ϊqdiHz&5 rpNw .eӎeLN8Z6(Q}矕w5B<˃-~)+^h.}\Ň@Pt~3rPƂӾ`8N8PF;}g1-b i5/Π_ whB˽{`1LۙG*3M?BP ;C>K\NM#r@`o0S#$ 5y~S(ƭ=vx_⏌ɯ>sP]ytv)ʿ4ڀSQԨHKn6߷hE16&NJVx "n0fUwJv1"\fe8"72>Xp8gijP/ʺ@s4,3K.#$)PbcOL{ڛdV.fRhtp3;o +!!=N_hE9~ַhP=M3d`}z Ze{sPL f;HG3Ӥ|;īswbr^Ҡa:"1#F^&zPnJop$]5/rK҆򆫻F65f~G(#p$Z,L[Us=O!?}y@]c8\AKqC\vEϑЖyg QqȰМ=YS qzhn7.4G=}+%!:)X :XS6F@b!8 ihh$]5NcGpL+1\?nk0J6'HFo6KT1JERɨýd7TiGK #W~NrzlafbflXΦH'>9nm0Ykfo(0b`x%aBqπ獫c\5j2Bv!`oL6F3:q됙Ʉ:vJeդUq!$ JS..T/v%JSOٲ2_ ֕VKr݅gIvw.z'fwhԧ VyjTG.YYͰ#>v5 >T` oDfOP&euy|vkIu>m 9?>%Cr%Aai{dfj`X~n٭xޝ/)`\@a1P0ice=^ͨ ;$?O}&0j~' + 19qoɣ0N&eQG Iظ+02q3[/BW\}" Y vT 2"7Ӭ`EJG5\W5!Hd6%5 x4ym}!R&ǛsB($7EG[$*t"ZF9K8}<ۨBq/u|sN9~GzĄT)r]j22bF8Cf9_:uӄIHS1Z/]0LG;,foҲ>H⥁t EU`)"i4 BJԦJeNeF ,`|S-M evBLz 8+ 5 {.K5^v|p H: v?ok&MxsەJ4޲,ZJ·l)/$Ӓj+.G&pw 3-*Dre&НM$ux:*]vݡrF_)W.""nAz-6OXV d≏< oEs{p TR#)+LuOWnq}1Zέ&^$o'AЁTsooY9 Q ڲ?t C BPmSa)c+2Oiw)m~v .LYC3Ty7V[/-{`GpZV\88!-Nuu}䬠`3±OkѴCCTjDTN vZj︎P:$W>Sf{TֱHvR=%L֝hwvĝ; M>3H!5LeC[$kB*~h46 a8Kyxo? -@lă-^9 굴G/ӻ ]8bC[A !y>@8=%B_6/w(g΅Wy8!jUц8.X|I`(F_ k rzV}Evx&5/h"=r : `zT, Zڨq o8HztǝGgbaL.jRB2l+KUDJ#ue#F@9w.BՁkwru~[>U]ɷta3:K8C Q8fn0Fl3(E{`sQ ?P,RgZc'*FCEϤ̟ Jhb/|.ͫo%A: \AcQV^Ny GS`1gf: ul]y61N*!L U N@GDa?6HAݛ7 U5bm@AzzSڂo<ς* 2ή :뙀ݞ_:0fE>m!m,eH,؛kY{15 tuw߿M» EK7Ooǃq (KCoK zQ%S+y1Jby-TЦPxl@_Z*f .z:xc䷱`bH}5"]XDo)\WWŽtUk`>_lה_3kW6ǎ]|V{ڔn1d$/W~"? du(WV?LQulCB:NNwX=Uq@BzE@p4n{Ċ;o(=rH2cϼwdSAnURV5.bH^М޽#ȔZRr ]pϐ” !z(hKUol퉭[RpE8K& tӕT:w'¼zBx5E7rDM+$ᣛQי%c׶Tui*#:b=>C^zy\ 7хᒜ7M\:M ?,h!ԆWҸX ҽ-LAk[Kdr7!Cf^gi<`/(eَ֝ɰ4KSa+?8X "} 3+=22wpa8tlpw+ݪʧnmW)ZQ^# 9,R C,[pC˾ӅG1B|9q=U>hQB8u#G+ҕ(6G "r~}BaK%GYUlWyIn Qb)0Ù/ FK j-nB~-i1hy(}WՇ&Qg ,5EIw f2^ 'ƥ;xZ4 օ\?%Ip^}^v!Aw ?h6blp .@q~X.+a-: 0R}"!LX Z4tgʗy7*b(tֽm ~*3c Q#!C,DEn]Bۦ S]qnwJnP5Ѩ7QK(=\G(MѤRn]Dz&܆ϥn¡w,&̗šO ]uQkeI\BőPd ڗtz;0qN An6oztոs9Gt\Q|5Xor#_ AU;H!x8c(vA 9¸36"4Vp4| !DkP G_ꚙGϋo@_7"+w2,^P6VXZ78C}s8)ԯCjB'NQte.EXYd[4Mabp%,Sc 1} Y {6aw@tA\nrJؑ^ t/xK*;Ic75* qgm urhb5h"SaIAf0J=a;(gُ~+rD(0Ov70hN!"hsurӣswH^q>sss$m HOj|9#upE "`TlA'"j8CcnkG@;ؗ*nQfĜ瓔Ԙ nBBu@#, \_D,S2 ӈn[qKFm:KďٲpLpP+$=|9˽ǺFfʽgLP0h_&?~ 0">:s蝣"`ө&nDA~KsiHDssNrUSƸԨ1  tiC&Ht{]FsSAgvfG0}ZPRL Qj|o:fS!Y)o B2t?] UcڸR7F Џ1>Dm]icVA;;N;$9cǁ,]_ݾѻl_;~$)I#rq$DpuCH=-z).(·Q-u3 (S2 GߠfOWd2JZ̒ 麤1{~ce}+vFd.,ɶ~{>:驣 7.l1'h 6i// qn[;x7oءj^O|TeWf|IH݅N$Gl1W@3@-+Z j]bSKebvD6/7:wHnt6C̞H6ǐJcL[y?-<8}ǟ+6e {IĽ8wϩt]{,nR&=9IGkjFp|)!Nyu71:v5[-)oYpȌ 5i%a%1h22ڋ=.Յ x_0)eAhdeB/}Id徘<-wє6U@snEP O{f[l8)yhŽV[ siC!'bzmdX2,/LDo(1Rp/"ķBsMz_< )鼛Inܽ1$B 'w&©_WFt}XG$ffYKeD|OiRWokɁ:-VW$er}B1&o8Hퟺz x#[`^QjZaŮZQm+K-Cy&7'mlMsCreii)ka+s0Tr1iruGsmry \ H]ځ/H eG>## ]l:> QT[HO3֣S)g |- g!_Z }u )ǢsFd՘Q؀7kjVg}Ў.,R1i &onHKѽf7w`nZrs ?!R 2t]m\Em9WBѸАE0,r_z5hhr3a|u>mqɜDJOtp2t% '[HklȒ;@ٜJhsUQaI,<֨;RR4]?ENLDfJcvs8NYGK, v¯5`LsY|];W4wy$xTM0 0>뼻_xT|V[Z2"ܳcZ#@ظӽ2ARiFJ%Kmc15'BTAa!/Qr:H*JId$nX H>2#K[ *,ŭ9:/,rNz '|4L CU0TT>p xdiU3p>DC/ ӥT*1&Giu]8đֻDœ 6_ݴ#XÌe;Cٸ˿A&j~~K=_|`dψ-} j=/ZS$ (!pw:Ǖv& S֮W}47s03"4[2 0]Qf:M5x(& 'Jthyk%,rY*lsMS981~ V2UTLr &hX كˎLI]=E' ^ LzXm#B4'@bv&ʘn~p; +Y|y+-Plh:}Nk[mΥ6oc[S_Bh|`+1Y <;o,7/>G N\P;t7]hKOC|섬Hy|7?>Eߌ3u kS{&cs!4\?'(F)VѺSow\szq|4&(vx9҇0>ED߷XzpYYh|fm2Fq2[ ,g{jmɯ aR_q 0 ۪R+՛5qZe3PGI7̦Y*>>R+)TYŕ?/q9&P M5/DBiSC2 AiCq0jfwfc&%.AO;ٚz]VFI V򱩕2 WDNCXfwEkL4 >h$F Z#d "!b#%p%+j .Ev2pxPUVTuE Iǵv\'YkV"$hh5U5BWvGӸtqfQ}uFw!Zr(돣NJ^NjS||@NO,bx| U??ZC+E\,hjӢfˮR؆h: ~0!)c_d\2/2 MڽF, d!7GwN>(v kѥBY١"}IȪ|TT D8+:b@on0=}ך~Xwae.wޜ QXw x 7yc1^-#{g^!~_GI-+kq_Wi^rRn>oFx"''Lad؄%͊Z˂ zw(rṫvJX m1́T@I[H^nHzHaZ._A뜙v2.&,VR),"4TXh1J8$UoPʇd$v l/8VO#ˆ8|ʝ"<{a%wFJbU4šJk_Z*Y\% # Ror œSeZ @PJ[k(m_So)R' §X uY25$t)ڿ8I(.\#S݁ȉC)`IP=~/٩IMpn>c>"ڪWEҨ o\X0-OgJWsDIOU pʼȮvc2DWA:#R<ѹDGv}f{/㡺G^Zblw$AGk[Y0fH2*jB$v_A }; 3N;CgG9#Xg5_{%j. Su["eOż?ᙤ5-"پ դe,j2sL\]ͲyڱU<]nfER(g*7>4W-_#fPTpwD}#ػVƴkS,yZؿ7`JX9R7T,vx4t_܊㳨$,iM ~b }_%PlC>$WaK{64?)+"J܁~KN/oG~oo`吝 >%=zκw4+c<+jpT aIk]pCY"q|= ܈[a|5]#m9S#"P(d ;bF߁t]j1:߷̪eLjsg;a.W*>P@BL0᠘?!W[3:.(ӯO=1`$rdE_IQ뜄vgien'J:j 3p \:Nٿ(?>.qV "i,yIFZ?q_]Wgd XG=2@`JXP{1{.M16mkg/J5/ǞGRQgmXB0 nl"o+g +{qD 5]`6#BSCx%JPcyM@ f#N ÞD!݁ģtQ9sIi٥C9\ՈjCET°x"cp1iIr@r#Uq A1HFE)&N,8uh*^{V&u1^uAK )SQvf,Ўr3-zw '95;c32}?wQR1Bzbgob'з!A6maws=\ɰ|מI:ELhNX[JǙU4uUNe8b|ri:'j&W̪C}+rQhn5 !܆("՚tj߃=eMts <\ul<è5&MoL;*+U,_PNkk<4bHuz"*[e(2%螦[(|Ū*{wEo\u i,6<*޺6nB6WΝP2qQJtʸH p':ۋ@ 9~A Aav 0`LEjk.]1sI]uY&ATȨMŲn:.U/q|n'\QZ:T6 Z)v oJ0PkQMtǍrKA_T=+م++S8<}BpHkhZH׌7E=,<.@gІfk 3#ϷQ$t7 yY59jxX_̅Ɏ77x GwN:K2,tmIDsY>{ 6|˥#mp(PX4By'o:qu/֯{8 +JW0yX[bϔ(VJ$f-WQޢ![ yL;D*$O ^;42 (gPY;=fXAQ $Da{.q9$W/veadG^~ax2p~K_G> is4gXt !ϝtCMWa]涨 Pp{GE^eoFG|y7QzIr l|_4$}5mf.(m5c2D,\06/C1_0n2鲛egu*R,gCw]8ß9Domr2nZD5uwd _h<̞ӧޙ,g.?QaLj,;ԓN Щ[ձ)?$ s#O4c0 .=cv.,!\>^ 5 J+\ޒSAbTaWTڣ]=B6!`ӴGegPj<#|]R L7+B:}kE3~!&ᤨ)8QgYKk%`ɔM&@L}O(JШ^L7N]/BM3r:E]#@t1h*lǫ o:<I~'xoCDzNn=Icze@u(跇:%zl ⪸k.ZCATe=iyUңp;ִ.[NgHZ[Z~ǃ-=&ML#2umfB@͖C5&O0x|`~)ৼqwp=|@*#;"w Xo#[zZF5Hi ˜1o"%WgNK@/:m$ݟgcG絅4,G#}[bB! R>F ̮=) ԽN H@yrG8t#ͲWS  qڤQ)]J taXNNu!Vx~/:֬V/ ~گ<.4Onfϒ:T˜;eNTvl]D Zh~q6D-lGY[YA-e֥qI[-I|pfvh#"yFK{'oGGw9Q1Є2Oyfu ֗]|7~VA2'`؇BΩ$̽mEdrZovmk#>ߊ{_^6onW>ҩ؋9B%ShL4#q`ъ#Nd$dp7իgF"Sgs_r?_]\`O~NJuPȲGB=~9Z` Ai]w&MiVOWd[oL7M()hӟ T"'1KK/2tun&%Rda kRnMOWiš|{8I'QJC5^nOmN68$2U ~v[X#?XƬލ;qN6H@OoB\?">/hY0;3o`lnE늍]}jq' >AV ߀%5)4 ЇNrZqV7X}ya#ƻ:Ms{''iC5pدt@ ѕ0"bt%ⵤ+ 'ΑJ(hۊR!]I_%qT,Ȏ 77pj˓ +4<:kכj(0^]U}3mY-C¸^)fٿD=;+Cen7l7)kJC XN5f |A.(~߀(J`!5B +:q1C'+U ?!ex9Xs~a*L(WċXѮӻ<-QE)[|/Kw xzÂ9Wi᭜*~“<&f:z阁 yTq5)s@"!f"RYq'K12DH4(\A"[¿;QZ2wQ п& Z=iGB4YS.BnR'uj鯯3Mb- n2f_97'!\̋TػA ?BI J1?-eN&hI}И(`o0Iaiܥ5՚CPlѲďX ?܉uC^I?7el H$0Iҿ3 UL{}sr98 |/ rw!aIrKWDvo6`&#ink$Z+^_8MgD2;r)-'DϟF!!vZXQ2"xIO73JMϤVqVMv*ղAҩ: ķјԺ$6YOz^ Ks[{E^$T 080#8T3ޣwx..܆X웬\[l`؎dC=$t6G~垜 T7#5dpWߥc,BaݤlߖHA2R$!{EP*J8+dE.&ď h:03ᘄ6r& PVzge7G gCCļ〈+gsE'3Cϟ:^&AKyhY 6$|J4Jԝv 679X'iF+bn_- $u%s Jٜ)63+>[]ٺG bx}3&n_D ] =F3hHy{8̕$]\!7_1!R)gT-fH:r4Z(l%iI3{@>+=^3XJS*ODާeG|@gQQ(WWw_vguw]+A0M@L[Ov]z`;+CK{Aԁ8Aȏ,^ǚ?Kڞ>[b`;kүzFa|L97(˞ǨMбƝYm*TpE[b6 `\\1ף:C|6If;H^QDQc7(ln MvEPU?>מCܤ|E<ؕ"r¹\dU^,q?o\<WZ/X;۝BT9JE>_.p&yq1 -d]%!KEC$DVtCmsV nY5%ƣ?2z3_z,ƙ@ %{knHjuGVL:0N7I]"ǐ ӒF(zQ b+zowc97DWeVH&%0n ZYY$?;7,L8os"K~)\ v|WEf!0!Xq(a/;ѡuX!:@X1@u:ܪ-yHu5Zs_POޏߛd%t{e%q&m#vKZ9^H:uU_ sX~S`|seO'6E''{faDJ=-56Џ{>:pf]o.ܿ*bEnN{ʘ]~5*sũwMOtT!Jm{rm%b"oMA<)YPԖ_% iէcB_ͧKWf"}G>'0?\[Ř)V8yNɁ4]:EŒkmFqdN|S~:]_Ղ">~?k߱LaX 5stߜ4Fy QQÜC@IrEܹGw RQ2Id8 *HgS&^=YYF E]_uO=~ARܖ WO/uLkp $}>ք8JAd.15nO>¿RtUJ~:t.~ 'ѹ4+h=l譟qV|m= ۣN/Eм*m|'|TrȖa9N=k@ KՁP<,5ѕ #ɲ\VDiA'x `8Q/FtX{>#I4SP\owDBE(T&L~E򁑁]jTq;o6#g!07;"$g|0xh{'')53SV5y aHkD-VXi׾$Z67CqGxAt !ѵM:pkL>%!kNFF3 K-^(+ #wV1Ǐ5HX~\^L)4)zCAxfJaE.D@eG +UM̦y4[<ՠj.fÇezŒՑ 18wZ?B,ie:LzpI0Pu 0Sg:yd #"!Rba{VqJqV:p 0k uZr۞|9!ʇ@ $FOJ hFYH=w 'MPPdMܹC8Ǣ-7j"dpʃDOOwC>6czS.?o(EUfdZ S 崗PΗ99q]Zdd~+q,~a\aa>ˁGx M ZFhcGjף.+-OXyOW0( FaGfQrm aD\TZG5iaFy,|T>a#dSE'p Qmnrd Gj\_9NC>Y1kQ')G%UӋD8oHԺGq-و;tgΜP 8΁  ыd }d| !Coz~U $xj4}E;&`K` WH.M\\Wk\݈|0&M\Q]ђ۔jd!\m̶Y(I*υ0.C2՝b2k.TvZ@G3NBqDICN\XY7(_lT.> X+H.x~_b Y1Cr wGOI~̪T+gM=9|_u&W,GMluhѦ04ËﰢwsĐlU54WS%6>i$|::jQӞDګ(/?j8*ٌwmsyj/i"x9ܾHG F;$;':H*u% lO~Cd'WHB!$I:^z!t(aXEЗ-b<24u_ 'g[cmFL{K?adIDKkHܟyB\=)#bnW_*sDh>S10rpC.fr0QKDS$cUV.. =t5X,=KKt?ObtW5JK38xXPOZ}0Kп-:LIc_bAmpqnVm F^`X E&CCu DezYUR1kln4߉h- RNϸ%ME9߬cI,2'Hיo.'E־džx)F?CziY\HLSd$.8= 8eR]? |Ł uzoq$>7(G=I8[e |洩:Oe.rCu+rhw- .]";CA[}U.bą=HaUMP\\wXQka@"7bGoعaMEoj(=,al S(Ud~w;j@zFf]@ȃw[*cw5rnRc@g:Er$ap{C Lޡ{@{3hB ࣶ+<7 ̀ۉ;{N˙FNh)z\9㤪LKNxyR=%e 4]jB/МA;*O kxs [ aӣ2x #k"1n}_Jm8 x♰PhO#0i$5@rrNb/JZ]Iu{L>(wP`7y?LM}P'xĽ*b:* ZP,7 T rse5׎Hy-'Rt Lp\c;t>bt46ȋ+d~{] oCDc? ܂\ <|PeK':]$w'G1DYrUI?8b Er4&'pD ShPιU[ܹRV]o c!jd[ޙ&sKzi]r}J ˗:O*diĀf+ξq`Am̦n"M(/Wŗ5k(!Z |aOaH.6 K~=|,x;c:SB@7+tJ ^"ޅ/\=q+:tѿR+@:ߦ}Ta* )uDCEO:S~]gFnS~n2kr 7o& ќ1 @\X ?jP,M垹PSWtjZZ"P"V h`#tj!!=MG5xSe\ڨ,w[+ q~N.Lqf(c<ݵb-LaN3fXuOm\("_Bؙ&Oڽ!ǎj5BΩm?}cY(v~20{3q(Bt/E˨c<{破I/r+D 4-oo{PH).h6İf[k MyjÜdGoYFDa8to=O~Uݣ=En^?+3 4#W6ֆ9'c<ͷ+rWIrT%:(^ l Ȓ-^t'Ba=_'x o@:i ]$D(`;Tҟ%bvqlWwpo>ADCkwq 8tur0{"Ym{aϽqL֋)AHgtpqS[NoWfdP0oTѦ uC\Q\PԹ~? wΌ)J9R_a9 t<81bWB Т=_HǽgM"[A{[!|c0Kv7- i8U ]Xk#ۚEbFY7=66LS:% ˌ82E~HoU5Ţm$s/^Qim{=[=:ec#i_AK E^&zv4Ql1Z׬~ԝ'`QVnkX p]sI0A,>lXâ(n`ɉ.(g[ QC{4Q;^h ,e\_ D y=kRAd"w:=ƃ~)့wDhd O仠]3@ݠ4'%ԩ3p[0q2N.Qo?HjLr2gm\{.Y^!7eYsXa#]!}Nj[u;0ptwR> -THF0I)*욀YL<`ڕCc䲉u )% +L=0&dW&W1зol6w;{oْVnrxaRZ4^)K89C2A+x`[I:ʴ`rHzt pD $Ao,R> TY &nFۀuW3K+_$d}hɡ&!681u0unLYJV W}*T6tykGݒ} 7AmkʙQUXN ux&-t-(c,X糂 -ʓ,LNzdFυ.o-z>4$2L]):m̠- |;?I+j%!.fߕ%{.z{cQ9&:bƩw}{yt&ZP,Qð+[(kLFG!wXB+s~sLU3 $kvVKsGf`ȿĘY2oO jB۞k.X`mmRIEa\9&g\>*w{e3 e5m 29͛#՘\-| 5f$=F36~vGG\S ! #`-bηn#<;}΋"SX1:KbOwQb/¦0hOPo8DaqH0e?|%Z_(% ܜ+DJ%7䈭)yd(T(^vW׊nG|P_H "kr<[{Aq8e6, wA<,$Kӗ`H֪ED _n˯F9ȫFCt]){w zĜYS$uQ~`B{6I?ZB cz1xA>>_IbQ.[1b@Ghe"MqVf*lpnn7gYS[0~FrinAU02ܜ<Tb`A.ϊJ#uULaKgJ +|-IK"QH|M P^t-#mxLݡv䡼Fg_Nm?٣}sUfj!T<zwj^6IVd|dIZzm|EV}´%|JpCo@DQgZ6h̢iZlO? `rBڞNv%)O iH֟ȝODt Qv nQ[ kc#_ D<\imRlN)(daxshP9!3+C,Md2b X.1U0KUtN"8{@8Jv=sL4d/&0=[;7[6j`PnA0mוxmm'=cVir h+"_2J6TSUE0ڕ'[&pBPA0!2v>lrݯrkX8 t3:%W}iFB9Dр*4sIx=YT~!2.Ot*'32$t'6= " LS^eE︲ 4-R\>3;,&`\"[/#ɱ!4b977(o7ހ͞.!PbїBSwK~Vc]ɕ\ BDJ%C*],s.4;Õ$@#OO8zNޮb[^hb a,];cγ%SW)%zF N?bRyu*! %S>>,r_BTnԂ9vTD7fa4ˆҘ2g{!,Khm_/`;@bT/´޲;5X2QwcZ JґzG髕d dM{qmj_+_,x?rkE}-Ѡ׏>Im*vy#ҋYϦa/e?Mnj8z\F J<zSe (:E'Yl t\@PHs&S[j9Ee PN3j g ?{mN{:1maݯwɉvmAct`k.-'hR]\-.8ypyPKt@P:?2K?ͨpg*4F Ck@_s}' 5'N7b.CB I7 b i9qjL"day>)2= >3vڳyR=Auѻ◙~re܄$Q9.~sI9+ͦƞM&2^YSEb9Ƶjh5*Xvk yڸ3cM a2hMJb+b"*-Q1k\h3$,F(<]i$S"Vky-ku9[΄wiL@vf?%>1@G "szk#KuƜ!JPZi<4ޕ}HO$eJ0zb pҶ[y>{b `3p(% rR3Z=V%)ȷZ}KTtuiu{5бսs'եK sD] ==a;3.ddSFʹ~&#-=u7 U#tzX}frntu^x-`AgT Hi/I.-,z'7E I0C%fGWۥOQ+=T+ˉ{"$l Xζ2)WSdy/tanj/ѩ@BH4F~Ʉw:&[> z شa"#!u,~_q8E,[U;K8PϹ_j"/WrdBCG>%$\g!#92UƔ~ 6>b C7Fk{&SM.II¥6.%FC$ kh'oɠtMektp?gZOɲD~LkyxO#(P~>rPi;]yث=Ϸ:P{o4S&8g^No>I d*2ѲNxFOl=׏1^EIx~y>u),3g\j¢淦 *a:&Eas۫WghzB}=?;I@I+R8:fܔ63g㲈Uc4*nR$׼Z"؉#~ K\x@+~Ǵ*^~:k-S|2? hi)ywn~3Il 9{-ׯA0=m>]B >w\sfp˄qmOrBZBj:z<o7Cq[PN) &MmA&װc=}2eGX@YǨܳZ"-bވ; 'g>7Xt^̒`S#sIQ{9EG;'!PFʓ`xx2Ra$ӯO\S9^ w?Jb.[cf`)*i2@ BL "roFfRv = `OeWI!ڿ-S!x3%wCcs{Md&rKn]#i ]_~.3ЮUbos0y(pv ]U:+ln\#f)ΊR+"^t ɇz~M ~qi aWm-1ly率# {ϱiA$IHDjd1d a=RAN8[eH!I͔@bISk۬"))p{;Z}1}cONE Ԡ=FKaNÊMxH_9dXjV^Dj `605 h\z֪LYHq(Y(-qrDBSkr[CV{ziwuq@ QUn< p,QBO51JNUyvT\ezڋ4Y-qh.H1SIsq>h04 5`|aAkH>.bP>NVnIiv&ӪEvk~9 C>ΦCe:z,z4 ]+ !3x g8IXu$-4Z=b2}CqmثiM rȷӛ\_l91AXB!1^Auxz9gkBG!WRKn4]4Fv1Nh]?OЃc"gv6"ʋMZY3!G>fojpqnN]m$ D[S)k8w1m_k6yD3sWpA]@HݷC]`LRfH-%!tD*QWiMkb!,.cw)nSMr}N> J4TwtDg!>/4Nud'1l.3XǶmL_MjJp ]ِNEEHoG|>៊"ܔm<ŢqZR~Bٶ!pNFr0i^r4-'P`TM~xj Qw>r /sg] VV.a?.]mlPCL= ~;GKG: < j0a)&/V S\cOE7Э`E֥^CQ&l%>[4r 0:Nu˓Bw:O{2je=N 0PGa@G`&Zl )t,Ep߿dC۰fQ,N l"#-2v(wxFdK'JVȦa_ ?,̞.rWT)0bj{H|j<x5B]'vieN*NAaޮTvn LAT] v`\@Ou:@UcɌ*vЌxu"51//Fŗ:j]QE/\DRn2-x[==&VaoyTsU%h5xMֲ1{N]VaL `Քo>ΖɰN]I j2A6|e=,-'60ڸ_ L Mjմwo~mG= $Briڡ_\1nU9`6κ]ȧQov #dTT(2:g] WWx;%66Ι.]F| ņn7D:NhL<6ƺ\5 6G'o6Ug@]ѕ ~pKHߋ0}P'8f 85ë0ɔm*1g+*ͼ@/?&qOwOqlOThɊDrLA '%R#bF0"[e+gs9G|;䈾"\+mVC*zX '%3)À,Mݡn͟=szX*%N6ƵˋYu(,͝v_7ogyhJNaگ׆:c2R ?G aeCϭiPuH5)F^Vl)=F,gp'*` 5E\O3V]N"A`DawH}V6Rˏ@/LX%qjU1Cv4BYsaZڃX2:2|9@& ['@ej_ڧ~ξ@,: y&Um?lmauI`pv揄_`j! ;M΀Bp ވFJw(^ gUM~TBa(aÄO+K S3NULuj)3rGr5czq =OW˳ADDHYhD$Uw2*EͰ3p9kjQ{ rTzW/{h+a`U۱\aKq}A&ϿXZrk'cCj|DĄԨA&>p6^U$O+B4S/;M%RuIlYgw3Hd2pkE!i2ų$J@)z/;KwM{A\@<}UWV#N[c|8:G8a_dt7=[L g@{u_|5h?nEy!ST4{?K3 ;s2bHF;nR_%d#'5$ or?Ŧ}=|NEjC:!Lx'JxIhDr9Q[d}8HH!;PY^fe4Uk:>KGMJ1ols*Hԯ%L5K\)Ȑ^Xq10,q]M=z3܏.LJk0 <-:35%kō "Ѫbk$*9I7\]*%SZ2rҐ2>" ݶ)˓H఍V5gXa7W9x^]'.v9w>2!ln!y+w= 4!)g+|ӫ((u5:kf6QBH5H* Ds5Ajc*<vx KO|I\ĵ'~8@7~{?@&I*Prd`G=߃SCej}GӬӋiR.3}@fbeJ71.s?µ ߻,PyuΉ x?58L',:3XsѶ<B$~/>,5+K* _{4D.Qb ɳUXӵpTG\+24@Gl_ 򡩃cẘ\R:ARfǫF+fpɉHÁl-;p|zf &ŸUD҉,W6 $-ESȕ۠'b3mk 0(@+Lzl-, ja>^G26]UP`7{11!>ڰ~ӊl$ËWgxEPo((dtURSn3o$YePJ$tʛ_#!6`5790/`so"n_n9#yW9]8Xވ` \+;,cŔ4Kr4x=G6r[H0 1/u93VKWdׂ-RK1uvu12ʹ 0GfC{I5_Lj QN "Xk 'sD4 4%O}izDpY╴r]2S0)*V*wWI96p q!?[ުƎtzn.Ahr^)n!Ln;D2{8\6b,ơ['h;I]D{c|)?.aɒũ} ]\m xHdaggG:HdnTݘ6KZ%Px#] $<;[7BSڻXaTEpOMTYHEʈXK&8G> %ӐPdj-0KTC߂VޙAik'o{m]7_\Ba[mPe-HOѣC/_q0.9.0`(n )2 2N<ho;Rk]B>/م9C!`qWZh=fJPDT0U!> T۱`&6r%EĖL^ =M߽"V3Yw>;}%|伹O,($F35~M(eL<Y K-*102rV2HͩL[^9] ~^:iͦz?u5w>V9|2$lĺT;S(78? G)|Nà=0APfW;CE ^S4ndtf:nΝQ{#ʐW7JlrjFYu1bC=ȷ7#!/Bh:_ڈv os`6u"xh)sO$$^-A H;nU.Z"[jCYt7K\~OT4Q̊F$}z+_"e~+<*ކB'Jʫꈥ?}|JKFs oդZ{H+U6mM5Ǚ a &,͞wPYNC7r@\Ӭ]fPzX@e_Sx\BòKfUNPRGS ЊV5.:TLG;NU+F:<ĜgzwTe0@q dm`OɎRF !d˰%f/3u*; P2\c~$I3C0% ƞKIJT=K<ʅ]JY()QIOa4$MTU;`RYrdĻp;]k!|7f y '|MB,v2SlMWU%H~ %*| )+`f<`DKi5kч9~"^*>8 v3 BJuuم,@ $AOt+,Z0sXJƊ=QTOw3YrϾ?SMIqJ=B?H$C HGT9-JwG㉄pr`\: B L֨`]cnj |5Mwgy!-,.fWBѷ>kp'F/S'%|hŪtL))8\۽}2f1kl7iK'4qӒFU~yJj.<jPe\;~S XfH`?џmaӒZZ1SEQ>ԦI<4÷:h S^+e*[b!;?1W=Fe70rg)@ IJE6VB u*:#\ȓ`7b BzGh Gbk6c\S +"U&[Q|4'6p\SGupwh}sHЄxZk&?m>e:r0!v(TsOlytG LM7*յhX&9AguŅᑛ2^Ubm? O_zMуDU~5 OuATkO`,F&JU0uc 'G ͔_%|'0?ɪB;AbU}/ezb8wPHe+; *aY`c ]2ku=Q©Xh*Kכ/ǫyXwI[ %T,"M肃 CͿ|:J#:3/0ݲP2m螔0ev|2n i1'"!\Ƿ}ƹK9Q)!0t&FD& ~F!kbnňFRo+5 2yoX!*fj)MC1~@DF2?7zCMgO ⾲DŽ3B3"`lva4 Ǖnx_Pru$ӈ8_yzZ$f!xD5'[<0ceZ;QQ+CqB Df7$%\:U 㭠Vq0L8 PcEn2tG[Pq/_w#m(U~/.ek0)R╊J.jNY)̋+ps%YZRs`g7d^B1lV._c)YPWCG+33TDӇX2͉r/c4?x`$HM͢ 1jF߉k[^q"X!jv1MEeHy\dFNc_?>:e0{3tv}ܐ(<_"[2hN xׇj$i'd_9Am-J]vtdb.u?“hFڡh40>5"kdRfa#lDo:|Q^SzEaKJHP$s߿St"MgےN;7w웮  .qnĔfGa-#$ioRgfYiW)R<_ ԛDPh͝:XS\.,xifpFgl5ZdSUz ^In;ݻ jSݾvc,j7 R哳VՏ+* Me'^^p(HjlջQw2V6y n@x^} ٍ tdhٲځ3Ʊ uܷ)RCGܝY-HF9InOk G/Ha12e5pBSe'_d1.srz QMՐ!(C" ^%ctÒ5i^ Bh噏傻]R`X\S|ܽk1rCE~?z\%G qDݹ=uV4bkq:z|+\{bQ?z+f0}Ac8-q<83$bY"(PBh36@YUbȽܭrcX@<L)ȉXZ9 R5^eケ6A;.`Q#~UCX[9 Me}`6.DK{Of{=&IW'ؚkĂ \EO 4afm_#" ~PfGQJxD]#LbE¨bbԍ_D–Ah*3Pז~[:0WǜB=uk 8܄C8%xUz 7\ sNad:s|S4eȲw+hdu̦)S{#97}yl!ժTJ A%)I3r]`.12G]<9 5Y+j?=3x % ^D2uJ7̺,&x* LnF=I%swA a2NdקxMz^GAm,){;Mpra&dN凿6^2ͽvxDq^; Yhl]&]#<$lQ~\@@dsox q1NfdOgK }/ l\w72t@t%k'#_7;EUO+QܸEBhz\فUI`z֍(yw,ˎY߿bLRPն=[PN$*墡Dkaɴ>\ "Y$Kfr0w6]U%^ƉV1̐||Wf_ɛ%.1 uѮlw䇿 e{@8$QqrE V 6}]ac}54̬5n(ȹ&uˇvFVa-GJ J_XonG OFa"r9g\τEyDuA .&KeV+ka? xp-7A3es;G=f >LTo,(7V,[ilY(/7V T6$ʅOdCJhftcCz{8=6kzB)ۦBA~(p!wMma.ɁQ*oG?Xi%S1%+cUHw Lf49HeS֘RAsl2jViLq/< A {E?YUjnw:#iaYWA;bU3BI䐧6S*X;o-ߙ<'W6ػq0`_uSuatU^9f.ͰM>̢ot_HG ! ,s=WIJ={ӏÅ@GU$Jy;cZ.Dg[<]%`\>&O'htUPԑUXu%HfF?Ny$O[G%1,[u ]@zaU)s ioZك{6"ʕǀYTbqU-.LvQ';Dkvx3LLP0X5z)A;T69:0RI=P 3$4&xQY'C82J͉L)B~#UM}GpOjf4[)ONw%a[צD@LZ} VBaV$AkR:MbQUUJPzifx,~rrYn;vF:Q!7!TdxN]FhjΊm@ 9]c\FHq\l1fwӰ|4J?d2xի% RwN'5щhSq`BP I)%5?ӡN;_V 2i~:@"/W3vaw7_"!,me"?1($X5U "[CtB&TJtTL#'[]蒸<0w\㑊i+/RcE_>jVgw)Bfi>CTؤpEG!F.<*ʮ]v+ӿM| R|^dkeuAY><03zF |-V(&Ylr%򜔾(?{+t)1hLD;Tk7 jmwV4U6aِ;9>'Cdé~/e ҭTƆ'djW#gթ8eZiCeHS; ˲&id<%}ݤ,fq+"T9nC٥E.\at +GmjQ K͋#> DdrsUVkU5w0|4֜'u՞h~#w 0ؠgw=S3ɅJIѴLY8R82*kioدbu){4>+;SU,1H2 nTʋX*Q)@f8µY1~\z{q`p{ﶹ^bƤOti[).tN*#ݢ~DK?[ER~"R\Ao=(q# 2y8UYLs?٪w_bJEFXI7CVTm)޹vO<"7q#r'TU 6s0o@poHJuV8L)=8'x.ohQ:9VYBhAJST|D@L#5GRU@33=86=⽏٬yUz'qt8߅ˢKVL5G8{QŬ7x|jetj鸃|GѳϨ ~]О OΌ3D x X\e^BayGN![~Q?kw+"Gu oAm8 dj.̅u_*IACпrVBYȻu4S(|- k#/Q"ʼ'a6I׻˝A<XGC!Qo5[XB}?`NL,SJ!?#TX*gD6! oچUr^3E4>tu/9ia <,19Uw S]B"R39tO*;'m&Q5 k{K%,(3oGeۓ8QHVjXJ5LsmNOo,)/r$)Ep=t)"%1~< hI\T>I`4OϑFJT0%f D w sZEh7&$bU#p|J2}U`L6qO~==RlA0u;'g7%:j2-ljde G5q|5i3Fdðmy[ 8O(~_572mKMAgFOoӺ ~E5hCN<pX}oT001 jTl*Lpc>;UWSBlx\*YojS>YcABj7㷎TiX{tb UZʻ>\E}.B8\>ڿobP#|* FtHBCb!۸tTBK^$F$&L's{:&QWG0 I٬fJL%,_C\<&Aa=&&DdeO=TTu(,4Тe P&AZm3Ҽ6]D&B^avE$K˜W z}bOs~ȒF8Vg>ML⣭,-v aXc,k-J;pe6:<Q AU&{u}-a)鐷;A"s;fぎQ>Q"`\U&^@j ?|j0zwyY]{@P{A1b64l& ?l?Ֆqa$yMl +@ua%srkccSB^:icl|ػq ٻۤݔţ:kˤ06_IŒ>#JIpFssGtݙ_"[(OB٬pVތ'@I6W0@3_ [=T,LD\>3N0^2_q{3S&,K0^J…/?wcjyi% ;፟$|wBk ؕ~>05Ʊyf5(~ԉ{4W$j3|(M*, vwhIZ-X8؜~*7ѷsq"n]JP6#0[f&}<mA՘. =0j˜'#ߘ>ճA]v(Ǎ'98ώ #}5̚ {^ vm-$Y`r\̕=I1yX >NS̩k1.n6؆$ZeO 6YzmE&ۑhowҶz$q,,M$HO[5QIk&EwIj9:ا+Izd_sGHCvM_uwDG8ݗ zX ~hk7XV d pB'?#OA# ݧXZIs6NT0+QDE@Æb697ML?> pE^>CΘT{-}?NG;fv5X3lg|4CVhmkE>pItjFֵk -KVĨrp"ۖdšGtJM-ŁVd D=s QG.]NR%VX8`2(('G ^ %`,3TOUa{` %vӰݬ % nv;&ѳs+ۄ[ɑ.Wp_Gu(8'*WAZ ŵMhV2jë1p;#}fe7(ps4_XF~I[3fkp_P; Ru ݷs+^/SK?WSG彂{ų+|iCM#Exh.q,aT$O }!,j'O1JsxPzM 4N ?uH ʴaP=i<O}혶Z"S q];mMSV3ĐǞh,XIп 6&|0(L_΃y9֙QAEBqfwrZ;Q9%QAs/W;Wi?j反c827_Qno9 W=BI倌OZ=Hgt4øo+Pu_RPhGj51 Uw0 YzY us#iТ%dEjp$DD}'%zG_ w;(̓"HOB\"qQ !Ѫ 폐d߱LW<@_'Ru#P3#Cb)}|3U9)wLՐi?v+Y&$ddyY;mUļ:{Hj ztrZ`3־+ G8A.ф*Q^Yt<%fe"bDLؤ^m@ 7,WU0Kj!E& Ҵ,ڵqؠʡsAx#XHe0ϟ/Fwr_ܩi1g5"`Wo%0q0-jw{R0`gC3octT 2&+JuN^]z$4zs#@XT%=--] 6t&y3d .w'°Ne*өK}"z J| {{9.75‰bW~?〥U iߥiPJ'l5!ןB,cZ)_K3x6;(-,HT8 |ᑫĽ pa9@ޭp-7CX,r)Xn-r2fp4FYFmi}TٌUzj 01wJ<}|  No.[OV>z<40ʩ@w\ Q}R;bzLyʟ_hl7@k8 G>;Gn.YN"w0a[&%z_#:A|3nfa# `bݳ1یw5G89&YHVco2`h6WUl.tUc\4CEiSGp͒-re:O{$=vW?hC,ZӷEsdE3N9}uCWft3mS ElCIfB_n t׉zeaXVn~6G^OьzdXyIc_;BG6]W"j}h8V&mT=Sf $((SAn"9/ ~m`<X=rA?Ko_^~dr.)آS|^b}]Qp|G9o*'8*]=kPQb/-Fy(CO1@1vy%U OKGsT1p睧>,֥: }^QHB$kyBQ5ڰǂ87OGlq4$ Io9p4(ȷ}Z 7iI5Cj +_j dtuB+ 5%BZ‰sAV3bBG&٭V`%rjRhƋ eD8Չޘ /,}wd+߅P_>}̗opi1X}qV-\+ԛO|FՀ>/Yz]+^p;<Œzdxs҅ ]|#v𠢗d9O2a,ht࿠)HI_@( ;v#F u$ v%| Q22Sf74Z1{Jp'p[Ut1v~geŭ)m"˓."q 6Q(,f*L| j>tĥ4[]l0Dimjlߎ.:&8y:ے-.01߼[p/ҿK8pZKkp Yk,-|y] (7fGןv\c:mT^'jp;Nbxhc{y\b XM?%`yz[U[V( %N0A)⹌k(>W0i E?)AkPRG/J](i2`<֓\@+A-7"A&Mw= 5%( k@سpk~ʵh_=zsٝVn )lW?U4g€5KcލmFp#;/(X xh9AW O g%A)* ^͢S08jo?Ϩ3GOn @/vS.`"zeup"l28;IMw%4I/ȱfAC0jl$_qT޴\4:7Dz"] lS>C]vލN$6XqM3er9k` QBPP*=16>ϣ+fB +|iA9|k"CR~Ҙ^Kf+j^6qʣ},ޯNm41=ir>W*|!ڡ N.*xwoLG"w/լ碣=Vj-gBgv6yrG:V*81=YWr)F1|RԫB%E> H>]t.{o*pHRz}Xcnšt "ɱg#Q4|e;=˻eZoY]QM(=zN'.椶IP[^FjHcօ$ᯬd-`6CNCtʥ&w Y젃+>՟R֟Uh:xnAXT?"x?JrG H'6X$x.m%􋊗o3lY_!,o|gM]E2H8tݣY*)eo>j]smsHYf4|1* |l@A{dq{H+V/uuM̓NV Ru<ϲ}dovO7@#b27Yčb⪗)ϾkU=Oq֢5I"0o4/F0rJogiy¦r4\ٛU‘-NL < ,z}A w4tûC=9f|0MpW_1|vMOHI֪^Iv/e`~, 6#A] c]%8C$2,SvѨe572XQ ya5n YVa~EW2[BZL˛mI}LAb>S- לz'y=o-!^NGn 4nlUm.64KPHiřPYpR'c_aw0fAoWd]Nif~&:O{&ڱQǚϳ?U [8)FM,(p[2@6?0FJ+5_|0DNa02%~||'j7;$! &hQN9Au".r< g_7p!%g,uXڸfhcMX-~Dhpaii4wr:hM$KTѵ)) ɭRzJLmܠKs2fTSuP;/\U)"Lz" g6)]ڥ(Ux PL_Y~y!H4. 6+:ЭiFʬą7EXJd;F6qk}8=c`m#<$f@)W+MS| YL̎52]8nJSǮ:`090Uц^$a6 sAD0&7~EV4oYߨE/yIm Yf|c!9~a4彚Γ +a*Δ'!JL(vHzAItLW,gZmɉ>̠]H2)Eٱ%0N>xWyIQ);I> AWkr(؊"~ E6 E:H" D)\3Ù #Ys kYOKqP1\}Fû٦ Rb_mXD?g7UV'n#F$3kz4ɘhCF@6l\c/}g}-{k- :JuW)~LZET?dy ʀ>/E;͌=zInn 2VjL{NjTSdI1!w+\VZM] GB#/ @q?1ҭyKBRAa* p6,i20gG3O[W+|Aq&QU󕀼!@h奝 ӽ;9=*d)wݙ3V q"34.N,˙IAj*qwMd{ƬITvr|79Cnp5nS?i=[x`>`=S;Q2Evט|>w8= U@{I(]I}(@O>DSWdqsre_A8 Ezܬ^fq4(4x1ʖ]'`10MUCό!dHp R&ܞC[̴za'aRb:h u qKpd>Q|K.ojC7\L|M32&FXE`gjrhr,M~ W'v~aX)(F]iu]jJBCeo2F~L"2L҂LMPDž9gyOm%S&$jKGi[G5NybؾK<T6SnU&bG[~:a+óẝ)֍h9cKf2մ16lҼ܉TdκRj/Q {ůF16{=<cS0z%ܥD>`($W.dFapB_X;qކ?_S"zO p@s_W}sw/3Z~7dWuLt#67}%nkYW1. 3`G_6J ƎDB4W`VatxZ%Ŗ|ӇT z^FPf`"MYw$'j@6ripMnm{,QꥭWbWڦ/gAq+瀾!Cicg6̷.G,s8$DF"|$g|Ŵ; AzP5k)a-Oo`h4 tfF~^I`8g P̯-!o#U&ɽ!cSٻ60z#GBE#sU}9hDlnMH1W=z:v>+V&?d1r,ש1-~qŋ!+HU0w+Q9J4Wڢ8@%B,kpz1YLs \YK]l2P.//!O J衼K 6:tuZ.YH4h]oQnFW?#4 p<)- >1k8? 0dE%s ep1lg \Vc1ld|+*̣K _iӹD\ֶ%]}>< ZMu뷔ABst|#DpbH+/*vfצ+@Y9YrQmARNQ3U`ǕIU kuP/8/ xEj8zf.'ýQڶ;fhsqejF0 ,y,JMF.VǗoڿ)=%[7BҴ1\2Y@ds{+/ ^V[AH |@[{P0w@sUPXL'V+\X.ljˉ'crF!*^RYq޽jFZz>JPv/8@"OCLq&r*Lx!{jk"'őP[R*%_Y>sk/æBr6Sz'v@9;TL aE\aY0- ^؊'_g}S٥~;!L2O䌝F챌 ~/9-ޫhs#!ȯ7~6{EȈ-O ٵr~R`%ZĶX%Ti ikoiN@3/ -gL|\?C8&n|-`7#E1SJn/AM[r\Ug۬f A-'ȷ!A'฻ǮlfS&[c$乁N.g^X-Ηo@>{+:LhdB~UV@1~ qgZaY>:,K3gSwVx3#L<٤Tb}Nj6uw CѿHonC/].ea"u3A(DǶ3ŵF#S{A.NCp-H[Na [G=l/DK')ME)XHt`yΒ&T?VL5]tLyoC@K+ $Yۻ]KRHâc%={Jz8j}zBR$%vvb\tLWF.Y(&,fa%s 5dsÙTt;t -cRsHcf?,Fq/]]]]3^ \ëh94} r(kڡ4jdGd4u-m L{g|Dg0LT{RPylŰ|#ǏlfVd Qyz `2AjoʔMVD5oҵ_H &0OH" ͅ)}Me/1層,.K1c|>Vϑ-xNh!XD= KuCAɡDfzb}LF Bޥ@rtK\qʭTD1+@8mrDF݈!`"{Vry |ܨQäpN]φgGa#{f1 +@⏸r) , ,P뒘%f3Z>qot/}9CiSE^YD."5x)U=''߽ *_O2~ 7n n.V(D|'e-#{շ/³D ײ&+PH"2esl}y M DN9RBu=]-9XW-T0N(~2 trNcKJQwF4*-n2%K񗽓Q@`#iYnr+s1=ɥ R>0Xix0 e׾Af ;v1p8f8(XɥjOŊ^UYi3D4۲d_`dng GAeQP_?+:@{#r.t_oD.Z\?w9 3#gahA1!2>{#t),%+!Y2K7'u|G “5gj<(lA;V ˥,JݪDv; %ٚ-v^Zs2?4{ K*6tkVZ2Bh_b'v|oj{!'[ti~!mXwom0baBvp"`2֋cg2"F«B sLOpx ?vi\\4x3>@ag.%o-+ʤͤ+Z_c%?~KZDSՋkmFؐgyźUt9b pŤ}Ts7ӭ, Aɯ  T#\\xT]AʺxFokHU _15W49]ܒO@rrQgFSM>Qwov|!w ԺY=Gn<|Y5 T)sCv`T$?<6C@~;]+*c330&4G%$Т(Af0Ruj㍀*10Ծo+ʔmj4\*AFSj'2m5/=j-C1&W{Z[>{j70ǰߖN<ށבҰ㑾~nJ{'&|?Ph|ۑM0?t3<-f|hifq)+Y4p{P@+,|dalEGF)X(*ao 3sT64Tc$2(P,[6PPΠW4"9kTϐ)p)nubpM*Ld6{G>9L @Je7<}r ++~@%e@}K5aqk!((L D2  \e80LwAG+9LƞfʧȜ6c;OH:pA i?I zV`~Q1 ܁ B4)!h'_fn73IXd.C?V[{g`?i-F5age^4KAk--H4'A[EA67C􂔵}tGdĉ<5`ԉ`6ԙ{+j@&Gux$8 "l7/_a6e{]Gnt~^S)‰hY[6#э sEOkX,&& Vn霂#rbyH b (W6: NU4,J8#ZCVPv9W뭸\v+pJx`K}-s7%6 HA{$FR|#! ^9]YPY(&J0uM}wOEXj%uv>7{5qk8 U_鱩^UA=MݩNz(bSa稇o}.dZbmS1XisT \5wpu /+԰ jt`_3*,~=S#Qպe!.&lOG}[yʋP쥞UT eZiJȰ(g  (NJYsųۮjΛІگxM8~~4N5Tkx3ʕ!N;̃XEA.}AM}#o2 ۅZe?i —zɆwF~z366Yҵ׼=)yːDO1 RK " wm\)sL%(dIJqO 4ZU">nQMH*69 ^~H\9ߊ0?\@qo[Ѽƒ5WVA+D|J%qN@' a母L t#qy;2KFvc0Qt KMo[ ^ UYm  lۆEz[zG3)~LeucQmO*Z).aLQݍ (L>tG~g"j}o$޼Ă\Ϊ9YW965RWBKXܥZyoR|;r&._Mu_v]yr|,607_֗`)8nN>  ]s (_=EcXW52=\P ^mFl_] ADϫ>X` U".",ہ40E-.E !=!g n?6@ce8 ^hTLv#F^xHY=Vs"i#@fɟo;Mf*Co",D;Z =#uap $7UIؖ3@$d =/}SnFMRWlڶêh2s08Ә\ߣ 4bL CD$-C ď0[ :Zӛ+AS_*цz=r7|I-q"yoA˄|&~`7LKq{,bVI@O&WZ(KӞL+Wccc#j  T O/p[nRAW>rTCmDoEM:uz2J! Uɤ:T>'6fG}e}\KR.ҳN'ъ<ˍ9sw,ҫ4\s,Ms< h虅 `Ak^0wbGt) 6Lnn o@O*jp/Qrŧrt[=MuSC=-IƭvGZ\&0(١`}ք1 ϕaA]pck~o|=)8é|})^ǹ+n@9*~ةei5{:Mmz WQ)F!?;f:q(̎I&2{脠Pg1vkMbhSGv]Ҫg\`C^rm[ȏ1Hs/m/`)LĪiqB "~EYRc52n{œ15E"\ŵ8_f*ae/qH=sǕՓh3.ZNhiiP+0?#/rWWLvP?,Ɩc&HCf2=b _=gD $fR5إIטTU;BQ⳧! /ٙdHڳ?~.ŧ.jr:.b!擾P"( H 5!s_]Gbqhg%YBO~4!-"U9HD{m3r :|5PoL<5nn]ebY[f~?-IMJĴ.<& nxpw~Jċܗ #2QsVߦT U1KZ&֌# +mg*݉/o'(fK8?}VZÛ,ީKcHauX눽" &1vԺPI cr5.&&OeN y4 re9WU쑷}qW'mICBTV]/g Xfցu5 N%Oos.7]z o%v_ =$NLN E3_Az/ 9RH8}ՇA)I2EE/\bslZ,F!c~`)g-cm+ۊWXN%:~Cn3èUM~lE׬^\əMHkK^@㕦>Փ0ѐV҄V}֒1lu#M:Kf.>8́@7 fUש`;at*?X`L+iʉD -4ۛ0n2(q >yhۮE@ {_YKc<=;Xll|9;7r^QF=J2;aGh䨫d'k> `V{{C2)e V-}0A$0:h5:sPEp@ݦIfd9Wn5JKpC$G-e&s2l ѹ% buyI?Ϲ#܃Vf(WĢU>jcioF}"<-ǿ;]B唝iXwrr#mNPL 5ǤqłN$vUa ݲҥid1__+TikmmfiL}C0cfs' ,B>ܻ)z1%~ӝ?<tUaAOxкDC&hL>{$d۝Lb0bFZ4nqC (T#]0j23gɖ$2?i$5yhU34D3Hѓ|F&2 Vn-Arx? ,ܛDA 6-1yqQӯF)7Nt2g>x,+z ፕmC_DF8av,w<RtZ-,,d8wÖb`i 9A r6J<:f9zGYy8XN6<0ͥg<20j8QhWq\qv:<\Gh<W `*@,5wPz/s }APj95iN=(EwfZ7ĹAON#N w_?b."\ht xobg7K 10,Pm H"M!m06~ h+ڝJj^)\ t2Sׯ &z4a0\FT>h˗ef{Y#lw?R.93U⒐^#cLFdQe*;>+RQpXn9ҕCt=e$kA.Wk o'zAV>ZU3:i?qnس~q~̖;R $=ptD>dKȩg1hFi{+U>qK]o?ӫxh9ni ' zHaګK S(c4k` %O؜e~t6)sk"^<*dV$O<6I1SLfDgZIUQ@Ҥ<܈y*Q19J x U܇}{a]ƳBѾ<81kr?oGKWrCJ5a  $!%C4!t`f}٪QRgWQ0qŀ0nآ%tMnݰF/J/{ cgݏq~;JtI#"eV¯T%#'2ek k)(pqx z_>b[ƫi'v~C ESDrǁvXX7(=S-;ae{?eXߗ7asMq(\p 8$WT|ቪIuw%jT8)%? fr~ah !p 62g4,Ane-^+A0ILR$=V4|]F*_q~(>^BfGv:K(4ljawT Sᶰ š}#;%u u둃{<:|z%sha@ a\u-`OkZ _nbm&o=:վaoX΋x)I~ Lfe4b$aҏeẁY0ƀKȤE;cF I|JJ;gFs`|n T`>H}^; oH5 # X<0QK^#|| r_@ 2ΛGINQ{PU6#ڮt)74N ޘClpy яuJtn,7]\創 ߵvۘ^.1 7J1t\^x+?%eLyG=:n='XbY禩 ~Zռܢ"_~^*젺_/:L,^j pBNʺ'd''}~Aic);hCkx#DNGu<6 }*L(,} sF1hli*(ʞ=oidAMqϔX >)V*l=&/ü̜~'J*V\Dz՟5>8ƥV ۥzGvMPqS687'yY^@J S}Zj[}|~밾:͈] i>zur5b  î#E *Ckn JZ-(< vЗhz)`rg*e4 $!zDqGTB^TMXj6SF"=όMfK€nnsoq^EGZ(nA0kxA_LpkP_g^|2MYE" L؀_=&.3UM3FVW1^55B4#bܨvox۰K|jۮ-λ!K>DST -ڊxRv) "nT  \&ҋ/YY)IcKqr9l2SYR&oo5 cL-6GemXnm rYt4yb4ȠnMY%C֋k9u^f@fa$5q,x|`@Bӊ;~'Es?Jt#Z&Gl:DCN9=lo}TH!2WP) I&.!V,GJxxL6sU"H ='!a,)q#\K+41"*+q\QVLq[[qj|آr1] -+K)y4ڝXㅹȥ_vfR)$F05u'dw@Ld.GCQw!察|hk\]1zL5gRU}3 І`D`?CA0O_gT rml/ Q?{9ZJ],8TkȚ]w2?^A( qɌx%IEC?I ,tԍǯ;.gDcBy=6JSs# gx iLtk}.M C-0Ԙ b}%SôkLϵVLIA;=I{^Hўqb`$#qTⱃh.vC[Z܇ }[aUrbw+\a6Ce =~U%MEZc-s&&ժbQs5m3?<,m ')&QzWu[2A:!= ߫)OmOwk*o M"(E@9nm83k9H![[ CZCaPަqhIZQ^JC?kƘ|9݊E4Փ,掇jlp鵝`F$*8px;TbIpK[ fEEtDv:0BܻM</Vr]Q ʖzak/*Wʴ=s_)ch32nd#i kDLW 5eQ:YqP? 4ʎN`!,D/#Vu?,I<"ྷsY87ec@ U=`!g(AR}?,TbDمSiݗˤxȣD5J)mBML ccϭ%!5G1( u !M9e ׷$Q|D}_ng'N%R"ppkU*"ZP A[U{ݘ#b%ÌB\)9d=V>'ֻȢ^4B(wh5 3 L,{d!.dkQ~"ZJlȶ.\T0т9ps-FrHxP#v̮!fV ~QNN>ȩ!}jOzx"u[=}jjQ2Dڑyr- z3$V\ 1V  [I&'}rVR'BLиo,)X㣝]]r1k$?o2-)?Ib~sfuR8Urx╴ hDzKgl3W!SM]ZAӇ]Τ^>W1#0&tnC֕h wf?+Vuh?ڸ2`۞D_ F_1*\-*V{_“'w 6dPsCouB|.柸:ڐW{\J(CWI@ۯsm SL…LXZM{Jb n+]AnfZ_.Օ3fp  kJer3ѣAn~OCqM-F`pġ/hoKj2~mR1UeZُ&eA)݂33 ,?H_EAᠩ |hNl|0HFn|D:Z?F._ʹ3 jMӞi=X֮V" (%%+.G&4mgM+Wl*J+q-trboZO 3{"=zDXPLg__[;y1Zbرs>;5_RWNavE(F ]H9|' LRGCj5<; "A9B@tkm=D}s~(ү,>j&"K>WU'm dOq͆}.9:7 2ozb{kNjlm>':-"4} }Bg^] >ҡJ| y7N4MwH\qiO9\(?)^ 8\]_n"!W"rq/ (~6PGLmrgp-fhWuKr._6e =#{~W`G {+k9O7rwLN_Ӄ[ >(j6A_ZyD^;YЊ!P6 XGY ۔"iBpB_5AodpFcy~'"5{S|,9.+IX̋'<跔ܨ\{13X08A窳vqOR^0bQ.h ~6n (oQFqiN=MOsEI %u< e)@[7:7>kx/G@ZrίK &Hv5ۧ>ZMh?W;<)8)-ƶqc'3Cx^\7>۵:KbMqDi_/` #4![3OLe_;LD:B)$QΏwݨNotO.3[ C=jZLcϽJEvpbJE2ہd8$E u4#=;ScE=]m;t̐ fD#.]sݖFSه\$H >? $.V5%F;7"SxՒxVݠ]1& ,A+yFnzPBr?ϼC4ET?cHbU_w ٘Z {3p/{e6~rb(:l,R@y0XU*S7 )Q3|,܀K/!\7L4m9^@ ԨGArvIL>&iUm:¢j/q}eAh#ye\CG5w|A:MS o]ǹĨ׏_?GUWL\_FBj.c$e>Ĺ1n] zaxj'pv ͻᬙ6zě(#=5}H@a$) /TV-N >bkjQs,QMH!u}ä;HF9E.a5n[dDyE`01#oQ' V l%40"ޯqݡ#R=z.WjB)7kvڜ^w cܵQ6≠6zpaQ3mu.o٠NT4Ȼ5w&{c]`13x ulgbiշ1?||e p|q'"ȾqGR-OӳԒ^M~aD U_Q[;eʑύ/5cDaf0^q^އ"l K]D>*39}$3x-uI8QBl!_Ψ)Z\tR\Z0RbrF3p bEǚ&͘(ʽ6#Q߈PRDZ޽nH-g><ݹ-dMM'“XO Q`U6w$k7, Cbk:`!A+ba% 4\`}5yۖ`K{%'u:{|)fybJV<]7 `O#nTcfҪTQs$w Dr )Eg*洩ykPVu0=S=8.*Wra~WsW 1AH9bt>J1dl:P"+},,6⭫?z9PR!dQ*i D_-íaZFfbpUB;̹E <t ]w~o.H5&]D| 10+#ʁ㣹;~E/kEсiG( ʻr=;ګSˇ򮤫t,LM> 'Jsw#3/܍#1 gagq'X}]q÷>3 -OptQ*?>;ȥ2FPp+%8]V׌FtiE( F5rBmfWʵqca%EI5"Ե NN4euY10!F}W~B𫚋>~Mb-ހY}G;@+Wj|~0.@^ODl"Rri_ˬgOz!R0OyJZv\;efOD}S T3âJTh-%ET'pҷrfuZZPpj„ 2S:4e\`BJ+"oB^:eXe֗`(JYJeHHyK @,nz?^įcVj3ȇ&"8!b\-x,d7nxJ{U2DWL6&Y<\#`Ԃ拾"Tp_ TB*BBD@>4|so&1D agaU_MO^dv22"Ӟ n}ē$ cf7L-"/^ vmƛ5۾ c`eqQI΅[Ě;\cS[u[O_S+])BT٨VL^4{C%9nY$';9$c(MevmMiΗ39FHY-ci0sG WrV<=`"+z`.jI:$RXZfAdHİF{̰׌$KuOH֟TOl%cEk#^SgvNtߕ30%zKn{-X+e+૛' ),!d&帳1mRR䊝*HCUK9k EjG"Zq4^kݫ_(56kEPO|'\;2xyZzv9#ȯD]Aw4ƾ;-wR- HlgOܐƯuf Mi)TQ-INM5Ϳ? (gb,MSW/#7r߆,f-5lO|ї5ʇj$_5{3z\dȎ:#ZfDu쏥>w0ӊ 7&y@ BݜMOXD<SVNw}2I>hӎ1*>$ VbM?mAMg'EbcYM;Q9,;%shxq2<ۣrM[W$ >\kƜc%f֪z*xѺ _\^ 1xؖ$T &b'6Q0r#IA"x~6nz3;b:,LwU #rMQ}LL4&@aS DFARhtFVF;VNyڲVb{vZ]ݫOsj"w⁦_71]i7Yh!t VdO=RNW@R@0I?@9! !hd8vk9x$N3<! qB{)ru*@$Q OC);^A3ޢ F_SNkwh'̝^&ԐVh>&n|f]N3Q8Fb|zem)GOШO4(&n'$<_^ E~ >ZOނG J}sEɽx,'XMnm0HVMIU`BF;zIyO9%L5?`=kjFiR}n{滶6 xۘk- DP\=ݺ;M7*eh.|@mtepsOo+{@Աn=Z" s!K' ?AeYcwrRGaݜR)'fU?NQf|U~CR®)u|LjCdQ֬%U<,h+NX%7˗D!wMc#uI-XD'/ ՍMߩ>0 YZgstat/data/meuse.alt.rda0000644000176200001440000001556615162303122014702 0ustar liggesusersBZh91AY&SYm&hHr O%wE\ r YY d4F@ &&LOL&A='ɤiCMF20F L0!F1Fؚ!JEUU?SʞC@@ )4RT&i00 L2`#2iT *i `&&F&)*R`!Sl|9/,00r]=RP {l=o6Ac *ϑ,NȠ|h[)l$f*Qf$%a=Gtܡ`HfMY %_!fټ` 'VR$\$.:|X§fgX]+g+_^ W  F0e#uU<Ď@s!쩓kxѺr_2x cled520J&M(&ui eRXNfgvL5{Ff>:Q|MkgUCRIm3B> 9 ۾?;_?7{fScF%2EcP y)$;@@%l֗L}isbY:SNGɩ99D|%'"TR]Lkix^'C8|x|S6ÓwLm.JH'Jֿv*^]U&㏝XfaG/Gyym*'3B> }r:m[02VFDˉ+z}W3!KK_,z2sIW!" d!`eL->|֧{#k ޕi}l:$>f  ߁VQE%&'7VjZka[oKY7^Kw,QSt˚sXWJb3B9qxm%,uɌKf拏GP`]%zhZۑ¶HRSj1WtV1sF.I(j 5+jo/H8جR, _%-\}:o:1;x?_.9-8քw\.cu4nJտb|g\={]< $@I$""(̮JR.KNqq]u]uݻtt]u]%@dwZֵk%@X*iie9%)a.v5^O5-,-kZֵ̊뮺백%@TJ P*%@XF+z~?7۷n߀)NW NTJ P%I)%*I];PpֲV luؤ%K;Q~y_yLٸkru},)2U$ 0J# U*5=(Xz|Ba|<.3 t۷nݺ%@2+Irx{YeYU= M4$TJ P*%@ e9SM4M4) T0ד뮺@Z/L~b0`6TJ P*%@TJ߿~LLKZkZֵk[2뮺백TJ -zUkZֲTJ P*^.뮺KTZֵUXc-sNTQEQE %8!$JpBI$I) $x"I$#TKg9q8_JDDU?q:V]u]h^E-QE^^h>=M3^$Pи?yRvtofhpFI$N$ &+#TxV9yԺ|yYui\ǔ?;wt S+6U_hfqL($%u_/=Rs KE(:Hk(8]>~7,zA΢/<sA¸:+ʙ󾿁턣ַIts]5)\6v,t]Mٗae*s6Rb]e͋lUPXcvYkMMؚSSQtjW`շw\]VEmܳu]֕1D]wV&C]sPhMw4,XJMXMuVՅTwutd5ɩ+DPa_pդBj,PkhîۡR핮n;m.뻺:l";h4qpA }Jb!f叛^z:*V/o$[737eb{ym":D94Эk;k;A8k$41 dN*ֽfYuYUsmݧ!aڋgjXEo+{aRvSa[26Z;`VP[Zt-J۽125a]ex{d:Ckoք&tաlk2uC/ 2VUˡi&st`}O0nͽ5Cl &hm_7F{ܰͯ|f^]ˠXlꚣ$l>UUayhS(XKm6ar ;|ĵ٥l ZE6ftG]MYVԨџBumjxܮ|-.N-ݴj ^1_:q+SB4혈0ٜR (̖FX@$^aٶ\Zh5E@SJ: Y$Id]S=4Xz22&9`eaUQb#;$")sJAA$:ty0!!(;c) d2 p+Pjj"(G EYU,BYGYXYBJ%*E)HUfZb^ R ,,"IHg0( ,(*ve5.BC,.*4f3%y8neowKrq37];MszWF m 0b.dAW,;wN_7ϧUvȟqe_t͒l0=_T7i|mz4}+lS(Ҳ bbW&ꂣkP/-;1M,5jMcn3sv3PF [-zn3ZT!ƒgWܭj) E}Lztʂ  zaaaڿ l$3h%AA2k||K˗3}TƶX\ym92>-="F[&ӹ cJ{pG|ev^ K\=y#he'`x0qu5}; b 03z!UMW!㱒is^5~+g=.?*vhƍR)OgLp4}9KBVvϗq[:M 2Z/$I?"[mI&Y+*ЇvF %l. "QӮ#LrevmS^L1"7_MY(g$ iyBMRMR(-J2ePb-Q\LUuu|k " dD UEQV"@cGޕ%FZ1?Y>;42Ir[^N=.">cLn^/ab' D@x$Y'wƃƢ_ǕHdPʦ1;yjҨh׮{+X)vϲZx C)1latւZx^7g\>}˦+`l7&Vjz ×C,3ƹGц߳dO:cPmK3/R T$.!`{GΜIwZgagnNL,L^%~8I: Y3՝ߜ4iw~ĉ"ʇSoYv)2>e[*fJ^|ahk,bnfRWV -ýർƙPiŚR8};kB~!HzH i&ςMS]uVS MA$NbPEB)1W֧lo, &a68ùCȬkipo3ݝt-',hyuڳaLSPM1i0ǻ{6}`L礪M 1==nl!?ɜ-0 NN:N@8h&zyٴ˦8]o2tŦxuY9*>f$"(HEtt6gstat/data/coalash.rda0000644000176200001440000000161115162303122014401 0ustar liggesusersW;LTA}G' Q1)h6(1FƆƆclhlhlY 㛝s`]Jd7%ٙss}N^:A 2tJ'3O[ r>3WU^w']u9TKelرX{klGCZwࠏzj:jr؋ntL]͝>sk٣j5e6~`rN(f}l8֩CZF~϶7 _ɏϯu6Y[`n+߬Ys >{٪nU+-cӫʏnc*!~j-{\ճjkc3cS7oocՅ$|'܎o۸ȿ8|~8fU_h)O=;6Y<} p0b&"%' W"y7[l d^;%;Z?Ϻq |b "OM&?"Գ9++ Q+'/ċ>Q4}$x`4Exx3^E8yԘkMR%W:.1#gJ?I,B|3xE=q "!yߊ8S~"}w :[uE2.8/x/{ 7F :uA< /qqOC^%D= xO;P!oO+*|gԯOϦLc!?<կgEbZ^ytv! \[{0 ݷmפg? gstat/data/sic2004.rda0000644000176200001440000003614015162303122014060 0ustar liggesusers7zXZi"6!XW<#])TW"nRʟ$dxYFg5~ bڂ0wA] L/~z!GmB^caX p@Rvy?J\7>W#lI\z.ciMeTN:J ;~&*}|^U}= ݉j \i+ /ԝ*G_f6LxUa NZ `Y=ma'S c˛H668zw4FhU0F Ҥd#.*]CdD̑`Y5noOŰř" 3g^Ou$Z5Nm#{6j \_k}kA!:9s52jCbU)rU㦹`q,éPvs:aYMZ_}6dcw[+AE}HĴEH@5u. Y(0i=x֍ӡd[Jz3S}0Yo@r YDb/Ӹ d%gw~fNY.R^NЁ`U Iu?@:廊cu*JX2ъaFrxz&Cm%A+ok8 -W\6mƢ턐D'*Jhgo@0ߵ5=Iß`Q*pT GRlp 3MC>x-D--s~Mj4܌߭Z vk!<.!f,q2( Zp;c>*V.֏"cP؂$j, Z\Qr(Jw\T>~<fP-iNPR HHĂsIgSosy3>p4ꑞ( /MN }- GrTmv/sϟQ~gϻoK5}(?9ĊAwZ_ zRr{^CcBØ\UP}%Nh >(IiUyg&L>v-6hgv̶p|hNClf&.<m;ckI\/R2eqeS`jg>Od9%S /^"Oyt&[sFͿRecU Gk*>MvHOXWpENhx )Eok#(~6Jf 0Z7+yFv恾elʋf|i JAp\jj;NS;䝝uxsFsHr r^=~! GqtMq 5`t= 7nӑ|e*s7.|C#ZfS{.^ l]wұ|>O)ϼ6Ɋ&jOX*[ _vE_Fլv~aa$OT+gfN1Өdep."YdαSW 19\(5|0Gesn(խia]?: },Χʙh#8(7xll#5?;UmK.,A$R`IiÏjT - ~|oQ>ȃis]Z3o PQUw]'bemq}#IYxr,0&Epw~މ!8al ʐ@Qf,V,h]hiN- _gׇ4KPJ8-ΨWsԛeï!Jܣ9`9@td!sEAm5v\#ІYyriޚip&ETb B ps1]Ma˟hiN8VGմ!Tݽ^Ծ<ӯ(/=jw0ASֺ1VhIrT3`I %n0HL%`fɒ/Q*BsgI3&;UG'¤dehlnG ;CTU9DjX |\8ylN.gpYaqߒrÖna߽|L,C!R +Oz@ޕP%:"A|:a-9i♣̸,ܼU%9 tk&ԵYVMA AhRt̵cH+;ZEO&o.y}^2GENq]eD[Wj` OUyw;3odnslo*~DQ.u%j^Fm+Kltn.tEr"Cd9:oضmml';*]vŶWvL`O~r> *2iL0$Bǩz!gi2\^@]4;ɷ,+=]vT),u `am墮]*vDD s<5uao ׵?}gfYPYr(Q盩Ad*;w 2!¾]ES s6p=QO@砚d> AH:)̛,yZ?UxHHR4;B*V># =\QPy5\\MeeY='KcבD1,L eO<§K6*@Mz%-${ 𖑉 }Ѩ5]yxnCf٦J<ӱw!Z@ܻn3,.zU)^CUoQpP^((ReWӌ`;~F\\nɛ3FՠJTg%9NKyYyxƜgL0Z( 95eLv S㷃w Rk=W%"\u biAU8 2  br>^lrL0u2B8{a >Okc!%Nبw;C/JNIN'Yo\U0uZ:*]6."?%֔%6& SMNEA˴4 o$ $@̥EylԺ'O|7NQyi_bѩr\ϴ ),ϒqTgh[R ux&y TDAxP9^S^(Dr='Lj4uw(8@}!UuX($.G^J ˋqa-IhSHf6#(BZi6&<`#-8<ȓ,!Q( 1oa"z?Hi29za\8 J3 ï/f% hזi}#|0' YH;8j3J5==/Œ}jа窝ƗHY#EꠎmF@ J?>gsvxK% d<^բƛm~b0i.haRbs R4'~M%%<o! |Q>B6m1& h72[5iwbs7ٺ~M6j~Ɩt(٨SR5Rl'dB(QȴuRZF*H$ c׽ pc]Cwo=&* jbk2;.!&+E5l$@[,9#@NQƶ4Q<DŽ? RJ*1%,plg 3Fd=5}} s66ܼf&pSeã'G!ZK%$&qp` @w=oȔ8W<'HĘx ߜ)]|1I:fӃؔBfiYiǛ[etTg?^:1E74_=y}ui/ &VFi >9 UH=w*'W`*Hid+ ITsrȪA6 y%KxJ@sj4'Ю{N!S 5<P] ^&Pz^b)ȑȗߠsuiYhrwlcoLXߡp1CͧuRnjܸ@ dNY/]$Z(VpYΪ,Ś%k)$3tlqA*NF' x]}Y[>¹ɭ{Nq׵ÀUËi^/X 1P3Ό!^>N8+n/E7}cԐ᠑\!gN~J:{6l"hj]tR̺Rbizrf.Bgkl^n {Xz¾!“T|["ϴ bV\6:K' !/j FT^NctߊSBG`it?lUiC8¹9(fGs +NRܞ&ˣxe)蕋l׾D4]Wk_)A$'Am7ƃ,e:-+DG^P¼B}k ;q: IF oHsGEĐdVe*n֕Q8Hb2*}pf 'Q'3g OK=c8q` Ń`* +2獔2~0.PVK-u4LWius!& *;#27ni߆9/U躄eo '߽y@jP߅Ea*ѓyANq|s<J[5x6$ +Y%=mAcb4Ϊ1msyw|n_.0x{_(Pi}5` Y`R#w.wJ6|/"`La}P{p-U jyi5'G+5wy݂aS] |H 9[7BJ-_pɆߣ֐0}{̅b`^7sk?2߶tbH: y~c8~"Y)xXWKCo Ze*Fn{,zhݼ(o ˛Jn /^]@vrmtXK3[p.`ylZidP(in w,.q6(WƏ^1 =:ͱxY}+'wU 8YiyNVv扅DI5&@WOuP6:QhCXߧ}$hE9"~[m쒖h4S`.OCE7?dਊ|ghwȘ15/Z?m ej! a9\MK 0#kyqKt.hۑfV3,V]3GLaVA/T)(Y9,mc^'i+&TjKMKԏeV %[k(:1GERy_J-qa`* EN2i=dtCcXn+DG@195Z&֒Xz.bx"UЪ\ַWHlŗx87DPɠPl.o ɴ:%U٭%ZhkFN4PMb :I]ŖsbF*0Bk kYyٕW5|RZHNG bĆ. 1<nt^aKBy8̙ \Z4ME "E9Ș-n29 wvJ,DH4^ѥ5$"!~ijumWpJ8ކTaSNFrNR`K&Se{|?Lғ,h2:Α Md)&EqiG<-~EDfJ$љ>mD]]6U~ZX/XT: +R!f)wvţ?Ӵ`4 ^\C!8L:4ٲ0uGp T:~qda3ۉ} .Jr -XS|sFAN%k_FԔTgR$ /43Zv(Ir"bq<3Peyb:%G).[SoEM/=ߦ I/ݛ1oGVH¡c.?tGu5d(;#T8&ݟ@C~^I][ck Eeh{(D5ۙ6ŘB"Q7;iWq4Į{^\㬂ȢƇPh;HY:z ,˚H>7vNn;gM^_NY;m/ SuҴ|=*LpMi1~Z1*r/߇Ĥw'u(:BTjڣ22KG4q nKa\5:aN/) ZpI~Hf|0QH}k_WT2ÿRp!n?7"d[G*zYZO78%L7=oj$UNyT)L(V琚ѽ&[ uW,$ 2ŸmuYraDw7 Ey=n<[B4Hȟ7DxHe8:5-GI+[TEr2O$sd 6Gf%qO|6lIJ_w(BwhpBnv>MZ!)sk=,}Feဘ$bM [^5.)z b;,k/@s!˥Qtv8B6&DH:p-Q?FLkQXcĆeRySٍVO#~%UA9we /rt8x+Ą!Ý֕16wBH?HZ\+fyČdpTNTM<;U^鼋y7+S%vAMGF<3值K$i>׶p ,j8E+Rv׉BR:c(|+(('\+iZ#8f6m7)#l(OSEOfUy976㍱TDkiOh;D2`'V3HZB,۬-$'Q2<کhH%YVw\5t)a>zo_*vq|3 nn>ͫ{ pvAV%B~t0mi!>~t3ĴmJ1ˤr窻+u2{Tv\˻>GtDpGzds(53ҁn'7i[9C\s$TI d?bDvBl)=;|I.d#UDoY'.u|*ݠi%&~L"$0:u*‚T/RE)zC7+r'^=,ӎ%o'1z]MVLɗp^.\1L6kp@?)cis'c[8j24IXˋ BxOoCoBǷ&ԹQ&RGl hnnsO3>`^Y@Oq'?I-/*ɫFTd37ݙ0K-KlK{`X?N,l+F[(2mq3uYP8֔i6=͔ I14r.kp$*&|ZǴ/Rr$LJo4zRUٮVEUHُ)Da'{pCgsL<=[H>YlBJ~6.U _AO5">oHkEci!įt\b܏`>wF]T2+6#"R8;`KUS?:tVH2% d(9y2g@DZ!7uK)?mFsvgSSG16!udXAnd\k58%QfO7?:7]!H`kMeЖn}eG]e+Χހbk K֦y ՞3{+O!"yVɄd%u9~}=*uvLgHfQdค' ΄L $I=Szo5k Y|"z EwȒxOLIn$4ZS:MZ8T XCs~B[ƹO(([7:b!W| 9;&Ē4YܰC%-kIvV:X#j*0>g ԅ2L7|VRЅRM!!Jƈ )7Rʹ҃I d]"'aəME0]o0ݒ%|`N^0NFv[IS[$wDtk`ٱz9feTHs_r]*\oah6Raɏ"R4`%> [.㻶h<z$xo)m4$%E[Mr=k/ ] %oL\nAAuiB#!U6 ݝl3DhOIL:O ڃ,M:UA[&HVHlaz;yfU}3'}]]d;*jz`hț={[vz2,ek,[t¹Mm3+<\>hWVtV628F w u#ejo_+Ji!OyM71~̮a6ljY =%t :pDTzDHF@Y\ȴ R.mVKF_# ŬNݜceFSYk|-iZ`نUTH7Z)#d Bd뉛XwL6H:Zg"XZpttQ=6{旻FG c)`xw8ّ铋E.Qo0H*4,3m}e[~-( g̴ł!Wi ˳3y-seggT:.pŶamΑs C_'$hkIŞ_ig }HEN$@^{4cōz!!`|`黤=Fajid*+wP6 rCqsƨ&0~j_N} .e^2VT&L6#ME{T5ʎʄ{ryΆZq:Z#=lK=BHS|x#y8fq%l_tȇA zh~V+e=6[)Ya:O%S>0 YZgstat/data/tull.rda0000644000176200001440000001152215162303123013752 0ustar liggesusersBZh91AY&SYHoI|i‰Uo^f]v}ޅts-%d Mz4OS4ijhcSCɑ bzԏih46Im)zS6 5OSMA̦ 51j=M&*{BSy g?T=4OP4=M4zCɠ=64 =@zjiMP@h 44@h=@IRFM 02`LFL& `#0M44bi0A&F0ID @C@ i4hh 4@DDCFƣ&zS'DzO"6i h=#2hњHhh=FM14i 4 m4@lO;6TĿy&xN8C f^3 sXB*@%BqTCtu`kqu%q7”wsB:V9h1cZ ! 2 PPPPPXXd2 .\fH p)|T"!وyH竬 G$Behh(*ҫEce`*(*RkiXQZe(%-Zؠ5["2FeULp@z+0a,LP^qZikE!m(m)FYmhjE jōhjX[ciTIL!c1"f a7Š eۊv .&-ew !~&H~v6ʇyT_\6Oڲ,:oX|oyxME׽ t* hڏc.E !` ͬf;ݳ3ZF#n>^kםS!dW=pRS404f|~!:Hߥѵ-4='XtXWFTvhؠ(7wcМ9 8t 4 i5K9iN:Gsz4:tA$$>ua1/9cMiIO;`ؖA5G Mn5kSo~qŁݔd@$q#˲)9cx$8ōpe\qS 2 c/@@˙bp&922 aq,"W(QV!. D$UR~BN"=a6QzsѷSɉ\V6]SsN (.CۨM!Am ! &I9 HB rշ679qy#ZJy‹p|?䩡iR!#vhr@72e,  "y)r%fa/9(Bف M3 _e0 j]"Zk=` yY%(p6t;^Mug7|$(Ggp_Cأ]`5@?Ebݍ-ZYMqZ7T"*;Q'ib I*BJȯ?8j nxM} ^BNl/)&wG@/N f=Sn'%`@Ebl $>!Cxrd )^r=4Q Rim39n,$YeUq,]6DmzقM`C7V! Lё<@ U)K/6a@  ^+]&Fw̏8(s!B@܌dNhrk3S&xC~5Pzt9m&8Z z{ׯ7Җ7]W?8VޅD B@j #yh Qmv"HdX E qHj1E"-`N!jpd*(%d[ +&E+ &0 "E&$PVLH X-I8M`X WYN$PY ͲJ³PFRe0 KUHbTXX!kY1Xbxى&2m)R`c ()5+PU! jV &\(V 5Y B`JɈVMp#j, *JIPEP1Y"cYN ۶i mbpxJ:f35k70FI!P5 `"aTĹe[Bi-XVDd¸35!F,Uu!CY0M̡YBfe(c%LfeU\!dY f0Md\nPkX16َ!5lQdKhY M`, 2ԅIu5GXjV[KT̹]kSffꁈQ%`Rek[rͺb) R)œX(];͠QE M% *Bmȥ` MLVdPKe֙w5 HI5 NSKj-TG ^1J★sh TalenUmf85ETRl 1DYCYd%J-Ld  LKP1k1+G ̕w1vFШ1+m0ҳY Z^ xDƁixosaUs I`)Gc}2ھ}5ԩ;iN)5z޼e H&u6o9 Fa=7u\A%{nZk5-hӹhՕꪚ%Er'M ^|_^m1DVf|%ՒV‚c7mQToL˷I {9̓kL@B@3Jz[OՂmRտfp3 xWqB(.$sov|/GGNo/E}N*:3u#Sfͼ_,n{qT)yVP1 σdU""(2 `""vE0LP(OU1.~܍jƕd5_:WIJyN5"*w#J*)UxY77oS@^HFE~eؼSqXp^JfD);%5`Ԙ,=HOT+/ :ݨ  c6y`c$_#f2Ry1!E?adl}374=Ÿ8h4n/t}Grf3+?ʩ +]tĔ,?aRϱ%!< |[\@vA͛"N` jb B\ ˆhT+@K`E,%RJSLwV3fx"@i?G5 2@!ڄnqb\?왞#'ߨ7]Rlh)pI=&> w^ F`dkYC jyrxB`V2EX}w< @Жy\LX-Z7=i>4ƀrPZE!}k*Pf4@32GB^zwkt݌9\ZCnWۨ_Y8Jʴj-EFrWkKpŵ}JW""zύL$6jdo ZZ Βy]L~2'ήԊ"dI( ,(cNxI s.30 ?!* , `B^'#$ %!@%d!g'B>\'SvN98v ~%YqO\[ c|F[. BI7vؽz&v) q`'Bm p pDM%'`X,^h Qr׽*Uۭ $\8@ݑN1G1O/*Y-27l@}Y/EO. v?Z. Iwe~|o\;((h8": u|=凧W[WehW@qЩKN(Ѩ``~k#3]IPthZu@1k}\)?/-]涖&z$Iwږ(}O\avQ w$S )@gstat/src/0000755000176200001440000000000015162303121012155 5ustar liggesusersgstat/src/select.c0000644000176200001440000001636615060550314013621 0ustar liggesusers/* * select.c: neighborhood selection for local prediction */ #include #include /* qsort() */ #include /* memcpy() */ #include /* sqrt(), fabs() */ #include "defs.h" void Rprintf(const char *,...); #include "userio.h" #include "data.h" #include "utils.h" #include "debug.h" #include "vario.h" #include "defaults.h" #include "glvars.h" #include "nsearch.h" #include "select.h" static int octant_select(DATA *d, DPOINT *where); static int which_octant(DPOINT *where, DPOINT *p, int mode); int CDECL dist_cmp(const DPOINT **ap, const DPOINT **bp); static void print_selection(DATA *d, DPOINT *where); /* beware-of-side-effect macro: don't call with ++/--'s */ #define DPSWAP(a,b) { if (a != b) { tmp = a; a = b; b = tmp; }} static int select_qtree(DATA *d, DPOINT *where) { if (d->n_list <= 0 || d->id < 0 || d->sel_max == 0) return (d->n_sel = 0); /* * global neighbourhood? */ if (IS_GLOBAL(d) || where == NULL) { d->sel = d->list; d->n_sel = d->n_sel_max = d->n_list; if (DEBUG_SEL) { print_selection(d, where); } return d->n_sel; } /* set up or resize selection list, d->sel */ if (d->sel == NULL || d->sel == d->list) { /* first time or after forced global selection: */ d->sel = (DPOINT **) emalloc(d->n_list * sizeof(DPOINT *)); d->n_sel_max = d->n_list; } else if (d->n_list > d->n_sel_max) { /* no, something has changed... */ d->n_sel_max += MAX(MAX_DATA, d->n_list - d->n_sel_max); d->sel = (DPOINT **) erealloc(d->sel, d->n_sel_max * sizeof(DPOINT *)); } if (d->id > 0) { /* 2nd, 3d,..., n_vars-th variable */ if (gl_coincide == DEF_coincide) gl_coincide = decide_on_coincide(); /* establish first ... */ if (gl_coincide) { int i; DATA **data = get_gstat_data(); d->n_sel = data[0]->n_sel; for (i = 0; i < d->n_sel; i++) /* copy previous selection: */ d->sel[i] = d->list[GET_INDEX(data[0]->sel[i])]; if (DEBUG_SEL) print_selection(d, where); return d->n_sel; /* and we're done!! */ } } /* * So far, no selection has been done. * Let's see if today's job is easily done: */ memcpy(d->sel, d->list, d->n_list * sizeof(DPOINT *)); if (d->sel_rad >= DBL_MAX && d->sel_max >= d->n_list && d->oct_max == 0) { d->n_sel = d->n_list; if (DEBUG_SEL) print_selection(d, where); return d->n_sel; } /* * now we're sure that (a) sel_rad is set, or (b) sel_max < n_list, * or (c) oct_max is set, so let's do the smart thing: */ qtree_select(where, d); return -1; /* more work to do */ } int select_at(DATA *d, DPOINT *where) { /* * fill the array d->sel appropriatly given x,y,z,d->sel_min,d->sel_max * and d->sel_rad: possibly by corresponding semivariance value * first select all points within a distance d->sel_rad from where * then select at max the d->sel_max nearest and return no selection * if there are less then d->sel_min * if "FORCE", then select ALWAYS the d->sel_min nearest points. * * corrected variogram distance feb. 16th 1993 * changed search to normalizing to (0,0,0) first, aug 1993 */ if (d->what_is_u == U_UNKNOWN) d->what_is_u = U_ISDIST; /* we're going to fill this right now */ else if (d->what_is_u != U_ISDIST) ErrMsg(ER_IMPOSVAL, "select_at() needs distances"); if (select_qtree(d,where) != -1) return d->n_sel; /* * so, now we're at the stage where one of the following conditions holds: * (a) we selected all points within d->sel_rad * (b) we selected (at least) the nearest d->sel_max * (c) we selected (forced) at least d->sel_min, possibly beyond d->sel_rad * Now, should we select further, sorting on distance? * */ if (d->vdist) { /* use variogram distance as sort criterium */ int i; for (i = 0; i < d->n_sel; i++) d->sel[i]->u.dist2 = get_semivariance(get_vgm(LTI(d->id,d->id)), where->x - d->sel[i]->x, where->y - d->sel[i]->y, where->z - d->sel[i]->z); } if (d->oct_max) { /* do octant selection */ d->oct_filled = octant_select(d, where); /* sorts, adjusts n_sel and destroys distance order, so only */ if (get_method() == SPREAD) /* then we've got to re-order them */ qsort(d->sel, (size_t) d->n_sel, sizeof(DPOINT *), (int CDECL (*)(const void *,const void *)) dist_cmp); } if (d->vdist) { qsort(d->sel, (size_t) d->n_sel, sizeof(DPOINT *), (int CDECL (*)(const void *, const void *)) dist_cmp); /* pick d->sel_[max|min] nearest: */ if (d->sel_min && d->n_sel == d->sel_min && d->sel[d->n_sel]->u.dist2 > d->sel_rad) /* we forced: */ d->n_sel = d->sel_min; if (d->n_sel > d->sel_max) d->n_sel = d->sel_max; } if (DEBUG_SEL) print_selection(d, where); return d->n_sel; } static int octant_select(DATA *d, DPOINT *where) { /* * selects the d->oct_max nearest points per octant/quadrant/secant, * using euclidian or variogram distance */ int i, j, noct = 1, n, start = 0, end = 0, n_notempty = 0; DPOINT **sel, *tmp; if (d->mode & Z_BIT_SET) noct = 8; else if (d->mode & Y_BIT_SET) noct = 4; else noct = 2; sel = d->sel; for (i = 0; i < noct; i++) { /* for each octant: */ /* start == end: */ for (j = start; j < d->n_sel; j++) { /* for the remaining of sel: */ if (which_octant(where, sel[j], d->mode) == i) { DPSWAP(sel[end], sel[j]); end++; /* j >= end */ } } n = end - start; /* # of pts in octant i */ if (n > 0) n_notempty++; /* Yahoo, another non-empty octant! */ if (n > d->oct_max) { /* to get the closest n: sort sel from start to end: */ qsort(sel + start, (size_t) n, sizeof(DPOINT *), (int CDECL (*)(const void *, const void *)) dist_cmp); /* swap the remaining ones to the end of sel and forget about'm: */ for (j = start + d->oct_max; j < end; j++) { d->n_sel--; DPSWAP(sel[j], sel[d->n_sel]); } /* accept the first d->oct_max: */ start += d->oct_max; /* proceed with the next octant: */ end = start; } else /* accept all n: */ start = end; } if (end != d->n_sel) { Rprintf("end: %d, n_sel: %d\n", end, d->n_sel); ErrMsg(ER_IMPOSVAL, "octant_select(): remaining points"); } return n_notempty; /* # non-empty octants */ } static int which_octant(DPOINT *where, DPOINT *p, int mode) { /* * it's pretty hard to get this right for perfectly alligned 3D data: * in case of omax=1 and only one point at exactly equal distances * in each of the 6 directions, not all 6 are taken. * For 2D (omax=1, 4 points) this works, however. */ double dx, dy, dz; int x = 0, y = 0, z = 0; dx = p->x - where->x; /* < 0 : p in west half */ dy = p->y - where->y; /* < 0 : p in south half */ dz = p->z - where->z; /* < 0 : p in lower half */ if (mode & Z_BIT_SET) z = (dz < 0); if (mode & Y_BIT_SET) { x = (dy < 0 ? dx > 0 : dx >= 0); y = (dx < 0 ? dy >= 0 : dy > 0); } else x = (where->x < p->x); return (x | (y << 1) | (z << 2)); } int CDECL dist_cmp(const DPOINT **pa, const DPOINT **pb) { /* ANSI qsort() conformant dist_cmp */ if ( (*pa)->u.dist2 < (*pb)->u.dist2 ) return -1; if ( (*pa)->u.dist2 > (*pb)->u.dist2 ) return 1; return 0; } static void print_selection(DATA *d, DPOINT *where) { /* Add this statement to filter out * empty selections if (!d->n_sel) return; */ if (where) { printlog("selection at "); logprint_point(where, d); } else printlog("(NULL selection location)"); print_data_selection(d); } gstat/src/mapio.c0000644000176200001440000000622515060550314013440 0ustar liggesusers/* * former mapio io functions, now only skeleton things doing row/col <--> x/y */ #include /* floor() */ #include /* FLT_MAX */ #include "defs.h" #include "glvars.h" #include "utils.h" #include "debug.h" #include "userio.h" #include "mapio.h" static GRIDMAP *write_error(GRIDMAP * m); #define SWAP_N(a,n) swap_floats((unsigned char *)a,n) #define SWAP_M_N(a,m,n) swap_multiformat((unsigned char *)a,m,n) #define CHECK_ROWS 1 #define CHECK_COLS 2 #define CHECK_CELLSIZE 4 #define CHECK_X_UL 8 #define CHECK_Y_UL 16 #define CHECK_SUM 31 /* sum of all checks */ #define BINARY_NATIVE 1 #define BINARY_NON_NATIVE 2 #define DEFAULT_MISVAL -9999.0 #define SURFER_MISVAL 1.70141E+38 /* * create a new GRIDMAP structure * allocates memory and initializes all fields for a GRIDMAP structure * returns: pointer to GRIDMAP structure */ GRIDMAP *new_map(MAP_READ_STATUS status) { GRIDMAP *map; map = (GRIDMAP *) emalloc(sizeof(GRIDMAP)); map->status = status; map->type = MT_UNKNOWN; map->history = NULL; map->description = NULL; map->filename = NULL; map->rows = 0; map->cols = 0; map->base_size = 0; map->grid = NULL; map->base = NULL; map->first_time_row = NULL; map->is_binary = 0; map->celltype = CT_UNKNOWN; map->misval = DEFAULT_MISVAL; /* only for arcgrid */ map->cellmin = map->cellmax = FLT_MAX; map->CSF_MAP = NULL; map->write = write_error; map->read_row = map->write_row = NULL; map->current_row = 0; return map; } static GRIDMAP *write_error(GRIDMAP * m) { pr_warning("%s: writing this map format is not supported", m->filename); assert(0); return NULL; } /* * give x,y coordinate of cell center for cell [row, col] * libcsf has it's own function; other formats assume increasing x * for increasing cols and decreasing y for increasing rows * returns: non-zero if row or col are outside map limits */ int map_rowcol2xy(GRIDMAP * m, /* pointer to gridmap */ unsigned int row, /* current row number */ unsigned int col, /* current column number */ double *x, /* return value: pointer to x-coordinate */ double *y /* return value: pointer to y-coordinate */ ) { assert(m); assert(x); assert(y); if (row >= m->rows || col >= m->cols) return 1; *x = m->x_ul + (col + 0.5) * m->cellsizex; *y = m->y_ul - (row + 0.5) * m->cellsizey; return 0; } /* * converts x and y coordinate to (row,col) pair. * * see comment for map_rowcol2xy() * * returns: non-zero if x or y are outside map limits */ int map_xy2rowcol(GRIDMAP * m /* pointer to map */ , double x, /* x-coordinate */ double y, /* y-coordinate */ unsigned int *row, /* output value: pointer to row number */ unsigned int *col /* output value: pointer to column number */ ) { assert(m); assert(row); assert(col); if (x < m->x_ul || x > m->x_ul + m->cols * m->cellsizex || y > m->y_ul || y < m->y_ul - m->rows * m->cellsizey) return 1; *row = (unsigned int) floor((m->y_ul - y) / m->cellsizey); *col = (unsigned int) floor((x - m->x_ul) / m->cellsizex); if (*row == m->rows) /* on the bottom edge */ *row = *row - 1; if (*col == m->cols) /* on the right edge */ *col = *col - 1; return 0; } gstat/src/vario_io.c0000644000176200001440000001011115060550314014127 0ustar liggesusers/* * vario_io.c: functions for point-point, point-block (co/semi)variances */ #include #include #include #include "userio.h" #include "debug.h" #include "data.h" #include "vario.h" #include "block.h" #include "glvars.h" /* get_block_p(), gl_zero, gl_longlat */ #include "vario_io.h" static double sem_cov_blocks(VARIOGRAM *v, DATA *a, DATA *b, int sem); double sem_cov_ab(VARIOGRAM *v, DPOINT *a, DPOINT *b, int sem) /* * return Cov(a,b) or Sem(a,b), * taking care of IS_BLOCK(a) and IS_BLOCK(b): */ { static DATA *Discr_a = NULL, *Discr_b = NULL; static DPOINT *block_p = NULL; DPOINT *tmp; if (block_p == NULL) block_p = get_block_p(); if (a == b) { if (IS_POINT(a)) return sem_cov_blocks(v, NULL, NULL, sem); Discr_a = block_discr(Discr_a, block_p, a); return sem_cov_blocks(v, Discr_a, Discr_a, sem); } /* * if one of them IS_BLOCK, make sure it's a: * (because block_discr() will otherwise store block * discretisations in both Discr_a and Discr_b) */ if (IS_POINT(a) && IS_BLOCK(b)) { tmp = a; a = b; b = tmp; /* swap a and b */ } Discr_a = block_discr(Discr_a, block_p, a); Discr_b = block_discr(Discr_b, block_p, b); return sem_cov_blocks(v, Discr_a, Discr_b, sem); } static double sem_cov_blocks(VARIOGRAM *v, DATA *a, DATA *b, int sem) { /* * Purpose : calculates (once) and returns Cov(a,b); * if a==b && a denotes a block discretisation, the value * is put in a->block_variance and a->block_xxx_set gets 1 * Created by : Edzer J. Pebesma * Date : 25 jan 1992, 3 june 1993 * Prerequisites : none * Returns : sem == 1 ? Sem(a,b) : Cov(a,b) * Side effects : none */ int i, j; double block_value, dx, dy = 0.0, dz = 0.0, dist, ret, weight, dzero2; DPOINT *dpa, *dpb; /* if (a->what_is_u != U_ISWEIGHT || b->what_is_u != U_ISWEIGHT) ErrMsg(ER_IMPOSVAL, "weights needed in SevCov_Blocks()"); */ if (a == NULL) return sem ? get_semivariance(v, 0.0, 0.0, 0.0) : get_covariance(v, 0.0, 0.0, 0.0); if (a->n_list == 1 && b->n_list == 1) { /* point--point */ if (gl_longlat) { if (! v->isotropic) ErrMsg(ER_IMPOSVAL, "for long/lat data, anisotropy cannot be defined"); dist = pp_norm_gc(a->list[0], b->list[0]); ret = sem ? get_semivariance(v, dist, 0.0, 0.0): get_covariance(v, dist, 0.0, 0.0); /* printf("ll dist: %g, ret.val %g\n", dist, ret); */ return ret; } else { return sem ? get_semivariance(v, a->list[0]->x - b->list[0]->x, a->list[0]->y - b->list[0]->y, a->list[0]->z - b->list[0]->z): get_covariance(v, a->list[0]->x - b->list[0]->x, a->list[0]->y - b->list[0]->y, a->list[0]->z - b->list[0]->z); } } /* now a->n_list > 1 or b->n_list > 1: block--block or point--block */ if (gl_longlat) ErrMsg(ER_IMPOSVAL, "block kriging for long-lat data undefined"); if (a == b) { /* block--block for a single block */ if (sem && v->block_semivariance_set) return v->block_semivariance; if (!sem && v->block_covariance_set) return v->block_covariance; } /* else: continue */ dzero2 = gl_zero * gl_zero; block_value = 0.0; for (i = 0; i < a->n_list; i++) { for (j = 0; j < b->n_list; j++) { /* compare all points with all p */ dpa = a->list[i]; dpb = b->list[j]; weight = dpa->u.weight * dpb->u.weight; /* avoid the "zero-effect" if a or b is block: */ dx = dpa->x - dpb->x; dy = dpa->y - dpb->y; dz = dpa->z - dpb->z; /* avoid ``zero-effect'': */ if (a->pp_norm2(dpa, dpb) < dzero2) { dx = (dx >= 0 ? gl_zero : -gl_zero); if (a->mode & Y_BIT_SET) dy = (dy >= 0 ? gl_zero : -gl_zero); if (a->mode & Z_BIT_SET) dz = (dz >= 0 ? gl_zero : -gl_zero); } if (sem) block_value += weight * get_semivariance(v, dx, dy, dz); else block_value += weight * get_covariance(v, dx, dy, dz); } /* for j */ } /* for i */ if (a == b) { /* remember within block cov./sem.: */ if (sem) { v->block_semivariance = block_value; v->block_semivariance_set = 1; } else { v->block_covariance = block_value; v->block_covariance_set = 1; } } return block_value; } gstat/src/sem.c0000644000176200001440000005542415060550314013124 0ustar liggesusers/* * sem.c: calculate sample (cross, co-) variogram from data * K.M. refers to changes by Konstantin Malakhanov, see also mapio.c */ #include #include #include "defs.h" #include "mapio.h" #include "userio.h" #include "data.h" #include "utils.h" #include "debug.h" #include "vario.h" #include "glvars.h" #include "select.h" #include "gls.h" #include "mtrx.h" #include "lm.h" #include "defaults.h" #include "direct.h" #include "sem.h" #define SEM_INCREMENT 1000 static double valid_distance(DPOINT *a, DPOINT *b, double max, int symmetric, DATA *d1, DATA *d2, GRIDMAP *m); static void divide(SAMPLE_VGM *ev); static SAMPLE_VGM *alloc_exp_variogram(DATA *a, DATA *b, SAMPLE_VGM *ev); /* variograms: */ static SAMPLE_VGM *semivariogram(DATA *a, SAMPLE_VGM *ev); static SAMPLE_VGM *cross_variogram(DATA *a, DATA *b, SAMPLE_VGM *ev); /* covariograms: */ static SAMPLE_VGM *covariogram(DATA *a, SAMPLE_VGM *ev); static SAMPLE_VGM *cross_covariogram(DATA *a, DATA *b, SAMPLE_VGM *ev); static int get_index(double dist, SAMPLE_VGM *ev); static SAMPLE_VGM *semivariogram_list(DATA *d, SAMPLE_VGM *ev); static SAMPLE_VGM *semivariogram_grid(DATA *d, SAMPLE_VGM *ev); static void push_to_cloud(SAMPLE_VGM *ev, double gamma, double dist, unsigned long index); static void resize_ev(SAMPLE_VGM *ev, unsigned int size); static void *register_pairs(void *p, unsigned long nh, DPOINT *a, DPOINT *b); /* * gl_cressie: use Cressie's sqrt(absdiff) estimator; * ev->zero: * case ZERO_INCLUDE: use zero distances in first interval (omit); * case ZERO_AVOID: avoid zero distances; * case ZERO_SPECIAL: make special estimate for distance zero; */ /* * calculate sample variogram from data * calculates variogram, crossvariogram, covariogram or crosscovariogram * from sample data. Data are obtained from the central data base (glvars) * using get_gstat_data(), and the variogram requested is that of data id * v->id1 and v->id2 -- a direct (co) variogram when id1 == id2, a cross * (co) variogram when id1 != id2. * * if [[v->fname is set and]] (one of) id1 or id2 is a dummy data, the * actual sample variogram is not calculated but rather read from the * file v->fname. This is done to enable separate sample variogram * calculation (in batch or on a fast remote computer) and model fitting * (e.g. on the desk top). * * returns: non-zero if writing sample variogram to file failed. */ int calc_variogram(VARIOGRAM *v /* pointer to VARIOGRAM structure */, const char *fname /* pointer to output file name, or NULL if no output has to be written to file */ ) { DATA **d = NULL, *d1 = NULL, *d2 = NULL; assert(v); d = get_gstat_data(); d1 = d[v->id1]; d2 = d[v->id2]; if (d1->sel == NULL) select_at(d1, NULL); /* global selection (sel = list) */ if (d2->sel == NULL) select_at(d2, NULL); if (v->ev->evt == CROSSVARIOGRAM && (v->ev->pseudo == -1 || v->ev->is_asym == -1)) { if (v->ev->pseudo == -1) { /* v's first time, need to find out pseudo */ if (coordinates_are_equal(d[v->id1], d[v->id2])) v->ev->pseudo = 0; else v->ev->pseudo = 1; } if (gl_sym_ev == 0) v->ev->is_asym = v->ev->pseudo; /* pseudo: always, else: only if set */ else v->ev->is_asym = 0; } else v->ev->is_asym = v->ev->pseudo = 0; if (gl_zero_est == ZERO_DEFAULT) { /* choose a suitable default */ if (is_covariogram(v)) v->ev->zero = ZERO_SPECIAL; else { /* v is variogram */ if (v->ev->pseudo) v->ev->zero = ZERO_SPECIAL; else v->ev->zero = ZERO_INCLUDE; } } else v->ev->zero = zero_int2enum(gl_zero_est); assert(v->ev->zero != ZERO_DEFAULT); fill_cutoff_width(d1, v); if (v->ev->map && v->ev->S_grid == NULL) return -1; v->ev->cloud = (v->ev->iwidth <= 0.0); if (v->ev->cloud && (d[v->id1]->n_sel >= MAX_NH || d[v->id2]->n_sel >= MAX_NH)) pr_warning("observation numbers in cloud will be wrong"); set_direction_values(gl_alpha, gl_beta, gl_tol_hor, gl_tol_ver); v->ev->is_directional = is_directional(v); if (v->ev->recalc) { switch (v->ev->evt) { case PRSEMIVARIOGRAM: case SEMIVARIOGRAM: semivariogram(d[v->id1], v->ev); break; case CROSSVARIOGRAM: cross_variogram(d[v->id1], d[v->id2], v->ev); break; case COVARIOGRAM: v->ev->is_asym = gl_sym_ev; covariogram(d[v->id1], v->ev); break; case CROSSCOVARIOGRAM: cross_covariogram(d[v->id1], d[v->id2], v->ev); break; case NOTSPECIFIED: default: assert(0); /* aborts */ break; } } return 0; } static SAMPLE_VGM *semivariogram(DATA *d, SAMPLE_VGM *ev) { /* * calculate sample variogram of 0.5 E[(Z(x)-Z(x+h))2] */ if (ev->evt == PRSEMIVARIOGRAM) d->calc_residuals = 0; ev = alloc_exp_variogram(d, NULL, ev); if (d->grid != NULL && d->prob > 0.5 && d->every == 1) ev = semivariogram_grid(d, ev); else ev = semivariogram_list(d, ev); divide(ev); ev->recalc = 0; return ev; } /* semivariogram() */ static SAMPLE_VGM *semivariogram_list(DATA *d, SAMPLE_VGM *ev) { unsigned long uli, ulj; int i, j, index = 0, divide_by = 1; unsigned int total_steps; double gamma, ddist, head, tail, gam; while (d->n_sel / divide_by > 0.5 * sqrt(INT_MAX)) divide_by <<= 1; /* prevent overflow on calculating total_steps */ total_steps = (d->n_sel / divide_by) * (d->n_sel - 1) / 2; print_progress(0, total_steps); if (DEBUG_DUMP) printlog("Calculating semivariogram from %d points...\n", d->n_sel); for (i = 0; i < d->n_sel; i++) { print_progress((i / divide_by) * (i - 1) / 2, total_steps); R_CheckUserInterrupt(); /* printlog("step: %u of %u\n", (i /divide_by) * (i - 1) / 2, total_steps); */ for (j = 0; j < (ev->map != NULL ? d->n_sel : i); j++) { ddist = valid_distance(d->sel[i], d->sel[j], ev->cutoff, 1, d, d, (GRIDMAP *) ev->map); if (ddist >= 0.0 && i != j) { head = d->sel[i]->attr; tail = d->sel[j]->attr; if (! ev->cloud) { index = get_index(ddist, ev); if (gl_cressie) /* sqrt abs diff */ ev->gamma[index] += sqrt(fabs(head - tail)); else if (ev->evt == PRSEMIVARIOGRAM) { gam = 2.0 * (head - tail)/(head + tail); ev->gamma[index] += SQR(gam); } else { /* SEMIVARIOGRAM: */ ev->gamma[index] += SQR(head - tail); #ifdef ADJUST_VARIANCE if (d->colnvariance) ev->gamma[index] -= d->sel[i]->variance + d->sel[j]->variance; #endif } ev->dist[index] += ddist; ev->pairs[index] = register_pairs(ev->pairs[index], ev->nh[index], d->sel[i], d->sel[j]); ev->nh[index]++; } else { /* cloud: */ if (! (ev->zero == ZERO_AVOID && ddist == 0.0)) { if (gl_cressie) gamma = sqrt(fabs(head - tail)); else if (ev->evt == PRSEMIVARIOGRAM) { gam = 2.0 * (head - tail)/(head + tail); gamma = gam * gam; } else { gamma = SQR(head - tail); #ifdef ADJUST_VARIANCE if (d->colnvariance) gamma -= d->sel[i]->variance + d->sel[j]->variance; #endif } uli = i; ulj = j; push_to_cloud(ev, gamma / 2.0, ddist, TO_NH(uli,ulj)); } } }/* if ddist >= 0 */ } /* for j */ } /* for i */ print_progress(total_steps, total_steps); if (DEBUG_DUMP) printlog("ready\n"); return ev; } static SAMPLE_VGM *semivariogram_grid(DATA *d, SAMPLE_VGM *ev) { typedef struct { int row, col, ev_index; double dist; } grid_index; struct { int n; grid_index *gi; } grid_ev; int row, col, irow, icol, i, max_index, index; unsigned long ula, ulb; double gamma, ddist, head, tail, gam; DPOINT a, b, *dpa = NULL, *dpb = NULL; max_index = (int) floor(ev->cutoff / SQUARECELLSIZE(d->grid)); grid_ev.gi = (grid_index *) emalloc(2 * (max_index + 1) * (max_index + 1) * sizeof(grid_index)); grid_ev.n = 0; a.x = a.y = a.z = b.z = 0.0; /* setup the grid: */ for (row = 0; row <= max_index; row++) { for (col = (row == 0 ? 1 : -max_index); col <= max_index; col++) { b.x = col * SQUARECELLSIZE(d->grid); b.y = - row * SQUARECELLSIZE(d->grid); ddist = valid_distance(&a, &b, ev->cutoff, 1, d, d, (GRIDMAP *) ev->map); if (ddist > 0.0) { grid_ev.gi[grid_ev.n].row = row; grid_ev.gi[grid_ev.n].col = col; grid_ev.gi[grid_ev.n].dist = ddist; if (! ev->cloud) grid_ev.gi[grid_ev.n].ev_index = get_index(ddist, ev); if (DEBUG_DUMP) printlog("row %d col %d index %d\n", row, col, grid_ev.gi[grid_ev.n].ev_index); grid_ev.n++; } } } print_progress(0, d->grid->rows); for (row = 0; row < d->grid->rows; row++) { for (col = 0; col < d->grid->cols; col++) { if ((dpa = d->grid->dpt[row][col]) != NULL) { for (i = 0; i < grid_ev.n; i++) { irow = row + grid_ev.gi[i].row; icol = col + grid_ev.gi[i].col; if (irow >= 0 && icol >= 0 && irow < d->grid->rows && icol < d->grid->cols && ((dpb = d->grid->dpt[irow][icol]) != NULL)) { ddist = grid_ev.gi[i].dist; head = dpa->attr; tail = dpb->attr; if (! ev->cloud) { index = grid_ev.gi[i].ev_index; if (gl_cressie) /* sqrt abs diff */ ev->gamma[index] += sqrt(fabs(head - tail)); else { if (ev->evt == PRSEMIVARIOGRAM) { gam = 2.0 * (head - tail)/(head + tail); ev->gamma[index] += gam * gam; } else ev->gamma[index] += SQR(head - tail); #ifdef ADJUST_VARIANCE if (d->colnvariance) ev->gamma[index] -= dpa->variance + dpb->variance; #endif } ev->dist[index] += ddist; ev->pairs[index] = register_pairs(ev->pairs[index], ev->nh[index], dpa, dpb); ev->nh[index]++; } else { /* cloud: */ if (gl_cressie) gamma = sqrt(fabs(head - tail)); else if (ev->evt == PRSEMIVARIOGRAM) { gam = 2.0 * (head - tail)/(head + tail); gamma = gam * gam; } else { gamma = SQR(head - tail); #ifdef ADJUST_VARIANCE if (d->colnvariance) gamma -= dpa->variance + dpb->variance; #endif } ula = GET_INDEX(dpa); ulb = GET_INDEX(dpb); push_to_cloud(ev, gamma / 2.0, ddist, TO_NH(ula,ulb)); } /* else !cloud */ } /* if we have two non-NULL points */ } /* for all possibly relevant pairs */ } /* if this grid cell is non-NULL */ } /* for all cols */ print_progress(row + 1, d->grid->rows); R_CheckUserInterrupt(); } /* for all rows */ efree(grid_ev.gi); return ev; } /* covariograms: */ static SAMPLE_VGM *covariogram(DATA *d, SAMPLE_VGM *ev) { int i, j, index = 0; unsigned long uli, ulj; double gamma, ddist; ev->evt = COVARIOGRAM; ev = alloc_exp_variogram(d, NULL, ev); for (i = 0; i < d->n_sel; i++) { print_progress(i, d->n_sel); R_CheckUserInterrupt(); for (j = 0; j <= (ev->map != NULL ? d->n_sel-1 : i); j++) { ddist = valid_distance(d->sel[i], d->sel[j], ev->cutoff, 1, d, d, (GRIDMAP *) ev->map); if (ddist >= 0.0) { if (! ev->cloud) { index = get_index(ddist, ev); ev->gamma[index] += d->sel[i]->attr * d->sel[j]->attr; #ifdef ADJUST_VARIANCE if (d->colnvariance && i == j) ev->gamma[index] -= d->sel[i]->variance; #endif ev->dist[index] += ddist; ev->pairs[index] = register_pairs(ev->pairs[index], ev->nh[index], d->sel[i], d->sel[j]); ev->nh[index]++; } else { if (! (ev->zero == ZERO_AVOID && ddist == 0.0)) { gamma = d->sel[i]->attr * d->sel[j]->attr; #ifdef ADJUST_VARIANCE if (d->colnvariance && i == j) gamma -= d->sel[i]->variance; #endif uli = i; ulj = j; push_to_cloud(ev, gamma, ddist, TO_NH(uli,ulj)); } } }/* if ddist >= 0 */ } /* for j */ } /* for i */ print_progress(d->n_sel, d->n_sel); divide(ev); ev->recalc = 0; return ev; } /* covariogram() */ static SAMPLE_VGM *cross_variogram(DATA *a, DATA *b, SAMPLE_VGM *ev) { int i, j, index = 0; unsigned long uli, ulj; double gamma, ddist; ev->evt = CROSSVARIOGRAM; ev = alloc_exp_variogram(a, b, ev); for (i = 0; i < a->n_sel; i++) { print_progress(i, a->n_sel); R_CheckUserInterrupt(); for (j = 0; j < b->n_sel; j++) { ddist = valid_distance(a->sel[i], b->sel[j], ev->cutoff, gl_sym_ev || !ev->pseudo, a, b, (GRIDMAP *) ev->map); if (ddist >= 0.0) { if (!ev->pseudo && i != j) { if (! ev->cloud) { index = get_index(ddist, ev); ev->gamma[index] += (a->sel[i]->attr - a->sel[j]->attr) * (b->sel[i]->attr - b->sel[j]->attr); ev->dist[index] += ddist; ev->pairs[index] = register_pairs(ev->pairs[index], ev->nh[index], a->sel[i], a->sel[j]); ev->nh[index]++; } else if (!(ddist == 0.0 && ev->zero == ZERO_AVOID)) { gamma = (a->sel[i]->attr - a->sel[j]->attr) * (b->sel[i]->attr - b->sel[j]->attr); uli = i; ulj = j; push_to_cloud(ev, gamma / 2.0, ddist, TO_NH(uli,ulj)); } } else if (ev->pseudo) { if (! ev->cloud) { index = get_index(ddist, ev); ev->gamma[index] += SQR(a->sel[i]->attr - b->sel[j]->attr); #ifdef ADJUST_VARIANCE if (a->colnvariance || b->colnvariance) ev->gamma[index] -= a->sel[i]->variance + b->sel[j]->variance; #endif ev->dist[index] += ddist; ev->pairs[index] = register_pairs(ev->pairs[index], ev->nh[index], a->sel[i], b->sel[j]); ev->nh[index]++; } else if (! (ev->zero == ZERO_AVOID && ddist == 0.0)) { gamma = SQR(a->sel[i]->attr - b->sel[j]->attr); #ifdef ADJUST_VARIANCE if (a->colnvariance || b->colnvariance) gamma -= a->sel[i]->variance + b->sel[j]->variance; #endif uli = i; ulj = j; push_to_cloud(ev, gamma / 2.0, ddist, TO_NH(uli,ulj)); } } }/* if ddist >= 0 */ } /* for j */ } /* for i */ print_progress(a->n_sel, a->n_sel); divide(ev); ev->recalc = 0; return ev; } /* cross_variogram */ static SAMPLE_VGM *cross_covariogram(DATA *a, DATA *b, SAMPLE_VGM *ev) { int i, j, index = 0; unsigned long uli, ulj; double gamma, ddist; ev->evt = CROSSCOVARIOGRAM; ev = alloc_exp_variogram(a, b, ev); for (i = 0; i < a->n_sel; i++) { /* i -> a */ R_CheckUserInterrupt(); print_progress(i, a->n_sel); for (j = 0; j < b->n_sel; j++) { /* j -> b */ ddist = valid_distance(a->sel[i], b->sel[j], ev->cutoff, gl_sym_ev, a, b, (GRIDMAP *) ev->map); if (ddist >= 0.0) { if (! ev->cloud) { index = get_index(ddist, ev); ev->gamma[index] += a->sel[i]->attr * b->sel[j]->attr; ev->dist[index] += ddist; ev->pairs[index] = register_pairs(ev->pairs[index], ev->nh[index], a->sel[i], b->sel[j]); ev->nh[index]++; } else if (! (ev->zero == ZERO_AVOID && ddist == 0.0)) { gamma = a->sel[i]->attr * b->sel[j]->attr; uli = i; ulj = j; push_to_cloud(ev, gamma, ddist, TO_NH(uli,ulj)); } }/* if ddist >= 0 */ } /* for j */ } /* for i */ print_progress(a->n_sel, a->n_sel); divide(ev); ev->recalc = 0; return ev; } /* cross_covariogram() */ static double valid_distance(DPOINT *a, DPOINT *b, double max, int symmetric, DATA *d1, DATA *d2, GRIDMAP *map) { double ddist, dX, dX2, inprod; DPOINT p; int /* mode = 0, */ i; unsigned int row, col; assert(a != NULL); assert(b != NULL); assert(d1 != NULL); assert(d2 != NULL); /* mode = d1->mode & d2->mode; */ /* * even if modes don't correspond, valid_direction() will * calculate valid distances */ p.x = a->x - b->x; p.y = a->y - b->y; p.z = a->z - b->z; if (map && !gl_longlat) { /* transform here p to allow directional 2d cuts in a 3d world */ if (map_xy2rowcol(map, p.x, p.y, &row, &col)) return -1.0; else ddist = (1.0 * row) * map->cols + col + 0.5; } else { if (!gl_longlat && (p.x > max || p.y > max || p.z > max)) return -1.0; /* Changed K.M. Fri Feb 27 15:56:57 1998 */ /* if ddist < 0.0 then we don't need to check for dX! */ if ((ddist = valid_direction(a, b, symmetric, d1)) > max || ddist < 0.0) return -1.0; } dX = MIN(d1->dX, d2->dX); if (dX < DBL_MAX) { dX2 = dX * dX; /* allow only points for which 2-norm ||x_i-x_j|| < dX */ if (d1->n_X != d2->n_X) ErrMsg(ER_IMPOSVAL, "valid_distance(): d1->n_X != d2->n_X"); for (i = 0, inprod = 0.0; i < d1->n_X; i++) { inprod += SQR(a->X[i] - b->X[i]); /* printf("a->X[%d]: %g, b->X[%d]: %g", i, a->X[i], i, b->X[i]); */ } if (inprod > dX2) ddist = -1.0; /* printf("dX2: %g, inprod: %g ddist: %g\n", dX2, inprod, ddist); */ } return ddist; } int is_directional(VARIOGRAM *v) { switch(v->ev->evt) { case CROSSCOVARIOGRAM: if (gl_sym_ev == 0) /* asymmetric cross(co)variances: */ return (gl_tol_hor < 180.0 || gl_tol_ver < 180.0); else return (gl_tol_hor < 90.0 || gl_tol_ver < 90.0); case CROSSVARIOGRAM: if (v->ev->is_asym && gl_sym_ev == 0) /* asymm. cross(co)variances: */ return (gl_tol_hor < 180.0 || gl_tol_ver < 180.0); else return (gl_tol_hor < 90.0 || gl_tol_ver < 90.0); default: /* symmetric (co)variances */ return (gl_tol_hor < 90.0 || gl_tol_ver < 90.0); } } /* * this function should be changed--the mask map stack is misused as * to define the topology of variogram maps. * * use min/max coordinates for block diagonal as maximum cutoff * Returns: about 1/3 the max. dist between any two points in data. */ void fill_cutoff_width(DATA *data /* pointer to DATA structure to derive the values from */, VARIOGRAM *v /* pointer to VARIOGRAM structure */) { double d = 0.0; int i; GRIDMAP *m; DATA_GRIDMAP *dg; SAMPLE_VGM *ev; assert(data); assert(v); ev = v->ev; if (ev->S_grid != NULL) { m = new_map(READ_ONLY); /* process S_grid to m */ dg = (DATA_GRIDMAP *) ev->S_grid; m->x_ul = dg->x_ul; m->y_ul = dg->y_ul; m->cellsizex = dg->cellsizex; m->cellsizey = dg->cellsizey; m->rows = dg->rows; m->cols = dg->cols; ev->iwidth = 1.0; ev->cutoff = m->rows * m->cols; /* not a real cutoff, but rather the size of the container array */ ev->map = m; } else if (gl_bounds != NULL) { i = 0; while (gl_bounds[i] >= 0.0) /* count length */ i++; ev->cutoff = gl_bounds[i-1]; ev->iwidth = ev->cutoff / i; } else { if (is_mv_double(&(ev->cutoff))) { if (gl_cutoff < 0.0) { d = data_block_diagonal(data); if (d == 0.0) ev->cutoff = 1.0; /* ha ha ha */ else ev->cutoff = d * gl_fraction; } else ev->cutoff = gl_cutoff; } if (is_mv_double(&(ev->iwidth))) { if (gl_iwidth < 0.0) ev->iwidth = ev->cutoff / gl_n_intervals; else ev->iwidth = gl_iwidth; } } } static SAMPLE_VGM *alloc_exp_variogram(DATA *a, DATA *b, SAMPLE_VGM *ev) { int i; double nd; assert(a != NULL); assert(ev != NULL); if (gl_zero_est != ZERO_DEFAULT && ev->zero != gl_zero_est) ev->zero = zero_int2enum(gl_zero_est); if (gl_gls_residuals) { if (a->calc_residuals) make_gls(a, 1); if (b != NULL && b->calc_residuals) make_gls(b, 1); } else { if (a->calc_residuals) make_residuals_lm(a); if (b != NULL && b->calc_residuals) make_residuals_lm(b); } if (ev->cloud) { ev->n_est = 0; return ev; } if (gl_bounds != NULL) { for (i = ev->n_est = 0; gl_bounds[i] >= 0.0; i++) ev->n_est++; } else { /* check for overflow: */ nd = floor(ev->cutoff / ev->iwidth) + 1; if (nd > INT_MAX) { pr_warning("choose a larger width or a smaller cutoff value"); ErrMsg(ER_MEMORY, "(experimental variogram too large)"); } ev->n_est = (int) nd; } /* * zero est go to ev->gamma[ev->n_est - 1], ev->nh[ev->n_est - 1] */ if (ev->zero) ev->n_est++; resize_ev(ev, ev->n_est); /* initialize: */ for (i = 0; i < ev->n_est; i++) { ev->gamma[i] = 0.0; ev->dist[i] = 0.0; ev->nh[i] = 0; ev->pairs[i] = (DPOINT **) NULL; } return ev; } static void resize_ev(SAMPLE_VGM *ev, unsigned int size) { if (size > ev->n_max) { ev->n_max = size; ev->gamma = (double *) erealloc (ev->gamma, ev->n_max * sizeof(double)); ev->dist = (double *) erealloc (ev->dist, ev->n_max * sizeof(double)); ev->nh = (unsigned long *) erealloc (ev->nh, ev->n_max * sizeof(long)); ev->pairs = (DPOINT ***) erealloc(ev->pairs, ev->n_max * sizeof(DPOINT **)); } } static void *register_pairs(void *pairs, unsigned long nh, DPOINT *a, DPOINT *b) { /* * while I'm here -- there may be a problem when ->list != ->sel on * the DATA used, but I don't know why. Probably will never be used. */ /* resize pairs; add a and b to it */ if (gl_register_pairs == 0) return NULL; if (nh % SEM_INCREMENT == 0) pairs = erealloc(pairs, 2 * (nh + SEM_INCREMENT + 1) * sizeof(DPOINT **)); ((DPOINT **) pairs)[2 * nh] = a; ((DPOINT **) pairs)[2 * nh + 1] = b; return pairs; } static void push_to_cloud(SAMPLE_VGM *ev, double gamma, double dist, unsigned long index) { if (ev->n_est == ev->n_max) resize_ev(ev, ev->n_max + SEM_INCREMENT); ev->gamma[ev->n_est] = gamma; ev->dist[ev->n_est] = dist; ev->nh[ev->n_est] = index; ev->pairs[ev->n_est] = NULL; ev->n_est++; } static int get_index(double dist, SAMPLE_VGM *ev) { double frac; int i = 0; if (dist == 0.0 && ev->zero != ZERO_INCLUDE) return ev->n_est - 1; if (gl_bounds != DEF_bounds) { for (i = 0; gl_bounds[i] >= 0.0; i++) if (dist <= gl_bounds[i]) return i; assert(0); } if (ev->iwidth <= 0.0) { pr_warning("iwidth: %g", ev->iwidth); ErrMsg(ER_IMPOSVAL, "ev->iwidth <= 0.0"); } frac = dist / ev->iwidth; if (dist > 0.0 && frac == floor(frac)) return (int) (floor(frac)) - 1; else return (int) floor(frac); } static void divide(SAMPLE_VGM *ev) { int i; if (ev->cloud) return; /* has been done in the first round */ for (i = 0; i < ev->n_est; i++) { if (ev->nh[i]) { ev->dist[i] /= ev->nh[i]; switch (ev->evt) { case SEMIVARIOGRAM: if (gl_cressie) ev->gamma[i] = 0.5 * pow(ev->gamma[i]/ev->nh[i], 4.0) /(0.457 + 0.494 / ev->nh[i]); else ev->gamma[i] /= (2.0 * ev->nh[i]); break; case CROSSVARIOGRAM: ev->gamma[i] /= (2.0 * ev->nh[i]); break; case COVARIOGRAM: /* BREAKTHROUGH */ case CROSSCOVARIOGRAM: ev->gamma[i] /= (1.0 * ev->nh[i]); break; case PRSEMIVARIOGRAM: ev->gamma[i] /= (2.0 * ev->nh[i]); break; case NOTSPECIFIED: /* BREAKTHROUGH */ default: assert(0); break; } } } } void fprint_sample_vgm(const SAMPLE_VGM *ev) { #define EVFMT "%8g %8g %8lu %8g %8g\n" int i, n; double from, to; if (! ev->cloud) { /* start writing: distance 0 */ if (ev->zero == ZERO_SPECIAL && ev->nh[ev->n_est-1]) Rprintf(EVFMT, 0.0, 0.0, ev->nh[ev->n_est-1], ev->dist[ev->n_est-1], ev->gamma[ev->n_est-1]); /* continue writing: */ if (ev->zero == ZERO_SPECIAL || ev->zero == ZERO_AVOID) n = ev->n_est - 1; else n = ev->n_est; for (i = 0; i < n; i++) { if (ev->nh[i] > 0) { if (gl_bounds == NULL) { from = i*ev->iwidth; to = (i+1)*ev->iwidth; } else { if (i == 0) from = 0.0; else from = gl_bounds[i-1]; to = gl_bounds[i]; } to = MIN(ev->cutoff, to); Rprintf(EVFMT, from, to, ev->nh[i], ev->dist[i], ev->gamma[i]); } } } else { for (i = 0; i < ev->n_est; i++) Rprintf("%ld %ld %g %g\n", HIGH_NH(ev->nh[i]) + 1, LOW_NH(ev->nh[i]) + 1, ev->dist[i], ev->gamma[i]); } return; } /* fprint_sample_vgm */ gstat/src/pqueue.c0000644000176200001440000001110515060550314013630 0ustar liggesusers/* * priority queue, Jan-Apr 1998 * * I did a net search one day, and found so many implementations of * priority queues that I decided to write my own. For the fun of it. * * This one has no limits and needs a generic (qsort-like) comparison * function for element comparison at initialisation. To enqueue an * unordered array of elements, elements are sorted with qsort(), before * they are merged into the ordered queue. Only pointers to the next * element are stored (so it's basically an ordered single linked list). */ #include #include #include #include "defs.h" #include "userio.h" #include "data.h" #include "utils.h" #include "nsearch.h" #include "pqueue.h" static void enlarge_queue(QUEUE *q); static void enlarge_queue(QUEUE *q) { /* * don't use realloc() on `empty': all pointers to the * first element would have to be moved along with itself. */ int i; Q_ELEMENT *block; block = (Q_ELEMENT *) emalloc(Q_BUFFER_SIZE * sizeof(Q_ELEMENT)); for (i = 0; i < Q_BUFFER_SIZE - 1; i++) block[i].next = &(block[i+1]); block[Q_BUFFER_SIZE - 1].next = NULL; if (q->empty == NULL) q->empty = block; else q->empty->next = block; q->max_length += Q_BUFFER_SIZE; /* register block to free later on... */ q->blocks += 1; q->block = (Q_ELEMENT **) erealloc(q->block, q->blocks * sizeof(Q_ELEMENT *)); q->block[q->blocks - 1] = block; } QUEUE *init_queue(QUEUE *q, int (CDECL *cmp)(const QUEUE_NODE *a, const QUEUE_NODE *b)) { int i, j; if (q == NULL) { q = (QUEUE *) emalloc(sizeof(QUEUE)); q->max_length = q->blocks = 0; q->empty = NULL; q->block = NULL; q->cmp = cmp; enlarge_queue(q); } else { q->empty = q->block[0]; for (i = 0; i < q->blocks; i++) { for (j = 0; j < Q_BUFFER_SIZE - 1; j++) /* connect elements: */ q->block[i][j].next = &(q->block[i][j+1]); if (i < q->blocks - 1) /* connect elements between blocks: */ q->block[i][Q_BUFFER_SIZE - 1].next = &(q->block[i+1][0]); } q->block[q->blocks - 1][Q_BUFFER_SIZE - 1].next = NULL; } q->length = 0; q->head = NULL; return q; } void free_queue(QUEUE *q) { int i; if (q != NULL) { for (i = 0; i < q->blocks; i++) efree(q->block[i]); /* queue buffers */ if (q->block != NULL) efree(q->block); efree(q); } } static Q_ELEMENT *get_free(QUEUE *q) { Q_ELEMENT *e; if (q->empty->next == NULL) enlarge_queue(q); e = q->empty; q->empty = q->empty->next; return e; } void enqueue(QUEUE *q, QUEUE_NODE *el, int n) { /* * insert n elements in array el into the priority queue q */ Q_ELEMENT *e, *where, *next; int i = 0, p; if (q == NULL || el == NULL || n <= 0) ErrMsg(ER_NULL, "enqueue"); /* * first sort array el */ qsort(el, (size_t) n, sizeof(QUEUE_NODE), (int CDECL (*)(const void *,const void *)) q->cmp); /* * and then merge them with the priority queue q */ /* * find p, the number of elements in el[] that are smaller than * the first element in the queue, if any. * (Yes, we expect at least some of them to be closer than q->head) */ for (p = n; q->head != NULL && p > 0; p--) if (q->cmp(&(el[p-1]), &(q->head->el)) <= 0) break; /* out of this for loop */ /* * put these p elements in order at the queue head: */ for (i = p; i > 0; i--) { e = get_free(q); e->el = el[i-1]; e->next = q->head; q->head = e; } q->length += p; n -= p; /* * We might be done by now (n zero). * Process the remaining elements: */ where = q->head; /* starting point for insertion: */ next = where->next; /* the next element */ el += p; /* start of the remaining elements */ for (i = 0; i < n; i++) { e = get_free(q); /* get a free queue element */ e->el = el[i]; /* copy contents: */ /* * unless where is the last element, shift a position in the queue * when the element is larger than the insertion element e: */ while (next != NULL && q->cmp(&(e->el), &(next->el)) > 0) { where = next; next = where->next; } /* * now next points either to NULL or to the first element smaller * than or equal to e. So, insert e after where and before next: */ e->next = next; where->next = e; /* * the next element in el[] will should follow after e, * so shift where one position to start looking after e: */ where = e; } q->length += n; return; } QUEUE_NODE dequeue(QUEUE *q) { Q_ELEMENT *e; if (q->length == 0) ErrMsg(ER_NULL, "cannot dequeue empty queue"); e = q->head; /* get first queue element */ q->head = q->head->next; /* reset first to next */ e->next = q->empty; /* put the dequeued element in the empty queue */ q->empty = e; q->length--; return e->el; } gstat/src/utils.c0000644000176200001440000000472115060550314013472 0ustar liggesusers/* * utils.c: error checking functions for file, memory and string handling */ #include /* free(), malloc() etc */ #include /* tolower(), isspace() */ #include /* strlen(), memcmp() */ #include "defs.h" #include "userio.h" #include "utils.h" #include "glvars.h" #include "debug.h" void efree(void *p) { if (p == NULL) pr_warning("efree(): NULL pointer as argument"); else /* there's little point in calling free(NULL) */ free(p); } void *emalloc(size_t size) { void *p = NULL; if (size == 0) { pr_warning("emalloc(): size 0 requested"); return NULL; } p = (void *) malloc(size); if (p == NULL) { if (DEBUG_DUMP) message("malloc(%u) returned NULL", size); ErrMsg(ER_MEMORY, ""); } return p; } void *ecalloc(size_t nobj, size_t size) { void *p = NULL; if (size == 0) { pr_warning("ecalloc(): size 0 requested"); return NULL; } p = (void *) calloc(nobj, size); if (p == NULL) { if (DEBUG_DUMP) message("calloc(%u,%u) returned NULL", nobj, size); ErrMsg(ER_MEMORY, ""); } return p; } void *erealloc(void *p, size_t size) { if (size == 0) { pr_warning("erealloc(): size 0 requested"); return NULL; } if (p == NULL) p = (void *) malloc(size); else p = (void *) realloc(p, size); if (p == NULL) { if (DEBUG_DUMP) message("realloc(%u) returned NULL\n", size); ErrMsg(ER_MEMORY, ""); } return p; } void set_mv_float(float *f) { memset(f, 0xFF, sizeof(float)); } void set_mv_double(double *d) { memset(d, 0xFF, sizeof(double)); } int is_mv_float(const float *f) { const unsigned char u[sizeof(float)] = { 0xFF, 0xFF, 0xFF, 0xFF }; /* will choke if sizeof(float) != 4 */ return (memcmp(f, u, sizeof(float)) == 0); } int is_mv_double(const double *d) { const unsigned char u[sizeof(double)] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; /* will choke if sizeof(double) != 8 */ return (memcmp(d, &u, sizeof(double)) == 0); } /* * almost_equals() compares string value of token tok with str[], and * returns TRUE if they are identical up to the first $ in str[]. */ int almost_equals(const char *tok, const char *str) { int i, after = 0, start = 0, len; if (tok == NULL) return 0; /* must be a value--can't be equal */ len = strlen(tok); for (i = 0; i < len + after; i++) { if (str[i] != tok[start + i]) { if (str[i] != '$') return 0; else { after = 1; start--; } } } /* i now beyond end of token string */ return(after || str[i] == '$' || str[i] == '\0'); } gstat/src/getest.h0000644000176200001440000000010615060550314013623 0ustar liggesusersvoid get_est(DATA **data, METHOD method, DPOINT *where, double *est); gstat/src/mapio.h0000644000176200001440000001133115060550314013437 0ustar liggesusers#ifndef MAPIO_H /* avoid multiple inclusion */ #define MAPIO_H #ifdef HAVE_LIBGDAL # include "gdal.h" #endif /*! \file mapio.h \brief functions for reading and writing grid map in several formats */ /*! type of grid map format */ typedef enum { MT_UNKNOWN = 0, MT_CSF, /*!< PCRaster format (binary), API in csf directory */ MT_GDAL, /*!< GDAL format */ MT_ARCGRID, /*!< ArcInfo gridfile, gridascii (ascii) or gridfloat (binary) */ MT_IDRISI, /*!< Idrisi 32image file, ascii or binary */ MT_GNUPLOT, /*!< binary gnuplot 2d matrix format (cannot handle MV's) */ MT_T2, /*!< MIKE SHE ``T2'' 2d grid map format (www.dhi.dk) */ MT_ERMAPPER, /*!< ER-Mapper V5.0+ dataset with a single image channel */ MT_GRASS, /*!< Grass raster format, uses grass' gis library */ MT_GMT, /*!< GMT Grid format, uses NetCDF library */ MT_SURFER, /*!< Surfer DSAA (ascii grid) format */ MT_GSLIB /*!< GSLIB grid format (only a 2D subset) */ } MAPTYPE; /*! ER-Mapper celltypes used for read/write_binary */ typedef enum { CT_NONE = 0, CT_UNKNOWN = 1, CT_UINT8 = 2, CT_UINT16 = 3, CT_UINT32 = 4, CT_INT8 = 5, CT_INT16 = 6, CT_INT32 = 7, CT_IEEE4 = 8, CT_IEEE8 = 9 } CellType; #define UINT8 unsigned char #define UINT16 unsigned short int #define UINT32 unsigned long int #define INT8 char #define INT16 short int #define INT32 long int #define IEEE4 float #define IEEE8 double typedef enum { READ_ONLY = 0, WRITE_ONLY = 1 } MAP_READ_STATUS; /*! structure to hold grid map information */ typedef struct gridmap { MAPTYPE type; /*!< type of grid map */ MAP_READ_STATUS status; /*! READ_ONLY or WRITE_ONLY */ const char *filename; /*!< name (or base name) of grid map */ char *history, /*!< only used for CSF maps */ *description; /*!< only used for some maps */ unsigned int rows, /*!< number of rows in map */ cols, /*!< number of colums in map */ base_size, /*!< size of malloced area (cells), in case of blocked allocation */ current_row, /*!< current row, if reading/writing is row-wise */ *first_time_row; /*!< have we been at this row before? */ CellType celltype; /*!< cell type */ int is_binary, /*!< is this a binary map format */ swap_buf; /*!< swap contents of base buffer? */ double x_ul, /*!< x-coordinate upper left corner of map area */ y_ul, /*!< y-coordinate of upper left corner of map area */ cellsizex, /*!< size of grid cells in x-direction */ cellsizey; /*!< size of grid cells in y-direction */ float cellmin, /*!< minimum value of grid map */ cellmax, /*!< maximum value of grid map */ misval; /*!< missing value flag (if present) */ float **grid, /*!< 2d matrix holding the values (pointer array) */ *base; /*!< base pointer to malloc'ed or mmap'ed area */ void *CSF_MAP; /*!< cast to MAP * */ #ifdef HAVE_LIBGDAL GDALDatasetH hDataset; GDALDriverH hDriver; double *GeoTransform; #endif struct gridmap * (*write)(struct gridmap *m); /*!< write & close a map */ void (*read_row)(struct gridmap *m, float *buf, unsigned int row); void (*write_row)(struct gridmap *m, float *buf, unsigned int row); /* see mapio.c remark around #define CSF_ROWWISE for the last two */ } GRIDMAP; #define SQUARECELLSIZE(map) ((map->cellsizex != map->cellsizey ? \ ErrMsg(ER_IMPOSVAL, "cannot deal with non-square cells"), 0.0 : \ map->cellsizex)) GRIDMAP *map_read(GRIDMAP *m); int map_cell_is_mv(GRIDMAP *m, unsigned int row, unsigned int col); float map_get_cell(GRIDMAP *m, unsigned int row, unsigned int col); int map_put_cell(GRIDMAP *m, unsigned int row, unsigned int col, float value); int map_xy2rowcol(GRIDMAP *m, double x, double y, unsigned int *row, unsigned int *col); int map_rowcol2xy(GRIDMAP *m, unsigned int row, unsigned int col, double *x, double *y); GRIDMAP *map_dup(const char *fname, GRIDMAP *m); GRIDMAP *new_map(MAP_READ_STATUS status); void map_free(GRIDMAP *m); GRIDMAP *map_switch_type(GRIDMAP *in, MAPTYPE type); void map_name_nr(GRIDMAP *mask, const char *base, char *name, int nr, int max); int map_equal(GRIDMAP *a, GRIDMAP *b); #endif gstat/src/pqueue.h0000644000176200001440000000166315060550314013645 0ustar liggesusers#define Q_BUFFER_SIZE 100 /* something more practical */ typedef struct { union { QTREE_NODE *n; DPOINT *p; } u; int is_node; /* is u the QTREE_NODE (1) or rather the DPOINT (0) ? */ double dist2; /* squared distance to target location */ } QUEUE_NODE; typedef struct q_element { struct q_element *next; QUEUE_NODE el; } Q_ELEMENT; typedef struct { int length, max_length; Q_ELEMENT *head, /* pointer to first element in queue, NULL if empty */ *empty; /* pointer to empty elements (a stack), NULL if none left */ int blocks; /* size of memory block */ Q_ELEMENT **block; /* pointers to malloc'ed memory blocks */ int (CDECL *cmp)(const QUEUE_NODE *a, const QUEUE_NODE *b); /* qsort-able element comparison function */ } QUEUE; QUEUE *init_queue(QUEUE *q, int (CDECL *cmp)(const QUEUE_NODE *a, const QUEUE_NODE *b)); QUEUE_NODE dequeue(QUEUE *q); void enqueue(QUEUE *q, QUEUE_NODE *qpt, int n); void free_queue(QUEUE *q); gstat/src/s.c0000644000176200001440000007457515060550314012612 0ustar liggesusers/* * all functions exposed to R */ #include #include /* #include */ #include "defs.h" #include "data.h" #include "select.h" #include "utils.h" #include "userio.h" #include "vario.h" #include "fit.h" #include "sem.h" #include "glvars.h" #include "debug.h" #include "mapio.h" #include "msim.h" #include "getest.h" #include "s.h" static DATA_GRIDMAP *gstat_S_fillgrid(SEXP gridparams); static void gstat_set_block(long i, SEXP block, SEXP block_cols, DPOINT *current); int do_print_progress = 0; #define NAME_SIZE 20 /* buffer size for name */ extern unsigned int n_pred_locs; /* msim.c */ SEXP gstat_init(SEXP s_debug_level) { do_print_progress = 0; remove_all(); init_global_variables(); init_data_minmax(); GetRNGstate(); debug_level = INTEGER(s_debug_level)[0]; if (debug_level < 0) { debug_level = -debug_level; do_print_progress = 1; } return(s_debug_level); } SEXP gstat_exit(SEXP x) { PutRNGstate(); /* write seed back to R/S engine */ remove_all(); return(x); } SEXP gstat_new_data(SEXP sy, SEXP slocs, SEXP sX, SEXP has_intercept, SEXP beta, SEXP nmax, SEXP nmin, SEXP maxdist, SEXP force, SEXP vfn, SEXP sw, SEXP grid, SEXP degree, SEXP is_projected, SEXP vdist, SEXP lambda, SEXP omax) { double *y, *locs, *X, *w = NULL; long i, j, id, n, dim, n_X, has_int; DPOINT current; DATA **d; char name[NAME_SIZE]; PROTECT(sy = Rf_coerceVector(sy, REALSXP)); n = LENGTH(sy); y = REAL(sy); if (n == 0) ErrMsg(ER_IMPOSVAL, "no data read"); if (LENGTH(slocs) % n != 0) Rf_error("dimensions do not match: locations %d and data %ld", (int) LENGTH(slocs), n); dim = LENGTH(slocs) / n; if (dim <= 0) Rf_error("too few spatial dimensions: %ld", dim); if (dim > 3) Rf_error("too many spatial dimensions: %ld", dim); locs = REAL(slocs); if (LENGTH(sw) == n) w = REAL(sw); if (LENGTH(sX) % n != 0) Rf_error("dimensions do not match: X %d and data %ld: missing values in data?", (int) LENGTH(sX), n); n_X = LENGTH(sX) / n; X = REAL(sX); assert(n_X > 0); current.z = 0.0; current.bitfield = 0; id = get_n_vars(); snprintf(name, NAME_SIZE, "var%ld", id); which_identifier(name); d = get_gstat_data(); d[id]->id = id; d[id]->n_list = d[id]->n_max = 0; d[id]->colnx = d[id]->colny = d[id]->colnvalue = d[id]->colnz = 0; d[id]->x_coord = "x"; d[id]->y_coord = "y"; d[id]->z_coord = "z"; d[id]->variable = "R data"; d[id]->fname = "R data"; d[id]->lambda = REAL(lambda)[0]; has_int = INTEGER(has_intercept)[0]; /* increase d[id]->n_X and set d[id]->colX[i]: */ for (i = d[id]->n_X = 0; i < n_X; i++) data_add_X(d[id], i + (has_int ? 0 : 1)); assert(d[id]->n_X == n_X); for (i = 0; i < LENGTH(beta); i++) /* do nothing if beta is numeric(0) */ d[id]->beta = push_d_vector(REAL(beta)[i], d[id]->beta); if (INTEGER(nmax)[0] > 0) /* leave default (large) if < 0 */ d[id]->sel_max = INTEGER(nmax)[0]; if (INTEGER(omax)[0] > 0) /* leave default (0) if <= 0 */ d[id]->oct_max = INTEGER(omax)[0]; if (INTEGER(nmin)[0] > 0) /* leave default (0) if <= 0 */ d[id]->sel_min = INTEGER(nmin)[0]; if (REAL(maxdist)[0] > 0.0) d[id]->sel_rad = REAL(maxdist)[0]; if (INTEGER(force)[0] > 0) d[id]->force = INTEGER(force)[0]; switch(INTEGER(vfn)[0]) { case 1: /* d[id]->variance_fn = v_identity; == leave NULL */ break; case 2: d[id]->variance_fn = v_mu; break; case 3: d[id]->variance_fn = v_bin; break; case 4: d[id]->variance_fn = v_mu2; break; case 5: d[id]->variance_fn = v_mu3; break; default: Rf_error("unknown variance function %d", INTEGER(vfn)[0]); } gl_longlat = (INTEGER(is_projected)[0] == 0); d[id]->mode = X_BIT_SET | V_BIT_SET; if (dim > 1) d[id]->mode = d[id]->mode | Y_BIT_SET; if (dim > 2) d[id]->mode = d[id]->mode | Z_BIT_SET; set_norm_fns(d[id]); /* so gstat can calculate distances */ if (w != NULL) d[id]->colnvariance = 1; /* it is set */ switch(LENGTH(grid)) { case 0: case 1: break; /* empty, i.e., numeric(0) */ case 6: d[id]->grid = gstat_S_fillgrid(grid); break; default: Rf_error("length of grid topology %d unrecognized", (int) LENGTH(grid)); } d[id]->polynomial_degree = INTEGER(degree)[0]; if (d[id]->polynomial_degree < 0 || d[id]->polynomial_degree > 3) { Rf_error("polynomial degree should be 0, 1, 2 or 3"); } if (d[id]->polynomial_degree > 0) { /* we're doing polynomials through degree: */ if (id > 0) { Rf_error("polynomial degree will only work for a single variable"); } if (n_X > 1) { Rf_error("polynomial degree only works when no other predictors are given"); } setup_polynomial_X(d[id]); /* standardized coordinate polynomials */ } d[id]->vdist = INTEGER(vdist)[0]; assert(n_X <= d[id]->n_X); current.X = (double *) emalloc(d[id]->n_X * sizeof(double)); SET_POINT(¤t); current.u.stratum = 0; current.attr = current.x = current.y = current.z = 0.0; for (i = 0; i < n; i++) { /* loop over points */ current.attr = y[i]; current.x = locs[i]; if (dim >= 2) current.y = locs[n + i]; if (dim >= 3) current.z = locs[2 * n + i]; /* track min/max coordinates, also for z, for the qtree bbox */ if (i == 0) { d[id]->maxX = d[id]->minX = current.x; d[id]->maxY = d[id]->minY = current.y; d[id]->maxZ = d[id]->minZ = current.z; } else { d[id]->minX = MIN(d[id]->minX, current.x); d[id]->maxX = MAX(d[id]->maxX, current.x); d[id]->minY = MIN(d[id]->minY, current.y); d[id]->maxY = MAX(d[id]->maxY, current.y); d[id]->minZ = MIN(d[id]->minZ, current.z); d[id]->minZ = MIN(d[id]->minZ, current.z); } for (j = 0; j < n_X; j++) current.X[j] = X[j * n + i]; if (w != NULL) current.variance = 1.0/(w[i]); push_point(d[id], ¤t); } check_global_variables(); d[id]->n_original = d[id]->n_list; efree(current.X); UNPROTECT(1); /* sy */ return(sy); } SEXP gstat_new_dummy_data(SEXP loc_dim, SEXP has_intercept, SEXP beta, SEXP nmax, SEXP nmin, SEXP maxdist, SEXP vfn, SEXP is_projected, SEXP vdist) { int i, id, dim, has_int; char name[NAME_SIZE]; DATA **d = NULL; dim = INTEGER(loc_dim)[0]; if (dim <= 0) Rf_error("dimension value impossible: %d", dim); if (dim > 3) Rf_error("too many dimensions: %d", dim); assert(LENGTH(beta) > 0); id = get_n_vars(); snprintf(name, NAME_SIZE, "var%d", id); which_identifier(name); d = get_gstat_data(); d[id]->id = id; d[id]->n_list = d[id]->n_max = 0; d[id]->colnx = d[id]->colny = d[id]->colnvalue = d[id]->colnz = 0; d[id]->x_coord = "x"; d[id]->y_coord = "y"; d[id]->z_coord = "z"; d[id]->variable = "R data"; d[id]->fname = "R data"; has_int = INTEGER(has_intercept)[0]; for (i = d[id]->n_X = 0; i < LENGTH(beta); i++) data_add_X(d[id], i + (has_int ? 0 : 1)); assert(d[id]->n_X == LENGTH(beta)); d[id]->dummy = 1; for (i = 0; i < LENGTH(beta); i++) d[id]->beta = push_d_vector(REAL(beta)[i], d[id]->beta); if (INTEGER(nmax)[0] > 0) /* leave default (large) if < 0 */ d[id]->sel_max = INTEGER(nmax)[0]; /* I doubt whether using nmin for dummy data _ever_ can have a * meaning, but hey, let's add it anyway. */ if (INTEGER(nmin)[0] > 0) /* leave default (0) if <= 0 */ d[id]->sel_min = INTEGER(nmin)[0]; if (REAL(maxdist)[0] > 0.0) d[id]->sel_rad = REAL(maxdist)[0]; switch(INTEGER(vfn)[0]) { case 1: /* d[id]->variance_fn = v_identity; -> leave NULL */ break; case 2: d[id]->variance_fn = v_mu; break; case 3: d[id]->variance_fn = v_bin; break; case 4: d[id]->variance_fn = v_mu2; break; case 5: d[id]->variance_fn = v_mu3; break; default: Rf_error("unknown variance function %d", INTEGER(vfn)[0]); } gl_longlat = (INTEGER(is_projected)[0] == 0); d[id]->vdist = INTEGER(vdist)[0]; d[id]->mode = X_BIT_SET | V_BIT_SET; if (dim > 1) d[id]->mode = d[id]->mode | Y_BIT_SET; if (dim > 2) d[id]->mode = d[id]->mode | Z_BIT_SET; set_norm_fns(d[id]); /* so gstat can calculate distances */ check_global_variables(); d[id]->n_original = d[id]->n_list; return(loc_dim); } SEXP gstat_predict(SEXP sn, SEXP slocs, SEXP sX, SEXP block_cols, SEXP block, SEXP weights, SEXP nsim, SEXP blue) { double *locs, **est_all, *X; long i, j, k, n, nvars, nest, dim, n_X, ncols_block, nrows_block, pos; DPOINT current, *bp = NULL; DATA **d = NULL, *vd = NULL, *area = NULL; SEXP ret; SEXP retvector; SEXP retvector_dim; extern unsigned int n_pred_locs; /* predict.c, used in msim.c */ float ***msim = NULL; nvars = get_n_vars(); nest = nvars + (nvars * (nvars + 1))/2; n = INTEGER(sn)[0]; if (n <= 0 || LENGTH(slocs) == 0 || LENGTH(sX) == 0) ErrMsg(ER_IMPOSVAL, "newdata empty or only NA's"); if (LENGTH(slocs) % n != 0) Rf_error("dimensions do not match: locations %d, nrows in X %ld", (int) LENGTH(slocs), n); dim = LENGTH(slocs) / n; if (dim > 3) Rf_error("too many spatial dimensions: %ld", dim); if (dim <= 0) Rf_error("too few spatial dimensions: %ld", dim); locs = REAL(slocs); if (LENGTH(sX) % n != 0) Rf_error("dimensions do not match: X %d and data %ld", (int) LENGTH(sX), n); n_X = LENGTH(sX) / n; current.attr = current.x = current.y = current.z = 0.0; current.bitfield = 0; /* assuming points ... */ SET_POINT(¤t); /* and then do the block thing: */ if (LENGTH(block_cols) == 0) { bp = get_block_p(); bp->x = bp->y = bp->z = 0.0; /* obsolete, I'd guess */ if (LENGTH(block) >= 1) { bp->x = REAL(block)[0]; SET_BLOCK(¤t); } if (LENGTH(block) >= 2) bp->y = REAL(block)[1]; if (LENGTH(block) >= 3) bp->z = REAL(block)[2]; if (LENGTH(block) > 3) pr_warning("block dimension can only be 3; using the first 3"); } else if (LENGTH(block_cols) == 1) { /* if > 1, block contains multiple 2D blocks */ ncols_block = INTEGER(block_cols)[0]; if (ncols_block < 1 || ncols_block > 3) ErrMsg(ER_IMPOSVAL, "block dimensions should be in [1..3]"); nrows_block = LENGTH(block) / ncols_block; /* nr of rows */ if (nrows_block > 0) { area = create_data_area(); area->colnvariance = 0; area->n_list = area->n_max = 0; area->id = ID_OF_AREA; area->mode = X_BIT_SET; if (ncols_block > 1) area->mode = area->mode & Y_BIT_SET; if (ncols_block > 2) area->mode = area->mode & Z_BIT_SET; for (i = 0; i < nrows_block; i++) { current.x = REAL(block)[i]; if (ncols_block > 1) current.y = REAL(block)[nrows_block + i]; if (ncols_block > 2) current.z = REAL(block)[2 * nrows_block + i]; if (LENGTH(weights) > 0) { area->colnvariance = 1; current.variance = REAL(weights)[i]; } push_point(area, ¤t); } SET_BLOCK(¤t); } if (DEBUG_FORCE) print_data_list(area); } X = REAL(sX); assert(n_X > 0); current.X = (double *) emalloc(n_X * sizeof(double)); current.u.stratum = 0; d = get_gstat_data(); est_all = (double **) emalloc(n * sizeof(double *)); for (i = 0; i < n; i++) est_all[i] = (double *) emalloc(nest * sizeof(double)); /* * the following is to fake gstat's default method handling: * we got to suggest that we'll go through a list of prediction * locations, a la the gstat ``data(): ... ;'' command. */ vd = get_dataval(); vd->id = ID_OF_VALDATA; vd->mode = d[0]->mode; /* set min/max[XYZ] */ vd->minY = vd->maxY = vd->minZ = vd->maxZ = 0.0; vd->minX = vd->maxX = locs[0]; for (i = 1; i < n; i++) { vd->minX = MIN(vd->minX, locs[i]); vd->maxX = MAX(vd->maxX, locs[i]); } if (dim >= 2) { vd->minY = vd->maxY = locs[n]; for (i = 1; i < n; i++) { vd->minY = MIN(vd->minY, locs[n + i]); vd->maxY = MAX(vd->maxY, locs[n + i]); } } if (dim >= 3) { vd->minZ = vd->maxZ = locs[2 * n]; for (i = 1; i < n; i++) { vd->minZ = MIN(vd->minZ, locs[2 * n + i]); vd->maxZ = MAX(vd->maxZ, locs[2 * n + i]); } } /* fill, and standardize coordinate predictors from degree = x */ for (i = 0; i < nvars; i++) setup_data_minmax(d[i]); setup_data_minmax(vd); for (i = 0; i < nvars; i++) calc_polynomials(d[i]); /* calc_polynomials(vd); */ /* still no data in fake vd */ vd->polynomial_degree = d[0]->polynomial_degree; if (vd->polynomial_degree > 0) { setup_polynomial_X(vd); /* standardized coordinate polynomials */ current.X = (double *) erealloc(current.X, vd->n_X * sizeof(double)); } /* so far for the faking; now let's see what gstat makes out of this: */ if (INTEGER(nsim)[0] == 0) { if (INTEGER(blue)[0] == 0) { /* FALSE */ if (get_method() == NSP) /* choose default */ set_method(get_default_method()); } else set_method(LSLM); } else { if (INTEGER(nsim)[0] < 0) { gl_nsim = -(INTEGER(nsim)[0]); set_method(ISI); } else { gl_nsim = INTEGER(nsim)[0]; set_method(GSI); } n_pred_locs = n; if (gl_nsim > 1) init_simulations(d); if (get_n_beta_set() != get_n_vars()) setup_beta(d, get_n_vars(), gl_nsim); } set_mode(); /* simple, stratified, multivariable? */ check_global_variables(); /* it's there, better do it now */ if (debug_level) Rprintf("[%s]\n", method_string(get_method())); #ifdef WIN32 R_FlushConsole(); R_ProcessEvents(); #endif for (i = 0; i < n; i++) { print_progress(i, n); if (LENGTH(block_cols) > 1) gstat_set_block(i, block, block_cols, ¤t); current.x = locs[i]; if (dim >= 2) current.y = locs[n + i]; if (dim >= 3) current.z = locs[2 * n + i]; for (j = 0; j < n_X; j++) current.X[j] = X[j * n + i]; /* transform standardized coordinate polynomial here */ if (vd->polynomial_degree) calc_polynomial_point(vd, ¤t); for (j = 0; j < get_n_vars(); j++) select_at(d[j], ¤t); get_est(d, get_method(), ¤t, est_all[i]); #ifdef WIN32 R_ProcessEvents(); /* avoid terminal freeze in R/Win */ #endif R_CheckUserInterrupt(); } print_progress(100, 100); PROTECT(ret = Rf_allocVector(VECSXP, 1)); PROTECT(retvector_dim = Rf_allocVector(REALSXP, 2)); REAL(retvector_dim)[0] = n; /* nrows */ if (gl_nsim > 1) { PROTECT(retvector = Rf_allocVector(REALSXP, gl_nsim * nvars * n)); msim = get_msim(); for (i = pos = 0; i < nvars; i++) for (j = 0; j < gl_nsim; j++) for (k = 0; k < n; k++) { if (is_mv_float(&(msim[i][k][j]))) REAL(retvector)[pos++] = NA_REAL; else REAL(retvector)[pos++] = msim[i][k][j]; } REAL(retvector_dim)[1] = nvars * gl_nsim; /* ncols */ } else { PROTECT(retvector = Rf_allocVector(REALSXP, n * nest)); for (j = pos = 0; j < nest; j++) { for (i = 0; i < n; i++) { if (is_mv_double(&(est_all[i][j]))) REAL(retvector)[pos] = NA_REAL; else REAL(retvector)[pos] = est_all[i][j]; pos++; } } REAL(retvector_dim)[1] = nest; /* ncols */ } if (gl_nsim > 0) free_simulations(); /* SET_DIM(retvector, retvector_dim); */ Rf_setAttrib(retvector, R_DimSymbol, retvector_dim); SET_VECTOR_ELT(ret, 0, retvector); for (i = 0; i < n; i++) efree(est_all[i]); efree(est_all); efree(current.X); UNPROTECT(3); return(ret); } static void gstat_set_block(long i, SEXP block, SEXP block_cols, DPOINT *current) { DATA *area; VARIOGRAM *v; long nrows_block, start, end, j; if (i >= LENGTH(block_cols) || i < 0) ErrMsg(ER_IMPOSVAL, "block_cols length less than nr of prediction locations"); nrows_block = LENGTH(block) / 2; /* nr of rows */ start = INTEGER(block_cols)[i]; if (i == LENGTH(block_cols) - 1) end = nrows_block; else end = INTEGER(block_cols)[i+1] - 1; area = get_data_area(); if (area != NULL) free_data(area); area = create_data_area(); area->n_list = area->n_max = 0; area->id = ID_OF_AREA; area->mode = X_BIT_SET & Y_BIT_SET; for (j = start - 1; j < end; j++) { current->x = REAL(block)[j]; current->y = REAL(block)[nrows_block + j]; push_point(area, current); } SET_BLOCK(current); if (DEBUG_FORCE) print_data_list(area); for (j = 0; j < get_n_vgms(); j++) { v = get_vgm(j); if (v != NULL) v->block_semivariance_set = v->block_covariance_set = 0; /* don't store under these circumstances! */ } return; } SEXP gstat_variogram(SEXP s_ids, SEXP cutoff, SEXP width, SEXP direction, SEXP cressie, SEXP dX, SEXP boundaries, SEXP grid, SEXP cov, SEXP pseudo) { SEXP ret; SEXP np; SEXP dist; SEXP gamma; SEXP sx; SEXP sy; SEXP ev_parameters; /* SEXP y; */ long i, id1, id2, nest; VARIOGRAM *vgm; DATA **d; GRIDMAP *m; unsigned int row, col, n; id1 = INTEGER(s_ids)[0]; if (LENGTH(s_ids) > 1) id2 = INTEGER(s_ids)[1]; else id2 = id1; vgm = get_vgm(LTI(id1,id2)); vgm->id = LTI(id1,id2); vgm->id1 = id1; vgm->id2 = id2; if (INTEGER(cov)[0] == 0) vgm->ev->evt = (id1 == id2 ? SEMIVARIOGRAM : CROSSVARIOGRAM); else if (INTEGER(cov)[0] == 1) vgm->ev->evt = (id1 == id2 ? COVARIOGRAM : CROSSCOVARIOGRAM); else { if (id1 != id2) ErrMsg(ER_IMPOSVAL, "cannot compute pairwise relative cross semivariogram"); if (INTEGER(cov)[0] == 2) vgm->ev->evt = PRSEMIVARIOGRAM; } /* vgm->ev->is_asym = INTEGER(asym)[0]; */ vgm->ev->pseudo = INTEGER(pseudo)[0]; vgm->ev->recalc = 1; if (LENGTH(cutoff) > 0) gl_cutoff = REAL(cutoff)[0]; if (LENGTH(width) > 0) gl_iwidth = REAL(width)[0]; gl_alpha = REAL(direction)[0]; gl_beta = REAL(direction)[1]; gl_tol_hor = REAL(direction)[2]; gl_tol_ver = REAL(direction)[3]; gl_cressie = INTEGER(cressie)[0]; if (LENGTH(dX) > 0) { d = get_gstat_data(); d[id1]->dX = REAL(dX)[0]; d[id2]->dX = REAL(dX)[0]; } for (i = 0; i < LENGTH(boundaries); i++) /* does nothing if LENGTH is 0 */ push_bound(REAL(boundaries)[i]); switch (LENGTH(grid)) { case 0: case 1: break; case 6: vgm->ev->S_grid = gstat_S_fillgrid(grid); break; default: Rf_error("unrecognized grid length in gstat_variogram"); break; } calc_variogram(vgm, NULL); if (vgm->ev->S_grid != NULL) { PROTECT(ret = Rf_allocVector(VECSXP, 4)); m = vgm->ev->map; n = m->rows * m->cols; PROTECT(np = Rf_allocVector(REALSXP, n)); PROTECT(gamma = Rf_allocVector(REALSXP, n)); PROTECT(sx = Rf_allocVector(REALSXP, n)); PROTECT(sy = Rf_allocVector(REALSXP, n)); for (row = i = 0; row < m->rows; row++) { for (col = 0; col < m->cols; col++) { map_rowcol2xy(m, row, col, &(REAL(sx)[i]), &(REAL(sy)[i])); REAL(np)[i] = vgm->ev->nh[i]; if (vgm->ev->nh[i] > 0) REAL(gamma)[i] = vgm->ev->gamma[i]; else REAL(gamma)[i] = NA_REAL; i++; } } SET_VECTOR_ELT(ret, 0, sx); SET_VECTOR_ELT(ret, 1, sy); SET_VECTOR_ELT(ret, 2, np); SET_VECTOR_ELT(ret, 3, gamma); free_data_gridmap(vgm->ev->S_grid); UNPROTECT(5); } else { if (vgm->ev->cloud) nest = vgm->ev->n_est; else { if (vgm->ev->zero == ZERO_SPECIAL) nest = vgm->ev->n_est; else nest = vgm->ev->n_est - 1; } PROTECT(ret = Rf_allocVector(VECSXP, 4)); if (nest <= 0) { UNPROTECT(1); return(ret); } PROTECT(np = Rf_allocVector(REALSXP, nest)); PROTECT(dist = Rf_allocVector(REALSXP, nest)); PROTECT(gamma = Rf_allocVector(REALSXP, nest)); PROTECT(ev_parameters = Rf_allocVector(REALSXP, 4)); REAL(ev_parameters)[0] = vgm->ev->cutoff; REAL(ev_parameters)[1] = vgm->ev->iwidth; REAL(ev_parameters)[2] = vgm->ev->pseudo; REAL(ev_parameters)[3] = vgm->ev->is_asym; for (i = 0; i < nest; i++) { REAL(np)[i] = vgm->ev->nh[i]; REAL(dist)[i] = vgm->ev->dist[i]; REAL(gamma)[i] = vgm->ev->gamma[i]; } SET_VECTOR_ELT(ret, 0, np); SET_VECTOR_ELT(ret, 1, dist); SET_VECTOR_ELT(ret, 2, gamma); SET_VECTOR_ELT(ret, 3, ev_parameters); UNPROTECT(5); } return(ret); } SEXP gstat_load_variogram(SEXP s_ids, SEXP s_model, SEXP s_sills, SEXP s_ranges, SEXP s_kappas, SEXP s_anis_all, SEXP s_table, SEXP s_max_val) { VARIOGRAM *vgm; long i, n, id1, id2, max_id; double anis[5] = {0.0, 0.0, 0.0, 1.0, 1.0}, rpars[2], *sills, *ranges, *kappas, *anis_all; const char *model; sills = REAL(s_sills); ranges = REAL(s_ranges); kappas = REAL(s_kappas); anis_all = REAL(s_anis_all); id1 = INTEGER(s_ids)[0]; id2 = INTEGER(s_ids)[1]; max_id = MAX(id1, id2); if (get_n_vars() == 0) which_identifier("xx"); /* at least "load" one dummy var */ if (max_id >= get_n_vars()) ErrMsg(ER_IMPOSVAL, "gstat_load_variogram has been called with max_id >= n_vars"); vgm = get_vgm(LTI(id1,id2)); assert(vgm != NULL); vgm->id = LTI(id1,id2); vgm->id1 = id1; vgm->id2 = id2; vgm->n_models = vgm->n_fit = 0; n = LENGTH(s_sills); for (i = 0; i < n; i++) { /* loop over sub models */ model = CHAR(STRING_ELT(s_model, i)); anis[0] = anis_all[0 * n + i]; anis[1] = anis_all[1 * n + i]; anis[2] = anis_all[2 * n + i]; anis[3] = anis_all[3 * n + i]; anis[4] = anis_all[4 * n + i]; rpars[0] = ranges[i]; rpars[1] = kappas[i]; if (LENGTH(s_table) > 0) push_to_v_table(vgm, rpars[0], LENGTH(s_table), REAL(s_table), (anis[3] == 1.0 && anis[4] == 1.0) ? NULL : anis); else push_to_v(vgm, model, sills[i], rpars, 2, (anis[3] == 1.0 && anis[4] == 1.0) ? NULL : anis, 1, 1); } update_variogram(vgm); if (REAL(s_max_val)[0] > 0.0 || REAL(s_max_val)[1] > 0.0 || REAL(s_max_val)[2] > 0.0) vgm->max_val = get_semivariance(vgm, REAL(s_max_val)[0], REAL(s_max_val)[1], REAL(s_max_val)[2]); if (DEBUG_DUMP) logprint_variogram(vgm, 1); return(s_model); } SEXP gstat_variogram_values(SEXP ids, SEXP pars, SEXP covariance, SEXP dist_values) { double from, to, n, d, x = 1.0, y = 0.0, z = 0.0; int i, id1, id2, cov = 0, ndist = 0; VARIOGRAM *vgm; SEXP dist; SEXP gamma; SEXP ret; if (LENGTH(pars) != 3 && LENGTH(pars) != 6) Rf_error("supply three or six distance parameters"); from = REAL(pars)[0]; to = REAL(pars)[1]; n = REAL(pars)[2]; ndist = LENGTH(dist_values); cov = INTEGER(covariance)[0]; if (LENGTH(pars) == 6) { x = REAL(pars)[3]; y = REAL(pars)[4]; z = REAL(pars)[5]; } id1 = INTEGER(ids)[0]; id2 = INTEGER(ids)[1]; vgm = get_vgm(LTI(id1,id2)); if (ndist > 0) { PROTECT(dist = Rf_allocVector(REALSXP, ndist)); PROTECT(gamma = Rf_allocVector(REALSXP, ndist)); for (i = 0; i < ndist; i++) { d = REAL(dist_values)[i]; REAL(dist)[i] = d; REAL(gamma)[i] = (cov ? get_covariance(vgm, d * x, d * y, d * z) : get_semivariance(vgm, d * x, d * y, d * z)); } } else { PROTECT(dist = Rf_allocVector(REALSXP, n)); PROTECT(gamma = Rf_allocVector(REALSXP, n)); for (i = 0; i < n; i++) { d = from; if (i > 0) /* implies n > 1 */ d += (i/(n-1))*(to-from); REAL(dist)[i] = d; REAL(gamma)[i] = (cov ? get_covariance(vgm, d * x, d * y, d * z) : get_semivariance(vgm, d * x, d * y, d * z)); } } PROTECT(ret = Rf_allocVector(VECSXP, 2)); SET_VECTOR_ELT(ret, 0, dist); SET_VECTOR_ELT(ret, 1, gamma); UNPROTECT(3); return(ret); } // Added by Paul Hiemstra, 30-06-2008 SEXP get_covariance_list(SEXP ids, SEXP covariance, SEXP dist_list) { double d, x = 1.0, y = 0.0, z = 0.0; int i, id1, id2, cov = 0; VARIOGRAM *vgm; SEXP dist; SEXP gamma; SEXP ret; int length_list = LENGTH(dist_list); cov = INTEGER(covariance)[0]; id1 = INTEGER(ids)[0]; id2 = INTEGER(ids)[1]; vgm = get_vgm(LTI(id1,id2)); PROTECT(dist = Rf_allocVector(REALSXP, length_list)); PROTECT(gamma = Rf_allocVector(REALSXP, length_list)); for (i = 0; i < length_list; i++) { d = REAL(dist_list)[i]; REAL(dist)[i] = d; REAL(gamma)[i] = (cov ? get_covariance(vgm, d * x, d * y, d * z) : get_semivariance(vgm, d * x, d * y, d * z)); } PROTECT(ret = Rf_allocVector(VECSXP, 2)); SET_VECTOR_ELT(ret, 0, dist); SET_VECTOR_ELT(ret, 1, gamma); UNPROTECT(3); return(ret); } SEXP gstat_get_variogram_models(SEXP dolong) { SEXP ret; int i, n = 0, do_long; for (i = 1; v_models[i].model != NOT_SP; i++) n++; do_long = INTEGER(dolong)[0]; PROTECT(ret = Rf_allocVector(STRSXP, n)); for (i = 1; v_models[i].model != NOT_SP; i++) SET_STRING_ELT(ret, i-1, Rf_mkChar(do_long ? v_models[i].name_long : v_models[i].name)); UNPROTECT(1); return(ret); } SEXP gstat_load_ev(SEXP np, SEXP dist, SEXP gamma) { int i, cloud = 1; VARIOGRAM *vgm; which_identifier("xx"); /* * vgm = get_vgm(LTI(INTEGER(id)[0], INTEGER(id)[1])); * */ vgm = get_vgm(LTI(0, 0)); if (vgm->ev == NULL) vgm->ev = init_ev(); vgm->ev->evt = SEMIVARIOGRAM; vgm->ev->n_est = LENGTH(np); vgm->ev->n_max = LENGTH(np); vgm->ev->gamma = (double *) emalloc (sizeof(double) * vgm->ev->n_max); vgm->ev->dist = (double *) emalloc (sizeof(double) * vgm->ev->n_max); vgm->ev->nh = (unsigned long *) emalloc (sizeof(long) * vgm->ev->n_max); for (i = 0; i < vgm->ev->n_est; i++) { vgm->ev->nh[i] = REAL(np)[i]; vgm->ev->dist[i] = REAL(dist)[i]; vgm->ev->gamma[i] = REAL(gamma)[i]; if (cloud && vgm->ev->nh[i] > 1) cloud = 0; } vgm->ev->cloud = cloud; if (DEBUG_VGMFIT) fprint_sample_vgm(vgm->ev); return(np); } SEXP gstat_fit_variogram(SEXP fit, SEXP fit_sill, SEXP fit_range) { int i; VARIOGRAM *vgm; SEXP ret; SEXP sills; SEXP ranges; SEXP SSErr; SEXP fit_is_singular; vgm = get_vgm(LTI(0, 0)); vgm->ev->fit = INTEGER(fit)[0]; for (i = 0; i < vgm->n_models; i++) { vgm->part[i].fit_sill = INTEGER(fit_sill)[i]; vgm->part[i].fit_range = INTEGER(fit_range)[i]; } update_variogram(vgm); if (DEBUG_VGMFIT) logprint_variogram(vgm, 1); fit_variogram(vgm); if (DEBUG_VGMFIT) logprint_variogram(vgm, 1); PROTECT(sills = Rf_allocVector(REALSXP, vgm->n_models)); PROTECT(ranges = Rf_allocVector(REALSXP, vgm->n_models)); for (i = 0; i < vgm->n_models; i++) { REAL(sills)[i] = vgm->part[i].sill; REAL(ranges)[i] = vgm->part[i].range[0]; } PROTECT(ret = Rf_allocVector(VECSXP, 4)); SET_VECTOR_ELT(ret, 0, sills); SET_VECTOR_ELT(ret, 1, ranges); PROTECT(fit_is_singular = Rf_allocVector(REALSXP, 1)); REAL(fit_is_singular)[0] = vgm->fit_is_singular; SET_VECTOR_ELT(ret, 2, fit_is_singular); PROTECT(SSErr = Rf_allocVector(REALSXP, 1)); REAL(SSErr)[0] = vgm->SSErr; SET_VECTOR_ELT(ret, 3, SSErr); UNPROTECT(5); return(ret); } SEXP gstat_debug_level(SEXP level) { debug_level = INTEGER(level)[0]; return(level); } SEXP gstat_set_method(SEXP to) { const char *what; what = CHAR(STRING_ELT(to, 0)); for (int id = 1; methods[id].name != NULL; id++) { if (almost_equals(what, methods[id].name)) { set_method(methods[id].m); break; /* id-loop */ } } return(to); } SEXP gstat_set_set(SEXP arg, SEXP val) { const char *name; int i; typedef struct { const char *name; void *ptr; enum { UNKNOWN, IS_INT, IS_UINT, IS_REAL, IS_STRING, IS_D_VECTOR, NO_ARG } what; enum { NOLIMIT, GEZERO, GTZERO } limit; } GSTAT_EXPR; const GSTAT_EXPR set_options[] = { { "alpha", &gl_alpha, IS_REAL, GEZERO }, { "beta", &gl_beta, IS_REAL, GEZERO }, { "blas", &gl_blas, IS_INT, GEZERO }, { "choleski", &gl_choleski, IS_INT, GEZERO }, { "co$incide", &gl_coincide, IS_INT, GEZERO }, { "Cr$essie", &gl_cressie, IS_INT, GEZERO }, { "cutoff", &gl_cutoff, IS_REAL, GTZERO }, { "de$bug", &debug_level, IS_INT, GEZERO }, { "fit", &gl_fit, IS_INT, GEZERO }, { "fit_l$imit", &gl_fit_limit, IS_REAL, GTZERO }, { "fr$action", &gl_fraction, IS_REAL, GTZERO }, /* { "display", &gl_display, IS_STRING, NOLIMIT }, */ { "gls$_residuals", &gl_gls_residuals, IS_INT, GEZERO }, { "id$p", &gl_idp, IS_REAL, GEZERO }, { "in$tervals", &gl_n_intervals, IS_INT, GTZERO }, { "it$er", &gl_iter, IS_INT, GEZERO }, { "lhs", &gl_lhs, IS_INT, GEZERO }, { "longlat", &gl_longlat, IS_INT, GEZERO }, { "sim_beta", &gl_sim_beta, IS_INT, GEZERO }, { "n_uk", &gl_n_uk, IS_INT, GEZERO }, { "numbers", &gl_numbers, IS_INT, GEZERO }, { "nb$lockdiscr", &gl_nblockdiscr, IS_INT, GTZERO }, { "no$check", &gl_nocheck, IS_INT, GEZERO }, { "ns$im", &gl_nsim, IS_INT, GTZERO }, { "or$der", &gl_order, IS_INT, GEZERO }, { "q$uantile", &gl_quantile, IS_REAL, GEZERO }, { "rowwise", &gl_rowwise, IS_INT, GEZERO }, { "rp", &gl_rp, IS_INT, GEZERO }, { "see$d", &gl_seed, IS_INT, GTZERO }, { "useed", &gl_seed, IS_UINT, GEZERO }, { "spa$rse", &gl_sparse, IS_INT, GEZERO }, { "spi$ral", &gl_spiral, IS_INT, GEZERO }, { "spl$it", &gl_split, IS_INT, GTZERO }, { "sy$mmetric", &gl_sym_ev, IS_INT, GEZERO }, { "tol_h$or", &gl_tol_hor, IS_REAL, GEZERO }, { "tol_v$er", &gl_tol_ver, IS_REAL, GEZERO }, { "v$erbose", &debug_level, IS_INT, GEZERO }, { "w$idth", &gl_iwidth, IS_REAL, GEZERO }, { "x$valid", &gl_xvalid, IS_INT, GEZERO }, { "zero_di$st", &gl_zero_est, IS_INT, GEZERO }, { "zero", &gl_zero, IS_REAL, GEZERO }, { "zm$ap", &gl_zmap, IS_REAL, NOLIMIT }, { NULL, NULL, 0, 0 } }; name = CHAR(STRING_ELT(arg, 0)); for (i = 0; set_options[i].name; i++) if (almost_equals(name, set_options[i].name)) break; /* break out i-loop */ if (set_options[i].name == NULL) ErrMsg(ER_SYNTAX, name); if (almost_equals((const char *)name, "nb$lockdiscr")) gl_gauss = 0; /* side effect */ switch (set_options[i].what) { case IS_INT: *((int *) set_options[i].ptr) = Rf_asInteger(val); /* Rprintf("int arg: %s val %d\n", name, Rf_asInteger(val)); */ break; case IS_UINT: *((unsigned int *) set_options[i].ptr) = (unsigned int) Rf_asInteger(val); /* Rprintf("uint arg: %s val %d\n", name, Rf_asInteger(val)); */ break; case IS_REAL: *((double *) set_options[i].ptr) = Rf_asReal(val); /* Rprintf("real arg: %s val %d\n", name, asReal(val)); */ break; case IS_STRING: *((const char **) set_options[i].ptr) = CHAR(STRING_ELT(val, 0)); break; default: ErrMsg(ER_SYNTAX, name); break; } return val; } SEXP gstat_set_merge(SEXP a, SEXP b, SEXP c, SEXP d) { /* merge a(b) with c(d); */ DATA **dpp; int id, id1, id2, col1, col2; id1 = Rf_asInteger(a); id2 = Rf_asInteger(c); if (id1 >= get_n_vars() || id2 >= get_n_vars() || id1 < 0 || id2 < 0) ErrMsg(ER_IMPOSVAL, "id values out of range"); col1 = Rf_asInteger(b); col2 = Rf_asInteger(d); if (id1 < id2) { /* swap id and col */ id = id1; id1 = id2; id2 = id; id = col1; col1 = col2; col2 = id; } dpp = get_gstat_data(); if (push_to_merge_table(dpp[id1], id2, col1, col2)) ErrMsg(ER_IMPOSVAL, "attempt to merge failed"); return(a); } double r_uniform(void) { return(unif_rand()); } double r_normal(void) { return(norm_rand()); } static DATA_GRIDMAP *gstat_S_fillgrid(SEXP gridparams) { double x_ul, y_ul, cellsizex, cellsizey; unsigned int rows, cols; cellsizex = REAL(gridparams)[2]; cellsizey = REAL(gridparams)[3]; rows = (unsigned int) REAL(gridparams)[5]; cols = (unsigned int) REAL(gridparams)[4]; x_ul = REAL(gridparams)[0] - 0.5 * cellsizex; y_ul = REAL(gridparams)[1] + (rows - 0.5) * cellsizey; return gsetup_gridmap(x_ul, y_ul, cellsizex, cellsizey, rows, cols); } gstat/src/msim.c0000644000176200001440000002321315060550314013274 0ustar liggesusers/* * msim.c: multiple simulation database + output * Written during my Post Doc at UvA, end of 1996. * Rewrite started on Sat Apr 10 20:54:05 WET DST 1999 */ #include #include /* qsort() */ #include /* memmove() */ #include /* sqrt(), ... */ #include "defs.h" #include #include "debug.h" #include "data.h" #include "utils.h" #include "vario.h" #include "glvars.h" /* gl_nsim, gl_format */ #include "userio.h" #include "mapio.h" #include "mtrx.h" #include "lm.h" #include "gls.h" #include "sim.h" #include "msim.h" static DPOINT *which_point(DATA *d, DPOINT *where); static unsigned int *get_n_sim_locs_table(unsigned int *size); /* global variables formerly in predict.c; set in s.c */ unsigned int n_pred_locs = 0; #ifdef SIM_DOUBLE typedef double Float; /* doubles the memory requirement -> may be pretty much */ #else typedef float Float; #endif static Float ***msim = NULL, /* * The msim table entry for variable i, for simulation node j, * replicate k is msim[i][j][k] */ **msim_base = NULL; /* base structure for blocked allocation */ static double ***beta = NULL; /* * the beta realisation for variable i, draw j is in * beta[i][j] -- and has dimension data[i]->beta->size */ static unsigned int *n_sim_locs = NULL, /* n simulation locations per data variable */ table_size = 0, /* offset strata table size */ **s2d = NULL, /* * s2d: -- find (POINT *) from msim: * msim[i][j][...] -->> data[i]->list[s2d[i][j]] */ **d2s = NULL; /* * d2s: find msim entry from (POINT *): * data[i]->list[j] -->> msim[i][d2s[i][j]][...] * ((the latter two are necessary because simple counting fails * when point simulation locations coincide with data locations. In * this case, a data DPOINT is not added to the data list, and so we * need to keep track _where_ simulated values were located in order * to write them back to output (file/maps) at the end)) */ void print_sim(void) { /* print complete contents of sim_values -- for debug purposes only */ int i, j, k; for (i = 0; i < get_n_vars(); i++) { printlog("variable %d:\n", i); for (j = 0; j < n_sim_locs[i]; j++) { for (k = 0; k < gl_nsim; k++) printlog(" %g", msim[i][j][k]); printlog("\n"); } } } void init_simulations(DATA **d) { int i, j, size; assert(n_pred_locs > 0); /* should be set by now... */ if (msim != NULL) free_simulations(); n_sim_locs = get_n_sim_locs_table(&table_size); if (DEBUG_DUMP) { printlog("n_sim_locs_table: "); for (i = 0; i < table_size; i++) printlog("[%d] ", n_sim_locs[i]); printlog("\n"); } msim = (Float ***) emalloc(get_n_vars() * sizeof(Float **)); msim_base = (Float **) emalloc(get_n_vars() * sizeof(Float *)); s2d = (unsigned int **) emalloc(get_n_vars() * sizeof(unsigned int *)); d2s = (unsigned int **) emalloc(get_n_vars() * sizeof(unsigned int *)); for (i = 0; i < get_n_vars(); i++) { /* msim stuff: */ size = n_sim_locs[i] * gl_nsim; msim_base[i] = (Float *) emalloc(size * sizeof(Float)); memset(msim_base[i], 0xFF, size * sizeof(Float)); msim[i] = (Float **) emalloc(n_sim_locs[i] * sizeof(Float *)); for (j = 0; j < n_sim_locs[i]; j++) msim[i][j] = &(msim_base[i][j * gl_nsim]); /* index stuff: */ s2d[i] = (unsigned int *) emalloc(n_sim_locs[i] * sizeof(unsigned int)); d2s[i] = (unsigned int *) emalloc(n_sim_locs[i] * sizeof(unsigned int)); /* now let's trigger some Seg Faults if on error: */ memset(s2d[i], 0xFF, n_sim_locs[i] * sizeof(unsigned int)); memset(d2s[i], 0xFF, n_sim_locs[i] * sizeof(unsigned int)); } } void save_sim(DATA **data, DPOINT *where, int sim, int n_vars, const double *value, int *is_pt) { /* * save the last simulated value(s) in msim; * data[0]->n_list and data[0]->n_original (mode != STRATIFY) or * else n_vars (..) denote where it should go. */ int i, row; DPOINT *which = NULL; if (gl_nsim <= 1) return; for (i = 0; i < n_vars; i++) { /* store current simulation */ row = data[i]->n_list - data[i]->n_original + data[i]->nsim_at_data; if (sim == 0) { /* fill d2s and s2d entries: */ assert(row >= 0 && row < n_sim_locs[i]); if (is_pt[i]) { which = which_point(data[i], where); s2d[i][row] = GET_INDEX(which); /* d2s remains MV */ } else { /* newly simulated */ s2d[i][row] = data[i]->n_list; d2s[i][data[i]->n_list - data[i]->n_original] = row; /* please go and check it -- this last line took me 4 hours to get right */ } } msim[i][row][sim] = value[i]; } } void save_sim_strat(DATA *d, DPOINT *where, int sim, double value, int is_pt) { /* the same, but for stratified mode */ int row; DPOINT *which = NULL; if (gl_nsim <= 1) return; row = d->n_list - d->n_original + d->nsim_at_data; if (sim == 0) { /* fill d2s and s2d entries: */ assert(row >= 0 && row < n_sim_locs[d->id]); if (is_pt) { which = which_point(d, where); s2d[d->id][row] = GET_INDEX(which); /* the entry for d2s does not exist */ } else { /* not an original point, but a simulated one: */ s2d[d->id][row] = d->n_list; /* newly simulated */ d2s[d->id][d->n_list - d->n_original] = row; } } msim[d->id][row][sim] = value; } static DPOINT *which_point(DATA *d, DPOINT *where) { int i; double dzero2; #define WPWARNING "if you are simulating with a Gaussian variogram model without nugget\n\ then try to add a small nugget variance to avoid the following error message" dzero2 = gl_zero * gl_zero; for (i = 0; i < d->n_sel; i++) if (fabs(d->pp_norm2(d->sel[i], where)) <= dzero2) return d->sel[i]; pr_warning(WPWARNING); ErrMsg(ER_NULL, "which_point(): point not found"); return where; /* never reached */ } void restore_data_sel(DATA **data, int sim, int n_vars) { unsigned int i, j; int id, idx; DATA *d0 = NULL; if (gl_nsim <= 1) return; if (n_vars == 0) { assert(get_mode() == STRATIFY); d0 = data[0]; for (j = 0; j < d0->n_sel; j++) { id = d0->id; idx = GET_INDEX(d0->sel[j]) - d0->n_original; /* current sim: */ if (idx >= 0 && d2s[id][idx] != 0xFFFFFFFF) d0->sel[j]->attr = msim[id][d2s[id][idx]][sim]; } } else { for (i = 0; i < n_vars; i++) { for (j = 0; j < data[i]->n_sel; j++) { idx = GET_INDEX(data[i]->sel[j]) - data[i]->n_original; /* idx < 0 -->> original data, don't restore */ if (idx >= 0 && d2s[i][idx] != 0xFFFFFFFF) data[i]->sel[j]->attr = msim[i][d2s[i][idx]][sim]; /* data[i]->list[j] -->> msim[i][d2s[i][j]][...] */ } } } } void free_simulations(void) { int i, j; if (msim != NULL) { for (i = 0; i < get_n_vars(); i++) { efree(msim[i]); efree(msim_base[i]); efree(s2d[i]); efree(d2s[i]); } efree(msim); msim = NULL; efree(msim_base); msim_base = NULL; } if (s2d != NULL) { efree(s2d); s2d = NULL; } if (d2s != NULL) { efree(d2s); d2s = NULL; } if (beta != NULL) { for (i = 0; i < get_n_vars(); i++) { for (j = 0; j < gl_nsim; j++) efree(beta[i][j]); efree(beta[i]); } efree(beta); beta = NULL; } if (n_sim_locs != NULL) free(n_sim_locs); n_sim_locs = NULL; } void setup_beta(DATA **d, int n_vars, int n_sim) { double *est; const double *sim = NULL; int i, j, k, sum_n_X = 0, offset, *is_pt = NULL; assert(beta == NULL); /* entered only once */ /* allocate beta */ beta = (double ***) emalloc(n_vars * sizeof(double **)); for (i = 0; i < n_vars; i++) { assert(d[i]->n_list > 0); beta[i] = (double **) emalloc(n_sim * sizeof(double *)); for (j = 0; j < n_sim; j++) beta[i][j] = (double *) emalloc(d[i]->n_X * sizeof(double)); } for (i = 0; i < n_vars; i++) { if (d[i]->beta == NULL) /* push bogus values */ for (j = 0; j < d[i]->n_X; j++) d[i]->beta = push_d_vector(-9999.9, d[i]->beta); sum_n_X += d[i]->n_X; } printlog("drawing %d %s%s realisation%s of beta...\n", n_sim, n_vars > 1 ? (gl_sim_beta == 0 ? "multivariate " : "univariate ") : "", gl_sim_beta == 2 ? "OLS" : "GLS", n_sim > 1 ? "s" : ""); is_pt = (int *) emalloc(sum_n_X * sizeof(int)); if (gl_sim_beta == 0) { est = make_gls_mv(d, n_vars); for (j = 0; j < n_sim; j++) { sim = cond_sim(est, sum_n_X, GSI, is_pt, 0); /* length sum_n_X */ for (i = offset = 0; i < n_vars; i++) { for (k = 0; k < d[i]->n_X; k++) beta[i][j][k] = sim[offset + k]; offset += d[i]->n_X; if (DEBUG_DUMP || DEBUG_COV) { printlog("var=%d, sim=%d, beta=[ ", i, j); for (k = 0; k < d[i]->n_X; k++) printlog("%g ", beta[i][j][k]); printlog("]\n"); } } } efree(est); } else { for (i = 0; i < n_vars; i++) { if (gl_sim_beta == 1) est = make_gls(d[i], 0); else /* gl_sim_beta == 2 */ est = make_ols(d[i]); for (j = 0; j < n_sim; j++) { sim = cond_sim(est, d[i]->n_X, GSI, is_pt, 0); for (k = 0; k < d[i]->n_X; k++) beta[i][j][k] = sim[k]; if (DEBUG_DUMP || DEBUG_COV) { printlog("var=%d, sim=%d, beta=[ ", i, j); for (k = 0; k < d[i]->n_X; k++) printlog("%g ", beta[i][j][k]); printlog("]\n"); } } efree(est); } } efree(is_pt); return; } void set_beta(DATA **d, int sim, int n_vars, METHOD method) { /* n_vars == 0 --> stratified mode, check d[0]->id to find out which * data we've got here */ int i; assert(d[0]->beta); if (beta == NULL) /* use the values entered by the user */ return; if (get_mode() != STRATIFY) { for (i = 0; i < n_vars; i++) d[i]->beta->val = beta[i][sim]; } else d[0]->beta->val = beta[d[0]->id][sim]; return; } float ***get_msim(void) { return msim; } static unsigned int *get_n_sim_locs_table(unsigned int *size) { unsigned int i, *table; *size = (int) get_n_vars(); table = (unsigned int *) emalloc(*size * sizeof(int)); for (i = 0; i < *size; i++) table[i] = n_pred_locs; return table; } gstat/src/gcdist.c0000644000176200001440000000256615060550314013614 0ustar liggesusers#include /* sin() etc */ #include #include #include #define POWDI(x,i) R_pow_di(x,i) #include "gcdist.h" double gstat_gcdist(double lon1, double lon2, double lat1, double lat2) { /* http://home.att.net/~srschmitt/script_greatcircle.html */ /* taken from R package sp source; Copyright by Roger Bivand (C) 2005 */ double F, G, L, sinG2, cosG2, sinF2, cosF2, sinL2, cosL2, S, C; double w, R, a, f, D, H1, H2; double lat1R, lat2R, lon1R, lon2R, DE2RA; if (lon1 == lon2 && lat1 == lat2) return 0.0; DE2RA = M_PI/180; a = 6378.137; /* WGS-84 equatorial radius in km */ f = 1.0/298.257223563; /* WGS-84 ellipsoid flattening factor */ lat1R = lat1 * DE2RA; lat2R = lat2 * DE2RA; lon1R = lon1 * DE2RA; lon2R = lon2 * DE2RA; F = (lat1R + lat2R) / 2.0; G = (lat1R - lat2R) / 2.0; L = (lon1R - lon2R) / 2.0; sinG2 = POWDI(sin(G), 2); cosG2 = POWDI(cos(G), 2); sinF2 = POWDI(sin(F), 2); cosF2 = POWDI(cos(F), 2); sinL2 = POWDI(sin(L), 2); cosL2 = POWDI(cos(L), 2); S = sinG2 * cosL2 + cosF2 * sinL2; C = cosG2 * cosL2 + sinF2 * sinL2; w = atan(sqrt(S / C)); R = sqrt(S * C) / w; D = 2 * w * a; H1 = (3 * R - 1)/(2 * C); H2 = (3 * R + 1)/(2 * S); return D * (1 + f * H1 * sinF2 * cosG2 - f * H2 * cosF2 * sinG2); } gstat/src/userio.c0000644000176200001440000000622115060550314013635 0ustar liggesusers/* * userio.c: i/o routines for error, warning, log and progress messages */ #include #include "R.h" #include "defs.h" #include "debug.h" #include "utils.h" #include "s.h" #include "userio.h" static const char *error_messages[MAX_ERRNO+1] = { /* 0 */ "%s", /* 1 */ "bug in function `%s'", /* 2 */ "variable not set: %s", /* 3 */ "variable outside valid range: %s", /* 4 */ "value not allowed for: %s", /* 5 */ "no filename set %s", /* 6 */ "write failed on file `%s'", /* 7 */ "read failed on file `%s'", /* 9 */ "cannot read real value from `%s'", /* 9 */ "cannot read integer from `%s'", /* 10 */ "syntax error: %s", /* 11 */ "illegal option or missing argument on `%s'", /* 12 */ "domain (math) error on `%s'", /* 13 */ "out of dynamic memory (try local kriging?)", /* 14 */ "i/o error: %s", /* 15 */ "no command file%s", /* 16 */ "%s user interface not compiled in this version", /* 17 */ "writing to pipe `%s' failed", /* 18 */ "reading from pipe `%s' failed", /* 19 */ "function call prevented by secure mode%s" }; /* * error handling function -- print message and error to string, and * call error message handler. */ void gstat_error(char *fname, int line, enum Gstat_errno err_nr, const char *msg) { assert(err_nr <= MAX_ERRNO); if (DEBUG_DUMP || err_nr == ER_NULL) /* print file&line */ Rprintf("(%s, line %d)", fname, line); if (err_nr == ER_NULL) Rf_error("NULL error: this indicates a bug, please consider reporting this\n"); if (msg == NULL) Rf_error(" message: indicating a software bug, please report\n"); else Rf_error(error_messages[err_nr], msg); return; } /* message() calls for messages preceding a call to ErrMsg() */ void message(char *fmt, ...) { va_list args; /* char *buf = NULL; */ char w[ERROR_BUFFER_SIZE]; w[0] = '\0'; va_start(args, fmt); vsnprintf(w, ERROR_BUFFER_SIZE, fmt, args); va_end(args); Rprintf("%s", w); } /* print a warning message to string, and call warning message handler */ void pr_warning(char *fmt, ...) { va_list args; char w[ERROR_BUFFER_SIZE]; if (DEBUG_SILENT) return; w[0] = '\0'; va_start(args, fmt); vsnprintf(w, ERROR_BUFFER_SIZE, fmt, args); va_end(args); Rf_warning("%s\n", w); } void printlog(const char *fmt, ...) { va_list args; char w[ERROR_BUFFER_SIZE]; if (DEBUG_SILENT) return; w[0] = '\0'; va_start(args, fmt); vsnprintf(w, ERROR_BUFFER_SIZE, fmt, args); va_end(args); Rprintf("%s", w); } void print_progress(unsigned int current, unsigned int total) { static int perc_last = -1, sec_last = -1; int perc, sec; static time_t start; R_CheckUserInterrupt(); /* allow for user interrupt */ if (total <= 0 || DEBUG_SILENT || ! do_print_progress) return; if (sec_last == -1) { start = time(NULL); sec_last = 0; } perc = floor(100.0 * current / total); if (perc != perc_last) { /* another percentage -> calculate time: */ if (current == total) { /* 100% done, reset: */ Rprintf("\r%3d%% done\n", 100); perc_last = sec_last = -1; } else { sec = difftime(time(NULL), start); if (sec != sec_last) { /* another second -- don't print too often */ Rprintf("\r%3d%% done", perc); perc_last = perc; sec_last = sec; } } } } gstat/src/gls.h0000644000176200001440000000074215060550314013123 0ustar liggesusersenum GLS_WHAT { GLS_BLUE /* generalized least squares best linear unbiased estimate */, GLS_BLUP /* gls best linear unbiased predictor */, GLS_BLP /* gls best linear predictor */, UPDATE /* update estimate: use previously calculated weights */, GLS_INIT /* initial value */ }; void gls(DATA **d, int n_vars, enum GLS_WHAT pred, DPOINT *where, double *est); double *make_gls(DATA *d, int calc_residuals); double *make_gls_mv(DATA **d, int n_vars); void free_glm(void *v_glm); gstat/src/data.h0000644000176200001440000002677115060550314013261 0ustar liggesusers#ifndef DATA_H # define DATA_H /* avoid multiple inclusion */ #include /* INT_MAX */ #include /* FLT_MAX */ #define ID_OF_VALDATA INT_MAX #define ID_OF_AREA (INT_MAX-1) #define IS_GLOBAL(d) (d->sel_rad >= DBL_MAX && d->sel_max >= INT_MAX) #define DELIMITERS " \t,\n\r" #define N_POLY 18 #define POLY_MIN (-19) /* lowest index */ #define POLY_X (-19) #define POLY_Y (-18) #define POLY_Z (-17) #define POLY_X2 (-16) #define POLY_Y2 (-15) #define POLY_Z2 (-14) #define POLY_XY (-13) #define POLY_XZ (-12) #define POLY_YZ (-11) #define POLY_X3 (-10) #define POLY_Y3 (-9) #define POLY_Z3 (-8) #define POLY_X2Y (-7) #define POLY_XY2 (-6) #define POLY_X2Z (-5) #define POLY_XZ2 (-4) #define POLY_Y2Z (-3) #define POLY_YZ2 (-2) /* -1 is reserved for "no intercept" */ typedef struct { int poly_nr; char *name; int degree, mode; } POLY_NM; typedef struct { /* structure to hold one point value: */ double x, y, z, /* x, y and z coordinate */ variance, /* the attribute's variance */ attr; /* attribut value (data value) */ union { float dist2; /* squared distance to estimate point */ float weight; /* weight in block discretization */ int stratum; /* stratum of current point in data() list */ } u; double *X; /* row entry in X matrix for this DPOINT */ unsigned int bitfield; /* most right bit: IS_POINT (0) or IS_BLOCK (1), remaining left bits: index of this point in d->list */ } DPOINT; /* qtree_search structs (nsearch.c): */ typedef struct { /* defining a rectangular bounding box */ double x, y, z, size; int mode; } BBOX; typedef struct qnode { /* the struct used to define nodes in the search tree */ int n_node; /* >= 0: number of data points in this node */ /* negative (-1) if u is a node list */ union { struct qnode **node;/* pointers to 4 or 8 other nodes */ DPOINT **list; /* or pointers to data points within this leaf */ } u; BBOX bb; } QTREE_NODE; typedef struct { double x_ul, y_ul, cellsizex, cellsizey; unsigned int rows, cols; DPOINT ***dpt, /* 2d array to (DPOINT *) entries in list */ **grid_base; /* base of blocked memory allocation */ } DATA_GRIDMAP; /* the management summary */ /* polygon structs: */ typedef struct { double x, y; } PLOT_POINT; typedef struct { PLOT_POINT min, max; } MBR; typedef struct polygon { MBR mbr; int lines; PLOT_POINT *p; int close; /* 1 - is closed polygon */ } POLYGON; typedef enum { DATA_UNKNOWN = 0, DATA_ASCII_TABLE, /* ascii table */ DATA_EAS, /* simplified GeoEAS format */ DATA_IDRISI_VEC, /* idrisi .vec */ DATA_IDRISI32_VEC, /* idrisi .vct */ DATA_IDRISI_BIN, /* Idrisi .img binary */ DATA_IDRISI_ASCII, /* Idrisi .img ascii */ DATA_IDRISI32_BIN, /* Idrisi32 .rst binary */ DATA_IDRISI32_ASCII,/* Idrisi32 .rst ascii */ DATA_GRIDASCII, /* ArcInfo */ DATA_GRIDFLOAT, /* ArcInfo */ DATA_CSF, /* PCRaster */ DATA_T2, /* Mike-SHE grid format */ DATA_ERMAPPER, /* ER-Mapper raster dataset */ DATA_GNUPLOT, /* gnuplot binary grid */ DATA_GMT, /* GMT netCDF format */ DATA_SURFER_DSAA, /* Surfer DSAA ascii grid */ DATA_GSLIB, /* GSLIB ascii grid */ DATA_GRASS, /* GRASS site list */ DATA_GRASS_GRID, /* GRASS raster */ DATA_GDAL, /* GDAL raster */ DATA_EXT_DBASE /* CW external database */ } DATA_TYPE_; typedef struct { DATA_TYPE_ type; const char *name; } DATA_TYPE; extern const DATA_TYPE data_types[]; typedef struct { int to_var, /* merge from current data to this variable */ col_this_X, /* merge this column number */ col_other_X; /* to this column number in the other variable */ } MERGE_TABLE; typedef struct { int size, max_size; double *val; } D_VECTOR; D_VECTOR *push_d_vector(double d, D_VECTOR *v); void free_d_vector(D_VECTOR *v); /* CW added, FTTB copies of DATA members * SEARCH_CRITERIA should become part of DATA * Dit zijn degene die ik begrijp */ typedef struct { /* DATA::prob sample later */ int force, /* force neighbourhood selection */ sel_min, sel_max, /* min and max number for neighbourhood selection */ oct_max, /* max # pts for each octant; 0: use no octant search */ oct_filled, /* RETURN VALUE? number of non-empty octants in selection */ square; /* use square search neighbourhood, default circular */ double sel_rad; /* radius for neighbourhhood selection */ }SEARCH_CRITERIA; typedef struct { /* structure that holds data info and lists */ char *variable, /* attr name, log(..) */ *x_coord, /* name of x coordinate */ *y_coord, /* name of y coordinate */ *z_coord, /* name of z coordinate */ *s_coord, /* name of stratum variable */ *V_coord, /* name of variance */ *Category, /* category value, for indicator transform */ *id_name, /* name of ID column*/ *fname, /* file name */ **point_ids, /* IDs of points */ *var_fn_str, /* VarFunction string */ *nscore_table; /* normal score table output file name */ DATA_TYPE type; /* what is this file? */ int id, /* id of data, number in command file */ n_list, /* # points in list */ n_original, /* # real data (read from file, not simulated) */ n_sel, /* # of points in selection: sel */ n_max, /* maximum # in list */ nsim_at_data, /* nr. of pts at simulation locations */ init_max, /* user-specified maximum n (to save memory) */ n_sel_max, /* maximum number in sel */ n_X, *colX, /* number and columns in X matrix */ log, /* is attr.value log-transformed ? */ force, /* force neighbourhood selection */ vdist, /* use variogram value as distance crit. */ n_averaged, /* number of averaged data so far */ colnx, colny, colnz, /* column-numbers */ colnvariance, /* column that holds variance */ colnvalue, /* column that holds attribute values */ colns, /* column that holds u (if strata) */ coln_id, /* column with ID */ sel_min, sel_max, /* min and max number for neighbourhood selection */ oct_max, /* max # pts for each octant; 0: use no octant search */ oct_filled, /* number of non-empty octants in selection */ mode, /* mode: 1(x),2(y),3(xy),4(z),5(xz).. */ dummy, /* is this variable a dummy variable? */ standard, /* if standard: data are standardized by dividing all values by data->std */ calc_residuals, /* 1: do calculate OLS residuals for vgm est */ is_residual, /* attr values are residuals lm X */ polynomial_degree, /* degree of coordinate polynomial */ togrid, /* shift data values to grid centres */ square, /* use square search neighbourhood */ centre, /* centre area + points() at area centre? */ region, /* select data in region? */ average, /* average measurements at identical location? */ every, /* sample only every x-th observation */ offset, skip, /* starting at offset */ datatype, /*KS added what idrisi data type 0=integer,1=real 1/18/99*/ filetype; /*KS added what idrisi file type 0=ascii,1=binary 1/18/99*/ enum { U_UNKNOWN, U_ISDIST, U_ISWEIGHT, U_ISSTRATUM } what_is_u; double sel_rad, /* radius for neighbourhhood selection */ Icutoff, /* cutoff value for indicator variable: */ /* colnvalue = ("real value" <= Icutoff) */ minX, maxX, minY, maxY, minZ, maxZ, /* min/max of coordinates */ minvariance, maxvariance, /* min/max variance */ mv, /* missing value */ dX, /* max. vector norm X-space distance */ prob, /* inclusion probability (to sample data file) */ lambda; /* lambda value for box-cox transform */ int minstratum, maxstratum; /* min/max stratum */ double mean, std; /* sample mean and st.dev. of attribute */ /* CW members to hold data in this struct (DATA_TYPE!= DATA_EXT_DBASE) */ DPOINT **list; /* list of data points, of length n_list */ DPOINT *P_base; /* base for pointer array, if allocated blockwise */ DPOINT **sel; /* list of selection indices, of length n_sel */ double (*point_norm)(const DPOINT *); /* eucl. vector length */ double (*pp_norm2)(const DPOINT *, const DPOINT *); /* point-point squared distance */ double (*pb_norm2)(const DPOINT *, BBOX); /* point-BBOX distance: nsearch.c */ double (*variance_fn)(double mu); /* variance function */ double *X_base; /* base pointer for X arrays, when allocated blockwise */ void *lm, /* cast to LM *, see lm.h */ *glm; /* remember: several matrices/vecs needed in gls.c */ /* next 2 entries are for merging regressors across variables */ /* to avoid double references, each entry var should be less than ->id */ int n_merge; /* merge_table size */ MERGE_TABLE *mtbl; /* entries in merge table */ QTREE_NODE *qtree_root; /* a tree-based structure with pointers to list[] for fast neighbourhood search */ /* POLYGON *poly; */ /* where the polygons go */ #ifdef WITH_SPIRAL SPIRAL *spiral; /* spiral search index structure */ #endif DATA_GRIDMAP *grid; /* grid map topology if data was read from a map */ D_VECTOR *beta; } DATA; #define X_BIT_SET 1 /* also used in nsearch.c */ #define Y_BIT_SET 2 #define Z_BIT_SET 4 #define V_BIT_SET 8 #define S_BIT_SET 16 #define D_HAS_WEIGHT(d) (d->what_is_u == U_ISWEIGHT) #define D_HAS_DIST(d) (d->what_is_u == U_ISDIST) #define D_HAS_STRATA(d) (d->colnu && d->what_is_u == U_ISSTRATA) /* following routines do not depend on sizeof(int) (K&R II, p. 48, 49) */ #define left_bits(x) ((x) >> 1) /* shift one, zero most left bit */ /* #define right_bit(x) ((x) & ~(~0 << 1)) */ /* zero all except right bit */ #define right_bit(x) ((x) & ~((unsigned long)~0 << 1)) #define set_right_bit_on(x) (x = (x) | 1) #define set_right_bit_off(x) (x = (x) & ((unsigned long)~0 << 1)) #define set_left_bits(x,val) (x = ((unsigned long)val << 1) | right_bit(x)) #define GET_INDEX(p) (left_bits((p)->bitfield)) #define SET_INDEX(p,val) (set_left_bits((p)->bitfield,val)) #define IS_BLOCK(p) (right_bit((p)->bitfield)) #define IS_POINT(p) (!right_bit((p)->bitfield)) #define SET_BLOCK(p) (set_right_bit_on((p)->bitfield)) #define SET_POINT(p) (set_right_bit_off((p)->bitfield)) #if defined(__cplusplus) extern "C" { #endif DATA *read_gstat_data(DATA *d); DATA *get_area_centre(DATA *area, DATA *valdata); void centre_area(DATA *area); void push_point(DATA *d, const DPOINT *p); void pop_point(DATA *d, int list_nr); void free_data(DATA *tmp); #define print_data_list(d) print_data(d, 1) #define print_data_selection(d) print_data(d, 0) void print_data(const DATA *d, int list); void logprint_point(const DPOINT *p, const DATA *d); DATA *init_one_data(DATA *data); int coordinates_are_equal(const DATA *a, const DATA *b); void init_data_minmax(void); void setup_data_minmax(DATA *d); void calc_polynomials(DATA *d); double calc_polynomial(DPOINT *p, int colX); char *print_data_line(const DATA *d, char **to); extern const POLY_NM polynomial[N_POLY]; #define POLY_NAME(i) polynomial[i - POLY_MIN].name #define POLY_DEGREE(i) polynomial[i - POLY_MIN].degree void data_add_X(DATA *d, int i); int push_to_merge_table(DATA *d, int to_var, int col_this_X, int col_other_X); DATA_GRIDMAP *gsetup_gridmap(double x_ul, double y_ul, double cellsizex, double cellsizey, unsigned int rows, unsigned int cols); void datagrid_rebuild(DATA *d, int adjust_to_gridcentres); void set_norm_fns(DATA *d); double data_block_diagonal(DATA *data); int intercept_only(const DATA *d); double v_mu(double mu); double v_mu2(double mu); double v_mu3(double mu); double v_bin(double mu); double v_identity(double mu); void setup_polynomial_X(DATA *d); void calc_polynomial_point(DATA *d, DPOINT *pt); double pp_norm_gc(const DPOINT *a, const DPOINT *b); void free_data_gridmap(DATA_GRIDMAP *t); #if defined(__cplusplus) } #endif #endif /* DATA_H */ gstat/src/vario_fn.h0000644000176200001440000000305715060550314014143 0ustar liggesusers/* unit basic variogram models */ double fn_nugget(double h, double *r); double fn_linear(double h, double *r); double fn_circular(double h, double *r); double fn_spherical(double h, double *r); double fn_bessel(double h, double *r); double fn_gaussian(double h, double *r); double fn_exclass(double h, double *r); double fn_matern(double h, double *r); double fn_matern2(double h, double *r); double fn_exponential(double h, double *r); double fn_pentaspherical(double h, double *r); double fn_periodic(double h, double *r); double fn_wave(double h, double *r); double fn_hole(double h, double *r); double fn_logarithmic(double h, double *r); double fn_power(double h, double *r); double fn_spline(double h, double *r); double fn_legendre(double h, double *r); double fn_intercept(double h, double *r); /* the following functions are not all defined */ double da_is_zero(double h, double *r); /* NUG, INT */ double da_fn_linear(double h, double *r); double da_fn_circular(double h, double *r); double da_fn_spherical(double h, double *r); double da_fn_bessel(double h, double *r); double da_fn_gaussian(double h, double *r); double da_fn_exponential(double h, double *r); double da_fn_pentaspherical(double h, double *r); double da_fn_periodic(double h, double *r); double da_fn_wave(double h, double *r); double da_fn_hole(double h, double *r); double da_fn_logarithmic(double h, double *r); double da_fn_power(double h, double *r); /* unit derivative-to-range of basic variogram models */ double da_fn_exponential(double h, double *r); double da_fn_nugget(double h, double *r); gstat/src/fit.c0000644000176200001440000002125415060550314013114 0ustar liggesusers/* * fit.c: fit variogram model to experimental variograms; gnuplot fit driver */ #include #include /* getenv() */ #include /* strstr() */ #include /* fabs(), sqrt() */ #include /* Rprintf() */ #include "mtrx.h" #include "defs.h" #include "defaults.h" #include "userio.h" #include "data.h" #include "utils.h" #include "debug.h" #include "vario.h" #include "sem.h" #include "glvars.h" #include "reml.h" #include "lm.h" #include "fit.h" #define NEARLY_ZERO 1.0e-30 static void wls_fit(VARIOGRAM *vp); static double getSSErr(const VARIOGRAM *vp, PERM *p, LM *lm); static int fill_weights(const VARIOGRAM *vp, PERM *p, LM *lm); static int fit_GaussNewton(VARIOGRAM *vp, PERM *p, LM *lm, int iter, int *bounded); int fit_variogram(VARIOGRAM *v) { DATA **d = NULL; int i = 0; long n = 0; if (v->ev->refit == 0) return 0; if (v->ev->fit != NO_FIT && v->ev->fit != MIVQUE_FIT) { if (! v->ev->cloud) { while (n == 0 && i < v->ev->n_est) n += v->ev->nh[i++]; /* check if estimates exist */ if (n == 0) /* bad luck */ return 1; } else if (v->ev->n_est == 0) return 1; } if (v->ev->fit != NO_FIT) { if (v->ev->map) ErrMsg(ER_IMPOSVAL, "cannot fit model to variogram map"); for (i = 0; i < v->n_models; i++) if (v->part[i].sill == 0.0 && v->part[i].fit_sill != 0) v->part[i].sill = 1.0; /* avoid lot'o trouble */ } if (v->ev->fit == WLS_FIT_MOD && !is_variogram(v)) pr_warning("this fit method is not recommended for covariograms"); v->ev->direction.x = sin(gl_alpha * PI / 180.0) * cos(gl_beta * PI / 180.0); v->ev->direction.y = cos(gl_alpha * PI / 180.0) * cos(gl_beta * PI / 180.0); v->ev->direction.z = sin(gl_beta * PI / 180.0); switch (v->ev->fit) { case NO_FIT: break; case OLS_FIT: /* BREAKTHROUGH: */ case WLS_FIT: /* BREAKTHROUGH: */ case WLS_FIT_MOD: case WLS_NHH: wls_fit(v); break; case MIVQUE_FIT: if (v->id1 != v->id2) return 1; d = get_gstat_data(); reml_sills(d[v->id1], v); break; default: Rprintf("%d\n", v->ev->fit); ErrMsg(ER_IMPOSVAL, "fit_vgm(): value for fit not recognized or not implemented"); /* no default: force compile warning on missing option! */ } return 0; } static void wls_fit(VARIOGRAM *vp) { /* * non-linear iterative reweighted least squares fitting of variogram model to * sample variogram (..covariogram model to sample covariogram, cross, etc.) * all information necessary is contained in *vp. * * uses Marquardt-Levenberg algorithm; * the implementation follows gnuplot's fit.c */ static PERM *p = PNULL; int i, j, n_iter = 0, bounded = 0, timetostop; double SSErr, oldSSErr = DBL_MAX, step; LM *lm; p = px_resize(p, vp->ev->n_est); if (! vp->ev->cloud) { for (i = j = 0; i < (vp->ev->zero == ZERO_AVOID ? vp->ev->n_est-1 : vp->ev->n_est); i++) { if (vp->ev->nh[i] > 0) p->pe[j++] = i; } p->size = j; } lm = init_lm(NULL); /* oldSSErr = getSSErr(vp, p, lm); */ do { print_progress(n_iter, gl_iter); /* if (DEBUG_VGMFIT) printlog("%s: ", vp->descr); */ if ((vp->fit_is_singular = fit_GaussNewton(vp, p, lm, n_iter, &bounded))) { pr_warning("singular model in variogram fit"); print_progress(gl_iter, gl_iter); vp->SSErr = getSSErr(vp, p, lm); return; } update_variogram(vp); SSErr = getSSErr(vp, p, lm); /* we can't use lm->SSErr here since that's only in the X-filled-with-derivatives, not the true residuals */ step = oldSSErr - SSErr; if (SSErr > gl_zero) step /= SSErr; n_iter++; if (DEBUG_VGMFIT) printlog("after it. %d: SSErr %g->%g, step=%g (fit_limit %g%s)\n", n_iter, oldSSErr, SSErr, step, gl_fit_limit, bounded ? "; bounded" : ""); oldSSErr = SSErr; timetostop = (step < gl_fit_limit && step >= 0.0 && bounded == 0) || n_iter == gl_iter; } while (! timetostop); print_progress(gl_iter, gl_iter); if (n_iter == gl_iter) pr_warning("No convergence after %d iterations: try different initial values?", n_iter); if (DEBUG_VGMFIT) { printlog("# iterations: %d, SSErr %g, last step %g", n_iter, SSErr, step); if (step < 0.0) printlog(", last step was in the wrong direction.\n"); else printlog("\n"); } free_lm(lm); vp->SSErr = SSErr; return; } /* wls_fit */ static double getSSErr(const VARIOGRAM *vp, PERM *p, LM *lm) { int i; double x, y, z, dz, SSErr; /* if (fill_weights(vp, p, lm)) return 0.0; */ for (i = 0, SSErr = 0.0; i < p->size; i++) { x = vp->ev->direction.x * vp->ev->dist[p->pe[i]]; y = vp->ev->direction.y * vp->ev->dist[p->pe[i]]; z = vp->ev->direction.z * vp->ev->dist[p->pe[i]]; /* fill y with current residuals: */ dz = vp->ev->gamma[p->pe[i]] - (is_variogram(vp) ? get_semivariance(vp, x, y, z) : get_covariance(vp, x, y, z)); if (lm->weights != NULL) SSErr += dz * dz * lm->weights->ve[i]; else SSErr += dz * dz; } return SSErr; } static int fit_GaussNewton(VARIOGRAM *vp, PERM *p, LM *lm, int iter, int *bounded) { double s = 0.0, x, y, z; int i, j, n_fit, model, fit_ranges = 0; IVEC *fit = NULL; VEC *start = NULL; if (p->size == 0) return 1; fit = iv_resize(fit, 2 * vp->n_models); /* index fit parameters: parameter fit->ive[j] corresponds to model i */ for (i = n_fit = 0; i < vp->n_models; i++) { if (vp->part[i].fit_sill) fit->ive[n_fit++] = i; if (vp->part[i].fit_range) { fit->ive[n_fit++] = i + vp->n_models; /* large -->> ranges */ fit_ranges = 1; } } if (n_fit == 0) { iv_free(fit); return 0; } fit = iv_resize(fit, n_fit); /* shrink to fit */ lm->X = m_resize(lm->X, p->size, n_fit); lm->y = v_resize(lm->y, p->size); start = v_resize(start, n_fit); for (i = 0; i < n_fit; i++) { if (fit->ive[i] < vp->n_models) { model = fit->ive[i]; start->ve[i] = vp->part[model].sill; } else { model = fit->ive[i] - vp->n_models; start->ve[i] = vp->part[model].range[0]; } } for (i = 0; i < p->size; i++) { x = vp->ev->direction.x * vp->ev->dist[p->pe[i]]; y = vp->ev->direction.y * vp->ev->dist[p->pe[i]]; z = vp->ev->direction.z * vp->ev->dist[p->pe[i]]; /* fill y with current residuals: */ if (is_variogram(vp)) s = get_semivariance(vp, x, y, z); else s = get_covariance(vp, x, y, z); lm->y->ve[i] = vp->ev->gamma[p->pe[i]] - s; /* fill X: */ for (j = 0; j < n_fit; j++) { /* cols */ if (fit->ive[j] < vp->n_models) { model = fit->ive[j]; ME(lm->X, i, j) = (is_variogram(vp) ? UnitSemivariance(vp->part[model],x,y,z) : UnitCovariance(vp->part[model],x,y,z)); } else { model = fit->ive[j] - vp->n_models; ME(lm->X, i, j) = (is_variogram(vp) ? da_Semivariance(vp->part[model],x,y,z) : -da_Semivariance(vp->part[model],x,y,z)); } } } if (iter == 0 && fill_weights(vp, p, lm)) { iv_free(fit); v_free(start); return 1; } lm->has_intercept = 1; /* does not affect the fit */ lm = calc_lm(lm); /* solve WLS eqs. for beta */ if (DEBUG_FIT) { Rprintf("beta: "); v_logoutput(lm->beta); } if (lm->is_singular) { iv_free(fit); v_free(start); return 1; } if (fit_ranges) { s = v_norm2(lm->beta) / v_norm2(start); if (s > 0.2) { /* don't allow steps > 20% ---- */ sv_mlt(0.2 / s, lm->beta, lm->beta); *bounded = 1; } else *bounded = 0; /* a `free', voluntary step */ } else /* we're basically doing linear regression here: */ *bounded = 0; for (i = 0; i < n_fit; i++) { if (fit->ive[i] < vp->n_models) { model = fit->ive[i]; vp->part[model].sill = start->ve[i] + lm->beta->ve[i]; } else { model = fit->ive[i] - vp->n_models;; vp->part[model].range[0] = start->ve[i] + lm->beta->ve[i]; } } iv_free(fit); v_free(start); return 0; } static int fill_weights(const VARIOGRAM *vp, PERM *p, LM *lm) { double x, y, z, s; int i, retval = 0; if (vp->ev->fit == OLS_FIT || (vp->ev->cloud && vp->ev->fit == WLS_FIT)) { if (lm->weights != NULL) v_free(lm->weights); lm->weights = NULL; return 0; } lm->weights = v_resize(lm->weights, p->size); for (i = 0; i < p->size; i++) { if (vp->ev->fit == WLS_NHH) s = vp->ev->dist[p->pe[i]]; else { x = vp->ev->direction.x * vp->ev->dist[p->pe[i]]; y = vp->ev->direction.y * vp->ev->dist[p->pe[i]]; z = vp->ev->direction.z * vp->ev->dist[p->pe[i]]; s = get_semivariance(vp, x, y, z); } if (vp->ev->cloud) { lm->weights->ve[i] = 1.0; if (fabs(s) > NEARLY_ZERO) lm->weights->ve[i] /= s * s; else { pr_warning("infinite weight during fit"); retval = 1; break; } } else { /* no cloud: */ lm->weights->ve[i] = vp->ev->nh[p->pe[i]]; if (vp->ev->fit != WLS_FIT) { if (fabs(s) > NEARLY_ZERO) lm->weights->ve[i] /= (s * s); else { pr_warning("infinite weight during fit"); retval = 1; break; } } } /* else cloud */ } /* for i */ return retval; } gstat/src/mtrx.h0000644000176200001440000000377015060550314013334 0ustar liggesusers#ifndef MTRXH # define MTRXH /* interface copied from meschach; implementation rewritten from scratch */ typedef struct { size_t m, n, /* #rows, #cols */ max; /* max size, memory allocated */ double *v; } MAT; /* dense matrix */ #define ME(X,i,j) X->v[j * X->m + i] /* row i, column j, column-major access */ typedef struct { size_t dim, max; double *ve; } VEC; /* vector: row or column, whatever matches */ typedef struct { size_t size, max; int *pe; } PERM; typedef struct { size_t size, max; int *ive; } IVEC; #define PNULL (PERM *) NULL #define MNULL (MAT *) NULL #define VNULL (VEC *) NULL #define IVNULL (IVEC *) NULL #define M_FREE(x) { if (x != NULL) m_free(x); x = MNULL; } #define V_FREE(x) { if (x != NULL) v_free(x); x = VNULL; } #define P_FREE(x) { if (x != NULL) px_free(x); x = PNULL; } void m_free(MAT *m); void v_free(VEC *v); void iv_free(IVEC *v); void px_free(PERM *p); #define m_get(i,j) m_resize(MNULL, i, j) #define v_get(i) v_resize(VNULL, i) MAT *m_resize(MAT *mat, size_t m, size_t n); VEC *v_resize(VEC *v, size_t n); PERM *px_resize(PERM *p, size_t n); IVEC *iv_resize(IVEC *v, size_t n); MAT *m_zero(MAT *m); VEC *v_zero(VEC *v); MAT *m_inverse(MAT *in, int *info); VEC *vm_mlt(MAT *m, VEC *v, VEC *out); VEC *mv_mlt(MAT *m, VEC *v, VEC *out); MAT *m_mlt(MAT *m1, MAT *m2, MAT *out); MAT *mtrm_mlt(MAT *m1, MAT *m2, MAT *out); VEC *v_sub(VEC *v1, VEC *v2, VEC *out); MAT *m_sub(MAT *m1, MAT *m2, MAT *out); VEC *v_add(VEC *v1, VEC *v2, VEC *out); VEC *sv_mlt(double s, VEC *v1, VEC *v2); MAT *m_add(MAT *m1, MAT *m2, MAT *out); MAT *m_copy(MAT *in, MAT *out); VEC *v_copy(VEC *in, VEC *out); double v_norm2(VEC *v); MAT *CHsolve(MAT *A, MAT *b, MAT *out, PERM *piv); VEC *CHsolve1(MAT *A, VEC *b, VEC *out, PERM *piv); MAT *CHfactor(MAT *A, PERM *piv, int *info); double in_prod(VEC *a, VEC *b); MAT *sm_mlt(double s, MAT *m1, MAT *out); MAT *ms_mltadd(MAT *m1, MAT *m2, double s, MAT *out); MAT *mmtr_mlt(MAT *m1, MAT *m2, MAT *out); void m_logoutput(MAT *a); void v_logoutput(VEC *x); #endif gstat/src/getest.c0000644000176200001440000004127115060550314013626 0ustar liggesusers/* * getest.c: choose the predicion function at one prediction location */ #include #include #include #include #include #include "defs.h" #include "data.h" #include "utils.h" #include "mapio.h" #include "userio.h" #include "debug.h" #include "vario.h" #include "sem.h" #include "fit.h" #include "glvars.h" #include "mtrx.h" #include "lm.h" #include "gls.h" #include "sim.h" #include "msim.h" #include "block.h" #include "getest.h" static void est_quantile_div(DATA *data, double *est, int div); static void est_skew_kurt(DATA *data, double *est); static double inverse_dist(DATA *data, DPOINT *where, double idPow); static void save_variogram_parameters(VARIOGRAM *v); static void reset_variogram_parameters(VARIOGRAM *v); static double sample_mean(double *list, int n); static double sample_var(double *list, double mean, int n); static double sample_std(double *list, double mean, int n); static double est_quant(double *list, double p, int n); static int CDECL d_cmp(const double *a, const double *b); static double *vgm_pars = NULL; void get_est(DATA **data, METHOD method, DPOINT *where, double *est) { /* * given all data[i]->sel, get_est returns one or more values to *est, * according to the method of calculation set in *method * sel must be not NULL, where contains the location of the estimate * PRE: data, where, est; * USES: several estimation routines. */ DPOINT *block = NULL; VARIOGRAM *v; int i, j, n_vars, n_sel, *is_pt; double *X_ori = NULL, *local_sim; enum GLS_WHAT gls_mode = GLS_BLUP; const double *sim = NULL; /* return value of cond_sim() */ for (i = 0; i < get_n_outputs(); i++) set_mv_double(&est[i]); block = get_block_p(); if (get_mode() == MODE_NSP) ErrMsg(ER_IMPOSVAL, "Getest(): mode not specified"); if (block->x > 0.0 || block->y > 0.0 || block->z > 0.0 || get_data_area()) SET_BLOCK(where); else SET_POINT(where); n_vars = get_n_vars(); if (get_mode() == STRATIFY && (where->u.stratum < 0 || where->u.stratum >= n_vars)) return; local_sim = (double *) emalloc(n_vars * sizeof(double)); is_pt = (int *) emalloc(n_vars * sizeof(int)); for (i = 0; i < n_vars; i++) { set_mv_double(&(local_sim[i])); is_pt[i] = 0; } if (DEBUG_COV) { printlog("we're at location X: %g Y: %g Z: %g\n", where->x, where->y, where->z); if (IS_BLOCK(where)) { if (get_data_area()) printlog("block set in area()\n"); else printlog("block size: dx: %g dy: %g dz: %g\n", block->x, block->y, block->z); } else printlog("zero block size\n"); if (get_mode() == STRATIFY) printlog("stratum: %d\n", where->u.stratum); } switch (method) { case DIV: /* BREAKTHROUGH */ case MED: if (get_mode() == STRATIFY) est_quantile_div(data[where->u.stratum], est, method == DIV); else for (i = 0; i < n_vars; i++) est_quantile_div(data[i], &(est[2*i]), method == DIV); break; case SKEW: if (get_mode() == STRATIFY) est_skew_kurt(data[where->u.stratum], est); else for (i = 0; i < n_vars; i++) est_skew_kurt(data[i], &(est[2*i])); break; case IDW: if (gl_idp < 0.0) ErrMsg(ER_RANGE, "idp must be non-negative"); if (get_mode() == STRATIFY) { if (data[where->u.stratum]->n_sel > 0) est[0] = inverse_dist(data[where->u.stratum], where, gl_idp); } else { for (i = 0; i < n_vars; i++) if (data[i]->n_sel > 0) est[2 * i] = inverse_dist(data[i], where, gl_idp); } break; case LSLM: if (n_variograms_set()) { switch(get_mode()) { case SIMPLE: X_ori = where->X; /* remember... */ for (i = 0; i < n_vars; i++) { if (data[i]->n_sel > 0) gls(&data[i], 1, GLS_BLUE, where, &(est[2 * i])); where->X += data[i]->n_X; } where->X = X_ori; /* and put back */ break; case STRATIFY: X_ori = where->X; /* remember... */ for (i = 0; i < where->u.stratum; i++) where->X += data[i]->n_X; if (data[where->u.stratum]->n_sel > 0) { where->X += where->u.stratum; /* strictly unnecessary */ gls(&data[where->u.stratum], 1, GLS_BLUE, where, est); } where->X = X_ori; /* and put back */ break; case MULTIVARIABLE: gls(data, n_vars, GLS_BLUE, where, est); break; default: ErrMsg(ER_IMPOSVAL, "Getest(): wrong mode"); break; } } else { switch(get_mode()) { case STRATIFY: X_ori = where->X; /* remember... */ for (i = 0; i < where->u.stratum; i++) where->X += data[i]->n_X; if (data[where->u.stratum]->n_sel > 0) pred_lm(&data[where->u.stratum], 1, where, est); where->X = X_ori; /* and put back */ break; case MULTIVARIABLE: pred_lm(data, n_vars, where, est); break; case SIMPLE: X_ori = where->X; /* remember... */ for (i = 0; i < n_vars; i++) { if (data[i]->n_sel > 0) { pred_lm(&data[i], 1, where, &(est[2*i])); where->X += data[i]->n_X; } } where->X = X_ori; /* and put back */ break; default: ErrMsg(ER_IMPOSVAL, "Getest(): wrong mode"); break; } } /* else */ break; case SKR: /* BREAK THROUGH (SK handled in gls()) */ case OKR: /* BREAK THROUGH: (OK is special case of UK) */ case UKR: if (method == SKR) gls_mode = GLS_BLP; else gls_mode = GLS_BLUP; switch (get_mode()) { case SIMPLE: X_ori = where->X; /* remember... */ for (i = 0; i < n_vars; i++) { gls(&data[i], 1, gls_mode, where, &(est[2 * i])); where->X += data[i]->n_X; } where->X = X_ori; /* and put back */ break; case STRATIFY: X_ori = where->X; /* remember... */ for (i = 0; i < where->u.stratum; i++) where->X += data[i]->n_X; gls(&data[where->u.stratum], 1, gls_mode, where, est); where->X = X_ori; /* and put back */ break; case MULTIVARIABLE: gls(data, n_vars, gls_mode, where, est); break; default: ErrMsg(ER_IMPOSVAL, "Getest(): wrong mode"); break; } if (gl_order) /* order relation violations: */ correct_orv(est, n_vars, gl_order); break; case GSI: /* BREAK TRHOUGH: */ case ISI: switch (get_mode()) { case SIMPLE: /* estimates go to est[0+1],est[2+3],... */ X_ori = where->X; /* remember... */ for (i = 0; i < gl_nsim; i++) { restore_data_sel(data, i, n_vars); set_beta(data, i, n_vars, method); for (j = 0; j < n_vars; j++) { /* estimate or update: */ if (i == 0) /* estimate */ gls(&data[j], 1, data[j]->n_sel < gl_n_uk ? GLS_BLP : GLS_BLUP, where, &(est[2*j])); else /* update */ gls(&data[j], 1, UPDATE, where, &(est[2*j])); /* new simulation: */ if (gl_order <= 1) { sim = cond_sim(&(est[2*j]), 1, method, &(is_pt[j]), gl_order); /* put data from simulation i; */ local_sim[j] = sim[0]; } where->X += data[j]->n_X; } where->X = X_ori; /* reset */ if (gl_order > 1) { /* 2,3 if pdf, 4 if cdf: */ sim = cond_sim(est, n_vars, method, is_pt, gl_order); for (j = 0; j < n_vars; j++) local_sim[j] = sim[j]; } save_sim(data, where, i, n_vars, local_sim, is_pt); } X_ori = where->X; /* remember... */ for (i = 0; i < n_vars; i++) { if (! is_pt[i]) { where->attr = est[2 * i] = local_sim[i]; /* last simulation */ push_point(data[i], where); } else data[i]->nsim_at_data++; where->X += data[i]->n_X; } where->X = X_ori; /* reset */ break; case STRATIFY: /* estimate goes to est[0] and est[1] */ X_ori = where->X; /* remember... */ for (i = 0; i < where->u.stratum; i++) where->X += data[i]->n_X; for (i = 0; i < gl_nsim; i++) { /* load data from simulation i; */ restore_data_sel(&data[where->u.stratum], i, 0); set_beta(&data[where->u.stratum], i, 0, method); if (i == 0) /* estimate: */ gls(&data[where->u.stratum], 1, data[where->u.stratum]->n_sel < gl_n_uk ? GLS_BLP : GLS_BLUP, where, est); else /* update */ gls(&data[where->u.stratum], 1, UPDATE, where, est); sim = cond_sim(est, 1, method, is_pt, gl_order); /* save data from simulation i; */ save_sim_strat(data[where->u.stratum], where, i, sim[0], is_pt[0]); } /* store & push */ if (! is_pt[0]) { where->attr = est[0] = sim[0]; /* last simulation */ push_point(data[where->u.stratum], where); } else data[where->u.stratum]->nsim_at_data++; where->X = X_ori; /* and put back */ break; case MULTIVARIABLE: for (i = 0, n_sel = 0; i < n_vars; i++) n_sel += data[i]->n_sel; if (n_sel < gl_n_uk) gls_mode = GLS_BLP; else gls_mode = GLS_BLUP; for (i = 0; i < gl_nsim; i++) { /* load data from simulation i; */ restore_data_sel(data, i, n_vars); set_beta(data, i, n_vars, method); /* estimate or update: */ if (i == 0) gls(data, n_vars, gls_mode, where, est); else gls(data, n_vars, UPDATE, where, est); /* new simulation: */ sim = cond_sim(est, n_vars, method, is_pt, gl_order); /* put data from simulation i; */ save_sim(data, where, i, n_vars, sim, is_pt); } X_ori = where->X; /* remember... */ for (i = 0; i < n_vars; i++) { if (! is_pt[i]) { est[2 * i] = where->attr = sim[i]; /* last simulation */ push_point(data[i], where); } else data[i]->nsim_at_data++; where->X += data[i]->n_X; } where->X = X_ori; /* and put back */ break; default: ErrMsg(ER_IMPOSVAL, "Getest(): wrong mode"); break; } /* switch (get_mode()) */ for (i = 0; i < n_vars; i++) set_mv_double(&(est[2 * i + 1])); for (i = 2 * n_vars; i < get_n_outputs(); i++) set_mv_double(&(est[i])); /* print_sim(); */ break; case NRS: if (get_mode() != STRATIFY) { for (i = 0; i < n_vars; i++) { est[2 * i] = (double) data[i]->n_sel; est[2 * i + 1] = (double) data[i]->oct_filled; } } else { est[0] = (double) data[where->u.stratum]->n_sel; est[1] = (double) data[where->u.stratum]->oct_filled; } break; case SPREAD: if (get_mode() == STRATIFY) { if (data[where->u.stratum]->n_sel > 0) { if (data[where->u.stratum]->what_is_u != U_ISDIST) ErrMsg(ER_IMPOSVAL, "getest() needs distances"); n_sel = data[where->u.stratum]->n_sel; est[0] = sqrt(data[where->u.stratum]->sel[0]->u.dist2); est[1] = sqrt(data[where->u.stratum]->sel[n_sel - 1]->u.dist2); } } else { for (i = 0; i < n_vars; i++) { if (data[i]->n_sel > 0) { if (data[i]->what_is_u != U_ISDIST) ErrMsg(ER_IMPOSVAL, "getest() needs distances"); n_sel = data[i]->n_sel; est[2 * i] = sqrt(data[i]->sel[0]->u.dist2); est[2 * i + 1] = sqrt(data[i]->sel[n_sel - 1]->u.dist2); } } } break; case LSEM: v = get_vgm(LTI(0,0)); assert(v); v->id1 = v->id2 = v->id = 0; v->ev->evt = SEMIVARIOGRAM; if (data[0]->is_residual == 0) data[0]->is_residual = 1; /* !! */ v->ev->recalc = 1; calc_variogram(v, NULL); if (gl_fit) { v->ev->refit = 1; v->ev->fit = gl_fit; save_variogram_parameters(v); fit_variogram(v); /* write back locally fitted variogram model parameters: */ for (i = j = 0; i < MIN(get_n_vars(), v->n_models); i++) { est[2 * i + 0] = v->part[i].sill; est[2 * i + 1] = v->part[i].range[0]; j += 2; } if (j < get_n_vars()) est[j] = 1.0 * v->fit_is_singular; reset_variogram_parameters(v); update_variogram(v); /* not sure if this is needed */ } else { /* write back locally estimated sample variogram values: */ for (i = 0; i < MIN(get_n_vars(), v->ev->n_est); i++) { est[2 * i + 0] = v->ev->gamma[i]; est[2 * i + 1] = 1.0 * v->ev->nh[i]; } } break; case NSP: /* FALLTHROUGH: */ default: ErrMsg(ER_IMPOSVAL, "getest(): method not specified"); } /* switch */ efree(local_sim); efree(is_pt); return; } static void est_quantile_div(DATA *data, double *est, int div) { static double *list = NULL; static int i, size = 0; double mod = -9999.0; int n, run, longest_run = 0; if (data->n_sel > size) list = (double *) erealloc(list, (size = data->n_sel) * sizeof(double)); for (i = 0; i < data->n_sel; i++) list[i] = data->sel[i]->attr; qsort(list, (size_t) data->n_sel, sizeof(double), (int CDECL (*)(const void *, const void *)) d_cmp); if (div) { /* get diversity and modus in sel: */ n = data->n_sel; for (i = 0; i < data->n_sel - 2; i += run) { run = 1; while (i + run < data->n_sel && list[i] == list[i + run]) { run++; n--; } if (run > longest_run) { longest_run = run; mod = list[i]; } } est[0] = 1.0 * n; est[1] = mod; } else { if (data->n_sel < 2) return; if (gl_quantile == 0.5) est[0] = est[1] = est_quant(list, gl_quantile, data->n_sel); else { est[0] = est_quant(list, gl_quantile, data->n_sel); est[1] = est_quant(list, 1.0 - gl_quantile, data->n_sel); } } return; } static void est_skew_kurt(DATA *data, double *est) { static double *list = NULL; double mean, std, skewness = 0.0, kurtosis = 0.0, d; static int i, size = 0; if (data->n_sel <= 1) /* need at least 2 for variance */ return; if (data->n_sel > size) list = (double *) erealloc(list, (size = data->n_sel) * sizeof(double)); for (i = 0; i < data->n_sel; i++) list[i] = data->sel[i]->attr; mean = sample_mean(list, data->n_sel); std = sample_std(list, mean, data->n_sel); for (i = 0; i < data->n_sel; i++) { d = (data->sel[i]->attr - mean)/std; skewness += pow(d, 3.0); kurtosis += pow(d, 4.0); } est[0] = skewness/data->n_sel; est[1] = kurtosis/data->n_sel; } static double inverse_dist(DATA *data, DPOINT *where, double idPow) { int i, j; double sumweights, sumvals, value, weight, dist2; static DATA *blockd = NULL; if (data->n_sel <= 0) ErrMsg(ER_IMPOSVAL, "zero neighbourhood in inverse_dist()"); if (data->n_sel == 1) return data->sel[0]->attr; blockd = block_discr(blockd, get_block_p(), where); for (i = 0, value = 0.0; i < blockd->n_list; i++) { for (j = 0, sumweights = sumvals = 0.0; j < data->n_sel; j++) { dist2 = data->pp_norm2(data->sel[j], blockd->list[i]); if (dist2 == 0.0) { sumvals = data->sel[j]->attr; sumweights = 1.0; j = data->n_sel; /* break j loop */ } else { if (idPow == 2.0) weight = 1.0 / dist2; else weight = pow(dist2, -0.5 * idPow); sumweights += weight; sumvals += weight * data->sel[j]->attr; } } value += blockd->list[i]->u.weight * sumvals/sumweights; } return value; } void save_variogram_parameters(VARIOGRAM *v) { int i; if (vgm_pars == NULL) vgm_pars = (double *) emalloc(3 * v->n_models * sizeof(double)); for (i = 0; i < v->n_models; i++) { vgm_pars[3 * i + 0] = v->part[i].sill; vgm_pars[3 * i + 1] = v->part[i].range[0]; vgm_pars[3 * i + 2] = v->part[i].range[1]; } } void reset_variogram_parameters(VARIOGRAM *v) { int i; for (i = 0; i < v->n_models; i++) { v->part[i].sill = vgm_pars[3 * i + 0]; v->part[i].range[0] = vgm_pars[3 * i + 1]; v->part[i].range[1] = vgm_pars[3 * i + 2]; } v->fit_is_singular = 0; } static double sample_mean(double *list, int n) { int i; double mn = 0.0; if (list == NULL) ErrMsg(ER_NULL, "sample_mean()"); if (n == 0) ErrMsg(ER_RANGE, "sample_mean(): no values"); for (i = 0; i < n; i++) mn += list[i]; return mn/(1.0 * n); } static double sample_var(double *list, double mean, int n) { int i; double var = 0.0; if (list == NULL) ErrMsg(ER_NULL, "sample_var()"); if (n <= 1 || list == NULL) ErrMsg(ER_RANGE, "sample_var(): <= 1 values"); for (i = 0; i < n; i++) var += SQR(list[i] - mean); return (var / (n - 1.0)); } static double sample_std(double *list, double mean, int n) { return sqrt(sample_var(list, mean, n)); } static double est_quant(double *list, double p, int n) { /* * function returns the value of the p-th quantile * of the ordered list *list, row exists from list[0]..list[length-1], * p is in [0..1]; * a missing value is generated when the quantile lies not within * the valid data range, and is undetermined therefore */ double order, where; int below, above; if (n < 2) ErrMsg(ER_RANGE, "est_quant(): < 2 obs."); if (p < 0.0 || p > 1.0) ErrMsg(ER_RANGE, "can't calculate quantile outside [0,1]"); order = p * (n - 1); /* order = n * (p * n)/(n + 1); */ below = (int) floor(order); /* the index below order */ if (below < 0) return list[0]; above = below + 1; /* the index above order */ if (above >= n) return list[n - 1]; where = order - below; return (1 - where) * list[below] + where * list[above]; } int CDECL d_cmp(const double *a, const double *b) { if (*a < *b) return -1; if (*a > *b) return 1; return 0; } gstat/src/glvars.c0000644000176200001440000006025715060550314013636 0ustar liggesusers/* * glvars.c: has global variables, choose defaults, check setting integrity */ #include #include #include #include #include "defs.h" #include "userio.h" #include "debug.h" #include "data.h" #include "utils.h" #include "vario.h" #include "defaults.h" /* default values for gl_* variables */ #include "glvars.h" #include "gls.h" #include "block.h" /* * this module contains all global variables, along with some * routines for initialisation (of structures), resizing during runtime, * checks after reading command file and before starting real calculations, * obtaining some "local" global structures, printing all that's held, * and so on. get_n_vars() etc. are for clarity that these variables are not * changed outside the area where they're set. */ static void init_gstat_data(int n); static void clean_up(void); /* * global variables (glvars.h, defautls.h): */ int debug_level; /* debug level */ int gl_blas; int gl_choleski; /* do choleski instead of LDL? */ int gl_coincide; /* do the variable locations coincide? */ int gl_cressie; /* use cressie's estimator ? */ int gl_fit; /* do not fit a variogram */ int gl_gauss; /* gaussian quadr. block covariances ? */ int gl_iter; /* max. n. iter for mivque estimates */ int gl_jgraph; /* do jgraph plot in batch mode ? */ int gl_lhs; /* apply Latin hypercube sampling to Gaussian simulations */ int gl_longlat; /* indicates whether coordinates are longitude/latitude, or Euclidian */ int gl_nblockdiscr; /* block discrimination in each dimension */ int gl_n_intervals; /* n variogram intervals */ int gl_n_marginals; /* the n marginal distributions */ int gl_nsim; /* number of simultanious simulations */ int gl_n_uk; /* min. # of cs points to use ok */ int gl_numbers; /* plot numbers on variogram plot? */ int gl_nocheck; /* do not check LMC/IC ? */ int gl_order; /* do order relation correction */ int gl_plotweights; /* plot kriging weights? */ int gl_register_pairs; /* register sample variogram pairs? */ int gl_rowwise; /* deal with raster maps row-wise, or as complete blocks? */ int gl_rp; /* follow random path for gs/is? */ int gl_seed; /* seed is set? */ int gl_sim_beta; /* simulation mode for beta: 0 multiv GLS, 1 univ GLS, 2 OLS */ int gl_spiral; /* do spiral search if possible? */ int gl_split; /* see nsearch.c: was Q_SPLIT_AT */ int gl_sym_ev; /* default symmetric ps.cr.v./cr.cv. ? */ int gl_gls_residuals; /* calc. gls residuals? */ int gl_sparse; /* use sparse covariance matrices? */ int gl_xvalid; /* do cross validation on first variable */ int gl_zero_est; /* est. variogram at h 0 seperately? */ double *gl_bounds; /* boundaries semivariogram intervals */ double gl_cutoff; /* variogram cutoff */ double gl_fit_limit; /* convergence criterion on fit */ double gl_fraction; /* fraction of max dist for cutoff */ double gl_idp; /* default inverse distance power */ double gl_iwidth; /* variogram class width */ double gl_quantile; /* sample quantile */ double gl_zmap; /* height of the map */ double gl_alpha; /* alpha, beta, tol_[hor|ver]: anisotropy parameters */ double gl_beta; double gl_tol_hor; double gl_tol_ver; double gl_zero; /* zero tolerance; 2-squared */ const METHODS methods[] = { /* methods and codes */ { NSP, 0, "nsp" }, /* do nothing */ { UIF, 0, "ui" }, /* variogram modelling user interface */ { OKR, 0, "ok" }, /* ordinary kriging */ { UKR, 0, "uk" }, /* universal kriging */ { SKR, 0, "sk" }, /* simple kriging */ { IDW, 0, "id" }, /* inverse distance interpolation */ { MED, 0, "med" }, /* (local) sample median or quantiles */ { NRS, 0, "n$r" }, /* neighbourhood size */ { LSLM, 0, "tr$end" }, /* uncorrelated (or weighted) linear model */ { GSI, 1, "gs" }, /* gaussian (conditional) simulation */ { ISI, 1, "is" }, /* indicator (conditional) simulation */ { SEM, 0, "se$mivariogram" }, /* sample (cross) semivariance */ { COV, 0, "co$variogram" }, /* sample (cross) covariance */ { SPREAD, 0, "di$stance" }, /* distance to nearest sample */ { DIV, 0, "div" }, /* diversity and modus */ { SKEW, 0, "skew" }, /* skewness and kurtosis */ { LSEM, 0, "lsem" }, /* locally estimated/fitted variogram parameters */ { TEST, 0, "test" }, /* do-nothing? */ { NSP, 0, NULL } /* terminating field */ }; /* * "local" database, accesible through get_* functions */ static VARIOGRAM **vgm = NULL; static DATA **data = NULL; static char **outfile_names = NULL, **ids = NULL; static DATA *valdata = NULL; static DATA *data_area = NULL; /* area that discretises block */ static DPOINT block; static METHOD method = NSP; static int n_vars = 0; static int n_last = 0, n_v_last = 0, n_o_last = 0; static MODE mode = MODE_NSP; /* MODE_NSP, SIMPLE, STRATIFY or MULTIVARIABLE */ int init_global_variables(void) { /* * global variables init. (glvars.h; defautls.h): */ method = NSP; mode = MODE_NSP; debug_level = DB_NORMAL; gl_blas = DEF_blas; gl_choleski = DEF_choleski; gl_coincide = DEF_coincide; gl_cressie = DEF_cressie; gl_fit = DEF_fit; gl_gauss = DEF_gauss; gl_iter = DEF_iter; gl_jgraph = DEF_jgraph; gl_lhs = DEF_lhs; gl_longlat = DEF_longlat; gl_nblockdiscr = DEF_nblockdiscr; gl_n_intervals = DEF_intervals; gl_n_marginals = DEF_n_marginals; gl_nsim = DEF_nsim; gl_n_uk = DEF_n_uk; gl_numbers = DEF_numbers; gl_nocheck = DEF_nocheck; gl_order = DEF_order; gl_register_pairs = DEF_pairs; gl_rowwise = DEF_rowwise; gl_rp = DEF_rp; gl_seed = DEF_seed; gl_sim_beta = DEF_sim_beta; gl_spiral = DEF_spiral; gl_split = DEF_split; gl_sym_ev = DEF_sym_ev; gl_gls_residuals = DEF_gls_residuals; gl_sparse = DEF_sparse; gl_xvalid = DEF_xvalid; gl_zero_est = DEF_zero_est; gl_bounds = DEF_bounds; gl_cutoff = DEF_cutoff; gl_fit_limit = DEF_fit_limit; gl_fraction = DEF_fraction; gl_idp = DEF_idp; gl_iwidth = DEF_iwidth; gl_quantile = DEF_quantile; gl_zmap = DEF_zmap; gl_alpha = DEF_alpha; gl_beta = DEF_beta; gl_tol_hor = DEF_tol_hor; gl_tol_ver = DEF_tol_ver; gl_zero = DEF_zero; init_gstat_data(0); /* EJPXX * if (valdata == NULL) * */ valdata = init_one_data(valdata); block.x = block.y = block.z = 0.0; set_mv_double(&gl_zmap); get_covariance(NULL, 0, 0, 0); return 0; } void push_bound(double value) { static int n_bound; if (gl_bounds == NULL) { n_bound = 0; gl_bounds = (double *) emalloc((n_bound+2) * sizeof(double)); } else gl_bounds = (double *) erealloc(gl_bounds,(n_bound+2) * sizeof(double)); gl_bounds[n_bound] = value; gl_bounds[n_bound + 1] = -1.0; if (n_bound > 0 && gl_bounds[n_bound] <= gl_bounds[n_bound-1]) ErrMsg(ER_IMPOSVAL, "bounds must be strictly increasing"); n_bound++; } int n_variograms_set(void) { int i, n; for (i = 0, n = 0; i < get_n_vgms(); i++) if (vgm[i] != NULL && vgm[i]->id >= 0) n++; return n; } static void init_gstat_data(int n) { int i, n_vgms, n_outfl; n_vgms = (n * (n + 1))/2; n_outfl = n + n_vgms; if (n <= n_last) return; data = (DATA **) erealloc(data, n * sizeof(DATA *)); for (i = n_last; i < n; i++) data[i] = init_one_data(NULL); vgm = (VARIOGRAM **) erealloc(vgm, n_vgms * sizeof(VARIOGRAM *)); for (i = n_v_last; i < n_vgms; i++) vgm[i] = NULL; outfile_names = (char **) erealloc (outfile_names, n_outfl * sizeof(char *)); for (i = n_o_last; i < n_outfl; i++) outfile_names[i] = NULL; n_last = n; n_o_last = n_outfl; n_v_last = n_vgms; n_vars = n; return; } int which_identifier(const char *id) { assert(id); for (int i = 0; i < n_vars; i++) { if (ids[i] == NULL) ErrMsg(ER_IMPOSVAL, "which_identifier(): ids[i] == NULL"); if (strcmp(ids[i], id) == 0) return i; } /* else: extend data space */ n_vars++; ids = (char **) erealloc(ids, n_vars * sizeof(char *)); int Length = strlen(id) + 1; ids[n_vars - 1] = (char *) emalloc(Length * sizeof(char)); snprintf(ids[n_vars - 1], Length, "%s", id); init_gstat_data(n_vars); return n_vars - 1; } const char *name_identifier(int i) { static const char *cp_val = "data()", *cp_area = "area"; switch (i) { case ID_OF_VALDATA: return cp_val; case ID_OF_AREA: return cp_area; default: if (i >= get_n_vars() || i < 0) { pr_warning("i = %d", i); ErrMsg(ER_RANGE, "name_identifier(i): i outside range"); } return ids[i]; } } const char *method_string(METHOD i) { #define MSTR_SIZE 100 static char mstr[MSTR_SIZE]; char *str, *co, *un, *gsum = ""; if ((i == ISI || i == GSI) && gl_n_uk == DEF_n_uk && get_n_beta_set() != get_n_vars()) gsum = " with unknown means"; str = (get_mode() == STRATIFY ? "stratified " : ""); un = (get_n_vars() > 0 && data[0]->dummy ? "un" : ""); co = (get_mode() == MULTIVARIABLE ? "co" : ""); switch (i) { case NSP: snprintf(mstr, MSTR_SIZE, "exit"); break; case TEST: snprintf(mstr, MSTR_SIZE, "Test Option"); break; case UIF: snprintf(mstr, MSTR_SIZE, "starting interactive mode"); break; case SEM: snprintf(mstr, MSTR_SIZE, "calculating sample variogram"); break; case COV: snprintf(mstr, MSTR_SIZE, "calculating sample covariogram"); break; case SPREAD: snprintf(mstr, MSTR_SIZE, "spread value (distance to nearest observation) on output"); break; case IDW: snprintf(mstr, MSTR_SIZE, "%sinverse distance weighted interpolation", str); break; case MED: if (gl_quantile == 0.5) snprintf(mstr, MSTR_SIZE, "%smedian estimation", str); else snprintf(mstr, MSTR_SIZE, "%s%g-quantile estimation", str, gl_quantile); break; case NRS: snprintf(mstr, MSTR_SIZE, "(%s:) neighbourhood size on first output variable", str); break; case LSLM: if (n_variograms_set()) snprintf(mstr, MSTR_SIZE, "%sgeneralized least squares trend estimation", str); else snprintf(mstr, MSTR_SIZE, "%sordinary or weighted least squares prediction", str); break; case OKR: snprintf(mstr, MSTR_SIZE, "using %sordinary %skriging", str, co); break; case SKR: snprintf(mstr, MSTR_SIZE, "using %ssimple %skriging", str, co); break; case UKR: snprintf(mstr, MSTR_SIZE, "using %suniversal %skriging", str, co); break; case GSI: snprintf(mstr, MSTR_SIZE, "using %s%sconditional Gaussian %ssimulation%s", str, un, co, gsum); break; case ISI: snprintf(mstr, MSTR_SIZE, "using %s%sconditional indicator %ssimulation", str, un, co); break; case DIV: snprintf(mstr, MSTR_SIZE, "within-neighbourhood diversity and modus"); break; case SKEW: snprintf(mstr, MSTR_SIZE, "skewness and kurtosis"); break; case LSEM: snprintf(mstr, MSTR_SIZE, "local semivariance or locally fitted semivariogram parameters"); break; } return mstr; } int get_n_vars(void) { return n_vars; } int get_n_beta_set(void) { int i, nbeta; for (i = nbeta = 0; i < get_n_vars(); i++) if (data[i]->beta != NULL) nbeta++; return nbeta; } MODE get_mode(void) { return mode; } int get_n_vgms(void) { int n; n = get_n_vars(); return (n * (n + 1))/2; } int get_n_outputs(void) { return get_n_vars() + get_n_vgms(); } const char **get_outfile_name(void) { return (const char **) outfile_names; } VARIOGRAM *get_vgm(int i) { assert(i < get_n_vgms()); assert(i >= 0); if (vgm[i] == NULL) vgm[i] = init_variogram(NULL); return vgm[i]; } DATA **get_gstat_data(void) { return data; } DATA *get_dataval(void) { return valdata; } DATA *get_data_area(void) { return data_area; } DATA *create_data_area(void) { data_area = init_one_data(NULL); return data_area; } DPOINT *get_block_p(void) { return █ } METHOD get_method(void) { return method; } void set_method(METHOD m) { method = m; return; } int is_simulation(METHOD m) { assert(methods[m].m == m); return methods[m].is_simulation; } double max_block_dimension(int reset) { static double dim = -1.0; if (reset) dim = -1.0; if (dim < 0.0) { if (data_area != NULL) dim = data_block_diagonal(data_area); else dim = sqrt(SQR(block.x)+SQR(block.y)+SQR(block.z)); } return dim; } void setup_valdata_X(DATA *d) { /* * fills '0'-X columns (intercept) at the right place * e.g. data(a): .. X=1&2;data(b): .. X=3&4; data(): .. X=1&2&3&4; * this leads to "0 1 2 3 4" for colX, but should be "0 1 2 0 3 4"; */ int i = 0, j = 0, n_d, n_all; /* * # positive X's in all variables should equal # positive X's in this */ for (i = 0, n_all = 0; i < get_n_vars(); i++) for (j = 0; j < data[i]->n_X; j++) if (data[i]->colX[j] > 0) n_all++; for (i = 0, n_d = 0; i < d->n_X; i++) if (d->colX[i] > 0) n_d++; if (n_all != n_d) { pr_warning( "nr of X's in data: (%d) should match X's in other data(...) (%d)", n_d, n_all); ErrMsg(ER_IMPOSVAL, "X column definition mismatch"); } /* * now correct for 0's */ for (i = 0, n_all = 0; i < get_n_vars(); i++) n_all += data[i]->n_X; if (n_all == d->n_X) return; /* we're done */ n_d = d->n_X; d->n_X = n_all; d->colX = (int *) realloc(d->colX, d->n_X * sizeof(int)); /* fill backwards */ for (i = get_n_vars() - 1; i >= 0; i--) { for (j = data[i]->n_X - 1; j >= 0; j--) { n_all--; /* position of current X in d */ if (data[i]->colX[j] <= 0) /* intercept, x, xy, x2, etc. */ d->colX[n_all] = data[i]->colX[j]; else { n_d--; if (n_d < 0) ErrMsg(ER_IMPOSVAL, "setup_X(): n_d < 0"); if (d->colX[n_d] == 0) ErrMsg(ER_IMPOSVAL, "setup_X(): zero error"); d->colX[n_all] = d->colX[n_d]; } if (n_all < 0) ErrMsg(ER_IMPOSVAL, "setup_X(): n_all < 0"); } } return; } METHOD get_default_method(void) { int i, Xset, Vgm_set; /* * no no prediction locations or no data: */ if (get_n_vars() == 0) return NSP; if (valdata->id < 0 && gl_xvalid == 0 && data_area == NULL) { return UIF; } /* * check on X variables */ for (i = Xset = 0; i < get_n_vars(); i++) if (!(data[i]->n_X == 1 && data[i]->colX[0] == 0)) Xset++; /* * check on variograms */ for (i = 0, Vgm_set = 0; i < get_n_vars(); i++) if (vgm[LTI(i,i)] != NULL && (vgm[LTI(i,i)]->n_models > 0 || vgm[LTI(i,i)]->table != NULL)) /* was: ->id >= 0*/ Vgm_set++; if (!(Vgm_set == 0 || Vgm_set == get_n_vars())) ErrMsg(ER_SYNTAX, "set either all or no variograms"); if (Vgm_set > 0) { if (get_n_beta_set() > 0) return SKR; else return (Xset > 0 ? UKR : OKR); } else return (Xset > 0 ? LSLM : IDW); } void set_mode(void) { int i, j, check_failed = 0; if (method == NSP) return; /* * simple, univariate: */ if (get_n_vars() <= 1) { mode = SIMPLE; return; } /* * (get_n_vars() > 1): * multivariable prediction if all cross variograms set parameters merge */ for (i = check_failed = 0; i < get_n_vars(); i++) for (j = 0; j < i; j++) if (vgm[LTI(i,j)] == NULL || vgm[LTI(i,j)]->id < 0) check_failed = 1; if (check_failed == 0) { mode = MULTIVARIABLE; return; } if (n_variograms_set() == 0) { for (i = 0; i < get_n_vars(); i++) if (data[i]->n_merge > 0) { mode = MULTIVARIABLE; return; } } /* * stratify? ONLY if: * 0. get_n_vars() > 1; no cross variograms set ==>> has been checked. * 1. no pred(): or var(): except for first variable; * 2. No masks and valdata->what_is_u == U_ISSTRATUM * 3. mask is a valid strata map, n categories > 1 */ mode = (valdata->what_is_u == U_ISSTRATUM) ? STRATIFY : SIMPLE; return; } int decide_on_coincide(void) { int i, j; if (get_n_vars() <= 1) return 0; if (get_mode() == STRATIFY) return 0; /* data may coincide, but prediction locations won't */ for (i = 1; i < get_n_vars(); i++) { if (data[i]->n_list != data[0]->n_list || data[i]->colnx != data[0]->colnx || data[i]->colny != data[0]->colny || data[i]->colnz != data[0]->colnz || data[i]->sel_min != data[0]->sel_min || data[i]->sel_max != data[0]->sel_max || data[i]->force != data[0]->force || data[i]->sel_rad != data[0]->sel_rad) return 0; /* don't check filename: 'file.dat' and './file.dat' */ /* * Consider the data file * 1 2 NA 3 * 2 3 4 NA * with x=1, y=2, v=3 (for var 1), v=4 (for var 2). * This is only distinguishable by doing it the ``hard way'': */ for (j = 0; j < data[0]->n_list; j++) { if (data[0]->list[j]->x != data[i]->list[j]->x || data[0]->list[j]->y != data[i]->list[j]->y || data[0]->list[j]->z != data[i]->list[j]->z) return 0; } } if (DEBUG_DUMP) printlog("(identical search conditions found for all variables)\n"); return 1; } void check_global_variables(void) { /* * Purpose : check internal variable consistency, add some parameters * Created by : Edzer J. Pebesma * Date : april 13, 1992 * Prerequisites : none * Returns : - * Side effects : none * also check Cauchy-Schwartz unequality on cross/variograms. */ int i, j, n_merge = 0; METHOD m; VARIOGRAM *v_tmp; /* UK: check if n_masks equals total nr of unbiasedness cond. */ if (gl_nblockdiscr < 2) ErrMsg(ER_RANGE, "nblockdiscr must be >= 2"); if (method == SPREAD) { for (i = 0; i < get_n_vars(); i++) if (data[i]->sel_rad == DBL_MAX) data[i]->sel_rad *= 0.99; /* force distance calculation */ } if (get_n_beta_set() != 0 && get_n_beta_set() != get_n_vars()) ErrMsg(ER_SYNTAX, "set sk_mean or beta either for all or for no variables"); if (!(method == ISI || method == GSI)) { if (gl_nsim > 1) ErrMsg(ER_IMPOSVAL, "nsim only allowed for simulation"); } if (method == ISI && max_block_dimension(0) > 0.0) ErrMsg(ER_IMPOSVAL, "indicator simulation only for points"); /* * check if both block and area are set */ if (data_area != NULL && (block.x > 0.0 || block.y > 0.0 || block.z > 0.0)) ErrMsg(ER_IMPOSVAL, "both block and area set: choose one"); /* * check for equality of coordinate dimensions: */ for (i = 1; i < get_n_vars(); i++) { if ((data[i]->mode & V_BIT_SET) != (data[0]->mode & V_BIT_SET)) { message("data(%s) and data(%s):\n", name_identifier(0), name_identifier(i)); ErrMsg(ER_IMPOSVAL, "data have different coordinate dimensions"); } } if (valdata->id > 0 && data[0]->dummy == 0 && ((data[0]->mode | (V_BIT_SET | S_BIT_SET)) != (valdata->mode | (V_BIT_SET | S_BIT_SET)))) { message("data() and data(%s):\n", name_identifier(0)); ErrMsg(ER_IMPOSVAL, "data have different coordinate dimensions"); for (i = 0; i < get_n_vars(); i++) { if (data[i]->dummy) { data[i]->mode = (valdata->mode | V_BIT_SET); data[i]->minX = valdata->minX; data[i]->minY = valdata->minY; data[i]->minZ = valdata->minZ; data[i]->maxX = valdata->maxX; data[i]->maxY = valdata->maxY; data[i]->maxZ = valdata->maxZ; set_norm_fns(data[i]); } } } for (i = 0; i < get_n_vars(); i++) { if (data[i]->fname == NULL && !data[i]->dummy) { message("file name for data(%s) not set\n", name_identifier(i)); ErrMsg(ER_NULL, " "); } if (data[i]->id < 0) { message("data(%s) not set\n", name_identifier(i)); ErrMsg(ER_NULL, " "); } if (data[i]->beta && data[i]->beta->size != data[i]->n_X) { pr_warning("beta dimension (%d) should equal n_X (%d)", data[i]->beta->size, data[i]->n_X); ErrMsg(ER_IMPOSVAL, "sizes of beta and X don't match"); } if (data[i]->sel_rad == DBL_MAX && data[i]->oct_max > 0) ErrMsg(ER_IMPOSVAL, "define maximum search radius (rad) for octant search"); if (data[i]->vdist && data[i]->sel_rad == DBL_MAX) ErrMsg(ER_IMPOSVAL, "when using vdist, radius should be set"); if (! data[i]->dummy && ! (data[i]->mode & V_BIT_SET)) { message("no v attribute set for data(%s)\n", name_identifier(data[i]->id)); ErrMsg(ER_NULL, " "); } if (method != SEM && method != COV) { /* check neighbourhood settings */ if (data[i]->sel_rad < 0.0 || data[i]->sel_min < 0 || data[i]->sel_max < 0 || (data[i]->sel_min > data[i]->sel_max)) { message( "invalid neighbourhood selection: radius %g max %d min %d\n", data[i]->sel_rad, data[i]->sel_max, data[i]->sel_min); ErrMsg(ER_IMPOSVAL, " "); } } if (data[i]->id > -1 && (method == OKR || method == SKR || is_simulation(method) || method == UKR)) { if (vgm[LTI(i,i)] == NULL || vgm[LTI(i,i)]->id < 0) { message("variogram(%s) not set\n", name_identifier(i)); ErrMsg(ER_VARNOTSET, "variogram()"); } } n_merge += data[i]->n_merge; } if (n_merge && get_mode() != MULTIVARIABLE) ErrMsg(ER_IMPOSVAL, "merge only works in multivariable mode"); if (mode == SIMPLE && get_method() != UIF) { /* check if it's clean: */ for (i = 0; i < get_n_vars(); i++) for (j = 0; j < i; j++) if (vgm[LTI(i,j)] != NULL && vgm[LTI(i,j)]->id > 0) { message("variogram(%s, %s) %s\n", name_identifier(i), name_identifier(j), "can only be set for ck, cs, uk, sk, ok, sem or cov"); ErrMsg(ER_IMPOSVAL, "variogram()"); } } if ((m = get_default_method()) != get_method()) { if (m == UKR && (get_method() == OKR || get_method() == SKR)) ErrMsg(ER_IMPOSVAL, "\nremove X=... settings for ordinary or simple kriging"); if (m == OKR && get_method() == SKR) ErrMsg(ER_IMPOSVAL, "method: something's terribly wrong!"); if (m == OKR && get_method() == UKR) { message("I would recommend:\n"); message("Do not specify uk if ok is all you'll get\n"); } } if (mode == MULTIVARIABLE && get_method() != UIF && get_method() != SEM && get_method() != COV && n_variograms_set() > 0) check_variography((const VARIOGRAM **) vgm, get_n_vars()); v_tmp = init_variogram(NULL); free_variogram(v_tmp); } void remove_all(void) { while (n_vars) remove_id(0); /* hard way */ /* for (i = n_vars-1; i >= 0; i--) remove_id(i); */ /* remove_id(n_vars - 1); */ /* the hard way; remove_id(n_vars-1) would be the ``easy'' alternative */ gls(NULL, 0, GLS_INIT, NULL, NULL); /* cleans up static arrays */ reset_block_discr(); /* resets block settings */ max_block_dimension(1); /* reset */ if (gl_bounds != NULL) { efree(gl_bounds); gl_bounds = NULL; } if (valdata != NULL) free_data(valdata); valdata = NULL; } int remove_id(const int id) { /* * remove id id, and reset data, vgm, ids, outfile_names */ int i, j, id_new, id_old; VARIOGRAM *vp; assert(id >= 0 && id < n_vars); /* reset data */ free_data(data[id]); data[id] = NULL; for (i = id; i < n_vars - 1; i++) { data[i] = data[i+1]; data[i]->id = i; } for (i = 0; i < n_vars; i++) { j = LTI(i,id); if (vgm[j]) { free_variogram(vgm[j]); vgm[j] = NULL; } } /* copy variograms: */ for (i = id; i < n_vars - 1; i++) { for (j = id; j <= i; j++) { id_new = LTI(i,j); id_old = LTI(i+1,j+1); vp = vgm[id_new] = vgm[id_old]; if ((vp != NULL) && (vp->id1 >= 0 || vp->id2 >= 0)) { vp->id1 = i; vp->id2 = j; vp->id = id_new; } } } /* reset identifiers: */ efree(ids[id]); for (i = id; i < n_vars - 1; i++) ids[i] = ids[i+1]; /* free outfilenames */ if (outfile_names[2 * id]) { efree(outfile_names[2 * id]); outfile_names[2 * id] = NULL; } if (outfile_names[2 * id + 1]) { efree(outfile_names[2 * id + 1]); outfile_names[2 * id + 1] = NULL; } /* shift pred(xx)/variances(xx) names: */ for (i = id; i < n_vars - 1; i++) { outfile_names[2 * i] = outfile_names[2 * (i + 1)]; outfile_names[2 * i + 1] = outfile_names[2 * (i + 1) + 1]; } /* shift covariances(xx): */ for (i = id; i < n_vars - 1; i++) { id_old = 2 * n_vars + LTI2(i,id); if (outfile_names[id_old]) { efree(outfile_names[id_old]); outfile_names[id_old] = NULL; } for (j = id; j < i; j++) { id_new = 2 * (n_vars - 1) + LTI2(i,j); id_old = 2 * n_vars + LTI2(i+1,j+1); outfile_names[id_new] = outfile_names[id_old]; } } n_vars -= 1; if (n_vars == 0) clean_up(); init_gstat_data(n_vars); /* reset sizes */ return n_vars; } static void clean_up(void) { /* free variograms */ if (vgm) { efree(vgm); vgm = NULL; } /* free data */ if (data) { efree(data); data = NULL; } /* free valdata */ if (valdata) { free_data(valdata); valdata = NULL; } /* free data_area */ if (data_area) { free_data(data_area); data_area = NULL; } /* free outfile names */ if (outfile_names) { efree(outfile_names); outfile_names = NULL; } /* free identifiers */ if (ids) { efree(ids); ids = NULL; } n_vars = 0; n_last = 0; n_v_last = 0; n_o_last = 0; mode = MODE_NSP; } gstat/src/utils.h0000644000176200001440000000272615060550314013502 0ustar liggesusers#ifndef UTILS_H #define UTILS_H # include /* size_t */ /* some famous beware-of-side-effects macro's ! */ #ifndef MAX # define MAX(a,b) (((a) > (b)) ? (a) : (b)) #endif #ifndef MIN # define MIN(a,b) (((a) < (b)) ? (a) : (b)) #endif #ifndef ABS #define ABS(a) (((a) >= 0) ? (a) : (-(a))) #endif #ifndef SQR # define SQR(a) ((a)*(a)) #endif #ifndef PI # define PI 3.14159265359 #endif #define NULS(a) (a==NULL ? "" : a) /* LTI: lower triangular matrix index, stored in an array: col | 0 1 2 3 ----+------- 0 | 0 r 1 | 1 2 o 2 | 3 4 5 w 3 | 6 7 8 9 row and col may be interchanged: LTI(a,b)==LTI(b,a) LTI2(a,b) is the index of an off-diagonal lower triangular matrix: col | 0 1 2 3 ----+------- 0 | x r 1 | 0 x o 2 | 1 2 x w 3 | 3 4 5 x */ #define LTI(r,c) ((r) >= (c) ? (((r)*(r+1))>>1)+(c) : (((c)*(c+1))>>1)+(r)) #define LTI2(r,c) ((r) >= (c) ? (((r)*(r-1))>>1)+(c) : (((c)*(c-1))>>1)+(r)) /* Note: `>>1' replaced `/2' to circumvent an hp 10.20 optimizer bug */ #if defined(__cplusplus) extern "C" { #endif typedef struct { char *str; unsigned int max_length; } STRING_BUFFER; void set_mv_float(float *f); void set_mv_double(double *d); int is_mv_float(const float *f); int is_mv_double(const double *d); int almost_equals(const char *tok, const char *str); void *emalloc(size_t size); void *ecalloc(size_t nobj, size_t size); void *erealloc(void *p, size_t size); void efree(void *p); #if defined(__cplusplus) } #endif #endif /* UTILS_H */ gstat/src/vario.c0000644000176200001440000005617115060550314013460 0ustar liggesusers/* * vario.c: basic variogram model functions (init, print, update, etc.) */ #include #include /* getenv() */ #include /* toupper() */ #include /* DBL_MIN */ #include #include #include "R.h" /* Rprintf() */ #include "defs.h" #include "mtrx.h" #include "userio.h" #include "data.h" #include "utils.h" #include "debug.h" #include "vario.h" #include "vario_fn.h" #include "glvars.h" #include "lm.h" static int is_valid_cs(const VARIOGRAM *aa, const VARIOGRAM *bb, const VARIOGRAM *ab); static int is_posdef(MAT *m); static ANIS_TM *get_tm(double anis[5]); static void init_variogram_part(VGM_MODEL *v); const V_MODEL v_models[] = { /* the variogram model catalogue: */ /* first one needs to be NOT_SP: */ { NOT_SP, "Nsp", "Nsp (not specified)", NULL, NULL }, { NUGGET, "Nug", "Nug (nugget)", fn_nugget, da_is_zero }, { EXPONENTIAL, "Exp", "Exp (exponential)", fn_exponential, da_fn_exponential }, { SPHERICAL, "Sph", "Sph (spherical)", fn_spherical, da_fn_spherical }, { GAUSSIAN, "Gau", "Gau (gaussian)", fn_gaussian, da_fn_gaussian }, { EXCLASS, "Exc", "Exclass (Exponential class/stable)", fn_exclass, NULL }, { MATERN, "Mat", "Mat (Matern)", fn_matern, NULL }, { STEIN, "Ste", "Mat (Matern, M. Stein's parameterization)", fn_matern2, NULL }, { CIRCULAR, "Cir", "Cir (circular)", fn_circular, NULL }, { LINEAR, "Lin", "Lin (linear)", fn_linear, da_fn_linear }, /* one-parameter (a = 0), or two-parameter with sill */ { BESSEL, "Bes", "Bes (bessel)", fn_bessel, NULL }, { PENTASPHERICAL, "Pen", "Pen (pentaspherical)", fn_pentaspherical, da_fn_pentaspherical }, { PERIODIC, "Per", "Per (periodic)", fn_periodic, da_fn_periodic }, { WAVE, "Wav", "Wav (wave)", fn_wave, da_fn_wave }, { HOLE, "Hol", "Hol (hole)", fn_hole, da_fn_hole }, { LOGARITHMIC, "Log", "Log (logarithmic)", fn_logarithmic, da_fn_logarithmic }, { POWER, "Pow", "Pow (power)", fn_power, da_fn_power }, /* Wackernagel 2nd ed., p. 225 -- not working yet */ { SPLINE, "Spl", "Spl (spline)", fn_spline, NULL }, { LEGENDRE, "Leg", "Leg (Legendre)", fn_legendre, NULL }, { MERROR, "Err", "Err (Measurement error)", fn_nugget, da_is_zero }, /* the folowing two should always be the last ``valid'' one: */ { INTERCEPT, "Int", "Int (Intercept)", fn_intercept, da_is_zero }, { NOT_SP, NULL, NULL, NULL, NULL } /* THIS SHOULD BE LAST */ }; const char *vgm_type_str[] = { "not specified", "semivariogram", "cross variogram", "covariogram", "cross covariogram" }; VARIOGRAM *init_variogram(VARIOGRAM *v) { /* * initializes one variogram structure * if v is NULL, memory is allocated for the structure */ int i; if (v == NULL) v = (VARIOGRAM *) emalloc(sizeof(VARIOGRAM)); v->id = v->id1 = v->id2 = -1; v->n_models = 0; v->is_valid_covariance = 1; v->isotropic = 1; v->n_fit = 0; v->fit_is_singular = 0; v->max_range = (double) DBL_MIN; v->sum_sills = 0.0; v->measurement_error = 0.0; v->max_val = 0.0; v->min_val = 0.0; vgm_init_block_values(v); v->part = (VGM_MODEL *) emalloc(INIT_N_VGMM * sizeof(VGM_MODEL)); v->table = NULL; for (i = 0; i < INIT_N_VGMM; i++) init_variogram_part(&(v->part[i])); v->max_n_models = INIT_N_VGMM; v->SSErr = 0.0; v->ev = init_ev(); return v; } void vgm_init_block_values(VARIOGRAM *v) { v->block_semivariance_set = 0; v->block_covariance_set = 0; v->block_covariance = -999999.0; v->block_semivariance = -999999.0; } static void init_variogram_part(VGM_MODEL *p) { int i; p->sill = 0.0; for (i = 0; i < NRANGEPARS; i++) { p->range[i] = 0.0; /* quiets valgrind? */ set_mv_double(&(p->range[i])); /* trigger errors if misused */ } p->model = NOT_SP; p->fit_sill = p->fit_range = 1; p->fnct = p->da_fnct = NULL; p->tm_range = NULL; p->id = -1; } SAMPLE_VGM *init_ev(void) { SAMPLE_VGM *ev = NULL; ev = (SAMPLE_VGM *) emalloc(sizeof(SAMPLE_VGM)); set_mv_double(&(ev->cutoff)); set_mv_double(&(ev->iwidth)); ev->gamma = NULL; ev->dist = NULL; ev->nh = NULL; ev->pairs = NULL; ev->n_max = 0; ev->n_est = 0; ev->zero = ZERO_DEFAULT; ev->plot_numbers = 1; ev->is_directional = 0; ev->evt = NOTSPECIFIED; ev->fit = NO_FIT; ev->recalc = 1; ev->refit = 1; ev->pseudo = 0; ev->is_asym = -1; ev->map = NULL; ev->S_grid = NULL; ev->direction.x = 1.0; ev->direction.y = ev->direction.z = 0.0; return ev; } void free_variogram(VARIOGRAM *v) { int i; assert(v != NULL); if (v->ev) { if (v->ev->n_max > 0) { efree(v->ev->gamma); efree(v->ev->dist); efree(v->ev->nh); if (v->ev->pairs) efree(v->ev->pairs); } if (v->ev->map) efree(v->ev->map); efree(v->ev); } for (i = 0; i < v->max_n_models; i++) if (v->part[i].tm_range != NULL) efree(v->part[i].tm_range); efree(v->part); if (v->table) { efree(v->table->values); efree(v->table); } efree(v); } void logprint_variogram(const VARIOGRAM *v, int verbose) { /* prints contents of VARIOGRAM v to R console */ if (v->id1 < 0 && v->id2 < 0) return; /* never set */ if (v->id1 == v->id2) Rprintf("variogram(%s):\n", name_identifier(v->id1)); else Rprintf("variogram(%s,%s):\n", name_identifier(v->id1), name_identifier(v->id2)); for (int i = 0; i < v->n_models; i++) { Rprintf("# model: %d type: %s sill: %g range: %g\n", i, v_models[v->part[i].model].name_long, v->part[i].sill, v->part[i].range[0]); if (v->part[i].tm_range != NULL) { Rprintf("# range anisotropy, rotation matrix:\n"); for (int j = 0; j < 3; j++) { for (int k = 0; k < 3; k++) Rprintf("%s%8.4f", k == 0 ? "# " : " ", v->part[i].tm_range->tm[j][k]); Rprintf("\n"); } } } Rprintf( "# sum sills %g, max %g, min %g, flat at distance %g\n", v->sum_sills, v->max_val, v->min_val, v->max_range); return; } void update_variogram(VARIOGRAM *vp) { /* * update min/max, n_fit, descr * assumes that models are not changed: they can only be changed through * read_variogram(); */ VGM_MODEL *p; vp->sum_sills = vp->min_val = vp->max_val = 0.0; vp->measurement_error = 0.0; vp->n_fit = 0; vp->max_range = DBL_MIN; for (int i = 0; i < vp->n_models; i++) { p = &(vp->part[i]); vp->sum_sills += p->sill; if (p->sill < 0.0) vp->min_val += p->sill; /* else */ /* up to gstat_1.1-1 else was there; see https://stat.ethz.ch/pipermail/r-sig-geo/2015-December/023814.html */ vp->max_val += p->sill; vp->max_range = MAX(p->range[0], vp->max_range); if (p->model == BESSEL || p->model == GAUSSIAN || p->model == EXPONENTIAL || p->model == LOGARITHMIC || p->model == POWER || p->model == PERIODIC || p->model == EXCLASS || p->model == LEGENDRE || p->model == HOLE || p->model == WAVE || /* more??? */ p->model == MATERN || p->model == STEIN || (p->model == LINEAR && p->range[0] == 0)) /* sill is reached asymptotically or oscillates */ vp->max_range = DBL_MAX; else /* transitive model: */ vp->max_range = MAX(p->range[0], vp->max_range); if ((p->model == LINEAR && p->range[0] == 0.0) || p->model == NUGGET || p->model == INTERCEPT) p->fit_range = 0; /* 1 would lead to singularity */ if (p->model == LOGARITHMIC || p->model == POWER || p->model == INTERCEPT || (p->model == LINEAR && p->range[0] == 0)) vp->is_valid_covariance = 0; if (p->fit_sill) vp->n_fit++; if (p->fit_range) vp->n_fit++; if (p->model == MERROR) vp->measurement_error += p->sill; } if (vp->table != NULL) { vp->sum_sills = vp->table->values[0]; vp->max_val = vp->table->values[0]; vp->min_val = vp->table->values[0]; for (int i = 1; i < vp->table->n; i++) { vp->max_val = MAX(vp->max_val, vp->table->values[i]); vp->min_val = MIN(vp->min_val, vp->table->values[i]); } } return; } /* double get_max_sill(int n) { int i, j; VARIOGRAM *vp; static double max_sill; vp = get_vgm(0); max_sill = vp->max_val; for (i = 0; i < n; i++) { for (j = 0; j <= i; j++) { vp = get_vgm(LTI(i,j)); max_sill = MAX(max_sill, vp->max_val); } } return max_sill; } */ double get_semivariance(const VARIOGRAM *vp, double dx, double dy, double dz) { /* returns gamma(dx,dy,dz) for variogram v: gamma(h) = cov(0) - cov(h) */ int i; double sv = 0.0, dist = 0.0; if (vp->table != NULL) return(SEM_TABLE_VALUE(vp->table, transform_norm(vp->table->tm_range, dx, dy, dz))); if (! vp->isotropic) { for (i = 0; i < vp->n_models; i++) sv += vp->part[i].sill * vp->part[i].fnct( transform_norm(vp->part[i].tm_range, dx, dy, dz), vp->part[i].range); } else { dist = transform_norm(NULL, dx, dy, dz); if (dist > vp->max_range) return vp->sum_sills; for (i = 0; i < vp->n_models; i++) sv += vp->part[i].sill * vp->part[i].fnct(dist, vp->part[i].range); } return sv; } double get_covariance(const VARIOGRAM *vp, double dx, double dy, double dz) { /* returns cov(dx,dy,dz) for variogram v */ int i; static int warning = 0; double ctmp = 0.0, dist; if (vp == NULL) { warning = 0; return 0.0; } if (! vp->is_valid_covariance && !warning) { pr_warning("non-transitive variogram model not allowed as covariance function"); warning = 1; } if (!vp->is_valid_covariance && !DEBUG_FORCE) ErrMsg(ER_IMPOSVAL, "covariance from non-transitive variogram not allowed "); if (vp->table != NULL) return(COV_TABLE_VALUE(vp->table, transform_norm(vp->table->tm_range, dx, dy, dz))); if (! vp->isotropic) { for (i = 0; i < vp->n_models; i++) ctmp += vp->part[i].sill * (1.0 - vp->part[i].fnct( transform_norm(vp->part[i].tm_range, dx, dy, dz), vp->part[i].range)); } else { dist = transform_norm(NULL, dx, dy, dz); for (i = 0; i < vp->n_models; i++) ctmp += vp->part[i].sill * (1.0 - vp->part[i].fnct(dist, vp->part[i].range)); } return ctmp; } static int is_valid_cs(const VARIOGRAM *aa, const VARIOGRAM *bb, const VARIOGRAM *ab) /* * Purpose : Check Cauchy-Schwartz inequality on cross/variograms * Created by : Edzer J. Pebesma * Date : may 6th 1992 * Prerequisites : * Returns : return nonzero if |g_ab(h)| > sqrt(g_aa(h)g_bb(h)) * Side effects : none */ { int i, check_failed = 0; double maxrange = 0, dist, dx, dy, dz; for (i = 0; i < aa->n_models; i++) if (aa->part[i].range[0] > maxrange) maxrange = aa->part[i].range[0]; for (i = 0; i < ab->n_models; i++) if (ab->part[i].range[0] > maxrange) maxrange = ab->part[i].range[0]; for (i = 0; i < bb->n_models; i++) if (bb->part[i].range[0] > maxrange) maxrange = bb->part[i].range[0]; for (i = 0; i < 101 && !check_failed; i++) { dist = (i * maxrange)/100; dx = dy = dz = 0.0; if (i % 3 == 0) dx = dist; if (i % 3 == 1) dy = dist; if (i % 3 == 2) dz = dist; if (fabs(get_semivariance(ab, dx, dy, dz)) > sqrt(get_semivariance(aa, dx, dy, dz) * get_semivariance(bb, dx, dy, dz))) { check_failed = 1; /* yes, the check failed */ pr_warning("%s %d %s %d %s %d\n%s %g %g %g\n", "Cauchy-Schwartz violation: variogram", aa->id,",",bb->id, "and cross variogram", ab->id, "first failure on dx, dy and dz:", dx, dy, dz); } } /* for */ if (check_failed) return 0; else return 1; } void check_variography(const VARIOGRAM **v, int n_vars) /* * check for intrinsic correlation, linear model of coregionalisation * or else (with warning) Cauchy Swartz */ { int i, j, k, ic = 0, lmc, posdef = 1; MAT **a = NULL; double b; char *reason = NULL; if (n_vars <= 1) return; /* * find out if lmc (linear model of coregionalization) hold: * all models must have equal base models (sequence and range) */ for (i = 1, lmc = 1; lmc && i < get_n_vgms(); i++) { if (v[0]->n_models != v[i]->n_models) { reason = "number of models differ"; lmc = 0; } for (k = 0; lmc && k < v[0]->n_models; k++) { if (v[0]->part[k].model != v[i]->part[k].model) { reason = "model types differ"; lmc = 0; } if (v[0]->part[k].range[0] != v[i]->part[k].range[0]) { reason = "ranges differ"; lmc = 0; } } for (k = 0; lmc && k < v[0]->n_models; k++) if (v[0]->part[k].tm_range != NULL) { if (v[i]->part[k].tm_range == NULL) { reason = "anisotropy for part of models"; lmc = 0; } else if ( v[0]->part[k].tm_range->ratio[0] != v[i]->part[k].tm_range->ratio[0] || v[0]->part[k].tm_range->ratio[1] != v[i]->part[k].tm_range->ratio[1] || v[0]->part[k].tm_range->angle[0] != v[i]->part[k].tm_range->angle[0] || v[0]->part[k].tm_range->angle[1] != v[i]->part[k].tm_range->angle[1] || v[0]->part[k].tm_range->angle[2] != v[i]->part[k].tm_range->angle[2] ) { reason = "anisotropy parameters are not equal"; lmc = 0; } } else if (v[i]->part[k].tm_range != NULL) { reason = "anisotropy for part of models"; lmc = 0; } } if (lmc) { /* * check for ic: */ a = (MAT **) emalloc(v[0]->n_models * sizeof(MAT *)); for (k = 0; k < v[0]->n_models; k++) a[k] = m_get(n_vars, n_vars); for (i = 0; i < n_vars; i++) { for (j = 0; j < n_vars; j++) { /* for all variogram triplets: */ for (k = 0; k < v[0]->n_models; k++) ME(a[k], i, j) = v[LTI(i,j)]->part[k].sill; } } /* for ic: a's must be scaled versions of each other: */ ic = 1; for (k = 1, ic = 1; ic && k < v[0]->n_models; k++) { b = ME(a[0], 0, 0)/ME(a[k], 0, 0); for (i = 0; ic && i < n_vars; i++) for (j = 0; ic && j < n_vars; j++) if (fabs(ME(a[0], i, j) / ME(a[k], i, j) - b) > EPSILON) ic = 0; } /* check posdef matrices */ for (i = 0, lmc = 1, posdef = 1; i < v[0]->n_models; i++) { posdef = is_posdef(a[i]); if (posdef == 0) { reason = "coefficient matrix not positive definite"; if (DEBUG_COV) { printlog("non-positive definite coefficient matrix %d:\n", i); m_logoutput(a[i]); } ic = lmc = 0; } if (! posdef) printlog( "non-positive definite coefficient matrix in structure %d", i+1); } for (k = 0; k < v[0]->n_models; k++) m_free(a[k]); efree(a); if (ic) { printlog("Intrinsic Correlation found. Good.\n"); return; } else if (lmc) { printlog("Linear Model of Coregionalization found. Good.\n"); return; } } /* * lmc does not hold: check on Cauchy Swartz */ pr_warning("No Intrinsic Correlation or Linear Model of Coregionalization found\nReason: %s", reason ? reason : "unknown"); if (gl_nocheck == 0) { pr_warning("[add `set = list(nocheck = 1)' to the gstat() or krige() to ignore the following error]\n"); ErrMsg(ER_IMPOSVAL, "variograms do not satisfy a legal model"); } printlog("Now checking for Cauchy-Schwartz inequalities:\n"); for (i = 0; i < n_vars; i++) for (j = 0; j < i; j++) if (is_valid_cs(v[LTI(i,i)], v[LTI(j,j)], v[LTI(i,j)])) { printlog("variogram(%s,%s) passed Cauchy-Schwartz\n", name_identifier(j), name_identifier(i)); } else pr_warning("Cauchy-Schwartz inequality found for variogram(%s,%s)", name_identifier(j), name_identifier(i) ); return; } static int is_posdef(MAT *A) { MAT *b = m_copy(A, MNULL); int info; CHfactor(b, PNULL, &info); m_free(b); return (info == 0); } double transform_norm(const ANIS_TM *tm, double dx, double dy, double dz) { /* returns variogram distance given dx, dy, dz and VARIOGRAM v */ double dist = 0.0, tmp; int i; if (dx == 0.0 && dy == 0.0 && dz == 0.0) return 0.0; if (tm != NULL) { for (i = 0, tmp = 0.0; i < 3; i++) { tmp = tm->tm[i][0] * dx + tm->tm[i][1] * dy + tm->tm[i][2] * dz; dist += tmp * tmp; } return sqrt(dist); } return sqrt((dx * dx) + (dy * dy) + (dz * dz)); } double da_general(VGM_MODEL *part, double h) { /* numerical approximation of derivative: */ int i; double low, high, range, r[NRANGEPARS]; for (i = 0; i < NRANGEPARS; i++) { if (is_mv_double(&(part->range[i]))) set_mv_double(&(r[i])); else r[i] = part->range[i]; } range = MAX(1e-20, part->range[0]); r[0] = range * (1.0 + DA_DELTA); low = part->fnct(h, r); r[0] = range * (1.0 - DA_DELTA); high = part->fnct(h, r); return part->sill * (low - high) / (2.0 * range * DA_DELTA); } int push_variogram_model(VARIOGRAM *v, VGM_MODEL part) { int i, max_id, where = -1; /* * add the part submodel to v (if part.id < 0) or else * modify the appropriate part of v, having the id of part.id. * do a lot of checks, and set .fn and .da_fn functions. */ if (v->n_models == v->max_n_models) { v->part = (VGM_MODEL *) erealloc(v->part, (v->max_n_models + INIT_N_VGMM) * sizeof(VGM_MODEL)); for (i = v->max_n_models; i < v->max_n_models + INIT_N_VGMM; i++) init_variogram_part(&(v->part[i])); v->max_n_models += INIT_N_VGMM; } /* * check some things: */ if (part.model == NOT_SP) ErrMsg(ER_IMPOSVAL, "model NSP not allowed in variogram structure"); if (part.range[0] < 0.0) ErrMsg(ER_RANGE, "variogram range cannot be negative"); if (part.model == LINEAR) { if (part.range[0] == 0.0) part.fit_range = 0; } else if (part.model == NUGGET || part.model == INTERCEPT || part.model == MERROR) { part.fit_range = 0; if (part.range[0] > 0.0) ErrMsg(ER_RANGE, "range must be zero"); } else if (part.range[0] == 0.0) ErrMsg(ER_RANGE, "range must be positive"); if (part.model == POWER && part.range[0] > 2.0) ErrMsg(ER_RANGE, "power model range (parameter) cannot exceed 2.0"); if (part.model == EXCLASS && part.range[1] > 2.0) ErrMsg(ER_RANGE, "exponentical class model shape parameter cannot exceed 2.0"); if (part.id < 0) { where = v->n_models; v->n_models++; for (i = max_id = 0; i < v->n_models; i++) max_id = MAX(v->part[i].id, max_id); part.id = max_id + 1; } else { /* search in list: */ for (i = 0; where < 0 && i < v->n_models; i++) if (v->part[i].id == part.id) where = i; assert(where >= 0); /* i.e., it should really be in the list */ } if (v->isotropic) v->isotropic = (part.tm_range == NULL); /* * check that the .fn and .da_fn functions in v_models * will indeed be the correct ones: */ assert(part.model == v_models[part.model].model); v->part[where] = part; v->part[where].fnct = v_models[part.model].fn; v->part[where].da_fnct = v_models[part.model].da_fn; return part.id; } VGM_MODEL_TYPE which_variogram_model(const char *m) { char s[4]; strncpy(s, m, 3); s[0] = toupper(s[0]); s[1] = tolower(s[1]); s[2] = tolower(s[2]); s[3] = '\0'; for (int i = 1; v_models[i].name != NULL; i++) if (strcmp(s, v_models[i].name) == 0) return v_models[i].model; return NOT_SP; } double relative_nugget(VARIOGRAM *v) { int i; double nug = 0.0, sill = 0.0; assert(v->n_models != 0); if (v->n_models == 1) return (v->part[0].model == NUGGET ? 1.0 : 0.0); for (i = 0; i < v->n_models; i++) { if (v->part[i].model == NUGGET) nug += v->part[i].sill; else sill += v->part[i].sill; } assert(nug + sill > 0.0); return (nug/(nug+sill)); } DO_AT_ZERO zero_int2enum(int zero) { switch(zero) { case 0: return ZERO_DEFAULT; case 1: return ZERO_INCLUDE; case 2: return ZERO_AVOID; case 3: return ZERO_SPECIAL; } ErrMsg(ER_IMPOSVAL, "invalid value for zero"); return ZERO_DEFAULT; /* never reached */ } void push_to_v(VARIOGRAM *v, const char *mod, double sill, double *range, int nrangepars, double *d, int fit_sill, int fit_range) { VGM_MODEL vm; int i; init_variogram_part(&vm); vm.model = which_variogram_model(mod); if (nrangepars > NRANGEPARS) ErrMsg(ER_IMPOSVAL, "too many range parameters"); for (i = 0; i < nrangepars; i++) vm.range[i] = range[i]; vm.sill = sill; vm.fit_sill = fit_sill; vm.fit_range = fit_range; if (d != NULL && d[0] != -9999.0) vm.tm_range = get_tm(d); if (vm.model == STEIN && range[1] > 100.0) { vm.model = GAUSSIAN; vm.range[1] = 0.0; pr_warning("kappa values over 100 overflow gammafn: taking Gaussian approximation"); } push_variogram_model(v, vm); } void push_to_v_table(VARIOGRAM *v, double maxdist, int length, double *values, double *anis) { int i; v->table = (COV_TABLE *) emalloc(sizeof(COV_TABLE)); v->table->n = length; v->table->maxdist = maxdist; v->table->values = (double *) emalloc(length * sizeof(double)); for (i = 0; i < length; i++) v->table->values[i] = values[i]; if (anis != NULL) v->table->tm_range = get_tm(anis); else v->table->tm_range = NULL; } static ANIS_TM *get_tm(double anis[5]) { /* Part of this routine was inspired by FORTRAN code in GSLIB, first edition: C%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% C % C Copyright (C) 1992 Stanford Center for Reservoir Forecasting. All % C rights reserved. Distributed with: C.V. Deutsch and A.G. Journel. % C ``GSLIB: Geostatistical Software Library and User's Guide,'' Oxford % C University Press, New York, 1992. % C % C The programs in GSLIB are distributed in the hope that they will be % C useful, but WITHOUT ANY WARRANTY. No author or distributor accepts % C responsibility to anyone for the consequences of using them or for % C whether they serve any particular purpose or work at all, unless he % C says so in writing. Everyone is granted permission to copy, modify % C and redistribute the programs in GSLIB, but only under the condition % C that this notice and the above copyright notice remain intact. % C % C%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ int i; double alpha, beta, theta, sina, sinb, sint, cosa, cosb, cost, afac1, afac2; ANIS_TM *t = NULL; /* About naming convention: gstat GSLIB =============== anis[0] ang1 (first anis. par. for 2D) anis[1] ang2 anis[2] ang3 anis[3] anis1 (second anis. par. for 2D) anis[4] anis2 */ #define ANIS_ERR(x) message("parsing anis. pars. %g,%g,%g,%g,%g -- error on %g\n", \ anis[0],anis[1],anis[2],anis[3],anis[4],x) #define DEG2RAD (PI/180.0) for (i = 0; i < 3; i++) { if (anis[i] < 0 || anis[i] >= 360) { ANIS_ERR(anis[i]); ErrMsg(ER_RANGE, "this value should be in [0..360>"); } } for (i = 3; i < 5; i++) { if (anis[i] <= 0.0 || anis[i] > 1.0) { ANIS_ERR(anis[i]); ErrMsg(ER_RANGE, "this value should be in <0..1]"); } } /* from GSLIB: */ if (anis[0] >= 0.0 && anis[0] < 270) alpha = (double) (90.0 - anis[0]) * DEG2RAD; else alpha = (double) (450.0 - anis[0]) * DEG2RAD; beta = -1.0 * (double) anis[1] * DEG2RAD; theta = (double) anis[2] * DEG2RAD; sina = sin(alpha); sinb = sin(beta); sint = sin(theta); cosa = cos(alpha); cosb = cos(beta); cost = cos(theta); afac1 = 1.0 / MAX((double) anis[3], (double) EPSILON); afac2 = 1.0 / MAX((double) anis[4], (double) EPSILON); t = emalloc(sizeof(ANIS_TM)); t->angle[0] = anis[0]; t->angle[1] = anis[1]; t->angle[2] = anis[2]; t->ratio[0] = anis[3]; t->ratio[1] = anis[4]; t->tm[0][0] = (cosb * cosa); t->tm[0][1] = (cosb * sina); t->tm[0][2] = (-sinb); t->tm[1][0] = afac1*(-cost*sina + sint*sinb*cosa); t->tm[1][1] = afac1*(cost*cosa + sint*sinb*sina); t->tm[1][2] = afac1*( sint * cosb); t->tm[2][0] = afac2*(sint*sina + cost*sinb*cosa); t->tm[2][1] = afac2*(-sint*cosa + cost*sinb*sina); t->tm[2][2] = afac2*(cost * cosb); return t; } gstat/src/nsearch.h0000644000176200001440000000137015060550314013757 0ustar liggesusers#ifndef SEARCH_H # define SEARCH_H /* avoid multiple inclusion */ void qtree_free(QTREE_NODE *node); void qtree_pop_point(DPOINT *p, DATA *d); void qtree_push_point(DATA *d, DPOINT *p); void qtree_rebuild(DATA *d); int qtree_select(DPOINT *where, DATA *d); /* 2-norm distances from point to block: */ double pb_norm_3D(const DPOINT *where, BBOX bbox); double pb_norm_2D(const DPOINT *where, BBOX bbox); double pb_norm_1D(const DPOINT *where, BBOX bbox); /* define the maximum depth of the quadtree; * Fri Jul 4 12:05:47 CEST 2003 * if this is not defined, more than gl_split points at * a single spatial location cause infinite recursion * 10 seems a reasonable value: 1/2048 of the bbox dim * */ #define MAX_RECURSION_DEPTH 11 #endif /* SEARCH_H */ gstat/src/gls.c0000644000176200001440000005136615060550314013126 0ustar liggesusers/* gls.c: module for multivariable generalized least squares prediction given a linear model Y = X Beta + e, gls() calculates from the selection d[0]->sel,...,d[n_vars-1]->sel, the multivariable BLUE estimation of x0 beta (and Cov(x0[i] Beta, x0[j] Beta)), or BLUP of Y(x0) (multivariable universal kriging) (and MSPE Y(x0)) BLP of Y(x0) (multivariable simple kriging) (and MSPE Y(x0)) (BLUE: Generalized Least Squares (GLS) best linear unbiased estimate; BLUP: GLS best linear unbiased prediction; BLP: GLS best linear prediction) UPDATE: only update y, beta (BLUP); References: a. Christensen, Ronald, 1991. Linear Models for Multivariate, Time Series, and Spatial Data. Springer Verlag, New York. (Ch. VI.2, VI.3) b. Ver Hoef, Jay M., Noel Cressie, 1993. Multivariable Spatial Prediction. Mathematical Geology, 25 (2), pp. 219--240. [[[Note: eq. (18) should have a `+' between SIGMA_0 and C'SIGMA-1 C ]]] Notation (variables and comment): v' the transpose of (matrix or vector) v C-1 the inverse of matrix v (`Cinv' in a variable name) n total number of observations in data selections (rows_C) m total number of variables [n_vars] p sum of number of X columns (for non-empty data selections) [cols of X] y data vector (y[0]',...,y[n_vars-1]')', y[i] is the i-th variable [n x 1] C (generalized) covariance matrix, C[i][j] = Cov(element(y,i),element(y,j)) (element(y,i) is the i-th element in y, not the i-th variable) [n x n] X design matrix [n x p]; beta parameter vector [p x 1]: E(y) = X beta C0 (generalized) covariance matrix with y(x0): C0[i][j] = Cov(element(y,i),y[j](x0)) [n x m] X0 the value that X would have at location "where" [p x m] (Note: Christensen's x0 is Ver Hoefs X0'; I use x0: e.g. x0'beta). */ #include /* size_t */ #include /* sqrt() */ #include "defs.h" #include "data.h" #include "utils.h" #include "select.h" #include "mtrx.h" #include "lm.h" #include "vario.h" #include "vario_io.h" #include "glvars.h" #include "userio.h" #include "debug.h" #include "gls.h" static void fill_est(DATA **d, VEC *blup, MAT *MSPE, int n_vars, double *est); static void debug_result(VEC *blup, MAT *MSPE, enum GLS_WHAT pred); static VEC *get_mu(VEC *mu, const VEC *y, DATA **d, int nvars); static MAT *get_corr_mat(MAT *C, MAT *R); #define M_DEBUG(a,b) { if (DEBUG_COV){printlog("\n# %s:\n", b); \ m_logoutput(a);}} #define V_DEBUG(a,b) {if (DEBUG_COV){printlog("\n# %s:\n", b); \ v_logoutput(a);}} #define UPDATE_BLP (pred == UPDATE && last_pred == GLS_BLP) #define UPDATE_BLUP (pred == UPDATE && last_pred == GLS_BLUP) /* static MAT *convert_vmuC(MAT *C, DATA *d); static MAT *convert_vmuC0(MAT *C0, DATA *d, double v); static MAT *convert_vmuC00(MAT *MSPE, double v); */ static void convert_C(MAT *C, VEC *mu, double (*fn)(double)); static void convert_C0(MAT *C0, VEC *mu, VEC *mu0, double (*fn)(double)); static void convert_MSPE(MAT *MSPE, VEC *mu0, double (*fn)(double)); typedef struct { MAT *C, /* (Generalized) Covariance matrix */ *X, /* design matrix, y = X beta + e */ *CinvX, /* C-1 X */ *XCinvX; /* X' C-1 X */ VEC *y, /* measurement vector */ *mu, /* mu vector, E(y) */ *mu0, /* mu at loc x0 */ *beta; /* parameter vector */ } GLM; /* structure is locally defined, will be held in void *glm in DATA */ static GLM *new_glm(void); /* * n_vars is the number of variables to be considered, * d is the data array of variables d[0],...,d[n_vars-1], * pred determines which estimate is required: BLUE, BLUP, or BLP */ void gls(DATA **d /* pointer to DATA array */, int n_vars, /* length of DATA array (to consider) */ enum GLS_WHAT pred, /* what type of prediction is requested */ DPOINT *where, /* prediction location */ double *est /* output: array that holds the predicted values and variances */) { GLM *glm = NULL; /* to be copied to/from d */ static MAT *X0 = MNULL, *C0 = MNULL, *MSPE = MNULL, *CinvC0 = MNULL, *Tmp1 = MNULL, *Tmp2 = MNULL, *Tmp3 = MNULL, *R = MNULL; static VEC *blup = VNULL, *tmpa = VNULL, *tmpb = VNULL; PERM *piv = PNULL; volatile unsigned int i, rows_C; unsigned int j, k, l = 0, row, col, start_i, start_j, start_X, global, one_nbh_empty; VARIOGRAM *v = NULL; static enum GLS_WHAT last_pred = GLS_INIT; /* the initial value */ double c_value, *X_ori; int info; if (d == NULL) { /* clean up */ if (X0 != MNULL) M_FREE(X0); if (C0 != MNULL) M_FREE(C0); if (MSPE != MNULL) M_FREE(MSPE); if (CinvC0 != MNULL) M_FREE(CinvC0); if (Tmp1 != MNULL) M_FREE(Tmp1); if (Tmp2 != MNULL) M_FREE(Tmp2); if (Tmp3 != MNULL) M_FREE(Tmp3); if (R != MNULL) M_FREE(R); if (blup != VNULL) V_FREE(blup); if (tmpa != VNULL) V_FREE(tmpa); if (tmpb != VNULL) V_FREE(tmpb); last_pred = GLS_INIT; return; } if (DEBUG_COV) { printlog("we're at %s X: %g Y: %g Z: %g\n", IS_BLOCK(where) ? "block" : "point", where->x, where->y, where->z); } if (pred != UPDATE) /* it right away: */ last_pred = pred; assert(last_pred != GLS_INIT); if (d[0]->glm == NULL) { /* allocate and initialize: */ glm = new_glm(); d[0]->glm = (void *) glm; } else glm = (GLM *) d[0]->glm; glm->mu0 = v_resize(glm->mu0, n_vars); MSPE = m_resize(MSPE, n_vars, n_vars); if (pred == GLS_BLP || UPDATE_BLP) { X_ori = where->X; for (i = 0; i < n_vars; i++) { /* mu(0) */ glm->mu0->ve[i] = calc_mu(d[i], where); blup = v_copy(glm->mu0, v_resize(blup, glm->mu0->dim)); where->X += d[i]->n_X; /* shift to next x0 entry */ } where->X = X_ori; /* ... and set back */ for (i = 0; i < n_vars; i++) { /* Cij(0,0): */ for (j = 0; j <= i; j++) { v = get_vgm(LTI(d[i]->id,d[j]->id)); ME(MSPE, i, j) = ME(MSPE, j, i) = COVARIANCE0(v, where, where, d[j]->pp_norm2); } } fill_est(NULL, blup, MSPE, n_vars, est); /* in case of empty neighbourhood */ } /* logprint_variogram(v, 1); */ /* * selection dependent problem dimensions: */ for (i = rows_C = 0, one_nbh_empty = 0; i < n_vars; i++) { rows_C += d[i]->n_sel; if (d[i]->n_sel == 0) one_nbh_empty = 1; } if (rows_C == 0 /* all selection lists empty */ || one_nbh_empty == 1) { /* one selection list empty */ if (pred == GLS_BLP || UPDATE_BLP) debug_result(blup, MSPE, pred); return; } for (i = 0, global = 1; i < n_vars && global; i++) global = (d[i]->sel == d[i]->list && d[i]->n_list == d[i]->n_original && d[i]->n_list == d[i]->n_sel); /* * global things: enter whenever (a) first time, (b) local selections or * (c) the size of the problem grew since the last call (e.g. simulation) */ if (glm->C == NULL || !global || rows_C > glm->C->m) { /* * fill y: */ glm->y = get_y(d, glm->y, n_vars); if (pred != UPDATE) { glm->C = m_resize(glm->C, rows_C, rows_C); if (gl_choleski == 0) /* use LDL' decomposition, allocate piv: */ piv = px_resize(piv, rows_C); m_zero(glm->C); glm->X = get_X(d, glm->X, n_vars); M_DEBUG(glm->X, "X"); glm->CinvX = m_resize(glm->CinvX, rows_C, glm->X->n); glm->XCinvX = m_resize(glm->XCinvX, glm->X->n, glm->X->n); glm->beta = v_resize(glm->beta, glm->X->n); for (i = start_X = start_i = 0; i < n_vars; i++) { /* row var */ /* fill C, mu: */ for (j = start_j = 0; j <= i; j++) { /* col var */ v = get_vgm(LTI(d[i]->id,d[j]->id)); for (k = 0; k < d[i]->n_sel; k++) { /* rows */ row = start_i + k; for (l = 0, col = start_j; col <= row && l < d[j]->n_sel; l++, col++) { if (pred == GLS_BLUP) c_value = GCV(v, d[i]->sel[k], d[j]->sel[l]); else c_value = COVARIANCE(v, d[i]->sel[k], d[j]->sel[l]); /* on the diagonal, if necessary, add measurement error variance */ if (d[i]->colnvariance && i == j && k == l) c_value += d[i]->sel[k]->variance; ME(glm->C, col, row) = c_value; /* fill upper */ if (col != row) ME(glm->C, row, col) = c_value; /* fill all */ } /* for l */ } /* for k */ start_j += d[j]->n_sel; } /* for j */ start_i += d[i]->n_sel; if (d[i]->n_sel > 0) start_X += d[i]->n_X - d[i]->n_merge; } /* for i */ /* if (d[0]->colnvmu) glm->C = convert_vmuC(glm->C, d[0]); */ if (d[0]->variance_fn) { glm->mu = get_mu(glm->mu, glm->y, d, n_vars); convert_C(glm->C, glm->mu, d[0]->variance_fn); } if (DEBUG_COV && pred == GLS_BLUP) printlog("[using generalized covariances: max_val - semivariance()]"); M_DEBUG(glm->C, "Covariances (x_i, x_j) matrix C (upper triangle)"); /* * factorize C: */ CHfactor(glm->C, piv, &info); if (info != 0) { /* singular: */ pr_warning("Covariance matrix singular at location [%g,%g,%g]: skipping...", where->x, where->y, where->z); m_free(glm->C); glm->C = MNULL; /* assure re-entrance if global */ P_FREE(piv); set_mv_double(&est[0]); return; } if (piv == NULL) M_DEBUG(glm->C, "glm->C, Choleski decomposed:") else M_DEBUG(glm->C, "glm->C, LDL' decomposed:") } /* if (pred != UPDATE) */ if (pred != GLS_BLP && !UPDATE_BLP) { /* C-1 X and X'C-1 X, beta */ /* * calculate CinvX: */ glm->CinvX = CHsolve(glm->C, glm->X, glm->CinvX, piv); /* M_DEBUG(glm->CinvX, "C-1 X"); */ /* * calculate X'C-1 X: */ glm->XCinvX = mtrm_mlt(glm->X, glm->CinvX, glm->XCinvX); /* X'C-1 X */ M_DEBUG(glm->XCinvX, "X'C-1 X"); m_inverse(glm->XCinvX, &info); if (info != 0) { /* singular: */ pr_warning("X'C-1 X matrix singular at location [%g,%g,%g]: skipping...", where->x, where->y, where->z); m_free(glm->C); glm->C = MNULL; /* assure re-entrance if global */ P_FREE(piv); set_mv_double(&est[0]); return; } /* * calculate beta: */ tmpa = v_resize(tmpa, rows_C); tmpa = vm_mlt(glm->CinvX, glm->y, tmpa); /* X'C-1 y */ glm->beta = vm_mlt(glm->XCinvX, tmpa, glm->beta); /* (X'C-1 X)-1 X'C-1 y */ V_DEBUG(glm->beta, "beta"); M_DEBUG(glm->XCinvX, "Cov(beta), (X'C-1 X)-1"); M_DEBUG(R = get_corr_mat(glm->XCinvX, R), "Corr(beta)"); } /* if pred != GLS_BLP */ } /* if redo the heavy part */ if (pred != GLS_BLP && !UPDATE_BLP) { /* but BLUE or BLUP */ X0 = get_X0(d, X0, where, n_vars); M_DEBUG(X0, "X0 (X values at prediction location x0)"); blup = vm_mlt(X0, glm->beta, blup); /* X0' beta = beta'X0 -> vm_ */ if (pred == GLS_BLUP) V_DEBUG(blup, "BLUE(mu), E(y(x0)) = X0'beta"); } if (pred == GLS_BLUE) { /* we did the blue, it's in blup */ /* * BLUE = X0 beta; Cov(X0 beta)= X0'(X'C-1X)-1 X0 */ Tmp1 = mtrm_mlt(X0, glm->XCinvX, Tmp1); m_mlt(Tmp1, X0, MSPE); /* X0'(X'C-1X)-1 X0 */ fill_est(d, blup, MSPE, n_vars, est); debug_result(blup, MSPE, pred); P_FREE(piv); return; /* Quit function */ } /* * now the part that's got to be done every time, for x0 and where change: * resize matrices (BLP, BLUP): */ C0 = m_resize(C0, rows_C, n_vars); CinvC0 = m_resize(CinvC0, rows_C, n_vars); /* * fill C0: */ for (i = 0; i < n_vars; i++) { /* cols */ for (j = 0, start_j = 0; j < n_vars; j++) { /* rows */ v = get_vgm(LTI(d[i]->id, d[j]->id)); for (k = 0; k < d[j]->n_sel; k++) { if (pred == GLS_BLUP) ME(C0, start_j+k, i) = GCV0(v, d[j]->sel[k], where, d[j]->pp_norm2); else ME(C0, start_j+k, i) = COVARIANCE0(v, d[j]->sel[k], where, d[j]->pp_norm2); } start_j += d[j]->n_sel; } } /* if (d[0]->colnvmu) { X0 = get_X0(d, X0, where, n_vars); C0 = convert_vmuC0(C0, d[0], X0->me[0][0]); } */ if (d[0]->variance_fn) convert_C0(C0, glm->mu, glm->mu0, d[0]->variance_fn); M_DEBUG(C0, "Covariances (x_i, x_0), C0"); /* https://github.com/r-spatial/gstat/issues/80 : */ if (glm->C == NULL) { /* ErrMsg(ER_IMPOSVAL, "covariance matrix NULL;\nsee: https://github.com/r-spatial/gstat/issues/80"); */ pr_warning("C or X'C-1 X matrix singular at location [%g,%g,%g]: skipping...", where->x, where->y, where->z); set_mv_double(&est[0]); return; /* xxx: return NA's? */ } /* * calculate CinvC0: */ CinvC0 = CHsolve(glm->C, C0, CinvC0, piv); M_DEBUG(CinvC0, "C-1 C0"); if (pred == GLS_BLP || UPDATE_BLP) { /* * BLP = mu_0 + C0'C-1 (y-mu_i) */ V_DEBUG(glm->y, "data values y"); if (DEBUG_COV) { printlog("beta is:\n"); for (i = 0; i < n_vars; i++) for (j = 0; j < d[i]->beta->size; j++) printlog("%g%s", d[i]->beta->val[j], j == d[i]->beta->size - 1 ? "\n" : " "); } glm->mu = get_mu(glm->mu, glm->y, d, n_vars); V_DEBUG(glm->mu, "mean values (mu_i)"); /* y - mu_i: */ tmpa = v_resize(tmpa, rows_C); v_sub(glm->y, glm->mu, tmpa); V_DEBUG(tmpa, "Residual vector (y - mu_i)"); tmpb = vm_mlt(CinvC0, tmpa, tmpb); /* C0'C-1 (y-mu_i) */ V_DEBUG(tmpb, "Weighted res. vector, C0'C-1 (y-mu_i)"); v_add(blup, tmpb, blup); /* mu_0 + C0'C-1 (y-mu_i) */ /* * MSPE = C(0,0) - C0'C-1 C0 */ Tmp2 = mtrm_mlt(CinvC0, C0, Tmp2); /* C0'C-1 C0 */ /* if (d[0]->colnvmu) MSPE = convert_vmuC00(MSPE, X0->me[0][0]); */ if (d[0]->variance_fn) convert_MSPE(MSPE, glm->mu0, d[0]->variance_fn); m_sub(MSPE, Tmp2, MSPE); /* C(0,0) - C0'C-1 C0 */ fill_est(d, blup, MSPE, n_vars, est); debug_result(blup, MSPE, pred); P_FREE(piv); return; /* Quit function */ } /* * GLS_BLUP, universal kriging estimate remains: */ tmpa = mv_mlt(glm->X, glm->beta, tmpa); /* X beta */ tmpb = v_sub(glm->y, tmpa, tmpb); /* y - X beta */ tmpa = vm_mlt(CinvC0, tmpb, tmpa); /* c0'C-1 (Y - X beta) */ blup = v_add(blup, tmpa, blup); /* x0 beta + c0'C-1 (Y - X beta) */ /* * universal kriging MSPE: * (a) Cov_ij(0,0): */ for (i = 0; i < n_vars; i++) { for (j = 0; j <= i; j++) { v = get_vgm(LTI(d[i]->id, d[j]->id)); ME(MSPE, i, j) = ME(MSPE, j, i) = GCV0(v, where, where, d[j]->pp_norm2); } } M_DEBUG(MSPE, "[a] Cov_ij(B,B) or Cov_ij(0,0)"); /* * (c) (x0-X'C-1 c0)'(X'C-1X)-1 (x0-X'C-1 c0): */ Tmp1 = mtrm_mlt(glm->CinvX, C0, Tmp1); /* X'C-1 c0 */ Tmp1 = m_sub(X0, Tmp1, Tmp1); /* (x0 - X'C-1 c0) */ Tmp2 = m_copy(Tmp1, m_resize(Tmp2, Tmp1->m, Tmp1->n)); Tmp3 = m_mlt(glm->XCinvX, Tmp1, Tmp3); /* (X'C-1 X)-1 (x0 - X'C-1 c0) */ Tmp1 = mtrm_mlt(Tmp2, Tmp3, Tmp1); M_DEBUG(Tmp1, "[c] (x0-X'C-1 c0)'(X'C-1 X)-1(x0-X'C-1 c0)"); /* * (b) c0'C-1 c0: */ Tmp2 = mtrm_mlt(C0, CinvC0, Tmp2); M_DEBUG(Tmp2, "[b] c0'C-1 c0"); /* * (a - b + c) = * Cov_ij(0,0) - c0'C-1 c0 + (x0-X'C-1 c0)'(X'C-1 X)-1 (x0-X'C-1 c0): */ m_sub(MSPE, Tmp2, MSPE); /* a-b */ m_add(MSPE, Tmp1, MSPE); /* +c */ /* * done: */ fill_est(d, blup, MSPE, n_vars, est); debug_result(blup, MSPE, pred); if (DEBUG_COV) { /* calculate kriging weights explicitly: */ /* Tmp3' * glm->CinvX' + CinvC0 */ Tmp1 = m_mlt(glm->CinvX, Tmp3, Tmp1); Tmp2 = m_add(Tmp1, CinvC0, Tmp2); M_DEBUG(Tmp2, "kriging weights"); if (DEBUG_COV) printlog("\n\n"); } P_FREE(piv); return; } static void fill_est(DATA **d, VEC *blup, MAT *MSPE, int n_vars, double *est) { int i, j, n_filled; static IVEC *v = IVNULL; if (n_vars == 1) { est[0] = blup->ve[0]; est[1] = ME(MSPE, 0, 0); return; } v = iv_resize(v, n_vars); if (d == NULL) { /* GLS_BLP, initializing */ for (i = 0; i < n_vars; i++) v->ive[i] = i; n_filled = n_vars; } else { /* n_vars > 1: avoid possibly empty variables -> NA */ for (i = j = 0; i < n_vars; i++) { if (d[i]->n_sel > 0) { v->ive[j] = i; j++; } } n_filled = j; } for (i = 0; i < n_filled; i++) { /* only adress non-empty variables */ est[2 * v->ive[i]] = blup->ve[v->ive[i]]; est[2 * v->ive[i] + 1] = ME(MSPE, v->ive[i], v->ive[i]); for (j = 0; j < i; j++) est[2 * n_vars + LTI2(v->ive[i], v->ive[j])] = ME(MSPE, v->ive[i], v->ive[j]); } return; } static void debug_result(VEC *blup, MAT *MSPE, enum GLS_WHAT pred) { if (! DEBUG_COV) return; switch (pred) { case GLS_BLP: V_DEBUG(blup, "Best Linear Predictor"); M_DEBUG(MSPE, "Prediction Covariances"); break; case GLS_BLUE: V_DEBUG(blup, "Best Linear Unbiased Estimate (X0'beta)"); M_DEBUG(MSPE, "Estimation Covariances, Cov(X0'beta)"); break; case GLS_BLUP: V_DEBUG(blup, "Best Linear Unbiased Predictor"); M_DEBUG(MSPE, "MSPE ([a]-[b]+[c])"); break; case UPDATE: V_DEBUG(blup, "Updated predictor"); M_DEBUG(MSPE, "MSPE (updated)"); break; case GLS_INIT: ErrMsg(ER_IMPOSVAL, "invalid value for pred"); break; } } double *make_gls(DATA *d, int calc_residuals) { /* * if calc_residuals == 0, return value is allocated, but not freed */ int i, j, size; double *est = NULL; DATA **data; GLM *glm; glm = (GLM *) d->glm; if (glm == NULL) { data = get_gstat_data(); glm = (GLM *) data[0]->glm; } if (glm && glm->C) { /* renew: variogram may have changed */ m_free((MAT *) glm->C); glm->C = MNULL; } select_at(d, NULL); /* where == NULL --> global selection */ if (calc_residuals) { est = (double *) emalloc(get_n_outputs() * sizeof(double)); for (i = 0; i < d->n_list; i++) { gls(&d, 1, GLS_BLUE, d->list[i], est); glm = (GLM *) d->glm; d->list[i]->attr = glm->y->ve[i] - est[0]; } efree(est); est = NULL; } else { /* no residuals -- return beta & Cov(beta) */ size = d->n_X * (1 + d->n_X); est = (double *) emalloc(size * sizeof(double)); /* fill the GLM stuff: */ gls(&d, 1, GLS_BLUE, d->list[0], est); glm = (GLM *) d->glm; for (i = 0; i < glm->beta->dim; i++) { est[2 * i] = glm->beta->ve[i]; est[2 * i + 1] = ME(glm->XCinvX, i, i); for (j = 0; j < i; j++) est[2 * glm->beta->dim + LTI2(i,j)] = ME(glm->XCinvX, i, j); } } gls(NULL, 0, GLS_INIT, NULL, NULL); return est; /* possibly NULL */ } double *make_gls_mv(DATA **d, int n_vars) { /* * allocates memory for est (return value) but does not free it */ int i, j, sum_X, index, size = 0; double *est = NULL; GLM *glm; DPOINT where; for (i = sum_X = 0; i < n_vars; i++) { select_at(d[i], NULL); /* where == NULL --> global selection */ sum_X += d[i]->n_X; } where = *d[0]->list[0]; where.X = (double *) emalloc(sum_X * sizeof(double)); /* replace */ for (i = 0; i < sum_X; i++) /* fill with nonsense values: */ where.X[i] = 0.0; size = sum_X + (sum_X * (sum_X + 1))/2; est = (double *) emalloc(size * sizeof(double)); /* fill the GLM stuff: */ gls(d, n_vars, GLS_BLUE, &where, est); glm = (GLM *) d[0]->glm; assert(glm != NULL); for (i = 0; i < glm->beta->dim; i++) { assert((2 * i + 1) < size); est[2 * i] = glm->beta->ve[i]; est[2 * i + 1] = ME(glm->XCinvX, i, i); for (j = 0; j < i; j++) { index = 2 * glm->beta->dim + LTI2(i,j); assert(index < size); est[index] = ME(glm->XCinvX, i, j); } } gls(NULL, 0, GLS_INIT, NULL, NULL); efree(where.X); return est; } static GLM *new_glm(void) { GLM *glm; glm = (GLM *) emalloc(sizeof(GLM)); glm->X = glm->C = glm->CinvX = glm->XCinvX = MNULL; glm->y = glm->mu = glm->mu0 = glm->beta = VNULL; return glm; } void free_glm(void *v_glm) { GLM *glm; if (v_glm == NULL) return; glm = (GLM *) v_glm; if (glm->X) m_free(glm->X); if (glm->C) m_free(glm->C); if (glm->CinvX) m_free(glm->CinvX); if (glm->XCinvX) m_free(glm->XCinvX); if (glm->y) v_free(glm->y); if (glm->beta) v_free(glm->beta); if (glm->mu0) v_free(glm->mu0); if (glm->mu) v_free(glm->mu); efree(glm); } static void convert_C(MAT *C, VEC *mu, double (*fn)(double)) { int i, j; double sqrtfni; assert(C && mu); assert(C->m == mu->dim); for (i = 0; i < mu->dim; i++) { /* assert(mu->ve[i] >= 0.0); */ /* be more friendly: */ if (mu->ve[i] < 0.0) ErrMsg(ER_IMPOSVAL, "can not take square root of negative mean values!"); ME(C, i, i) *= fn(mu->ve[i]); sqrtfni = sqrt(fn(mu->ve[i])); for (j = 0; j < i; j++) ME(C, i, j) *= sqrtfni * sqrt(fn(mu->ve[j])); } } static void convert_C0(MAT *C0, VEC *mu, VEC *mu0, double (*fn)(double)) { int i, j; double sqrtfni; assert(C0 && mu && mu0); assert(C0->m == mu->dim); assert(C0->n == mu0->dim); for (i = 0; i < mu->dim; i++) { assert(mu->ve[i] >= 0.0); sqrtfni = sqrt(fn(mu->ve[i])); for (j = 0; j < mu0->dim; j++) ME(C0, i, j) *= sqrtfni * sqrt(fn(mu0->ve[j])); } } static void convert_MSPE(MAT *MSPE, VEC *mu0, double (*fn)(double)) { int i, j; double sqrtfni; assert(MSPE && mu0); assert(MSPE->m == mu0->dim); for (i = 0; i < mu0->dim; i++) { assert(mu0->ve[i] >= 0.0); ME(MSPE, i, i) *= fn(mu0->ve[i]); sqrtfni = sqrt(fn(mu0->ve[i])); for (j = 0; j < i; j++) { ME(MSPE, i, j) *= sqrtfni * sqrt(fn(mu0->ve[j])); ME(MSPE, j, i) = ME(MSPE, i, j); } } } static VEC *get_mu(VEC *mu, const VEC *y, DATA **d, int n_vars) { int i, start_j, j; mu = v_resize(mu, y->dim); for (i = start_j = 0; i < n_vars; i++) { for (j = 0; j < d[i]->n_sel; j++) mu->ve[start_j + j] = calc_mu(d[i], d[i]->sel[j]); start_j += d[i]->n_sel; } return mu; } static MAT *get_corr_mat(MAT *C, MAT *R) { int i, j; assert(C); assert(C->m == C->n); R = m_copy(C, m_resize(R, C->m, C->n)); for (i = R->m - 1; i >= 0; i--) { assert(ME(R, i, i) > 0.0); for (j = 0; j < i; j++) ME(R, i, j) /= sqrt(ME(R, i, i) * ME(R, j, j)); for (j = i + 1; j < R->m; j++) ME(R, i, j) = ME(R, j, i); } for (i = 0; i < R->m; i++) ME(R, i, i) = 1.0; return(R); } gstat/src/init.c0000644000176200001440000000435015060550314013273 0ustar liggesusers#include #include #include // for NULL #include extern SEXP gstat_init(SEXP s_debug_level); extern SEXP gstat_load_ev(SEXP np, SEXP dist, SEXP gamma); extern SEXP gstat_fit_variogram(SEXP fit, SEXP fit_sill, SEXP fit_range); extern SEXP gstat_exit(SEXP x); extern SEXP gstat_new_data(SEXP sy, SEXP slocs, SEXP sX, SEXP has_intercept, SEXP beta, SEXP nmax, SEXP nmin, SEXP maxdist, SEXP force, SEXP vfn, SEXP sw, SEXP grid, SEXP degree, SEXP is_projected, SEXP vdist, SEXP lambda, SEXP omax); extern SEXP gstat_new_dummy_data(SEXP loc_dim, SEXP has_intercept, SEXP beta, SEXP nmax, SEXP nmin, SEXP maxdist, SEXP vfn, SEXP is_projected, SEXP vdist); extern SEXP gstat_debug_level(SEXP level); extern SEXP gstat_load_variogram(SEXP s_ids, SEXP s_model, SEXP s_sills, SEXP s_ranges, SEXP s_kappas, SEXP s_anis_all, SEXP s_table, SEXP s_max_val); extern SEXP gstat_predict(SEXP sn, SEXP slocs, SEXP sX, SEXP block_cols, SEXP block, SEXP weights, SEXP nsim, SEXP blue); extern SEXP gstat_set_method(SEXP to); extern SEXP gstat_set_set(SEXP arg, SEXP val); extern SEXP gstat_set_merge(SEXP a, SEXP b, SEXP c, SEXP d); extern SEXP gstat_variogram(SEXP s_ids, SEXP cutoff, SEXP width, SEXP direction, SEXP cressie, SEXP dX, SEXP boundaries, SEXP grid, SEXP cov, SEXP pseudo); extern SEXP gstat_variogram_values(SEXP ids, SEXP pars, SEXP covariance, SEXP dist_values); extern SEXP gstat_get_variogram_models(SEXP dolong); #define CALLDEF(name, n) {#name, (DL_FUNC) &name, n} const static R_CallMethodDef R_CallDef[] = { CALLDEF(gstat_init, 1), CALLDEF(gstat_load_ev, 3), CALLDEF(gstat_fit_variogram, 3), CALLDEF(gstat_exit, 1), CALLDEF(gstat_new_data, 17), CALLDEF(gstat_new_dummy_data, 9), CALLDEF(gstat_debug_level, 1), CALLDEF(gstat_load_variogram, 8), CALLDEF(gstat_predict, 8), CALLDEF(gstat_set_method, 1), CALLDEF(gstat_set_set, 2), CALLDEF(gstat_set_merge, 4), CALLDEF(gstat_variogram, 10), CALLDEF(gstat_variogram_values, 4), CALLDEF(gstat_get_variogram_models, 1), {NULL, NULL, 0} }; void // attribute_visible // optional R_init_gstat(DllInfo *dll) { R_registerRoutines(dll, NULL, R_CallDef, NULL, NULL); R_useDynamicSymbols(dll, FALSE); R_forceSymbols(dll, TRUE); } gstat/src/lm.c0000644000176200001440000003175315060550314012747 0ustar liggesusers/* * lm.c: contains routines for linear model y=Xb+e, e independent. */ #include #include /* size_t for DJGPP */ #include /* DBL_MAX */ #include /* sqrt() */ #include "mtrx.h" #include "defs.h" #include "userio.h" #include "data.h" #include "utils.h" #include "debug.h" #include "select.h" #include "glvars.h" #include "lm.h" static void predict_lm(LM *lms, MAT *X0, double *est); static void create_lm(DATA **d, int nvars); static VEC *get_weights(DATA **d, VEC *weights, int nvars); static int get_colX_nr(DATA **d, int var, int x); static int zero_weights_count(LM *lm); void pred_lm(DATA **data, int n_vars, DPOINT *where, double *est) { int i = 0, global = 1; LM *lm; static MAT *X0 = MNULL; global = 1; while (global && i < n_vars) { if (data[i]->sel != data[i]->list) /* local selection */ global = 0; /* and jump out of this loop */ i++; } if (data[0]->lm == NULL || !global) { create_lm(data, n_vars); if (DEBUG_FIT) { printlog("at location [%g,%g,%g]:\n", where->x, where->y, where->z); logprint_lm(data[0], data[0]->lm); } } lm = (LM *) data[0]->lm; if (lm == NULL || lm->y->dim == 0 || lm->is_singular) { for (i = 0; i < n_vars; i++) { set_mv_double(&(est[2 * i])); set_mv_double(&(est[2 * i + 1])); } if (lm && lm->is_singular) pr_warning("singular X matrix at x[%g], y[%g], z[%g]:", where->x, where->y, where->z); } else { X0 = get_X0(data, X0, where, n_vars); if (DEBUG_COV) { printlog("#X0 is "); m_logoutput(X0); } predict_lm(lm, X0, est); } return; } double *make_ols(DATA *d) { /* return value is allocated, but not freed */ int i, j, size; double *est = NULL; DATA **data; LM *lm; lm = (LM *) d->lm; if (lm == NULL) { data = get_gstat_data(); lm = (LM *) data[0]->lm; } select_at(d, NULL); /* where == NULL --> global selection */ /* return beta & Cov(beta) */ size = d->n_X * (1 + d->n_X); est = (double *) emalloc(size * sizeof(double)); for (i = 0; i < size; i++) set_mv_double(&(est[i])); /* fill the LM stuff: */ create_lm(&d, 1); if (DEBUG_FIT) logprint_lm(d, d->lm); lm = (LM *) d->lm; if (lm->is_singular) return est; /* all NA's */ for (i = 0; i < lm->beta->dim; i++) { est[2 * i] = lm->beta->ve[i]; est[2 * i + 1] = ME(lm->Cov, i, i); for (j = 0; j < i; j++) est[2 * lm->beta->dim + LTI2(i,j)] = ME(lm->Cov, i, j); } free_lm(d->lm); d->lm = NULL; return est; } LM *init_lm(LM *lm) { if (lm == NULL) lm = (LM *) emalloc(sizeof(LM)); lm->y = VNULL; lm->weights = VNULL; lm->beta = VNULL; lm->Xty = VNULL; lm->X = MNULL; lm->Cov = MNULL; lm->Chol = MNULL; lm->SSReg = lm->MSReg = DBL_MAX; lm->SSErr = lm->MSErr = DBL_MAX; lm->is_singular = 0; return lm; } void free_lm(LM *lm) { if (lm->y) v_free(lm->y); if (lm->weights) v_free(lm->weights); if (lm->beta) v_free(lm->beta); if (lm->Xty) v_free(lm->Xty); if (lm->X) m_free(lm->X); if (lm->Chol) m_free(lm->Chol); if (lm->Cov) m_free(lm->Cov); efree(lm); } static void create_lm(DATA **data, int nvars) { /* * obtain base necessities (y, X, weights), and calculate the rest */ LM *lm; int i; lm = (LM *) data[0]->lm; if (lm == NULL) /* create */ data[0]->lm = lm = init_lm(NULL); lm->X = get_X(data, lm->X, nvars); lm->y = get_y(data, lm->y, nvars); lm->weights = get_weights(data, lm->weights, nvars); /* * check for intercept: */ if (nvars == 1) { lm->has_intercept = (data[0]->colX[0] == 0); for (i = 1; i < data[0]->n_X && ! lm->has_intercept; i++) lm->has_intercept = (data[0]->colX[i] == 0); } /* * calculate: */ data[0]->lm = (void *) calc_lm(lm); return; } void make_residuals_lm(DATA *d) { /* * make (local or global) residuals */ int i; double est[2]; static MAT *X0 = MNULL; if (d->is_residual) return; if (d->beta) { /* pr_warning("calculating residuals with respect to pre-defined mean"); */ for (i = 0; i < d->n_list; i++) d->list[i]->attr -= calc_mu(d, d->list[i]); } else { select_at(d, NULL); create_lm(&d, 1); if (DEBUG_FIT) logprint_lm(d, d->lm); for (i = 0; i < d->n_list; i++) { X0 = get_X0(&d, X0, d->list[i], 1); predict_lm((LM *) d->lm, X0, est); d->list[i]->attr -= est[0]; /* y = Xb + e, so e^ = y - Xb^ */ } } d->is_residual = 1; return; } static void predict_lm(LM *lm, MAT *X0, double *est) { /* * make a prediction for x0, store pred. and variance in est[0] and est[1] */ VEC *blup = VNULL; MAT *tmp = MNULL, *ans = MNULL; if (lm->beta == NULL) ErrMsg(ER_IMPOSVAL, "lm->beta NULL: sample too small?"); blup = vm_mlt(X0, lm->beta, blup); /* X0' beta = beta'X0 -> vm_ */ /* * Cov(y0^ - y0) = x0'X'X-1 x0 MSErr, or x0'(X'WX)-1 x0 MSErr * for this, solve X'X b = x0 for b, then b = X'X-1 x0; ans = x0'b * MSErr added when prediction is pointwise */ tmp = CHsolve(lm->Chol, X0, tmp, PNULL); ans = mtrm_mlt(X0, tmp, ans); ans = sm_mlt(lm->MSErr, ans, ans); for (int i = 0; i < ans->m; i++) { est[2 * i] = blup->ve[i]; est[2 * i + 1] = ME(ans, i, i); if (max_block_dimension(1) == 0.0) /* pointwise prediction */ est[2 * i + 1] += lm->MSErr; for (int j = 0; j < i; j++) est[2 * ans->m + LTI2(i,j)] = ME(ans, i, j); } v_free(blup); m_free(tmp); m_free(ans); return; } MAT *get_X(DATA **d, MAT *X, int nvars) { int i, j, k, rows, cols, colX; for (i = rows = cols = 0; i < nvars; i++) { rows += d[i]->n_sel; if (d[i]->n_sel > 0) cols += d[i]->n_X - d[i]->n_merge; } /* if (rows <= 0 || cols <= 0) ErrMsg(ER_IMPOSVAL, "get_X: size <= 0"); */ X = m_resize(X, rows, cols); m_zero(X); for (i = rows = 0; i < nvars; i++) { /* i: var block index */ for (j = 0; d[i]->n_sel && j < d[i]->n_X; j++) { /* j: column index */ colX = get_colX_nr(d, i, j); for (k = 0; k < d[i]->n_sel; k++) /* k: row index */ ME(X, rows + k, colX) = d[i]->sel[k]->X[j]; } rows += d[i]->n_sel; } return X; } MAT *get_X0(DATA **d, MAT *X0, DPOINT *where, int nvars) { int i, j, start_i, cols, colX; for (i = cols = 0; i < nvars; i++) { if (d[i]->n_sel > 0) cols += d[i]->n_X - d[i]->n_merge; } X0 = m_resize(X0, cols, nvars); m_zero(X0); /* initialize; now fill non-zero entries: */ for (i = start_i = 0; i < nvars; i++) { for (j = 0; d[i]->n_sel && j < d[i]->n_X; j++) { /* for X-column k+.. */ colX = get_colX_nr(d, i, j); ME(X0, colX, i) = where->X[start_i+j]; /* colX is row index: X0' */ } start_i += d[i]->n_X; } return X0; } VEC *get_y(DATA **d, VEC *y, int nvars) { int i, j, offset, size; for (i = size = 0; i < nvars; i++) size += d[i]->n_sel; /* if (size <= 0) ErrMsg(ER_IMPOSVAL, "get_X: size <= 0"); */ y = v_resize(y, size); for (j = offset = 0; j < nvars; j++) { for (i = 0; i < d[j]->n_sel; i++) y->ve[offset + i] = d[j]->sel[i]->attr; offset += d[j]->n_sel; } return y; } static int get_colX_nr(DATA **d, int var, int this_x) { int offset_x = 0, colX, i, j; for (i = 0; i < var; i++) if (d[i]->n_sel) offset_x += d[i]->n_X - d[i]->n_merge; if (d[var]->n_merge == 0) return offset_x + this_x; for (i = 0; i < d[var]->n_merge; i++) { if (d[var]->mtbl[i].col_this_X == this_x) { /* hit: merge this one! */ colX = d[var]->mtbl[i].col_other_X; if (d[var]->mtbl[i].to_var > 0) for (j = 0; j < d[var]->mtbl[i].to_var - 1; j++) colX += d[j]->n_X - d[j]->n_merge; return colX; } } /* so, we're at least at offset_x, but how much should we add? */ colX = offset_x + this_x; /* i.e. the maximum... */ for (i = 0; i < d[var]->n_merge; i++) for (j = 0; j < this_x; j++) if (d[var]->mtbl[i].col_this_X == j) colX--; /* ...minus all previously merged entries */ return colX; } static VEC *get_weights(DATA **d, VEC *weights, int nvars) { int i, j, size; for (i = size = 0; i < nvars; i++) { if (d[i]->colnvariance <= 0) /* no weights */ return VNULL; if (d[i]->n_sel > 0) size += d[i]->n_sel; } if (size <= 0) return VNULL; weights = v_resize(weights, size); for (i = size = 0; i < nvars; i++) { for (j = 0; j < d[i]->n_sel; j++) weights->ve[size + j] = 1.0 / d[i]->sel[j]->variance; /* ->variance > 0 is assured in data.c */ size += d[i]->n_sel; } return weights; } void logprint_lm(DATA *d, LM *lm) { double SSTot; char line[] = "-----------------------------------------------------------"; int i, coords = 0; if (lm->dfReg <= 0) return; SSTot = lm->SSReg + lm->SSErr; if (d != NULL) { printlog("\nmodel: %s = ", d->variable); for (i = 0; i < d->n_X; i++) { if (i > 0) { printlog(" + "); if ((i + 2) % 5 == 0) printlog("\n"); } printlog("%g", lm->beta->ve[i]); if (d->colX[i] > 0) printlog(" [col %d]", d->colX[i]); if (d->colX[i] < 0) { printlog(" %s", POLY_NAME(d->colX[i])); coords = 0; } } printlog(" + e\n"); if (coords) printlog( "(Note: coordinate coefficients apply to normalized coordinates)\n\n"); } printlog("Summary statistics (model %s intercept):\n", lm->has_intercept ? "with" : "without"); printlog("Source df SS MS F\n"); printlog("%s\n", line); printlog("Regression %3d %12.6g %12.6g", lm->dfReg, lm->SSReg, lm->MSReg); if (lm->MSErr <= 0.0) printlog(" Inf\n"); else printlog(" %12.6g\n", lm->MSReg/lm->MSErr); printlog("Error %3d %12.6g %12.6g\n", lm->dfE, lm->SSErr, lm->MSErr); printlog("%s\nTotal, %s %3d %12.6g\n%s\n\n", line, lm->has_intercept ? "corrected" : "uncorr. ", lm->dfReg + lm->dfE, SSTot, line); /* if (SSTot > 0.0) printlog("R2: %g\n", lm->SSReg / SSTot); */ return; } LM *calc_lm(LM *lm) { /* * calculate Chol,Xty,beta,SSErr,SSReg,MSErr^... * ASSUMES lm->X, lm->y and optionally lm->weights to be filled! */ double y_mean = 0, w; int i, j; /* static MAT *QR = MNULL; */ static VEC *tmp = VNULL; if (lm->X == MNULL || lm->y == VNULL) ErrMsg(ER_NULL, "calc_lm(): y or X"); if (lm->X->m != lm->y->dim) { message("size: %d %d %d\n", lm->X->m, lm->y->dim, lm->X->n); ErrMsg(ER_IMPOSVAL, "calc_lm: matrices wrong size"); } if (lm->X->m < lm->X->n) { lm->is_singular = 1; return lm; } /* * allocate structures: */ lm->is_singular = 0; lm->beta = v_resize(lm->beta, lm->X->n); lm->Xty = v_resize(lm->Xty, lm->X->n); tmp = v_resize(tmp, lm->X->n); if (lm->X->n == 0 || lm->y->dim == 0) return lm; if (DEBUG_COV) { printlog("#y is "); v_logoutput(lm->y); printlog("#X is "); m_logoutput(lm->X); if (lm->weights) { printlog("#w is "); v_logoutput(lm->weights); } } /* * create, in case of weights, V^{-1/2}X and V^{-1/2}y: */ if (lm->weights != VNULL) { for (i = 0; i < lm->X->m; i++) { /* rows */ w = sqrt(lm->weights->ve[i]); for (j = 0; j < lm->X->n; j++) /* cols */ ME(lm->X, i, j) *= w; lm->y->ve[i] *= w; } } /* * create Chol = X'X (or X'WX) and XtY = (y'X)' = X'y (X'Wy) */ lm->Xty = vm_mlt(lm->X, lm->y, lm->Xty); if (DEBUG_COV) { printlog("#X'y is "); v_logoutput(lm->Xty); } lm->Chol = mtrm_mlt(lm->X, lm->X, lm->Chol); if (DEBUG_COV) { printlog("#X'X is "); m_logoutput(lm->Chol); } lm->Cov = m_copy(lm->Chol, lm->Cov); /* save copy of X'X */ int info; lm->Chol = CHfactor(lm->Chol, PNULL, &info); if (info != 0) { lm->is_singular = 1; return lm; } lm->beta = CHsolve1(lm->Chol, lm->Xty, lm->beta, PNULL); if (DEBUG_COV) { printlog("#beta is "); v_logoutput(lm->beta); } /* * estimate error variance: */ tmp = mv_mlt(lm->X, lm->beta, tmp); /* X b */ tmp = v_sub(lm->y, tmp, tmp); /* e = y - X b */ if (lm->weights) { for (i = 0, lm->SSErr = 0.0; i < lm->X->m; i++) lm->SSErr += lm->weights->ve[i] * SQR(tmp->ve[i]); } else lm->SSErr = in_prod(tmp, tmp); /* e'e */ if (DEBUG_COV) printlog("#SSErr is %g\n", lm->SSErr); /* * estimate SSReg (Draper & Smith, p. 81, Section 2.2) * (unweighted, corrected): beta' X'X beta - n * y_mean^2 * (weighted, corrected): sum weight_i * (x_i beta - beta_0)^2 * (unweighted): beta' X'X beta * (weighted): see below */ tmp = v_resize(tmp, lm->X->n); tmp = vm_mlt(lm->Cov, lm->beta, tmp); lm->SSReg = in_prod(lm->beta, tmp); if (lm->has_intercept) { for (i = 0, y_mean = 0.0; i < lm->y->dim; i++) y_mean += lm->y->ve[i]; y_mean /= lm->y->dim; lm->SSReg -= SQR(y_mean) * lm->y->dim; } lm->dfReg = lm->X->n; if (lm->has_intercept) lm->dfReg -= 1; if (lm->dfReg > 0) lm->MSReg = lm->SSReg/lm->dfReg; else lm->MSReg = DBL_MAX; lm->dfE = lm->X->m - zero_weights_count(lm) - lm->X->n; if (lm->dfE == 0) lm->MSErr = DBL_MAX; else lm->MSErr = lm->SSErr/lm->dfE; lm->Cov = m_inverse(lm->Cov, &info); /* (X'X)-1 */ if (info != 0) pr_warning("linear model has singular covariance matrix"); /* next, multiply with sigma^2 */ sm_mlt(lm->MSErr, lm->Cov, lm->Cov); /* in situ mlt */ return lm; } static int zero_weights_count(LM *lm) { int i, n_zero = 0; if (lm->weights == VNULL) return 0; for (i = 0; i < lm->weights->dim; i++) if (lm->weights->ve[i] < gl_zero) n_zero++; return n_zero; } double calc_mu(const DATA *d, const DPOINT *where) { int i; double mu, *from; assert(d->beta); mu = 0.0; from = where->X; for (i = 0; i < d->beta->size; i++) mu += from[i] * d->beta->val[i]; return mu; } gstat/src/glvars.h0000644000176200001440000000516315060550314013636 0ustar liggesusers#ifndef GLVARS_H # define GLVARS_H /* avoid multiple inclusion */ typedef enum { NSP = 0, /* initial value */ UIF, /* variogram modelling user interface */ OKR, UKR, SKR, /* ordinary, universal or simple kriging */ IDW, /* inverse distance interpolation */ MED, /* (local) sample median or quantile */ NRS, /* neighbourhood size */ LSLM, /* uncorrelated (or weighted) linear model */ GSI, ISI, /* Gaussian/indicator (conditional) simulation */ SEM, COV, /* sample (cross) semivariance or covariance */ SPREAD, /* distance to nearest sample */ DIV, /* diversity, range */ SKEW, /* skewness, kurtosis */ LSEM, /* locally fitted semivariogram parameters */ TEST /* does nothing really */ } METHOD; typedef struct { METHOD m; int is_simulation; const char *name; } METHODS; extern const METHODS methods[]; typedef enum { MODE_NSP = 0, SIMPLE, STRATIFY, MULTIVARIABLE } MODE; #if defined(__cplusplus) extern "C" { #endif int init_global_variables(void); const char *get_outfile_namei(int i); const char **get_outfile_name(void); int dump_all(void); void check_global_variables(void); const char *method_string(METHOD i); int get_n_vars(void); int get_n_vgms(void); int get_n_outputs(void); int get_n_beta_set(void); int which_identifier(const char *id); const char *name_identifier(int i); void push_bound(double value); void set_method(METHOD); int is_simulation(METHOD m); METHOD get_default_method(void); METHOD get_method(void); void set_mode(void); MODE get_mode(void); double max_block_dimension(int reset); int n_variograms_set(void); int decide_on_coincide(void); int remove_id(const int id); void remove_all(void); #ifdef VARIO_H /* vario.h was included before this point: */ VARIOGRAM *get_vgm(int i); #endif #ifdef DATA_H /* data.h was included before this point: */ DATA **get_gstat_data(void); DATA *get_dataval(void); DATA *get_data_area(void); DATA *create_data_area(void); DPOINT *get_block_p(void); void setup_valdata_X(DATA *d); #endif #if defined(__cplusplus) } #endif extern int gl_nblockdiscr, gl_seed, gl_n_uk, gl_cressie, gl_zero_est, gl_fit, gl_iter, gl_xvalid, gl_gauss, gl_sym_ev, gl_jgraph, gl_blas, gl_order, gl_n_intervals, gl_gls_residuals, gl_asym_vgm, gl_numbers, gl_nsim, gl_lhs, gl_longlat, gl_n_marginals, gl_sparse, gl_rp, gl_coincide, gl_nocheck, gl_spiral, gl_secure, gl_split, gl_register_pairs, gl_sim_beta, gl_rowwise, gl_choleski; extern double gl_rho, gl_idp, gl_cutoff, gl_iwidth, gl_zmap, gl_quantile, gl_fit_limit, gl_fraction, gl_alpha, gl_beta, gl_tol_hor, gl_tol_ver, *gl_bounds, *gl_marginal_values, gl_zero, gl_zero2; extern const char *method_code[]; #endif /* GLVARS_H */ gstat/src/select.h0000644000176200001440000000004715060550314013613 0ustar liggesusersint select_at(DATA *d, DPOINT *where); gstat/src/Makevars0000644000176200001440000000011415060550314013652 0ustar liggesusersPKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) PKG_CPPFLAGS = -DR_NO_REMAP gstat/src/direct.h0000644000176200001440000000022315060550314013602 0ustar liggesusersdouble valid_direction(DPOINT *a, DPOINT *b, int symmetric, const DATA *d); void set_direction_values(double a, double b, double t_h, double t_v); gstat/src/vario.h0000644000176200001440000001470115060550314013456 0ustar liggesusers#ifndef VARIO_H # define VARIO_H /* avoid multiple inclusion */ typedef enum { NOTSPECIFIED = 0, SEMIVARIOGRAM, CROSSVARIOGRAM, COVARIOGRAM, CROSSCOVARIOGRAM, PRSEMIVARIOGRAM /* pairwise relative semivariogram */ } SAMPLE_VGM_TYPE; extern const char *vgm_type_str[]; #define LENGTH_OF_MODEL 100 /* max string length for one variogram model */ typedef enum { ZERO_DEFAULT = 0, ZERO_INCLUDE, ZERO_AVOID, ZERO_SPECIAL } DO_AT_ZERO; typedef struct { double tm[3][3]; /* 3D-transformation matrix */ double angle[3]; /* angle in , ccl from pos x; angle up; rot. angle */ double ratio[2]; /* ratio axis2:axis1, ratio axis axis3:axis1 */ } ANIS_TM; typedef enum { NO_FIT = 0, WLS_FIT = 1, WLS_FIT_MOD = 2, /* 3, 4: gnuplot fits not supported */ MIVQUE_FIT = 5, OLS_FIT = 6, WLS_NHH = 7 } FIT_TYPE; typedef struct { int n_est, n_max, cloud, plot_numbers, is_asym; int recalc, refit, pseudo, is_directional; double *gamma, *dist; unsigned long *nh; double cutoff, iwidth; SAMPLE_VGM_TYPE evt; FIT_TYPE fit; DO_AT_ZERO zero; void *map, /* variogram map structure, i/o using files */ *S_grid /* variogram map structure, passed from S interface*/ ; struct { double x, y, z; } direction; DPOINT ***pairs; /* optionally, the point pair list -- for j in [ 0, nh[i] > ((DPOINT ***)pairs)[i][j*2] and its successor are two pointers to a pair of data points that were used to calculate gamma[i]. The length of pairs is (at least) nh[i] * 2. See register_pairs() */ } SAMPLE_VGM; /* a sample variogram */ typedef enum { NOT_SP = 0, NUGGET, EXPONENTIAL, SPHERICAL, GAUSSIAN, EXCLASS, MATERN, STEIN, CIRCULAR, LINEAR, BESSEL, PENTASPHERICAL, PERIODIC, WAVE, HOLE, LOGARITHMIC, POWER, SPLINE, LEGENDRE, MERROR, INTERCEPT } VGM_MODEL_TYPE; typedef struct { VGM_MODEL_TYPE model; const char *name, *name_long; double (*fn)(double h, double *r), /* variogram value at h of basic model */ (*da_fn)(double h, double *r); /* it's derivative to the range parm. */ } V_MODEL; extern const V_MODEL v_models[]; #define NRANGEPARS 2 /* max number of range parameters in variogram models */ typedef struct { VGM_MODEL_TYPE model; int fit_sill, fit_range, id; double range[NRANGEPARS], sill, (*fnct)(double h, double *r), /* (partial) unit variogram function */ (*da_fnct)(double h, double *r); /* (partial) derivative to range of unit variogram */ ANIS_TM *tm_range; } VGM_MODEL; typedef struct { long n; /* length */ double maxdist, *values; ANIS_TM *tm_range; } COV_TABLE; #define COV_TABLE_VALUE(tablep, dist) \ (dist >= tablep->maxdist ? tablep->values[tablep->n - 1] : \ tablep->values[(int) (tablep->n * (dist / tablep->maxdist))]) #define SEM_TABLE_VALUE(tablep, dist) \ (tablep->values[0] - COV_TABLE_VALUE(tablep, dist)) typedef struct { int n_models, max_n_models, n_fit, id, id1, id2, block_semivariance_set, block_covariance_set, isotropic, is_valid_covariance, fit_is_singular; VGM_MODEL *part; /* the basic models */ COV_TABLE *table; /* covariance value table */ double block_semivariance, /* average within-block semivariance */ block_covariance, /* average within-block covariance */ max_range, /* maximum range: where sill is reached */ sum_sills, /* sum of partial sill's */ measurement_error, /* measurement error value--def. zero */ max_val, /* maximum value that is ever reached */ min_val, /* minimum value that is ever reached */ SSErr; /* fit result */ SAMPLE_VGM *ev; } VARIOGRAM; #define dist2(x,y,z) (x*x+y*y+z*z) #define TM_IS3D(tm) \ (tm->angle[1] != 0.0 || tm->angle[2] != 0.0 || tm->ratio[1] < 1.0) #define relative_norm(v,x,y,z) ((v == NULL || dist2(x,y,z) == 0.0) ? 1.0 : \ (transform_norm(NULL,x,y,z)/transform_norm(v,x,y,z))) #define UnitCovariance(part,x,y,z) \ (part.model == INTERCEPT ? (1.0) :\ (1.0 - part.fnct(transform_norm(part.tm_range,x,y,z), part.range))) #define UnitSemivariance(part,x,y,z) \ (part.fnct(transform_norm(part.tm_range,x,y,z), part.range)) #define Covariance(part,x,y,z) (part.sill * UnitCovariance(part,x,y,z)) #define Semivariance(part,x,y,z) (part.sill * UnitSemivariance(part,x,y,z)) #define DA_DELTA 0.001 #define da_Semivariance(part,x,y,z) \ (part.da_fnct != NULL ? \ (part.sill * part.da_fnct(transform_norm(part.tm_range,x,y,z), part.range)) : \ da_general(&(part), transform_norm(part.tm_range, x,y,z))) /* (part.sill * \ (part.fnct(transform_norm(part.tm_range,x,y,z), part.range * (1.0 + DA_DELTA)) - \ part.fnct(transform_norm(part.tm_range,x,y,z), part.range * (1.0 - DA_DELTA))) \ / (2 * part.range * DA_DELTA))) */ #define EPSILON 1.0e-30 /* for small, non-zero anisotropy ratios */ #define is_covariogram(v) \ ((v->ev->evt==COVARIOGRAM||v->ev->evt==CROSSCOVARIOGRAM)) #define is_variogram(v) \ ((v->ev->evt==SEMIVARIOGRAM||v->ev->evt==CROSSVARIOGRAM)) #define is_direct(v) \ ((v->ev->evt==COVARIOGRAM||v->ev->evt==SEMIVARIOGRAM)) #define is_cross(v) \ ((v->ev->evt==CROSSCOVARIOGRAM||v->ev->evt==CROSSVARIOGRAM)) #define MODELHASNORANGE(m) (m == NUGGET || m == INTERCEPT) #define PARTHASNORANGE(m) (m->model == NUGGET || m->model == INTERCEPT || \ (m->model == LINEAR && m->range == 0.0)) #if defined(__cplusplus) extern "C" { #endif extern const char *v_model_gnuplot[]; extern const char *v_model_names[]; extern const char *c_model_gnuplot[]; VARIOGRAM *init_variogram(VARIOGRAM *v); SAMPLE_VGM *init_ev(void); void vgm_init_block_values(VARIOGRAM *v); void free_variogram(VARIOGRAM *v); void logprint_variogram(const VARIOGRAM *v, int verbose); void fprint_variogram(FILE *f, const VARIOGRAM *v, int verbose); const char *sprint_variogram(const VARIOGRAM *v, int verbose); double get_semivariance(const VARIOGRAM *v, double dx, double dy, double dz); double get_covariance (const VARIOGRAM *v, double dx, double dy, double dz); double transform_norm(const ANIS_TM *tm, double dx, double dy, double dz); void check_variography(const VARIOGRAM **v, int n); void update_variogram(VARIOGRAM *vp); double get_max_sills(int n); double da_general(VGM_MODEL *p, double h); int push_variogram_model(VARIOGRAM *v, VGM_MODEL part); VGM_MODEL_TYPE which_variogram_model(const char *m); double relative_nugget(VARIOGRAM *v); int vario(int argc, char **argv); DO_AT_ZERO zero_int2enum(int zero); void push_to_v(VARIOGRAM *v, const char *mod, double sill, double *range, int nrangepars, double *d, int fit_sill, int fit_range); void push_to_v_table(VARIOGRAM *v, double maxdist, int length, double *values, double *anis); #if defined(__cplusplus) } #endif #endif /* VARIO_H */ gstat/src/direct.c0000644000176200001440000000727015060550314013606 0ustar liggesusers/* * direction.c: evaluation of directions for variogram pair inclusion * Optimized by Konstantin Malakhanov (K.M.), march 1998 */ #include /* cos() */ #include "defs.h" #include "userio.h" #include "data.h" #include "utils.h" #include "debug.h" #include "defaults.h" #include "glvars.h" #include "direct.h" #define MAX_ANG (PI/2.0) /* * direct's little private data base: */ static double alpha = 0.0, beta = 0.0, tol_hor = PI, tol_ver = PI, cos_tol_hor = -1.0, cos_tol_ver = -1.0, /* Changed K.M. Fri Feb 27 11:13:47 1998 */ dir_v[2] = { 1.0, 0.0 } , dir_h[2] = { 0.0, 1.0 }; static int all_directions = -1; void set_direction_values(double a, double b, double t_h, double t_v) { /* do some checks: */ if (a < 0.0 || a > 360.0) pr_warning( "alpha must be in [0..360]"); if (b < 0.0 || b > 360.0) pr_warning( "beta must be in [0..360]"); if (t_h < 0.0 || t_h > DEF_tol_hor) pr_warning( "horizontal tolerance must be in <0..180>"); if (t_v < 0.0 || t_v > DEF_tol_ver) pr_warning( "vertical tolerance must be in <0..180>"); if (t_h == DEF_tol_hor && t_v == DEF_tol_ver) { all_directions = 1; return; } else all_directions = 0; alpha = a * PI / 180.0; beta = b * PI / 180.0; tol_hor = t_h * PI / 180.0; tol_ver = t_v * PI / 180.0; cos_tol_hor = cos(tol_hor); /* Changed K.M. Fri Feb 27 11:14:15 1998 */ cos_tol_ver = cos(tol_ver); /* Changed K.M. Fri Feb 27 11:14:15 1998 */ dir_h[0] = sin(alpha); /* */ dir_h[1] = cos(alpha); /* */ dir_v[0] = cos(beta); /* */ dir_v[1] = sin(beta); /* */ return; } double valid_direction(DPOINT *a, DPOINT *b, int symmetric, const DATA *d) { /* * return distance when vector is within the tolerance section; * return -1.0 when vector is outside tolerance section. */ double norm, inprod, dist, px, py, pz; /* Changed K.M. Fri Feb 27 11:06:07 1998 */ /* dist = d->point_norm(p); */ dist = sqrt(d->pp_norm2(a, b)); if (all_directions == 1) return dist; px = a->x - b->x; py = a->y - b->y; pz = a->z - b->z; if (tol_hor >= MAX_ANG && tol_ver >= MAX_ANG) return dist; if (tol_hor >= MAX_ANG && pz == 0.0) return dist; if (tol_ver >= MAX_ANG && px == 0.0 && py == 0.0) return dist; if (tol_hor < MAX_ANG && (px != 0.0 || py != 0.0)) { /* * check in plane: */ norm = sqrt(px * px + py * py); inprod = (px * dir_h[0] + py * dir_h[1])/norm; if (symmetric) { /* the most often case */ if ( fabs(inprod) < cos_tol_hor) /* if cos(alpha) < cos(tol) then alpha > tol! */ return -1.0; } else if (inprod < cos_tol_hor) return -1.0; /* Changed K.M. Fri Feb 27 11:18:24 1998: I have eliminated most of checks for the following reasons: if (because of numerical reasons) we get fabs(inprod)>1.0, then it really means that inprod is either +1.0 or -1.0, i.e. the angle between point vector and variogram direction is either 0 or pi. In case of SYMMETRIC it doesn't matter - fabs(inprod) is then bigger then cos_tol_hor, so we accept this point pair as it should be. In the case of not SYMMETRIC - if inprod>1 then inprod is bigger then cos_tol_hor and we accept this pair, if inprod < -1.0 then it is smaller then cos_tol_hor and we reject this pair. This way we also do not need to calculate acos and to check for domain errors afterwards. */ } if (tol_ver < MAX_ANG && (px != 0.0 || py != 0.0 || pz != 0.0)) { /* * inproduct in */ /* Changed K.M. Fri Feb 27 15:47:13 1998 */ inprod = (sqrt(px * px + py * py) * dir_v[0] + pz * dir_v[1])/dist; if (symmetric) { /* the most often case */ if ( fabs(inprod) < cos_tol_ver) /* if cos(alpha) < cos(tol) then alpha > tol! */ return -1.0; } else if (inprod < cos_tol_ver) return -1.0; } return dist; } gstat/src/sim.c0000644000176200001440000001631015060550314013117 0ustar liggesusers/* * sim.c: functions, special to (un)conditional simulation */ #include #include #include "mtrx.h" #include "defs.h" #include "debug.h" #include "glvars.h" /* gl_nsim */ #include "userio.h" #include "data.h" #include "gls.h" #include "utils.h" #include "lm.h" #include "s.h" /* r_uniform(), r_normal() */ #include "sim.h" static void simulate_mvn(const double *est, VEC *result, const int *is_datum); static void simulate_uniform(double *est, VEC *result, int orc); static unsigned int n_orvc = 0, n_total = 0; const double *cond_sim(double *est, int dim, METHOD m, int *is_datum, int orc) { /* * distributions come as { est1, var1, est2, var2,..., cov1-1,.. } * and return as { sim-1, sim-2, sim-3, ..., sim-dim } */ int i; static VEC *result = VNULL; static double *sim = NULL; static int max_dim = -1; assert(dim > 0); assert(est != NULL); assert(dim >= 1); assert(is_simulation(m)); assert(est != NULL); assert(is_datum != NULL); if (dim > max_dim) { sim = (double *) erealloc(sim, dim * sizeof(double)); max_dim = dim; } result = v_resize(result, dim); for (i = 0; i < dim; i++) is_datum[i] = (fabs(est[2 * i + 1]) < gl_zero); /* `zero' variance */ if (m == GSI) /* generate zero mean correlated noise: */ simulate_mvn(est, result, is_datum); else { /* m == IS */ correct_orv(est, dim, orc); /* affects est */ simulate_uniform(est, result, orc); } for (i = 0; i < dim; i++) sim[i] = result->ve[i]; return sim; } static void simulate_mvn(const double *est, VEC *result, const int *is_datum) { static MAT *M = MNULL; static VEC *ind = VNULL, *sim = VNULL; static PERM *p = PNULL; int i, j, info; volatile int dim; p = px_resize(p, result->dim); for (i = dim = 0; i < result->dim; i++) { if (is_datum[i] == 0) /* non-``zero'' variance -- do simulate */ p->pe[dim++] = i; /* index of simulation point */ } p->size = dim; /* * now dim is the number of pos. variances, * p points their position */ if (dim > 0) { /* there is something to be simulated */ M = m_resize(M, dim, dim); for (i = 0; i < dim; i++) { ME(M, i, i) = est[2 * p->pe[i] + 1]; /* variances on diagonal */ for (j = 0; j < i; j++) /* off-diagonal: covariances */ ME(M, j, i) = ME(M, i, j) = est[2 * result->dim + LTI2(p->pe[j],p->pe[i])]; } if (DEBUG_COV) { printlog("# simulation covariance matrix:\n"); m_logoutput(M); } /* decompose M: */ M = CHfactor(M, PNULL, &info); /* LT is zero */ if (info != 0) pr_warning("singular simulation covariance matrix"); if (DEBUG_COV) { printlog("# decomposed error covariance matrix, with zero LT:\n"); m_logoutput(M); } /* make ind a iid N(0,1) vector */ ind = v_resize(ind, dim); for (i = 0; i < dim; i++) ind->ve[i] = r_normal(); /* generate N(0,1) independent samples */ /* make MVN */ sim = v_resize(sim, dim); sim = vm_mlt(M, ind, sim); /* create zero mean correlated noise */ if (DEBUG_COV) { printlog("# correlated noise vector:\n"); v_logoutput(sim); } } /* fill result vector: */ for (i = j = 0; i < result->dim; i++) { if (j < dim && i == p->pe[j]) { /* simulated */ result->ve[i] = est[2 * i] + sim->ve[j]; j++; } else result->ve[i] = est[2 * i]; } if (DEBUG_COV) { printlog("\n# simulated values:\n"); if (is_datum != NULL) { for (i = 0; i < result->dim; i++) { printlog("%g # (%s)\n", result->ve[i], is_datum[i] ? "datum point" : "simulated"); } } else { for (i = 0; i < result->dim; i++) printlog(" %g", result->ve[i]); printlog("\n"); } } } static void simulate_uniform(double *est, VEC *result, int orc) { /* * depending on gl_is_pdf, assume indicative (1) or cumulative (0) * densitiy function in est; * sum of all estimates should equal about 1, which is not * the case when cumulative, when last estimate should be * close to 1. */ int i, hit; double cdf, rn; static double *pdf = NULL; if (result->dim == 1) { result->ve[0] = 1.0 * (r_uniform() < est[0]); if (DEBUG_ORDER && (est[0] < 0.0 || est[0] > 1.0)) pr_warning("order relation violation: P %g not in [0,1]\n", est[0]); return; } if (pdf == NULL) pdf = (double *) emalloc(result->dim * sizeof(double)); for (i = 0; i < result->dim; i++) pdf[i] = est[2 * i]; /* local copy */ if (orc == 4) /* cumulative indicators: make raw pdf */ for (i = 1; i < result->dim; i++) pdf[i] -= pdf[i-1]; /* make pdf from cdf */ rn = r_uniform(); hit = 0; cdf = pdf[0]; while (rn > cdf) { hit++; if (hit < result->dim) cdf += pdf[hit]; else break; /* fix hit at this interval */ } /* hit now denotes the class in [ 0 ... dim ] in which rn falls */ for (i = 0; i < result->dim; i++) if (orc <= 3) result->ve[i] = (hit == i ? 1.0 : 0.0); else result->ve[i] = (hit <= i ? 1.0 : 0.0); } void correct_orv(double *est, int n_vars, int orc) { /* * does ``order relation violations corrections'' (acc. to GSLIB pages 77-81); * if IS_PDF: correct < 0, > 1, sum <= 1; * if not IS_PDF: average upward/downward correction as in GSLIB's ik3d. */ int i; static int violation = -1, size = -1; static double *down = NULL, *up = NULL, *ori = NULL; double sum = 0.0; if (down == NULL || size < n_vars) { down = (double *) erealloc(down, n_vars * sizeof(double)); up = (double *) erealloc(up, n_vars * sizeof(double)); ori = (double *) erealloc(ori, n_vars * sizeof(double)); size = n_vars; } /* save original */ for (i = 0; i < n_vars; i++) ori[i] = est[2 * i]; if (orc <= 3) { for (i = 0; i < n_vars; i++) { est[2 * i] = MAX(est[2 * i], 0.0); est[2 * i] = MIN(est[2 * i], 1.0); sum += est[2 * i]; } if (orc == 3 && sum != 1.0) { if (DEBUG_ORDER) printlog("sum!=1: "); for (i = 0; i < n_vars; i++) est[2 * i] /= sum; } else if (orc == 2 && sum > 1.0) { if (DEBUG_ORDER) printlog("sum>1: "); for (i = 0; i < n_vars; i++) est[2 * i] /= sum; } } else { /* orc == 4: cdf; do the GSLIB upward/downward averaging: */ /* upward correction: */ up[0] = MAX(0.0, MIN(1.0, est[0])); for (i = 1; i < n_vars; i++) /* don't go down && stay < 1 */ up[i] = MAX(up[i-1], MIN(1.0, est[2 * i])); /* downward correction: */ down[n_vars-1] = MAX(0.0, MIN(1.0, est[2 * (n_vars-1)])); for (i = n_vars - 2; i >= 0; i--) /* don't go up && stay > 0 */ down[i] = MIN(down[i+1], MAX(0.0, est[2 * i])); /* average upward/downward: */ for (i = 0; i < n_vars; i++) est[2 * i] = 0.5 * (down[i] + up[i]); } if (n_total == 0) { /* first time */ if (DEBUG_ORDER) printlog("order relation violation:\n(before correction) --> (after correction)\n"); } n_total++; for (i = violation = 0; !violation && i < n_vars; i++) if (ori[i] != est[2 * i]) violation = 1; n_orvc += violation; if (DEBUG_ORDER) { if (violation) { /* print the order correction */ for (i = 0; i < n_vars; i++) printlog("%g ", ori[i]); printlog("--> "); for (i = 0; i < n_vars; i++) printlog("%g ", est[2 * i]); printlog("\n"); } } } void print_orvc(void) { if (n_total > 0) { if (n_orvc > 0) printlog( "number of corrected order relation violations: %u of %u (%.1f%%)\n", n_orvc, n_total, (100.0 * n_orvc)/n_total); else printlog("no order relation violations\n"); n_orvc = 0; n_total = 0; } } gstat/src/lm.h0000644000176200001440000000216615060550314012750 0ustar liggesusers#ifndef LM_H # define LM_H void pred_lm(DATA **data, int n_vars, DPOINT *where, double *est); void make_residuals_lm(DATA *d); double *make_ols(DATA *d); MAT *get_X(DATA **d, MAT *X, int nvars); MAT *get_X0(DATA **d, MAT *X0, DPOINT *where, int nvars); double calc_mu(const DATA *d, const DPOINT *pt); VEC *get_y(DATA **d, VEC *y, int nvars); int is_singular(MAT *X, double epsilon); typedef struct { VEC *beta, /* parameter vector */ *y, /* data vector */ *Xty, /* X'y */ *weights; /* weights in a WLS model: V-1, 1/sigma^2_i */ MAT *X, /* design matrix */ *Cov, /* covariance matrix of beta */ *Chol; /* Choleski decomposition of X'X or X'V-1X */ double MSErr, /* Mean Square Error */ MSReg, /* Mean Square due to regression */ SSErr, /* Sum of Squares error */ SSReg; /* Sum of Squares regression */ int dfE, /* degrees of freedom error */ dfReg, /* degrees of freedom regression */ is_singular, /* flag if X'X is singular */ has_intercept; /* model has intercept, J is part of X */ } LM ; LM *calc_lm(LM *lm); void logprint_lm(DATA *d, LM *lm); LM *init_lm(LM *lm); void free_lm(LM *lm); #endif /* LM_H */ gstat/src/userio.h0000644000176200001440000000302415060550314013640 0ustar liggesusers#ifndef USERIO_H #define USERIO_H enum Gstat_errno { ER_NOERROR = 0 /* no error */, ER_NULL = 1 /* internal error: should not occur */, ER_VARNOTSET = 2 /* a required variable was not set by the user */, ER_RANGE = 3 /* range error (outside permitted values) */, ER_IMPOSVAL = 4 /* a variable was set to an illegal value */, ER_WRITE = 6 /* write error on file */, ER_READ = 7 /* read error on file */, ER_RDFLT = 8 /* error while converting a string to a float */, ER_RDINT = 9 /* error while converting a string to an int */, ER_SYNTAX = 10 /* syntax error */, ER_ARGOPT = 11 /* error in command line option arguments */, ER_DOMAIN = 12 /* math error */, ER_MEMORY = 13 /* memory exhausted */, ER_IO = 14 /* i/o conflict (e.g. redirection not permitted) */, ER_NOCMD = 15 /* no command file specified */, ER_NOCURSES = 16 /* no curses user interface compiled in */, ER_PWRITE = 17 /* error while writing to a pipe */, ER_PREAD = 18 /* error while reading from a pipe */, ER_SECURE = 19 /* secure mode: operation not allowed */ }; #define MAX_ERRNO 19 void message(char *fmt, ...); /* message() calls always preceed ErrMsg() */ #define ErrMsg(a,b) gstat_error(__FILE__,__LINE__,a,b) void gstat_error(char *fname, int line, enum Gstat_errno err_nr, const char *msg); void pr_warning(char *fmt, ...); void printlog(const char *fmt, ...); void print_progress(unsigned int current, unsigned int total); #endif /* USERIO_H */ gstat/src/reml.c0000644000176200001440000002604415060550314013273 0ustar liggesusers/* * iterated mivque (reml) estimate of covariance components, following * Christensen's 1994 derivations Math.Geol. 25 (5), 541-558, and * Kitanidis' 1985 derivation (for estimate covariances) Math.Geol. 17 (2). * * Pre: data pointer (later: extend to 2 or more, crossvariograms?) * initial variogram for *data * Post: returns pointer to the updated variogram * if output != NULL, all iteration steps are printed to log device, * with final variogram model parameter covariances * Aug 1994; * Mod. (I-Aw) Nov 1998 */ #include #include /* fabs() */ #include "mtrx.h" #include "defs.h" #include "userio.h" #include "debug.h" #include "data.h" #include "utils.h" #include "vario.h" #include "glvars.h" #include "select.h" #include "mtrx.h" #include "lm.h" /* get_X, get_y */ #include "reml.h" static int reml(VEC *Y, MAT *X, MAT **Vk, int n_k, int max_iter, double fit_limit, VEC *teta); static double trace_matrix(MAT *m); static MAT *calc_VinvIminAw(MAT *Vw, MAT *X, MAT *VinvIminAw, int calc_Aw); static void calc_rhs_Tr_m(int n_models, MAT **Vk,MAT *VinvIminAw, VEC *Y, VEC *rhs, MAT *Tr_m); static double calc_ll(MAT *Vw, MAT *X, VEC *y, int n); static MAT *XVXt_mlt(MAT *X, MAT *V, MAT *out); static MAT *IminAw = MNULL; VARIOGRAM *reml_sills(DATA *data, VARIOGRAM *vp) { int i, j, k; MAT **Vk = NULL, *X = MNULL; VEC *Y = VNULL, *init = VNULL; DPOINT *dpa, *dpb; double dx, dy = 0.0, dz = 0.0, dzero2; if (data == NULL || vp == NULL) ErrMsg(ER_NULL, "reml()"); select_at(data, (DPOINT *) NULL); if (vp->n_models <= 0) ErrMsg(ER_VARNOTSET, "reml: please define initial variogram model"); /* * create Y, X, Vk's only once: */ Y = get_y(&data, Y, 1); X = get_X(&data, X, 1); Vk = (MAT **) emalloc(vp->n_models * sizeof(MAT *)); init = v_resize(init, vp->n_models); for (i = 0; i < vp->n_models; i++) { init->ve[i] = vp->part[i].sill; /* remember init. values for updating */ vp->part[i].sill = 1; Vk[i] = m_resize(MNULL, X->m, X->m); } dzero2 = gl_zero * gl_zero; for (i = 0; i < data->n_list; i++) { for (j = 0; j < vp->n_models; j++) /* fill diagonals */ ME(Vk[j], i, i) = Covariance(vp->part[j], 0.0, 0.0, 0.0); for (j = 0; j < i; j++) { /* off-diagonal elements: */ dpa = data->list[i]; dpb = data->list[j]; /* * if different points coincide on a locations, shift them, * or the covariance matrix will become singular */ dx = dpa->x - dpb->x; dy = dpa->y - dpb->y; dz = dpa->z - dpb->z; if (data->pp_norm2(dpa, dpb) < dzero2) { if (data->mode & X_BIT_SET) dx = (dx >= 0 ? gl_zero : -gl_zero); if (data->mode & Y_BIT_SET) dy = (dy >= 0 ? gl_zero : -gl_zero); if (data->mode & Z_BIT_SET) dz = (dz >= 0 ? gl_zero : -gl_zero); } for (k = 0; k < vp->n_models; k++) ME(Vk[k], i, j) = ME(Vk[k], j, i) = Covariance(vp->part[k], dx, dy, dz); } } if (reml(Y, X, Vk, vp->n_models, gl_iter, gl_fit_limit, init)) vp->ev->refit = 0; else /* on convergence */ pr_warning("no convergence while fitting variogram"); for (i = 0; i < vp->n_models; i++) vp->part[i].sill = init->ve[i]; update_variogram(vp); if (DEBUG_VGMFIT) logprint_variogram(vp, 1); for (i = 0; i < vp->n_models; i++) m_free(Vk[i]); efree(Vk); m_free(X); v_free(Y); v_free(init); return vp; } static int reml(VEC *Y, MAT *X, MAT **Vk, int n_k, int max_iter, double fit_limit, VEC *teta) { volatile int n_iter = 0; int i, info; volatile double rel_step = DBL_MAX; VEC *rhs = VNULL; VEC *dteta = VNULL; MAT *Vw = MNULL, *Tr_m = MNULL, *VinvIminAw = MNULL; Vw = m_resize(Vw, X->m, X->m); VinvIminAw = m_resize(VinvIminAw, X->m, X->m); rhs = v_resize(rhs, n_k); Tr_m = m_resize(Tr_m, n_k, n_k); dteta = v_resize(dteta, n_k); while (n_iter < max_iter && rel_step > fit_limit) { print_progress(n_iter, max_iter); n_iter++; dteta = v_copy(teta, dteta); /* fill Vw, calc VinvIminAw, rhs; */ for (i = 0, m_zero(Vw); i < n_k; i++) ms_mltadd(Vw, Vk[i], teta->ve[i], Vw); /* Vw = Sum_i teta[i]*V[i] */ VinvIminAw = calc_VinvIminAw(Vw, X, VinvIminAw, n_iter == 1); calc_rhs_Tr_m(n_k, Vk, VinvIminAw, Y, rhs, Tr_m); /* Tr_m * teta = Rhs; symmetric, solve for teta: */ CHfactor(Tr_m, PNULL, &info); if (info != 0) { pr_warning("singular matrix in reml"); return(0); } CHsolve1(Tr_m, rhs, teta, PNULL); if (DEBUG_VGMFIT) { printlog("teta_%d [", n_iter); for (i = 0; i < teta->dim; i++) printlog(" %g", teta->ve[i]); printlog("] -(log.likelyhood): %g\n", calc_ll(Vw, X, Y, n_k)); } v_sub(teta, dteta, dteta); /* dteta = teta_prev - teta_curr */ if (v_norm2(teta) == 0.0) rel_step = 0.0; else rel_step = v_norm2(dteta) / v_norm2(teta); } /* while (n_iter < gl_iter && rel_step > fit_limit) */ print_progress(max_iter, max_iter); if (n_iter == gl_iter) pr_warning("No convergence after %d iterations", n_iter); if (DEBUG_VGMFIT) { /* calculate and report covariance matrix */ /* first, update to current est */ for (i = 0, m_zero(Vw); i < n_k; i++) ms_mltadd(Vw, Vk[i], teta->ve[i], Vw); /* Vw = Sum_i teta[i]*V[i] */ VinvIminAw = calc_VinvIminAw(Vw, X, VinvIminAw, 0); calc_rhs_Tr_m(n_k, Vk, VinvIminAw, Y, rhs, Tr_m); m_inverse(Tr_m, &info); sm_mlt(2.0, Tr_m, Tr_m); /* Var(YAY)=2tr(AVAV) */ printlog("Lower bound of parameter covariance matrix:\n"); m_logoutput(Tr_m); printlog("# Negative log-likelyhood: %g\n", calc_ll(Vw, X, Y, n_k)); } m_free(Vw); m_free(VinvIminAw); m_free(Tr_m); v_free(rhs); v_free(dteta); return (n_iter < max_iter && rel_step < fit_limit); /* converged? */ } static MAT *calc_VinvIminAw(MAT *Vw, MAT *X, MAT *VinvIminAw, int calc_Aw) { /* * calculate V_w^-1(I-A_w) (==VinvIminAw), * A = X(X'X)^-1 X' (AY = XBeta; Beta = (X'X)^-1 X'Y) * * on second thought (Nov 1998 -- more than 4 years later :-)) * calc (I-Aw) only once and keep this constant during iteration. */ MAT *tmp = MNULL, *V = MNULL; /* VEC *b = VNULL, *rhs = VNULL; */ int i, j, info; if (X->m != Vw->n || VinvIminAw->m != X->m) ErrMsg(ER_IMPOSVAL, "calc_VinvIminAw: sizes don't match"); if (calc_Aw) { IminAw = m_resize(IminAw, X->m, X->m); tmp = m_resize(tmp, X->n, X->n); tmp = mtrm_mlt(X, X, tmp); /* X'X */ m_inverse(tmp, &info); /* (X'X)-1 */ if (info != 0) pr_warning("singular matrix in calc_VinvIminAw"); /* X(X'X)-1 -> X(X'X)-1 X') */ IminAw = XVXt_mlt(X, tmp, IminAw); for (i = 0; i < IminAw->m; i++) /* I - Aw */ for (j = 0; j <= i; j++) if (i == j) ME(IminAw, i, j) = 1.0 - ME(IminAw, i, j); else ME(IminAw, i, j) = ME(IminAw, j, i) = -(ME(IminAw, i, j)); } V = m_copy(Vw, V); CHfactor(V, PNULL, &info); if (info != 0) pr_warning("singular V matrix in calc_VinvIminAw"); CHsolve(V, IminAw, VinvIminAw, PNULL); m_free(V); if (tmp) m_free(tmp); return VinvIminAw; } static void calc_rhs_Tr_m(int n_models, MAT **Vk,MAT *VinvIminAw, VEC *y, VEC *rhs, MAT *Tr_m) { int j, k; MAT **Pr = NULL, *Tmp = MNULL; VEC *v_tmp = VNULL, *v_tmp2; Pr = (MAT **) emalloc(n_models * sizeof(MAT *)); v_tmp2 = vm_mlt(VinvIminAw, y, VNULL); /* Vw-(I-Aw)Y == Y'(I-Aw)'Vw- */ for (j = 0; j < n_models; j++) { Pr[j] = m_mlt(Vk[j], VinvIminAw, MNULL); Tmp = m_mlt(Pr[j], Pr[j], Tmp); ME(Tr_m, j, j) = trace_matrix(Tmp); /* diagonal */ /* using Tr(A B) == Tr(B A) */ for (k = 0; k < j; k++) { /* we did Pr[k] and Pr[j], so */ Tmp = m_mlt(Pr[j], Pr[k], Tmp); /* off-diagonal */ ME(Tr_m, j, k) = ME(Tr_m, k, j) = trace_matrix(Tmp); } v_tmp = vm_mlt(Vk[j], v_tmp2, v_tmp); /* Vw-1(I-Aw)Y */ rhs->ve[j] = in_prod(v_tmp2, v_tmp); } for (j = 0; j < n_models; j++) m_free(Pr[j]); efree(Pr); m_free(Tmp); v_free(v_tmp); v_free(v_tmp2); return; } static double calc_ll(MAT *Vw, MAT *X, VEC *y, int n) { /* * calculate negative log-likelyhood */ static MAT *M1 = MNULL; static VEC *res = VNULL, *tmp = VNULL; double zQz; volatile double ldet; int i, info; IminAw->m -= n; /* |B'(I-A)Vw(I-A)'B|, pretty inefficiently, can 4 x as fast: */ /* M1 = m_mlt(IminAw, Vw, M1); M2 = mmtr_mlt(M1, IminAw, M2); */ M1 = XVXt_mlt(IminAw, Vw, M1); CHfactor(M1, PNULL, &info); for (i = 0, ldet = 0.0; i < M1->m; i++) { assert(ME(M1, i, i) > 0.0); ldet += log(ME(M1, i, i)); } /* y'B'A'(B'A'Vw A B)-1 A B y */ res = mv_mlt(IminAw, y, res); /* the m-n residuals B(I-A)'Y */ tmp = CHsolve1(M1, res, tmp, PNULL); /* M1 tmp = res -> tmp = M1-1 res */ zQz = in_prod(res, tmp); /* res' M1inv res */ IminAw->m += n; return 0.5 * ((Vw->m - n)*log(2*PI) + ldet + zQz); } static double trace_matrix(MAT *m) { /* returns trace of a square matrix */ int i; double trace; if (m == NULL) ErrMsg(ER_NULL, "trace_matrix: NULL argument"); if (m->m != m->n) ErrMsg(ER_IMPOSVAL, "trace_matrix: non-square matrix"); for (i = 0, trace = 0.0; i < m->m; i++) trace += ME(m, i, i); return trace; } MAT *XtVX_mlt(MAT *X, MAT *V, MAT *out) { /* for a symmetric matrix V, return X' V X */ static MAT *VX = MNULL; int i, j, k; if (X==(MAT *)NULL || V==(MAT *)NULL ) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); if (X->m != V->m) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); if (V->m != V->n) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); out = m_resize(out, X->n, X->n); VX = m_resize(VX, V->m, X->n); m_zero(out); VX = m_mlt(V, X, VX); for (i = 0; i < X->n; i++) { for (j = i; j < X->n; j++) for (k = 0; k < X->m; k++) ME(out, i, j) += ME(X, k, i) * ME(VX, k, j); for (j = 0; j <= i; j++) /* symmetry */ ME(out, i, j) = ME(out, j, i); } return out; } static MAT *XVXt_mlt(MAT *X, MAT *V, MAT *out) { /* for a symmetric matrix V, return X V X' */ static MAT *VXt = MNULL; int i, j, k; if (X==(MAT *)NULL || V==(MAT *)NULL ) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); if (X->n != V->m) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); if (V->m != V->n) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); out = m_resize(out, X->m, X->m); VXt = m_resize(VXt, V->m, X->n); m_zero(out); VXt = mmtr_mlt(V, X, VXt); for (i = 0; i < X->m; i++) { for (j = i; j < X->m; j++) for (k = 0; k < X->n; k++) ME(out, i, j) += ME(X, i, k) * ME(VXt, k, j); for (j = 0; j <= i; j++) /* symmetry */ ME(out, i, j) = ME(out, j, i); } return out; } MAT *XdXt_mlt(MAT *X, VEC *d, MAT *out) { /* for a diagonal matrix in d, return X d X' */ int i, j, k; if (X==(MAT *)NULL || d==(VEC *)NULL ) ErrMsg(ER_IMPOSVAL, "XVXt_mlt"); if (X->n != d->dim) ErrMsg(ER_IMPOSVAL, "XVXt_mlt"); out = m_resize(out, X->n, X->n); m_zero(out); for (i = 0; i < X->m; i++) { for (j = i; j < X->m; j++) for (k = 0; k < X->n; k++) ME(out, i, j) += ME(X, i, k) * ME(X, j, k) * d->ve[k]; for (j = 0; j <= i; j++) /* symmetry */ ME(out, i, j) = ME(out, j, i); } return out; } MAT *XtdX_mlt(MAT *X, VEC *d, MAT *out) { /* for a diagonal matrix in d, return X' d X */ int i, j, k; if (X==(MAT *)NULL || d==(VEC *)NULL ) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); if (X->m != d->dim) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); out = m_resize(out, X->n, X->n); m_zero(out); for (i = 0; i < X->n; i++) { for (j = i; j < X->n; j++) for (k = 0; k < X->m; k++) ME(out, i, j) += ME(X, k, i) * ME(X, k, j) * d->ve[k]; for (j = 0; j <= i; j++) /* symmetry */ ME(out, i, j) = ME(out, j, i); } return out; } gstat/src/sim.h0000644000176200001440000000023215060550314013120 0ustar liggesusersconst double *cond_sim(double *est, int n_sim, METHOD m, int *is_pt, int orc); void correct_orv(double *est, int n_vars, int orc); void print_orvc(void); gstat/src/msim.h0000644000176200001440000000112515060550314013277 0ustar liggesusersvoid save_sim(DATA **data, DPOINT *where, int sim, int n_vars, const double *value, int *is_pt); void save_sim_strat(DATA *d, DPOINT *where, int sim, double value, int is_pt); void restore_data_sel(DATA **data, int sim, int n_vars); void save_simulations_to_ascii(const char *fname); void save_simulations_to_maps(GRIDMAP *mask); void lhs(DATA **d, int n_vars, int stratify); void init_simulations(DATA **d); void set_beta(DATA **d, int sim, int n_vars, METHOD method); void setup_beta(DATA **d, int n_vars, int n_sim); void print_sim(void); void free_simulations(void); float ***get_msim(void); gstat/src/block.c0000644000176200001440000001662015060550314013425 0ustar liggesusers/* * block.c: calculate block discretization at a prediction location */ #include "defs.h" #include "userio.h" #include "debug.h" #include "data.h" #include "utils.h" #include "glvars.h" #include "block.h" /* Gaussian quadrature adapted from Carr & Palmer, MG 25(5), p. 514: gauss[4]: -0.8611363116, -0.3399810436, 0.3399810436, 0.8611363116 gauss_w[4]: 0.3478548452, 0.6521451548, 0.6521451548, 0.3478548452 both divided by 2 */ static double gauss[4] = { -0.4305681558, -0.1699905218, 0.1699905218, 0.4305681558 }; double gauss_w[4] = { 0.1739274226, 0.3260725774, 0.3260725774, 0.1739274226 }; int reset_anyway = 0; void reset_block_discr(void) { reset_anyway = 1; } DATA *block_discr(DATA *d, const DPOINT *block, const DPOINT *where) { /* * Purpose : get locations that discretize the estimation area * Created by : Edzer J. Pebesma * Date : april 6th, 1992 * Modified : jan 13, 1993, june 3, 1993, june 23 1993 * Prerequisites : where; * the contents of block (if not NULL) may not change * during the run of the program: only once the full * discretisation is calculated. * Returns : DATA list with 1 point (x,y,z) or a list; * Side effects : dynamic memory (re)allocation for d; * uses IS_BLOCK(where) to determine whether point or block is needed; * discretisations is rectangular using dimensions of *block; * * only the x, y and z field are used for locations, * weights are put in the weight union. */ int i, k, l, m, ndim; int ndiscr = 0, restart = 0; /* * if restart != 0, block descretizations are re-calculated. */ /* * ndim: number of dimensions (x, y, z, ..?) in data * ndiscr: total number of points discretizing the block in this run * lastndiscr: number of discretizing points in last call * gl_nblockdiscr: number of points in each dimension in discretizing grid */ static double *dx = NULL, *dy = NULL, *dz = NULL; static double *weight = NULL; static int max = 0; DATA *area = NULL, **data; /* * d has the points of the discretization of the estimation area; * dx, dy, dz and weight are remembered in case blockdiscretization has not * changed */ if (IS_POINT(where) && d != NULL) { /* point shortcut */ d->list[0]->x = where->x; d->list[0]->y = where->y; d->list[0]->z = where->z; d->list[0]->u.weight = 1.0; /* weight */ d->n_list = 1; if (DEBUG_BLOCK) { printlog("block discretization (dist is weight):\n"); d->mode = X_BIT_SET | Y_BIT_SET | Z_BIT_SET; print_data_list(d); } return d; } /* * calculate the neccesary number of block discrimination points: */ ndim = 0; ndiscr = 1; if (IS_BLOCK(where)) { if ((area = get_data_area()) == NULL) { if (block->x > 0.0) ndim++; if (block->y > 0.0) ndim++; if (block->z > 0.0) ndim++; for (i = 0; i < ndim; i++) ndiscr *= gl_nblockdiscr; } else ndiscr = area->n_list; } if (area == NULL && ndiscr > max) { dx = (double *) erealloc(dx, ndiscr * sizeof(double)); dy = (double *) erealloc(dy, ndiscr * sizeof(double)); dz = (double *) erealloc(dz, ndiscr * sizeof(double)); weight = (double *) erealloc(weight, ndiscr * sizeof(double)); max = ndiscr; } /* * (re)allocate the memory neccesary: */ if (d == NULL) { /* allocate ndiscr: */ d = (DATA *) emalloc (sizeof(DATA)); init_one_data(d); assert(get_n_vars() > 0); data = get_gstat_data(); d->pp_norm2 = data[0]->pp_norm2; /* assign distance function */ d->what_is_u = U_ISWEIGHT; d->n_X = 0; d->colnx = d->colny = d->colnz = 1; d->list = (DPOINT **) emalloc(ndiscr * sizeof(DPOINT *)); for (i = 0; i < ndiscr; i++) d->list[i] = (DPOINT *) emalloc (sizeof(DPOINT)); d->n_max = d->n_list = ndiscr; restart = 1; } else if (ndiscr > d->n_max) { /* resize if n_max < ndiscr: */ d->list = (DPOINT **) erealloc(d->list, ndiscr * sizeof(DPOINT *)); for (i = d->n_max; i < ndiscr; i++) d->list[i] = (DPOINT *) emalloc (sizeof(DPOINT)); d->n_max = d->n_list = ndiscr; restart = 1; } else if (reset_anyway) { reset_anyway = 0; restart = 1; } if (restart && ndim > 0 && area == NULL) { /* set up block regular or Gaussian block discretisation */ i = 0; switch (ndim) { case 1: if (block->y > 0 || block->z > 0) ErrMsg(ER_IMPOSVAL, "block_discr(): block y and z dimensions must be 0"); if (gl_gauss) { for (k = 0; k < 4; k++) { dx[i] = block->x * gauss[k]; dy[i] = dz[i] = 0.0; weight[i] = gauss_w[k]; i++; } } else { for (k = 0; k < gl_nblockdiscr; k++) { dx[i] = block->x * (-0.5 + (1.0/gl_nblockdiscr) * (0.5 + k)); dy[i] = dz[i] = 0.0; weight[i] = 1.0 / (1.0 * ndiscr); i++; } } break; case 2: if (block->z > 0) ErrMsg(ER_IMPOSVAL, "block_discr(): 2D block->z must be zero"); if (gl_gauss) { for (k = 0; k < 4; k++) { for (l = 0; l < 4; l++) { dx[i] = block->x * gauss[k]; dy[i] = block->y * gauss[l]; weight[i] = gauss_w[k] * gauss_w[l]; dz[i] = 0.0; i++; } /* for l */ } /* for k */ } else { for (k = 0; k < gl_nblockdiscr; k++) { for (l = 0; l < gl_nblockdiscr; l++) { dx[i] = block->x * (-0.5 + (1.0/gl_nblockdiscr) * (0.5 + k)); dy[i] = block->y * (-0.5 + (1.0/gl_nblockdiscr) * (0.5 + l)); dz[i] = 0.0; weight[i] = 1.0 / (1.0 * ndiscr); i++; } /* for l */ } /* for k */ } break; case 3: if (gl_gauss) { for (k = 0; k < 4; k++) { for (l = 0; l < 4; l++) { for (m = 0; m < 4; m++) { dx[i] = block->x * gauss[k]; dy[i] = block->y * gauss[l]; dz[i] = block->z * gauss[m]; weight[i] = gauss_w[k] * gauss_w[l] * gauss_w[m]; i++; } /* for m */ } /* for l */ } /* for k */ } else { for (k = 0; k < gl_nblockdiscr; k++) { for (l = 0; l < gl_nblockdiscr; l++) { for (m = 0; m < gl_nblockdiscr; m++) { dx[i] = block->x * (-0.5+(1.0/gl_nblockdiscr) * (0.5 + k)); dy[i] = block->y * (-0.5+(1.0/gl_nblockdiscr) * (0.5 + l)); dz[i] = block->z * (-0.5+(1.0/gl_nblockdiscr) * (0.5 + m)); weight[i] = 1.0 / (1.0 * ndiscr); i++; } /* for m */ } /* for l */ } /* for k */ } break; default: ErrMsg(ER_IMPOSVAL, "block_discr()"); } /* switch */ if (i != ndiscr) /* silly check ! */ ErrMsg(ER_IMPOSVAL, "block_discr()"); } /* end if restart */ if (IS_BLOCK(where)) { if (area != NULL) { for (i = 0; i < ndiscr; i++) { d->list[i]->x = area->list[i]->x + where->x; d->list[i]->y = area->list[i]->y + where->y; d->list[i]->z = area->list[i]->z + where->z; if (area->colnvariance) d->list[i]->u.weight = area->list[i]->variance; else d->list[i]->u.weight = 1.0 / ndiscr; } } else { for (i = 0; i < ndiscr; i++) { d->list[i]->x = where->x - dx[i]; d->list[i]->y = where->y - dy[i]; d->list[i]->z = where->z - dz[i]; d->list[i]->u.weight = weight[i]; } } } else { /* where is point */ d->list[0]->x = where->x; d->list[0]->y = where->y; d->list[0]->z = where->z; d->list[0]->u.weight = 1.0; /* weight */ } d->n_list = ndiscr; if (DEBUG_BLOCK) { printlog("block discretization (dist is weight):\n"); d->mode = X_BIT_SET | Y_BIT_SET | Z_BIT_SET; print_data_list(d); } return d; } gstat/src/nsearch.c0000644000176200001440000005246415060550314013764 0ustar liggesusers/* This software module is copyright 1997 (c): Steve Joyce mailto:steve.joyce@resgeom.slu.se Remote Sensing Laboratory http://www-umea.slu.se/~fjasj/ Dept. of Forest Resource Mgmt. & Geomatics Tel: +46 90 16 69 57 Swedish University of Agricultural Sciences Fax: +46 90 14 19 15 S-901 83 Umea, Sweden Distributed freely under the terms of the GNU General Public License as a component of: Gstat, a program for geostatistical modelling, prediction and simulation Copyright 1992-2009 (C) Edzer J. Pebesma Edzer J. Pebesma (E.Pebesma@geo.uu.nl) Landscape and environmental research group Faculty of geographical sciences University of Amsterdam Nieuwe Prinsengracht 130 1018 VZ Amsterdam -- The Netherlands */ /* * qtree.c: quick neighbourhood selection routines for gstat */ /* * Edzer's CHANGE LOG from Steve's original contribution: * converted most float to double; * bbox size initialization -1.0 * added some ErrMsg() error message checks * changed qtree_quick_select() call (DPOINTX disappeared) * made is_leaf(node) a macro; removed max_ppnode -> Q_SPLIT_AT * added flexible 1/2/3d tree support: detect from data->mode; * added bbox.mode field; * modified routines like in_bbox, sub_bbox to detect tree dimension * qtree_free(): node->n_node should be N_NODES(node) * init_qtree is now called from qtree_quick_select() * added bbox_from_* routines * added get_index macro: searching is not required * added qtree_print() functions * might have missed some. * (after 2.0:) * Q_SPLIT_AT -> gl_split * implemented the priority queue mechanism, see PR bucket quad trees * demonstrated at http://www.cs.umd.edu/~brabec/quadtree/index.html. * (this enables efficient search when only max is defined, i.e. without * a radius -- especially in case of simulation this seems really * efficient) * removed min_bbox -->> this became obsolete with the priority queue * * I guess many of my modifications assume you have sufficient memory, * and that you want to use it to speed things up. */ #include #include /* qsort() */ #include /* sqrt() */ #include /* DBL_MAX */ #include /* INT_MAX */ #include "defs.h" #include "userio.h" #include "debug.h" #include "data.h" #include "utils.h" #include "glvars.h" /* get_method(), name_identifier() */ #include "mapio.h" #include "nsearch.h" #include "pqueue.h" /* include _after_ search.h! */ #define N_NODES(x) (x==NULL?0:(-((x)->n_node))) /* a negative n_node means it's not a leaf */ /* * this is a 'tuning' parameter defining the number of points in * a quad before it is split into 4 * #define Q_SPLIT_AT 4 */ /* * another tuning parameter defining the minimum quad size allowed. * (multiplied by d->sel_rad) #define Q_STOP_AT 0.5 (now obsolete) */ #define is_leaf(node) (((node) == NULL) || (((node)->n_node) >= 0)) #define is_qtree_search(d) (d->qtree_root != NULL) #define get_index(pt, bb) \ ((pt->x >= bb.x + 0.5 * bb.size) | \ (((bb.mode & Y_BIT_SET) && (pt->y >= bb.y + 0.5 * bb.size)) << 1) | \ (((bb.mode & Z_BIT_SET) && (pt->z >= bb.z + 0.5 * bb.size)) << 2)) static void init_qtree(DATA *d); static void init_qnode(QTREE_NODE **p_node, int is_leaf, BBOX bb); static void qtree_push(DPOINT *p, QTREE_NODE **p_node, int recursion_depth); static BBOX sub_bbox(const BBOX bb, int i); static int in_bbox(const DPOINT *p, BBOX bb); static void qtree_split_node(QTREE_NODE *node, BBOX bb, int rec_level); static QTREE_NODE *qtree_expand(const DPOINT *p, QTREE_NODE *root); static QTREE_NODE **qtree_find_node(const DPOINT *p, QTREE_NODE **p_node, BBOX *bbox); void qtree_print(DATA *d); static void logprint_qtree(QTREE_NODE *node, int depth); static BBOX bbox_from_grid(const GRIDMAP *gt, const DATA_GRIDMAP *dg); static BBOX bbox_from_data(DATA *d); static void qtree_zero_all_leaves(QTREE_NODE *node); static int CDECL node_cmp(const QUEUE_NODE *a, const QUEUE_NODE *b); void logprint_queue(QUEUE *queue); static void init_qtree(DATA *d) { /* * Initialize the root of the search tree: * Since this is called from qtree_quick_select(), we know allready * quite a lot. This helps choosing sensible values for the * top level bbox origin and size. */ const GRIDMAP *gt = NULL; DATA *simlocs = NULL; int i, mode; BBOX bbox; if (is_simulation(get_method())) { /* * sequential simulation: the simulation path (through DATA or GRIDMAP) * will make up for (most of) the search locations: */ gt = (const GRIDMAP *) NULL; simlocs = get_dataval(); /* in case of simulation one of them will be non-NULL */ } /* get initial estimate for top level bbox: */ if (gt != NULL) bbox = bbox_from_grid(gt, NULL); else if (simlocs != NULL) { bbox = bbox_from_data(simlocs); if (bbox.size <= 0.0) bbox = bbox_from_data(d); } else bbox = bbox_from_data(d); if (bbox.size <= 0.0) bbox = bbox_from_data(get_dataval()); if (bbox.size <= 0.0) ErrMsg(ER_IMPOSVAL, "bbox with zero size: remove neighbourhood settings?"); init_qnode(&(d->qtree_root), d->n_list < gl_split, bbox); /* ML1 */ mode = bbox.mode; for (i = 0; i < d->n_list; i++) qtree_push_point(d, d->list[i]); /* now they won't be rejected */ /* ML2 */ if (DEBUG_DUMP) { printlog("top level search tree statistics for data(%s):\n", name_identifier(d->id)); printlog("bounding box origin ["); if (mode & X_BIT_SET) printlog("%g", d->qtree_root->bb.x); if (mode & Y_BIT_SET) printlog(",%g", d->qtree_root->bb.y); if (mode & Z_BIT_SET) printlog(",%g", d->qtree_root->bb.z); printlog("]; dimension %g\n", d->qtree_root->bb.size); } /* qtree_print(d); */ return; } static void init_qnode(QTREE_NODE **p_node, int isleaf, BBOX bb) { /* * initialize a node in the search tree. * bb.mode tells the dimension of the tree (1D/2D/3D) */ int i; if (*p_node == NULL) { *p_node = (QTREE_NODE *) emalloc(sizeof(QTREE_NODE)); /* ML1 */ (*p_node)->bb = bb; } if (isleaf) (*p_node)->n_node = 0; else { if (bb.mode & Z_BIT_SET) /* 3D: oct-tree */ (*p_node)->n_node = -8; else if (bb.mode & Y_BIT_SET) /* 2D: quad-tree */ (*p_node)->n_node = -4; else if (bb.mode & X_BIT_SET) /* 1D: binary tree */ (*p_node)->n_node = -2; else /* no x/y/z bit set...??? */ ErrMsg(ER_IMPOSVAL, "init_qnode: invalid mode"); (*p_node)->u.node = (QTREE_NODE **) emalloc(N_NODES(*p_node) * sizeof(QTREE_NODE *)); for (i = 0; i < N_NODES(*p_node); i++) (*p_node)->u.node[i] = NULL; } return; } void qtree_push_point(DATA *d, DPOINT *where) { /* add a single point to the search tree structure in d->qtree_root */ /* * do not do this while reading the data: suppose we'll never need * a neighbourhood selection after all! */ if (! is_qtree_search(d)) return; /* min_bbox = d->sel_rad * Q_STOP_AT; */ /* * if this point is outside the current search tree, * we need to add another level to the top and try again: */ while (! in_bbox(where, d->qtree_root->bb)) d->qtree_root = qtree_expand(where, d->qtree_root); /* * finally push the point onto the tree: */ qtree_push(where, &(d->qtree_root), 0); return; } static void qtree_push(DPOINT *where, QTREE_NODE **p_node, int recursion_depth) { /* add a data point to the quad tree starting at the node specified. */ QTREE_NODE **p_leaf, *node; BBOX bb; bb = (*p_node)->bb; recursion_depth += 1; /* printf("recursion_depth: %d, max %d\n", recursion_depth, MAX_RECURSION_DEPTH); */ /* find the leaf node where this point belongs */ p_leaf = qtree_find_node(where, p_node, &bb); if (*p_leaf == NULL) init_qnode(p_leaf, 1, bb); /* leaf == 1: sets ->n_node to 0 */ node = *p_leaf; /* If it is already full, split it into another level and try again: */ if (node->n_node == gl_split && recursion_depth < MAX_RECURSION_DEPTH) { qtree_split_node(node, (*p_node)->bb, recursion_depth); qtree_push(where, &node, recursion_depth); return; } /* XXX */ if (node->n_node == 0) node->u.list = (DPOINT **) emalloc(sizeof(DPOINT *)); else node->u.list = (DPOINT **) erealloc(node->u.list, (node->n_node + 1) * sizeof(DPOINT *)); /* ML2 */ node->u.list[node->n_node] = where; node->n_node++; return; } void qtree_pop_point(DPOINT *where, DATA *d) { int i; QTREE_NODE *node, **p_node; /* delete a point from the search tree */ if (! is_qtree_search(d)) /* don't bother */ return; p_node = qtree_find_node(where, &(d->qtree_root), NULL); if (*p_node == NULL) ErrMsg(ER_IMPOSVAL, "qtree_pop_point(): could not find node"); node = *p_node; for (i = 0; i < node->n_node; i++) { if (where == node->u.list[i]) { /* don't preserve order: copy last to this one: */ node->u.list[i] = node->u.list[node->n_node - 1]; break; /* from for loop */ } } node->n_node--; /* free memory if empty list: */ if (node->n_node == 0) { efree(node->u.list); efree(node); *p_node = NULL; } return; } void qtree_free(QTREE_NODE *node) { /* * If a push or search fails, you might want to consider getting rid of * whole tree and default to exhaustive search. (SJ) * [If you ever get so far, exhaustive search will take * a nearly infinite amount of time. Instead, tweek gl_split. --EJP] */ int i; if (node == NULL) return; if (!is_leaf(node)) { for (i = 0; i < N_NODES(node); i++) qtree_free(node->u.node[i]); efree(node->u.node); } else efree(node->u.list); efree(node); return; } static void qtree_split_node(QTREE_NODE *node, BBOX bbox, int rec_level) { /* * split the quadtree at 'node' and redistribute its points */ DPOINT **list; int i, n; /* first copy the points to a temporary location and free the pointers */ n = node->n_node; list = node->u.list; /* save temporary copy */ /* make a node from this leaf, overwrite u: */ init_qnode(&node, 0, bbox); /* redistribute the points into the child nodes where they belong */ for (i = 0; i < n; i++) qtree_push(list[i], &node, rec_level); efree(list); return; } static QTREE_NODE *qtree_expand(const DPOINT *where, QTREE_NODE *root) { /* * expand the top level of the search tree */ QTREE_NODE *new_top = NULL; DPOINT old_centre; BBOX old_bb, new_bb; int i; old_bb = root->bb; old_centre.x = old_centre.y = old_centre.z = 0.0; if (old_bb.mode & X_BIT_SET) old_centre.x = old_bb.x + old_bb.size / 2.0; if (old_bb.mode & Y_BIT_SET) old_centre.y = old_bb.y + old_bb.size / 2.0; if (old_bb.mode & Z_BIT_SET) old_centre.z = old_bb.z + old_bb.size / 2.0; new_bb = old_bb; /* * set the new bounding box: Steve, could you check this? * (I didn't grasp your original bbox setting here:) * * set the root bbox to the new_top bbox: */ if ((old_bb.mode & X_BIT_SET) && (where->x < old_bb.x)) new_bb.x -= old_bb.size; if ((old_bb.mode & Y_BIT_SET) && (where->y < old_bb.y)) new_bb.y -= old_bb.size; if ((old_bb.mode & Z_BIT_SET) && (where->z < old_bb.z)) new_bb.z -= old_bb.size; new_bb.size *= 2.0; /* link the old root node to the proper spot in new_top: */ init_qnode(&new_top, 0, old_bb); i = get_index((&old_centre), new_bb); new_top->u.node[i] = root; new_top->bb = new_bb; /* make this one the new root */ return new_top; } static QTREE_NODE **qtree_find_node(const DPOINT *where, QTREE_NODE **p_node, BBOX *bb) { /* * find the deepest leaf (end node) in the tree that bounds this point's * coordinates. * It's bounding box is saved in the location pointed to by p_bbox */ int i; if (is_leaf(*p_node)) return p_node; /* find in which node we are: */ i = get_index(where, (*p_node)->bb); if (bb != NULL) *bb = sub_bbox(*bb, i); /* recurse into this node: */ return qtree_find_node(where, &((*p_node)->u.node[i]), bb); } static BBOX sub_bbox(const BBOX bbox, int index) { /* * return the bounding box of a quad-tree child node based on the index * layout of octree index: * * | dz <= 0 dz > 0 * --------|-------------------- * dy > 0 | 2 3 6 7 * dy <= 0 | 0 1 4 5 * | * dx ? 0 | <= > <= > */ double size; BBOX b; b = bbox; b.size = size = bbox.size / 2.0; if (index & X_BIT_SET) /* 1, 3, 5, 7 */ b.x += size; if (index & Y_BIT_SET) /* 2, 3, 6, 7 */ b.y += size; if (index & Z_BIT_SET) /* 4, 5, 6, 7 */ b.z += size; return b; } static int in_bbox(const DPOINT *where, BBOX bbox) { /* * check if where is inside the bounding box: * _on_ the left/lower/downside boundary or is inside the box */ if ((bbox.mode & X_BIT_SET) && ((where->x < bbox.x) || (where->x >= bbox.x + bbox.size))) return 0; if ((bbox.mode & Y_BIT_SET) && ((where->y < bbox.y) || (where->y >= bbox.y + bbox.size))) return 0; if ((bbox.mode & Z_BIT_SET) && ((where->z < bbox.z) || (where->z >= bbox.z + bbox.size))) return 0; /* so, where apparently in ... */ return 1; } /* * pb_norm2_?D() functions: * calculate shortest (squared) euclidian distance from a point to a BBOX, * for ? being 1, 2 or 3 dimensions */ double pb_norm_1D(const DPOINT *where, BBOX bbox) { double x, dx; x = where->x; if (x < bbox.x) { dx = bbox.x - x; return dx * dx; } bbox.x += bbox.size; if (x > bbox.x) { dx = x - bbox.x; return dx * dx; } return 0.0; /* inside box */ } double pb_norm_2D(const DPOINT *where, BBOX bbox) { double x, y, dx = 0.0, dy = 0.0; x = where->x; y = where->y; if (x < bbox.x) dx = bbox.x - x; else { bbox.x += bbox.size; if (x > bbox.x) dx = x - bbox.x; } if (y < bbox.y) dy = bbox.y - y; else { bbox.y += bbox.size; if (y > bbox.y) dy = y - bbox.y; } return dx * dx + dy * dy; } double pb_norm_3D(const DPOINT *where, BBOX bbox) { double x, y, z, dx = 0.0, dy = 0.0, dz = 0; x = where->x; y = where->y; z = where->z; if (x < bbox.x) dx = bbox.x - x; else { bbox.x += bbox.size; if (x > bbox.x) dx = x - bbox.x; } if (y < bbox.y) dy = bbox.y - y; else { bbox.y += bbox.size; if (y > bbox.y) dy = y - bbox.y; } if (z < bbox.z) dz = bbox.z - z; else { bbox.z += bbox.size; if (z > bbox.z) dz = z - bbox.z; } return dx * dx + dy * dy + dz * dz; } void qtree_print(DATA *d) { /* * plot the full tree (2D), in a format that can be read by jgraph, found * at netlib or at http://kenner.cs.utk.edu/~plank/plank/jgraph/jgraph.html */ printlog("newgraph\nxaxis size 3\nyaxis size 3\n"); printlog("title : %s [n = %d]\n", name_identifier(d->id), d->n_list); logprint_qtree(d->qtree_root, 0); return; } static void logprint_qtree(QTREE_NODE *node, int depth) { BBOX b; int i; if (node == NULL) return; b = node->bb; if (!is_leaf(node)) { printlog("newline linethickness 0.3 pts %g %g %g %g %g %g %g %g %g %g\n", b.x, b.y, b.x+b.size, b.y, b.x+b.size, b.y+b.size, b.x, b.y+b.size, b.x, b.y); for (i = 0; i < N_NODES(node); i++) logprint_qtree(node->u.node[i], depth+1); } else { printlog("newline pts %g %g %g %g %g %g %g %g %g %g\n", b.x, b.y, b.x+b.size, b.y, b.x+b.size, b.y+b.size, b.x, b.y+b.size, b.x, b.y); /* if (node == NULL) printlog("newcurve marktype circle fill 1 pts %g %g\n", b.x+0.5*b.size, b.y+0.5*b.size); */ if (node->n_node > 0) { printlog("newcurve marktype cross pts"); for (i = 0; i < node->n_node; i++) printlog(" %g %g", node->u.list[i]->x, node->u.list[i]->y); printlog("\n"); } } } static BBOX bbox_from_grid(const GRIDMAP *gt, const DATA_GRIDMAP *dg) { /* derive a sensible top level bounding box from grid map topology */ double sizex, sizey; BBOX bbox; if (gt) { sizex = gt->cols * gt->cellsizex; sizey = gt->rows * gt->cellsizey; bbox.x = gt->x_ul; bbox.y = gt->y_ul - sizey; /* * bbox.size should be set to such a value that the smallest * leaf fits exactly over 4 grid map cells */ bbox.size = MIN(gt->cellsizex, gt->cellsizey); } else { sizex = dg->cols * dg->cellsizex; sizey = dg->rows * dg->cellsizey; bbox.x = dg->x_ul; bbox.y = dg->y_ul - sizey; bbox.size = MIN(dg->cellsizex, dg->cellsizey); } bbox.z = DBL_MAX; while (bbox.size < MAX(sizex, sizey)) bbox.size *= 2; bbox.mode = (X_BIT_SET | Y_BIT_SET); /* i.e. 3 */ return bbox; } static BBOX bbox_from_data(DATA *d) { /* derive a sensible top level bounding box from a data var */ double maxspan, dy, dz; BBOX bbox; if (d->grid) return bbox_from_grid(NULL, d->grid); bbox.x = d->minX; bbox.y = d->minY; bbox.z = d->minZ; bbox.mode = d->mode; /* ??? */ /* bbox.mode = d->mode & (X_BIT_SET|Y_BIT_SET|Z_BIT_SET); maxspan = MAX((d->maxX-d->minX), MAX((d->maxY-d->minY),(d->maxZ-d->minZ))); */ maxspan = fabs(d->maxX - d->minX); dy = fabs(d->maxY - d->minY); if (dy > maxspan) maxspan = dy; dz = fabs(d->maxZ - d->minZ); if (dz > maxspan) maxspan = dz; /* with d->grid_size entered by user: if (d->grid_size > 0.0) { bbox.x -= 0.5 * d->grid_size; bbox.y -= 0.5 * d->grid_size; bbox.z -= 0.5 * d->grid_size; bbox.size = d->grid_size; do { bbox.size *= 2; } while (bbox.size < (maxspan + d->grid_size)); } */ bbox.size = maxspan * 1.01; return bbox; } static void qtree_zero_all_leaves(QTREE_NODE *node) { int i; if (!is_leaf(node)) { for (i = 0; i < N_NODES(node); i++) qtree_zero_all_leaves(node->u.node[i]); } else if (node != NULL) node->n_node = 0; return; } void qtree_rebuild(DATA *d) { /* rebuild tree */ int i; QTREE_NODE **p_leaf, *leaf; if (d->n_list <= 0 || d->qtree_root == NULL) return; qtree_zero_all_leaves(d->qtree_root); for (i = 0; i < d->n_list; i++) { p_leaf = qtree_find_node(d->list[i], &(d->qtree_root), NULL); leaf = *p_leaf; leaf->u.list[leaf->n_node] = d->list[i]; leaf->n_node++; } return; } static DPOINT *get_nearest_point(QUEUE *q, DPOINT *where, DATA *d) { /* * returns the first (closest) DPOINT in the priority queue q, after all * unwinding necessary (which is effectively recursion into the tree). * * this and the following functions: Copyright (GPL) 1998 Edzer J. Pebesma */ QUEUE_NODE head, *el = NULL /* temporary storage */ ; QTREE_NODE *node; int i, n; while (q->length > 0) { /* try: */ /* logprint_queue(q); */ head = dequeue(q); if (! head.is_node) { /* nearest element is a point: */ if (el != NULL) efree(el); return head.u.p; } node = head.u.n; if (is_leaf(node)) { /* ah, the node dequeued is a leaf: */ /* printf("node->n_node: %d\n", node->n_node); */ if (node->n_node > 0) el = (QUEUE_NODE *) erealloc(el, node->n_node * sizeof(QUEUE_NODE)); for (i = 0; i < node->n_node; i++) { /* enqueue it's DPOINT's: */ el[i].is_node = 0; el[i].u.p = node->u.list[i]; el[i].dist2 = node->u.list[i]->u.dist2 = d->pp_norm2(where, node->u.list[i]); } n = node->n_node; } else { /* nope, but enqueue its sub-nodes: */ if (N_NODES(node) > 0) el = (QUEUE_NODE *) erealloc(el, N_NODES(node) * sizeof(QUEUE_NODE)); for (i = n = 0; i < N_NODES(node); i++) { if (node->u.node[i] != NULL) { el[n].is_node = 1; el[n].u.n = node->u.node[i]; el[n].dist2 = d->pb_norm2(where, node->u.node[i]->bb); n++; } } } if (n > 0) enqueue(q, el, n); } /* the while-loop terminates when the queue is empty */ if (el != NULL) efree(el); return NULL; } void logprint_queue(QUEUE *queue) { Q_ELEMENT *q; QUEUE_NODE *e; printlog("current priority queue size: %d\n", queue->length); for (q = queue->head; q != NULL; q = q->next) { e = &(q->el); printlog("%s %12.6g", e->is_node ? "Node at " : "Point at", sqrt(e->dist2)); if (e->is_node) printlog(" [xll=%g,yll=%g,size=%g] (with %d %s)\n", e->u.n->bb.x, e->u.n->bb.y, e->u.n->bb.size, ABS(e->u.n->n_node), e->u.n->n_node < 0 ? "nodes" : "points"); else printlog(" [index %d, value %g]\n", GET_INDEX(e->u.p), e->u.p->attr); } } static int CDECL node_cmp(const QUEUE_NODE *a, const QUEUE_NODE *b) { /* ANSI qsort() conformant comparison function */ if (a->dist2 < b->dist2) return -1; if (a->dist2 > b->dist2) return 1; /* equal distances: prefer DPOINT over a node to speed up things */ if (a->is_node != b->is_node) return (a->is_node ? 1 : -1); return 0; } int qtree_select(DPOINT *where, DATA *d) { DPOINT *p = NULL; static QUEUE *q = NULL; static QUEUE_NODE root; int sel_max; double rad2; /* if this is the first time calling with this d: */ if (d->qtree_root == NULL) init_qtree(d); root.is_node = 1; root.u.n = d->qtree_root; root.dist2 = 0.0; q = init_queue(q, node_cmp); enqueue(q, &root, 1); if (d->sel_rad >= DBL_MAX) { /* * simply get the d->sel_max nearest: */ for (d->n_sel = 0; d->n_sel < d->sel_max; d->n_sel++) d->sel[d->n_sel] = get_nearest_point(q, where, d); } else { /* * also consider a maximum distance to where */ if (d->vdist) /* select everything within sel_rad; cut later on */ sel_max = INT_MAX; else sel_max = d->sel_max; rad2 = d->sel_rad * d->sel_rad; d->n_sel = 0; while (d->n_sel < sel_max) { p = get_nearest_point(q, where, d); if (p != NULL && p->u.dist2 <= rad2) { /* accept this point */ d->sel[d->n_sel] = p; d->n_sel++; } else break; /* reject, and break while loop */ } if (d->n_sel < d->sel_min) { /* * d->sel_min was set: consider points beyond radius */ if (d->force) /* proceed beyond d->sel_rad */ while (d->n_sel < d->sel_min) { if (p != NULL) { d->sel[d->n_sel] = p; p = get_nearest_point(q, where, d); d->n_sel++; } else { /* a zero d->n_sel will result in a missing value */ d->n_sel = 0; break; } } else /* stop: a zero d->n_sel will result in a missing value */ d->n_sel = 0; } } return d->n_sel; } gstat/src/mtrx.c0000644000176200001440000003022415060550314013321 0ustar liggesusers/* interface roughly follows meschach; implementation rewritten from scratch */ #include /* memcpy, memset */ #include /* fabs */ #define USE_FC_LEN_T #include #ifndef FCONE # define FCONE #endif #include #include "defs.h" /* CDECL */ #include "utils.h" /* efree, emalloc */ #include "userio.h" /* ErrMsg */ #include "glvars.h" /* gl_blas */ #include "debug.h" #include "mtrx.h" /* get rid of -0.000000 output: */ #define _zero_(x) (fabs(x) < 1.e-7 ? 0.0 : x) /* 0. book keeping: initialisation, memory allocation, zero, copy, print */ void m_free(MAT *m) { efree(m->v); efree(m); } void v_free(VEC *v) { efree(v->ve); efree(v); } void iv_free(IVEC *iv) { efree(iv->ive); efree(iv); } void px_free(PERM *p) { efree(p->pe); efree(p); } MAT *m_init(void) { MAT *mat = emalloc(sizeof(MAT)); mat->n = mat->m = mat->max = 0; mat->v = (double *) NULL; return(mat); } MAT *m_resize(MAT *mat, size_t m, size_t n) { if (mat == MNULL) mat = m_init(); if (m * n > mat->max) { mat->max = m * n; mat->v = (double *) erealloc(mat->v, mat->max * sizeof(double)); /* takes care of NULL m */ } mat->m = m; mat->n = n; return(mat); } VEC *v_init(void) { VEC *v = emalloc(sizeof(VEC)); v->dim = v->max = 0; v->ve = NULL; return(v); } VEC *v_resize(VEC *v, size_t n) { if (v == NULL) v = v_init(); if (n > v->max) { v->ve = erealloc(v->ve, n * sizeof(double)); v->max = n; } v->dim = n; return(v); } PERM *p_init(void) { PERM *p = emalloc(sizeof(PERM)); p->size = p->max = 0; p->pe = (int *) NULL; return(p); } PERM *px_resize(PERM *p, size_t n) { if (p == PNULL) p = p_init(); if (n > p->max) { p->pe = erealloc(p->pe, n * sizeof(size_t)); p->max = n; } p->size = n; return(p); } IVEC *iv_init(void) { IVEC *iv = emalloc(sizeof(IVEC)); iv->size = iv->max = 0; iv->ive = (int *) NULL; return(iv); } IVEC *iv_resize(IVEC *iv, size_t n) { if (iv == IVNULL) iv = iv_init(); if (n > iv->max) { iv->ive = erealloc(iv->ive, n * sizeof(int)); iv->max = n; } iv->size = n; return(iv); } MAT *m_zero(MAT *m) { if (m != MNULL) memset(m->v, 0x00, m->m * m->n * sizeof(double)); return(m); } VEC *v_zero(VEC *v) { if (v != VNULL) memset(v->ve, 0x00, v->dim * sizeof(double)); return(v); } MAT *m_copy(MAT *in, MAT *out) { if (in == out) return(out); out = m_resize(out, in->m, in->n); memcpy(out->v, in->v, in->m * in->n * sizeof(double)); return(out); } VEC *v_copy(VEC *in, VEC *out) { if (in == out) return(out); out = v_resize(out, in->dim); memcpy(out->ve, in->ve, in->dim * sizeof(double)); return(out); } void m_logoutput(MAT * a) { unsigned int i, j, tmp; if (a == (MAT *) NULL) { printlog("#Matrix: NULL\n"); return; } printlog("#Matrix: %d by %d\n", a->m, a->n); if (a->v == NULL) { printlog("NULL\n"); return; } printlog("rbind(\n"); for (i = 0; i < a->m; i++) { /* for each row... */ printlog("c("); for (j = 0, tmp = 2; j < a->n; j++, tmp++) { /* for each col in row: */ printlog("%9f", _zero_(ME(a, i, j))); if (j + 1 < a->n) printlog(", "); else printlog(")"); } if (i + 1 < a->m) printlog(", "); else printlog(" "); printlog("# row %u\n", i + 1); } printlog(")\n"); } void v_logoutput(VEC * x) { unsigned int i, tmp; if (x == (VEC *) NULL) { printlog("#Vector: NULL\n"); return; } printlog("#Vector: dim: %d\n", x->dim); if (x->ve == NULL) { printlog("NULL\n"); return; } printlog("c("); for (i = 0, tmp = 0; i < x->dim; i++, tmp++) { printlog("%9f", _zero_(x->ve[i])); if (i + 1 < x->dim) printlog(", "); } printlog(")"); } /* 1: vector-scalar, vector-vector (BLAS-1) */ VEC *sv_mlt(double s, VEC *v, VEC *out) { /* out <- s * v */ out = v_resize(out, v->dim); for (int i = 0; i < v->dim; i++) out->ve[i] = s * v->ve[i]; return(out); } double v_norm2(VEC *v) { /* 2-norm */ return(in_prod(v, v)); } VEC *v_add(VEC *v1, VEC *v2, VEC *out) { /* out = v1 + v2 */ if (v1->dim != v2->dim) ErrMsg(ER_IMPOSVAL, "v_sub size mismatch"); out = v_resize(out, v1->dim); for (int i = 0; i < out->dim; i++) out->ve[i] = v1->ve[i] + v2->ve[i]; return(out); } VEC *v_sub(VEC *v1, VEC *v2, VEC *out) { /* out = v1 - v2 = -1 * v2 + v1 */ if (v1->dim != v2->dim) ErrMsg(ER_IMPOSVAL, "v_sub size mismatch"); out = v_resize(out, v1->dim); for (int i = 0; i < out->dim; i++) out->ve[i] = v1->ve[i] - v2->ve[i]; return(out); } double in_prod(VEC *a, VEC *b) { /* a'b */ if (a->dim != b->dim) ErrMsg(ER_IMPOSVAL, "in_prod: dimensions don't match"); if (! gl_blas) { double d = 0.0; for (int i = 0; i < a->dim; i++) d += a->ve[i] * b->ve[i]; return(d); } else { int one = 1; return(F77_CALL(ddot)((int *) &(a->dim), a->ve, &one, b->ve, &one)); } } /* 2: vector-matrix (BLAS-2) */ VEC *vm_mlt(MAT *m, VEC *v, VEC *out) { /* out <- v m */ if (m->m != v->dim) ErrMsg(ER_IMPOSVAL, "vm_mlt: dimensions"); out = v_zero(v_resize(out, m->n)); if (! gl_blas) { for (size_t i = 0; i < m->n; i++) for (size_t j = 0; j < v->dim; j++) out->ve[i] += v->ve[j] * ME(m, j, i); } else { double alpha = 1.0, beta = 0.0; int one = 1; F77_CALL(dgemv)("T", (int *) &(m->m), (int *) &(m->n), &alpha, m->v, (int *) &(m->m), v->ve, &one, &beta, out->ve, &one FCONE); } return(out); } VEC *mv_mlt(MAT *m, VEC *v, VEC *out) { /* out <- m v */ if (v == out) ErrMsg(ER_IMPOSVAL, "mv_mlt in situ"); if (m->n != v->dim) ErrMsg(ER_IMPOSVAL, "mv_mlt non-matching sizes"); out = v_zero(v_resize(out, m->m)); if (! gl_blas) { for (int j = 0; j < m->m; j++) for (int i = 0; i < m->n; i++) out->ve[j] += ME(m, j, i) * v->ve[i]; } else { double alpha = 1.0, beta = 0.0; int one = 1; F77_CALL(dgemv)("N", (int *) &(m->m), (int *) &(m->n), &alpha, m->v, (int *) &(m->m), v->ve, &one, &beta, out->ve, &one FCONE); } return(out); } /* 3: matrix-matrix (BLAS-3) */ MAT *m_mlt(MAT *m1, MAT *m2, MAT *out) { /* out <- m1 %*% m2 */ if (m1->n != m2->m) ErrMsg(ER_IMPOSVAL, "mv_mlt non-matching sizes"); if (! gl_blas) { out = m_zero(m_resize(out, m1->m, m2->n)); for (int i = 0; i < m1->m; i++) for (int j = 0; j < m2->n; j++) for (int k = 0; k < m1->n; k++) ME(out, i, j) += ME(m1, i, k) * ME(m2, k, j); } else { double alpha = 1.0, beta = 0.0; out = m_resize(out, m1->m, m2->n); F77_CALL(dgemm)("N", "N", (int *) &(m1->m), (int *) &(m2->n), (int *) &(m1->n), &alpha, m1->v, (int *)&(m1->m), m2->v, (int *)&(m2->m), &beta, out->v, (int *) &(m1->m) FCONE FCONE); } return(out); } MAT *mtrm_mlt(MAT *m1, MAT *m2, MAT *out) { /* out <- t(m1) %*% m2 */ if (m1->m != m2->m) ErrMsg(ER_IMPOSVAL, "mtrm_mlt non-matching m arrays"); out = m_zero(m_resize(out, m1->n, m2->n)); if (! gl_blas) { for (int i = 0; i < m1->n; i++) for (int j = 0; j < m2->n; j++) for (int k = 0; k < m1->m; k++) ME(out, i, j) += ME(m1, k, i) * ME(m2, k, j); } else { double alpha = 1.0, beta = 0.0; F77_CALL(dgemm)("T", "N", (int *) &(m1->n), (int *) &(m2->n), (int *) &(m1->m), &alpha, m1->v, (int *)&(m1->m), m2->v, (int *)&(m2->m), &beta, out->v, (int *) &(m1->n) FCONE FCONE); } return(out); } MAT *mmtr_mlt(MAT *m1, MAT *m2, MAT *out) { /* out <- m1 m2' */ if (m1->n != m2->n) ErrMsg(ER_IMPOSVAL, "mmtr_mlt non-matching m arrays"); out = m_zero(m_resize(out, m1->m, m2->m)); if (! gl_blas) { for (int i = 0; i < m1->m; i++) for (int j = 0; j < m2->m; j++) for (int k = 0; k < m1->n; k++) ME(out, i, j) += ME(m1, i, k) * ME(m2, j, k); } else { double alpha = 1.0, beta = 0.0; F77_CALL(dgemm)("N", "T", (int *) &(m1->m), (int *) &(m2->m), (int *) &(m1->n), &alpha, m1->v, (int *)&(m1->m), m2->v, (int *)&(m2->m), &beta, out->v, (int *) &(m1->m) FCONE FCONE); } return(out); } MAT *ms_mltadd(MAT *m1, MAT *m2, double s, MAT *out) { /* out <- m1 + s * m2 */ /* return m1 + s * m2 */ if (m1->m != m2->m || m1->n != m2->n) ErrMsg(ER_IMPOSVAL, "ms_mltadd: dimension mismatch"); out = m_resize(out, m1->m, m1->n); for (int j = 0; j < m1->n; j++) for (int i = 0; i < m1->m; i++) ME(out, i, j) = ME(m1, i, j) + s * ME(m2, i, j); return(out); } MAT *sm_mlt(double s, MAT *m1, MAT *out) { /* out <- s * m1 */ out = m_resize(out, m1->m, m1->n); for (int j = 0; j < m1->n; j++) for (int i = 0; i < m1->m; i++) ME(out, i, j) = s * ME(m1, i, j); return(out); } MAT *m_add(MAT *m1, MAT *m2, MAT *out) { /* out <- m1 + m2 */ if (m1->m != m2->m || m1->n != m2->n) ErrMsg(ER_IMPOSVAL, "m_add size mismatch"); out = m_resize(out, m1->m, m1->n); for (int j = 0; j < m1->n; j++) for (int i = 0; i < m1->m; i++) ME(out, i, j) = ME(m1, i, j) + ME(m2, i, j); return(out); } MAT *m_sub(MAT *m1, MAT *m2, MAT *out) { /* out <- m1 - m2 */ if (m1->m != m2->m || m1->n != m2->n) ErrMsg(ER_IMPOSVAL, "m_sub size mismatch"); out = m_resize(out, m1->m, m1->n); for (int j = 0; j < m1->n; j++) for (int i = 0; i < m1->m; i++) ME(out, i, j) = ME(m1, i, j) - ME(m2, i, j); return(out); } /* 4: matrix factorisation, solving systems of equations */ MAT *CHfactor(MAT *m, PERM *piv, int *info) { if (m->m != m->n) Rf_error("CHfactor: 'm' must be a square matrix"); for (int i = 1; i < m->m; i++) for (int j = 0; j < i; j++) ME(m, i, j) = 0.0; /* zero lower triangle of Fortran order */ if (piv == PNULL) { /* Choleski: */ F77_CALL(dpotrf)("Upper", (int *)&(m->n), m->v, (int *)&(m->n), info, (FC_LEN_T) 5); if (*info != 0) { if (*info > 0 && DEBUG_COV) Rf_warning("the leading minor of order %d is not positive definite", *info); if (*info < 0) Rf_error("argument %d of Lapack routine %s had invalid value", -(*info), "dpotrf"); } } else { /* LDL': */ if (piv->size != m->n) Rf_error("CHfactor: 'piv' must have dimension equal to m->n"); double w, *work; /* first query for size of work, then allocate work, then factorize m: */ int lwork = -1; F77_CALL(dsytrf)("Upper", (int *)&(m->n), m->v, (int *)&(m->n), (int *) piv->pe, &w, &lwork, info, (FC_LEN_T) 5); lwork = (int) w; work = emalloc(lwork * sizeof(double)); F77_CALL(dsytrf)("Upper", (int *)&(m->n), m->v, (int *)&(m->n), (int *) piv->pe, work, &lwork, info, (FC_LEN_T) 5); efree(work); if (*info != 0) { if (*info > 0 && DEBUG_COV) Rf_warning("D[%d,%d] is exactly zero, meaning that D is singular", *info, *info); if (*info < 0) Rf_error("argument %d of Lapack routine %s had invalid value", -(*info), "dsytrf"); } } return(m); } MAT *CHsolve(MAT *m, MAT *b, MAT *out, PERM *piv) { /* solve A X = B after factorizing A */ int info; if (m->m != m->n) Rf_error("CHsolve: 'm' must be a square matrix"); if (m->m != b->m) Rf_error("CHsolve: b does not match m"); out = m_copy(b, out); /* column-major */ if (piv == PNULL) /* Choleski */ F77_CALL(dpotrs)("Upper", (int *) &(m->m), (int *) &(b->n), m->v, (int *) &(m->m), out->v, (int *) &(m->m), &info, (FC_LEN_T) 5); else /* LDL' */ F77_CALL(dsytrs)("Upper", (int *) &(m->m), (int *) &(b->n), m->v, (int *) &(m->m), piv->pe, out->v, (int *) &(m->m), &info, (FC_LEN_T) 5); if (info < 0) Rf_error("CHsolve: argument %d of Lapack routine %s had invalid value", -info, piv == NULL ? "dpotrs" : "dsytrs"); return(out); } VEC *CHsolve1(MAT *m, VEC *b, VEC *out, PERM *piv) { /* solve A x = b after factorizing A */ int one = 1, info; if (m->m != m->n) Rf_error("CHsolve1: 'm' must be a square matrix"); if (m->m != b->dim) Rf_error("CHsolve1: vector b does not match m"); out = v_copy(b, out); if (piv == PNULL) F77_CALL(dpotrs)("U", (int *) &(m->m), (int *) &one, m->v, (int *) &(m->m), out->ve, (int *) &(m->m), &info FCONE); else F77_CALL(dsytrs)("L", (int *) &(m->m), (int *) &one, m->v, (int *) &(m->m), piv->pe, out->ve, (int *) &(m->m), &info FCONE); if (info < 0) Rf_error("CHsolve1: argument %d of Lapack routine %s had invalid value", -info, piv == NULL ? "dpotrs" : "dsytrs"); return(out); } MAT *m_inverse(MAT *in, int *info) { /* out <- in^{-1} */ PERM *piv = px_resize(PNULL, in->m); in = CHfactor(in, piv, info); if (*info != 0) { /* singular */ px_free(piv); return(in); } MAT *rhs = m_zero(m_resize(MNULL, in->m, in->m)); for (int i = 0; i < rhs->m; i++) ME(rhs, i, i) = 1.0; rhs = CHsolve(in, rhs, rhs, piv); in = m_copy(rhs, in); m_free(rhs); px_free(piv); return(in); } gstat/src/s.h0000644000176200001440000000024615060550314012577 0ustar liggesusersvoid s_gstat_error(const char *mess, int level); void s_gstat_warning(const char *mess); double r_normal(void); double r_uniform(void); extern int do_print_progress; gstat/src/sem.h0000644000176200001440000000125615060550314013123 0ustar liggesusers/* sem.c */ #ifndef SEM_H # define SEM_H /* avoid multiple inclusion */ #if defined(__cplusplus) extern "C" { #endif int calc_variogram(VARIOGRAM *v, const char *fname); void fill_cutoff_width(DATA *data, VARIOGRAM *v); int is_directional(VARIOGRAM *v); void fprint_header_vgm(FILE *f, const DATA *d1, const DATA *d2, const SAMPLE_VGM *ev); void fprint_sample_vgm(const SAMPLE_VGM *ev); #if defined(__cplusplus) } #endif #define LONGSIZE (sizeof(unsigned long)) #define MAX_NH (1UL << (4 * LONGSIZE)) #define TO_NH(x,y) (x + ((unsigned long)y << (4 * LONGSIZE))) #define HIGH_NH(x) (x / (1UL << (4 * LONGSIZE))) #define LOW_NH(x) (x % (1UL << (4 * LONGSIZE))) #endif /* SEM_H */ gstat/src/gcdist.h0000644000176200001440000000011115060550314013601 0ustar liggesusersdouble gstat_gcdist(double lon1, double lon2, double lat1, double lat2); gstat/src/data.c0000644000176200001440000006131215060550314013242 0ustar liggesusers/* * data.c: basic i/o routines on DATA structure */ #include /* sqrt */ #include /* memcpy */ #include "defs.h" #include "data.h" #include "mapio.h" #include "userio.h" #include "utils.h" #include "block.h" #include "debug.h" #include "glvars.h" #include "defaults.h" #include "mtrx.h" #include "lm.h" /* free_lm() */ #include "gls.h" /* free_glm() */ #include "nsearch.h" #include "gcdist.h" const DATA_TYPE data_types[] = { { DATA_UNKNOWN, "Unknown file type"}, { DATA_ASCII_TABLE, "Ascii table file"}, { DATA_EAS, "GeoEAS file"}, { DATA_IDRISI_VEC, "Idrisi ascii .vec"}, { DATA_IDRISI32_VEC, "Idrisi binary .vct"}, { DATA_IDRISI_BIN, "Idrisi binary .img"}, { DATA_IDRISI_ASCII, "Idrisi ascii .img"}, { DATA_IDRISI32_BIN, "Idrisi binary .rst"}, { DATA_IDRISI32_ASCII, "Idrisi ascii .rst"}, { DATA_GRIDASCII, "ArcInfo gridascii"}, { DATA_GRIDFLOAT, "ArcInfo gridfloat"}, { DATA_CSF, "PCRaster map"}, { DATA_T2, "T2 map"}, { DATA_ERMAPPER, "ER-Mapper file"}, { DATA_GNUPLOT, "Gnuplot binary"}, { DATA_GMT, "GMT netCDF format" }, { DATA_SURFER_DSAA, "Surfer DSAA ascii grid" }, { DATA_GSLIB, "GSLIB grid" }, { DATA_GRASS, "GRASS site list" }, { DATA_GRASS_GRID, "GRASS raster" }, { DATA_GDAL, "GDAL raster map" } }; static void calc_data_mean_std(DATA *d); static void grid_push_point(DATA *d, DPOINT *p, int adjust_to_gridcentrs); static double point_norm_1D(const DPOINT *p); static double point_norm_2D(const DPOINT *p); static double point_norm_3D(const DPOINT *p); static double pp_norm_1D(const DPOINT *a, const DPOINT *b); static double pp_norm_2D(const DPOINT *a, const DPOINT *b); static double pp_norm_3D(const DPOINT *a, const DPOINT *b); /* great circle distances: */ static double point_norm_gc(const DPOINT *p); static double pp_norm_gc2(const DPOINT *a, const DPOINT *b); static double pb_norm_gc2(const DPOINT *where, BBOX bbox); static void logprint_data_header(const DATA *d); static DPOINT min, max; static int fix_minmax = 0; const POLY_NM polynomial[N_POLY] = {{ POLY_X, "x", 1, X_BIT_SET}, { POLY_Y, "y", 1, Y_BIT_SET}, { POLY_Z, "z", 1, Z_BIT_SET}, { POLY_X2, "x2", 2, X_BIT_SET}, { POLY_Y2, "y2", 2, Y_BIT_SET}, { POLY_Z2, "z2", 2, Z_BIT_SET}, { POLY_XY, "xy", 2, Y_BIT_SET}, { POLY_XZ, "xz", 2, Z_BIT_SET}, { POLY_YZ, "yz", 2, Z_BIT_SET}, { POLY_X3, "x3", 3, X_BIT_SET}, { POLY_Y3, "y3", 3, Y_BIT_SET}, { POLY_Z3, "z3", 3, Z_BIT_SET}, { POLY_X2Y, "x2y", 3, Y_BIT_SET}, { POLY_XY2, "xy2", 3, Y_BIT_SET}, { POLY_X2Z, "x2z", 3, Z_BIT_SET}, { POLY_XZ2, "xz2", 3, Z_BIT_SET}, { POLY_Y2Z, "y2z", 3, Z_BIT_SET}, { POLY_YZ2, "yz2", 3, Z_BIT_SET}}; void set_norm_fns(DATA *d) { if (d->mode & Z_BIT_SET) { d->point_norm = point_norm_3D; d->pp_norm2 = pp_norm_3D; d->pb_norm2 = pb_norm_3D; } else if (d->mode & Y_BIT_SET) { if (gl_longlat) { d->point_norm = point_norm_gc; d->pp_norm2 = pp_norm_gc2; d->pb_norm2 = pb_norm_gc2; /* if (gl_split != DEF_split) pr_warning("longlat data cannot do quadtree, setting split to %d", INT_MAX); */ gl_split = INT_MAX; } else { d->point_norm = point_norm_2D; d->pp_norm2 = pp_norm_2D; d->pb_norm2 = pb_norm_2D; } } else { d->point_norm = point_norm_1D; d->pp_norm2 = pp_norm_1D; d->pb_norm2 = pb_norm_1D; } } void init_data_minmax(void) { fix_minmax = 0; set_mv_double(&(min.x)); set_mv_double(&(min.y)); set_mv_double(&(min.z)); set_mv_double(&(max.x)); set_mv_double(&(max.y)); set_mv_double(&(max.z)); } void setup_data_minmax(DATA *d) { if (fix_minmax) ErrMsg(ER_NULL, "min and max should be fixed"); if (d->id == 0) { min.x = d->minX; min.y = d->minY; min.z = d->minZ; max.x = d->maxX; max.y = d->maxY; max.z = d->maxZ; } else { min.x = MIN(min.x, d->minX); min.y = MIN(min.y, d->minY); min.z = MIN(min.z, d->minZ); max.x = MAX(max.x, d->maxX); max.y = MAX(max.y, d->maxY); max.z = MAX(max.z, d->maxZ); } } DATA *get_area_centre(DATA *area, DATA *d) { int i, j; DPOINT p; d->n_list = d->n_max = 0; d->variable = area->variable; d->x_coord = area->x_coord; d->y_coord = area->y_coord; d->z_coord = area->z_coord; d->type = data_types[area->type.type]; d->fname = ""; p.x = p.y = p.z = 0.0; p.u.stratum = 0; d->n_X = area->n_X; if (area->n_X > 0) { p.X = (double *) emalloc(area->n_X * sizeof(double)); d->colX = (int *) emalloc(area->n_X * sizeof(int)); for (j = 0; j < area->n_X; j++) { p.X[j] = 0.0; d->colX[j] = area->colX[j]; } } else { p.X = NULL; d->colX = NULL; } for (i = 0; i < area->n_list; i++) { p.x += area->list[i]->x; p.y += area->list[i]->y; p.z += area->list[i]->z; for (j = 0; j < area->n_X; j++) p.X[j] += area->list[i]->X[j]; } p.x /= area->n_list; p.y /= area->n_list; p.z /= area->n_list; for (j = 0; j < area->n_X; j++) p.X[j] /= area->n_list; p.attr = 0.0; printlog("prediction centre at x=%g, y=%g, z=%g",p.x,p.y,p.z); if (d->n_X) { printlog(" where x0 averages ["); for (j = 0; j < area->n_X; j++) printlog("%g%s", p.X[j], jn_X-1?",":""); printlog("]\n"); } else printlog("\n"); push_point(d, &p); d->minX = d->maxX = p.x; d->minY = d->maxY = p.y; d->minZ = d->maxZ = p.z; d->mode = area->mode; d->n_X = area->n_X; calc_data_mean_std(d); return d; } void centre_area(DATA *area) { int i; DPOINT p; p.x = p.y = p.z = 0.0; for (i = 0; i < area->n_list; i++) { p.x += area->list[i]->x; p.y += area->list[i]->y; p.z += area->list[i]->z; } p.x /= area->n_list; p.y /= area->n_list; p.z /= area->n_list; for (i = 0; i < area->n_list; i++) { area->list[i]->x -= p.x; area->list[i]->y -= p.y; area->list[i]->z -= p.z; } area->minX -= p.x; area->maxX -= p.x; area->minY -= p.y; area->maxY -= p.y; area->minZ -= p.z; area->maxZ -= p.z; } static void calc_data_mean_std(DATA *d) { /* * Calculates fields mean and std of d with mean and standard dev. (/(n-1)) */ int i; if (d->standard == 2) { /* we did this already.. */ for (i = 0; i < d->n_list; i++) d->list[i]->attr *= d->std; } d->mean = 0.0; d->std = 0.0; if (d->n_list <= 0) { pr_warning("calc_data_mean_std: n_list <= 0: %d", d->n_list); return; } for (i = 0; i < d->n_list; i++) d->mean += d->list[i]->attr; d->mean /= d->n_list; if (d->n_list == 1) return; for (i = 0; i < d->n_list; i++) d->std += SQR(d->list[i]->attr - d->mean); d->std = sqrt((d->std)/(d->n_list - 1)); if (d->standard > 0) { for (i = 0; i < d->n_list; i++) d->list[i]->attr /= d->std; d->standard = 2; } return; } void setup_polynomial_X(DATA *d) { int i, j, degree; degree = d->polynomial_degree; if (degree < 0 || degree > 3) ErrMsg(ER_SYNTAX, "polynomial degree n, `d=n', should be in [0..3]"); for (i = 1; i <= degree; i++) for (j = 0; j < N_POLY; j++) if (polynomial[j].degree == i && (d->mode & polynomial[j].mode)) data_add_X(d, polynomial[j].poly_nr); } void data_add_X(DATA *d, int col) { int i; for (i = 0; d->id != ID_OF_VALDATA && i < d->n_X; i++) if (d->colX[i] == col) ErrMsg(ER_IMPOSVAL, "X-variable: column appears twice"); d->n_X++; d->colX = (int *) erealloc(d->colX, d->n_X * sizeof(int)); d->colX[d->n_X - 1] = col; } void calc_polynomials(DATA *d) { int i, j, do_block; #define CHECK_BITX if(!(d->mode & X_BIT_SET)) ErrMsg(ER_VARNOTSET,"x coordinate not set") #define CHECK_BITY if(!(d->mode & Y_BIT_SET)) ErrMsg(ER_VARNOTSET,"y coordinate not set") #define CHECK_BITZ if(!(d->mode & Z_BIT_SET)) ErrMsg(ER_VARNOTSET,"z coordinate not set") for (j = 0; j < d->n_X; j++) { if (d->colX[j] < -1) { switch(d->colX[j]) { case POLY_X: case POLY_X2: case POLY_X3: CHECK_BITX; break; case POLY_Y: case POLY_Y2: case POLY_Y3: CHECK_BITY; break; case POLY_Z: case POLY_Z2: case POLY_Z3: CHECK_BITZ; break; case POLY_XY: CHECK_BITX; CHECK_BITY; break; case POLY_XZ: CHECK_BITX; CHECK_BITZ; break; case POLY_YZ: CHECK_BITY; CHECK_BITZ; break; case POLY_X2Y: CHECK_BITX; CHECK_BITY; break; case POLY_XY2: CHECK_BITX; CHECK_BITY; break; case POLY_X2Z: CHECK_BITX; CHECK_BITZ; break; case POLY_XZ2: CHECK_BITX; CHECK_BITZ; break; case POLY_Y2Z: CHECK_BITY; CHECK_BITZ; break; case POLY_YZ2: CHECK_BITY; CHECK_BITZ; break; default: ErrMsg(ER_IMPOSVAL, "unknown polynomial number"); break; } } } for (j = do_block = 0; !do_block && j < d->n_X; j++) do_block = (d->colX[j] < -1); for (i = 0; do_block && i < d->n_list; i++) /* bl is a single point-list if IS_POINT(d->list[i]) */ calc_polynomial_point(d, d->list[i]); } void calc_polynomial_point(DATA *d, DPOINT *pt) { static DATA *bl = NULL; int j, k; bl = block_discr(bl, get_block_p(), pt); for (j = 0; j < d->n_X; j++) { if (d->colX[j] < -1) /* do eventual block averaging here: */ for (k = 0, pt->X[j] = 0.0; k < bl->n_list; k++) pt->X[j] += bl->list[k]->u.weight * calc_polynomial(bl->list[k], d->colX[j]); } } double calc_polynomial(DPOINT *p, int colX) { /* * fills polynomial field (x, y, z, x2, y2, z2, xy, xz, yz) * with standardized values * * Counting on the following behaviour: * first, all data + valdata are passed through setup_data_minmax(), in * order to get the right values into min and max; * then, the routines calc_polynomial* are called. * changing min or max inbetween would result in rubbish. */ double x, y, z; if (fix_minmax == 0) fix_minmax = 1; /* stop touching it */ x = ((min.x==max.x) ? p->x : (p->x - min.x)/(max.x - min.x)); y = ((min.y==max.y) ? p->y : (p->y - min.y)/(max.y - min.y)); z = ((min.z==max.z) ? p->z : (p->z - min.z)/(max.z - min.z)); switch(colX) { case POLY_X: return (x); case POLY_X2: return (x * x); case POLY_X3: return (x * x * x); case POLY_Y: return (y); case POLY_Y2: return (y * y); case POLY_Y3: return (y * y * y); case POLY_Z: return (z); case POLY_Z2: return (z * z); case POLY_Z3: return (z * z * z); case POLY_XY: return (x * y); case POLY_XZ: return (x * z); case POLY_YZ: return (y * z); case POLY_X2Y: return (x * x * y); case POLY_XY2: return (x * y * y); case POLY_X2Z: return (x * x * z); case POLY_XZ2: return (x * z * z); case POLY_Y2Z: return (y * y * z); case POLY_YZ2: return (y * z * z); default: ErrMsg(ER_IMPOSVAL, "unknown polynomial number"); break; } return 1.0; /* will never happen */ } void free_data(DATA *d) { int i; assert(d); if (DEBUG_FORCE) /* let atexit(qtree_print) do it's job... */ return; if (d->P_base) { /* segmented: */ efree(d->P_base); if (d->n_X && d->X_base) efree(d->X_base); } else { /* non-segmented */ if (d->list) /* CW at all MV on output both P_base and d_list are 0 */ for (i = d->n_list - 1; i >= 0; i--) pop_point(d, i); } if (d->sel != NULL && d->sel != d->list) efree(d->sel); if (d->list) efree(d->list); if (d->colX) efree(d->colX); if (d->qtree_root != NULL) qtree_free(d->qtree_root); if (d->lm) free_lm(d->lm); if (d->glm) free_glm(d->glm); if (d->grid) free_data_gridmap(d->grid); if (d->point_ids != NULL) { for (i = d->n_list - 1; i >= 0; i--) efree(d->point_ids[i]); } if (d->beta != NULL) efree(d->beta); efree(d); return; } DATA *init_one_data(DATA *data) { if (data == NULL) data = (DATA *) emalloc(sizeof(DATA)); data->colnvalue = 0; data->colnx = 0; data->colny = 0; data->colnz = 0; data->colns = 0; data->coln_id = 0; data->colnvariance = 0; data->n_list = -1; data->n_max = -1; data->nsim_at_data = 0; data->init_max = 0; data->n_sel = -1; data->n_sel_max = 0; data->id = -1; data->log = 0; data->standard = 0; data->what_is_u = U_UNKNOWN; data->centre = 0; data->region = 0; data->mode = 0; data->dummy = 0; data->force = 0; data->vdist = 0; data->square = 0; data->average = 0; data->every = 1; data->offset = 0; data->prob = 1.0; data->skip = 0; data->lambda = 1.0; data->calc_residuals = 1; data->is_residual = 0; data->polynomial_degree = 0; data->n_averaged = 0; data->fname = NULL; data->type = data_types[DATA_UNKNOWN]; data->variable = NULL; data->x_coord = NULL; data->y_coord = NULL; data->z_coord = NULL; data->s_coord = NULL; data->V_coord = NULL; data->point_ids = NULL; data->id_name = NULL; data->mean = 0.0; data->std = 0.0; data->sel_rad = DBL_MAX; data->dX = DBL_MAX; data->sel_max = INT_MAX; data->sel_min = 0; data->oct_max = 0; /* default: don't use octant search */ data->oct_filled = 1; /* in case of no octants */ data->list = NULL; data->sel = NULL; data->P_base = NULL; data->X_base = NULL; data->lm = NULL; data->glm = NULL; data->n_merge = 0; data->mtbl = NULL; data->n_X = 0; data->colX = NULL; data_add_X(data, 0); /* add intercept -->> UK, defaulting to ordinary kriging */ data->qtree_root = NULL; data->grid = NULL; data->togrid = 0; data->point_norm = NULL; data->pp_norm2 = NULL; data->pb_norm2 = NULL; data->beta = NULL; data->Category = NULL; data->var_fn_str = NULL; data->nscore_table = NULL; data->variance_fn = NULL; set_mv_double(&(data->Icutoff)); set_mv_double(&(data->mv)); return data; } void print_data(const DATA *d, int list) { int i; printlog("\ndata id: %d\n", d->id); if (! is_mv_double(&(d->Icutoff))) printlog("ind. cutoff: %g\n", d->Icutoff); if (d->Category) printlog("category: %s\n", d->Category); if (! is_mv_double(&(d->mv))) printlog("missing value: %g\n", d->mv); if (d->beta) { printlog("beta: ["); for (i = 0; i < d->beta->size; i++) printlog(" %g", d->beta->val[i]); printlog("]\n"); } printlog("sel_radius %g sel_max %d sel_min %d\n", d->sel_rad, d->sel_max, d->sel_min); if (d->n_X > 0) { for (i = 0; i < d->n_X; i++) { printlog("X[%d]: ", i); if (d->colX[i] == 0) printlog("intercept "); if (d->colX[i] < 0) printlog("%s ", POLY_NAME(d->colX[i])); if (d->colX[i] > 0) printlog("%d ", d->colX[i]); } printlog("\n"); } printlog("n_list %d n_max %d n_sel %d\n", d->n_list, d->n_max, d->n_sel); if (list) { printlog("current list:\n"); logprint_data_header(d); if (d->n_list) { for (i = 0; i < d->n_list; i++) logprint_point(d->list[i], d); } else printlog("\n"); } else { printlog("current selection:\n"); logprint_data_header(d); if (d->n_sel) { for (i = 0; i < d->n_sel; i++) logprint_point(d->sel[i], d); } else printlog("\n"); } } static void logprint_data_header(const DATA *d) { printlog("\nidx x:%s;", d->x_coord); printlog("y:%s;", d->y_coord); printlog("z:%s;", d->z_coord); printlog("v:%s;\n", d->variable); } void logprint_point(const DPOINT *p, const DATA *d) { /* * print contents of p (non zero: use d) to log device */ int j; printlog("%3d ", GET_INDEX(p)); if (d->mode & X_BIT_SET) printlog("x: %4g ", p->x); if (d->mode & Y_BIT_SET) printlog("y: %4g ", p->y); if (d->mode & Z_BIT_SET) printlog("z: %4g ", p->z); if (d->mode & V_BIT_SET) printlog("v: %4g ", p->attr); switch (d->what_is_u) { case U_UNKNOWN: break; case U_ISDIST: printlog("dist: %4g ", sqrt(p->u.dist2)); break; case U_ISWEIGHT: printlog("weight: %4g ", p->u.weight); break; case U_ISSTRATUM: printlog("stratum: %d ", p->u.stratum); break; } for (j = 0; j < d->n_X; j++) printlog("X[%d]: %6g ", j, p->X[j]); if (d->point_ids) { printlog("ID: %s ", d->point_ids[GET_INDEX(p)]); } printlog("\n"); } void push_point(DATA *d, const DPOINT *p) { int i; /* * add one point p to the data structure d * [counts on the fact that erealloc(NULL,size) calls malloc(size)] */ if (d->prob < 1.0) { ErrMsg(ER_IMPOSVAL, "sample in R, not in gstat"); } else if (d->every > 1) { /* EJP: WAS if ((d->n_list + d->offset) % d->every != 0) */ if ((d->n_list + d->skip + 1 - d->offset) % d->every != 0) { d->skip++; return; } } if (d->n_list < 0) { message("push_point: n_list < 0: %d (%s)\n", d->n_list, d->fname); ErrMsg(ER_NULL, "push_point(): n_list < 0"); } if (d->n_max < 0) { message("push_point: n_max < 0: %d (%s)\n", d->n_max, d->fname); ErrMsg(ER_NULL, "push_point(): n_max < 0"); } /* * use rather large blocks of memory for points: */ if (d->n_list == d->n_max) { /* increase memory: */ /* resize d->n_max: */ if (d->list == NULL) { if (d->init_max > 0) d->n_max = d->init_max; else d->n_max = MAX_DATA; } else { d->n_max += MAX_DATA; /* or else: d->n_max *= 2; */ if (d->init_max > 0 && DEBUG_DUMP) pr_warning("exceeding nmax, now %d", d->n_max); } /* resize blocked memory bases P_base and X_base, and list: */ d->P_base = (DPOINT *) erealloc(d->P_base, d->n_max * sizeof(DPOINT)); if (d->n_X > 0) { if (intercept_only(d)) { /* create a single instance of the X row: */ if (d->X_base == NULL) { /* first time */ d->X_base = (double *) emalloc(sizeof(double)); d->X_base[0] = 1.0; } } else /* each point needs it's own X row: */ d->X_base = (double *) erealloc(d->X_base, d->n_max * d->n_X * sizeof(double)); } d->list = (DPOINT **) erealloc(d->list, d->n_max * sizeof(DPOINT *)); /* * realloc'ing may have moved P_base or X_base, so reset all pointers: */ for (i = 0; i < d->n_list; i++) { d->list[i] = &(d->P_base[i]); if (d->n_X) { if (intercept_only(d)) /* d->P_base[i].X = d->X_base; */ d->list[i]->X = d->X_base; else /* d->P_base[i].X = &(d->X_base[d->n_X * i]); */ d->list[i]->X = &(d->X_base[d->n_X * i]); } else /* d->P_base[i].X = NULL; */ d->list[i]->X = NULL; } for (i = d->n_list; i < d->n_max; i++) d->list[i] = NULL; /* for savety */ /* rebuild qtree_root: this is avoided by setting nmax */ qtree_rebuild(d); datagrid_rebuild(d, 0); } /* * copy information on current point into P_base and X_base arrays: */ #ifdef SLOW d->P_base[d->n_list] = *p; #else memcpy(&(d->P_base[d->n_list]), p, sizeof(DPOINT)); #endif if (d->n_X > 0 && !intercept_only(d)) { #define SLOW 1 #ifdef SLOW /* slow... copy X row */ for (i = 0; i < d->n_X; i++) d->X_base[d->n_X * d->n_list + i] = p->X[i]; #else memcpy(&(d->X_base[d->n_X * d->n_list]), p->X, d->n_X * sizeof(double)); #endif } /* * adjust list and X pointer to this copy: */ d->list[d->n_list] = &(d->P_base[d->n_list]); if (intercept_only(d)) d->list[d->n_list]->X = d->X_base; else d->list[d->n_list]->X = &(d->X_base[d->n_X * d->n_list]); SET_INDEX(d->list[d->n_list], d->n_list); qtree_push_point(d, d->list[d->n_list]); grid_push_point(d, d->list[d->n_list], 0); /* * this will be ignored during read_gstat_data(), the tree structure will * be filled only during the first call to qtree_quick_select(). * Later on, it does have effect if simulated points are pushed. */ d->n_list++; return; } void pop_point(DATA *d, int list_nr) /* * removes DPOINT list_nr, and makes it point to the last DPOINT * also changes d->n_list */ { if (list_nr >= d->n_list) { message("pop_point: list_nr >= n_list: %d %d\n", list_nr, d->n_list); ErrMsg(ER_NULL, "pop_point():"); } qtree_pop_point(d->list[list_nr], d); if (d->P_base == NULL) { /* * free this one: */ if (d->n_X > 0 && !(intercept_only(d))) efree(d->list[list_nr]->X); efree(d->list[list_nr]); } /* * change the last pointer to this: */ if (list_nr != d->n_list - 1) /* we didn't pop the last: */ d->list[list_nr] = d->list[d->n_list - 1]; d->list[d->n_list - 1] = NULL; d->n_list--; } static double point_norm_1D(const DPOINT *p) { /* calculate norm of vector (p->x) */ return fabs(p->x); } static double point_norm_2D(const DPOINT *p) { /* calculate norm of vector (p->x, p->y, p->z) */ return sqrt(p->x * p->x + p->y * p->y); } static double point_norm_3D(const DPOINT *p) { /* calculate norm of vector (p->x, p->y, p->z) */ return sqrt(p->x * p->x + p->y * p->y + p->z * p->z); } static double pp_norm_1D(const DPOINT *a, const DPOINT *b) { /* calculate 2-norm of vector (p->x) */ double dx; dx = a->x - b->x; return dx * dx; } static double pp_norm_2D(const DPOINT *a, const DPOINT *b) { /* calculate 2-norm of vector (p->x, p->y) */ double dx, dy; dx = a->x - b->x; dy = a->y - b->y; return dx * dx + dy * dy; } static double pp_norm_3D(const DPOINT *a, const DPOINT *b) { /* calculate 2-norm of vector (p->x, p->y, p->z) */ double dx, dy, dz; dx = a->x - b->x; dy = a->y - b->y; dz = a->z - b->z; return dx * dx + dy * dy + dz * dz; } static double point_norm_gc(const DPOINT *p) { /* calculate norm of vector (p->x, p->y, p->z) */ ErrMsg(ER_IMPOSVAL, "long/lat: this function should never be called?"); return gstat_gcdist(p->x, 0.0, p->y, 0.0); } double pp_norm_gc(const DPOINT *a, const DPOINT *b) { return gstat_gcdist(a->x, b->x, a->y, b->y); /* dist */ } static double pp_norm_gc2(const DPOINT *a, const DPOINT *b) { return pow(gstat_gcdist(a->x, b->x, a->y, b->y), 2.0); /* squared dist */ } static double pb_norm_gc2(const DPOINT *where, BBOX bbox) { /* ErrMsg(ER_IMPOSVAL, "great circle distances cannot be combined with quadtree"); */ return 0.0; /* always inside, no quadtree */ } int coordinates_are_equal(const DATA *a, const DATA *b) { int i, equal = 1 /* try to disprove equality */; if (a->n_list != b->n_list) return 0; i = 0; while (equal && i < a->n_list) { equal = ((a->list[i]->x == b->list[i]->x) && (a->list[i]->y == b->list[i]->y) && (a->list[i]->z == b->list[i]->z)); i++; } return equal; } int push_to_merge_table(DATA *d, int to_var, int col_this_X, int col_other_X) { int i; DATA **data; data = get_gstat_data(); if (to_var >= d->id) { /* should not occur by construction */ pr_warning("use push_to_merge_table only backwards (%d >= %d)", to_var, d->id); return 1; } if (col_this_X >= d->n_X || col_other_X >= data[to_var]->n_X) { pr_warning("merge error: variable out of range"); return 1; } if (d->beta || data[to_var]->beta) { pr_warning("cannot merge to or from fixed (known) parameters"); return 1; } for (i = 0; i < d->n_merge; i++) { if (col_this_X == d->mtbl[i].col_this_X) { pr_warning("merge error: cannot merge column twice"); return 1; } } d->n_merge++; d->mtbl = (MERGE_TABLE *) erealloc(d->mtbl, d->n_merge * sizeof (MERGE_TABLE)); d->mtbl[d->n_merge - 1].to_var = to_var; d->mtbl[d->n_merge - 1].col_this_X = col_this_X; d->mtbl[d->n_merge - 1].col_other_X = col_other_X; return 0; } DATA_GRIDMAP *gsetup_gridmap(double x_ul, double y_ul, double cellsizex, double cellsizey, unsigned int rows, unsigned int cols) { DATA_GRIDMAP *t; int i, j; t = (DATA_GRIDMAP *) emalloc(sizeof(DATA_GRIDMAP)); t->x_ul = x_ul; t->y_ul = y_ul; t->cellsizex = cellsizex; t->cellsizey = cellsizey; t->rows = rows; t->cols = cols; t->dpt = (DPOINT ***) emalloc(t->rows * sizeof(DPOINT **)); t->grid_base = (DPOINT **) emalloc(t->rows * t->cols * sizeof(DPOINT *)); for (i = 0; i < t->rows; i++) t->dpt[i] = &(t->grid_base[i * t->cols]); for (i = 0; i < t->rows; i++) for (j = 0; j < t->cols; j++) t->dpt[i][j] = NULL; return t; } void free_data_gridmap(DATA_GRIDMAP *t) { efree(t->grid_base); efree(t->dpt); efree(t); } static void grid_push_point(DATA *d, DPOINT *p, int adjust_to_gridcentres) { int row, col; if (d->grid) { row = floor((d->grid->y_ul - p->y)/d->grid->cellsizey); col = floor((p->x - d->grid->x_ul)/d->grid->cellsizex); row = MAX(0, row); row = MIN(row, d->grid->rows - 1); col = MAX(0, col); col = MIN(col, d->grid->cols - 1); d->grid->dpt[row][col] = p; if (adjust_to_gridcentres) { p->x = d->grid->x_ul + (col + 0.5) * d->grid->cellsizex; p->y = d->grid->y_ul - (row + 0.5) * d->grid->cellsizey; } } return; } void datagrid_rebuild(DATA *d, int adjust_to_gridcentres) { int i; if (d->grid) for (i = 0; i < d->n_list; i++) grid_push_point(d, d->list[i], adjust_to_gridcentres); return; } double data_block_diagonal(DATA *data) { DPOINT a, b; a.x = data->maxX; b.x = data->minX; if (data->mode & Y_BIT_SET) { a.y = data->maxY; b.y = data->minY; } else { a.y = 0.0; b.y = 0.0; } if (data->mode & Z_BIT_SET) { a.z = data->maxZ; b.z = data->minZ; } else { a.z = 0.0; b.z = 0.0; } return sqrt(data->pp_norm2(&a, &b)); } D_VECTOR *push_d_vector(double d, D_VECTOR *v) { if (v == NULL) { v = (D_VECTOR *) emalloc(sizeof(D_VECTOR)); v->size = v->max_size = 0; v->val = NULL; } v->size++; if (v->size > v->max_size) { /* (re)allocate v->val */ if (v->val == NULL) v->val = (double *) emalloc(v->size * sizeof(double)); else v->val = (double *) erealloc(v->val, v->size * sizeof(double)); v->max_size = v->size; } v->val[v->size - 1] = d; return v; } void free_d_vector(D_VECTOR *v) { if (v != NULL) { if (v->size > 0) efree(v->val); efree(v); } } int intercept_only(const DATA *d) { assert(d != NULL); return (d->n_X == 1 && d->colX[0] == 0); } double v_mu(double mu) { return mu; } double v_mu2(double mu) { return mu * mu; } double v_mu3(double mu) { return mu * mu * mu; } double v_bin(double mu) { return (mu * (1.0 - mu)); } double v_identity(double mu) { return 1.0; } gstat/src/vario_io.h0000644000176200001440000000156515060550314014151 0ustar liggesusersdouble sem_cov_ab(VARIOGRAM *v, DPOINT *a, DPOINT *b, int sem); /* covariance: */ #define COVARIANCE(v,a,b) ((IS_POINT(a) && IS_POINT(b) && !gl_longlat) ? \ (get_covariance(v,a->x - b->x,a->y - b->y, a->z - b->z)) : \ sem_cov_ab(v,a,b,0)) /* generalized covariance: */ #define GCV(v,a,b) ((IS_POINT(a) && IS_POINT(b) && !gl_longlat) ? \ (v->max_val - get_semivariance(v,a->x - b->x,a->y - b->y, a->z - b->z)) : \ (v->max_val - sem_cov_ab(v,a,b,1))) /* * CME is the measurement error-adjustment to GCV or COVARIANCE: * see Cressie, Statistics for Spatial Data, revised ed. 1993, * eq. 3.2.25-3.2.27, and page 379 */ #define CME(v,a,b,dist) ((IS_POINT(a) && IS_POINT(b) && \ (a == b || dist(a, b) == 0.0)) ? v->measurement_error : 0.0) #define GCV0(v,a,b,dist) (GCV(v,a,b) - CME(v,a,b,dist)) #define COVARIANCE0(v,a,b,dist) (COVARIANCE(v,a,b) - CME(v,a,b,dist)) gstat/src/defaults.h0000644000176200001440000000366015060550314014147 0ustar liggesusers#ifndef DEFAULTS_H #include /* INT_MAX */ #include /* DBL_EPSILON */ # define DEFAULTS_H /* avoid multiple inclusion */ #define DEF_alpha 0.0 #define DEF_beta 0.0 #define DEF_blas 1 #define DEF_bounds NULL #define DEF_coincide -1 #define DEF_choleski 1 #define DEF_cressie 0 #define DEF_cutoff -1.0 #define DEF_dots 500 #define DEF_fit 0 #define DEF_fit_limit 1.0E-5 #define DEF_fraction 0.33333 /* fraction of max_dist for def. cutoff */ #define DEF_gauss 1 #define DEF_gpterm NULL #define DEF_idp 2.0 #define DEF_intervals 15 /* default number of intervals */ #define DEF_is_pdf 0 /* default to cdf indicator simulation */ #define DEF_iter 200 #define DEF_iwidth -1.0 #define DEF_jgraph 0 #define DEF_lhs 0 #define DEF_longlat 0 #define DEF_n_marginals 0 #define DEF_nocheck 0 /* do check */ #define DEF_marginal_names NULL #define DEF_marginal_values NULL #define DEF_nblockdiscr 4 #define DEF_n_uk INT_MAX #define DEF_numbers 1 #define DEF_nsim 1 #define DEF_ofilename NULL #define DEF_order 0 #define DEF_plotweights 0 #define DEF_pairs 0 #define DEF_quantile 0.5 #define DEF_rowwise 1 #define DEF_rp 1 #define DEF_seed 0 #define DEF_sim_beta 0 #define DEF_sparse 0 #define DEF_spiral 0 #define DEF_split 4 #define DEF_sym_ev 0 #define DEF_table_size 0 #define DEF_tol_hor 180.0 #define DEF_tol_ver 180.0 #define DEF_gls_residuals 0 #define DEF_xvalid 0 #define DEF_zero (DBL_EPSILON * 10.0) #define DEF_zero_est 0 /* ZERO_DEFAULT */ #define DEF_zmap 0.0 #endif /* DEFAULTS_H */ gstat/src/debug.h0000644000176200001440000000412315060550314013421 0ustar liggesusers#ifndef DEBUG_H # define DEBUG_H /* avoid multiple inclusion */ extern int debug_level; /* * DEBUG macro's: */ #define DB_HELP (-1) /* print debug help */ #define DB_SILENT (0) #define DB_NORMAL (1UL << 0) #define DB_DUMP (1UL << 1) /* dump global variabels */ #define DB_FIT (1UL << 2) /* fit diagnostics */ #define DB_DATA (1UL << 3) /* drop data */ #define DB_SEL (1UL << 4) /* drop selection */ #define DB_COV (1UL << 5) /* drop covariances */ #define DB_ORDER (1UL << 6) /* order relation violation */ #define DB_FORCE (1UL << 7) /* print warning if neighbourhood selection */ #define DB_TRACE (1UL << 8) /* print numbers */ #define DB_BLOCK (1UL << 9) /* block discretization diagnostics (data) */ extern void printlog(const char *fmt, ...); #define DUMP(a); {if(debug_level & DB_DUMP) { printlog("%s", a); }} #define DEBUG_HELP (debug_level & DB_HELP) #define DEBUG_SILENT (debug_level == DB_SILENT) #define DEBUG_NORMAL (debug_level & DB_NORMAL) #define DEBUG_DUMP (debug_level & DB_DUMP) #define DEBUG_FIT (debug_level & DB_FIT) #define DEBUG_DATA (debug_level & DB_DATA) #define DEBUG_SEL (debug_level & DB_SEL) #define DEBUG_COV (debug_level & DB_COV) #define DEBUG_ORDER (debug_level & DB_ORDER) #define DEBUG_VGMFIT (debug_level & DB_ORDER) #define DEBUG_FORCE (debug_level & DB_FORCE) #define DEBUG_TRACE (debug_level & DB_TRACE) #define DEBUG_BLOCK (debug_level & DB_BLOCK) #define DEBUG_OPTIONS "\ # gstat debug option values:\n\ 0: no output, be silent (same as -s)\n\ 1: normal output (default value)\n\ 2: print all global variables and extended error messages\n\ 4: print OLS and WLS fit diagnostics\n\ 8: print all data\n\ 16: print every neighbourhood selection\n\ 32: print all covariance matrices, solutions, design matrices etc.\n\ 64: print variogram fit diagnostics and order relation violations\n\ 128: print warning on forced neighbourhoods\n\ 256: print current row,column or record number\n\ 512: print block discretization points (data)\n\ to combine options, sum their values -- 1023 invokes them all\n" #endif /* DEBUG_H */ gstat/src/defs.h0000644000176200001440000000072315060550314013256 0ustar liggesusers/* * provides some definitions */ #ifndef DEFS_H #define DEFS_H /* avoid multiple inclusion */ #include /* but assertions are off, by default */ #define CDECL /* empty */ /* * several buffer sizes */ #define MAX_DATA 1250 /* not a maximum, but an increment step size */ #define INIT_N_VGMM 2 /* * (for glvars.c:) something, not bigger than 127 * because of user interface (crazy though) */ #define ERROR_BUFFER_SIZE 1280 #endif /* DEFS_H */ gstat/src/reml.h0000644000176200001440000000035215060550314013272 0ustar liggesusersVARIOGRAM *reml_sills(DATA *d, VARIOGRAM *vp); #ifdef MATRIXH MAT *XVXt_mlt(MAT *X, MAT *V, MAT *out); MAT *XtVX_mlt(MAT *X, MAT *V, MAT *out); MAT *XdXt_mlt(MAT *X, VEC *d, MAT *out); MAT *XtdX_mlt(MAT *X, VEC *d, MAT *out); #endif gstat/src/vario_fn.c0000644000176200001440000001300615060550314014131 0ustar liggesusers/* * vario_fn.c: contains elementary variogram model functions */ #include /* req'd by userio.h */ #include #include #include "defs.h" /* #define MATHLIB_STANDALONE */ #include #include "userio.h" #include "utils.h" #include "vario_fn.h" /* * Copyright (C) 1994, Edzer J. Pebesma * * basic variogram functions */ #define MIN_BESS 1.0e-3 #ifndef PI # define PI 3.14159265359 #endif double fn_nugget(double h, double *r) { return (h == 0.0 ? 0.0 : 1.0); } double fn_linear(double h, double *r) { if (h == 0) return 0.0; if (*r == 0) return h; /* 1lin() or 1 lin(0): slope 1 (and no range) */ return (h >= *r ? 1.0 : h/(*r)); } double da_fn_linear(double h, double *r) { if (*r == 0) return 0.0; /* 1lin() or 1 lin(0): slope 1 (and no range) */ if (h > *r) return 0.0; return -h/((*r) * (*r)); } double fn_circular(double h, double *r) { double hr; if (h == 0.0) return 0.0; if (h >= *r) return 1.0; hr = h/(*r); /* * return 1.0 + (2.0/PI) * (hr * sqrt(1.0 - hr * hr) - acos(hr)); * probably equivalent to: */ return (2.0/PI) * (hr * sqrt(1.0 - hr * hr) + asin(hr)); } double fn_spherical(double h, double *r) { double hr; if (h == 0) return 0.0; if (h >= *r) return 1.0; hr = h/(*r); return hr * (1.5 - 0.5 * hr * hr); } double da_fn_spherical(double h, double *r) { double hr2; if (h > *r) return 0.0; hr2 = h / ((*r) * (*r)); return 1.5 * hr2 * (-1.0 + h * hr2); } double fn_bessel(double h, double *r) { double hr; hr = h/(*r); if (hr < MIN_BESS) return 0.0; /* return 1.0 - hr * bessk1(hr); */ return 1.0 - hr * bessel_k(hr, 1.0, 1.0); } double fn_gaussian(double h, double *r) { double hr; if (h == 0.0) return 0.0; hr = h/(*r); return 1.0 - exp(-(hr*hr)); } double da_fn_gaussian(double h, double *r) { double hr; hr = h / (*r); return (-hr /(*r)) * exp(-(hr * hr)); } double fn_exponential(double h, double *r) { if (h == 0.0) return 0.0; return 1.0 - exp(-h/(*r)); } double fn_exclass(double h, double *r) { if (h == 0.0) return 0.0; return 1.0 - exp(-pow(h/r[0],r[1])); } double da_fn_exponential(double h, double *r) { double hr; hr = -h/(*r); return (hr / (*r)) * exp(hr); } double fn_pentaspherical(double h, double *r) { double hr, h2r2; if (h == 0.0) return 0.0; if (h >= *r) return 1.0; hr = h/(*r); h2r2 = hr * hr; return hr * ((15.0/8.0) + h2r2 * ((-5.0/4.0) + h2r2 * (3.0/8.0))); } double da_fn_pentaspherical(double h, double *r) { double hr2; if (h >= *r) return 0.0; hr2 = h / ((*r) * (*r)); return hr2*((-15.0/8.0) + hr2*((15.0/4.0)*h - (15.0/8.0)*h*h*hr2)); } double fn_periodic(double h, double *r) { if (h == 0.0) return 0.0; return 1.0 - cos(2.0 * PI * h/(*r)); } double da_fn_periodic(double h, double *r) { return (2.0 * PI * h/((*r) * (*r))) * sin(2.0 * PI * h/(*r)); } double fn_wave(double h, double *r) { if (h == 0.0) return 0.0; return 1.0 - (*r) * sin(PI * h/(*r)) / (PI * h); } double da_fn_wave(double h, double *r) { return cos(PI * h / (*r)) / (*r) - sin(PI * h / (*r)) / PI * h; } double fn_hole(double h, double *r) { if (h == 0.0) return 0.0; return 1.0 - sin(h/(*r))/(h/(*r)); } double da_fn_hole(double h, double *r) { double hr, hr2; hr = h/(*r); hr2 = h/((*r)*(*r)); return hr2 * sin(hr) + hr * hr2 * cos(hr); } double fn_logarithmic(double h, double *r) { if (h == 0.0) return 0.0; return log(h + *r); } double da_fn_logarithmic(double h, double *r) { return 1/(*r); } double fn_power(double h, double *r) { if (h == 0.0) return 0.0; return pow(h, *r); } double da_fn_power(double h, double *r) { return log(h) * pow(h, *r); } double fn_spline(double h, double *r) { if (h == 0.0) return 0.0; return h * h * log(h); } double fn_legendre(double h, double *r) { /* *r is range; h is angular lag */ double r2, ang; if (h == 0.0) return 0.0; r2 = r[0] * r[0]; ang = h / (PI * 6378.137); /* printf("dist: %g, ang: %g\n", h, ang); */ return 2.0 - (1.0 - r2)/(1 - 2.0 * r[0] * cos(ang) + r2); } double fn_intercept(double h, double *r) { return 1.0; } double da_is_zero(double h, double *r) { return 0.0; } double fn_matern(double h, double *p) { double hr, ans, phi, kappa; phi = p[0]; kappa = p[1]; if (h == 0.0) return(0.0); if (h > 600 * phi) return(1.0); hr = h/phi; ans = (pow(2.0, -(kappa - 1.0))/gammafn(kappa)) * pow(hr, kappa) * bessel_k(hr, kappa, 1.0); /* ans was for correlation; */ return 1.0 - ans; } /* * Ste: M. Stein's representation of the Matern model * * According to Hannes Kazianka, in R this would be h=distance matrix delta=c(RANGE,KAPPA) maternmodel<-function(h,delta){ matern<-besselK(2*delta[2]^(1/2)*h/delta[1],delta[2]) ifelse(matern==0,0,ifelse(!is.finite(matern),1, 1/(2^(delta[2] - 1)*gamma(delta[2]))*(2*delta[2]^(1/2)*h/delta[1])^delta[2]*matern)) } delta<-c(RANGE,KAPPA) h=Distance Matrix maternmodel<-function(h,delta){ matern<-besselK(2*delta[2]^(1/2)*h/delta[1],delta[2]) multipl<-1/(2^(delta[2] - 1)*gamma(delta[2]))*(2*delta[2]^(1/2)*h/delta[1])^delta[2] ifelse(matern==0 | !is.finite(multipl),0,ifelse(!is.finite(matern),1, multipl*matern)) } Now 0*Inf is impossible. Hannes */ double fn_matern2(double h, double *p) { double *delta, bes, mult; if (h == 0.0) return 0.0; delta = p; h = h / delta[0]; bes = bessel_k(2.0 * sqrt(delta[1]) * h, delta[1], 1.0); if (!isfinite(bes)) return 0.0; if (bes == 0.0) return 1.0; mult = pow(2.0, 1.0 - delta[1]) / gammafn(delta[1]) * pow((2.0 * sqrt(delta[1]) * h), delta[1]); if (!isfinite(mult)) return 1.0; return 1.0 - bes * mult; } gstat/src/block.h0000644000176200001440000000014415060550314013424 0ustar liggesusersDATA *block_discr(DATA *d, const DPOINT *block, const DPOINT *where); void reset_block_discr(void); gstat/src/fit.h0000644000176200001440000000023015060550314013110 0ustar liggesusers#ifndef FIT_H # define FIT_H #if defined(__cplusplus) extern "C" { #endif int fit_variogram(VARIOGRAM *v); #if defined(__cplusplus) } #endif #endif gstat/NAMESPACE0000644000176200001440000000362415122546311012620 0ustar liggesusersuseDynLib(gstat, gstat_debug_level, gstat_exit, gstat_fit_variogram, gstat_get_variogram_models, gstat_init, gstat_load_ev, gstat_load_variogram, gstat_new_data, gstat_new_dummy_data, gstat_predict, gstat_set_merge, gstat_set_method, gstat_set_set, gstat_variogram, gstat_variogram_values ) importFrom(utils, setTxtProgressBar, stack, txtProgressBar, head, tail) importFrom(stats, as.formula, cor, cov2cor, delete.response, .getXlevels, lm, median, model.extract, model.frame, model.matrix, na.exclude, na.fail, na.omit, na.pass, optim, optimise, optimize, predict, residuals, terms, rnorm, fft, numericDeriv, runif, setNames) importFrom(graphics, image.default, lines, locator, text) importFrom(zoo, is.regular) import(methods) import(lattice) importFrom(zoo, zoo, is.regular) import(sp) import(spacetime) import(FNN) export(as.vgm.variomodel, cross.name, fit.lmc, fit.variogram, fit.variogram.reml, fit.variogram.gls, fit.StVariogram, estiStAni, get.contr, get_gstat_progress, gstat, gstat.cv, "[.gstat", hscat, idw0, krigeTg, krige0, krigeST, krigeSTTg, krigeSimCE, krigeSTSimTB, vgmAreaST, map.to.lev, ossfim, show.vgms, spplot.vcov, variogram, variogramST, extractPar, extractParNames, variogramLine, variogramSurface, vgm, vgmArea, vgmST, vgm.panel.xyplot, panel.pointPairs, set_gstat_progress, xyz2img) exportMethods(krige, idw, krige.cv) S3method("[", gstat) S3method(as.data.frame, variogramCloud) S3method(image, data.frame) S3method(plot, pointPairs) S3method(plot, gstatVariogram) S3method(plot, variogramMap) S3method(plot, variogramCloud) S3method(plot, variogramModel) S3method(plot, StVariogram) S3method(predict, gstat) S3method(print, gstat) S3method(print, gstatVariogram) S3method(print, variogramCloud) S3method(print, variogramModel) S3method(print, StVariogramModel) S3method(variogram, default) S3method(variogram, formula) S3method(variogram, gstat) gstat/NEWS.md0000644000176200001440000000712615162011565012502 0ustar liggesusers# version 2.1-6 * clean test output # version 2.1-2 * `variogram()` supports `stars` (raster) objects, benefiting from them being gridded # version 2.1-1 # version 2.1-0 * import `sftime`; modify `krigeST()` variogram functions to accept `sftime` objects for `data` (as alternative to `STI` or `STIDF`), and `stars` or `sftime` objects for `newdata`; #108 with great help from @henningte * fix Gaussian cosimulation, probably introduced in 2016, #106 # version 2.0-7 * return `NA` as estimate when prediction/simulation fails; #80 # version 2.0-6 * fixes `object 'ret' not found` bug introduced by #63; #65 #66 #70 # version 2.0-5 * use multiple cores in `variogramST`, using pkg future; #63 by @sigmafelix * fix bug with conditional simulation using `stars` target grid and nsim=1, #58 # version 2.0-4 * fix CRAN warning issue # version 2.0-3 * fix bug in support for `sf` objects; #46 * fix `krigeTg` for the case when data or newdata are of class `sf` or `sfc`; #51 # version 2.0-1 * try to fix CRS issue found on OSX * check for temporal unit in krigeST opposed to covariance function and assign the temporal unit found in krigeST to the spatio-temporal variogram for consistency in case none has been provided by the model; add warning when ST variogram doesn't have a `temporal unit` attribute; #42 # version 2.0-0 * add plot.variogramModel; #40 * support `sf` and `stars` objects, for vector and raster data, respectively; #39 # version 1.1-6 * address warnings from Tomas Kalibera's static code checking # version 1.1-5 * fix auto-choosing of variogram parameters if only variogram model type is given, https://github.com/edzer/gstat/issues/17 # version 1.1-4 * Fix #17 * Fix #14 * Fix #12 * Fix great circle distance bug; see https://stat.ethz.ch/pipermail/r-sig-geo/2016-December/025251.html # version 1.1-3 * Merge pull request #4 from BenGraeler/master r-journal ms merge updates vignette "spatio-temporal-kriging" to revised paper * Merge pull request #3 from BenGraeler/master update st paper demos * demo/stkrige.R: - remove empty station * demo/00Index, demo/stkrige-crossvalidation.R, demo/stkrige-prediction.R, demo/stkrige.R, man/krigeST.Rd: - adds R scripts from vignette spatio-temporal kriging as demos * Merge pull request #2 from BenGraeler/master additions for space-time paper * NAMESPACE, R/krige0.R, man/krigeST.Rd: - adds trans Gaussian kriging for space and time # version 1.1-2 * fixed `memcpy` for overlapping regions error, found in valgrind checks by Brian Ripley * fixed a few more (small) memory leaks # version 1.1-1 * Further cleaned up C source code, got rid of lex and yacc files * Improve `fit.variogram` to choose initial values for range, sill and nugget before fitting, and fit over a range of model types * allow `NA` values in `vgm` * Fixed #1 # version 1.1-0 * remove meschach matrix library, rewrote interface, link to R's lapack * improve notification in case of singular matrices * remove all C code that was not used by R package gstat * add `Makevars`, remove `configure` * remove links to `ai-geostats.org` * wrap `fit.StVariogram` example in `dontrun` # version 1.0-26 * use ordered spatial index when selecting nearest strongest correlated neighbours in local kriging to avoid warning of spacetime * update spatio-temporal geostatitics vignettes; add R Journal draft as vignette (Spatio-Temporal Geostatistics using gstat) * add spatio-temporal PM10 interpolation [movie](http://gstat.r-forge.r-project.org/STpred.html) # version before 1.0-26 * see [ChangeLog](https://github.com/r-spatial/gstat/blob/master/inst/ChangeLog) gstat/inst/0000755000176200001440000000000015162303121012343 5ustar liggesusersgstat/inst/CITATION0000644000176200001440000000165515143634577013534 0ustar liggesuserscitHeader("To cite package gstat in publications use:") bibentry(bibtype="Article", title = "Multivariable geostatistics in {S}: the gstat package", author = "Edzer J. Pebesma", journal = "Computers & Geosciences", year = 2004, volume = 30, pages = "683-691", url = "https://doi.org/10.1016/j.cageo.2004.03.012", textVersion = paste("Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package.", "Computers & Geosciences, 30: 683-691.") ) bibentry(bibtype="Article", title = "Spatio-Temporal Interpolation using gstat", author = "Benedikt Gräler and Edzer Pebesma and Gerard Heuvelink", year = 2016, journal = "The R Journal", volume = 8, issue = 1, pages = "204-218", url = "https://journal.r-project.org/articles/RJ-2016-014/index.html", textVersion = paste("Benedikt Gräler, Edzer Pebesma and Gerard Heuvelink, 2016.", "Spatio-Temporal Interpolation using gstat. The R Journal 8(1), 204-218") ) gstat/inst/doc/0000755000176200001440000000000015162303120013107 5ustar liggesusersgstat/inst/doc/st.R0000644000176200001440000001674315162303120013673 0ustar liggesusers### R code from vignette source 'st.Rnw' ################################################### ### code chunk number 1: st.Rnw:89-93 ################################################### library(spacetime) rm(list = ls()) data(air) ls() ################################################### ### code chunk number 2: st.Rnw:102-108 ################################################### if (!exists("rural")) rural = STFDF(stations, dates, data.frame(PM10 = as.vector(air))) rr = rural[,"2005::2010"] unsel = which(apply(as(rr, "xts"), 2, function(x) all(is.na(x)))) r5to10 = rr[-unsel,] summary(r5to10) ################################################### ### code chunk number 3: st.Rnw:112-114 ################################################### rn = row.names(r5to10@sp)[4:7] rn ################################################### ### code chunk number 4: st.Rnw:119-125 (eval = FALSE) ################################################### ## par(mfrow=c(2,2)) ## # select 4, 5, 6, 7 ## for (i in rn) { ## acf(na.omit(r5to10[i,]$PM10), main = i) ## } ## par(mfrow=c(1,1)) ################################################### ### code chunk number 5: st.Rnw:130-137 ################################################### par(mfrow=c(2,2)) # select 4, 5, 6, 7 rn = row.names(r5to10@sp)[4:7] for (i in rn) { x <- as.numeric(na.omit(r5to10[i, ])) acf(x, main = i) } ################################################### ### code chunk number 6: st.Rnw:146-147 (eval = FALSE) ################################################### ## acf(na.omit(as(r5to10[rn,], "xts"))) ################################################### ### code chunk number 7: st.Rnw:152-153 ################################################### acf(na.omit(as(r5to10[rn,], "xts"))) ################################################### ### code chunk number 8: st.Rnw:177-178 (eval = FALSE) ################################################### ## acf(na.omit(as(r5to10[4:10,], "xts"))) ################################################### ### code chunk number 9: st.Rnw:183-185 ################################################### library(sp) print(spDists(r5to10[4:10,]@sp), digits=3) ################################################### ### code chunk number 10: st.Rnw:192-193 ################################################### rs = sample(dim(r5to10)[2], 100) ################################################### ### code chunk number 11: st.Rnw:198-200 ################################################### lst = lapply(rs, function(i) { x = r5to10[,i]; x$ti = i; rownames(x@coords) = NULL; x} ) pts = do.call(rbind, lst) ################################################### ### code chunk number 12: st.Rnw:203-205 ################################################### library(gstat) v = variogram(PM10~ti, pts[!is.na(pts$PM10),], dX=0) ################################################### ### code chunk number 13: st.Rnw:208-211 (eval = FALSE) ################################################### ## # plot(v, fit.variogram(v, vgm(1, "Exp", 200, 1))) ## vmod = fit.variogram(v, vgm(100, "Exp", 200)) ## plot(v, vmod) ################################################### ### code chunk number 14: st.Rnw:215-218 ################################################### # plot(v, fit.variogram(v, vgm(1, "Exp", 200, 1))) vmod = fit.variogram(v, vgm(100, "Exp", 200)) print(plot(v, vmod)) ################################################### ### code chunk number 15: st.Rnw:226-227 ################################################### vmod ################################################### ### code chunk number 16: st.Rnw:232-233 ################################################### dim(r5to10) ################################################### ### code chunk number 17: st.Rnw:238-239 (eval = FALSE) ################################################### ## vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) ################################################### ### code chunk number 18: st.Rnw:244-245 (eval = FALSE) ################################################### ## vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) ################################################### ### code chunk number 19: st.Rnw:251-252 ################################################### data(vv) ################################################### ### code chunk number 20: st.Rnw:255-256 ################################################### vv <- vv[c("np", "dist", "gamma", "id", "timelag", "spacelag")] ################################################### ### code chunk number 21: st.Rnw:261-263 (eval = FALSE) ################################################### ## plot(vv) ## plot(vv, map = FALSE) ################################################### ### code chunk number 22: st.Rnw:267-269 ################################################### print(plot(vv), split = c(1,1,1,2), more = TRUE) print(plot(vv, map = FALSE), split = c(1,2,1,2)) ################################################### ### code chunk number 23: st.Rnw:281-286 ################################################### metricVgm <- vgmST("metric", joint=vgm(50,"Exp",100,0), stAni=50) metricVgm <- fit.StVariogram(vv, metricVgm) ################################################### ### code chunk number 24: st.Rnw:291-292 ################################################### attr(metricVgm, "optim")$value ################################################### ### code chunk number 25: st.Rnw:297-298 (eval = FALSE) ################################################### ## plot(vv, metricVgm) ################################################### ### code chunk number 26: st.Rnw:303-304 ################################################### print(plot(vv, metricVgm)) ################################################### ### code chunk number 27: st.Rnw:314-322 ################################################### sepVgm <- vgmST("separable", space=vgm(0.9,"Exp", 123, 0.1), time =vgm(0.9,"Exp", 2.9, 0.1), sill=100) sepVgm <- fit.StVariogram(vv, sepVgm, method = "L-BFGS-B", lower = c(10,0,0.01,0,1), upper = c(500,1,20,1,200)) ################################################### ### code chunk number 28: st.Rnw:328-330 ################################################### attr(sepVgm, "optim")$value plot(vv, list(sepVgm, metricVgm)) ################################################### ### code chunk number 29: st.Rnw:335-336 ################################################### print(plot(vv, list(sepVgm, metricVgm))) ################################################### ### code chunk number 30: st.Rnw:344-350 (eval = FALSE) ################################################### ## library(lattice) ## plot(vv, list(sepVgm, metricVgm), all=T, wireframe=T, zlim=c(0,120), ## zlab=NULL, ## xlab=list("distance (km)", rot=30), ## ylab=list("time lag (days)", rot=-35), ## scales=list(arrows=F, z = list(distance = 5))) ################################################### ### code chunk number 31: st.Rnw:359-365 ################################################### library(lattice) print(plot(vv, list(sepVgm, metricVgm), all=T, wireframe=T, zlim=c(0,120), zlab=NULL, xlab=list("distance (km)", rot=30), ylab=list("time lag (days)", rot=-35), scales=list(arrows=F, z = list(distance = 5)))) ################################################### ### code chunk number 32: st.Rnw:386-387 (eval = FALSE) ################################################### ## demo(gstat3D) gstat/inst/doc/spatio-temporal-kriging.pdf0000644000176200001440000105251515162303121020364 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4786 /Filter /FlateDecode /N 85 /First 722 >> stream x\isƲ~]R[TIx#;rMBlTHK~;=3R"iɽEA /T!/t,L/l.\!ԅ/"xtAF)kѦPN.4צEFstBalݸ5մuZRNPHS8qSFB" `)XGss *tp8(*4A!naÁOp9 %+]Ɔ8@l 'A2$S`!=$JZ@Y9SZPA|PemH cAY{K@p\F( "4HZH_X[pZ]oKh=>]Ej9D86(;N9d (;O#ʞӐeE) kI<ǃrrP(JyPw؉82FI5:N8)/;_x~=)դ_q%ǟuΪ'^Ul<<6/\1n?zx59;̨v&UqK1VRr\4ǝիS=9/A{4NqQpG&rFU·ɸ;/'PRw$|QOm2Y]Q_$ L^ۼNB v*sqr3IZ|QZ%o '7 JdBu,t^g2u]Zday-jAiğTs4L ZЛ4qRW.x'IRe ϫ gwgRt*Y*T*u[^,ьCY!W"pr:M^7jVHMIjZ:kN=ԉ9R't\QD$*&Q1ITLb =IƸsWjvŋß}+0ޠ;Ճq=;p' npЕQq'7!k"ě $eݛGp rB2!~>(Psq8Ei_Й u:bj 1 q)7u<(v _4x~~;Uq'.Vy 1шag?);a/Xc]c;?F!*vFljg6aQUɧ!b_4D6 6 5OX+16_+_6zڹVOpupp''x } PIu;_kWY.Bl7O~'OTT1}K)a*f ~xcڤ#1:tDQ5t4w'Zr8mLqG8jҵ6לGit#KYU.6HҶϷhqiIi &/zjYSרF33މ6ƘE1-9fw= h3{y=cy{~c5{tWuzu5uF0;֙ލ:I=bhD.v;#X!Jg#:svNf ߠ9C8|Y|>d$ 0%TJ,!& Ѻej`\ 'U]?m M/ W}bp]b> Y k0H|媍q|SWAe"WɲsqXT~l)mtN;]6>,zv%7M[,RzPVh}SH Yr@5Aq)]X*Xs)mENhNѧoײ>^ɱ7%n<9~<)gM5br9姊n}u*XV~݀qftZ]r]jCd 3VKrH.EP±̒ϛ127q>@Aй쐂_AóRYs 2g}p% ZE[FeթZZzѣA-m򶒶R$n7\;r+` {Z| 5 WQSC"e*_]PQWI}h"Quگ>ލFzȳUZ9-\ԒMʹ_OD-Z8}h\mcSQ`6ĭfL`'d&Nns3m1 <#r<;Ný:m^zӻ(OiGB]znI6/ԆyK:o#B /d»ؒ4Qߥ M+nl;~bdΐ: P =(jSwրb>"| 3_Q;ފ 4_oU&h{4C,X?geRbg?K-0]“v0jCld{SۛP/+} 7SX4նe?ffܸ[ד߫Ϧ \*\hYxfw*+-TW% )0(%m=oյ7sFyF!y)Eq.i*T*lVa5+oÜ4Ama,>/o'?MوНrcQgPr8:v?tΪ_/w]t:P (֢y%7 0r]i`OY˵k.KW$X@a%_əD pu)x؎QK5^᥎S|@Ֆh'Tt)E7ܪ__9jڮ*I:AbK)(D#Jc>t{NV[ V AI =v>z$;cN}sZ= HTN>N ˨-,E!E鸋j9St~mCR*֩YRyC81X2tC^ϛf]V9eKZ-n߃9ՒL7pu^Ӕ7Z~Q9`Fn@σ]\PܠR,oV blUԶqx\u K/ʱq㶵0 ᴦ݄/e$BRd_p&Bt%=Hpb>-OVf>!SUp:/H#{l{#x&Y! ~3O)_Mf^۔)6٦=*ٴ@i˳yf#mӧrܭAԈd^|uFۯe]31l 瞻\IN)ekBYa 54;ށZqq PwB:3=9Bdm^U@²0w8w|:)QqZ+KzӏU zie_P?h7DJt@%逐};|.LXcb"$1ms)Q0}p I@vâ`WA_^&=GF*#MkB wa=A@Hv,X.R 8\o@p5 @y]p=X6Pcjhh?P(. }P(Ǘ]5ݘ4uawՁ;U*Jzq %wY1)dB3OSrVs 0X0VGuP;]`۱ݝTMg W}E6&*ҧ?}HFBM||o  @^(s.ΙЗrdsJoݳUea4NDJm>/Of_=HV: lzX$Ҋ}D:' hX Y,([ɦn|z>ew1Z[cBK"֋oPx_NF`'=-@. XCN! eظ5Wᚯd][yL[V#JWT^J$m*+z 1*\2z1"SwKӗ o ДCC͋ %wў؛IdN! zK6VMgXj,}ڮLs`Evj7wendstream endobj 87 0 obj << /Subtype /XML /Type /Metadata /Length 1388 >> stream GPL Ghostscript 10.02.1 2026-03-29T22:06:41+02:00 2026-03-29T22:06:41+02:00 LaTeX with hyperref endstream endobj 88 0 obj << /Type /ObjStm /Length 4025 /Filter /FlateDecode /N 85 /First 779 >> stream x[[۸~ϯcRqf]=سMƛEB:R(JVng6jAC  |da(*,]xg`\l!+t ^rNc8CQH5TBRE4Bqb 4]|BsJ(Ȃ;EQԘTQta!D1\aiCPX$/ ++G) '֪ upF^*W@t_xxdTqiJ%*iR P:ej mByaCS(z@6JhJNc 8ؐKPhXrj5h* }qCz( *-0!BJbZ.xl,MslcT )60Z:fsX_ch03Fc)c7|]|>[ ^*zOElWţGo#{ar7ьIQ@u(u4u,s8/NmuCwmh3E2vŲb5^w<o '.i3mH}mM}x^(&#kKuoENz_-Is?'=OyCh@jn|HW̻tUmqҜ'iL@= `&#$A)Z̖h-\+}tjGUc=4>Mf6!%|xC5|v {L3/FWn-5Q=Z-3}U5Df"\N5Z?V1 h7߿W$(E3_flېU$HU/g2KRwup=YRRB%sK%3> ŧ֍ɗvg=QHQw*EwݨU $n_UHhm(,2/Wq^򦜗\r].1LϯzcO:U^:0:*R=W&P庺Տ$jEMH(/)}#WO"59.{u{=8*r{eO(fKGMKrqC͊H%?F. 0r!w\&t"v^|;N=B0'QK&7ˆ-/>K3`R+Ӷgh i/<\AVmNNPי]]g|V~W(_T,.j*'eʆtU~+ߕܕ'ɓ'EҼqjyp+N{}Tj?@M("Mgh“TL̦Nw1: P 5κfIy.ieȂh2Z@>}GoN첝alj^%3g],V6w1dwp5@L~ F$6NH!+z>d=>9!VbŲ6bK &Sl|kBVRx/DuuJPLCbCM?3(BÆi68 К9aH )l(:Pgynz}CYjΖg.l,og `c|zvB{k 1`̹4ib4m%F(c8f9Gh"n gX͂bd-pV1{%ZWS^YKo .V_ 1 N i ب;'y5o7gYݟ0i؁LcǤ}hRΐ>8 X3 69 `16y/αʻL[i}Piw}0Ŧwu αsl5ˮٶ%v 6o'fu5 f"iŢTF7ME-QYEԞ"ϩzj*'NS9u@P9)V2NRYC+Ҽ"Hj*E#4BR{%MaMF-*%}4ŪzF@WN-6df|MϟHa?Dv"I4IP 6k@ F (`Ǣ-6)ٷɖ,ƊŻvjW,uqGЮ9C~iriIU̓̑<3DŝNHiFl6N)}iݾTi> !vGsٞ}XwA~gLGzȪ;pQ,CoeO!^~m\ :el{b(LC Pg/x#>"RPOiN5xj7o fHsHmO/b^LڤƜW1Rr*jcJ S)kC^f ɷޣ>%?>O{b<];c6Ztm,&ۓQ!H[cp Y,c(rn$3D~pcǗHVl3GFI6Ha[H2{_r1uHɊ:eBr!S芃_5. KX6GLvv/pԨ@;{ߣt-ǜv8r05w[ ]}*tcGjPc<=nBʺi y~~wi\meZv|w_ԯS֍GjԎ|_UݶH/##ޏƽ~̸3N9N-j'Ccy4Omծ];[la+{;dEXr=Gb. [~֢_H'v{{~XMQPk&X+VR\nߣ֋~[a/g{',g8dO3<'O7V"bGt%'S(d';9uᄲ|FI|J# cT$]vmCĉ)dbtБaޘ/IP1#!/U 0%HsBJo;ǁzNqB8j)/|s K?k$ 8K?jԿ8IaEZ9g ~H1Ux@rɼw̅?q6I14[, _6rK=y%`s@`SƐֱؔ `#a@^o!o;vwW=Ҽېf&q.U?gg7wqZ%k>M{JiXzTcO򖼟M xbsbT/Z6*޽4-6dd,8瓇u~~l߂ '_7G8!W_ {endstream endobj 174 0 obj << /Type /ObjStm /Length 4188 /Filter /FlateDecode /N 85 /First 794 >> stream x\is8gcHDoGj_m[b*m_?dYD "D"6.3y טI)XFF$ZQ mΔV6u Lye* VNȴ,LVEO1V!2-:: %NU6Vxd\fg6X>2'$z1sҁӊl fxalGVE0Za 3ΐ0cU|z dm%%2F"@Y`^I+f9V,HLITȢ,RJ,j푑YEG*E/1Y $(tAQ)L0=L9I$sHҘ 0/;`N3GĀ4OtIf-h@400p`@C%@0RYL2/4`4 Sf@C;vY1 3 ' LhXг !n#rhM:% "Pл"Ղb'MNҴ:+*6't^[|@{6#s`O<+x 3Mj~YW)zx*WuYOgEuZwY Yʶ|kh3.:^/eU' ; 丽>^xuJx7\vdt+J@7D#w:rJ7˲|# ىƽN/=~q''\\T,abZ)DҏU_˴V?m# 4'DteG%7pIr4T6DSlM[SjԞVtu?:njRSk?s ~K*Jpv⸼|Tޠ]UP?GqxVdYVoy=[u%(}_gżx[we\\ŢX\%JWU*Vi]oQ/(U/ 8Y k<ӄ^T+|0?AiUy>.k+̯s߽2GRūVV}{z/.cUz@c` f ?k\ a|`%f|C`76w}$65h]@fY7HA0UMu"`r M@vūgֽWq,$m$QSQ _gaFc!LZ`b[lkv1}.~/{rz q`{`b5;rGw}Z'd`sǧDE%/ Bߑ3։g?=ǜIk5G~KP >kc.`7Rq=g&狳yUE7OVA;U;%u{mO5e{)Zmo{-Lj70wcX1:|ݞ7 5s*!]o܉dO?^;ߙF>׵e,B+c1C!GZX!!KA ss/Vi9J=e~(/=mn~m~c55q'/Zq9Qx1jEA+{Mw_Lbc^'e^eߋ?U3%S:f^kY-*޷*JfsKi~lYLdZ#G12ZsV ""_bxYlbz>"JUtK(Vf$aNDmӪ"I7M'-t9tXd%w^*5Fk6ȴtG-e1rQ:[F;pY7R|64y)5Qr9K  5bNOMq б1 ؽ38ɉ|g+\ M;vaÚc K)t9| w."ݭ)=#*o=MaNߛd;aR݃]%,+1Xˤ-`XKΈWtIi\?O;33BM *5lUltN5Guٜ<`$6絿~#1&~NR Ukǝn )SekCY aNpP£Ct=O} =yJl{Fk )'myyYy<5.4"RG[Sl8)i@'^ aXnlRqb}]'^ v5%;AcJ1(}XŞO=cgBe6@ p1 Yqo~azlEMN7Yޔ]ɥtv"}וT+ Z_'3w[]xft$/m|56$'H'LIiHc9K-SDLi['r9S# J)S2 Siɠxx7x:_6&~lٔGJHȇ[_t7*F[~*qi>ԧRY"ǍG~ίjCI`U] 71'ԓv+8RzΚch|iݏ/:YUpRj:rXMdjJj6T?GUk(?[C;RAוgfI 9Y[bc81>UDK/CeHgs=Z,H+0h1%HKg,8Ch_Nyg̔|c:3*'[8xj !"*plrE?>b F֒@o3/۬Jsfb"vUVmݵꫪCJjUL}t2 zXCl 1p-Aߠpcl~c,.Ճ/Y++^.ïd/6Дn_:>O;9 ]u1?#Kѭ?%+"Jz?oendstream endobj 260 0 obj << /Filter /FlateDecode /Length 5820 >> stream x[IsFv_97]dfQqxƚ:V$ܨM!jR}h˗oނ\]OWwo~~;\iw\Uioul]9ms쇇z-*o2 0R͖~[e˚N^+Vܘ8WVP(g9nhBp:XMV+]qiLGaRnJ>=G!SLujbPϷ]Eo6!cCt♭UB엿ۏdBQf->ՔLfXF~?`q(+5㡖1d=?l @J}xmp6]{L^PJ + 'LӅTkė6/tG, LR#+$Vtk[`/`d+pqݴ_ YfU7Yef;Hl` ?`~;5_T 8ԝ .kqQ9,FZwG/22J ؉tᢒx*;(کmF6s -qNu*X\[CG*{j,{w 1.[=8ee5f[Z_ zhӈLwazN*e25[f-* 29S;q%9Gy_ Pg(@LCP^nסl4DJ]k|E9Jy *6wBU˳ (PB||qZ/AI@@8ºN1㙁) 6f8@ kv`%xRS 6vΐ8,[>?oO@\ xRP dͼ+E7̙$a ;n`gg/Y{rtz9"=ٔ4a s׌8Ԗ8|_cG:ݣ|h #zw ׀IDnRǾH""z#07KFUDn~14Pԛ|Ai٢6n*6Q< %!k8$jo,+'490/F *8v85Έ% A%zSl6V9r ˂-,C]GzfE.VV Ĥ4&t(xRl &-U$B46PqyC͑QEOg$7 8InjYK޸'`VǠ8Պx0t!qrUaz䴧X6rI# <ˑȒ4+;aL ]26*}94̆Cג,U@e' Q-s7"dƑ`1X9-ԟ)P|\-|owPR6EVaR;(1r7O̳N(c @_L%VYh%aLs4z }. q f-8JdysA p@^APGvqN N@Џ#*_ $iĔP) Ŀ!/'Q-@Bñ i` ~~-% LN ,Q%^=&Ƨg;)UC3G!pّU b>'w)iBћ;_>I kGU'qF:æ~ $@(DO]o 8 j~BQށ2'GIaPcgjV)c?59g ǓptGthT#V^YgY:O' {'AC.ԧq<1pJޙ]ú(뜢P`)=KVEY@(Fu$q@Gl9X;j:ij`qK8SJVT1cDu 9]"'Hx842O}NRR8Dt6K h X` H%+ ̟}<.HN!s3]/K`IND8̆4GIϪt3 aϴ]RJ<930f[fS%'%6`)hأ1-?#sa ?9gR9RrƦJ2Tci 8텀B)XA4˥ž;Ef|%9Mf/)2ĉRvqbʒlJ \eLp"lY$ʩ{sUpOGGS] ;LopKYzBF"0c~2M4d+ &B\Xxsj2Sv]Jx si\yem4BrqǚU\&0*k&\(Ǐq9&dbTm]WhQNPdQ_mlM Y݌ʾ4 }pN_im~$inް{&_ax tRD&JE\@K y 㸐a\$)g=7$=_3(CސEXLq"ta _)9JCL),r{IGRf]"tՙ0F&,j_)+BLr5?m0'8y14R|o5̙deEN@}ks쮫GY_d! qi,.5'y=]Aǭ%84c]Ka:pkY+ ծT 7]qJk{'>Ȝ/vI ɚيk6HښsF OCl.E;H|Yar͋)Z <)Kυ)T/t=:ݚ'Z;\0I)/ X{\GN>ԄrI KtPV/* yT纺ltT,5\CDpuqѝi0>zN>@w]?r*VIL~fd*qkF%gGcw1rťŁS&'9lc{pKuFLoRQ ^P߃-DG]I`dջOft({h*KWF|WCrO{jS0N,I9'U)77k1[mjHއY!}6/T'iD9v8=gh! Ё_vu^;C X6z9IS6vK,}W}V܃N_!T\seVy-vhfBr̚A˳hT@ YGk*M$9m9*W@sW5lyQYw_-&Tb̧Lэ}6} PJG yrf4ߟ+9/`W]džY63:iJ fby{>bHL/硤WOR=#ltˮIlܑ`?(naС_|>mPC5`[@HOv*O^&:,: 5i"wgR/(YN*MWlip+,)Y:AgP"'i~ќ@ep |xvHŷBs%. fqv?P7)A6w +#w5_N;N#*˪[>`D^_<}qB̙H/OhU` M(?k&~nH& 7>E1;YI1\Rs(ESjq\~&'#/=78?TI ^?}2/]a"Ř]/97S&l+L1:7`tCH'ue2O:$F!@"Dnvު v =Tږ60SPo sBeendstream endobj 261 0 obj << /Filter /FlateDecode /Length 7870 >> stream x=Msu{LU|,DJ Q8TEv$̮C~{G7CrI[.j1@~}ϪRU_wu:zWޞV7g_~;eV|=Y29kK'W]sЬ?P>U%u?B?lq5vow[lzS\@N]ooUtm6x]u,BڝWNye>[cBqiв]qekBW`ࡿ{otm\\%p֬}^~Xu_o5s9.R И Wa x~ٞK[DC7|Ŧ%,BxW?bsc6 O}Slw4@MlƮA! "$킖ea:!L׿9/ՙХV"ր?zOB WJ{oMqE^DN0@_J{$R+*nQ5N9]43UK^ۼc+l lqB.(#,f?fNf 50/*+ګv{==ء q 6q)1VEu`OqzlL)QbeqL7q Nsz `1qIwa٤mMfdm  ,Bjn~m#;>N%Om :1t/ 1y.Nr`\ e6ràtY t4Pq[1(B{w!M{K,5Tx^B+I ,BDm7s] #5:;\ pS`M Ǥm k ` [ aJa fȺNU"OJUPc[_UFS,, @ t3I1R.LKapgN X pvI]%ˇ'!ai7BzpA>J8 Y%y چ(fTٽUT HDҞA(, Py}̑T3jnu*vBAqh؀Ĺ,wŪ"HX` g grligx `f>|# ⶂ5,"/!'-OA1jSqt5؎Z8FL/A~O](~'q$q*A3Vg P9i(r`_$6 vÞ$8;V4bg' R4ct@.pk@_k#65aW75*2Cl_x4s&2Țz\ ?'iF]szv9#&>)Ӥtb`#eM -ez=ooXԺ8lM3׷,! b8mRHJ+> ڞh=?/h h[G ms uՒF/*mQd&p_d,~?I<&c[عrnJ͇mC,~>-C+.SD[y|N͊V%+Dr-$L"aԬ2 iŰm-BDaA k=.VEE6w$Jz%Y. |=\}+@QZ<?H Tp':a sVz:n,b&u_A{p]9hB'? XI Hz Ɋ))izat}u5ovXr8-g"Ɔ˄`vܡzJiqyزuif!%i\ hKPs "G?baQr58P@]pݠ L::q'{X&v@06hTذvsHi8دfIzfSP[ =ʑα-8gKqI;׌:2T(xW)oȣoQ:(@ {㰵 `Jg_5KIqVd z!Ku k z ?! ʏ(z4rJ\#9ꁵibuWV/ Л(ńݑb*Tq6G16}5SS [<:<1ux k߳k%mݏ\iF3@\ |?!"?Zg.N&~F)FWVR=b:^bЃ-@=l:Diߧ ۉA% ñof\ѣlAI\2v!PFȱf0SL6nbAIoH[$͝a!$'ɘt=sG^IN,L%p&:yg~8FL~ScN54S7j 6f ;GHT= ,CN >qJqY4O&Iv?L:'@e Dѳ]9ƎSO)H8 3|Lx@gTާB`^NcOQcoJE =;x,%*Cγal͏@S}D9miLU-ȊOkfԼ!{'o\Mσ*azyz2Ď<nw-M>ڠQARKxSS8.0? B#:zEQE "9AHdkLd0Ո]|h e Bߏg TJf9gsJ.Iq6PGDZqwxrgc3#ejN0g12,|r "#Ǜ\ P/ZSZB@OC0Eedϧ12MvΔ9MJQzLrEUc{3~A>rR<n=6%;BӃMU]QW6U-C>!+L(G.jw8i9d쭙םFFw ݴw%vyy>yV[3g],cyd,Qmd;1X(O<8d0쭸m6 !.:hKMД&=lB՞s&~}&wŠB1vGN>t]Yhcrpu,Rt/dIH+BvD81`su?d"t3ݽx\L(~*a٭(qv : Q_g!XJt L/~MA@V'v!] ҥfчߢwJB΢Kt Y- 8.hQRv]fR8v qɿA~햧b ہS|]IjvuŸvC0T/9.*[YԎRZێCY,NLte^w-E̲%eHh*ÀۮY`BGФط_gwO0g@(*.%85-}C@N(>ţNNF$a8ST}G]V!?OL: CMm[ZmMV$zf!zQ„ thG.9Zx5I><^ypڅ<+$+rzJ 783AO1^P9;8{uҎ[PIt;PW s]ñZbcxbdyu_v͟wit,xstOI:ȉ1gAS h!8BE-]1 $BTyL +Djb+jlfv5g0M 6e (I 6Fpm8߉ ${M"cB BH`fݡBbbo"O N7ʧ9X$PL!Cób]4Yr/ &>N/W еaRt𬡚HvBq5Vs?ن P|J&3^є`}Nh̼ۡiG/Tc1DMRwFQB8CZ!!@y´1AX98MP^tMI\(dFrJxeb)-d j;4X4 h:~ROz%Є#c &0ٴzL/$>1z.Y?ڙMo` (ޱ͟#O j蚒xBx' <0w{"'\pbG*!fAejD֢֒߾no@|,bԖsUBmPqED㗶 U`}wz;~1dizQZ&/K*O jCa(yѿiO(+tgSuQ X.UzLZ\,|)>_r\g—@va?X\ PLØ:ׇgF |g&#~W>b6!TbLLPA,rw?(zT$Be>)X%U&-nk>Mx.gP>a5L#e6(==C\'H:P viNY%XYD]:^pHqJe Fb,Z^XL׉7f Cd8rV*Ᾱ=$+Qo +P>GLm0p`.x`b.ł>e.,%0P^`ec帶B =jٿ&M _Mn%֬]?-v.P,KGCozT ~ٮ '!FK_{n":}W7K蔥RՌ&X֦h Rg|+M! ~nc4>IU f 7NxReG+ET&sFGQZ7$ǐ֙EǠXۄ 87&ak]j^џ0 nD=HAm oyr^qA(Ə G~[, 6<9=|BfJ UG'=UWT-XФfb)y4Id}7H(40[;A& z"a+ci}feS-e ᐣR| p*thZr{t`o?]BId=\-͍i쎦/FAp{ TUP{gYGc@B'?߶KCv%8yPawb:I׊#h/e3т]v/,SwYEn4wmZ\M\j 'Y`6f[XaŷHe~19&m}O3Tg^) xW Q˺,XʼnyeN  a#~P[P1+GhVRBωh=OuKhL"SdTݷ,YPp< `'#] ң6i)2\ Qm]8Pz,Ήi1Β/yGg r0u@ɉMׂnS`xx\>6#+7$#xѩ9>iq#˯&ZsZG7|\ìR=yZ^ ~zqY4 ,ߣj}3k[(N\緷lט)us|+Q*xJqSb2G`?QY†<2:@f?} K@,6wmv҄]KZlQ^ qqT|ܳR`褝~_xwta1Ycp'ڥ%[9֫\(+4ۑ^^?SI&6A(hu?` ]&pE> !/U,贽?<+Eso7IvA`;Y=4ךG@&Y?5G&S6RD/wz]-)ukda<<^`+ެdnӫfeRAGD2qJaN+:lхE%}u7b/(VxFpK R/ EHр[#!@EN\t^WϜ&sgqk__%5nGWP;=2kv^8s/A+:)@V;y=ߨ=M=qIGﲑ63 䞼9n,rVj():^Fھ9fA<4|w'KFMr8:8t7Q q)DxWY?B=*>zlގQ樂ɡQKaىw=4> J_NagY\f8⩸ S5^}IQK:Hi)IpϋyfD׉`y:ާ2K >"ew%2cQDL?ĦAƓ3I,z}E!>8beBqE Ko$% WfbN .S`"e\ޏ+*N_6}=,]7܄\Qɧ~~B.r  e> stream x\IFv_ya([ " E@F4m]*֯2.Q4Cu|-໫,UW'_eWg)zz%[^>{W.\n uUUVrE:U]%TOǩݯn]iUY*g`ٛ$]].O3咿յ)5(z|Ҫɸ$trѿtɾvZW0&oV?~fkR]:8՗_\@q0R8+]M ʓvUƟ$3OϜJ>c=pxFxu+ϙU*OM=:&MZ`37Wd_54/3d/[x˧]rƤh$Ag6o;6 h76^d  W-Mtl]?%BBѕi=[;݆I&ֽY ĔYi{14=_k#*D`ۑ&kHHᄴPEʂO) kr[_1x v_OmD[$L,@U4O\t5k*v[J3h({h t]NrD I(g*tk(::MH4ݜ Mճ+w-iI5];+ǡٴ$~Ȭ#Ig᥉F%Mrfӡ0%?]63qȺ˔$U;!%YOȐr@9ܥWe T>ϖv𗥓~ ƏR:whH,*\=(Pl?pNOf|#f`~CY>f8dLʇQj6?#3 @,XFyNfYJX'ؕD 5pt0baUS|$@+3@D™OlCJ-:~E x: O1B$n=Շ`((cL,1NZqZ R|6.%ZP2Z̵B\&:{OصSGsٺmdmN<6Bc)6W *=oRd,^ ī{G0G" xQKJ曟&Ӕ)X6!4! qC *.OB 7#IfW]S Ɗ!u.e Tk0E[D^!`~Ec)G~A˜Ȝ`#NN}'wS qL s !|CXV#4L&-60cdM K9ko?l`e'uv<2fAM+Ʊ#r^nx)'Qn9hdIM̫sRJԄ?y_.*/ '3<,SgO͙9@Ӝ_:$m)dX'?Cd>! rZ=oyb*U[U5؈< UlsWga2Lvh&ΐ1XƾffC#yϸN_iYDAo.> ֢@ƮS rmekR-Hv2кKr Yu w+{XTb^[2c@yVL0v#_ Nw^%!F63и䚹BO?|ҤGWd&䱗I-gr*J"IsD3-\ /s֯S-vO驀h-= E<臁HnlޝeX;efmI?.OcsbfjKd䜒C3%:29Hh&/Z[80{??8\HSeE|~v@%^{9dFc{46DP,󫅐J+N)Azö4ۡ[)(oN,Ò*2ro'a%QJ=T<^{nP\ImR˙+ rP!T *^Gdmfʖh[eYX⟹3΂U%rฺRUZHUpu#Q:Z$xZwz ܏R cj}VZ轐s&tTˎ GCM"tC ѩ ,xα_| >]( `R2-Rx +o $B9AhRe\vIv<1*"aA!mDsV'h˥0eFrg 䠫!۠ RI%LwN ;CO[y+2|OӶi=YƎ2{uO~Gm:4^\|0v>Uq'$\f)o/`O!Ԓ/H/e趬bӾ(nyT+iSQWYb_2Iv]_S2@ЮCw/A1TDeWAwsxBNFr\X8.##z|S%#tdezNz?ܟ?)uHuzy+<Ko?r!Ӊg}/6[7-D[˽!ڽtk87\E3ԩ^ #E,Qw1t"!a8 p!Cu`}CUZSOC~P!Wi~x[lnN hXk-4E 7$F2NwQG)6VjI]w@(7q{D ymhgYNm{)?q>&AnyZQ^~Hר g4ex {7Ur2if#yNm1bxVlqp_IRA{:p 2QA@I}K&pU>p?Lpȷ mU X az|ُLzM㴟4mWܞ,CI ^Гf\D-ꦻd7}U3?W[ %k\;?!e7)^ ;NӮ':}ʩ+,7܁99 rgO*keV\Ms!c?yXUi*wsDSya$}=%-s 䏆TeR g oM2\\Exbb6_i[k> T:b2!^Ǧ}KfS҉IιiM6Z 'rL$>yџPb14|tP"k25Xl $MZU^}ZmOb5eOӜ<=#FOSC)2IaLRe+|Qag]@z~YRKtՓM<~4<)s4~[}byfQ8'9Z(fyJ=*:$)9l8 x|B.wD'u&|Ci`N?꒫}4K_|_Q7* -!kNG¹A@)ʷCb1>zȭu%SF|qo 8Ӯ> JhBaߟBC?\ig78ꬅZ.0Ÿn\L|"}HHooQ o,5o #kЛS$![01%#7'̭77._OOd> stream xuW TTW}sV^JPDM4qQ@̠ sͧ QfI@ġqn5j2IkNL4iӧdkuU֭u߾gϾvn  W-\hdv?) 0OSթ_O^3ׇow{k@[Ȯа˖x}% 3dܙ9.f7yld0̛[k&f ,ca\)3qbƑY1,f?>aCïe]Y-kWc/|O'dL|b.N~n#SJ~əI9-8b=`7 ss%anF' fڪ% e)B!yYl(bVkɻ 5aiLQ8[qiLma 0י8qpuT^ Mu0 w7˱ W7*uP7fpp\ۑzzg^p@4^p,=NSf,eW%2; >(#KȭnπqlaUn ﭬMKK9k'?njܓx]=EfՃIW1S@^︐@]d5~&FRMjom5ڡdT} f6])]FҾi^nnf#ix W' v_\U>e2^D`[xQ;\9|8>}1i>e-1N~$ۂ:JR1N7(k4'g=z) ['/yeGj\vsN3{E}խ2 x\AJyˇ?%ܛJP$JU>3;qsIa~EPIaZ/ETHA b쐧Cg7 *1ߦ$Qi{QAK{y-+OqTA6,DBdZtbAm ''pbCM`A/?fIʭCT|$/eG K@k>>٥5n5Dr}U[UG׳:Ҡ其#mN=< mm 4p?MNǞRy^" 59w\ʘ ib&rx"/>67EhS(t ze{#1S~ ~I, lz+׺=|`^"+pB^AwnTe*3};Om rU1rcyɇpFQ dzq2y˖PE4hɈ;~5bwE2?rlr`Χ}.}.[9 XDņd g;1;q#|:_ZgʩYh@љd"?~#5DC>=6ˤ;-,MIٸCh1dWgT\^^&*VL.n>Y]^&dt!e6Qx8ά#ZPC A0ږv0z#ժ0ٓ,e烄0|T5`9xt=!_6|Oq8&" [m 㟴[hk3ңC6dmq  w [$bkrP4o O&ZXl}ː}=mcrNBguT>UCݶ}KN,]eLLHKUDzo(A\UQQ-Bd{)8$*&hBO'AEh_ޮ/k$d~ L8PUئ u:UyTlsjUhĥmUa,HU$Ci:5a !ȬdYNo[#u:|ca)9$6l,Ejw? =:V>;LVZ~_GmG2m=y84Vh=uˢde"2MҟHOs7'J< Tz%ObhYtJ2#B 49꘮[Eٶ;ʶc/r;g5s{9'Pگ)`Q.D /60Z_+[+9)$"D"OhbiT L2 ȗYrUstP,ZH;ުM=Y=yRcDQNF:J[c(.1n??o^)M;y_؂7?l t䔧A,3S¼&9xVEHhӞ.뎏kY8:~3~'![{NW* W*:Mu$] R2YOhYfRCXag7hLZl7ڷUVhJ0j["BsD% jZU, wydᲠXYP J*uJԨS#yB)r ?yKD{v522[!XWW}?Vi37tt]Q4E(+/d#,`+"'ȿ;0؀,wz+QTH3+֠Xƞ5XNy,(PqH\ @co2j |AWƖ9k|,K`њ~jOh (N-6!ba|Ņd N O LjMr.J~0~M~bk.hnaKeb۶7~K8 _:D/=Iȭ{-d{-6-ˣ3憸cA2wm%4ѸSWm]l~Lfڲ'_&j4A'ֳ\}a3`DWb՗G +gntibZCzNORd%5{\6² p˖yvGN/hkűN6\(3'9XXױex1ĴDJ"H%'8TYFE ȍqXBMy-:+|+04փmDI-N?]yCC]++"x8Am{s7 #¯E*cf5qq uBURWR)4H6VON,C:G|aȫº?Sw<]8,'stǟ:.5 7 o?PYt^hn轻s#YM^"$aiɼ o}7n'Te'ͿKWyLOKqM?@/. B%CV,K cQ'Eʣ'NsF>^% &T~hmFֳ!Aa_ cL[̦b/EP/9){xzyMeeEUW_w_g_Q|-~OK: aں[s+\dZߕzc 6yn6wDЩE~פ5r%S'zδp`b$/ȭZlG\h> stream xz\TWCgW&#&o4ޣ1U]wEfӘ~a节X&nL11uM61M^;no7Dw9=s z z[vקN|23' }{ZQ _py # g.?aϮ=)AM2?1lAB)KR CE^gEFUQ].v}M3^k/ƛ|>vN/lĞ픩^aze0 ^$V#KMbM#뉱bOl"&yDb 1D Vb!1XDL%ӈ%Rb:J ˉ Ub%&!BCaIYћ#;y-/q' l?' "`׈}ةE 8czE={MzLQ>נ^zgY?GnAo ɺRI9q 0PГŸJ] k/Ng䁗r_B"GF{D]7V0㷍N3!wg͉ډ' 'h)SNNl{F9= y}ᢀZ6:g d|s9[^pPNuD{biH׃D|*$$y|u9nX7/r8\=:Y^^foǟao1>o|H2o+jigTWEjwn3JQx)dąK[m_|w¹e$Tt6"t/L#\(@ΓU-hߔVSq>8wJ #?W^ηc@>5jg.|봧 ?15\l*,;Ӈ7vwUl2l4d!p ssgcD.L&Js'TUnn,-;ckfM./"3O?+~Qml眜qSq* (h-iRb щ7޲ߦ+Bjr]o~03R5Ah,&eɳ1W&B)Tٕp'kE2JE %Iހ|Jwol~M&ZJh&z mfPh&µ\hY&jdh fz~E]p sw+ >DA( ֦`s~[C/H\tc \7`!#5~P5n#;3,#>zJl{Ȇt=.,9"{HVm@o =ʅQ _Kv̷ml%P$#^(6ICTsWy|ɽ[6mƏF& \ĴئgXfEo"`iԅ漽5|ێڕɇpO𕛐my Η$ LҩaT Q%vp/~{VcH\W> p™pT h Q$*JIѥ' d4pp'X@LVX>):λl= NU&hB'0ޡe\e,w~O6읾#ƠןP d}Ep;@6U4JRQ-oJi t3ֻuЋrp;sjvsUSXX w:sq+ vm߶u`25`lU5 B}HnX̗S`]4z!ԒerGYhS9v|IoJ2-g3 ?ey XMz+ QV]% %Ei:Lɀ^0!eh+Z65p)JL{Nf\g9)9hAkY,bZ,fnbbboL7.*/󒚢 m07ϢEwE78O"=9:9PpT/Rz͞hė;>Ğ]ݸssO.;ܸ睙 4 m@+Kh ^م\oK+DM8=/(Vvz6kv6 @>0ѽ88וtgr oolb97 Mn (ofQЈywhK@1(sq:uvXeu>([[U?N/< 7Ґm!MXyJ/cV[&6=0,6g2]vs窵R(,vw'+tez 5R(X_BZ!W/qr9Z ltU=Ӯ;p/m| VGup &)Y g zUڨ;T #0茀x)x(ꕯoWQ_ѷ0Ui&[kǸB&6MhZڀ9לW}SQr\h+4:i=i̴eIv= l%f)`76<ǒv=Eo*7ā$^YBU{:U16:T6*M9Xi) W49X6onYw_U݈ˍ~p)q8jW4oZi| _qt:uhS )޹Cc]c'm-_ɋնyZ+&'ŰFƥwV P-,H10a^FCaȥ(,K1Vc͸ȼIY9eN멓O;|1pQ , 3R9W&drEiBD*e4L2U^;Q^_Oo@I; ŠҤ2AiRvIeS%2Wo[y1\4nRdV:@!(**tWUb0UE6+m9@9b̓{i^nin՘܁.p>sCmYa4aV*%#DZ^WE*"B΃ {Né'8/Ù~{Ν\x GZ:\+!:1nOnv4biLZ;h2VǾG{twx4 @!S. r]_1ȗ fus(Ĕm渗xslRlH)9iykaِiέ422$>Q, ;O=(>XzWy !IIZ&N̗?!p|g2aK@"\*+:ӵҀUQIy#sW.4]us  5&y܄8tۍ[jZbʪ|Ǟ8{p;`sPĽPreQK(wxmkm;v`}.FDϠQmb=Y7e70V[n)?gwWfo*\JeGNehȮ&YUSeJC]wNpJkRv2`|ĈWC_]>SP졥p_CH[E, }-.0ɘ$*K~R(^#DPW N51ܑl:2 /$ h9 ]T#E~ ޝȍޱ*gU W e\QTpS!:J$>-oKpZ;pD} L%cL5η >|iDY)G_A_Su GTJgd;Eu EIX)<@ѨU*H ZeY҄FקU&EO72V,1=& \+ed&DH`5A琛ޑeʲesж(8<p!8Njvz'Awkv+*Q i~&;A/:&][q՝( R}f* Z0&G*V#=zȡw%v2JSߟj3ٚ`XR?/^\?,G~䭿0juz>BB ZGZVYas+IO@~Z٤hju%)Oi,Zza-Ѥ-4z fґ_$?) A}&$E3Zj;P{u[0{3$c-ׇZج;Ij?42U2=ɕk9p"B s]$vfH/}oh~7ՑlN,/$YM)+!ǮQ1SP|7<ʦR$Qʔr4v7ǎL14a)U=v3kǟ#2Q9&=?םgc,ݜo0z@(m:.Q@OVs&Le81R4i 2k.|җOL?݅4}03~u7آafK} vIWv=({':-z(j3hƻFB~Dum5'imW\d|*0 v[a^A ;>"g b0 _bA5:H\]q4j2-rNG eXi $Df,^ _&оǓ n 7#݊ɘ/H-  W |R EԈz6Cy9˔\c|Sx^x\1ڍvI$7Ϣep6gxlcb6Xa.l:.gl(HDqbƌdtE*@#}s9`!VN B溂>N;_gǢH\ ,㡢Bٮ1W!O?=7hWaLd]_+L3+dxcՍnN:)1|;dzU㰣=loZ*FKL;0 H^}~u!uׅSXXqU0*;a] =/H*׺ōX4LG9?3"6XlZ'Ue.l,cZ #Aم>A|Er u ̹V46C'n*s \w\߃k=p{C ovf>A{nK(.%^CP(z 2,W{= pנؖ_\ |MȖ07.-rr1X\MPZ aS?ݜS':Ϟ" ^gA0OZܤYI?&2x]@ %U- ͥ ?wdmQF,:(7/_ & c.'ppl?WXzXB4;99Ee._^T?xC¿f:lUzD-?YmQ[pyj7/Lũ: tl 8bvp>Vhu@e oj@ iv93""\<+RUZVFOJ @[.[DKeThuOָ`+~g7|pb6tqJ,iԞVQJFW@KHPƣIކ"KF0@^՘gڪ4ɘүrS'8gɌ3< B o+~RFJ-Ңc5Uyc ~[(3ʘ2p4$[1'3^D `#TΣAֽQ4ZOvK%jV%ĎǎސpG0 Qp i f}/(6UWW{c'up:# Syuro4M_4a%,Z{g-u?&J6&\ ur5߲T̿qQ^ ৢ_+l>srƆ{=s:nٸ}>em\7EWr=-Wpc.H,M0K~n<ޥ O[iD\;.QpS6Ԇ3 bR[TנaerqQ{- W^ht? cb[~5P]7 bP$c~ _9\be%Wҽzd*1 >B%Ahl֝^W 4 KݮjH]Sz,P'amGɝ?M,; ٱgGϘ,:7oR1ÔnHk#Ʌͨ?$_T)ger H2!quRxx5'Bg ԿfG\q.  X}qXSs'PHO[tO`fѢ?|\D¿f`RXKT+3ݝԪ*,f\| FK> 'a_xl6 3a]vNa{[ [u톨)+pKk*ͺ_[2ò*òԣ l ؁ ͦxa]YSa7a-` 6!G=fE, :#9sЦ:D?!tCt+G6:GGԶH:&?OWojޣq$C.a%o|b1oػjw/|K񳹲/ ]~k`U1-(7\'JN0 _"A>{鋧ϝt%m`IGVx+*u(IsVq$ @2PVA~s t")+Cph]WVT"2#`_ k]q3l"Ȑ(7;siŎ S;ZcMHsWWݩ| Vpܾퟜ#tp*Xq9 ׂ~.~xO-dOG b7A\M=G}p;=~U!鴠DTUU\:|̤XFذ h$ˁ [.5nD:SmpaP*ҌL)_=HIj4 24qkwIKZ(i]KovmSYInUq}{ͪUQhZg$'Q^wLL'AQF;*xO u @+JI@b*Ơ3sE2endstream endobj 265 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3849 >> stream xmW tڞ4B :\XD(*HKYdoKK)P-钦Y4ڍKҔ)K)KAQT"bA+"WV~?{?sNΙɜoy}>X 4tbwf \ o gz~O'DŽ&&πԀ''-t^v(ca1^;0(27&P'nog-hh!?ŋ$pKRG=.ܯ^m.BYHUR5 G.Vਪ U&*G:!v! ]38Kfߞ=cA "I%ӥNk hXRx~$r~M$^ rkŎ#QxVl/7@ 0w;xN 4,8PѪUgR?*;a LC!O- }xp΅.m5E"TLQ(N9#)/#,%MΜ^tHu*;bp wO V"G~ZBѫ Ss(9`@i,r*Z[.SԔ ֣Eh#(\0}77a\#mEl ,j8Y‹N4w BƠ KC7%ѩI?hc{+ٗGO ' +s#dFbH2%ݹUFĝ4)߆RjBdWNNwr8^wkޝ;^rOӃ-f7<3rTB /:z;z'bl b6ob %'8ľBOP2t>Hx^ȕuTv7'gǴXj SЧ??H~B&D bhz U%$cQQST_+E1L(\|X^~u.f5ݝ*GU.W8Bj)*}dfLFh^NpYﱤx?H8 KƟ%әtJUI{cMP IiluVA xDRtz*@#[Q [5}_=8}{55Ng"rPgqXkrDND_51<0i|>}<5 G<$ SMFZ[ѵ!?mܫ/B]Ŵtpm'&ZGJMRc-'ܱ(՗tz< 0םC4_P-ȥ5h5j068t{q|UAe"S0|{$fiǦqA,8awˉбWagn>="Ca9O ^3mZ:2f0mxqf:@akb`7uk<.Uj+;;]]MōbᢹԻ[e&OaW&|Ӽ%X^n(=2 Ȋjjx \ȑ)UJO-Jd PX2 3ϞLAJm)9mʐʤ0ݬ5!T[ÝVSS߮oCޚnP.U-LVwWܼ@{VP!ՖɾKkMhc䘝+J3w3_v\p2zъ̴E^STŜ$+ ۆ_U+nSX׌E~-wWqTWIR$W|sgOb%ŘNg]@#h`? aCɴ\8YV?NRMJ8ZURq5孮J+.+@T]ZEkWRA*ɇP sdC-(iNqTbv&wkNFW[GPY)39b ە;\<=6_t0l;nsLs2n YN‹)d⡙ze1#y?f”VT(^;rm<\C?o~b GƁ.+A_+8Q~nEJCI2gWNF4&ҫm@_|aJT@#ZJ`3ֱnD_~Pjq]u=:UFtAsY{6gVWFj(h @ZO lJK6%OʖI-b!V~s#y(bYH]SsWS[9)EۡJg1 N`@&<$yE6^gC`xg*Wt N>71ʪHSf2Kpɑ8Rj)7j v?ȑնpD/WEޥN/սm5I= ߙ-ɋ@^-=>(, #^cLȬ3#Zx]%GH]뙇hD‹i99{qӃt_vo"*s|zRtjǕϸBv njy8q!ͼ18nUBIgj%05r.HAϹ2kU9Q%:1q\],gbME#VUn~Pq]EEE1Ǩ{AT\*`;1xH,>,KQ+%Ӎ>>kn&5'+,O%vIfuUW d.P҂@XtO,^'m*BjZCKJӞD9Sabb,Ȣp\lUf|!☑!XY(ߒ?aa^W^}n/y9{3t=g(Ҽ F ߽Ӷq_Kk~gWQ | '"'.@6Rί󐼰| x:O?sQ*Y$*Q•p}gQ_=m'jIM.LK-}`/xXx?m+Kɠa!գVxevU7:p#.N6M5j1(%R`;uT Z9 kihfln6&ֈK)SR6mc_=<8 |_ 5Xߊ~ʩ]Vr GUGa&?}ήZ8uu uM n8p,$|i癣7[wTDMi?'rS;~mYL>yELaU ZaAñ|_<(+ :3z=+Ēb⒣MSSr-݌Bw p}͍-VjFFo,"Rxt-Z[k(A5.#qLX#D aG/ ypxPS"N._?mqxi[ލڼ)2v\QJ3A Tmٍy( o#C#t槏 x3^TDG^@w +yu8l{tL/ALyC:ݟ۷uo婶ZP.j*񏬸> stream xY tTU~!佇 hEh ( lWKjMU%WRKR[@B *viv\N >3=s&sr{}E Fdee(xvժN#߄d_[-Ǖµe[ԧ*Vѳb^⍛6lYtU +fκk΄'&7_Fw%&+=Dq/D@&'^$O3ijBbxXBߤN]n'%*mv8\9C#:epƓp@sM NM>IrH68^WH2$Z\׵rp65ڀ+Iϱ7螘b*PjDIpp^NiZeSeETgPtq{W( ^OUpD6kxb1p-8f҇ZϏoOaj<޾XAj͖f~ܣH~$++WT*@)p5b{ޓ/X~Jw5ړx*ȆR5Mh8}GÑQ͢<$ #/Ps_>u4WEk~?^ۤliFм\/ -EPH(z/?A1/m 7rЊV _|v.;g//xž齩KЇi PH2c|Pc.'N2rˇ`$)h.NZFkIF"i&q'Ia kh VoH_l0Z}B2lUDLD##|aq e28f`'?l$A=d"1 XM+)b>Qo 1e("Js!"K-OÑpTl<DŽv}>Gad#8JqIJ2Rw=ߝDST6 LZ[,m{˧'/eyL^)鬑fBI|XVM ޟRYRvz.$6>@ł - R vY`Ȓ%p_`Ja;(/kxI|EhƝBK"=_JѲ\8L' &EoƹOOuO>4Vk,Tj{z8(R!{Cc]Ph'd䆊b}/3e:Kj(ͺYVt ^}ЗX'1W%2W i6_DHꀎ~jmo0LMrv&)Uֈš7Q e  L mj̯ YBn2j Si'` tD4~1 ~Ҫ7r:opg$!>ٙO#ߍ boiUD FVg_56QL59m[^ֶK}Ye{#q'GꀘeHVitA(0 طѻ#)`?WM> ~`76ڂWKSx%xUCŐ Q~M;L=uoiЪ &`(5Tꊵ5ſ{&~4hq 8">b1vkll~nks@@ {4ac@~I8?Ӥ l">pVCQ:O=\)ik!s*85 rn>M~aj=&X#\RnZ"v8;`(('a m8cD5R¨)Fx ] }6@A15KLSY? @@Oh.dA\s0~B.G$#<-ZHוO#MZ_ȡIa_Mc0gp9 ljZ/Ls^be[&e;zd{NOSYKp,\!}䎆`?;ИB4G΀7{2y=AmT}LYt|f0?:O[OB^p_C_} %k'BV**}*z'c${aIcdB -ɞXID,3_G{kEEcosۏU]+8Ǡ 6/?!qr0t9:1H2PnsanWtOnخLrAg;dK#ܑpWez6\[W 6}ޮr+#g'F TŶ:G Js5G$ v,6`;VHi(GZPqO1gt,^Q@a{Fɾ}/)\3`VH 㛫b~&9n5z t`L"JKdM,,+xVtK:Tʼn`b+ӌo{XYfi}w;O]%i7>Rsb%! AEXDA?m(-٨5b܈ipgY+FHd<АQ>4jeՍ0"[~,1vn͂yEX\u8md 0ͼr\e5]dsJץγA߶^;pN.nFgJwۇʖYw%vglR,a&t:i2*_[*-g"SjmWMKm.%o 6˖~Zg W.m&ܑkhS,Etg銀Z9UY,[NIb*^RNO6Ax"RPWLC쓼GFe+23`ǗdKsCKD< ^"lDC me*\֕ Tf,fSe[qh໲R}N^^*$1bz2d|hgK`"yN1qs=n> ; !Jgԡd M׶:ƚNą@=L:N6on=LBx\卙CwY~I4KD >Z*\XJ=vϧՙC ͈Yr31Dp \.۫U~;5a1!o%Z@DZiH_+վXjXk@hx_Fp53 L@p\)b6r7oh+k;u/`vV;T{ФNt?tev-`=tޒ:HW1ikŅkjXrH 4sMdDwL2 I1E"b8A7aVbJCnF] k7-{ʼ2cxzʦd7I8xAťЙLxH([=k;k!t4ݧݥW4뇏;|ʧ(w8bnc9]}g>7 Q-,z-L1_=q!cGfNQ莧 #Zf1X @  [fTi8>4v%IZ?rʯawKf sx;ȓY_?z+ǜs~&JEJ( mRiۊ[ZW ^^[fv8;Y]{ 𯅆HFg7,c|.ٍ:8wKʨQ>=0BIR#sJ(K2ݻ*:7̩P - /ͲO}:H0[7feUC 4D8 뺰 >cfEK./}uqcJQulzTW))`0ꍖZKE;};_<;/l:2zn: I5r ,zņq *zqZ&@KW7 3Or'JshOpXWIa㮌% M~å,d￾§.f'DtF4r3n&Քw†knB1AM #0f5\ D7JXnQh3e'6z<`ha4[ݹHaڧj62|xgNNtG7UE>sl14> stream x[[sHv~M]o*=m57&34;]R Hh~N˶*y؇K7ԬRʮ.\IɓQ|8Hg>y~qtzIe֚#BdYN/⬜MMe&y3LuGY&EpfprUW0֊xd.'S OeE]MTq&E\qWtb_nԋ=(늚 Ib=Ll&aݖ]h *7-aS+& +0nsPJhM2Z%TG NfLM`)j2q^lbͻQ4*~o",228&⚕uY 4 щWmLo]*.a.'~].0O+۩֙Ҙ"C 3h<&N9Hݮi[IBILFHlWĹ{$J%ddO|;/7!rK- џ" 4;*WCMp`V)v Xڳlh z6A  Ex pNT֪ȹ1=6#ܴV_N0{ѠLvMBJr(1G9r @AS駶ncAWg5W7o\ۋu v͐}k%9-qk b lWցS jojz s01CZ0&wW5|3j.PcNQAϣa1E-,}7(m9g6_ qg>WH,q]#ʂ>9rWQ%V{=.W3 ֽ]tZGzJEF񅱟@]u a8Y]/o1؀#]"քywt,ݡU_SF!ހ FQ ۢp] 7o֡8Mڢ;tF)E1Z2iRaV#Q,#Ԍ $c 0޳.+/<`%:#ePIo ScaJIcY[#oaCCTe% ߿-c;ۖW$Ԇ笾5$ϋf[h P>w z{WUJfu0 o7yC_у^.˟K@I,jh: xVq\۲}wšy :=d벂&9+8?LtڱbaNtSTV wmIFF:@sGc%L0C}:wku>UAM$+pÜ[z1Tw?`;H^m18yiTA8RT+x٥PH|D #ax'&/97j~bmnk|@ G%Q%4jڙUy7 `JNJ-UdqG|F}W;P'ȟ'YQ%^8jx1IW!ܢ]Pq΃05٢bƽ#kk>/:@#`wy6х'&_pJޜS?K>/^畽}wF>0KL|z".⵾)$cdcʛ"G-ie%qQ|Thjs=L ٗ>ֆ89ٛbwnw-ZU38 4~qGg˧|fnhvޤ?csbr |&̱R?̚^HȌIedc !DӝPfSX}ܤ#FLPN1E%4~P~<~*)#=̋9oI"Kܢ2)dH)c[d ƌrFX1> !U|Sm:ѨX4mY|>ڦQH+-) 5{TS03<)ÞXu|2NjLt,$Vhy),HMM3<؜ qaqrt@'{XgOA<]R]*0Qb3KH'*Y"\M#}F ov/_PP1e?$ACd~CqLM9ϴa8q\vK FPDx2D(,>r(r0u8ຒtY=?*u?NǢrكLzQw *0$`ibΔGҋ1`Č A!-dnlf}11J?]CFkkW i~l墨y6ƀ3n+SqJ(UMHG7Xn1%b[͋}/= Z.tMyE4ޥ~"!2DruKz-+2,pO.ƊY>끒=tZ wѵo>k3goũ#K[KJnǯKUV[sSHXDPXd$2. ,UFg>D vgC:y@1m,,. ;_zռmzXP3յkRI9*d3Y}XF)L7H? Hm>G5T¿Qazi_e*<ʢcip盆w 4J}k@ub iIZX#G#vxCr^OH=&3cLf~#({) 1_L[B1,F+Ѫ ۝hn> stream xWyxSն?4( -=qD**2L eBJ4$&͜4stn4iZXP@e E\D;uΗ^PQq_ ߌL%QEp`עв~P*7G1/sA(G,nݖ=e]vNSޘa\҄/2P+Yj%ex귨vn^2a#˗rgS ) f n0.,mqNXVi$A¢[ʪNZF!5 9PT"/S4hl"ziXQέB)I4x<}!YviH$GUFǥC1( hۅhޝ<47l0nfH|I0YZY\j)[n^䅟ffY(㞂IJ$.*]A&19ܤ}IFiT ܈@>*44#o~h8x'р3:Q7E4LJ.QO[CZ$0cU49$3!9 "t] ܵuϺk+x*ހנxzD ͚tޮ̵n/O8.nعtmx_ ~N~ P%~ҍ)BWEv`7:3zxm8/pk@S>Y:!.cMhNp4#4 ?fhN4@UX>&VIk[vhT4nZ1jy4&y2Z46z&_2HkԒl %UHn F42+9u0 J%M, |6}LbʄtUgV%Akȅ^ =u: 䞀]m]Sumf q#:{/9U r(tZpr8Y?Yha@QSQPk}xv&[5#U -IZB(t.  tC7jT [>{V2&ǠJ#2n> ?\ L}cili8?U* M rj0HI1)\hc|z?t&_HS-b3Z6rzeT)F9kmTK/Zu>%b|_\C7iJEa.,g-՝5r[@l.Z TM^oQX.M+ @1Ph΀iʬ-2r$bd5rNN9zZ`8GNP ڠS]*ʨUM6_] oP5e 1tvhZM&|߅#nEu~4Yz*@CO}VH޲h>0oѬ 8f(ڶwh+;dj Ҵm~M˄1e3a]nCm̩dn<o~|ڲz{=]H^Vd,E,`V.ھExrXa(,p7#3{Rђph_FFEt/d](bzNg$⬁*L~Qg;Gx}Ml;6ZH.֠+ ʷ5h#Eht<\~vW9shAIMY򢣨ܟomiofeyYbD΢ ajV@I UtJ.)o5:r'hl]mDcH(6IzP냈=u@p7ؚY"'3d}&X*u=`w) yA< Ugm1 9GǷk-5|Nӎ0+>"rJ.?H0~,=\ѰawEgy[Cc.M`WfI5-(Y"s3V!)ם3G}lf0;zQ?+8N"}ۇ$D\_m.2kNG.;?J,gWjr:YJ(R1"mml\-ļg,Iik5uڏ>*γPFN7兗:2FetvZU@]vT活,p#\@-oˣq{73xuޥhG5mzP|AnQJ˴~{/bh 8F<ߠV xD҇@d/xl٤(*F A{Hu4o5،6H75rj2srӞ>>48<Y pSޮT^W3e LcFf{ 0Zu-Üvlj6T.~k w$eVu&=6o :*aV]s}F?F<o/mc7qkƱd wdGNʛ|9UYМ( ŢBMd=Tf32G` 1v1"'{ϨPų/ϼV8,U~cV?y\5l/=*o243ׄfKe,{"BQકi>U;%.;,q:%dy'w\$SGg#<$o ShܯpwϦRd'DяD+s`6]+ uAW 1NO/I=14+d6銞I|6_p,4#[-xX|vwywmZoH^VaF't@'XZ<-{p_d7it GѺS5 %y9?ѽ5`{f{~ AG H] 8vEa~JlU%42] u6s?D GZ\9)~֪E˗\T4ăCмl*yI2Wh$S;&&}D4wG0wt+/mS #@ djGSwf℺{8 o-L]$es4 vKIm7: QRX͛6ŵf0dD鬁OP*,"endstream endobj 269 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2594 >> stream x{pTϲI<k]U{F{ED@$$Iddwwϻso.dC.R ^vj uz ALߙ3~yMx<^ɒOO=ݭe] b1B%3J\ū~ӟ~yk3Ef|Y|zL8u=]Cѽ JlzP5b/=IYVB6v&NoJ~_\xX0ڷ A#Qo׼ Vؘӓ񏒃{ ;[ f$WYu52S3k}mpdyxiA*-</D  8;(?iٌ&b VJaf[ΪX+cSh&[ɉ~qܸHJbIvy?0w=x  ǩ/Gz "28 /MC@IL.+E2n7/vNb9s>S2wŔf!Aוd琤  8"}$i(D5;{˳2%y=r Hz=22?CPeփ Wxxp1{WWk㊐H(=|mЊK,sGTj^)?S 52ԚEҮvF璻m*Y0Twj~GFv[8f% ;Q}~o% BzP/هG!NcN԰?TԁJbr6kl?vuOAljѰdX BK4:Ѩ]~ }$;{ rMAg",lƼu[ͫ/3##HMaGְCn"9IWJmUEj،K}"mX_,ϩ:uEi%϶lJf㞄_4̢ݟFWwj)ENS01qxŞ߱?g vw~m,E5UgEc@[3 <$T̞<:2t*䣮1qh! IU=(@hlT?W4.Ґ1@uWmT(׽e5cnC==p8SҴ,eLitg2&]$YFnfZAzT&xB _CN^(_gH@unp Q=(h2V┣DIr!sF=9ZلV-f(pB * I{pObAaU:Tp2'A5P~rT anC73{ 'vH 8x V[T;grk3;a[H <2W?GB{ [/!VeNow7ӌk.aCpC=SJQr#ol\fΤ3M8i;M]&uMR!e?Ep.v9*Ee{o8_] ?]jD˗}]ƢI n07:ϙ>G8 -];)6M`-[_i% !%fG-7"MBfF}Ԡ> stream xkLUm_:b0K2%.q0f$FeHLdl8UV D,۟PJ)^WpYaa$h\5F}w?$?sr~9RxDEVh9 ]^~'q.$yr^&ݔJ6iboo8,.Z2f=:bxXvi1X:҃NhwNW x&bWgh4:+v'ZJaؙ,U8ikhl~aUN̈Ziv͝$2<nJ˜hM<+c2u#Wweb LeɩhP;^w?xK C &p=VHIOJÜ\$]E1kb7X3kbFlsR y"Q Rkjt cXHd${/֥^sr5uSVp+& .jq/ #CyKd;:2慅Lv^P&X0u^Q3^7 ɾ^م*`M!۷+~ -p]{w0<2z36Yη.νZŗ@slcݑP||TMo,eS`6:Z>k}4GyTW"Ç.Jo3 9t,I[S&!]ܯ' BaU<;EI,geU = va H+sҴRSxH#jgyvSX"EvB1 3thZ+Gmendstream endobj 271 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1278 >> stream x}]LSgOmaGVv:/J,.[4Ώmfsa ~rӞ T84sa,n(,3ĘݼGvs0WqEőת7E P{HK/5תTmljz-v;}UaGrLhlSa(&ny?ob㜽$4gsgye>COD;u*qS :}}0~̤,&T:[SjX V+jŢ&7OvDH_8i +U-Y*X<>by>]m!^1TݒpG β!m4S{Ê50F`Z\əJ0o^ފ:fʃ2Ɂ0y⒒|׿A=\7ZTMm(3;ˡ+I 1|Ql+ܖp QYScPTP;iZ;;NkIt> stream xzwtSw6I(q^ ^ -nwٲzwɖmcl1@ Z!2)3dBvOeϼ5={cAS_ NwòYN}iT4q]k/[&po=pk7̦YͳesZR(KV,ڸjekVԮ[/>ȕɩOO,'X,_DA2C傇+V <&(.X-xC`M3O f f <#xK9| / Ă)@pP  Q nL3G_ו^~~"" /knw_n~Sf--~}kmOvvG&wb)M钬/;3:@'oxyѹ=x􉻞=i~ <}&9V+&gV)҉Eۖǖ.6nH\V)R %23ہ3P5 -#Ywz#zE+cRP`s܂{%u¦Km:%i["+ ! Á@cFiГ$U za⻏hb>kll^n|ԝvl.7@jv4vHzԩ@f͚&p. F7'޶wQѯ?!u^ͣRU;?wBT527==Q؜ :ɏ_WO{vp)'o$F߁]H;¬wiuiw+'2viZ\HpLFhOi|u!M9V m:1G^r?:Q gz+zvbog߱MG]ǀDmÛ`0stҮ%L7eCs([(=mowLC*B;czt%9Zl}E]7{L^r]tT=;d+F_ C})wq׺ɸK~]|;7~WZuVU#=VuVlj ueQQDϐw$wNzs*T)Q^"ažT'a%=BgӖ-nh[֋VsSD;Ɲ wp}kG3V Vh :2n4{%J` C ƈab"}-PbDpլ ɝ UqR{s:\kQYDX3`@ 'Dw%N{  csMmKa _Ypv-`ё>4(&F_q>/ɴvyI$q}R[34p\ힸoowP,XFJv^)#Dv^hZLk%Zn(МJ4X 7 26ӏO b|h졎CP'x-ԶjZy麚ʅE8@a3 ]|K ;*ZLrP=D,zl 0°gV2*nP>}7|Pf`]{H-He\Kd խY^[l Gդ&Ȟ0mVf#X oK~0ע;v=뚀aS&nLP{"$ql2m| =>C'5>Gv`+6b]]njAjBRK zlЙHA7DgBE#,MmCS%lܗq>ҭ9)ՂqF|tvIL;jT oeȟ#|tm,<C۪. .kIf,*j^e:4iU9VnY3Va/3cݏrL~ykyƘ`d$/tu/&1AAc1Y 롘]j5aDlUX*Uue a%U1vCH&ٟǃU5rd揇a7O}y6wBQsSЋGNn5>O"E*/֚kffВol8B} VEgjV 6>lx"?|M=KCk] UWYlTwⲘ PĈb6@Rb?3;Σhp4[mk%KS5&a49t|l|,&^OӋVc0y*@(TL36$̕I;Mn?-2^LqRJ=F0i6[ _tC, j-L0F=`81dݗَ^" #BؽVf 9@=Ա:mZi/SaUؕqeD4Tl|JnuY{aه8Ռ6J% 90{Bl H>x8OݱW5 /'e #:(SzF To?CAV*(zsFZzj,mٴ0˖`k+UM|l , g|ܝyƄv9QhrkTfMIs7_i-U;ˡ006!=]@Yw+y-DK#žaiTMl z`sD#4N7CYpHc(s7@)*-X--ѓKtc#OO24c#+^*eYG,ٸhоynRbd*r?R!*Evz;r~7&u{ޮތ:R)Ѫǃt ɦ?ÞؔF͏&֭qkqe**؊B !oZI;!w>\ esۦrM򬆻$D uGx/|>9Et:1Oe8|?v̛fpzl;+ef7)d8 Kbk!4Sz I#.WLfʹiS@*ו/.rf/?MD{Lhxwݖ37>NGsN;H?t4ZZq,&=QqfgGf<c6lOщ>!hP]ܚ t&(500hIɇ6ktiuIƙ0睬c2SK]@BL $k,hOv!]+uqY5)OMFt,;YT^1#l2!#LCBڸffxtoK h;- 8qc?[opPmEui/&M:2%.@Q®QbVFYӚ.rϊdeiIF j[9-ol nzSpgut۞=@j-MXsVsbr͋s@Z!G|d[O'Ϥ$ޓx,dšb5~)ZҡMbG6 y/|d@ty: =عRcVi g^)bw wWlm2 Yh'2׌56tE/R:7-Vc2@(ONQ,HZ.FU;eN„cm9Kl##Ĉpԓ 11M?_V,-n׮ cMI板8I5/XdP r͍s:5K@ B4 GB Қh Y[-5dI-w[wk wɾHab=ǴFvv Mf+un\δbh:gRn$>1X* 0s>ՇW[MVHBʕ,$q 9C> baҸ z 4X>|n\b(5Vk6H+eS~"iv wiHAE QƋ)0fG]{Ƣ][!&&5w$nD?MͯxE9mf Rl"n^ƃ)< O@0 2ޠ7T*y(Vv '[#kϏ]Fk'~j?>3azIz;lI=rw݄nhc[]kͳaC:QոAخkJ,daAnXL)4f`$._5{UUVWep+Pb`t0ir2y;VNykZux]~UEF˅bZۆsaiaFN ˆ ?XX>b٭8C!aü"} NI_ʛDy9o~!|{j˓ < F1%A! Oٽvfwn9Y9_ &]'1KܗkOӶ4 Ѥv= ]G aclF]o8~?>z?ר؅jh"DE)KB} #?n?bl7H%f2[ VaͼY@.myoxH=GТ WQK~=-w>z+Kx@oV>i%'y兘>'fvbUBr7Adh%rFt*$ (WQ& +uC˸縛lxCw{"9譝cب3f|X5,# rJMsA:)KM:Uxym_~)u10f b|WS 3VO-z2n?1i [6d:m[^qE=ed. y6ktkn\v]Zpy ޥwN w wT8DL-L2lh10tz{4`m{pT&?.>L~0~HK1n/osˤ/Utꐛ'G%\!?>.p4oM X&QܑdڐQ n!8 GD|*a>+dZR b=JrS^nGn08BTSQ\?4҉;ǒɎdUA/ٕ{*d>}2s>z.qT RbA9]u.[C Vȍ9M[MXv? b[~ALbTkd񶺑scMPaA"w7j씾y'i'4X/3'r\zEȳ~/Oι/~HkG2}Gr#H? %!WxeRe/R{ΏMtf£H;0\'aB,~F& ob..hX, tvZbk6,ٹ»$_|oTez|кrLuέwa?Vk# ^6N+&T'ͯs'DZ*UO׈oY6]91Ɛ;DwGT¯LMZRRܤkt5᪡1*H|E|ύ[JM/.v\g ']N:;=ޝ! mJno]N}rB-2mhD[ %%r 0P>ݓ#(:<#1{Ë:z[mnG~ot 6Yǃ (=]h}6m:j޷8 w-$Nݼ"pu%w>cS_`+d(VZ=Pu0 _h 8|P wNLɡSl^_췅ҞdKES y&UܭW F͋P #L`r;p D[[ !_4jd9V%q{|\$.Ѐ04mv@BCȐ#hl~c"X"owkUkP4n _+5gtu$J1,;!dA40e-㽰/mHD-Ҋr4 MX3Z^]{Uu|\따k.=\Bڡ;"qYͤ:aom P)*C'Lr+iDkKcqZ\z:wT 7鳹HzOG?k=MF;zoV\n]ITC5[X[EljW k:EnWJZ T̨>uꦿC\l9x0('a&l&s&,hyz}ܝiҭUd%>Ծ(vbm'V~7`NX78lJ4?VRI"ͭ3z,")=#{#)JT]jJ V11UӬr3r4&&XgFfM-.Ȭ{Il{2]rW\Wv9n3|qh󅢳3EN<9JoHљw)Lz!Eε/GwGϒwN%/.!D4pE6iXn[5+WJ'`B lPR4):gFmGwnз "& T-Գu8fqh c%)3WjҬ6n ƠD4jEbCIBk`'gKYʨ&BtN0xH-!ug Ns蜑_s9~"-q+pNl %@/MxMtq"G܏0aŦJFsR:"nNlwn$` ڈ#D&fviv:ؙ;}wب?q2kkMv#zΥ/x;U*uB24yH; _,_ܖrU.G~-Qhh1ldd*2/hgZ0ڡv>yO#); }4Et%/&{#}X2 RwH%uX;8^yū)ro9>4 q kv@;ꯦWk)QjHT^!vVY̛rrMwNt݇G:z}@*[(꠯>-s;=o,ڟK6q>ݳ{æT$;vD]s~bjF H kS8 հ|$WJjx;$5t\aReU[h 1uamϻ㶙& ټǢh ki~iNv9+tAy&[f%?XwuO޽qw)M> @)w N||n7n4 Kp`ag`hyewwTPe9i~LY8 -V{PUWe\/GS萸bYhDŽ^dV聨=bkXI hM]@ӡ~ɟ@BK^D Vcžo8 oKF&)36k\#BO/ؗ>s/.}rP_ rtg.(OEblꡖ7 Q.UZEv}$u4W4ݘ^=8,6 >C,:E\W'hA֖sr}gup[M&id*֯^PPL#7vUfzmRz -?T5u^l٢EH_GG we~FTBNIoEЍXQSmxhVWѵ]@ѰZ5c{NiJT̈́Y$w'o>>Nq~e+ǰ'vW5VbTՖڷuK{ָAA_8r*tLڟ]6uvZoVr8k tp~cdst|>$Chf c%M[|?u[8\.L`j5;< o*-nRi%..)x2XpkπF$xB~ԉ#s|E.6 9ye#]EU ^>}r]2 {(F'6Һᙂc%o9F9pe.4)q fM%O>7Zgc۵}-_>v- aYu|(P ]-)%خj8.] n&&6.':>HBW4>C\}ފ򦪍ۜ1C bHw O #yA.n4 m>"z"lH_S\ t~Q( `H<9njj("gt=翰&r~=' 򩏸Ėo~u*tcS%@8hp$4v1siHW#ttl 9z0o\nΝf+ US Ljݰ9ē콯9@c# $uH</o^7:*+*0HZ #V5C蜳E(EX鼴B"G>h۽>n: }vo4ݏssU| ]+cv >k>[Dt*G"Lw@)8o׬n).^|f ?wqn5)ګn.^j?}\d(̫[TsmނEouc~d7Oendstream endobj 273 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7630 >> stream xzxe 5uc N&L909,MYMMM3 d awϘW6fow4PwUW:sn+ k0wRaaNAz=<?q+&LĝWVM[=}͌Z~ΆE%K 2^kW_[wi7[ ^faXoel. Vcc >{8l!6M&bIdM]MaS4l:6q.XW,ecݱX> S6 {{==b[M@`v5gwʶޛ ;%n+vԴn>}ゎ;3g'<şߚ;<Ys].vuy޷^Bf$ݏ6ҷٌգo%=@_Ce/e_:4[*\j8z5ɗy|**v=?Dj{DFc?92Dƕ˅ U!(c4n7'|X\hSMF}Sܟ JֲockZ) @QvuMoe9rp68+#©#LBz$.kUf[ԏ|L j 'XH3 8bk6$6m  n j K+\D\~?ǜ| ~N|# $z fԸ(w+ŧ6*;cWۀ4&f7vFvwbm!@ȷIR5'>>vq; KR^u% 2 xvզi[oi6k@ YKh JP>bvA.dⲄ!<e.(I^26k[p+w{R+S >e|#h0ջ&&'bnJo:rKn4Q=>V@Ay©kyE"LR uI1r]g_PMKf #mДa+FA 6渮bM: =lʊ8j+yؕ/h~蜌ƍ]2`e:ɬWS}Sm kCͤg̎f{0'ToU3YWd-l)~4 X8H~V3Z 35" +BI< ;Bu>AlYDt!:eHܿF/T[ ;6 >RWKg `grLw_=1y9H8>:0 84rTLڛ z}CP"A@}vJw06zap(d`p";aWBAD-;f{쿌S$\4 sjW-@9)b'J |MQ9&G~b#&ɺeDl}&bb,x +a\㤩;w%pj{BC$UR6K |:!tIbo l}oLfmzzՇÎuP]"!v"BsJȧ0E%Vvsj>ƹڢ8* utQ* @p4v`1Lݺd "=`w|pi>+̅#AxB!1;QG~ȶ]h%E"B yYL IDR~Q`o&S(jllMf?qXeAnÚ}`7\oyUnGnkp\¯)eq#v9L~ẵ4 m d("O$B4g30dJZ1U3Ez>Ja{OO4O6k52 #>ya[ Rx_Fjڢ. -- .8"/N|+p;;"g"gg![<ghXT+&G;43&<5*p8L|.JWjԉC^Sx3ݾBҲ GKNQEeoU}r廝߻"G^.SSۋLExe>z'wuReVmbG^4K!S4`QlwkC}CI?y"9"!ǘbv/.ݭMӤ+@@AW\\Y;D7Qyc"]um1]pLDLs.0,NϽ/s551ke­U. &/k -" 伷 c_C#eqF3:rnbk< *nAJJ c$JL-3&O!VpqL ;tQ/ y%sd8EVj$i'pjit'h*F@Bkp=aZKXNw>Gl -x,%DN1fM86/UyqڋCyNx²zCΩ Wx!~Wt*>Ϝٙ\W3EL_b' 聸VbRAʆ}w2-zfCJxd;W"mÒHq/ ; (et=QkzAŹKHTƴ6lxc `;=dq+iÙFZgq:2*v/Yjm>MLSٺ9A!lU!i h}+%)/T"䓼v>ٜ˔ _fX,ZnJVE^dJÔ`A7'U>GcDxpcEA5+ɓh&)Gp#^rP/+LN6jT@(h KHͥrTOI [.C3:_a mG5 D7{O7/"73*ʫΔ%d\8UXG^s.,".a" lIcË@!P@&5PS;bgSTWjV<~DnF4:>o69.O*t nlG^u<oBLʲHsxX`TPm~"mT73KЍJp=rՁV`*^ْwrvzޤJ4/]ŽɬTgٰ ÁFϹw٧dI6>5v8Ir9ڈ(RI%׃`1Ui:%N+#>"YXЖ$^CS)4:GH(aaNc0%jk ~ͺ GFM°Zv6좩ݱ;7bÁUHt^7 hڲ*r.Œ/'{*b8m}M6Ix%$?wX"e` (dYY8Gá&m:S/-gRwTpVK$^o~ _򇛮# v Gՠ\ HNVq :s4Z̀?aFMBڂuPybX$V`ft82@-J{ͭW>Rm#Шe!]*>>e9^-ݏ?@6;R;|BŠ;:⣽{ܹz /_hͮD:uhzz? t 8U P'soqa ib Wi%.m}_J5G%cӱ-4`5* \9 ڝu¸XLRƚ.~Ϲ4;";%A1!ݲ$kQI$& }$wa)5M[_kB}P*R,T+W:f0RNDGFNyx$/\޴9؈0.j,? !G`˅lfΑC8&vv鏷9sp (md-b qߏ9z_P k%Mk} `Lm?RM'y?v$.6}HMKW7z@"?CwG|hXTQ@er^ObP ',& /UĘ h$a07BfG j#TQ9p0"6|v{i&(b<VxlԇO Q/{ JT4hDB2]gBX;ͭ!x .Cdr$x<lx'EBԥQ>*U@DWN+QP du4!y Y]vIY"fRT~Mj Re\gh&Ioo.ᦴL _?'~ɳlAKلאa_7%鸵 ӌ`7;]Eiy+z {Uu#yv.kTLPF%!jz=*^!Xf‡<3OgҟiiEZ\$P U3ۊoZԯHzEF= I<k#qcVh ,CQ?J)k JDp{(E2Q#zA/ΆHN)DR!o{g !eApx"kb|=K$+ 7dRBZLqzK9ģHΈQE@/KGF1n ҇Vs:I70lxOnl ,nXݕ=hU@X |sv9|'XN%YMӔCYnl ~QTzA4dUTP 7]Iqӣz]ZdswSd?9VZW#&_=|۱;zʏOi &vq#w24+Y23ހ}ti30 Nz 'v`7W1 i%z#%vrb˂H8H/H< zf'+6qԐus1y߄ .u<ٜ='%B)P/ڮ7jq䩻.+#H^m9r,Y2Ik-h9P~ڰ޹w.tkEZRHyZQI r Sd' l=j>j=j#ȁh𛏆>eiee_*K3<ؐ4jr^?C,&83N/H5.Zc9K&~B$(vw  [^اz^k:8ڽT*T'MX9m_Nv/9eFp9mVJ֘K>I8 \ /U xJ0"Ol$""8X%]/F|mm6ۛ`__HsŌðO [*WzfY'Nq>JR,mͨB RC_O&Y>ڽ> e40 | .VY57}ˬ!ߢJhI/sX| L6 PW2x(ub [(kM5JnX`$7ч*NN>tODe1OwGց9` 䔔 V{Yp Ezkڷq_#yOԋ V]Dɠ< qeZY7hAHZ\Q|~+ί<.ϥwi=F҆`Li;lun{υ7B?IAZ]KLh(KlfoPEV#ZHV}92H) *L=%j 6=Ӗqw zSY dCʈrҧ |Dw\8uOdǸf4hsdۣjr 2ƣ؄,`s'WtHI}`(qh$| ߅cb2OO}Zk0>Ð4ө-ͼ+͇#)o)BI70p|aDXpj} 6/<0ɖײaX/殑k$Հ$^iH^8#VWnXXn7l8yfqOq3AH 68* 93B1K3sw"T꼙HNVCLD#5he@Nfz#a85F1iCǴ@1\ɺ J1B (kj !eHx i/? tB^Nb_F?y˅V %^YU۸s~ ~ qWwxA hP X[UROmpk1 -w9lolv"`ܳ'{\Ol9T!J ˧UY%G1LZꜦ|>:^يkPmFlt:Pe'i'l6-z ˽\8AWy\=_E֭Rs+̠4XVKcqRJD~r#_EZRl l֛lVaⰰ!i\Mo;/ |ZDWTW.\'SԀO a~G-" źPA27Rϯ[FNKdc' .\dYKкM"&pӋZHRGtҊRl-4 HU6u=`n @ _'.Ό0fzO|ǻbo j몝b"1 ⬬#)8 5wV< "A(>6mbs8ERcBҀLf ]Seɧ [[ T{td/endstream endobj 274 0 obj << /Filter /FlateDecode /Length 1706 >> stream xWKsG^x ~f^;I9[[Faf}=$%RN&@NSMt3u"tVۛ|4蜙OȕTq^n {"nv-MWwp>eǠ؂ZkUP@: iX٬G,iǪ)f$6*p"η9ݮr(-8ɵ~_u1ޱ7(Kp)}),,+7ˏƺ n_GXە?7&ΤB ڳu ^=$؄Md)b9PCbQr}$ׅfta1 Fd99;_yz&*H?y=t < 9ާ  z \%c~x,אd9+Ə SLeפ6pyLҠ f"tv3iݽN`_ 5 d0!}Tu?̏Nki'Z^f<)x"Z*(@0Hl=Pn6Uc"Hw-!kW#B, ( b`> stream xZKruC66+ r ;Ý53\C~{MrVCvwUuu=EYE\l/^_HzHOiEt,./x\Hi i;Wx⟇u\ebYdQ*eȯZTq)~׺AG<-+jhPoa/bV]Sx~AT]nj(m⣽Ի,M-"EKAyToàq 4H_ghhZ@P xʉvRLR$|/~Ecb%"ZPVǡBˆuG! "# uSn0+ɬaMR!'ό]|)* pZmrysE"epILJZV}'j_]< (lxM5n9JIdYQS%jc S+5)j~㞪sdo ᔵZxcj_:&Քsj/elhFmU]Q%]ِfiL²zӐ9|y3cvT-HĦùek/ -AC֊Xk-6U{^K=wݱNx>T=(]剎6JÈr8P2%mHQh,1n_q@ՎRZ_O: ܁sk,Ի\!u)%GVz[cVwgv[%J`Y=* ߚT\~ N>%r{mPާ| <0}sRE~sJĢ,0u =xɡ<}",謉#gz^_eN7 *48-œ1u`K MS'IP2dIC }ܮD=#NBW'1l3 ;oL JmSRުAVLǨ3UR<zG \8yCA]Zƒ]:Yw^Q$*E dۀՊ!6LikRl G*+MI 9%1Pwyvjp-#G4huH b?@ M*oUe1:pe 3`ވoBs  0|mW?/U*z&l*M^΢ SR|T,V}Y>*>K?!8ϾI}/-0>$@iLْZ攧[~Yq ϏT=mqݾz)DLd>p#(fLDK(D [!!dM2\ɂŒ\A 5tBrAR0X: ^u)Ǻ"1iWz=/K9rEβ,Mw(yfT4C$ 5JȹF(L틞(,62)Yr -X>Lgq ?P7rj]c RT}sM2W aE*ph3n!x=؀7LU\ DPa~{og=0XxNE1[Lwxy&Bb4 *u4ZG\D0 &D<;&_|@|am ]b1c$,( }K`a+1Gm?Ld\~ɥv?M g]+AKqhž>"Oo F 8Ũ9D!!'b,Htw PewhǮ]ʴC.`.݆%*Fq3Ձa r6w%@~M05(оSC`K=)z49,8JgBЕ_9<)n2MV81e.1gθ M՛]5vfHG-yZ0z67vݻ˰cҁphHg Zɡ1kHe$s=ϫRQFr,\ElRVa^@)Zp-KJвJm.H/?;60B;G7 _[Jl}?C`a[<̆'l-f DV{jIcX AAhM{ Rvc?@ռAB=b 㖥, q0O0=RaYIJ UݶfmmW`j3n+S^ݥk$Yn NMfiA3S O\.?Й(1]t4yNBK 5va!Xb'YoctKZ'kj9qmAC 2XrM&hf|fY AMOldB~%wL& &10Tjv-^qWQr7k4mFc) !T99E~!fKưCu3OX0b^% c./?&yM@*<{C]az)DK?W:3am+kf:S`[V)2R$oBZ嬔]+9?S1կ-5iOZܭ}I`_.\k^p_ <(KKai<)[ ve85Dp'.-^8U-]R6&W)rp~2 tTˬ֤ӇSn9-3X\x椥zxDzvn؍MXEgLRplb%Ϟ7>ERMKqN4]TW󹔫lP;יQ9g Ū/ob Hs88q$ s57*:C7_/EBnsj/\mzjv~&R*8Y s\la6ON\P6jO>l Wj6].; Eb33?x?[$^.^hq锕"?,@@?zLF5ˆ(P>Hw,c6Kx-Z㯨4yb?aif|︤p<~?3O3Ŗ.,w{ttx@\T΃N @.=g;%)@rꇺp^3Χ+PE42\MaPIцؐQx2vgICC7̑ (E:L B)]Č.2t=,I7ZixEƊ#* g uR7jaw[D\=kW?n$+4 }1|~b?qs J-Ԓ (ɕ kh \IH9Lp? endstream endobj 276 0 obj << /Filter /FlateDecode /Length 3144 >> stream x\KN>al~ĕ*KJI*NlgS9:P$ˈ˕AڛߛCo$Xrytc1_~18o~;~y5;6pZQ< 8nl s2\%ba; m?038c2fox(8>qr\ëv9|#4?ˇ0,,C';[MH.7,K[%`zT،1 2 -.8!,wRlm [?N~3zu5v(RaZd01hN`cf=Ān+$YNo'ֵR=X„cLaOb^-R}?pS7\ЖGe=keagM{s>Auۤ|`!jcYCTMl:P ӱ\!{vX҄"X#fYX%5g@qnj =C܂Շj-R~풚+L!G<~

0>=c;\.%V($'1~dz>PS.OTw[HpA]aO5{lV[%J=S#"{tG˖x:n\;[9^%~>]iW YƛHʳKU +}IU~ %3ɱenQGٚKcQ!`t輌x#/> stream xU}Pwj9{KNg;zMQT * $@I$/bND"VwX:[gvngggv;>y@ /MHIzD_~\\\r, !.ƻ*ҳ?%"EAaQq*1+G&_I"NHT"H'^&!Mfj"F,$:"[yY/ 1/4:c *4Xv0DV߅apdXـB-nTZ%rT\a]td;YOWGϵ`AhQ2ˆmOWOt 4; 2"sqrK|?W}㞣On[ !պ578_V qAQqi}aםEaաak(a#[hWhb8}T18ۯ 1e2W쀭 ^\ϙŖ?fsTqɩuf0ǝxB ~7G(P~{̸? ho?>[` hj[TG]C`ncdwJZba,_==X? vL$d4@hXZDe/49QjsQsmXu%z8\jj+c9uL>b;3)+ڒuK4lZ YZ_[x]> vU 1y$NpV\9 VכnGO:Tfdi0'!~u_xb:`ةecw##0 O9V. |S21qqXue#k2d3lj{HKWpx)g=e3“s|YGΨLd k>Tʀ_9e"{L]߫}3Ţ{o ǏƁn"#Cw32"O(׽o(/)j=H])߉[Ң{:A7ۥ(vM+TI-z OUԠmoU֦mT[-,kqG_By_R2'c4wn3rJx8Dp;kl..33>r.^v.pS56Z7Ӫ NP@_՚2nQqgpHzҩ%u|`rvO;}"YTZfCA-Ţ]ՙZ[Xsޣ&:6YB,n53Au~ϦgoGjla=vdhy[w*"fY` OOV%nֵ]*Fs؇N?MI?׭-+;ѝS?sŋ6HM%9'bF@{bhv$*z\p?슄@*)7m'hVUV}hFᎦ6Z4ج=TLfm6־.`-K8̪OE{] 7zp-껽Lbp5eX(P7f=rjVW 2jXYIWVТIŦ/ÊIV2TpUtLA"l> U ڎ>W>1&S ~m\d-uDixṊkf}Io_o߄sdJeha>5ޭcGHj׶gɿek8e.Ljpa쏌GoB8ub#Ʋg;)PU|0@/2;z?#H`sT4w\SHVl5J ؐ[5. $-"b YtL}|QA-ŮQ^ 7 qWendstream endobj 278 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 821 >> stream x* SFBX1728\  stagTUBHg(xhm_XPĚpD𗍑z~t~srqC#| $ y}wSIK}]4dznSwh90J^UHcdіt\<ۦpT8j[ynzphh^}_`j[*!p1Z8ihh]~lvz{rv}nnnl|tkeh3+`#f[w‹→N@$vRF2ԁΝ[GTH;rr|{ ? Épendstream endobj 279 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2648 >> stream xVip^!{XQ01&$\4mC 6cF|ʒ)Y+Y|%X>mphBb&\N1L mЕv=yW@L¶,_l!,! ͟Ad Ρ\3+ڷ?p\DIRK(j+ N©j'ZKERj96BR/`>4(eȴU ¿LiZ@E8ӷL4cW 6lf?~FPgIYaoXZ=,ׂ0FJHa`&4~G۶1\:('3'4S'KZ9ݻ1 T]~05XE:I$"e2rcWsE}}~#&]ڨ &1IR2LduN3:FBYfT{ /-g*+{ >zz'ޱ8W0*BLOjrLǾIe`̡?P,eO-u Oj.2%^ oͨYw@cTӮ>m0MetafML= [ss64BmaKqLRHJ7)*ޤRAx)D'ΘcmN# r;. 6*lWQ?A/ߋ XXRc8L)5LPc `#ըr!g8NgAWbD\^SiFy(j=N]Y'nJqJ҃׾BDyg)ϦOf V}ʠVR5Kk}PhȪ=*o)j|j_DQÆp3u0O`4eI]6}-֥pOJTZ-UDrCz_E"6DwosCX&;T[:jӫoHr<# r"$:.zӺ]Mq5;0;b<O]R3.lOwr5m1]30̸}*zt[QΫOKrQ %ybEXzpxzuTlhJ|5% xHte4ƾN|ε_;{=b4tsvϿ}7K/fK = H4AfqτnO4%oD],=睢WmQ>O}#wsuLfGÌ!iD$C˓AΪNinxѸ+11fʆ%բ~z،t)LJ[RrAC_֝][wZU|(r]./ #N&t6_uiU9 R2d `ҁD ek|\'l! M?!fcDm/͓KbO#Bas|Vlcݓ6-D>Q*hKt]2?&{ln2cAž+?M6]G=G& G[ExֺdMؤom4<-C1T`w*?ޕV4TW˙ aY)2endstream endobj 280 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3467 >> stream x}W TS׺>r"*ʋNyS,AB_01ףZQh"瓤O.߯f |>eݔ]Sz} bJ@gT*}wH"Fsq%v W@WB~oiz4Ha,$DšcT S9lon$ 2QcsHYz˘*c/i%ɡv^E]N?Co >A3Ƣ`iD?+EOBޝ {{x:RvO{0XJuy?@jDNAoLO@WP@b8;A/BL=< O1yc;kMVԙ,p^Ryh\+ \#Wk" ^tfEݻGs_5}_9ndiQ÷/׮#Wb?:C ShGB%:qFP62n8K߂-c1 ){A˿Mu}؎57k6I/ BDl šd0_D#Ɖrec6vDm"݋jsQ>Z$'r s y%@5\Pfs %\^v\\QL:iOTURYpХs9l>Wk!hҏYm/4尊 x<@NU (+09Tb2Kf(uMYf sL_a|QĆs٧!] `>2{e sy(ϐ:n"[328J͠ڵ"CwT%Y~ Oîj[[)Z\/:2$g{}]<^>ݷeU!\XPdz=ܴyh TYˈ\ ]Χ2xgICMy>8 $nKɌͰyُ?M3'54צ9kϨbn8-M8+* mzϽ%m94;<;/D?F"4=m;Ucfb_b$v> pa麄Kٿ39 菉/])1ð;|>3DNn$"'']Ԁ&tFAj_%M3;ZEVޝ>l bBM"F7>7N ѬU~V j(WL)LR]bKk1:Y9Sif&~Y@։ZKDR,iy GutUǏ@D:G~#U;m^ohNCVeQY!K 䬹ve dg$2O ߗ yL!:Jnбh9ˈy<~pe+E4MbaϫEpC0Z "zImG`cGeM#a/s:f.^FBT|S*駯aSEk(iXPDPN :\ {J ` _ upWn~>r|-s[vt=:{JCu:Č<ߏb7XBLCHFhGwzg"gZf슀A\LAl]dBb y(SK9\.ZnꕾbqBX\PPl&ZGJU^Ob! CC}.?3H'[S%n[ۓc9/n{ I?;endstream endobj 281 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 186 >> stream xcd`ab`dd v 5030q$caaV~= h ȞqLI7-?މ&;i?ٻK:s:s9 o=M`of⮲n g2F."ۯ%Oy=';=endstream endobj 282 0 obj << /BitsPerComponent 8 /ColorSpace 124 0 R /Filter /FlateDecode /Height 450 /Subtype /Image /Width 675 /Length 18995 >> stream x4/ k9,B.\`!$i2Cå O[:n~%zJl' {[lI%b-b-b-b-b-b-b-b-b-b-x~_Ϻ/;KlE4DkKclE$n/ol*bb&u'WK=XYhThb7EX.zWK" EҳtoаRr`_vߩz6'B@?yJ6f|#}۾<,\.[V,~ނ@iEUxP7O~[2K7*Q@؅ QA= wߓ~9~_b@sK2' 5+v^r th~ Wt߇SAHϼ\pBqE1} i~c EorpICe]UԾ +}sXTU|~98K$% ZL#;wV7BW¼:KE)OQv-8]HTMEy@R7K2֣'bE} K NrJ_x@ V9i[|~y/_ -yH,Z,') ^rY:\3~Vy~]Ł dN*a<(zSae]zY*W6*zf'EؗΟ Do\hv4y@kQPW̕$ rW3@~[,lhZT˥񒗿nqIK ;;49@ڤ"fmM-VbZ:ԋmM-V[ 2ڣ#KSXhSĦh*^NE%0Y-­ iyYot[0tnԈnˏY腓T]AA /J[0P{3U)Ǭ@uhR93vH: vN+fZ\Q6xMrqZ'PS3+zfWt6ӀE; $͏ۢQy*ttĎ @B{] U w9hu/!@}~r׬mh=@s3h0Y9hv~/9B*CA>\ )EǴOQʀ>7V hqEQV% ' QэR;H) 芀Y@+j~DvJCJ!,@P&;3? ihƒ?U)9ʈHO?fW4,++ E6#)Duu@y@+P4?5^w@Sw~m@ ^E?~ z'׳g"M'O 輾Wh1Erp1q&'N'ݻwO::Z(N>ICGGzjS˔ @8:\OZ9н!*:}Z:z8,իъ@+PKyW9 Lf=b{m~Z9:*4UhU(z ô(Ar[5 hg J@9R@ήb>*uS¶)jzsy92tp*P^#Ϣ@P92[H`(:p\Nt;;Г'O ݉4 e(tEH٬ %xK+:$F%_\zrTw"-!)GuI@}G9jj߆߮_ى8$zB9j:N trٜG9j֑W}$r4QHFhO"ɞhE@ ELX6CQ.ovU+b(UQ^)Uw9>}:::'Cs"(zy8EDUzݗaOh߿9J7 z*#1(GS".(at?JN`(zsMo(qv1œ=~l6eZ ɾcηU=|hqU=9@6Nu{ٔS:f41=k@ (ʁq6EߡVT?vopyLVTa$Ϟq8j_ye aÂ}ɋ -5A[t>|Up14d(j@[C(F E kC; mgqGi@+ ~L+ߝ k)E]XEꫤ@.~hyEePW2*L9?$ m\E= c(MЪzC#@B1tiY;g8 K$ EE@NCQ&@Mt߽~ޡkz@S!Yqr(w"@CK~{Gl$gB;ޡ~{HW@~;8RWC(Pa0yHw?%u'wfh2ed'@VO[Q YWg-$/؇%%f}(ޙ_WD(Ͼgu+OE.PQf&.c@ ;wV[Q/Wd͙WdɳE|Rt)+;k{CtՁН;Ѳ|7@S8@dPTx44,,E:aRTo( E( i(y\{ i(!_N v6-T;y){>1c'%:1{7?*ɜs"v S-@ׯ'40 h[ŀ@؞V yvPh>P 48nyG֠(ӺuVw F !)kt룢fMw; tPGSC[CD3PAd %(ʎRtHT$NtVT?` d@|1(J@y.$P[Њ<ݠ2]@ehyhES@SG'{'Rђe?t 5٤O'K!2 !{PpB2t@N2UBCX ȌөȌF^ .\ݜ:uJ:/-;l*A-4*.Gq4{x;E9GME8R"M.Vw` dtؙ#ڴ#@R~[%YÆ5uDra0;XЅ OH-7D:%:}֔"ŏ6.&;MzwkR3T ?G Pf(vc'oWʜ.E7Ȝ.elHW. dNͨ(XdvXCL v@CWT 3 ܭ h(Q+*3pV5È@D"v钊:˅w܉QURQ`_M?:glQ̪@)K(Z G9O DFZ@Д_X=6TT[Zh8j⫦ѣvƨޏF> gfYE ϳiͶP"i%!Ϩh$1WmDȿ #b@]FOL(С3ha ]O&m܊ZDQF96%v:>0$Ѿzr&f@xrxC5hjަ،Ѝ8A1+soݻٛK$n'9 {E htkZ@P֜jAEohݻ GϜp~ (E.Q*{SdR49p] Q&g9~"UTT{#ݻ GϜrl sn{CAbZlKǕ @ٖPQ!ghGtÇ7J) U޻箺L:Q4W11R?~G$*:)DÇ':s Q{f@Np QR )D~}DG3YMQPahz(C[W"u )) 7E) fMwJ4ECG X?hsFe YL+c5+(x_7jW1.X2f[㌆FbxkS ::2B}FC q 22>uT?'>,HEըBE;-;*HEʖw(nqhà-JQ!N_@qGj(> 9E$*hBUIP/s0pEU B [$"VIu5.Ec5b23`- ^%=3Q PbeQ _j]yGeaCqE޿? Wѓ''a Kn&E~̤hzvXL6ڬV~ d'ONwOr MR chhAE;Q2 "h4_ V)~8@꧕V4܈dž3"L}QJ!} _oV$" ᲀ>CKS򀀡'Պ0 (Ugz\Yiy@POI+4| e=4stEyYCYT!}"v6;U@-Y+2ȭI@/:;&EÄ6OeQt"Kfi!4J˗h PDq{B/U/;,+@$0Խ0Կ X&jV+< PnC6y66kqb/c*PX\@X(EO 5u6l"a<xS؏ 9իzw1v__ewvJ@SEd[tRWH_ $pF[STЫaի4ZHw׽.tQnϚ)VK>Se`N%\$gltpM<2u41pȎ$@:&-YQl:z h H2 uƧ%rԝVTv6+͂ӥTO+)Ov+ ZNP?Q٧%hE[;TFQd M%iE[;}CTFQĮ}*ޏAsh8#ԧK4P/ih4`p{{ƨ c( HY w<Pȑ#9ő#ǝƨ +dS4s1w4$dE6E#; 4431wH lbF %[~TTԹvV!jj?(r H,#Ť&AT&3NhCp`H*PQ^;Wtyniw"6S)e*J lR TT @Y?;ZTQE?9[ҒC*uP7:["ŇT,< P?uDE'?YHCy@$]u>EM0/R dž )j8u@éF(֞4`6p;4\;}1EmI M_Q(oh0quԟ?oh럮{b(}C?!uU+Z74Hɩu/umu.)%=w6ԫ:`o1 t ׅ J@< EBC>І@7n9ԆznRȌ Oڦ.QtﺺlU&Lr:GN-ke} %,8x*tvt S7脀U$LӚ* (gXӼP3Zd<`OA@nu)j_ *eD$y }z"F IEoD1hc@m5*` {%j* [g n)p@IK&U~RtL_ {d uzV1 9XnNtoa1R<6MD@*=rY:1&MÖ2kT(GY@[KEOȞc@UbW@ZQ.ߙI~#zOdTQ9.ЯҥjX/LCox.@HOl Π 7n A ][,CѯL$@@\C5f/ |־Gj :2ԴԽ-Q2\@Cޖɶ( d%@,}@ Q[cT @ < \S)l4>'hY6}WPL@ {=3ڏVV.Ey7"}!!I 0Q:Nm4$-[ t+hUN G %m48S8@)E[hem POUm{jW&Pzy:R}}U?M<{,u)Ph(r4gc eM=ެPXǁTMre1ua s. cO:;sࡌX"fXҽ>cR[xwI,(v^5ARO+ZrLP$xV@TxTj@-V#dxp+ݗq+lVqrfZV~a})ީJ. @ENd-Ph24nÒ'.Hnu@r>g?HEwKk%W+ͫJ&K$c??=ѿy$cr%(Y](dVuv Yu%"r(N?[٬YPxRJFKR1߈1ݧ 9jUN79q:$ƛnYx or we09?oTo偼-hÏ9v*2kr5 j+tiLx^RT>>l _Ѭ =zT+1.hiZ9'%LB 9phL)D~5":#]V(?&zsx4M؎|C@A:@|y (ZDE5R4]3EK)GkE[V Y wq^$iCgm4%݁t~EdQ8Gs1sppEo fEpFQaN>ФoHE=r*K'xWs,nY@n\RO^+1,K(?[2E'18)ZBq4O⊤+K}cϟ/WzˏpG'Ęl-y0+o/rMWE/w0s?Ÿ_1/P(!.߿Y1.?ߵP d)O>3d}ރlO޳ I@^sEBt׏%ڢ!h1Ͽ۵uf 6y@¾hPʸuJHW~- | Rted^m_KL9Geż=ѷ >U؟~QmS #(^i2o):`ӼŶB5TԌc FOzEa%[&Qy14e/2ğO`R߿^;l#j.էLC%h`~VʁFoߴP4H97EQyc<,13j749]:'>P S{41L[Y֢, Յr 䠍\@QeϒmyN/bL~r2oe6ݥ-V[OZ>8mc~s D*ulEY_Z>}]E.~.V]tR"3ڶE;2EfsG=R }-HQhFgzgM(GVB(, J(QїGF=fHCRwg2 ) b="(:PF@ ?fW4B9V6 ~@+Q4 ]UZ2佪*reZȲXH;G?@GS@Y ! /i= JErGG9@S/&jɿBjd>{S+ÇGGEt*Я@( @RE|KmS (ZhjE ELrb](tC ]0&*uSmۢz,X~}xӀt|@r|P$;z}vPgPm'OX|~ԩ,uF ̙̮-h￧ɓMҷ@ l3HݘΜ*Qs-4w4Anow4HcѳT@U >Й35N1܏+Gc)* C2BFg=@v2*?G=@]Bi陀V*E.D3&lTP\#/ \B?9hE8Sm?C2'P(wd8  x'+}rJ2\獣.0TtDdUUԻLk6e?hGa¼=>CC@JQ+Cˁ:272$s4(CdyZ5Ӏ_ (M24VTСCDxBЊ}ݺu+Lt(: z҆}?~(hh@ w!(D!HhNE$HPΚC\d] $4@4#CI66@N q54 $1-T;*l05m Ne 1E۹M*k^hjBa%LZM4}8Hm'Jstrt2ڢRYV6z :Ӏe?Z*ZW_uQkdܻC~}sڗՋeJˡ @*ZhhL_|W"3EBC{GE0cI6Pq"? @EM%SU-d@ǻ2* SfUA! /QBŅh+E "E[+i=2w㧟~R)jPP"SN!@YY3ȭEf`@WtptѣDnv~2:iN4N2X44a$&H~ zCEtǀp Luя)6|(pKc?Ge߰@|NĀ.Eei  ͣ8C=h H[w9N ҷů\qmHHWE-E''M:[SQ ݹHN.DDbF3g32!yghPaƎXCt@Ѡ|M~hzІ@A!ڇ U]g)JN'WDE!`mQ(:P@dFE%xyF6| fཬ腯(dE/|E_k Y S!IC ~*EQ y9^!J^tj !Y`h0(Hx kI{cw64GO?%r”]7EgzTT '"0-g8Ǐ6` ܄+:3Лo)fy. K.|){fR a|:pF δ_"7GAnR3 7FLܩ W Z#>򣉢H& /R\YQ&{STbNՀ-8M\~le؝l4-E-PjW h4m Vh44=bflߺ;lx~];u۷@)EAÇU^ @)E7hR;kq)0Mk^WF!w}{|eZÇ]G_}+0 Q ?N7&:1 Qw`};EaFUtum^zr(F>:QprS$ohG3%VQ )< $GTBSto/h(_BS1}] Xb2fg*zΏ6RST9* :Vx-?) - ?8\)J>q %/f}B *!kv(5+i -D#w[ 6-D#VpB4h&PKE>D>vDLQXjlmh *SI@ǀbjbuKQ*QGdN:^9R@P(f@$<;( Tb\x*"/U"Y*o P4Bev-*,FnݲY/)x ME1(ڷ@rODT`s)ڹ .1xWf0 :8Z ο@l\CGˁ spTt $D=`\6:PDI1C] &HRD4]㖃Ȧ޵i 3LGy<Լy6d8lN6^ \SԩL zJQ7r' }ZQ 3Ju4^/i@N}jvJ(L(;%t|N"ց޿o{BQ PSE֧<$RZ?1혓 .)kY@׮Q~SmiM@C1G hmx4# HY@S1|c(,Siܹcօ(f}cǎu!Z!uô v ;Ph HeSP0 Qظ'vcny3h,Db3~w鄁tptW8ݝ euJd8To*:ݓ=Sjh2'!Aai~!i }1.HK0Hmh"#ݵ+smZbT4%TN䨻HSHѮO49hEqǯʽj['hE@nX26 D+ro?pZ8ŋ9;L)*._N5Ω ]1K$СCB4"@ǎ% g]ED![#UV,r"Xn T޽{FuA`7|)*"7Dv!zhUԙE@.luf?SRA@f@Ng/pEI @Q"PY \Q H @zt3;#ohEӝLumjj| h6i# |SK +:GmE_46[RT]h"Wu^m"r?3s +ZF1k0 jCQT'f2W[3H̙_tUK @WVQ<=&n.y+3ePݤb@#. :}fu抩2v"^ƶh /Cc[4j(Qde:DheKTFH=  s(kٯL,,57 (g ^ N䔢rǒ_%c͖sD) N!FE v[V+h| ʼN/b806(L:CEa$ؑY$~~ ׼ 92rF =1#FnIK@05IOg}qytt֊W|p(#=~tj1 tvj1Zqyj1I):- _#_^dB`b$kiEbM|*gy}ezrF ѥK)-DR4Z5w?M6r)9mhR4sW/h$g(] &kq œ8[4Rj?ϋnEEȂ=/*3]gfRx%8-PjOd/<23/ݷ.߀5˔-sl::6jsv@(ȹꀪ%Z`LUT17\7 xӏ*z8NQt78)ڱ: of6@K($2(o6˲mV͞RjNjJIw@YuI@r] <' ;K/\<o(?i~;0|!9pzQ9PDZo((2 W5R4]3EK)t 2rd(;2&ʎ (ݴ3M1 Cq ]u)fQ9rf\" z5/IGGsř33D'_"|4<Qk#7ř3>2 8+ye ]$&S-G1Mޤ VeHgA+:nK! SGhh0mh ȣCAZ@OAkvvvMһK.-Z7|L.ah)3d"5%#;; 7i8FtWMYt&_Fѝ䴢4&|+:E aԝ$FW*EŁK_vB'b̓C0rt1 h*Կhj {D1P:U ? sD1{E1[,[<6EX{LjnEÔ3-b-b-b-b-b-b-b-b-b-؂tWQendstream endobj 283 0 obj << /Filter /FlateDecode /Length 2130 >> stream xYr6k=f) #/zR5/iB-)j%Xt: H[l2)}s_*Fy_?ߎX2qJNWzcTY+!4RTj䰟͗; z'ȯIȔwm%ulrӽ0q^IC>*Q"O` &RE{1N}0y;w|T?6Y"w6mZ0o:%~]q6a>--NB osMHee[a6OMi{iS8q.@-5^6 vdOód2'x"lݾ]BAOc^k\>-rfqWfz|8r.aVP\Hde8/v$甋nd3z4TPgkۏ ]|^jל:㰥3bBnYgIK)O=$ ~!ϳ2D^V+ x Ͻ?Tufi˭J(d5Tjd{THrGt:D:$d-J?蛐F0ΩhΗ(^M4UYr/ 0:Fh SQLz v)gX N 6b6"P~?`YD#>-B !-K4rEZ*Ö\Q((PO)̐_׳T\JO5)t($m^q$>}x0 Eor dr $Y0JۮT_B 9)@%\ ? T sf?@vW'}n{  # >W%{U|Cz pBYM_K3h2TM[-LGMnhйM-*YՍH YFW #~KO5A3T8s" qtKsN({N g-.s?0>{Zv}RgZ9xO.J#W#X/tcOSFݫq|ηr5`A*(lM8 ,Ƅqg-ʋX^ijEW3Ms"/R(Ļ0Ş gxf1!?ʯƤ3bsN6'[_d(!J˔G:#4 L*&+P"%E0Mb<2 f<|@ip,zޱWfR %Q2&}emۧY3 &1AȌapAMkA.'3ªKND uW5. "{kVdA`_g &*늋Eƣi4rBs!=`w J>DtjǺ~daB͚/)5a0"t~ b 8*F&(0϶-U&1GȮ5,Tri:eBJ<kM7;`uyIE Hdս9NnTT>(Û'홋yHsYgj9WCLaUZ[p KO(9#_}l9uQ'T/Q /nvۺìf^EéT ]@yz8ZbẎc7<4H~"g> JYʌǕ!Q]ֹQVĂ" * VV~Ϩp,rECOֹ& ,¥(ݘ~!~% a/+.C ?޺8 ]>cp.qY*ŀ1 h"a;~C>>endstream endobj 284 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 107 >> stream xcd`ab`dddw 441Ż|?2~=;@EG#2> T'xq^^qq^+/^!'b>Aendstream endobj 285 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1377 >> stream xM{LSwo)^:һPwٌ/92AD8B:}VQjGBAtQP0E|fL&hI~s8o>œ0雵~~~s7;Z^,syl\ȥwso0]`H|0+)9{13\K1)d+Gw)"Z~e%俈}rlD3qOvzr"8Z1,N#FAbKDƛ͚o|rZUa>́L|޴tvuS֯o 13#!"5DЀ-A v̉"th|rw,b̂9 Yd-vCY~is˓>E7:F+wK-M"݈31Y7x0fӏKGO:\5pVuM4$C]uUmv;KYHbt Ah<@B; +Day8v%FIDw c"B|7l" BLU\QB!ۑEQ'뢓A1P`mj(<#2z}1%ihH1'wZZS+bFw՜13f[qn6ߐ $>g*v2FIWDgvi58.3wA1ҚOHr9!_;HBIĕjK՚۔ZIQ\i> stream xYK_%Ċ6l`죁=䠶mee+3> % }hI$Ȫ*)R/v=}PVԅ,)'{UệxyA"=$mum" K%/lJW{aՕ-+%E"\&XGRwa ]6[U7^ Kﵘ 9xk0=O1:-2hO{|T0ߤay%m׿3T RJSھ϶4ڧVj#z^hdaK\M3uS*ox5犕0wGSǖ Z7e[X;lFUb>,1]cnGc` 7S#olfiD;v-L8䘪NCC7[VeyHX`0_m0Iv-މ|adX->mЋq8tPq };M섭Ҟ{9l:(<<'H&F^߈mGSb(I]Hd "J[ZJ8O߄FM)k{F+kmhHjUc#3+Àsw i>*"g4fndx`yC0~ }R+dJ}z c_-؋xcI=YZ@;D4F d"䰙BbН:#7%U r5|h?$ U+"%m?p*F#0E7O4$aA !@h|z~%D`Q߳#\_BD>PcŵbW`}=u}7#FI}Vv 'z $kb7 &Y(Ўa)*CR%o/v͛ qEwՒ#ѮcN'sb۹MoGg.eL nْvJp~9h-v| *7;k8/4"8Wqs>kw ɥMsތ%f"$k#sK"u Wt&* :12,tKB"`'}Kx1c椗s{ZN¡?'jQԮ PѱY8Һf5a PUHl 󎶼;J^RR%'-ו$K1G-U|'{0HlPūfe?OeZ<5\1D̦*1.ۑ&1NgfGٙ_UbpbCE7-i. 5rQd^.J򠠙Ҟ=*}C;+>CήR QILg|ʌ1QBvX]Cb l@]dXnT+sa]H} t5TN\F0RA YNg118 C\9ꯍ8 .O:M(q'T.zO$ESnX$}J<¨2mi)yQ[ާ}ыx岆8 _ҽ"E:tAI+͗+: ěA^x5@I>R;Pw++"2\:6sFBM8gxۤB=_uٜXASqevv0M[Nw$5ck#Km饧WNhHL+PVly/˼)N\."0,3D\Isy^f!qqB; K CF s01)a@i4#nko|$%֜,Jk_I=%Fd5G죉8(%~ 0=^k9\~6$ ;#PH@-30Ԫ9b!7KۿI北} Z.V׆vnb ֪a I x3]vlc@!͉60nLoh8n FdUn ﷋<\l ~Xn }LYsn [LjnΚ4tH(69ԈgYԙg%=mX 9مN@Ba]clii%*S&KbX$2qWYzWMǠ`x[| 0J}-k8JrsD읟# ڗ#bPň&v(r(r)丣ԅ n_F|]:YRy/@ ՄPxG+MT@pn֡|*]C* )D6endstream endobj 287 0 obj << /Filter /FlateDecode /Length 5868 >> stream xOa}mdӵ}i _IkдYT0(2}ͯaKiw㞖瀞K|+s|[wE2BW&qhM_o2a)&Ȍdbov۬m ef $bS?J]\_| v43ݓ^dI WHW[7ie a$F%{`On})J~F@QJEri*)0ʥʚ%?02:˒ONt}DL_v@j1#p )YfR/@, u_Pg_Fݱ/Kf^<ӦpI?^[`"ե ՅjK.J*/z I&Tv.W(}1]6Z[NdK R7 ` /\$X7X|5#* d㷲փC*i3$D*G|E:8g0,m}'',|gyZ}hxb _Lϟ6nA瀙/qº9Vɾ@o>oK#_Nbh3{7~;y0VH9‡ [[ >o/Q%sҘSH;S/_n/Kt_Jhژ _dACwg~fs.h!@3[`L)P[ rz)+=*>WQaң3hzDb~'mV .3G< ljHvmf 1'dus61eiTѪe>ca>FUCq'+Juu@NUjr+@Z󇺫rڡXۺ>L)/fl@ E'a8f&(06b6cw[bh*cW 9p@3*0軫}4LȞo־* (,}3Uj0AkZG&뛟E,6Q3pp(hMa$#KHBAFm0ɮoRbN{bQoHp+]OfS[4T&~~LaJ0:: s8Br0pI {CiYNm2j1{%\]!A?2=(ze Z5kZ "CCdO&P>T)Pwu'Wl)v&噢2saO\\0M@LVwTൖ\^%+| YS$I>vwHD\"s -0CX:26zM$`³ z҅`i]@ m zH\ن {z/1Ag . D_~A5@LQM?T#in䤑wX:jU aX톓 :I2l5N!Ϛ ]-k6TgkRL˥zCs ;pw@3DJx/뜭 @V}hMD4CBN̬}!K@XTQ$q0?hnz1G ͒~0 Qirds@T5LNuAVZ #e/ɨ笇r L!yWwf\ [ng5Fbwİ<η9x܁GD߀A/Y`]@,܄M+G7;b$?qw+QN#G6oF88G1-#xC"f0!P@.!JQ|֗>CstTU@ɕ=d4 5 ,۞o ez.vO^^p섃͟6nH0Vc"u^|rg\c~r0 IP,בI@=(x~; |l!6NPpeX~S/dzGC rLvtKTrKI,I='_ HOB2̆!ฤ܉nKnI#nrAk_#!Z  [ 0U ZD,N/$.Ԝy ~zaNb2\%+yLD#׿p8gSJ!pj`>T@i@U3ZBܛ y"D㙗0Nl.#&fA8w`54S̻f|2Xw'='ũ` \zW)V1ĩyC#f'id)]˟9j ENa,T9A_#a[n`Jui&$3&2AN8TPۍG#>&MHVL [cZq0m#y\w"q 0{ l_$ Ş!AˈOW6$?1ŲqqHFo8&v*0N[fARƦurϕmaD+x {b(.MyoB1.]=Û QL(J^%)e9X08F2A{ iIP|p9z i5i-|禬OYS\:V ]OUW̩L˧1^hNxkM8LC4ĭhC)p>f9.JxȬM"}*ҼVP3 jqG 0Z}BstDwOm{DK9|xiܧ2o뾡 r[IO 7R$L<3 }m\*\ !_U : *Ќ֍t\oJH}.16: SY\U\on ' 'HGaZ'DXzz=|^6AI&VccքmpOA*rHUrޣe^be5H%:03C5o,8<ٹp9k PMJ/hf@n"On2?l-6>,+iFu*XkeWi r6SSa븩r8/q@.sd֭B<cB6bs]Ib:v 9>mS*DQSnWLPFUۡ7pn3 Dccf Qb,S;/t;02\Rj? !dMp$#}3zC_w|L=gwz.lѰH Xo=a{&lG!~KI='O]wIRFEfQBDNu!~|mHy+e}cT-׮Xؤ z7??:m~PP^SP2)%w~W)wH!.K! EE|;RjڇPqvq&C'ŤM{- b4![^@C f hXm+(8yf,y bʖk\~C˜V"I#:)Ê)7D~Z-xA)*\=Ҥ! *tDdg6j{,nJq`)V#k>A1[>̥+Ba8Ʊ^_dxh2Cf#?gY tA֓ 2w4(jOSV%D4k'/i3X@O[Q 5R?2'o_,yr U3.O!E?c%1> 1Y%qϱ94S{f,Y՟5B16ڼx]=UqNr9ܤLcp>pXپ4[~2OYO%M0fVbq~s#B7BPQFggZiH ]1>SDK3^Z⑫ ~%:Q.֦Žy0kUNK{yYJ8 ќT߰AT[Ȋ&C}˾ݣioyeǛ~z5endstream endobj 288 0 obj << /BitsPerComponent 8 /ColorSpace 138 0 R /Filter /FlateDecode /Height 450 /Subtype /Image /Width 675 /Length 37088 >> stream x콉w$qhI2  I8A8~ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<Ȼ)Fhtߊ<ȃwԎ>UmO'у<ȘI?ߴY7 vAwH/Wʌ3cҏ(9@߿3u!GRI@o~ln޺͏yya4}L]?$k#?u7Lϧ;OLYZa#s¤SI}t]Q>aqw?eq%:oGAVga}1^sWn>';}D1yCT:oGӏTdxٛsO#oGgaꘫ~$}.1A؟~h:x0Ao"g ?cg>&SR#VG5SVgk&>ܼ|_#;!R9"xяEs֩cu0ufO07|0~o_GR1"yY:x F:o6UuFֳrC1累;0W˔!2G3k~D”BCy@D: hw;Pk^YԩcJAhm~<|WOoDD~sG~B="}zbRr:k3c~8\$SwCb5Rb0t-?|^#߂'ZG>nt$rOޑ<3 3Ό]! 2/SP K#`{S֍QSVJXM-2꘿QnfQc8uK#z QTP:UB_ QTPDͥx Q7P>XL8cE;BT@qh:u jAGDi~i*cls&T FXdruz *8L@a>'F)Cte?)5ȅc:9DE:2i3%꤈NkfQ`m= d #*SݵyE]gDaRêӶ SV#, VQ8i"4^P'BsdF]7(eu*?~VLpu6s#B l+^M(DY3>:!ሮH1:1c sx2s Hi£E]1jz$4:ZI (Y<ǼsM5v5 Q#D&S>'Z<QcP8::"jPط,rR RvKs}}STiicpZB#u|X VM?A $oX7ڰv3CJ{~~M)_>u_dۼ3dd%uKzssnץo?#u%F꟟f:(a VVVOv"l3'F{ju؄ZRs{A!e@NufQ; *\Hm6]fa4FBQ(fNJÎ iY0+b8ux'@':[Q(hV 1= \I9Dy ^Л?xy{[* qڣ)Fz(ZtRD'q:oYQQxp6rnhQ D'+1ˊ/9=>.js!'/u̧ӧZιΧN0e#x;mЉ>ml(;Y8tg'm6'$m9%D/ h¶BT]P*Q!i lNs?D!Z4&C!ʈMz:8 N^-h:W"ȐJ.sl:TΎpx"Dy7\^GV93#bL#,jxMO(NVVV*sMv#At:؈K<>sDCm}#*&DxJet~;B , dJ͵rIon /PghR^iJ4tW5 Vg}}'7"Hԁ5O:9D4' `)ۣse1%;ԹoDCmF!+{v!S1Hцm<:CF__D4t:D(/PCtmS/Z}+)hB{eԁv!JabDԍR At"uU=^QDۅ '*I2:]~\ ! 3'n_ RFT]4;@M.4QTc`}˩{ӥC($6%^#@󦔘p\Y)$R `&_qY؉v N1#JQAP0$~o@4TQRl$*D.\_?&, _3&w[wH@hTGF!e>WYt&ٌ Ćfub4@{:;=8::99;kNNQ@U_ 呙+( z Jű`cuחG4PD P [Q %uʈgiJnD%uʈչoD8Zw~Ɋ <Dيf-7VčWX//Iӧ)^Ip>WWã6%9n)i؆Z+db+݄m._,񱁴4ɩs/Zsӵ <{FTmhNi^DYkE%%F-(dݬ@όH-  /Ѓ '9-..xߞa/:!fECD:4-u:Q1!zO$oPV:E14ZRGsmbe e2h#98gVRmS{{t$"o0w(i-qPB(:¨G(N yu+N(cQi!Jվ̤PgEcD/r *>ꐙOLWBt{:[" u*_*D%'!ByDi!::<>Ff-DT&XhOu(x%yQ@^"dWMlYA~6@4UB?Hu(Uc#j"'ӧ}Y0+>TE/I)eDor4ͅab2D5급uSl@랎(PʼC-(1hD֡E.ʙQΆBNbDQbQ[qJ{/Mh$Ӊ'< (Q7[@w @ǧه:7VHkqy_ŋW(_~ l(~qteaSNdFC+70Bרl7<4އK{,|l: ;RQ,J%( B` _V'E< J){KIlb^hcQeGV+qӯFѧ:(-!jepQ><$!7ЋD^2XQ4NrNχ JMrN[*YQ.VfZB(oGVt]->/Z(Y\H;G_;.9g{-vH [3#׉zx*!KC()!Ջڔ(ϾBaޞ:-M1vm7iY:#D t@a׭\'Z=8/Oo-wv!M}Ԩ IJ#zj&BD)R3At!V#z݁(Q)(ZP'Et nЮ!Qn?y XԹET&@{ri%Q]fwS.kQ7j2piC 7_~ ?N @5ʪ % % @r')6sć5QRk 9B_?D-rj;uQrDؼ9F.Q&/&Hq5C x# dE!D|jbUgDلĈ2 'O/ Jjf"DiND7k%( %E+! 2p0e >CqE+ 2Г:(pQPg|D IzKڑwˊnJ" RE7Bj?ѧ?Lh$`Ws"]JTydTRNҾ(upl \u zRJo޼s0F5Eip? q=;iK '&iK92#քv@G4#ZM1LŦֶK W -Ek9u:_}Z= D)]:Q؏%DhܢA2Zг]@$?_D;|2BMZDeL r?Imgmt>2AKdDήyϵ9D ('sn}D3 17P菾~/_>( :7 O.+ jWgQz=0;]]MHYQfϪ!aK*>Qק?Dv(cz5F)LG!݈ktnu ^DhÔ0јP[?K+&0HD?l y,Tt:h HBD9ohl14Z.ELX?Q%K2 lP!Q ΰ}:YD-xK|/-&J(YJ 8-RUBH? Dw¥P^N = :ڋK4Ph:%:8"nՇhO}.:CD@5G4Qwt#Jz+zۈ.U.\Qh-!SDN ѩH$OR9;JL&Hk ~@RN&W}^q֒[qN}9ڶ;W ٿcOfRy?&ᒗ 6ͩD,Y\FQ*2@Z#ڷ*e?!OS@]MNh݈ڕծ@Nϲ"Ó˧ a>%Ft7z^.Zh#J0Hȩ:+Q).3RS'ﲦyP<#+"  WK:؈6X5b C,8ٍړq6Q!ߺߡkoh~|D%vt # ~zԝ&M1D>+jĦ2(-sN5Vsiu2 pәf,AڏnUՑN=w+j^#]"\8ˍQ@ J :Q0YDeQ" OEFrR;%,B֍h| R3ʔFD79OEq"EBDaMDkDeE[QwQVNZDwDdQ< ZaEU:YDCc:Њ* M'#imIh}" pz8yS,DCшΨNlĿSP#>0F "m+h_'O{ڰlҊje>8*|_] [['/w`M0 ]; zVTM M#DVtoLDNؖ +JBѧuBъlZЖ.(leU! f`*=Ѓ(,eaLdjpLёl7 qi3ꁷy<$Sg ʛ~0qn찢 =ڄnYPPmq xER@~J! ! ! " OyQ`D1fHxQbtDbB"*]mD(1XBcE3˜VфP]ZQy?":++pO-0ڃhcD]7 a@>X& HM{DCHu(U:ec=b)X{RF+< _٥d'F) yc[T#~=ѝXTCڨA#A@0:6q i-Ƚ z SA4k12ԥqlBS:ňQ%V&Gte&#N(Ysn wt2t[I D:_Diul9e4]Jq uel}}_FrV:Q-K >0]%wO޺4Bܤ(„*KB)@9eGP@t`p" gQ( z-E4cBWi1݈BQ>QoB ԙDbhs欨4 M,p"J9UƷ,=^B4w!jVQĊ.LhE *"W(h !Ѯs.;LJ <[%LR(=ZS"/T5.Oh?ʯᾂ4(Kxg u/;K6zD\}RէGI=X8Hl'9 ? [HkNwhS(DR()#2!j\,P5Er0C (!jQrv \%ETEgfw(Hd'DvwQ߷Mױrvt𸘁feebEjMyDΨF@eξ'jDyGYDi"1Ԕ8XOQkIGQ[Z#!_WcDixS&@Aq~'!EܪC(e:"E4W d-GCBSgMC}hRhjE-RC 9?4h3!\Z}ȴ.u aG#ҁ[)#[FcЈ0s = A; 0g!JG*A*S  Hz 'n;cˤ\J=:#WvUa孩H/m~[>I87"y@jKîDtQ^4"ͭ!W(p鬹5Dc)!JDtJ:4{BBf Z+z7ZѣDźGYwQېVWVkݦcDɿY^6qW0SPMuGaU QQp:Du*&'>t{}zov=mWDHiQLo&|CWB4Kܼ@ZDџ&JOS:UD="J4^Dฺlԁ Ћzi:ѯ6;.m骚>iƢf[#e K%@Yhkzxs7"U.#J t/#}(PZI}Јڊ :(i%[IJȡ.$GŁr)!:G| U">Ň3% :Qۮ3V([Ȗp OmX 3TDesZB#B~MQv N[Di_At+F+؈JL# ފ\y~1Fl ]! !JB$/Z@VzDw"+ v1= Cf4AD/#D "&Q+Z@|jD9DtPZ@|Ր 7W:͎" @SuA߷H?OA<ؓ7AG$ړƗ:&p5R Y_x^)nXdo ]ƄJ 2Ma7[AJѝhuCZe%Ê%XI' >|@ Q(xDT]LJ˛DF(Y7hCB QཌI;1l %D=/юMheD]+¦ZDZIDiìmʊjw(-n,#jG@\hъF3]VԫS(>+@@թDf/"M@T}N>r5) `# Y}oP *D$Tf]~rKJ4 T2iI'q_ oT]1ZC7GB͠Y i'~WA֥&bISf!sׇ!s@@'ʈ&;m<PBщ5U]DSQt  l!T" PB:}PhQQ겢a4ii n7L.dlxY#D nƵ)4Ү&V/^ PyD=YQB\464g^o.s~_s:."FyxPmhnP ʍ6DjBP@?)#J'@nER@6XǍ24Qۄks%uz)" ް&AQRH"0'6$˞.BFt"uX>Odڈ]JD%Tj4FqZ/?Zi=?~I~֏:R˄~h(Hb MĊ&]T#?5QdoPa $WQu$@4YQjoIfD i!@M Qf4@.X&(HK=U"ʌf#`:&) JUMhBtќ6" MnD.D]@J0+A47ӽv椈fY:9DL% mEh TGmj[j7t0%6Q%lW/eDZp9y zqA K%_L3Z5,@*1="AՉc<Ń:vS69?::e^Cf.6MӓA?q!Oy+2ш.O{G# 1!Ph4[ pDKꄈrrV! L6q# ~r?! ކoQfT'"D9G4\B+utVt^!N_(Ʀ-VдrK҆׈WШN3pdTi}rۖ^֓8D`)E=7Qq꾠ϋ>hPb/0 O,kG):7E쪴XaIgLA>eCu"Q;5\$֍(D"z#Z#:( B?4G߉h2TVG# qdNAN6(|'͂yDgwz}(}V4 z! lE8Da=A/Z@yЈ²SHzʚ8D^<>DeChB(ۧugmR7^Mr D =݁mŽ,ut ƐXjJM'H;.Gd*09J{(N'iAdEVuDJ:z`6"(C{DO߉ZT&!N'KkȎhmNRoEec[hKDHf]"oೃ l,PrAup%F-C(5ы:uxC-E(-4]O#(X4@RsXՈ4ʝ K17&FxzʮTvU IZuQ%>XɭC;:!x"z\H҉Ue)jD<2c{YeKpy\"Lw 8DRb;iRK,GL~p:(wh-qOňQbt'3Bl~A49F*Op^ŚZS<;Љی %uh֝=cZ "Ad&[-TȫDZ'#4 zvi\D) 3+V!V hdWQ*|B{nw *DيV#ڵ "z-؆?Zń1m΁\Ȕz@- `1.DMKr[+|0gw}Ix֦QOD"K!urdu<RQ Uj\Օ.o⏂5a2*Bӧԑ"AAUIbuф@u|ɇt4JO bm[-;o7pl䥵܁뮌(@QJ\CD"4$u@(#7Mաe1eD(YUrgA5괶hs8I3pzyQ >UGRQ+ZjIA\`5i? I*Y"/@R W!E # W#JաdV*E i~GP7YGtV:H3. )#XUV"a2,)~4)]_DLFQhsI."t7Lt]5fEݞkBp'Z02=Wot,eϋ+*ʑ'@y5ՊnHWmDM==br 9Bju3]H!w#sޏOq'B$~o*ёić!"~u_8v8@VTESo4\!tlݺucCjz_c#5sO ezՉӠކbjU[` 2S\"z栟҆@"=څ(&j3I#ZBjVCBxDmChQf#mubM:pѕ?$S6DZh`QD~FG.i=ښ6bWl h0ЧNb*#VrnkVs^-iJf+B;EW*DaJֺ/|c}mhJ#L*umhNˊ 5:Gvcc)h^|;΀&՟T*D~kWHփ `DqI6yqh75cr}\'Xu3#:2;_Fh=<6XUW>{~CO>ӛd07߭mnѺb @d|Dk 폓V-ٷpژmJ WW/onQ7,LT w+#JZggf?:xw_!F%uH(,/.p/I\)^]ZUyBDda7qWVshoV}7jRYABD>c(GGӋ(Ek]jD+u^!p!g\9^D7]pC]Vgy"o< j6 t2y:qܹh dw-tb@~ ~N62hcDqok(Ac)ty ED#oa*apG1eSh)<+ZdS ΀r%7Xׅk:eD{V|Ə= %x 7p\bىBj rBFVnIc7Eh!ap\L:tҖ3ټ d54ڊ2yN  - Cs h7qE@s)fZ,KQ؈ wz) D)gpzPGWSpۘVG6vb'RAdiϾTa3vuuN[#J0</:أg!8~ǍE67O,5":L2M~ǎ7s@h, A>= AvN29mD%F_E=#DrQTgў5rQdT%/vnɔ :WDqAC%!z"zt4 >+J4P)O͊:%DMD j~ D{zLEI^#08AtsњN5=4t]_ON%+jV9h4d4RrIC6M7 _O 7:%NI ˓~ ]g9-D2zD@DaLDh^ D:!Mme: 3__G9^K*QFBDiIKS ;"43/.J0|LC~1Zb>2$:\t't0V"IJz)#?~Da48ԁv ُ((\PQۉu h*7bʊAA?oD=5VTnuhD`V^>׊xV9[D*c0DikѶ L]dzrC9pQo0JHĔV#;\mj%fA3zH/cVvt:X٥fa/s=|n-1{EA>pH7xGS*)DwnQGT5D4RNͷhN'5Gp1Y ݾ4I e 9D?گNa>kTo /"uzu6jW \%^ i^IBUAT??Cߐ؈\ YDon4SCthԏ^hh@_qmOX'uv>d* j MhDF(܇gƘ'd$<)Daڤ~;@}'쌣vL5_8O4詡\:tw>JvgfAO;: DurC6 UU"ZQ`E#u:Ek[Qa,D]~:whe+B2OLQ>..paՆq yeI}XHP_iE59ϯ,cM~o%)QvasBtN-cL2tG[(ot\ @t>&C_e ҏh Cvp3~E}P|_t:2%+m>A0X]`@U!zXgt +ZDՒ#ZxƊ;S^%R8 jAqB5Q90aG3'xBK} Q(M\ޖ ~2˗.u|W89Rз$y ?}^z\_Wg{c":C4oQnvC"5km0]M'eӗ4b=TXQhXʵcv. lFnRw ہ|^}"畊$EjuZuQ D+J5o~=" ܍sۮB"b+sAimW:a&)pud-={Oh!>1GGROўLY@G7½>/O2Mj*LY"ACnGn4/:- u8ݏ~ڈR_7o??ܨ?e@k{puOư3N2MǏϜGk+*b{C|9?ܰbMeBiz4e:w]gQTGO{;o'_8 5M~̏z?oʹzg1Sz *&W`n.6: Qxs+7;B,NX_:aN I<6ԉPٮI-uޒ:'5R(~m K%clx>!dA!eu:lo:};1則5ata + ̔}>1jq 䈒6-L7::}/D5f4EtsP~rPǼ7KQL)*ufQ/LЧe:Px@ StrFXRwlCBT{A{!_~9૸ 3җN@u"Pu80QQXzN(Z1]Z*Y+(_R_~eWy^ hNGGBh2mr"ˍ<[:A<|]v*hCVSATt@oW_DÐ8 dE at:>^z {{:jIONѨlgPURV:a4O{:dDB1}?DoGMcM9DъZї/^X'aB }CT%u`I!h6-H QԊʹZLEC:sp5%BtD:էm$eIJ(# _C&~K(BL`D Q'"D-OVNG ݗ p?ەqi'PDE؄8Oo8\jChaoU#zAQ|g HoyT(<[8wpɩtEh/ispZ$M/Zu:S@Fu D`5( i CfkM"ׁd=&RV g|w:h'*-3c yQAzShk׳4P[hi7NNkP8/6QVD4 k? J|4j'HD_*+::o2|zH5Չ]Q~mhQJԉ %L"gAC'4RGwԙD݂"i#o:\7/yhdb+}<: e4CdzDXT3:)=Hd;$oo;6 gD0/?VROULN~@L=¡ZQYčtdsPwQGĺ߼QB!u V.& DdtչD9E+)~=-DIS&-D6 "}:^06 Ets8̀]O)fIЄi!jATf7"DXD! kiQmK! D+G֪cN}%`AtъաŚC2tMd2&y3|__o4bO Q"ty^Rguի3I#7Kԑ"R@Fк&gGT!kv]U|z_ E&5sLj8wJZ(! _+Dj!NQ\19OK k3(#j&:T-e u(\wѶ#4~k_oo?XOz#qu%ܘ8:+џpWB6Իi:dDT,2 螭y uҹ#Jp z5>1O5D4ؗuX鱟HyբN:?jDWCG_!B9Q@ԪG#sV'7ЃF2QN^1$QCosc" bE3:uDHF ,w{1BE(DŽ DBF%ՉHG4"2qt"D(_|m(xD/Z(@@/$؇&8z{@4~?/_b~8_+KCݽQee)=)#LfԣN@Co_QJ6M{id'[{MduUtz(-O'|Q^9D(JNC(NDJ(Zr(Ӊ#hկH&BDɤBt"~DlDz" <ʧK "NKC΁D9#R?/lQ9 [q2/Tj&@HDORDOZ3#~>MQM-Fe_3W,RLCD u)kg`Dqs'#K?2ܤGt]j8JQ(!b/2ft kB3dbƉy\&E0Y^D1{GԿ F<[>AYB9pQ@D!%2eΟФ&adHI @^C}dj)yu\~#~ l@:}/zv W =pLzȪ )U)QyW#Q݄$(>Q! ݚdjvY͌:w(P>74$"5!J3r 1FؖT8 F# F(,ÊBt%j(H)w (QĽXѱ(2殱+Jꌋ#ny65Mޒv36@V d,CJh82.֊:ֆ0R Btz*o\%3~Lz+/J:j/i:@ħfTع!V+wA#V I xO_*X\$<_ C>r(5m ] o+Y" 6#e N6f;DlQ5!YdT'("f##TB:f&)Bj]\/Qt#MNKN &l~5 Qo!@/ }ƕ77s#Di|,^%DzQPH +پ[Jl)Fh̛QYJ-I(Ծ4 8q I^#𫳈z<"P8aڊ! DqӖ j]U/ @4Q vPZ(ETU8r?~C̨Q%mJ',2RW rhZmEQLBk* C9gEy$S s?JNÆ7 2؇"0kOӟ&8cD{-ӔRƐbqv4hYDԉvv=NزitF)b4aܗ%b^_#iEE+?QBJ-DqsJDRQtўlD#7“ E m DhQRYRBD|S QԆMDU<}%=CH߰ s){Is_4ͳg}$꘩QP~Gu;m $Hi0M@4:c&77oZ\hBe7D$ӭ`2EDs~D[Q!*{ǟm Qm>KJ^fn8y{N23!VTt"zatQ>J$Du&ATdtQQ -DD?/K}w˗r/%oKEgW:Bh݌фh}xԡNwGQO|\I T}%X2O[g&/B-DE4]A [hSmJ/9?ƧwV.DMFam|D!PKЇhb{DuI<н|/xS~ u:h.OVﮃ\IX}á\ ѰvYDk]rDNLDڜDK- ڎn'2eO«8]tt7wj';|bY΂MND7l[5%dISZ2n͔;2k<ԯ ꌓԎ1/>@Vw ћ<`P*F3'DQ짋h:ٓGэd儈B(@7776b"ZQ<ao၈x> QFVt.D.Q`nDabD(0?#RjRqPi&6u R/`@NW执}T'B4F| DS+"JsŅܹs-lu'Q 66`KRB!u|/E D9 .YvHBhƢї !UӋ! #"95mr-D&&A0ꦗʈRiwfѮ\n^_NtI'n=Ɗ:DsDh| &.x޸ose6Kiz͇EgZkkZt2opG#f#!A݈h SI{m# 5"1AA[Q5:֪ ƈFbE}tzD3.%gEIhAGWS+D9'mD&3 ;.v"*:DPI& %FQ@يVdQXQtQ_Q !@TIb.D!Etݵi(Q]"?ܣ +ZV,p5ɈEѧO557/_7o=p4y>ݢbO[Ɵ%D1%7O@'is~Qhf/"ZX]+ %+:`up/~:DaI.uXp\v'`0O'gc+IsvVsQ^SD{ %޲[bBN:-e$$R"bD!giQ[[aO,5yFz؍uQQ̏h<' DwSCED!}fGR5$ƈB֊Rfm(6ϤD%赢"{ A\P!EIv5<" D (CpZ+hu4}v4B@pg8.Lpyw T'b̽+OZQ=l(I4QR!z~э3D|s  OAQN@2QsQMHaf27^.Duu}i{ND3V$NCJD Ј zD?n5ňQ# -# Q@ڿ>E@ D1 ԁhpj, 5nYH HNwpnQ e:==A9;3ҡhzKǦ8OΕ,OXQTZlw54M#j!1DQNt4]#L?R5.#*i!k9NN@#w;ˎE(}$sI<e9NďFrl @ 25,BiP[DD+Q;śhDѥ&3F3 zq|CQ?L@KT5V&ЋKݏh2B/NvzNEAQ /-Н]m\ã#!S+SO~bk,L%57t=2A!*=#j{B_>75"ҔکzGpWrbWw!a#*UxJD&(P9I(>Y_y=J+ڍhEgCD~3ATkMQUG`5!y؏v>@Vt8v&,\m"{mM^Y(()A}QŨF@(XC:Dg(TJl7 Qp~oH{,CH QPQːG;,s# @'18$Dx;S.M$s8SGtsE#!Q;'@ FQqb4+3N,uȎ(-׹nF=-ݬ)dpȰ.C [vur0/#D2LZCO<|zD!2 ~zNՈˠѕnD%1I: QSf7֎F}4%QE)O:@H4.w 4(d5mdDEA8;^SjE+X @!>pc+_4@d/pjFqMF#i95~~{ z*y'Bp:RUnK10D?xDi' .hDw(`>`E}F$HOCDd|9E%ސs=bL~B xJ~DDi\6j~ي{HETz)X UsyDDOQRj"SGϊ*D Qs!J?Q o*J:52Q=[DIDDx PEdGv-#Ѱ= z#-kPyVA$Qesz-' R+@G&R@{|Gk.iq ~ra{7N5vMȢ\FTBF(GFޟ&8Flh@-">thQH'+jDiB,!xꍦeC51K|Wc~aNuyəxǣd8`?,OI "zA4FA4fDg\*LRܵVрϕ+ DNԠ~rf`2! <䓊'FBD:+)BTEAR3Da5^Ҹ)PhEt%BMFc#0 FmbDSF´Ue5B("5n}l#ځMXҜ%!Dh i|X:ŌPDIQx܋(# 7!JY^DQ&t87~;r)SoFݺψN1ZZ7*ҩ<R+j{7 *X6*ԁQ2/(@zף=>U:Ɣ(f,e V72m+.id̏)hܙug sD3 .E%@#D=*de)lJRDT #J#* r1ɶ[Pe >b ^Dكm)~߹*haϩ;:eD<QU#@75Fhv eD!$NcDAӊfj+ .J7V4( X65)h9U@66ʈ7LuDхJDcFcjQMlR%{gWn+`U!m H\dZusDF![ƂO#DNʄ0Q̨ͼPLWR36G].Y/L(@GN@T3 {o|gh/!1b9ʤ[*B&sQN#6G9$NuQ_#2 ǥѺ:Qڮ@ԸOQ Ԉb'Q*ЮtUAvH#&15ѦU# ʊDm#Q:MBm#i{D(پS˲ˬ(м gE!G.JCԐ0{QT)r+C!Gt-X%G PC1Oދ`6\ 9BMrͻ :"two pO>N|}(gƒ}1A41&8^`E 0 l0.}[(l2 Q#FT'AuD<\qKΔl) FxPp蘿eÐ5p[GTvQq"کN( ` Q 7RBSc a UK )<(&gY2FTo҆exĈR'B:h-DAzhX>KDU #8RnDi JSDOz@tnШQ4KuoV ]5Wm?Y|X|w҇ɫhmg%9)ӌſ_VxkO8u'J:<̿4% юTFq4f@TxIULNIөj>1GS&Q_D" 1"mgMEurD_Q͞!9DE:a(DZV "zkQM7١ 0kًCc9eEClEu XN[QhFVz7GãGu(Rf$$5CZEQ赢Fc i'{h|by.0fὨJKs1 \G'oM*:Mm3ދ7j/S@B4;vcvPTh [Ϊ7رGX6JPgDtH|jS QgsI'کÈҐ{D]2}9vO!z ԁnEd# E$h 'ILDŽqQZc5PSEx N&D!$eJK(>*1jDnK {ztdJ ;z2U} *\]"?;Ɉ1ǻ>3D#RB"4F;F/OUV48ND=9s:U=QxS>h_c,QKݓ(`bD) }nߊ)5 ֆ~3@%jfrSLx+D(5!+zumfT2 š nPQ5qF:3 *zHU~;X~|&݃ߗ&t@ZmvՑζBi8fzDZ5fy SjI:hG\1dgĸ>:S3ÈN_kCDpԚQ'O3uhԯ+i~4A/2~ΐG/:sDhF:/A# D #JOR4b],E&O-" L(I GDeGSˈZ,?~4~H)e;;Kws&V`E]sׯɯ/ Z QAWxMAu rH9ܬ:>Y&tr;N6:͵ Yru`o] =E"D|~DؿWc%D!GDyMuD!G.YQC=i DB Q! cNH(OF8_~xΟP+Q!A(C3`ZN''qFYhnnR _tg(DO^ EﶙЈ>۷By3W> DM!g ܆N#Zk$NP@hnAm~;z!l%"]mF2ij?.Dѥ볢nDڋ:]bEĈ|xDt툶ЈxDaVΖQ ֐53ww>}9K?=R@WeJO:؏ 8\ܼ L݃>ޗC!C\% ',ɸGmB/x8)GhW+(|+71Mȏue(fxFjE[GJw*uZQC:DtZDюI|V'GDErbf,^hry׈..tO&]!iZZSڭ`.+܉3 #xVU'åڻ9VYR)funzCJ|SJz%oLjr^O8!(1ڑ=Dk5:!DFۻ 7eZD8@]Q iG3uCg?CZFT@4G'Ձ~!zX ^^yI=W8QiڥE 4ʻoMT}7[9|)D^/x!Byㇿ?=+ B67@4Qy&v} :uhzQ7+1 OߍK3cYdp?Te)'%D}ni@H:9YE>}y/z[܋򁥗N+F{fr#a7Hjw8}VF;E\Ag/$ z+V2훀vy<'e>m B".D_Uk2D݉Deyp7w9BTDCzUv iHƻ4m l>EDQ"tDۊ~D=B7EDUuu}N(ۋXQJB~ (3c+Oh/j;:(?:2w@PLRB1oKЮ)ΘR)(0pZu{&(pjg&#(G'ԧ?Hbl ;ψu3( o"o# A w)ENї9Ҥ08YD1#Rڭ˂:H5 y0w [F?OϧR371AKD"J-s6^D!v6mDnD"C:蓳Ћ(auN/:Kvӏh@{+:/MA1#6 y}H:!U}|N` ^(vs櫓+uX:TI/?,T$7 7֜jIv5u~ˤ[>y~-" xȝ_wvДV?sQ좬J+fT. )De+I!:jB"er4EMj2:7EU DDCj'f>QB&{NK"QW)0hUXBmʊNf2RoCMU|~sqF 7<,mDeJWP?h&@e2`ms$?>ډ#N2B1DsfEiLњTWg UD=A|)uv(V7xRj ʡD֙puVf p r1KU":ј^Ep$Y1_aDGCxFQRc1DÈCdEtQpNDa uvtagg(6 J FRH[\htƨw 1TǷ~. Qm@SQސ叐:ñŻ4;yM 5E j? )?-0;qA45!=|ӈN]X^ + |]!j/9?5\Q[GW*3n\h3 VV!JrDZЎc5)DˈoԾh:(cѳ38?צ|&${~D C!|{{er.1ET! + FQ^DaV SW-ה^"ھa:Y RV1H;5蝰/˺WXjD˧нѡ{N I8tcCX6wN0=>PPzEV1F"m$Y4 :QĈ:ok1ڲ De2˖,OZ~_Έe={Yf٘{-,2,2,2,2,2,2,2,2,2,2!vendstream endobj 289 0 obj << /BitsPerComponent 8 /ColorSpace 150 0 R /Filter /FlateDecode /Height 450 /Subtype /Image /Width 675 /Length 13318 >> stream xk4E3;TaHM dJɺetWeٲ(Z7m[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖ZQJ$d8H+ShKlq$:gH޹v~}x>onr׼7(q2~;@@% ȄD?v]GnW_t;ܭ@*^O~6 DݗG>̑գjz{~ǣ44 3(H~ŗ5(2 4DQ7{L߇H$ь6#D@H%W5o#Q+ s$h~҄y]{ެ">|)O$D@ݏ{@{Q@U2j(^@H&,j{3 d!<)oBjL\FպȜ{lLI$i ^X>gD,ьrƫba#_%rLtdM"{mts3IS(߳F ¾( 38bx=b@)M"^8hIt- ZKtٲXug IDlIt- ΦRk?kbg3Hjumq6)P^.38hIMJ>@zu|/@@G(rZ@#fh$ AOݫX*DhDBݹdX@ [ne$Z@H,@qޚ 1j#QmQ$\Ob>2h D $.s1L#Qc^z6V<y@HT=\"4볟h+اAy$7wFA ܒD$D DEn@{~Dϫ]={m畏 4^Tm&eSxf: 4DPmVݿ d=*t&@ȜB$j5\C[)f^L]d&늎t]Q $D [d Nˏ_YH .7+z-3<"CEO8'+)vz\7otavRqб K"Qßx^Nq%h`IUCz3 xh~C(QHKNTQqVY*J@HD$M~!%2k6OK)K)4 ࡴ"D@J5 PO|!?RqTɍU@t8(& &| PCɮ (ySbQ%Hfٌ?<ڻ Dx s' J_rPa%J*ZK> i~yD_3:mt Vmg29b=) qQc 2 g+2pPDѻ $eGuH"QejK$@mlNUуX3S;LjX9 צpB/)'ySQ[zMUGX [=)L',a@@J?f+QJ Mzs=fT,F@#K0#0hŇ@ RQO 4Rxf*E&JrL &FM!&[& W~!hgDi^]h:OkNyܚ;ijϝMp[ySYUپ];%:H%=݁DˁB.l!Qu b8 Cvx$Q$Nšn `3+gr(@B^Ҍ (SI,)eԆ t3@$h%qBH>Do0*AQ.}z Ns7(gSAYo/QOz\Ǘso!@ t/ @xQ/@x Rɨ, P*K$Ef,6 [ .@x@Ğ!M֢]2dJRV(R @xMM7|U |9P[& $ U&~0E I@{+ R%@$ _\Oȡ-N>O.fRP(@ӥ@% _c/{q .9bz; :3: (5%@WuxĆ(0U~G# e!eTCހGM$DuW=]6 䕨rUHJp8|,7Y r^dH4 H_x;Cʛ -Eet'_](jo p~io Ph{؜5PL7T( jDDJmS4Q(3g]?5m~ 4Q 4DvRDՐhURDKkU *ԛ 'R!RAI*l0*tn }lD ҳ%2f>d d@F%zMϘʛl=Bv{fPyΙrG`0R4Q$yDx@\tr7ް`. nI|&Hy(''}OFM%gW5(HH]h( B&Hx@W|DI& +=uԴ k Nǁ7yPj- 6N'Man>7U[,FAwGOEZ;U J|UPc*Ьxq{K[;$ytL^+~@Рj;P蘪AfmǰZK4L!2|{9sMLF&%_AyAO%z@( {T2 ϧRRej,QxJbop\N(K!9r9$(B:d޷n dhᡶ ɇ@ F7JTѡc{ HG 8^$† 7_lMzhWyqhmuTzѓ@QXdtT9%pH i;Jޣ:0 sl w е'x p w9~2R@Yj?)+f>TGN{ik%/ z@O:v*vd8/}{=1>[asHt?oׅaw^ulXڳ@$B@ĒCMZKoVIՏ+ _ݯt +bh p9P?:2iJH J'%a"zzЦK t$@'=Ozh>&"W"d4sy@:xI)rt(}_~ERGG8,?+;ԭ4@*)KD@2XрqSuauc.q`3Tԥ@ >OqS@-c+QpYy] HaIѪIIgFJD1֚ Hu´va@#z`-"3(e@$H"j@PR@IT} j#o TЖ|( 1\O((lb4PאI l}j4c^JT|C>->; ).`q?ʳ[2]8@EK[):,kDK)FUhD6%X@\\&h )@pp>XT6$&м-k18;>펉'@ܸ*yz[ٝn )^hD)dFSdG.]mDd(a:/NxH4o-]/t-*{H4: @;tNC&EshfKĬ@ߣ/1~[*|-./@U~T~m3oJӧF[%421 }Jjt>hlg[lM|G!҃".#jѴ(v3@CI\l#jDKNHd;Z]6ݍEp-(?(*b> 9%P=jKs!XoD|1D&I``>PohDr5 ">?2P(7_[\e9حxxz@SLݗO6>@ E?:ANb <KT虗DUߎlXoݗ P3!Q%#* @K=Q4JHٶo~LG~ٲFIԞ%zgqh[[@nG/|@DO (H}u܆GZQ?` 4@_f=7$M5k=+ (# md>q*iZOK9>~{WWݥǑ׌BB G>~{m1  3hՏ&pw & QuV} 3xE-L}WLOn pITt߿wuD} [&<@jFH~҇mfE#Fb~ Ì՘ 3ݽOECܛzt~ pD?hP2:ݑf4 H1a2s&^/_4'=T2 nQ-gmF'B  ||Z^iV:N#6Eݯ&@63 xh|@KcmqZ˖M=[@M $:gKmq6DeJ3Вglk\$)hNblq$ۥg , khf,=¤=-4hzA(DzXN]@ (l6dɒ4\J "h2 AdO 4zDmIQO$79zwˢb-EZVqvmx: Iz IsZg{st=zmdۯ[I&hg'b<04uuG []{. @F5$t*ѷO< ݈dvx ګ,&/QWsr8u ` h(5샙zP9$OEMFp=T4D1 r=(,E{G y o @//4Lk;㼲pxMy\F= @//@3yߚB'ufEAbW(?͘D@//@3'G@T#їF `K$Q Dձ@>8ЀD$zPydk?D7 cb(b 5P@@5}(Ȯtpy|,jM"QϢM>&V٪hD^$!uM}q< :1P]U5D v3N+*5@FѸo̾Uڈv,hzhʯJg7G.]?$_:DœTC9@xD]=4Fʟ@> Fmhή?J>:*8@ !Ib'J4P?By2zB*:?(ʁB> D#KTɶ7J@_ow$rCWF A@DJT.#@6/T@z a%jgaM 9tb_0PE80hTp" M!Q0. >ȔʁNIЃIGSWbA~wBwD$sD (TPd@zI*ў@B $3hS*@ت(qo05uh*6n8 $5U~*B|bQa4P2$D9.J0|_ P:T\h* Ut —ȀhH5U.~,$^,o>CسMC _ a($Nm73^U (hIy(v Wl*z+댿5:/ڪu@%?6û4EmdNޱDDUd,PGɯɢ&U#Y@+o޶"0W֟B;yq(%ZWmgVkDјX@1/D*l-_-?"]׆M޶9xpϨK9^("&XxNކ%ce!^d+4]G4K(*z@Y ]d,PB*=)S@g[,l I-Z//p&ނuS@[ $7GqEXjrX/ (uɀ\ylrXfp >!@DGu_GdK痕hu]@XPL_?P2}y-ƀ} 3>m|vI.-sGI@o dG}Ś@H$qەd(hIvaZ4> S SuD# |#8HX@~Pc$3a[V!#"P 4ή ㈻K_UA4BE@JDTP"bF =7v _&PCc*{>; 'Q]XN1&6ENYʀBL硊@[S.(<%L0}T#O=W =2*?H=7a}k𲠸 C0#w:<=C5}$ʙ:_A%$$y<:MYfv V6M.LP( ZYK<Pm#d! e 2J0dpD- 'lz <'PS"E8-| yמm^vtm |< '怆բv]+QQ !PTO ԺMEK[ހDS*8~@ߙ@"hD .nzRmH_ 9 OohD7_ +Us]@n׮@@ | 4R.&Ǖ!tEO|ȋ$˹E1D_NL4$ꮼ^%Ž?DӉjQ1~KdH2- @H4#*࿤;t. 5PPV%jK_TZ^Nn;h݂kiAL&ez!"`c%*(ڄNm~ZT Z/Z"Za6PR@brF X } LBD3-GkA49]Bf^ U΅#@ퟚITvq-yGz>d" pq@N#_KGՋgo7K?<2PU*Ԥ夓F omu&kA@,Q"Kc:!߷$k֣5)$sH-_2)NښǞJ{j"ʀi f@\Sbz2q&=q(@%.\U PN(<D8Ҕg@ 'b *1@-jTd$.\lě,$ GM=DD7EϜEZjc 0/@|@*H!fIt4bA_>tIT u'=[U) C7G0!D"KZ r@B ].ST#åT D.@jָR&$IM4^/p߾*ӂ h}Q'L&^mϕ@:bn aq_%cA x+s`S=H3P=8qXb q4<8PS(zy}wu+&v}68 {Jū#X@ @% 5&8G guj= 0wsTJ@PP&aN}]vkpOa<@u=Kԋ ˲:6߂UCt֪P֫B>,Up@ !|uH޵ϬZ "pZ¥6c&Pn5(tFwU!͊$O`e̷p_`2? Pn5(oޔu8WR?Ĉ)ύ"MM+-=+Q)б'H6PDHлDAVԷOK;B64(s@B@o  #s@yEz VS@GpN0;5*xva^TG#\.I:#y]Fz?[΄B:񸷓E$ 1_7_l?Ϥގ0DH:OTÀT' _"Ǣge(l3ɡ]"m 7+dNPS?/&˶釒3%8ж[VGɟ3TK;UJkm;g~l,@D1_ гlQRT@l%Z3zN~,I35~X@we׾#>4=Sh[A» TA+ $3 #CėE!@5 hD;kEx HI $zH-@Q[92zL@^ 5B۫({&""AE@[e=,@#4+m^ qmxuU:j&e˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲeSendstream endobj 290 0 obj << /BitsPerComponent 8 /ColorSpace 151 0 R /Filter /FlateDecode /Height 298 /Subtype /Image /Width 670 /Length 6996 >> stream xr:@_tJT(xm}NeI4<mO=oh*}/?-!b+0W𾔨J/NB~ꤢ+ ޵P'S3w1 65˾(=MlD82KIa{SA<.ā{ؗQT7$!#yS2E oEkSYq?&*f[?Ƥ(4" R'TT[&n`,Nešgi:s*uJW] T獩2Mujyu *u- uұN:IH[S͖Ǒ> JwtAexH$k~aSIc P ;Hp s=㕊(G:?N"۝YKu DK=Y(nyH76wN:M!Rkb+nSx)aʳ\Kq7>9nBwf |}'Թ%ۢwf UvK)w/JG|^gB 9QW3ٞ_V(ֲg~~ )rZ}΁=[0zǍv~ر0tlͩ:_f4~zs5OrT0ڱ:g:W1Y,l,[o9 |jqf?lr%_"4h~<#;a3L6.I .䗶7>IŚ|j!ͥ:-|2unXy=/ӓ:W\#se]Z:Q.dܿZ uf*OCSQ.ꤾ[LݰߌdKFNŝ-\r=.uɷ{R'ЎP'/R\\wf _d'6lrd`ѝ˔._5K.swfQWz ׍zJؠιyu- w[Ke]>dT*]Dהɡ;!weJtLA,ϫ_a ? v~v}wUSQr [$*Ʒ˔_756m??٤\DwḦ́\fw/_1)qur^?}_E(b_h Պz"BTew݈`idK/Sd?׍V/m蹋O˴O"|KBE="/ww2o\w>ŵ!u]ݟ,b:|"#p8-#Rĝ`t|\ xv޲_!G".^||iW߹[ }_nIw_-Ssn>;^vi)o(NyxiWC_F)6*~U'Aveĝ\ FZqrcS#Jͨ?g]ffI\xЋ?t9iOe5K mwvޛ(T{{JИ:7ٰp{>_ 3@/Re.hwV-w.NYWYSxty=uf:̪9@ 3ٲϭxhi,p xu68#|5q 1Z`- ШLig[ O>@6;Pg;ꜵl.aYМ7\^k2啘,i}Ŀc|'1ںCJI}4mĝ.`iQ}ޟ{ĝMStp *MbeJJu.h;M'\rIlZ&xD}{IgiwîSFYSRb_S\ ǗJUNH^;L#.xq fh'-eNm_ĥlG̐̊RbIϳeN\GJ%exu6ٙ^T%@(ujpӂԇH݂<wfb~c.zjec}SzH~<?|g %Lw ֘%IY!.~E\{nѤGTy(#siT-w¾S?3@׳/{ OL|N-"djdd|/U@|۹3xdV )Dͱ'*TRm5 ɌM Lu\h_Lƥcߓg^9]pP<a.f)=`:d#h~3|{צiV*(MzNl>)>'soL8}zjH#g42)&5'cLKϭ׆N_4~vZ&a 'WdT c8t]ehsp}dvEԅT+{Nl>tGs('<'.NFOMx:^'9n*`9ui91$將d~=9 q][+M:]cZ &ٷ;ŖͅuA9ZM:bs ,TMNʞ-^wNxuYRþSnURY9 9$9=OamVIw{w*X˰#rd׌ٖ36ϐec>C.= |&g|RRA%"7$U_%܊&NUIe􎥑PeĈ6Y`ƫNINꜚݷE;EŤ;SVu /x$oVb!3MSU;]hF@;.Jѥh`M.SavF|*s'bgh"Au]EvIsnLz(7ϐtF w:E־OѓDTA&ivv;me|9}*)7]s:4gXϪs7axB8Y's9hNPgme80U`Y#Qy kg._ss:p¾3^*7ƚdRe XvǤC,bV$56܌Df&}HBݢH*fIZMNѢ%ne9b*٧̣CJѓڳulnw,ꎝΔcMVy;j۶ ,fB,',XRV:Pڡ178%jQOmy@Lњ-RɚE[R Ote`qpn.@twVXb|Y7ѥ!u2ڙ ;ɾ1=uF م|zR *jN0WwXuר8'7kB dhK J*]T:i.]ӞP3اa8OWP$I8 Z$d$k!.P!hL^yƮ8,ٻZ}-Զ5Ŷ3rMfgk9tqpXt9+źiȮRI8r !֏Z _3uUnJ8`n&v6" G(fE+hֵ[[n.IortSؤCܨ8bhf1De{ `iYdQKzp4Vl-T`JM3u. v'gk炿2^NzǡkE%8 Cr3i,p1RJ(NSv'3ZG,̵0so?coکir9\;Yoȹû`7Ӣ' {9䕗~-x&NcY4,SkLKFo}u ʦ r hK3Ӯ Vpg\5Q4viYsa(`rЄKݳ5{R=uȨ#7]̚?:~>VvR9Bidn?aZ!W^C\wPب5V/-˩CiiN0{o>W2“FrZ̴B:u+ sEAUYK^.V ;>N9 :| S25ݢHT!6r龉^JX7? wKQ*/? oS2׳M{xǤS^v(:B2Io5눭f;x8ހRyq.woyd7$;/F YNO2;^n_DH3}v]($,Z+: k.&PUrgzvRb !PR`5%Zh]$Jz@<` -z8]p\t)1i=i zɇt8v}P ->֑E!@u5ƞߵVg2?tzte3{ ^t/d:ČX=hTMEl n񠁘 D =8h` EZByJ99V~WׁdW+Yi:IPcD~ S\]۲dRzx wIއ|i]rlR;7sȖ1o3To&ی%5!J߇-4t6 K^WҞ땝J1^9RJ&Ot&3HTcҳ&L*G^]:R<Icg TlWu 3Ay^OfV8_.Ʌ~l#s~2:NC&:!^pOz-9EwZflkO(ekB.K_wT5h[*R?Et?O322ٲ4e112?ǪmMZ<?-yٌ7-325{1k#se|eM,\NN!j^_u|QyT٫?MF{E<5 4E0o}!-4Hw[x)9_-t,QY˨SMI@:h\,Y_}ec,[uΰl I@@O,|PgP瓀: :Y%+F>w_ph/%dr/~vK{b^;R]biR֥yOxӳ9_ ٬>BV癩~pYa5:/ER~Ǫb|+^΁g/ԙ-N)K=~ԥy` [OMsF6\٬?BBygO&nβ.;sv5ḣ^8CZՎ)mTQt'_(%_.Tb/㤙&/5=FymF% oc>ff3l ӥ29-ʅtL[珁XGnGOxj'%d3p Yvvz'^s1?4ybcy>;MZj4ױo$:;/4f&J KyqhТ] 7Y|3!jRXv17 ^Je}cn<QڽLj|A%F̀c~7z}֥9V& US^5SJsj6a4/>-}u& T[vtSƥG"sB r(h1}coN?%wڽD9ّ\S@iR'cqW>hAɝDɺ7R驳4ɥ ;uލ3dώ ?) {; T'TG,/u?TO~](M^j9*2QMSOsz6(1u'G;|Rcq=b" 5>Μ3UH[So(.ױ/z#Bsŝ4iD@yOf4-x0dSgy{[BO@~aV>hGزٲhb@(cxOSfҔ얧IDW|lFӜ́vQ:+ Ҭ ?mNendstream endobj 291 0 obj << /Filter /FlateDecode /Length 6329 >> stream x\[suN^"W\&A7;)?H(%l-ophi}^gcE}hTgM{wU=T6p*,Uf Ovd>n\ }Q–ۡoeS4}⮡~4oef7 PJ~506=mt.d{6rg # ~L0ʯxb[l4 C;l\p3 XrF0^i_U|m;Sos| FUٍ@^41*/aGf׼ک`hClWUF~Wn|c+uUIcsSV*\.'-N rI$|DzjUl_e-x*O5UP3aA\N|aK?6T1h*9PH /A7nYXz}{Z;|iTpVU@'Cȁ:o>~bO.9nsn[j&@ WeI% Ȓ47C?F%by`]FxDd7S@弤zé/!>fPWm§ vZm\0,fDs/YKSXj +@/ SR t _Z0%*X 1*1GPAB 7{ c 2T!-< ua^ФOtqAOwO띻{^^(ܽ^yqD1_-rt1c.-nj'NЁGS/XOoA*v^{g^PK_=Mus<2yLG .WId'$w/EUD+Y΁J~1idu_Ho=rcmХ_U敝˜ZlvcjrSxL+-%jɪĔBYʬfxuxOK̵ L)]PMYEE{0Z uJ ^<2lT_˩m KRz;{<;tOi ƍ4fTe@@ՇðFh,gj3{vPMV ɡ}х1k~P)XM\$CSeN,A.& = 3XvyU. g=JR)h5ݢIUsw|\#njvxl=A˺Fs铺+ I9}`r0ŭQZ&2>&i&chfH}<%YkO (ll݈@TN$w'0e_L}6tf^ A*]d8:dr FncݞT&]zoA Bιv:c[Xi_Jqfs ۝1\&rRh3QoR2~w솖vͻ mbɐlaۘ?(KwWB۞&š14m5v IT هC͕(h,ig5-X%ʆņ;Gg x7z _u$KQv$Lb3x(9XK \XXak}С(eA<BVoE;RX`pQ_RχS![b1AzѬp^qP4R^Vztd%車RX Ep8Rc쐨QGFM&oJ<|@T|fs9/1\KԾ;S nVl qIbgB%_jP`\S h6`9o$0XR7=f\uUiMCr2+Oq+om#_QΆ|U]Z|h? p釸z2ztb?V]\@X8CDN! ƾ&Y+td5v8i'?†x,4j+$5=kB5.^ Xz.LHZO7XV( ZeHQ@ѹeӍ+Npe_PDKC$3=uY(f3lz?I4]+'5\XBׂ%ewM{kL! rOhH D͊a Y٧3E$,oj!PlrB=ТԐWw2@FQ~OO7 SQx4@(.TT?KhCք'02Vtdrʱ_NqCLnwވlʬ4fX6rnS=!BȿˣLV:*cGCx=)~shW&A\ |9!px:by1=.ϟt3ܛJ F.Z`ݎIvE,ipTnȗ3D"3\vR}AK7$RUiooW?]!/h6p-$:q/8 iO2@+hUտ~שdʭX#Pfeq6|s8Բ/v~4Knʺ!# ?i}6 Z#073NEgg6=OQ(0yPVn|&~8!r6~-fϮ䀖>d Gazպ 7<5e*FɮoRS6 hYsy]w^jTTƜ5!w̕HEalS9P9@{1X-'q;h/y v32!8:G>Ǝvp2@rGO(j4fU>ȠxmbQ JT;tS'2R292˔fF+lb#D+ߟn:I0#[gt {1ɻIrܪE gbb4WO,@cI$ 96996lf~/ EOE6q ikm^H ކ3agQ c5/GO+i{%|.ӯ ۨDF~wj@L ׼arW}S+ImYxwq@ 0 M8|KkGcfh[_4H Nh%^;sawV La~ v3UA XR"-"9ׇpi,_I Sxq)馿xqj`>^6’ˋĽ<~õhȽs߻4Aڒ́:AxynXWZ6 d 59F5$D2yH TҘSz1pы5?8ydnYπX: '[;}jLMؾu''1r6}![ς*/UxE\'M]$*..c2iÀ-.ro7sǗOW[989'ї/`mBxM^_}=lCʴ!/IXǬYkq6u̳2Ie-"$̂3VOBzpZ^Y ~_~~_l\Pe./KuL %ۃ-ຖd|:l̚+OD+&u~53Ѹkp2N\R)endstream endobj 292 0 obj << /Filter /FlateDecode /Length 5110 >> stream x[ݏ8raq/<:H)@;4rR[RקHQݚqrHU&K&&/J]I/TQ؍RUvcҼĉ͟dÛoTƟdBjG25OoxT+]mlyC7uhFWi_I~<aMv}/dO2d<[]2vЉ˜JxBxV 8T){=?ihw3maӪCz:9T$^h.7ycRJqjH(" 8,ƹ=L7deeO7[%rjw/?p hN""O|G@{ 6 dߎS?7ON}଩wtlpL~TV(S.;RH}~=4>PJ$jo5~WRW#MSDUiIjYd| 5jh%XhvJA>DW*'4]LÂi Eէr)/-pkY\Mo= 0{ - \>Re4r"~X[)!;oGrM[:D`5{V|&e)tjp=}ojX%F`*&!9pp D ?TLv3 Rf+lQh V)~ Tcʄ}#Lq0Mn*R4dH+9&1ác1PUi*9̞cSCñgU"bΌ92,VCY>C{#">]#*P9) +E;uIvשH؎ĦB%ʮ BFWۉuF\y%z EvHȏYNuU+.OC :2*mʌDe]#$fXD m *#C;"OJ\L`HZ o'Pٰ њVsB1+7ֲHuPC1P%ɐ/= ݡН\'0b$=cj%Cy2vELheoA͌~ĀD@DD$كfc '1EdE*&_yGߌk@g:`&Bs?4-Q. PWeJw2N?v-*Ӎ ʵ qPh/yto!'R26%Sh qM+^(qԿ{]eMC)HC)@F*SkR# ϓ3`J@+ERvvd/)$qŢ;S@f JT`d ЬX{.p #7FրUA֖V%JU)OIk\Qğ@X x҄T2qϰSSp*,G:5@f˵{H,s |0 (Ų׃ wdP% *%Z=쫄26U2MwH76! u ضQ$!?ߥDq~TA'>" (f/5.k8עVA<1HWrp_O _)8)SB#F c>;aX?(14ALTUjЎTPQBxFӵ#32cDo@.1؛$rEPЋϭ1vqrj:B%!WF 9@j5|ivGb_+WOC!GВ_{n1~q^=.bYuoP'Ǥ(9%u`Ee1 4$,0)BN\`ڡA?#Eϙa8Ϭ[!CB޴M (ƚJ5/⬯m8]*$RUӭosZ.Z,T$p<3)r) qbcj &\}/sj=ÊRRVCG\TpQƫ5.iJYݺy]A}/c_RYCJ~f*OǾ5~{贾x?!;Pأ%jX,RU}R< `ʰ& !S(cJfeQq&8O{R?5T&G!C863rX7:Џp+ {"2.l]3T"9pR7'KzDFW(L@2pgyt'#T?'Hx|YD&*Z'0,|UX5/8dE_Q)IW- 9kBn' J>H;I9m`9y4߯E7,y;bԮڠ=&sX(4t@O͙ʊ29])ph}=YE"sx5,$mwQq͹T/лB,Bc[w-2d Ȭ*;G8^VΖnyD P+\k,rfU*6%YXCrsI8/S SFAꠞj0Efwn,3ߖ>6m׉/_zJӍslޭNB_S\3s57.v}@=ԐT<+ԮQi9F%L};T|"|黙+Ş\!TMo١1;N]8Ctj9il'\tv"M=  6XEicEtmRQwu\_6q xxEh}Ƞg7z3PzUS|__BGB\}o *d~@JCc nNCI- { QXG2Uɰ[puz }+\ 5] )P ){ GL9wfZnVKȿ)bZ_BG6^Z3m˭6Uj4v#ϩʸԠR1i9rUvO$?EG6BK7UqlEf9 ^`udX-/TS?B%:&tlu'%Cq7%C!K8Pe9C8}Q Do,7 Eɷ>ӥxaeWS&>NE6 ً3-9䦵[Ra 8-tZ;W7+4endstream endobj 293 0 obj << /Filter /FlateDecode /Length 4022 >> stream xZKs'i6%"ƌ+9HeI*Nr|w%`%ߧ3\Ҷxtuc?TĿPHSP2igJS?+.Å"IE`qE(UTTUJ 'RjVfui)cPB.%\iꇫj!9z^m`uV,' G!Ϗyp9+AJ|T%\$ Wƪ[VZ2ZpAj%JruwX7aQ*1vgvUe~K9&]ںt^ipsr*l}(x04f=6yȦ^WQ!{hI\ҕ)yuFťcմYJr/hƆ8ٵkr! :PYVv;+W[1=Hja2o]\魸X1xXY,5MmqdtJ |cçx~zM8x!Sa$<d+ e% y xBű JΠ8[R1M!F6nlXqzΈ\ْp'='qA>xBFaFn~}RGnhKh]\4Eh12_h8X{D0m=. V6|N~ݪ'Ŋ OHn:X?qH5y:\:Obh]b3 Fxwu?2z~j]ʗ7 AJ]3 ym}ҼPrui C=_@*Dǂ L e 14z {! gNА|QNmA,V@ 'p# A#1Qx*0C11?#p \k]| '`4,/'x3깗Ђ RJ,)t`)'rOw'UF7wmunDYMnpŚHO'ZMGE_D8S O&[*ObsP4ì)1r+63.yWb lTG2yf|Xoᘟq+5:z?VI7[2zn.v F?r(pGgʣuJico y10'Sq)(l`, {[6eD c6U{*e *wc Vaa!d ly,X@^gUXzEhEP-̅xMbh(>>=2^;LU#Qz8o#CgM.Uq$]\Y]= "UtD t>Xaq`9!l jA_Z^uu8@Ի]6Ni)f|Қa_mn=pb}ZvǑpniY 0/67n%(9|P:-ĉmUNbpCkHA &ޤ5#;zbWoi/5ʁS8TX>RNr S`^w;A{^Mᅆ#$CwLq^C4@HF cȷ,x@1uqN*!cRYiH`KEh>NI{Jv-=L`2XI&$VŖG=2\! ̀<O*TR;!fX6#bԙx˜T*<4Ym@Ά B,RԎ +J S4Ck%IgߦޗWo53DKq ;홿.L5)p&UMuHxwpWbVq/z|j,uò)1 AMđG=}6M@le-}hwv$gDww lUDMO>KJ󢦚P y>,ArP~4B#%NKmHT&v|-Jۅ=E2{x<.2ѯg&, Ɔ6 H!g??,8v)`rzw,CAǭ*@=ؠy@Jv8r͠oiv=hg>w) C}G.ck XP~0 4\R0&0!J.FrP\u4]Iڒ579Oovϐx1y\/$5bw? L2jŽ.>o}~_QrÏt]y塹Uԧ).'R/͋Y-KZ0t30姍XԧRv)m~97>T*dt,ȿiEړ̶85G(0SgAʃ_qŸ6ƦUiKÏҟVv{;'\~W 9=8AͅR\a >?]@p ڏPh0xz4ŝr Hk;=7m3:ֽsyIK?"Vt%[vvihpWR*)C L' ٴlK.4Jz X`<f(w2b=41eR/Mh~ҕ/ FO6y#&~$ۋJRJΠtg\B$VMSC.orڋbiO(wUMr S!v QJ?EGi )L&oPq gx. ~H@Jw} ۶ο- '?U9$v22B_(ehħjwi֗/-'/P-:+4D?B|'m`M89` <Rt闚X^tIi[]GDF cpٕX:+,}JO~px^AP ;r\'{|wI1?gendstream endobj 294 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2608 >> stream xV{TW t*Zw౾RVdw(JEP<+&b1@, )R@V{t[=X][8R~/͙3sfǕP(Dzk71>zΝ R0O|X3{j|О}Ĥv(bfN}Ű[gϙKQ:ʟ@PMj5ZNVQ5GeQ^M-Ej,%&((/IU4tcPLEO71qxQ^WkFw>3]ܲ I{T^ɪK4 i$fE:FA7p;==Iק: `:zlc߁xNA?vh#\ JWʒ]Ðy GUO3>=.cq6\OtLɖI-IUP~#@dp ס6AY~fۗf1:|.MT %o O*cTEa]R{oH/Oy{K]שF胖]UPHx;a[֭SNIߠvHA1\z 0d# $p瓹@"ddB^%3w?0<+q1y7d%L0X4|GxQef$]%Ż|vZ YVVD~ƔW%[jQ=g^_dq"]a0'ҩS\[pJL;0ߖHw}e*7-)>XU7H > EХ`k?Y\{+$?] 5R"Nhݼhi&&5ew\_\Z?a-RIeuvjW_d0@3'hXѵ-y'#謪=S2zI/1w3!YU)LpJ*#Bm!`vR aDEfTeRSX 8Uv57' -āBgU=PM&&ajړ0^{>u%;|q0~5EF+ʟ@`sTtsLlo l30ތXL=Vum3xK-0]}GbMy~NqzKkn{w[O>řϣ p%N 8kRwc:ϡ~:RZ)~(B F|@I/: 6W$ dIyrQ gs+t0,PT H~HMQR}(2]@z=A2 ra!0Y ,֊6XDnA0Y|a7 kۯیEAih{2f<';2| Ȩp牿L#Á]u`CR{OKq .civ`tθRDI(&W 9Қܹ'\W*Ōe By6.®(д.Y{%ja$C 8,%v.ܳ9 GY 0`R d{ }u/ bOn>4ʭ/ 8NְX -VmJP9^f^(4ucʄ={uu%5eu*b,+d"*Zk{ʨ{q c|&K1Z k` QdQZF+q,CLW'F^JZfN.32kU"U5p:Nݧ,j'2:{7[TSwjvOYaKDƬ3;eSVF~MwO]K^,ul*m,KOĤ (Gd;[f[e dCeɐh>9޽$BEq8Ӭ,'AJrȺ#~G 68SK2Va@ G+$I6a1 /:#N((0ĘyYs$ 3l!^2 nI10fSy_o@K5B/0DGӿ,_, wgbeks5jƜy"4OHy^9pԌƐ[T|Jz;?z]$b1wIiq_nTHԽ₧@OYV$HH3i3D+(>DďK9lj;QQ:)S,J%'n`xX܈|7߆ƾmc0͵W/pۺ*CS6KS3 |Q[#璭m VüuID {"QENb[unʗ@ CQfdbFע[49)>>wp:%]1[ddui9KEcR>Hϸ*腳gov-ƺ$Bc= 6X(0lOV-*\ÍWEQ*Zendstream endobj 295 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1546 >> stream xmPTU{oK)MeILɷ 5RLZQWaW!}Rpea|[PEeU$K⡩}hP3tp3yy~My{Q4M+-_8` ),;3kThjxJJ7OΟ13`EQ+ש *z VPS5K=FF7A]#^E^?2K߽ {;.lpIJqg?#E7;oVDԚ$L߮e/f%|Vc!-^} A"Kb#".f뇦,$49<Ԏ#'%Œ Βa!J ]{ ݵFX!I7V_ Bq{f2 fbZo[m5GfjE[dDz̀e\6ZS] HFi@ZZ&TV}rS]?6SĘ Š~hj^<8_fZw Rg\TNw$i"A.)-\.qi/qĸEEeǀikexWU}A搧O2Y_HU5esrE FA= Pbp [8kA}hrA4ߵoܔ߰V_qUI!u)k龬[":Rjtɉ {+uFk3Sw {j-$!iUW~m/3Hd~ ;|DTaM5$ SYn)+TΞ ջc-(UO}=}Wlomw=zp<*9.''ҹT3EMȓ$9|u!Sp8\wА۵F@xVo_ɡ/$oNy;%Jhs|:61} psnÐ6Afo+fӁQmҨJ/.'i|I|2V)367PДcAwxV2 h#fbb ^C4˂|r} g<Ѝ+pS+^*e&AJ(uT dpo,T emrqwpCyld X{U8%ϫ΀} .2RXt)e9s@$L6TUgo7%N^23>S|"PQpN͟xm+"1dì1둾w,dlƯORekugEמ6}eN3^9u3GF؅k.>C7^g۪Ku=BsM(Kgrmy,-`ҋᠠ]E ~!endstream endobj 296 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 245 >> stream xCMBX9$  uz1[XOa {y ~G~saX$xP4㋼n>R wwZÜ#Z #% 7 U^ endstream endobj 297 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 342 >> stream xKMSBM10SA  R3fQ*|{d|fZsYH᱋ ' y{yzĐYYRxzyzRUkl&JmX$xU}h lx2~{w|pysF8* 7 _endstream endobj 298 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 281 >> stream xCMSY6`R   greaterequallogicalor_kV`Ez}}}y{}q| |qqqv۟o}{{}}{endstream endobj 299 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 761 >> stream xUmHSav-Y,/RQjڋTYQq˗e{1ݽgwKSSDԇ^JٹXts9p1G,D?nލx k)0q9c m[[j+?eTZ-ҲVzRi]j+E8Nc9ʼLd^dfaOccBנD誈 3Vl5c%UwM+Kf3ﲧIxHQzef7cM B+ AeL@~|a?Fᄟ댰 e#iB$ wL-+ CX`@-B=J:˜#zh~*?~ٻ$>eE8C1+G7]!R^jBbN +Om]b\N[6_=L'&`A1"h[&Y%W#D;hd9h nE_?`KDZPMGItT2DO}2okpd S>f:zDh ܢEPMhe$7( A6吆磲l8Lz-WR^ɘ]oT%zbV\U kTyN{ک9a~-&3Ra[.C2LKqG#endstream endobj 300 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3366 >> stream xWyTSw`-9ĵ::uYe KMB1DvVږju}CE9r?r=|+Q`xtIJΙ3S 8/^3)g|fy|Yڤ)vܝYEER)T56RR2jZA"Ukjj ZOSP^D$P`XKK\^젿E^65'Hqȗ K!CY [ =^}* 0a1_PRpכub& DH4qIC g{޴vw< t ڲߋ*X (ipn0mB|%q8 Qu& \N>z8d۽g׬ ?d\Wgccge (=ltҤ)THd-G=쨟fC^<"N VE v/:÷n-H 8vV0vM)*jR\VaH@WCXqa`~sAجq[,bQT&^cPlX6unhX ,w TPf`׋S=NdZ韖pvT1O籑8$7q|?mt_VmŚ5; U&.8%F%cis؇ 5IB-&E# 7Cq rq8>Z._y$쟇o-$"(- vQV6斸-]2X]/b;  Jݩ"辌ɗø6!]\ f?k>HSV\ScQ-i[B+bQ Zt5hXn7Jzb/7[,ɕ}.L[iS?"}#LD'Ϙ"{VyWqJ¢hSmV0r5P"8f%LsM}އO/St*'0) IeLlmbR)9ohzh`\o֚@Z.wx:ZȅFj ЫS "㲤3cxWԌ@\088*ӟ(clc&C!sx-Oa _/m۳k{KPKJLٗ l’N"aEz70+',0P *ʯ+wdtcH>&cT*UJY;4{_4'TƊs" jK''p>kilU$h9rl"+*D̗׫N`͆& kѱr0?yi/?.zY_XUOQM;v|tK̪/Sx,Ճgp3ąC@rjs ~>7?,ȜKzObc1v*!vkF4ސ[~ǵ{7ڰc{KYnqpx0d6qV?ZdH1d GTE"an8L]cmuw}fq]ҫ@5&n_CcM`^s84*, yMmf9toH7d;sfMCOxZG)*JP@+%ژݵt5أX-Ă3]JDÜ(˫7ިxgyNPРs^t n O-?@ Kc'jXmX΀hnkh<E8w eDe7ڈ7kȂIN,"BJZYvVؔ'DVz؞x/G5S?/=1$/w_G0/o}s448IwE|1-;}GAk -5˓.)!&GbPÀ~G#pt3s0C+?LD4Ye>ڶrt3P:sոjq;6;TP,Ks' sM~\yOPnl<{ym _| 4 ![2>VqOܼX@џS[Y(*T!ijk>Wp`$  loڥwgK?nsg 6߷i]AZ-1ĤB.^;{g\b?2<܎#ۺrZL/:" 0GEnhvYEhnHv**寀/ltmw-jKΒՌ[3pDdo4B#|ܒFYQ0܏7[j,R9 M+i挞{IҢS9N$endstream endobj 301 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2128 >> stream xVyp_!kPU-$ B[ rC >%K>dٺڷ]ɗlKdIL1JN1ąh$mJ:i;<1 ݵ'Lf2'ڝyoO$LBD"̴̍RSǷob05;sXiL/,*hKur,BHD!Yv-dYEҐtDlB$?X T&AInO{c؂)Ӟ[ħ^01>J$I*>WCݮBN|'wvʮJGD[SQ6&ѡxƺފ)[<&C.#a-MjF `=ƀj@! :o) !zfGU*m{Hۊ."X|~D4|#L#7.[90΂?prL˭s Wy[6v;Jvr2v|VpC4>'d|ShUlr֐|.#ipVm #*TVnEX Bvr-AHd'n+,-e8э-+~&@1 P~`p6LOm!E踂[),T܏!p`n-[Vw *p{p`FR8_Buїߋ*l;$G QR7O\%)5 kPoQh˿9ЈՈ9O >_?앇~{nD5auRp.@f8:CvM[ ,WpRh?0nK 1F^^pun}T#F!f/L ;4U$eo!6´q{  d^U&H#>K^ҕbL0mܜ]\"7S%YhJ1ajm`טl]>l;)b΄hKy(/8 !wp8  s9t-;Ωe1tl~ܬW"wg-UK{O3)']p 7WdX &v0wAAS_FDC`ӈ.rxmcA'E8) [7\Qь,浲vlveelE%7w!-/ + E{*Y_,T]s$o<^9|JA̯v]5'喽u%d:We!hY>f#O28{0#ntG 3BSa?#@FMIG`by7f`zQ|#56cߞ> stream x\KFr}V^̶(;S55lj" FM;hY3ҿw<2*VUWw$sj2H0+r1+_)f7?:-7|f>~B̄j͝Mjn X{Dy&cwos%L^v^(q;*_r}z>|lKp^p,G)ZA ?h= Vy!n/oQnz "xk,+|W{zHmb3r? ;-EOQ!Ei_HMS hʶmd9P B|h?βb-+S$CQ~&fژawB IU =`cYB_n‰D9M}|w&Q`b=/ Mld[ll h.'C{2dU\0՞̒`УYj!h)G3Ϡ0b]L$ iI{g?a}}`<ݢ@Sr-y|N֣zJP-,:X@a. K D݃XkOSXʕzC鹙-7vVɢ]3y Fȥ^7B(K^ssWzx+ bEa8` C٧ ȡۢǂՄ0 {kkPrJ76S#UբkB YYSn{9۷^uj.}>b!#tcڴƄlU^7 U,um~;AO>qo-r?(No&5-kBCM4~LB0]US}%%?Zi'd ƾ^n *x-jUn3+jn)%A]_l$k;Ǜ> p]'LVWEh\TzA (}>• qxJmO, Ñ[통{&H.2PʪL(BVmi`f:H> 62tEL?t#qX[ 0ka 08)I;"i‘ُkS 6tHU^Ltsoaf ۺ6 [y2m41UH|`$}X"ןKc5 4*0YDlzBam[.䳅P2\Vp{Wsb]b匶(z.iꈬeuhb+i ؑ Vu2H# 11/607q8曻߂U9l~v<pek4߼ዴMBFvkW?~ 7RI!IQU1{[#-ٱFd ظZ"r\G166i8& DVdL|ID0?践.B9l85]c vܟ^O,UkG<-3 !Zq}Bh'wK~x/<>cXh]j6Cn: m_-S)TG| Fl!vIږ-z`ree2E"htϱD.|GS.<0b+q /[e , BT&cظ84$N,"63x03 Keuv[My(սڣݺ':;7/xFea=2/گ*p`(s r4ؠR#^))$Y%nbzWhͯ6;.yG!=)1e[CEv@؜ `L~ wEц`]٘ʈȾe#(}Y}-. v a])0!1x;OAiϙnl/E7E Ob8GU t4>0rp_Qy] T~A fpڶm_t*al*8zJF0nc1!LbIw#㸌 ޙ-?n)mFQr88LicҽDMm=p8WqDiǨ2ZIM- A^=vpVMa?SLA R3J==ODY .8Y"e 3e 0bAOՂҿjIA=bPlnzV($POX}\ 2evR~ay\ ٓdoLؐQd(0KNe2{(0cIepB/r^1F]iKkP!:3K$DߞUMK> s0`ئa:8Bhce1qoA l,Tn=O魺0ޢ ݆}U۔1AqS5viؽI_A<4#9ꗮ.`i !^fYnl8iBOmre\rCE) KR^I(KJ2̔Rƈ_w[hJq~xAHxD8q$dOf̑,L.{TUCX)%^`!?mIޗ:_<aOQۼ|)dWAϗȓUwӅD h8l#R;Y0=uK-'BY V ZDajTQ ~6l~U/1y.Nu4qu1]j;ш+nËd6@2-V)(oF*U+GȀ pZxZL`?x@2t>xEȮw!;GxOx\Nw_٫rR/:B?G@rd{-EfR+wZ,¾zmn 'w.;);VsF5ϞDyk{3GSΛ Y 2ketZ2,'\(^&k H? v\Hv_u, mi3$ 7*ţuYγĨaSv}nD!5'IR+5(ωbW$ZgM-N)<$;?LЀ(O?{i4Oh6cW/6ɺQuP6 QHwڙ=Q*3~\]r]Ib&*lqcѾ(N:xLYBg3j¾8gŐT]: @%<cGRra 1#%wBmwFC!#I+h>4f.ZKա'3#^i̗p7:+QٹsdŇ$_Wq#XIm _M5K[¸<Ԏ|7z~s}ѧ[-=[ӦYo2(X @67BB?#^h!~WS=3@rXDŽdLj(D;)d`~|q{'_cehe Č`jsbsޅ;$TuKEk=O~--<Hv_'{žz`hAvo`bPXޝ=Ӗ2Mge[tR52aGΝRH&ڜsw͢jn]y$HrpazhQSHPWӣ5O;I3%3jR6S[[mDN%0J:#*]CZEȹ t(~p]@">»SԇzakPUxQt:hc11,wmBL޴m3' zE*D$@Gɪ hPO Ƴ5=}˲[LJ]$ZsxI?yM+TPYjJbzWLPhIV`ӗ972k\;2- 0Ľl /jRKU>Ur1~i9vn"ɉx 2j> stream x=o0 wvH VD}3cv[..s[ߗ(x!ޖ'.m)rdm:"Ӹ[x?n( 1{vIS-7Cw`.{ە4[xKmmYDPӐohULsF ;2hH*jq^j@!VcPÄGf!<57&yi ْ0bl RיYL,ȋS{DY }x;+ƴxlåsentWpFt7A  &L&߲mub)`Pb6endstream endobj 304 0 obj << /BitsPerComponent 8 /ColorSpace 224 0 R /Filter /FlateDecode /Height 300 /Subtype /Image /Width 675 /Length 5837 >> stream x}:4Bjî)+mUBe[ '~Kx~ja <؎_;b-g(G\Ly>B|1gG fRs{Q:=GŬXBHKQ&,狕0S0Yϭk;oH!!ljR׃VVwzC-bG ʻD K0DljM`S$ʵ56ׇi~ZD A, %][Xђx\ ^4Bf)f\Gdž|M9-'H2IuFBHԧ$OqI !Q>2B>}e$)D}N %(HH$Nr?['A<.WSߢ8"&ZNr&7!֮D;$Av 7vDҫ;7U$46?l,џ%ߦQ~MDӗz5gՏU?E|U y]9+>̔Fμ?*Nj:TOyQk궪O I2)eGMaJQ!>iGUиi//eFG)Q]"SyG5̹u?JѼ/L<FBy|{,;GCf_doUt{JNAymwDQ2iK?Nvt`ʭ YA T*,%JEjH%*ސ"Տۓz3_g UVT$)?TߪIQTXh~~ҵ/Q7n$ZcWbWelk85:R;,_?R)e\'\ܙWi[4EMEbUE_zI5c$WMM 2: Ik5%֢#$zTEoqʡ ggrftew=/EWO%P~#_s﵏Db[pV6M%rIߙRPEm=M)Z+)SL@dmC;*E-^]?՘jtOQE kDؑAm>]!tzǜ&i8nǥ&ߐ@IV:L.Ui U[:y-v(cft87vaȕ f8%_fl{DH W}"l9?@H`5WՓ"qubՅ _$_ƧWf!1GZ)y17~*[ݶi^sYٵ\I2!"Xk6W;>g訸V3˕ĬH9+r3 Z@cn84 0J]F.S'J|"/舱빊Z \ԗ=Z`䰤OV!)6e( 7JYӟD Q te$J/ ;D`bOFTI'l #`l QB7b1 %J!ftjoI 4gӹ4t_+->%H]q]t9vVXJ":*l?QdFNJ? YO7-!BƽTmѩz5koarL[ ׷Z [=RW;[=7l0>z(OɊH z-]ʟFrw2Y6 [=+H8!$PHދrSH [=mJe+Ao!:-^ʆ֪k\b, iܢ6 3MX/ 9(I[=zGiH\Ԧc}Dj?=}׽-aR҄.U5$oZR9- AJΐrөK';r=Jt:l~x>p[f;)? oq8菏[1S3ڈÍNn&&r#̶ SO3al wpttQh=ՕئA随N=g=]) ZNk%؝N=ZDz}{A3iih"+Z^8D]t4D+fU494(:~ijS?ju5At9o<8rѣiXI6ju '&ea:(΍|t2^keO'хxLu):c^M+|^)^92ӝ(6򀟺E\t*SD[Y [+f6^>U-+Oy.nía/.[Y|:^d#7˒T@Nu~ӭFjXXFhpgm8GDnf:eyTƑLvlo~B;=N%IgGЃoۢii$PlE`0u[7RXŞF&qhJHZɤDo%:b^$;N@\&QNutӮFrwjZ'IR?~~}L{.66X {]Ku5yHD٫-i)kW]`Aף-:ob&F0GK]~%s%Y烼Cw+!݄[amt#>ĜF}̈́0D2z4AGMO̵KMe`-Ԕ[_Mۛ̓[D7W&l'~zf=">e1ݩo!޼JEGWK:{(ȽnCKq*α񼤇Vd.c9 kmrE@'.L1IlmSm&]FR!pVӀ/@u|Z3\ ʷv)q; N> /5jQtԲ9mٔvizuuٙIjt Fgnve+-pOHWDH<:4c`F(HBbbT$)KBu`1jX؄RNmofEK>-ڥi68Jc<ڷo\5MN@5]TZC :tpi@c51F}?0*h$&%ؑ[7!Visv4Vck G&3s*h<}J5^#ݑ^q`({'ɜzRHQ"D=#J>?qot;myjnv̷:Yxz k>2eLa@=-?Z4bvs,ֱW]3X3e1f+"R-: ?jէ!?LGhٜpY=*W=YQv!H$НI!7U!F@>E5g?] 4͢>*RGpjӷRԪecRB XN짽YufRe|ҎPu]Lz>NuMs1z_J4Bc7[(8Hrww1F~ģ Q{.;^2OĢz(RA߽-ӨC@uVN 1blL /9"SA"Sr e_HZ% ]aJPGT_stvӎ1zJTc)WO#Oksy DǐV.D>y'ARި.#uN:oښ T!&W8} 6rGSSiZ0o1-uaeyyyc 1IA&'!IIsq5HZW Ĥ/WZ.6)CRm/*ugnuJ#Lb(Ez?2f]VHr_jJCiSJA/UIյuݥLFa" Alt7 e0e^|l.Ϝao*maXCzYh,o0.Wp28(HH$Nܮ$ !dG$OqI !Q>2B>}e$)D}HR#i^.vJN}$y)k Ô^3i߈ͤl?bFU(ǂ`bK??-VRdGqp(VЕ!r; T="mB #ڭ2ĊzNm S,}wYY?5,V(WڄmE(r^6 4?m`(Ȼ,t~\"6VJo6KYNpiGYQjC< 4 |{>o3@:B_R8C?fksh_K!XUM49|i*Be$FϤCZC {!hisrY~U$*&Jɓ@ BJRU=.rRYȊ{35Z'JUI[aQKV?'eBx>DA$taiwDAIT\P<endstream endobj 305 0 obj << /Filter /FlateDecode /Length 5045 >> stream x;Kƙ:fF]냝rيh*{@xI!H@8[:Ϟ/J.j_no$]ֻw7_EEsfqp;"JIŪ27b~, B}B(ble~g\Uډ}|Z*_E85坱`Jx'PcxL&}hOծ9=uj)ZYo7DT;{ADyLϜJ;_pF |3|*'l~LFJ^ ZRQΉ]S=1x훻Mk}]G$t0;|[w}b'86Gݾ7 (% h/IJE#CA-xsc *G&DYRbǫbI2284Yиh=qu( /6MYȯnj&pضkeE>Anj ?,h#IՎ4e@Rh_EJxo?! jALbwc" ۛZMd #͍"9 ǎc-+`{r^@A:PV*2ȨpЉi3J86?(wR5jźafcW .S<{|:8-V'S-;F$!}_SrdBb!M.6 eqԸD/= ^_j]9$W)laܪ|(1x"DQHU*#&-X*R #_ྥlc|F{x WM"kzQsBM2! I&giVq`Dxt8&{7xUw'`*- gI朗s @62U2Z=0>b3:$RzjwPy[+X끟Ne*;~KL/N[G¶b3*j;#74W=A['ڛxDYy`L+-F5w-dnb$_~9p 4']SCSxz<(S=ȖNl&jŬx9*&B)Iz YCZRC Y׸9}uK[@!$Ex;ډksOR I./_|^$v̊T׿ig_DzJsf夳 U~)ԐzRe sZK")ٍYfʠXND'6u5*j o~uXzZ0@iDH`6lF)P?A>OR?(DCMLBZ 6E&YڒM͗.8Q$#f0K[0 ;i~?ۃױ<R2We*T05'r'P#hqPj:6={*ʔia 8( AJ#wAc Av7re ^Gp%7A낐D"1ƶqC 6+R(Ǟ{[NA㴷cU,k@^aR0}/-T!D d/phddK2WHi5Xѕ#ͦ)4қTT2*$tOv.*c4 CC 7݆pы-v•;mѱ닝/\x27&&@Rշ *𑷫h,u.Gvz(T@ k׷y,>Ctߌ?}oG(2Ȇ1/l=5[ la&qw;?#mxi*Qg<8 =O2U]k@ ɂ%Vmu=q&O~jYyG/(uuq$Eh^+eSǚX^_*!qiJ6 S^eh2T(85Y G`mw_)E RpΒz\]aTl2q̜@T=ZĵTRNMM,~_nFOlb4zqvzdD^h}z#mtĜ=M_8pn-K k ڞ1|VvQ*e]8_&4;w5gMil ֓@Kmd\AUNC؝O!H9Q\3x lq | ϵjQD#`Vg1> a0NO8 2fϹr@?~=(.EHԄ&NxŖ*o7ն/F[JTchjDR'ܒ+,LӔ`,R&~ʃ||gd&)E瘦X֣3VUwsi(懡+tp[S鈛yM!άc֕j*46pnKsQL6]t1KopX_<[vG^-Buz8oDcDʦ@MVF Uz?5;$"K/2ʇE뜸nj|U „P JP_{WPK=NU 2҅ڈ;!)5*9ŭ8PHV:i@$/ t  OP< y!~^m=Tv?G!n{O-ݡ' @{̞};e4-Άئkܵo9HmS^DaO 3(M영y<69ȕHN8j4CZGP.FƱj"x|xG }> Ԧݚ;AAlOD@OHSxjcQns<*&G+mu3$hܑڑY zMNkud#%*@2T 'NmZ[\47^L3 z0:wb`s+9l?(lxl n:42vD7)ʀo*2ʊ:Lw3J,-4AmjNL77T)lsIWU~l/:s!WD֫PY¬O.G勼ʉ1?- % jE@\KgΜƆI^éb)?)Y.C|=1_`r:*nmhpxvZi'[N.>eiUfGI\~&ꠊO5HGw`Ɋth.Ќ_򮍁m@M+BXZR)0@B,Wm$|eP.kfNh>1 ǰG0SST-"uPOFT{Mց!?)Ɛ@A>k$t2dMi!D6tِK,$M&&㟭RFl3R2XrƁksnGx?h:CN\JNOc2/ٓP ii7HǹbrO3j0[LF!@3t]2D0 e ։P(3 她Q@ sE[:}ItN2;2ٌZy(Gt쇜\-â|~8)0 ˜?]&r̶=l@xubz/hwK_gCӿU/&=)7NV6b owPq?'[} f%1I;'teL9LFGJxxm֤qcC݄p(WhwTMs RK~y%>aw@\>4Yd)Mހ$pd|?Ts6:u@9\K0/U@L|3> stream x,CMR10?  ^taMUB.J'o8A$##Lr9m )uҧrTAmefHzk1繡[7ԤmcașrSQrj\gdY[9F\Imz]d2fXELm@irW_:rm͋8',Ci^Zbµ9( )t=l؍gp\$l #$~ g>slϋ΋ #s>=qyo 7 endstream endobj 307 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 304 >> stream x%CMMI7M  kappa:%wmpjrpmgu0ؒпs}{qHGXbV=Qpr}wxz}. uݤ>{Dk,~}xdq@XpDl 7 O~endstream endobj 308 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 407 >> stream xsCMR7w,  6=0>wꮨ*ݒձȭˋprvznrua($'k=& ;_V^uYdv|۹yfeaQRapdshkxZ?ts~*~ssr)pt|(|trsw~]lM;|CC|||]Nw}Ƌ݋Ջԋך ˠjQUC4AA~Lw0Guc 7 Oendstream endobj 309 0 obj << /BitsPerComponent 8 /ColorSpace 251 0 R /Filter /FlateDecode /Height 450 /Subtype /Image /Width 675 /Length 19934 >> stream x\Wz (컢 F#M=#Rh% 1b") /(a$"ErHq%r3#ٓwg?w:%gF]{{yroUUUQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQќj}IQKc: ;Ѣ4ޠX,AHW!IoDn/0=GEEm%pN~,FL]h(X P[NoMo_CcV^^y1+5DSA4YW+R^~ž}g}]+v{Gʿ=$K^?;@"p< K 7X> l?#.N7(''[۳|=zGo+QD7/2'pcCm,#ڶ3pD=3%ֈG$9i> Uf`}VDMRvr(DY$:|.; $)]"$QHaU̙K8"ߘwo+5_o@*N7c*[DY muFd3AI]a G1ւ> 1|%oc(t30wRdHDU>^YIMшqYh)+EGC7r)p-ѓʷ!W+ ?cQ̙KE7icQm/6~@ {ӿ>Ko# [ߠ1Ϡ4 0ec:M~zxB?}E|zhȍW~γ=#c'h<ݾmv@ "jx =NM#{?6_~9.O>I)}m}!*'wO՟Me9eO:v nOmc?h!!>0 `O ٺfWU7OHcÓ$$TUE)pBzIa>ef id ?sT,U]U/RA*,h꼪-*2ܿmL_p[{ jTN; 7 ' }W߉L޿ߨ`ntu vR)ywag>j~NOׅJTrۑ4ѽUǽu 8um;Ch9Z?z'iOBhʔU|nu=ڿ'm"BP>g<@U7Qܸ0=~jjvʃ>r F@M秶F#fۄbFFC%GOz.Y"]NͨuFoq)X?<8nY"KF9;qF{[qBgO9֥ Ri}'8_gH*FDQu lFpk=;Z+>1-QrPA&>"Σzv]熨>BO`gO%AFQqݷ=g-uyQYd 8(F#~ԯ8Č2Sp|#'j *H.Fun3CO5F9w7n "'8"FkL}!Zw @@ 2ft@:t1 8hNNsD3F pɨΏuFI | =FwW(i_(pja RTʮ^gpBnbg5wqP^r 5Pe lFn5Ժ:ƣ}w>yKQ`o<: D {0[z⟯(dS2Gro70`՚*%5KNUFgP]}G ʟb-Y"gUCM=NFMp* u G{=?x"q)2z/(s_{$Q2 /<"yc.KFi wק~FAFe9 p]~|]XR(#1 7cFuŨ>k>Y]G]&Vs4^1@w0ʺy'=َ&V1Gcj8DXuҗ<頻z7h8 },H/崯m(!UK/kFDs~?P!¨_wP7n({HK~]~}1Ĉ6G~G5as}Lo( ҥKkl GN7D`QR}tQ1.o^ٿ1~7>Q|(;5 քя!;# fe=.]~yS]zR_KQLD;dW/yeCuؿ_<ڿ#/ :7Qg~θ뗡)\ k(!2D51<]yDRT]}m3 ڬ^0@@C$;@>=1p挓6Z;=5`tXq]1[dTB]=?ؾ1';e5%SF2V]D Qm(fg撎Ʋolӟ! fWq^cpT9_5Oew77죮> (3ϵY {6":)`FdyIvOsFZ5)c%)պh)s#26 QuϼoI r&`?CD5F Q)= 7Eu6OSQsPɨիL/8ps؞{OfK׈pT @%mr=m=ݾuYG8>)FA, lI% (^; F<rD]]=czႪ19JYA0BE A_ѴblDT1ʖ F5b(#uzB9 !zC19PQ-sM1j>jbplFњQvZW/׈q@k3dwP:pט2 Z]$nڌN>G0Sw41}?h%?hz 2F^ j@]u@A=/k عCgPC}0zN (G?145kD9MD ]4z8u$g;KIwLKszVcC]VgL%hWUQ՟?ͅQeB=nT|CFW(]4(=>5 &Ovw 23%'G G1*$tÕՃ;[59'O4zY D*F/1 QGke? D/,"G~Ic?q7F1=uQV‡.Yɓ'Y_Wo[pz(8Ŀ=RzSSŚQ͟ĨOc|1uG~QmF^vݓ} FW|8Fլ]`M5r14FqW/kƨSB1fLpT92Fy_U9'N5ƌѷaw >b0&&cLͽ剨#3F SQлz8zhgo)uW2`(eRA?G!_M65U(o De*!UŨ^cf70C"Z(y(Q1)MMQߌ颙FWbh;H1FGpw?B DM 0ZW?fd (믿.[1 w5>*|pbt%R3;cP7}_#y15@$1zV$F)D0D;LF-F =Qe}OEC15@btCU-PQaފQ)_>k#GPY/?;fWџQc2Iȼ u(g}O"Q,VaYc-@1 Ac51tŨľ?F>kDI 3^T`&i1zrv^G)S㜰L\oGb?c(%S&Jf&jܹojȾ+Fn:5fBtwC§y͘a@ͪ#FeWH5msIl-T+gbԮs8w0b{σ;bwŨ!&_W׬^&_vӃ>m(_rƨ8;F[({uf{&QcT 1c8Z%n(q>pF&dVҞf~ )MFEMQP!(tD_%cT_xa5cz7Q;g^35]F1ZwGE]}ˈQ@-G;xGȿ/FE9’Qnj? yc԰1qZ"FlMy]=9F_Z 6ZKx#kl.YQz`f_QcԲQx5Ĩ/ j4]9F/Fahi Uc o`~IGڛ}wڷbMkNITr}WcX7:IFzzOښdvk:;};FEb+Fm²1a_Qmő^5x r}"1<;$cS$5І+FE_z ،i\31Z&֠oXH:vII.btm 1 G(pоP'Qgң؈'1a wCM -qN?ڇn61F^62j *c{ 1!^c3FgjxM̌-,kDM-FfbF;ݻpsG?2kl̘oܣ X.BF2D7/c`ެ(`ߎQs?rӿiF2x9gbvWF[ŷn({'1ʡ)ܕ}o7BY"#Fe 1Ϙ`b͌Qq`N9B@1jĨwsjcqz1o'ic,MT̾bߘ}wv5cDfsz&ݺ'm(<7F2MFnEO1D/ӷb'f:] 쫛 O9dxjˡg1j7c4GLǿѭj#:FA!yFkDrȨqt}H>FԶo6~ѕFϮcI#Fz9J~>jфcgjp2D5ks@zs@CIh Ia?"Oc Ǵ^>D8FzF@gFq^1$EIw&{01DƩ>o+EUmO<Nz4USKQgvvH KD5(.;5x&X?ğ=[D'FZU:8F~HҥFC;g|Iˡ+@DkG&a39 *^dhӫMsCc`r3Qc"6, j^ 6ޚѦ#jhVa_L{!qV;\;~ĒU}yS9 ;ZM?,> u8Q#`0 DAk~#hrY2 ~=q1y@o4K/ em`ce.2}2M0}#͕~ƢޝךXp!?hb?ODC:F;*:vڪ?uѽ'<1\Mℵ'|1)xN.CB r"5hvF ;K1302L0"#Do07oLk#0GS(8XdC }WƖW!DWU59h:FϩsǛ02b(Pd{7ί0 /s(bɊf_ ":ՑbvM`@?eDv{vщ~ggf6|\s})d_dƨo}Qr dF,>D[ɉUoEzL:-ۓ!!H~04H]]{òUس]du )-=1=9 @;~ÓP0 B5ڨMrf4Mobe? D75Վt5 m| fL}AP}5^U99o_ѫ:!f? Dkb=m3K;EL/f̡8=CM,g `j>mR7kp#rXrӀ:La~Vsnm?D+6j?ѕmn/y[lD.qۧk? Dϙ:$s2"Z=!%oz2F\nJ~b]{OUsAmp7.w9E֘MFˎʶK证qM,>~Q?`}|yoski'dk\m-Ccmߙygzd!J@z粙ŭk2F.{1ZoTv-il[=7h"wC4/=kj6e3%-Xޥ;W8&kL_$v6C +RM,Ѿ<1D j]x'$ulǵ0Yo-R2as#㺿 { گ`w}*~{~X}H~f M庞%hÕts!q%X@K"#%Yv70>}~n&8vAj?n*]⼹; gMl mKu@}SD.LBͧzJz?2kx嶖#W=@Ϛ̹~~O@ 6=Dʳp1 7Xo7h_K)OnfT*FmWR;qDac mT[|î-OUtAX8IC޳ȿx#eĆTWrDآ=`St{M:"6Y@ V:VџUv|-ժ۝-[FAKv'=-vdțf2icUNMi) GbR!qw`:?Wk6m]1"e5 Ʒ})OjgQDT;zW#26qŐ9d1mVdbRCv4&S}؏"9]o@j][Lc'],Go]|>2P^aec?ﲷIXR(\4Fg߅ :wOGh5;%=l w-Y+Sfzu kVXF? qN["67r6'?,ei'h9Ӟ%ښ5=ЮjfxR!AɧdC+C*y# [tAz 2jGDR ̈5`'Ԙu_@QTx%YunDW؀aj vb7Yz =wT/=i*#DsQ5]rElzEFA)2v2+j[~k5{sh5XKI׻Pٕ/3MD+G\aNGj˧Ծ@􄩬݆[_g8wh, d,Λfl>- Z*ehQ*ehQm Z E Z EK zTA(D2WA(sMѢ e_DUA(sD2 чߚҎӈ:u/g!}=}兡0F@?T*.!J\qzLD}|}?MǓ>yDt_]m@Z+OgsWֈt|W[p*F?!?ϠD$9=F Ge^6Ά?D1mz.{>KS`Mo|}T0zxݽ "Vԓd47K(Vb]`'xxȂi.} rf{iʹlh&Ycxs˛zΪ_SwOlo>mgBHѣQ}DSYg=I%Ad%G|I0!7lNh=(qH]YW^ZOTRsF=3U= 36za 4~GDoF`/^lׁ9~3йgl1u^3E=P|ӦpHh:I hѢ }nhQ1U-DѢU-\Ѣ%=l Z E Z EK zTA(D2Wuv'HםQ]hMwRTFLTm/`U]> Z^QDP-..JQDw+e,Z43 D_6,VeF_4#m'EEmT-\ѢU-\їLD2QA(sD2WA(s DLs>5?לVy׾?'h<5؟oDq%:x;;Yd>/}T6OIc3r Q?_*FgRGoh8W?e?cD}|r:Z/p(uYghw3r/ ~zD(bl|SF44=Qژѡnj[tܽ{7)w@OPQO~Z3#QNgޓ QTYJl;@RU{,FU~% @ٿnj6ܾh\5h'p&<eS&|!:{ɳHwkFyBf_NjQzzaT^b_ }SSF~=Sd9TuF | 4%AJ (F꘣ OGqaPҞb.76z_Q GR/qBm\(سz"]}캊W/ USM4eNp.]Q9$l^Z, UPuUIgO]efmhQq *t /(.kFYv(\^1zMz;"}g#׿d_) \g]*ٿk؇>hpԭdDgj@DBZϰ?ݸqs׌KxxN"r }u7 }7fW[OAv&E-vj5L_oe~$bT(R,1b;}%ld I=;T&ط~ͨ-Qþ6/2/}Vi)qD;Xpp"bTΘ3 ΓQ~=m Fk87:Y=9V]ru90˾l@nǕ(z'c?`3zJQm"D]5neވڽK uI "p|6?qLFtpi_4b_kb>^8;{C#:j**ܿIJNbΜ9[]̾6G f2*. T3 ƌIԘTY_B;al3 ĿӾ n_}Q`϶(U߈&)QkA+nzWK_J\Z'⫶YUcr~D^CML_?k)QO/}T:u,ť>I$\pf.=Z=}*F]f吨m_*iO>kl1(FgZ%'>@b]n3X]}=\ (Gh~B%M9˼VW#)6+fEXMN&F (φ@ )F(g8ax቗4aT(zܪU]TcQG)a?C b`A%sQB2*=hb󍨿 P~ᔨzMPg{V|)N'lb>\4fL fe?QwW/yA?aSd0znJ'Cݪ?C~@Ps/)3"FMluu<@/z&,uMbΨfYF<haUsڿ1ڮ储[FWT(E=ĉje;CG9D+|˨u.k /hM̲/ VXވfQ v]c;ISJz!z2OOQS; QvW85&!Y(1Sig\-JhȈĬ;[ʮ^`G~fqhO꯱!F臎c;?=w¨ƃQNyׯ1gikrGb=  Ua:sY7tc3z}-܀4r1pnyQl"/7=p~v\Sdxm+FǎXI&5bptpTgt8D&FQtQ@ـ㮾l> TU]=;AC01hueP͸{tHˡIQ}ezeX}wL僨8qQI4afO(5ٸ1 GeUob2FѤ%ŦcKD`}A֘X1 2(j\'m1k'ĸ}+FAM@w51Gl_Dus1r^uۗ2juG5.p #GDpMX5cTqMbT Pv8F而'FEgo6.G#fؔW1*:{yct̾hD458='1J%ׅ F@-`(qq#5hJQf_5~V.N:FpB1.FۿxpjĨ\x"UE;FC3u8jl KZw7CgtVnWv^;c∾eWZԩD =V3 g\~.G쮾!"#:2jm0_ƨþQ Ql܀g቗ɎQ}T;XK;$ ;bT1:jPWXQþ?F}W7(E)Lvu("dx#uZUj\e9ˇ4FpGeiwZ}1 /ΨEghrGQPE0F56ݯoܕVQ۸;F%fTMLa̾H5:+DWrtbTQFh5k)ʨ 1˨z%/}w71N˾+F}w7k5oG#Qc^ʮf!\cb1 k1s(5nVq7`%yR"@Sb^z qPk_;z0|dfz1[@a *b%h4F_VRFUc5&w q^1^F;R ,Fy( Chо&Ʈ.uz;d! c_05!jQ8p(0)?dQCg T~V&DQ}8:B1DTwmC538AA?gƷLR%Ep0jXRU4s9c?Ρ,ш}p7ml.MQ9JLs?Zqu=nшPþZ;D!9FaQk8:$/cT+Yb!l_㦦6N1zd$ Fլ!J!k=(obkk/wWn&QZW߿y=fk!TR_ibgy#b^? }8FuƬZ8FᘞC5v0:61PM :gӃp@U]}hXQsh'OUv[̾sBXkc* Dc9.pv}yuCyi56ctptkȾ;F'l#SD(3:|CuQEܾ%x&e}rQxcDi~z};FAHE4.WWxH9X>X} luw%Q}TMo(d uwf o=M{f>Z*+F?t搜rL>3F- }CfOO~UX7cY3;z _aĨ>jƈ/Nx|3@=t=ʆF3ȡk -1굿g"jJ9}4Z(<=.gEhjj%Sg hd7i/Nxg5=F!~rA4"={&Q{>υkO(39YN7EǨf5ዝ4Qm0ew!xϛd/c,$b._ nG1wTzbhƈ)q(U3Uj 5h~׃0[&fڷF* =wvrM`R1ZϘ'J`hfc쩪Mo=_&[KX-Fʰ}I;FFh#1:il)zVlzK!DOb49fe۵b4mֱ&}Q/abzc4^Ұ{QU bF톄{c|эj'fdždwU O)gIKx񾢚Xl]7ǃM,a D)kd+-*~)^(QY NUC 8}#&\CM, 0'<9(}ڕ+hNGM{61J) ;@:y5n};/h-2orZhbM,m[ Sn/]c;+*/$8&|[kl<1{6, js_WM,kb?ѭmEYf`_vpXmpEik%(jM/禐Cڋ`xk!mFkǽ1L "&tqDۡ:mwOkF6آȒa xICZ3?3)Et-9oIѧ>V6RQ/cL=*lbE/Fc0&:j18S(Ĕ6M~HVzjި)2%^{q*fEafjo5(F{E>Խ[gÛ`X\SO Eѝ%ަ/ ;ZW&mj|~53ݺB;(Dw(OWuD]{k}[v+ŪIBCnS)دUB3 ٶ@.\1:x6G} :^-tj{lw>ެһml}\u*h?a0 փ,/WCTƨwVE B ծ$Xƨo] 6/ s@އAw`ͩԏ+]aa*;KA=Fw̐]^LӍ0D+3Q*6~0-'B}?15Վt5 ѧٽD= Z8^U.5i]G]`@gw^I=6w3`,[IitƮ)PcT? ,gvl>T|֬ED\/l2DF,k>L~&Vl:IhBXI_XJ̡QoM,ejj% ʦ ko7.yJh^X}[~ ok2 ;Sw2-;ZڥQE>Xn?#Dw%{چ$*}ZW[PX+׵EčA^G Q8$4nzC,_{D{j}kEK{Ǐz`'4ضznbkRq9A3y!JZ1Z¿ҏЃ]z#l}b߄{id!{~J_obG}1T9;#SAZ1^C(ްqwaNxb)9H 㺿p/p _-FmbI}bx,~f M0c~@j칔A|VE %_5>$ Lsn:ا?{㵴%{ )/z/?J`87ƖYl_Hmi?GDxF2xFrzJz?2kx嶖=IKY9ׯog_%G 'Q2m6[5Y⾖"s}>R|Ľ*0]jg?CDG&ݮ5#zfݗHY!EZ"r)&6گs~o/Yєaʚz !hF=~R[F'=-vxțx =d)41 DY#Z"5$T{Ķ^bBk@o ~o OTg#JW/ȼ`B2y;jL փC3C(FӇ/|t1 (Wkr} p妷wlnc?lX>~ƈ%^fu7j=#xFw&4S=]{|]9]"pޒ2/@jV/EZY~Ѕi -{V-^˳O2VsGtwȜiKumοuhW53-)vF9A4gT۶^>MlTVn-:N] 3;4csh2uM3?}U-\ѿc Z E Z EK MD2QA(sD2WA(sD2@o*e8=|:vAѢ":hQ*>O^\TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTԿ?•endstream endobj 310 0 obj << /BitsPerComponent 8 /ColorSpace 252 0 R /Filter /FlateDecode /Height 450 /Subtype /Image /Width 675 /Length 15868 >> stream x%z3 Îdee K!QvEJvDs}Cs&6pazyzꥻzO}eo^O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$%!NJj+ӕMD Ѥ!6N￧}6pMپ: с#-9Hw{U#B-$P~K?|.=%"J^ { K;$ӧ-@_Oy_yI>|[^>=_!!N8WW|oC^?'n E=+^_ŗ^$5"Ddu <{~OH,-MwOĐf9|d8Gd4}{3iZ!h7D1z$uS$!{'|J_˦; O</o?yEJABW)!aQ(u5 *4whHE pBȢLYtʲ(XlQqZbs`%77Lx ٛeDHUt_sۯ15!##/u \?wmnd_*g .(~++~GA~WuN:NXf`]KGFB}l "걿3H}QR$#MALw}H FQnU sZץkHD(<82ُ .p+8]Ћ@g=5$Zb@#9π0ړZGA}6 bi/^o'ُ! Ufݗ~.ިT;f@tcHk`A גz* }Wln ā`_瘰zwF]G(-VL.T^+I?(Nz!ԻXcmrDPz.;겕+s=3o߈^ϲYv%-%Mlv~ 6̮׳5r@B -.QZ: Sx*>jo-l9nЂaGhf@T[#!W74ǀ(L,j)ji4P %Ds GGe,BV֧f#^QM@AiH\=59Ð|eF]J +h˂m0B.}}zzjXP/ʿhyY}CԐF<-]ѯxGǪ C Z-$YCQ{^J-w-tDpi4FQBlĶ[vY$VDMiZ`|fmy~C4SzK(e%i1l9#Zy?`DԙƁ Jz0ھQ ~qDI刞*9٦"ݧ~OOal~\.^V ѯ8$~4g4( wluM /TȇZ(7eLr%#9(Eԩ95?{@QeDBy%-i)%FH܇ڡitG-#*14:it2yr9@#5t?iv9{yJ[7ٮ^z` z JsFo3jç\BI(ϣ;v[x (m@1 >vA(Q[3ͥ"Z2_ӊdc(?QRaԩg#O @C3Qh(VmwAToA%82$3~%BK|ʈ~o2 =H}#t!9WJo (LXM! QG }R =܋#iUm ik|hQ%K(zZyl;.Q  Gu=My2jH=(*=K n { h?! _~%)K;c-&D4" QF%FEni8ouŀяik{tLۿ[@ Dre56,A榄F8F#D(фQcxUJh%Fw1D}(2*%MoJ ' _4(lȌ6 /CӨiQѓP5.=8p6#QxIISWJ G"y2}O&э m!'Eh !:ݏT}葖Dッp5$4z@[+r?Q7qj(Ѷ$OgS4*#"z# FTj"ZxUQyQ:1D(9 z$RF?;,hQ;P J́{}0 Dô[!DQb9r hQdTATM.(<<5ӛRA$E4h xEO!!z$BMSЀPCk¹E(h%Oz"-@cFC ȨCQ^(IT;8)CH(3DYQs'TV7m(>{KQJ:S=QžYjz@3*!{$Kc9haUAaFO%DAjJy5rEZQqsطDˈJAKIoUɤ@2 3ZNG D4*!Jx"#YxoRhyEO0á|j֨,ˑD4Fy-?$$6qZWewyԀlߞF{ʌұQ!'F+]Q >1 J5a(5ܽ*`DXAnߚF쑸$"E3_m!AJ(>0s ?zK9jB<$!)7EQ~Jror,:aQ细-DޙUL-riUWsDY"OY1"q~IQ_@[#GT„(+Ř!!VFDhپܘ=`z_@)fD(e3^DKGԗ}Ǘ +;Lg919_үY5! GeDcCZ5q/˽vDӨ//A]|J`MzTkeqQmJK-+Ҩ{d̈>5ej5پ!.R OPhѵQ}ݔ'?Ie_ˢn Dw>W JMQFS!T-h@$iT ,*E) Hfciԫ@kk|>Ct-Q_maQӃ1{Ylm^~eO=0Fmgogҏ/C3<{[=_wu\tk QԜ~CevҾ0D)3, )6?R!ō^ݻwYyzGf!\btD76/J1"`ûM֘Ly o6u]6|h%3ZZf.KC ѻE~n:6"~F Cٿe%m#ne8t@t [͵K+'7{i*.5H'Qݾe!DKΨWG-@ySMFoy/;7b"VaZʈrFo&+ٳ8s}#)ICwU>/YqUhݤiTOK])ChkhOnv-yN/Oxˉ볩f F%л}1-Pc eFkW-_ڀhi8Y2kq?[Yw]p.5=nco`?98g3:.Dk|i]+{⟴S4HV؏QqR__`7omAaٗ$q,Nظ2QzK]Fsu{ٙ}㊘F o3ըY ibLQkfQ Ҫ,$ _S ؗ@fT_yx.Ui kk䯜fy#\|5Zd()(yrnDA4cKXK+=kp}D;Ua^(_FeI7!5l=o*O*au ۦMsRK*#ʃ̓%yi7Sمucn RQ&J3q" W"·/ y,M>׈h%ϝϻKZ6H~};[*} XW68DAeV FD#Hk{#[U+Ŗ%^ml!#n-i}VEYy`ΥW'J PmCr謘eRN}쇄qk:% vyL]˴4TbQZ n:wD5j}/ӟ;] PnEnH ?ZWkpPg>7fhEg-g>~a|؏Qhwz#<"(M%KjJh$?c@al)V0QSқ w)Ð\FUu'.3oU]\cӼnȂ!zM/2c}r B~S ُQjdDhU㣑ɧ Pч.~~u uSUJ帎ѷK׿@5zPݥE;~qﱥ* dTҡt,|[~+&Υ_E\Z#A4&=tmZAs|7GOHf\KAKmdrfu]xuͰ~iqSP~հ~nNƘvyeW5C=W<̚؏ћ|Kr[h,6ℴluH63E gҮ]հa nyд yg~O1' Ev#Ck,\" i6rL3:@glg8ůn}|c~^e wz{u1^gkӆ5=ˀٻqrWab 0~-Lj(L݅JQMUԔxW`54'm~͕>c UڧLAs~~VQѷ#@Gڵ,M{"-6ԄhfT2=D~7YEw}?5 Ӌ/T".)R8g>S)R]gs.#D,~u&: lfWƦ4@M8t` *mE) FkY6[l饍fjnfH_#=bNJhFRQ;q`uΎUxgŸd4VL]To1G(^~QX6ۥa:-O+186!sl,jzP} GS .l\&c((1lJM1Qj; :7]usi8g8DFpxdI؏QԺaMx~q? /AbP⹑ptqAs`?vDDLkq(9)j0}05D_;9<־xV:h@}wkNR3}'3ïgnk%!|ΌGf Dv}r0ѷO ї<5,4ȿ%"I;/oav!Ȼ'o}BjD_z _{XttKĀ=|I2zLb^Ojx]|YTi13)~DYQ'D/3{Fg$Y#0|rw1hZ_@QRc1هW^."Qv_5=>C9Gt٤Ȣėoa?_a[{|fs Sd@)œ|LV|Y3DU3 % '<"ʖQՊ(s>Q9e#@a?fhXIIX :PEϽj-szPHUDǖ-]>vDim ӷht_݇Gc=y˴]Ӈv H,,XK їf?cPhh%D;*4ICg(C]iJsRTJ&EhRJ&EhRJ&E.IQ)!I+!I+!hRTJ&EhRJ&EhRS] ѤM\ ѤȕM\ ѤȕM\wu%DR H&uUw.!iUC݋HZqDw-ú-σC5ݥE⻭^[DO{GcI@+ZA AB 76n1 (hr`@˾1oD{nfyZWa~~ W.EonI&~{ߨb? E@F[I6 #]" nFjNɐeuXs5I!'D}y0 >weQkK|tayօf\n`Fz6;1-f KG=(` t\o?ݮ*""Q]{=ybkIEN57X)v$ 3QHoEEߺ\ͮzG~Rב${"o97]ӟ*ٷރUAy} ?F14&U'DiV bWR%n<:9qߊ(1uGm?x9fܾ_ŏhرH*=]}"x4e1 M65,ˉuNFd}T n%^*Q {߿ODLMVbA#T G! 4K+Th%*n`qDWZU]ŞuZ1VS&Pno^[^U z}ߣg1A/O"L¾~v ȀhV]meYMyۍ91>He3zD=FR QR39)}b4 #* K *9=e!>sѣ'QnQ*'̷fY9jɱ82L =ȷO(F2]*y]-(|ۇFS > _8JKEENYMOFHMjS|+v.(QfX:'tk@ `N4#?m;^ '=-=drFY' TԢJD=oTk̝rD!V#3bk{UD?b0DA } RBFm(~QFE92iQ4GaQzzBej !*L Q8|$6$RO; >H4 Q6ǯx|%%^!0FDݖ!mPATO=) e)0#,iDAGnj!zDc|Ȓ(I]QDOeD}>Ҁ%F} Fshv%D=  TUDDlĒ(gT/w%QeIMET2"tM0SD'Qƨ_ rc((gUfEI3*n46T2c|*?4DX.G027!*dPQa ݾ>k/O,TF4g>'/F*xirPb,MrE)GqrC)E NσPFm2"-77邿+DbLlyt R 7(haU 3ڬ+D"Ƨ'13Q(b>X iXDe*4BS+?*RD͈uD0JxsS"d; =2F}QZ W\eL@TPDj C(q)FOԌ<n¸(]Mb ytDw A6^D<6D'JEix+Aha Q}Гh +L'D}oBF 1Y z DO"ʭ:oc GT?ø}+&r"Fl1OQI* ڄ~ c^? 75{*f.мo]gEI舒>fDA;ky!hDۢ(1@(nk@b)#ZaOJcN ykΤJUM*zs'rSTBt"b̃,]Rƨr_QfQ6$Q Ң'M*qDIt%=u:1OI,Z.U-(^Ȣ{QK"e*+z6nCS(ITblQMzlS*N Q96#3jndHD`8Zusl͈$GT+>!]`bC4!J{:w*Nēw77M !.|5#*W 7+5cE]#ǜ\ z>80IH);~hw$F؏]q!.5CԐiUPqܿ[mqz?*j!JeU⫿.]B}\4~LzۖPo_AQB@1 Ͳ3lҥmEk&~޴(9oﱟt%Ț}sDsW])Fk]~U[|z"4iwo":; Mrپ%: ]KG1{? JZ.HN33cř :cp}T HT#7\e_/g}3y_; f bS!];7ze-ֺ*.,%=|%zq!z. vīϑDjqf]PMt BʍqEy2^ǩǾhUŇ\z}u"y+'ЈařBtfLB}LaX˴,q]M NEHj+唖j\VO]&{EKqv~ gGhn Qh=@6 (R CZ)*R)t5eAVW.ֱ~l^Hr?$M/C5"5zbp\PC"=k}eoΑ`m_@HzObM)ޮx[tXDRԼYTvW VH}y-gttv58t8Mm/qXjN.g髖kv@ @$ u42nt?G62_qsB i !OҚ+ FUts9Ƥ==74t|>S,vEdp?9A  ƣ-!.sy/ P o3Z7(܂=j]l-Y53\/0//=bq+DIWiJtj(C א-׳qrc"ٕ 5X4 9Os,7W bHw;Y np%{ مI ʵP:熹mZ^J 0o >3Ha@Wzok~v%A^@u Z 1{wm|[uO>m]ӳ Hٻ: [\0>u܊ Q9zi4)1+O`rҐ,>=` z^Ņ(aSIM[.Zl1_ng-6L&+*D%S[E>js.KaR1)udÖd***Dqn}@hr/^!D^V x؞V{+.DQ|FKk~8fk-Uuq kS,N546WHGiCvk:g}*HBfex6BE(NޥZ` I=s/O+ү9lRl,~g%%ڧ(ѱ=qq|JWCs=i|EM%lGK%-,4; : ]usi8x"]c+yHEF6}Yq+~;jT'_,˃Š|ŭHptqxEŋHi\ cq?t#iL;ťM wB9rcRWʎt:ގ 8T;kOD-ҡzݱ2Qf@xQћz+@W3N**z#8ko6pFt~I /%S[tNW9mt~I ZtLm:~f& Eh6r>SizgS}71ȯaNEޢ/| t u7$iyFVD1v%iub:WM:yFqƗ9c77l$;I+ZD*Wbj .*b2ie@Av{ɢ ѤU^GL}Ұrɢ4MNI 4tI+!I+!#?(׃endstream endobj 311 0 obj << /Type /XRef /Length 245 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 312 /ID [] >> stream xcb&F~0 $8J8? u(%(M #Ϡ~ 0 \_>F*RTҀ<2AH] RH2ܵ dD_z@$$ VֻD=" ,d9` m DN @*߂] 6SlX}7T9 i] "6H RXؖ4i"`k @~gB+ endstream endobj startxref 283461 %%EOF gstat/inst/doc/prs.pdf0000644000176200001440000020207615162303121014416 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4277 /Filter /FlateDecode /N 79 /First 650 >> stream x[[s8~_ܚJ۲3G'[yP$,yD*$E$n(K7A3DQDؘh%hܵ 1PUa(#L*K4a0SCmk…LCl1Jw UP(؈$RF`*ȇ ! 7D޷0Dl&m)4Έй8+#(t.QЉPbַJ 1Z)S^TDr GAD @ *`RCBjF$ .:0%C$PRYJ㼐4\A hm,@B,vвZDSLA4BbN , !FZaZв1`Fg5I&$5f]1Cm30 p@""вf94gh_%YOf|\H!YLt l4'hEX]69[]eɦegnWA-yuz+PJ&p'8 sNdPOJYw^O.k5Z%7PGr5\0}]4^]&YMWCP>`Pgd&/|`rȁ)tZʺ@@rSiOE "UX,kƸZVO:q .,nfp <%К<I D$5\dt}:Z 9|u6>exzp9IE&Ht$\ ?;ZӪ+A˷+drpmhCUHQV78^Ekd\.$&]dD&@Yl6mb @ w u?^Gzpg*c'ln76ws 5Nut ucノ㎣X'&P"JX -Iw,h@ѻ;(~ҁO7ɕpnLȇX k1)KPgǔT5t>qiu[DJPi E"־ށLfiJ4>Gh/?fNn/p6YO FtZצ-'i1o:Zo*GG'g+H(e&n$$v Foadۄa!-zq쭗@= " ӍܖAHM0_D⺇&PM`'OCߞ֦R`qX6Zt,R~BPd8h 2(yQ޶bBX^i=9 % J; ]nDN_uN`KiЁF@_@'`NH^Cأ09z ;fR6cʸ m0CV׮ڙ-fӿm}š'j ||-[D [栍 Gb&vtcDhㅖR~J*x~]Qa2mX0 K]k4R</^_zT^r K²HS! 7֭ ϸ:wH .ǸW\ jNoMb\ƠgRI{Ot{uz\2/*y12\EnUqu\y0/=<oD^e/Bap+6d+O׃M^Vҽ+k̓"}Zt%_U{']K}b%}/$-J-*S/]^O9:;;eUFp%-pq`T_ckmn_AǢוtlyr9&Yd0Ve|e,NQwI5bm+D5G_A##A2+aP]haPkEq÷d^ e:u|9u ;mV)>}6K}(s$:=AWpEOҧMcwuvF}24I;-zbڵ"XHWHyo!="yvz4h\>@|3Wdy5W.Ӆ-/=mAcu(]!z1KVtJvEnk_ U*AdB!fW_);ր?Xs6}?w1mNh[9oQ}6J\f5{|<|{ Y{ݧBZ{ \zof_+E0w6d|rQS+K$w%Ă->1 ejD?Ih?^ 1FTj;nDM.VntT^e>f>CʼeT=r&{Yd19MitgIoZr>Ьv[ܳ[3IU3VgMڹ|͜)gESF@XzԸF?hxr0#G j *~y :4̃,IEx6 !iPߎ.o}Pa07jF\Y&btu UpgL.Pj\xVH$p^ xa]{$GB.$9>w Qk;5}b9VC xiXx}>\r10! -@a򬾝[u;H?ί?뭸u=qˁV=a9hI9^O#&mǩN:$Oda{tLkO0̏Ű'pջᇏɪ( FcdJo\sċ́$_Zo.nf/D蹇Ho[S5穳pW6 !Gy3GazsLqjvroS OJ:_77n|@gjNn)<}]zF!" us^l"D#i]?s NZݮ'-іendstream endobj 81 0 obj << /Subtype /XML /Type /Metadata /Length 1388 >> stream GPL Ghostscript 10.02.1 2026-03-29T22:06:41+02:00 2026-03-29T22:06:41+02:00 LaTeX with hyperref endstream endobj 82 0 obj << /Filter /FlateDecode /Length 3194 >> stream xZێ<&~ dE2ְ+F3]sYs8Z9?_ͩ&VcvUcKQp3^\~Z_ms J)..fi(3V2r;]Tܲ|Kڲzg%p5w÷C?F zF sic%-lIB{)dci# Xc3{Gbi {s'G>RP}MVsYlfʒQf3}SfR)zK]މh=8ClÓ|~lwO]jފ[R) ZxaX}u]/1~45_.{:we2xO&vqXKm (rnmmabg2whx绚KWri`е5grdg}[o 5[&:9۾m?S?+u..B餧] կb VjZ`!( 'XlwVR^2 Q)_l,alTHE~dxC(4bd9HSRJvg ^S]*mBX@R/X`Ows +'Xĵ*M}ʴi8|Y~SNg\ Yi)J2kR1 @ ծjjd 8ʲEE" ]|&z%%z,Vs8vb:MJdUlL^λp[W`KՕC0X  =!8*c*:UH3\x1\}ֆr NzXm$D <.2FÖ|q@|e ,U&D#nf/ }=2)3H.hP ֠ASEx$^TW%S 2$¦=p|1(ڡFI>Lwqȯ,M`WKs`tLA>GKd Hijk>$\p6O؅=b l>\)(N^EĸCÈ@6# B?ܾVPa3wjdE( m4I*sF O'wzFI įQ0石w&.&ݩl_a%X|SNFI9d42OF,ُѯ_>?f!1+AwIfD~GPz;^{RSV(0Kߥ?gQT">/~ 1Yq'}<H=)-``7x7tB3DOқ %]C<+>+v<O~8jn#')v}h'Au.c3tC6-Hxb{{lm^cƌQYvnlY7w! y&3_6IHxa[ t,pj'rXpH|UӍwh) E]7}'wԥYsAXCCrw$9So7QS>kJ5ml~Ztn i5|v'eھu!nUa?:_r'H>Mgn *urz N˶4Ra&]X2bOs<3/.AަBw!;7szgLʺF9&"XwrFԛ6ؼ~aA Zc $EN[{gaj(P̊\Gnɫv>tMԻ*Or{S-Vt?2]ֻ)Ҁevwz-Ձe΍8Y.׋?^>ϏB|Ă|{ iC$~ʙq't0nb)IkΌ+}wcfj*-c(CWZ籆Jz#poWͲerXmOlɇvWlWsřGoA TƳ/E355Mq2E쬩)DQQygKgw Ɵ[{I2iE'm-rrsM[c{,tF.y(ކf%$OϪuMո[c^7PzI$=$-çv̳JBIAI7a$ hyp5/ʚ샫ʌbz>ȸt'=(i{|}@| {JrN&yxǃwKYjm`W9R뛪i^'+x9{80AJ~. !AKt @? }r@&KLM$];fA^ᙋt" 3x!\Nn:DNE F?6+&&U .+fO|d,}7\t*}7睞f<Γ/\ykEWnȳrIT:m;zyӶ=+(u%x F'+Wendstream endobj 83 0 obj << /Filter /FlateDecode /Length 1746 >> stream xXK7 7[5Z!@ZHd-=ڳ)،䷗48h+Iv*8L&o'Nf|>yz4`o'iLA .Ld77jYbfBXv \,8h7̿&I ,PZ(M"YI^9i=UXLr!U~ze`3å3)@hي뛦l>\u+4*.vfYoCfuA{NP5ų~߾=[&hb!Hv[wt;z9tN@6r ]̤GϪE}! l!Qz[0XmU)6Áfr@v$]M]qpW ˚ n<ÎDd\s]K'bؿY= ۂv(c iyְ*}mvAnP:acC'XJ`M:& ^#<˂bݪ)7(@$sh,hYC4f*xY|8Ws/?w7鈹k&.$7 FFFF9  ji_s]k7]}/\dCADÃU 0&i{dБbf)ОcIX`2O%S˺w(}xW5|hVuBI ?Xen> fseuM&Pq'+xRk'-)'U0 akcUУ&drj">c$ RRe38 JVzу(@sGTNPqA{0Z?n5jD%$p=')##!?*duy)-Y//}oW9XaCNg: V hfjEvثb'GgaL,Ih?P.Z$&RfY Bʶ 9"vdfMZg%"\wթŕ~jՔRl[UR:v%)!HvP,l'|`#W8,L\&-+X ̟?ChISP ԆIo cIY`^qp>+cP - X=N,s65\bF۝&$5j^"iTDt ΣF\C(͈nVb g2-;cBƵcc-u:y9ƾWǦ;؋u~h>*WcJL[B|=b#i8Qn;@[2r#_!vOf#vԙ es3`N?'vC}?_y: qx7y$ݑbw 6H> stream xVmo6ߐB1Tf|Hˆ͂)9B-RJH:VVus/gi"fn&fsU>5M(w%K̺E?;Sz. Y\vQ-H-B\qaWVpzmRV ؅c k)Ԓy&Bҗ TH=I57]Eeી:xs}a~q vaz{aC.z&pi:/]7jMB?5LAMEg_Ct}>7R?\;rYVᬙs.]^G}rHS7[ U[ -^B_}枖[6[w#C(skp"Ja]gzEv>IMazoCALB8JJJ,ʣtZwx*߅E$_Am V0%7Ӂ)|4\x5]w )\/#t~}Qi\t A`Ѓ>)А H%(!w`t7"#EI''QD&fwls(ǭ/ IvCepWBlOzٗl0Ϻ<&+!Sr&/wx endstream endobj 85 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1875 >> stream x{PSo -4+νvq;UvwDZE`0!! yMĄ@xGD|.v}[ݝvqV;댽tۿzΝ犨9H$~{ƛ+jg6%CRZ⅋WkAyEeUu:xgP, lNK6M-M-.~]P"D2Ԣq1d[5:zVz>qvǽ qᓎӁӶf/i2@e$ ~(xGlCgYwyx]>/םW1p3z?urp_D:Qc3kK*L6݈Y)RiT/v"gp snي0{8et uN{S])qMȪhԷonws %cPu&UXtcܫVucAFcJ O-uZfhFQ^LWLo)M{"5FR/: ɋ K}EO<5 L1ZH{uC j5o<q$19 W0P0E"HS^ ZGE Ίd #SʲZvmOP8Am@m&%<%)":󘠱?37L'H$N_uC@ L•Ӝs7]z[Br@%>U0yO itzPCʎ'RՋB{{ȞO[,%OHE5f9/j1vra7^Aw="=¾cYtF(Sr`4mt2Qu0 Ӌwb^Cp4Ah6Z| ~s>%aeZ.TvfF k=jw7))2G5elz#|KBzuc]V [q -0 `z:N MQ߾y6 =,PUC3ѼeuI5~L3 ,!hJ!of:^t|trlmp)ᇿUW3D!S U_GwVIu,y1BY/ge"S>];> stream x-{PTuw/rF.VYCE)i. !;,\a#c8 S j&`ҙ|p.pn3s(03b? ]uNe *y>ꇳ/mɉʏ.MpS)+(7 YK֑$YIB*Mbj5Qu #0*E/;]˶?ٻ> vA${{:,iG!wd:gE.w׶wGi'HmEUJONŢJ{ѥ{斄-,a:Eex<Չ@ɾ\slOE)㡲k-u惩rEȢ 9 jij/ w>rQ |]umWڤEv->$d(v}kf/=6,Bw"a!ysPJc<εrYhi ]jM ۡM5V ܎wpXkrȯm+?\k0R=8|<ԋE2ШZ}Y q_:-;z[NɜCP5Vw,SF{b,DC'io.o); yq\Q)9}q|*W0ug[ ړU{ttŋǧE5 w #ah qR#>F&]ϜѾ;ysή8\{Q 5(ԔƚNF+۹d/{PL")Ds/dkrmbr~+t7L(-K[+4җTmLm&w<$AN` a^CsgwV>KƿR`. H> stream xViPTWM﵀2y=SݒrbpQD(Ђ+*H$1b3$T4QPш5Ls;ېTff~̼zUos=wwΑ K $HlI߰IZc H噷O ][nݶln;W&%o_;sOdTOLƵ~qO^Tx{Eh*FӐZF@(QZeh A "wy V-@^H@J[$APh&y DXtN2O*)1YLcAVKeeeRPUpm.T()WZE"nL1cYj=zuuuFS.WIT0r4 {ԥqRMaWbz/Ε*DyR a ۼQL  `zd!Oژ<-۷/PJTd LI?.g;*y{CMGmbkkXnE{x͖E^GNG!!v`}Ja3 p A sslwP/=rKMR -a?;Rs?zҹA. &~Dꄐwwә{y}5HH JqӖмmYYL}PGV]S7V_>KUVVx[QaZr`ޘ{*EZXÁ=xC墴 y_Pc֞FIH5|_NwN)ϥ-2v|77vȗ "^t"FԮ;=+cPP,Ne$ a$ΞmV+\=J''֟A:iwLjP5R6֙ZEd3?|-|M-pw"šLyxUr& 0!H"OnT|6:' $d1\+u֤&ͫ˻|SXⰺ8UͶ3I=Qqfyryr^*x_%10ڶW o\3KNAB`0AkA-sZ3j)J>N?m#d KhU*vg[>}Ip1X6mu@"s1%t3`:LLЎuuIJ]$I✊Tn~ QZVp⨧izilqѩayj8VW`Q; "WD/D?  R ܺ.%I z t <jdPOeAf^r@?ra/d0xw?c/kqrHszj2Yga"GO}UIIqb81\eķ'pn)=y#_g$S@Ciac\t'0dUӿnN Avtܭ0>uq ~&, Y@<J! :S:d6 d /C`d1Ļ`<֧VT6V7.9S8th* jH.Kvފ1M\.=P05g7Ky3%m޴-Xɵ꼪z,o;6'/F@w-X+(`-#),~Me,> tV3rTC9^U[j?bkW!ܦR*]LD:S `%5}u[[iZ,HȬW ߘ;O(/[ȃ9$=6p4)Yu[V蘿ٌ6VllpXl3endstream endobj 88 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1348 >> stream xmLSWo)爄)]'w6M6'"Q5 "hAy-BA0-P(t(U^EN%! H6"f͜K-3˾|9yϏG<oپ݉6n=V#bbQq+xn7. |'`W𑓙Y G$;Ab ގ Zxv~;vWD+Bnpp,>/~*tn1 d|u./LøAPJSH?K h|zM[T+AEPr zMN`*8+%,RA+^W'!TGe5W)TV#Wh7aGNΨ5!c RDvb dsdfQjEOF(l=eq*S<皲ܹCZXu0v_uų')M}APa 5:dCfJK5e}͙e 6z%Jrh^apݝYe̔IWoJ`5*?A.sw*?<"m k{`-UȽMAÞItML@-)L ޳u#ni d1:ZW$2k|ekO$mNC*Ũ訬<F;]t{~Oա:hPjkW1Tqzj~rNj7msOEQ0S.mY0^3>]%|6 zGV7;]df~,0F@8\Ļg2+ ]͋p'8h>CH>Qgi{-?6&w=>W:_0(p΋h0 W %ɿՏii\P7]Y2jIGq(&<$3ŢDv!$ ? \F# endstream endobj 89 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1217 >> stream x5S{LSwmwwn7g 1 eSuSm@ľV[z hK+-` s1@Li,W3c5s翓|;'x<ެ̴]ۓ%'jΛVNBbߎ+w-.OJ ׭H^ D:C#DM̊$K QDpdw#5hEH(s8žfQL©h9J Vr:lnڄv=nS|9Niv8mYQoQFSh6ᯟ$ mtZb;DOd#qdj=@O}$HP5 `w}|.#Қ^1݋!r},=!.k%[~ej?4SQ&p^;>2B[-VN&?@ٌT@EނM%U{QHbjK;ԅlkdZ-@}Q< ݁vY0ͦ2ﱦV-aMB '1Vb&uBߠQը(3DL/L=98q嶁 O-MT%'˃7 ltvd䏞ܼȮbWkmYۨBPhEA'{HEq.5֤iJaU2 !^I 61]ަiU5é11ډVrϖ9450<k;B/*ȀncTe|(0]9zVwzL&g'#!FR7htMFNULU[oQ c_Hղbi@7p_/ N6C}= ^=?aFjO`ڶsęAG#4B[b<|fPBMnA>+\}D9I$zYrEp{ 8l7"NAendstream endobj 90 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3083 >> stream xmVkXgڞEi%fhg\uJK.'z@!@9"@p)`u-jmmkpu)'\/M'~D%GmpXpnH9/wK>qIq-KOޒ-?n,!1Խ}vR>.j7JQpj/uT DS[m BD) ZNڠ*]Xu8׊w>|%?/9˺i .HX ϸt="#Qr{N?asW|fg<$;fFrR㻌~ *Zr-bC}?Yz(zVʻ2L(f%`1H6  mX,H=$3Rܴ̾ U;MCъN??k^ȶ0cK0Ȣm+f%3-¼оd$'i{RˤCk!UsIUށùHX3QvKdj%ŋ!ھrwv.L& Qo@y7I4rvDMuHf3(rϑ#I$sl=hHs f_ 3P AB;#2kb$3?½K/[:/,׆Fɓcq؝NA1(=ƀȇp"bhKQVͻ=E:8go?xbTrxg9LF~_ +*RdPG^WOkGkLHĞ`܅1.u"pڽH!vGڝ~^y_:811"3kk22c@-g'?~xN+EFHx֠Ϙ5ңHFyuAucX$KNukWԪP)b5 1B[Fg4#aHA#=Ux Kij ߑ欉&ĚtF# ^ˠm1yX]w, ܋59~T/9늪cCjCJ\aP* WB.eq`]vKڴ::$Ua^+<h{"^dK 4f~-xeI2춂Ke$htΘo"N; N Yr[>]H2:-_ NЉ؉Lo>xO&^koZ6::b0etn,+/Wmm 6:$lǢ[;mmݖFya8Pپ/j;'{\tŇ im$dVo/{BK")޼/Nv88jOKtkY 0b cJcӛz8iJz7ڥ8ma1p,fuWm4"kVUqeUV`~Į>p\>%Ѱ]ig|Q?f1|踝8}2X:>;h<φCBJ-<=#⍸b,cn5\ϝ9hjujZΈJBA()m-2kkf E]Űrp1j4^Vˇe`̏yn}fkt5Uը5K EHK֨|@;X3֏ZϴX{OWlk{:8p$7_vsz~v ~I7I5sťE{oغ-38e6Bd ؼ̧Ht$~_ :Sٟo 'v) D Ӟۨ\AdXARt?\A1H~d$,! FNV `w*:4G: z}}Ukt+t|u5*) ׊挪DQeȲ*:_{O0=sɽa1Fdҙ+ڢI2P;뱘JFJYffakIcGe2zy`K` 1xI/S"M}d}iGgxt@t{ 7qU%E$tL1UJ3sv!U%u*C騺HĮNߍJO4ix^/I2leKЗ`q/fs=.r++U*'1rSCz|AAEufōSi܇Jxu^A|^"J+]yl B` 2t{BNؚCdśR}LjekQtpJyJE͹]VkWat,*}:G(_ؿ"8 5#i̾DePHrS2塩_fXKy3+⺲{,]=$n~{ Ouϕ_?vv4 Oɫ1PgFY*Cy7gQ ۵V$yI3 ǭQ魱ͣCzVEg%agXqcWc}\yw{a>8᷇;ΜifwpnBqE (꿝_&endstream endobj 91 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7236 >> stream xytSGu/XZ`r/!!L `ޛm$KrfՑU]$Wɒ\`z BBFoMxlC>>$ݙ G0sUKEFF;;աO>x+a տ}5'ynʼit"bΌ]K2cb^g k %MLG36r 1XNA $VÈUjmb 1XK#!# \b#1Ml"D$E# bb"ML"K2G'@bA &('ыH"""f3$Q48Vpt={{< rq&'OR}l~^Gn3ϩWT16uޫ_y/'w|4pA~O|5żvH1Ù+CZ:'7nJx(`WZ Es(v J9Kiq@BH(֘ (9@//V4% upD)љvScRhьh*4]d䤋j[awa(782o0K7 yȆ`XS>6ʮynaWJ7<7I %ǹst H'pRaɸM|^#bw;䟀C~@72$S7 jH"=$3"^G`9mL$V=`> ]VO>I {؞iH'X.PI~B 2JjܣPXCaS_P# >_ 4F-tPgH}|a_Bo~&!J#FQ'۔12)T G!蕄$U2j'=귛$(0j0}s\Xvzqd?yF5{mkTa͐@ <Z[hXGwLIp |DJ h@6o'5k2+"u?|]/0•HK*zQߔ]ԗZAOvFϑPVJ{b162:($JGUyXn1Toc 8\ iROrO,c6&Y1pl .)QJ,zWn[4dL@-|7 {rN}b,)'N 'Pꖆ5~3¹| ݺؼdHGޡIY3k9X i44iz甂b3e8@НW)7ώ|{eEeҲaܢG?ZrkT&uQQh5bҿauRmASneJ֨:r(b($%Sls0p& lF;SGh?ja \j*6&rTrNAA6fPE<ۙ[Ze=GiGK;=mʻ"#åҰ`7)x[^FIgQ$'&{bڲo/2BL2MmW\Ju( p(mp)6 o ņ5"[:Eւ:- W L's1|r7Ѷ 4M&i?MEPE7W=_W9 @'%a wpP~4I@z|Y\M6I~zVePRFN^JU5n:pPZ7Uﱫ%$1\CVfתeGKs}gU6nF}zu@(pNEcl"ʬukRʻT/.̷(9.=l,ohll. #ɜc˱M嗯Pޢ]nU]5" 9J!/D)֊qz/ޮQO#` @ϳڨ*Uh_˖W5هe3O 6 V]Zw /{^G\ݸp>"ь=(Q?Jρr$>mGn܍z%@jw kh8F'cd{K #2.,h-,ؼfql=XI/0`f9w5 )co߄KRϷjV/jnoJdUY*.aKK%‚[/՝I-Z{ȣŪ;d0 yI‘G|86l{JJClJCU#91-+=O%`9U"qPJ<a11i@,R6kg'қ, x7Z=Hސѫ c2OY3i01NvP]:v(lzX~"'f"PN¢P!G=5Q's8|PkcQu~ 7b⎡#( vPyT%nJZ d@jW+@-%nleLO۾ jrr&9*mARTĭ]\agcԁZ3/Dp^A RԊRO-m#Ro4~8wrˍ&f-ky2U\n-%f~~Fܣ RN+دRk|'WJ&8=ކ6|!Ѩ8X_`pSJrr|-yQ)#1HDέo|'O㠌*P6geB9KJƈvro^Q!_^wYLXQHA ts >~^n,Œˠ$ժi;`wJ .ep'Af2<)ڋ-@' {)_0UPfNtdLunߜԚcCu y2QҳTwW ; ;N^cX ͆ na\hX'Z6?+#$0W(nGI!di5k JPl 9  mT-n6O CE98Y&RO4ɋ ))QONwtˠqZE&Ƞ*}"֡#x? C %vC|Zl荷 )=,$ؕ4ǢxO2sE>),lؿśl{}8)~JՆ?$YW "(w;' ػg$o[Ď֣=EMq$ &8.E\S4H0&o64eSΝ_^ >j6uպ 'fj&dzA>QmM_'zQ} gdmЙKH}Iޟ[:52| b|8CS]=y.2}*EE&v]-Si f>r-u 5bXq'ꉄqk+5nܳ9yV9ȨM~vHJi#NjjAGT2/?QRTtж{w_/g]M z\$4eLjfl,\$nĥ"ZIV_u\ e^*M3SyHur||| PZS ٰٓkJ:AY9̺qsx| e3K{ˤ]ٽ5[@9IB>1 jYNYQ7I8fJu2َtg7-l59*R,~*:vKX, K-Ib&)-9-IHDdt7LxwwfOyL"1zN};A%?U) gзkpU)h5(އ;͖uQݽ9R%!DEL'b@._췪*5r [y)4 Ϸʭwf-vx7pu]z]{d=4ujC^n<_+ܽ=96 0|,F+RfZVȜi`EO{0ޭpɾh+T$C-gFK8IfJHjh55(ԕ7h,F5eE䇃1̶> R `E$g@MNgo~!d=:Y `[ 'g973͆h>i,Z 9d@'@L<^J81^Br~A&4pI.Ԡވg:"cI1|9b0Q9U^LK8歞s1{Q(xJjSQF+O Www٭PRP^V/wX|32\ȹig) ے\:9\gNx1K>^@xG28qL%j֧OMqڼǾR` W;Z\8nV1 t&=Ё۶Ht:-[iuy6 ;([5c 8`qSӷxHj|z_VUJ$[gT䬛kp]F~p7Z0a4*M:wp4Kh#o^ܻ)qY ]B= s\Vt ZVKkiu/`ov>͒tw?R ^E$J\})Ucu8iAgh_WI'WgԔZ?PIx / WJ (˅kv ғZ\RZ_vr/lm N,MxrUtQeG<*^6S*F4-:·Q/ަu S-EnyO8)pllڴ >`4FZ2 !::A+*4+hRF}P\%#UkMJwq1 a'L,Y[p&`+/hWCc"f>DzkF%P2HR2XLZZIP&Os|Yʪt*M*Hry}qsJG.et__OesQ|P4Ve0n*wwSTlCѤeEs9h=zY(1lSh_3[p-"7,]džatNg_B}v CktHF1tqNC \9塀nn:=?~wCCcsQ<Ԁ8{zܼrilڏy5BTS2HЫYFhy%S}܇|uz^AibLem^1P1{٩-@oWdeAY!SG?{'ФcZYpYE*NS-NZ7pbAΥׯkkjj|| !  9zaa*w}Z~)BLN{< G0(kj;]rPko\"PʤkVqד<b6qo>3 :$x-jk3R," C7|gAK[>렯"O9|DoFMMUe_\)`Q/DH=a] ϰ܍7 ҏz}O ο~Rb',uHJ+ϨwyNF8vSD6RpF>6U@OIoW[VhI^r ՏR4OOo)jendstream endobj 92 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 927 >> stream x]lSuY슘4iќ^@Fqɐ 32):IV:6(9;=mO?\Y(lP%qFwaⅉnr*M'<>$l"Hl>qCQГڻ͠VZr]v=X !c[pGA&+DF$qJ@SHkj0/>->- sC|TCewtbHZ+!@]U_$zOf)mUX6[ul4(1 >R' K.a1~i@b}*Vy1 hw B緺$#:~jŽ#%d'ک@\Es_Ǭc}P5mq[xa*M]: S*_\럦4T#64[ڌ .fYH~mY0G,pW $$ U&5@ -)'uUzgziuaxo" 3@9?zh—+y^0,W3#z`}>4t2>MAXËrr:T$̲, e&0o\.+{qɭm6jȈ62|҈/$~ZPq"n$y %u9 dž%V|LBXHQs&R8D3/OI7h?hꣃ}Lym[ruws4hVe{N /endstream endobj 93 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 790 >> stream xMR[HagםkPF>QYiQt+-Jf erslǴjg+%XŬdeyyȨ-H*Rƙ:98>h0첔 . ҁA * chgp[(.6!|(K4!<H D $D$l'BG3SyA^Uv h X}ӑ$b[pK#h IΚoV 'NPP$О,={y*(* % ay _Yy|:2B7񮿛|g6eRS+Mfviq A4V\|1CB9H\UTRhYIMTS@ 5tcWWWY!UG'T[(ځSQ z +)++3 1@3&i5,'\IEYeh0ĩzɌiKo R!HX K+,Ci|q5h&QG|nx vqsika)tɟ!{;prx:د? G51`.K56puL"Xfi|*OXzXb^cS?ͤiPoaZi%͏NkbsmkC^þ"'+-]}(~%)fN8Lcɺ4xGa~q*8/L z0iendstream endobj 94 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 850 >> stream xRkhSg>I(*FAFAa1 :unVҤmr&'iN.M&)^Z[+:/܆26_; v~^x<𒄲 I@mu#PJexuƇU7߾>M_\h%bq8BT %1J!/P򩤿yΓ_(}FudkI,oxt孥9:}# ";Bq+,,l=_6p@!9*/Gel=QYPnS|P7ٕcld`Гvf}Jb NwA.3[G.'b-,t!KbKv#el~k+WagumTTwo:2tiqf~A,j2v6+@j(H@I+ja&9<@;/B 82r{>0Yl^dS} .d3R߭豂LFd -o-M8ϛ>i>IM(eF Lv d!!CIIhBρ+6 CHUoR3~:{NJVz ~kbf13QȯnPY'&/mXmz ftbW|.;C?>tPȌ:6~/ Ie%N~8ҀTR͛?H\?IouX.f^ۚa7.r\4-q-6՜p4dnu*- endstream endobj 95 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 260 >> stream xCMMI5uJ  hIπ$|{zzy|t~˝Njڋn`S` }h|gzWgzzxzT^RYt\%(QLjm O iendstream endobj 96 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 500 >> stream xM1LQߣ0ZL:8ȀIcbKk JSHz4mb#Kd& wFM׀0ƍ]:w'A(:ou.΢-w1#jlh0džDdp UC1EK" !k9pkX/Ve#r?c;`/i&>}*kߙ>s]1f=1LxSy;Zw<9_9Ã{7?.e5B ٬0(LЗ[3iȶM䮩M0 o;jg/nF_*X7D6z/*MZ^65B~ I%|vl?_Nb9MhI) (P n; zwNfջ#KTA$IHgf2J* n66WXEe]5Єt EJ%쒵_4/#ؐ ZFendstream endobj 97 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 339 >> stream xHCMR7,  =12F?ts~*~ssr)pt|(|trs͋oKL0bg͋§j~'eg #e'͋JiuP~>}L讧Ǻɋ !74/XWϡ=:4MFkgo0 7 Iendstream endobj 98 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 112 >> stream xcd`ab`dddw 441Żz}_2~=;@1012h9{f{?3T^%:gnU6UUv#'b>CX"Gendstream endobj 99 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7700 >> stream xzxP̸M : Dzv{kKwHB H9I )* XQιwͦ>yY{]C.,//=3tP/Yq6}uZw;z`7r/`_5n|EUs06FbGGc[Maױ!bl6``SgW簩0l:"6BNJ1 zbQ6݋`v6m#ycz7Ynntb1+ɳ=*z깵W[=Ax<ۧ}?wdbU¼M?r? EUJQϋg#yI?B;oHhZЅK>2p=B82}HT@EH\%U)2NU9]fWq?c/@7>7E *1CUjw,x~ݡg꣆X]T};᷂4t:װاW$qypm8t l7Lf^uR,#P5<.E°>6vJ0I2p8v' Y_?shVڨ>Π%CDD*$`-~]\Ja#cAiKyݕ@joci]q90d^RCټ㰗Ga=N~vL|Mkqo<]s.>;GBj3u*p> ֡"h5Zpj]++86fZ2_ڝ2@H."WOT,B WS&QfbW*< D*p=(F* Bp#'-6j먷F;N P [Og0\H}`ڏ&ڄ = IumךLLW˶I8wRIz/ mf/Q]B&2AS]NTe8>b8 !5c5PF}U|EACW M^ ne]wv-F[ȴ -8KQ; sDRcP `0뀞,шs#} YJ$r="Re8fcOgd]+?J23p$UV" TݸX olfNYRI~yRQ pqKPϧYW{]JK*N#9Sf.^z+X} G*:eKP8 o]2`),_Q\OEO?ԅh%+/fũ =jO4QP{^u 8h {'wh@^[-?Bv6b*]+>nzkIU̲f{,Ɯ%X֪`k5 GO/gD:NXjX" iI$hh2G]7d;Ng3"<94 A1l OVH|7Ω!&o5ۓ]B1@bQ>N$aaF%҄_`Cx{M-*?}Dy. byCJ, #6 GV||&]"Pji=d`\=4TD4ik>N%:V0)<, ::iD@:(X!6SO6%d E<q@WEw4v.([QŽ-4 %BZp$=ݿ]342C-plٵLDȓLJ9"HQ|!{acy`[RP,_~_z@&[mu~|PBl/^"{vfK*ػ|t= jҊ;@P0nԴf@6zCQF#  ]'Yc8OI_nR6bF6Ng@PW-Z1-v7.zͶ ܩ zk|'OOwY. z><ǚDv1'7 W:#L &aZЄT>Bǿqsǧq@zp'bz7 {|.C"`=tC8R搃h$t5r:iDss>!:ά30l<ߕ!Rh9ј2 @Ғu }%*r em 87xQT){,joO*N@&hTef@^/[&[$\[",1iLMiF]J~@|@z@rHKn,l_t,y[ }32\BuGvݪJPE ݊4Vb^j1_h8)IY@ uHS~_%8Aam DtXY,:> b{ygwih[rT x,N&^( v \"E ƯL0pA~zyډ7u,uA.$ڢ*r)^v68L^xp?:Zޑ)ά}{~|> gbFK8^< {ҋؼ#UI&$.IY,²Պ5`$~Hx>98vζO&oJ`ʫQU,KɉeYutG8hܶc[) ϼ_ס;(KA k=y8"n۱dM64mn\M5i`6"L"`bjǹV%}uk];y<*U$&^o#("ATe~c3/QCB*( ܋}H\#0X M"{߷3#ת[!ו'RK/?@ATbqHL)x?|.=dM am5 &5~ -["RWʛ:84qB75}gk+9iOUC5aI3 @O&իD /ENtlC x/[D:BjH'VˤiMs=|֧T LՄ 6𴻢68 OlIAl[] HDkF:ڼY+54`튚rurm:q UL$^s= m;Lov.$uĂ_Mbۛ o&L.q~;vws7>#}CևVZ ƙH+kMebz^,,mn[ G)0h)횝 1>&FY\>O(Fi1Q1ָBfj k||/odMܸlЇkYBdLal6D;J[VVLjm8C1N0B!|snIp d\ w_ʉ@;12i4]Be )f, 4kVV g1RU^a. 62Yğ+47p7@l1>HƓ-mQ#aH= | J|ƞA-5 T3 +4_ui"e1R?5/x A+smeS7]WP}3ZϠ8_,jenfm1ق7LRδ3 ޷Z qFM{12NC1B4 5=(\d37džKNDK}OHb sdpn°&ShugW!>IJyEVNpD_+r:fnP$ZAΰ'NJ<"}Ngp}3:-@ns70HN9W7 9;tX᫖%4$'WRYUCݗB^T""ppzG}R `gs(2Yo4!I33B3<ڝ`477;/y.'z\|I/ex^z~*Z`*5-jy+dJp=J'j#pL& ٩#nx;I8%ndTƛR ! Ď#t{"'OkRRH#he1Sn`5;3q뼩5eg97gl1&Rd7U*]æC m)}iի|sBdJn_oÿcX} Gt89l[O`o u ^LU,5:}a;mf)%$#KY"^bl7K!ɩmi?ޥ fĻj:Bg60{4F%9 ,fWv&"a-H'0aMZlv$|1\L@ .UhkK;輵ik.[!+|~AL7'Z?wNI1}3Pʑ)8ى'Q-`g:=@-u ~k4v"=6!4.(ݿfX V0ިNR ʃK`|FnL'Rrmj' tFnnZNG?]|뾧?] g{E %6")ڊ#5 :2jFv/lICbYݯ#A~>k؆HyLH)I갞i7*eiMzZS#QVɋdzHjxuXk%f9ƥYUBTRD`k};"nz&x  bt1U@MJ@S( +c"JW r1jE!C|B)5Er  @"7s3w yWt)SJS͹D$__֥S\ċqgcJ\!͇[ʃ-I~q.͌PPq޿BRPIc[W`Q[+suaJcGTK> QWpFP 󠙧0"*I-xu!a#85.w(l0b x-ׯܕwϓ42ڈ:Esx:G1ZJzp3W#f' `KLz^$;9vE\QnPҀ"B[řD|]t߇wT"ʐī7'Dy{[ylWy#l `}3Sp,3 Т1]Ȟ pwzבFd~#`4zlCJ3Ya!q\~5ՈYڈ_?op9WXLad6(1JxmEJMTENe HZn-ن#?c5{?{G}"a_gؼl^eTO4TA!5FҮ&@|GylzCUYErH jd}쐄i#hXjYܙ]+./&؜jw ȿT3k% uZc ME&N8}i,5ft_㗪5R)kNJk ؓ{>]ߛŽm[cC'` XݒG<&ECIsendstream endobj 100 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 176 >> stream xcd`ab`dd v 5070q$eaaX~= h Ȟ2&K??O[t;'g*{wzAgIg^gnw^7G@E}vg.HHAi魓kr9丘p208endstream endobj 101 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2273 >> stream xEV{pKtGR Vc Ũ h@ &$!OH.~{H%J4#P:>j}33SgC#ݫ83}?vC&\šիWW>~|OnW;o-XV(՚ށaV{k¶a۱fl=V=m6c X v{LE*J_p c7 K~ٚkb҃9Wu^ i\ů=y7&"8wG;^$ϭnkf]fͩyYD=Nύ''lCv[8Um mǸoH}x1,c!̫DAsG҅d'J#~cuapuԡta< ¹\8WQ<'0Z{nfTsYTK.HxMQp8IǿL Q^W*T }W샤\T? kĈ=yn4aH$Fv6 unAWˉ^^*^@Ȱ EO+Z~HuV,tYD!b XYu>jsЀ֞lpPJ?eS^a竹oߕ$F侈{_EA4RVEX^?&d!1w9 &≠%lPu7*'n/7ڌͰ6n ttKIhwJf!&ÈhC!@]2Lh&4x'yvx*LށsQmJU z̯$MJ@*@(2X(cAZ= rvt€b{$Tf IA_Btr5Fnzf(@fzK5O$Pf׈I;佻V]wˑ,NܱD.ŏPMP$TŐD0$WQ}g\ ͔rT2 JLCV:hSt;u-#}>A?8iBГd_ %dRLe(Z (.ňƉ SBK~F 8W\îM#j|uѱ!d9D Lzuة=iޮj:ODi@,~?F2@ "'YG`ev^d珦^ʸހ:PB!,U ]$ƩӯrMq@PiS˜RU,4.7qB?%s/ EJ(E qkb?>?P7j7wZwZW~XW1l @ ~dǎqR֗ fgN}t j: [ԛL{aLgqo|1DAϮ(uBuZ*1{:*dd@:{*8͎GmlWTEp[Oɹ$6SAqD f2*Lz\F5Ϫ#k/ð&endstream endobj 102 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7026 >> stream xyytTUWEDʂ D@EvkUju^^M@dUPiv[gێc-3s_>3s_$wYnqXp'f̘rƲ0>[wa~ݸiSBQX]CSkw媪Wk֭o^|G>'Rs8+988qVsLll̙),,yg i23>gsײ c~e\9Woݽw>^;aÄKxDuʲ=wu'MA"ϾF3ӑAep;mK20\Ե Ӗ8yK`RF& k$%DL嘫D>{k=)u"HI1SfD6QLR!M 21& -3N)pwz@+]6d;[!);xip^EbcjCbLrmFbb0MΤR*a#xnS$/2€ڋ&Qjd$BQ ^uxBdRl%EgE/ꐀz]yXwr^2=ӹVZE>&T&Sh%h{iL c prI˄CINhbh7MÄJ`yI+pbqad^|ip ? /Oq֪/ߓ=u`e>uh2>? X#⇒((,Ik(>vdJ,KȘ{TpSIKG(L&QL!62dKnm/:֡EZƦ2c6P$nELmKX< [C0hx\VN"JR?vܵWq‰ $le\hh/Iά'Kg0CS^z6-BJsAUa1LԉQPIna5|z%,eFIF5WiBCn_T%(`x)~vYNW~QLx0ʡa2ZN!uhXt 8ʤѬ5VYlL8:[x#Їΐ+ B/-@Yjm !3%p[ `VQ ˺tE8tJ_Bܜ)m: Pxk”$~ѐX~!; x{ )t<>=T Q=w'":Ӟ2$F=h4ٚ{<{{]=>ޘҹT:G-KԽqkVp|dE~'&pjG)OidձZʳzw`wSmX>Kҙ܄s0 )MP.ʁbJZW ¡޺yGꄆշ隲:`[evEt"f}D+n4Ͱ/ki^ir_:[yO~B&n%bB QT5c3J>|/b#JH9̝Goy-JhY v>QyM6<Y[]dA >*uxo$Ǵ j`8"5"C ':b I qLڰZڴRR pE9NW{ij}5 K #Ny0yh "DKB_hpZ) Bӭ)SHaQ`U;Oy6[w΂dߡ}u/&p{+^j,8KꐈF]j,hHaO]E,g)WR[fΦkqf ){ " =,pgbTDhS9Np%:N8,:T^Y^$iQJ bfu\EM+;޴&r/sdw6]Ύ`}] cFU*8nLpAyld Nm)ۨ>bjCC`OO6mN4(K,O,MFԭ,SW3X(M+* Ɍ"q\DS/nK-1 VEoi5U M: 9e?aɸ?(SrMƊ7 D+LYbt.$I}G0ؓ Rb2N2s$=7H+ U)˞@!B-8,,6\li\ *ҠVt74!=8< Б$]"gEuXFDYcfNI d߀ d%V*S yz00?HQBK=x5Zf8f<_{r._:G}.?£̫h얉WV_TfOff${b+ \Y33*`ש6088l9hVj۩𗗜 3H3~p}p BpZQXy˳2O ,ēڠ|; z=9$nD$3 sgAΟN~4rKij^q\ܴPZED`cb /AuaQ th,MF&$".ޅ!Q'8tMdMQR-&Ҫ҈.CgZ8g\8@^fq(<_zy[: a1kKxH @.qKį13;\)tdEHք)Fie4F&Lg7TWMfZnC.'w{_?$sK iq" e9[P"3YR߾JB3@eCm?k[HCoZ]z)+jz#;q]IͲ{+DFp}\lj;hQa-.g^b2w. qV*iX+:<I# kKb!r؝ѭQ[565in*ZVtbEr|dzzJ׌ GLYcV4tПٓ\sL,hd1-K~K1|vwMc:Ω:dWJ(vVKӈt3C܇IuJ Mj M,E#lD0<)Hzq Ϊ\YZb9FaZȥ;h]jfݶ_$4w7s>So):yΨ; xB^zIkU+7oL*UxK#z| n1*l%Zg"^LTcߋ("p#p ~Åej"Hi3[`4U**\G#!^_]nƓOZAbںi?7|ˌܹCCUN>LE Laʘ̪&9 )Sv܉>O{/pGD Hn5Fyc~x nvXݲF4ǐ+m0_$ T̍a fRKeye`c~*GtW&r&t6ts>$YY\L7ݫђm 6H h]^@RZ7 ɍZ>T_ jswxDA]\kJbA߂jڥ VY ,]ҋ1>?k?셻t=:.J*&8kqmamPX:JU&a?I͘+P+e>px%6xÿ>N ɂ(m~ 0~cBIJtvQe)KQ[s~5cHx<%~U\plW)2!HZ7/sOoMSUe9 G:jSe3W5.C߾7?nywG[Ӟ`Ī*H3gJzoi B'Bt oE ^moG d@5+,q5wm+>G!R؞q͒;۶u78@d8&j-;`na;!VpezH;߰Tҗj# 'ySYzq!j\EAK6O΅y0WZuWWׯUzЊ+#Tpa!gpC7ppŰ7uQ@L fy٧u^M@ pR[cژ.rF V2KM[L}q~x)`D'U^|oTe?E!oЇ3)6` rv @ v BekPa}`*`}y4iM*ƂRD?l li~Nє.٬vې%<x[Z*rvL*I[یq--&EȴJ-z2 y=/՟M[ktUުeQ+w^W{o"hW MĎ;T*ʊ )-lF`̇p=Ii4FVʫ%tOWxBPnzK~8P>trH‡E7(A# Ls$n%{1 :ܺR`'Em(g ~-g9?' \Po L&4(RѿlJ+eUu(ZD3C$0V9BHPF莜+h@C>9؀,pIMXb f4vM!qy%n'_[F2+,@WwEǶVlw}îts Mou>SJeӱ`ͫ@6~cpʭd؍Cxȉ3l:٫W(d!vV lSO B2t" %"I27רwL[c^X)H.`7X AYӢ@+t(wCt9i…mKkYu:B=\XA^W$jbI#mrny&=(mpj}jowEYub=1siAG)6!e"Ƃ7 5R{%@BDA|w“H#F1'PO?L<"y?@Sové72:;V={i2K9C^ta_3×QͿ7q3%c"~H^EK܅:!uD쇷n,"% R$ugqMX.1(=ѰmW:=.ԨºX/` ;{ <G6Mk 4ULo?Ǝ}} 2#דK,ݲd` $m?bm s.32 ,i8t^@46R 5GY4U5 NvsRɜ^/ޙ/ޟWnVFY=b ,0ޏgZ6%Un7f= 礱*mmdȭrQj]:eA{ By&PSE#b{[?Qejn -ȣ(* 7'F' endstream endobj 103 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 186 >> stream xcd`ab`dd v 5030q$caaV~= h ȞqLI7-?މ&;i?ٻK:s:s9 o=M`of⮲n g2F."ۯ%Oy=';=endstream endobj 104 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3345 >> stream xV{TSW?s*TN#sOFmiUǙ޶:hjy㣢XᝄWIk!J!2:`R;^{Z8mwvXǵ;´dd|8ļ ̏~!:A.\ γ"NZVgkVanb!#gd r^߰fC+=D"O$[D ";."!""b1F2zNCТ {swd)|jA3YҢE!p?G< ^N}(Os{yY`+4G0}6X"iJ-&*I0Id._(rԡjn܆(lVb..ž}]MIRD;ie : }Jx(B-nȓ[&w!(g::R( C#.> h7y )1l82br0Gteނ$~7g=H2B|> X d+6@v%.CϾQ8xF0 :6ڪxṁrV[zS!O8Ov z7n Å E$I]Ǖx|t2Hep=o?|TUUKm+mhi>LݓTG)@qC_4C>z>J̼`R}vʔUa% e2H%NQ_@=f"Z kz켮6h v5V]Y(_ ͆ EvwH:<`u͎zG,6\kSXrǬ)0rnf*VM"mL;ql갮F[ @]xvb4o5 $m7YQk .,)䲒jTV7Y@g0#xtfS;] -[Y){!A"].Q RHQF3Î91c/ < VIWcdd"T_c10lyD 7R'OA$܃r73;˘~79}wQ`t'PK᳇AFgP2cC s wp1`c-O_LֺLN8 ?*8lPj&^.c m5[pB9hA`+^$ftŌ~FJNan znUiQH429Sp(%/LSQ8Bxj'/ylͦx$nˠFeG r1{ ߅9櫟]&#ߕ_,aJ[5m@^\<ۄFAbx Y^g;!I ƟJ ,Ur%suyUf!FYs]sw_.X R/-[{"?⯓8V|X=m\m;?;ntI n.4aSY& H})^=:_ywHRC@m)OE1"{leG^6lj0t=&aGM;2#@JzB/S% ML 7`9[67ܭѫ'FXk-@Y] <Z5{fAgx{:B8}%{<x'F1SG虫(t"s<)nȷ)zzek5'7 r6 ڪֲIK؝}b}lv>j )'C1҇:au(vx:,:𙄓 u||2cY#l0l!\SY"̓ЦFYq"Wx ~OXFZuY,s4 }#L Ե2qUyU?'N>؏/^^.NBo@u۶D9Y\TaxU%T/PF&3u0 R/]p B> stream xT P]RziǴfhScjIBL$j#9(v_;~OS b#5EJɌd.3N| E@ ,޶k׺֭YeT߃W248}5B)kt2dGkr @v"?"%HlG B!Y2dC[pHZnZ,}(ŌTbX?$t< /'aFt^rK~rdoH/pY$S Sc[;&l˾Oo*=i$r$IK&p~c9ܒZ- 58lՇE.(FzRiF4tBzC1za_CVs 6n۽m _*~kaI3v#8Q5•#fC {Ѱ6Id0%I Au:c潝푏jH!3RT+AHPP aAG̩"g\4dkTFdB,{]ҕʈ {+WGm<C :} ,KP|6RCܘ4b lDWK)U56@+yOvx8a6/? PWL ܽ$sT I)VltTW|c E mbpb /X8 rH]ށk 2y`xgJ@ F`6܈^fkkz Ǩ@=hs(º0BGUU٨Z-͠PN 7B:܈I{m@foqؚhiajRW_r!Ya_{Fț_q`el7vX=9x_H@X ttx_2bP>h:;z['Lw\eb#c;َ')NrW7en >DDdn֩kk9(XMA>6X |_h\~-f Qn V3jBpX瓱q!9E _v/ =f$$Gޞ艸옄$-Vh!kJ@ݹXΠPwhfS}F;;C1∔=M$mkTM&Xp⩄'uJ)nFU(qO6дwhDh& `㞻oThOoWSƼ(ǒڏrK%StU7AAN͑.Y)Yc0 <^ut$NU9긑巀\ /爱T!c6Ҭz%9rvrE\QQ5C\QWW(ND޺?I :p"ҥYkX-ci-3_1:endstream endobj 106 0 obj << /Filter /FlateDecode /Length 2634 >> stream xYMo]ݿ_qO\~]hE,+*FVsWv&( [gpyۍv?/'B1\İ)LӾ=,[qnߞ>{M%鶛-D6Wcnw?^onu"gS]ނ&B_o\<=ݼQdװLao%R'k2!m1]%;}s958 `ڂr{)59 E X@X0FS ū[X%r)YQXhR?R{sVT~7-(PT!OX51C4>rAngtvpr'EIz~l{C-QHO28Y6!c B g3N:ۡ2,'gjw\{h[S3sv;r>P#jIvEdWԚ5}d$f+jM>PK9V5šMZ?V!wǿ5eړqC>DЂbEƜ (F8$ w?/lSOD>8?5 ٠rRSz՜f`EG /q\KgOϯ?>{io0yG ~{|9#urMvbS>5~gζH*]@M΂t&,쮨YP x]YP09#Z㰢(6RٮYQhlQg܂R gj-YQr=Wp@У+0|BUkq2ƂOf 3ӂ3?s&ƄLBzV,QHO28 @G!=1ڣ̐q~1.1z Sw`!1h$TZrFZ*hJͬ5)YO_&ʡhjl'$~:"Wp"&~/'l>~*.dNaAO&\hu y=vWׅݸt@i3 3[tY 1nǝ]<6y4 ]AH`'7A2κX)b12hXe+˂HK;5(LD然C&$^}߻*}@Br"@^&&An3A231<'am ~C̈́HtSTʇ]LI|wVUB C_KqY$0.F6LR rD_S U :ǮEG7%HyCIr(]ں g?5LZl@bpXYU] FӆzR5M^n>T9}{ݢGUkw>zPR\n Kb';Mn| ]} )z$9ct'clOSS0>MN{0@[a_uTໄ5KוS>*VXr(}aeL wtA Jt>YU>k6:M@t/c-*0Gs]8%Z3#I Ұ3t3@rPQM55|jo4R1/"rJ1$bpP H*G:IM$t].n6(TbMzR5LƉOͶ(a,J'M:}>f<߼7"m9GU|> stream xYɒ/\dE+yē4:6lhL_vfVP ы4%@Tr\^fZJ8ᆯv7?]aZBH!VBsrVBpz!`[mv<~}k8{Ϻ ÃJv}}8|Mb}+>?/$VeCK/e_I҄b(;YSS,|Bf6]gA+;VҕGiboc{ܭoR`h͆W'JI0`!CsjpV6Cӟ2ez-Aݵt ,GƲ~ o byx<_c obew͡-D{uou3_,v-8vGp76ZY&ōvN2G@2BxB|)WT5V֨0ӛ6B?xyao"'f_lGy+kbJ!ǽ?FVqW k>/+ՅW"߅Q@p ^ OޤsעP7 V@7 j"Ml-W\x )S n i~-?)O9J@9 |K'&jǴn]]vj#:`=BژgdlS@O|a@V,jvЍ ޯD*K)? uOhR4%5 F9_eeʊQCu= IT4 ֙=lk>zCp%#% 5Ǧ( đT+ U⳸RZIT8Q鉘U"N%cݾId IQK&;pU)e00@D6$iZ.؇y1PxG3c\>FkcFߗ\" @1z rұ$D. ]\pA'ujV'y`' } e2]X%{ui:IfDz")}+x mwBG(8)y.+cƄ^TG^7|qL)Hlŏ_cFo0It_’a1mu_3Րr܈"LxQ{oZJ xV @*0vFlR`;=lEŘ w0^(UxIR!%]ps:Hl,bQz4]ɵ#?5 FΩ|B|>^߰A5˞I#.n}UU&+O 8.t<ӱ#Mͣ4?wĚ ?ɣY6{y>f*}{wiKA}MQ<.A屢]?~/m`rqs77 endstream endobj 108 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 142 >> stream xcd`ab`dd v 5400q$baa]H~= Pׁ? 7~H/(>GhXKdiVB~FM|w> stream xXKFٿB7Fa=#U9lAm&9hmZ)[I=#i%# T[_'^,[^6j3aO&Y.O*Xf(>Y/O1'HUK@)|³qrMʪ\iS| oRWܑ.:7bYWpIzg5<% Isz' NڀKF cGYCe usIQ%C7#jg9Dh]P93gTssG̺#nPEzϼ̏̀czQVnb|)nPIE_?&{mUl䘧s&I BFU v/o ,G:UVMkB@8S&U}&w @͊W4SNlx]) uRd,Fg0% 6 Z碎Aw$u/#r33 [u˘ER-D)>Hq\(q,A qQ|R|d{ife!:iQK3f=ګHAZK砮1Sqifa[<9qsh*"|Ga}U{XXsd!#TX(֑|z>Hxasx+Y@gD*9MP0@["zMo i9 Pp `ucuP0*τŎIUb'̌7 #y*k{40q~B䇓WQe< |(a8kJ@ pMyD } 0W@ ZgGSEGAz?&!͟B +/:?O>d5|ZaFtNcsHAh:r@vMO<4*"Q!l3 >q[aT)c%a r .#>aJ#g' Vȼi (9VM@Et<0\Wu<PG` B .fObԚ!m-)Z؇Nrgzy` ЀYml cM{n\-zwhڼN_%L^!#DM1' 8 ݀Q5mݭ&Gnv %@#ȩvI2!ړCY^̅dJw5mbi8vC7fe]!S*:ne] ꩈp^DH' |n@aC(ʙѤ-Mcv9H6q_m|{;_# ׊"D |_gy >HH4Fk@[k+-xy/n3&[ w}_|燶lJY.$%2Oi'Z2߅uv,7!ϯ</e^!pk!IWmĠ_89.k'U QxSgJG;ߢ_#~fٔ 엿G >p%xZZEExݱZM.)%x7 r;fendstream endobj 110 0 obj << /Type /XRef /Length 134 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 111 /ID [<52d6b1087c42b292af3ade9ade476973>] >> stream xcb&F~0 $8J+?& u(~yHviɺ DrYA$w1dI` 9^ "c"`0yDH&.i"e΂eEnlu,H2u0 endstream endobj startxref 66214 %%EOF gstat/inst/doc/st.pdf0000644000176200001440000031347615162303121014247 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4753 /Filter /FlateDecode /N 98 /First 824 >> stream x\ks6~~tB_I89Djeɕ\gRJlY"H pX$#]"E#%ed"#Xd#cm"uFgh*5~"DD\M.F<58ёtD 8$ OBrQi '"i_xn@!Y'(k\dAGAـ e#0N F xX@͂1 X#p\8-4K#[X D{@%P"A188 zJ<%Oo . FP9x ^q' 4_~l9 $J~˦{x6䯽/Ϩ_Nl (lU//;:zwͣ~D<Pgep`0  0fp]D_˛ կ_gĘ"n>3{MfX.9ڜ_ x9ɨ?~$ۑׂSBk l` Mh'P$!\0/`t:[R2t"C2-9MM8 x?H:ձ 4 L縡Iχ葺钘r|Qۜ48<͖;|g)ϟW^$8(?y3@*ZVPo<?a&TalɄ- -EUvu2f2ƬWkG4=/a\tVG\uFY[WM;gUl㦋oٗBX5jl~NyC8\$!] QFyWˇs^|[v5їS e +÷ޏBݡrG(3(˥۱15ťT.;ˬʟܶS~}'6ӊiI'HCvI똑WVHK$o fa=S(?@7*mqv[Pic%!# OPDeY*ZNTƳ3 ?<<>z鋓cNqDt8Qa<ݛ.? Bxޝ]969WK@b#/0-oQ}x@5r+*?vFgn-z"C~o8t^w1$C oSPCr&gy2H(ɒ&{Mq2Ini2KyL?zyBFB|EF}/Ɠ"@SuoY໏{k=/Prn1M+H.Usn8"`^]mP~x|zgɨ'( ~T$xRH /pr6FE`,`ײV @tnQ1#>6k-x:<x&/7g\8 h,g,A@6E 侊PX@j"* Bb꿁PBh [V <Q-lv'^}dD^xMxS],"g V\":D҉b (91COn4R $`&G60Zz?&sLW&pJjhXAQ!}MS0y/Kl2vUr5hu6LGE-jIr~K5gLuTGPzʆ**viFom봱2G7o8/As\T[gMCg͆t֮#:f4eAkeyA *Y0MkHC+Pb[:J磼ttU:+-uTpSZ : S +&#.m֮RcO>] |ƴ\} iDR*<}ܨ-h?7cvSU{>`&aJ/Zָ.9:RHiIs#`0=俻6z~<=;@2%kh j]~ m, Nvz!B-bk1*<S]&#oȃs~bVאF2^uejy32V6`Z Ba AhJ%  ;;?$tU@PՄhAOf5@cNi]bB+:E4-ZHёVb?[M 0 @0{Z<־N2J:%_8m$c:΋\!ң{t]L<kG-fKtMi? ܿA7^M~,~V>|~ y_+l:,np2%OƉ#}Resx_h&2>F@OTx'g Z EaB#g0Ex_Bck2ߺ}{|gZ(MPlT얢mTlYf48;k$OլV@gJQz췠ƶ6abjM[BmV7+Uc@^&l5(/X&jJy7_44z~:YPܭI=ӡV JlfKq6&q)tH})wvy~H{ OwNGͰW2IOA>-P>|p-Jd;gl+eȺVȯoСn&ւjB%f_Zf h(yrTܖE~'Jevll|Jq hoH vQ[\"Mj oӿVâm}M d:jXs,wd .g:~ܙ"d.Nu8ro'y!9EiQi\Qigf^EDBe 3߁*(Hj)|y~t+EB |Jt}.ޫ^Ⱥ4}M~n<1<2Ab8/ǓQ /)Q'}JYO+ڴy;"f5<$Q9V!^'wg'|SyEp[(M+/ճkŴQ2:֠iWns+~|kby̸]&V\7QQ٫re9Vk3ۯ}U^j{ׯ H~1Z/'cf,)7b''REP"[Fjm_I%"jf,u1{m%W@ۘ363ynߴW4p|u͉ !ar-,t@ہ~LZO;gM;) =I]q73VFJQ|,X=9endstream endobj 100 0 obj << /Subtype /XML /Type /Metadata /Length 1388 >> stream GPL Ghostscript 10.02.1 2026-03-29T22:06:41+02:00 2026-03-29T22:06:41+02:00 LaTeX with hyperref endstream endobj 101 0 obj << /Filter /FlateDecode /Length 4167 >> stream xZM㸑}o1cM؇uĺ9LX*%Q&iȾHJU$>̗/UUAXzumo޼U~\+[dZ)cseʹ2Aw?d;Cp:n}]^dfl^SЅR۲tq}oɋlLݩ^{~=몂ʚM(VNús=΃ٟUH.FbeOkRe~<k] _ٕ^#.yg ݡgCQ4:Oc*ˍT >\b i1Λ iGWW%ڧ]~ 1s\{~C[㖽CO6lXL&d#UY˽Eammt) JX=l70xoմZWya"_# ;5ӸnjkreTGSajqzjB3ttWړnq? mzSmH=M q=~#^$E*LƨKfgBȵ%R)8q)R "zbM VQ*ɼib-ZsU-[ jynh_e'eYQOq.nE0yjIТ첥U>K!δlt) IIZ8kWTuo4Z ťY7#-Xha)Zrn ֲZ\SVSI͖# .dS6_ƟCW(A{ 3mrv8@{.C|׫%֑ 7k4̞[ 3F߼5XM${ {҂j}TS(b[p`+SlI_p{yBV*zq6$* wqӬr 0֣uػQ?dZږy(MV} .Y(H58 */t.0)aC8oCL{Ϻ'z6DPMe -/o'A%ޖZ{زb ݌ @N>Th\Yi B=(3nXyl]lY~߉>-F儼r%,W+ᔅT3W/㉈Ӫ-U01V)|ޚ@|bl'~-$ƘѶk_0;}3Pi ԪiDLYZjbQUfaHiH9!.+BvwlƱ6}(6͚45 D҉0:[V@JxڑTx '#!;@ut7Ce˞>t9 Vp]ӑ=n\$ea4O ׌UV ?xj^QERMtrk<.hlwi"Db{ pF~`}4/Es;c;c8[jFn+3~mtdDKKM BB, am|}w ^*Fۯ THf_ +R'G$-HG@DjaJmm'cȼOHA3St]D_ٶJ Ѧ<hb_g%-) (~+kJ(+~`ۦL'$V5~AxJjHdo8@s2$"I+m+KXHA^MQB1J!SK3@ž6vϑl`nbT&~ɣx&dF,G@w"M}aBrӗ+CsӘTarc $))"DpySDP(]2t%s qS9XIk AǞ;ęS M gu?*)| .|"K-͒ʕH G@R%SMhL1շsuW3F±ط9y q~0LL5'l8E>E{&RdW';;o6$eĥJI|7(əA!du;C8NDSR@r~#_}w{Nu ͘ o5BiZZȒက%Es,P{f(P%L]Q7fAdT{8#GO9֑m* eJۃc,Ͱx_2HB)E Kԁc!LrhVsQƑ|)ŲXtAqJ>R#nTq}(Y|Aҽp!$\jǸʾf_]8+h}h}ӊ$*+ dҖvmD5oeB&n:dT=gQLӗ,ܘ fA5Ry7oa[p[H;n%{F#nm rk \R!zdݞ}4Sh:>YG`MƤ -{qaZQ) >xl9!CF&`+v=SgxW)qxR6}dᶔe3nUHi*<[" uv'6uhqcE(qip栯1X׌͂CP@l!)"=&>u(o܂[F 7p0KVb۴L6.~0(}kGZlʎRSѝǴTqQ5ūUt[NDlCt)`aMgFCE;_N,U6O:N2*J71 *W?t}3i~AfNad~k!e`\DJo/ R9U9с+8] mf|%ԇCsQRC{89&Ҹb-JߦE˗f褨x袙S}| vr;ozxjT#C*)Xr<ȡT~9.+z 1g QuD5*.B2_Lr"%,j `rT]$vKR?#"1AH] kSҴ\)Lt 4RPD sclᯂT% u٦тyoN=qeU D $~=i Y u,}.8ENߟ=ӛdFqEXqQ(œ΅]yL@w> <. 챉V;tۧQ6(J/v x+5P{Nw #Y떯ML-}M0ǽ?K?tH8%ј/͋u WW:\?" CRgH P"!Ejw&@V[1D1Ǜ(E18`oNH%[6LMc@ endstream endobj 102 0 obj << /Filter /FlateDecode /Length 2588 >> stream xXmQe}b%\iSCxc$u>w^vI,4nL.gggfqr?^/~q!iui6?e꧱Kjiؗ*]nŭ=8$m_xkH?MȚo=hI?*?#.iE,_A;xh;EF"W^[m}WTvTc1nCL*z 6 ų #xX{k7?ފ‹$hRCXTyOe oſ !*E3Ǧok@+rouP~0Q"^TW#A SiV?fyqYi0BnsЄ~43v(/YɳXdUՎ8]mSKZ2kT:$,A'oMF:Pe( "o׳9WWr| 8 k?)KpobD|ZE|O1[|MY mu4QMg[ӺJ|脩T1~q~Z9%tYGvVT~˶lWgb ?)x8Ha 9 Ϩ ׵8fP*U$z+!h7=3(Ki 9fK샧ͤ7:')>{ ZAlr@/@E6i)zDz" XCS{CeWr# )7U.%BB^E}0.!A*vِ!9*ONeC'0pKO\HHxTo!M_={?TfeOD9gCƝ L=\>2r6Hц' FD~> ņ |1HPk/P.)b7VU}*+ da1/)*+)X?c삈!h }%=V>ީ)DpIR_*¶H;, xu*Q!{n|-F"Àp#.EcJz>1R=?D r෬/Z_(8W$~S}e@h8X$2,IqH 18)y]UeG?֣He֟A$=mJeBюKA;խTgͬƀ b*N*88R е5>qH,0awlOIl*zㄫ{jrb.$QcV:R7Y\938/vh^cHSAo{#Eib&;ktoVUȕ5bQDj+y#A'%@VP͇I&#NMڊ'l#&3=ukTT Wqd:,fjG'f܄T; (gи,ڊ(1s7<^]4r/ Ƕl۶vefa_拶Cj?|b.樰b\r1>܁kXKw)RΕPH8cm&T:5#G0pڥֈys.`~%^Vm29/&ѴXluW<.'NI9QH2h@|Fkv8b,VyT8Du}+#hdP:gbԁ](J$ȱy tx7N*b=8n~!\Ůľ 5yW/! &&־ rR?I Ife [endstream endobj 103 0 obj << /Filter /FlateDecode /Length 2084 >> stream xX[۸~߰tQЅ&Jv[$vnw-`σbkl4 o9TFI%/O şߟox 3oo^ast'j'؂qhU bsْ.)OJ);I{)%2dGthViowK-6gc[R4ZH'iڡ'é7FNeW"K%yi?L%y8'%~8Ewwtk_yi~JP ?"PU+ϗzc4J?Vi抂iʢ?l+X}ɾk})ٷ]WPM\KdT=,%xB~A^SaL"Wg9֑+#9ՙ.sU?;tf^ ]ƁCe=&$ϐMnXq;RόS4I…4'Ev]pKW5| ;2f$AJ&$Hj_2LDdb́+Ӌobw5= +~gstAJNVd3ٝF +BV).M $LLE:"t GxPDj@cn*N3K=["Xq5Wȅ=‚ۊUdLVK b<̲D@d2jtg) : Gu:5[ 7A<ɂ= 3NܘüQ VMcf9PGi˽A= ;^8\ NrC -] ŷiZl<@@<̌Cø`feY\4bgooiL*geBN>Ē$+0lPSC{,HYH:69×DeFy?^Tu.DQ'8Y"BJ>T("/I62I!>٤F$o[i !Ŀ\jv]CB#xKC@!QVpkiN#kE!ѻ\|f߶ݡ?*|o@ o_O ۿ Q~6u (D}n@{T6+_\d_ LA8_ g;%Ka0S-V]=\ kk.?bG1+bG~31_T};|6cPX?^}M.pQln~t}鋀)Sw(ɩZp'\* Yih~^aSrlkti/0S H#S$fG qOlz)089:T0:{5v m=g^adem.w8> stream xXM/0Bml)q0L 66Զڭ%y${ߞ"i=)CK||U, M3هyi[;sZ#|0|΅JL̤\ݱ&K-temfz:TG"K-7𿘯`?M,%W68suSGڂ}57SSv`UhIEj-0R`x\m +)xb>SlSg]]-]>/XחheS5V]_6,=R(f8Of9wÉ0W8B'1`;P>4|^mj% lL6{zTJU(6vu&Y2ZYwl;e\ VDdД_d\!'F^'d|z 4]O`t?|&@E/sud$[]8/wC!#^1I@~co[#UeQAZrZ+Mƚ 8u. ]tʉ~Dr$hC;bB|݇R%9] )YCiJDnWM\G\(b24:g\M2Oc$]C7t–7MM!ϧ@ AOYT@79&.W9]78`Te-]<$/6e>uwtގ %Fa}DB{Q)&Do^ݎth H)A1 !0qQ{ҹ{ jDQTF*Rw i'{>{ RFUeU$䠱Թ"Mz-i+wsh~sǒF C;Edve9iܮO؄ (f jn5W~:\-8H)..u޴~?ڇڥQ* 'p8_'bw.ڞSCsj^PS۝-!m5 Qcp32T@x>zVq_ÒU7$>5H :=}5]gNń^i{չf&v9|(#tr[*t6QdH [4)v7 <n?3z4 )\Yypi_ȪQK8!\?>cu"?]#MB "E#jM-O%hRyi w<߭_> stream xZKݷ0*)Yvb-mYmXE 4JA~v14,)kK~ ~3y__׻$ݽ6o>}ɴq_R]&U_z2ϳ\5{gq~QuVy> kn&h+J)/ڎee\JBFUv>ٝ>G!uM(2*ynZ>UxCZ P =Hq,7+qae-.ajW4en3]8Jn5ju˽{Ů~RE4(N Q;irl8[w%l$٥N sNTk b`YVt?tzy Y d{ҠM?($#0J&)u XD҃\z,] A@-1εx[qĶl6& JPFe*C"Cq`Lc|V>hzb״af}V >D?19ͻxe8Tն6vx ^0 fSiSW3;r݇_<%&Qj_sZkMRwHn*M tH m>p /V8b? i :-H_N A[Ϧ);szS6DM8ȸ>If['6ʑWGү#혨s]0i|ȓPJ'A([Ȫ J~H5(x|dyEGBY)sdcn@VPq*؇*7_!=1M <1'ɜWS@撌\X;i+UiT[y8(L!7NĜ":t;y#w `.>ӌ%$eꑬrI>,usH̊USmx `d*gɿ!t բlh[@Ms#y#śPf2jS?KYabp}tfQAb )!ny2$r]h)aJ-eLpyH-!DIඊrASn8 `#Q*(B% PC 0}3fD)z 8+=D}ҕOU"٦"'3/)g džbW(2 ˱p$!lQ$mͭ,j|_W^L]rOB26ڶjF$O*3t9R1Y;"$ p@N iŬ$3m@[Y` 4сO3xVG`v`gJ > -5K9-R3m|)|f[C&%7;n>}[iJJ15- &ǖ:`q5Xm$6y}ۜ8;cN L8tU2Y䰑}Z:ƺ. zHN'{6r2TJڋʋ?NQ6'6 =cXb݄x~S5G\B_*@fLG0&c"g<ͰzTVN.BǤ]S_v'*'H,2 m=p@^WDN"fkuI"afj]Ad{š9EޒGWNVbT(rS-9˩AcggHs~E ޓ Uf:YC2r-ߛ-˱k.5msе􆉔VE<+Q^@RVPjj e[r|hTڋ*i@1L?1= ?4b= EkƘ1\~v-8cH\D!N>U=JhqH_,zaeakZ*$S1[_6[9*r= QK<AJLT D)-74Vu_Ii G-A j 4J0H=0j> ED= X ;WO`&p8gWZHmZ7qeQFR&G, VbB:M*ce3bai{=khU[*5AF-q'272g \HQŨ7(D6Qq/|L;1a~H?S 8kQ`N']~1 PI,^dؗDu?5( qeHdr,>KL)Ay=3͋}ΖW4CzɟM]mKlGc*K)vR dslXy%yxT]uZbuާnY}=ɞ2dO5p%mQlNM/jJ^MnqA|,oH鈏\R^tU=o4 hτ.ЎBm_u)j,sʫz:[l#fFAǂ[,]C] <Px}(qAgzmzPxtl T_ddT'~"HlB`0:hV&g~> cGw:f H>#K[9#`ӧ?YR| 0z@CImVX(,~ $$yh8;#x7lQ9$>4:ps W@WUOP!Og<֒rWFMx83 SqR&V쪶`:miCX m&m * j`isv(bGx; %7~;'"_d# mAx""ײ䟱P87.⿾y>!o(T$9G{>LVU?S; ?ܤ#.-g_+Árt14K9 ?vl _}9gwIմ;X($NTv;Щ" ܕ dD.c{HGU̪GȻ"qendstream endobj 106 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2349 >> stream x{TW'rK%3C=Z]kj"G*y'$'$h" A(lUZ>NўSWasnΙsϙ3O@ >seF3}>08HBBlo{^iYyE 0=Ou[3̝IEQ BB,IkA.|p̷q@xo>s|0GzV jȲ-ʭ,-Vbȿi |T\v0rG)&Ѱw-̚DI)CtQy3D8k뙪x'|cqg>}fV5*k<\Y$W (!hfvnؙ/0Vt-q_'?UwU77(EA'!w>xf 4٭#^_@Qδ-54qWMTNX=IS#3:ГKS?6u:̿ұ:В5/g/)܃\NEp^Ed~2{C>&-=}#P)8=r}j. Ng!.')kEڌ4\pLڰGKUw0C}2"M?±i~ m+41f0ьKmL2Ѯ2נm:70 !S{~3wGLӻ8?7G|+whh+(8rbR ҄ܫߗ0vdE#@6ğkMh5.;z=L.P6ٝś$\i5Xy eUi2;9B[Qn~;w'JF^Z4R|pPіԪeׂ4k?١Tz2HšP7o07t 7_:*ImVl5Zv#ɈꚬMF屹嗥W/14oaD.Gӭ _qq܌e x* M#u۝j[BsK6v6֛0A/?;a`S.=L Ym[#wqA ʠ[ҫ%6?6xNa[3ۨ"4ѦΦO;ݫg8&&CC=4:wj44+f`d%%zEem60UVy.%/b_^BWA* [ckwH<% /_m[)_^[ t|~ToYG- M.:5kz5`%b(Nf(;y#"nJ$UU|Պ:w-c8x F37$^ZFlq%3.A#SИtUw_>OOBFOn{©wx +x> stream x-{PTuw/rF.VYCE)i. !;,\a#c8 S j&`ҙ|p.pn3s(03b? ]uNe *y>ꇳ/mɉʏ.MpS)+(7 YK֑$YIB*Mbj5Qu #0*E/;]˶?ٻ> vA${{:,iG!wd:gE.w׶wGi'HmEUJONŢJ{ѥ{斄-,a:Eex<Չ@ɾ\slOE)㡲k-u惩rEȢ 9 jij/ w>rQ |]umWڤEv->$d(v}kf/=6,Bw"a!ysPJc<εrYhi ]jM ۡM5V ܎wpXkrȯm+?\k0R=8|<ԋE2ШZ}Y q_:-;z[NɜCP5Vw,SF{b,DC'io.o); yq\Q)9}q|*W0ug[ ړU{ttŋǧE5 w #ah qR#>F&]ϜѾ;ysή8\{Q 5(ԔƚNF+۹d/{PL")Ds/dkrmbr~+t7L(-K[+4җTmLm&w<$AN` a^CsgwV>KƿR`. H> stream xViPTWM﵀2y=SݒrbpQD(Ђ+*H$1b3$T4QPш5Ls;ېTff~̼zUos=wwΑ K $HlI߰IZc H噷O ][nݶln;W&%o_;sOdTOLƵ~qO^Tx{Eh*FӐZF@(QZeh A "wy V-@^H@J[$APh&y DXtN2O*)1YLcAVKeeeRPUpm.T()WZE"nL1cYj=zuuuFS.WIT0r4 {ԥqRMaWbz/Ε*DyR a ۼQL  `zd!Oژ<-۷/PJTd LI?.g;*y{CMGmbkkXnE{x͖E^GNG!!v`}Ja3 p A sslwP/=rKMR -a?;Rs?zҹA. &~Dꄐwwә{y}5HH JqӖмmYYL}PGV]S7V_>KUVVx[QaZr`ޘ{*EZXÁ=xC墴 y_Pc֞FIH5|_NwN)ϥ-2v|77vȗ "^t"FԮ;=+cPP,Ne$ a$ΞmV+\=J''֟A:iwLjP5R6֙ZEd3?|-|M-pw"šLyxUr& 0!H"OnT|6:' $d1\+u֤&ͫ˻|SXⰺ8UͶ3I=Qqfyryr^*x_%10ڶW o\3KNAB`0AkA-sZ3j)J>N?m#d KhU*vg[>}Ip1X6mu@"s1%t3`:LLЎuuIJ]$I✊Tn~ QZVp⨧izilqѩayj8VW`Q; "WD/D?  R ܺ.%I z t <jdPOeAf^r@?ra/d0xw?c/kqrHszj2Yga"GO}UIIqb81\eķ'pn)=y#_g$S@Ciac\t'0dUӿnN Avtܭ0>uq ~&, Y@<J! :S:d6 d /C`d1Ļ`<֧VT6V7.9S8th* jH.Kvފ1M\.=P05g7Ky3%m޴-Xɵ꼪z,o;6'/F@w-X+(`-#),~Me,> tV3rTC9^U[j?bkW!ܦR*]LD:S `%5}u[[iZ,HȬW ߘ;O(/[ȃ9$=6p4)Yu[V蘿ٌ6VllpXl3endstream endobj 109 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2199 >> stream xypSƟP+ @ $u o,ƫdG%˖7YF^-Kx;aHSHLf<34 t:λ|;w C [FmXhG8p[CaƇ8K #!oN<3 >"5iu)!)9IͦP[שhj%IR jIR?^QR z,sMh1DB3B Oz.?3ڍԄgc)?H bi5XE1ROGRyQ K֣ǏmpԐ][YD`t؝sMO:ޡ̾ '7aCzfs}5ӘeG$Y$KyZv6UTjqA~2B^a)cQss"=V `QGf)3 1NY4ŕNp2fauG Mo}K1gVѕKz..&/Q5NFbwd2ڼlF[#QJ?50;UqiZ bdvy̕[h{;(9IdXMU5<zpj9֢K,)Ev]S+YVlGF6/ pfY^pn­=in> ʰ} yf6ʉg1J$\ \ Oo7PUө@c΁W,2!^2 ?ʠT59,wX g$ 7oV˸X:^%8} 籙X;x |SIuqI#NRpG2$yT ٠R5nd$4a n;8ʹS'u( gkwwn]{$"ϔy,E1n#Xm[zߓ\1iKlE%O~Ǎ/^ܵ~VuDs O2[-EPmZ._w0Oä$EC<$}Opw:{p%}>H=":oH'{Ӭ,1m1{PɄBnᢡQՕ82/po&*d] APġ  ӾS"=?%! 2R xy؏i$4z_/|/qB$Dgm&Z l]QEC&O:_PKI-nm`8Mt,:^?ujꤌhyW J׫R>OQo֑uh]VdN޶U5BJlV(6I$zo lD] .6;k?.ܪl{JVZ̓YWQ()a&0Rendstream endobj 110 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1460 >> stream xUyLTw.{ ukkmcL4"U0UPʱ傺o(م.{ȥR )j"( MƞImK$tNI|g3""\LDi)qIׯ^x?L$J`f .)9w`vqL/L uW^C)kVBN'fs jIPDhH+_Sϒݔ "bJdy@ZFL?,NQϥp=HTrh#e@1N j:y]lLw~}c,->'݅Q=ZUv2Fy̻(")kvwִC;J?kP CWم +݁>֖ޔ t_seKJ)u'?qh7(⚤ 6L[]κ{#4BL,Tzs8VC7gA[r/jGK^i9sMY!O9<:J4 p/yÃ#^b+mӚGcƢht{t$iNYѢ鈩^BL"8l0#˥jp 3 -7Խd۷5B5TsBb)VJxɗxq&#e&ht&0JEFQY벸]N1N: rr::bi9uZ6_JGq֮shQiRѼPF=tBSDGQ9xqZA :MHF©g$ST:8OuyxɞTd6T(9E)SGE>L rq}d/gn薌'a_k Z̙OɂCGKmh8s-5 ǾwhY(nX.7" 0+`Rf5Pk uTGi8$bk٧Δ(fSESg=YhH&ָd{\Q~*Hk,Hi w9F.u+KKrbD[h%FO#Ҫgx._ɯ}eP!hRXU!-C:v [sބ 8^!R 0QśʴGjH/k+n{?Q~oBп̕/]vh :(Oʋb%JR&UTJ^p@Ȁ+}_|ŕKCt5Ϗ6/n,476> stream xmVyTSg!PPuۙjeSE!JAȖBH."[a ֥V:VKzT)1yQǙs䯼NoP.@ ~,珉@5j7)WF>co>1r~&HHLJNI]SuۚAqϞ3VRT QS)_*@j1ZJͥ>|ԇ;AqD~TAPuk$7hΣ2L0ç ?fb䜧fK$R:cͣ O}8u=+%ZZ|0#i)j" >g]Ӟђس~)="F"׾ \",EFfG^ d&,i\r*w۹3(t>2B?^T Mj$}4םU_V F¢t]:d04jG'd@4DUdmp@y~Il7l=H{[l5P -|q pl`8t @} Gh+IT~Iޓ!4&WePIZvZ2n *zmWfS 2[wPyvbka$4=R%()PgsĝBm0 }~iyEKL#!Ak#mqv Ji0 tzo'c$J$6yԋ (~~Z~΋=l]6d1R ^[p2->l'1~΀tRN /~4hRN> ༥n.앉RҊlcaUJ7iTW#2Z<ŷpcjX9'dY##|PzuN' ={v$z TE?L&A޼mt!*õ_2^!t+1"z1koyzRdq.{,sHOҕP^s'c6(NswɔR7įZ^Ey +`al{q41kN'uƞ pYXn*kh5Sf'*hL! 9鱊K"OK%bl:mC"q̒ʕgCP-uX-8] UٛbB$. aW^olcƒR01feQ>/ʀԍ7ƦvF{ֆN޳̏st^FѭaCyoC\7B*BZp>K }з{'~Z^iFOy CfqF q};!4@V%F&BD|-)a< ނ [-H98S%x^TQl,Gj6+v 6"19vꊋP̘YEO!!HF0W1kinENZ8)MqsU|]xvJQlA0wE ?|g2if63W_G)Ɔ֓}Yy2$xfŷ[1%~ouccS<0T ]ߜ pApZ-Ry]s0W m=\103=?*q eM:uF J&uw޽ջkm ۶e'MFo@a3_bc1Mg-@0Z"nlRy ;vnhvxOqVo)~cnЗl IU#kK Y[Ά@-0&=,s9S_a(0|Z(Í喥"`f[?OmaE+D$JC5ٻ?уzS|ʴL:0u{ &PDHtF"/m{6cS3ms`OFu k qqɉb| 6+bM+˖4A?ŅK(kآœ=E=oRڤ1)d) Պ2eIDshz`䕷oqkԏS.gƔ,at`h;SG$mnUr5J%GbhTbf_э=۹" fJU =C=/ Щ.^E0fnc+z6`$M*,2Kdr'32-2;bFDb+4'>o+_˿OpʟuƝVYoi#, ~BY!cd.}C|D[uک ^d3 <)%+!}~r^7noE)8B/$Vko%o_';VrJV,NVo0CʀsԊC#LP9󵐨rK(ۋx}@kZVEvW%o8>RN|~&#:|!¨75طў˺Åe GJ/endstream endobj 112 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8673 >> stream xy XSA$XZ\phjkJjy@ 002;D˜@ *T-jk繷wts}sCrr^k}ߵNѻg/2 KBƿ:Q_$6lg >pr ,9;kNܜy   o/H/ܱ49a粔]+RWJH4)Ͼ6uF?1^zfgؗ_8K#b$xXN"V*b51XCH$clb1XO%yb>K, ^&bbGL&b)!BD1D/b01J #XIPDb8A'2',b1xD#K,'G +׻[zꭏf d]"K$^}<}-wɺ}8({jS"كڧg<,툙2x!!C3~2♗Q<7 ?[>/GFGF܌n>;zoO77 C 7"9< `{n7pZ&n49@PP*Y]̩LBJCsw3`(rRiBUY _\=]rRVYh*J4=!LQ rw-6| (t7 /pl:^`87wn1<+#iTOno C9,vGVqϾldj-`ೲs4"A!M`)XM@? opo ṯgno|#m(TK:~"T%ry:xޡcpW(4Hwc҃!6RI9#٬s0b ,B )z}@ 5zѠ}>%U4dڳQzzA\v2`.F EsdwwhL(B vJ<0=+s΍oV_B8cda'8ns[ՀB+h*ڀVL\7m3P.Mo!p_"\iW V}?)=& (ꤡR7Zn7\|&p 9x.gk@ |EBP+CHTJːg& ,!tXF T[5h끕{u[zjqP^lۀ?>,pc@Q;5ܮY9H?{)MzzG.iTH~WFC)4 K6J_V> !ȦC(>K+yEdzLiH`la3r7hVJldXDZl]|@̓:V~h[ӐdYc@XYPi Bc릞u)GbI@^l jlz3WOU"wyeE527ٗl͚2Z 4* x$uǾcwBd1(j] ufOW@o&6/U` :YFl pIgǞ$R[2_x+tsF=vjv(3TpEj骬U3מzX9F+AmZU[KMeu|BUԇS*QܡߺVvr4۝=fZHaY P䖘)(C֫>ȁL?P f( 1(f,[!q p>B#`<# RnՉGW@GBl~VLJդpӘ1KYplk6z©U~GƗ "v˶\Io&]?Djy|A꤇޽G%*l\+vwDݴvĘbS>nPq,Sss]&Syd>XlY򜢭b|(2Z4yWr/ jmڞ<WI؝jTZ@eZ 41FU.TIj:q{QxΪa 0[' |fg8O+nZ8?"M+HEgqp}GjZ4YRwklv^ _' M}{%^dzk>}^E6$ab amzaJYD5 & 4 Ƭ+7Ph5 Ď.JOu.-+-wٝ21fM T@^-T@|^TI:v@^3XmV9'WVmj KWfzNaR.bgk.ApW e> X\X9^A+%Yǀ 1[otWGY sa'3+H{7wMfz[N~z0 `c̖Q]2[:Z4.+2[}zJO[|:"^&M @R(E *S )W 0 m`{oa >gc*׶)"~D-3XU}9WxWs112h[}#8~`P}11BE ʮʯk(VRvUr,'O r^iYGƼMmQ%JnA/R}_^Njmz>F]#8A$Dn^f0`OI)Dђ(,.2Rz&߂l K1In"&" _盢3eپx_hrTem b(Eơ/'j 3%i\&`\:V<@MbW~TPIc\q=eRN,hgM,?9q8^L< a:I 2xơ[ LZRFHP+e9;fnčԦk:(y_ O H۩4iZrrٺz;n[ZlEX&E^`iy.ԋdzHpm17@fx,_DA$\?/ F&w'5:UP&V^a06D44߲!3캤C+er:}FL`Ek;_*vm~*&;p^)y3sټs' zG k0.az84.FګzPIN ѐJ;ʂ!GvBurbx X#4 ̇cİ?vJƑ\ꋀ"a$Ft]t`P: q) J)dPMsӣSٹjiȧr Uվ#c}4Zx*<QL_`s8Z󈛣A\le5M *LUFpE׶џiJ) E,Hݺ\qVW~hP]8ݦoo GOno 6Rs!+&TpS\; ɀe ZL]Va[fhYW][bU*%(:/kWj j4=fPP&W''Þ1WWŦ3shƦPurϳAL&ɓBwYϘ=hBu/t >߾X]1mzWWZ?IC5|3ٚ2V~l$Ҡ vϛӦ&qCuMwc]h|d״ӂAYUp!6z\P? ;?tεvS^`Jq%E|(*$wc7NTe6WN^La Eчy;{_ ӈFi ~&W/bwXx-j6ѨUJKMȜ\S#K" druP=ߟeCwA F o\QΥGnx^[Әk7/lb  3HΦKJ\\l 5foW]ϔ)ϱME@LvΔ_< IW;F:LPrQ64*eε:lN;ttNGs> Z@crI5R/R\/]y1p募a S]!?57EG,[gM iyT)%Xe -`H6c nu6 暙@~X7 +D]cngX ";П7tŮ"?ݗfKp] ҈1*ֆ_ y"ߒ;x V0SҶuhG3tFNfN 璿Bsk5ѝDO b|~TbηGϝ@/F.Wb, Pb}10+_.^BHB)KRc;S?d$EZZVg^ YoDZjn_9u'1/,m}Wӯ.m"9KBVFi7 $h564mu$`Mr[AX$_w{G{rVK^LW%Z~Jl?×LNђʳD>Ҭ밝&s Ɵ a|>LrwhiP:S"e#ϒe+e{`vOR2pՑCV32 t؃5i2e$K+Ibѕ]RD1}}zfxlG~"F3 !8$`?|whA8bYyDn1BnmCm* q]RSJqh84r<!)q2 8ϡ6LF=&{n( C vC? DZz+`^uNv^~sLG6(HU~U@On OV+!ޢ13< lI,jڤ6P:`qVSmRnR:K]>lj:xtn 4H.Rh 1^1`x"%D>G?\Qm͠:[k-rE99բں; B r4=SR{4A}-. oa ^- P_DL= 8KY 3Ɯ#?ICI7u'U֚9+go{c]( X| tU[.Ήl &QSqͰ7xbߗjp8޲8U=LSr*ܣɞ`%z(G=^~:S:; `2Z /";w'9|VBbbWJ4>)s\e[.Օ5fFxdp,֐: DrWMҦel?孜Zlnx ܦNoO_=w[Beq-.eO\ ̠xiܲRd268TOڿ[-ßRO)W$'$jnWo?O)8%9 R{:qjL.޲“,WÔA\@MںUQҒjTVZAVq{K.n Y JJSJw? A¿1y7;buH"AЀuh@Ztϣ',ZlJsp@:| pdoVڬzL{"gn4th)vPHIHMc:h*Qd8b4aYۭO*WWAPG}q'q \١꺠< 6ct@SX%5./h`#WP?O,a\X--cp`^K` b!:o)'y-?=P.++DŽp2W2 7+,$+BXo9}πFQ9ܪoyH[sB|9}.L<7RFX3'!Jb܉c%)4,AnQ -UȵaYwsGNڧKd2 KSaњu%l\z>ue|߃_ 5>Wj,'aNn?C]sSNY<2*KYg5zV L+rMKpz0\{&^MsWCf gc!D>[9Vj(ҬӹCpt]p|!7(Cj 3ċzGvࠎ+[{|MkڰcG_7 ې 2(t!^hYs .w"? K="w$vL.zywthm|%sƈc?-F> 8oObbҸr P g)6Y$2;@!ܸ}FR0j(j 5ކ:Q-Oo-̃ؽ)?c4{wp*~.aԅ":O16`}sh1˚8 k33S83k`~MV x#`ڏ!{[+wjѐcO¶uu5 !A5h.)I|U]{R*BO|In;<3UD̯ͩmjޞQRh*f X\& \\%emFiʁ(D}v̽`B E *޻kđr }q߃I'E Uf Q|9 ˗&槬,&gd4C(~d}zRA+,4.>ٯA?'endstream endobj 113 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7716 >> stream xz xնnBQ4e@U*ǣ ((2Q$)!sz;ݝNyH!@ `dT@=zTQws r{~|>Bwr=E}b?d$i`\اO^tw߃/U_򄚉& %VL}ʙffmQܲy/xz3ώ81_2daßx)H$#D1KGH?8AՃmPC٣gٯz.yPGoKzH jįna2 Ko)B}BOAza?R-a*_[]. hc1_XWƨ!~[ FnםT9XbC*nH7l%7Aj4J)F DP^/+hftsy>4lB7۝OAeׅT:}\zwU*(Mh$h qO.@σx R/&E.xgɐ7QJ W%k[!Ҩ8U7uCLEZ<OsNQt;#CN,)HdFzeup9F{mbtIg:Փֈ֮RR׃2ч#Psw.d ;5s9A!N_௔l@#~WInv@;u틟}9e7#_|s 7Mgݹak6, ) ӎFCn Ƚ3PnoIvjAJ\a[ch0"O6 HmG,zL¢Ux#\u KA>-.|?lYh ׉CZ\_kŅ?/eۤ{ ȿ^BXZEvn@—ԤG?gQᄋKd f-,,]F @&%z!KK$Uw%P@K|Vhx7#z&zrH7+ $~h zjߟtޕnt;}h))D,p 3 ZQ@&5:XiŐ`zՙ& 0l C υ+`Ú*UDl:Pp$u@ӣP%[$Xޡn$U1;Q[܊SuY7k+viZ-V RVAE^A6Qzd :sX΢$v\Q'i\56,6l,=!xwO}IdZEMvۦ&K [zKp+׷<Qkƛte]9݇QHv2}*iv}PUʒs ̏̋w \BgY;lM+^rl=ZCku3JǠRI Y*KE‰uDLZ֬)Y_ߢ8 9 ; =\ ߥV@j<"N:I:qBN$ZVƖc;s:̨pW|fJAB ĢdB2Ak0 T_`׸aCѱ 'o,vF-$ƢjjɯYz_A#0Χۿ]w۳&G M ɑorNWy l(ĔQt$K=wmo 4KUeø ۘ Vjl t ̟N" ulx[qt;yy8=:0R^pNc%-7KdZFTR >],;>gbG)̏WsujntC1\$eY}tRo ua~D\3?)s2#Ƿ.lMdSvknڍip6I™ٚ5M+EVeV떆mfaG ^σ*XGpgP}H\寫#QX M,waog|GBS;2TT*h98Q+]OK#SvJsowBHul)_=gřY,uIILx1|..[D\7C:^;i;?4c3K.wg=^*ղb̸$eP+|@5EY!.] 鷝.fwsmM{C `4XJuE*zm^EҶ5b`]x۔E6ZMغCVWf -I9mˣkW&xM+6ڨCG` ~]/Q.-הV7*Pom̴{ۋvvvdlJB\l|^f3AwNFf #)~>Qxe8bا;4imheJA|\@Va\m*5.3/Ńˆy3߳ KYn6ea<5RkwB*ƀ&(ZU)j{}0F%؇$Ӻz6PP qcͰ !&qg>HFan(5jY$8nF}w HNhoA8/ӿ ==$G[@nG0ܣ@&j꛱BFAU )amc9%ߧSY$q"ݹEp`a;:-&n Qr_0*SVU46(UM UC2eev뚌 IJ ,>u膿nQ,eЫĊ(<+3r |B'"ɛ~zXbJ/*ԉ&/`ަ-HrԎg523Cݰh،t^|z/ M9 xӤX4`8 YŊ1ZO 26TY:\]ȨO p&7P,HzIBAc.PnH{:aTgY:.LIDv)#ب Ztft`ڷ'ѐc9{o")HY "N()cmce,nA)7t&P(UrqP}vNgRN >K<Ku¬$ؽJ=@OBWauZֱXAx4aXn:b䊥5Ro$WRyUC|נќ|^\""H(HZG}R p#i[l!33B3 E)r NgB?6uxU:CUEX険 JYq+e?UO~LB:ٙ#i;^pd?Xͪo2o*LzލՑ;yGd}rf(y WuheZdYg6ԋub1Fs>Fg@97﹓1&RXv*u}˵Rp}31߀'{'OxcWհF7xxZ$j!OE=G}_ȍ'\Le0 :]@ҶT}k4Z]ԍK>w L0f*8DM;?PN7yIݱ+j`sCS.=)dOF <;O8 .FG}n S) 8%'Ϸ>vtѓG-3X"N1_=Ӈc/2jQhaPA#4Z êjln~z~|"nc5X x#(3Nȍ=VYPKթ&m`;uGu#t rN/ǎ;tQ]ɰ7eVZ0A2S豞 XT$a&_ ҆K ן4]t5Cםxu@(Wi;Bn%#sC螗> stream xMVyt$8HtbgTP+`֧BQCp ! M6{;{|Gv;&@@!kԃ>ꫭ Y3{|?W6'ʚxe˖e>~u{`~̟>t~\@cSsKTV,_US mƶ`EVۆ`Wl-l= +` s\T֊'sVe  GQl"̘}:5[z.nc[%P=hXkpW"s.ju1%B+uoWK$W}q͑7ԯ#MC 48%n<șRnZ*{)p %.t]gSnF{F7j&~˾̅.p-?,^ŷD }=c|^IU˟zJ6ON\G/.LMvvFrc;q|Qmpp"=q+tݟJH2(k~ L]&jvH.`er>S%]cWY4JIdƵ4ePOBҙE<øX6Vq(isbwsEg:DsVEYTVV*$J; pž@jp,Ǣݱn@w燎b =,(]#e쓢6FmHT'=7JTeOY3bioDD(2n{-ba#Ȭ[i&Єf<)_{ZtK>; i 0Kt=-Mh5WHN}tez:r[ˣ{: 09vhaV@4!}/sg /o^ abkEw2۸$sx)v.YMT>Wb"eȚ#"\n'{@G$$눻;X; (@A RnE1@qXp?;X ,J|KBfQ V86:MKrfBiٹmFdt|+6hYd+ #3SI_oxu;;Pzt߹I@QVIڢeb*oMsnn;NB P'TMpߜEv6O $? N9ܮ >FMTJDH.$γE@tQPKuJh*?_S׶Wv3=0JS\LlXljRizF#V̀*H?9=wH,8wLgDE3M~- |WXY34xw21G.ҊWh6yƍa2<ʦrN@?Mf!]on7F.v_N d|XTD듦 +o>c BJC:el5''9us;v"a yfކD*S Q]2>[/}\A0&L?`'L G2I'"zYM&!Z- {@qMhbd- m3t?`{f'c_͢ gzV W~FK/qb-:ޮź]}M:ҬDS#x` ?|(IFR] u@ IJqǑZy|a'\uڗ5;i+mɤ RcIJ*w+KZF' ]LݩUᗄ z]dTXTp0 iՊv\-ʰ&ݕ&fڈ\6v['dݭmp[DEn]юbvBIo)@,~y44C+a) X\WH${g%N|B" (,߭fQ;ldËa};MLh@a'cSw=^' }vDHZ㦅e~E1bw>G}Ue >u) xla@IxɏCv_54!cqblQBWtW 6/:=ngue"’ }tk !w.=qoGdDzwlKѫwfLhܖSYl"m \5tH:@eWBq;rŰqendstream endobj 115 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8508 >> stream xz tUo"(MK`*(;Ⱦ*al I:}߻o/%KADEqaf|żn%3s9&=Tսw zΟ2#Gg׍EO!sw~G!Y2acSD54%oJW͔%_3{W.ZaQsϿz塣_yüGƕ>'xճjxC""󈇉a|b8A,$% b"D@$^Å xD@Cf_zv0"'5׹G9w=oR;T!Ҁ`}wYCo 5`bܯ[8z/>C}1tPCyx?gF0B{oGn? ~=[zv z`5O ,BCE@,׉%Q]K=^)N&4FhJ{^GÏv{=ekd#(z^T\Z.K:R@ 8)ir.iSxJPH}0%jn/b\R@ƖP 0@R5ԧ-qzXJ#M4p"HRux:GK^IؔRWJ,bndK,"&*^ *L4y3 UHF/4vSilIAp1\!]UC)wP!OEC'KRKf I+f4-&vQhҙTjH6B+Xb_xpm162 C ΰ T@Hi~,NSdCdRlErPOWOX}C:y2$=x-Ht|drJr//<]E@&J| zgo<5!\g&ΡW~<KMUQhPj%:E$e3̽ytf_?rA_QUZ# ):vS%@"tYc<=lE+P?b˧voΡr6/Dg Xa/d}B B? +o~f ɱ?=s ¹b7CK u9T]}\pBׅQAgo Z]~A"yYb雲4j`#kOM3sَvyV'h\wAB(4Z ̟Pz:T Ӭo% ]s@Õ2*B.;N#ֱ/άmҭiq;V;МVZ-wte~ha`;P:K~YY]ibsML Ёõ:'0A; ra؞eJfèg,B`acm]鴛s\A(N*b@a)lHo` r Nq0݁.p( {7b>˝ :1)91S/챒5adkgܴO5Ie:Jg)4oU+V \$۫9JbЋvTYqRR⦘ͮIUR)A]@iR-FSPO\toO mm!Gs}J-Uz>|yl9b]i[oչmY|G] 4A* ._;9$'B1c8i~WKo5V䔇˗JP -FGz}I5ZWvEu<6҉@u9t_H=֦gJ~Ψ+GA&pC#V3Jw'O^8HXK :L{0s=Mv4u6GkEeKAerBOo^++a'c#lhߵ#S,aE@hX5v ??s5)gp%ՓjzyEIuU#$Q:I5ied\M&~WΠY)n@#sYDM r(-gO ijZꍵuQyHj'%in'.΂Tfi70{ ~WȤ2$2q1ŦzEX<<<KeMMM]z-$奰}v5-ʨ;I]:wy4? }0](tJ,VAv!eR)VSy.lYRwq>ܱ盃_ /t mXS!?n,DN8y !8=! K5›;pWVTMmzRҦ~{0IHD2:@[74} cŖfgjEtvtDx$񞣚fFG;JɂX&^3n{>]j0C3tv-eWndKƟ[~p:Q}о W;@*(]t5P9N g] & phOEzmK{%$YEYI8!DH:Pߢ"VŨT*v#S ZM!I̝eA$eM\vGQK{='}gQ_w@klڜx*iTWJ#&`>"Fw9E[;gw o;V?N5G[P; YZ.@>- "Ο|r~L)W^Y+Q򍆍|mK\TfT^q=u&005*,E0R$\΋`*-/-L&&K{?v zN<Ї8&^h JsBѲԵ:Fׁ3N-HNRV"hSwBI}F ਇ_PiTzo#@+t] p%$zӺ7 Oh2 [Ȥʫ Pg6n0,I & Zp aq Zk+`1{d & -]\7Y2ܝ޹e ,Σ ѳhuovbßA?lѨc{i߇#*S+VWArÿѦ6 g/^3`ǔ~r94GR8gܭ)BZ-UTq`$I<"ހiY:@d//.ioj=nδ )uUdV *ШQc̨^'23%~'Eaqhl$kf4 #/#udcNB@U$]>ZkʒSػFY(>Ox1L͟~裳RF։-a΢bIXon:+9vx7q,<)L԰w=q\rGNI4֊6Pf^hi}?ɝ2dѥؗTbSTiMw*iN׏٠DF@2Nt:G5qIQMnF|G(vbZOn5ФJv Z|f'p' =ևZ(r'hsX76hwv}Ջ٧D0Q6ith aejJdPn_񄛛I=.9)lNeST\e1xi,8dԊ1CfggD83FDnVOQ¿n, S8ފ:O+94 siC5;]h*7pŽ㦘-m$\IWb7 mͮ6r?H"qߑTpy\缇D[ ,5jsFvP7ekjq]Qs+ zvwߟء]pcV K0KUDݖ^-Ȉ8_n)&/sqv|c;.Hq}7(G!A%NAb"[dz;:F"byG}o#=0 gʕ܏RBg(Rbk^PltN霥G(5H`9YǨ9jG?gZr[--sحL=_j` N@6݇7]~!ǂmjJlLvamP[$B:Sir*m gvHپpg^y|rjg()L䱆uڪSt^Gk*ru{G;O"(t`ە}ݙ 4{af iAV历47rhZu2;gQV,P_L8jk^>-FZ[\[^pTpde@`|i`Yy`;~;@2wpg7҂7B8^v[dnd;"e'`tllGo G=#H&Ig)\M? F#4i^4hvnr6wwQF|n(c4ccCI]vm.;$񛓷zIPeɪlq`^R}b^#s`a)6lTVWf6k;9::9}^Ioиy2J|7ҖUMΝLS`o`H>nSWo碌)lTZ6nt8F75DUڍ4|tGP~n_ؾ;(a.avȏ_Ğct(* B:ui\x\MeSBn.?z9Fh\ u~)ЈU{9Y4J8kwj !ipCҾٗ ~772 X1 Bbz,8FvMVbo8CL=op*!$FDiMR,-hdy,_ܪֳ=n$?"JjXKNyA;j}^ 7[|#(?,D[>Vʹ6k_ # l"ƀ5hX&V.؁Wb8}ZR Veax¶ca;TQ{gpWCDb)VXS(ʐ2j#?\N[ kjҵ;܌9v8[}@̏Rh0h SjΨfVLZ3i5UFUƬ_.b~҅!Dc _'v赃4t-> ݛJPEb04y=OJ2QmDo cj'ǺUr|-vrO bA:OE_+?r\?PyWz@*"8!g`u<F81_/*}wGy55$jBG痜_tQM37R7 *? vdC!e|+F*Oq'F6G!oЇe:ɭ6hv,q`Aw::ʦ@5TAå#pȾ {(NkJ ba4FC4Lh9=~wxuzfJn g\^}8[X}KOTmsYG{z پb=}W+0YCB#O8H}>?F^!UW  4C=Iw뤑}T`]=vzfb)J=~ NZԒ Ll7uK(a7 Pp|:3Y1঴zح }/fHlRhԭyYp`Lj:Sc=lƮ)M(QrQ7 ؂?TĎJ:~o1n6V1@Ƥ%,rhWNDl窥\r ;Ңa.Pv!_M2p CT3J~GF_kq6a'HcJ>T akpv +0B顫V=7U {MC8_wM7mҩ0/8 FCgr^%̓Z&'5bkEj,EZ?qsJ͌{\TV^r8b:N{ڲf1 wCthqE$-Jf|L?ŰrGu_V4o:%u7;SEqrz8c._z]m\ R^bf9a] ]ۣq&ǂ#O X8㻮}z| jVԣo<^MpAŞ%n;G{>[5ŖlƲKujHYXO},Ytی+`٨[}S;,u tK~Bԗ̋Ch yXͽ; E2f&A 'zuu"XCn(U}xߣG*O/30y 7`%cٷ=X3BWG1emU,*HzIuendstream endobj 116 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2921 >> stream xuVyXSw}1E-iEZ֡_n)aGd_HBJU QV[qRgm]t_s>E1L?w9sϹ,kb|+#_h4= 0 G^9d󚒑'$& OK`?laspl3ۊVck0>}->ľ6b~DlqױL`bYO{{OVouD y7|/|,#lqY#uD}<P bptp6s,G 8.sP+ys[(* pwڳ`-|Lr˛™1e{eG~Ȅ&Q;|u~4?'A ~S_@傋pN)p+jhy t[jNt;]p\" tg&e$ jSc.4w">b_x#[Kc.*+h3@"4Z~'|ka7Ho(oJrxݺ"yQn cw 0t^= dJ W;?|EiT2/A4 ԄXV ɔNʈ `'omREqy1ɹF^4K=qtƅ=@;+7ᢧAQV y.! IBԎKp%b q @RoL+:4" H?Bǎ"S]^4=%~T/[9QWFCacc*&RKTF*<Tj(INȴ2s9Pa0UuH OݞY2֓v_9JZ8Mw U%e9*=t=HNEe.),B %BD'2n8Rt`G#ՅDOKB~8'~3TsOt=с0DWj(O,]):LV4(ӟ&Y=6qDؠBH225YW+&(stqpR`wSm TJ(H9HPYqQ Q/@C @l6r4^m4YE<|ZIz&͹HȌ|u^a1)b ~-Ǖ[.fW7TP1br,$Nu;*rD' 8O7Q-3F ۜ,5dSP)mV;8Y f,eM-f5YAX7n[rOɭT[߸/5KGd,(TJ I#9&5ޘ8ÙvVlLJƪH DB\bHIn%U &pO]?js("( ^PsEJCqaۗ\m+ԩ=\t?ZFSh=Γ`a֘7ؔ`b]ڛɌ^T\L.L؞r+A7ٛጡDW%NGW3!< Wl30"aeszKoomk?BDUT))^THyt QTFUPqhfPi0C4BfVd貭)]H#m&)mH3^eWP2ԭLͯVO{L=覊HBH5.a[").R&9hE/hm(C6i6Ε g,7LZg?\{&oINQ6kzDhCVj侇cUhubh6#EH&igytg=.q+ S\K5F0VUeUCT\^y. 4 .qܧ~ ټ'%/^&|R :" r˲!1؏_;q$}.~14ۙu`;-Y>nfJg Ɖ4=h6U[8 aP d*y4 "x|Z=51:ܟiOe h47}?9 &h֟IFա"ܹ(wJ(%Ԛۻo_ownk*4ˮ\> endstream endobj 117 0 obj << /Filter /FlateDecode /Length 2633 >> stream xY[o>mmDv)#.Ң6b@(R!=g.(YS؀̙su\Ҝ-)7],~\06rr^[2As*P3⌼-*c(rFY)5SKr*_NI\m*S\&KS d32(\N $soO-9\x&X, Ias2fEeAbE Q8_Il~BVJ5,&Ќ _Rú M:|yR}}bL.P=MNR½p{|G.e}=2j48UՔ~jXlR~mR?S5 Ja6BcQn|Ki52'ׇ&® n:T汎$cX*}v߁)zlM} ke}jH<gBɊT=H73狝a' (OKkS!0eNE)M(lS`|/I0.f!Q67;9 qU_A&֜ծM"굽u 3qj}xE0]BJxDmDPx /E'd|16懸GAU>WnvqCO>t#1ܖ V6Åi) kNrѧ 4) b෽֏YA?>Gx74> stream xcd`ab`dd v 1400q$2黲!{@Q!=?}>0c]Bs۟~}O&ђ >S{6us,]@~*}&3{ry%|r\y8T5Kendstream endobj 119 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 142 >> stream xcd`ab`dd v 5400q$baa]H~= Pׁ? 7~H/(>GhXKdiVB~FM|w> stream xm[LegetMX43֚4iD]j"ܖ-ea,{e, ЅM4а^Z*FMR_|h5NrN9! u AJ=䇩 u^{Mu } %f,8O" D1Q@'R55MNVet1OVX{AChXQ/fŠ38SQRW2vpϿ4?Z0N`ri NwdbEzls@X#s'ٺ/2hrvt>/rF81H 7 ݦ6Mu8Jq~_}[ ,n?nC,8/q]|n=MkF (%LL? x.msS+r 9Wqs`'фJzYJ5+px(NƖ*ʕ3kupn8r-6ԢgLh[/>IT>o-kS(4(kÕ!XC3LtW SZT>m({" 8>$ft2EU'Si,NhAw4:Pb{e uڜs?Fkg?ؓ/'suDy=}T`,;7|n'XC >՛?2 Pc5H `?ߺ~UZ-stcdp]EY]7ʕӅe5 kr8> s-KU&KKc<q cmgM&Pve; QZiHDž>CI5'1veY訢SYW1!T6+Ra~}\{Y{j{]y@:2/.nf74TXzJWg iendstream endobj 121 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 403 >> stream xwCMMI7]  AB"#>TAb hUkqP~w #~g:{P}uҏ{Q3xx}>fۺŧ@Ri>z~v|<J! ׋>x~u}|,He:0/hlhMQ(&5  7 7endstream endobj 122 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 383 >> stream xM+qbhՔDZ$.RhصE]}3e6f8^)$),98 _IyNԇcq' DZ.d^B֩'5,1U*ebie*bspüۃJێ}Kzb1 rFi߯ocj>Q0`5C N0`я-XCΦbj $vܤsoܿwC4xX1vr*Ne`Ś>.hkzIXZKocz-I.awQmƄyc<$X J*TXJqT}jn{+Ͻendstream endobj 123 0 obj << /Filter /FlateDecode /Length 171 >> stream x]1 EwN PU"tЪj{&bA }i÷duG)`haIGOWt$|E_塎2q6jS܏H.iQU5Rj|7KiGfI 0W Vx<bIU xDV6endstream endobj 124 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 194 >> stream xcd`ab`dddw 441%2黋@|y%y9 Lf YltY>w?~ZN1uFm}Gkmܟпk;;$'Ϙ7q$9sWmf;OUsvϟ_]%g#[Uewy9|r\,y8}"Fendstream endobj 125 0 obj << /Filter /FlateDecode /Length 2951 >> stream x_o笠@_Vm%6EiQE ȃ 2w3C^I*y';gǽYW;qg^]8e-ǯw .ٸjJ_^,8z]\'뫟>{uO,!ŝ<ڵh_=W㻳gnw-9lK|NA|򑡺)roN^Oql__]K霗圿-pK3Sg9zuq~}Ꞿz}{Q vq6[m"߼ YSuV)Ǹ>''j'lJ|/Ͷ4i&⨓j2B,4H+ׂD (J%5o ʚ,B,M[@I%g2 rZəhVbARJK@핬!PAvSKEX ȬB1x!Naݐa!j hlpThVr>D:DhPTB,z%oK Fk%B,D9 -  P)+'f]f$83xDhQ(X (J٬"BI4i8"DauXIJΉ@2 J ^i vMxDhPQ` >9 [sk!AA!p"u e읏mzD-p\Vxd?727f/ ѧ?F>s0=}нԡ2=ߖ鰖%Z\g|u{2̭P[ 4uڕ}~h!Ja[帜%Pzs{څri_7P$*[]|,VƧӁ m8t2)@ױ6_??9& pDF~CTv.S*! ar0F:ANVP: P5JD@`l`=ٳX?#My올-:r'@"LP7 GP EP C>= ?k '\G&'V֏}%Ȟ6[_y':Þ Sh{jC*"jc0ٻ"' qU1d&Ĵ&4&(0B2Ҡ0BPJ JҬrR#J.Jb5#J Qג(Q%# Q^+IjBc\bcX!H@(%91R5Rq bQKR+D(Qu#Ŋfd#JL&Sg$JHkkq+2vMbQgHBT84FZ”%JrdX!5dXiT1RՖ Q^)(b(>Zk8*&j(!rP]T_NAu(\ Pƃ P. P5džɮdYDv;(NdUb])o$LU(Қ*峯@2QrE@5>*OJO]n*j3U 3Ogۖ*;; HiIcTqVsiԋ\UOמF? `ܷJ>f?+D%1}nݹ> stream xܸu߿B_U$}jM >X;[^(=jkf)<pq0ϟ~?owr\0y5 cM/>݉|߻{˿ס?uz%5a]"Zt)KZꐧ2e.i(QT&abcP<٘u SJA =eJIB$MjRy6T TކL)yͨyQѠ:cRPJ^-5j!uRa Q)S<5߻ <̓Q8t-j2ZtJ.CjGK8 rH3Oc0eJnFiXz ʶ d2 \Ɇ4k25z4$~laҔ9%2w´2ޭAN)7AtM>s48$t&|DŽ=nN@.w BoρEY@P_Z@gmH{?~7:ڦhVYLB Vy㊎CVC}6oSW˨ TQ/2. τxA~@P_~Io|/-/Uj|cwM #qȥNÐ[%*r9%` }Cvu!bemS$M<֛$r~QtT%IK!䇂CC CMJ;pu+<:Sˊ޼ɨ0u9;kKӭR֕e7aC$#,; VA>q.k?_R];SX:(it)j"&Q;ʔ#5UߪEy-;zLѷfDߙ28Iu(S =eq0*65tEA,%WLRA2ִ" NlڑBAJջQ8:0 (KƐdPa 2%MQ(Ȗ ȅ^\ Ȼ  p宱JUg]}+8)PzDK/  S"*,(LugZe=E}ɜ~l&'ZdJGi,,ShBjJGB֕eJG?˔j5b*xYEAfo\ԙÓ]),*US):m&i}n"CpڽBȓ OD'x3t|(e)og#O򰧙QJ85e^" ԴP#D͘tbʔ*̆T :1eʺs6NLf`X!Sh c9'\Vʍj9' )a91E-yN91EZki3 5A}͊R9eglWbNLNٳsbʔUʴu:Ĝ2E.Ĕ)Yʉ WyK91E"S3grb ̂j\ɃPsNDEW?0a>ZƴCPdP--eJbOdE0aPPp8d3”_E0S.?Pl g )ZN V+ZNrV+Sd5bR%Vs}j!tjj?/Izwb;y1ᝂrTnўgPrU]~:1Ojiפ/M>Er|d {sb*&[fS([Ή)S2]s" *܍<SP#Fsb JMC|bT91EŜreY0,[΃!4Bc}#ւ,Ą ^R=Qa;a R}bNLAYEĜ_ߵSPYΉ(Wkg0Eߘ#FrNLD團w}|bˆW9䊌#a P֦7K>Äe:CA!wSPBwf9)NAajW5 3e (@^┱ O-9Dn!,ry%?MX%*ХN Kғ]۹QB1tݤ'LzMRpI$3I7hG3P0=~"@ aE2` <e]=O K&S苕j%*IZ)(),bB2O A"2OLA#!dAB!('\1D"ؾSPі>rvyb N!8xb ,%}!ٿQ_@)WV,#Ĕ+ y\IXHY*E< %BTt~?"9)NAajW#UPg]P<ښ Ds [';9E T'Pl\=bS' C]dDέz?]7 J/sP^ ,TC)xzu|,uB=U_a0TbLyW~bPfmYOLYj?7lOLA|IJO"\{a `ǧE"5%f}b oP 6jqfLБC1D:OLAij'QJ: SP%OEOLA1rJʑtj'LZ4errިc!m3& }$ WR$f< sjIPq*7vP+D`sw]}A]/Qte$/EFfj"(=n”Jo T4=so]"jI&. !%]NDC1ӔVXݎSP>ް'lƉ6}x 2eijY&M{0eQ{ -@<^P-9P⹐:>Æ?-@+2LgDmZ)(r_` SPŒYF!(:ѴSPh!A+%K-QTK41EHUtSP%RbV!σ1E %$SP VC 1E<%"Npcʕ ,KSPdnĖc Qd J_4E fOY(Wdnu=/4Zg(WԠyr(@A 7H@1 (WՇkxJLz-*[Ą|9x6 ^+Z^{-O(rʽS䵂 *־FD]쵐k==}~ݞPg֍b1(ݓ){E{Dm\P]þ4 )A1eɨ)VHbʒQ_%o9(,5u"ʕ""k9ދ[)( ՂPLA)c/ՂPLAvUSKBnÐ r7`co ń  - qQErE&ɩeRS=PLAI%X- )sb J}$PD_FTeer BբPLAQkZ)(, Ő 9OB=]ⁱNxXƈA` ۄ5yZ\ 7Mir)LteB8yznz1]7%^䗼إ(%쒟&ܒC{t<'ON5e9XzEZцiY>ŐL-ERQ j;BPLA"qa!(,U5LA| A1E. T(}BzŠnZ )(y>Рb@QSb V;SP2h@!(SPbA(\ɑIJ SPFwb JAJ)(RBOb Jx/rErP-&Z;Lwj7KFa:B!k2(WGt(\! 3(WՈxedYd4atj٢69)M(?rJl@s)NNuՈ˽%.NOΣw}K{HF=ja'/)!g @ݢ=(}1?XP0JL`ԴˤPCgA"ʔ<`QG~(LI%9 Νa2%<"A(S~^HBeT#(KBefQ( $I Ƅo".h, Em=" ], +LV@(SiG, E ʕ{*x((uDs… E Z4rKCBem=" <ȥ}/ m '*FS)W `bDsw]}A]ͧrm4.)s{71e'S:*}w@A)LteQ+yQV#FtW.-*n$wJ2^oѨ,Fesxn6[pڽްV0bV?l! Ej!䢈2Ew1Ee.!b(Jm4I(".~~(I_Ɣ)icPDw*Q#Z(SjʕmW"ly" ʶzA(hB?kL-q@ SB~rP^le9(B|bPA~$D,'(WecrPDAE" :-e9((rPDAYGSnⴢP!>D:CBƛ)WBr1~8 Q>,8 Qp pZj`W!(8 Qp MYWS9kzn\ڇlq@A@@n"Ca (  K_Յ풧.K͙[$ϭRQ~KbV) q9@ztv<]>֞sJluC(="ā Jo7!d!(LICPDKu6c![A)IsA(SRJ8y@9ΕAY((:?:a|QPVR}TPTO+x((54z((r+ˢ.XQP$rE." e)(lkgdUQP6SPA (KA"`e(BHYMrŷ]*-EL  Or%~DW^+Dtv5:^cbta*\Sa&P@o '99E TX'Plv5"rT%yR<^C*Qtd/Tz}b?E)ៜ1LgnіQuH髦NԞ+vtQZFwbؿ~_ize:>g庎e/?󧯁x۟?zWwA?+]9 ɱ~Oŷ|_\4kJwoo#笆}Va~>mz Y*_|ӷd'tTO~->}wo_^֐Pަ-:rI&OwWX42endstream endobj 127 0 obj << /Filter /FlateDecode /Length 3413 >> stream xZM$9ׯrD]ZЪiF]=,^t0Z2/"2v9^'}kBqmdOi>m>:}?o~ha{jL>-u е=\Owo_?\q=}{B1ȞRvk>?{ ﹺ޿.ŕ q?|~uKx]$=SPsH"5RYqj\d߮x TtuRۛ=ȍTSTGV(XǯRj8/TGVa˰J RC8:^pr)..mN`NbF.(VSg'"ݸ!u TwEj"TwEj"pC@4@ {1N6愱nOpaՁ5 D_rDE1๣Ce sŐnϡg LrP6* A/va/ 1¢0}i<׎Xc@`QW @r)78AB;". ŸsԁCB2qi/i`e iiO0EW *Bsma gs5:O:O[( c? KcZۜQxS1%8aZ>},accC)`57c ;QKaxƈ_^Hcek )\dO +Hrjac1v1$.slBdΉ 4*TI%ː`\}|ghO LLqQ0ƶ C(kؘ3&Pp{ =YpȰ%Tr$0l0@PK#ؖycl)>'tp!]w} })06n^\9dDbEu3G+c ųtac1v1$.sL O ׈+OiG($b&\~Y%jҢam Hl\05DA\9bJ]N г!2 ` XL"LFe3XW}J#>kp@2%PP֗c>挾)1=4ܞCVY0^-Hz $0f5(d j67~Ncs߁8-dBs)184= qyYK<Ju5Pe">Cȳ &2_$XE1 }j e sF{ nO'C(1E[%Z)c,  :0!xY̘>x_|Hu Li H%h_0݃WtD+I0p2 A'>nL ;"( mD]H@(>(bYR=A=LpE] Εuv?vvy JHE0 ,@/)⳺}Ag Ϥ:ZDp/k ͅN,›!%+ذڔ|ë&!'Fq' -r)e :ky'(Ic?/#=n jU6GwdaE}!IP "SľpN5G/cư$+DȺ^/Nbb[Ɩ(%F rݝ P#Kwj2oҰQgz`Ϯ6 e82-{Sm^F #~8C;7`"".j,>BGGKnj@b4"DPL,Av|ݱ71k1HϻMF^ Y| )TswG6O4zj,$l0DQp☭l,I~BR!J]qfD59w|FgkdgbFMOi`bZN+lPm?iBҵO%KBuP4БY;}rwwD趦bbjx&ҴTd^OEUl+|NWL@N0N$@=IyOeH?# ]}A΄Z  6zHƌE'yTr3P8m^gR8_:a}->aHy!;&L/Aj+>PV90c6o,˓"o^dF7 HH((ͪ,"A_A,2BV#-t=khC!q9dsH̅!q{KR65 Ь=q̒$nI9MY:Rĭ-LNSk?4[ h6 ޓ{N/dL=p_[Ms{6"~@{~HUF/ 4hN*Bm6/USiU6Dv 586P7[k,%F[)V{~Uk߼F!q; d!qӇ)@ަ !EaL"Bd?:TGަ 4~mAHʖGYp9WHM4MM TEZhi(WRJL##17k4kB%"[[˖JEIfȸl2Q "53Ŭm5D27*^.;*,Ѹ|l^' ~EO@$&]ʧAtw#Y~{w\Ӌ>Õt~er鎭!_!l|8?%B,RjOT%N{}}ߞ>|#+!C?t~W't=GGO޶endstream endobj 128 0 obj << /Filter /FlateDecode /Length 8643 >> stream x]M\9nݿߐERוHd33yv{q;߇xHVٝ3Yy+~]i_B)/.Nzi;g>ɟo<z}O߾[LpzSQoB%EN9]B9}|SL-_rp 8TGP)ۥeX(*/[=%epɻj=:)2M.жt8yZtq ]OFQ_oK_p룖`MIXSrP5\]|]A--՚\XCBZ"/GidޯjT9 (OK:4r6MIu9nB`m --X`t0vhYB+A!nFۛaMhc0+Eގ79j=P4XeUˣ&H-X*lMW#(}BѰr*E:RnBh\du;hhM(u` ѐƐbo%\5 ;Jf}ix@飡m_7}:ѝee-(kmJ`t0ܞ(m0K(u{X^2;d䦬P!7Qbm(XHZDh[w@%q(q|0fȷ4چAneym*cqms).md!!X?i-v2݁{pY~ޱHG=\ptU bީN5q(Ւ*ʽY 8jf2QL=}e1+2Uqn7Y]S+:G|fE2Ey13[F͂E#% U:Q[!dlΤŭEc%% J4 CJ4 TJ4pf-SUWܣؤ,kq6z\[tou=h"xFX~{oo_^޺mx=ֱ Eߩeۓ&"ơ/t:j b J[h J͉rs?\h<gՃDAt66@FԚƃ:ͭs3 8PEw h~9|:ŹȐKHTܬ׉5'p)L_:DǸK@q()RR Bq \bFCXIĵ~9ov$u&y<#jI\+D5(W"U+REi*UL(S|mB]#:~*aᝇ} T"i>ٴ2' `ğ+)tci';mYni'9sQǕ19Ub~qyOF4&<U0o v9<Nꀧk "2^BPB53$.;dhp4ָqp0JH I.?Si֐A E{d؆(p5rݳJ`^X"ȳ +E6v"/յ1e (acaj.m75^5Ecl";V|YpR[ѱJ{qPd иU +4V^ut앎- -TM8^Xn6(/TbWY,/By!xa#[/B xam!Pk1HBE nxXXxa\N NVdEvPنcu J=hΫQq5VZno34Jڶ1BlCN k V4ƋeoD%v~ζEt\QBa8plqFy̶(# @bfrE'Ҳ؈U{CLQ~15&7>.YStDQ^eE9eO!ȳ nJeő!;D k EqrP& &3. d!TްE$&%ȵh9$ BIxc%|[YH"o;2& %cxP88[Q"=껧IUA Fpf tw$ ,nʎ& @YW}ZF.5筒g@ @_3XIbRiH"5GI" rqB3kX輝S)5$#qauZK ?S,@x<4T-i%L; (ac剻ܛc:1Vǝ76V7LjyfLSƝ5!;o,X@ JxXX" i7U]*وɱ){888pS:vĔe!52VYr6$k,|P<\eɢ}.8rR,Y A5 ӹstQO c{ mX''qy3 /9 gA&"f5:u楚k҂KbP8\0QWaxnQkk^y"EҬ1,]R!8Xx~ͺ?}fk"͵UaTNUL;^U (Ճin"y"͚}p,|Zb@X( [JӲbVzPBR6i Ú[׫PHXZ6&(Ls "҂,1Ĭ5+DK k6!t }Ni(VWSt+.alU.WjҼO[\E DxXXJS "QW K]\eML5:MLC(XJ+4*GnGb=>+SEԴZbV⃇5 a&mH4KJ5-Z;[p++` PlU0?J6Ɣ]+BkK[nAdR>f!% *kn\4 AXUKޅF"C!r} Y@DL3,5MLCBk~3ž âYPUwJlW(Q<pE{>|9n""SEԴ`4+kח="Ff-]E&vQ71~K#w{ě?zS />~z#Ŵw/?zۅ4yW_~E+V /{;߽b?ӓoB{/~+gݟ?|L{?{*ǩCVeӁSr^07~j>&Zow&R;eV/<]<0[q1?P?ܻeц,tt q\?,TJQsG_.WG}NG?+踣A{A|e}ktg\t^n0@{X@{ag3:L7toAGj&:R]tyߖ/Vh<^(zozo<7@ onROwη;7 N-_0VJK=|zozo<7@ ӣKc:&J={"^aWz+QhzE=M6EA}"+D/N 9t2iabo7O] Y'dgZВh9_~뗻b3CܩV 9w4//n&.X2>'tl| ҝOwEkBӆt R/cp.Xfѧr]*|9Owj㻃wZ?ݥV\u~[맻`üwo?ƏxV맻ԊNxGq3W͋*6V_AX@BU;:\` 8yJN͂!{hT)eFQYP5٨(,(~gV> stream x]KqߐYޛ 'x㥫Wq*/$/hJfcɤT}k3x4护d/R*9xMm__oZ߬M{x|/hV~ >DٛWLǷ>/<߾~OOT–W??޿޾y2G/~nS&x?̓m1B2~3voxt{ PO*ݶ- mꃆf'AON*MJ|JiAKs[h꓎(򤣲>n%:IERKTtT![ -Uy eʷʤYҦ]&Uf-iۇG}>2I#3?#7?x*VU' %1t::' QQ>i44ACRԥONOo$=HO=r!wM}ߵd c1jǦ15-:sn'؅M=h n4Mȹ]9%+"b#cW87\|P8K'~l"Ӱ+H{Ijހп]'Z>=lѿO, %]=ym;HۓBviI1C'n^Btk%ZXm׃ JtAtfO+1 0b&7]6k3NBΒhn4Btk%ڏO++%byS{jy6\xP,`9]X0vC>`\0k+%ƃ ƃj5cBӄ ˪,W  <؟/nZ9蘍6IOhHz$j$m FGVjyrUB'!*j꓆ȧ!ON*x-3бT3RAu_&rPAt_#r5ꈿTM+ӜlK zqNJ ׮z[|XVlZNNu~#c-6zr0zkutm8bTm M1֙!p4&Pʝ?pr;~@[_Qn\5ʭ>|{`v18n=cΫ>н+{E?} q/ t+DWh^_,_׻p\{E݊䕋~ yu +q+sW^l/ܽ+_qr<^ta85^ta8u ֡^9+^{tS8]N ʅ>pj\5N ʅ>p\N ĩsW8];_l&:/Y3p[㇧WRy|%<߷i 9qw%Y]pNh>u> T(B/rdY89f_J؂4OŊAqNS N<8iӁ(rE[^7Yi㚫7*W G뒫3NO,mkt8=k4}d+15Q' 6OmIT(N*i\?c!`!奜tmB U}QQ*O:*O7*O:߶TgEӜ9`ڣWXv2)z"< ȏ@\✣}tG64v^>Iw1U}=hû~t׏B 8Rz|~Kt7Q|6R}~ϩo?TO_a5aN^W{LE7TOܼ'û=[Hγu5c 5r~ET"崥$#87KPl'E,bqGZpT3P#mJm;Wex7gȖnĄv} 8"7HSsVۼOe"d V˟a̎Ql9ԟԖfo+oۺ:.zj%H>u'5eiœQ̶񈳝OSnӞ=s͈HNE5Nřb}8qDYq2@"ǁvZhc`R܉Sca: lCW%cҖhz)'5MlF,urvԼ82gwmYaBQr[7>EłgfOE`U#]M8,퉀"n  V.P6jw鏄}[rb`?P6b~4y Q>{Ȏ߫+3L1 쀤=Np*i[-M漎$&E>کw$x胶 8lXtNg|]a*0u$7ћ~3j,ZG LW$IIY7Ggbp}R I9$.rOXZ3Ƨ2>iJX)f  iP$uJjfh@8U>H$yZeXB}#(aC_R;e]M1š9,l;F^cԖ7NqM58:S^=jr0CrJEc-zEl  P22x5JtHÉAl*KzJ qH`dH>g됶o<>>MtiM"5ddIupMCs졄F;vdE!Z&,|P^HƱHosX#9UzIB3d|=BvkEkJXi K9i'Yk=v  SG+x+@ZYJ?<2WĴ%,}Us= T;O4!= H_]7%[hEgQBB^9CMOζLE$8x"LeN¹=hǁLbsM 'PCfxnMFHOhr#'ȪmEiFerz$,+Ad&Mߐ7T/_t~K *ߤ7qFaOiV+`5~E@ )er"^`o2f|x 6^mBMIÚ4BEr hoAhX@h-uZmQ|ע|zŋ }^IǏ9wf&a] ܴr'?jty82Ü2걝T3Pai]fj%Gv$46ƚض֐{̷-b ! "Γ-26%V:0׿q]Ɔٜ&yv0ir⑂aGR8i2CA{m{4yr\ dFjmC t.z$KR緐O<:"AV$CDS42$1X_1'z{nܕƣXt *I \1h<Ns2J!-8Bn.vA |vi Zqg-8AN֓}[1b;%gxJx"ϝ$hg7~aXˁpG_J$iȌ:LV(_ f}0y#@>J><{ ӟ2D<1oŻV9hScV{XBhtY [Pu LM u ]&lm1&6~Bo^A$x5p&l:.fGHY KsHلކ/K!੠ۤu͸&dΎjn@6HYhd,T)7>Zņ>\67"^̨Yx+Y r"!c4ftyQyU`L,Aj|v^1{mhNt%m /'o;Y;7QҦiL=ߥy\ɢ.2%j A\'e)Ҷjiw\) yMT4YrBٌ#X1vKR6l}/ ,6!~4ym\Klr5 UgCgq63&``GR=!1o%"TTe%aB2rc2$1)\^\Q$*I ).;QIbGVoʜcËY3Wh6z$s=6ϵ#؝|e'`Dh/}ICr_ZA7(zI 0u`:g1p W$pJ">`:!6O\3Uq`LCX<;[ did;.S]&X:K'{#tJG@< C2 u&aj^R=|m[\swdߝ/=lmKbjSpuW4?[j;)k].|#LCy}{3xuoݮtXH"{ug?M#IHߦZ{#? 2, 'RfVVhI|a{3:j$κ7I̥gݛA%S7HZ7ceoe6H9892_m{KBeov\Uowgy"!ꍞlzUo$R\艭ZF&jcժ7~'@72UoEjLAj=t4kz`Qv$~7h?ռBCK⚷uCW}ysF}+Xp= Un/46{w0Ak9cd.9EBŞы.W?k3.h_n8B!]9hSF߃{UD᪇{"~PtoHgY s1T d8,P킃VRmݜ!98MaŁOMnGsCHH[ٓ#pf!վ{f50sp̑.ߗ}8a渉gV߼nv =;'=#ey5VY6} vONӌmp̄,7K!xvrzvV]Ρӓ7L}s &o}.Ɉw,fgFN!EҮ=__^RɉiȌbÀ"^:+Mb P7`O!sF|Ż,kt(Z,7 ,q5/p;𢯮Bκ+ &rZ]J⺫2DvO&6|:.OשpµxóÆu_ҷ#9t,NLN e_݋.ܴUԽ[:%Wbty2N5M G;ok.^'_'dE5{׉JWu%}9CygԀsk߫_!w>9Iz /V &raCUY<騄GAE[0JO"oJ~G}Q\P'-{EY U}QNUyҍ(~IU|gH7Q7!!]}}gyO n jTu#$Gܟ=cNo+gW=!Gvx_ .jHfס~$>~7D۾?z|7;!?>A?7 izeQEendstream endobj 130 0 obj << /Filter /FlateDecode /Length 1546 >> stream xW[F~_(Qԇq1su+lˆI2uq`; ˯턠BV_m?qJfqOg?etR%G^ Si82%Tgz]%4KUNrtJqT^Tpg K@m/̓ޮ hWV+7ߘ4(r2eol^}mF/g7,w)rɆ'G2m~w")3k[.p*JNSVߓ"Řd[oDM5wY979t \D*!h5Df**c9CWvL]N@̓mrv[lLb$BV#m%GP>΃.`Tuer3}I:R#S$/+Gs~Tog}A )!-PUJRY3{lCS68,bPP4;EX#m*ڇ`.&dh =@>B0QpTm Ԇq1` dCM"+,j ->U&0USJiƈ{ƍ )j>;%:y*~2. E*6?"doNНܝ[7NOH_C^7v ?n6Fovegw q,IFv8gv',N6m[χ-g]Q4q%̓ܛd>0I!$&Lar+u)3Wyy&rT4Il~>8%<!Zla1jܱm3{ 1PײӄC"x&0΢mnP|H`[Rߔ\1h&&zgC,Mˢ֬htĸpFZ[UZ׏sT<juFT? xiցYO\k0)>!=3onFNꓕ*]h*}Cݞ% 3q&&# G^vJ?6d2ț5:efKcs*&@jb߼`5ێ_i5B@Plodɍ+궎tzL*5w?fŤke bRRA; \N!50Hմ5]h]ªe8p3D'l'T-BL;_2sQp1`ʝAkKrN H 0y`t]'M`)^",IEحK6Y*1 <=xHA)#dŀB tOe*#~%.72zզ%_0qva}|l2NZ8s:֭ '6 H[Ը䴦˶8h$ ܓ{1ܿ<7I8T[e!2~qփܳg"u1dN]N@0lS~fV hJ9ʘRf/Pendstream endobj 131 0 obj << /Type /XRef /Length 142 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 132 /ID [<64ee4b438e163d172710467271ce6030>] >> stream xcb&F~0 $8J٬A)Jp"Jy } tHV6SC6~ d"A$1t0d b3~`,z - &ef^@$|i RO= endstream endobj startxref 103837 %%EOF gstat/inst/doc/prs.Rnw0000644000176200001440000002004515060550314014412 0ustar liggesusers%% Document started, Sat Jul 3 19:30:52 CEST 2004, my 37th birthday, %% while being stuck for 24 hours at Philadelphia airport, on my way %% back from the joint TIES/Accuracy 2004 symposium in Portland, ME. %% Continued, Oct 28, during the Apmosphere mid-term review. Oh, shame. % \VignetteIndexEntry{ The pairwise relative semivariogram } \documentclass[a4paper]{article} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \usepackage{alltt} \newcommand{\code}[1]{{\tt #1}} \SweaveOpts{echo=TRUE} \title{The pairwise relative semivariogram} \author{ \includegraphics[width=.4\columnwidth]{ifgi-logo_int}\\ \href{mailto:edzer.pebesma@uni-muenster.de}{Edzer Pebesma} } \date{\small Aug 29, 2011 } \begin{document} \maketitle \section{Introduction} The general relative variogram (Deutsch and Journel, 1997) is defined as $$ \gamma(h) = \frac{1}{2N_h} \sum_{i=1}^{N_h} \left(\frac{2(Z(s_i)-Z(s_i+h))}{Z(s_i)+Z(s_i+h)}\right)^2. $$ It is claimed to reveal spatial structure (correlation) better when data are skewed and/or clustered. The \code{cluster.dat} data set used in this vignette, from the GSLIB distribution\footnote{F77 source code for Linux, downloaded Aug 28, 2011 from \code{http://www.gslib.com/}}, seems to confirm this. From version 1.02 on, R package \code{gstat} provides computation of the {\em pairwise relative semivariogram}. The following code provides an example and verification of the computation using direct R code and using the GSLIB program \code{gamv}. The following code imports the \code{cluster.dat} data from GSLIB, which has been converted to have a single-line header containing column names, packaged with the R gstat package, and converts it into a \code{SpatialPointsDataFrame} object: <<>>= library(gstat) cluster = read.table(system.file("external/cluster.txt", package="gstat"), header = TRUE) summary(cluster) library(sp) coordinates(cluster) = ~X+Y @ The following commands specify a sequence of lag boundaries that correspond to the GSLIB conventions, and compute a regular variogram using these boundaries: <<>>= bnd = c(0,2.5,7.5,12.5,17.5,22.5,27.5,32.5,37.5,42.5,47.5,52.5) variogram(Primary~1, cluster, boundaries = bnd) @ To compute the relative pairwise variogram, the logical argument \code{PR} ({\em pairwise relative}) needs to be set to \code{TRUE}: <<>>= variogram(Primary~1, cluster, boundaries=bnd, PR = TRUE) @ Figure \ref{fig:vgm} shows the two variograms, as plots, side by side \begin{figure} <>= pl1 = plot(variogram(Primary~1, cluster, boundaries=bnd, PR = FALSE)) pl2 = plot(variogram(Primary~1, cluster, boundaries=bnd, PR = TRUE)) print(pl1, split = c(1,1,2,1), more = TRUE) print(pl2, split = c(2,1,2,1), more = FALSE) @ \caption{Regular variogram (left) and pairwise relative variogram (right) for the GSLIB data set \code{cluster.dat}.} \label{fig:vgm} \end{figure} \section{Verification with plain R code} The following R code reproduces the relative pairwise semivariogram values for the first three lags, i.e. 0-2.5, 2.5-7.5 and 7.5-12.5. <<>>= z = cluster$Primary d = spDists(cluster) zd = outer(z, z, "-") zs = outer(z, z, "+") pr = (2 * zd / zs )^2 prv = as.vector(pr) dv = as.vector(d) mean(prv[dv > 0 & dv < 2.5])/2 mean(prv[dv > 2.5 & dv < 7.5])/2 mean(prv[dv > 7.5 & dv < 12.5])/2 @ \section{Verification with GSLIB} In a verification with the GSLIB (Deutsch and Journel, 1997) code of \code{gamv}, the following file was used: \begin{alltt} Parameters for GAMV ******************* START OF PARAMETERS: ../data/cluster.dat \\file with data 1 2 0 \\ columns for X, Y, Z coordinates 1 3 \\ number of varables,column numbers -1.0e21 1.0e21 \\ trimming limits gamv.out \\file for variogram output 10 \\number of lags 5.0 \\lag separation distance 2.5 \\lag tolerance 1 \\number of directions 0.0 90.0 50.0 0.0 90.0 50.0 \\azm,atol,bandh,dip,dtol,bandv 0 \\standardize sills? (0=no, 1=yes) 2 \\number of variograms 1 1 1 \\tail var., head var., variogram type 1 1 6 \\tail var., head var., variogram type \end{alltt} Running this program with these parameters gave the following output: \begin{alltt} Semivariogram tail:Primary head:Primary direction 1 1 .000 .00000 280 4.35043 4.35043 2 1.528 58.07709 298 8.62309 8.62309 3 5.473 54.09188 1248 5.41315 5.41315 4 10.151 48.85144 1978 4.42758 4.42758 5 15.112 40.08909 2498 4.25680 4.25680 6 20.033 42.45081 2296 3.74311 3.74311 7 25.020 48.60365 2734 4.09575 4.09575 8 29.996 46.88879 2622 4.15950 4.15950 9 34.907 44.36890 2170 3.77190 3.77190 10 39.876 47.34666 1808 4.54173 4.54173 11 44.717 38.72725 1222 5.15251 5.15251 12 49.387 30.67908 438 4.56539 4.56539 Pairwise Relative tail:Primary head:Primary direction 1 1 .000 .00000 280 4.35043 4.35043 2 1.528 .36084 298 8.62309 8.62309 3 5.473 .63071 1248 5.41315 5.41315 4 10.151 .83764 1978 4.42758 4.42758 5 15.112 .77691 2498 4.25680 4.25680 6 20.033 .87746 2296 3.74311 3.74311 7 25.020 .89610 2734 4.09575 4.09575 8 29.996 .90023 2622 4.15950 4.15950 9 34.907 .96043 2170 3.77190 3.77190 10 39.876 .90554 1808 4.54173 4.54173 11 44.717 .75545 1222 5.15251 5.15251 12 49.387 .82268 438 4.56539 4.56539 \end{alltt} As can be seen, the values in the third column (semivariogram for the first section, pairwise relative semivariogram for the second) correspond to the output generated by \code{variogram} of package \code{gstat}. Two differences with respect to the gstat output are: \begin{itemize} \item for the first lag with distance zero, GSLIB reports that the semivariance value is zero based on 280 point pairs; \item the number of point pairs in GSLIB is double the number reported by gstat. \end{itemize} The ground for these differences seems that the GSLIB \code{gamv} uses a single routine for computing variograms as well as cross variograms and cross covariances. For cross variograms or covariograms, considering two variables $Z_a$ and $Z_b$ each having $N$ observations, the $N^2$ point pairs $Z_a(s_i),Z_b(s_i+h)$ and $Z_a(s_i+h),Z_b(s_i)$ need to be evaluated, and all contribute information. For direct (non-cross) variograms or covariograms, $Z_a=Z_b$ and the $N^2$ pairs considered contain the $N$ trivial pairs $(Z(s_i)-Z(s_i))^2=0$, which contribute no information, as well as all duplicate pairs, i.e. in addition to $(Z(s_i)-Z(s_i+h))^2$, the identical pair $(Z(s_i+h)-Z(s_i))^2$ is also considered. This leads to correct variogram value estimates, but incorrect unique point pair numbers. (Data set \code{cluster} contains $N=140$ observations.) In contrast, \code{gstat} considers (and reports) only the number of unique pairs for each lag. \section*{References} \begin{itemize} \item Deutsch, C.V., A.G. Journel, 1997. GSLIB: Geostatistical Software Library and User's Guide, second edition. Oxford University Press. \end{itemize} \end{document} gstat/inst/doc/prs.R0000644000176200001440000000304315162303107014043 0ustar liggesusers### R code from vignette source 'prs.Rnw' ################################################### ### code chunk number 1: prs.Rnw:48-54 ################################################### library(gstat) cluster = read.table(system.file("external/cluster.txt", package="gstat"), header = TRUE) summary(cluster) library(sp) coordinates(cluster) = ~X+Y ################################################### ### code chunk number 2: prs.Rnw:59-61 ################################################### bnd = c(0,2.5,7.5,12.5,17.5,22.5,27.5,32.5,37.5,42.5,47.5,52.5) variogram(Primary~1, cluster, boundaries = bnd) ################################################### ### code chunk number 3: prs.Rnw:66-67 ################################################### variogram(Primary~1, cluster, boundaries=bnd, PR = TRUE) ################################################### ### code chunk number 4: prs.Rnw:71-75 ################################################### pl1 = plot(variogram(Primary~1, cluster, boundaries=bnd, PR = FALSE)) pl2 = plot(variogram(Primary~1, cluster, boundaries=bnd, PR = TRUE)) print(pl1, split = c(1,1,2,1), more = TRUE) print(pl2, split = c(2,1,2,1), more = FALSE) ################################################### ### code chunk number 5: prs.Rnw:86-96 ################################################### z = cluster$Primary d = spDists(cluster) zd = outer(z, z, "-") zs = outer(z, z, "+") pr = (2 * zd / zs )^2 prv = as.vector(pr) dv = as.vector(d) mean(prv[dv > 0 & dv < 2.5])/2 mean(prv[dv > 2.5 & dv < 7.5])/2 mean(prv[dv > 7.5 & dv < 12.5])/2 gstat/inst/doc/gstat.R0000644000176200001440000001466315162303106014372 0ustar liggesusers### R code from vignette source 'gstat.Rnw' ################################################### ### code chunk number 1: gstat.Rnw:73-83 ################################################### library(sp) data(meuse) class(meuse) names(meuse) coordinates(meuse) = ~x+y class(meuse) summary(meuse) coordinates(meuse)[1:5,] bubble(meuse, "zinc", col=c("#00ff0088", "#00ff0088"), main = "zinc concentrations (ppm)") ################################################### ### code chunk number 2: gstat.Rnw:88-91 ################################################### print(bubble(meuse, "zinc", col=c("#00ff0088", "#00ff0088"), main = "zinc concentrations (ppm)") ) ################################################### ### code chunk number 3: gstat.Rnw:110-123 ################################################### data(meuse.grid) summary(meuse.grid) class(meuse.grid) coordinates(meuse.grid) = ~x+y class(meuse.grid) gridded(meuse.grid) = TRUE class(meuse.grid) image(meuse.grid["dist"]) title("distance to river (red = 0)") library(gstat) zinc.idw = idw(zinc~1, meuse, meuse.grid) class(zinc.idw) spplot(zinc.idw["var1.pred"], main = "zinc inverse distance weighted interpolations") ################################################### ### code chunk number 4: gstat.Rnw:126-127 ################################################### print(spplot(zinc.idw["var1.pred"], main = "zinc inverse distance weighted interpolations")) ################################################### ### code chunk number 5: gstat.Rnw:136-138 ################################################### plot(log(zinc)~sqrt(dist), meuse) abline(lm(log(zinc)~sqrt(dist), meuse)) ################################################### ### code chunk number 6: gstat.Rnw:147-152 ################################################### lzn.vgm = variogram(log(zinc)~1, meuse) lzn.vgm lzn.fit = fit.variogram(lzn.vgm, model = vgm(1, "Sph", 900, 1)) lzn.fit plot(lzn.vgm, lzn.fit) ################################################### ### code chunk number 7: gstat.Rnw:155-156 ################################################### print(plot(lzn.vgm, lzn.fit)) ################################################### ### code chunk number 8: gstat.Rnw:162-166 ################################################### lznr.vgm = variogram(log(zinc)~sqrt(dist), meuse) lznr.fit = fit.variogram(lznr.vgm, model = vgm(1, "Exp", 300, 1)) lznr.fit plot(lznr.vgm, lznr.fit) ################################################### ### code chunk number 9: gstat.Rnw:169-170 ################################################### print(plot(lznr.vgm, lznr.fit)) ################################################### ### code chunk number 10: gstat.Rnw:179-181 ################################################### lzn.kriged = krige(log(zinc)~1, meuse, meuse.grid, model = lzn.fit) spplot(lzn.kriged["var1.pred"]) ################################################### ### code chunk number 11: gstat.Rnw:184-185 ################################################### print(spplot(lzn.kriged["var1.pred"])) ################################################### ### code chunk number 12: gstat.Rnw:189-192 ################################################### lzn.condsim = krige(log(zinc)~1, meuse, meuse.grid, model = lzn.fit, nmax = 30, nsim = 4) spplot(lzn.condsim, main = "four conditional simulations") ################################################### ### code chunk number 13: gstat.Rnw:195-196 ################################################### print(spplot(lzn.condsim, main = "four conditional simulations")) ################################################### ### code chunk number 14: gstat.Rnw:201-204 ################################################### lzn.condsim2 = krige(log(zinc)~sqrt(dist), meuse, meuse.grid, model = lznr.fit, nmax = 30, nsim = 4) spplot(lzn.condsim2, main = "four UK conditional simulations") ################################################### ### code chunk number 15: gstat.Rnw:207-208 ################################################### print(spplot(lzn.condsim2, main = "four UK conditional simulations")) ################################################### ### code chunk number 16: gstat.Rnw:217-220 ################################################### lzn.dir = variogram(log(zinc)~1, meuse, alpha = c(0, 45, 90, 135)) lzndir.fit = vgm(.59, "Sph", 1200, .05, anis = c(45, .4)) plot(lzn.dir, lzndir.fit, as.table = TRUE) ################################################### ### code chunk number 17: gstat.Rnw:223-224 ################################################### print(plot(lzn.dir, lzndir.fit, as.table = TRUE)) ################################################### ### code chunk number 18: gstat.Rnw:257-259 ################################################### lznr.dir = variogram(log(zinc)~sqrt(dist), meuse, alpha = c(0, 45, 90, 135)) plot(lznr.dir, lznr.fit, as.table = TRUE) ################################################### ### code chunk number 19: gstat.Rnw:262-263 ################################################### print(plot(lznr.dir, lznr.fit, as.table = TRUE)) ################################################### ### code chunk number 20: gstat.Rnw:280-283 ################################################### vgm.map = variogram(log(zinc)~sqrt(dist), meuse, cutoff = 1500, width = 100, map = TRUE) plot(vgm.map, threshold = 5) ################################################### ### code chunk number 21: gstat.Rnw:286-287 ################################################### print(plot(vgm.map, threshold = 5)) ################################################### ### code chunk number 22: gstat.Rnw:300-311 ################################################### g = gstat(NULL, "log(zn)", log(zinc)~sqrt(dist), meuse) g = gstat(g, "log(cd)", log(cadmium)~sqrt(dist), meuse) g = gstat(g, "log(pb)", log(lead)~sqrt(dist), meuse) g = gstat(g, "log(cu)", log(copper)~sqrt(dist), meuse) v = variogram(g) g = gstat(g, model = vgm(1, "Exp", 300, 1), fill.all = TRUE) g.fit = fit.lmc(v, g) g.fit plot(v, g.fit) vgm.map = variogram(g, cutoff = 1500, width = 100, map = TRUE) plot(vgm.map, threshold = 5, col.regions = bpy.colors(), xlab = "", ylab = "") ################################################### ### code chunk number 23: gstat.Rnw:314-315 ################################################### print(plot(v, g.fit)) ################################################### ### code chunk number 24: gstat.Rnw:318-319 ################################################### print(plot(vgm.map, threshold = 5, col.regions = bpy.colors(), ylab = "", xlab = "")) gstat/inst/doc/spatio-temporal-kriging.bib0000644000176200001440000003167115143625244020362 0ustar liggesusers% Encoding: windows-1252 @Article{bakar2015, author = {Bakar, Khandoker Shuvo and Sahu, Sujit K}, title = {{spTimer}: Spatio-Temporal Bayesian Modelling Using {R}}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {15}, pages = {1--32}, url = {https://dx.doi.org/10.18637/jss.v063.i15} } @Manual{Beygelzimer2013, Title = {{FNN}: Fast Nearest Neighbor Search Algorithms and Applications}, Author = {Alina Beygelzimer and Sham Kakadet and John Langford and Sunil Arya and David Mount and Shengqiao Li}, Note = {R package version 1.1}, Year = {2013}, Url = {https://CRAN.R-project.org/package=FNN} } @Article{Bilonick1988, Title = {Monthly hydrogen ion deposition maps for the northeastern {U.S.} from {J}uly 1982 to {S}eptember 1984}, Author = {Richard A. Bilonick}, Journal = {Atmospheric Environment (1967) }, Year = {1988}, Number = {9}, Pages = {1909 - 1924}, Volume = {22}, ISSN = {0004-6981}, Keywords = {\{NCA\} Precipitation Quality Network}, Url = {https://www.sciencedirect.com/science/article/pii/0004698188900807} } @Article{biondi, Title = {Space-time kriging extension of precipitation variability at 12 km spacing from tree-ring chronologies and its implications for drought analysis }, Author = {Biondi, F.}, Journal = {Hydrology and Earth System Sciences Discussussions}, Year = {2013}, Pages = {4301-4335}, Volume = { 10 }, Url = {https://dx.doi.org/10.5194/hessd-10-4301-2013} } @Book{Cressie2011, Title = {Statistics for spatio-temporal data}, Author = {Cressie, Noel and Wikle, Christopher K}, Publisher = {Wiley}, Year = {2011} } @Article{DeCesare2001, Title = {Estimating and modeling space-time correlation structures}, Author = {L. {De Cesare} and D.E Myers and D Posa}, Journal = {Statistics \& Probability Letters}, Year = {2001}, Number = {1}, Pages = {9--14}, Volume = {51}, Url = {https://dx.doi.org/10.1016/S0167-7152(00)00131-0}, ISSN = {0167-7152}, Keywords = {Space–time correlation}, Owner = {b_grae02}, Timestamp = {2013.04.17} } @Article{DeIaco2001, Title = {Space-time analysis using a general product-sum model}, Author = {De Iaco, S. and D.E. Myers and D. Posa}, Journal = {Statistics \& Probability Letters}, Year = {2001}, Number = {1}, Pages = {21--28}, Volume = {52}, Url = {https://dx.doi.org/10.1016/S0167-7152(00)00200-5}, ISSN = {0167-7152}, Keywords = {Space–time random fields}, Owner = {b_grae02}, Timestamp = {2013.04.17} } @Article{finley2015, author = {Finley, Andrew O and Banerjee, Sudipto and Gelfand, Alan E}, title = {{spBayes} for Large Univariate and Multivariate Point-Referenced Spatio-Temporal Data Models}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {13}, url = {https://dx.doi.org/10.18637/jss.v063.i13} } @Article{Gasch2015, author = {Caley K. Gasch and Tomislav Hengl and Benedikt Gr{\"a}ler and Hanna Meyer and Troy S. Magney and David J. Brown}, title = {Spatio-temporal interpolation of soil water, temperature, and electrical conductivity in {3D} + {T}: The {C}ook Agronomy Farm data set}, journal = {Spatial Statistics}, year = {2015}, volume = {14, Part A}, pages = {70 - 90}, issn = {2211-6753}, keywords = {Digital soil mapping}, url = {https://www.sciencedirect.com/science/article/pii/S2211675315000251} } @Article{hu, Title = {Spatio-temporal Transmission and Environmental Determinants of Schistosomiasis Japonica in Anhui Province, China}, Author = {Yi Hu and Rui Li and Robert Bergquist and Henry Lynn and Fenghua Gao and Qizhi Wang and Shiqing Zhang and Liqian Sun and Zhijie Zhang and Qingwu Jiang}, Journal = {PLoS Neglected Tropical Diseases}, Year = {2015}, Number = {2}, Volume = {9}, Url = {https://dx.doi.org/10.1371/journal.pntd.0003470} } @Article{Kilibarda2014, Title = {Spatio-temporal interpolation of daily temperatures for global land areas at 1 km resolution}, Author = {Kilibarda, Milan and Hengl, Tomislav and Heuvelink, Gerard B. M. and Gr{\"a}ler, Benedikt and Pebesma, Edzer and Per\v{c}ec Tadi{\'c}, Melita and Bajat, Branislav}, Journal = {Journal of Geophysical Research: Atmospheres}, Year = {2014}, Number = {5}, Pages = {2294--2313}, Volume = {119}, ISSN = {2169-8996}, Keywords = {spatio-temporal kriging, spatio-temporal interpolation, daily air temperature, MODIS LST}, Url = {https://dx.doi.org/10.1002/2013JD020803} } @Article{kj99, Title = {Geostatistical Space-Time Models: A Review}, Author = {Kyriakidis, Phaedon C. and Journel, Andr\'{e} G.}, Journal = {Mathematical Geology}, Year = {1999}, Number = {6}, Pages = {651--684}, Volume = {31}, Url = {https://dx.doi.org/10.1023/A:1007528426688}, Publisher = {Kluwer Academic Publishers-Plenum Publishers} } @Article{lindgren2015, author = {Lindgren, Finn and Rue, H{\aa}vard}, title = {Bayesian spatial modelling with {R-INLA}}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {19}, publisher = {University of Bath}, url = {https://dx.doi.org/10.18637/jss.v063.i19} } @Article{marek, Title = {Using geovisual analytics in {G}oogle {E}arth to understand disease distribution: a case study of campylobacteriosis in the {C}zech {R}epublic (2008--2012)}, Author = {Luk\'{a}\u{s} Marek and Pavel Tu\u{c}ek and V\'{i}t P\'{a}szto}, Journal = {International Journal of Health Geographics}, Year = {2015}, Number = {7}, Pages = {1--13}, Volume = {14}, Url = {https://link.springer.com/article/10.1186/1476-072X-14-7} } @Article{Nash2014, Title = {On Best Practice Optimization Methods in {R}}, Author = {John C. Nash}, Journal = {Journal of Statistical Software}, Year = {2014}, Number = {2}, Pages = {1--14}, Volume = {60}, Url = {https://www.jstatsoft.org/v60/i02} } @Article{optim, Title = {Numerical Optimization in {R}: {B}eyond optim}, Author = {Ravi Varadhan}, Journal = {Journal of Statistical Software}, Year = {2014}, Month = {9}, Number = {1}, Pages = {1--3}, Volume = {60}, Url = {https://dx.doi.org/10.18637/jss.v060.i01} } @Article{pe1, Title = {Mapping Sea Bird Densities over the {N}orth {S}ea: Spatially Aggregated Estimates and Temporal Changes}, Author = { Edzer J. Pebesma and Richard N.M. Duin and Peter A. Burrough}, Journal = {Environmetrics}, Year = { 2005 }, Number = {6}, Pages = {573--587}, Volume = {16}, Url = {https://dx.doi.org/10.1002/env.723} } @InCollection{pe2, Title = {Spatio-temporal mapping of sea floor sediment pollution in the {N}orth {S}ea}, Author = {Edzer J. Pebesma and Richard N.M. Duin}, Booktitle = {Fifth European Conference on Geostatistics for Environmental Applications, GeoENV2004}, Publisher = {Springer}, Year = {2005}, Editor = { Philip Renard and Roland Froidevaux }, Pages = { 367--378 }, Url = {https://dx.doi.org/10.1007/3-540-26535-X_31} } @Article{Pebesma2004, Title = {Multivariable geostatistics in {S}: the gstat package}, Author = {Edzer J. Pebesma}, Journal = {Computers \& Geosciences}, Year = {2004}, Pages = {683--691}, Volume = {30}, Owner = {b_grae02}, Timestamp = {2013.04.17}, Url = {https://dx.doi.org/10.1016/j.cageo.2004.03.012} } @Article{Pebesma2012, Title = {{spacetime}: Spatio-Temporal Data in {R}}, Author = {Edzer Pebesma}, Journal = {Journal of Statistical Software}, Year = {2012}, Number = {7}, Pages = {1--30}, Volume = {51}, Url = {https://www.jstatsoft.org/v51/i07/} } @Manual{RCoreTeam2014, Title = {R: A Language and Environment for Statistical Computing}, Address = {Vienna, Austria}, Author = {{R Core Team}}, Organization = {R Foundation for Statistical Computing}, Year = {2014}, Url = {https://www.R-project.org/} } @Manual{RCoreTeam2015, title = {R: A Language and Environment for Statistical Computing}, author = {{R Core Team}}, organization = {R Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2015}, url = {https://www.R-project.org/} } @Article{Schlather2014, Title = {Analysis, Simulation and Prediction of Multivariate Random Fields with Package {RandomFields}}, Author = {Martin Schlather and Alexander Malinowski and Peter J. Menck and Marco Oesting and Kirstin Strokorb}, Journal = {Journal of Statistical Software}, Year = {2014}, Number = {8}, Pages = {1--25}, Volume = {63}, Url = {https://www.jstatsoft.org/v63/i08} } @Article{sigrist2015, author = {Fabio Sigrist and Hans R. K\"unsch and Werner A. Stahel}, title = {{spate}: An {R} Package for Spatio-Temporal Modeling with a Stochastic Advection-Diffusion Process}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {14}, pages = {1--23}, url = {https://www.jstatsoft.org/v63/i14/} } @Article{Snepvangers2003, Title = {Soil water content interpolation using spatio-temporal kriging with external drift}, Author = {J.J.J.C Snepvangers and G.B.M Heuvelink and J.A Huisman}, Journal = {Geoderma}, Year = {2003}, Number = {3 -- 4}, Pages = {253--271}, Volume = {112}, Url = {https://dx.doi.org/10.1016/S0016-7061(02)00310-5}, ISSN = {0016-7061}, Keywords = {Geostatistics}, Owner = {b_grae02}, Timestamp = {2013.04.17} } @Article{yoon, author = {Seo Youn Yoon and Srinath K. Ravulaparthy and Konstadinos G. Goulias}, title = {Dynamic diurnal social taxonomy of urban environments using data from a geocoded time use activity-travel diary and point-based business establishment inventory }, journal = {Transportation Research Part A: Policy and Practice }, year = {2014}, volume = {68}, number = {0}, pages = {3 - 17}, url = {https://dx.doi.org/10.1016/j.tra.2014.01.004}, issn = {0965-8564} } gstat/inst/doc/st.Rnw0000644000176200001440000003631015143634646014253 0ustar liggesusers%% Document started, Sat Jul 3 19:30:52 CEST 2004, my 37th birthday, %% while being stuck for 24 hours at Philadelphia airport, on my way %% back from the joint TIES/Accuracy 2004 symposium in Portland, ME. %% Continued, Oct 28, during the Apmosphere mid-term review. Oh, shame. \documentclass[a4paper]{article} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \newcommand{\code}[1]{{\tt #1}} \SweaveOpts{echo=TRUE} \title{Introduction to Spatio-Temporal Variography } % \VignetteIndexEntry{ Introduction to Spatio-Temporal Variography } \author{ \includegraphics[width=.4\columnwidth]{ifgi-logo_int}\\ \href{mailto:edzer.pebesma@uni-muenster.de}{Edzer Pebesma}, \href{mailto:ben.graeler@uni-muenster.de}{Benedikt Gr\"{a}ler} } \date{\small \today } \begin{document} \setkeys{Gin}{width=0.9\textwidth} \maketitle \section{Introduction} Since \code{gstat} package version 1.0-0, a dependency of gstat on the R package \code{spacetime} was introduced, allowing the code in \code{gstat} to exploit spatio-temporal data structures from that package. This vignette describes the possibilities and limitations of the package for spatio-temporal geostatistics. To understand some of the possibilities and limitations, some knowledge of the history of the software is needed. The original \code{gstat} software (Pebesma and Wesseling, 1998) was a standalone computer {\em program} written in around 25,000 lines of C code, and would do geostatistical modelling, prediction and simulation. The \code{gstat} R package (Pebesma, 2004) consisted mostly of an R interface to this C code, together with convenience functions to use R's modelling interface (formula's, see \code{?lm}) and graphic capabilities (trellis graphics in package \code{lattice} to show cross variogram as matrix plots; interaction with variogram clouds using base plots). Starting 2003, a group of programmers developed a set of classes and methods for dealing with spatial data in R (points, lines, polygons, grids), which was supported by the publications of the well-known ASDAR book (Bivand et al. 2008; see also \url{https://asdar-book.org/}) and helped convergence in the user community, with in 2011 over 2000 subscribers on the {\tt r-sig-geo} mailing list. Package \code{gstat} was one of the first packages that adopted and benefited from these classes. To realize a particular idea, writing code in C typically takes about 10-20 times as long as writing it in R. C code can be more efficient, gives more control over memory usage, but is also more error prone--mistakes in C code make an R session crash, something that is hard to do when writing R code. The original C code of \code{gstat} (Pebesma and Wesseling, 1998) provides all kriging varieties (universal, ordinary, simple; univariable, or multivariable as in cokriging) for two- or three-dimensional data. When the spatial domain is constrained to two dimensions (and this might cover over 99\% of the use cases!), the third dimension might be used to represent time. As such, the {\em metric} variogram model, which allows for geometric anisotropy definition in three dimensions, can be used for spatio-temporal kriging. When defining the three-dimensional variogram as the sum of 2 or more nested variogram (summed) models, one can choose anisotropy coefficients for a single model such that this model is {\em effectively} zero in some directions, e.g. in space {\em or} in time; this allows one to approximate the so-called space-time sum model. It should be noted that at the C code there is no knowledge whether a third dimension represents space, or time. As such, particular characteristics of time cannot be taken care of. Since the second half of 2010, the development of an R package \code{spacetime} started. It provides methods and classes for spatio-temporal data, and builds on the spatial data classes in \code{sp} and time series classes in \code{xts}. This document will explain how data in this form, and methods provided by this package, can be used for spatio-temporal geostatistics. We will work with a data set with air quality (PM10) measurements over germany, taken from rural background stations available in the data sets provided by the European Environmental Agency. <<>>= library(spacetime) rm(list = ls()) data(air) ls() @ \section{Variography} \subsection{Temporal autocorrelation and cross correlation} We will look into a subset of the data, ranging from 2005 to 2010, and remove stations that have only missing values in this period: <<>>= if (!exists("rural")) rural = STFDF(stations, dates, data.frame(PM10 = as.vector(air))) rr = rural[,"2005::2010"] unsel = which(apply(as(rr, "xts"), 2, function(x) all(is.na(x)))) r5to10 = rr[-unsel,] summary(r5to10) @ Next, we will (rather arbitrarily) select four stations, which have the following labels: <<>>= rn = row.names(r5to10@sp)[4:7] rn @ In the following, autocorrelation functions are computed and plotted. The resulting plot is shown in Figure~\ref{fig:acf}. <>= par(mfrow=c(2,2)) # select 4, 5, 6, 7 for (i in rn) { acf(na.omit(r5to10[i,]$PM10), main = i) } par(mfrow=c(1,1)) @ \begin{figure}[hbt] \begin{center} <>= par(mfrow=c(2,2)) # select 4, 5, 6, 7 rn = row.names(r5to10@sp)[4:7] for (i in rn) { x <- as.numeric(na.omit(r5to10[i, ])) acf(x, main = i) } @ \end{center} \caption{Autocorrelations for PM10; time lag unit in days.} \label{fig:acf} \end{figure} Auto- and cross correlations can be computed when a multivariate time series object is passed to {\tt acf}: <>= acf(na.omit(as(r5to10[rn,], "xts"))) @ The resulting plot is shown in Figure~\ref{fig:ccf}. \begin{figure}[hbt] \begin{center} <>= acf(na.omit(as(r5to10[rn,], "xts"))) @ \end{center} \caption{autocorrelations (diagonal) and cross correlations (off-diagonal) for the four stations selected; time lag unit in days. } \label{fig:ccf} \end{figure} From these graphs one should be able to observe the following \begin{itemize} \item autocorrelations for lag 0 are always 1 \item cross correlations for lag 0 are not always 1 \item cross correlations can be asymmetric, meaning that when $\rho_{AB}(h)$ is the correlation between $Z(s_A,t)$ and $Z(s_B,t+h)$, $$\rho_{AB}(h) = \rho_{BA}(-h) \ne \rho_{AB}(-h)$$ with $s_A$ and $s_B$ the two stations between which a cross correlation is computed, and $h$ the (directional!) lag between the series. \end{itemize} The plot further more shows that for these four stations the asymmetry is not very strong, but that cross correlations are fairly strong and of a similar form of autocorrelations. This kind of plot does not work very well in layouts of e.g. 10 x 10 sub-plots; {\tt acf} automatically chooses 4 x 4 as the maximum a single plot. To try this out, do a 7 x 7 plot <>= acf(na.omit(as(r5to10[4:10,], "xts"))) @ and note that here we see in the last figure (DESH \& DESN04) a pair of plots with nearly no cross correlation. This might have to do with the spatial distance between these two stations: <<>>= library(sp) print(spDists(r5to10[4:10,]@sp), digits=3) @ (What is the spatial distance between stations DESH and DESN04?) \subsection{Spatial correlation, variograms} In the next steps, we will sample 100 time instances randomly, <<>>= rs = sample(dim(r5to10)[2], 100) @ we select these instances as a {\tt SpatialPointsDataFrame} and add a time index to them. After this we bind them together in a single {\tt SpatialPointsDataFrame} which has a time index {\tt ti}: <<>>= lst = lapply(rs, function(i) { x = r5to10[,i]; x$ti = i; rownames(x@coords) = NULL; x} ) pts = do.call(rbind, lst) @ Then, we can compute the pooled variogram <<>>= library(gstat) v = variogram(PM10~ti, pts[!is.na(pts$PM10),], dX=0) @ and plot it (Figure~\ref{fig:vgm}): <>= # plot(v, fit.variogram(v, vgm(1, "Exp", 200, 1))) vmod = fit.variogram(v, vgm(100, "Exp", 200)) plot(v, vmod) @ \begin{figure}[hbt] \begin{center} <>= # plot(v, fit.variogram(v, vgm(1, "Exp", 200, 1))) vmod = fit.variogram(v, vgm(100, "Exp", 200)) print(plot(v, vmod)) @ \end{center} \caption{sample spatial variogram, averaged over 100 randomly chosen time steps} \label{fig:vgm} \end{figure} The fitted model is this: <<>>= vmod @ One should note that the fit is rather poor, and not forget that we only have 53 stations selected. The time resolution is rich (1862 days) but the number of stations is small: <<>>= dim(r5to10) @ We can fit a spatio-temporal variogram the usual way, by passing an object of class {\tt STFDF} (Pebesma, 2012): <>= vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) @ Alternatively, if this takes too long, a temporal subset can be taken, e.g. using the first 200 days: <>= vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) @ taking random days from the full period will lead to the a wrong assumption that every time index increment reflect a constant lag increase. As an alternative, we will here load the precomputed S/T variogram: <<>>= data(vv) @ % remove the model column to keep text and figures in line. <>= vv <- vv[c("np", "dist", "gamma", "id", "timelag", "spacelag")] @ Plotting this object can be done in several ways, two 2D-plots are shown in Figure~\ref{fig:map} and a 3D wireplot is shown in Figure~\ref{fig:wire}: <>= plot(vv) plot(vv, map = FALSE) @ \begin{figure}[hbt] \begin{center} <>= print(plot(vv), split = c(1,1,1,2), more = TRUE) print(plot(vv, map = FALSE), split = c(1,2,1,2)) @ \end{center} \caption{Spatio-temporal sample variogram map (top) and sample variograms for each time lag (bottom); both figures depict the information of object {\tt vv}.} \label{fig:map} \end{figure} \subsection{Fitting a spatio-temporal variogram model} At first, we try to fit a metric model with spatio-temporal anisotropy: <<>>== metricVgm <- vgmST("metric", joint=vgm(50,"Exp",100,0), stAni=50) metricVgm <- fit.StVariogram(vv, metricVgm) @ As numerical criterion to judge the goodness of fit of model and sample variogram, the root-mean-squared-difference between the surfaces can be obtained by: <<>>= attr(metricVgm, "optim")$value @ The final model can be plotted with the sample variogram (Figure~\ref{fig:mm}): <>= plot(vv, metricVgm) @ \begin{figure}[hbt] \begin{center} <>= print(plot(vv, metricVgm)) @ \end{center} \caption{Sample variogram map (left) and fitted metric model (right).} \label{fig:mm} \end{figure} \pagebreak Now, let us try to fit and plot a separable model (Figure~\ref{fig:sm}): <<>>== sepVgm <- vgmST("separable", space=vgm(0.9,"Exp", 123, 0.1), time =vgm(0.9,"Exp", 2.9, 0.1), sill=100) sepVgm <- fit.StVariogram(vv, sepVgm, method = "L-BFGS-B", lower = c(10,0,0.01,0,1), upper = c(500,1,20,1,200)) @ To compare this model with the previous one, we look at the optimized root-mean-squared-differences between the two surfaces and plot sample and both models: <<>>= attr(sepVgm, "optim")$value plot(vv, list(sepVgm, metricVgm)) @ \begin{figure}[hbt] \begin{center} <>= print(plot(vv, list(sepVgm, metricVgm))) @ \end{center} \caption{Sample variogram map (left), fitted separable model (middle) and fittted metric model (right).} \label{fig:sm} \end{figure} A wireframe (3D) plot of sample variogram and fitted variogram models can be obtained e.g. by <>= library(lattice) plot(vv, list(sepVgm, metricVgm), all=T, wireframe=T, zlim=c(0,120), zlab=NULL, xlab=list("distance (km)", rot=30), ylab=list("time lag (days)", rot=-35), scales=list(arrows=F, z = list(distance = 5))) @ which is shown in Figure~\ref{fig:wire}. Further spatio-temporal model definitions can be found in the help pages of {\tt fit.StVariogram} and {\tt variogramSurface}. The demo {\tt stkrige} presents further examples and illustrates an interactive 3D-plot of sample variogram and the fitted variogram model. \begin{figure}[hbt] \begin{center} <>= library(lattice) print(plot(vv, list(sepVgm, metricVgm), all=T, wireframe=T, zlim=c(0,120), zlab=NULL, xlab=list("distance (km)", rot=30), ylab=list("time lag (days)", rot=-35), scales=list(arrows=F, z = list(distance = 5)))) @ \end{center} \caption{Wireframe plots of sample and fitted space-time variograms.} \label{fig:wire} \end{figure} \clearpage \section{Spatio-temporal prediction} The vignette in package \code{spacetime} gives an example of using the gstat function \code{krigeST} for spatio-temporal kriging of the Irish wind data. The \code{krigeST} function uses global kriging, but only needs to invert the purely spatial and purely time covariance matrices in the separable case. For more generic spatio-temporal kriging where space is two-dimensional, one could use \code{krige}, defining the observations and prediction locations as three-dimensional data sets, see for an example <>= demo(gstat3D) @ It needs to be pointed out that in that case, the time (typically the third dimension) needs to be numeric, and three-dimensional anisotropy needs to be defined properly (see \code{?vgm}). In case the data set is too large for global kriging, one could try to use local kriging, and select data within some distance, or by specifying \code{nmax} (the nearest $n$ observations). In both cases, it is advisable to transform time such that one can use an {\em isotropic} variogram model in the three dimensions, as only in that case the nearest $n$ observations correspond to the $n$ most correlated observations. \code{krigeST} provides a solution where a \code{bufferNmax}-times larger neighbourhood is evaluated within the covariance model and the strongest correlated \code{nmax} neighbours are selected. An additional consideration is that in space-time, observations may not be regularly spaced. In some cases, the nearest $n$ observations may come from a single measurement location, which may lead to sharp jumps/boundaries in the interpolated values. This might be solved by using larger neighbourhoods, or by setting the \code{omax} in \code{krige} or \code{gstat} calls to the neighbourhood size to select {\em per octant} (this should be combined with specifying \code{maxdist}). %\section{Spatio-temporal simulation} \section*{References} \begin{itemize} \item Bivand, R., E. Pebesma and V. Gomez-Rubio, 2008. Applied Spatial Data Analysis with R. Springer. \item Cressie, N.A.C., 1993. Statistics for Spatial Data. Wiley. \item Cressie, N. and C. Wikle, 2011. Statistics for Spatio-temporal Data. Wiley. \item Pebesma, E., 2012. spacetime: Spatio-Temporal Data in R. Journal of Statistical Software, volume 51, issue 7; \href{https://www.jstatsoft.org/v51/i07/}{1-30}. \item Pebesma, E.J., Wesseling, C.G., 1998. Gstat, a program for geostatistical modelling, prediction and simulation. Computers \& Geosciences, 24 (1), pp. 17--31. \item Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers \& Geosciences \href{http://www.sciencedirect.com/science/journal/00983004}{30: 683-691} \item Ver Hoef, J.M., Cressie, N.A.C, 1993. Multivariable Spatial Prediction. Mathematical Geology, 25 (2), pp. 219--240. \end{itemize} \end{document} gstat/inst/doc/gstat.pdf0000644000176200001440000116027315162303121014737 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 2402 /Filter /FlateDecode /N 52 /First 399 >> stream xY[S~?b6[)i.hk+uveX2!ןG-[Ƙ@Nܺ{z 1|0Ť/f*~g! u 3d=1RkT `f @8`RKL h"1A& @L0# d0 !J's+)X4(Yz( ЇP,TPIZDihhXX$4 J0SL^ueXd@UPQ!όx-Q%3: 2e̴xg~ ]kRIf 4'2~Qik.XMw"oٻw֤cWmLvҲ7 O@" x/8s[Rc{#[>&dz8LN0/ʢ?NJXݦ'6}9\m#yz;$+Q*`Oݿڰ?TU܍jA7S ꢚ5+V oteyIa3j'J6l  #:қnM(1Þ-ɸ`` -AC @][ҦrWCx/#z%9~ H$èpK)2W̴%^&xM°%Yh~@n6}:l^IvemeE2kOE3Ǥ}VήYq\!wO~tIb} ʡG<_)hON#6?7~f2: }e"7RS7VKGWϽEnT݋yo 1TQܥSSEy5vE67DXD{oaxJN {w.?G'>pP~o{o`y)gf<96EK^['aX,Oۂ9ۍNsHꫪs?I-F-~Gv-"&Փ(`HnkGiG$ɶeޟ';=mZ4@cزŪE+!1=KPӱVU ZXC%ܺڔ6l1D ),/Дi'$! 9Tw:{]QD6L\vS4v0JP#k.JѴUc?ԁVUBko;x}~fh9.g@/!e+l$Mm 44?$pLgE7rޑOMY5MʿNS7Tc*J܋4..j9o("Ewyg'{.?nǎy6]#Hn]:)=^cӣ`kDF mpHپٽ 5'2Ɨ0ܯ+N"/{enNO3u%9"CXw[ݺ\~KQq|o7¯+-L%7-Xuk;+lʚr6eҏ7t2Mt5ŦCf168jXn۾kĊI՗4_NuCendstream endobj 54 0 obj << /Subtype /XML /Type /Metadata /Length 1388 >> stream GPL Ghostscript 10.02.1 2026-03-29T22:06:40+02:00 2026-03-29T22:06:40+02:00 LaTeX with hyperref endstream endobj 55 0 obj << /Type /ObjStm /Length 1994 /Filter /FlateDecode /N 51 /First 405 >> stream xYYoF~EU|DN(qeuSAh,պY%N,cvo!hK'=)ƈflj1C ^kb$9b b4JB!Hd N{"8,'B[E )I$)AI hH-Ha%c96Q JG@%`D)o v WPtq䈖\kE<@/2Fb?P@h ac'@1ЈP6g ll y5e߼|IQYfD(Y3#BMx DŽ~ddɫWaq C~':sG0Ҩ0,CCOզdS13f9{h3x*v]urtUqPL2njB|+)ggY>Uq_Ȳ 4W- @n *S) u@h35p|Ҷ 4ߣ.sWl@Rb^ͺa Wm&b4nŚVʿmܕJ>n.:x\':ݬfQ,f1nq(P#\*e=\skp+-,㢓b[r>nsru[o۾D=;FOs8;:w+My;/]},ya[ppuuыw''~w6,'BMumtfV}0CH6WYI%Wҿ&v <[ [sRW (Gβ=_SAhz(_% +\gh, #=޿[|HeAzN,]K:17&];{kͷ]tެ i:,9tZڗy(YPJuӻǪo",o'54XH`βۨf^zQ`Uvx|4:ϟEh//2H3Qz۶sUͦce)հi-#NӲo[>kZpJ{Xk7&?s1XJuƂP4rjwۖN=q!e$U#(w: e-@:@o o7x"ko_X r?}Z]8W˃.Yn;ma݀*WT҃#J폨+ޜ LCPץo!uXCwmdfxYU4(ĀiQDifP5[pՃğ`H\AYmiIySHu峾^Q/V]Ix\:^q+<n%/3B-fY.Yvh&QED3FpFR۰aǫ[7j7[:)6BE*pQewS"E_`O=Nc0 Z{ytדfVB`Iendstream endobj 107 0 obj << /Filter /FlateDecode /Length 2544 >> stream xYɒ7}s , R͘醈XDQ_ˬ*,͞< @e&iGr?<Ļçɿw*,R21wDdj4vij"e^$z\]+V{hdHEZ2D(3p\6ⷊBRO )UVTO]'p)X:Iӑ'/8gD$Zٷ^LULT;i"mRgR;$3P?HL)u S2)ƞ-&JPhҴ)ǺkI3M0;KL &9 CB}8YV l1!ǂ*„*nLds+}WšS[ވO{Y.kœkE 4~mI$6;# YnK'޸.nHu]}=iy{nJMÍb:8hJ\`b! r19b=)ϗ"-R#nW|Ɵ^"{*AIsg\} g0MPJ'[>HSaN\gk2]Z/6! HjSCoS ]Jd?E@% wH'>CAP$E7 =~`A `Q㺾SIƖęCUL?L|?}7wS%(G׶UPnϭG$"hLl2>3 `ytMY7Y|b<܅ 9_ܣ8u.GV]Oa|5ĉq񡶤 =- @FɃ[8(^Vv;×[7SAF/5m~icXMeRhv\Rm=@c*0a340YNa@hO|K3S[Vݰgtd[O8>u7Lk ,ȑ@ɮNVqNG5M"46'7nV֎ŠL Lݡ &]ō?u!O_ɠ#TU]!`ꯎzQR60̇gBosx\?˱" %5Xi]Vnػ\tUiqYȊ$ӛ 鷺]pspE9&,~tw4Z64n?"bA E%͸Zm w)]6B;M0knxU>Š9XXq[X]Eaǽ*E1 ݩW70 u{miKD1uCDZK(F] ̍brWĤy~Ij"FCt$/‡ b^ڝ'Bh˄fn8}l?#EL}7 ^fJ^13kAT~P4,l~3vp,"}ϺSa)z0,x a+.WIJy~zW~rlSudUotzV%*&9 (D002;hV^ ø|^tY ? i"${֫<:q*hf)OS~Y-:X8T\]]-/&W& C3ᷭLcA]yn o"xǾ~)h>?8eT =֡OJ1JjgBP?0&b:і#p0a؆ $O+ڥw )> ۪WP-btE*Ns~MH8b;l_hu|,>̌jgvW{CU-7Tj'2cw|jvcL9_x5}{Z}UX~W`X}%!rnIſrNendstream endobj 108 0 obj << /Filter /FlateDecode /Length 1998 >> stream xXKoW~m &; 3;C{D!E I=nd.|ɮW_U5m#ޖ /-~m߮EJ_ RG ˘HH.7S덌!hϪMۼimZ}1ݮűdU#.SsJ{6d* ޽a}wX$m^zb,ze "$x" i\k!D䌎^\?JVnQ8"^"(poضz-zHݩٱ5e0wYTTj1\0F$ uJ(B@D괦A ;! $ nAe%s@đtBaL mV/7Y#\h-TG4WE >w8::}*-I4Έ2.=7!P=E(Vh&"Q*"s5O|oN9fDDZ4yV9Hu2}uړF P mJ0}|4QGrCr{F·LkJ8cE!NH{e +_т&ȅ/mWm?XlDBqTP@fE'<=l{ܱa&!aO#^e1#W ,ֻxoF޲Ӂllٶ"i2_LuujqӇ`x4hIKh?h=OCD=RH62J.PFL$}dv*F.mJ'qµ?8ekU>Q)D!w~Qq?9R"Mz0Ȉc|aYA/lq{hH VXdы0?L䗨 kzJ0@'.x8aΛNW8p>?l*z;z!YD ʶ*=1o6fns"t N@8*(0֓$FNDQd[թĨ/ozIڪOV2[`!@K!ζ PTm CL !pTp[d[cvM҅ ?31lqꪡycCWڨ\"3#x 3~6ɺm6͹E17 ikߡ+ryҮyLx06WϧBTz>l]U/؊X;G?WE,sV-=cDUVdpIDždj"`4MS"'&fHQ9nO[ +Pӱb·`5a~=/OaPaӭ&]{#y&HcH-nak1gxET~{&h&, & O|9cƚڽc@"}Oa >y73-q(LJ?*JXQkPB͑6#}rɰ> a뵰o>2T7jDpİ1~d'b$IB„/ /0=hvtO[&2M◛C > stream xXr6xS5Qci$3M,hHBQHvj/,}{? s~vF3ßvb{.[|q7N9k(L/kTVY9DŽ = x]qIz35Rjw}\>J6)xdrXU\Xxa;+3,qlzB* S)l1*@˺nVծhCkXRkjmA@S Ͷw5*ЦZu˶lJї)l཭p݄&r 7,DmMn{&pN9h|ڵڥz"rߟbeN3COedKuٳSFqi=zuϬf0hA hɤ#l/!Qa&J2I @?n{աdLr 4,6&9-)>8Ś{APE`(BZZ22SGնu\Vhfxc{V<ߏ@G:dᢼ z0l7~b1%20oo7S@ .{^۲]MMLh?,K,2n΃u}sf#r^8y^&qHW1!JEESXWGjds*05$`]P>$mF>{@+CWU&5dOi^nPNz+ he6?6E|H3Uq`) a%ddu_7ݴ7>M6Յ@may٭>+0 ˠ/,+ Um*oV0DgQ:aCQ-i)3 TtJe:f =a Y'67b_,?8v\է>ؙ> stream x}M&G޽~u6Vc/v3>z4Z4|H>$d -72dz^oOxӟ՟^mzt籍<=S;|g?׳?'bdxz _^ۙ 6 2"0z !Õ oOBy n ߯W"Z!Y6:1[ݔB{#%8CPPG2Xe{g`|ݎ_~n<~{eBמ6AL?_[NpYd,#B RPK`6w>cޯMm PO%Lc{|t<9"wCbnQ86A|'(a= 1ZZjv뜂Mm#flQ.Odl,O:q¦u녃.#zr8 S5d8EPPorXPny!U{t?}6׾ =Os aĴ(9lb" BäъeFqb9e1&2[.32(|&)u猔]EeF$[IVf8l$2%OLec kPs+񜃏oip7(ۏeeA̼)AMF |ʿ OXϓB+4 wyû쬲veU E_2#v;CX^;`G= Y0p%pe8DVsӟpK5]| ֘ڤJqE u\S#IbdJk''hް$O@dLj'9E'dԂԒV; qXL'w}oNd(o|HRSrA}3I8ö@XlݛV{Loס1xe[Iw1`AXP]kDZHx )67um- HFbH.uMF8F^0MvÎȽ 5mZkV;̶SBʪ60!WR`2a|zHdZ0#)%9vԽ90ͫˮ9wn׭ђ˳^9%Nlp݉I*bYu޶V)W S'KYn^ZP4Y !^^dq/" ]TT9V2$xf] ! c`0+ÓpWa@D`D` C`M9Tѫ _-LN8&quFK6Q)p l20q6PnAU0#)%9vBb[`\3/1ͽe Iae Ɂp,8!#l -HA-a#/ } ".g?<D/ApNɀpہܐY!"Ёԑ V+U=1'6Yly,RU - VvX))p,ܓay,01; ZPD?$xŒ~A l l$(O6weA#UѬ(4][RSaB C N8 x*El'ΜL%͉ =/=L q'4NU8bto)ap%• f2y0ˈSTu,|tu%,bY)J%QPVa>=ׂ9#)aP|ƆHH9;R3 CQ=|Y?{-ܸp.~POU@:TaC-uԐVԪK!-p \;Yxgj̗pJ€bP 9L@ A@`b U]-2Ζğb , v2H#`P1>x5`1JFg5 i&gv=KvUMD1JO_ i(&]A@`*pZtsF,@^kҜ'@ -88201ڜȂRęAAa#͎l~`GBmaY O 4l3L%s9 + 8)%9vLu'Rnlfgz1(,} 2TpKdfSRPE`-/3vb$45|cM^<#aIa=)Ɂx{J̩ a 1ZZjѲ,W7 n,<q;pe:+C}bH(Rw{aJ\ RdaΕH׽d3׊8xGvr[nU k^S[k 7Fy}t3GU}en:`͎6䩞 }Y "B0p$OkYNçR@HAa5bi1mZXX:Lۭqy6odDaͤ`(9b@Ḟf %HA%jcGQs^0x6㸽{j@LmHs$󿍷68p D=<2wX61X}hoK%17 pf{ߎ XcaUi^8"|V'@"{W jMax&WLµzntj2%'&fPr@Y]d\M#EV;a]ʄ2v}`~H83Ž*a2^MS qfP;j}Gw?%0<27\-ԃB䜅:h\)-O+@ HOAIr >7roBa{Iȓw>CwwWvcy]!vBaט}Z*8 V)!8V} ]~=߱W9,V,HJ2@͝"(2h]@ h%(#V,C|cIߥ- 8\{0Ia9y2 h2g ߵ4yNKQ .Ͷ̉`uT4[<5 vc4O]C&#A{2(ȡ[\謰 -"tv{2,)fY+^w# ֖.R62 l1t6qp$P9(Ԭ K@ۙ5+felݶr 0ԬUtFT~T`Ǿӡk&}RÞ 4 ,(kMR'U$Ո0q؊a)k%Gۦ[A-!Z';آ%]S:0[0H-=`1"OT?+KwCR.9W{x?)C) 4 ^2 x'1*8E*m0 H #._z6q/ð@@ZW} ? }0Azbv-bo P> X_מas p v(-ؽcQ Fũ-ɁЮFG[3key0X \ RPIrX,Pq#<_un)|@d9 ~BȈB RPKrXgCffw8(1V5-ANg#)̕H:b<*A4Ϫ,z+%#pDu32T6ڴzNyxk yՠ@ j!`=R8n|B RPK`rcVg- eU֣yf`0+:,gqs2YHva P<04mɐ -JC $ u&*4ḭk,rq5,I1,9>41SR8-I7*ǁjiM71Ӷ6V2гk5):9cs])ojA jIj(1ŝhf{~cb΅4(d>[@g8SPN9|5+7^00ye?=*ڬ(B#x<"Ju$ xIb3FnMԒN! lJ~HR RPKrXM1^0wHLk \b+~vBl:bčmsr@Ud|ڱanT-m8).4˪FdDQƟ2F4n`>L9rw80qdtwyLK)F2-d֜%-~sMp l2S,k7%#h{ֶ.VGXGqcn>PS>d9ҭGIeϠ7 /P$82jGޖ/N3R+ћ ݛaĴnUsU!@?ꕀ:je nצhl~s|& ;΀0jOe)#VecKIeh:{^Be7YeFG/:53aY!r K` f#(`=w%HA%jE%Oc쵘T/:t ˏ8׉rt2%Q :Ҥ~8vdVȞu2#kds ;"H}q0}8K) BPXpz ؝#~"#KXP ǽ"#94Ƽ\dDǃZEh؈2EG8qV#cN ^sN{!#|ЂԒV;o[ {^d3,ׯX.x6vй~ZC (\a2X7Bb3/e vŎIa?&޹2#`odojGvt==~FCz#Bm!xo @ƺm޴27U '#U2R{^>yc ᷸')58bL}aX@2CЂԒV;7 [[DL=Y*ToggXR~j+0}A%8tCF;R Rda8\硨Rsܑ?V<93dE1wb} Zsb6 |+2 ֜kA jX'X Gzl}!h75(۔@8u u,E,7Y[{2 ɨ0F)uTL*g{,BSoCUކnA` 1̛#+o>?F7jBܢ 솹 цD>6Uv*8\Z!H> S6B4^.ms)NlKFov:ͿA 9"J5'ҜKJJjR{ƒ6pXm/^m 8άuW&25gQR7(%9v,M:Jw$1>QMۮESHȁxˋFH:eM$Վ1 >}$0O)شpi o"MFi Cqe_fI0R kZ1'$M^0Mw|/k׶kE=k^vPɁp;fv9ꈽ]a޿B*Q;s&jr\]ϸ$ f$))&LJ$gC*Vȁpm88!#7-HA-a\mM?@5¨GpXv:h+߇U=;¾^ v(T +rD=0~yy\_'qmP@8N!#NC R6GsE9WGu99|WsoᚗE.b)BK`E,im{zQKs\|^zPЃaT0_}g"|˯_0 $Q=`"dЯ+M;L!7~|RtTh8$"q<9 Ah" 'L%HA%Ã>5NJ[q1>Q ÁK9,qqb0XlYZsV[p68?='|I\<=|V ,Gܒ{uā)DP%PڪBzԵjTxL3?ׯďC+%?׿$ϸIh__?E6_(CPef~TCiɌ;zY{`&eg2.$}#qp!пd\BlAB&X˞=WcVD-a|K_W Prֿo q}͵S^_6̎G %iO?~SJmw/|}P=܎4Rj?|GY_WU/[ :~d=V8ucdi"@yu ?~`pwxo+]2E}q|x?@E6ڋX ~@$_!/9V2u|SÏ_~JJ׬_.beO<)ϐ<<菔._Ly|r/|O<_~9A"7sQi5x:{g[;__::&^^M}"2%3|j C럿}BXv4G7~C'_*BL^vޯ lŰyɤαuˏ'jOe]^o|9wUMUeߌHL|mRDd^ՏUZX*4NRSi0Zvۆ !G%4W2\[,uX=YhIS<*Kܘ(,mcثC|~Ճ)@~p y6]d:=.tUkTBYG Fɍ}{^NU">G0%9%.2nc9Ey[)}K $XhSIK^헿>*YVd5 B%>ȨM$:Y{:γB^4djb&~:Y{m'd5g(gMzXQVqWStccN|8{ƌ"6r)vۏk{׾X샿Iy͞ҋDZW',endstream endobj 111 0 obj << /Filter /FlateDecode /Length 3636 >> stream xZKIoPS5)8 !.kF`Ӟmgk~;YYm `"lb']L\u)q|6=tOfY>?o0%t~-xSn)O|w~y=<OۿsCf _Ld|;..· K-gYw?]Xr&N;)U_e2=sf-@!/m*.nVdpu+BnIAJn)b`S,unԀ+s1 lR0i1v0u<|05L#i 6!bY<\KrYLf)wxQ5V'4_xk ȆkEq.@EK(NK4fSRiF(,Zj-wWY[c**:εkk++&;׈ε k k#3|vY&%k),!xoaz|R?BEKw$#@%zeq~}J+N7\ё*82t4[M~` X@J\""Π<`pn]+\a!>.CBUWt$ ! Yݍ 9M y#3p"E.ъXŌFCMy)[a#Ӫ+:%PP+[%\!oiJ)ɩHq3U@,ggq |rش VZupEGp4*ƂՈƱB< dr>e(7x 1Z6aˁE V!UID:nEVv ~o|7f́D)낆(y&,ЈmoױpU4br6ҕs6 K"!$u aª4U"!$NyӪ@4w> H~ahh4W4Vnbp8VdTbӗ : 'J6]p 3 G3NYѐ MC\ѭ. .{ r K8Df#x} )NVJ V|:nEVv ~zF; NY[3kFNmO^*,B4' d}f䇂Frtk/W5KZ ;  =AC-KV[9*aUWt%->V+:je[l!Wj7"ؔ/2p\Ih $n'{McCJsA9}]µȖ}'S/V"}DeJf13boꠡ2CJXvXqb[9]µ[nqpۭ<9c=Vz3vٸ GtC6f"Il<AY/8ϻA xcdb˂e9)9/ڣكRJSQL|zbƉhguжcbdM)fЅˆHNlbF)bap.dU H)@Loּ3"y2d'"Bs.K(*Uá [lDsAbetQJjJzR;8ꊸEM%@!0&A /DfYE<@awI|t}^Vӡ'i1  LQu#*R,΢s/n! J~D}vebd]5^i.u"~* rS&PV݉%j"PhLJ$rYA.tbDW}%D e9]SJBL#5äL2;AX!騾A)H&J-h6a!(I=gTi*='$!O]5izk$"$QY/<?. }J|ɢF (6s˴)HĮ!RY`^1O{}o]6Y%O%L^UE$hQ@q2^1y^QK(U#eZIdPOId Lqg,$xBhg 2JE'3"SJZp$P,]T,@<30ʠ9*mZbn ) 3 єdJ 5(4ҩMyҩ&y5 '`!['\}:>ĸW9i<+ԫk<U.h85=h8 G,pRA[EUi4 { eIÉ"%i8rБXbk.=5DG#$3W4b["E??.m].ϧݧK[Z#(Id@Uozk/c7)?=_OKlt ϟXguc^e#?.2Fs>O3">b5~r~'cp*qèet^&ƈG]_v~;=|B5vH(e~"0Ϗ  | ԭ+ݤn><|O"gkogn~x7|~<~C$a#+Kݷ]F/OwF8'Q~;cy}{mm˻ _x뻾 4ńglo~:<aWW-qjӍݿ?endstream endobj 112 0 obj << /Filter /FlateDecode /Length 14914 >> stream xKlGrWht,׮w AY4րjk&>k~D~!HWDFdZ+ax;Nӏiχvކm8<oto|o?}#s?xO#4߇O1c_np;@D?oXqmF]:>uo6jժ(QF9q>8=qV;/Q{oKQyNS+#8n׹jƫ=rS&o-`kKYDUVek!*57F>";~Cqk:}"y7R):9lGوZDmV9FAT0O9NB|^:FkS·X>޽)Jgʼ,LצD~HխA:AdO^Baz]~v3|0`q5trX_ o}kvMqW|9KTXXkut9!rB`=f.b5ӽ}1kzXEZwAkMezV~a) /,fwQ"}aiw1./g En/Յb}a9S\XŅE.l:.tm>S5r hϭԕMcԅ%ƬMȗ %L%&/1NѾX~.<1W鍨%/QC}aH8զnxiu!sJk@I<HAiM +p'ln(ဘӈZr)QbWC `(X`!3 D!B(IDAѽ& 5Q~x1UMJxlb,2(lGxS Ai.8mЊAA+I &q 8}8<W=!w.:=UX$ad"Dn S Y$aF;S iaw]HjM5jTݷkj2$QfW0 bks12 ^3*k12X <Ţ3bV A)mNP% JIҚA A%mq9dvN& !)9gL356RLP\C6BN3̊cb%% #,6 )8Hww@HjB_=O~8,j'92eWВ"MANp_,u\ǰG1<^ޯ(,BCFA9i!AZDB{9iqQHiSRDNZ赐5iEHK 6i7ФŵEZ H{<ùza6ٍiEi0:g65l&g6.2#)"(̦9lZFP01b6lH"3}#}J{#: 84}N]Q>4 DYTT* meR,2)I 1r.hR@ C@He L@H$ v ɬk[$CTQ& B#m#A]o?sC} 㷘sFϥ0[ӶR '`u f@PMZ T:fr䠕JBZhV %D(lePVzR (A|) y\FjI%l}=/@k8}Aù~rI d5G c& :#X$LYNIZNZ+2Erl3Lo+8?,Ne qH$S& 9#HZ'LkiGPh;b$`Lss\{w#Hj>՜3h\wL-ygP;v"yL!3(Ԝjj; 5%ޭ#Yr9EUPt*\L!ސt2I:BűϏoe[Jһ;sw* }gP;B߱pI:_kpwƄصOݎlԡv*@ -M H@  NhԲ &$;aW@PfW@L@ :ùJ"rʹuZ#GJ*rO,\J$.xqR ]㷬nyяy k?Y(/F A#Rԫַ̀(W;C HAlK`LP'[.oʹ H޲C{ y .z EB=[i7Bio[$oP&{ d'GQ[ { ^[hmyKCo+2<_بΰ+ې4V!)Q-fQ؁ R kT.5pdA YgdoAlv6M.6B%F$k2>WG3>mdPRd@Ar*A]>z/N.E|osS9^QIYHc (׏p NѨ~ /h^F0e&zNHr S4@/p nFHuX"q \#†ޝp n#xeӆ40/ i^Q_-?' O[_) FlU_~r?N/qPQb(09Lm63S(S 呩F[ a(P=6k.^Xv{nBg>a,P-0r^ TtG+f >mnAar;tn\q XFADn,߹_ӯ ̃[Kddl~\,2 SĂiV}(>Uk.@imP6$'AR|ɒ}s$q_ yPw,<5ihFlla)P6:J;d F^ Tܠwz8dK'\/[Ve,I $%'9-AnB M(n]"n Ɛ=Oie- HBlkSZv 9 ݻl8vliFlЉA 1rA Xֶ H{A%0qA 2iEЌؘQ?@im9P$?>%9P6;%sm9tmbm辜vfu_NA$s9@&bd9@Izwms@̡W9@Kusxo{9A@A"  ܇AP=v T=ז'0(loy'`&L+O |O Oo[Ŧ9 툵'`'(<1 O ݻlO ĵAPuܴ]oc }l{H"7nJ/zOk[$'%{sԅזIZ@}œ,oݗzߌ=A{jz#HzO#}o#HzD?m1}SDc|PԗĒzHʥ"7nJ/ROk[$'{s,ԅזmIZ@K}œҖ,oκO[ꛅlJ$C&K=b$rzJkG!?^3cDE!*%I} hzX *N/dVw;f#HN {ՍSVw\[$UwJkuknI=$uYݻ޼uҭB6i[!1RwI{w;c8>N! ́;{ѩ7UeSƴRo͙B wյzcRo^;ԛoHޘV(Sol)zw$wίKz Y7 fP7ԛ2InK9gƵ;^7F&h6S.MhSUK=CDmY"ژI 6,NwoEJ񆤢}mhSG,alDJh7 و6h#HMoцLmH{%6WD&z|ZCxS5;P\[ ?'ԛC&N\CZCXVR X)0iX #]4%FK4$(ӭOj8soj(ܺqnF Ks2SR 3a˰zr'BSNir">+\I Ird DRUn+TH.Q@f*ڌ$: 3nMnU\ Mk[o5.#(wmiƴ1 7(2$#HL[nQ%,#H mE8M?y=ӧC[OKz}zMoȗoDUZ48A48= @@1*<7:nV+ `&V6Jk.lI@ dT A5A|I$k>e#H2 |7C,ԅe+ mM[}9M/ [ h~"~JmGd@7P7ɛQ8 y3 d`77#,}:En* X8m4N%J\ͅ-ݕJ˩R7bBi7 &1!Tt1/٦ڈ FLh6#ɦ|\>YC5*!}#sEK=oGA{In=$jIC'oFl$vԒ Uuh͈FZ$U'UĪBNڊ]Xqm:SMVujVuI$Uɪe ĂdZqAPdmYv xt.b}Xljf'wU|m%#6z+ ꨤ =8(`dzp,MV\Iv or['ajyiIŰt@-%È!s;h8-Զ dlx6-esU>0:hmuu_ ;(ôᎣQ=zi>ֽy62:;-+f٨@[ּo-mCA:jfGGu|jbRa%"HH##Kxd#dU<AH#GBúF5RvCj`itFJk7DArC bHؽrCj7r2@l"}Gixד8A2;$&(ô2;$k`CPXZި<doT2酺]&`ޜȘ@2(,o[e1(Ap (}pqDI7IvǠ;!(쎚q;1r8%/c;^;ApKv!HvǠ;lBǙ$cP8$cp5%0\ cjVL6nͭb}Գw!FTbz!5$.⚘^ &WyT'q!6`r6J($$(Fd $J7YזQ"HFI {#}{ヘ(1kE'k{ 'dDP'fDArO*I/[T oa{HΩ0q#==< "A5yL"F*S4u HS52A:.:@ԁeSEST^fAy@i&Pni7 mi!j &th7 AnGMCz呧2R>ݐlէZ\44qNUA1]_;ԫ!IOCy}=`z?w8=.7*{'ƩsdT8Ʃ5NaM8Nq8I_Txcrjԗ35NaƩ5N5@qLw4:ێSdl.4Nu]S1N5@qAqq5N5@cbۑ7Ԏ+T8j8cx3V#2׌Ū^U3j5)+tbjSͨt[Tlj֓SA1N<]pecjS k?Fh㡎7tXFַgE=r\49 E5h jBF.#d*},#ȅ \M>raȅE]v3rzBF.i&']Z&d xadA@=z \Cd,CCC(Ի) t#ρl9ǎCad1}'n~ k!LxMj6;MS1(>{m3},.dvjNz`6ڏtYFn$4후$GjS&;`٥C3KoC"YJ?"S& >՗?gYT 2$ @< -m@P@I>;!*^Fdn@0+J/ . $ F$jS&I0b/oS3]a+` H%"bihH0- FTAR]*ɪKҞ-LiԄUIuK -dPEhqm m}RZ+VKy79 dP&$L dPH$&Ot,5{ӆTRGJ^;yw.-dP&'LMn2(A!T+9C79k&^&tHuMH%Qj7nܣyvZ\DQj`7٥A3&B\8U2YHmM% "H2H%Y)eAAIqc M&,5-%.VHk"^I #k"-M쾥݂`MeE$)" ib՟LDH$PE]Ԍ7~QdAL?Ni"f Bg041ކPkGZ #9GjY+}b>R}DIKttA6I =$aC A6IàI }0pz~34[!FZ @E5JoQCD A͖^[094UYO ԞՎ8Xnt,K Yu SN1&tAS쑄 ;FQpQ5AQ\C*!VԢ kbLB$]Xa *ZRB8i׼aVt%+ \Ӂ7ԥ F BY] uO7K]$!nP& b$$PId@4AP?Wp:`xSȣqN"9opy^O}*6=])ӡR(zގSv+6qQ/bt~l'|?^?x#Bx݆ߗ9ztϧ24/~'ȾqFfaO"\?/q;/a>/_o_<26<~w<ڑ_m*4zıWO?~y> stream xmWyXS!$Z-UyDho|NUТVE2@ I IBHŒ C"$ #Z:UK[Z =D{/w>{,ۋ`Xօ,8%G l02/;KGGĔԅiA%e1qkHZ8kޞ17 b@!&P"XOL&6 DD!"b1xXJˉb%#A|b O"| MLE$Jc^^߲+[ 㨸 LPaa?yU#&q/6l+G>e*?`X?ABrd&ߛ<#U _)u xs0"SjKj AfiEB\_J[ƲC.,Z<4`-Gş?("眊+8~B@N^? Nnjjp+&{zN (1 "4kcɱ lɰ^Da .Y8=4zțq0ȶ 6@Ԏo^&l3,l.*^SdX:T\y@ eqq[VW`F[[>T~`ԡwր}&PnBeE]&JgGVH=vwZH^c&Qx'I>FnGKz\}Su 'ruY [~!H+Y>n<[[>TFǥÀzԀF/.3 RP?#ȁ1q+j}L[fMZTFyv^&1@Ze1r_YGd}Z UVoc/Or}.W9 |!ZJJn(.2SXf\`99aOruR_c.?*74eH󛨉 u֨uC|]>ȣ%ae} lI ȧ\SJY:)AFI?5658Nf{}"nDo_DZ6FuȒV.hpFW '?.KP -vyDž dA$H <7(>)aGl  dw_˜<`?Y JeFQn*Ĥ.)r37&^Yd"CmU({8&$_D}ݼdg@0ƯhޭkTI_HHUϗe221NY<duB {/P$TjCJ;SjFb:s솭i" 1f/]i`g r`, }1SM[ě/ f9GTM#ءZeφw<@ͻ<"G8""KDЫ68 zz=]T\G*LU Sbsg~l!@6ۙƔJ c>cFmH Xm= Tp 'L<˭*5UBbC45,4/q 4:-PxYo@W/쌮ToEn,Rh[x&7{)7gnk5++x ccN Bw5Z S(ѷvdZlBf121&z:(F+,lK=`vLz`GT H/L 6ywjdXM!s[8ڏ0Y7*cEY+)[]kVV PPuv5SiFh0rs+I51;7;3:zns Tj{K^ AsG-go|RQ‚EyLNm[)IV=ome+YHЩ ̏Ydž=s Qdr;tao#V7GMpƂYf HPp;01%c$Ֆ]3A3j`2|ڂAru1ѼV nP?-B음H]㛉[n4`fY.X -Wa(PEr!Oku } CAhzdpdjm&K) 2Yj:m 4Q9=5PV0ow?뤾s=t+&V$-W{,}v2s)Y مp*imiԐ@_W*ʀI'f9GzWY 5Q 6(M6nPSHRbgTܩ{A(VP*1^Ͳ!ڃPi_ x7zEBHPZi˒f$LXG@X( }ؐtl; ɒwŲеkօR(4JPDI3HpKobq}'OGd6q{ws[{wjs,ApӓyO/סOt_絶Uv+i@AU- *!ESoxoLGTLa{-ёfl!i3R 6QJ,c?#o^._lb=_}J5[v{#Eendstream endobj 114 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8732 >> stream xYxǶ^c]JXѵ($'@Hf7ۀmI"QoeM4{ &q ! BFfm?ݝ9?9AEDDDY6giK%!h@Hпsؘ0$ <6`-jf֬9o /l۲0?) yQJ۶/M]<}eFOkS>j1>=nؗ^6LJ#b ,xXB$erb4C$^ ULb,E#Zmb1%/Db1#& WxUb!BHK &CaI}DI 'hMOE%SM "~9'eԮ>їz]ďnT۠',~*a<՗3cYs;{uCi6l{O+Ow>8bgcmz=ܭG^([+G/[D[ĀaաzIDS!2l)5mu{=;& JXr=9)@LI0ٔ (-և2Y@h+Up*J8&ާu ЋehZ\_3I!8{Db 精=6㵗,,4BMQKÓ%vliW\bw8bi P𷈿!$6- @^p0w0^cLh rQϝYD@ D`fjVL3S>Pbe{]GCƅ"N= ܳee @e4EX4Ca!GTٓ%zxKSP 7;b=p\q^gpaUhUbqxh$&B םhE#\%w"$ 8XBr[>\h3Q夤 ?@}nF_$a9st3GĪ(-kH^P L Ա+؊bf֤cva=lO ?cd˟rwU; 1ő(=|@MfCN8谒nzKk _QP&5upUmXz=2<nj⣶ +y]."r0GϒbL'8غ F&ޟ4*Os$] . Y)RA:E˳O_un6zF/f`7QV(k/Rf 5 c>p_NǗ&ҽdOV^屛03~<0ԅJ6RB܆owKyCٝZI;t"1@i(@9 $NֲBme:d@@)TN2- NK;Ɖ֕S5'ދCv[P^ا'+-m )YƠQ-%h!|Wb]>paj9~QKzMC1cΜLHdxyY ͒VO:PP}yn@jBjKUW` Bh'{r#<]:zO`(ܜmC xUIm42t8Dlr|&Ů*8=bD. Iɴ >׳#hEdOHڲ̒sԨ_wؽȆKXt[-dJ6M*59da;p bo@1K`Cݕ0IBoܲT(m s'L[љ|۠ҩJ(jT5Swe#U!sU8I",, ELXqѮOǑ2Dn\&YMV`!ט[R'];?-YDא-mQE7QpvpNW6Ia?(k8Vy꘽Qb-l-rًr+VU$6y mDn[3>eȚ U9R"{A5*D NC̀Zɯ wԗjU@mRR4-h eCڑktm7 RB~Q;LE` ư``ho 6ϛh6CIכJN#bԱn+F#hkn Vٺ-t:|J$mޛYW[_4g`*E9k/Szֺi;F޵bePګ(2(Mt줙 V{JJ%^oTP!,v[gS閛e| D@$|B^]j: T_=rȾv>N_(S Nc'N0}agI?7D)+JJKK2_v;tfk95@CTE Cd3K]ny4mi{U\dB;@uU~gOsdΥĵ83= WTE5*~{(~ܝp) .vdr2ɀWea֞l7 9BO%$o5,~nsVAz8 `eԣR]Rgo? ZF6ccvϰ Ԑz Qe33g$Q]6{cn^ïB{H 3Pڋ"^VSTd2F$5sHJkS/Y(~a`>̺vC,ȹtZmqݘ%:FJix- ݇T1>a/bc1>8a%$h7axBŎn3V9춋=d5-l 0yj؋opUn0?~M/uW]!TޙdAY2EʲqV7~ZyYVN&P-lb\PH3醢8$d@,7v^5,mUEz`#O` _n`4Kty9FbMnR3 IJ',)dPCqĨut|GTj+W.5l;kFf =x[6ӿKY-\H~NckFy(-,k2}Ł!ԕ[+-{q@5 l )MKT~5pOJ돉އ3o>NpL: `5>y~_B9ow9Pt 4QvszP(Uh XΝ]~LUVFYM*VdTNڞZ$ zބT .bUQ+c|U9M|iuFL`/()9.qߨޜ9?B%_t>w=\E=uZ_V#Cer- M)^_K?@c`Igcb,m][Ѹ 9o ū dᱮ l+~KlM5rn$8MN U5QPȓ){|lsV: w*>0H9T.SbUЕ+ U Zm9ێpqq_lx:R(c]FPaap&{(]4[Ɏ~ xѓp*C*P (x]|rl}I>#|%/Kxv_}XjuЍG/JDe!fLm'*?zTL%b-Qx=w>FE/srp5ƕm|hm$Mjڨr)EҔW+.&M-l,ڱƬ1k h3ف[FxX\1˭_/T cO24,liN ʔ%y78(IO:Yj7x5h< 1u>Vݾ(#}<}Qڄqci4U*.rbW_x+ݣ-mbBd!r5DL6PX%Áf݈aXr`e,k ߘ+`%Vَ߇FfwHFBFCώG#r)nf-R!>4ɨdς0?$İ׆`=, >9vTCuuC}nUNvn^sO>"ҟflߞFD2 h&u \j<Ӄ{>#`xcb{.\mhl-YVm0P9y*Im]eE͹Xn@B8#Ȃ̂}P%K i3W=0x<-ꇈI|<=wkT6~gpP =ce@%+BYfn~c( 980KNi 80s2vCgbl&גb?y7 5^/hPMNCq?ȔX:*TUh} 0pk _F_n#Nr '~ I 4R͗%aD/ʣ'ș 5T(?[X[WS]^JD -Qw>`%G6nō]*LrPzڬ-K*dA*DҰEpPG,4/GN꡼,? RR $@n/Ѭ;\t& Ű +uTc0?3Iu7aAfDxR@#3Q B˹&AtXizZ\Ίp]x ׹Պ8{ɱ׽oD:o3[ţ @` Bg4wκM]vUn A۞fskN\|Ш:d3A*@< =[27>S$?pd8hYM=$Sf7|4]B@%mgonSQTV6fP62>qEp8~3yڄKK-[2_kcY~}5~I+ӄ/ R)%n}]]]CK_0Q/~^7sNRL@cN8<'JjQڦҍ`#XHgq.`}#_~10"i9p SI\b'άq\T/(fF.ՎEKIS\`9Wy]T dh-+)??F ?7\F/ެΧC>=:ћǦjC*>3ۓ )Gwa 1$C$8􆻄9er }TNE^mcʪ-ޠ2SRC:fJo@h1()S[_^9yFĚB9|O~޿A?Yendstream endobj 115 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7563 >> stream xzxT7!Q,( HH 35F ADRcc9G]ݜkF@|翗' ]{v޽%,xbȑc$7 *@P$&MRBTbETbt,WY=wͼוXg=tƍ[2O< s0b1x(!"/ EdUb 1xxxXLL%FӈD11xxxA}36t^?#}vt>qnzH j$nb嶸8Ko+BLAh R-ajI@[n h qE@g1^~[(F.7\TX bcjnx97b7NjK)FPAh t ~4bjZ3>fx | 5IZLit6w$jGLO3eBiIwARN dwBNʃ:^)/x9GbDo7Ѧ3t޶̈̇mKAJGq {/pϣG|wJ]媨5%2vkh(z'Ϝf$J&u_U.3]_WF#9v|8xCvRfqXs}ZpIKݐB~A䯓\TZEn0iѤ*^zP-{\D YnDfMe:zPo N5e ),-UIva-K=h9%n˭"V,jYzוkJ^F% :\ɱ\o <궈 D 2qe%D8^~<ؒ!Цp }#%6[\\{l(wwGհy3˥УY80 .ΗfY/mi,]p=q]F :K5^^\u b6O F .[Γ)M@ V418$4Z@UČXԵLB5{B%JLFz2QShbΑh9sNWꄹ%K_N8T/⣫d6XpB'8ϸ(@!P"MNY^ſ G,1Mp$"{P/tC7,K*J%͝ë+[f, ~AqZR% YjRE\T7EhoH);4Vpˋ1/Sj,Œ(f}MҘYQ,="jǥ_~Dypzr`unBJq[Ex=G&4ADĬ UWAj G :waKꄘVI^߬ኢ:}: ޔ0717svГi+5|6H=h̠A2 n1#4bjTW'ٽ4fŁ#?}l*n:և|qL>GƵ2gQH$7 =g}`7ܖظɽ'h8=փXf o$U%& pO>T N_} -RTV dpMxn2܄/@% 7wkAd.bv]WOJ0ZٲKn;)Z"hOA"M%> ])cyȄUR*vq5n~o8 j X%,fRwMg<$ !ZLUFY RP4b(Q Fúr@UʤuDbglQz>moyCB:i[ EEEQ]i!hU5 [ƴn{SAb0j =^[:~@<ŅL(ޟ_Np*ge7?RN*tDkyV`,nl}ЄBg{ d؛J<wXhaS<`|\ UR򅨫0Hr-̞P%ٛ5z}x@]~=aÐ=rR0sŕt;ކj!eNRM[`+}k'-QWȑmq=f鿺5)YCS;vw"[YkO"pb'Uؼ xj׏;mL& J_|1O*W3!І gX4HeX}TI{X:>sR"jj̙eOXs8"t׹$,Xc~¾#; @,JG4ZC@2l{Wql/ ՑN/#PHۑ R"iQ*j8: @Yvt_yiGf,銝jn\R.pmNtaz~_Ï)O½}N~egqSq^{B6wpioqlZ6A*:6\^i Q\?΁.6?ؔ [lPwTEK8ʗz{\<ԪTbacťB $hB ٙhF  ƚ9uݑ؞4.ƣ Ðj$;^xzӿW42皈'V;%NX,`L4" ^pa7řJ,R?93QR\\lZS nkNrM>x(zK\zX[ AfY ³RX"\&zC!K5JqEG}Jdv%;7;ޥ<$+L cfjR:,>cTz K}lhR76:w;fwH$xОu_ gAԁí>fHoLIkJk+4e5ukjڵ6\_7Sxm{yȮ;4ʵғ /~17Hmy{P"'P{k022xa]xu5@ hX(41[NU˰watIMfR[VUXuE`hET(숳AMT6ț c`3rL:l6TSkR &sq'įl9aH'ݐv$^fg{ͺpz~ho`}1=oTύ[Y\pMfsO@\Xd0t6Ʊ۸ Rw݇e.Tf`,z>yG3)Y߶~EޛxԾr&˽a@upAm=WCed Ƭ1ϪSm:.P^[V>'9I32dNC*QN#7:% W U FW]'@!%UtCClƂw@ۏ?F643Jwly)ʸ5[7lSڐ KW=ȋCVN6].,iZ4f<6liRB }J,~vVx#!]te*r y꧇%6-_ VNm܊{>4&LeFLcLlJ GnSPlNJp~ ᫄g;gU8"9Πose2 Vnuͪ/o X J.YR50 D QQMkH ruȍrFdadB}J{ >6b#Q P->ΥoL]R0gl^oCO|wisYKֳXAv.iZ6'oAW.WH:QO**erzqDY=8]W} ݯFF;9Uʭp@:G1ŮʜR,8;0;<ۻBkccù)bS^_c/zXzKR0YǶ2TL/2lUGC>ԨՅ 2¶I*}"[rrP"ՊX O:}>ԡ wld-a_uV+Y:\`ikx RLs 'Zj&!k q|^$bڧ^^&Dk7\:dž[јG fYN5Y:q[RgC [ O5&Mi=3{6q_QG_"Y:GcqL:yOXz򈆉Uﴸ/NGǤw 6J!7Ґ6iDˎkV,T T:#~T\ľ )(u>eS<;!h[-I)AIe O7?a5|ޙO p- W<҂\^<섐9gu<~݌0vSgl;) m8%'uހ2q_GwrwP|3Uk2mVCyHP>tvO쪚ue)~uw6i6:3!Зw|ˍ.20FA_sa=ILQUXTk jsr#JRҫuP]PR5(SJ?, 0/DR"ˎ;v}Jʧp_z=K{ (ȓu*96I3HE|&$ ◅BVكSHb0ֆćeNDWxe{3C*"OH7 7 9k|ٸC̭ w~WTT9{[(uj.\?@:)yPy;dϵh t// KR_WYޏ"@MB[sS DRz+Iέ Zp9KX5 ~_GODEzsO"Jk)S- WWf! n,!J  -5(YxJ^ UV{) R@,gXD=177eh1ZnV"f%?ěR8oOz oj>{@^Cn>7=xF %/j3@_:-Y_]^jiB)AU0 e:Ȥ1V%~ϱ']g^%4<³ކ;Νh"=T쇥JӗW)K^ tg28~F6K25vYSUT,Py"bWݖ}_=ߛm=ov|ΑS8R0T֔x^'qz"VkF^5G[ah6ǴEUkQgQ WWQu@aT+`nOߗ 7Ԁendstream endobj 116 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6748 >> stream xy xս3E "K[*"(k@HB}d@[0*Kw*ui3I@{{s<| ϼg˙"!aZԩS SH4sKqh\4ŸG7[Bˋ[HJ+m^Uk쬛6OξLԇ~Db-g`d=Ϻk-E\dKy_ֱaggMa-`=zkkk:k QR25U*fg e(Κɺ555Uư6#cYF֡ DFa{sdgr\˸6ͅ\'Fp#MPiiNb!"+YD XRgh4HB:,g?xU#&-`M|/[ DTx:HG}"(7{ʕrx8ޅvA7ZI֘劾;.wK Wy7s;bi&T`n{<a.w({f-W?c{|ݾ]k ~;@&?i)9|9Wpa#iB " C#7؋+TuK2rč}'h۞qgiGE]L_%+V2yi/ǞV3JB- /`$WDZ`:bgy;.TfNyHLG)aF3{}%uދ+Jsnú-+|ڽbf&`ޜ+'n(J6R)9x<6wy~"hsNg*y>IQYcB"L`A  ZiaK벥*{B2kBꓠ&j,:Iys 6P/@a/K}B hH[ ?+BURm@,1Q?|RiS! S'"ZNE$jwqYP@s\zP> 8:.@Ǟ y*Le)BOӢE6Q7A /rxt+qbx^޺#;}ZTc˼/xkܼ**/ %ݻ{͛MV32Q=3 ()1$U,A* dOڥ6)s2 O5NQ5\pr-ɓ*MoKU",VY& @iTxSqOVQRN#rzjEeVYUP͞sf~ٺ9!uf&i:ItGy]m'#t7/C<2 '+836Ë|U6d|3kY-ZT(Hª4}sIs8 },HP9S5W䧏w)IT8+y$c֯ yvÏ0!H zR@*44B}WVjV*M5MUmJףO1>e)GB=֏~XgL޿Sg*UrI7DLO^gӗUBs%iPIAf]{${yk M;ٱO^Fy.r7X=&I%A>9EP/r@\M\F`Y 49MRθ)Q#Ce6Z(sՆtA>k Q@; P iҐ2E0hY"]#J]SeŽs AQ43Ur0M*0~\pnڞtfa+Mrh3"#X4V5dng670s.lPk/;fKN?ֆ(lJN']П~g?aP|v,w0wP $Z=p0IB NP&QK@RJQm @: *ltMHVIIIa/2Ecَv9; ( 8~DKorA_PP+J*,R4 BJw^| !LLf#LMY#jPbsPr*2JQwc۝~GGQǮ-'4 h(dK)aXs+C+=F! /D $M5?X*?;X8~\iMNW 0cP f,d¬wGN#Sm)A׀O~𗯾&X `* EYݏ|ݏ*ZIl֫Y`~;o+#3̾#8f.yZ ~Da&}<%`>8=ւ>nJӕ>6hUނН0'Wxׅb^=3 =݇> 31#ȫ)r&.>vô%Vٖ-A,QʛjJ 8oҸ+g/!E:+!"l&*i7ZR)Vx1 _@8P{8Wձ;K\7fFWe}q1QkG,i†5u76~%HiNHrJ/3IV]b ⷙ9Wyl4^]Q]LՖE=p+z=fW.Fza'Ͼ[$< C2K1$F; ŏ7za^䥳b5 MnƤB2QHk 'ݷrSs  #\,%0hTR"~@!Y !Tu:'QcooevTM$P 2H=g[o捶G# ^{qፃ ]! 3 dbm"_᏾rRBFOc4et-N%%҇i>f)Pv8 ^k2lM$c<$&]Ha&aтy 4,c|,iY}{Qp9rsM_pKD|z3$ (<ǸXkY,tPo庘!j>;A9;=H1ӓP8X4 L:c}3Yj|r~Ce# }mIWґ܋}}'†`ʣiHNC?od$83[uR? ?q#Ϭۼ$nG3QہD"F0Mޟ>)SP800e^bK,ńaݦfCl BVUi EJ\E ?+L0pwNq\RD;PQ&F7!!rx6'9d_SD LaʰGmԮX׬)UQJFlWVOww OpW[T탔Îsxc%(X?>]?R9 ?f1>Ƿ<.EiZGbÓ'Sjp,Zul"b&g\V=,q>]|7.U-Vn쭋hqs=r2$A? +~CkŦ VVR3Y8LOؽvK('# (dfSq3FZ2HQd;;@ 79Vf>+aQϯin} H"vu@NpiIɴŵƆyos}ã [_Ðsh˙1 Ȍziwg%c1YfeT.Dp翾_GAd5;-OIH_ɝDE w.b+]tlb,B\.i@]l:l*rʛzN,\p}=w>!#" ?A!8$DBo+ S' =NH/(uAle&Ȱǀ,̊٠Vr@sQqi1ǭ15ԡEy@]쮦l-y[kG=v9wV;p)?g•uJ3n1p;H&:,7x y`Y%g!ɗ#\ jQQ~.qzZ}` +wjA{wa&vRjM;<ު#jPxtK{D?0BB!GweqQWD}XdfYxg՘H I΋n*-XFUў{*_[GDPMA3C,*ʪ* Ä8F&ߎ^ع-;5 ԄHG,җ~lYWYj$ua}yv.S_0OE#Crȩ .Z`{"ǻ ^QVG YN ͅRxkFնE kyb.3W<#.8 sP~~؆'1oW5CwmՒM"f<=<,^91 >mc.2"ktͷpx>'ƗT4%#[?O6rY]`S $+u7ʈBN,Ru+wfRD6yH-w;#[Xբ|q8s3zadU7&Q%u)E-jPvv^skf33y^aE4:$NROk/-RdQdQ}JK/'-?_9w}SMR<]KܘgDN!MO.dd^AxfIdEuPPg>әsKf<> stream x}[lm{$۾l `X @?9Y3ׇkwk$!63Z$kׅUŪ}yտr[q]?W8ֺ?^(vOۯ>}bk}_lKy}qoዲ?56o}~OE5辖<ѷMϿ/#(rȏcy;p9)>cc)tFۧG?>>U޶Z1OXahiI֏}v9ַާk o.b=(iL*;8Ζi!>|XOoƭC(>}f_>}]-tsU?1fmI־l'< /F^>,W?Z}[[yHeKeG<Եz_G{NR2$UQ(>ȯŋ껯_u>Z<uź_$K?>ԑ22:?hb5m_㹆~cd/@ilu;#?!=ϴק9kqe=6`?减5Z۹!_̬@]O%jmcGsww__LJ[{_g$؋Am}wVfBv\N^Z˯j@mkT4]EږEH=/EƥHcEZ[~'a:}_׿g| ?c+]JaOӲ7[۲??ٮ=9l_=SWw%V/?aݧ/4f^Vuc#mN)SCZc۽f1bлC/s~r[1n,^[ڽlu{e6me?V},y7c[YfFݪoIR%06(!+B"‹7Z&:s3Lyi;u4/=%Fq!hgV 0FO:U~!F`:P.ڿF~$m:bVS9.%Z`C4*F@X-/ܳښ4(u}'.iEjC"釡{f=[_rQx hV m˚5u>ISJ6UOb= IBx=k٭@wzJh2qjG1MAKwCql>!n|tީhEJQd>?h7?lV_Z@۷<0Tͤk%>3ű~1< N1ʊHŦ;XmڗG?cB4; Ibe41}"@JA*DH0RW/lhh;F牃ot<:jV?i4zxhhP 8Q@6{i -&(~ud t`1w. bsRV4 ISO[|D0FSi|0a^P7;|y LnoX.%^VN:fArBhcnBQeZ8lhIkTPMYiSs $!,j4lt['h~qDW{N+96`.] >u.4b[*|@65 )6  %gt\G]$7ˋȋa#btU#8la`\][[/-q0c)"RKR֨'s4Uc,c|ҚthB (A syEʒ47h A)'QƝ0]>BЮAQgY&Tm rkպa99=]c>Z釢6%lH DK;&ή(¡:uӊ}hW4c'8/`ǤUuND $M,n^Bk't}TYae \Pb- Y6e*[Ǵ[:[sw0 0YD-CIeCxB {CmTwE!,INauVxE*\SFT@Zkqd?9W6ܜζ0oҊM"uXSuOp7n.IC:TDW㹷a͆e;IZ3}x>׽0zݓm-%L $|y8VQ夀oʄ䁶 ú nNjM:Mɾf5Ҋn6DJY[?!M>perOkzA62~Y/E'\lxV X,֯,}5>ho&ZͯgK02έL_SA(@DW'hXEҸlcEB %r)ޔ1 :TrT%4"ꊯ:ea5^&ǁEkzǚ6+nC*G='gG= 4TZXw% [p$ceKZò 0u q뙴t L 1NAS7raM q' 'OUQw"tmکtؚ҃]?ʿ <k v`}ek' }*B"L Zw Ͳ<W]g`j#=$_UnA{%fyw`0|+.`J^m%X'Ί1l.[Y(>ƺH; 9tdq-' dBHxOy<"73= {ƨ0^5^ë4V{)eBH:|-Lʉ`qOˊ+}gmC?, |߳\v s84pBЮH&]>* (FD/4l Lk s]~E0.$ NA c g09 >pЈp[vlge!ԅqp搱!"Y{Q.i"C:8қqrآ@4M/!N866:$RV8r#0ۓȉ' &k%@Tw"T_cL5!Q/^3OHrr]W4^wjDk ܔ^ ,G( / 4Q/N'C8W㓁.xE"Z "r(%09Bҡ윍o x&Z:Do"%n!A߬e g(cWXhW$8 ݓ~WO'-TY*SNQ"2~7/u'NlK^#82gMz[s!,KN׌H|C:DH YW?YYC_VpxCW z[VK!i6)~&RY4t!V ȏn'q#w,ދnY9{ Hjp;#޳80P D[0!$@xq\vv\t,hG 򠡗;dS{ Z:P"8Ƿ3tF Yi^o6nLl0-YcZnz^GmDH:Rq/S "%@!+39ZcilЬK՞4.ZKs !i@><,$fmV"HR/~m Gm1ln eP]vlIPGJ h@d"(=PAҿl1^3憘q*Z;޹\S7Zh^s@S`h7Sxm?"Ug!dcxra\BHq0e`|d!f4fj3J. Ij@4UBa9%F!xUt srœkc& >UQ\@pyip84F i^cfX<8NuF08N/6F U֧DkY>I*@qփSox^ VB6, 6mԆ}d+y u]q䅩T4`HDH:.ıF7" 6uYae \H<$&ÌN;apZR*TS)[8&!hJ9!VXqEbxZXrk#2wEj^NB+ wtlAoYm1>5F i^c]+#FDٝ"iv)!BҮh'q$Sh+F t هX[F қ-s דvBԁьяRi+B" iLZ9:wKNmU Bs@C&@TM${G#!R!}CGնk Ol~zv >s&I?~<MpH'S+KfbOC"U팩4(99ȔABF9Ј;I{3ʐAKGl< ?Sh)v 'Ka'([r**]Y͋:hӻ,<$ X'th b6U :|ܯ~;arlܲ0ɢ"MdhwI%p+@H:Xp CSC4tȊ+}[]T}8fХ@YTqض:YABH )6 xVp3ıFlYxayҒZ$דkL*P"8:.Jʙ8u~dL c!y(*.~J]Iv?['Ńt c oeQJ~~,<S,by!*γ B,!Z8N僤-1E%dSXDR4 Є?UVvŢyEcM;-WOAS.瘡 RU:S6N8:MvC=)8B>OPN'NqP" bl'5t!Vo;ꇁIcDw;mΠѩ+^N62v ( v(HF)[JȈpq] VP LݲT/We[{y8>dX1Agc!$ Bc6кҳaGFm$'kIk i~=40ӎ-5[2!BAHo=Lk-^_`c0%ZB9}9-/Êp;pmtോ礭HͰkK'x4Ӑ$v\"HW7]. |( B" ~~]v\x(Nƛ5m pJx|J mU>H)@lʹ.T6@,猇^]-ݧu>_RJ#KT,u EjwV~u#!dc\ࢹsۧm?16J nk^m@+Z퓥 !hWl1έӹIiDHpB_ ne}LBh Dc]*%0ZkR1*s]PIi߳pq<G҈73<+ȣvz]z=i\)r a86 %,jIia9J"lor,\1U.Tpng'37UDISO{zs= }!F =[}۳3|P5wF?4b9NB;%$/BX OB"L  G1IClP-:0͉=JQJ&B!K@ 2uVVDX)?kݮM1qçׅJV3,ֽM@4 =r ڛ/mgHW/3z_тqXA.Gʆg3Q8{ Hzם9$> 4aCJD(`xیhu邆`&M\ '"d&F r2rE=*b%[.{&SIAK O$'}2!v ŏ΍h:F9) B-Wu98O{ZU[ɇojUh?[E}A u 06 _=7D0vHi?#pu{h8Crlda4v+GH`^fr ]x1\X2~I%Co% N $=yN&@(\,W>ppeL#IyhYuc>%+'T^H#޴"$@ATNoN@)~4+ hϙM L4Ux q"zDG[KZ#_  ;At4x9 .Ф}ĐjR8]V- D5""Wh^X3ӟr^|@H:<Gij!N$V Cp_M\i<Zerm@H:gDGJR[Q ; xƓ}'G@ژ6-蠡SO'%BԡM7;y0j }gVDX/~pO`y@3c[YgB _ZG;IaCɈg&Ii|0Bi^FUGӗݠؕY*aCoD-C}x+NV"AkOVH"‹Mk88s VY*cUKCu*DH02.^:Ǻ<.?+IӐv@T!×&Brz: B⪟ "|.Q=: PM@U29dOYb,!DA_w*^ e 2yۊv@$=ْie&OP,9;,6 4X&DW'͞dqt}5fIS%I ^V=˹;BB[1 |<ͧz{񗆐H^A[҂jI]MmOBeS|K Ja^h.դ<牣0i|S@TqqJO >̞IS'o a@ ~VH"‹ {o0 >?fV||ְ?Ƴ$>']+z/n2Ҿ++$ ꁢaO ޣAoMc8Ъ+w)k eH8~p=) L01N0bRGx9=9/L|D{I@ۤβ$$@T%i-q3t)'QBF@W/+09rl!gLX{P1jz|M<SÈ&DW'dce2ip W=Ж[KZ;I»Q4uo&BrhgZAδ~ɭd:"ΡCP1ߤ zq1Nk'ҁK3bsG+R"L4jl\G[jW UԩhpbJHU@@,YC-H2~dr. aKP$6n|ׯILf"ۉ0ªs!%dEJB v6glW!Vg s 69e׃BΩh6i8\1:o7?n^}'υnͿmg ~z6t{:i?j>lC̯~&c_k\Hwj@†8;hh͊pL69^oXa"%dN٠|g%8fmO8}$ϐ4ui67? $!/21_}Gg'~9gocɠ}0jZL}¤t.\"]W;C qJ!t>tdY/NOqўOZI2&Bҫ^uxzShˊ+⇢.>#=jQƉK%8%_O;S k XfVWrRfg!O6c!'s'oi4qclendstream endobj 118 0 obj << /Filter /FlateDecode /Length 171 >> stream x]; D{N7[4q(Jr,a\lH1#-;DE*ր#MƲe0Sqgendstream endobj 119 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 236 >> stream xcd`ab`dd v 1400q$2{E3'@r\Eez%ņ L  ̌S3g?˾K3~W];om†@X7mfn3Zn> stream xMU{P_@̍GiԉԘִiipE(o{w{h[AQI:Nv&vڽt?~yؼ|,//oΒͯY&&vc[}}Ϸw>"Wiہc; lۈJ-X) [$܍b˟)XWy + oOFEO׊1Szt\{*6 _.6dalq`4Nd)QjiK% #H4pĭ+_sӢc% x:Pձ㟍<8ݴ>)d)ڢ5측QA # y'=WٌzlHEŖyϷع\f21Cr"DܲWϫbGhjTm_ZfPg`bW3W'S \wYl_1hRrfMݢ`Ә {\f[Fcꈌ0[(7 4Yi>rB;Ń%Xon ^ Z+YLi5N YDNʸPH' Y胬DEj碗Y6рpW^1_CK͖fsZ9V|2DtKGHD{wE8rn s6R ҃}ٳ[-D@lի:ACX'Fi<<uhP;`M8%i du /^tw_=bDO[O.ploR7k[wKvOL̗N9ZIaw`RS9"Æx/{> stream x{LSw<~:`cIȖ[K露 qXj)G>Ͻ}>.t<@y`8dEXnd$Wv忓sΗ$v$I&~Nr|xH@R{>J+;̈́R  뛚+'a"( l"H\GFq6K)IHƬ)[G {1Fnm2NnęAKmPv)O8f3i!;q޳‡ FP 0{X8p"m4-4U"~p6[o$N_%b{vm46NхK3YB"_u#&jѰ<ڎ- 5e0h 4sQ0Pu5+\ߤˮR)| .}ɑNj]p ךjG!~gzLוJ~W\A6:XE#zVR{e9%` 4._9UUʢnPL\ҰVBd{O+Gx7څR~vc##+XK,U4;he?-Ԙ;@.^l@5UgtOо07~ GwG?PURp}Nl^K:ZVUNG9Xa1/*+ezՊh-z_H",i'by/𴹅U THA/?~-; tYz^L6 h+u>S_>fPwO<2 d)ԞC}I {zendstream endobj 122 0 obj << /Filter /FlateDecode /Length 590 >> stream xT@]\X a=X˃r QBXzmF8 3 8avwa ÒU]/C -5$ !Hh@V⅒ 0&fc:iF$vzdG+WRM~5AvK;%Nj_@xfyO_;+lӤG.z$fHm{hnmkv+m:eW~eoT_{.7@*a?yEGܳX[>A׍Y6ksѤm|dM3ĻzUS}I)#W PG* u|{@)ݤ^j{8 eDkhxuxQb|!DuxRf&z?HsLQ?ǘ1Aendstream endobj 123 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceGray /DecodeParms << /Columns 78 /Predictor 15 >> /Filter /FlateDecode /Height 104 /Subtype /Image /Width 78 /Length 386 >> stream xI0pCvb~Bm Ȳ |T'VNfmӫtB]nf8=e9NrzR>'d!}Yn8gj4girpes8x-gw" Lb l2 |fTz Wb spmpG^[{18c:xpdp,ԁpy͚g?ε ?z=ﯕ2WԊ\UX X,k%~YrRӲ3j\p-L T26ǹ= t6w;XgO puS{n0aWh%|kŕ ֢.ǂv~mgendstream endobj 124 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceRGB /DecodeParms << /Colors 3 /Columns 78 /Predictor 15 >> /Filter /FlateDecode /Height 104 /SMask 123 0 R /Subtype /Image /Width 78 /Length 1174 >> stream xݜ͙< ǕT&ɖRREΟRf7iHG29 !mqI'w\FluP?8 FN\s~J A{rTIiӥPgvT/Z ǓNΠP JSVToWAS.kJt{YQ pP;y mtgQً)N3G#z=hҩ5N:cHq)h4N `\uҐLR9qbT9JCQgKfk|}$Qgrտ!=փQwmݨܜSW3|JK؜z V@i›ˉQgd86 ,ˍJb(82FvUSV8#jj>K8z;ںʅvFڽ/hkOu:sO+xytjoP3+y*Aj'JupəNisRRTb-!ƚ,ߡI*./ 馅jirm %ΩCY:wVC=i==PL\m<bޞWà Ѩ6ͫaa(j3xw*O4Lq !%DiaHiǬ 8,)m'oir(*|ɵ58{UQ[-Y]5ٴ•8Q[ "l"Y(2ތ|=Nv$dƣ!z Tendstream endobj 125 0 obj << /Filter /FlateDecode /Length 14445 >> stream xKI+r-` M̢{쪬*J|TnL/~1}f) 77=]O= x~<yw{_~}yǟ>1㿾{ßOmNw?=Lpewz^>=>y7OOf8=}{y÷??Q_>ooß'r9 q֧zN>t>??%އWi,( /f%$ L\[;\χǚ tiQu[# đ󃭍ŝyжw4b1Iv8l&\zg-EvDv m;F;_NC[c#К`y[/imVEխdQl%kdJiRlXo%O$EJ^V%]{ҡf<5˵4uhIm݀vLɤ_דnY1h*:?/S8:YdF4:LyuzǬ :s0m3FǬi<4nع(?CPc9y.aD>(DfsI>(D!| Qc!môrK4 :%‡t`aD>t3 #E(tFܜQE(tFI3"Q0Qt6s"QD] Ƒ#M#|GFHmuu67tYGEqYGE:,##Nq̀K8t^7 4-d s_O:.ΰO}}Ý-O<ꔓF4>'N8itAMoIn&<4.áD[/N;ꈃhu~uVf<:0"s霣HD>ͻ8NWxl߽8.uH@J@':oC .+fۢՈLfUL+mU1(RHEҜH`D.HP"iN_C.HEB.Hh\$"A' 9HiU$cz^ݚ*i.f9+mXĢוJbQT\Wڪ[eŶQI(R%(* wONQI,9頦jDDQ˨S"2UF5T,O DiT?QC iT!QAl|Tڀӷ|Y8_E FJB. ڪXPjQ\]/(RH" \3(RѠHU" \7(RFrICԁ6\6Z>*UmU<3Q*l]<`E*7CtHŃ"T<$rHŃ"Thʵ? !OVDZRvSKhZBEZW T1[u1|VC"WL2bV"U \1(R*|n?;W% ;'rG%;9=>?G-c(,pܜ#9792p@se̍6Z 5D3e5tC3z069sko8\ښstKĹ2yBiy6:Rf)غFݧ}9=jiX? X~˭Q5ibnLzcE2qxZ2@8a ̚2$2Y$fQE_Z&bmE[oVXbY}}!?jps9m^w$+%8M pk]kIM\)BVVZS\n_N ũ 9!V:N {' y2m 8iL!{Gڗn1J Zīo!A(@THe«'\sG~kGώ#,%} A5硤h$I"%9)лI9)J ))hN ))^SSb)Nfm6c]"Sxrz҃&knۡA (4ځAE&"59d I4bG4lgcfꓓ@Eb;2aDf;vfdp"E98Ǣ-Z%bjAЎBL-9iv6sf;."2zᎢ;^z>YF,d7G~t(H b1(b]E7اQ#w3FdHG"a,c}tQ$Hا9X]-YYx?*@cS(,F0s# U(b )x,hLp{(4\`EGmp}ࣹ$=S)N X@? фhB?NӄhBC4wf?1#@W8b(ElɏM}]QG:g@[E #EA}Ԉ hꓭ=jId *]vNNf;9ۻl(Q$Hl5l''v({kN9pt$#2q"EFkq"8fwG[q&hGQp5xvdk(88jqAx̭9xsW?}[O=4bqLq)޴5Eوz7޴U`?#{F:MHǭy *أH|>:}^gݪ3vؙ}Ԕ L^3g:WV@L@2D9z72g*PL̙@NtR&H@kЧtMUByAr^E{y#QSW^Eռh_{h%EFD}+PT` hgl `~LgME"qD4r5و:6C ir2IF'A{MlQ#HH&!2jŨId( bPL6I(>?F1 (FP" ŰL¾TI"kG,'G6W\#X<v\Pl ft)ߢ4^[`߀tF҈"jͽ{ݛI+Q$HI[$Pf$H?ǹ2"f=麂'j1:Q/މH[G%҈2FaDFgְHV$%"EBLTm/I$'SMt7I$ɉ@'jN $20QDMP5$ID+ 6UdXvhI6.Q$^(E"&4ӝ0"SEdJ(I"SEds~?9Qo3$[nD'O( ~FDI"EO?Q#~=1?AT'ͣ刯}UZ2sE*2Wi~KdNotGV Z޶5da Y $2dQ$v߷!;QKǐ%[CnɐE'AY( ȢF lM\qQR\_-Desɘ^a.m̢HQ,o<~,h?>$,Ҁb`a 2jȤQ8FMx}#x >{4۽0Qn^w`2Q3%D%O苚( t#ؒO%AW\jsl޿6h^Fkl.l5€2N[68iNI#8%pJ8%|֢b+ 094&hNS8aLSNI8]AbALQ3a%AT@3zNlFI4"3D"qnAeDV+$lվ'}]ٵ!j0G&$0x+LTUl4Ag(R 1@\| *P$h^{d,hڮ߳]|QPСpR| EQDH@"B*559hLQebUHi=[pw e]ɂJ, $ :YhN[3h!cEJ)Yw3)fҴ]զ=b[Iq닟;+d~l8t8!E8QHC"'"dOM8$r9q]8XZ} d%UbBDIb|^^o.J#]K#B['@36/_{.#l8:PBDN )P-.':B[m4sIu4褤!E4QҠHIC"' "iOM4$rtcTI%M/M8G}Z;hD!EVޑ#"gbQD\A8b.#*XĢ )XĢ b"E:,=RSNP꠭RmFHĢ)XĢ )X4EkaM:x4,54A3 (yD8`%EJ9pP ?ܟhdҧ9Bp>tN DK(R.H"EE(RHQD( t.uWC<;OЉH,([-:o[YeQYFGY2(HهȾޣ2n4mg39 ATy凶JH-+, *{gF@쟈ґl(R ҵɥtLGixS 9Q D2D=)PCDN:)!أ]uᵕtvd>NbpDn(T}^hƢH3/m#ضgq+&q3]Nd[{?eUFGF#m"ʶ92#6E :Eб(Et(Rб(Emc:ze:))|(ڊ3Mqƚ3EHqƢ)X3Y?cmlRh6Oֺp<09gzH"ey 1"%l(RaJ 62GR$rJќR[ݤ*HBR EJ))HBR EJ)#:)}fRh>N)%"PBR{mYdBMDjR$rJn9P)2y1r"8fz E2)P(Q2)P(CD2U me9P(#y럮]8P(# E2)P(# E2)he(#'G99I}^tm"PBҋD,E`& 5 ,9hX(BvzX)i<̩6S jTCR EJ5)@S EJ5- )=[lq;)Ho]s߱ruOIHNB) Q$$EJB) i{XGpH3tmg$"#QD2DHEFj,~HL"G2(R$HWjW:*i"k0sl'MuX7m9e[5FW5$&['7"Qɍ%w89Q18݄2a=V!u~Fz&F'58-sMk)QFD9QFEg^GXk(asrHaM"5E k)IFE JnuXHܽk05^[LNdrr$'G2*iqi|&[E2J/qJ4 3"Q}?jruz]giޯ5zUsYV`XWxWEჶlj~ԯ44Ss F·=+)= _sGnjFU?>Dnj@WFl[55xm55褦ǠH}LViV}L FEjjPDnjPwsS[! 75(RS"55$r\4w>jjV} touS"55anjIM 8UuSCtSC+Xnjnjv$106Mƨe/䮆]M IKc`ٸUndܨA{U#Cv#Hj=YR'pjpHEifzONiI= 9AziP6DsA:sA:sA:U:ܹH ܹ]sA:s!;m:U"u.΅lݹH m;tRN΅lݹݹ ;;-u.8`ƀb{nNZI>"iˁOK;𛵲|tOjQ| ĜʗA'E G'>99QGE |GE |)AT :o}]]MDȭ -@Z [t+jPVP [(R+@V9d[4AV&XnnHkVIqFJ0t`0'r(a:V]S&EBEE,dBv,D'e!" YE$rhQF`dQ#,,l: iW$*c]b"JIEJH)ɢ PJ߷"'dQ$"%(%wNIUJ)N(pbMN$r8(‰3E*NQ8"LT'tR8‰N(R8HE 'rGI#r8H"N(R85ouN9@T 'u-9PB"{qG'DqHD"GA(Rц9뱉 uA"'r(H7"ELT=:$ޓy"E={Ux#2‡?%MI"% $2iN=0ּG߽=ڊ$2Q$ޣH 3=ٚ4A2)S NG(g:IF'QLi(Q$JBi)ݴP"4MĔF("Q9]ݴ]}6FݽK7ٚ(F[D7oߴ7: s~r%[(PY@@e*;PI@eQETPIT*0PY eQ`E&, lFI#Ͷ8[aEM)`m%lm`E&, l l}GDOY/LD3Q$"`0XI1+Q$VHQc.?d[Eb%J(+a3Q$i&"ٚ(iL6Ɠ~1@ToTkj$م"nuD m2eHjNдV #A" Ej2dֽFݷG"#y VC}Fq(h+5⦃Ybሌ޸NB=wml;-~C"9B5P$HY&!ٚ4AEĻ0ּkڮ[ƶ_l ?5P$~~;uCP6ջ5tiI)sl2^ ZN(C[ыl{A#2P$HjNpa5P$~/)%2e4A EB2^{a"ыDJfY΍i.vL"H0m3l?i 9rxRaR ("!ErhMeP$DeXA(âKHA2lH'nd.r6ENԂQGnuB(`W3P$9(P$@"U}s#ן?.@:m_^; E*\U mU ʅ".T(RȵJ뱬nn *U"U1\ݷ䒦rIH%M"4T(RIwfWR:7ʰH"T< Ń"T<(RŃ" T"3QDP!KT) T"$r3{YřeQY̲(,̲(,tfYgEqfeQYҜgBgmO9YwEۭGEziATnlY?Q? DrGoX_LPmwUPfUy>cT]Ny<YY*a9y.YH\GuYY;YNcYvwݛw 6^ݏO?Kx-+kRCZCbC\ލ'vCkvcxsl?KK/O7ocq͸w_>K6<}~>?~{ۘcOr7oݞ~}ڗxoj]O/uǻ?>M_51o߾K>y:r|oqN2 %ۤ2dzoގl< Ïxnm_ן_Jzd2*oyig]O:徼avzJ<`_b_.o/1n<i4>/zNS[Hv/'_>g5_|͏>៚|r9-6v~w󷟾| ]4oZ_yߦx$¸f7c2x>|Nv?,r~M{=IUq:> stream xZKo$ϯhXmC#HZ@V쬬@#펴؇|_&N샶)fUwԢ'i݇tO׻83%wBOڸ%)3Emt}}7q_Ϗ˻n9?풓/nOwӍ~;}P-K˶໙/}f;]ݫR76d+:-4YQ9A|xwͮ\WG$xWCբ 8+ (A~*TI9(HTWty^FO횁!}08…dh'a׿1`K}PhdOA5~}<ڑڛ%E=C2O{3Ec4UD?=S~g#@&睎.aMyt8a81meK6Jqczٸ6: (+19kbmԐ)3Ucި15L+N xBXN׊?}^rЭ%W Qbpƴ!WsƵ!WuFǵ"o2yG_vJ(oqPU@ `3^ %! k ƵECa˫N2:R6Q[mx-Dɘ|@ON39 ݽ"N8 iAxJSh%D6l- Ai]zʱ[w?0rCr9uHR %4ΰ" ICsKlA^|\otې NY/$o7&^[?*@FZ`2&sBqs$.gȊ Y8l5BwFI8mQ! kUcCp#OK Y#iƱApur= YN(,O QhhB4&caB4^wS\H{=4Ne\ǁA#7RAu9;\DhMº(PlED 6mW A)l'uح_xuc2$Q’4u+\LضiFThuF3!9!d7Q Q#uџ!),S$>zxݑLl,@ZI3{@ Vi[,Xquj &_[>j ZE쮩e}\^kt16kvqlDYq`1ڰoˑs=\DhMĶè(Zn_pEXV-QbbhIvi&EhRF=8/S(.~ꬥO RStgjN_@}.Z4; nWYUH87q:pK"E&%3'!bFTvaO$4tƥɃ(fj\Df f1Eu>gvb&|M)/y-HE%jv,_F]<ӋBq!I': 8Fkre Vn琓(`< ^ l<휒dXp]7R0fHл,pRM@ kKfwH1]Ih| "H%S"!yEtTAC}_pGPgiqJ6;E/A $'»}.$1l]y^++v̮N)ht-IJvaKIyD )ΨXb|gфEP.WfT/u(K`1DF內EtFh30V:Z2 M$԰όAc|B$dx>P7"Ǡz@p ‚\\hR1\2*m!ĔdV3K2uHTA8 Yi4\hA]xjCxw "ke$DFToX;n~X~P·yVt}$_(;=>>ߗE1?]^n")|}ͷzۈ\8$brlzf~~s9ܿ|iDJAwb~~S%4gs jH!m#ݲb;N>>?޽zo?8 7WK5rPfߟ=!@cә,Fi=h߿ǕFySg&œGdGqPԜ ۯC-rhqENA سY29ɅϦieVendstream endobj 127 0 obj << /Filter /FlateDecode /Length 58865 >> stream xM,n9? IT @=64h $ߙbȬb6K<Ÿ/΂Ѡ44]z(]ts;j|ձ޺(t|ѵ|tS?\Womȏ`4&P`bzb =m6EqgqoP:nz>t>z8Awx n: =ëvYw&v\U߯:*KQGaaZG0 {pY5J^crԮ~Ź Z ㅍM6gV'VCmӰP.4jUޭ[Vwˡ,{wB#5TP843}7X;-q@4R,] 5ښ HMFɲ@mXRO <'&>~Mu~wl27͛ cv=J6jQ)fԭsu.ݷdV%5%٨ r7ޣ$nc@Motz.v?Q5]jʞ=q<ݮ[KL^5/]AB8A ;UQk|j| !Z<]_\+U(=zfѹ>^ u ^/k}Է/o iH=>+|-xE4Z<{wQwQgC5w9973]NݍjtVOo3C:9 |r^`'8s5H3&r=>ׄ4 phP|1#CFrvy>rɹɹMeuG:ox9xc~=<{[ՠvUhnF#u{!ͳ;r7)y:.QC.biqY0orOᲆ>>ʄ&SSo>[E FGv\^FjW5;-Oawp@1!6ttPóHt(M\czB!qcoiNCiNghِMڣnzC O;= ӹir4RQ}e}V3y6p=8K0޸hЧp|Y;rbjV4RM˷L5K]-;^<_t^C8?zno~Pl{ ۾Kmw:HFjn8骺UugRCQ.Gx~[]^x~^j%hOj@\UMsgp7C5?ÃɩwntԦ<ԞGkIqbUwvwnOptZ._'n=f(|N{5IM'ZN$$t,jb\4 ;Eg,EkaiMDI :V'n!VԂCԃ3wc6#ăMjBL6zUїHW{[Ȫh:{4M  iM FPoo%*4zTO3_ފ@:!9ux99}6=w; CUc"Hy0iߊ<^u$x@600k6Ƴ4hAh ђɂx)S$dvCOUM|(&JmLm,ܟ>J v0!0̎Rwa~? f:YOH4#<l=!}khAA1霷Aq[k}>6e㕻1C61hiyL& x.[A3Br&,3{ciG$Bc'K, -}k.[Gxx#3M~ >H3 Vtp iӓ4oCh9R%zZ%C##6.}ֶ:&^oA*59陃]C{树fes&F>XA# ygc>=~t" ߆6׵3on]CFv:Ͻim6lmQ5X8*feģ=j F9xq>.;is/_6!zûC/F_HPыd,^amZp/Ώk.b !:??{^eH#xmnh&`i.i.N4Hcxcy{l(&O]4Ҥq%`GАtkui^Ú>^s>p}̽4d& 0ACˋ+C2h0'|y50y"^'$ C6n6 =C7zh|bz"\6bO>0oh`ět :} 'C)cWo˞pl>aD+Fƺ`4z{J0pS-!iUĊgU+p!F3Ht*oل#4:0H3aj e0iNP@?n] *8Qj87+R) SFU:*Y.键TuW"L,<`l@\+%eaRX=) 6F•)4Jhe넏P R݈ZL28=5PVϧ! {>o4æ \)zoIKWM'%c-DKD33j@]_k>bhԘ6pqq dS! dnTmW+XT`,Pp  G"GLq'B K '$0bB20.h$b![1| A&1hYT1&CJ[* .7(YiR} rd:Xߕ%NnOj'  v" vٍ||54G;p-qN8CSʒnنFb8C#v{)-cg0Ym68 򚗯  j0;pa{atpUQ\;jEKoYL- _h#dMKE\L3 H  [h԰>_sV5pUX]"zaX"".++"U;ß UpߖN6~7]PE^vA@EHxR:e#5G`;4J *Jm=wT!)RCSJ S0UT>SsU |Uȸ/spU@%_vq] ]jCW ]lC ]lhUس${*4j#0rEB(B ʇ.C`jc:͊@z@e,QYMt:O GC xU&}L97 >c28Dh$$oOX]X7X5o.8]6vp*հG~ۣƎqMpM8JBLEOU: ;^m:lCq̵r.[Ib톝IN_16ڐHZGo !zi6҅҅f`2>^ :?b0 dW.EZh$TaS*\VB# QJHFf7whUu3awdR#lm'dPҷx!T_1!a#D ӌI!߬(3-!@I0h&<:uKq:ihB=4 Ö6 ظew${pY4n(=4{6ܦO, aJW(>< =PQ)]S S)O!*}kĨt3 b,0ҷXD1p"Ql"Q>(C$B\YKUْ؂b<;[5j\= BPf .~D{Bcqޟ`FK0Ě t&BIo!87>x&['CwָA#J` /n<^O[ r}{z_TH?sT 17p6 D4(vlzP^,_3.@EM4e*s0O"A Ll<ӷ?]f,H>h%]ba%Max( ( 4p"~daC/S?e/R/&J~ RKe|;" yGo 9*}~ϧy VxƋtE> #=jP: «T|aHpU1#] 1K$NIaˍ*tPG #dި߸OJTHX=H k )QXTY6!F1DЁJ8A>AB -7SfhFK9#=̘| 1&[V3f0fLJbL:NMIҼIh0s%Bd`lbG%ޑ1Qj=O N#xp8.X3[kD39k8)h$`)dIJ0oWݍ^$ݩ !INN$IRG$](sJF@##[/W/мW$!$S|ac.A7ټHWͼrÏl¡/\tG'踛ءsAY԰AI4P7&hTKhvd7: {"aA d#TXPllmXDN!ٌC:i\b2(0״a(K1@68H?>ֳ31 `?.M~t :4 p ?\T>Py\6|eqhG) ?.S P>89!cCp;{Dt^fODS?-JBTFT>E1dLiǜқ3hsU: dᶦ^^5bMG# =#C(I+\V*oӄnӀBD+܁Ehϣ xV"rBV)!A'[[G~1Vݖ)VP#-vۇ\p4d%be4 t ]KG{C NJg*j֬\obke6˲5)dp N}Ĵlͷw׵@p s)iw"8w"Bh$9_x~~m|xVM4xHo9W9*' Klť!)h!6oᄉH4dL=2ekd Dj&0^Hc"kyz"1ͮgQJ2H%\UU}*AJ01+* OD"=D| no'4G'"\Q EɘP<| *] *\\ٓHe| W2t}Mÿ;k/B+h=CNׂơ{~=ө=#+= G/2_<i_%ndF L}Lx?.U !HGL!bOʇ |"T:&Yf+HQ҄;.·Zrxy߉@C#^5Bt A%8C Xq8qH~0B+أ-u|D:\UpUk4"ҡCH:JpKae ha^z{F`:0}w|RB U##mĶm؆FY6ԿlH '[D^/s~xSq6KZBB$x1"1'WKD|B|LÍQU% AL\D#>OeTJ ekfs2!A*!Fux3O;0.]Yq/}چ y_1ƅP_dlI ;KNX4P̉y/yUuc4 !N\vQE DRg!MgRUZLDkJil5Ah3M#~wJb@'8x{ؼ~K2ϵ?2v+b1z95s2~Ӵ%Yڊ[x\bX̞ h$o0٨|hя!o(松Ϣї_ ɇ|1otn>`OB5Ho7Y.QQOnyA'd: V&41i^!NNh4+wBd\9Awh#x2I;h< ;-.!|wP7Φc|S>w=1=P>s6nSN'+l) Dt/θߑ$z =oOM:q~%e3se$0bp%jRˇ뉉ؘXs=/A=O3z\"Jcx#J24.Q:(!JC4JNYgJ;Ąl z(awݪ|r9K O%1<z>Nh$g2|7ZWl-X&x*Kk:'؜>g$3VK܊($:|?CO0w ytJ}:W6§h,DjvyLtyLz,!>[Y:;ӡDx,OF:ڈ骛㸬8ݵC# _ ].MpyQ$F.K `WR`Cb*RctAPJ+b# GB-| I: EG?ʮ.106!ܩ%8r%5 B}ʘ2sAD^M^Ds`R!)sPI pWݱ\jm W ?HN !B6\C:Ɉt5)!/0qit%0i4}YHJH‚d^W|YPOL!]ir(l$kz$ EE:iz>xPlb7'׉6Sd&d4&h,Mhv fޤ L zeJ5T*P]@̥[Ie .ʖ|-J:kVVк%W ګ I "^*+ђ$ Ț ,d$d/8xS&]ran脭hH$^*d &[ 8.V0aI"{G9.lH:>5k,lh"l&I^tH5xPM2L4耂&JzJ&EN:4N>z&=˚|8;`ݓtIyZdġ4,qHj\:˚*/Ĥ`Z&J}R,I.V,KXwkS߉ 6)}ޞGgM=zدٙ$T9Y0$16^Iq$Y]A~%Ш$keVܲ\t(&t)*%p )$.+UDFBx7?l-UF%U0t՛JKJ(]:K!JRIrC[abBh$)D3SH3>ʞeQ9Rq]'O⩞TT<]A33b){PK|iɜ'EA&K{[(2 &x/yU?/I$yZV(^)(^5RPM-;>f.k ƚC=T\9zn$WNҪn9Vu`AbztRu:IՏD*<+;)*ɼ޻H;9r!1Foddw7|ۖ> t,1$pk h7V+#͒RC#54@+"=6LJ"󧴓j$qmH6F2\˸Rp5]-4cpj 5\:^ܺolò֖K9|'9WMj;HQڨ$Mt]d UX..$!c`˱tI3YvViK9ieH%2֔ +vOax`` VC]UYU+`VIʭG{Im4xCMGqJIœ#I8X#I-2lŒ Z)=4wSe`b!VgAgIF9r£>]q(q7 @Ne3ERU_91˾gvgW$qM֫*LZ.)3ԔmuQ!UT%G,$] ]X?D-H|,3dY]pd(nI;KxI)Nډ&IM#I-TT~I/֪&Hېb&!qeH4h.#kYKGNNl-nC±t@`qYVqo}sy+H+"|^KҕB3(L(z-Ǵ,ǔ,x~9˞#e)5Y6Rh$ F]`$E;X^UW c:&$!$%#p+zL'b)ݫee>d:du\tIՔd̾ &-^[E`%YJ.-'^oZOZsBQKj/cIj(5:ghWޤorLJt,JՐ+ʫJR>Vx5&ROf^opVwh$!9l_Im'T'UV:tI9v]%ҡ$pMᢡU%Hzcz^HۥgmG[er.\:ddʽɲʷQzM܌xxxtsԒ.-6YMIр|DcPED,"_3I""U*8=^&kge yYL?ŕ%Chc ,BYl">bR߳ znuES0S4@EHZzn]$wߵ:D|=_w#ލJ>7I\۰tIo:&B:Kaky5ɂ6R(y:CN(!ZBR'y|Ci +<*?A¤jXgs}j`5p&+x'UyzQԿzn'POR!]&ꑤ'褭'p$.Bnt>-7m I M5e7 x/GQ"D$pYɅt٬ʷj2:ì*ӻ Jڡ&^oo$&0!i^jjJʨAY46W.`[K\夂 fQ'晴^t=G"d)@&{xИIffJ^ᑍ^DdFA6j=(/(HW2~.hHCH,h|Ă lWB"ly!fK1ѯ4T'LHx*Ui\C^ڈD`oٓ Xd=7}iYnA*շpWpQC<:ؒytUi%p20ULa > C0 30B La!C\p2g%enQc%㛼h4Nd<w9\ڇBUHaZݎ>oDL|"BGx͑l \3:̐Z41d5˼yLsPX1=釯X Pm#i#̧?ɒ!C X}4Ҭsu81D/^={Gp FmW&g}e(YO^˰&;1Dz<6 f2Yi#Mr*7hLm!MЈ5p9]<> j'3_>ipdgCzx^ͯ9m6gd0&/Oc455z_ޥ|&w҆.֎@ùlf689]G;w=T4±hd l=;Ƥ5ueBz~Obo%/U05k7FcKFH3F`m5[HD#M?ytҚhX=O) Y YY*(pLZ.kmkRzVYsk%'"yyM|&ѧ>!aBmBi2x}~Vj-juo}ʂgh*@?LAfg91O}TѨ,d6yLbiDNNcoۍ9679F^FenŊmCVږyy+&fX1VjX){ob6ȈgP VZza4Ċw[#b}x_zFA???,{S_:ߗ^ۦQ>ne`u \Iױ/r]$\e΋Rseg^ \x,F˙]wFݡg@ܾz̶mp py~yrYq-'7^捧g/3 2(.OXp7v7eW.kNߊ,lǺ#-9g?R\;X;gK '8#euY}w+a?w׏tēx1Q:s(V?sk8V>vEn_WƁ`gpt/t77񶇡;ZN7Jf:X_\>[t`"gn3z=C ^qU# k07^wC^u7)쮂5鍞s95W7v)ηv;,w^\UjM)&9 ?.}x1ݥqzQkR>%a}-չԤh&|7oar>W{}=vrSB\-o@Kx!ݧܦP%wf6{wi9ֹ@jdܷd&vM ]\ڻQ-_֯Ftso)\__-tR!yAFI`6'~P60vFE=9 B6AcٯɁմENp`om7ަB4p.y8OC,ȳ4j3m40mjjQ-JFp}|ūű"`8:nC](r>R*.GOr Fjh4j ]ߡWWg:{c:&64zi af.;m5:[]neZ73٦jp콌Fe4R/ca˸]˪\z3c8vҪ2:]4wv9H].|6sknnfLk'>gzb4H}F{<8"S"hG_PXG[cw>m8x|:?Ns}|Wį!T`4Rvg؇`L5+Eոjr7.vztOJ]9 C3U_Rԗh-HɺH-F:4j; ; vey9]|7dJ]NK*\Docm1ʽwonc06=c6FZOh>F#.To]ZɭFj],GHO\1ڨuiV'pj\Hխ6FE 'i;n=\[=kp3.6CmH+ Hm-0m$/ҍ>։{Yxsf.kM 6øxkPc$)ufywzVYI:omej] ?fV3Vc]N%#LW} 68\ftkҪ{uc4nVZɍ9i=4)\͉ݙNC ȃAHMFD4jX>6$n? 9u^?w81AX0[Ϛjh6F#.KѨu&*B(.D#5#;lFZ͈FjF4R3QkF_Fvp׭}maR8(_t=ٍ'5j9=͢^RC!4ҹislC4;hHHsh]==5sY 4.H4hCP}ڀW~O~|Z㢻Sk7RlY= |'-z]zL֌Ш$AT>I6FxZɃ4(p8(sgقij)4-14-< l=Ƥ?=ozN$pR\xL A# 0t .Aˣ5Hpzl * H)MtM|-8>pgX@O,KM_s!+nzxm8glxַYIiaȞہva>T6بMǯ4EԔKLCڐjy 9\>Br3Ӑg!ODooJk߿;yзp<]N{ bÐS04q'F0&KFh Fኞ"=wώMWܻ+i}ӵ\EOW5}z>Pm5A5Bӕ$dm uz\|F|5P&K&mio_/Owڪ9iva> sLH&qv4knkǶS=Ii/WS*)Fٝymv< =k|}}jEK?x&-},s 2󧖐3zTچD0Ȍ4j)ş\ZD7|H1=w3_4o0v쀫0Z5p0&]a&['BIhB7c0ҹMxn!jl8]t^U1&KkjF :HhB#  U_ն'fշ'.AF'e#X Cz,,KT͛jh$HF^#E}MJ"QV>a+HVͭ| *F1x>|ױ;z{\hd8DdxbAxw6M`=)1OP\,giRR y^J453X)0R!@\>d .+ܡwh qYiGcQl.%.}]>Ff. "*h8}_?Ez"xpx` skf[mbنjI e夌r7:N J[6J|J|^/c^Ya =wq^840qq? t"%bࡑF%PZ~Gb\>!|DN!90F鞘e Ea96rnrC޽1FO_~**y &c+y v7zn>7ӐH7< |IwGUy 칝EI_AFlTC(hY߉h7B !{PYY$J,hS-HiL,J{>_4\>rQn0|F1 ~&Z:YZNt(~[6F5 20AU\r팪t>"TQUy7U:9k^zt.D-6ٚJlM| Qg*MaCT>s <'rzdwБcp;q;pFK#u1hs,b ;ґDr$.{Xb\5Y dOm ΓnG6B^ "^ ^9 d 8Ҳx6FYgY: feLHB n_+E`w ^v  =wTLJ&g@)"ƃyI'%` %RЁ>ˇs)e On;E&p0C*! "w @w`De3!DtыjbѪ.+f;Т;ij5æf F3clCWuuvݖ&1ROBS. dN]@$xG Q QhߑpDGdMYG<)U/{GSFFSzUh!$ѲP5t"&"#P>Ctß 1(shZt %Lsa^Ϫ3ztfcʜɧ!` .o >ҋDpH a*wa,eOT).>h$ޔ6Gc!D!-"Ѧ !4wي;C3-kԤ5wpYf2߾p:|Wr9\ߞ?7Oœg MǡgDp0PF@opYAtّ!vCȎtRG6)iכkH߄ބ`!%2MM>j2MH1@ي&BK>В!͌aL=>^wn輴s{$sL 0_CAx kvZlIoHl)>'8adC9>G | (Casҷ̡Dt" x4NK !Z3IuG  Y6\ BtƠpߝp.p!`I -kYtQCHN 'hFD~"-k(OTe4G#{4҄G#Mt=ç J4((BCx(Px>ѨMiL/XhJcɚ߅7F#4)#{Dقx|!?FPOEPOo@WՀG# e=H34ޒ};j ! ?1~-UW,^5.P<6b; P  \C| }u3oeO4xFB  E>pr+b5>6`YXCȟ(RѐRѐEبm#/`1;_<(;=KcbTg:azF@S:0n!0! pUDODe 4҇a0$!.=nw*`1yGM| #CJ1ĕlq|Rb .u<|8!gSco!4\NdrGt…I$NE"QL:(_N(܈TBF"*.ˊ>m>'%c8T3&W1&SÝ5 Xs{j) 5cn{5Er‚رl!(~*BJBHHg!"CtoC6EdֆA6 'ya4إ ަhOtJG6`n@%Mla ZTh !yQ ZS(_/"@ @O$znǼq(>k`ݣpQߖx|l:>X{/~di߅pC"F"GFG:Yq00(>ҧg~c TsCt&-k:FBB"- F>pׂOv?Ӻz{h t4H=qRp,KHRKGK~B nAhe\Vhg+вfK:[q?-=$]5<|M:AaPyL|"BP>!uHO7;89&v{=r: t!ld#;F:\EtM>ȃ!y1!,ȓNeM:l(/>6<2"OLaNİI'bc<"O>0TeEgSϯVᴌʿD۩`|z^xꉊhO|`$XїԂWub} yE|K㭾q.q<:H4C#,]oӌ5P:ШѬ\zS-3Qw\$"U8/Rn[V%Ƌa h|&F/M^ F_93 ԇ>SLT)^>[Iέz^V=/lY?)#!x`h#a}eFb Sh$LȔȄ!G,JުɔߪD57hFDt hL&ڬɔNݘʧ.f8rL߭'&oц$1/C#muectꁇA_X+yd|qtRd>)2ajct~{aRfiP(: Dt R7(kl:~<-c9vP$B7. 1*\v'[<]ׄU,F([EOvqUCMW%s=?LI &m6NZ(N+Pׯ5y:WXX1t 5qsr{:_q5U5UOD`MWP\MgnRji?굄x2&MQ'e)"oorh`,xUMT\u!5i4W\VDs3E)Ԣ(fzUmH͇R†_zXkjufM+@H͞oG*-kfgzݙ;3}hƚԅtVh:ZbM%ϧ^4j%񭁗WneT6j%ӐJ^{5R.m Et(!|av8;6(F 1%r:uCk*\HQ9_!!:}"t M6D]g?3%F7x Ksfw:TC6oL!ix!1D6*JQ350XN(EGqu0tWoag2]LoELeea8N-61[>8_ 8ٸA7}ԆJoy..x|ŕrn-)QxU0z0"zUMa\5zY䌎ч-݈ph̅a0 Fh0LF_[F#a8 hpLkNp3:+t(JN(@`&e0i`F͗,F#ʄ)ΘLFoѷ۲v-l3}H-z2Gn@%l65ood?v>Ipo8$pAc}l!-9EM zW{bȢ;{Tإ!>-䱅,;6l Q;P B쬝`9NCav eޖ( #BXىJFj)q\(sYH,GhƤDV,L0t3:잓ӻ1#F3@S~x\HDz/Ywfg&7قtWYg8&$HFyZwADφ03:Ѩ!?" ];?$@vUtuMbaϦ8r>@eDeL TF=Tz|)Sir#p"x(XlvDqkyF"0Q4|QF"F:ÖMvjSީUm‚GA|oa(0N&IФAb="=\z!qJYPX䳕ZШ)lRtuNWjuQ%-R%Q%MB)cuz1 .H!ZHtAK[kR|iUyZg$h$ F AKIIP$NpPH@$PHZdcpG=#  zD%j=BBe@A  OVj|դVcͼ+dlStR4TLuftKTKW.Jwb9SNr:O+z^R.:u)C'jՂFR-̥\&^@t)SگM9K-"OÚ8 > %iz< . ^k-ܾdwRQd$6LY0LZ+*ՄJ) dTLWIp]9ZNRH僳JœlǓ#l$5MX6QBVHϯl" ZL?dyZ!Bbz56񚎪W+,U=/t%~yeŞ*N2z] Ã'"OɰB8& y4FdűJ_Jt CjmM-^rC[_MJo7KSeMU?Z藗*&Dx&Y7-UKHZKZ~$Y2M\R m*~ūK|2'&V)V)V)Fe"C)20EezcM&2Gb pG5W[HRabN Iڊ]guHgO\Uت'%IIlՒ*'e57P_p|fCТ"YWՒКx~&Յ&$U:5 YlYlfURbJwSF<Hh`kmxMޤ'zLzLZu$JP=$Lx=I앳&ە]2U^twWm.*sK^@XbIb$*K>Z Nɂ+ M tVxjW `Amur[ܥCݏySRa&ɤI (@JI#}QQj'W*,,1WMZ֖#%WNF;澝]%;#PБC]Z͑HA-hd-]BИ]} ŝt[9Ki9*Toe JflJHoM޴~ی[)ɹҶ,*`-WrE[]U2+GHZn] voAvE6N4`-D`=T xvŇ>\^򮞽D./W^үt}pRK@\>e֡N^an#\:"y\)JN"J3)EUPBIL]"2y3v%e1BuKwFh$q8^mҋXbx=לtBA,H:WZ>RK6N4dt$k$%jZK.$.-X~Wa=IPfGev^}l~>]S|5:qz{h-(xu FWf-sOL $IJIR ,>H:|() ڤ ".C]BZвD$R!f.F)xb+km++EʥL=4N ]@q*gG*hgp=E-mсF峵(5F},]Rlw &yS+ZRC=S ,I-Z- H:Hȇ N#E Olt"?:̅|٣g. kiWO'=ԩ2H;'^o'^o'^_ߛ?[>F diޗKB#-/ N% ,,XDōG3yt.R"/陋zyHcHfo Ik.jH1j|*jQ 5>qu3~\>'^8-ό?4q _vӘZfI/;Dz< =kL]ώ+\Vc&"BEnlRE|(l:Tߙ`9;`ԹSkNe`tA]:w*sjb`܏_ xMdjI POJ|兂Z&RG#M~4ҰG# Å; 899hΣ|%ӘO)O;o@##?&=:cG _i>F/i3z9g=qhx`R-3nE]3Hysd'q_\hCO@ _GW׸Oџ.G?G:|.#2>̀ b|oP|O c ;_~8m@@(E hۚcɋrď؍?)Fxv{C2+܄'y9&zyt71R-t 4[X<€3~\e~rLkq=kG4hM)oJabd[NC=h,(=_CshLF\>@zH j ?Of<tz4jy=',~qz||˵ J0A9zʚ&g-!MMLZIwۗz}̇AN]ͤV<]C^t )=mvݴ`; VZ^ʼna.姽W,`4Jˣm4>h2>G=F3zNJ5OJyRߛfJ"x!{t<5>jktpr=5wϼޮRkDpXMKhoDfnB#5OH}F%J=id)_S7{3zmHhIFAֺ3u&^-UwuxOZRx\{ _pR\ijFQdx ~_3~EY{SBג֭۟}wp<|[]wZd׉??,{?V+UvYW-SlϗצQ>[|,{Hr.;? x)2F1|\, 0ݠY@`z>#;E#)0 7Eޏ"QpϮ/ݟ:zW XKJUkEv94ٞP}kx}N'^VcY~O1Xkg|ky7Fsm죆tbkt,Ch2gtXMy׍9~kɍ^01)]҃KRKHjlk@qݨ=<JlgpJmC ]3Abj }ūmdovu.g5\,=_RbM7zԥ~Qd[[ޡo-zFJ7\B?g>FcQ@^ˤkx[^KJ7 n8zn.6VOo{6g_r\UtHvrocx~e#崴/6 L{n%Pa颣67n]wWݒ?pS׏=5vGSd*۞@>|4 jMx~_cy Mb64WM\UF͎>nωfglZjSϖAsqyu0a18.巗W}qH)Id5*feb^VYwl%ݰ {ӕtҖݰhg1z>>Z0BY>Di:7l67o>=%ic\\5Ҏo_AzkZ=Amqѹxv<<pPO͓!M:6Ot)(A6Ac?ݥ^/>8RoP@PG.O/;|)z8[C˪ӅRh ྦp/V^Σ>{gvn/#هɨ/ԍdC:3@8-ML8>C2e$NQ[,ԕR%݆<ݒܐ`{I9=_/"Nx7LSOѤ3jt:B}.GSjt8Dtn|l)q{6 {x>>>}mfA[k79*vp::zr67mynt(.dHi 62yظ5vWѹѨ5ontttbznt&ǚc#jqFGerėeT=-rUӢQWKRӉ ulƴlQKӢMø!oϯ5omBƟGqR)Ӻ=2ےW\߁ڵ^5bΥ}ֺd6jo\ 3WoQG&H5hl#圽`4'f;6{6{X(3V ^U U7fFS̔wr7оO< & L[^1)?؎@=FA=fzȡN<x$iCDO4!4,!4,!"?E/hɾ׈>Q&+=3k>< dx`h9DWUz-< 4 pjy$L@p&L#(ue;\s<f+ <0g{15IK1?J: n@S(|4e(Ol>2},|b5eh̠G8ftu +`:e y}f"vyvyxCGȼts @,V+Ⲃsdd؆F<06!xuj?TxH*0*È̍(40|PnU3܇zL { <鄋HL$\^DB#Ae-)} (sc('FR:q#)# =KPV˗7|SHLD|ʧ.XS71ks%{j"OQm pQqببkgWYaҭm4a:NEB Χ![#:E\42T: Aa{&2o#p g 4iD^6z/<1#T"(gA <;pM:W 2Q&.;OL0C4<:tpUz%P@5̚2ҥ<!D'$gBhȃ6 6h#`'ڠ|f 6CI!ؠyLy𧕌tR"Nn'BIG0~Da& *G y0GLg -jaCa7Tt tw|SA#afX@#s_>]CK:0!f!|1'Bɇshیѫܛ!"K>Y%0Li&4D|=/U 3G-$mCK:Y0[H8e`lA#_AlE| !>zǞ+c6@pya4jnP .$9y#<G*2i% 0T6 E^rA%HC%}L| 7+$fMW=MVn!0h$6a%0" xU{?S1^P 8$hӘ6fr5'Hh؋cb6`C&"6̌rlU4'#FD41M{lѬ|"HxڧOytwϠbŁ|CŁD iWM<g~6F>%&~9FZZHk}i+H4E'ZTl4M 'LEޙɍ(Z!w-*0d4"`Z]HG X3~ 4F { L `!U9U8oK:Ӳ!i@615=hP#,crX1"R훀1YnBm4 FtA6O !ebC>BclG|F c8A$4'ItJ l]):'!x!H^[P'= r@#-5\c]t' t!RPL40f !t?Ďtzcz7eŌlufF:A(|(*nGjɑHav 8#z(!GnSf˧{7 <DZrA AI$6MMʼn& -IaK5N0sDۿ?3W6<%ҡDp@#M} jh8i|H 1ĀtB>+N hL|-+"3pU! lڌA4<b!| bxtLȀF% ]ah]&3 gPhldϿY!!KvG`>/0`< .АN 4% v@1>ŽV. =Ac//39DLe4:H#Z h#&Pl hY"]iODD4 u&J@N LHPg.(`8FmoefP=x}x7>6܇4ʠ6<0^ނ0|>` BZGh$ZPC'Zઍ6,LJB #<\UA# 4,mX9F!\tF;`ty6g?tA#sg)17n*" zKZ؄FiAӋg˚.r.nQODCODt'"c5B%QC0uAI}B"P/2L|  Z<6里~8pz %< ,Y3Dz0fTOR +w cQ.}n w) C-[ÀKjڑ]>+ю{Mw@##mt 8\VL\O@bZ>gO| .}uLKaiAw:[Cg >0 Nf8ˇ ~973zF!#\NR$^h腑S( +m Xh$FQ]y/1*+ыj5y^il CpG1بa/lư=,N -x|EնsW!+ܙg 1=Zoh P[iܪ8u;J#ǐW t~id#E9>JQAVYV(# if dd cdR .ǷKG6Sd[?e3,{&lf$meDEŰtBlE)ivݐb,bv?\k G 4lFfUŞra̳Vm *Ǽr84}(+n|5%`y7>&QfL:uC&(O]́cݡODŽ;lt M|qh3|VR>+q`Jo1E$N5jNwD+DZc6cG [h$lO̽ON UKJ*o!D06 S9|UM&4(v|&&"g4BQL#0s2!| )C`-3`:p%~JSf7x?+SU D|SpQ| WhՊ>a33Zo VGrMvtX nA=B`;dy4ࢂ 2h$Ƞn.ېq2DBFvaPfIkf .+|K`3V2Dd6>v;n2z=";<  6U+P}u̿gaJ21gG!!CC#c6 hU㎖]JWgS7mY'%& iDj&7LDD4qxD+d+&n ee[Iqw-#^9!XWg+̨%$PbBb"5zw>S\#`9{#=#!HDF=iC :4۰egʌO3Nʫ%q 22kPIvc-B`*/ǀ.0ZZh$K 3̡h%FR" Jfz]̇h*7uNR46gUEJ8Fcz_DJZpD#1?1}" 15qDbcseJf7ޝnxLdkD]Z"/xvn$zR"o-ȋDz"o9y#x -Kld>a=_*h·h&%tc8Z#|ijs:_@@ІSݡ h$h+϶4χΩTmj9+5 6Nn/gEey}c ɘL#c/8C4&l8'3j\\ޝFzwO  h1:D/ #4#4#@(Qx~zOnr_0 v济X4jHE!ӡZՑ ^LET+xvQ)ڈgb#r#MQ8b2nji0]!k>)5J.oMg!Rm¸[>ur=1a:(3xtؘ65 ْ z$<ҽz-Hڠ|k-H$MH=G!=FB[CJ-dOC=5r-DzĈrcfK . IInJRMrs.&HH=cJ^&ဥK8srrَZ/z$Σ\)|>Z/P> Չ./iF%wY9HdAY@ Vٓj| ]؞`qxYoPV+11,vA^ $&3_Z$&JaTuɱe&vv]0AH 0IH-Rwan z ч 1[lAKC4Ay7A6 ddڣ|=0!ilCpUI8o]GI r( XP,TgJ%[UKy(z( x = sI4!WK̼^D  )HjC`MJhOwzLzL>fIGf.OiHdVS enR+kt0D IQ&ʚ`%X[в,-X`A# @6A#2@س6r#VIaKQlIQ\Oq߭Ѫ^)^+06x"3 *ൡMH `IQ&h$FRX͜EGt$20 \5<,2"#BJ@# 4H7"]QFh#IAFVz,)pY4bv|,) vIK=I=TtI=dw⡼V8 tR$E'Ir9Vd H5ʺ͆D_sdN/'GeH#S(qBuneJ1.]w9CYIL- H X1R)NYP)d#B *%)`./5ZTlLbH'Hz,oOvW7*xh/$xFzLl کgDYI桁=SB'{%t*r6f6/zIjgs腟Yx&C/|$Ӈ*\EsyC@tS*hx6g# nXS@On4=T顎6J}#6jh~vcՇqhb(>ꡗ moiJڰ+ witLḢNḢbFr Gz4!0_u@=I,7Յ+dEG^ph$63J.5 s C&F" $)4“14VG+OXh4V:$V>V6ît>^U[h$in.ۤU&pMɬɶ*%fi֊2Z~jTRSJMcJbўXMT9y^X^I^UU=U}[^e/qz2a(O]ӓkJ |,mV^C$dmF/IuJ[w" *F&g8)u.F]RltE"FKڲemZfK-@R.@BvU:|ytS.nVzs$\+]ӂ`])~+KR RmզJUYFXUJ|%ʕJYQ_$U$dYFm\yIʋlm5Iah:y}  0CIǸСj>]gE[=16LI5\=|-.0 52@:~ͳ^K7Ƃ-+6Y* $e6ι |Wߚ*hC# F<I YfZ).hZJ=ɸZq2鶍 Ij+uUa݆Fn6v)kZ,)-HZ$p>~x; c^)##K>L!<ҁg:J2˕ D&F7I?ү.3zZIPRC#)tR0D꯼VvR0B|ܤ ӹ5]X$}X#C:ևVt$$1!ÍW!MzРIʐ>e( eYP;YA4K|˗ϢUd=%*DkLx|6G )%DI>-Ƭ;(/ҝ舯?R^/XYgKoxXoZoHRNJCB J&󐆭Y1H̢,I5kw!t_!$_Ӈ$Z>#jiIӲL-eJYn]1!IU8]nzSKb Wj5Ēȣ2* -G R(Q8Pr`@;B]EZ9EZ=[Q"u ^Ƚ&UJzg$uVMdr]Cch$/I/\U W(6 pbM(KW`QFK)V@,i2/.J,Шbh$-F^IH/\Zҋf(cT> @k?t--x:>[ͻCr?`#~{C$sbJP!)h$I23Z$`ZQ*^4UJࢋIitI ѥH:H>t xt]Σɒ|((T YхH2 tJW˓|,ɒzO*:i>)>zzGK KfkElx-_(eh )|I<'K:%!_x^i$)2zTaNR f |!(!k IPG\ H:ӴC:tD>tD2D0D:"T餤#!$*!.. H&QNFaP">XcId;h)R%IՔӻWQߕH9xvԓ5^$Ewb$bHKF+FFfs6hgCyquW?4[ϫ<;qׁ[G|t> t[LG|M#C p;KyT|<᲼A%YWFd=-aҘI'똤ͱ^i/ lP74ix8EZ'bZ"Y=ݰФ|,/7m8_߼^w e͆r2S0L\@#bfzV@x^N@:g6T 8td+Γt VЈRmhGJ:1%+A 0H(wxJG"$]!494](dcJP|#Tu*`8 3pL*3Obdq^A:.@7u$CuCGw~?0*=3pyaYȞΏlL\@#a|* \aEevTlxſw=^=i&F8:KHPs}Y|.@Oebkӆi^ jO&=8AFh9tAfy<hyhzs<\{mLk/f9wp<1)@y]X ЬF#e2XrezTCi~Ci~WSߥ /Jk4Cm n P^+s{szf͹>kChcRXwxQ z#55x!q\UC9.8hVW|}D>qyMr 8\ǒ47i^mӧqZsKz9rpMI(XfjtZ8_=tIjR<_˧1^OTcp8i빸44{I^Tgb=6(7%^A'g%>91~<䬗ɉ˷AYO^f=Fi9G) ͚<}(NRcv5v;RQG^j3TYQQS<>,9YIWx>*I$>jYjUYW 9W9;FF^'WiSmLbynD)!-qRm*}LԦBm"pxt{Q%V?l[9z_dzڭpKt+_JBVҺĥu7^~@6.`]Zku~ߵڱngr@騑5Q~H'k#SupiJid> x|~j4_?x?i/*(cazLQ1 oxȎx}UbOi)onOOo]χ{sτ>y\6>~ӧ~7/k+ѫysSOޣܥC]~*T:zo,Y{,:GQX)q:z᥷}z`͞8x\fWB9)yF+-QuhHQlV4>oKi~~x7pyS,q3;tnZEZ lomI O^4ԤyN8J澕iJ{keWvbN9K(0 Z>t"ywsfTMX~b J6kیuؼ0zCOש'I:$`:938/Aϰ:5\~#: У/ b|R+e;Ur`Q#O!h`:/u>4c0zOPD_ƧՍѱazI*n x~rgF'V!D;ӁMjBڲsVGu61aiapZ9:/.,.#^Ng=IGt$uꗏ7EǛtkgsrV_${^+GpWOB=/݅gNcP3|p>裍{%َ}*]XWn͆=9 |O6b^QAYW}_̳x_ fJ|MM}An )Ǘ=_ukU;4鸃 QnsuK-9oU[FY٤}!P\Ж~w~vYGБ[E;t](`/ٴ{GrnZ8ݸ/A2fJ}hq6Z]bIx}^|7t{L]WG<ȿԮ7y&O_o^>@4;9v?PmBM;CG@w>?; χxUgx\BiGt 10Y)˕?B?E^+T]^]Ct1V5оhEfժBcꁯ.O[ mE#]P4ҝܸOdc>^əW袂gh+9KoWmtHWt`u9taqt9#j>FN  ; pϧkٙs/V3P~#=Fs tӅh;O}HWt6㪺T,GOnD]dxj2<X!ǫeym;bmnZtpW]M=V eG wYWvu:/#Zt1|->5f/]7ED:8FmF/ ͇Ꮗԓ$@pR/k`H(d;Og7:v0 {/[ݑ+=H5&{一nq63]u{ttMo]_l |ˑta?t-^R0i#Uu@şdژ3u(Oh#!A3!ACO'MםFvvS |(P^S6`O3 K7UCˇhׅC#]24%JW^[K.c1%J';Cv]t ڰHng+|f;뉐lB8{Pww+i>tG&/_d2<ē̡ga^$gFjWڮ1۴[H]^^]Xޗ|"ѝ3ϭaj-p{?L^Ӟ}u7V;xU3Aw\qrQt(󸴮86gOܼ| ]q)NGvF[^K]d\Vwtg}wgw8KjֽEUK2|:8{ uWD<.FGO3kG׾:n?:>rgD>l܊ҧ3!mgC áQzDi,)]hx>^64Zfr(ϛr=o37j4jc#G/sTɇT UꡂF$=@Es40mÓ\NAgkeW4hEҚ'4Opin^f<%HSCojJC> ؟>҉xNd3pfp=2naO^xP 15,%aQOJ@# !TF9 3QC#:D*@r+$4UhGHHSnGM5P5z)qYƓ*gTEh6Qy=3 Vn&zCC ,@)V/E}v3bzGG.xwQ#lw8=FcQ@yLn)!K<2ijZBY)!nkgcbxjex^+EX!D=:eh$XFa /eapF"bR)FTQFVv/D|uByU,pBd&pxu]Sjfͪ'Rt<. * O8jYT6 1xC|!<!QĢZIYC;fFϢXEÊzo>1@~q:_1ke7NcHk晛t&fg̪@ܪ@0Jzb"-o•7`;Ш\VO^P+C{!V٤ p!".+ {GأK {ۤC#-]6eK瑱O\<,M9 u\=(7|VKπBƛQ3\u&[:(S*0`n@OkF [h$B՛+lVvM+tXpE<15]pFG1;ΗӒ]/lAFbWz72\UB#jcv>:f5gŐ,ZbzғY=5\Yn :H4B# 4t|A#knLĔ춙/cd`>.?M\ DhQ& ::1DL#*UZe54{b-o(Z:Feb|"BY>FCY>P/KLIs>A\bƢQE\a=L\kQ>ƢB FF?1y/Ƣ& FA0*h%F# Fl`H0e"i0ƒ^Q>+pFl=x:-CyB^Ixm <;pyxVyIR;*. RoDLh$0Q #0Zҫ1# ;h$접HS>&M&M;TQFB  5钌|IN>!4jhD̝tN> D;+ma){<RГ[bnxA!c/b5Dt9,ιAfbUブ5>H@##}&L \VHwJbbP ~t1V,XV1z.|L53 2%a|Шa+ocŬX0q41HĠ* 151;lbftHQ,@#ȗ/(;,@Nʴ.D3:0#БA##~k?Pb 4G( 8l+c1$X2|ױF8t@:k?!6걄|Yb z%_%(ODDLt"& W,a1'y;UFbvSIoC (c;PP>+AjSpYq'}"͝t}Nx_{ +5C;p3:'w@:Z )[A#Lp/ID Z6~ 6 ~k"n`bEpFCzla 0҇@'tb|"$!@nsy d?@B.@Ӈ:K\d A6b?hL h ٽ#(!zԌl F q"{. pX81#[NIĀ:FPH/&)m۟4}Ww6fNf&@4sl§Gǔǰ6#z i>~^dBCrXG@@AT(oP[zt9s\iNimlxfk婨:nhp33"),h$`e zDdhA >1U`!%3D| Q&sQ[(ʐd1YШLH0I70Ioi!PIFK:%CtX1 A|^FK?=ƈFL#j(4$D<壇t~!:a90BJ7+Pɲ$1DndZ #nsCFmny 6H|y_&"ޑy>.}aͻt}]w%pd4־!pQF2Zf>42m4^m+^^ח>5ֱg;Df!޸Y8F46j6 +41,10X1 #lD*ʆtsBgvg1LƳYt"]!F# H}zA|xqH @bw zcrݱCqfrF!9$hD,%!و~9W.N#LjrdB.K/ܭwn}7FD#1l-Y1ѫ]Sj)tX"(.qy<n@&M:(!`':D-sOzgؠhF  1h$ƤhȤ7ɔsh+-_Cff xv< 5`uLhpu< !AX0詤ڠ 9t@_:mUvԫmҡRA#1C/Āɖg __ /TQExy-1Pzct c(CژOT9q}+ѱ56,!"#c0RuP=!'ؽcz%`a)\>,9Gh#a'·ҹM0FBe!\6-k5{`3:nШne='Cԅt"M:&{Mps7tO:6#ͼ"h=e(ԁW'$QyqFfNK6!QtLMcbK|O;ٜNFϐŢ86K'&γ3[jhGmjَFytoy!nSFx q?}SB?o`Mi]ljx4c9 d#ncs"5Z@qFdi ]7'pMPM$chchӸ6 hnffp3 'mx<%5DDJit+f#e!nhu\\`F!V H'RI=0#gFI فXYDD7a1lӒ:*\UL*z0FB#u6f6qUz;'M|N,ĄX>nEӵ1 {9 mdc7_ !$>h$ٻ׉ģ4?edW s<;KINɘqFs'Fe|EO|l92#x4!iG u4 is0!Gc?mS;S?NZ\np:a4ʓctF9V)zgmx"+ީi4- k5. FO CDˈҎYB̼)V&(@[lFؤ=|& $R| ?ײ0ty @< *!yл8$H%ɮwqJԓ0c`ا.Ш j5}P&"#w>.i-Y?gxzLzLrL pWʉZTIPIT:#dFz3#A>D^#[5jϧ'ϻh/}[׆8وI= xvqF'd$-y%;H sK ú5HmC6m&g B[ .j=/bHn6[n`yh$UQݓ./{bumEeF>tFvkǐ.:"% :ӻ)ozJ$EIﰕHYcHP"Z-K6$K;G'*}U@׆tA,GJF#4Lt]ڦIgSn̳P^gJ|ꍒ* R=pDzBY!UUQRIzWKlBH|VJ."4W)!.!$Ꝕ*.eY!U[WHiQT/DJPS:V7PTCmlC+hGAEĉӾw)#+-pB-0ZMR\$I04C#)RyR[XviU)96\E/<}$It%hhϋd%YyIXU !ņJe7 W'+=]Qch# UwՅ+Ii%O`XISUTVօU)VuLuŕ<]hJV:zLzLzLI2:ah$FR[[e8i@H2KSMXOHѺh6+L#GTiDH3nťDŒ⿾Xo%#mJc$Ū]˶KB #)/iZLu[dcqڑʹ*g/Օ XZuҥ#%VlBWd&HIGDlTY!]–a4BB!9J+j,ĪbV$MbV_ՈdiK3#nڤJ ۆӓk]مIa%%Jn%hurVv$^ h-tRsfIוe&˒&y$YX%} G ; zit#:!D<$qU)wiXANׅk"cuXJzvkC0Z| M4&I ֒8ĥ%Ȣ\U./FxsoWꞥ`=ex?%Г5U$8Y4͊`h%kyKE֓œǓ&HV$HA"Ibő.9)[$D!9Y,fCY#Rw- Hc !a#ľH4 uهFM額ׯ=n*qFtSU./A}YmK&]Ln)Vt^tAKm,T.-Fn,JY[bIٕO^XQHBC爛~n| 7 +=4o?'ZR{LsNK?K&ՖYӑN| gF۳ fX/Sz/ցMQV|4$pY<ܟU|uWpUibD#Q:ź0ޫ.  R- a'am0!iZ YcҖT6ZRO%UTXRa9Th$I)]_m튾DZ$:+j_XtV=1,\^ HrTP'RXTXX3d:ko$ꍐCHB&FB Ђ⊖]~D  ztJ W~5dWtu V=]UVb b6^B^k\^Zkgn!.nF|d%)R$y%t 8ZIh`qzRxER zLZ&Y.r$Hb|rR#pc5K?|RYcYdS$AbΡJ+u]вXlO4j$[v'tbu}ݱOg:{>O')h$)FX>wPA ?3zGSmD}41XU\/!|=zFB9"!5hX];yMh#, ˸%XVXF#a9[Rg4xٳ =XN|r>az,;/"0IV#q#g?kXxp(3e2<;(HF`!.f 3!|̝yt!@8$#Dto>\UU?QC?=y"+(fPL 2x$5'~=C^teewaBq5v4]ǿy Lfβz2tz ^Kc*U4Q qh`-T\C o3{C m-qx %/S E`+9 $! މqdZjhX:QzfЦqm4hch)F(Wkji`P6GcO6ăդ_ҭd?ޯ&;ذ5HֿKk׫%_' '}/kדy0 ǤfG) FӋ^ʷ#?F~; ?Fg#8cßs0_/o!44i4ҐF#Ziǵ49UYFn\^cwf>vH D4iqDՆq=&4zKv/$nuYчsyPW'6ڰix}Xvcm@ X?G&6x81^1PViyS=Hc4gFG>vAR>f3 N?,<фl@oxZ,Z,Z,Z,`-id/q?@hό^E3<6i(Ѥr4}tFh:+Ȯ9^y^$i_)g(ӓqPM\ظ+p>H47\)LJ#9hZ#G2.F32-Gh6˓EZ!6yج'IiRr']5nְF67xx)9jFF5+5%{y3FS+F\Dz̕czޡgo=IMD>A -ܫ'9hm\'ݦ;.+K{̣ yeh쐑Pxu4Ҕ)cg>vHԄA# f84Lhyύfi~53yil e*xp|HOw?/ǤzWuZx\hp~g(2<_o)wz>Eo(BӘSinOOoNϗz~'8㲷i>OǯOX^A۾|xt~>Ɠt:8ޯy,nbfeaX=eѭrVn72>x_V4nVҿ,._V_y DnYX. z3/?g<|&k?{>yy6otN:Ϭη?]^NƓv|?yvx99>f9fw_ø?W>nw[{9}~?|3/_r<܏/뗟vo_ozJyyri:"|_7Q7ޮoˏ?~zz9_OeL/?h۷_~~?wzxzO2t ;O^NU|wp_z;ӽ%V1MSv^r}5ߓkn_~޿rըuw_'q;۟G00?~_~qvt_~ߵ]B.v ?i<?3qMRa;ǫj8βd>U; uv8xZwa-|{oNQ9\GwѸYʋ=x4]eDwǙ}xu><ezYoѱƑ4nj I>+ {NtO!}\{}oo營Wwܯo?}Ͽ};/w-8'qm8~x=QEyi㴷<ڿ|?&~͂S? Rㆎ6K[RT~S5?˟~n㬎YW/?Mz%?ەoe tQh,_G} T,cendstream endobj 128 0 obj << /Filter /FlateDecode /Length 12476 >> stream x}K^IrGkX7 A,C$x<\EsND1jf/732"#Noovo~{J-eyzw~|{?ol 3oe-QoT~ޖj뷯o.o}y^"nFokmwi/˧~"/^n<.Xur|)w'?7{oݶ1] iYWn~u6JrUvWs@ιzwBNud^9ej[w}2rΔJw;er䜩=&39r*>9#=f9}mwzՙmĵl tw<,ُۧӹoޥv;۸GևUX6/m-uh60KjEzmGJجs\r:հl%j5Yф}ߣQz>nrl%,)[)9Id廒htlXs}}*i5B6eIp|h(]X9Ap` c` r;U<-]H[d\=0TH ľ-أr&6FE^F L$X[/XǏ'dBO=;mܑ7A[nUjh(^MgÊ8OGpOa([;m KYM[rskgS V7bc"װ۹ Ob^F k~IȰ҃LFݙ豓a=i]߭s_ibT)c5I (= cNV́Xž@2ag givSjw#绱j@@҄`;jOm(ыǡH2 䬥m`fR|*+vmIyKװjJ,@QNm(6#z5\ce7a5=RlozMmG=me}ǩ*Z@~LYӎt44 D"Gt1jVvdvP0=ZuՂ9 QCJb G`Жц(ɨj82ʁ[ PPlzDR- S4]Ũ 80X AA-l [ھ2l4!S"uGZ-D @8jmS-05p(鬹 `5J`ЩsMa59TcȌjljMBiRa Ѐfb V!,?DJOt D̖_"PH;H6v((ʓ+!*uP"҈c6I "R])JA3^ 3HT(Dt4PT <]Bj}NѻI2`7@v3fXvƘI$<2N$ b[#[/ $1iKҰ&I攚iᜃyTthtHMҝ͢ (ءXSMAj wE v >1ub:%epƣrSۆ0&Kp:ﻐ!e$i5d@EVW&0XI~ٴ 4Bj-Syp$i҄Ll Cmtø2?JUۈEb#-h_$à ]8b}]Ŀ LOE;DLm/^fSM_LwnϣH>|yj}בp^GzZ^z:W^Nk,ftwqCBEbnB19<6QJ:XȠFQB8rD/q̶l ~ZzdG0.~a$!j%U}W 40\zʏkܾlqcq1*jEQJ Q,]|`kgmX,NO[cpqLYVt]!_nUzRH*~ljxavMB*LY^eQdygo"!L^m\T[֍m@xcwEtXTFHkW]i_Y9&gnXe|0 +|A7Iט7 .#)(g2]\5BTʷ\|I#|s“AiUlN\UHӡjVUMuWUi%_(<-IH?ULgqhw9-oFc Ph7wf$2&i0LkP3A/u,iIQpt!]~^{P+EћB2N@;7G v߷UY>?e;wWLM s9cLQqL89Ygz!S(>[Pq cĭڞEw,pƨf(BݚFϱ)4<ɬ" 4K R-aWL4LYμڔT+J!IBB#UtyT SIM2JiLҌ+v JT[nH1}'|+ "6 `{-gB>G-ɉ*;^b*f@'" =E]hN_5+2>.5,Vr+i䰼džt E:!q)7=.y'~U=66/?2k*Ͻdž wBs~Y!~.Zw;6`ܹX[ˊ ױ t+!-BwK$Z|ul9wqnOc]9fkDg&l +XS.DZxgKGΈ86{Y]㌘\x}3cCϸ;M*#͐z_tO*g qӚ96o'҅g[H%XMí]Nnܗ[ƹ/M2_{ %8ol@|~~ee ̳A7^8AOڵtW3*p |ǥ|]pCʉ`ȉ[sș>K8ч Lyr+L3UY!L5g;@n @N1}ʵS.gLr-ވ!4}f)B"uHO#3^";hC/e3fPI4f#?}!jD@H*&MլWKS>9Vd;GM99^j*"S&tU"%GD ȑF;jX] @?Om(ыᝌ 4cW~<n&`^~H;ɘs9`oA9 V b@}Q޴N-(}s!rD1,1 $ c"Rgxz;0FVN!j@Ĺ8j@8S9^F ɴ=g6"뙊|+7/1ёW <j`@x}`b5SJf콈^84{ }bˉdA [m=ʸ>$өrԍ׼V,H9jh$GJh콈K8D4ֽFn^[ٜCa^qiK#M1/h"65vD G ;̏69z9Q8DiM'f3t7 N-{sB"QCK8ҹώlL{?4ދǡ IVB x@ ӧ-g9+H!lհj%/@ף I9NxIUd8W%GM vdE\gevs\9f6wic!;n79Pickljx\6w4A<.`T,ⱙ u uW }`y\Mmՠ}BwIH; 9hy%D.OЎ+ܛE!c;^98s+t8Ǎgjcm8m/GڰG.12tq v\ū;튷oҙvlH i /q]wOybq01-<'fwbJY YX4 ;`gڱّ;Bcqgt,q%7C}=)*+|' `ĩvLfOc$soXc99 cL:b}իoG)wLkӺm98cRQ؂-؊sIŪ|fhoAYXǜu8ioW#`58ǃ ߝb QNBWDCޣqF1`cW"'sHB=ΙʅS8 մboN8hVZAô%"8;3o$*:^za Mq3čuu/7XW4"h1*EC8 I2b㑻5o cSsj GYǕȐȧe fV ٔA"&cBsЙAGqxAD<11t?>pD"=|ᷭSXL,d3xSMD="7*6E=+AXzApIHsqd?.DYs+cᢢNwF8!&E>{9/=ntt!8 8ݗ߿IO&e1> 0@52D=޺DcQ
Pgj28!Io<$)U")T}MS28ض0J:֥ʃ5UIN&zN7Ɉrt'yxoE;֔`S&D$-1[D R\pL!2v)ķmsDK iu9SЎ5HF|C 󄩛/tyͿKi@DN3N:aD!yY`w}~>f[ VK?iO0St!S4G90Sr9k!\~\λ=W^N~-^->9W^NkWk3n{LWs9Rz.~9 D nt}<=kx{MF+ ruɖtU?Ɂ*3joY/zyg%Ku=İ4]ufuz&d%CίHx|6hG&/YX9Q8kkA﷕{e%I3+a4T|x@d -h$& +GtZ5<ù!^1t N8e#eW J#^v9j` !|;|ܮmцIKV/VurUp5'%.GNJ#a\]s"?)^:jARr ;UK84I9Vq8)MxBZw)4R$2n&)y9Y5t~ R*F~s^z O!Rrd<3c{J_,u@8G@ǯ^t14leޱUߝ̧*buKّwrvk`eZyW8{:C?Z ّw W0 р!{"C0_i\Ok_^e3# `GTZ #,|!jDdG*_i8#vH#9!8ǺEz;׌Xkؐ. =Kﱞvrd{,)6Da()Ҟ8}&xt0')mMo7Y\@JHkԩ'c`I19 Rq[8&naCn1˥RHj=Mqrˇ0yĩkU\L06heȜa]yrqޖV!YTסֿzZtrsOhDsuv)=MBh]-ngJ eSCuSNbm{qӫ;2Eť݆Z2a+ <9fʭt}a'$g>[0?wwy, n(7 U)P8G99>A]c=]$N:5YHu_\]$N:`SbPi\ C|\wJvZܛtݘbH8D$xfO4Ƣ>w{hzseb21]Tw==M;t'!WyN$n7=26X|0I}vo7 $W Jx"0 ]}H>?L^O(ӣ 4u-R;?ݖݹ+^N<`ibDkߥaäL-\NKC 7>_=P1x>X *VdGfcJ lKX<b&w#ĤuB石{S3w&Hn.q [ÑH;;sS3|yyuGMr# %c+bˇ.rnz~p#g`]p`݋l> NuElys// Yn%HGG6av9Z##g8a#;*TNCD(kN:N0] 變-W2gW! WrRŖ'ـ~9{ݑlHxd%@ҟ XGeõGRKi3)?#O^yN /Wq!9{:0(&>o8OD/wFX^e'~-w9'_?xI6Q/'Kl03?ES ^>婛 PM~7V`W߼@' |~ܩ ƽƍ+Q.Cm>ݽx b緯x=8ptnrӧw_'6g6M6yd:A$"_P-Qver#zv\s3빪Mr9hUlG_;dzN@!Xkl{6ζVrjib>dxZLs1m+.k 1}I_?`#%LZք/7:|ꇉoGW6cr1kJ6e6yfB>mbr74&lM.wny/߼{Ow;^4ا3[qTglo>o޽? N%ThOO5 &YsflmДlɪ79l9a[4mЏ'ŋ&y/lT dzvGAOO:O?MluOlj3s孎EfYcyWN[<͘$KeHxd˫2U)-qf|c3/||&I;$D"/oC}g[OdS:<}OdoBknWGg$2Я/.(D~4bLٟYx1*tbF^+kOEhgR<x:h{ǶF|";<28g); I>+=bR}UN "y{: {-뤥s?SȴolǷB@|;5 |ێ8愠̂lL[&%%^,(0nWZMLA?NO?g9 TqȻ[oB1X}fOWV#Fm f}϶ @/qKTȾԵ1==3>]ٶ09!қ g%^GE`C>ůϿ~[ˇzYԕ˹StM MT (n˗xM4uoϬP+2qW}o?~`}ze@_}'`1[#j2B5TkW}6YQ4>X}1ߚÛ/Kʞ8h; S@>endstream endobj 129 0 obj << /Filter /FlateDecode /Length 5603 >> stream xŝo7f?r{! H>n֒-4-Nۯ*G䷧#SXi3~mjmi~uʹmnG'?o7ݷǛ͟pv{;vxm/PvaS]ƿvፌkq0[7Ԛotmo6]= ]㶿Е? l8z؎oIKՓm~ܴښ*$VֶM%FS;ZIKÔXŖR[cS+iIa!heFgDHH&-keaLS[ZLRВZ!QhXttQhYX PKomO?4=f i9.L4>lvW;fLuk C k^"wEmNuNn$s<*$V!u+iIB&V8uUlIB&VҒXM%Z&d A*Eks Nq"a\suosarkV*-'rJIrb+)'6JIl()'rsh sFw>'*S?}A=P>9S4m0mMe&rݼݴ#Ū6`VMS}?Ӭ`6+ ⓝ/Nqa{7{O fOZʶq191VFR|(mGHgv4ሎяktfvtD~5ytiii%eWF[9{://qh,V=<$U: 9j GS8d 8sF+o" "!b6KK><#iǶu߯y65L@x2ƟZ@0y3s{~ ܃>۾ r@fl6 R@jRh| <] 1v?`8Ov?p 8 RsuZQ?ȠCO0(\rdgjMfm.&P2 RtfZ-cji19~1G@ `SXBTct(@61N5sƬ؁n`Lx7t)v =͠y`JTCmp( %.h2_D@OijR`B[آ-ā9x;:eEhN;I ܚOȃ'~HH+"28Q fAYb:bd sCPX"p .ٱQ u,)||\.CcG)=@GDA T selV9q G ->Xv @GmLn(p&fhg P$cJ1ãCѮx]xj>&|gF \,~BT5 P?Y?AֱŅ[#8 ZF-].<5O9J!O1(^*˯ PA~BB5rH5⫗oxV1`?Pw4X3mۡ#S'?o:*q_6f-yyQrweRo?RoŰPi8}ߴ #YWY )]Ң ?_]Ұ]ގݸ$dMh~ZEyU}ܵn4VGח4y=^ުn~7%\QI7)ܷU@P ,=-1l^);+eOۏ> س=3O2cO9;eρ`ޟzJ,Iݞw.N0C=7?ICj[ةWU7Llo,zٹ//z* öC){| 'ؑjlLN v{Gujޥ=H&Ӥ-keNTD󬺉ڌhqabKjcъ[VV JBª{ic - ѿo -16?,ZB6? - +GVea5,/4x#t  rSQ.p}&6bԱM-hs]:sC7["9ꫧ%k2rRTNg{~mmwWi}ŭqdMpeVOׇۏ;*7xp?멯w1]G CǫZzm_]wy!qEr }uNiڡzh}i|_mhARQXve~"8A.qwA۾a eۧ߂kᾞFHS j—m.UeqԃMX=Nx#uyhMGk[YJf;t;(4񿱦4ߣY>?Q7CY_S!]ux88VWw!{xx}CsMs{e£V]M?֧@7ٶz?¿?_E2:6޿y ޺#_>=ޱ-%ݬuHBpH{:~8xu43Q=*N2 8CЛ ={w%EA91+>J #Yix,Ipxt4i(eh1V_.FVi$MelP5wwǖƘE_]ׯ2AooOzvtu1Maz/wvE*sl~L>̤:c*b>j+'Ȥ[;N&X~X\cizW(J&̦q.VI{P[UO1B fe<WL?"JjN欰γ(q^X$@^:y7Np/.mfДSz|~t?/uؖC=L6 K/{pײ]r{\{Ȼ _ml71/tfFZUmW5rK-0u5s}k&ZJUV9^QmKi:ؼٵ$Ɏ/ 8ZޟVgd_MBdendstream endobj 130 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2449 >> stream x{TW'r/,-ivvmw]ZkkBQZ" <yy͝< $&<ămUZVO} ;Ns93wf~wyDx"7$%⥕MK@|^,d z'!BL*ڝ$N)[ Al&D Jl%$뉷 ;FebG {Rq.(qc6K7ç"VDxH8`adxd\LԲU.$NKY$BNډm{u4s-bQ9J1禗)sjqU?-[@ x?\+4}tj>F0RDj%81HmSw'p5ÿʼ Sڔh//- 2f#E0^n@ ̉SbcV6x +xwixAoKu|!@(,R8iM6Nw4WHT  7z[r w$VQ4GpJ 2 _9* 򎪆y|$JaJ7&'EU8H8[jRm Yĝ8oz̽Շtbk4wS Wx^EZ6 zdUd58\6W-sٜpA;7ݙc28/ڬbTdH'\~<=`*fTڜ97An`cqQZE̽ {bB:45F@ynqhXwM!I%8 aJ86Z!*i}>]6ž ȋuڏ: MmMWEяqVb"cF*,G,O}PPj7}*D.)a¿ :}x< 5%s-c~ oOJXK-%FN,8$M M$.` smJ`AzF ,ysI32}-U9?ji==!o_,SY4>D>0q«vNa.[G5>x~\U]12&BhmyW^=}( ~dؙfjcmnb̕LʶNF $w7l,]c8lt(Q99!}MMCѬQrd? =>,? #&FÙ ǀyF_t'qGSIki-Ғ m}JWf/Z{q)-^A꺵;6Z]xr6mt~u16Nl3UJR.NCE-kM:nf $~v/eZmUKWZݐo, `wo/Nso| OBQ,()g,? fdrRԨܪV 4xj'm*fPf7qEL`vË.N@ԋQ17{Ԑ۫3v?u,̮>2וp(H+jsyTS{/|֫=$ҏAZj5FZd^YgA!k䥤l6P *o* Aᷫߎ_%89h`⫊5=] tۓ_C ɲw6nNLB0l Pz7oA¼ rPVjOdpg[HŖBqɬ&?zp]r )Y[IcΊÆhn@ ~,tpd*My\ 5o 5e HKRAuVLYtioPG WB%}GSpFk zR8Md5]v}wTR+m&qf߅Q9‘S; a?8:O7oLM[$F *A! /sӟRq;X83>4WgR \IT!d&Ikm#2R8c6Ӗ\V:~ <|z?>FbK"'[ ]%35H,!#{ 쇩`ЩCj%?|fM+y<,PP/ƃ,pgjPRfkp\MVxʎ=vqmuiZmp4$3^0{|١Cuq;vqℌTTZ&àoT4.DB@dd.^:C?; q3^SL[g|IV,ϰ HͨUww6fD^& ҂֢-(qGe % Z7B|}?|S}_%hSI9,!? qϑZDFݯGGĿendstream endobj 131 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 788 >> stream x=kLgg|*Qd8?AJKEX4f,gvY`/.,%ڠ% 5mML MLF0Kx$HhPV\^OM.hw- Y鐕|=-sze]mr*2Syz'6~y_H']̹$[$W.z"|Z >h{Z73V!Ccw)= 1A$;̂dΏ46?X9 J2qg۬FWj$c>GUgPp7 2vMA7"X7D׷Gh7,;l`ZLJYjn)< #yR0) GLgKVǾi? 2%+9UR{[}N> stream xypWp*&&eH( 66Ќ1.ceO [>#>]l%a,[tH xbgM'0Mi2Os']Mh:?;;+fEP`ͩ+WZ&]_N'PEr,=GM%Y윔ܢ^ymE-vRx*JSMfj%&Z@=K͡SbJkQjD |W˅_5(A{z}@SEDR ྀM}^$nm8HθАBWA\/*mgfؿɴA2VTZ{X>S,CPŭe*h2JS%R"tw gZR{. Qw~RhEo#PD , CJ}*#õp "X x@8b8NdG6Ύ jtT K۪=O_n{^Zv%cPUX^OR{B[*bN]}/ߙ`Y5# "/J&ǪSѮEPmjY-Zr1fak'+Mz]nvjVS@h'|ptܻ@|,<.KI<Ǫ@0 \fZ\n;Nw>3@{Mb 5%wN([  _x4[f+~۫*vNݚ[=B jLRDu3e˥( F B& 5o]#$u-p|D^A#%Fd2,TUy}֓S+Idψ@>%BIĐDmR͘"q]QH$J6%dWS+P6*j/  Y/ç:q'Ss! K4Zmz~Ǧ# t8hn{Fa+̹[U<9q459>1Hsp&ƄHj>Ql/`І#q`3"CsQr|OPBU?;RRAEo3YQ3|-o!دpOQeIܫhmr44> stream xMkMr;? U,T @3/rC[$,ZIf>`viOǯtw_?ݍ??~??~_w_a<]~w?|_?c?|_ݯ-|9u"?-xӯz?>_>?nݲ}o ?}g;^cvϽ&^/N|[?<.xPNPZx$mwXengz_éux%>mxǧc]{>˭_y[ כugH#g5ٿ꽈77n6/Nzyݼζ^W'*IGzPG ^hr:,vO-Ge0u'qE` YbF#/xhq73G˷}ySuw$O=]z;mhi7-h?EgT"==CFrSAti|uy(_9Zx7=v>wnޅׄ՛7J݌Kq7FdËnoT115/O1Q⪭%㍹7O)$:0&z<ԜyԤ,wA]=wʍ=w}dN3rw9iq]4->Ҹq2rJ59FX 2%QjjjҨ.tf 52e֤h.%R֧[-)NR-{l{պ=3|49\||ubP^\6 V=~^ NzR#&\9O#qHil2ϙn :<rMBhfx6`z<@#~tn{\Z^>/},{IS=^aqRE7ソm/jhЪy˹y<0ۇ%s;=߉Np_Zhr:>/7{9z</j}OEvx!~KSKc! dJ 6^Bc&Ii,5"0\u84hyj q>ph},X@9Ae2i.w!AyFv=88޽½1.-z=Q19RT74HJ~ƭn}IWqէqwzh|ܷ]Xjb|px\wt4Ro js\~|Okw\}(|mn^ǯ.l8վˡyj#~ѐթM̈^QFji l[<<.LkɍSO'_7W K˳fKhրd h-MޜBA#l-TIO, }k3hY$tq<' ih4I4I8>w{基Lx#ce:B+{bbbPx'Bh@=ߍbQt5:IyChy8F<9YkbY/}{)'])F@Қ"hԆxhф4ҌDKl &"P"XD 2ǓjtN9yTe(Dbt[y:w_ jnkkT8UR/C3{ 9vv\x@ ?."}=ttMG?$e$̯cy&b~?IQkLh\w~=|.~oe߶rx^ N}VFsgufk "dxotN-M8xS˺0 qNѓ;F8z>MgsLH#>U=ztWcw]G:s><&TԾ?zux8;\k@U-}Y^fb1tĪ(YzĂWE3H36'1\~tBTO܊dlY,.f_K샳]|S`KMFk"Vs3aHG,#zG6*e5*!MܬGg%V@-0H!U<2|ALP'ZsCCu5~Ophj ^Y< !* %4鸌_4mE۸`&ntL<]S7Rԅ#]mD\:ZAlS4C1㈡PM4)1MxY!lVԬP,'elYMJR?Wy"%xu0.~a\#8'E-p&fĤVd 7Fkfbbm.ö j1H2 a Ң rpVi*jAl 5 }3 G2S"nV."jBjAFY' 2G b{/9Al5~ c=FNH5vP@#+OGbOzA5RWPbo>-^B[lC5<x'6j4T> B8%'*TQ5 N@Z{<C^o8*Tq*@'$x|nG`g5` Dt&d=L<9=ƾ63n1T߁DˊI.ͤ+ *Kʰzzdp"W9.Z*7)FπҰ'q9LDi-=N3VPQVZ|3Me8|N;i(ar)I6 FZQ4%f X,rqbuWʉod D+izU4ɪ/JZȚXL këZ:.Od#=e2yp4zp3LDCh$⠑F  2_4DV) 2qi84᧜ 5h$tk `1Cʥ1CpYokv`"h$(TȀFqu5y$_zv*yH`?70""yL`в1q:ߢR=]SUF$A# 4/Hb9ӤS z~ 4!z a&/CGidPJ53&-a'>^((QBȠ,L 4H?.g?.|@P>#!OR'tP4:7L<8\ILAGuGJ+$hHR>oV55RR0) 8 qQ\n5͹FϓS Adz>M~' WXD: ˊ8dMQ8(C֔)'+ćnTC .*b UJpd?ϏLk0\X_@/2iHs nS9COrȁ>iX)'ܨB픃RMLEEkКB>R8IB Q=-0"l &DQΦJc$t5(G?hcO= Ѭx·=.?4 5c <9 |OhpӪhA_>r@f@=v\h@  5ʇe2`>B R#1ˆ #,Жͅ xk {}|^sqWR-^>+6^bLC@eOQ9I F#4JRt-F.+JaJUaJCRp;yRX&ʻ6pY1Ġ4N &C6&L 㧼=ZAe-Xѧyj⠑ F l{0=}=.Qq"7-^Me^ꁧ4Oa1fx¥OiR^xHW y|jaͫ T8ƫŲw^-} jaA%7ueX׿Q)QFCAdTZ$ ,?A t 4:lJ(te0th:FB")9R'YB xwYx рD QD*x= Op_ޮ OUy]jĬrnX'"*ɍ>\ Bf-1Hp;{M:{eK$ndXF6Bوd`cnu9hAjn38EH衇<Fh _$ H]H̄#|0?d#Tw/7o̔e2q7ěq 4坙fU ca 8M"!d[t CQ,iͨXUh$._^,/,$\(YB39p Dh$ r4@D#xHT>o3c:}07DJw2.L,QWtZڌ2tk[py$./QwA?@TdDa"L Q R .rf+-?hʇaCDbc:CNtXS1Cm;ׄ_Y,k5 :]h.( *<%Q 30Z|, f(\ ï@P fd zyczȦ[=G6$UШ,z8>kBׄͅY,Q3%jfhB թF$g^Q@/hFM>B.iG+oQ.;_5sjppFFڈch$tkctPP0᳕L{/ut2ea:;m8ے:۲Xbke,ƶ,A ,e좄LWΓaF~`4~C_9RaHDF2R"h$/qb=? e׏0 g9)ND#1zO8\5c &tW,I֝ ɳb,A4 %bhkmY,aF,MՊIEi@"-Utc%3~ˡx3zKwӲowz"B1苫肫 2|qU\(p3vF/?}ޘ^y P+EиM^45Lg~@0Tc7WHdɜmMdΪ(Tg,v6Q0=@3S>|3":{^4Ϸ/l4AFuj?5˾v!ˆlϡGRQޝp4q?/PuPX%W}q.yը FNΤk2?{T~USe)tȦ|X#}VFyLIS2ZyL!d 2c?ߥCeW^ S; |.zUǹl:7FѨqlQk5~dCCU0vyu\icnIIEjZUpF#>.j8cs=? ^G7?^c;lQ}㥤0NCt\(˺!  ZdfeP^`F#ܠ>ܿ?]|[Y "w'cTz{~; yagѧU5BBΪ`XkaN5҇0_C} ChPM6sZbɃ?xuB|\^ŋczc:6M8N˚m4H.ߌOټ8l|# qH?iIǔ*EBJ:!ߞ4CyL)khJ2V h$΂"K\zHvLv7d$61miIIųl5LLZ&)-hL~D"ė>E*x-$L+m2iɗQqeTzB;pr W}1M&ӐL4Hj,຾ ꎬ{3H렑 IŠQ-h H=aJhZ*&]$`~%\&@r&'9Qͭq8yR8p]Ւ)K9~5AM=cJdv$ ~i'ēZTfUܬM_T^si, 0hJr())@Oh#]JRUwiy+*ڦUTU./FRQR[R U˦F",gFފå5W2(Jy\+4*:9KP,Wh$%EJ*/*>#5QXDIh$YFongk}}=ߔn'/OY9I65DVCl5ĉh)ĞbK#H#qB#Iꅶʏ@)?il©^Z(ZN?H衠ʗ j !S'T4,x馕[EsZ)̺,VOU$6jh$Q~s"I8I8 &R6䷞>{E[k2 gMFFd};Obm9I%0ѭk+/TW^. H+bW]ExV\h?T\1T\X()r"_po+> ˯jUPR]P]+h+LS`t[=J@W_V.-g.EzjO=%p+R_QN/Mr,څYYUR g})LJ,+@kq[Q N13-&wG^o|$PVbbK,)i"](6<,dI֑TbgO?U\T8G-KH-KH*nq@/J .%]<)[Ugpx`LY}hs;iRL$MYHuK { X|JÈMq)_2I u+8T9ORKbn`VAꭜ\5l6]bVLR-$^8KjRwqMU4ރ##|]03aYYA$DB/-'=@5w~ =>Σ4avu$e)G6Rr0OC|LbN쭠$ x5QpzQeYc%dkG2zOH1KHq0VTjQiVuјIb$F?\ğ|e-zyi%jOcH be)݊s?fβͲlZ6 e!KJ6ַqzNn_Іw~2%w,K^Vh$FҴ׮&"wQ/~7÷yHI`jj2t'];ʷoap9 _\Ub7..tXحn>' m[NN6CӶHM{S΍cZ&\䖴h$FRp黂ŕ$X}qyweMNQLL[ a݆Fmpn#6 9REN(Imo,H-[V0ͦ$C :."K Y&]塚"C Jܺ$Yyg\ߗe+o nϪ+iV]V9&tҊVJ+iEJVWZ qB^4_5Yckb ؼ<|zLMLU^+lKeTUK2,c6FsF+]76EϭmH2$cҝukaR R )o_u4-[)[ҠdLyGR/q,iʡ#5I(i)ZġdY$ V3 z`Aal)rcY9d̕rO(D9H(,O^x 2zGBz҇XeMe%[@SYXķ">[) ,V}HCXLX7$Zڈ{ioT^dw'`70BwHT0#yDP$tDIҮ$& qE?Xxpq% eD2FX+ y#1qe4)?"4:01Ё>y#r=Ęzn sWKH] Q-_9q$5\ k۰''ʓپv(| lah؃* &41lN4F 0A=D9i({exޗм<4kiDf&mpM_ߴM&`aM6`>5SajRK$ jNoMlOmL}S:PC&/\3ЧxXuO_gqBi]x&+g{^6೪i4g|O{4H;9A0k;v i9o;f㘘fv&9.FyGc%Zc<%]xw5[L2 Ҕ*IWLs3}nghFhdVɼiI;L/of'iLF鹉IiDF RXCOC1lcGZd4}_8Mkԟֿhcj%{D65#sҼKXp/b\cOFLLCǓ|u/_I+yEk7l&פb`Zmen & b6nبMhk,+n&I?H_ P<m(jR)ƈ9sTFF)2W]TpNOfGG>OIMIR>OYBi`52<2)W">W j֨DԄ~#yaNjyo҄՛0M7aRބz.O].+.ORH5p5oտ&Fa`/BQ#eZx=X]Yv?nğ>w[?tWF~nqn?fԢ]ѾynÆuyn~oy#mny}/[X_{?mVx=]]Ϗ?/_ǟ˟ǿ?n{[:\nᵨMQ}x>o]xz:vЫ/ FoBxox͓u:.^/,V,yN|XxlKXxlK/=szZ~-x}{2||=ɽTy5kR,V+<8:CŎ 8e}c@6FaLPB> 0J~H|;,qiNnQxǛ8_n^ݡu~ x6z?ғIt ڭ@]P@Ur϶ݣS5'_Mm׺H L\\HTJ(ry n'-\OZxM.x[1Z~կ_!XzrX/.?<]-\]5ƕrabFmu$vBϧW{"/76Z\6ڟv{_^>5k|5րpe[S7WoQ҆wz VXre踽;, z]93]|wyԌqkqA6>|$4 R;mԠ`tMt ϰai'n81w1..J͛.:a>\5o^5/v]7/zK=i֫9bLs Y@ѶCO?5J1w=ﷷ_ڥM}yEƭNNLݩRkC6a{q]oo(V/~gd4yռ0,dgjIqjPs4B繲emں>(NkwZ5'_^wu:^c!z:T=@y`'$kX$4j={{ZGƽz, *{>^罳ݫ_xL k?׆@N<0yiw{\^ sPP Y6τq].oƫ.?DfCfC͇^VJ=ݿ|sj13 S}xގ2u_cDPoSvZomFyp̽;qSaqr>Hju#7z~q_|&mfڴр6mllX`3q=Zy6m߱Ł4q ~ڵ ({&}ϱ^zN ?46^o{# ɫsy#jf8\-F۸n`|m\Dwl\1x;޽.?Ym.?xnG#577FA78,ϯ0178.5{&zCj` haf@k K# 6xv>'G#5;ktIi$l‘'摀<@[l川FBty8ܾHӪqh|EG,\NW\ ) X" DKS&m7yxe)^(vSk@=pY@y y:x\Yڻ.;D(:wu0GA#0y^niV4bH$\#fZؓC=& z& mC4Dh#*z}4ZD3}AyG:^Yw]89n >z ~??{y+6n_ָ]x i_7KHw5G-Mm/> jpj@[Ӏζ]Ol,PybĎ kJٷik@rC e<4z:.OhbE8j_WF0zX -(!ac4~ RDKB ]> wDE -k))4HwŌF>:<4*.4z5=:aH55 qe zjc!5M|Qc`^n . CNbK~ɏtpv xF_IxN?#CgD,1=#ƕ30s-.VDy.dfD2&;:\aV5HC#|M.\V*U-1ycxK5m2d|BeyboY6:|}7t3/vy!qy\S>H-1ʙjQtF6ؼ22,ݨYFYQ4#pToABiUoQO?cҕ#zmyi>Gwsd#SÌxalyt9gЁ;iT e68M* 1DU=) <:Hg+\K.LQT9S  g.UKa$,SG$J{3ʀ* E[6yJ<ĥ rrT|#.-~QU"Q|wR:_-g'.? ɵ?WѲO:д'"Za=D+\vY"!ZiF߀# SHPB#ZlWʇnT0w!ĝr1B*!α!:_Z1os"-&@IB,S ,#x&qyB1=N3Y3Yp7x 3I7Xˎ>LPc*r2ʧlў-432ʡDz]DrQ )>.7s1h`8xܝ^ߓj㥥Fg% =R\C >@m:hgʈKD%ܞPQˊ:ty@&F 4T3ϋ)DW])_CeT37tʙ: &.`y0p%ʡ̕6T,lx H AFLaH(Rh0q\VeDgy:@CFfKz:d 0//y Gi;t1G#74Mr7GTݞ :h$ꠑ@Cp)'fʀgeXx@b#4 ڔ4Dq~ *!>IDA8CJ^<_< 3fNJF PS=FLy"K|&K9ȒaLrL]1zAGԋGyt|̣81!:e`/y0#!L\)WҰ?iЩHЩVAĠ)#Ъf  #kiT5=0D 4121gZu[AA<#d9E-opHgo1r4_6C ΧS81^aF8#dE>zT!OQw)PQ5^p/(QQ?T%b[Fx2^!n !YB#砶UgJS0@F s'jӑ#=/x yz_"c./qOUs\0g4GwU Z1 crGx@YxMaN(86r}UsoSN4 46FwBwoL@OIzBGUG_9w`Zcpzct|Z]']0d"OPC0X=)3n1WnQ&ecW]H$o_)}GG^/J@7K&?Y~'BةL)pЁ~qS)W)- C?yIxys8^޾}<N_'Lx,5rXSdBb<>2O `+#|aF0~0Dfex,#O;İrNb92iE[1c{z};fCFF =`4Jc,г(l?@­C`99c:EEBp-GG<#c 0IMxbG->jkk8NTTOVa>COQFBQ9YWuz<'6efOЄF=X F߬ZOгmC,aEϴymǀhD `ڸ$۸3zZ3"*3^4QYF3Rbo),}la X8 m/ ЫiNQB%$Zh?.-0m piq(Z //CsWk0Ϧ ;: ~>.!wa Q5 :ci%0v;vpG" .*˜46 cD~f06TzFx`ac @@0(FL;-s(6uQ3|̨ +ڂaU=Rj1^^ݎ^m ¿0BK,qqV%xuPf(^ÿZzM ^蹅A(Y(9P8U "j^5-JGl(-@b!؛38/\NR\C Puʰh8d< 10\f2.+&C&hSFqFz;p랂Y,A<%o֟  "!q4h=9vIܦh$,9uJnylY}:[?t.o35߲E?rg*bj8~uڤFBi.1j=Z=s5mIJϯuY~JCihD^,BIyBIyU{2 YN X::*1'eLSRB3hՅTMbFúM:AucBu2:<DŽ|Bx3,;Njw/_;s<9Fb88З|_lbAl|/^^a7|/&#N7W=GL]X$|F'1b9@FDe4:|q%x:|6{ }}nHM6Y<18?81`䢑 Z++FPkkD\܉KFlśm˯3':ykhMVa\ZΒ7^ ^ߐ3eܻuj>F1#O@\7 Xc>5SB"7.+r'W ] azH">Mg;vE<{=)ӖLt4ѫe˘O&v>nBz22#|Ϸ]ܼΧ`]"ܺY r8/*!@ЧkZdR"r{*fn]KV+HdAJA,',ϗj"@#WUNYwڗ›Q'uK2MvŸnLyF` yLH'#mw0Z>ڝ!l7HpF%^ aCtb;<6鄯鐌vܞ^3٫%P镸q:q{y{.p'uAVxCFJ)M(- TuuM"$(WVb # P s5Wl#KJ#OJ* A(q+;).*\DPII`%Ip$A$<$I]Z4|Fo(g$RO]:xZ]TCX#H`KܤYIת tu!ǔ.dȚSjC,IY`%q-Kpyɒ-,,|,E@{;+y;owZׄ1x/*C&R&%EM/xN I IYuToUGWE{^/oeY8YxMNKİIe{@,UxZ$E;HsHœHzhc4, ^"[}5uP5 t8#HЎh-?xV_<0B,cX&CWFXERCd%pYdt5KK Y砑$ Խ+4jb%m`eMHN5kXAWCݳrajȈ_MİQ,a ^3o"sfa&OĥW~x1[O~5 ;Зk8Ir W)^~I{߮DUj&HINJM65C0壐)a5SL)j3aaM<x1d ʚ(RBt$%ب #^ #6jZ(AEOE"^K ݮ9(hj x䑢奨pyzOnY+ߎtnG2+ގdVe+OJk9}FV@2*ie.۔:Kr]0 )+:zV[j j*]UA-*CRK )4xZ/J8HFJLH@~I->[>j] *]Aڲ*)Ǵ֊cZB#i<JCr} 6&q(s9d*7xy< <<0 ()w]]\(gm)/OL%_PV5o2lW߲t u`yBJCt}4?"Uԓ]+,$d2һKBf IBVQ֖pFm%!%!SJtk-H()+ŸV+E4RlgXF]Mb ɧQrҔQ$IʹBQPJT)]R&LL ne(};_m'1D8@+JZs((aQK%%HTVIRґ~u@꒪*=ʹee-.*22WJ2.$ud.#eeT%Ee5%$4r1=aEaRfkŨI$Ĵ-,ӢY8%&ږd#H69.*O7qT}oU NVh#Fב".Z1OLb=7H̓t\m$: H:0.sHz$}0MN؏T U2_uoY$)oK8,4b9"n !TWRq5'.XY,tteiei e$_DfHY&ʸqYqf$I-a2.f˸t֜yRYҦX涾//`onCFh+{O\Yb,&&FVJIKu`XF'l'%\~%-x- mj[ږCXR撶4$miHҢPau[OD*WWp5t`Mp V4>]tkIӅ3ҨL4f9Z/ߚ>GII*e!E\ʽ.IeJ$,wh"ȤN?$.Hs@eKא谅e^5]c;ڱ]t}6 sq ;4##74d+鷸,:tHq̥]15]I.]%-xupkLH㢂XguF|yLi *eEt|po;>Vz?p?Mt>=)7@o=ۂ=<Pe}k:%*OQԤΛ\Ab qL;|1kESjkPOˠ+#Ю2m\c29+0țyѓ>3uxBqG8T(5s(#X2cVˑjڹ#>Av>f>cBq҅eꢍ]0|uqyAldRcߨh'Sjө HA#a 1}mB7Qpy$ ./lKFӄ*eT qL\^Uňx t&I/X4KP|'mEY΢er ' 8AOU %H)G^PK\3g9gG1sB;t팘ZNHŝ<`wAtwHI1c&p39n4G#ME/Dє_xM^Vbg41}n܏g tƞzO2?hGeħePѬl x b 37'tNgNck#kzk47<8ev "NQh=&F#!") fi@YqD1;1wTD h0! ӌ:D5 A>5_ܬ@6AxDai8А\oQpO `f>->ΒǤ4HS}"5ϱH4<>Op~lեFdOh:Fr0=5s$P}lG⹝M6[o_Fe5a1фMO̻<#x[xMU]] L0o0'ͺ,) W0^@1:JOè"x2xs4D# pai"i4fۆA6V^ajÌ<بUfWU.Gcژʊ1*rU9oUamLmc ˦%ݐ6VN_ߡ>^DG=̢3x? Yykܳz-:9-֊Wp~ou۫hv t`O<MKF d{_6O[5~v׳??_s;oe(۵߮~y߾|y#^G[uNE_ЯuO}aw_sw9^O|ߪi=_$ǟ˟ǿ?n{V+Q|~?_ZnzyGIϏHm;m{w/x:sE|Klc\O#vowKB*xMkx82gx>}r=~{pkr{QYB%F~Ǜ,8ܼ;Rlr(^~hCvP`h lQ 3 =MbS]$49U\ZF:U0DaO.||=x^;,=By19_ƠƀC$hK˰.7ϯ六yE^ʶ\? ^ogs?ȴݹ|9v9rcv8.y>xgIҺ`Yؓzt0qTw\8]hߧ.{|0xA#5"!6^S MKO=wOM{VS}q==@Q_tyuTQ^/ 9 h[iTdw|>V`E']t+"",>_pUuQEy|Q|] W}z`|>Ђ8d&QCӤNanHP-6ڒmY SWusq{疍3TV3TV O?ޅ\oI{EBsA4ܩxۜݧ6'AZ|@869[;zpvntqZ\\۸Aq9ژVҢOVGu9.w[|ݽFfO8gmFѼ1QwEyS VsE޸~y9 79: 3WkY+O79AMF٨+D#u"N$#F38kZ{i]FNOWU'Q뾼^rԑ?ڴ,9 Oղۇ!{5a<{c򣪹ۣx&vs{vct\~鸪:=/\kt\τ=Pmi@~ WWrzi Z ,ty, z ۊFnE">O ˏR#A5ȠuiTwI4)nm1{ҤŤ4I9`yRV<6F50{4Rcy}}7n-_C=a/xqnMz|cR}O=G &A5\U CXd/Ia5?.9F9L@ τx' pr}`|x\^͍?}j]=]w:m]ހ[:|+=fN@Dϝj>JQ=w Ma?ngQO-%2xWjr$3mQ L6UݙnKyq -җ=oNr{c43M^qyu.AbRIFϭT{pzoqȓ @h45os"AՓ47}j,j4RWoVոpyL;mɝˏ:MM'.n.@MuQߢZZ[;0n˸nU fu:ks)<)NMYFmL {Q]Lij21d%5D#wv-Ν5v͞b:֟}3zՅ6yc*s5ygmFg5UC'5m^\9o5w~ݼT/5^(~~G`3`5Ud4VwѢqyu4.?h\V]n:= CM{uKUyo{IMz7750Xzj,Z}UW+ICh$zѼzGCTՍ{(G逞)bjtFGGǢ3!| |~]^g DJDqh2d5\pU\H^6Pg!]NnGӥJ|.I6ncrfo[ I;FK65e>iik3i2$É5y5ςh0nSLhCpqɘӬRFHԃ0߳#.q$.)g19Ҡ\tgyvjxR=1V>|ۻ86^zĺY^áҔC)jS>զ|MjS,pNN9҆:{PA6ةzNXf v6j3[lem=ߍhh5`.D:uY.Vlhޟx '\ߝNFo3)'Ȳ)(ka(k"]E 8WV7 qNj|dp'$P=[a ko#[gﯸ ;f4 pX-ZFqŪnp~~7Pm37ssw{' x6E\AbrhWTH3[^;^N[Pn~5i0IKy>Cqh1Z@!W^]rX][k#3%dE!F6!H0D#oľlfb,Ŀ,K1˲{He6q!=A(ZG s yyBz"bpGFF\Ëf>A<),:ZG&Ndx=ܨ&^d Dh&[6Wm}D d dh#E0٢uY,.*Q+6A7@=W]#yH:e m}M?]Dbc^=1)8ґ2ˋ#&Fb"-#v)ߝx_^B"،$, %aqq7z8z8RYBk_Xĵn1%%e^F%7/Ma^Fk`^4GX ;\"z X`V#2iqu<10aS8cIE22HN/Aq~-,MΉCRp25tDMِqe ()H\3WlFUO\q I DQX{ y(A6P&~Ϟxmo?ÔmnFaBdG,̒%))s(sco@ww+"xmp08N|G,B~IEU6:噈+6<ˡҼi5G2TyLі6F+.Gd5V͌txS(O'' Q3$BEΨy<䌒2J v'96nN6`N'/`4D)xvsqB,&$FE2GԕgT9jq xz"kdEϻK55ORD܈&⚏K;ܭW񶺁۸†0MtVkgd e晊Y<E#6YH$/3n8$ ݐȎ-(b6"!=OYX,YDd=΍lԀg߀WXDOlDnhY :\nlC񬼩1a[EiXqlWO*uUE+LJbFY[|'exu8C5a^s8s499 mh$Ur.Z^i4w m*4-m&O\ckpIa7x=>iwnd k <:U9YA\r+4&֤o+"Y0:aV$^ALqtko0px $4VFPjP^K4)͸Ly2px VpLzA) 0ELh$5C] ShQExF 4x?2&^W=ӂ+)^ׄW9Č ldC5~7Mj :yd<5CP̤[yn9e a46" J4gJKbt __0a0ʠ>i^EzBY̶xmYbvCzXjC <;pxs͕.Hc]8V aX`FSL*">B8 TdQy<1<&x-AT.8T>Q59T`™=P<t؍n*ԧ* TEg85\xwyE(Bϻk"p0p!2!̥L )!U\QQr/H)H;ӴVh$0Ugk&,QOyә?-C@4=3ܦ#Pьr ̙ 34{2 oOZ(('gOq8($=HR7^h9JstX|A#%:}NS,`PP,BMrrFTFUhТQieI"u>CmGRM<"50m{ChhaR'MlbLS!albq % 0Zs%c6Tٰ D e9|iI2 (H@6Q;]&lѦrhuso=FQ.8;G$ZGу+N_ξu},yq­|\ʁ%*=trfݰPޠB9/X\7k+pTk+3idr\bI xu; ;S%ʑ@z/XTuVTJ"ϻ` rraT'4H,9WJUպQ8 !X'#tܾ*G0@>X}ЁH= ^&u^N7~،c" Dx tLJ (oZ /Q^<\-F(Wΰ1y聴V":4"R(Yy)dj?`OD &&|9 Q2FȈgo#X@)MyTa$ޡfK<]2OHՆj#|͘r4Ch-p;%+ƅʫv%etA}/\CFCgO]sx3<Ƶz|2]9aWk<5V,a$*@dEr"UhFaTUggR!-Z^ D6&R|M&^4<`|\}qieDX"xuÊ-`4>B}tR!npTАRPB`zT0=y%%处HRJ=sqYS^9:B)xpwrAv TM@t $, ^uޖMtxN30Ц(9u`!.XeШ! mF"#+.ËZ8Z1Vy0ܼzBX}bX9UavC]yܽhxճhc^]ezƠB#)nq&.rfsU24ZSd|D,*etj3]o'BδGd8X Ry)qxVV-QF36ʙeɋ' h722UALCd*ON`Q40q>AGO>1FBL0U!LaD F&xFOl8F7HaYzٽbu8'&E4 6;㒌̼"/&4̶tA6r\sa29xlX!G9p&\ZrSXr<@أL_g&Js`#PV]OcȪ6hP1?\ 8^b_X{&^b䵁Ư,^Vphje4jhVbS\I =Y9bVJ$4zi(CzoǼ jW9sB+i8TNV*C*/)FwzR C#0fYf7%+kB}w 6#Z L`WVyN$o؈淊"aq0Z */h4ZM#T9e5p+(U5pTq!ؔ z-'LH@BgU7pTÊhh$~VV!xcFCC{y;_ڄ5w\۽\*^^7C`48\q6+p3\Wp8{s4^@N4&1'xԆDttGh$ ƫa4V61G}_v]EC@D#A=HTҌV.Vަ5,e&٤>Po_'/+z=:Hkx/]9 *ų1Vc 191sDLt{&YOL]mYMQO41i/e32f~Vk R4K`sRPB+ZGD43-'Ɓ6ڰK6D'^סP`N`krau~} g,XF.F<ziަ,h$WOn17r4Ffub&*n qU`iybiJPOI~&m[-I+;3r'lx@|Mu9[ߐ2hG'#o\'t.O)P'vPW2 `4D0* nL+scscqf\GOaaDܮC P;!رbx91<pq;OJ J ǟc+b:N& bO@8yD2d x?l4Gmi&zeW"~Bs6"3&6 w 5t5q@;(hGQN:ؐ6{!.ᚆR ‰ 4B qi:A}zh? 7@p*0Q&/z2'^,:C6.GjDVcb5?u>1=8!:vx<6ZZiyrB9TCC|uqM8GJ`ܗ'$8jZG X +k2zVM6R h$QF]LrܸROfxMzX=wANR Rdd%tR8TUAV@u-y4O)_'#s80lqӯϧ'SyHNQE01'`x`uZBB+'rd}W KHa| gOrڸ30&Ϳ,TAZ ~ ~(0 ~}/ c!@yXk`P\'"PO)xI#ITAz^u^(D2\,˃ζ*ĥyHT*5%B9BJjePG eӞ8]9PR+lxxaObcq/2ၶ@ǡ(*'1x_ =~/\蹖8/pСQ/H:! ]R; JJ V&5U7oL 8-+ ⡺MpTi6P/EDŠI`uP_#RmQQZIuumuV8.q쇯HlS֪F]UѠk!+lIE6RQi, KOŁJdU5?)4V1EWHB,XuZő$F%ZQ-\W⒖i%fh!:.H.HZ]TW ;jp)wombsShlt3ڐ"76 Hrx[N ug!p7^M$&IM&&{NW⦸&_`T 5H>g"}h M|qD:MriR3nZ+uZ u[yښ.+YCd&>?n N({SOI&pj&uhjCcJ irnuKYQoduˍ&C? i(!붕WWl5lQuI5O1' $F]%wGʕ g!Ɇ>A*VU-/4]yuM&!$󷦋oGaqWGGm:mdC42L+dKTXVayRaIZX< IQe-H Hb+.VJ.]YٛJB]qIƃ^\;_2QkdcQMI[%Ē8=NAs pi(Iwh$)W-uЍGRvIƕ+k!JQSlY7VOUҶXC# x[".]QCݖqXI,!鵄zld%ɆCK$I~Mc>dh)24j ,lm-aOznac& 1 1p1'j'jٖǔl[yn64l˳l:K3ѥkd?t֥8LJ 0OtxfA ~awǞW[9[ȕlUGs+!QWC h /޷zt$3ԣ-HR//U7iLbIMen˼(u2/u-u} AX®0t5Mߺ/Z X Fm qu]CEteR2im ]FʨWpDKs#5WF.'zD#Gat)ILC$H:!Eؔ]RhtuYw*W yv6Gj±H\ GZH G4pOc\<%rP ('^ wzXg'qUjZPo d||-cjmDr)%?a =WjD-$Ն☖r٥ʈ:&0IH兕ttH*X򤛚C\؍n g#G5Kn|,EH+iWODZ/}"53+o}GZœKN}ug&m; #N*ʨa>9%5,탋o Α6~AO| ,y^,4 I`kKVJ$:0?FRItkm% xv%FR"h$%OIG#-yW!y^#qLklR ,Gkb9JW#8H=&ÙsJLC5Ѓcg:h$82ڿttXxC/xȓ5܋3O_%%C%VJT8tFb=밯;2׫61YaGe(!C4Ɠbl׷{#i3`OnŋYG&\QטHo1ri"Fʨ\t"Z,7r0q'v`E#aDT4EMo# #&kqw+&=`ϔe!DzFYrR# )K7X=ciV:&^0rn5]w/ƀ c7.'%V=>ٌ0 (uQnK&e쁣G?_6 S1qF hҨH7o;VOH4a}ڍM܀GqGat2HJ4hlhpG]!bi;2N AO:nƑ0owP;`ˀÀ6L{*%+hNA#%94yOzORBrBOv\P>  ,h$g&+lLj%x z1#||ߟ~s6N6OMнܺ'CndhQк'^ CB_zyV$rY;MdS^SGOTGϵo=QI=~Í{zyxv (9 oI8㨭sU/nw'h@ǑA nEW@28oڨߣpw==x֞<1vL:k8Vt?khM⏙ChQ;IhC3d3ӡ|h&sܟ{xF{gq;=3+C&^0Y;pO_n~~9(Z ·_|aix["/(3K|(ty_}{)"ǯE_~[}Yr5Ǎ?K%/pG>.v/:-þ/W_˷_~ZAZz{,qUV~I~;ur~yuoVxaѱA4u\+|煏-$'ïg&Od_ZxSxmxmL@".+{k_Uܟ_^7[/y'`9\VxMk;"Tm#ImnqCw_.0ϟبޢ6JW6=/\[IݶvE36g)qb>)E\1 ">g ,̷ÁEC' X6w&N a('ie}E“eD+P]|HhD:%9R8G<0gwx9^+sx nM6]1pG &1艗1+FXNQk`4jTx:^qt`ln{m hvDǎlt(ѵS/(]ֱ+fHD+^&A(O[Z.@r|:u(i :~dӷm||Ҭovq;{uirhHS9# tmNuЁ9OgsׇJh{oN6:i9|Gur:^v ]&mommt1|8SF:8;q_O.:<_b:4L魗Qg=VNk1V;CC;<|;v?W;}y_{S*<\ 5x~h}r[#(lMn}^pTlO_sJz?9yL O]GtHzeM>CnJ̧t1F N$Qz::vU72W8脃D'~t鸣皼:8}}X-#_'IQaQ/窓'\۱/'c_=BG}_qʫx᫣dttH'S܃:Ov5rt؍N9zܝv䩐>P:yr4#dӺd3,ކLdwS>ժ1 n“C;$t'esN)ܝj0s Vm#L#o3Kcҍj.:, k1QV lub;v:LD4:jZU(AS ^'TG{@:Íj0R䘆N;bx7&thvOO&T<+ň7':0Z4jmt>Hgt&a񋷅$3W݇o1O^wHCS1orrL  ೼qt9INގ1Me(aV>є};u뜓:f6d?jF@6Oُ}KI/W&/,ރn{q|tQۡfv94܎5'ihZJ'9C:D#ώruap~/uw+bAm|sGY#&MjWklh.1<[w8Iw}9v35m֪zt'^"!N0?7#~WF}:hӏFcOPRkr@ /PzF N|xr  0 d M^dt{8_7 z"Tk18ur:j"y:,n 5zy6n(T#4j";n8+y"ZkCd`Bh0!!ph5Q(!hx74RI@OzpljC-Q'@;tp)WSDžQ+vnew~92z (ޠ2;J6y,!׆Xy~g:9NyLu'Z.7"4jS5"tk'j@?k1F9s7h.Ǘu-?4r݉&^Rz q$&Ɠ%^g(zy#81Jm<ez:6j+°j%Fw绕`"7v[Jp>ܶ=6϶So6d^7ZM;MRw(=5(=*ZN B6j-6Bs9n$qhN0[ %:Bo/j\(O/vM6kCM4Խ ԿhLP?ab\QݺweV^w*+.GuGS[OC/La(pX0Z-=z\NMl~ף}x翔Сv/Ӝw6*Ff63&y4ViϒFl}j-ZKo´n[G :*mP婩bHyZكngp밟.Ou|~y'gWn|K {_/FYE 2kPLg#P@F ʎ F()1u1pX!vtWG#uy]2tc Tw{~t8u{\Lzw{ve;6 ـ W;xkht<-df$ `j- 3Q',Ce%ULxoqBM@C^"Qp'0,uL5C#*NڬŪx Zy^VRcd}^wu;^6zc`IhYBBNC }Uͼ(!3/K6bk|.1󲊉y4)!6H)ޡw0rw<;UC#qF#g o8u[O7'*!<_ ~-u'o0HtA[W^t# $/N60!0`HC}\>Z2FU4p"[TE.KHb u5ދx#+dwhDFLHd-DK4DKJȴĄEc<n*gNX'fh|VZ_cۦ9B)#j5JYHJM6=B5Bx(WD2/ I\viw?_6 h qdoezsGqsHC#/7_\3=W(E0`!A y<12.x Q$bh$Fb@7Pi5aJ3Lq]rj=C]avƋeV1iPmMډYdܿL$z<=W7a"Gt퉏P e\r>s#L b6:fBr> y<1QȞ@EZ4T~ JLHpQm̫( 5'n@ Cڤa9sQ0ba aȅOdzCbpuʋ8U?! ^g'5Nb ɕ'ĠXkX 0&NY,z% dd&3k4\o.cy,1h4B3BX*m@#ߍ y 8H [2Ym_&%%m(`Lc(S\:Г1;s4ǎz:\hW%D|yrB#:uyq29 +zO;'e0&e52&ɉy(1^+ӱᘇst<:HpD#\ Zlxybd:zM$M 8U70z+ێ$Q2(-2g" 9$cdĥfjY"gV1f4#!F:aD\zQtffu&hJ 6>/AFbð6# +<!=yi}B:ݟcݍ0Wt5hW9g GHDTM@*o&DB#A |ǼAxRyRJ*Ȃ:\a $v$V@a1 <;p a) O* Kq>c>"Eh/y 9yjōGȉ1z[*+` 9hCCBDTgX \|xc +D\g'OAAh 8]9y"Et):MB .BF& HE@oRLNɄx 9'&1 a1|cxDcQMz""Q=^MrSڮL"beQm om;E4~vy?(ylJ`t{-NXdb2&ilHg { 1iLJX< NO ,'$9R\OSfanИWhPQGA aJV5 Q;衱ޗezZ ?Y9Q3 8J8iV2poieLLC9FmFͿ\}YM LmЦ}i}^-~_z , Y4޻и@&Hd^X :VF{nڝ &x8*ܻӉ7˵ yr(>eql30QpDSq=O@0' T)/3qy44RNx! pSJp[ā//kfß}HA5]@|&bP:&4F܁tH *8U*9zg аwX)'bТ lLz"GuEMC@# o7)-0uĄzbB=[1ՌH' HXy~1;HHOcm(C$ dO?1{JH h$ P10!pkS{hҘ h$`:h@#4R/\ӠC4Y~vh<~{>mtn|\yR/Rg%goh~1(OGJ%(D\C PEJ2@h͌twx7Os8Q\R!}9ëz C%3t4sy@;w۵<9󝙆.pN:Nb( 퇯vao~b2z"xv$,C_{O ;^WppE#^ nNrr&-\0zg:}LTͫ*bB.Icpx~>;׭/h#"0-O~PW^F#8 ^/T7*C7bC: ~Rkd™||bn1TG.:#P r!Tk9G]HtMS(2e YXV4j,sTjzh;\WLLp%#5ހt^ηF뷭Ob`tNhX8=\Mു%zÂ7߬^m.s>_3q!1x<Q,ix DTGNbNstѼA4Oi:ӅXOO@g}hK/[nj}t%O:Ry<ژ&1-&ӹE@^IׅYْ$!0MˀI ȣ5erQӔ8mDkb![ 8$ R dH&h4iPAKS KvwֻɁrM `8:: 96*|z~p4MkŜnj%l@˛A\-u[3'^<6, z4'7%- t\co0px3_SG|Qr:b::qV,Z!rXx8::-cf'b aF}^ar(8Mb0W~}J|<.-^We^]-LP  0z@hS -kr 'MAX&"HW*g]5C8tEu0]K఻I>Q X)TK BHۤR y>R |( 4 HMW 5d3\HS8IAH?gKB, :g 1zP%I1DYK1L6BI-dX+WHoH Wq-Hb ^bG.5#U U TB1B=ԦKt;vP8tUFRz7\=Yj&_G a3HaW:*K$r\H0w9׍|%եu 1z&YRY, 2JyRyL)zV + \PDɋ"%5W=GD()NtHӐJAEu,N곐RH 8X tROW)8)|*+=ѵKy-$]p+ddRJqwV&q-QtyǓei*=JgӵU1%w%'V FQk$VrQHmۥQ,hF 4¡H's>{d%D Y Mn AλkN gCrm;uE6SQRSQRWQ$ m E&ms"(\JaDKu}#ɢm.(ɝhfR:YA:Oy|(eHPCSZ"V.m,mKP"@zg۾)BjNFR>@:,C"hi zQ64tMsh`xWENI'9/t7$=3!A }p=xHo'Mn}>a>M }M Mr CsIw[FI&>SD&MEMgҹ驉@P}&MfW$КT&H*fV嵓²HOMr|Vo*M[OJkM^}bM_MTz4&&)t覣2IYe,5B V8y_1KGyz-{-N `M ѫ,!hw4$x*IEEIe$i}VFѝ1*/\ /^ZVx8@Ha:uthͬhHaon&!ߥYKҥ۪kduWk]šYrdT!xY泑*=`U¤vUBE`4 hY,ho|yt\t`P6褦!I(bIqiCJ4PI7r44%Ӏ֍Fzl$wf|/.d 9>XMS{|~7W G+5+a(ks,/]9HmwG6y2 Qv0%HmW~ y`$u64$ ,AL-,Lb,Xu ]]u^CFz !-xMҢVcy(ɱr(I1tX?0'c?okD$V:Z4R¬Vdq٭(! z>j1jPM*g+Y]7*U-AWc4$0꬜TYVHل;BGR i&^ڧ,Aɷ]M%Ee(I7Ԣ.U-պ.mwY<;yrL7VWt{YM`vqdkrD# ?}8ZHXa:zh$}2|Ù ~OfgYFRph\yBVp8D;RW},!sҮڮ?΃BuikrҒx8dI˺&zqL=X,77zSMM&^X{wYBw4]"KTA{]]]KZ/X w~WW)xM9Di*liqd* ɓ[τ|&#MI1=׺I1d9a^ %wQ,FddaWjZE)OLGb>؄eG?{MSjJDI:d,|iW:D#twgoIY2"dxSb JX mmk,!x,p*W6-)5Y1#)X[k=,k-xuF[h$]FPh$F'h =Mj<CsN@b $"ZAK"J,K8P,K ],HKh$}DX;{jr)z ɨ2*ݣ]Fͥk+ $jt'진y4HT k0$gXw7]}ގwo&V^u51q,xuF?[^Y',K ʤ**eROC2G2aaLؒ)h$B otReJ]@ 2a).Fҳ#݁FI+OӅ@<_vhSR!"̇g8+/:o=iT8iC*dX5y9',c(-Mwy j(㘊f_"1 kq`4N`ܶ4 F.zi3iveh,_g}!Ǡ;ā/-qƴ i8pWuc-tooZ9fhPaM2)ť4,2:~_\E"@a Ц lL$ H GHh4'T]S*멂eYxM ̜ƿQ$,"KH 4Hd#F:Jp@#!O^xXy|@ಆBb)Tg㣜RO@$)I`;J,b  &uqyRݷ((59QrI?KNNd)Y =+iB@KT/={?z$lPD QMǴtD<bIbC:0* F 4K527ʋj@젨25"A?FZk_'a>Y,FIGOzWӏrӏrGu[ P"ʳFt!\mDxMLPFCŊw_x;_O_/r|p*lC2rQ|?_9/dk=Ӓ׽ ߾m|;nR=;Ok}uMEIB6벾G!n=cw\0s9w@z.â/FM̱rzv|:vz;z:|Nmx"ys>lN#r:]^Nxty}ڨv(C+ƛ{_K|O,VV_ZjVYtQ^5i9~ˑYiҿYovjrgu9ך+/wٿ-}ҿY.˶jG}zٟ;r >lk_>_OO ^luYQ.^jwr,kNO_"^_/ow۷_돿?2m5ov <~saKoo ^~?ӟ^5۷?O}?_o׿iNo_t_ˏ?.6~˩9]|Lcqi/o7oo?['|3;|;ViU'Uo?6eҭ+۷~_ˏ׏_~xyyS;k uu1~ݢ ^ϻ˷~?]5__G6Vm|;>za?he^YV~2U;ʸ,7o\z=}nu%vendstream endobj 134 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 636 >> stream xM_HSqm׫m\r/wf05f(M%ꡬȒć f[tnv6 %,!CFJŹC:Oϗa<0 6=P1R f\< u[Z:!#DI4DGb"'dPɐܪm05"{YnX]a0k޳ Xz1$*-1?&dHyjP[SMфj6Nl4R]p4Pd@ 0NST@7pbhe?Fy&ջs\N7zɯN@s}4j/7@+9g &Ӄ2XڻiII)X0pg=5bcX;X|>z$ 0kA&YB-W2ob0]8Z]Вِn͚5 |<<|9:˟Ac $]A/np}M.\8yP8h^Zsh7a8v,Ku?1 #k QUݑ^6b!PUS+\u w&[>@y#z]XeIQ˶4W4ښC]Tgq\>endstream endobj 135 0 obj << /Filter /FlateDecode /Length 12615 >> stream x}Ke׹Z򦭺:|ƀhFjcȾu*ՙYj/|ʮVf0S `D0ގz꿧շW.r:F[%cMߧ^?\mAկw_])^c5믾ݵt?\\=>7_+м#ZuJ]_n|:>ݼqj;u/sIⱔCr%cεchח4_՟F?RAԑ*LeLUb=ÎLTDf%1W)Cf1ęH(.LDDSg"EfXґDLC>|+0ZQ4 (C5v 4rܰhmG'W MX?i55Vշo嶔>_\xm?1-^Vb±!NYovur3ʍ'ASgO-XY@ Crs=ZIunCʨa\qi-8T@7ZOOG?fOh61Bco0AQ!:,}p EtTZA;.>Š0.u<ӱ# ytf5Z9 ;Z!-E굑M$b[Y:@Cb8VPXvAʨa,h->(8t2M F J @}ElV}we LYP-qbyYf3eByonGO qZI F+dDA4`et5@ZԇQø0 ZXcs+˄HU*Uw ʨ܋ԫ12[Q!72̈́OVVo_7xT UbD}ƨR!m'D \1gV~?SY-2dz@#ԇQø0 ZX!c#),Ȋ $ʚrV#N{k8 ~ngέ+kT# ->>Na|[ 8xl!MN@QZ!Fkc+zZAqCLi-)3ka'h<@sQmLFq Ԃ 0N k՞Ao<ʡ^F  ٟ*yT4I§Gc?[Ei"@FN e-PyCqaƥ-"_PH;LD:($RN >K`%SP/-Jd=h5Ny12Yz6";M1rx桀oLqbG V>P >@oaF{RF (Kka '6i );rcP#E)RZC{]Rۊ<H ƨlѼ1*_):n<*X ?X@Hy.tcu!Uбzl-n" +jB'IBֻ"* wc8͖*  i$6plB&I|kBkDmᣆGe H1ҍ;$Ap[r@ Bصl"㱲=ɺ># +d :=̄75Dւ6LIP`̗rAÞ\ _  YM1 XғFTeH1bO18WP #msV5>Hf{m;8`%+adG$GF%AXWD};V0H$@∃ |Rd6*Z*OMVTEBoxi6 ˘3~"gi:{ BCu X%f>Pˠ!S&:̲9:rhG)(u0`__%uԮ= <ȍmh*+l#4ԩK]["[RiF\JEa!p/6 d2*D,F4H{qamil=W )6o c$$,Ў$tV!Lh$'8-LD3 4Iq:#Zd$jO $Xr@&$HbjN&чMI& ҇͌cA+!fB!rnBh}r\IH yE #7MaBpeV me(YO݄d-]K: ay奲 Ul`h+"4xB"ib WZe Yw!yId βdHH,&QY C+Y:ͼ[l,@fi7!X&W$B)+@H2"e"g2ߟH )uD:ʎ^N uAb3#tsFHt"U]G=4t?x;W9j\Yd7e& \W8Q;6dnPXvT<TT0cG&Ph"N*ډt/?m͛@4 T"m)~PIں2C# T7ީ&߸Q QNսjwT{S xN49ȱ;+t׳[3M•e mcWNO`謹|1LQ&xek(Bg it8>E0u|FU.%>ia(T^J/SpeGV@oHz2jFa,Z dXCKpLi2p[7C/<.(.@)k@[gתVطq BX.ط nG*+a#+ \zCe0JuLUZBhb2jFa\Z 8xlC"nɵ@p뀻~08uAjaނaAϖCʨa\E[[X!cM.+bk Fb<}:/)SQ>PR+( 2f\(ER[؍džKʗQ$QȄ )~4 ^NQH-XY-ԇQø0 ZXcXkQ }NÎR E5$uEi(76nԼQAƟ@FժtR`\@v+2wyw/2 kV +K\C;@zjSRF B)Im` .%a'^b83 VG{S4q}p C*_>|\tηǖCAˌ!Leq ^.Eo"5Nek T0d ,H ?:"ȕxXu:>C  Ie\BWֲ6 TֆWyցAٯƭU^т8W =d÷!73L}2^."=k+ч1.an<2+8_[W$F2 Urz V> XT8EP%-r):[uERA8>5<0+B/RU#bw խ,pEP r0N=H50u,>hˢqVzp8;uʁ\ 4얪8%ZMdӨ+,Hr$;!e_4CFQtEG9{}P]4HlIA.lB,4p F:7pıߒZc$a\H@CI0֠bPă']ʞt//Vc&kdB6}vub5e'Y`ޥ'R2#Ub 𯻠Fw-ǥpLv" lqiP]@**DPJm J[;F<.s?EAʑBrXܟ +tPfC`1i:)$By H堤cF+ѪiCHa+a撅ex 1$Wm"^1'7 pQoWxHq;Y""@&PRG,ԣ~µ;#! $(#OBiAAVGrYce!y2UHR"q%ޫMF8tIop %!䋽W>CƙWUrxi8$nZ45jR\CtKuf]I;dc0Ri"ǐz aCB1 M+P!ѰIR0cX=c1$ÐI%\+bJ\$ikjy5L,iq?-Yiӆݬv^7"ʂu mEOC۶ٖk@ lD kS({x({8IC|Dv[6!PwHXEK:ON]?Ah(|1rN迁qIcC$Uӎ a>Ȑ3dCfH;4$ yQd&BLF\}Ж >2QiDՑJ' ǕeE#V?El_K`?)b tNJDN\udeN}3ZԂN}VshAF\V}=t"5Yq~s?z!Y'n' I-XYgC}>jpaoma= c_ wO[N9L'⧳pP$)-XhAG=saƵ6 =8ZO{f$I=W2=gT pMDg8(zt eM{,J Ahs!Q~ /#;qڳhӞkP4-Xy kIH#>E|k 849p`7'iφH4I a!1.lDי" &eXDV|4ʜAfc`et5M8Ѻ"]94뙯rGJS0|DI~ve5'S)M"tV[5 Rĩ)sraƥCF'l#3f Ep0ʜ,H[;C7$2g> BV%YFRK˄k4 ^23_Z39 tPT-XYgAp9BC˧r?(:Ivl5%s sj#8CE' doFu+K\A_%>z2g>+ Fa,Z d`0l&3D.(|&ma8#5-xaw5|z/K\Aj)14Kރ9YX0΢&?Ir>cCqvr6ʚg р$ @\G>co=hYsLa,Z X7L鹚ak99,Ú(#l̚Q6?Z-Yҟ#<ڒϱӟ3{YjyVc -mdke?GDJ?Gμ<ʖL:oj`ђQ"'?g6ԕϐ798}56In=)ۜK&d ^ OpF:@V ?cQmr[7gO4,i2,bˀm#) QI|whB.g߳ɨĚ'KhN @uUs4ؑ7,lhfs 4uac@cWwYĸ,hm%cBD},G}̈c XD}̀D},HM|bFH@ԕmEZg p*ՌTy rF3 QyE8WzB"t%4m%@`]*@BлT9eB'ZZyUn8nST~E4єir F9k&^>嬙 W>bM{C}A4[?i I9yIb Iq>gu֑:RN˻W vs;h 2Z 2j#zv@ӎAzԘ6#K1#$֣ۆrI?+[B 7fAp;?7 /%DcO#{vdC-yP dh#&=OTDNT;{;Uww5o'0ON՝jrw*w4=މ&xN5z:8(xgJl!-q!?ɁMƊǁ^$Z_N d^@^3UdAhe+r8^Hk׽:<jm?kV{]sE$2!]@,7)+s4?4(ٛтӕ!I@eӱ>yŠ.G 84q [iE;' h8ʜ-"][et5!C΅Qt84wZ4 ^PY XEUTkAǰI0(~֦t5 BXч9sZ0 ZXyYL"Ix?jA[?"z$qMh7 D)-^ч9oZv0.u7-Œٵ|%S6p(s4 WxuY ,}p E$:wsq .s-!y$RGܼ $m,. J+sXÝy4et5ba92M3Qh4dwijZܐ8' 8T'N+"@YQ\9ơ_ǠyQ |K qHtG`%uڀ!o <[9 Vk[r/p6\xo]/-ƙV_8diw?ǚ'CT$g*̇qou8Go]L!-˯>E&{ 4[Z)g(ؗ H&X s|<9_]sq@;yG)`ƢBͮϦ\fxAҾBq~\j&;Zec-BGGR>] .¸qh4)&bBi{K 2xbw lp´"0*aS̱UTi#=9NRPqQ%Hc2(^J+$)c!eNަ?`Γj˓7H?-r4IU=^ȔrpIV4pIƙҘg<%&>&(h?qtbCŸTiy0ڎ<LU-NB DfofwW~gM*q,VE${͌0ߌa6vNqg'XfK4ϗEL|Ɇ|,'}G!V& i҂>Tn8OivNƫpZZIQ^f㦊+=;%Ӥ&Zb ""t%$$KvxWs7KpI 'dӑ5s:}:NTz[D:K݂D—H6Ti9q7dmx#t$,KÒ,)f⨕V`&"EYm_Vk W \M;%I mi`Fz=pZf@\ cxbڮl$.-|B ^ɂ]d/77`/W!:#y'ƭ^~jqaז D k3q Ј  ^[x8 ɫ*A-R?OmA%K,/8Kċߐ9 ix څCT}s:!}^1^SI??޼_s{ e>woݜ?ܾ=O/w(zl/70X|~І*û ˻}:Tˇyw}/7}7H!??< 2L0-a3Ɵ{EA8_n]_Ǎϥ?^ݳrшBGe:?\𥈲jP?Gߧm&Z < oj:B1gF@K˯FZ7$um!%~miZӸ=5}k8g<J@L$+:^CfG$("o mM;X^T :n&}X U+kX!:<^Rgu> bmlwc0KZJMk "(ɰ~A4:?kI uMϋKmق{e۾2ܟޖ35.gdn AWO/ZKmw$TH DvrZhp+B惶tgtR|;J`Yݳ1o\jB+_,2~䏁9v ]tv~=ä4蔖C8ɇG磚ۻ Ogmυˣꘓ{#H9z_>K.pYS|4E_໻*px8׼<~-ɗ^LJ^n7YCg*hOߋE"f+_:@jG PD17 \Zс"ږ ~bj }27zSqc_kFdӔT6t7<% .[;AMz9O͓Ftu2=:9IǺh.A51)s2jdA_AV1!h(wxt~ww,?U|4d2:&*O}s4L0Wnts'QjZ F]!cqWWI%%?B|zC7LM|&m#>޿'V.i;;v|>_Br؅KAç[=5.<ه |:>gOjNc~mmC[4L J5ۇn_< фkZ{`[Ð^"#{C"(O'/aM>gq@g%|xt0Aj (jH1nS:DuG1ڰ̱ja{>=?<=~Hf$c=&y`?V|Յ?vA_1Mw^5'aIpÓ~giɷDm9B測C$7"YmVL{zCm^ 8~$Y ﰶx|Xy ~"MV^/V'D)-g:z^ҷ^iZNAM KYFCAlƖaoaA%D+GI~&pg8oX}8?Dax zO(DM6ٚ.rDmcZ: /~ť 22InX{$>nTڀۙP+ V4'P}ب~yH-˞/a^{i$qu4i]yA&% D{>u;_n0X̴x_LSu1̓? h?׽%{Δ?k S.V#CBv+r$э[-hBtGY~e[̛rQs8[R !jdI9{Wܰc7JpΟUpnM#i 3qLęI- XIZXOj}}lM’C˧sg,Ɩ)FYX6t7x^ #nH! b'\h2llH뭵賾&?nl}ٞQ%Y l02Jn bitsm6?H#fv#Իwrz1?o4'<=Zi ;Y<OVHQ}ӋM+r~}zy ,C\3 %I_v͝X>A=H[z9e]B 3|Bcޝy=q=6vt%i1B2l>~z\tZx*5q:x`mgoIi-ָ gOͷ~leZӽQ*[ȿc\1е2N><E'GE[o{׻ۛ7!9$3ɺ_[y=~8~2m:Ybi:Z'!Hg|{^hut7w/S\_n Z_N=Z~0/\sZbܐ7KQendstream endobj 136 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 395 >> stream x-=Hq?-{#Zjވh) ,ͮ^oK+͟/y4(^E/t4-6~'Wy=3<%2B)5t 4PÅF}:WCFG.B+=i$yگMe" 2g'L~+5$NRyU'32 F"c/E]5`czjnrg)=/KyŨ6&3/|+~?@)Fvp덳Ҳ8nD-j BJ7$ 8̿-rHXWĞ~AkI7ieg Ã/O<{8h"i4I|qm[tb1YIc%!Ͽkendstream endobj 137 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 188 >> stream xNCMR7,  <2p͋JiuP~>}L讧Ǻɋ !74/XWϡ=:4MFkgo0 7 LHsendstream endobj 138 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 167 >> stream xcCMMI7M  'oPZǁ8)( '@#$$YYڴťfAs(_EePOkY 7 <endstream endobj 139 0 obj << /Filter /FlateDecode /Length 24393 >> stream x_/%~?Eand_`0`~XJQ5H]z3,VhF $#}9^aOo?~~^zs>Fy)g{e㵜/?o/?-훟9~ x=ڜuo~v}>o?z6_~|[9ev+gg=JsX?̾~j__˨o1sپ/_//:x9ejlj\?^i՝u_N1R;~~=쭜y'{k~ujλ1_fG״[ݹ[+w烑oN=f~.Pus^y ?kvW:w?o6rl㨟?GZϿ}nw=?o¿WH?D_T}4,UqGW?3(Xo^GGUn͟oG=ooMSޛ?b~luۯѥ?DQ_|VKk>/l_2_G]39Ͽ1/ӧ:g;_gOeu1^?q54o!K.KQ(:5Rs=KQcʕ뢭?Bk-.亃mXפէ ~9TLywu[7Ma XwBJf+Uƹ^ThkY溞ף娣^%]}.3_|d/.Gg]zlqvyG(5k/e:xm}ɭF˪^u73-mx j֣r[z,<uV"@2Ǻk=s&k:XDhjHN 릷{kP/T 0i/JYq{uƽڼl߯UрUy+ @A]c#Q]C7).6m^u\6!ZonW,KvV^_wVig]cG16lpg_ϟ46ߔk۲^Q֗d=^(v?$[V4[9oZ64kj(voi_mPEPe9m=m\nIsVZx5u}c1l&vMgƷP {~mwkWYGMa5_ֻZkk^l׬;hմ˫:9Y:˞Mym}:5ӟv ^uzںx7 &mnkhP4,mZ \4>ޥlf7aVktMUZ^k,k.ޛf}7;տoź&z7vka\$uN6wfվ}Y\fػ?(3mUࠝ'>l#liU^Q``s=D#9+6C^E|kжpPwrGը9_֡6s]k_Cˊ~˞TWTz%z(ٷuAja9Lk[έ~֦utnuc9 <2xnZC>t^ ,O޽^vxk[)?0 [+޵~]3psכ0%ׂg5MkڵˤC(,iSk=uo"?*4e:4 Y2[t}0Oh0K\Y36\]Wl d߷ofoaq:;޻>,+yӜ(_vyAѱ.Lu47޻茻5oYo4~`暆S-$PV7\Ɓ{4Cl+Lߗ9}a[l71^x\ssʅ|,Ž}4vuh&쬋4óWz#[ 5Bt*57>K>-ͤc4s;0߱]55;6FWii:vny.yKqPijix4'>!X3(GbM\n4> 4>!/O?],G.vwWJMOu}kZ;×G:KOzR6;ĆϨ7͚?}O`8h|W [8vJ~o$ A ![j*^s}Ju>y!Lڽx.hjHZčqKm@JƶZsUoI.yґ^|cIGʫ]{^b]+RcֳigQdKD/i8|lll#𥉉0A֧4t *}Ph}h-" qiN:߶wx,ToAy{+q5}dA2ڰAHj*^s}TpcG{]Kyj~(7d!d4a5 60u%Gcbt[m>tڢy¥o[ϊ*VµۋsdXB +}_QB7UPtwۣ26-Sc68G}(^O fx-NDrCsi\:<>[y,j͉"jSL?pVb嬼`l:::556m Nc[#? D:++r%)GZ~[Skx 1?4**PB `6aEY+AsQ־誼Y |&5ɍ}pп6[6WŘtjDږ rW x2<SŘ :v-c"7t:MN|xl;IxlߋMz5Ttȳ3܄7f8*bN}r= .!.IN歛zM6f<~ޡOh]1A%NG%冯R`{MOl/xK^yZN;7gAxĢ0AWwnByi̊SYt#lPw#AY"Z`ĻT;CF-J.,HFVC%oZXf- VCP Rf}݀qѣzʸɽ dkw]@{ mX iN 㝳 ~5 P/e9.˻i7 ^*y9,%F* )}Fxף*^‡qγ2 C~7oN5 aK4pJ[" PD VYy@#FBvA%EYx6l)9/ ‘J\?Z64oEZ7Qm@JvaQaGiҴkng^:h\=G +ծ*{`&BF^C8 66%߰a>6kt*\5,V˚'|I6؈рW JD촱E+_Tj|Ky5OU)gD-jU;~Su^TYV=a㺐qi.>Usn;!vUfw<wd"-|_ c~,άv)[G-z/a^̺Y<ag.`{t՟AmB'>ף4=a̓B`4q`57lM8pik:]95k jUSK.+^h  .]E l5X5T^Cx 2i(tBgEQqP4w9Vȝ8z21f58q'q \ )&.R"+*YC*S.x}x+$bٽP%\N[WC@t">/އއΐ\RSYcN5'lhaO|c}v+47,[9#9/ֺxM3@/r6T肆*w&9cAq%dRt,Okii1a ,TFEF h4X +"ainO 0ǛA1[aP)dkesƫ`YY n- J`th9ϴ'@j NѢa; ­7g[gP=+"_ѮJ^"gM.gCMN'Wލ]4DDzWkH^ ;p^/pܚ;QoV Yye%a`;XXo)!/$JT~ebn5w,͈Z+>8^UŎ b7 a3| lp/M[JyK3lѥLPߡaɼϥ ~a tf3dai.f>C>d@,T K1%l'>, ~a4h)P-| uY vlG aMhF, qB (3hiUS3pDK7'Ǩt&rsxV%ݣy'B æ@FM\̃aMW昺 hjHc,O6 [ %a>y6lܿoi =&EkՒ{c#KFVAih!\Pe9 w zZaX NuIhΛ{G~ K% Md.( A``eil͸*7W@)f(a0 5 5X{_6FND>Gv #85p^gCݼWAo: ŰDsgwZY`iƕyF:Ջ(^806mRRϵRh}upU,}y3Ė%'0|!Dgm[՟#ZRcUPfseݎpWAɀD`婘~ Pq QB]!"}y5oy馼OǴDevr04IhB,mm@q@{) q`l'W՗yKS*ђ ~WKFVA{s O `TB] 0IAD7sw{Cܚ>_+,85X䱺9ҶKVMWuL5]pȶ飑ς!Gr\w(6%a`$Dy):WO [uA%0ǖEq4e@T$qq尸Hj  pq =uȚc\0]:VVGي/y0<}wmv{vB}Yiv )fXG8`UӁ:50 x2IpS2hAۦ--Fڧw0̋XX1 8&Ҫ~2и3q;N1 Nk>_G [KAo.EN9l7햆NXVcҚۥ\-V9tjYk~%.q!^5'yT}1, ;J2roи腻*!GݸwCYX]0r0;־58dT|)Ż} |O=Iyqbϓ)H#r{רh2oaw%з(<Hߤ-_]7b㎷ *wu6}[Hf2|[\6JGn% }Π*MlE0 /0.yW hJC2yt[I ouKqNO^+ 1^GW^~^ZYxew^9i}؎IJWҎ,/i&4ħYe.NS@f'x|GKw;>j_Yq Z?i5)Z~U_Jq!}hyj}Ug+P blv["v~v}D6\Ru9D=qL]X/tmlŸvfjŕKc8 FQ9vvfiNtnNyx˷>R>a~4 AT oA&Ly#,d !Viنpl*^sat;\(l]ك,$,#N D''ih9 ;)AՈ{:liYdŵ4?R$+" !$+Fb9KZ(Tm@N,Ɋgd 1JXrg h"kH1,X`x& YqFvzւ,Mo ɂ=VP KHLY;ԜHO HcJz\^UT0%xYpQKNbiD, )*|"Ȃsvlrrg 2,<\DSӁE6#$YiA2Hb_f*,n6wuz*^O&w;6T%CB,`*0TyIR%Կ 4>MN&4Ђ.%ȃ%'AqpZ6'*; ' IP%KYxc'(Ɣ|mūȢ";g)+%'EqeZ6ر%-NtM =Wm#(fNH 8K~8-PfIPȡ$(,<DZ;416bOt[Ojs,Jrg l# =v( EڠYB8<~6bl vGN]0rEE @FrߝN(34!E9 %EQŷJEQ|(((C"E1, Ŗ Q28%IQ\ͣPըɗ L \tUƱ&Q2OMW;JIU욋(dUkzI+ bLŮ 48jz]CiJ_-b&5]C&g]3FT\l=Q+X57x +y]HKiA bTXX5]A^;`Wbb^<Ů=y]#Ĉu-r⋧5(bW4ŮxԤ)vIR_yB4Ů$%nA)\BREP5@&MkBbp4Ů/ik iy]SIw|sx]3T5&Ok2MbuOcP!PS1_xU<ŮsoŤLDŮ%V4]q]%@ITBZ⁅ldjQ1 QkPHMkHw Ї@3莵TOIS4fP]LS~8M;IWh-w)+HD7JJbRsmx)7 E (baXsgVG5.P?)EٟEkCdnB&ty!nF%H$ @m@(}z) q씾A}NqȥpKF]%$$#|k{z@9|: 1ll;|P 2_r2P0HN:,0  $/KW69|(!lt~qmt~]{qX%ծriYnKљmP vR|}TYQ׷ƞ4I7* I2_X˴RƯj>s ڹ|q>_ĢG\uG%ԛB>^+M7!,e6 'oP/e9˷;Z6._5:ȁgWrrf 0h#|6 'o~s;o_7 uI&%xv+&,|ʴ2}5-˚m P Rع|4o$du00|~Irrf Ԥl#|* `L\eWg A؉|:CnfxM('oIoX e2 `zWL ~ A0sfdz?KFI} Tjrf uQ{76^D }N&Iߛ%@BFIqu@hrF%-|N߫Mz~Ů$Nћ(.- {՟#)|1}4$yZ04u%'oAoZ6Wմ>l$EUbulOHx RF+9{yBh"{fа4ڀQB  w)H|+ H| %B$NG1AZ_8q);N!D{+5!H|gib5H|zW8RGjg:_gi1Y|4,8OƷr9Ƿ|-j "|&&"ߥrG/PL +|&.__a7ߝ0̫{L _܈P%CEr0D.pD %,c,tqL:Dϝ8#o3NNAކs6EI#ty4i|ɦN6ǃ'rjY\qL._D\$D>(jxM ._5V+T:q-s 'u"Ɖqk rkL\"K0|\yp; \\)|wSv2ͿC2_߂( "' D vO.`\J.=W }|옑 u sWd2ߥМ2_W2C2_אXKK.7dV =kpO2_` -|]q\( WB2__K7$|]C\"u .|]3YcpAHvd7dKsq"k:}p*2_7l!q0|M߹+n2%z*&>{ + u yޗћə'|O| .ߥ8E ._pu x"+xAA2(A{Cf+9spӂd`pΝ1Wr2f Rs7\ =)m%'gn#,H<4sRiQoZxc#?N\?}x *VLm-nZ&8WAajFA9sD >;Nr Ze<63D|%@$3jS b 'qnNc ;m.(6\z/.a@9Is(qÀDo )s}Am+YBN,;Wnzx7 co+6K0QR55ϦeF`%-|Ε$~h틨o瑂Vrrf h!rĎAG+7Ka9+wXHjNĞښН\Y0iA2HtGP Rعr(\تZiZ"c+9rhBȊJ 2JD/i8v\?ƕ R"p@r{o/a%?U`E2FL>=+1r%V'gOi:Ĥ?z*$}x $7J7 HP >=~c#]ꢞ v\wP#׺ct)YTs.'9 n\}drf 7`.r\K™q-(t#ǵ *s<8r9-8 ǵhUlVTZʒsA{ 2qoY;-TB] rȽ r\f$[T7ނЭZLj\u0HafSoEKj\,q}O@LRVK̹FR㦻XԸee'$u @ APFj\߂&˯XC&VC18I C9("ƭ/ɋ멸%xq=x`Z균ջh&Y-hq}JAoA~g>D܍g.q;)p ry R\ߒ x=7P4IBz[ 97GM uoΉjh44|σ$`+&ŠsQ y R)m\#.woA?T68'j@;!oʃ Ԯ)2QƗqV_105Zwl<(d7bv4pb8'o&0 x@#,p}ľMT+2\אppSẆ-  ׽xA ZK:\. kHQ >\5·7|+>\ ?*p]#].{:U$;q=^Ԧ 1⺆`GE[0jay+F#ovq'Ȉ`E>0oUU>q][``vHAꨜ{ȇfLp]Y0MB\(;!.wB\pX"%kxט`cfp=\d͔c"|Cd,d1dE^2xYbu )`#up]C~Wfp]C:W"  :U&:\d8tHqfljUhE7Ňt< (ufp3t>ǝL=p3Zt9I^ ^ɏ;NfNp]e5p#Hl-6\dmcL`ut[ZV&f8Ka9x>ьNGظv4cq VqX&64cgЌ q`'e1gpx #Q` h~V lhaيр]c#x;flD%I($aeX% x <41wuN[ l;'~݉e{Ǚ8Ô7 ( ml@Ș 8J95%L@!e!d!yҵ!)ۀ!G >hl/=wDn s!G >BK 6 'qPe96j j<a qL-7PUZhgSHPUSgaD G Ja15YL ) Ԏ;A'! qP/e95XSAl `9Ly5L @+Bs.-m@ޠwQշ?Ѝ"w U/lY1 X8\0ɤa`͌BPe9ʱ1x Cp'J ḇ~'qT|1,5HIPntA%EYxr<&ki"|a 8J)0,|6K--4O6 o(QB8sl0Ǧ>vc_SaL9-a`969Z)̱i4D%yOR%ĉ[;4sl9FaMS0Ǧ90ǦA`M0Ǿ|h:v"бiб?Ms>MGOбipe a!+XKc\c8Ǧ:x@ǾD |֥SK2cOE/αk|w ";α)LQ96 tlt8Sls<+ s"4}Kc` QS&"49v E]iL:v4:5:5zIxbpC-mۄg) бt؀/Û_6JPO{S(ʷ J |RC_-,,ͳ"B[ l_yKq%4 l בAJ4Ɨ(^wsk Ęb$\jEFC8_@J9a( A<`ͧs'y(0BŘ򆓬Al'0m`B%KZ0+6Dj%D1 ,9J(,HFZA8(,*ۀ%G ђ` -yA*pyHƔ7(MFXܢ7,7ڀ%G vRx%;2D %N*<Ɣ7(A bLGjfv, GC P/e9Jrs7 RUOLom ?701Btشwm!nB%KYxげlGv>t߁`LyCI@ !N18-#m@Pz) q!, A drP/e9d!'¬x%)oQȲA*tBʂC~d.n=K]玗#+8)oxQxaba[(?#e7(.sdw2;&3A&G "hcL6=al%KYxcGM#yo~9|pl"I%'\?b'iL)Ov 1oz 0l**MƄO5O(z"!7NO dӀWBɮiϨMC m'PO6 kxDWɖ'pgcJi @yWLu%@y@4]1&rjr=Oβ{xP/6?xZ~W Rӈ/c`Thy Kf+ekJfkQ^܊\j.OqK]LzI-i &Tѧ`+uDRq`pX62&,XN'7-|ǞO ^i-RDr}%g>q@p&2}؂8-46 G>qPe9=w8z[=D}%d>ql14a9= P|USg|5Nfz@2y3 zh atY-@d, "Q$zxׅVD_əL%pB&njP@D șL%uO&nvF4`hQuF2q30螹38K [8-HFO /ig"',<DZ7@o t,Nܜ2T_əN%,${M lr&g cSA{*q3ྖ~L%YgiA2T/ \=3XrG%-|ǞJ \o"Wr&g h#Q?y>ڀYB8l4~}&nSo+HQS@&HI Ff{,/,m@l,^s_EpmĖ64Ći\5ͳ}lfs؍,[d#rM &nR|1سۡ52!9.4$nHM?x=/f_:*oC(V&q3Z *<`Dit(#sG )#nNa7CB"t#7cHe"Lf迕$+9I xK$vF&&H܌ aWO[3iDbWA cFeOGz/EC<⥡oUyĮ|DʺDLG :܋> stream xˮ,ud_dy (POTCNU}tnqHA<|J??q^y~\_?o?z?N?iq?N0z}/+u+R=/jLTp}+S|'+ߪz>\n_*2QNjLUu>Ͽ??2l~܇?~|t˰öO?p:_\x˟}t<<^/m.d<pn~r>~6DH۷į4x/IbvL N۰o_|`a=uXnCO8}vOq.:eJ >>}VO{=]?Ǡ8{p=b3ѦŃ|_Y1[ðs,u>qpӟ΃h=p OgO1|4c8*^Ñ k|z;)`P$FP$,@T$ha QXVt/;Etx։0=T7'cdV+P$Hd&]oX>oC'#V( Lኗ *\aE(Dhw B@n MO: e\ JZs"qӉCCx %0UשOU,j DTQ՟{N0U;] Uy*!/}~Óoo(oMxΗ Tֈ޻111=҈D2H"@r99=0q/+vik++N'\Q$\Id\& ~9_OG&Pֈ \@a%(Q$AT&(8!C:urs"kik!!(Q$Id&s= |_Y^ϊ^_;{AUJGi,]r =~H\jGaE*Z;>TvD,;7>,'/2yf~bmpvD:,j?H=xٱΈ=DP#HdQ$i&4X"E"E"DE:,HGHDzwflH *H"aOi컫O-?=5ﷰm5 Eb.>b@^I;hP$Q, E2NX^1 s1Oϫˊy*̣Hw80v:ܞ_O"Dw¾;…w\=EZB\ݡ;bXEr;&;HP$CHhjd(!U@; [q=+7X<ԈE(`D@$Uk<999 sX]a"a Tylq6*n@w|9ܣ߈40."-p6hQ$@ƹvn"aDQPԃhCVn[9PAN"5~oQ!Q$KQ$q:1L"3 u,D@煈/u  *a haNئS wG]0c]|Ga5uJ_ YfQc Z1΅4I9^VՊzlE t5Y&٦m5yvLjc;>b6W?uQ?OG K:*::$Q$a9 :nBz^@T0#L~1|G)tC)C\!>pqxnYC 9B"$s@0*~"YqtG?e(,6G@vw?O4 zz:!]l!HHHň??Kmk6fo *DU!z]zn[Sm/# w X'|7EgFl=hB$H(Curw _pg i}&=}"ֱi w0ǹ<9ԩ|[؂  E +P$p:! F*c#"!ս)Q!PHSHaB E I.n Yh BTB B,HHtDD AsB,]v//+jHؑ"E".Q$Wޗh+.,jpA 5\x Y}j V+BXaQE Z^oK~J&y=7/ƍ"E"  ( 8H  Z",h}"VeHnf0Nbu?AhQ&G RHMөItąQFZEjeURafA^,V/B""^DzS/hp#KպBԘ>7f^/.Qu)~Yp[W?8º n&|YlB?ǏN2pMҾƧyhÿ0OimEifCSN ; G|$Kmh/Hp>|zEirb-+o_$k<}-Z}Ƃx,?_ÙO3pYC|˗R( o^./oxJ7vz>+r]~~gQW01z>z^Ϗϛ]nmZ8K>s |#T?\V6Mq:\{b5543tYȴe((dw6 ]UwĂ8=ϴgt91ϙcc:/K݈#l^L3O!x9Dr&1L$چ5_n7M3y,j,jtBEʼ;X@sݵuf.e{V8̀qkZQ$@Ө53xG.-HRFэK2TOPg㵚4O{f)̸sƝLx\ >q{VNj5:~>NF]Blt6d<|~e)i_Y \52XHwӴ8ˬ,JHƁ"!+(큪#H&^mu@@wvD9Bf{HS(D̎:xf{@Vd֎/!qb(W%+88)+bt##֦8N^AdN9qP2"quE(.B8je_ ܱ>Ƒ8ąRh"Rp}r8.BE듥ĕabl @4I"AcӘ9&rB0Bs>]}G\cǒj?wDyIXgcI zco}>Dj]7||,2L:DP$ȫo6߈6x;Jg{H&"d"ԑ67h:[d(;}g8?h Fv$g'm:-l! x tG|I gsO(NlF(h[o/+@Va@"nF綐x']dfYL$.%<.G'l!P7+?ICO(]"d:g+5@D6 n{CXFg(Zdqw5P!v (;jeq$FAqj q݁l(đt6!HJP#C !> CWVP$C@ !GC$ !H"y@hUo v3(qcw7/n; ;2:-֬wK_|\ ."Of=04|Y-."] n[[B N@~Rgp8@W>@{F?S=6},ў!8x m t26Z} V>W+B>Jr<c־*O s ГHhm)X\$6Y _F8J`M =$BW#Y|I,'8&ĭcjm98(!^f WeeiaC7Go(A1v8"C^/V^Ѽ"_Ɓ"$^=Ļi[}CC8riiO ; 4RϨBC6AJ6isf9^Pgh$fa48L,Jw:;;N^b9Z=*,)hϐHHdSiFpN xszwĂ8XѰӶ pxC8]֌axk v&;Chs}wo 8ψ{k>p@K酆E7^ፗdx#vs4ek:"L'c18mx╖dDPKߚs~ԔgQ$tӀB7F4ǔyhQ$iIFEXH5b2>$J5Lkk5ּK8UPa _a,1apn1_Wp\mc,܎:}P\GLcFNXEX,yV Y`a!+c4XhjMUkP$@Wj"?>OfNl+C`#h2P$PG? ` qws7g,?X0I@L 1Oaf9L|ff̘`Mb:MEile!6 Gr㡫;b F: mوk6Ŋ ,Эc;yƁ0L\o>N!t8ߟ?? B1sqgnr>M?$,y+[W$yN?^Ö=/_^X:~gJtN~܇|6<_~8N·|n]~? `+u|gʊ<&t$~_}r:y6Б_OyÔC=ƘiR tsrtFNr~ޏwCңm3,pm+ouŶW圵պgbիkSWm)fVmjRuv\wr~[/t+ƉnM*B[) eEEW_- ZE]}Qy whHc(8LP1 1@:b)(噶fΝgS0    ,\s|xB""A _443Uk<C^g/ X+0]"""81Ŝ&vy#8af2&&E*Mp$qDw8ƧI8b"0>DH[oAT8܅####.sV]'0:P 1ĢP_) ( <Rt |I}oxe 5@vxF2j,jƢZns`gP)rРRA.M-^Vb$PIdPQ$6m6qk_T,ZcPi& GpDpDpDpE m ]Sh=H}&E"L ^IHѐ&0NK|KE@ N#@DDDE`~,#?ݑ]'$:#y3qF>G tlqvZ;C|4^f3P 2e2e0l )@lE &pD|86&(6'mgg@$JDEBj2(ec4:rX`0(G(G(%qPNqsE8` s;3TF?W$2(T l`ǧ`#AT,t////η4`v4͵3i:C.Ӏ4!iVRVjlJ0TjS{2-?@ĒFax:~MvFXBk H^l$XFw}pJYԨ>rM Վ$9k~pA4o,s|I7>݆;l);' P觤< ݺyj3"1"1x%1N"3"1-x_2#?VE~~m>M,,aDOsGGF8^1NofE:z3TG8^IȌHDZfV:~HFHXciD5]$H7bl}92'k 83(((j$Qn:3qx88+qqqXF-~GGuX8]Sǩ{>N33fQ$jE?^VY{g3(TGGǚ8^IȌH!>nW8}VVO _s/,_6{f)A`6vgEeZY 6Mme8]d̄/(S&|J _5|Y#2_o(|qo/N-|YeQ×kj(,jw06|#Gq1p6.龿:!~ߞ;t6(3ĔQfId)rDfu|Q7̻ie D4NuxC:^VvhK2ޚ~Zk_ -c"aH"cH]$ Q$P$/Æmust-k3yTaC`4lx%F""!OK[`:?Hq[E‘DƑb#^I8H8H8HAf±1c3T #^V8ՊM$DؤV3)K)K"1aԀaQE ѿ\׼\}C2B.ܟ7R\R/T VrqpjvXI]Q6:nmx׈k Ss ܶB=PEjs[`=^] eU7nݸsVgQm+s fK粽iQ-FU YnҔ Q煨)_ժjqs֭"u;- "CSQGΫiFWq& P6P$@mBDFEB=>JNlF((TP *k8˨SFΫeQ$@3"1"1"1"1L3i\1j 4UkQ$q:1"1"1L5aObK'f-0:+t1LbfEb3(((6(Mw>莏tbM7FD7Dw9F=>qOuV Yr-]GFlFhR="42a*\!T Sϸ UH҈G8HHs F҈EМÿb=#ǢnΕ>jj@v}%5&;Hܱ9K^wcS?5;\SC#0ؙmnHv{jO;WzUSslTM ֎"GZd4ME2P$m6i\" ME2: @W# cu(&@W6GO{*ܧ`}^ `2hom( H&"@6n9T!>JEr,P&"7` a_iZkHdG%J24BL ^M H&@K H&"d(q{x=b6t0>Κ `2$F74&!N=r(LE2&^I&"qo&K P6P$@L ;B9v,D&@"=GPiU! WE1D1]HSM8+4XN# 4B77774)+bbblө}EUvG,4E.@Q$@Id@Ӏ5iÈHHHHGiZm6Qc*74LC!W&E v5)!|5YFw8f4ŸEbNQ̢F1q0ƥbͫ8+!(F(F(Ei&W!~LT xYM{kQ$i:am9dXȧM0yZ@W6ĕ @Ud( @,Wd8l +˚|*аbE~\ `hl(((n3|* nT]!i %I#Œ3aRXW!`i- +hiB&6yxw鮘AE00Ktif4 *bӈ7C4CV"W+jzHErm~2e,jQFy_ 6GŢVgpI K,j55bXԈDLfb 5.P.04Z/Djyq:u9ݥEsf!υQϫU :-@"#)A;b2HOъ4\E(8@ 7wħd9 @msӣH}NYPǷQFEʪQQFMkӔjaZ[uԨܨܨXEjTZ?2x5msC3NcWN1s)e.(?Nk_1~^_Uc$K^Ew[>LTc8;ͪDuǨ/U{e0oU{Ek_{]ߵȵMv6~ny>ρhypo?hxp:΅NÖ¢_=dvt޳EqX!W#t'U;LM=^wyKGM[#iQm`Դy`b'o(:T{EmZ6@v9mֽ kp۸iD;@wx)@4m-](`Dр4{>=/+[kD-4EDy=k 7O4E n;blS# ܋gZQ(E \(A@fP [`H`ĻlJhI$|{~_ZHqIUwĂtFW(W0w.PʗPb7) ՐHu5?";ՊfEZk0<d!aD޽i3-xne?rtC`D9ANOa'(@?{G;(1TOO=ݶ > Xlw;b\#z,^QB!((E,L:%%mDX$cIK:)dO`ur4b:@XfET 7KOV0M_}9]Y!nE]_*RAmw-; l4~|q2[r_=G2ba5SM"J.W%nF>,$ L6ty)bT`$m acĀn"I,PB"hH[˼FVfA]0 Q"YBme hDYR.">$BEE›j2(o,PxxS;y><ǹX7(KtAxw 1»;$t"aD ;RDHDt"E"Eh:wirZ@w; %Ц.薾_N{X'pgݹ },Dhu(8hGhGQJڠ===C֚v 96x-ߩKyl# 4UkJb[|Ib:CÈ6x[Hюi!Tjtww|}`4Hn; i17A# yls5`Q3|d4¦AiěcG@IUe'--ыg);QH{ukac_f!Gy,R{dKw^g,ݎ"9JZ+GV;h t/;$_V؄\^pn9Jrl/iSk.פZ^CkAx? ʯţK轕ty (o^v'Vkoe'(HFRN.;I-oIO' 4,ӈWdӠjFe,;@jG,0w-p.kС(xYQ"Q"Q"ZHlUlUlXN@59o5]qq=XUaxNmI#I#I#5"Fd'0` ^ՋPO9ܻ/:n"f7$ۚ7U&I#ԩ8 M1 [%%%a3bxb*"){K3a*TئeƯt8C1<δD 9(fi82D2N'IdiHnܞ#dX!e鎔tG,b# -H{./\eӈkħo_@_>Gcf(\w35C=@#..X %V.]xGą]hGl(,jBs6g Q*נZ]#? =Nu (kD7 /Q$RE4(qnAL"Cݙ|I&:CDwG,ODst;ݫbF4b|F>u/a\JB@qXT99U, p,D&"q""ѝwѝ0TB=BFQ~ؾ_%<y1ٽI,ULHLbbDfPKָ n:GݞZBUEkEkFkg q ǛoPl܀#C;;GȰwW=}Þ!5X" B ns!n[!n[ xo۸o(Jy!"Qm1[ȈHTQM)c)CTDQ.OQHQE3#n#%z a"anF莘f.ɌPf;fs xE b$-xX܆h{Y(E,9 R,j`p?QOa\Hc!?"B $r7aV۪K|@5Q$rgHL5J_ereղ ͹yc(z`w fB-x^c 濼s0z;bKl<~SlY?w48;|^~1Ν9y{vt6юBnW8….c1%pކ#x>A_4ܮd挱{s<;zY/Yx@7:0C7:^V]ߢiĄ87z#nt*ݽ"6E/Qގ]1xB#lB >,NFsB.{pĤtAMhs JC4's"qhH4E\{µ9sqx2\_iNXht(дHHHL!ex;Dh@h}$_hp!B 1:(:i90:a\ƻ/3p#XQhE_^P8}\҈Ԑ+7h.1q!^0q/xGLlXƭp@M7/pWvU"(Ϯ@"A2h#$ X e>]vx}fFkif?#OَE 4((jǡaLJgx #XlqJFEB4_4( ޞ㪌h5CRyͷG9^ ^5xPʂ7>>߄)nJا>Gp u iE8.BDxi7TwPNj5ViԴ>C"A/IŚpAxk/4Rb> Ÿ|^E=B xE~7s;MI4dE77s PӬ nԶbOprs;qz3wS5n8J&C}28 Z9-ݼEK^/+ODH|6Z; UkećlϠjm(k9-V]Wi~4ٲRli" ,A"^IܣHܣHHSFhp:m3qstq>^M ^6T@giG72~ [z0?a>0ār8Ў@:li ay"@"Vo]$ôQe):/=x̴HA+P${1M>MB6g+F~OhE@o}++K)=⧆xc#hs5h{AE2\|#W4wL$ÎB˳P67P$-I3]Qh{ *&n&#cG9(qUvڞAB/Pa|#_L$HhGJ; (h+7P$@|E#Tm@Erl YE?HxhSm"h߈KoP"N3Ut7d*r*o`! 7P$߈&Beߠu ЈFw!^1sHf&UYP<"GYP6 sV+X!E\͂g5myr|H>lk^#ޑa?T$ F&1ƞ4> ,ҘG< ⒚k-p:R@\L*qNprjPOc@ھm'64!n \|FGkɑI[K-J[м2H#O tiD>iD~jF3bÞO{7F>7}}8CbA"'+lZiůp7̈́\<` nԈn {i㳰e 2 <˚KPPDiKSڬeyz|/|E*X5 C{@Ih(t"@a>^8ӆ !_ =3F^ K[h {jCko$ tE(O@<E80Ҟ#uH{BCiO4 yU ( tZ@|yB> "bu /%2^ ^ ^^,^Q$^HJQ:q hkV#wy1iTf!"Dq}E1=5qxo98Tyu%Zsw,Jb)seWmGbXc?n nAp /]Fo]!>[DXK1&6x4xYA"qGX4 B%mmwTzqK\P$CEx7 XNx9FqҤJ,)QLHLAfea"Cә x (X貫710$m1`8R7,mB$N`8dӘ옣1CAfEL3,j*Vq(WޘɻB'&0 V+LP4 /\htkH݌"50ԳY=",Mƀ?e#YZl^HY0I FVgay.Wen2,sܟ~ڽo ?=O??*s{xf;p꥔N|vGד˪Nxd exJ'#<ǵ8={^ ^E|X48L]Α\=/shw78vtnnp/yۚ8$r'Zw2%_~7trƽP[cjkU[tWBָ$5mz? Ewc$O}պavEvG:9+ϸ2 +Q$n*)qIB8KDRN!# ai")Ɓ/+Id%¸ZIڗ0/Zgm"3ݘb*VQ$VQ$7~ЎEv()JQ(L9dj8U*KGX:yTOz F6 0PQFM#5]4Zg(-o;2e޸y?y|.[ /ą⃵Mty㫛~|߱fFfGf9(B;P$@#\$I6h7=&i6Q^Cy (s1_ýg`Qs 5yf G??qXaZF>v,ǎ9}i\V^cpi1=c Ǡv *&İ}pNϳIv8Q>d@(mK}t71k@#^`/AEl0#֏q$ӳP$/D^}HQ>(@ю"9g@L"NI`xo T}E*Vn0lxMY&S hnMxf/^Iơ}/+|Q$|QԈs5/񥩍//D,$bJD4L46_Zҫɞf2YȽ3iM0TMq\gh|ewDi%{HSOAYf#{ rH5龛4 O8}_eH#;H g;HlP4rx5rt…vzX9'8'8Oc9 }vГFCS}i~O }Sۧga)FԣHY >mQ$A/Ii?4k?^ ^!NS䋕UBlbmTw9s~#>SG܍d ;'aQ330+QWjy<#]gI3pdy<#C[(ȣeyl i6"9p?} |CÆ63C8sm3۔g n~SEtyS@$(F,j=6e!<Q4@^,mӽA7:%Z6(RoHδ8wp7p.t;q{?4O7C=Ƿ=Hwx_yuz%]ᕁݯuz_#V}^^_ʷ~zwƿڡG>L՞o(F9NC}8Cz-#ܫ 1'#\x6!u(kFEB ^;kxt >fNpĴ-4_#Bhh9B;Jo~'9FE,P4ѐرI>8҅vw# 6sw_?I_ױc09Kш @=̈́uGx֭s|­;b,pKOp0{ ̟S6PUQ"A1)-Ûf )t#ڶ4btBFwV^ |,-cz_Qƕ,(JZQ"Q/ɔK2pxK] ?^~~Bw-r ڂ?ݑ;b6*ީuӍ6T|?;ռǕx{|K($2;(` }T҈x>x?!XǡB9]l/Leu>O\ÈB(Պk\󴺍0\F#xY߽m79`*Ӎ.=4xS=øwG,pҋd;OHK2qFھޛ}{+' i:(Q$ATPл#Pw7a7z|F8*=^qOp=>@OdQ$S}pߡxB틠,,kDy αЯj^b:옣MpHCΑᅵ_fEbG99֙?5aln~U)F,*ˮ> ?(]6!#(Yt2 ,PJ"2 f"C\͢;> 'H+ssЈsIR-hn)I+FoDr` #DZGg> tG, x7E^P$GPo#oty 5 *{M(GI;%]wy V+{I^C?Sxr{ d/iGtG,cz I0=x )c'8Bv\vK%f-?vcG)c48BF;"ɷMFW+wD#V>c4;hF:{XP,(a8ow E#C`G9l(T=[Ce(t4y(7_ C>r|PpC'uP6,CIw4~kq{ =b=Ee#fo_-7t]v/7sWċWs8p{ *Hw"= ,Dn[TWkWS+ҞG@uV.w=?zKW d5"fY|*!XmKvV"y! *m]nNy:<$=W{UP>bĭc۸;'x(+29@(t^${(oH]FxHϸo(peq6 ݐ#>D=gų-nv,>ψm+msCuPF1P@T;R"N'HG|5V-נ4ǡ?z-kDmo(yF8 &Y6^Zp_j8N7X7^vSZw\ 0+@ T{4CQms-GZE߯SU| <'C?a6dm8bzsx*v {s$%FlgEЅ ]Vn;h@ӿPc^/րbh7q!Ek=E+(@b2VL;b&˛ t#}?fs5"y+NE;/UÈ=_`j ;]vx}Xŭ9ȧE~ww{UGyB|fx qU,8YF)_+Fts$_Н/2Ebxua]CeK'&#.nW!mDw]d# q9F{?>gnu=;q"t7ƈF'pwq" HlZDix3w!{8tavl}eUي9w:uWԕ{H2<F# ؾ4k-49Hvko +^co0aa)"7lNC4.Zdbт 0BFܧ0yc3D4"7ΐ58ORIˮ7ZÉ'`&0 8 t g|&Bϧao\Іz h&6y}@ᮆ/z; 8H}3~E?.金ˇ;VͲE?X]\=o ^ǰh8p㈯4}y^(JkSv\[s H^/O^#KpT!v+Oxړm׽ZFKGhwQN$cz$KôY@kS&!(8צ,l US` i hm ltxz5cCi3. . `0Y F|a[*Ô!8ǷMBvo$_|e\LZFGVZm'WbN:$$ E/B3"sm/ ,~hΒfCص^&/Hn%%; @g`ݲ.CKħcٿ6M^~GAgdp-:;Y+0Kw#L4}WPW3 Xyv<-/yS5K8Gިq e<7ټ;۱<[7-Onˠֲ5 |>$?ɓ 瀷;oDiiwU(ֵ{_aػ⍑w2mUq/ئ:N6x?l@X9=l9v"nz9RmGwB]Qv9݆+.^a.ov4D6#ـhQ:;!GocLș(H΄DozPtv Piu95ˡ3up}$wCNg^Ǡ8>#Vp(xPJ3F5Sm62xm68bm%Ck]  -Bˢ6Am⃶ vZ%gx:~Aڋęvw8C#~שn>m0]1_Gm׉#:Z̦/C/CCa'm ;Nf+ձ~7NͳmSq2- X5YUmudU8rkͪ(Vۦ5:Mōa{KMKKSȦӵK;fڿc.\hoV =k7~ZUeUqµ*NEaPԽ GzJ P龸oڥBvج W-")n r)])/J΄#OG=n|<#˘:EmSΛ޴;P>M@({ #+6st\0S 1P8=o?X4F]ƀK]5*#V%7@Zmr|9| R4fq-G>Oȣ~Ĺ(_mG|2; wٿ$ ul;:.C#OQ6k_}ؽfMh .A 9.d[v`*b{*wCijVRoyDG&{|zs/5ElxL'}iv鬦o L=?iTB| O#w.VLl(iDG qt:{ 香RbYc-.e{`ڧK9.ъ#5) ?+ߩ'\ S,a}Ԧ2n+SL&-0'7M^â‘Vo0D (zJ#Wu Lk`9m Ҩ7R \&z9Og6uӛ~wiVs~OwI>uNó˸Ͽ_? ˸nlӯ?]>81<܊o_?~˿O {q#_9Ƅ]~k_ߪmo^R [6eʗʯ|(ULD/ip[WT *}\y?qDu=އ;뷪2U=UW&>K^=ߪT5lc"z0<MV^էc nmȻ`.XM(QmD@"oE_[`Qہx$XPC^Nq8_?/߾^}F9yz4E]; ~ nx>;Emv7Gk zG+qjPHw^7Ϋ&J7Ԉ7q}N7qԈCyUr*9Gw_F9)e0W0  )OAlE9X<[[6BuFP$ sH Yěcq rcSr'w5"XVpQf"C鎔?(E5d t!( PMv/rHdif q|߿.a$M97/ὣ:0޴#&mCZ6Ya_Y /V.uX\_.\`ǒ%p޶?Ky'[_dQ$KxsR46DȅiӰbE((jBI䦻\vGa!ik4qwqwۓoߢ@LÈb5x%1-pt$1!aDPhv 8hGhGQ!Ӿ+C*X3M՚/xRu&?wzU?|gP[f"ߨwosDh6eͮ%/]#DBd"0L6LEte"XLEDxdDP$߈mtG,KĝmzM:vR#N@a'y!hD9H\/+ALE2xl0L]nN9-@LE4-LjH;b 翪'f CENkO]k۰9,7` Ul<@ٶ 1JmtQidYlk+W\VJ9M,W\6 V&]sDZ#Aw:maǍu8`DRvUkàj(eH6MFkR6.H-IOl׬' /Ҿ+ÈWdǠjh׭@7 0FTѨgQ?!V!  h_wͱ-i?~Un? X,`{xoeM.{ kDA_ÈB$2%-d"ÈB6xn./iV-% vJ dPІd8,Dzɠ::63f tQlC!6U;%Ulw7k"[h|O(okD}ݾ5PwYdX,DZ8osBd(9H"Ce#OiOmtG)>qFpF\m#.ʶ#mwsr{]s|-@l;sQ/B6j!y!2.#rrؑ2mJ^ F?0tWkZy/P (X &!bq !5 9w:GU# tC ow>G:B|'P 6 hP!@ǂ==N'IdA=="Q$Q$KF麋#/4b t|1cwsy_ XcQ# j䱨5P$HNNގ9\zðG̙0.PJUx~W>,/?StG*ZS[=%FJ1ҕ (FT1"1GK2=$C՚܋-`M00&B vdi;bq1+D /\nq5?Zp:V#7 '#\R#npa.硽吝6?.U}naO[S%{11_ZHe(9FAt~LFr-5~?K&5a~_rnck{3N͸_\fq <76ٱ<-$sj~1-Ux̎T핉jyFֵVT*JVWUT|nu+R镉Zv诰B #UKP QE,Zi{&QKٜ =sfYMw5I؅.ZVȠ:WZX"c4Z±3rwE'RλE(pcvkEMLEQE1pyE6 ݮ=kL˓Le \|7@x iI1kZz$|9k\|7O0NRpǸw(:<~tvKZ䅈CR?ԅ}ld-C#Sn",Ûbw>mm;{rrYPwXLj~ ]nIiL<dogw΅Te |5\N!RxW/U&⦶2ߓ]qe{~>my2%-ϛ[G$~w KԮ:P3CY٦T|諎*Lqo_`2ӥL& ,4`sI:p(ȘD;x.R]f\K4XfWNo> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 142 /ID [<8280641edc71c9d972fb7842e4d4f3a3><39b10181f7f1ab8833f0b1dd83e4b6f2>] >> stream xcb&F~0 $8J@g~f Ï GÐxd:?@$_B< RD=Als t"YA$t69dsېDH7`]y  8NUN0=v'##L"kZE endstream endobj startxref 319227 %%EOF gstat/inst/doc/spatio-temporal-kriging.Rnw0000644000176200001440000015627515162303064020376 0ustar liggesusers\documentclass[a4paper]{article} \usepackage[colorlinks=true,urlcolor=blue,citecolor=blue]{hyperref} \usepackage{alltt} \usepackage{amsfonts} \usepackage{enumerate} \usepackage{graphicx} \usepackage{multirow} \usepackage{natbib} %% following the RJournal.sty \usepackage{geometry} \usepackage{booktabs} \usepackage{amsmath} \RequirePackage{fancyvrb} \RequirePackage{alltt} \DefineVerbatimEnvironment{example}{Verbatim}{} \renewenvironment{example*}{\begin{alltt}}{\end{alltt}} \RequirePackage[font=small,labelfont=bf]{caption} \geometry{a4paper, textwidth=14cm, top=1cm, bottom=1cm, includehead,includefoot,centering, footskip=1.5cm} \raggedbottom \RequirePackage{setspace} \renewcommand{\abstract}[1]{% \setstretch{1}% \noindent% \small% \textbf{Abstract} #1 } \newcommand{\address}[1]{\addvspace{\baselineskip}\noindent\emph{#1}} \date{\footnotesize Mar 25, 2016} \newcommand{\code}[1]{{\footnotesize\tt #1}} \newcommand{\samp}[1]{{\tt #1}} \newcommand{\pkg}[1]{{\bf #1}} \newcommand{\CRANpkg}[1]{{\href{https://cran.r-project.org/package=#1}{\bf #1}}} \newcommand{\email}[1]{{\href{mailto:#1}{#1}}} \newcommand{\dfn}[1]{{\normalfont\textsl{#1}}} \bibliographystyle{plainnat} % \VignetteIndexEntry{Spatio-Temporal Geostatistics using gstat} \title{Spatio-Temporal Interpolation using \pkg{gstat}} % \VignetteIndexEntry{Spatio-Temporal Geostatistics using gstat} \author{by Benedikt Gr{\"a}ler, Edzer Pebesma and Gerard Heuvelink} \graphicspath{{figures/}} \begin{document} \SweaveOpts{concordance=TRUE} \maketitle \abstract{ We present new spatio-temporal geostatistical modelling and interpolation capabilities of the R package \pkg{gstat}. Various spatio-temporal covariance models have been implemented, such as the separable, product-sum, metric and sum-metric models. In a real-world application we compare spatio-temporal interpolations using these models with a purely spatial kriging approach. The target variable of the application is the daily mean $\rm{PM}_{10}$ concentration measured at rural air quality monitoring stations across Germany in 2005. R code for variogram fitting and interpolation is presented in this paper to illustrate the workflow of spatio-temporal interpolation using \pkg{gstat}. We conclude that the system works properly and that the extension of \pkg{gstat} facilitates and eases spatio-temporal geostatistical modelling and prediction for R users. } %% main text \section{Introduction}\label{sec:intro} The collection and processing of spatio-temporal data is rapidly increasing due to technological advances and the societal need for analysis of variables that vary in space and time, such as weather and air quality variables, and crop yields. Analysis of spatial and temporal correlations is useful in itself to get insight into the character and causes of variability, but they are also important to predict values at points from neighbouring observations. Spatio-temporal interpolation can potentially provide more accurate predictions than spatial interpolation because observations taken at other times can be included. In addition, spatio-temporal interpolation allows predictions to be made at single locations or entire fields in between and beyond observation times. However, adding the temporal domain implies that variability in space and time must be modelled, which is more complicated than modelling purely spatial or purely temporal variability. The spatial, temporal and spatio-temporal dependence structures, for instance represented as variograms, do not necessarily coincide with each other in terms of their parameters nor in terms of their family. In the simplest case, a spatio-temporal anisotropy parameter might be enough to deal with the different dependence structures, but this poses strong assumptions on the process. Interpolation of spatial random fields is a common task in geostatistics. Simple approaches like inverse distance weighted predictions or the well known kriging procedures have routinely been applied for many years. Nowadays, modern sensors allow to monitor different variables at an increasing temporal resolution producing rich spatio-temporal data sets. This calls as well for theory and methods to deal with these data sets to gain a better understanding of the observed spatio-temporal processes. While the theoretical aspects of spatio-temporal geostatistics show good progress \citep{Cressie2011}, implementations lack behind. This hinders a wide application of spatio-temporal modelling, as typically extensive scripting and thorough understanding is necessary to build spatio-temporal models. Handling of spatio-temporal data in R is provided by the \CRANpkg{spacetime} package \citep{Pebesma2012}. In this paper, we present an extension of the \CRANpkg{gstat} package \citep{Pebesma2004} (version 1.1-3) that reuses the \pkg{spacetime} classes for the estimation of spatio-temporal covariance/variogram models and to perform spatio-temporal interpolation. Our implementation handles various types of spatio-temporal covariance structures and facilitates spatio-temporal interpolation. The notation of functions in \pkg{gstat} are extended in a way closely following the purely spatial design. This allows a researcher acquainted with \pkg{gstat} to readily use spatio-temporal tools. The use of the newly implemented functions is presented and illustrated by mapping spatio-temporal air-quality data. Another package that offers extensive spatio-temporal geostatistical functionality is \CRANpkg{RandomFields} \citep{Schlather2014}; further packages are mentioned in the SpatioTemporal CRAN task view. The paper is organised as follows. The next section introduces the general interpolation routine and describes the different spatio-temporal covariance models, followed by a section introducing the German rural background data set for 2005 and performing the parameter estimation (i.e.\ covariance model fitting). Cross-validation results are presented and discussed in the section thereafter. Conclusions are drawn in the closing section. R scripts reproducing this study are available from within the \pkg{gstat} package as demos. \code{stkrige} re-estimates the variogram models, \code{stkrige-prediction} re-executes the prediction for a time series and a couple of stations, and \code{stkrige-crossvalidation} re-runs the entire leave-one-out cross-validation (note that the latter takes a few hours). \section{Spatio-temporal dependence modelling and kriging}\label{sec:theory} In the following, we will assume a Gaussian spatio-temporal random field $Z$ defined over a spatial domain $\mathcal{S}$ and temporal domain $\mathcal{T}$. Typically, a sample $\mathbf{z} = \left(z(s_1,t_1),\dots,z(s_n,t_n)\right)$ has been observed at a set of distinct spatio-temporal locations $(s_1, t_1), \dots, (s_n,t_n) \in \mathcal{S}\times \mathcal{T} \subseteq \mathbb{R}^2 \times \mathbb{R}$ that may include repeated measurements at the same location or simultaneous measurements at multiple spatial locations. Often, one is interested in modelling $Z$ from the sample $\mathbf{z}$ in order to predict at unobserved locations in space and time or simulate from the conditional distribution. Across our domain of interest $\mathcal{S} \times \mathcal{T}$, we assume the random field $Z$ to be stationary and spatially isotropic. Hence, the field can be characterised through a mean $\mu$ and a covariance function $C_{\rm st}$ where the spatio-temporal covariance only depends on the separating distances across space $h \in \mathbb{R}_{\geq 0}$ and time $u \in \mathbb{R}_{\geq 0}$. Note that extensions beyond this set-up can easily be derived as has been done for the pure spatial case using for instance universal kriging to overcome the stationarity of the mean. The general spatio-temporal covariance function is given by $C_{\rm st}(h,u) = {\rm Cov}\left(Z(s,t), Z(\tilde{s},\tilde{t})\right)$ for a separating spatial distance $h$ and temporal distance $u$ and any pair of points $(s,t), (\tilde{s},\tilde{t}) \in \mathcal{S}\times\mathcal{T}$ with $||s-\tilde{s}||=h$ and $|t-\tilde{t}|=u$. In general, this covariance function is hard to estimate but a couple of models using simplifying assumptions will be presented in the following together with their spatio-temporal variograms $\gamma_{\rm st}(h,u) = C_{\rm st}(0,0)-C_{\rm st}(h,u)$ and encoding in \pkg{gstat}. Given a valid covariance function, the covariance matrices used in the linear predictor are easily obtained and the same algebraic operations as in the well known spatial case yield predictions of the desired random field \citep{Cressie2011}. A major difference is, however, the computational complexity of the matrix inversion. Typically, observations are made at a rather high temporal frequency leading to a number of spatio-temporal locations that is too large for global kriging. Hence, interpolation based on a selected neighbourhood of a subset of all data points becomes beneficial. Additionally, this relaxes the assumption of stationarity, as smooth variations in the mean value across the domain can be respected. The related class of dynamic models also addresses the computational complexity resulting in a temporal Markov structure. Implementations can be found in \CRANpkg{spTimer} by \citet{bakar2015}, \CRANpkg{spBayes} by \citet{finley2015}, \CRANpkg{spate} by \citet{sigrist2015} or \pkg{INLA} by \citet{lindgren2015}. \subsection{Covariance models} The covariance models implemented in \pkg{gstat} and presented in this paper are introduced in the following. Besides further extensions we focus on the basic classes of the \emph{separable}, \emph{product-sum}, \emph{metric} and \emph{sum-metric} spatio-temporal covariance functions. The building blocks (in the following denoted as \code{spatialVgm}, \code{temporalVgm} or \code{jointVgm}) of the spatio-temporal covariance functions are any of the purely spatial variogram models already available in \pkg{gstat}. Each one of the building blocks is created by a call of the function \code{gstat::vgm()}. Remaining arguments such as \code{sill} (the joint sill), \code{nug} (the joint nugget component) or \code{stAni} (the spatio-temporal anisotropy used in the \code{jointVgm}) are scalars and refer to parameters of the entire spatio-temporal covariance function: \begin{enumerate}[a)] \item The \dfn{separable covariance model} assumes that the spatio-temporal covariance function can be represented as the product of a spatial and temporal term: $$C_{\rm sep}(h,u)=C_{\rm s}(h)C_t(u)$$ Its variogram is given by (see Appendix for details): $$\gamma_{\rm sep}(h,u) = {\rm sill} \cdot \left( \bar{\gamma}_s(h)+\bar{\gamma}_t(u)-\bar{\gamma}_s(h)\bar{\gamma}_t(u) \right)$$ where $\bar{\gamma}_s$ and $\bar{\gamma}_t$ are standardised spatial and temporal variograms with separate nugget effects and (joint) sill of 1. The overall sill parameter is denoted by "sill". The R package \pkg{gstat} encodes this model as: \code{vgmST("separable", space = spatialVgm, time = temporalVgm, sill = sill)} The separable model has a strong computational advantage in the setting where each spatial location has an observation at each temporal instance (a \code{"STFDF"} without \samp{NA}s, \cite{Pebesma2012}). In these cases, the covariance matrix (and its inverse) can be composed using the Kronecker-product of the purely spatial and purely temporal covariance matrices (respectively their inverse). \item The above model extends to the \dfn{product-sum covariance model} that we give here in a slightly different notation as \citet{DeCesare2001} and \citet{DeIaco2001} by $$C_{\rm ps}(h,u)=k C_{\rm s}(h)C_{\rm t}(u) + C_{\rm s}(h) + C_{\rm t}(u)$$ with $k > 0$. The corresponding variogram can be written as $$\gamma_{\rm ps}(h,u) = \left(k \cdot {\rm sill}_{\rm t} + 1\right) \gamma_{\rm s}(h) + \left(k \cdot {\rm sill}_{\rm s} + 1\right) \gamma_{\rm t}(u) - k \gamma_{\rm s}(h) \gamma_{\rm t}(u)$$ where ${\gamma}_{\rm s}$ and $\gamma_{\rm t}$ are spatial and temporal variograms (see Appendix for details). The parameter $k$ needs to be positive and the following identity defines the overall sill (${\rm sill}_{\rm st}$) of the model in terms of the model's spatial and temporal sills: $${\rm sill}_{\rm st} = k \cdot {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} + {\rm sill}_{\rm s} + {\rm sill}_{\rm t}$$ The above equation can also be used to estimate $k$ based on the three sill values. An alternative formulation of the product-sum variogram can be found in \citet{DeIaco2001}. The \pkg{gstat} definition of this model reads: \begin{example*} vgmST("productSum", space = spatialVgm, time = temporalVgm, k = k) \end{example*} \item Assuming identical spatial and temporal covariance functions except for spatio-temporal anisotropy, allows to use a spatio-temporal \dfn{metric covariance model} where, after matching space and time by an anisotropy correction $\kappa$ (\code{stAni}), the spatial, temporal and spatio-temporal distances are treated equally resulting in a single covariance model $C_{\rm joint}$: $$C_{\rm m}(h,u)=C_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ The variogram evaluates to $$ \gamma_{\rm m} (h,u) = \gamma_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right) $$ where $\gamma_{\rm joint}$ (\code{jointVgm}) is any known variogram that may include a nugget effect. The following line generates the model in \pkg{gstat}: \begin{example*} vgmST("metric", joint = jointVgm, stAni = stAni) \end{example*} The spatio-temporal anisotropy parameter $\kappa$ (\code{stAni}) is given as spatial unit per temporal unit. In many cases, this will be in m/second, as these are the base units in our implementation. All temporal distances are hence internally re-scaled to an equivalent spatial distance using \code{stAni} and treated as metric 3D-space. \item A combination of spatial, temporal and a metric model including an anisotropy parameter $\kappa$ is found in \citet{Bilonick1988} and revisited by \citet{Snepvangers2003} as the \dfn{sum-metric covariance model}: $$C_{\rm sm}(h,u)=C_{\rm s}(h)+C_{\rm t}(u)+C_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ This model allows for spatial, temporal and joint nugget effects. Thus, the variogram is given by $$ \gamma_{\rm sm}(h,u)= \gamma_{\rm s}(h) + \gamma_{\rm t}(u) + \gamma_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ where $\gamma_{\rm s}$, $\gamma_{\rm t}$ and $\gamma_{\rm joint}$ are spatial, temporal and joint variograms with separate nugget-effects. This model can be defined in \pkg{gstat} through: \begin{example*} vgmST("sumMetric", space = spatialVgm, time = temporalVgm, joint = jointVgm, stAni = stAni) \end{example*} \item A simplified version of the above model is to restrict the spatial, temporal and joint variograms to nugget free models. Additionally, a single spatio-temporal nugget is introduced and the variogram takes the representation: $$\gamma_{\rm ssm}(h,u) = {\rm nug}\cdot {\bf1}_{h>0 \vee u>0} + \gamma_{\rm s}(h) + \gamma_{\rm t}(u) + \gamma_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ The \dfn{simple sum-metric covariance model} can be obtained by: \begin{example*} vgmST("simpleSumMetric", space = spatialVgm, time = temporalVgm, joint = jointVgm, nugget = nug, stAni = stAni) \end{example*} \end{enumerate} \noindent Note that the above mentioned spatial, temporal and joint components of the spatio-temporal covariance and variogram models need not necessarily exhibit the same structure. Taking for instance the product-sum and sum-metric models that both contain single temporal and spatial variogram models: the best fits of the respective spatio-temporal models might suggest different variogram families and parameters for the pure spatial and temporal ones. This is due to the target of finding the best overall variogram surface resulting in (potentially) different marginal models. \subsection{Parameter estimation} Fitting routines for the above variogram models are implemented in \pkg{gstat} through the function \code{fit.StVariogram()}, which calls \code{optim()} from the R core package \pkg{stats}. Additional parameters to improve the numerical optimisation can be provided to \code{fit.StVariogram()} and will be passed on to \code{optim()} (using R's three-dots mechanism). As some of the parameters are limited to certain ranges (nuggets need to be non-negative, ranges must be positive), it is advised to use an optimisation routine that allows to impose limits on the search space (i.e.\ \code{L-BFGS-B}) and provide sensible limits via \code{lower} and \code{upper}. By default, the method \code{L-BFGS-B} is called and the smallest lower and largest upper bounds supported by the model are given. The estimation of the spatio-temporal variogram models relies on a sample variogram empirically derived from the data. In contrast to the spatial variogram line, the spatio-temporal variogram is represented by a surface for lag classes composed of a spatial and temporal separation distance. Different from the spatial case, a spatio-temporal sample variogram contains lag-classes of zero spatial separation describing pure temporal dependencies. Without duplicate observations, no estimates can be made for the lag-class with both zero spatial and zero temporal separation. The sample variogram is calculated through the function \code{variogram()} that dispatches the call for spatio-temporal data objects (of class \code{"STFDF"}, \code{"STSDF"}, or \code{"STIDF"}) from \pkg{spacetime}. For a visual judgement of the fit between sample and fitted variograms the \code{plot()} function can be called to show the variogram surfaces next to each other as coloured level plots. Alternatively, a wireframe plot is obtained by setting the parameter \code{wireframe = TRUE} (Figure~\ref{fig:allVgmsWireframe}). A further option is to plot the differences between the sample and model variogram surfaces by setting \code{diff = TRUE}, see Figure~\ref{fig:allVgmsDiffWireframe}. Additionally to visual comparison, \code{fit.StVariogram()} provides the output of \code{optim} as attribute \code{optim.out} of the returned S3-class \code{"StVariogram"}. This attribute includes valuable information to diagnose the success of the \code{optim} routine. It contains for instance the convergence code (\code{\$convergence}) or message (\code{\$message}) and the optimised value (\code{\$value}), which is the mean of the (weighted) squared deviations between sample and fitted variogram surface. Furthermore, it is advised to check the estimated parameters against the parameter boundaries and starting values. Additionally, starting values might also influence the success and result of the optimisation, as local optima may occur due to the interdependence of the parameters. Alternatively, the user might want to start a grid search in order to better asses the sensitivity of the estimates. The fitting approach is identical for all covariance models. However, with the flexibility of the model also the number of parameters increases, making a numerical estimation at times cumbersome. Starting values can in most cases be read from the sample variogram. Parameters of the spatial and temporal variograms can be assessed from the spatio-temporal surface fixing the counterpart at 0. The overall spatio-temporal sill including the nugget can be deducted from the plateau that a nicely behaving sample variogram reaches for 'large' spatial and temporal distances. An important issue is the potentially different orders of magnitude of the parameters. It is at times advisable to rescale spatial and temporal distances to ranges similar to the ones of sills and nuggets using the parameter \code{parscale}. \code{parscale} needs to be provided via \code{control = list(parscale=\dots)} and holds a vector of the same length as the number of parameters to be optimised (see the documentation of \code{optim} for further details). \begin{table} \center \caption{List of implemented weighting schemes for variogram optimisation. Methods 3, 4, and 5 are kept for compatibility reasons with the purely spatial \code{fit.variogram} function. The following notation is used: $N_j$ number of pairs, $h_j$ mean spatial distance and $u_j$ mean temporal distance for each bin $j$, $\gamma$ the actual proposed variogram model and \code{stAni} a spatio-temporal anisotropy scaling.}\label{tab:weighting} {\small \begin{tabular}{ll} \toprule \code{fit.method} & weights \\ \midrule 0 & no fitting\\ 1 and 3 & $N_j$ \\ 2 and 4 & $N_j/\gamma\left(h_j, u_j\right)^2$ \\ 5 & reserved for REML \\ 6 & 1, no weighting\\ 7 & $N_j/\left(h_j^2 + {\rm stAni}^2\cdot u_j^2\right)$ \\ 8 & $N_j/h_j^2$ \\ 9 & $N_j/u_j^2$ \\ 10 & $1/\gamma\left(h_j,u_j\right)^2$ \\ 11 & $1/\left(h_j^2 + {\rm stAni}^2\cdot u_j^2\right)$ \\ 12 & $1/h_j^2$ \\ 13 & $1/u_j^2$ \\ \bottomrule \end{tabular}} \end{table} Currently, the implemented fitting routines are based on the (weighted) mean squared difference between model and sample variogram surfaces. By default, all values are associated the same weight (\code{fit.method = 6}), but other options are available that allow for different weighting schemes based on the number of pairs, spatial, temporal and spatio-temporal distances or the variogram's value. Table~\ref{tab:weighting} lists all currently implemented options. Depending on the target neighbourhood size of the desired interpolation, it might be beneficial to narrow down the spatial and temporal distances and to introduce a cutoff. This ensures that the model is fitted to the differences over space and time actually used in the interpolation, and reduces the risk of overfitting the variogram model to large distances not used for prediction. Please note that methods 2 and 10 (Table~\ref{tab:weighting}) involve weights based on the fitted variogram that might lead to bad convergence properties of the parameter estimates. Furthermore, the scalar \code{stAni} in methods 7 and 11 will either be the actual fitted spatio-temporal anisotropy if it is included in the model or a fixed value that has to be passed as \code{stAni} by the user to \code{fit.StVariogram}. The latter is advised, as the former might lead to bad convergence properties as in the case of weights based on the fitted variogram mentioned above. As the estimation of an anisotropy scaling might be cumbersome on a visual basis, we provide the function \code{estiStAni} that provides estimates based on the empirical spatio-temporal variogram. Four heuristics are available based on (i) rescaling a linear model (\code{linear}), (ii) estimating equal ranges (\code{range}), (iii) rescaling a pure spatial variogram (\code{vgm}) or (iv) estimating a complete spatio-temporal metric variogram model and returning its spatio-temporal anisotropy parameter (\code{metric}). The choice of the weighting scheme will influence the selected model and different weightings might be further assessed in a cross-validation of the selected model. To increase numerical stability, it is advisable to use weights that do not change with the current model fit. \subsection{Kriging} Standard kriging (\code{krigeST}) and trans Gaussian kriging (\code{krigeSTTg}) have been implemented. As spatio-temporal kriging based on the complete data set might be too computationally expensive, local kriging is an attractive alternative. This poses the question of how to select the "nearest" neighbours from the spatio-temporal space $\mathcal{S}\times\mathcal{T}$. A natural choice would be to select the spatio-temporal locations exhibiting the strongest correlation to the unobserved location. Depending on the spatio-temporal covariance model, the relation between spatial and temporal distance in determining the strength of correlation will vary. As a proxy, we use a spatio-temporal anisotropy parameter that relates spatial and temporal distances in the same manner as in the metric covariance models. The k-nearest neighbours within this metric spatio-temporal space $\mathcal{S}\times\mathcal{T}$ are selected using the R package \CRANpkg{FNN} \citep{Beygelzimer2013}. The interpolation performs iteratively for each spatio-temporal prediction location with a local subset of the data set. Without neighbourhood selection, kriging uses all data. As the metric induced by the spatial and rescaled temporal distances are only proxies to the strength of correlation between locations (see Figure~\ref{fig:vgmVsDist}), we provide an option to search a larger metric neighbourhood. Within this larger neighbourhood, the covariance function is evaluated for all spatio-temporal locations and the neighbouring locations with the largest covariance values are then selected for prediction. However, this approach might still suffer from a clustering of locations and alternatives such as a staged search (find spatial neighbours first and select a set of temporal instances for each spatial neighbour) or an octant search (select neighbours per spatial quadrant from preceding and following time stamps separately) could be considered. However, these alternatives are not yet available in \pkg{gstat}. \begin{figure} \centering \includegraphics[width=0.9\textwidth]{vgmVsMetricDist.png} \caption{A contourplot showing how the spatio-temporal sum-metric variogram model (as estimated in the application below) and a metric distance relate to each other. Distances are rescaled by 1/5 for easy plotting.}\label{fig:vgmVsDist} \end{figure} \section{Application and illustration}\label{sec:data} The data set used is taken from AirBase\footnote{\href{https://www.eea.europa.eu/data-and-maps/data/airbase-the-european-air-quality-database-6}{AirBase - The European air quality database}}, the air quality data base for Europe provided by the European Environmental Agency (EEA). We focus on a single air quality indicator, particulate matter with a diameter less than 10~$\mu\rm m$, measured at rural background stations for 2005 (${\rm PM}_{10}$). The data base contains data for many years. Besides rural, also urban areas are monitored and not only at background locations (e.g.\ traffic stations). However, these processes are considered to be of a different nature and should be treated separately. As a use case, we therefore limit our data set to the rural background stations in Germany. Figure \ref{fig:dailyMeans} shows for 8 randomly chosen days daily mean values of ${\rm PM}_{10}$ concentrations for the entire monitoring network over Germany in 2005 with 69 rural background stations. \begin{figure} \centering \includegraphics[width=0.95\textwidth]{daily_means_PM10.png} \caption{Daily mean $\rm{PM}_{10}$ concentration $[\mu\rm{g/m}^3]$ at 8 randomly selected days in 2005.}\label{fig:dailyMeans} \end{figure} In order to fit a spatio-temporal model to the air quality data set, the empirical variogram surface is computed and used as input for the fitting routines of the different models. The empirical variogram is based on spatio-temporal bins that span regularly over space and time. Regular measurements over time (i.e.\ hourly, daily) motivate regular binning intervals of the same temporal resolution. Nevertheless, flexible binning boundaries can be passed for spatial and temporal dimensions. This allows for instance to use smaller bins at small distances and larger ones for large distances. Temporal boundaries, instead of lags, are required when the sampling of the data is non-regular. In cases where regular temporal observations can be assumed, this is utilised in the sample variogram calculations and any two temporal consecutive observations are assumed to have the same temporal distance. Figure~\ref{fig:allVgmsWireframe} shows the empirical variogram along with the proposed best fitting model of each spatio-temporal variogram family as perspective wireframe plots. In order to better identify structural shortcomings of the selected model, a difference plot (Figure~\ref{fig:allVgmsDiffWireframe}) is a helpful visual diagnostic plot. Beyond the selection of the spatio-temporal variogram family, each component of this model can be chosen from any implemented one-dimensional variogram. In Table~\ref{tab:vgmFits} a selection of fitted models in terms of their residuals compared to the sample variogram surface are shown. The best fitting spatio-temporal model of each family is given as: \begin{enumerate}[a)] \item separable model (weighted MSE: 6.82): \nopagebreak \begin{tabular}{l|rlrlrr} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & sp.-temp. sill \\ \midrule space & 0.86 & Exp & 558 & \hspace{-2\tabcolsep}~km & 0.14 & \multirow{2}{*}{124} \\ time & 1.00 & Sph & 5.6 & \hspace{-2\tabcolsep}~days & 0.00 & \\ \bottomrule \end{tabular} obtained via: \begin{example*} separableModel <- vgmST("separable", space = vgm(0.9, "Exp", 200, 0.1), time = vgm(0.9, "Sph", 3.5, 0.1), sill = 124) fit.StVariogram(empVgm, separableModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(100, 1, 10, 1, 100)), lower = c(10, 0, 0.1, 0, 0.1), upper = c(2000, 1, 12, 1, 200)) \end{example*} \item product-sum model (weighted MSE: 6.91) \nopagebreak \begin{tabular}{l|rlrlrc} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & k\\ \midrule space & 6.8 & Exp & 542 & \hspace{-2\tabcolsep}~km & 1.2 & \multirow{2}{*}{1.61} \\ time & 8.7 & Sph & 5.5 & \hspace{-2\tabcolsep}~days & 0.0 & \\ \bottomrule \end{tabular} obtained via \begin{example*} prodSumModel <- vgmST("productSum", space = vgm(10, "Exp", 200, 1), time = vgm(10, "Sph", 2, 1), k=2) fit.StVariogram(empVgm, prodSumModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(1, 10, 1, 1, 0.1, 1, 10)), lower = rep(0.0001, 7)) \end{example*} \item metric model (weighted MSE: 10.05) \nopagebreak \begin{tabular}{l|rlrlrrl} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & \multicolumn{2}{c}{anisotropy}\\ \midrule joint & 123.4 & ${\rm Mat}_{\kappa=0.6}$ & 453 & \hspace{-2\tabcolsep}~km & 17.4 & 189 & \hspace{-2\tabcolsep}~km/day \\ \bottomrule \end{tabular} obtained via \begin{example*} metricModel <- vgmST("metric", joint = vgm(60, "Mat", 150, 10, kappa = 0.6), stAni = 60) fit.StVariogram(empVgm, metricModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(10, 20, 5, 10)), lower = c(80, 50, 5, 50), upper = c(200, 1500, 60, 300)) \end{example*} \item\label{bestfit} sum-metric model (weighted MSE: 3.31) \nopagebreak \begin{tabular}{l|rlrlrrl} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & \multicolumn{2}{c}{anisotropy}\\ \midrule space & 16.4 & Sph & 67 & \hspace{-2\tabcolsep}~km & 0 & & \\ time & 9.3 & Exp & 0.9 & \hspace{-2\tabcolsep}~days & 0 & & \\ joint & 91.5 & Sph & 999 & \hspace{-2\tabcolsep}~km & 7.3 & 185 & \hspace{-2\tabcolsep}~km/day \\ \bottomrule \end{tabular} obtained via \begin{example*} sumMetricModel <- vgmST("sumMetric", space = vgm(20, "Sph", 150, 1), time = vgm(10, "Exp", 2, 0.5), joint = vgm(80, "Sph", 1500, 2.5), stAni = 120) fit.StVariogram(empVgm, sumMetricModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(1, 100, 1, 1, 0.5, 1, 1, 100, 1, 100), maxit=10000), lower = c(sill.s = 0, range.s = 10, nugget.s = 0, sill.t = 0, range.t = 0.1, nugget.t = 0, sill.st = 0, range.st = 10, nugget.st = 0, anis = 40), upper = c(sill.s = 200, range.s = 1000, nugget.s = 20, sill.t = 200, range.t = 75, nugget.t = 20, sill.st= 200, range.st = 5000, nugget.st = 20, anis = 500)) \end{example*} \item simple sum-metric model (weighted MSE: 3.31) \nopagebreak \begin{tabular}{l|rlrlrlc} \toprule & partial sill & model & \multicolumn{2}{c}{range} & \multicolumn{2}{c}{anisotropy} & sp.-temp. nugget \\ \midrule space & 16.4 & Sph & 67 & \hspace{-2\tabcolsep}~km & & & \multirow{3}{*}{$\Bigg\}$ 7.3} \\ time & 9.3 & Exp & 0.9 & \hspace{-2\tabcolsep}~days & & & \\ joint & 91.5 & Sph & 999 & \hspace{-2\tabcolsep}~km & 185 & \hspace{-2\tabcolsep}~km/day & \\ \bottomrule \end{tabular} obtained via \begin{example*} simpleSumMetricModel <- vgmST("simpleSumMetric", space=vgm(120, "Sph", 150), time =vgm(120, "Exp", 10), joint=vgm(120, "Sph", 150), nugget = 10, stAni = 150) fit.StVariogram(empVgm, simpleSumMetricModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(1, 10, 1, 1, 1, 100, 1, 10)) lower = c(sill.s = 0, range.s = 10, sill.t = 0, range.t = 0.1, sill.st= 0, range.st= 10, nugget = 0, anis = 40), upper = c(sill.s = 200, range.s = 500, sill.t = 200, range.t = 20, sill.st= 200, range.st = 5000#, nugget = 100, anis = 1000)) \end{example*} \end{enumerate} The variogram parameters are numerically optimised using the function \code{fit.StVariogram} and the \code{L-BFGS-B} routine of \code{optim}. The parameter \code{fit.method} that controls the weighing of the residuals between empirical and model surface of \code{fit.StVariogram} is set to \code{7} (the spatio-temporal analog to the commonly used spatial weighting). A full list of all weighting schemes is presented in Table~\ref{tab:weighting}. In our application, the residuals are multiplied by the number of pairs in the corresponding spatio-temporal bin divided by the metric distance: $N_j/(h_j^2 + {\rm stAni}^2\cdot u_j^2)$. The spatio-temporal anisotropy is estimated beforehand and fixed at 118~km/day. This weighting scheme puts higher confidence in lags filled with many pairs of spatio-temporal locations, but respects to some degree the need of an accurate model for short distances, as these short distances are the main source of information in the prediction step. Note, that different weighting schemes will in general result in different model parameters generating different interpolation values. Our selection is based on the assumption that well filled bins provide more reliable empirical variogram estimates and the fact that short distances are the most important ones for a local interpolation. \begin{table}[t!] \centering \caption{Weighted MSE (\code{fit.method = 7, see Table~\ref{tab:weighting}}) for different spatio-temporal variogram families and different choices for the one-dimensional variogram components. Columns denote the spatial and temporal variogram choices. The metric model is only applicable if both domains use the same family.}\label{tab:vgmFits} \begin{tabular}{ll|rrrrr} \toprule model & joint & Exp+Exp & Exp+Sph & Sph+Exp & Sph+Sph & ${\rm Mat}_{\kappa=0.6}$ \\ \midrule {separable} & $~~\cdot$ & 9.87 & \bf{6.82} & 10.42 & 7.50 & $\cdot~~$ \\ {product-sum} & $~~\cdot$ & 10.09 & \bf{6.91} & 10.64 & 7.59 & $\cdot~~$ \\ {metric} & $~~\cdot$ & 10.25 & $\cdot~~$ & $\cdot~~$ & 10.59 & \bf{10.05} \\ \multirow{2}{*}{sum-metric} & Exp & 4.10 & 3.60 & 3.89 & 3.32 & $\cdot~~$ \\ & Sph & 3.74 & 3.73 & \bf{3.31} & 3.36 & $\cdot~~$ \\ \multirow{2}{*}{simple sum-metric}& Exp & 4.10 & 3.60 & 3.94 & 3.32 & $\cdot~~$ \\ & Sph & 3.74 & 3.98 & \bf{3.31} & 3.56 & $\cdot~~$ \\ \bottomrule \end{tabular} \end{table} \begin{figure} \centering \includegraphics[width=0.95\textwidth]{allVgmsWireframe.png} \caption{Sample and the best fitting spatio-temporal variogram of each family.}\label{fig:allVgmsWireframe} \end{figure} \begin{figure} \centering \includegraphics[width=0.95\textwidth]{allVgmsDiffWireframe.png} \caption{Differences between the sample and the best fitting spatio-temporal variogram of each family.}\label{fig:allVgmsDiffWireframe} \end{figure} \begin{figure}[b!] \centering \includegraphics[width=0.95\textwidth]{pred_daily_means_PM10.png} \caption{Spatio-temporal interpolation of daily mean $\rm{PM}_{10}$ concentrations using the sum-metric covariance model with the closest 50 neighbouring spatio-temporal locations. The crosses indicate sampling locations. The cell size of the grid in UTM projection is $10~\rm{km}\times10~\rm{km}$.}\label{fig:pred_daily} \end{figure} For comparison with classical approaches, we interpolate across Germany iteratively for each single day using all available data for variogram estimation. The purely spatial empirical variogram can directly be obtained from the empirical spatio-temporal variogram, by fixing the temporal lag at 0 separation. From the same set of variogram models as investigated for the spatio-temporal models, the exponential model (partial sill:~66.5, range:~224~km, nugget:~13.5) is the best suited based on the optimisation criterion. Alternatively, we could have fitted the spatial variogram for each day separately using observations from that day only. However, given the small number of observation stations, this produced unstable variograms for several days and we decided to use the single spatial variogram derived from all spatio-temporal locations treating time slices as uncorrelated copies of the spatial random field. Once the best fitting spatio-temporal variogram model is identified, the interpolation can be executed with the help of the function \code{krigeST}. We use the sum-metric model that obtained the smallest RMSE (compare Table~\ref{tab:vgmFits}) to produce a gridded prediction. The interpolation domain consists of daily values for a regular grid spanning over Germany in UTM projection. The cell size is $10~\rm{km}\times10~\rm{km}$. Figure~\ref{fig:pred_daily} shows the interpolated grid for the same days as Figure~\ref{fig:dailyMeans} alongside with all sampling locations. Additionally, maps depicting the differences from a leave-one-out cross-validation are presented in Figure~\ref{fig:diffs_daily}. A time series view is presented in Figure~\ref{fig:timeseries} showing the observed and predicted time series at a single location along with its 95~\% prediction intervals. The interpolated maps are generated for a set of time stamps \code{tIDs} and a grid over Germany \code{DE\_pred} by \begin{example*} krigeST(PM10~1, data = DE_RB_2005[ , tIDS], newdata = DE_pred, fitSumMetricModel, nmax = 50, stAni = fitMetricModel$stAni/24/3600) \end{example*} \begin{figure}[t!] \centering \includegraphics[width=0.95\textwidth]{diffs_daily_means_PM10.png} \caption{Differences of spatio-temporal predictions and observed daily mean $\rm{PM}_{10}$ concentrations using the sum-metric covariance model with the closest (approx. strongest correlated) 50 neighbouring spatio-temporal locations.}\label{fig:diffs_daily} \end{figure} \begin{figure}[h!] \centering \includegraphics[width=0.9\textwidth]{singleStationTimeSeries.png} \caption{Subset of the time series of observed and predicted ${\rm PM}_{10}$ at a single station in Lower Saxony along with its 95~\% prediction intervals.}\label{fig:timeseries} \end{figure} To further compare the different approaches, a leave-one-out cross-validation was carried out. The spatio-temporal interpolations are done for the closest 50 and 10 neighbours assessing the impact of the neighbourhood size. Inspection of the ranges of the variograms in the temporal domain, suggests that any station more than at most 6 days apart does not meaningfully contribute. Furthermore, the local estimation allows the spatio-temporal random field to have a varying mean value over space and time. The purely spatial interpolation can be considered as the extreme temporally local case, where only observations from the same time instance are considered. \begin{table} \caption{Leave-one-out cross-validation results. The column wMSE refers to the optimised value from the variogram estimation.}\label{tab:cv} \centering \begin{tabular}{lrr|rrrr} \toprule covariance model & wMSE & neigh. & RMSE & MAE & ME & COR \\ \midrule pure Spatial & & 10 & 6.15 & 4.09 & -0.01 & 0.84 \\ separable &\hspace{-\tabcolsep}[6.82]& 10 & 6.08 & 4.04 & -0.01 & 0.84 \\ product-sum &\hspace{-\tabcolsep}[6.91]& 10 & 6.08& 4.04& -0.01 & 0.84 \\ metric &\hspace{-\tabcolsep}[10.05]& 10 & 6.11 & 4.07 & 0.03 & 0.84 \\ sum-metric &\hspace{-\tabcolsep}[3.31]& 10 & 6.16 & 4.08 & -0.06 & 0.84 \\ simple sum-metric &\hspace{-\tabcolsep}[3.31]& 10 & 6.14 & 4.08 & -0.02 & 0.84 \\ \midrule pure Spatial & & 50 & 6.10 & 4.07 & 0.00 & 0.84 \\ separable &\hspace{-\tabcolsep}[6.82]& 50 & 6.05 & 4.04 & 0.01 & 0.84 \\ product-sum &\hspace{-\tabcolsep}[6.91]& 50 & 6.05 & 4.04 & 0.00 & 0.84 \\ metric &\hspace{-\tabcolsep}[10.05]& 50 & 6.07 & 4.08 & 0.03 & 0.84 \\ sum-metric &\hspace{-\tabcolsep}[3.31]& 50 & 6.14 & 4.09 & -0.01 & 0.84 \\ simple sum-metric &\hspace{-\tabcolsep}[3.31]& 50 & 6.14 & 4.08 & -0.02 & 0.84 \\ \bottomrule \end{tabular} \end{table} \section{Results and discussion}\label{sec:resultsDiscuss} In terms of added value of spatio-temporal kriging measured in cross-validation results, Table~\ref{tab:cv} shows hardly any benefit in the illustrative example. This effect can to a large degree already be explained from the spatio-temporal variograms: a temporal lag of one or a few days leads already to a large variability compared to spatial distances of few hundred kilometres, implying that the temporal correlation is too weak to considerably improve the overall prediction. Nevertheless, investigating a process with a higher temporal frequency will likely show a stronger correlation in the temporal domain. Looking into station-wise cross-validation statistics (not shown), the four stations with an RMSE of 10 and larger correspond to the locations with the largest annual mean concentrations ($>22~\mu{\rm g}/{\rm m}^3$). The added value of spatio-temporal kriging lies in the flexibility of the model. We are now in the position to not only interpolate at unobserved locations in space, but also at unobserved time instances. This makes spatio-temporal kriging a suitable tool to fill gaps in time series not only based on the time series solely, but also including some of its spatial neighbours. A very irregular sampled data set would as well largely benefit from a spatio-temporal approach, as spatially close but unobserved locations in one time slice are not of any help in a purely spatial approach, but the spatio-temporal model would benefit from the observed value nearby at another time instance. In a completely regular data set, the distance to a spatio-temporal neighbour is at least as large as the pure spatial distance and hence the correlation is weaker. Furthermore, being able to capture the covariance structure over space and time might foster a better understanding of the process under study. While we see spatio-temporal modelling being a powerful tool, the cross-validation results in Table~\ref{tab:cv} show that spatio-temporal kriging will not solve the problem of all poorly spatially captured phenomena. Further preprocessing steps might be necessary to improve the modelling of this $\rm{PM}_{10}$ data set such as for instance a temporal AR-model followed by spatio-temporal residual kriging or using further covariates in a preceding (linear) modelling step. Providing the best possible model of $\rm{PM}_{10}$ concentrations across Germany was beyond the scope of this paper. The selection of a spatio-temporal covariance model should not only be made based on the (weighted) mean squared difference between the empirical and model variogram surfaces (presented in Table~\ref{tab:vgmFits}), but also on conceptional choices and visual (Figure~\ref{fig:allVgmsWireframe}) judgement of the fits. Even though the function \code{fit.StVariogram} provides optimisation routines to fit different spatio-temporal variogram models, the numerical routines in the background may struggle to find the optimal parameters. Besides the lower and upper boundaries of the parameter space, the control parameter \code{parscale} of the \code{optim} function is a valuable option to improve the convergence of the optimisation. With passing \code{parscale} as entry of the list \code{control} a vector of scalars must be passed that controls the different levels of magnitude of the variogram parameters. In most applications, a change of 1 in the sills will have a stronger influence on the variogram surface than a change of 1 in the ranges. The problem becomes more difficult with an increasing number of parameters. In our application, using the simple sum-metric model as starting values for the full sum-metric model improved the convergence speed of the more complex model. In the presented application, the sum-metric models turns out to be the same as the simple sum-metric model. While this might at first sight be due to using the simpler model to generate starting values, different non simplified starting models converged to the same result. Generally, it is important to keep in mind the strong interaction of the model parameters. It is typically not easy to distinguish how much of the spatio-temporal nugget and sill is attributed to spatial, temporal or joint components. In this paper we considered a joint numerical approach, but step-wise approaches where the components are estimated separately could as well be considered. The interested reader is also referred to \cite{Nash2014}. However, all optimisation approaches follow the premise that the studied process can be approximated with the given model and available data. If this premise fails, no optimal model can be selected. An extension towards a restricted maximum likelihood method (REML) to fit the spatio-temporal variogram model would be desirable, as it overcomes some of the above mentioned drawbacks of the method of moments based approaches and would additionally provide standard errors for the parameter estimates. A REML approach would allow to take into account that sample variogram values are correlated. However, for large datasets (as in the spatio-temporal case), it is computationally more feasible to use a least squares fitting. To reduce the correlation of the variogram values, some randomisation could be implemented in large data sets, to calculate the sample variogram based on partially overlapping or even disjoint sets of observations. The selected anisotropy as proxy to the relation of spatial and temporal distance in determining the strongest correlated neighbours might show a distortion for some models when only few neighbours are used towards the true set of the most correlated locations. However, this effect vanishes as soon as the spatio-temporal range of the model is sufficiently represented through the set of nearest neighbours. As mentioned by \cite{kj99}, an alternative to space-time kriging might be co-kriging. However, this is only feasible if the number of time replicates is (very) small, as the number of cross variograms to be modelled equals the number of {\em pairs} of time replicates. Also, co-kriging can only interpolate for these time slices, and not inbetween or beyond them. It does however provide prediction error covariances, which can help assessing the significance of estimated {\em change} parameters \citep{pe1,pe2}. Several of the space-time variograms presented here may be approximated by sets of direct variograms and cross-variograms. Fitting variogram models to sample space-time variograms is in our implementation done by \code{stats::optim}. Our example script uses method \code{L-BFGS-B} and provides upper and lower parameter boundaries, e.g.\ to make sure sill parameters do not become negative. There has been a lot of research in optimization since the methods in \code{optim}, some of which has been reported in the special issue of the Journal of Statistical Software \citep{optim}, and we do see potential to improve the options in this respect. The approximate selection of the most correlated neighbours solves the lack of a natural notion of a joint distance across space and time. However, other sampling properties might introduce a bias in the prediction. The prediction at an unobserved location with a cluster of observations at one side will be biased towards this cluster and neglect the locations towards the other directions. Similar as the quadrant search in the pure spatial case an octant wise search strategy for the local neighbourhood would solve this limitation. A simpler stepwise approach to define an $n$-dimensional neighbourhood might already be sufficient in which at first $n_s$ spatial neighbours and then from each spatial neighbour $n_t$ time instances are selected, such that $n_s \cdot n_t \approx n$. The presented example considers stationary random fields that are isotropic in space. Further extensions towards more sophisticated variogram estimations allowing also for spatial geometric anisotropy are desirable. One could for instance plot variogram maps for spatial separation in North and South direction for each temporal lag. However, the current implementation does not allow to use the anisotropy parameter \code{anis} of the pure spatial variogram definition. Nevertheless, a preliminary rescaling of coordinates would be a possible workaround. This route has for instance been taken by \citet{Gasch2015} performing 3D+T kriging . The soil profiles in their study show a clear difference in horizontal and vertical variography. To correct for this, the depth dimension of the data has been rescaled to correspond with the dimensions of the horizontal distances before hand. In the subsequent study, these pseudo 3D coordinates have been used to fit the spatio-temporal variograms and perform kriging. The code in model definitions is meant to be kept both flexible and simple. This is based on i) re-producing the notion of the geostatistical models in the R code and in ii) reusing existing definitions and functions of the pure spatial cases that have been available for many years in \pkg{gstat}. The data handling benefits to a large degree from the implementations in the \pkg{spacetime} R package. \section{Conclusions}\label{sec:conclusions} The spatio-temporal extensions to \pkg{gstat} allow to model a set of spatio-temporal covariance functions. The implemented functionality eases estimation, visualisation and understanding of spatio-temporal covariance functions. The extension and reuse of already available function structures and nomenclature facilitates an easy translation of spatial workflows to handle spatio-temporal data. The numerical estimation of the variogram parameters might be tricky and needs a large degree of the users attention. It is advised to carefully check the outcome of the \code{optim} routine after optimisation. Spatio-temporal kriging predictions can be made in a global and a local neighbourhood set-up, while the latter will be the preferred solution for most spatio-temporal data sets and common computer hardware configurations. Spatio-temporal covariance structures carry valuable information, but a spatio-temporal model is not guaranteed to outperform pure spatial predictions. The benefit in terms of prediction quality of spatio-temporal kriging becomes only apparent if sufficiently strong correlated locations are added with the temporal dimension (i.e.\, if the model permits strong correlation across time). Nevertheless, the spatio-temporal covariance model might be of interest in itself. Besides some publications where the authors of this paper were involved in, such as \cite{Kilibarda2014}, the software presented here has proven useful in several independent publications, examples of which are \citep{marek, biondi, hu, yoon}. \section{Acknowledgements} This research has partly been funded by the German Research Foundation (DFG) under project number PE 1632/4-1. We thank two anonymous reviewers for their valuable comments. \bibliography{spatio-temporal-kriging} \pagebreak \address{Benedikt Gr{\"a}ler\\ Institute for Geoinformatics, University of M{\"u}nster\\ Heisenbergstr. 2, 48149, M{\"u}nster\\ Germany}\\ \email{ben.graeler@uni-muenster.de} \address{Edzer Pebesma\\ Institute for Geoinformatics, University of M{\"u}nster\\ Heisenbergstr. 2, 48149, M{\"u}nster\\ Germany}\\ \email{edzer.pebesma@uni-muenster.de} \address{Gerard Heuvelink\\ Department of Environmental Sciences, Wageningen University\\ PO Box 47, 6700AA, Wageningen\\ The Netherlands}\\ \email{gerard.heuvelink@wur.nl} \section{Appendix} \subsection{Derivation of the separable covariance and variogram identities}\label{sec:derivSep} The separable covariance and variogram identity is readily available through \begin{align*} C_{\rm sep}(h,u) &= C_{\rm s}(h)C_{\rm t}(u) = sill \cdot \bar{c}_s(h)\bar{c}_t(u) \\ \gamma_{\rm sep}(h,u) &= C_{\rm sep}(0,0) - C_{\rm sep}(h,u) \\ &= sill \left(1- \bar{c}_s(h) \cdot \bar{c}_t(u) \right) \\ &= sill \left(1- \left(1-\bar{\gamma}_s(h)\right)\left(1-\bar{\gamma}_t(u)\right) \right) \\ &= sill \left(1- \left(1-\bar{\gamma}_s(h) -\bar{\gamma}_t(u) + \bar{\gamma}_s(h)\bar{\gamma}_t(u)\right) \right) \\ &= sill \left(\bar{\gamma}_s(h) + \bar{\gamma}_t(u) - \bar{\gamma}_s(h)\bar{\gamma}_t(u)\right) \end{align*} where $\bar{c}$ and $\bar{\gamma}$ are normalised correlation and correlogram functions respectively. \subsection{Derivation of the product-sum covariance and variogram identities}\label{sec:derivPs} The product-sum covariance and variogram identity is readily available through: \begin{align*} C_{\rm ps}(h,u) = & \ k \cdot C_{\rm s}(h)C_{\rm t}(u) + C_{\rm s}(h) + C_{\rm t}(u) \\ \gamma_{\rm ps}(h,u) = & \ C_{\rm ps}(0,0) - C_{\rm ps}(h,u) \\ = & \ k \cdot C_{\rm s}(0)C_{\rm t}(0) + C_{\rm s}(0) + C_{\rm t}(0) \\ & - \left(k \cdot C_{\rm s}(h)C_{\rm t}(u) + C_{\rm s}(h) + C_{\rm t}(u)\right) \\ = & \ k \cdot {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} + {\rm sill}_{\rm s} + {\rm sill}_{\rm t} \\ & - k \cdot \left[ \left({\rm sill}_{\rm s} - \gamma_{\rm s}(h)\right)\left({\rm sill}_{\rm t} - \gamma_{\rm t}(u)\right)\right] - \left({\rm sill}_{\rm s} - \gamma_{\rm s}(h)\right) - \left({\rm sill}_{\rm t} - \gamma_{\rm t}(u)\right) \\ = & \ k \cdot {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} + {\rm sill}_{\rm s} + {\rm sill}_{\rm t} \\ & - k \cdot \left[ {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} - {\rm sill}_{\rm s} \cdot \gamma_{\rm t}(u) - {\rm sill}_{\rm t} \cdot \gamma_{\rm s}(h) + \gamma_{\rm s}(h) \gamma_{\rm t}(u) \right] \\ & - {\rm sill}_{\rm s} + \gamma_{\rm s}(h) - {\rm sill}_{\rm t} + \gamma_{\rm t}(u) \\ = & \ k \cdot {\rm sill}_{\rm t} \gamma_{\rm s}(h) + k \cdot {\rm sill}_{\rm s} \gamma_{\rm t}(u) - k \gamma_{\rm s}(h) \gamma_{\rm t}(u) + \gamma_{\rm s}(h) + \gamma_{\rm t}(u) \\ = & \ (k \cdot {\rm sill}_{\rm t} + 1) \gamma_{\rm s}(h) + (k \cdot {\rm sill}_{\rm s} + 1) \gamma_{\rm t}(u) - k \gamma_{\rm s}(h) \gamma_{\rm t}(u) \end{align*} %%%%%%%%%% \end{document} gstat/inst/doc/gstat.Rnw0000644000176200001440000003154015060550314014732 0ustar liggesusers%% Document started, Sat Jul 3 19:30:52 CEST 2004, my 37th birthday, %% while being stuck for 24 hours at Philadelphia airport, on my way %% back from the joint TIES/Accuracy 2004 symposium in Portland, ME. %% Continued, Oct 28, during the Apmosphere mid-term review. Oh, shame. % \VignetteIndexEntry{ The meuse data set: a tutorial for the gstat R package } \documentclass[a4paper]{article} \usepackage{hyperref} \newcommand{\code}[1]{{\tt #1}} \SweaveOpts{echo=TRUE} \title{The meuse data set: a brief tutorial\\ for the {\tt gstat} R package } \author{\href{mailto:edzer.pebesma@uni-muenster.de}{Edzer Pebesma}} \date{\today} \begin{document} \maketitle \section{Introduction} The \code{meuse} data set provided by package \code{sp} is a data set comprising of four heavy metals measured in the top soil in a flood plain along the river Meuse, along with a handful of covariates. The process governing heavy metal distribution seems that polluted sediment is carried by the river, and mostly deposited close to the river bank, and areas with low elevation. This document shows a geostatistical analysis of this data set. The data set was introduced by Burrough and McDonnell, 1998. This tutorial introduced the functionality of the R package \code{gstat}, used in conjunction with package \code{sp}. Package \code{gstat} provides a wide range of univariable and multivariable geostatistical modelling, prediction and simulation functions, where package \code{sp} provides general purpose classes and methods for defining, importing/exporting and visualizing spatial data. \section{R geostatistics packages} Package \code{gstat} (Pebesma, 2004) is an R package that provides basic functionality for univariable and multivariable geostatistical analysis, including \begin{itemize} \item variogram modelling, residual variogram modelling, and cross variogram modelling using fitting of parametric models to sample variograms \item geometric anisotropy specfied for each partial variogram model \item restricted maximum likelihood fitting of partial sills \item variogram and cross variogram maps \item simple, ordinary, universal and external drift (co)kriging \item (sequential) Gaussian (co)simulation equivalents for each of the kriging varieties \item indicator (co)kriging and sequential indicator (co)simulation \item kriging in a local or global neighbourhood \item block (co)kriging or simulation for each of the varieties, for rectangular or irregular blocks \end{itemize} Other geostatistical packages for R usually lack part of these options (e.g. block kriging, local kriging, or cokriging) but provide others: e.g. package \code{geoR} and \code{geoRglm} (by Paulo Ribeiro and Ole Christensen) provide the model-based geostatistics framework described in Diggle et al. (1998), package \code{fields} (Doug Nychka and others) provides thin plate spline interpolation, covariance functions for spherical coordinates (unprojected data), and routines for spatial sampling design optimization. \section{Spatial data frames} As an example, we will look at the meuse data set, which is a regular data frame that comes with package \code{gstat} (remove the 88 from the colour strings to make a plot without alpha transparency on windows or X11): <>= library(sp) data(meuse) class(meuse) names(meuse) coordinates(meuse) = ~x+y class(meuse) summary(meuse) coordinates(meuse)[1:5,] bubble(meuse, "zinc", col=c("#00ff0088", "#00ff0088"), main = "zinc concentrations (ppm)") @ % the following is needed because lattice plots (bubble wraps xyplot) do not % show without an explicit print; in order not to confuse users, we hide this: <>= print(bubble(meuse, "zinc", col=c("#00ff0088", "#00ff0088"), main = "zinc concentrations (ppm)") ) @ and note the following: \begin{enumerate} \item the function \code{coordinates}, when assigned (i.e. on the left-hand side of an \verb|=| or \verb|<-| sign), promotes the \code{data.frame} meuse into a \code{SpatialPointsDataFrame}, which knows about its spatial coordinates; coordinates may be specified by a formula, a character vector, or a numeric matrix or data frame with the actual coordinates \item the function \code{coordinates}, when not assigned, {\em retrieves} the spatial coordinates from a \code{SpatialPointsDataFrame}. \item the two plotting functions used, \code{plot} and \code{bubble} assume that the $x$- and $y$-axis are the spatial coordinates. \end{enumerate} \section{Spatial data on a regular grid} <>= data(meuse.grid) summary(meuse.grid) class(meuse.grid) coordinates(meuse.grid) = ~x+y class(meuse.grid) gridded(meuse.grid) = TRUE class(meuse.grid) image(meuse.grid["dist"]) title("distance to river (red = 0)") library(gstat) zinc.idw = idw(zinc~1, meuse, meuse.grid) class(zinc.idw) spplot(zinc.idw["var1.pred"], main = "zinc inverse distance weighted interpolations") @ <>= print(spplot(zinc.idw["var1.pred"], main = "zinc inverse distance weighted interpolations")) @ If you compare the bubble plot of zinc measurements with the map with distances to the river, it becomes evident that the larger concentrations are measured at locations close to the river. This relationship can be linearized by log-transforming the zinc concentrations, and taking the square root of distance to the river: <>= plot(log(zinc)~sqrt(dist), meuse) abline(lm(log(zinc)~sqrt(dist), meuse)) @ \section{Variograms } Variograms are calculated using the function \code{variogram}, which takes a formula as its first argument: \verb|log(zinc)~1| means that we assume a constant trend for the variable log(zinc). <>= lzn.vgm = variogram(log(zinc)~1, meuse) lzn.vgm lzn.fit = fit.variogram(lzn.vgm, model = vgm(1, "Sph", 900, 1)) lzn.fit plot(lzn.vgm, lzn.fit) @ <>= print(plot(lzn.vgm, lzn.fit)) @ Instead of the constant mean, denoted by \verb|~1|, we can specify a mean function, e.g. using \verb|~sqrt(dist)| as a predictor variable: <>= lznr.vgm = variogram(log(zinc)~sqrt(dist), meuse) lznr.fit = fit.variogram(lznr.vgm, model = vgm(1, "Exp", 300, 1)) lznr.fit plot(lznr.vgm, lznr.fit) @ <>= print(plot(lznr.vgm, lznr.fit)) @ In this case, the variogram of residuals with respect to a fitted mean function are shown. Residuals were calculated using ordinary least squares. \section{Kriging} <>= lzn.kriged = krige(log(zinc)~1, meuse, meuse.grid, model = lzn.fit) spplot(lzn.kriged["var1.pred"]) @ <>= print(spplot(lzn.kriged["var1.pred"])) @ \section{Conditional simulation} <>= lzn.condsim = krige(log(zinc)~1, meuse, meuse.grid, model = lzn.fit, nmax = 30, nsim = 4) spplot(lzn.condsim, main = "four conditional simulations") @ <>= print(spplot(lzn.condsim, main = "four conditional simulations")) @ For UK/residuals: <>= lzn.condsim2 = krige(log(zinc)~sqrt(dist), meuse, meuse.grid, model = lznr.fit, nmax = 30, nsim = 4) spplot(lzn.condsim2, main = "four UK conditional simulations") @ <>= print(spplot(lzn.condsim2, main = "four UK conditional simulations")) @ \section{Directional variograms} The following command calculates a directional sample variogram, where directions are binned by direction angle alone. For two point pairs, $Z(s)$ and $Z(s+h)$, the separation vector is $h$, and it has a direction. Here, we will classify directions into four direction intervals: <>= lzn.dir = variogram(log(zinc)~1, meuse, alpha = c(0, 45, 90, 135)) lzndir.fit = vgm(.59, "Sph", 1200, .05, anis = c(45, .4)) plot(lzn.dir, lzndir.fit, as.table = TRUE) @ <>= print(plot(lzn.dir, lzndir.fit, as.table = TRUE)) @ Looking at directions between 180 and 360 degrees will repeat the image shown above, because the variogram is a symmetric measure: $(Z(s)-Z(s+h))^2=(Z(s+h)-Z(s))^2$. The first plot gives the variogram in the zero direction, which is North; 90 degrees is East. By default, point pairs are assigned to the directional variorgram panel with their nearest direction, so North contains everything between -22.5 and 22.5 degrees (North-West to North-East). After classifying by direction, point pairs are binned by separation distance class, as is done in the usual omnidirectional case. In the figure, the partial sill, nugget and model type of the model are equal to those of the omnidirectional model fitted above; the range is that in the direction with the largest range (45$^o$), and the anisotropy ratio, the range in the 135 direction and the range in the 45 direction, estimated ``by eye'' by comparing the 45 and 135 degrees sample variograms. Gstat does not fit anisotropy parameters automatically. We do not claim that the model fitted here is ``best'' in some way; in order to get to a better model we may want to look at more directions, other directions (e.g. try {\tt alpha = c(22, 67, 112, 157) }), and to variogram maps (see below). More elaborate approaches may use directions in three dimensions, and want to further control the direction tolerance (which may be set such that direction intervals overlap). For the residual variogram from the linear regression model using \code{sqrt(dist)} as covariate, the directional dependence is much less obvious; the fitted model here is the fitted isotropic model (equal in all directions). <>= lznr.dir = variogram(log(zinc)~sqrt(dist), meuse, alpha = c(0, 45, 90, 135)) plot(lznr.dir, lznr.fit, as.table = TRUE) @ <>= print(plot(lznr.dir, lznr.fit, as.table = TRUE)) @ \section{Variogram maps} Another means of looking at directional dependence in semivariograms is obtained by looking at variogram maps. Instead of classifying point pairs $Z(s)$ and $Z(s+h)$ by direction and distance class {\em separately}, we can classify them {\em jointly}. If $h=\{x,y\}$ be the two-dimentional coordinates of the separation vector, in the variogram map the semivariance contribution of each point pair $(Z(s)-Z(s+h))^2$ is attributed to the grid cell in which $h$ lies. The map is centered around $(0,0)$, as $h$ is geographical distance rather than geographical location. Cutoff and width correspond to some extent to map extent and cell size; the semivariance map is point symmetric around $(0,0)$, as $\gamma(h)=\gamma(-h)$. <>= vgm.map = variogram(log(zinc)~sqrt(dist), meuse, cutoff = 1500, width = 100, map = TRUE) plot(vgm.map, threshold = 5) @ <>= print(plot(vgm.map, threshold = 5)) @ The threshold assures that only semivariogram map values based on at least 5 point pairs are shown, removing too noisy estimation. % The plot is plagued by one or two extreme values, corresponding to cells % with very small number of point pairs, which should be removed. \section{Cross variography} Fitting a linear model of coregionalization. <>= g = gstat(NULL, "log(zn)", log(zinc)~sqrt(dist), meuse) g = gstat(g, "log(cd)", log(cadmium)~sqrt(dist), meuse) g = gstat(g, "log(pb)", log(lead)~sqrt(dist), meuse) g = gstat(g, "log(cu)", log(copper)~sqrt(dist), meuse) v = variogram(g) g = gstat(g, model = vgm(1, "Exp", 300, 1), fill.all = TRUE) g.fit = fit.lmc(v, g) g.fit plot(v, g.fit) vgm.map = variogram(g, cutoff = 1500, width = 100, map = TRUE) plot(vgm.map, threshold = 5, col.regions = bpy.colors(), xlab = "", ylab = "") @ <>= print(plot(v, g.fit)) @ <>= print(plot(vgm.map, threshold = 5, col.regions = bpy.colors(), ylab = "", xlab = "")) @ \section*{References} \begin{itemize} % \item Abrahamsen, P., F. Espen Benth, 2001. Kriging with inequality % constraints. Mathematical Geology 33 (6), 719--744. % \item Bivand, R.S., 2003. Approaches to classes for spatial data in R. % In: K.~Hornik \& F.~Leisch (Eds.), Proceedings of the 3rd International % Workshop on Distributed Statistical Computing (DSC 2003) March 20--22, % Vienna, Austria. ISSN 1609-395X; available from [1]. \item Burrough, P.A., R.A. McDonnell, 1998. Principles of Geographical Information Systems, 2nd Edition. Oxford University Press. \item Diggle, P.J., J.A. Tawn, R.A. Moyeed, 1998. Model-based geostatistics. Applied Statistics 47(3), pp 299-350. % \item Pebesma, E.J., Wesseling, C.G., 1998. Gstat, a program for % geostatistical modelling, prediction and simulation. Computers \& % Geosciences, 24 (1), pp. 17--31. \item Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers \& Geosciences \href{http://dx.doi.org/10.1016/j.cageo.2004.03.012}{30: 683-691}. % \item Ver Hoef, J.M., Cressie, N.A.C, 1993. Multivariable Spatial % Prediction. Mathematical Geology, 25 (2), pp. 219--240. \item Wackernagel, H., 1998. Multivariate Geostatistics; an introduction with applications, $2^{\mbox{nd}}$ edn., Springer, Berlin, 291 pp. \end{itemize} \end{document} # g = gstat(NULL, "log.zinc", log(zinc)~1, meuse) # g = gstat(g, "log.zinc.res", log(zinc)~sqrt(dist), meuse) # lplot(vgm.map[["map"]], c("log.zinc", "log.zinc.res")) % vim:syntax=tex gstat/inst/external/0000755000176200001440000000000015060550314014172 5ustar liggesusersgstat/inst/external/ncp.shx0000644000176200001440000000037415060550314015502 0ustar liggesusers' ~VA@ıUA&(AFWA22n`27v xB@D6D FI(N XP[&`^ hN@l x gstat/inst/external/cluster.txt0000644000176200001440000000757215060550314016427 0ustar liggesusersX Y Primary Secondary Declustering_Weight 39.5 18.5 .06 .22 1.619 5.5 1.5 .06 .27 1.619 38.5 5.5 .08 .40 1.416 20.5 1.5 .09 .39 1.821 27.5 14.5 .09 .24 1.349 40.5 21.5 .10 .48 .944 15.5 3.5 .10 .21 1.214 6.5 25.5 .11 .36 1.619 38.5 21.5 .11 .22 1.146 23.5 18.5 .16 .30 1.821 .5 25.5 .16 .31 1.349 9.5 19.5 .17 .30 1.012 36.5 43.5 .18 1.60 .944 21.5 5.5 .19 .59 1.416 13.5 3.5 .19 .18 1.146 40.5 7.5 .19 .75 1.012 31.5 17.5 .22 .44 1.619 46.5 40.5 .24 .58 1.821 10.5 7.5 .26 .54 1.281 28.5 11.5 .28 .62 1.551 8.5 7.5 .28 .97 1.281 47.5 .5 .31 2.88 2.023 4.5 37.5 .32 .35 .944 14.5 21.5 .33 .48 1.619 22.5 48.5 .34 .48 2.023 18.5 6.5 .34 .23 1.619 3.5 38.5 .34 .51 .944 11.5 46.5 .40 .47 1.079 31.5 26.5 .45 .74 1.619 14.5 29.5 .46 2.52 1.025 14.5 43.5 .51 1.21 1.079 38.5 28.5 .57 5.55 1.083 45.5 14.5 .62 2.30 1.281 4.5 30.5 .65 1.06 1.416 6.5 41.5 .67 .43 1.821 7.5 12.5 .71 2.07 1.551 26.5 23.5 .79 1.40 1.281 8.5 45.5 .81 .80 1.821 14.5 46.5 .83 .72 1.079 13.5 24.5 .84 .60 1.012 26.5 1.5 .89 1.01 1.619 33.5 7.5 .92 .99 1.619 45.5 22.5 .93 1.29 1.416 48.5 25.5 .94 1.06 1.619 35.5 10.5 .96 .66 1.214 34.5 14.5 .99 .52 1.214 13.5 39.5 .99 1.53 1.821 7.5 18.5 1.01 .67 1.214 15.5 27.5 1.02 .66 1.146 3.5 33.5 1.10 1.09 1.146 11.5 15.5 1.11 .42 1.315 22.5 30.5 1.21 2.16 1.416 45.5 29.5 1.21 2.07 1.619 13.5 12.5 1.27 .61 1.517 22.5 11.5 1.34 2.15 1.821 17.5 34.5 1.36 2.58 1.619 39.5 43.5 1.37 1.45 1.146 3.5 23.5 1.38 .99 .944 30.5 22.5 1.38 1.37 1.416 46.5 13.5 1.66 4.68 1.079 30.5 9.5 1.70 1.30 1.349 27.5 32.5 1.71 3.61 .944 12.5 34.5 1.78 6.25 1.497 25.5 4.5 1.81 1.37 1.416 27.5 34.5 1.82 4.73 1.146 45.5 6.5 1.89 1.89 2.023 3.5 47.5 1.96 3.47 2.023 33.5 31.5 1.98 4.96 .571 41.5 26.5 2.13 1.80 1.281 19.5 20.5 2.17 1.41 1.416 .5 41.5 2.33 1.98 1.619 5.5 22.5 2.34 1.25 .944 43.5 10.5 2.47 1.80 .877 41.5 45.5 2.75 2.65 1.619 28.5 42.5 2.76 7.66 .573 21.5 34.5 2.84 3.66 1.416 16.5 13.5 2.99 2.74 .870 23.5 24.5 3.04 1.66 1.079 2.5 1.5 3.33 1.89 1.619 47.5 44.5 3.35 2.94 1.821 39.5 38.5 3.51 .87 .958 46.5 34.5 3.81 4.44 2.023 35.5 45.5 4.60 4.70 .787 25.5 25.5 4.89 2.10 1.281 28.5 44.5 5.05 5.18 .587 19.5 42.5 5.15 2.19 2.023 38.5 36.5 5.31 3.29 .347 2.5 9.5 6.26 17.02 .292 32.5 36.5 6.41 2.45 .348 .5 8.5 6.49 14.95 .328 31.5 45.5 7.53 10.21 .306 9.5 29.5 8.03 5.21 .445 39.5 31.5 8.34 8.02 .341 17.5 15.5 9.08 3.32 .445 2.5 14.5 10.27 5.67 .429 30.5 41.5 17.19 10.10 .360 35.5 32.5 18.76 10.76 .261 37.5 36.5 3.64 3.86 .311 38.5 35.5 3.59 4.99 .324 38.5 37.5 9.08 1.68 .499 39.5 36.5 2.22 3.23 .482 1.5 9.5 7.56 19.74 .272 2.5 8.5 8.90 12.32 .348 2.5 10.5 2.55 15.91 .309 3.5 9.5 7.92 12.01 .444 31.5 36.5 4.29 2.49 .438 32.5 35.5 2.33 2.30 .335 32.5 37.5 3.21 2.75 .510 33.5 36.5 7.71 2.82 .315 .5 7.5 12.74 14.04 .682 .5 9.5 15.77 22.46 .272 1.5 8.5 20.35 14.09 .328 30.5 45.5 5.54 9.00 .339 31.5 44.5 5.38 9.08 .306 31.5 46.5 15.77 11.87 .665 32.5 45.5 10.20 9.61 .360 8.5 29.5 9.01 4.38 .566 9.5 28.5 9.27 4.40 .769 9.5 30.5 3.56 5.84 .546 10.5 29.5 2.52 6.19 .479 38.5 31.5 18.64 11.79 .298 39.5 30.5 7.94 7.09 .425 39.5 32.5 2.28 9.32 .341 40.5 31.5 2.51 4.96 .493 16.5 15.5 19.44 3.60 .445 17.5 14.5 2.96 3.17 .546 17.5 16.5 2.97 3.62 .566 18.5 15.5 4.92 2.86 .769 1.5 14.5 5.54 5.92 .733 2.5 13.5 8.71 11.72 .345 2.5 15.5 2.74 4.07 .789 3.5 14.5 3.61 5.03 .497 29.5 41.5 58.32 10.26 .450 30.5 40.5 11.08 9.31 .396 30.5 42.5 21.08 10.26 .326 31.5 41.5 22.75 8.21 .427 34.5 32.5 9.42 6.76 .413 35.5 31.5 8.48 12.78 .419 35.5 33.5 2.82 9.21 .271 36.5 32.5 5.26 12.40 .252 gstat/inst/external/ncp.shp0000644000176200001440000020355415060550314015477 0ustar liggesusers' VA@ıUA&(AFWAPAVAAg%AFWAZ P"A߯VA@"A#VA"A`LVA 4"A`jVAc"AVA`}:"AuVA("A RVA L"AҩVA!A෨VAl!AVA!A@צVA1!A`2VA!A@VA@B!AdVA!AdVA`!AʠVAC!AVA!AJVA2!AVA.T!AWVA Q!AVA9!A@ӦVA@Q&!AtVA !A`VA A ,VAP A|VA` A۞VAh A4VAmC AYVA3 AVAAVA?A`eVA ]A1VAAnVAAjVApxA@QVAWA@_VAAnVAPAVAAWAAFWA!A@eWA)#A@AWA*3#AWA;%A@VAAg%A@VA`\%A@VA`:X%A@VVA`^%AVA u]%A@VAS%A VAC%A@cVA sD%ABVA`D%A@HVA 6%AVA`P#%ANVA4 %A@!VA`$AVA-$AVA$A@VAc$A@VA$AhVA`$AVA`$AbVA`$AMVA"$AXVA $A$VA`U|$AVAIK$A0VA`%$AVA$AVA#AIVA#A2VA#AVA#ATVA`#AVA`#A@ȷVA #AVA%#AVA#AiVAލ#A@8VAw#A@'VAee#AVA`O#A@VA`5#AfVA`#AZVA`k#AVA` #AVA"A~VA P"A߯VAVAUAZ&A@VAAg%A@VAy%AVA%A@VA%AVA @%AVA%AVA%A^VA`>3&AVAZ&A9VAL&A@VA<@&A VA[1&AVA I&AVAj&A!VA &AVA &AzVA&A@&VA@=&AVAF &A`ҰVA &AVA &AVA j&A VA (%AVA%AyVA%AsVA`%A rVAo%AqVA >%AoVA%AhVA%AaVA%ANVA@%AVA %AVAU%A@VA%AeVA%A VA {%A@ٮVA%AVA w%A@GVA %AVA%AVA`d%AVVA@&%AVA%AVA%AMVA%AVA%AVAG%A`*VA@%A@êVA)%AVVA N%AکVAi%A`VA%AVA%A¨VA+%AVA@'%A\VA`F%A`(VAl%A VA~%A VAz%AVA`zv%A`|VAVr%A iVA*n%A@YVAj%AHVAe%A0VAa%AVA]%A`VA Y%AѦVAU%A@VAR%AhVA|N%AVA J%AҥVA@eG%AVA C%AXVA ?%A+VA;%A`VA7%A VA t3%AƤVAV/%A@VA@/+%AVA'%A VA@"%AVA`%A sVA%A`gVAX%A@\VA,%APVA %ADVA %A 9VA%A-VA %A VAV$A@VA,$A VA $AVA`$A`ףVA`$AVA$AVA@$AVA ]$A`VA0$A`ãVA$AңVA$AݣVA $AVA}$AVAP$A@VA$$AVA`$AVAʺ$AVA$A` VA@o$AVA A$A@VA@$A@VA@$A`VAϡ$AۣVA $AӣVAt$A`ԣVAC$A@ףVA$A@֣VA@$ẠVA$A`VA$A`VA`\$A VA+|$A@VAw$AVAs$AVAo$AඣVAqk$AணVA@Lg$AVA +c$AVA _$AnVA@Z$A`WVA V$AAVAR$A -VA@~N$AVAYJ$AVA 6F$A VA@B$A`עVA=$A VA9$AVA5$AVA1$A hVA-$A`CVA)$AVA%$A@VA !$AมVA` $AVA F$A`IVA`$AVA $AVA $A`rVA; $A%VA$AݟVA$A@VAH$AaVA |#A(VA #A`VA#A VA@#AVA G#AFVA`#AVA@#AÝVA`#A`yVA@'#A*VA`#A؜VA`#AVA 6#A`3VA`#AVA@#AVA`t#A 5VA >#AޚVA#AVA#A8VAB#A`VA#AVA #AdVAZ#A&VA`#AVAɬ#A@VA #AyVA4#A@VA@\#A VA{#AؗVA`#AगVAΕ#AmVA`#A5VA9#A@VA {#A@VĂ#AVA2#A;VA#A VA@|#AVAx#AeVAu#A VAq#AєVA n#AVAj#A;VABg#AVAc#AVA``#AHVA<]#A VAY#AஒVA 'V#AlVA@kR#A0VA@N#AVAJ#A ÑVAF#A@VA C#A XVA`B?#AVA;#AVA 8#AVA4#ADVA1#AVAk.#AVA*#A`IVA ,'#A VA`J##A@ԎVA#AVA#A 6VA<#A`͍VA@#A[VA#AVA#A@oVA #AVA#A@tVA4#A`VA! #A`VA@ #AVA`#AVA#A`YVA #A VA`"AVA@ "A6VAW"AЇVA "A@jVA@"A`VAH"AVA`"A3VA "AʅVAy"A aVA"A@VA}"A@VA`"AVA"AVAs"A=VA`/"A͂VA`"A\VA@"AVAn"AyVA&"A VA"AVA`"A*VA7"A`VA"AJVA`"A@~VAG"A`k~VA@"A }VA"A}VA~"A`}VAJ"A|VA"A@5|VA@"A@{VA@Ӵ"AN{VA࿲"AzVA"AdzVAͮ"AyVA "AuyVA9"A xVA@"AxVA`"AxVA"AwVA`"A wVA"A@vVA!"AvVAk"A uVA N"AuVA6"A~tVA "A@sVA@"A |sVAښ"A`rVA@"A`{rVA`P"A`qVA"A@~qVA@l"AqVA@"A pVA@"A@pVA+"AoVA "AoVA"AnVA@"AnVA%"A~mVA@L"AlVA@f"AxlVA@e"A@kVA:"AvkVA"AjVAՅ"AjVA@"AjVA`R"AiVA"A iVA "AhVA7"A`hVAs~"AgVA}"AfVAS}"AyfVA|"AeVA |"A`oeVA|"AdVA|"AcdVA|"A`cVA@|"A WcVA}"AbVA`}"AJbVA}"AaVA}"A _VA`}"A '_VA6}"A^VAU}"A@^VAL}"A]VA|"A ]VA{"A \VA`zz"A\VAy"A [VAcy"A [VAy"AZVA`x"AYVAx"A`tYVAx"A`XVAUx"AhXVA`2x"AWVAx"A\WVAw"AVVAw"A QVVAw"A`UVA`Bw"AEUVAv"ATVAv"A :TVA`dv"ASVAv"A /SVAu"ARVA`u"A$RVA`t"AQVAJt"A@QVAs"A`PVA`$s"A` PVAAr"A`OVA@q"A OVAfo"ANVA-m"A#NVAj"AMVA g"AOMVA2e"A`LVAb"AxLVA _`"A LVA`^"A@KVA`["A+KVAuY"A`JVA_W"A`FJVAlU"AIVA@S"AWIVA`Q"AHVAO"A kHVAiM"AGVAJ"AGVA nH"A`"GVAE"AFVA LC"A NFVA@@"A EVA>"A`lEVA`<"ADVA ;"A}DVA9"ADVA7"ACVA@ 5"ACVAJ3"ABVA1"A'BVA/"AAVA -"A`=AVA`*"A@VA'"A|@VA%"A`@VA 6#"A?VA!"A@!?VA "A`>VA`"A1>VA`"A`=VAg"A N=VA'"AVA}&A8VA }&A 5VAvy&AVA x&A@ݧVA`x&A VA5]&AVA` ]&A8VAFW&AnVA@P&A}VAI&A`VAjA&A ڧVA5:&AʧVA'7&A`ȦVA@6&AVA`%A`VA /%AVA%AVA@%AĢVA%AVAO%AVA@i%A@VA`n%AVVA`%A?VA@<%AVAʾ%AVA@\%A@VAt%A3VA%A@-VA@T%AVA`T%AǠVA@ %A@VAgf%AVAIA%AuVAB>%A@VA2%AVA+%AVA%%A}VA@%A@`VA.%A@(VA%AVA$AƜVA$AVA$AOVA$A,VAB$A VA@$A@ VA$AnVA$AМVAf$AVA@֔$AVA$AmVA$AGVA't$A VA1r$A@ VAn$AVAf$AVA@*`$AךVA@Y$AzVA@ZQ$A%VA@5G$AVA>$AVA/$AVA@$AЗVA% $A@іVAE#A&VA#A}VAR#A@VA@#A@VA`8#AVA@R#A@VA#A@VA¶#A@~VA`f#AђVA #A9VAJ#A@VA@k#A=VA@#AאVA@#AVAq#A`%VAm#AVAf#AVA@(`#AVAV#A5VAM#AVA@H#A(VAiB#ApVA=#A@ЅVA<:#A@"VAI8#AVA`5#AVA?1#AVA@L+#AZVA@v$#AVA#AρVA#AVA`#A@VA #AɀVA #A@gVAc"A{VA"AzVA"AxVA"A}vVA"A7tVA@"ArrVA@R"A@9qVA"AoVA"AnVA"AlVA"A]kVAT"AxjVA@G"AoiVA5"A@hVAk"A@gVA"AgVA "A`KbVA "A8bVA"A bVA@9"AaVAN"An_VA"A]VA`O"A@\VA"AG[VAv"AYVA`]"AgXVAԻ"A:VVAB"A@1TVAR"A@RVAd"AKQVA@"A@APVA|"A2OVA "A*NVAk"AMVA@"A@KVA"ABJVA"AHVA@"AFVA@"ADVAF"A6DVA"ACVA@("A CVA"AAVA"A AVA"A@>VA"A;VA"A@9VA"A@+8VAN"A@6VA@"A5VA@"A 5VA>"A3VA@0"A2VA"A1VA"A@y1VA"A0VA_"A@Z0VA@"A/VA"A@1/VAW"As.VA"A.VA"Ax.VA}"A}.VA`"A.VA"A.VA"A/VA@"A/VAp"A.VA@"A.VAo"A.VA2"Af.VA"A@I.VA"A#.VA]"A@.VA`"A-VA@"Ae-VA@2"AF-VA "A-VA@܊"A@c-VA@ҍ"A@ -VA` "A@-VAd"A@M-VA"AY-VA`)"A-VA7"A[-VA@Ђ"A,VAA"A@B,VA"A+VA"A*VA@|"A:)VAMv"A&VA s"A%VAl"A#VA`Ud"A!VA@]"AVAqZ"AVAU"AqVA@M"A/VAD"AVA ="AVA@Q6"A.VAM1"AVA@,"A@ VA`("AVA!"A@`VA@"A@ VA@"A VA@ "Ah VAd"A@ VA@:!AVA`'!A@VA@ !AVA!A%VA`'!AVA`!AVA.!AVAy!AAVA!AmVAo!AVA!AVA !A@?VAy!AIUA[!ATUA`J!AUA@!!A@,UAѧ!A&UA`ע!A$UAo!A@UAF!AKUA!A UA!AUA !A "UAt!A*UA f!AUA@{g!A6UAj!A`UAn!A@UA_r!A UAu!A LVAx!A VA`{!AVA`~!A\VA݁!AVA@!A!VAQ!AVA`!AVA!A`oVAF!A@VA੎!AhVA!AVAn!A eVA !AVAڔ!AYVA`!AVAV!A@MVA`!AVA ܛ!A`@VA !AVAI!A4 VA@Ġ!A VA`0!A0 VA`!A VAb!A' VA)!A@ VAƨ!A VA !A VA!A VA!A@ VA!A$VA_!A VA!A-VA@!A`VA !A@7VA`!A VA@F!A`@VA!AVA !AHVA]!AVA!APVA!AVA`!AUVA@&!AVA`!AYVA!A@VAݶ!AeVA!AVAB!ArVAZ!AVA+!AkVA!A@VAʽ!A]VA u!AVA !A`SVA!AVA!AGVAH!AVA!A<VA !AVAK!A@2VA!A@VA (!A .VAC!A VA!!A 2VA!AVA!A7 VA !A VA`'!A@:!VAK!A@!VA@z!A;"VA!A"VA!A@;#VA v!A#VAI!A3$VA!A$VA@y!A)%VA!A%VA X!A6&VA!A &VA!A`6'VA!A'VA!A#(VA!A(VA@!A@)VA!A@)VA`W!A*VA !A*VA !A`+VA+!A+VA@!A@,VA"!A@,VA!A-VA!A-VAE!A'.VA!A.VA!A2/VA!A/VA0!A;0VA@!A@0VAa!AD1VA!A1VAv!AO2VA !A2VA@y!A Z3VA`!A`3VA!Ad4VA`H!A4VA!Aj5VA@!A@5VA`|!Ah6VAm!A6VA~!AV7VA`"A7VA@"A68VA`1"A 8VA/"A 9VA "A`9VA "A:VA "A:VA0"A;VA "A;VA"A@;VA"AkVA "A`>VA!"A@!?VA 6#"A?VA%"A`@VA'"A|@VA`*"A@VA -"A`=AVA/"AAVA1"A'BVAJ3"ABVA@ 5"ACVA7"ACVA9"ADVA ;"A}DVA`<"ADVA>"A`lEVA@@"A EVA LC"A NFVAE"AFVA nH"A`"GVAJ"AGVAiM"AGVAO"A kHVA`Q"AHVA@S"AWIVAlU"AIVA_W"A`FJVAuY"A`JVA`["A+KVA`^"A@KVA _`"A LVAb"AxLVA2e"A`LVA g"AOMVAj"AMVA-m"A#NVAfo"ANVA@q"A OVAAr"A`OVA`$s"A` PVAs"A`PVAJt"A@QVA`t"AQVA`u"A$RVAu"ARVAv"A /SVA`dv"ASVAv"A :TVAv"ATVA`Bw"AEUVAw"A`UVAw"A QVVAw"AVVAx"A\WVA`2x"AWVAUx"AhXVAx"A`XVAx"A`tYVA`x"AYVAy"AZVAcy"A [VAy"A [VA`zz"A\VA{"A \VA|"A ]VAL}"A]VAU}"A@^VA6}"A^VA`}"A '_VA}"A _VA}"AaVA`}"AJbVA}"AbVA@|"A WcVA|"A`cVA|"AcdVA|"AdVA |"A`oeVA|"AeVAS}"AyfVA}"AfVAs~"AgVA7"A`hVA "AhVA"A iVA`R"AiVA@"AjVAՅ"AjVA"AjVA:"AvkVA@e"A@kVA@f"AxlVA@L"AlVA%"A~mVA@"AnVA"AnVA "AoVA+"AoVA@"A@pVA@"A pVA@l"AqVA"A@~qVA`P"A`qVA@"A`{rVAښ"A`rVA@"A |sVA "A@sVA6"A~tVA N"AuVAk"A uVA!"AvVA"A@vVA`"A wVA"AwVA`"AxVA@"AxVA9"A xVA "AuyVAͮ"AyVA"AdzVA࿲"AzVA@Ӵ"AN{VA@"A@{VA"A@5|VAJ"A|VA~"A`}VA"A}VA@"A }VAG"A`k~VA`"A@~VA"AJVA7"A`VA`"A*VA"AVA&"A VAn"AyVA@"AVA`"A\VA`/"A͂VAs"A=VA"AVA`"AVA}"A@VA"A@VAy"A aVA "AʅVA`"A3VAH"AVA@"A`VA "A@jVAW"AЇVA@ "A6VA`"AVA #A VA#A`YVA`#AVA@ #AVA! #A`VA4#A`VA#A@tVA #AVA#A@oVA#AVA@#A[VA<#A`͍VA#A 6VA#AVA`J##A@ԎVA ,'#A VA*#A`IVAk.#AVA1#AVA4#ADVA 8#AVA;#AVA`B?#AVA C#A XVAF#A@VAJ#A ÑVA@N#AVA@kR#A0VA 'V#AlVAY#AஒVA<]#A VA``#AHVAc#AVABg#AVAj#A;VA n#AVAq#AєVAu#A VAx#AeVA@|#AVA#A VA2#A;VĂ#AVA {#A@VA9#A@VA`#A5VAΕ#AmVA`#AगVA{#AؗVA@\#A VA4#A@VA #AyVAɬ#A@VA`#AVAZ#A&VA #AdVA#AVAB#A`VA#A8VA#AVA >#AޚVA`t#A 5VA@#AVA`#AVA 6#A`3VA`#AVA`#A؜VA@'#A*VA`#A`yVA@#AÝVA`#AVA G#AFVA@#AVA#A VA #A`VA |#A(VAH$AaVA$A@VA$AݟVA; $A%VA $A`rVA $AVA`$AVA F$A`IVA` $AVA !$AมVA%$A@VA)$AVA-$A`CVA1$A hVA5$AVA9$AVA=$A VA@B$A`עVA 6F$A VAYJ$AVA@~N$AVAR$A -VA V$AAVA@Z$A`WVA _$AnVA +c$AVA@Lg$AVAqk$AணVAo$AඣVAs$AVAw$AVA+|$A@VA`\$A VA$A`VA$A`VA@$ẠVA$A@֣VAC$A@ףVAt$A`ԣVA $AӣVAϡ$AۣVA@$A`VA@$A@VA A$A@VA@o$AVA$A` VAʺ$AVA`$AVA$$AVAP$A@VA}$AVA $AVA$AݣVA$AңVA0$A`ãVA ]$A`VA@$AVA$AVA`$AVA`$A`ףVA $AVA,$A VAV$A@VA %A VA%A-VA %A 9VA %ADVA,%APVAX%A@\VA%A`gVA`%A sVA@"%AVA'%A VA@/+%AVAV/%A@VA t3%AƤVA7%A VA;%A`VA ?%A+VA C%AXVA@eG%AVA J%AҥVA|N%AVAR%AhVAU%A@VA Y%AѦVA]%A`VAa%AVAe%A0VAj%AHVA*n%A@YVAVr%A iVA`zv%A`|VAz%AVA~%A VAl%A VA`F%A`(VA@'%A\VA+%AVA%A¨VA%AVAi%A`VA N%AکVA)%AVVA@%A@êVAG%A`*VA%AVA%AVA%AMVA%AVA@&%AVA`d%AVVA%AVA %AVA w%A@GVA%AVA {%A@ٮVA%A VA%AeVAU%A@VA %AVA@%AVA%ANVA%AaVA%AhVA >%AoVAo%AqVA`%A rVA%AsVA%AyVA (%AVA j&A VA &AVA &AVAF &A`ҰVA@=&AVA&A@&VA &AzVA &AVAj&A!VA I&AVA[1&AVA<@&A VAL&A@VAZ&A9VA`&A VAU&A@VA 3&A֬VA&A@VA@&ArVAL&A@VA&A@VAa&A@VAU&A VAv&A VA3&A֬VA_&AVA&(A@VA3&A֬VAv&A VAU&A VAa&A@VA&A@VA&AVAA'AVA}'A¥VAj'A VAe'AVA@i'ARVAu'AVA(AXVA&(A@dVA(A@VA@ 'A`_VA'AMVAW'AVA 'AVA 'A@VAV'AVA@'AVA`v'AVA'AVA۾'A'VA'ARVAh'AiVA`'A@1VAڵ'A]VA`'AVA@'AVA'AVA ʦ'AĉVAԣ'A҉VA'A؉VA'AىVA@'AVA@O'A/VAt'AVA`D'AVA@'AVA,'A:VA@'AVA'AtVA`'AVAא'A`VA'AdVA+'A֍VAb'A+VA@ 'AVA1'AVA@k'AVA'A؎VAՓ'AVA'A@VA@Õ'APVA@'A`VA@t'AVAѕ'AΏVA@'AVA`/'AVAB'AVA@D'A>VA 'A)VA`/'A@VA'A VAچ'A VA4'AVA 'A@VA<'AVA4}'AVAz'A@!VA`{v'A$VAt'A,VA@s'A@"VAr'A@VA\'A@]VAa\'AVAX'A`VAeT'A@VAzK'AZVA`H'AVA@HI'A‘VA~E'A@VAQD'A@VA@'AVA@@'A.VA>'AVA:'AҒVA7'AVA4'AcVA.'A֓VA.'AVA-'AVA`-'AkVA@,'A@הVA+'AtVA@+'AVA*'AVAf)'AjVA('AЖVA]('A4VA''AVA('A@VA''A@4VA1%'ANVA%'AVA@&'AȘVA`!'A@VAK 'AVA@%'AVA'A)VA'A vVA@'AVAr'A&VA@ 'AVA@!'ADVA'A@ȝVA@'AVA 'AVA@;'A VA@B 'AVA@Z 'AVA'AVA'A@VA@&AVA@z&A@gVA@'AlVA'AVA@'A͞VA@T'A@=VA &A@VA&AVA@&AVAj&A`'VA&A`VAϝ&A`˨VA_&A cVA3&A֬VA x7$AVA@&A cVAl_&A cVAϝ&A`˨VA&A`VAj&A`'VA@&AVA&AԞVA&A>VA'&AVAQ&A`џVA6&A@VA@7&AVA&AVA&AŸVA/&AVA`&AZVA@|&AFVAӷ&A`VA&AVA^&A`VAi&AVA&AxVA@&AIVAW&AVA@h&AVA`7&AiVA&A VA̓&A@VA3&AVA&A@pVA?&AAVA&AVA`Ä&AVA.&AVA~&AVAZ}&AVA`s&AiVA`4o&A9VA2n&A@1VA`m&A`-VAc&AVAY&AƚVAO&AVAJ&AVA@D&A0VA@=&AVA9&AVA@7&AٙVA6&AVA4&AVAu/&AVA@7+&A@oVA='&A@cVAc#&AvVA@k&A_VA>&AԘVA` &AUVA@&AVA&A@NVA`%AVA%AQVA ]%A-VA%A@VA%AVA@&%AVAW%AVA`%A@VA%AVAV%AVA%AVA%AݗVA%A`VA,%A VA`%A;VA@ܴ%A`VA1%A@ܖVA`s%A@VA@k%A5VA%A8VAx%AwVA`W%A8VA%AVA%A@3VA3%A@fVA`z%A@5VA@}%A@YVA@3z%A5VAn%AVAm%AVA@Wg%AіVARc%A@ɖVAu[%AVAR%A@VAL%AVA@K%AVA`J%AVA@I%AؕVAcG%AÕVAE%A`VAlD%AVAi>%AXVA.1%A@VAU/%A VA@+%AVA(%AVAo&%AVA@$%AVA'"%A@VAI!%AVA%AVA%AVA%A@VA@ %A@GVAK %AHVA`Z %A`VA%AVA%AVA%AVA@$AwVA$A VA@|$A@VA$A@]VA`$AMVA$AVA$A@ȐVAv$AVA@$A@VA$AfVA4$A>VA$A@$VA@e$AVA$A_VA@$AۍVA$AVA`~$AƍVA@$A@sVA@o$AHVA@$AOVA:$A@#VA@$AVA@>$AVAϲ$AVA$A@mVAe$A8VA@e$AVA$AVAB$AVA$AVA`p$AVA@$AVA_$AVAה$AVA7$A`MVAl9$AOVA`=$AYVAlB$A@VAD$AŕVAD$AVAmC$AQVAA$AgVA@A=$AVA:$A@̖VA8$AVA:$AVA@<$AVA?$AVAA$AVAD$A@VAF$AVA@E$A@ӖVAD$AVAuB$AiVA!C$AVAE$A1VAH$A@VAL$A@ VAXO$AFVA4R$AVA@U$AVA@ Y$A?VA;[$A@UVA/]$A@FVA@*`$AFVA@Bf$AVA@hj$AVAk$AVAhk$AOVA1m$AVA`Go$AVA-r$AVA`r$A˙VAr$AVA@t$A1VAw$A@KVA@y$AKVAz$AZVA@z$AVA@ x$A@VAv$AVA't$A VA$AGVA@\$A@VA@o$A@VA`$AVA$AVA($A@VA|$A@VAl$AVA$AVA`4$A@VA`$A@jVA_$A@3VA$A)VA9$ACVAH$A9VA@$A-VA$A@HVA$A?VAw$A9VAc$AEVA@$A\VAx$A@VA$AVA@$AVA$AҘVA)$A@VA$AVA@$A@7VA>$A@sVA`$A@ƙVA@$A@VA@p$A0VAy$A@BVAr$AJVA?$A?VA$A@FVA$A4VA5$AVA$A!VA$A'VA+$A@VA$AVA$AVA$AVA$A@VA$AVA.$AVA[$AVA9$AVA`$A#VA@$ANVA-%A|VAS%AVA%AҚVA@%AVA5%A@_VAy%AVA%A@VA@!%AVA"%AVAC&%A#VA@)%A[VA.%AFVA@15%A@KVA`f7%AnVA>%A@VVAB%A@VAE%A@VAF%A@VAD%A@KVAIA%AuVAgf%AVA@ %A@VA`T%AǠVA%%AVA@L%A@VA6%A@KVA"%AVA%AVA@1%A?VAۗ%A@jVA%AVA@d%AVA%AVA%A@VAy%A@)VA %AVAA%AlVAK%AVAU%A@VAu%AvVAN%AVA@,%AVA>%AVA@8%A+VAС%AdVA@=%AVA@%AÝVA@Ѩ%A@8VA%A@gVA%AgVA`%AkVA;%AVA%AVA%AVA%AΞVA@%A@ɞVA@ %AڞVA@.%A VA@%A@IVA%AVA_%A@!VA@%A@VA`%AVA~%AɠVA`%A@ VA%A@eVA%AyVA@)%AVA[%AVA&A,VA2&A@XVA&AVA /%AVA`%A`VA@6&AVA@i;&AYVA?&AޥVABE&A \VAM&A EVA@;R&AVAW&A@VA`]&A@VA5]&AVA`x&A VA_x&AVA@y&AfVA`z&ArVAT|&A@nVA~&AKVAz&AVA~&AVA@y|&AVA|&AVA}&AVA`;&AVA&A˦VA`&A ĦVAQ&AVA&AVA &AVA~&AVAE&A@VA@1&A@VA&A9VAQ&ArVA@n&AVA\&AߧVAЊ&A@VA&A@0VA`&AHVA&A@fVA`<&AlVA&AeVA_&A cVA@_x&AVA&AlVA%&AeVA`<&AlVA&A@fVA`&AHVA&A@0VAЊ&A@VA\&AߧVA@n&AVAQ&ArVA&A9VA@1&A@VAE&A@VA~&AVA &AVA&AVAQ&AVA`&A ĦVA&A˦VA`;&AVA}&AVA|&AVA@y|&AVA~&AVAz&AVA~&AKVAT|&A@nVA`z&ArVA@y&AfVA_x&AVA`x&A VA x&A@ݧVAvy&AVA }&A 5VA}&A8VAM~&A>VA#&AdVA&AeVA@6&A EVA`]&A ڧVA'7&A`ȦVA5:&AʧVAjA&A ڧVAI&A`VA@P&A}VAFW&AnVA` ]&A8VA5]&AVA`]&A@VAW&A@VA@;R&AVAM&A EVABE&A \VA?&AޥVA@i;&AYVA@6&AVA'7&A`ȦVA  %AVA2&AĢVAA /%AVA&AVA2&A@XVA&A,VA[%AVA@)%AVA%AyVA%A@eVA`%A@ VA~%AɠVA`%AVA@%A@VA_%A@!VA%AVA@%A@IVA@.%A VA@ %AڞVA@%A@ɞVA%AΞVA%AVA%AVA;%AVA`%AkVA%AgVA%A@gVA@Ѩ%A@8VA@%AÝVA@=%AVAС%AdVA@8%A+VA>%AVA@,%AVAN%AVAu%AvVAU%A@VAK%AVAA%AlVA %AVAy%A@)VA%A@VA%AVA@d%AVA%AVAۗ%A@jVA@1%A?VA%AVA"%AVA6%A@KVA@L%A@VA%%AVA`T%AǠVA@T%AVA%A@-VAt%A3VA@\%A@VAʾ%AVA@<%AVA`%A?VA`n%AVVA@i%A@VAO%AVA%AVA@%AĢVA%AVA /%AVA @o$A)VAF%AVAZIA%AuVAD%A@KVAF%A@VAE%A@VAB%A@VA>%A@VVA`f7%AnVA@15%A@KVA.%AFVA@)%A[VAC&%A#VA"%AVA@!%AVA%A@VAy%AVA5%A@_VA@%AVA%AҚVAS%AVA-%A|VA@$ANVA`$A#VA9$AVA[$AVA.$AVA$AVA$A@VA$AVA$AVA$AVA+$A@VA$A'VA$A!VA5$AVA$A4VA$A@FVA?$A?VAr$AJVAy$A@BVA@p$A0VA@$A@VA`$A@ƙVA>$A@sVA@$A@7VA$AVA)$A@VA$AҘVA@$AVA$AVAx$A@VA@$A\VAc$AEVAw$A9VA$A?VA$A@HVA@$A-VAH$A9VA9$ACVA$A)VA_$A@3VA`$A@jVA`4$A@VA$AVAl$AVA|$A@VA($A@VA$AVA`$AVA@o$A@VA@\$A@VA$AGVA$AmVA@֔$AVAf$AVA$AМVA$AnVA@$A@ VAB$A VA$A,VA$AOVA$AVA$AƜVA%AVA.%A@(VA@%A@`VA%%A}VA+%AVA2%AVAB>%A@VAIA%AuVA (@#A4VA@z$AVA7$A`MVA`4$AJVA@.$A@AVAR*$A@HVA&$AbVA"$AXVA$A VA$AVAC$AVAG$AaVA@$AVA $A@VA@B$A@!VA$AVA3$AVA@0$AVA3#AVA@l#AqVA#A9VA_#A/VA@#AcVA#A@VA#A@}VA#A@aVA#A$VA`4#A0VA@#A@)VAf#AǑVA#AVA`#A@VA#AVA#AVA@R#A@VA#AVA@#AVA#AVA|#AVA#AhVA#A VA#A@VA#A"VA`n#AȏVA@#AVA@G#AVA`#AVA-#A@VA`'#AfVA`#A@VA@#A@/VA`^#AVA@+#A@^VA#A4VA@#AHVAש#AVA@#AߎVA>#AVA@#A@VA@#AVA@#AאVA@k#A=VAJ#A@VA #A9VA`f#AђVA¶#A@~VA#A@VA@R#A@VA`8#AVA@#A@VAR#A@VA#A}VAE#A&VA% $A@іVA@$AЗVA/$AVA>$AVA@5G$AVA@ZQ$A%VA@Y$AzVA@*`$AךVAf$AVAn$AVA1r$A@ VA't$A VAv$AVA@ x$A@VA@z$AVAz$AZVA@y$AKVAw$A@KVA@t$A1VAr$AVA`r$A˙VA-r$AVA`Go$AVA1m$AVAhk$AOVAk$AVA@hj$AVA@Bf$AVA@*`$AFVA/]$A@FVA;[$A@UVA@ Y$A?VA@U$AVA4R$AVAXO$AFVAL$A@ VAH$A@VAE$A1VA!C$AVAuB$AiVAD$AVA@E$A@ӖVAF$AVAD$A@VAA$AVA?$AVA@<$AVA:$AVA8$AVA:$A@̖VA@A=$AVAA$AgVAmC$AQVAD$AVAD$AŕVAlB$A@VA`=$AYVAl9$AOVA7$A`MVA "Aj\VAה$AbVAT#A4VA@+#A@^VA`^#AVA@#A@/VA`#A@VA`'#AfVA-#A@VA`#AVA@G#AVA@#AVA`n#AȏVA#A"VA#A@VA#A VA#AhVA|#AVA#AVA@#AVA#AVA@R#A@VA#AVA#AVA`#A@VA#AVAf#AǑVA@#A@)VA`4#A0VA#A$VA#A@aVA#A@}VA#A@VA@#AcVA_#A/VA#A9VA@l#AqVA3#AVA@0$AVA3$AVA$AVA@B$A@!VA $A@VA@$AVAG$AaVAC$AVA$AVA$A VA"$AXVA&$AbVAR*$A@HVA@.$A@AVA`4$AJVA7$A`MVAה$AVA$ÅVA$A@VAq$A$VA~$AvVAy$A@ˈVAv$AVAq$AVA@Hn$AVA@ui$A@VAh$A VA6f$AVA`d$A`eVA|b$A@JVAa$A@3VA`G]$AԄVA@[[$AVA>W$A>VA@kV$AVA@R$AكVAP$A@VA:L$A%VAXK$A҂VAKF$A6VA`gB$AVA`@$AyVAp?$AHVA@?=$AVAq:$A1VA ::$AVA:$AVA@7$A~VA`5$A$~VA@4$A}VA`2$A@}VA@@1$Ad}VA@)1$A@}VAD4$A}VA@ 4$A@|VAS/$A|VAl.$A@|VA`$,$A.|VA@-$A|VAM.$A|VA0$A@{VA1$A{VA@u1$A@.{VA/$AzVA`/$AzVA@.$A@wVAt-$AIwVA (-$A wVA@,$A@vVAh)$AvVA$$A@uVA@$A@!uVA@!$AtVAC!$A@ptVA $A@/tVA` $AsVA$A@2sVA$A@rVA$AqVA$AqVA9 $AqVA@ $A@qVAj $A@WqVA>$A@-qVA@$AHqVA3#ApVA`f#AnVAh#A}kVA`Ȳ#A*iVAv#AZbVA@_u#A5bVA`u#AaVAq#AaVAp#A@aVAn#AbVAqm#A bVAj#AaVA@Rj#AaVAh#AaVA@c#AaVA@b#AaVA^#AaVAK]#AaVA@V#AaaVAR#AaaVA`#M#ABaVA[J#A`VA@G#A`VA3G#A`VA8E#A_VAA#A^VA@I?#A^VA`7=#A-^VA;#A^VA8#A@]VA6#A ]VA@O4#A@]VA2#Ar]VA/#AF]VA,#A]VA+)#A\VA"#A\VA"#Av\VA#Aj\VA@"A^VA;"A`VA"AaVA@v"A@vbVA"A`cVA`R"AcVA"A@ dVA"A0dVA"A^dVA"ASdVAy"AcVA"AcVA"A@cVA"A@cVA@"AcVA"A cVA@"AbVA"AcVA`"A@QdVA&"AndVA"A@dVA"AdVAF"A}dVA3"AsdVA@"AedVA6"A@MdVA@"ADdVA"AdVA"AcVA"AcVA "A`KbVA"AgVA@"AFgVA\"AfVA"AfVA"AJgVAL"AbgVA"AHgVA"A>gVA4"A@kgVA1"AgVA"A@hVA0"A+hVA@W"A hVA"A@gVA"AhVAW"A\hVA@"A@hVA@"AhVA"AhVAI"AiVA@u"A-iVA`D"AUiVA"AoiVA`s"ASiVA"A%iVA@V"AiVA/"AhVA"A@hVA}"A@hVA@C"AhVA"AiVA"AiVA"A@vVA$#AvVA%#AvVA@&#AvVA'#AwVA@'#ABwVA@%#AwVA`b #AxVA#A@yVA#AyVA#AyVA#A@yVA#A!zVA#AzVA#A&{VA3#A{VA}#A{VA@ #A@O|VA #An|VA@ #A|VA@#AA|VA.#A{VAc"A{VA #A@gVA@< #A5VA#AVA@#A@VAI#AVA@#A2VA#AVA2"#AVA@ (#AVA(#AVA`)#A@VA[,#AVA/#AaVA[2#A@VA^4#AVA27#AVA9#A@VA=#A@`VA@A#A@VA@F#A@VA`K#AKVA=M#A~VAL#AVAiL#A@VA K#AVA@I#A VA@vG#AVA@F#A@VAL#A@VA_Q#AVAV#AaVA`s\#AƆVA@_#A҆VA g#A@VAol#AVAr#AVA@v#AVAz#A@VAm~#AVA#AVA@#AVA#A%VA`#AVA@ŋ#AԉVA$#AVA`#A@>VA#AXVAT#AiVA!{#AxVAdu#A[VAxs#A7VAq#A`%VA@#AVA@#A@VA>#AVA@#AߎVAש#AVA@#AHVA#A4VA P #AVA`#AxVAGq#A`%VAxs#A7VAdu#A[VA!{#AxVAT#AiVA#AXVA`#A@>VA$#AVA@ŋ#AԉVA`#AVA#A%VA@#AVA#AVAm~#AVAz#A@VA@v#AVAr#AVAol#AVA g#A@VA@_#A҆VA`s\#AƆVAV#AaVA_Q#AVAL#A@VA@F#A@VA@vG#AVA@I#A VA K#AVAiL#A@VAL#AVA=M#A~VA`K#AKVA@F#A@VA@A#A@VA=#A@`VA9#A@VA27#AVA^4#AVA[2#A@VA/#AaVA[,#AVA`)#A@VA(#AVA@ (#AVA2"#AVA#AVA@#A2VAI#AVA@#A@VA#AVA@< #A5VA #A@gVA #AɀVA`#A@VA#AVA#AρVA@v$#AVA@L+#AZVA?1#AVA`5#AVAI8#AVA<:#A@"VA=#A@ЅVAiB#ApVA@H#A(VAM#AVAV#A5VA@(`#AVAf#AVAm#AVAq#A`%VA`T"AfVA'#A|VAi #An|VA@ #A@O|VA}#A{VA3#A{VA#A&{VA#AzVA#A!zVA#A@yVA#AyVA#AyVA#A@yVA`b #AxVA@%#AwVA@'#ABwVA'#AwVA@&#AvVA%#AvVA$#AvVA##A>vVA##A@%uVA##A tVAE$#AsVA`i##A+sVA-##A@rVA##AZrVA@"#ArVA@"#AqVA##AqVA##AqVA@##AgVA"AHgVAL"AbgVA"AJgVA"AfVA\"AfVA@"AFgVA"AgVAk"A@gVA5"A@hVA@G"AoiVAT"AxjVA"A]kVA"AlVA"AnVA"AoVA@R"A@9qVA@"ArrVA"A7tVA"A}vVA"AxVA"AzVAc"A{VA.#A{VA@#AA|VA@ #A|VA #An|VA A;UA !AUA5t!A*UA !A "UA?!A UA'!A@UA-l!A>UA#g!AUA`Ge!A@UAc!AmUAFa!AUA`Q_!AUA_!A@=UAb!AUAEe!AUA@f!ARUA@g!AuUAi!A@UA`l!A@UA5k!AZUAj!AUAl!A@UA`o!AKUAp!AdUAMp!AUA@]q!AUA8s!A8UA\z!AzUAx!A@+UA@u!AUA`t!A7UAs!AUA`p!AlUA@6m!A@UAk!A@fUAk!A@UA l!AUAo!A@UA@UA`?u!AsUAs!AfUAn!AKUAIl!AUA@?i!A@UA@e!AUAe!AkUA@c!AUA``!AjUA\!A@ UAW!AUAZV!AUA@%T!AUA@LQ!A@TUA@ O!AyUA@M!AUA1L!AUA`F!AUA?!AUA9!AUA`6!A{UA`w2!AQUA@\.!A5UA`+!AqUA'!AUA&!AUA@Uv!AUAy!AUA`A!A?UA&!AcUA@!AUA`΅!A@UA!AaUA!AJUA`!A/UA@!A9UAס!A UA/!A>UA@c!AUA!AUA@!AUAT!AUA!A!A$!AUA!AUA`.!AUAZ!AUA`!A1UA!AKUA!A@lUA !AqUA!AUAl!AUA!A@UA` AUA AUA AWUA A@UAi AUAs AUA A@UA A@xUA2 AUA AsUA AUA A@UAM A`UA' A@UA@ʵ AUA@ AUAP A@UA/ AUA@ܷ AUA) AUA. AUAĹ AUA@ AUA[ AUA- AUA@ A@UA A UA` AUA A@UA A UA`7 A@AUA AUA AUA@ AUAƾ AzUA@Ⱦ AMUA@ A/UA@> A@/UA6 ALUA" A@sUA A@UA AUA! AUA] AUA@ AUA A@UA`^ AUA AUAb A@UA AUA AUA AUA A@IUA AdUA AUA AUA& AUA AUA@ A@UA`v A@UA A@8UA@ AZUA$ AzUA@ A UA A@UA AUA A``UA AkUA AUA AUA( AUA AUA ANUA A@UA* AUA`X AlUA@i AUA@ AUA A@UA AUA`P AUA A@UA5 AMUA AUA A@VUA] AUA AjUA ALUA@ AzUA@o A\UA0 A@!UA` AUA!AUA!AUAk!A@UA@$ !APUA`!AcUA!AUA!ARUA`!AUAk!AOUA@ !AUA8!!AWUAg"!A@UA@#!A@UA@&!AUA`2!A.UA5!A=UA8:!AAUA@!AUA@>!A_UAC!AUA@E!AsUAJ!AUA`N!AUAP!AUA@xQ!A@UA@tR!AUAS!AUA@U!A@UAW!A@UApZ!A UA@\!A UAsa!A@UA@e!A_UA@i!AUA`un!AUApr!A+UA@{w!AgUA`z!AUA`}!AhUA!AzUA!A@UA!AAUA`!AxUAx!A@UA!AUA`E!AUA!AUA`̑!A@UA@!AUA!AUA`!AUA@p!A@FUA`!AUAo!AUA[!A AUA@B A:UA@oE AUAG AUA@uK AUAM AgUA)P AUAQ AUA@S AUA@̳ A@UA AxUA A@UA`@ ALUA A1UA AUA@+ A@UA` AtUA@ AUA@ AֺUAU AUA A\UAC AFUAL A@UA` A@UA A@UA@!AҷUA\!AUA !A5UAm!A@hUA!A_UA!AUA@M!AUA!AUAD !AUA#%!AUA)!AUA+!AUA@j/!AUA@u1!A@UAE3!AJUA@4!A@UA9!A@]UA7!AUA:!AUAE>!AUA@I@!A־UA`ZB!A@UAoD!A@9UA G!A@jUA)J!AUA@M!AUA`O!AUAS!AUAWX!AUA\!AUA_`!A~UA@e!A@UA`i!AͽUA(m!AUAp!AUA`$u!AdUAav!A"UAJx!AUAp{!AǼUA`{!AaUA`p|!AUA0~!A@UA`!A@}UA!A UA͈!A@UAڊ!AUAߏ!AUA@!AHUA@!AUA@!A׹UA!AUA!!A@KUA!A@(UAO!A@(UA@0!ACUA!AhUA!AUAb!AUA!AUAn!AyUA}!AUA)!A+UA`!AUA@U!AUA@!ADUA!A@UA!A˺UAO!AUA!AqUA@ !A'UA!ANUA!AUAi!AʷUA!A{UA AL_UA E A43UA_Tg AM0QvUA5B AutUA9u AdUAe A6FTUAMj Am!UAW A-(UA6Hh AlUA"5 AlUA${ A.LUA[oaq AIJZ*UA ' A`UA[ AZ6 UAPcM AUAl> A}aUA:^7 ACǙٍUAy] A UAW AsoKUAԸ`h A aUAa,5 AFdcШUA;ht AoUAИ A$EUA5(ꜽ A 9UAX I A@qUAV AsB0YUAjz A0>X|UAeq A;UA 1.5,10.787137,50.619179,907,EISENACH,160705008,,Schmiedefeld am Rennsteig,no,4.390458645846876 DEMV017,DEMV017,DE,Germany,Göhlen,1998-02-01,,Background,rural,rural,unknown,,11.362965,53.302353,25,GÖHLEN,130545416,,Göhlen,no,6.004551736946301 DEMV004,DEMV004,DE,Germany,Gülzow,1992-01-01,,Background,rural,rural,unknown,,12.064709,53.817772,17,,130535313,,Gülzow-Prüzen,no,6.843800975142158 DEBB053,DEBB053,DE,Germany,Hasenholz,2000-11-21,,Background,rural,rural,regional,,14.015253,52.563835,88,BUCKOW,120645408,,"Buckow (Märkische Schweiz), Stadt",no,9.110279139763184 DETH061,DETH061,DE,Germany,Hummelshain,1999-10-07,,Background,rural background,rural,remote,,11.661233,50.791618,357,,160745007,,Trockenborn-Wolfersdorf,no,5.704372785485123 DERP014,DERP014,DE,Germany,Hunsrück-Leisel,1984-01-01,,Background,rural,rural,unknown,,7.193486,49.741035,650,LEISEL,71345002,,Siesbach,no,5.223882314791547 DENI031,DENI031,DE,Germany,Jadebusen,1984-06-01,,Background,rural,rural,unknown,,8.09059,53.59617,2,,,3405000,"Wilhelmshaven, Stadt",no,10.450504669281006 DEHE060,DEHE060,DE,Germany,Kellerwald,2005-10-09,,Background,rural,rural,regional,,9.031753,51.154842,483,,,6635009,Edertal,no,6.500547300478271 DEHE052,DEHE052,DE,Germany,Kleiner Feldberg,1992-03-12,,Background,rural,rural,unknown,,8.446078,50.221943,811,,,6434003,Glashütten,no,6.913817430801052 DEBY004,DEBY004,DE,Germany,Kleinwallstadt/Hofstetter Straße,1978-08-01,,Background,suburban,rural,near city,,9.171545,49.869419,124,KLEINWALLSTADT,96765630,,"Kleinwallstadt, M",no,17.107523426602675 DEMV024,DEMV024,DE,Germany,Leizen,2010-06-16,,Background,rural,rural,unknown,,12.463929,53.396348,116,,130565621,,Leizen,no,6.520525826751615 DEHE042,DEHE042,DE,Germany,Linden/Leihgestern,1995-04-05,,Background,rural,rural,unknown,,8.684398,50.532963,172,,,6531012,"Linden, Stadt",no,17.19400233075487 DEMV012,DEMV012,DE,Germany,Löcknitz,1994-01-15,,Background,rural,rural,unknown,,14.257408,53.520458,17,MEWEGEN,130625212,,Rothenklempenow,no,6.572471710102648 DEBB065,DEBB065,DE,Germany,Lütte (Belzig),2003-02-14,,Background,rural,rural,regional,,12.561389,52.194225,111,,,,,no,6.5688081305907895 DEBY013,DEBY013,DE,Germany,Mehring/Sportplatz,1977-03-01,,Background,rural,rural,regional,,12.781385,48.182835,415,MEHRING,91715101,,Mehring,no,14.525675711369342 DENW065,DENW065,DE,Germany,Netphen (Rothaargebirge),1985-12-01,,Background,rural,rural,regional,,8.191934,50.930328,635,,,5970032,"Netphen, Stadt",no,5.5828906369949856 DENW066,DENW066,DE,Germany,Nettetal-Kaldenkirchen,1987-12-01,,Background,rural,rural,near city,,6.195867,51.326939,49,NETTETAL,,5166016,"Nettetal, Stadt",no,19.60067672326852 DEUB030,DEUB030,DE,Germany,Neuglobsow,1991-11-01,,Background,rural,rural,regional,,13.031661,53.141304,65,NEUGLOBSOW,120655502,,Stechlin,yes,4.248033122879065 DETH027,DETH027,DE,Germany,Neuhaus,1991-08-12,,Background,rural background,rural,remote,Unknown,11.134591,50.499954,840,,160725051,,"Neuhaus am Rennweg, Stadt",no,5.4560661043846945 DEBY049,DEBY049,DE,Germany,Neustadt a.d. Donau/Eining,1977-03-01,,Background,rural,rural,regional,,11.777817,48.85321,359,NEUSTADT A.D.DONAU,,9273152,"Neustadt a.d.Donau, St",no,11.463016348388106 DESN079,DESN079,DE,Germany,Niesky,2003-05-05,,Background,rural,rural,regional,,14.749731,51.285355,148,,146265502,,Quitzdorf am See,no,8.341097323821916 DENI058,DENI058,DE,Germany,Ostfries. Inseln,1996-02-01,,Background,rural,rural,unknown,,7.21398,53.715302,5,,,3452020,"Norderney, Stadt",no,8.455727814497608 DERP017,DERP017,DE,Germany,Pfälzerwald-Hortenkopf,1986-01-01,,Background,rural,rural,unknown,,7.826522,49.270264,606,HORTENKOPF,73405004,,Merzalben,no,4.996870112175138 DETH042,DETH042,DE,Germany,Possen,1996-01-12,,Background,rural background,rural,remote,,10.867189,51.33308,420,POSSEN,,16065067,"Sondershausen, Stadt",no,5.731506017470791 DESN051,DESN051,DE,Germany,Radebeul-Wahnsdorf,1967-12-01,,Background,rural,rural,near city,Unknown,13.675006,51.119511,246,RADEBEUL,,14627210,"Radebeul, Stadt",no,12.431592385265933 DEHE043,DEHE043,DE,Germany,Riedstadt,1996-03-20,,Background,rural,rural,near city,,8.516797,49.825165,87,RIEDSTADT,,6433011,"Riedstadt, Stadt",no,16.680100143239645 DEUB004,DEUB004,DE,Germany,Schauinsland,1968-01-01,,Background,rural,rural,regional,,7.908036,47.913254,1205,OBERRIED-HOFSGRUND,83155003,,Oberried,yes,2.069317908430549 DEUB029,DEUB029,DE,Germany,Schmücke,1991-06-01,,Background,rural,rural,unknown,,10.769533,50.654068,937,GEHLBERG,,,,yes,4.390458645846876 DESN074,DESN074,DE,Germany,Schwartenberg,1998-02-06,,Background,rural,rural,regional,,13.465077,50.6591,785,NEUHAUSEN,,14522400,Neuhausen/Erzgeb.,no,7.68523284266574 DEBW031,DEBW031,DE,Germany,Schwarzwald-Süd,1984-01-01,,Background,rural,rural,regional,,7.764528,47.809892,904,,83155012,,"Sulzburg, Stadt",no,3.4389926002665256 DEBW087,DEBW087,DE,Germany,Schwäbische_Alb,1994-04-27,,Background,rural,rural,regional,,9.207639,48.345778,798,ERPFINGEN,,8415091,Sonnenbühl,no,6.540338979727645 DENW064,DENW064,DE,Germany,Simmerath (Eifel),1983-09-01,,Background,rural,rural,regional,,6.28107,50.653236,572,SIMMERATH,,5334028,Simmerath,no,5.509009866414982 DENW068,DENW068,DE,Germany,Soest-Ost,1989-03-01,,Background,rural,rural,near city,,8.148061,51.57066,110,SOEST,,5974040,"Soest, Stadt",no,12.670414585555143 DENI077,DENI077,DE,Germany,Solling-Süd,2010-01-01,,Background,rural,rural,unknown,,9.55462,51.708839,295,,31559501,,"Solling (Landkreis Northeim), gemfr. Geb.",no,8.40113799392387 DEHE026,DEHE026,DE,Germany,Spessart,1986-01-01,,Background,rural,rural,regional,,9.399442,50.164433,502,SPESSART,,6435016,Jossgrund,no,7.538232128849274 DEBB066,DEBB066,DE,Germany,Spreewald,2003-04-17,,Background,rural,rural,regional,,14.057064,51.897598,52,,120615113,,Neu Zauche,no,6.242489303806773 DEBY072,DEBY072,DE,Germany,Tiefenbach/Altenschneeberg,1983-10-01,,Background,rural,rural,regional,,12.54887,49.438465,755,TIEFENBACH,93725308,,Tiefenbach,no,6.55314033706656 DEST098,DEST098,DE,Germany,Unterharz / Friedrichsbrunn,2003-06-24,,Background,rural,rural,regional,,11.043384,51.662453,410,,,,,no,4.3249722250585805 DEUB005,DEUB005,DE,Germany,Waldhof,1970-01-01,,Background,rural,rural,unknown,,10.756733,52.800774,74,ZELLA-MEHLIS,33605402,,Lüder,yes,6.637390724799518 DEHE051,DEHE051,DE,Germany,Wasserkuppe,2000-07-05,,Background,rural,rural,unknown,,9.935862,50.497711,931,WASSERKUPPE,,6631010,"Gersfeld (Rhön), Stadt",no,5.258516400704886 DENI060,DENI060,DE,Germany,Wendland,1998-04-01,,Background,rural,rural,unknown,,11.16705,52.95702,16,,33545407,,"Lüchow (Wendland), Stadt",no,9.88399812585395 DERP015,DERP015,DE,Germany,Westeifel Wascheid,1984-01-01,,Background,rural,rural,unknown,,6.3781,50.2665,680,WASCHEID,72325006,,Gondenbrett,no,5.270283853346025 DEUB001,DEUB001,DE,Germany,Westerland,1968-01-01,,Background,rural,rural,unknown,,8.308208,54.924969,12,WESTERLAND,,1054168,Sylt,yes,5.123743401705111 DERP016,DERP016,DE,Germany,Westerwald-Herdorf,1984-01-01,,Background,rural,rural,unknown,,7.9735,50.76675,480,HERDORF,,7132050,"Herdorf, Stadt",no,7.5608887467047445 DERP028,DERP028,DE,Germany,Westerwald-Neuhäusel,1994-01-01,,Background,rural,rural,unknown,,7.7299,50.4243,546,NEUSTADT,71435004,,"Montabaur, Stadt",no,8.176328171592356 DERP013,DERP013,DE,Germany,Westpfalz-Waldmohr,1984-01-01,,Background,rural,rural,unknown,,7.293522,49.423138,455,DUNZWEILER,73365006,,Dunzweiler,no,7.241496239470168 DEHE024,DEHE024,DE,Germany,Witzenhausen/Wald,1983-05-01,,Background,rural,rural,unknown,,9.774589,51.291759,610,WITZENHAUSEN/WALD,66369200,,"Gutsbezirk Kaufunger Wald, gemfr. Gebiet",no,6.34763255724478 DENI051,DENI051,DE,Germany,Wurmberg,1991-06-06,,Background,rural,rural,unknown,,10.612481,51.758163,939,,,3153003,"Braunlage, Stadt",no,5.652281144348398 DEST089,DEST089,DE,Germany,Zartau/Waldstation,1997-12-01,,Background,rural,rural,regional,,11.17235,52.59317,95,BITTERFELD,,,,no,6.349581619662699 DEHE050,DEHE050,DE,Germany,Zierenberg,2000-05-01,,Background,rural,rural,unknown,,9.271233,51.360752,489,ZIERENBERG,,6633029,"Zierenberg, Stadt",no,8.549351783351376 DEUB028,DEUB028,DE,Germany,Zingst,1991-09-01,,Background,rural,rural,unknown,,12.721938,54.436989,1,ZINGST,,13057096,Zingst,yes,5.197794008346108 DESN052,DESN052,DE,Germany,Zinnwald,1978-05-01,,Background,rural,rural,regional,,13.75145,50.731476,877,ZINNWALD,146285201,,"Altenberg, Stadt",no,6.719808983782324 gstat/inst/external/oxford.jpg0000644000176200001440000017505115060550314016206 0ustar liggesusersJFIFC   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((('" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((cVr5)Vh촻:c l&7'?)]7J ?(/)d6׭rUJ!fTe)\0İW|R:}S[kMr݈S#eH I9+y〹'XƯkx?zI s<ʁ@Rp=:+iʱ]4,B@Hx6Wg* #!RGU=b~#h-GƞoZYOt9H.cpq joe]~ѻ>Am6zPE|cJ&Y^!ti6gKXò#,Y6 ƽ;ǚ{vʶ22DCnB2hQ^uwށD3[B~e'8Va߇.O; ,ѩ\Up @+[N x?`o6JAֺ(_Y<׳~nڑWn|G_e;g}?n۴[d}޼^kwⵯ]Wje"Ou$h}`^~WXK_5 yz̍mC:+H *4ƯAm Z2"+TF$fÎ/q}ou+`I ȿ#A x |bOgWnnol/EzMM%e#Rqx/Z>:n^^Ep8!BoF9#:o#> g_Yյ=ե~dɈ.Ðp:kxþv滇OCʮK+-Z+4ͦ:VKCe@%@`7劁(((((((((((t*~!.몮WM>((((((+g]7J ꨢ(((((((((+|ATkVi"'c"b]`=]yW/7)tx?U񞕶;{"IG61 s&| ih%#H'ses7QA>O|2^L&Ucc["ez|t_WM6Oytb vǵFު4rvjR麄^u%+7XdFA< ;Xml hQc(*F0@ ? W ?~v_ɻnFq#>s/ cB?" lb8)'D2Ǥw".ӌX'|46.WKᏆSC&;*[ I \ ?(;w 5音Eυ/|}Fm|2Jy޼<?O%momLуIkŖAf.H!9.4$28w1NUv<=xW>kֿdԭ61dۺy~e$oi ~c=ם![ۏ94:u?a>F=1>fO ؓLWq\I#<N:`q^z? MKhO ʌ>~ߜm"E;nCGZ񝆑Y]}˔ݘ@8r 7 . T_ K^@,5/?J i\_IZ6o1,qme6_F@T[e Z5hhbKI8W6X<R麄^u%+7XdFA< Yo!{i)P2H0U _~|K:c-S7yѧn0-o‚xWWR(jDA]w4]NKΎ\bA1Ux_vo~{.%GG.c1Dg]Ĭ} uf~]JIW8C^Uyk^'>ScF (_0r8_Pi:YZ|u)qJ2#3_:B>x{6Z'4 v䐔Q$lIr(fWZNkiVzneg [#E $p( ( ( ( ( ( ( ( ( ( (9]7J ꫕g ( ( ( ( ( ( t*~!.몮WM>:( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (((((((+g]7J ꨢ(((((((((((((+Iƶ㏂^#F}z6P;2@$sp_vC@VYG%UؚW,?M+?@ g??lUxsGW,-4CFM-&x+khSIrĂܨ$`$O g??dUxsGW)>?Ю5]C #|ȧkOß? ?&K<9A#cß?6?*D9@ #k>9vsKhV,-#"Ԋ3xsGGWSL~Zj)?AV FX32k~'ΝZv+Ay v88tQg"=H?, 5ҿc^ X_-.9@ g?dUxsGGWzU2Hti!8u^{idGtJ$h.3dDnP%TY^K:@.{Xdi$kϾ9ڋ }4h#{pqf>ß?2?*K<9A##?G"~q4YG%UUt*~!.몠((((((]7J ꫕g((((((((((((((/_)O~NƠ( Z֛]C0&Q p@"KCx=WBTJٛ.Qx$j3/-<[he@qFDR`!*xx\/ `7<e߳v߾͌nn]X9|)+l#u ^k[#i%ib4p su]#ִ.t\L#8SPWz~];b0k1+|~xK%쭰w%I#S5h'x[tKj!W{Ñk 3qKpF&=1+z@=o_ZO,O)wː9bOEkƋj 0-GXm会͝IaF#;&{uR# q@hd:F-|\8w f#ܞ®[h15\ c*@RRgP\;x3%: ?»rS'M1dT8.<܀33qPtEP گto?1*/EUYpԓ]PEP\-oxxImun]}pJ;Lp6@cQ@Lҩkj|! !}RQEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE~NƯt v?F5tQEQE޹o-. eLdJ렢2th8?ٺu .1k_)((v0NJ)T  +9${(5b!'~:Z1cSY9 ` {(Wks(((( U-mV/??/Zڠ((((((((((((WM>t*~!.몠((((((]7J ꫕g((((((((((((((!WW۫?\.]J) n+Q׊z9_6W:+v$tPx*\0Z=/TS0\pOx/?%|Z\_Մп$;H8=r>]O#1 ?U{|c"d~lN}x%Z=T)>HHp(SO#p:/X.e> K mBn,g֠;)Sզ]"+D-8bPH9#qצQEQEe\փylC7!U@$<9'գ('uscs/1@ SKkuU[zs ʡF@`FpO>/KvJ{Gm ĥHPp>€.QEǥˬ_# WBsJG gnu9kͤe *|ypCYe̷\nFF}*ZǕXYn38Yj{eNA+$ AÉq46I#DR"!<ug5vVuv}d0F$I?yk\Axqԫd~jQ@k'Ώxc@|KLw# mld.̪ $$>\ j/eǙqsa>,I} ( ]SΏcN#>%[,w,;0,sJ ji5iyi_"ۼsw;@xCA3BJgK[TQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWgImsk\W&?@Cym1ME"7FV#jrCm$unt*~!.((((((((((((((+m־p|?]ZV%id2D/ lqS袊(WX_zɲL " cQ@@5]J[K#QHV!|#Ok6f%p2zmnp3Wg߉-ZKJûv%fx>`t}nUuI}qrwwۮLȦXBa_j?Hukom'/$+!9-yĿ'$7qcNwM z$@(x]d09R$~kWY !`:9^ŋ^ mB ^P>a$g4EGY{->im77aI[ )Je3ZC4Ȼr =JTyleGr W|dvx㕅_n(` ]Ƨ J:o}Ccïu4]F_AkSͼ" ۏ'$fBԼ!ZXNFKoqր=.DF<}l&:fnŖXPFnX5Q^+wm w&IԬ0:*pܳ8D"Cj(+uO6tiuuu7l1 ~V#Ҷ[;n"HvZ.M;ĺ\~mJn*7!=<}xs[!%HaV#Vxt*~!.몠((((((]7J ꫕g((((((((((((((?MmZ 6zi7܊9*'5}?x7zvha1W9jֺ4cէi.eb^,A+ ҺKlU澝((W i]\ 8by $ӠV) ~ۛ?1ba2X0<\H9+_&_T@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%O??}uUTC`]3GU@Q@Q@Q@Q@Q@Q@ro?LW+St@UQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@]Z,PKs$hΰT< R.OA_lXo3[$DL;Wy]f+mѺW6~#.,xnu5O evPYF*v`\m|whZM?-<٤vB͓-zPEP+Ow.}:V{{^WF|=myVK o.< Pn#8'Ҩ׾_ƞGsWdPĀE|]ǃ*Xu UV -u|g^E/ŬMw)WI3e_*F@v 9$-|kC BE#7VUF2{upq ɮ-tGFF)vU3kh.F`FxmR 'c@x~fm,A'x2{9F%# ,bk=*[wݵ (g+D?b?((((((+g]7J ꨢ(((((((((((((+3$G9뵮+m֊((((((jKotd؋{A-A,3+ӮylV`?Z'Z؆"g|~\&:$@C,ݧ,iVO,{~teNs\;2{{ZoUeeߕ[깮@o2'm@f5`d1c׊iG<|Q|=h V/8[apBF 94Lҩkj|! !}RQEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQEz|PMn2cs#6SفEvm:q-F1G,4g+$)ǡ^,xs:*jڎyg>/.\T+O-00@>(ZkoQ/m$,ܹX␌?#nwciж3%MZ7 uJ؂;T#ڦ=RS[wm,7M y2fdQl0BzקEPQZ\yk ՜Om2,KIC)A\?ڷot^[XjX^O3EFOU mFs xw~˻˛hI?(dIewTQEyCc226q |=o[[HUXDb5ŏ@>BsyKτZ!ȃvo1@~x%ğ t]R'y7C1Tcy r4Ko ilY™rHv븏Nճ'/M  h~+hoXsl66bybG'5K,6(I5gPxV#:]'YGn׈x'}_JOXıibE3V%RȲ`TE4Lҩkj|! !}RQEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE._ AoBZXY-Wz=y[3VZxN`A|..QY^-𮳬>e5ߓgmqc85o)]WI%ޛ%˗ܷ10zyrkɣIf$hK3닸zBFF@{g,/IZ$0GR1_?|ottY%ICer?vmb|xWU"rd YV{+~Iu_M=\ fi xo&OCQ6(mf =}cIgs@ku\JE,͒#R(JzQX>d]ZWVr)6<HIH<ޠ*UY^BIC)8#4nE6I4gf8ׂ|ii3oemb>p71P&?,LBPG?{'&rDž9jn]vXA8'54>O.&W;QA,p9<Ҁ,V[jĕT~-SV> z޻Gm%gF*>퍦:Vje-/ >X<)tu;+ƹ(z*݊}~a]>rrzJ_ԑ܅_6 D{O(Sh*kgqa̻%ۮw#yqF'u U(+OFȱ3]˷h CI;~fͻ-5?K,o,Aw7&_TXLҩkj ( ( ( ( ( ( ( ( ( ( ( (9]7J ꫕g ( ( ( ( ( ( t*~!.몮WM>:( ( ( ( ( ( ( ( ( ( ( ( ( ( ? jfG;˫qF.*ੌ`;`s|F[ hڢe$ @~# xf'M2+x0GqnjWIYi}١~=+> )el&lva[nh$wvy2|2ӯ#5#g q6F"`-Զ0l}<:TZ@V=t~FX@O#qSw~0xN[#XN=}s_Li x}귈7kVByG<<'?_ͥ>|f[ OopP|=IUMKdErG{4DNFv8X{UGL2}dA7$)U'$qpy-дem/\%%|p|a˿YCI,w7IrLCUPTFW/߀k{;mB8gbSG!FI'~8WǤi;:ul,R?:^YX_|q@U׈QW@X/-45Mn0R63Khx+Y"Xj;8(/ cb}1H=i(~|M׍tH5_4K> 2TmrB1aEcCHAΝ]_}K8"nAh']לd PRm-&/>U*WX],vr:qCMFIu3$g\.e xR6DnwBr:qI#̳D5mŁ;W+NK{ԑԩ9N}H-_7Co졤m.2+2҅f,~PT>Y"+ NB9I+ppx+B ( Ꮘ?Ye,6VEޥ<^Xt}1 ௖97? 0ҩkj*O׮!=v ( ( ( ( ( ( ( ( ( ( ( (9]7J ꫕g ( ( ( ( ( ( t*~!.몮WM>:( ( ( ( ( ( ( ( ( ( ( ( ( ( 6o,L[ĀFn=0;uX<>w7K)20YO>j|B ÷eU$Km-t=q>ޕIxJ-“ d~"m4Z4FP cӐhVAVܠ^X#-/aXrGʸ\-o*$$rc4)ij5LF#WG"ɿнZap #|]*dgSvr0y$ ͧ#e 7Wq2 5+FvHXܳ9%ę$k((((((((((((WM>t*~!.몠((((((]7J ꫕g((((((((((((((pgM>-2+Ky%EfGR :q*'h[i$FE $`2r:=A~x#KΟkq}q--M*4 | ~ff: zy>fg)OHN*Ɖ/ 夬V'!6 >JTZ:TlI)kn,6Fڲ-Nր.\P;to ]2}.rg<7n9‰u]*;z]iC,E%AFTtii藺do F$nHdt R+k^"uIḖݧ{;!1ȉ/ ro[msmYtXr")cey9O5Jg;U2U@$jWY@ I'$}M%ڏGqU>~קPI将Yn%2H=9曤GXCuP\ L5t[]v-Y^ Em->VY$~n8Myf/_kV֗UDw,7V;F0u_]? ?kڎ W2& ۶PTF#{lnsmnd]2%Ip@ z1i,c/DŽ`(8"sqM|g:wc>L1ѴQ`O.Ce?(09 u 'IQ^&2 j{֚epaہ:Iqax4m* #{B>(Hg%E(YOPA+?@tٽmxC+.}@=O_=n(btD)s߭w(jw:1^܌K2.Q@ 5'Au*8>h;h<#Ǟ޵k-U\ vmqJ1$oEׂ/dzb6GMw[ Wӿe!mb1H{ JA9mO^b]ʝ"}ns<}3EPY7w#"Wm$΍~kU uk(g녑 >Y$nœ3@ nd}<繕-q!8'Z,Ċꪨ]K[QEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEW E;iҾ"'/ wiDUH"=# E IU0պ[.0uyPci13\dr;]6Q(ڪz֓D{֛}i^Ŭ9qX#sq#,bFABGy`z^o$^:{tI=a&I@reOcZT{ibqQ92>yh:m!qb3f_u}P\1]#Z"!Rf}*qԜ ހ:߇^0-kCgʸ\Qz"zo=G>#[=I)?, m=W?]\÷BѮ<.xWA^c]ğxZR٬< ;Ƃ hIc򗏝rxCA3BJgK[TQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWoIF<ڸ_Mtm'4+So{[#jd1=J7 b#3 i2]h(-S;y#(2x~::W\0[;ƦiGCT'$,p<E@٣E:yi8V>]Yf2*;o,4咋f}sn7qZol0*lr}>fQdֶ<jw1W޺Q =AkCW ᮟ5k{F*̬~VN1_z}\K$G$x ܎ۍ44kR?b7D9'#bf.nK+ԍzAr4a#a={aWh`G+asGJPOHNGzY?\[ mR| ̓ۨ*Dtak;[4n(i*y>)?^>a?11FjZBHol% $9+ĺ=ׇ.F4$n, AԓԜk)9N})4&toQk61h`3Os_2ڷdfo*FRr cA^+."%'Fw マ(׍|_۹-(HekWio,(l/ͼ9kK8.aϕ2,#"I;H%Vd]ʈ~R3 H!̈8ڻJ;|^d~ d[,bfR~2r>vĘWZ#gK1!P9* `$&:WaG|kmK/ċo趶Xn䗍KF F+#>ן |R|]i%ὟPX82m!@\`|' Ck40&lilsN 99g!Mh+HcYfEv| gK[U9_tkj ( ( ( ( ( ( ( ( ( ( ( (9]7J ꫕g ( ( ( ( ( ( t*~!.몮WM>:( ( ( ( ( ( ( ( ( ( ( ( ( ( 6zk3$G9fV$NBdSa[ɩ3mZU (Ys@=sV[86ఆ'ʜINm~ͣ^jpn[KUٵL<o9PA\]?kJ.&ah3)=+9>O|[sC[YQOy7(TF A$&;YbJ0ʰ#Jgg~)i$%`ul%t Rpsqc_U? Λqj4btK8>KTʡA\x=CI}W{R0[o*A'1#5R4-cJӵ;h˖A('V ZKD rxRc"kIK 0E p_'r/$/5OGrHħ6o\{mwZƧ$5!#VOpnsniVGw> ⊡Gaւϭ< t0(eQ@ L\4(˨1M6zϱSc>ԚF'tIx٤yXH&\' =[,tmX7mkwdV<*{Wk¾*v%ZwGٓlu I=ܵ]6> "5'`7r:g?:D>o٤6*&FFGK$%ӵhD`pאA-MխcXm- q>o"J$.U0 |&㏅-m$$T# Ā|MLj5&4VsHʘ9ل] 98#׾yudԡ,#U!>P{'u%y$iYrerIc9޻zȫ}]LPEPEPEPEPEPEPEPEPEPEPEPEP+St]Uro?LPEPEPEPEPEPEP\%O??}uUTC`]3GUEPEPEPEPEPEPEPEPEPEPEPEPEPEP^#1B6x}I} +Mn%XD857v^Zky SLJDaH ם a7R4mFd9.Do '5^W:,z[۬Awnv Ny%ev0 ^WT.V RyoskX20)z%xcY"C`FA5mBHү5-B_&MFY$,& \q2GA4^[V\y1,#*@7߈zoP#?&EQ$qLC1`ezVV~7V;wm8zd֭ 4g|5'v C*D: ' xK>^%݌A^GPU @ހ!tx^_ZE@&bHUU<2k;i>, w BO)Z+@,0,H$R{Z[kel$X I8#>DҴW6Yۤ(@Ppϰ)EmX`;o}sp+Nk>4|/sxqX(Z[me$r3F895洙=j-AчAߩquD2>a3Eׁm89NWJO]~y)Yn\QEQEyݕfʣ-!y3RAb9k|.ďp"GדU>-iUᆖGl2p2A>uȯ_v mzgO:V/ҙkk]-QEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE|mogImskX.M[B;tL[ʟ7t.s[tia5[$t N7ݍ6_c:T#Gg) ,ɴ9%pqEPo0x76LgUVOG(G Nxp+fi~,>54+2Kku7?L$cڇjH:0or;$ %("r2+>]x}2|CH]b5gPX6U10q9CW!աWEbF `Gs{#d(?kPlR% cǧ|89ǥu_ه[^^[eԣWyfg*CG6Bt dyT!'.BBU={v;J)t<((+7_ӎYUyP6 :qByHFsI3^26چ->JXmfr}C|e:/)jy-Ͼ= ixOA/ e7$ [gnv" rGYaZMS=Y:JB1xP_EXJd_*_WS%tQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWgImsaw:Zq(FF9dE =|GK4wE-?mӮ@B$cV O}EHH`DyY@$ MsrcTc>9G5=7Vv; YclcrmA6%e@8pH8ܬ`8"3Wsiwڟ!v^ie9>\+Y<h}7 V&jV4oui,)$S38D2N޸yU(ι3Ӽ Ǫj]l[TV` `1sQO:sEignaFXnXVGZ'kiuɿdy¨ 6%ݿr2pb:NeJHW̍W Hz[/I }߆n}kԸy&nHS,CxPJz˃kSt5 2;)trrwA".?Rk6sA!g"w1s ;# |C~FkZT{+ykHʝnNPe;ᐤP֖zS mb2,0z/?]9G5|Ba,h6ks\"6,V'ub= Fy}'EXJd_*_WS-tQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWgImsk\W&?@Q@ud7g3i뎼V!l{%V%'Ye\=p: k/GբAq52;]H= J̽4=V 6Un0p,PkIM|SFj i{wl!p]X49(2;>O|6nz07Hq} |"$ J(}#ƚ5զo wrF+h0ۆ#8P$qO ;5Yuff'@:Ljg߽Yj\23[*#?J;ko |sg\F5;"ψ0>br+~*v8O>crePxX_'r0Gͷ (]WNld,lǙBX |Qo>ZNE#89Gaѱ`qUmFQKmsC,dÏPM|k(R@h_!\ſ7 .u[Qi`<7ŭZ"FNJ24Ɲ(@yyކ^h]mUoܿ(U@eGkו,$uC7cIX %)⒑'_EXJe_*_WS-tQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWgImsk\W&?@Q@fbRcԕdcH1Gb9ɭ:G\O j1Js"<Ń {d@#q_7|)ԿjvIl`r$EU '׾&~K=JQq'0#6ך|,3 jhLgFycp 0?I(oRզ<9Hu z^iAS,#>ra)ۛR\_j>K |6?< Y=Oyػf,S(f%X{YiI{kwq?ڶyw*;7`?63@QEQEWx'Pnzx2W;[9<({vdc.*2A eX|I `Y~ h.5جmY t<(+xFLv;ѕrm*OM1r3ھ)4[᷍d5XZ(c;L޼kV4Vb0trp%{@)iq źM$Oʺo֤uCi}$ڶQSOCrzbLdp @tAmI~wCɎ<ǡ*}+Ev^DѠ،矠4&yDLYFrAER:V/ҙ+k]-QEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQEgx_F>;AB}G fvI7ڤP$c7}y_"zugnR̬B*@\玔}ŏ ,Z7$'1\~n1}xgB*96Zf ]*z:|tpZ?oq Њ(W}׉|{%NҼkRsǵ@|.$/q?5wPEP^k>E˽Ou$([!~fP@l t5TP? ۏ/?ɺE%w?|v;U^ sw%G2C2(m/###k7B;خ7-k? 22O1#6z}kwsk(sBdzT&_Ɩ fFo9 ~#پX9M2)Fe?OxM5ݘI2)%cV,qNOVE)o CUQ@/_vZGS۬fYo)+0J[>EuUJku"_w2K@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%O??}uUTC`]3GU@Q@Q@Q@Q@Q@Q@ro?LW+St@UQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@x_S1+"э@gjz'fY!vZ4Plmɦ\dBzq}yWA|{~m,wD&r qr+2k0`7㶍[+ci>[4R3݆J1TGhkl=Xīmy< b2{zywVRޘM:. W?Ko'G4~[DKmcn9@]_=x32L1[UXY*ST$&W2!PQEQEQEQExŖ Xm-REj컲9eg$ wx/ @9~]nR[cn-vcݲ}?/iӴV1E#tEܿGC_V~'tRaZC\$6Yۤn% Y]#wƥyok,kK*x0yҍoomf'( s?NQ ij0@> (:_*_WS-t|:V/ҙ+((((((((((((WM>t*~!.몠((((((]7J ꫕g((((((((((((((}s:%mYuicB e#; Q'ÓM-c "O3'''qsQETwmo,20DF dOޤyOme6ٽ Fq"j.S2[Γ݌88ϧ,iРao`1H>{CGß@?jotlg;Wo%Ŵ)hY=G8}h/ZEh|22D.NA^UO=z/kKODT"`v_R[Aw?gy4z% ch@I8$0:ҽ+:j$ r)#(9^9{^ <_]ƐJ˼H6` Zg}kI?EwHc %+~>GfNMxvƚfjekqh?%̼umq 6݃ ( naH @@,=Z^6k(-94{vɮ%8l >Plo $UJku"_w2WK@Q@_5n OZfB[moy!B?6J0ak|gĚΑe4qjvvo"WfӼoe_ ^kqcy[KK-qm[BW3|6s6i$GhPby$I&:Z+K_oJ{K[;d-%˃!qpx)xZlu3R< IMneR6Sx=W|5{jq, +#+svKd )pk [P4KPɲ'imc 8h>'3x h|9sHMdl6udW=ᑂ6pB]x'߉Vz/lh~\q ml̸sTWu[!ON=6h|+i'9G݁&;JM١H~u'4T '&-QEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWE;iҼ/?)OQEQE*T]xʒ21X'ghM|~Xžq֨7ٚ{~qMI- g1%Zo2BfgxcR~" (ج w\"n19eg]PFN.9(=?¿' m+Y)W 4oiGCz›y?}y߻sc>sz'kH"ߩ?a"5ݔӽvK5dyC̱ ) 9=u֊^v((ȫ}]L5EXJd (8_u4kw66(Юk9/ "vM .>` srΝω'Տ|.QMG.#bnbC|T2@5O ^F9bۄ˰OJ$:HC=˧KmefXpn|*/R2kh+D|7麾♮u)n jDd嘅 aA`pJ=kM"olkyd Aq]p);OkZν}RݵB/ʮTj>4cX'ټ2ͭhͥ>]̐Dm@;?3ƺƉ|][hx| \4L.UHpB]Gk:o:$Iq,f9ːŀ8|O^2k}yN"|bvs]>yω߆w.3 X``,kfW9I ( )_Z ]GE/=_˞Ly1ֺ(UBxkMMb_A~pJ,ѡ ` u*QXFk𽎱c%v{2;}P ƭ2ۓic^Ex~k~[*éJ&TH P3 T;dEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE5;-/ZY.cvdlGJSx\M]U%1ġy0rǩ'E}úBou(1L~/=Բ[oGBLH zɮxxOH UZA1?N8+X,mbHEI|chCp/TuGvc5-B9oH<Һ +KYnd0Hpdjv))z^* Hiw+c8ʁy;uRoI=*O.@H=xx[z4wʹgqkR ޥnt~auhi#3c$9=1=_o~k&]12r{V󲲟ݩd}}Py]?sqF9z þ&|E }&9UZH:dwbNQp,NGjP_OnX;pay(*+M l}J y͌b<pkؼ7Ŷq,M^Jg;tOxIw[Y%o&\@‚z)b5i0jzDhw&MX=A+B ( +G5mB;-{R-ԑ <_(IT*}:.3xIF]Qm/T[MD2A!kh(OɽJI >e ьb9O:ƻ/zlj6vzPn>fr]@d؜(HƽxR¿Ϫ粝˷r(((((((g]7J ((((((WM>t*~!.((((((((((((((%]7ELfJGEݜ/:kM;=hQTXT_X\LXGqDO 0 ߚ𯅬5Ks'6N65EݠA]B }}I `)~:`~;* kJOih 02qU1ZvKK)'7L vV2eܤ2qDŽ0}VBI[9OWdOoJ±i~9񧆈F,e\COSu|-cCOә9'Xpr0k*3Ck·6Q]hw @axp? D[ö6Zo;{t |U 7Ŗ+lpQyynFz{ mB;d@E~mbGUa([iWhflNr翥V]xSUI|aA ~sJ j=y<< lJ-jkxŔum##'Vuoè[,0>,R|>?O}wd-[kO(_;Tr:-y ?\ 9 k."ya3ѐrsQ@ïb)Zȫ}]LEPEPEq_2Ѽ{oK5fH$p큸?8=>(WW-| ).ollmw.Ȇpyp&ΗW]Z,./9cRjƙÞ0}DJt-፤xE"4?Ն\1~e18O]ѴmT-Rf(tT#oUTg[?><"u9lWɺY]W|k^59[iVw_mtl`7qP"+nTȌ(Q{-QEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQEqoU|soF-EEQ@Q@hGTh?;N:hċL 3bcԓF~=,ae<'+kWo+Mdv'i< f-p7[F/|?"YΟk?r}bv>"qcv08Eex%`+ldC_t[qi_3ivIb4\@1КZ)U\t, u3 k?B2e=~cGŸ쯥{oĺM#(뜌ƽ& f)` nH#^%hz;nlJnA.|O[obV) v{>׺}ϷZ[:5}댎+|Wn[px88:hmu6%!vRNtд+]:;r} p:((u"_w2K\ïb)Z(((:YZ|u)qJ2#3@++B?Ft?o+T۝d=2kޥ}mu6WڟiVXl78mgENKOKuY9GRMLY] AC JtM+K4;.HN1SZV {@5{4- XY@"$ggօQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQED0dnm"P?2{䞽8WWqmy?>Nkh|(,UY\/'1;MCJ9"pvQ[ּ .,[˙ nam9x##8/i:lJFDʱG\/ xnqEcqw,s0b8`dd LaQj̄JG8T'U~hbfN[}R46|9$0O@+ƣ[\\xP6p"69ҺSNfV C#:~9.cZs#.o3OBB,``''`죁$隺=& ium.܀O$h+:a QNT==~l"MK WS ꥣXGX4G*3n|g gdc= = -~:S¾#F7^<~y(UA$g1޽Ħ.$ӼAk[ˆC 09Y7VVR%ŴI KbTr IʖKGϭMh+|)X/5tf-"G2X<⽖x ܎D4]3)YuxmĉJpqֻ/.3WYc\y0xڽs@EXJe_*_WS%tQEQEO{i?q"Y"T9>*cγH}[QSw]N~ltZ((񟇵MGíft(#Ie(8|4\[m7^u7:IT.k=kM"olkyd Aq]PEPEPEPEPEPEP+St]Uro?LPEPEPEPEPEPEP\%O??}uUTC`]3GUEPEPEPEPEPEPEPEPEPEPEPEPEPEP\W&?]q_hG=vg?JZ(|en5,gUwgxfkݶ Qo2) H$WдP͖> @~Li^Ffu |BwuGӟ- IpJdg+3H@9z`&Sc":kg"J1@Wzo 6sG'/ X~zd+fwK`lLia!8$nٸp;k=cQҬxJ$6n] $, >~#hVva.Up 89q_ ? 61n^tZ{57uaF+퍣k;]д~kv˞0NܹX@a2q@)j7mR?*x\UuX:x ɼWxXt!Y=9Gxþ6{lgtCt~Ps3UgN29qݛ方-+le0pu>$$jp`rh3uYL.h20@R8#KRMW-)4؜9Gs=1޹xn[+gx;w?hYXBO .u*'CT'{ZB:_*_WS%t|:V/ҙk((((((((((((WM>t*~!.몠((((((]7J ꫕g((((((((((((((?MmZO:){2K$B]drb=PEQEEwsWE(K,#E,MKEr qBtWo gqFO7' U@Q@sT񦷜1Hb1L c#9:wk[ZNO2i<(rI$I$ "~k^-ݏoKn +Y\rYe c8uTTqP(I*@'񞣞#(#xN/oRX}l/냁<@-!8moⷃ&uo*Zi:~BF{Mx|PEFkFMF6J }9zW=xWN+.H đBo,rxkƭZw(4\C%*<˞ymWƅaXZ0?g9!uϾ${_RYE_6ΊW9 Yv |kk2mgA%`kܼG/B״M"t7%$) \* )>e(|El0@s"a@8>+-uK+V8 68SKխJ"WsgR3jV͐#6?!?p&𥾢OfKnF?zMkxV6Hr ws+ 0:'$X\*y+x4; h),2&ul\.[ΒF "t7et9 Ę O\PW!q뾠((((Jf[X.}IB IrsPX}/5HR;ۛ1\)%hYx0s@(((((((t*~!.몮WM>((((((+g]7J ꨢ(((((((((((((S*24lbpC) :^Q> ZlCFw \ybZrx5|moEV~k5ޕ$Xݧ4qCw! Ќ  ZP+_'ۿ>ݞDٻof7Lu((ȫ}]LW5EXJd ( ( ( (8[X׈NԒXp.-ud]V27c`j՗ZBIM%bHOʥI8#@O֤Yrp>\@=޺ :Xi7v%2[B"N7}A's sH]gMx>hNvWr[94#۹ :[L?L)HǧJfzu;s7`qǚxlE<(0\O.elF=5sc-nj YHYNhOS֝ǽR׃#xZxq;d.mzb,(>fA9t{=7|.dnXI :ʃ+5{ vH4#Q~4:V/ҙ+k]-QEQEQEQEyW)l 8d#(u'"+#` Yf'lZ#sd21|IăCx{▮~k{MH'SH۠$+AHڞ+$ּ1s6"^[,Q,g̍!8(((((((WM>t*~!.몠((((((]7J ꫕g((((((((((((((puOWڵVֲ}=Grm MfV+m֊(|o>k~Cq%?16)0wLV⿳~[L:^O4Zg>o&z㎙w5ryvc;Ic$mV^޵)qsdՇzZqoE1>P jY-om 8j٢(?xY?vֆY6QsgzPJ1ڜi$ڊ(Y.}>o-"r60sG'^swK[{LA33tpx>F~~&{.go1v|c_}9ָ'?tz%v4 ( ( ( jFyj6Vpm-4Rp'ZWǟ_V>͋X}6(b[~_r9gO?gr N/+T\_ٻ$</3>x_Zױo/|$p3$__EpS wPo6(~vZΓ͋-#u,<'((((((g]7J ((((((WM>t*~!.((((((((((((((/mҸ?Mm;Z( <ފ |WF o_ιu[0FgGJK1aZ@"7S?hIN{ԟQ=f '8ATn-}:qM +QL((2VdS[y#cyse %?Q~5S._zM EyF(7qQ@Š(((A$Kz%v5| y?((( [.qY\y>2]Yw^izb}÷ A"ahJ|k{ycJ G7rr}E|׈|-3JѲ.nbV9IoGzwOZ^F񏁾ͥ\ZOI Y<6bamP d €I((((((t*~!.몮WM>((((((+g]7J ꨢ(((((((((((((+3$G9뵯?eVռIr{Y!<`K$ r( (O[~ C զ#1I帘=F:P4|~WIRcs ѥmcT9eZR955?xkNXE.uwو N⣜կiiݼ9b۰ {֚:(AEcx BwEmYO-Tkz4kp̦if9\FprÌhRjx #>k5 #Z52d+ n7/lv^s svclK1WdݛV^Cyc-"s+RW (?I$0[nqh<=?ޟG]qF>|ԐQEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE2:`P4Y Ie_xy+3$G9((_"k[E *pr cp3]XW3v .M+=&T8~ 5[u yЬ(*qzNLע)QEQEf]JB@#9"[!JLLd(#d=3Pk0=Γy y;t LW.Jp3#׌>S4!'-ȶ6ؙH+xX7|rg~\u5i3\Y!^H9#jq| $~e q'8)QE}I>J+E$L~%v$Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%O??}uUTC`]3GU@Q@Q@Q@Q@Q@Q@ro?LW+St@UQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@q_hG=v|moEQEQE⿵65`֡%+"dc߂xO{WS۰FG~+3E%gQPfe<w`z~}ua+> yϧ (4UQEQEQEC0D>t.In^{ꅀ;;1csT5Ya4Qx@l}9KеE" R)Q@Pz3|WI>JjH ( ( ( ( ( ( ( ( ( ( ( (9]7J ꫕g ( ( ( ( ( ( t*~!.몮WM>:( ( ( ( ( ( ( ( ( ( ( ( ( ( Ya{V񎣩[\[koni_3! 9p gqc3$G9(j^n"igymqo$.lnkh9 VHɻ/_6Sm4A,AI }QM]♮wyon6wJZix 6:wwv#_?hϴK5P*3\K2RAx=NÖտsoշF~^rRٷ>#g3")' ct[LZhQE1s?4 hYIr%L@VQ@ҧ|7g4o4;4d9vaPzT፧;OH*Gמ!f8m_*Hdԑtr{w40`c=n_Zr`}i!!hc _z[{EYk;oqz=/+;/|ԐQEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE|mogImskEPEPEP_X[I%ik= ߡƟ91eěn6yGc?+}͖&VIhavB,d#Nõ{x _ӡ.0[)1xCR[^2&Ӏd<_AGOxOj>/ߗ[Yd!YsБ^xp1N3OlRYk0f̅((((((+g]7J ꨢ(((((((((((((+'s)$ycQ1kelq]N5qKrQ!f A8 qzW~vojzΣauk fXiZhn T"(`qvF8QEQY^+Mb_ 1xe֤[+R|m 90]Fd)WxFtb)R;Gj7|cT|gXqtni&L̊8-OZ+'>1i4a] yx.y\"+#0Îgcր>||Yg|-kϱ=?_^[i/!B7Lx'<;۸+K;ls^;⿄>*Ls%c1ۀpHqSv:ئXHG2!{~Fqa5oiZC%D`YQn1}*xNtB>a$|d*.;%Lc~@`&fD7#1܊QkmJqQՀ;p;xPxSKqE@1<<-xrX|d!7 E}-+_MSEnX0H]Fm0BN}8=FGJ3 ,n4B;/$" %N@w4׎,z7.xp?>A<;f|+dde`@ppxAǰs"d_<=* =8L+:_j6YpoA@ =?;}l''eCGP}*}U'g9Wc\/'g+HQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWgImsk\Bimi$-FG8(ϋ>6~ Պ%Hֱc dd.2 :ƃL'Čq9qšυ}Rx9olt\Y1ۚծh:.4 {{=.(,;f?d<}5|shPxY_x;TlFi&,1oI B1PEQEUu ]_JԴ|+R 6e8 Gf,637Ž.)5].ڤHLmX8 `g1}u^QMhͪ,966qBunr1Ą瞝9 ~![-Fܦ˘ʩ#UPo XiqCk#rju+ݳ,Q[FP71s (z6VF+` R֫j7zeu sjHgܐˀʪci 7N3eYH}NF9s=jΡٱK+˖?4B9T`8$0 ¨+'Zi<0H`pg}rk^vMOұg{d%T BWk*\g;Y_8V0^`_@70!%BX3\g8=ko<){x/s,z:.Vمo_L@\9$s|8efG<]q 4>j;:Y0X$($}vQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEֳ-ErQRKe 8 3:׆~?/lrY 8gp++3$G9(iO|mƐ&hV&\D]LL3ƪghC}E}ovvg.>C/kKuO%Ûot03+1S O@xkC}kѴ:4yfpD;x\}!Ul-f%y-%c,c&v TQEr1}/~G=ȁcrȠ:cv9$,1EO> }=sk=eTnwfl֊+ ? CVx~C/b;z뫀 }m٥݌5 "ToVk~[R[ )utnbJ 7ӎ?*`^CBkME&\/",E*c.~nX;d`X@,eR6w_ %Bc{PF0 ĜWM\I՘`n$ ]EQEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE|mogImskEPEPEPEPEP^EQr|+|_Gl@I Iy_0>6‰M{tG*StoK͘7sslq^.Ɯm,E&r炱c}k-cIuhC>Z($^8#K_W7czҙ+((((((((((((WM>t*~!.몠((((((]7J ꫕g((((((((((((((_oLw\={\q\>dqڽ'h[i$FE $`2r:=A0{?5o:#<؃c$=Rj{65c=]ڢ fv^rWqdNfm\H΄0ʜ4%}+ŚdW6]Mhx;y⹷{iRh%PWR2#RVh:i$ڽv˱&eW'eP€pi+(y_QFlKq;B4?}9@?I2G~t-\JOB4?}9@fa4Eo!yzjs#Do^Ft*~!.몠((((((]7J ꫕g((((((((((((((?\мc6,Q-㻖(ː/'3+p7/o&l5M?N(.57{% I.lnu/#*K?$&pX AZ~0 M&+]du8`rȇv]lh+oޛ}isgZ5n7FIM#TpcbBں_㽿LԴIF YhhAEqMܥZܶP^ɦЎ,wȬ  ˶MͩwZU[Ic;W3ʰ+p$HQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%O??}uUTC`]3GU@Q@Q@Q@Q@Q@Q@ro?LW+St@UQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@uz#ӥG{#v"yq<eUMC"W5m.=l޵kKnEUNϽR'$L2toG$&ݾ[gg9ҼMK@@Z}2GpRi]W 1ouE6NVhffkI3[I#DblS|(Ǯ|Moym֝7yl9jx C -+Wյ}yI^;|HO9|I|6}$߶&mwkɤ@&}.S@˻I>zE{>[IZ-\gʒ22g\ԓo@i_x@iZ|:d%R8vXbŘū.ˤG=ܒIdĚ}]ִ$ho8UukplϾڶvyuu8:zGq+5\#ewD+&MxB5oxW+icSȦqt2, <5+xN{&iu=zPI' 1JH<1-XhPx#RҾ+wKh.NF(FWCHphܳxQԞk]^It[m''ˈL . 9ڹuPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP+St]Uro?LPEPEPEPEPEPEP\%O??}uUTC`]3GUEPEPEPEPEPEPEPEPEPEPEPEPEPEPEUM{u[gh>WؤDOyvlce*x$?{.?kIuhFr#Yo,$(,${q|7?L >%k^E}E$_1 #c? 9xU+Л &op4_O ~!>ii  ϒ7.щb6NyKT?|I_W7+ǁM h? "{m?Pm"iH. zmagmce|{h($P$ITQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+h:%WZ΃鶟j5ԼάnjA(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag( |9z뚝孵$i X9>讖((((gstat/inst/external/ncp.dbf0000644000176200001440000000457015060550314015435 0ustar liggesusersdrWAREAN PERIMETERN WSVGEB_N WSVGEB_IDN WSVGEBIEDC(WSVNUMNWSV_ENGELSC 31647227904 805264.750 2 1Centrale Noordzee 60Central North Sea 23836518400 991292.438 3 2Zuidelijke Noordzee 59Southern Bight 2996116992 608006.813 4 3Kustzone 58Coastal Zone 21310684.000 25581.318 5 4 0 529338496 176858.797 6 5Eems-Dollard 39 809406144 237455.656 7 6Waddenzee oost 63 2482308.000 8782.396 8 7 0 8828493.000 12204.778 9 8 0 37539448.000 36667.668 10 9 0 58258608.000 52365.965 11 10 0 92012928.000 71875.711 12 11 0 1566943488 222147.938 13 12Waddenzee West 62Wadden Sea 37442780.000 43513.047 14 14 0 160017344 60477.840 15 15 0 890277632 192198.391 16 16Voordelta 57Delta 116148648 69161.266 17 17Grevelingenmeer 56 371725664 182730.094 18 18Oosterschelde 55 455953504 212864.031 19 19Westerschelde 47 25196141.700 47435.919 0 0 0 gstat/build/0000755000176200001440000000000015162303120012464 5ustar liggesusersgstat/build/vignette.rds0000644000176200001440000000054215162303120015024 0ustar liggesusersRMk0 u] Av=s]EIllNn~l)C1fq'b툞ѐ.+:1}}XYY{GOis+b|"ev5MiyAn>p඲R Bjn)dg\A }V t-ƜDb ZLCCo_s?t5"12a wO2*gPR[k![1x mLv4ϸMW+P?x*0\=^&Sl *,S3nj ǁ-]\Q sVj%@B_T~gstat/man/0000755000176200001440000000000015162302737012155 5ustar liggesusersgstat/man/image.Rd0000644000176200001440000000540215060550314013520 0ustar liggesusers% $Id: image.Rd,v 1.10 2007-11-16 12:59:47 edzer Exp $ \name{image} \alias{image.data.frame} \alias{image} \alias{xyz2img} \title{ Image Gridded Coordinates in Data Frame } \description{ Image gridded data, held in a data frame, keeping the right aspect ratio for axes, and the right cell shape } \usage{ \method{image}{data.frame}(x, zcol = 3, xcol = 1, ycol = 2, asp = 1, ...) xyz2img(xyz, zcol = 3, xcol = 1, ycol = 2, tolerance = 10 * .Machine$double.eps) } \arguments{ \item{x}{ data frame (or matrix) with x-coordinate, y-coordinate, and z-coordinate in its columns } \item{zcol}{ column number or name of z-variable } \item{xcol}{ column number or name of x-coordinate } \item{ycol}{ column number or name of y-coordinate } \item{asp}{ aspect ratio for the x and y axes } \item{...}{ arguments, passed to image.default } \item{xyz}{data frame (same as \code{x})} \item{tolerance}{ maximum allowed deviation for coordinats from being exactly on a regularly spaced grid } } \value{ \link{image.data.frame} plots an image from gridded data, organized in arbritrary order, in a data frame. It uses \link{xyz2img} and \link{image.default} for this. In the S-Plus version, \link{xyz2img} tries to make an image object with a size such that it will plot with an equal aspect ratio; for the R version, image.data.frame uses the \code{asp=1} argument to guarantee this. \link{xyz2img} returns a list with components: \code{z}, a matrix containing the z-values; \code{x}, the increasing coordinates of the rows of \code{z}; \code{y}, the increasing coordinates of the columns of \code{z}. This list is suitable input to \link{image.default}. } \note{ I wrote this function before I found out about \code{levelplot}, a Lattice/Trellis function that lets you control the aspect ratio by the \code{aspect} argument, and that automatically draws a legend, and therefore I now prefer levelplot over \code{image}. Plotting points on a levelplots is probably done with providing a panel function and using \code{lpoints}. (for S-Plus only -- ) it is hard (if not impossible) to get exactly right cell shapes (e.g., square for a square grid) without altering the size of the plotting region, but this function tries hard to do so by extending the image to plot in either x- or y-direction. The larger the grid, the better the approximation. Geographically correct images can be obtained by modifiying \code{par("pin")}. Read the examples, image a 2 x 2 grid, and play with \code{par("pin")} if you want to learn more about this. } \author{ Edzer Pebesma } \examples{ library(sp) data(meuse) data(meuse.grid) g <- gstat(formula=log(zinc)~1,locations=~x+y,data=meuse,model=vgm(1,"Exp",300)) x <- predict(g, meuse.grid) image(x, 4, main="kriging variance and data points") points(meuse$x, meuse$y, pch = "+") } \keyword{dplot} gstat/man/DE_RB_2005.Rd0000644000176200001440000000552115060550314013761 0ustar liggesusers\name{DE_RB_2005} \alias{DE_RB_2005} \docType{data} \title{ Spatio-temporal data set with rural background PM10 concentrations in Germany 2005 } \description{ Spatio-temporal data set with rural background PM10 concentrations in Germany 2005 (airbase v6). } \usage{data("DE_RB_2005")} \format{ The format is: Formal class 'STSDF' [package "spacetime"] with 5 slots ..@ data :'data.frame': 23230 obs. of 2 variables: .. ..$ PM10 : num [1:23230] 16.7 31.7 5 22.4 26.8 ... .. ..$ logPM10: num [1:23230] 2.82 3.46 1.61 3.11 3.29 ... ..@ index : int [1:23230, 1:2] 1 2 3 4 5 6 7 8 9 10 ... ..@ sp :Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots .. .. ..@ data :'data.frame': 69 obs. of 9 variables: .. .. .. ..$ station_altitude : int [1:69] 8 3 700 15 35 50 343 339 45 45 ... .. .. .. ..$ station_european_code: Factor w/ 7965 levels "AD0942A","AD0944A",..: 1991 1648 1367 2350 1113 1098 1437 2043 1741 1998 ... .. .. .. ..$ country_iso_code : Factor w/ 39 levels "AD","AL","AT",..: 10 10 10 10 10 10 10 10 10 10 ... .. .. .. ..$ station_start_date : Factor w/ 2409 levels "1900-01-01","1951-04-01",..: 152 1184 1577 1132 744 328 1202 1555 1148 407 ... .. .. .. ..$ station_end_date : Factor w/ 864 levels "","1975-02-06",..: 1 1 1 579 1 1 1 1 1 1 ... .. .. .. ..$ type_of_station : Factor w/ 5 levels "","Background",..: 2 2 2 2 2 2 2 2 2 2 ... .. .. .. ..$ station_type_of_area : Factor w/ 4 levels "rural","suburban",..: 1 1 1 1 1 1 1 1 1 1 ... .. .. .. ..$ street_type : Factor w/ 5 levels "","Canyon street: L/H < 1.5",..: 4 1 1 1 1 1 1 1 1 1 ... .. .. .. ..$ annual_mean_PM10 : num [1:69] 20.9 21.8 16.5 20.3 23.3 ... .. .. ..@ coords.nrs : num(0) .. .. ..@ coords : num [1:69, 1:2] 538709 545414 665711 551796 815738 ... .. .. .. ..- attr(*, "dimnames")=List of 2 .. .. .. .. ..$ : chr [1:69] "DESH001" "DENI063" "DEBY109" "DEUB038" ... .. .. .. .. ..$ : chr [1:2] "coords.x1" "coords.x2" .. .. ..@ bbox : num [1:2, 1:2] 307809 5295752 907375 6086661 .. .. .. ..- attr(*, "dimnames")=List of 2 .. .. .. .. ..$ : chr [1:2] "coords.x1" "coords.x2" .. .. .. .. ..$ : chr [1:2] "min" "max" .. .. ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slot .. .. .. .. ..@ projargs: chr "+init=epsg:32632 +proj=utm +zone=32 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0" ..@ time :An ?xts? object on 2005-01-01/2005-12-31 containing: Data: int [1:365, 1] 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 ... - attr(*, "dimnames")=List of 2 ..$ : NULL ..$ : chr "..1" Indexed by objects of class: [POSIXct,POSIXt] TZ: GMT xts Attributes: NULL ..@ endTime: POSIXct[1:365], format: "2005-01-02" "2005-01-03" "2005-01-04" "2005-01-05" ... } \source{ EEA, airbase v6 } \examples{ data(DE_RB_2005) str(DE_RB_2005) } \keyword{datasets} gstat/man/progress.Rd0000644000176200001440000000075415060550314014307 0ustar liggesusers% $Id: hscat.Rd,v 1.3 2008-02-04 10:06:44 edzer Exp $ \name{progress} \alias{get_gstat_progress} \alias{set_gstat_progress} \title{ Get or set progress indicator } \description{ Get or set progress indicator } \usage{ get_gstat_progress() set_gstat_progress(value) } \arguments{ \item{value}{ logical } } \value{ return the logical value indicating whether progress bars should be given } \author{ Edzer Pebesma } \examples{ set_gstat_progress(FALSE) get_gstat_progress() } \keyword{models} gstat/man/estiStAni.Rd0000644000176200001440000000666315060550314014353 0ustar liggesusers\name{estiStAni} \alias{estiStAni} \title{ Estimation of the spatio-temporal anisotropy } \description{ Estimation of the spatio-temporal anisotropy without an underlying spatio-temporal model. Different methods are implemented using a linear model to predict the temporal gamma values or the ratio of the ranges of a spatial and temporal variogram model or a spatial variogram model to predict the temporal gamma values or the spatio-temporal anisotropy value as used in a metric spatio-temporal variogram. } \usage{ estiStAni(empVgm, interval, method = "linear", spatialVgm, temporalVgm, s.range=NA, t.range=NA) } \arguments{ \item{empVgm}{ An empirical spatio-temporal variogram. } \item{interval}{ A search interval for the optimisation of the spatio-temporal anisotropy parameter } \item{method}{ A character string determining the method to be used (one of \code{linear}, \code{range}, \code{vgm} or \code{metric}, see below for details) } \item{spatialVgm}{ A spatial variogram definition from the call to \code{\link{vgm}}. The model is optimised based on the pure spatial values in \code{empVgm}. } \item{temporalVgm}{ A temporal variogram definition from the call to \code{\link{vgm}}. The model is optimised based on the pure temporal values in \code{empVgm}.} \item{s.range}{ A spatial cutoff value applied to the empirical variogram \code{empVgm}. } \item{t.range}{ A temporal cutoff value applied to the empirical variogram \code{empVgm}. } } \details{ \describe{ \item{linear}{ A linear model is fitted to the pure spatial gamma values based on the spatial distances. An optimal scaling is searched to stretch the temporal distances such that the linear model explains best the pure temporal gamma values. This assumes (on average) a linear relationship between distance and gamma, hence it is advisable to use only those pairs of pure spatial (pure temporal) distance and gamma value that show a considerable increase (i.e. drop all values beyond the range by setting values for \code{s.range} and \code{t.range}). } \item{range}{ A spatial and temporal variogram model is fitted to the pure spatial and temporal gamma values respectively. The spatio-temporal anisotropy estimate is the ratio of the spatial range over the temporal range. } \item{vgm}{ A spatial variogram model is fitted to the pure spatial gamma values. An optimal scaling is used to stretch the temporal distances such that the spatial variogram model explains best the pure temporal gamma values. } \item{metric}{ A metric spatio-temporal variogram model is fitted with \code{joint} component according to the defined spatial variogram \code{spatialVgm}. The starting value of \code{stAni} is the mean of the \code{interval} parameter (see \code{\link{vgmST}} for the metric variogram definition). The spatio-temporal anisotropy as estimated in the spatio-temporal variogram is returned. Note that the parameter \code{interval} is only used to set the starting value. Hence, the estimate might exceed the given interval. } } } \value{A scalar representing the spatio-temporal anisotropy estimate.} \note{Different methods might lead to very different estimates. All but the \code{linear} approach are sensitive to the variogram model selection.} \author{Benedikt Graeler} \examples{ data(vv) estiStAni(vv, c(10, 150)) estiStAni(vv, c(10, 150), "vgm", vgm(80, "Sph", 120, 20)) } gstat/man/coalash.Rd0000644000176200001440000000230015060550314014042 0ustar liggesusers% $Id: coalash.Rd,v 1.2 2007-03-21 15:14:25 edzer Exp $ \name{coalash} \alias{coalash} \title{Coal ash samples from a mine in Pennsylvania} \description{ Data obtained from Gomez and Hazen (1970, Tables 19 and 20) on coal ash for the Robena Mine Property in Greene County Pennsylvania. } \format{ This data frame contains the following columns: \describe{ \item{x}{a numeric vector; x-coordinate; reference unknown } \item{y}{a numeric vector; x-coordinate; reference unknown } \item{coalash}{the target variable} } } \usage{ data(coalash) } \author{ unknown; R version prepared by Edzer Pebesma; data obtained from \url{http://homepage.divms.uiowa.edu/~dzimmer/spatialstats/}, Dale Zimmerman's course page } \references{ N.A.C. Cressie, 1993, Statistics for Spatial Data, Wiley. Gomez, M. and Hazen, K. (1970). Evaluating sulfur and ash distribution in coal seems by statistical response surface regression analysis. U.S. Bureau of Mines Report RI 7377. see also fields manual: \url{https://www.image.ucar.edu/GSP/Software/Fields/fields.manual.coalashEX.Krig.shtml} } \note{ data are also present in package fields, as coalash. } \keyword{datasets} \examples{ data(coalash) summary(coalash) } gstat/man/sic2004.Rd0000644000176200001440000001121415060550314013520 0ustar liggesusers% $Id: sic2004.Rd,v 1.11 2006-02-10 19:03:27 edzer Exp $ \name{sic2004} \alias{sic2004} \alias{sic.train} \alias{sic.pred} \alias{sic.grid} \alias{sic.test} \alias{sic.val} \title{ Spatial Interpolation Comparison 2004 data set: Natural Ambient Radioactivity } \description{ The text below was copied from the original sic2004 event, which is no longer online available. The variable used in the SIC 2004 exercise is natural ambient radioactivity measured in Germany. The data, provided kindly by the German Federal Office for Radiation Protection (BfS), are gamma dose rates reported by means of the national automatic monitoring network (IMIS). In the frame of SIC2004, a rectangular area was used to select 1008 monitoring stations (from a total of around 2000 stations). For these 1008 stations, 11 days of measurements have been randomly selected during the last 12 months and the average daily dose rates calculated for each day. Hence, we ended up having 11 data sets. Prior information (sic.train): 10 data sets of 200 points that are identical for what concerns the locations of the monitoring stations have been prepared. These locations have been randomly selected (see Figure 1). These data sets differ only by their Z values since each set corresponds to 1 day of measurement made during the last 14 months. No information will be provided on the date of measurement. These 10 data sets (10 days of measurements) can be used as prior information to tune the parameters of the mapping algorithms. No other information will be provided about these sets. Participants are free of course to gather more information about the variable in the literature and so on. The 200 monitoring stations above were randomly taken from a larger set of 1008 stations. The remaining 808 monitoring stations have a topology given in sic.pred. Participants to SIC2004 will have to estimate the values of the variable taken at these 808 locations. The SIC2004 data (sic.val, variable dayx): The exercise consists in using 200 measurements made on a 11th day (THE data of the exercise) to estimate the values observed at the remaining 808 locations (hence the question marks as symbols in the maps shown in Figure 3). These measurements will be provided only during two weeks (15th of September until 1st of October 2004) on a web page restricted to the participants. The true values observed at these 808 locations will be released only at the end of the exercise to allow participants to write their manuscripts (sic.test, variables dayx and joker). In addition, a joker data set was released (sic.val, variable joker), which contains an anomaly. The anomaly was generated by a simulation model, and does not represent measured levels. } \format{ The data frames contain the following columns: \describe{ \item{record}{this integer value is the number (unique value) of the monitoring station chosen by us.} \item{x}{X-coordinate of the monitoring station indicated in meters} \item{y}{Y-coordinate of the monitoring station indicated in meters} \item{day01}{mean gamma dose rate measured during 24 hours, at day01. Units are nanoSieverts/hour} \item{day02}{same, for day 02} \item{day03}{...} \item{day04}{...} \item{day05}{...} \item{day06}{...} \item{day07}{...} \item{day08}{...} \item{day09}{...} \item{day10}{...} \item{dayx}{ the data observed at the 11-th day} \item{joker}{ the joker data set, containing an anomaly not present in the training data} } } \note{ the data set sic.grid provides a set of points on a regular grid (almost 10000 points) covering the area; this is convenient for interpolation; see the function \code{makegrid} in package sp. The coordinates have been projected around a point located in the South West of Germany. Hence, a few coordinates have negative values as can be guessed from the Figures below. } \usage{ data(sic2004) # } \author{ Data: the German Federal Office for Radiation Protection (BfS), \url{https://www.bfs.de/EN/home/home_node.html}, data provided by Gregoire Dubois, R compilation by Edzer Pebesma. } \keyword{datasets} \examples{ data(sic2004) # FIGURE 1. Locations of the 200 monitoring stations for the 11 data sets. # The values taken by the variable are known. plot(y~x,sic.train,pch=1,col="red", asp=1) # FIGURE 2. Locations of the 808 remaining monitoring stations at which # the values of the variable must be estimated. plot(y~x,sic.pred,pch="?", asp=1, cex=.8) # Figure 2 # FIGURE 3. Locations of the 1008 monitoring stations (exhaustive data sets). # Red circles are used to estimate values located at the questions marks plot(y~x,sic.train,pch=1,col="red", asp=1) points(y~x, sic.pred, pch="?", cex=.8) } gstat/man/spplot.vcov.Rd0000644000176200001440000000114315060550314014731 0ustar liggesusers% $Id: spplot.vcov.Rd,v 1.2 2007-11-16 12:59:47 edzer Exp $ \name{spplot.vcov} \alias{spplot.vcov} \title{ Plot map matrix of prediction error variances and covariances } \description{ Plot map matrix of prediction error variances and covariances } \usage{ spplot.vcov(x, ...) } \arguments{ \item{x}{ Object of class SpatialPixelsDataFrame or SpatialGridDataFrame, resulting from a krige call with multiple variables (cokriging } \item{...}{remaining arguments passed to spplot } } \value{ The plotted object, of class trellis; see \code{spplot} in package \pkg{sp}. } \author{ Edzer Pebesma } \keyword{dplot} gstat/man/gstat-internal.Rd0000644000176200001440000000065515060550314015377 0ustar liggesusers% $Id: gstat-internal.Rd,v 1.6 2008-03-10 10:36:04 edzer Exp $ \name{gstat-internal} \alias{load.variogram.model} \alias{gstat.formula} \alias{gstat.formula.predict} \alias{gstat.debug} \alias{gstat.set} \alias{cross.name} \alias{gstat.load.set} \title{Gstat Internal Functions} \description{gstat internal functions} \author{Edzer Pebesma} \note{these functions are not meant to be called by users directly} \keyword{internal} gstat/man/variogram.Rd0000644000176200001440000002217415143624355014443 0ustar liggesusers% $Id: variogram.Rd,v 1.23 2009-11-02 21:33:17 edzer Exp $ \name{variogram} \alias{variogram} \alias{variogram.gstat} \alias{variogram.formula} \alias{variogram.default} \alias{print.gstatVariogram} \alias{print.variogramCloud} \alias{as.data.frame.variogramCloud} \title{ Calculate Sample or Residual Variogram or Variogram Cloud } \description{ Calculates the sample variogram from data, or in case of a linear model is given, for the residuals, with options for directional, robust, and pooled variogram, and for irregular distance intervals. In case spatio-temporal data is provided, the function \code{\link{variogramST}} is called with a different set of parameters. } \usage{ \method{variogram}{gstat}(object, ...) \method{variogram}{formula}(object, locations = coordinates(data), data, ...) \method{variogram}{default}(object, locations, X, cutoff, width = cutoff/15, alpha = 0, beta = 0, tol.hor = 90/length(alpha), tol.ver = 90/length(beta), cressie = FALSE, dX = numeric(0), boundaries = numeric(0), cloud = FALSE, trend.beta = NULL, debug.level = 1, cross = TRUE, grid, map = FALSE, g = NULL, ..., projected = TRUE, lambda = 1.0, verbose = FALSE, covariogram = FALSE, PR = FALSE, pseudo = -1) \method{print}{gstatVariogram}(x, ...) \method{print}{variogramCloud}(x, ...) } \arguments{ \item{object}{object of class \code{gstat}; in this form, direct and cross (residual) variograms are calculated for all variables and variable pairs defined in \code{object}; in case of \code{variogram.formula}, formula defining the response vector and (possible) regressors, in case of absence of regressors, use e.g. \code{z~1}; in case of \code{variogram.default}: list with for each variable the vector with responses (should not be called directly) } \item{data}{data frame where the names in formula are to be found} \item{locations}{ spatial data locations. For variogram.formula: a formula with only the coordinate variables in the right hand (explanatory variable) side e.g. \code{~x+y}; see examples. For variogram.default: list with coordinate matrices, each with the number of rows matching that of corresponding vectors in y; the number of columns should match the number of spatial dimensions spanned by the data (1 (x), 2 (x,y) or 3 (x,y,z)). } \item{...}{any other arguments that will be passed to \link{variogram.default} (ignored)} \item{X}{ (optional) list with for each variable the matrix with regressors/covariates; the number of rows should match that of the correspoding element in y, the number of columns equals the number of regressors (including intercept) } \item{cutoff}{ spatial separation distance up to which point pairs are included in semivariance estimates; as a default, the length of the diagonal of the box spanning the data is divided by three. } \item{width}{ the width of subsequent distance intervals into which data point pairs are grouped for semivariance estimates } \item{alpha}{ direction in plane (x,y), in positive degrees clockwise from positive y (North): alpha=0 for direction North (increasing y), alpha=90 for direction East (increasing x); optional a vector of directions in (x,y) } \item{beta}{ direction in z, in positive degrees up from the (x,y) plane; } optional a vector of directions \item{tol.hor}{ horizontal tolerance angle in degrees } \item{tol.ver}{ vertical tolerance angle in degrees } \item{cressie}{ logical; if TRUE, use Cressie''s robust variogram estimate; if FALSE use the classical method of moments variogram estimate } \item{dX}{ include a pair of data points $y(s_1),y(s_2)$ taken at locations $s_1$ and $s_2$ for sample variogram calculation only when $||x(s_1)-x(s_2)|| < dX$ with and $x(s_i)$ the vector with regressors at location $s_i$, and $||.||$ the 2-norm. This allows pooled estimation of within-strata variograms (use a factor variable as regressor, and dX=0.5), or variograms of (near-)replicates in a linear model (addressing point pairs having similar values for regressors variables) } \item{boundaries}{ numerical vector with distance interval upper boundaries; values should be strictly increasing } \item{cloud}{ logical; if TRUE, calculate the semivariogram cloud } \item{trend.beta}{vector with trend coefficients, in case they are known. By default, trend coefficients are estimated from the data.} \item{debug.level}{ integer; set gstat internal debug level } \item{cross}{ logical or character; if FALSE, no cross variograms are computed when object is of class \code{gstat} and has more than one variable; if TRUE, all direct and cross variograms are computed; if equal to "ST", direct and cross variograms are computed for all pairs involving the first (non-time lagged) variable; if equal to "ONLY", only cross variograms are computed (no direct variograms). } \item{formula}{formula, specifying the dependent variable and possible covariates} \item{x}{ object of class \code{variogram} or \code{variogramCloud} to be printed} \item{grid}{ grid parameters, if data are gridded (not to be called directly; this is filled automatically) } \item{map}{ logical; if TRUE, and \code{cutoff} and \code{width} are given, a variogram map is returned. This requires package sp. Alternatively, a map can be passed, of class SpatialDataFrameGrid (see sp docs) } \item{g}{ NULL or object of class gstat; may be used to pass settable parameters and/or variograms; see example } \item{projected}{logical; if FALSE, data are assumed to be unprojected, meaning decimal longitude/latitude. For projected data, Euclidian distances are computed, for unprojected great circle distances (km). In \code{variogram.formula} or \code{variogram.gstat}, for data deriving from class Spatial, projection is detected automatically using \code{is.projected}} \item{lambda}{test feature; not working (yet)} \item{verbose}{logical; print some progress indication} \item{pseudo}{ integer; use pseudo cross variogram for computing time-lagged spatial variograms? -1: find out from coordinates -- if they are equal then yes, else no; 0: no; 1: yes. } \item{covariogram}{logical; compute covariogram instead of variogram?} \item{PR}{logical; compute pairwise relative variogram (does NOT check whether variable is strictly positive)} } \value{ If map is TRUE (or a map is passed), a grid map is returned containing the (cross) variogram map(s). See package sp. In other cases, an object of class "gstatVariogram" with the following fields: \item{np}{the number of point pairs for this estimate; in case of a \code{variogramCloud} see below} \item{dist}{the average distance of all point pairs considered for this estimate} \item{gamma}{the actual sample variogram estimate} \item{dir.hor}{the horizontal direction} \item{dir.ver}{the vertical direction} \item{id}{the combined id pair} If cloud is TRUE: an object of class \code{variogramCloud}, with the field \code{np} encoding the numbers of the point pair that contributed to a variogram cloud estimate, as follows. The first point is found by 1 + the integer division of np by the \code{.BigInt} attribute of the returned object, the second point by 1 + the remainder of that division. \link{as.data.frame.variogramCloud} returns no \code{np} field, but does the decoding into: \item{left}{for variogramCloud: data id (row number) of one of the data pair} \item{right}{for variogramCloud: data id (row number) of the other data in the pair} In case of a spatio-temporal variogram is sought see \code{\link{variogramST}} for details. } \note{ \code{variogram.default} should not be called by users directly, as it makes many assumptions about the organization of the data, that are not fully documented (but of course, can be understood from reading the source code of the other \code{variogram} methods) Successfully setting \code{gridded() <- TRUE} may trigger a branch that will fail unless dx and dy are identical, and not merely similar to within machine epsilon. } \references{ Cressie, N.A.C., 1993, Statistics for Spatial Data, Wiley. Cressie, N., C. Wikle, 2011, Statistics for Spatio-temporal Data, Wiley. Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers and Geosciences, 30: 683-691. } \author{ Edzer Pebesma } \seealso{ \link{print.gstatVariogram}, \link{plot.gstatVariogram}, \link{plot.variogramCloud}; for variogram models: \link{vgm}, to fit a variogram model to a sample variogram: \link{fit.variogram} \code{\link{variogramST}} for details on the spatio-temporal sample variogram. } \examples{ library(sp) data(meuse) # no trend: coordinates(meuse) = ~x+y variogram(log(zinc)~1, meuse) # residual variogram w.r.t. a linear trend: variogram(log(zinc)~x+y, meuse) # directional variogram: variogram(log(zinc)~x+y, meuse, alpha=c(0,45,90,135)) variogram(log(zinc)~1, meuse, width=90, cutoff=1300) # GLS residual variogram: v = variogram(log(zinc)~x+y, meuse) v.fit = fit.variogram(v, vgm(1, "Sph", 700, 1)) v.fit set = list(gls=1) v g = gstat(NULL, "log-zinc", log(zinc)~x+y, meuse, model=v.fit, set = set) variogram(g) if (require(sf)) { proj4string(meuse) = CRS("+init=epsg:28992") meuse.ll = sf::st_transform(sf::st_as_sf(meuse), sf::st_crs("+proj=longlat +datum=WGS84")) # variogram of unprojected data, using great-circle distances, returning km as units print(variogram(log(zinc) ~ 1, meuse.ll)) } } \keyword{models} gstat/man/oxford.Rd0000644000176200001440000000650715060550314013746 0ustar liggesusers% $Id: oxford.Rd,v 1.5 2006-02-10 19:03:27 edzer Exp $ \name{oxford} \alias{oxford} \title{Oxford soil samples} \description{ Data: 126 soil augerings on a 100 x 100m square grid, with 6 columns and 21 rows. Grid is oriented with long axis North-north-west to South-south-east Origin of grid is South-south-east point, 100m outside grid. Original data are part of a soil survey carried out by P.A. Burrough in 1967. The survey area is located on the chalk downlands on the Berkshire Downs in Oxfordshire, UK. Three soil profile units were recognised on the shallow Rendzina soils; these are Ia - very shallow, grey calcareous soils less than 40cm deep over chalk; Ct - shallow to moderately deep, grey-brown calcareous soils on calcareous colluvium, and Cr: deep, moderately acid, red-brown clayey soils. These soil profile classes were registered at every augering. In addition, an independent landscape soil map was made by interpolating soil boundaries between these soil types, using information from the changes in landform. Because the soil varies over short distances, this field mapping caused some soil borings to receive a different classification from the classification based on the point data. Also registered at each auger point were the site elevation (m), the depth to solid chalk rock (in cm) and the depth to lime in cm. Also, the percent clay content, the Munsell colour components of VALUE and CHROMA , and the lime content of the soil (as tested using HCl) were recorded for the top two soil layers (0-20cm and 20-40cm). Samples of topsoil taken as a bulk sample within a circle of radius 2.5m around each sample point were used for the laboratory determination of Mg (ppm), OM1 \%, CEC as mequ/100g air dry soil, pH, P as ppm and K (ppm). } \format{ This data frame contains the following columns: \describe{ \item{PROFILE}{profile number} \item{XCOORD}{x-coordinate, field, non-projected} \item{YCOORD}{y-coordinate, field, non-projected} \item{ELEV}{elevation, m.} \item{PROFCLASS}{soil class, obtained by classifying the soil profile at the sample site } \item{MAPCLASS}{soil class, obtained by looking up the site location in the soil map} \item{VAL1}{Munsell colour component VALUE, 0-20 cm} \item{CHR1}{Munsell colour component CHROMA, 20-40 cm} \item{LIME1}{Lime content (tested using HCl), 0-20 cm} \item{VAL2}{Munsell colour component VALUE, 0-20 cm} \item{CHR2}{Munsell colour component CHROMA, 20-40 cm} \item{LIME2}{Lime content (tested using HCl), 20-40 cm} \item{DEPTHCM}{soil depth, cm } \item{DEP2LIME}{depth to lime, cm } \item{PCLAY1}{percentage clay, 0-20 cm} \item{PCLAY2}{percentage clay, 20-40 cm} \item{MG1}{Magnesium content (ppm), 0-20 cm} \item{OM1}{organic matter (\%), 0-20 cm} \item{CEC1}{CES as mequ/100g air dry soil, 0-20 cm} \item{PH1}{pH, 0-20 cm} \item{PHOS1}{Phosphorous, 0-20 cm, ppm} \item{POT1}{K (potassium), 0-20 cm, ppm} } } \usage{ data(oxford) } \author{ P.A. Burrough; compiled for R by Edzer Pebesma } \references{ P.A. Burrough, R.A. McDonnell, 1998. Principles of Geographical Information Systems. Oxford University Press. } \note{ \code{oxford.jpg}, in the gstat package external directory (see example below), shows an image of the soil map for the region } \keyword{datasets} \examples{ data(oxford) summary(oxford) # open the following file with a jpg viewer: system.file("external/oxford.jpg", package="gstat") } gstat/man/plot.gstatVariogram.Rd0000644000176200001440000001271715143624367016430 0ustar liggesusers% $Id: plot.gstatVariogram.Rd,v 1.14 2008-02-19 10:01:22 edzer Exp $ \name{plot.gstatVariogram} \alias{plot.gstatVariogram} \alias{plot.variogramMap} \alias{plot.StVariogram} \title{ Plot a sample variogram, and possibly a fitted model } \description{ Creates a variogram plot } \usage{ \method{plot}{gstatVariogram}(x, model = NULL, ylim, xlim, xlab = "distance", ylab = attr(x, "what"), panel = vgm.panel.xyplot, multipanel = TRUE, plot.numbers = FALSE, scales, ids = x$id, group.id = TRUE, skip, layout, ...) \method{plot}{variogramMap}(x, np = FALSE, skip, threshold, ...) \method{plot}{StVariogram}(x, model = NULL, ..., col = bpy.colors(), xlab, ylab, map = TRUE, convertMonths = FALSE, as.table = TRUE, wireframe = FALSE, diff = FALSE, all = FALSE) } \arguments{ \item{x}{ object obtained from the method \link{variogram}, possibly containing directional or cross variograms, space-time variograms and variogram model information } \item{model}{in case of a single variogram: a variogram model, as obtained from \link{vgm} or \link{fit.variogram}, to be drawn as a line in the variogram plot; in case of a set of variograms and cross variograms: a list with variogram models; in the spatio-temporal case, a single or a list of spatio-temporal models that will be plotted next to each other for visual comparison.} \item{ylim}{ numeric; vector of length 2, limits of the y-axis} \item{xlim}{ numeric; vector of length 2, limits of the x-axis} \item{xlab}{ character; x-axis label } \item{ylab}{ character; y-axis label } \item{panel}{ panel function } \item{multipanel}{ logical; if TRUE, directional variograms are plotted in different panels, if FALSE, directional variograms are plotted in the same graph, using color, colored lines and symbols to distinguish them } \item{plot.numbers}{ logical or numeric; if TRUE, plot number of point pairs next to each plotted semivariance symbol, if FALSE these are omitted. If numeric, TRUE is assumed and the value is passed as the relative distance to be used between symbols and numeric text values (default 0.03). } \item{scales}{ optional argument that will be passed to \code{\link[lattice]{xyplot}} in case of the plotting of variograms and cross variograms; use the value \code{list(relation = "same")} if y-axes need to share scales } \item{ids}{ ids of the data variables and variable pairs } \item{group.id}{ logical; control for directional multivariate variograms: if TRUE, panels divide direction and colors indicate variables (ids), if FALSE panels divide variables/variable pairs and colors indicate direction} \item{skip}{ logical; can be used to arrange panels, see \code{\link[lattice]{xyplot}}} \item{layout}{ integer vector; can be used to set panel layout: c(ncol,nrow) } \item{np}{ logical (only for plotting variogram maps); if TRUE, plot number of point pairs, if FALSE plot semivariances } \item{threshold}{semivariogram map values based on fewer point pairs than threshold will not be plotted} \item{\dots}{ any arguments that will be passed to the panel plotting functions (such as \code{auto.key} in examples below) } \item{col}{colors to use} \item{map}{logical; if TRUE, plot space-time variogram map} \item{convertMonths}{logical; if TRUE, \code{yearmon} time lags will be unit converted and plotted as (integer) months, and no longer match the numeric representation of \code{yearmon}, which has years as unit } \item{as.table}{controls the plotting order for multiple panels, see \code{\link[lattice]{xyplot}} for details.} \item{wireframe}{logical; if TRUE, produce a wireframe plot} \item{diff}{logical; if TRUE, plot difference between model and sample variogram; ignores \code{all}.} \item{all}{logical; if TRUE, plot sample and model variogram(s) in single wireframes.} } \value{ returns (or plots) the variogram plot } \details{Please note that in the spatio-temporal case the levelplot and wireframe plots use the spatial distances averaged for each time lag \code{avgDist}. For strongly varying spatial locations over time, please check the distance columns \code{dist} and \code{avgDist} of the spatio-temporal sample variogram. The \code{lattice::cloud} function is one option to plot irregular 3D data.} \author{ Edzer Pebesma } \note{ currently, plotting models and/or point pair numbers is not supported when a variogram is both directional and multivariable; also, three-dimensional directional variograms will probably not be displayed correctly. } \seealso{ \link{variogram}, \link{fit.variogram}, \link{vgm} \link{variogramLine}, } \examples{ library(sp) data(meuse) coordinates(meuse) = ~x+y vgm1 <- variogram(log(zinc)~1, meuse) plot(vgm1) model.1 <- fit.variogram(vgm1,vgm(1,"Sph",300,1)) plot(vgm1, model=model.1) plot(vgm1, plot.numbers = TRUE, pch = "+") vgm2 <- variogram(log(zinc)~1, meuse, alpha=c(0,45,90,135)) plot(vgm2) # the following demonstrates plotting of directional models: model.2 <- vgm(.59,"Sph",926,.06,anis=c(0,0.3)) plot(vgm2, model=model.2) g = gstat(NULL, "zinc < 200", I(zinc<200)~1, meuse) g = gstat(g, "zinc < 400", I(zinc<400)~1, meuse) g = gstat(g, "zinc < 800", I(zinc<800)~1, meuse) # calculate multivariable, directional variogram: v = variogram(g, alpha=c(0,45,90,135)) plot(v, group.id = FALSE, auto.key = TRUE) # id and id pairs panels plot(v, group.id = TRUE, auto.key = TRUE) # direction panels # variogram maps: plot(variogram(g, cutoff=1000, width=100, map=TRUE), main = "(cross) semivariance maps") plot(variogram(g, cutoff=1000, width=100, map=TRUE), np=TRUE, main = "number of point pairs") } \keyword{dplot} gstat/man/vgmArea.Rd0000644000176200001440000000207515060550314014023 0ustar liggesusers% $Id: variogramLine.Rd,v 1.3 2008-08-19 07:27:02 edzer Exp $ \name{vgmArea} \alias{vgmArea} \title{ point-point, point-area or area-area semivariance } \description{ Compute point-point, point-area or area-area variogram values from point model } \usage{ vgmArea(x, y = x, vgm, ndiscr = 16, verbose = FALSE, covariance = TRUE) } \arguments{ \item{x}{ object of class \link[sp]{SpatialPoints} or \link[sp]{SpatialPolygons}} \item{y}{ object of class \link[sp]{SpatialPoints} or \link[sp]{SpatialPolygons}} \item{vgm}{ variogram model, see \link{vgm}} \item{ndiscr}{ number of points to discretize an area, using \link[sp]{spsample}} \item{verbose}{ give progress bar } \item{covariance}{ logical; compute covariances, rather than semivariances? } } \value{ semivariance or covariance matrix of dimension \code{length(x)} x \code{lenght(y)}} \author{ Edzer Pebesma } \examples{ library(sp) demo(meuse, ask = FALSE, echo = FALSE) vgmArea(meuse[1:5,], vgm = vgm(1, "Exp", 1000)) # point-point vgmArea(meuse[1:5,], meuse.area, vgm = vgm(1, "Exp", 1000)) # point-area } \keyword{models} gstat/man/plot.pointPairs.Rd0000644000176200001440000000327115143624462015555 0ustar liggesusers% $Id: plot.pointPairs.Rd,v 1.5 2006-12-12 20:44:07 edzer Exp $ \name{plot.pointPairs} \alias{plot.pointPairs} \title{ Plot a point pairs, identified from a variogram cloud } \description{ Plot a point pairs, identified from a variogram cloud } \usage{ \method{plot}{pointPairs}(x, data, xcol = data$x, ycol = data$y, xlab = "x coordinate", ylab = "y coordinate", col.line = 2, line.pch = 0, main = "selected point pairs", ...) } \arguments{ \item{x}{ object of class "pointPairs", obtained from the function \link{plot.variogramCloud}, containing point pair indices } \item{data}{ data frame to which the indices refer (from which the variogram cloud was calculated) } \item{xcol}{ numeric vector with x-coordinates of data } \item{ycol}{ numeric vector with y-coordinates of data } \item{xlab}{ x-axis label } \item{ylab}{ y-axis label } \item{col.line}{ color for lines connecting points } \item{line.pch}{ if non-zero, symbols are also plotted at the middle of line segments, to mark lines too short to be visible on the plot; the color used is \code{col.line}; the value passed to this argument will be used as plotting symbol (pch) } \item{main}{ title of plot } \item{...}{ arguments, further passed to \code{xyplot}} } \value{ plots the data locations, with lines connecting the point pairs identified (and refered to by indices in) x } \author{ Edzer Pebesma } \seealso{ \link{plot.variogramCloud} } \examples{ ### The following requires interaction, and is therefore outcommented #data(meuse) #coordinates(meuse) = ~x+y #vgm1 <- variogram(log(zinc)~1, meuse, cloud = TRUE) #pp <- plot(vgm1, id = TRUE) ### Identify the point pairs #plot(pp, data = meuse) # meuse has x and y as coordinates } \keyword{dplot} gstat/man/vgmAreaST.Rd0000644000176200001440000000155615060550314014275 0ustar liggesusers\name{vgmAreaST} \alias{vgmAreaST} \title{ Function that returns the covariances for areas } \description{ Function that returns the covariances for areas based on spatio-temporal point variograms for use in the spatio-temporal area-to-point kriging } \usage{ vgmAreaST(x, y = x, model, ndiscrSpace = 16, verbose = FALSE, covariance = TRUE) } \arguments{ \item{x}{spatio-temporal data frame} \item{y}{spatio-temporal data frame} \item{model}{spatio-temporal variogram model for point support} \item{ndiscrSpace}{number of discretisation in space} \item{verbose}{Boolean: default to FALSE, set to TRUE for debugging} \item{covariance}{Boolean: whether the covariance shall be evaluated, currently disfunction and set to TRUE} } \value{The covariance between 'x' and 'y'.} \author{Benedikt Graeler} \seealso{\code{\link{vgmArea}}} \examples{ # see demo('a2pinST') } gstat/man/fulmar.Rd0000644000176200001440000000205115060550314013721 0ustar liggesusers% $Id: fulmar.Rd,v 1.7 2008-07-03 11:49:08 edzer Exp $ \name{fulmar} \alias{fulmar} \title{Fulmaris glacialis data} \description{ Airborne counts of Fulmaris glacialis during the Aug/Sept 1998 and 1999 flights on the Dutch (Netherlands) part of the North Sea (NCP, Nederlands Continentaal Plat). } \format{ This data frame contains the following columns: \describe{ \item{year}{year of measurement: 1998 or 1999} \item{x}{x-coordinate in UTM zone 31} \item{y}{y-coordinate in UTM zone 31} \item{depth}{sea water depth, in m} \item{coast}{distance to coast of the Netherlands, in km.} \item{fulmar}{observed density (number of birds per square km)} } } \usage{ data(fulmar) } \author{ Dutch National Institute for Coastal and Marine Management (RIKZ) } \seealso{\link{ncp.grid} E.J. Pebesma, R.N.M. Duin, P.A. Burrough, 2005. Mapping Sea Bird Densities over the North Sea: Spatially Aggregated Estimates and Temporal Changes. Environmetrics 16, (6), p 573-587. } \keyword{datasets} \examples{ data(fulmar) summary(fulmar) \dontrun{ demo(fulmar) } } gstat/man/vgm.Rd0000644000176200001440000001616315143624277013251 0ustar liggesusers% $Id: vgm.Rd,v 1.16 2008-10-09 14:25:20 edzer Exp $ \name{vgm} \alias{vgm} \alias{print.variogramModel} \alias{plot.variogramModel} \alias{as.vgm.variomodel} \title{ Generate, or Add to Variogram Model } \description{ Generates a variogram model, or adds to an existing model. \code{print.variogramModel} prints the essence of a variogram model. } \usage{ vgm(psill = NA, model, range = NA, nugget, add.to, anis, kappa = 0.5, ..., covtable, Err = 0) \method{print}{variogramModel}(x, ...) \method{plot}{variogramModel}(x, cutoff, ..., type = 'l') as.vgm.variomodel(m) } \arguments{ \item{psill}{ (partial) sill of the variogram model component, or model: see Details } \item{model}{ model type, e.g. "Exp", "Sph", "Gau", or "Mat". Can be a character vector of model types combined with c(), e.g. c("Exp", "Sph"), in which case the best fitting is returned. Calling vgm() without a model argument returns a data.frame with available models. } \item{range}{ range parameter of the variogram model component; in case of anisotropy: major range } \item{kappa}{ smoothness parameter for the Matern class of variogram models } \item{nugget}{ nugget component of the variogram (this basically adds a nugget compontent to the model); if missing, nugget component is omitted } \item{add.to}{ the variogram model to which we want to add a component (structure) } \item{anis}{ anisotropy parameters: see notes below } \item{x}{ a variogram model to print or plot} \item{...}{ arguments that will be passed to \code{print}, e.g. \code{digits} (see examples), or to \code{variogramLine} for the plot method } \item{covtable}{ if model is \code{Tab}, instead of model parameters a one-dimensional covariance table can be passed here. See covtable.R in tests directory, and example below. } \item{Err}{ numeric; if larger than zero, the measurement error variance component that will not be included to the kriging equations, i.e. kriging will now smooth the process Y instead of predict the measured Z, where Z=Y+e, and Err is the variance of e} \item{m}{ object of class \code{variomodel}, see \pkg{geoR}} \item{cutoff}{maximum distance up to which variogram values are computed} \item{type}{plot type} } \value{ If a single model is passed, an object of class \code{variogramModel} extending \code{data.frame}. In case a vector ofmodels is passed, an object of class \code{variogramModelList} which is a list of \code{variogramModel} objects. When called without a model argument, a data.frame with available models is returned, having two columns: short (abbreviated names, to be used as model argument: "Exp", "Sph" etc) and long (with some description). as.vgm.variomodel tries to convert an object of class variomodel (geoR) to vgm. } \author{ Edzer Pebesma } \details{ If only the first argument (\code{psill}) is given a \code{character} value/vector indicating one or more models, as in \code{vgm("Sph")}, then this taken as a shorthand form of \code{vgm(NA,"Sph",NA,NA)}, i.e. a spherical variogram with nugget and unknown parameter values; see examples below. Read \link{fit.variogram} to find out how \code{NA} variogram parameters are given initial values for a fitting a model, based on the sample variogram. Package \code{automap} gives further options for automated variogram modelling. } \note{ Geometric anisotropy can be modelled for each individual simple model by giving two or five anisotropy parameters, two for two-dimensional and five for three-dimensional data. In any case, the range defined is the range in the direction of the strongest correlation, or the major range. Anisotropy parameters define which direction this is (the main axis), and how much shorter the range is in (the) direction(s) perpendicular to this main axis. In two dimensions, two parameters define an anisotropy ellipse, say \code{anis = c(30, 0.5)}. The first parameter, \code{30}, refers to the main axis direction: it is the angle for the principal direction of continuity (measured in degrees, clockwise from positive Y, i.e. North). The second parameter, \code{0.5}, is the anisotropy ratio, the ratio of the minor range to the major range (a value between 0 and 1). So, in our example, if the range in the major direction (North-East) is 100, the range in the minor direction (South-East) is 0.5 x 100 = 50. In three dimensions, five values should be given in the form \code{anis = c(p,q,r,s,t)}. Now, $p$ is the angle for the principal direction of continuity (measured in degrees, clockwise from Y, in direction of X), $q$ is the dip angle for the principal direction of continuity (measured in positive degrees up from horizontal), $r$ is the third rotation angle to rotate the two minor directions around the principal direction defined by $p$ and $q$. A positive angle acts counter-clockwise while looking in the principal direction. Anisotropy ratios $s$ and $t$ are the ratios between the major range and each of the two minor ranges. The anisotropy code was taken from GSLIB. Note that in \url{http://www.gslib.com/sec_gb.html} it is reported that this code has a bug. Quoting from this site: ``The third angle in all GSLIB programs operates in the opposite direction than specified in the GSLIB book. Explanation - The books says (pp27) the angle is measured clockwise when looking toward the origin (from the postive principal direction), but it should be counter-clockwise. This is a documentation error. Although rarely used, the correct specification of the third angle is critical if used.'' (Note that \code{anis = c(p,s)} is equivalent to \code{anis = c(p,0,0,s,1)}.) The implementation in gstat for 2D and 3D anisotropy was taken from the gslib (probably 1992) code. I have seen a paper where it is argued that the 3D anisotropy code implemented in gslib (and so in gstat) is in error, but I have not corrected anything afterwards. } \references{ Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers and Geosciences, 30: 683-691. Deutsch, C.V. and Journel, A.G., 1998. GSLIB: Geostatistical software library and user's guide, second edition, Oxford University Press. For the validity of variogram models on the sphere, see Huang, Chunfeng, Haimeng Zhang, and Scott M. Robeson. On the validity of commonly used covariance and variogram functions on the sphere. Mathematical Geosciences 43.6 (2011): 721-733. } \seealso{ \link{show.vgms} to view the available models, \link{fit.variogram}, \link{variogramLine}, \link{variogram} for the sample variogram. } \examples{ vgm() vgm("Sph") vgm(NA, "Sph", NA, NA) vgm(, "Sph") # "Sph" is second argument: NO nugget in this case vgm(10, "Exp", 300) x <- vgm(10, "Exp", 300) vgm(10, "Nug", 0) vgm(10, "Exp", 300, 4.5) vgm(10, "Mat", 300, 4.5, kappa = 0.7) vgm( 5, "Exp", 300, add.to = vgm(5, "Exp", 60, nugget = 2.5)) vgm(10, "Exp", 300, anis = c(30, 0.5)) vgm(10, "Exp", 300, anis = c(30, 10, 0, 0.5, 0.3)) # Matern variogram model: vgm(1, "Mat", 1, kappa=.3) x <- vgm(0.39527463, "Sph", 953.8942, nugget = 0.06105141) x print(x, digits = 3); # to see all components, do print.data.frame(x) vv=vgm(model = "Tab", covtable = variogramLine(vgm(1, "Sph", 1), 1, n=1e4, min = 0, covariance = TRUE)) vgm(c("Mat", "Sph")) vgm(, c("Mat", "Sph")) # no nugget } \keyword{models} gstat/man/krige.Rd0000644000176200001440000002407715143624341013554 0ustar liggesusers% $Id: krige.Rd,v 1.25 2010-01-12 12:15:48 edzer Exp $ \name{krige} \docType{methods} \alias{krige} \alias{krige0} %\alias{krigeST} \alias{krige.locations} \alias{krige.spatial} \alias{idw} \alias{idw0} \alias{idw.locations} \alias{idw.spatial} \alias{krige-methods} \alias{idw-methods} \alias{krige,formula,formula-method} \alias{krige,formula,Spatial-method} \alias{krige,formula,sf-method} \alias{krige,formula,NULL-method} \alias{idw,formula,formula-method} \alias{idw,formula,Spatial-method} \alias{idw,formula,sf-method} \alias{idw,formula,ST-method} % move to krigeST as well? % \alias{krige,formula,ST-method} % calling krigeST \title{ Simple, Ordinary or Universal, global or local, Point or Block Kriging, or simulation. } \description{ Function for simple, ordinary or universal kriging (sometimes called external drift kriging), kriging in a local neighbourhood, point kriging or kriging of block mean values (rectangular or irregular blocks), and conditional (Gaussian or indicator) simulation equivalents for all kriging varieties, and function for inverse distance weighted interpolation. For multivariable prediction, see \link{gstat} and \link[gstat]{predict} } \usage{ krige(formula, locations, ...) krige.locations(formula, locations, data, newdata, model, ..., beta, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block, nsim = 0, indicators = FALSE, na.action = na.pass, debug.level = 1) krige.spatial(formula, locations, newdata, model, ..., beta, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block, nsim = 0, indicators = FALSE, na.action = na.pass, debug.level = 1) krige0(formula, data, newdata, model, beta, y, ..., computeVar = FALSE, fullCovariance = FALSE) idw(formula, locations, ...) idw.locations(formula, locations, data, newdata, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block, na.action = na.pass, idp = 2.0, debug.level = 1) idw.spatial(formula, locations, newdata, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block = numeric(0), na.action = na.pass, idp = 2.0, debug.level = 1) idw0(formula, data, newdata, y, idp = 2.0) } \arguments{ \item{formula}{ formula that defines the dependent variable as a linear model of independent variables; suppose the dependent variable has name \code{z}, for ordinary and simple kriging use the formula \code{z~1}; for simple kriging also define \code{beta} (see below); for universal kriging, suppose \code{z} is linearly dependent on \code{x} and \code{y}, use the formula \code{z~x+y}} \item{locations}{ object of class \code{Spatial} or \code{sf}, or (deprecated) formula defines the spatial data locations (coordinates) such as \code{~x+y}} \item{data}{ data frame: should contain the dependent variable, independent variables, and coordinates, should be missing if locations contains data. } \item{newdata}{ object of class \code{Spatial}, \code{sf} or \code{stars} with prediction/simulation locations; should contain attributes with the independent variables (if present). } \item{model}{ variogram model of dependent variable (or its residuals), defined by a call to \link{vgm} or \link{fit.variogram}; for \code{krige0} also a user-supplied covariance function is allowed (see example below) } \item{beta}{ for simple kriging (and simulation based on simple kriging): vector with the trend coefficients (including intercept); if no independent variables are defined the model only contains an intercept and beta should be the simple kriging mean } \item{nmax}{ for local kriging: the number of nearest observations that should be used for a kriging prediction or simulation, where nearest is defined in terms of the space of the spatial locations. By default, all observations are used } \item{nmin}{ for local kriging: if the number of nearest observations within distance \code{maxdist} is less than \code{nmin}, a missing value will be generated; see maxdist } \item{omax}{ see \link{gstat} } \item{maxdist}{ for local kriging: only observations within a distance of \code{maxdist} from the prediction location are used for prediction or simulation; if combined with \code{nmax}, both criteria apply } \item{block}{ block size; a vector with 1, 2 or 3 values containing the size of a rectangular in x-, y- and z-dimension respectively (0 if not set), or a data frame with 1, 2 or 3 columns, containing the points that discretize the block in the x-, y- and z-dimension to define irregular blocks relative to (0,0) or (0,0,0)---see also the details section of \link[gstat]{predict}. By default, predictions or simulations refer to the support of the data values. } \item{nsim}{ integer; if set to a non-zero value, conditional simulation is used instead of kriging interpolation. For this, sequential Gaussian or indicator simulation is used (depending on the value of \code{indicators}), following a single random path through the data. } \item{indicators}{ logical, only relevant if \code{nsim} is non-zero; if TRUE, use indicator simulation; else use Gaussian simulation } \item{na.action}{ function determining what should be done with missing values in 'newdata'. The default is to predict 'NA'. Missing values in coordinates and predictors are both dealt with. } \item{debug.level}{debug level, passed to \link[gstat]{predict}; use -1 to see progress in percentage, and 0 to suppress all printed information } \item{\dots}{ for krige: arguments that will be passed to \link{gstat}; for \code{krige0}: arguments that will be passe to \code{model}} \item{idp}{numeric; specify the inverse distance weighting power} \item{y}{matrix; to krige multiple fields in a single step, pass data as columns of matrix \code{y}. This will ignore the value of the response in \code{formula}.} \item{computeVar}{logical; if TRUE, prediction variances will be returned} \item{fullCovariance}{logical; if FALSE a vector with prediction variances will be returned, if TRUE the full covariance matrix of all predictions will be returned} } \section{Methods}{ \describe{ \item{formula = "formula", locations = "formula"}{ locations specifies which coordinates in \code{data} refer to spatial coordinates } \item{formula = "formula", locations = "Spatial"}{ Object locations knows about its own spatial locations } \item{formula = "formula", locations = "NULL"}{ used in case of unconditional simulations; newdata needs to be of class Spatial } }} \details{ Function \code{krige} is a simple wrapper method around \link{gstat} and \link[gstat]{predict} for univariate kriging prediction and conditional simulation methods available in gstat. For multivariate prediction or simulation, or for other interpolation methods provided by gstat (such as inverse distance weighted interpolation or trend surface interpolation) use the functions \link{gstat} and \link[gstat]{predict} directly. Function \code{idw} performs just as \code{krige} without a model being passed, but allows direct specification of the inverse distance weighting power. Don't use with predictors in the formula. For further details, see \link[gstat]{predict}. } \value{ if \code{locations} is not a formula, object of the same class as \code{newdata} (deriving from \code{Spatial}); else a data frame containing the coordinates of \code{newdata}. Attributes columns contain prediction and prediction variance (in case of kriging) or the \code{abs(nsim)} columns of the conditional Gaussian or indicator simulations \code{krige0} and \code{idw0} are alternative functions with reduced functionality and larger memory requirements; they return numeric vectors (or matrices, in case of multiple dependent) with predicted values only; in case \code{computeVar} is TRUE, a list with elements \code{pred} and \code{var} is returned, containing predictions, and (co)variances (depending on argument \code{fullCovariance}). } \references{ N.A.C. Cressie, 1993, Statistics for Spatial Data, Wiley. Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers and Geosciences, 30: 683-691. } \author{ Edzer Pebesma } \note{ Daniel G. Krige is a South African scientist who was a mining engineer when he first used generalised least squares prediction with spatial covariances in the 50's. George Matheron coined the term \code{kriging} in the 60's for the action of doing this, although very similar approaches had been taken in the field of meteorology. Beside being Krige's name, I consider "krige" to be to "kriging" what "predict" is to "prediction". } \seealso{ \link{gstat}, \link[gstat]{predict} } \examples{ library(sp) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y m <- vgm(.59, "Sph", 874, .04) # ordinary kriging: x <- krige(log(zinc)~1, meuse, meuse.grid, model = m) spplot(x["var1.pred"], main = "ordinary kriging predictions") spplot(x["var1.var"], main = "ordinary kriging variance") # simple kriging: x <- krige(log(zinc)~1, meuse, meuse.grid, model = m, beta = 5.9) # residual variogram: m <- vgm(.4, "Sph", 954, .06) # universal block kriging: x <- krige(log(zinc)~x+y, meuse, meuse.grid, model = m, block = c(40,40)) spplot(x["var1.pred"], main = "universal kriging predictions") # krige0, using user-defined covariance function and multiple responses in y: # exponential variogram with range 500, defined as covariance function: v = function(x, y = x) { exp(-spDists(coordinates(x),coordinates(y))/500) } # krige two variables in a single pass (using 1 covariance model): y = cbind(meuse$zinc,meuse$copper,meuse$lead,meuse$cadmium) x <- krige0(zinc~1, meuse, meuse.grid, v, y = y) meuse.grid$zinc = x[,1] spplot(meuse.grid["zinc"], main = "zinc") meuse.grid$copper = x[,2] spplot(meuse.grid["copper"], main = "copper") # the following has NOTHING to do with kriging, but -- # return the median of the nearest 11 observations: x = krige(zinc~1, meuse, meuse.grid, set = list(method = "med"), nmax = 11) # get 25%- and 75%-percentiles of nearest 11 obs, as prediction and variance: x = krige(zinc~1, meuse, meuse.grid, nmax = 11, set = list(method = "med", quantile = 0.25)) # get diversity (# of different values) and mode from 11 nearest observations: x = krige(zinc~1, meuse, meuse.grid, nmax = 11, set = list(method = "div")) } \keyword{ models } gstat/man/ossfim.Rd0000644000176200001440000000425715060550314013745 0ustar liggesusers% $Id: ossfim.Rd,v 1.3 2006-02-10 19:03:27 edzer Exp $ \name{ossfim} \alias{ossfim} \title{ Kriging standard errors as function of grid spacing and block size} \description{ Calculate, for a given variogram model, ordinary block kriging standard errors as a function of sampling spaces and block sizes } \usage{ ossfim(spacings = 1:5, block.sizes = 1:5, model, nmax = 25, debug = 0) } \arguments{ \item{spacings}{range of grid (data) spacings to be used} \item{block.sizes}{ range of block sizes to be used} \item{model}{variogram model, output of \code{vgm}} \item{nmax}{set the kriging neighbourhood size} \item{debug}{debug level; set to 32 to see a lot of output} } \value{ data frame with columns \code{spacing} (the grid spacing), \code{block.size} (the block size), and \code{kriging.se} (block kriging standard error) } \references{ Burrough, P.A., R.A. McDonnell (1999) Principles of Geographical Information Systems. Oxford University Press (e.g., figure 10.11 on page 261) Burgess, T.M., R. Webster, A.B. McBratney (1981) Optimal interpolation and isarithmic mapping of soil properties. IV Sampling strategy. The journal of soil science 32(4), 643-660. McBratney, A.B., R. Webster (1981) The design of optimal sampling schemes for local estimation and mapping of regionalized variables: 2 program and examples. Computers and Geosciences 7: 335-365. } \author{ Edzer Pebesma } \note{ The idea is old, simple, but still of value. If you want to map a variable with a given accuracy, you will have to sample it. Suppose the variogram of the variable is known. Given a regular sampling scheme, the kriging standard error decreases when either (i) the data spacing is smaller, or (ii) predictions are made for larger blocks. This function helps quantifying this relationship. Ossfim probably refers to ``optimal sampling scheme for isarithmic mapping''. } \seealso{ \link{krige} } \examples{ \dontrun{ x <- ossfim(1:15,1:15, model = vgm(1,"Exp",15)) library(lattice) levelplot(kriging.se~spacing+block.size, x, main = "Ossfim results, variogram 1 Exp(15)") } # if you wonder about the decrease in the upper left corner of the graph, # try the above with nmax set to 100, or perhaps 200. } \keyword{models} gstat/man/krigeTg.Rd0000644000176200001440000001002415143624330014030 0ustar liggesusers% $Id: krigeTg.Rd,v 1.10 2009-08-17 14:38:28 edzer Exp $ \name{krigeTg} \docType{methods} \alias{krigeTg} \title{ TransGaussian kriging using Box-Cox transforms } \description{ TransGaussian (ordinary) kriging function using Box-Cox transforms } \usage{ krigeTg(formula, locations, newdata, model = NULL, ..., nmax = Inf, nmin = 0, maxdist = Inf, block = numeric(0), nsim = 0, na.action = na.pass, debug.level = 1, lambda = 1.0) } \arguments{ \item{formula}{ formula that defines the dependent variable as a linear model of independent variables; suppose the dependent variable has name \code{z}, for ordinary and use a formula like \code{z~1}; the dependent variable should be NOT transformed. } \item{locations}{ object of class \code{Spatial}, with observations } \item{newdata}{ Spatial object with prediction/simulation locations; the coordinates should have names as defined in \code{locations} } \item{model}{ variogram model of the TRANSFORMED dependent variable, see \link{vgm}, or \link{fit.variogram}} \item{nmax}{ for local kriging: the number of nearest observations that should be used for a kriging prediction or simulation, where nearest is defined in terms of the space of the spatial locations. By default, all observations are used } \item{nmin}{ for local kriging: if the number of nearest observations within distance \code{maxdist} is less than \code{nmin}, a missing value will be generated; see maxdist } \item{maxdist}{ for local kriging: only observations within a distance of \code{maxdist} from the prediction location are used for prediction or simulation; if combined with \code{nmax}, both criteria apply } \item{block}{ does not function correctly, afaik } \item{nsim}{ does not function correctly, afaik } \item{na.action}{ function determining what should be done with missing values in 'newdata'. The default is to predict 'NA'. Missing values in coordinates and predictors are both dealt with. } \item{lambda}{value for the Box-Cox transform} \item{debug.level}{debug level, passed to \link[gstat]{predict}; use -1 to see progress in percentage, and 0 to suppress all printed information } \item{\dots}{ other arguments that will be passed to \link{gstat}} } \details{ Function \code{krigeTg} uses transGaussian kriging as explained in \url{https://www.math.umd.edu/~bnk/bak/Splus/kriging.html}. As it uses the R/gstat krige function to derive everything, it needs in addition to ordinary kriging on the transformed scale a simple kriging step to find m from the difference between the OK and SK prediction variance, and a kriging/BLUE estimation step to obtain the estimate of \eqn{\mu}{mu}. For further details, see \link{krige} and \link[gstat]{predict}. } \value{ an SpatialPointsDataFrame object containing the fields: \code{m} for the m (Lagrange) parameter for each location; \code{var1SK.pred} the \eqn{c_0 C^{-1}}{c0 Cinv} correction obtained by \code{muhat} for the mean estimate at each location; \code{var1SK.var} the simple kriging variance; \code{var1.pred} the OK prediction on the transformed scale; \code{var1.var} the OK kriging variance on the transformed scale; \code{var1TG.pred} the transGaussian kriging predictor; \code{var1TG.var} the transGaussian kriging variance, obtained by \eqn{\phi'(\hat{\mu},\lambda)^2 \sigma^2_{OK}}{phi'(muhat, lambda)^2 * var1.var} } \references{ N.A.C. Cressie, 1993, Statistics for Spatial Data, Wiley. } \author{ Edzer Pebesma } \seealso{ \link{gstat}, \link[gstat]{predict} } \examples{ \donttest{ library(sp) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y v = vgm(1, "Exp", 300) x1 = krigeTg(zinc~1,meuse,meuse.grid,v, lambda=1) # no transform x2 = krige(zinc~1,meuse,meuse.grid,v) summary(x2$var1.var-x1$var1TG.var) summary(x2$var1.pred-x1$var1TG.pred) lambda = -0.25 m = fit.variogram(variogram((zinc^lambda-1)/lambda ~ 1,meuse), vgm(1, "Exp", 300)) x = krigeTg(zinc~1,meuse,meuse.grid,m,lambda=-.25) spplot(x["var1TG.pred"], col.regions=bpy.colors()) summary(meuse$zinc) summary(x$var1TG.pred) } } \keyword{ models } gstat/man/map.to.lev.Rd0000644000176200001440000000200315060550314014413 0ustar liggesusers% $Id: map.to.lev.Rd,v 1.4 2006-02-10 19:03:27 edzer Exp $ \name{map.to.lev} \alias{map.to.lev} \title{ rearrange data frame for plotting with levelplot } \description{ rearrange data frame for plotting with levelplot } \usage{ map.to.lev(data, xcol = 1, ycol = 2, zcol = c(3, 4), ns = names(data)[zcol]) } \arguments{ \item{data}{ data frame, e.g. output from \link{krige} or \link[gstat]{predict} } \item{xcol}{ x-coordinate column number } \item{ycol}{ y-coordinate column number } \item{zcol}{ z-coordinate column number range } \item{ns}{names of the set of z-columns to be viewed} } \value{ data frame with the following elements: \item{x}{ x-coordinate for each row} \item{y}{ y-coordinate for each row} \item{z}{ column vector with each of the elements in columns \code{zcol} of \code{data} stacked } \item{name}{ factor; name of each of the stacked \code{z} columns } } \seealso{ \link{image.data.frame}, \link{krige}; for examples see \link[gstat]{predict}; \code{levelplot} in package lattice. } \keyword{dplot} gstat/man/get.contr.Rd0000644000176200001440000000263215143624466014357 0ustar liggesusers% $Id: get.contr.Rd,v 1.6 2009-02-20 13:53:38 edzer Exp $ \name{get.contr} \alias{get.contr} \title{ Calculate contrasts from multivariable predictions } \description{ Given multivariable predictions and prediction (co)variances, calculate contrasts and their (co)variance } \usage{ get.contr(data, gstat.object, X, ids = names(gstat.object$data)) } \arguments{ \item{data}{data frame, output of \link[gstat]{predict} } \item{gstat.object}{object of class \code{gstat}, used to extract ids; may be missing if \code{ids} is used } \item{X}{ contrast vector or matrix; the number of variables in \code{gstat.object} should equal the number of elements in \code{X} if \code{X} is a vector, or the number of rows in \code{X} if \code{X} is a matrix. } \item{ids}{ character vector with (selection of) id names, present in data } } \details{ From data, we can extract the \eqn{n \times 1}{n x 1} vector with multivariable predictions, say $y$, and its \eqn{n \times n}{n x n} covariance matrix $V$. Given a contrast matrix in $X$, this function computes the contrast vector $C=X'y$ and its variance $Var(C)=X'V X$. } \value{ a data frame containing for each row in \code{data} the generalized least squares estimates (named beta.1, beta.2, ...), their variances (named var.beta.1, var.beta.2, ...) and covariances (named cov.beta.1.2, cov.beta.1.3, ...) } \author{ Edzer Pebesma } \seealso{\link[gstat]{predict}} \keyword{ models } gstat/man/krige.cv.Rd0000644000176200001440000001412215143624412014150 0ustar liggesusers% $Id: krige.cv.Rd,v 1.18 2009-10-30 16:11:21 edzer Exp $ \name{krige.cv} \docType{methods} \alias{krige.cv} \alias{krige.cv.spatial} \alias{krige.cv.locations} \alias{gstat.cv} \alias{krige.cv,formula,formula-method} \alias{krige.cv,formula,Spatial-method} \alias{krige.cv,formula,sf-method} \title{ (co)kriging cross validation, n-fold or leave-one-out } \description{ Cross validation functions for simple, ordinary or universal point (co)kriging, kriging in a local neighbourhood. } \usage{ gstat.cv(object, nfold, remove.all = FALSE, verbose = interactive(), all.residuals = FALSE, ...) krige.cv(formula, locations, ...) krige.cv.locations(formula, locations, data, model = NULL, ..., beta = NULL, nmax = Inf, nmin = 0, maxdist = Inf, nfold = nrow(data), verbose = interactive(), debug.level = 0) krige.cv.spatial(formula, locations, model = NULL, ..., beta = NULL, nmax = Inf, nmin = 0, maxdist = Inf, nfold = nrow(locations), verbose = interactive(), debug.level = 0) } \arguments{ \item{object}{ object of class gstat; see function \link{gstat}} \item{nfold}{ integer; if larger than 1, then apply n-fold cross validation; if \code{nfold} equals \code{nrow(data)} (the default), apply leave-one-out cross validation; if set to e.g. 5, five-fold cross validation is done. To specify the folds, pass an integer vector of length \code{nrow(data)} with fold indexes. } \item{remove.all}{ logical; if TRUE, remove observations at cross validation locations not only for the first, but for all subsequent variables as well } \item{verbose}{ logical; if FALSE, progress bar is suppressed } \item{all.residuals}{ logical; if TRUE, residuals for all variables are returned instead of for the first variable only} \item{\dots}{ other arguments that will be passed to \link[gstat]{predict} in case of \code{gstat.cv}, or to \link{gstat} in case of \code{krige.cv}} \item{formula}{ formula that defines the dependent variable as a linear model of independent variables; suppose the dependent variable has name \code{z}, for ordinary and simple kriging use the formula \code{z~1}; for simple kriging also define \code{beta} (see below); for universal kriging, suppose \code{z} is linearly dependent on \code{x} and \code{y}, use the formula \code{z~x+y}} \item{locations}{ data object deriving from class \code{Spatial} or \code{sf} } \item{data}{ data frame (deprecated); should contain the dependent variable, independent variables, and coordinates; only to be provided if \code{locations} is a formula} \item{model}{ variogram model of dependent variable (or its residuals), defined by a call to \link{vgm} or \link{fit.variogram}} \item{beta}{ only for simple kriging (and simulation based on simple kriging); vector with the trend coefficients (including intercept); if no independent variables are defined the model only contains an intercept and this should be the simple kriging mean } \item{nmax}{ for local kriging: the number of nearest observations that should be used for a kriging prediction or simulation, where nearest is defined in terms of the space of the spatial locations. By default, all observations are used } \item{nmin}{ for local kriging: if the number of nearest observations within distance \code{maxdist} is less than \code{nmin}, a missing value will be generated; see maxdist } \item{maxdist}{ for local kriging: only observations within a distance of \code{maxdist} from the prediction location are used for prediction or simulation; if combined with \code{nmax}, both criteria apply } \item{debug.level}{ print debugging information; 0 suppresses debug information } } \section{Methods}{ \describe{ \item{formula = "formula", locations = "formula"}{ locations specifies which coordinates in \code{data} refer to spatial coordinates } \item{formula = "formula", locations = "Spatial"}{ Object locations knows about its own spatial locations } }} \details{ Leave-one-out cross validation (LOOCV) visits a data point, and predicts the value at that location by leaving out the observed value, and proceeds with the next data point. (The observed value is left out because kriging would otherwise predict the value itself.) N-fold cross validation makes a partitions the data set in N parts. For all observation in a part, predictions are made based on the remaining N-1 parts; this is repeated for each of the N parts. N-fold cross validation may be faster than LOOCV. } \value{ data frame containing the coordinates of \code{data} or those of the first variable in \code{object}, and columns of prediction and prediction variance of cross validated data points, observed values, residuals, zscore (residual divided by kriging standard error), and fold. If \code{all.residuals} is true, a data frame with residuals for all variables is returned, without coordinates. } \author{ Edzer Pebesma } \note{ Leave-one-out cross validation seems to be much faster in plain (stand-alone) gstat, apparently quite a bit of the effort is spent moving data around from R to gstat. } \seealso{ \link{krige}, \link{gstat}, \link[gstat]{predict} } \examples{ library(sp) data(meuse) coordinates(meuse) <- ~x+y m <- vgm(.59, "Sph", 874, .04) # five-fold cross validation: x <- krige.cv(log(zinc)~1, meuse, m, nmax = 40, nfold=5) bubble(x, "residual", main = "log(zinc): 5-fold CV residuals") # multivariable; thanks to M. Rufino: meuse.g <- gstat(id = "zn", formula = log(zinc) ~ 1, data = meuse) meuse.g <- gstat(meuse.g, "cu", log(copper) ~ 1, meuse) meuse.g <- gstat(meuse.g, model = vgm(1, "Sph", 900, 1), fill.all = TRUE) x <- variogram(meuse.g, cutoff = 1000) meuse.fit = fit.lmc(x, meuse.g) out = gstat.cv(meuse.fit, nmax = 40, nfold = 5) summary(out) out = gstat.cv(meuse.fit, nmax = 40, nfold = c(rep(1,100), rep(2,55))) summary(out) # mean error, ideally 0: mean(out$residual) # MSPE, ideally small mean(out$residual^2) # Mean square normalized error, ideally close to 1 mean(out$zscore^2) # correlation observed and predicted, ideally 1 cor(out$observed, out$observed - out$residual) # correlation predicted and residual, ideally 0 cor(out$observed - out$residual, out$residual) } \keyword{ models } gstat/man/wind.Rd0000644000176200001440000001143415060550314013401 0ustar liggesusers\name{wind} \alias{wind} \alias{wind.loc} \title{Ireland wind data, 1961-1978} \description{ Daily average wind speeds for 1961-1978 at 12 synoptic meteorological stations in the Republic of Ireland (Haslett and raftery 1989). Wind speeds are in knots (1 knot = 0.5418 m/s), at each of the stations in the order given in Fig.4 of Haslett and Raftery (1989, see below) } \format{ data.frame \code{wind} contains the following columns: \describe{ \item{year}{year, minus 1900} \item{month}{month (number) of the year} \item{day }{day} \item{RPT}{average wind speed in knots at station RPT} \item{VAL}{average wind speed in knots at station VAL} \item{ROS}{average wind speed in knots at station ROS} \item{KIL}{average wind speed in knots at station KIL} \item{SHA}{average wind speed in knots at station SHA} \item{BIR}{average wind speed in knots at station BIR} \item{DUB}{average wind speed in knots at station DUB} \item{CLA}{average wind speed in knots at station CLA} \item{MUL}{average wind speed in knots at station MUL} \item{CLO}{average wind speed in knots at station CLO} \item{BEL}{average wind speed in knots at station BEL} \item{MAL}{average wind speed in knots at station MAL} } data.frame \code{wind.loc} contains the following columns: \describe{ \item{Station}{Station name} \item{Code }{Station code} \item{Latitude}{Latitude, in DMS, see examples below} \item{Longitude}{Longitude, in DMS, see examples below} \item{MeanWind}{mean wind for each station, metres per second } } } \usage{ data(wind) } \author{ Adrian Raftery; imported to R by Edzer Pebesma } \references{ These data were analyzed in detail in the following article: Haslett, J. and Raftery, A. E. (1989). Space-time Modelling with Long-memory Dependence: Assessing Ireland's Wind Power Resource (with Discussion). Applied Statistics 38, 1-50. and in many later papers on space-time analysis, for example: Tilmann Gneiting, Marc G. Genton, Peter Guttorp: Geostatistical Space-Time Models, Stationarity, Separability and Full symmetry. Ch. 4 in: B. Finkenstaedt, L. Held, V. Isham, Statistical Methods for Spatio-Temporal Systems. } \note{ This data set comes with the following message: ``Be aware that the dataset is 532494 bytes long (thats over half a Megabyte). Please be sure you want the data before you request it.'' The data were obtained on Oct 12, 2008, from: http://www.stat.washington.edu/raftery/software.html The data are also available from statlib. Locations of 11 of the stations (ROS, Rosslare has been thrown out because it fits poorly the spatial correlations of the other stations) were obtained from: http://www.stat.washington.edu/research/reports/2005/tr475.pdf Roslare lat/lon was obtained from google maps, location Roslare. The mean wind value for Roslare comes from Fig. 1 in the original paper. Haslett and Raftery proposed to use a sqrt-transform to stabilize the variance. } \keyword{datasets} \examples{ data(wind) summary(wind) wind.loc library(sp) # char2dms wind.loc$y = as.numeric(char2dms(as.character(wind.loc[["Latitude"]]))) wind.loc$x = as.numeric(char2dms(as.character(wind.loc[["Longitude"]]))) coordinates(wind.loc) = ~x+y \dontrun{ # fig 1: library(maps) library(mapdata) map("worldHires", xlim = c(-11,-5.4), ylim = c(51,55.5)) points(wind.loc, pch=16) text(coordinates(wind.loc), pos=1, label=wind.loc$Station) } wind$time = ISOdate(wind$year+1900, wind$month, wind$day) # time series of e.g. Dublin data: plot(DUB~time, wind, type= 'l', ylab = "windspeed (knots)", main = "Dublin") # fig 2: #wind = wind[!(wind$month == 2 & wind$day == 29),] wind$jday = as.numeric(format(wind$time, '\%j')) windsqrt = sqrt(0.5148 * as.matrix(wind[4:15])) Jday = 1:366 windsqrt = windsqrt - mean(windsqrt) daymeans = sapply(split(windsqrt, wind$jday), mean) plot(daymeans ~ Jday) lines(lowess(daymeans ~ Jday, f = 0.1)) # subtract the trend: meanwind = lowess(daymeans ~ Jday, f = 0.1)$y[wind$jday] velocity = apply(windsqrt, 2, function(x) { x - meanwind }) # match order of columns in wind to Code in wind.loc: pts = coordinates(wind.loc[match(names(wind[4:15]), wind.loc$Code),]) # fig 3, but not really yet... dists = spDists(pts, longlat=TRUE) corv = cor(velocity) sel = !(as.vector(dists) == 0) plot(as.vector(corv[sel]) ~ as.vector(dists[sel]), xlim = c(0,500), ylim = c(.4, 1), xlab = "distance (km.)", ylab = "correlation") # plots all points twice, ignores zero distance # now really get fig 3: ros = rownames(corv) == "ROS" dists.nr = dists[!ros,!ros] corv.nr = corv[!ros,!ros] sel = !(as.vector(dists.nr) == 0) plot(as.vector(corv.nr[sel]) ~ as.vector(dists.nr[sel]), pch = 3, xlim = c(0,500), ylim = c(.4, 1), xlab = "distance (km.)", ylab = "correlation") # add outlier: points(corv[ros,!ros] ~ dists[ros,!ros], pch=16, cex=.5) xdiscr = 1:500 # add correlation model: lines(xdiscr, .968 * exp(- .00134 * xdiscr)) } gstat/man/fit.variogram.gls.Rd0000644000176200001440000000400015060550314015763 0ustar liggesusers% $Id: fit.variogram.gls,v 1.4 2009-02-20 13:53:38 edzer Exp $ \name{fit.variogram.gls} \alias{fit.variogram.gls} \title{ GLS fitting of variogram parameters } \description{ Fits variogram parameters (nugget, sill, range) to variogram cloud, using GLS (generalized least squares) fitting. Only for direct variograms. } \usage{ fit.variogram.gls(formula, data, model, maxiter = 30, eps = .01, trace = TRUE, ignoreInitial = TRUE, cutoff = Inf, plot = FALSE) } \arguments{ \item{formula}{formula defining the response vector and (possible) regressors; in case of absence of regressors, use e.g. \code{z~1}} \item{data}{object of class Spatial} \item{model}{variogram model to be fitted, output of \code{vgm}} \item{maxiter}{maximum number of iterations} \item{eps}{ convergence criterium } \item{trace}{ logical; if TRUE, prints parameter trace} \item{ignoreInitial}{ logical; if FALSE, initial parameter are taken from model; if TRUE, initial values of model are ignored and taken from variogram cloud: nugget: \code{mean(y)/2}, sill: \code{mean(y)/2}, range \code{median(h0)/4} with \code{y} the semivariance cloud value and \code{h0} the distances } \item{cutoff}{maximum distance up to which point pairs are taken into consideration} \item{plot}{logical; if TRUE, a plot is returned with variogram cloud and fitted model; else, the fitted model is returned.} } \value{ an object of class "variogramModel"; see \link{fit.variogram}; if \code{plot} is TRUE, a plot is returned instead. } \references{ Mueller, W.G., 1999: Least-squares fitting from the variogram cloud. Statistics and Probability Letters, 43, 93-98. Mueller, W.G., 2007: Collecting Spatial Data. Springer, Heidelberg. } \author{ Edzer Pebesma } \note{ Inspired by the code of Mihael Drinovac, which was again inspired by code from Ernst Glatzer, author of package vardiag. } \seealso{ \link{fit.variogram}, } \examples{ library(sp) data(meuse) coordinates(meuse) = ~x+y \dontrun{ fit.variogram.gls(log(zinc)~1, meuse[1:40,], vgm(1, "Sph", 900,1)) } } \keyword{models} gstat/man/extractPar.Rd0000644000176200001440000000225015060550314014551 0ustar liggesusers\name{extractPar} \alias{extractPar} \alias{extractParNames} \title{ Extracting parameters and their names from a spatio-temporal variogram model } \description{ All spatio-temporal variogram models have a different set of parameters. These functions extract the parameters and their names from the spatio-temporal variogram model. Note, this function is as well used to pass the parameters to the optim function. The arguments lower and upper passed to optim should follow the same structure. } \usage{ extractPar(model) extractParNames(model) } \arguments{ \item{model}{a spatio-temporal variogram model from \code{\link{vgmST}}} } \value{ A named numeric vector of parameters or a vector of characters holding the parameters' names. } \author{ Benedikt Graeler } \seealso{ \code{\link{fit.StVariogram}} and \code{\link{vgmST}} } \examples{ sumMetricModel <- vgmST("sumMetric", space=vgm(30, "Sph", 200, 6), time =vgm(30, "Sph", 15, 7), joint=vgm(60, "Exp", 84, 22), stAni=100) extractPar(sumMetricModel) extractParNames(sumMetricModel) }gstat/man/meuse.all.Rd0000644000176200001440000000463615143624334014341 0ustar liggesusers% $Id: meuse.all.Rd,v 1.5 2006-02-10 19:03:27 edzer Exp $ \name{meuse.all} \alias{meuse.all} \title{Meuse river data set -- original, full data set} \description{ This data set gives locations and top soil heavy metal concentrations (ppm), along with a number of soil and landscape variables, collected in a flood plain of the river Meuse, near the village Stein. Heavy metal concentrations are bulk sampled from an area of approximately 15 m x 15 m. } \format{ This data frame contains the following columns: \describe{ \item{sample}{sample number} \item{x}{a numeric vector; x-coordinate (m) in RDM (Dutch topographical map coordinates) } \item{y}{a numeric vector; y-coordinate (m) in RDM (Dutch topographical map coordinates)} \item{cadmium}{topsoil cadmium concentration, ppm.; note that zero cadmium values in the original data set have been shifted to 0.2 (half the lowest non-zero value) } \item{copper}{topsoil copper concentration, ppm. } \item{lead}{topsoil lead concentration, ppm. } \item{zinc}{topsoil zinc concentration, ppm. } \item{elev}{relative elevation} \item{om}{organic matter, as percentage } \item{ffreq}{flooding frequency class} \item{soil}{soil type} \item{lime}{lime class} \item{landuse}{landuse class} \item{dist.m}{distance to river Meuse (metres), as obtained during the field survey} \item{in.pit}{logical; indicates whether this is a sample taken in a pit} \item{in.meuse155}{logical; indicates whether the sample is part of the \code{meuse} (i.e., filtered) data set; in addition to the samples in a pit, an sample (139) with outlying zinc content was removed } \item{in.BMcD}{logical; indicates whether the sample is used as part of the subset of 98 points in the various interpolation examples of Burrough and McDonnell} } } \usage{ data(meuse.all) } \author{ The actual field data were collected by Ruud van Rijn and Mathieu Rikken; data compiled for R by Edzer Pebesma } \references{ P.A. Burrough, R.A. McDonnell, 1998. Principles of Geographical Information Systems. Oxford University Press. } \note{ \code{sample} refers to original sample number. Eight samples were left out because they were not indicative for the metal content of the soil. They were taken in an old pit. One sample contains an outlying zinc value, which was also discarded for the meuse (155) data set. } \seealso{\link{meuse.alt}} \keyword{datasets} \examples{ data(meuse.all) summary(meuse.all) } gstat/man/variogramLine.Rd0000644000176200001440000000365015060550314015240 0ustar liggesusers% $Id: variogramLine.Rd,v 1.3 2008-08-19 07:27:02 edzer Exp $ \name{variogramLine} \alias{variogramLine} \alias{getGammas} \title{ Semivariance Values For a Given Variogram Model } \description{ Generates a semivariance values given a variogram model } \usage{ variogramLine(object, maxdist, n = 200, min = 1.0e-6 * maxdist, dir = c(1,0,0), covariance = FALSE, ..., dist_vector, debug.level = 0) } \arguments{ \item{object}{ variogram model for which we want semivariance function values } \item{maxdist}{ maximum distance for which we want semivariance values } \item{n}{ number of points } \item{min}{ minimum distance; a value slightly larger than zero is usually used to avoid the discontinuity at distance zero if a nugget component is present } \item{dir}{ direction vector: unit length vector pointing the direction in x (East-West), y (North-South) and z (Up-Down) } \item{covariance}{logical; if TRUE return covariance values, otherwise return semivariance values } \item{...}{ignored} \item{dist_vector}{numeric vector or matrix with distance values} \item{debug.level}{gstat internal debug level} } \value{ a data frame of dimension (\code{n} x 2), with columns distance and gamma (semivariances or covariances), or in case \code{dist_vector} is a matrix, a conforming matrix with semivariance/covariance values is returned. } \note{variogramLine is used to generate data for plotting a variogram model.} \author{ Edzer Pebesma } \seealso{ \link{plot.gstatVariogram}} \examples{ variogramLine(vgm(5, "Exp", 10, 5), 10, 10) # anisotropic variogram, plotted in E-W direction: variogramLine(vgm(1, "Sph", 10, anis=c(0,0.5)), 10, 10) # anisotropic variogram, plotted in N-S direction: variogramLine(vgm(1, "Sph", 10, anis=c(0,0.5)), 10, 10, dir=c(0,1,0)) variogramLine(vgm(1, "Sph", 10, anis=c(0,0.5)), dir=c(0,1,0), dist_vector = 0.5) variogramLine(vgm(1, "Sph", 10, anis=c(0,0.5)), dir=c(0,1,0), dist_vector = c(0, 0.5, 0.75)) } \keyword{models} gstat/man/pcb.Rd0000644000176200001440000000343415060550314013205 0ustar liggesusers% $Id: pcb.Rd,v 1.8 2009-07-03 12:10:55 edzer Exp $ \name{pcb} \alias{pcb} \title{PCB138 measurements in sediment at the NCP, the Dutch part of the North Sea} \description{ PCB138 measurements in sediment at the NCP, which is the Dutch part of the North Sea } \format{ This data frame contains the following columns: \describe{ \item{year}{ measurement year } \item{x}{ x-coordinate; UTM zone 31 } \item{y}{ y-coordinate; UTM zone 31 } \item{coast}{ distance to coast of the Netherlands, in km.} \item{depth}{ sea water depth, m. } \item{PCB138}{ PCB-138, measured on the sediment fraction smaller than 63 \eqn{\mu}{mu}, in \eqn{\mu g/kg}{mu g/kg} dry matter; BUT SEE NOTE BELOW } \item{yf}{ year; as factor} } } \usage{ data(pcb) } \note{ A note of caution: The PCB-138 data are provided only to be able to re-run the analysis done in Pebesma and Duin (2004; see references below). If you want to use these data for comparison with PCB measurements elsewhere, or if you want to compare them to regulation standards, or want to use these data for any other purpose, you should first contact \url{mailto:basisinfodesk@rikz.rws.minvenw.nl}. The reason for this is that several normalisations were carried out that are not reported here, nor in the paper below. } \references{ Pebesma, E. J., and Duin, R. N. M. (2005). Spatial patterns of temporal change in North Sea sediment quality on different spatial scales. In P. Renard, H. Demougeot-Renard and R. Froidevaux (Eds.), Geostatistics for Environmental Applications: Proceedings of the Fifth European Conference on Geostatistics for Environmental Applications (pp. 367-378): Springer. } \seealso{\link{ncp.grid}} \keyword{datasets} \examples{ data(pcb) library(lattice) xyplot(y~x|as.factor(yf), pcb, aspect = "iso") # demo(pcb) } gstat/man/fit.lmc.Rd0000644000176200001440000000460015143624416014000 0ustar liggesusers% $Id: fit.lmc.Rd,v 1.4 2007-11-16 12:59:35 edzer Exp $ \name{fit.lmc} \alias{fit.lmc} \title{ Fit a Linear Model of Coregionalization to a Multivariable Sample Variogram } \description{ Fit a Linear Model of Coregionalization to a Multivariable Sample Variogram; in case of a single variogram model (i.e., no nugget) this is equivalent to Intrinsic Correlation } \usage{ fit.lmc(v, g, model, fit.ranges = FALSE, fit.lmc = !fit.ranges, correct.diagonal = 1.0, ...) } \arguments{ \item{v}{ multivariable sample variogram, output of \link{variogram} } \item{g}{ gstat object, output of \link{gstat} } \item{model}{ variogram model, output of \link{vgm}; if supplied this value is used as initial value for each fit } \item{fit.ranges}{ logical; determines whether the range coefficients (excluding that of the nugget component) should be fitted; or logical vector: determines for each range parameter of the variogram model whether it should be fitted or fixed. } \item{fit.lmc}{ logical; if TRUE, each coefficient matrices of partial sills is guaranteed to be positive definite } \item{correct.diagonal}{ multiplicative correction factor to be applied to partial sills of direct variograms only; the default value, 1.0, does not correct. If you encounter problems with singular covariance matrices during cokriging or cosimulation, you may want to try to increase this to e.g. 1.01 } \item{...}{ parameters that get passed to \link{fit.variogram} } } \value{ returns an object of class \code{gstat}, with fitted variograms; } \author{ Edzer Pebesma } \note{ This function does not use the iterative procedure proposed by M. Goulard and M. Voltz (Math. Geol., 24(3): 269-286; reproduced in Goovaerts' 1997 book) but uses simply two steps: first, each variogram model is fitted to a direct or cross variogram; next each of the partial sill coefficient matrices is approached by its in least squares sense closest positive definite matrices (by setting any negative eigenvalues to zero). The argument \code{correct.diagonal} was introduced by experience: by zeroing the negative eigenvalues for fitting positive definite partial sill matrices, apparently still perfect correlation may result, leading to singular cokriging/cosimulation matrices. If someone knows of a more elegant way to get around this, please let me know. } \seealso{ \link{variogram}, \link{vgm}, \link{fit.variogram}, \code{demo(cokriging)} } \keyword{models} gstat/man/predict.gstat.Rd0000644000176200001440000002341015060550314015210 0ustar liggesusers% $Id: predict.gstat.Rd,v 1.18 2007-11-16 12:59:47 edzer Exp $ \name{predict} \alias{predict} \alias{predict.gstat} \title{ Multivariable Geostatistical Prediction and Simulation } \description{ The function provides the following prediction methods: simple, ordinary, and universal kriging, simple, ordinary, and universal cokriging, point- or block-kriging, and conditional simulation equivalents for each of the kriging methods. } \usage{ \method{predict}{gstat}(object, newdata, block = numeric(0), nsim = 0, indicators = FALSE, BLUE = FALSE, debug.level = 1, mask, na.action = na.pass, sps.args = list(n = 500, type = "regular", offset = c(.5, .5)), ...) } \arguments{ \item{object}{ object of class \code{gstat}, see \link{gstat} and \link{krige}} \item{newdata}{ data frame with prediction/simulation locations; should contain columns with the independent variables (if present) and the coordinates with names as defined in \code{locations}; or: polygons, see below} \item{block}{ block size; a vector with 1, 2 or 3 values containing the size of a rectangular in x-, y- and z-dimension respectively (0 if not set), or a data frame with 1, 2 or 3 columns, containing the points that discretize the block in the x-, y- and z-dimension to define irregular blocks relative to (0,0) or (0,0,0)---see also the details section below. By default, predictions or simulations refer to the support of the data values. } \item{nsim}{ integer; if set to a non-zero value, conditional simulation is used instead of kriging interpolation. For this, sequential Gaussian or indicator simulation is used (depending on the value of \code{indicators}), following a single random path through the data. } \item{indicators}{ logical; only relevant if \code{nsim} is non-zero; if TRUE, use indicator simulation, else use Gaussian simulation } \item{BLUE}{ logical; if TRUE return the BLUE trend estimates only, if FALSE return the BLUP predictions (kriging) } \item{debug.level}{ integer; set gstat internal debug level, see below for useful values. If set to -1 (or any negative value), a progress counter is printed } \item{mask}{ not supported anymore -- use na.action; logical or numerical vector; pattern with valid values in newdata (marked as TRUE, non-zero, or non-NA); if mask is specified, the returned data frame will have the same number and order of rows in newdata, and masked rows will be filled with NA's. } \item{na.action}{ function determining what should be done with missing values in 'newdata'. The default is to predict 'NA'. Missing values in coordinates and predictors are both dealt with. } \item{sps.args}{ when newdata is of class \code{SpatialPolygons} or \code{SpatialPolygonsDataFrame} this argument list gets passed to \link[sp]{spsample} to control the discretizing of polygons } \item{...}{ ignored (but necessary for the S3 generic/method consistency) } } \details{ When a non-stationary (i.e., non-constant) mean is used, both for simulation and prediction purposes the variogram model defined should be that of the residual process, not that of the raw observations. For irregular block kriging, coordinates should discretize the area relative to (0), (0,0) or (0,0,0); the coordinates in newdata should give the centroids around which the block should be located. So, suppose the block is discretized by points (3,3) (3,5) (5,5) and (5,3), we should pass point (4,4) in newdata and pass points (-1,-1) (-1,1) (1,1) (1,-1) to the block argument. Although passing the uncentered block and (0,0) as newdata may work for global neighbourhoods, neighbourhood selection is always done relative to the centroid values in newdata. If newdata is of class \link[sp]{SpatialPolygons} or \link[sp]{SpatialPolygonsDataFrame}, then the block average for each of the polygons or polygon sets is calculated, using \link[sp]{spsample} to discretize the polygon(s). Argument \code{sps.args} controls the parameters used for \link[sp]{spsample}. The "location" with respect to which neighbourhood selection is done is for each polygon the SpatialPolygons polygon label point; if you use local neighbourhoods you should check out where these points are---it may be well outside the polygon itself. The algorithm used by gstat for simulation random fields is the sequential simulation algorithm. This algorithm scales well to large or very large fields (e.g., more than $10^6$ nodes). Its power lies in using only data and simulated values in a local neighbourhood to approximate the conditional distribution at that location, see \code{nmax} in \link{krige} and \link{gstat}. The larger \code{nmax}, the better the approximation, the smaller \code{nmax}, the faster the simulation process. For selecting the nearest \code{nmax} data or previously simulated points, gstat uses a bucket PR quadtree neighbourhood search algorithm; see the reference below. For sequential Gaussian or indicator simulations, a random path through the simulation locations is taken, which is usually done for sequential simulations. The reason for this is that the local approximation of the conditional distribution, using only the \code{nmax} neareast observed (or simulated) values may cause spurious correlations when a regular path would be followed. Following a single path through the locations, gstat reuses the expensive results (neighbourhood selection and solution to the kriging equations) for each of the subsequent simulations when multiple realisations are requested. You may expect a considerable speed gain in simulating 1000 fields in a single call to \link[gstat]{predict}, compared to 1000 calls, each for simulating a single field. The random number generator used for generating simulations is the native random number generator of the environment (R, S); fixing randomness by setting the random number seed with \code{set.seed()} works. When mean coefficient are not supplied, they are generated as well from their conditional distribution (assuming multivariate normal, using the generalized least squares BLUE estimate and its estimation covariance); for a reference to the algorithm used see Abrahamsen and Benth, Math. Geol. 33(6), page 742 and leave out all constraints. Memory requirements for sequential simulation: let n be the product of the number of variables, the number of simulation locations, and the number of simulations required in a single call. the gstat C function \code{gstat_predict} requires a table of size n * 12 bytes to pass the simulations back to R, before it can free n * 4 bytes. Hopefully, R does not have to duplicate the remaining n * 8 bytes when the coordinates are added as columns, and when the resulting matrix is coerced to a \code{data.frame}. Useful values for \code{debug.level}: 0: suppres any output except warning and error messages; 1: normal output (default): short data report, program action and mode, program progress in \%, total execution time; 2: print the value of all global variables, all files read and written, and include source file name and line number in error messages; 4: print OLS and WLS fit diagnostics; 8: print all data after reading them; 16: print the neighbourhood selection for each prediction location; 32: print (generalised) covariance matrices, design matrices, solutions, kriging weights, etc.; 64: print variogram fit diagnostics (number of iterations and variogram model in each iteration step) and order relation violations (indicator kriging values before and after order relation correction); 512: print block (or area) discretization data for each prediction location. To combine settings, sum their respective values. Negative values for \code{debug.level} are equal to positive, but cause the progress counter to work. For data with longitude/latitude coordinates (checked by \code{is.projected}), gstat uses great circle distances in km to compute spatial distances. The user should make sure that the semivariogram model used is positive definite on a sphere. } \value{ a data frame containing the coordinates of \code{newdata}, and columns of prediction and prediction variance (in case of kriging) or the columns of the conditional Gaussian or indicator simulations } \references{ N.A.C. Cressie, 1993, Statistics for Spatial Data, Wiley. Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers and Geosciences, 30: 683-691. } \author{ Edzer Pebesma } \seealso{\link{gstat}, \link{krige}} \examples{ # generate 5 conditional simulations library(sp) data(meuse) coordinates(meuse) = ~x+y v <- variogram(log(zinc)~1, meuse) m <- fit.variogram(v, vgm(1, "Sph", 300, 1)) plot(v, model = m) set.seed(131) data(meuse.grid) gridded(meuse.grid) = ~x+y sim <- krige(formula = log(zinc)~1, meuse, meuse.grid, model = m, nmax = 10, beta = 5.9, nsim = 5) # for speed -- 10 is too small!! # show all 5 simulation spplot(sim) # calculate generalised least squares residuals w.r.t. constant trend: g <- gstat(NULL, "log.zinc", log(zinc)~1, meuse, model = m) blue0 <- predict(g, newdata = meuse, BLUE = TRUE) blue0$blue.res <- log(meuse$zinc) - blue0$log.zinc.pred bubble(blue0, zcol = "blue.res", main = "GLS residuals w.r.t. constant") # calculate generalised least squares residuals w.r.t. linear trend: m <- fit.variogram(variogram(log(zinc)~sqrt(dist.m), meuse), vgm(1, "Sph", 300, 1)) g <- gstat(NULL, "log.zinc", log(zinc)~sqrt(dist.m), meuse, model = m) blue1 <- predict(g, meuse, BLUE = TRUE) blue1$blue.res <- log(meuse$zinc) - blue1$log.zinc.pred bubble(blue1, zcol = "blue.res", main = "GLS residuals w.r.t. linear trend") # unconditional simulation on a 100 x 100 grid xy <- expand.grid(1:100, 1:100) names(xy) <- c("x","y") gridded(xy) = ~x+y g.dummy <- gstat(formula = z~1, dummy = TRUE, beta = 0, model = vgm(1,"Exp",15), nmax = 10) # for speed -- 10 is too small!! yy <- predict(g.dummy, xy, nsim = 4) # show one realisation: spplot(yy[1]) # show all four: spplot(yy) } \keyword{ models } gstat/man/jura.Rd0000644000176200001440000001115015060550314013374 0ustar liggesusers% $Id: jura.Rd,v 1.3 2007-03-08 09:35:49 edzer Exp $ \name{jura} \alias{jura} \alias{prediction.dat} \alias{validation.dat} \alias{transect.dat} \alias{juragrid.dat} \alias{jura.grid} \alias{jura.pred} \alias{jura.val} \title{Jura data set} \description{ The jura data set from Pierre Goovaerts' book (see references below). It contains four \code{data.frame}s: prediction.dat, validation.dat and transect.dat and juragrid.dat, and three \code{data.frame}s with consistently coded land use and rock type factors, as well as geographic coordinates. The examples below show how to transform these into spatial (sp) objects in a local coordinate system and in geographic coordinates, and how to transform to metric coordinate reference systems. } \format{ The \code{data.frames} prediction.dat and validation.dat contain the following fields: \describe{ \item{Xloc}{ X coordinate, local grid km } \item{Yloc}{ Y coordinate, local grid km } \item{Landuse}{ see book and below } \item{Rock}{ see book and below } \item{Cd}{ mg cadmium \eqn{\mbox{kg}^{-1}}{kg^-1} topsoil } \item{Co}{ mg cobalt \eqn{\mbox{kg}^{-1}}{kg^-1} topsoil } \item{Cr}{ mg chromium \eqn{\mbox{kg}^{-1}}{kg^-1} topsoil } \item{Cu}{ mg copper \eqn{\mbox{kg}^{-1}}{kg^-1} topsoil } \item{Ni}{ mg nickel \eqn{\mbox{kg}^{-1}}{kg^-1} topsoil } \item{Pb}{ mg lead \eqn{\mbox{kg}^{-1}}{kg^-1} topsoil } \item{Zn}{ mg zinc \eqn{\mbox{kg}^{-1}}{kg^-1} topsoil } } The \code{data.frame} juragrid.dat only has the first four fields. In addition the \code{data.frame}s jura.pred, jura.val and jura.grid also have inserted third and fourth fields giving geographic coordinates: \describe{ \item{long}{ Longitude, WGS84 datum } \item{lat}{ Latitude, WGS84 datum } } } \usage{ data(jura) } \author{ Data preparation by David Rossiter (dgr2@cornell.edu) and Edzer Pebesma; georeferencing by David Rossiter } \references{ Goovaerts, P. 1997. Geostatistics for Natural Resources Evaluation. Oxford Univ. Press, New-York, 483 p. Appendix C describes (and gives) the Jura data set. Atteia, O., Dubois, J.-P., Webster, R., 1994, Geostatistical analysis of soil contamination in the Swiss Jura: Environmental Pollution 86, 315-327 Webster, R., Atteia, O., Dubois, J.-P., 1994, Coregionalization of trace metals in the soil in the Swiss Jura: European Journal of Soil Science 45, 205-218 } \note{ The points data sets were obtained from http://home.comcast.net/~pgoovaerts/book.html, which seems to be no longer available; the grid data were kindly provided by Pierre Goovaerts. The following codes were used to convert \code{prediction.dat} and \code{validation.dat} to \code{jura.pred} and \code{jura.val} (see examples below): Rock Types: 1: Argovian, 2: Kimmeridgian, 3: Sequanian, 4: Portlandian, 5: Quaternary. Land uses: 1: Forest, 2: Pasture (Weide(land), Wiese, Grasland), 3: Meadow (Wiese, Flur, Matte, Anger), 4: Tillage (Ackerland, bestelltes Land) Points 22 and 100 in the validation set (\code{validation.dat[c(22,100),]}) seem not to lie exactly on the grid originally intended, but are kept as such to be consistent with the book. Georeferencing was based on two control points in the Swiss grid system shown as Figure 1 of Atteia et al. (see above) and further points digitized on the tentatively georeferenced scanned map. RMSE 2.4 m. Location of points in the field was less precise. } \keyword{datasets} \examples{ data(jura) summary(prediction.dat) summary(validation.dat) summary(transect.dat) summary(juragrid.dat) # the following commands were used to create objects with factors instead # of the integer codes for Landuse and Rock: \dontrun{ jura.pred = prediction.dat jura.val = validation.dat jura.grid = juragrid.dat jura.pred$Landuse = factor(prediction.dat$Landuse, labels=levels(juragrid.dat$Landuse)) jura.pred$Rock = factor(prediction.dat$Rock, labels=levels(juragrid.dat$Rock)) jura.val$Landuse = factor(validation.dat$Landuse, labels=levels(juragrid.dat$Landuse)) jura.val$Rock = factor(validation.dat$Rock, labels=levels(juragrid.dat$Rock)) } # the following commands convert data.frame objects into spatial (sp) objects # in the local grid: require(sp) coordinates(jura.pred) = ~Xloc+Yloc coordinates(jura.val) = ~Xloc+Yloc coordinates(jura.grid) = ~Xloc+Yloc gridded(jura.grid) = TRUE # the following commands convert the data.frame objects into spatial (sp) objects # in WGS84 geographic coordinates # example is given only for jura.pred, do the same for jura.val and jura.grid # EPSG codes can be found by searching make_EPSG() jura.pred <- as.data.frame(jura.pred) coordinates(jura.pred) = ~ long + lat proj4string(jura.pred) = CRS("+init=epsg:4326") } gstat/man/walker.Rd0000644000176200001440000000163315060550314013725 0ustar liggesusers% $Id: walker.Rd,v 1.2 2006-02-10 19:03:27 edzer Exp $ \name{walker} \alias{walker} \alias{walker.exh} \title{Walker Lake sample and exhaustive data sets} \description{ This is the Walker Lake data sets (sample and exhaustive data set), used in Isaaks and Srivastava's Applied Geostatistics. } \format{ This data frame contains the following columns: \describe{ \item{Id}{Identification Number} \item{X}{Xlocation in meter} \item{Y}{Ylocation in meter} \item{V}{V variable, concentration in ppm} \item{U}{U variable, concentration in ppm} \item{T}{T variable, indicator variable} } } \usage{ data(walker) } \references{ Applied Geostatistics by Edward H. Isaaks, R. Mohan Srivastava; Oxford University Press. } \note{ This data sets was obtained from the data sets on ai-geostats (link no longer functioning) } \keyword{datasets} \examples{ library(sp) data(walker) summary(walker) summary(walker.exh) } gstat/man/vv.Rd0000644000176200001440000000121115060550314013063 0ustar liggesusers\name{vv} \alias{vv} \title{Precomputed variogram for PM10 in data set air} \description{ Precomputed variogram for PM10 in data set air } \format{ data set structure is explained in \link{variogramST}. } \usage{ data(vv) } \examples{ \dontrun{ # obtained by: library(spacetime) library(gstat) data(air) suppressWarnings(proj4string(stations) <- CRS(proj4string(stations))) rural = STFDF(stations, dates, data.frame(PM10 = as.vector(air))) rr = rural[,"2005::2010"] unsel = which(apply(as(rr, "xts"), 2, function(x) all(is.na(x)))) r5to10 = rr[-unsel,] vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) } } gstat/man/sic97.Rd0000644000176200001440000000147515060550314013402 0ustar liggesusers% $Id: sic97.Rd,v 1.2 2008-10-30 13:47:05 edzer Exp $ \name{sic97} \alias{sic_obs} \alias{sic_full} \alias{demstd} \title{ Spatial Interpolation Comparison 1997 data set: Swiss Rainfall} \description{ The text below is copied from the data item at ai-geostats, (link no longer working). } \format{ The data frames contain the following columns: \describe{ \item{ID}{this integer value is the number (unique value) of the monitoring station} \item{rainfall}{ rainfall amount, in 10th of mm } } } \note{ See the pdf that accompanies the original file for a description of the data. The .dxf file with the Swiss border is not included here. } \usage{ data(sic97) # } \author{ Gregoire Dubois and others. } \keyword{datasets} \examples{ data(sic97) image(demstd) points(sic_full, pch=1) points(sic_obs, pch=3) } gstat/man/plot.variogramCloud.Rd0000644000176200001440000000540615143624321016377 0ustar liggesusers% $Id: plot.variogramCloud.Rd,v 1.6 2006-12-12 20:44:07 edzer Exp $ \name{plot.variogramCloud} \alias{plot.variogramCloud} \title{ Plot and Identify Data Pairs on Sample Variogram Cloud } \description{ Plot a sample variogram cloud, possibly with identification of individual point pairs } \usage{ \method{plot}{variogramCloud}(x, identify = FALSE, digitize = FALSE, xlim, ylim, xlab, ylab, keep = FALSE, ...) } \arguments{ \item{x}{ object of class \code{variogramCloud}} \item{identify}{ logical; if TRUE, the plot allows identification of a series of individual point pairs that correspond to individual variogram cloud points (use left mouse button to select; right mouse button ends) } \item{digitize}{ logical; if TRUE, select point pairs by digitizing a region with the mouse (left mouse button adds a point, right mouse button ends) } \item{xlim}{ limits of x-axis } \item{ylim}{ limits of y-axis } \item{xlab}{ x axis label } \item{ylab}{ y axis label } \item{keep}{ logical; if TRUE and \code{identify} is TRUE, the labels identified and their position are kept and glued to object x, which is returned. Subsequent calls to plot this object will now have the labels shown, e.g. to plot to hardcopy } \item{...}{ parameters that are passed through to \link{plot.gstatVariogram} (in case of identify = FALSE) or to plot (in case of identify = TRUE) } } \value{ If \code{identify} or \code{digitize} is TRUE, a data frame of class \code{pointPairs} with in its rows the point pairs identified (pairs of row numbers in the original data set); if identify is F, a plot of the variogram cloud, which uses \link{plot.gstatVariogram} If in addition to \code{identify}, \code{keep} is also TRUE, an object of class \code{variogramCloud} is returned, having attached to it attributes "sel" and "text", which will be used in subsequent calls to plot.variogramCloud with \code{identify} set to FALSE, to plot the text previously identified. If in addition to \code{digitize}, \code{keep} is also TRUE, an object of class \code{variogramCloud} is returned, having attached to it attribute "poly", which will be used in subsequent calls to plot.variogramCloud with \code{digitize} set to FALSE, to plot the digitized line. In both of the \code{keep = TRUE} cases, the attribute \code{ppairs} of class \code{pointPairs} is present, containing the point pairs identified. } \author{ Edzer Pebesma } \seealso{ \link{variogram}, \link{plot.gstatVariogram}, \link{plot.pointPairs}, \link{identify}, \link{locator} } \examples{ library(sp) data(meuse) coordinates(meuse) = ~x+y plot(variogram(log(zinc)~1, meuse, cloud=TRUE)) ## commands that require interaction: # x <- variogram(log(zinc)~1, loc=~x+y, data=meuse, cloud=TRUE) # plot(plot(x, identify = TRUE), meuse) # plot(plot(x, digitize = TRUE), meuse) } \keyword{dplot} gstat/man/ncp.grid.Rd0000644000176200001440000000151315060550314014141 0ustar liggesusers% $Id: ncp.grid.Rd,v 1.5 2007-11-16 12:59:47 edzer Exp $ \name{ncp.grid} \alias{ncp.grid} \title{Grid for the NCP, the Dutch part of the North Sea} \description{ Gridded data for the NCP (Nederlands Continentaal Plat, the Dutch part of the North Sea), for a 5 km x 5 km grid; stored as data.frame. } \format{ This data frame contains the following columns: \describe{ \item{x}{x-coordinate, UTM zone 31} \item{y}{y-coordinate, UTM zone 31} \item{depth}{sea water depth, m.} \item{coast}{distance to the coast of the Netherlands, in km.} \item{area}{identifier for administrative sub-areas} } } \usage{ data(ncp.grid) } \author{Dutch National Institute for Coastal and Marine Management (RIKZ); data compiled for R by Edzer Pebesma } \seealso{\link{fulmar}} \keyword{datasets} \examples{ data(ncp.grid) summary(ncp.grid) } gstat/man/vgmST.Rd0000644000176200001440000001042515060550314013477 0ustar liggesusers\name{vgmST} \alias{vgmST} \title{Constructing a spatio-temporal variogram} \description{ Constructs a spatio-temporal variogram of a given type checking for a minimal set of parameters. } \usage{ vgmST(stModel, ..., space, time, joint, sill, k, nugget, stAni, temporalUnit) } \arguments{ \item{stModel}{A string identifying the spatio-temporal variogram model (see details below). Only the string before an optional "_" is used to identify the model. This mechanism can be used to identify different fits of the same model (\code{separable_A} and \code{separable_B} will be interpreted as separable models, but carry different names).} \item{\dots}{unused, but ensure an exact match of the following parameters.} \item{space}{A spatial variogram.} \item{time}{A temporal variogram.} \item{joint}{A joint spatio-temporal variogram.} \item{sill}{A joint spatio-temporal sill.} \item{k}{The weighting of the product in the product-sum model.} \item{nugget}{A joint spatio-temporal nugget.} \item{stAni}{A spatio-temporal anisotropy; the number of space units equivalent to one time unit.} \item{temporalUnit}{length one character vector, indicating the temporal unit (like secs)} } \details{ The different implemented spatio-temporal variogram models have the following required parameters (see as well the example section) \describe{ \item{separable:}{A variogram for \code{space} and \code{time} each and a joint spatio-temporal \code{sill} (variograms may have a separate nugget effect, but their joint sill will be 1) generating the call \preformatted{vgmST("separable", space, time, sill)}} \item{productSum:}{A variogram for \code{space} and \code{time} each, and the weighting of product \code{k} generating the call \preformatted{vgmST("productSum", space, time, k)}} \item{sumMetric:}{A variogram (potentially including a nugget effect) for \code{space}, \code{time} and \code{joint} each and a spatio-temporal anisotropy ratio \code{stAni} generating the call \preformatted{vgmST("sumMetric", space, time, joint, stAni)}} \item{simpleSumMetric:}{A variogram (without nugget effect) for \code{space}, \code{time} and \code{joint} each, a joint spatio-temporal \code{nugget} effect and a spatio-temporal anisotropy ratio \code{stAni} generating the call \preformatted{vgmST("simpleSumMetric", space, time, joint, nugget, stAni)}} \item{metric:}{A spatio-temporal \code{joint} variogram (potentially including a nugget effect) and \code{stAni} generating the call \preformatted{vgmST("metric", joint, stAni)}}} } \value{ Returns an S3 object of class \code{StVariogramModel}. } \author{ Benedikt Graeler } \seealso{ \code{\link{fit.StVariogram}} for fitting, \code{\link{variogramSurface}} to plot the variogram and \code{\link{extractParNames}} to better understand the parameter structure of spatio-temporal variogram models. } \examples{ # separable model: spatial and temporal sill will be ignored # and kept constant at 1-nugget respectively. A joint sill is used. separableModel <- vgmST("separable", space=vgm(0.9,"Exp", 147, 0.1), time =vgm(0.9,"Exp", 3.5, 0.1), sill=40) # product sum model: spatial and temporal nugget will be ignored and kept # constant at 0. Only a joint nugget is used. prodSumModel <- vgmST("productSum", space=vgm(39, "Sph", 343, 0), time= vgm(36, "Exp", 3, 0), k=15) # sum metric model: spatial, temporal and joint nugget will be estimated sumMetricModel <- vgmST("sumMetric", space=vgm( 6.9, "Lin", 200, 3.0), time =vgm(10.3, "Lin", 15, 3.6), joint=vgm(37.2, "Exp", 84,11.7), stAni=77.7) # simplified sumMetric model, only a overall nugget is fitted. The spatial, # temporal and jont nuggets are set to 0. simpleSumMetricModel <- vgmST("simpleSumMetric", space=vgm(20,"Lin", 150, 0), time =vgm(20,"Lin", 10, 0), joint=vgm(20,"Exp", 150, 0), nugget=1, stAni=15) # metric model metricModel <- vgmST("metric", joint=vgm(60, "Exp", 150, 10), stAni=60) } \keyword{models} gstat/man/variogramST.Rd0000644000176200001440000001110015143624265014675 0ustar liggesusers\name{variogramST} \alias{variogramST} \title{Calculate Spatio-Temporal Sample Variogram} \description{ Calculates the sample variogram from spatio-temporal data. } \usage{ variogramST(formula, locations, data, ..., tlags = 0:15, cutoff, width = cutoff/15, boundaries = seq(0, cutoff, width), progress = interactive(), pseudo = TRUE, assumeRegular = FALSE, na.omit = FALSE, cores = 1) } \arguments{ \item{formula}{formula, specifying the dependent variable.} \item{locations}{A STFDF or STSDF containing the variable; kept for compatibility reasons with variogram, either \code{locations} or \code{data} must be provided.} \item{data}{A \code{\link[spacetime:STFDF-class]{STFDF}}, \code{\link[spacetime:STSDF-class]{STSDF}} or \code{\link[spacetime:STIDF]{STIDF}} containing the variable.} \item{...}{any other arguments that will be passed to the underlying \code{\link{variogram}} function. In case of using data of type \code{\link[spacetime:STIDF-class]{STIDF}}, the argument \code{tunit} is recommended (and only used in the case of STIDF) to set the temporal unit of the \code{tlags}. Additionally, \code{twindow} can be passed to control the temporal window used for temporal distance calculations. This builds on the property of xts being ordered and only the next \code{twindow} instances are considered. This avoids the need of huge temporal distance matrices. The default uses twice the number as the average difference goes into the temporal cutoff.} \item{tlags}{ integer; time lags to consider or in case \code{data} is of class \code{\link[spacetime:STIDF-class]{STIDF}} the actual temporal boundaries with time unit given by \code{tunit} otherwise the same unit as \code{\link{diff}} on the index of the time slot will generate is assumed.} \item{cutoff}{ spatial separation distance up to which point pairs are included in semivariance estimates; as a default, the length of the diagonal of the box spanning the data is divided by three. } \item{width}{ the width of subsequent distance intervals into which data point pairs are grouped for semivariance estimates, by default the \code{cutoff} is divided into 15 equal lags.} \item{boundaries}{ numerical vector with distance interval upper boundaries; values should be strictly increasing } \item{progress}{ logical; if TRUE, show text progress bar } \item{pseudo}{ integer; use pseudo cross variogram for computing time-lagged spatial variograms? -1: find out from coordinates -- if they are equal then yes, else no; 0: no; 1: yes. } \item{assumeRegular}{logical; whether the time series should be assumed regular. The first time step is assumed to be representative for the whole series. Note, that temporal lags are considered by index, and no check is made whether pairs actually have the desired separating distance.} \item{na.omit}{shall all \code{NA} values in the spatio-temporal variogram be dropped? In case where complete rows or columns in the variogram consists of \code{NA} only, \code{plot} might produce a distorted picture.} \item{cores}{number of cores to use in parallel} } \value{The spatio-temporal sample variogram contains besides the fields \code{np}, \code{dist} and \code{gamma} the spatio-temporal fields, \code{timelag}, \code{spacelag} and \code{avgDist}, the first of which indicates the time lag used, the second and third different spatial lags. \code{spacelag} is the midpoint in the spatial lag intervals as passed by the parameter \code{boundaries}, whereas \code{avgDist} is the average distance between the point pairs found in a distance interval over all temporal lags (i.e. the averages of the values \code{dist} per temporal lag.) To compute variograms for space lag \eqn{h} and time lag \eqn{t}, the pseudo cross variogram \eqn{(Z_i(s)-Z_{i+t}(s+h))^2} is averaged over all time lagged observation sets \eqn{Z_i} and \eqn{Z_{i+t}} available (weighted by the number of pairs involved). } \references{ Cressie, N.A.C., 1993, Statistics for Spatial Data, Wiley. Cressie, N., C. Wikle, 2011, Statistics for Spatio-temporal Data, Wiley. Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers and Geosciences, 30: 683-691. } \author{ Edzer Pebesma, Benedikt Graeler } \seealso{ \code{\link{plot.StVariogram}}, for variogram models: \code{\link{vgmST}}, to fit a spatio-temporal variogram model to a spatio-temporal sample variogram: \code{\link{fit.StVariogram}} } \examples{ # The following spatio-temporal variogram has been calcualted through # vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) # in the vignette "st". data(vv) str(vv) plot(vv) } \keyword{models} gstat/man/show.vgms.Rd0000644000176200001440000000511515143624307014400 0ustar liggesusers% $Id: show.vgms.Rd,v 1.7 2008-12-15 14:27:29 edzer Exp $ \name{show.vgms} \alias{show.vgms} \title{ Plot Variogram Model Functions } \description{ Creates a trellis plot for a range of variogram models, possibly with nugget; and optionally a set of Matern models with varying smoothness. } \usage{ show.vgms(min = 1e-12 * max, max = 3, n = 50, sill = 1, range = 1, models = as.character(vgm()$short[c(1:17)]), nugget = 0, kappa.range = 0.5, plot = TRUE, ..., as.groups = FALSE) } \arguments{ \item{min}{ numeric; start distance value for semivariance calculation beyond the first point at exactly zero } \item{max}{ numeric; maximum distance for semivariance calculation and plotting } \item{n}{ integer; number of points to calculate distance values } \item{sill}{ numeric; (partial) sill(s) of the variogram model } \item{range}{ numeric; range(s) of the variogram model } \item{models}{ character; variogram model(s) to be plotted } \item{nugget}{ numeric; nugget component(s) for variogram models } \item{kappa.range}{ numeric; if this is a vector with more than one element, only a range of Matern models is plotted with these kappa values } \item{plot}{ logical; if TRUE, a plot is returned with the models specified; if FALSE, the data prepared for this plot is returned } \item{...}{ passed on to the call to xyplot } \item{as.groups}{ logical; if TRUE, different models are plotted with different lines in a single panel, else, in one panel per model } } \value{ returns a (Trellis) plot of the variogram models requested; see examples. I do currently have strong doubts about the ``correctness'' of the ``Hol'' model. The ``Spl'' model does seem to need a very large range value (larger than the study area?) to be of some value. If plot is FALSE, a data frame with the data prepared to plot is being returned. } \author{ Edzer Pebesma } \note{ the \code{min} argument is supplied because the variogram function may be discontinuous at distance zero, surely when a positive nugget is present. } \seealso{ \link{vgm}, \link{variogramLine}, } \examples{ show.vgms() show.vgms(models = c("Exp", "Mat", "Gau"), nugget = 0.1) # show a set of Matern models with different smoothness: show.vgms(kappa.range = c(.1, .2, .5, 1, 2, 5, 10), max = 10) # show a set of Exponential class models with different shape parameter: show.vgms(kappa.range = c(.05, .1, .2, .5, 1, 1.5, 1.8, 1.9, 2), models = "Exc", max = 10) # show a set of models with different shape parameter of M. Stein's representation of the Matern: show.vgms(kappa.range = c(.01, .02, .05, .1, .2, .5, 1, 2, 5, 1000), models = "Ste", max = 2) } \keyword{dplot} gstat/man/hscat.Rd0000644000176200001440000000267615143624351013557 0ustar liggesusers% $Id: hscat.Rd,v 1.3 2008-02-04 10:06:44 edzer Exp $ \name{hscat} \alias{hscat} \title{ Produce h-scatterplot } \description{ Produces h-scatterplots, where point pairs having specific separation distances are plotted. This function is a wrapper around xyplot. } \usage{ hscat(formula, data, breaks, pch = 3, cex = .6, mirror = FALSE, variogram.alpha = 0, as.table = TRUE,...) } \arguments{ \item{formula}{ specifies the dependent variable } \item{data}{ data where the variable in formula is resolved } \item{breaks}{ distance class boundaries } \item{pch}{ plotting symbol } \item{cex}{ plotting symbol size } \item{mirror}{ logical; duplicate all points mirrored along x=y? (note that correlations are those of the points plotted) } \item{variogram.alpha}{ parameter to be passed as alpha parameter to \link{variogram}; if alpha is specified it will only affect xyplot by being passed through ...} \item{as.table}{logical; if \code{TRUE}, panels plot top-to-bottom } \item{...}{ parameters, passed to variogram and xyplot } } \value{ an object of class trellis; normally the h scatter plot } \author{ Edzer Pebesma } \note{ Data pairs are plotted once, so the h-scatterplot are not symmetric. } \references{ Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers and Geosciences, 30: 683-691. } \examples{ library(sp) data(meuse) coordinates(meuse) = ~x+y hscat(log(zinc)~1, meuse, c(0, 80, 120, 250, 500, 1000)) } \keyword{models} gstat/man/krigeST.Rd0000644000176200001440000001364015143625405014017 0ustar liggesusers% $Id: krige.Rd,v 1.25 2010-01-12 12:15:48 edzer Exp $ \name{krigeST} \docType{methods} \alias{krigeST} \alias{krige,formula,ST-method} % calling krigeST \alias{krigeSTTg} % \alias{idw,formula,ST-method} \title{ Ordinary global Spatio-Temporal Kriging} \description{ Function for ordinary global and local and trans Gaussian spatio-temporal kriging on point support } \usage{ krigeST(formula, data, newdata, modelList, beta, y, ..., nmax = Inf, stAni = NULL, computeVar = FALSE, fullCovariance = FALSE, bufferNmax=2, progress=TRUE) krigeSTTg(formula, data, newdata, modelList, y, nmax=Inf, stAni=NULL, bufferNmax=2, progress=TRUE, lambda = 0) } \arguments{ \item{formula}{ formula that defines the dependent variable as a linear model of independent variables; suppose the dependent variable has name \code{z}, for ordinary and simple kriging use the formula \code{z~1}; for simple kriging also define \code{beta} (see below); for universal kriging, suppose \code{z} is linearly dependent on \code{x} and \code{y}, use the formula \code{z~x+y}} \item{data}{ ST object: should contain the dependent variable and independent variables.} \item{newdata}{ ST object with prediction/simulation locations in space and time; should contain attribute columns with the independent variables (if present).} \item{modelList}{ object of class \code{StVariogramModel}, created by \code{\link{vgmST}} - see below or the function \code{\link{vgmAreaST}} for area-to-point kriging. For the general kriging case: a list with named elements: \code{space}, \code{time} and/or \code{joint} depending on the spatio-temporal covariance family, and an entry \code{stModel}. Currently implemented families that may be used for \code{stModel} are \code{separable}, \code{productSum}, \code{metric}, \code{sumMetric} and \code{simpleSumMetric}. See the examples section in \code{\link{fit.StVariogram}} or \code{\link{variogramSurface}} for details on how to define spatio-temporal covariance models. \code{krigeST} will look for a "temporal unit" attribute in the provided modelList in order to adjust the temporal scales.} \item{y}{matrix; to krige multiple fields in a single step, pass data as columns of matrix \code{y}. This will ignore the value of the response in \code{formula}.} \item{beta}{The (known) mean for simple kriging.} \item{nmax}{The maximum number of neighbouring locations for a spatio-temporal local neighbourhood} \item{stAni}{a spatio-temporal anisotropy scaling assuming a metric spatio-temporal space. Used only for the selection of the closest neighbours. This scaling needs only to be provided in case the model does not have a stAni parameter, or if a different one should be used for the neighbourhood selection. Mind the correct spatial unit. Currently, no coordinate conversion is made for the neighbourhood selection (i.e. Lat and Lon require a spatio-temporal anisotropy scaling in degrees per second).} \item{\dots}{ further arguments used for instance to pass the model into vgmAreaST for area-to-point kriging} \item{computeVar}{logical; if TRUE, prediction variances will be returned} \item{fullCovariance}{logical; if FALSE a vector with prediction variances will be returned, if TRUE the full covariance matrix of all predictions will be returned} \item{bufferNmax}{factor with which nmax is multiplied for an extended search radius (default=2). Set to 1 for no extension of the search radius.} \item{progress}{whether a progress bar shall be printed for local spatio-temporal kriging; default=TRUE} \item{lambda}{The value of lambda used in the box-cox transformation.} } \details{ Function \code{krigeST} is a R implementation of the kriging function from \link{gstat} using spatio-temporal covariance models following the implementation of \code{\link{krige0}}. Function \code{krigeST} offers some particular methods for ordinary spatio-temporal (ST) kriging. In particular, it does not support block kriging or kriging in a distance-based neighbourhood, and does not provide simulation. If \code{data} is of class \code{sftime}, then \code{newdata} MUST be of class \code{stars} or \code{sftime}, i.e. mixing form old-style classes (package spacetime) and new-style classes (sf, stars, sftime) is not supported. } \value{ An object of the same class as \code{newdata} (deriving from \code{\link[spacetime:ST-class]{ST}}). Attributes columns contain prediction and prediction variance. } \references{ Benedikt Graeler, Edzer Pebesma, Gerard Heuvelink. Spatio-Temporal Geostatistics using gstat. The R Journal 8(1), 204--218. \url{https://journal.r-project.org/articles/RJ-2016-014/index.html} N.A.C. Cressie, 1993, Statistics for Spatial Data, Wiley. Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers and Geosciences, 30: 683-691. } \author{ Edzer Pebesma, Benedikt Graeler } \seealso{ \code{\link{krige0}}, \code{\link{gstat}}, \code{\link[gstat]{predict}}, \code{\link{krigeTg}} } \examples{ library(sp) library(spacetime) sumMetricVgm <- vgmST("sumMetric", space = vgm( 4.4, "Lin", 196.6, 3), time = vgm( 2.2, "Lin", 1.1, 2), joint = vgm(34.6, "Exp", 136.6, 12), stAni = 51.7) data(air) suppressWarnings(proj4string(stations) <- CRS(proj4string(stations))) rural = STFDF(stations, dates, data.frame(PM10 = as.vector(air))) rr <- rural[,"2005-06-01/2005-06-03"] rr <- as(rr,"STSDF") x1 <- seq(from=6,to=15,by=1) x2 <- seq(from=48,to=55,by=1) DE_gridded <- SpatialPoints(cbind(rep(x1,length(x2)), rep(x2,each=length(x1))), proj4string=CRS(proj4string(rr@sp))) gridded(DE_gridded) <- TRUE DE_pred <- STF(sp=as(DE_gridded,"SpatialPoints"), time=rr@time) DE_kriged <- krigeST(PM10~1, data=rr, newdata=DE_pred, modelList=sumMetricVgm) gridded(DE_kriged@sp) <- TRUE stplot(DE_kriged) } \keyword{ models } gstat/man/variogramSurface.Rd0000644000176200001440000000251615060550314015741 0ustar liggesusers\name{variogramSurface} \alias{variogramSurface} \title{Semivariance values for a given spatio-temporal variogram model} \description{ Generates a surface of semivariance values given a spatio-temporal variogram model (one of separable, productSum, sumMetric, simpleSumMetric or metric) } \usage{ variogramSurface(model, dist_grid, covariance = FALSE) } \arguments{ \item{model}{ A spatio-temporal variogram model generated through \code{\link{vgmST}} or \code{\link{fit.StVariogram}}. } \item{dist_grid}{ A data.frame with two columns: \code{spacelag} and \code{timelag}. } \item{covariance}{ Whether the covariance should be computed instead of the variogram (default: FALSE). } } \value{ A data.frame with columns \code{spacelag}, \code{timelag} and \code{gamma}. } \author{ Benedikt Graeler } \seealso{ See \code{\link{variogramLine}} for the spatial version and \code{\link{fit.StVariogram}} for the estimation of spatio-temporal variograms. } \examples{ separableModel <- vgmST("separable", space=vgm(0.86, "Exp", 476, 0.14), time =vgm( 1, "Exp", 3, 0), sill=113) data(vv) if(require(lattice)) { plot(vv, separableModel, wireframe=TRUE, all=TRUE) } # plotting of sample and model variogram plot(vv, separableModel) } \keyword{models} \keyword{spatio-temporal} gstat/man/krigeSTSimTB.Rd0000644000176200001440000000410615060550314014705 0ustar liggesusers\name{krigeSTSimTB} \alias{krigeSTSimTB} \title{conditional/unconditional spatio-temporal simulation} \description{ conditional/unconditional spatio-temporal simulation based on turning bands } \usage{ krigeSTSimTB(formula, data, newdata, modelList, nsim, progress = TRUE, nLyrs = 500, tGrid = NULL, sGrid = NULL, ceExt = 2, nmax = Inf) } \arguments{ \item{formula}{the formula of the kriging predictor} \item{data}{conditioning data} \item{newdata}{locations in space and time where the simulation is carried out} \item{modelList}{the spatio-temporal variogram (from \code{\link{vgmST}}) defining the spatio-temporal covariance structure of the simulated Gaussian random field} \item{nsim}{number of simulations} \item{progress}{boolean; whether the progress should be shown in progress bar} \item{nLyrs}{number of layers used in the turning bands approach (default = 500) } \item{tGrid}{optional explicit temporal griding that shall be used} \item{sGrid}{optional explicit spatial griding that shall be used} \item{ceExt}{expansion in the circulant embedding, defaults to 2} \item{nmax}{number of nearest neighbours that shall e used, defaults to 'Inf' meaning all available points are used} } \value{a spatio-temporal data frame with \code{nSim} simulations} \references{ Turning bands Lantuejoul, C. (2002) Geostatistical Simulation: Models and Algorithms. Springer. Matheron, G. (1973). The intrinsic random functions and their applications. Adv. Appl. Probab., 5, 439-468. Strokorb, K., Ballani, F., and Schlather, M. (2014) Tail correlation functions of max-stable processes: Construction principles, recovery and diversity of some mixing max-stable processes with identical TCF. Extremes, Submitted. Turning layers Schlather, M. (2011) Construction of covariance functions and unconditional simulation of random fields. In Porcu, E., Montero, J.M. and Schlather, M., Space-Time Processes and Challenges Related to Environmental Problems. New York: Springer. } \author{Benedikt Graeler} \seealso{\code{\link{krigeSimCE}}} \examples{ # see demo('circEmbeddingMeuse') }gstat/man/tull.Rd0000644000176200001440000000507415162302737013432 0ustar liggesusers\name{tull} \alias{tull} \alias{TULLNREG} \alias{tull36} \alias{Chlorid92} \encoding{utf-8} \title{Südliche Tullnerfeld data set} \description{ The Südliche Tullnerfeld is a part of the Danube river basin in central Lower Austria and due to its homogeneous aquifer well suited for a model-oriented geostatistical analysis. It contains 36 official water quality measurement stations, which are irregularly spread over the region. } \format{ The data frames contain the following columns: \describe{ \item{x}{X location in meter} \item{y}{Y location in meter} \item{S411}{Station name} \item{S429}{Station name} \item{S849}{Station name} \item{S854}{Station name} \item{S1502}{Station name} \item{S1584}{Station name} \item{S1591}{Station name} \item{S2046}{Station name} \item{S2047}{Station name} \item{S2048}{Station name} \item{S2049}{Station name} \item{S2051}{Station name} \item{S2052}{Station name} \item{S2053}{Station name} \item{S2054}{Station name} \item{S2055}{Station name} \item{S2057}{Station name} \item{S2058}{Station name} \item{S2059}{Station name} \item{S2060}{Station name} \item{S2061}{Station name} \item{S2062}{Station name} \item{S2063}{Station name} \item{S2064}{Station name} \item{S2065}{Station name} \item{S2066}{Station name} \item{S2067}{Station name} \item{S2070}{Station name} \item{S2071}{Station name} \item{S2072}{Station name} \item{S2128}{Station name} \item{S5319}{Station name} \item{S5320}{Station name} \item{S5321}{Station name} \item{S5322}{Station name} \item{S5323}{Station name} } } \usage{ data(tull) } \references{ Werner G. Müller, Collecting Spatial Data, 3rd edition. Springer Verlag, Heidelberg, 2007 } \keyword{datasets} \examples{ data(tull) # TULLNREG = read.csv("TULLNREG.csv") # I modified tulln36des.csv, such that the first line only contained: x,y # resulting in row.names that reflect the station ID, as in # tull36 = read.csv("tulln36des.csv") # Chlorid92 was read & converted by: #Chlorid92=read.csv("Chlorid92.csv") #Chlorid92$Datum = as.POSIXct(strptime(Chlorid92$Datum, "%d.%m.%y")) summary(tull36) summary(TULLNREG) summary(Chlorid92) # stack & join data to x,y,Date,Chloride form: cl.st = stack(Chlorid92[-1]) names(cl.st) = c("Chloride", "Station") cl.st$Date = rep(Chlorid92$Datum, length(names(Chlorid92))-1) cl.st$x = tull36[match(cl.st[,"Station"], row.names(tull36)), "x"] cl.st$y = tull36[match(cl.st[,"Station"], row.names(tull36)), "y"] # library(lattice) # xyplot(Chloride~Date|Station, cl.st) # xyplot(y~x|Date, cl.st, asp="iso", layout=c(16,11)) summary(cl.st) plot(TULLNREG, pch=3, asp=1) points(y~x, cl.st, pch=16) } gstat/man/meuse.alt.Rd0000644000176200001440000000135615143624314014343 0ustar liggesusers% $Id: meuse.alt.Rd,v 1.6 2006-02-10 19:03:27 edzer Exp $ \name{meuse.alt} \alias{meuse.alt} \title{Meuse river altitude data set} \description{ This data set gives a point set with altitudes, digitized from the 1:10,000 topographical map of the Netherlands. } \format{ This data frame contains the following columns: \describe{ \item{x}{a numeric vector; x-coordinate (m) in RDM (Dutch topographical map coordinates) } \item{y}{a numeric vector; y-coordinate (m) in RDM (Dutch topographical map coordinates)} \item{alt}{altitude in m. above NAP (Dutch zero for sea level)} } } \usage{ data(meuse.alt) } \seealso{\link{meuse.all}} \keyword{datasets} \examples{ data(meuse.alt) library(lattice) xyplot(y~x, meuse.alt, aspect = "iso") } gstat/man/fit.variogram.Rd0000644000176200001440000001221415143624440015211 0ustar liggesusers% $Id: fit.variogram.Rd,v 1.6 2006-02-10 19:03:27 edzer Exp $ \name{fit.variogram} \alias{fit.variogram} \title{ Fit a Variogram Model to a Sample Variogram } \description{ Fit ranges and/or sills from a simple or nested variogram model to a sample variogram } \usage{ fit.variogram(object, model, fit.sills = TRUE, fit.ranges = TRUE, fit.method = 7, debug.level = 1, warn.if.neg = FALSE, fit.kappa = FALSE) } \arguments{ \item{object}{ sample variogram, output of \link{variogram} } \item{model}{ variogram model, output of \link{vgm}; see Details below for details on how \code{NA} values in \code{model} are initialised. } \item{fit.sills}{ logical; determines whether the partial sill coefficients (including nugget variance) should be fitted; or logical vector: determines for each partial sill parameter whether it should be fitted or fixed. } \item{fit.ranges}{ logical; determines whether the range coefficients (excluding that of the nugget component) should be fitted; or logical vector: determines for each range parameter whether it should be fitted or fixed. } \item{fit.method}{ fitting method, used by gstat. The default method uses weights $N_h/h^2$ with $N_h$ the number of point pairs and $h$ the distance. This criterion is not supported by theory, but by practice. For other values of \code{fit.method}, see details. } \item{debug.level}{ integer; set gstat internal debug level } \item{warn.if.neg}{ logical; if TRUE a warning is issued whenever a sill value of a direct variogram becomes negative } \item{fit.kappa}{ logical; if \code{TRUE}, a sequence of 0.3, 0.4,...,5 will be searched for optimal fit; alternatively another sequence can be given to this argument } } \value{ returns a fitted variogram model (of class \code{variogramModel}). This is a \code{data.frame} with two attributes: (i) \code{singular} a logical attribute that indicates whether the non-linear fit converged (FALSE), or ended in a singularity (TRUE), and (ii) \code{SSErr} a numerical attribute with the (weighted) sum of squared errors of the fitted model. See Notes below. } \note{ If fitting the range(s) is part of the job of this function, the results may well depend on the starting values, given in argument \code{model}, which is generally the case for non-linear regression problems. This function uses internal C code, which uses Levenberg-Marquardt. If for a direct (i.e. not a cross) variogram a sill parameter (partial sill or nugget) becomes negative, fit.variogram is called again with this parameter set to zero, and with a FALSE flag to further fit this sill. This implies that the search does not move away from search space boundaries. On singular model fits: If your variogram turns out to be a flat, horizontal or sloping line, then fitting a three parameter model such as the exponential or spherical with nugget is a bit heavy: there's an infinite number of possible combinations of sill and range (both very large) to fit to a sloping line. In this case, the returned, singular model may still be useful: just try and plot it. Gstat converges when the parameter values stabilize, and this may not be the case. Another case of singular model fits happens when a model that reaches the sill (such as the spherical) is fit with a nugget, and the range parameter starts, or converges to a value smaller than the distance of the second sample variogram estimate. In this case, again, an infinite number of possibilities occur essentially for fitting a line through a single (first sample variogram) point. In both cases, fixing one or more of the variogram model parameters may help you out. The function will accept anisotropic sample variograms as input. It will fit a model for a given direction interval if the sample variogram only includes this direction. It is not possible to fit a multiple direction model to each direction of the sample variogram, in this case the model will be fitted to an average of all directions. } \details{ If any of the initial parameters of \code{model} are \code{NA}, they are given default values as follows. The range parameter is given one third of the maximum value of \code{object$dist}. The nugget value is given the mean value of the first three values of \code{object$gamma}. The partial sill is given the mean of the last five values of \code{object$gamma}. Values for \code{fit.method} are 1: weights equal to $N_j$; 2: weights equal to $N_j/((gamma(h_j))^2)$; 5 (ignore, use \link{fit.variogram.reml}); 6: unweighted (OLS); 7: $N_j/(h_j^2)$. } \references{ Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers and Geosciences, 30: 683-691. } \author{ Edzer Pebesma } \seealso{ \link{variogram}, \link{vgm} } \examples{ library(sp) data(meuse) coordinates(meuse) = ~x+y vgm1 <- variogram(log(zinc)~1, meuse) fit.variogram(vgm1, vgm(1, "Sph", 300, 1)) fit.variogram(vgm1, vgm("Sph")) # optimize the value of kappa in a Matern model, using ugly <<- side effect: f = function(x) attr(m.fit <<- fit.variogram(vgm1, vgm(,"Mat",nugget=NA,kappa=x)),"SSErr") optimize(f, c(0.1, 5)) plot(vgm1, m.fit) # best fit from the (0.3, 0.4, 0.5. ... , 5) sequence: (m <- fit.variogram(vgm1, vgm("Mat"), fit.kappa = TRUE)) attr(m, "SSErr") } \keyword{models} gstat/man/fit.variogram.reml.Rd0000644000176200001440000000365315060550314016152 0ustar liggesusers% $Id: fit.variogram.reml.Rd,v 1.4 2009-02-20 13:53:38 edzer Exp $ \name{fit.variogram.reml} \alias{fit.variogram.reml} \title{ REML Fit Direct Variogram Partial Sills to Data } \description{ Fit Variogram Sills to Data, using REML (only for direct variograms; not for cross variograms) } \usage{ fit.variogram.reml(formula, locations, data, model, debug.level = 1, set, degree = 0) } \arguments{ \item{formula}{formula defining the response vector and (possible) regressors; in case of absence of regressors, use e.g. \code{z~1}} \item{locations}{ spatial data locations; a formula with the coordinate variables in the right hand (dependent variable) side. } \item{data}{data frame where the names in formula and locations are to be found} \item{model}{variogram model to be fitted, output of \code{vgm}} \item{debug.level}{debug level; set to 65 to see the iteration trace and log likelihood} \item{set}{additional options that can be set; use \code{set=list(iter=100)} to set the max. number of iterations to 100. } \item{degree}{order of trend surface in the location, between 0 and 3} } \value{ an object of class "variogramModel"; see \link{fit.variogram} } \references{ Christensen, R. Linear models for multivariate, Time Series, and Spatial Data, Springer, NY, 1991. Kitanidis, P., Minimum-Variance Quadratic Estimation of Covariances of Regionalized Variables, Mathematical Geology 17 (2), 195--208, 1985 } \author{ Edzer Pebesma } \note{ This implementation only uses REML fitting of sill parameters. For each iteration, an \eqn{n \times n}{n x n} matrix is inverted, with $n$ the number of observations, so for large data sets this method becomes demanding. I guess there is much more to likelihood variogram fitting in package \code{geoR}, and probably also in \code{nlme}. } \seealso{ \link{fit.variogram}, } \examples{ library(sp) data(meuse) fit.variogram.reml(log(zinc)~1, ~x+y, meuse, model = vgm(1, "Sph", 900,1)) } \keyword{models} gstat/man/vgm.panel.Rd0000644000176200001440000000450415143624372014337 0ustar liggesusers% $Id: vgm.panel.Rd,v 1.3 2008-10-30 13:47:05 edzer Exp $ \name{vgm.panel.xyplot} \alias{vgm.panel.xyplot} \alias{panel.pointPairs} \title{ panel functions for most of the variogram plots through lattice } \description{ Variogram plots contain symbols and lines; more control over them can be gained by writing your own panel functions, or extending the ones described here; see examples. } \usage{ vgm.panel.xyplot(x, y, subscripts, type = "p", pch = plot.symbol$pch, col, col.line = plot.line$col, col.symbol = plot.symbol$col, lty = plot.line$lty, cex = plot.symbol$cex, ids, lwd = plot.line$lwd, model = model, direction = direction, labels, shift = shift, mode = mode, ...) panel.pointPairs(x, y, type = "p", pch = plot.symbol$pch, col, col.line = plot.line$col, col.symbol = plot.symbol$col, lty = plot.line$lty, cex = plot.symbol$cex, lwd = plot.line$lwd, pairs = pairs, line.pch = line.pch, ...) } \arguments{ \item{x}{ x coordinates of points in this panel} \item{y}{ y coordinates of points in this panel} \item{subscripts }{ subscripts of points in this panel} \item{type}{ plot type: "l" for connected lines } \item{pch}{ plotting symbol } \item{col}{ symbol and line color (if set) } \item{col.line}{ line color } \item{col.symbol}{ symbol color } \item{lty}{ line type for variogram model } \item{cex}{ symbol size } \item{ids}{ gstat model ids } \item{lwd}{ line width } \item{model}{ variogram model } \item{direction}{ direction vector \code{c(dir.horizontal, dir.ver)}} \item{labels}{ labels to plot next to points } \item{shift}{ amount to shift the label right of the symbol } \item{mode}{ to be set by calling function only } \item{line.pch}{ symbol type to be used for point of selected point pairs, e.g. to highlight point pairs with distance close to zero } \item{pairs}{ two-column matrix with pair indexes to be highlighted } \item{...}{ parameters that get passed to \link[lattice]{lpoints} } } \value{ ignored; the enclosing function returns a plot of class \code{trellis} } \author{ Edzer Pebesma } \seealso{ \link{plot.gstatVariogram}, \link{vgm}} \examples{ library(sp) data(meuse) coordinates(meuse) <- c("x", "y") library(lattice) mypanel = function(x,y,...) { vgm.panel.xyplot(x,y,...) panel.abline(h=var(log(meuse$zinc)), color = 'red') } plot(variogram(log(zinc)~1,meuse), panel = mypanel) } \keyword{models} gstat/man/krigeSimCE.Rd0000644000176200001440000000222215060550314014415 0ustar liggesusers\name{krigeSimCE} \alias{krigeSimCE} \title{Simulation based on circulant embedding} \description{Simulating a conditional/unconditional Gaussian random field via kriging and circulant embedding} \usage{ krigeSimCE(formula, data, newdata, model, n = 1, ext = 2) } \arguments{ \item{formula}{ the formula of the kriging predictor} \item{data}{ spatial data frame that conditions the simulation} \item{newdata}{locations in space where the Gaussian random field shall be simulated} \item{model}{a vgm model that defines the spatial covariance structure} \item{n}{number of simulations} \item{ext}{extension factor of the circulant embedding, defaults to 2} } \value{A spatial data frame as defined in \code{newdata} with \code{n} simulations.} \references{ Davies, Tilman M., and David Bryant: "On circulant embedding for Gaussian random fields in R." Journal of Statistical Software 55.9 (2013): 1-21. See i.e. the supplementary files at (retrieved 2018-05-25): https://www.jstatsoft.org/index.php/jss/article/downloadSuppFile/v055i09/v55i09.R } \author{Benedikt Graeler} \seealso{\code{\link{krigeSTSimTB}}} \examples{# see demo('circEmbeddingMeuse')}gstat/man/gstat.Rd0000644000176200001440000002346515143624541013577 0ustar liggesusers% $Id: gstat.Rd,v 1.23 2009-11-02 21:33:17 edzer Exp $ \name{gstat} \alias{gstat} \alias{print.gstat} \alias{[.gstat} \title{ Create gstat objects, or subset it } \description{ Function that creates gstat objects; objects that hold all the information necessary for univariate or multivariate geostatistical prediction (simple, ordinary or universal (co)kriging), or its conditional or unconditional Gaussian or indicator simulation equivalents. Multivariate gstat object can be subsetted. } \usage{ gstat(g, id, formula, locations, data, model = NULL, beta, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, force = FALSE, dummy = FALSE, set, fill.all = FALSE, fill.cross = TRUE, variance = "identity", weights = NULL, merge, degree = 0, vdist = FALSE, lambda = 1.0) \method{print}{gstat}(x, ...) } \arguments{ \item{g}{ gstat object to append to; if missing, a new gstat object is created } \item{id}{ identifier of new variable; if missing, \code{varn} is used with \code{n} the number for this variable. If a cross variogram is entered, \code{id} should be a vector with the two \code{id} values , e.g. \code{c("zn", "cd")}, further only supplying arguments \code{g} and \code{model}. It is advisable not to use expressions, such as \code{log(zinc)}, as identifiers, as this may lead to complications later on. } \item{formula}{ formula that defines the dependent variable as a linear model of independent variables; suppose the dependent variable has name \code{z}, for ordinary and simple kriging use the formula \code{z~1}; for simple kriging also define \code{beta} (see below); for universal kriging, suppose \code{z} is linearly dependent on \code{x} and \code{y}, use the formula \code{z~x+y}} \item{locations}{ formula with only independent variables that define the spatial data locations (coordinates), e.g. \code{~x+y}; if \code{data} has a \code{coordinates} method to extract its coordinates this argument can be ignored (see package sp for classes for point or grid data). } \item{data}{ data frame; contains the dependent variable, independent variables, and locations. } \item{model}{ variogram model for this \code{id}; defined by a call to \link{vgm}; see argument \code{id} to see how cross variograms are entered } \item{beta}{ for simple kriging (and simulation based on simple kriging): vector with the trend coefficients (including intercept); if no independent variables are defined the model only contains an intercept and this should be the expected value; for cross variogram computations: mean parameters to be used instead of the OLS estimates } \item{nmax}{ for local kriging: the number of nearest observations that should be used for a kriging prediction or simulation, where nearest is defined in terms of the space of the spatial locations } \item{nmin}{ for local kriging: if the number of nearest observations within distance \code{maxdist} is less than \code{nmin}, a missing value will be generated, unless \code{force==TRUE}; see \code{maxdist} } \item{omax}{ maximum number of observations to select per octant (3D) or quadrant (2D); only relevant if \code{maxdist} has been defined as well } \item{maxdist}{ for local kriging: only observations within a distance of \code{maxdist} from the prediction location are used for prediction or simulation; if combined with \code{nmax}, both criteria apply } \item{force}{ for local kriging, force neighbourhood selection: in case \code{nmin} is given, search beyond \code{maxdist} until \code{nmin} neighbours are found. A missing value is returned if this is not possible. } \item{dummy}{ logical; if TRUE, consider this data as a dummy variable (only necessary for unconditional simulation) } \item{set}{ named list with optional parameters to be passed to gstat (only \code{set} commands of gstat are allowed, and not all of them may be relevant; see the manual for gstat stand-alone, URL below ) } \item{x}{ gstat object to print } \item{fill.all}{ logical; if TRUE, fill all of the direct variogram and, depending on the value of \code{fill.cross} also all cross variogram model slots in \code{g} with the given variogram model } \item{fill.cross}{ logical; if TRUE, fill all of the cross variograms, if FALSE fill only all direct variogram model slots in \code{g} with the given variogram model (only if \code{fill.all} is used)} \item{variance}{ character; variance function to transform to non-stationary covariances; "identity" does not transform, other options are "mu" (Poisson) and "mu(1-mu)" (binomial) } \item{weights}{ numeric vector; if present, covariates are present, and variograms are missing weights are passed to OLS prediction routines resulting in WLS; if variograms are given, weights should be 1/variance, where variance specifies location-specific measurement error; see references section below } \item{merge}{ either character vector of length 2, indicating two ids that share a common mean; the more general gstat merging of any two coefficients across variables is obtained when a list is passed, with each element a character vector of length 4, in the form \code{c("id1", 1,"id2", 2)}. This merges the first parameter for variable \code{id1} to the second of variable \code{id2}.} \item{degree}{order of trend surface in the location, between 0 and 3} \item{vdist}{logical; if TRUE, instead of Euclidian distance variogram distance is used for selecting the nmax nearest neighbours, after observations within distance maxdist (Euclidian/geographic) have been pre-selected } \item{lambda}{test feature; doesn't do anything (yet)} \item{...}{ arguments that are passed to the printing of variogram models only} } \details{ to print the full contents of the object \code{g} returned, use \code{as.list(g)} or \code{print.default(g)} } \value{ an object of class \code{gstat}, which inherits from \code{list}. Its components are: \item{data}{list; each element is a list with the \code{formula}, \code{locations}, \code{data}, \code{nvars}, \code{beta}, etc., for a variable} \item{model}{list; each element contains a variogram model; names are those of the elements of \code{data}; cross variograms have names of the pairs of data elements, separated by a \code{.} (e.g.: \code{var1.var2}}) \item{set}{list; named list, corresponding to set \code{name}=\code{value}; gstat commands (look up the set command in the gstat manual for a full list)} } \references{ Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers and Geosciences, 30: 683-691. for kriging with known, varying measurement errors (\code{weights}), see e.g. Delhomme, J.P. Kriging in the hydrosciences. Advances in Water Resources, 1(5):251-266, 1978; see also the section Kriging with known measurement errors in the gstat user's manual. } \author{ Edzer Pebesma } \note{ The function currently copies the data objects into the gstat object, so this may become a large object. I would like to copy only the name of the data frame, but could not get this to work. Any help is appreciated. Subsetting (see examples) is done using the \code{id}'s of the variables, or using numeric subsets. Subsetted gstat objects only contain cross variograms if (i) the original gstat object contained them and (ii) the order of the subset indexes increases, numerically, or given the order they have in the gstat object. The merge item may seem obscure. Still, for colocated cokriging, it is needed. See texts by Goovaerts, Wackernagel, Chiles and Delfiner, or look for standardised ordinary kriging in the 1992 Deutsch and Journel or Isaaks and Srivastava. In these cases, two variables share a common mean parameter. Gstat generalises this case: any two variables may share any of the regression coefficients; allowing for instance analysis of covariance models, when variograms were left out (see e.g. R. Christensen's ``Plane answers'' book on linear models). The tests directory of the package contains examples in file merge.R. There is also \code{demo(pcb)} which merges slopes across years, but with year-dependent intercept. } \seealso{ \link[gstat]{predict}, \link{krige} } \examples{ library(sp) data(meuse) coordinates(meuse) = ~x+y # let's do some manual fitting of two direct variograms and a cross variogram g <- gstat(id = "ln.zinc", formula = log(zinc)~1, data = meuse) g <- gstat(g, id = "ln.lead", formula = log(lead)~1, data = meuse) # examine variograms and cross variogram: plot(variogram(g)) # enter direct variograms: g <- gstat(g, id = "ln.zinc", model = vgm(.55, "Sph", 900, .05)) g <- gstat(g, id = "ln.lead", model = vgm(.55, "Sph", 900, .05)) # enter cross variogram: g <- gstat(g, id = c("ln.zinc", "ln.lead"), model = vgm(.47, "Sph", 900, .03)) # examine fit: plot(variogram(g), model = g$model, main = "models fitted by eye") # see also demo(cokriging) for a more efficient approach g["ln.zinc"] g["ln.lead"] g[c("ln.zinc", "ln.lead")] g[1] g[2] # Inverse distance interpolation with inverse distance power set to .5: # (kriging variants need a variogram model to be specified) data(meuse.grid) gridded(meuse.grid) = ~x+y meuse.gstat <- gstat(id = "zinc", formula = zinc ~ 1, data = meuse, nmax = 7, set = list(idp = .5)) meuse.gstat z <- predict(meuse.gstat, meuse.grid) spplot(z["zinc.pred"]) # see demo(cokriging) and demo(examples) for further examples, # and the manuals for predict and image # local universal kriging gmeuse <- gstat(id = "log_zinc", formula = log(zinc)~sqrt(dist), data = meuse) # variogram of residuals vmeuse.res <- fit.variogram(variogram(gmeuse), vgm(1, "Exp", 300, 1)) # prediction from local neighbourhoods within radius of 170 m or at least 10 points gmeuse <- gstat(id = "log_zinc", formula = log(zinc)~sqrt(dist), data = meuse, maxdist=170, nmin=10, force=TRUE, model=vmeuse.res) predmeuse <- predict(gmeuse, meuse.grid) spplot(predmeuse) } \keyword{ models } gstat/man/fit.StVariogram.Rd0000644000176200001440000001423115060550314015455 0ustar liggesusers\name{fit.StVariogram} \alias{fit.StVariogram} \title{Fit a spatio-temporal sample variogram to a sample variogram} \description{ Fits a spatio-temporal variogram of a given type to spatio-temporal sample variogram. } \usage{ fit.StVariogram(object, model, ..., method = "L-BFGS-B", lower, upper, fit.method = 6, stAni=NA, wles) } \arguments{ \item{object}{The spatio-temporal sample variogram. Typically output from \code{\link{variogramST}}} \item{model}{The desired spatio-temporal model defined through \code{\link{vgmST}}.} \item{\dots}{further arguments passed to \code{\link{optim}}. \code{\link{extractParNames}} provides the parameter structure of spatio-temporal variogram models that help to provide sensible \code{upper} and \code{lower} limits.} \item{lower}{Lower limits used by optim. If missing, the smallest well defined values are used (mostly near 0).} \item{upper}{Upper limits used by optim. If missing, the largest well defined values are used (mostly \code{Inf}).} \item{method}{fit method, pass to \code{\link{optim}}} \item{fit.method}{an integer between 0 and 13 determine the fitting routine (i.e. weighting of the squared residuals in the LSE). Values 0 to 6 correspond with the pure spatial version (see \code{\link{fit.variogram}}). See the details section for the meaning of the other values (partly experimental).} \item{stAni}{The spatio-temporal anisotropy that is used in the weighting. Might be missing if the desired spatio-temporal variogram model does contain a spatio-temporal anisotropy parameter (this might cause bad convergence behaviour). The default is \code{NA} and will be understood as identity (1 temporal unit = 1 spatial unit). As this only in very few cases a valid assumption, a warning is issued.} \item{wles}{Should be missing; only for backwards compatibility, \code{wles = TRUE} corresponds to \code{fit.method = 1} and \code{wles = FALSE} corresponds to \code{fit.method = 6}.} } \details{ The following list summarizes the meaning of the \code{fit.method} argument which is essential a weighting of the squared residuals in the least-squares estimation. Please note, that weights based on the models gamma value might fail to converge properly due to the dependence of weights on the variogram estimate: \describe{ \item{\code{fit.method = 0}}{no fitting, however the MSE between the provided variogram model and sample variogram surface is calculated.} \item{\code{fit.method = 1}}{Number of pairs in the spatio-temporal bin: \eqn{N_j}{N[j]}} \item{\code{fit.method = 2}}{Number of pairs in the spatio-temporal bin divided by the square of the current variogram model's value: \eqn{N_j/\gamma(h_j, u_j)^2}{N[j]/gamma(h[j],u[j])^2}} \item{\code{fit.method = 3}}{Same as \code{fit.method = 1} for compatibility with \code{\link{fit.variogram}} but as well evaluated in R.} \item{\code{fit.method = 4}}{Same as \code{fit.method = 2} for compatibility with \code{\link{fit.variogram}} but as well evaluated in R.} \item{\code{fit.method = 5}}{Reserved for REML for compatibility with \code{\link{fit.variogram}}, not yet implemented.} \item{\code{fit.method = 6}}{No weights.} \item{\code{fit.method = 7}}{Number of pairs in the spatio-temporal bin divided by the square of the bin's metric distance. If \code{stAni} is not specified, the model's parameter is used to calculate the metric distance across space and time: \eqn{N_j/(h_j^2 + {\rm stAni}^2\cdot u_j^2)}{N[j]/(h[j]^2+ stAni^2*u[j]^2)}} \item{\code{fit.method = 8}}{Number of pairs in the spatio-temporal bin divided by the square of the bin's spatial distance. \eqn{N_j/h_j^2}{N[j]/h[j]^2}. Note that the 0 distances are replaced by the smallest non-zero distances to avoid division by zero.} \item{\code{fit.method = 9}}{Number of pairs in the spatio-temporal bin divided by the square of the bin's temporal distance. \eqn{N_j/u_j^2}{N[j]/u[j]^2}. Note that the 0 distances are replaced by the smallest non-zero distances to avoid division by zero.} \item{\code{fit.method = 10}}{Reciprocal of the square of the current variogram model's value: \eqn{1/\gamma(h_j,u_j)^2}{1/gamma(h[j],u[j])^2}} \item{\code{fit.method = 11}}{Reciprocal of the square of the bin's metric distance. If \code{stAni} is not specified, the model's parameter is used to calculate the metric distance across space and time: \eqn{1/(h_j^2 + {\rm stAni}^2\cdot u_j^2)}{1/(h[j]^2+ stAni^2*u[j]^2)}} \item{\code{fit.method = 12}}{Reciprocal of the square of the bin's spatial distance. \eqn{1/h_j^2}{1/h[j]^2}. Note that the 0 distances are replaced by the smallest non-zero distances to avoid division by zero.} \item{\code{fit.method = 13}}{Reciprocal of the square of the bin's temporal distance. \eqn{1/u_j^2}{1/u[j]^2}. Note that the 0 distances are replaced by the smallest non-zero distances to avoid division by zero.} } See also Table 4.2 in the gstat manual for the original spatial version. } \value{ Returns a spatio-temporal variogram model, as S3 class StVariogramModel. It carries the temporal and spatial unit as attributes \code{"temporal unit"} and \code{"spatial unit"} in order to allow \code{\link{krigeST}} to adjust for different units. The units are obtained from the provided empirical variogram. Further attributes are the optim output \code{"optim.output"} and the always not weighted mean squared error \code{"MSE"}. } \author{ Benedikt Graeler } \seealso{ \code{\link{fit.variogram}} for the pure spatial case. \code{\link{extractParNames}} helps to understand the parameter structure of spatio-temporal variogram models. } \examples{ # separable model: spatial and temporal sill will be ignored # and kept constant at 1-nugget respectively. A joint sill is used. \dontrun{ separableModel <- vgmST("separable", method = "Nelder-Mead", # no lower & upper needed space=vgm(0.9,"Exp", 123, 0.1), time =vgm(0.9,"Exp", 2.9, 0.1), sill=100) data(vv) separableModel <- fit.StVariogram(vv, separableModel, method="L-BFGS-B", lower=c(10,0,0.01,0,1), upper=c(500,1,20,1,200)) plot(vv, separableModel) } # dontrun } \keyword{models} gstat/DESCRIPTION0000644000176200001440000000253415162406267013117 0ustar liggesusersPackage: gstat Version: 2.1-6 Title: Spatial and Spatio-Temporal Geostatistical Modelling, Prediction and Simulation Authors@R: c(person(given = "Edzer", family = "Pebesma", role = c("aut", "cre"), email = "edzer.pebesma@uni-muenster.de", comment = c(ORCID = "0000-0001-8049-7069")), person("Benedikt", "Graeler", role = "aut")) Description: Variogram modelling; simple, ordinary and universal point or block (co)kriging; spatio-temporal kriging; sequential Gaussian or indicator (co)simulation; variogram and variogram map plotting utility functions; supports sf and stars. Depends: R (>= 2.10) Imports: utils, stats, graphics, methods, lattice, sp (>= 0.9-72), zoo, sf (>= 0.7-2), sftime, spacetime (>= 1.2-8), stars, FNN Suggests: fields, maps, mapdata, xts, raster, future, future.apply, RColorBrewer, geoR, ggplot2 License: GPL (>= 2.0) URL: https://github.com/r-spatial/gstat/, https://r-spatial.github.io/gstat/ Encoding: UTF-8 BugReports: https://github.com/r-spatial/gstat/issues/ NeedsCompilation: yes RoxygenNote: 6.1.1 Packaged: 2026-03-29 20:06:42 UTC; edzer Author: Edzer Pebesma [aut, cre] (ORCID: ), Benedikt Graeler [aut] Maintainer: Edzer Pebesma Repository: CRAN Date/Publication: 2026-03-30 05:40:07 UTC