gstat/0000755000176200001440000000000014127334762011405 5ustar liggesusersgstat/NAMESPACE0000644000176200001440000000362413777370515012637 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/demo/0000755000176200001440000000000014127330265012323 5ustar liggesusersgstat/demo/gstat3D.R0000644000176200001440000000116413777370515013775 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/cosimulation.R0000644000176200001440000000427413777370515015177 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/circEmbeddingMeuse.R0000644000176200001440000000625313777370515016206 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/blue.R0000644000176200001440000000154013777370515013411 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/depend.R0000644000176200001440000000252713777370515013727 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/lnsim.R0000644000176200001440000000332113777370515013603 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/uisim.R0000644000176200001440000000226113777370515013611 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/stkrige-crossvalidation.R0000644000176200001440000002456513777370515017350 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/demo/fulmar.R0000644000176200001440000000517713777370515013762 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/grass.R0000644000176200001440000000325113777370515013602 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/a2p.R0000644000176200001440000000167713777370515013157 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/stkrige-prediction.R0000644000176200001440000001172613777370515016277 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/a2pinST.R0000644000176200001440000000210313777370515013736 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/zonal.R0000644000176200001440000000063513777370515013611 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/wind.R0000644000176200001440000000340013777370515013420 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/rep.R0000644000176200001440000000131113777370515013244 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/stkrige.R0000644000176200001440000002317013777370515014135 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/line.R0000644000176200001440000000302713777370515013413 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/lhs.R0000644000176200001440000000217213777370515013252 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/cc.R0000644000176200001440000000100213777370515013040 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/block.R0000644000176200001440000000254013777370515013555 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/ugsim.R0000644000176200001440000000126713777370515013614 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/localKrigeST.R0000644000176200001440000000311513777370515015005 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/pcb.R0000644000176200001440000001123413777370515013227 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/krige.R0000644000176200001440000000203413777370515013562 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/weight.R0000644000176200001440000000122313777370515013747 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/sic2004.R0000644000176200001440000000776013777370515013560 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/examples.R0000644000176200001440000001616013777370515014304 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/ikr.R0000644000176200001440000000077713777370515013262 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/snow.R0000644000176200001440000000206513777370515013453 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/00Index0000644000176200001440000000401213777370515013466 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 pcb pcb North Sea data analysis as used for geoENV2004 paper; 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 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.R0000644000176200001440000000062413777370515014376 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/cokriging.R0000644000176200001440000000524213777370515014441 0ustar liggesusers# $Id: cokriging.R,v 1.4 2006-02-10 19:05:02 edzer Exp $ library(sp) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y # cokriging of the four heavy metal variables meuse.g <- gstat(id="zn", formula=log(zinc)~1, data=meuse, nmax = 10) meuse.g <- gstat(meuse.g, "cu", log(copper)~1, meuse, nmax = 10) meuse.g <- gstat(meuse.g, "cd", log(cadmium)~1, meuse, nmax = 10) meuse.g <- gstat(meuse.g, "pb", log(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) library(lattice) pl1 <- spplot(z["zn.pred"], main="log-zinc predictions") pl2 <- spplot(z["cu.pred"], main="log-copper predictions") pl3 <- spplot(z["cd.pred"], main="log-cadmium predictions") pl4 <- spplot(z["pb.pred"], main="log-lead predictions") 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)) z$zn.se = sqrt(z$zn.var) z$cu.se = sqrt(z$cu.var) z$pb.se = sqrt(z$pb.var) z$cd.se = sqrt(z$cd.var) pl1 <- spplot(z["zn.se"], main="log-zinc std.err.") pl2 <- spplot(z["cu.se"], main="log-copper std.err.") pl3 <- spplot(z["cd.se"], main="log-cadmium std.err.") pl4 <- spplot(z["pb.se"], main="log-lead st.err.") 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)) rm(meuse.g, x, meuse.fit, z) # indicator cokriging for the 9 percentiles 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) spplot(z, c(3,5,7,9,11,13,15,17,19), names.attr = paste("est.Pr(Zn < ", q, ")", sep = "")) gstat/data/0000755000176200001440000000000013777370515012324 5ustar liggesusersgstat/data/sic2004.rda0000644000176200001440000004267014127330265014075 0ustar liggesusers7zXZi"6!XWE|])TW"nRʟ$,~S'$^_e oo~b- m[b7 H$ L]‹TPywpTur~J .AᱏOf(gC)􊚥h+!b臥mz+n!C$T|XyT~J}NBeQJ]M;yIDZ"{0 `p /NDB4޳"0[Ӈ&OfmG8TK, C B8LҝՊ핃LH`uRttXǾ#.rײCЭ%E^B = & oGпép9ZíJRT&̮1B 5Z^]͸|;JiScƒF}M_X_N!G+*&8U:%)Mb^ 3?C8$ms28FeL͍ }Y] ,Pyln "~Z+⡽5wTNgHMa3j.qdŵg3{ۗ+UC$E!荪ŷ6@fxn\G!˘W)P:?'1^Й})֬SvaPLd*G\B#)) XT7%?6[nm.dɉTyas$آm(iKg1#̒F"F9>9\Ȏ0% Wm|Hǻ#A&f{7y$/XoOL$§vc-1!Ьf /5{YYW#מƼ8_p bC;d&_M9xg@'piJ]Âj?/O8y)ՁEoFNx9[!m@heAԓ [lS$\01)IzgxWVgtbzPvbyhvmT cw̿\ppI"f4:2Vߥ?>\s8Iol8@ߝ+j.*V;}ES͎f8Bō-k{5$y¹uȹN(pDM+Y_L?Y$lR P2+MOLT[h_ <$R%e*'UGGWs*P6b,<7kR:Zެ>&ZXуzevs/" cfQN߫&MMyѿ؟~h)4֩`fՅA@&V`MDQ]J 3 !Hffoa&l[?$)g= wRŜwz5hfa +6@\,Ů{΂ uP+c7Tuٔsqj)err 3X pٿiE/l \R&yo K: nͦڣ< ɍŚ3gݤdpVO(s0$R(w e@SF, Ƶm _S<JXxFLR ̓3THNmB{l;K _S~!'SxHR5ptN +(1Sw0|{5^bϼFO@|Dgm=4K:~(6XjJ,19țo#d("oURiky8 6uaG_W.Oqgv-*Kז$e%@8 N'Iwu\AH9ݦzcl1蹀bsQ kmE1IM'{^:z(G\@)Wˆ& =2GMnzOT‹XݲVą% _9 LA)bzgЃǛ-?:CRUz xj@Ib)PR6ʥ|@M`'1F-)SjqōKL8f弤 ŢigȺW*ąM {-c`FN_XSu-ջ5''۬fƵ`@FrDˊOR~kUL.Zg [)B4E兞*I hUH"13CA1EXГZŋ bGG]eϨcYV1b EQ+v5u\&Rig@\VZnUnS}Ä1$ܓ^vl! ۰c C9u32alkgٲ@;sx x徧+|RT@Χ2A ڲ;) Ъƨ,R˗4%&.f%<׏Vw.~j@dr^g4s -W_R{wKQ߇KkUfͦw932*p폁lrWH#>WF>OA(1-uK>ᡀVϋ_':p)T"1JBN!H;ίqz*A}9t띘Wm6sDԡ+VG]=w()*Ɓb3GMNsnZ{ZΑ*uih]Ėּy;UzLۆ2嚌>}Z~RһI8vr'@@]NḁIMan7~{LR0dƮ?>iHW?B^Xj\Xr0NçRf." }NĿAᷮ5 ~`~"_vWh*Ó P/xUUeFCFbT< .E!v{ؘH]Saal@ z"" r_'M"rP34H6y ǫa]]R%5RSsʾ!`ԓ(/FhhfAV (׀PMvJTY|#%108{|H6'yc }'藝0C ;= 53X6jaWr upl$ (wt{Y+$۱ߋvٓĄ,뫅zaRxZXbTK.,Y{o*]4$4ם▉Ce̳tw*=G/k>+“k`l_2W8 @$v$QYYtӵb1 B4,?cޠ[ cf&2[@쾝W.6XY|H3]AH^z}hRЄ+--Cֽ)~I5OXrDt`;Lm^ Q|έFVĹFXx0T)?aW;_=GDTAt!%)͜zE-+x-R lkѲ3|4GtM̲|l É`q~k| ]ؼfה?6$Fy[_~FFϘ~rbpb;ţ1&)7'A6~̴NWpvnb,\6P`0l뮴Fx _ʼ" "Q23 (\i[-WùEAB+dk+eVovbnB,Fæ ] 0(rz ;)A xԱꮽ ^s~@?䫗"iN'1jOll<ڂUPwNU30$&a~- }G(d2fzZ%Zy 9;+ %ʡ_<1A_'$<ԣ*f@H {WMPL5# ceMgm% @0)>JC!VFM c_RW:i5[Sȯ {^sL~h]5?XQMU ٪;3Uluڈ!Q&b2;%bt7?}AnlXF|RwMDb˽l_z$ stF C7}>o}SokqU'up-Ȕ:Va]ĆGsڋoJw"o%+wnZվحˡyƅU ć!/70׳l(LޗD⅀fg o>GsGWtY~Y>ݳX(1F->]D V@ dWn-9d9t gg4ا\}aj44Zk_ԟxy&Hg"抮zL?9T,:il>@,%) AC3 ]kK[*rZPN@ 3j W|1S.\%,~\MD޺n{X|i>HiTqtYl.X Z!мK)cHږ d$G EOe6\zxfKW&))-=zׂѺdM0bHcݿ1SZ*'0u]Mj_H K6_{0c=> mĂ"ۓ 59u Fm)vxV3CLO#;)EE2?GvECsd!: T瘡NSe$aVm8%)Ջ] !Po0}< Dyc s)qViF*3̣v\LY϶JmO'fA2F0bꮶ&K'-8|m :+18:.R>thW p9&U#j]x4~o:`Аꦴa䢜%R6znG<|x.Ͼ6\X~;Ex8s%rgTYx_u:$,kv:X,f2É'#f,/2S&rρ-12Q'2h ARGK] Jb6 _RپU X JWW//$m/RIt0&9._3#.+GUvM\ _EB= ey,eCw44Jzĩz:Et}I9)^9G{!T~4167 M;^4އT8.6T%dIg k=H/Wk+e ]*ȩ;aHy_5-ue#?&VusjB/iúgq"N1s('K1AL[mx!w@@r YFqn-H՞"m^ݩCuCkQQה>;He;0NMS7t} nsL./\'<1չW_iՓ'7Y`bnIaNKv{РU$>sʅJe#w*MIEY5,T)Jh޲>q2d$WS?ϷiS 1+oog"G3L%o[F66`.oKUd6dSYƵ{8>^lJ-FZTv3 Mkd%^4Ըȿ?jq(Awѩ`D`+FqwiHNQ8;0t}xyHIk}1DQv~8L >#?1k 17Y,tAi_XiE!VS.A>\2u oRJ7VnAU(j&QkjasO#2#Z /uRv*hԸֆRn%Ajgş Rb4u(aj*NwK(8K1NmU6QUCD]la Լ<տk Q{j{j(NTށ',^jPŦ8Hh:@vJ2KhA:f`x`,.Ҡ]w])Lpx Mq» ,c+TP]/A౹dH$`A#9m/Yhšs#cjpo"rD֫'8[(pA{ dVz1a4۰%V#anW7>]Z0FX ;}5&oZbx k-+=/U2|~= #˗@/]cWRϗFƒ!)6S{jH9Hs$Jӫ(d7%sQhOB ԋO5~\4S͍q&JV}L E h7 :l/ԜdS 3QqX^f0J蘪w>,QBK@[T`u7X6E6+ucBsdJv`b&CևwHf nD^nH ϒo&k{x sVmCpNGx%)AB8y(Сr)c49ڇ;$)E4!/J8{06ѷscØԕM?c0*l~e(ݛ0vAJ 33\a<]u6[ve\{7i"꧑Y3T,솜:ƾZ[ڔ't{b-+Sԏޤ45Ӹ*AYOH<*oAŕPGDD TV[j/;t肝Y HJh./BOSh r Y]8ʹ';t^A `Cq;먥khRŵ5`{nta''w4yW2N XrDbBt,3~'pj"TLKbq8ey֜v棥=-:~qP֏|7QО^;qDU[ǽ8fT)$iE,A]P_t76wP)Y"i_#(zܖYCe>9 pΛh~WL @~_ipaZP@ Nq]*1uѶop n]OϻV`Y&Nj v~v.65HSux(4ZT\8]æPbfvCePvѳo_AlM SF_ 6q:!WO^ʣf; ## =}bkv H>C_׳] 9,pч_6C-9= % >.oʼn.WP3K;(1OAv nq(,.6LTF~ǂYcegG힘e([f+ :n"#JI9c.DBbp)KhDUÙ"RMF>I9]S(9˧˼ED"T6`!?Y:=$iPƾFOFmix+ j-?(p9 (tz[9ת{+3"xDW1]Z!Szu^F=߀Hs/8C<ԣ fsh|S ZbL2\80[d;[ "mG:Z>IqW )q刨,;DIIorP7N?/@ޭxæ@)  jp\zMNR>@< sãwdVnQmfP_0 W)@) C僶m jkS|/C-ڦl#0xS@)yCe?apFMhixɢ] ߇4Y`o bbJE,ٚ[`E|us,\J %[o1jߔձݴDeZٱ#-R5 Qk^Dz*',텚b (٭S"]݂\og&dixVÎ!ڿ1 5ڇ7w!bڊΉxrxN qILD8rLBhU=5s/Rؠ:&~μWrHgKLʇUzRgyޙwKQLTCY}0zplV[X!燈GYyڰ̢5t+'h0N*})97;3F3w+֜_}!ȥ>j0VW8-WM+RXʯ;P)Rwӭ) +P$sNYxAkJ#ߟeGM5^MŰݷ<3ACw8ۼܖ_mE]`'Pf]ƗOe>BuW^$V;P$cz=Fe;UG/eWQ^ˌhf푚C%P%р-8,Sۃ z>uEE8l{3uzd4V!~_9=.3.9"XR&V(\wiʾVɎlRSD *ah/Kq DX(L}95bXȎQ=lM"t ȋ4K0&>`fHgdٮ*>$2.c=$K.hwnT+gNu8w^&MⳈQuOg)%g}ݲmە.& W[&k_m !9 n#B]A+G[^>:9D\AMmfj\ g\+o#QPk^,$W~_ia (4饲Z=h .SϷ>}`H B\iiP-ﰢ-:DTxSVaX]*xB6g7J]h"1@W6ZsL.V|hH0uTGJ:)p9g RHg*1Wy+nV1m /ӷx>jQ<>]AoDɤh| D(S4X2޵_a4hNp Bo^j.ԦSXe!n`Tjn-[0Q_ čKϖƥbg-?*p?%=5 pjUqal[%Vz4L%@Ի:L,7}_64xlgNV 9}{?;0Zg3>ÒT+Abg/}gK *Z5 d=j`GH;c3@(K]2g'#4Q$0/vU:yVƃÄi?6쳳!2 .8260R%oRK.\Ο"S꼶 ? y%nJ i*PYEJVw M]$?*O`Np `_d ;ΣPvB$Qr9F| ,ג%nRl5^@1 ~n_b~*UWXqb Qȉʉ zGq"hr\9]iWUĒ4Uh Tc,{{ig=x-`";Q^g\8eSpW6 t]1|M(0^w[4o%@WɣOP*EHnl(O6KAPZiA,z>UAe{Έ;qp*t< 28Z1YP- j=27$&,rȉ YUplt&4rMM3J3+w6"vڈ@1[U$fHA'h5_OOpBDZR C IЫcMR OOMoZ="$^qX\*í-AqQi vFl:e]P͆m[#J%KϤb SG^!W_JEmFjR 2lxcǁW~'DHDfUL/vVAP:{ ȓ 8(嬙܈;w'9f>Kp)2L[ju ~BzAy;}Di@z4$ɨ>a{]؅(J?ex2ko8 AOD Q)53VLҫYUm\Y8 ;|);ȿZr(Jx쯑ҥ紞ߛvOx18&*mS9A_G nT @P)?oxTDf Y.v\˂miF '{Hx{,:ج!'9)(ga̪NbU+iu{I 3+8*"B^6"#F5{(/AoGQ9kUъb֔Ʌyc!5?T>""w?S͍PN2hCdఢH \;u}Hw j"gTEh̉(K]Gҳ<ɷ4:?^p z!z2PqQQSb}Ţ3Ay=eqץ`jPDYK=j½1پt{˯r:DeSX\"닍r{=w#ŭ԰4vi3u%5~p1l_L=k*Rҕ@wxmLGJ^/M1bI60<+_Z8l{ʿSDбɮ5~YYFS32'̈r@-DYp.y2]#Nh)=;Pɘ*uF2_'vwRc ,nAT_S)Tnk1vh{ R:pq\^9Ye+wc'v@{ xZI /VތAI\2(®YZ(\,CA>(7gy럵k\E;Ig^f<0Zh7Ƽg}ɅgRucAYEv]3>7%j|dZidn5p!dDk6E;/ /TU ]<^LX/OBrHG7 41͆z(ͽt#-wnּ6t$c\NKrJ(*׋T]ZyQJe߬E|I:z (. }uCh\ [i QdRYm%k r9Jڤ<2^t;)؜ȃwğlP{zĻ" NWWv =K υ0Ye6Ƙd/Ka[㯷vvr-e-103[>$/B= }&8()[>)N̉%^?@vJ5?ewƖ8wv [|gAa/˦]L_8ҧdHS=o%h&G/U+_[hIc|%*uUߴSN=ӁFnB Ӿ:;a;OճhÆ7-4-!J]Nw0h9GXփlc6k=O;XYڻ K5=M?D<=(?|;b;Dԫ͑k_y|-W^NV b &*Z]h1KR T/ҨsЍ׷pZBN޺B@ P֞{8>2}x[5 M˧\S$iwX]m$CBPprЙ4K4ànXJY}88]d垺gi,Nx\~U؉L [ !a*{"c2g!ѵPON"q<'J_Z@<r0$E "]'\H rӎc'ȱzu#Hn]fU_aCQVW3$CTᔺ6o@*Nȟ3jv/#B*iIé:"F^[t2խMl?4'IdU[Cs۷u*B_H#I5/ <,f9K*疲z'wENu4^"'N,|h$_iJ#=O|y3xtWX^AGm9BaK@Lt/BA<6tʳP&]!$V<-j _ O䠥 KaI.l7@`.^(A䟬5 $ WG&:Imbu:m:I=s0Z4VZذƷmnHIDTzg,eZ+0$]ci6G̥?7}g켘r:Fӵ1Ub#jP>Cxntv2evE<Sn~9 #qhZsA؇`ua DUÓ4]yԅKyoKƹzDF(%;+}od"[AQj (MexP/ڿ A 6D&p$Ɋ2~UO0y__,t?w kP0C]D읔[]7i`+dP:%7J*o0%g(f6]EYWg$߉S| M!}k^2_Yhny'Oyf%_5Cj=7)PTo9^nj Co}D;63M drڇiY=N3hچiI99Q0>ߐ+c -e9$?AYCo8=d`F*9,]'W&V%ٹ%I>(۰Pӥ:u܂ʥ"t2p5VrDIaےI:nU t8+,€o bՋ#h-BpqNj3I k?+rt}p8j$ET<^go݌YS ⓄaEX3 /-PthANهYPЈaǪԳ]s``Ps8# w-pwd$ # *`&0ِ8$Z՚V=wF<!w.zGgk۟c򃷐qu~@XBwAua8-epUʻ Q^VKw2PW+n ALP޹j}Dct&ݽĵ:u7//3k5Z"}n}M8<|S?] O'uϡ ,Y\bŶhnޮM7_ ḿ^~FF A>% pO߅$x>]#]Gwl,2JnjOQaڠEt<m2gQkkNrSbSB1aP('L>W׽pttҷո _w>H7"RƅQ?տ?TD]0 YZgstat/data/fulmar.rda0000644000176200001440000004143414127330265014274 0ustar liggesusers7zXZi"6!X3'B])TW"nRʟ$,~S'$^_e W.o!bLʪ{>ikyE$7Տqf &9NXd%Tԫ ,^|@z ! GaލXbO@WþpΔքs.Ѯ8QBfZw1S!r݄IM2L:q(]_YX i䀌(`wOq=r"m m9Tl:T=86GZKm¡,Zb,qP y]?8#,Zo4weβCC3d1U[_c!qGՉx28@*\4؎gNGEFkOq:(_1c'v@j[)i&6Qſ*Yh_;xZQKkٵP ғ;U㪊=2tќP9؃`üxٷ0] l*?s%~k. yH@b#4.Sl|hkΏyRYߘT FH1h~I:}/*2!qYV" ko&?|{E#? `Kn7$Qmr_]tL2^gF:#Ik-_C,u׍et,?V$kG,o h<eq3gaDN\s⧏CV/Íf?} MȮI9Z[3jA4e*s57DYxE>7QHƥJsORF@#E9;y?[:@Ï̢ک9|Qr_0=U2dNJ#Ӛ*,N{~ǦCF~Z8z#t \dm l`h>NZG_OoS t}\Z?] uiǐ94Z620&j"nFGkҍLD#ˣNxV¨א X6WjVn+"C()LN7oq=7;m|?u|]MA_;G 6H%-^ۄsp֊jTE0% qF9{<1?$\8ƶ|v:w% M6f@[ߔRX__.8/IkGA$^"!͠-@tQ֭՟2}Y@e>bS6^ٯB1.3dnch '?C+X~$$h"LDج l՘*4X <9m v,.׸.2lyMN6nNcW$,/C@zO̦4eBp'fUyKxr!-@g# nq oj;kM8.ЋRN$`H9= "; %= ia;i'K#YBXmߜ:#c(ś{UiKgeX?[Qs"g׾za@076@U^@6zEp e1#[8Î9}Dk=R"jBJ@RuFd]S=tUn(-:l?upp+uzvB3{>f87 9Y6[݂jG6Aatc3==J BW-ϼ [("T"2jSY+ISs!#rnE|z$jYTOLBڏbQlG58 n oU-L%*jt݀HߕV&&^`C4 5 B 69H-yܒ 19|#Hb#nM{ YS/nF*QH8.HQAmY&;XަȒѧC)cjHF;8  ѤrhUDm.z\_1T/ʎb:ȼ4a? ӿ,iZ6Zwe3,xyŬtHtɨNiϠ>O&P+q=zV׍5x)V2$Y͵b3 f&ck xeht [Ż -ԯ}04hnH m?W)Nكj? R~XQC6-7S-Wn4K]~,<'QU6#7Y?CݛYXɊg`qWUwbF:ORM҅#\Nşе&PJhtӉ8x=m1~R/IƷhL쫏X?ڜX6GrS0YS,PŴ=U HA=q\e?K;huv 8y{/}4HbXfϠ^[~x%fsaP]׉e4]80 W c $5C&wE**a뵉YOrLDiØD4*Soh޷&$5 \zn#p٪գ|".@qjq&0qiXVLMPpzcnnU8g7'Lî 2yĿJ_:V.9<%o|)>?fwʲLc0X/o?l%Ir#1}IG3^eGNDžU#\p_WOKui= x30up:GR }4@6 XKf|5f65Jԣ.!}a}Q~9u s-pЭh…`^rka@+K0t<%kd j2+u)@<)aw@pfp4`OW<ơC!Gt (ǖ +"`ꖚ1.q;]Mût .[ַ[B*CɊ\ȖI(y>8E[LUhaa^L#ywC&OC>r42)6ig^|c%۫ 5L:_BukT@ B}㏘ q~cƝbGS"ǬPC}=jk O`;#ΣwMyC0}(3B|ZY * nqwzq$;5\o/P'J/Sɂh)@IۖR (0׵z$u,p#w[wu܅6*w4xM˰ s}"@{36LOr6+\@<PG7W'#sC!!$y5#*1[mGK3*JpjFƽ]ِ,9G5O{tNh+[*CdAZ“?@K(6̮C[JޙDNk֞AFX^~>?dt 83C$v ı5o+]bT{x6fJӚn ^r2Qͺ S, ߣY%ݬlJlɚt~VCxCmU;OpI.0JfbeK:[~߇5o_wEKԣD#$Yf P姲F&կ8R侐 gux@u͓Va UtO!z51)~kv/՗.g|ADi3~"6)DDzpƬE$D's}n#,ssö}D#wY}D`z[7()}\J'ۊ>. <]gA|C Pν0SXkMGrM,+hF4I}b1zO- s MGS ƸO2dTrE'ѩe( υvb30k:l5)LM{uvTuP~t^?]gH b-><0ĺL~|k=w!,B?ȍb߆lK^Bxhr/CXIE\w 5-"g6K,µgyX[!>0r8-L_3? KT+cz,*f7)DRb^0[ۅBJݞǒ& XKn苈& ;_ :0Xdͣ9YۼP,bfT)&Jo߼Ie^t #bam@Z2SCim)bS\Qi!BX7#63#z9Nj@1)zX@"..k^%j&ɂoHq&Jn\ˬW5SXZđb(߶r|yƼ E[뜴p.Kqa9,d&pIYv"?o渲3/21Vl{;/)}!Sݘ=Zim@Ĥ#A3ņ }7L(IЌEd4og"7ii-C@ڡ}@<4g k\AzCLJhAXXe!yE7^a 3QHʼZy-*vOcY5HU~;lY!Z?!{O2ϏUط/(N.xHױA)!:$S1ܹ)y-1=ד0KK)&BxYʻ7Q0~c#Hۢ>`yi4Tr&A&w ޛ7bZKPM<n3_:ڞ*Wգ0 <;H &P stA8J9HS];!q~Zlp+0ဖ##MCbk[;睼8^pn=o_%b(>=t,Ÿ0`dz)un624D=BWԉcBޕqºGilR_<>bV&EtCOɖ(S=/|%x , Y=\;6;*q2\pW`4EhO.[' hpltjS)~{ n'*eg&q_PHr0%;Fu0%u3tQie1'HsUڍBZIPl82R&^7:Spt#gqiT1Q^@>rCML{CtE#TAjd7, j 1& u^Je)I 5 ȫf&FxGyƍ* 1wۿh˙k4ZIR@hZ*1JV t0kJXCE.N.4kw:=u3HyS3͌{ )E ں`?dP<%T0!ŻeL {)ǃaNYp໠7[SڐFlw7rc>k[w=>\V_;!ԸHvل.ހÍiכΚ#M +fsk)W8XirU=-{pBM3h0{ )ؘȞma_H9;JYU8sh\SmᩃFtf [絘dJ_@@:):;+N kll^SZrg%WaUFΑٺZ} EV*[?tMJLꣿxrZG;_SMxz9lpPˤGU.r!.M`KmS7>ض [4:˓_R\/ҁ[:K@~pM>||,ǓETOgŠlYhl.VYltHDfEt*ey8qX+m/>:q^R±0)_&Ǟ -v&Eԍ~M\'7J?#x{ O~^O C6 ܬQ4UVC0O]nV m"I3m´^DS?qt'HO랣9g|G๒ bV< yn41wd`EBz4΁OUkT{a =3>~\dܢψ ehᰅ2b% k)ak yW #qrZX!g) \Km2Z1xTb4)t;׉}QK`i`%xi@Kny4a? C˩0On|q &25UVNBmLlBPO| _ ŏ>a3ܸwc ;Mg|>;uMXR ɤ>EwT'K ,ɻiX.{hs_z ߗh)FYg : ceTB6ez<Ǜ ;t;lhW#d.%8:} sڒBjO,S\ZKsCA}Of^<lE =!#tXv^ `gm$ݒz)lqb޽%`~gS\{z2\ Mxx;> KyHH֥I.m4<ubxAMN(1>BԴ*!~ܹ*#`۬kj.΢&0c:v1 *y !,"/Ђ[6Y5.\&vXzH)*eCOg.$aQ;*A^03_pIۮؖݻb;=ŌL'ێ.b ~0ք6Z8hYiҥ_wusX] & m_)hO5d]Xڼ~EBYuc'KqgiiWX&' r)o]ۧ{?J$ɓamȰ3 7JAkd6P4oɋOm~dtfJklNL5c;2$5 #X8#(CF:bչSy@K$Sk{=kĨR D(g{OPZwdxK>.ϭ *Y쉢 ĻQ倂(Vau?'*-e2A &VTE1졸"Y7AW@E]6H|(3hu2rG'W&7*qBR+)EZdH'= jX:frA) DeCN(Rk%BMqd#%LljʩΗYhώq۸w◼'PSFAZ2o~{Я.fy =euM(;# f},+eu*ڂi_!)]h"w%& lV8Dh(_Ƿ|p38sf l=k( {ab/=->$%pj'OOH35F5-+mJ?"ɕ_ke4TwUn$d\F]\^X`jBE܂tbL@CV̕㉠7~ `A6yoV{( =]6(BRnj%RQ7a@ӣ+Òd&A^pmp`[8ƒcy?e3U E3ųI 1?!]/5"GƙW2-ʶwcĮ=*7ŹsH%Ԃ8L8Lf;|_!t6wM+5󻷩;!*6ՇфkzeVpIe2aGAYF`}$M7, /ҒNRQD;A/g/"pǙ6X}*?3~x6:@-:Q"g0}ZDy/Z ^q)zT!e1y|Ch0ayèT!Xagͯϲo/ښxQ:E=3;d~;W|@h<>EV#m8xkXI7m} =&'PKd6lrE3 K0*B-f&k[Џd(})1y~:Υw::'ʔuCF-/wl ǎW :;WznAs5-SfV$QsNkpv^')usG_i; +ݤ_~ M) ^o!zYF}*iXDV~[n<r*i9t=' |FJid7}E%D-郔h'OU N~Ӽzv2/ lSob;}Gߘk8wkwL|~ F}![+@+i!Gx/,׸/xńPaDa :;FΓ:'UL&yѲ,{Iɚ^aiq P%!цėXݓx9Ϛ3Z0eO2EoQ7i;-;G25ԁw[6]HXZ?P9^W@%wwF;=aLR󥴲EpovH0ZރìT{e,ܛV`*W W+om\ZslXH r|_$Ku`+0"i\U@mIi^3j#M:D{K⽏ ހ\nʫ0yHL„J;FQ)4Wtt2 Ӥ <<1u#ތ0t-D7@=4m<#@%('?@[L"ȗ^H!"UU^7]QxL*Hr܃{܊`uz[F>c,[Vf КKdOPGIz 𩗺aA{V6uΛ}Td1"76ms|-jq@yLBF9CZ.k:>bw_i Վ(}yY;r3Y'a={?ǒQ}*ÈxIdS ؉I$}2(|lH  jNT&gJN+YurpSǨǩ75;bǝGc0`9g):', cݠ"67_Cl8ݟEm?,i2Ƙ= q) mu`Q~8R>ʫHO1+J-㕔 #IC\XhلaUPoA@ e Ɲ9.:Ow} ѣyD <܄ ~WрB١SƊ 6I 4zܢAycϖYZT (O]& .ve_o^a%JUplتyH휒3y;*íGEsXGĶ o^Iz:p)P򋇻v0PFմUWIqhs >C#+q )&þ~4-PA[iN>;~,Ӯ "b/ӵ3Z"!IUz#a%ۻRmܡj%[(ZjsU/s)=ę%`5p>EcXegJW<~^%#}J$wziO5߱voĜ%z2g4n\z-QXBc.P ʌg%inPV3{껕9&~ys9rlo 6+9EPu& V(APdu)z0R?QeVʼn98peL42p)u#?)DJ 6Sڼ{_Pϯs0e+p$ KIРߑ{rhKbf Xv?, rJi)>.k""G#ԫ@;c " [\-JՋH.MV~$R 2|""21bpY #٢(D/?l`hj%ޒiTxeOX@MɧqLQ Vzu%ݪ#E [l ׏ @t}ﯛ4~.ƒpQ#XT+%j.OgȷDC?*xm|B b%lXD yBt4@ɝmY()? 8׺1&3gBƟt>,q#"Q ^z/j#x#$+8ɞFf>tPaSl3_˝,4vF[PGдFaC1Cv%:L~XMzC_ŒMJ'*n[:r*ؖP}i770º’a%ܵh##@nچ)g] l6<$;;UsjE5 d&':7;@XW~wrt0zسXKjvziOA'Ңj\ÜVBy]<07FqkHm4#$DV=O(%]5l!n—.6}"cwC!4YE&G(u'@'=|q^'$^y^ag%`^aEڕXߚ): Hb#'2oLpC?I^Mv9.5[rJ)x.E1O|- Pld֧$Ldo҄Ŧd N>xcas!qqun$,8=1z2Q,BR@ |5p2T2e#I^.\&${ 2APOH]ۻݴ6x0cF~kOi3KW.~䷥c`>c񙳓Acrg*ܩ~!KHBaºy^)T/:lVc9OAZ@=Dz˧Ą2tZ!%sv̶ag{O,=@c={Lq.j錟fH6w=co{>IdQۘ}=-la"/]ŰVff~}]^<ND`:5oڝ 7nnb$]Ϸ#m)2GG~-C"{(m= mE͛`+i{e/ @d&bT7AM/=d ytv˒Ž)0fQt)ho E fQEZ:| \;wS .-9vK7u)o b)n(2TEpo4R+U(IZ8l55v8Z^lJ*!;~ׯkn.Nt+X'<7H?DlPע@L7k`3ΔԶp熗$BJ 6\N[7˳(x ˬ%G8q߼OoN]ޚ]Zj,8dogGe>䠸IO0OHk掽% *NuH': =<]gZ:ӰDIS%@a8=![MYR C}iO:~Q殮 5/fN.6'JҋFQTҙI:L0 yr.—VDG5{l.=-P9Z>0 YZgstat/data/jura.rda0000644000176200001440000021762014127330265013751 0ustar liggesusers7zXZi"6!X])TW"nRʟ$,~S'$^_ejYs(I9! ߠ,Mdirt;{bM~W(7t#\ֈ9)8WQfF[1 5kF.RC\~!VC@^C;P5R g-tPho4ݚkE$D^|\Eq;N>+xj @= #|]S'?GWxlK:n4Ě)ٯؔP-3Vi UdE8drFz/@3X.c0_x@άM,a47MWQTO۬L-9$=5\Tz$trjgïL@:nWrvkI櫗ϠLss3M`D'!CMeq)ae%EPĢ 4#|$1֔=z6/Ȧt?Mᤚ2,Dc* Rm]AA0>9{AC#7WL4Cq CLR= |=qFl*˾$UA!^颻)P3KR mSWLeD|ZKWC+0;~NiPd{N`Spw/ N Yu: f,6oic8pg[4{va\riAQǀj6@9^|Y"\Qf>ț[ :C|TŭEZqW ǐQT~֓9MuMj}ϖBRgS2٨}ʇ3jR7|ͩ[ Z];$2 nL3 PA(- fUֻ |-]6<&|+Dه۟nBpj ep/Bͫ[ˬ 7kq9WΔ!w"[#褏 = \I\ͩ=~- m^-4<,/:ܜZ&4^7bOX|݂~Tj44刑^ZE6{W:'( &]EU+s7=NJ&@~FrD+Pu4 >ҕ7ˣ O> Ol!3&ayM1m-JQs H~Fv+Tyvu@gKG?umߗN"RnQ:2~:}XkfsTס5YV!\Wh2!poP`՞`8޸K q9OU?gPO^ԏ.!1baH!ŋGh^<"bGY#]c;)er#u`ӳ-/ҫETaP'AY,GWڡ]O 5)rkA :ǽⷂePcxa2ZA7WV' !/yT)=甕(`VO@ttVl{CήHM#O(u )o>s֗Ijϕ0M1"1HApyOveF!RTKS³\_9N᠐r@LNeDBL>p" >_ 㐈^"* cs(~Usaw{M9Tc Es&(\,-5@puX_Xc͹t]?|`S- 03JQʦG5ZsPmbk(ۮZRk׫ʯ`O}~*8VW`<þY9Sx$J.N&)sӺ\ 5CGB[%+T{ YiXUg\,.:Z]roaZ8?5xKߜ&ń^?/:OE7RD5 R~m?bw+u*U8G`tXpް(D'YfH-u,e)yš| &P33 ?&O#z;8['=6SMѠ")m9UZ.>nE rΫ_Lo⇎& RXo}3:k7`R# _ghfuxj4ʑh[i\yYA_b!㪥S5@.W*0P?F3eSxMiU4`"q#JQt^is_p[X$mh8]ܵ9FP`"sn7\ ^¤>:PP|PSȝ4V0"gߪ';ث4MCD:/ιdʺ\DЁ?7PـO366 p: VU-?Aþ 9=e!>[2y"9Uss8J-]aKy9/:pշ}SU9") |H.N5W@r/ds5 +zRXixW1L> {iq)CUN<#Iaǒ 3z=u_Ϣ1F P*0:g uuY G6Xʜ SW!t룾EwO1ɘX#^­pz[r9eOb]b $|=%_Ṅ[r22sZ_a{-WiN93- 7muT(`\xr1t.'&J- ^@j=ׇ7D`k/?8RlB6ӒR~̺(#8 g,؃৶fDڂqOCyH|zBM[x&2;Hl@]OlYTuQ2=ƭ)sdfMg b jZg.cIH!n v_WD, Kbn(Ph>\Ca w3z QNz~2IfJxU֐ke T*.ЄRhQ'9."…/CFBR5LЮz+qAB.˹h>LYr+k2 |iv+4`r%;nv^ H˛MoX;ITL "6&kGTƳ@uE|C363 J:fk7#RS1d 02 !vAUm=-7h ?H83=j>T4#$0./:ۏu;%%L1j&A*-^1s _r^`Ie% 0FSuqjxe%@DNy!] 2a@줠"=\bHB-57a+/-(W4n+"g@%U/L^Pk~?X/N8@1Μ2F3%bطGaUΞuuq:ʮSGv6G8 g~/\UzTnIf~iuҳV \GjWoW$a,/xȩU羴-\ ( Ι07|_YMvi\& |N(:xt<}`Hz,'&w!eAZ~@&oAa#Lk͜(Һ+PTr~s`cxmX$byRAheh?3m6R`CWc%mS(9dfbeqqL. ;#_QHKzK|tm@Ҭ(ơ ?]n♶[F0}iAι.@"8*Gv1aZCV,j UYjq0ٰ 'hy% ^2! |,(>%^B;6Tkː|q BUbkT2:_;MYEoD`6= L7}` '鲾M\MV{4cVH:cYo0_ե qT$@x!c:Yk6|hM'I7̍y]G8eϏ<H7!D.} PRA|V,!d\*nW`(>WYf8IWv㏄ԑrfoDML,mQxY9L7<_4a\Qng|BЕnς1cdR-!vu\RUC>-!E(~ ƚQ _)V 33#䃴>nx>}!-|%-jVvG7r|n\Uֶl"oN DOݙFcT'{}Ki+C(֩L(ԡZCR0톘_7]DpG+|֥" cl{T' ydjf =Ac zQavw-8mph@fRz$W5W˸MJsT7f$ȆMI)8sO޽d"E0x-MŶް6~>(V?e?#7bYDcVA XLU׃v ? [a0(S6-~5czu(]:T@;]j{z H4hNq7seC )M$ic_5]R {%ͽ\jfd,ԉ u>⟌'*P8+T,<7`L/6dʃ!3T('|LIvc UĀ(xR 1Dw-JAs|Uo]?dlaVLaåPАyaNK[2\}!I@2_&\A˓kJF:50/aH_K]9Z̒Ƙ?`Ƭ~v`=5 /˞;?\]6٠<eX+{=( [HfW6K3?TXa,%$B[Q[I).{. NJJ:a q5PUȘfK3+L)7 G%:,^vvt%,R {EP ӷ\tzHw2)\u5EҷXzՐc7݀0EB*iF,̣Mt 85CxfEgΟ9 ڭu!~lW6P?zhʍ(۰:<4,W{SƸ6 Y?tmU%xX ۔ypŪm5Xo~wÐ+'3qGQ{p[lIO\38nC@A޲֊LF>drG29uCp1G t1ekƯLک 4lOLۥ#qK@͡P{J OcfU.lL"ol~l {t#p@ 4oF>|C4uicqt]{,`WGQ. MckSƢ;ٌǫ TTF`O $,<3hj.!Me3Ts.Q1/0@3r\s&ϡ 5r6lxU줢*"<;v"*O'G/Q)߸'N"/m.G$E^EE9$DҊsƎEݐYAì*n ѭrU y;lrhHQ޸`E.-ZDdy;hmaW4Qh~!Q˫Uǔg`۞ƥPR8mX5koDsw[@JT$׍vQ \Bqۡ/a0.r ۢG"0Tc/>LqVSKƣ/:-ZGoP|뮿N3H{UmIa X}`gȚ9ɟ*A"7!W.G)3[`7;дGUߣC=sL 1Ov~E,H#3{dž93XZmuc Ϫ{Eya#]&kl;%aM@EY=qZ-h=bo5 :` vfFEpriT KFvEH|wB%df`#^P.\"Ѝa)SÞc^Ow7y#<>2(y˦n.h*vxi/3>ᑛ B;۴a gaBi|NC 1l]8"@=ۡSFgTdz+~ۏgV^F^7C u: ^Gl-H_wT6h:#X(d{bd|#FPc;%MՕ=iݺ1?K; SMS.S5Ճҥ))d& 8Gi!_|.j{caXqq|ѭpTܴNлDL!zfʯimS LH,YHGf{{W~HF?)!Ͱ(Gԍi>Eks QE/n +g@v=Qfa)B]Ÿ&޶k8 >s?k`5 \Idk_ss/Dd/>~ʞ̑TLJD%Z܀??p_|0[=֌s-(R|e5 G]JACr56W|<`'Hdw_ s6+e:{Zͅ*oXmZ47E[$<_=B`?NPŰf!kks\1?4f@X@x31#8K/lA8덑,Ns4-ڛYQV׫#ϐdlm˕kޙ0y XR$? ?TR?|;{ E;'i-e0/ T  L9A" bB a=+Rx>T MJ_f )i8v`_EZ]A*QR\Tx A۱9@lb|ZPz U<~'K,-cM"tMj-ؙ(3'F[".suԥ<.m/,[on w\?~;s) u x:SQUjGʸS@#qwܸI_|k¦.MfP`P~Su\?bh 6 @f sMRSWbĚc`wҨ.e\r ݁W-5 7ܯ̐Ej=*ms'1sWgړhzu,]e_OzӴ%4S"Vc&^-?aybpAd-9*HcEbzquϭb<ΛӅ5I4r{(2~# Ofi4ܪuhphqoD#q4%/|蘱ؑzZ9v 툱aZq:FBMƶ͛ O^z$jծ lT#p,Okae)SՏFɂGv/'eBqovG}?2ybN6,i,#h[ )@E.FY VdZ3gyRA)@K(5H1{vﳲ"?q51Hq#{P]Jwa V gw2Zt^?(̹_qWx_qb4T=)ǐFM(_юc4L`KdIZeb#+zU |֦T` 2jT2/s&=@@>F%(6r>.y-1ݩ/RFH5P0 [ƧGt1Û=U'$;~"#4[%)*Q;W au^*ݳ'\z} ]fyjD=,ͼ!`hs8hxtߵ)A$\,kh4ژiկ{COTi՚k@^UFlot&٧GOͦb'h\@fX~6Alu斱Tj"߻kpyBkd([wP" 2%?'KWDص@6O?ćY f&'or>ן"/BVn 쾌MT14.w w@$2x>S1V IbЕ1f3oˌ$Cne &0=}1ӝj*ՖN |qy6 |>|& bfڅ۾鯵 +5 qąjcM ]!B69)K国ȰA8he>Oٻ/3^[mJf9'9]7Q.$/#D쭴U\$QCxZ=?}3),$¨3Ņ4J(,9B*ELѣpCҭrſ6bMo $'Þ xl;ßbW=|]i`Z9WaK=/`VIQoQHRdXUW~glpF(EkU)aw$d|[ۼ !cb6|ߦ,N40\lZ_wG9$P̗/zd3@oFҼ6Q;ZL.hKW$4 A%rx];s H~̞t~$lL< gyZV4~n=m[lZT TPC̀2TGҟBIe߅͙ѢX 1MYo|xJ?_GU r}>27wqu 9<[3SzV+EgK,# &*Ba@;4HC]>LHg VSݭ7𔩡lt_KE/#=Mna ډDD.PH-[1DB5OKC|1M`pG4LM'쥇PDn r*꯲s>+Sor> 枴' xx_آk9Ӈk؆s3 )YQՑRvģUCK+#Z3 z ݟ r|k啗<[ q7k- '0Y"\)/j~gKvY#U\"bߓC蛾 5@Ԟpt 4z`SDTQ~ A~<|RDb1Ӧ0+'Ϩ--jS b"k x"@O aÜ3QjӔ^K_k$t[U"i?AoQٔr0,l%(Ír! -q G{!T@`Jej,D)Cf-O D,k!fKw:&҈.x+7*wz0Aڤ=%niaQW{ df/m|Ah? $|Q{xC>ԕĥ*y#Orq[H`gCM3AfN|Г<a=ݸ}PՇ=&v6g6pWiD뵗6X"Xi5Z?äӐcwhje!Eȡ$QfGCw#VΛ:8T;,g0~;iRjrXFSt:q!! .6=;@] Nb@4] /'CO÷TL:aY(!ZlG5B6l)lW'9"Dw3h,ay~)yoRE(2OK(ise [*~ڡ9F3$<\=ӪEfᶈgfV%UV/vD1* &$lgѝ Un'1yٽWag_^YFK~/m앖?o/6g:G!D‰x4kȟO6nJ:)¿L?#]a}^/10 bW"-pO9o*}5[ީ(ɚV8p; Rɴ2^'hht.lZ$1*&^TU ۺ^fU O4Џ;kga9l ςLjnz&t10 .bs"t zEGQ p]_ hHi_;ŢμeL`s1~k 6yc[K2)~R\2nTNT%j|g7S_)o M=b?)w8b6jZ%1<^Rm쎜 >~1|%c-?';QA"2Fٞ~|n/ͨFLx_cy7*:vbGoвAIe7]L2:2[: J^m;z"}l_(Tm\<3^nJdfq"[g4M6 Tn*RQZU4lcY79-C0(q\;W2i/JA/ὕhwiʼnЍӷ?0w^-v){gEI'-eEFr +Եޙ  z; Z[!nr}$RkG^ |,IvU.WPf,C~Y6=Hn}-^XbrWkyHJptT_ӎgsvz =N7xz˨6T0͒^0"/> ڋrw@V]=(v)pTc彰w8`! Qb+e<;QRТ5SC؜CF^{WϾwuY+mn`w`Fj2vGy߮Zy݀L6(z{ng 9·O!ξJP~.ޙYFwɫBm7^QdXqr|ظ{MsTivSA\/]HѸn-Ew"iB5ިɐ>/zV;927r w6z~6 %B?l(Zσ:3B,tk\BGE'%]aH@j':!p+,K^̵/.ޮ '7=/Gx  Vu{1"%"hRQ2bABMJu:uhE7CyXII9}W/W8.ـc8_wN'o⤭7iPRI(Ӭ\F:Jb`Xi! ^r.4(JODbSΥBd#[\Ap~] OK\k3c UTOx!d3L1+H Uіvy+$V#Yn ؤeM˯T rg5'{͚/+Y*QI_m~$%jT$*tGpH<8BP.I7bS!Q$~ ѷH-bFDy+H9_Pu+mbw|LA^ aB!u4On7"4  Y}f2-(RPou%RNa:5^,Gc~ = nngg}A()~]n[P1Dczoq0D1uS-FP֭퉡|E`>3&~n 7KʦE8S)#lٖ=Y0?OI}N?0@FDQt^;#EV67RD^l,jY;}Bkw:S֢Bs! [Ԃs-vٛYC|H:@%{gUɍ@p-Dʑ,Q]pl_qRc0%q$3T~ b}H4|!W9̇`q=&[P￑wdԤ4qLYW #X*٬Ujm+V%0)@f%h< 5Ur.ŠhW0Z%o%ĵyZo=&_("\ejDuTI{9zwȶ/NIKmpSϞs=w?AJ?5E2-mɕQM@ %a݄Jvx> ݳC]yٛJ2“ t .eJJ nQ F&Ta{M{*bچeg'kl&OrOxͺY+P (VOS'CUӿ5r %p/g h0þ N=C^j|ŢI(KZIƸe8wˉd A19p0t;8j+eI%Y'jGװdLvHyNDGwt8NP=cq^xY[Yŭs r6Ý=!^$@ʿ=N-OZ~ wMnT \٘-؏Xx$`SI*V?hztt9-P#ֆcN%i* c(]H,/!IZ|m^9$Y,:ۚ8ޜ+8[LL k1]E|_zH 0`K["ol)AAƀrM5W,5=UЖMYLXۅ UWH\^δqv9rn8LO5HN+:E*-vWkY`]eyktk5 C ']Φvzu4x|styOE/W.L)jNW,v>G?_CF|h0$/rA>^qŬTT޷#-Eb3nDM y++vgmU OKy>6%ωhPԖ$)-WqlHp 2=o>G vyЫk%Wq >F~SAԉj~0@NRWF!&ׄ+g6+G0[PDBߍ]'\=+nj}#qA}C텵пFyt$Va(s2)9~P,+bQ_K}yv;Q_0pI%9hq͓ >b `ߍd<غ|/yA,x__XG! ceH[& ~E2E %ҤN~"l V٢C%0,0~w%ыld?L+s i4F!)Ќ|aw6"ׅoC= #Ato?e.s +c> 8XE˖Q@/s]hw]EI5T>Aj#&Ink 9Îߧg弩κڢjAEB`J 7{jlTOU0I9yٕ%Oڰ FWUܦH^2<;KɎMl.ު_G& ҭgڍܥkBML ,F/U A= ЇzdGtZ:LR |P6-S\&+F b652CCz٠1WO)<*+y ܶX(-tEd.^[ =R}ęZmrnA0} 8{k| hy;l#l`;r,hD3g4}q6CK?* 3l*OJ7a~ˠӰn s( R(S!49@(%(YK "MHu_95HhBGo楟~ mm\ghIWWyckEӢVD3Fs(45k`q&qt oϒ8Tкxkr)#H5 .W}>E{`h{iͭ)3V?;yߗ,iY[jpHb&W$COvR]S\TбN JSV r=EJb^ϓ&uݯ f> 4_zI<,U~$_+|bFe-!6Вe*ʂDXɥ AEЄ=HT}Idf0T6nEQpyDD>}Ki4_Q~ᰃ[Ih7=)?5ԇs&.'_{EI+A; ʪ$m岖8;HP{O1zj Dpԓ$N7_ĪKIiF.aB-US[N[TKG͈E_L]LmpԮbt\/&ci֐Dh׿" [5ZL9f "c*#;].û$oFrcS^S!4\k(T( *hWxy]uJv贘9\=P|ЁLKg.dX1$by1'}񙶳<${}`6gyWfB CYϿTۮ`K+tKH̶xEіf3v=܁ЦJG DRh(a#dEіL1jWC1Z*>-LcL_5oQМC@FH ɫ/jFN3Poݍ8`th/4,Zz&`ގlcjӒo,pۉ "r~rN{t*x^TtEIE3/ 4f;zAFig#貴Lp/6R)k5| *q8Q23vP<!̽c^ED<@ `e>{LYz!XP:t3[Lx e1%wι%=z0.dzv eprnַWu <8ȟ=ӄ@|E&7\*a|,S~H.XndTwFA -#'\svK Vf<ٝ9#D|g7ViBiXJ1„RZ\鴈L=mX8P6#Vxz-a~4)4O U tP\նS@_: -e7 `ш\(\x쭓Ak [fc7 9g3 +ֳ`ʊ@Oprvqj8ZX70>̘9ȍץȻ 'O2%0uvcCzJ?Fa{okoCƟ@7v +{-T r?"XT8O, Apتxd+Oaƅ,MNtF&I]=T׷7H[E葇o3pYĠ/]*auعV,Mw8<%îh{4 F;L''w,z˙W/nYkkT֑jdSFJ椝4%& *A7ͽ#jKai kFR-`1>|/ G8tPfA p=6Iv8VL$a Uܔ"vHk S! h$ĦҎռ^>3F;ȟg*\+7$AUuDGsVnfo dAN"<{7 9¥@>VέӚlNJlFqiN{X.&q8л2|"1#,q!‹US0 *3PG#2kT/K1#w?Bgb Fӊ5O|3{jf20;_3 STN_=v$C:%Gm/z CiA0_{,] d9_IoTI9Q@ pcv#3ĵ9_[f'ꌫ&ls .Y2=h ֆc\^[ar ZVs{fvGSx-F|Dspxx@".Mj[TYyG;EzcA]-)}P`oZiQcň~q!"D4eG1*7n.Ie1oIu?~cK.Iު~y8E~4pe +ˎ ) C,nRN>OpmNH8hܼP ~ܖ}sU$ayvDkm3A LCԊ>l!O> b5_\Bg<݋aO %kot!a[VV~q.pJїaq hp* |<Źik3m/RyhWkWUψ+xq$?cָ DԿ2iozu2N%Y{{UNG1qۡ"O<|l$=EFB؄\o%5՞JYVUK]8KO]}DJb812`>VݝO쇭*NA Pzu5$JXe!"Ky5ibhx63 JLRo5Kn{2Ѱ!>CGI4V` ~E96SNo^G&/`kAg1le}7zNj;|*Q8.h#Yp$ $-jpGB"|:|z|s{9pwG +s߹9L -K<|e~ٛ&X̨{掛 mli#Cר0/Ě>U,9@lͣs w 69y'1lzedsS+[JvWW' )ɤŦJnhY "<Vt 띏0q:&*덳HUHۙ@H+!xC3~ NN-t:[#aY/3i퀕$d-AI92F,gz*@94vwD$."; =DNt`2gׇ Py(vWRt-gӺ`rt%Cԯ)MAyY6T|jg_oy }?v8OMR&>KWE)l)Hp\+QaC0,ҕF>%5m$WKQMv")7䉱_C|UAǫRkRN6cӇ"Wuﳕ!4&SGjj,%W0Sl55~0rV_3؇Lmy$^p9̯߾H"5@lzKA%g` 3ΝFFWkQ>DtК⃞(90˱n뜁fMjؿ"d+Ő/ ZNפ]3wI=!͠. &ZsJԏge=Wk騆q4Ȍ$rza>r1ϛ(Zvf[a59DBs(wLyG(BU>a<cpyo=T?'ڢZ|?@N,(b SYK-RƑO՜3emqH$~~a"$Z4X%܌"mR<%YN1)C{-Ǒ묻룰SDgfH,|IT@8~WG JU%**a ]6Sf E= 'h%eLI{9U*)zH/LIUhꢹ˦@"4 iߌXpWT/"%y>᪤$SnY 0.VW/]&$WGlQF|C sB}e| B%LvXsu8~:%/5u r^YF?'=IYϑ\?0_uQTYlڒ_-1R@X$+N!q2B- 5^2q1>:'{nתFao^"27t}@N|adP5I,$[@>HJA6PBO? ME{jY&gMsOI.-(@j,G@T,Ο"LJ|6x4 a&li2Xiݲ01e4UBKk Ę(>)/'OHB~!a4CA4;,:5k.F/gCQhVNbyAu$x)Sby _ޜvJXx7>OxuI\^ٻrP =ǰҼJ`줵kާ F$/φA D=Rڇb ͩKDİV׻| dh0W Ɩ&QERn<- a91%lΡ: c"H-HsSfڤ@bХ2 dGho_fvLhsd,a} ^fͮP삫ɬB ^/ V愞 ~6'lL*_Gm5_qh:u_1O^ 2:P$ QмO6^"Lg ץXkL9$h_%m[H S: q76RǖFfi5E*o0̓s{gȝhN f,-旤%ucX|\ .D$`۱:&1y"m lƯ9 '_s kC7\ɭ2~j!Ǒժ+u4nTJЁn~3{ x Z'ەwix 3RYC"{@ɐtݲEƏv <7!aa[qQ;xn@J`+ѿ.JYnQ0H۵b!.<:4Ro&T-5ʋ9k@uQbug=PFhr lq J+2peUl\RpSJ2 FokU͙˚a?(RnrB%1})_q2jPp"A'J$6 J2t vQi*tߴ5- Di ˿jQf=w'Ac5eJa6QA@lM_Dy}_)!Un_PC R]ϵ=7]!lStxTCIS#Xk֖)hZGA7 `d٥q3>")ǥ:p Wְߠ!N[G WVkz'Kc7GZ `;bmfibvn^7P2g ~V=f8ty"j: q~YNE-yyjƊRI e<^ܙ32`s ˳U9B ZB&{]"P'A\USr78}V)#RE$+u||gyZHrBXgY3I^`٭#46; B7hiEb)Au"`[:V)vaZY&N\_sv3+Zu~74樂Ǖ],V ѻ*taw!ߴDFN=8&J:bD{*xұ |܋fcYx: $ʩu:6/iIVY+txטHrT`f!*꛰dx=J߽!9 wO30jgLSIE>4{?=Rf]P@ 1Ww ˻*68ܨ|s £+8XQҚWb2plΞΉ&Tقj̻-@R>Sf&Qx5-[hHRxI6[ 1QQQP 9$)9Ppy~meG;[?)Y-PuE1(8K;ڻ| X>"3i,bd[\bijT@~*< -ŜWҖ8G?b7b32{XˤҳxqR2cvO7~X8!$~lZ9^Rڌ?թ:tA# ILu_otpfn kLa9YΧ%ŌּrsPћvHG$.FB7"^sw܄Y}d qX9iD+S4TwtbZg(O}I1n>b8Y&eҼ~{ޏ>t\7Q  N>"X̊ey) 8l'{'"AR 2Jkc(9?(ܜr`)M.YC0tmfTF45)VӼ/+Las<"dl_ԝ 6=o&BGmWK2ZlKDr3#Fhq/14#Gy Tǚ 'WCAE5%@O^5~%ึAk~DasCXQ.wL}$?)$*qT[ruUZPˊq&f(KV4KtC],`]8I>ݘk׈gK ,JR9.W*瀭n9)%LW̠ r@SG@MR;:츻_-9q R#t`R £LUJo#1^FkXZEGPcI%miETs ̘% Nܘ~ǰkYsR~%{c?Qk3`8KŻnr1eW]xۙ %,o5k29UR?j> S/!T;|E튗#b8(q{W/t%Oڔj3UXgV>K?ԡZu !hf] SG]q^pMt_ usn|\cQ-Qvj2> bw,ɏ:㗌kٽZB& zc0KF.vO4*td ]\ .*,9ijw8=GӧuCO}OZ3Jl™=zV׉ zU(V}zó;똥5FLoڞ5A%NAYjpx,m_[k@ 7 CrXy~A @\K__ֺ gImSEhGJ3,3xκ1m i^Cw0~Un> ;*k1{(P~wP:J %|. a9? BFjMdHBʏ¨OחN/ϐtJ(}߁` cF?N5qo9 z"$@cUϸ]((z1vx42ZX i WcޝP@Ş~T)tw_{ Ívre޾UX&2DvKp ShnC:.'sF\KNll-j7v%v*oBg` ^SkӶt״2FD 'v\U.J;W5wuR;+6_9p(iNNT&KnwD*+j6?u c]B;K .w Xb.oFƲ/(!G(Uݒ,N]CLF01$Ȓ1+ ?2mn0 1]ڑL2{Q`7E`߶/-g~/2Ҡ=0n&;&Ň9Ts":{=*m@{P_$uX:nԛ &}*!πov~%[LLUChh57#˴)@͡Н(wT$6B(-jR&}|zynK6E >^q?)LINucb|~&;M K΁vtۅBr"ksG ŝ/9NT%eȄEqOg0(qMYsa:ر+<_;ʔ')}4gxyܼR:A`2% ,U4̮rlF*_dGK;ltVXG`@F$c_R/x<rusTT{ee(⸾P1&`3+߮q(@ox ه1KЀ_YG8gɕ);Va톜e.fj^ akR/r0Y!z$;s<<)p]fHW[~&ƝY9:$ S&wyib0TWdw8䆑b{YG<gj"gw=>ycΓ7hڇ HЩ=Q\-QKh[B@B.ۡ,e,svM|\AocSFcGUڇ@؅]krd3GFpBDSИ뾊=:ksL1ecWxp_ 5vތD-@9A8S;f$x_5U|ԫkSׁRS9vᶥyCh+7REؙÊFp A4|kI׉>uSz#`[,@uaⰊn qQކБd13 e!Kwu pxܚv-QtJGm.CЅ"[|[atf(pi7w71e+Bz۲Sרul4CTqÜ #[ 1dJO+Mҁ%N(JF(R݁7 nJ:tݴZqFˑ#“}1ErXhu.I+]cy' +qg5V%O`4wuG5v}bvY_E݂wAX$҉r˜8.~]_k_IߖcF7,5PTW17VL_k U9viZI] ήV&u?NU8n,5 "U1g69-g$UH547Lkd'3XJF+l[]7XXgU;ʓ ҐMRCjM/@Ww f7`ߔ?1 Tq ̢}}"r_})mWu|5J TmPG1@y֚u!daqo|e6^93u` ٘7@AݬԯKzEX5ZƝHdEw Uudd{cl95QUOϟP^Jse&Ch 0g󙱽1ɋI/Ҋm젼/za4b`9ETr*Z"VGK l]] | ˬY9lH;'9f~y]l>|_EݚB 5,s'ӅDC1 Yo̫_g` +8}i蓟.q%}SB@5_xJffoU|{X\&C#ױ{ PeJCQ9w֐R &l[%tBLJj8{4a߬ Kui;c:?WxT0Sn (Y*Y6˝P 賦jc8I4'Q%#.=E0l{ɐa\ }]g ɍ{嗔o{,o Tu)k.d\bAoI!YF7%ys3ٙZ1Yt,$5wtrHr#+,L<{8o.JǢ?|俎*[D8Wn?Ty$g9: g epAW@Mh)A,\]ãhF>d.=> _Xz*[ ӽ,m@ZhB+dư-9Q';&7# )M/ucŶf[nU")@TQ;PߑV ű#R~)Э>!-,:u¦{BS?-{^9결rr(wpm_)7jbcG2Mto Ԓ3Go/ ya$r!-注צJ93 ^kGoFXk,WqaI'\O#vH\Gȋ]-B!EiFm`a }GI(KBb]ehȌI0{1Z.[ZLFjW\0X2e@ 7={4d}w[S5/zm'Lսsc4$TdȔ'08wHi qRuؤ3Ǝ5|MHjLqyUR+qߜh_^"Z! oIq%DiX'$ $%k6jyqRZ ldk)xl.o$Rg8%rIO#}s5~q0hFPf<_*jc(;:~?Y;5O`u؍I1;]k7 Pap0Z/0 p /% ~ʄ~Ea\" R&o]ق;wgɘO{keR:d߻bPAz$F Ny|\?eWNU艄{]KvuaJVϙh0ֹoPi0 JeEe7% ru!V-o*[J(:$'PSA.]phjUeLŘ1v`ɇI*0BJ4P-v>Rg?u!}NN[Z+vDGp^2*5JaVS\UeRǵ#OC2YaNc<3 ߧsqm",#05n |afA#Im~KmxTf&F:P1hKZV*4Ҡ#f sYu 1xUřx!6i #2ێbxN̑eg~üOiAYaώm]&So0`DB#n HcmuL&_@Aǯ …,AWDa ߽Vc { f9²WZx*x{0au:# '_fdse3"HsAaQr|dwjڐbyb#)k[v@u #Ƹ&jvM F[!1zgZ]>D#XSckt9j!i aӜ7f!Z p" #nG쌯H8qpZ_-_o=WKݓ92Lb7kSI[bgN(m/$땇*[S݁^ňs }j?|ƥ@A VI۱{ptkt9w ՙ2Ah(2\[A!a:Ȓ0+CL_m=zR.rjWGۼ]rFgPE-80+_JqXOg@xb^}S1wzH-m55R>N˶ Ԃ}sR!lHd=4mmB>㟽sXc$'kڮ~ f'ݠ)> gDF&$ӂwz@j"Xoؚ:!{m!T́u(o[돸!q Q췐_хHh޳@UgV~ I Sp4DӋB\{r+F|D͸N.MTZDWn M:ixtr+jbO{_[$9qU˟&uy9!ߠ̀A݆mԅx}oD"xK g2$h^Drx,Wvb2}RwnJ-`Q ꫓f7.Ѣ"󤞍 ןԕƮ;>:~a aMAgܫ9PF+p;'q=dqU?Lc{2@uzZVWDbCr+FU2软/&H2z69T>J`O7P=t|^ߏ L׺b-o?(=@) }xp`eKMkHeI !obKcs WTϸUɵgX]&̞ӻMEۜ CiMΘE1'+ ޴S{"O un͍UiZ YtMw biܒ.JҞ9/*Y:#t^0W A4dF0P*s%0Gݿ_,ZGvStT|Yg6M%sb-Evf{q^2w.oy:6 4*&r#kn<]oD\ǰdj3BD{Dw:Ϲ<'IB gܾA|`g{N8",E8s'5񬺫]<49ݚJ=,}/6%oHZG1i&<)n9 捑x3qz-. b}8EhW,T=Kj0ZMoSGC4q*VK—#K"2pERn~d\3zR _@?5"C"jO2՛'Drd@Fg9͐X=stoEp.-kJHWMgi?]JAckn!t<-÷/ELq%۽똭A;n~6@ɵ v黦\vS=6KޯHmPc`"d鶔ofQ6Z$fSl\m mSOM3yO"V&0菖Sbhj3r_:": ;ϬTE轔XQLlEvɵ/dD|RW֌InAO B%H2><zvoO]z!.!Ra4!&||Xq7 6zh@ F3 qPkPeOJmE[닫b'ot9I#FH,FXUVcÙaym] yR9Rސ c~[,w/zV_x\p 씡3lE$JJSal ٝ`ӌ&c2bHqဌҐu7;?Rj*JE"+q@@P)tPs;V Ժ;R˒Y>*U\y㷍pSî?g34\_n'E= a}!$lj./E ~O}yl3¸w2׷U>By-*h =@?X0NCJ;c;YhO#N^]b,U7Vi=+l4$5vKtF+.P=3W\䡱lrtD7 w?FeT vSmG"[h22_ ,#n_]lԌqg<|} :2dɣ; Eӂ(@`'~+g 2zmCm٫7͠]wI m&u>cXyw[tn^*)m]f񙡈 ċ Iiwr? Ֆ, '!j5hc@)Ec]{!?"kLm3,)#/8WO&IUv\ɫIWPT hur$R;6@w_p/G23)`_"0I P,ae`֚03^fվ[*Nd>#]}p&鈰 -ss$5 T,%^29p-Q}pG_/M`pe8O;>ttCDiCo4 4lK%k6 8\#i]4$9SJH\m.1Us\QE_n%!w&ModF'Sޛ9s۞!)9`*W̤A=!KɸNy);BEWg1 ^T/oi10_i$Tܐ&3-dMt"X"lA{5/ȹ E?,) ךe6 2׎y^tщ@f6 S![,mCO_ʓ 10=0 %MpE`bvC9}꿿#02-2z?C0%1jL2ZHEˉ_]!o7˗9XUgaQKUA7CX&+%Do~fvӪJ5oS*Бhp{6! Ntw= 1v~slB.A_XL[׈Ii0d/ReH{5z,sI&*vl:f{+7^K⧋b ~WdQMQ$ "td]-r7(NM9&uԯBO홑qJ":/['ؼT:H东UדFʆj3t[U#l6%*F<RX5D#ݼlJ͎CJ##ȋj9-Ot$;טYN?g94rX ]歈Iz׺5uY [5=ڔ(0jf=xX>.rC [sB+Z14%>Ct5j$O4P~3CQbwxqU>X8.prZݮ= aS<}M] $ONnV5~G?ϲe$=œHˤĭ5.rƔ׼)K^mOy١,$V! v̀i UnoNE:'4{8!贑0s@0mi<$~ 64g؊h1_f~$ս7__jr 8/·V(>Ny"L0&{@ǤuzG4zW/&nLǻlK$v1em$;y+F5҈:ڏJ충(*LX}QNT,H9 ;xW~F^C3wx_Ynzp!L6F<ALJ(Ob ['uZ)/=F[RlcZ/Dۃত#fThow[frqHg.ЙGZV|Pu5(. CWgrd5T 35j/Utt ˜G)~WӒ?6֊OfVt>xۡL7])O^-22 ij5vwpS4oZ>t]dLM:'JÒT|jrΜmb[ᤙ|T{% /*oVli!AutnQw@;DKvYs0! s7O1*p[Ǣd"}6>[ Igm Rqi9{GQXYHUBrʯJS z!_H>.n(Ԕ;C| O]fD~U'Yf$:,kƎNO%4 lgv9ۢɖ\ST&\op H2}r%c͍ƴAaޓbdqS 7A۝(̝ZgX[I32cXC`Z1>FELo.'EИ !~ueNT A/aC,`(cE}`V$6$f,m8J|'~=xMUeHATUb;ƪLeFHY3B-°}݀]fTaa&I94m?֏iZOh]ƒ:9>fÆceqhU5_.5g%_jANs8 ފ5klIPJ9% O'!V'n8/{BoeA5}tشx( ^q,1OzB+u{pɎiMhn^k ^E֚ tU\[iF7?#I!T4Mf~ҦerQߡy&xbM XO=Fp0ljsd}˕L2}Y~z\¢.v4XW2/v{ Nt9QwQ6c8 MOk+Y&޶fV7;%rVLc9$ whzh)d]1@V"Z聲ѣ)' o&"n.ye?^a9oKIy>lH7# kPx_!D̓Y^eTk"=CR*zʹ䯉߾r-b©מ㌖5yX.5(Oœ u t0`[;e%(Nf?yMRfC1< ;p ҒW/ W ŁAk~Nߡ* vN&7Wi#}3)bdރ,!.MAwI7NʯfB8>)&jG*7 r2{9 *Fʝػ̸δΙ9 xOV{yЬvuem?ۂTڲMWt B㜙j])&W J=eԳR2w7ods 2W{-  X#i2[%!u:E[.;P+.^]˛;'ߜWo& n(Jeq5" )/#M\|XpLt[|:z2L R|2": 6_Sw0gWWR=p|+gCT)荍9~S:?_/4&v^_hxa4e#?o~OScRo'pOO[iV!JC͜Ա,:dG͉ e;}UXQP밚2a>}ݻ\O烝m-_^B헹 (e8p;fvY*#>4qô_OOĞu3.ޘ ݆HlGEcTW^gH4@Y0Hq"~M$rEi@5±tEa5tDR-'U];k @C`9QSe$|f"}W9K#d}uF\ 0Ċa;dm->1c_JŒAc1rЙM^gڰ "=HUTۼ*6A' fo)-mMzi" m⚤ a !K3\&FYo"JdRilګa%Mg]7r]ۊF{0{tze l k%Q [Jjn+.DO`B? 0ThRԱk>SRC Ҿ91|'RI)y>C%`5q߱Y2cA$[  ƶ"H-Uhx_w5kE ^V*s1*:p*& 'j`9F*om`^H'߫;s=-?1*Cw}_խvCf:qMKX$f'˩QqNi5}hsMZݓ`Rx [Y]!fY=V[+*Խks94MR(X Fv]N(wړ-6w4Y]B Mgdt]ڨ0Ers)YA1oˇYTb9-Ho`%EsE ]J|U eS [tS&/(lu8 `6& G ~ gީ∥u gH*9ÿvvE#)5|siv8LF؈Ni Q{'/Vz~*-e6nL)9tr_9ڌ0$|ȅ86byl46^cM^8"u[#MItQ_WՐ?RPJ73 Zic^cTUʴu*T۳5Mnی2|Vd½_M3V䉩q\Z0@S(X䧻ֲeҹYd ^ b$ՙ$We 8=nBՙ=3l me2,7PJMN[_ 3*HckrG%3ܣum/yq8~Ȉf86_$y52d 2avFX|b3E?D/S4a3PlE5DsO8̀g HݪbXԌxWm|츭szspͯnzO)y-T~J@Ώ)qۡt\V҉W u솒P id ʻ$H,^9א@]B2ͩ^ݚQ xTa{+oRgˠC:< lǙk -ֆzs-Slr :ŭbj6`?t/F שODB>:#bij C ^F:|)89>[B(b5%oZ@叜9u]bt² ?X-^3W C[_}Nr0=9W4o|SH' RB&Ќ3. CKZЈ4xA5˞ %U>(F1`cL f 49!~W+H|X m6I5 k̵Y4=(Sx?7YB쨞UU3qg "8gXTOkG5AeuQ:]\qpPF8 iAڍ1\@5z$t|$kIP, BY5΁y+Oog2>lqhY.'i/3>aމ~1f z?;47s^0GLEL-x )&p?.S{):DPdRML"jA&cX`_5<1'KK15o!Bu*񺦠2y mUZc@d()]v!R7Ń<+s}_Q_DLɷ@(-W\b/l-d!49 +5oAf a˸liNDL _t;Zlw!<_>N PGz!;D_@|QeLˤR7Ra9HyS'v!>CؠD J.78VEę. YEօJ^#PװCm7XLqW]{ Cs"Y$؋)!"~%YjUP&y2t8 S UG=aaGĻΟ[d3NhS]ϼNl68|Ji wˤQrE>3o<_Lyp"9Gly3J].!B@؁sMM鉂A1'?Q,/X3uG|.:јţzWmae 6.z C*+ݾE]kkV[4HΥ#޵ta1LV`@2)m'xy,,H*.cz.WE@%߰Kަ 6aZ/-3v_rHn#|X)=g F,/W!X|v)3В%?<-@j1[i_2Dt3PTh=f9V!-ϲt-XX{0ٰ:/A? X>j#>Ϡ aP˖&в#[9W,JuCL^;lOٸQ!L>Un㽮t0s?eԯH_["y-P U{:1 Rtm 2cX^c2 1\+̨[ELy, /[yK'pNY||āS(2*]7(8݈ ^ IyXDAlg6z%rtȑ dDN84 xkFڳg @GXb(e%ÌVk[U(5kN[2i3R_j"AcF" A3 D=`L%_>QPQgӿh\>:vɩ7Djx8iL"}+p8NRBBA(jw}+oAoJNH_:x$)}}RaBvqS hrU {rbiNN*M ΍{;_3XlW\< f"ZFpp^}sPsEt.Y/l2:Μ#a{M03$*xFYl~5}/} ݨ`"AvF oW(aPkw'!:\D쀄#UhS_K=lZ NĆYPޟ!&qEɋ͎L=C76+&r#N(vGC-` 4ѺҒq{.t\rcz"X舋u7> 0vpZGH8lCsX ٠skᵌj܄(w`7?y?zh"TO|:R~kUa׆Q ԟrKt`J11,L(qnгCx ")\ԍ'bcwnSz.8xfopn҈p@k ~DɎ˗|A}aC?%V~ױc%;"hw0UHNO/9}p>MEQW  3Ї$xPAiw?H)n3$-ûĭY !I+ʾi }a"+9>W.AjnМA8tf2֮mbS۸㮣u@, 擝ry`hFߘ$.}OGy&U]#&aA/c^ n"!=5l&$uGS |Ks jo1}/.e>NRMdrL<_ߴ/ZJC ɜ8/F}qY Dxu |b長():"qnR$7eѿoZGG2V%~Ys5CL:Ϸi(\*o|g9/5Tgn$Nq5!:%N#)%utMϦ,‹I ǐBIlpL!xrpo]8W-=Y.k _#NPΈ> R?V&/S:IRˋgMq/)8 Aeqս$1&Zw+)0P2vqȷ7;vK=?UC`tt ! [*ZV aG<i_8ߊ'DW6JD+Ӭ7߁^z 3#h\cDJzNhSDلk1B:TGr#"QF]!g\}bBJT=zIzr"[&TT"a(0%c 7О&. k7jjwԎQx;UΚ(HJ1ޤɕ5Q5ל8!%r'[_3`D.y1=_0@L o6Y7͙N彚9+M'V$Z<ѻ0y]Y,ړ!**/8!>NCoGTXޓVqd,N7{!#H̩zFOVI6xuYrЃNHg.Dh˩{LoO҇2vWꠀWК+FŒ.*AcA?IĶH R@+-4L$~*:k /Z}Eaڧ<W܍Lop*9fS5nizdÙASf ļ$6D*t>؃9pPEpeaVfau;vNO§ECWҬ"A%fsP·>bLxCZyp"3R覊Bv>Tba̼25CA^ `{WԮ=w ŕ]}DpC7g}jb_DxhmuCrzKGz'qTW2n1zPz5` 5j32JfE'Ic qGbP?b] }+=Wv"iM-\!V2MzaYUXk^ iڐ%\$%r=c4ǟj41|`4r瀿GvaM@!b'w ͺ:RbU]+UF/5w5<HH|ՑElJ 0pޤ;@?ٔ_%9Q9lC+Kc4ɇsN7~@2᪚ge>A QƉC06CHH̆":ap?$ -GHӝ~6.)8A;@'y:]D5ˋ[-X|ghJHX|AԂӚж.v2EdTMmiDTOpdX<4 $>Q0}0LEi19gw]08a*b cpsX<1س$ިianpbi^%+#@N9q9ĠpʳPtkURIԤ299P=M3Xjt&#BGڂOʨ,%3d/wZBKG{1vsId?G-.jFk,T~#cЄUe#.,cϴ$ݛCG:U=!hg>OX*; @!cOz W:-mLGPV"B 42G:nZA<鉲]7 Mi]"`?jF =v=Y>b׽LC 煆4upop)`i7"Ou#6\M=߾FV5RʼnXX4J:{;n R5_)g7v!CO\Mj?q +8 )}@33j;Gx[JX0<I.kB0jȑyՃݛ[#o90/D? ؞FnNz7O)w@\.B)s`-~,%4zmIX*NW@l'SKI)QS%0g&>DN쀈{f*rAk_y!\ͩc+ j+Tc˔_z{j4xb+药QƧ(()n7LD?%iD]Q)-e@@spR(&A޿"}G8a^pp@Xs Lw5^2P00\6 9U6mfnsZL"]HE'f֦;􁪹횎;d txj 0Sxk(ͮr '?$mboЈuU@62sc`0ժkPJ(ަ+m k?901#W#(? Y^4gҔ*{/xN~ZԗI$":B}{hL lZ{ ); ųk49 ׽,G/7I-Ԇ(+?el xT%~2n?LZSǰ?ov櫼Rq uN OndfHa5s֚v^ kKߝs )1'[וOƳvUP`@G~1P0{"F75qE+ vS‚4/)$ K-Ӹ$+E/??2BH5Xf:tIBZcZ >jW-,0a[(xp#-.%ʘP7pFM_7@>\_&{LM*kx[WȢw(Z\C;@?Q|TyڃP`ȩHD8Z9# \5vI eF;麛4GS: tW{䈫0StE[NG{ZDli}=^ ,8k\n&DjuQq&VYӡSF mwf. @aq2WxT25;U!KK"ZrIKO:ǿ^XO0i5߲t%V͙aU#w&IG= [h9mD2QGo6zjS$$`Vy>4ifO4 上a^=Χ=uQ `؀ƬsꑁK<6|G U.^W|cУG,d]&Ϝ!#F"Ā@Aox=/X:.;.eǖ6^iS֣CTSE],7N:S4uurvJ57בsb4(7&yi$N/2oV:W>Q)J/z%~B?@y{Ϥ܋QR3|ˬb@H~7tc$Of3k8FΡe:U ]dbq~IrTvurڰY /J +[57 줳zIA1Y adYk/p'LPAZQ= ɢ>z tf x5j&Mإy~,2-Ӊ+WꜶu㻅7Xmcxr)c[@~#HdtݖW%]niT~Kjf@6~*a$3&+OazKgbD' 1?`H]u-~0%]`4eg\8PDU'u'.FhfNyLo?ٴs!cO 5WDO+rlweVr5cq4~Z[%86aŷ;3ȏc"6E(b>RwCbqYCK)v3Wxi%E_,?XMhN0XdacfД@$7#J)#ܖF]mfa[=3x+OxQ,m8!pXČ7dS״XJk@T";$zJ:o]6P^j"P .ٮoOBٺ-{SCAY1wN>ʌYdF+%Z0/A<шѹߐVvFԙdKGbZ;_;?X#|"ܼ͖ik = p'VF(žf2)6GJ-_Qw9"=0S)饰>i+F [h)leo`s_NpЧa.zH8q@U+Up WMfWGIYd`ZUbhBA1p(Y~|K[Dcɞ)YyW~@/ykr Svb^"Pv}Z/Q/bE|VF;]B$MO[/67z5{d }IXt3MJ]\t"*WcLkŻQ@ 7+O=!9vBH3S'ʻgu'Ԋ[0Bk^Uj6hϤx*LVT=R;CܿaYLB 3̾!b^c(JF=2Pƕ8V6w9luhChbDQh![{)|B;1zEv(Lg)3[C {E5 *AEtiD ,vM77L|ܙ=le9EeȨM 'ŸeaEd.-w@F1}tCr~JHntԷt_,].Z9*G# 753r;%p*Ib[G U<SuMiZv@wF4 hb5R+H,R7oG6;L|SlRZK~Zt.n籦x=[)tGgXf gMxEdY9jCnA9Pm-(?7kqkN(KU\-p ݚzė_ Բg6p܃cQum^ګC6L6 ՃX /PZv"H“Pf}C(VumZ,9[)HV ֆ?>eQ\E͹fHM$0 3{H O LрN$D>@U5<%ӂoUuH&&r׈uy~Xe/p0'f{2/ቒOܜfQ}h_2>"C>Mojq?;yħa۲iEVP9\K+MfL9UupA[r*pۦQgX#>0i?־"DAǧ<}!)٤%2?3]휍hѽș1`EK,X㶙FM+fYÕd՚ܾ?I/hT7:Y]H=7Lopw 5hoȄQxgB)WKd[sf/O1eZ˳WM^Y 8]4GcTōMNP<D'kEV6dZ}~~(F]<#Ra[';\nid6SsFYy~*y)kV}iV1"COd]*71i!  oؓ3*0=Dgu!wE}.AA, ʔ&)/oi5yu2ܲtsk"@*s[t:3-̚jp ms $ --RggO5qV{"#t5X圡up 8~? cKb ,W91MX=Rh kSK`dEZȑ r$15jf}WÎi`3ƃI$J/sZ&d^:ޟ.7t[6?kl܈HEx\f);&c_ to'qgddha)s}2X+MI#]~C\-o'ߔ"iGuTp= \̳hF_/! $DXi ynm,,?qK||MXnh*o(}J`2TAN ϓ: Lx^ГAj z@1}m,Q?|2؅=bc0`赐]zΣ/ jo|?^}5g$b^^H(J\@BN 0+0@-TCyYz>D5Yab*ރ'ؓW cC~"N} #yqUVSr'mb=i;tT*`7T*q1~ZmB' uLŋ|h6hG۾ґrGWbW "F!X'H[w~ƉfF n|W O%ywEcL˾bؙ|-[:͉Tpq#jEUZ%`nJ[ fl/-&P^ڵ2ŽނT|kXsdiT66SMmA4y3#V$14 .sU1;G.xZZUSZ[ZL(HÿwJYG{ϱoWD˪o]0K9+huz&OB8G:*Ү;37Ymy } Ϗձ M5:+)@o“.l#G uJ.lTe+m5 J$@jmţ:a A8<]d-9B=4bKmT [gJ}qQ_ie%m`?!!nT>[KPy]@NڠN?źL+`1c7bYp E[g_@U}ћk2>~x0R/4ы L >e݌50A% |1V*5x-ٍS'6ؽJB9GprpE$hb^&d07ԷQOe d2I[AuĊ7YӺ-- 4ꨇ;1/Mc.C96_hVUvhay 2hQ:ÆЛ \Q}G8(zӋP$<:~ o $E ֖|r(q}^,FzA8b!lDKs{J_U=Y#G٭Vя,qؕq1@ȇȞn7QU yYcdG=$BM˜)UL%?aм1UQ9Nz͠WbOXu%&WS.v7/b>Uav[]Xp/*fIG:ϙ!E q5gX~'@2M7,ʲ/ݎt.Ώt^KQy !_o[W~V,+ Y;7I,?cuTe *; -fymm JooVxe`zKeC5b ~ sRtEt[җ+lHC:E[޴8xNyWاEIh%bcbCV;4,&[jAtRL-iI$է[(^OuGn^nmPfQ[qq Ѹh[,4 ^ stHPp2O2 /l@JYo~ǔm*ȇHf= 98fkDa5n7[jtfUVhsQqyg)_-(/ Zp3k{n^y ~KTك՟Th `<9fW̟L=1G kmZ!ԭs +}p9WD@dl[Qbً=uabMf>azKXX9{R^UR`KQ44 nYOVC ֹBk ZU`EW~8rEKM4 N#f88NS7""/qd$V$ց_>=0(As2+f b\CFotߘTQ\ѓ݌csFD?JԤ:C.Q&}:?Ȓ#*N%aLT=?gAbVy8`U4P$4R-SZٲtLZ9B+r!Wҹb" kO&hp0y bT7QS`K2p&j *<^> Oa6HykCA6N(u`:!8٢0x)=?q\Cu/c/X!voi,2tCEWKD:x|KSs ɡJaʫnt i8IEa {/CA݃!k''oTi8QyÄep+MfMC$.e.pIJ C2HN}Om |n>Z9oG\ r;Y}SH/U0֠c/v#(qlEl8:l$W$*.H1}y̴ W#O?$h5O_xdq3=oQ[qe`f>!o0O'y !7Q%#t.psFFV;x`0zvx 4MMKYf(^eJ̸g%esbQ8A'1C{*"Ԁfud3ߨ(mDpjT7^Iwu rO74 n}] #K~,R,w(f*m$IB7v\3d7#7/P}V@!Ng3]`"tte~یK ˫F;@I#YԝvReM "ʓzt~- =3¥BݴHU )Zآf.~/+E /|:}zYI&/LQrT=ʞ[o s(knSuq5}@h52aug=jVb-=04ޚH7z7ˁqnHJxDu6BuYM99 /eMy1KFdc'/Bװ~T(0K#G;=lC}(k]p ۭ=J;#NZ2U$:_(H@eTB@H k2HLFwƆZE4 2d}O}?_EClㅷD~(j OQ'L;"9LFH~fؙ+F_@yB9&ц~ġԨy}Ўҥ55J P8\j.C=eŐ{>Ԙθ$5Y}y"?JK+ẇCӮ YZvm)U~dx]9FB}TTphɿYPkhQSyv-~kPmbLf>]vrXq5z-xjOgE_* KPEO;P[]oY jN(w1`egv&ZzH"߼!›c~{VʤӖ? V~t]Y\Z.ܵHQ!Ȃsm`峞mL-h˪h;:/MJW&[ya0V""}:!хO̯I|J ;_MƎkֆ9a;,ﳸ`ȓ ]D U)FⰜ];1{-Дt!YT8.56`Y nX3ۻo%ꡮL WٕHo]@)wzqx ղӓug/֔]L;SïXżZzM$Zpr48 ^/;ƍw9'71l}T6zr/SPS[է1w5nV=ċM&&Elj7L=B&Xm,+ ++X>?Uf rsARP >p55xQ_(i޼oVN.?hFL LOd F2[/wߖƶģbJzlDԋQi _`5({jC\"xZ+ 4 _J0ݯPR:$}DnE1AG|RG9 'fWրD>r"K〉?Ҽ3IktDV0!gR~/ᮃ΋d|zRsEXT! D%j{L~I{yE/H|AbEGO RM4Xr8 # XYƀܤFXp6\\s ta,}W+SKxHIT FT\L4) Uc lu19 }U^", FGOu;bbk(x{)^&)2Ș%1AN Vg4*`}HS47ӫ;m"ZqK5!Y,Ε=8$5"L rUKh%ě4g)DyEd9]&6oL""7,{v֖:^.|ƫ\d}$VN!$LY>b_X5Y ƒ'v"iv|%C4Ai:OGg7q*ҾExTsx4t^Od"?z7?+ne%Hbt;Ş:U(}:~9i~lu(c TZ6P܏u%zowjkB72aHU\ᆽ\ngap M t l$V-2=fH(Jgbxv)`isoz-c76Oou>[D*7ARz DyB8Nc@xJۡ|^jh;c:&^yQ H7XKKsAމHQ=95ֆV5w~ZlӟREi@! &Չ?!*nj#zFuo5M Tcz⶟|R9Rrm@E]!!|иţӽ4rɵxlF6pz])HXYt$LG%Y7gq%lsb{/8uuW&N q5F* ЄČ6uTN4v6$כQA2\bWV2_[cSOR.!-qeiڷ7crsh#UWkpwi> DW/W?]j3FG1ZGft Ĉb%xV 2UwAP _ʩ#*]c{>G ",AR.=$eWz<Dekѐl`4:2ㆢ1]њ`Dxk5HMCGT GIfyZ4T~Y0v\5mf(2GGH'fҨp~Y)zQZUyDvQϠ`AY*q&*ܖGOoA */giQo"e;v_AWc?Jwq:A=| yъw~ fk\MݫI0J,Z@vXJÕQXѭ~ ߡקB%,k)$fmgޘF(rDyrFVď:T NPM͌n~x.L'IaDʃXd@L |P(#5: Rؠ`r{+hGhc [ vڙEF9fy@;I!31ym>tsE'6&l,4#~jс: *x`tB`Ik?7j »b=e,hBc8,z |fJh9)ҰVOb{ S|2-j$.ŎQxL~I6)Z{RcV-QT\v1bS|&˯MZ'?.Ijώ&I{A[R{FzneTxw2Kv~+q'gGھXԱ]sN>yٌmLX3O~XtEͱ+Bl~.xOVx=}܉c9 P+{ܷ)|PQ@c 閭SEEʯ "QUL,k,R/0яkjaVϪa l3_"O56Gv}!n:hE`$5NFu"iү9#l]SJcwW>~"rޓ"9O24MvӰ̡0Yۂ1P$Py9ݜ΀{ajָ5D7u)aĝb99b eSe̱$D>~mݴU'R<:?w"ί Xb<8hM5M^`R QU¤"+$Q`gyΔw>kDZޗTOdwk }Ő 2iZ gyϳ= (&kѽ܆?v늖 c|CxaPZvtl,L3tmft};VX۵4=Y,L]C2wYJ`Y **wʡѠTGY]7|Qq ߷" ݎ㙄lTwy{@ny9FunFÈdZz B3eYQ!,4Lut&}-7F:ݞekE 7[+{!/wWFkrY%W T m+k.uɥZc,K9١(}d¿U._mA.`Zc[ eC.w!Um.i MRZ+ z*q:rӏWw9ltytsؐ1;z6z]hF5DŽO&DfK6^*?z:J _*W}QdS$ `wIFJ]:5]  :q~\4$YuX`P^ƧP4  MRnsIJ5e(^0=Ďg(%?e֜vf> f$?&!Z*7:)+DCG {(VӜ= %Za_LS &p3RAs3;QPSQRыl{>0 YZgstat/data/meuse.all.rda0000644000176200001440000001112414127330265014664 0ustar liggesusersBZh91AY&SYS ]]H϶yxvC^HCm-nZBHh& i#Oҟ~SLSѢhz)${S))zO)' &ɪmG1BISj9ӱokmqjmϺR,dCc|-KX̍;M"Ȍ&WC[AɕU,m-Jz*\bҭ[7[[m0a8e(*BTj ;A+x<1gc! fbh"*D#4aNswC6 ' QU6*ߘx[EGEMI;Y\GU;d-ԡ5нT]kVu⫮F:Ӓ}.ܦJeb 5@D"SM0FJTQ$w9F1WZ<)ԝ;LT+CUxIRJůlT?`-$B-C4&al+lIHIF5SD0쉝,[3Ϝ8_[?[Yc%4&@A^7 *xܖ\<%BYia2V"ZV7pB yP=J7)馛Q "Sn*Hg%I8۳Uh2z w7P:))J9]3Pr+GIYOJɨګW!WbԒVU]vi,sdw ^uy^[9ɧL ]ֽv+W%"m*Mf @2*@#k Uԍ4c`(sS}q+9|baTk$!+$8דO:avSHIH9곡@?*]+JR%*HS(uk$,E % rM )]Uy 嘌$/_+Xwm\}O1P,e N@XB, E$UxUd=fcYȒN%߹%]𕕆kXd^&L1|a^ Ssiկ:l_\GáZtTЭlmmm mmQD#$\i`IǵVO [HSY-, \8"qրmyo>((EF* `kR[Bە.pńREţjq[J1X-<;2Lnhnз7Q:G%H0#uSu;ITg2>ы>@mʔ\l[ҮW,LqQzD?NRX3MTmW+ݕj]Vv z'֮7Vf Gm/RAWݳ&.cO,tV ^-<^ xw.喭LL ̱uHW~ʐQ`aD b(T.VT`AUX1H`#AH1DU[JTbŋH"QdR*( UHDVE",DY 1AE"[`#X ,QB)AH  P0 @!!l(RCaEz1 u4*8*we '$hTQ~W}Z_"V54#Ddd E1ݠY^)h?剹bsHRaXKԝIXG%7 f 9MWU`sleNG1ά4xH7\JcQ>V4֐to77nsfΔX]D2bJ,Wf {[v&XFч24-jw46w,BGOkmc  ؀OR= !iVQ.eyQx),%%@m;y!m">㠮d*)2svwvD*;O>@` 32 DZ C8s|gœB=MAOJW=5NycF~LGWު$.oV~3rF rӒD{Wjq^oDȉ]UĮwY3DXFm@q+}Xe6%뵀6u)Yh4?*_$_GHS+D mgs09nF[Ȳ ^u տ+BmC22Yz i#- 72,]_pdulv,qD#nj 4r9Y[!i>n٥M*A\lxĵG|7n݈kԛw;4v\q-($q +fmf }W3j̮" <qLEs3wCj6ά +G܇VDܚ I#WI;lz0 q=KtTSFR;0'5S۠l;7t/Ļ!g԰S;;lXu〈d>]0S U| qK%8]Nο׍YyQ~%5˾΂G`aӸXlplv{}fp]3{Et98ߊ5a"},')mxb=6F;+?+!z t;J@peH0OL:k u1nW墕h.tTZ .A._pϝZrF| 3NgAX|N'ٚE:. γcwxo|$ 9qc, oϜ{dɿa8#ehm[2s|K^yfN餃;w6OT^;tJ'sMկm}}޷8&>psk٣j5e6~`rN(f}l8֩CZF~϶7 _ɏϯu[l+[/437WY^Y}i}`iU_]> W[y)ƧW繕ƤU/B|[ gKT6f>n /ߌǪ I;O+:q p1/qn5q$AS {3[E>:o:14(rl^͢`,#|gMMƖ"(IAiՊL*k5ka:EpU2=͐Gٺ nK*:fЇwz_,g]Ye}U&Ph-rs)- 5PǗѶT%&F!3vy 㨢Prf,ͷXlt\B{(rvbR6aM>ftz@xNEF?~U52F"͞Pѵ0^}3?yX>J]8]mh.;2?e G,{EPO_<M5z? &E}yL|۾;ņ&[!;l+Źn\ X`k18DE[{!#}|X"ɝ[ȢV cY@]3L|k`:5!aR9 } WBb^rj@aFm'ydn; 3k U( }3R|L"vg'[[8S_.QX ^{X$7y+Z2fͰ3PE4:\vj?\DA6\wdǙtG \U3TwTteljּ `8e>/\]_X7,&n0(gsA#ٖ( vg ?.s֒1w8MP:Lt},| 7O@jA`jј_Wlj9QCJw~N)mT5BcYN;Mox5xln8gN{5n.@b)0eDўG{k:;;r7:ɊN=0)+悢YNvG& se|Yզ_wn:R8MPpXEF2&Z5\mp@]A&5'YE:-.S ;?s(6,Sj~4dD5a!Nܷw̷I$ 0B :5/L{ku:EPgVd&*B9HU$5΍_΁7e/:pBaWm _g`aE i$9xm%ZԨ :.?hQc͐NaY}~D'y3s!KczKk]Bi@OWjС++m& <~ƦJOl ňse8}lOǂb(KВbQVœeb&6 },gX6T-%8um/Z qa޻vCwZêܬGSnojξMzr\ D⍴h(X8]/J!%,FBD,Xa2>DFnLi;CEs01PDD%*wOp#wB„q},g{0^K<*MGIuڡ$64LΘGaLq 宷4N|4~+hHp72)|tf^r_sͻ8j&z !5Ǚ~;,d&]e)O!iNw'6eJ[Ya v*wP޾3̜9oI_?P$oZJIND_s/8w"mg2lj(麏WkWupP;j RcuU,65xHm2#S5ETXK޳% Vn}N%$w8]^h}^+.0QWPRԝ$;U+y닐RgI sV9ra&YVٕ? j]gg~+!ȗH˹z?i1Z]8xRˆ_8eI݄pY5wro"0Աj80w"xt Rqi<O;ڏ՛kuϩD erF:RaI d*e_NroT3~2O{,{$ ;.ˁHz5˕djMz'I6EĮ夒g-Ra7P+WF]e7`(Q SϛC Y=5EUYn0 /1FbI $gtτ jtQkpM.C%]dmW+?qtח-ޗJػ2-8#jRT13An-i%\*zO:\AQ&{IiJxJoCpЛ^&'WIu4/LR C$R@PsnD3RPx2qVntw]p 1a:+:a,ff .6|9ȯkT(drpݨ8kաqEupg7J\KWc~5#k6h7Q`Y[ܽ"E'"Di#8(|4PkkCu뾇uew.KU %^Jk^X,QBL5%> gtE-^S{7''FK!R^kҦbp.4lbs 옌) g@׭ hnj]#v+zZX~(ʋE&?/ƯX]Z%?;QKmН.XynKcl/' i>.T J|]-:}1Cӓ[/M<O| !ʿF7(Qڲ՛W#z o - oLo:jI]g}M|нfC%ѤgFS[b1g<`a4\,=ZZD!rHzh,I`AGʸMA:*~uFڼ}kw h ;mod' BSa0%ǵJJІ2L֘Kv8nONN}S„V ʿ3_ښҐ"MOw…p6+=\W%2Dϑ6SrAd^B&3Za9d93==j7P*BWtS# #2鱽Y@D_V;1@6| S5)sbVtTl)6Ju=N/{2E4,W ) fblfihw U!BLMkM8ۗ"^mj~~AqWF̒!#\Nߓ/I-3ShZv[ܓ*LBpAEݧ)X$qY GsV#MqIhQFf٢>4;6 f Q)ERȬ_w-:ZS*CAsPXV^c C!g$0̆O\hM/J"Oz<f ah aUo֍-XhYK;̌NP z˳-lg#¤duc"eZN_aolb0jyP*ȼf.c_lsءpق24%DFP:Jkl"Cc*5b%4ZEhk#!۝E 9fBn֫kx@IMU=n G/Oq3vgC,/ѥY2%H5/丣F 1(9ѝM8uiŖ]\ŭeQuN(3t`*L pYj%8jb vn(Tj^}f(S4@%&.*㜺 5&cҌ̣|Puh<ܸ0u@pmJ\>7?B Txڎ!̟YY=yT}lL{_W.wdJc+^MYt v N h&ɞMM>0 YZgstat/data/DE_RB_2005.rda0000644000176200001440000017420414127330265014331 0ustar liggesusers7zXZi"6!X؉])TW"nRʟ$,~S'$^_e Yٷ=% ?) 8 RM !3mmT1= zO44 /L9=]=h"5NL{פ_l}F05yʱ&2cwМ rBer# ñ9o0#ۻ4fI"Z$+TkE&,bŮhLp\Y([E?vjoo gE0'GA^/=,8HcyM{j"P07%d[,UhZN__ǘ-{U!Y1?XaQ_݆y X:R#rʀSſAΙ:I$|zrlzܾ3LZ=e (hKTP JȏÀ2*=<ʜ2ang@=pqJ R6]iV*dXMoH!U4dB%nfU] P/"ƕX[FNp`ۂb8ftXНaL SC36{"1Ct]7*W"hRB~ ԫhOT}.;d&7QQCPu̓kވ6!taI<>Ѿ+shHF"D /br6e}{ه=PXTBhL㱾-`vRZ1N@ܟ#\4\E_ݻ/߆4Zf U;Ӷg=eCu^Q~p5#RH֓٭ ]:3nEcܰ#?N$ڻiUkXMIu#K 7TKRW*-$=@ ak6Όd?Vۘ~'91/,Yt@i|ieH( ^7+sG&]sߨ3j3-Q4J-C^|tC 2u&+ iNFʑś%_D pa8vvuf쵊"KKs) J/끖h}PSa$Lށ=()Uӵ -`|ۣM7i_npc~Vv@Sץ CPQDap4^uj= /h8VN͠D B U 8[7v׏hS%%R0uk=MpX1OuVRBQ؃9tNYzw#M&Ue_C?mPay/+f+J .6dXhd_!amH-`G훯'[_7Q4[GPb͝Bqy7)'z nP_%@lY;hlK,=0*?ͦ`A4nR/=&,}wk0HS.܁Rvf]jS7䶝J}ܮ}Gq.Ir..7*Y (gFto? ATv(9֪n:Vvz1Ů*QyGfқf?9{ޕCSx.˝˖BxnWysP'>',}\U2!- tD:UjYQka Otb7%Cv`|$.B(XѥBN zmG@qםmQH2s0QR!ɿ1Ң758zS3tyH{Au<YƠN!$Q v S89Fsדx<6ģ78Iʅ8ONRHJA~-J. ^鐡]`T\ M@ȑެ_C(ή1ƪ*S*)oc#Mh$^;?ñV\y,W^B"RX3g+rhM/*#\rFlo#/wq{ce} OH^Lv y 7YqxŸb;{vP@X3ȨC6_G,Jhi뼲@%\|&R, c4xCNV5 ?& ?Y -us@h{l$7pǪdмMbQG(u=TGG㭢1VMEQoEմ63U[k42mBbA Dڑ>]y]xU۴puV)yd)z"As0lY κD{i/q,&fe~=oU©FPx\xpY?kbϵBM672n.x]"*jջO D戟qU&)ej}`z,jEYڦJOȕWҢOAލ+I ו d[y\+g':f7zSEÎ<Y0ʈ6B\FFeGMC!:߸4]&T،a5 -AS]0uo6Ѿ?d4!KK%nInPHy{ =F\T2d.  &dيо$UB׾n8@|{uɮ lBZ >nU̎xTKn`dtI@bf91g"vG,0dkziÌ]%x*6JHBp<>a*QTN~}91l|d36y o7;Ry=S-RH/Mpϒ|Cӡv*Kb-3Du}Eyr_Sg1= u|ƎY؅'} m1Xء#h⋚*;U3վz}Y2ܡ*CqR9LYהypvs<@/fx63h̢x< quE[i4?Z+zy8?p_}4U7)wPCm `KVtG^}@RϑVo˽1qe]1_y0zxy6؄cՕ{eS#k~f&`H[_Ӝ-AA6gik "|E;ɫF4Cc8ϳ$;odѵp.P.bJabOf`[ik_?F- wCO`OwȁW9KsOn1uSh"~I涮L`Ϸճ᝖ɐwUSZ@v0Ӛ\_ALŨ6Q`C|vc,h*#qĜ0x+~9 ٦}Ex&,Pqgi1*y=!#Lxc9C@;o=DdZ_Z)Wzԕ9)/h Cp 񥭌pjunmk-\ѡ j^A"qC_q9ʖVTlRΓPM,BD0&+c + 4Qrmp6p9Zgn{N3z$TiXƋB͚_NDO4U?,hYhS cg~ФԯEH Bw`͝G^" h#" Q~̴rC6S0IQ8Xbd cb)'`F$Z\?O\KUF8~!, 4o BWJeQGJ}Н<}~ZLx=QxXO 'ϐdU\r-[T ϕʒ \whNKI:Y j .Cf!Dr;1Ĵ\3]w,B ŘoوdnGtOLt!b} 2^?ℹ / ~T5f)kqN6z'!Ǘul@R`w'I ˶x=l#vrC^ͶŝB5C9S8>сU{}>Nq%|VM)Ǣ'T0Lbɋs{P'kd,',]-lsXɃfաawkߓ[`p0:8p2ƨU "MeJ$7H1il0 Ju:fF߁8RN:'!t799+:Uu~zaۆ㇯uN K+dHU@żSyQX5V?-Ir6dAGj]G[ W~f 7 -WF*@uՖWvG.3! }ԒKvm(9]ݭDεk Y5y|G8zϠF|S_|10<$v~3Á% 6wY47RhS-3Zy V,V1?Ԋ./Ŵܥ>ޞN*(higaBڂKvEByRb@p5̫[īyG6!+Uqcn %+o&~ٯm 5CKtyuwn_╾21-B ϡY6]Fѣ`_aЇ6%E2Fg&C<87ϰ_YD)`3)TfE YM@򫛁\X'wE^Q7N8yO}Ѭrd +$bT2j[≨24_4%aڜ?bﶒ- _9m?rnVeX -M'lMrZlH0[$ vS59}#5>@3Bn?=kmK%Sy\'5p6uRJ8ϭWg,4׾5Бtյ6ieSM?s߲.J[$^Q[I+<.CtB-e^2 tƘ=/bi[(Xؙ[_Uu:VB}Ee&M$PM9R-uPISEt@yL@W@Ƃ>0eey(nM㠏ןm^8ܢF z@&Gs03ZЊs|5~\K݁Q`Ӫ<}MT<_d~4IbnE}#R;_dz''l0[N4@9E]8㊅ A?\;sc5-~2/1Pe!-Cape˘},4Yf=XkxQ9(OSqz4j 3:6u {нEDڧn[!RRE6l9Z?oԦA/0aT@)Mߧaw,aO]C>G1:j0jUumHQ$n>kH궕F>GNdWcɏC`[w/.m0A7?ί^8;ϩ>2]hB?bq;d8|i/N@zd|]KntrBH,bu=Oŭ}Cә9L8`=$eU_wҊgU}/~k4_#62%aqjZFG^COxǒ֑RJ ɠj6>U;y ɁXJ+TB+ Zb&+seܮxa(@;.)Ar- ]c̆S3nGӜo8I'F |#b.ە6O`pS0R`vlbbVbp "لq)fnv7"ɖ)P2]'V%F8-znSnc%TU !׶LnW;e  tMQ7Ԙ3U.@ QEt> |xC6 jz+ұrhS<#U򅬩[=iGZT.f] oWL\J07z:Y5O#lT~Y|0cȎS󠦗a esaw-j6lT'vKKq&0-ɣrJ+!i40AqRY54ѽY×;f)ަctiQaS M &lCJG!b䤣H! .'o=$(*\)woZo[" s}YArwՂXTW` I췚R֗\`!jMǾ K۠KBQ2qA˒hMuO"{RpxNn?ӆ2$5Gޤu>Ȅo ,h IDkUM9`/?r8@e@xQlfo )bol01cJ4J=HUK?ElN(4Kjw5R=·0u9ټ8*T=s^a# ,5(h)/)F~ؚW\""r 9H;O$>-(ɀ.vZm lTE =sGդJs,C/C77-8!Fr-+{]/ͩPh@sd|݋\& t-'xϼ*XזUd4B@ _=qۥ1w-!wL,p' ?QU2Wt^T%)~b(xXHٙM* d.sOl 07H3]QI='ȂdkQnU R!@-g > r\&68 ׮fs >=}BJyR̍.J΀PjeQ&%n#JU%7g<Zp=>Z'61WbIWG<+{Rp%C<p=c!;T2)9ԙAݱ*wݜ ]+w-3*:wt hI\|6CRi\3gΖf #¨oRw_?)bec-v.iƶW?ڜ wU4P$j@mMn-~nN3s`Oh89(`^za@ˌOd2u;~lCwFU*1/ESS&۔j-F0W`!%[FӀ&jOizʗ,YU9\;BAӿvKJKKDU)/~;}FQF^,| K #5ڗO9C>QlB?g.4F]TpI#BZA.l+e`/'QKoh6ՌcM!tVptgZ-j%HSPCVMgalz $'BH_)B)zz<ׯcή^8/7_o=i213ǼGɵm;&Sq.Y<9.%8.fjPxbJtB/x2#YdG_|lo8؟(G4A_޷ DƁ[e#BbWBIL>zD׌6w._ 'qNl͋kW c^z<2iz*rG{ ^v+"V$y{!J}z6t/&Cf/kѨmS <]?&f#tZ{u'NP-/QDPSOkz|,ɏo ',(5| u\W^bD@|X^&{6N,C!x l.}deUˎ~ =y-'P B96;G@mhr6}fvk5 }jAG@avs&h8滙İ,E{^qY_-IuHUz@@/[]GRv`P8H`XwoYR/davMKn2귷RNcjhUvÿvW'vⱓ+u7_R֕a7qA%Vrrsm(%y2.| _%pXɩSA=a$5Q*č ח8aԩ_!#nY٥ވčxdڳ'ZWjJY u)Os,U,^ |SZQG)}-p4M}tGmy\6L3RfКKZeZp:3D} c+,Gq7P.LET6#!ȨEC3켖vkqdZ%+:2,RRMESީ~XWn&ĸ9LUAՓ7>E}iS,Vp%f(l%vi0#A1~8).OìmbDn~šbO!aH*-΍c'Ocx9- }vy1EI =aI1j_xg"R0ŢkMU8v#|BuIb7E~?<әKX(tQ7J`h?H0$-^,r\4`kgFHez_QQKTX:4]GK_+ `[Zǀ1nܝ(0%,I}ݓKK'ы(C4jV!'}63Jj-f5v"89vKV3t;]Pe3m}˺w E^!1{6hcpLڐqMyG@J޲LyԫA> `уr /vHnIQ3Zu_g]165JgX! R*MATH:CP8#u0K(-zN/` )[AgD┆vOb+z s➙/lf-I"oahQQ넪w F XhjD7Tb&E#3;B b9O:Q:oz{,dH9Gp~k+9 o%8# 9Kg+,d~l>S׷Nx5U#/R-j g.:,'haWc! jvz~jY %~hpVyH'.RFO jMXs K0Ȟi3v/SR!2;íd t3T&G薍o𩡔+e*d'}Ke0ݭTI BAe4tdJCt:(ⵗ;8*omΝӼyN8#D_)&q]*|/ߞc@d< sT×;Qp,g7"Y»擏A+F-ȱFi_\A0yn앺A p2{.~vTosjc y2S*( J%/B:aD*\%v;B܅}+})4XyI-|3д(Ol2-m Qt;^HgF?.̽0}`h'D^P( bἌ:B0e\}/EPGf6SNȝO #,9Ued 96V: Pzl,$N(Lފ V8MWLTT@N0ڔκ\ B:U&`[3;;U൅G=g пfXEe k6P@^>pPзD0ٛQVwں5Jjf|)[5M -s9ռ&1o_)N$m7퀃vGXYK_h8wZBoI몞wVO8rM|fsq%v. K5k-,$]!ZCwl4c+cHʺF6(܃V!z#{QH~L|f*~}t9FVyx2 i6Ȏ1<eN+sFْH_5O|pg'F1%m:{ީMœ*He+Tի z[gU&Ex5$\K 4Ei&&l=؞c[Hyw.ƴ<$[{׼F+s٬)DVLi` 3cUF<lMwBxvtEVf**Au'J)sYSQ~~} 6=7g ^֔-ZZ,Ma*!y ۏ;Y^XWu&nXbJnB{Qi2Pn*W:62BJK83iMuRlYl~ٲ5r,4KVB\7=GOrեeawcusZUF_S/f}EmZBf̆yq*Pʊ8RUF+A>nFÐC"}VFyBfokan0-zڽ"Mbt7 uو|ڈ,1 `m7J1s&ȉfWx5mȸfF&JTUh<+Z!+_.!DlǰFhlMPLC;R“3-zXr>PVO\ $Pd1WQ 6óC证mX_yǢ# Nw$jKBmCg1Dޏr=ΔI-]*+OLMe\Z8lR:C] QS`|(\&njaCۮC*P q+B,@.bʖJt;Jg=]QBEKg7\TblOrUS1>Gʯ{CԈ]zo_"/bt{d5T%&N`26N4TjPP.ZV}{@cw eV0y[ 7*Яb}ocZ\ĜCyd̗a)^GvbI N4n~ unt!{N-R6AbsWłcӕ׎c$aS#$F i݇[@͝a kLD4}it S<4˝We73v5?;~܃*!d\S*)=_p yBF `:7I,Ђ4:ۑ2Gsh0(l*{CrgrQqr}"Gȼ7=Ƶ<+l{&<85~|:F*U-3>6ſif kɜlX)μlLcݥB55;;Q΄3ׂsdI." YE} I$ql047Z"_DyH'x!VpM'iwbedԟK`d=5n."0*U6=(vhk6><{l}JM!ẼtO㚹 M{vkBֲu* C#WHL'4IC ׄ3Z_þ4Y;5r ||,w|՟ρ5.Pi ;Q.Q V=˶x@6/$F(y \ɠ{u+U--&ʲ x`ώ{]Ki&*"9Dsc{] BgvTG!&64)ѕ: JkRQrۓfߡoLi y 2lKNCk?͝i7&59JK䗍>(EF__A`7C YތJ‘pkOn cNbnKZ'UÆa39aӻ-ʶ(`g2CH|gM .*k(6*C P2".>el)D$`D8p\vlKKv'K[0B;/8Usf\q7, U5Ă5~O{g<՘/``kέ2{- lDER,Ѽmr7aGGG0mT~@{bֱaj:9ZpJ'F^wI7ay„5#(CeDp81D=eτYVc Vjb7z_J3H ×pdNUJlMc1uBq^ʗ H 5o f"|[ˇqTL?g3΀a!*OfD~WajHs Ĝu\}/k㞠\@݅\֯CYۃ{NsDqCnM[7@OC3@oen KZ!'Ă3TLf)=kMKYD/í ʎToJQ/)läeJc.V΄-@ԋoJI,cNc*22Gl3qnƉײ| X^){͖:{ݖBnӴݢGs&(G45E{ c5K*GkW5L(jF%k[ d(rfmw/ǫ)kx<4Q+t eTs:I\^]kA+\cz>i-=2UAdKP'Ań1O8KO,0k&De\ ~J5*L^*GF.3]m/Թqe>&A׬W>/?d-<8>R7zخAˋ B+V oxda0?]3H_+YsȈd^9]Q fGlN3%}?)Ne!~m \B#؜|L9`y!cD/tZEFF K" ZKS=n7w wU|:;JOŅ '[A=EMSoi6`g M~f'ʆt9`IIMtJr<|:)E:j Jp#ER[C:sJӑ 8¤۶X#Z<ރHr¥Dg7sVk:_!UʀT^?(CnqƋG'Vs e&#RV5X)s/-lbc)ijz)Wofj&h"tY9[mzD qmK?$GPvl믓>)ۓh֣ ~<{J q :->0/qN'*L~ecV%# ͂+_" <*ZL%݂$btИ垬$NbJMnh|bSƻ>/_ tk:z 0:]_&'L.e_#U=8RQdTT4#$04+6lO Y#a6`v_)ƽNm仓GMG''v=x&u{ďPDsUЧc)n&Rp A'J*?fFqhwҍjɹǚs a,.Ը[$>Z#a#KZȟ1=EBo}˼AJ M%}\QC@CkXN±}*cuuedv^xeQζ- $+mŭkFJj̓l6nw^|#ê=FC2ET7ɪ$aD+!2bgTJ=<TX =m?tp* @K\tuBy9:=z,loVNF&%ޮݗ_HtO1 'nms92 2൛_@E^ԍIV)$4fVU $uXEgLXL2*ݹ1Rf n>K<\\P~kWK T%pG7 zn,Y+"SŐ9ZJ$UB$#QF𽘓 rG]6QBY*!ؙfL=Spĵ'gu׃qOhQ?S-fwpY^qS._Pu4#K}S]/Ѥ `j_qU#R|RMM4IK[-ũ&~2[7h0a(hw3k¶ydSinGۻ$D!%}\`i4N(lC$9 $Il[F& (OㄒQ!#(Ln}jX1M !Cӵ%{ݺ)UE@a`dKo> [|&{

ژ љ eԈCHd1-]I#ňi'MGb6?<9G+<}9`#(zqgDrFqR-TXq*md;Y.ڳa}SWKAr4PC#ٓ CVϝ£PtTfWOQ1w3Mz~MCQrYO0;&~jDxpʮVA?CAߐ[v𥂙=zI_,='JYeT8f03^SZ= )5th9ia> >]C ʁjb芋\nمaN"?1+CWZ'Ts/^a5UJ-bm2~aYrI0-"n̛E᥀Si"?]54agz?U]EmnvcoU? pNf оu>O𸼛lZ4֓A5>E/H>wN/2vӐ4;҉As=*RRV n@u 7zKΟ}TB*_E.N|"c+6H8gcwlkX,;5ZdO;qEBgt^X 5Ě4q49ԧ1"]:gxo%Kfڼ`dA-.Fa9QI:mz 82Yn<ˎR7(qALljjUIq3Pζi^ȼWed^Jε|si|)C`2C7J; |V>DO"(2P%=ig$_{@ãd@,T 3 R6KŅrOzmyNՕyPxF i3=ΙoPN\. ukYAbͱbZ mtWw,DAql ;bpcIðS\Gs=Sd'0X^IQ_:ƳP\7ov\zK sG–nވd/ʙuV/i+rEDF?+"dz}eg^s8ie0 ~Z5OJs1l]%CZbJ.Jy [EX\wcYQQ 1 ^}M$.-?FUZj7=jŷ@THTVtV1Ӽw 0.RƧ'7T]#x]e;Dґ`qDy(EF2ލvx㒝=23|5Ko~ L_ W:aŃmP6mKA)0'\t>:0:v BIjFh&VT0/m c$hEo94q[0;h+o3++&i2U'K*W'?teXnxjzj秥{_Wk9Z"28 4o_@f1*cj޴qouؙͪi9S Ia+wL2Ǟc 06IcbԔqsuZQe2 {kW9H=בk,Y$GE%y\0VZH\ثrBOcϭb 9}'*(sHF"O"DZ߉eN0tЪ`]PX6M7u 9^$G?D}b #ҡI՞cŸOc5&0Ty?]eAdѴ/T::vҿWJA+xtrawӵsWuwB>,O~؂#4{ YJ;sL]5T]ؓhJ'> it-66%1UT%O1Y 'θ R^TpՊZǒee0-vlAs'Jv{BM %G;ǡfXMv'd򰽇XF u-bzfD#e#) e3`y!rg&\C00PKy-wIpW)n]?{O-8!P -EG*^R¨:"݃ \ꁺaЦτ_nA_'@uKZfFӦf*џ;N ;Oڈδ9j^z [:6r33-8y:%p5*"V:xxXAD1Ld'th_e%sZ|e G&h^^d30_hhɮ ֡o-],д=wg"EL]5sCOT5C>(t#4q#+y:HPTژcyx73}9.t0 —;#0y+y$kFTᨀ :gn\AڅTifsUecx6UHܟևݡ\0?8G ICfȷͭ*Xe4hcc 26w'}$6v*Gk>ДTw2B 1S[*w.IFEe<8P6 4=!2禯gPi wKy\'yF=ѹ3+[$hKsGpr<2N[7?$"},@Pn#Elui@=\~']O"j͌ʵ]6lzxj;R!(WNYnrlCgmMx._F]Ͼ܁O9ѦJzspšCJ{p]emWAqJnِFnltrκlkN&BA3vH[Wꉟ.b&ֶ4k P%3GJMąX oyl+]*\wc"RL.)UYu'`D:vgٟtz KUЭbmv u uj4/?%ai(.a#/JnQnHfj_,n'!>U '/2ٟ F auXO=.^[wDgCvlX'[JRILf5z1̄> H^XLz̡Dտ677tAn|B'0c;eW,9z[A:܀hJ#`SKrFߋ"\MVI gJ(-SLZYgleT!S~&GȤ&NҾ5?0K؃]x rf̀vUw5Oإ|i{fJbz2=6ˆꅆLvCM>lX4d ?S%y6}B%425La cDe~T-3;#3QگG0R$ÎZYt[c@WhGo4WJ*lMz,]c9!mKT+ p 73^yǏ ub`&U_y;)౫3(&#`Va_Iǟ  g3h`j@Rq}T DĻw+^_xDsE0!s urix~cnݘ~#׭nZpM2ξpDf%eE?:=;*d~RT pؕ@dB&-B!2=V"ƩۥL=x2cC+q!^g5Un$վ=Wb+y'eov_:Ob,ϛs%߼^ 8=i 0=l3KY ݝrA}>MD_QH :ANfrEs 'ѯ&TV|s5#zAJ?ŬJ~1ԃco1r4EZ6.1 c;DY_zgW(QK4D?ؘtꄔ C@RN L) m~*?'.ͩ$,@{% `-k,]P%݇ψ!:~AZ~0+nW#zrmzcCkn+n0c꩛&Fޜ*qI9_g%<\(z (5Ύx^׃l":m^+(2p4OZ dqK7?գ2\)z>tKOp&'?z=?#+bAQ} '5/GԪUz2fҙrr{lpVڍWnWmKVn:3G Lj!̘O 9 !g= GQJ FB*]":~C­U IJ9m4P\#fzB3,xvq;Hwƀcn()dDf2{mc =TmHz{k8ӯ{ Lp?jClwˉGxlmEǏq$"dሿٮqզ1+u隩t2c0Jü9 .se$ Uu;Vƅ.ɱ4O+g-p&O C"t:?7Îhא1̚q̤5ꬂіvI} B%kaITspSh[ɪa A:<|f,ٶ1x7XڹqoYO_S B+`j^*3?ʲ͸mj8ܿApDI3f|#*X5V fB%ut| Z/7Ej@7F!齤{,ɚ=< 01=r$F;m^`r5Tz,IE'gawa.pi h#k-W$| /VolE0>64ӿ@n`/ַ=ЕwWmP1jlRMo ,(GEK=5WeHĨII -1 ۾$;4HV2vNA_+v R ?,]Ș9`ߋo>K-a=롫7.M,xA%bMX􄟋1:F?JNfWl_|#(ҞD)!+iG6x[qeDWVaUMK?]Z~ݏ튨 2J֚dm !qÅRunf{msIroz=MAJ|4&p2B>̈ bk_UW]OjM',sCܼ] ҆I11!pG˒9O.LdGD-ѻp?69 o6%{wMdL^&7)D 6֑v345 2{V_sB`byc/`U+"?aStBR.QW!v@/oW~$h9/:3p26|]焠3DudxE-4 fJPD%n%cUL5[\Fs([$HC+"/K_Nldޑwx-ǐи1# m +4A-x CN}%).8j̩m\܊]-Pӯ_qhe Uv#N|u:dž' )Cn9"N[Y"P^`| ;F,X4Y/sXcje`MZJ!{ AA z*Ue2WwՋX.1x0LgRA'OKOɜEZ!wQ.> 1k,m_tTz t[tvi[o 5ϱ儥P;"͍zHˁZ\Me} V5V Pn ԙW&Ğ9 ˮL_Tl1F}))(?{ev3_h1p AC{ :3:wƋi-BF5@a ٵFőEZͤ8A^Sc2Lqxs> AV%W #\-<w8N,f~Iıwx|2C [-F||1IzYWP(F t{+,%Ne:=A`3۽I ?Q閼bɜ%"T~4 ,gV%Ҽ/\/[ ̰2FdB*PE\h/ޒfV"&oKT+}c }WQtTs/.n)`]+_Xʉ1cO8zʽlESyxĖ9+PT;̨h,ǔ=#<r&FPUoM i㞔Z6P,1QȘtcƅ6 *쭯-YE' %0%OHSxY[L[YMo`A*Q]a껍jײ7Cgd_ m_= dqA* -]jHl.7MMRM|*P 򒰭\o)5vdYry$jgZ*95QY+#! A& .~LKL濹bk+m;뭏0iEm 4>$ <08_w{#DžRɣ>,JiiڴQ F d TSY r@Hc#6w|HIHs qLv0{!}ɕ{[7y;f lސ(ܪ_Wjݾ./"+>ӦG-Z.ZUoZ <ˆս>kr('Πk}(&ǭ|^%bzoJGy?-o&@rrc&3`Nk9~8Fӛd|`)оFy7_7׳.,hT* s?(D͟}2R{LL E1N}[75L}-vJ8k#ߧeqy$y+Nc u^[,;4U]|2LF۲iCve Jct豤CW*x1L!Ss̑E*gF)(԰2)XZ9\ʋO5MTr-뎾 )ΊH@sa( \Q;svD ?_2mZ;PW(Ab:yT,@ypRe23͢<vԗ{P2 1 |[^:87&Y|%sG?oCuqXM'XuqK3luȸ%rɞ\f_onz )թ&_h0OpW%.- 0I,4K$G  -H@n eƀ \IRAjAgV$a*,7 r?GѤI/]6p8?iBhp ff"R@[Hťv0;R\5)SzvDN,wVmL'b7f|w$aA^)7plbj\ !*i: .ֶ{ Fc;|jy)O#CmO j.j[/ȩЙXٟ{7m9 7b VT<[A\|$,R`XChh)F G#70[*/ rX:/. lK|ĬBJ#@}e I@䄚9@MUL_3p-r RŢ׀p5 ;;%gE.-""\c4\3+ώ05Jk,_[ؕqt5"F#Ž7V\HGŴP`+-I'C>5;SR0W`:'ܼ H̰4I.4{ D?B_+C8Pl2?})wݻzyO)$W+m_PAXNTih+t<׾첀ia]pc׾dU4 %YJT;}d_ZRL+Jۂfܶp쩬uaUeP̖@ \8g\G81(2Gs 3~GD1JE~}Y.p)[)GBTsd A8hcw m[,^a޸b9ƃ:9? І(N<_1 Gz!ՉIp1Ij/b%qpؼY.P/1uI(jmJ)]r\.|۟b ʄ wgRD j奙'a֔)!Xd`jG8(Byg ʊIj%!%`@Kq}sØ,BhoskXE.QAr ';.ݢF1X3Jfũ;ÑI%ީ2EynrQY> Ni>bs2^EN;TAQQ u7W S TA@˖lo=MLO%Ѥ}^Gu$->Mz !#1eEm[ l!,V.E"*!%VtإvV 8ũ] )Y6 .>v> ݷHknMlSyueا']e@#9u\CjX:́P넢 ].{ޤ:Zw`2>^*4\w86yn.۶C ۚojMbvII sSY>eqfcLL7:+QhU$\lhҕ_p4]%.?+V5CE؟_L+[aXyu0j?nePâKc>\Y_0>~OƼjhHo$;ak,@_YP*}$vQݧ4:/~h^ZoFKV&ՒTu]Կ%%EhQ7_HEobً/CnAlc`/99^ڐ\wPZjEl==UWцЛ_A:je _ j?,+7[w4-3D[<.)>+t";&mE0B=|005j:@6}|0D9["#=,Wivz_#wG)!+ڛm/l޲IE.^yȳr*Jr,4F3Ja_Yq"_m&R Һ%mCHP!'_ ]On,YT˷,/ӲFPߑOe7+49x5u ڪkǬ0u,ߤtv:ֽ[jDLwς+_*.]YMfV ="j+ɋDVؔۧ0o{ /|Ͼutk#ܵu~N?r*{<nG[N !+ X6@Zm+?@ 3Oc)$@m=ėzBuF0*QiĜ^F'EhCJ/0NyTr^9~::]T8_zHGzק*:;:'|*2w n5<nH2?Mt f&]jj=}Auh싑bSP,6'#pg mg<`Oz:V>VzXD_}kk^ +JCP]U!svUuGE\^'ǿa/mb0~}7D uj;M}ʢ_T}$R!N@LZ׉WHuu.L4^z^!?Dv6ޓ\guƔDdzvpK+Xp3K]fYyi͂^;`:H,i/XCGб粯iZ2(ΫmFZ7d${ӆ**Luj"̲FqSg(F'8@Daxe;WO+Du/ZeZ9 g$85X)6@DC=SK+#C wR H(>׋Gwδ5„G)WRqXrNWgI:?Cg%= _7N C4L!0w/bKzIx>jЎ`zSyU`.X-!lT'囖c%87H0d !V%V IN%W3"K2'%n_պ#Bͦ3jKXfqͲ}b0Y퉦ͶT!\̮fgEOHyz"VLZ\˰xGCl2'Y7X(a\ kL{Ƀ y0JLO`ުD lLXx:l!ꎒBU5 k!+Sw(FDԙD-ww1v[/gU2 251Gϑ*}ufhVdNDܳ#zVe~ aӢ~[b+?F >qIq-MߧV@3$/G*՝#\lGя\1+kyVxU?H:kwB]%fpDf@>i =i.x!Z%߁+G tLר|$|Đ 2sUT9)B;;(Y,p1fa5-Ǝt \&*B>Ŧ,L<yFobM#f|[7 Mnջ8*IV !' 14]opT]U>^qؒ7EU*-2tթ!eZ^EZۄ1D%`6qCM޵tH,RM@OgaDVs;8>>^W>TzU״vKyqȋ-W|̯ЕKzMpFP*!?gy>TM@@RH"z HznmZQ>`*zFsGʪf@OR>7Pkj5=eJxNeAKpbeT7LM&tꁷH (z2PCeØT2a??֯ 2K4t)CK=IBN*莹) <'')AeB67֭@':B:J(n(;nzlx2kg+x+if#=C٣/6 ECلO@-%$֫l`pP8H斣!bYdK4YZ^1ZWp/o)G‹*Lif8ļI#ג&r ޮ4װ;DN!0B!#m4+'n؁œ0@.G1f8=X\L5j:(3VZ`Nb{ "K.Yp+$@cwX:?Ri(A7T#D"䇊nKSx B @3PR˱K @԰[Sũ'5#~Ѻޗ閁V"̡bb;T3++q;K%pӛǐ~.( 8«36d[_ 4m]?a\a7j/:H;]`iSCvk2sUՇ-vcrv$Vݶ:h=CiE6͇Bׯ͛7@ݴT<٥:ڸfRz!-`p?xUWҞ oK|8m: )^nbJ܂#_MVoaxQ&Tw=~9`vy'V-Wj 9 `h\CwVIaDVyEB9~߸?9]E\& =iKQxnv`IR iCܝ8xbn tLf#w4db9 ⯟J!$Ktc!דw|G"O抒ӕXo Y/}N9L$`dvQDžw:~dIZ2/$&A^ͅ ImBO?wDDv tLUHh;E(h^ڔS Q8VO$WNd /;pD2?A0 NnUJ*^mRQraYi:DpzN(5Ar,c]"\y;N!RkRF˺8'_]L`}eօoK[pc7Yw5 Atٰo \W;o+P_Bn@XGFyO_W˜,BK6#Ăzdg h~sZPf:-Ǚ<Ri2L^B `0k:jv4/G\#~YvZ@H_ جѩHsTz{n?VWؼ?L`wrշX܇P3o}rV?]&Yn~ <Ӧl (amI7fR8i [N`3YcM(1(;V4" IG%w4DJ;YŒdY?KPa"r; [GSkY82,f{ݟc_ϔU Ak-Zߪ9.W@zT0њsV୚FyFTٵwt<2:h{j(ę4 w;h&kWS'mIKg _ZK'0ydC{XobzZl!. e [px_r O=UbՆт~ʵ=xT:h E~t>l滂٢}73)HM5td4Ό_NEWcQ5¸˚ZJ<ʚm XtTOQUo,wv*:A0 r ̪S,^ +]r|| :|iТ-k\A.R/1aPt#2/B_*n~p^KUT}M#JE.2s֎ nJ4_m8/q<^XfL%eو;ʻ>tMb({^_-0|] VmB9Kѵ`(aB@r&G'ٮ|w%~aܳBx؝Fna ci\CCmuvZ+^F!s/DrkR|kPCAf4g ;7l)^ya}GWs˧XךO"hcU`!)н2A&>2qj-~yȓzKp cM޸PXXDIn1^~0vG` 1א՗`=fª(n ic#g> Λ0Q COD 1bWQ_8& "4e Mo^OSwL[%}ݶJgvYpEyۯ3e"]Z ?#4RR; 4[?>&]HǡX\Md:W}YXa_^wu|4D"  yڴ]cӠD.M'&L͉O\ NdMȹA!o} [v;ц`6 h/P͟eഄgpMO*nn t)&>lӣ%7yȯ)hBJhA|F!"n] -YxDseWo'b%/~>6?]a PE0ٹes8Ic! 1nwk4a'5%a[`RY"%f栙.,{V8j)UGrNAǧ{4ˠ|+-ޚ [֝ljӐ]p32kOy5FgECD%>x7B> e}T~p8A2[)CTaFVEIw%xtHo_QGQ+0DK4oM^4YRjFK;fEh _sHghWbM~8a41+[;-nrDndD}m;$d!oGPJ߷7OpWX+4ͬ?v-'/4RcÚi#SyL3 BA:чyƴ PQrT𝚕{ i;|yAwCeD#WX񸘁qES ݮod zm1_ 5B#__@*:0TDX1<69+O (D>TR92ɮ(PO)6Gzcsu ǹO in'>9"ǃ"JQf/gB igb[baX>p쏴ዹQ(Ȼ*0h@O4 K}_@ !JUD(̪2rmb7K@#@43X}Mтw+=ͷ]>?. Ns\ v~Zc"7WaXcSYDU?'ef"d9?4>ف>h]J's-iCD|S" ؼ.#vJ* lB !@A׽ʲ%=Qa dhC[4\ F(&av3͉Xƅ!1D 5Ј<~ǕQ_45.qwT5D? Q k͈ɖdž2V㪞nZJ/_:6 *^Xܡ16-L[x H{peyrڊ3X'vĩ }8 z%}2w| {`CnP 'GU͒^Tm|Iyrva 728uz0j.I e6T#$Brpm꭫tyQvδW[= \sQ a=]9'V8JX'Sa%ګw Ox]R\Hl S\`'lRʦV9T *sY"-gj ~n}~)Ė?^|o,d&I~uk:H7?a(U$ q W4Iqg7,Qm z5Su`0mpF%-O0# Ӹ'h|. $iR™ \DwE)~Y=o+&>gu@U3f> ;יDdEn "?5{)>vt1;=w%JCt oP>[ևښM47S=-_Z:Kz~i,Κn&闑_ufnn?YUJt$d_kWd)3'@ּ*8_ x5 "A5LKctT %2b7g|ȌEgV$[C͘(oo2w*1fCKᅯ7}oo.~+sf5e 5w;&?͚!((Z746.шcЙf)7NC'n`3T\ʁ90+q;7kxt  q G)IfJ,ʩyvgt4@5- ",]#] [<-3O-Q 5c'X;}MypMJ* 5L L ʔ|L0?{_|1aVkkr2b(H'QG-][fd K"=WP2>D$ Sp.M9 VY({:VКo`ow74Հƀ/4yvC+qyw"->WebO|T { /΄JƙJ7$` {tp֜5;+%ԧlJ ]9\@1⒂FZi f9%EF^w~y,8ѡPB#P$O,fnsVwZmUEǭ18Q grJ)!},@Nzjt.AYnʳ@tf 9QW!B9S󰥉gɄP_y:Ib07G45Q9yL #Ŷ  Cg՞Oz_k \8f+qVEFĩ&bh ZOJbаTV~c2i9Xb-%\X` q -撨  *ˉjHs{Xi1{صJbga}0"_A;Y}$>҅ gUl KJ?ܧɳl;5ю(1Ӂ(ط|d)1NMUI"=!@^5S0f*6I95齌nW] NTذMC]P˩🢌ݚPE;3i+,,]ByV3KiQV?-ȁ2 /8R8g )$EGhxW-%b8?i`Do{׼1J7_٘#>{=\]># (GJmyZ 3tO*OےV؍䃶r''z8@#`ꞎO{Dbzl"H+pi "<l3_.Jj1m?PteKjP;ޔx/d 6O|J Fau勹zƂOMM.2T1 Uϛ?f $bb[118;jiFx+ Ft^P> ma%|TU%6rWWPk#sE5!l8ҙ tX9or&x@ Qh=wmlь`ZTdѽrYXyzC{$=*cQ-]vʮ^ /RMY~,\}Šxf|~p]~9`О֧uQ#c1Esʲ{:F& KeCGBf.//".:%㓩'hE"ó"K!GAY/0B,YJE ψǒ;QWMM 17vVc\GN#Tw/]zlq"QT*{8rGwCm袐g@He{1 Ϧ)w8ez΃Qm*XxHdD,š$[R-,h%sM ~o_ :xs&)!cuU{iAZ i9jRaTX%4%$KX]rľ(b'vh+]|&UW3o[ iBH0{-'K?sV`zz$6Z*fzsװ+.~ޫpgptM[8;A2g.ە 0X%I1GBXϖgJ"YMy .4[}9-q P J_96ь ##rZj Ν:ȖT޴2zQ}.~NxBbL<5K}P͵\9g!8ea@RE%d݅li$CȪ|B1ۉ/iZc9 :O䗮! @0m'FFb j\SSZn[]tG`eC=,5TSY gjUxsr,Sb27AeM`QA/FPC~5WCeyUg9.|㶃nI2ЋfID]5l #h̵&^eIN@15׻eRO(]ޑ4Ufh1r KkZߣxCRR;,AWI戵*4ݓzZHN3wW{痵s=Dڶ |Ԟv( Z Z8z5a)xdm] 尸@lJ\Ԋ([yW:MQxxpBWbi)E:щ! :2S56?M]y3İ1$I3`,+,8S1;;@e]hQ àC*Dnz% uafv3O6BNBF2g- iM?-RʟC0KcFn8#S :dŗJ.[,fQ@]B0M0Ipbx.7p胗QF-~B Z_D}y l^◻)puPyta:˼iVNJ")*S#`[7CdP3zߪ:117E%oSjp u hzWJrkR )R uf4p@gQ! īJꔁ1\$ \!4pHz1(jǺ"Wnᐠ -:W8Ă+ruO%8TAd& c%W 2q#gG$朡ኻy ޚlRfBB !8{F7&lHk)BaupUL׏=Շ )m4O2Bn|1ipVU/rvW$52[xjE\iɼ_!0?^(h:4ǾuPJy_ż羓fv VɹK+my,R6K)[}>7]#+_odZ ^e0;2$Bb.*5# }Z %&t~_p,M;ܮhp5gdBWw1 .1dm* !*{Azd.FqH%c0uI'Q\-NѹGO}23e!llTdqZgjHh/7ߡmq>K2ڏ'@/6YcXT\xUGYT _m3-!glw}0S {]6;ڦO3/tD*sRD5ed3a Lӕ&E}Ksߖr^w`l©:n(@}3H | ܔ4۱$/vpBޟx+ߐ+g!`)!GOm^4\818\b;sFiXnpJ^GԄӶ sM1Su5+M.[/Jm~m9k1ִUsLW~ uAhG-QܶEi\46+ac1o%R<ԲSrZiPjMvYұc-{fZМ$v@EG<0ᾃ2ekNF:h L#ퟷl3XP4R3*<Hj?|4"4JlFЎ>3 q'K {Mx>wt?duJ2U^FW޸2(H{ׁNՇ m2|? =DTfZ,(zɮX2y  XGP;Ͻ[ɇV{\#._* Q{'uW*# P} * Öc" .W9ڋ\c3'|4& S6$Njz,߫j ׿IH |i ^Q,3S>Ld$=x ZCo@'fI?'(}mIݽ7ǵ kTVڵLX{_Flw? > i6lL:?B&ApF`YmюQ"y䇒 -}gX,r<ڼ H9\zv*Î?oǭI:ezu2YK<ȞzI'[%Xс fOxsu2qjX&<}4lN?utgGkh+yfiWHau."jĺы-gf c/cP[4~B"Q1}M蔲j3zrJBmGk A͓Ax:PcJ'U& Zb(3.Ldìaޣf$ifr5r m_s$1UnooXXdja&X*Xbϑ"q:ͬ[7Q|Rgl αG e᳽ȸs٠™#m?vD7*,\^?$x,=^'b&h16c"l<%=iD1b:VfgS~=]G)ty5ؒS>dI(;4cU4ٜ&32b!Þ#Kݫ~).ĸ93RUCq/$:|byAӦ.®p4zŸmVZs͠v $ {c톘 c!tbn/ƕwQ`{>ٖ5R9@{op8I.y}BT8Yzԝ3Ա60MsxP9g@jt߻!X"jn0F 2B ] 66%YBG˸PQÆD#է! #7h2~O ̕bg_Q!LuNLA0=XTvi&E9C"7zQX 9¡:˜ޫ($ԕ` J`QglP ?ݴ*D6~3lj<5:4;/d$ݭ{ ]BtN)QP8Cm=TZZTZ"%pbü(W^2Y./#\~7Z8=$&x Oޭs=\a }+CA;kyk_&ŔΝ~^KunQ _FF;LpB>e& ٩SMS)wqRlzxyŁL10}mu4fgCRLq3Wrh[}_sOp=q^f3gT;7^U`{BOtH #DKsZc_- P F6[v9ɺݬcST0°adh 黙NKZB$)P%lTs|Ah x&4w5CN bհ˭UP!+lIjCJz ?I+^lC@.٣ 1PSګ&Ѥ|·! )w,'eGejqqSf|&OhL2ƹQ4Νem`;>>D3+Dװὀ"P3%+1<\Q\L*фv*hqR>KI $^+0+T cᇆ;*\ bqQEV 7ۖ6Eww008-0nuDLelA"q-, & Uggh.,O_௬~ܱbN >:#.ƥQEyڢ;;i՘<ŻϧNGJ+=Imθ-!ڣ D)7&ߖF<'T{8Goס2)"-VP)5!bx{DQ뭢bބ(/F $d24%C;ߓ.[9 r`/\<=XB^6R{1Y;Y#yqGA<oש6'tG@|^*sK>VB'jm GZ6z!~> JNO,đ>#2L9C2!d{EOU |Y &P~Z9Xٳ HYF]+fNMR"Kj%guoufpRd:br H*Ꮌ;30o ,~5wȞuj~`'"iBzE8f◷8q_hh#~r-3 }vj8XlMrڔ^*KuxMX h)20t3:n׋\B[S@a~` SvO E҂G0!1s:_W$MIaXHG1!04pC>Lz%—oN[@AvN^d9\ 6VX`.*.л s皃.sC A}IAHۙj]A"Ю;:JY6Y5^M 8.ebXJk\z;u#$Cm&W6B;p)? ip}L-xVg/^;D(?6,޺s)^n rFH ::2݈CH$A߱K Lq8jp^ob+B5JRT$9{&?|!׫E <⣾ >MXB_#xkE?i (uGy[ }kSx]/O%ssOSpR-6@F4{鐪h>`F~ۇow̗ևL&\ E=<wE{Ya;e:'Oʻ6aRܽS$yP1N-ί,OEmZAu674(rݠ 9u蕦x%+m~BLhVBeIT`hvĸ̠ - ;h8H%/o彔c /DD3aa@Wp NV$QeCERf7}f`tKLזR ΂=ԓX,\5z "ޤh.% ']RKi[*c)G^٢7PZ5݀~z։U* 9V Q>'E)C04Q'_B.` s /K6[BJR:%&vriL\v{ Hp[ `mL#1ux^Jp5T_T$wFJk44=1co&tngqWaܐtZ>3"Um,eȋeOgOm#ȃQrǩS"%G~1pp̉IHY@2+Єjc?~R'@`I,^R0=NΥ/碽B=Rpt ˈ-g(9TDpk*R>}XkWT5LU]1W \_STM4y`- cI LG8$N&E$WjH4Sҽ(fUije^}ڲt1,#}NL9/0nf7"W7A'C;0rJO mꎡ gy8ygeßlTa[G0v&GzW\Y0V( vY:(/wy:lb?m3覅pU:{9)y?*}A! 7c a80nN#5γaPC@:ٻA{SKUq^\%&=Na 7uͬʻG@ա1)7EEI5aŨ* '߸v ~Cٙy?UKAtSx)iqoE4./JRk$!E8{>56V1f,eX"x5UI(M6jso!7Z:!La~EEu;؁Og=ȏnTS q괻}sSz5wMĴ7؀yBy5i44 >Lf?Rp;&}KlCI>xGP[TDR? }cC3c| MnmXKwRR18HSGIJ(ԙnU4 QJVtA e;Mš>S;|!Nefx o>`-"f2ٳg,SMt"MSP5* uR̫@:CpL}!-i_ D7 ~&vlW;!<)$CA_芷lB) C$SNGU0O ȉK̵1@mo8ʷ^K]L>:0f|Gv(|~7, ٗ~E_kX9y0Ǥ1Fbb/# fZm7QwxzՃIɈ^vͅH<EX 1U%Qn5rZFʧ(o|APdBǪ7X æJ ~&~޽ tLG F ZĻSs wp~s>_bϥt̝N.#\z}^By/p!mrb)"6T*~%hemۇE.q fR;Mod~xTvEZ$~BwŠ"'V}+=676f7 ց#qu4x >fx›[hU-"IiJ|Yyij(> BB6X;b=yӤNy7ݖ_|4W׋]Zh=lȇIb=2z:c ЯrG 9Gr{e:U.z"mNcHہL[^cA V`@\똫)>#ْ> WeH}Oj.Je9Ѡ$76Sh&UKo ]]nů"CO`D@՝RٵIX*EqvVIЛX 8@ډ Ub4d`̵AVJ@ hP}5/KSHsђFRiT`i;/2qe)KPne?R'Fآ,R9BnFJIO;zfV-0w{zyE}ᛔ\W M,H i0'ka;,Gt1: 76[W*aݖ㵊WWهL:)q݈Rc~T Y:̂<: %QѲĤ5o.i>i7=Ds!aC30u`Flkc.b\yd^t/0$㿆ގ\E'Cŭ(%"KqT9 |V%WFOEwẖwfOIVrtMk& 2[>$C_5Iݔf3FetG} Z>>+XA`\|pWE7,vh G'cKwA>O| u"=tWVd ܪhin-6S~\. yPIͱm+@"Et78HџZWa%D\sp6Lam\]YGezShd,'):]^gIp|;r qBn{wjT{~4]CCO=ʽrI#Uꃶ:1olk K֐<}ڛH^~L| yאpKYxJuwc4ZҌLcN.}G>[Ĥ' &*FeL*M4.JU_ȋf"e^C[c{12Qu,18&Bvtm~]%/Xw 6k;4,O'rs+mY."UvM2GWu^8TAIpWCCM>eixV:D?$EK15٤t(#uO]wS7BU!s$H:Ey'xdȹL3_sO0p;B\',𢩔DZ!;u1ō.E@Y$^ eY)%nURaj\hf '_36 t6SrZ)aRyoNYʟQ-D _^u!x ga ix4Ej_9 )J%UhKlXgk]FnʀB$9Ok(ю ;-96k?i*nMaJҌOku8T,A CDڬ^jʼnAx ?DR=\UmiQR𖊺r领唥;-j%:aa>(`^vF>N]a8Ce7vM띊Y4ΩKAJDtKe-8A!sa/Hƍa"iRrND iTfz_=Ɓj_,8Aez !W1$H\?ErNu愉f}&@ Q-H=< abU.DA>0yl¥f\eP XYlmӽV X>2Wg ǣWۛ{y(n\9ъ( m 0t:r3VGKXHGG Iӏ`e,XߥlVt/RK1Y)ïhNe"pNH_xjJzϯՖU,ʎFaT[~Q Znfr2D3bPJc=[ [{BBKޚLna.~.z"5X-.{ Pv$q,Q{;Rlg~8uɰ2;r6`V6B~% sNp厺=̰> A}OTFP>!_j)k p )/: )2&>QBz*٧n{V,'~Vh\z;FD>LjU &?rYzeUsեm͏|xC$?)vV!6D +0(PUO<'vTRuǠ;* #f3N֍8)s`.yG¥}0k`' ʫ6<<9ZCPKouhV2P"3bE[zs2ߩONU80' ~*kfsJQϤc% y YTvoUD}d֤ Zw]aC>33Py{Vn3HBiIJg%g(Q+ nm%x=MQF!'$Ix?7 3R=֔'y`c\NbѢMv$n=NTI1U_L'*iyۤ(S2SyѪx]Bl9DlEy3 g,K JX%݁}81:-JNi8Lcq[^2pѥȠdIvͭ e8ȫ#'7UhOĐKŇ. Z:ɩ-3Oxz 6͒w,e`:=o ~Qqn @dL؂@~~!ZWGCc2OWƩF\ٰ P9|Nym:~}~FR ={ޛef݆\RE\̛hZaZf0V.lfk,ag5{+@Ο>7OS IҼfy)~I|S|IgW, aszE:Bo_?g*7>r_w@ ع[Y.([ʋHX d+Χe` QE0Wj #s4}tSns'(sULxYpv&d5[__W}Z^b.t皨߮)۰Vb#75" X+Ƅ!v;d[]'&]v,/lSܽc;(W "/qٗI ,$;XHSq%,&n,o `F yU7&uɷjQ5EB%Ad8hCzQ^-sXx$cQ>pӛT3=,φj!n9.>A-?Dg3$ࣥ;LO/gB>>2\ip]Se&DJ'FR&ĢS\El 3vt-1aU^q\ Zj\q?Q:2?76Ds0 YZgstat/data/wind.rda0000644000176200001440000027772514127330267013767 0ustar liggesusersBZh91AY&SY\^XBƱmIr[vwH" |fT w>$PD@>Qb||yX.PFPh=:@ R(`նP4hQ @̀EHh4E (mEB [`e %SM P!B[[`(VP30֍UPd`)m$AUZ4 m@DҁTj(+fe֩TfkLRV(SJ 4HDbmPH1F E(PP 444hF4flF$BDee TZ emhU4f*54ʙdhU^J((| &t7^}T RP>|(HU Bfh ]@ {@ I( P($  $ A@` Ju;ZP ;pyPI"J@ n@0({O5a{Ԁq-PP}"%> U?@ QѦad4S$ITi OODшi4mM  T"E4=ATښe742 B&Œ#CA@0d4I)ѢziɑOTM4L&i꤬ EC2#AppEDr HnEɗ9 rDa!,CiUQ,/C0ɶFU7_S|<jZ6_*_T$D'Eib*ץ Xuˬ9V s w} ;?JANh đέڱ8Vq/E-߷쇕Yc(]խԦl_.,im/8*hLIiu_ {I" |([қ0/P9L<ċm,^/䞽No#B~Oeu٫Kf_֨>k63[z{6tYіx lr|p]0Oq3"^~9p,c>]=o%u:,?ogE7 l+}\-}n{]N?.#ChδBCKD՗=d_|L!E;#Y\TBEDLԘ9]lr5`X--E=}q}7z :jHA߅c$/?:59"S5kH=VĨҟk z_7$CtaugEW\}ZЄ񾕿t;qQ5d2cVe\aNr,:4Z%λNT (~,0kT*%M,A:Cw>6=I[: F'ik6wqe:9/FYIhly.;z-8oS?jQw__Ov΋yMը?K2ې~2!9i9Q- {ߨuλ6 ͊/jhiv%4!L_+@sϧ>^7z*z?f $ןLRDc׏o*'\ԎZs=I6x ;ނ1źh} *r ޼/q^ }?ߨvLzvU " -r["w ߼;s-C\Yz,4n=hOu$+\M7z{F`xwn;۬W_O[&;K*a>~p*W#_ؽ}6o>o}=/f8\xQ׷fN<ݟ/NYO [䇕:R*zm>{;Ų(،EY?ѝևǝ~GDŽH2ـ`MHɦ'Dv<zUFeUgiXH:6mT1܍w ƽx oի*]@*xmz|zۙzc{y? ~_0S!Q~9P.˞48Uj1V!//RᆪSz}oVlA5Y?\{wT< W{Og]eCPN#_QV\~&1/$jQ.1~}ǹ3n~NlL>"o8^ry0rv@Ӱީ_]wmpC~=3ڻk}"E uM Kź4 U{t~Pò? "RjœOl^^JK~FŘsݦҢ_ު>>:+M1ެ3О=O*c(l *Fa.g:p)o[?|$._QWgzGb#6?3޴ZN}67a_+ZNelK:6;|dyQhϯc~Ǘ޼Gvއ>}}B?_u]w!&tmh/4v~GӞ:=t5 >u ,x7ǿ]OR ={ݡLt N摖|IҾ mA۸}J1'=|J>מ-7F;Nzq4эǧ’D~} z+۠~23/.q>xp'GC=8RX%I''IewlDjՖ)])]3|܃>FPMJJ==W:^d}~V-]Tt>}P?I砶ze]dۇX'ۊ*cرvr_}%!⥠KXž,{#G}'5ݝۣ=E -s^?R9y2;}`JKcs=i A{y]/jV1M~!7ԥZgKw?F1'=|T/g^^MSs K hh gq|4hR6<0Kc]Д^کهwzCߓj?<?~=6c#]4~0F4x:gXW0nszbG[i&/˃Ic}%t/I3$ԉU)ufĖ6?&elz=cǟzFS携gע2쮍ɼVFHs'1cAoY>)JSżyjb ݼ/G  #!|$ѱHUգ{.WJӵPn; t>cf̭}ŵ~_%abt|OGh_oH翦*6n3ϻk۩brc-S1]Ꮡ G[B|]F91T1{?jCUJO]cGC*S\?oG.G*25rn_5-t¹jQxp2|tsOǬm TODꑢsJ;u'7m}E ~=WKG]qRd*RJD`!=Ğ9y*(\kF6ng˩K(neTo.4qzzDxU8Ӊxq'A)<E- >huA%'_S>UD x-Ll}O|7zʖWRL '?%t{x᱉;x3u>>ܗh9~l<ޡzLj]WXwo>6Vl~i?S1[%%TM$\ y?N¯T AT[xrKz䕠1a-ӿ_}Iԃ3; <=oG|TiRIW4=meo4WTߎ+-Ě׿ĺy'y.zP)S|԰ɿ }k׏縭+v'+ KqҦ{z]l 2C Ge*bփd8=4is&UoLk_Z_n+V8ʹg$'H/{@[la*IDw,y ͡Gzn~9^a~Kc偮zg۵G Xf>Hۧ՞]^ c%ǿg㽜3ȗb}oz "ŦǞwoJڬۧ̈wK+ ^_ΏO}Eÿ|}Бo%>] s=mD-o=0Ai׷rVX Z|}ߏ?yr A;FAu=z)8߿EC #fb?.%BXKpkI$E n{Oldb(yEZJlFg!8RƏ=`qP,ױ۳ϕ\w_WowJ1MX~Pn-(\n4ڏhs ?~0./7}<+o'lf7XkUaЫ,Jͯɨ7IdhFآR7*DKǿZ0OyC%ɡnЯTTjGf̨kI0ov;xGk=~S?cd(֫7C~O^gJwr|pP];Vq/=˷Ahƍ2t>՟d5Ϯ+E~+^l>^3"+8 YQG?}j~ؑ>џ>;!>aDH֎hHq.|xgs~ivLq_>. sBdK?`K?֧[ֺ|o^5H+_Y?;$o?wVWaF5C _ǡaו?~9> s0۵M4TM7-wy@3/Ǒ|?mCs'E~[Q'1;CæUOw?_̗lKDz8ݾ]~#D$ևKis}GwAw7jsгL7 \'yR._T>_[`1p9eA% BؗYcc'\G88_"mմ-Xχ[uvo#AWǴ=8 EK /vo!'C/3c=?C铋btg:/2g鷴MJK5<$w|HӢ'6umV>vJqc8mm@`㒳C$2}q=NSC|9BhO÷tvc~xꟵ;wsV֫Bmט~IX^O~~e6YUEեQb;D H#Ó_oݲ}-ľ:~cC< ke6gBB0k{8Zݻ'`,E8 Tozzţq8m:4-.OS. R7>?fQL^ S:#EbLp_Rޝtul'ǿ7wq|:Z3kkZwuI2g$L̓||?&ۻ1ǭ=NISƙ;^/0;'ɒfIoZReZ׭ Jk{jomVmmlZEQjֱUQl[Z5Uc4lU+Z-(jXkhتEmEm~bՋTZŨ֢ŌZjՊj-Dk-QXj64[cDUQ\h5F6ۛ"#dlXm(jѢ(0QUm['-jwjʷ 堣DrkojmkiikZVmrڊƭck*cZrTUQmQmmmj6kkE[m[bV5mmkV4kcjh6cVZmQm͹mU+bѵnUsbcT`Fծ[hZܭ-Ŷ*ƭTkE[cmjUE[\r-bUb5F5r嵍Ib֢[F֋QjƷ6۔mmbJ ƭ6*j5W9k[cVܱhbck𭬿jV[[UTjnڪMl[vWfTڪZOrS[UfTj[Uei6ڥZLUUɓ3$O>lд^GU۶cnn)pКYkn60aMk )a0^JnRnIBٻtKmmlI[&Jmj֠Cahā )BScWeͅMl[u96˳td:|cB1R:e3E:4 zJ.QdX#)`EPHWL$z' ku ,;d<$bV kbА{_xv 2X`]5l8k0QV/籷Od3TGs(om/L5WzV]f%Җ+xlWki7}ųب+D~ XV&/}?R ȺvMf,*h~6W1 MըlKcpnM͋u/ʋS4$_m˕q9ՏGʡ9*s1\Ϝ>zLOv>u_Ut5XѶ1bQ(*4bŲlhjDR+bJ"(Rb6-F͋QY"(RQmFѴmmKܑ60lh5&(s\ԕ%R&ӝF&ŌR&m)6dFHk$b1h#Rbi!*(J+"Bƣa#$@Z1BQj"Lb4")3J M)&$!6#lc9td5%,XmE)Z#&+(*"L\5c*IM"B)6H4`@!؄*fXبZ4Q (H$cYI(&I&$RRi",FMThэ# ؂d"ŁFH`i&ةHE$bPmF-%%b(k%&#b,n]*0EQ6 i1Ii LɈL, 6IHjR!,XF"#D`F&ƌcC FA@1&#PT jK%(FiQ4(Ɖ5& `"؄4Xcd,ʼn"Ieb1#2ȕ%& EɊ7,V$c 2"BS%0,6)$Kf4lRH2I! Tf llXH3PlY,) $"a22F5!4(2 1%&ɓI&mE&)biFF,ȉ1Hi "CA2ƈJ"hjJBIHed$DL%AiABhșe "Lb Pl "){M b* Y 0Z/.3 ٰ2Ye4B)a &hD؈4$b(b2R @liLƥ$d`R5 ˂"ch5Bl`EqXF(i cE dQ$&`FY2)& 'd!5 (2@I (14! ,bPeђlN\ę0󨌄#J2Z r30`Ě;""bԈ0LΌQ1$d4b2 b3Bd!(ҦiH2I;&ΐ#Hf6RCf&4)@1']&c0"3J!H,&@ˤp(df$Sw\&Q#f /wiXE0eˤD&H0"\IĆ fȜȅP0FȢaĤĂE4c"Rd1''ѓIh )1Ff!f20fQ1SBhޣ 2Pa^[aD эh YQ]yǻRaݺ& &caZId9ܸ4Ou Q) `yCV$2#3$mڟjumjjm5mlֵYV_i٦V%mm[[VU-meCZիem_kkj궲Vԫk6խ_%mn֫jk:[[j-dɒI'~3俽_RM`KKݹB:&LEG@UmKa,FV2m),,)\9zx؆e- ՞،YXAfRcf4 #"*_˽[Y^Gjon!Vݘ4:lmx2D~{<ϸE]'@}SPW|&bF+ЙA-ٴ4:ߟdhVl[!aI)h/ƍroAt7J9%} PQ]"=$N'э}ɮ'k5Xpg@mæ+>gvPct߿WsZ흔շ!kF-ےD$'?Ƿ>13¨޶̺^8ԭny-O-~r֯BTO bGv< Z4IBV2BL$P⫏3~.(4OקUY0nO_drүliSܰS\(6dVEdMe"){i7!IFB>NsQ䘲\70, iC?(?$=%﷡/ < "l}i̼ӝyE+ai {#)ח O)B#62~Qw_m6z- oiC;m5#- gP&!g_؅]FŃS ]Vw056cѻ; A-3P"ÁȤ$-=sFT~"KkB;S]cշMI: Ъ']- Te ly EBb-AҊ+  z*XCR0TeY N׸>O5gaRRi'OSCz\!ny2'$wf׍~Vk 1\(֝|fG&G~Tc0%tf{ӑ2x7~v* U;mlwQ7{>ډiKD.^}?ZL~3w6,7:6<9-x5t˟A0ѫ'$v,koV"m8bHa'l8 \I$fnju9NX ^]kԗ X15IeFDh&u'A U%RĄ%NP|-UGqVX:$U-W#^>h)&5$U̜N@qQ9(, !T/aPԡeF7UP@oiEdhz.-ǁK!U2 tر0k @'Y}iqX˨Mj1GMH˖24O:&2hU_kZ̢V!uDs j!s]%x>%A#ent(aa%il2Ֆ/勵&-fFMk]')FYcKbn+"u\\Ū{W[LBN}@T/]6ƃFBQ̉ú"ႺlGv2!M81.@`9PX74XTVh2QM4i{}>O?CZ6E6ՊlZ+Dm*MVѭb66&ѶQTj-حFcQŵڍbQZlT[bضQFѭXj*"EbXƊ Ţ(%ch m5, mb5ѓ[EjQjF5Z,ƣFآ6,h1Y(ATBlZKQb(A5cZ()4U%Eb-EFKIDDi6XIRXc&(#XFhlM$6*$4E&0lV0fQAF6C VFJTEFEf0AV1DF0RJThh F1ɣEHfADY(ك"Ta1cF( lL bL`2!RQb 6&Jh( Ŋ1I#4DQfd#SL̄BRF cdˆc&A$4HA2ZRa IDQ0F[k~ժյVmfmiV~w\GwAe7ª[YkUk5m~&mʶZUkkiVZ[KZZ-kmLr#zMNY, Mդ'ٹ*U[J4iR#tRqTQ$8h:5#TDPl% Gpy۱ٵ0COwBd^ޤ:Y`KF]Wf֖NLQ7ݹ{y[XW}^swv&{2dəd33$I{w}Z֭-Vm[[V5Z[jo+ڭm}OQ}7\JZmjcP c.fEǶGKKd3'Y&I33də&KY2g{;;9)ۙ$d2g3{a5#ȯ?-_Wm~J3Է_~__,sx?oK0nȺg:f'wOw#~ $,v?>WjEOSI(/wȪG?ν wk<@BIȣ֠ $ R#LFGcXm6V;r 1$REt9.(c(#ԷI¦j8@~;=:vyKN[KN\I$Ӎ PPY,F:\d 6$@EXBxXMsW;LQA[k/J/38Ǥ0r} ^ nnRȟyՊ[a&˃'UMO,VH6Ohgѣ(;='۴b3&HTG$!@a&;XEcؑ_"C!T8cג"M" Iў *Q˅TN.L5uhZjN T TU5$T;HjBڤ yDJ3TܤV2Q]XxeѸ8ŭFǸjiy2BTQT32=O6^nGcӮ cd-vq#620˶QNe汑@ӝ+VTj,A) lPj" 4g4Sj]xV*501(p^H*R4cr_MR֐TGl m!еl’P,-FJHBwz ^ MH s3o# DbFܕ4PʛPg<\=iN*.6fȐ"csm4]]% "$P81ʳC[FES véR[<%yh~AƹU ڿ5%qH ;kEO4%/gXF`l4E[蓾18Jq4QL1srWG Ek@g۪[Uv!0W+ϳ5k4h.u0xB!H|AQ ^[ĉIZoJRNg+*M" ki|ٽZ}nWp;єV8CVȕӣdT̟Ua|$s{c2L X5D5C w`z1X5]d'`ۦ$AKf%`b#ƶRnYJ;k9MP7BbB,1EA˱c ^H尐]xî)AI⯳E<:LīMJ̇Je ,Xȼ <ըCy/tm5/tہNQ OFAk*a\I ,]w[y9̩[2`9Ŕ hw6-$xNp-" "@I\ +,i%Ԟp ŵ7% F`uV,YflbӚ4ډVFhM %5Zx$^n'^,BxfGzPŜH]sIH)sG%T]lR1%cE~@lMN)m$Df$eXpC_"Lww0B@ε5V* (C6̀-f$C6c#ZV*S0+"1"[ʻr!JRV*#ƚU{v4bnVcOKi7*{m/ig;9LN'XSrzO0Xn|s7"NMQ{"J] ֢{ӌ$pʃ 5 ͨY3W,Wƣ9z4b!jQHHTnSIqTf3Ox H$,#_-ٕ$nu"<-Ras{ƙcL8 I (;ைRHkVG8mY~ sEu[`NgcmX5TDg|j7OiWm#co&=2*FIp њI(dBȹ)9&1 >DlKR+R'eZ Cu ,˦2S%*S:xlR{9y&!6agl'$ruVx,rjsF7f`ZΪJ^kBdd.6gȢ򈜖YImlhy20 !VU*Q,PDPۙ0>+ö-ǴcsCW932_|Ii8z3hԅao-xܦQ$I[{XמvqtOF6{08/q PKl]Y7/599V`֚ocYal.kssʧ'5 8t*:J+9뛰WF N\ 8BƖћ [|Ԕ8ӓ;Ngk6k-A@]Q))VW"NB\׃#g.ݥ.DŒNIѵ9tV~]mwcB8gIp).k,T͵'c#D[rrh'pseTRJp;;¡HsUcIi -Z`98O^Lhsđ84H =IQA8I )j@bwH=JL.@ΪVM6FU H챲Nv5`umI-JCmv( WX0L ry&5DUy0Ʋ9)4UJAla\qmGd]JF$T4֣uN c*ɶq< =ȪfԥDIEg t9Zy+Mr5M-8ֳqѯ霸[7`)0h]A4SDB^hG1YK61u0-d6z\b`:VvjFkjBN$%R3]r06EyWmx6.L-L{Nfa# guVc&d!|*H yMGjVU a} 4n6=<#8HA[ 2HakQexϘDʌjľ*)#ۿ+F yD빖aJpElrޒ44<=P\le/nإ8*8sPE]gtpFcJﴤ왕yU[Qɤb&*, фikӳþlE$4W+M}+vUYiUU*ڶ5mmjWW}ug1=k!LJ -ʻ=J ;9/g[e$(^/9`ە `OJJ6!HWU`A EbBV:ttzBDVKRBSV%mGi.>8nʹBwqJ:#f{ Mٽ$O|I0&SV0@цJZ6 MrAuk2!]a#YL,c,4nA@\jͅ\n)&)W e.s]! emچLl5 cH4`i&n4LueZmIv;sVhvX(KLve6-D3n얕vYJu6a5,D]PeՋcl t]!U˹nG6WH͍vn6R#j[#nkwunvWPKt֪623&I:9&g!2dϋdə|V}?=oګU魭W6_u=kW۾[v֤_NVڵ~b>wUW{mW-j6jҶ=ڵZկbi~?tWuЎqw\w]5;\"远?6 UU} kZmk[^~m>7d'h3$&L&Cܢ + Uvt);R1&%XOHș}ZBM#BeV& @5ktSRlV!~nnn13r\5K 5w*3+GV6$&$Wd;s-tOc)DD&,>u;HP&y)Qy+KK`B6I(VVQ#<=d Ogoz$;;;Ź332I^+$ɒOUkmZZm+WUko5kkkiY!W{?5Eqn'8c!#2A `.,=\nb@CdTH!8EA@ua&lt; l׋ toUXOK]7Ef]ޚhfQ+$Nn.LnY9)I-R{ 7M:[mv2 `p`R+$ Z8RZNLJיl;,EHA v"hZh+HnMaCu2BZPWYfڙ+CVp90uxul5Aj[eXk(ӷ:py *׬Su 7n1Y  )PS˒)X+mF¶FBʼn[k")uԈV5kl0,7S(Am2Z eVRpr*J6X[(YwTh^mtK][km}Ƶ[5cCo ?g^hr "vE{~>:|_}oן-Јs.LyAQ~): P C.Hqd#d$X݁pC_|"?>L!PI?+VJ˪_m(??QktА$?tej5IF Pd(@m3n7jNS?e t[FOԏ+z){?!vt)b"XMDr8.y2t2 oN8l 0X1cC<@yeSOLŦC"b,,:6P!1"-Tϊ&%B$o{Njs[?CT7:뛐0JOԄzQ (ۆ+ev fd5! 5̯">x0 ]r;!Ȱ.#.`{H*u"[Pog^ ֲ3=cinc@Cg&mLx)J v!a8O5-4Y`\}ct-.G'8Q! =B#+~?>*r[f?Tx%Hg +fLuT"Ꙧ?gѽ[o8/;Vn ٢ oX;лH94ņ^qQ,ѝy- /ll  Ň?Y+C畕8~'xN޻>}i({[xhSaٶ˯,U3T呸ip5ݜ8r8K}ý4LrrV˭$_ؼ)Z]qߖ<jT_^lKv꿁3Ҹ",T ov 8S\9b0t !z]bJ9Դ ץqnL2&6+,n`EˋgseEE թ0 %ű8إ^g(^L%f[q]@_Y,k5W,20~F RSJ?Xh_/';4*7ϲ$_!^JH Pj6躏>X\ƂăcFݸI?^Nv  m#2J( XWtsX@@<IG~/4-8*挥ٵq:ٻb3dcmՠ^ B{=&Vl ŀL=-ipdJZ4! A'`ZtRi}JT…>/lr4@>iY>\[(?qM$!|)!/Nǟ* ` iN^'ԭ!oօ-W/iIOQ%m0V4"-H~hS-MhkM)qI!{fӮǂb^E =yr/Ͻ[![ͷΕdlk| X5% #+A!e/cﻀǗT}X",2t,*H:=)(Vg q^\δlD,y3!"DeO ?9Jp"pC xf`KCu1?bww/}M R {gW2D((}ǑqqHVQ'<1MOFి¯+/ 'tjEJ&? +)D%0X5TuRz;iݮQs wHYPqMc~hS>4h%v7X0s<'s4! 1=^̊,$V*rbxI,5A.:g~;#"#DG~«VJ=FK0yds؎Ok)PBA\MtTMxd4T"z>=ɖdT[hVTHhJj`7eCdA?Q֝\>pdja>qAE-#q() (D$#Am [Ydsly:^w>jeŲ='axr/}1FϢmqfoek\N޼-etᵘd/MliBF h4y-%S,3' ~vFgnsi) vB֩#I u InɀCcGC;_d(V>7V[뵵%h"9ULD~K|da+Tyטi-22!;WE1n9d SQ' CQJQ)֥Zd:TVX, 5P$Iѣ4!>$Cg(d.$.Y ˔:Rm6>ªP9w8T#7Eu2·wCZ ޘMg ~$qQˇ,/ FZ`讍n 5/Q~Ii-#zCrWV@m9qA_-W`}748.3dRY!! ޒKB8D dʇT8p"/Edfte`+Ag ] u&Fڸ H֏S2KsUer  뚊}'{AaؖWh8plTF+E&*ה2iYCP '%ÑbVfH"40j82X["{X`PF5Q. |x4Ǜar@hA ~1ADkh*ޞ 1(ȲДOYύz{ &wōJȂ(@ I0_ǁ6|) u8"bQc|"~c[ <2:nBZ~10N*}|Hfݒ8ρ(3%dnO?W% >EDD%k6mJdc,<_lޥ y^瓜+/>14_z%2Ņ\hl aj堈ybd>ɊP^q Nv]@>x1q@!>f#Ψ yq㐆h#2s>2oDZw0mQ Cpmza#"茻A{;EPKB~Ê?41[ ͱU?HݟW,9#`ԑ8%CiZ[$bggm{xeއSٰ7  wLB@.?&m),o k#y5~E. o+@ϓlqtҁxغwU½EЍ  ݛ铻9~? 9gݞj}5xBj= 4e(!Tu~L QrX ~s!z{x\+l(q 9OȍF,m>&vKh'Jf-f8'o,6ূ1;`٤Z_7~%+Ƽ S H2,FSO 泛;ljY\YP}yB[ >Me<&*1Dj*H}&ي_5A{%o0y9O8$=삻5[ϼ֜=MHj(W߫wȭ7wH`΁E7!a09IU 9$_#g{l|أsO`rz9]#b:mB,a4N^؋I ҠSb3A,'DJP),Wgj=2o_B IγE- ٴ#@B\.;ȟ뭼1b]Ϋ1zh`[kckD@'(y`/b2+"e! {l2:#g쨀b838DL*0#N 7= V ew7VN6 kԮ^; sȥ*~ 9^R1ԭşe*ҋmvN5<3MQU)m݄RC*GPXx>I0JHqKH"jsf(?—9櫻)=uz0S0)BKm2tA踰 6ؿhx D0ė] ]1`*w`d&gd2"Hde_m`m/X)f 0ZK%3"bě&fP58g' t <܄8jגM,ClF^ѝɘ]xۆHjU8 y%>) !"$#KIJS%@X;S%xFNfƥ-$ EE!Z@L&Q|"qelyڈvvԞc-!T z :w'u_ECG#ovJJ/H 9U"2}^@_K&4)zL;ͭ06)ӿ5AԗlfyK QF _J?U@^)Inhl,&DEHKG8`O e*lDCGwB g|4y;*Hx>+;0/2NH:ʗH=cPŊydSk ʋF%6h+SܦVI(EВ}DNSe4M1B(0%M cS$Cf\,ImI='gqcް%Ļ ]M[-9`' 1͆aR桶[hr~-R De2H_Ϯzk4_MUrJ=FBt983 0s2l1ݶQ| -s [+05`u*c|G8"iC$75Mjt J?x0!5!ux56g DSr_*>vѠlv(,PP堤 6L遥4BTNz0= YA"c?+LcB @1}EKL62$P\H ~9sdt8n;>!6ِXW<ң8% vQF| EƄAQnOзB3t1lU r{;TNl=chkĩI$'VY&*Lb C8pT4)G 0bXRMk*dz2X#fY˝Y jXJ?|2tHt~&x-be~Î JD`u`L?jLt.c)^scUS2F*Id)a)EvzWlNeѠZ̘}+I[@1\pvs;᠍TH$ra靴(Y,y24dv UĐ!8Dzc/ģK8K<]Ab}4q9gIAER( s%O p,!GZr bz)Mq?I%pP˥S@[֚USlO1W嫬'T>;Re[@Q#\Ũq䎁Q2P77W3=oFVBW0kz c7nU7#3)'A!tb3l&@xK5 4Jg)ymW* @k-  "'ٞJIE!"Z~qR9Bn0= v9#.l^XBL\ym}Ǿy9"]#ݪ8)Iz& ybU@V.FA`D u&j6W9\ S&B+\e9Z҉QI(pKV|,>^tc~ng. >Bi/|*zPBL]M-|jm$tUw iciyv:D*"]^rLLbp}GsH0TdN? vc ;M@8 Bl_B1_kx'SuvyPjݗ*21q D&o]xUD t P>"UDp_:kRæ-ZpOR#GT(U b]xF1vP\%%:0xsڅ(Α`u1(qU"y ZOӁcx"@S׷^ jSĉz2֍)6l'&!L8;ejOeioֻ2V1)-fgI>/$@wh:,0#e.^G+܆{vUJ#f̜a,!rTȿE7byJtAeZeM Dt `K(`J0dxpۈC +(sdcm! Fhm7Ù2CXՏTRPX-;3N6S8P8$Ee2ڸ'ŏǨз,w扻9 T`@ I ^z ֱ(Tg8`K- m  ٷ!հ];}[]t$l'$,g;Qbc 맻hȚB2- rvh}II{w1K٬ȕF7 8^-Զtķ.X7}nHGJ(7erFܴS;4Һ3?MnLKn Rv?`[A_<䘻0Sptd7Qw2~j OABqԛ f 0+n:!Z0E80F} Y&4ުk#`xɦad,M"HA+AS-X Sjlfщ9Qxk@&N?QDR(*eQEUd!g `@XTo~ݿ^GCE A  2+r?}|C9 ⢮#6opF~o+"rMS;bEYʨ*m}P݅Dg[% e;n6  *~^{ɟ&z4oH)5aǗVUNJCB7@DrRt)D9-ەP`%.-[Tzɨ."-b Wlpp3Qm!)AĒV & {]gӟ͹@n$یV1dوHu[dm Thge9rXEdK/58*2b˂k]փ,t-RӮ X/őڵ:%0<@]q(Dt`'?ewӞ,(*(ٳ&Őev!unk1uI˓Z.ұY"uf,|6`w9jrv]F5Դٰ۫)zDĄQJ sWLCI3]Bn3A-Մk"+P>zszs,11sۮ K$/7B vR -Z=XWwJW h5-Qt@:4Srލ ϪV";ef6+h6-4c5h*LJ/IC($KHJ]MDJ@p߮`!18(_k IɒL&wuY8"Xbm)^D\i&1ɅjKJaH[=j0Ƈ.!a9` ~N?sĿ'qsт/k …T r[5㋘/ C k]0"܍WA&S?84`o(Aޭ§O "ARZ,<4WR| vMIHAsC"&ƓdRqWVSujBm6iZ:IJf$,Lf b!|<␁b'et+{"[w}RdH^ 2"F5h ꌸdy\*pG%d{ G832qw&lIZs}VQf-di*~jQhR!Kn(X R)ZW5:= 8z8'Q!Gs kۺ8$I8"Ȱ)l#|^ugӖiH"-S D HmKKbb{-MkvDFB K'>[v2[>u:sSX#7 @&M/Zp%ZE0;Es"E|GA9^Beߛ(5P9*@AtE;rtJ{B56@Uʜ2Qց+Hcj^/ U;[]PkiL+9[L]dw־AQFz Wxi;od=_>L"̊l,$PNEI6((:Ly{G9DC i(߷g5K2>smPo$&a;uw/~3=m/ S?ڥDWS'}ͷxHdd+NDj:>+Z!JQQIw_Z;#h3xG׺77-8k]p=_@K4au#5X2vu4x'U.--/G:u~}B6}[n~+T淁*V\cJ"p :,YP(Xv/+4H,kgEK.U+5x3O$d̂QQ#b6ţKDgyFb_v»#J'79ձή>HuaS\zVr Έ meSG^$DQjjOxzRBF-GLfn"ꂤ-XAd;3},,( ƙAe]72gWxO$U|n]شh̀P/pMRZa~5+@`D,Rf!?Syh}?$eLJ0)d*O$? +8㻳 0?1 P9AuCS?BS\S{Rj@2*SJ)k3%@YұruFL?% />[], XM("0&@UnO|U*,gh g=J["~878w$` ,Z[UF ?a3X9ڛ=#1hɔcM34{K߱>y؆ QymGmaHYeCFx9, si$|.8<ѿNʼUzSRe96v| i_"ӹhLaڒc(^* (_.Ivk0̏B; }+u58H3mo: ,͇ HDZM5 ".$6,!6xm |HfkXrhI}u<}T-p?@ƃ9*(@&;$Ie͹1*5)`VypYqdVlU Cɳ@֚Z B<2:O8⸼6q9@ dJ-;M.&֬6{MڼS*Z+˒')'*V\F(Ql"kAɯv@H]CؙƌS$TjiԌ +͂TTOz4m]~PŜw#P5Lʡ@-Ad Wh7 Rl7Q6@&{ ٍ<v?L 3eAB 4;~wQY.8֛., v2NejF.^UU_>y5X#_D_-PtV!]Jb}e0k<ߧ۝D+;5(/Le}g%B EhlL.\ؽfRNz^=B3 k$ r*~HҸD%ͮ Fq5`N"Lh fꁖr<sLʉyY엽DFQWfpqR0aQ ;Y~ nja1ďb\@)YiۺBIwxȭe,2lMR4'+Iqcq>ieXsMDBT\Kf׬Va*(x,ruj_n!z5Cކ7+f EPfPB`X!h#}(J4̀+4zvH~&l& 1 DmD _t բM˯<$At7RFSuR_BOZ5 |˵ˍ˥D Rx'ZŃ? (WhL.L'媲\QMPdn-b;;&0_J,W(Zu8Pu1S{ Nd(:. FKf}6P24.զpݺ^3G"It8cwa4]0) /a35qʘ n|;%Tea@ץJo Ը۸9ЇTfA(FHC00 Ÿojg)Z+dJmRu Aiw^ rUZBϸ6*B@[ u]^6 # ?45;Xl"R 9 Z8=ap>r!mY).dMzlJv-( 6 u滕/6ȳ} 'RS Fd'Z.%M2U1􁚘ej;^dfh:^4;8 ㌾Nٞoc'N9qtpjZљcVa"`qtBiV]c/Pڸ_8DםL~pjNR`{t_3l}9W?iɀ)LTMQ\ hZJ, :ګM+2H*U,nQdJ!VAmmf\\hY %0Ѽ&3.%6e{ЪEvDv{ۂ @?M (ghd&i,~ahwC%c`"4$d@&)/[+H8wѺfܒXhj-nKZҡ;)H8x0.)GhJjb36" .s Fg.XA a+6/rTO_SMPg `o;oh֒+2>˞v|;}s3l̯VLXH縆" 7 xJ(@VBȚ.*$:ҹԈ÷,w Ð.Sw36DƚMgĎ#fa8l8۳]\&NI"[{:!RgyF[Lxxl Nq%,e7ƳI`V5`jF(8!){MV:}ԧIMuB_ kw4# Z/c6PfFFm8Aو0}k`,}_Vr)lV̚9"DK5#n''*8:#GPOZ[?0H^/߅rC!sB֩(_D^̲CTԿ&7WRyzJLh3V 5 _G<BbH֡F\  Tc4[ggka w>;ۛpFWVBwV5]̭!(Gډ#yLRgs3s>TB2^4O>@HS5jZg U]кNYso5TӅ㻹+ʰ"rK!ѦbN!mh5hdwoFt1[ $5@ ̫%cJ`z@⺹E8'V/UgsQ b0濞=T0c{ ~}Uh"9pf8FUFl;:t3zca U @b SEl9=dJӜ{P3,n=86PR+HHDmU!t/biElzTD/ŘlOS2&fm8;݀ĝhR NAO5yj0TNOkրm \t#Υ CE/ Z کA!W1rJ"7b)H삉&SR)e K=_#{Y|8XY,>Z0]f1;^&O&\əݰbW3單7b_xnC&d;T$!jw\q4!ao0 A6%,\`YO9oW%h6?y0} μO b 4q+DXp45KPSd^e&L Dhy0.,G"0s@E|Q坿N#2ԘH!8ۈF&p#&@½ `*:8" &ۍ]EJxڕbSYFApS%fTu/e3u>?Ǡ,EW\CHiJZCvn,X&r ~;"`N`hUÏr2|6oD1SFzܒ'Ĥ}Ҕ'z|& },<ȁyaM Z3)MXCmgi3hAh@T!%Jd''\y$zc: '5-6K\ ƈiӳ譼.8` +) *SGѪjaֳIAE:)JW Tor`&DK!+Gh/=Sٔ aa˳6;N&KHhӺj"˄ћBQ8L \6̠rqGbJ,k]ҽTS*M cID!0>cet4B%b (#e;R uk1&o&NƄ8M`n).Ff wy;ӂ[h o,B ɰh"J\1n

:"$hSOcK64f}1LR*X0W,)ׄOE2cӨo&dʑi9N)# {(a;4I Y:Σ Gx6t/o-;1U$Q[qmzPˉ12z0nڃk|Tbnq-0غlʹw|0-NWW]g Hv&98t#k`f1ZJ8mT*ndVGoh w}||-FUH+=hVRjAXv.lꬷ2$ NTb::TwhjeQ0CVo)CFBm%;j4Hـ4X&t+^G~ZрUFͺg <-r3|WTT3vIN5CHO0."1GqR/qFhd[DXF %)m_PUͧצcj^wb)ֲ)eY()f,H:0jZH'd)K(*D2y{&ػ'8$E熞&sW&2E, el-MV$Umu~*4a: [7GL|\Օ}EpC5%jdr ٸHԪ*!d7 m+y7 ,Q)ߒC B_8 O`;v 96Z(R)`G82Ro-R)]PU23w8PRt ZޱǍP6L08:S1)pAcxVI 4%zBJ\qh8SQxtM yoJaz31 iwԥz2xe I)oHV[|b˹=B=:g(p,{{r.V H0SFt3.;#6Xa rIcBkJJ` ҋ.? ? ',Dh(;R<gi[jg4ŷN0Upw81+L1L(IY$@I@S)\YATT&r[6cq0cECJ"3wQQFr)Z-| i2M3%21U) S\p:]# aG%`Cwpn]!rQ#]LDtuc4m*LΛ_ zq)jvd ˙$kD3xCi=2%ED,8/OQn:j2phKna !}ح̟זG{"f'<'&2j09 )&Br-DI%I֥ǔc8d0S 4Hbgxl&@(P6\4;Zʑ|@CXQ.=wIڇ̞WiorH+YL4P+aQ=aJψ"ѯ>>3bƭ*~qթ^r!JD*آ,PTe1\}b&yjP !p[GES1e6bN֦OkE=;O (Adi_RA/'$ЌgR (}FS8bT@U0288;ƒ='s o eBĸ=H6xb[a*f؄&IA4@!Ak)n!NR0d$=}1|s6i7ũ@Ӷ+^-I$H&M%ur#*h'2=$e-vg0!#VB(hL  ia?gH.BQ΍^iJuըInP3fcchXnnh]Zjy*+h֊'IBU8u"r3hc>h7FN;6ӑSS{8VxQ5Zt@\9R W&JҜ"ag߮oyGصva_4x-Qn#G)qh:%ILֱUʩiw4ɲS.}іq NCŝ hRI:EW(Pf&éupS)Xa3LhC; HS,{UAD{r=$MB hcΦQ*󨇈1/Xy !lViK'6cXIК`bbiL ;=ҚcDĈx#ͺ_=(3Yo"PWqS r!"f"jS|zĖ˧ݜIZ/P}yS5 F~f)`h* < $CQxJfF s.SuFK\ẖaU0q\Aid ]|cQĊKW, DD{ j.߫ga+T1}߷ ߿ %$F3PX6Ue=4PI"-%TZĦXwBKWj˟;Y :r#f8@ d/kF*@Eβ dHlϘwIB"@PlE8aNb'H.)*%O4myMgOTm& Hqp)ЗQ. /2JޢSli@h #ùDp+WiJV7 !YA0$pJpmZ Hģ&*QI9,0`W`5 J"(TT/g !fRd][/3Q/VD|,b ⩂A9P؏REf%Fg,T/N]Ħ0.{Luy'=8{tĬ,$D S\9ܳȦ֦(5p)ێ2d`^,*$ ~FZ R6~̮5wҡ{$% x+Pqf c6P[|ǒ|#-Lc .H"K [YR>}nF&A͌23ֽ;qZ]WtLa!ծTTQ UBS'-b}0 KYG/Xu{x,[I#n[f$ԳX1/ڭF^ v 5ч q ȅ$gS@6• j" ژI-5D.2IS/ dKGB߹[p[fS 5]lLhU $XrLp 7dvlڽQœʠi]OL|zXhV`9gN!`HZtӃiPc<P,|C\8ɕ )MujJ˗7AvMܻ=ȞƅT_G$]tN2SmhoKK&WncglVABu}#7q揋U;.{Azrc!'Μ_77ގzHH+]c`^f82,"`RYhP!ƑZ e<V jFVEH/x٢4*j[)Tdf]W*0/ 4ΡdaFH9& ިPq<[3>'CW 3*cK h+C $::(RYb=/eڝþe钎J[aϞHC@֊z* ʮLٺ]$Vwʞ .cҖgb>E75WMD×ՖzQi~^ϨXAv,S%8ǒ/m.ﯫ~<:jiO2Aa;K9%(p{nhnvIX sCH>b*׺Dކ7n̫,]!_1;y[u~b ,^`~ biU3'u6׻Ec#/`z./IsdHblhT/Q iX ]V'ROgW@S<V&!Uhk=X] VM\ѢR$RDWr^7\XfYn.+T1Y%2 ⇇U`oV ?f21UMܗp1 y[;: **ӄCzWfH^d$ܘs'Q @I$S1Hb&9\$Tۄ u@*p%e=Iϋ3hu#t/4iꩵe&ʙK WK/|[fS;CrFec1 \5':c"8Rk fdhF7B9^ zRov RRG|7 qH4.D $ :J:jEOqJWL6(fcޛ=aɞ) ,!bݢCLtF{,u8FZ]֜7,l;?o4o){Pg~rg5Cz^N30ֱ }0^=>T(iColC) 5H7cE_X^e ӤYԢx/0]J9ވ|*4ŗZA^4(/7;-xe Gi'c"Sn,L5 v '4I>m)#iDUS^ukM1pӜ`p&)cJp|QEbŪ\u ,)D_k s3OuqbC7j#v6M0Rjo >ad6IKz rym2F،D)?e YX&\r BjM H7 ә3gN<2T>p~ϩWw .")A~8ʤ6鶰~0ь %`jkN[W9rn p')tVvdla=t# [t5O2X` .HorhpQ7mJV 56w`MT QcC6 qePDy= 9Y}f/U0v|'qM"tSZS{y(Fðw %b5**z'0ҚPE,zUY~Vzl}4h#t?XB(֓q7΁ ؛om*zQ  Z>>M,8n>ID nQH:aeTj0 i!X(d0e>٤FB U.Aff, l:["ʠj56 */eh GWK bE?D]RVig@xO%~L&[,>(y+oI(-cm P{3.r5Zڡ1L S_yB)Ӯ^a CRw\@Eq?EVq^/A5xat6$5Ez^3RTw)[$PD L'xcU;(2hY LHAU:uT /DA9!ouoz*}{z\Sp:9l.u~H5n\5.rn9Mqm^GjzPDbP,B: !bcF jwG*i7j1 ‘Yڭ)G>f?!՞)V KU*#tU 0;ĵ8c? y~\F쵴\a uT{7UxBb2<5FtsL!3 kMfCc$s`љfMunqs0ǮÍ(5}Y^(2ALsUfQ{x)C&d;, 6jZ Q.ϭ h&R XIQ'`2՜_fb-2N)F\#8ł:qL<au/ {P(2tfo,AHNzTRuGxZoCթ&J "yHS ƊqFV xδ r(d^maԒY؄-d7;yV)#S/0J5J:+̅FƽҢ&qyML^ڨUϢNf6K9:ù8¦pF1$wv`cJ13.~ ؅ef9\"dE"͓uQ7U>_jv쒄jy0>+ۄ6] @F%.9sWN\"MQȱ%i*kSumj_e"(`FB<~/X*-$D`ue"&`s^W Qw)GDOy(xH *+V`R7DBN-llGt)`DGh/`k CH#5i#v J &YG o{4['vn,w:H]؄\/fh+7> ~{-L6]nJ'@ri))9LiiDBp$Q`ˢS;-) |^ig ,ؿEOGi*r4@@Ątr(8+1Nv;m 5)1am8؞a/R:mz[25kNOj0!z-Uȷ =&O-o,c6X8f?̃N+ ?X( h7 O D۲DX쌲vc/ k')kaS~B i|OGA# sZEŇ1 O_{6cQ^{O4zEDFWqH#6a҄xC03EpUi@l`W/w'6Bd9)ԩ (O&7n(mXϟz<̳  yǗOf-jr,[S^E%E,avر2-:Dhd#d qfpK"*'^ҵĕs"iAU$/3ǨzzFOjoS>=b=:R)SxooKXYaB@˃Zj-#hB<~9͞;rD tEQon}B1eZ, j1O:~Z%"PAS•"> *$Ũ3&!p1ā#4, Ai4*ZK5 6@9@>}c~I!9" 3Տ6p? ya|,f3:G2O(. կ nq@6 7U{AgVBEؽ>jf oze> Kԗ<C0|3|vOkXs?kz)(O <AoLv4e)&c`#O[Ӵ7+rh( f.'ٌ8}%ƅD^fLs0;*"[Hpeb}U˺GrȍF9X"23m%ҖKjľǗ'|cXL6_Ū$q$KNn.MZx:Dij(](e*E]y od GS-^Cw2) Xhl|Y`^ Ck sUL8{u:7b#0;׸<2Z7 rB /kj:4[.k)SHR>p6C{aHZCGrܘ-;I^6`%-B)%TChB$,5&2g*shIL:GOX(~x[% R +Z.n9gElS&1{V V CzjV~)0'6<7%=3Ȇ¡:< &4܅rgBv{e;[౅=]Y~P8CIÖ&Fg?4gR><2s8Jt{2_͞C%d˩rmv?#Bсz=ΚPן/L8\;D;]SP(NUg]ZvӿΆdl5!ܠ 08cĦ1Ɵ 7:ߞu!\5s>A;`XhEA@`Du0s3b)R2- @G# CơIg|#,!7 a&ުAj]'FfF 4}un6ih3aHRpݔTDN#S3 աSH 7R:"&tPnT5Ti?5M`/ӓyGU:V@>/vl(Aax{c2+!5"7 "'bRz{D&1>LF쑈Ib o*7MRXaJ8 $""5,kfȍ<`$(68u2!Ŵg ֯1k;..;)V'b.Y.4&):Rur8ϫ1|D}eލK_ =SRX5>rYʈţM,MUf@R Rbl", 41oA% `TU!oF& Q ]7`psH意Kdˍg(DόQh$o0)֕(=p$i6<oKIW,#c..ke왵Y[ ෯ 8!UMum M2 bΦor(0$P9Ag%tƳ 'gda3[ytMڝi]M-\`< `=Ki\AS(Pp ɣ^DN"*-[<$2*΍(t&!TC0o͂\qTnd`@ ‹QqFɺ%b)"=A:D‹r\s{|JԾLi!HB˽eRxn=W;(Y3:\|S(Vމ/Lrb!86@-b =:ײDm8`:@4&).覮3$d֞4pV&QzU6,BgV̙ ϝޥ%\$H (ϖBnlGrDky$OEH~)Z ?J,@߽/*<s<4D:^$6_ *d9oSCp rlHłNz"lp} `q=O-1w1޻}H$8~.1Z&\K "pEVe@>$q7vlA dܠfgՠߗٸw8YHR]'B^;`2b>,x9 4&S0;͆JL#l(y@c(HQ*FV|χ;^wY‘iÏsZZPu}AA zP3'q!ITdz 1[{ʃFY:jNQlC^_ͺN\na\^ܚe1i~V)[D]?e' ,706 Yb 6*f*uNVljH4ew&K[&.Nw׷R;bj$LSݞV<ɈW7zhYU=vI@dxd( Vƚ\FE,%E^:wޔ$˵RU%5VMl{˨3n a !6Y@`a"!upTb_1Zj&[&' "vɲGqu":Ve8 ^BD8 T&*(sXظn\O>Xt)g!$kmssDL(9m󅵥W6b>! {uG H[}\v ( # Tu*FL_OS,;=>'S^\i 9 tיIv3P7X-WO;p#WnhV aj8p@H yx'pr<˔]UB1 TN /e-XpH&S |>hVB9hlkYvAm9O8@ yf^qk~ 7 NӵHTIU72-6CF.WTmK]L'̛V\wUmrĉ[3=aqx*ϣu̵.0EMk1?fa"f%%Rx6wOZeS]e3+~@g&Q OŏYpC^3ɻ72 #-AVQ:>HQlK2ѡ$@XGIxV//4b,%.)?Ua60%(]O qk0LdՁJHmTTy*3z^ނL,K/>2DXJ?CNnUbi ldy_~ϗ'/Dgx M(֥P(lަ (Lħ  m!+ DLծ@ -֙ z%';}xAoctwo&ͩL⧧H9j L-|Y ,52u!;BZ1P@4xE0a&r*2R1Uhb]T-o7Oz+sӻX{sjy1MZ .Ѐ# %t (`9@"ቚPTX:Axf:ƍad7 by F:Z|<'uJ,-[sDnfPGJ+̥)6+4hZE11JPnhN!\X ۜP+Dn! _"GbY,VU2 1\iHE0 /t2d/ITRŸ RqdUo܂Pִ/ BAʧuj"ͅPCEkLRk+䜕mM0vhpM0Q0fGrXa\X kp#0ٳ#f))IG V\f֐7@sz:Ue@(6, 7mwFe7X&CԻ Ćk,>r1p162f?kp嶳fhLሏiO c֪X eٻ$#-z}K놟Ww"ERLvjIUw!7ptb: kn&nT[LNƠ@b&/gκK`EK m}Jh cZ; Ak3Υ˃sj%㦝rQVU5 ^ƅOPdP!R2q<8TL1GDzw-yP7b!9<5`E宕ڗ200ЩR"7SCGLT=m!5grzZnV$!hDr͹WT N 7* zT3 ^N蕟q]RHIC\4tnSq=սNOL0F@lG){ÕҎvWE " m C Q r!tt =82-䖤 GFQ8l[ "]%$Yΰ4WSWsi` Ͷ)1!ے9|B:衸yALy^ |B g.2W^iddk@QIcWp)+RܚVq^3v8գ]us8ecoC;޸ca!-pqpFPXL5oFᔊN*˺csbZ%u![E%lbH-xަ a/di(99.d$A ]ތ wiD:c# 6N@r]h:Hknj. [i(FMflF6>=9 7ֈ I3A^RD-llc97!)4ԾqR.BkEI2pH70w *B@T1#1Wiu8*4>QdX͎oq[75/oʣ /ǫrI,-31jCA!$DrT3&na!ePkQM# 8e;Wn=cM=oM(wCtyiꄢqI;b[qU@h̳˗BD]P2B X2$E$BqfwZD C: %* D'|OPA~"=-6-v1G7J[KqU_aA]e#4BA߶K M)h T4 _dY JkilLm& ZڲS Q;V7 !^DCbvRRlb:W8RԬ+!(ѫ\+3+\&R(rqBcjdcpBrfpAqITE DF-˷K46Wz~^0|7F<#-(Q[I&, m$_kBn5Ml t㡑&!-fy/ F A>WsBIzkD27V[3Dr?٠eP,j8k.rMl$8s4k^粕Ce1lUUhDP02?syBB :cA_Hx@-Ij!DHXr. b9"ZnF%XlegT&2>=8H Jĥ'!d7͎B %eHݦ^XШQUofO)ؙ$q 儼ïp٬B{YLņ`>wn !TغogR"J̣uE,1QT &mbj֎3bQHڙhK;!†-TY7I5u]8t fԔW9*_S+N^+kpg$.OYV}_"Ɵ._x2] j͇\rE% 1Սu醄 ̓lqނX{Glb()E"HLVƵ{=dAxιFnGj}hEjRiJQ:=" UVMPL Ჟ$uC9G JCN-BdKB gwFf1 4SP9s@5;EXq)i̤>Fcv ̷nyWl:hu/\e!A̒suQre:QB32ih55B6N%[.*iT(O+h|' %%WfgRaKc@?sD-撈X-&D7%la# LhD'4=>殢 һYZeep';W5EWx(=g1)\sƑaB"A{c/|/ sZar{"bozյ|fT$6& D&J)B9dN:Gqא ++HVJiΨlj.NZgq#KkiS/6.mbDDbhW(4M5È;Ԗ*~<[FE=*IE9R@I["Ѣ6b|@φoBy\U#Qw"~ٸ s^g2Ϯ@rL4 U;hZbiU ;c9 `Muq!3YV3+:X !q֧MW9 L/cULRmN4HGl2nFzل<(ˌG4%fIA/8DTX5Zw0+TAa?%{V&qisY@OnKs XC!~-ܫfx!ㆭmN_NޛDz gRб1C|E L&p^1ɩz >9uk e(Iz"͘3X!24P:\JBgh['CR(u 9`4nfE*I^ Ww_#F!qS9ism֟($A;'3>o-I ŽXeASeS}RQQW*L1l:wsuwpK>Ã0F?R v[nhh9?'DtIxvEӢ Ä|GZQ1R]iщ6d %h 0}"cZlꪩVL-bs8udfĶDH#1#pmD] c9@+Fv'RZaC T9f( ]P%R1tIY/Gօ2$%KsQ, l?zAO W'imw@&IJ ґ^L&A('cyԤ_`D  P niφW>.kNWӶ%;V9|0YXG!KOdza0 Nruk}G c陙p޽7SYOs$&d̟'}g>~ NèHjf# Gd-*% _NDD\HшյR"HD.݁r&njI  WqHUlH&%97V==num]5YlS7"]n `V4tƍB"&HhQUVmWg-ٲ 6J5%E`%Q#$F["BMQ4$fdD]RF%n #KJz-vL(MZ-r<I$鶚7"q3 7 ԇ"uVŐHN3)Qh3P9H£ ˥`JU wpK$,)WtMF&_Vӫ#$-\4KynlwNiHutHq0VH:Qf ] E!)WN0U-AWErE]Ҡn1 nw"Ђ9bã,YnmCjP![.u$;+4PM!KIJKҦUniM1H@Xl$eR*E]")@Q THn#lOE]A$"e ʫ&3:j.6LeH)Zڲ(1Vp"4뮺tu5kiKO>6W/*ǯ魭⵭Z}X2,$ 0(*bK\Q 1 RUX–W %D\ 6Ub2%6 @820FPŭa2F@R6,,V H ("A#D,HG(Yj ((ci*Rrl0a[ !PAfeBRX6- -KVnm(0*(RҬelF#؅T-BD̫h屖VTdV0,-Hcڋ pت5e"k+21Єi!kqpH*UjBR[((blvs`DDBRIHE09Hؠ4i($tYtZ(HF`DN:I*(tTd @ E8( F@)SR]>GZo:!)6<4Ho.d2Lݙ/[[__qvQ m Fm~g]| Ň7."( * YV %;R {Fr2BNBf)grm@P6X tNL-uPlɓ.`DХ/ʹ1tz(Kv%$!w g5rI]Gnk"Ϯ:>XB .$^uͭ_g~6WOi;z=a&I3=7y/s7_^sSy_%y5xZ3 ރ?޷5)ʺUoƿiߙ<>!1K\LO%?'~{Wi>ެkʠ^-hn`k[tmṷ}, m,NyYN~{eG>w{6ow0J&~C}g{Xp4~u|3rفŗ(#,<"YMG?Y95^t.$ZO/y]rP}۫0}jŵighFKd,tN#ѡh:;1>BTjH*<1c}~jttZL5+ p\m/EϿ?R?Wu9whkw|?tx߿]ŷ3 )WG{侘t.)Z~~.pm1W)kPNKu }cijK/?wdWDdղ(7U%lTF/$iYTI5c+G&QхыQڤʘHL- JJx8XT%RW٭QxP[ә9" ![S?>_?>&t~}Jj~߾z5o)޷?_ ϝ{_/yۗϼyoP9P[ka<겓~`}l`M]_$AA)GY{xn}@_ҞoX7/9U<?܋үeW䐻>hW] y(u:y#hMd6oIƎ =[:&0{q+ֈ5S;1U^~CV#~yODtŎkZ}# t }.X6.C~GB&X6pg^K{ҿќ O7Cz +_U<o쾇jH?09OoZlL畾p4K4uEO_oE^P FuϧM|1M [ `PJz3aWs=a+Y ˔8F| q`4[A5N9mb pyXH1!Lt$OL@0b̵ x <A^{DDOТs T.ru.k \76b!mu;־LƧkWJ*`&v#"3nuFņa>0(˚Ycߝljffdd.9$d?#ɓGKBz| 0zZsNޚ"KXɦvע8 ;7a弚faLLyY@VDde4Ŗ,iiA92'QFJ̴jh 2 khQPz\a]˟e=4l>y=u&a̷#=6:9׏w`Uq/*:X۠vvohZF E=$}+ǽPeʚ|[y 8("+ZZsyb&3s^DAW@3V[$G!U3T$ (XOiiP6or-qˇИɗP,-A/Ӽ%Z|P0E:V*kJɻ34a:rPq$HX&9 ŵㅺ]A$#VgY2N5S䡤,8 6ichٮG6L"KHWZq9˒lVQLp@ yM1/u6yV !&v g즤Mj u%8mW!=<XȩIK77R)rṴq!Y;O#7ɊV:E65 *[9ʮk)\ *eȗ'K9TA+&8 2)Z2c鬗V(rV6Ha`2fGk<I=2 ېh+l*3΄mm@jn۲nZsz<>Ў%saKK,/"t*ab ]vָON֏8>:37'l# 2D9@E&R .x%m޻޸j»\^[A[k9[L|/uݗà (buNS\mP$dFg*,Jc/Oj45ĩ!FZUZױ%;o./wbЅ+|.4.ۮfB5`D\bR5![gD-pC[aٟzz!\aou?S"KqA0. |eמk<Y*-i4[hl ~U:$^WM@J&Ld{~DHf*{\m Žߐ~Gs!dM?pG+*L>s~7/ovwǼ%2@BIIܦi#IdWJ-l)Tp8).i\k>k S0#+$8zU$6 V35:D\)i(@ hnE6J1-C Ii!ONF58OWZ559AY. ?8`X1==< D&-ՖG-L:M + tP20r46U:,la#&(JHeV!xi$`TF68;3iEA= ٬R~418|AKXQ=ͻɫ <%!]V 3,d[nv'VHkŹhafMZ֠NaiH)0s+@ghmzl!BE9 +MkBơmF*0AiUk;EC]i! &DU.X0TCL@pZx-^Oq#ci[V=6P=lӴGA`1JyyC&<=^zç"5z`hNstyzuO̓ R0YRXBT4:u|@'itձ|eKDR&L^Hھ:J Vw'knؔq=SݞCDӏOJ_@^$&r}N|>Ejc/E9ۢ=b6\~;᪶ WՌ^z>z*1;E@V0u]fLkd}O/G}<3Ғ- j8yZ^nꍗn鋶2tl[Li™y˴:`D )*#mBh\wajk nɯ'(-Eגg?/I' am?a osɀe"QfabA7I!br$FsTXBEN{ ҷkx[,z\N!N3Xڐ∞0պA p&hcSK)QJ\4cH:9Z>js z 4q@ä@`|5x7”(5C"a{8+z(4'$]͛HnL_I8 4pr=mr mUF)c%#[-"VDb+WVFUt~f@J.QVoM̎r+-.)h!B5)e؝ @b >-bdXnHwqIo"FA]U"[IQ|؂ЀUmIJ+$ˤ{`N"5=X!RX:)5tzfgh`j9Ԍ .NGcEBؚ.>)qJtdm4ݡyV=ts@yS@j9J[GNY.h8;H[5c(fe*&lvṛAS;_ H5%qׁH,si!`qx`-d6g񮦤`{8I8|(_T\ @-ﲽ^AK0Aɍ"eo"; _& a΋o[ұcGz~F+rdP h A#ScȨql~3r4Mi- Y] 6ê}4r˔Z FܰD R6M# =~,BBۄ'ݡ}k:x [u{ALn`#!8mm;#s )ΥdEc48B[<=7=AIj\8߯z'PR|{RJi,Ԓx:S\yQ:Y}-Gv/a 8:7kHJ4s>o"Yǖrt>rwowfA7~мI `ARmZTW[jSOuthmŻnA'^ޏr\`ovHQ!(yHktBx~~z,/BC8pO}.sۡe{OE*=G h~520$o~l}-7A|{~2wXDqZ8̞T ~=ɖmy6E^^uџ[ݷ>Aήho^vg_a{yQCLc0HH$bE(Cd4I@&4c%1fHQJ$e$I%4!c " E ɑ$BRQfF@DIHIIK,  a )$i0, bH Ɣ&%RA12Pf4l4J2R 5#&I&I 1$$f@%B I$B1l&2%&iPF$ FaBIdh"ifh&b L($$̒J04 HbfK) &aAdbE4la!&1$fJA3&&fb$1)IaIf&@ɡP2$1 "ș@%,)DdH%E$$2DAbĐ2)i" & 2Dĉ Y"M)MLQB aO\(Q"!4B`CAM%4"L$I$P2i$2%ɚ"fSRh"f9i001a8`@@@D1HUQHz2fd3.șvgz;Sύ=h>J=-ڠ% t*v4tR=LT* ?Ԇ0zOt?w5&iy8 1#J &t% #uf_@x Uzu̓`IVR*Wj~R'2£@?;``+xQ`'ćöMѷD\;q7҆|Fujʱf>:;wo|?e?]WUUU_6j+1YJPhi)(""LM-1 \ۆf1\@D04W;) DeaL)0$IBa\eD˻IQ2A]a9pH0/wI&L7=ݴAc0* $1dynFkQȥcdI "Lw6!$`2eQ)a(2c%.qIx%4F20a!HaNs2yv$PrOwMSsr䠓\( J"y0 .tJcK$H,uF41MiB#A"ewW1ɘ5%3 #׽F30\4 3rq4.Ydd$!0fRλ%n(X(w\M;&2I]E&^tn0B<R78Jer{мL{zQb1.s bRw]E0LhII9;ow$rwtXH1I1;$LPHJ%׽y]@v=sd/pou9q1.s2!"$7!K2L1{dݸ@PҹѓG;wn0#7*4n\ҏvfw]ra2l{rB&^ws쑑^:& h̢fAd'o I(KX$Dq&Q9vH]IP']ݑ,BPw:w@$b{6e$WBD&۞u%K;w\!8 %wywB]9w#*R/)Mw۲n\ avܦr;7vWAB) (Hw]ooslۻOޞ<&ߘknKL!.=:)tpǕhU1xT:=D 4!J(.& HPAiREńSx4Shra, zt\F@I7Qt 6$ PTa+_DJD3BH˨)!P]*(&Q-%:,Jn2uQ@hidm1* T!D4'i]kR l%&C[cPqA aN`$apRR6hB"bQ#"Tf4L[ ](QFDJԐRBH[HLEGӨfL8:vf䣺xVj 9˛U0RB*9*  aDmQFRP(&Be9 x T gnaydd4bYNoj WK}xis#3 _^J3Խ"TKe_}}"Z\:ED%k|h$߇}=,5ƍ[(SAN{|?^DQK$b1::پGR9#ͤƛHo!OdC_ºpՅ ^BX!/(P|M xQngHCYV%&c%X+FPR%dpGx?'VBOTkgh?J·1*7l]Fx}V7v\MMKzA_;cnd b磎eaI;٪ >6矝u37:qs=q[xͥ!z#J/jd51yUugS.~yqPGztS'L_ 7_2tCGeTq,YAwbpw#?w9h<otClXVͺLF^iW(́УCȂ ϲz^-J[sK vEE`ƯҪbxI) C]7%#H}LnY4EOѾ3fs5:pȔhO;ڴ?_`&IUh3sW%-z[|$OSz.`ģtȯkIbOTHj, N)F aVEH4-*y6A<(wiTtSw<ܬw?7H:Ρ[!+lqtɼcNƧk~rHi˚q#t;|/jΔU|x˿5SuAqQtxCCrMDo9@u`ӎAR;W5z`C)4 !,sd3aVb`!Y1_zƠX16dJ-v/!C/UQiN`[]Cre*TDROqjiV'^I lx=,,9E)TR8[ªո%6̴I0q/!vk{q'nB慴`dإ+na,nl[zӹLW4Z[A"GeX$, Й 3l85&9t%YEcNN${.u(gke.x/P{*I0&cfb3==z ^?:Y&I3G:~CK:e%huKm+(2QARJT əƍp>a6TJVc[wG Ȃn=O:k Yq|y<;r޸PiU5`.A b6ܭQvfhcV\&ԀSH0l.;lD觐e[%lʳvGR̮*LXJu̠ƪݾĜOw TtbŪěBDlƴ &#RWw39R0IF bL/Lm\u[*(!WxµԢ 9[K/fon(9a\5Lu3j9[wŕifmHsH!G1i nT4su`8!{֎Nr9R/1a6Bo1AsU.+L<-xul5ݽ .S; &V̔fpBJ[px:ɵɪF2Jjs mXibk`8A"\aUU^*LEՋZYu\Q7Ջ2sMu!wmp&6\ΐ.ewqji2 ˽rJ hKW-=<9Qee*oXErZ̭+TVXo7oS<'ro679cy+6B#p#vxX)J&[FIWb4v <pCC:rwA\ir*,fJL4h\aSrKŪ%J5|[BjJ(3we=NsӶ+fDj%q]y䛙h5ɍ-@qqsV4L}Chi{fb ՚6^-7&& 5dmڊ&0 JՍ2E]ӄ iƺ:cq2Q!tU~Ig-Y[YbS_cϜ9Ƕy0WdSD$Q::eI lUeL Ŵ"}wb*I⑪4IiHKkd^0 oMd[X@hl +`03n!Jr&%y+!p]Y|.`3XQkKl*z S1[W@$54A T/G'f֣zGQE{S Y?{UNoZ KE ̵Gz*x,Ƙ5 hrJ)J|;k1斃C}>G~H6,!D*S!%ٟ^ p:frK볏Sxvo9ȜT >8փˆaJQ܁'qI+ɇ ;x( s+5 ]hC~ߪr@HꓪRAYEE'ƙ/C0turSg-u'GjwZWT܎|"UF͖Ij{s'ԙ7l^O T\0ӗَP1a]klGiև^)*uW# JjoR Fx"~4lYu'%h"o2&bQggufJB,j@]a9eKF>qԊi!M|:p7?b?۪?|F߁Ku~yMfG[O }>x&ALg{zd\'gB W$ 0hIRّdިq4bZ hd ) MnQ$ ]h_F]ܶy:/~IxYhPbt(ĕb(dJR|#} 4?;z8D _?zݤ~6dp'Mh6lz|5\`NIfW@ô "LMNc&ߟ[YZjVnt7̤g9k84~_FZٮ b[5DBPsX$ f,QV;+fXKY\4!TiN&%(F%S(|Y2.otIy78#jKa-EwaƉ9D0OSsS_߮9z(d, Z}E5z6X{.k) 8w,h!xΧ*,-J`aq(Ī~av"j^9So3ɰ)\W=sUT kAh3\(~VD2,?g[#G*Ki_};[֢\TI^zU:LPY >~ťaZ[*f3Q\-fI;Aua`|v\% ,nF]Cef2)RWYPEg]l(] N zgI$ ťa :eybMkDNԎy$NCR>:hP XluYޙzdl2Hڳ Foe(9%iTc&P-!sN Pe1qFޝ-FֲK-8B_yk>2gvؿ|;'}Lyv' g!lx$X_$j N2TF(ð"TK 3S}KMS%1mPEM#e]aFˊla2_D\PH5-U!E 4qz;7vvx^R0>|34xo,\0RtY4j( * @Je8褎d[H932I>l=e>ә>;kO:au.%$"Y5Io,!.Y+R|b¶5f.,kDCORVLyxMoxkLӠxͻsCeJGng,Lk3KV 7&9ZhZ @}4]vZӑtPאddU6t{.zE.o*OGz땺`C"l3zIɳ~m fu˩ p? 5qN*䐎*xZ1hU 8E: 3'D,,YoK@:nE84(/$IxFO2 ~- jyAݨq:T.`HeSPCb4m ˓4e7BC+LH*}k /Yvu-DJblCý!-?5)%;ގ3-6 ZՇӄ[q aƕ(oB!lbW6xv,Kš2NGH9`a#;b+.wQz1`kX, vHk<)$C3du7ct5xfÑ^\ "@RdIv+_X+# ңh,mqm&r%$hx bq5g1auy M 7]( #ϻV[|%Eqht!,F}$PpUIDJ[Iؘ8rEW^Pyjk8a!8WCqfXdymo~8ySD7Ch'-: ̗V.+O^:ig{-LU̥ezvngFʠ4eH#WF$KUԦ[<' XUqgES/n)v{ Xʗ=L}K۷L_~|/٧U_\d$3I|{/Ԧ?< !0 n(C U4)qᚏN0jbRWNuYuF2D"jA5 TSh\] P.Fy yѦ6ZlCPDf'fQf Ss"z罿<]CvSS93N&:bL,4:dť<5nM_O+HNA'$ts0#fh`CJ2|I`!+A)V~?[Q(R~:S"(^5 ᅡ b₦D{⛻ߨciϞB^f?)]D$~eA/X7K^(۩EcM0AG% d !X5H-` i7[C hhj!GYʣc*y9܍z: 1OQNr+GZ %X%t+>YfSW6PSĪH ]8kg i:7 2;1a&˦9a)MK|.j'UW&Z٤o':+^j] DiNEa8@dXbqMw%9V[V{&WMc,0bض$F%9o50 )qTa]e"!Lk7[30*-TƈMiLR_{ڤ=g3w޼Iz7~ O:|۫v:t(*I`V TqMR]A(A %~pWzv۠TqVvsqqMVISSD]KF.Ѱ0$d'_ozms޹߸6];DĨaAvDZ5g?k𻟚s/߼*.3 ߥU/]7K~ED _8xg^D50)V>O XtkmJkd$<;jo<h:]m#)!1 s!e5:ê]U1h& E)Xt1ΐ5>%f=[/KoW\8$$qJAEH-(HCXЕa!L.|t 0&i?#CoBxB7@A!I1 pf~x?e;{驒 ,]Q's~~\? Wn~E^{*zW܏eh-k^B>RTΔ(ApUQD"nK*QʰĔ(1F}lw "+=\6|-Pmu_8| oWfxA`6 Jka+3a |ߟy?OPsRRT)RU-VZDD TȚ/ )9QBx;ʖh&!n87>?4w;f˞L5(>wU"]Q 􌜏ҬןG}9=<\?}nu&Q1J[i-}:Fg3NMShcGP y K݈"wTDiv"Dj) ƸX [$yħ'#_ԯ75W u %SxF)#K 1ʨV!cbTFyD (_rHw`^̿Nv٩zJm=o[b*} =o9DXÓ ym?&CmOtL-g?m~G"}}niA+n}w]w:<q\١Tg(kF f~ڪ6?|.pݒ 0LutXHJ9{l\bp5aIyt_Ճ.3b]x*ǿ>اnFE[L~>޾7Xm;o^޹2p/Þy6~7)sv滚N-K߷s{wq Jͯ9M%Y$xW/pѾ'OӍ7 b~->rJ-kXV]?<z-4 ~Gv|k<O-mp>zf~O|ՕԙUčȄ;(L:#9Ʌ,7$,EYLD$(!,n5]xcۥzewT'L|N]eĊdk _3e0;n>rTKTUYB)YVJU•vӹ*RaMu6 VZmVAHPFBt & 1P0I;LHrtnYJPn9 VYbXwWA(iRNTf ̄&-.2U fADƀhFZZRVqȍiB]$2 &BL+#,Jq+tK*5,9hWVJ;V.DD6کQREvU27HCNLҢl(|}[Z#[[WEU甛twyyҼך]ݹlp$dXLbFR\Q̙˚w/$I%JJ$mF (e1al$`KKrZYS#QI1F c 6Y*$\mb8r,Ȭ)JŖ6 D-"2r !meYRQkm!-Zr)X$)((YW jŬ,2% $e[BAU[bJ  -,-ZKeЉƕp\ , ڌ-`*KbB\B0bZYIRPYF RQ JEa-Ke)ԥarؖ eJڅrƔA"B*!*Oc 6ؕ#hXJF-KlYEH*U+rm5@ %Aen e?vIXȎV@ RYB, ƵmjB[)Ɛ`mBV#q(Ҕ\k.,F\0k2a ikXirѢKDbeK$ e,Q\\ \Tn[ldR X[%k\3&Lɟ<2UkQT(У@!Q‹ˤFDHW:!4)=J5dZ`0 $~JbXM+}hw'I%:TcU©n#ƀ4% ]=]9+: 4AG1R&4ĥaPqL -q֬ ^dLNhp]K*'*z\<λW_~Uu_]]uUu_U(~a I"+ @CT0\c!bb F@c` F `B*b"sE߃W֍Fm|+kXJ1(Dj2b؋lj`! 6# IDA$}< Dt\55|#nʐ֖n v9) uN@)PDavj7B J *5SۙJ]]&(FA[y-dI R`~΁UjFq2I8Ns$əL~_>>=#m~u^4^$~SNߖ>2;n3j<;GIaac.1# HUjöa/֯t *)؂7(‹:M&f9HHoUڏ/,AyPXnG (,dɣ3vh:!"{]JLI9]ODj-U\)3rq޷S}ۙv_c#=G+P3RwzRvRi$J |j㗑]bDŭr9FRnzNA[JVbظH2n_VlGy&ϠNc{T܋3dHu BaKi_ׯHs*$t>5FMz 񄘎D<47VN* "TxdxXuV Vԃbw1=a&ak%!^9 _k-'K1i勍8iƄ݁9M"Jcvසemٴ?XtYΨB!՜̚-I nt/nq9|k 6U2yLlHaܞDuF4ұ&(\_qMIϱ}$^UU$;[[#Ce1d5u56:=*DVJRS17fͨa/ދ<&^GU .PPzt-Wl;?DOL$QqO苵hH 66~ UFEk ]/aY*~ %}rg; <i咜Z:r@ v ÅmcysnmWd?=Hf6C"3Vң8C7G6upW@R{a&#YvtGoN5uNvJ ꗤ,J`덟yp:IqhͥnCrmH+h/&aasӎkδ~5t'0>,{Nds_q8~ISi@/:opꥺ6%-~pB'8) /Fn!q̄71c®@ۈa>cMt}$K8Eo.Մ@z+?HPXmr3;U-ucL7 R, ns֎:֍I7l5EP~vvMLmt:r X^D3ʍb1^sR4 ZZxkNsϐ\PUf37ˈ6I*}@ׂ)ONó (~!,cf XCuϤTjN1SPh 4) >Z\#s&p淃Fr}S5볒j[md1_hpelc6j9dvsaڈ̒~tc1qD,+{:1IƢ$ݎuXNiu3gړ'mXAQ R\-%T\$.zN{5St>D})ӡ$nh kHۀh,tX5AMk,KPC9n$3s1w+cGw)h-EHҍkÃVݮ8yҫը4Ƙ#:`&43B89^W*c0I Qw<.gsLəL*d팒Ngo4 M3] ]R %A"` 7vߑm61C3#6μH ]9ٯ[Nx[D)=A#K+}>A8%z9 #E=:ͷid i ],*m*-*d wӓzm;ARtQtk1@Tg؊ZFD. zUF*L뮺]Lɓٙ3<gDvffL̙;2[}տ/V+e}wx1\"xK FRi4()vl e$虒})$}'{'8'^[0W,@V[K?,42R~qofk߄]`L%[[}lՁq4j 7ɅE[5K84x5&i{7"$CP!}f6;ް6:>{u!'~1\I(&&/myLyܓ cCLTI>T^ˑ?hTi(~}QGUnF`~+1|b.%/ь#}:HH[. m'-`.~mkmm6_x_-BqaKOD7,PiitWjS^+\Nor1Yd6v|o>,k[r5i*}^e䢛v=XUq'eQsVi;W S2a+#&DP53.;bxb?ffk2AO3ڤ\TST>U ~~}vJ PƾSz^<Ÿ󔟃~UNMw3ePΚ WAz`389 ?2L:{&Ehl93E]#M|k^ʎs;ak j~hU >{c4Z̬hC6T'`hϞ?5|k#X{C8^k{ޭHӲMmyֻD >)|[_u# bFU%PݳzEr۹*]{;$|LzU{*p1%wٹj3W*p:}X !’"!>zl c3p!Yua X ~Ǹ:j{tt3>DS+/NkɌS uzA ƚJYɌgWX9Z]Y4|?VS.H\T7%sӽ9e(x 8!1Z {[yJO.m &f9|s}t zeAth,$:ܵԷs"v|lȬ7S2>>'c96k_Me2Q.k*U~y"]!Z7UA_+΀qo/_~R'4Xrs %gWzGN6"Z;9 _Gx9;MBHl3ٱMo'y:tk%*B!2ybM._v?F聰~r >Pu3`(#[Gfd%taCc*njQ55%'F,Ik:q+)̷,U6JAXtѾLQB#7qGZ1:upx&Ƴt?w^(߲[~@(s[ΧD+7EcBAU~"uܱExjLBq9mUEXD0C,S#' @,F7I=b&(|¡~~C}jߥg>[vI2ƭUFbL8ڏ%6eBo(5>F!ZY /IQKјI:GDSaS[kU5hVEjh5ZѶmX[FlkFXmbb+lklTZUUc`Ѭ[`6XZ#T,mXE6KT[TmX- UQmXڢE4Vcm[jŵhEZ2Ʊ(*"Dj"DjmZbFmcXDkUQbXXƱh6**5QAE6PTcclZ5QQkj,X&Alk$IQ!ED$h!Mb#bb)hhXB-ɑ[ZտUVZk-Vm \ݰ.NzW-~oo8nsX.E"1`0Xʼn$S{ ԌX1U&DUF6eNak6!d 1G"X/`L=<mPUH,[nJ WSU qza^mQPP!ImtP^uX;@*TCT~s3UIE)P"kqUz-)nf]4>Ii#Z\޹{|=|4;oom+ڈ[FQlnW5QcX4Th+Q*-)2V) EIlmEZ",(Ųj66*QEXcD6 QZ"Q4hF614Q&ѤԔm&b1mb(F TUF,h! dXѢ#F1b#JFђW*QTU9Ռlj5Al̒h+IIF(:VmEQ%(-b4 dC6  b LݱPjh?ۖPFbŰ&i0ZKF-2Z(-FY-W7 b)#$1E 1$cƍlQh(5h &cT6$4E3-4d ۥDFƍ#F+J Dr)1MQ&C*aflVKbb2bXh*#^e!(B 13D4X ,wb"a(iݮlͲP0ئhԖ"+1Owf)р4dBDJ.G4wtQF.\5ѱQ$$BFŒĆ(rwvA\6ĕ!"< c&E("(Huȱ)$!]ݠmƐ4"J5 Kn#c#FHȊ@Ѩ(ѴI q,lX%%!,`32 0Œ4yrB̂.& +5yMy\ط;#3$HnzA@MPc2<ݑ0iȅw*E&#&$Ļ"F ;@řdI%]pw%(Ȗ4Q)΍4 Ksnɞ ؐLF$<`H®\!IH$^QD)$F(R1QiG;hIa@v77#\)yDF 5 0%L,InhBsbI Ѣ/:6=p-i$$ ݸ&3Jd E#1C@qursBO3}vߥ~l>vg~mS+'){}g_y'fx{}v_^O˷d+?(||SoT ,FG1/rȲ 1# ڐPh ahHFpbF`DDh8A$!4DLԙ QDė 49P@E@DBZ PL!Y]%>Ws )2<6ږD1X͇ȭ8)@>S {R"NuJ iHa`' u;뇊(鞵s5> 9>HŘ=p9tTF?]f [>ATۉr=aIl9e7c ȗAN$d/-C̜ ~!?yUPS:+&a WoaizWya+ (E}m\R굜Q-mXW(ŵEQ?fP8 =-q``1@ X`uMf7j'`ͲnYb8nqc08B$R?A bUwG>w[3 uƖ#x7s\c%& 8ۏ_븣0)B.! ' F 0'It46LA"ثiB0 ߢ3z򰭾҉S"`4#R72B+#T[9MZ*ًByJpܚH.p1~]ǎ{uFK*B!Ҝ@>3^Wg]'FC"%fPx,r?'`/${@E0 I54 v  f/v#)c: 0ܵne Of47wlΛ1Xa!e9Fk!1!BGGY5=\RF:͖ ~儀W:[B"qs]mLh QҞ5FLb "3~`9kDdٯ9tOrΘ\x2 AV/˲A)[yN^$ 0FGQ)t)M=@LHތg/ S5&ZGŚ(%,z`p'v. zsuqb\÷O]Br܂pӳi31 #H'bӀh6j鵃Skک_aos:VpL1nH"Uٌ{^<3` bA6&q&1mf x">NyP0xwufDURo|9,T`?[MQ@i3{LRKa-8`>3 }jn.zj"B~_y闹^8iQV f]8~ALɈdq/$XfpΝ;0]F$#t6]X2H*QӴ,Y\@ls)#[ mHvW0/fzX.KtbJ́'zUwظlyM)uٽd28ɂ a.Xز|Am{ W&  t22rZ5p95b#-o=5l=4pD~c)S2M8Ѱ~p60 -1h&Ĥ-1FTiZ* EsMt+DI̤GJ9=~64YW9td6>e{&ÙBA = >Hf9$ltjľ.,~lRާp،|:w+FXݟa+9W͝Zb϶DHyo(|qX7bۈ# 1Ǒj1n KHNa`޶̓)4uWɂ b!}[BoRޙ+ GRPmgeswuwN0潳Iq~Ci!>bأܻmF-EO 8G"  z%̲48X1R.aKڍq4a^Mˋvߓɓ$:TMd ,U=M1wC^Fz4BbnFZ-27kUJǡczO31'_ Ma\ᱣIYi^"tdiIVm,MUD%>zq֠lY`F5n.fv9'I4 aCЀv++8](4#l̗w.R?N|V!f \AQw2뼯m-K~¡`pH][I34XDRd﫴cpoܤM +5]kS,7-~Ds_bYk2։^Įבv;Boz 2 j!+UeFZg5ӊMw՞Ϯo *c&k :v<ټTadcPػW&-W3#Uַwwop6gvSR~^<(M&a1Gye+\;ǿNÌXV toKϩ.ѷaUO.)quLcV4ְQOOK6.xmT>٘FK6ba0clJQ<],Yc-t.eG cx0duq|Rcs6T4N-N6HJb^< L0x Ne TWGwrl8ƃh墯~3.)q5qVdjGq4S+4^cEeuE0;_7ǜ[BBI ."gށ{96)f,10ytRp̊%$`Њ=:z8sG5+t]DG#XEOJB&f4ȿbbhc|%Br֙ˑZ^l?ێCT\ A:eyW<1lHRJz@DYqN4gZ*ziq`Wȯ^GMWyEsϵwu:ZjӂAaJ,1Cto5fyTm|};(Sӌo ߇jlC".qndleѤֳ]0&=E_ ;є{S2)j[S+FrK4C2H-pN{l^fi(S} o½1qҬ5!f43Zqyԅ,3AIk&,X:7]'x2E)&bCy(玙/Łq˶q'",[8֊&Ӈ"٢Qm Zt]䒖k }C!:bJEz<'?!t˰%]b*Y4TL[-߁]5w%i51xT̙]Iʋ:Pa| B<#bLzv+=IBdF ~[yzvꮣ0M?Xwcftʙ]E^\jf\ƦǷ]il0д$s6%1sm~wN53{Y'i7!6ȼTN0d/j[M8u4Ak'cIDE=k_9[QBP0&>FVkbygp,ʂG00V|+5P2I?FRǬ`׍tcD]9H3c؎!"ن1۞c,l/sPI_$wدTAu+V22@+^#+Od@v&|1% MN[qwFXiݝ͆G (BC#'j1A j&_׭>VCWQ,i-tN,12MI;h~$%ZT]-`.8*֚Hkredi< n/{ ONCr[3ՋJIH|3JYJG2t2j_L[)=VJD.`aՍ3EZ/],f7u (/ 93i$< 7 f5u6 OVIpd'[laCW%<uUp%W2%L;-aa8&~_yj#zl@8{CY6L4hƖ!M1{'Yٯt݂^'KŴY6YˎO%07.cJq]5L+>S%\OTe`:ExgpBTۍcKzĆz}`ٿ~˳nGfYabbLBǎt)N- ɟ*dNx@T1'>-mIϛ|KHp`c:barqQQIS3}T"sNjD$; Mh]ѭ뤡{(G$pZ* ˟JF]p=Uc*NDƒ;if]D $f "^?B<HIjv[^ d%qvm oֶm{WHdIwh\Uˇ͆ѷųu(hB$Zh)"u@on˅#h*m zZ$2j&L~3E]Y&th6{u^)e&gڲ`UamΡ%wTM=#fTyeo_Gƺ]Ģm (/Ҳs\.ck/mu2'*aH{"Bp}<=]nzeVF;>#@k}}b]0Ǘ}Cgv!r.N&x*L{G/Ma]db(>[~\#)p1\@3H,3+P1zHGʭ;z+"~hM$%B Gs>Kamຘqڵ^Ġ!US1D˥ӌ|mg_ꐷsV>Xa٠"ThQ#Ƙ@G lpRp[jiXj ;3y`[^ \ӛE tI:k& (A#mNI)bSΒbe"~*ÏڨWjZl5|n.!b K"(Ȁu!+Z[{/ I8]=/UABA~XE1G/hjQ:38ZISkۑ~RaֵuZK:F l;oiF ۙ<;QBMqnoluJmiԥcr%j/S( T,k *M U7 .J {Mvgf[; jeD ZX8Fn;M~K'yw'eMLuMfqvJt"I\ɓ|Owvwe@u:5ߝ#Ȟ少M:(ӐQ824O翳rXb;annL[ZìDՌC()}\VDGYGÀio<Bdt7K6Eo ,o6]V{F^Xv^x q@GCx^,)CA蘷a@*uv,VܧH3/9{MvrR@)\Nٌ CE!\y&G](Dme$4E Z 8 AZւd*'-)u>hyTt6;9Jm.[^"TZ p~=B#+! tDeJ {:nڝtdi,I}~>93nqH?1עQ"*w]Q9rY]3%뎥oAx M9/ @ZpMKuZfRL8WMeEYt.D*Ht{|/%‘+̥Y jOts:p1r63У"೜ tٟ]_[K IO@Tl[^^ ~`)}Ph —sPH 6Qr׼*' I=tV39#+_\Ѻ9#]P)}T'xj r#8kȂ?@U%Ogʟ }ϡ7 oU5Cqa}VjL! OMAq'qao 1 x<szΏ*A_!\Cov>(K*EW* 7o)vE͛SG:P Kw7r#ftWD#f=_* .J!{:{<7+d׊GUY6(هc-V޷lKG~ {dR} SF8UB)@c ~a+) -QZcC|BNi Оh-q1Hcloi1I`´*Wx~ W5$`*d),B|+A\w6d ÊgKr_{un)0b Gpa~>vL,˾&LR,ڏciP7:(`cPGlL\AekautNo7vU^G>XaIC %5Exzܦ"ńAQ2ID0b+4K-TCCx<;(q^v/&1^)sOm 5 ,G0X ÅȾ: AڳJ\'67@N})dzl"\LDzךg'& ".Elg>Rpbr֢ ܝB 5Arr6# '=SF\mJnd/>QH}^?UB@t73(4cpcTz8cZβ/O4l/dV-^Ȧijʒv`"Q$΁n<] dat4ij:nG[Ըb CE4"XbӏCwz`2}H}6IkDm_Oې ?p ^Ԩ_d$(U\;CEPALle³n>xnp :j'N`٠)?I^jYr|KXM378?{XE+ַYE(8Lc):(.0r" tss\6 1OV߲5;.̟~]CK&d}~/v c,x8i9 gd~nE OܘwmR.#t(.4i /L9@}CiCݺPS O>Tsr chU{YT}"@f ǥut._+ "/:mʰȘ9m QA9 ַ7#a &@ Bp,QgL Q Ae!HOk 5ÍVP*M/ffzLx Vw~1+@pyv4/4h_P݉ɜpBIH98ixz *< )"9S?{jqacggȯUhaPjB(XiueMΎE}[nZ>m Vn^5[ :4>^ T` qhQ i M;7bG\,9*OgBVK`BQ&e[g@r $hۮ;x{rZL/|q壻o,JKAc 걛%`vBܚ7M %d/W keyq,Nk_f6[w%g\ڣO-۬k߻1QʠHu)(!Rm<]~V%_>yr0?zgt}J?eLj%2gx ~ TEC@W )$`HBʊ?@aep.؊E-4g h{q3Ẏ%/u :MGQ p}+7abϤ!CX( b9|*n @V}ҵgO:tSb+TM gAy]`zczW?Hy2qԱAb/%׏>As݈y*툰BNφaDKG{I$bW(!5:-WsCwߔK$K&D|n!S'bW^j۬fטhY @1cmV MO`@< t"n_gwv:3*նϝOXmy_Ms'J_2WN׊e*]b|,ڂ\p#Wɹ"wV$cs Ln 13^_i\Qb'tmeUdW8B*/{m%4eYv =ƣ"}pg-yI'y$R 1MO5pc6avIaCZEfZ/m:ONx'j0Dcp IZ黋:D,0B'(8E._Ր l %:q4<C6Hu3yx [JriQNl)O[$[=n_sGK?[ܭ}.·e&QQE.]ִn`7G⿷b5Bɬ VX7]!󹈛L^ɱ5 ց[W$IgBTHK ' 4\V'Gz$`&"弤t'L3VX}F}E R)[PDKrFgvg4"䛆Hߠ ;IJI|P9:BjHUvȨ .jSM8[$,҆l:3>=}or}K=[͂1h0{q}OZ Ep}e37%R6ov$=8 z%8"'#QLP&E5]&n%s*T?g  ڧ=iDmh5M扽%#@U H?O{|$4`Qѹ8=5CY]id[KZح>}GD,|vh]{v2],ЂH&8PpTw *jha&Ɗ:WK+9tS VuPv'N!.U:ڬjAsWUvx&u|IvC(1ۼj(-1!tAf#xQy-`s- eJ/ >Z~d'¬3_,~cuq֏*^w:5t!\iZjE/Ŵq;;Qk+vIE)r$֪}}`*:cr`V(rL+3[|hturyxZٞ~>w{GKJI. %5 Evz~ 45[dwGKX4*`g2}2;'ʿx| JK( k)\ S"DPra$292yvY_?a-|C D$?p73Lm ԰4{'o =Lg<υ;[A爠=Yb@l}1k mN(KS՝c0+yMU2Jϼ'ĝ7@EÉ?LZ )[2CRZNZH h,$ 1i?5gV30bɀz^5ǀ~ Ys^\~bgNnb=_;ȦoUe.k9MwVӱD SP,md+ri5648"Gfc״4MT2u^O4sƟ׹]c56",6$88@ՠ041k@vITh׏G rAIiW>"ȏ˂㎉&a|E/9ING&EGd/޽kz`$}y-gy̌5m! Xյnz0.L@1I],hjd˷kf]%J~~&BfU}WQV< omݺxLro oSl= {e:e0s0 Oh|bFPX@=X EX@ҳp}%:ʲk2,(Խ*Q)vs4/,&Zl8f R*$98 (ND7O!29,e$,=tj j2˴p(Lދ/O]'9|G3F3,c8*.!W2 jEC t'`$[_WUuZ$ѣi׺Fߖ3-1Zoz͆4 DzOM>iS=?>JQY&PN抾un[,x^qL׋5r|^ $P 5sr(KnTv6ߥ^rԍ=Bdd`w"Z_' ERއ,f5lMqz$*ܴkJS$!tN뇽VB%P5F4r55aNB}L*+0jOcN^Twtlkaa.@ vEK,X %d!9ܵz2e){txy?a7B"D-sF.!#{)k.X7?T BXVvmjdm=:Ƚ_t\]g: nݹF1G#)=Ens5}0i:mbL>oFgU+=dyX{I {f vH^e8VmЪZn-+] Wr;-'mkgDiV'E0_*jQMF&_Rl{4twYairG.ϝ?6^߶k_VbUžQð5ig+G2Vp>8 MDfQzXhElbiTKL~)bE7n ={gJ:./C3nzbfK("0w](c-+,Pz{N%j jfjHMJ0RDhos<&]^~NFoi`c+ UYar؜0SPv,gLl ;zéK/{zPE#On/xw睍 6ff;O-IO?bcas=J'^"MJY}JF o|Zq&4-" T9:&2Xup4{s,{;%?uU`M;V{Fouƍsw\o57ʴ\>{ۼFRw&X >T^ߧlGvZ*>ĶۏX.p- 5L"pQ0e.27 ߭EΖQ)!-\sXL%`=<5 4 aW[ ?Ӝ%dwwv?f~<8wo/Gy)^1#a-ݙvPݤԼ. dx@!}H 1Ly:һs+ B<=@PGgnR$DLqĹsUoPyKw+&h,6HDA #hW9KTԓ|`EϥZu.Jߢ}h+HVL&N"$]+#t(HC3_4VID֔k#Q0\X+msf V };}CA c S26:v/<ޖ6dc YTm)`U_$]<"){,L=Yt.{=u ߪ˔lPh?" p%9X3 G S!n:xM @]W ybHsD Ll=4% Kr-@Y[eT N?Rxx^2>c 0`֨^U\Li=l4Y%lş𳱵`&{{4IrH%|Ed~pm%px4dS\C+2`3tSA1o h]CNb5 U]AdtwtՆ] b"ڰZ{=Il,^蠼]̺35eY[% hm+hf/E x!ۏLǬh6 xJA<$IUōn١x_٬VO3?w:qSמƸ '8Pϗ:{v އgs_\g QL*&G:_nlF}!4yMtv)K5z*P<xRc_ _h0J.EtMXş0 6̶pS.,ÊE_fR4ʞ6 'ݔ#!NI{0/?^\ -x6EuզEA) ,0.7\4Rxnc\eOB+-|/N*yWMu:AG5Y 6%8T>NU !]~ONF  RҜ{N[_Jg*ϰ]{`E4" ` #&K&W EHjy[w]}5L4<֮&Gj__OAqo`i?.˰ i Փ ' gCX h}K,ǯDWJf9qtؾtA<oU }ni{>L'ܘana.^`.]Nt, Pa"ױ_[-t?ي]r0/Ƌ jJc@-%[/8('>z-K8;]!ayDxF\_b8F昻Ǘ'/-q Lr 4 j[ViZA=2A5{ []j1v|gLl Z뿱іwsurVtxdx ` |Chiۆ.(:iW2Q 6+$H0Q]i O 0$ F՝Eg$Dꍩa,(#s44aN|\ERny _Jѷm),ø8] AI >. vWcpSOY!SpʶɥN3hZsrQPw9{ka%֙!byņZ Q#2D)aOʊiRX=B8|^<ޜ{ eۅ턮m5:- [ q?p$R2_ %o3nTZVN|X!S$(9t_8xp&}}9  +i3DAi޽~t{pL^=?HғPﶣ Uҟ$ɷ^'pRD%*+[;0pfꃪ< i.\"8<5 nvd5h<'_-w?# +д.OL[2)BesYT$j`竆f\fY&r0hqr8"j˹IB'̸23٧zXh_uȌɱAǤw( m~#kB|lQ@ #TR]XצrMHkLJTѶ+:%.IYρ}ƺ82dgs~IoP~0h~+Qn`xO3S>!" $WMܞ!}#6/UЌ]9*ClEhRK+cHJFhkϫ7q08("h`MXO \mGm6wuQ qBD>y)dvt%}~ Y{)k];^I_:n) IQgӋ;sxI?Ͱ5T VyS_mF ;tnmRsRxA UH t&ro% ӂvlፔDwLZ[dtJYyj"|f6bݝܐĐjloj#Khx $i`)a"NXnշ ͑wɊ3 M SMBkW<+y@E&+ xX{n;o{r˝uϼi]uYq=@:j#nתHْeHfeBARfA:޻M-cSJsm͋b R@4A.-iKbM3S"⣓=fQDhio5^&Ȥ3Y2ŨU[K.~޷X;[P/0rXCah|u;+_رFfSs&O/FN4P89_4I moe)9DNϋ!=p PbAW|oih{XiެR "7y;6s%N?;/s4T8|kSdcS‹8{i38zUՊɴپRwhաy k~AZpcłNuSh*ڧVO`0fL]ᵋ!LwiviwbP|LyaPQK)XUGMQ1b2BV٩[աL # O ;e"|h;pY%u(%a7 }Keh̖3 :I?Zc㷂_%1nb6{1\P/SV+[vvK[z%թ=M0ʨn1=mUYpNU`~Us!ID^Ūk  YQygS<VjE5@ڰ(&K'C4$#r֋?a_  d`U]|b5|ְ:w-l&ѰܜHKރ??~ X+PuZKȬ'EF[ +HKǨ@w1hVR]¬ @S `I{f-y2:&B]&e$S_k/:>!RuHgvJQh۬6E)"7ef]ͅ-SVWNI9ܭa8ao moSo?׷3ʨ)4ŅWgF7)Wi@Oצ`O"6RB!|'s-\KT]tI`tںY0ξĐta>@8_Lg@SQS} "1]>8'&D,G7%=ӱ?3xIk·3JrKR.Ƶ+c"aVdn̔351K۠oݣשEtQ+dwoQ "0V0|t4N퇑GV'i.žhoqgp>T?/Da t~k;fhv[%#GrrvtA*%NH #ְtL* .<tiU45#^^Ȁ|/?E)JF+k;O&iwwC҃wޯa2^=gdH. 9oaW9]F?TrB|•R4o FeL-0ZVZ[Ճ L>IsՋwY*z30LA+w10s[Q4`Ӊ ˯2 6坊:ydفLXx}#ڷtz;`4gS&4r’p_v ?⌵-f½WO-Yx#s7Čxڸ7 A؈9b(^ <-V纅 P׮9l'OEߦ EyҥNyԞ kUW_`N"kHh2CA(n^v@3~3ˑ-KjR҇/1sǜ9&;d ȑHm *wcvP%kD"9g5y_٬| v? h|7(i.3F5kŘ~1D)sd~aC?}a8W ,3=l-;t3F[eXMf7WCz6&sbk;+ȩ,m@uՌk$7WC<70z3禫.s)g%} (,c@ΐJ} T B9sO‰k`L(s{qQ~necmB=%z{$)ᖦ_, [MtW+D"痼i8s}s-S!#D;⮅b"Qi|ta,JJ%: : rЩfa͊B4VisBȆ(Kޖk^o\JyV- Kg" ޡ[ XN¸X:{+PN#؞f%\*l783}WVvL969+? 㼹hg^.Ň8 zQt\mp"N&/PrH)`U>NR'5ze2>/ < 0N1m15@@diyp]p.ݼߌ]*𿄓r2IXvTU.922F5|~b5!jR\LBzLsG}pS>eL P9 >q%T $cy9d\$,`aB͔(%sYTًc6l̚ztx0.7gk=ͫmi婫ҿ8iٻzHWBʅ1#8(5+ 'FX2QɆZ:}ڭjncϜ #OM');ZVbx!bv04iSG  ^1(n;ZF#>;jȬQn3JJ(ctWx|f##b @Nhl/E?pj+/Eи 4~4, ApxDv"Ae}]h\D^z[@ N\‡52$PǘES':p P -6YfwR>1, SXK\`fR>KT~MG  ZyTx6|6S[[ad L* d JE@4KJ9Ж5ͻ.-k ȅ-PP oJ`/aY'E2ɾD0Qsc m3Li}D|'a͓&]LgSܚ?gy :Ǿވ#l0EW੉b5%D˛=#׋mj(qӅWI*`Vsa%!vj8S2ltY Q4Z@VX470@t>vӂj&"p>ү& ȇiOmo ݫ phX$eŔNr_ He`B4iC&(E "§nU@yDD\Rӕ Knu>~ӳk l׮i{ՠX{`6(d&yN4'o#F ';='5bNInl!:4@>OǭlVΏ7`s{|BⳳP j ZYb/Ovŀ!Á~ycʋC w6W82LJMn?/ /W[}_1bK4;-VǮPD(VCg&,"7/vwv]XPޟԭ=e(F&zP HTʶ:DUvFN@f9C@(BGy+LG]%|si9iEUijN [s[v~?(KK>([0ğoD!ѹon*[]? U}`*V&!/4qzR>T2B9h:a. BdiU!& A-ɺp_7<;kZW:|kDаpl Yk\Ֆ=/b9Rx^BϺ~ n1(Sis TًeS:wa8 Pg_X(mO07a2rQNY냱B C{js V;b5t#6lwEBQ5oW%bt枥(G|G1qpVHU Sj:[ڧ1CQ5wQ"x\,-I9TA|Rv<31&0;l۽bdov<:7zH!׵%Yc8u]R B i$QieVIfVd ,=+=DAqTr/,Ma]xK2Y#v)YГ8c?;}L{XRUp)Zy#-oq]RLSR~!ĉɏfLX¬UT&DH-`"Z1 2S !ZJo{=˝,T%xdBN"=1ŲvP79(}C{ xD-c$\ITDioqn_5݆͹pkeCI4 JsDasJ |L +^vbY]a@d&۞j$кLnЦ(:p]Ani6f umΈKڒ{&tlV+ze.6,gS|i:P% AX@ODGԸP'ԣ^Ordz $qVe 2yWWCW+#ńgRoYmOd4ę98?B8mxFEL"X Νr%`y]tfMEP[;taikm$Ꝼ@c]fh3t" \UȒ4ώ^V@:Gx-1. AS˶>5IstPmJȽyHQd}z3& @8 &(N;#Ͻ=+dS%50G3T4<:D-D}򇜮&GKKt s+mi<:p`i4<iK{hLusN⃢"?k=Z|KfTL_?aśBtaL~ޝO*%<4?իV``dzUX@qtʂCu// &!F́5C3&%NP:4!a^Gj.\/zBQ8[;{Y6eFygđk:.c4ͳ|%]01CDjf*฿yzؾ# M6 2p^[9P@|;8rҢ9mH3]a1`@k e]]7,)şe%:L7{86EQj拮Aac,9ެmӸk,8 fg+KR Ëlx u7j&<)գ/)>|''Phaزa+w zʳx=\yEڦ닚cN^+;eQ"yM 6$?sVx-CD=1=T2 Mлe ML#;'os6t3k5c.Y>ETB?'Z biaH銃U6Xg-dJ&bwMBq"9R,O>T' {Ĥ#u#E?AnZfs=t\KRhLV|襠pA/| caxy,W[~2~/w3ՉqJ2!qT k ] IoAߌ84q$~o `gbX$"9ODt~zn XЉN֮8lGSAӠi&O(c_RB(G,F/KJq@:?nP}[&YJ$b^Z;X*c%XUjBhPm#NY߱q*3 0c4Gx(ʂ\;w),R?D角6fV2dh)Zw f?WЃwgOھ~MpwlÇB\ɐJ/0G?Hah0Wf„ϾI1בYɍDYĚ{MX*5D͗lHşSu_E}S r;c"jgR_BJ:66)ڊPq+ CJ=cH*;;8~Ix{'sj<}Fj`jwy$1)^J=OgiԸTy۵}mϽёђlǹjhT)"8ZQ O\0hy}œgGʊq&;)ۼU85hQ (!|?ehH$Z9w(|XO iݍBg`I+ {"Tau߶B1e[gЪ.Ee RM ĜNQ5,v8 ُ#ę՟)SV/Cߑ^UXnYcniVXrE7=[k;Jk.񢵴d 'N(0(-c$i+|vQŜk)9٬rg[[V_]5aMp(:@&kw۬a%!NUVNjd 笁hpu2r[?3` BU֫\^B).]o"ΤEѧ@MKUK i;wBj Y?SZn4ff$YGLEr/JʍuMSZ7Yil?NnWŸ?UkG:~)ҏhl'ql#a-LXՋviNf ETPy<Hn}O IGeIP'\%dB]|Ӧ(0E*MM-#295(0-x57e>o(`y Ljddʴ~T$jMVvq꣪8yxm*Zx%ldy|u + GE _dMzefrJ= FxhjmgcKCEa[S_U=ƿFڛ˗9& VT3bۛ@s(#ȣ .ld &Fno"!U{˖da$!~gfidH<( _^h;9ةKTpzRLҦPUxů:G*rwqJܢ2mGssw"b_%+5nREiN1HtT%?V,)'hW"';J4ێreח]n)^xP#C[R@3ty 2ߗtfWvV-f2@NLQq4>OΘ>t^s`!N;o(z(*Śi_Gr~Cc8r0+Fi񍴉8޹pdQyY΃P*pK07wQxDZĢReXM'_4>#xѮu\ě><@q24}}ݤk#D0GakT0f{gɧI(Fpez1߹C$lIo]84I=kaC42#KWZ8sXZ *P-?`A>d?y Qe4 ^wܺN]*E#u₪4(~^^!,::Cv3k5ֈq+]4:7Q$b< ,2!d#mg%ں:-#Yu4 &9,rC7#|rJoFx\]T"]B=qaB)\w{CN-y~uχy8f-0 Y1CDT"5><orJODY[oCWyPJ#KX&@`y] )=EJY P<*FN^L3M0i=4tB)9dpbQ) q>91w.V/bը`3l^܁*75$N S?v-m`)Y.\{ Bhd#,C[ A5 hw-8'rxr~cz莪ӚBeӨ<"S+[wSIfG(R3&lt!nun:p*-΍3 UVLc$\B'cgHU7™:ʨz)Nw*Rr*y1;jfB_ 4 0͊~ RO1|Xge%= IN: Ții &WYtEv/݂Y5t+=Ѐ*AvDa-a`Mާ+䅫7;YA̼h*@ճgVp~p}&PKFnZ_%<<:Ϳ;p;zp}P2HEw :թK=Tl|>0I$2Ѽ[?]8p,KMeچ A'0_ubjK̖a~zD^"hFV-Ev{(DGF$Ncɮebۯpih+. Wj /N'܅.Њ 5(M\cDQŪ<D?-<S`I9x(dҢl<3\-&㧙mЬ;wm`JBW}fRϵSO'#mc >TyGy:~/3܉>q#<@p-daxe:ݖx aK&KptH#>\c;,G刑2xS2YΓL^|*&#ƣ\B{[`w\ ҿ˃#\XQ 5{`. B抵UFAȥeV@dSys3pq %BzYVE P#5"7}7]ҙؿJ~oC8wZ;YWƿoMA9PvJO]#%k̐_,\y**52| g 4m(O}]kwf-~.1*2! :",1zB_psӋm µ_ S9iJ-{SA* & `r XY c܃x#W"x0-}G{E3FF# l*vpFA[QO% F0s gV܏-bozd?(\(020πNwpYpk/7 ~h#mA:\_f<`>c>BJ$e6jv5F/M+a?eR0~-Ip9eafχSq X;F9FrT}pS%p|>ŲpppFC0؋*Ǭ1Gyqi뚉${IAJ} T[ 2\J;C qe +9h܇z6 Nt(iw[.f=!iA* D_'r yZ8|]p㆓~6e UK J)#% }LMFцLsW0?}R09w"q8q9 yu]DZڈ P|[N]-]''^p>$hH$.T' 3 :Juԑ` Fw)_Q}c8]R趨Y2;&j$rp>K:TzcWɠKR|SʆAe:{dVW;gJg~+0ɑ9$D+xpT?a%މ3ZR)\i#4HP%QĬ طS 40EX1GNhW3c%#, {GH`'&|z~E@,'yɰJ0c֐Y%ڟ;HqK{A ;FDLDt54r\AwtRSPސC5垺J&m(CMR,P%Q%9]yη?NʲZÜe6Ck} (L:p$ai}esl6d&=Fw@2jeИ| Pf6w1K^Qn]K iw(s4@LB 4Rj08yptnމ_[YlWI ˹Ρ 9$u12fD8˾Xtȫ|U S *GcqeG sndmD?T'i"peGGz ÃL.3QR v Es&l U(lqe4]@bxCR [#wTMo}> Ʌf*6g3t|`&Y_iTN P]\q!^~^bš{QRetodb|™uAR`Aa*m!KMfi)*wtZe!p8ABѼ#^txZ*ۥ0CK5@gtS a8zkC'Hq ‚>(t&C(`Γ37m  !E}:OV1HCE3i ]F2W M~ #d3x w;~x< Ys{Bdueϼ_ 9nҪr2mzb$5#f %NGB],1BZc9W#DЂ8(r2cYy HDLN&o8`XK8!֮,^Vmh7'rѹwk;7 m8xd{F}:D':C=Nu[ABGԎyQ/ :} cVNnE_6m- 7&^'=s)d46CiV/y1//QUy'=}iI$LkuK-P\ KKp )XXy[yhƁIVg3=S' eYӦ ;p5*}>cWu{iifeSjWiax+ ̩eH`A4zLjc@CЛV!pMpX*^eA 4\ˤe5J>BlFW& | oҫ/-ko2F?;v]g& q7jlY8A$ݪ!:9$ 2#%aGE |yX|߇>ZNSÑrT6R# HL%D| L3˖~NiZ}6^Lc6[Qֵ #T{=y-؆+^ڇ ~F%z-.l^.udPX .pJZoEq1NkhZZ [q(@W6/,#~)Y7U2"(.QT6n<+xt 鈳ZT4/$H9_}@<>fYG tUsOkN>B4yxkX @j4 +( w$tK55egp{-rnɺ솨C& 5v@ۧ1uW0;\࠮e3״`gIC~8ɕoRbs:>&-mgSְĕ<*(yi;{oZ@rKcN zEQn |/}w#S4hE 7Ƙcr3-|,gkLfj1!ѡ|l "׶yq%1ds_6v|.KӧVQi6<MSjv_Ҙ-l=PNs@Ջ;TGmD{fy7`SFr _&T%ejDe\-M䇓$[6)=Jq?B;RfW 1Xx>;g$ƲMЁa>ױkZd:lm@E./*f"pRRfo6I>`戲J>[XPHmVBJlETфz$y4ϞN}`EnF}76<N;R] 4R%_0X>Joʥn)qgLYTj#vYa:Z˲cE Kdd5բUz9htI\|8pmju9q܊-A{^t*0∋:rC]7t@0h`&(Db\$]"6,`-`]x<OƭgE/MJU^~d?h.WKIGnw1ROVQmoQuWxS{Q`ĝKnX.AS~f"`͛,z+`HjPg.FRNW XעDMP' X>K=1K ^0q"h }%e]AUq<[,$UHކÌ殠|*V:*/d*FhkiHd,>0 \D> c83N:'&A-UAJ*,"W8Sɼv5qg/Ɓب&82m9RdYj+}M@~`P(b(hY%*hDokcL@u"QAsM' E3nad'Z-'Ɂ6Qcn8\Y ՒBZUhv.:嗲 Mqny-'x\q`W}Ң4* -H49~Dc.`fn0$4$ "*gyWIz%h7s-TwUIwV([8?X.mj95MuRx[TD4(D{ϦcEވCԜDyPByꯝ - ݢT lFSj|'ũ2YKgYu41g[)Qٶ(fEEF \M(J .m ^_ @3ԈH:n+rMI7vzg iQxeK-D,Ǵ!5&::輼ŋ F CO`Mb VM,]4AUkh\1nЦhȄqL.Z"m2[K*f#وl}K)>!G#_ѩpZ uÔv>3bUyK A(r2:ֳE <$f YbŬZۣ"1wZue')ZPG-w7isXПꤨ* |3,g.#<Լ ˍM>b><tlI@K.܈$Պ\Fпv 2eiz6|I />^YIL?\UaeF~k״ Osx$8nELei.`(z:N|hTD}K~ w&/A껖%F;|񈷗+U!w6nmHUK:6b#ȡ**)f3!UQKBtR#>̇il';Xbqs)E*Xˍ ?ﵴK<[FŸ́3V!XD !yNGfA*aXV[ʒ5)-Q/P}s=Q;xQR '`7<'hOtmVDII9J3^d}K s>z=w~hY<(JؠB)2J2s da>}MBۯcWlUu|'Q UB%ߖ!ɩ&ТPƣkC98|S6pբHlvH fzo:QGN3:1Bi3'g2-tMD/<XrH x)x,x@Fuk'4 ZK4 \r|)-[!90}grHꋲ: g 3v-7;3@c>1,@ >-6eg!yKp@:r;.~mchjUGu2sUT ԩy:@b5}: >Y^ >T.@D(FrF uAs.y4~m >,Z.t31$.at`q 'SJ|O8V`]4r$|n5`~gu9P&\TZDu]'.:9 w} PyIr4<I:˧t%NB`dY?.sc6hIJBg~' \711hᄲ- 3뀸JHZ5'W\XxW.dưo$i #T2eu,qQ.q8gKD. үyxg@'-"1YqfS7݌Uk[??=Q1#6}-̝Fg&҈#&dˑkfpbK X$gݧlǀkDn MH.xqOIᩓ)}p}=5(ծw̹g Kq-G!?ԇ,88у%)qDYPƳUX79|'c"셨P:w:U{ ҄N ?7 . rh!nP/c*Ap|#a?EWbHFTGM#M/3DCXnCU.L+.g>i.M˝(h֥<iۮ觯h]VcW!,W oٰ^oY>#Sg|Yen*6Yc?6C2wUEPhhfƁoP+]&11R6v!8'yF]!9.~ MZR乴 ],K0fqp-ENWOG?Yۉ'3m1=Z|% iDP ].WzkIh *dnTZ$$<{j][Ë]睔fN N| 'i{ =43eHkzSwTk}9g ˣɛ hv9~,]^ȵ<7Y!nŭs>K*2ԃZ?'dK 8Q}lA֢@V Af0`r>Qؗ[vzXIWG.]d2{͕jo 4cΙ di` K:#޷Ĺv.+lZU P.*@VPiÅΡ-K~^Z6 nLEPp]]O) OB`[D/ 5"ے]Etvv62M~~s(ĒM(\Njp(\*)@ iRAɷx8$%HV} 3(h[ngAsWϼ93h:e~ Td!\I%ZZHC6@<1ÍC=O|"[Tg8KY!vu7TAm5 Quw/+t(mo& ~ɶ/tќ6~?1$ حlG94 b?@C{%e/ڻF!%>UTZ8|nc8^EYQuS#gT9NId?Q3]xwU|vs-?eT$ԼEc3>ӛ픸Az]֍g<,ztqu:FBf4-h!4rȊD@?U[.A}TfhlR؎~Z*MGt5Ѫ=)1h?WڃKҙ|q8]Obf[nT) +7?R2t>8.Cac*)?pXn2"IHmo%'Y*na>@GK7Tt#YYx\ǶL+W:="B ݍ.S o?^EEA aw|y}hr¯`keba=t %յYMh GX?h*I<oLSǗ|V '>+l^S>%9.\ {7f QU~c\>ݦ -DE?H*`88 *6׿*[ _ʩT>s*)WW-"A0S18p* 2n)GJ:zO5fw> bI 4jWaLy`ڥz09r=d$@8ZRvvW 0b矗O$Ef~I^(YV #?ԓ1/1 CI{ $.ˢ}(ų"' *_JjD hm&V͏G ƻ'9zzą@9XzL_#7gSR鲝DS͉ԄC=;Iml E! }Į2P&A}{DsX); J{asl/--{X@?尟=5ȐAaͼXӫ!/hUֵpsgS ],)yeeCqgYXw0hL#ő C=YKoLVf2d Lo / AV-G9euPNg&0荕cmx%P5076TRiU3i|~R`@8q#fc~[-Nv.1+7\Hc dXWB)*ҮaY k+}džmfZC*aTq-sU"{$Kb_znv" ) z A7sR%vf\ dʶkx9 o]f^l8>pW*ᆾ%+ԻH9/"Y@(-A*MYeJlsIwPo?7nj0Q(>F*%JtNb) 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~yg DRwػ?hlt}7ZZxR}j/3J秺nSinE׳!7 8"Auf9Zz9.?ej5 V`1hρ5DX,(LU` Zu19ו&ƹԵ`5n^[TNn6.[ qNJ1'\vWޏ{Wf(SO^A绵4VF x9*qu^dHTjU {s!eWS/VԹn6qTEȰc"W j/NQnٙ!lH8E8Hp̵MxՈlC{eE6Wb; ɻ$VŚq;w m"ֶz`,goal*vTENt>z8vY!;[ )ZAiOi'kmc@8˙ /ӂEo Np6.5 (XJz˲`bukJm`=G|Ia?a-6\L_)G=SV7ⴆx/efg(T{v%w+[(rWmye|͠2Īvim3 V :A*;c }ኸtܩX8`5# WʓÜD[>B+QUب=5T0BOJXN6R L Ȭ#|ШFU{y2L@"NKJS _MVCWֈhݞ.[Ǧcw -N3-z3WvɍRE,YEH7aN+Ԡ moUuGЏ*nvvU9|'վ y?KY |>| $hm~7}^x6 c0Hb{Rԫ)k=_U-vX܈mוZҍx;Pnr=fBGXkwAm0hX_Y/,H7O'JG;2$Ob:~R}R_VN,I{",8V5Q sREtyeĪhoeˠj Rh$.-,!~bjxtUSi $§|LjmAz0! 1<݌mfTtu2MRs7_SBZ(F#󝤵 (=UcwEA2NKNe}QUQkYaJN^ݶŎaӛ =*HFo+0<{0jJ_ZΙ}cT)*0;!KXvܛ-C3?cP4Z#>ZÙ3 F&8[֓xkTzFF,t#O{B`[Tר̱E6vi/li?zϙtbi$ t>ڕqP 4moTV 8jI:%:$tGQ0AWX]j(T-¥?$u$3E^ H" 4 EiRT9xv +F  ǵu8sHnB ;x}+o&Ų+o. v+[Oojw,K>|4J! 0&U?z~JsHlN2 팀G}ؗ UT0]-#EPQm;QW M{) hH>XZ~ݽ k'9\r.;"XYkqwDzIQw*qnϚd4*+ABVWQW1rb'cǛƐyÂo^l`t2OI/^ǓLyw hSX7IʬۖZl+ubEI#Ğ KnS#9`*}E޷J ^ ye2:I2 F7#ɍ1Ñe3r$>׷WG 5G -⋂P*6icK(QM2JlQى.0{~bw"0<{=y8ZKgbCGbh8;s)y5|]FVDPo^呬"@}Iޑ@&H mއzv.jqP<މ;[\<@&jj^ 'IV eME#83sS+1/؟.N~]vPY_:uO/&f#{⥂mVe&O#2lٴ?qo V`yB SiOr‡LV.,>-Z+#P=/ekC舦Ե͇D7TԸœKaU]˼1Q8M#y@춛L&)j37(㯓],8f}#zb:|F׮c6>VD\!n3+\>%>13b&0&TqwAx˳Vv8- ţ4 u'9LiϙIE (e5<.T]ccTN5Yu&P(;,?Ӕ{kצ p75S<66nL}.E~zKsPˤ/0e_B(l7K]gNT(c=}Hu5ΏV*w'_)@&4Cu%V6h4?ʬt}MNR#fV\}٦IYhO]f D' gB)(E۟<=v7%YtT"ʿl~~n4P%< J4eCH&.j $08>%įPPV:1]ʆOI!+Jp]FNPnV6c]Sm Um9||,wrQ,sԝ#j{`ވ>lAMT\m>Z_2+!/[Xbx [FcβLhdcj-Q)oQ疶6iG5ܲ\ebfȫ9+~/en `8m"uajpx((m=Y1^%n؎\[7`Љ$7_#& cy)X66:,=%e{]ݗkت$\4jq | y(l:Z2(׌׃h5hHtU!vwԭ0P= BQ>kB8oHDZ<-J^{40(F]T]ϙeeOA>d-dzخtvyg3J>vx* gc)o-8;r CjqQV-hj͚<= x_37#u\L,S UXoF'~9^@To./G˫kb\6uW+ƅVвlRY,6K$g\.mZzS͚B:SXKnjs-~,`I'ghE.IvʠDژ{yL#0i_ l+֓DYpw"mqn`~&ωV+]&JtkJκƿMN JΉv }bS<"g1E&hUkFbzRH\FIJ籭ɂctTpyҹommcRçCJ vUo]+u".7ikθ<ډT>`N[v O<«ƩyKr^ rOk}Vxb)S -/XFY!v!rVЧ?|; ,96zii~\7ܔ=mΑ% LR# oiMl^254U ̳, :[yezI.^3cٷ~)}1O-)(awh8`?]4iO(sЇbQ~2XG"ӷxn4ElDюJQ ߂k&Xva7Mm5E5;'n0.AE`lsEg_Jl]4?vjUhKYp߁<) ) /8d:H.sē_VPzmjiCsh4uO HbďRLn*bj&UD)tbX7eYm(=ӏ^c5eIzʛQ!;l.aajsO<"L:p/ {OUWe>Z>xJC;P2emmk48sK `rs;+e$VqkI*A= KF˽_ݦxŶ$SRWa?.Nbxqm+JK+tXYωDFC%n!.3z>]$1v^>;AX Hd%wK*z0m͝²qnexS?ma3xrP1+ z/{E4ԄeTV~=Ea8Dl}$ibyCGT3_{Y[{+^G̾RIG.'1VE0N>.7t$5I ba^'F56ئaXh+9QЅl9&~TwpPQ Ki}xrZP 'Usk݌uNfezv+vo >^AL]#%)HM!e NxXq̽P2:\=]`$qV6&v}(ۛZѦReCݡh2x[&xk2X>`WsE<ɜ8EަD4mG7I_gD #yS)r4-i¹vpq:,"bq7sF"4ݍIAxON9"P`K#CԸ EY ?[ JkA6T BHIT$gLZ>"×AXQnK n; Ro2>\9Yٽ[ZcaJY-fhRVvQIe"U4UOE)ՂMB\n߼^[YX\6!Pf&k.9 dx7Q舙cVTZ8^s ҵ-&n0r` S0Eno~Pvp> 兮Pa΃ۢt<Cu.@Gj&7Yh75-+D&} <!sqU"<A6PU=qUps" '+ݮK8 $ [vl7 ?i 5p[l`bC')rs94p6@jQK ܳnO 8cHKp$z"#*k~gFEsMSaWS.-F9](SI)b +xIcuL>Vw~zDFϱ(gqb,PdD<5逦yG%AbJ/+pOBZ7!&(˛ȏq?"Nq^l>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_Ĺ ٻq+[Q2Dw5۶kR 3OJ1ɥ;@7(meEs753 ic2ծ}f~oÐ>#NmSE h#-#h`a=w:8G"9>߶G d BUC3jTׅ7S0PM ,#bP##&+E=Od4ʲr ۚpjWDerp1`GkC;?}B}5N6C.U:A4̘H\[\0 %ꂯ=?FqWKse;wd&zD_-*9NO޿ 328ЮM`!|̾ՏVXᶜɨN7aYLn)PWܴ9r0sJ`hѸ%.dwZ_xS?,NJ`[IHcYv[dJHL F_*_*jFyWԅrL.eб!?EQy%0 /-X7@Ƽ.$cSL PG5u눓Y'6Gr9m2@q6\hDF@u`ieIt@Bcٸxe5) +*s/)^?661G@gǹhQ& \3zRSz /{Di1)1n#=%%GSǥ.WH u!'xFJÓ:ـ%m࿦^Q *Z Ȧ$"fp;Џh'Ncb.i`<g\>1Z< pԞ{3 ]E"[Ex[p=llزJR>`SQ^ fuR7IAvZ#}iMӄ'`( TEO6~eقY$辰͐x恧%/bsY">nKJ9z|]P$:E`z'fKӥu[UK/QԙMǜHpA.T[wړ5-Zx-6_jFۃž43H%s3eZ!^y8HunX~P~ UhuYСgfd@bN2Ե5~C-a7El9OQ\Y6,Dq˙«C>MӔ3,j5ᆵHN tPσ-wxPb'\ cPSS턴~nh {k(h%A>KXeNCS{%lFtp]jtMhN&j`u& *Xtu%]D#c}>mSi`^z9Hdch08ZWiLvR)ĹB fm|al&-ZM?*3 >Z}0R(34bZԷSx '+ &ڈF@<X~v$/*U fܝǬbv[H՗n|&^&kh/ U9V rzHC"M(o;NN,$àj H($f_1[L ,=&FD0,=.S@'O[r$"q}iku;k*C@4o,;N)&TWP? &Kw VFncG'? Ne1OdWwzkR#sM2^H3d2NE0%u0AMȁP JkU[t?"D]5jồ,\ы/R$ aC[l/߽ph!muUo7*#=b3aNrϽ{t?k'-ۅR}VI34“ֺIg ™e[}W8N A>KMTqO2)%jxj4@XST:櫥 m~X1hQ1꾉oc[>_K6ʛ? B&C,3iCSg5ծu:紏'moC3~ۇ-ac7bI_䔾9iFKYga#P#ɕ"$R l T/:ݝ}VTBxL ,l.@3(y 1v6$[+(EXJTCV3%N |z˚h1%j}@g!NjIs@x&P? =\ +O>s?N&2(>o*nPHPPBוdrc;t #l5P5{ ,$AҒo4 )}$\|6 .C@)AiaW$ь v(?j7z C]iT4e=XP\$7i >x@0Gضkb(zOj֧k\viJة;_G4(߳7b=_[p ddu;2D~phM hpQxTGYO7 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ؿtR$8#yW0 34zB/$~OQ}v'n QidD EuBb8/2 (I\h@jhCHTP8INͺ+- )ΓF:MOu媀q<a+ɼ.W,ȄgM(_Y$aH/+G7nY;qЊxJU zȦ=ɇNu/ߚ5P8CorqeBA3fr7kG/~Fڮœ*C 2ͦogjs+E-0 nڦ/a`p0ce.^ @߶PA3sؗt%ځL&U_yxKgӂpfF0W~EebvQ9HRB2'tjb_Kf!Cߋ#Z,"j>O֙g35*Y|͆NB1jl\ L˹DCW.EhUY ihn)M\näS0AI* *5VcN6u}Vgɦ_}\I%?CQ9]Xإۆ# Z j]D WsqmwՊ+ķBV5FAi- bR-Uzy PP`;e8:w22F2:ՖĄ\FU檫Tִ#MeU,>Òw7LA1vrWhIsX8,A~x+n8cxyqKu~ˈ8.;iӀ -WRsۈ?mb0> $=xjscfCP,t.a9L,>Aσ &>V3mw*hCz.lz)j}InIP ,H:^.FG\Z_"# $'YI,ֱR3]:A_+oЇw莖Joj8ꓙxvKSG(N*V-.S_58˴TQq6ʽ_rZ8*JNr12oCi Xh;$:)ٰPć# &:O-Y?n`Ύp:\KIZk-՗61%\D:c,U k!1hW7Dľ1;xslBadz lsRѦm yc|9:2H;+6J\{ϣ$p2|סȹ 3]sNQ&NȜٜFƅҍ*Nj>qQ)?S?N*x>s.֍M ]1gώ` 7/QZ /2k=! ִxϑ{~̖rwYm ?f.f<DŽBkҼgVdVV$9h@O(>'Wf+t.ٖIvkLo6J9c^NGsM1IH(;kF6)M^sE)nqZRGX A##hB!*{auxnfcؕXZbfg}YwwuI@>?[ݪվ>% 4nx}a;(6U]$*,}ǾPL++[(vM7vB֖ٗa9.z.HFs9Ď< ґFp9IZSѦV7~73vs4}wb)~l]2Dht#L<@$rcOZYÒĕ|Uzhm0,31sdIOCY[eCݥ΍KG 9U֬NMzôd<"&S޸a>ԫ,Ir(2RJpw>^5Ѭ.{J@>_AP#9Ol&',yg: "Nκ|ȟ'^P.y<{D"f:ƙ52+Ϛ A)ZM`|;-98ut$.:WjEx(3ֶ'SONnzCғ%c \)~gh( IXiAƻ s:Y7g;ew(:אH :{Di+?gȢm@fzDj- ;lZR:ҽ#B@ClX:j:SSk؊zQtsW7GvM"oCR~c to0.ZYDbxQc&F7GDOz?T(nX/p!TtaHI̔rZ{y- ClG롡We|v<77z;>(JG+:V:@'UƊu;XϏtnd$t=|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״|*UyVZ~&0%Үvuw_;.Aix-sGp?'D4 a!~Tj!!Nz*dI#jk}4| ǖ),_j+/}2k7CH5_F!tLE+Y&9y MEGXMS<],iǐa.C` 2 ևJ?fwԃMl9|u+]X8X.a(a__CF$%TQjn}aVW-%"3GEfՖjNq<`G-50 6;j-:%}~KaCh]<([dR AL"Xqխ=nEu.(enq >?CF.i9 ]kr:>fůuM9Y1t؛uh*POIЮ2Q #SaYU2)nhv0ͳ.N^㮬6+Nߞ~e?Tmr*ZWTZv%v Ue>ԅVNl"eRrʙ4_Ƙx2g]}&J0Rh]V򞥼! 6EWz)>ˆHB a6 bcTg'ɠft̀!+Q vR^5͢؟fQuX9[3~ WT$xQwaD C# f W(ޡB VқzoL%lqXZEMPzj:$/6oM4p$,1wk%>i|uIvJ_ϽgOeX\"F0{nϗQ8ve|_Q]\{Zë҆*/y) <:nH5\Jӱ́' ru>nH#,+obh)8 &l~ע2ɂ?茳Z!\YѧJA<M%zVqKxXOiC9Rf3Z},~*@ op!_s9OqR~k3>3(/j=.̙7ظ؜$=D;{K$ Z2E$a=ڠWl4BZE!0O z)䷏mWTWjj[ mnע+*.k-`y=+j.p$- (1QC'A5KmCu9m<,SλA: |r(\lɒsx8@i]l2ygU 痊V*ST|.ň7vdZH>[AjhI'Դ=O{ FsPMS6֣DxwDs[@! ȍsu 5CamЍ xyT 54ƩV;V>w苻4MwRlvD., e\.~9KciID 6ZA0`x`P]ߧ"mOb>"1Ng PlVz)n)P׎AyS^e_'GlXSH-y,jjV '~qq]eQly ޢ9h9UPVE0ӽm'hS DVc=FRql>#) e?`d*guK؅>Nγ2 LT9i15.6#%±eb8|T.cjg=juWlir ĪB7AQ|w fjeYS 9Z[]+qOoę-.+vm͛+ !%: yR~&3[y:l|ܞG!Ǻ~._2sڷ?ь Osv$puܓ˯`IV-t wU_"OXs3-)9C{u) ±>AR?vMQ7GcISzEjUS)#뙑]mza~;6O <4V4:?^Ӛ'G^ $0NՈgX7jֿsS7JRgMtd(l`*ʤzO2trD]qQM0w"[5l z#OD9CWt;*6]\C \m{Ϟlz<q'fYt03~P..4* X.xĀutk+Qnx,V[nYFQ:6BSȐ%H 쭑,ⰫbOI|3XL1* `xԮ_J ^(zjYC'kTX\u& &r3e~<Ơ6R.R;1vR(SX 9b`UyFyhs$Ol7XᒤjcugyE qt y`hG:hdXN{@,?XjT '̻u=j|4$+}y;+K(f0?'V›CV#|SXz^}c-O [i|F1CC!^Gs80\!Be*i Y?c\>PՅkex D: Q9'52'UhCh;jWPU!SY{)l{x,A)7 ^{&_aDRceV=BEaٲXNSx/6)=MC&:oj3S_ \ us¶=j߷/˾aOۇ:dnP,NtN"g?ْݦzfr;R68ێ~|F ofV"2|/  O2ڻ1cēVaTIݡ\lN`s]gRVpRW-7_ՅbatUkTW_X1MQ5|ʁ *{ 7ⵟ6/(m7q#z._ f7Hv+k.aor4+®ЁDFi.˟;%|rT1;L9%`^o-zS(9o'AtQ暡DyT!x1hV#0b}Zsc B5rq$K)|g43e^ lPX;w~Q[k٬)ngBj͂Nſ[LQ?q5N= JH\92 '<25ir3ٰ;2v18}X?^Si1YVi^W^Hfx@F'%tyGJ?TuP;r@4 0W,}m8*G;dy3-~br|Z9`- O4X<,$u UE)ߚ|*IUX[MQ86~@,pgߘNh?`>֧}PWq#مs ; JT)4tCk<;\4"БffHSb(bbZb?V Iym+pGأ:er첸ٕץ?-Ԛ=,cvq 7ql=McW8f, UX> #Q[M*-7Nj)b d!vnbOm;{QfJCc_d‚1o=l.VޫZ= Wy#RLt\*ϔ\`=iřٹ]*|dw&jѺ4ݲ@۲= aUsIT\__w,?9o9<(-tUQ,3mi71>5d('.4nZit/#xu|Ղt#y8\^x7=ޛ"ulF@_=zo*Li'lǿ6LS#%c;&:;2hwKs7L*̀[P&]Fќo_+zHSJ6k&QWU,bpr6N/?\T~Ϸ427ptIl`h$[rCd)(#@@(_9NxcJMJf(fzaVmj-ǽ?Α}fPum~r 4fB/BH+e}ޱ!/PM 6} uv/NvQ+I]aD)N0 %N+,\r` &TՔ'&Oϧ|21pvaOcNq\؊W~ϛJt{mrR.kuQkgyD= cE;j_iԣ5"@x.u>aq\-}҄t*C =jYDVv9D9ΝI;=5= l0Zݮ(!k;`u԰O҇ڟ?qq;NopjWENμܼwc/ 7!f}ڵsCg ivotg=_.s!8w+SF7nѡ1T$o! #h`卥4&G2h m..M?2hFDRgYp-ь7/ Cl٠&kj5(zs-;s L=xV 85q=aÒ8SuIlW:;m#$v~?T*D69ء?q@av%@u&pο@ig=3odVd/X3RjiZOf_eHZ?ZN%Ӟ.WlD\%ib!U՜NQ|!y_ Ѯ ͥƎH Gkw4_ Dׁ9RCh0/aL]jӽMaaBˀFZ\FEo4YvUR<A$%:ep =| ;цF\scsft;Gv@Mg x s|󐠣E\<ܩo\wɝ '8y\"6a$>: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`$ Uy^^zd|ڌ WT[7ɜsfZH&#eσ;=^YS.NO~]"Іw g^ҭT\k;PpG >'Fv]:n:m@R}E,G~$L=V yHH I( *ҭr8Bf՚>GɊfᚰύl)Z`B ?z0O|bC&%@,Tʌl<hʄocH.J9P Q8| ,H-KSXddMP׾3fbxF%ru Ãh{v8:RkZ5;;p`d'zƾ`Ql%S~?~[r ܣf,}pEʳAHWsѼyakBw@8['}iu.'MG7;NK1\QOJT;YWuP/ڧ#v~Yf$mP̏Wz^rBWIw$3٬wv#eqԕ`|hA/op t7#IR%N o!6>IK|Ķ#$S@v %c$d~ X/`Dfi.al~)P(tŵN&&óp~Νx H!:[bbN g/Lr(a'-RGp3p`nqȁ؂ͮlu}Y]&{OsV׬dE#rTz*e##瞭%oo-ޙgC7GPpC-,NޞV_G$qzI)YǕ{ J #ZX=Rgm1eD/!@- `L!n*}>Wr @!{-Y#I] 1ŧmحAJTugh x_2|Vm<W ~5ST-qʡ#OcYabr>H :2I*g{3\Nag ab PѾ?`=7Z]B,=n$n"Yd0 "Ohx}VGbmF`b @XWXym, hn鶟:i&aSqi)`J PR8:GΆ߬z=j)؁G/칃:ɢH5<,tGdm(Pp+ˣmw]RE`W jӦiz$žSqӇyIg=ODj$x\| FBmWũ۸(sj"8~J o_gݘ 9*NL?P{v$/m(d&W"{x9B_~̓x.ka wxu+iT;h3iW{5"O妿-[MѠݫQ؄ˍsMo^q}8Z-03yv0UBGf#.Eak"(v಩(bJrb$$c07nːy&7ws˒EN? 7MƹBrj):c7:yE 57fd1'm5\2`ȇN^ }9#gw4$ZU6glht1Y[]I#>d~/MZbj, ™=d42 9$lϵ5WcRPAҒ61G3p^I͕ͼ/{.(~D< Ӫ6RѼ~2 (H9k`fMsS$Or&gr$_ Ӓ,Q p n7Kr԰F,!G*lKRc]SDC2c17iдhGޝ/sc,,SQ\ӓKRbS$w ;/~@ȑW wǭ&yE8`EϭLfa̖|'Br=/B7$b"N+_{Ǟ:2d O 2B\FȖ%W?>ɝ/sM"ZpFa "0[mi}Ea͏ ?tM}Q)v\i/F"Sm\yC>t MXZCcAaL9+^WIJ9ޓ,,G'+mX>dr2d'3LBedQC|=# gES QRP-=<7S.CN6Ż!"$,]OUW٦f5 };g&?3["wyeۏ_OG$NËZъ~$;J{%i#vu06KMLL"閑]z"9##vLֻWD.UhJ%g3MBVw'reZJ+ ʔA+x.6mJArNk 0tunGëoYe|Y ˴@M6AKe=oV4cA2'jB=x4B]>h=z'tSaFJusÍ͌Vho9Iʝ@;9-o7&!vkOS:p,uqyؤa%Kۗ4*>TH|wyyϬ)qGuwIeum>}3i=KO,K%?*{[L2ّuuO]{x ]7+JfW^F poTN+~4آ6:'+_w \D^.-JŚJ󓓅Y-B'UY7œ դ+Pŭ<!~RXT!rr~kt\87cP)|==j`h%uGMƘ(:6Hb#@KGMH=%0cs=eG;|KA$i; +Y>5U[PYEwx52z zMSx nN[5Ȗ|̆nZ`ci$]fC~c Sנ]MoTzD]w5 7H#f_o*%Jw`=5kos9) $M7|Khv_sU9wQkzJ'_T~JC(㚣Y Cx*X⟫v]: Dk 4+v@B :NžV, T@P1L4tѾ%0Լ?:ď˜~lQ475! 0>8)1DI55`lBhSYqWv&yv%@b))`J 73S]iMRv+ MI;rJS uq~ 6d$ C͡~ŏKE[-ebAW2zQ,jXAllHݑ37e;p[cs}5h:rj)BER%/3|*uB 9eYwpƶ=քcw`8?!q#; 3X Y*`p/tEm1S*dq;i|:xZ(Ӳ;x:2aUi[ICZrHgitD+`+e}>tB#iCeUi8jχʽCCgDlj- X0I$;]@Gď-8rM]kyl ij)a2~8:ެԩ&,A`/2>惲 ]{]rqLy ׊ϥ73duC<1ĭ/T](}hݵW'+c"uG횟8SoOB@|6YSTk9~4 z㗝#Xx\ˬ(;:(k@w†ԚSz -KvV)~Bij ڣ6J-HMBmx>nZ%-(i_l NZޞNF(jZ[V4YUVQ 0T :Ɏc1}X%.PfFJ%r*( &f UDdʣPT07 5U]K3ּsrD=0xA(8֝r)T{0x+G{$&JXUG5vFUȸAvM ^kMv&fQ;Y綮K5J睊A~p]ZmNFu)[!ͼ8XEex*{n`Z! PPj1. T:q]H0=,)sC8OťvqP}ayQ R6)plm %KֿPn0|1[!ޖ6\8qd%A;5,-Ş\ T58Yv'5*$/pEWn*STR]pi']H0D40^IWyf!z$j$GTI ]\:(㏘/-S !0SoD;Q m/:;hp (͖ъ#OMi^=5 "$%xh1Jt[w'qW|4(f%q2FIJ33t5YL[#1-A 2xY,N$R%j.תg!QkN#"LsP]jykXeOl`l÷3uxҡ,$?0Z*]H |ci.v_.z 5@%s@iA.@ЀOOD;Go[6i |\1}tlWy[>1WFe\51B|Z^jif!i*FyJC\*OmV9QKnkTĀAԷd"W.l[8UL ³{ikhc9$y`אH{#[IaB1>_i'y³kp1LQߚ1S"nqEr/uVh0-E5 {-\޽qVOmuX{QZ n|\`͛[ H}L_zbh!Ozuom*ZM%j5yxvCU7=`UhDƺ0{po 0R0'L]T .k\,(o[>DIe慨,F>(:\9> Ϸ5Uusء[ϼԈZهe(}hN*F--Y~3P\g3E#A AJBO lL6A9n;2p]U@jA{*pl–S< ]1֋º݄u p^ $/{y:p%'o,7$cqN 62Xe0ȜmY JwOwc` oTȓu> /-K}RAp>D1 *mk(A\|Q[%,ErM g͐Sv\I;Nج;9A_L13%0U P$m:v7 pTRˡ<1,&>ʐ6X|Og7 }Iע5) 9Y%ʘbZ ?6F9HMT)DAO/| .:Bȗ$^Zs0`5U"|9[o+SHRv8f!F'~>K0>{޾Ϊߡ<ItF.Zl#:Y}0JyK19[6tO6͚`kE-YuSqKsh0 y2”k_O.ir¸4]9,~xDMsieK'q(x>o(4 =N.sX@I[&0^.L,П.וJC?X`N!l=,O -l47=!{~ Zb(-uǮO;P@@iiLi'LmRwB4Ik]wSIc *l3Hp}Pdy_k tu Xf:H޳foS "`\kE_>'*&Jӯ/-X&%% :>/#xH7iZn! ?/bA]a 8Wǖ 3reT~d}s<m_f'ihybwbrcyAm _{ #z#F\:)L]5:m"P &,]` ;CpnǗܸQcqb^b߇R(h_8x;|S9.O?qASOJIhӇXlj1|R DXoz[^csa𤷂!a*ucE+ՉZ,HڧSKօ԰q9\rd%HGQseFǃ)C%c%l>ȨsVZ3"n{z4'D\C+YV;1?/+?_"]ۮ cJӒ]yC7i9ш e!E-G}n݊ K=jM{d7dL%blȺ~KNJ1)5 hc5˕ xR9Y3mr5viQ7MH<Ҹf(1sx mӲֆ)tT@K^\xӊuo"F1& u;Hp&Ti=o?~M",v%hU!1~i$i p-e6ϼ=T"$Gd0EF¶̪t&x\ADWe0S34kp+ \}:,LkܖNsE?s޼Hr});77'_\U Yx5TL`0G#To39 wM3CjW_54XWVm_cfW.upcD"=wT׋}CpUPܱ29#% U8*SXŰKvdl.dzBSWR?ɫ;>i gIE2=͞'wyb6YmӬxCB':uc =F_!) `,#Kh@fg/`f:*t=Ctn>n9D$;۬L4{ mbtXeO©\˽J # S[E)5̈́,IB+E!|]eպJm ֍?렩Fd/SA4>q/xP4@׶nIvrhT+ IdSG=vz~ůz6>Jz =qYJG3xsbl*7Vx%WwqCL 0KV ܂pGOXqkbѰ,99ڵ+axE_KS\u_e,$(us۟Ktdƹ6Z_>'^UܥgVx3OX0;"A< NTĆjf˨$k, Wo|>H9dBC8[t=vbd^t1 tpV yRlSC(Si*O[ƘbGjpT.VmXd$, O52I3SrHE`andtS,RԈ߻w+*=̔Ǜ%f.- [Y$%jFEb! 1Zw󼓲9y>MG9dϽ\q$: 31O\c`loV#6&ZriMdՃa* ,t *KAO2`ݛI_ m_*f_pbaSq 27ZGwsrG.p引J5Ki+!a_c#$[bK w:aۣN$DlXY~/y~GxMeQw[^?m1(LJ $ puaa&3sș8,9=ƊW22:[|_:iRxNcp-5IzU7\BxVϼG+\Қ9y|A44=t/:L:hW")`k386@U͌ Gtm=2ݵOz5AƲR!(sye>(q~yh &.jJ>c0 nޢA?!%W㉊چPqHZ!2F #~qx4bNiZzC$=ɠ e]C Tm]|z8s̔Bx*?! )DtOZ5?rP;kROF'aih-Hzؙ O\n%q3p ђ];|M`,VaJ/( իvvʼn@b0 ܋S /p8i?srA@s%"~__6ZaRF&qrhPPoWH@ӵqcƤC>e2|I7RRd{/Xa^>],y(t ծ*8xk-b,FҦ(T3cgƈW9z8+BY|+rڤoIN2f>-z"1u8T0Y9LoBv)߽'z;ںEU`AGcI0Д+5.1ϰ$88 ;̛E ߾*aE) s Vkݞ.ʺX'0%P[yc/ uD 8(S;dS'}TduzǮ׬iP+2{~kX5?ldƣǀKov{8,>yMnXxu{.AJ9mm_>ZE{@aI[Z Xsr~L r@ű4VhEԾ|~r-؈ Qӌ ewy6B41g&H= |3 81J#%}a֐L.2CR9梖l+(b4tfm$ns'm=ȗ}À@@qC!~ yapg"jC$Bb| (HH@B@Ha!d!b$?RI<>JEȫ$V/eEXR(&`>Vԉ4ثRS Hٵ\i[O0k`.e{80$ Cx@$ d$I$i@?ZT H HI;!($iB$%!X[Ew@c Pc1 ڪ-aܑ1t`!@b_']1*#<,y$<(M5٦b$^zɅ֤6@H$'(7H$HE@$Bb9!$N)TL$8MvF NХEr\*!:{͗ftKaߎNlHr]5X>fdd`I&I BBD I&&'&Ң 0wnaRJ1f%f5KfOb Bh nlvC/}ynq!iX/[JY%xӛTU#rCH(##aW릓l-}>~Ga_۳J YP)$RBw`5lE1USV$LIR\)kpCih)eA! f큦|ʆ+ g[Wh/Ӕ#Nj)!YXJȱ`Aq+z%Le,iE"ab%M7VZ ٴ_fY9|D4jEgN:փ [5y6 M6łɤ%bP4g\tCD"V)^V!x^h%kvAc7bʘKLՆFy7/B EحbAfXTF((DMCY"( q93 "O(dVRi:]ۏ+ 곪˷nLޝ)vPvv4 ker)NnhJ%,T=lao;#2eV,,EZiZ6q8X1! .Yeek˰naDmfk}Heim_;,eK =//s*%N%HDb1bI*tA:- YV!}轗rc)-eyc568yC95[ |M$}[뾓:0igT1 C-YU3+)fJn†l)4DAbk^0.Y^ZfϙGx͈0 BJdLJ frf5"kI[cS zKrmJZXFlOEeIH 9%MB;YQeE!XYKYtI`- u76YӜn]AM&js+f}ϰ?W^ "d!P)Y *DQMnapRiMNr+VXKnvg ,ɥvR235w:f4n|GPQɁ$ rg &f%l[rcc;,(I;n $mw[L?,6F=q?gtVB,$ɻ!=LĚB"ŀ $Q8iQR99؇l\]m" -B\ZD,weX G{?!9$+"yT hU-hV+#6Ĝ ɓICg8 b!Y¦b尰0'LXRe s,13.رG~_=?$w+$r{d( d#r6#(` l B}6F,lHψiS;}Oqg=͒Ѳ,!1b t^LºF\,a8XD MaL-AkdUڰSIq(2ngJ~ݛN."BM؄RB)b2*H,q C bNJxSk] D4mf{sD,n͔Ba 7YO.ƶmj;Ϲ"d$%AEsd%eTU9g;(I' Z14;BvR9et^*Voi&͞FfS;ioc{vcyǀ`, W„P@EcfLd(ŏوi`$URܷ~jL0>Yo*U}0 b }Qa m@`FۇIWsW3X~FY"}[v% =&,S OH)CCH [lk~}vK ]uk Hc l̾k,OJ! d"<[̲,YABk哸=q]we{ISfMll.nQ-y轿7ΝXHvU8"U@U#U-j!թ2u+(J`HH`@L/,6:رXa\fpV^շOg6k:pT-,t`,98ijQeY}n$bM2PVW׭P86xG(ͺFlυGÜbE("@+eB,qq\9ծ+\l|͚h@Qq [b,yۚxV}_`;a&*H)$I7\nbAdc"ѩR{/˳KP؜^D /vi[ѕpx%$ .2x-dΏssԟ@ODy:2RHU@"s-SZ`!KZHԅ}i`CMI]zݜbyi̎sR̹_!ȼ *$d4@']֒ݹo4^!bhgԸi}N)8:t::)$PDTR iRVVȨTZNҒX0"$ǚFyiubXQYSi,1+s3U.!i R$RI(M+RTHC)6.6ftcZ[ZlЅ8`LSd(Q;oNp$ "F۹GI+$]0 WjP"Ƥ2j"A@AC LVn鯊pu"N;s[(\+9C-)U-M#pxnlU$$Y!ɐqdX\s!R(KLUHM2qu&+Q,-=fd}Nơ& (""j(1IY( q))jHdn o-٤elE_mlnO?vq@ 'qH SjWs,XŬ$0t! $L7wIlt9nJ۝svc;#cm#vu?wws BkHCʊځRI 5dB,RiR)F*+W3^P*$RP&˵p06P<2ټqN[Ym-N{<$C,*XHTPQTȰX,IB6~콙v;-K00{ 0]F>Z$!ߒnD.ENS)E_qD;$Th@ U4laRCr_kxi3LK'%ŹhFIG}xXr`u˥X*{.֑=K%=-16y=~DDDcyҪ,XCT%`,&1N))bzњI%}6D J->n9G>KYbif@ Rӛ[_;n BIT*"ĻZf8ILK DZ`m#]tw-wv0Y8^ݲzztGI)ғbjVbc-AFOB FTZDC"[SѐD0#꺩7ic0`1LL(~/9' ~1;"AB Ug"Vz&1LəEkF ?1Ҙ?4ݼk'_̜scu٨" ll0.BV_w777a*B)r dLR#bbȨ:eز b *[kA:ͫ9 $'!XSÎJ)MXg%^;(Mجb 6Jlс1\jDLC nlҗnk]h3@V[ YZ R++%Q;{XBsPyڕ HcJ,A@\Z~$Lt*"\uIz^RbkZMY Yribǥ|:#?cݟ>sc!+7TңYrZuO:HROL!YX T^ab$Ō}%UDV\l9y{X2cN^,凕 RcOI8Vl(@+$4PQLNY]03Zf.8͚uc`F͆`55/>6M117oAI Yͨ8ZP }@8}6ۻHE6J*$t",71f0RJA<1(1x! hmF@ŧKU-,6XGǜ6 -e.~F_?lj7J%d Xd'jX,dDD&AtI)*Iỵؑ`U8f2+4kJʶqȢU[ADvT7~O-k!&$&0VĐX(E%6@1X9Z p2ʉJƅiSY L7luͅ4ym zvuvxt+*ZT{H,XYMUJRԵ 0'V mix8[bGri5|<!(D+ZkxjrGO?k>oA90d;Uf{ '5c)i8[UDE#w_",=uUU'I 0rBT%sIV fZQ" FR~--#e(657Bֈ, FV~q!FRSy93H,w2&w)Ij03 $# lS+˥4d`g"ˁ+YMb6Kn3'-OOl9ߍ/rBE `BX商2La C 11bF*ߝ2ݵc-S*';iRfa=GFL&f`gw>}G % Xþ#X-`!PQW+L0֎%)1Yٲ7R"B63Ir#R~kVŒ{ϕvy^NuN ,1'T 3kJd'+ jpҍ@Y43.7lo)p6rWG%d`\vq JڄJgιqfgDݰ4@qBTI*{!Ì *eY>j핚h4rm9\]gx՞z^q8{ϼ*I+ >@xE|JE(.pj4٫4G٥59Fa^WHM6Q,q*Yiq&uP t*Ia C(zV0DL) \0x400-vmJiah33)Z9ei=ߣ9P&T,1Jb AdD*FTTU؇룷:eb02F#+) K:݄.oO%ƛ:浮OG)ɞxv@>rWn2)D4>ffQGS})Q0"pCQ'n,P(I%`0OsJTQBdu~Cm%]L\б,kni9m@ 6~F& ?n?\ߞ~KԬőUu`E: q1H!'ʸKQB0p-5H{:˥GLr]u?͎[HbBId(jmXXQ@%-C%ST0.(I !%.w3I%g]sx tm=BBk!P Je}5x!'jΥN1 TX>{a Bj Q)V[&آ$ (IVmzL[sгhV^)gb#矨~q{ݞ_9=/{oWО&BxI1!Z%k&%Ve0Ve~!4Ҷ(FʏRt8~.^snc ƴcTlBlnslrSv{1vfԇ-ߖ8=l($ECBVbUe(qp!n8& ,,e/eI{qȳIԶ$oWW 7Q1'=WRu֖lNԊqAB(JKB҇k(gk$ 8.M!i*4L gJ#GRG)'GV v%d!FE$AB 'c Pv`*@$Ed\p >%.Ě)C}[9taH8Xu"\b i'cpr?#+ӛ!';Q("`kQC1&%@L+jaF ՔB(6gvՠvR@,?7~IhD(XtdRkQP!} mW==-a"[7OlN8O0U|6q?6W]$ އ;& C8kQ/~O>2,$cإRH)HȤʔTt 1 Qe(_Vl},RRunͪ ZZt,}O_llY rUfHnm0m^ J YJf 0mF5"NeHtJ^`^z~͑. rlcc8bҗqGcIԔPDX Ԭ9SՋHTUŰg0\)RE#PЋR݉nɸ \#YI[ݠz:dx Y(&$ hJ)ʎVXQf Q2DmjYH lZЄXFYjNOWI5*E&H,F@Ь٘*cdFTٷ.Ji*[oLYm120mis.Glv8[64UF&|G۸N3$X 1'c90a%dKH03UZA we'nl1ĄT%q老"8Yuǖ=>wߕ7dEi X֭T ЩBC'`Cee1oJgbrQY4sM`M &gg؞7J,*QJy\Hɒ5i]D5!;ma'o)l%O$]H ʹ9Ln׺ݛ$7JDd7kAbUPUBe@c%C1:t6[K r+`NukeŲ H[ɼQ ±6~ qQ!v"7`)AEQ Vx#"%> CLf붐l!e-H%*i)Rll [4hkx)f>7t%BԒ&L,Tf@2 *,iv!#ˍ6IJ<-.xu Y`ȕgnۀ `AB/\0ԃs7qV՜և(0!P$ y!|ė(cL$`iʲB~yj4nIvlYfk& Z4H~1f |vEE v $P!{[s$2S#R@>&,aԒ 4\- AϮ1jmR߭-1^=__pB$AdP݅A؅X&+0j lwlXa;Ƭ;dh')bX efz>tywMT H*PXB( 6/*+%R 3r+mX=6)Ȯf -٭k#x٣Nq^WW PGUP( "BELB[eXEP(BkHOyǖݴ)%L4Nk=6ꊖ5嵝:Q{s ؒTU@zY!Tʔ@+ +EJPARJV;B-Zr g5ߛ6`HsmmݵMŻE4eÝU1n<|QvvKi$*ȽX-UdPYhv({JUج'wsp#sxpCV** ^eqӳ1ā t+$4UP9*0&`KmKYC笤P`dI4r[FC8ĉTu@|$sm((ߔ깶4 |V]t J#?7vtNC},$mAH"I`rdM'&NkQ3F2Pk8xkmQ<ߒx'()82VVQFX@PET,82 `,Y{C\Hmj¬ZDp0!ܶYgvmi؈N2۰}fҿɟI8!IB+ dR*8+ii{VnW[6ͪ61H '+F/hmYwz?{ӧA(*BtIU"#@DL!! ղGr(e$ OU% $Qؒ?}P3~_4H Q6yY`h!u,A(aNݭ,Onma<kVpʞǻR@ yX)HHU[$+ jl $ wܑeYCٰJƤFwc>@%JШ){_Oz&uQUdB nȲ(([HXhGVVcS*ÍN&ToXivMnm*o7RSKsl1w|'i[zgg^ѐꐐPJdY$YZTdXvr|(n FX2)5߆Ԣ #U}ߋf͔1V@R1`% 7.$ gjiz3ȹ:ȰkC<Wl 9KwY:J*@!@QBL\TaZ%@TKlkY=Oe•,s1b ʔت)rXwV+?OK܏nbB h*#V@ْ,EEXVJ!``CY@#H&eёw8)˦4iɹaP8n~fIcCd)RQMB+MU1lmÁ-VRa!܄'"M.B"4/}eZo#og~,td;XvҠ Vtii,R9JpeV|Wa!m*J K}9llFH&S 3W׷su t`F(,$6Mٍ+[h*[K Vt&6*ė#<l*&<j<7*F/L.~ArBtgA'LAlRLa VHĘ-QALeQ\ ! $z3%%=1G ;q9shDVS,X6iYbg?/o~r@!i$XJm ʀֈTp b <JBE#WWuٻD5emJ3pKw6]\Swm;[{/{{OyϤT : <YE XtaQ$ƒi7\$D bJDb$z%lz'7kţa0 K)8!`XaՀ*BTXTAJĬRu4 B!r4fe6сj_sB]/ V*=J=)(`zua}:"L9,zBn1ĥ%)mOW&QavzuanSQ@ͮ@H+(Iu*sP-'_#Ξqڞs Ag3L%O:V֌"]Jb,G_.͗S&L]j~-`ǂh1Upno綒ladj,RB)ERTWkDCdLdh Jʓ,+ &I`:<%W5y54EM ̱em}JS-*mF[wH,X7KTk7`CE Hbs);\aD1jm`GKd\) L۽HR)ػ04{&a%\/6F'r9NHTK c1$P!(ȭZ&NbHd@ы3.5@d-JMkV4c;l[RԔ=Hwexs>A{+  "$rbWADZ$! 1SIHa-w #Yrv;anUw\ ҍ>ϧMd ,J,+7Lr)L*t+ p!<2a-Rx󃉄4@V›M3Ōr%ʛwnCu`lEmEE*cU۶:h5+nFe(+rhc0qփg7;J 9UY.P)nm8g:XꈰX(sd:Y`Xc՛q ZYwZɣmSAyϯ#^EF]ٲZiZ ʞn< 'lYE!‰eXc]1 &$DHu٘#I)@N .@շ!p)@WHk%S5ǪB3h=|՟>|·AHl XQI1!ɁUJUrV6:Bتܲ۵۶*vc,nnn5BYlݱ0\kNm 5-.wx?tG>|R@jЄ%@ B $<*d1TͥYFvJB ux6UM4٧/?;ojX"pF.2ɌQƸXX X 2> ,ٰ6"z/ JN/+],ݥ> xb nKi9nʊIrHT+l*`,H,Mʣ[i{2+11*e)hnM5CC8%%񶑌o G! " m5`@l:N-T@:$$+JJ dEfj20RIp0ORV&+@LMY,(P-1maD͘a֟Gc`PPa'1QDHd ʐQvnYUpB k[NL2* Kk XuKGvn)R뼲y ս19*ـ9r_ۓ b0X3jhINF%bޫ[Fk2%FmLNs\-zv?>BCWf1ڝ# Hnĺvk>"X/2^!UWKZ)e[a情BND=2C4 R%`:oC" {=s>"z8ӆUú-æ;.o߇iKF5`P ҀB9b%$Yʨ- 0PG3bx[au(Y/n8ri.A.bcU_EO_wϦ)Ic  "UXJQbȰPR#*J2(("@QH,YdU"$*EE ( dPPP+X2EXOb0CHw6*ŀF@XRg!t 2ĨE@թYb a2>; h$-/۹LԐ~vJs]3 Qr\;͞_wütN,-eV@%HV" Q`QJw^,4&# 7fݰa8V$ٲZfaëkoُ::BY: ,ea$PZE(QgK\4  EOp(l[2bR(V⯡޹3n;?׷6)Y͇4ZdfZ:ő\@I"DIaVMvTaGL5z٦Uyn{@+\f]fggk+Jc[Ÿ΢j<NIAT!93QYr`k(cĪ'v ¹R{kQ1L V x۵mKdchWf9 g-!&J6Ljȸ$3S(WegM-jmmuXF6mg:O!2@PDUm*()P !ANVXH\2U>[ٷn)ZsZ7ki|9?dnv`CfI&ZРđB) V,#*'`]l2"IJUH! m~M,b`V&v$r`x.VH(pk4YݥYO?4wLVDQlFEW fAfsM@yFmt]B|1!MwfktFvSO75hYX'_|<:ꄒScQf0"$+2M21ńDLM| 1 Lg7ZJ;S85un֚_P_+sJ[kVTam,*$k=Pd!&{Lw5f`7[ciI@lK e{wo YYN)h-\:q "93 `#TZ($"й .̈́󧀹2̮ڣvrcߧGz> 3?y??=]ύϫ$H`CȁXTQdX(*LJVZ(~2g8(b ifiD0Z 17-鿏pXXCZ[n0bB1Ǝ=G{=z羰8s!搁 UYJlFuj9Z$cYL5<[rZ<q@&"4`Ktǝ\c?7=u, %NWAk*L@P"jbdĸQJaeucɭrRn mGV"tbnąX҇6/)[uoo͉$X!y(e!yڬ9M7`JIIS#VҙO;ɰmIEeGbB(ľ6UچV#Ne TJ\sRcÑwߗ8]9!,"&Faf23ܷ*.UVt29?l>7 EF,s`sk\L2<寒i .Ü&JvZHN]iam0X#g~s:gHBvRIXV""-%`fPȨ/\*T fz\LG F1KVnsPu-ml)?oy#6CmUBEIYH`E rURbD9-+f9Yz7)(qǡr2;՚jݛ3`ԣ+F7i^{=g}OА8H !,1R,*1EۖQ9J%`,-"g"_I]el]IK}8FM%ĐxÉPG9vք0kn+9k!_nicR K-~RcQil&BTPk"ffSuݲù`BV`IX[ {,\:+m])t k@!,CY)^Sa){ɟdV@Pb¤ ҝSLd@Q3",:0r" 'v"st@&챌D+>8 7y*I"§43-)$ ^l1E)%0PCZyMe+kBB\9B]y9Ĥ2Ҙ``VUs9_O(m+yА9$'D$)W CBDU2дV lݍV RK4´arPnY1 De2t*.NjT]3sfS@liX;RIRB-01 +ՓπmF dF~ uvmp=1&Sv( *QLi}gnDN)I!EI81QLffMGv&UD [eRTXLer@ A#Na .ZQn(x6#=k>^DawNta I*s )a,XXH'5U!)夿*\e89"hœKy#+:bXta X,XI:Yօ` X )Uhȋ֜5uteIFJ>wX0͹4@Yuvo (*\Q1Sx6uY7Ҋ۱llU`XTQKhJPā+ XW"e%2m)ߜ1[p ^N-IP fշ] HߩX=K#@ :0Eb ,EȔLI4li F,^O$;-3rYwIkc[sZZZZ/Onr3dBCXH*WbՋ2TX +Evf!PP-iQʲ⢝es9ʣ]#5h=Վ1*9 xhIȟCvHM  lY8ڦ*#bɳ$ݐAo2[a%DJHSnݲjIkcxqvi[1ʛ9·%}>hHN!͐+t*5U9y,`joVpK(|촄v4<Z҉3 *EOc@BJ*,QdUcUf1YX4jJ Dac&ٵjDg@9lbD8x촼4r(ٕ,dm_e)kDuOoڤPQT'k!X\L`&̱X*6J_)Xʯ.i6$4\)1+[JF|g @W=GKo/<&>îވT*" &$`cUXD2BQ ~1nͅ*kh~GxjaR Sb=I'}-hI6|Md2ib0٘Ty\6LCSQvJ0ŷ q8m#,ՔXʌ~lXycCN8P#m>%$弬 X@ Z0\Ŋb37f(#k f\AR38!$*exrXtwFRX̿clKGY*hխ/$~y:Wy ~X|-BQE%d@HvIYN\\LIjKkpOwM!( rsqF.B# c}ˡu: ơx_Sm=2X* }$6aU&!ѝ-e+"YZ45F e80ȃPe0CWVbl$ҾKW-yVBO[ilPm (F0Gӭg 0gڥ|i 9*Qd,"d|W`5FŔ%nۻH!͑nne.i)vƞv6K4=}BnO_?qBCڂVVD6eC`m-;3R$0#P %Y=5ikt؉#=F3פ}0,PQT]BHCf. &̨͙ @4֌YjĈmt̗뗜I۱:e23Vm^Yu)KR=3xH#}W|d'jT6H{iUBE bIچ-;id`dYFܲͨDvvnSBc m@]*uRfZ^=t')$P$ej* !6TMYj22$^I+֋oJBnQbsR-u snVPfvSK\zqwK"l! 92* +)Ri R(G P٪#iLSdPYuq= 4JK(ǹts;Ȟ<(i@RQH"I3APzX#l+zwT8J0,! [79sjJF a;̐*AdUЕB{ R8OsXRvbZsim'-Uuj Tȱˬ(⓰LgӉ6+ l!ɘDE "((RDP P0%%ad nY fL6W`XPϏdE1E9!BDH,XAB"WUl2e5qW=Xv0ղj=Ո&{=M݉'-$@ vɵ;g7c흝̥ONitzuC~کHi' T|VfQttP]ojZSE \d~,)T!V> i HC񎝧~k31+?{)„sDgstat/data/pcb.rda0000644000176200001440000001264414127330265013553 0ustar liggesusers[yxLWDUB2wYޓd3R!j,**v--)Rjj-j -KiKwsr>}<_{|gv=ՀEX$_'iX,5w؀ڿ nuMjkrDnAvE]UȞܶXW_mM{w/si-ny[}nlw_}-Ö#iIm}%Yp۶66p6MEkƝvۊm}7鶍.Z}|U p[w:s6wv7Dt aun2þ5ڟ3p~}9L+!8ؿ_^?J/1ڢ)=ڼ薻Wz*k}N&m;qpmG~XgϞn[V#u/0/^d[a]wznV;bݿȶCu|yHy#4␡%W <=mAYMD9\SΆɯ6/s^S>X +/tH *?kk}Quٓ`Zf0W{!~q;'z};C\ vAvA|_|d\Z{Ȥ{!eyk~ۄ,-ry{nz[qQ 3/y@\Z׈Ca ߺpۀx߷aa#b^U#&ݾ/GnE>u쉔raGPȏmF*/s<;m;y!M_}7;6k!x{"/} z< 51.A}W?Lvkw/<ĥ 8^5wy pڱ.85N7xʯ(?aZ%ƸqA}֏0xi=![{Oݩ햳{] vB]plo@>mseOot>DFc~;n8x?r@;򩃰>R #bƋ`/_<UŁǝǭ*}x6Ǔ/9_7Os=1_>B/oz}{kyNyr$\_l=-:SC.Mߧޓ]fo9׳woQ=Z{j!d۩ץ7+Hw@/Co xyƄtKh6:۸5kܮ:"æ(Hq<[<:⠢檞eLיR=anvwxzGFFnGn^NxûhZgz޼J };4{7=;M|Sv+ӲG`W~ϥPC\|p=٫ׇW*[빓P#~!^OK5ת= BNB{N{k 8=#&o}tZkOϾ%?'Ny~v6: _I߳&0% ywO}҈˞VP[!ߍ_^fB<,XmMH!oCo@EyTVUqvl Ϧ05z<1U@]: p^s[V+ynkQ7m<+ߺ~KG7A+/ݽiѼ@/ϥ!9/93k:P7=zz x|5\_Y9u9w'>΍#k/zߺky+^/ ݞ4K`׍F\|f,z~<ꤢd# jn1qm{n_n &n=F>/GA!ܿ=A2aW7;.ƾ0;>k >3~|i_'<Σ,ss?JF_Ery*<7dGUy3ijMc>?]ݾ-٬am.k_ K64{e<ϯ,beU\|~ E䗲O'~}kjxJmq*q0hkub_Gs]OUUV֚v_>\~8nkjڵkeJkIZi̭A-Ӕ;*OڲyT5;gwR~8/h`j_ST 4~IC/uɻWu.{_ZөZrQ5vWRaC2j4uvɿui h̦O?Kc8xa} JP⊹4?uߦ Vіޫi>y9# zN?5ڌjwibnM3NRd0utXASWl⒯)٘y׏SvOQ@iB~Di̷iK|~Mzo?A[R͟[ӌ[ ~ ʹs5.KKnҊxح>Bx*ٺ.~uJew:Q7+}zTՆ'(_<3,w-h݉*7j^;UAMS5{D=Q\L`VTyIhX|6Eu9>P{ERTIyt:TK>8ǜS|s|ox^FGiNc:;ke6?-{i8['֟o5f-l~s65׌ay۔Y<>nZoMlѦfx|kaMy˜/p [&k |~sl7Lr좭cxgА?6b0W-BHkRVsxSN˝<R]SE^%CdC[r "Kp d|%P\W۱`W.n"vM.* *$aU(N U"*"A0%KchY"Z%DT*PEHBI" ڒP[jKBms @0"8^'D{D\':׉F:QE2HFɨ"HFdu\-PU@PUjZRV&U5  T3+JŊRT(5q7,#AzP1*MubL)T1*B\8W0Ź.iQ1- sd.y#\Ğ]vM.jC>#n|F03OA># jCj#HmDEmrY`E(GA#} >!vQAmaI8< w,F7f`P@'aDIcz|zWR4wߥ<)\i mؒ~ŀɡx84d)Sfm=m8,)C ,:lv*`3W1gój> :%O1N?d\Ts/ ʿ_e1ֆ4}ylSDYݼtiʥՊˡwT _M+G#ܭŽ]56ħa10|j)(z?}!O']1 dgZEY3ԏdY*ԙV/ڙV \792gןnl?s57los=foIp*3; B{ԸZWq[|lor7.5MNq`a5vg~-:yǣi-/T][7?Y,hܨdQ\ Zh0-2R)ԣrxj-su*l[q#Qo鲒HN؜@gސ[Oqϻ]YV@̫-nT=4;>QўԼNGW\t[et8քw/ޕu˴\zۋJfeU^;Z(DDDDDDDI $@<ԥ/Դ뮺۠U9݌e@dWZֵk%@Zֵ)JR%Tx NYeYzkZֵu]uIP*%@TJ P*`K݊^6e7 0`}}|`e*)Ur{W ҪT)@.JRKT ٭5-5w) cI4#{Oɗ]ƘP\<-c{e*DUIBrU*Ugx^dMP,=q9`~V;}t۷nݻvҠTJ P*b1V-JZeYe_߀0)J\@TJ P*%JR)JJa-.u]uzzauaaaaa`ʀ P*%@TJ R_߿kZֵ Zֵkaau]v3TJ P%JkZJ P*%K]u]tjXvkc0 %]R9sR9sMI%6BI$ $Sd$II %8UJl-xS1`pppfֵrWb""DDDDDDDDDDDDDD@OdTKx3뮻ׯ^\k 9s=m?SJì d9.37hm]̡q}:i0Y #L!1_LTbZ`骚SC?9`m1/:YCm~0/tfXoSd9mgVܐlB:qdG@|kT}w@<@?*FAbsh9^Axr{l<>E^R +g{#['mWetԥsX]ر!u6f]r͗4MIewi6-S]UAaMgM57bj"MMElFu]Vep]uYQrZMwZVuZl vVBe7]rt&a)6,qc]5[kVQѓ$&dvBiu}k\KӔ;KV. m&XmBinViKVkD1#鰊VGl^{w13T()Y)zΓm7,x,Ϸn.ƒ-Շ1M [(cx&gw3Mgh73'vLM.\n3;խ{3e{bXuYUsm]}fXjtYڠl3޷ wꔎ' نlʻHo:`ec[5 ս+bԭ1#:M&usɶ3gݷ!3Bzj6&>hwe\RgF Ҥ쵖T6`b73-{q2"v\\-5F9}U5ayhSji}13[-\a-vi[#ea9M#ًNn,@֪T n)AAtgȜF05+_9KboـI;W|LbxfmF5LR"#}[hgp~u”fK#, /0 ЮK-4Ơ)UUU%Q`,K$HV.),=m22&9`eaUQòFʴ#Ԋ*fiL*+ E()LB6ʅCSUTQ!B?XG",ʯ,gvUBB:ʯe(hIC0V$H2 4L@iT R&Y0 B2K ) ]Y`aMK ""ʸ.j)./Q L-14K FeV!P8X*4ReIv P!ե$M[fGZ+$#CL5#:¡QARONJcL`- ʫmН; H $QRF$( } B@ }ʐ"2I!)!7jX"A\-- Q\rc'nn j"޹vygN,AAC|@8|es}sՈ}l/"zy?A)^:_ZJ@ k6Ho8\ݖ&Xxn*~/[cf'm/{5m+ܗocUWbiUc6*6O/pMz7_g%skgWfYb~²r^]l}'Nv~cT0Y>lvf#}5tkN0 q$$Rd*8Z2A(`0($H ^ o1uu*W8gt Ŕ-8'xEQ4xnn8̕LfmF1~^)λ[^-BkSƱB#{8x`{tcV('3 *E凭W՞1nv^g$;?mS~'ZB@bE'`!0Ÿ-V1%n3$RV%3W~hFSu~/ !@ U$! i=F2=J[Sw>{T  S!}b$A0% miDDBjC_8vWDw/e4,l!d $eԗ+ʑ7ى0p2z.;(-_ka%-n:e71޺9x}wkt1:sDÓi4Ƥof8PhWgeA(;_cC?8sȵ=FE+_퉬ql#)RO7pa9El; rO5CTyoy}65/W4" դXmRa-v/=FSzħMBg`aWGZ@HC:Ti(AJȰBRST2=p=T荙Pb#(!$`k;RYxnSXy>X ZBܺ+qpY.oi^2(Q }/gz|/y,f)pQ|z/3XR!h7 Faf-®92D'y9hB5$Pt/Y4 ) t P`7nIɚ2KKsnN&݁sӽm e4FNxJc>^aa_{1]k*Ej,B*o8;M}$r1C Y89ï$ B `| SD0?zQS!~A('v#qvlPUaFz.K.u;5fɍYjf곓vs]_QE7x>SXf+*섭4+vlq1 }+tުy& $= Ȉ )->8ws]tX@j5YTxB0|~h,{ uG:3+sO5BJ?8bHp0ہ}8"31H b4RSZGPZ+(d*ʡ[`qߜLUuuG߽5]EUAQU2"EX*V 1FEDQB#\Wiz#OO y2IRT!|`daxCnU 7ZaI$) 00Gf(;uzkg|tsjXv)ȑ) 4.'n9l.5էTvpa6OJɨ fg>IJ)Opڟd42WI;;4z Mc[qi o1=e㛣h n[E Jh^<@ ί^]N@tS6C[ɤG=0ۢ 55tQ1;}6HvP:3Ы6?R 3_9 z-/l>ekq%fxM{4JZ2jU+Xؿm: p䅗k`,`K$AJuLD~N@ 9,ٷ rN?{$BùSװ;.F6n=j|d,k ׃;K@#犕W^7x9Ng&ޯ^h~VkJ鉲I{Qn!X\ͬo:<+ԥvuQ*mkBK[ul.z6%Jbs)49;y5,4 Xy{U˛KǔUFVNPcۏ~4 GC&s=Eя:,|{l̨z8QCyPd奄 trelˇF$`l)O hxY s *Ya`0O sQl%1J(y LӲe \tŌ+FvZQnYM)i̸eaMN2Q;t'rL*t"Wv):<]òF=[d)t/2?A'f'͇?w?38YUXY;yw<ۥߨXH4uZ 5~.\N݀/ -Aƙs 0w h䰃_eCѐ5)_E!kP)"ҷVE '{/2+Fm,[8=m˙|?%K8V)|>j ADAi FxΔ2 'TjѦ sZQ]9_#-@ou* ^XG˧ q%N|nQω{jB`f9/c5\Hdh{/^h*، ˡJHGFTb]%$^c/̤vHN  j3 wWZYSUwut ++K8,~@t;+G{ȥTL2 Z=ӆ1gN.$ЇUɚڮ\L[?N+48#f|WaȻlڣ%!4*"qvU|F45)kb8ݔ!j9(_K2Z. lY{`hF.ӡGz蕲ž6"AtͶaof1 =4;oC="Fx;?^M,vB)\3!jӟ>yn$"En#0h >=x1v͏ZR*UFZfh81  LUL w3y]v@uN+/Ԙj`t[]HFMŞ2(ctnig\k=*hMG=&F[aу8& GaE"_?ȸ(D(͒h H]]׹J|rz&i;K'0VopJCa Ⱦ=`==Ļ}MK4VI+,h敼ʎsWE@:hbYچcjc^MMNF.9e2C01¬W+Mv38j(FM=f г^6z5k?ԫؓHHplLSX~+24DFpN(~PCWh!rma᝷:@J) `&uC*C,"2f}5BWYFA' kOT{XRV-Á QCM,ر}r6ѮSŗFB+w[w͇R%S0.S]C o4,lO#L&7^"k%~♏UV4 HsJ&0!3Y1 Ox$&!?:-)L0+HiS7ju"zaqC JEX8Ќn[+洭0ʣIT?M (籟[@r!τQ>[;BGC6qVg8ݨ:2)BH|h)Wp2M?m-}m-ه+4x,@kֆڡ! v*T$RO. k^D3n‡:ߟ?}Xᕨ~Y2Nʅl<>wt͗ SJhiy OQonviК}8T$vޑ iiC-ҧFd6< +Ypf^3$#" >CG{Ѐt &Z~:٪C;^R d un];2@zѨ)9EBcS9FLˣ˝>\eP*)Iㅊ>kj#BY/G;vb`g\b\ @p7[M W!/I=#%@0qUnAgaqxa \#R(z 2 /%6>Ml' v#r{]:Pdc z,K(6OKK ;( . paV="/!\T=̔"-lKHz9&{|c ~hq{T'MuI{Lᔠ w1z*&"+1.6xtSNoD|;ȦEaK01\ wC,Gdjd|-V,g骰x ΨBҡ48`$cȹ)Ŗҧ Ǯx}PZdzP6*NŞTz̘J,U3.)3=o|S H4vG!rmKiGՔI-}BcnYә"GxJ@Qzi_3 qV;BA ' iVڳ<czpJ8*s{#.$֙f[WRb~>=~I0RR'{7Y+I9R3Kh ʓ6Y lnGLt9ߌb%)qKD X㠌fP(+7"@$W"0ia#Y, t-MD 8^G0rnpQ,M lf6n,Sy/li,ةjm,ve2lܧGG{C^ $]EYVT~l={4ɹ S8;&?rJbup h֭݀i֥<5e]P7e y.x&Z&:p2r)#QP4ߧRUɂ?Xطȁm_ Wf_Kpj%=:jI;,V_zNZN'A$[aDW Lt4@,FgF'{9=N5XpcM ^pD ]>d|H s F`)v(1ϭO]:T9ncQH&jJۺaloRťHD521 NEFl^z ~"EdN!{`¼Q_ՎO(S! 8=9by]E!F$'Ddlw} bjg =Vˮ_Lwᙄr.vWp.j(6~Ji4vJ#GDv%('LVʯ8>)ˆ38QV:Ջ@EC ^Mu JS7mK:G.o`<\`7w,-x8+GQ_&b ւ8KCÿlkcWM.6A+/dhWpe=Zy6D =[Kх'_X&LP5"נYt AL(JLcmi(9gʒS*owNρ 77X:R@"@jpn²B!yu(F2.`sMfTeP^޻4^ʆv ҷ\`b#Y>甖Izn&0KͮuD;HE܆᫺tVI\_Dʲ}5Md^K=[EkKD`Cus~Q7jaQOƐ8óמ{f„*!ݍJbqrE~5iI~ֈZAF6o„k$rhHܭnǽ(}%BR &w!wr$o$;;υmDhXVVm$N:pnOj#E~/BQ;IH?/:d| :Y|w}Ark+ !k۲%H4Ughw&ToTg&{7vbUF'AIg1撧@gf~ŏH_:nzf>s1M;~f`]j B&js#*%S蜣>(m+!bjک.Gwq,pV!y3nՈy4BmOZ?Rc÷R Ocܔ:/R-HiUKaX2Fd'b+Ê݇RMOMF<lU13IW玈fhj{HXDHN>\L­d(ε4ac^SO;wg @S:ݲ&Ё~0,%c!ɉF%Ă(RaoZ~"^>C} MUZTenR6M h\+!=73wL?Am[S?#H+'b&.FG4eP~tkh7|Ii}!(l¶J<$7֮륗yh PaĻT>pG }w^VPw je8zP%^n0Y/~z²-胾~"m ۲B?ze2Yv l':!ߘZnI^dώ4x^fnF6 +Rc`?1ڣ3.=Y6[kzM C|@j2Sӟ*-zIr_{36ha 5hlT^rxX8U;r{8n 뛭z\0j079,ˇ 0v?LQifJ0K&xӵcxQ+94ou"7MHřtÛk`e#.e`-&VhQ4mYga+ Lr**5W-%џhn])y1Uka1nd2*=2\IHeiS&=Q-]X Mcƃ?lH@"/8+rY<+a}ԝi&R?Şpỵ2/B'GW96Oܰ!] ]'s(6`5i68X`ī?Q]*j~oh>F1c'_ |Fd်ՉƀHpL:msSoRT #RIw%7 )K;y~Lm9H%YHRcD=Ī`.<,M9q9U!/jq,r5GEq/HT]rAgCrTE}xXV/xNBJPͼ-AiBKhם5hko$k wkrF`K3wԬ|wyF'KAE2o&WI=M |(q`Pr'2 Hrb;}$+#[HjVheD;u uD1tbɶcMGbm[ ڵFһ8G䗟O鳯eqs֎zp(^ƣbαiq[jBeҞh>^@`~ Rw) O(C B&UؘX5huѾ6`Õ6<)oGlm†{HD牵iҟWkUi7Cܢ= ԁ3Ϣt@S]x]+v7<$饹z 8KL*2MC}>@?Qn̽:gqDC @1G|g?Q%tcBM[`[æ\5$1E{]VO=:C~KRh}t>U&Ja ;;}Mt\GBrEwPgn}YCݵ 9KT) OȳYU+:` >oR縖!8F3J&kb{SA(ɡS;7$=4Q̵=Ԏڂ[ GZe^/w_ R䓴62}cpmio4]~D_I() +SQ9^=L7{Z֦~e1 xʡ3^U p;/WSN޷ˆ/.,P p>Qڄ')3{`nUj+ֈhمjVwGG0sgf^/NyTckFZEA݊kLHo:y*q8GF>ǯNNJ+lЃq~B}R8;C.=c8ZOT&>(<,^RyQ%Q6ޱ*)hEt8Hc0ḋDݟex.x d9pޞQ\~MϜ3QIm24$ \@ϵ)Wh!OkƨG9UA$G={?|Q+#[LA DmbV6~pV)Q+P5g;pC>O;lL1?kF'.a9KmǏl7PI/ݵJϴFNe?&0)kO\` 52Rխ}i':]h4x@!, M[cC:L$꤂"JՏJfai)WRpaGtA!$7,c[W1+614/b[Q=`Ȳuh=I\f&YuwJUeFSk09e1U:bNږRc m+.w ]l(M9VqP_5c:sn;(F1(4);<^`c}KZ+1feŅȶV[=Uh$-`4L\hk#*l:9ǶгJ0=3]@x:h%7(Զu01OK T(c&aTE{@D: +|^ftWt}N@P_hxȠ  )YVV [ԫXS;r۝,^b h{b9>Q(Z;DeRi[\g+D HӕSJЏ&s(v ,%W^!7RRLAD^Iqy?Ls!!Z.8ySI?Ugjpc JFEnEmOy$AV3$u郞UQ~ xia)˕b\\rYKt#Lq'!6 I6CM-CH[(ZXj?%QYtq<x1JK=|wM[>FL2keEބEܼ\b կ#}2+|aMeDx`h{讃$mZQlצ1635==Pq!`~s^*{bSGv.U 5Q=3n_;XgCQۅz+lyET!1RtOx*yLIΆkzR <x]M[SO\A ԁ4GF$J=a"_sCMIJW*(B 8ld>f'lb:_(.14.e_<]#g"χcXj [8j 6Ugsh/|0ֹyo܆D'o߶XzslWQr6TIL 2db )Fs& e L UTN -6u"pD+gyۑ7aByCH#$7hW/ giV׋fUWۓDawT&9D9όQDq& 'Q0wMe)ҙK0@By`w]1a,lGרĪco;cPݹ]p5^Ue?2qvRB 1|eʒ>Г:qtzNS覗:V.KrвPw[~ǟ9](|+H =lQ(aMoĀQ!); /N<6荞mǟ0 uRgAjBzE~Sc7`$2#RuW9}쟘MP4F#qqf)G)B0TOtt8j>>S⬦ 7p4ǍQ{+>jq$v~&R7;Xtq2r>C$},y2++Qӝ+# θ,xCiFٹRI $4?Xcci `]ѨrDX;bn H}TA' >;bNe1Ȩ \Uwm["t0;df9٧Vdocq,y#MoBfD#2Du-6}YŸUԡǕ HD hXk@0#sjoƫCp9UD0 7Įٶe D(T!Ky?gbe}:G_/.#D8`b+GFQHET1 QOqbl u#;Yʦ5̦Ƨ+@ZO?z)*b.IC%,]} Cfg񷡚n3l1~DRCx:'CgKL>WxWsx9ȸOO*Qg#z%SkIp:S@]}>.ZcdBˀ3T <\IjW#h@wo݂Jdq>E@,󢕒qSNSQk9s->~SsOTfV`Wg0*d<ْ7WlR\B `)SF#I$ܿPB]oĂ\d NFArUQ6o ʹ `n ow|,.af1j4Œ\n js?Bek\5H<E]x0g{f 4&P祤̩OUZCǂ_Mpl+ȫ'O&"˔~jWҡ}s1>c.Y@y6щH/n79|#xk T6^PЁGG/:B /e2tW=96Or87~Sy!הmh-.7=e=?]Ux" |3:F~W|\f]9\8 Y N?uquC}BD3J3v6nݛ`nɍiY\H̛i48q;SWyNV* t%EU>[6)K(7jz~.)ъjǑQ/.Tjmk9u YД^p2AEAeo6BJpCPܼV,G:yCI2E:4Ü_{@V; qb^r*ybg|FmĬl<5{ 헮lp~rfmdAQg8^ٻ>e's tIWK'eV^/[@I4 8?GZR0.;xt&ІbVʱwq[L:|+{~b9靝FQP&zTXH02w쭰\KF( λA6xSq͊+G'Yg$3ԅj^j6lT+ fcZ nT@[8WʢZ%sJ&QEiuG}/7) hȧAc s1# Ֆz٠1d/̩}Y8)Zi6[Fړ [qxl¶Q+SVz0;!WrF&co2X_p?5njs1y, +'1s/'vn;?tΑTl9tyy3sEM.f@Nm}!wƈƧ {RϹ54̥v&}jI dh3GE\["BA&~:bG?<N#F~*v F46ܗoɱ CHfټW7A$UOa  X(:rO}0v]V"Jm]QЁR V%Ar~31-Whv>1#y fH%[ ڱb2TŖ75DL2-)~^V47(W@r2a7`vυ4 эsQFm\MYFLKZ/Y/z>$Cauqqe[8ur(jݴԄ_ ;U2;\όdl$p/!p|u] ǛE^Os,خ g8/%"#?'q5ya)z樾LwKdXe kfy1X$PY!uFPy3,.U> b .]$DcKYuZ Ck־;iJ, 9/>gIxNTz袷$Z }p+ :Y3h^j|Ş#0 ?5K<'z6c"$c 6 -KAfGY \sJ)[* <$Q?S5y )48::7 M 42J) 6] &`CrZ<QETvxPH}OWPy85bDDh~Ohms]fK9Q̴} T:Rry%ImƤWμ%/\:W\BƕIV $| SWVm 13F&" (AT3_/*:S h˨1ldfN_w74Qf7V`#9GE' ߊg8vBL k T1 BǝM)f ds2JX3$3y.rMDfn}z 9]¢מU?Wr5pJz*\L'ݐY` bt<]`^Q:Hf[)G˦R}7ވFw纔5ٲ:az<{2A }ͽ6q6 r`˱Z}8`봏ZvYІfy[G[„$ΈW됬"*r!Tӌ!!S؛әN% v6IY7᫆+A^r0 39\HԲ"$yAJ*0s3`@qg6L)!7`.^HMr6P5?ft sIjnw }3MEAԿȵ9v" [cʬ8Zq`Ei,^J4r 00y8s0~&K neĂm4l^zUMZ|CUܲ;Edu0)b)APp)Z:|1E-#O$;&h-`BD8vc`ƽ و*z0m9 <fky9A9*Gc in*237␜Q*V w9e[L]{RnQK1]T3%8S/$Xzc(IITobRj_EFX/P'K]0#&~QxZ)PgL%prûewU[˭b⦰6I8x_y]qeLO/~Vcбje ƻ@^ur*FQhK1ǂ=嘸(>v$6R^JՅ0*t6X]zCםZGoSߙ$tK4>/ݷ W q0k`=޴aP,+y`Y`-˥ϸj;;YQT.h:RifR=S()fD ~&$sbȝ`J|C-4H['k5>''+:0xXK{d+}0%/vSr(Ϊ~n uK ql_<6łZFX'D֣l)~#50p={D]!Ti|e3ՏwuU*VƜ܁'fוRXtK4xhfS(iG]i:L5"0)7:Q*\i1[pqsNFi"33P۽KIuY.6-`Eǹ$5Jwza56ψ|ѻ#"ƎKf}эj;rO2䅗pgZ1 xYѽi[@!}QVW7z׬+ 9m! ޮ&,|P!X ٛ) =-E ~fJM^+D $qr B1v%PնR$\4iݼ>Prug8BR(dVwtg#b fLlrxB =0͛O\dr/''O 9W^t >RR7X]{x0 0ur:׬r^۱K$7ϜXOZ*,9PbpŨMAy:Wc04?>܍_6Ku{DOnڷ1^מ:>V2ŶtqC*Xh>reU-yv*MHZ2#0wcSh@8|AqL].xϠV#E9Hhў]DE#iJƘDFևZ:Kc1&܏(>-b5 };E=Xue$?*+G-izY; rvϢG%2^CJ6٤v@q4pf欛-QFI{zgb r%T^ܠI^%)l0H0qReק| 82W!zTp_`dG椎/HVȾ9 )mB^&7bQKU߼pI[wՅ>J)wsPk5$Zg,n﷏<թ K6ICekmK}Z>ccW5Bn7iJ?a[+DWxMVʌWsΛe(ecRFZwE'~;zlΑ;(wcc*-➎bh3j9p^ᇥ[&qjx1#WЩ#?Fư~:!PՏH35Ag2Of5/qezQ`3, Vab(N gW`h BEEpo\H@,_gCn{™ '~FlmW^= E< .!¤GN.NOG*nέ4ȌUՏ!N-=-8XCe C?NJXg;G AhNoԨ}$jmՍɨ l3o򑨺l^rZ]$E6ۺV)6 ߣ\Tgz1JX['d7d IL0!\xYlϢMgPx8@6G3Ju2 ]PwËCp-1cY~P!DMBl'zVh8!;((,軑;4O|_A\im.B6pR^Ànlu&qꏌZ^*QՋ_R_T2kvu5P{ˣ1ēhQCh XaKRKEOUjC뇛BDrߒs뺈T᰸،p/$!GPscv$:?,|&[ ˶NBW}ce8n~Lx #DF';Ky rap!Q '3uC %Y:#-%0}N?=7 Oы ȓVU rj7!x. ]o~ 10Χp]IVړKz=Pc 20 x|k,X_>-eRE6|iřtqihol\|!Z <( z?}Bٸ 2K֞NƁ` zxm'S + #M_-i/3AKWs= kx:v82oPqx}VIPbnSF~FG4LU ůZoys a!(+ ʳcYpeG.J&L*H|7] ֛m^V0yQ=Scz^q:>&-M猩JN:xi<$7CdepO)/\jmԚW=ROɂY;RJۿ<4S(83x9.jDR?y uIꬶobPGd׭8SE@;c¢`oiyuhf =;>[XKu$=`V&υsqZشkv7)aX@y+,%1V R\HK Ck2:):5{f xʚ!D+pHtH)emɀtDoQd{+4_/#ujiC -)Q۬%؄ -2S1=1m6ZCU]f,YdW 0 |찓vcxT۹~ B ;ymNiNWrrzKYYm>M2KDYI7hʠ{WC.B/m>P@2XI%>YQA> g;5D?MZS TXn!XDdKa2OIXᮠ ؟K+1bK~r$f3(KnV'Z'Ĕ91^h櫲>ڈr"CUr0e`6 ;GwV4z؎üT̹ 售fEO;TN;2;6fnۂ2|A2hBoH[y.6FINY; (0RJLg Nʡ$;(`B^´hRvsR/^]w#>FG QWHdxiigDl(11'"%w4PN[Ϥ6b5H=dvji.F[x15&s`4"gܮ';{1_gxԉn5yy!h!v C#FXDa]}}qIC EAV@\\鴡gԯpFNC(KbʮR:(ә |Y{U?T=sr8zB]U"e!,"`"BtmWEk~HG39o)ږF?m>,vУX{:dS㥘 ŹCAI +Iz4bd?.yۿ01%2 0tŃկg\N kKF`>faV^d13+|1Hъ0e;~nqzb6А`R0Mo2 q lGYAT#=[c ).D;KmGax1FsꔭÚc >gx{T46ڟuxmjQ5L H3UNf2L[a`4F]Y]k;j2ϢY2vJIkW7P^ wCI-)zp V4J&k x1Hn}bq7F'y/InVm!Q:oi7+ѵHRck:l(͵YW"b0ZDVdJ^+r p_ejߢQƈ6DM4'Hi&PniDy[T2,m=oW?ōyLG~mj|(=_c"9Ș'zVcvϤ llD$cFl<Ȑ̂#_fmI\$E;4``^7k1xp"ek9y rYѐHpv;#jJ`iW* kOp8LX@aGɘħg;^_xl"8$ifL?TqV6IhhH+1j#8FAXc=?W;2s;a:=> ժk;0~'ԌsЙ_}Ԥ-;9Pjߤ@ck|ﯷŐwgKàɄ)a{:çXD$ eF *1dIZn'D8 j/ƜBX?\8bF- z#VeWc_g TجڈT],z1|d`F{F.|-9H^ғ?u@:TeC#@((v)[;aVKzYo%53TqSePq~ψ>EP=L8ao%P.W*o Yӓv;X?ӍDչz\)A+EhK꯾#qu#q\7ot$ˈ.UU3R^~yíy#zNg[2ZdΎ)ث/Y;+ٷ)2tX 5t[ 4Bþ t0̓O LxN6Y3ǬIW҅@#!t#U2zp+UYoXݟ=Nr~|ׇS|9*`-ӛW\~BϚ³Ik1kcm?,sJj[eQNYa+Z^qx#+~ wpijIu~G[ǰrE%'1l66^b,)p!inPwճ[#N[BR`Rr?a{ g+r.^jN)x3BGo?c$ĄK((s)U_u$=ꍧoQ> ӑ"{I1:3˥$=ѐ8Z5.HQBPܡhܿ'wJJTNy sЮ 1/aF yB(F;(c%+kqTmYz  q ^$S}鋒3|BYWhSim7D(Os55=2_L9HH;YHuJ=ɤZJw *7J˅7H<܆V]#wh,gv;hGNL/U'Q0¯m 偮r .x\%)+:5j$W~)%({yDRૻšmMz[T՘"a"­߼zW~#ARzi/胡S%7k֎@w|b&5ٞ켂L2;hCvRiL aÌ\=}Wwlփպgo sKbCȘ?aRTIk!3v,jnfJ)HqywLgE-1u5wR#c]bW<`e #HRWcEOff88f=떨~5fTN]ɲb)!tc{M-5 qd+i@Mtu+[O"Cn\zI{fq ܠp}'N,ǫo,䊑,H1Zr4.{ȰHs0%,N* [GB°4vS]v\ﳓ"\"lCUT/ttbm"O빨;@%y#KǓ;KQf1W Hݢz}X2jTk5D7Tm`\Q>2ِZeݻ:1U$|00H43{!% X0xSm uE;}~dMfK6Ak'}z(2brt1q KbTȡUWE,+{5KQ)ΰ{syv&.Yetgg?kS9%obj6uJMګF%}4>Ph]߻ HRv,#Η6zJu}KtFI8wt ~{i,Pr;aឺx).kl/W\ЇH?!}r߽(X=]qDbg%ho{5=!0@oyͣɪ#1"-%ٳ;BK~́vznJ)3i,:`Vo*ë_"|Af[zرF{~bMa(φ6ݦCs L*>#l:{mt#,t!(t]b G~V= u~*ChSXJoFxTePZgfD?r6=˞/#`@C6keQ!uK(F1k܋#\uL2 ,gFjΩ̢\iSԀ:bSY8C&X] /MZݪ?FVƈaϓZ" m|4&V]?^({Q4 yPdaW*ٻ}C24ުRK r#C/SOP6NjBWf1R2Y|AϬq:37+lņDYiזLG۾scklu eH zgw[SSo{Ίy N1~gݪZ+@.%2"t`wrN!E'w+6V4hba<7q7ӗdsE d{P-. Zz5l߸kp0`Ś#]q\ ]-XO,+M>Yx wgWI]&.Fg霺/-(~谱ƌ5+Toj&HoQ^xxj8Q,y 5e~ӎCNubZ#1]/=wlC]hhyAFoC~#Hf85LL6b)Qr}(}6L L6Ux o$iژ)}-$Dpl`}ؔ#jsQ5>"8Ç qU5![af-9& ;8܇xu>gq"jXIn4>:tB3>:d:pnXoAH zu$^H-\2, PNqYy?8İ=\]gAhz` -""=[$%ddPKnu;BZueA%y%`[d[[ꚴJA#r)٩1Y>d2 zlBeloP9*K_уCf.p韛j6fɛ[:%vܷŨPi7EϪvA=֓d"`"q9eRҘ;WNʥ[ u8z;Ca{QUm:h o *-5\T) +M ~P~Jܑw؄%ϟb[QCdt`|b>1N+Gh8Y@mw(k5x9,\UU"u+^C)<3=q0FhaH:^h)Xڿ$M kEdK*]}/]Kd5Svx;?6|b2p`PVm+?Tȟ}[ukן vPp eP|%`ܯȐpcݩ$d;o3c&t96pew>mڰDh`$W-B f\XшFN}_G/C31")VhݮFV]xe%ɼcjzZmOVN5\^Apɪ|zv>5]& JMk'V6q'$MC.kG4YkÖn0L)<2QlJPc(hj`,ߑ\@UJч$:qnq_GYRɕ\9w|lAJ)~' jJ}Kjvv馥V"TiR\Ҵ@*5߀Z>GX=qa\&(Ɛ KYQ"37jGvK)x|x^: '/ ]qVV8ũ͉Kޏwo`8q݁ОNbםuXgI;}8*/ ,Tg=iCUBJoi ǘ Ba۴3<}Ϻ }f13t11z4T IAΎ2ʜyK^7gٻ|]vOC3-@1xˇ4wc}[͇@$+B'£^KN5,2-ˬ&L5껧,eT(V(Ij_-$ëg<ŗsOxVG zTiz֛Py@bH[pAP8BIh:ZU_,7w;J'cu E#*%& P-$ ׊צ%A6=#Yǹ 1$8i} L&[*`%xy{X3U$2.عwM?.S&-[^C ?N^ŃfW|-N:#~5rx}𾻤y#)ϖpډWiZ=XM%ZD8YBCT~tw˄ syyWDk-'UNIgB{GCb!aLĶ9:Vo@;0=Q[՗ؑa˪4h/j_!_"Cݣ 2eu'&Pr$IHLFt=!l{gת`h]^Ahe=:s+Qݒyv4NNLګFAw sn0MƼ [ bޓLWpm"$<`(kuxe'(J8JX y¾M+3Pg)629fZ8b-lْ}{hǚ|u3ԢDn*IBvw@CqAuԬq&5 {Ӱ_ס&nUjVZV $?Y(YHë#p)XL$VY 3KhS@k*1SYBk&}'XqurlMi.ܿiؠ~E Y1(+SIri-F̋vauDw!ɹ—I$ `/HY1ܾ;#RLG1<fV ٙk`dׂ,8[ 5:_2c5Ԉb3wB]롑M¸(RjvlІjN$jvk?z;ܒ(SO"F7.v6X8z7CWDUS(U"&/.`z5!tڟjyy5>')MLXfdbFj _ŐXjܹZ:%zIY&c}mH( _ Fa>SҾ jk,bd,L^9i@^Fg&~x~v6Y,5:s2GwZ]\r'NAܷ*1,uNHv>O)9cq$m/AVpxkKEl~j'J'CDFe]%Fj0οʸH F*9l34軐MOF$8>%NX+T36:)"a׶M~FjK%f&Ňo;^[vqIQe|`S9LM([y7*DŽ~ßM~nR,B&^AGQs8ͱ'y9sdr#ql*Q$)xyw|ICa~|UtPʸ+,nCƓV}gLYR0 ξ&~hgm~r7/VFYDzWN7uK6QИϽ&;#`^*ɽ3V9Ab Ϸ/| )bv }2R W w֑7ц-qw7ùP5G0ϟ cŦ/$ BRls#i>&v) HOB ԨkN1n/FXLXgmX0iJE`mqh Il̅Beol9.dn_$ؙ{utWw 4N(0HX8 O.=Hh`*YC?Sy5:4AEA_پ9V+U$ AoVuMj#Gh$+H`󻍋+FsUv)稐JDwfXJM^/9l0Z8U&-o( Ql]wNZv]Qx~z(U&2ÜHߒk]e,3La)n:'K2&8P}?~z[/X?.ECnW\.M'b 3*2P^S'nc K[1WSA^AY X_~sP`^\^! ~%h޾1AuR8%yWz4 Tk SkZyuHXHW^rYTe9ؐ *Z~t^9ů5}G-yW8htp*eMivhOQ)ȚƋޕMd=ꆭI m:nIAa^`!,-֚);sO?笻?Kia1<1ɨQm͋b-0\QzD]2,k.Oi8 c/~4KH%obY5Yd[,=uoE=LzHVE8{z!Lx^cQ|Шq+村~=MO/ey}Lj+2KG,vJqY u_^մ-W)ϋt˔·Jd{t)ZN%mx`.&h|FnͤCS*ڟNOE?Ӯ oCOs?)K/بxem$+)nm)[#r@7?zgn4 i˞^u9܅T^+J(fo &])/Jmo9;?[Z}F3lښ6ngVцg)MpJNTQ~S ЧL9&N XtJF"KXr%%ĮeZ7ѧ 0V\3 u>@'3K!Ȇ7 +bb{4iCM:&jfx0Ihkkd/ErDOꩩ9o֞VE;샣 {$ (?!̘ M?dO/O7n|͉UIN* 3[]R|(*}U? &E0*CJh A#XO/;q5^,->t;'NEc28e[RsS;$f8m Qio\*:IS۵ǣ+\sJQz-N7Vn=mXl42UT_ӛ Dkx-VrďU j1e7'zBkEu'bxeM1[JNpt:NJ"J/ٺ,C$!&c5ӱYe$ Vj8c vO2A͔uBW*lDα毂f/ t'Z(Œ- 9BW.ֱd_/]9'T4tH=-):u<TG1nD@KRV0$?o;l'a&62= o@NWA,$ GkI `moLw[#C-bGFs.M'x[Q6f*Z!LQ!T9y/xZ@UIn;3 ~MZESo0Xˇ8(m};02 V#u#c3>~U]PlNi;!V ;q}RflwY.^j]ufKHoz$@'F69 lǀ-KgS ݸV=zxMzB1hLn[8Ze]9"QoEY1t ?k9S.^ 2h|DKcfN!zD]ƽ)V#~ȞOzkbkp(aw*}epJP۩J__7 ]5lNg^^]339s"¡9M ӺqO+Fq 3ewhǷ:H!oNHXBDij(Aq:*j1Q緭6Q{6|ؐ^2Bj'COrǮB}Yt!mdգz/:CXgY== <еD^3$u@B 0[)P*_cݎ.Eý}E#^`T߫/&9[Dؿ6z6P(ѨEu!Ul'Ymz$-1?ȯ0hVɌ1a&s,cz;Gaq܇ &BrCwAԟ!S]8)q;qb-H7 vT? РHrj;4@~$8Sgz#% v@Pu V8Nd)cG{VcaJHvT!<ƿF9k8.Hs,w&Ksu,Fe ZQ!`{}X0 v: >ND|UtVH<2bF#׻ᶧza9Iym[S`m >IIh0.+,"fWa_NG+{ ?g 5z .^]wGvIV~Zl/݀g>dmp7^ GI!1=niΛefrdhխD%2^TR &ew|(.65ӄsft;dNj s7|)͈٧U3*úqOߚ은{39džMקӸP[h>w$iI>8{c`J[.) Hp8蟬>_&P69Nn><,XIcj=8f_ Y=SthIkN|kc1=<ܥn^v∽[Pԉkδ2`} ߊv`ĢjrXt(m*s>w&6qru&3$`q tk0?<I`%xh[F!JJ|fQ%x#IEaC?JJL^rY]r8w6^[& |͍}4atه,x.F Jf92Tl>Qz9l"SG|̉y7':eVe)0|ge-_7ڮ7oW @yNv(Zl*P-w U"wvES!`9{{հ3GVEs_sg[zb@!G[c!t&1淔?-*hT dU_`0R5*nj KQRn.ym9Md#1TE4ݰjOLPo?|^@۪om-kNLU-Cqzq7g_+Kf=bw@= N+mGUzͬ͡>$ǷrMKve~9a32oo seX|h<~R&YDOHu|Eί6 xݏBnx^\'p#\QIAK (iF@uz\Xƛroj`cM,+qt"b5n[g:|eiN!Lx[^ 9|uQW^wQk?h=mKp[ Ȧ,^/-~E/M#x=GJ5V};,9__7ՍX]%Ц$}uXŵS2s+يSKp7[ -K6&GBqvKK+mYqv&P:!3:B @ۤTV,e9UաF[{J}5u2bz!K3 ׍/h/хiB-!eLU_Ut; G^(un'iR_ǖcD"7mr_7"6@)>U)ǔy$jJt@ Fd^ZVU͉ l@~Zͱ1UШI1yqDwMsޡpEk<>gH5=pũ X70n~ k6= jd~Z]BTiZ!XXE918Uc^/蕭rUj$Y0=1M]>O+[[:ToySǑT\EYu -vKwF邀xղm=aC(.ёln:RP.qrJ*b3PD&U<Oke:O;6DLr/Rt頇hs>}:vspwEbxЁq;E3t! ݱHO}ζwr^{Db V.Q RI?xkURf`5vXz #[*ا[LUTnZf߭C[ӹ$sjghz^162D% 6[e_s +,0ˉfHS[ n)Ō{!ǑGaѝzm"և0 fIGD3j9Eߧ K v;cʝj'Bt鿰le*JW/˹]0\kJJճx|4fv,)_7{0\XwogC@6 0J1[ S;r }f klLRߏ3xG业а&/+rɞ4Y`ȯVOrpd 9軺 48peqQe 55SIBDJW.x rc$p#4wکzz_7\n]5U!bYիܤknggAc )]ز`'ktYƼCMa?$lҚGk6!_^DG'>HB 嚽r>:k\E@DK\PI^%IbUqLݲj^ zP.U|9=ֱ ^99Ro4}vGNv/)Ǡm)(MQa!<Ey'! #=Ho؁̇^\`vMY|88ijw0.7ͧlp>ҵKc!k[{KP][I8_VuwX&Ϫ$Z RH|L!3GN$jK +̂DcH6@-0~0Oq= Õ s)q~fG%[|A/iT 8i4Ir 0FZ\rR3ZtSv \W`Dh*v@(GSӐ8)Tx_Wڧ:C>690 SYwESڒ|z)9`L=i%//4&#gCY*s+έ[ׇdzdT5f:ȺZ'OK ;8bkAo:GA IUwU@k x妎1=zUi ぞ_~PjdHT !RTΎG z.&s|hˁꐵ"RdSB;ő{o;nz)G6ؾmVCdJ\wW.r{@Ql~#Y@rB{ԃBv+|shz828UW-,z?~ DqM,w#3}5" FbA8^yh#*)M`9אFLȝ|swg\#K\EE.GSQhE9 ]8Ary- 1(Y1KK4~\ %f)C;JSAj 8ضJT$9T?GuA3.OT0#%B۳B`_^Ķ!aF%l*3FS?O ol\/=Z?A0_laDl9 y?4;jm#졧Dڞq2l ?Ԛh(YJԤD-Ma00mYmsUJddžڇh]IШb8sS BKdB1 ܑWoUjY_d#( gi {x]"r@X՟3twBҌQzrmg~\<φ%B0H6& GOwL=[M|"]R(t+p4aR1unh Pvi`4ěDܬoBˬSp>*1߲jRCx_twͬdwǐ*uVYt/C @j^OcqMBA%0+ EcӬ^ra}2y  ilFc 9٤dMe@boQ}ߊ>Գ<1ژA ް ~Bg򲼙q+}+KRX0'm2W` |pr?(C'93MA'K%'ؤL&8Q̐`vUPB`^GG(c txf.!eWهnhR9s&S=@#Kgtq.`ײ4Zf{Oub?)^j&#'i]\\U[`p! (Y-L$p>qvo,yP].{`V(MXQgy.vc?:wVƮ6~2\JBs2gp1c 4Q# <b}}őFMO42kyF X=>}uō&" m$+нxx&-&q&KɄW &IցK1%qj+r;4Z%zź,8+vzڪ9 >jn//8X;^ԟ8zhjbsi_E4{ג4Noe(qUP,eIeMIN)6f7QO_|AVG*~\BxQ Y i0T.Zck]wR~~:dًJr7o1):&7t*Ν{(t0hs՝CDsRo;:N\IRBÅ}CJQ7(wg, û7 i<'xQv%^TCx.7ʕXpLʜAN)]5 2܀jfݵFފ>)Wj{V{l#cB=ag߭Q@l3;֫x,XK8vaiYL6;\L>p݉^ O9\Su  Q*t ^T ~9p CC+7n&dȸ,Aw5 *\;9Ƴ)y JTěi,a߬־cɸK5^=k q̀z=l)hܕ6>L $/!I^{R\h/0wddZ54Kj<V­F୪֜'UJ !>G(vmaB-u~@zc?־ }IAU6ױW ِ}NyǠ}ignAə ,USU.Ԍ`7돵d-Wo\O~]sC-/U4a@2x%@%`O܇Aց; Yˈ}s0_SKZ :Nd":l\iXtW5{7Z(olW5ygM-!TYʿ)@6r \7+U>$ϛb$_l[< 9k+Fp)a@Q6VTv|qN44N_ n#+J'Ηvc' ΌF]`tKO8m ́ais]U>ߒ}7nOK=DŻNOqЪ̋"a*x³1ll:#/nw0X oĔmtC^+#Nl o?a-s>d0Qq̯gl%i Ddv$(40Qsʏ2_p \PUcɭp"y7)f ۘ-mǒG+'zMHBeXDȍI-$ % 9S/5O n~KGC=BtVl^9!4Ǥ7TTM{/=mOzX!8daGAzK?#c$ib) 0ln$w4LY1sBffdEtd( +vJF16%'$z==DH^ fr7ܹ+bل"ˡM9OLR%~!%n9]v Q8aJ[BM,?2 J{w#[6<[Sa5aL d]3m^Έ]tK:G nj7}(,mWwϷMߦhӘ:~kfS#fb8,Q2 A?ο7נo!̜(;{~F9AX&E{D-dVٔ*76jGCPm%NhPJbk]yЂ39X`F4SMhduʼ (zD mQ4P99BZ@ț?'l`;]_A![urU(()PAc΄g 4fWzJL'&D2nf3,w^)}9rdMXtɨ0D n8 k B"uqy @%ʎԧ C2_ECIg"@L |>U_ BWͳXki{j c] "9 2{*7>t'kRǹבҁۀ-41 1 ߇~SmL<**~\^b8WZf_A"OqQMrPokݤ\ a;nZË >a'.bF .6=0xO፮:|C9qkߙWW<_֑6^}Zs!@ |bG't.͝N.zmB[ PSY1b~E=j,4+uOp=PҸ8BVGkb`et dbJ/Y3 Ԩ+5<"fٻv&8~I{{x[ _3z jDN -O+'ޢ: خl j-cY4a7RF.@W's˱&mq w|ߋa2%}5ѦE[pZ#*CC=:*ϮƑVZ-;;P@ fW:݇vD1__'YcvIM{O/.nંw`.eM>g9̥Llli@)( + s,>˵.l"UbB%ls\n(@/W}xCv oY5K(t0 d2Nd2ag ( H%$f i:w~JUF)f˻*N' k4@h(` E>i$.A)ֿC Nҏ QƎ"$Mi,U)iSdHګw+6?~$GJBE~+i6F r9i;0LaSpGgASoAû5Xs9~~Q۞t q :M^,ZH`pj}ACPox\ġ)B5|ShVl#'+*vL9Hi{[@fPjF5N<& V ^ogN@@8&=AN1dm_u Rew*1l"2s=MmQ(ѧ~/6Vϼ)Q8unu`T<5 .ĢN1s#R%zLΘ PlnL)Бr |]2%zjW/ M&K6 Yq#-R[ѥ'^j2, v>Q铿^e6Y5m<@K|*iTRbmC\mdm[;N5) P6݃S0Z+#~ႛuA).L~ʤbb{9agU'~,{}B߼GYnAmJNy^R|Sΰ= kscd)vj>yvfFI{ح+?F@X͐pP wř2}k 7 PewcϺ*}O(8$x#J! w\ \K&!Yْ†A]%tvՎ1F0?y2wRJE^ y9^텰l8Cr~*|[5X .ɇ 6';qb"CXxý_an] Q86 3&̎9@oS?{$p"qbc.yO h%!*Z PLhfL u VBw? b6 wM9Ezkn|=v׎J\C8Gw>ѵr>o 4 T/upݟ*7 dH^~SB:'u% s:Խ3Guyh~t_#d|1QkC0dnyjSƵ_65d^ˏ/I=zM:9, R vhܙNAڪv32%^4~ye44ľԁ!u4 ӷI@ @;8&z!\1Ԑ=/{HyeT"e0 ljs#hV"N{*` k/:c.xZe>OXozn/O3N QHPywRDЂ%!!0jPVILD$84WI󍠽4 R"jvS2u>][l?i&'%HqSà+9'HpK݃gV QE;P¯1/iwhop1z-kvM*)<_t@z%C&n~B'}#k4h4 V_MJe=>ΗS`15Nd쮥j']J.D&tA_h9XCA +zBtǘ:ٴ4l#}J#h!rI$ʱ/ɟ/1P=+QNwFVbepxoQ]?m{Mٹ'P[^2Fx8V6u7>t>tS)4TQJ.Fhgf;\]W sFAq+^FޒHꇆȭy4^~*Jh: 4ZoFD_~%>Xؽ`L++p^b8Yֶ(7}rہK0i zSuh-n(iڢ$LWԕ5M̻8_Z@h(Pd2BCύ끌B H&Ȫ6=y8M N6eedVZf]}3 Zn#ӖU(\X~d1C|F&rHJݏ,V+#Y/c mD94*,d,$ Ѓ"?/PId4-Q56lл 6Yzܔ#ggs{з |IWA˖Y?JzA~>/k %^^E,{a7B6v7ƽ̅G +7a@uÇK3}vQȨNwx,N/V}bN86*( yY #XIک{ͱ񪸨QF<(gq)ˮioDӟPq7t{ RfGgk{MΡA^tSx 3}#fF!ў/gN<<_kLV}Ճ}=O|c{P.jP&g;0 y9j 1~x0aB=w-%ip؅UQ"lswX-^|4=k2tvՅjǭHh!yvAB.҃? @m8.ʮ{1DXa_Mҵ-6RtDP*0{;ü BN#Gf! >˜liU'ŋj q(;m1M$9 uݰ"/: P2 Pτbslo^|M$UFepͮYZ@uq&ED:ڄx v \7Z~D{-0C3綨&_kK'*G{_UƷ(n@V9 yRWޢỎ c+%F %^ʹ|fl>C=RֱDe[Ձ̝pi1e80H͐"';VM)Hۜ9v0ju: AڏEn¬M~\ac \A hQ٢plr=uG8 ߿Z 1Ĝp^Z{Qk3H?.qc2 ?Y =^k;ziu8b) ~Y&Ӆu/Pjs[ TӸy;ʮBF kfŗ>}3cDﮬA% <AYof^Z'>G= t98c'گ7LuK¹@Q*h4nXcJ<}N&6%dPƞJ3㔱jޖkA%ŏ[d">l3H^AٟetAAױtϏ-Awպa҆nӬ~jbܯsv}YlrZOC9ͤyFCdɗ(e*ueɘ xYԏˀ9+2=6=` OS JC\YX^ؗxk7'֎SUp$0-j{IG`-{~̖[ɏ8]}!^IPGjPԺ(0[DwIN`$~n$uoa!Ӹ*~p78N(00rQLb}j-;ȼf~Kl;)`.~>d*bJŬZzQ u/&Ck|WHN6l 'r~?6QS+,#_=樇ƩL5a,I.L vd9uqF=V$u :](ߵ;/xqZA"ٿɘ[PHrk! ]QU1_ZS[Uƴ̷˥n-~4/,@kl7e*|=oPu.9xݠgcIHe&ӿsɛ'pdEGa{.tVPCcj%&o בɯ1l^82PRŐ7NTL~3'\IrfytڝSN, "vWUx Ye2$ڀgΧC>`Ik'wliZFJO,_DP(WACcv1GdcᔥS2 A׼m7?'iQ/uq&5II ;%WUQ\taJ*Rs0-4+;T,PQ2ס΀` <[|?L3#Blh ;3î@;$\/|F(Zo2rN0㠚{p[Qy3?N:^xui #I)Sb2>~?E ӥ_3z )4$5 /gg5Tnm~_JFT-f-\a~-jL/ǂ(Ud<b<:B5 9 U Y4;|eg05}歐Cߖ.˚ UUtܝs;W<Sm/aG3xfq[gZSlNS qJXC}{X#S _ 5I~Ø#O$S0gV CXzhS@R;WP,k tUh8 * Êe)Pl4lN МEW5IkgftDODB!64$e@'tH;'H5R3gl>|mn 4Sx6!J…ԊR^){*;h^{hyK+5qaߙbrNlfӴf]Z:sjе0׊|3GỲ&pGq/+!m@z6]!;Xaȴ+&ĺ%؅,.Pic9lra>9%??EINsZ{TzZn6Am BH7M*i,.!ΐE=!uz _5iZNaTFщJ.rF͈vB\<)yx,Ϯ{BA"-hx[,SW-@] Kb#WမĐ/(PϰU0;/ivؚ2jgad}WkfH"6g8Rilc> h5c/s}LL]d> ,%6Ŏf wdD(0eop;I;b(t]%O\%J nn`2P xK km,>:X!7> 6  |r4p(ǦWt'$(NT[~zg//>;cV`*7˫kaښ qyaO~{3JSZb/;7 E@3^BjjLb I]z$?h6HhCw/ؾRq{ʀQH<]ZYC</=JyR\|ó`(ym$}"Sn;mzn&d>L7i_ŋӽw ,>ʱ(w!GJy_h́m҂~M.߇'ʆ*ºZw_nSMa G x]K\.aD@ita+{Ȟ3Q6vHFΏm8GbO DC}k-Q ='F;-dóo(6ߥrƛP}Y$'"6.ok)c31< l^1DBPW~/`r$wmUl<`! ]%R ;o^f*DunC`ؔieXYg oÇSI@W|OZ m2-F0wT긪{r;fzo(uعJt'He<팠WīsѬkj@Le ~#X vs*vNPГZS2 LAâi}ORc s }f9s_J-aVtN',r2GQ`-C9pn}{!*1r0A~/ChcF@p6au%%VQ LjDe@15mQOgѭ']~;zMsk * en@ksڳPC"әm IM3^:Xa zB^""Z%}k=4׹)rU-FVr u8drHgyIUW%YbA>C0wh Wz| )cGv>F-wC.Žn/6".,V7اɪkDْ*X _EEՉ$kS dv[Sێ& a,#nÇG*@;Rb?~ O c5qL-'(b8ٵ6۰]] ƎOrëQ'T/ Jr/W5,ӣU>x6;jaD Jh!/Etֵ?m/W}v_~3p</ 3Q9wXh,3ea|9џ%VI ٰ-ǔ :0YZ%gjޗ D(6h_>Ϊzʛ0t{+*N.H*j~֙"TJs_5(3{1j;޺3{a; )q#{#[2հq1%PpZY66GKC+T~˃,~骮]SZESǝޘ-6Ù Q`VD!| j<I&?q6UHQ\*tϔ\Fp`RU1(SdCعNͽ ˖AC'v0/[5_+YO}u0vqD[ztߏ8QO3OQi4+9uP[ E@001gk.^nCw4m!ޫ4.=NCoe=6 ^։*N )E aҮ._]__gVg@} r{G,\amy{ehf`fTVj7s <۩K6‗k+8',w#b-f\!yrkvaw/㰛NdտL|DDW 0RȋϬ*sAt c2"j*mI=OW0Ч(e1*S֢]8q-]?D;"sDÿhCٜˡ꼺:̳BQ.*k рYPZBDעgՐzʾG/M`Nz(b=`UV}^D7 \w2m gBe O#+kῘ4UcG09m)-vJ&;3_W۽pꤿAaKqطE(/3i66sƊ(O&]M¸h \Fvmk9d:rX/Dfni#oy9(KYݮd-}r0I*vHwj8w y;p]!ϐ,'N;<gzLFz<*nbmQ_0aw5p E-`CfP:Ux';td'mNO{[ 8SϬ^_豷 cDnBSؠtGsI^ ukHy5B.}ܪhT_bT,Ȍe/pk#(Iuy4B߭isҖfԃ/OFW݃Z40ƂIu~OLXFc`Nnha !Ud<;M'4omxKZ2t ,AVx0ȋh.f 2Emp%b^(V!𢚋Ai%|̠${\E1Q5ք/Y>T[@Pքa*cTEqf7sh vć qt?*SI7Y-:((IY\1HNLQu kk94u[E$aa|j:o"@jvÂT2AXܶc+ dklA0A69{}'OO)׸t KC"#ވH Zg+^QUiensc$nVz|T,Y5[2RKq?cJ,?¦9_v Ҋ$ﳤ:TK"A;5xTTR1̂W:bAH%,Y>[:ԭUFGïg_qHȃ7r3dvIʕk2 u vsX$BY(d22OyX^3i ?_dHp8[;#2d۠mOg /3}@tNsz-/QJG-"[~ 5_Rq#Az[4Fs. <4_}dA?SAUl3Ůi(GŀٹH)rkvvDÃX}zJ >#a%Xż*דlSb ~K(ǨnT_R<&P$<Ҟ_9&C= V59^.֫|,a3J-cS`рJm O>͎ q$@O8Dyڟgf3C?u$322mV=7.\>t#鐖+KE5hQ"j&Ź}eg Ṷ̆q!ibʯ鑕>Ov"h,}"sm}oIsO7zߧ춥ƭk-3=l-wsVWG[^p|-Nl-rE*>]t"puczy4BVEb`o>O%Nx7T>LjʺwL(:>>zkW-2%BaG*i.8^_fY tv.O a鍃*R"< 8D^ =}N!A&4;B?#C 0(v>ȧDDJ^!N7sڗ)?-m[D\峬j9c, 6G/䉄)[KQF+lRߢ xY-s,v~N|_}G,-' i5} s(2asEKތE-EQwJMQ&^"rh\~! ?#3;n{xNRK& jh{ Ժݺ'QEv2sjb^|Aְ|bs%QpѲxq6%GuRvx0p1wg=/*WQ*IQjv[?#Z-Gkbl~(a>UWO2!\lS$6əCw d<332@&k{1uaHh3"OK;/ 4_`[O x- Zu٩Ⱦtb s8 c9%J=h:~JQpoBw7 B-vyߑFdT|a.]DxЭ:/IYH# %SI=0v!&X ykKS[d.e82iqo 3Gclo3O$e>ǕQ_e%> hݼ2TNjrظM@;O`\ ܑ\Ou(n1&$a/*xOϭ]Oaxc`V=S _^L{j2Tʏ4 "7읝 #2>RRԟSOT<[6krl]x9/?UԐ|w;_!\7+jKQ7;;|ICw=KVoԅA.!-Z(Y#sl ;dʬD:t@8c5H1N$ͱ BŬ(G:Ol} C\ #.ȅ w {,oxŷS-j.5I?c@0ƁXfxtZ I-ȵ{Nd,IMM`I]A9a-HWHnoÃЙ(a<@< p5'/Pzr فPh2EQ< c"OE!j*7!n| - Ң C-J4VY>96:*f̵X;lN;n0kqL3>zˋFeq*-ȯ6vħvp/Hi ~0OoЧv(D7~jxRвΒj-yĕJ -*V^.\mH "yF[T4|k{]rV }$8mcagM@%{[ :Ir㜻(V]>o_C1=pZE-pEy cGf*lh-_?SCH؍YxSc-\+?dm^4裃z^_[UXo^0IB52.{hp@:ŤYB lq*je<ZA2)6- k UUP޻0VL Lwa)lSIK"m\|sp dB9ʮ/eBLሑ LQ@Z~ vY*6= ~hG!N&"abtڠ <<58Rz14 fuRoǪ!XR WǮ~2Oc>HQ(UFV.WFZC >_LW|#PJ&%z6rXPl9aH Yc<۞˱P<- [2:ưvW5yu`^q1޻<N;/K#ʹSaoGT=vgj94;TLOսթmݳ 1Z͖΋b]ߪ@2]S3*NzA;kP|AJ&ԻC^ؕ4Aafldm[ߝ xhģ]j֖#,.rX\xJkz{3:_f_ 5z.&뢔"\9忪08"%lcLIJW vU1%oz]|n3fr +$bDy:*<_$DȼHo1ZfܥLW,#-ׂmրmb\;Ί_E)Xg=,>9TI T|v)NJ$}OYmmD=IeϏTď19&yy3^aG6pܴc:Ur\ҬF'gŨQS'%Nvɹ#UHc <ƽ=&~ّfYZ@ݗ_Bg~B5ʒO~';g6JC3#>vChsږVR.x=hcWAyO"B>2#aVrAw$E<9-0>*I4$T| j.."|4W[ǚ7UWGb1p5`xN tB*˵yƬgKiQ@_$~ ڿwDPLӃw.'W]DފfoKCr@n7|-EJϧi\7V$~}uHEG 6*`.ts1ˎmtb'J zcF5ω`G3eP*hfjҮ2 pb~ۋk :ihِBAQN«yf_J=;0J[Bze_x `{ __ٲ6Dŋi ^KNGf)pGh Hf;O6IFVt;Mc-<|ܜOSt).dXuVJ_d/6^7F"xnf+2*c\Ĺ 9.w^C=voz=t"n-2Q,"G'_;qSG3JjHր)Z|(*!?F%KpP(vpn8SYmnf7:5'5 !WeMVx? JG7ڦ0D2vt&Ř=LuuW,v<0̣kv!(kxPLJe1VU[Ao ~;G]n\{5sG ^GL^)BB{~JxfVP8NM|VHvYq$l)C3چD, Q.*e] {WIeL s'k^#2plx~44%zKn (Elg}*fX3#Ir@z巢{:G=Ek2t)i bݪ~9RoM;S$n3VT(x؟syޭ͉BuO/[jw ѵ-}|BLL{K(VZ@p&@x9} yp/X|F mMJ^ }w2I)Tv6p B3f1n˷ǐyǻѦF`B {#p3لn)aiܯTvDkAM9qr&p]/B,~}mNh2ltitƫE y<]lŤ+Px,hPI&V7UTE"Mc" jI>\IY q::H~ŞC I.QۃsY1zWĿN8)A]XjA_8]Eڗ>*3L>qxyuc\yDPO6GİY*rp3qx">e&%p4f^HD@I؟΀ !I SV`n{/ܛ(:z[D̟W@8HM FB7Wdyq^cQcҰO90Id/8Io݀H&l4'h˄Et篂X%2wU#Csf.rɃ%K^"LuCв1e!8P$jVOȄB)X:Eo!IF1Ol nW͇&MwQI诣^c<~,/t Aq]u?J R~. :/@dPR2cu`FPmmeW?ٛ266dVgg[CHYLw5`MW5D]]l6i06ÞpwLDYb9QD͸iVyrucgÆ1=|D;<(?4y]?+cD^Wr$hV;Pkf0HfhJ SDp eHH釡vl (g> H 7x,)Iq_T _1|{NH"D2Ӭ8 w\yz$?8]3sve" ЯQhDodIFeVhu?bqkÁRR3^(Fj-$<(vc$43-}uօh%W0Zv.rZ^cƤīx>,u{iN7N߄9U% 8LpEgXLf-a4h%6kb8)u cj>WyRK#p(B$ntP$Ab[ո0ebWyhRY3(8DQ%,Cf"-W>o?5{$kn"X% jw?<#[o˴Lk.۞|®1?]ܚfs`a.c(BJpcObdpz׼lMVU;~=]Ў8tUL2:N(Lh1.I<1ýd ;{adHRX4tXͭ h.>OO4xۻ_3+ G8ǚ{Lr\в8GVЄ4onC c?/['ONms’/r v3_m>tm=ڨXǛpnF,W,nf:O 1Uugr(jA&E0ziO1f߲EӨ`p:&?2_ N<\G5GT6wIyD#7X[aPH6u!@CijL3p圮K (ZK}fʣbnN(bE-y`2ұ$7Њy>5Y\S$qZ@$̻Y| 5,T}| yr8/_FҵSOBCFK,2Q$tkkY!|a#ꔛu5A*dudl5׃e2s^ Qz >Md1G^32(|yR4~!]{>;ܦm=BB%즚ҿ{yF[[0c[ S x )(k|su<(h(icq{Y*!{|-Ì7w.˸IMXfv*.EB\4(=yy$f~kl͉oj']s`Ls,eykY-rHQ4Q.pOz_6 (d_|H'L}%ʐ_q;:BwЂUw8W^Ar+KJ۵W2xA *Ju/GObGdNBEr ] G&8x=1~Od>]r`1UQ8Ge܅tl т,`anڡ@-&pLJD;.PMjDf̀`Il*V'.gG@ :w3Gq/FpɚxBҬ4ʒ|>1n+Ef3pԿ&e&@E)X(5UPnT1TСȗבNBO%ы5btO~bl ;/U_!y@q3 d*Ј1o.\0qݤ,autk:u X~,!?, I4Jr}8bEZ27v}_ ?6u /6ЪQLU#qͨ l*S:,uرG ' ֏ێ~" SXY(=utyMj03TReC?GdWVVN0Ր4SF&-;6F b'7@!ՐD\M7!Tn=i̮HI2qm^YH n?GSQ HYrdTBjba~+|\je_Uqhߑk#[tN%jld}H]Ui:n1`^3̲ Bmn &ݍL\y1)1CU_qGQ?q|8HJ%3mJiob^^et#;y 73(U<aS<=lceW/hKfVh4h qߠ7x_>+)[6fGc~_x'r:VIISޖU oP_^6Fy]_6`j/G.gM6R5.`dKeivfCӐӣ|Ɉ5kH´CuYɒwSVuDcӘ^H?epb֒yB:4B64"Zǿ'D3;/UHЬ(R 9ɫZg?%(-mO&7w-#]ϻAMIA> d1^B-Clh+*_!Ei"8YR7OYYiodqok}ƊfX(~R;-Y oMLxp?Hm`VIhF4h*'Ah[IEJx\LJ},˙6}BQ@:B"iR {6aoؠ0qyA]k쨦Lu*n'ѕ~j >x'=T[}B-rzQ/]G zv/FEeFOԞojX@3FsH)P1p_9Xr"H(Re!@@ܕ5iZ'Uj1kfFue(,f(aI\nq;J7}a+_[|@R6rE*au|ev5ڕTӴe8vnS/əa7[G|ÈLp.alXٍ @h7cJߴ (VQ40BJ>'s+*vPT36G̱O רNP%ŷz~$%gr@H2'nȌOX{T.=}l^tఞT> OΥLMܼo'bʨ6"Pq󁟦= ؇4qP dtT|x+`0}%AS]Fnx*^yKȭKAI^Mj]Em($ PWQ}ߟMWZVq ;ЮCT璆osf il{h4k~[8(S!3&>N9y)TDt" p?&6"Q:i$Wt FyIy&jkV`)\lGi.ZP{lw\B]kUM_֧m`ި u;| ;*} VHB fB)/ʼnb=U\"۾R[Gȯrx[~vsyس6 NZP%&%7 kDe(bp fsZ)zk*3=#j'r4y@Г |O5[$0x.1An0#GG9Ecgf.j}/w%9OKHnSۃ9r W-=x ;:!eXpIv CՎ.(篱9YQ.)Ӹ|L_=f ,f%&MkH<2%\ vǡ/[t0,V1TG.;>5O>J) ݞf4 />VpAF}eNM; k -%;Br/>Vø;K悺`хQnƑM\w$I(>٬Z  arRu5nU*uÜdGMAͅr(Z)0@6i*,|Z:Wp$XfU =Za&~0Ŭ ,'vwQ{s2`dW7i#)Mow(mEGWzη5gX/1+Cáyx8E"FZSJtt蝼"4TOo GWq5]&9Y=~ [u;2@f ĆRm0I&0Sc)LUo(4=HPQU /(o@ݮ  `Rd8zyǷH0,utӘC"hq}>cRb< (sv&EU_drL1# _w!\Tk(Es*WZ@;SVz>$\ysFNg.śAfO⋞é_:!gEf!9h(_b~|d5@(fLIVn˫[79|B+4*w#5,N(ja47)v-M ӆQ=V,5gMև@[T( wU P+!`$M)oyp( ׻K]1j]Uȹq%YmC(Ybu|] \"D6R3/%$ wXsՂW7LNѿvp~9:YưN`tT$KL^>D^ۆwvi/]Kʄ-B5F+k%҇202,%%4nn P>L9&4!TN56qru0o+J߲fV4@Sh(k`CQ$s/6Rb0#upcșG 8WWhmtJjVC'|0_hΰ=|0F"~ Hɺ `;UЇO&5&bsmڪ@chkd4ߟĬFFlLsC1;rf)>6J`9q\`˜6w?Pda]ƩÙ`BREh,\ԏӸ/O~R|)ƴ=F6F4W$FRŵXcB}ӊހ ovcz%7SDQ FӋN~^qNᨲ~9_*ZS.\.|Ϟ= 'BMN`k ak =()5M_fgd,IX˧p. 2cxmI7O8VtAXzG lfɶ^?܏(8D،mֈ~VM?WU5 i}2\YR% G@[lWkuԋ"#'Ƈ '3zHӕ-!=vej,3,'IRVWܱW L[.zXM4&a൮OP8@wJe1VԦ̏ 9w̢VB8:{s>-2iP%I 嫣q@pmg~6 'ʢojz4ѨHq媠/kV|](D]$:cࡐ%g"׬ dږ?2 9#iI]8{^0ٗ`)΃ÂF@p8~+tn4|(2MzO4e1 f)~?{gE m׷J~+J<*$1L~[JIZ(@rWb2J"ar$^ܒ ;ʾgx]cg&=6̀d()+JWѐڽ29qaSv@$,PgTÏ Y؜P|lKJ$h6ȭ[Á[(=C(,+% WE y;4VnǃԖ[[)/.:+z)ư)տgzN9ns@BoZ1yψ]ҥi*-ZF߯Ȳ3Pӹ,E@UcO>ԴqDR>3mJo|MaVCYx(ٳIM40Nm DQ4NIevXUi\iU.WU4)u$ຄj2Hw{uC{[*qM9b9E1̓xr_sJ? MdZURQ`mER=Nx4u,N=9|/P>r"zGe`u2 p)R<-P54eUoZIl=RT1<\.sTnWxBgb C߅U\I3z)L;/ngϺى $d?^ n*pٯ oSyFc2y1:4\1t3;~&p~´pdS92Eg#הQeJ ͣ)}SCr5Gw0(@DMv}sOϵC@1W0v5=$nKL''#ԐkOyCntj@eXBjlOa7MZbS[srxC˾S3XVMYQٲ+#1Kð3>p C,iX BWrI\wa^hp2|- F[Wyqp+s`ub_qFh׹`ß7>_A1 R'Bx L鴁Ik:Cps]qiUI9<1=1R!LG[R2ZvEL(2Le=مL@FfjA3<.1j(y&?FGtD>[ #@忇9R*yӫ4*_kTQ)png`O54VE!%:13Id<ټE%dsyDwծ,0BPb0r>C}:[, tQԮ&'6ҍ~Mj-VzQTlI?mdPGɘdPnTӕ(čGSzܬiQA9OwLFDf-W~&8$%!wto7C6uFRblp(4k<3ـ*\gX6O?ƃ6قY(.gzzqk<^y £ /rUҍvЖ)9x"1$]y6^!#%^ogaD!ݻӵ_r%>?h,_dH3j(2Fյv1s7Jҕy7opt[Tð7xΐ|t; W"׏•68T]13y#.c-g~Vͪ00zQ:/N'Ok.#Y>5>ݎ;x8?ɊJ8}4FO.jF*~Dl Q_DV\E]KEEt@ 8[C݁xQ(Fe& ;eթ(ꗃW{b:/#CӒY7k7rb)Wj1:΄'/PܒM Yr"D*ƫ<#xtbEr41|S{ގTtS۲n:, xAuft Er(嚮*VlqUh[$aцY[m 76WhG"dMg # ^ x0[ʋ")#.INPd~% >@U jIgG uՌpGN]igpeykP|B [cb؆^ !@_$& ) 2V~9'BpvĀ+oՇA: x][#7; ,=Vd=⥫{Ʉp< !ĉ-5u- _e%ҩ7jc:;ժrԠoX Y˚?< OflJe vޖDe=hVlC?g/Pԏ5^0F 7n~6|NFge ^052ŋN6rS'drjJ2w>aRwxa e;ZttHa.2{-[UpRn$jخSv l5C4wuƒZ)B TSnèSR-#UmQmq 5\ *?2U`|&k#EId?.F_?wνW\28IjX 0fԁ\_9BA 7DW0BU^E@ .g/GI8zQ"QjHRi!$^h⑧3$JigVOH31rAq s[w(~r7KI0$&9GI[}qruӸ@9mu C+1" :]rK eLb>I8 x9a|ߵ_&3#,XaŰ3iAaJ]|؉;~/;xaŒcYwc#?Y?Pk-hUXb)[eue(/}\H;~X3i T&¾a`1c J+\ \/߫ m 2SP[՛ulfqu#<2Q=N]`y(}~ב< R`/wU -~hj)L*y ،VHl,GC69,i6%S2Erx Ƽ[<4D<բw8-m Dͅ] W;Vj<&1MBTp4-ַ*yTbzK1o1G?n O-wMeXJeQ󮀐"w9!8":XsIՌ4sIz 47 r*x_|[l{w a*[t;$irn4Jtp~"|+x1U_vɧ"2>ԩPRTL!b\/ ~-n$ql=$f\)6Ȃף}Hy[$SA ˚<1T=S:8|pŁzZxLQL U6)> m1j5x9rޫ"x lF ;3 O? Y[-;ʭ5hyQ}<tMc!pqDf+c5+ 3~ՇBW㔍y/WmSVzs4pw ѣ$yIl{VAC&6RB5PKd_Ϊتt/\ (=BbH`X Q40Ɏ0\*p$M]Z!OKr:`ly>(a]Ǝ{hR].Dԫܴu%K~a3$@Iz <֪>CK%Ѭۺ`[l'4Pgr^u>cS1Y򢨱Hɳmx/"E 1M!_wYE?-z Px$LÍ`4gO@fS __$ok žI'I}mˢQJd| xF ی]oܒ zx10aոB<d+AwkY 1v{q 7wk ]ߓQN8t]`;0byucK4nM9Pz먴z\RTi{WFssS3M?0#?E E7”XDhX.U,鵐};? ˔kL…֢[\ |Q^Z&kgp0XsSpwl1zȡeo 87-}AhJT^3w7m#QaőZvqK5LAH3{xǢrz'8oJmYa!1J#?6جu>wHsx(i`~ίmO1u "=^!(䰚vM\@@x1LNϝ21wuy5_Y`; Q9[֊Z=#+.kmTLIܥgLNҸ:Ƃ7WI t˃ oI(yą&8b)KxbG, =hoE%," e쎍KfQWHgTܫK4-MO]܃Iz4J|3tiiO}pgї;zfH{ਞ_DI:R6~Z<33Ij5sK+wWl [~}H A"jzdLat0:Dfxmh!ƤӃvP6|^BhI"q%z0DgS5 ]А0Q `vrH<wBtkm,B͸"o+|`2ʓĕ5e5I=a2 fQXuh$?8)nJh,3JF=˰s"T8ڷ$s0 \9-3-)ՖEżi%6:]4fhйB4jXNY:yH4hƮ4Q -\fʼnla \f$T/w:ս0sZW0]m$f+Avm_/*je.oK,JE^v tP`_gzFD/nA~=4s_:nO@uJrAAVP 3y*rܠh<]z5ROk1|_TASo ~ZQ3a0%B cy:{,*g6,-B,.&zP^AXLt%;SdiޔB5G BRA @Ha>r~W>I8 E`*b y5NI OOڕ)YIuB8r3ġEDwJ0"ayDTHO%zʊ̶ y̛\h'g?u=3l+OR7-}M= -1'|1R,v6,aiJU_yǩ|=@<\MBdO_e=&n6Q> D7cXw(7蓰S;P\ڽ%MPbu-=[(671*b5& wC83le~Avytnir0YtO PߍL[yOF24v~I* %&y UD@2u un&lc/;YZS{w]4X;]d_`RN: R4(U0yY t C3t=P"{%/:ygF5kz.$w]?MAs5P.e]E`{K/Sf1;pa[fWfD3~wT΁uĺ~A%ᆎRpӂl·stYrɃ_PV?$dbӡOh% Z!Nd\36Jwat@9=I'riQ593 -j58) VF°eJ9XU#z|-"@ڞJ1G0!VY?]DfuWD Q))9]}Q!> >>9״f ,A tܠ^fl}}a'7L,?ѦCYYyQ 8~CG龇v<^#* _f;r4~iحrhX؁Ȅ[&i#20 :s?qV3y医3tzbo& 1į 8u[O9:m|€-9@e¶"GCfb:([.=7p|ǘ-6w/ȳQ3v&ܸ 2uPkKMC'`PP_{Gr4Xfp@, $دGBjS%K.ճ>0nF|no" RNMq zh(֡0LIZr!C X'_Dkiz//%"{j$%3X{q#'gF&"' d1e3ȇ)} 27õ!N!fGr-rl8EsPO(ElK@.^L Vp\_;l? 8 :dO ӣt]YQ^$^\Dd&1I \Ɉ[Nf )zsB%|e$]R}*{U!/kc_h I^G̬'\V .(;} ~c}# 8Y=\s& a6|L0.bKdZ_I|*?5f[#{\"/is>^j&WZu'hz]C3shx1V_>e~>Y3Ym,`AmG*1%.a҆12$ZI-[vr&] ޔ83#qUǜ7?uvz95?"v3(ۣп=p:_b[^?փ̶?addیwq&BQ>U=x0qgkJvLbD݇t;2D*Y{nhX#Tua o6suceF:egԶ3hԍ[S1PW.gƄC޵ֲ}oO+H7XޟƜs=禸1z}ڔw{e`t ^'6935p y3``O :aJؒ1IIx aYۺߦz>5 Gd$jԦӸvhu?2}݋ 8-Y>TnJw3ӒEȲHc) ǻŴ IVXCOR%zlhM~ؚx]ETHkFu%Xc2d^V3(e+[QdgGȽ>9Ql=ny|Ǹٽ ')qU˕q OH9:ycĊiKқ#<D"81am$nqJi'tEzkEE=W3}0U6<Ϝƒ yXMk[ h v#VnѶU?ߺi3, H4O ۄdP9RӍ̹;̏Q$dzK &:|X[8hB 47diB{׏ DD;i oC(ua+ajNj5[zoM;i"3:q7"2B#!*KCOGD5F[+_12l~.\ iW~;=t/Nj$Y̱eB[dx)æh H@\FWov1kU3"Bo ic!{Ay #w1W,''+ |5^KDC?pOJ;Hƺ7R3 KZ?z 1pV,Wbōk` UXEO1n*B HXCZU"E߽Ğ 0=l3FC,(dse, mFFJ~M =$ ,&=vTKK VN Vlɹ񩼹JKGn: f̑:Nտߞ YƬ\Z7-:W.Vlp=ǷafMP LᏕ| J 0:rۻ|5[^؀x[lو[f#h0#%yOcOL&s \dzPx7b0R6=o_ɘw*M _9Ց8uBh< \R~0.8?Ԗ9@psJyM>.|gW:u6P"g+*-(T3vNm [N&ySKdaSR~z{gУ B5 ïT}Sy(r׾G,݀S<>JXb Mn&4F+{k1YT -) 1CѶK/37\,R84ыCh*+;3fR4SwyM *NA@>*QE $Rey+K}!4гγ8U94![#RQW 슶mT՜ye 6^UQ"Tmw,/idJEw4,@^;PC'"X3fŧ[Y-6b9=;щ!#L%y>!xeآSvL38J$U6Ju3]rGfGKYyU]#Wt8^ )s/`DJ}~;/{ojosQat_:(r`_]YmLI;Z##Z[pRN/84 Uw=ЭZn$j흚DzJ{f[`).,ma︰K!^Jk-|Y;d^u d\GLbsSnuWx Ntj6>ςz=~/$ ,+8oq+Ck<~\˳C59Xt/,o jfPsP+ϤՒogbfH=3]Xr Y`P :\UEVXԆZABm7EuvK?iȡ ]y Y g«I}Wqtopк,iE0+U\}8reغK6_^(/vF`r1uVF*3FxiP>0E~[pE!pY{S[mPz|M:5@34JpZ4xpn|_ qw dyi{I2[تkӭ@RyܭB )Pb߂8|ٚx냭nO{/ORcdێ%t>rWmso(Ϯ[94񅟬EXx7e5F`&_NH v9=Rnnjj5a$rm{3H6v8ҡ~`^߾H OmK`pUsmʟܖV.w4,s1T?~:|4>Xemƙ[s8-xAjc ֖i qlRۮMbKTBru4?܌X(7q/K6KuN%@w'"Hv#ͷvSb<+|&cD%gBYvdvˠsm{6w$)ƌ߶.٫ 7s]:,*22N1 A\XJ,хFXg棣F;f&JI\Җ<NӲ?.͉T1_j6Ʌ %ʏ#=˗>,h2C?|.ʮ=z$<| }:-',VTzQ rSr}d,i*g@۫;z~\SP 5M5IaN8„7~JJ.BL{9jG דu閚W&Y&&#2ggCbdnuUu ؟3kItyA9/o9ALNMv+M7v1,y46N%΃粛=/l]JL˕%e0x%i&18cx?F+%YOP}n=$. )aXdɃrgXx֧=Ѣu >_"z5L5{mxW񽕄ˈ'hN/.ֱ2YAAy%Y~`xL4io;yF-EPS7#ٿiLt$"LPVu`~}auazfd1_ym!/>SM,ƓA܇u:ޘyDڜlXWy2nĞ-RgtbwWJRA竧,yipl&UGjoUJnF"Qtr74Ҽչ_p8B%h X3˙zg8G-X#N簋88̄cy&omJfYtS9C!'!-._Tn%7)jMQ' !l^.g5B&MYJŠ(웚)>,O#DvsffPGmj#t>\É`4Y '=ww- lo:zk$۪7q}bPݜ-w\6)!, &$Ede4UĆI|ۼbUCA¤* L2Ӯ箞 .7OS܁c@ S@y~ԚȔ}KPx)޻U?֌;oCr#Ц. Ԟ'3B:N51tzI>z2* Zl'*xصv~[Tz +-}_T|ť'~oG*.pPsTPB>D^d-| KCr原ݓ`_H̨ ǩrOwႍ; z! _+sBy&8N_; DžՊU֎ֆ&zzo! ME6Hr'AGl"[@wki'§-o1);q>r,5*D֨hO%Ĭϴ T ;qvdi=M巟7#2(}z#Vj%*l)?lc.u.!d8g_dybꂈGu2Vf]6}j -:!` Rvt%SǙ ŜY^hI E!F+8ȴZ#)#9.R4YvFnV<'k= ʡ󌀵Si)2}Gb%q t3S=>W\!2Zۼfl@,뷵VtK v_ YwQ7[` KC֋U3ĵ=[AIOs c3# BW$0O:r)ʵ+}?ڈmʽ 4G pM380QNVda1Y!s>\na)5FƘ`SpONa\|.:l!}T{}G-)iW]J'&e.bGnI=M>>VC9.ZDAT#GD pmQ0$RP\^M; ~0ɣ-d^j@y*LJ*,jbA&/&U=*Ү9boQ>c*l. w/+TI!r)D"~#Xam7WCRtBEvѭ4Ld-ns0BdGA-OxKÔ< / zM`нzLg qc*/z>w!y= `C+K*(tPt=# ^'qIJlZD~ +8B"$!';5ͦ/*Rd4ƄĄkM,6cԍ.l5ex۫O4/>_7N2c^!_`QL&uB(ItHMV<b_[M+9=ވs 5|i}NgZfOɝ(w/${(^D#6P/iVhN}7"}DzrvG))kxꚋ YC {e/!9q6T#U!)]%=y?Ό L?k%R~V)~a:L_64WJ'yOaK^(XkzrBArf7/%F Abm`=@jTg ^e@osofom>7*9 e<g 2GkUOSkLOPJV:/x)4é}+NBYQ1}oQ?0A1?1 %my+NDh &sm> g8=+iՏ0 |-,:o͖b9ۆKz š\4 Sd((p?9Z_r=+rGM?%}cqTIޕ{Xx?\ɯ {v!(F[ZThg>D f Wn=e30^ncC3ԑ_֪ GXAW@8J"H-0hn 0CnǐӇDݝ:k|Sz~hhj_3I͔i{Xjl&˩yELSJpPYUu66O: }svuZn:')*ی@-A5g++)p\SSo1N.1eGBD&_f)H4% o'T}FQh$Z|a75OhVJ a@ 9m$7Bؘ !HhiX$2C4yWf̘Ap/7(]6īƋzN]YqX%aep9W&w+"[;h~2(]OMAz_.ov]DJ1S4]%7<јu~1%0byyz,:ELu9^,]Cs ~#MfʥxܦC!b0$."ȪZ0_鷡5H7pI{ƞytC/mvFw𠤛 Rekj[}&Yy>|b : eqymAT <&52lͣ GnVS0)IF=Hå͟#{q}u>y۾mJnAtFYvn&8*;pRjW$撖VVvwÉ9C-1i#GZUNĒԏh&Y PHS),(HnW)(W@ݞ+9ɊۓulpAtr[u)ɓwf)tiDS@L&F] 0s߉Ztp>m<Q4wV!~(03ᕮu&jO{3 dNH !lp|]Ƒk >}u`3 w/Gp>@n̵ Oe*BD7;5C%iZGZl~  Uk_x`_aǔWV쓫iw.4=ދsԍ"3dB3kIJ̉n3|,:v iaa$BdDv$rE>KOqe1cyţ^tOP4@rӖ(nEhz5C[8a˦cms/W뢺G %1?%$g:]Ҩ^;7Y嫃:MSݬ6̇L{#9 5ؙph+(:HA_=2Zz6Yce{wtO:I5'T%;DQ s]i[.Ð"\< =kc0m/%x6]d2R@i\`)qmfEVqYÎkaoF Hk֝ # l64lHP2ӥCiQVX'0I5 Y{ӒT09Q %OVr׫#Tu t΄_Rɬz1iw̅_NOQ yG0?}aу@<@ƺ'xƕ[p C; w/Pvim`ԴcЖnz*,2aYpbԑR-& [*wJKQ)֟/cY߆)(ŏA$A}YU$7$5¡ $> B0㓒02:"%KTr}"!K˯o:䖅|0 =1ڧ$__$~[f(,F,!醻ty$`)qkXyI$)c]JMK:{ɨ|: '|>c)R KGHYj?Y_r4DtUvo&y2ȩpHy6z$ 2GS+2=XzI1 첰era#W˂w0^+/ oˑ(mD]gk`н}&6c^i| /j|kw G,f/N&vP JmCtʈ7hcmmS**<:E $wB-Nf,p(*C6p'=69w5[\*vs!XT8;Mg6hQjF@e}[ϋFY> !ej0 k^WTf:~! \T5OZHp`܀mՐL[cfi D}~dXG /zô)1^$ 2'$U^A1v(hA@{)+aGи4 mtS|z"o58Ip´z5ۋnRKqvXu]vi>{79Vn` W ?-IRۜK1ء;4d?NYLlR缺8:لo}a C#մE)ϓ $o LO%EƙFC$w\h)`uߒqxFܨhU`ݘG!7X$'"͖>Cق}WFwC]"<!_y˱fO8G,_ds~/ _f1ϽZ~,MMdFjmϣA G^P["s.J93_ngf,)y6z-k B< L "S~TU@pHo!{kjdG*-e7b@ZխpqAL܁6c$@ Z=bJʻ6EK\N|HyՍ́uI5|쎇XJI ~1J%R^l ڴmPHH-"MVQacI 6 kkvp8j@(N9mTd |N+&^b݁[ 0eQѨ/TF'*nƃi5_xqo}1qudB6gjC[c~G8kꩱ[Bua"dWc,;.Ln|[kq/{ GR.|؉6]sZM۠Jd ozfh, *\1pJQqݕ#6n={U!G)FNAymޓEa%+%T2;/ɶ*-Ъ#**ws0x{+Z_J0UFhaիЩ'l enğ瘺_w*7ؽm';4Itq ]C7V# wT퓣@=e/'ozFU/۹sdk^^:'@A܈RonrMM ~B+cxa][lcO:^lhCJ /0Be:"dIYt$6BMC%bQ ;$Ojxl>m-o}k@! 6Ƅ-i/"#>Z@fp!D2ZVBIT2 &A{X?j c>v 嶴A}4͌xYKlr(yX1,B uS /Ύ`D$3Qda[W-p~KGI9,b2ێ7KcPe1|YTv$J7߂ӓ ĉc@˧f·5{qI65a5 m@j4tKVl^w9!i+* =qƔl8FU0/ܑB84<ƍw`b&jQdPN@cʅ*d Ax_O|l9-M?*,\J|* ٱibiӦ,:fJ×+.ˇJ\dARtdmfeʫ vMo+cSesV%_7֡(b7r_:QNl=sM] ~Z1Y ,]Q{Ґ[7kcW|SȃS;C9k7!2>0FiAgOCҞg%8d-۶z/p uv\88#$ <4g>c@{[gc("s">ާqǖ_S" gM^,p}Ϛt&VqlzP:b\HNU]7lixP< ?ۘ)>tKHTn倡e3(kgHth^*$'9" )1cE1:t7{{$ÚVg e$dur vԛN@U$4'}}`&嶍zF{F]Is.UԎ p<7N,Jft5 aޖ{8]Q[>L8N@Us\2rdfFdϬ<ķd A3>ᣛ|`{Pk&z+lM̯567q^i|c&(l.F혖V\uB8dDMB,6{:31 5MDJ0{CLMϚbE-|/xZٹD=bK&Zn¥K{$B-e0 @-@E#^J qzjb 1Tb,F@qs'/Bh7%MS1:Gs ß[10fɑNV#MQL|PrNG:N寙ȏ {UޛGc'+| 7} ș'ܩH2"5Ƕ&ַ䠥>>]XM1Wyra{u= gS3Jjfp1Βi zT[7TX]ȓ6A CW:tPT!}-]~6^l"&N" ?x+aJJ wi9% q?ق*z@U2|uD }Ñ3袤R _a2eSVd[cair"Fz3F5);nېn=͜ w-||W``)Z@ 'ۆCg٣N1t[6w\g]bϯvZXk+^m ?y𧧞qݴ)S55j<դY݉%?%綩=Oؐ<}%l0P Ek jmLGr ROr=ܘ_`̬L&,-ޯ}eS~90a7Izz&  -`w( /1.b8O!]L Uf*m+1)y5{ٮ!셿YC\L>pS7(6Vs&=BDy',Q%nŞjO KTr:}"f+*NД<3%+vVA(dZ-~2Q(HDhvWq|8g<,K3_B\11F30GkȤbEɠ*ö݈= y 1rxeQK[$(zboV#HkחjE:1 u9#[xqkBcWbAU٦ux¥ؿ(>G~Q55;fWDT-_6E $ib:{_)GIaP/o_mk\)n?֢~VWMex.1K[j˴{M Tbj?vM.d}ar?VbMХ yd̥ ^ A\>Ai}f=:ib Qd\iL[ωu.#sC&'CCuʋT=cb<J1d[L~4bqbLB WJ6 C6}=DrE렵]2nsh7;*F/aIqVk$+6<(ЁΛC'>9c莫R}̾?[|Z]1:^0!_|hn{Ueh PWo;8M'`8֨0B!1Ab`GnϕGxTVtTuל.r J/مP[fe4ιh9݅%$\? !w}K7{JS q4h󜏣-)ۓ%,W< R B]S;T6\}RR%]}}ӒԺڃ8/yzzw&Pnb`ي1neb3sIo#dM\I|͞ . PYsedfP}L4_ϼ#1pw1%V#dBcЊO5膋/~.g\kL}izOKbr9ɬM:mQ))zyl951@m{S;)NAm*,tڸUEŚ&~:fbbUH1<eFqfRntwzB|.ff rvn[,r뮈(cT̖=O k!{Q@tgHG|%S TxN-UDT}cz"_ckSfx+ܮY݉? 17RAw5}  DA IIv;\A]\Hk1d8~ rmBa}6i"<Њǩw4D<][W_`yv9(j}6g3IRԉQr_Dib$u^2;$S@ Pi3*} qvvLthYAUPʽ/r.MT 0dd-RJC2 ?v}(Hٙs/| ˄{pt)Li.V9rQQ^'asj"H1gבvm_[ ;Ɔ\f@o]^أ5?eG H &5,/aw1NKIѫN׮ ?^Ҹeȳ({?Qm6oE;n MTz{PfI9 ߛ'S8[5S_*΄(FRVxtsq+&u\>%O*Bb͊X=bWq+Kݳ+w I(C];hMcEl=&thpϋ>T68F 6sRƬU]Q0+EҠ7:_h"^hOWv ӀǿɇnPa)ὑ + 25BSIFYM6=Q_wTҨMrϦMdp֙mAJ?yV>>UHg, 7Ti|..t~5cIG9d0csɲ@{aɃ6V)m,C$ IJ\.!@X)e/v_KT#Dޥ`"ceZG޷p=<ܫFMON9@uc&rn6b hS\ah: Zْ9SHج<!U-Z.w͒+{Fm|0f~Z kV3.8=+sXf؊[\Oռ u` TvRyDt]jeGJT$Dac]b!^zΥz o4WKYpG΂GzM1keP7[r!8B&EX0vFH::/+C -lWۯk ЅEWCJ;kWuaOI[7mTrj}ԌգQٺl5 0K hUA0પ `l+Sc<myI~P_ρzzfee InLZpz<ބ^fEf=5Z2LrZuŠ}Yň2Oo^yTua/ͪN}M ą&?*t/CULTPg-կ(zc5j>PP?|;rS=G8#4Bzpe8xG<ձv?J{X 7x*ds![z۹^PthU؉#lH4dhmft\[BXJiO=!DR.^זt%aa=u:ύ^?3' T%_g+Yd "@hZ!GX9wc2p_d(}C<1F FP=?ƧSToNcɰx NC=M gomڦWՇc{sTFHOe4=8GN49Qw2"Adv{aU".s8fTڊ"UeI :>q|'77zyA8=4gETpy\Mt^\\EȇZ :ԊζB9}6UJ}tS:gށ Li264Zc % L,%t!-iIl5vPO5MG|O+r-M:y%Sn*BO*:L9-bƙy.(CY/|{Bp /wMk~ryehP\a=$b1PQ喹W[!'"o|EzO Š#I**M U# o'ܢ@HvlQxI$LQVk2q3Y?TDRS)Xb-Z"jo[؃b:oQ3(cď]eb|?$.&<(6 i~ .zb v {EWt{j$Ljrơ;$3bkx?z{i,W'b^5h\\(%}i.fdڎ, ތ8a/Ajf1le(^ptH?ıYbdB#\P\o`ߒ1}\J&el ׉Oi/MV쳤UÌ9zP4˕V3Bg˳b1"pCfiq8^(׸[{RPm=Bɒz) 0|8҂ӽI;\Ĺ ݥWYhnE]V]OoV?_LQHKY8M_ČXl !e%ΛyRϏFhp_oq>/"D<)'piN{oh'5.~'JU>y_,:^fy[lzO?@IP hURg5;MѤ'5t$膞tvü8Ɖk0Iq:!Ѽ_wQUՖN A8o_1A~}퟈R(4wGӦ8h+# vb9Jz" {C4eY`> T!fV Eh9@;%&6 5Qe Tq:Od;Y^wgG2_>-J*iQ$ #l rj3i(d\AlTђ/#\[X.@s/ޝ5:IScЭBRu%v>e #F+ä)5䥥Kv_t8:J~ɇVd x8-*YdWv^_71FF :L~>HbeYWDu6,>9gJN4Y>ݡCAvXccjkYS.nBxuHS4N2oz~L ~{ILٛ,Tfzw&L3Bq̔S-!Лe|%<Ǣ^K@22u\LC(ds![s3}3"hܼ  öeLHMnm?q Z7X47*fe/x)>clztG!iH9uwnnhr|cjp! NBvk*|֨Ves->E@WpX H@zSޟ;ݰ[ n힆ciPD(҂go}xQF/E5|}?ٸl[iހi*cP-`Y-@ab cUuh+7A'8β*nRo#?RraT^h~Q;1D#QTb)I_T̨ P\[1Cw{ p qnxE?C*l A]ZdXѧQh֫wU?`dJ#ĄCM^󬸊DFYi6V$9{llc+pYYgXl (-hB2ՙ l!oG+IFdΰϦ$Ae1:eAڨe^؃7~IΤesj/wɘ%'Qβ1]?n*}@L^<5_?{wdPH6y0מBpG(!Jn6#c8iUwײׂW#y*c~c!f=۹Vikl+ق>H+ڼ>>2YH->)" MR%n$;ŝ_Yw?wl?2= BwԽ,'x/Kѷ ZMϳ3>n#꺄۰ё܎ ;>:ߊ@[v9d@m_ȕcpA9x[<͑X"4*N 9 ;dGyE=W#&akrm'p |o9 e\nz>PBiL(aW\Htyl -x;zt]Hɞx> 5U|dA)捊3*-Kf㮻ht7j婮Swmdfgպ|)x9ZtC© _)L\52[HS\tűI@J'"-CŞ[%IT-dq_૝- Q6:y"> A dMwQOG~3|@yU~MV# >o~g1Xjb7X6*SOߋ+MqU4'ߤ geNr/eϥ3).ɇrFg`sjdib.6٥pT!9F!p΍$> [pϢ@ њSS] <`ȧ~~05 ^avS" Q9 3%g@`$ϔjG B@M (2*-٪>#;@ωc~9n#6G?+?d3ZaLqMj408OܘqSw(gA,a fcdݭ;}*uPfK=UNۧJ5q'^<5U9ͳ!sN@"9$Zm\ hQ>QAs|5EiLka)dJ[@[\NhկZXWS.JsZ}pEQ'sc֥biURSiZ5Svkt d k"6zؠojЂUp7U9ius i?$brY[fJ,>rJ"*^*UlGq g=v~0="-;\au UHh<B]•P|`=8FF ·o&%Þ[elFw3g!& [';G@m=}k[e7cZ݌aIM3FTSW0 [yql<\~ b17N\9ib l>Ѫ=}i[Y98;/c} O>BrTL;㈝S?9 43^7HcF0n8e]W,HL뺖KlKy`۪~-&x*I58Z-qJ'z;<EI.J꒕d%)[??BCߢXEk ĵcD{LU4VY`m-;8t"<.Q8(gǹ;72#GPQ}.kRBKK+w88{BjD23 n|E|="3I}A``VH=M>3B7f}Љ\4Go^_1Dsٻ/ -Q `}j.=Sr>TXЙ'4f"ŤA߆T E) &1럇s1s6HH`xʎn~VmAvqnM|?۴L0FY3x֘EqWZaN"Ylae4_3SIҏ MMҥ&f5"tRϟd2T UNYb{xrüc J!LE6X@:tN7 TD6ؗu/ܱ.I2vR:9#Yh¦T<,"Kdv[h?⬉-Ck5#cw0@j˧3gM䃷.S9gb`㕜A:Og)6g];6N|cJ-_HEck;&9`#>fL`Ōӌ^V>;Jp OIG39/4e$(5Quqr9mq}4_rzk1V,ܺ1[&`w6P^WdjA(ld&f}X7`;aA&%1йzBPfuTöm/GcQC;@VEY~{?%ۙ_5V.`LOMD u_<ֺRc nnWqˉdG#@HѾϦDN@Mgl۪b"`ԣi gFK@G%̐ƒTwT9}X< 35%.[iy%*pT}PKP9=RS/E Y9JȿޜlSp( LtalvFjp*l~1N쌗AAHyt;KN?m;&PujڗΑsscv󷵶IQCp>[Jd>̂ת<O`~C)Ik#NI7K:h.iv4]=UT\]m$c 9R'Ȼ5n̅D7ve% ^L΂gBH&P[R0nڛYb3Of~ b]_V@Ş'\ppy)|YӠEx⽋A_WH%l'ksYcN\GOŒj>$Jc&i)ኹSu54 R&4bY&QtV6?STLCX/4}a֠}t(g9qG5cCϦE]i N9D4i+Z~~fTOQ<E+QgɅG&U~&— HȜ;"kŒ(ee:{L 2/mPFP?"nJXezɺ"_'kjVdAvy,ԇ U~"uPQdh˃ F? q^hAw3:uNȈb pS>OG6J`YvKYU(m3%vftuDѷ|EǍnrAW^T~>-c!z(O6# mcӮz4StB{O:+xV mo?~>WZNmZ^ǕPBnW(aE0M۷SjZJN}ߴ9lXuz%9]:PtzБmKP8‚Q/rGi/QS;$7$ݡ!zy<9#X $t}}q)blH{mk }"OPtVB|WYTd %ܬ7^P=/ ;v̯9gg@+_q5!6u}?aK*{p;_0ous0BMc Hz+&[8=rIxy D4 #(rb 1=;U\nÁ׸i1mpر(mWds҃Y=ơ,PX՚1֟|͠<(rpD7|RlP.68)*L<|+O}pZ~G< OpC_H+G !2MzKq=3d$:0? 7OpM!Ie,#h$Fu0 pԆ^|LszS`7✳&pĪ3~r)F_@Ldݤ<'3}: tm{uu?Vh*dhv$|l#I4xZ*{rc(ږW|B;ʲ^䃬Dh ߯R?(3*ih;1;i FԻgi*RD;,~QW\EU+;V14Ahjan8H-h#6L 8w1߯\g q9-\pLd"5/Ipg*:f8N6V`Z͎[0Tnw%O`.%w?ܱyZ?ª4@ qU}]-/GPDX왂7øZ" L#n-~EpEϴs iXe}aߚJtmgeW"r}z7%8`Сd0 ۄ7BEK=v~ '~Q..$ Q+"lըqP'[>A7x0>/MuQyV]#tVwDP>c;SگVђ|_C#sތ]R5-Z pOJhfuDO`B)e;}6%=hx_kFr᫙,ժ&Գuf,bhEma}2iseFhc**7^v/ WXz%P%ӗiT @ۏ $5N<,5\)cۇ(G1PvgPTMo4fԒ^{bխQDTEQSj7ge,M$v2Tqׁ/~kMaY=_OEv |2f>BsZ1,t=}<>&.#DGәiq4#"eAa~99?ՙ V=+&r^9 "uA2fl(ڷ.D41Lw &M7#3[xtEc #u}Qma#մf~X@F 䓡&众=Χz0bߵax g -/0/-\D$$]dG_:)_2k&JAlЩx`:L9nhǓʹz)bGK>~:V,9yB%akދmpԣd?Qq)$)f_W3BZgs'IpU<`t*6ގ۾Fk?Ad \1hpi<=Q`HØ8;(>0X '񪭳~Z$)T0wy]0LSڡ&}EyƳ-#~('䦴 Q8+9Vx$EEՍ!.hP益y<حkt5BM^½ÉܥOi5i5:O_̔ܜ8oZl]F1HU|' {^SJl!F GmQ,>+J9^SUև{C<)}Ƙ:w8-UnrYhXlHZ༔Pze^˷u)ѧ!8-7Ī2k6n= 8ŨC7z͙rtz 8}R䕐=P7_Z3 ^Xd~՝k U S4=GE%v4ef*"z\X0o}V\vz>J#p~+1)(͚Й[vvpoBK:T ~|P5kq-ϚQm+ tY^zN:,)㴹#8S*jfJlD֩ߍ cM䴜6~}E&!.~npc:ЙUG]´&aL䥤4^c<$ UЌZ^FhN $./`*"%יYE KNلaѮ]U9ݹgE/Ga^v?n H3uD߼-mۿؗJJ;:hıIQ" %rՏ*C;w?R Pm7{Z!XyձM-~|)&8`>ْ&6g=sȭЎLܨ1בٗUB@o7~1LJ `VCR7CR$}1R d36@6^_ƛ3Lrs6Gi-lw - JQy# Ԉ.7l8.uIXZx_-y(t8ַez͚ӢpKe(dPA/zǁ0Ә$ϸ-PP-ǁ [hw3+BX&yx5rI=2׼]HOJIHV8ȋrGZ.>-huQ8$cX]cjL (Z dh"*2Ye4"0V8sZfwpM +L$ Þx'O3v)#xyw(fs21픎_<|'Ǽt=5fGqD[jgE|,>FT|B 2w9m̓z62oL0U+R:LJc*撖vi#/#\HR]XoxO#nKKDBi)*=Uc2=.XWFy-}nK|grz'keCMɿ^CJ UN\uE:_8=/`+"yJxEG"=St 6^@QX|SP}jjn{e~f 8y^'b aMD'콽ýt3ffWR 4#i;l.8cK*3+x* K  *C0h ZtƺZ<4GJ[^sbȚfKW)}'v>4|B7qm@} CVsR=:# \ 1ڋGg>RRcCMZ1QMTg,L&B;|\Ta=N pq?ږ{ZBܦɄqPN_ka#?,_ \ =#sOЎ( bvmmIgXي~y%  ޢNQN3wri۹E]Vz }n:~rcP *x$ "A&_M)g͐3ai+/m'_᠒w5@*il ,n[:OƧtC}8Rc]nWJ I0j  UQgZջь u(/4%_e)\1Άr[:~A};p1&9\'3kMZ< Z >Slt/tU| ̉{'_Rw/贄hl+"(.̍F X}揧P?ץ2 lL ;+ȾYB[RF Y#9W`ZA,ޛ9<2Fz_>9xiW;FLv%/+oG,)hYS mA,"~x]S2#CKn ZP\4vZiu}ٜXb3ձ|SST,.,-xr 8O0nkDC:EվO9ۤ/BY w`]Pe, @e3$@Xk=rNID=:q7=(2y&Ai\{\MEwJ:nַY'߅A~sjTQyͽޱGL݋4畸: jNA>?w*OX i0z޲Փ˶Ao*'QA1dn6uo) wi=^k_zx\gb[&t,/VP KTpn.%ih?^+qk+vR V=rK': ^G ʅ7ϼ %pG\!3hMnwύi۽ʈE=# *iO֕5{&c!?,,Fs;N0%:s NCuz4{~3])%ɎHz%(W/Ա{ΎR- J z5 $5e(zͷ Q>N !#L]8e@wr&O))KHg>;>a41m1\C[ٵ_>dr^-$FH ) Glw11];l}} t/3]n콮5F\6ѕOBZtG̓e>~CJ-fCF8GlǩBnyˋĐֹ^.brZ}h+Ц CJIKըvмz%k̳U!Ǭ2g bH(Sۭ#y I 5g,m[4 [Q# YT8ZlDM! ˻Hׇe`@gΤIsc|Kgɀe 7?'j݉?r誵`'Ls{j2Ba6vE$Bt]FcpqQ[SD EoHD̺aO_o&^P(ZE`Hr_k^92W||R Gw]ёٕnwg]`ur8bia] dQa[ ;T %¨)߭tPgܵO7 oG^G٘SCV ~Z^K]t_=Z{0C^&ekRι`OT~~l:r2oI`B |p *ܖɆRu%b2:-zl-۾p<]:[r=B  ؁ָTNZSb?'P9~ q(dҲ!2v8İyg`#e :fa*3l&GW$. ;JeXB\* ҢD|?uggLE@ 8$OǓ6{G8; Zb|۰ޞw[E6{94˜bVrOT'(T>2جYT #Mou1@4vt\ME*t%IЏ~RɭKXEvez"49֞o! N][`#q5ԫ6FDS *K`Ki|"ZKi 3 90)C.9T70V8c-(߿k^#`;CoA#폒Iq}PH6HL{`&)RbH3(Zo!Kە/VotXJ᧔f2 ]։vl޾ aogzw* VK,Pct_-e),`2 }İڨ1=2(HݠKP 4 cFH63~Im=/8dGPk%0B[w^%(ӞFR"8*Jt )!6-UQ8YD/M W)@:`vQgRƾf5"G=6bqf Qkކ==o%5Fzn9Ӝ8l+~rɬELЯTCJ9_,'[|Zn1FRkv7|>4Ql޷ph&HVGQړ ʪ@,ʹ݊^i8UW`ëAVSC+NuL!t 75pnyQ FjV,C;vCCrdFRRt0WuE jo iC4){ntFDWYƼ %åޅV%1u$c-?`e&1ܵ=' Lh w܂ KG#<_H59TpQcP.n~@Ůa\鏎D+sIz.H@nl#P%}7ck: 46q]oLqTϦkL uj 9`wJ>G ClrMb{uk&7PjluW35럙7 /Ԑ@Ci\k;LmLrď~K7'#68VCm"8_OA|)Jw<YخlI;S\c1ɍh;&G腴Ա2% "LsRVol2`)cA k6]?vM )p|&j?̤(S#Y9L;y(;F' BM;e BED%?͈s&cDXZ"MD7*:`v#y`P=/nyCd5\MmZmcBfݑƕ[kyZN8=MChDQzj?፛ï"a?+Paͧ@e쯅Bn}VU,(aV$Q=T ;C+w v;()[LO󪿫@&|u %~ѱӹ zrKr{thTMvQUǸ6:>3$qPWܱIs;m/Xq!M`8'4Q\,Q@N]1s59ţmo05 mµav7AJxavnvjR[ ?ߟM1K_sԫ>>shxcdYҢ=ݫ塷 5OֻyqS̩ h8[D/ <7 DF {2G gp(1Zi]zpoHO%$KHV[ J})ݓ2-ɟlv?pm| 7W@(K?!|噌XwdK}(qlSKyqΝ|<,,1*ݏw;/7Gu:m[rYN_|d!+Ŀ#s#BLxY덌Qm;w?Չ ׻Kֈ($2_"Ba7X"1в<̌Tā\ f|&ކBVEXXv୞XRۥ *ƛ *e !?g701[ѱaH"7p|GsSb Lmk(53FmA8G.q wu''Oؽ5=cߌ=|ABm;K܍@(?Cj| ee 3?ʫcs:t\TMWVH7v xBK4J7ՠ'6\D|1-U;xSC_T&Fdm ]r6D :#w%!Hֵo'M/XBf@.@ L$>M\VlɁ[2y_IGbB3b}ꉧjݓ ናډk@,I f\J(=E9V"d, l^'kmd~bK W{E?^klGD^7.Icg#J%NQ|WFyI S._gI%Bl~!1/ڣeOoeju|9}40@Au'Axɛz7zh"vLTcf{%Qrc:O^Nⶔ*,e쑂 = Po^Tq Bft3v*Ϛ yȰ'&J\K370\o VMwsH#'cct ([Yy!;%2t7KbQ՟dZ `8 _LIkI<_A#<|Ä́}'\~18=.6v'q(pVEI[yK߁K{}"Q"(ymJuì~!Hj/DUeߟwZ9d4FД w;IШԉL~ϑ܅92\SV/ ̙jRct ޽O>+nl¡,Z񔦭m 09Jѐ MЮGm8G{Ƿ{KLMkb X3iRtƝ8>Ed˪r7l~NT02C$–+<.PDVO_IF^-BDSK6ꁄW"a 4/ [ 9/߉_L. ri!Z#rvt-X>O6<>5+r8 歵X$ctp8ab\{pt́ ,y o% j 25c+,J]ΖYpARܝ[Lg&߫.qUߛ?G%0GuR̪Zt rfh2Ai>Vxk^)Lc֢B0;ؕnG __!I*L7$_K)iRkT4=imixIW޾ 5Ha(LK6 cL*rV^9I1A53rk mg3ZdՆ4S 7SZ8~b)8RRA|Q$T 'NyaYTݰD1E<4ߏkTRXs6fjr>}͠ od.p'V=GX,xY-8ƪm󷕯G_{5Z=_5σ^ݬ4ΓE8[ƹܿn\%4sVW7pJ\O;gs@)8?Aà; DY³q5n?U&-uފrk!ZBLlHZ*럥/@ } @'KQwa~ὶ?I񰤧Z|ClՔF=LnFTiCs'ZoTY2 aރDrz(>#o~+YD0GyR-α,EƼ Q!M?oڀ@Xc/t}~TnMR{F^'Ix X@$D:^jzAPV?l+D sӝ[&Gu)8%R Wсv@d!LHq V\:EC"Sw ͭIsIl`u/ i#Qk0g#:T`#mT%lơX=BdJy{)n#7"tp;½_b3ˇH A ^\źX[|A,b\k5{mݭ_hZz5rHU Lu*5h꾳%eUCb74S^3b'jW=Xf$_'.?enl~Q 2E0IԞ ;Rв/9.\7Rp_& ~A\`xZ 1t~Sf{uciID5R@BCs YPmm1ԬjU|H@2@ȄS $gf&fTF J_n*QǀtԊjMKOQ"z~.ɷ+MkS(}M'sQ-Lj\*(i+kߏ= -Nyq-;gTUlЛbyson̷}KT<w`.몰Y'`؊[YJ[ZG7ta/"A"LV02%mU#p ~<XcL dmFFN?B1'Iڌ}y;3` Q?3GJ>w[v~b"^l-y~y\yu01(u2oľz4#&3*Q=4ZkG><_ ,&)FG#~psSօ 6ʔdmkbo%'G_#m;S&+)!O~ C~љ0ikǐ:!0Wca2E\qt8i G@/t0f͟[q=dҳZ\o~ BC1bhBFZїY)<~um<<HID/;F!8H+ltupToSpjKrC)R3a=4 xɥZk~[~PnqIV[)k%}vvrX'*j[Bn*; <{t"=a̒kgm\i:yk42Ai0\xK/cie_l/H(APY^Dd4*?Hs:%Tݎ(o5Em!qӿ<bL'c7 (:x| יTM3ZG@bWl~%'Pz}۴ ǵ$t~"GZSE@nrY2O~Dǚ-1bvlxq3]Șpt?O"(#^Éo*RvOX DUX߹nq3ۆxUcrW!r][ 4}sj7k>$<o{T<Sp(&kL١)4foub O|&PU65;Ӆ1{&o@'4{f<գCz4xYUjo2\{++<޼ﶣ9``I@~Tdˇ:Z|bɼ֭.[ǸZ ~;Ĭ42ne_ى5n'/ݰC Gkp>r};VCd2`|X.AIŠ瑩@[Q)x|(Wuls+=62tC*y/3 "뛿RC˛h6NlVz%cmLN_V Enp37Džee%vf#OphIz13FB Hg }"cf?,dP.;G; 1=؆'W" ]=;GƱ+s/XTwwC4VLiq5 X!͈fѢc*$?&7aȒIs T sؕح@Vy}=RF;[˄BM9QAD˙U+MUtY(2HOt"lj ,x@DSGuN>AOJf78e|#NL 2kWafn<k5چAþod:|=s j|l,%I22*B?cVmr~N>ްTW7ZoAP 1WZ&Dl>l9B? W8+!H>SyQDS-h챀3Y,1~ EidFlX-^s:x #Y~p }l=;?ҹVJgu̯x6]fzwMMRTZ!}Sl-eU\%ZTioHhZDI4sY1tN<,nrZgY<"J%&X.5O@N*WWI+RLC1WR{XDS9狿IhYLl˹SHG(vO]x1z!Jl#TvJRZbmp Xn+)n~Ä ~h7a)Q/FU [Dmuv,֍˺ds_?({JmV7[vڮ`BA6sb׿W/{1n D bN^t{ܐ:R4T#6_O; AAT(}R5yΚKڙSF){Oi?]羫#*sM)YKm'} C5UI2QxMxꊁ>M+)noT6Gu[̸|:i^o_:mx"B!4O>kW:[kڎK-S` bM_q6ںw$U1$[)ayH\I|)IS;ѣtREbf;!͐ܠ }֪ċ8)̚}?K10%Rq7ÿc5G2G-B:Agc|aNVHD,WF$[=Јi].oh<<ep "$fYˠz^<3l4|<niҀ=M:M-P.z,-9]yqXzZCWVV4(c؞8k ͪVLQN@7[$BCV+HO?38G+Rbo}e*@kd؍G<5v:\hay@%}ؕVM!]\5@~D3(r!F ViMYΈ(A@=dHՈn6)s-{c*?\Ŷ:!k,.h8YHX&S]~%vҜh!rGq2&k?$kJ<#8ლIY8g\!~Ӫv'AbϯUjլ^ 2$)HkQ\cLkVafX"Xnßm4=RFi?7$ cApTE w–TT2[ th1g}j Eq .V%zo>ڝܵ,?Fz|]BN=)SU,=dHS;??oL3WW0(hu|Me *㎍DBijٶuG 6c< i=G2..>P%ٰ{$^¿@q+P%lGYc-t&`:dyt- [[չ ܴT*cx_ZjGfœZ>j!]ZD9;a|7.F޷vm"sBP>`=}Y!S$ [br:n>! qO|=SAw~ ?W9Sfar=6pRey aKf1M32~USM[8LD==Tq^ã";?թ\^o?@7`pೣ|TBsI\}cl!OaVKP"g9a"|,_M-bWc>AB-YG-i>/2M.yaT>t S`(b&`2slg_Hf&gl9 p |>yGuiE| 귅z=4 iМglZƻ@{>=`;Ƃ 6M YItvdI _"%ٞhƍU-bx]l+L>~4 A$,CykZHn}%9 (Cdg㳌{*s@+>T0IoЫ_Gp*>$Iogd "w`7GlԄÞbpSO=$:6 x0v.:dMcɒ p$1&/+gª>|9@SȩYHz09]~ʖFHtN5(آ5EP Vs#/w^O ;"ql~WW˦pU-Se!aɍ1?gWbm~ B X]qѝu;8HLSNú,;ñiH &SWѩɕJ"/I{$jb^J0ّ#^j &3_ ; :d`}Y;#Bܒ}edҌC5elDvΡܞdVn/$U{Ǐ'=:W|%ڈ HL[J3Yz- N-5ҋWj9[:%l\5Tn.7W<5N+Fʉ#69|2K(nJ-8*VǷkpy2F̪2oljOQFLmWZv| &YwvR`^mtsݙTnSs.ry1Mfr<\јZ9Rf0!H7#mKbчudxlIXk?{ yATHAzM][=VVYf /=c g2/a?\ x=PUsbaDKy83NsQI8 B>KgIB-~qGmƘfD(7E`&>q0ʘOD˵;ӻwUʂ _ic Uu97Bi=gۓ,H N*)duIӝC>UkU:K'ǨL_ _&TGץ],F)VaQv6z]a5?,:UvVf)hF4fYR$$_0kW-hK;;^dfP*cM/xrza9z:r;7&8sf?J]/+(ҁp: +q  EZ:1|E9Y`PD,<$:bs}u cypqxs-nq3p3߆ ok :DCDR-P"} Q^XCॹ/:45n5{W`RD}` o0%ÇH%e?q#  `+3at2YC7%ϘxoJlwu[9Ɇ#DުPHővO~ߞ\o(` '!BL'"˺QPH5= U. }xa q+s~ RKo~!͠əo{pxB3l;÷ΗE4Zş7ެt {Gm"Kg)x J@+_ŞLPzbu YPnED$ݭVl\/:ZBt,&ރ~[zRGY\n%7;dT_K-8UOS u!vȱ3lk p֮+7E YV9$ :"E0-=t8%UcaFnB)޴]ZINwb EMMT!Nq6E 0/[ǎK=G1ZUdk>}1<"2bޑr4 MǯR%&fB#d<ifݲ gKМQ܆r1S4,VMsQ,R&SG)[-(?pD}32Cdof焓1xK{tSVf3\0rNgʂ3%)x{5u  ciAB[-衆xľUΓ2KS\B,xFe;:ؘ`7]^vŐdטg MZ4L- Nd=PX}R2bG ph[] Sx|(J *$xpٯ}XX5@ FC?=ʼ Y4grPF.香CK.i C(C!_,_ȕ͇4E$SY%mSֹ8 lvw;'DsG-1yO4Ayd} "#mId<ޑjq(wȔ'!2`Fq|s*xb >|#(HvsAi?='iЪ0uC #佸ް ZڸC-'[0Mw5ҺqKAXicOTxCEOZM]/FƶJ)sdzqt ACFAw͜ W7}_|߱4H認vp2ڗ{7qywrV'6d\H4ou Mg·rS6s,3\IbI]"T\jL ێVbYnFY)7`+i 7t =UH͛tɕaK .7]Z$+U z!f6G%ЧRUk>:FWꄅh!ΙMq1LҏM0YSx p,ƪAاm0y;~1L!ka(ƥC r'0M 8XHk~1gaP?mQe) )"`KKa$Ke*!B[ɾWBW-p&U lVu&NECJ4Oܧ 3]S;܌b:N`RL"1-CFG@x^.{yԞ֟\aav'=7|B<:Vb^\ 1%1 ظPn ?|otSi +o_`&Au y@wOTIGKvI\薮})UӨ ;tX#vmn- Oi_c0h߸`mX(f,pOJm5XxUICJB|v kyK_6x܎ɒq vN==S}H`'rIS$[ 8Y7@U 0W9,e~K'bc O>:w 3DsZXz:QK 7T(b&b$Gb?8"| tiNhsi=^t,x2qvmYY^a kHᥦY5b:9DS kҬ}rE6uvgM]hJ}7>j` ]dO؟Ym6;@.]a1 UM`L +V6-"yOddLRG8V2g2NZbc/^X(۶LT]q.9QA(c_dO»Uδ򏚀z>} =Kegs07=fd̆B9 i7@fGam3ͦ|/燋09GǤsX2H%x4wjJfxRQrDG׵|r'TkV +c:l-dB=eT2\=Q8WkW+*{({UI}p)މqBЁd褽j-XT (rH"h##=M rǤ+x(_v~7Ckrli+a 5!CvW3fBXNr˞j!dzh2,s&Oow# 5Nh+g`6၃k " r,(z)t+U.'OªKAgM*n3/mhE,o@m<&4A(#rv/M|GF B%)rN^uYm\Xoq ZLaGc5,|`P gb9kw 2&H|Uq^&ڧC>7d`Р6IkF懱,Fv,%$VKXwHM[ `RvZw-`pN覨~Ϲgq\-;sDIN!, ߼Q;1|zbwa]apʙ"Vƾi.lm3Pvn|6tJpֿtl(m%'Bзe,g%p&}bc5dS`uqvF5&O`}{e4oo_ 7D XqV4 ckЁ-Rס^z꘢y{0CSgjSOê3ʘ]DkB"Gcx[y=ך\oWE ׾-i u>4)")Ij.@P㙐Gďdc t ;ꯠ!^{ y{7*H) ڏh1|dp Sr^r<45cOkY>Q>Rhv] aH;assg omcT_NqU$S勍[M߹ZLZJ|0nѮiߘ#R8wGMj!`QʂF<]f!V3X\XSY+Ze.&5T:o A^YM˳OOZ!~5An(Tސ[wAyTJMTzmsbg/!*,ye#vG`?sPH䤑`q@VEǬ!5)V],ڪ(#Ιӌ,hárWU+n)=y-4&TJ 8`I rAjA9Ŷw )zk=>@&}QadsK,D=?P+3 o.BqES>o%J#j2V~ck8Fh u<Ǎl{{``~w^ (Yf`yXSPMC+PJGNp)uͻRj69WүÚKz;ZT0_w /)o'5e\L@Î76os-yaʜAM)3[#N&]kyV$,埃@ShZKvHQB0ח 7_,#H"rps5'w!uȝ= -i# -D݅} aW1!);e^A+~`b]l oHw%s[3'ub-LGCg >quTud=D. kd(0OnH75 wNsg $%~)K c[  ﻇtPйFpi!wnR8X2˫c6oSݢ/nqٜp>_Z&d@x㡢r_Ԯ^_Ƀ&D|?ޗG;U{9  7 h*BԦ֬DXFxY8 J1QX~~/>}~#k0Ґ]d9N8IWVu7Qh0BYI:گ ֟73 )&)Z߆O<j|$FK/w DQcN<#QDkpuF8}Y{cq_γ3b>-.Z mJ I*\XGcM%0tOQvGX;+Yn}z4""-/LV-2`~f,Z;3D1/k?f$BH6rɝ\Y'k^ v>-|@Mh(L!gL0DH4?,(w2ā])笇,═",9bȸ/0s\5QUD.|Wګw<bv/kc=1)q?=U9+ԕft$ik0.O| ^vv{m'vxD/8Y)(͂ ~Թf~H|7L@qJy &F$r/M>PM2TJCLh>7Xn4.Ңɞu(vj<|׋e|onvQXF.(=7HIZ`kPBu9HpI)fufd1^: srb4qƘ@"IU6w@+xRbr|~{X]t! c]9R$B8 (,#R?m( `0Éjg9Q=Nk3w)MZD`YU>Pa.; oJrR$ʺuqv,*]e`lpCɹbّYtf,Fc~&~ލUy7fx&qp=ɍ@49x}>eax@TxΫC)N󙶐r(A3>^sFPn'Hʩ9FhM  !wBjԞA$]\ ѥO|r <ЪX>\yO->sj^sVUj]^Y( bu[GU˫r/Rd=](&qkD\+DҦ(Y ImBxxJzs~lr܌%r+h J#*Ǽs^֗R:r{ͨQwLn0@cN^`UO7z'Q6H)/(Fl *NyTnhBi`.gYIAAI' ϓB{(YE5))ЩFc%?I V|Ut zv[XqOMv7Y3*PGH~RnB\(p58 ^D~gtm֨tlgN"<,C la!Jv!ZhN9 kׂf׫rd}Y Yj}Y^ڪ4:\0]Mng]Go:!ēM SGW &7ͷ taa,p+)pECڄ! gk{wh0 ؅\ws]]Qԛ\h&]2*pD YmF}i [|G|?R>FCWfP}maZ-jNAJvJtܑϥ3d/;0?PؔXW5Rǚ, *T:J<;5Hްxq\B>sfC<86t ?9\ 7a'وz%dH&].r\zՅ&,!Wѡ q1q%}7;mY6x }t¬+:9K&J0k'[$R]z8}F犘,#[9'On26* \K &mDZVd3"8KюH!"EE ߘQU$Yc5ށDt;M`or}6yks$eam t &%9}=b Y&N8> ]G6]or]m+1.N[Uz,ր&gDwrKWcKM1/^XSK&%whenH*s`A)/M*4wsZ>IrAy\ @/?Ň=8Ӌw& 3ڣkz !c4^MzEquMhMK^:(w<_Z+>g[:F}CJՄJ* }~u`W#%T1<{fs' &5bO FX%,^iS'4,>eAb%g zn._&[\,zښ›.&`ᆰ8ʹvpu,SQϠ4nWO|׻Hͯ;vR0+e~A tGG>U&v!HmﴄIEE]9E#1֕bJi+{]`7>'h ^c:Y! c݄NBfo:vg9 $PI5͟K(ޓXo5fN9>/+xDz}d^j}ɯJ)z%ɜXvaXKZENgڂAo:i ^{3،] nFd60(} GWdwrY %c/.?i<9ΚϻT?լs4L@.+x l^d~d̨xa8 pr=:'9+A Z7i6)njO2uzP4k][߈Q+.?FWc^McZ͈  Eh]h=`q?K`zm2/\BsK~R&kl,'ѓU!y?`D?Bhn޲q2=L*se \*7W-j{m=B}k*(Ix9s?(eґ8q0XBw`c`_L=l8;J8D|Tx\=ԗ-c5\'E~Z]x>Old`rNb,IO0?$F1Wgw+8B/L]@ ^Ա08~Ӳ0@AQe8aGk'=c"HgWc4^su( ԎruE|ÀEn)J5bW?u,M;+ֈDݎak67q6Rbrg72EƬi*:36>7٠.E㔣7\_ 8Pr(yϽ>oJ5|쌎w\}#B8%coCWfZ\Od5}cЍ= =ʏbm!&:^ψZk7SZLь62)|*̦Q7vqÉƕ?2DqnǙo1>, P@HJxzӬ:u9b Ms$ &~\ Te{I3cS$KaxDl,7݄{hymD>n3%X?1^q\C*]" a~HJɽ/gڴ^[@xCcڻL՛K,ӔO{VO@ #zohYϓܦ(F:Jklؾ0?f#Cx^0 @d{;6zٴř"M7+.@DYu5eH!VV9Rܕ6sH`jB&֚ᘘ5X855,X7=.f֠t ]c)1zZQjv7 /(5kU4ae6:4 ߽r]XmnsZ=Lm°j% LFP ƖdԊo7H02A~l Co =%s5\ٷ!DϷͶ/MG)'*dJ}(SmnR;.ؗO5ꡆȁt8S|;`Ϋ^yՎUj#-G6#XbmGm1ٕ;z׷u!U~I,?B77Ɍ9@װnqȍj`OOG~PS)w\xU7+{)*^HE ~16@] 4:#eM*81H=bǹ=CLxt h&  JK1C,U嚪fZKR&AD@ߐ4yrl"~LORTE/d((I1q uX_A!E `KYeM4ѩ<1ӮJN<\eq$8ѵ䑨R8 9[Z@^ڰD)POZ-)y-%hںs"K㱹Y(AM-F2do`{g^v+$;_A]N@IyŪl&snQӊkUW=08F*]p2M]4CQܗ l6Qp.!|n{Kj<(E0s<4eD, y4M{ױR)4“ts{%+K\yI LHגOsyhᎶiaO jd W@'Zw6gkPIݱhu>-$pNepfUpb4P\#R4+35~7 %76XŊ[#nYW.8 T#)/X[-S|\VWŮq:_~wE/GG8S';o*Vn}m)oD=c\jBt$Z\)~JvciBPÕ}2wT6$eMvRP&yVO&EkJ>q "7fu&껄:Fݿ".=`ou?ò-)S叛i9hdyw`EƒuhA0ƬЦĔ r*ORP"'vfy͆3rPz51u l۾xy3 QДk٧/b%ZK񐀒<\\Kґ;3s2X-[{@lD+,Z& z߅\[N SIXQ=Y|?:0Lp$JaX- vȴuKI&%M~U1 , Y8p8 R{a}C]fqHqTWRKAgQE䞯6\>-QWk m9NZJskQ3V ҄e탓VxfX'a@LG2=)!H*9KΖ<|VG M 2^PX f>616kt>K 2T!js,9$Mz:/ڐ a-4hY.R`O#+j7οbnAl7'G^< {ͮ-1ZliCP<'xE<-$o=i)3*BCYRmPKE k!O6$$>1akWF5ӗ0iqa[fq^Pp7KzYG^XRPZfx=ы eѓ_7FU?"OڄcE)<~U_(?i@zx~}ð~`oF:NC9F4TyUbEK=]NW !rtgzeX ϬfLUd*̮A$/r˯YC goY ]VS#iVG7>HE%  JU>=SC_bÔ1o|";H \avay&x NLyհ5}k -,.g3xj gN=JD.BRM|C1%!Hf4􄎥Ӑ  \ĜdJ>: 4H&e$.2.HPoFI!7?$Twpys}B/%I :ofd%Ʈ8kz3>23Ɋ Uv0!TS^LLʯs_ zA58vW%?EݷMQnƤ1:t @)7Wwa C.k;$| Dl,bm[8U)aJx5prmvp֕sՈQVo0=ƻ[*KJ ؐdkYU^"Eq_vnaQnqP*a/S ״V566<Ⱥ2eUDrYOdgl$b6c&bj l6whH̘x|IaTp5Чy*0㬙'geѾO \'B{oZ42cdADښu*T7.̋cZ ZMt#L ʶVѾF74B;D 4sw1;> 4B5,{<C2B=E#tdKJiUȚz{hs73KRK9Ek&Y)@,;H{J"-dw4ofA4}dt{83JI[Nj#LivzC~} >G LBsTsmZ p˞B|?[k?)l +mPx)J`mvehҖ65@ͣ faJ'lȘ([縟[{>p:Z1%h؊af*契fID8F,'V }V`/2bWg*z1Yd񑷄7jպEȎzMX`$wix,n4:ڌsEWgU<䫨j~]kDr,qeDIb-R'X"@/,TTRmCLCcͨ(Zj4;&!gl׀f?dS|"V$Oƚ)*o W( ) Z^HU:zyVp++Uuk>'VuD#6Nx}J=lKߧ͌$axsȽc(=R:k:*ҪsOmDԠ?hy bS)Iţ9KāyDZ]/EBv fʜ8|0Ӱ!< "egay)JIBF6f~!V~aS46^8Gaì1NA63RIe.Rʯ|e?"TpM Ukk|Nݮ?}ghm G& rĘfJ+c 1%a:&naSiKoϖ &P _`f%;KT~(큈CV\ϦEA\ zɥZðg0uRA@WM`ׄ- 2|sOS0UV̊yėc8\GLQzuLpKǃpl ޘ 1p$&]@~$l*vۍel<۽&o|N[fXIq7`cʳB;stvKۣ=hsTͮ")BC8{$fL&*@6{d;2b5w@bKj.IIwaAʼ4[价a$s@װC۶lu=<)o9 r{`'+&,!cPVC)W/riTcF5Xi*zVh ]$ͯrt.rE4v :v%?ephP`{ $‹4N%%+VuwɈ`VKK1'x=>-G^yM!15!R;p+Ad%WU{}]b)bU*~M\ߢ>rte').vHIm[i$}u/nq$O>/),Ob7aD)6+26ɂ-Q@ &!rK@s3x+g=kǸҭh_?[Z|h\|(u+` Z 8) InP;yN˭lCqֵ$S"1B dp,V #zke=.epc!7! KkT^",.pF%/JHEH/ 1Eo%B{sSCz;uhHJ*6MLlzUƘs#vy6Dl> 8V(;aC{dU?UgW|;wl-,8}jL(J~60kT9=cAEPΘ~^DqHuB|"v;OsCs&xKEMLRjڐeUFr#VMV\,d5*Dx7Z9CYq훚s{$Kգ|@o&NJe"|1y 3*h7cHX 5w5g[L6_L?f36R̘Cl +g=\K9jX3$ѿ?pvс0Y\8b ߌha5<1iFR4T)wdORO\*&zY""@d$9<´Q .r0jT(ۓ aNFӤ3" >B0v\DY=3̚!"qFE2ZꥄO78  `-?N2 IlTaR:x᥂xlS_DbZn G+d-̖#rTm%^0U6r|-q#w̶U/Kya vQObЬLL溈&e؀ tgB;oX+Hs\>4f~oLQ}X`y#o G)A흑v_tyIF_X\qNfDpnpYdH9d_}qS֟N\7gEæ=CD}rп,6O %=7ϔwlHwHz\W7s>br11eZdnc$TL #a_&Xr ,jeEGbRr4D̘HL,-@8sϾ "dԭJ񢡉c8w$je(Nx̽ڗAgM| zeWAɎ|8%K LWT P2i7?ǵq-^lCf{#PvAe -,C\wtjUR]Հ{^jK1ņM_9~{sln[jBFog/nb|gjH<'}h#ђ6ss'@uAQR,3f֜*7*,Mb QO KPˈ}&`} oZ /:zN?6__Z+H@"]%!ԯ&2{QI`Ra8$xgu/6}p L g,qB,(U褴y{=~1uUξ "HH]~  _PC4I0ǧ Ew:/ʊѓ^92Eht9dLZzLqNFt`:-:qwcy1%tc;϶e :a~3ة4D}qܹǂi*ݭ/Rm?⢰moBvXeD(48;$ËY< ]KC崾=\$<$5 Cٖ" ERB7*øFʓЁhc[$Rb5uU7bTid< %j3կTg1%FQ$8q $*ZM]8tR6`ѱluOp7CI6De /^G VFυ.xR 0v@i32[<3zt-Jng: ˲o< Æ8Y/`”?-YPz·NZ,fC"FH[jL1#W v*'PefM6ܒ|'!K8=}YC^bzdc]įu d|O=w:?YŶD䛮0)3oExƘtN()I9 ͯs?S׆n<,PPLI /_h!kcBQ! %PҶ?< = )H,΅M'2zt ^NyZF޲dD ,;vL'Ӥ=,q} hǧV#y-y>͉-ǍX4VuN#JuÐ>eݘZ?8,G.JJBU=y@HnP}׊D\n{i9\lgܴdU@ JK`.] & ~O֍̧ MMw7QDOu<12M:NM/FFN袷r1} gi)g 6Mp~?TW^ d^ Q=e9z?,`M]G`*GZ[ V=)\.h*{ Ji%6;w0T`MYg);b,=dA_=DL=glW_@4:n&f_ʿ Ixax۽8gB7ł0+!&iLQ0gMN !Tm E\0Cڈ󡠖5KEWCdy,=W_5E vw3-{Usnb}7<(;?_ cO:и m %µMM3zg5LNÑ2 ©IὩo)8,ibWn 2݌KH pzDrtX r@i/jdT0%zF9d8. ӱdt|}l-"ԓ5]xUACmmG{Ju .k/?$EnǗaj'<:{hv;/fsm[i.!a =pWbzGCԐ( D=Ůka^av;*0F~ Ct[֌+ HfSpxٵAbdza1a8efr7*!ataŷy4^#,  ~"}B0 7 C8p_)%!2Ws'Y[)y'&P`O; "vDW,!D<[7j]A~uww4zxҦ|OoQ9SgyԆ"\(ȑ:uh/ICjm`C GYk,;}?s37W\ymDV,6 ' %O DV$.4 ;quevl~i.:Ggغr[7)s201Li C#OYgp`+mM=g~ ~ R^ #ܭ],8@s8-}>R&0\sqPezloߤ돴nkW˲T'Ȭo1ȫkۯcV"6S-jG,XQ+puƈvZu40f4آ ZjC?KW9|*t-#:pdqEw|j#{>\[ PEWY!~NX`CK)ƀPs:whG{`;yW2[kTqbnrIbAþ-\eǢm{v\17;VBsRfka9?MT áq=N=uSCeѲoiF>@b'Sݬ8\8x,j-+V&=-HId8Tb$Gn%>i0Ɯey?P#.*:yhOEAą:'oyFpO,)]c]M.14 סg| G 7zIJKIm A#(%g6YEi jyv14\sjL^D_Cra7+B6B4+ʤF*Yzth^!(;*h-TL@s $j PKv/P:lZetp f$߱!l4M: p:M>5A20@BTZlEKRDAN(ӹܐKۧ!.41P[fs7YI '|厑 pus;tkT؛?h0Q.M-cce): G5E G{Uџkb0_`cKtĝ#z}SRiqq)9MӇi#G~z^a ]NJyLO] ?#A&oMv iR-6C{Yh8)ӘL<~Ic3)5NoXFy% }/L8-+^B([/xD8$V5ySg\x#'jgBi1|%i:Ge{>" ~>ĹH; ʓ rm U ay}(xSU%xo3fKGMG_;ә_m~m;"5L!10nIP{2''|pԹV.$TqZⰐlr5tQQڎXĚiD%[|piV\ @C\Q{v1w}k;g8'MV9=DB06tS]ėCW4rԅ8F7%MG}̣W"3KTNh*%n<w劽Vc__`TMk!mVjTӎ)k5CA;Q$/SqVI>@_ԣj"H9EE(|4 Kc򽳣qoIc0*+_l&(;בۢxBQ6U0 O %=|4~`ga9ȗYm 5LrQM=vFͻ6=r /|Qn5 Q^\d<9:# & a=>C8 ΐ^Ȁw7uz33_]zx&aj᳟s) q2lh҉?䓶k9?\ԫGP-B³RAAtV`gY Ol}E*lXk(u5]r$_T,$=& ?YXdYG6aoŎ'cHKWz  ŵFTbZxc9G>}e#,60 >\]`q|g xx z`GTMhtD[ _XǧkJscIۯ} 5ڈCY2;ML\25C^dWJ9|srG+ sBRK3GGU?_rgOJ-yex>84$4^x<65!ju+EI?A3=kt )ٿlvWk//k #@o,P-p3~3yݒ!I| @t tbQ\^V*)q6(L ]󳞅#w񒅧 %rB'MHث6UP9Y# zOsA:z2SM58Kuj HԢ4" ՝0*Jn7 O:50qIijq@\ZzWY1RD|NF/<o)a·J_\dX&N=Wmbt8qƀT*4B"O>e+ D5qFH iej^=-{6ė+UPG;S,ä܊,jj!$1z% -GSYԷgcu3vE,*I }B- B&5 "6#(003D`Rx Ax[W]5 ߔն 4WU~ާUѢ,Hj\0zA26n4SpW&݃CHaiٻ1i+,5]Ew)-`-*.v0j=j8wdClk9Ѩ&B䊡.TPB cP"&^̴`h VC:ݍ(0,djY-"kh:H^d~F N:}'ky8NU2wK!Bŕ TLUaޒ8иk+7BljƄ[^bFzG{mTJ9>D'T'S@jY C{=]s)Z`E%h"_ab޸c>(qnu!h8uhȹ|[v'iwŶR^g DOL*9nM3uBwfFг/ v>fTK^_ҕe6܀6ԟƮ!ZpG;OZS_\y~3UWz\r BhLT{i0-KSy]Zu]mPӠ},J VRݑZ6) WGxVr"Wz pOKgF~{W#͘ ՎBQC#?EHAA]]Ѕ05@%m,5%FZ$[~Snݗ,ZW4Ibוe8IY÷ [ $a1&58mx_QL$Y=%4l]* X7FCc<;ohli]'rKvd9CجC{(o31*A{p7驢IjwwWZ/J܀p.2S9"d|0P'-f 2{ާNC-q)7ȍx^f0k€OS*ٷLî2kX_R^ϭIȥ3q6ph~:R`;,`M2l곚/5<ԥ߻Gls qd6#3;a;vh͒YvaxU NG땟3\-"vյ/gU-}|lQ!79ӦCءy[ϔ{Bfj/!ET $"P}:C~ 5sv{}*4ni+QHw+FB~츟u3kF! aOUJ.ki 6B>/0Jxϛw2wɦrX,1hwDd$iA>W.:ڱ3#b_'І? t˃.j q/9nf'}3Njo} Su]T;ӣ0JTjT]lG77![ 6jk8~uHAW½q߮^\4 INJJXudHw{ԏCB'4Ks؉DS9+@tvGY$y1 b5|fys돐n o+/Ʀ} )n5!hG&eSӧy@eLm0 +Ym3 lNj3^T _ *˭+LfFAgC16sA!ğ몱]3¸!#{c6W\-M'hy9E X'\HB\fi`$0~i BsNo2᭨ g.4@@1kAArƕ-'*qf\Pj9>u!" -ivᙥcR-Cƿ\̣TLfT8І#|uH}:_uD8({.&%}P>VX:T2 x]xeg08=|^e_Ǭȧ3KIƒY=Qe\49Ŀ % zW9oHX9-U8f41%tV 8Pjii.-8F ZCgjPci|_sCr{qQ& w`&IVC\S3xDc~bAU+%O }Bϐ (OA(= dc|tx0zB('0eˆDj4jUFror `/K~&3nQuwp4,zghT)!NMh;oBt:jA[d,H %-;04 Ƽ bpΦPޓ}Pl6"@yE8 8_Mj87&8q9 8%hg!=*gg G'=@S adݷumG2Ղ/ bmŸT(&jZчH"Uⱍy) /8T鱦uA* t~Z':A$J/G:N ֟*238:+Vg*?櫚l!;df&pI( ,+R*AFGʂ9!}.9%dXhr{M:r+[|bxRi<,G GOhWx) Qs'H~TY%'{h?P#2+n- ۣHTy KBFRs/V`n$ej L␄uϮ :嬊-18T~' R1%rWGS4 Be &Pc eiƣD>>9 ΧT QMzТ8DZ⇔1"I#M-h`;4*̌y:mϭEiwuN~"xLZ&n&)=qGbc(]ES˵ '.Wpw , *b+Xyw 'b$/[WBs| 'pt~$9]UYaG8& HajA5u#ps*A!qj;ܰ%*a #(9暻e8EJp.9p`0L3ZsVf3:x!i 0`AQeu_)25<ÞY7+Mr" s 7(]ƒ#FSjE(1\&'Ziď('8 ].44~Φ?|a%S:L\:K"g ݽJsUdjP+Ho}K.ޒ+}rGш{ܼ_ ہcvaf4qbpnK *Ee~L|JC}P_琔 2bR+5``wz/D̺=_zxP; 󁱇uE]/m//$/Rbu?yTd +_dn. $9l׎A<]_f>< :\WgHZ7?ؽkS|Xds\iW DpL|;֯(Ur%} k]YzbލρojJΏ虯6j*,㲱?Uee#--d,@/y;5m|?I珜yB\u6w`h<0߾5EzDZ/a¢Y\ױUFG> mֳEX"f#5% nI<c4f"O())  z{1%`݊o'!N m?%GkGOHjzd-6iő$%AWHp ȧ5^O&xB>Ԋž[Pn AAfS4h|o9jJHJ7LUJf&6dKrrBP"@y|YBt1B(j:jT|Wk?d:В8-vB% `%-|D Nm^dIC+sk]`D H'?]cR%w+BC D\( ƋEV TY#q82`Qgg]4Hf:c+y{7ed1ԲE➒+ L \ʁC,Ρ`\Z@7 \n{+K@hOBF5rC p3H+GpN>ЇPR*Iq]k**?RR4SoFƴ"F+@dV1ڗį)Z9N8^݊|dZٲFMxYmz^BII (z>Dخ +2Z?Q5জ㘎ƷKa!O{mIPM~m xS ## qg^V.I+_Cj(rVVZ  }Hon02 [}b{-C(c^r7~7W=xA27(/wz~4fNkؾiZ/-{$7P{xSZIֈxo1 HZ g菆mysdz45p86ѾV|i9 뼟 O83aK<#o9¢oJ. ̮#HդS,3]H>ƃd/E}hM" h>9^D+סJQ4`>6bqfU(#ĕxq4&{?)BV.3wMlT<!]6Frkh jHN+`#FixNaaxDig-tsބ.8"4o BZڿ@} [ȞfqE@y3#UJ^IZ4ytL^tAtNHRBYQCoTuQW38dx^u>(3UC{{u$izЋ=q)[r7ISZ\pX*Y$ҥ*rr |D{[X+gJbuwOv^):P%$͗T' #-Fr.@ʯ䆓(BnT6fPO`Krh 5Eo߃lHZQaۡPiLБ>:|NH3]~wKGM钭_s79D(KhH+ fw#KApt17<+t c Ibqzeu 'vVm@Q˽SgV1/Ibx@_dYU&l{a_yfS a[0?6J${q8v lo_ = iXYô $.kJm@:&AP kXwy6顄oHÙ+>޵fatc<-'޲mDj. T @J[(PiǒIU?(EjOV$ ČXjI9j%z|.ncv~mMh7g.AgX2 pś8*ҵZgMѶ]Ξ|WISSdh8,7w6oWV%Ƭ@FJiRޠmU69H1γN0XY 0쏟m17^v]Ua$ E.!zvgqѴR_y HZɛ!ƄgE!C(E6E9%,@>Y_WSc&q)7[r"ludCG:óDk̗k=Ӹ!J"Z/ucmBgM#y0ڪ=CٌdO*Wms@:'fƉ~>^v3sq)$*Uh7$|PQu,xB7LXV%V-ciBжeXf.ږ`Wt,[7\>E[fd %PLHؐi:iD.4k}UcHҡI~* `s˘}]*֙ ffurAVA1߈OXSd9kNU$}~!>m̼]8Nojؔ#ҺaOMjYlҵS1+: pTX9aZ5*fM4aTdH pa1Mcy205YDKgdqp#\ݑ5, ls`bڽ/&Iwk y& 3z BʶR?VS(zKb]Y$s]Y@x4 8LN3Bgݬ'L y Zh]`H@}'('tF]a&?˧*Gby?}%\dR?x#31C!h,4g?|bjXz6V~cE&Am ˤ19Ϧw?"(q*ڔ@jtMO4WyմZ:|g,KEsĎL?E k psG@AbQ^Pe4ԭ^.ĘݮM=#Პ bJBu@B URy#d'Y= UK({vl=YoM][ "pV)6tZF%6# h# v˄IM% abc=MzuCqjmVE rxqfEah۠a{٠I~GAZ0!q +?[5p&H1; (hjP hymO42Q.D<Ӄb/cY|^,bJ8>%VAsKhevN`M/*̉;H^%WbH [E:G1x5V-ջ0?&Črzq 0j?3>AxoK3j-FmExxUƅpiiV"aKpꌄ]Đ,st]O|Aۖ&hڋ wV_|zIs6~ 0uLТㅿ>-WK$4<.7`olzQ~΄h~B'*Q+ArraRNWJ"O~޿I$ +$U!P2LD0on/krr $᭨RZ[,{XiHܧR }L[~ )rl@ALT]CK4ZVKnN!Qѥ95 ze,Hr;x6ؔK`Yq)O8*k cy6(TThh}Vac}bU%Bf9_ >]6Tl݄&!1=6v! 5MAYJsz$k 8? !͇݈uUF g`<t\ &Ui!*i"VϚ(/L&Bk)wg;.B{L:\Lp4K8hLaj QM# ";N$~ڴ7^'nGDz Ic!L$.2ai02 @ >}@tۺ vY+BjbQ_N_Svyј nEPm!svn1X;(ƒ&ZxOBhx 6bBD`o"``CdiFmA Lһ"$Ob&{m'mz-W}j| Io]cxUrȎ$%i߮UD譤W#lm7-9խd]^kmrO¤kzyr@)ۨӽاjS0PV/%ݙ /a$X-CR}~ = h+ug6Ey(1^Y{梂e͕fœGNf{:Pwuav#D;R\ ŬLV2;1,]^)֘@VY2i;ͽ+&{Ra C'֮O !Ŏw#W1|k3sk>ecU^E:Dп&b5ϳJ<3UY^ (9wxt8 _u+AJ4,<k߰Q=$BXG 4+T;T[a\XVe )wpd]ǼcQϣ~q::VO64W{9&_v3T[(Ȧw x#FNIfe0a<'m(`Nz8;GPM4vPyxI)#p8(xk dX/BcY+t[5#.Lz+g r` wE/j0GZQ Bt1 ϱ,)Lx` 2GP$75TwTZsUjАֆٓ CO?cV[g>Qi:sM.y\oVeQPqdd-_&B`Dԁ-کѩ0&}%%PV;ޗ!txdTT܍dYVKiza=]@>hxG";uX|?`JaM]%;qaR\vWF}8#2l H.WQ_ZlKħV Jڌ e$]hzI  m(啔we@k'!ry Kf@V\h }:eAkF уq#_8:(RVhi8-g^9j$?<,jks+yEtBհmWR?ƕ $u|)dud9͑omO];Ts88 +͚W dS5HʆjQ5+"|짇ő`P*`~e UEAlZxnWm }ޤ>9NTbG(9o:F*sV VzWC06E1ugj Q WZQ%.JscܢShg?@Dm(layэ 9jgAfC2FkySQۿ9D~U"+],:O^(?ߚ W=NG7;2Ȭ&cS=Lb}eҰ;0nzl*rN|oix[z$79n>=+(d4Cazhm>t0 %\͸#»ߨ}2#@${lA-ۙ>Iq7vX^{N`4.CzjTn yhY$o?7G UjڊP"w3Ty%LoZVa@Ju{ԫM@&;8Kt6" `7rz 2 ԋeJwĉi U;f>{gdZl*$#pcCP]^C&  c˦,l^*{jǍ&ApȜ&R1diӹ>k%|Nv<׶&%w_N (:E>*N;VbITNDc2xS!QtͱNn/vp}p^^0EKn]<ΰt\16<.+EQz$2*=4}쿵4eRj]MYvê&HV)ZMzkVbÒ 13,Kڛd싪ib|=h9Q# "@>ȫޒst%5M|>Oe.?B( <jITՃW2cg=uJC3A%.A kV ӯ}Uҗ4֘ qJ>845o0⵪-T+jnf.*1fV/Cy4d_!͸Ej˒^o} r߂іHdf^\E;Y vIZ)UA Sq6oʾCϐoUzxy)@`=(/u8=, |}# W+kSBŤm/[|7[t.ЫT^hgX^* ޮRB~&Ȗk^!u>wf?[ ewEЄ,P+B4)46)b0噑ő藉j̄hS)H2{-MIT\3j#p[ƙ+-i&p#,^Ӆ԰Ӳ}&]֒0Vqw%YI!WvՉ/CRS{_Ͱ!"9>°#Ky,͑&wq$jډhZgpA8CnF3Ye}Gӛ0RVr^ȜcЛG딉~Hq0ЂίIT5Y! SNxZx~VLVOk{QyՉOUrǒHBh3ʍ'KxL*Ep1]Z pGRt#_KZ iMOpzR%/Q7 jgYJB”0Y-ꟊlw`~g6~=E=4ϩ^ii԰}I9i(w|RDvTdbķFmJ|V,u/' X- 0K&Bq hX׽!ȸn[I<\/ex ts lZfs, N85Q:1r1AO~k.զ}f7zŞZhlxEcy) [Ap;mKKp%}ǵ8$zXzNE { %>Pn<Zgg֮ >5~|!L%k_uwoj)V%)sM4#T{tW |V  հi8#r15ìU zDDXy6١KVoa4>@W _xeE:P ,:' An)TD}B Dw F+lf"Pz2#2+_uSh{!ʇlna!$2`jޓv4fٕOcԞ(fYvY9?']>YJ 0=S=U@ , x 6)q÷)Y62!gRh>ga?ʡ2[Ew3ȅh.Bu/c)i78 Dvg~0c>j#&9XbRvv:/hjMEHAcS C1X+Is~y'w8ˡBW|&* \{QE:%7L)!ȻMzD\ɠz<7?J>s/¿Rk@_VWJy5A, N hRzq諺BD3Q`şܝ 'jrK1kYl̖*n!ƨLjy&  oS#=m"sn_U0 kE*ɧg;LKK02oϼ8~8ʳv@?Xf0{*D⯺w3yXfISU_w&d"ivxlxn؈}LAΈI:j4,Q:;ϻZm |!gJlZ*L;>sԁR/OFZf2x`-iKN,{[x^4?|o|\ LvYS?s}%d>Im,2a3qQgW` ;X"\rYSdxdYz $G_C0{5"ߐ Pyb5^"Pg"V1Wq -++îhbϳ{;KtJUZm4Voԣ=B-DÃdٓuHȤdxvZtY"'}4/ _.F Wa*0޷݋bQ :ˡd FGqn|'zW/UeUa Vz˦0JW8h<),O^F "5HOkNB);"dy%o j&yYâ ,4rL,{ WG ,0siA .CSEWa#jL-Y˼j)ZtĖѰ>掁s.\?Kx-B6)ZO36!# }c=g g! g,4LȮLJU\.f7#޲C䥏6=9/. 4{UCZq<9gsSמfvcLnBy st/'"\`lOs͝'Q,KGcZzIrQIk0kV! I%#cs 2EgU__P yi޼Y=Sqɱ)/h!{VuF|k!EǦ Wٻhz% Q6cEssY=&r( r0?y0s=e<)|Γ1)gHCW0# -3 vbRZZM7ɮs*\5bIU^I'8t @™;D̺2;)XeS7:ݚšjWOޡܜ'wGn֮_ 99Orvhkbp/E{⦣HΌL+ZB`#1loxHq<u":ű3X5>wCv: L ΌFs`6!;83"z=3Ox")I7P64e"(LBCf :y0΄iEC"(6($UA*mޟ†@* @*ί9-'l;;luC|@ȼy2C&I"?A@I##U%=$"<  mЏb=G]>m{hcag9dgG1, Cv^bV\y0Lڹ0ayPY.Oد[Mm.W˝|.q߶`b*o V2؛-9E1Vd 6d-n$ȵ:ycq0w(?n%)vC8-*\w;RO^RM[uYjZH|a.,Jr&YvQI.zRW^2L܅n68w c JK1A1V(c9J@[Xa$.'TZ/±}M6}NF\@0إ;bAuNhaL2cNJRbDh oJnڷsʁݐKtżzFcoer>b%tByGb s=F(OTUG6rJ01b&!mln8fCD*U.NW? YW ?eL |%K=жa 2G񬎭E gD Do.޼GЏɳ:: j5Y2VLS X!祯' [k""LD.`܌Y}~As33[,լq}(lzv[RXV ɁevJZ&N('|SCè[ sSDi qv(kd]^fC-v h2fM?TFM %cw.2P:(b1!dBdÊa:mnğhB?@`miʚHSĒ7< D0p3(wLпts+?ӓ$lK Ӵ9㤯Uϲ8gB*p\UCJ˰p&96-idNrx]ǓC.<ǼGMߣV(.iu|GfXWѦlj3iN'Ih/19Ӭt9%OpfsΥCuVMDk~#qyT[h vVuA5wvQXK\ǶV 2i캄QWˠr623p^ULc'Lw@ۺl6t̫ybJoAxtJw?/ݲsuV H:ȸEJ1S,W)Xӏ{S'2qVMb8>Hۇ5ykITer VU3{@ &ޏhz iX{fG{ Rr>q겣uLROY8roCq*YJ3d͆~_"Wj^޸X5JHtbaTc 07{>fNj[h ~*e6cQQ.ua nIF'Gr_N̒Lkۂ]jO;5c=H-\3p3@J0M?a"}}ƹ҃9&8B H{.Wv(RK'l :229pi.K'\G? q/nvR%bIg/z{ܓIc|a_ P Bf a""nM:!Qܧa"`COHxe%󖊴*$ƺo.EEai[$82. 6~|]w;Rh۱قD23,vݝ{v1C%[r( g?+UiBV>0XvWr0=&X7ċ7iLQ)`V!{⪫0 ,Z9sv#oRrIAH`Τl>(\85˲J6+Ls&!?)eZ@K:iSM?4#IݎP Ė]Fǭ`n7I~<[tCY69bakF4ծX X8܇4i&ǥS$ʛocKrk\ց=.tyC9 ĸ&]n..o]ET)c:',bx:Ř%v+$ CjƉEƁn`hpiJx_k>խ9Ӎmyy32H,r5Ef{G:r5PLzBZGcf?PIZv\;l*ے/&ҹ -?Tnܗ㰩ļ69j;n/dJ~{GffVmb0o< | 0S=4 9~^ U[9(=C!~sy)[Epg3Ȫ{,H*M5vZsӪjڨĺ9X.[w6Q);"vߥ8S–'g& J0d #T֤?^{c۱f,"y( AbˉrvQ3Qw,:Z֔L- Tv⺃qvgS(O,m.8*&"Q6D:Xnk$GN2Hί@iE=k7n6S>_Zqw *Y .3H8izDC_;&Iǩi D9S h#PWjB]򮜅iT 6&%m[H1SCGCIH 6MYVJ9gw]KUbRse/{Rk';.+_P|tHmo)Z8MFΟ5r/5aZ}c<*aE h_ĝaB-m{x{hb݌DYaf^$uRP e.{C+ \NKBe F[ }{e.(G6w!nėLlݣ\3zK ⵆp!PӏdӮ{ C2/nsK>L t5MGw7>ؽ^=uKPJ be>}O+T*VRQHC3*-#4;I83DTvr#Uf9*+A !$+2ѳ n?& l,ϲ \E['i)@N4W93:E[OG@"9R yKS≖flL!*xȃ$HH}.W_3,;"Ri|[$26gҏN(˞gD} Gڕ,`k9Kl;.Ӗ蜞k^0˥Xm =x̐MޛcN >_׬8]DDnQUSr)w GeHNOw)th26̺0X1>2Bҙʔbs@HLn$61fOV݋}1άW}!5,XNR@ih k)#qZIy-V)p @Fm5bNx(꺭kWC+3"m>5uYPJ??UbrPPse ,GȾw*Wf}Č/FLo<71YLj!`FUXCoxડ L {aB;!͊UYpp8o^ΫZ(XbYx]9h6[$X}ΓE9W,J҉eE2RVԁ$v}w>~Vƣ.Xg[R7scMl5jqx0,56ϝŘx[mѝKApYvj?h^7%J2?.XN.A po=?[H9;x.C!kd\=Cq ePYJD°<83[ek*9gg#Wk _Mcw\,U o[ +O%QVQs lk]V_poS# <V]( $t ^V`.o?V*Sďs|kQgұ!&+./ReQxG.(^QRxȱ 4{Q{=RƂ7XH6;fV#X#N; UN͑, LPP DveS1qGskK|q="#G(?<4hl@Le7ɻ␘?7 :))#Pf}PR >[0vͿ%MHH{zj')t ?^C;)Zn::ZYr=X_xlgaݓn>UEE/;hC%--UOFgx\ =3]ا8Ź7i+~Zo{b79- 0YQԲq*'wWz& 3 M]"7jEwy oH~҅@c1Xfy-2]- KD %I.ؑRqKN[k4H1L ١J;#T>KyFu~ =~Y>$ >Ҭ"IL=p u4>~1(o!0&6S!u Z2N~Y9s<<\PwdCrA lSbj6zNl< u24' a{ (K$opG'WYC?V)CxWC]Y-ШNX(1[v2=sWggR>KHau9Av6..=5:]:YӽO H{s-m WzAnJ5ZõI1kIYr1:oG)ϳR5ƗG'Gu{[T#殟3@F̈́J/o^%KcXN> fgv47$O e<ʰ\WO{ a(q%ypFKG̪59Y~`G S}SUdF+lf5J1ah=֌SfMnPŔXtO8;Ovؓlf&X xfSH )>Y]èA̦Bѥ.zaZ2;mZ|$r7Ef\hL${b-L8TE1{8}у3JVgPҾ~^j=.&^Xۖ|5)i]~&-G U~ą<蚲-A#{',RQN"1e9C4Aðqݛ#Fܮ)겊6/0y-)79H'd% ^;)ޞIQ#JzQg0[q"OO s.{W֫R6|q' S&yjQ]/c+S9$e);o߅7+VGbY}#Z=j6hXBCs[^!06fU7? ΅+e8De,Ӣ]sGk876lc֧|~VB#$.2snnz˨;_RִaLF!bYHDA5$D5- tj#]TN:)9K7L혖 Z%5u2 zϒ `37|eRq~9_OCMgs]2$7{"q+D勢U1e/x:IQ}3)-NxzGϧ|3X+Qa%V(2BVM.JE,gul"%fjydЄtmG96:Pr$UN-Tf| c+ dѼa),Aͼn;~bƍz9\ƍY xBed].3%YPa\(Ao½XvtPԿe9U*#!kCdo<1rJ$ةҬV MPvlY^;j=U&U㞺' F.N B-4>% Z2T̆n&ܩӿXCGW6O db!)'牏-I9_m-CCcc21X:5~'C{ b8me\ ,O{>.~ŭͮCX#wIuP7$@ܛ}".q Ȱ+?hM;-h#d&n\;Qe}(z!N0h7 t[@û?hGPXh 6±CB8H\vV{wC=?u3XEe)A=vkR7"0 R{{cI.l) Sm28r$2x4:3J]Oޝ?&?oB%;7L̉ <. նܮ@h͜Ѥs X8iJ^WФqP;~ U3O ?=׷]SH{Y~=NޭSVQX'!hMFPVD3-(powgOVoz,{ }a;Q_]Տ1ɸ88"uQ㦼tL{@RS;!2i a9[i4n2I{}_ s+>;Dl/?[UH@&4 /],m|8 E?$ӯ!S7C.;:=" yV냪\_ʼnwp.7vk(' ΣVRMJ㍢B:z.Tjihm%"A~ѥ< 3*6иJf'+}/Κ:2;6E#ҸA]QۨBxUy׭)i%A6M>#enT 1ȾO+ݤ“H拑[80{{Ad&$-\Ov>1*li`:.\RU02b_Hf>606|/duRͲ%`L7+Aѭh՘C@iW |Fw)OHp ;MB i?Gz)mN!g@:uU]3ɼGGuEATc{g*~Z:kN\IU@>e_(l5 E S dUX"cC(.xzgKN߷e{Gz^9v : `\I*Ӟ73KQc8*qxS"PZBf:\A EMA\7ddqL3GDPmH~GmWIBIN' (#AH,?Bfc4WdN%ʺ粼tsY{un|f^CʧyK#$|cIƩkJMwń>rcf'z+S`sf+xl] >m,HjYX&i7׺l4p tunV?^Эrki\,Ȳg蛔C/#\G1Q?"'^&;qut!:+b=8}v i1-,k9k`#F˂52 lfN@Oܘm(lT\:9"HG5:aǘR{cuuq!nX3J] ^q&]n!w_TL:찔*ѤR-V>.eNmku z1*A{)dzEƙl$j~~Xs>Ltiyg+׳ LͷSo!w2Txk[@yM,*E8ARRa;K}w`S DJG2 TC i2K4\g*`7d6aMM*õݴ6)ev0VkRiiw-ÐF!FS+(DZ\rR (#_!ぷ,# +m=_t|'n'!خ]eH9Fd0V5[<9츌\ݧrN -X5wi<-6w¬1yD_ĊQWOi *P%6o#DrqϜD36p1z rAɍn>Jnf6"*CQ3̦1ݨ $go}s.? $VُVQpղ i=h 蔫Z-8& R ZXnAW#;k!`9!K|wOpEBp@K#%A WS=/VMWqx,6 }JaWOx.$R>t1i܋՗eaHr /^G:8@f+#u قj4U|=KQ~a{YlشA G K"y R<{<F| a$Yל>pE#7ÎC;E`FrR_ɟqߋ0]E&~Op)8,r/5W#Խ <>ߠ`; &z{ud񣾧 9MNuU7Pԃτ[Kx Gz1 PPF4H 0cf&o;@(io;^* Q7c?z#>mCYRP%??Yy;`uoVѩUw)W a_{Jܴ f>J:4|^k̏|$$H{wV`#U23n'f" nGQCA$Ƒ*S?5_?Jht>*⽓:d8~(P[&eMfqyлG1QRF!/SD0Ȼ-A %+%~2! Z^N>ožol%^8h_ɻgA}a =-)%0 s`ɭąٱG2 b36һ.2F_3BCe;^U/*duJjO+@gug!uԵ-cs%C'!iLn=%Fnſ-sjgᗆ69Oc#HwV}+p$qnB3L)2?Q!^0=0ߕh(R 5'̋r A.F\ 9-rBLvVeDweJfIeH?x:WTߒw#{cp Gk̔FP7 6gTQ .USS- `)uXy W7M)+NqJppWEZ1kPy {R gפQ 8C (.Ϥ8ݖ$mDwHxB"T핣νxf6IVL}M k-y=W$gGN $xn3P\y1!_|fhiNv@XvG(ȃUO|P~j9\3Kv$ȡG7/NIY xy[ |ɲZ&aX3XNiF2cT+˪:3PBA[tE9-"W&Ov_+B\~ƲE Es'Ԕ;"OpL }ZSݦ7.\lÛ E|1ءRrtGLkU\dM )/ d7amfDŽꊟ!xEuNĢl6L'>r@_r` ALJ}iI.nWDC:"{uÁCB8U֓R`9 VdT~ErLcUF<*aԖ J mKYp4G!j,*B[T>6AK˿`e\Q7hVo^s=*mHY(0%N DȬJy0i4Z̲HV ~N?avRz1b8m@e9 Q.أ$ܪoхsfI[R*7z23 ?_Nxa*"o1-n4eZ`V/+;%&RH?1*V `|K')deZϫacO iX/ lI-@3#l&Aq)?I2!7b 3ŕgL=9M:4L ' s[^N mhsf!` dGrc׍gvG囅Ӡ5BKQw?r0r9dJ혋;g]ơ1[{>\ٱ^}ιLȳX_oE@p 7g^C<1y&k2.'X'OHЪ|}oh8yb}z(l'bb V nTK&2|YjI˘G:_M;&PGuiWԾ"f|KAd.OLhH4*F E|!rL8?nP>zU l͉-ֵuSmwM"V=7G7|_<QҚ_OQW!®qOoԭ|CR4ABh'4jao'yxVKT ۸.P~ 9/ctUoq:3O)7toa}*nZ ^!@fRtۛndm^qaʣ (:`dB r$Q%.N%õxv6GP2%BsgB׮uR͔z >ؑ4v3U0Doe &|ͦNMA)0R/h+ U|2"Ɲ J Aר2R2$A>:jL4bBz&?#=DZ*9n0ӵ(lhYz:X g b}…I#Amc (b!g)HA /u%aD wmyY`󽟥rpBz [ Ϯ+V! /Ҁ>zSa`O»Hlg'&hVv3A)B6QnBS?~(Z^n1I Y*?+ŞoK|s`΄(a0%A`/,tCvzP>1b| !.64LY8$kbTswۇK\[6`Q i״/*$SH\|G) {jW+Ā=EPM}r8bqL<_G X[ uc9p3,ҵ.R; ƋU AX^fSZg$peR+1@6S"֘mtG1 nߊTl!QXm2k HU`j8 ž| :#t:ὀ""2'z HkN-Qmc-҉HAa|JӺ9v1fl{ [-_N +\׆)ueGUG { /ιpUjG=\BO":Qd??v1,tDK4uX7HaGMc7s]M jv i RN?e32 6$]YXDS ,h 9.@4%ÐCi|b a@ d'r49- l /v4AMe\+"3Fx2ڛ`oV'(T󰁪@UQ[Z^Z-yK-) s{v47@cX:Zs939*|Ywk8b)GaI&ϟUQ`.!`!&)%8,%*-(p-gm-W E*,~^926fw׼qyT/SiU*xgn>O-$-'}!P5lLu f\l )dۮzm w+[pL, u^'gI^Ð_.CU=`Sjjo~N蟖0JDWb-F!~)sA@^a,hCƃl᜻oTA*h9ѫOyO+6,5=<٩ԌR;Uf[d߻y1N]G*L5!v8 DxCdIwt&SU'4V iB)[aWRBșrw|V- :_gb hj[[?m@vHYSu(܁[qbw8;RfZdfLG;]Rkr&5{9fwT.5ȅԪlH,͛`Q%|.SMh+`~co"]j쮎p(qm W.e9SҦi.&}#xhnPEߏ[B@'!,ϡySB 2vv0R2Cr4^ЌSJ}-ɸ -Zts 6@:Xo4#-aVڊr ғ ;oEy bdPyB5ʊX!lMd JnHBJGoS\m$v5i̯:n/00 ^ř_rԩ6[a.tꮈ+6I&+Tx{ $엻2] U۬ NE͐iɢ`P_I:h2xsvd`C9lD6Emh9DTjăwHlYB /Cjo gT"b:2z#kd5ezsS:,ܞ;W˹RS9qjVֱ;``IQOH1@ 店:fZn8!P?`w1J~)ۺPg;<>%8j /=EC6 5$n:l5g%xWOioifAq*0bAk+K6xWBc$<Ø7/*kh,kX[Hy0t |vOrq(db^ ֔C3:1 Ց,>i}? _k6#b; 4,9W{7/2UDž"e/yg]͡aDQ'`/5`v8Xao m,6RGMqZ#ݛ0NM\#YqHqdtŬs˃C#n<6(AUHJޖ~:a/̼'R_` V!Hz3inW} !@ (6R.,9wE7г^nU!*?Yam Ni#;(XqtICKa>軅 EAKL@L;ڝdqH8ڦ[GSAQ70h˶Eywl^1M̨c:L(sw@,-X{.R/-[ؽQgWڕ0~a˜b\aҡʶӜ} Y%?=c?yTʂ"=qԞUg yw}~ӛhJgf[e[wtQU!<{>H ǰ?ijџ@u 2:VE31 Y+E*Vs>=F_xꌖm$C$Xd g?1*SyG} ek|-,L ,>̋s`跾H\a rDEB͂*QBV|æ9޸-tnm %ͧvQ@"P&mB/I[:>RsR$Kk ?ݫ$#:G<2@bh( c>co5{a)kiS/j+#ZO48~S6bpBn?*TDގ^{4Y̾B!3jĝ~z":qnE ^1b6\Zman6p5;1^["m" b #J_1 qT8|9zzeW×2դ0.T_3}oM>Ft x(f' , F:bkRILE.yn<kP]Yau*JkPW"Βl{51&H(ղ/\wg>ۃ3,'Ǟpn+R!^8>[cfv4_4 &z;gH|K7==׌<: 8^.щ@,^vk iV~fPLVmM?%P$EIu %?6-Y_ν%kZ7}#; Ԓ I}>uF 6S`~!vmyz7zǜ 8laÔ5r"_E;oy7KtԸH7c!u#_0./j`U=? Z_vsT~&O,2$2MYJX wCRQ8GCYe]/Q$F#6rMKov[T ݺLj~o 19YJ>Cl]հTAr蒡@4n:6kS@Jw¹l`/VYAhKS%USκI{7bXۯ3b_{D، ïl3裚`<>_5#hYڻuH,|4 ,U\#:z+U`:l3s;K3ߣꬑfezJ ]éǩP u\>1cFd1m$nOX,)aU0sC?΍Gpk/>|5Is`WbL-0>dISn3`w£Xz+9<Ō`]hNF}[Řv}\:j=6Pza'<%g]y{5Kĵ0O` ǘ,%'K%xV Zn~t|U7(ˈY00VT<>s<ޤ?p< z¡JMC 2=^$%oK紌?| CQ廥##V"Z܄N&3ɢ03p]n͵W HQvη\Wd8k6` Ү%tGfL>p_T4F8<0[5[_ ͤ? -RuƧ;ҒmS2tEYM>{n?tvxӽNI AJ'ٹ𚋈dp g՝vr8PЙ5Xx2͒ZMG=nWuToYC q #I  }. CyQ>Bʔg!ni-Sw֙xWC!J.f|NdݪT+JfZa Sݰ |[ >/97ԔW/XX ı\uL.cQ} cr>mSV81ne##H29[ZoVD>w5Ka=_ oLA ɚwj2Apԫ65LaYyQ)nCt[# ^Gᓷn`tbK.}vvsgEoϛ;Íz%$($I2(^j2ydG5jj;Qa<4%C2L s.,T.xS2}År_ЅCkv3\4BBLHA@K̡E8Cdk3Nl1]7kjD7hC꘹;/U;U n&#$o{"qhwܾvͦwNraU*wuHL/$@Þx#0\~L߹t<)'b#u_#5_difuT;e464\?5Ɓ10Mؕ$)$I-k-FX֚8Sy]\SX&3)a ;[`>ju0BN1y`Ғ+P@B&5XxS ?&3PahC9_ v!# \(Aᗙ pV|=|σVm)Z86r^ZrT%Q^C8[FKbfaptIY3_>,1 v!% _ůg,) FFipU\*]|Y< Glo"$$}yb Ql8;4IF)Ncf4-M܀Cg YW=fTYD co˧ޥSfpWz%X CrnC{Z KȓY]Jex|}t u0ȏk?d븞b2Dҏ~Pr\ԑ) #MKDOѨA~vB"qh]0'H[qu V7ᇾM j7}z1ya쏷}XS nw/7x-~t1JMw„jlƉ3*qk}?ѥv?*Ku (Dxfj\9*ru*C©w i÷~;Amq{(ۄbIX(KocxbG"M}9+UtsY@ .[qDDkJ厱jrdF|WzI\/6V 1N@n y,`:sY{kAt!D2n’(3*a#GA*tIYA-LjdAq*m3R`1ҨgzŞ1Ⰴ<{w^-Pi0x]LٶRp,ZD\DzbBaۘ&oa͊9%̐Z;Uī[oq2!U|Imy[FAGruObC?I(wNzG "hyC7UX`̓[==SCYuIjRNINLy6&t ظ@-% OaDWv,0*EQ>2EbU#MOc[l1)-#QֆGh QÈN_рs^Ô"tNhT@RοqS  +jnRlX$Mq~Y\ k pXӊDG9D ~T).JƠp7&տz :)L!$r8"eשhPܴ$T񘗕;j0.;) n w\8I 6!SImV9wH?AlVtϿʭu=DˏyO86Jr0,^Chp JsE\\FtyNT>B㰠G_BI3X1>}4w:)}*6llTJyeFقh̽eq:0OgáUuHEReGOqޟ:U/7?-ExM_<Ңi#kЎep {@i@bj0p<8E6ڿb9W$)9};7K2fЉw@. +vn]>{ݽ`džGƀZ#hZD-iGp_[e 꾞pފv"`g7:!e/Post҃y3v)749r[`5>jK Z gwˇe\KYh? ?=LHnmoHGn4|F 5 "j9B\ό;qHٞ%*kx`'r͹-j45%uAX,cQHEܳѤ7=Bjj6 ung_)O(]ot87J:6O/H[r=&TPFɺM 6`> q<Ts:lds̸[O+4᪮Zwa" \jwƁr>Nls߄ *rI,CBqCCupjZ?C&5)g4ʕ2oN#Q %^ıLu訹nbw9\& \O x}Xs^kle@W>] fRE0 uݐg !FK/ 5C6JZ%D :JTh4*#b%9t @r@}+- n>Aj7 ZۢflSɃ=;@/>h'H->-5AnoB`Haq=4qdU $;薬u-Ʌ9UL~df7B֑}dǟGt.㶠FF՞#q>ʌ]»em‡SA^K 07<s #\d)!.=}3֟(!%:$!]-0ÿU'G< vs',eoie۸,.zKlB[dj#G{Y=MϷWD#0pC]%mSȌV*Dj?W SFVbQ)>$#?%spȓyT48`3&8p^uA&W噗.ȊњalaϺ#Sa3`mQ: 5mWf_:p+:n֬<W攁hYQ.͕AzO\3c̻4K]s;9J:itxSU\p͹p` fqn\}<{Y~7~im_ܹMyŔUhv y4PjiΉW˙tM#OԤ(ZKWYYlaM8^k1R[*aGw,nzɻ0oLMn{dWM(䰲 s?{:q̵8~i/haiy'),:I}\ :;8p",ԲJLR ҰOSO}%&$h[R.hRP30_%TdeJi,gUYkXuP"Ѝ&Ɩ8"qMh;vL(>Nr.pyh%.XqqEH4l>6-kf?=ZA7 q15PP|r?^3Y4*]Y+sy+E b'k2 PVJLGpBmq = $|T~LQCl}Lvy,xLc@^!2ߧ7[<.BWJl!8>tGJHu@xC if<"Vsoɫl{K/\=mQDV/pGwWqvb^ս[, HM.y`C2!E*M9RWizݧk̥ftK 0Hcch`r`#*}|pco;mYZFRLomXd-ҌOllvqP5~&c+vSmQNJSz!~ӥr hBغ$o oCY4w?0^тy4a:jD˲lQiR3X=|UR82ZݔXj`׍>$ӆmRKYaٯ򈒽t;+o5ax3?l50޵WŮGA@sHZ>bLB ˻G@3LZ~rީ͙ܧk DօB&4es/E+F|$ b!Uhm$ED AҨCY7X"KL]MAMBK H Ahi(lɝPA3iJZfz1*|>8Z2$UҴBs)qra8vCdlWv!T"_jkd9,{!6)y mo'J~iXx\d0x%&7~$jߤG,5U ՓH˖'Q}O7E)gdlj1roudE~0C07 HRtMT;l|#͛$#Z pyrֹ<?vaR`Dk$ E71WNZS)hvp+<&42aH1grĂΉ6#BpuC`|v Ӡh8Ow$Mw{\hdf<Z.76Q} 6Gl̏'1=}Qe?+TʌI1GOŢ rY;ThN0f36]˦kY}0Ӷ$:?&<کsctS-3d|;9Q`KE3z->J|&\e)e0N!%HCfY/]0"~o 5;4zEv骽)Z/ulA!wf}q$ţ mإM!15/LKX~܈&XtyNl0b, 2K!(\$YkH' 0w xScJmu:)XT:ܴes>Ao=Ȑ 0GAS@ *1\ M&"d!널(}UWxGpD?319EM#?_wn}.\-gNA"7L}r;,rJfi`NGcOim0#c!K!,Cȑ?MN,lsD·}c+6m}Kjp^wW$T: iFBd]lfj sܴrZMBԙww&T;6 ]0Hպ}9#3.WYY:],{?e_E7P1 sU%ApDpq` }1+˚">u^깬 3 M?9\E6" MKuicZ)w =mLxjT;qHGg.'6 n4ikՆ:+?Q}(^FCc.ڈL4;.g7Nm\UG,:lo;;dРKXU<Ⱥk( 29bAXdk!F*F>>B8US/r cak#!ŹP4 慂QƖ˷aIȣm`n{lg_YH `hS\etqr,J#*i)uD 0LSFC$w&\.bR cR8OR%mu=q8TuLt;_ڪݢ bڸ0"i HS=t 5s/*_#mѮj.҉'Om_C|YϿaCcVc͐) 6lGg'O\R/E5&Խ"{`LЌ˿oF5oe$<6y(O u2Z4b̸QM, 9''Ux~ u5383sŠWF-jrZ\5֘SAK>%&DzIMosࠡ{Db6ƒ1/ȣ^rو;17.Lhj&N}[OX[AiYQzX*y:;ׇՀ^;duXcD=H0_;-4K!NI)MQΈ;wωqO!ГK >J\77Jv?qDfnnKc/{,Z2k9:_n}L"g|Թ5)VCh1 PM̓@x:$dlTV|SsFFupIޒr X< Ux%N/Q;a ߯֜ɌørkB 8Vf%t93::5Y %r,܌04 ^"?Go{G.״~~8giۢ 2Ƶ;ʔ䱗~1LAq7 5Q;A-nG0.;JD!ܰ.xhL@YKPy+ I$BIwc>=4җ~n QYc? ܀6.;SvtxGȳo#ޫ/z<(f<eUl"wWJV~@ЇZI+A cvI hy`+2:Zt2(+~{0߬۰bR\$TZl Hk[dGxzX]_9'6w>ɔyДZKXcn5*CEؒvĵE}M؈`$,Bk{ I|͟7[WRƺ4~V'iaHdMHɑئ:]5S7$\SI܂s mݫJh`!Q| }YHQu0x3EZd5ej;byk~Ng|~ءn x]1V 4wKr6"VU6?caF-4#1ʊKn S~ߚ[?[&mv/U)]<ѕ$nuuaPV*?;*N& ɔ!$-QGF/X \u}ՁsZ(|J͊n!xIjMSlaC?-yle"Go_  ?P*W5=; fTp0gKy뇒,7wkTmBg̢=?fpGڄTlǢXOӌit m.$E9,[ Fz's"رSQ8+gU9165Ǹ]t/10LRLFghȰn"i1Tр68)tE EkrnKaUr%v -צ1| #ǾP H|[?&]MVHuGJ@=>00zu3q#`:C#ϡsMUzQDd40}pKO:*cr"mh ??1/!fF

EԄ 9l4J9d)R< p>^Kj@ˆX'\9)z}f.5 9 TA83D 4q8M?81"ZJ䡝*2]} U4yɊ&KG$7 \ʑ%1I˥q) _XkX %"UI4kr/KF*!#$}_&#ȿE\VG_h^HXcKXbQ5 AςYUO)bȢ@[TnncPUxk@å`[`8iX }zQ 37-?9FIPz>}½? 0Ld`حڎ~C9M#c HNxW}n`zisb{Jl7L@'F7݌=%ڦgXN7Fb‘j=Ju,4cNhQ_<#Ic̫`( \:KQUO> _52?Qb7{:41IH9`1SR}n RbR%oQctZ0ž3g>:τҒpZu3OsR^u1o!iUR1ѝFMU~ $E-Z7?+L=¼ Uó:C`V"*?"P19#D=pQk;G=`6#; & (ҶU ,Fp'MECcE d8Du1:m#0J8z#BP@mt{V뻯߄0^ts(L▍:ݍdMjo$ 6Æn!TQӌ%MqI1;2&ͼq/ k~?㢴Q;4"7tTyM^F&Y)N޾7y*N-cfLKsoytPB9E]ʹj =qͦ7*q`*e݋<|ޤki$juYH[L 9|F&F5%sn(:Y#rhc2.,AOP>pĆP ZY |OY?jKHyڣ(,ω>"^hH\k 1A!$%.W"J^HB䙶sq o, se4m޾wXjUf7JE *=q0΅LͶuSM&.!`#;ohM $ҼF-hN߰H*kC,]' 'k)*\.ؖaPek?%I!:>Mj7*Y_?Z.Ԓ%+J>.?Vcp\]1x~^}%T)x%r̓to8(v> p5t]M*'ф/R"a[I [++H`K W,bYB\FM%84{,N! H &9q:Bm>y9VƇNOѯ^=%yNeSlќ QUS@>_AsM, /Cy;a9T#+,p3* @Ro3AWi:ٶ4f3]Ej0wlIOjS9-#eg G.r^%1+ oMUCʳO_!ZY>~M&ګ?2]awQ8 aB r{_ʕmLtKƎ6#XpNG& O Ear)y }DiI9W3"u=]eW~c y-B .bxLdo>5Dtm8}eTXG.51d<+4bm 6[M$4g1T|\2T4?9SQ lDT0rS&pu?Y\vJ`QB }{ w@jXeV Y( )|0EܨA?݅5-Nnw$vu8yғ0'\֕ʪ.7z2X Sb,Z@bykDB!/#7.Tq}bpPvOES9mV qޞ5nӏ}mf°= BJdM(yδݞF@%o&c b3N}p.vG`PwR6Cw$-{![%.EѹN@SҤT*=鯌S ̘RG@D"k<_XP .ztǞ`G.eޥcY;&25% HZ3ұ~oTH-F#! 5W5t_h)' lI۱=|hDs+;5vݏQSG#6Ga@ʓkDeo67UOy-O S/n%pv7(ɸ5}ժhKNaPt&?6lnh 5s?(wKQYFVAIᇆIw^ؕeVPT6qXVžLٙ)y `o{ U9H Ne<3aэ7Pi,C$kx8A"v?DPɽp^ 1T_nm5DlJ %u@݅]1 5y +ˋ*f8聡lJh O(㠧8(MDC8N(L/ǃTK.5a椋lغ+7Ƽ\T&?8'ӟ¤JA+--%BCa L(|TPt5PB:{e͛hעY8Y~1},9{MiWjJM*P%_%b $wv|Nw%JtF.i dUpdΛXڱ]]LC"pۿТG1e_$c鍑|FpNr֖n`TJ~Rf{i \` L50/BdY[^9ZLZZ8ۛ8ƯLmjӑ}{њDzd8fC?b<>w}\g5g],W/|ESՖ\-C_Ü_IdK" 8KupUJɢXk;{>sgY҅J(A^7wtHVp͟~OQ<Ījȏ%*:%mQ"ULBҡ)ci)86]N]ԋRo?3HPtcxVJ>,!9}G92*Evz)mssS=nHٴjk>m.~1?tUr0Ӣ $2}HѬ{PL~|y+w"γ?xr[4{:{ ,z^sS],:x)E礳C@TAXIw.-f6M[ӵ _AvcD;.,Rz/P17%_ߘX@RSH`@rA$|/y=N'j.w\4FFLܷp4 ("|M{֔IS1Y5>G:\nLyOF=QHcDXMkQ+o٠?DQ_H},!NX*ͪaA5COr4"fD͵dy+-Fqm*>E2V.ĊȐ.IG}s*,WUOheCm[ S.E uKܡ,niTm=X}vA Eԋ]pm |.`C8Yd 5^Ɓʦ/U$kT.jZ9ҧ(w|쾜u#k*%¸ꕲ:鈌)+,ѥN*KmBA\<ae ұl6;w|ww>4szS8Y}6fyMoZb 6DzyA I߭4OpeM/˳ װ.&[i l˅yAo/,V]NmQF5F;%IAUӷPk1ٵv "#)w3c.Y@[ 5UZV֭ cV#=4r|ヰS$YAlytD8AװFEDչ$WIK`q <^F%Rg)jx{M>R WTLg=>$og4Y(ņl&+%5N&S!•ae@7L@48x8Ͽ;Ȋm:nVopfXTX0՟$ @dҐ;K)}x`f=J XXe/K~45g_RщW&e-No 8 m6|z:&[;ҔjCJ^F<|pH*Jw+-^XkC}r v4kKpӯ{ ;ܫdBW=NK@c kh; "ْ$C]GQfUp7kޓIѝrB(V%~WlLZNgH,Rvl""+O-mG 4sCyxv&!cm^PUSW;g\ԗ !?B597t[B_Y 6ا4%{ =Ǝu8:}VĢ3(?<wŦ%Ǹ?uL[??a= ;OYE=i<@UyS!G@nAfpPJz}QPaI9@*֣I<j!켏d|f3|!@dɜ>qDPfVI]`' eI4}z'μWX?5&|^Da=V?i9 ?1ˆKjm؍نPXYZ>gb}_H¿;) ?ǜ]R tCЫ'jNk]hy8IS܌=5%p3=9޵b`7g;3GS =ڪ0(yo9r!HUC ypC3YhͰs;3u>-TvoP oPB` W\w!gen@koa+9,2BqꙡN̞rDv3n?ʖIN{'U2WM`p5{B΂btcޑkZT*TrbG]WS0yxT}#7Jl~V ҭu-|j,dfCF8d{?li WXd/־ 4 MXtBZNAUSljr#EnG9@ Ez?-}0ho-*v?fݾļMLWh]>w߭q0Mk?'j$rcߜ MM=<ՌalQyn<:N#=C<˼#QM mU({C䳁9W֍s7!7mߞrOQ. %\pޕlB @H=s읲Ƃ9!kiH)CWWKwKr$9-6w h;-KJ4h&B ܰʵUv@-I1`tw%ƹv ]ʞKVCb ف {[/BA QAz@tsq2jj\Dhꊋn~UM~NVfm]0Y_1_^q;$PiM,q6Bw/o̷ݤB:ev<bNP VHR8לbU6%ͧ&sr~?=Jͯq-w' 7Ųz=7E;h^"E 8)]qs2a`38d[udW+ o']J@[4݆t &1޼qlUӴ>\+sLsTE$/m=rX a?^z/Ps^Z ^RUu-#5wHU Y-oI3Ye/9ṯ&q{*}@z9Ir.,SOt_t%+E~cX/O MVo@xB3w'gKXL#B*Di=6#lqU p"5ڏd~f5˯/?D峎{-^l/eI(M)I1+yt-mA:gЯ0\6*X-BtmvX[UM3 N'0KYqIT}yi{VSu>6#t?_вC2"yZ5iGn㋇0ɩ=ʝpef= Җ~>]qMسbaP!+ʥq7i}pΈYL4E'sr\,,ۭHc-g]~N/;l=o ¡ZI`޸*fquLM|KG -zD~H1-rr'A^~X ML{FloLI|tl'udeJllJ.8 W^8v-%6""G[UOy:$U-yV^lZSLPǑ!uQ߷Ӌ"E0VXaWZ-7 &$iW~䦼*lXM!])VH>s%D6}XkRޛx?8# \Iw";#Sn?.o0uDȫX:YV_>~lc# Yٻ 4|oGQ N":h﷌L:OVX~q˙܋{^#!Vni4E~꤁² 36vd5sy$p7YD&5)#;< K,gfTvb!pAHI(vz;xp':pAim]ŕAG eg鮧|o&-JE;P(>vTIyUeS~Eu:xilJx"0L+Tŭd_r/>nyD\  x1i1=o:{!@*{8dpj]\`2J9nI1J Zx11z*exzGZǺͩ{2qNCLz1D)>(&ZzMT8a- ZWUqlnQ6}jFE_6/X*ܘ4K:cg Q3Bi]Jh1¯v⑕+{NKd16vioV]ݽAa+϶,QTsSy^(| 4sJXd~Vo#kIanc˘X}a[vSZYvI?ڲ;vu+^.&T8ū6Ǖ^\ty `/bx@wmмȵ 81'#I9qJU-ICDpѱDpѡa,e{@mvB;B7D^#{KU3vk!zW< S1-wDm2)х *AL%Ng:7T=Jߛ{aH)F֞s0Z17ӛ2pIY]&%?k]-/q][aE巉 *%Ze?B/ոXsL7 1![1CZ;误&)H:tG޿MO}sM,bG T-oKZpOjI@wj9kBRmC|e%c*)XbmU/Q> ӲS7cY1z^D %rb of!u MWs^7{Dq$Q3W>^iA >#PA\;\,U W:(p ؽNao~{zl .nJcrU4u4>ꢆ^9PA“&;X /u{\ۦ)RJZLOx)33 0EO7&rӊV7z4۳׊J2A DKt fP0M<| Wҝ)\LY Ӳb '[)2N /lk),xENK@FolME҃~*SG JU.ˬSˠ8Bb-v7f lς`2"K ch4VeEd(:~> qE&"V:vADgCfU1t-[mzWӼA*m` 6|}}9 .ОK veʦ  &~̸7U>+vUq@]lx"E Ηck\P;  )yDO'(G[@M.+^QgTssbhgE`#,_3 0]9> 'Fۚn~ȡ̂t!s}qq]GbCHvj jשrvց@E"9\8ڵVD{rRx6-/l&#Mx#- _W c L6TƻR˪>ͅL{+$~۳eW{6=y@$;ZPDdo>9, i6pS|Yr.)*O= CnO[S krU.YGP7#Y>\8+X TٸFuPAڗ$*!h5B MWkp[~C2uLu>3+_diMg2 e߳s]`_7x:crO*i. ushӮ Ɔ_QߜC>]{W"@ m|Gh!+̜j ϋd߆v$b1ʱ!hPfS8We1a mUn޸ӎ$X kFw2#3} ;p.9Q vָM"UOFG Ӆ#z V!zZ:L4ȻP!c8f1dA`=HAJCy ˝: Y {;0PC8eaxC##U՜~$inޟk8Dr[LK@2^2d8H~YM*x@՛U5ُ(튞EdPQ0.˰&7iۛD7xv2?E4 O?܆&quamL0 ߊOh)Fn|ѫ2V+ (f|;P 'c߭7Jy?*e]>aB{ÑK Vbt͸OӶN[GWQ@+kzسwq7(Gӎ (Z0<cڢ@O*~ڴ`p*wJXh%\ulɼNa6V@l xI ? "GgⅪ*gt];>v2sSJ  @B'5Ox!TRV]_WF^ a#u؁ V.Z"w#HXf̷+ \ӬjXzښΧ E$Pfh}?8dKrFs%Q卂% Lq ʳ7dKy~0ڗe]lSGBL5oIm4I!JX ]^&ـ)de#ʝ^m>Z4g!Y ozM$lΧHD;|0{\)pZqp4b>,AR5ij1ZK3ǵWhۧkL1!{ J|+bIˮļJB! +uz;Y'lPX?TMnKՒ"}3`:!&Bϰ%b۷蹧TĠ=q_.!s{'H=&,сב ii!g hކ}fόӘ,[)4F$່BSPt~~@(.jAcVn#)D5lVs3x\*!!Mݬ]O'JAEX6q& mN1ɤEj|U%Xs#@Mΐj'L3Xo bd^G23(pD%U5sB`KtL 0wG$e/= ]Oe?Uh=Ec6JnC >^Cct 5eU-@ z`}77K MO ʪa&rǵSz193?*۷RI׷)].GBQ281V\Bd<1rj%@.UK=iyyJ/K?D 0̂] CN5 J#KDg|!YЙ= R8jkȻh`aDAJUCm輪 7 2MZǵ$TL" ʇg ]v68$}$u5%~`$\|Jco-n12@zÄkVtgx^8 J.v bǚF]kW.iM%;M}{At;*mtbM?ԎsG.|v/6_'!Ǽi@[%$21N,qr{bG(s+;EH9Rm#ozt|rZe=4:]Ȍ65:R$@xP&DmBOD$.Y"O@xlP֢.u2Vles0#ײL5Y>tU' %a/8F -.G7>ko%[Yʌ=Y)! QV(r\P[_d }պ|6esѼM*2MBV˗)4!Y)yAV[%ȗ]5&-JxK6[cZTI+Ώܘ[z>4|b*KCH9\LON=mKM@O"O}[rI^VircyC;iFU!Q:kMwZf%S7rĸ?Etlw {eTqGqFD+nsM#t3dGxEy1@{cvR'tCDBgiaN9)!f3 A8Ûź6hXˍjkm?R $*>>w~=NR*z7ȋ=.Ft!u{4-8EK$,6#x"&_ w,atQ KN6pIvIHS5_ng/A/ί.+TBYƟa7dYa5e6oDֲ ΓbCukzpU5=K?qx >`v4:6|V@+"l@uY]c/Z;A8+g[bM$~+}!0s (LY򼡛b<]? *.PR@a͗b@^[=2iYNT +3nc,-l:gS!ߘ#Qie= I|;&o[5QLXB:ۣo\@0BOY|(Q;4afnRfM`>0I5{40|g"IfMK8v1T28|t7d`}S0|\nOLC?ZCicJ^@:;L8Ɲ}"uB.m- Ee$@jM?L; ]Ô¡HN_˿gd{sYmf_u8lLĩloz_󊛼 ѯ0M fyal0sDh4t2 Dc! ` OzޕױR䥘ׅ2#;W^U-ـbMY =vF|V^>&b$uXP7E)OcFr9, mJJMC[p_4k 0*$~Q"ͥqgOܔig2.':׭|*gjW?F !*jI_1:ƞZ@Qżz.N;w^Cyi@cjp5?M .n?u4æ>R a"\No%$vO,ܺceBx_泤A@(9ƣ_z3( `J: Ty*1,%R,[dyE]T(1+ aҴb> :֪܈~*EHI: t/-+gOi0]8z̼7ch{QFjɟ_ ;M93+.lcv\  R7("ޫo^r'0AV$0{=`΍C P4!1h'fFt "Brƪz,(G-;açg}E/3اGϽG$s 7sgwY5 /jr)(U_j#HH$;ׇ3T FȎ< dl1\ 'M~YO+r^8iلHpXמ1v̓5F[L}lm$m|Y͉y<A[KHwxaэ灈 koqDBUܺ'(MCUPh'*J`e2A;IpԌnJ--AKo3NU"K`AqHO_UxLqn2Al])5Ѭ ZY.FY(%y'{e⽍];Ub621$DwG").D.M]w5-Z`eۓ|*B7N~ R/v.ZI >*oM3d}5=.VkѥȌiy,XMӐnds|6vfw SS͹lٻ=?2(rQssz4^4{YkXd[鮏%lD,}0c҇iۀn2Rؿ5샦뿈CY%9[PdN8@r%xnm6{ju"+ifUq,/Yѵ7Ũy𱅁,^f 8WU@&_ djCS#>rĞ$MEJh/r.vbKa)5@fK;JAhEjnEӪ!z. g:2a8UT<@e$H939 B\]E/8'"t[.A 1wcsILtxKe%ֹ??clfqY3 ˺y,b{m3?&l;I4oAzVx7^e/mZF!+A,l q'l^I2qw四I7&R7uIx >AĒ^5_? !2=\4IW&oLV #fjeH5wTb4y ޜsZ0rU /]g)x ;GŪի9_B[QHWӓ."^iv[|gA<19 Y`&Ix~ O\"!SݿBm%68̙|j!ȳiOC`_qV#)*{ْۢ g ǹ 2ꦎa}/{XNߨkHgNP#BrA=؝1/œ00zVA,5ɺvßCZd$g9-յ-ҽTO@MQ)?fF{臾gM_Wc0'uX]b!O:ݵNl{@gk5? U[odN_D4ǏO/O>?=a "߿1/݀ ߰:8U*u&=+ZkR`6~|@ U YHv?[g"ɕt@xScv@5wx6ݒeS{8^hd'"T|2$ h kyw ǻk#m%,sET+cI5C8X⥖^B(a6' M&~@g6R;Uj&%0:obmD՚:R@횁<ofUp+paI `$cIos?K4 SNHgKpaT^;mUO:oGqw8s蔌TPZ3=5I3ԉ4: lc͞].mm).x̊* G$_2|ɖޚ#Sm~-Bc[a[2 ~tr^}nʅ~ѠBȔԼC߱Ɗ:ަ 8#G3ǀ,]>,xY˝|nTy8 ;Yzvf DK{DRNǩ{XŰ6Mgt R~s;P$/(ȝjOpnb' 'ɇ U'LMvd8|, B9;#X:d3'nINAn+^f3nqA+^~fڶm`lV8)a]8Ȭ/U=P/cSu+)Sſ.e5P.Ρ؜2Z#a/g.:r8V~rmi;(L ȭ[7~z3uѿ +EH]M wdP ;}OjmDi ${kvxk׈\bܣ: B=HI#]FWĤa&>q Eic&;(i^w:fZvl2Ww76h h@H(w'o!im0ߋ*r5_::F=> >Q\5NC_dƹ k s:⿰xr^^` 4~O-Š0˳@ - nP'sCyXrOM6 S0W4(mp1iOwow~gEܡuI+wU[ (ͩI?'w}'ҟ YI 揆<ֆ\^ qQ9Ts)5Q ^-77VM{VWCKYWO[#n;MeOdU YԒv iX{ܫаQ/^@1|#^qkhVW]f$vJ虆wOBm:ѯk;f+1C"Ǣ(cwE.Ŏ23hw {Ba~g\ lis= qXjX҃i B}5!g&h8Xʙ j);Iz'e5g ##aW.4pWB54cI nsDJFV}7gDZa"!~7(|RYD+: { JI2lcThN PЖz Iaj3{-.2Xnx TtKӅƕ ⏼%#yc'EuT"2TDvemCT.>yX#F DJq8#9A]o|,m WLZ#~N) d:)1vsoYP<פ,݂\0CF ttD*XF3i;uՍ{VA_щFgX/XOqb='3fe 29n0Un + JJ# }j%-2|p9FzdS5)[1, <JyI6( T^"\teaC UrDza㹈`gtH~ ?؋8s)'ٳ" ' +-{5g.O'&ܙe SdV#B֙hD Z+Z|xQ((lZD5::AM4(bG +etbg6`mءls3RVǜFv,2o*D=2mƯ>le~j(R/WRZun9w{VW/?|,=vXԜiKXs^!ؿRpLLOI{ Ks hy,%(&</)GVz FzInWN xAAp1#9.TYͅ) >]Hb -Y&<kk~T@jvD6iX`-9 I竪r(ֳ:-s,hsoR-sf=FY,3R.?'>JJsr!2䟒cp8ݿoڮ(9)y/.Q,9UH}7NJ';\P,x[ƴ>`ΠGZ7ٰޅwc̥~tL|fdIӚ>{Bd0]+,{tV(izFED{QpqGgtl^c .E. ͚lFMh1_LP0@xL(fB"ƦcgM/Jhhr GY]=N]ɘ&.KJ(u8xwn 7*FژSX SB&g]|olO ¯3yU1'l}/t) Y,"0end<)wϩ,D.T*IߢıqH(ߧ=tx!(( TKф)ܔP iW' & 3- $퇣%"P05%z'YJ7 &[3881(x^\c~[T4fȈfT_rb#?\!JyAmѰj0yVc"錩h;OHZvrN-ktl+$IJAI,}`D۴͝yA\HM,ksG.K X?A6D]l'2A[hD, С`K+Mf"1y'D@*ʷƤn=P= w}aaKzO f[[;3Y E>f t[?!L5fs7{049kx(H\% _׎pfEo# "\#wZ[gl%QK]l@@J lR=[و ;]{t,M.pcq[(s]'Vxў82e0p}XeB`'X o!5Sj?;c Tyx%FڍyV %'K6<-z7d 0cwªWbD? w;4-/cߡ1H'7g:?!6p?6KZqmA-҆xv ~w 5)Td6<S0`4cX>+݇)z 6&( &\C]Wh3CQem*o)\i.% nמ0=𷧔uz~J;|#igcf/Boxg&Ŝb\I-5;g7i ;[t^ Fif] fR[DbG,Cr+F1 cVesbm73GqX*{D׬c<} [YOs\ֱB,>r P{qȢBU,_hYO&Hx()+S}ȯn N㭞$c}$u;$@VkHmfDjE3zXec%-1NHWؠTX[U4S?XG'0?ng8(;b݌Ɂ-Zssq2'XbnzԨmvolه˸ JW(Ɨ<(hf$ȟrga7ReJFmܷ*ިL1P69St mp ,OQ4JOV]2.縤mTeF~m*&ҳ2L>:`02 %147C\WmbopHzqXW=P. @̼}sl&jyJLjd514R״9,jc&a!o~d,n@ȷ|RUFH j 9iҕ7ĉ\keMD_]ABC^ NoG#еF`\6wCe>*&V~U"͢bAQ$",ej^|.Ϳawsi4xi G\'gLIDtAg6%+v":~HG0cL`Œ"ګ5>kgv`Ys5%zUNo(:6F񣔤i8($,*%/!N`s_*{c=ߟΆ~LÏNx_憺z o'1X \Ual#\O2еaƾRr;vQppⵎg;@]܎&|v'pe&+?S3,n6pi,f0L$تcńyg;& jlҟFO1$ FS5a͘.g VxAn C hl_n"iZ9sz/KGǻiI#.\}fp_[Iy/,g^Uj~m a\0hYaĉhmגu|G9@GݸxO!h!DZqmPw-ƌ}֛x!eژ=;~e4/"thܰ(#_r6W}X]jJ[YI+)M =40,ٸ6~˨>/dXNlEjn}X꧟m~ªu}~ g}† &̞t,˿Wh^3tcoL΂rpN|526媵'2޶Xmm/Ax1Ն+R=N Kؙ IYU3p(+܄=Xį Ojs݄?S)Lapps(t^~?$=eQ~#ن^~!.{"N [ QHT51QH!F#)֯/=.;ˈ,$d <c& 8ة7 o9;cx! [:od= rc߱fn޺ܸyK@kfE֔[~ii@J'PX: ZL @s3w!y\YQl$AE?ާ3jPDiw^8ZB&"k pJLZ)1{$wS"gFlee|X=4LG(*[]a B*nȴوT3a傢l7"pճK2/]0#s0hKu8,ōV2ث?@8O fsHӭƟn"|OB/Gjf%6։yA[x0Y\Imxvjj  3#^5`\5g ./wA B.ު4z7R-xr]):mCop=n,>x#]O.|~s0V5WavN~S98$\Ņp=A\)值#ҝ9k3BDl_riD94Nh\c"O([+KъWe,%b2hMDދ؄|ZzZ{H$ ,ցnYOGz./8^rZ7 mo!1XѬ4u.X{&Mo.&3#ͺ6!t% Փɯ)92? ֗O4'p됺mNBNWCCw=,%4yPlHu/N'1ӺqO7ހHDN Fk 9Jwu_znF[cec (N}{u c˽3N5(GJ\hT| 0N̘íȪ3eH0])Ef9Y78nmd( 3A8m/[ 8_|jDjQhLDSjܸhMY 錃;-ˉD02pRds\xSl@L]e9G`VkD/  fWk ]]@).HK֖D5& R F̸~c;i O%Ox~86lIK{LrJ@\v-9i''| ,$ E[)B4pgI`wpQv ip"nMU7ph,3W*NIb KLؓ- *bƔeH0:6 +D;5o-nCWGŀ̏y8Ll\0 0A Ns܅8q}Z8xXjY#˪FR1{U)E'Q͇P>m.tmuA вēyT u bdUqGi#u;2z}9P (lM#2w4}~جL!?Sa!c:i.J;c-wo} `tgHmj@AO:<~|QBbA4.>ԃ=YPLЁۮ!HaEZ^qqFܒ|'FvnW*@7o[ iPt|iDެ(OˆST;epP6Ѱ8'T?$%Cj[a/A$TrO^7ccQܻ~e+):QIeBfkU %(د,c]B/XU6(Q Ҩ>trzJ \ e\z+Pwp~0Qoo.Z2Ϊ34AAP'X$IRz)siV/r޺EXp9\([+@564@3_3q3aXB]]O0~Tf)sk͞Թ/1ڄ.s?(ے=xr4`7lE ũ#HNf`ثRUN/DBAi4o={+=.I;q25Ξ'>߉@i2D{h$"qlz N9}U',6<﬍jsZgeFRSaH{JDX+5e5@mtna*xGd.g؋]*Lahz@p`"<OٳfdzG1\w $S9vS)-* =T/8RxY+ۙDMϕ#=TDfἈNǷqFQkBְU 2r O ,J{T'h1dy>j89i˾ UYvb,=!tȁ!Lq Eֿw|܀'XIњ C\DJclzw;ݿͥty#x}$=w=!.R q^53P,OWWݡpՂqV*_ɤA]VDyީ|FCLn'gOؚ< fr%9uN!CoJ' Z /l-yҺ1mHi4_4j8&bP%fDQbs;(``}̊EU%25sV=a 1X؝\zj7, l΁ݡb.zj&H﷐7Pރ"P N*!'JDj= c]01R5ϡ>kp/bidDAЇ^R?^5wt/s~t)a`p1_voG/~ n;S^2PGoGE6h~w$kb.:),g[lqj?(ci(ajψP\wuEO>88lZeoLKcnF M.}Fg($H$qMGч¤6K'(t@-LhZaQ8޻kޒ3YP!Zv"Vq1Ԃz8@Z>5u,q!YYybBҷAP$SgЋ\3Ubhq 8l´K>fP& ݕ0v&|tVtĮLi>1^sR|hlBS'‘m#$p.y>VzN|E8(6 jX]& F}*RJmn0ͥk%y2 &MM;Y< ӒU[Ej!2 E(^1>CIv N iL* CY~G [~!C詪?G/,83y7<'t=Xd鎥; crkŐ <[e7 Uվ|w0;p͙%>{N3 \`vH4?-%7E"~JSڟ.0 Brb+ 1|t n!h_Bx&27OUP|ߡ( ]q>\c7ZG%]\n ehF+, )%vo*'iU:nGM [鈏W7-e |:(uƜo9 2e{akk$a-p%AFhn;o+/:O?l5I=sH[_Քǯ}V3b}|`K]w!?1{J&k]&_*>QT"$Yn '٤ҩ#gN&NB+a 6"#@>7wtBx`BmG˴%Ưx8shF6v eڄ|-D*l_ G@]xgXI|t;%H?nP[ Op 6g nXCN32K1Vξ!aƬ4JG䥵ť歹3'6=Po (f]֞AA_z)Em]Y "Q%$7l/Dzײ <16ӆ#{l)LcF"oGhR u'V ġQe a(Z..ߙC1U](1<ѧǂev ;<*IVp:nPbofsѦF},Y2hP6U%Nz̅ñ3hjR(ăO᠁:VѾlmm7Ű5G3\벣w0g)0-U!d aDGoߌ<H'"sP7a(9*g,Tqkz`z7֊4˭89|oG,{K Zq [?HEϥzC_[\PJ'hn8ia9y I~ ,e 1oTr|1X\Z0r <pjC7ύkTYj,E$S_ kf{ JOφ7/9iVP C?AqI+3  I6}8 */ݥ@]`V|mf )C(ev[OWM~aUrŀ/"?6;1T.K͇VFrTn[V '5.&<źOishxV3#%}'JcM r'C˸6$_'y_LVfkK);Oiר~I$*|aĦ5"M`3h/iJxEO$@NL92驾8 f\Dxqӏ%uiĀEoRFFZQqG r4i1Zy ۖ_kėj< lttK_,E(*c䀽6:o&둙uA`{1Wsj8Q܉ӛKNY/3B"|M+%G5腂O'vX"{}8F$F" SZi㔵1NvOӿ7:k'InmHOԵHï=֏\lo.p&7eP00$u0JDY{fWbp9NU U#hNiZEA@.Շ]_Y5G.CHg2:Gl1KG RPj#)!zr!?xiԐ|5*֓=V_NH媗b# DxrݓP^ ۍѡf#1tvuOnN#7=G)5st`haaځivUu4O_K48d*[̳).zAEJ&j޻9( D;/'r`XvK s}~ȈYr _"ͅ]B5> MQw\V/6 U`0R"^ 1ucB614WҸ)ix]̤[+x)9NWpn9B1Qpv#㹰9u;q,y#QUQ= H*I)Ĵ Xq_+6)a, -h; W) ͹# 5GČfAu ]ʚlFx^.fOPMHك8?L=|^!:֤Z\+c9߲!KL'`򢎲B#I=^ٯNH*A+ԙ\+hBq"y"9.ݒ؃^ZX_6~eߚڀ9ӫ#_zS%HIwM*KKyg[af6+{5clǦ>UJGvXR&i_E=;e^r/9Ҋu)zdJCR]*"q*˶WU]S@Bb|Eg]||Ѣ%CaFF?a5zd |ƐR^Xh*‚ЅR^[DŸvc_Tcw Ĝ(l X7kORn#&|xNuzkÜWWh8`gj:8zM2J.TʒKbn@`jZ՛ޡb #t%ys0h%caCt܆H䝇Zhgy8(\+?'I-'n%݂:.IȦ ('gXO *_%5Y:dK߭/!P>Fݥe *-l%hpӿK|׌tvױ{G}ܝ?],*p%2E5EA|UQ!srYWPEɐjX(5"}'oo_o'x ͙:b|X B'Um7PؙF]rljE(TTw夳!X}^mGUC8%6)̑o@ds_ |ҋ"0|D rr;Go6U4 ܙCr`td-*.w[@;!,E"@2'E'\KE$GG%x:ټ8 }y^hΡ{x|C"PR&شM82l{j"?z$ӖA܉JDl#0LuRP/ ?HS{I8`"9" *Urfj53m˂*lO6&6e& c[[[:m,-6.VɖT;@JE/}!ĥ?cZ9$y=N,O 0)dD3,T19])XVɨQ_ڠU##'gXj$&:P?2Ȑ-bNtlQ! ]oWJF`Oa_LPXW [QJ~)NE*z\e<*|RE,Įn{v}{Oξbr)ӥ K?[R둯kpx!}}uN q] euK @).uɐ$9@ueWF5bEAпFx2Ne)+HNHYct8p)设rl j 8f2Ӄ%mC*\+RCƵY (ȞB?6й~CQbQ& f D4rz+p:tȆm$/4tng٘\"_!kRt2$-T@jh2sJ13cSSn ݖ N׼sMfU ^/^ebvJLT=G<8`ԥGRO==cz"M .7&e5W4qYh& lH-UN/ٝ w_ڧ[p#^ncKF^yfˇyycUY^uS]qV UKP=XxRt+^UŴf30# Jh۸! &~FgVf57WcWשBa` M߄wTq 5qQ7 yReXIPrlXDYˍ^v:ȃ2jCIr9*w~2VQ-˵pW{tЗ7iFP/!5Bm{2߿@dH Q1DaZF B7/΀Oc;\!/qO* ł"Ymz[,8,R()iOYS`FUI$d?wFD%4z/ϽoJy}4N$-տsة;ނGH,pދ@ Jw(٥IW bdIbs0*ASĄP<ECmGʭBY:lє64\N.OR7Zۺ`Q% }`жS6ƎHzeWôq]G#}Vv?=1 )2-?YiVe3} I2 +Wv6mXeAq[@NA[˥B?НȬŶ{Ǡ?Wu-߳O3r:hb DЕK-taFPͥB咻LykztFu$`4R4: ×cY$WˣdhlV!8 q5*PM(h).6!dlBdd (|X l0'M\=u ;ەM+uhi;3g5J(7g`25,Uizve݌ 5[ APOkpK*y/ڐ[eND9,r|07D)@uk{D ع5%ѤV5ml `;a{K{>Cu?~P]JĨJI6xt ג\ţ `=C!?<; 0lxuN1PeH&g, wo?rf J> |/i~! z෶A{ul<Ӈ&+_s:TeD~ ]{'GkgbM E +L,rPRe¶y).E8m"^=]⾵NdƜ;G72cR!SlKVoKgEB/k͗kxH2sCAsT :0 KT9%.JabP.uAOF}B=G_G٩NWi1 S*y_Qi=-LҞF2wג~q"{Q}/3abAxF4rx/Ӫy:ifJYyL٦c(Y[ّzNX0?]ҏ1 횎)LcDml0\er4sb{F׀چy5hLW\Ȥ)(ɔϏ& ;CAD? Gݦ}7:Yv/]xcv6CH@ux;]7V&'_W5fT GPôP+,S0{J,,WRm)-[_~? ˼WRgَM 2YW tax8Obe6vSi^r~oj)*XjALp 3N6(A$p{nz02+28bAe 7n{)A7o\Kl𤘲6p/B˝gb8vdd5n_ fx>Z4xWL۷P(&! cStQ0@_$E(U.-Êl c;"ambPǑ=ŲE&F,yRd6ඛN&6"zQgVj!Ӧ3 #i+QhK+j~$ ϲ:FG|Yb>-btva:Eo&2|nίZ"k^QD;O5mt{`!?] ^uٲ?b~PHm 7FV y]1LorKQt3oWHw 0xnhh(lwÛ{27TU/d| Iw' KV<EpԴ7h9f4u3ImJy"WJmUU`cci/ Fȍ" OՀZiesfmqw6454:Ybuڤ(`u#y<Φs pߣi~qQڹ5{:C?0pm%$Lh/1H"/Ojӳs'@F YV(uc즣'["]SC< >E@Oit%T  }PϿ4( - LA]g۸ȥ:Цs%h;ui\m-N#GJ`| ;ey)2wSN2݃I~}\?BHQ BR@n5Et%8+ڔ.[5ľRǃ4ZmJ]M m_D9yL!ܻ4HEߒSQ/kZs[{ŌJF X.1p'p/2/Ϩk,E5R6`)-(A@gۀ L*[i |a呜*?g*/P;L.fam)ISS8ϾoEU 4ف,w]/?6^tȼOA(zicvLQ BOB|0G6e(-YXf51Mj1PHN4rsIH70Ħ UE`ʛ5S%x taQVxB=8$;,Dvњ G,쪗}^cDT=MׇE3)[o6; 7OK3Wș1M6 OPl*0 @5 ۼOs5 G5FV } TDAmxi9ot6_u/*ԢjU`bM|:]k[[Qc9;CY%iQ['R 6 d #uUVHqr\K3LM%.Z`m"K|*!C2Y蹦 I/]M96 !x}\`>< -̢EJ䅦4$iRT)"za) xzC|8fkOr )m{-JV 9tV,T׼u>h ;6^n^`B~Xa1/QSşqkRXnc8)Y i/.Z7nyܬË )(,\FyźgͰ?0O%H+ FCMǠ:Z* V^:!HSϬ^ &R pdzFo-a~ղ6h& b*JFrlV|Y@v#f(-}_Vk \ժݩՐ릑s̿9g gA8W!NrB}ԑH/C+*1"T=ȒfbE r83K^ %VL[] ݟyW:Kb(yl%Һt* 1EQzCShlDLawN&wWDQ.J_2j6PM}X2egV؂I;^_`}D&\ܓN5V0& ]]q<~f/QL~miFR4ȁ@JiVKRoし*H&L> ޏx+EU1i9z ~w]cG975 텬}i jq&]| ƴ>qT]ǃEÙBH4j,tY!ړ:v% 9``M)z ga[#m=Lt}N^fY>!e+:j̬M4 4ϨGzhZ ݕ ]'0<- 'H [̥ړ эYy+Y0`dQ*  =J XYЛV^o<pDk0K(13C/~ - c @Fny[vgrm<-}%-GlPe3Ζ}:onфp`Fk;Y[o}Ex9|cܡ@7)^h366/z;PmJ>)nQ;J ѯ*_K)q|F4m"fneE?xh-ïō5_Dlm Czi 0Mo}8N"W&ߑY"O}+]k?q̣gs_Yt H7-U:ZR`M ,^˒y6ˬX6d1l\łh8)_~ȲGϧ uT!ڑ>SeCpPiBjp >c-asLRBfMN=mP Ѝ̫:j4:xU,+G;#;N2o&/W/UTx$G+byB},` V͉˒0˔~zc*mApAҹPݍ#VD$y)ٜoZ㛧$[$_IImsAڇр,~:_ɊNf<_%npd&4R й-gi^%W %A$0}$;Ƴ'nU3 "dƇIMAW6?8DAv)hD*L׫sWRQAp^ j%xouc6srxbwV4=P'ʼn\(F ˇ"gSшzWV8$Q:n876~l3(oa&J>L@\?&JM<ϵkf"Eyj09g2FXeFJW1vz|ʻ\?yOF53=_;\sR.%ViK!s{ G*dmE/tΜ Bϑ9iCKS?ro.SZr DzzB97W֟K}*Li(Sgnm'34ri-FsqxOPe a̳fBMMT0Up6{0O.-(XQay2R_l6ݶ;l-5OkExO8-eA6խ셱YW~OF݌?g!X)9K >q7E3#n-jd`,ڙFzkpgZ$o" ̷a&Bqڤ 1yU~ 5jDwM9d নXn=n#ΌPAo׺)t޹EsV2(Uu7v8Y`F+IެPRw蛄QዘYf8VR]^B@~[H(tvVs0&10pP ? VPme^yD.]I9R i+G|U\eH2O3Œ0C*ȶ(lݪhXc&DTf$i襞IF2"&a}i* 2Yv4L@/! /eږ|'@ eQdrF84 |K/ipd%2@u%;Avi$cUTvv0!వ;ehφbBVz%T.#>= /tryZul]K냼;'jgP)"u,0:s?RZ!$xVc ȞW ::5N}>z8xa~E| 6X8o G¥>MZõ:IIȥ#e>r)cV CCɕ7ٓHbN9rkn`S2W[`D:}CN"d BUaD";pF_<&=+8ݺS;M^>Mb%J1Ŏ_(4$_mu6􇅁>`--еc85>riЬ!?ABῠK ;e?”FT\ɏ ͭ#Pmu3@>ƲROmȌ& KU%#4B?d6CaBrzbZJ/:Ҟ#=ReF)x> 5KfAG ]MX"@:;TJALtcE_?= _*Dztdq N=6Er׏ҋ@ "⯁Vmu ;ILCnV\by[Ls(.K x;/ $J0G!;i_ʝV.^~N/ ~fko@(t^sO\xR owbOQνiQ /#)ʃO,QymgO:%߱-L)\D̩b!Ž٣+HI^o{iEo@@~]? )"ʙrz8%-+ l]V)g\cX^~0evۣ&TQ- /se&8h_Bhg1Bmol 5U) e_/ˎ+ 7V.&97AG0X+kT /CLyC%LNyb1V!0c5VnLrQyLdI<w3g+g)LaG=Ņ0 `1>+$km\| u7BUKm6 ENOSE?(HGS$v\mt3slrs¼QKӒjYZ *j>m_j_OWtؕU:^%~q!0;ofA$qv[u WNh1hCTZ}07O'!9H?=U}>Meǎ~wijdO"Q5I{|e* Nbnd;)܇~e&  AQΜ!y'SK^0HGCOLKVqbC7%7t!A~C62dN*XIROBz_z lNÞ2}0yy0xyIO&+Eip;^p TOP 9Më|& ܁ W-k"@0YPSiW2} } \M?> q!/W/> Tx˥m"Ip:ﹱmHW]V)#b#gB1[ZOb͝=1m; h&![\d硱)k .{9c-7m9iMWE+. (Kw{1>ޗj]=jj^ZUIDL7n^taە' ?Do ^2Xh~ cɰX%JrP畵A.4]N2(vȡ_͢@g㼶k֌ڈ\`N3^)PhBdh?\VܝgʥTL0+P,g@3%iauKfD 9"_V}%ą(v.Q*z!R̶Lc _m9;p_ .jδJ:-.Fnf0V #cĺ*hg=6C,PHb a[]ܩDR}ɖ>ƣ>0fUkP_Dfq9U[Ipn<\@;>)BX+crH}gҺE`Ar66?Ĥ>K:Io' !}c9d w k3n.DO=@P*EO :*fr ^50(j~Sh v˙ ʎIH247>-ƺR2)q9/R:ZU*L1WU/Z&[-GdHd*譕`y)MIEӔY<>J/d؞Aa, Sk6vRw(Eᆴ0{ ŝjtwi .LH9zjZ+eGr Ş&f¼;DN|>y]F\8#dZGm"ch=<$48&ZGz`PY(u*EŅ$xA_US ІG&I #6q6cHXXUEujB$k*yM&/G-2PS.Ǥ"!HL,mS!O 'D  7x,v:P$К*2l<_MvA(K/gt.JypcR_زUmK?7fi2 POV  T_`%n1)|P[SR|([8v˻@jzjbQѢss[зu){O6Uٜ?cJ'Tu*jXUx{Sl7Ɖ%aWY 08&G ,g!DvTk~@dС<]TRW 4ԣtxfzьbLr-%Mkʯs}ȱa(%*<.@/{5;_F8ym\BIhlY*-r^턩/`78zYOZP:/!o;/mPy<|ss^l!RI,}\< g1|P Ik;kB?9J2Et-#S8UͰb:&ƈDS\i/ĸnǠ@W*@Mpq(Xr$V :LhA<'WJ+>:ȳE] t7t,/~#]9#cQ\կk2;vonŮ$M@B3]iAl;l"c–;mk(۫@k`Ed܎gl-pt=AxygaAueE2!ǚE*\T;F*T勐CBO[ RdX$90MQt)jİJ%Ft8 ߞ~dVk쥰t:\H,S* 8eR߇ #Z)k]ИXrʏg"[O!.䘯^_}dҏ^Ԕ(oWY2"07©uA 6ޛv;@ˀ7U1CwڔQb hrf4egĩZ8, %R{.G?i (M ,o&;1s&1gq=U>٬9QDNy2n\i-Sg2:O2{q_ %>їȯ^Qo]>9Y5Fi,M ]}}o;uQpCk(^\ٗ ZSJ>9߮5::E!bk(Pߔ@ֺ=0^ i%%wQpɢjFyp>8v"2qbH)ӣih*ʱXƛG%~C>uӆ!Qw8]?Lq1Ƹ{АpLjIOJ,)3=Ze$ܸ.%eeO:2v>џ%eN])HAm`XG o $Ǚ72-gF%)xei|$ %x~ʟJrAm h^9IO)ҫ\b<`q͊԰M!Tq-J7#Fɔm$vp!m#G׻#&RA#hRxVWjB*0=om@n>g A[KF?NӼ,FÔbzGr$/]7Dӝ^̜|/P|? GĪ8VѺǎ[*ݑԾy=?>gp³|Ԑg?414%~LK_CEN}Ӟ/O<U4H@;c7jo40Zm&d&O@7/WcGPqz]V Fn)۶СٕI-hI"N$+i OGio-pxc%.uc3. Y r^(CU |EλrA&me`Pv8lDˆbPߵ[fޱM(/&;q9WXTd@joMyi5H7{ 44аm)&C:4E}(Nq߲8G^fqƧ)!] X0)-DG(E0xhSBJZn7&E#L1ߋ[[APuXzHJu>ډ}wD4zQ 'L_|KL: N7&$EۢG0Z'fϴ!u=p&e4ؔ^&$ A~!3"нz%]&cޜ>;(;k18i;pI^}ցz}Pu}}xyeוqtWָVr!Vu@@+IK5K&bÖt#ԥ`TOf]Be;ݴnA&I MѰ+_=R}NS߰)XR)$5p bI+b;Uxm2]"vi#H=k%x~;J~~zX(kIIDONfܠ7NьF@m*珶A6ԯiW(#B2H l9`u?>λ\rWj:I| %_Aj:]T2 ;9B4"|&C"DlFg151=X,Mn >VQv34x]͗.q6>75=q/ʠo=sbg=7Q X8(ńsXv;"f= fb9ԟQ¸w.`ED5h: |^.ƫKGQ5yOezR 6TѾ;Ck["'U=lm 2uG7颥mHѨ;)vG||9:pBz8 'C‰?C; egIxQ6brG&v.cUzGg)vAmCų=R 戙||idӏ\A' - [C8^QlZ d瀞G:vA°[BRgއS(cp\ͭ'eѓ<4Ӥ G5h@PpW3_z;> z00"JrD#ࢇxK'Ȕ]Йj {.L2Nc 3'[CYPۧ?qa&u \dђLJR[))@8$Ŗi͂2xЈ5hGd=u^o?w4 Nqo9TTIU.lI`0ysͼ";-s,m;Y96V2Jzt,"POM+>MwŚjBe!F-052oLs]A,Ab?Dڧ 'm[{Lj Et)ٻѕ"xS Sի)z5uܘ6&{$嫮 ঌLn49YxAbaQ6U +IAc@uO,]7!Gsr چ$v`ۤC.@kr? o]$&m$g%5 p.Oc1p](`]AO_g+o9] GBdGZ&T[ qHN?dVAť!"tռUb 8 !\CEO {Gnpz=?%q~ ë>iS/4RĆ_(ͥY'Eд0"Yh>zxu:Ű*]c!ʟ 8P:Cah͊?W(l1,G1g-Ǟ:NY}.vöjE&ۊǩ)"_إ,'B fiVI{DK%ag(H ۧHS1Нnܤh1/9T 3$d XſGV$SDmЭn\N&!-#/sɧrX@yA 2awȾǓUkH92,քua$++}c_U V!g9;Dw6N1>wqMQ2n$k2j!a պC,2 g7h`G3T6XoBH]X8B25jDZ]DDf}?,PZ >ː9xN>T#tUe*vcdU ObRdXHO}/*n@VU_/cVVo%20X}n"s߷wݳIQޗ%PLC'Hac8*6^%wƒ_vOFŎ̘]Qm5[vDŽ}kMC&V8 /9,WXёzRauK2դ )o:%*%N?aP #^nǖ[P4NU~%3'q 4VWWR,I\U! {d 5E C#F&1 Zpg /dh)7ނTi^&st^'@^)W!yiWgboSͳFBQK ~F%>$h=tG$쏾Y G$9m:FDK#mhZAGQG,j#8%r(^u&Th7D'gT}bɂ_}fIe"-uU7`W?*N}+_5ảyXvI/1"%tљG:W6dOŊ4mQDneQ$SZ>ae??! :OM60*N@ ]R({GXeBd4N4OY .48f;Job1RK41o>zxX]+:Gp@~aТe?v1/ZvFyŁ+vж/)p #lVC)L^~NfjbDjJ<)ퟌRs._xE/|g e^= Qt9|>4›95ӳm=d1 p LdZpq{J0CblXsdxuP?&A\bT!|Du; hΏTXa9Y}8Rs^`s~dpLv?80 V[ \79_!®R[,~:)\,y?nq4 Puik|%N<4L׻6]d Α^6cw@vKB4#@FvP~jRecz=Kbv'9&|[-\?^5EwoR)~~H{F4d+?qqh a6L& 5-paꊃ Gc>b-'qpإ\<*RUd@ T{UanzmKb@cuq^D$OVPbiS y[4BjD6A  iNzIx,m%q,q% pY9;P\,!u|`c6[ἴ]}$6׻H٥;=$@|CMWP[ӣ̄gԟF{S(я7-0,c Xrfnlɩ;ˀ>~T&*<੘Q}ա $05T @HZᾚproyGsS&>E.J }\E{(z6q#sC#F]0~atVʽGPbog8>o3E(y2Uu-m@}*<ºDt/e{ҝ!֩Qdއ"_Xe5T3RE יaj0#.2ˇVzӦBoQ 3.hp4)Sl=Pczl?Lyln)nvu9FEnW~(>@H^vil@J7zͧ|V^ˌP".ksJ-]s#@bB,KoP-~(uV6^w$H{O݁sˮ.=Ajz3j^U:c~E_]WnrW叢'RO]l5 >5So^QL>އ9[o#L9TR&lV#/"7?@8NNiQ?9&(u6* SZRP0#9}XLu"ZrZZሲR Zݖ9 @Yߚu̅*{;A!V浬 Vd |%#`hG$&N(K)I % @k\n*G ԚZำM^INV] }>\]5E! =_9;Pu*ǜp⼫;i&|hNz3c%irUN0cBqg6J,u Ϩ[irU Y C7$aø 4vpoş*Ō}J\L;KʕEѱA.|p~DLb lv^/n{lTWwKЀɱ#*KgƆDU3VJoem?煔7cM@a`xj$#>%nD⊋tExtE{ˏmY]"Wҽ> \o]$1=(HlvG}zA];%2P<S\abx}P%j٬_hYqYct}nMT[W>s%edֵPY*L~ TJ,nsD /FIqZ% ;zV吪sOԪ$ E:B(\[QkWe,,2ׁgJr wW6B6#5)q(f8*zrFRs.rĢ!Y2b$F5[Fej9 á$M,T~_iC˲:E R/_m$Z\HJ>7xHs>Pb d9"CV "62bH"}Kj<|TPs5ܿCKp50xgIH{d~֠gd9(`~/! iwn;2R~sdG߂ۂ⿯}ӈ ?;[g #xrH-ˊC@yGQ[VSF]4#@Mq?}w9u },@oA$ xCҵ>%sO;-ܺK{^3nfN>M׆#p&@OƳBt 6+-U@y& )?F0B\?|l8śʚQWwR%$N,G^M`jaʛylT-mcXiѐi1P$ nVD%8L»--`CZ5齊<΅rUWg,6z>q\VO]gkŵl˄ѸX=>4%JS([/}5? Ncw{nT~9TaHTB.P;,Ps6y=Ƿ~(Rbzcfavb*<"uH @qm[ $߿_-M3>V W;zW /[o-E=H:k5?]ϯPggthP[ 朁'bl K3:#04W̔ QQ5Zf.4}Q!Gat"В%?5S _ n<^v<`I٢1tC$R;c7%Кr.t<ñg6BekHE@]2/uj#VlT6.(~}iXѝQx(Zc`;Tg2,4N+vV=+d,:ZA@ߺc H@EYrjEs/oҌRöٳgzO%dɚLFzqD㎍rׅ $I˜ tMγ/[<8 4mNL@rOaN;])qD$4kHK!˻{7pr//;>HYWc!:ج|ˈ 1!q 1^pn93pu$PщsYS%}z6 pv~|=,g,dFeCL vڢav:)xc-<$tρ Sܺh`XLrP$1>#᫳0ӍܒL}'[|_Yڍ?5`"K9_Xm;)H$+'|Ņ bD+@I"΅57_{E,ݫXV=|w5@׿|MQ&b`%i#4Xr=d9~gn}dm}hݎÉ9ۼ)J]{lJ}>O;k\gIDO=lju@(& b{f8MVBgs3Ϭʼn \ H$@UU`ta0(aXDlVWV{>3ҼEQʋ1oT_ i7:l&8 8 j,@t}E@nٞvlUE's4) p#FAMQ&By{O4$/*=/! z>K :^]&,(z|7-_TҎ[>";b*F Sس84p`nʁkU(0hgo{8## :ހP͵Ϻ[9aSv5MLW #_1zKou%ɼo!IBl.4lwW`Kdήnъ,[SgKa+5b͒ Hgcrx2-Jäfd\Xl1Њ[;hʚffS--39}=%3EwFtoHd\O,/NCl8.h6`Zжz&jy`ɓ,_s8Uڇ6v6>Z~)v +C}@->28HkDUKq 9k n9JOXbkshXrKJ(kjh+b;cCWX-sHEs6KZZr 2 i&IX=FKC-@5pء<0Z]-ıs`3;ȎѡfBcDNuBAzA Bo9! R~æw2QLj)kȄOa'3lW% ZVʨYQQfAl\APeXh|lC()~`4Q/%~eyOPR<{cJc9U,iVMJHDHO!ݜLT`Qk|vŎ<=G/_*jWG({9]n&,ʦ9wJքpZ dS ȋ||FG~:\R'72lЇJ~ ފ¦E4gH$Ps_,6wAbk3o,'dƌ٩VZ)M5 F2g;uaܢStLT )]77h@G ֶd9"{82%ӣo@ P9Ltiu4![U /#KϯB3-+2l1YHB &5Msq| <otsGtv X?G=wZyW"#hyZ 4?d_ZҒڬP36Ƈ@nS"_Ӟ2ݡWcA!CM _- x3K*hC~{",??_w"U_7cljHs  OtR&JjY<ɀ2+=ag Vuw+q9)`ڬ`_.5:cTHrƞE1nz&^w68i!MjKuJE{.PL3"tzuDJ{(xҭ^v MվЁ(ྖ{x*vdŀt* SDa*6~= =pJݾ 8P`:ay#M2S}"&9μ<36ɱGE+q-HWPiRv-삳 Jphbsd;P|`ϋ~5Ehs8,7=@ByBfD ?VPT1sI 8ᢆI)c%%.Y䥏51 k#YezMxaSrIFT9@瀛eMq$B%JF .=BFfeXQd;ozv3hV`wMDl#_XyH>Eْl.*b>tn:-{{G R 8SzH?8l@|~ 6Ǒn5vqN6~1x%WG[ (J0$pMQ5͚X!TFaq`BԖ`U֙ArɠoF]iM]rgBs[& 7Z[ Ud%#;)(µ=S]hQ18:e$ܩC묠cWuO' -4zhl*`՟δ$pd->a6rr,}M !W6)As֓S >`<ػV(#l!\KT40B*E8K p5{}_Zlbw#zHΡ{@scCkVm:jԚ{QpUؼ οvS%FW;5"kȑo܄XQJ9VDǛFKr&+ ҙjwr3f(`RR.8:$ Je9F^.Ʒ $_t>y[hXlV/9uDFs2^ݗPey4)Y6[um|r{ ȣ9/^G߀M̓C>9t/ڱWYo*o2A~>;K^.孲d33'c:Ƀ;uK/{ FJR LF]#6;L,4$Ӫ-m_>(gO9?hufJ+]$|+ Uf[%}Jt8R,UT! '%Ee$}z "]63)#3#Ƌ! =o*@`OV1_v;֝G=sLOC @buͯ_kOߡ0FUr 1>M:H!;@yvjEB \Y쁿Fd)Aiq^n1 2r-cns!z̅8NV,֞۶TƱ#yTt D3WCrƖ۳"D6PH%G=Ӗ=/^t@'%@L|x҈,@]*"ul `5EjL +.96'!}'|"4`#⁳Ei$`@FO;Cv典l8-uv˥V{cYڗ3t)@M֚ۡ]X{KVXWB9zN14Jcsꫭ٦k6S5:m CƆ:mxlmФ!Y`DyV5B%᪉4K٘ivV8#" m<f$.l 0XZo_ؕC~{ v5S\ݿHD }K^l|k;eUV >o|D ]WY8;jKhMb%'76icܧGkfƏ5y1_.&nǀ8ĕE pJGoOKa/? U؄Rd5^lcE6 v%pG%<"`W&{X7_/l"ɉ d2FOQ 04̿%Ֆfȓi!x~T7lTAM]7a8N"Y9-T`zh5j&N1߅n̶aE+ W,t6d,);2R?ҍ WRxeW X(2"w $#]ʚ?>4=>/YUWza^YhW zqC"LP7I1.(p$ IdRI} ǜ-QbU_؛C#&;}h!0 ^>Xsbg:1Sh[s:&$ž3ʼntPAOR5lCvy{E$cb$r8O žUx8f3ӓNpy•m8U Wqo\#djCPdVk-/։爓Osl5.x _XyaN8܁nzxb?:6qhiwXk[N];H]BS.)n$Q%v=![o|u+je>Oy7Tqu%\dϣ;ΣhfD,KC_ z,J>]N-ee䖫i#7 rLҒ[cD}Dg}mZ sBuJ{cdr`Ȱu퀉!nZ2v8,q@t-s,LX_[#tmk n1gE`L6nn#Wc >A'Ed=܂WAAjCDl D?^PDmNfB n]iss +iOw V҈ Șm L`/iO|kF^#QoN/&Ynj;efdDyyDDVnL? X9Xlg4n٘@ g,8BWLcab:w?PgdX n8觜#3kø]ʷ+-ȍ/yQ*O cwZzOzDd^mMy3qE77~W Bku7ic()SvЃZt ގBjUA,v׍~Eź;[M~Q#W#r$N'-g:͸#C \G@YRd;hDP1f$ Z^ғ":L,ͣ0$+aL[e~KrCګ]Vg#c zs5?VPz܎k;\Rw`o'EgeOʇ3frz't#Opjjɟbd9Jr~􃊒EU?65&:W jD/}g{K*l`1},W!j܌#3 F"նZ%>Z,hbbZVx4ѭ0yׅv,w]^37I Jv"a`qtrhuռmN 5JfhMF4YT{>6\"{+6B{w 1hq7#0 dqUQL;j̾jlg)rX],/X5K[ [|O!,Cwa=nla3vLZд bȕYx?JioYh v! כkL.ͺdN> qd!Q#.4(yDD1ނ%s#Ȟ00.Rs_ ubҗkU QS8nd|dԭogV~SwyS=^[onUhWȷ+"x!)1]:yFžJ}}h}*†̓5oZ;'6q@#KG0eȪؓ{EK^+ 4"\CѐGjxlnZYU9`p(RUdl/|OnJ|-rxD?t@S*7B)jRx:Znmeds?ޑ4?!EMzX:MYH:HU{wrF Ս0(GrU~H\Hd22ӻs~G⟎B\wCD͇M.rm,M"뵗L 8kU{ܖhBœ_[ C}a^@~arL.F!0QNt2⻮+"(}'1Ỗ3QRހx]+Fn*S]{^?Eq4y8G,]K [$fTC>|Iț_KQlYT4f}A{ڙ^w \{o]:I8"TeUyU͖ f2˝[bMqD"\Ad%g 2=3+Xx>uĕUnxHv<oٓjApȥT>0P>!0\ w˰Q}85f &KQF$}+IFuS0-<)Taթ]~e>{"e,G\0aK׮Yn?v:Z{Qq0D\VScv34v2dة-1 s,k(N66U]AxfGzvs𞾡h*fToEA\ R6=~q3<<ښMBL{բsKZ.ry!>Fqںy AG)۵(ҹYZXpT\hh&\XZ,9_K|74s.4Nh>I^[6mQwRnR\w:wk'b/:l)#ueщXLG"+1NRGGn]O&1{@2O`䨕 !k/C*C")-N}BXGu kˣY af/'+ l' AY ˯}ʜVԘjuVn\.~p ͪ趌吾#atوwg#l0 2Dzɿ!_~+xt;73߂xDKO6.əEyS(UWW/ʎTEHǷ *iNFci.IKʝ>wą@x%PQRʸ2TB \,z롂I׾9{ȀOX)Ogu<~eK_eI%QHU]d):  r Xm:3&>>cTW+s[$r|HpnsLJy$( x#./'5*9F^m Y C %+vg·0-]@X&frOn~ D"qU^r<"w<V  (nQ'?xc@aڜzF!L^F(ZDtJIr>~Y?*/4>&" /⾪Jv9zP* ղIMWE3KF2>%\чRGFLk.ay-r}ћ4H義b arAH765@NH-oo>]ئ g356~{<{n5/.m\,gʎYg: F*Y|;d2x$F(-9C920Q@i}KZ~] Wei|,gػW ݛ@§|,TܲX> 4mBQ /5xۭ?M 6/!VGXMt.y!$rf4#;;9!J$c uL:YFi[a,r$oîuYUm@O0uX/B"&T8E^rcxƼfK%6vtZ6K- fDuXDaaqjNʍ}RxĀ4F*xֹ8k^Fs+'yASrӈ25Nur걇&-OL͞ ҤbÂYizܞD\II(/ "tf 3>pġ0 $#Z1{r D e"|l@O|, (F?!g/B ݁J&vX󈜗]WǓ+T>,9;LmPz%Zl=ݾu%|/5 5cWpLE4( m`"b zD(M}m@胟GXy!^ɋD C1#]Mh%E!,DhQEBIO;NR@3nk߿?1OAW[_W)& w@+U]Gfui#e|[udnNTV0Č/cVpGqG 5'0~]9[pO^$&z?Q+o =26 va]C0 !`T _7+b)~j{BܕLrY*K2 9< S-0}9=r(}0Fٕȥ.+57;?3AXF6dOXaeHRתDR2B&#t06M#13N bVw{~lb=zdyEn. GK:9?ISŸhU-j̆ ]6*<3nw{vbRk3e,ߑrfC;Y7臘XvνR |w\vi70o 2Rar1-2 "CSN'JA=W5&9wpi..FJ%48(?͆"6*Dq)OL5YD&g`=k" /mȥ1ʋZikU[3KteVIڼFp݊Ka|sQ kkflE2l ykH3m>osXvc]70.f QgT硿V%*I:?cУKmFm|)5{={rvvf]{/O2Ci͆5p4:ү!~ Rܹxe?*f Cb9WA{ȨOqK9nٓ)9W jfDŽ#<Сѷl O-:lW4#eę4Ccf1:…;2f42pGcz!>Ղ4쳠Vs)O&ML0d2Ԃ(f`c҇'{=մm gޡnZ< 7 wC{ʃd9ٮHSXf28#Hln/ [F=(9ZyT + o!3 o5Kv`<ɫ:e["g@&5H̩LǘJZ>{vDYP,u,k'ҁءWBf\$%4 j$ȵ}%C|rL:PЮ- jtCxӦ1M}>7БNdÛV(pHMj876t"LI![_GdY/7)RPZ;@31G8׸F]d?t op9%YMՔ.e l|!q*il}(S$E&7zȗeoIg-mC;kO\hڧ6hD%fTǗRywG|"1_1 Xz{ywlyt,?{&F2rR9>wKR̺xywhIΒw9DU\]uOG̏tI2X{"I/R?Yx ,󰖂^*۪ %* ,Rܡ`j?щ] ά"0y7ڟ+~FM5wl"W9Bp5{L%QCpcERQCh)?!bviS(`1Ġ~N + &+a)8 cl7*dw"%nB)6W-sڣ5D -GmhۥǞ '{|!5%?uN|kgC+ftaQ.%~aI|PD p %Oe&_#+5P5ެ;!qcqZI,xҀeH uQSxz2ι/u-!)--xC*Bu=0%BÎ{OH?DjlT.`Ch9IyVQADlkՠxA?~}ah(pĆ# Mas] Xp@tBW]j,@@6*%&WE]tC>jrK&^ݷ~yaphW"jmeA}ΡQ_h _f:ؼC`r_\a9L^`"RCa?"ͧEg2j` IșŌh7I+hv*_&( \Cʾ Z -]G.4 nQw= o7_ORO)Ra'2z8N$y*;|dƑ퓌oyʈQB[>e%m :o Sk Vzk:OL Io*cU~e>׆87]>[>}.o\v_g\y3zBЍ-'P?OyB$J.iu9G/g$Up8ߝt`A˟"տջ%[̸;J_ )?. nKpFr LW)j9UɠN4Q?P.7*/`Y`'"D ʝ@r| 'td"QBU"u$)@^Q]X6@DLNN uzx *9:Pz b5 IN|?q ꃶZ&KLX'!{blBVBdɾh{&$GY-_;iY ʧ*C*kc АZU#PrՐ5AiU:}:nLJs׶@v>!_Mȑ/) ?+LGJNCCb>x@RƫX˜CYTgFbRZH< 03߉ILMqjTqdRrћW΅sMJ6UEvgsmEQV|oXp"9xmS^o*|0TKXM%ïWlXP wpȣ%_ZZ{|3Pwd1&EiLCw߬"tM?M W:h_ !mkPi9S_)q=QB5-!_ ]j'9xOk>QPT+O?<#UjLB)(ɩhDH׭ӷ3ݞeewV9q}x -͜>^G]%6Pqopm $6BHcxA&+MJCSq}{R/MV,Jn't@5!SZp U.Huw2^7`,0i["HyNf3PΟѤ &i`Lcjp6+~U*Q#q,˷)?p3S)";뼂IcIpũ~(Ek. M3 êIeF`a&T7=cZg1%t=H5DGc{۫ ">%P™KqQY\wm2ȱJ9a Kľb^a^/+LQFV}Iv?>T7SWk5)1Bʢv 0KF:OZ +X~"S€zq C[g1"]5EtHk I"ć"wA:L[ &='4q24ed͹J10קOSZFC6.Fds # A=E|U: 0> -Y/:]morLhGV_(v⿇Ju#4ߺP^Wy >( p!a yD<:I;)J!ݴ, fq36?&\s xdy)G|d!½VdEx 0q90b1^`Q_ ,>7n 7G@CЛo1H#6'w&m _Qԛ#1=b;;g|1b*~ƝfgE/ In"r}ࢺI"EARo ׼v|xdÒ]u՞\:"lNu)'Q7^sj'(6F%@Qyd\k7# C%w IҬk٪LL h}B-KfpD8E&S(nRϺ]O%EӐ{"cW]GzH vQjwoLtN0)薿[+fG÷`ӝ6X UuX&2{kեP,hx~U=>^;3PYo87hlM&2VEQSed0ٱ[<8cs,qG *$7Ps~΋ybC)x7pf?={v`PSȑV*JxBmx0Bӊ X7Qb|hpZQV_˧&ݞ&3"^v:VLJ"kIoJ{O4!ê+Yix@Ϲ>1'H: 7rbz8YJZ֟4f-PgGjn:ƹ'ڡi7! ͎cI񋁨qj0l3jey^ l` Ɇ9A dT6,m}Bw)F L~c< 5xۀ&s(|射/u Z~GE/s/Ճ;x9$(BW؆@*xApqAº]Rw4Ku9کg[D1,>;n#gtپl [iEY#ܓ-⎻SU]njO4J-_e~{jU֬ ݒc@)Z )Smc{鹣!H͌mGs/㦲ӀsedzR4de3Ɨ܃Bɖ&CA`V@p2/IT.b} >EU̒ @e&rrC8>#A>4mDN:!MAq>kːtjkf)➯ML |Nmv2EVkR-[àFt@Fa'YqȅY_rR`I)dbLz "AT[[L |nydsdGÝw t(oX !-(&1Z(2MW>&R"w_V :;.т %O,g%k^W vJ,?&/Ooap"c 32қcZ0l,{v?XIJZG6bmBQ}' ɭ;?Xʶs[̹6A"pܒxE@WpJUߧme4 7xYzJZ'PRR'\uo`K4+|K|_C^9hߌu|PU]hIRp(3ŵݨTlCUxvpEr62#<[}%8mPW#o+<1hmw|]x4oGn> QO(W ]5( N3w>Y^ڠ_3]* } 9~.M(Nq4}98Z >E5iv G(9*=poٹXT"f;N-TY(Sr܍6SMxp*sQ'iӛLhͨQV-Tg/gjJxʌ^ );j$)>H.]? Ek[\8羧:޽SzdZ- Ŝ)T [HCnsVBvlgD.S )598,b֕5 .8cKmԷBzYX6$HCM"wxT&\Ӭ(QԓNb;Or|>Q.8~eF%"4)FƆ-DdmW7Y6NLLlҬj2uz#Ic -{1rt Bɐ1Aee}I" AR5'#0Ip'4QtRP/]M 9f@ΪsE;֩AtJe}0 @\[Ev8 rg4D%71b!x{a{8FF>ʴш ˡHzN&yÿLu\6`<͔υliv;xjL8(7QSVS*ܾ4(gjkӶY(2=) TF=JH/RB2KN1CK*?e x}c헭WF<_(FMh}~{z :3"Ϛ)y' csuUMy~lckѠ8@H6:/f*qANZao,jUΞa8LN)3$q. F5)g7{kGtm^TIxYk {A7>~# u7?! o00(4w뗫C r[ Fl [7ٚaem{ 8 v*s$S۠! 퐢 c /;ڑU[ uV#f֑3VPj d0M(baBUeD@8;c]{ e NY{_E`'>AcnG*r*UV{gs v2LSlr!T, J2]AC:yl ('jE 4R 'ЖC'v#O _bfRË@'f \tPdu{oZ[%>f-@7b#:;, _,R\ҁɂv4v>ll?1nJmR9K<=olsu[0N{q7<9뗞CFS"3)5jwӿ޹!V@׼f60FZsQP]!6@!BE̠Xw`)ڎP=|=%Z(+k"'5䙎n:И@7_M~MVr3'RJsX(hbE]xWhg@H.!H!W0e &mO .2Zo.!9#0\8ɫYs>B8kjq / +u9Q5/]/czuue@FWV_JW.)d٤^e( 5 4=iZ&g޻w/)Hֵm.pIY^52`ҿ󟗅2K>$K|E;4'6cSSHS[JCC{xu5nD$ko ^ȭб78z@6L2 ;=WaIk e:Vl)*s`s[d_-lNo4`[QrG'?R.VuվQwuo=2JXLaC'F.ob36cΌ'Drs|Yؙ5(%0@|ͼCx<3)@Z :GvT. (;lSQjnS eiwf1*&0!RwrweM:YYŒ;WOKr- (GEyw r#3L J`G局ٳ*"c]Ao|JyCW>ޙd"aQ|vadH6޾}Ew:,c1i#ݨ-Ei!qXmEєrp|]ۓoIUiʓء)F3|D JqS2}+qtl ƨl9>(@3m,|yOHhdKj'n")z/H5*־.Ba4J { R/jr{|4`O뜵'4DAcr+ +4)ixCvS.ݺ1!r}gJRNCX4h{qZ6J=P6B[?W׋s?zM]ЧA֡C2').Y$ryn!&n mAv "iPREDpe nn#-u[DN1{9İ^GR<:ƛ)w[f"ZeVgi邐WaH:NU5X" O?CDK :䅦G 6dq덙.'Ȑ <–:_Mǐ[3mPMyl %bK&Y#8z'գe`Q/fϓLQJƞtI[Cc}1ߜd4tt/vg>Wnzs8|x:䜚* l|#)1J)ȏ`r@ӽZ p̵̋ċfX4 o6A\ W&x]㖊4ŗmx+o0A-LW *yySv2 nj5oC1Ts͢TAY[?Ly< ɠs[{=k,̑*_MmJN{!"7 LQʔOTe.@]hw@%1p+kJ4Vy=T2DjMA22]@t oEegdܦiM+Xc(3WYl+O)l{\pnCL`z ߢQJeEnUF  X~} >g#.RrT/E-5Y8>)&ޢU)r 2pjG L?zww!VB)순;k  V A GQkE4(g5i;m-|;r_W.iˏ՘x|\oϝxqEzHC|[A͊AN s1]I,<_Oxҡݤv g55ea; \d' =b)/Gf f߰2qE{/W(RgwC_SQ Y3U\;:SFky .~$'"[P~Pmͥa08O^D7ʆ*sT뚹2;Ea~R4>G ­dpiys!'yc"H0%xC[?$_<ࢹfX  /EEitK(Dz\;X ^[7lU1HC2nG/{IvL(g rJֵx rpvï L ]\cD"|0TޯfTB(kZx&XIK?+nQ1>IRtc,ہ׆Чk24'K[)Kڛn$^'V%L==H-њ 33T&qKUb p ?f:)QK 4s15y0pd9v^Qºg:t0r|WYRq锫3;m^%2ϐjܶ%K;*v3GPjЄ R']nV[[`ĐRH̪FJ&GAݻ)cWa 7(Ա$f|W _iǟU:Dϡ&KGrH'ArKc1}W'B%H$aUM-!* 3?r^Ӄp-$66@ ݸ2^X O/TBG5vusޜﶵ"XG@3FK_O{a~DvllCN&3B$ͺ gZqc9l+SkuQEEgu^0NG=[q7}tJ ?#:=.,9`U㟸3 Jf:"&zP-H- z>MJyj,ڈ4?3Q&LaP?Q8n!UD*5N Nyt ^+E~[ߦ_ZR<[o1vf VgqNڟvk8F]-VSu!@wre): m|}jPz۟_%BH jz%eieg!r bϻg m[[Rm3ŇAi?᝝q wrYx Bp}t!vJy!r]%e/n.tf[IK.>DQxt᳄x\3#h:|j {I0NvѠ51XhI A[z+OI5i}va)]o.Kr޴Au^<>ꖜ60|K uk>Qcdu[P ,ӣ>W7Ȃ@4wz K3T 4VFRyBD#sbIV"i\^GMn/P6 ZdfsK@ѽ(.|>!cFK9 h\`*Im &`?rX6GQno3BtC8##]uֳ+$*x22V;w| u6KE+G,p⫬s~k0+2{qlwr*h Tf-c g!IR{8qxW2Qhٗes I{eI(6]"s,ýQ2z qSTzg+TY,RO hY)9(NҪιu~̓muvגD"t.aEzH1cKqb?U B:žs(95F =ඤ19F|_*b?aIS{XsU $Ugd# Qt]YkHH2DZ)!O)i@n}ndy>5=K}PvFS8[[ M'XL珫7wX]a g0>zG~" dVݬ37PKhchSoB]0Qm\ f5Vַe[4FӒi/ڌYSv[e?x`DtN6+$챂/a9ngDS Oʋ6a;_ nw+4jծZ~H'T `]@k S1C]ޖs7xTU#sqO+hЌԬqGH$\ 0+]KϏWLb SД2n?dIq]B@oc:!N%D9I1#<#UF8>Dx U(::z?ETҦrXA>Ef';{I0yGrpdm5I j&0\ FҒX3vc}t;r[cMe /9>aqI| iJ ui*bn턠?[o< BlX:CrޝF ΘU #.SCaD*̽kЉBc\ #b $҄Kb`]8YΘ[|BYJt2c,!ǙԒ){YB13`l'!YYl'/? $ۊ;8cf~C%?IYn:O,9(+#E\R/ѱ Xt)=gI\Mc<, _st3@ fv!P 8;FDQnsPR,'Z_U4N0WDZO>-En c!WA}z8ߐC#Y+ ZVA‘F8.AFҫ +GlR< ="$H.TXÆk] &Ӯm\~L dP:Π@N׽L"U7C!q1T g j8kd7j^61yP1 Nv(&aE:)l #/PwT&~ AeLx e`V S|0`w,_l\g3 Au>)%r HOe|"JݽV*p'3# hWraf&u{ݸ?c0VnT`F8ꍵcڞ'ݫQ PP ~k+FCܐQLQV48'rzǔ<1U( ,$&wR@(DX.Ilh;I#夆YxJ!{?5{a}Q| g'@E41Y߼" EIWuH*Pfwa9`\^tN2a X;V2ev^L}[Z_.+aԜc`0LÿF.7I,ܛg<,sc ;$+ndp:;oB9x{tW9yjѱ\܈\BjOӄIYp\ZjEɆv~a84,;XQNX챶 lcJK6soɆ_-e Esx|icKV-D\d]WvkVkh S3'uamg-b8u(ƝvʏsU}#فB>O۱4tWhn¦MkD;;` UNcYJL5VS\< DnT88U;<tC;|BG`:/=P`=]#Vl-~k9xK^+kǁEh4BpxW0`75P%׌C'3ǹEl v3!ICJxg6I8zɯW8li j|4.7:=* OTshbzFMk'YwHMX>#޴6%8(z@Rd a0xds?E2*,E:o&KH%=Tkt΅,}/)%;5xa{5Cr|J wjdec[ߔ;qCJt*E76nmlʢx_,Ť?6K "gCсH}GQW>֜ 9>x->NgT/PX0T劼c- }zmNn o_n1PLM52aZ:D6kxxjHmdpp ܱm~A5 PNw &]!UebLzMvm(`"lwFLIhn}{KGb;1=t]г}wQ[M5I) |4mK$-'ݳ3@QWMr)ޘbeM,听VDŎ&3qK|ҿNT8Cj 3͇_$tǩ`؈Y`]u; I>* iGy&eĭ8je~=ܦ{' ͢@#$#G<P)d ^ JNjU^11`N6;mV"lfExwj|b,*`IH#KJn":SYtC^ףr2XV "8 I2دGh&LmѬۋ$TBɀSHo$Z SkLѠ>p7|d{I@yI?U;zA0m@s(}A;6e\n#S o~&3Q޹QW``ᜉ`Jn5#C?\GĉzIK@\o5}]W* 2w[~Pbs0筍Q7f{aT/%/[IIRǃ-LbP;q6=r DhSu VN_#џVi),c|_Qtݠ&#^ۻ}&NCH,">{5 v1+5,讳/'2sv^m-BhG"^IaQrݖ&C#[) C#yv VO^oN྿S,Q\JZ[{ŲQ6KEHfU"$UN#pTccMAƍ Xj{:c^>%Ɖ%,BR=_H\=:ɇ ;,R)QxR bOGWU- 8 " [i (VI'$pi:(XVF3s2-O݀8(>5\3(xYN˭-oև! (Q_<,?yjvzg<ߤipɜ,=a .?K!)hƔfA b xs 3`?N bkً}{,pfT- B bId50f.17Cc?Nk>TF WvP$@;o[q%dz;PSشRA?Dq&=yBSZO.2l t9fd4+X#ܮ5%n/.er`3"ų@?O!oge<{:u[jA@ ʚ|pPoh\?UAHI+벌G7CwAul$sόEEO*0yC GECH؊v ||} 1SXj _ [*B%.QӦ.Q_ti*^Jh$:-6W cJyN.m\Fr%*=磌3ϪC샅ڳo<5!m+.VeXo.PuSL'NdB` ތ:JgvvpQX}bcw ^1FeڌO(lP_+[|eLdΠUc l#;v-畩ǕQzL$NąM"ߌE^SCF CWkH??hLKF2CbNd#_]ZehI5Aq hIOC9ENf [ 'ٕ9Pr<_㭹?ڭe|1XlIUO#` 4fcf IaP@u2$6"%94tTڄ=d{U4_g_j>aUAo"GOH1Բ&[+im?Xzd>9ԩ-RU֒٘ZHB^=xӋr 3LjTo+q~/ָA64'}=t\ 7u(si+6L 9V`, }f"9GŹ9`)\۬g+Wi}>j@G呏OCGS/ d#i%+'Xޞ~k.FkP940:{V Q-7'ǘ}P~?_,INά4ڻj(5 ?I$ghsQDpN@axmr/@c] 6TeU7SY6)K@{5?tbo^uj|Z\asXG>ȁQ|zAk.վm_e[uAPɅT c=ֵaB}yg-7@0wMZs."]}}S=1;^aS;Fqw?{7Ⱥ:p7*_u=GI@"mr`m)՚W Ye)J!ۮBaԁ3Be!tj.iظ x$yi[ dE؊Mw~dhzRO;TZz<5gVzhdH P[D!mN'uҔLMRALetgv\oL2}TP|esϨ D1R`fG-M=n#` _cRQ)~*uN.1->'8 ٣\#J}L/:0۶/詔\Bϛ ^zQm ( jPݔ|ɉy$1-E kHUnH<jr,J=5bgϑh"V=!ÖZ&RMSi1fF+Ц_&ޭeW1ڻC[}@Ҍmbtpvǒ#POЇ Cw'FFP[K xďT N/5FA~dA'Z\'[ l8JDplvdC2N3,5`!ƢkRKr\ hǵ 'k2CeN:D6aԚ<$zW:ўK\t)#gͤjγV_}=N WQ>E8*{] aW'v.2wJꇑwA+D{l ּ$[g<5s V3l_yCbÂ}bkKa1vFm{`̻wU͎ķ8BCe@&RU<ۓ%='s[f. ^WxͶJAG_7GXOr3)cʲ3iBTh=٪ʳOC7t]%@-իj)1_iAF{0QH#D&qwe i}V1%1se%o*lsS/s gH(/!"gf[ezßRػ _1b,`w#fƾ('Vk{3j *cm1Μ Adԭ'.BcήS m-0y9W< oAǏWRʡԠypA՗y?߈= YVG|ԯi8W&f:ŗ+ ֛Ԥb2 KB+0]pNG g9yN(uvע3dZ"uT1g vsfU~p5VE6ϣE=piJ Zl튐؊iq g5E):6QecWAQM>SPcn?py !RHgGac;cVMH}UWq@HՒ:?4lF&Xx Z[/ݏ=U3#*dW|WHyC¡{Y ?|zj oL~tn˜; `^I69 ajx?wjP^&X:¢ m$/י&zI}$N9tDd- (;]vtq5'=4m&gIaBL.F'L֌vd?Yu`W.Vޛ.1$$/#}Lȣ|^ P(#2:q#'Cʆj.够,Nγh=a閥AQ:`? 8mokVؐ*E7q?W|w];lbj!Х\ gx~0o8V ¤؇cVsQ{tA~ԬwNkq׉$Ivw<-鰕jI]KȌv}w񧅍ʼnB"f;ai_͡` 2(6]9|HDYo۷O2O8i{RUv%i֏R8XPo qr6O E\. oځ'SKkV2 5k&jaJď n#`Izw$M UE v!BuoK J0y~9튮lTFa=:^9I'[GkBM٨h}iTHcr뎅j=]Jw7WZ퐝2FvEN97tʪdė9 kY0_8nQ<‘WѮ$e{EN0 Wzh TL\czQ2 I+H$Dt8IivI  P a&khL>48eRKcD2 }xU)>Lmut{(Pl1AS5rX^Q1@H3C4L婯1^:qIC~]bZEۃv.=Σ2;`s]ଇyJ1/V|aoRI|&*Nxo1Oe@񢬵S.VUᘰ`zӉԙ|qu0|Ć$Ey"Gu[k뉵U=$T!Mښ}/E|S R,aRu}/x~FAڇO.Zn6X #)/40dѢRƐDG2t 7PY=sӆ e&mM۞W/֑SmSR:)a+}nMeX[N@m CT#:OVjqܗ 'ÉF9A+.Gbo-^W'u7ϘhK%.#X)Ǡ@zkF%Xd2x M"5cxq.϶đJKC zXciH Ɉ %bMܥ7qm$^ UⷔjYp!G[0uTԸ;ҵn,"!<1G*0daELl`̽W2;USFp#Lӱ_zq*v[QfN2$!"k)z@U.Ok92M֟/&4M,wUސ#jfl(|;h.[ɂ A}U%93lʸ #m#Y̐'/Ŏczlulb4Cޥv{F[De&AoQo@TI$W-h¹I盉w=0{dwr>\잴|j)c~(` )ҁmL8ߜN(ꪢ7([Nvd *wh9w+IquNW0@tĮDt/qYw[+kA~wPYK%G._DJQLAJEyH*ݘTiqS.e]kxJ|qYb[zgOoZT Sň{$#]m0ti̴9wTCMЮ5mА rrڊck4rWZ \uUH4I86b;/wDa& ls9言y(JQS%r+HׂaSU3Ƅ_A ~ XSy)HF‰i>pOeKFW#5q{ \7!*=\WlfUDBDP/r#((0 AZz,eb\|xssP:t ~@U4s¢Qn&MIKW2wD~ʜJݹ'|rE{v]ICEvw1?vH_]ըy:~ĸ嶩[v| Lj.X<($R>e `HXeXiRsۘߙ A`2Z%FYÚ nac6.eSg->5/kR@(roSb$Ϡ_֗7 /!*zY 6TI|uK9ӬY ΐX{ 1\lwkm'/,͈v] [8ڃjm7^9:Aպu4E'.-JAB&/Oe:G}zڇm1IY. d7Q@+;C'lѳ{)Bޜs&ZMbܕ;S>9mo>`VZč铸."694fQ-r=KpH)Zќ2!dO $R7=dۅX.W5&^¢yS^:$CՂDRt3D)}6 5YgaWMf6)k@ J|9PN0)x?;{. Áx+Q ̏MYΪ1^i"^!=v3>\T}jm\ ꙊqĿg\mM_Ued(%"Z\A\>@?ĕ,8B'p ZFp(v6c$(6I԰Ⱥ;ll(-sيÚUob^Ew3CuGZ-%M! !ݲlsQSZdmTkjAClEpJ?]Sv,}Ep8` n/%Cmf[o仱Akdh]?VsEmn|['QD" ˝k̽*3Ȗa^ Hsnkd,u xF EBTeqm )D»}'n6|'B0iZ.Z7:q~Es'  XM'k 鱈Dӣ .gj ~}ܾ=Y*|7(kvs4v‹&hS Z;=QQHrH--z=Yj#! g)C *ܦ֮5͈'/[u/$Xj@i 5$*3Ȯ}}i~w&X3!L]KWǮZ F|ʓtۘuN>R)cMPtHo )w=|,wю UIWpRV C~6JE^DOlFBgʙ7WHZ'"XBN~nFh⪻y߭grH@r1 ӵ;uh ]TQsw08"0ʌqv-+iN+ ǷU>FV!JZz35*^ D FP/b%eW/)ENw dgpͥ^STz.4dg7]ڤzߥ),j%8tn7Fd_ܲcVugx/! B7ኖCM #l[ӚoÒocaL<$Mc /f'b ؈TD5Nj{f]rec.IIJ尽:4$|-w@Wsc}$Z33!t—_VʪB(c"i8kM$Kb>&ɝ"\ o792Bb#QDE ܲ-Km,@)"ȁ(o.!suhN4s ]J^PU{\^5в0(D {d(:4Zey@\b(_H&cG 3?/8倖1Zz~/5Dy$ć7s<'NR -@$]2kߊҜH1t)Ewt R ^:y*W @ko騎(_ T.4 3ͱ:G1_ ل"9/Z~ְ9<<"Go-[B9 Ƚ%uxwdZ/㡳5TEZFqg^z TN?.Ū,:;Q^AfAylk#X c0*q7$᫑w6MA84XVp2m0op\r&\W0[$7kLCY[ jw32desyԤ.#~ٖkIߺ C+@ެ᪀7L[AַT 3 ՚%w낭#yus37WZ/وtDuvǤudk-O>[\r- ҫ5Zq) Thel.,OvDaNd)#yPzkUsbOyPy&b&̳5Ȅ0II϶Az]P",ݙSLM>Ym&OA ﮑ՜%Y~!ܓlW/)\9vτ4 bAȣ)%4M3j*yUSQgԠYKwM{k ӯ3!`66 S񔏿OmҥU.yDյgf9a 8EW9]eG ڬ4C zeF9jK`ޒ׍mR~.6( ΎHED»C#u !ʏD$*om c:(i6}~y_.QLqMホelhP,ai~`C 7׌hUZHڼ.[lǧyڕ`!%O1G o`x kJL窚s TXݤ|E,-J`AGM )6tdvDr  ө4&Uѻc1eܸspzs^rck[%MI6w񃋢[ E,[޼)eRRqS:jŹ'p6&yDZJХCz*\U> N' 5o a6f=Sd+Ǖj%b7r'ȇxT'<9 hwY!kUT= [%? *QNwt[mL(F @t)D%i/ᏋZgVɋί2+bّvo$hټiNRIRgDڐU-le"w .9ĉdO;f'k:ֽ Tf*zp;qx_45 Z.fSx}OS~9l7L׹X[Kra sMɨa (I8i3Ʒ"8a1ׂ5/r-s$Cͩ{64EצҙRc2q(pn6;3TCae^҈`\Ё/K}̦PreΦ[@SpM5wT_I"pt b8;V9|]CpRsVGk+@8U~T@sgLHwIGN,ăo21)[ǷHF+ ~uvk|SRO99cjv;5ˢD~"}@ͭ817!iyc|v`?&x2( &2ƌ\bur=KTMv֧µ,]lv_E$v'_*Hyl`zڼ}AYF3#ے⼨^ɓOE7P'ڼw~L h|?ZX+WrxㇱuMV6n24vVN3f)4Jz99ԒCV{4*E 3ӆ񚸢,a3^(NZU"^nO##j:3z/.!Kg`{ɵ[>+>,ځ!3G =f=qRm?J_M}t6e&mQ{LQ*`.7NiyriYӈ/yD]9)N,T1oKݣڡzH §rƸM/ŏKߝ)6+)rl-{2<3jn&Mou ]c^Pާ[-^pJw+{heȱ4JoĜ?t'#V~AALt_TzaH'x/aq~e&(ϛgP\G$sdw+fL/i5|Q)jx߷ y!DƘ(C%!" kuq:^ldre eBY<ڔ_kb܅X\|]֬_8݅9k4PEQHV?5yC@}!fo5Wnjd _Jvl!Mȳdb;,;2MK9n@[c,]+R0dv? >a@-),Dq%Lc?7\S6@w {2aB~c7L>Ӑ|kmW-'pd!``jiMoOiYu [1xt=soѹaq/)]B¥vK)?WHzK<*o*>"@Ԗ #02>4}l6CnHFu У P c_JgA}GlH- ªMh)-َaamSH$Ri'9)cwp`bW9kFUu.Em*ZXtG<(݅Kl&l,:~ٟciI,Bݖa);N1kufGBnWtG`&qg(5'_$;)V&_:% 'Ԅa*FHϫ 3Pm~?PVr)JwkKlJw)d3rzr0Ψ12%э Xs>LX[=E8erAw9mo{2pqnu_5e\QOa eg5I2s2=r[h6:;i5L5:&d:+fm(ܐ-8ٶWj+U*D-ŌjN}DF~~fچ{f8(0'4>|H3/{k/jTsԻHz`MdW^UzRe{J{~woSFdH[^rqH seN'{C0̐֊4nu( Z-Rc.{D<_Hph#E=fyd~⺋M>ѣF33zՓt,4H5@hp*^jW=$vhEYs؁.~Brq>J`ZF-Du޹qg] di(|6k"ed7եlP&.FQ07 r[%0~|X o A8n-b R]zdlN6UDSKnȃ7p/[sճ'  Y6M@@l0$WXqqP U\`m&;+Lj J-"_ ~αOV@|)FLhƆTD}@05 TSYYU*igsu钰wh;As3<9Q*@xV o÷DY et4u8wCDNnW(&VJXH@Pwc_I)a'Yz?> Fe&]1+]ižPwװ)KOYRV~lj=¯ YU3s%*4i|vbB QV#чŽcsa!U!4?3:r3Vg_3SXugT6oC/HB6"1CoB6'hXS$JcE R\lITrANLrҖb -u6k:.{*+#K|q)/j}uO;^V#zNK^X*-Ҷ0# =`@#_zwГW?JveWf cʜ^-^~6 %VHIU:Ł9یn ˉ+iλؠŎ׉V\-2펏8+B'8pNx\޹y}PR#GmErM~F+|ElBGzf<l5ڙp~lVZݽͿprFߴ㨋!2h&f^ԫhh?G3mp;;\aDrIڞ0IQxzPj´\͈]a;r@5f[W6 C` QSO4mtrlؕm%v$G0#bة p(󮨕0:Ɩ_å甼Du]t,jtlʸB\ :rrCND޾ dّ܋6pJfF BMDxPZTG6q@H>\Hݐc\r$ %S4,^hw˄j鋰oZ=3\Y!-Y^ JF!Xt&ߔGT 7ò *E B HQj S=\r߷,M*,$:_Uȏ;m^}'#рޅ61Cd wuHOнC ,ݦq =:܃1# Q'ELz"$ue_զo*XSc=-ed Zʄe1V,8[1zTO|rbQ]VLQ~j'Cp,97Z=KOgab")s(0]I+DBL_\Qm̆NPy!;ߓ5I">!̒ݓvz9L^) 8VnGbE<*[ԭ\ ҅d18 LM7){2#HY`w#"a{ 2ܴCd_ٳTN!E P?{(2Wq/M n}mxe_,9Se|2)SbQbJ&tUNX[leBsZhyBLdK.xcLQhmE) tsgNɣ0:[NX5Ǎ7xVAtW"m!Z*kCHl{GϢn_hKq [+w +{#Ȕ/ #ktzݧ6]#;Q 1 5(BֻDSCLBxϴ?^;_aI"&Um=_Z.?voo@yk bAtL~o rny[:(-Iw/;:-U)H?$kštVF.n?.ԐlV I4dLӊ7(awKׅ}BzZml|/w|̂e:vӅ%Dt:*ډ @S+ؗ\RDCvcת,ahV6|M)EEw-'1X RoˌR僱M_3wӺ!6#zf]!QwtS^Ҡ8{Sdu2[ A`VР e|xak$$}*qd3v$n9uO/pL`(]ݤ|E*T@ZZ cM.g 'C`*[6 4&YY묩ab(P Y L)}|cOb[`yjhk R` I>8](lήa):#o=hO]4p2kGCf`"ŵ~|#} {\j5VG& DXd {ʱ_<9ɩ/LYibSԚlaiI+$u; oWS ȫ0bW!Ȫ:op> tULKi4C2jF2f_xۍ"`իH>W}\抌JTbIJ5<㗅_t" 56:!eGʗ%q<ձӐҢo"Ħna0 BpɹB`m{t?Hi]'8\5)/JKCLS"/I,OH4Uu0L.!%Jɵ#8} ^vWivK^R N#`TZ-DUjWg7B 1VnʤdUXKgJJgba{]jWгy[~GN4eAyN33i2<+iaaՈ( GKe$" F_v8,8Κt DE;&XvpszQZOh>}'|Z$=B u'Q+Zߡj -fV#5StዴϽDlvp戶CL;pPg,qĵ-/y7ԕÆ z$갬JHo&`7mzGf)KQCgx B#v=t<_ߔ&a?-$Ld B zt8u=I'iشhP@{-` 鈸1Ws.}QuT;4BNP5<*eA*SȌBؓl" ^[or4IEZɷ-_ -X h׶~J>:(yh<ŴG US4q 1c_ᓳ8ߓ QsOxICV ґzOz]7x2htDf}هKqRL(W\5dWV333\aju:kk:qPzbRTNWK5~8zAlO jB{%.Y7ڿ:{h$YyFM6 ^a(+ R쮍ð5n4@}ءCA 8V7nKD\#NT"t/A4&v\^: A+VBy/7{)V7TN0]UE<0TqY󡄎`M /*Xd<חsݏl^ܯK0E~SNfWisdj4/_SHN*J:ϹL ai"N*\V)2>v%dyp{]#xeَ+0ðLAco;*HQs>m 0]Cc ޖ(1r\m64Q]7"V v FkJcsqD: :`Ǔ(w`)޻Gٸt%6B* Q5 sƁpBSc<)A{&_ө`jSC%َvvs]N9t3$BYu 3X~Fxr\ť|9nTɟ}yӾzW"ko7shF!dRp_t~vچp06 UbeɜƋ1-/Rp¥ɋً74JKpRj-=q'-_mP0ns~3xj(x9xpt[bް4׀vl(w:N W&;śԻ EWxcKG',lX7@D?o+hp=I;`Yє_v0D) c{0Wh !$X5STS5#=@"V8v>$4)/( ƱŸ~ey6o'bɱJy>ґp^^h"ֽ6Ihd->ͻ$ [?\O0P\f;5A¶D$0N4+_HAN#aaR LuWG&LXDfU5JoOm>!_pqF7nEq?'ƌ \MN~ߊB+/59Դ vOP!>^rRzM];l}VPyH2o[^i6I`9avN欓ה6ڻNyq6hT-Yv_& UPQ ު2֣^sZ/r{е¡[/G~+C6 S&✛:~a- m<hd6X&IrOO`UhLq:p@ Tĭkfs.C &,,,;EZ eT >a]-mU+~u֋QG=/dc?<,˂(|ޜC  ?|@"_b jjϪ]x*n0 G|UUj(B;B9B&'$TrʹF@^>taB"ڟZUkdO)8j>j.D R45t`m%"qoՃC$Jbp<ು~{=yt)#j'aZH(H=6p<0q27mg7ND-4jSPw5ۢo^_eD<|CuYdIEUQu30pu:))n][6Kl*$x]s~@3NC~0E'Ev=G`m M5Lq-iRЄ+ n#VgU=AȰ8^TIrxq4A?\==47Z,ٮqz}k/AFA.ҋ$4HzRzB/&cl4ZnyM&VL~s$zI0v=,ǬQi$=C:aWw ." E Qn0$џJp؞̈́#mUǕ_.ⱔkZAl!"#T.֦U!(rt 143m{2_jP4/azu-zcaƤ ߚ10LFS y`P'o??K[kEhښfxa05ɕNn JȲ~TtV._ ;@,]=+>_PVk4TEV]1ZeCK{DEgNi,RTf8axtɕ$^zw7wrJMqr[>T 6;ܠ, s^Qʹ3Uu%8r9X^x LMrrfuej j2lVS(wأDu-.S{!eb ) eG3xUvs$7aN?RxݪӈdԞuZdu-d0ڝb5 b'1tGE!}znc2H!+Ap0m~h95WVY3nS>)Xr8ˇܣMK|oB@`?ld~o_`*:"@q`#kX2s(eHHh}ZAgի=4QY,*Ÿ,}GB LB?Xęb4_t9Qaӯ;W!>W^j5xsb!͖Ip)Ƨdj\H,?aqY#V0~W-nvԟbF֍_ ~셍Gb$c2ƫ-, z Vi=ۮg YT( 2LfGrX#b2MOAJG8Z)`/6_?/=v~e8SC}_;Egҧ=&Ad}܀].m56jL*!t< wTgiP[3x%5M5 oHH${BL~AV;RXo_%#FlО⃴9̢=%fv < r˦.{2kP5Ꮶ(;Ɨ_~Kk5.]{H~6$%ЅEN*jK'_ Fofz{J3]BjXH\-- mlq۽$ "? }H;gFMg0v񠬺{ÔX 'r[&"w\4ē5t#M!s6`1幊,\}Wiw6D=wf dexn\&60ftu隒3C^ecjYVdȵKZ[5I 1FK|Φ9qCX߲|D<l0J!rwh{\V.uoP.$V6I%3Nú8 3yMp# AX1.:똽8b\7F"('S0%D!&Tlc۔D kAb0e>GXpq{̑/*gN_ 6uR'1䤪 Uy [W/ Hg$f/"Zΰ4b (kj]ӡ5[]Y^~SD8'z<">Q([@g 6 WC| .Հ;`x; r]AG%._P&nXzJ_Nrh -Bڬg>^]\'NXhlUpa +4Pv89xb)FjB e >47 rXCU7͝xd4|W&׉&f;_E|)O&9HV urkg=eYr )tGΞ\fj)MwĿϖR:V*Xb"aщg9av$:4s/9s>J'~t[og' S D<|94hH#* Vx0g$i]ҼIEoѫ:Z?Jb%'؁h2@\u:}[Gsɗʑ+úcL1S< Wipݫu(<,~uhy'U+o޼VԠ@aEK)&#V/"[2RTK.QJ E"N%4{# ya u,6MaݕRj~6V"Pl0 Qekˋ9wH\AE%{5uSmzr "TJаj͌-#:ӏҍҰR-U>%y2v@L l&=Ho3GklbQ ;V.nm/hlRhp(L0U:}e~f>52&-|];T#=9E9uðe{-]$ =I7QS+)fٱ\l̮%N٩ |PImޕBEy PZVo?'2<)B!>cGNÒג~ фnse@w耯 5?^ <94Tu$kp Ⱥ foAo3DS0P˜% +'=x48B`P "s:DUBœ^.oV@q2/K-6Xӯ-'p gp)m5WZ6@_m.ܖ\& f1 (_[9,sRwō븋f{,1`_fhn잿Boey&N(./kQ]\`r @u&u~5瑻ј$MCdzh"Vku`Yj5\Y]Jc2~st%jR ۭ m !NVF}P-Yn>a=Y]pmBŠu92*nDcQYc jЛ2rS?&?@ =>*3u cһ2?q]0hgK[QH1Ġ[0i80{Cνe> -b6\b ?REr,Rw Elyī"3Eh`Z̴ m4<ƒsA:D&tȫ*YۡQV^sۊ`6?h&o9JɧQ>" G$rٵf(T\&KΠi%26"j("CL<@~*h>ih9|H݌S`fZ:P!iT}Se P2)6y !vDTD*r $wA)"S,WE[ejI;v-1`%-}k`QE "aG}T:d/.U(ڇVl)( ?3X'mmg.1N{Wߗ;Î՗h )H \IS~ToEm&fz"2QhG+7YajSK:L2PV<"i!'7ݾŕV4=(ͤ*v 7K0=o7'QaƆY醖/,6y{b\4xk0M8&E2[*oAh0^Ο)fqɇDZKGCpUnIekm>B(=֓DDbLVq0 HQ~&AjU?ܢGHME#{Ǧ#@)KYev툽qaƵTY]w[ YY9]@,m 8j̰_m#Q}9"wa؃?ulvdw`[MqcGuf1َyՕGl2y!7:Vn / cg nCr)GҾRgE1_d̾޽Q]ܷpqY< vSs^5WHBÂ,1E{3B9!~SYj ՠ |^]JF'&{{ئ~1R&9ǺO=t2T{(^6[ّEjKr/zc dr7#0s1۶ȼ}xRsn~pʧ.}Q\+4{k}~F(ne| IJ%uo2ZWgְǭk.Ni3A[M55rSQ|&~q v;NEF|A ~=-R#gp8]IpdDR|0[IuS=N=,̜|F1n8ȨT IaϕQ4)/k{ډ}˙*wo@LjGgS9~в,Lo ِ<]f9nŐq&-y* 2 0r*zĒ6 Q8W3>2ysǬI7X'2"s &,*1&+U䚢Qj“.ћщ咹欏Jj :cl vkEG^ўI5,ȱ$S,rÍJo;Rp=q]ɣz(*8(.*^I`@$jkAՊiV5iv5{y*+~e8.WJt3?߫⼦/#Pu-` f{d.:))͕2|iu >Sk%L,߶=Ս]`˹\4b5}ɴtX|a?C@7Æx5u(}(0uT+!;2ӯ vsnЩ̯ Su#qJo||@M唶ec_J?gYdVׁ+E-EdnhD r*ǭ0f酶l;MZɑwd7SMЯ&(,vsg[#qԗx%ă[mQwJv'j[R’ҔZi{ŵ/K0~'(E9|T`NbKی\$:ﺿe0c͒gޖ-y:(e]Gr~:JluЎ%')M*b9$W +$ߒoci9?렉c AIRJXU5h$u0e^yc~ fb$}׷іT8PԬ{PgA9_̅ԷMՅguUrJ\u˸ƹXpG l=NiDK1tNb@ϣM D?X+ѹ lȣivbm׏oQ!^ްxtʕmeIcLt,˞Y2 g =S$v!U+h+;xG7ԍXdm g:ҝ49$ן_Jyaj_vc55q̎$=(btuC_҃W1HaABtC԰2@% ޻&CsKA.r juf^I<}䛷+$3eHqźpVGZsa%H#"9za g) '\ EP9fNp\rTǡ2B\3ď(}4pC[(0# թ -L{̕FpU>@ = GC0t|w`{_X7"<H :e:<ƙIFż"IàP~Ja|!jDt׎F_gG6 7v d>C4P`r5^P5a&rnV[< ddF^&ˉ Ԇ!qO9>)X,a3Ї-igJEv|7Ykq,~ǙYPe#~3Yç>ȗQ 3F?60ګL?qLj G6+2Q+m gNqw*ޏ-}nb[zi-58sq"h|BxDPNIo*z TnN(>@;#⢇| +.%L4I^s)֡v?@e,[q uU^>*{g0sIDe*sZMɹaBOuPɳ=v1Tr^`Xq4 _PYζvĕ(:yO_}K?)+,]Nce{c:WZ"_4'9/$c ɱѨ\j%bt}! (8M"8O%MlzWnEk_-3;e?1nVydE1PD]l;"@#E2 F*^v;rkdqT#Kl \F>GZ(\C_YU<+a{UeW.Mdr?sz_ŀD;SR|jZuC">qXބѿt WgӾ~AHT"cq|^{/zk_Y} OdNZi>k+`yGN 8R>2td9'֘c/r4}dF^e[>UQ- `q5K12pk#U@.1JpWѓM4|Om,Y`nK oIOg@9DN/,QCP^ׄ)ɼ$jI8h#Lt3!RF};) ^8[pI$GoWG-^pź! 0\E'K }(㢎mk<mpc j:e$Vt&"ZPBčφ 8 @a8Kgkc|Zy8giKYI]P[M 71ۼBƐ#*=Kj9R˭I )\\.?Z؀Bsz퐩T2_"w9-z4ܡ5=BA%vBȩbd4`p-WʁM\+mY-gGaeLonJc~K,zzwgvA79:zlp|{9C ֺ=PPV01 s'E^d NW. v~.TeoFƉ!QjyJX Hs!kUގ߉b_0%$~5h 5Tu\3I7{5O;zH`ux'Xsһi}g}TG\pL|#H j1,Ě*%/+bwY3SQwR zTXeE1o( 髐mf@qe1iAV-JEcIUJ%zn,dJ]|茓-PW "ҦʞE5VkChALEdDhmRɥӨ0_}u=rcj.t<1ojJ} ۧ4H$ <)Ԁ4ē!cFp)(yJ tr+iGf]b9ћx4G)m`Klfzg{ TxoԶjF2h:h%ڷ<ܦUrD]UUFQGC^fA(lN}< C1b2ݢJ1 HD =X; 냊#4(YIPiҐ+5TM#W>G m&g!c;r?*QR}!U#0KhkUCCwM/CRԂw,2E*1m!]pCIGSԻı/ CsPC4_^6͌D_ނef8.==~'(.,߂1Ku0-R*vrxgE՜V\Ԋ7']5ܧzPPhOn{Q`P0E.:W]|&,^rÄ0Wܢ䩉=$M~mg\1IMbOMP/ޕDQn }Gv ێ! p/{6ו1G97S~<æ]mU'X av'T]*sD y˚C\GN6wmXIٜB+MCI[1uHr@'mSVg՝٧dԀ'<ֶE,@gة2YHwJz Li'4-Ub. /E?↣-QgxԻkovlwH`N8?GjUGG}op2s/lYv/xP3ebC vg g]kث'G\_#FXc*OsL(C9" `)S! Oh1&,20M_pDռ5KMv*9^M-pH :(kiw}FmxNмŔNUQVDZ+w fd| pW X "%_]M"? yG"$TZ6|G\s Zz8-S bsmu 뙢XD#1SF2a{XkDz21+Xc S3>:\kzZ\hYG" E/:2- OO" mzkg{hrFpaaeec^{ r _k0WrXTS~"8n͕OsU$ħÕ?k\i,}%@b=oDܼ,Dd~4*8Z<7k(J+K)[|j!J6~~c"UפU_hKIX`uaܞ2SnwT&t|ǴZ0DKvU]E&ǭUDL< >*\NaVh)YM4Nbk( ]|V@`֝l9i14PbOG 7W4I>GNyX 蔧9luUl,hb\F~2\}[.NA@(ʔ' Uƚ}_$˽!~&#mW( ǥUʰvjo%I`p IbF~ѡA_Fq.(U'Rlؤ}%0?|C~d Y;BO^}k挜}q|0e-^ɾ!UH:(ҧV`nfowt?Tj&KWxA_U>tpn4׊0q{("AgJ#B^C;F8_#:p\֩_0<^ٖ zݸ`xg1.ZECycY#lCW=@6haca4dZ,7HN]W-+a4 qL HYs9_F-=Oĕȥ1Qϫ{Dy$ Nq;Tz> $Y0:/K#֤e6PCAVt'ib8oj%<QqbE޻7?~Bu`yҥtD=^7i)?:{0l)pnO2Yk+s)^ [mׂJ\3{E:y~(qE7AtNDM.ZZtJ{]Q8)C=a1)A{QBve N3vդ31`AxBIm+/-)o{),nV0Lchb4=.\~ {iNz!fR#3AALt#rDQRrZbT=eܢ4oŕ l;rT~VgЉCFuD(W8Wĕ{;Im!zl=<`rߘv< nU.R#d&fN N}H,K,?ZdӛECdpo7܃YC([8._J@Cw?M'w0Ke{3*shinI(-HuM5p( -y@j{,5F: a^9vZf  n~] }SJC@xؚ@^ԲkfwVH?)IL3Fw|3FB76ͨJk,$bŌo-HyVUGMQf]ß$5c>itv3 @ǡkbۙJƯIfǭúKY^霭Ӛ\$i4 asλE/Ft*D܀NA?66 D~=ݭ0< e.qd{D2.=dHeGuh-`P|;uHkbm˽Bt)%KT[Nݡ"l}z$G:eD%WaвP'qJ஍g<7Ѻ®k}hY-V},<(l$=au;v.OϤ*b-liBoHww*3 @ \j_#z8~p౱2eQ۔73GDQsO?E2% _5cquU87 ٕ7GpQ. *\$Ѭkӣ".+j]vxsbfBjU'nр ŚJ[%_oC۝ҕorbWù-1 2hJh&Hq"+c&㽤vPBcCFL#wgQ )ojዮ& *S?T4E LLcҚR6^|ҊreD膴rJ*ݚȼd?ruG>y sP0ܡ=wsHEMO3Hڈ6].ƈ\zM' 7.^̉([E=O ETfi!UD!ę19m:wAxJ!y@H3@y"!ė]p(Z/Pò>h,e<.nYA̎ыVZQ'`-zc]Mo< o"6(9,{S$tZ!CK̑(U�kk_S &pȼY7"R]&-'(2/O+lRKfxcw9pOydxiF m3<{@C0mk-9 \ٰ3\ lW袪TȻƹ|`Kl.-x[ze,SB8gAu|>Jс=.A,t/ ;n`Mc=ÄX3NRk-9?T^ 23!m<{3" 6__Rq>85+}uFu=fgXt0<|zX+-^QU{ȫ> gI`ExU$-0 m3#J;Q⹋1CL2h[nE.m7xJV^]XAj: [y:g=Ro]ewOu;[_6DrK pB[8|k?&d?s,*6t+N`Ŧwԉ4b{!ꧩ(bJ?i-T"qq/c3]: PK&xM#+zx PjHˈy Z,{`%̛ ,4&u$~v{QD_ehI}Nd;Fc_u1Rɽ9u w,G8ٚǰ8cZ$ʫ/u{S@kB(FK,Ĭ &}xONc%c(P5QWWW&ڝ;!,6 TR!o]O!D&~ --"98Jn{0`t 8*۵ÞxKlKk8$c%+w(Ƅkt9-]sJ5ǣB ܓ~d)}rf$Ld_8'މ6cݯdcM&ie$0*p܃:G+Y}TgL8J!IJ!5jgg{<94D BPf}=`Usi-ԩZy&Y26>&~x2cK.jS `̍@2RW1V0nW2o#:LY2=;AC6#ˉщXځ7,o7X<)Ņp%RCN\BV 5EF TO{G8dnXkacB `P-J6q2ܵ ADEfܣ鏌@0f.gCraԲTXho%9i: d'%(P ,$y֖-h;3|yL$ݫDdR{CN'ת8@M~DM ~/拯c}(N֋|Wѣ^(lؿd:'Ym wl-}_Ea[j*%(M(XlIٙYY曋Hz.Ec^F a1y0FgeNfKvP*.3XY(逗s$BS]}\p}SNhf[hg#/d乶cJ&P@r(*GyP{ o]ĭ6R!aɄ2!A70Xwpj,+)Ve/pg&h)=ZxaօwHWhfZh#Z.C#؟)rӫJmWbQKPְu߁3) a 7oHXU?ui؟r@wp-ڍ`DOk1%[%1; Xx輺,$ `. s9-@t<+;:z'I".\ ~In^Y =5晬k46`BQ= 3EHΛ)?;䈎hW'xu)_>Recƣ%| -Bul|Thuzy BTC-}74'`yGtu C@]e&T+uJNIXW9cZU݄Dxv!t B"K8 IԀU4b ph95Ħqn$Oݭ?lAq-8 &@W>,&ҎXGyBc!7:f5̞t땞 ZhqVc冀ȣl6U$#Td;.ϴ(VŊBs?^J@@|=(;iaaND7Mʜ?/ X4$1l~,gWt`[ݼ4aq=ЊƅcR!6"5`I$Bk.Vf@mdm y{m}q*yejlS;N8E:vUNɂᔕT¸A9P/@Dvw(;>uoS}PQRSmԹZ]j Ӣc!AXj ~l_,jKI{H6'ȕ,Xy01,>LWB>5RLo.8 Lɴ@VX6#9kmDEC7 rwxnSo;L+ 786ZTnoS5 Yb;DL 4 2"onMMΚ1^ Q`wǦ0f/]\Dy{ ?s=-9HkڈZfdoIG.[=Z4F *(6 iy>/Dc$E`#~R/{!\ [g)iۇ\2Վ7kۖ􈛕4ˠ3*0l40w^Pܒ̳r,Ce{Rˮn[pt,pҨd.TA]1~znH>o$߽[i6/\w&?␤̦.$%r+)Vu)Seu]cJ)#ֲ%tJ/~[KjЍ^ a <ԪuRjR6 lM"]6dfՋktL׏>$PR]tdԘ)ͫd[l-jw\{fQz [L7Cv&\N^Z%7f$ynv=` gl~q6(*:HHG43,+vIg0%[Xf7O\>yOG8x$W3r\E1 n{2Wa  G`EH ; z~TygFNFmOeFʃ[uuʌпN\gSr W:wK%-]r}0gfP0_S ,k*7w0r^^ GwS0lj~s83hSC%d״^y(yR30g>6ԲPBX(gNńs .Հ<!΅Us5u2ĥj'xX@]ۜ5`BةkC>}/8 \!/@_S("_(jBEٜv2 BkB11Gl8*k\`{AX|;qoKc.|d)ɏmF/I8oT=դn*D񱂽&g#3;xsg "zm8L1(,UK'8䷣ lViyPHB6'|NX#x!{1l'Nnj1Q7H$銝t~9MB4VzS!vU"/p̍*K&.“@akJ pF h'ZS$xm|T31ySTm1R&h@D%m)%}^l yFZWHp>vْ`7ɇQ(ub@mC`z`TMf>`y/>fSwCW*0_`%M\ J>`C>'&{+t*2x.vuEIݥ/-P7tfp&+;:}y{jt5[$CF]s<Ŀ_{UDҿf:u"_3iW2x::+ 0_gwJ0N'}'ED_ kdB~peJ9_Px׵rbQ+kd lQh6/=.57am"dqǣ3o<* ǂ'`3QĀTTt#5[Ƕfd9Bh[H8H1޺[k~^kC4Fla;_O+(3?vׄ{.^0gPv1{ڽE/H6=mw}cvaSy fA("(hGWQC$]Ӆc黊 z.W3ͻVYM ޴KmUK=}J]g+ڥVמ?v) $o] %)̣ìw>L D-  [ gQ8I~p:ah|Cއu d&/:$`!J3_:`EDؗ^pz.^c߂ؗ?(D^ ΁5ğIY1'0UWՙR$+Cf ::vU=Ynt' ;%*|23=i3^[2~fiAxҋ98ed o]`ob;j6fNlC΢h󦾀C'.X@'D^[%EptpPtWe7ݯ^}FXq zly02!w%by֚Uh (!da|*S,[z :uS=˯5u YI{c\9EC |њ0x $</!N03o{i]/b㉗B,wN24 sZDzHC(vodC'8};DӨ*XSh@ߌI9l]?kܕI"' p&H{ _ᄊH c/?[A< #QN{&3LϖQ 7K _dLJ͏Uڍ-[R~hrZT5xO1쮩GQB1A(.#+X75gC@.w-r>>PfW"Q[@-@w)fU(MM#)~1Qdf4`<)$bX.L.]29$Yܨ`!Ü3Xnw %՝GBc#2i$/O60)H3q-I$AxՆsvgFvyF|dZTLݷ"v c!nɪ/6v'W ä@}oooi,nbx?5Пic0ОA4HIP~3= .OVc观eSg,@s+bOGd*?99O y`Vy33eU'\׺1X^={ %RZH'_קo h03z lV9{:Oge$grMO?;5AynMMAf Hm-P&3{Ni3+4~ ^SR/u&[`Л+/W-؅TXF;]68}8(p*#o6,=//dEM+Apj-+$qC2~ =F2֟&mN Sk^*b:їGl%+CoF$$R#[ijB SSA;ijaƃHeSM]ג/"xWSv\tDk;P1#/M£;i4yN3 цO7 At Hm'Aپ)W5O u[bLqȖP8?_R+Ix"gZn tW((|xa.), X$ӭ[AL2AE`!AQφߣ ѩbF@7/90)I )qM.+^mb⻢k+|ߕ}.m7i3bWsW3=Z0`h{w%䉆I2ݿ$B+%+Yx=+\@Iw1{G$l$1c阥N)U&gB𴟽I) ZwZ(05=ܛ9=z͡"Qnh]њum^M錅feAT%X N>.d^d'O{Ms`%~c]^˟䦧4 Q(ɂ`C!F-fQ&UDnf`n }/'%m WF-9YN|ʯL_ꛔ&? f.e*86Ib ߷wl [5]F8 j'O[6Zbth p=+ǃy=)/- "mugQƢ_+ZKÙ/hHXȌm0K }Ǵu$۟nۿXF]HJwy;,|u{紡E4^Y~ %hGE`u*k-A߆rƃbI Ƨ01|/EnOx[Ը"ӐY1G`qyI%R\ˀ*Vzk!) IU/}]^Ҍg;ƺR~ŎS~#O#:-j3zRaxE@Z{"o^1@hg; g%nfRBw.VX(jVG^p=2( IH#&cdXn] "눋Ÿ6t"xEҵ } > 3ۍVe?X׏aFJ(D2"HpʁTN< _,֢VdDkdjJѶ@Ѫrz@tǭ%^^jF [dk28[>pbwɊc`+sI7oAlO@J76r>^q.[XtV߮kn u,AψOwIn_%(Ezڏ{L{ w) )%KM<,>=z4S@x$*{g& p#AOzdTF8_&V| o RsD`Y;/ )-YZN8v 4By*ڟ8B=~3G$v}Yajy?yffh* lc5m^KIǻ:|DszOd=^'Í4]d<<97O #ٕwܡF;@E`฼O;/}>)s]X8yjTbLN\)?f"$S*pT<5Pb ШkY$UT_rwi4zfm |T'uf 7 ZY0-3FQ:* `V>B;f#dpv~[Z0ټHD& a#jZ7 Տb\;(gɘW*L]χgu5O3 .?~8/ foغgݖ_ -/bZ@4[?j ea9e&Hgդ2dž!Wj149YcɞZl%y1F<kSc/62ikX~s} jBIoim8ׁ796,έF+^ׅscqFZDHȧ4A%Yh@x]<ȓ?TJ+} IpT=}C[ߍj` >3Dwo+e f g 5ޤM~ky&0OuuH]cB}}Y lHF rިu߽E]t "tS&ъh#iuU+X=AYԊ>a :W]8re=U.w]j1߼V3+`ó hK_<k;*|uSRۃ\Cxi!*Z+AV7,iJ#*Tpq P{Z3 -0Oe*Tb?(4|;:x^R% l]3ĉ6DIeaqc=(1 x#N Uoj`Mas[qbQ VJ٥n^.9{YE>Vh R8fp݋9=_IdbjgI'ĦsEu#XX-;lu*]Q,PK6P90[w ){T B sdu uz=C,SU:+>iTȌhBj.W$F AX}w@TyAFAudn셍8~JQQz j ӯԓ"їlxBPDlZRi_ފ/g nоDUA >uL/{)3W𔉿xLY1`"Z)"DO"O'YF=UnE7hL9"Jy(fiK9ORq[FT*[5 Pf;{7d9o\=KJ#[KG.ҝ_Gn7;0rô6~Ʃ|̢<)'*c5.HSh:x֙Zwǣ(mWwœ$cH|Wl"Y$Q*sf ]SP[PDyW$my~z4-4jT&\F$NGΖ1 EZZrbTLa.yI#a6t_D ϛ%K}3[4 9$mc^o79DI"⬦`hPbƯ~IB\M$2ÅXh^jec&-ܸ#9ѢuNғn;%qfǏѶg(RdAwZ"A kUo5w9rԔAq΁fs£WZNk @ t-p$-ZOu|M K:)zcz(LcE4v_*Il9KE0 Crw5L]j[9%b(u@|j#Mnq/mh]̓bV+VQ6qh׿lW ȃ9iރ.!9+LE3oqP.8PȴZYVђ2ˮhQҐ{ ny7 w<h3J{HѡuMUW|t\m b#1hڤp҂x\,x0d=Kݼ}'aG.HCWz GZD?2mgGa:D Zsvv[lq(!t/}M[W>0 YZgstat/data/tull.rda0000644000176200001440000001155114127330266013764 0ustar liggesusersBZh91AY&SYV5I|‹kgy-}>w w~0ORF=IOA4zhқzfxFd'ЛF'SѩfSj{DhfiFlzjMfi4=4 i0&b=DޤGSj{FLOFy'OT<m 4=544 PhP  h4z )<=CA=M 4d&J110h4L&1L&LL!L&440# &dd$i04zyCM'zChɣFGz i4hQLCFѓCCC@چzM=MI$ d)yL 4h6=A=&i4zO"14GPbhh2 Pڀ z#mOS hGP z4>I$=Nߕ1/ϽX @/"@UA<GtԼu5Q-w1aL0>|)UOIBUU, 1 E*cZP1i.^HDTPiEEU^5QB*Ėil/EXT3Q\Oqg)"kHiԄ@DDEʀU iņF\d(p*B8T*X, pT* 73kDR( T"!CY}.S6C[0$HQڌm¥ZUhl%UeJRm+ "V4l[E[R[FKdFUhXD1Ō.\ER҉jYV(kKk)Uض*FPXګQVFl6)?_^< 3q РPڡـ,7;Ma*.x!*Ԋ@Eחsk[!Vfk@JDWDL.=߬, sn,zZ yܓ m/#e=ptkՏ d$Ȁuɳ۠,iӻ.$L_dvdJʖO2yɑ]ǯܣ e1Paq\ZjavdkyF?Gc_#j(9kg)D.cf"k+UQ*u*׊;k p I:9ï>u"TK@-ؓ$4H wPcf:9S1Fkf aR3%r0fLɉn%Aq u!%WRC?!A'Yava?t6wݫNCk-Gv4POؚ0M !Axpz"\BT*!$@d$! ܎EʿlieiG +a &QXf2ࣇ t$8~U1E0-QD{01|ۋ|Wj$T 1 @$%dy{b[4$r]ة셫8.Jz7#ʇ̀.'$ME.GÜ)G58sq xo>@;)o/h:`9졥qP5&[1pWkR ?bZZ  "|g9M1;DR g[B;:Pz!`=^kQN7Ċ9=P4&$ʜ$U\nN>0]`0ߤJyVSxZ00I6hE%|V! ɺ$#r"0 Dw8yTӝV@xy@m9AhP@@ B+xij팇êTѣ@s1a!kX&~[bTSfpG#9w)viGaۍbYGJI2U?_vR^)1o!m.=5+Ck$GzP@AB"E$h \qQ2 soIq;#_Lvl3} 6̧G1U)2YOYmdϓ[yb7o<^?N [\4J[P& <e/z@D`8_V cL+m$ );*%H,`Bc$, Z%`bc@*) @P1N!!8dR5l& @P$Î,+ (JB +IY1 ,"0`@ $5A`,0!]dXI8d@ aAd*B(C6+ MAIpÄ1/ TU!Qb;M`Id aFo f$ɴIɌԭAT1X,d!pX(VTd1 Ƀ+&!Y6Ì٨cRX$*%C@]d Rfe8+nʍ)Yîeq(V,Y8&@S11!Sm 夶aY #xb TԆ&' -T d62fm :11b YUspefU5pIBabSPf: E- d55P*XcR&5bYYm.SS2n-w)LdvnY!DKw mW6و*HRkLLLM`vLC6F I57,(*㬪 Vk"˴252[A-Ze1"$+19,)§Ee`(j? p2Mx*b͠,SQXe핹Tq"SXjMJVG,(mdPW) af*(1,P7i21.B.$Yĭ32V[15BĮJf,!.DALP! Zu]]:;~U 11~_F2wt>}=QׄXꪵ"@4,l#W= _6&+Ai#m)7NԀջM|d"Bh3lWo@҃Ejadw)?WXH3Z. 13v";g[ȀI@)ay cp" 7W)ɑOOiSmZaoP]!ITz^ dکfQEEgkvr^'Eyjy6 xY5-sϭmMcAc" (X" "F21H"KmA A{f<~g6Uۡ۴e O➧%@\wȊ2J*En ݟy "!Ju -#VW4'ϒ ͑~D1 = qUyGW(bLg9qtfj %W URX<'x 㖫vCG|[[iW6i SnX8% BToƲ[ Z4{o_Ҝk 7};XB2U@~ސ"!/&EdooL={DD`(@ iz/yn~2@?Gw%:@>,2]mZ!d@B%;뛌$c|[h`*nY 4O:dY6l4H$5WeH$5ͫ]$#AD`A ~D@%BY0clEqkeOs1@9-Go5 Lၚ`(0i!h% Օ߮2PIz?8B}i*DJhHEsjiw.]y_H˒ͥWyUfۉ턯XEj%o _#ZEF2$EU`EQ$I@}sD x!&VȪH)A /ZLG]a  i?* @Kll]4N4nB%A.z/H\R4Ye~/.'`^r|fEpOYPxm xo p_, 7t`iVĸ.mmH )E@5 ;r" AӋmU-wU1E*4֨vO#@ueX:'[<]3oxo^i4\F}~K#wvi(l~.B1vvdX7H ւ'%_p[veE͏I CCS|\W3r35^I$[O>%\S^d9lk쵴b$$Av]ꤸ?BJ ]BAX׊gstat/data/oxford.rda0000644000176200001440000000546514127330265014313 0ustar liggesusersBZh91AY&SYe$t@@@F@@@@@I #>u]Qq`E(T4djFM=FLQF#cSid?UԧH! M65!1&1114L0Cd`AaL `DѦ d & &1114L0Cd`AaL `B&Jm4Hޑ='zhiF(zh4z@b2zHFRA!RDUQDƛmgg˜^78ֶ|zrxp6"kqG[znnbu| !$^ DgP,%)"qb #*(^0+\g_%Ƥx;"D*}5;p:uw0 |E{a5YZ2{-u]R+'|eye40;Ti$iCZ L2 p5p^:p""""1D cN3< F&JjB&7:>dkiJj& PQ@[&`ѶN&*8=1 Ez]4DSE&jʠ22w*3̲ՙRwsd[c93jARZ.]mp=3n.(= t#Fٻ;}}Vq(s8Xp.l[Z8OZG˒uUۇa54-Ejf7.66t6z[-nUiYe6z {_m3cou 畠"[dq%J @)T(^p,ND9*cyJmϐً#߱~.u:}iD/lSII({qTa?$Pǹ] uRLW&,A!.qv.$b%&[[P+ӄ=6l3qh&`kOzQ ݊k-=bmh? rE+\y2nY߉nMaE$/IIKE4=J?瀂C.ziDŃa]}$QSDp>^luyg>^ªD|P T2J9'Jmjh(Mh|PC:Qc6ؚk~`v =\.C1FdbڍTTVm]S%a `B#ֈ(:I9D`ضPP0P s$$ϞSBL,ՆI$I$I$I$I$I$I$I$I$I$I$\yI$DI$I&͂qhJ*S#sC*QpTfC* EZհ(mfPBvڌmű-La+g#h֝Qb3ATTU" DZ0 h@I$t Bl"RHGcwAFUh)hZ1D 0 Z@Q [li\upa @Knus̶s$H-f)gs9q/-W^zUkɻI$AZ%n뮺Ye)}]WSMi/^cOFOZ\-'\g]l "0` $IzI$AfeI$PaϹ,1bb I$(0@Wax빠N73Cnl/uKe7jjxM&<R/@A= &)i$&") bh(*-~`ATTI lJGJuK4eI  j샷QJGI$*GH(a|{wm4jh:er-Z +cwhXN%-[h)Pi4h&46ƙ19mFAZ5UQH'*M-<8a4r/!)J94)JF$)"Zi*"B**Jh )"& Z" kZJ* d *)**CHUIHP4%UP!CM% ȕ%P@K"U!HP't ZDQ!vN!w0;zH3 tie1zR= 䑉͝hP|;NZU~vP qW>U qɾT8&)(i ܋Q HYBq4Y6B@Wӎ|&%HPO_ʖ[R.~A 2RQI$8j240p+H|?>6v[ٗLł[2e,oJڤ(nW6ت |b|"VQGJw5.^◺TyEZ.b(Fo= 2.10) Imports: utils, stats, graphics, methods, lattice, sp (>= 0.9-72), zoo, spacetime (>= 1.0-0), FNN Suggests: fields, maps, mapdata, maptools, rgdal (>= 0.5.2), rgeos, sf (>= 0.7-2), stars (>= 0.3-0), xts, raster, future, future.apply License: GPL (>= 2.0) URL: https://github.com/r-spatial/gstat/ Encoding: UTF-8 BugReports: https://github.com/r-spatial/gstat/issues/ NeedsCompilation: yes RoxygenNote: 6.1.1 Packaged: 2021-10-06 14:20:37 UTC; edzer Author: Edzer Pebesma [aut, cre] (), Benedikt Graeler [aut] Maintainer: Edzer Pebesma Repository: CRAN Date/Publication: 2021-10-06 15:00:02 UTC gstat/build/0000755000176200001440000000000014127330263012474 5ustar liggesusersgstat/build/vignette.rds0000644000176200001440000000054214127330263015034 0ustar liggesusersRMk0 uڴ] Av=s]EIllNn~l)C1bqV!]]:Wtbd`dz^VȑBI hE&(k%+< ܠ}meRȎϸd@ZP9X#)‡޾6 ^!Dj cEbxeHmJeZ%Ur+y7ϠqnB\:-cpiqq(P?x*0\=hL *,S3nj ǁ-]\Q sVj%@B_߿,gstat/tests/0000755000176200001440000000000014024705354012542 5ustar liggesusersgstat/tests/vdist.R0000644000176200001440000000054613777370515014036 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=10) krige(log(zinc)~1,meuse,mg,vgm(1, "Exp", 300, anis=c(0,0.01)), vdist=TRUE, maxdist=1000,nmax=10) gstat/tests/allier.Rout.save0000644000176200001440000003034213777370515015637 0ustar liggesusers R version 3.6.2 (2019-12-12) -- "Dark and Stormy Night" 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. > # 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.551 0.028 0.570 gstat/tests/krige0.R0000644000176200001440000000205513777370515014063 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.R0000644000176200001440000000056613777370515014676 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/cv3d.R0000644000176200001440000000031513777370515013536 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/cv.R0000644000176200001440000000073413777370515013314 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/cv.Rout.save0000644000176200001440000001075713777370515015007 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. > # 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.4190977 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 0.614 0.050 0.655 gstat/tests/unproj.R0000644000176200001440000000366514024661677014225 0ustar liggesusers# for validity of covariance functions on the sphere, see also: # DOI 10.1007/s11004-011-9344-7 # http://mypage.iu.edu/~srobeson/Pubs/variogram_sphere_mathgeo_2011.pdf suppressPackageStartupMessages(library(sp)) suppressPackageStartupMessages(library(rgdal)) suppressPackageStartupMessages(library(fields)) data(meuse) coordinates(meuse) = ~x+y proj4string(meuse) = CRS("+init=epsg:28992") meuse.ll = spTransform(meuse, CRS("+proj=longlat +ellps=WGS84")) meuse.ll[1:10,] library(gstat) variogram(log(zinc)~1, meuse.ll) cloud1 = variogram(log(zinc)~1, meuse, cloud=T, cutoff=6000) cloud2 = variogram(log(zinc)~1, meuse.ll, cloud=T, cutoff=6) plot(cloud1$dist/1000, cloud2$dist, xlab="Amersfoort, km", ylab = "Long/lat") abline(0,1) data(ozone2) oz = SpatialPointsDataFrame(ozone2$lon.lat, data.frame(t(ozone2$y)), proj4string=CRS("+proj=longlat +ellps=WGS84")) variogram(X870731~1,oz[!is.na(oz$X870731),]) utm16 = CRS("+proj=utm +zone=16") oz.utm = spTransform(oz, utm16) variogram(X870731~1,oz.utm[!is.na(oz$X870731),]) # Timothy Hilton, r-sig-geo, Sept 14, 2008: foo <- structure(list(z = c(-1.95824831109744, -1.9158901643563, 4.22211761150161, 3.23356929459598, 1.12038389231868, 0.34613850821113, 1.12589932643631, 23.517912251617, 3.0519158690268, 3.20261431141517, -2.10947106854739 ), lon = c(-125.29228, -82.1556, -98.524722, -99.948333, -104.691741, -79.420833, -105.100533, -88.291867, -72.171478, -121.556944, -89.34765), lat = c(49.87217, 48.2167, 55.905833, 56.635833, 53.916264, 39.063333, 48.307883, 40.0061, 42.537756, 44.448889, 46.242017)), .Names = c("z", "lon", "lat"), row.names = c(NA, -11L), class = "data.frame") coordinates(foo) <- ~lon+lat proj4string(foo) <- CRS('+proj=longlat +ellps=WGS84') vg.foo <- variogram(z~1, foo, cloud=TRUE, cutoff=1e10) cat('==========\nvariogram:\n') print(head(vg.foo)) cat('==========\nspDistsN1 Distances:\n') print(spDistsN1(coordinates(foo), coordinates(foo)[1,], longlat=TRUE)) gstat/tests/stars.R0000644000176200001440000000572514024705354014032 0ustar liggesusersSys.setenv(TZ = "UTC") # 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(rgdal)) writeGDAL(meuse.grid[,"dist"], "meuse.tif", "GTiff") suppressPackageStartupMessages(library(stars)) (st0 = setNames(read_stars("meuse.tif"), "dist")) st = st_as_stars(meuse.grid) all.equal(st_dimensions(st0), st_dimensions(st)) st_crs(st0) st_crs(st) # 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)) st_as_stars(k_sp_grd) st_as_stars(raster::stack(k_sp_grd)) # check all.equal(st_redimension(st_as_stars(k_sp_grd)), st_as_stars(raster::stack(k_sp_grd)), check.attributes=FALSE) suppressPackageStartupMessages(library(spacetime)) Sys.setenv(TZ="") 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) (p = predict(g, meuse.grid, nsim = 5)) gstat/tests/na.action.R0000644000176200001440000000156613777370515014562 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/windst.R0000644000176200001440000000634114013276654014205 0ustar liggesuserssuppressPackageStartupMessages(library(sp)) suppressPackageStartupMessages(library(spacetime)) suppressPackageStartupMessages(library(gstat)) suppressPackageStartupMessages(library(stars)) 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(rgdal) && require(maps)) { proj4string(pts) = "+proj=longlat +datum=WGS84 +ellps=WGS84" utm29 = CRS("+proj=utm +zone=29 +datum=WGS84 +ellps=WGS84") pts = spTransform(pts, utm29) # note the t() in: w = STFDF(pts, wind$time, data.frame(values = as.vector(t(velocities)))) library(mapdata) library(maptools) 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, utm29) # 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/fit.Rout.save0000644000176200001440000000227713777370515015157 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/tests/fit.R0000644000176200001440000000034713777370515013466 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/blockkr.Rout.save0000644000176200001440000000513713777370515016022 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/merge.Rout.save0000644000176200001440000001560313777370515015471 0ustar liggesusers R version 3.6.2 (2019-12-12) -- "Dark and Stormy Night" 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) > # 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.484 0.028 0.502 gstat/tests/cv3d.Rout.save0000644000176200001440000000371613777370515015233 0ustar liggesusers R version 3.6.2 (2019-12-12) -- "Dark and Stormy Night" 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 = 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.500 3rd Qu.: 0.8508 Max. : 1.085 Max. :0.426 Max. : 1.857 Max. : 2.5224 zscore fold x y Min. :-5.168 Min. : 1.0 Min. :0.0068 Min. :0.0034 1st Qu.:-1.875 1st Qu.:13.2 1st Qu.:0.2397 1st Qu.:0.2466 Median : 0.245 Median :25.5 Median :0.4867 Median :0.4525 Mean : 0.017 Mean :25.5 Mean :0.4997 Mean :0.4969 3rd Qu.: 2.020 3rd Qu.:37.8 3rd Qu.:0.7473 3rd Qu.:0.7394 Max. : 7.354 Max. :50.0 Max. :0.9875 Max. :0.9872 z Min. :0.0016 1st Qu.:0.1865 Median :0.4485 Mean :0.4714 3rd Qu.:0.7240 Max. :0.9942 > > proc.time() user system elapsed 0.776 0.050 0.815 gstat/tests/line.R0000644000176200001440000000305113777370515013626 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/unproj.Rout.save0000644000176200001440000001571614123665713015705 0ustar liggesusers R version 4.1.1 (2021-08-10) -- "Kick Things" Copyright (C) 2021 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. > # for validity of covariance functions on the sphere, see also: > # DOI 10.1007/s11004-011-9344-7 > # http://mypage.iu.edu/~srobeson/Pubs/variogram_sphere_mathgeo_2011.pdf > > suppressPackageStartupMessages(library(sp)) > suppressPackageStartupMessages(library(rgdal)) > suppressPackageStartupMessages(library(fields)) > data(meuse) > coordinates(meuse) = ~x+y > proj4string(meuse) = CRS("+init=epsg:28992") Warning message: In showSRID(uprojargs, format = "PROJ", multiline = "NO", prefer_proj = prefer_proj) : Discarded datum Amersfoort in Proj4 definition > meuse.ll = spTransform(meuse, CRS("+proj=longlat +ellps=WGS84")) Warning message: In showSRID(uprojargs, format = "PROJ", multiline = "NO", prefer_proj = prefer_proj) : Discarded datum Unknown based on WGS84 ellipsoid in Proj4 definition > meuse.ll[1:10,] coordinates cadmium copper lead zinc elev dist om ffreq 1 (5.759029, 50.99241) 11.7 85 299 1022 7.909 0.00135803 13.6 1 2 (5.758356, 50.99194) 8.6 81 277 1141 6.983 0.01222430 14.0 1 3 (5.760348, 50.99175) 6.5 68 199 640 7.800 0.10302900 13.0 1 4 (5.762239, 50.99126) 2.6 81 116 257 7.655 0.19009400 8.0 1 5 (5.762356, 50.98988) 2.8 48 117 269 7.480 0.27709000 8.7 1 6 (5.763533, 50.98924) 3.0 61 137 281 7.791 0.36406700 7.8 1 7 (5.760336, 50.99024) 3.2 31 132 346 8.217 0.19009400 9.2 1 8 (5.75837, 50.99019) 2.8 29 150 406 8.490 0.09215160 9.5 1 9 (5.758831, 50.989) 2.4 37 133 347 8.668 0.18461400 10.6 1 10 (5.761276, 50.98842) 1.6 24 80 183 9.049 0.30970200 6.3 1 soil lime landuse dist.m 1 1 1 Ah 50 2 1 1 Ah 30 3 1 1 Ah 150 4 2 0 Ga 270 5 2 0 Ah 380 6 2 0 Ga 470 7 2 0 Ah 240 8 1 0 Ab 120 9 1 0 Ab 240 10 2 0 W 420 > library(gstat) > variogram(log(zinc)~1, meuse.ll) np dist gamma dir.hor dir.ver id 1 57 0.07930064 0.1234479 0 0 var1 2 299 0.16399059 0.2162185 0 0 var1 3 419 0.26739245 0.3027859 0 0 var1 4 457 0.37277392 0.4121448 0 0 var1 5 548 0.47862430 0.4626633 0 0 var1 6 533 0.58560071 0.5646904 0 0 var1 7 573 0.69331179 0.5698718 0 0 var1 8 566 0.79646175 0.6169183 0 0 var1 9 587 0.90341511 0.6489406 0 0 var1 10 544 1.01149382 0.6932668 0 0 var1 11 500 1.11819049 0.7009152 0 0 var1 12 479 1.22191097 0.6044300 0 0 var1 13 450 1.32976764 0.6507175 0 0 var1 14 456 1.43752185 0.5675707 0 0 var1 15 415 1.54336201 0.5748227 0 0 var1 > > cloud1 = variogram(log(zinc)~1, meuse, cloud=T, cutoff=6000) > cloud2 = variogram(log(zinc)~1, meuse.ll, cloud=T, cutoff=6) > > plot(cloud1$dist/1000, cloud2$dist, xlab="Amersfoort, km", ylab = "Long/lat") > abline(0,1) > > data(ozone2) > oz = SpatialPointsDataFrame(ozone2$lon.lat, + data.frame(t(ozone2$y)), + proj4string=CRS("+proj=longlat +ellps=WGS84")) > variogram(X870731~1,oz[!is.na(oz$X870731),]) np dist gamma dir.hor dir.ver id 1 197 17.44144 143.5037 0 0 var1 2 244 40.32542 180.9092 0 0 var1 3 210 68.99177 132.4888 0 0 var1 4 275 96.73268 175.9893 0 0 var1 5 282 122.86300 230.7471 0 0 var1 6 390 151.23063 317.6391 0 0 var1 7 360 178.10896 310.1876 0 0 var1 8 395 206.37465 319.4972 0 0 var1 9 477 233.51652 336.0833 0 0 var1 10 477 260.54876 339.5354 0 0 var1 11 428 287.70593 264.3152 0 0 var1 12 445 316.02780 302.6589 0 0 var1 13 467 343.06969 369.1128 0 0 var1 14 575 370.98370 390.3644 0 0 var1 15 792 397.87592 480.0129 0 0 var1 > utm16 = CRS("+proj=utm +zone=16") > oz.utm = spTransform(oz, utm16) > variogram(X870731~1,oz.utm[!is.na(oz$X870731),]) np dist gamma dir.hor dir.ver id 1 197 17443.99 143.5037 0 0 var1 2 245 40383.30 180.5144 0 0 var1 3 211 69178.16 134.2920 0 0 var1 4 278 97068.08 174.2017 0 0 var1 5 283 123380.15 232.2221 0 0 var1 6 393 151741.31 318.7762 0 0 var1 7 356 178620.56 312.9364 0 0 var1 8 400 206865.15 314.7740 0 0 var1 9 485 234294.31 340.8188 0 0 var1 10 476 261547.41 331.8010 0 0 var1 11 427 288749.42 267.5269 0 0 var1 12 452 317219.28 308.6634 0 0 var1 13 467 344418.75 365.8126 0 0 var1 14 596 372513.02 395.8868 0 0 var1 15 784 399259.25 490.6399 0 0 var1 > > # Timothy Hilton, r-sig-geo, Sept 14, 2008: > > foo <- + structure(list(z = c(-1.95824831109744, -1.9158901643563, 4.22211761150161, + 3.23356929459598, 1.12038389231868, 0.34613850821113, 1.12589932643631, + 23.517912251617, 3.0519158690268, 3.20261431141517, -2.10947106854739 + ), lon = c(-125.29228, -82.1556, -98.524722, -99.948333, -104.691741, + -79.420833, -105.100533, -88.291867, -72.171478, -121.556944, + -89.34765), lat = c(49.87217, 48.2167, 55.905833, 56.635833, + 53.916264, 39.063333, 48.307883, 40.0061, 42.537756, 44.448889, + 46.242017)), .Names = c("z", "lon", "lat"), row.names = c(NA, + -11L), class = "data.frame") > > coordinates(foo) <- ~lon+lat > > proj4string(foo) <- CRS('+proj=longlat +ellps=WGS84') > > vg.foo <- variogram(z~1, foo, cloud=TRUE, cutoff=1e10) > > cat('==========\nvariogram:\n') ========== variogram: > print(head(vg.foo)) dist gamma dir.hor dir.ver id left right 1 3115.1190 8.971063e-04 0 0 var1 2 1 2 1908.0468 1.909846e+01 0 0 var1 3 1 3 1405.6211 1.883757e+01 0 0 var1 3 2 4 1837.5667 1.347749e+01 0 0 var1 4 1 5 1522.8765 1.325847e+01 0 0 var1 4 2 6 119.9386 4.886139e-01 0 0 var1 4 3 > > cat('==========\nspDistsN1 Distances:\n') ========== spDistsN1 Distances: > print(spDistsN1(coordinates(foo), coordinates(foo)[1,], longlat=TRUE)) [1] 0.0000 3115.1190 1908.0468 1837.5667 1481.6293 3775.6751 1480.4477 [8] 3081.7541 4090.4022 665.9348 2683.1516 > > proc.time() user system elapsed 1.940 0.111 2.065 gstat/tests/krige0.Rout.save0000644000176200001440000000367513777370515015561 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/sim.R0000644000176200001440000000054413777370515013473 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/windst.Rout.save0000644000176200001440000001250114127330226015655 0ustar liggesusers R version 4.1.1 (2021-08-10) -- "Kick Things" Copyright (C) 2021 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. > suppressPackageStartupMessages(library(sp)) > suppressPackageStartupMessages(library(spacetime)) > suppressPackageStartupMessages(library(gstat)) > suppressPackageStartupMessages(library(stars)) > > 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(rgdal) && require(maps)) { > proj4string(pts) = "+proj=longlat +datum=WGS84 +ellps=WGS84" > utm29 = CRS("+proj=utm +zone=29 +datum=WGS84 +ellps=WGS84") > pts = spTransform(pts, utm29) > # note the t() in: > w = STFDF(pts, wind$time, data.frame(values = as.vector(t(velocities)))) > > library(mapdata) Loading required package: maps > library(maptools) Checking rgeos availability: TRUE > 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, utm29) > > # 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) Warning message: 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. > > all.equal(wind.pr0, wind.ST) [1] TRUE > #} > > # 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) Warning message: 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. > # 1 > plot(stars::st_as_stars(wind.ST), breaks = "equal", col = sf.colors()) downsample set to c(0,0,1) > # 2 > stplot(wind.ST) > # 3 > plot(wind.sta, breaks = "equal", col = sf.colors()) downsample set to c(0,0,1) > st_as_stars(wind.ST)[[1]][1:3,1:3,1] [,1] [,2] [,3] [1,] 1.434574 1.436801 1.441839 [2,] 1.422832 1.422303 1.424073 [3,] 1.410405 1.406165 1.402939 > (wind.sta)[[1]][1:3,1:3,1] [,1] [,2] [,3] [1,] 1.434574 1.436801 1.441839 [2,] 1.422832 1.422303 1.424073 [3,] 1.410405 1.406165 1.402939 > st_bbox(wind.sta) xmin ymin xmax ymax 398500 5535500 1172500 6309500 > bbox(wind.ST) min max x1 398500 1172500 x2 5535500 6309500 > all.equal(wind.sta, stars::st_as_stars(wind.ST), check.attributes = FALSE) [1] TRUE > > # 4: roundtrip wind.sta->STFDF->stars > rt = stars::st_as_stars(as(wind.sta, "STFDF")) > plot(rt, breaks = "equal", col = sf.colors()) downsample set to c(0,0,1) > # 5: > stplot(as(wind.sta, "STFDF")) > st_bbox(rt) xmin ymin xmax ymax 398500 5535500 1172500 6309500 > > # 6: > stplot(as(st_as_stars(wind.ST), "STFDF")) > > proc.time() user system elapsed 3.869 0.103 3.976 gstat/tests/rings.R0000644000176200001440000000624413777370515014030 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/variogram.Rout.save0000644000176200001440000000515213777370515016357 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/covtable.Rout.save0000644000176200001440000000276513777370515016176 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/line.Rout.save0000644000176200001440000001112514123665731015305 0ustar liggesusers R version 4.1.1 (2021-08-10) -- "Kick Things" Copyright (C) 2021 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 Warning message: In wkt(x) : CRS object has no comment > > 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 Warning message: In wkt(x) : CRS object has no comment > 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 Warning message: In wkt(x) : CRS object has no comment > > proc.time() user system elapsed 0.933 0.023 0.950 gstat/tests/covtable.R0000644000176200001440000000057013777370515014501 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/allier.R0000644000176200001440000000164213777370515014153 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/blockkr.R0000644000176200001440000000214113777370515014325 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/na.action.Rout.save0000644000176200001440000000652713777370515016251 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/stars.Rout.save0000644000176200001440000004221514127330214015503 0ustar liggesusers R version 4.1.1 (2021-08-10) -- "Kick Things" Copyright (C) 2021 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. > Sys.setenv(TZ = "UTC") > > # 0. using sp: > > suppressPackageStartupMessages(library(sp)) > demo(meuse, ask = FALSE) demo(meuse) ---- ~~~~~ > require(sp) > crs = CRS("+init=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 Warning message: In showSRID(uprojargs, format = "PROJ", multiline = "NO", prefer_proj = prefer_proj) : Discarded datum Amersfoort in Proj4 definition > 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("+init=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 >" [4] "Attributes: < Component \"proj4string\": Attributes: < Component \"comment\": 1 string mismatch > >" > > # 2. using stars for grid: > > suppressPackageStartupMessages(library(rgdal)) > writeGDAL(meuse.grid[,"dist"], "meuse.tif", "GTiff") > suppressPackageStartupMessages(library(stars)) > (st0 = setNames(read_stars("meuse.tif"), "dist")) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's dist 0 0.1192915 0.271535 0.2971195 0.440159 0.992607 5009 dimension(s): from to offset delta refsys point values x/y x 1 78 178440 40 Amersfoort / RD New FALSE NULL [x] y 1 104 333760 -40 Amersfoort / RD New FALSE NULL [y] > st = st_as_stars(meuse.grid) > all.equal(st_dimensions(st0), st_dimensions(st)) [1] "Component \"x\": Component \"refsys\": Component \"wkt\": 1 string mismatch" [2] "Component \"x\": Component \"point\": 'is.NA' value mismatch: 1 in current 0 in target" [3] "Component \"y\": Component \"refsys\": Component \"wkt\": 1 string mismatch" [4] "Component \"y\": Component \"point\": 'is.NA' value mismatch: 1 in current 0 in target" > st_crs(st0) Coordinate Reference System: User input: Amersfoort / RD New wkt: PROJCRS["Amersfoort / RD New", BASEGEOGCRS["Amersfoort", DATUM["Amersfoort", ELLIPSOID["Bessel 1841",6377397.155,299.152812800003, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4289]], CONVERSION["Oblique Stereographic", METHOD["Oblique Stereographic", ID["EPSG",9809]], PARAMETER["Latitude of natural origin",52.1561605555556, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8801]], PARAMETER["Longitude of natural origin",5.38763888888889, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8802]], PARAMETER["Scale factor at natural origin",0.9999079, SCALEUNIT["unity",1], ID["EPSG",8805]], PARAMETER["False easting",155000, LENGTHUNIT["metre",1], ID["EPSG",8806]], PARAMETER["False northing",463000, LENGTHUNIT["metre",1], ID["EPSG",8807]]], CS[Cartesian,2], AXIS["easting",east, ORDER[1], LENGTHUNIT["metre",1, ID["EPSG",9001]]], AXIS["northing",north, ORDER[2], LENGTHUNIT["metre",1, ID["EPSG",9001]]]] > st_crs(st) Coordinate Reference System: User input: Amersfoort / RD New wkt: PROJCRS["Amersfoort / RD New", BASEGEOGCRS["Amersfoort", DATUM["Amersfoort", ELLIPSOID["Bessel 1841",6377397.155,299.1528128, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4289]], CONVERSION["RD New", METHOD["Oblique Stereographic", ID["EPSG",9809]], PARAMETER["Latitude of natural origin",52.1561605555556, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8801]], PARAMETER["Longitude of natural origin",5.38763888888889, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8802]], PARAMETER["Scale factor at natural origin",0.9999079, SCALEUNIT["unity",1], ID["EPSG",8805]], PARAMETER["False easting",155000, LENGTHUNIT["metre",1], ID["EPSG",8806]], PARAMETER["False northing",463000, LENGTHUNIT["metre",1], ID["EPSG",8807]], ID["EPSG",19914]], CS[Cartesian,2], AXIS["(E)",east, ORDER[1], LENGTHUNIT["metre",1, ID["EPSG",9001]]], AXIS["(N)",north, ORDER[2], LENGTHUNIT["metre",1, ID["EPSG",9001]]], USAGE[ SCOPE["unknown"], AREA["Netherlands - onshore, including Waddenzee, Dutch Wadden Islands and 12-mile offshore coastal zone."], BBOX[50.75,3.2,53.7,7.22]]] > > # 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. NA's 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 refsys point values x/y x 1 78 178440 40 NA NA NULL [x] y 1 104 333760 -40 NA NA NULL [y] > > # handle factors, when going to stars? > k_sp_grd$cls = cut(k_sp_grd$var1.pred, c(0, 5, 6, 7, 8, 9)) > st_as_stars(k_sp_grd) stars object with 2 dimensions and 3 attributes attribute(s): var1.pred var1.var cls Min. :4.777 Min. :0.085 (0,5]: 316 1st Qu.:5.238 1st Qu.:0.137 (5,6]:1778 Median :5.573 Median :0.162 (6,7]: 962 Mean :5.707 Mean :0.185 (7,8]: 47 3rd Qu.:6.172 3rd Qu.:0.212 (8,9]: 0 Max. :7.440 Max. :0.500 NA's :5009 NA's :5009 NA's :5009 dimension(s): from to offset delta refsys point values x/y x 1 78 178440 40 Amersfoort / RD New NA NULL [x] y 1 104 333760 -40 Amersfoort / RD New NA NULL [y] > st_as_stars(raster::stack(k_sp_grd)) # check stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's var1.pred 0.0854949 0.2116778 2 2.710347 5.237542 7.439991 15027 dimension(s): from to offset delta refsys point x 1 78 178440 40 Amersfoort / RD New NA y 1 104 333760 -40 Amersfoort / RD New NA band 1 3 NA NA NA NA values x/y x NULL [x] y NULL [y] band var1.pred, var1.var , cls > > all.equal(st_redimension(st_as_stars(k_sp_grd)), st_as_stars(raster::stack(k_sp_grd)), check.attributes=FALSE) [1] TRUE > > suppressPackageStartupMessages(library(spacetime)) > > Sys.setenv(TZ="") > 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 point values x/y x 1 4 10 0.5 NA NA NULL [x] y 1 4 0 -0.7 NA NA NULL [y] time 1 4 2019-02-25 15:37:25 UTC 1 secs POSIXct NA NULL > > 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) downsample set to c(0,0,1) > (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 point values x/y x 1 4 10 0.5 NA NA NULL [x] y 1 4 -1.11022e-16 -0.7 NA NA NULL [y] time 1 4 2019-02-25 15:37:25 UTC 1 secs POSIXct NA NULL > plot(s2, col = sf.colors(), axes = TRUE) downsample set to c(0,0,1) > 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) > (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. NA's zinc 101.7643 199.59256 300.2140 399.8017 544.0327 1817.2057 25045 lead 32.7799 73.03151 107.9339 133.1725 178.8162 638.9396 25045 dimension(s): from to offset delta refsys point values x/y x 1 78 178440 40 NA NA NULL [x] y 1 104 333760 -40 NA NA NULL [y] sample 1 5 NA NA NA NA sim1,...,sim5 > > proc.time() user system elapsed 2.922 0.116 3.051 gstat/tests/rings.Rout.save0000644000176200001440000001044713777370515015515 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/merge.R0000644000176200001440000000151513777370515014001 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/vdist.Rout.save0000644000176200001440000000241613777370515015521 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) > 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=10) [using ordinary kriging] coordinates var1.pred var1.var 1500 (180260, 331300) 5.007376 1.102622 > krige(log(zinc)~1,meuse,mg,vgm(1, "Exp", 300, anis=c(0,0.01)), + vdist=TRUE, maxdist=1000,nmax=10) [using ordinary kriging] coordinates var1.pred var1.var 1500 (180260, 331300) 5.50671 1.100095 > > proc.time() user system elapsed 1.308 0.052 1.370 gstat/tests/sim.Rout.save0000644000176200001440000000352413777370515015161 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/src/0000755000176200001440000000000014127330265012166 5ustar liggesusersgstat/src/sem.h0000644000176200001440000000125613777370515013143 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/data.c0000644000176200001440000006131214127263756013260 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/mapio.h0000644000176200001440000001133113777370515013457 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/userio.c0000644000176200001440000000620514127262566013653 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) error("NULL error: this indicates a bug, please consider reporting this\n"); if (msg == NULL) error(" message: indicating a software bug, please report\n"); else 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); 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/getest.c0000644000176200001440000004127113777370515013646 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/sim.c0000644000176200001440000001643313777370515013145 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); if (info != 0) pr_warning("singular simulation covariance matrix"); if (DEBUG_COV) { printlog("# decomposed error covariance matrix:\n"); m_logoutput(M); } /* zero upper triangle: */ for (i = 0; i < M->m; i++) for (j = i + 1; j < M->m; j++) ME(M, i, j) = 0.0; /* 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 = mv_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/block.c0000644000176200001440000001662013777370515013445 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/lm.h0000644000176200001440000000216613777370515012770 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/fit.c0000644000176200001440000002125413777370515013134 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/direct.h0000644000176200001440000000022313777370515013622 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/sim.h0000644000176200001440000000023213777370515013140 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/pqueue.c0000644000176200001440000001110513777370515013650 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/gcdist.c0000644000176200001440000000256613777370515013634 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/reml.c0000644000176200001440000002604413777370515013313 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/init.c0000644000176200001440000000435013777370515013313 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/pqueue.h0000644000176200001440000000166313777370515013665 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/glvars.c0000644000176200001440000006055413777370515013656 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, nposX, 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 == UKR || method == LSLM) { nposX = 0; for (i = 0; i < get_n_vars(); i++) for (j = 0; j < data[i]->n_X; j++) { if (data[i]->colX[j] > 0) nposX++; } } 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/nsearch.c0000644000176200001440000005246413777370515014004 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 Ume, 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.c0000644000176200001440000003015414127263516013333 0ustar liggesusers/* interface roughly follows meschach; implementation rewritten from scratch */ #include /* memcpy, memset */ #include /* fabs */ #define USE_FC_LEN_T #include "R_ext/Lapack.h" #ifndef FCONE # define FCONE #endif #include "defs.h" /* CDECL */ #include "utils.h" /* efree, emalloc */ #include "userio.h" /* ErrMsg */ #include "glvars.h" /* gl_blas */ #include "debug.h" #include "mtrx.h" #include "R.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) 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) warning("the leading minor of order %d is not positive definite", *info); if (*info < 0) error("argument %d of Lapack routine %s had invalid value", -(*info), "dpotrf"); } } else { /* LDL': */ if (piv->size != m->n) 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) warning("D[%d,%d] is exactly zero, meaning that D is singular", *info, *info); if (*info < 0) 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) error("CHsolve: 'm' must be a square matrix"); if (m->m != b->m) 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) 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) error("CHsolve1: 'm' must be a square matrix"); if (m->m != b->dim) 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) 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/data.h0000644000176200001440000002677113777370515013301 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/select.h0000644000176200001440000000004713777370515013633 0ustar liggesusersint select_at(DATA *d, DPOINT *where); gstat/src/utils.c0000644000176200001440000000472113777370515013512 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/vario_fn.c0000644000176200001440000001300613777370515014151 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/vario.c0000644000176200001440000005617113777370515013500 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/msim.c0000644000176200001440000002321313777370515013314 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/utils.h0000644000176200001440000000272613777370515013522 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/getest.h0000644000176200001440000000010613777370515013643 0ustar liggesusersvoid get_est(DATA **data, METHOD method, DPOINT *where, double *est); gstat/src/msim.h0000644000176200001440000000112513777370515013317 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/vario.h0000644000176200001440000001470113777370515013476 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/nsearch.h0000644000176200001440000000137013777370515013777 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/block.h0000644000176200001440000000014413777370515013444 0ustar liggesusersDATA *block_discr(DATA *d, const DPOINT *block, const DPOINT *where); void reset_block_discr(void); gstat/src/reml.h0000644000176200001440000000035213777370515013312 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/s.h0000644000176200001440000000024613777370515012617 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/mapio.c0000644000176200001440000000622513777370515013460 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/gls.h0000644000176200001440000000074213777370515013143 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/userio.h0000644000176200001440000000302413777370515013660 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/Makevars0000644000176200001440000000006013777370515013672 0ustar liggesusersPKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) gstat/src/mtrx.h0000644000176200001440000000377013777370515013354 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/gcdist.h0000644000176200001440000000011113777370515013621 0ustar liggesusersdouble gstat_gcdist(double lon1, double lon2, double lat1, double lat2); gstat/src/vario_io.c0000644000176200001440000001011113777370515014147 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/defaults.h0000644000176200001440000000366013777370515014167 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.h0000644000176200001440000000412313777370515013441 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/vario_io.h0000644000176200001440000000156513777370515014171 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/s.c0000644000176200001440000007431714127264041012606 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 = coerceVector(sy, REALSXP)); n = LENGTH(sy); y = REAL(sy); if (n == 0) ErrMsg(ER_IMPOSVAL, "no data read"); if (LENGTH(slocs) % n != 0) error("dimensions do not match: locations %d and data %ld", (int) LENGTH(slocs), n); dim = LENGTH(slocs) / n; if (dim <= 0) error("too few spatial dimensions: %ld", dim); if (dim > 3) error("too many spatial dimensions: %ld", dim); locs = REAL(slocs); if (LENGTH(sw) == n) w = REAL(sw); if (LENGTH(sX) % n != 0) 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: 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: 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) { 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) { error("polynomial degree will only work for a single variable"); } if (n_X > 1) { 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) error("dimension value impossible: %d", dim); if (dim > 3) 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: 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) error("dimensions do not match: locations %d, nrows in X %ld", (int) LENGTH(slocs), n); dim = LENGTH(slocs) / n; if (dim > 3) error("too many spatial dimensions: %ld", dim); if (dim <= 0) error("too few spatial dimensions: %ld", dim); locs = REAL(slocs); if (LENGTH(sX) % n != 0) 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 = allocVector(VECSXP, 1)); PROTECT(retvector_dim = allocVector(REALSXP, 2)); REAL(retvector_dim)[0] = n; /* nrows */ if (gl_nsim > 1) { PROTECT(retvector = 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 = 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); */ 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: error("unrecognized grid length in gstat_variogram"); break; } calc_variogram(vgm, NULL); if (vgm->ev->S_grid != NULL) { PROTECT(ret = allocVector(VECSXP, 4)); m = vgm->ev->map; n = m->rows * m->cols; PROTECT(np = allocVector(REALSXP, n)); PROTECT(gamma = allocVector(REALSXP, n)); PROTECT(sx = allocVector(REALSXP, n)); PROTECT(sy = 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 = allocVector(VECSXP, 4)); if (nest <= 0) { UNPROTECT(1); return(ret); } PROTECT(np = allocVector(REALSXP, nest)); PROTECT(dist = allocVector(REALSXP, nest)); PROTECT(gamma = allocVector(REALSXP, nest)); PROTECT(ev_parameters = 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) 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 = allocVector(REALSXP, ndist)); PROTECT(gamma = 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 = allocVector(REALSXP, n)); PROTECT(gamma = 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 = 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 = allocVector(REALSXP, length_list)); PROTECT(gamma = 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 = 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 = allocVector(STRSXP, n)); for (i = 1; v_models[i].model != NOT_SP; i++) SET_STRING_ELT(ret, i-1, 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 = allocVector(REALSXP, vgm->n_models)); PROTECT(ranges = 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 = allocVector(VECSXP, 4)); SET_VECTOR_ELT(ret, 0, sills); SET_VECTOR_ELT(ret, 1, ranges); PROTECT(fit_is_singular = allocVector(REALSXP, 1)); REAL(fit_is_singular)[0] = vgm->fit_is_singular; SET_VECTOR_ELT(ret, 2, fit_is_singular); PROTECT(SSErr = 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) = asInteger(val); /* Rprintf("int arg: %s val %d\n", name, asInteger(val)); */ break; case IS_UINT: *((unsigned int *) set_options[i].ptr) = (unsigned int) asInteger(val); /* Rprintf("uint arg: %s val %d\n", name, asInteger(val)); */ break; case IS_REAL: *((double *) set_options[i].ptr) = 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 = asInteger(a); id2 = asInteger(c); if (id1 >= get_n_vars() || id2 >= get_n_vars() || id1 < 0 || id2 < 0) ErrMsg(ER_IMPOSVAL, "id values out of range"); col1 = asInteger(b); col2 = 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/sem.c0000644000176200001440000005542413777370515013144 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/gls.c0000644000176200001440000005136613777370515013146 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/fit.h0000644000176200001440000000023013777370515013130 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/src/direct.c0000644000176200001440000000727013777370515013626 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/lm.c0000644000176200001440000003175314115426745012761 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.h0000644000176200001440000000516313777370515013656 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/defs.h0000644000176200001440000000072313777370515013276 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/select.c0000644000176200001440000001636614127264064013630 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/vario_fn.h0000644000176200001440000000305713777370515014163 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/vignettes/0000755000176200001440000000000014127330263013405 5ustar liggesusersgstat/vignettes/spatio-temporal-kriging.bib0000644000176200001440000003163513777370515020661 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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://www.ij-healthgeographics.com/content/14/1/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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://dx.doi.org/10.1016/j.tra.2014.01.004}, issn = {0965-8564} } gstat/vignettes/spatio-temporal-kriging.Rnw0000644000176200001440000015665013777370515020700 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\footnote{\url{https://cran.r-project.org/web/views/SpatioTemporal.html}}. 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{http://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. An animation of the entire year of daily mean ${\rm PM}_{10}$ prediction maps can be viewed online.\footnote{\url{http://gstat.r-forge.r-project.org/STpred.html}}. 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/ifgi-logo_int.pdf0000644000176200001440000002421513777370515016650 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/figures/0000755000176200001440000000000013777370515015067 5ustar liggesusersgstat/vignettes/figures/allVgmsDiffWireframe.png0000644000176200001440000010776313777370515021653 0ustar liggesusersPNG  IHDRFZo.PLTE.3:<ORXfkt}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>BLPUY^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/daily_means_PM10.png0000644000176200001440000014034213777370515020623 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/figures/pred_daily_means_PM10.png0000644000176200001440000024167613777370515021651 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. ^GEyT{>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{9hY(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/diffs_daily_means_PM10.png0000644000176200001440000011265713777370515022006 0ustar liggesusersPNG  IHDRFZoPLTE.3:Rf3s:\f:::::::fff3:.̐\fRs呶̶)ۀ.ې:cRfsې`r pHYs&? IDATx콍䶍y'Iڻ'Nۤ&q;:*I J$\v* R7ȇ?RUEMMMMPSSSTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLF$,jySB)!̔f~Met0SB)!̔f*L a0SܔfJ3%䦄0SB)!TF'7%L a2?~"W3jK_sxOޫ-T 񛸜0?"=D^/?\K=ڒI*?n^NBӼ@2jώ'0b=~{BpuN(Ճ|?m 2~5l߭{W=?OM >j!؏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/allVgmsWireframe.png0000644000176200001440000012673713777370515021064 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/.install_extras0000644000176200001440000000003313777370515016454 0ustar liggesusersspatio-temporal-kriging.bibgstat/vignettes/prs.Rnw0000644000176200001440000002004513777370515014720 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/gstat.Rnw0000644000176200001440000003156713777370515015251 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 \htmladdnormallink{30: 683-691}{% http://www.sciencedirect.com/science/journal/00983004}. % \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/vignettes/st.Rnw0000644000176200001440000003643513777370515014554 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{http://www.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,]), 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) acf(na.omit(r5to10[i,]), 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. An interactive variogram exploration web-tool is avaialble at \url{http://giv-graeler.uni-muenster.de:3838/spacetime/}. \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{http://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/R/0000755000176200001440000000000014073614226011602 5ustar liggesusersgstat/R/set.R0000644000176200001440000000304313777370515012532 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/fit.variogram.R0000644000176200001440000000766113777370515014521 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 (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/krigeTg.R0000644000176200001440000000437313777370515013342 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/fit.variogram.gls.R0000644000176200001440000001152413777370515015276 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/gstat.formula.R0000644000176200001440000000152513777370515014530 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/krigeST.R0000644000176200001440000004303414020664366013303 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)) return_stars = if (inherits(data, "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 (!identical(data@sp@proj4string, newdata@sp@proj4string)) 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")) & inherits(newdata, c("STF", "STS", "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) return(stars::st_as_stars(as(ret, "STFDF"))) else return(ret) } 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) stars::st_as_stars(as(ret, "STFDF")) else 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(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) 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/panel.pointPairs.R0000644000176200001440000000206113777370515015164 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 = 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/zzz.R0000644000176200001440000000066613777370515012604 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.predict.R0000644000176200001440000000427114002373634016145 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.variogram.R0000644000176200001440000000021213777370515015054 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/krige0.R0000644000176200001440000001060014013274710013075 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, newdata@sp@proj4string)) else stopifnot(identical(data@proj4string, newdata@proj4string)) 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/print.variogramModel.R0000644000176200001440000000130013777370515016034 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/plot.gstatVariogram.R0000644000176200001440000001130613777370515015707 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/show.vgms.R0000644000176200001440000000535313777370515013700 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/get.contr.R0000644000176200001440000000411013777370515013636 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/stVariogramModels.R0000644000176200001440000010437614051241213015366 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, "STI") || inherits(y, "STI")) { # 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")) & inherits(y, c("STF", "STS", "STI"))) # 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, "STI") | inherits(y, "STI")) { # 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")) & inherits(y, c("STF", "STS", "STI"))) 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, "STI") | inherits(y, "STI")) { # 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")) & inherits(y, c("STF", "STS", "STI"))) # 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, "STI") | inherits(y, "STI")) { # 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")) & inherits(y, c("STF", "STS", "STI"))) # 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, "STI") | inherits(y, "STI")) { # 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) { if (!inherits(object, "StVariogram")) stop("\"object\" must be of class \"StVariogram\"") if (!inherits(model, "StVariogramModel")) stop("\"model\" must be of class \"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/fit.lmc.R0000644000176200001440000000354413777370515013301 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/plot.variogramCloud.R0000644000176200001440000000437513777370515015703 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/fit.variogram.reml.R0000644000176200001440000000312613777370515015447 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/turningLayers.R0000644000176200001440000003052513777370515014612 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/circEmbed.R0000644000176200001440000002127114013274116013577 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 (class(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, newdata@proj4string)) 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/hscat.R0000644000176200001440000000151313777370515013041 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/plot.pointPairs.R0000644000176200001440000000121713777370515015045 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/print.gstat.R0000644000176200001440000000451713777370515014223 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/krige.cv.R0000644000176200001440000000345113777370515013452 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/predict.gstat.R0000644000176200001440000002315214013274306014476 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, newdata@proj4string)) { 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 = 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 = 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 = 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 (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/load.variogram.model.R0000644000176200001440000000244313777370515015746 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/gstat.cv.R0000644000176200001440000000525314013273067013461 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/vgm.panel.R0000644000176200001440000000472513777370515013636 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/gstatOptions.R0000644000176200001440000000061513777370515014437 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/map.to.lev.R0000644000176200001440000000146013777370515013723 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/variogram.gstat.R0000644000176200001440000000201514013274341015025 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 = object$data)) { d = object$data[[i]] beta[[i]] = d$beta if (i > 1 && !identical(object$data[[1]]$data@proj4string, d$data@proj4string)) 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/gstat.debug.R0000644000176200001440000000023513777370515014146 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/variogramLine.R0000644000176200001440000000232013777370515014533 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]]) } # Sat Mar 14 15:11:55 CET 2015: removed this: # "variogram.line" <- function(..., deprecate = TRUE) { # if (deprecate) # cat("variogram.line is DEPRECATED, please use variogramLine instead\n") # variogramLine(...) # } gstat/R/krige.R0000644000176200001440000001445014013273775013036 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/vgm.R0000644000176200001440000001110013777370515012521 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/variogram.formula.R0000644000176200001440000000163013777370515015372 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, "sf")) || (inherits(locations, "sf"))) { 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/spplot.R0000644000176200001440000000121013777370515013252 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/variogram.default.R0000644000176200001440000001477213777370515015364 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/ossfim.R0000644000176200001440000000143513777370515013242 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/image.data.frame.R0000644000176200001440000000036313777370515015024 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/xyz2img.R0000644000176200001440000000203113777370515013344 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/print.variogramCloud.R0000644000176200001440000000054313777370515016052 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/gstat.R0000644000176200001440000001031114073614226013043 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, data@proj4string)) 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/variogramST.R0000644000176200001440000003774414051242617014177 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(is(data, "STIDF")) return(variogramST.STIDF(formula, data, 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 = 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('multiprocess', workers = cores) ret <- split(seq(along=tlags), seq(along=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)) 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) 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("multiprocess", 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/NEWS.md0000644000176200001440000000621313777370515012513 0ustar liggesusers# 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/MD50000644000176200001440000003256314127334762011726 0ustar liggesusersb930a1c993354b3d71cc449df073d4be *CHANGES 796267d62fe3bae9785f3b1b460e80c0 *DESCRIPTION 3d8f0ef09f46d2ba801c2ffe1f264113 *NAMESPACE 7533e2e8dfc976e9442b9ca442ef9bc5 *NEWS.md adda186a46ed5091f04edfe8bfd65934 *R/circEmbed.R 02a9d4ea0f96e71d31a614d441396d5f *R/fit.lmc.R 041adc63fbf22cf37e231eea21f25cec *R/fit.variogram.R 11df50040d29f897a44fbf7c5dcc5a66 *R/fit.variogram.gls.R b6fba7c709ffa4fbb952fa22fb4cd398 *R/fit.variogram.reml.R d3b1befeb3d012d19788a085c61cbc7e *R/get.contr.R 7b327e62395604bde87aa7f4e871e382 *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 755518e9a1f72a7fd5fc53ee1fccfaf7 *R/krige0.R de334c42e6fab5cc179572761be4884a *R/krigeST.R 6a8e3f331a9010d0167936ced6f831a2 *R/krigeTg.R 7ecb72625e1709c19958771d5258f4e5 *R/load.variogram.model.R 5e4ca298349e3841bcd67b74ec2b4b45 *R/map.to.lev.R 8abf80dfb1af614d77fa1f302ee6c264 *R/ossfim.R e09dcc7a79a2ea1106bf2f0681ae7fa1 *R/panel.pointPairs.R b337728e2f7ebb444b598cbec7e6daea *R/plot.gstatVariogram.R 0ec356599d0f8b2a46b862681167bbe5 *R/plot.pointPairs.R 6be9f49eb64aa34ba6106147d375d01d *R/plot.variogramCloud.R 78aa524452918c2babb05113b5a7d813 *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 35dbaefb8a26f5cf29923253ef966c54 *R/stVariogramModels.R 69f173064b6699bea0256867d43f42cf *R/turningLayers.R 425833489f7d223b4ce8f478464e0d83 *R/variogram.default.R f8a60677ced80271a6ef35040ea746c9 *R/variogram.formula.R b7add2b46ce81a78a5a862102f5d0d96 *R/variogram.gstat.R 7ac1739a2450448bbc435e421954255d *R/variogramLine.R 706f9dc184aeb4de366d03db43bd8d86 *R/variogramST.R 627d13473d2a3275f0cda066b5a45623 *R/vgm.R d07099f46a9c8618d8719bd422b96f9f *R/vgm.panel.R 216b232871afa74f72e25e0ba1610fda *R/xyz2img.R fcf925486eda62721c36865214ee21a4 *R/zzz.R 762d1edb68cb0e0e63aac65c621157f6 *build/vignette.rds 420b8870b1ee5885e49e1c6cf85fab8f *cleanup dbf856962d3095443990a64d4761643f *data/DE_RB_2005.rda 56e59192bfffd41b0c2c9d6bead5ad5f *data/coalash.rda b64de1613c92407396647ff0eb8fe075 *data/fulmar.rda 12448ec9b13523d004202d69f381e41e *data/jura.rda 782123d4a11bef946e68a38455715403 *data/meuse.all.rda 43a5e26f4d1a0e76909c88bdd74928a7 *data/meuse.alt.rda fac93c83ffe13d01d164087c58fa4d58 *data/ncp.grid.rda bd63245077ea9b1ae026dba7b13f3e31 *data/oxford.rda a95f727ebccd7e10222d09deb6901e1a *data/pcb.rda 8bee71ee944ceb46cf2bee8f070788bf *data/sic2004.rda eb32508472657926aab4c06855551c72 *data/sic97.rda 0d8658a07f469af818eed30f147a1f39 *data/tull.rda ad99d7e0e88faea23276e4f5cd67e547 *data/vv.rda 67916547f2407680a06ffbeeeb355ca8 *data/walker.rda 9d3f9e8682da5bcda3ea082fcfb6497c *data/wind.rda af10ac86938bd276ac42ab99e54534f5 *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 8c5749a11ea0f3a3ca39c0b3bdbf334b *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 2ef5e7ba229731b758ca9f053ec6276a *demo/rep.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 d853168a2850c381a9a3a2cbc55c0cdb *inst/CITATION 4fb7e4c519bf5bea3c4eb66238c55afa *inst/doc/gstat.R af5b04d479d7308e5fb32522ef03bfb5 *inst/doc/gstat.Rnw 45560cff587bab517e94fff94b21040e *inst/doc/gstat.pdf 626f14d14182c6fb8b5d3dd6e855f387 *inst/doc/prs.R 4961b8e9071476d87816c5d9052380f0 *inst/doc/prs.Rnw 31878207554b9e5f66793688bfcc6148 *inst/doc/prs.pdf 1cf59eefc43986e06838c7586393c912 *inst/doc/spatio-temporal-kriging.Rnw d21947b646d617a250166e557c731e11 *inst/doc/spatio-temporal-kriging.bib 46678af4bbb8ec790188e5ffbb91266b *inst/doc/spatio-temporal-kriging.pdf b059341de51755a03b51bfb18e488913 *inst/doc/st.R bde19f77aa7859b34f3dca51ab1cb93c *inst/doc/st.Rnw b2c57999e7213446baf34ad2d145b56e *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 c5faaf794923b3eaced427445e585351 *man/coalash.Rd 6ba0d013bc23fd3cdac5a9489116b29a *man/estiStAni.Rd f5a11c0a4c9ba23bd51089810f1ec03c *man/extractPar.Rd 097f908bb113d72690e9cee7b05f2b60 *man/fit.StVariogram.Rd 308f2115a92bd0e02b43ba1bba2659f7 *man/fit.lmc.Rd 3fefe47150cf93c72bbdfa977987a4be *man/fit.variogram.Rd 9d1cb21ea134d29aa8e7724b41a030f9 *man/fit.variogram.gls.Rd 5639348c778a32774fc39d231626cb1c *man/fit.variogram.reml.Rd 05bfbe18ee524a457d28f330288dae4e *man/fulmar.Rd 8959ff48e738d7c0eb41abcfc5b4fe0c *man/get.contr.Rd ca84fba4fa23c468e614795fcddc898c *man/gstat-internal.Rd 6760c29618983446c62c02cffb0b2883 *man/gstat.Rd fbf6173c37452d35b9e8117e680c5259 *man/hscat.Rd 7c6aa566ef9c873de1cf4263bd7a6e0f *man/image.Rd 22ebf5cdc30eff2ef223a65ad5dd220c *man/jura.Rd e859180241785faeab36a8260797b44e *man/krige.Rd 180a0ee9329a24092b869f003e2e3bd7 *man/krige.cv.Rd 6d722293ab80b308235fcd180a7c4059 *man/krigeST.Rd 5f442e7128f579a38fb04c05a011495d *man/krigeSTSimTB.Rd 76113d04d375455608991f702fbb7e62 *man/krigeSimCE.Rd 9af193544faadff589538bb49a46a4a7 *man/krigeTg.Rd ef9f95b6ace5e25d9851b1978ec8a796 *man/map.to.lev.Rd bd961d9d0341d68aa908d31684b7cbc5 *man/meuse.all.Rd d558f21cc61e41cb1facf19de2c9dcfd *man/meuse.alt.Rd dbc2e0fef45b60c96b307de014b17e7c *man/ncp.grid.Rd c0fd21ba73c250320c57b5f28597e349 *man/ossfim.Rd a775ef616da51224620e7cc9a832de6f *man/oxford.Rd 6108b950852692758dee8d55c65ea5bd *man/pcb.Rd d20215bcc91d229474b46b5ba1c67f3b *man/plot.gstatVariogram.Rd 57669f191cb4f5d820e868947d550bd5 *man/plot.pointPairs.Rd a184e23f6c4f261390e3bf475c933589 *man/plot.variogramCloud.Rd 711641753f6d3b5e37765ec833002050 *man/predict.gstat.Rd e3b9c69fea5e974be1491666dd9e7f2f *man/progress.Rd 2adbec7bd98ac8e9dd1285593335c92f *man/show.vgms.Rd e5fe017cb5ae57daf1dfec8ad3d076db *man/sic2004.Rd f34824e704e398015a0fd1a5b9a9421d *man/sic97.Rd 4856c6bd3604ced90ba111d984d83abc *man/spplot.vcov.Rd ed6845ea040e1eb85b0e357ce6d7ee38 *man/tull.Rd 351d4c0015c3345c56a9fdaad1d826bb *man/variogram.Rd 533d618caf8af5a60c14e4cd9d1055b8 *man/variogramLine.Rd b91d51042d2bb9ef38359015a3979a3c *man/variogramST.Rd 4169384801c30bd594a70d3ef51bcbc6 *man/variogramSurface.Rd eee2fff29f1704311b499a5ebfa19afc *man/vgm.Rd 08d0b95c572f944aea7ada44180355e1 *man/vgm.panel.Rd bd8034339dacae22ef6d14b796517f90 *man/vgmArea.Rd 576f2984d904a947939985f1d26e046b *man/vgmAreaST.Rd 01a7a226446af1c5512d99448bfd5fd8 *man/vgmST.Rd c6589cc4b53810b4bf410a479058c0cd *man/vv.Rd 0a76cbcf4763ef6fb30e4ed54330baf6 *man/walker.Rd c801c75ca84363ce6792c28897080cb0 *man/wind.Rd 2a6f9e9e044a78154d3cfda5936d6f48 *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 765b8ed6abea6608f292acc20541aba1 *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 8f8c78b7e8e61f68567cc392d51e9edf *src/mtrx.c fdbe09c20a4c7b49d85f8c3e6b4b9820 *src/mtrx.h e1ac779d8c1ff43fc5de3e86faa48d4e *src/nsearch.c cb7c7884a7504da02bfdd19ed10dc665 *src/nsearch.h cd520f7adb1880aab8cc98b35cc60c0d *src/pqueue.c a0c57bd9852efe71fd1323a220816b0a *src/pqueue.h 8a23f9662162c6c1ff6fc028bfa9ef68 *src/reml.c dc58fae97b9abee9228ba2ae92c9a126 *src/reml.h 7eb69baac97c96a6da61e9f53559bc2f *src/s.c 3b75b902aa067dcbdcfe59c6e79cd943 *src/s.h 8ca1be20f6d08c72bff6928589a1444d *src/select.c f9f9efd4c025607820dd39928231d6e8 *src/select.h cb308ac96305994692d7740e0c3b5a34 *src/sem.c 28c8554fc50566818c33ecdbded5dd89 *src/sem.h 9d78bb795a112f75525d21e1d7eff9fb *src/sim.c 4481ac8fe298f827274c7f9bc5619990 *src/sim.h d347a7ef994ea2b581853f845831f7ef *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 e0d943e009438cbff7655bd375bd323c *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 1322024fa15bac4f1fe46c75567d4d05 *tests/cv.Rout.save 6bb81fcd91cf3f5b22da90c3b67b0d3b *tests/cv3d.R 1b61213f5ae08f8cfb3e71dba83d2f5d *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 69ad23288ceae159e3d09c842644a63b *tests/line.Rout.save 580757bef9267e0f1b06dd39a1c55efa *tests/merge.R eea365f0cf971b2647bde96dfec9dfeb *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 7a19e5b59e6b8f9958a8aa22c0994d63 *tests/stars.R f5cc4f841e3ef92ea97f008cf96ebe78 *tests/stars.Rout.save 46b9034d72667019e71d0319adc3d53b *tests/unproj.R a7b09dc3b7c6bfc5c8a4d570cf532842 *tests/unproj.Rout.save 0ce127ddb2b0c900c6634acef7c4cc9c *tests/variogram.R b7587d353040687e3dc23a7e0e1c9378 *tests/variogram.Rout.save b848707caaecfc3e0fb84925f4fede91 *tests/vdist.R 8f65569f810165f874308f4d0b35534f *tests/vdist.Rout.save 7089916daf89212a30a20dfc5d88f151 *tests/windst.R 063a0745fafdfca6112127cc02d3bd56 *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 af5b04d479d7308e5fb32522ef03bfb5 *vignettes/gstat.Rnw 23a8ca706b284fdd73be5e1958601d75 *vignettes/ifgi-logo_int.pdf 4961b8e9071476d87816c5d9052380f0 *vignettes/prs.Rnw 1cf59eefc43986e06838c7586393c912 *vignettes/spatio-temporal-kriging.Rnw d21947b646d617a250166e557c731e11 *vignettes/spatio-temporal-kriging.bib bde19f77aa7859b34f3dca51ab1cb93c *vignettes/st.Rnw gstat/inst/0000755000176200001440000000000014127330265012354 5ustar liggesusersgstat/inst/doc/0000755000176200001440000000000014127330263013117 5ustar liggesusersgstat/inst/doc/gstat.pdf0000644000176200001440000120407214127330263014742 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 2709 /Filter /FlateDecode /N 55 /First 421 >> stream xZmSۺ~v: ɖt:Bi:`ԱiPz~}Vv @ejg,2?`sdy`>RPmBf@0Fپ@1; pdF>s=/:>:aK2b.ia9;(= r- Dpq X 5a6&a`6C7dbhYC,<>_L:dRa%0c$:2eRiE0ZfXd=Hcű PwPʐD( `ׯ?QE44+8U9vKOkTi6XTwHyS!I 4i^R#z6˞*/_miCYiBVRj#5YB/e.hYtM͂0&ԅ7i!($7T|=2'f{| +Q|JįO<3~ç<繺U);^b7GMi~ sD9zsv+/%yy' ]ڏD5ges%ABa dE8qc .wND 441k M2Osjx^Ut4Ć$-w6IJη<˼ja6^;: ԗѷ.ԅ-tտ\ڇ뵁^JݩjUKlcnV|QZi5~Sb&Z}Vv=aLК⸈\*4fgqt6<] ֵa:E@M2]Fc5Q@Q]mCAK-,<W]>{GհEƦ$"S uIYoMf* 4K"Fdk%EGkGAYGB0 Z/ %Nm'W J'Ҵ^Nf{ [_ wAS^3&G8ҋ};|?d'+*<,n{;3QN<\h#trϗ>PmDW2>57Jӻ]:4u@ӽLH,#݁[C_\W'<_?RxnbW@dd6mHos>7-) o=.[J]Q[a: YfMj&&꿀OR[{d9HaEo3h+ƕ7(ZpgN)Rbo ѣPhA1ݔ8Iqendstream endobj 57 0 obj << /Subtype /XML /Type /Metadata /Length 1549 >> stream GPL Ghostscript 9.50 2021-10-06T16:20:35+02:00 2021-10-06T16:20:35+02:00 LaTeX with hyperref endstream endobj 58 0 obj << /Type /ObjStm /Length 1983 /Filter /FlateDecode /N 55 /First 446 >> stream xYr7}߯cR%=r%Yk/q(ŲIP|\87#Y٪-z(fHѐ 3N2/"0AH 1@ `BJ't]@LC`"P$}% 5'%А*e!7FxAؿ'D<+Gs/ v>#_ǁtjQ[0O"e/.K!L" /6he68jEKe5J72J;0 դҒ4խEE=)]8t56ƍ,⫩qS#߯1iQ.ڢ&ܙ]ͯq m蚧;Ҵӻ͓}٭q˚*yU*do;dҋtouEIOLaU'fuF^g8ΦYJL!|5;N ʓgPܦ$*meUXBp`,,}^}gN?G GmߖdkQ6EUh-7}6A~n n7d `->`sKYڌmC'_$b^TB'Nޗm#2eꡆ\>=ޡBnoIq_'MWbbt/7m|k920qf5eQ߷b$iwY%Jz` |P=[#,߉3U{>&G%öL'773ru:&Vh)?3>[-VK~S~ɯ5k1Jqӫ Ca+C9v)>; X}?I.=ʦlB fF ^қ19[0nidgNNفdYz4p3QB5έsp$pTmrmlmz_SEjɽ7N<{A>ԺCa %ȓqjl[kvO* wsIW]hDR^"faL#=lL׫zɠʠJJہG=x _|y{?NakhS}Ydk{ю25)DIɚjsli}v%-ZHD yPW+9~ & ]٪GwNy6rc]SQIY6L]ز.!39@G[ք6YWfᙎ~U#Y;B ~[&X܁>Z/d~lRLW#:K)trYssee:#)s=2Kko˻M#k2v. ni&'Җn^a>ģPzsqohs|< vvKcmY6t𷶑X $ ;+;xIl AN3_>>wGCAǕ6ʝ Yd:tyG6ߒҮtPob.rB$=gxԃlH#f~tbX;vgW]Ѷq\MkH>awxV˿v˧\ cY6_-gο~:r,@Ƌo跜.+!q"]6U+2L ֌Z 7rHt#ҏrfJKB)[=#}[旗L.CU~!-sOY@f &_tendstream endobj 114 0 obj << /Filter /FlateDecode /Length 4106 >> stream x[r#sqpF/>*pamnm@@lRՕ 6z|r '߽1a;S|#.t?pnLƤ8=t6N`zVsiyZ[66-Jxoq]vvyˠ?jnK|!T&mc tyvàMAvEycиϩQqav-އ J{6FX:-N/@W(oQy)&5n `,&ۜ4Ϯ yP/;ry㌯CaY]M~y2vin N{ Vyf P}yopjJL0QQ(0 #w T `%ԯ WXke"\D/Żg5<3A\+(C)kqтvc3,?q@h1 "^2o@3 Fؾ={aAvƺJVިXv3߈/;T8j ~%y JEC Z<&c-2]7T $NIE@?NNƺʎ `9u؏Rҷ+Xb׫ NcagPh CC<7e_;M:3y`Ke١RU HC _pcd#EL A#K6>M&9>ɒz4̹ULMhP(: |::dBi`:rL-J^ش@'B W~Oh .#4T5jݽc산0USҀG񺘇H@Ii& q=A@txш~&#a%w0>Mʁ?tM8f&ǩE'|a_GҺM VaaBGI\O:ESx+k JߊRF`!ص^7kT'0 ZT&jQ9RQuAyх1bTFy kp6WoxN+7)V%@L }+G& 䢓#:Z|EM QG FP\EK g; 6)(ׇ`p(we->"* ̦'q& ̽O]bFʟ۩J W$%b= `*;G_2&ęcsua\&f{ , #-$(RH 2!y=E'LL(tx6<,80 ,e#!)S2ع0%Ҍg"* w=Exf-}G w UN\fFϥ<`(!]qyNF pO:eM{lu 洠C\]ȼ 0񗍘CKUF?&&v 8 *s'vŔZFX((6d䡵'`ρkS y%ַヲ##~$0X&ȁGQj_4 l@eO!FAd(EpvTBZ|jkG_7\I!~EgGMH;SUA#mYf_r|9aF} 72^RB7BԀģ(h 41M{S8=8kl_ B>=ͺuʆIl1G+> ]-ܽ >༰[CMP4v Hd?ȾhQ̰Il"dҺM}R;x[AIUn3E毢ZwTٌwe̚l %v#DH`^J9y`ݠy7 ީ>rRNck۫&)> j':3B]9CMB.4ilW[7Aj+MI6vwZ6?i2J<+=:agLOyG+\O+8<#rԝ1`Tٿ2uq4n~Qe}C!}g.tV{FMI,J\vw̥ `ּ݆_!6ӑhv{L%[ lGt#q.Scr dV63:ksبhߕTR>fqdgu hXL7/ioi@i>44MB[!f0d<%,N?V? @^ϗb=Pi_NUJQ^QO/fۙupl\<=J&I$̓[bG3pXwЯ9JeZ3v9A+쁵ٺ#P)833NhI:_991}/˙c/OLe 0h"#'zOu&n/8/R{Lо<6*77$޷E6OWВEEF1#a O3PAh8`q<`ta`YόBcWkܰO;>MBq:C(7|V] ͺSA6ŻZzQ; ștgOtQ ={~a;Z{dW.sY mMXu돒n ݱ㎲%&E8 Ft9RwYzV uY4ڙHkg"},xeg yzpmcaM爻.r Q4W(V;!eT4_bxw:mK~nhƍטRRDĒulqjClkwC v'3hk>XSs|yU\ [Dw/0,7dmYMޤ9(jNO ٧ endstream endobj 115 0 obj << /Filter /FlateDecode /Length 3036 >> stream xYYo~ 4x'}@ F,CYK.ISriTwtU.IQ2>]WG7g}kOޯ{2~~;ݏ}tdR>륊O3`I0\6Flw 6DTw5zUwZԾ[_:Fc4(t;bn1*r! < LN fN }Y+L(ZE-tHr:Vu0tфׅ-2vi]-@q9*YtZnueVK`v`drA6/P1<&Kz:1i9[b&.,S߮/Dܡ~}>HKGk|\ A)zٚy5kthhAq"(J\wQ̨^"f:Fјo^yV-mIQ􇬅L^A#G.q׺e&VmvOc͘52:!M)sW&@AAzP_F؝d/Dt #DVaArbYJ(2^THԺR++ԱQ!;sU=LV6eYԶ[ܢ-$ke%%aJyM Ϧ]z/-Ca$q٠!kOBDhQTήL,Ac$s"#ⱱ3DuId4j[`ы#uw|zȇd+ZU*@f ݱg}ƀN#ۺ#z{vz#SƁ*3G; `[ T)Jo `$~f&6\a4Yj1*9$CkMOįC 2Rݧq!~#ҵ΋vAnͯ?n>ilGSWuICmeرAi||)!4~2hU'Z$OoQ9)Wc+Gy />*} mB47nQyp$/|97԰Ufmf7JTjǍָ=L~͖ΐiƘ唀`}L\L##C(uIݨ`Wewsk32KɣUΠ7fUӗ(1s w/ZZXJӇ ,S\q&=Mbƻ 2_Ȁ5j$[?Ul,&3=И72yp}Qz^14YqC+E.O< # rBA٧m\ɬ D/ЀɫY+uUR#y]KcݲRP'un+u39Of=~SwZ~cY4Jۭpq[ SM\)g< 2_2>9i RGΘrp#9Ip0TaU\aޯ[/0cկM0<gXMϙ#+F;c1[F׆&^^ܴ׳f|%jf(y0҅y`c!tt_oR&gw#?fM.wd? r ?s&K?<ǯ|1C JbY@|Ƞtqcߎс.r@̭ޓ7Ou;f4!y%I[®AeG iLJK w ݔC̲ļ©UJTrJE†>#G<ӞbÒ8cY#Jͯ(E]|VK}Q\1z*miR惘5W9H7^OqujT]6m -sbG>i1z.Ga[}K.osVvu+wwN;LA>n Arǝm1dH B}]?zVFJ,ZHF+T;Bv7jȫx˨O,Vw9uגaSF!X3S\0l¸"fv N/L6A$kT"ַ2 h$M30/ ،xkЧ224o5/+f$w8u{}-s#k2z`Q1]+ODـ[u?Ieo )Kgzi>g콂(+Yendstream endobj 116 0 obj << /Filter /FlateDecode /Length 2694 >> stream xZKs#P:-z'!el9I>@& cߞݙE(qU\:kw_3໙L/]ݙLogBY좃I;o IgWr3JD٬ֺ5i26;6i##MlU^[Bp~4Εb(!ۺnEUgZ *;[ [cK>/CfKV]sObh5dj.;pAHH"-ҦH"HyoͽQ: v|A& Z09!4&6 sr!|I %LUXbTRIATQĮD1&S. cҜ}1`#L׾(hb>2Z,RPћ;g!e Ys6l/J̈.eicgjH6jF/h,KF0f!M硐Ň3[d঄ k5=ǹ- qv bوt:Ϻ"]0X]*uƇ8Np]/2*"Gb )FŠ2gd|s4oWE( RZ  e6輸egy{]$6/;Vx㑮 8/7B 2Ѵ) ,4,ͼ%p`ZBwYqq9V{(SnTȔByR,z@+%@HyXKDŽHwm?#Q{fw! xDW2sR5G 5\ zeɀ0`!'18iE> BR`a4YYaU;Bh!h E~N h } ilԿ5zKQܖ`T/)RZ!7ލztIFەcqH)%E(GEnJX3Q^B+eB)@3Z*$ r!mkl-q+2RX/*%}Wgsx6(Fbyd9 C#10->S{w/oc=>R/$LJgqu,)SCzOCk3އ&qh`obtwX)vTX9-McYz}8;̖h%_:G-Xs G!;.]HA-V2o< 3GỪaW*cBVpi[ {d+eT@%"jEZ=QpVl+M0J1B=ӑs9:\r1HϪdi4 DL_8)C9l&{=+}_A;ԫJY-!ܧTҏ\xde0ŒqxM8zUhn*G*9A})ϛp1̖dɘ(MzWc1,߽) #]Ǐ68ԄXE$o<`֍)9UIsG#)CZk9@aqS0E^T6lUCi}?8ZvceHnںY>G`Vk:`&4'I{!iD}Ymj<|J*lWAz4S) O f)43o!@-aX `e!'㨏>`y}Or^E[ (*&vX-* ,Qǹ*thCЖˡ0~oPٷܡ!qia,/R()+u|{tfOtTb; &fT\<5 wgP_x.#KKL0G\5a<>nNyggm!qYWzMϩReʨ7ܭBMq+Fzb>y!d+BFh8C >ܪ?n'ǼĻBL@O!~Z5o˺F^> +6Ӫz"N-Z :0*4oīSʺJH?v'9v|*z=-''s>Kwcy>3^NT\|#YRPU'9o%#{Qo+^j1'}Ֆ-n?Xȹ] cO*j[3ǣNl{Y!s&F:a> stream x}M. ?]L*TUE`#42qvێO;0!vp4P/J")R>?mݏ/Y|c[z-㭏x8?>~&eyzv>F۷=>ooX[x]v] 51e}[$q[[Ia*w0<\"?^K0w!ۮjE˶t^`=΀% A;G!@XhoYۢJ]matp24ۚ<]b⣴쏭?B}l2 ւ6vdpQx,=B bPJ66<>UuKLcz7a;dG۾ zE RGa0zP bPJRPmyCڮmQҗKs^e6:)1z[Z@=)炩<F"0(7)zn|(-M_B-2G/mYu'9 @/QRXD3Y( ֒2g-9Y\fEG\Xlq2#<) zf=l%\mlE)NL~ `;A,KH-켯uсAٜ,=,,[ƉIaQ6AKpX´N YdK {,l': уRR¬-g27w<҂E/cٮE5`BWX/L޲0,(< A)#t Ozny(yAd|S_YtrȻ~ I Obm; =2d1}$yCz )Z'TCVqaWر|pyC XHh CVQM:e؂2]h7 F8l [0[.Y:c2 jT-KCkyb5u&pfy&;a@":'%IBUf1b P ַ 摬FxC(v[}#(fD .3O*VXyοh% /E7`ablB\'´__Q)lJv▋@s;PE ñA*L,^lf˲"~68#Gp=\p!I`RCj`lMhDD "#,L䎵`4ͣ cat0 ";'&߫ /U+[0hjb*3r^UP l<դ百W0x_!~-mbKo>"4M%*a# \ȫH݆˂SW"P(6ORܽNs'YF78 n5<8d!SxT=N{8̷n;V {L[]}"˶az)6*U|@Awg}'mp7@RlEԎ/.)|! C!{`?!(6-i6xkpX&E`Aat[.u@?t_Y{7NL=`x [@xh$[v=$K 2Vxf=^բˮ1wn׭ђӣ^rt s'wE$IlVAC> 8FGQXiʚ()$ YUJp`E!A!¬-8Nhvv:,L D)Y6-j. [r0H&狀|:6sE 8[yu^2v0af?1@ ~nRVfa0,xJA JPVye&X3he"kje|$,|S#zaLR l<Ѓ-ba#,x8.E`PJRpGyp,_8@' Iq(K .QbNI Uc)gTEe:%Lh CIy}@ ~."O*LVȄE8&xf׌|H!`Q^.6R;N,0(SxVK'xm2z&.^sѸ]FXGA`$ m[hN8yzz, ࿇I ;DG݃˳9Lj8p8} KW8M@'@8 '}Ս8>E Fm/\V]쥇頱w? Cg.kucY~&wyp-b_8evk}l̽bF@x[[A 9U`Ġ0QnyAHIE7OSH KcH ChqɂK1pD մ햊A  @yh[r hxa.1BnFf=T7ywqްgC;0P[| RĤ݃M|Yˠ"GH!`elX-($ yS!¬*'8qx%(9A J7rznbNh+ t!{ '& Å 2(LZb<b4cR7W"KWWv_V 8BI6[Z|IAXނ=؂7NS@QPpX8"0(7)z-YBC,u׀n&ٟ1) ƀ@bA`=/6]1=@@q ,a;쀊0Q6-zAo8L(."O*D ye?5q\C2> $; U+AB`EDR4<66Ġ01/2i`Ҕ!m`Y<!'@Xţ:\(# ZL]Af)TW`,\ @XVa5b6 f@I`Br,d^-jlHl4)gÿb a*o/1H @〹O] ,  A H s ~-]=3C+h>"0A·ko( nŜ'oЙ!v;S@` 65ceCg ӥ3f-lu\fSPpm]io:jჹ824>)tK 8!1(%)zh ugBٌb`X0d$:,R- NA“v.Z^?׮glwOV "mAa ;?N II KZn0=(1(%)z-۟r5>JÅG@ԯ}G,YGVuRx Vx.$ LJq%u/Y̴"(-ޑ YasԒh !DvdR_"LB,`vXlQZŎ6dT͎Q, "Cp8Mk ݇@AIaVb*1]5T*|$#? e$GI!`&3F ,0YD6cA f-W{煜҂9C]{?m dh@b&ٕm-m8u0"$m>0BZ#0 o{~]JdX9™5 \V6dt0/*NB`g˵6{(~݂aAIabV cr];DF.YbPpR l=+0CZ N+6هUxX+W;ʢC"[AI;_awl#v t/Qws/pz+H l,ҽ.s f-.6>wyRsQr5İ< 4G D Zl3 F=",&o4hVD!~Vo QI-xbP ̒lC/7~oRo}} ]b i>9l~h@ HY_8x"4 A-/2_ s)f%Z/ ɐBʢlP[@-͑ſ}.$)ZL9n,nZٶ8܀|\Ko`xFoP l5T>ŷ~ =(6/eKBLtB{Y 3=QOflU51eIbGђ)Ư1'FCBB_o F`X(epZ ꈸ;8> E]5P(Zx('d'W(E6cD-n1|q#@_pս嗣"/}ŵC^,6̆Gu%IUç??TT*}oLf}M?I+}YGwv{bM J-l>}M1_ͧ6\IJ?| )yFq]g?y^DŽ DZ]? X\!ؔ"e|Ře&̕kю)C_ho(5A}!J4ۗ|淠yޥ]XYD?Evo:6^5.k*cvb(﬏lFUW{)2hhUEJ˟<y>ccvoelIb`$ׯ_eߏO7[Zѝ,M,e3$ݤ߸HԇeԣٳAG~٪Or03Gt_o)>\ Th@P e}Lo0 yZq_wpx6_>ϟ?3:Ef)sK:m25 ȉq3. O淟}??f|gOֻ)o=截(V0Eo{ TL6E:}vg24*7jxdž"oxsLR#Jc ?[]}c^TR!F"5M\o_RNYg 6SŞQ-SrZ|] q3Ϧ73L #Q-%Waw*+dH4=O}l0GӧO5?__I?柉MCN޼V?wo-"cͯn&f;t2 Ӄ_{XV|_c|oׯn=?݌κo}^ձ{ -G\7e5ཧRˍ9۶]HO2b f_UʟhW_⍢gGg_i*w݌q3:#3 dvLFg~v3&͘4NgGg/~nܽc[f9< ~3@=O<?qպ[ TnZ~3PfȖ ]7ؾvܩ H7_=:͘Fq7:w78QKx7\u9&ˍ֟;99%%}:nFojE?7y1Of8-/hE*}3x P̃su h~nC7֢L~ vk7xS]f'KKn݀;y wU>M&ɗ#v;{AϯOcw(X۟nĖ%i#v__Ǘ5*I華p=rh8Ja^*sendstream endobj 118 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3921 >> stream xW TTז}eA"hE1 7*8 G2O"C1LU Edp q@'&|8%KRի]֫ZջgO b$cl˕D7H/v2$(#H_v:mVDR-Pb9;''' NWNɑMa aIaN0'9gY?]ѱx'ehX| 0Sb+T֦+"6Enڹ-z˜濽 d&3)ff Lg ƇYɸ1*}f53Yc1f=3yɌbxuf43qd2oR&)Y-0hXFiJ^@dkd7dΙ+l0 y{ȵЀv!v koaC߇j{EIeeR1wAWYm^1B\qeu43vƢ+ʼiX˚t=˚[X{Q)4IqnQR1 kgn|U=ț]F(^S63N0;%w)^>"SywtMhk| .b M!(gnkq}YBQpxL_cq1G18`Lu$/ {ƴ ,D 7'Dmq K_P.2w^[1um Zm.ႛiȳ~_P,,iuOA;ΤP`khDR'kOvrF!m8 8׹|7Gg kzPkH.rUr"aS Q :'Eۡ[v6.hQ}ot &]>Z( ۉkƥ;({`8af2 7ʴ Df>JX|t#^z}[wEõ (MLV5buȒõYi[%C"[3rMx8Q#2z5 OQq|6Jnġ|Q83Cw,Ɠ -h3H[h`hj!MWX40x\ 렠%-ׄM8Ӣ8b!I VoA8@^rq1`( f6Z0VrLu>hrH mVmIh9짟R^ :fB`wJ z˺O0 ŦċfIRMƫ~=/; {yM76svGmf LNLX7Q]UV%6RÔy:%-!8B|Vv.Pqs}y2flD=[LkB!3=_7_IN\:#C =he/?ʄ{Opň^2ܓo 6$GN]L?.EVy0kD6W)•1u{3ZN8PgKqhSzC7v] .z9UHu 2V4/q4p ivoL qIb;k@pOLR"cM|I1#e8P!3gwqm)GvuLd›}/ gicU28`?YY (hz 1deΧ"\_oXuPQZAv86XNwU0+[l8a$T[ -q<?%D${[@`8*w?f>>? B 熮}P洢E@AsyNdI5mKdR_7AzDep(!6l!Xڭ&ԢN2%gp2 T܊LwW^۠g'kjCmeŹT,\n V-Im>s<.Hh8^Hݒ77/w9's/)fퟣ!9A%[ve[aƲE-5`溣"bvG[|g(!<価n 7ߖSw]󱪬[*+:ؒ,OOЄk59ZHReSQb(ߕlKRqNkTʃL\XcyD2ݒJP+aEr)&}8<8X$QǗii@qѦި)٫@^//;C@@^W{vq6ԔBIYӉ]ξ-ص9"ˬ> mC ^Yͦxm#!CSlԃ#,G9ʥ.P}ƞhuI-TAmΡXj|5SC͉>>,DV9 Ar\ 2su< pևtbLdڏRsO;? [pM 0#7З:C 0FW@;wt]M[lܡHIȠiooM/"_|;=_ ]M7 pxA&.Cn\zlF2b;dANUuUU|z_Du$xIhlTVsd? C!H~>25TUGEiY.sW/?#kPa͂JF;;dZ?. endstream endobj 119 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7794 >> stream xtSWֽr ʔ!tCbt{ý w[.%mIȲllmNa&!ȹ{GM2LzkgH@E N1k*?Tſ/tIS-xw{ _}ƄYKu %ÒG >v9vmM2vagnw@۵>䍿Cn(۱s}Ã?ÈɮaB?76bwF0=˂m׹xښ98( Xj634 - Z$di貰++p]&}m:O{>w;n%` &4)SM1s,s>x<DZ})jeO͡FRQj#5rPfjOm&PۨEDj;DPRCj5ZNMVP+*jIfQk);j5CT eI R(+JLK{T5l!PjESzGЇZCMCzBRx,>'D |;w]~/_d9ղ`CV 8}%i6}{oncMfÐ ]:{7KINخm>}F9gd(Q.I`DۍJcѱM-Pf@ (qؽ{mU?]>i#+T4C UZuZ#9[ i98@0O7j~8GTJ%Q=esYdoY`Ȓo#o*[^èzrI+ȍ5PE+dpXп\=}B ѿ1WKZF|5,i+);$tʎB~4GumQ ܵtJ/pHT*SdXYcmVjS!%ՌQ,Oj/25hgԸ]Lݪ&8 wrYyhFp&M HFA{$m#I{2ˎmd/Gg/z9X̣PTt&CEfmY %Oe/u^V>a"d_s %km9*% _N^dQK^!3Sh}!|Y7?4 2#s8;.\|$|pNV>V ࠴ʥ6Tzf9p;ƎIFӯxP`{Yx*Z~DBV *.OmKϙ #wDo0|!Bg>*&{H3RsyMۅbfx|4bH@A}-E,N_T4,>/E!r[H%>oDh#À&!vYBEx0ئ[ARQ]H8ԘCF z0X?HɁ" ZDH3^MucKX h@lj/l?듩x̿'ǂ ^gix:(^;UΑZ 2:/҅(4hMH5'v\#xƫ5W/rgB7ʼVanDf?l&&Wi(kcqָ7jl@)WA07{ (34P9DRYԛchC!:Ʋnw"_gUA 8W|ʍ<:ڈU>=j)|l{k0ޕu7ei38H:q`{N`,s\)URKs4->xbbbMݡ[y<i.kcRlv =qnn NGs2I).B~oǢhavwM#3! bS%n r1B+qyfRN<$x@ q {ZuZQwUƖ6,B[4](WfǓi &1>Uvrg@QQ|j2:kZf֓pߝ+JcTWA-*+8@M)"ce1D|II&ݫ>l8@&1 H=j큭X[Yt̆@مmhxQC{j ,"<\cRȍ2P8}*CcHgv#>ifpʰ&BYZ(%=ǂx纼SCFylHA%Dw]A\Q䭘BnAH_4_*2a/%v@O'e[uḺ޺Q8j]cTG&QLMUXitRUMPumPSk)NK7-[ d,5g롘,8zrL%gɯ'iDz[Lc;(EvZO\Py7pn y3!5U_? !@Nb,:/77AJ.p/`Locʶ+Dql^AyoYGA(wKp/GA[oTH^D6yNCΫj~IZ 4ʞD!(yޚd zA}Nv{g2< 8|M$3- ̟˚P/="$%e@E%Ȟh3$>icu7GO+i4yt`Kf=F,8}317vX耝NR(8lҜ=\n_Ek)/3y;a5!&ԑA׊@*RU(*d:d'JT*]O|nVeSYe(] mB}T; ;4>]~t".Eeh>`^Eu"_l~Np$!z<,#aYn&5I)OVr>B"lM%h$QJ:_ ;w|[ f#~)j=F e2 _fG/;~CZ9Cfn^}`\.^_gRvlɠWsˎp =j7ZW?T Pzmtc%/畷>[X_WNx{`LDjؽaS*W y2HJQIK|Ba${:MeeՍ7K/ ?CKu,5E'MuꓚJbG =iZq@")օKC!CyHRcǔU!ї\C?,~׸$r[c=ɩ /.R%p>jZMh7}nKҎ'\fϪSxbl_l8?nIEU*7=ïyRk8Pk'/z?"};?^5x򞝎,a欸?mi3LyhNI3WCAW+j*JtЙ_|Bj޵aaaaOH産MF~ ŽsN$Rҥ ̢z4J,si phb7čE-ڟ Z̚pG@>Sw$+,M#.r"B<|h(UB'U {YլP^OQ6i{5srˆڮy7VM=D({&qreq cKk>+)(fpuM?FPޟ-pZ@3pϼU;vj̅! N"$DK;VmNh ` mbZyypB;[T]) Jw3oЄt=]UBp)Y!W=؁ j0VXFB .=+Ą(7 Eo'OSe>qQ|$&]7#:o,'hJN q\EPqt\$DDHy'H qt8<51tɊws^Hc6*>Ba{uR1oU|YEEsZN}aEL&MJo.߃ڇ[=DH&tVZ}CBJ3s9BVŭZ(ɪҘ۷6b&>$?[w[n!*uƯЍ/3 FJQ o#}Ij}}zN5$pIi1Qٱ%rf"w0aQdecX>eEu.g܂ XXoAv9O7r dU66ec'n p2 dT308)V"|g<5+hw%nI23LcvpGo_;I3ccr|s71dd U:#ZG[{ӈ"9ߌv͡N^RGhj'TIDҎ˓Ji&c$(ɅYmf:Wt.aWvT3Hs EĴ !֗*+ q>)f^zKĿ"$^bv7VT2Xw4Ȟ;LœZ RY+IbЖ/3Ǐ1x`q'FwJ㕭z.+c{swt6~,:,y\'r-b'8//j;Pܪ{5r^N`Y7 ?6t\4eAZ*n=9 2oAOw,f.H}⡾X t:rri8=}2ϻ* *!1 ?3jbwM%g_^vq;}8},UvNJL&w|ANaM>BV~hIG4&iZyXۆ{%`!yy)lqx*tm Ne0.=Vo2I 1G'`>;{rMLVLoyA7,khM$90͒ruhu* 4m)KP`^^ic}>twYׯ?E7=h endstream endobj 120 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5739 >> stream xXXT׶>bc<j![,ؒ-ŊbGD30 m ̦24bWXrXoL4E1h&& 3y`sZmeiAD"|Wɓ N8R j༹oڲqmA; ",,y,8Rp3?0eҤ^r_O W V<}c({OTN ({xaW<ʒ~[ YYNۿgKRCX6N`Oiɐ1C81;Mcc/kmo۝m?aaméóB5.O zئ@A(%z];R֣r9]Qț 5o[y+Q@`-8ug\b al}뭰Rs<уV%ͨԓGGB?/F0.!6Q4 i顧7ێ,-r{.ü bgk_~6FD0):R'::XO[bˉc`,irx>͈ѓ@ ͑ICz_ۥk̐҉B/>/3Rѽ#J}pi4y,: }VXlvݡ!wJT냢+I,GR<DZ`qpk%1rPxM֑+Ϝ|ëoȉ3+Lo$A 4\y|ĸp%WI](egꛛ~$0$ˈʌjꁰ^bt]"Hg+fz"ꡊ>jO:vͰ&m\Ux[ΥV( A!#XI47eq'ӵS9K0aNԦz֠`3q?-o\Ya׿nT9W߳e4zz=[c'7loÐicx~>$C.,0ϸK"mFª#qWoܼsi|Qee1u|Lנ ܠ꺏7];!Q_BgA9}F=NzFCvjrc(3T Sf6y5;N-V HDǔ-E-+_fDD ~T[4Ⱦՠ݆}Ѐ:Q/6ޠ!EP~ uQ{8n_ŴB@쉹JFMqv)PD5?;Y1{^UPQUd9nOvRQT*B(,yɺ:-BR.X4GmV-QGBNVkljkKȨ,(F牀^7lE4];n@B4:|[wf{>oFf軯XKvSO.qϬ{$GV4+O1[(vVg4@V:Ctߎc+VpR\UucQfKc6͑ ^gyC7%4!XEfgnBVkji$X4Rp" )zE=:с{o{5ZIvuu o (Q|f<;=F2rQ1SY! fsB;v LRb#6:"f?Ղk>G|O1ox2kTފ٩H;wCtp񹦢jI,u-H޴WOACAdր#/P#`[KUMl=MskF0LjM5X-ANDX*p,H'= ̍9>+_UkZ,Tӏ,Zfˢq$<gNMmF+J,`W{9yo\ݍf)Ć(-). Iމ򚢆վBM`-~SщaÐO q33^,!0ŅZ#yTOFB: ŢJKU(egddȎ{`EAss_WVn 4[Fw{^9fc--G=+*Z B_R܌2 ؓ3w2b ֟ڄSt u/w->]]u"mTsZr{)Ua1%3U("5#-+[p5zCFT4tw]6WjID.߰~I|\V>^h^zGόMe#jU0䁜Q`y6zb.tQQ2tEX5(4ں."{a+yˬZ GM>-a2YXLVVWkW`s2]lXvڔo}m9ٻ<9];+ uwչ%@]%0w^Woa#}6£ȫ?~-eTrv.$5*0ڲh3xv&t!'4WI vmw(^B @(@ Xˌ$<\h /qG¯Z0|ĪLO43,4[ #\MޥZo2up_$%{}Mv(15o|Ov@?pS!FJ#43_x}>‘7H)rJneJSnq1{d~G0C4@:Q 2RIK2bR.mJ$݃%a#ޘB QW&r̝S֢>USK?vVe坂콤| GfQy^rZ {yJH>^9AM|1#1eRLarN3O#?z;I1 I(IU5f^M+'e֔9'/9џbI@n̲:۴áFT,6ect܎TdbJʛ ݶ=^ ݹyyfoW~f̰:_ofc' '_ګaX lQ jiAqt0Fyx4~ha9M*9ϥTk[|Dz:<yEjiܶ\׬IygB<8q /βI)Hԡ2QV#dN|ދ/u }̜]_)'q4F/7M]~2fe$D=3t9 , 7,SU+Iٙ55]3Wyo C+w H5;LrKW-Q>''m6Jd!6>Oе @=V$-)OIMIe!*RmIEJ/ FhE2&( E2ѥe9y\$VW[Bڲ҆jT#pNS%j qR2~M`La?5%ۦчޝPU2xvÂ[ w| \5 (س>=yk+!dqq$)+svsU%Cg/Xlqih~h,<&0qیo% 9>c[/L_Mo(A[ox>ڃsRO ahXR p `9-X=[pR Emʀ:mJ]z:7=AHOFBǬV祗 p?q:AR bG#l_Kyya0UUdf!CE6|QXUx &i^pCJrDѯn}UC swm[0g ᤿ _|`yx-snnfg8uug/̒Vf;pDo*<ݟn.YG|cQ r/v1YZTr*2 Ig3:!:߁z6p8"<e99כֿ ++3oGJk0',֏Q3H.S t>Z{:*e|_Zb(fGDuUĬߩ| mf ^~pcwY"bRT([K6{y|e>e;4{Q la^q>dj"ԉ*Ş)I(Lﱗ]IbPWYeQM%o!nW^ bEl'>Vm'ⲛ ْV ;q~I+&v$xvZ͢"*_(/ i'ZFʬ謭)zKendstream endobj 121 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4843 >> stream xXy\֞2J._VU($Þ$5}QKkmժzj~}7^$3sy眃ED"Ek6޼yDLJI"aX/q"NJ+T_ٷ>ǫaB?"%sb 4s挱'N &L'D&D 7D)_PΚ0!11q|H2yQc#Bʤ !1aO"YLl"LF&R5]*["߯OH Y{uеa{#6Fn%:fԎ1cO4yJio 9b֜S:j=HP-j+ZHSqbj@-Q˩j%5FSkTj6C@ͥS j0DʏS/Q^G750O>Zk;^rO%tEcߣFpXAn}}6/7w$G, C5V9` yWz( #)Ts( *M&T ᣏ;sE4yvQaHʚL]EWeqȣq?M'1G*.yˁ*J&]H@4C@yG?z˵*>vˁqe4ގ"uhmIlFnӕ4YJ\CSc+̩֫8K`Foŗ5Φ/gfOS/,&Ū4 =6"y?8SG,s 78oFΐz Zd;[_pLQVBUfp.pV|"fl+S9\DBC&'_/_r8ź4`V<0+!P- x*,*jS;CWRo/x/46YW|y}щH74k>ʙ5PLg0:zD SCNF5&)yȡ+\-gk5\InyUP ~P ̳X(w%e㾴*ɓ'&dd\1F@$ңWn_} e?X9$G=x°0e!z9RV\QY3!P5`mc\a.F"Eg%7BTܓ\ J>ѠtU6༵2`)`T$d9qi3#^w3ԯ 0Th ,edP\uUI pYwI"jyzWtXy7=BGo%ѫ\ޚ. vQmg9vq_&L&-$Ͽ #`] {)K jiJ&pw ߜn.dN,$![Q*iS38EXp.`f8} @rx7G[߹4vS_D8;uƹS"PꙺDH}Z :m!#c;isfk1+䐉~i䷿8ADH4Z'f$ $3AZS!]H+]ykiU{ׁR|po<{][xސmȁ ơDNk ޿DwjY.;&sdЇPMᑚW^VM~,%^6ReTcoEvty@W$ςTbym[ԇ/&̀sv nwVr`m)?acc_܇*Xl$AC>mNvJ:{GR0kv̗g뺻sد!Y,BoGsmƢ`n\`Z,A{ * 7?:MRP;gA$G >>}} ΉQ̈́441x8d+2rM(0?^&o*1-r[BݶQEFˣM:>IGF-/SL T/xfU%pǣs9)i?~yٰn-/:UuʭpwaNNﶪ+ёxރh'4v;v{ *:~qf.orD}=؎I^3Y-7d5i̼_nUG;Ki6g0dJ&#+jiέs,P RBރ ieQϤwvL^'l]R,Z!9<=8H#5[E;y ]DbSs`bK Wvwn. %hSGoU'M />M= 0fESTf@>2tr<riun*hE O#JƤI|)ں:s$ƩTHh/.G\ ~R6p2_縗\F6 241יMlG} Q_ޒ#n5sяt]{x=d5{ I𸫏;OhXb0!JC\jZ!,~lKhԺVs[.aoH*-,XpdSU4;_JFYhqK." ;=31$ ةWQ~πtzACSV-6ϵnЍW. ibC3nz( |"n͔gʇ|JeEb6^vaV!8@:_B_|eZE}uϻ>pp:=Bء0TV {?_u R`"g:Z_lю+D+M"j٪b(ʴl3>|Eқ$"ٚͣ"ӵtHvl)܍SJ; yn$^dwٌ4$/0Jkfy\wB,SM[L}^uOS,,*D54Nm՗,Iendstream endobj 122 0 obj << /Filter /FlateDecode /Length 12215 >> stream x}]eqɃ&?8 8 ( At5HЙfd[OZܧϴzd!h4:GHy~vOw/W/{)_Q,oR}g}ܖXgO>ߎ_9~O~ϾI^VDO/}^u'k}'o_>fR_?/vu}+_积Mۻ{hTӑ'},wا&SF"EPOGjyBU~B+z^M5]~h//Omjף}`ڥG}~yR{~ijϢJ'_Ğu BauN SlEӏ;<կ_L:{j1d[4Ҧ7gT%?nOt9hUЦP2g^i,]jqcβ@C*D4i,p7:'c՟ G{󨒄瓯OQӎ">uGg3&}?O>-OjeMaGxIWN6m]go~8E3!եܥOIˎpL6cT(wmV]Z۶P'?5emNjtkgs!͇ vy6VBdYP]Cዮʨ:?SN?6aDUGJg'N&Cg3o?_:MqǤz'ZPF ?,_SVui{/מkH;ۇ/M>8}J2Ro7O>\/4hF?k 2UϞh~QsӶڮu/vRnYT0Vu٧ led|:ɧYgoD?T6Ur8SuqNt:Oա=iSuxiy s=_fɧgNŧ SOς4J٠ce~z{*?tx!Y>s_tc[% %ho~8oG,:Dk\06}7??tV{* sـ,ui7u__j\)r PkG{mG-g)g^߾˯/~o?M'.\/qv[kq[_jE*d~K[fk-}˜5g+q3gc&ܪ0 һ'k8L(:JC7[2Rx{`H51'Vo)PԤtm-aHm-=(zq Cu!^ړA՚tJE(Wܪb n$f[Vf ,'+זǙɬiu Zd,([<+,XiiIZnYmv8 >aгEt+J9=a(:Qx8L(ߊiZwSa-" W;d\ֽ M*4v܊]O4NU_YM[v 沤'_nE/J\`}YBP֬omKdO  SJf$bd](RKqx#vpXwe;oԆvN0: i0\ qXM{샊Z$k'嶣iYo'[}V ioyU΄!V_:8,3qVsEP`j1Xm csM1uńhztAm-E_ip2ܻ c4E*ݧR")BI1ZfXEmdjV;?atzzhhb %@`0/ؔ$\߇Qj2fKVosd漥&T 1|EM`R"BG1xBZ>a&0;PM 5D`>'L L6wT B`cBQe_-t6;za:H`g+C2L `bAͥ6 FfKNlJMTW#hv xQy& /Ʒ6Q:#}|`,VB*ٷBz~ک|51lNVsscBr+zR nka=V[a pd$CKj!Вm (w\́5 B}(m|oqNL`P! Q"TP18\pÎsآ5a1GCEz]O[-aq z$)%m qh!%EP`m{n>al(zXgm8| ଝ$L( L1*|mV tH  eogX7}Xk=O w $p\[(N0eD`LSpXNA!f3D ΄6_RApZhAKmHUG"t+A %XX6/| jyA7 a1&' A( &Ȭ=×^i0p:V^Bb m:؜m) #f97b0LF@*F ZXn+WѲ޹:5[765aJw,rv Z:b->%Xڄ¾`6AFZh lcp6]e~*n>jVx`pÄ9ԎPSF םZ$Ev6~EgO씳7jHnc®UuNDpH2|}#iܼ6N "(BpCA p[40YWmil`0Ex)V%No"z( t+߻p4^Xa@;%a)Aan^h T*.ϖk'P0L |a|`,1J+6lIASHTP @.uP-\ކM6;$hp_HʂHطVDlI4dC\'1ű*¾*"T ڎ ֹ/ 64%fߏxm0u0e:8X]IᷗEPjR ܳT`,0ŲfqnXp肽h6 R/XVn/`-TaPj ù4bƨ;-hQ8.X.Ż0XA ƼdK#]!#`_AAZ81sڢhCXf}m\V_cqS)@+º+9#؃vw$2W$_-UDl"w M'z}0Eh*p[ޤ (d0Nh_UTE='ҰSiu~ȕa<k v& }*"T W#e5;==$_UnA{%NFyb* `HV\A!}Uc` '̆1l.m$jeqLtu@+B*"Uta=u WE6*X' qcw')+]G2 U Bl'i3F n޴ݬ8J()0naRN7AAػRm6iw Ab|nw=%`0S+8"P 7^!DFP"(BpBn{e`ZG D+[WO0WK- }@!pvwod9s쎃J$L+ܰj~q0={Ι.cGE|\ Wm- HAy gNA|C~[ّ0DN:Q0Y+$L(sC5ƐAM"H Y I( arT#MfL4A0pWz]"Qܢt3v(REqx0" bG^&f[ ED0QR09%C옝opL2dvۨER`m3n^;ƚ׊l[64HM#(S'Sk*LTxN9dF"(BpYe|{0ų-5Fp^2gKr[sIrFKfYbVXo?B`I!-iu\M5:ew Հ!uR쥳8$L'aTF EPjۆ~G #w XS};ݶ9{Az:@Vk}X@plBÃn*r;;<` s)rLVcAۛo !n< 1ZB0"60䐰@!I@ )B%BJ4 `i$S3|m$vCь> EPjG,*6znԇ[Խ~a>Vk4 }0H"| dh~D|? B`p5j;L vS= IJYgϣldpjeis}@&o>IxP*}ѝ12R(GwG< KP!`(_3O8!2ERjۆp-1[.FV!.:  $C"  SK`4b>D߇Qj kNN90,LHDY' kC kJ?8$L0,0ǡS!C0dH-ڶ0pz0\7gI.['}q81~>8BX! B`p{a}0։M4 18o[Z:QY)%P9 o/CG2xBK^~8\e/S\+ Cc(kݭ^2: 悽(>)B(~џeqȃ< xV?Q_%Cj;nD`+[LQ>@ ]B/8E!ULh m`SU-ae7,:v .:E[>Xo$ZL\1Ew߻KWJ 8\X)=E;Ip4A(6O 5a:8 bl rEPjmavjeNz6g/yܵ  d0(HF){JHb%<ݡp LòT/2?vUQ_3M ^t/Mԝ(B H$j+}ھa^ku_ jMXj,)P'_e nu4X#i1P28\&0W[mfS8Wqh c]*)-KR!*s]6Ia߳b<G\wQ;mm=\ׄ=i\)rÀ)06 %8XPIaxЂ%9<ڡxXnUCșݕvTWn9 2|r>j܃A'1)\et_$3bM#1X#D-DE(X<BPjCDQtahT .v=|s"`}}У!aʐap 2dVZEh)vh10q^cO 7f!XCm>1 00J. Radh[\\-ozXQH'[wn/5aL*fԁݺ$ ORDS2sh 3d"(BpCݓ8qXѶV nwycfWۦoqhc3I@B QqG\=ߥu?YիVm(س+ 61"0oH =I::OE2qWm5!]Y0u9( s2T>A TM&F Uh"H e6sO 4U-Aifdp>%Bo%s =yN*A(WX|J;t«$+~O'GoXC la*/j$y֔728\m p'B }A׀?NLAESS0H"0=#]@Qb*etc-һ?on^6ZYiAqecq,(;!/DC|JG;*OHwNu0H 90Ǥ喵b`-g)N*&7jK,}5Az^=xOƓѶVYxo s5 Nk{ɚ{ P.8\Wv' SFDDǦmK[p6qSEC)ã_av!CzyNepAWA7~nI+W6j|!8$ws|r8GJR!Q`şswlꩢ~<8"<bg]_IQBJ$E(.V:Ɔm<.?+ Ӑv)BC:/ G"n:+ g~Zf`V'x&g,7B6h~e`:,BOKdA*:}Ix%ȗ-û2|n+1dK{LD/pѡXb^Y 4 cQbp md-\ %k'+U9m6M.Ql>$U9kC+{p+$~{I"Op/4\a4ɫ?h]Z3^-aԷI/)0ek”/e !J)\\ƫIy 0t|W@TqqJO >̞ /!Lި)B8<yOi6nZg [ncls,_-&= A*^NO ~ "^?bh_YK2"0#7]$0JH  tN~Hl`.Se3>VGm 2pZ'У' A*KAi4140̆ DhKֽ%[bMnTp2\Sa7CrhgjAВEݓ[t2yES .( cI0⼣OkK3!Z$Ev0{s'pSH-:(WWb*^R-ՎLbum%kj(wWq fp,o/fa\%aC`IzՎ|L[ݵ?{gC ;Xc  )$>"OU=2ԁ}߸)N \n~? Lo/c^Gqs^MHxPr>ǘlC̯'b_\HwjYqvK z8m&-BZ?Tt9rLѵ- ǖ{ ^i ד`MpXw? A/{ůF>.zt>a$9[< ؝qWEg8 8 ߅K롫!XY08tdͬLG wӬrDw\V=~!MZuY HIIZÃ6Lb~#wPEj;'.y8}>8Lo/xsFɡ+#dL-BZ&v<9N#1ՕWy37ED.!gR`6EbY!BWT")d0ZS|>a6&#k>=m聀`0E or :kBb`Gfocc& F..\Ϡ8|98?W<0KDuz~d9YIZyeaQO5TOlxCm] A0e1ay&8? ѿAZ}&nXkt}/[f^=Pup2<@Cߵ2%B-Ȫ(Mot'fמhyo@vcsYEq0eΨ0)di o/C-틗Ī^~R|#~r{_:7/|)*D Kx$ҷ_o!jy-__Yy5;aNӮ s;/5Dy\ l ] SƇROIZOL>p=3CnimQE!`pۄ`%$&-" W;dU B Нb{|HNd:C0"4a:dĽT"B`pUw ,ژMQnKXmpJM%%־K`Izn[>&O-1}rKrȉbc\!aʰA ~B*8 rM0dH-Ã-<v8_$yEG2ֽm|"w󂵃oP/)80n$͆φ Noޛ{J@6O;S=~=Q6MCWƙ'6/_?9HPendstream endobj 123 0 obj << /Filter /FlateDecode /Length 172 >> stream x]A EbnMn\4m/`XqPdޚ(6VZ`XVՠ }*w'H|3guj+Sx5B-#VV/mYsN,!?ep l,,KۼI SVCendstream endobj 124 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 304 >> stream xcd`ab`dd v 1400qt~H3a~',lVbnn߷}.]@QZ9?$H7?%(O! ((&^XWRlɐ2s& |`G{wr*?Vu4TwWwmYذfl1YMG,X3bew }}lV\?DK:K8/tL)nOͱwzpgrɝ +ts5N44sbfQzendstream endobj 125 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2007 >> stream xUkTSW>>B&đj#(y+IP"buP, '>(Vuqfsc{~d=> ;!aFde2tAL(@aD_'q ]ϊ*W]eU~#4 腕~I 'Odm^NIې%_4Yy9Dje YS|~BMPbFk M2J3sr!p?|%E( -Fh @((E(Eh:Bȗ S&ia8Ő (`Qy=Ϟޢc(շ@=L[ayC+;uOvlSmx Ët"%%e'xNL"JR):)7L;]Kd9UuEJaVֲ2NX>6۸DjKՖFzqG<;Zk9܅m> stream xVkTGq *m;"8= ADEECD!bTgn! VAQ (H88>לl d9stuO}uj e2H$~i9)#J"Zg H(d&Ef&Z@h( (D2s}D≓&9zJIJQ:;MS)o(S2v&71mEfzbFNPJzl¸'(X2+;gUnܚe I)i'Nq좚>c,{ BP*ZHS"j1IER^TM-ԔGSTu2FR) P<5S(Kj<5zF)ۨG7*ɃaÖ D:B%+3lfr\&m]mhJWLsb_ יb=*:,5GkyCy/e_Z. PzD%oSpN(2=Ɠ1d~FtHNh^+ ۻ`oDWQ(6xxT)ay"t]e#Z9rgpnC,X@n=aAQXjB {=hMhNl'n #v?cZD@<5i$ŠiX=:^=% p^9l25{s#)\fq snS>`8E"P|Rw yF:$y-lJEќ{<|Nì 0*]Z}AE.Zngl}u{7|uwm02eׇln~=w扌 s8!:IHa77uz`P'2Z}ovӭ#6iCIpvDYrn;V,wu W\V͏;ݬW=jY/AjoFHj,Ĉ47cNn!P.\AtHjaOT߸m ڌ،OķAٙҷ-f{7w!Ι*f{R:ߍtmޖuA+b/sk}Fgs.;*w|y0?+'%-('rRGxXRr;σ7|fmði8ɞ` 1 1~z\eb`x%b76t}F( O ^K2C8̀. y6<gS&Ǒ}xQLPZ< YOwb2KC}u: 뵣hrqՇj{8aywl`NS,̤ f~ة0 䗻W{!ѼC"n 54n5ٟxnb!陸VXݰKǺC-568^OBlG6Pi$b1Q kO]HjMR<ۀ=]ND'E(vGzd%vGO6hFHDq 9.r\)Rfp*.2jF5խl& mW6*fw4ƁΞۂ`$K3\uu%SM#i5o,Z{]dO,j(&3mz? $mRp$5<4D}yʵWډơ8yqi:.7$JE0M:DK3PbA7I N_LC uضAXKvw6,"Z}-y[P<I*(8}yT̂Igñ#8'2m媧ѭu!n^c&MτL%:)%D7ʤa:]` >h^*MVi_4!jn;Wk?4 #&+q}6r;k?;\qd@05ȷ;[iC 4˹[/*p'ڟ7 $CKSOo%${ fuQ; OުEջ|L+:$/-!_ސ%h;;Hޕ@7 ^<ҁכ6b?; KeStY4dC .nD́H0^d+Gm };. -^Qtďi)ϱuuB%DK?*R|-c #ubz[Pr=d;X崧S\(oO/utnٗjd>xSٳo=7]mQj䐡9M>~.`ҧ`CX *Ha ]'zN.r_Gk*N6h]]`OErG{5;~Yx<*c׽q׏Y(;/zFΛBMWMtM3U!aNӃ{h"FRzŗb;j]^u29:]q@ՌEM5޶k=)'>`!܌_`9{v(@u@5B, a%_Lӵ̬lE endstream endobj 127 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1855 >> stream xTkPSW!We8T -RvmU. D!DIĄOBPB CKSԎllwZwN^wvoprb-K %cJx+RDx=>{a׎Aq,İ!&%Cը$XY,i1M*SE% ^|Q/%5DɩeB/e%2eKDBnB!{וJe"I*/ޞS% J(JeBФ-MZ&T @(`+T&PTBQ IJ}X6aj+8JQZTG{'=0jd=i^eiܝE 3W9#*-iB1(5e"m4fpxրּ_̗+%{ZyaavbétA+9yEjC=הb0&UיoORwM^uuQT (k9?"@Ĩ~Lplۦ}+5\ޮV)^B_wXA,v17=xHqAz\<22~lzamMO$pC(Ϩ1yÛƖSPCmD>QULHFW@Um|t}R__n@տ_yZ Hю 6W#y%nIvX!Ն$ BuF.fFDO7fG:ڜЎO J%mF~<c.4Ve&ɷ$7ѻ]sCzv-K􏛄'o BG5tfeyRYGjU^ݾ%s(3EFBrFT6:M[ӿ8_ю u"}q;97 g.QL3,:F5o6?oq/Hf[ovB:u\hVeBnh;jFka-ܹj>jsuS1~bodT(bR"К_#Y{Jd1iXAzv0x|N0`@׷M Ĩ֖2@ :]nHrd +ҭ)ri%P4?4,*yJ> Ail~l$; qg9> xV^jgeW w{\}B#8>X5zBy^|JT:kfegg0d0~J\b} )O丩n0-3o,7a3f-XHz3ޤ܃O ^9-/Lf(NW]Vg'[yP-M=B+V+",4`endstream endobj 128 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1242 >> stream x%kLSgϱ84gY1E?x^&Cx viK)m^ R 07l[..np3&>I"eAdZAQQ܅q3V/ֈWWx |Ϯ5Ug㙐!)+q9zH!ImY5*+T AMo޺5/ޒޭQ*eHʨ)#|ϵJ@oءbݶML&FƸQkΡM.V:ާaR~t㛧@2 ]+ 5RFJDZA}Al'JR($. D a0EYrcΑ9$9/_/v<~LԫmFp:K+v hPWp,R_o1:[e3?u@Xv;VFޜ^gI5gD*.]ujYvgl՝Ji>AM[PLђ7=1h)Zԝ,=eSmQJ7\/Ue]0 ޙKܰOSOf6KX33#xv0ZFbϟFfk[̋ 0x^O#}9{z񀒧%ME*i9tub5 /U^ba+8NSRE7ɛΏ62)Zy);17r ˆ{"[!uAJ9՝ 6Mס;),B@_'/swtN@R_.Qk a'P,z[DNC1G[|763> stream xW=0+vL",ɒKLpL !\fWn*C}W+hs, q ~ nEl!u oabF 2gA?|~mYI[(Jc!#*݆GT21ޣƕ3;4BGbfiGh m@J8c1ALj63B4b̔A"{hGw rmG-#Z%[z䔡u h7LҘՌڏB֑d喿9#( H#= e6 Dc&\+Uʉ#mzߨȖ?  Cw$Ʃm!v^18);ʄA_T0)4SA^_*㚃IрNA3ec50'fݯpDYuݨgbfnQ4%w8BOlWZl?YAAkڕ7E3g`h\䢸>tt)Pi^2t z*}دZܛL>u5B9sB^~}%˜=Q]w'j^tk8"ՠeDt\[a, ,]*>4)5B+PQJpZh{h{37T^F%QIThGr HSkBsɲkѤ͇ll5܆b]75~ISY,uT$b컱Р΍;kz_.endstream endobj 130 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 131 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceRGB /DecodeParms << /Colors 3 /Columns 78 /Predictor 15 >> /Filter /FlateDecode /Height 104 /SMask 130 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 132 0 obj << /Filter /FlateDecode /Length 15004 >> stream x՝M%+rmLn H.`,Zݥkn{T 9̿ަCOO~_>tzחyx_ϟ^Yy?&>ט^v>^nvӇ?߾0/WO/˯|?$7/_~~&r;MoΗ~K_v9{o8r}\i%|=vʚ%.DslqM˔ƽ=<퍼L4G4oGܟs<۹N{HZXZZ47Wkz]}i+,( isT O=Ƿ?&:b^:ŭ‘}`kp@s`D:mXnv'mބj(h>ՎԂzcech#95 wVoe-JVhJDv,VDb+QZle&oiKvk/w4}rdmw4ghg{7࣠]So2i[ -=^>e[MvЀa*:@'k@9Ya"Sor`ѻ1L 4>f1r|:7|CPcY<0LdHG;$[G HD>(1+ci^y9@Kt Z|Eq:0Q匢HgE: n(HgE:$E(m(:.9mKqtbWcmA=C8ߤ&ny߮SXxuN-{%~qzuVGD:4 ֑嘣HE:$IrY;UD*"Ҩ5Sz;vFDiT>qFBUiT q}F 6-4G#ŤBR*~е۵*Z@S.t߮`PAJDhPAʆDph#]9ҡ^EInvrvmUQE*8\}ՈݎkP PC ̛#[\vSphCjl\pd>.8,foTp0TptvU# kZR DMvuG[J\6"T(R)vWjSdR"ڪQR$E>ڽv-@H3}lZ"v-U#kk%U-H"U -+ET>h!+fx]1hA*Db`Vs=s{@Q0.+F5*J_Vko mUV(RYhc1o-V5ֵDٺP%ڪHC_#R:nlxDpIJdhEQWh\F](DV]ߒmB[lUdluŢ+7޷||y3=KefeˆRd.FU1HXvԟV0U1֕I+bDE?PCJE*96 b)(7дU{0ٶ mUa(RU NpSah C* E**UTG(RHuD"TG(Rlu`S:vYpy! #X*.*.Bfqmhe]\ mXŢ(.U~mWPe*;Em]~*nw\Հ:W&^Y8Y0&TtfkɶMXU٩Pֵ 6QDjDjE*^&Mĵ 9G6WP~* :7:?ZF*\*VZZVɶhZ j֏Th¥mUŴRbQ*F DUV@6n~zλ/*t\T9 Ty5rRT%\8U*QrvVU޵T9,mr T(R-HLsr-H"2T$r-[1]wO*cv[T4Tlƹ|i+EQ$r˶Q}ujbڪXv|m|[ZfQ2QZC[-7z肯D۲Um(j4RUqUkuQ*}tZ4W:TteaDtһT:,mt+TݝT:ڪ҇ەNJG*Etv͏Ӡ%ǝvȝYO;?j9sF1p`st̹J99hsfnfP$Ь{h6mIWp"uڊskk-s(:832xCڌq>.֭79ӮAޠT`7j2B,-Io,HXc"n0R`][Xhb!,YXfQ`D2, (KdWV (xˢ-ުˢ@,/Gm3nn#p.y%D[ɠu={k-鴀k;Bw=EHgԊҊw]K1Jjtթ85p`#5P_Bk#5m;{ EGBkA"EM%OP<;CpTM<6)dA-:F^Ax-:$^eiLxĝ 8{x?)cOyP8Am۰)tUkIpZ遶J]ݶC\Qh ߵl (<@MDj$rɚZO$шey"ON=jztjl(Q$ÚَN9s 4'Ej}^åp%vt+ѶkҘh+ma;98f;."2zᎢ;^IO#t2#@cxVUej$rY14"dkm # Q$HGkVON>: (Q$Ӝ}CxBʁ΀PX`F(5 hPxl#!:s(#X9ЙP9J`@;&;DG3799GsIgt\; Sfw43߱~~!wD3;ь~\3ьhF8e'۟^y +pԊjO?d8u -@"G'[SEzQ#Гl 2Af;8?vrQ#o# Q$HlGkVNNf;:(Q$l?]5pt$# q"MW#58ql LJgk8N4Id(8q|xq5QGMp58q s{GWqƫWi1@G"A}ÈBx(a ɄG'E"jtU& 3l+Lur&HY2m (R&L 'g:)PLõhsx$(:;[ Q;/xĢ=(+/jn^ UDߒ"m#" (R*hDt-*X453YG$³h:kRPG[A}|4:$2ԇPgۀ:관:: P'ъ %~ l5ɶh+>#1l[2V6IdF(1zxh5QFM05b4h 3EhԈe0liih *FF҈"jݽ{ÛI+Q$HI[$Pf$H/t]sxit]5N rLD4tEiD0kk h+D"!$hIN&:$pDQ5b'O( H&(aD$A *TJr2,KVK(/AT"DfyΌLQ("Q{ %V$)"Q;AJȬF췙m~Id~N'O?Q#~H$'j?Id~Ҟ j]Q\qw\>*-"qD4%2翷q Z޶5da Y $2dQ$߷![Kǐ%[CnɐE'AY( ȢF lM\qQR\_-Dmsɘ^a.m̢HQ,o<>%O{7 ˨o4vh`$&2icQ4E .#ނϲ6^4 0LAa]3L`F %SC f-J8-xEI5WZWJ{h-ͅ}Na@´SNAcF8%p [fp >ioэJLSq tD)ްq )i$ ޮq )qJ)ISp >)$NI#8/vn%[ ҈6w#6३(zQ$E"vo`1 㘜`tI&)<|>atI@1j7miL[g(x$"LNb2jeڂm6MacDgh|A # ɶk5Q$DHFݽVּڮ b^kr2ɼF'k( DFFL"SEAeQ# =1 S-*T&'Q52mA[<]v͢5DhSx"4(qw6͢ tkBݷ]RkIF'F͢Ь B("E3Y35Ahи'"4f(fE 4/)j7sY~dj"D@PxL7Lxn fXwѽ/4ag hxfëbj, mI"dFM5I$AcXVդ TDpLiGaz;ީsCrߕh(IdjӜLj ZiCjKSH{Kg~NG6ʛ#\mwG";i"|*;ڊtwr2IL^ACm(qE;LvQlGN"ӽ{Wo`wOdk2\r$ yQ _!"ADcG(F qw è1Fd* p=g6$LK`FeK82"y6y']ٽ#0G&$aVJ Iu(RH)@"-s=+l @{Mk~ w)t褬@'(@"E97U Q4@p>f tU< (K<=?h+04ϟ>)krGV70$ 6m,h?Y@,dd :Y辗oEW̠bD)YPdޅ?Τ!['KvV_%ŭo~'3Juбs⠓DNEF"%8(>5J4UȉC>JtU byO[ K,h'&Kd59U,pQ@z:PDڼrE(`DI ]f8BEJ 9PB@dnm;NtRt&iICtҠDNEҠFI"% 4(>J4UҐI3R% j44LǼTw6gC,ՌVޑ#"gbQDP- HplA,bQDA,bQDnq3VĢHE)u)Rg|(uVӷ]m#PbAbQDA,#5s&REJas E%)P("E")hE{\8ΥtH g qb:P%Vw~B[m+5 529:PYnS+yl2 4^B*Y#Y> 5QB E 5zHEN8)*`uGlB;Be鄣YFn "Z&CD;)P>.>Uܑ2wdCE*ᆷ 7|\wPѽ:#[gd}هe}%P7zTLw H_hEƢH3/m#ضgq;&q3]Nd[?eUFG_L6\e[tlA""XAǢ:)XAǢȶ]Uбmn mq6~>gxm8cM"P8cgl16tUn)X4gk╵aLfIh?QD2E<C EJ6)H0N 6DR$rJќR[ݤ*HBR EJ))HBR EJ)#:)4|fRh>N)%"PBRjxmYdBMDjR$rJn9P)25OU;eh?Q"Ee(RDe(RHQF"Gv me%P(#{W.e(RQ"Ee(RQ"EeG2tR^>N/ E^QzHE""PXA,E`FE; |X<YR:)ɩ"j(Rj Z#mq][?㧼#[Glw%P#nw~NJV7<'!: Q$DDNB) Q$scl%:#ibpFҵ(D2EH9#QIxyD L90@UzF9z=]qH'vYghiG,;EIJSD,:)bIXe-F޲(D[E޲("E(R9;̎XbG,"bI~ ."KeۈUĢ"E,E"E,{A6"ORu|/l;^ X%E,K/Lyˮ(R޲h[˚X)bq,S5ۮ-ijmg X]ȑ"E2(R$w~# kÚ6<>[qrl]{NVaM"p}+UadFQ$7j"Q^8:8"QprS9Sլ.b(RXWG褰e;a"5(RX5(RXH kq %7wIn)I䰦rXHa"5(RXHa]~RMk)aMk+ɑLNQHF[E2-2mdHFS4Lp<(5&W33m2#UYSVƎ/Ο"(O">h?iVOtH"> *">ݕpCEy)a#WQwGlÈ4[>(Rw7fh`x:ٺ{Jvhv&vnpĩpI{4Bi9f wFbx}UipWh$zC]- rz&dl:]Hu37+<+UqehZXMKG47- M ڪiA𵣃}Y138BLG43tDs;âhg: 3`:iaQ4-|ѴtDs}z.ahZޱѴtl禅EѴtDsM oX4-iǏ:'M EikGұx,})ga,Q&5st=Kw9~ޕhQ-_34+ܯE¶ѯmxGrܑݏ!u8Ոm+Ԑު#mڪ]ԠHM ԐM Ԍ`ij`KS"55$rSCwEjjPDcGM ڪA sSCnjP6M :l >06MΨe/䮆]M /FfFWsF]/t&F.Ff8ХG42 : NF TӠzrrO"4(֡Hm J"u.(R"u.$r"u. \`#K"u.$rBwE\P΅D\\V Թ o;u"u.a\I 8t.d΅&΅Vݹеݹmst4[5-ssJ:QO;|Zm>]ځ߭uӥGR>JcGg|D |9QDN |tRE |iPQ |)QGDOӿkwD ȭݒ[@Z^AhVEj[u+"an\Ju+@t+NjhVVDNn%9gdCK$2{q|#ߎ0g!k" Q,dQda-Bv,dBtR(EqXYH"g!Vň`dFE0HYȢ]vG[+F;6@)+dQ$,`}+2q"JIEJ(RORD[$NP)N' pD""8SN"zN(R8UpB':)"tPp*wT0N(R8"SV7Z D;D#%GA(R /h8h"#)HB"E 0GPw=6D #APQ )Fxq8(+>IG'{(Q$ރh0k+|QD(RH-.GxO"dޣH ßl{ ûjޣxO"E={0{ޓyO4P A|D{/ȔF(])N4:dJHF("QD;] '"JDLi(a]nloûd~"{xoId~HFM[l~=X0,g){t"EZ Tv STPY@eQDmEP6Q$l(ɢ&md4ۮ6YdQOs9~M lHdQ`EMbasuE"DDpZlWf+i"f%J *xJ+Q$VȬDX"E#LD"E"" nߡö f""6D.h,nA\XsF^[TC'.]tK$ dh+ EbWw@ 2 d(`W P$ Be6辍8qkoB6ֈCG[i 76[GU 8t. ߷G5ȶ 84EĻO"Ew2 $ ~(P$ G]v2gk"η|0WJ߭PNKJkdkHъwBڊ^d QP" EWwQ"{I)q F( e(P$ mE/^$2P$` W0sMgqv:Z1ӊ  ̰mtw$OV HhKH6ârXȡ6eXA(seXaQPE ,#~!m2(eOِOj/6-H-rENՂQGnuB(`W P$9(P$@"U}w#ן?.t@ZZօ".v mU *".T(RȵJ뱬n *.U"U1\÷䒦rIH%M"4T(RIfWR>7ʰH"T< *Ń"T<(RŃ" T"hDP!KS"t.DH .1g2&>,3ˢ8$eQYřeQY̲(,֢3ˢ8(ҙ9,ޅ,6_9YwEۭGEziAnlY_? ݇|N9iznmv׿?zחo[z oWZ>WSr\Uڇh].?Q[Sht}Tj땿c͞WCEQ5:njӎԪryK碨tVrnZYS"߱VowA~k=wf L\7 }.JI3ٟ{?~S)Fy9#y;N/z<1znmRSZSbS\_>L B )ǎ^^>}ubp^`B{~t~6ӌS~)/t~s18_?4W2O?]/mR8_t{~__:O~n9=~loOY{|t40=RY)~NOubtt?>%<=/p ScYrV2\nN 9y9~N'q=Z o?|,uR/_fqIN^"#|;9V.%t|$.0oyKltJesuѤoye+>ONR ^FKώ||}:籗"tUtJG5szv\sx;^cY/Yȍ9XNɗ_3Io!,xv;_c B)F|n;>nfKTzx."TVy`zsɩW1mUZ˩gԟGj?*Im*S9@i8R}~Ֆ>c]h5m5pYv^#OկTs#Gz&W}Z-=gz=ݼ!Qs۷p_җ%xkgugj *STS^,/R,G'b9mq|\Ϸ> J)Ӭ+'n(JMz~^@?|s ܟ9_|E-? c:=?~O^;CæROZ)տ~?k],7?6V(xG??}Zc5뇄ל+Pq~[=-rendstream endobj 133 0 obj << /Filter /FlateDecode /Length 3986 >> stream xZK]_q՝s#YDBQ(x, aflyl|_x!/]S]类:_զ7>3A^X? .I}mIcTa&xqrzS*9}^WOY_d>}̕bu_=뫗}to/N}}'vznnb܏|<{ׁ~w8w_V- EH3C/.%_6ZoٻXbE}fjsN/  ~e_]_!V;)SmF3kQA݀{̻b&b}q}ԧwa6c;2]$W 0|=@Ȋj6^v`Q=LazXE~P]4I#uG4;\n%ښS|mG%pJF?:ϱoOv )oXD"q 64E&M|]t}sId͖>6C?{wa5Qtz&gn)<GA`pYes?osiˁ4 jk4c Ȅtڲ:d`U!ltnLLܐ^ 2!9kf݄ 3R6i37jCUH B nw,ѐCUfT{Ը/ ,&>۱C9g@:R@T1!uHG +7p>-PeƪWM)){JvނO8iem;ƈ£?upKU$F R邑,ܕ#2 A)̷ A DZ[$8 (c9e 2OR 1es*rĴO2U(甀}lj%^HJEARIbB`+`i%~Q%VkzmL3ޕh撞/&lz)5^$VLqATMY @7+x$|H))2//853HsJu6 HR2"MHЁAfQ\>pv115W9q!LHb efF/Sj@fT$*qI(͐,I5Nsv 8UX h`!_ EdL6Yd;g H*y5AEjQ kqր-J~[!HjƫyV__VoN&m@.~&vg3o--g޲H[M-g[Ρ3oSXZDvEd+Ngb]`]Nkg{k3o[@7AI8Ed6m8H$.nZ:+bZů/?O-NBӀh?=R+Ar eIBx apcNJC!Ϡu1e -b$`?"62:( e"DS͡ !w>=..9$ Mlr_LjYuz( -?D\v?Ϲy%eQIr -Oo9M2Y> stream xZn$7 X}9aٗ 0ց 9\o{5l+#c|UͷGۣw_t9|{=c]u/q}ww`d1+K(ǫ7a!c=ݾ}ytswqy.lP=wS<_o/wopq~wqi^/[՗?^^žs0=t~)Okk= z\(9;5)ېwIY+נLnE)]퓰2E[ |LpKݽ[ᄩ~qVLڍLpTp>.L@O`#>ŰB&{b7f/ܷ$Zsx٩V˹O`1&eruLIYA\\PI4ⲤfiymĊWc*~k¯s\k\ ;D`Z!8ׂW<̏Yd6ٹah+R*.h,uޣm589JV!!Lm}sVtaw71c.`s}hLwDݔת;:%ގS@E9M m#n>(EhEMN+QPkSY9,ZupG;rt mnEVv ~otL(ɭ Jqmw⁳8 |Z9lڑIV)wb!0 ]c0q #UG^gPM&3{\(!J/c+83P&#8YmJk!;p4 A乩Cѭ.-" L9)Q uG<`4&-:7&=uM]y6 K":Bq0}aWvQ>Zs@D/Sx^* ¡_ښ; %:!($BA AwO%]z d Gɂ!Uh MS[9]©{ Ppqx;\`F }:SUjJԡkVtnepڣgٵG/mdoo Eujgk赸0diPn*dCdlTo& nt"!Y:AAn`I$j!XprWCXzbg?uaX9MG~o9G\ cS pXBk.'-U<Pqv|qkn;GK8@9BLɬ>vFMkEsLysuJkՁ+XeѡkVtnep.0)<9g^s琓XCo)pDCX;z)E[9]©([-h}ɖ(H4XWt %-5SB_P'C&k5wt+:GK8f} P-lIM\ Ғd2Wxm H}ŇN`{RRp7ᔂV]pA xc dbBa(sRs#G g'*"8I(3ND;õ8X$#kbL15.^6Ħ(fԚ"V Jf΃.1DZrb z fLV6Ȉ8Rp)؎xLlIA( X#U,{BadכbBbTKl 2r8+bIr*B7)U}ce*rb\g'7 h2HTrYF H)B$(ߚyQg=dHA?Mz岝sYREQB7dT;+(;WTS[=90p+"5N Ry1 x:꓂4 t]'<X+C'| )1FGU0R,΢11ȥ&zWq̈́Q}&eN_,X}G;)}2k0U} Q@6"ĥD^O?ˏ$G(QC2v*$S*:(ev!g@觙 9Br7Jje` 5w#E[h:drfJE\`(4Kl'- J=Hs*KPtŲtbPT JW)]YS&NDOeAn$vUsw"ZMD IuR @Ix VP:kND^շDD"$2ZqNT 2&$pii3bn&d  RqD%/D$ZAJDb!(鉓8{Ψg yAo[#و+BՒ#gJX=epNAhQkM2m %HĮ!RY`^1O{}`.Ld*a2xyTv$&/R-c﫜PvL޵7ݨ%{ ].zK <%AajԎ J2JfSJZpO(n@-U6 @2( AsUڴ(`3SIg)k5AɔNנH JmCN5!IA_J8!7lO}:>x"UNuyEOh⩵7rAf"p Y.p(mU]:Ӏʒ‰RJR8rБXbk.=5${FF$3 (b[RxNȄ ˈMES ]p6S{ҦbTx؂%}I A:Lf+H>vhAsҸάy\6ELJhaD$TS@ ih`4"?a[/.Eׄ췧KMh`Cy6/ۺ%'Wl7f.] -Ͳnyw*-X}wb7:B%A[ lCEXG݊nd{~gw܀ M$̟h6KD 7ۭp ~5AťɋR f%]%Iϣ1 lhkW;oUgۯߌ]8ՄyVB6YR_?5FO=62% ïrS0:ƼjWXTy᦬K~vd-GC2vvF<R*fN.i~q)op_-_a* rRm1%%E01!B3:(gOLsIj*J0ZOjwJhvq ej )^Z%薨X4` TFy-]/oO M`轡- Z^jE&11Q_W}ˊֱER+#5o^E07֒3L5!DVV_\Fq$Uq<=}<{<OoxOSQr>On_LJ3t7g,{r^ y-䜂Nx=a<܄~r?z_Hqg9 "_ljx>sx3&x9wNgˁZ'medqP/^~Xendstream endobj 135 0 obj << /Filter /FlateDecode /Length 15066 >> stream xKlqWxtvj׻A@DRIIA}*2a]/_|xL1=n8]uwӗy\|Tp|&})=!h^|bq.u}\ҧ+<%~9_U}ԦUQ Asn||qz\ylF|gM_ QNs+3Xoemji[ zVQZw=crzJv6r=e3.P|͡(kjՓnDuN#䠝,ǏS촶9|{(}/uYG*98{J88NQϑScJc倷;vYz=4$Wcbl^zºՠt (yv @kucN|..LצF~HͭA:AdO^Baz]~q3|0`u5tzX_ okv̓q,W6N5j`,쬵fոgqA!E̞^3]P؃z1^RѾ5T" E]:{ӾGLw/" [+[Lƅ増wQR).,"Hw6r:L_iCTέԍMcԅ%ƬMȗ %L%&/1NѿX~.wkNרC}aHզԫonxiu)sJk@I<WHAiM +pBuv7sp@D9`ԨbC `(XW`)3 D!B(IDA1& 5Q~xMǣMJxlb"2(lG–xS Ai.ƫ8mЊAA+I &q+8}:<:W=!w.:=5X$ad"F S /Y$aF;S Niaw]HjM5jT5ܷkj2$Qf0 bos~D]5A!=#SY ZA̓JYMP,:#(fA1kJPjMPT 1A) 0A;~_2ݦa~2G)Dv`%$%G>RifFʹ♘ sfTi&pL!aDC&! #֍IM@hki<wz+hI O8Ho:Bc#g "HDĎR&rڠ"@3|? ӊ=lv]nó9YAϯIDNbn'oNB NRZs8YIQIL+N"H$9 VNb&qA$L2';ipr-׻=n&֨7ݙ^n"*DVNb WNb)]=q1$I:VD8I svٜL$Ilv*YNS0DKjLԬ3 1=##1`E0Q"* DIJk"(X^L3 imAb!B,Lb!B+aWJ~8_t_Ŕ\DX<5MI.,$d)qIٔDI(&~bVQ%9SPAAIX(ə J~>\?hAT`5rup \rGdJ0̚ #RAϕ`T Fklì"L0jL"D0`T D0`u?I<ӲԠ%DuhY#ߥ%VG!Ӧ+-imӒNiYEKԄiDK2-&34w㯧:A AT7b\׻M4X IɅSfXUrkވiȅ@&5ara& A"L.>T3sW?=q:NQo'Du ĥVY!ӦĴ'JiO?#~&*?1 @'ޛM!QP|o{4BI 6#c ˆaRz"p fAv?) E&@Q!56 Ggp+ţvB]H{cV0!ajʳrƭ~a F" TJElĴ)!)b8zjL9#~ 4kqmq@k#>sΣ_+QY Qi;夅i1I ťRBD%-MIK9iJZ֤EP1"-LZۤ@i dv8!\XSùze6ٝ iEk2:g6ul&g6.2#)"̦9lZFP01b6l"9U#jCHGVV[wD2ItBà*i!RL+˄ӆ0([JJh[ !4PG'IBdo$io%IcjʰۉNw] իQSA BUSOC:Q Y;2#&Ā0T -tX@d D$A@(nǔZUAR=I e!( 16Y:DXtnyhot}~-&ܦ"Sssi ޴-G f.Tւ(AC29h#vZE۫5B($Q" f٤2$J'a$rzB%a$ZFb 5[+!0P:ϲ>2'GLo7:W5Yj9$#HrN[1@VlYE&,M֤z6-UV s9zVS&Է.Ne qH$S& 9#HZ'LkiGPh;b$o g㳬{w#Hj՜3h\wL-ygP;v"yL!3(Ԝjk; 5%޽#r9E5Pt*\M!ސt2I:Bűϵo-߭Fi%Y9k;k}Lw3(AX$/N5ov;cB{OݎRF 6 RDUW ]mS&$W ]ArN'k M`jlMН+ (\V+ H& @ڏKOSnZ˺i#Hr%UL]ڏiS~8ndny˂~%.3Q*^@T5N:Wo3P2vJo@!`dkȅ1^6BFo6ނ y[[p[("M:M{ Fނ y T2[$;=-VB][Bk[:z9 M'jc2l6"@+pLUBX @6p|0|@Fhm#DRa#TmA<=>p)z}tNim} H%UL>$=jԅcTZq}>K},A#FjHB:EA~cppN md}E2 Qt@/4ԫpNڗS0(z9.k`@_p35pNkq %5"l/ f?^W60mXHe!EN~zIO%`^'Ԏ ,S ô\QfC%1j1ꫫP a)F5Che?m''`kJ&tuB#BuN k7lӆKj+y.IYF^.UmO q .K1eP`~LM[+ACU汕)yX1ͪW٧j(mAF$#HO5YoDwy90`%&0|7݈ t#2jF@Gi'L $3n`Z~ qWGl 6e~y>$_$qɓ RV 7&n}T7.Md7AOcʞ´Z$km )Y -m;AAr] _; t#vBA 9 PRu BkA$= 8WA_d5r0 5,.5͡3裚~0\́$s.I~0|J6JksmwJ@K$snNAŮN1|9뾜9 H@'fsL6$s9r5Z èTssP/aH3rA~ڭ'P\[ V]8Sxߚ0< '5J<'0(&7U/V/lɑCk>.uI} N,LjTꩨ\!J}7N*AzY7RO]XqmI=ޖT) _ܑ}x;Sw*-dV ;2Y#uG}tSZ{}LSi;ě#A9p5vz/"#RXzޘVMZ9S7B$UoBkz Je-zR/zcR~![洡 zS&7cBm)޸ԛ@ײmzcbh#>1*6Uc)8DT&E$hȢ 6[1DoH*w N{nFP6udȢݽ;NtvhcZ6$ڴmdFD{ThC}U!ma|>4oqjk7đz~ĻIk6Wk"v@jX+5PF: 4aңk{`eT !}-Z Z{o'ν3i3TaiUSfJ*a&tݲcUdqUh)MnV%u˙>I!I(c@ZrQu Ʌ"2LZ1ARgY$}­ݝKimͱFSe0S}-͘Vrܽ;=n;EƴdIi-ʣDC@eI'ut2ui\/ HyD9 kI",XH*aF \ -IȱZ 9Bȱ% 9g wcZi7(fKq5i7Brݿ[ƴ%! oIMi%׌ fP5g&4,nddɥJqJ!YSu« SwXHԞՙ@Vn^I5:#HL X锬θԙ@dI& ͑:V TcZI5udumTVgI$unN!1Rg%s1v~i5F.U7T;/}[a e&^,Ĉ\1mlLkejw͸@VfI Zim+3TA!ƴA_I$_IbL-Y!1_ߵ\pSO=˨E@D+JEH#(DKMg(4u4kjsij"]{'ҸD@iI 4f.Ⱥ 2d]^DH#H" 45aiZ" 0-,ԒEZi:ʎ^oov/*)e#2ڴe˘OXcV8>GMq,6} Gd sP~qL+gP8v!L!3(dkoFqi8B2MHO^2kK2>8$񞴮e|z/^o  zG;Q c$< N{> +eOsDfP @dmI i~Ui f d@Ph>fG4A|*ɚO,#H2??s3 R6/Um;dTt"!ZΠPu,1}H=u!\|^ZRGl{3(Az䉴33(AzcwWC 04X S˿5:m) _IÚdjPeԉ A2\ze;afe53ZKgEQ/:ܿ=x2 ;gfF QZl̬BFilT Aaf A23ɿw_/36,oRfD?ZpU8dGL؉Z- Bk:A 3 bdffAfmfr?\j)b?Ud) #M6<:2mrçmP87^<77||6<,DG {qm2<_2}jTX"bd%hI?&DUD<AH㑐~k]X#!56:Y#"Hn !D5@L$e!eR}vC q9 6Gixד8A2;$&V(ô2;$k`CPXڨި<doT2酺L8ޜȘ@2(,oj[e1(Ap (}p~?&;$v;jvljr8d9aw \;,P7|ewXA;ar8 9&9^Ơp5,Ij{W[1[ٚ[#*H6 C@W?Cjf6HH] ʫkbz&^P&V& %5%Q"HF %dD5JL$DP%alToMeA2J V8zmFY3.=Xܓ@vO=&'=i5'{RIvOd$ٻܭys.koiX$L=廘] Y,5cGLQ$D%YZ:NR$mEuRI;)HNJuI1AᤄRIvRenIMٲX[6² c˦lerlɲ d;}%ecDfoS>N=۲ԍ$wné({8t kMةN;` >:()|cwԳB;qH7#$ْfOP=^OH@gAN=LY^$ioW- khdUFff?x]OlMJ~[{vNY{[vԓѷwEcCҰv]7O^ZN>Ou˨rrpk|l5ձԶ]ގ ;5cL$KG eJsh8f͜R3ϩr[z7=[OlcG@wj(zn >.'Glry 󗹱(<Zu xWr @*՞HwfמyP@P oujI34EP$>T Bι4s#==T< "A5yL"F*S4u HS52թA:.:@ԁeSEST^nAy@i&O7t3|%'e"Ht矔VIM?1Açej'kfs?=V#?]VժZ0=Ꙑ1AFfky{4p}a>~f>ГZ:LoqT|MX8uXצCyfˁT%2I.GY{tVRLjTi?Wş2I9;*l YV&@MhiOF@ Pa& 0"sjvYQ.^Jpȍ I0$T%2I#~!~'$b o\c@*QUӦO@{UimI0bRIV]dETlX`J+ե&HP]Xh$ -BkKhﻅZ\Z{ٸ[盳n2(tAXt3n2&tA!/f>M TrfNRIY*yatAXt3I7ɠJTRݛ 䬡 z&bMl"M^;ts*K79"D]ٸGsV;I}9_Ԓ?@d&"H4SbK&bV f='#Y5֖ "F2 dLAI$č]4 Ro)qDXzNIYqmi-&-IJ(۟ݨ"IQII+l&f&"F *Mf,"bpJ1d:?Ei&6d}Z>GI$}&Ή>RG̺R]#+}$$"H85Ƿ4Jwχڙ$aC`أL6H$aC4 n W a7CcUhiibe~ d[dQ5I$Qli5 3MZiu5IHY툃y8̲Ġh/Kۏ[0ucB:I3in.F1(4kH%0ĊZXa !V bP$]z%VX aP-pr`4Dk^K0D OC:ՓI];RA F BY] u珞 HBT!LHH$!,$ɚ i$xTH3f_ 4jL2ѡieFUrר6#r#HFid"7Fx A1tkMEnĈJndr#HFM 7Z+@n"W ϋ"F"eLOʳ$y"XED{"F܁rLc1\l"`ĥv*\ײ{SwzjO~ɗ_֜:5bS'٘)6cn3(.7ۍtW@ ZzAJֵ I1ҵKYRq_wӗY .W-[7Ǘǯcq/9]/C(mӜϲk9kܞOz]EܧrewD|2qQ~q=_ύ%l:`zUG}4Z~FgTm~t ԑS劤kݼeЊ ͜@ u՗=:r*V߱m\F=?7ތ ݅-5s7<mir?U³EOV$I#WTQQY]cˣ\}.z>.+D?Yp/Q%V:(PQ u=_f\'+r:JO~Z);W_1媗|7 哿Ϗ~;%Q>y~"w!k?f\N29> .G_Y.|m!Z_ןtq7_giA |St;}~ϧ?||*柟B#K?~s*s4M_eN1ӳ~tQ 5r\zxߔ(&ZڻnV7o|?}T.\)6{|\G?~G?'џ~c]/~?ΏW?~NBKrG!ɏꞻW/~_IنyǩYk1ݙa^CdCJj礲?/*Vk[F経%o=깸X?~th?%\K1m/R]0Y%)_^6_ԇCL=!it*Tq=N; eTtG媦smvhݽ%ݧ!I3zMn;0+yCguGCobJIOD~NN&KWzޓ&ruk6^> stream xAsS>ų]-BbV;b1E?VyN^eR@DFddFνoi?o{|<>>Ο~-//u>t|;}|xngg/߿O~;/?_?/7s|$y\p}<?%{OpxtϿ/׏垓F__G3#F{~<׵.~JK/|.[hs9> ?M0L;å0zoMǓz3Ѣ6fXd>i\3C|ϺXq^Q|n|/sJؒ:>s9.;\̟y!h1?N}VP/Dps.\tсF?F8y@S-Ǽ|w󜏇ˤy^D^kc4G xFA<ʪ<1&Z W=Тn8gU9uSJiqWwzxTxx+w8Ka}!x>YRjLLJE݇˫qy6WuͪH'No;1>w"Vh홴-xcvޙdFD#j.{|rϰՇ}XzF=/-pRyݔխ'qUHV!H]z^=OZs4`nWriܱw0٨i}t_FJdQR65iagšݗ,ԗQpiGr.9lG:{p׸zw:vmN^ z=lo@C9K@ lfA}m!vGH@׋kQkk Y1;|9?R: ^i^4dX'>x~m(7n@7zܯIN/}/ƧqW꾯g!PޯBuzQک Iעѓޣ1=%O81Ogm2`> haFˌe[ÞUY}wr|=z~U;zϋt~t5(>zXqbnu <~98ڞ*ϓ,@,@t gr D4ɀk,zf ۇ[Qks =Fy0ZT)?ғj{.:TԨji( Ujv0bOI6Z?ۅzsQv9GtndZ\Z-\{PQM2~iɪZWפy:r݌n[NH͋FS̏>ݯM߬C-ˡX#qOkj:EvV[pb0@K]Ka7FBG!ڐ?0)v֣sN4ȷiP> Yx4CPhH|Р_!Apڑ^e5, ѨxìW(Uz8A磁k+<1O<& ,M=r(M:(O4jC%Ym=HL Y8Td5y%A**  b 'mDlA~){)S@SWҼ@#48ң!Q͋m{=^OO*u{ʀb:P||EcTBah215}2->LTLyLiu Dcz",:c=MzM%:=l_~.jck1[DZ,5P5mmJE;񄊒tbi2Q4iKIJx0_ zdT~ Ş4 =ikڜAcO~Ww|Pyyy_qaѼˆXU_s8NNǿ.\z<Nibi/&&zPSy㹿xyhqFp.}*&FO1ы[c\Nq=C[Xj鵋uy{n_kRiչmC YxA2Hh L"v`Г4 bB^}u5Hs>/gk7>2up`Nr-^Zx@!rm *PDFP}c(ھKYB.-.Q!Xia=o}HA#чJb؀SlOAO|= IybB./ U)cC MpGTǿ ~q~y"l-^2Sj@V c+%le6^k=oel_"H٤Õ64h|#evpjv`CO" nĴvh$a8q jq/\UU_w+lť7;0ə[t&FxZOz/-͜a qgQ:FbW09m˲DzXk-@s,P2ǰÇ(IÍ/KJä78ID<\^Їi.Q:[|-L<6/.I G|,KDg %Wg.XҲbu{"*d>f>y-\xb5fAN(2RkTE#Ǎ$$ehi.:8.Ýth$љi(2nq^&eAmpbcc؅مˊ]h$\a+r .aDzT ځ!+ ՐEka <;H@27pi*ߞ\Ƶ00Pb%Vqr NL8'zE z"h Dr#5>:\%sv1w&:F?YONDgƂg=Y axCtI8.v?ܜ^$ BIPgQRh nl 2\V\+4 P-zQ߷Pˊ`4x8uyȲN(h$`؀F b:^Q6F:|Ĉ7``Tw`^ԓ\P Qu2+kxz536x(mF: < %xCO'i$ F$B9.,UCJF>Sߞ{[SCeBC4|PP9;pQB8Ah$@:hHlp  h$,Fڔ}c\~;t#5Nj$*eF/]@+rf.^lpYĈ Zh 圅\U8S蓿|e<1vd^ݵg|!<G#M4_9g"xaFhأ' mcmD^qQq.YbCވ!Wxy1fnS&-$Т F?iS={׷=%q_n\~\Vj10KavЏ9I Ҥ3z 칝BDWab` ͂Nͅ8 r(\/@#.tDyGH,O(մ|4 ٴcDD M JÐ@#A\S=8!0r  rDd;F<FOf-9z T7 O "<|*W|*T!XcVS21AL>M+4H >9_G3Ak(I"#hc~NgoR'~N[p < G_D I#rfRuFR=)!BxBT\S2 VTN|!>+mħz NHZ& IXFr $ZH*| ~9 14j[Pb'ب(b'POH_ [8^SkP[8 4-Z=yԠjqVI'?AmbWfxMĨ(KCkB+'3 ,\X^gφ- B#a3!Bp#AdEz%+ѪcaC37Y G&./x'1>Η ʥ2IaCFξn̑F6is@+P5PlCXv,1M"G$9~5U4a7A[1F4CU8ڥVݥkid#baaU8/JirJ^=^3q"0@Dp¥+?J0 xξbfn>aR@G/pUW=B᪍5h#2m0nPP9T×pG?b0ꙋKX6~BS\&Cn# SoF8tyح8F 8+ ;h$ʀ^c_1M\oiP$JBp Ch# FL|| ./Kdಂ LzI=YLp՗)ં -;=ZAe%^4j0YW{Su'DN4QШl&c_TAQs5H'nLQv|רk`b .? P0 ;h$vpUan$ԠRȡMjL1q7E:=Ao3p{Tyz{NV0[,=kM LHt[,=~^•E60//py5ԋ)DM<{ pd1"Y=DZ=#QmLrY|̸8܁G،oS+'+Q\9 CWHlC#ᬺk bfJKhq8~ =͝^u||څ)XIXz&&-t|V-|0ĜO22)7FԌdbѫGܶ艫>bL\uzf|gLNڀYNY=Yw r…oSآerFgh(%nҪoSq ?WS0]Lݳ9 ߫Ѵ!x %/&^x"WGp,!7|/xMpߘC蹹qJC27FٸN2 Wkb dCe3MU˛iQr jl=@[! J {tu3Lz,!BȦcJ-73?GWw`n8_y9:l` \kGFo򚰱<x)`Mc3@̼|1/%Aca b,gM鹅]C{\:CSz o53u.1@ ^ސ'I %=Xy$A^$)ZDaR\^G#1cv3iG2} lq_NZWȓ(ӄ@HHІ-Z@J\+rr p:!ߖB|٬ tBnD./E"!ly6 >KyV,T .;T)I"IwTJ|.UJB.TJV(yR* [|S=mk,pIąIO$N\9+[XyQ=tXyMsj@b-5:7 r,$⦳B&Y::I%x-dZ2-ښu%|'mYRrp]arh4[i缮*f[9^k5lYl?tֳk'ܛ$iaDA&ѢxhDhl$5YƉnSW~$ǂMw!mF72,?Diz>Mշ,m#mh oPcl`qY]9IIR,߉朗)h[uqRMd&XdMOMO|n=jZѤSRk)^iR6ߓfh$)FR^ά(u)FR n)FbqCOoj)/T8IXm&"K,٘Yw*~[LjQjTHeF;v5n1r|=c0QaY9&ȨLcq2e]Kh򹩕Y j]ˊ{DB+GDgquLb iN؂;z6SxGK"IX%Kv`@/9kQvG#ҋmݗl:0&HJd<JP凭h"H0#y ^xǂ@|0,=^OP_+yYn5DfJfKbۀe LtU4C).?RpSt$T)TJe)^!Ygćrj0SsWt yYƠQ1C^V-h$F ,;PAO*%id"% xvF$h$ 3JmQSt n%G$Q>w]P݁  IH^GCHI8U $Ptg.ųBkuR)::EAWz_% s,Tx-> /ˆѷZ KaRyaB%I 9u[I-~l<z5(WQ #]?J _/o~Oэ=H6B2d%H !f0-IL^ `z>phx]y r5 %HJFT╍I9FҰO`w Iaw|-0f^oC:^ow ˘ FkYO>q 5dX䅞i-:ʡ pA#!b0їP AKcBp;@ 2h$T '0cpƘdu$s3f5c ha(ჼLZ(9t> %ZDt ˏyĐrr'c!$OG)# $)]/7k:t5oIlyyߧ֭*=NC& %dloH3/f~V6jc8yc'&5 Nxc( pKX&#"i \1#Ex@uJs6p &qZ[_fy1wdÌ8+jXD81q@kSDŽD~А}mIMb, i^ ^e顾?9,8yifv^MMrg4H:bָ|hɌFyA5z8i9.Gt mr|Tb_]yM&k>!H0Z0˺MGpZ\cSiR}\f4?xm҂cY4z4z))OY))GoSkFQ'{ >gb B6E0Zߕ(JcᴻMlJ@4;HW}sphua]KuAeybqyd|;O$\FvZmr'`znHpac7xܛq(7l=wqn^t0sS{c]-渓޸ܸht!Sug{xn3iδfնfNQJ`U"-!Qwb5և:n]W㷾LvUQܔ3uF~ݝΟ__ 5y1tBmh:8}6jFώgQ7ԥu;g:Z;ByOn2hrW q;gFoY˫=7FFIݞhD֞h=zYR2 Ԓ/DžOnZ=g<<{Qk< ub:=w뙽.{6ޞJFFhFƒfc/P}_uⲾ>n畻^}WΣ`^s''楹祹kInFNhFhƦ^O 9n=^ƌ|lpZ}|ʟκ7FJgW4RZZfC^{垥Zg㽻qȸ:}ÇD3stܷ8>/탢ޫjQ2rZ FcqUq9y$@9GM8TX79 DŽZEt;S½znp~>Hy ;[P<`]! |s̓r:x^ o݃FmFw>]/I}&Uypuݾo[p)1|ۍ˫;qVStԈhF,FpQh9M5`|[ݕPVŲ=hОv^'@a0njqSG74-^l\^]/PPWCxwY@ඏAVGo/m0SQ<{WoTP?Snb\byјPk^\}Լ y!ԼtNWڜ{4{WUsR<^ۿl3i,ɍaqFڴ|v<&ǰ/ZO4hui6ϦF־ս8 u-ӭ٬^ތ)yI9x/m? kmcQwvܺT,n|QybϫM5îAۿ^ׯXm^ XW `/ҶaA9x.`8s4a8pm.8qq3~.ocj1@9y$@InwړSǃt<.ɫ0u=zbo,v40χһKk6b6l<犀rpc/|4RQkpL2*>a||ܝw~9Y'}^)֮] V/&]^mmh dx-y0\U340q_wA'yztFQ޿Fu tqY55uj?8(_5 ]iրW-hIeђeт i,ο ?\g)#zVK4Xm"f4W^㉈%#@ho0̼MİJm"`+m*n=zI|a4y7c8c6ب86jc*?~S޵ZkkWk޿}~'x8^^ ^~04V^j.^sv5~]yMlT h_5PY×,ibdyUK2+P,gm`|4sqJp9W c\U<[ߥr4 x> ouolní:g>?Ӊ2Hd>{aᵛ dXxMȀ ѱ>Mff?z4\^?^=7c.**YPMy죑>}tN І꜊ٿ?|ߤ/)1*L9E^;b\ #,KHåE;a^48^Xiw3 V' $El640Z0 =i蹝\KC-;V߁5ͮj=̱z89VC  ˆp6Fhߧ ch$l-DzűQ peѱe LˢnQM\M;FbY|j-o,᪢@zpEDz"\]"%bDFRyK.۰TT9R=qQ bUNG}oZ e4Km up9.-Epy +4 ƲZXOf+%mFX5ppUa W}a pH kH7Ëb@$+gkfz"qV9*-8}~1^' Bk@A8ώ,s,+pbViH$7&Z3ߢo03,ŸR3=L^9G/0It z""!]a=^;Rwh$ޕ)]w: ~PoOe~+B[x&t8-6suY_IwYR.-ޑoϼY<0f`T,C u<7G1pa7CHe)=BZ=V!ѕ~\^Y2Y| 1L|`XnvGMn߾Gzy`,DaocTfb˓0)2LJ,¼a UԌ㙚pxH*y'/HdHfe$xdGJhZ9a<ư\zde=`8i>c>ǐ Eayo)0,ɋaIet!A9 JPRZCPʞ%b>&56TY ?ـk|d<{=_xԸ &.(8ދch\z A^+A2 Ydx}'>ߺӔՇZxN_r آ.噋c8oi$|BYh$dQM'0P! SH B#1'Q| LJqS/^ȢzR;x%(UO]:zf=)E1W\*\*S\oUZݣ&޽>;Ncsɸqȿ_X3,N\\D1F"6h*Zæ jCl^0e-NShK#qP<ìx)0( l,FXK:~vPE>8S,:Ej/79Bi̎!>4g XB#q[A ^"dAVNN -^q>Xg5xU7fD|cBW|ͮ7p=>WIJbɫ & .܎Ga L,r":H*pˢbcur Pa,G88+_ cBw#zUCZq(ӫJe`FbT )\V\«93y%*o `hA"^&g*0@tZA^# R9X`*X`!JaR^I74|:Ш1(ޘTY CEXCjF jHefMU̚<T'P@`89+w;R6GN0Z<;=pyz#{N@a处F"FzN#E8R e`m*\ANVbMD{7t`Uw`daQ9AUASm՜A#q q=Q zzt:s!X?C5qO &ճXQpD#pA#NsE^S`HLL)YR aC+U4>;>;>0:TL0>c}>J^({L)X/? iH6JSμبڸo)<Fbjc@1 F#nVD`FrE`{G#B~/zBBy &4|ܻ23Ƴ΋8|cr@}̊rF>FL-< >Fۗr @ DQ?uB&s  \t99Ch$@S1$`ɀ7Pf/8kgTYQ;,;0.hYрrC}{C9sᡞWqp>5.oo߳B4B xvQ.l)՜`g#8^Ƣ,8icT{ z8Uh#>Ay:0я@cR.TOJ|'%>FR9NH›>zd!4y;pYa!22ʗL*oL14"pnǣo&Zx ^y+P$&&>z68|r>8tણG$\U؁RtJ"  .h$FF$:6hUc|^{1t!s>w!`q4O .lMr R7\H?hZz 1jB/gaEc?/^/,< |w'ExBiQ(Oj8VqES'ڒOΡ8˾ $'{m B4OppF@fɹdwO-}Boa\ s ɹJ5q z 'RZI N.>Mׄ\%$ʢV0KZCrabu0aoONU ɈAi):s"t^# $CFFNyKF$0f(i3ʇaa  4))oD4sqr}Ə}x;&FQs$* &B%1oCh""ȡS'9t^+2@ZU7"Xq* C53 .B)ZӫZëA*G48*#zT&-*Uf񬛐z8OP X^Mdd8-X l|jb@e;TX1 0z^UCY9u @R7 VVgъ㪞xEXDL,m ,^,𚼥&/S sB0ߞ@*\uĪ`P1 \e '=|GcVcUYFo)bUvT*W*U![[Hv9=Z^ǫWDxuZFmeO0' sB0e9 Jpr=vD*4pϣ*t _ T*oUg.\Ջ#\WUyfW9A4|EAZ=9zZ=V!E<+'eQ[hDLŴ}p?GMOY ׌|1^;NE҅a'M!"F0^^>ڊHxEOkS#4b`B,.?B,8h#' -*t-\aWkQV}%xZN os8OV=L XzB׍WeWC@y":F":Sg-Η++̣ad֨=QG{z:ca@3L%Rt> x#胃xFz\w#?љF bbsncif l'/FK|M>z )!s롚KA,_ ?=lc =%¤E٩u<Rѡ?+G<`>BdzU@1S~ nbOl\ 갘|aayjag{Ęݣ}Ln#D_{)^VvZt_2P02 +Œ̙Xhi/S]2\Z&ڮu nW%-[dۑlƒ%Ғeo|8=~&Bg5:ՅI-./oDOT x< k,)iWmK\\~t@Ղ/̖HǑl! yHi~YC&4 xv݂FMK+%J\IkuK] ?T\+h, $XI0"#6/V&8~xPVy $~hW?Dj:: \҉W=pQdEtEG#~L `;MiE=SxCDU|VZqY~q beK7oOJ ";UM*4?sh$J(Fx-H܍1t<A4B$tH+G:mO{zC|&F1T8 h# Mِ͙6GvI6NOFP':->ɒ Y< f?&?Js?'l/>__ӟUr?V܇O1r{㾇ُ/EFO x%0>.vzmtx{]TQ{ ],m <ֲp㼮Ѿ.kW{t}<.|o]o(Tj ^hJ*Hr Fwip0_p/v> =˿cU8EkW xB#U}H|j W-r9~>;5$@:g ѢNthDvh`30'Pc}8oXHFӝ@Q}}QЎ|Q|cpy]1.p{}|~=yT/GR+hWj ^7(L])\g9-힑/&za:Ij#~#{N6 ɭ]xMn߿^-],2x[F`ă=a!}}b>tht=28=>ƙLs0 s\ZzcTr5,?VSFyjhK)l*F :8Ϸga17|Һ ɕRl<:aghY=gz7W@q?1py51&ZTWo8)7sqU[`j \z9HH\XJ Tݝqɩfkk@q~vs/r2sfjE6[P{TRݺy!Ժybx&rSϏu;yMZuHMEM#ǡ< X{K\V`;lk[mKFGQc>jr4R?ch=_ro?]CM\-:/J͝jM^.;.RѻrǃÀG{~;&Vr\~;:W}uz57z=ĝ^C^C^yf/qVwE+-~ 7h`7z7LL]Fjaݔe;Pwð=ɩHt崺Ս4u[jXV;rS }xib`7nxzCci&G\nr( t j :74Xˤo] <{zԫ1z<ܸx@eի,}qM*i}_(7,冭ͻh'Xwχ}qwbfSiprD5}(٨)۞ )<9"r1wu}:q^n݄ÚܧФuZ'ubvA֯?ٺ8f'i1hu:cyz{oC689 {x8>2L?U 4 x}`M#߅xIF \^oB;Qð!XqQstG\ zoFQCG+|ޮ&5hy7;.Ok J[WӘ@=]^&iӚ $bi4lG$է?}5pyqb9y(:,*G@9iG#6nݰo:ܽޯjqb;hԚlOH%}(Yvr>O+#MEݼ,å56Fw qFIQ0Q^nhI 40i,Fif PH'كwweG$RYN_|z>̜n?ź[Xmf4DW^yݦj`婺Zz7ۘz>՘xf/o9fFS6f5{i 'ώVcii x^~pU||imQ(=}NH}-}ǿ.Fy{y{&\z<ϯF/&D 2F Xb@Tj3 v6$yϯꎭ96`/ 2oLa#(p82`-]՝UՙOF;݂NC 00=AC鐦E&ެQPAP#(1tL##SI6sc6nW)n4ݯ$nǵhdt<^m~ocRBLH D#q/@J0K i2|\(fa2@FRj8|g!f_G6d2fT vhb:Yz|L!.S5҉fx8ΆX>I,wc)3yzk̅;tC#l-pqz[.! +$`6b U]fX2 Ѧjh"zG>SY M=*!F ] ] ]хFTtRfx.=]S*uyYTAشsбU3<}_ɘq AR"TĹQl~8X\KWDL3"i&F$E\bzL4*ѳt$2Ʉ̇!X?g])5?/NF* 3;pwCrx,8=ޜ^sM)"SyF! ~$;W}X5WazH,HF_j5 ?YC#/P_p,T\zsn: #p\C#%zC ZP&Y4FU6`v_O*v|b X Ѭ˥$ΥS2R |<j`"MDŕ|,I*0ɘLms3K M0e)"1-Ҋ4p)ߜDU#NYE#At71HUI e M44 l|zl,8rr0eԁk':6o 鐆gjg:S3)R+# an;s}&t,4iz S*ٙKJ'%vVLK,^S"8j8|=6w9p= \MFczh$cNw ո-*x?~bxW'upVʊ@&Èc:! LO DP\90át%GZ'0YË5 qE:2":$-) E`JɊX]sGH />M` O+~7\摧6/qkC}C oFd:d wE9OT=ǥ*J GDB0,`FMFP|fCE *\O8Y(_b.}f!J Bzke@Dۗ-TB֍B.H낈'+E!aG~!?h$`p{t(JfpTFnidS8s)_I,6[K*86 TъTE3p΢ѢRxFT8yEQQQ]C)^*BJoL +)RE15c]U :'miq9v\s,@ 2c}XM5hQk@2zo |)ElL.\mWd !Ch,^eXx;h< 35h04¨ZNƠQ'4Ur=_{95/ xuz'8C R36R(T"C4MVY^DG̈VXHcP:fG8#͎py1;I|$TM4< TG^D<@VF16bCK"BFKسGi ﻩ纷z,Iycy~:?9.ȾȢoo DS`H3 [H :?YWB8k HR 5:51({Vy@ @+bV@.FEtT@P&< Z<+#H8'-CRĄp3!Lj DVg+Z.iC-Dylh!t`Bum"H<q) aPFǰ A[۴p,{z<3f5VXQBU@`>^o9C-'( 4 pDLu^"V ӆf.3/Q͛p r>Q0z|/Gt\bx/D˃ [ddB Ph$(@sw0*LHT"#(ZT(KL%h1&Z]BFS<© =Jj#X5jվN'`Y9FR*q#i})#?=( z6޸D(q<7gLʇ*B2jL54H$C# 'Ѽ9pD3\4##,* ST-t)Vd)Ø8~ܗ^.^GS8 hR؛>B/ .ڢM*FK#V0Ž٬Bl8Wmjxg+R)~-,A =mB awxQ%ya*.WFD St2A1*3H|YEA8SH7nFB)`dPblz pL|,ƼEY)Ea6}RtL|L1d(qx!6u/$F7ު"0aꢑF.14x8-U=O&vG/{ോ%Z;( iP %WEy&vVlǤr41 ; ѡpLC!Ӱ6ۘ-h$gV[By:QN0H.a ָZ@qJByzhwJxϧ#b>z:8V^o @#s)O^=ڈh$gjT鞙Y;x sX=+qpZǰM4Wc?H D /*jVHsz J"!J"!Jʁf{Z`)Jh$ ]?]l Ȳ^Z'),p9.8SRaeԗ `ԬdC_? v E.)L>UadbU^RPRPEa}Ut4гy!ˊBU,9 IrDŠ#J=ŹxEqs,2$H$='Kt&t,CH2H*U$ATFt$.( 4@# [P'&AaG"I+`ϪMIu yI Fؗ+ .J'YIy`-IUygF87ڼ^'+<S 蜭>hh$qE8ii|".p"EGC4eK =/K^$3|MO20i 4|4PkL'(Zd|'`y$RԼ'ɶܜP:*Abx7CrxߋzKp F ̢*UUM$)KuQBKhIpD,8hh$X8DF~EdEdH#G4UoG*$I>ɠoeI> VNZ%mWhtkhuWҳ^|Qp 7%ܥhRX/n<$>xo^ m4Fe2JȠW}RLH'U[)Y$pJV=Kgs-CmСuG%OUA#)2I'p@eɇJ!\fQ$S$ o-m?y?V8<)w6$g'֤ oӬnY44VIHS'#,QͿ)M,L:oSeXrѪ Kζ*3rl=Jg(]F-YMLb+E6R\<ۺd, Q,ʮT4at".* *{vXKQ2ROdhp%'#VSku JfE6RNd#D6RDI@VAdE56J4<s&xi#tj3a_fxE4mz&Q>g2ɤli0ݗ&LN/I)O =%--ûVL%F/%ӻ^.(ALX"2^KY$TECexDxxɧOOƢ>>󥺒H{ 1<zgb4Yv/A[%>SQ`ɜ&eI%ղI`I^m0Z&jQ~~e'C&$!yISHVF;bCy?l0F._n:wkY"I%%yU-I7!$0s <2\5]tYʅCHқɒ.{V,! I֑\:w+tVpI峗642Mj 9&HÑ%RI[z JW>)&K86p#Ws@Y1N{@{dYG6Rud#QWmR#Ǫ(iLh\IjY%­4ɱJ5:Z #FKј'aF]Rp0Kk,ٲKdGHEgXtZ:"ȯ %2R.J*fF6l2Yƥ+UT$8OX%$cF6kZPKEpVGnnh˶FjB[$YǽjU!X Z \m:ų[nI~rT Շ6}KWyuB[7pTi=uS.T:L{r$hVzE!r ?> z0*ցáuOgZ܂ꞁW+yI F|z'(Oh噼U`bP:QPɆ=7*F'\==@`ݍUӑtppVUmN))F88T]ͧ`>U_`>h$[ R"{D')n7*I\B#B"p52-cYA[JdHSe-Րٶ[!'@gRx;!J0)ٛJ]y*g.ιuM|# XT!6Nn0[pE#!Co$Y||>B,%d֭$őDԌUV(MHn;#)ͧSp پXqiy_JS1Co_0r *?7 *KICIXxN|m mZx|̒xh&:ҷEa6hxDCʡMYbngHPt҈4m0D^8=LE=4y-sż yj ڟJ 2`K@Ad?z!`ďCמ-hxaΒnYr KF@#*2Y-A%C.X L Wz xɣ -ٚ-+GI#(P :4ONjKQ 6` گܯ5^뒁S„T>J*!3e}F"NMp#E 41#SJ #[J Fh#`-'&@i@v3Q#S@ϩq+.\Jc#]J#?-6ϫ>>/O[:9; |Z {eoh԰VsRTt !SKVt-=?sQǜH}=:mT;O/9sQ}Aùʨ?9}A .$BB U&8=x=9PIr hh7fWO?pn"c83G=~ԑgx?6jdFԔ^.z4' :te毖 ZY8eZ6MQ8czo8Uڦ1'u2UvMwtܦSr'~^S):uQ-VxuZ,y( yb|J0Թ©_éggm:7qhKorRWŤJWVvծ9rW]]hzD){7Q4RD#Բ=vS]l~L+G5-2z?b5xchm֖zV5QC#5ljڴHM ԟ'| ԟ2 \ƣsܰ2;v0YVJk+sMDFo=eտAHFKAB2j_vBB#Wm>j7\7y/'EYfq=4'z_ed_γ Տ_/}\OJ?4/u1_X~7_ݏooyߪ/Qe[y 8-s9g_.OYhFnbnEu/xuY 6]N SN4m:ߖ<SQUxTv:_N[`hRe^yO[Zؠ*s>^ nUo\'ee\־K9;Xk.`NxuN xuʦ+k5/Hg$r7ήXy nU 4&#>ĵ P slv2w#!+ĽC()oARށCk]"]o, RΜqZF!*;:]잵g:<35,~9X%|Ρa}+dnut`C*\>55#h?QggiO~+[{ܼpxoC4ҎC#84* mpƛMo y0uXцv-6ikaѳWxyӡh4ҎF1J`ϲhC s[xYvwˮǑHuWF9{J ^]M$ p6XԦFM^FIhW秨?nyLL>`?:$p:5x:J+ϾqB)'YN:nm *8ѦqB#pu{owe)нV5xuu9p:{8|N:j+QQ>U8|T)*IF-6 ӆ Q_Qg1X밦ϧ6|$fY~:za3kuqtyvVqzn\K/ /2^tx69|" >Q ֞GANx&:ᚨZtIccIZ*=*P?)60ۗ}CMq'< Y[أN86:hceiS\<)F1M/i8,R4^Fq[\8L0zL=ަF>EՕWBz*h@k^GtT1Rus1|ѣuqGC@c.;#ZTr1x|::9D/_ɭ}6Imz@a\& I =Y'3OM#Hg#7SN4zJ9|JqLtg۷o\^5?#?{Tout|tqu1puqPS>>||uAԇ)>Ijՠt[\_=hj NR/Cw$x3g䨡C˄C:O8:,0?v r Fj6ᶈeYyVxb :'K:mAmû5wDϖXˇRęNGULo A\f# ߗp~Bt|ܟ:4j6gʧߜG^P9Ks [Х1n7f4Ҙsuԏ?4xҟ?g,Z1VL g.'B5P+fW+b=[̋852~Գ4\Y~x- ]t5^qwjR]1(!ce4~Exzm!Fn"B Gл&"xu:H IOLE|C>1!#Sme|P 4HtD_!Dp$`e*h$# ֵ̏^>}+Lt\22H$CSS49 R4X].XJXx2TxeKN;;+|a vwr'7WwrY D T, K@;c!aBuDD8| D8o:<x3hFdMp&Rzٍ&)O`(FkP}FeW`^ Hx_Z3R5-XĭW_>I-WtK閟ktPz҃xb"D#C7ч }ayѢ1{l 'YH5H8D#pW6waգ]ӡx~wV^F ^:I8FdRd>sq2U)s2Ϝ5mVg/}pB",*~aH #"qepCw $gki|Lq=WKkfC13ܤ56"a+ hS$15SSgĨ%$vK/vFwIs72D p LCaEGĦ#d"AHczɅIF_/}8/c%VQuna.ƭ7=1&4A a}L-C !6\ϥ԰2Ш*O\ԢR:rSS1gn/SfPFSTN8Dp '4H@B#'^BNzgCHb`n9I?JP!5vQ ZX2S S@jaߢV>+J$ˇfQL0XI X\t̼B{PB^:G+k9L0h޻܋!7 lLpѓLo7aG1dz}Qvzء6ɫL S׽oKb[At5=V/0TDQ H>+HQHQ@S-b«DXdOON WRJ(²P(gRk9OC܁qM3=kw8u!._Y.f|L*qk*w^l\Q}ʈʼn!ȃ FHST d`BK@ z6iCm6m•1z2Mx~͠qy|<}oV䬼*]H0Lг0r nL`DDpDFN:i=83,?J;8H//*cB4i4bSZSZȣܭH*9.9aʚggVgOCGoutlLGQ7o+D5ohT#&+bӈ ,ܤ W77;PM a  h?ԉ.nn"&kDWxWU<?f:w̍|dc F;\A{z9:;5C&Q ɖϬM, y*8B-3̾lD EX'%2neB7hS6*J046*U 8ht'\Oٖ~8F#|As?  p&] pG+$8=[;>6;n>n=QO5wz*[}87BxKODU/0s16#5 %r"#:׀+>rI = IOr=" QKď+T“`a}@Mh}i<)K+ڤWԉc*VSfkҤI)2?CPPxI4eS(?(p>fmsi;lZN:lCžPb8TdhޠS >P ,+yDXZ WRD YtN|L'ԛ =6 S6l^CS٣Yٕ/Ekor|0ߎ8.Fb(r3/Fv(!QR,B<œx9Va7O( ylzԢKx]E,ZD4Q0A^ d oc&CsLLx3fq[Vc7iwrg0t.,2z?e4&&QF٤+PW pӼ떟脞o3CM1!R cr&U8IK׼OVt  Q71dxVBT?%>?&pg< MN"Q qzzйcuH;UuxvĮSEو\dSE&T߆R3k÷q*BوP4F IF4x]thrf(,m*Lp!*:O*ں/ @ G0 /X(ixEbvE6u84[;D+^WeuzD7RE20 VkQ ÷(BTݺO$' C=4WI8'"Q"fX8C,\x]<ĮpA /,FT<[a<1LpE-Q#X~g4zIF<`hxupUH4!Q>h Ϗ8ƛHBUL\ !bNz^K(um_E4PxzNỎC0WP04rHݛ.]󋜕2`ϑV^CU94z׃&\QRPjP>'qsv`̾Yv/#O'[!S5>ռUeXLB#aD4lpw&E7=~}MFKxZNs,L}E|$>?;u OcJp0FJTH; Ů@HpϮF|8eSLnE1&1W1|Ҙ唏Y>rw쵐: `ൻZ$xh/^U nKG#%.دBT8֥=:= GO/@>@xv?aI YFBv|vW H.`ٲW=ݟUH'i=@eUl^GkJDj!,ebI1TY%kG#RuLK;/ʉ[tZNHŒYX_-J/V: kpw3m),DYd`-NZ"#I@#IX*0(txV,5EvWm[ND$'³Vʉp(|e%'IZNDH/%xZMZ8IAD հ|POa }0^; %^UaQZe"F.G>UceR酲Hu|,E(AO#-t ]%8KI4:ӷȞ*?G>1i|-$N[j|(tH!THz9-DB$ZYEIV*|Z$_ZhV-T|zX 5Ds$K&KZbZ'ڲsZ)th)-sVIU`bH*\%`I\*&I"6G%T .j ,M>2'-spt)(I/EBCKIU$JNV2Ȋ$۰,SN&h$i.I(H#|Qiͅ[ǀQC6H1h$F)!2ȼّWAPJ-YP_HRJVFIUTA#I,s jFET" I*TсJtEGtUh&YeIvW\U򳓀*`HZUH$:}LìקhzA%OT2YR%J>dKXcZP={d:~,9=YyF쳓<J@I}vJEJK2TEH"e*I >"#J)|$#?tP"f $dbiD6HdS$H!4Hk\UKvXCU J&VEPLUTN4yd§XuOTdd9QoTeDl H)J4Q$F(2!iߟRI{}K l^R|^t^Jf0rAz/AF/2yK$[ˠ `63p[=$-fhE ^f`5dk6^bf`.=%^"a>a»W&hC2&1|,A>/30z \KDEbI $K|&2,z%K|&K|bE$3-ᓍY܏|*i5p "r^ o*g^K %a.:6Ւ$\>t2.d3&D |xa$Xqh$MVAGyXE3Ko0 ̞lUbњ! 1;jEp0aVUAbYAR,a)zx*rzD# T-sUHL/D I2Kgn>!2U8Ϊ;ٖ} Y#ݗH$S^]*;Ca*CXR0`&@Hro3P{4 Z:WgTG%F2lU#Ǎ*ʎ%KW.^*iEѤ&G{Sz;Zo{YH2R7A0HTpIAD#T]ӳ\yxc\̶=Zq!,#iu,yH2c8d|ƒU7g {XUXedUY=UWfdU8|1IdJ(JT}ЊA^ *,MU̺4W1n2œ,Mui:K S*Eh.). v*Lq6[T(R4D6)ULHCH=tH|H)|LVʨ$h4x7(z(M3(['HjetVnVYKU󐨌b2{0Uq6s*.gK^:$3dq൓NU"V`CB /QD!- *_UQB{h$eFRvbu=uCcuORkp?΋0ޓwo4V-\$)GB8̥qhGszL-c:Q+GE"[+#4}HhApr|d1$!%FRzjݨuR2 -)1kh+U0ӕ0̶qqh)НLi8;m'KPHZh+ĭV`TIZdk\,~PHeIdCm}6!v:>* rD:-xUFh)Kih$IFFR_h#^-^b+]+-!&-MzcmFENaƗ<q2PI R@!Nd^ו;-e l^zeC}iʼaϸhgCR \4*E5+p3vL+hBPMJ31s<)l c8\ hPIOBHI~ Vo.j >tθ,Za /B,Xίp@Xf[6x\H'XY3oԾ2?GP3pjC:=\(((?pxT'&4Q^Ch$`-7&",M0JyM`¹ YH qţX~O m%(IPv@)\W 9Wq&$E|Q q =O-QFJ4R{hOYOG.y UyڈWP5k(*?*?_ŏ\NC~3C1Őŏt<1$u6*9 8P2 A%7 0i ] YPA32RTFTerBBxȖ/OX.S;حΘ;j]Mȭ jB#5ANc¡՘RSScJDaV.)5W q4RQ^^D˨Z 7|NjHzb#)5#Z' ٿ=Nlf0j7r3%TKZ`~UګȨP ɄJWຖ@Fpx\V-?r>kSE/-0?6y8=d8@xR^ :Mx vTG+!|rY˅KޛF m6j~䵛6ʫwj#:ni業 ^tzܖӴ7Ϸ͗)·˗C_֯*QFM;Mmr9/Qdx?dd8zeYsCyG_FF<.8|Yϯ~1q=/?K ?-}G}׎ן~?,yr9_y_>=3q2]"Er8ܦu]>k!MNü#[!_U`z_n~4Cl~A5D|[H;@E]rێۨra|w|"%qYnx}}\k:ͲvNk rqa[~xۨvzpeAɱX&:]YʿlǚkX ]ժWj#YFt?m.Gk#|:/*_ZY>_.Z_6Vj\Yq_?Nyӷ3x|-ۧi_/t}3n}Jviz\g;͇>aN'ezc~y|.q8~猇F_wsy<||W?fO.y;?,&vatOǯxZq 4Md~vA _\x\ןχz_Rrbn_|w8U׿]~%}ZKsa'ӷ_lpYvZP 0];ս|8]O?.e>qy_)]bۥណKV9i=|fJuRk%(?>%P~~qr?֡!3@.nS K߿9a6a5ֿw>Va^M_l5Ϳ.ѯǹxwnnY)^.Kĺ^;\e=sR1=nA] ]7UkpkۗvWZzƜ eKϯSs@Oo(=b1kW.8_ ^J5.:viOY0?:aDXZ,2sX٦jB~_Xr2OZLym=K^6_D WF?dyҳ^䧗,Weq2^Mʧi3yK}b:-R'+PݷuQgQ-2_͊w^c"R___?z2r^[G[Y~U]M4io?uCcn5}Z3<~||@Ɛtit;6qA{1G&K\=6\ֺlV[/Y ?QSp"j~ݨ_mNu۰/ύaKFMs o/QuLt\,endstream endobj 137 0 obj << /Filter /FlateDecode /Length 13259 >> stream x}Yfqmv^a; )BrlGCfUӣ!)yI,zzBDHDq_ͿM(߼3zmJyPSoynw77L2ޗRqކb`ɷ)\O7w_~7=|Aר|ZVۜ}8*WOUwo~xLv-/oM5?ݜr[Z>Mvo,>&Gk*MdqϽ@Z5w83[*TV׾U^)Urd9&+9W*o*}䣗XrڿYhܞG~q[s6q%%q!6@~_4G{igkuaol#W#hBf)!Q*?X ׈>,NA zo Qy,A<{6l}8ZM-YD:o[QVl 0.SF^F gap' 80r}:1n cv+\e뷛<{ 7nFY}@"]˙Z}Qcp9(\ǡ_ӆ4[{g@CR㰙[^kI`;P}Glrk"5 S#x-%ߓv M[߇rŬwYepװ~z(xYmN3/s1k .883nҭ`l ivZɧdTT0^nOȭ g=@y_tvf^D}`V1p\s )2MĹSea-&bAVt/[*Ũ1b:M,XMO*&%9$۱$]5ꉓ|z@}LÉ:P  `qPK'T](CР)Z&Ze5^#qY. .b &j m>TFŨLAh\vH836@eʕIhvDfY}DL00)@h[*cdQc- e;$q4D%pjkqmYP"*u=2rkq"/'qgzP- `qP+8uÊq  +Ā+9Vٺ-^x(xY]fиf^Fa֘Le o<:6K)~C^^+Րz1z@}@Ayve Y5³Ap`(L'+f@Lo-le(V4 $`ӄD= &Drڏz@bQ8mSXBug:xجn:kmĦ! =?b)Ūh8tr\@lu "3F4. Cc RΥaw.3DM.5n9( H`Hҝ͢jb~< ;v)U]/n`k9@T Sչsڊ-Vj#SH%k3c::qۆ 0&Jp:!e$h5d@FU nkR&/7! fÙ@b*>])>x=;OSұ-hn4e 4*FLQ}A 0eHZV! LOE;DM,hV֑&$P@1@l|;Ѳ\_sZN@D+V;SO"KAI`Ѝ-D5k*Z&B -.v0 (v!=N&#O#akvvSPYc0C:Sw/P3xO?Rlj-V 8kjϋoYgYg綯OiX24 ?M8F5l"6GiΧ#&8^kRHc&rBxvr9ht2z=Z@p_őNi(* pSќGX]D8RC -;.$5p:lT7$kߍS>}b ~"@UW6O15)B 2*D2F"~pH4[@ȁtSu4 ?y2Sɺ%n<M@wYXŀFQgcCͦcW_=a dG=J@Q"d+UgϟPed/IB$qj(j僮8}dP0QFv@K!(B@;͞Md,D󝡧%ں٤mB$ɄdQ+GժXM{hf! ɶS"meap2qB-H"ym& _;)p0c! K1HD~ 4D15J%]4A8)h UHr$s.vYwtD'oDJƑ]*M0&GDƄUvUXL/ѸCc=(g5s6 ⼵e7nt \D~wAMپmt Y(Ӧ54OVx [ڡDZ ek d;=Nd|?|epƵO|^GӴM~ߙo%;݉?X|lg pǮžG5Cܳ➵f{bܳ rZ[d|?-H}zBU~Ҷ֢_5 EaO3LQ^ WQF qj .8Q%N![+w·}iI GY;@O >b"M G QL{ 40x`Gun;y| ,rćp!NFm 4*Q;νrK:QVh1rwQ8.Y}Qcp9(\cg26DBA;ip2jX?P'QVlHI;)`h\A: ['fYd%b_!@]e;5,EPc\xɥSx6 ΀]&r&{ eфEQFs`PeB`f ه¹5I:Io&b_Wa4vzcuh$5SxQ=6g*`aԘL; 4.unq9`籙юD}"M%PWz!OkjM&0- |bp5N:+&rF?m@H. RJeY+?)` G6rQqb\ qpl!! I4R,?b*fxͶFVNeu1)P TFè1x TFŨ1x ggҞ+e6|YQR (sBŎQf+Ht82,:늩)]t\D[NG je|0lrCj)r5Sy1Ew NEAu$J3$ 4˱ԏ,`37o%Uf9z8d&Pho@sU+@IgӳM`s~f9.yTY1{euݵ@Aħ+Ct3#Rl Rm.~#8'Wa>zb_4/%+]0C.*|:FlyxFY:t#"/f?,0U4M0#wi7w~ À.ˊxC wLʧ; U3/S]onH `DvaH!3Ę;xEw#2 d "]g0!)bv*UiWW0[(tBg">L䂕n>Oc̹$kt23^qj\dP S@t%˰luA bNx&)a3 {YHѡjE&{@ A0o_QercG}WBZݤ1(dih0/2@|H DXYE:ˌ?a֡f! dQ\ FTT!kV2B䕋Zt(:w c㲉(7**['5 )={要!M_(Sp+QfNVC~Ő.%-S(etyH}$ "7]' 1,K5eVWj%RMaL4tYtd*%p'JD7! ma!]D!fYG@n%a&Bs7@xaެк!ELHAo!~zpcx>㸓 Dr"bHʄ|$B㶙Sw_9}{tՁYGlY8n6"4a1C͆T I*oMPJ6>w rO +lm`i7ѣ~ʬA5<: 1F鋆4(!-l@8Nukę Н/Z8E^ ܅gH*9{ِsqX`9naf}ZQfxqm3^|AQYTZ)Wl3^#G\y2]}Y t(s^x}W3QfCϸGM)2p{keUEapG*m 3Ӛu 3wRBF\D*ƬO[9s31f#]3 2Pܑ}=]#T~Y\A:!ӆجcf[wCN{Ea[8RY>Tf&s1j .84F7ABaAug):Ga?_5dM >D.oEjW*3ٙIx6 Of,3WH@< sf,/i#EaՇ3 9 YY}e1v ql9ͩi{Ns@ܣ3rbf3Fb4llZ9fTy!GR}Ԫ愈i]I(WM?pLTrTIuge4'l/bf4;ФFOc;^,3gu3 &Gә%#T|HֆEhܬ#9#g4c%N3 )&29Td8~.)-z}4/4R/a4K=iVFsF͌LhpT̈֕{5WF3$?2x ͘s^LhagH!07u.=סuff=ȸ fފѩ(#Ye3랾,fB3瑆f,DLh#\`)ܨ}θP={ QRO4@Bs;zQ K`d@z€>8og;æQ>=߃wsy~ 5Jhy(MaМ4|Zf@Ͽe\PA+yvƑ)x;(9 *Q9 wlQn>.̈́Bf&Ђ- /`=SF3 [QYQVr=jǣ#mf5WҩTj.2}GVq Q*{t屈˥ʮO@kiͱ qNtQi͜tx:Қ#Ӛ;UGIΑF|2󙈖Қq݈ vY_0TZs"/qd ۯ(E85w D?ݐNOߜpDͷGe5UHf%Q8>UK2?gVsr$ά朄H&exM\=:dl_\sDK8Tސ}4,͜%KQȩV`4Lʣ#*3薃K#+N+ʮ̋'\d4Ѭ)o#Qo!&{L%XBNOh.:^R*R*7"h#ZHh>25*25~9͚o 'L>|#'L> 3 Hf*QDg00J8y`'~ˮYl-7 Y!e5#5fB!r=[u"+:WlVk"[-ObjMd%i=>k gϴ- >k0g8OO[(rݛWW˥ώI $Ox܆V, )٤ttj=ʢϼ0N2 98W=YzکiCoL93C4̄$sPlQepgͤpxLyrPs=-i!Q*VE~Ef0K|BdNMу,f(<<';M)N^njq8f#23y{q 3( 7m9W^fƳ5$p;ӈG,~G+{ok 1t ơ|g2oG~2SeVQ$Tʷ&y/3ϙ ;)|,p*Jqv=tŝ_$ Fa;uk?)Ύd8  :pr|Kw1|65Uw*#KWcՀ7 >HkB[IuGd>c_͕f2wiC|Q,_ ^Ydrb ~y&C; ,u JlfYYV6siިG[/TWQ}6p\]2, p4׏u g+NǕU;6^f^sosm(F3bp1j .8<OrP KE~?he5O >,!I죌QYù[=m[EF,MOEcc=kxPcReufGpɃFW*?,.F 8o{Z3#ydM92#_^5o|s)|gQ@l}̜co4`Oh^AмLhf^+Q)͌ eNsPYo"9dECNs Q9͉a;#61¼焀C E5=Pm 1whz1ԬE,=*,ޠ,BHif4LCܕ`AJ3#ZpY @bv=}=43ڊg8gy{9-Zb1z*[kgLgQf4[Fnz'#1D3űh(xYJX>kN x>aH-^(-Ñ!N [I5{:.l<S=n&O:)tWY3Ed7%A }݃p ،'/̂iMkN#9rga!v0lNܼqqRDĨ8iIiVzb*5 BNM~aWZg9Ggudc=S4kNseYѭڀN]gc@k쐑Ξ1X(J cȼc TY /C;]^+ AdV d0xy9RB2#=dƝSa^.#[qFOF8gYɌAi 3{'.cc3x'S=̬Ta"T޳.H8?GPrPFΑvW)c7#Ozh5w~(H丑ۤXXJ͌lU=[BdL&s"UDUGOHi\ ݳS R`ĤWMI&Ǘ%FH"$ cRR? QCzBg4}D)9^ SvF „JaeG0C~A*wUP36=Qze) 1#XB%'ASS fibDg< !DڟVcHl.[Eܒ68ֲ7?V lqMAg% &')Q0Ek~w$ryOf0߽VzҤlޑUW7%"sV>&XWN.ƨ6i0"lȊcgrb3#͈u52צּ=s_/*k&܋*\e9awo޷ճM׫|xTaNZǿ$l5|:ݜԌ؈oN8x'!bV}2}`-?QO|k;PFeӍn :n.L.t_3gV{>U&O\N`~6F [| y)w+_(\S}2fL%+v6&vNʹ=$B.%e;m/DpH=n'ڛmo}z>PS]3i*ЉW a ӄZ.(%igۗj"쑢b?xƖ7}o?]r\R*oʿ5ozH߿ڈ-uZe۩0+[51>>Ǒev, :Rm'묟7~|[vƆ:ԆA_8P8/_ffZɋ}U0֓,3&tׁuiZw)l?ځz6=L nLzQLFf65|p%󻷛Z7\ K tӔONʶE5T硆o[:O@{'0kH aWݚS߮YAM9jdsNZ}uE`a[6siD3[?C9D 5/}\_q4}#Ԭ˘l ~36| V>w陖wi`@Z2nK{?IfKn`gN{)l|sH5~Iiya?Vxxp$L"(;ח6ۮ<.;"fn[]\'[rHBo^\^MW;)pL²æGS8x"R4[ ̤7Wrvsߎt4r2i9Ф@Z4i#JQ|Lۄ~x Ny.]ηZVvx55AʳI0ߩ/q5>Yƴ/co\YJ4&qgqO@F3e>;_kFe?SqYt17qS6Rr ]|\6t5 &J~EI>F>RMa;ny7%|x~޾ {Vێ RL\5 D#o.VUlrh}4r}owi۶ܕ=waG}Fޅ۫*e[wۚx7*. \ Ulzr %×x:GիyOf3W/H% {N=c<{{DJg⍑kőWw_ldܧMp5`17= fbKoʾ|1r?ym<ϔ|fm<Ǽ̶.gSr>GYU <jt/)p5A.| h=sp?y8ﰴSϷyÿc$Rgcpz__/2z- ;~}30/d:VW_?ߗ/&_;~5:_&?0O_S ,ij/׵f޽Po-IyD۝5Bs *endstream endobj 138 0 obj << /Filter /FlateDecode /Length 5810 >> stream x]]嶑}_qۋV$"l `}p==әE#۷(HUUc0d*TIw_<\֝]|ua0w;1]NvC'Oo.]4^9^<iG~uab Nۯ/"~vd;?4.X|M~s}OCF^n';=-nt5֗V[ZQKa5{MSiE-j}͡-mPZQKaٹle4OLF-dVزL CiZ6V4VrQj،ԏQjXMW%Z1UMcYA4;.weE7tzwqR3g[?ϖ殟d7^#8衠/ySrKaJ*naE- K7[*naE-U*ŠZճ&B #GT/<^Y3uڮ@X9^N>efsҒ + M΁9=AMsɹy;Mpŧ.>8đ=aLg;{v: !@] $B7RAe)lأUYxBPY8$&Qf+j,?T/!jQc"9Ɣe!R"?i2YsӞ52#͚N#x44 dF܄yb/ rŢʔ6<)Np`Po0űhGs&%j6. ~c@3 ʌfnCRmۓRu('FrE=$5ڴh)@k>b2  Zpfm^8T)j0$4L(4|~#W*BF0 0# !,4&$4Qh%aSU}JR@Yh8n%)kh DQӚMhPOJv1E"yTg2IS+>7~e TE9q#p64$%CEQ @ ፒhGDF]W2F?s^|}jHTǘPB@%9lP";aa0y'9Vp1 CG#mPO mY58P34 eI@[J">땂R q~ a~=i3+°փ5m WNrƜԀÌ~(_\~HS=#iGwQ,HF$<HPU!HI$yz0v{ƚʼnǙDCrTCt\p("@@MQ4WOJJڠ0#o_E-K )}5INE \΃$0,0tZi/OKJ#y;Cr q=, l,h tGdGrNxD]3(;ljPiӃ8&QW7) asҨ1H aY:y Qf:`Fޭ! Z5#IH$jr1)Cީ0P))R:1U P$|Do֯8lW $03qIrؘh rSL\LOk矘)o_?U'1єHd&s>DVO<լ#*[Fgb  fG{5mƃ}ZQG{-Y&-K#ZJִ< YD Z ٯ'&'D{"1Qrb!`ւCMKψ%Z'i)%fYZΦͱA;T^<;>ƙ񉄂CAHA޾)>P;Eȿc8%"k_]K}n=0)/#zTxh^AWG" c! o2E/?yF+YA +E􅁄0U$jc)q@xhA8c"j5'g>/zLH&lb9|_~Tvn.a8S>EڡP*;N~=^ns/&͓ɿBɲ̅=._l 3Tc;k#= mch<0Ocp>򡇯P#TL`=fϔ#{j<ӃI^p}ˋ0}7=hF?uF|VRܑG{׶[vpS)Բ /[jXPd.LMn)&3i–^VecFbLVecUjػ~Vӏf lC)}Ggb38ZΏ]ϷkϮ7~C\qJό v,ݼ62y\?7s+7xX{x v@ VѻyLGn Êt0)<*HDq9%wco`=U&vfWf S'ib^&.seMu U4]^ťcd|~\7VhCc ]3 ]41hX>Q]E/J|Btz\b_zC\iE ||k(o0PA`9[[74y\@jsÊ KgQ-A,'|q6/?'VšH3,tAK[Xo r1H$xtXJgoqrMvMQBk(6-="nVRP:ӶО|y jPXKQ/3HY؛LK*#kd`.ځ^eX,껵ΌMSٷKMΧ:2Amª~S܉aY&/&lTVXy P@xnm>OtUpcԁuw~&'u#-8eS oO_ љOlq>6+cc5]=6̔wxY}lS}_ˏЊDܴf4WoFM6+ƾqU2_5q5T^5}9]bsիFyoM۲~W[(c+Uuk>^߲E~k1՛eW>vWv^U;?j~M4Lܪ( pzV^j#Z>hyP -_ٮnZyea+떥\O3vu]̃^]~Fjc1n,њgV['\?ܨE~zu=7pM 5ks7snR8x?]`!>yۘԘP+[RՆ}x] `JimanUlt4(!>}жt{ fj\o2|v?E$ܕkdf.z>SSM7"%_;qxQL, Eendstream endobj 139 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2315 >> stream xU{PSW@UNoznڢT kVZZ|Z !%*?wD_]FT)J05urh\AɌUkY5n/B{P :[[5c!ZBT:pґ;N0. T|y9S= M9_qb G x>}A ^*"68d!TvH2.\i]XdI5 7F/U.xz{2iIEKs/Գ& @8N's)5l]CS{ͭ:> ?4z5eScaU`O3;~ԬŸɯu |X_Uşp(ƞ'S)R\fprxGθ>zQ{k=Wbcti@]yGO_;ulQGS|]qb%6}$__ǿO.׊VQh |Om̀BYUE@=фnUg`(hB/M$J_x255|6?ceOc_,|Z_ \u-HHz ]5; ]ԣZ3}8ҋ^I3A Fӄ7>Xac ՅnzgI6V_7|55# m=7/@ Ӳ~? _-:bk>ijMFtICjrHEj%ؗi՛<@mH!tMSZIq_lFBrgC4 χt0Wp?,Dv&`B%"/+3/q:m?YWoe?9 ^tމ4\,t\oYQ ? Tj}ͯ_9 :J3@ |dueN6zFsԗJjM^A.@jO*?D40XZ=~WyaJ Vx/=ʋLE[P<-6Oy/>p9GmC[1Gc!c+kXQÇk1A)h>*TU!q8C E(@jE@S.ad?+堜ǖr*'l۾Ir dXvIiOw> stream x-mlu; ^Ô=ı;F,ɭ;+k]{=d[4 ~-([Ye+k7([瀀$!&F}aFg# Qdw:kjjm#=[U@WQJZmJ^|Oc~vGB"lvW15۶0Ս~NlŴ nfK^I nߺUe+ 番-K^pbdļ9fi]9M?8 @{$փA6Z9dDILe5h6:*ӪAkО|Bπ4Hs.Է0g}'dn#cQHDdzS:: "w#:$6? .2Wȳ36x4d3 g/p]ɀ\o|zii| )Tc}yoi kIG/õտUX‘A,849\_QSS,AA@c嶃;=&W-Jߠ2k.˭p/7 Q w퟽^+E\TH|[­K_KK nNJҙB)Yb(!~;$[?MQ־p\~^:/[l ħt6=.:*?5įLr\]SzZcTjl."'q1endstream endobj 141 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2171 >> stream x{PWƻin#Q;NJE gFP$ >3Ra!3ÀFTP(&jX5.+64{ṃsouuWݪ;whՅi;wWL˞.HЧC!nS~OIkz;z8chTə8jFwⅳUs}|V$iR:UIRDF}tƘ4hL^2gNzz:O.J7Ʃ6h 4Mj^gT4W:_I&&UѤ(_j0b4|4wzHPO6SՔKSש8wxʕR{.]2"\tsp`E6{E!g9v[9^ϞJƒB_{NJ$ ^;]9pDWa83cڶB BloޚcxىGhXLV'lDq! W'ΗXkb&}Tv8VC6 n/;uvƮXekur/!iqlIwv[L,(ڶy]Cnݾ5%rnNNLuqWw$F.<։:rZCCqtί]ȳ nf` S1@b'ʽFi׆B8'3Hng=yG7EV(-)-.+3P)O. ׉`=̅ބU-bޤ Vމv_ VE%IN\d_[NuhbK1wIGƳ]!1N.;f ~acT_@q,`ٲ;]j8~5R4G/eq&miӞKM l ם"7E loEС=ǎJhWrZ'^>rpe[z*bOhOPqo?%LȖTud  .i[!!kw8OPu@`>܏w 9ejlw^Yuj p`>F8ċC$g_pH=dcb<|BxΙ)q{ #~xd7dDƕ_6Z`ym^! Edr9TF/fHE<Aݱ-lɾYTΗ`PZ J>% ~vҥ$7 RFZ?tHv,FaJIZk++]Jx dO bTd.)"&rHMӝ[/!WGwl?J]"}`^ fV< | =gfy xIn :kҹ_@?|p+Pm ` , .q葳:]Jk v BisMK+5ul RʏDny0:!91#Re BIJ ljT:^u > stream xcd`ab`dd v 5400qt~H3a#UA6+rI._7s7˲~Bg``bdSu-(-I-ROI-SMCd`````(`we?$ ^#P4%4+!?&;CwO^on9m]m|e 83c)n\{帘[y8aIendstream endobj 143 0 obj << /Filter /FlateDecode /Length 58714 >> stream xO+R=? abS$ I ZK#P_ЭmoZYeg=kբ/DdFDfij?;^_mw>v/~{?ORp\?~8>n?~9ٿo˟۟ߟ?~=6=#<_~__N"};/r؟_#G?wԻu95np\5z뼻ΝVt=N㠎8-YQ z[ЗGx޺jJzf7..R%?JLҽ>.uڷKt~vx-tX{6҂W$7* ^*+_WWUzy6oߏ^o[x'7zty9|`yq>o<<9?tzFXxvt;`~hpt!py=Ѩ-ƉGã:^wC|R\.V ,l74zB&K;3q&2. .MF>gԒoǮ4芽E+6k㎁WOh3-jݦ,vir(_(4-BmZ[s~<ݟ?*Jo5 xmPra4oBcHҥD#]Ja8Cu1qv }iu8x_<0|qx?Rw՞,6t^w_ֵ tqaO9Jn/F|{9.o|{!6|߳t^ݍ{Mf;zh;FzcKY'O?cǰn?9Wǜa}1 Q@n;6R?ѤsNF˃w`QaQ(4:(+nrZ}`tN=k-5$x,A,h5erᵭ0ak)sZ|+5ey+dUkTt\]Nuj567h;1\ɨׯg[W7/ 6R=/͔waI VG騣1%51jitX2݋Fظ.j^Gǣդht?enx;sC͝&TWo6@uԨqRӴnj5ԭqi!{,=,[Kѫyѫg3si^vׇt26x&Uټ2~_z~B|Ok~j6 j 6 en[Ax4xAm䇧=s9I1kUww=:[yCJj,<2H^WUS8ljMFj8hww| yh nRWZcz׃~\ u=NUWUۣjgM[iT局(@#<6 P>Dχj}<+(uo<y6`ǝϯ[w~| ~4RpVsф9b{;~ϫKwyM|kjq8VktX5yy 7ȭzr0l nvh6M FjxaDstXZNqqY|_x77Ơ>F#1Uu鷞pEsWqcTun:8?T^wnW;ڹz`uTw@)h , - ^փghaEap<4&^S<0h }\vԏ;ʻ)cjq#U{O6{UR-^A1(8.?괪9ڍ '7nd _ǣ簻1wu7Ѩ5qhqqٓKiu:Ľ:aS|*o/ "n}Lu>.No~nuuyMTr57ڴv'ZLr`:>jxp}}Ŵ 0Q[=FQ؟_gR4RGb DaOaFN瞄?zs@j< 5nܸZö:lA]rn^xXmMNQNiAW?R=p:T>" .PV|XA|{4!x\D{zPkoݤI1zyMl/MWr=90 |/  ݳ.a'6xjQDEXڰ@{>uo=i xm W yM@Cd+1@cQBs47cz45804X@6 8]2>:hhu=ACk z4R/&IcPjr4ROѺCP4ơ66F0zXJqY4.;lm > ?]}w<FXxM6'&No(kO5<4Mj9(i(y!4fs4f03L5ZW]uF 5)R.H=Z DS$mw~|wX$ϕ\,1Wk|5[&m̖x; To݌+TnO<450AFhAF x5O`浡04f!ID8z7HPCA-ZPPs=?׾,D>." "cȇF"_Q8zP(\xm?a[(;.amq^`GeaP;\}Eínq}LpHet/431py*-oTћ_g'MzV֟yY`6q?a8bd7b5>8 =\j` yy³v|O2;G6ba\f0 ܀ e@ py`$ֹqW?Hc.N=k֢d!F'V`87L-o%Ʒ|4t3ppămIp}Ye cN9Ebڠh1)s6GE!r&B!DmPF h#gh恉IKcҢÒ!.: Kk 堌]X'm\VZV_-õZ^CZM@|zMW)P'^@xqBveqesDYp蔍7eqy_Ku/ RCD#ᑌL\]xD#1>3zLE8!y q5~ YN$*Ջm]0Jջ`b<^W̋+7X۟n7z{k#U~tP{8fc_Ǟ+4`Fr!Br0OOcV7"3htAp i,&lbu<odJ:'~#eP!1VA٨ XF`N@/ȕjd?@h0Gt൱`Cx5ꁣ%ap9\G50HPG--<>Ea3cM3j(˩ 4+WhY st`\=Mqnh+9WУ8 =S1oh$U/PVYX|M2s:&#Ϳضm5ZX۶a)Bh1UD6bK_),Ju{>!E#FU#g$BA9͢ IC6MFtTO)WAT*4J5TLE+n\%3Z3|("Xqs+x$4h HN.l3BT\"jdH3ʂ-)\p*W̢x'4H# d^<-*wHF5"h"dX$|Z醩 d2 sFD{Fba"n>v'=vcl0C[\` `01,Z ++Q&ڈUqXVf"V Yq YUܝVu㪾xhj1ep7*WM@ѳѿVm>'<\\‚J/\[WWֈ00! QyB#h6ƹ*ޔ)!F%` 8F3phUC!S: p^6p0p=Ep60Z?*'0 zq5VA#$NqLg&Q2H." a0Rc5 DHlR@hɃkqS>kTkd܀C'K=X\<V/2Þo a~08zVNJzبQ0S!htYվ*+ 3-njɷ0qjw. ׸Sr 7X#!SC1l57Ox!//l{x^ޠ'<;ZpZpFQ$^mlL{1G`+ZsqO9(2? U]^o>U6NPulD t7Ɉ4j 4 H@!1$)#o$QAY/b5O9~~U*WPT 4>X=̟a@ģrg2Uw2M!s$CK" :F7,1)a*JMMl4` l 6#1kA B4 N5hI ^ O!'}47W'~!5';>&,"ljы'Wv$'g`9F]itLxQhxixɞ/fNǠz?q:u^e=/hL#nOoM, Q.„[x Ox=?:..LCϏ'Ɖw _u OIPc}Q-0$&]&CE2 )գX.X>#gaYa 4⑍!O C.㬾n} ܶ>ZQ}(N{Qb d`ucaG kd#%Y]NI;~1gEKEK U`c85050~ڕTj zBUi^UKg\UKgZ(lhqqCUzohA+9 & MOc8F4&ш2FX)EoH|z~uؤrUIc: .glpD|+!\830\pzGt:\Vx++t´+ha.xwyڕ Wdw*NoYYf!EY~ _9rc wy`z qĺrhB]\3x37窙oFWyY9M24UE34pK`1#1ֲ~8?W6օ4,ZPCii#Ei y.Oz\#[5wj7:ty @\~ɲ]>:& B+t0;1ĸrBf\( jv.p*}Ƙ7qZ<|}wgu_~cO1FԉS1 1uSSTA(Rveƅ0["(*bQ#>;>'^ĥ-FpɇYc܆#lb A\^W4qYѦm9a_\Ss8o%8Ɨ,)`mǐ,1C2YMw9YTъ 49ׄ6Vu/9W:]H0E#3I; S\Y0ɓ&./v΅6; ṬPs`dZ6[Mj&-*Fb& 3qy1I2F,o%7dAb晈ȯߓ3!OI< i<%/4 ڀ2q9X6j%}lle3h.܀&.=7[8g"bY^~6|q}hl')g\L]ez tcOoPF⼊ y׊˥`jIA` Jٻ_xm% F{X"u'Ux y8WNGϥ; mJw\7=W!嘂PF ճ q!锹Fwˋt_xtx+a<1o)YG)ipG!s3 >pς$$J9xvԅo4H&##.Qjf9:cpXY4 zՒ1_|=S){p;%ܱ:qbf7.LW3xDiG0srӳ]-&O /zcM^d'p(@ɍ el?<ͯ#=THOcmq4 v\BX+yl8#ǚb{}C4㪍y_C>nCzrfz׹3K+ܫl zJĠ/#Ǚ@@qy.OyB2r [.,*،ea~ec&$%ҥr ];Iy n%!&i6z;eݵ}_y)j)_8">/zCK1W6'aol/n/XyuC;̳f3kҳMlؘЌC5EkƷ%?o8 7=M1dIok" CK ij]a^7Vev@$㲒 h$qFMP|k TA=! -6   `0<hj )xX~RJ*ePy I":KzD4x*')5DZ![U*UQVD~RDeLJeQdnEF@ew w,o"5q_sUk"&,n^ۚ$050ZN+\T"gp!ϥg\~(g%R&D3im$_H jw z^I| V& IQR4'&5BXG2#HfgWq[}@K'FQ}%2"Yućb)BXuTI`L$USz<|wa&cMXL6K yYLx6R35yǃHP%zf+b"]%+4.0 4jPdQy+"tX\ RH/X7UnӰDB#Ij+re󽤐{571#Q\Vǔupx!ᚃ88x}^/qJ2>`+IJt F.a5b}, Fr0h҅OM?&}$+K鑑Mz.4!  ӕdàf9[)5 GJ- 7J _)#)4\V Xp&F w^-)z {X좬U $Hz]p*G#EZi V\twŅK`Dq\q-,eK`@>_/wp{ )j#Kƒ@ϑX84JIBTR\"9lk#Hρ(jH5J5[ZJPV q` +4R@Rȋ'm'xveV蹂zf5AKCÑ@na {#rPTkr8$.0KOh2 #+4H@#[$e3vSIz};8Ɏ|K3S4ZKMpIAV*TNo$Oclַj)y73a4Z;4\r8DHţ8EcFz䍐)69! k6BFyM\^c,3j\ Gw2sq:Z 웇EGM/iRm1VnGZOg[;c(XOG3cXŴr9 5l((p3\3VB,+o!Y|5FFfit1XS&L$Tw2dsW]H`Yx`AOJ{=w&.@SI|wtĔ!vH8z)0F լMvNaRB2J%i'%y/UСjt<'Ώ~< \q.^{"yAdB<H|J& X?(p/[uɷn[ 7ٓTJ@*g#8屉XխL,l,$l)U.nJa@T@TOTy' _l3'4~Ņ =(#ca<;'0jF߰WSX=;: H4Ѩ wy^4ҸE#X4jm4PZi\ԅg*\PM.L{RqyM)eTɥC5NC5KOS6SnƘДӔrȥFqOy޽DҬ/C#;LOnoY+keӜK ׇ__E^K!hΡFi\>bz>%wϧg<0_ͧ슷ry/MMVPK?A9F BOTsg:Jp63':^͜9Q9kM9? "^ Lt=i*aBlf7{@"_xfڛ`ÿC3iw4E/tzc`zWAVǘyy\{O9[|ퟝ[xmx6j6,2$:kv7j?D&AaPmA Z-ۯYV93QEŲ.{҉ђ7/%Rb py0u۝eJcoϯW\O:?B>/cyϿ[Cmԏqx>ܞkfxϟ<^<.gH3*וU??9?O_w[z]Oߕxr>g/:xds_ߏ8Wwr^)>Xxx]}]-к^"5Hki1ox0޶R1&^g.ׇ;n>*}Kds2Hu"P}ẕÔyrz~ o ،eY8N^|OpᱵBRM;~y6ѱmu4gԝNMxxM.34粂9qO/TT9]1ixX8yٮ{{@ {^ xMZ<݂Xn<#ƣ~\ZԘ墸Kc@8 C譇֊Ջٻ)ROR܇\#/zjmު6/ԯdv6anVnygԷ`p7Xykj@N+_*lԗrnV;ޚsN"PyL^nj2WWꭃt[O Kg@9ê'[׳a@`W׳hOzۡxHN@oi.dWuz]} 4RϣZA=^z^9Qð[éPjjQ#cYzWFQogU/:zg:6;uv=Q{j,f>O(Yx~˓!.L@eq( 3kT .U#6z@qP.FΏǝ:NW_ ' X4xG#u>ɱ&G{d>z>WǗcSñL:j&&&xZ?MN׍xDyéUZU{ޅzFAwk"Q.G7s0j8qtqyjoSoo4^>^Hi0Z!kYq4%sص9h?чiIc1P-GBfPG#Ko ͉yca=G={_^Zr{=Wٚ9JM˩zSM]MMYѨo\h72^wh.O=w~{pf=86۸`Zg㠱Z_c֭YcƩRWSRmsʫr ^ȁ=4}Iiu2xΝ,=~t_ze&-˛~GTju9ڨ1 WcJGa諻?9՛}zڝ^جfmh&d{iH_znSFjy txtX5Zh^CmH] p\`q9־2u.߿AP/[H FМ^lg}q!9c|j<}u=]qnj}Ne_pݟ >3H343&AI͌׆_xm|͍|O )}: tc֘(Ǭ6yL<&xdPc^`ay!5D(5U&^S%MSe=UD<@JY/YˏfEO q{[jTs&^o-!5zkI )7TYnRgRVͤI &nFZi>g 8 >@\#LY3i3;C(>oFxxmtNNNVM!*N³&=x(0 l/<C!c*OyMO|XBx<|Ё~m^,O1ݩN_553l å5=pyM,rM<03IH'Q_Sv8 z| 艴kYhDõNib =1_!?\Fk8mȶy <,4'Kţ=+0 oژqTl\~84qyMh40S@ΣהF%5yy+8+j`< rm6㢚y͸1WQ#{OSuOi;}w3} h}k0p/` &^o[pWI4&o<eQ z5yBOW pYA94H\7Z\Uî\0=Fͷz v0F& !ײy8Nla1 ,XiGlQ Xh$>eQOYS4z3fTT5C+(^.5Г>4͢367 =Of]}(W@hn)c爆hX>Ѱhg,B`6׳Nsolo6b8^t Fb!%졑P18jWmCWB o!i>9t1LE4 yЍ$210i;? |/|k7f1"qaT$./"g(4'1ShD0~pZxxKD6E40f.a&/TneaH 7 tDzt"]\%/11xLjXh$NPxz\뷿06o!y|QpPQU#2ooȥj A< xa_P E>#a~ڍȨ9L6 @o@'"&+4(-[4֯Pi( "o, 1x }5!#.`%h A&oC": 9v.>Fe;407c8iJiiʹ깛o1 0Y\9-JK;C.S+_3Z|"_= Ŵ+7чˊvnU bQ l2A7`svm|of>rħ?r\2oۼG1`%*ayQ='EaG'B_o)WM/W| ㍢Ҩ̳b1ͪf IJj3kPOlm4`QlD.fn U&)zS< d_gzs:^K.6«yD#3{H= <:%2[[pZn9Up+iG&4IqNqz7R H3gX4ʁW^T+>G+;ڄ2o_.n%00`iVC Z O|dVC 8E `E0c9.ܰS\BƥP!Ryp"Q[3ªU3(ê|MacȅF5D.Zְ*dXU8Ĩ 6Ps>g I2pufaTC 3D !в.` ϯ 51zVB[!8!^!}D\M8 "*w5-e;] =! bs&G)@':g.z9UqWr;N3H*Hk$2ʷ+GgUKgՃM.ZvUz/Es5AcAã6qe«\&LS耏Gi*@?1 J@Ta*䠑[e쩦i9я '"0.\|>fˮƣpC˚0zN0@rEzTM=*x{DG`Ơzaeo_ - Ru/IF$h#@I:=p% ;"Fz#HLD220tM- f$rTi`ં:.+Hв)H` 3I}cGD"ǐ@#q^q/9쿞 )8^8h?{oeh6&\ ƛj}v ƞz=0z)o!(I?t/eY~6R=$vXjt&TᡈNEzS=t))*أq PUWb.+< Kh=3(@z@h6"CW_蠩X@,A#჌ o53ƒ%#1%GbL`]D4  hYÀ]jaP.aPC0! :>wg@ks8E @XGg?p~~tG4F@R}$-:@ռ![y!E ,HF"E5hSz:5:)D?~<À@#^Ѣ\e/A=JG%rԣ9krԣ9ꙋc0F.]Sdic7Q;;ir7A!ZpDTự :{F!&BĚjلklE 38E&Oy'Q*"7V(rRy3(DZT\)G*gol_Au}|3B. }6(/ep.xt4qt`y(o%"Uf,$pUSС8: gU 5~Ē*? Ͽr8tQڈ9Pa'q:g44gқykP`:pU7WD*o!:EsS Ȣs3H*kJkoJ[R5_1a6UҎ24ШA m#0Zla` `zI& G5 +|#ZU3*&Ha Lh$0a|jf: ߾%>੨|S9mTBP6qDAFQ5#s8TBg=K?,x=NF *F,lQ0:hUN+(K$pY Nh$SN졒7hYGMڝ9t8S=e3ïU2JDxo =}=KOOئ^Ç,66űыc+o_OOR{lyY=F3ilB"\R&WϠ14N%%!gxd`pf A4&&{ȹ6sm"E F x6jQGxNΪ( s nXB'*\yRwwna&BJjqPDX})X%Fգ{XC=>:ʹTTJp@Z|F&f*(PešJAT J`p`q=%nk۩~ SIֶ~яhqEYam,i}GMOSr%:(KlD tF̩flƎ'j`bPQE KTS1jӉ"0w;bFx1<&L~PFi#BOPP%j0|*nadwp×}G'U= =RUDe2ZvEQep2[x|#nQvU9VA|xT\̩US@*ar ]р5.OFSب hy u.n:'r$. f蔧#:SɄˏ>UE#(pYѨhC0tD#{L#vD#8N#4j r1M \V)SD)C3h$Dc~9߃9_tG  - v7k&^_q4VШal&X3Rp?|0ɞbM^&ݳ=G8وJ9~WJhG%4+aTCd*L0{SxMGCJhhՃ{`EFS ɀ|/=χ7!^o ^snbW'f%/b|Fc4 J\Řy6b+z~15(qbiv@4u>B]:aNܳWt(M{$ڣWw[plσ i>-ю5ߌk]XM8S1az(:jSS&q rAtrr61S#DAvU5$? PjjR`U>Y,5'C5@loz=zNnGER g㳴Mna=0 Okִk(Rg`Pz?H%pU2eʠdB}Ʉ XVd$6ۏ?YMY@b+`>xpx0#טGO|1O) h# z7l!C켨AG{z`(Fvzo;EI^ =zOvwhS j4 Դvϥo9|xmz%geo)i@rO0`^4ICW^n5+9`!<$ts%MF0q0&RZ2tA#gtAO>"&=U=>ce ]60JRIÔctsr%+9YTsze w$ͲKz&,%M$]L6 UHU5}WҢo./}FhAZScv:= x$$J$ z.F : "ɒ))oiS 8t#M~Fu|)+)Jf2^MӠJZIԃOrs -$rYH܀G3rZ4X{\U:$]ҋ5 ./2oRA%Ka&^kyd 6K,j/Y/ŎZ&Gⱦc}i_o(BϥԐʷO\ A#Išwv$rVPQLVO񽰂 $F/h m(ϵ⽬( "iJቍE=G_MꊩZ9'rg=pGSp*V몼bX+]qWWdd-5M&I\u-FMKE[\eAK\MV(CV)KPU/ujFN zkT"+&؁>cOz="m7Mi<. 1Kc`~]^KϢjj<-5h"4VJ,J=W%5qؚH bk" R¬Acؕ`dd[KnMaQUbZTUdQEU}bMmj6/pii*:V37QR],޶jh"+,PYN-/W[(%ʗxڝ~c쟞%{iAt\꼦 ~"xv-F}y}y~TI呑HZ\+5\^laJ3Wz->u뵸zn רܒhy8jdY9f2˂/K/L*p@ >tA]|(R|-ʩ[!HJdxtه%k&AX-H4``V^v=6Lׄ} _p.Uׄp '^oʭI"1*EbTcVxFH `aX8DCz<ۮEJmt=m3@8 H"#$KR)H F֤{$,q%$%! 8 iXp/U 2NKBjfH6RIH,V8FNe$ @JxCܶo;hɽĻ iW~n}]@`ak9^xE7: 7i2Ϝۏ:dKE;I%ir˶YSpFq6ktq.2V}燾8iŦivtGh$JOs(%1 iI hGWK$`61wל4fzLUf;1,GiXzN'e5:gMZJf{If"/%i֤V)]nk뢴h}q)֭hmG$`,`'NoWu5p/l/I[Š':.IR8VJK H.)*o]AkPWC#*ܷVq87R+Xe;IɁWn7>ƥH G /4!w s, +IrVRftVfs"!EaH+]#yF˷k]YuIVD^AItV5[5BՕ[]:+CB.]%,Bn!)Y[C`J[D|11qj~'_O_rYߔi!*8uF*`,7%+9Q_bdg"}WEG:Wv*!}|osoHoSMN9r,z[HhH树 uSM*&=fIFKW2hJ&]$c<%JeCrv@qX=ćoC 򧯍w?/@ɪa %#p+&^oKS``!$#HB~=hlҷbӷ(#H9%(ʙHAEne%-croD\+K <ᗯ$6`5}6}R"L]JGܥD2"H9AQp(zGxưݏe@LNl1g^cI462$ܯk 8DxfO3f#$C I_5< 9+- <;2pQ ˃pJʦs4ĠM# )'Pe5{p/<I?a".:3/+h0d@Fn'60@F3򝄅NBG1ʼnrCFCqE:%Շt0ޮ;089/`/B54'^o/y44jqḼ7iH/U39ő/4)FhF2ho| ;1 _JxNgl?,7ϼQGh\9P\^#4BF_gf^lc2MkvqOޏ'- Sɰ~hYP:0/:Os tQh. .]t] wtrc]^GҐҨ~?xv?ب6jׁu #8[/{=ݦEv= 6HQQæUum4R- `(,ZS'zW7\}W\]ɺdnډT7 ;wgjmq ݅8ZMmm;mJ覞%m &IQ͙^7g:6Q[n8Bvz]ٗ&FO  ٧Agp޳v^.=eȓ`UlWM|?~x~#р9}$TH|>z 1z졙PN\FB9 ?!ɣɐw&lph:,uq?w#e[k XsGF}b:Y4(U5}?m˗3^Y7'HFi9y֨hd֝ l:7m9}5+Aͯɫq1unZwօovgP/w9_x0XQkݟzt _JFg{xb|.N^͒xkNmxڞ>d9${LgL OU8z""T7́Ikѳ}pѬIkCkD]?IQYa_Gkx<844:.LӍx!7)$ ]/f^^z^5wO@\Uӎ.^xшvoqEIy|Xsfl n3n#wi4a@m`v`v65Л5iounØ=GØ=/ iD/u~AVmϺmvǧcޞ67@xkMF[{^ٖv{ @nD+h@k"it$hhvZ"8֠FdDFf󮏪z\^7RBC !XL)L)xH XAhpxq!ctu-$BZ!F3vn - ÓEZ 4]0Gʫj>ʫj>z~{[gyz~M=*#߿mg_oM^pz e-a|1İͰ׀aU5oMxssųr$ =Cf-l- -DU//x]L*ʆ0HfOt=UZWyCWupUe~b_Xk/1 GjShh mI䄫RWi=/pEa2HA4bH>"ޠ}2xHռAӖ%C>W! o+fMjt,}񺾿qԐ6+ӾKaPfkRfX-C1VPPx:IG´+MGҢ4q*B`yE^\DB1 H, G˳7 |DO0C,]Z2€jh$ }CukΏW؛xŗneY 8uMF>4zaG rD9GäQfVHWH!Y nh$U.Y 0! +O\Ųv5˲u3J۠+R= z9,ؖhCsؘ9 97Y8k`amt`aZ-8^*֡g;*yo6QWP%m^^7rX\~-;[íIģx};yCvNgm3 sFtx%!LG"DPc`+ia!GC#q:4ҫlz*&^+a-T!8DDϐk""xv33"":lwI36FGt*~WGxgs1)DCSoCnRÕy_`o൧Ѕ4t; 6vPh$(a~=wVV>]a.4+-LKovQ>TF: J õ7`/N,C#\V\ %]se1Tz'<ēlJnxFI@+鉉1"7p 5ds5c;Ԑ)ҐIŐAFb2h$ȠEA2||-Ġg`LJ l=`06"C:W!@/Lc4Y!?Ya㑼'ͼid^1DpxA$]0pU@Ƌ^50%001 Gl͇42A;4Ai]^,; 2䈐!u3Ï e1w :ٌ tFbء#'scg-Twi`S= ʳ2`M"vd,&Ѱ29C3e v"4` |)ɲn[N8 4`Fc6X]+` TPH'*(hPGh669*P+F< (FTG{:p i5X5d  ],C{@(oU~_[] 9ң|>#~QcF>ƒ4jg37EU6E j#l<^پd FH0BJzvJ:`By-`jW ,Oؒ` f|B_ CTwkBw{B6F)Gg ;*\ͩB ;Aac$$J bfl+f'~'}lJ$T$<b "ޠA6Eh*4K`6=70 Nn//'J M>)(xg îkD 9H `6K:qR)DĔV2hpk7 !w^'C!e{I.Qj#A#Ė5pCfOW\3JI4hc4%#>hѧ(C1XpQ=Q}>0_a&]a&˜z,38VD&4D]hPrW1Y3yp.Bo},* Fxu4DFF(DhOﴡ'ig)Xa%m i4FaE:|~32~pX';c 2) 2 2S}c!!KhPuL|""X>y#NzYT͢lFfG/:׾"qĢZ8 crs~h35S .!z\ ]8F|Bjts5+jcg8,] rbbM=^.:[:[:s-].H^3.L:g#]:q.&]6qnҚ[> _W#>q6" )'үxG3b pC87Ѡ&bM=^R\zvzD!9\\Mj(g+WF(K0!5*QQOD(e\#[.7!^_1~Zxb'Ȇs|ؓ>QN `Xw~` d}zO,@CTGTE26x)Gm ! lKϻ.х.WH._W,zVlOɲ|bY>l˖j0`8kZ-8v$$1qם&k?`CGzGo> 9/* {d"ꁍ91,! ee#w )¥`P1LDl 1po>#g6^άlIfRWo E]/͢Wpm>\9ݾY#ۋ)U1񪽥XaES1RH&5rBG!F'r_ʼnU&Wv&W>E4pX,Gx9s!+JfV"a+h370+0Xza̴\\զ/XQC\>/&^, ;pyP e8݊bVFX:A\0-J@3J(GoѠ340jb=6!\}ab _ _;X!YFs5f10+_Ư!Ngϼ|A'ha =CD]9!"NDAkR(jcT*ԴĴe6j"Sz L8hFF4aFPv҆*4dNPzD" u/ UA#a&=#3']53'2f.֘/wN}-kW@gcx ^oh$ў"ڨ$0 QLQc +t1C VPVzL0,sʑOC<8tf[z_$qGy`>4{AKu(=&":DLq;D NWĎQԜ =&x .R /WWhJ#gslaװEލ-,M׾5@c'`Ҫ#::\X)xutb.+z؀+@ !ҰP1q5Cp͇hMGhʼn SaVO|'lv-´-@c7 fpvOeE]66MaC.ՠM IVi/5@Q/g'#qdy2QF"/Mdqxl1핥XK+8G&eoTM7=WcyHEte`qL Q)i3\q)lPIL>36ӇL61sa3"|!N{o }\a~JNq7@'Nc Jz+8cp4]qpűޢ}:Q:@-@`qHNNz"-UQR'ѐI4<%"n܈4W6]dmMDO7upĈ4͆,Et0&ѐ.~/M,56.}v:aNݍ+AEY2za鐴|:i'^ԂW*,/Q#+gSVa+Vښ8*}n$xJ4DHD#:Ѧ NݴD#F4ӛp,ߔ c28݄$9D{ǧYY'Fz>o絜_Gxϗ* o+E; NgB$\T9^q(x4xvx7H/:N!3)37i*PM#51ȦaAPUB>9ItrR `wG"-B6r: P tB=QKY?4<ܥ66^YJL_ͭIpH gQɩjR]qImI'J|}y#)ѣoL@t <ˏlA>pRh$.F:&00YX`WJ#J#=c t DwG܆,0$6hh$-QZi."ޞHW=PJ\?V2 *)1~O" S46h$F]SH;tM#FM2`  t``R 8lxk,(+bZ*d+iِ5DHMD÷ԅRBYQĊ"J"=+ UVh$ $=ƂH(/.F h$=P.uAX@;퉴mc=RW w86^)d4V8T"4iQ)Q)R{W%EIoT3zh}4=N R"4UK}koI I}kiJqD5]HVd#XVPV<,! m)dE>9i ط]cg %v^RШۿf9RR$%؁vE )%p_/ϧͥpxvA1*'x ^cIK _BG{j:]Àg0h$ F+Ս5 z4I1t ~̐TI'k7iByXgJ']3o:&S2锤c{ׂ|JZTCu1SYɮn vSOP)ԱɇjZTO V=l%{$Ճ7SޮVƔUTX}}m]W)&&]cH*uKRKc.J3xQf+D6Gc. *&j!r i l&B"lbGGgYRG, f[7IBZ%TͲ$2*.`p 궵(JϚH(HؼH*g(DuD4G)$lȚ:$x*UL 2nz,Irx,wfDlu5T;XMW@;􇗦^zw}RD?&{ p4zJ/M錧b TI/i4yʠSL&*L?a)ST*=adԗy~49!GD"5#I=u$=n\HOA31z*bGnCOE31zJ̞fJAOSSLs~`Kew,놹"k)t?CǮhtrxTl4P%0FVrWvpiʧR**p ҹJVsݕ%kDc&HISRMIeBJ|*gҙŒ*Ͳ|ҭhU`7]j!jEDx$Ih4K44"+%mCKM}yhvV$NI^<+^Ӯiu+h**Mnh%G&r`cF6hd#}mRw6vVM 60yMH4\!Zpm7$]DŅ 7iFHѐg~ yl$5: Gq :.=)Y̥ aΨt몫mYW<]U#ZUZT$JIԍw}o> _vK}D|H֔ 8v)HFւٜ- ^y_G/~%oJd~_]0Vu8:_LVJp Zkkt:Rѷ"Lb~+[Wfk]!e!eIIjm̧*Xޣ֎IZ3Ec=AIr뱖R[;q2Dzxݿ>?K8:&(KҊ4-KZ,LZ J4H^J$B4,,&kr .ỵ;kK,+ GL<Ϻ13ؤXWnJ>@.#1DǭGL H٫.'SF2=c:+G<8E4>D#i qX@4j:mL/u`vZ7u MHb$樓jSI@4$JX̕\-\-+cUjlJӵ ,%mAX]ry;UJ+6Z|,q&$*]1zWI@4,Oߺ=C-DI<kA^ү}~Bu46R{Sz c_I?Ѓ鬬YIcH!cH!cH.f#m IGZ,ow9l,IKҒԷ_lqI=U&J\bBҒ%KӰ ,&spW^6T +4/Y=+14v.Ηy`]N5Y;'9`i]ᨡ>Fxj:>JՓxù76fh$\.ɪ <$C#/4JϬ/?E70 /4"#k&+=%k,LD*'"Ymc]Vc4]sm*ұB#):$phI);7 ^ tr SMm9$_P^N> z"Am, !)@Z @-$6?P~<=!dAf@5.ur 9p&Rh6=٣^[8~#yl`WS@Vh@~zM (eVg@e, O;bi| 䱿VoLcB3陞8L'%Ť!BjoB!NF4v⨂`~F4DGLCtD#:;0]f`fg⨢^tf[yGa}FYFW}52(*4ʗ$ D$( m0pplhhJ' |{\>Pv T |j PH Zɢ Y8 ]5)F6lm# iPJ|JOX|*VGjJO zbOn}?`9PF(eq_1p ddf`oU}@`B"NsP: HH.T*TQ`6jhfFdv0^6F&F-^Ww;=޺:ڨcfv=O3Q՞CG5ЭXOWm}kH!նۢjKtᠺp:`N4 H$@#uHVW$rGh8m0+ x w5ut|ut Go7F9`LFlo"_^LzH}>YzQH :Iїs#mso8vu^zn8Qc︱WzBov~0h Ff)17Q%6WS?P$¨ggz&;:zFrJ=빩K_i @c z?ߗྏëQkN*Yaіֹ!|baQGO y Q}}z_v>rK^sv]mRëm:46jpuzka^[^7`bj|Ԍqx5rա˽㶾jл$bWS.xM#֧ƈil^g#)V<{cLnIb>j8<|!=YY=5R,ȝ6x4U7r!=u'OWt5ZnxizXniM2Zʩفl%w?L eau: bbjZH]epkT룤sOG=Sჯ_ޗ6FžpeIQ8 mQ-zǙ nSo6~0i9j?8|$J3ulQ M:\% kkfQיQ~4>ۿ姿e|/_[ TiY2c?}?/ӿebkOen+J;=/Ӹ>K:u{} ևFEOZc1jߜsxxO͢4cuQbbb\\{?_V*mY]W:pzTV K1WK[?oq{+~ymeD,$a^Zۉ W_[0,Q[[]E-夼m:]׸ByL6^ Pu&Ͼ p~APڣ楃v-/eU+3HactL;4XA=xf@OT, *7 ]Z|֬?{{_h7g4-mpMd4Mo'px Lt6^e(Oǧ=w :%t_N>:9禳L,Xu ½.ȉW| ktkt:kBgXjwt c:`y:g0[+=txg:sYK/ZmC.o׵T@F0cHz8JīzL̍gPNh >Cb%c b2ҁLgQli[mG븏ì٦ui-tv˹vR!yQJ&`RV , ٟ^IeHcYd}]Ls`t'ql3:T9&Ygw6C[4I5:d;K:ć<k:\ >ْV9ȧ|o.vUuׄ-=QW6F9BӨn3l٪ # `v'U=^v1*gnNmλ1'#?:툳rvVV?[;?P/tSW7'n$ H)`(M>\} ?pTy ~|4!qGO1[ G턭S>gGi;Ar8:T*,rz::LkN{P艧?=8|w}:S:จt<]wRP|CZE=2R;H{Rܮo[E?yoO=:Х}>TAsTH:< Ot>w7 ~N  dWퟞCsC.9^ֲdí=:lkFڇgP<{OH6(zBVn44Gv1?"@MY똣Nv d/~7:ς(GOzDϞё~NG)Qѥ,`x?§>X:PSȮ{. 1|_3 4Bǽ?|pLtqu!:0mrgs/ѹI褏׮d>ׇ:)eruB>t^ݼ>c2,NkF/tƳx)1p4ҡS^Ohg;A>taachw6ir}tӑtЩ<>Ǹd^?3|::G:>C{8uE ']pS1#M9nؾ7c>|'@0^Cj,vv К@u rcR{Sr Ez;97ޛ ߛOEG=wxB 3^1zkJ '?c"B7gPBv&n@7KP_܁u&5IL[Xj{(QPKMr?#~=#Q?HGPoGPsOpT4ґOGmGs[GBt?ӎF:hý12,誟=M<A<B1 OGv>{>ێdBs%W}9^ IS"sl 4J]狲=#YQHGPGPS@#dgހaoΈûɠ !)$Xm S4;;Gn#} Utб&A()WAH%jmrl}RBG:)HgnJ& ds2 (Ad ~<n l/g3^aBBX-!! JYXL,XҺX|D,*5p!b PddFHG8oSG BϐA ؆baᨢNzw{:5~p7OidGmۄq4uHP|e(>MOTKH|¡ŧRSa5ՒjIO1fQC.eA v}Y^b^^D1ڬWyfČ5ܽ`ƥf k3pP^Qa ,V#c-ͺyӟgspcqq&I.&^=LHC#QW+-7Yĉ!V#UBYXX'bhbc%Ier;8(NV!8WpTQDvOQ11]%LtD05+xuxxjE0|'ZI h$JMLLXDMSrFirh=0ZF)o XҨ"z.)yPg~6"'z=u0$y鹚 I \p,oSg NC_6{Ŀ{ a!?^C#Vao5%dbw`4 IC&/ՓJ`noQ!9>]TCK!"Zx&[:6a.F4pf8`FÆ0Qůleɉ=xOop~}u8M8_!78V^pz\m-)Mp ځs5px&:#QZ6,!acd2܊t SR7ղU3=#/>;MD.= r:-\u ݺ1706croag+c,g*♇Txx^CI<,<򺛉bHd:!@RY td>=FLgeZRuLluL\MḲ2?; FFG4me`ጓBv!8F(^`pxhql%6WV/8UO1NV 1%  i,,|{5|^.0ee8' y4dG.^|Ck`Fݸk{  HHDH4403 i9~᤾Pz+lQ4uwm$LK@HK'gG| !jz-yE{qn^}'ack&Y>I8ֳs{ +l2eQptlc$`8FV}bBznꡄ5FF& XM`4|2]3s H(*W(J'-Cllc",a:jÔKd"F 8 85t81:\KQ:p&^%G^[{oRU$-tr!īz+*lNuiek0W^/G h̥g`̕g`c ~bc~y0ho )1ƥH.!F$-2~Dx:Гu<yFQ,40S%d>eka42/K5hcU:?}ͬr,8+fy/**CCzOԅ'VxÚHӲa"Rz~&Rc8af;6E:gS#4jAqjӹS-CzF0¤#u ɊA4T.aTݷHbO=/A-ޠR=%7ٵ2o(#Fyb11oY71|Y\237#g3'-;6^I@ϡsE#tㆦ:Wթw^ggT={+]Yq+_YA,BC/\^ VoB4Fz[&]y;$t_zB: _zvrQrrF@CicDxYN(*ATͧ 5yH 췽^QŜ|V)ڼI'dlۣ~_(tP0Fz_'^$B2Nh'8p.q2M~K~K <̖tA =\4}ExZԝ:b6mB˥Ce\ Sʓgh  P ؘ,d#КD(!{"8cqPuØ-ɵ5ZĂ 7|Eh:kCeMf=/% zI9 ^Hg<[/5g TPY2!Fbf.l16hXSW n6NGy{**XJ>h^F$47@h EiB $?ws\%-k 9I~ώ#@-=B *2 YТ =aE4T(.C*B0PCmcGFtMt" ( mbHzfHvՌ|=jPu45ي+||~5 =Čz(dz޶5NRZ'KJ5N,bxQ:f0凘!` 5@29h0,(mʤC .8̓91Xg`BbIF *ѷYVomt[s>qF?h#Ԁ:^6FGMHE/G l tHA~B+>>EpXut"F@r v9$PPq |q6!DjH2.u5.E>"[W.(xf~[oC>1Qx1:j8 |W|!Dg.j5;pMIu ʧ! GgAh$++b;{wAc$f-H.IO\Ic+(d7IC*h$gd időRo?ouKod?^6h؂6B  ^lvBf:-pTz^LSsja!8e!aēt" %bjR#x7=U%?U%Cpn[|@Lj&i$`$&1 b>&_uU&)@;M/4 g0'lcWVXCkթw%Cqhkb-d\:'!§8yFB~%xGq٪w1#mIKo/㮼=PW=u4=&"eWT+tqlkÂ׏Lx ^RBipg!з1z=!@~!=#=>#uXu<;G;40`>[.KK]>ᎊn¡`FYtᴂPͱ0j546/(4:jljb'fN1ȋ_z?8TL RL-۟5K]!F#X~ `fa'#Y>h `Lf=^ !+W fli4a|@F]]r禳.]kkcD$c)1 N4ލ:F,+T_J$K$ڑc%߷ƹ}'*4A2F"*]ъheB<ӸNdDEob`nو?J?Llٍl(;S"D }cfc70á͑EjF #-A#LCp=TԀ F h$rБؑ/H}| W#oG l'+ "c<`NĴaMtF +L:'>3ܸxF yP!b5,0ٓ0\D4y|CU .6Xy5<VaLBÆɮ Q3wҹ ;*;HCIa&@dz/]~O@1i52_t \I/gUi:ip5T3`9''&zg& ;D-'gc|1 /η|y=^Y9y =\-:8D?46(/} t"ޤ޿:֩ukז |崾7:Kpx%0)N0\!øYJF&@,-g/C|ԘK >$,֧.g Cd3A䄂uX,yf> h$. Fv޼zB`>'o8V{Ed>(N&&ِ`耼ۺkׁ̿xk-::Otx>hLHvgg'2J@-'fRbb'BIUe1q$AWLΨC >4|JnNl: c1KX E"y%4/i S7bqK[= z 8YfvG>ax ÄE89@]s5'($4*z^Fb'5vb[,@Z. ~g,g &I aVkQo=[= ى[OL͗[Ƅ^22mHELŕtmn7R!T_,ody|Fm#1l; H<xUx;'/ рߢ0zn#"S>&r9a:0!q"2v$Brzz"28t Q/ڈ8kG^\' T>"ŤtB*h$⚄x8 DT4Eif0-2LK[t-1Ht}_ZS olė$N}|M+'gO ^^i1Ϸ5k#|5`x)>q:VXZ>x-!}5F; n.Ԟ;HP'#Dp4j9ЫR☎ȍ*y"fc"6-]-}7)Bי>Nz||~xP̎Gɞ&{y|r{9^kZ-ogZL0x›0(0ZœZ(-Vx[=QB`e" ]BuE6k G8tIWO9V!YA?E$YQEtmQ]_I[W DzCvtwg\PE$OU*"]L"ʫkQQVV5]p.25] ]vQ $9ph) 2(΢=QTlQ1W)>y "AQzFOʡ22ʻDңG=m{\>Gh#u FMm`zчʛ+J.?U:D·մ(5|NVeQdHң',=IzcZzd72izwZW):N!#pU:5J(eS6Skr3n|m l" )NG I ,K`A'&I^D$YZkf '" *RH:w5 aeR .^fJ}R+ճLL]IhRiSS 1|_̊VkKjKjhd54zj I ms'QpR>h$CF8U</M`:8h$-SYZ#zS%]S>37v7Չt}5RSIOLRM:d N@RG~>kJژUdђ>[IIHuKuGy%`}/G:n+F8 3I~$4JӷxE oH~l<_4hDB $IXhX6zڃ6j#!AeaQ nan`azɝ!qQ-hWH]`BRh$E^ ڡE nHLD='ZUdkQOR dG9H]q -`nW/h$2?xv5Dmm7J-qH$`0O0ϱX`>it Kؾٵ ngaN:'Zbf7h$)Q2Y#H@ aeҳnk9KT`W;jY`'BK Yԫ'SKJrOrRrfKۚ&M6M&ƖF#[7; IS*Nb 'Dcou|NuVY4nJIҊÇP0RJ)l^")䞰>1%U<&!.TS.@LLc*яLDL*6ҙI,tͥKB+*V E14R3]"AͬFZ.J5 ly{Β)/s},gx&6Ou31z4B}C3:ܼy*Ij.{޻.Hz/] z]Ӕ+Dzep V.E~Y$1^R MUL,%dIXJzKaXKH eyz&1)U>c/ E Yk#&H ~mD5) z$cvYdLȒzM@B3D'#}Ymx]tVzYt z~Ǥ+j뒯67I>*%_ր8$IfWZ,jYJM}E|XրiID#I>4C# %j/sprpRw 5!ºCgK p kFMaHKa:d͖!5KZe-pǐrK[*.?otI+iTҰ+ә ;"È&~inyzt^BQm(gx`g'ݗk^QN| ʉS|= N[mwb`WʦЦA 7}m쇘Vp:K,&^[I2,łr<{G#uyLaу^jzdI&zK[9kh ڛ%Ӕ `@]G c~\~d:;8?=:huvꍼkkPZ 6٘¶>NR8~܈<{umܶKܶkZۦm:4Jʼi®fwZi=~X'^u\ZZ ^u 8k9ywX^ʹs QwT\@\bLr7qtzj|61S.xV99t:Wh#X-!5040LJ 4_5/)lhWyh8(j^95:Jݬ>¨`) [ <7sWļa9XG]=#19YKo׷g^ٻY\N!UBG^TwlܹIm<_w2^g`%uJY*fEC77ބGoZC jԟ0qI|\/O;O7pvpgpniyG;X <}f&34zp&^ϥPmCV>TC,IX:eX2R|JkcG 鄕Zf-ED^}$ajmO(#Y&^XjN:tZ 7o~ZR_/O~ݿ4E/l~7_Qdx?prRuxkkfQיQ~b|=io~_ղorWzy2c?}?/ӿeN_ ?ޖ<.ew%/{||;]O4_םi>o[=|}Q+[I숯'Q#ynar8tb 9\>-̕㴞1}__xZ/B^_^_i7hpZZ]?oU}-nFW QVP|ěx\~߽n,gd!c rYϋ|:=u>,+rϿZN/zN}9Ѭ?OoWc~=侜W?.\E,KK~=_.oۯvWe=ya71[g?_ 럂d9A?G.=k`w?naa粯D7| r?=f# $ϛ֙JSsϿXN6o7شgw))>e'yɺf/_oܟ58}q?ump`u]+۲.,ꟃxo_kuvSkO_U̶>?v=VؓunM:a+_~-†LO67Q{Wꃛo? ZSwOopI"Fe3ܘѺ?K٥gMBzy u,Bhj~|i#?1Lendstream endobj 144 0 obj << /Filter /FlateDecode /Length 14051 >> stream x}meq^>#4kOwpPI D·pb#qI ԇSU]ur~nw鮮sp{\*7oph\osr~_ooPǧHq.5onc%\vW_W_ԹG@z K s|7CO7?7Z>ퟨ@7txIi# ͯoA_R]i!Vǥ[k"V2l 1t'Z£ &b+.)JJ5| TtVRVʭ\hM%ElŎ[[NQ>y%Ւ $uTsKMS/Gf`Ay/(\蘌/σpmў8" W. Dh e-qz!f*[Q4U~|H0ZLV:*-d)Ŭ1G9)y<9P"oxVZSy\2FL2kt CanQ.# t&,bטBh#>>tsK8nȱ@ʐ*_;1|FѴӢFelMr٤1G6)|r`)t|oPq\*tvzޙcL 8ĀS5fY@PcR`QgwEԟcuL(xUYMd0O*7= ]t<*/ZNˑ5 &U>b"ԦK>QsJ4[bEqA]2+ѓ2 ‡O hQ:@|10ݬ-aXcV nb":=Eᐁ>s!sÍsGsۂ@~zpB&Bh CX~V;%毚 M&":I산tMb [jyTh@ rjL \3e%=NL@52hґ2De [1_:,32#r@=BMX PE!jRЁ2I;8.܋HCLb&u!e5r t00.|R@].Jc0xBā֗ R, 2"V&:T"v{GP,iHɬIE:AzSb"$L0A,oʬUFw5T+ԑ=.2bRlR 'DlrƉ<#Hp=;/O;D#E 5 BWy$Ba<ϫtyG:syV=?3$bNLҥ^!*]jUvI{5n8.#{<Ӄ73Fgz-5k-i*n,D5Ӄj晞 >QαjHG][^4Q7o~o/>ȯ@tв/{ Uc%ZDLwZ!5[ :x=.Ы (jK8qO$z#ٟJ$^/?ubϡy2csUk9W-@}ֲUkW-B_}2>Uk:WD_u}U2^tlQ,秎ϟ62b{0q#CmfMAP5t>:Uc{R`+T%O L$f'Y NQykLzm/o`"ӣ ec5'7 n)^'2-L[lF lUl]~IlՍPI`l^Fg`1/®!CΓ~v!%tJ Ia`hR`k Y>b"Ӑ)@l)Ŭ1G9)y2x!6@ N Y2Wj<jP?Y>DXg")Ŭƭ[Y]~:)2!ٲƤ@O)cnsZcR)sE3ADbh!q<)Rjt(Y>" E)!>ss% yA?UOvT؆ִ֢495L^Ð2hߤg ]:iP]6@N+݆vy+2 U^ Y."O@Z=@)֘T~[61aL:IȰ\ӥ' 0+-8 Eܯ]쎎Iz]Ң# S';a`ȁvrnl8Ku)#f'CvX=qثԆD07j/*Ѳ `8CRgA)A,k*E9'fųI]| 1kB>fsDRJs JG5F"G9p$@ɂ G #$06 tfSb33dc'tp")!L= ]Å*; ]Ն< IK!Å 8aD\h`o%q0Epɑ$Ȑ`p? V8> ?lБ `rg(ցNP:yHH4|=8 ą+5s! "^%z)!< TAxc#5:, P=v#%mJHʾu2 0Ob2b)}37(j`M84+)#AwQ+a*A]Q+X ե6Euu%i|#9GcP] m Fv ⏛"r lƪh2H F0Hw/ҽ{w/ҽ{1!x;"c*>"՜{݋x"!ûS%7- B`]c*Hީ뜺M-UoVM-K!/{3}xpm<3t>)3=38əNHÛ#H/ >aijP}BoD5Ÿ[>/;`է8?ʏX'2\~:' [fj3'b3\\f2ODCሶDl%Nز2n`D^V[G[ !٥r+(tWϜ]i#望Z 14ZȮ.{9;TH'c.{' rq#$ |rV5G8M B` Y86j9:A*51 Y>8ZȹX.s l') iMVD\P^jȞYFHqdbl ,}pJD. l}HfbXV ~R6~ڀX08g֣ l}*Mˏ @7QĮ(J/sMARw+|b֘Vn+}7VF5# YL@QٲeΨְjxZ\, IDWZ~YX5('?ͫ0-.iH*Kb:+(#gQv[k$l ,]%:-Ytrfu`OLJxؠXݡ=Dѣgb5;3g%9\23'u<34͢>TP̫&5G]W]YR#U}yՐIyΔR!"rr$jRM,k:[]̕cTupj56!=MF*;U!BLej:꽓6* gKA\3>ӢWK:dVɓ&oլt]ANF_%j G^5ӫs1^M@vήƲ&Vtp7#,j,;"B;pV1j5CG][8j'Xh"<tCJl &,YtVsɒXXԕ)XwEJCԂE됨ήF9kq(5Fּj(]zo%͙!qruddHv3G,+H,farruaj#1i%W7g9Tp=6Mfx1Y#`BEo%:%t+ 3ܺʮ.Qb9. .7A8"׼E"'9D<߲\4]KC1C bx{n']Y{&-δĈTpA=<#*~ 4=HJjH[f#t?±Nk^ ga[o܌rlD,2Hrd\1:7EE 7`3i٫\)z,$릙H94H'nxn ]j~Ց]WgMñGphZ!?·O\|WteGv_vWeGzj^Y3/,B_5K7O_'X9 /7q xk-xCytiBtSZ14XZԦBl-a[7論H_Ƒj-OeI:YcZ IhJvIri,¯KA$3_f=VQR05O*gd Y)2C˜B1G9)yhJ-`n>~Y,ISxwS9wפPD7\}LXT yHJ6YB6Rfa  $3EyY,s~Ϋ`&ef#_ط(|peA sԓ&d[ ^% ,T2<'\G{ʹesQMY^<;kl)Yy2'$ MxH+]ZY2fy-Fؒ)vk-(P8CҲ V'dy0^x x4R'WE]-ȴa2@2y,M -3v(MұlФ(aG75cQe[B!?vZLlŪ!\$4[| VOK|0*_t̡;RTl~^^[ϲtxMGx eC5'? w$?d~2CFHQzGw|O ?Iy2ly!Ǜ=YcrRЌlOR,_X72dAùc%PGʢ b+9cR2Wf"w lnYc>Aax:3ȐN^kd9,KH$c!e>s|M홂7Iup7MM9 tJW#\xAg~Eq3IxCxH0M,J rda' +y1qT6 7Hy15q+,X/dW[F~qԤk63ZEc]$kYI39RNB9l$<́7>yXACFXq)쐑 _2Q|5N /xlv:#Yz۩YbIq Ѯev- QW$8|oXӫNM+Iv(xp]52B i'f0NfK8>iU|̜nw/I!7/?"@c d~$FKxu t"kb+sY5vjyob@#׫9⣇$9s1 鲚ѬY/2_Uz&?+A,UۤYAYYNH&ބ]=eE " 994RV W0lk'dx7R7v8d8iޖ`Im |gK8TțR?;;n};)Ϯ8xN#3#3AQwvTIHv}Rjw񛧜)'LHrML>9;$ lSs@.OrPBwstЛod9y.LQ ҼO&eyCwO:;-"wHv/PgbPHΥuthX/tZV~?g_mS0D C?Zc0 4"tf9K OkW!,9Yӱ.3r#-u7^XD~!tˌ_H!ŻIS~ H!Q踺g-EuÞ-9 6\qmG W9B>m=NIk' s7r̚IŢR+#k&m W=/Qy\ٓW@Ws2 ҠM~v=UfD9qqSpŽHAear$Ne.G#(hچVP$OrOGՉ!L ~g]L/ϼ8 v@Hul'',4/#eTXnN⤊2MDžIŘϙ2=oy9S]/:߃ |X>o7j.^nDx ߳و M=GՇy\f>Z`7oU "BsJdec^W% ;-o3u#F^[x6'$en=7ꁲ-N^I?8r3ZEN[fvΔIl )b/b”[Y2n"2z]S{P:,z/DmCG"zL"[%{\fS:iIo1"(Wyyۺyc*]` tyy(` 0  hr سdp˕ Lw-_﷮}~b'v44nIb39 {UUͣ Zv>+s/9ݑ^.AQs`K.—]qaj>|X;(g2g^#-a/@d$zqўq;RdzD6g ׭qaxnƊrr<[W5C6[?+ߕgq"O6v[R:=e:xz;tx~zv'd7ɻ3;g ژeޛ5Nvdzݐt|d9vVfU6Osc}_iB x+}Z^|=S:uJJ8HW"† 67"vb5W@ΕU:p<&ݜzǪDXa֜s͈-&a ɠ F6FgI< Ҭ aʿ, mGwgIV[ .-t>ʝkW6kl a۽xTh҅s"#=tXP}DbnĞ7Z xI}3W|E ^ ¬k?^^Cdjo`M!FdO,.-go//v o81,Y&EƇ!pC`ܤܳ^xj;lW xШC sm>UGDM;cp!bvȒ3w<| !NV6NbvO‹!W!~h`dzvU SƱB"s^ sA?ff [? ?@uy2^5QXOYߓ q(wo_}ɯ:uU_ Vie>@t$kk*7蒣EYv^Ih ^&*f:|sܽF|ki%YeٽL +0:tbSyQVYM\N k7*糡W{ :&6^Z} R |&6H7"ŅxD:=Iy{ܶ߿AlFV%!Ÿ:MO ͅ^4X6$“{Q}f,:su`>- cK6z(m r {4%: U>w=N)qԇ%1ɥ-gΑޯ]Hŋ#S@^(10~b't7gDek|#c) tAͬ+k <ûuA~+2~=d&A cXSmnA݄?ӕ:G f+q|Ċ'5!U`۰'L:ֶ}-)?? ixxI='xS4L?>&4?+~6ۄvq:r"iKW4+y+-< Sx{2sEnmW,-N|XҚZ_o8?dJj~U:.o_-#vD:Ɛo=~'/oB*ʳQU 'D[,yYIlȮEU^wU~]Fe@Y--!P YN zYy.ΟЬ-v#7qu]UF Q[ @VH?&GrtA$c7l#t^$|)OØ^<2>?+٭~25HD!?pkAS,5!&W{6 q@6 lq|^L.Js,X*!l?xQ×gܷkDvۀm^x zqN3a,{W4 `@؟X<8j`2[i@/etΓin^Cy[{S$݌}+SfF/z-la~J4 \u%f"$28? ^>^0f|%g[?OpA|&B$[_AAN7/cWHq?SDOP2hLݪV>[Y.Wצ5,)z>֧k7ۏ1|wӣ*{NK\MW{קy}Õ;V$Ӥ[xps\2_1[o#MBǬsjI}S{?O߮O:/_?v'3.{oo+kK+dv]+W\~CV4η|{ ]d? kUVendstream endobj 145 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 566 >> stream x-OLp_dPym1" Q.tkٺV 8֘ah<o^0xgۥX^چ F}FMh4Rj+są._r͌`V?'TK# Aa~6gÌ{>?8Kc8 ţ$njyGkMM+MzԴsu SnO@`z65vP_-jCxX.2)gA }LCabb#_j 'J,B'lH;@as> stream xjCMR72,B@jYa   eb_mqCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMR7.CMR7Computer Modern2p͋JiuP~>}L讧Ǻɋ !74/XWϡ=:4MFkgo0wCna  7 ڛ v0endstream endobj 147 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 346 >> stream xcd`ab`ddds4~H3a!c_VY~'٬ȥ3zxyyXV~?.=C{*$fFƼ&ʢdMCKKs#KԢ<Ē 'G!8?93RA&J_\/1X/(NSG<$C!(8,5E-?D/17UP=0霟[PZZZ?3]˿lqZoeկ8|g]wߛ~FFeMG䷝> stream x}K&9rݾ~ŅW=*3\ 0q^HZH5XwGǯ7#9_uUW`$4u#>2HI2"_/ۇ?_~|_v||{e\WG}=elu?>w_v~w_?"klm?~3>ܿB__YG,z:^O'ѡe4?<r~?- pOA=FϞ^~SVOde?>_Z.kן/8|]O _OʝUMݻ_5<~p LO=>/}~泋-Ǽp}e=_| Ƀ?J~ؗhl<}M=[l2ؗr>mt9<ڞDwKGh {xF={ 8Wy7G}ʓ+7;_[oz6Q$?^o`>{퉮'{}vП\g;쎾yxr9f?U1/~j{,gv~M,كtퟟܷ'ͤ/$3Yw:iC.-Ww(||f+*q@>ۓw(s~҉?ۓOM~*oןSQ<__R8o(#5X/I| ˍzv۳G hw}vr}0/qrauie.NL!<'/)x~'x9F^忿GEKhk|ݯ5Rm\c-ŭ̘±R?rT,/^UWb| EٍmSjyw9;ܬwiwThԱ}K,~nZ*4YꋮG8 Ǽ3ף(#t׭2~KPQܷSO'j{m1;+rGdCu}5j}S8kG~BކנK|Ta67(M慰+?>_ysRf8( !͜v.vAjQB80`ۓMbss&Yp)qm'-65ۜSKXhFmd~WY |`6&ӍZ9 ͼ7!Xd;~q.CvV~ l@8_ٻ}?4悤Ƹ F>7cGg7uk~SslBhԴaWZhKJ*^}}q <2q6)\v浩V~.[N^>4hjf{-/aXڀׁP ՗c1VxIٮk)1k.Ђd5mK [ڀl5 ~»qv&/#tsbc|K~Ǝ>(10cX64mx XD+>wv1qݮߵT\DS*FY0p# h Xy)W:m{([v!J4pucZwحCY44k\y;Nl47L3ׇo/MǮoE:q (.hiF)6i,|g|QE0Ŭ^^XkJӠm$h5jOu~|x)JV5Q8*~7;Oia$>50̞٣檔voKּ͞Ҽsuv۸xn%jw3;?}~)w7e/& 9L6[߬O9sls>Tݦ15sov\;S3o;v.T[3͎̈́v(U%>r'4yq9I(9߆hkP4$m`eN;L3?/Jiof}/C圄}WZϛQmn"v~O{2]SL缋Du-hj ͷO%]3FVk5_>o;ui|N\t|Y ,_̼kǎNyjZy|=E l&MSSlqM㦯pTbv3E|'ڹߙs$㥿vuߴLm^ ŀbz౾ʁ|v7j>6k A\pߨ\A4RW"π/oūvw͗ڞ5LJ\΅.o[׸X]ۓؚ{v.|iym3gsˇ]6t{ ]?_?"4e842 [V9C^e4.IL)  6_FMCN|9ex| [Yz(|0 ݜٙLSmXNMa;ܰmtt75MͅiNCs7s9qPiYN_etL3_~f|y_Mp +SS1({:4maPsLϛoj\bj ;g3/JМa{ǵyoTXo+L75oCVtn15'6Sg& 4Yp KSӰq|c|3NC[m(Gt ]Q!5p4 t"j48u0M*O{>߅n;(j:Zڱ7ͨ |*lrűQBO ]oBLj pu¯n +#m.)Klj*;߅J;0S.5Hl4Aװ-L!hh*ߺ)`fFt΅mAk_5 _ `}X]ކԠ8Hw=~)Fʼn ΕҜY/7OzZ՟~Nu*Ͽ__ QCFq9s˓sww>k)hn^JŮx)e{6D)jn\Jt)e8R)jSO|aW| o]Ơvզt,VC8^k!)2޼߇}BZ$4Yʞ}pDoQL;O;8 S.pqZ2Jp${V;٨_ZҶcjU`(1Y\]x&r[ܕVle[J$+-64iVadJn>6k RJjgwx&lQ`*1~eA2tlVdJ2pUlŎ:^*:yp" xF MX jxطeE@'m8eX4ƟzGL|{"3+ù%8Dh\o|oپgnezm^_̅UuҦ䶔0ϱXyxhgZpʫ]]T 0MRk,4G3G]|~P%K !ӧz]FmQ q`lLxKذb9Qs@MXPln;f3h([!JDa6 +J~hwWS\?})V\Kb,$ Aڀl5 ^»qI?~[4s=pDmNhTiA2"-1j*^}[xloƎM:J<==Vݓ']*aOɾX64'=n6jP/TB80يຼ-XNy;ѠLgյĜJM !00^& `'X": F#skf+Es0ONC8h*DeqWws-,)¼an*}Pd>m0/T!:]Fyڮk)1,dA2ڰ($,Fz,ǁ *꽥bM&lϼh{6gR1dX xh-m@l\%7mKSb[w:+8Mg?fj>̉EO鸕<-vXB%;MIg '5'њ>/wj*|G9 V98ٲ}41?M񹫶 &wk/#s[>Q=1@(r)l~?VW؎a>;VTw2N mCtjt@PnԜ0l0‰sKn 1xyl>9xV>8b[OfA\ñ ) zp^VVjKrѻ;53tzH}7z}Uu#Z-9_. V櫆Y £PێG;E[sظr)s18x||ܷb~@t \5Xwf`z>ͷrOsnyǵ8,*Nѷ-in<OuO Ej "x&hhOXk{5^ t┿wn͍wʢ=:G1HE|w9B5 Cjj ܹ0`t95qnrj^ԌjAڧsSfƓt5u%t9\77aTp'0O+^5WSTj5ES'"򲷓AMrBIVNz8~ҩyyޕ3blAEŋ^9ܩ34jN b \?>^UNz\*t:ruE+t;Ff h<ȧ8*: k#vMEoehAZ]?9.SQΗ'7'6UK_@ĀMpj^réI7jFиk*;<V >4W(ᴇ0/=~xwS5h௴K<1LKk:Ol4_,oyhٽ>a7aj4x;~Hug/:?6¥ =֪c И愦2UAg;^9P<̝|m ;ƐszWqR8? $4k鸤nEHZ'+aўҠoݨ:,ܳf J>@-|;<ܓv>\kڰ_5 CMTyt ui:@;Goើ[g}ayẃ!'oD3-⳰XgvCxϻ"~b)wH/ށvs^qH֗88_kz?a^CBXf^Ze,CZf}m[H؟ylwRm|=fҥ+EztaץPjRGq RrR٭jL.Jn]˝>,H.M)~[5= ўym#ďfPkH_i {MGPQTXc PE(A6b v칖(P MXCZTٯ{5 qcSbRaQƳJE.ICy”Mz\Kz XPXwV^ [uA%0pEe-xjX,~~s_\&U;. xjpfd ,]~X}\ߴoT,N<[-u-a@7- H$E[DMElPPł d!5GϖtP#dkz2XѵiA2ڰlݮyhpj*^}[v?m\qa=;v=m\ dkl8P  цՐ`; Z]]T 0k/]E)~[/džCc4,XTYHw[6P Rލv9`q+fxH9 ӗ~?K:.K UhSGqƗ T.dTB] 00ˊ00i3KJ`c-Ԝ8-UqoH цՐƎ,7Qm@Jpvvl˅eijpRݒbg% O=,64N jgmlKda8|lɹȱZRp~[ TK):wELd43rȀD=hс`T4<-o])\'Sl{hڡ`ꇼu$4%~€y PA`} ׉Eso[-/-ְ<ۭLP s]i@"Z{wцwߍ#6*;ۢ_˺trU7R>V07gI;; ?s U`T"L 1|\7+]7]3|Pu.[ 0x}o;R}SS|sG!v˜ؑ]NWaXukjiQ~ 4J}^b(òMJEхX< 쏎˩TwJ;lvi.PFԜcfCT!ʺYὟ|Z&a3Ȧ#15ݕ敤35ʳlo SS^iخdujOڢmhA/q cA )cj83Ȇ]`Kq˂ZWb Sa~7D?5O-u)752bHb(15T{%D2@|M 6k ܳ;]ŞA+&@ʆ5_|%c* [JR\.ifj.8ms{3{õluc 8:x.FWTU|t}r 4 :7G)X _tn+x.,YF[PRXK LE(74xv~b%LJE `6AA*Lͅu\'. I Mx@Ry$ٔyks-Z64 VC`%-m[KE2αֺX^OڵD̚hjH3{fޒ@C^Jp߈:sv`Q;./Y$,HFVC%d^z) q`lhaT}sΕi1őlwlMTJZmx jLM 6 ^»q0N ܽy> al/%C0F^Y;XmXeXcnoAsQ!P!ZX`Kuh+P]Wh @~__^>M 囂r2=Ӻ9.f(,qe&тb8 wTg{4@.D u fvషUsy'֘̋އNU]A !{VCKK! n6 ŸW80oS,`2=ekwTB̲ mX idJp6@ ,EcRfEiehVNf@vHh!v-6>~H `P ֆz,ߛ2|tۻyqzYUJt^ ,XټUGhٴ~WTs m;FMsC u!ڳbO΁ObP*ݥ{?޶O1C`n_s㙐yxom0c9sicѡSl5s7u;,;U+ݵPqW~OwJGrk 6-vC[Evk n05BJf|ԝ TqsHV0;p>3苧tOPWbHkzDӛqN'0<)x{Gmy3> {}F4kJl.PC::hwp@0PSqS>\t3nb(ZhسW`kNq >#`.^RHF7Q{T 7#!IlX6DqtB㹈5؆E>Q ݌Z椟QQ7?:cm$_'wlp n僇ǣ9xF# G#8P]B9q{ZGGxFgXVաoL.gf Z1]Τa& *(Kso2{0NbPWX[|*ϸ2d~\Cm'E.4,0ąr;5'>D=viLӛhZSK|lo]y΃hJ-FU҇{)]y>xHaU) <5yR_yg">3V8@0ß7JP *:7<t qrKYDv󕙣V}tvb+sjt̩NʖZcƚ o!I$ݔ7<;@r G3yQ|ewWa;Na嚋)ṶeMOKsMg1.l㘱;B *}[\cʼv"# 4 Fv,6(z <7+Uj.ĤU)NЩ'|WiYCSHs0`wjilޕMY8OZg"3tEۮ6"l W?ʈAc>UƹwOo4ydXx &5FA˘,W;? S<wa)<::Y8|mo?+բ1yyJsA2 ڹZ8/3y5nV$?HZ8AMsl"JZ8NOyu#i: x*4ZU W؇w ςz,&[2^6n Z gw'w|'=c]h?)OVQl(Y}~-_>=2lg>*ĸASs/E,䊵Lٺsd!in -ͭԁPѥԡѯF]>s:=S)S>wqtW'xjD:)G BMM;AK, @6P RX=RܱB$"!VITǒN9K,9-HFI\6#F I%I bS..RBGw'؎%rN2H:e7^iߏ r=ރzJAx/ R!r.9!>cj Bu@~ʨe!T.)Hu,9€Do ٔ=.My^OČ('r`m +'}!SփLOat,9ɔBh#ɔ1kvI6 'r~»q|sEa$2~ӱdSJ~r)[x){t< Rj(HoƱbѥXB(tEw"f.}e FUS{We/}!QV  R?$QFɲ2He路,8mPN,^8DC8g}[HbvRAzcI%$$Pɛ @N,_ٓ烺|\t!o_;9~1rVy_,5> ` 'urPe>:'*2]Kc=JSXrR'g #h#}S@hrR'g RX}R^gG=Şc1KN,0 Hdr_hr&G! Gr&^L.f^vGNHh,99xeȪܼ3۠YB8Vd8΅7춓x@Y$i2HbvL51wuZx:BuɗCA|fuUE(+$I|&bR'iYE,/ s`Nt*KgFLأ9x-tdN.pO9뿢 6dw E2V2'{2'{/'ɜ$AvdOVbd+u2p_9l:s`*srtt'bu//+v֑@buaN.~ N[@soWdϽm9=^I;r&=A#nI쩸')b;)6ss4ۍ/NV&7YˮW&{.Zɚ\V%Igi[ILdO8IY={/8$M.IyF8WddGY\sG43 d45kkIqva΍\KCn6j@Ndל$RFLaLˠp^M&{7Yu kkpu@TWvc45uJD"Mqbr5zsM8]gɮXӾ :=dLvI~dL\0֣ 6 شdL :dɮYDO~=bLv DŽ}kVdWek2& ? dt#WLtck dOɏS@dLv ɘ15@t'ckN5Y]s#y[dMvMewMe&XdMvxudH.8Q0k&F<'޼&kkģ|c1D"ɚ>8R5Y]$cԠMMv PI ޽_@6­#x]C^ebMvͻ JJr-665$[mkH dhVd׈lٿﮡXslDM]fMvXy&4 E75_Ms{1:c˩xoȜI;dhiɟS8?ek mvVasO! F !KK!YJYJ[KK]L?"|Jcb)[1o*PA5EY̯fP )E֗1)/QaA2X a"aB\8JpJ/WOFcO.$0~#gpTL*hVgiSNV,»/=Y0\IN_*%$dv0mI 6 'p`'e6UOE΅Uد {OC9Ya!do"Yϔq5 *%I be3TQ SLN,C$pJ` O=Tib * S>a_/yIN>,|~h sZ@9z) qۢ!(|}ȆYiA2HJ  I)%ߴpJ)Esu^Yqg c=M ilCJp+\vC$u4Ar g h 9̓]YGI@99DcX)},ŽV9wqāb +`YȀ?-6.D uZX R !1b}D|O F %j8lr g 2nX7x.|A*$'p[pXm$ٙ(,y҄I'ߣn+0OjG`gJN:,|Q6a?l/Yxpir g/ ܺR mP~ l4Y$a@"1p0}I!%AYX;v(u`)|!,Yza!d4D|1YM4]=dn,Y G+َ_$/I$%ܛ"tv$WPGDH +'"|řXS'bdE8<"lד 6tK;ƃN.vAr-x^!\6:H!l.V_tbaK8bEb!X0Nq~@X1j;cH@ u@]vdḧnQ??b F8yg E `>]8#}pّ5G+TŠv_zG9 ɶ"4?=$&:I#KL၃7&ي>8ݘ˾gם i FEZXpCR9=k\ݳxb58BOdo7c쾜|{!{VN'Ix/HH>x9''}9t$~{;O$/,0VI\ӈS)®]0aM HLZr}?+}/Kyu?@!v WcoFX=d֕ԽQԼa@b+m^GdU;q^ODEZ/9yݐm/zq@뉽+m{[ H^F!t*X|dC|([_/Ҏ]ڂVflz;>/+]kB ^z]!2A`ef{όQ7Es$u >Idg1>dE3W؛YϢu x+^“5ceu 9h؛bEf4y?$uM] {<dE:5R\l}lIXfD{aMR_` N9 qixkx 2J^WV5V;{3nGM^7R x-^~bn1"EN F!3fT{3\Se/4U# $8МEޛGNߓKB(f*{oiv. P7 Cr{M;놋uOɺG?H7\7JQs+Հ´V_<؈R,dq9ԍ 9drtS(} sO. [E3LBlqi#OB F'rZ'yA9{X;<\?`VjO'G B#hbO@mg(Nm7dE㩎.ȄqWU=ef1yaiр$]cw#';ؾ'w5]L#aSLQ]2X; ~ r<قŤi tc JYBF rNZOyAP%- AZ!ŅalR %BaZ$Y9(Q0eB) ͘:)τJڒaSRɰ w} L( @ HP:1LJ<זEm@^z) q$@Д`x ,Ў)/pQEaArFhDeD(]T7L(U'[~)0 DyAUM !gR rF]o"Jp V Vy )G!d7)/QaA2X`j\ rP/e>#54;j<ǔ`( m,a#!ڠ`+z) qCW/*\'c r vrX6tdБmtG/TB8nG"o)B6&[@]Q^Е Bț419Bl%KYmχ$X.1T):;o& 6&`4Z%-۲Z,%؊vqx0"a-Ie<&@a"-s iy B9MIRHFM`"-$.Hc"-q屓(==]P˶!3hCҲءi"-`DZ1 i4ly;5@Z/iy`AZ|H$Yiy_q]]H w -3upZMA plk$pl[6 r + x>oj LE#񖇖Kl;[6 1~tsǕZ;(=Bv&|e JYBF sTQZ ^L P/i8V 玗51;Q鄞܉7'|e s RX& Xll%k bp6 @OE+S^0w%aAr^JC<@΋}Ax#=y [(AfYM,XiƦK4pO S([\ l{ {ɨ~ Ϻ:\gН?m-&^oA<2KE%ȍu`P(бM! b)dӓB4'P"{B'3rSY Qq+XJ5Rgao: ѿ>]>s[ ED>|y)pT;5cʔ\7O>,9S ҂d)uS,R7p14'EeWr!)wXr'g d7eKfXذ_6(g~r`'e65?}[1##;9~gj37ZpW=8lC=\w-0'3gXb$%H9@&%W~\ ڗjʌx3ݞ Ò3)9K%-HƁpDgbvB%IbMIȔzG@ʙ҅%gJr`qX_hc/9z%oZx75%S?jL[$J)Y i@2Ȕzn;lr$gQXSㄷU eEg KȔY;bh VhB$j$q2n-5x hOFLIF Dz2Ȕjp`*e3%9KDi>HIJBS%k᧻J)YδFRhEm@Δ,]TkJr=0-}"% utaə%p$LI4g;a$LI,DZ$Wÿ-()جla#8KF\  lr#g uQX󑫡ok>r=Lz ^’39K:-HF<{KaG#K|(wXëE߄2YiA2| @40J& g:rP'i>5:X+\w)\rf#g $h#c|x6 g6rP/e>a%ldCP.H;mﲑ67i\T5d 6|i\ d"M{JE.+:1 #Ì\EmS_s&O" \-텩E(9"WKiA*+9Q2n"QT2rd{djؿfe2rqSOddǼd&rR&r ׏MF\ HPu?Ld3ճFLd_3!ȕp\w!Y+Z\=G%W$"=n9  bDd-#ߟ-y"r P%"r~k F*:K!W{aw*6y>\ta CFB׃yfE%}A+mLT<k0[*2BLDNA 7TELd5V&r5> ^d"#t<5e"냜cǬCNe%"QS\e\f"G"oȐ Dd_0Ր )7 aRrB^ fA"Ms{!l !.2YD~J XdJɃI=gh'>_ Ϗ7902.endstream endobj 149 0 obj << /Filter /FlateDecode /Length 32441 >> stream xK,u=߿b}L 4tOLٲ~W՝dC>һ#+Wf'K8??ǿ8]^z=:^ovV}|r;=n?O{=]?8{p=b3ѦŃ|_Y1[ðs,u>qpӟ΃h=p OgO1|4c8*^Ñ5 N   %x0;F0-#o-u)LUn` 1=%: % %%(uB ޳O\O:E` WpQ .BQ$BXtsLhzE(a(:L(^VP֚CCNHl(a:N}XԨbQE $?~ئEshڱUT:UXU~x5XxCx@GopDOµFnw?b~{E5 dؑE9]w ts rz2a: 2^VW WNHȸRM&Dr860roL;ˆ JQH8M(Q$q:C"4tREB/.֚CC,PHRM{o`9?xD^-[煈u,Dxw/tr؞rjje r@\-!!(?(?@5Xr v;,jOw/xKY@T..@\((jxCIw|NϫˊZB:"Q$Id֩'zyv<_OE"Df?\vK( *a o tsts |\R{ :TG5(8F&NrQ= & .*jJ-]T̒Fnkኋ]T.:"UtFp 6P9%0D)<a|1kbmPtGLϗ=H#(lSfE™ 4m[l6y!F E=V?ϫ-?jea?$?:?=M7*4tE$2 p xZBt^P\ 6Fm9pwD3=ŇyTFqK&n@IcK6+,jlSAwt.QO>Ve,j͢66-l5fRm.ܿy=Cxy:|=Rl^-Q!Q$б " ӭ?G̿aЩt"BD}>,؄a_wK9t/;X9u9Ə9hN2 d0݆9P{}\;by<. @,De E=:N'x ߿hc-i7 rf A@@*FF\n[ 5{mW! ֻKvۚn{i\+_oxF_`= Ϡi'ԟ~hR׈mTd eX.an4l;b:ϤǻoB:"1xY==F8G0GQC:հo`[BHAuN'@]H{lB"] R *`"ts ),PH!=2ry:A; mA A"A B BN܁h$(p|A eeaZm ;RDHD!a9+{m鱢¢ paQÅkh1'V`"E5(XԠ 9խ?G6Oɸd:jym8X!P$ "Ӊm 5 y!‚g,j^Vt/f0 O (FZ74yjrɱ 598Dk?QOG\EkQVQu/,lm"*ԋ(R/bAEq:"6 ;baT{1/DIscժKRUºoq&YX1m؄~4i؊D=jXIJ%Wf=˸I>\uy;-y|9;8ioѸyhiY.CS'j%6Q/Hp>D$C"%SD_~{/+M2nעy!kz4`,8 :) ls}^gJ;4η|y -ub6U:bvwtCo1[L1=@@ wze|kz~.~ r o+YV[6~jwso9\9Ks?oVkQ7̍-:۵_֦\z 7>N y!b(RӒ(RoH'Ӽjr*}'SF<9ex|?i] 2BOf~6Lf6Yb1jEV|&6YL^-V[k3 43fpq5c(c$1"amhIb5V!]W4ۗp吉VԈ8eMk"ӊ((uۀhwIqޞisc3(t4F7^э$1Ի퇚>)h7Bs2yݵf.V8ÀƑrkZQ$@p53xG.-HRэK2TOPg㵚4NO{f)̸ǡtƝLx\ >q3{VNj5:~>NF]Blt6d<|~ذe)ij_Y \52XHwӴ8,JHƁ"!+(큪#H&^muPA@wvD9Bf{Hs(v̎:f{@Vd֎/!qb(W%+88)+bt"C٦8^Afo'8(K^8:"!gjmy2XgH#EBl)vxm)>H}hj"RR0Aj u$1i0N 9U!{UX!fpBLxHxC: ÝَX)>N }# im=~@3qx:hhߑO߱чx^R<8OXRmFzg};;:vM8?K6F7m#&Bm67jy74>F,!C@ H.@{k֖o°9(N>ɕPRя5TiQ}F iu4| BMgȫO7@|6*}:">~?Ę?ARL:Y FEX\$Nt,D.o,/\Ce|qydqCWp!+XEtGC$![9B^v!|+GS|yEgSg@7FyEFr\.B"d8/.!KEh}6 "qEZGh3ԳWxYC]XM[Ween+V_H(IGb#< 3i a>c[lC44i(_!x)NRޡEdx%ݼ|šN$H$ɘdL2-xu^x%8ӷ期5c 4RЍ1$ccZEhbAk7"sA+Eɀe h"ib5/DR)n%!c(B3ƗmXɌbF1[4|oWF_>-}<ﳀ?߀1Go' ,/,+,'8,Jp4Xq5X(KXX+5|hoC x'nD'6mz!hwRޑ e4( (RH]VwG̿1I,?X0ICL 1Oaf9L|ff̘`Mb:MKie!6 yr㡫;bF: mوk6Ŋ ,Эc3yƁ0L\ }CNS3Ah"%s|>"sMp?NN}E9#nPEr+<\[H򺝾-{^bWsb~N~^u/>0??Nt>~:B;LY:ǨRHگW208)+snYA@DC5Dġƃ5!ܳB XAXAXAXJ ^1ч~ gBIfEb2&^I88H;hSze Shq7 *aEEE 9+. P5(XbQc(ϻP|T )pT׾7PTsEFWLFU55XPcQC-^˓Jm03QhP)?РƉ/+j@W$2(68/+*-P1fD#]8H8H8H8b"@v.54q&q?"H~&$IdQ$,I+w~ĢE ]^E ]HHHb"0fq?vxoqt<r#3 mX̀D6Z;C\!>W/A|(v|| Q6MH6"dXl">DDgsd3hg q 3HfKx%O""!O5r4nX`cb9͇,BrQHHÒ8q}~(|:rgH:l`H`S>+ ll l`%_6S0xM *aEEE—V[ng0$rM Վ<9k~pA4o,s|I7>݆;l)&ξG Ph=Mݺyj3"1"1x%1N"3"13x_B&?VE~~m>8,aDO_F93"1"a"aqlc8u gƩ>3"1q'Gs.8M ҄5 kHFnf&93֔fQ$Q$QHߌumg?3Nqq:I3W$2(Tf0 1"a 봱q}#c |f)UHՊ~dfQ$>3"1"15q'GS |܂,{qw @@`_HY@m)(͔S+ l 88`e6˴R$l`6q yV՚ZUkW/uqVk?@2TJQ3$2͔gJEEE8qѦ1TiFFŚ,^I̒ȘHd{ƴ;B?I(}6<,jHb+5|YeQ78|ytŽ8eQ×E _WjHY^d7y͛L7ּ2seee $3x%"8`s4i v%h:|VOnq}?VfWkgM ZDhDh6Ac &Hdx5^I6"DKfP P3zv8b@ P$3?W/o|#sG GG2x%"""' n88R&03xYW+6bDfEbZ8Ƨ?rOi`E  0| 0,ja']k #"1¢\S#!@a|O \@!ZfEbDfb^I,H,H,H폢8w|7n~q|Yˊnu~"0-fSqJۜUmWRHm"96@{㞧b(RHm5JjfRv:"u#܍U݈WR7H݈"uc֌3Ԛlwc9֌p҆OQ>%OC3ѺIQ EkhQ?XU~S.p *h:`_~W iɞr. _ ; qd+C MI.FV_y-W$.[Hr;_  /hpV_FoUD5>n_ߪ6o+ߪz>\n_*}e:8_ɷ6.ǡbO.SO1^wT TL|r1~\Ób.v:xb0%Mȵpcu1:|Ǔq muܨ𞉂k ss ܶB=PE!ls[Ab=^] U7nݸVgQm+s fK粽iR-U oҔ Q煨)ժjqs֭"u;- "\89+7.<=]E8DxVS藡11q/+1y! 1i\qLdthB7/DD+D+-I҅n0KYff/{y@",j !q16QI`w@ #1?dQB,j &*j 5N@+)˄HPam5ecHH;hBjtJD4M+Z@"1II CIх曙H&lih]G` E W- +9!n Q$j!1Ĺ!!!$ B0&.Ȭaʙ0q!)˨Ht 4իOtd( H6xYN""Q7s u u uIӅz Q㸌ze)vtHt uJ2(TFFFF4s@S5(8FF0]H '1ҥWvwnX,23"1Lәaaax t|;CtGiiNtHttE;:|+-S ^斮#RI#6I#4I sK0G s WB9rg\* $i#q$h#i"hNzAX}cQC\Jvs5ws5 ;~>Hʎi$؜%ةч@!}Lp67$wls=rB=M*)Z6&WkG #lXLE2&"d(64;L &"M +G:`e,^IܣHܧ r=h4>/Dstd6P$@L A@7nar*ݎN"9(@nxr4l$#Вx%@W&&P$%P$@LE2} 1y{:sZ|Ugf`D9R&"lTM$@l%Zd( H&o!;" MEܣH 4+E.Q$Id&SoVHjtW|S!EEEEBD1L1D1EUvG,E.@Q$@Id@H5iÈHHHHGiZm6Qc*74~!bL>,j|SfQ㛧k|"'8|s! i5qE18(fQEb5(7#KstO`jeq4Xl +쫲P$ p:@,W6@5TaOCȊZ!e( NP$Q$Q$4,:1f=7TAN*I# I# # B҈AKFЅ^ gl/B[sW҄LlH#H#]1tQQ4ga\ahuUĦ^o>hE9VtՊxN# qq,P\H`t&EB;fI ?.\BU"ч"^N'P$HdҬ*M+Ҹb KcihZG`hn""1o +Zν4hE%DeFV_+"^Q$^Id^%kjWb5[ #WۼK2|x!˔QƢF%~gyXqΜ)% ,[,âԈaQ#1qR6HXԸ@⻪jyZ2̪Q.(Rw:'~C qˣH-Wϫ t[DFS&vdMi]#7+P$p:"@"7}7]n O8s["@GD4oH"5*UHUצn´$0U+Q%Q%QZ5*Ԩ$7dT]?k/?GU\D w81aU;Q.]Tz 1ƯWƗoRLTķf( WW&1N gUDup/UD5m^oߪ}XvBs}{Nx>Ep>ގD#5=Kpv.tt1, r^M-/{;1աr8z?pğjɻI?oiik4-Դݹ 6V #P9ýMuQަuoH{ ToǛަj :~~xTtG,gD B܅F <@S(O4ВL-P$H䞧 :qn~N:>>{^ЈV+J#65(Aνxɫ%\U  ,hF˦dJKr;·eV )@4XpQ\ E .%JJPWbtC |{{$BEE›j2(o,PxxS;y><ǹזX7(KtAxw 1»;$t"aD ;RDHDt"E"Eh:շx |m]{Bd 鶄/^#5p٢;ZvE((jCI\}WsvZӎ"]<lerw7@tG, Y&((t5rn&KLee/ *{M({Iϵ疣.GIpK<&|yMګ5tȠz^~*oX<ԈޫF[`DyK>Z{ -;AErl'0ZvwIZmyKzJ-f'<9]Ȧ6gF"Uk@0*3eZP#?` nwA7QEEED:,@GN۫N۫%5X6NksNk1muܻ-|{@ܫbqO7X3t&vۀF|FxFtok E۽N,+a 佪PO9ܻ?ru܆E&` oI 57nLFSq44b1taKaKaKa;O"g( v0T:ER f&TM _wpbxig[ qt 9(fi82D2N'IdiHnܞ/#dXÈtG#wt醖I`.ψiE5S__ / EPs_h%_]v%?? H3 EChnl#UTkgaǩNwE4q^E4-Id;3ϗd9DtwĂMt>N(ӽ*aDnhO#hZWS1>?/`Kl D+M=K#H#Ȏ] GBd(((y麋C%Ӟ*i:O۷ubDg /&\0II,PLLvW` `2Cb4>M(t3;$PUњzњ/ڭ|}~{\ssF7Pw"$2U,`w߰sxoM>.VH|n\HVHV|cB:[6.aOb%zA^HTAuo!s 11* {l# s*\QQ=U4b))h}fdXSbD[(XH@Hfd OvUkFs/n687X F ؑ'mǹX%p[B0.X@ڿSƅ4# .@"o,m:Dɇ $^sX:El,PM"w6TEZ6>-,^V- jYX;ױS83| \oppfԏ 83o <=M01g;9p~~Qfqy"cyG;T4~rG4:{r8wO'c\lD6#ηm<.p ]le1h g }h=;YP;M>=;z\/hY@A7:C7:^V]ߢiĄ87z#nt*ݽ"65Qގ]1xb&lb>,NGsBI.{pĤtAts O4's"qhH4E\{µ 9s,:6:ieg/4-(-( (ia1Aif"N36Z'Z#\СBNj0hr.sG \-}d) ҸHS&EE8F" bbi4@SOaDBx8a^)ЈHqs\мsW4^:'Ë"ocY0MI'Q#0@N5qbs$ u^Ex^9Mx|&J7x- u#gQ$%XN{ 1Bo%&[81PljB>ASĠϫhU4$Iv߼\EsAAo _tsP5 kN@m+'77y|{-8IU2Jav8ao& -^/xYy ,GIZG\,#>d{Uk@\E)h"̏"WYg{H0ifyP$GJEEBEB 7E+inQӨ祋:l:r:K;B!C^0>s!P#v܎a{H +yy2x"q-% O-KaċPʦ]E2*^"C)Oh)p864DC'69lݵ.ljK'a,D6@B-xJmhw6'x'^ m(!AE>"_req킮j@L"qM!^MH>@K2q} @ܑxX@X@\M!?5ċ=?G{MLhA ((*q"LoIe"qvZH"FnH[B#)tH\M$>2H%UQh{ B7DF((fġ^lY"9 r|E. 9J_rW|E*p:==0o<BUĹ8ѾAUI|FH^U38юBqvQ(&WoH"qG7h V"qw*pp=068#&0D(QоnߠD[Eho1Ȏ9U`rUgB(oH7M˾A^} ЈFw!^ >sHff[YP"TYP6 sV+X!E\͂g8myr|H>lk^#ޑa?TH1 F&ƞ4>,`H&C ⒚k-p:R@\L*qNprjPOc@e0 H#OHmiݢA7? I`I&#[ĕ6ye'F:҈|҈4A䧍faņ=mwo1P| |4((qłE;b4ٴ$ӌ_qpF"x,:ܨ$28ga#HS.9dx5Ƴ3ı8Fn7Y)*G_Uy4L$v\\0e;Ȏb.-/1_p e); icRbWyX>o|jǩ8#P$K.<%}$co)q !Bp= {@wgt.Ԇ&E~3h=IAy6Q"y qĤ=F''ĩ8Ҟ'p' '1P$.oaqx |Dv bG'^p4((XHƹ 4tuDL#*DiF4J'cDpB4/DD%bjQ߶s,q 9N 4}@Yǹf?.SJ٧ˮ}c~;6l t6tA=vlb/O8e)eziHӂ 1 G߶PeAj.qyBDEa4p8b5;A`oٔf*Ϳ,`D1"1)DMgrP$X4,X`ˮp*r4F!ƈHWob*tm uK;MFi2XNcc Ec5f0S̰1X}> P 1wOLaVh^FEj`g!MzEY= Vcټֳ4` 8 I-tf]#<ɜI糓#K_䷤ϧyYyZ,yxCl;ipŚN|vG*u#a"uq%nϞbpW2y<{/ V|yKtΑ\-Dc!^óss`ѹy!nkt'ȝqji8q BmuATm U[[_=z Q[ִ9p7͝\>YIVSS=^ҫxy}QTH"u8ii{ޗsyW¦i%MKiZs,(F'Ng5Gb_ؕ{H#(8####,\ pT_q Wit!E"#Wk(sXެ5 &V@TtJ>Z.Q2"ksGbx=\{ۗ%088~X90]Rꤩ"[3L<3gxFNN7x% /I0N4q¤GC'LB $djM$k_¼hA.stcUXEXEDUqnC#J*8ܢxI?7w&0q ~\ɏ>r,]"_ 1k&>W7.u$c|2|rQwH"GO% I9v8nGM(BQ/y݄rm (gĹ6Zb@l΀^8;AbA> *j `DAW9^VfKtfp}~ ]y2J68f@Q680΀DE?q,Zf")3ei7R# B N\4q"DC"qpXCOx%qN"s"qN5mKGЌff,ME3]H*R;|ۥEc"c7pqL=44aDCC #^V0)&.k2iM&3xM̴4Ų0MWs見= A^V $i+ F$Xdy2Z9FwSa}h_KhmtOK (/IϡF}A }9c^sxH.V{+`Q/=t11sc;b`Q{b>H8$G;Fh+myU,}ĉBMmc %>K?C^B}HWk/s3_яB^"GZQvMy ULJ8^X(^"/>P$Lj,eh@cH&Ga$@B7־"h+@Q7IC|K)Oe4=L$|?㋗((jAƗEE"kx%AJ"Cg,x/-Ջlg|(P]x~L,4UdBq}8BL34{;M4=l'I3O?9t{s~OsJ^H#;H g;HlP4rx5r8ÅvzX9'8'8Os< }vГFCS}5o~O# }Sۧga)wԣH" >mQ$A/I?N 4k?^ ^!)S䋕UBlbmTw9y~#>SG܍d T'aQ330\QWjyH<#igх3pdy<#C[(ȳeyZl i6"9p_}K|CÆ63C8sm 3gl=W+9:؎# zitܠHlgp&qlc*_Kw};Ezsm 3x%g"8hs84Pa朶hǕxw99 }^ ^ v@X:W/Ns!Lkgt,;sL昪5(((q h%hZr"14qKɸ3I33'?·5!gJ3qܟ& 1(((qVxJ#"QK0^Vb6SWkj90:q23W(W$2JgzJEEE'=qdQꎘ L)hGCFcŊx?M\h1qq2 %&&J+4Lx%"gxsȢe&:\O"?y'> n~SEAvyc@=(F,j=6e-<@Q4@^,mӽB7:EZ6(RoHδ8wp7p.t;q{?47#`_70m_!tmeyzw20+ULTi /Uʷ~_юJ4s'#V^vGL8~PpUxp<_q*綧pGO]ԩvV2pq| =;IC|=$8>aጶK7%uxp(dƜxpU'pQw}ul#'s017y7^LXwnݪx?!XǡB9]l/Leu>O\ÈB(Պk\0\F#xY߽ⵛvdXUF}هj w9GJ\9G<#^FLy8] r5" cr9GZHlOd#i)y2|6xko8vQnCnA  H6]`~ fo )>}*dDw'`{=,SBjpyB?=B?>>@'xꠓ)?V?0C@!hĔ E<Q"XE>"Cv#!`G!/H-j!C`ETeqQxwltLxtyGw%F/Zv~5wmI K+ȅHdц@e)c';vy˞B>F#d4#2|d4y2|G:Y!CC|s|?#Iɣ8(P]" ӭc.;Qo9b (.Vv/; )Z)ZaD yb23]1ɫ8ɋoT# |=5tuvcbc#t"jzGݝUyBz y}sK[hn+VEP|Xg5|ҫ7|Awx0WՅatbp ܖd_сْM2>njDM XW>Q@XDa"sb$2Xhw<1 J )9aMJPR#"J@^`H,@Bw {OhSB#?⍐͔tKEcJ2 lOQ,r5"@^hXvz^N:l۰[O4+]mxeOy9͝h]ܠ93ry>MO4}Og'Myl55!G[g8`|| #/k# GwEŨY@G6yV,yXTEFqsSp9kF62(Fn t\- ;'h_1 u=I_$cJ,Sle`mhUwH.\ zWd-EfB)η5ښdG(>9{wjFE`oٵQŹ6t?CI(ۨ0yA+NQanڻ ./dX8 @ 2xIͧ,lMxOD2-\Tm}6|jpp$Z\.[,mB;[v8ٷNRwUv$575X:Vw;vyouu-?LS8y]˟"ؑݬ._i+mVKm}37n7B_ر!ͷcmgX^Cے(.1ի.Grۅ(r| ;[ɉh6 d_%<8`q\'.'n8[OVXy1]VQ;vԁaw J^]&Nĩ׶=Nu<tv|s/F]'W~j)?0N N ֺܲ)8ޛ®\gWK_>[4OMYڶ(cpdUq-Uw5\ךUQ*NMak6u4#z;lJlʧMkw.d]?[1|ݠi:RVFQUřض8ƷCQX49E|ەء(~qߴK_*.YZnE"S@6&\S:S^ Guz_N 8,c@5CŁۜ0{H&#W?ƂdL$s7<_#E egxeS1ڳZv/vC#s{v7=ľӁ`#錚A0.5e4ꍚ[+NR_{+VŁT6v9˄ #L;P~^2!7r܇׽[@d@4wx}FWd8r}/H@qޗPX`vMt.uvo">f;Xy+-'K'`k/@Zmr|9| R4fq~-G>OH~{|f+ i]/I.n9aӧ (>z^&^ _fD~;b~G=lm[7}S}dԛ.ޜeCFl8[!6w_s]:kݞ nz;_`hH@īFv~K8U"%JZ1c$Bgb44SJ_a/<]RVﹻZޱ{84rSs\G9k@ S#+BqkhC#Vp.LFdqQʸL3t4y}B G~Z#I0)ʎ'\ץ+0I8ɖoi@4pK_wo)?v3:?/?ۻLa?_ݜ<&$Mw_e\g#{/8 +X}"4Fgqp~>wÝ{m@_χ?_2oXi zb~}5o64·J_RO߾UJ2JU_V ]&/i[|:|/_zr1VMW&>܊U+S>^[Du~W&C緪}e10<MVؾ٫Ox _ w]HP}DH k:$)ȃ޽<?Hqп/|sp__9?O/Md.Yo90qq} ^0|<GE=x;#5=p}axX 8|;[(Gdu뎻k8;@?=m+3ǰ}sӖEjZn;m%bzn6Fzֽ"vnt,Po{u;z;$˧uYon!B# |}\axYZ'hIDC5 : ݄Ow⩧F EB;'Vs4~rW-~P$dP$d&S"QoEI˦5% ံ 1W$=Y5#\s'DA9qT!kv,Y#[>õ ?5`ؑF).V`a^ o^x=A=\wiZEy@ocd9@x ^ ?TmI#+-I#i.WنJMsx6;'X;U|1&I DEEn} ӭ-"H[n Q$"q:!"aH"G5=:)J^Z#R\itxEh Bckwxnr>G:틢:TÈE-18G7ǼW P(/_O#o0pGpQN{ # tuw|5V.:195TF8νx7Ϋ&J7Ԉ7q}Fgr ˇ9yUr_F9)e0W0  )OAlE9X<[[6BuFP$ sH Yěcq rcSr'w5"XVpQf"C鎔?(E5d t!( PMv/^ pn$2 ]8|>}l&׈` TÛQHcFo۶A\Yj,/v,+:,j./_.cIf qooeQ$Kx9)JbDLwG?"B4iXw1"aӉ\\5r r].r#0ӴfE88?E%m+# 4UkJb[|Ib:CÈ6,qnю"юF;.B}WTSf5-_ܧ M4voSOSAm |Ft ߈簉bm"˚]9J^FD`DlBD@t;r@WH/&WkGX8 .;9F|5@I;цN#n qE2 4❲i2 XwF9 8LE2 5ַ0 M#rtK.M#/D9eѵ kzBz]m #ԆA_Fv[xQŶb{eᮔS2peaS@he5LE=d^xAX?x;bQ#]FY@!el[P6 ֎"Yd)4`D,l#=rFp}:py"2xEv .(0}fY׈*,j?#9dTa?`Q5?`QKc9%!x?x! tϸ&.{ kDA_ÈB$2%-d"ÈB6xn.)3.>*i[Xl?WPVP$ 6, e$HSM$Q$Q$Q$A4PlVÈb ))bo+71B|:G~':J׈m / ^suHHd Uc6,D"d(9Q搮̡;bTFwm mE6l1ҶN*-(356ndݹxIֶWk gwhPBd(4b9G|sIw ?Oɬ|sM+%z@XF1 qw|שּX!9 tuQxZxӈu9ߴ;=z^ _@L2{,HܣHtDDCc!BEEhD10:[~M#ցNO@>f~lln#KA+y,jqA<5xFDɣ1GÐKo/;9=j@*3ﺙܱ'`ǸپF,_>Hb?bxMu(N"]x {>`b{|Ȇ=-`n0`w$>NЬD=$^s*P$@G"Ç"F5xXF,C*؄ hST;RTs)1R/``D1|=&^%t^ܠpno7AJ#Om^!%yн恥  ,P,] xrBB|D#>U&TwwjNIήOg:{EgC(RgclQfܿx%/ԲiejYURݙ\Ö[ #Ȅ [Ba_;lzoqsc8ۢM2rǴ~o _jykYn{+j.( ET ,۲ Gr!;?9suG E͸L?>#'ѱXyѬiV٪i+*86JgB_ZxM9kՒb1_9`ն-z,'F ,X8RQ Ž E37H= U5$:y(x>#r$gQOsaѧ^ ~M筚S٥Գ9oRrαS ҆eOͭјl&ƪٜSFfM,5RX߲+NSZơh%]<𩽄ISAZݶ]Vh3[H &ƌ^_~EKsl;}@t\ֲ!SQԊ_4/m?R6}th^~t7KβUΩk vn±j%7[Fe6 rg,@^k#l) O)7.-~[qμJ >F} APZQyKv7Q{T7g<(H($^ݩvԵֵK)C7ђ+Zʎr2~]t4/Rt= fۑ* YcLHcvJ}>.fjn%4Â9qxBa*>4aɬhm<#RHYqZK{J&{62L·GnFDu*GrcqEL ӳZendstream endobj 150 0 obj << /Type /XRef /Length 178 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 151 /ID [<218dfe1aa61a697e5a87ad8831b788d8><3755f1807b87d285ee644e6754e75906>] >> stream xcb&F~0 $8JRDg:dŃBPNJBU j n  ? "ŏHad "$#ͽD  ,R"H;` XDd -&b`H4 S@6gKA"z`'`r L gaL endstream endobj startxref 329333 %%EOF gstat/inst/doc/spatio-temporal-kriging.bib0000644000176200001440000003163513777370515020373 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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://www.ij-healthgeographics.com/content/14/1/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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://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 = {http://dx.doi.org/10.1016/j.tra.2014.01.004}, issn = {0965-8564} } gstat/inst/doc/spatio-temporal-kriging.Rnw0000644000176200001440000015665013777370515020412 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\footnote{\url{https://cran.r-project.org/web/views/SpatioTemporal.html}}. 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{http://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. An animation of the entire year of daily mean ${\rm PM}_{10}$ prediction maps can be viewed online.\footnote{\url{http://gstat.r-forge.r-project.org/STpred.html}}. 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/prs.pdf0000644000176200001440000020413014127330264014417 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4118 /Filter /FlateDecode /N 78 /First 641 >> stream x[Ys8~_TANuĝqdlj3Dۜ%De_.&l g?d)fLeacX2Ij&8CÄ`B?Lh1pwx&N&EesJ&CI1N.*%SL*Uh̴0iQ)ib3EqȈY:8 fCqKkbNbpT99R]+Ba 5\0Y8p#X$ gS,^M(4[,['-Ny;-h3CHHB Òt!VȂ, P*" P6@ka0=KҘ%i 65 @)*Qd`dAj#be *8iQXV-Ƣ <;@6D{a `!G#,8dlȂwt%8?n񠳇1 ~:e/_z{n`?7x&(O\ 6` e^pOY>oG'-I`/ ^|/&Kt>|11:^͗rHR G՗ûLiL|,j7 F7䐖_n"ÍP: dfԃU4>xwa$w4&&2.bF|@x9_-9H -& IJErp~xS|::@$eʲ%oG(lyx >]&~#Il5h` 2zp#3i\PglpWYeǶ\ ȍgagdj8@"ZХ@H8l6Z52{x9qy9n,m9s]Gna w`:1 [aAgeS0|q?B 2)abK\2ZKٛG/Nl<$[|Lf{eB~p7Z,,,^ o#/L4 QL&c2IHu]ˑ/q?ÛZ;'+oH@) Nc4X="MuV,\ n }0E kg&/.%9.~i :={yLcE,lt7p3f`#4Y.A1x"H+Z8#<|dY'|qu|tRex8ͺxU9\9 ICi  WI֓.3s> |.F8XU +"WV7 K/-1NX$l h u&.X{q |\z8oWS'T&L_.D'5|X鼪_rQ]9Pa-) JƷ sZ ;)vΊjxP[2%!3?hN!|a>&kDo{6QG U)c4ʭJCT`qip\@} I/e `\z.{RjMR4%אvsЦEV> hUXI=vXU#pFv㯚)mA~aZ]u6#L .?^`QOmgJ&SOPU"g:ޡl]oٺ4m0KPH-mvG3`-{ 2!m}cE\#]})}sU=|Q}ֲ0Ok,Ԓˠfw3v!BT8aKyͳ yr?CPNCaQCz Vw3FG~.u~Z İ·2ZcV 6o'2-1+/O<ݫy J|8 R֠汌C]C2-h AcBPMP#ԺT)oχI]8 NV'FlNkMއ ~u.?bq|.<ޕiCf76xG{N-6Mvj/?QߓNΎ.}.lUw(-ë$4m=,9z VHdyd`5|&ɾ$^*Z5EPμ箆wﴓ:x[>xzpv Gz->Q՟r#t͋5'4_ۊA( Ot@)ſQ*:{r=YCM;>#WvZH5f=-3ZugAxذA2CӢ,s[H?{H}q]b"%xM߈S滂}2[-pHVN .~; \^0HOO~iʋמ{ <>yH}g iiGKUhS齯zO5Q]'b4#N}lgT>2s/x!o5ċxŀ48J5쭑{Q+!4WQMdHOˎ'Դ崝vT L6jU޽z}Gh{Վ+t+yM3;i&._oץ_q##Ou9MI2N}VN$3?OKG=Esy/Vs| e'_UCЙ{ޗ<{mEWҷ$I?ڔ./>[Zan!)/V;Ԩs,`hK_JuOAO7o>>}Wo!R(/ިk0USk6d&t>-E04E1-4rgծ]b]%u؟J:O@e@!oo&2ch kehk,2L?򻀗϶0 [dz:xњ.wfQ-z{~Pt}02umNLȎܿ\rm iT?({ImoL!VV(H!/G%ܯ9I?x?_ uO_$>:3v@wWB"`68J|('EKJ&h>Ch֧9p ΂оzB `9 㫜CAܰC$Ko(G=ɋb?Ai; /E}BU2eTWEUV 몼LE1]5E_㿣'm\87Y@4#Hj^VD􀾺E넊3~ )j6{7>]_}>{:~d<ٵ%٧][qg65d+鞝XπNd'F¼oA#Y?+z6a\ueth]7jy8"P4Pk6Fs[@l 8S)+`U3TBE4Z.O/^\Om"Y9vlؔ];+n;/Pq!+6*a&Um'[-$lcIԜ%X?&ddL,nSd*W57o67݋nD #[LarsS7ڲS53t͍_9\I43z.ε=yؔg϶gsƲ{O4endstream endobj 80 0 obj << /Subtype /XML /Type /Metadata /Length 1549 >> stream GPL Ghostscript 9.50 2021-10-06T16:20:35+02:00 2021-10-06T16:20:35+02:00 LaTeX with hyperref endstream endobj 81 0 obj << /Filter /FlateDecode /Length 4581 >> stream x[[oǕA/I<_xv –dwł&) 99i_wS3d)XJէNwN0Kݬrܭpa!uv3VIpW*ǔ1j '7oǓ5cF5CNjF2>Ioz&n Y;e ia0I7o^%Zk>^Wo}Wa˜\ 5{l }6B74NsʀdΤ ܮ3j+U#ɟV& +!gncWh݌Ú_ $"ywI= =rIha҇97ޥ%?{&12}[$qn8Y0fb Tixj}imL|CAV'_Ϸo\ Z9]NW.,Rt #x/W56^K ]^mZVpyَEɀwZ1*z /?o~WzKJ$/%"wvr*s)vW?/o[ \*5q-,$ÞbՖҰ'=`]JH`FאF0=zXb`84 vIEzkB"*Rn5M3L\Y Nho8r:f0'X X0c}la䙗 JsA\mQ;teva0{Dp!xa_RhI7zMou^/y#̓A liLe5LSOCCC04߫'C$-f\Z 0Oٻns$VLqHQt1[or~K/A@H~<KqKU\�e@,` V|6xFXYotC*Ptm.1lpb!~'= ʧ'%x PzHK 9M|plad"( OETi@(yMuV dt;i}{CO#Q8Zl S bD&)~։{)%c`R) !]#3ɫ̈ZZ=V+{0I*i( XLԀ,a3:k\I6nU֦ #IH0]O+qH$*y12( ̷Bw)oIij=2LwMXqzQ(HT Z$eϐ,YʠʐNVgWU5w9TI2"x^,:.#httʇX4rjJ\ixzRY i@,tQ>Y.]968<"e2Y5L Ƨwt 4a#(Hr_ϣv6Qn/]gK[Dz;5" wRr/T*3T7iT0"+i";88 ]]k q1]=H*l!CGWȉd4 ̒x%O¨,~T2Rw_.:YA樏؞) 6@$i½}ZHPA&$oHtͯP渶PR沊0:x0Mgڃ?49ًBsI_ߔA3Z"Q\!ǘL)O<;s} $T*LJ}. B^. JJ(P{i#aF|ݰm(!hz*ר ΋knm}/0M0wXD F5۸Em6x]1}_@y緥 n.m(=-xM:} lm lP,v#Jh8{FXl. ݹ2Q4b7R7Tc;M,}/\=6*BSޅ(xmg̞vGx2X FDV-LQ}e${AmQNM [ TH֞'U5Zh&:8"<@DudMrCLUbTv9\;v% ̍uY07i~QG?%k7dZjeԾP1DDo[-dݪK*QX%W"7|[oqjy cTMuV@k˙Ԧ|j:.BN"2JQX2Ja#vR6emHn ]6ZA'#8PPG_Yv50ĀC"˅{,bhRh|$ 7Yc3V-ivZ̵$tEjl2n(r̛b/9QɫzkH۵/N4P]DR:*ͺ*=snkM`TF.n9 -qU9m*Yf<qidTw:6FӠ"g7?a3V׽ɫ\ q l)xNg^qr<HqG %pFh 3)(s]umVk(CpkEйn[Lg;IX"Y'0N7~S9i$ZsD9Wfsivsίl:S:&)!VtVt&&]fUCו_o ۺԊJ.?W 䮺%Ň룐xeuM[I{1ep<`z;u^}#G\V8Mm:9MrvEpԊ*p9&Cb$\cP_M.tdY <ˣyr<}L{ʂ,/-ܾ9Em&quVJZw+ ɤ5*n:,#O3Ήv}mPJ6Prfn(ǝMމ&^xy';C@4R&zy1uw~GΣOk*w=9<\gSw3KW*ORI᪎2 _wBl9Tg^=*h?s_יtP.g%P[|mQ<): ~PREnыE=zOVC+n:JoɾveGZw*K?Dvz!Av7E$VyE~I?=i.X_2Btn,EV-N-skm?UZ#QOKSsF'zםDg4uY#}|҉G=[GYPiC)^}ǺCb56㢇~!F<ƃ"v&&.BǏ~aSyؗz6p'}1}:[NAL~x/̆^V_[wMO6_o0$uҮ^r5-\,fC64t@ =j5_eZqW0/5>}wv&c ! xbzmhLi+nkNpfwH4,go,qKsVkӴ2IrvQt}FV/a^󙢅,q9!j/Gdï 돷Ӌc}-~_1<YBjɳjCYP-yLqvK Uhvtk*geɾ$* 6zVGy\?4endstream endobj 82 0 obj << /Filter /FlateDecode /Length 2761 >> stream x[Io\sI4[r0 lr&A;"7qStoO)"C{z^Dž_7?^ȵ 0":',@K!Zx\nB``yҤ&7iۤ*%b˷$$Z"Zo6móR,[->06L^:eDK5ey0%1_[ FX+),c}`|e>7etӫW ĊhvblgR鎳\'IM:imп ,u__&Ly&7 YPJ 5 MXkJfy}"YQE #8_r.3+E׊m<O# AHN$ICRͫڈD<jd\i8N5QQOHЕm !`sl%Tۦ77K{ohmRoMR/1ԋP/Cx 1#NHbKLstT'8{~>:=]rIf9|nR?AZr" [5Idz3ݱY5kp‚;[bTw%#mnjg /WF\e teTFj~{7uяz/tY<40~If9L-Zʑ8 H $QۡTE1e1 "bfD"¨+"=Ȱ 62ܤmOSfl Mpf,:\#)O͡#t$Sdj2:C[_BGN/ӌ4~̟KzE 9tX)sg,`ZUv~(Z P*2cv_c R۰:8zv:fр qïK{oqgw.st;O1n+ #-qi@a| &fd}we{Y@Gۉ#;=,.hOmr(0W$7@fTb*EѲ(Z+G0xW(b-tOښL!(>Z#s3B;iFl/J{ad)a˫ICKq.|64?-5iEp&J|>"+=+gJ 6yg2>([жyܮ,HΕ7%5jO Jisäc8bAyl1;͝u蔆&ucVNj[`S~aɃW!oH ҟBhSގ#8 0;p=ʄ3{ k'TP(͡?Vnԡ uQIVpxK1GCq _8 4 D2wݟ=&+糌#?yZ@ W5r8qvޕz/^8w^7˓M!HLɗWDo|@q^>7N6WFO/ܢQt ?Q?o\$)% >B$lO?\넒~ Mzm45a~EF?W9wYJn'IhG 3*шd_<lDT9Q6]9tMBߔ~a>Nn6Zs%hLB 1!jSSQxibRU̸ϿBz)RrA .B1 lEi #bK䒍PM2TP7yVZ;0*'٥c R J-8IAHv0`e0$' 5 "H,|Ζ\0΅sҠLXC2S@\zu 8 }ML'Hݐh=a77Lw~It?)n/˯;rw٩giJ`u1Cy_a/jiJL88]?y?xZV1{) C]ڝoesi=-Q]yiEdX1u}ٺ 8)_uߋvXflH&? (kKY6 b@jDq.* _pdI1endstream endobj 83 0 obj << /Filter /FlateDecode /Length 1598 >> stream xYmoGnGPU_V R'6b;$Nͬ/9PQC%#B?4#l l!uiFˌ"DIE擢[[!.FpmrtI*s ˒ɵ?twdlqrLC-iѫ,ew j"Mn w: ;vKCveћRiDD![шgSt]OT1*UPjZ27ł $ lJl!MS' )p#8brteHjDPALpTAY' l5!hX abJpr1ipFY͡I2ok'M05Ì^hUH8! G7-AxZcHnQh…1WJ#5%FBM F9v[@ S*d|NYdZ4OEejs F+(KΥ:%.8 $%e5*q԰'^4q5u.j]r\泟eDzӽZ#i)Q !\Ei Eq\iPyrl1XG䈇fzR2kW ]I5>{ W:]dYi 2vTĔa2Di 'Q}eZoq cNTCA’H^fqE(̛ʔ/O@Hq ra7k5B|LkW0tH9`7VDV ;[nj^0aplYIxtu7&%+tI) 7Ͽ.J(hԲ~Gaɱ^-Jn{'hS 9Ęn1+aHI֣S!Sn~}ʌ}Ta0NŽ؜z[>2pðn3\ Z@sen1l#Y/Mn&<:cK@ʽerkjdGr,-[gVb-܁?BpK r[(D*%?e"W|JLˌ*|*թ ץviA+4_W"endstream endobj 84 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1836 >> stream xT{PS@]ޤSwa1ve.>Qj}B<$Q Jx$$$D $"C]Т8uuv֮vf>vf;sΏ$$9y;W|e I~QX0^ߜ_˽,I$- %d/"QkL^!]fͪ7Y|mBW*UHdzB% ?]jyBofSYY!STJֿPWJw**jEtB/*S)<3gcZ+t1'df:~/x|-`A\y~Xw2 pQBhpx`.ne~ȅr(nS(4*N] ˃! 1,Aۨ>yM 'OEhGKL|JcIZjqdZE)Z> Q\nXʷ7N|>:5?[X%s]IqLJ*ImSsxQD tytg.gqPՠ ezJ^3/SVc t8#4j̵E(Yw(oًk쥓@ sU;+/:v5<үPWaW#X8k]3[)@й[3Z>S!m3.W#p .nęqa:0z.o҈лLgܺy<:fҵm^ +Z5:Y9,)oqJ EZbH{震{%< -^_&N (aV"B!!ܻ0B_2c}#4CEb߸']"׬u Yi  @Wykeu,ͪk*Jy^>q۝Bh]ٸeLԩ2UAcW3FKMͥ~ = kpyF‹)a Ht(_Lڤ؋P&wss===LXfZ%ۘ2\17V[ND=ph+x-'%,ZzGwγgU>Z~8yM,'= A9=yѯ1O#;7#6*:/K4S^xRRbޔo_Ewendstream endobj 85 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1294 >> stream x= LSgAA\#b[p-(:x(WJ-mQ:wёvOE(l 9Yfb&aܭ.K%''_)7EhG!FC+Y*ΥEIOϣ#?@ӟ(O2-_0d皭!kt:h4MEecn:XcFZ#Xs͂Ϊ7 ::hV[7(ڠ6ŋWEQc%H07/_hQTDRT$BPTSޔ/EStJur~* Eje?9c>2g~]Т;^*qmVV.*wRI<#F/hOn pH\n18zrqa}idmB!l9MM=0CeMMNguE#4Bik2ezN>>mTU7LV_5W9,{܀G0ڛZX` l.<胣@TdPIlF 3*^<`janjUX ~?&T{T{P藓a4'+{nz?J>_>j9.IsD%#݊Gp8Bޞkլ  IqXSkM}Ag7q=rHƴb߲QgӾ77asQ/*K@3-Y ה8"vZ}U'tVv4SD,C2C_,߿L#1Uy{eS[}Ym6' 7KbWd:u͂p6 q.-$|eg"ki>p6z.?l*vCn׸eMHE⫌M,H8Ǚ}w9{c6w$_dvUj'D뱿QQhk?g0Tl+۹ԊG('$xtmuiS,c~5$Ij%ղI YAݫ%@\E8}णKfMI7͂rePOwpxH'.<~ut!MR͒,k' / NW8GT=*=KŪr\[AYDL>/ 9z<=>/}endstream endobj 86 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2941 >> stream xVkTT>0㣹S>ƠA(k`y /yAF)% aDA& Z*QWI䌫=mڬծh׺{9{o>[͐D"Z'*&=!,ߞ̐fd C!B j+V`+)2?6sp{dNTd&/]5!<*5#,;))MQYnIi;bm%E&%%%F'ڦF6lSRs`嚸*)ykedoȊ7/{7/wp\l0BF4yMUڌ|7P D١ Gh rCk=rGr@hZ<FQ?h #)/@PZ`DmHIr$%F9f;͈tttt\iji$3-ie՜{x3~6.CA(o&ENʞIeXaqRf9DzJc>IT:V?:J{<3j!%8tZ3~&XrÝ-e=\pToɨmU{f|5G{U&'(I1(uK}Ϋ }J qu[1tjh h *MZA2f|0a<3*2Qɜ9p7t;aa2aa,“{M/dƃD`x*>G/vd!GN-6c*-}f7;FDCUߜǗqcIs\*s^ð9 DR!2i * ʌM,P#H'!:zD*DOxZk4y&^jZGt|58tgJF{)^W-Ԥݸܛ?@ ݰx1ᵕctڊt]5 ʻmbm;}]` t o/-hm9r-!9LH܄[+k/%ޫT7݆k쀨Cxj9J/ߦJ3 6q|t^R(<4Okzu3`&>lOP`'TTr:í%]7}Rˎƈ-g'߹0*5 rHccc2J,0^GCÉO_ ]wJ}LjP;ޟ{v2:ɶp\`{-by p{2V}zruf@_z=ޞ"vtxlZm,':٧<1^Uܒu~׹g+WYYo[q[ tKoo4\+#T/<`-9k!wl"x)k)J2{ҏe$yM!(`޶B\G4)",a+G7@:R GdQ_pq~Nr|Cc (L?w~oe 1}0v%!eǺ暪&#ޡk⼆NI9d+>I‰1bW=40^KBI}VVV Rendstream endobj 87 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1358 >> stream xiLTW1=eqޘkY4ԭ2u*m"T`d30T#;2 3, FHEc-.4VMG.:`5ЏMnnINr??!HvGz H!G[6G&v/olʓ;3.3Ͱ٭+ȕÕF.vP}0eojemrBwTaflcP&bŘ3'.=T^r[`)ydL[`k]Skog؎pLUiDHEONN(f6P.al|(aL\SV(g !yxEW>A;&E&+84N7"$7#o=cvBW&6_oK6sȓme'!gocZ^P5 1?\NN6}n9#гH}iʊمH ;P%CG.+؟%<^ @@xAIQQ C/Vԍv.Fmnx xq}V4!Q8BjtK6hgOWNjx hנѭ{qZBj=× 1>Z`G^Q6u *#p+dIϽ +@ȖAu^ pjZ1Qk## qқZ(`9i#V;i,c<3G&4Xendstream endobj 88 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1220 >> stream x-{LSw若*LuNP* qZcS miZEJ"uD0DP9& \2v?V囜7988Ηg)f8].`Xĺ04BC;E"<@x8+@sWqII R:>66Nթ":KɨU:%,V}nWưjJ$SƂRTȨijʸ_GzRgǔ^g(aTF:K2aFHc0l )6Eb"mlNpG,‡q6$de]~6 (xlL 79NY ǭG2 RKVSqyMO(*NTD(kJ+`_ b-q: UDJI.m8I~8{=gW"Q8/*~G(q:j >vkn>|N@oG&.ooR0U՚}p'șr*:OI[}@>(8L]DɻcVpߛ^nYa8P"/C9Tڲ N{fb67WJH/7\SIr?R:̈_ L-G7Z= p"kFȂ9Aj`s=~&xV@Dy+̕m=Ov#2F+~z 9{fo h~4<6}H6?LriQ"Zr{f"B:EpĚ:OcGkw@EG钦-KNvlf!+Bk~eF?b#UBp`|Y,r^:}yK^o6d?ETP ^,q{qLDш/z}#gIZOYa'h3|Ե×x}i5MMۻ4F^aQQCG47a 9Zp-a5s?endstream endobj 89 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2831 >> stream xVyPWq`A;bԞA!cB`<0FFAeK`7 *37@(9LFFUG jRgk}Q6(H$ Xz- 3 ĀCF GmgQ/5oՉ צhD9D*M:1=)>NE*~% %[HT"JEBPTHQT5L-<OVQTJPNTj&!E+D9cs]ݶw$!^zpLTZ=w?,: $AKD,ugX9Ye#ŗtᢱ`Hת?0G O2/pj9m17 \ԙB;-hJA#YaF#/^Xw2| }_E5HF^hn\xEgeG RUl);>;&Vg4ᑋE/C0D6Bf#?Igo/0ok[l[+=Bc?+u`*]]!B*3ZGpAiSkD,%|G[{Qxuwu9Q0JaW#aNO*&3q`sHɜ;=A1ORhuQYk(e"=75+oQ.W(eK{{s^ L`Xf,+8/JFR, k%E&LЎۺʢp^ɚ#g4iHKy}&8yûji[ҥ2`jDJ{&-$͂ &x 藨d^wИ_ڮ^Ƀ]JU|Z-E~EtVXǾ*U[V_COhwЮ7at@IBT2LΉG؟xI\'Dit؍Lm8LϥF6,LE#=[zXvTz ¨1X?k Kp% ` `s -K s`&ʶ%j}N jbT-vFFK3azWTB{o=*!~*e쳠aq;^Ѳ x67 1FS1 03Xr]:Y=܋!FBcg&A4gY%y f0yITazr gnEx $4_EGf-ϖ5/2mdSup7dgpykAOKq2IjtieURǬ\8tXOT> stream xywXT׺fXPj`4F5vE^@:H:3{T{Fc,Dc;hM޻4ɹ'{[JD"Yi''qDC|SI ;dΞ; mz[hD<'$4&|_pNSN8~ܸ÷z;.ur]B 2\ Td `7샃6eH 9F|ukوG,Z)"z_'U ЉtG;{*8%/O?Wz@ﮅpЅ;`lN(\aӖs VYrS7(l:QT.qO"=xԲv7M^x"U A@^eTQC G)9(Y2w&yčgOh?*/:+Hv:т<$쯫A 7ZO= L.jVM,Aj܀.҅Ԕ`UUBLW]3`m$Df}2'ۢ-hHdd& Ҋ('{[E w 9iE8}v> 3/34F+qYҊV8Op~z5iᴯppgmsHerk۬~rjBKʼnb8GWtxk7;Lﮃ7?B8c[\?_~\d9K એ>VC?&=qɳ Z=d9t`:MAS@&?1+ ('zItcFtkt#C0mɯY  ⟰gҒCQf 0wzxhvmCr 5cx+>s{;pUgV waW3d 6g}F۴020qNPApNyW}֩?R/ 5|-q??'E.\*cG85ƢfI^Lw}Zn8L p'v\My+n{bzJΧ`e;@II^eBMlMn.N^W,l@VoB=ij}CiH-07a8z4SwRo6G+!FYu)e#2xj}xҝJrwsC%mʂG\z;Ơ fzҋ:ow,6n,FTF*NP{~ؤWvߏY[Kv&='R4fk2)k[B辠?~8Sb\2o1rsfJ(ebksNP,2dIk&,5 qʭcy紾M:-ʲ!?0 N^29Ѐ󷃚jQF(8f>D5m9׍6~J! X+J\$k,AO&# }Utzf-+CgpY2͍pz^ Cs^x ~!C/ dԮBp`*+Ѩb6*XXR;U}ƄUݍǡ ͮt1\7AU8hKt.80ߘv, Rm<6Ȍz17v(鯠hx>F'(Oѧ'kR4P'sgdKp)Q˕Sj%ԼݞI;![(]2xPWC<\p [? ]2r攱 <%#8\.<+99?o(!)#&¹Ҩ%5->k>f@i7ȵ-]EFlw-{LQx2OySA^#}I]s7\}쇖Xcuw' 0x&`mG5Ua]?gJCkP=6u9:}A:yy{T|_#PȯӅVOS*NB.X.ǂh .,Ⱥ&OZ EaBIfe1jc*CBb֞ 9uct h:OY-f\cLTeDI'4((Te "9ʉ(k5 g O-(ޥkXʱJ I]=[wl°6ɋ J#ծz {{53k\ !:6#~Nzm}|@ Ljk4Qd^>{HʒՉT|$BTBRJ*Lld(aD85ћHOlPc7f~f҇%#t d?BY`<{ڪ0RRi4s=qi]]L)0YvGgDg YYgj&ܝU׿zў~s`i)* ϶ME @fMLDͥefdGG!JKrx ŃzT|c-a*+!AAQV QQ F&DCTE\,++Xxj܇f.yhxvs=3E69NKV'Z˞푕&-8Ċҝj5ZG$S%KLVWmãlkJ%~1aaeͥٹ^oi,sۤHKR2 o@V;|ZRRGg4)_a^HcJ7yR:6Y=WJؾ]-D*U^rAqf~2Pi7JRq ^fM/70avǘy:cWqj  +,7:8rW`y&h 1]`,1_8~ W˫ly?_Rlx}tUҩr%8K2K^2NKkOfAw&__|qEքޙ<]o4ЅfZO(4+Aõ)M*hSwT9P&j? ef'~tvs͡ n-D z/X.Jc-M1eX_IGB+r?rE׆ŷo?K>z=\tNމ5_LׯHM[V 5ҝy{θ}y [BDn#~w:N>"g]F{:V7i҃,:7X 4tqJR1T|Yޒ8!#6)ʨeăCi޹œPDa߉ ' xz pp"xfuvv G-#1Eoޙ ʸ]r~휕^c%C6]*ϭ/3G(をyڪ > Ub\0#V׳V}#>`3i`w5̵ָ0 s l:r%RUEUr/RdLH;/ף叢;< cJMJ|qz͗_yBt:!GWͱ8':1{%';ޕv|+A$Kd NſOAQeCtػۆ<;[^YYMӿ^9K*GDxB7$Jl鏶]ٻq6E CvD\XGz$)" H {gQ>pٙZ7qFcT\ey|gԛ9ٽ{@.nBpKV(p 0GF BZo}v.tDYu.|G2ɴ',k4s0 (#^BO)_3}w/;endstream endobj 91 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1096 >> stream x%oLw(N,u.iRsd%c{1":Dn,¢-XS -ؖW F[r^eGt:42ds 1{d;z̬W$O~cEe-mm{7zi;.(v*@{Qd'pΪ[TTҋ'#Vd߂La8nu-vS諩5Po v^gt`х4Uo2g=4XWrjufGT]CL:ap.BS:zeUiNY vKlaVݸcX֊U`[p# X1-P.uWU 椗9<ߕ߭"!X? C<*JW00LȦ"D~,c>SqEnB>Xn3geTKj+rD1Wʚ]64'x r | { ._l/O,; bHh;>KLfY<<^gՉʼn0Ih{ ^|?.we69N`C,#6irth=&D)!{Ph}M H B%E-u_(bz4}x4h#GY7 gyH%Z_-<(Jz* cP4>EBwxn7wkG@ߣx 9I{@ Y!#Kh3D|/I$UTNNо[ltDHq@p;|Qo.xe½?Ц x=WGbq8,cf&!U9G/k(^@e璅|[}.Y&Fy_<H.#>@ՋObXlA>F[_]8V\s#@BrRK2FfT%r6 SM٨Raxbendstream endobj 92 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1020 >> stream x]L[鹿wdY U.Ӆ1~CL[ --)m)PZX Ef_X25#&K_|2m|᜜sP$3AQ4t*G ._;#柬&P̏vWm9lD*Rwj-4Y ;E>]VVZH>SRRFk2ҭrk>$ߡd 9IJb^_$Uj(M˧ In%ߖkvyYEhT)'(r%Th YƳ @*b9d݆d"soWr")BpQq"Q??ԷU?ߘYZ&n& Wc3Mb!#jnxK X-J?ɬ?&L6Q}(^a>h%41L|z`Nq> stream xcd`ab`ddds4~H3a!,qnn?Tg~O$ȘW_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*&s JKR|SR3<Yvya5?X~=7DUWgW[{{[G}w+G=s;gnl-gD{Mw'PEܺZ> stream xMOHqqi 7PuDT6r{׻W1-ӽ{̥Zu3 BࡋK ~N?4΢hnj9fH >Jc& T`475&ĥwyЫ@~2Dž(Q(-M ݃ɹ&]ĖwTt%{ʞs󢫃-ݜ.[$o}uܾ*Atd.^} Gb/snkn΋/'.S8!_;,x. P*:FCPj*@}%6t'LΩ$۪T+#rTuj^kFEhCVʶc1BL7> }}fKV˔vP>+,ڶH0 8o[UCzM̒8Z?ls AЅpT.}Xk^#%d#i#V@8Na 1)3Ep;`hfF-ͨu?vd{*nkSx?AIҙ*,o| ڼ>sclnFKѬ!6H^$ Џq+Sρ A  !dRR9W9q>})endstream endobj 95 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 521 >> stream xCMR7/,B@&I  nha\mqCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMR7.CMR7Computer Modern12=Q͋oKL0bg͋§j~'eg #e'͋JiuP~>}L讧Ǻɋ !74/XWϡ=:4MFkgo0?ts~*~ssr)pt|(|trswCna  7 ڛ 9^Qendstream endobj 96 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 291 >> stream xcd`ab`dddw 441~H3a!"VY~'Y5=zxyyXV~)=[{TfFʢdMCKKs#KԢ<Ē 'G!8?93RA&J_\/1X/(NSG<$C!(8,5E-?D/17UR=土[PZZZY4tj3ߙ3{*?٪*vϑ+^~!oi웹6sqpnļ ~aendstream endobj 97 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5657 >> stream xX XWמ) uZR[UpiAqEpE$$a%7  W\V(.N 1T; r*pI6š!Re^>&C', !H\CHB(6tݎ I$EȽ"*],߾w*nk܃=a¦w'n~o)Sߟ63g}8vEE-fR+YJj65MPnXj NyPk)'jZO-&REbj5B9SS)}j5r>Q3@j5K j(eCaKFRv=5AqTʁr$,( Zp;4^fQc9<&C?dX>[⬒:xQ8soOsqX;^zDlvvO 7;"lo3j3/: 1(%Wr~5EEȹNԻ==酗 vQWt*etl84x<ug ʟE`F+5R2l ~# _uly?o2lb;A(y/(uߎa[ itD)f<6*xWۊ?^qRy5b*4%C3.Q,u_5m!q2_AX}J+x׉Bu,N!2^aPsDt*{}bsSq \V)ϐdd~T35M?}]ңc<׋JPupNerYE-QQkW÷oqu Z3? 1ƌDHҐWn)Z}Ϥ8Oi/~~ì60$:#LPC |*#Ytk98l~;bf _zS|zTv\Mw5x{#3^5Tjx"m 5ݯ1SH2$^|DFFzw2 PEDq*U RE݌HUjQbn%]*yOGwe%'=yV\J?W8qAtpwK1;OmʰChp"49u4X-^Z 4 "rTtmG=uCаx8iEx:|RE﬉=wPqyWJ JN9=eJQdZ_Ҍ+U?PeT0j:ˣL**CedV0=Q{9$~MlE >uWBVFAkooUuy-j՚"u!C̿N-]z/<-=x#O(iQ( 1[oFe=,B䀿!,E=$п=i+L] X<O6 Mي@Aw`݁-C{${ݴ:m91D&رO(ufrAjBS͉[4O1?,nѴ.Rgث_nOQ$٫DmrDH~5 ix L@iHe$3c%!ni1*ELL#J׻Qz-=w.D'ɓȍ'@#Q"+WV!J[Zk$קbG {)H=4۠M lobHJrPP%AJĬ6EM|R̽0(+-JN*H.@(7(#[.8è;W>5i!40wz8E/XFJ#Sd5.Wqk\ EFT\0W\!ꩲk]xOd}ח ٯ )>`kɖX0~!ߏ g bh猹 WZWuK0L'8*XjQ K~0h`L+vE&kC|4dw[t4jm=\MdW?¡:]#vvҊZ88$ڸq}tk /6CQsb[Fr2Ư_1&Tep>N 5p;5k*K.Fѳnzscn3phN*ݭ&`N@jv;t5sXy[zygib8]?V~BYۧ#ZTZ>#6hva G "߈z`Y#EQ.V"{JKT=%xkP.fohYbwQ2\tD'7P98OaқwI˒=T$ )W6zUvb%.G DoS]AYlI֡<^MdU)nG4nMFY<@zYPHjP_6Ծ''$EMt5-1yRL~r.f`A1FhavbRQ --`yF|0,.k;,Vo8 ٬Wmt:E4./MKJ?VETdzoY^?szʼ4届d+0".96w rF!(`'^iZ# %~ĚL$'/e''ISZ\9q3a"əҦgn@zɞuzNӕ$^]_}^ML{$f< UmIBLb Qs :5CĶBζH75nl40g qRaš)Q#˔Ŕe1)*Q^~|[6 lq?l1.xsl ) RS~D}`,?w<E`sT+;}#SR9iѪ4HRf;uΚ$2Ls&uw#y6녟]`RR F%<4Ÿ[^Gr8xۇ\n;v}ŀx00guҺsŦ֯tvMP/Hء&AٶOΣNaZaq@Rcܬ(e qԽv38o P#Ո+^:{n0>++LLUF"Nyۇ8ctcEnΤtAu .61pr& /,L Շwɹ\(RUrdXsK\}7`zP=6'o1 EҪ0.),3kw.WtҿurpKrυWssҒm3Y0 > a%9dvMՄ-&78^],Mn=F l;=]UsRXtS%-4"OƝ7;њhhwj6W]w> stream xkPSgOQH3NV='UDžt;^mmܕ."*"@C  $%H-! oMxѭN^7tglgv?tv·s·}?`'ٽnޱ(3e,XfXJUNw) TBuv~0}Vg,*(˨i%8Gn8 ʙOJEfQSuյ5ܡmCw5=<"' k^M$^Q&9Oܤ6SIs&qcvԐ`w1|LQ!@eݰ΍ũ։rr P{*%JY}S[oZɨl>8I[ҬȨ;*NP}ij'+(vF+̪SJNgKiA]Yb4~._'P}%XJiWٻ.f;4ۻX䙯euBe@T(vMO@ .`sSg6ۚ2E5u#r ptH'P[U)o-FFп$o.u7$lH,%ۏ$Wk_vVJg)! ZX_pL4O-3ۇ`_DŽl4Ig W;/Shu|'ݤ崙\5^o%fG3Mc%:\SQ$XHA/ŀE fQT 5<4K0\fl:{*E?_Cv"I%~=3@K[/w jQ^$,谻phTNGg}g6lbGDJ;iŢɏ7k,Lkbi-ШTR#[#\Ä2L4+?gi L-Ks-mBu\<̆m4C vC?Dn\.zuT=Eyi*- 8Ϲ{裆xE'7W "T WW_#2jAg]}qUGFT*D)tM9bs| fM:DFӕ|m4u&SXHMAG.p-oC U`0zEYZ(ךlonΠ}3 공Y}1quM|3TA\Z;ُ[\E'lBl:ÆƉoϿטsh(ތ' In8|g1qOJyl\t:ul>糕dT`cʠaJ}'*i1Bgx`rrY6oR_}DNEendstream endobj 99 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5001 >> stream xX XSWھ1zQ KuR[n  $dEQuiu*DT:mqj{Ǟs' 33B=[}ѻ"޸jӦ)op/HhEb/^~П1|`uA˒edD)IW_2k1S'O =Q'Y'NNL7i13SŲWf'řoL;1.={b(icrS1E9 1K35q1OBEq(fuFBHHm3/e%9qҽxyBuIR6nNKuqwM=q)S6}=g+E# /&b3J,$b xB,#ӈtb1XM!D9b.1G $`bO݉Xq%_xಁwt.),dp$ Yђ󆚇fv#jW=x%&vzzeW4e%@Y2omݓVkpPBR g4R( ]c=wӜG< Ϟ DT5ulW,ǢާHo~$?֩x4z -3@>;uRI~$h1*dK`p "u YV +8]v–+|]4= (G/}  E/뭯n~ަ掚#8zi(c#~ꬸBi4̯ͮ Jefw䷨- ɼa`ࡥd \ pR;piZ"l|%{veI:M~M{܈j/8 I@Z.WTk@z,яuݭ1euOO('x} #b7 p5ېF,\CC!Ehj9 MGCd( fQo(mtVژn`h25ͤ2h( 4J @eW˚5va^뺢LGɱa`qXK=Iyt>aI!3%TE=#R C%橾ŭdp_aP[Jd^{͓1B_'"F`~-fЉ[Phfܜm}Ǟ^. F^rUtL-|RUEyy/ 12wrҫ v8@4-K˜X=rk+bBkdB] \Ń1p$ g3GH=:nSIa}I& QL@ƥK?_#X(/6j8XV[9H$1]HϠD+I;Vj_^Tu4Op>^dHꏠ8cV bq歡I"= mWCMs&ד=gr%U ZP3?x4]yUAa>FgW2ar5' G@ !{C"gOl&Wi-jAP;}r5Faa v~_o]|+ǠO/*g-ykNl1ts8b|bl(C/ݩ缾Q//`j#߳tmgk&`r+A܃"HW95lf=*5J77]饰u-u Ϊ4IC p=[zHo ډț;aesG##Y;\p\;^8 m| A>(Rj 8/XYqP߹VW`˪m__Pj ӧd)T@II4<@vx.B \ c$Ӂ@4־>C'/^h:kװB=veGױ> {U/Od.&g#.Xڦ#r8&u`{ ^)6D:zn Zn{UWlICp`ș2^d.dիSޓsV-SBzlFko8uJ! P; ?%ܺ-ne>MV?1%VZ&es4᱕F{TLc?kڇbd/Fc GAKR%R[ءQ0p{xĮ #,<-$ZƝLbE8ٓ]gmqYc.~gQ$ANU}5$48ڣC [̥V{O|V >N(QkKw! 45<U١={ _nG| ТƵ+A1`-xk.o=(ל11w!YK~Vt8,=xQK-H)$A 4A ϝ|<}Q6}\ \^̣kr :in%73v$Dt(BGnXzsëxpfkj*eRc4 귢c.- Dd=#CEK2S[e_WjqHkEvHeTbe%5E(:cqp ƩqcڃfQG/=z{@eYp4D2 {(3.yzyt7pN'[ŻmÿZ!=CA;#-L{reEN^X`bDh!U 9pFbS+7;`}a$#XC)RȥT%`?t*جԤb+ؘpvH^cF(Ha@!Nޯd>3 u5;^ĥt侧./CC×Gtj=Qf[bnu`^Ì{/k4uQṘw䔔ít$s?H;EMUR@< ʨѲ2yUe W= ?皸iHڀP__[?U?Ø۟>VTs7ի)ˑk:ZH0@:vnf>!߃@lÌn4܅N>!uW7>&ll{J^௩s<Sw.ORA3hB/X8knPLJ 41HVhm?ޅGnصt1iEa- = d]{aA=ն @6/ޖܢ-l苀9i)T œD!/3ݔbZgPqm" bGBϵpJYޠ0 T1(Bw^2DTX,UN:T9ѩw*&|wiՖ7W.l,C`EN`9 %ӗ zLD {)C`y~+F+-zkXj *"2cQiH ¥l.鋎f@ul4nq}'Ü_[ }> #?XqcTdG<@qhd4U|]|Z9  pU^fYmb. E ̔ٻ4ӱ;}sbI}nP,r5&V)M Q^nCBVpe\a%em~4.k\۟ Cu4֝=dMNuN+IbPD'Jd/xԘ'TOYkʒn Q K4'Ue"= h9V@-//vLB )/K7v:"<>I<*Eб8ǴiLc|F@9n +QH$+я[? endstream endobj 100 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 335 >> stream xcd`ab`dddu 21~H3a!.,Ynnw }O=^19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMUSD8)槤1000201012{ӏg!?EWwyzvws/>}|9ǟ^:C7C{y7%tX#WS'/`8}=n9.<'ܛt'endstream endobj 101 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2842 >> stream xVyTSw~1Di_(2cBť7@dBH N…¾".,R*i]Zk{Ϟǜ ''s=~gK?WO<|77 ۀ5-:_j62ڢ(pc=e1I Ch2gn5aȐ`hS"",:X#B"I" E̊E]\dEaqaPLmt1yʢcar&Yh\JL|;$4,|$ye bJ _Ax;ĻZ‹XG'6K-1C+,"xW9RiOG ''>ӟX-ja3CǪl&0w&ӹ媒dHUVn*{]FL^7d @ju#T[P ڲ~dk#AB4lcb~2X}7Oa=zSw]?ycDKpv,8&$0)(֕!8?#otO0'/# )e'*4g FLΑHzuG6w5#<(gb%⺸Ap0=\ Wb\~QB0 Q72Ra;VF92.PYX|A jT;^2 fie.4-W)):?3STIwjTэyW7SaM3iL^y>*,220Z\ׯ8 hf恤xO=! )*VUŵ}փ Sry=C Kbg37@*N'<Ioki:Xe9YS##nB M^Vm #vlF^W³_rp8cONn!A/^C {SCPm0v&P@ȅ V]4HU*Sح|0=l6g| }q7-ebKS̩.@ǔ Ӌ9#)hZwO!+;5.2DrAm*idhc) ~0) x&~(AS6&xt*oOv@Ni' =$藵<ZsiYfTLmA__vq]B,\x/45!4Peg@mr@h%g #k9Gw&~2:Ni<7A(&tg'_\9&B@4u,|ɉFSSW @\?55V-tk|v w gx.44"pzX*MKWg稅82G> *%Ht t(s  9&/ȇG#k#,zJ򋘤dHbk[jj=~]l&RYnEjE魼Qus֌@ӡn&u4#N/(3rs!J*O<"3(yw^p# _#(}ud}@y![4nq5}8Uv ]Z}eP7V|xnA,*; ~nA/;W8,p?9\_5zGh&F|3j|Ͼ[-bi"*5Aoo3 oXr$cI/@%`R<1!KSU蝪3Ǝ?/ί:c^֗ ,- 0I߯NC3+yXndW֘ab-4D*gd9TfI-d}6nq|4>PQp6hH0LXx'FHEix~E|9 gCT~͛\3>\_#*i9xclJƒjX9O$, {;) *Uύ(4cMZW.vu,靠dZǯ6rXuwl_t)PЊYJĬ9YY \=;zk~g]@b$BU%DJXa `8 +3 ʘ&d5x PBۄ{{zܢ9 ]0`lI=+pHՍŲ:*S@endstream endobj 102 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1470 >> stream xSmLSW>۫è63c~"22pcuKR -WPĂp (ЂP ( ө:nk52K7sqʇb9< H:..o4&He8Sr<^8]xr3?A2$LRz#XdaTbNN҉ʩi9ϛ6pdƨTkDgЈ"U!MDr:Q4-=;###Lcxsi3ɢN'ptnr9o4N93lT3+&lMM%f/ q#T`)x+c80krN1Dc˧ȭsGH1z$h̬_1Yx HD`oƳiOׯw^bE3蒗xC>a3][ZL0MD&C[IH!٣(?I-0&MPo'!Y/嘹1.|,M/ʤenXcBRxy?]ys:*3DuWҙꝕFHqla#Vȷ;J<9EXgVl*]VSRGJR,v8V@t9A6hMϔEUnxheqw[Q ѯ p&/=oFf.b L: d֏\k9,IZ!|,`5[ 7C̲ƛveSEzxz)Ae|s|CII{nnɁ'ò6jPU/"ٽHkdic9ڏ_n ?IzYsrXے sC5E{ؒ"{+6e5@Aq=D5ukkl-9zxVMN^S\*89!r:]Mfwic~+!5=::2BWo5A+JF0  AE݌]hM%ʒ=ڄ]]'OظcM/"9\Ҽy{?s؟w5t~zƠ-R9l%}[Ϟ`Ax#4}-rk&wk\  .q< Vz KxE#ig(r$x G4?8bػ'VKVzgԈsW$uiLf+ӡ~Gi[VH . 6S" ;LaJqT{],^_WɡZ&Џ_)nOi##}<.CreTYY KgA?A:TaAlj/Z\NRwo3RnFx|A2gendstream endobj 103 0 obj << /Filter /FlateDecode /Length 2843 >> stream xYK] _qEGڠA6qbp=quHq9(ݬq O_Oj|+٤in jrݾbrn? ZLrq v{=ݽܟos" ](EL/OEjpoOєm>t~ure uXۛw'W5(,棁K J9mƵ59 ' X@X0% RՈ'ka]8TߜW(c2nE 瀊.u *?58+*`M J8Tjp&d1hA f=C}u8wr'KC-d$Q΀HM؂F~-ؿ*f,3peZ`VcvZL=>12H&4$f jMvEi+jIvEi+jIvAdԚdWԒN<˭UdbjhM†Jdx:JRF]WN5n.#R83.{GI $|¤ʢAiAqpN +7qN_b ©/|.lܤh&-bajPۀrrM N4$Y⢈J= E&J8 g[)'gtf LEK_`>O&"V+/ d/ ֣"J,TBhX(giEf d\)K.N\9f'ᾫ['ueZX!Ta`l{jPmpU FIBx)qؚ3ZD+i IÉd45!/kwyΡ.l*8d ąΙ.v σ5*e.P/ҨV+C_Aiu9MwhT d2p P"6:MAC1̥@F(0&5) ҅:8l%3fQI X H|X H2:T҈#3/F>:B#rXq^GPqC  ML-y)4-dfVКTO'ʡqhj?oҽ娕R|Be*;\> }9a+=]%-;a?w@LߞyOWM{2\tF R&gCXw`;#f;3nBWApAEp s!zi9/9/p$.8%JJ*.\hi V5[5$ŇPpPVZDyC?N@dLvJ&Zܳ  '?ʼn`Å8(zX54.,+ŧDW`zjr^MJUOGMMt$ĉPgQpd=-ẏ KʑF'x4ũm zI H(j lрZbdCx)qplKM Qzih G9;d#$zV#%RRK5(=&鯑S-苦|prƎu4Zΐ*BmJUU J z/ٳic$1PR55ƈ0ׅS#@?^Dz*uGh-H3=)t7@pSFuqxo?*9|LeA}F6*`"U}s4n+uEIGz7рsFIBx)q_?oʧZ0DQcLr PB?TbE 7LLN#_@#m&ѻ 9B6JZH% xu"/HHbAZ0|׋wApm~'P#9P &sQ~=Uf_TnqdÙ vi LOq]*sӺ >~ N`^VwX5ZǡL .~ U%oN{9"']EU;_ǥwK}/"Kg%Kֲ U:mXdm;na_>DETpZ-/k[,I׽~=ѯWuv?` f&]ڌơSuendstream endobj 104 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1926 >> stream xU{Tg!d"B#I (QQTy *6@ " U룾P"_[bAw*K$*UԽ=3g}s~ I$DžjtCfztO!yW;UpȁjO {W28&@#!"I3bZ[0(*(R |Qi3ي¢@k  U:o(بNKds@ "hbKkD D!D &N`w H8$B5!ĂY%a"CO*Nkhh*E?n$UK*RSf87r>QF; z |k0)+irs/Zš?'R`=Q[g6fpoG4 ~401 2^ E쳖 X97`]Spw{~AvRZ&H-;KOCY4B{u-"xk<aIǢ+猛RUֹ'|9RY zt5<  S̭CSv%qzٱph'o>L[aSPq[+}CmEn/bˎډWHfQx+xa Ⱥ&0{5Ox -m#^M^^ݱoڍO&f"6kfkxnX[U\'kkz]2R^mon7?;ex:X(ϐK$asw.V[pOˎ>BڋsB#`skۅggn)b -|-|}G]j`)7Fr~e, 9gTF`!\Lb?܇Ip{xt5)E]es壱!|IȴK}~ 3ga^Z`U!4$iCjr"n7C3#IYzGYy9x,Yh襘Lfx NG:g8sGgwRok&T=޻|tO5 VD%uM*D3`pS* af݇yf$Z*-E%$0x"<{M/X Imu7΄"_^S=gNzx}7&0$/cme#h6nƮQ)㛄/-k-&s=E-MK5C*hGf[>A);QUӍ6DGv.z+R2XT íel#.NRͱO臩2n.81ON_h28.S~x^y?URwu' x=m.ߞ'K{H0 `ò{0)%JfKyñ5;նkB0Vz$]2ˢKs*Pg@PƧmէrՐ omFHjlka)A!쌰ñ+jU)CLpTM/}t5`Zn?Ic2rE+<ܷ?KPdXìP,A~ v^i|z ;[%!UũiQ~AoZ?$SZrfpLw::n\%'*F9?|W{Sxw{KĿyVwendstream endobj 105 0 obj << /Filter /FlateDecode /Length 2990 >> stream x[Ks3{c)JRIzݟ3_.`GY~S2}j륊۳N_L>ZWߟ]Yww.{!Cݖ2.UAw2N-8zUFmEgu8ڔmgZ'ikN[{R+q_FW^2ԗ]eThve! 7e}.bU)ԮW|? o*O ʎh?=_ aJa(uZznVlZ@Q@HhD ^FވrЕZv`r<jo_qVEepVNXP T4FtzOu&aI #D8ip&ҋ(ns̬}PWBy+Ky"M*r .T.N(C:[%"g f0a_\= >+[uR;K?2vv݆X[t/lS)'eâ.{\%1+Wc<2b^g,up(n?b`$ xi@ ; =`ٷa`9HcȈbg@rf#Qc0SNF`D y+AN%ᡘ;F%wz< &⸊Z:W_s*FDÈ,9L9g<43l9c'1䔳GcSŴbqn2Ih@'A/@:F8DjH.$u%+?d@Y2 ˉsd ( xbJ{ȱs 2u 'c'kODBq\# )AP]0ƎY=5қ8wǖ ҝy`QylZ8?&$'Sv`CRcQDQHNkj'u{WyCHcsZ&Gk4M>a.TajTHk꥓g X0_Bh}W/c?p,bJIJ`V77\>PH`.®&nUmFPU]=Qgx..`JKL1f3UȮŔCl)MW%B1xU>EEųtlXI1*ǟƪף~Y_L`F!Y a7 &O OלamHӒ~BSδx Aؔyq4Gt5r]d"Dnp4!P'rWpkq;0(I"1"_Xj8aa!Z߆ 2 è~eMю#ަ- h;j٥.'Q$$c_$s,$vm>_naÂQ5OY@:/1AC.\L.L8Y.}@M]Ifl/vI]]w䆲%Ei܈dkY廐~ ua6QIu aUh^rz-ҵ׀{ 1< lΤX$'ZMԃyHJ۷ٝDdzW8.R,t2r mtn] 鶛 <M:6rK3$p ΃͹ 9 3p95geѥ"riO> ALjfG<2H훘|U/R)W(e\p<"M!Nm} Ja; d^ :brER!n[v0k*t^ ~fendstream endobj 106 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 211 >> stream xcd`ab`dd v 5400qt~H3a#UAVsknne ~g((ꜟ[PZZZ&Pׁ? 7~H/(>GhXKdiVB~FM|w> stream xZr$ՙ_7W[2,/ )&d[|CdsI^Bٜ8tP |ۅB?w'VD,Oޞ_w/ΰBESnqvuwʅTB-pTqqvw}_^G%.+:;4:b'y Gu$|Xdo*oyM[ s5}羅~l,[ |HؽYU/c^*hD~o28etw>53jI#gk7Oh h/C4;ZPAwGR¯L SumRw bX{Ye{ʪԞy0U:oQ)@ flFX5{+7BpiDt --NNl qιP <:F]'96Fў7tOBjL/Fh2FkQZ:$uh~\I{`-QN^R̚K$梸^Z>-Ah8Ƙz9*J;8#qA.&{rK0-;!Fp^JwqS1FKQ8wn!gև e/y"JD)cw?V]VszwA y_c d0\MsXȖm*اZG>D*m|jf^R rtRujb+Gh+)5oopA۫}%ZقACL2t} f+* +0ŗZ jEV"Q11 N';`ReftCta#M+$&AN(> f9 zɬ6B0I(r}Wn>eˍM撰yN+Y0 -|>fogP El/)[a@FHH\נz;!)琭4V@Ɗ:TxӶ2u9R\Ox[8z`pX&&( rdz淏4;.!-3aw11ڗGHw[Jj=C-bk7+iZɏkʂisU~΋32U_s,c嵼\j5V |K$ ZIUN@N!Ǚ: iLm^|35 TtmոYF~.AjtqI6Kmc6HDAi.kaO{fZaR}Qһ+a̖x_aؔbQ8i6Ŏh%u d˹hadzR1{=M%2lzu9~[`샫3&[{n2'MȣG'NXCQF@գ ʹG1U;BG>;&tͥf"Ƣ0ZF9|=EEmXl*:aҞ`"/ih4CMZKKt Jph.!wy,1pA+}T.tf${\cshi0 @0S]y`gYF#ӑm ɐxIK/ ΃V_! #^)oPگi*h y}:9ݷ$Q8]$W :NkFY:8Y+$VVD%2E0iwnLp֋LwyiV 2%΃X`Ld@LQ=qy;KVĨr)(}nB[(3%4=J2VU/8 ~~]􂿾˥q,S$TK1B&" ~Wl@HDOlIwnmVvtؘS9_ ~m}r%`řb01קU=u_Yac/ )/\97g+!:5W anˬ9 ߓnI J%i9? hendstream endobj 108 0 obj << /Type /XRef /Length 130 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 109 /ID [<93c5d153bf4112274c1f2c75b4885858>] >> stream xcb&F~0 $8J?@f -z [DH6ɚ"yWE*3At+dYL "k@x1L6),lr)dI`5?jt$# endstream endobj startxref 67268 %%EOF gstat/inst/doc/st.R0000644000176200001440000001667314127330262013704 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-124 (eval = FALSE) ################################################### ## par(mfrow=c(2,2)) ## # select 4, 5, 6, 7 ## for(i in rn) ## acf(na.omit(r5to10[i,]), main = i) ## par(mfrow=c(1,1)) ################################################### ### code chunk number 5: st.Rnw:129-134 ################################################### par(mfrow=c(2,2)) # select 4, 5, 6, 7 rn = row.names(r5to10@sp)[4:7] for(i in rn) acf(na.omit(r5to10[i,]), main = i) ################################################### ### code chunk number 6: st.Rnw:143-144 (eval = FALSE) ################################################### ## acf(na.omit(as(r5to10[rn,], "xts"))) ################################################### ### code chunk number 7: st.Rnw:149-150 ################################################### acf(na.omit(as(r5to10[rn,], "xts"))) ################################################### ### code chunk number 8: st.Rnw:174-175 (eval = FALSE) ################################################### ## acf(na.omit(as(r5to10[4:10,], "xts"))) ################################################### ### code chunk number 9: st.Rnw:180-182 ################################################### library(sp) print(spDists(r5to10[4:10,]@sp), digits=3) ################################################### ### code chunk number 10: st.Rnw:189-190 ################################################### rs = sample(dim(r5to10)[2], 100) ################################################### ### code chunk number 11: st.Rnw:195-197 ################################################### 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:200-202 ################################################### library(gstat) v = variogram(PM10~ti, pts[!is.na(pts$PM10),], dX=0) ################################################### ### code chunk number 13: st.Rnw:205-208 (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:212-215 ################################################### # 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:223-224 ################################################### vmod ################################################### ### code chunk number 16: st.Rnw:229-230 ################################################### dim(r5to10) ################################################### ### code chunk number 17: st.Rnw:235-236 (eval = FALSE) ################################################### ## vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) ################################################### ### code chunk number 18: st.Rnw:241-242 (eval = FALSE) ################################################### ## vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) ################################################### ### code chunk number 19: st.Rnw:248-249 ################################################### data(vv) ################################################### ### code chunk number 20: st.Rnw:252-253 ################################################### vv <- vv[c("np", "dist", "gamma", "id", "timelag", "spacelag")] ################################################### ### code chunk number 21: st.Rnw:258-260 (eval = FALSE) ################################################### ## plot(vv) ## plot(vv, map = FALSE) ################################################### ### code chunk number 22: st.Rnw:264-266 ################################################### 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:278-283 ################################################### metricVgm <- vgmST("metric", joint=vgm(50,"Exp",100,0), stAni=50) metricVgm <- fit.StVariogram(vv, metricVgm) ################################################### ### code chunk number 24: st.Rnw:288-289 ################################################### attr(metricVgm, "optim")$value ################################################### ### code chunk number 25: st.Rnw:294-295 (eval = FALSE) ################################################### ## plot(vv, metricVgm) ################################################### ### code chunk number 26: st.Rnw:300-301 ################################################### print(plot(vv, metricVgm)) ################################################### ### code chunk number 27: st.Rnw:311-319 ################################################### 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:325-327 ################################################### attr(sepVgm, "optim")$value plot(vv, list(sepVgm, metricVgm)) ################################################### ### code chunk number 29: st.Rnw:332-333 ################################################### print(plot(vv, list(sepVgm, metricVgm))) ################################################### ### code chunk number 30: st.Rnw:341-347 (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:358-364 ################################################### 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:385-386 (eval = FALSE) ################################################### ## demo(gstat3D) gstat/inst/doc/prs.R0000644000176200001440000000304314127330246014047 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/prs.Rnw0000644000176200001440000002004513777370515014432 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/st.pdf0000644000176200001440000033346014127330265014253 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 2927 /Filter /FlateDecode /N 51 /First 392 >> stream xZ[s۶~?oM'3%]ۭc;Nh PKR_vHI]?%^. N<" $'"`D!PGKIc .ak5t &L9@, D2D ="} &ÀpA|(%AJ`0B8ja|r^!' 6$B@jPF@IhI%W$E@4hA;@%=%*Lj Wr2(p!P*!Cxр }0Ǖϛ72De/rN2SS.qg݃IvK޾"v,ɋ_%7Qg~Tb58S_~Iti}\ d繙Bq<&?wg؀g',+bw% G.7qi]ebR/[%‹0䟀G|Wmp~=zhg(bΈ4+q qzf/KKB9]`&q=CLlC|,zM-1ý{(_h7l6%|d8'+~qecJz V}zEx_;G=7Sof:<@s܇pUX7o7TiK.[lhE-TXog^=`-q (PAZ [Ŷ Y><籟gS6|?|ɂ,O!{C8v by$s4Sp`<ʶP_l(CwݧOF}[k+kCk{Z1 t3R,úa%j k 4 -΄B??pmzB]bVCh%+2ýwltmj٦EkS~V_TFq1-`(R8֕#!(иJFpT9W83N|0{Ks1<4TIۺ`fk(?p5%`$o]!oZJBs(_//sq-:W?/N<4wS@oݺ`/;ChvКoǫ;>[ٽ> stream GPL Ghostscript 9.50 2021-10-06T16:20:36+02:00 2021-10-06T16:20:36+02:00 LaTeX with hyperref endstream endobj 54 0 obj << /Type /ObjStm /Length 2437 /Filter /FlateDecode /N 50 /First 398 >> stream xZkoFb>(y @llԐ&ʔ!y=wHJIJvaH!/gscF fA1Af6sI,sI-H1ibN3LIZ;yli)p?2mdR嘗̈Wfy\ 3^j J0ܲ"@3I.0k>4KhbNhÂ,Akȑ PaҀ%9!7E"P=b]KXLPGUbPERW(9$+^ʠ饤1Se͞hƏff&*Y(XYy; Ə%D]<S'6K22|>/yΞ^旗BX=WF|pOXسgIjd&@kR `ϴrD dik$k$gzSۙh |mk\MܲHH¨v<5K_ic Z\ n.j*,e|Zm' b|Hjq^|9uNΛc|TYN6Gǰ&g::xruW vdKVBiۿ曶Ϻ1'ņvv1Sſ5hy2`Z? G s}ͨp0d~OFQNӢ1(UxXf,z4I<~Ȅd3bZ_:?]+){&A$Y6LL2t( D 3Z~74Ŋ$ >?bvuab%?w>>9+~*/y|o1- D!CxVa%:H1iq1Q )uzdfLqKZQR~B%ЎAջtncPHۃfcܠVT[RRآ 퍲VSH Hq֠0#=15!{m̰2nF{/ZxOS{xZ˼**1p/J|__SFv%_W5_.6+L:3O.]n(;ǛoSW=\:cѼ48,RXɗ$]L,gm5bK m+uKHwQwXM9] 1bWyĿ݌񺣗n>lsmsl3xG_3J}kƩm=:̬ԫll|+:c{΢{l6i&lMxU2ן;jAR T `i- 6@}0t6I:xj!]ZY=t>Utt׶ sk;:kہv6tصk ]13 }k?{+VLDޮ/MY`T8U[ R!b}Im&q'uQVgX|\]m$L) :FܢbܦT:^  %+ޚXhסb9͗?DGv)Z,1(! (NPþFIQdtt~#IQ)6ݝof5ozs!SP< rgu'QbH-ҩL6{n}rgQF`z& Dfն uf1q tr\\6t]M2Ze~W:Ѱ$sݓpVl)G=C`$ )Nfm) ZL2!pH9 s{;2:kLz͔x+db0p˕2zs뇫Yl92-'׷yYLuСLuL,^-X~q~`H@I#2j ɨ@q)?gG~_})BuXG+y!LɌLxb(`=FeQ<2ܤr5)r0vSD,,s.D ^u6LGThpsdxa[V(wGe$TϞ.h-}'1QBm'lzendstream endobj 105 0 obj << /Filter /FlateDecode /Length 6357 >> stream x\Is$u# C b$Pal(`U%eVcbvV˗oRaQOWot>g~ݔ]=ly`wgh&76gowq{87aN *s>8`ZoMTHy>^O9{ݮrsN1"g:Þ;ԀMTU^??=<:-ݼxGkG,1m7]vv{q'Byfg21m( cNxy4lxVF.8oEyDd<F̘7>yܟ}Lsޝ}9֢S)O)j DOmT^(漶̲[xi WxpI!Y)&Aٴ p&8ۻ8ë Gg YADOkgp>RX4D"$'#fVRe7ǻ-mo }zyB+~C4=(gfX, L%og8$7QOwϟ6Ƿ='ET:7hoȤ:= 1nĖ6( N= "D}Q*3j@8 Ⱦ:M qփ81)bj,XZFU'vGNpٴoqNHrDYXFuhV h7@#;JVN߭\;܉+`J pI``$!,La@;9FpV\6_bѴ7H  !M .#Q~ͽK 6F N 05%ఏaȶߠ2h`2^_/7J`tYpnI F̽$x&W%4:ja/Ae=}I.9'b2xRƷ,80#Jb^\ 'G/+gݾǟR^{K\ay[|YPgII$i?3`1 @Խ^m$p9tƒE0 q(Xk xFp )@ԁКuh6_(r W4i&zc^7Ot;D΁|w®9oڠը#ˤ Gr4ƝV9qe,h<hFI^J*k4jAt`2^x6+\Vvre s\APi/D0QB + WBԙF"E4@B{|p \ Jx0V q(c{!츞6۔Ӭި{l1{8^O]n{|[(I,L2kṗS֓e9U̴=@aVjmOb;EE6bl6;6/ÇqnnzzF\'$?&c{`%t" wreˤb}$=q֓r,x`͢ W2xN Al+Bxn*D$5M&b;ν#,HąEo+׋O^-$q-qc=ԡ?WU%ϞyPB6\_[#iU<iҰ<)Es {3Sz˨(P|2V[ 53."`yYiiy1~/&H84հ6poi. Ɂ^*!u:| XQEZdYY` *%' lɺfK!ar+YrO#mAsiC+Dib׍jЅ&!渀lɾYJC+;Bd裏%6CKH JK!#0nQܯ tEEMh!ԃҕ*X/( [R/0#RU-(j{-6iV!\Ǘ KW|W݁S  JwP"C. AijCb.鈭Yʏ @_ŶFBM3Hg^Sa!d=l5Й뮆E85 q`@~}B۴N=ddNrf( &Y\QH"SgVGpHJظ*^$&!gy"P K/. Mҵy4W*#E빜A3i UI,tꮠC* i}Y*iRm7bQŖ䑋EE*ؕ H)/0ղr$J ʕSTSۃ23b(ٚ#[._wDi1ɶYEF;2>bҘ#{<_ v~gDYv~dntDK.t4ѓaLO2DDӜVlKR !x~z;k]u6| 10=O/> 鶚^qza\4v\xzqa[AI}mYXD"b_a46!TbL5-4Cd#$}b{C =5  oy]4Q4 <,9@it蚜ٲKmCr &g!S Z+d/2nǖ\ǶK"qY\/Ћ^}F}#!VPntІ|@tr0&E7g-LI=QSVL5El^o&uWZct0`ԙ'-Ȍ~7(âQlr9vDighv!s >G)ްֺY.s>5˱9E]p[{8ne0Im\N 㔿5 }17~o',-/dG5C7]i{df˄fhJgPÛ&oy:vkʧgxڴM}? Q -Њ>42ro 4Yaj/JtJ /<[eifJ쉌oERثo9. X"8T k%od($'|+MW4r_b+6=䕭Ol_/~^J؋o;^ f7u]d\B ij^YIpgBR_B5EH4D^^I|UqK (pUGq

=}qePM>=FM)go=Jie T-R1謨2\RڋJa Q{S%SM(Xl 1=^Xf` tŭ ++8DɎHk)湾GƬ e;m?f+zԧf?da#e)l]Ck7nH QGC!јA1rszo^ylSw2&l]G8-H{XkfL1hH 'K$}*S}ry1_I:߂jm&.f}رOχ) l~Q7Uu_lލbҚEg5(F# jѭM{'8)a}.tM,;xYùl;)>m@-]ڐ?:$DO 61e% GG٬P.`%RkxW~vGm̹jgJwBz5J& e^xR$& L,7u+Ol_(8Ng)"c$6<_R) c ͔Mû,-U,T]b򇛺6p2(0`pD#Ϣˉx3 䘷z8wUendstream endobj 106 0 obj << /Filter /FlateDecode /Length 4054 >> stream x[Yo~gFOvǴpb9P`9>IQ5TU=[\A>z'#ӫ݉8:D_O_緧9:ʞ:I+T:uRӳۓRқnX*qPFG'}w&h!w; 4rPcFma^ZVamۭixpu=.z!6țZe3-d" +ew9AgoøP^H5)lÉpؽƁ 0/+ӿ3Kx&ZX/"u]awnsFUR"U-/j 꼊Ж #}s9ƂD/~20.o.Vi*\?'\F1sæ˲Rha$T2I{i.naT9raT}]z5;/un.LK38 /c慺6F^8@0GcAsԢ 6Nl%Zx-LqJ9 &$E&@zJ_Ѕlj#7_f8?0Lrj(J-:*0p梥@m78j#/s+RcY3G̝L[9? [AG SPꆸOR-L2F)+@" ,i\e1RlA[%>٣uVEIpygd+/J^! M/ilFaTRU8sn/HZ Wa\?X;=MBPTĂߢ&F«(g;lcwMV.HN!yi`@"vU#5L"e0'o2T;,TZk i& cv(,Y5i]T%+ö[fs ^Ig@m}^7M"A -fadk ׯqf , YYZv̑dtv0ɹļ@PDULaJDic5Ğu}G[:orCgn3ph*6MO'fh)f~Zx!`rHKJ5tOw%OL9'EG8rjr+eZ9n&܊VM0c [ UaUo0T1N3ST-%FkСkiM$&ʻH+] 9;ܖ#)\-;Eb0a&'2_r&.8~n3bQ w8A XR7?# u+bjK!Bp*l\U+uYJ]WcRy;&p.nJC@ƀڨT 0#e?%9{ߥ](Uޞ P#ٷ5ƫ.seCзR7jpTc ΁|x9ݔ.#I"3^XB5ɗU+dc 2Ew#U|.&%&!ja}Vjet~_an Aȧ"ƓA,'|K5zXE$ٴv$<2YAͥy(Ҡ !k!0(v ;VuʺXH55&5EUCRNF'Fi@0 +QSe~. ^Mog>@:J!UF<46)" AqmV8'-;vQ>$ޗ;rUM~Zr_Ph2.GAWӦٮ"ҰW9-[&HF@ &F:w\F57r\AK>WpSi}K 9Qwq)5AࣳQSMm"L5=tޛrf䈓B0 ʄtv2 *X9 M,h hҰ )NTmC~Uwx(1::)~Xdm`"1 9d3moZ&ĚH.WfIj/ \hN,gtY0}Y$mpq>,j:6?HᒮU}! 8/ H*ِL=I =jǀ bWT!˪".jdwr8IoNu ]7/PK"˻^PL鵓kLSdbd8b`{. O{ L#qeφmsBSmnUz<矢fsn B YKm;R-V+Btц` 򋓳?~y4J 0cJUjŌB*eWR9 8&b{ gg;EN=;nK`{flb8s]P*u %l*Qԕ0 aM0 ѱ%nW c3\_92|tjmWB!a5\A^p9%lxU@ܔdLNLEstNoKMGovT$4Y b Өk QKm$tf0]4ȠG۞p1QQٛ2c}2ɿ85}OAīS; 6'꣮5 !]ma\4-~7v0X\[f0gqvd@.F`_%G'VG@#j7]SD-pT8)o(E_ۦS,9A XX\{{*20e:> @ZxO"~XB9 %A)\>gea18W+b>J=g0@W/́DXj-} Afko[*-fx-Bnjk)}T Cqk%3"jaXP5.HB~f9+{[p츟1WOZ#Gq01J3+Dwo,&"PҌLA6|g*9jS),>zrsQÞlD:hdvP+u|qsrz'g0U< ݉afxH̅kF}$+HxGbs0CL&_o o+5&rII^, \F,aVv\/"悹5#=M“Ȃ{Ĩ=[Fdg_)b,>f7h'J-9TO&{"$^:%(r5jL̯gmQ!ŀ_QqO৕/*~l{,! y%lc8 M[0TOa+f z-³[*7F ׌$?2l!DD_VUs ~Ι  #q a9\ΧneCmԟ1]0,[,0hgsw _WO{~ z Q1iBTd~ YQ6m`M~9&c`*@TʢhL@zXca68D8*rGm-kT "XM^jsTE/~:yzv55endstream endobj 107 0 obj << /Filter /FlateDecode /Length 9203 >> stream xm$U7F"_"##@ ^c,cdƻ񠙝ή_so=ohOGfDSYٿ_7s˲%-ǹ̷sǡL|uۯoD\uxn)mk}JM۷7?m-!u)eK2{),f1MfsJN< ՎqfLUf?2 ɥ+˔ZGjJGY:~RkCӬ'T՚?ș]&!m?HLKienc_WWLO6:,Au᧯^߽/L'RNZ#~g5ɚŋϥNe/0iU7*&U1)ovZ_l:@L50.' 5=\{\3+\ԛc6%k\9E)7WNr͕Sd *i\Mru\/2W.6&=g{y"bՕReZeRt'wK(RݒwKWh]4ܛeR8wK~m]Σ}߲$Բ(yIY#`cST@oWVbv)Sdzk·\RI]{5 vl8Qi+Q2ǥL|$ar=hDZLl`Vg.l1[^zdO4a!umWbLtG%Obp<鮙2%a{LjX% 3dYJ>d1{f-˸B~`GBI7/V_Hd^O=EL=F:Ȅ"=ҝWĬ(ǩ+J]nTL*b/nyA`3!@F@.ׄ äz7Lf5ތ;&8gqaȽCUr wJSrF)0J'u!b4cM-a~&=k-?%Y&[GMw#x$/< )vubߔi50oH?o"K\OY_)z1ݭ-P5F_Ya((GPrjz2u*SNbC%5R-!ASi[]drҠ2Eu4_IYql[Q? Qhw]q(ںDAQogfK (SjuS9.=e>я$Ȕ)]Yޙ2%+|Io&9tE˚@MwJX ۾)P+McRՇ3J()2QG{nf>)(z6Q;HoeJ^(`n"F lP@.c{s r\ O- •{U*B̏?+{%c5%6lG_~ T&Pl@cŎ)LNe:Q{Uq3=vp><򃻴-a$Yy-4 ɋa;q ͹od}|~ѵ+.z/hxΞ/e&{E^0eaA)d?Z)SFvA2.n-! JknZ)SP-@ 0 >:= -H]!`Č)u=Wfa%L252J-f!*aBQ2E"ղ]LA 91>3\e؎˲kLRaba;c¤Bcd3xBDr%Q-. 4K1%oWWLQhL 1SsʕU o͢Wjr]/COe2=zr!,yB'dzz4SMy{O=e/N uX*I)qńu ʭSuB{GNE?yiqiפO>Eza-ĔeVl,Ĕ)U,Eƒtbʔ>QP "@SPd"DȒNLA;891EV݊@G91E:J-D+͠C&~nς,Ą _cZΉ!(`rNDR,vusb \ شSPd]91%GrNDR@are'"sbD,4tbVre~~,M| ? ǴCA!)(L;d3”L0uRsP;i ([9cA"^Yr̒CJWUY%@"tR.6JH@]b]/oε}"PĂIOrI^ LR&!xN< =@]>\vEaa#<1e!A6[J-D}ecO OOLRȃDSP4UK<1E I@Y"2zxLy<Őr .*E]= Dc D k&QlxY)zt= DeTfOD2 ?<+\W0E|/U~"\#La'Y('y(K- {Z_}AP!JQP#QP w<+im7E{." <EkvTPHϪ'(\PQP{l( -@cLT@~PDA7, E?5y%|BS)8JJ0޴ABOPe#$ cwp 4s3QtMIĔL):QMI',S:jνveSu>9.S:jDLԠөJ˧d]AoPN*v/JUJDM[S#Q)%]qiJtnZ S^R%s.#֏?{$uB Zʬ}5LxލQLzoi0 N[GuxEqeMFY((FP! J1t"n+i,C0ZʕeFbܓHDAC0"S`ć" JW~Y^% Y"n1eX&# ~eY*((!'$܈">遜\y(W"g>a!gA֘"Nc\k=/4|frZ;+iиAB +Da N5|ӚfLstM!GYà` [-j9V)ZAjVFD]l<uz|C>!٧Q416Oht)M59D &49Pxtex5\1!cz޺~OYz_R`K~pK=}u=4AhQ(sG<\A/aTPP&i>1(H\ E\WE#Eur*7,E4౥2/h74ȂPAȞx*(Wd H'( >A(xIQ<ExPA\# QP87c<%C], QP{y*(W&BEzڿ )( QL2_UOn1Q7 ʕ]! -(W Nju|ghԮgzb4\S6Pgb'8 N:9)N'5"rh%х\QJOO^ TCʏʩuwPz ca=ɨ<ɨw)I,%rPL7Y)S(H堘2%%<QP:sחSZ_FbA(LIeI(LIrTKB1eJ- 4XO# =NbqZ&KB1EEP- E+uXp)S, Ŕ)iG$S$}neY(WVI(扦a 1A} jKB1cb-E+"Ŕ+)er%!բQPhN0?P}r(ONBCN5 hԤ)=3'ٔuO_T A$u"((7hAA)LteQ=qQV#Eʴ\%t܋FmçG45>>JcSQقwOF=veb :t&^ߓZeľɢfY?Ùˌ%E,2#\n (L1b "P 5!i骱s<ۏ(9B,B҈S"PLOE1eRY)SDH%:hSQLv ! A1e"{I A1%eV1A^\e(LQ ibaj(E]bڿSP-PLAE@1EMj(BkY)Wd@Ŏ:QbP >Cڡ\!;+DC91B NBI}0Yzˊ<β)@+,e9.)rYAe.)wYN:Q,.qY^*[:wYWZd:veuK&':tv7 5]6䧦u%gn`ʔ%͸MbALH?TCTO_Ô):.rnLIS|逥b2ENg,aC(ۍR㹇R"di="@X(WZN! *a+ڏ߁T߶g/\Y{ [(W?,E)(mLRq9\YZ)W-GT(wO2%A2Efӱ9SPK GCxʕѼNBzC+Dl+Dԇk 4#u{i{Im|"r猥x~!K.9Dv!-rtWBТ9šl<Uz~O,$Ա+3M Io{%S^٤{uDpZ MK>1e~!^ni',&$Z)SOL3dLISub'LQLj\+FS<9i7SPH>JOLA)'(U SPJŃnDR}"ʕ: ʍSP}b įZ.)S<"d'T%ODAѲSPA-)SPsjY0LgT(dN|:JP})W3+DԈӄ,˲PN{'ù =)WN|הͶ)=p>Lܵy9|#$[c9|u"Ӹ"^;AdxVKdJ27H* -O,I~+Hk+eZR!n"χW CGk0GuOuJ/:v{G睖K>|V ;v2)Xd__"4gXtӼّJR5ٛÕ~'ZTK]/ Ɛds5*ţ9Rj{yd«"c7/s>3]UIA*U`{ytԲ**zAv:"iW6q%%U_rg553T6=>{><!oj>NݢSull_fǴzGCCydns)>^uցKP t^.QJEM1B(:Je1y~awڙ e'.m2\? ~-%iUǘ·Ȑ/gC[S1L25lgڦUDE瘎۲einlۍ5L*sDge[ކQf+ANsG9^G})a 26o3JEfk99=N۲g^Rwwǒc&~_K&ҁ[wh 7sKCVRK1+tt9O?Xg̣އ],ݐh1&ٰm$++Z?D_~ۉ4u}j{y'*[9 b{g z'"s{`?駂q*%\Qx'XsUcߏ͏Wη>[ʷd旾Ɨwe`I,cַ:t6i=/}{ו3 λDG oZvM6ELbV;_ֱ';֝ :>i9:碝O:vx:E8H>n_~)W?[v囝߾9_ѷ~~CNFjlZvkc}mr~5]kp& |G;.jO /rY z'45] i c}޽#d7 8;uP78ڹlKN*d;tknf*<B돨^ylY+E~D;Oφ T!~^ K2jpI]MWݕGG?5fy^!i+ۛ_=h 4Z\ ߐ=e=F!0 vQf3rk_<92;Cl~?6cX>*F惀g;7{}s2%nw\.j8ڿ9Iwⰾ+n?s};[?!{aћ}>}[q#狝1vgkI9ZF۝&rFUK+<Աg/v`C*bZ =xߜxǸ"jkx{PB;ɵW7NwgbBsu\n[c{_?Xw{]=??8>u;` t;-F:wgO']r{Q?|%9ܼܾз0=%endstream endobj 108 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2988 >> stream xVyTW@nD'(D%Db%ڲ7H74*}u7͎ %j\0̘IIF$[}.yFMfw޹>n~wiىi #?Esy @yWe] ;͝zIt §Q Mk|XrI䯔>/KbԺp2 \Nד?۵qj}rɋz}eҼL*P'u(VWn OP+'=MHLѫumZ(J&)gDFcb߈۾c>+VRV*FmS; j',@^(j#[5j%zZEP-Tʃ򤞤S3(%rtJt6Ib>t|Fs"2>iv7ޭLO殒K LsW[aõbYѪ2K$#{~xGb*"*Ui~CSݲͩfєe.e9ӊ%J/%4USvk\3|{ԧte* : DR }ges1AoͯΊ[ohki#]$.2ET<<.D `.|'1%A7X&Ɨ܃2=r YT\/Ohyhr,*Ns`,UWMW[m(9HZ3lhSv95lK2xx vbu+"8E;ى>&ZѠi~7.뇳{w5@زZՄhw5LkF~i Sx r˰೒T_VhPi(:XH޲-5]ΦQ 5zH< %ou =ɠ0p%߳R R1`&$a=-'c|-6Eÿ/!onؐ~n!#"A>$sR &ӑ[%bo|<ؓ[8\Y]zXb(\^WRSԘS#,ՒVyBY Yc~/@=~!Ʈ#o0/VWΌf0lW P̐} /dt`hDwه1ęs:!ǦP uHOrt,9Yx|}m?'?>i_3 RM?9kvhR[!u(H91o+W7g0*CtZ+i,1ZY9cQ<3=_?u-nJcQ_ntJ͛N۸U~) Dc-<MATe254mmC?,>]Nu+/DU=_);%Y4t&Zle%4o"2Y_ biGl*.t*T'49*v#%GysOF827UqEyCC후P'Q y VGq~h,yatf5M94m^/qM Q4}ʡܟ3K[avX*+jxXRzԮD1ZK<&8Bz:}"1Ak"m< cߍ/lۻ?6,U=\wR@ jT6p`r JD {A%B锕&>A6/XU\ y'|CCyEBDAHt-I.؝}(y0rg[~^kSֺg%呓-1Ձ#YM gc޲T?=2^wfggΎcs;R{'72( n%^uĪSw5w&\Т[_x)OسM<_w ~dPsy'w]}? `GV"#$m g9r` ?T䆨)jk;ݧ=(1ƽendstream endobj 109 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7748 >> stream xXT82029WPsKb/XB4{Mzi#0LY3CeXFc+Fch!3@yo=0ٳZ=gJ X0?X#ĺ_IVPy';VW}{6?r IBBcwEڏm0}8ɓ&Mw l=;=_;2~L'FEEMpqQ;"zGx_i=r BB+BÃ)Z<7d^ #E..ٹ4=#s.ޫ|Vݱ}@ƠMo|섉&O:}ǡL9jvkFS]j-IFQFj KmR[yVj>5F-&R I"ʁZL-PK2jZA9R+T_*GST՟z@PbmA l5L DMqC}$^TOJ#$(GP*{oDSZCa}9w}ߣ6ke}xk><N֖^GV~g+owuPA^8!Iz)JMzrXa~WZ' m1Kv'!?}9ʌXPSgǷ1=6@\sP&hUժn+uVr B :kZ9(A(H7>8G*zglsXdoYaȚoo,5ؠWèz2EkNh콷s28,A韮t1wZnpPa:)!_悳[ F|5ʬiY)[%훉W.PIs_("5]l[o\ %OW.É?ZU>"!"d?Ny6UuTV/',i5IAu&?`ٟƢ^#1ð3eGh&8UqHK~8nn6H].[nǛlNÍNoYh%rI 2Vsxt,f%޼@h Hh~OiAYL$h7] 2-N> ;3 OS1o4qޮ9h *j(~}4aŵLD|ï;{5J? `&M6o c^Y%etEt͉c5'~a 8:yzJ@z40 L=/ ;!B3Fh-l ~W{D~_4^>+Ξ Wn ]=v1(6TD~gK3R{yucf<{!~ j dPbB ]Ѩն/4OH= !V#kh-/E(*\'Dsv]B?/1p4Y:SPK(I:w5?;\~`&}͢4m;ӽIӢf줝T 4ɣ2rJuT"1!eqc^mm`'9|ǻ3[LHhQnv-=˺C+"s@eCzK]NrPF}Eh als2~M1(1F(~F֠ ~}|)iI wAJnFSZi-)=~X]FL싓A{$^YYR]vP}GC$e|H/`IT$&pJ$һH+ Jďjê_$= 7Z|~\`!PMir&G^>ꈇk:d-n=8)d)ZNOXj7vx%~OMSZ8:ܩ{䊭̈FQ }t "*uGh GEAk\CU_ĝ _OY O 5YtHȷ? ܛ\It"怟Ū %論K '"BԊ )Rei3I_4?6@V&zAr1xoS-hi]<8N}U|X_ېGB$5ۯ˽U-I]Uҷu])e30o7333WA&A)/䧢lvyDGՑ۵4Ϥչ I*B.β=Q<WkW%D\AuHOMֲ"l3⵩ii9D9RYԓi@=B1Nܲn|ZT6C;]z7r%,^_M(dGWa x[ o?R}:*1GlqS~,)1K ࢍ4Am!JMmGZEZ vUM'{7" j"UNB<7(3zNy`i+:!Ol϶d?qc]>:}vP#۞"+I{:|ŦyVSvt:zM\8!gɷѫiK6`/t^UY]KۮT˭Z|f9;7+3yElr/maRHzܼ.[=܆gpD1&`!ڏ=45(l1;8L#ڨMtp*+hTY~H!ʰlez*v&]WAnYqmkVv] ]5i*UUKɇB0]⫑YXƤP3ќHnR@+b5%M:Os7lǢ]bI͎gFZ*ja" |9NF"Rfsl "yP ܢgUahЭQ v\"J,n(KISN+/oZiM]wUa-""GFdW\w1#1Ԅxyt}e $KLiY(b*" A.;/8sDx5)uOf4h^(EOf_TsJy$0a%QՕ=n)'~~1 1hP-ꛓdU\>Si_FuU3jGI%9gܕt(8ǴuPǺjTI HOH']VZ.Rt\uWF5gNJWt9$/&Bg wlc.m[_Jteea9B1s ~l#A i2ejht|>D|^.'.9K:|7|+O[_/l/~mF {%iڲH PTCBb69sKOH_mг&"88""8"F>ːS,}Btt4"UdMagG8BMxà`;AB<2%w2 k,|[ԑU{`zDyE_ucKM֜ӖQt>R>hZA('efD V&@ m|g(U SPlmG[&. ,,D ڗbH:YEiYPeۄ[XU*O ܮцuU]F%Y)W񲎝xX3`$MW gM۹S3y_l3ӕP ҙ T yp?tuow:K^K~28&3deL'S\L8Oi 29 .nZ5g | l Oej HKA$| LGt[4#MwWXW:Şfc [V> \+AU#~<7>x>~ $$R24EFϑwCBoF^[.3^ \DPut|4DEHy%hJ vSAD?j0_ȡO͵8jGG2<$?&)VMMRA`Y^<ɞݑzC%Xƿ2hϹNpXaѿa˟on$񆲝uhKj0q/&4,8(/#+j4uJ+nFo#^fחXkh_6T@f.V _k}u*H! b?@ rQՠUY\P ^!(5t(f7B$9aN lz>)Z&7)[ؽ[knjiG*;YvRnAZNμPjh5PVwCYzM/rU07cBY!Is80Q|Uv+6}u Vcp.Sύl#!1rlXs`lYܸA. q% MI/m܊eS 0'ZtLt4@~xE2̜p~ksd߼BwC";[9M8TT%@?=x'gLp+$x=;kUd*K Jq4:M3ç_ c D{Ugݛrz{W7DטǙ]oRD՚0WIжpu:B5f2Y&sDC)>'O5`wl  'O~poeFL;pMa4j:'npk] kdx4F|4;HFFe)^VQrfs6~D߀ˡM^^RK('5)tQg:%TnHct $djui\nQ㩻 Y1E>Z/ˆ?X'wӑJNȭXQ}ڕ1D3b~%۞'qz.}p6ز7hvk6~Tȇole`"l |E).tE23nA>qH; x?o.G >:V^'~sd ΅AW4ljYvEJ0D>?uwoéV2( h~y[؍r߉ЭP7]'(rxpPN8#uA_AZFF 񊀔yWHOW7; zfpU x@s?oQ:&SvXū͸G"}$U7\Е'lN?-{F, +e ̜GcjŢ;_=vxtla3)zX:6&&Fdt"d\HCv 'u?g5N'ȸ|.?{(כBMWѣ-oծފT.q]z(00 S_^b"+OUGSӻTQiU J"sk$2; ?".h?!v/VE2lS؉Sڧ"[{n_>l:WQRy" y%+FȣMzteo??:>endstream endobj 110 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5682 >> stream xX XS׶>!prT%mϡZ:Ub@T$aHa# AgEq[P_mj[[]nwz{|ds{menFD""W)?D[fT)h^;[MY9.|[ @bdi^?X AHEEAro~̞x'϶wl wTȼ<do6h"~\B P/yA ^C').A;E-rt Zx|i臊eaNJψm+XjGޫe>k}]p{oӸ[&L4yig|sY@QéU#]j55EFSjKQ(Gcj5ZLMPdCj J9Qtj95ZAͤ\,/5SH ))5b! eKQbj(5>=2"EfYSN ,6YӇhA&#R_MWOdy_(h0v dPX[YHI?ip{ v&FG Y5f)ٶ:Qv%v 2[6P1@@ߴ{ |Š (E/ܿScF bjTʽ*Q}yJPti5ߛ'6O C*EBA: lKwm ZW3la0ۈst,TS8itYAyXBKO= EA8!W7t~\N2ׂ{tLZXDSi,. 'ϣvʇXpZP _өMKZ}ݦsNR}㎏dd-|]AN,x?q/Oa ~ 9g.~;ם'OtY_"N+iEGupX%* 2%>)KKEi1r-YP쌗!|݁P@i|{sB!fa,k)3vG# ia&ifwr(e^gW[d2?y"1 z#HjlrҊV4VPe:5|E:6l=̀3`,㱤?I aY7mM2fН;}'o^[p_Υ F~$K2 V ipS:K_0fiVtX$ց[5w9щXlqzY _zJQ9&esxJo/$6[a'7l._·!Z.}* \Ye!E"~wnz2Gq.kW&&z9*MXݱ 4:{N8~YrB_2.7S\!Ӡ2ܥK!݅0)sb}F>=NzFC42ĝgMacթƔY#ac2 w a A4ܵWV^ 3BNw;]bߺK:$4?ֲ}?!߸D x1 XmJ]I|؆u Ah!Zx6[&[t[hYyLlA YUWX8^]Kx0>kVTqoy4$Ğ=K,8jCCt5%n&;D.hqܺ!Sӓ0}#1Bs;^E0tnhc1|GyGukZإM# 52=}Xa":&Xb6.Gbkuݕ};req:ϖ O<k<<)2631OO5Y{3r'ALº 6l d f3GRLE' E"y~;13^0U7͑g7p1SND1(q %آre.@? ;zቓe|UI>@3<n%ylq)ڗ<W'7A#BymXEPPXXPPEXmmEE-דto@ J3n[?1f;Yz<,4̯[b.[SԘ F_'ؽ9e^M\зxV\ޣbm ;%* ִНDLpe %;+h>yqV8węr+S!hBd^ݪL4\gt Fc jGپCF&&'S&1 UkU \ԏpY^n`&Y8Ѥx&o :SDtD_~Fn5}ӆ8}OBWS Mh{'7z YM~գIϟ?zVܿOBd1k2~hC&jHEe`!M# jP?_Y i]:ҔZC0@ZQ.; zt\JM{oW&$_ s+PQJOf9Ņ&/颛`okҋ5Zgw:˳eDr<3"d%>"H˕W\e7myJ:C$*ߖdg]y2QUYXTg g4z'ɪbsUul!_Y#~^gp}.7_#݂-?da8]؄d(a]d2$<\K~ʚP!:ɚBP¡Xfz)UlM8E08]U'?; jKN'xɠɫPyK&L ߦ{Ճmpmi<\Р7`|"4+xڊ-@()S*ÒT1KJ,*-ޛ[DDgup)PVlGw|m ̟P 6峻ãgw /IRw&F$Ʀp^3"ҢP#/K)w,Isd Ww߃:+lBbr R3S|\}깟8IK,Gp߹g+/-Lٛniodj'WE(쾦=ٱuIz&v2|)`%V%ٕ5477zda_<;mM @FisV\b-!|vvn*g*#0gISN |թ(Ч\Tw mðMAiI dce{.@7+@RD%?dXK Ru ': XHH2x$)˲q5ʮ)Gz?hyޥ rԼ\r:EI* aǬ9 ;s?^5a6!/@u>g>FQI\v KFLhXѡ?v礯p<;Ku`3N*!(m c3ѪԦ0g!򗑏YiD`_;?.,sfQYY+:L?lW`5m*--㲡&jyݨ{\Aag-`\u_z:j;v7qpg9Պ.3gs9!ׅ?Z8ti0<~vYNm:OryʥNkgu1hFGlfO^ @q{m*3U첌R}зnf9[קͻPƌ#u;#$+;;2!reT_b҂$tźX> stream xkTw'pT4ZgR`jҋR""@CH!!1!\rHIDJW-^Tv==uC{ΎvOCOϞ03yXX b͌Oطm'kB Yfe4E3\T|mѬ(dCdXskRl?maoa[X5(aݬH֥f >+|F Zx&{f.B#:*bQ0FE(clMVqo? @kڮ􂥢DR`!SAbPGg9\9˂+j-V ']s#҃ jm@u=y -3.b8x(=[(&KS]祠6J9w/[Gės;Y惀O8**dT(Nׄ0=ǎTT" "0U1>}aȖ5sh9*9QC'S~ (ӣ~\$}uiny5q A%)䒢ԝ7.5D[McZ:YNBTfيY/$R< M0$p(ǨՅr&"X|5Tܦ"^W0fѿ _QUI ԓ"325hv)%`)4dp)Pooe$OQef҇"9'KbL.ڍ6#|JĬ$g v ay ʡcJtW`aN|TES&B xևxB_95acwG8C M~O5̈<վRPJh~#(C)"2 M"[%-lzl];~9)n(}M1ѬHhYIr{Q>5 d#6%ZQQa VW MjgaIVޤKW~/!Vi*Qņrb}.&G ztэ_d``s]>5LuwM8ɥ,ک>Lu wČl#z_=VPf ƕ/_;<8O:x[x )^eqȀԜv{\;we5n6Ӎ^~TU Rty%ͧ\wP(adh\: 1bX_\)P Zp5A^w{0WY8^B۫= "S 2"aFښg1mey|Ϻ\U 3/oGΑ=~P@FAOg/tAt%%X MEKިmt{I?RHǚrMG˩!:QE潬=R\\LJ<9ƒ)$B|FD!f&90qyr 牭2TSZe0-3c(,j_iԛZo͖2N눆+P5~R0 h/zldwsJWS`u`(.?Fn~g~zPlNNK# דINp*Vޡ(l0eMƷ?m="M3P/T*Twt>?ﰊPdeqZсުw'mfo,.ܩԉsIsMB4|[Di |ڷIeni&)!Vw3pV-)sRzT''b;1n#MVfc]>פy.vz D]ׇGR3T;GPx'ʯ"hsfpbvz_,&2 =>rendstream endobj 112 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6236 >> stream xY T3Q:VV}D6Ya@r !KMAZڪ ֶv}mծ}NIФ=(3{wZ&L%g>oޜI!ӧM$9F>*#>&9*I2nA|FFSD%O1&=Fs d0%#dCTrLȓP<2arjfF(d@( KR/._!Z*#3+;*gy6ľ-I[/5qҞSO(9kcۋ .GcbJBJ@fbJl#K2b2XNL!v+JbN&k,b1XO!6}џXD b(xG0b8D DOb! F`*)|1',9~Gϡ=k 5^S{}Dm>콳>7X8hƠC 8P>BSrZEW 3{0|AA >盞~ĚF<9p-e"柜s\Z}J]*s dHQcWP:)NM>"Ps:Ydy ĔF`ŷm.p)$ym=b?QHiIPrR `һ)qSnzg^N& x4 ac2P|gUe cӕyYZ] XizJ pFQscs'݀z"'XSQX8 ;M7K?I(l+ 44܄ %EݛԐLU Rm,y,^E[i0T9V |rý8|8ӬAb@V /o? ޢ2A&?3Fdؽ,}܅Ga"m^;͓ ytk|N4d4COV / eWs^}cɋB= N5q/z)jM(hsi失 zϭ i* 8S#;A#Y[]gw KǷ-CDKUy˖P$p;!h;-GӅh 4 e'uC3 y 0RS%ȡ4,5z h.بILRK"4lPE2%^SbkYJu^>Oe?J%beYaOIVE%ltGw 6MZMZ?o>F7+Mr8\$Vg-{rPvop̓ɰ#He6P[tv;Nқ'Du^t F2~4yӏ hTx)R`7,pl:ƹD->׋/HJ ^Da{vTސ1Jږ HU] ] h4C;~{xMK;4ZFVv`5Vkpa稦zo5<̣I~|&*&`3L. _o|pBHH/Wj8l+:}-yĥrir-(}Gg!ZN%$dw9k۽U"eNyUOiH;BY.x@') >ɴbҴ&,a en|[86L LEJEF.߁BJ3(kU\42XS輴;x:Pi]Iw&.".PWplbMEkb#@0qP/z^zIGQVSQ9IY սg>oUYʒ]dފUoI-qF鮖\;!rb}*^xS2??<c.W%A.'qeP7Ϲy__8HnImQ@./U%yl]9QZOp P?R?%(*xGcoԡ5֖7u|mPw2;>YT*_CG@Q`ɉݦjp%sUj"{n`Qc }3qO|rEa//v%{:y ǮCE>LvEx*QLpaYE|P?}ՃzS^6ٜz rpT5VI6fD$f D@0s8{NdHb_鶌Y{KA&y|i/p PI'/]t:tpW#6)GzBDǑj[ljn7uX)ySl{?yH!'0븈Թ_X=>)LY憆fM~ѐ~,yshLC^U`W\w֖jˁ s4@-l<]aI3'lfM.G9:@ !bٌl`@9Sc@\("4&Z s"-,p ژSڐcH*W (u;PMR+AnWPfa=.L>*ez-&9ݒT8rħݕo9>*~& L1LWVy]ކ7ll BiS?y:lA ;^~CS:zDhy]`aqһր$uf/T`?Rh/{ ݷFdekAP uf"|$>r8K?DyĿk';|17+r`a;Qͷ X4]FM_wA1w7J0 Gpti])JaBhMEUYh*X.$ 56o |UoI߳v6 &Y;E ^.t{_8טZ^k:kM򨡯V-+XP2bў%bM$S<юjg lF7}4>3K7 s6:L ujⱨ< jU,+)`LULeGA\I&حfS?V3h8#u6iʘ *V姡p`)܈HeZ.SIbx"WS|Y^sS<þZn緄"1߮[h[+k%@iy<@JVdL NPhp5ApR؏|(X?1Ey)&&"iQbfRKnL_X+OcN.+1Ik2xoWԺpCps1&t-%/qu}.B2`EA%?E`M[[_bYh-*YD>Un8ͻ-eyL*`p" (#^%%6JzȜ>s-'N^:-j5Xs%u)ms Mݧ%8~GCy;`M( Aer.˩{ "'0_SNYp HWjC.N\]DRo˘\4ve9ҒSRk[]5 2{}(˜uFTUA}r2JaND z0a% ].L1@'}?w& ȱ3PI03M{+p,ñn1Tݩ٪o2(yG?4PTK5J˗DSR/ftúZ51pSy<guerP\-NSdJL,zNn Q'[!bgVT5;*= .xC^]ǚ`]s}SӶw''tv]0 -e1yQ>S3v_31f}5{TU^QT95Qe/ H@&ЉAVuVKCՕi ^OgrDݲ5˪]F-SZ3ka_'.αRVz1˧.URvLR\+,P#[,CϮ/'L͓b ,9- j&$;"V{ۇJOʬ&̇\KH]\(*GV, r-rblϡՅə˞p[ק]>}lx|O[=R D=JA,y RJ`=zM2iF&KwкBz1Sa*=N:x EeR wr`pm;`2VVj,V\dόF:eqq}1 P eY%_I[z_O\acHendstream endobj 113 0 obj << /Filter /FlateDecode /Length 3790 >> stream x[[o\~BC6c/R4FE4UN]Gk'? ó<+)ry!ÙoR?. K?9z w[\xï!8<_ldB,,3#~qrst:X1pQZ,W\[><+=XeKk57*-VZ"\ֺZG*-Ky#G]䏧鶴Η+-.Jk,ԅB.kmiAy;ߕXZ=y,TC5D3Q|;g ޓNAurwңދ*s"ZmLڪVYs/I w$(aKiCh縡^tc% XVy7;XqW?ѥe&UAvdv\i"yg ff݁:zXt_kɺ#a`Àz< |Yy{4\Q) 'O)28󝗒wJWQ&yWŘ1Tt[aeW~8^~^[['$Jj5*nfʂ +=\cI%4a7÷C1u\3= cl 3uXn(ϬwΙ$V%1wʇB3^ .xJ V+E7xAFErM8?\QU]m̩YwRUtZT'y|N˺\^J+A84:aA5|i),qh\Y4lQDᅊ+#g&AqBQmF{ǤuvƵQ|O5 J!& F'r,+0)19)#"{B?U;?-;ز`Mk_gqޖ֖ПsJ.,ܡR5, :TMZJ;:ٓw*ēqo_N_Uje>IM׃SW囇OUi3ueL݉&\YL0( 4ps>,!3<()3<0\!6aAmx `cg x2@U٦ȶo*M ?y֎dY\ `VyCL$Y #ϳ*qߔ϶d$Ax%K[OR_.Wu5ėRֈ WA.DjgOV冶vIT!`ʋy`Ƹݠ&¼"a03k&~@ MjFO"UC)`:񔖠89:mnxD#(\}\` (l`Ũ;?E;E;@ BFb'ٓ@kI(Yi&$B1=6kZcuJD\E$*zB:kvQQW74,r,Osfd)yj VܔOH괳H5Zc!At_E\wԁk:g~=ר}ט~1vQ]rD~}I5ll)H` ef~$O NuoBn a>0ɵԩ85ksʧwc524`)X kO& i ! nX5Džzo<KC0JRdgAfcw{ò3pD!mxsE 8B2֭I~4a8^˩Au"o"Yi]vO=;G/E_ mU 4o{i>z|ڙes{U:;333N!L!D[L:[3h<: I+ 9 D>H+XGU_H{pD f ^# <$X_.9/4 k+w=o4pE{MBOHѮ@MK̍Z-nߑ\|vje=dzHP}8M"ŀ&Id)s*+u6emFï.|h-|)r]7ZQ(M%0WNrIR^ܚ\9QM*'O%nѠ$X+7-@7̼_'p$%kUV7ĀSd/ j`^=<<4(8eE˃Fۮ$@A`5zD_pO#+߻pEvi)YvI :,lwaT<ѾoRNjN;lW D^<-") C7Q`$kJ T6* aS޼Tcڬ# OQ4X4w~bzB)ˆ/ 9DRj}`]hM_dX0 2B }F 22?L #CQH! SsI/kwՂ`2Da} yHM q NhXU3>@aZpƚ1Մf $[L!w S_^,FwPqzZX/jPVtZ n@mS9J&(Yi͢<-. B&{]†5y/ -5^GL͓8M×<_n^fIG^q\ٹ*c]t_JvCR kNOGX#mķ7(d1)GnNzˡu|t^07~*߼\^lxqZ\ kM/Am%%NA,nu}[=?T(tRcmy1f*X~h=J'<D?xulkRƱ,i˳ SWlA"9 /EѾ;NCȭي8FqŹf|4:))|ZW/a. Dқ*E' >e^jˋnR+@l 0_6iC'?q-p\;Kw95~-VY|}_%endstream endobj 114 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 226 >> stream xcd`ab`dd v 1400qt~H3a~',lYYqnnS~&(土[PZZZRYZ^ Aa```Tg`icsL~X}WgŅ|ICB>M{-.@ߡ z&Lܹr^I7_NS;Lc]>=^n9.i< Sendstream endobj 115 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 210 >> stream xcd`ab`dd v 5400qt~H3a#UA欬(_7s7˲~Bg``bdSu-(-I-ROI-SMCd`````(`we?$ ^#P4%4+!?&;CwO^on9m]m|e 83c)n\{帘[y8&I~endstream endobj 116 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1151 >> stream xm{LSw掠DnY@sf2ntSD`{AP >(m[mz8@'a#9l?ﲋ˪?9'999a8ՔH ͸&ʠ԰R\lciq~C 3d0C~%G}_C~&qK/X6C&whȂ} w#KL͠5嵴2ҩ@e->Z9 *-,,K)ٲQޢL,,6)#j:(emnVFP( 41㟸/ 퉖FS'{ц W^2G~mX J> stream x]HSa߳`6s.Pa> stream x͛[o\߅~E GK MEm";vؖc9u;s83,@^p8{ǝY˓}e=;n㗻΀qWך\ڝ==iOڝua-yw}tn/OjL v9)}H񥔞N )})=Uto+H7'֮5F;7~ՋRwRz1zꑈh$Sb޺yзnW]?|fU=}u^NvͶH񍔢JBJVJFJRlJ)H)e)= e?|f7&{نVeǾΚ<4=bX凜O|Gp=eĨ%ڻx>Us]'? l\vƦ]u|I\}69ށKM|؟Ol1eCkp$ ݋A f-uHί@[CmT5q(VRΫ/P VCYC$q H9eS%JqnH %*eEJL`wgYuX%ZFL)n;+\f9op>J,Nr0S))1^ոZ;P4mwyzi_#UaaDաy5EJ|CvVEC-ס*Bkhw4=5wV 1,V 8*)R".AEINFHuV49]g%:{WRfr`QV"бtsU}5nwT UfAt4'tHugZ':$@!{{t}D-ΰȎБ t,.MuvKsYK!嶰ԜmoukbVSiqMAcrM7iR3fBJ`)Ο)RIi5E@q_(M:xY;͠[6E ,њaGYxbiL`G )N;CsxfwvY<vzn NjSߧki}8\Y\wZpUZvdIWhRƕ {Ï>x;,m~ؼ]2m?쁉 @lm`p3zXHӇCW6;n|3/ bƵa`XE‰u>¸uQJPp+@yFO~H^KDW!7*1芕ŧ\x+V8ltk3Q!1+xdwBZa+w,eeX1p P)U FdbOءE\غX~9j]Ի'I<5/uHuEb+C;$JxwHd!ҡk:rpv9V"-*QEFEG:rIMQՄ ڗIȐ!6 $a#C*jHFTx8n3zBɷ*fmqs$fp\yX'ƀRĀ\ {SJScxFnScU_{C}PT|8WK_8e)RqHH(ckrKeh8jǩ J(=Jh e}4E((VŬSiFZNK3 ƌX٨2d4EJI!)R .:B R1 FM85)RJAbeHAb}Nh$%r5]e R<@.kFjMR@8w)Q2-j2LH[+.;|g)RJRRSl]3.ƊӞ)tq?DH & u!͑Y)B)]B1++(Sp턫-{9BkG[Mvo!mܕZ+\]ZMw belIxU)u (B)E#R҅@+pB?ZB?'Gلc?6]#t֣BLQvt3xzq8]8XOҔ9[h09^(nMVb素Z * w\bK j)K#5 4_QC7cPSMڄ_VNH otbK j)\LlDHR素ee5 {=N * crDSM-҂j PYnؔT)wyBl /嬠T@sMXqYAM5(rʱ%5 ޞTPAM]6PS*rHSM %PSJ|rNPQ{.5w j)@W)$'txxEO2:ŊxsvMV+U{ϊx;Ŋƭ,!" +GSS Rn`%j$HIȐ!2 $!#C*b<Ln0r6A~FNƻY %>(쵌U 1w`ţY¿yP=g쩅 PQ|+3˳NTmlY;ݣb?9XM˧?+[ø%=,OZcmVxbت+P_AOOˋޑVa..{J)ixۼN6lʴ<cC^zan5`/{&\\TIZ^7+C%`}P/v˼* ,\y7G6W6 z7n8+ g{2<_.rbS*m& )De\:9{aF.NG)L~4Sh;:p\۬ ;3[iWN>PU^kG[aAo&qY=eجC*r vS{-Ts;+6_okvebb0m!EɲvamLvJ&WE.[[Vںc|pwz7 Cd|ҙ2֋I><;qخIDGYOTsyXGTpwCώ}_J~F ăbUq=3ޓ#NAW4y4'RGpS0L7R nLE,fnn2K2&,͠Xf{U|l'G_/Oczz銹G3v`'vs;#}iH_ky򈇣b;Όx()F Ǎ԰㫏k-1Y7tKfbx(n2.;a=u%&6z’잋/T]!ےPy`C䴅endstream endobj 119 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2504 >> stream xViTW e\ "  @@(NP'&ApQqĀ2*eoBDeG|5gIӧOwtu(S3b'W)-f"Cl0WB"[a2CțQ3)Mp[~"++kԴLRyLoI JrWf$)bg7D+3wEQ--3#3+:/;6.>!)9Exۥv˖W.$?yT0z BM+F-)wʃ)_ʏӔ52(E۔1ES&4ʂ(FRjvwu:1:ED"A7DF"#29ǴJl$Ud+͟g 46RZPB*߉SůF! >6tAPx'0 6PQbQGך~8g̝xmY?\pnl'o)g@5Wo4`hrJ qK@Xayw=G^C(k ۓSOrF,o,B$`|;GyFv:Xq4%,3UldyKm̵6b%ڌvĂ@d;Z>pkr-!~+`n3t,3A"GJpc?))&`ނ=(&y3=@$o^zxD`^<W;a .&p7)Uآ)"5 ~B A WX5mN A2~^&ԅ-PaX;$W3k6Z9؎mEܭٹ$}r00$d9:,?~W!Wc0OC%nHq~wT%UKb]슝`O:aVlhwڄtL0nTQZ(PO[+%WLbÆJifi=1 N^q;=KpqF2<ho`p$vxC-.uzsAEsb,.e~_;0eggD7ڈN83كhY\-~i,8]<(E`MnX1 Hشɗ1wᏚp?tn R<18ɥ0W,~GtVP4)b9[}?1 ou(BC MF#_K`̆0Cآ;!R>;cszE_`+&OUaA&A2ñ5Xi@YDtk]P7bu߰ěqLբ%c}>/­hHEB-$KRhNlͮ#4 MtE!5|raio=F?ї6}퍖"o>#s58݀`d6xb;!ys u aaclA(Sͼ`bkQۧ2Ҽ%GI.x6s&-?#N{4fĦb#^/b jo5o&rw!]\ZЇ)݄+,,v"FV bFhS p9SyGFd1%kt/9;`> stream xTkPW%ͪ1 JRKUTfB(G*j+ZAQAAPa,ZvZ-v9oEswsNM1iiӲӳ2RZtD*nfBR=rfgAi:$zn߄Dd[e2[4N4N4i&cƇed4eZLf}NfAJffPD#g-8!hbgPqT(%\(SJʕ)7JBIC(1GuR@KNNN{D lQxX+naP'ay@rp3x*).ۇ44tZZGwBfirGgW8 Z,!Zo̚!,!U \o\1'6mt5fߊ oЊn+ZŎgXLƳb1'Z?< Q>C ~9sQ,4UF.rX ZWCa'O@k7c\ k_ m}F9=e#2QfPa;+{jTB;bт - e1bF st32B10t-h 4"SѬՁv9t29pFZ.P )=Q o~yа߼g C &o\b,CU>ئ)kqm H|ޑ{b$'d D O,%H_0VCeMOHNklo6^R+^l'^iIѺ֫׬, vn`$H@8!TC$(ySfN I{Κft{٥фE17,Wm(ڰw}ᶝ[vm xHܲcݱi0m9yOk[@0K3ܾKuxc 䖰j'~>kK:V?k0^d bJV0b(S,D:,endstream endobj 121 0 obj << /Filter /FlateDecode /Length 2977 >> stream xZMsO/[ ?ҏVefϖÿN?l )(s6j'48_@>v{Uȸ`l~XC7[;\bI # "v3c9E:"aD{VWQq5b-ĵ+n8U̠!^*I>l~+%SEiZ'` lysh18;:Xl `yo6.leAp Em=xfY\ B+h:9nu4xء{l{?.~j;l赲9-ȗɊ1cpv\,h^wQ*")A;X\49#cp@ò3җdQW~T,UqܪT6U8F[`pJz7sZ'%qq9S(0 FzIFDDf>'Wu[Z/mg\ -oRn(/-VZzua.?(T:/K#𢴞xXt~xP÷U&?2Z\e.-?u̪ws)y{:4VϹ 5ِAT cg*fp-d#`B.qcTTqUBZwQb"Q#ͷL`e+%[J ۢr w0F7!jY@sVI!Xձxr 81K !gC>Bi -AG A5Yjr1v/a!~m'u:C.aOɈmȢc8Xy*4Y 9d =::ճ?U莡" BTm#)c51 onhl25\IH#u,#]UW,xK>$C Pr H';Pkz4A2Ÿ4_7^X6BtM/ryP2^>AͼOJ;2}V<DZ @ׂT B \kW̻DE M/T^6!<qҬrךxznyC|o N4ă/E_75jf9 iKF8pU䳈(Ś*tS\3t``1yz920>N]1 ŷ~I}7GgI vֵ$훂W A%WZJuBM<5mOKzYZu;"pP^(ȱ G  &nK@~^"m2䶣g3_o&t#6hԁlj"H&Lhlt$zJȎqT۬(Ϙ^@a`"e!f. ĩ* M5c*ePP. e +'4} d!VdkHE$dڇ:)OSPyaR1ka#oj{!ÃYeÈЋE$(=M+uE^dVj<|:xFEu:C<-ϪSQyzNgI[P{׹Gz{Td/"Nyԉo7tى-h?u"] !nr} 8 F.Fn)JKF[V=cI8P:4zTO{@*8P}4 %ȑoS 禎b :?6 Zl6\Բ@Q@?,Dg^<i(j B@)W2'̄&MrM'H>C0 9#!; HHN }endstream endobj 122 0 obj << /Filter /FlateDecode /Length 5707 >> stream x\Ys$q~GGIi}vP-a1(!=H~XZ`Zg+*xi9FMy~yT\\wgF3q~s3zwyw ፙqTKe Թn*_ܝaһ}q!Nlazlc O|1ZkCLkC{x0 +.tG)k] a;6n=vFZKip ͫd.񵆳ɐJ?/phC) .E:-.5 vW>F26zԔΦ}6iSRi"dӱ9!=t2Nw3Bh ;hA .;9Ñ`;P.uyz*Oߕ;6n@Hg@7t@>&a!~c&ͤ8lq C|7|zzٯ#(hɾ ISdN @bR><ѲMR I4`ᔈdeΤ;_(.樂Au%Qħ<}Wnuy<]86t2MRlԌydl{g?ɢA)/A' }ٖ$. R|IZpVC@: Nm_D'K\i85/Q`օX7˶sG XLü?cB 3/Jn7myʩZ/*%6{w)eGU&PqvRq|lx.;p9fuWOHi>2;60n-7Ta gd}Bz↥&h`4DkVMiQH!d"\tYPCɎ\l;T?04O᱔f&dP~P._:"+`EBE@F#W#\TfD5[jSN:W3hGNg!Do"j= ?ϯnيe px3u(XﻠZ%OS.9 $Жia _5e&Cd檉\'VX%&'rE3[9^jo.&N엍w[&A' ?"e|-qSqFdڹ,a1RI ntȘ 0e+z:yY:nW4چo#;+n"~87<;Nΐ ˟U! }۶+8`p+Yr_`T pҙMc|y$J2WӘ;JDFֺP> YL,#wr]:H2[:\wvu Ԃ'v^ft( d2`W0CG;|+Դmas`5'~Z$"xcyp+d,e^ĀӱK]`۠tFXh1SO>>ɰ囸e`<pe]u5"Dԁ@A Mͼ bP80<ԺځmJW}@ɱVsۚxad,Cmz.pGS8a]`eGzU6@5oqfVx(f7Jû0{_*[ehio[ˠⵈ­ Is-Y R lmkWqRIIc'Iyi Jd6x+&.z/` .'I21wDӅ{co$YXlCyMv1ڕ-~̕7 Up 鈱IMTw_ aC!}L0}{8~w;Gg`򖅝+MQEA: RJ Nv5va|h<9y9҃܀QZvfT O YxL]ongow gY#1]VOi^e/?vHb< >x}ѩHc%ULU2V-ǐޓ EmE{0+';#V# 20ySq7RTLS׀]uHoNRCHE;B!c\aTFĮv XQӺ˥U+^L ~Z g\njf@ggLVfq׀:W{FS8GE|36q8[uY,41aB^mR> &4u͉.p}yz3x&#嫗c$n q;TrD_,>2rWyHV?L2oޖ$3j@ymI$´"9 qXs.[I^X_el3ʐ>fN@R* BDK.@9/4 ۃPM> fH6M hB R>#JMv2ByLJ\U= bA7Ăp:(,m:uZIg Z' ұ&Zc|ROke 3ۖ_.%Wۥ'*v8/z(KkCɲjsZTRaucg`v)4^8*ER^ "w1_rdj#\v6Rva={1sckDdy3:9  y>WD t ;ㅃ]1HdmnCf}~4Ӣ MA5h<*lL> ̃i(\8 +bsp*"[ uQ X9n!/gHr6ea7Uv3LzwrNrG>u KilF͋. 6Xef V-%wł!ᶗV{,\w`lpIҬ{?.o6Ȏ>!K6MJޣ|0^݁JަRn*&E7qx! D8vsx]X8 ;6(l3c`6>m%V0˜E-2bd7vHZǥn`k>ꦯJ3_.-&:]j6mc{~h3-5qn1MDmS!nN\K6.kԌgو?ҕD"IWyyʈIZ(4b]Jc.M؛T!5[r/"N㾱& QH/vkC{WKRﷴ8~`˂&ĨG%dL ~.(v|FH\B;vi6&(:Br~ɂ]Zynåo,9Ez?|veC$oR/Vv[S;R7~hPSFoF Z6XlWkn 0,M,:Q^Rf( 0;[QZ< OCuE͆u;@$SK〡~P=&yBN|߂vw=,PZ*"cRV b62l~NGLL/f ۀ&뻬+Sv78th1I.+NK~۶%Vx`“ 4MӃʄkۂπ 7eY)qTYZ7̭5۾2da.)8Ozj;1g;x{z>&(BO/``5эk]>!T=fOTZ Q*qQ^9r.YN٢rrA3P4&Vb4 6DgTNQa@Uv%VHƴiUb`ޅawmrT#@PI6W > stream x Pgw fW@N;Mz~#Vz*VEET>@)# AH$|W ȇ(- bY;c֩gy ^swݙ}1w7 qaPk_Fsi.䄺Gկ}dO0U C B(j@ڸ}NOFP5J~MM5h67Ohㅡ&I'IOʖQP=ݥ%]C@~';|7$ם39(:maD\e(z|-ŨАQL?V[尜LnH|+icD# `Z ʅ~/[I;Q@]B!аP2 +]c70bK!qKJgc}t}vbm/.zq^h NEuNrɉF+D3A}KxOtqbY &h'lf^hf  AN0tc:(ώ e&ޫ(nITE8w2֚䆽!ʪOh*z7Y ua2mH#9愤Ƒ;%^bW.'.ё͔HLxT|@{X'=:Zi泦bl}'^zD\7$4FQ! 25ћc\>M8O_X0w4y_ 4H5:-̋<[vB&Ⱥ̌lljKC |Cq?y '3QLѤbk?=C/u X\P`41{3cx-A+n^ӄ;霼aCچϨEqh7{᪯[JM}"oȵiDybkQڏ*@2> zВ:2j)Tr0|GN_pW-7Zh-3'XmNK+p4Rvg/\&Ν/å{P M^mT}#@޹gN]9~%]/2AS_][nnH4J-oM&n1F.8(Uux_NȠGHܞ B %S!Rz p;ȯ5~8,30N/-#umRgŐw|÷D.fc\ڈ_r.O*vrh:îirۛhn&̥hf8 M6fX! rV6֠e77`螖0QE).1}kP#Df433.КesiG m*sϏ_>ͳ3kU VQZ:{6 +vqG@M3j x^&'{}:ZL< /U}[-A(Oz@Cz C@&8b(8P `2֐ޮ\:^ԵPփ"Q{w= 6@ܮl wѾ"T"@(Jb, )klB.pzxZLkk& endstream endobj 124 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1294 >> stream x= LSgAA\#B[_[Pt2y!(WCޖh;H;yCA Qs0D7Mʹaܭ.K%''_)E#lgTO2ї*>v<#YMwS4=q%˗uY9FsZuAjCQ.ߴ9'[U ffA's֜:uި6oyQv.?˨5/_EQ89y)j=OSTDCEPT4CRk)9IyS4-MGP!T'-觲 YN2}湋KS\Q,w.v ڣɐiy\;S<{zLQJ2ӥuZz@*!ψ{Ѧ{{ : kC0U;4o;yXa0X,ۭP;*-vCsY/ PyOs^SMPk[ 噰O %f}UhE#DSV;b#Gp>)x ԾP`Iu1[4 M3"'"&hs1W( o |-㠵j^M9k#ƶ|}LKYJT]lP蓝ntCřO!!Wn|pY|ڷ09Hs\8JF{H=pܒs٘oBl mwIqxs[mCCW7vrH(uȯbR`+09b5%QJr _kBA胾ꎓ\+KP7ns tz.]/\!okCs3bLPOx$ĬȰk[Ue.q\&[ (bE!d@Fp7z-['" 5 q;Pn6j*w>`xD#qD T< ȶَ+P cMjƀ@@IҠF!~I5l<{"@NAhXr0_*9p%I՛A2t(®q'ꉻ8GEx<. ^:6v8.Z)Iv SզgY'N)0,BZdH;! Gp![y I#DXdʳ]EvZbup#,f#r6}lv~rendstream endobj 125 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2941 >> stream xVkTT>0㣹SQecPQD(k`y /yAF)%y(TP0DAQ_%jՕgr՞6mjjkYνo-AfH"XZejoOfHL32Si!{MY+9W_yVRle~bk4ȜL" _dkBxTjGXwRR› qc"mólݒӶ&%ۮMLJM KKJ KNJMl&ąfz5qeRթפ _#2*;&6no_o_hvYQf h6Fku 7P D+١ Gh5rCk=rGkr@h=Z<FQ?h #)/@wPZ`DmIIr$7%Ff;̈tttt\iji$3-ie՜{x3~?+C^(o&ENʞIeXaqRf9۲Jc> WITeL O vwǫ1gV ֥\xhgwK{Y'W(WE3j[UpY0_M{~ Jfu quPj:cRmC\ݶ (徼aâJFiкc &LX$Op LT2g܍y20NX6OX3 %e / G"JxK4>bGȱK͓JKl&ȒOs*n,inkyXiOڑ-z_;6P[ʡK|sDqr 㘐fBd,4FG\^fΘHu1#v^vHNۤ>>XR\^T˨;~& BP{txb㈊Siw7>ISSp;>TxGu`ϖ5L/St%0U1#!#RfSxa̧9$_!M]eWeu$dRGpHeWupF3'oB1u|DW?;RR4]K hi&eG'm%~vo?膅WƳa}3FAOѕΠ*!ܺRAI@Kڊ֖cyܒXR0MM/[R5ommj=4 ]i9`#'%3-z@#xpvW7M@ Vm#·EPP vN.A5)g:Z%_/p'x|^{q#ARC =66vT`ILF:<N|T}7^^(nf{FDճj!:8>塍䖬̵>~ު̪x-{]l'ߊKb@XsrRR7欁#k܉൦+i x9J?g ҏe ^R|Ͷ| $Sj5$ŘYͅ90o`NgZT5ٟSjm6=`%8;#` N4SO2,s }Gabj2M BMt ~6At4A :@_vgGt_jb9N2:0lb=* ' ZwfWJ=3`+gՂ,!#hUFF{ݼ\'tf~VyDWW .N_J0o[ LITt̕jmrp rk)L#O`'8h|\\z>8rc9uO!x~t &҉;kٲϘC.> 'Ð2~^Ǻ暪&#ޡU:y5&r =<,VdH‰M1b̆W940^KBI}VVV endstream endobj 126 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2032 >> stream xU}Ps5i51s̨h4&BՀU+ 'p}{(;;?;@d*Zk!5ibډ2?C3?f}}>cDBYSD#cDK ԟ/ >GLBqRL$HD S zy!so./OVjc*>AЋ$ulRo^ק;dHSk̕ JRkTWUzy"Y)s=Lb+58VEdU n^35N=IZb1@D"#+DADk("OLu | J1 zsp*FLJ`1Lh :hQm-J9\eb~_TEf{m{74;K>gxE?zrcM&F6^tՉNy%G_#OϪ]`#˒ƙT/ػ<%w 3_~+5{q&Qߵ. h&ovkq h-+dٻQx<o [hJYÁ_~ȋuGI x76P ғFYм ) IOH /:d^y~DKP%v+reC Kv:nJiܱP5o6H o_&8 נnXLj-oe !i9gHtKX:0#k! TTG5>><:N$GGͼ~Ror?d5C%8|ˉ \ly6kA.XI3h3lU'vC 0~{f#||sJQxErQh%\f]g"IѼ$;g*|`ʡ!_jOl9l[Aa/5֕ {HTjS,RSh]g<+8{:X*|'2!y֌lnRUkԅ0 `8@qV]qޱew 0%PT-J71-EDK,Q{+@ c+n1yCJKuwh:L[j8D/;%ξ~7)LENV4}#*82&BUV穩񜌇|ݩNG;0g ciX,çg;kq]h@e)|q ݽcN*ZVj{h0߉E!G赁/L4M4v:O#M~ުU$`/vx0CMII PȄU9%10--;0!qM}_{ID8mRIUHT+QlDZV˖;FxEx-S'MtTH(4'x|~[L& =RvZՏ޷ZXC☄2iGKDT0Tdujiv49(QlQåSD+Kpt$#r x ďRGn\$jAlKWKJ^l6Y5k`#GɫȄ}d \8ҦrbiE)M$PdHGx B:7oH7RPb).}qi_ĸ# YB}hO fmԻ\Z7iFeqD9IQ.clS5hRj MUŅE\~M͌rVknϵY!)),hNft aUH]V⢰7{';YW; :+endstream endobj 127 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1432 >> stream x=kPWw [A[$ET gDJ!bǀ a!5X:j\X 2ꠢj--ѡ/S~K?G9sΟs}CS^M>q I1CHCZ%I$ &Q~m)H"Mc}p?pHJBl[\`HIȘ0UZkY2RY-x0VR3t|*t3""Vk֘nϞfzU.GgmVśxRQ3|h3͹΢J0mY(,|J.1L5Q+d*ʟ T 5BKyST>+ѫd-e[O"cďCTdE?y~ b%5udvtYh.W[G 22jA iܢ1m`+B#xv}(?X9q"*Lc.a[kk406nLjxW~k!l>=k` YvBZyi̳;[2!Xt#*^maD'1ΫW<؉((ex$Wh\ @Ll\q-*߳y9e>l6WO)U\\tk6ot75cC"hd̀XXT6}i}icwM3B|)Do]?2ܹfHeywne"-$5(\2"aq50p.ճ3i]LoMchɄUvb@0O%B L%;?_s`㸫?efkڋ4V47(V\?!2,~>SdMтw(4t hg|AŪz צiǬnwoS;Մ#9ԡls~<%Q%&)ő6[j?lpBQ"h`m~!I,[#,gy/I9xW 󎮒*J{+#(_Mendstream endobj 128 0 obj << /Filter /FlateDecode /Length 171 >> stream x]A EP 14l Q/@ahXt .Zc\If}얂y@ΣM0% z?]fґp[;:[ sH4uN@[`p?"!PUHyX.%%\+Xb%EW7{V;endstream endobj 129 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 367 >> stream xcd`ab`dddw 441 ~H3a!;VY~'ٚ|<<,+?^%{ #c~iDʢdMCKKs#KԢ<Ē 'G!8?93RA&J_\/1X/(NSG<$C!(8,5E-?D/17UP=土[PZZZ4=?8'8Ɍa3##M9 ~g.'OK3{8&Ψhmosmwgwd&Μ$s͌~|gJt+ld./=GxOlo-"Vùy620]endstream endobj 130 0 obj << /Filter /FlateDecode /Length 4466 >> stream x[KofG[~?") !$Dbax& {<OSկ;f"K }\]]]]}'ۓۿ}iœ.SkHxw{M.Оd]؋qln]=]?\}y}iv_v{qycM%ۺQ啁6c7`C =sHCk)no;|ٲ$k O_\_Y\b:_^Su>mΆ=rtח4[9?!QJ}໦xe> (Utnoo.nL n_7SϷ|u._5֙_7z5a|5 }=~15ތOuv4g94'ڽhOae㯁W)5EE"5EE"5)գdJMd0Y:0ezLLxJqm߿Ѡ8+@jݬa#nFmx60n\\<2x&I*MfpY#ˌ2K6Mf&3ɬ+^4J-ztY1*U=} *R@Ӑt Ɏ8V$wb+TѾE`PncH`=Hn٣Y1$]q ~A5=y@rMEQjH1%Lteoߢƫu('n:{t$rQD1݊.ѭ9d/s8hB2.-s8xuI,w?A/j)A;ܢu ˺&}ffŐv7 y<'`D@qgO qG6os8,{;`Hpj}!NڦxKtz dVNLHrk":Udk#B.2<=$0?.2;t IҞ nj!݈.эeK *g6!t6!]r.#m Y>/4(hM ;emC7Kt$dbEž3aAKBʽ͝&򴯽QKBͿW0{,hvjv! C84'ys7D\f{B'1P<'mhߢZ\%_4!=b ǚ ,fnEVv yd3<,HrJAg0PTWt`ocXn`>Kء#GW:GhmvP@?A哐48@ 8 =xB{Yưl&!~ zSG|bE1²wl C84'!3aެ$Ɖ};p&+7pN}:{tyyrHm/ ,d?|VB}1z3hϼ+/3EZ8nˏ4 }EVJ^EJF'"# eeyQf|޼SFYE'c7t೅;/Bx/%>EʇEkX82lsR/I=o?p7n~lKjϱAZ X}d!a٩A`|37ZԼah{ŏZ1Ò]%Jd~3+?ó3n&!3if8~> stream x͝[%q'FI<ޛt< FY Axv=wWr_*֕]bY$?x [<tOobcTB۷xys̢t]+mT,%IRF,-5TIJ-9ZRhIΘx=m rA' w}\:wKF=GB3.oK(qKu[ҼU-yZ.oUKV\ުjU-[ry WtSJpTl)7޾4k&I7̷n`SHa[IVl? fԠlNEP=0L 43 3ّ{RH[Jlfs3n{5j uϛrq>܆nvy=fͭCn2Uо՞}Ӣ:@SiX;~Ў/}$! I6 hHBrIqÒO ﳝ&ڌK|f| [n&~ "CDh60a28#}u0#`RR$\pVnJREjMmIh[Su[-RhPӅ:}0C\9- ֌qFip8LWMx0\"gf(׽."$U):$t0\dt5hhU7j9DݽC5Ď UfIHgϬU R8Al(u6:%m RYіd*ILYD[z>A4Y"Q'{ {KfǚRGƬq3YYrK$!fga;jcRa8v2|d𪷯'~:S`Cv)7~ϑ ke%jZ{Cw>P5Z#{Հl^kxJ5Z;ڎX0 V9@Ԋr.<[&G5USb2gXOܤm~oբѦvL]95` zݴB~7ryLJӒT1-+qZ*NKKLcn/ %AX 8{WXb`s<*ܰ;#:OKh$ MpIrjXVOJД :.O!?_o1'=ԅ:8[Ikpd=T?ki1`ٟTPvf]f@4Ap0Rsp|%-QEDprk׿#7W]dj+HII8)HTwY $c qA4E1ː Gz%ɸiJ&`J;*MZ\u!%:5B|M`k gX̨*>nz,6`UfHF av3샺@0͙' ̠pRϮd ",3X F9*~v&^2,T |Z u'_3.`XA| q 1`\ wH-,R@4BNf45AN4ol@x,Pa׏z]N؋3SJ_ؗG3"lHĊ^' LM\` |j$bAG1FAD״ wL|U ;w6rPPq6`PDyNfd!&PTgBÐG+Fl,;(T f>1 "࠰lD䘓eG!j`c+ 0gPb|%#eY6D,^`YpP,K5;P`=F7D9l8 {j@dj`OLHv8XPĴrDA*0A4؛Yo*OB樁^XdDTTk ](WK:a`Xbe&ѡ9O jI#FUV[hBhba b!K= p7*60Jcّj0 G`j$ vI*b`b!I?fuB4cZp+=$S>MɎUC| k < 8EIO H- p)7UC\ k <0G^M`P5ԂԆ >>0 !jSt0(ă?U~ޏ98u!Ϸ Eg*dž<pl)ؐ±!1pJφ5z6qrوc>-mpl|zG= U}Tk 3= h\l$G(8,DQH GPZk$e!K=B砰jV`9CMdB 3 "& k-dk 4IDѰj k7lhh~V]djаKа&3kdFC'<VLB 19cɻȊ@gTM84IYgP@7&@:.sexω'5 M DQ Tqʜ'(b`Ap ưp " F!.52\ x wb=-rsm1$%SgERQbk b X_ Z(Ll8hL{jAنA5qY \eǃ!^5σ02n\I'+ c0[3 25p݉~ó<$:*T@1FRpUJS$*WGL Dُ 8B*ˌirICuHBiO #h,jAaO+LFHlOA8n:UC Bb8xy0+nƲA`"Sq xvǑ" ?F`O8 y ,C{r(]]HV84Q Qx8Hn$1}NIp(~fAdj[M|kdC/CL Xvp( b@Dj0:;vÈ}kd!.5cg$(c=XppF5AcC'CCQ9[.is` Cp ydHcܓ! #C(G 9!O '>!pJ ςR[doXc=}w hXh XCX8'5IFebidH'C*a*R U%-kdCe &Xrlܷb|ҘIV(Q5ՂԆE☯ZAQ4KƱb1@1a>eHE` "SrbXrQum,x!spȲ*0 _ZփC'4&I0l_)vpȢCU`S"BR3##!UA\K "Q!~!LոMP>$h j!ւA#D/ǂ8*T֫!b/"Q4ՀʁO$|M,kdCDUł&C "n=N!j0 .^NⰒ:S4K Q!ѡO\$Oo@Da-$fsA4Eࡒ~;BU"y5B"p<2 r>9@p|1O=Xp:6 nE3\.5Cʟd߱!gÁrhA1ax6l '_3zeIgC~%GTs,ߠlHgCe+] rWGwDzGCc"R yÄHv`"XcX0˷s!s>!F(ˉ^!ŲB`"S sINt9",?{\{B-/TS ǜl^c9pb4DQJ>Xq8N,nƲ#D "S2˜eЕT_Xp%xFo0O5GnSp"}φ ]gro8(V6Uų>_1*^qɞ ECO,Lmx6džuAcmT~Ƽ R,qlP/LJg7Y#98$!kG'ǖ}~q( V(<|ɚ/x|Vʀf.J('n zŨɁ6VH(GB} . ^Q%|Ky~J`wļ.VPĂ;PJ`J+Z ]N({c^" 'HgFSLsT4$ 25şk#bgzehlaro%mik!ϭG6hHlA?䱒0Cj$ .NP/EsÀ0)?p9<~~ohy ,ϯsP*;X`'w8~Jh1P7wC5ˆ}Ʊ(%nqZk`-x~3]mG ϛq aǚPBGk-h`Y o^Sҏi8f gir~oo$-_[K*n;w'ր[bl," |gn&TLU;!=R%@Wp ءB>;~v@샻 <{M ~Gcؼ]1}E֊das@rr{YZė 7og{8sTƲ{:ty<;!4Sn KKW-;_ >Ciպț%nuM"F)!M1|d&L>M>(DIA-ݲ2UEyQvw{j<2/|_!!@uvQt[>,iߨs^A_f f`{ks-TC,p>GrbP9uM2BΚۏ\2g1L&Wӏq}J32sWP63w݅>9]SW= q3;r^F^ՓU-է:^\H+FAۃosه?us\֫x^mz5>LAH8>9H,\ 󛃖<@<zi+ӫӫ/nYmo9fr 5#pAoCz8ꕣ,ɣB BG.ZYGDqIȸD -QFU4AUx_uwUaKED}'ci]#umY]g6ZMBsRaku(L+ Ʌ'FrDLӭ;@*;ʰ;FwN+//]yI~T鿥\uwnlOCܱ̫y²ζ~GG;`Ծ|F_ӍsHI?XW ۄG}MBڠFS Fl*KXqڱ!^~km?\zCA@bÉBpWa4bqlj>Háy`64F8M_! $Ut?y/dNi27LC@H̅G;tΟ6r}%]+^rckXB]֣;5C> stream x]Kdq_Gb|? Ζ/l/H3m˒ >U>$fx"Y/bnb߯/-o|6b͕rû/}ź)>]5\D~ 7rɗ~b.~q[Pl9^ /)j󭖓V7)p%]h XbFܜDiFs*D(X{K1!ZQ tRkS_Zє {ZO H9yLx6Q2Q-R+n2~43\/ު湊L3[L'f&A4DgG+{osO_ϘՀGhKvg}qb)Ed6VA;_O\V< Ts6Q~D]Z}HMy."զxNL#{3yGglbOsfF(AzP;ђGaYбE[,N1E4%H3K+wuJ(&Ed=5kv PGx=S ;WjIA%QuB%V_nlw﹊T'O3iRX%Z hŖ$oՎj'־/Vg^BCs3)\>aiD,Q"R9j$I7ϴ{Д}X*Z1q[̺x+ )<ِVR\+X@""亏i-#YL~)hfEK󢑢k!ʱ@yOdCk rtl]hJ? V|*Z,Ns3i+6_BuϓήٿGGފ5 P"RJlIcas9NOk웣 JYKfH̶ZY2ZMIsS$E͏|/T&=mwM.p,#S kB6v."S*SulJƺna0^0gV/"Hb)T[-f5{~a&A1洊VsK==Wqn!4yzxy|qKHi%KAn,\hAKi.6-W*WշdVo OS&dnD!ٙ"d OC -"8x[xJȃjOH4ny?}*ZY:z 1bh^{Uř'2UFWIg+)3Zɶ-"uYґ<NևΊ_]fHiQ5E+Gql"Z,v96 ] Gk+NzhFE;1Bjp+ 83ܕݎ~QU䉦m*,9&a8[NlX l9aH77}3'9 2m56R+U%m950Մ#Ͱ'͓Zb#"YHۧHJ0Fec )LAn: y?t*ĝv׵&h'L D @ 9c /.ZZY2)b!ѩP9쑙 $7qtƳ9D7`F/'Ȋ q#>kXycrB4 -"saIHޜVN1It]r& Z@q S#h$1&-. }|u˗/+/yX8ґJGgռ~Kv+~5/bUS5['G7O_|3Ƿ! b(&ʮnς$IJ2ҮL9}xiD 0-N${p 9Ra/&KBjuSǨP|d 1cgXK$,l_IHHO޺v8#Ŀxzoabhx"1ŻI['=8t gBV09Nqä6b0ΤYyF+!dW`@_:sA''9SM'te<#q9yOⴤEx"'yLz:B'1Ҙ%@ 7rǴB@O4;"m`-Kˣ}RpD?[2^Y]PokX3.KpkF "CK̤Xۿ~Ӧ]\hk!IZI?o$ pQ?\D뷯^ӗ-DbLr`_OG}H0ByW3{+m̎T~돡"!t. d:svװOgQ\It\4G8>0=R$|w ١7|2F`qE l? ?G䟶ph." YӮ rRH2( L;FM;#K))2ZcԐ @M83DGWRE\jv:O|\!\F 43ȸH!4|)K| T &S"U'$NYGiOe +"=N¢Xto[Z.@Q>2RlPc{Ҍ$?d"ZEAlCB*߱E`Yh*?OBvU# r lG,4PBUL%-*ޛH8ћ_CI5'ˈhkMe0 M e粓 1ENaT#3 F),Ph`}+#cƚ5$ĜVRbxR*FӘ\(4Pi-Hb(Dcia#l\BG;# h[AQzdFkH"J*`ħ[D,zΈ5>hd5#9`:+OKGjyY*Z'QeWf#Dha>K/ܧ4275Kh>RFO3n?\ikK1p0Ky["Z_V9<"&E+CP"@'>2VK`c⇷skp>،Ѣ9Qrq `9\79K(͎%[>9 )9:RHl0sCzjF=$k`e+(xqVbx;n#1CUqKF *n4F5/=Q1tGzD&vQר5`BGبuب73bب7t|5z;&d|F`hP`>j4Abŷ(j>P$3G j4ըXcL@~ǠF?'FI85+foBw/ :bujغ'Tsҝ\jxL击;åC H̆ cXFybhE{UMQa{4G]!Z"Rz< |{%AZڑEL-hn /)v֐:r>61MfIhu-2,;AY,нZ5sQJ^` ϓ؋g.G &muO賉hFT_Rh;ڂ6C6#ZE0RV(|0Mg1uHҌU)dď$c&ufBȗӒk=X JG*9dhYA:ZS\S>IJU>5LӞK"ZZ=Q,D*87f+n(WROKHɹVh0Ml:'2.Lj)h=|BSuGHJ>zP*Ma=?.3Á`T(M_fkU\Ek,ݴP.cZ(=X n>)3kZm鑐Ö&ק4|ZVZ>p[ތʶ׬Zf$)<#k5T̈́ק / iP1Mf"Zg7;a*Zu /$¡&q*:ȹ+>V e4=XDL}pr)3z\S?(3JQ[T̨zd <dNYyq9#id ?CY9tuyG?NzJ2vH ~?0_=7 R9}3ӮeUe=zw?spK-YFБe*'l;N\ =zx* ;+- h(KcVȘe;R=q8U#3ɐWdIAEfR {bLnX+Fbp}{BXvM Wٺ+*~~2VWWgU-Oztj|2ѥ2WLe O:|/$zEG-RO"E/D^*^ yg^CXeeY^Qa!l]M&ׇͳX^v.KX~e 1DqYo,.3+Fp> 5XLbPt,3,"OO](bB |=VB5Uc<PSFRQ$d.}hվtZۗZZaVڼ>ǫjxl_V%;ؿj_ph>tmecu7]<4ھ|R"6?\zĪX35r۷r[kig3$ J#Z{qy{E|C>W?_V*l Jk7m*HPȤS7`b* >'c||}{gҟe GqK~h1~¿M..^|472X}F HW8UWK)iBۿ>Z>Ӟ|WRO[0; QrXa8R~ƕ"ˊy_߼a1q;7(Ƈ 51&" o Ibdz&7|.9*.ol$Afendstream endobj 133 0 obj << /Filter /FlateDecode /Length 5249 >> stream x\ne}yg&bd0A0΃[VSEnU*^V?bl~usŷ2q&kY:hjAZV/n W7Uxp1^9Mȃr /7gw.n_]~X~x|?g8茗/\/Q5z||ӿ8̬B@a:՚^pC^jw>LikWo+4h,4@[iݪXsT$WA 0"ypB=w먤AI,j+iPeBXP.h06JT@\IU{ayIW !*M!$z/^-H"SWbQ06B@A !/ BJ C(*a4E% <7{ SOBr'RH _F{vC+f: +8ƭAoPbqK([B%T[ո% -X-j~.⻸^CnՂΪՉt0K <{፵"XxJ{' %ľRDXD:ưQ};UJ-Bb bgJtX6j5 NPA7,,ZBZ6T-WewMh`s ϯ6  :F$h{:RhNGd# b8㔋٠X@j/q4K d0[ 0_@j3n9e^@&Np:<'ˬE+}ð5B>1\@N o' 7Mc1Y@KQMي~ 4%"L%ިIZ4K3£GД 4`ДV@Sި*[;>jЄ 4eNxi 7뱦Gx+)oh[Ly+)o4孀QM3ި3ި>h*x >6 hR0SV hJMY))+Tӌ;IE<=0ڏwgEl8Aι fZ`|'T'd7נ(S&tst)UG aUG 3h1tGv0ؤGpN6Ap ±"(ئGcL@y;TfDl\-{w%K)n͓s(YY P;jΡ "%;yr##gLʋya[v_]uld`CpϚfv)] LpP0KɠCu:$ 1b yE:73VҠ,9j+iP^tj+iiq+~|>Mk fjrZmCU, / 5e!-Ji{S,`N077..ҧQ/W?a(]\ \kEt -u2.7h.wGQ\cP|G痋{D8p[?kkֵ\R;rLr,?,h*TTڤ\^^Pg?T\6uD׹ &3pyEM+9& [m>d;X27n|ǜ: \5B3HF '3WFej$ ;r<.r ^+```8_' u}҂d{),|N v`ZRA!ī1)]a2  *H)(nPAiw.Ao4(`rP.h0j/Jɧ!++57PaEȜ/7Y`8 "J GacaRPϼ ,@> apV:'APȎگbgj7)e`PZG[=.!U NyhQɝEs!Pm.NL 0#'C\+`8ZW..x[Z.^!Pjߡ|gQxr_JHCU %/(0TPOa^&P-!гӣ :@wFӍ}wJ-(*? UJ8jsC*(*iQ_ה<_SP5_SP<_C(kEB| J@5_CkpΨ(@ħ|YLTPspsU0N&qI %B{7B(ru.5fUv.񛗋f' J;YZ{/aIFwcҟ *T[~ Sa2Weٲ{FT2[a=en}Y2[q9?SOδ=1:{yI7~DLLʏR~LrsR}H\;ĵw텸| 35OL;׈q3N1>&k!q3N5Z}DCixzL4SLO4c4S#GAcCT|8s< =łM1h[D#!,v =0N4֯>,:a#׉FЙu4ZDcP/N4&B _'hh}h5yqAN4_۪Uu ";#;j%db?mĒj+iP{R2zz"JOGSRҠTа4(mܱ4(n8j+iP9L[1V9O ,N扢$Pϟ(2|B{ D:<_]gNeO-x1Ez'~c |G^K@G'և@ /F"=|{j(|Py̚3kYb}u:wIG\m`oÝE|r9\_T"uG|Ǚ*GߦBA|~sB_ڻH2F~nEz) O$SHOOqᧈn3MxF5ԇK^;NzfN.| nAaqLM-e-V2DVy q>@S?L7B`,?~xteTϖydS_KWeܓE.ޱ̳0|~=~k+6lKRv )Z_Y&o]Py-USj/_xWzE'"t/g/ߎL;B|\^=}]t>r||^0&}N;Ͱ_늾nZV}zb#N{Tx^t37^txԆ"BESvNon:5V1k|IR\ϴ&$0Eatfԩ}}7}eU{Mn)S`uTz.+ᬕ{2aӋ)<"^M{_uءryv^u]}{혃Q27UwTXuiϯz >dR~G+?MMcA0)~~n3d?R欛"nK]u`u>Ic>q:q=̤%ܿ.U_]DR2 MHe"lGW=j4 N-?b]9v]b+6*L |y#IdF'{Tew8 Z3pqa냤;i? 8/,v(ͳ\T4O"9 ̤^ LbΧ*{ڹ(t [Ae\mdF74gTTuW&2~m-0ޤh4PǍ KozZGa3X R]"n2. z[q`k28' ^37if7[YަDtW]EϓrI&{ڔI6 !ht [ Xuu^ {||K"'Jb:VQn(2.xCM5gNcsksI'˭2 >Ŷv?< i87> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 135 /ID [<135affdc3e99cbdb15607d6de80b15fc>] >> stream xcb&F~0 $8JEg~rf޻#:d~%A!&"UlA$;"zA$;"%@$ d"``@-lk)>Dr 3ش/`sNH=`7l2 R4J endstream endobj startxref 112004 %%EOF gstat/inst/doc/gstat.Rnw0000644000176200001440000003156713777370515014763 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 \htmladdnormallink{30: 683-691}{% http://www.sciencedirect.com/science/journal/00983004}. % \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/doc/st.Rnw0000644000176200001440000003643513777370515014266 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{http://www.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,]), 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) acf(na.omit(r5to10[i,]), 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. An interactive variogram exploration web-tool is avaialble at \url{http://giv-graeler.uni-muenster.de:3838/spacetime/}. \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{http://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/spatio-temporal-kriging.pdf0000644000176200001440000113131014127330264020363 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4785 /Filter /FlateDecode /N 86 /First 723 >> stream x\isF6-a+7U|Gd禮`P}z AH/ךp ==Ox22I3ia2٠39e3y ˂gB[L2!3h2)Wt1S͔4QLLkN7eKI`}]#L02:*'B$xa3 s8&e` 3%B4*_t=A%: =n^ZTwA?xKF4Ž搞&e@|@cWcoe(b@YCB_"!J (+ PV t 8(Gt@Y4PB|[Pd-(kfpUXCIQAQ<AxtѨr`$Az"0Lc0 =8ƠZ:PvxFFją.Ё2/i#`@)H@?  Aك_>c'eSȼfE38eƎ~2~!h.guͷRESͦ̾yFA-ϕ];i<>Vev u]OgxiƷ{^ƋQ z?_|TWMrrDz/fR^l1mOO65:0,tR$X$4ajnOB;nx'tS"$Bmgv+ڭl-Ǽ嘛vkۭkx6m).m]W'COE-8qC+|G uQ*{@ճz6zQ6͞?xaᇾ\́FUi'xZ`ږySv-p-a=9]L&3zؕ|^s4mqҾV6#|TbIG\tNi$uHDE'*:QщNT 2#jDo@\ ǤޙDzgRLI3wi*&*6QMTlbD%*Nn: lm~2W$hSԋkz^wK1/۷ώ>=fjz_Zv|YԤj]XTV+Ëm#6ąI7 Ne6NzOĀ \c\ 芊耶6¡k_16~GSȀ6F|i:]8J!11 qK_j?8 zTvg{ĞS=g{ h6M٘,ydPO}5r}D>=s´8;ˈc`.>&%xYqUn*Ój>&Fʼn2f/5,WVV↚˛r 1Tw=Pw#Q@|Qvk]ݭ(>~"x>4?i-qHmAy2;/Ty pR:kloA[ydvD t{+;;ImG}ۮN)m<;G,i0Hfp`aa?FXC?~Jr0<>oCuꬍ̹QAx=z~٫x˗~GEp_@®>KҤ뎺չUaK~ ۭ_;{3"c>t}ݕvat =C%&^*vފׄ@ox/b:.hVkf#l̺٘t #1lX۴uM4SOFDgZ#R7oψ҈f5zզh!ښ@[ӹBdc%૫ Rx)H $yܩ==uƤvẔK\BͺĠߖV}lw% ?SBK5T9L,O/?.VM\ͫA 6TO_JZpT N?T&=TAAJy[*6Ht@P\<:gs)cx{bHo]k.{Ezbue_+q{bLJ'keWYe[}YʝEg+~U~ӰzNˆ!WVS%ap:6*Goڹc$jo%{QĿJV\_ wn dT6-*{*E;5;yzv x]R>TANwIۢ;Kj+o?55z)Ez(ꛔWg_USbTד?Z$e]Y]OOŻy줇pZI ׵dW-q7-|}ga(! r쎚&z# dzNl|9>->LM h#D/7}xv~w{=P?P?{,^^⻲RTkACV@P*WP$nͲ p {z񫷔|%]* PJlw炷4uTU6sI{Բ':Ao{h 65h:ENd{890Υ M[a8FG.ի :RRcRK뉞Pg Ыs\ c^L* ]QhF9 BJ#n9Q3os\ ֵ\G|uc~-铗RSV3ʋtG~ tok;<9q4lqgzU-֪zf+\`g|TUgSjOr,^ ,uzï.R(%m͕CViroʡ6Rir(yN#IT9<4K4I ${t/V_deKlwbGqh]>/{ߊ/6oZܑU!)±cq`r!NmTni^kׯSDiġp$5OKZ垛x:/((2S+!xW&Oph\Dqc\4>#,8+!݉4Ik&#t.АL)Nn=򀚻P$_#D`-KXDSh>XĢ| fœK/q<:'8Ky grb;*ǏstT8G3j4A]Usmn.!uB׹Nu =e|>>H+.h/ qA#kOcp#'7[@ _^4O3 :w_ pt9` ptg=X RP 9Oua{Y0&w`P!w6NN52 R_H% U%4P(aN#{?[b_OqvY4j)7E3r? CB|ikXza#c_,DJc~P宣) uU^2 2>73(ug%$1;Ges:8KŸP;`~QMP밠TT䁀,TaP{/9S0?I/sSCk @(uK\KUF؎G[]Rخľa{ؔDtL_[H{}W|?.SMdT2 Xe@BH\|kCO ܽ rmmmN3+ Is{>3Au~^֔eQY=''t]-W*کYA?QSPRtw~o+6aɘ8K+8kfqn~}7M8MLYug%Ctlcu_M$&US?7~E潿+C $P4obendstream endobj 88 0 obj << /Subtype /XML /Type /Metadata /Length 1549 >> stream GPL Ghostscript 9.50 2021-10-06T16:20:36+02:00 2021-10-06T16:20:36+02:00 LaTeX with hyperref endstream endobj 89 0 obj << /Type /ObjStm /Length 4276 /Filter /FlateDecode /N 86 /First 796 >> stream x[WV_QBUUBV<N2^muuո7]#@/!m@h+$XՂZ[U]={C5έs=s_E,< )"/#eU3&Bۈk.⻏WX$ܨdg"L"#)"#-b"i9b6.rb\GHI8RMpPjP+G>e5* UuO&'ii ib iq)合QhS+)@;}rYEo$h zN\* 9z4$5+äC D\ƁT @8 £T$4I(CҨKYċT'>+%,:F98tU=;Eiu.Bf_VM\_hA9aJݬ$IJBI^rx B qz7C-'Ђ0mג$kef& L^ԛoF僃8$(zA Oy/JLʛlayiicSe8~43I'9U-4RFN>Aɭ[QAhJz 7r}/Gr_/XSOU?u͟^ß9_L?Ri^^9?Y5@z;4v-7+ƌ{$(=sͻo\޾a$fsdL`p07;Aj&&"j4<v7qęܼym7w6 ;Ãp40"Xz}=,o yv'"/RDՃf*qo\\z rfְQmAQQ%)e)/IYg1_~uƝ̂^V̄ "\$\RNa9.Z ]^%G^~7R7 -kB^x;jYت%=h"(h?[ ܟ .L)+].n R3xFas J&d\HѷQ: RJ(D1=ѳ|Y-jU-njw6?jw| ʲ!:N3$`z6X|t&7|(^a/jmR4'Y2H70O 8LQD$X gfM]W`YҠҠvaK6 SHUJg3S?HYGΜ:rV |"dUtO.O7G|T!FGc"KK?)cTH8HX0"ȎYo,10n>mH E4 0-L,D"V-$-lgC4*fx.&cc&bZ*P4- ,5 G1}!$)bx}FdӟMqbVh ](Qr{Zqv1b'.&c S3%%2VJXkb?HjKg/&Ue3,|1g#G+TUZJ#z~C !^ot$yGօ\kZ:M$oHǴe 3e<!Fgp:\=0d$!YKn˅%~bCG'%85PA4垖b ܇Eh*W.wɑeo㰺Dc;Qrwc! WݟLI҃xthtHG4>vw_pT($:RE+^_b74QDI0v[i땘M+1|9A BT;CnL8Dq0vԆ6kw-`-[ Ei zuk8iivFPF 'c_ʅ//TM:Zit85amF]  k I9Y*U*z=Bb:qC?٠qT& OB E(_lTov6 сb:-%%BVB6fHX4Ij,nn4Ȕ1Ϟi4>Q!'gOtZǡzxZ_yqY{c⯜q,|,d=jҾ0(L5?U&f-&DS c1f}t|bHڳZaU[_U/zQG׋:zݢ9l{.Ze-WnV؃U֧X^86 Lk:#$س5zn|AyAҖŢOd 4kӉ9. W w O qxŸo5m{ںVnjD4Ro\]üʾ5̀^r(=[ +,qXAѧV\ 8cз/T &jr?ژ{ŴSQx*ٓEUh򿀠_G oScV#O?.=WWmyp(7?/ooяOn^yIy7ˏ~/WRY~"6Ct-]n-5L bI\4yPP=d0 Ч]R1H:o3/r:gcI,,hoqAJSP@ekS7Y&]{g?MއUKejkElEs ):Оޟue~~ln{ xhC2T'nWt*@.ML6z2 1Ixj`c=EY'W+!t'(uA$90@5$IBDҹ\hruBpmW6ELTTʿH#h=-?z1^2o 8DEQNQD+fHsY‚\X?DǗrendstream endobj 176 0 obj << /Type /ObjStm /Length 3634 /Filter /FlateDecode /N 84 /First 777 >> stream x[[s6~_vKff&N(%W~-ɮ8n<AĹ}888`L0Z $x&F?%,*Ik+n\ uL Q L)I}"S9(DŴ!Q3,:GÌTb1*OD Z10 >P*G;ɬÝY6̆bN )ȤchjYO$92.$:Kŀ,HOAJ rp08SPjEKHA)W4TdQ mAC/R̓'/_}Ū'يiV=M̍cVPV g쌽eճ=i?tٓ~LVy廗"axW},uBX !YCj˽ů-}:d5CmO~N}Ӧ-u_}~bK?'O }uQX 아4VTct ,Dz(vss ]o06ٌk_5q) GvcDjWH^ߥnJί5C S>]\ʸtS7#-r S*MW'=wz$lZBrD|~UՔ-WW\C!_xgxgxgxgx-9 ["(HxixrP/,W0#v`8-痋&-i^U E bQ3o^%r3  DD-MON[_իꧪRuR~qfմ:ΫY5.EVy#W%5xpzOTMb7^6f'~\¶ V_jdM қ<m&FX}]Bf6ԡvq]`>GcWg7s/*M227V\ Җ^H~._z{3B?6K!Ï{>Ũ+4-3isTŬ?]]U+{"; RMߥtg ^ z?ƴ F3/[m< 9Vx/ڴ(QȱuX8픆x85YC|(;TsrVoGa:u`4ky|ݡYM糾鯧˪j/.:/Nߗ<}륔#u=DVO,Uъv[EGYYy\',yύ`X,g}u}]sn$8D+SmzNc2x5SpK9T.PW(ʾ(woL|\i:kɑ&z&v?@#iIs]~ZP8?WqS\g)5 L)i>MaZϦ1} ti<7 Wj@{&ջiz^]xt~1_gtu~vIn+V}E8 ӁkouK}ҍ]PWضܘ|b[nmc:-,ɒc:cBpϹa++ mG:ri>ZqvW}\QH;(l||{23sx'|cB̧ѽRx=Or1K֫>輾X滪.&TNQ~Dz>PziwG}u0CϒyXMRKݴI=3}%TRTґSLil4R$ˆ֔8uwH=7qm]':*1iPB.=*%uG#"u8Bߥ!JX!G%󘔄D nHtrRGئ!z]kkRvҤDI2g1Qz=qFIe%`ӆVִNm'D%u;DF&&ƦdB$Bv XcthǪQQ6QCJ0-A ʉ7(;#Ƞ8dבTFcP@3JhP6RJM1B+۠@#&#Jԑ(DτФo.邬-.u_|Q̕5ggIJ }'Ok'hiWα]α}I G,{hFi{ դrE[DnM& }$9p;OKvv_JO\}0G%!Y/5OvipWQގ$49"'(sdZy;80+x<) y`E^>KE늼’6o9>'KFX= Gaqgǯt$܀l1-pN 8ÓV:g<-&t܏>\4}j>ҌYmľÎr͓¤ (.76B{%?KCOaGJBY=CI KآC$=c3Ɉ8%@$>-,)PM``)'Ãq7dK(86 qH\sD3<ٴJݮnqXuè:d K؛㽳o h XS`p ܏pxASJ<[imٗxy==[Ϳ?Y,-M/lJ 괼SڗpĴM Iqe94I{jfNIZԋw }rg:)"8bG-RmLMR_">t᫦ӮK4/'s7_$W/Ⱥ;/Uendstream endobj 261 0 obj << /Filter /FlateDecode /Length 9854 >> stream x=v%u?0de8rbǑċȋnQluD6[-;zbxa5 ŝ'|6ـ+͋_~aٛٛ߿0g9KL0=\ !%OG?|sq>`Vp1}g ex .8@3״: ͟1ˇx#pɇߊ| ٌX?_<'DǤaro$Ĉ㘂;t0|49ti7d],AH!y;҉M{E?Ï &Gsle;] ͟c"Bt1MkHK#ȭ,ي<[b i҅#`&< ag > XV4C 0/O 1V_-~7)Y!G:v,EVje !&e bF 4Mx<V̉TdQ }Ǡq9l{hY , HYKd *Ƞ Gbox piƽy0_'@@N\x(Y@̸Ă8"7#Qi{$<H@B zM̂I69' JI_(.gE^/K' .I]%=Pݼ q (TI"RD2oW+,C\5)&#uw/y %Wn)B&VH D.{YQXBlEa  le@rWbF554s`H \/CAǗE` TRVWXg[ldbV PT&QHςT`L3J%%jZNAOUXH##VΡh7vPInp5BY֣fn$o&nIi zUH'5["(Xђ]Ll[lފGa?e4v$+BP@8Kvг>MVpzp$uBl]fd,a}]kӓ.o"ޗLNї-W+t)*#1NoHߎtb^S _P{vȕn -0f?=o_0㠕;ޓ7țD٫6z]/ (Dc- w'A  ,D+:Apc9]0,AG`,(U|=8<.fPV3vyE7]!W *eqeF{8IŶNKTU>3MwI/5.!=8Eh(Pf2FIoN9n$J!F^ 6^1}/s 5LrFG40[uX{0aU#Lۅ~EDWCϰ {EL4ҵ% n[_pH1`79~!!.s+ylyf0}Z9K .h Md|MxYC6 J,.ٮ-*A Y+_S=Q]U{- ƅv,|[Q4m}}'ֆT\d5>>skR!?-pdo&\;\{3L`D/8|-[ -0yP!!֎Pr(%%* R)< OҡA3=/hj?p5&ӣ|@4;Dt_O$"F\+7<ߠ1aHj8ża׼o;.O-hh%)2j^];Rбa+aHiu6܅.Iï)8)[Taq޿iqX 74ppet [N1 `y7b?HBDZD*ʞVVS=P>t6Y֑ފяVtg#ZYCRDo+",,Q^8wrulY1cg/ h|Iʭ$ǒSMf6sΠ7fΉ+s|/r[,ca[ħHAǠfxK3Xtݾ[j忽xn'@IWr*e:ₓNË(1}9EjNb_ ҔsUQ|ZS[)h(TsP;xU2(_b$c&[5 me7H@Nt u|E3N+vma/&v, CYMGa7E{ {AU5!@BQ !v$Ժ,1)*8WT3DfE.;̣(V2ƦH֡4 =bNk,Cb:h#&d#ܛ:=ki͚/=` &w&ڳAH0;B8K̘60~C'RzSc g)aD!zaVW'3fu%!*\-#69?ڱ6TyJЂYt|N&v!%cctK]2rFqd5VɃJW&MC vgNr 퍏W JjK^uY;@(n 6lӒPI_za\nwLB8|ËYq FH1Nmr3c~0wbagXlX ,ZMq v$4Zr{H\䖋0$]^4m2U?h9>TTQhtX D+EwNl_-s|F)w\ڇ9kb1=pPpQΰWki%VmWJN{笓VOv:=9M0d$1\x8]#OEu}X4_Td7#/^;tjmI91=E1 m/11hԾ ..j˃,*e|Gv(ک}ǿA_`o: G$j|腍Nl%Ba)WЗUn 2X*`dPN"x-GJu( @]JFIK(SlvC;]) xu, pO:Wa.E^#fNJ:w*SYuOYf4+|X>߁gH4QQvoU;ʪӧtib^%XtN2lizmY(fKo3n(V v@X)qf78eػ cT fQϾUav,V(ZhHI~[YxIH #شZxqAI_f*1u}r/b4]kXV]߾kk`kw.øړ* յc/TF6HU2XFUv2z[ҖMwhkF* XV5,b%)~D>ﺜeKGT8:0e űm1NxKyuDlU*;{fb"n2sVAYq>uᏱQq G*'խꓐNZT֖ɌM UmTxškޫY 6S5o"& dV?Бvoӯ_xҍѱ;%UfY SJ3Su"\TYFR |+*f/Aa^,~%΋BȟP,P ] ֭jqc1j%!kF`LP!c\yӋ%Z.V֤r+6gYBMQY*։KRZtɌڷv*ML8_K Ķ0WT~OY'NJ;c7z]F\(CLKd}ElxYQJm,t;pZL!$ Sg|ˏ3-7R&KRIk2]s)8_Sbڍ0=gS^"O b+bN<1ƞCB@Z]e̦!|SFf ߰ 2sF*naj}6'hP5ضQլ|GW#G3zY U_-4Tot9 k}K **6mϮVazf3T2KS紭Ī럨.n /A[!i03z3}zz@|X4BB,ԌQQCQ{˫煽M:F'0⭒BehWc!tWݲNc TsDFFyq-wxҺt1[Y$+|,Ƅ&KҵկekKmjIOŏfLَn?pZI/CHPLɓTsK#¨.1Z"5˯"Փ^w.`1[5LN8뎗f3Jrm>ԫRk1sZiauu秾Ri181rsрϪiM$gV];(g3S3VR]۝Ս{>-]<~|{ič7W2bbl\I}]~;q_ S~d!yx t53Prnה+hv\.v&~o&Nmz\GX^U"&oTs V(^hxv'hNkt'*S( |='lq ,IK| ly YSzYlhQ@REB<͒t@orp>IOAWċa!?@Ub9ǖOH]s`1j-m |3w vIn3>P~h@ķo+z6bCVi{2|"}!eJ՞Bh=RN{B}fWuπ|dw^yr9:c6h 8z)9,\jpyə_* #Jem%pO on UA~u;֦.pve4{^zpp!@ '\`]${2dX_ɫ#9aʾ)I.ux 1Nf뮭-7DKy3$ 'IÚKqr>k[SKú= {yR }f\4Q^wh,{AzڸzVڎ~ %6O Ng&ܙCV_ʽSr[Po"qZhv_1Wo B cR@,5\(A=!Fgք| B_JQ:HVd7KɈ!w^~ހь=h;OɿI3Kxvf_r {?'d!EV? T#Iԣt+O|1n8-w3؂"|ۃkn?/P]T9*|I}`<9 *.k>֧Xլ{CRf}i7mht[Z6U40߮3j S/TJMM֊21V#ms?"GЍ#qtU$1P3_1mWk(Of|I*]BIXsNڔ>B,G~T30K3$t nrAVVvlkyDclik>T!O+WT8Ke(otadVѩ;ݧ޻⢒%xZ1K7<x]z 6ڥHQ- lRʼnR_oG2gvvʤ8Ku ED6]w숳 \ _f3 2R;1|b)Q2W覬ߴԴRH;p4F;QO׾B+8ڔjm&_rBSw/rܤ9nHQ̿\.s !oq] 8؄o,>/KXt9 Pz2cݘ\*@'1b/k )#|n(Pk0}vy_~L:2HCܐR~.ۍYȃ~C^-(]f3]{/Ő ^v~l]~j/Z213͹ v6x ^rxh Q5 9endstream endobj 262 0 obj << /Filter /FlateDecode /Length 11344 >> stream x}M$uN>wԽ*'n@{-[&'K:Lp(d=$Uݤ<&p1ń|쯿ó)EwF{{HiN}Pgnڛi^~}5䭍O ԤmT0dc4˻1ix+&O\f``qo`)h-)i0)e5>/1NSLw*? Q˗W:U+.Y|[ 2X/?ޔOĤ,%GMQ{zѫ.i@2oN`9)H{\wJ6F`!% }4Sr:U{x* d. 0c)P8+6r+s؉pRH?EӸ@:I<vNb6[69BЀEmfgZ~3;=Qu&Y:fY!]A0PNMǭVUH*@.?r&+OHLXIz`b4Q\`~|A| pBN`ׄډNJWLr&<:D,\Q zhi 2~3U톨}ы?4zR;ZGܾHjW({fya3,X҄ç|`j'byP>sPgKCފtyPwg?HjiB)g"ӦC4 rXY@Au{*YatJ * TA0IRo &K S2Jh=pϤf& s x>!''^:A:PEwi70iyj|ו% tC#Ew5 @ـ Qkh&,,}#$Ɂ ̩ B&q/qᐭ ')^:y;-&wގ'>3x݇q"m$^ZZTz u'=F@)si?cI/G^#6'd*$z@u짫貂l=bu]WdI@&p84^Ǣu 8c +E}Uuh]ƦX xM;EgA\SdK&\Yppgu)\Pf*::_{H /w ϞGh`G> :1PTf+dy4dcU*#Ɍm0CC=ș ugv͈h9ȴЎ22^T!ͫ/FtHJX^9-^6- 9{.?%xG_]gD6eN B ~ȁ2{xY~\@1iG{C~MmNEѬ R|<) }d>!2P<` 8@75 πr0Acs!őzeq5xd P9W26I;?\Q}*;\԰E.r h8)3 H)gAр~LE98Cȹ <~J '{~q<\INe00wN~_G-!Of2"]knh%nͯ{O7 "J7J \B -b$O1-q*bj,33.o2Sj>?T!53;$Ɂt 9+" 6D`J{ڦsrfzG>GR~Y 2j.7Cy yǶEBC ,؍X!عbQ#i'[7Gma :0MHF{cay"ǹd* 0=G UިypANe+je4[|m>XT;)ƌ cQ ?FV+Z,-7ؘ"AۓV`H} YY9 as$,Yq+}(\R:f v75@ %@inF霈`M۹Oy$M,긩)ִT$WB4/ZF Fp) 0 BWjΣ>Y!*O.z& MMJ$ "Iv x|CN C@T4y\7 Egg-}y'}/Fuˤs'q,;L-JO5M; S狱!Q5?C"}^w Ui/ U>*2~g0D *Ky,vbN*( 00GNJ}B3k*|OvN|bЯ,_s^'@Rj)0GQq! a3ɎlwÀ '\I|SXaKZ;9-M>0j$`3 wuIjF^RW >UBIÓr8UXM uަLi##crRF}E-98=(M k !JF:'ʨni[ 9^2xQ&1R2Di+~5m@u"/!R x٦dFא6 oA@ķU ߊ (bJsa(3k6õ8K ͒,Jj͆fՑ|SȜᓪRvnGcY ל8j=&8 B5@f&:Rvܔ.Ҍp734^1,X=^mԼv!H%Ph#YoDQLG|O''(L5 Ydh4B&m|Hϗ"YK"3b֚@Z ɴ%Z>>KmGusyEV.;XM+I_9L?&Lr:=3AJ^ S"E'͏f_"ϕylEndaZ +yY䷷?QC >7}QCI4ۆN6"5p#:vR0hۑ&D)b_z'IdHRG+ p vX杙ۂd,͹dРt C7B hC8 432!;-9eϴS3TǴME,iCz"s3}?53&VYuL4at=stz(vƃeIz9唾axM֌VuAj9ѿ$cl*ޔ|gO[fuln,Ԏ_nk z nκEɉA l&O/(w.kD;SvȂ(ݱ~7~ULO?4Sn[ЀYk(=&[ELQHxYX7)kxGƦ?ulاfgI0>j?64FPֆQ ǻ쭺d/z,`!g29l<,6馘zb MX6,:GuBI@z}.L.c4~85ty Ȩa}Oq3^6Z8|,# pk=9ísg+j)kL7V){H^ZY7l`V伜m%(;CSx4Zd0*]!-u<5:3A=ɟ0w-m@HZw yv -o ݡUޚ"@ ̎z1y"o LIEۢT'I9~)X'>RGIA PiRROTq^ѪF PB7fRSDcc@mcj>f]Y-0уIn˿+~8wy'Pn86`/܄W["KxmJNͰOiG"$YeTzR?&Vh])$b)u87qXuM}Jʋakg)w7V<@a))E9P,SUu:k3!#h+YeW,رr‚'sMָf當Teƥ>T-律r FB cqtQTVˇVGuZR>4[`Yٜo˷c#XP58 oj]~o}ԃeds|QK]XrX`(A?Ln(fK zS`wB.WPkS|993DUοsg,_2p8R:‚cȗmeE/GOBi%H_|"Cud~۔XQs܌Ono,s{n~,}pG~ -`:PٛQJ3m␹=ZDHt `ݡjC_q~/"KUR4xo>C77I*͏&OeOl\W؏rJ>r_s&gx ;f6ڳP]b7>qH(Km,lZi.}IޮNXHO~.{P\D7DI{J>Q o\:ڒq &\' @n0TdkU ӫUE~^9ʍN҈Ni $|O~xUnk^.~6170n֠Dc['_nJ_٠(1yݫs_eξCJg0MhS1/MƉV.tx؅m`-ۊ58=i|z+2Pl#Bbϼj`pMM7 ׄ=yɁkb<%gK!'tC5\l'Fq𣶽a.Y1 U[ 2K\P3So.s4E(8@L14UZi09HsRCu(-ٲP\-Q~ ̀YVp - Ǫw3*sۂFyvFnkrAQي Ml YL  ;tsTQc/!Q-XzQG]?M|ҿ;ǟcj]quVfCnؼ5O+V[O,ي nh"nI7"蕋k#g&zf>?r*_G* >/`sK10o9ԯs cwstߌ/R17k~!9LVKoR\ɴ\~p~gnW_j W͆nD6jv~tm_ۦ}W(XTRt$79a fdA+AcICjD'iǭܦ5~$G=-{:Ugv,^Ւ& ĥ_4,igSю5<ō6ˍ;+V3:,SVN K+qL3W59%=&8 Cuߟ6*r%#di$ ).1#^DF|N(~-k-AV紷-q=Ɩ1_U5<^"&O=nx{\k2wmײëlYBboLHtoPS{uωڽ*n؈Yn4i:w$Vn6MqVbka/X]8XEr4`ܹ] ~a1^t@4"JlaϖCWΟxl up>*ovZy'4ݫ%vX'fR6Dz-l8y=1"V*BrSAK $`7{Wo80և&ʎ|)%mW<"&t.X/ v+$ 8h}:?r"~ 漺[]/=v`& l a*xggk;$gfv*xӇf|M\¤“lڶZc|IX>y4%H\ԟ٣brvMBarX0—e_x{v4׃@ޏţ:cZt>ڡ'g+wh%K@$-`10 G\3+e; }=.+Z8u˕u廽mr-eī|粒^;0:?^-ՍDlyՉxқ2yM2LBKܚ6\"K^tm?Rw(cMD>`AU7e6!bQÚgx29qZ'G>-jvT/bE>gOŤWl/ꐞ[Jcp痖%"CfT@X 19I]B<"ӧ$R^(ГT*g]$yS^.A;z ɥ=]a鏶O1(y /b3]}Vzv}f]gKps+e+獻G Csz0+P>kK]7 9Vl% _cA)6O |C s,&nv<_^elPAm=/{6 .)mD_E) y(E{?Y!9,1z\endstream endobj 263 0 obj << /Filter /FlateDecode /Length 9470 >> stream x]Ks\k5UlJuϘ7Y8#?8Lĵ)RnQR/y^nRJ ]9yi&_>㗷ǷG?0nޣ[SuF+ѽH1>ZO&Z!ZIxڸVHiҫ7P!GWgX!Ow)9eVhՔ)՘&9|18V٧d  ç%~mIJ{ ?佥 ME{=j)ze2ɮBNc6#QՖ:KߡJtV:E<4}SĶiEQQm5٨n^ l/q Jo矪1t`aiUC*Dw+¯* bRvAC`: *̽hW8>nZ}Jp&j||^6++C ,] :0 Z`qJz"'kxT9kD@ }.5>,E[HB& m`A`:ZU9np @~.NS1-IlI#1 amdRyjD3{&_L,)Qtelq 6TϱF:񤤘x0-܈8s߈71Lx9wE|{íFW>K#CXկdNrP߭d&5hȲ ' WWm6  oE_O6X5%($7: &ĢK{@^moj0/-dqRV`F܊cy0tdeB>^`qw9¡sf[G8Kgpg}iOAm}x% I7ml켗J#lJe3_$JJ>)Cx>a.ii-L`' =y@;%y} %eW |^ѕ@Dwa焷 &)n. ~]|+n4F\|5a”Ak"0KQ­+ NC sL.jmQ|.@xIh!k2U9=ƛ8/0pg~,Δn|vƺ`tJMNV۲.E1 u*Ū#Ɖ4Jgn_K[bqo;˕CPpG>MЊCDN@\v/Jv)~->,ſ[R;r]*^⇥Jq6&*RhJ1txV/͚IS[ST 0vã/ESR|ZZ=*9M㽦hhٱ L9Q9q8Ih Q[yOsVX_ %\JWƷ 71`@BiVj.UծgyiB`䑩V;'`}#0AIl"˜ˣ3_>`֡jVߣT4R8occ&+A`\MH>+ xD_xQJ AߋV⇥(Fpng)~R_CҪQGp6 ,bZD֤w %ճ>/ς %V8fF' 6u|?3CiaBZ ӒP^Y]j6}V=3#&\lQ¸ԳJy_cAQ́@zSOxNaJLxַB @ۖy\O5lmRn`1Wb-tlrq5&rNKX jq!>m[!R~u~ eLJOL ҃\Mll<59k7|Va ֚d:ð_Hë-\B(UiaHKQIQbz J$I]SV?6I'G(n~N\cWJ 7L6kgmF2/VFl P _f"HG]r/ɼ!tb#G ][8'nQ\{s(v/KA)>-EλuEݺDO|ޝ{h;nC[W(='f&mI-EL(ԣ}i$!:/5u5T7ES|DQ#;)(tzT+Lcj˱!+mޤ͔ `C8? @\ÌLKLUČ-W'3UhXQU *𳏎vTHs2K<&t)Sk"B j/$މў(PXѽ}۬JYC̀2d$/D@$y\)Tt. KL-."iq,v4v+גO']Rycڵ՚g]C( < $~1E/>to );b!"H}L %1zPF*T=7 ^3~W)5~]9w}I yF $/B܊=7,ErSqz)8>Ǯp!g\ӪR qX{;QT 5 k%N,@r/,aJQ  CHL[. b@046TgM˩KCs'@_"G"ws'h ?vZd6uS)nbuN <,Er9̖'ѽVUVFM}Lv{B QؿZ/B/V\)X ?ȸ FNa!EHOxfm Fyn`"v{^0^J)t+|R+<`Og>L-HS }S?L]֦%1]^T\01*lqWBdJA2ij"NH]Ԧf#}T(ۘ$jȬvFkArAt2C[F]T؊/jmLclǍwؤo3b]OWVnA/ZO@Q_{iU LP8Nsr,wywdqio;3?~ 29#=`*GJӼxJWbZJ\ڶzк]WtH=C2_aQ '﹤ 3A3W{ˣ /? Y$r *Fb<\*A뀗 U\Rz h.褴Ũ0T D{MeODi;`R@55hE8RR;~Js[*: &z>7 ‡ ODz׭X8+Y8|{R 3Wɪ۝2c(0:Hp즛8YO /(éf*:E&|KXp+??zzTHB$r#tok$yOu:_!t=% Ca"x5v #j}?i]HP+&[WZe=jQnѮ"s'd e$& ;!qȲ43Lx#GQLqWhf dp0:##zD΄0ğ+,:QPwݩDq؇:[*X"&X8cQ*m7*v?Wi;"qM|䐊$&>C!r]#˿:R\S#}@G7.[БIF*h% E z5 I]V\@D Vv*j8.Ժ FHb俘k )@z~:ڐR㼢*r&qlƉN6s(iu1%Li [ &l>峤#u[\*2 ;$fi|;Ҕͱ551c%k gJWm0 8jm&BD: F?$]*YW<V1jw |%m.Eu7%uR$kxH` (#,/!7F+i)y_EnaL*lg8&[VCRҹ l{ +;&@H$VjYC^j`H*Jq|GfI{pinK/] }) Uv_v{tסR;VI W[cYp!kep|x ߀Hzɞ Dm1LmrjŢwy N@j[4'T:bDy|~Vn^Ga<m'? .;g>!K@@X*!U<¯j-.?O0/6XRj i1:tNX`j{(pKT"x0R@FБYʮE0WUao;愚Yk<|+y`9&00]A Ws߇O::0yy2M¡;,k:n"K_}w ^WߖIO 2zt+>-IX}Nrt%xrrNpotQ%;%3δ1 -d~e\x?Nk߿]颭eHv0ߗbJKAf ӎz?5b[?(U zD:{$)QT 4BoR RsHސR6sEwBJϸEtHJȟ!I׬:R|'OO9)&*>+-Ѡ ATՒ -\|.H?ۧ e68ⴐ G!.aGy 4g4B?DޚWA - z'/+4!/Y ?raIIaVD/WS'ͪ{vJ&} 0=ߒv6ot+b8#oϺyew6ݹbn;͛[ tWˎ o %J0 cjj7ʱ[İ:;뿻SN,V8I5F MKtKiSw|õ-|-Ԯ=)t('p#3žd-'޵nYX׫uX5$kgmytdU]ដ G֦^$g-Gc|Y\rߓA0^5oMv.Q(UC ΅Ƅb\Y,7(v]z^SmKx0M,,s@='žHD"j0+wyldfÌ_%H LFF!dA[MlFRs ΎZ$ʶy.W&]'0xfe-9'}0 =*\wrxh?7>~هW{i4j3t~ *=RnMIdշ [R1aG MU³9D6響jD>8$l77l0 ܝ ᗧ\ J HhOhyIl76͡Ρ}xؚ#csYi4n]=P;Z^Zf+Y2ޯ>c[yMCw4$Q36ox[m`-v֑Pp"A[u4gA8j?8zh_yX9zN,b6} QDl G C]gha&o0jw8RZ˱d$U+n>a1,@W,ۋ%#uvc[佘2 v,Jfr6hb%07ȔYب{CBg< (JYX B+TZ`@a̫WOE&M6(duIk$bv8QLg-Vn^^e:m@옕ΖG8owt0A*_.5ߕq3}>cߧB90VM27J ~2׾Xt݇+,:Ȳ(9mC xSckl"j7Sn2BSTf{Z\(@ *l⮕LÌtTՠ*Ʒ*겭tz1YoQ"é O5֬XJW>z:ojU'r_M0B/_6ZX%V7oB  j5PjāCJ#<`+~N48׵~@ :~7;]cE?$'yT}!i*mC5WK45P۾˜VOFF[EDe^8-\*|ɩ9$Iw ~.aPG $d=&~? ЛCEi)>+EQI) ?{m[av wB쇀EĴp᭗vb|B@G 6  \r֌,YŞV9w]Tvh6^3Nsn! 5 .OνR9]!<TanЈ=ӞXʂ3d_4~Vly/&MUCӳ(Ф+) `u [ůZ+ 6GkH(%Qb8lzblZwԁdzN6H`x5,<6!ΗU žOuT}W;Ck¾z'~k8~uWzԭIJ[iQ> stream xW TS׺>1s@'8U:*u ""HEd&ɟ*(3(S1Pjիujm?}mn[뭷:ke%Y-a0DmD3@|S d[5o2K>x/`صyc#cI*]v.nϝ2sƌ.B"FxCN!d ӧ'&&N RMSƅ.pu!`Oe;0*ŶiOweTL:$K0%Jq*uIA{ _~C(i3fΚ=睹/`qjf ՠ냧 `HЕCK;:Nru :xWý)]~D#/q a7VHY }2$C:dƒrSuhMV )Q8g5SC[,( by;JQ)7)dfp wXrN\?![ (5K L*&o Z-"#d++&+ AFgm-!,J*ȝ% ֬6C\Vaz}XnH 8NһW<{'8߮ : ~{ (W   d cNe+ adB@δG% t8R*FDZф>L$.>$xR~".C+Xio ő;6gDd",UL6;KXi[ǖLd$I *|m8){E>%-Rtl4eX /| xnԍu]֫eer:9lX8CrR+$=dGT{ڀA?ƷqҴ?;ѡNxX<P=,H ϩ6vwc%q$.7<|$Ikyhcq Iec]|YT<9M]PeWGv2_R܈ hPwA4ԔxpSek|>tedep(tJMERU[uPj{}t߸*dƧ:NpÂEr (drf )XHSt~2ТrMuSlg%g ){E!ϊS[Gٖu2#G[yu$T M(=(/.0v(Jc.lܽO9Tػq/p?zP2 S y@A5t .C#cyj!CqB$򸰫%݄O:%b#qWx|zH#ћF={*]Y`_YHc']W>kdQhoa].28pFǪYfg)Na|%5y0D\& ˌqh]Da:k:Kׁ./C>$FYn6 ba!6 -іs-Y ^q``_EWA4TJKuK2YnV Q2Xǜd}M&SH; Rڷ| Ѷ.8oPaJ~Fm{ =NHZʶ2k,cFFt@i9xqAFi[*7ŗBe~p|X2ACF8n[vU p\VQ 5t\a}PGAcm8J Co/?N*.q z5F oA6Cڜ\IڝS qqp0aG:ڈvE%u\H :@`wS'tCmMA~ Lww Sw_}Ejt[ ~2<8}I,jwl}H=Lܝ=bS༶F iEw>qߦ_5a8mXH3=3o][P^tݖ*UGEpơ?I:D ͝ GT!;`=|RCR#vB!"+b_гo%y,=6)- ,H3 ^LQ !d87LW[X iO]n:88=͊Wؓ J  @ ׬PF'+}u u5Q;vH!p)Y@ͽu ӜąL~.6J<ݞGϤkMaoO',?ϡYmtO 7E;W^pEy=2^-w 92kR eO2xG_b];b֤#MǎwODd[kC?AaOџ.s<:/`ANHe36G|?P=P,5d>iF1IPJ k|TiKvp1%Ң:62人C5թAaa{|%Ejm?ܮ >ݰ=rW5|Nv FyOr4\qnoOyL ޱe'/rnR[~k= ql4c5[BQ#Rܧpy7}| {odG|'#PR *Ug?TӪNޥ')gϺ闃͛9"Tb=˖zy_=gH1B"%0 << 5@VwZIq/KdqS 4;_e{.^-7o+_KpYnMy9A|un{F'|+q>,%CK; [+뫪 gV8Rɸyw*}m4uל*ؐZ@׻`T%. ô}%K 9Y10}#MF+dƿY3hv7}`WL|SqQ{JLX;ZE UzڼlMNV''r2^\<щ57K~DFAsv V>5X/ڪvl-o}[~bZi!fl$:lkB7I5F;l ^?wW<(-_SX)x/ )F;[^iv2MY|l osH( 5m ia_O KrdN΢痍{,) pX3|goٝhw~#x_EHas5XF- x=N_/F}K>]ZhVjVfP(46Ȇ Ad?6TA цˆAqlg_Ye:rW.fR {kҽGv @ E4px :#VZ!ytY/SE=_WA:dF YmI۲˔9A\*풓cl"UMBIY]%%O ۵xHi1TVlULgP<_I(0;gs7&Q.EOўl>Kj&@rfgLjjeGOI>XGZُa(yv'$k'F8uMb!l)_\(I4XHsS‰eAKA۰8Z9]G@6;/=2K5, qV5"]z0;)Y#(gHzϟf݅'j?Ȣp1P^Ox@f̧AwW7*}o p~/uwG{7+cp> stream xzxT̽bB BҤNB!@zɤ̞I!}R$PDPE䡠(]#ʾD3D{ )k}.gF"خ\7D5zqtIyVg2` #lR0YD_a7{Vg̘6j҄ 3{vvZHZ%0j,@7Ǐ 0m1V!ݭֹZh0q[/ߠ@>\gB,\4xYН+œWZuZus<1cv1nW'NƔ!SMʛ3=f 3YX3k7Zf&3Y0flbF1f32c;f!3gb3 bf",e&3˘7f3YLcV1ә^L,3Ř2ӛI`9a^a2JcμL&X0@&yy1QpL ӕez2)KI*{.j2$S&ղXn8͗6+eϙӌ1f>^JKߗOooo?iՀ,Zbymँ^vuAE:;[J(NYyU?+!Hk|돇saeMM#JУ^\\"\'v.E̞@9jΓ=RPe3zv&\ŐMӦ!oSdtjF I^Od[Sކ# )pSi(] jLÍhG !d t')ҍЮk=qڡɣdwf 8+q;%z ޿-;;0Dx.B1g_ݞ×F~GzmEn_!EVQd8\'rJ[,&Tnr;FN͋mWP8ZRw ˮJšv}];I/"MR-r10H +B.߼ّ(niy: ZRsuE旲̡~d.ﲏr=ȫG6%s0e=Pzc!efͯӯ 2Aͪ1u\2P0 9ӜCP>o}@H6NMGfG0w}j֔s7Po;vBrnUw؇9S'6U1Ji'OcAƉT e}B7yC$ &ZP<tMjXFɋ. >nnK"kn=:qߑ"˓%k\2Gz,gXZSP3\(0ϓ;K,cIT+(ZͿh3I[NOj9%,m 5PNQ,,#5!M m8V^s3L=8.50emN/۩\LMh,Aϵ1n黩bf BqbLUnAE8P/)UR\+UU6@1]@vjGf1FsL+HTfAdj3xâD}nӳ^JG>6HX*YaM,D]1T/9O՚憦x>u263L~N:t]͛6;&W v_piշ_~|A zwuv|{M9+U\ 'բU%*Ɠ NJA&=O GDsƯJRz yԚR-s9gQOホ**w7'(Ԝoٟ(HN GRn{~-řWT0W+|S[ pl`  hLS߾`+prZY^YU\Rٲ=M-'G*/#"N| Y*-dXBnNn u@:[mZu:U0Ơ65ur/dSU+kum,A`&Jv8='gj[qJE+6SE gi89VxJ579yRUJ(6}N. fTޡ>>2MGFw|o}zrhXg- IIWHK).ß|H-WYT!j'Zr/nbU/Nb-m^ ,!89$ 9ҽsoL^mEHکa\PT' mniyټS*d0pC)Ip6"Ոt ؐ,Y0$@B `Aų%j/uY/P h}k8Y>MapJ.c5T̤EeefQmjL'i{t|VA޸X?hNwzGQ#P..ΙY@. h%-/H/~FRTu)sEK45$ZedC33 fջdOV*פ? p(%7ʥ';Moj$Il[[J(q8O~z;+8O/EEd>>WIŊUˎ.A\W߀NJfО, !X.Upu*Rmvk7򮹬@Y^sCCKƗAt5y q8:cO3b jaT`;SfNSg;p:iȫtN1$ig~2Od;N*zLI]  9D,$9D>Fn[IݯxҘ^Fc-٪l!6|ί8LWUT\ye3 ;:o=^ejp|xO]tPCB2٥QzgoG[+ 1gmu+T>TvUmpvmUkM]+ka uzVQdq$xTV[!/(* QG~QnؑNfp2q{D]1NR&z22*oI)< ɉIjy#h n <<~TsA'OP>h)kgg! 'T ;rwalsamYNF tGf).\i e=sjY2H !1绕1B685KJ@FNپ.GI$w31}P_nO77SX:4]}.ɵ 鸶uis= 9}Qp"r!.^-OZI(WabkDZϙCm6)2#3 ]\!Pi_]+BRa(Jz;R,KN;(7>E<Txy{{k+*j @A P)S%~0wԅ/{MI5vrȖ@fLZ De^XO0lv}Zu{Qs#4KF] kv&!;g jz9DN6!fyE>z1j9f7{|8Vcβ E!kX{ۀ%g/VAn/!f__?1= xxyUv#N&F=lӞB;Q8GV٪dM,Dʆ9D)kHf`\](3:TjJRUP%dq^e,yzYЋ?Z@n]|^8 ( ʌ(XeHZM=q;JFG_9a gؒT+͜~&VMPhDt\ac1 RwK.b }'`[ m;>rĤFwJ >$%G ӆbNPi`Cc-E;74\ #pTn#vH| 9iPH '%=-#/,JO6u_uL]H[xƒ]afuf;qώ=]뭿_%?:ww4W8:-9ly׹a #gZig<.ƨSշC­@c~%4j5˂L#i]%N]]iQi b-[pmB>XBaI6[V5eJ0ȥfmW{A $U 4Zmu%9/?bf>>.VL*3lu X{2R&'Cg޹SM } MJ$:IK X֦˴d5W>hHk āOI{5JbUTKE^a̷eKR*1` 2Z[ˋS|p7%?`(k4IdYVd/ayfj2xd4G%LqdP絤? 8 " *[=*xCpo%go]?^jb-Ү:uP/ttwrRΈ)ԋNJkp S(yB|%Ȁ4|&gmou臉v4gƨQq#2.k1Jђ7%'{GaLIJjV S Ioxt뼬$ NR|[C1űi**\ Ć_\ЖK_ӯ #h8-$-ZeH`AM̈(e7uw7̻p ~CGN{%M޹J‘r75"ׯ( '9 ?#hJh>1̻VwB>VM(.yPx V]h0]  *}.i߻+ŧ[dH?P)9B3y!*3OǐiRGpp^+ƻWw=w`~ vWq`4r_:szksW||npƞ8dƼ.nw\9';Y5c L n.<,gʹƂs7?{oЉ /^bbHw ܒOHef!2'4kwϐj ;lc8t#B>Bq.nKԞ8@jQjlk*-c=V56D[?lsEs3@ +#jiw7u!@=sm|-d#>:3(4딇utƿp}55|J;7ti)dA% ˧MS8(X~}o_ZpsO'٧3?z+4)֐csg0n.ר-> stream xT}Pevx~ĝ֨&F3(jC4@SpS8 ~@<8>i@eHt*jB644f~/v1tG;әλyҔEӴOdLl$DZHKŌ$?}{rbjvss|Z6}s0P MK" 9 *0%Hr*tp:M6EWŨ,TRnU ٸ:8b,SL 9낖,Zs*VciRUQYYӨi.~Et\&GcH)7Mf6S<$tEJޡhj35G=Oͧ~F Y8MRz+ī[f#|T>=EW9ܒE1`Π.7`E|v KK|ROj~-j6T`}g,\[k}Fi7MG11b}~Gi<%H@BD>'Q)Z'aA;^ty8gi=F "a,$%q38H"Μq֒DXThX:-F$SAZ  &< 4>ya}dq6S)Ԯp0>Bj5@M+Wn8U4.ÀS E\pzNOE__ǠE9ΌzSzz)d3^w_WݭZcs؞Y-fN)V)'.i'X_~qe\Wv6hr:[\awVƝ(ZmwP9psmyFŢ1]ӑoi7|jWʦf1ۖSA4?`9ĽkRsG5T㽗o'ˡ? sMzq 'oFl@@N m'n ˼j4| Gpp6>2A4^,NBLl9W ټt¦hH.u>n㦪L(Sw<bl2;|nRX=#u>Ma+,d-)+_ r\Hs;rs@W.;~t64t\N'd)YH}7. .#3tUlz; ބmڭ] F &1C? V#dg7q2 cfyEe ) N(u)^렯1YO(endstream endobj 267 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3950 >> stream xWyTS?1przV%F~g{Xb 1XK'Db=XBS2b9I|L"VU/1p"L !&BbH0@‹Gp `」ng98vT9"F{,-jUAىvB35.^.5Aum­\>=ڽÝR;tΕC&ΣJPI`澧[cQ4D(=tW AF}I7h$e;Y5Qbf؃,lE1JCbd\0 i?[,V21M&Y,֢r xwVIl,&n>s,֏pQUXi'3I J[ NH |t֚K>%݉tox=p) &N+ ǎ-4`~a~XY ͠㓓A$ S^` SSbWt.>woh_rƕU.rL(,P,%ljM<(><`ODYT]\/]b+yow")Lf(1 /$V?*X&aC`lacw;)<I,Z]ֆz 6XbȧiBd2ODZdHP\K@#Y萺0vG_ۭQdcQALj"w0 >O4ye#FWY_pdur9k; ̸sQ?J4Mb/0 0y zC^L݊~5JP #M2Γ.CuʬLP) [҃\4 DT1YJ y%JFƢ\cÆfI=+6-+YQIj F$hT(K𖪪M0&A*xo jϣT~`͍cG{>0Rd&~ΰDF\g3h4?ī~|[]erXqK& !0,バdϺK'0+J8Ą9#ӕoIQz<-A7:g{7IN_,Y-%9 *hJs5Qݾw KY]dS=` )EW.N#RLJ&g"/Y`JC& "& 4~͐[_3Vkv4v+'nPP5OXi> τ\8tub*%)ә./bO>67[sDյG-xf.O[`qȊO7`'[E,?'톺zV24"x^e?1=xh2ݼرamO{\B!hˊ`MǏTcyA%DuvۺI%4WϘ#_wJ8# ʩv&7@J%t~5%-84ɮ(p~Bo[,]2ҟ8*̽z**j W2t1 QϺ76i٪b9yZDZCnCP6=O߀޳"Cu1lFjZ4!i$9P!L >iė/DiHR褦$7?g1ܹcg:n_p@h[kwCK|u+{:fXb>b~#8@=܁~Xp;1xyn~'{ר@Lzt"uc(6T٘U㇢PFEd;щSWP~F5㑪6$U)<^AGl \=eM g5DФP<D}#!R F`L:UDTbyb塗AtI|t6yDH>xQF.T\f ?C]܊ZZ%(H܂Je3>B?|MEԅe⃲M+{Ct9t~W HܑϒIe WT%WTyxn*3ULݲ+rOJvrTSťL$~o'yJZ$ ?Z__]*ӳ2P%TZ]G)+ތy3px~f#LZC}TJ4㨱x~ʄ/Nz%ho%OXsmA IS'آL?)b,iAE,'PkY/R-޽zQŎ̽xsL@wQ[^kZ;䔠<4Rp>.oqUq>y"ٙqrH 4]Ŀh*^endstream endobj 268 0 obj << /Filter /FlateDecode /Length 5223 >> stream x\Y$q~G;]7Ri6M-W19zJD ը&g7V8a1( J z_ W'juy]~]nV6ҐCp'^<m*0DW/oN{V N)JB?m:Q ^6[ t3/Jma=s=_oLQf sNV<~izВspz} JY;;_F2#U^?qIڼ~^_a}ڷTc ÄjS&sҺ2t =ިlztNJei>"^fm[_5ؑ`-vk9ùFl|[|ja i _vJy9+jB8;D^G){>53d\Zs0煝^ȸ8{3+&[_b w` 6hX;4 Ys[nukJCd 9L X8WEDى80Z$ #@-rm8rpa.ZMnegϷ4*X@H|T|QhkIs; snh)J}}tog $0-De䒁y52`P뒍9%cT}q}Y' ǻJ;@O#xQL4pݎocaX}ȴmn.e;L%虗߿] |2[3SQ}ƅx)8'-Cb,o} Yڔ XY ;hcM5hu{SMGJT;IdMY܂[0{ܯos-QVj5*{ zܮYUJR(غIYnD8PJ.> 4@HBQq"B*OK OPG2U1yX0cG<6dw+@ 7n/Ab:,-NLNl-^[^8P "rʠٱ1>NՌvdx8oǽ%MMu0Lu Qh5k`Uu zs-6)gX* J!*QV̎B BBB{R1Zɒ91#qrhf6Ī,K ",."{5>h1s9\k}3o/ _f t'"t1>gV)cMhYCwS[jWZ5_k|֚o[3jM՚)U5 7%yJ{e5ag1_CeňJWTkYfePqT@_&.!iCxՠ ㆥU ߗMࢁ` љ5kZ_&9/;oCX^T􊯩zufc3g.XGAܺ3Xmը@gF@\bz6P>nꘛ(.TŰîbl1XECК%. =KM {6q]q[Z` 8Lb y/cmc^P"%n/UP|!QukPJZdfh:-@ Pρ;g,Xԏ]}1:u{,[!߁B w)M.Lc@F\DH_T K+RF)Igj[Gt7jtKVG?@ #gr1+1^V0q+IJ&) y;ԗ<`̊8Pm(R7r/f!`P~Ɯ vDט`qC'<| , l/ n }R9\y``oI(:Ou^0)ѽ]V%PRqU`v<{_hmab?tٞ2yHePTUm4#ӢY!ʊf2 r ׅmc~%BU$pt2`8]*Å\44?f]Pѯk^!ڳ(O ean6:.!]Ndhg,?ol!r X*]ʷO=G%#JU<`yHu`g}Ɔ{uF .i*_օw1fBv 2A߁% D ΐ+J=g :b2 ,yYlØ6ܻrT8 踟7pFv$ԩ7Dr0Mk0Gv<fjR44a`q71ȉΤPo2:O0VViWPe⏯ha4W4;žMO=GT>zkJGc"y `OXQ2~u| {6崤 GEL RCJ XYH4%p~d[IJ QH`?mϺx;ƌD4VP{VJԺ .R ͜~ xp1h=cQyݭqrQ4*'(hw-7fQ4kC\l?Rvʂ>LI?b)q{xƯ<E{IfXTƋ Z_cZ;ljψy&x}e;#֪<2Gs798%|4t=^ s RNkAX9-rT.1#Nm]ëJݦ0Wa_ڻ Y)ZJS)@0+йby=3 n]!(uHO-VvCQ`;mS_vE\.i4]׽qQ<2}?2 EB¦ahTHUD-T'vz܊zq1>xVj<BTݭ!Xu`0QWL'$/7x>FwC~s~ ~2Dw'à~&3 [ƃȕŰ =/6;#TǞ~2ܚ7s |-Vcxqχ+P5!L+BZXVzkZ/Ĺk،Pn{UWM*|R\&fXky񻓿ܰendstream endobj 269 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4794 >> stream xXiXSu@%#hTO-8m\Z: cB"3D$+ Ȭ ! *űZZkZ*֪<ޝPz}sNzwE@p.wlM_8jE;Gܱ60YGn8lԥq $ήMs2y$@G a"dqΓ>"{睘>9˂DHw;/98[a}]!k"EM]4r4Z&?=0h}0ɎgΜ5{λnsQ[; 5ZGMm6Rj+F->fP˨ ZI͢VQ5Zj(S#)JDX/hʑrPx<)[J##HAZA62SXJ{нZoļqw!Cj=6,fG߶'?/#|F\3CA3J0ЬKn3W }mof3U ʌ$'Ǹ~L]9mG7ۤj@wh;q2]̀,'fe8Sݡ!)WE;rÎȅ0:t .A%V7j@5@ 8"oWN]8_i=Gn)@05']N*hёyfhv1joa-s(8j 2Bd$aoధ#Qd' ^pNThpH^] aK ]rStég&q)%~.qŵ )ddQsid<"f-zEO8{.m=M>`J@W!=t)* %۶xW֣SI9dl64٩Cjtxq Kn=EEL`q%7K,U4=jc O$tl/Ȣhcb+=>^1rFGM;sm_=RTp|7Y6puF|R,;N*%d0IS(F}Qab#IsaS8WL6js8d8j61cFٰ*u"a@׽hu|o8&b fwj]Ц@^*l qǽosrJuL D12cQCCX7'W$y3fNa0[h~qF٧E7 7-XNYL2lj#9My9Ղu9%)E<<7(>3q r|S 9TAJ2ړ DLJ"jbѽڌtF ~c,6O`qRzyr#Mh2aJ+ҍ4OԻVR6ApǚuqB^ÌHNӳw|-|s3d =\p'=k>ӬRTǘ$lWaLLA4xh5|u b!Us$ؐQãun2DKT2?Dk=r3pAǽIb(-0=쨩V·C8xjc6 qu2]H$l*Rk!ǩ|pVU4H | j s2 %sH4gyf3 6kO"eQ(:sti<{s=f_IKS1謹g7ako^tt'"q-WLŹ}ߋOI7#9Z[[f+%2}uQfF\]Li]eՒE-żHz\ζ.&iK=6=q [2&AYcm<]Umjne8J%QGpm&\K5+aOrfƚ`uꕪ ;5p]1a!;} Nat֤:PU\^ Pxo':)2&FZ^sJkIU]o7zieuo]0/>Hk4yjQlǶoD(% qTϭZ{ g6}ˢ7[U#2&g\p*BO&?Sɘq_ݺ?$s{bo%?C%BCmO5\rh "v6<47*kۀ eD8-E ֈve90/]ޒ"7h)7tjEVR┒Ҕ _ΧG'f ĸbD}bCYx#ߎhJ:\N5ٻMqľ΃-uτwlpdq'6_lpзu/ޅ}2F cr@n᳟G^ _XDC%t:smߖGG&$nDȑ/*z`uWt_'܋4-g OM! V*kh($4F:)bba+aP{->ЬT{iSpA!`gH:R;/lpqϬ [x2 y%>K|g.Ϝâl޻ 'ۊ?5\ʹgH 'Ƹg> p1D9ob\ V"HqOC-zF~c]}*ʸ5ςP-UO5j?LqBÄMRwJ Ţp?jr8 : w-"͚3yn:5 C u&NHLi?)wMQKv+4u*jÈ^)Plh2ysyςM&d#ѡI^.W<\<3ZXUo I Jsi ڊE#([6UyA_߻h+t*ןǪ:2 \xU%J[z}:"cyG%$zd>|6??'3D>][cv08\cWl.w7/5&lljl{nc&8|~ml:-^eޜ:pvfj{4O[4I.~@$w8_ I_q6ʣB5s8OoS2hˉ~?g2bv>*Zj,nNh ., ^ )8{ ķ6 4l!K(Itiendstream endobj 270 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2765 >> stream xVyp_!,FJ`&+ B!p8ee[>:-%&HIi4m& |v1tHLF;q85|O?ʡs5{^V;ǧ\ˇI\s`ڤ_ d$r82QT'QIwW gW/p"2'zwD~J֗1d@[cA#ׇЌՑvBH E7;÷w5ɒ9k ӹ=@ 5jIS5zpz"i `oKT/0- fQQ6T8.IzEW.Mn6]s Na&`$ֿl1[,v0y[;FfΨ%#eLzz Y5pnWKL;QIA7e I8Ap [Ifn4Bfꎥ*y̜x0Ap_yK5&/9]ڿyD4 Q\NSoifheK\i ED׋/-GڵAA}^ʫu)V*x!#dd/Og96 %8ELbAt,;F5!^CFT0rkԂJzj&cP7>sk!nm25EJKWjC=)W2ϥѧ<#xkHU[Z#a֭fM{vWb?:5r48~ 19TM$:=xբj2A3E#8ýA_8N׼ L8y(̾Nh!KDՀˌLܓhdͧ7t˃+.8OdWւ0}m'Ζ|LgfV~ӭev;'6|MW,H9s p^!t  %3O}t) ?s(~f5 RR^ J@=JNC\A Ɣᰦ "PSi-k Eč<ġKpK>-Mw=jtu6&XIC#(=by@:ΪmrX "<ݿVxN_ݗ uES1C+~aGgœOte`xp&rJhjr|z#c7lT\Ҹ6վ`XkXXR Ժd2x)P'W)_7&玲u4c=X~+#]>y >:ZGYqK$O]ya=lĝ@o6>oma]^ͪf_gXYn\x#:Nr!ع@<>:x};,d%pS&/--df<CG9XE0ص^1GIl"KD/x\?J֊pwuGhْDAk3\6cxJ lf*'hۊje}]]`$ @0.z_KkkҮtf?K?J~)@%RT[ 6;ql|_ /{_LMO'8H}n ^H4,U2oYr v[Hl72RV!DRz[@5qi)s(nƯ6̠)u*ȖɖL_C? x[sl_ 4yb7oF{-9 Y-V2$ZVx{:E omcmLBSzCY')Yr npޛ\$wzhnB&>z^bWrЃͪmbv+/DEEԾH:67{ ;{RнxCh;qTYނ+RtQ @u> stream xSmL[U- Id&—0mj" 9ph/6b)ziG)0TAȜ@BH%PPM׃ ??e󞜓~LB$IUTV]+?$#s}¯BOR.~\b=R* GO"o: (ԛzhb46qLaYY)9czTsMN͉-Seװ9^q/<Δg06=q1k& kbls٠:9xj^aеs44FhdZVX=gdoiNS{8R&A6K2 (!'D 1GzH 1X"H%ɒϤG~ޥ$AwwwQۮVj|1>WsbJGg>VLbxxzjmdaŽb٠u<._=1 cooEk |N>nJMx;ՆWzX-jdV[olODH!J*R7`9zOKl]پ;a_t:^96Ս>mlxnZ#]BXF#PRY0Ģf{PV3t!D+GDHQ5+縸Vit|N%*/gUDi ):#( EV0Gcp(CB] aX>ntz6j܂~x fz`78e oPZDa @Vp40wۏ/K;߼ֲhd^*Xz]fG-͜Eck*>JW^mQhhzLo6|Qn=g;e3{D+ d_ΪK4h,^52PX"_P"V(/"g 4*9QdGy T' GY1i,'P1jP!vO&iZa^Q8'HI> stream xcd`ab`dddsuH3a!cOVY~'YyyX6!={3#c^qs~AeQfzFFcnjQfrbobIFjnb ZRaQRR`_^^[_nPYZZTWvt-(-I-ROI-c```2d`f9%bɏ }q?DN±R[ow}l.򝹛>5uut7J'CmD&&l|?wѴg|m0d]=-I.H}p[9}cwݻsuoˣ*;_Sϟ:w$=\9Xpns9oendstream endobj 273 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7185 >> stream xytS׶8!Ĥ`%p.-!SBo7\p,IVRo\eۘBSi$$!{-g{,x ϞkLJ5'`SeqOx=F HFNd]Dߣ< c0fDÄi'<Ƣ>>I钀AZ 3,[/91*-6"<SxFLTbxOب c22Rϛ'MN;g1ۣңҲ"$'eoOzйCS237%GF%X/'LHY:mMڌW2eg(ؔ9jKփ1cwLؕ{9s/Xh˖ObMfmaMameMemcMcMg`= d`ddbbffadeV沂XYXkXYkY Xֱeg-b5%e=ee=z8cXObb=z5U/>p-dsĻ#wpxQW?xsї6nGۏ|Fknp%1r+@A@,e'4 FֶӋm ?ԕmW0E㫜oL1nXZͤ<s,=3n@V0苯&?st⒙{_wEľnTj˛x<}}]GjmZ~GOLٓGn96&sB0LJ;A <50P6]Xx Nę8/ ьߟ*[*d UV^C/աE7زɱ\3"{F_ɖ.zK=؟ǹx"(O+1C4+]C&Zd`*rZB/`WTtB<&Ԟk~1knlt՛J:{Q;SP&mgHP8dBMXWl-h5fW @l>$ANґߋhܗj^VP?q~iLϭZ|<0{ru7~wfH53i(;iB%(J *q6<1r On07\5@(OgT2V@Fq5هL!(_?8}Hmn6C#)~ETFP/Sy52-],&Ţ8Bgrgy ~rŋWܹ*uWgb,F0WkFc2/0DDT^[]:z疈鴸'y/=wzѢrL,$f&z)!75_Rĥz Jߐ"z$XPK9Q=!HYlCZaJ%Iaf:KwzW pO0RNK^,;_^:N4ch9{ÍA(1'3?:7p[SOSo.kNB XܺМS_P˯Sk3 !DAtQwZE1VbK ]ry`WӘ@wO[[O%,G988vh(M.S]5(V e3X,F8] pGN)ڡr**${"/m9. 7__}Zu zNo}…Xs܏9e6vA9BK m)\pRG=*BB\~8YmBP |9:|gPmEWE;pf"**ODK@yVթB& " (ώ?Kfs#h/_3ᰮ:S>oM?D˨f$:Y+KZC8;<[ c!@ #ߚ/MU,-ۣ8<]}KRAu<)hܾpDysq}7ibf0. }hIr_Kfdh &,τTbVQ 5mN ]Gd.?v'ht| vs LG*&l2 R& ?3Tj:%i!faj0O}\xI /ʖUp2߼SE½_2}ڏy(.%C씜lQ&Ppd?k.ᦊZ.+G]ou?!2b㓶ljꐩTt*k;y I275[eȄ0SL,kEj+"<?^:}uevn(Jb7@of@I;S{ةn,KdVj&z<@WeWwHM4ٿ Ӱ=qipG4PS /b=Su^J@&OY b`f[QE4~\1Mutid[*O"^׽+ &yA`,Y$6R_\zW.4_cfquH.樦H<&"V R 0*y2ryKW3 &]!a2)mob Vzw5q^ga|O< L}qw<~yP `+ʙPQvTYK,Fcr ߦmB"WN^Գr|BD+~/,"{99dwGLu\N-j*o5qx)CaHOis{w} =b}YMU F (BPd+g7ґ[/2NQkRx>n/V"uPhaYHZ7k dS[XЃQ_N? wZFV 0XCA1<1d*[?%+;ܪ:Yg~14qkbZ gyV拼fԢc[;IUBTTĜ,VF_O< "fk[̲C@}:95d3-4UPS$nG=*wӠvݠrvjI}nm-$^dNQ;]1PݕS񳰞 T0̝{׽F>x1Ě ?LCHL\}5hm4{^bn3x׀02wn'6NO+1z'<)ܦ+X9܃SR=2:5&3(v5sz%*,%g (IK[:*3%':Hh礽] Ԙ ]Gh@#6`e|B^z ?BʿX6RʶYGdGP-%?oGA4PSTVI{*HIgoNHN*C\і0Dz^m[E-sQUN#t紧}ʁ/FE퐄_.{k->6`-eg%WmΪh0{_ʌ6Sڲ#w,ն( ]̕ rÕ4KjDL|"#(=o_VL.}CQ]*Y{f3 _\sJWJL;t(T zTDs. T 5h+ЎV?؟y٩i8 TL"Ko*4s ^H8]gHtEݨdȕ`v]U[Ns"DvI(:fh+G;WFs/x惛}f_TP -}=~]SQ\y?X OT _^v\w,^ ![7Jʽ3VĂH[(~nL]Uó 30\K]uruHA)c&ru2T D R4L dýmmTj #ZH䴖)YlAfȅnb(JP%L*X oH\9j5)\_h.;}FSoP'7j|'%&$ǧ9r Fm|22%69>9_\XO{J2b^FKm)jYPVk(z\ↃҢS9uUfhy&nA_5zy(q$B*U,J=wa6e]VT&LM(˪omhnd'met"}]m44fɧ/|jW~=GhymE ǭ;o>׋IkXML}kV=2=;/M+U" s嶃&bϫ_VR\mm񃃱B2IF\'3]Ы8"{':Q&4ƉdpO޾q ./;FcjčBL.SiT:m䃒JI,q\}AY4~if*E=]V^U MИU&jl$#~qR:LCYI) J|(zXUrMx\{IAťƪ62Gfޡ2HRRdI dI LWk@k(ӗk=~<ߖ/K*$T5D6D@: BӧOFt D<^#ʔӳ$ ]~ẍ"q&_sHɔ|n6xrh[|~2݌I),"t{ 5#&(N%:H#JJZgzx"<"6Cܡœь#¾[GunhR?E葮ƴ  x|F8#ۼvjgu$ݫ3K":OF¡r?j9gК [h-PF-,ՖN0x(;x$PY%BtF[I˭(*:"Zb)y/6VFNO30}gls?l|H]|lٓ7;Nx鰏ZvmH47Ab&fjn= \.u3~k+wpwc~1?,59eL-bԷ=TiMdvBq Vcj@Ncy,$ApOPG?U??9]f GdvT58W]J\ҭ ͩb5l>5X$/ eձʼgsc^߾ g:Y7h;(of޽܌|bh)YiCE/#.8ie(B\ɭ-%Kť|0[J j=ᵮڏO5FT]ڽXkgA;u' gw5ׇNJ3蹯z/SaZ$\(~gw)$Tü,Jb-) T%=i#~!8l4v:Ze$f3xNQ3pA)LU{nWݳQ#yGS > stream xX TS׺>1䠈(=:֡E'pbs0%<&̳(ZjVSjZ:Z]>}!ڷ[\n?~VG.w۲e3<)(*ۓvl X5}Ca ߎxrIhLxiD ̛4kƌNB|K}CK!i;W4aTpiC"IO wR":kKBBeRp'7o ;%CWX%tgh́[L{괽g̜5[9gG^0fEL ф;Cl qxb3!@l%dbL$S4…N$V3b6J!su1XO'ń-1XJ!=1K0b8@8|baE$CX+p^$~ߍjUCA)$C.G;Lh]eӿr?ڬ(6Am;q|Ð!MC;ٻ؋컇3 I4l8Lq8(vl}Dg#?l*{kx ?~}G'7%* IOC Au<ʀ?}!HT ՃҾ0 gcHdgh0YpZJMfH 3}`V Ky"-M?Qp3NB,9OBHG#Fd+> _^,4BKa%@/" U[h 5&0=f=2ıdk~^$D͸bQq7$Q ѯ &SԐ\ jmyCeEl`JY취c +ȒFv߄YÇ:a ߫a+;Rn( C]Ȃ'8Ӭp[:Xs˸Q'd|+wXmEIl[dCy݁J O^ﭽ$kJc*@hKiInCs"`-yvLpsD)]=tΚBAյ4SfLdH-Ћ#:^j hm :ɤEΫd[!x EFLI d>($J\G-'h$Z"8bgsy9VPDcT.hxp72 g ~@`|<__Cr-7 RqULMYsi!,8 9xԒn#LM@7x69#WDhv HAw_pPZ;ϼnvjR`8 yp<(eWO[\Ph,f yr@އCD "ǝA\`6Xd4߶domw=Tb1z>@/=2?1R3̤5#H)cï09AU˔q@b]5,VNW2U<Ѳhld pK)gP{OsJoWJ0ZJcbsB+pHlTjjj@#Dѷr~javD8_|8d5&WUtnu[5Ǐ|e¦n$ԙBYf7[ޓ-4UzWoʟ< FNĉv6ca= pݵۗnjOa8v&w8œYLɒ=垐FCWFh9a). ;{:W*Xp#!3qvo'pĉ5)1 ؈MkAEWʇW|nsRsŐ7 ka} ʵ+irP,^o:sB-8DMS L-,UBC[g+,`5"&9oˣoZ5g…_ ] MK>B'%HʔcI(R, e+Ùzc!**(QiJDTYQS/k&ݛ"B@M]<[TTa J2V? ݡ=]PHu\׾[ ).Ot>r\n1_wG_wt[MېGz?no|k95V-m- }HswPV;փʠF!@}YMT8xlJ":sj{U\} BvsÞ>xqiD"J$҆a7ndkn3G{do07aM>R$3[;7dc-Y4wk =)NlLp5rۼ;,phzezY4T"w/neNAi3sʳ//2۹\ЯΜ:u Kg P%K}7pplV6B6&c0EaVMAc5f9#󰠛f5w{1&"Lk61ˤi#2~24¾a *-׬Up >О m4.C]6#1LJnM wh65FkphOq4:<2eH>|n/jVŤeE܊3$;bh4 bQSBNMqb*D?=sEl^k^0@IReILs"K"]e{ NJIM*JY_ ̧ߕ?_ywKU0Zhv{s}.,j _}?^p_f慽@ s4~5}H\dgFx~|5pԀ"u 7AvotaW'D+ѰV"Ef1\*Tul84*:dwH‘x㴇a"Gq󰯂'3ՉOa$Z!M;]wэn]k۲HQS)ԩ'pfZށ@' c8Yw֏,@p (=A&qp1F J!2'= QeU-YuYLv翿M^ɺh:E+x2il,8_}d@we%սnO҇S:cKRRpʵmǯx2{_3P9#"Bv9X v5ς)$P/P '[~rP_.y|y(bzsG8 [*t׹x>* P9Dc%y@Kʊi AΠ'>)!D9U^*|rДVk,:W xr^ϭvapjo?#x:p .5hPE ނZ]Չλgj*HфJm6?vXVLjʙkV)`m ypi!sLFo3 hzendstream endobj 275 0 obj << /Filter /FlateDecode /Length 11975 >> stream x}[! pBU$/ ^w,<>ه>է[ǧs_ $$;X^N'r?I//B῾,߾N-{N9K2ƓV:Ν/_{}3tC l8QooƥFʤ88oŤ&m:ܲ_Bk5vNz9j>4NJy{&}}tuw' -}{haiIթ9ͳ QI?AҺ٦鐦'l qn80U卉W+ѱ1í:w\ug:ON- 3ԍ> j\FOiB;} ^.ݣ'vɕYL!1ԇ6uXKb6Fid{J۽%yˠbd-7Ã'N~6p1tM⥳:7/##Bz^=;\a&ȵ^'A|D6q!{|K??)/-oK;6Py3LdtXXc^Ͽ)R{`-͇ntVp2,z۸Wm~0Ir !0r<>y V6N7Gkb"px}l:ztO)FV2[;;n\!s=Av&;!aYD&ղTD7' !~4 c*Y8y]/cɔƦ#װ[T3f< W.5|sE =7y.>aICQJInPsn *NsFQ* l?Tf3&˚'\gn6b/Esj!zy1%eA*C{C[+/E @܊m:% vtY4H%irRAޤ[/r3#5tNkH9:m/cv*<ԏxF뗴JϹM:[a22|!CgJ\-JeI<) 1& 1©Un7LT.EpvґeSMZp[:vCRv9dC?&OxPIDXR[,AJDe^oX6Q=6>2H0`)hE+NC3gҖ*\S횒DgÌ*=1y6W`8#]iJJ#罊*6 1oD}*~5ᢀ#Cp_פMb d rz YaRX)L^>-Qaa2uQL 'tw~IǐD>3ڭZ.y'Š&$]A rm!%p)VcnsΌ+=8{b}J8փNb"S*y+Zχv4 keT8v&4Yhb*,7yJ` uF؁~A:s:=˽!LjlXc/L%/ vYxd*PE=.tǂOp6I#烾I7M?ޤ&~*,>%. i}37iu}l/29]2>1:8:5Ea~C&"7Im貵[Pﳽ7^0rZiW0pTT(lݔ,&ifSm9_y [Bm`NȞ=?^t&' H꟟ȡ0EYiE!ܦV=u ]O},u N/nN IKI>oGp.WIq.S `ɿ&əuޚ<xLz˚ߒZI46 FW[[' $cGnIrS2pf(. Sr;1'ρKʂ?A8 ?.c[b'6yKrΖ9VKԟwy6nWFI<) ^PbΟKk#caw 1`s-ݙDK߉qT榆J{ȗS" N R olQt9KZX?܈֑0ifNʙ`[g!M*nҢpOGd t˜mM6E\ CndV?􇮔p~ܰ g,G9th|"eI *]Q[þ']%=S=u"ƽh#Mn[R)HE_2=E '($͛Zk\ɐKO*};X=ew˽v%g&;/y.7+{ЂiՉ$ճ |͢p$51/` nԊrtP\ }{4M ?p P%hrc;|240ʟ!f=5io"qDL2,s2eLB6ĽGT']3Qm`^y!",%3833ͳ}ΞY2r(vlNf!,]Ђ- %i?`H#魯dd 97tHɲaBI0L -~؆D-.a؏2~]v!4N#4mԉ/sªY9|)lVq K1x~hVԅ]`n1nz|F'zۺ2eOmt+5Wm"&jǪ|=QMӸo7餃 ``W`p`iGbH!z# |S0ȘtӢ| @v zu/HH>K8zRK2՛XW-Sߴygk3$tz'gvœ5j*uȘ4K 069GpŹ8˛s߰&='muGDqlq u϶ ݳv1qCOoE z@HFYw$OnqfƂv VAGqG`KQ(3)t42Y:6,,ʰ~+p>Ζ;zeπ!E[9e\2tt CT  x}2TMlO9ncʔϾ Pk&Ъ__ *UMhS 3=nFRMJh+Y6vCQN }P WXڗc=7XI?w4uY3PFDQg`,08V U_nLI38JT2z9\@,F_YI~=R6tgk L]U {pףdy4jlg<八RFJ+OtDu7uנər4( ((Gt.=\4,$y2j*լeW H8=RD{" 吝f^%x8!MiyHJ8Y<@蓬r:??lɃ6s7zB& ܡ骬% l${t&)i tiS\Gxu^~y>Vl)1n gT'J/ oYKyYk}e/iLevb+t%k!Z ځ)]~4SiV};e[5gWX\C`@kxF9O,096u9##I:Aem(*D (T}5S@"H3@*r߿Cp* _t Ǔ&, tKRtt3I(*MoXAH@7#&3ߓ&;l5D3W fipV'&bTN&n ˹y,(S|?5y "mڃDp3]ڎ0q+05doq5W҂AMnJe-Ma~yj|lGѤuJ ={84/Sn `YM%_~:]ERrqIUaB cIt"EA=6@1h* J%b[Ht|uSŨwt}` S&wGwKDz~6%pla@,lKY';`ПHENFaP 4s͂.be8kK|vP⸪enf9>@]~._aAdIs.gLO.y 4Unf,V<⏩nIƑŽmdVR(Ji Rg,8~դʐ:]Anܟ fI:ܴU>0۴cAݺOȥTae3"ߐZEϊ$Ft|B0 :g9ٔ:RGO-~I]Ƚo * n?L;S_TnħAy&,?~/ʂ >iksmӨvu)o(w,\1G.)rd~__9-cC:/`q \MN:PE:%kp3W)݂%6MheeTPQ.jKĂw} ^^.$U."^ZwC#Q!),Fc$ɴ;-}ai_+lsY,Wyf#Ijkwĵ_}; Ü3_ c5B";IvAV QH4q9PO N@Osm'Y8BfUϜKegHiZQm l:ɜɺʱB *8lHmnD3U[6ik?a7-+b m +K;S&$gi5;P+b}I]jrO!22@YԠoL磸*.Y1}32<̓\N% __*23jA$X諸#lc=n6P ,1.X [ԟFDBM}㍚ZA-Z2E7}1JרA\&ٔc-F`yS׏Im2 jinܵ;{:^SǠKT?|ˇx {!EBR6G<ʆn osz;W/YHbEkeF.qCZ9K,u3o{2k_"$D}N)o759,֟Dnrm';)USVM,YWoؕ F)-a!/oV||On2=OaV60Ky1ήPy׌I(8 [ύ)jYhKX$IjB.-{)*#ZOjD fYU RKmb=H'}gab%R'vjK/[3+Y&1:-<RHM0(Ty+9Cj:Oo/B24Bw:)wK,/fʫ-ikz}D zѶ3)^F3pQ;g_qJ ԭ(Bh&#7! \ñ$Y mEN_n-l?PTrOL%?ɘPV& !_i x 19|ԁaV䪶 lVnøN7,OKC x/C)]`KI.绢8؞,\(Tf$ K =ɬe{6(xY~4sxq|FӲqe^͑m0xq߆\MNѴ-ytK PNDa0*k*SJ}ZuܞCՔGZg or]YѴrKl,4x;"-8IhZ7aPJ}93.A]T7_?f{f^[z:QgZ eR弓׾(eo{W BrQg@ҲѳrSww⒰~s`2Y!eO~QlҠ[idr99n e+La<sVن9eխn"+o}gI6q2mRX*zG@?!Jk)cUR6}9 ,Լ>)s^QcU#|+ū,JsInx']VعB5"֌lJQa  fKfC` Pƀ3SSk,Xŷ<`@Mײ3dF9L@Lwyp7]LxG*DT&y ֥ z[r5UM ܎|ہ+Tyl Q9Ъqu9 D+ CZִʹ^v7եR,E`bKQ43q\)ZcJdp[)6ȱ@xă$JY0Zh/vʿbtacoQtU*4&jr3!-nxkQ-؃q_ *ݼlPFvs,9/x53 R-y uZGwUd~AU:=OYҠS\z^.;aXH*FŽce>"IҠD~EᲿ.MuM!/XYƓ̓;lw 3[4d<7e6-2af+D< Ʌꈃx2e"(lHpm`jRobP耘|9z.kZd#>lOꢭ;3prd*]h07Z\ug%Tn.U:\-H x'{e"pNZ9ueJF)hk9描:xTK(OPcQC\m<^MǭMQ…O\Eء=&mrV=>\̼Ж Ve;bcK-*AXTB@E  D/{z J^~RPg{x4m*Ky 8SHem38x tTuoFl<&&76p/?'CJg ?IU ` G<\qB-ց5lO Wve׀y,ЮX涵9b^_URM>׼ e6';i+g4`Eܪf2\7ieRuUc D4nV#vS_'-TT!i8|{_ͅq~$N6liʘ^a3WBP|\ڈ{eeW43nʜxpдZ7s٪]?VY'$tG^gGH=)>Mzbj>z֮:>7'k _W\jX`\1ĵ 0$6sDIx{c.^pXtCBrac̙8 j_,{x"3&jF#2p.ʣFE #ݪO 4 UVW'lK Q,:˥Ϳl-"J 9_ F7ƾ nxagJ~x}*cUotOgC1/{ Z+C]WaApœraꄇ6k_k3(=!rK cZB`Q[/.bE~,0C^G!(3cTU{snElnf{q}/(@ ڈTϻ^ـ-|G1θk ݦv!yeP{`V1'ϳ8/HUGy*V'C?W=JX î ,{w'F/FP]uP`uewҋ7ka/Kڬ5eMzh*Lms?GsUl~OL ĊYeˋTN?ɱ,ݯP)wZR5wCK;-D .Dau1`=Q"x'uU@1|X=Cbrk <._D ur]qu󙾱] k:X,]-zQ3a"R,ه }I]y;~ l>mA1zl"76-Hc4 h.Ϩ3 휙N>x&xu/X1O iY;FtAߗ/.) ^+Ukcrj35o{aΎdyZ>oҷJ7LʡjpB>G->ߜ^x%/4~SbN;׈cv]bb?>:< [s߰5s(;@֮q$w1&K =7sHqlڨ=Oȭ2x@Dz<]6}j܉<*# 'Tm~SƔ߆?ȳp7 7@~͂<׍M p3.-l4+VFa {+]\_W7*ְioT=64 ~ϛ["*ZPO H~Mtn(f-/v%)6↏ B8ʖ0 yøJ@.=BCΩF\ =6GDUi *%e!8kK۲^&~.CO9O_\{H#QP3vN b#J[ 姵q ~P,N/ߐ w1EiZO7dU~8%MퟒR0Sm|׾b ^۵޿jH`}|GDnX9l8dz;-kO DS7]4~ 0'({"P@7u@m胹yY4&'9串ZJ ,E}@֡'J*,cnIβ}jȡsn՚.фNnetyWnn+= "&2q3y@W-=FWTʱn3 -Krz?9?>d J2)iR$&}g!:Ћf'(}u3lY8:p+*IAM̫z~!|\ /Y 6zlEr] gxĜ,<&Cmc4u3z8&FbP<^y,#9cx}(w)̭h#lJ fռ |TgZ"sȫ،0,nXyqtӷ@2VU>fd.6N?v ;Yי˘t0sSsxu޼kv7ˋkqyendstream endobj 276 0 obj << /Filter /FlateDecode /Length 9426 >> stream x=r$uG:5l]Ufʡe%"BQJl̐ߒ^Veu`h5U|]{s9\m|x1\п^=s ˴/o^]256_1sy⏻d`jاgW><ذ&1˫k>Z3Wb&?8ݸ17/`6`kΧRwoadXG4a >ټ{O~}Lt.w>ћݷ{F3‹Kr`ꃗIc0loهs=~pe>&8FJN6kZ(aM^iqfHxHa9!o#qHiwv_N^|s?h6M&F3c ቓ@yoRs|M0XZu6?^Ul{ LW!fxK6y @ XxjiN`ͳ~OCl)FL!)DB-ewa~{mÿ]^Cȼۙ&p07'NE!p7mƭN=bp)KXK生]Pvv'a10 R\]V0%1? 8莴`(O^ZW50 مxAY.[#W#D+" E3s{8lNnȅ++╃x놕i`u}-JuD#C‚!DNo$c!"!N(qqD./`އHލc!dyӢOFҢخ">af:0ّT Qeq&* M~"AFdf:6Ncy7_@8һ}8Kd џۏ{TCҥfj;oPdÖQAPd$K)?ل *\ɿbW` f\Mȣ&X a^k j pDۙtW DF: qb_fQK>;0ٯ"Y=~,#@O88@ c0jpB `1┇+fmiܻOnBz.(2ċl $3Ibr`hXQcrEex0#6<7[/l$^Q'hG/ypI^.t0g;Ã|0Ia{L`#t XX= COֺ-$LJ2 l(ԑUTXS#v˻G=rf֑_*_J<u:20҄~Q5 3ԥ;`[:nkyWc#u#=JYJ:~ 8bq"6AU &Q3l ЩQZ頏䷬äO ٟO\$~=y|Z4ܠ]o~9IƘdMe_*{WEV a[t?io򪁃Kb"1.йJQgftMU)и/) [̴Hgx'HօJ1M= 5 3c0OfK1#?(U2Zda7l֋4lƃȴȎ胿3$ TwJ4=m(c l3%P- \cVQ󾨝^>Gix Lל]s S~oŒYċո$~8O* pr7 Þ\ =|yAsDÒCqU} Ӫ,@es@Ao ¬Fx) W,]ѹR?: PW1ўd4 qqg`x\zD8W4' ABQ~d!˛V|2e Rŏ("^l̬*j Ʋr[=y_Dž r'K&_HSڻR>2ЂyB<ɠj8D9EPq.t `%&>qtԋ&ؐ'=U%WV{?o`CuJ@.Q__|p[#~!VbKoYuy&"Ԧ6# B/uV2Tp.KT4H'0Jl-k\u0ETT,A9"0PkRTu4k:(D*L!{$tg4mN) x#+T#-xL /Dj'vf> uakɠ"67-xP4r2M* W2R|%f M]{ԦcyR>x(.NpX 1b'U0ahգuW4e!(\Oi@k*8*'V@MWk  lVr8>Mo)d.IEܭk7=\G(!<7qbLiQo|L+GngAHYKAzymAz |}.mD|{s61/)gTn[m*J!Z&v39BXߋS~]i|;aX<(ΛF1bgMKҨH&m1DRiDӔy 9Iz؉ C<܀w&R1ON-zגD٥wm1o;FZ}s% p,%AFJlSʀ"{Ks2e KV *тiO$%!nJL;jRxEE]`ɚGO qGHNaS%~9KߛэM £e-S i3!fx)#X$3Yp(ӎ2ߙӣGC@lI)'ŧfXJ#Yp&^2LT >Ǽ(ꠙŢVFJ,mF *tZ^gj2+F{6K뭀MJYVeWzJK)N6Dk@`ͧ1XiWLKDRҢ&C{ &z-}9_=qz6"_3.0W\Si 9؄vDnnyD0)ghvK]zv_y^R4S9֩Zۥ$FKh*E k*-`ZB!2XtWiNZza?mZ7y6I5K2=BFaUY33 Wl` `˘]KݔHJڕ~v,T%',=pˣN8G sQgTƩVg_WnW֌%)Wq;TuAY9%'#zJ1X^Դ5vE5 :?dTmdSֱѐ/ ʍxf~9 46V*J)6D׈~Y/b*r{yUUA@J^0d䎀3콪A ׂбq-"NY!t%Z`|Ӝ} LrڬD^4[\~b?e!b^"oyF$Mc/ ObZU3q |,,\Pg2l #pdw.x_{vlhw&M墾FyC҇MyuW^kX"˺lѓ1`.k1 arCN:`;Cz, zqRs;^Q A8Jg!wۑٖ_1W ~׍Lģuv9Bdh# 6ƀˀY·Ue OtVcaaϯ oިʲX |$ M*r9 LNN }4{!DT\G$ bRmܚ eNהg{HفSWͦNݛ^^]zn/,@QITM >`K9Z4 ҸoVlj lOQŌ %xFLg$΍61Šu"V~~izME=>"m` 8'k:]!Ƿc~>K>}0~ਕUP ARdBf8U|4mj 4;]&EÖi@*WW afrjws<Þi jkVcev5-9 6PS" B\iQ\[t61Um#SqG K9"8 2tteo%'bg@tJvG݂TFbJŎ v{У,HΡg&<'sBwun|ϣLaYjDфeA(1"/x1zlWGPmzr ,'|o+/O|M$KvYf@ :۩jr^qu:AGRahL[eG1Ф =@9soֲ+j5CμU_D`75<)!ΌHL1Z#N.8Y[m?\  (:.E@'x˪ףZkφ=$@G jt;of-:X&辨 v/m*N؍xW ۘ?9 Q5_ZUQxo]ZyJtJ{ 0?<&b {1O)%#pʍ: '<& DriR/ zס*Gw*i2(px-*+X+0g]h1qG0)3Y4.c?\k.Ҳ**VrDm\1R[ux<&Oc}3#FxƑ,;x ӄ7͒\ǻgֱ<<1)T2] ,Om6囜tɯ_nT@ػmQ7O( cقO/PqMtBJõ0-;R2=9úcW*Z+}$aë' :ϹnGKHӃ&Vz2J+phJZvif܊Ah夊Ef}雔 *nQ BS^rnXzUIAc9)SeEq U8RZ92(byUi#ִW4&q[>QF{!-PB ZԽ) ܽwT%R2'm_^bjF"!E". syYI nC.Wɿ?hf5Z4ȳ{&/ĕNCNK>5Ksyt 1F;K:oc-(,pN×9Ev)4: GP™&9b5h#l+DMuQn ~^&Yb&/2 \)ml%,]S>6RߙeEy ̻g螀4Fk_%-YZ%c'ĩ%򜦽47N;k5TfIq|JuOly12uZ dZ!`;L\h&a ((ZQ!sf}Hm'52M+<ٶM?!st~cSHV+4jEni,92ׄQW{Uq9w[]@t)Zӷ3:-kjXf|CLcJ bz@uf/&'L@҈iFJiHݮNM|NNNXdO۪FaFݸ@ߥlxNNHqhZ<&7^KR`oEk'td7!^XoM3#Y#7ݓk:r4W%)-[U`-O^Ni/HqzKmFiӑ7a8 g0Xo[څ0ޛ;1J74U-=V>λuk,ME5 nu!WZYx)yҏ<;sپUp+*v^|O}Rs7̃eE%=o>طr"6Tb>=EX .CiNw,B:>'tys;%=-57*{Et`xlt yNG!i%m{%K.ӝAJq">3*ky0RH! >^ {U-z/sq)r~yv pBV\=cA֨i rw/kVMɩf).|dYh="( 7*k*Sj|J[(Fߺҹ/yY#Ili㦗KaǍE{=n:d4:[*BSG\Q(fd%;㨠?vV~A ͓+ )9Cw*Þd2`{ND QBƜ DN;U~LKi^Oac݈@:_:XkRΈ!Mxm.C6\^SɛD]ԡiSQ r. ؼ̨$Ԣm}9w0Қ S9~k}rK:}Mx;?L%(:.|Uz4E`?\l/v 2D>⼈1x,2=d3 qCA9q nBO$\ŝ b_żہ@5Dgl".?[+E/ XL|ie<͐ԢJ?70csXO~$l#I.?_Qx\à35"ܯ(> stream x\o +9.f? @@H\=$=V,Ɋpv}-rp#9vj;|wsw'?lnئ6.;{Svg98GzG]^m`-pTn?*xzٜRÏp^V[~4)x^2Dp ?:e2! I;%{4*belqT!y3\w a\,ÃE 3(G}ͩ0I%Dp:  @%{%UV;zQ1@(Os h<49UN3{ ǟмDΏÀ& ֨숬.PAg=<bjI*c2BBlI[P)Ǣcze\6dCZ;;Mcgba\kpC֍jYs?uƌ|Dg'(1?d=-M>Iep#6a8H4:7{E^{!mO(fD*>$gl9\QZZ9+yrڐ򈊔al 'U[>x)ikp;~?-DaUe8/?4(~vd"M{r QT`(WNilJ?.鴤@?xe'@pw`HDHuڪģ1.R0Zc8>;R=3i3A.xM6j{ǽ}R#̒2kmJm3Pq/@]π^lFs}6zN'n,Mk{sg,#ȞQ7Ox3ɉLqlD|aX\@`)M[0dQ7#{Т+q]dNZҹk6 ]R*Xk5]F?j'4ު/gcY$[r-8W15.ClyDlǼBjYH2_=USuX-ܘ'&a'½0yhs#Y!,βO{ݞ>/"EO0D@b-w"yME vYR"ԋ&='2+lA+j[I{- CcV׊ᕸҒ ;#nQG]l1Hq]AOPFE+d6+[FbdvӶZIu%gQuz X u#қf6УmXVj< d%XVellmMKNEK}#%Νuԯncv5OL@'H}"IIC>bɻ)D@fdߏ¿B/" ]؛ixtٔfiJTi^$fD]0 V`tУ7ҊTh{~xj{!+AbWBXⵣ՛UmшeW{k֪$<*h'Rpo=u^ћe|9?m`t7T* cnLy-( p \MzךygǪ"է_@[NAUĸFt4,m.O V"l 8Ҫ*z]/!<>!ݩKtg)=/endstream endobj 278 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1451 >> stream x}kLSgϱ) MeCZhˡZZJO鍖rjbWD@ũsNeqC]}0˜qfz4Ya_}yɓ7=qa8)-}&f),,+dKcw.O.<eyUd0.+=JU%թE׈6oY+z}bѮF)%(DuQ]D+Ruh:ZuÆJJ}ZQ\]': mRiB-H( ]?W(U-j)%*UH)ED`@Ѭnl%;}cc%X&]1.v /g->bl#üS34l?헂mT)h}>?q:ТꨲX(k(JLx,&}aa 3#WFG@| 2ЪAGTLʦ^B'\6˦@h; : &(K8\VBъ 0@a1QpЇuItu[ӧ&N&kш Rbx;DS5kh9DLj q +dN*gc8M(d OG`0m•#FmHolԛvCk;lv{;< @ gt9 ͮ9>ku],\s@M{!8m$i׳Ӆv=IP9{{IO 8K{&/Kz𗗧~&j+?U'znV.>^˼g ZJ|dtsH_O54k`d/6 ;*PnOpD)`P5Ԗ4NF1Kѳ'JؼRy) jw\!)ѫAg 2J ?:ʐgقG9+Dv_еBC. F7:vcv섥"Cx&C[9h /˹&ap' {ӵUs::!Uw>Z8[ wӬ78M:hmDcHw߮Ud?s'fg,787's@8fѩ(|MAD>+YKB`a?}endstream endobj 279 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 513 >> stream xcd`ab`ddd v541~H3a!3#,,N^nn?' ~-Ș_Z_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*@\\KsR~a`ad3{\e݋u}\}sپkZ8eZE;uRS|䨳ū[FdÍ߹9VK9ʪyݓLh\]U9{e`Tu7O#=btoz {˖w9j^*C׊.^s֌\Es*~}NtS8~wO^<;[]uwyw ǟݍ+9>_-:grzggvςC|Oylo-b>s e`.ςendstream endobj 280 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 451 >> stream xcd`ab`ddds 4 ~H3a!;͟A N|;u0w,a-A{5rVFƼ⦾E% ɚ : F Eɉy %%@NBp~rfjIMFII~yy^bn^~QByfIBPjqjQYj[~^_bnءz`9?$H7?%(/(5K-,MOْ_$ȒG߯ .)0ODgO={vs"ߏHNj樭m4YǻZvz̾~{\l5݅KgZm?N=cf궆VߋǜimӪ%AVĆ %gwO6q_K~+Ngϵ{ e`endstream endobj 281 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 920 >> stream xUP{L[uvpj.%3n c`b&CGԔ9f)p  @{蘃Ec5>DG2_˖`8[>f%>}10,{.˪hYT4?*iLkλq?,w |uB7_{{$aGwPSWW[)y,n=Dt G@f^U)+1po^(lK8L͸\q $G@b;BtOqzj ).8xYU%Kř׎4&־]rv6}c9?>獾1C NpȺ_ɩ^bG:ɼyyu6/e2-Ϛb$Aendstream endobj 282 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1972 >> stream xUyPE*)g"u`WϠ  0WfdC\vjbr]brԳ*id+O*}}pɒwo-9\8AԩSkCF5 87lnv(lZ5"}J]Z{,G#]ZaӦ7ׯ$ݡf+tM\ɪ\TjKF޼n]IItEZUᱭ%yP+ϒƫibB.s5NPkR*K^0lR.,k325%c)^,ۇbqN,ۅɰD, A|4't9BBRAL+ɥd4g n?ЋsoIxU6X{'6&a>E+u|FhK: ' K'GEp 43X2_ptlnna/r]zDAceR#RfȚV*kH/Cɗv ~PZ$h{ ( OR jEUo5zH^/_;_J# ʈRSӀR0-\cڹDF}e.2Ϡyqܐ^=ʶ[/ ׂ.g wSm9(|ٻǩskub(6螓b]nH$QAu{tp2 @Vзvuzz|_ehim~ F_0`]<ëu^nzNϹh[XgQ[ @Y^u$ XsG%IQ l)+B+jNvKvW~Z~fbcUނNJݝא.=;67[ͬ$[K~pE0Bȋm Qof<'4䵔3Љ7)0m:ú\OHP@J *@nv$M8\xOa?5s-ZJB5HwwOw4&^}Wqoʧŀ'm_\]bVl]u]gu~+_ZCYr (jQ!s+ -GLR}t@9;op)jz9^=s8:|%U/V+ˊuS\E€M_,{2&ިɜH ;l)ǶE|p>%X.\i4j.~h1ca0׾LCvJL|Ja`$SYʩc(ܓ3H ';v5)^ITUfgwwNCsP!p20  N SĭW(Njz{N{$u,*g65M~>d=|F 2i%[;r`>6R~嶎ekZe0l֏K"ށ)1  n,!y! =ejSC& Bu|>"- `0ŵAe#DM$Aoz}endstream endobj 283 0 obj << /Filter /FlateDecode /Length 7140 >> stream x]IqCi־!EP!}8ppp̪~˼EZյ_f3?)yu&6ξ?7_Ϯ7;ۄ!:g6/rx/o/ P&WE<7B{7O)LPGQ~> lW6H^`&Fg$ܚoWBW翦aPoFT (^ڣv|. C\`}l`|.4T a⃁Gm S,[:<9< $^[_D:"1z)u 7WZ(D3QμŸC V#A~3* [ŀuͅC1oc2OoQNl<dLi#O&3|J=,L/VOd=>cgY.( ƃ.˱ԪKKPeFWfy2hv>D=2f kf4B:ւ'I8ꕰE/@ Qˣ(y -W(hP6io&n^%ˬ"q-1d"/׫#Ӄs7 )6)z0*}Mi昀Q6zx7!x wv\0rrO׫bǭIWmLr&=\,q7g$td0 0hh%Ȳ15p*AJp~.ͼ"EeiU\,ӄu8af\fZe*T |b[1-j'@jűf1X+k 'D`Zp`u[w.Ip5Flgm؇ޜWKo9S{$ e짎\~uW΢H`v@֏=ѣ4*{D& hR*u`ȣ&EܸOR;-͖-}RUfZs5H*0JUG,ۡ%\y5PmQ79$x[)Kx$Ӓ Ď1->gUAk8C1{?AG{Dƻ;u[pNK{pPD-/ZsuRqrj:+Tܴ[ܴݠ`5<^-%wɇszUK>:S{EzdG_pll*pǯD@`0l"GێyJ#:;y9:zdyTЉ {yy823X$ ۗi0uZ`9q8GVW|RXplq)urytX|"k2pz H?wߝB_ZV<3ojbK,zwXnK;<*C0}/ :徜+c&:: !nEEUEW0"Bҧ4^%%7$Rjx )tA0}Ȫ>%uӻ~A$cX2)dlP^X!5D&jwi.[ġִҹtIJTqaMz 4"_'wL42ߋC&*9Hz).NC{$ ͼhiM8ZuS#ϺP /{Z ӹʣ1*4I, NpJU ={hJO7NИc /vWaV"\I+O7|R<ʻ3N:{xȞ!RZC αz>*PVq|c`gw`[APĮ{Qc\u$ʐMG7yl;ӕXIg'#l}fiÐҧ6[Ƚ\+p?"]趮d"؁ᾡm޳* [_A3df0bvt1fSrMI՜fÄi}h҃c׃8)# m`Ct3P4HΨ t%F0h)@3~#;p0덠M4 uiQ|_<[c74ce$ècVײ:C1M8;h )DuR1acU <CÇ25X`q U&1-HFU_Qx X<-z#Q $ѧ$."6B^-p\##v$FwDq='? Ȓg9Gk`/\xr\ޕr\/7F^* ےw`q6i|V._LOItƦ˝#+7\/ry].ǽ5wcd.lt6b 6 dY6/984zg/f;AHڑA8jM"hԆz'zގ5, re X#TT܀c(f*pl$@@YT4G12HXkEoqj[G 6bB\=v܄|el<:8-M0VUū& ,I`BӐRr<~1|9NAI%4o ,|'K5Y9h!)&&릝] ^D87Hɨ#{f0DK*zz'(&!)kz3J#ZCoy[5P5nrBx$?sRB0"˅ˎ%8k;C䥍y:7Wq`InyEn.seLk- ~6wH17Bjk';hN_4! EوE髝!3,IW1IiUsu Xw?õH6Ejc*"Nb&}~X\dDw)El%qо5NtZ@ + 5yivy@cTP <,MXE'&DH-1Lg?&|`v%Jt@xS^K'YsS~mpsNrI ;}sϛx te;>_w2%yyByl2 cld1LA %4S#OT>#BYI%I.IȞYIJ2 :&gxrCFGs7!v*P0 Rz|LLo ɑbvvY![Ūv0FrsKk@(46r6@zY׌tv'Jby3<6dW. s:vAo `'.f^gʚ)a 'eNU[(6TiOh{7T >d[bT4vr|#B2A> hcɕʋi2Z[XF,l7jU58~vAO/)Oؼ70@Zwl7]ԭ\$>Fˣ-Їqv -(]WPR:ՠt/٨TZ{IUbb;(=DըNws!ώȈ MTPeD^3 ")Jf{mPB=gyרC^~bIU4U(".-sg@l9u~ W_9 \Sik{JG~ojxOe b3l < X&0 hL#džxxvbV(/L~DŽx fݰ~Lݴh 6>_(<5H6N6U1M6}Zu=0{OL&샇W0ӡS4|'vaNGߗv)ޣ#fZ>zU-E0.m|].ore|U.8qGPDkn { z R9T p`MJfY& w>ZiOX?ϯjj>p5%-Ɩ2sȡ .Ub p뀃jMI+ |y&Z,Qw2E,1|v^@T螩`fZ97Z15nXԫF#]qܦ=Š-+뎢HCGkg#~H"2wy  dJD069Р{VRq^T: 1ұ5k']AD9FCš]t rz ~r2bg}y?uf" ֠ܘxbWýԳxׁQHbwIiܗ7[WI5-;twM]6NXJt ,wU^} lu ~ ?: 5/$6NmJ~A3LI%4E:5:OSP:enUH*+w1o[f#u,],ÞEJ%~*3/[JeYv$__N#`_Om$XgP~9<ׄ R&v4ևW?nKH6C?yq 0/R@xFo> stream xUMs7O#tV[-#9[*bb1 'ͬW"[@^뽷7.r nqV[L)HqB'j5.{z==n&n8'{4X)Ӓ%dvR9e?L?fUo.l9vnZK]JfjeH,[?WHW YEY{L,T&AjJֳ e}BW=5&fw\vz^X@zp):$꧈0gITe̬ iancMPPLAgumq-jeo[1U ,(l:8X&ՖqF%l1$&?ϹbׅNJnH4̌ƾxXEeyƨtQl5ͩCe'TjC{25EU0#t^?C-F`\H(e1ڌ꒨x]Wq O;i6(ӃcD]vҩJV0&D|jcԾ̸\xHMHU8S'1miQ=_x IvEDz?0R1o%ZY8CN6@+mSZ(<񴣍SPcU4( ,WrQ߃Lg3ºch9Ag ewk}GAGO8U%~v/OorC2.@rTzȣ:Ut[) dlOjMendstream endobj 285 0 obj << /Filter /FlateDecode /Length 5725 >> stream x\K7rGtǡ.P؇UV'|Y0i͐T3T!F_':2>9ij;yg@N(CܾGUPz1Rjwv$P&EmJ5qnoSCuIiaegbR%6X =F>GJQ uj6JNE ~b".=#KޏF{_40I-,,3bԋ!0RGkeU㝁 pϙ@<|f2}C+,S=L0%0X0_2le5Qy QCg{,3/S @\I`mY@/]݅ ʅJHr@t0 H.8ZufenXwc*ТԆs)2PHR0 .~.=CIaC^-gSƳZW /#.F(Z~)q0`&h&SfߓG08'PJ5֖PU% n~8\+ةqU[Llwhߥp>$j71=B 2i=jdyu4C 7easfrƥ+\&ݟ<`}cuK0?m~G he, <=ݷ`1)w=4uJ 8tgpe@Rscە/2N61\@$\Y+hpq 4w&Nq3/jD/:~r,Ca|xHXa7󁮎`Β xAV "==ոx iI8Q}#S{kF[l*o/(!@9naI2:%\j 8Ѐ%FHC1 3}W71g{18ŇCǺNaDY4H&!21`4-ky 8gS%`ǗBs LLZTN<_`&Kk-d6 ;0 SF->)9IhtH(pb( U5RY. @iĦdpU8WX@/4*O13 8q!d$VmHDoWZ[kS+2VbJ0Bt [a֡\uqq,@Biy]R3\-έ₁U#VI "Z礣G i䞸/ܱ!ƙ.. , `0W0"!&@14r =?lv?1i\IR1aω*8(N=% n%>H;(1A|5x⤕#ӊ{xI{O2 /sƒdZV.D̐.%# /`UʎaL0kQӗ6D^Nv 'I-kM `moӷAwlaaͯT{ nI+KDC{P!PGbiI?va*E-zbz@V!<\V.SE>3:9Ny8L ;r-ڃ9h-X9q"ѱFSjYðfK/CQ*QYϭ@3kr@RA7gI/]-s5pt$@7$^gK5a̖zh@cqy.G//3mqzr.ioi;xAV6S0W$a|(,Dٰ [jlWĖ/`̡['KXV9[ G8 LhEVР_ o 7Lxx*iqNdFeL| >%HyD`_"{^P NUy3[_dz24y%q :yiW`}4\ @k0F'֋ {ġN7X&>؏L}P5>5JJ~z@ZQs֖mQﳙ#boۄmsju fHJAAʜ%ebLWJ83kT/10jU}!xdhX(u׻p%y[b#pl_>jI2ug2[|Smr5T4d18j89t7;is놂\m'@gi$.H&0ὤ\p*+Q7ݙ)eu-,{0ڞl:]4|_['>%%äZ"J{XJt_FT$\D{0_b56'Y\rƹnh]5+;G']8.mxlU[ֵ61;)g"uQpϞA"p]Mv0 ~aNDesط/E$欿[0>3N `衫rگB f[Mٮ6ggu|Kɭr>4{ʊ{zjҝtSÎǂrUYi`K57cd4/wG4y";f06 D.'&7$tRÕt[$g2Zbªv AZR+ѧmj ՛of2$P1 \^oD3TzQi>ln4` Ҡ3 yiH=0gnBj2 F:ImN'ܼULQ1𢌗n0Gy, KU#?XY\zD_ jmUKDLʛkF >ezhсQ ,V%IUpU/u4WJBC1_7S !0$DVw0pP1?P!އSI]ԃN#o5,Det ~)IH%$D(:A%CɹrO6*<\[-Y]{|_\l $,l[y+CX%!Ã\IԓIh?I&łOЛ"9ȗ>o_.x .զk/wOUzAU}< Ԕ?xQ?}]l_ 5^Cg3J0Cn>~,q.u!L6]}?v)Ģ;2IqbhcVo|DZUgocf_}L=DƆ͖;bz:YMm}X;?sR.q~[Rgxֵw-{[e$;k'`5B;YDoig}oy<;k#uW[Vxlc)];x>#E2OzgQίM z\\*YEj Dr"kb鷪_gz#L~~f*^jsEnPČuzRQ@3UHD}өVJ &#^Zb-+srsĮZ> stream xn8=Nf ʤX)'o} tBy: Ks?q vnpsWPQ N1]N&P.AձIRiR F7. ϱ ; CNNO&0G)Qf>+%,.jMs@ͳFTT|2^ t^3Zj3z99/jX`up6Q''E<;=s!:15@ɪ4&bҝRiPvT6 H *9Ұn?lD)kG:Z-uN1aKp40iBLHqx+>?2^`ںf[f ,3 (s BA@f-mX8 _4r0i0s>ueO 8Hjt5cb| Jvs">3!H$}a;@uVFy+7k.43FLDkݨ3Z= /O'h]ɕoI_ U.jLIrJR)H,! w>%  D8tz$BhBJ<\%8/)ȩ-Y[A"9Dyc$,A)7I>c Ġ X`?X6f"&H(PhgNE`AOV^t(> V9zFuW4<f.gNQS- )kpB`8Sa$3relFD5//0p@+At JuFBqcSB14%8f'g2Tp]yml15BjtەSeފfb5Um%:^8#Z~X"ծX$/aq7nA6@rtnw'z3[;LFMd5ڙ,Ŷl{2`M4#As=9zj\e@el]&' 5kHuf VG1DКśD ?@)*%rv,k_ˀ%ֳdFe={=3`DA:`B͜w$4Hc0`U_IR\h@$kSuV_-oH^|,qU5Z= E n-4O4*\?0IFLr#x*L+Ŝ=P_2juoq3.4:k9$SG3U@ pY6AGd(,-#`Ng?V,Jtm'NacWWX.dB, ӏ`9EAdcKXBgD Lhsyd@^ySaA/Fh=mfQ5( XJ@m.0xw.W )H1b P}<xP~OBZMXT('h4&OHiu(L֌t4M04(,w}!M_ SKP1EM.Bʭ.ujJ+5Gy?`6S* OwE.ƿ`p9H23w{p* TfONIT'yƷ)M¤>Õw~p s&,H{l^&<(o}+¶kZ<bi`Lp7p A le Y6RjHRbS ]@#. 85;g['eޤi`2Ӎ qJwZmBm_]BJ$yc4ZB/EN 骢$Ç1.4UWAJD#q*{,ݣ1EX1{0:5Ibh%0=>jё.6d45s2!|l5LD6Sy\!דp(ןX. Zi1F.ؖ뇶h>bz(޹I6(XȊ`R~9v^L.,,$vH[3hV9`@vY :^9]S$DXʥ ;Ic&/OB=@8znÄݠQ]KtJ@)iW)oy3C(p-Ql0![aiI[S|BBzX\i R*p咽Dݳ*!1J&NO1 ޡM˶(|JSt읆~5YmPLmnwӾ[#ҀojSEm6 Ҳ* K&_׵y߽ڼy]aewyźo6cMAJP_G)]D=MrXg;/yE`gxG`k3|w?>Vʢ:f0:6 ޑY@܂:aer;.Qp-xrZwSW82RkQ(8 %v)B^ŌR7&I&@p+0wuN.g S*`ۇ|*L wňxF>H)႔ע0"`t)A?"\tْI.U\}wJ8i] /e!A6ꎻI$S%VVZBdaM&{v0;k̓%3&oa8DpAqE#vܦ$/y!oO;i;KjRƒ Y T {5%giOgw8uZ.v̫e?hoA= Tq3T^F̘c%b:Nv#L9z.F7pCIU L1"Mޠ}\Iqz6… Ytpq~'%xf!q2V0  xX ,gg~gEKNdJcib >3HsشӞ+Q* '򸸞j%`B (bm}(MSO4,"QV?aR&*]KCjx72:%HD, T2̴o>cs2r(1Y)6*$ʝs,466LPRt׸,r_h9߳Z(⚆> ;,I:IuZ*& QZQ$URSSPݭ45T9ʐmx`V|DTHpi<<_H+rL)11 np%k,3uSзa 1VkOjPR?55kMF+nyRLvXW>QQ/qǺmAq`Mkb( >%]t;)L[Ş"Z;XXk1l^d4BMP4=L>-'E=3>Enh]3qZsE,sAz%* ^9-33a.Y<03=EnIҾ*K׉ Fi&W4duIj䧉mg^6jeI󹺞[7ۼVF %0fX} \ 2g[)u9&<JKmiwN@~~ ID%9sO<\^'t !U> 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 288 0 obj << /BitsPerComponent 8 /ColorSpace 135 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 289 0 obj << /BitsPerComponent 8 /ColorSpace 136 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 290 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 482 >> stream x(CMMI7/MB@  KniensCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMMI7.CMMI7Computer Modernkappa:%wmpjrpmgu0ؒпs}{qHGXbV=Qpr}wxz}. uݤ>{Dk,~}xdq@XpDlwCp`  7 6uendstream endobj 291 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 582 >> stream xoHaǟMA=/LM4 ,rK[w7/oJfr⬹Bc! `DY0]H]_ma"X( Ƭ,hK9\-\di2m% "eȥk!{5xOSSc5ᶈ(B5$FucR ,{0 ^[kVCSTDO RTBDBR$WE(GBo B_Bv$LyeҖ#̯5&K["ߵ;iՁyщXP.h^} sX>70qc  5߱x#K|dԒVo.?}7>Af| Dx&3jL.^iK\-F\Jm7Z|ԹTiN3§ه&)qP!TB=lacc-.9)<IUCcp R*uo` O! w6=.ov gIәqnAs@endstream endobj 292 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 286 >> stream xcd`ab`dddw 441~H3a!=aVY~'YzxyyXV~"=[{TfFʢdMCKKs#KԢ<Ē 'G!8?93RA&J_\/1X/(NSG<$C!(8,5E-?D/17UR=土[PZZZC##ʏ+G~e|>ŋXx 9?ƾk3XZ=<<@K_endstream endobj 293 0 obj << /BitsPerComponent 8 /ColorSpace 147 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 294 0 obj << /Filter /FlateDecode /Length 9779 >> stream x=r%uq*eygNNɎRvbSj484м$%ŕb._/^_ҥo_o^zQy/a7X)\|i/J9:E؋o_2d\>\_c.9tc)-|%Le:NT//WĊ>)X78֕9g) :fc8cv%`1 w2|mFߓ1>O4dɇ. F8[l.Sp'ۗ}8p#Y6h-V4pSL"s// fcFKI,X&8u>ߊqfoBF즜˫)cK|). ƹhLA`SN.U3|{ )NE~K>tC\l8| Wf9Ml-pDC݌Nxx G_UıY!63ұK9VɄWMb oOzM ,Wp!>=ňeޡg!6`3ӌDE'y RԦ7b5 4@N]%XH{).8V,q't\ >/ұ @h"_}bǩ,_n_a+c($y UHsH,_U.g!DNJx5`}*@w)m!ǀE5DDi3 ܗG24\ h7$2o'30 pMN (NpyZaOno=Ip/joQZ4Y 0A.χ &>;dlM~^ÿ/6dp\)PG G \3`;:{lS`ϭ5uqWP/w ~< qɟTW.nZ4Si?_UU.sJG 2 #DOa?Rט8b~ڟ\S^YS 8kRw.ic?8/U[DcPJO(R q\J%F| 9=( .y5DŽO#2[%b1>Cp [b.7Cx w/ep"[>[ 9QC Qe">+_ɍ02NÀd֠mp>}8t&5ߗkt&s| O>S(&U-Nvˉg,9z0dYb5G5}Uuhci/`</f5lX+J8VlK(Vn2%P]2,~ p^k1?|#e0  $؆4Y7SO $OV!(1 ydzlҀ@.!X=(ӵ|\`9a2KVە V+~,ĥ'v-xUZ}My]l\7ȼ>L|48,U +^T0`\UX ă\F%(pgxfߤҵ+Ud't'T &Ap PV[yHK E $N}Қ͈ijCe/\+Iτxsuq0yAH8޺L=ݝÑ3 WfGGo0[SO=9j"oyhOns*$[,.lR( +49Laƚ#J4*;_7qoaъҕXiLe4'qf~ {Zj cA=cn5z<o4 (Lv6zwWXhAtG\[eг6{!Wɤ7~+{_w# kNz_b`66`~?D*?^hO街[<Nxc|]Tϴ=y|=}܀@Y tǃLoG [ej|ı3P.xLNag$f`h=fIz+"rj{kGFS.@gI뜩"λƨ*GN:X;B [q}s0)ӡ?곕*\U%,AY?LN9c%#U}W {Y8ߩ:DM;fDg}w-H"V涶[O^[nUBM֏#|f+e*6k'" t@c!zi~;+KIw ^/@π:DdpVQ!Êo'亐ϗdO`ϻ?I'~Oj..N5%UbXE؈Cvڕ0QѸ>8[Ln+IխӜ!ҝ=` $#( 5@߉[qn;ra[b`"gΰL-/t8"(eIhu,HVSɒcǡ_z@_zE AJra nGıO) ABE\,p @iB4ր~q̮@oѪư$~V?P XQͼof D77Jf`!J#m-?w9"_ hDJWkY|سC ] IIu.)D8Ey0Iw̸.~䑑Yw8ے?,pMRo3Yr~6G^Ⱦ"k\a`d04C;97LZ)2"xk>tˀAz#q hmz8)vnvlZaQ,nI ;aciȭ?7Y 4E|kM0b%b-+~`OV|,:6+lM!ꙁC,PàTuMuHXw0 hGusF?n/L** n1ydSE4ZSyd -}KP:g%8LV,@( 6(KǤDũ>=8d" zk/qٕ8fL_x-A,6X>s^Rʥٞda xonQ_IB>׳ _%0?Χpfb-sY_dL\tT (.V{~>VSFtu5X?Osj&) goŐw;B vRPïg#7EUvСHZ5_)ВT+~B3(+p'49\>[|EkC^G(P% ys_I5%DpWA<3̞d}[&7 :u?iK)tiRHK-T+bHPNy\ٹ}kV*{Z+,%"iO:M_;>1qK>iڣ* L.vЍɒ\x#IZ9-U{!XQ@0 CxW4|d&d]2[Yܜ)!Kd ժ,^!b^;VLE6!PθqPނ|nHuuwJbow7--PX͹rq6<A͍B2vi BF+ 65+3`)LA[i2k^@m|Sԟ19zr&bKA,@x^>Y MW>桸̔ kHJ鬝wIfį D~:;wqD;Ŋ"RqUBSe (Of_o/g='A6ygwIaR]גC`R&+eptlˋD%ZwZϬUx6 >ɉz iSg .a!imS'qEa9Lg2ΐ6 `Wi$k&1T@EH#WY+Mi!kN<q#9bh |#X(P ½:)ZyR߃A u?oBّb/= ̎g邳TKĽjWNHM0dᬤƅdg,k\% wqyZ^q136"k̛0'5dT2]DcXG7xL==s>eHkbjTu!9i zWu+<)'pqTX7^nE|6SQB6N| Ҩ8:DJI]yoaI#>Bw(|XD+_ շe'aS|JsP(F4ل@K]ڬhlXϦ@Qg=o3CwzﶞYAw#2Ü&-]֙ 6'J~L98CWjd',#'^w diJiBFxMq>[1ۨ`g gY&@qM8Н\&=c.\]V^Z1|L KWW#$L#K:Fs\xHv/*f 2#7\X6)܏Oe Nڴ2"e vyϟGMG m~ɾ& kvj#A8M[[賽#>m]YxxQza!١=He"wA[R;,h=_|Erp0m죚#J.4K΃Z])l#<b*V#Ѱ$ $,N! T8n8E8!\(bhr( SCtim-n^xwn+yy[ÈUWڝW{xD !^-PJ\֜LD;rVWf;HmhtLT i\E~^EzSVH@a\Y&OrtČg%JSKPDm\xZtto4w LB :9n "V?Rt_љ)0i<6nZ![6nRgMmtӶK*=PdJYZ>E2DHQ۸@tc8(lf_+tjQ;q#VgiDZ( 7gߩת2\]F]?zk\42=\7ӻ] =>,d"RH/6,9x+])f${{ʴwPͺbMoǓ V \6RL`TfL@`{+L{Fa(jktq'Nt{M&ZPn_ԏ#@xE \'d,pX w»"t3{=н>>=! # DOD$D2;{SrD|לhptk1O T eGyk~I)vqN]t(nKtmR}@W0edI"|??󃣍C T䯅98=oz#mL@ oby?=#O^%> PN qz._~l endstream endobj 295 0 obj << /BitsPerComponent 8 /ColorSpace 157 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 296 0 obj << /BitsPerComponent 8 /ColorSpace 158 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 297 0 obj << /Filter /FlateDecode /Length 10867 >> stream x}M7r`J+澷>^{S(|6xF8,(5E6פd/2dzͦgBE<|$ ?]M'u5߿}zulzg *W{FwN9{R]xJ+ɫx?|w}}ԇwiiRA0Ɯu%}Zi iJnh૟2*-CqV_O~ҰHcp|IaV7bLC!8gBTib0§c]8W>|4Ӿ6tSQ%/=|)k|?oi:b ݬ11͍<}1]c%X{,w{|&Yv=It>ZcN#f?_z=\NM7lg8 οN i{6!hg9cFOty gdw+eN4cWP&_˦&XqQ[#A1 !An-8u%1rV"a!Z χ 9!y 8M&dՂ5oBu: +NA0넯t`wq*<ˁ|CIGiwsY*@C{͔LРm|G>˯B0s4]-ӹ\1R -T)8 "M3̾]0&lcpCx~Ǯ^Q6F/ V) #4=mnDT b""DzUA*~U5WpSt؍hme~>}ofAl02nK'Ƨli+ѧ-GTq ϟ3<j**1Yդ[t833V##u$얂ଲCpCC@#4y+PP NE潑7t!tm$;c.@tӫ,ĪzX<`@fro+L +r5+g=9HUnxU:~t_dHZR%&ΆR{т-1,V`#oن>b |haEMeߌmi^B5؀KWZ hΒg٣ qQqg \,ȨME?$P Ҵ}Viə|W`yă@fötr۽EP=D B' _ct#zCt'2{mnu :!cj~s֌$p8t5a d5%Ԁ@DL?L+h+̠l4E d}R?T~ h{|V;N:4ڪXdN C,Q|hnܒ]îC̓h'')pOM5d}  󛯽g@/$zNJT?T7xOHn G2q82b 1xSJs"˹E]5I:o&a'Kzet5w\!Q~OHD5gSvqKI1F` i-΅ IoӋI`=T[S@MdRh\G<(c-zʺDؽv~ٲL>fXVbiy$,ڢHW3`@2;Tߓ' x K¿,&D*G; :,n$e?G4O(i`DN"L'|rgnK?ܴj/a"!1p@Q5Ǥw,;;/n&PF(i6pS* LiiAxc\._j |Bm5.Y !l;ISl8cjBtC&!gB3II@3I+j;˕lDٟF­Q_Nڪ@3z{ha 4\~S_ L\ˢZsOF3qەـC bqj9 i]ZCҴ0͈XAl_yɶI\WgyK)2V2 rձjTH)98ϔA%\m1aB~S$(HCֵ`*H4D=cP`]O|,$]LҊV͝`e" XlƉWR@XH2whd 0+O˹eK.o0DKO+d|m+ۓ"&̧y֝dHx59813`]ŸeC yWc"ͨ,D#'ZN@x8n4EQ]s W8 1`JB;$ Xb{EnJ q;oļVҴׯctI gvGw}=]N͔Ӟ mn`0dG<qIhu Î6,r-;9LQ? n׎8$ԚNQe6Ծ#H8pCS4N.:EgjIr%BLDf Ǐ<}j%hc6|EAt|;D+f/w<.'4b#DĀt1Qk$I!Iܴ$ /Je}&w=1pn:ި Ѡ!&4 Mh B峭Xg h+(nJ9̱H')YtD#0èg&䚌&h+7Tt![7{ o& %<7M7 HK[fN^sаXqyL|ڮtM; 5NRMJr\rK$٧[7e`H5J+]`+Uɐwf Ry+FTa5iYIop\qYr6CfǕS:FAż;#gT2=Y9U-3f5P\[E&<ǕyIߴ~E8F$7ufcI{iGtey %هN-XyUd5E%4#[џq,g58V\8_dD0ۂ'+1 Yu:wE*gF\=ʧY[sPJٸ'wNr09 .v+~p*6jw]{ZHC$-9SuWRᏀ|<yc +30Ꮑ4bېn+T8de`I/xgUC  \?1cJR@b9N0:-_ҾtLoN?H"O=-YGzO0ΝM](#14̛]$,W `x)h&Kn \/,Y͢}MRqTZ rLNж"ʇƵ1Li+}#h330x2Y%DF0y d0`7|tVq_Q3=̍WrԻ'A3sޓSԣR;/ڎX6(%g -{'(b$9)(uunvK{,Qz6hBZ~C *q Pk*o?e^* mߣOR85; U, J'jN#A ɶtIDY7ҩ':},n$B/Mlޢº'+B#H!,Ӵ|}{! j6?ꯌ,8h 5mA,Խu`^',B1EqߓYBd-TK-<].]ŀb[RV#xu/9 Nz.e{7z13&UGUQ&쁛*.tre2|jqԣz?쿯>gc2,I_ cN6b T6\!6d6+LeBT˝KhX穀uSf_r]*^ޛ3[QX|>d Ķ{0H_1Q : O3SHud#LQbY*] J$aQhWKPfɖ+k.2,X~&md>1 ݸ><;bbWeLoqUJ4YWJ -ּʜȀ[Μ:8 -4yX-=c8/"!*߄eQLe).ΦjT?tqQ1ۼŤb}5:ǛYD n5} 6uBd'#8u2m?u'Ôy6*1t̶Ry 6qώg&+t쫍?<8sr~1ϗ{^+xcQPؠ?sPW;DZcrqp _WA;魱iz%a%fϫ'9Ы RA$D.E0G!D*-yxf a03"heE$ÿ%6Duh{n SkxCD_H׍,0V 0ʜ%m(#۶,$ڢ)?ԓQ,|϶!lxG Y2O!MT"ӾRM A&RXbi%3QC~԰)?M{&2ZH{+Зz27h#E)Q,|0aPfT)а6"cPTF$VP. Wz$VVyҗL,]^ִYD'S,2Jȳ1D0r[=NȌi6[,l7v3/ m:;rh+"l []QX}itXF+*8l~CP]0edybϙ9eU.n%Oh Z֎ݪnzsQWN(Ez4S'`@Day$l&N?zQIAF&&/& >|nf >"b1?BH?6c l@Dkҡs;rI,}^9;6>6Wenmz᭡[#-NsvSlv$A ?n\QS3,#rf3Ɉ"i<Ǐx&K`hf|FRvfڑ=lGbI;;&X2yzҁ,$- [AE u&ZKA' f*e[:V1ֱwY.SqIX7Ȋ_/B_t4GY>0w\݅E2BKW`ۅyN>0BW bB}Cq&c;fp@z-ǝ bl4YBAǷRwib+SePv E1O=D'9)ut `cu7F a.G*-gV=/4d{΁jڏ4XEL*?n{o2nh(je u;KSt nzx?AI Ih_5$OL9tI7Ϥ fؗ6yp$ԿZT0X"NGI Yqp 2~lME~Vk] ,dJ?󫦏Dgޞ9]F,l9r2_/o#6R8}Ǚa]G{mRmAVV^żI1lvIN p 7bE41EgS9\5 Yؐ[b_/M\G*Ok/ݪ`oÑս4 0ɻ= ~TyUAO $Ry@Ԑn> M?XXl%(?~i&0yG4JO&C$.t޾lfЈ xٷAqSh/t*~لJ:/Uz ?{ 2Vݦ~>u< \ v e@ݓ)ŤZZQvTm7wL';ޞp5A6z'T6x\B^-M׿ ^v-t\iH} g4c]jŻ ,^mep+tge7)R6߼X{"-8Y&\.ƒD6lCSPL) jD2+IR߳1/e;A0~d5qϮJg6'vo\Pٕ8}ї&Vk xe)T5 r7,jBhJ Rt\XГV ֡b"_nWX1r~e|kao˟ߦS.0*>c ] L'!,zvD>h~Ijl~S#enAGʪyӬ?=2 #a+u9h+(=G܈V;ᢷv8!#W?y݁_YcP2FA/|oV#oV@M+zx 7(Nm$as#kfitzɸEQBN0!CP[nm$wX( xצ!l+^~˞"º85 FGaHf6F&2=,+=L/ÞrE53@p F`95oo\+σc{n,K_LP(a7$xIc ;MKf>TB[˅ |b'O[h腎'{G Q-qPdا;.emT!V>^F-{ps֝ nO!MTa&=y yzռ/u[ `V騄I]Z CxN| IRYW넀iB`Y?xu;O${wfّb>}kYZ#gpjQ7W.4->u֦pYoO!X خa -:* a`߱蠞S㢲XiFygyȼRmίlYvJaDďjH7F冽J*=gA'_uH IQndL^Uոzv[qMB;w^3QdsG>^4̣pA1!X˔uϐGR]v1'}l=;mIT M%bRDɻ>^r&7^xUF=@{_R,\{ 5:=' AmDZ-reU}CWS%6)m󢤠'0CJQbho:wuқw~2ϊӋS IN!d..=1%l}d }>͉H^>wRn72wE!\EkRjl Fۢ% -YpH yٞ T.w8'd|?:aL\y.unj/+ٲq}3aǭVd/k|#{57VuNl[ ӇcN9`Kj2w7x0%Re =w[{1tZ`f5p2R$B L"YdQϵ<66.Ǒ#*iK&fR{r,xzӿIGz']MdJ5_/$V݀-){5&ǽjT\衇%FIZ :4w'J oDQX ۴0pOj)δNh2*< j/L1~r29tmӓ@BЙ/*lYwuK;]\v_!@[ƦђIeF.i?zj>8Ε2yꞚJ#gTʴ8#dk"X=ozA |0EBTbolu^ ‘8=l# Fn)Z3xW=} xC?48}tf5sT[0HX(s8gI,s؇t46rm.x_`pw=b!hfQ ~0U9=!&Ŵ&JWG/G̩#m6d(m*YgKNK{d@ ^N?j\$m@ IxTQ_*qz !x 4Op9Ő$vL*9={#o4k@IK$~/nQ-Ǡ!-0$ -ݡi&@x-[i> stream x]KN|摌 ޏRG\NRy9TjXڕ䯧 rf8*@n*`_C Oׯ^kƨ峋$_x_ .SY.Z~bRhYY%1;fy˧0XxX;k[2aV6^:iyOUVr70OA(8GWy8R2權r'YZ묛8N1c+fƃTU&*Ae5g7qgr+90QCҳU>[5/yQW8ZyoO9lή\zWF9,,cR)xǼhF߼/L0O3f^5zKcI40wRZuxo [\ Oh@9A7FBbKdN8= !-ABaԷ֥BQ}Oﻁ%A-@.o[ݐn)xZ"_d3#(m5#|k S- 1_XXoe!iSZ苖6ڋ |Eq^8[.ŗo7,.~rNF~~Z ` E ! :Wc FE RzjC9Up<ɔ)wS3PrynwT , "qg@OUZ0U?G&зw#uK0)#&l 0N{𩱐 <,Cv;&zgnw`T7B&EFvӒC:~XmEXͨ##. 5S2RXO  ݱ.@b)>+eʨ h9Qw0!, p8™p^&Y'7E47BW.4ztn`biz܅ق+H؄=_G^xt\ʜG m9`?.s*0|^C (dۍ̨wwdKe r *eb$E) SR[R00 [Cjoܵs:*m{ "y3b4\rʀclE C "JD/I`XȈOriJ"{ySm,yT89Y_{!HExƜkzsrȧiD5T4뙂DJ%V!o:V71qBj}- $߇f- pubڍq? h¡r:$*تԝWѮ>|bB; Dw L ad) HUD, ֈ#A`P(A*ruXU$ tdgl,B`M\A- Нi Mh|ިk!#0B"%lEucFT"'3ބuTSX|Q|Aң]7"Fԫ\U{ i6v/K:⎬wI )sNfM& i[;o0t *'C⑟ &֮ ޭtx> @ ʄ)I[0%aG)X-NLʴ'_fN @Z4{{<́"&QbfAWHȫ|d8 5C4 ,z[Eoɘ+)qU! ,IN|@}@Q}YaoһM` ttHN}o&# V_U.e^9'|K? ,0xyDO b%uU}h|#[hӺx#:>`nX3_G)gY4s}lW9i9,  zW8X\44^?Y$F?ۣ(kե rMt̯ 0 S>iTv!Szvkĸ_*d: )l0k=/˜%yU.EK T{}퉉$rt,B>H~<CPFh(ACwW P<+5phE0\'.e7jNbIhD!xC 9Qz !M [9"5"YA!AP :>+#c7MVSm5bLȩA,P\xt, "9'yE4n($"8{M2o8, YJG8i3©%H^ ̙ r:E_H|!^טJT}~xC>6\:Tx_? l4yuYY%3~"㟎މǞrOAz kJ9?qtէ*Q W !Uu^5…@SKvȈȤv\oT4 -.jSn@[ڳ8.;=cMue|OƄ6V࠺ G͢5_b7^*u¦U']6!<ܼ2iū=7$+&~_@l73ȘbbumP{mh_JjɬjrS^֩˩MKm)QZ?eJ*z|Bʺ{M{Dسybˇ6#zde{eH_O8Nm/{bs}P%ˌ=FcP}vj#d⺏lt{>18{+!۹'Z4mO#LPfQG7;>p^lcj(uckj̩umYDajOއ٭xes$) a1r{"$Pڃp>zf>c ]*Gx&#L]FS=W߇5^OKIuzع9B㙌gԭaie=mY&_;Js#Sm}vAs_KoT=VdT[n1(爣8Wt6tzuGҲqbkT1S{tO[U ~0((;!Ğa\֭s ӊ1ngK'`$+gQSܬ:$gFc ~儀tɳ5BÞ#k_>QgPJ&;^ mť!?3SlAO8ҥũUpVl~$]Ӝ1fu7|yAendstream endobj 299 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1903 >> stream xU}Pv##mSݽNL1Q+bh(pSqp88QST< elktRS$[3^?bNۙygٝy}p,0q\gæ'Ov,?1ht[+BOt7B8 CeH_8^XRPre**k QQ^d(68O".ŋU2\_ D) ITT-֕G%ܭ.*SD{%2i(VQ%Rb9F!WŢxEðe eq4N,KI-ŰD, KRT, ۋƶcNlc X(#baq)~9@0*X"8 s`|T"|EhuՅ"'r|v#Hyk?Dg'H*i!&ڐpÄT۸."zMSgB^ _]o[iN߿ e34.6҉ϡ9So9#¹ _Ca4eQA2(>STĈ?Dql ACYR ޸}]cNϩ&> }p-GaV&D|BplyAPf |rѹ9gLZIOEUZj{'ްX : E%ve`$+dB+/?2N1889.@W-`l մN[We $ 60Wjw)⒴uwԴF Vjh6--.屢 @W_eg2ؚj.-&lh:=( .ZîÉPZ_)S=yQ\ "/}xN!bą/i~|+St}z.bSmQgIR YE[U_5 ׬ݤ1BA"eA#Bg{py:);\=D~?Mye1ĻY< ǽ;oiUDh0ϻ93$okR@Jn[_tӦ>MzTeù)zo/z gPz:uP *ralEi,ô  b} `wA_ ۸-K?x|]k;/ﺉ9{!y' qP6o%R *%'DQnFf4j3gGv;RXN!Jx%jE N[H-E ;4,endstream endobj 300 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2400 >> stream x Pg7.쮊mwZV*VxU1ORHHx 䋀DD)ZSkX{wVojkwXk;wәNvyy?+!BF[*D9BDN7:x vѤccC a!"GCl,AJ$Jm~JmdR11fH=;Fb\*SJWtLN|QHWR3:tڂtNYFq,S;SI[5CjХKWɵrAYDIdr>g?TjNPmkA<].ս767M; VSj"F$Qk"#ubb MˉDQ@!"D&Da%)QJ|`buIP5#ơJVOilKy`p$\}Z Cz<ld&Pqh[?, hRm,1{Uv?Wkm2vAŤhYzbH*m]`}4ݩsW{ͯej2b<=9T88{A9S N@oiI kٮRg/lK Ӡv)OKrWhL Q:^='w͜#5AGfzbK^ܟpfLe8Qkk[ `*^D7 ɷ}(GTMh*~2V7Fc=po8lRhDM k5RRvT]<JkXZ h plƧ]JO>DG{q֪N)(D&vhy /-uC!)Oangx{a_ X_@ f01 q :R>c+} {LVr@ o F93!mKc:K]1sBpjր KBUQMp8,5Pe&\1{PɑhS_BVl9nLx;?;C]W 'I^HJDk ,[ߺYƕcfcy%k7"k \+F /et`ThnT> stream xViTS1{EDw[{,qҔw(j8A}@->FS+*ʇ򢼩uxj5Z@-PK~#D QoPoRC >To*]$ŋ uS@\ۧs;CI4=Π3Jt>>U}Z=S_5;t؄"ݎ|]V]m8sRxL0 z$P t#l! 2Ly퓜cMZH`jPs 1NrK[Ő#B0H`XDOR ~QZ.{ hNYBO H$=-B#/:v9`1) Tc!{'OVQJH ;ę\Bp 7ݞy ;HT'pi~> R蚌&g3?l&XY_}V ?{3ϟ3w,IVaETݎłi$3v)석^!ȉZ]ѵuǠyъ#pF+ |+ՁA~qT " YŨOa{`O z=%r۴}K9iPLuPo:3$g鲀)$щlhZjCCbT"vAtnu[\A>5]?%wF ͇a.)+?@/R^ՋߟvCwiօa&ؕhײMayYxҜEVUXD wPXuXOZݧڼ@UWa[\YPm"Ɯ9ɃWuusޖm] f^o<\_ʙd`re>O+Wc)<κzDmUn(ނd=D"JBGiݵu>.6ˮW8v. n+o\^0頻k.i$?,V 40;dC߆ XA"i`E&*/쾳u96c:=0#ē@);R3Ȝb&T\n5r6OC^ ($0՜9DQ U%ٮ?|eN&Kʯn]kw(c,\nTx-d:֏&rh46C9,Lx%UχNŁTMp CL<̠a^ niξbsKE-X NJSlWTԖTUp/%h_N%hng pj{B.L3vMo;tLc$8*)@C\[7͐Lg-m#8BRgD%|uG#h(*r(, Sï =tm)8`4e1ZffAu:TfGv)Mp:zEtD$ hK(ՊQ3Z^Ƶ ,aonGed؆27KW㶩Cca5,0nyi[N7>fl l(-yxG>=]͜}Pn-v[ <&jW MѵXXm ᵷJ[7s|ܺvJRGLgӺqr>4w"tyu]A_-U=UyXOZNm zs#,]d}@Q`4A٩/nVGr%M֐+^&cJo3R.\f֗=ءVЏ endstream endobj 302 0 obj << /Filter /FlateDecode /Length 2373 >> stream x[oxAN]EԷТi^E/i~vk;vҴ}I͇8c7NW$\-GHo׍Vh=,lbszxq^@؛r Ve tvU@뜴1샰!*E Mf8F db{AnօDTSU^zW/MT9о!4K"EC6V!<hOaÿ:otOG[y8~5ӝT 1yUaB48ߺlB}FA6uBL 04t'|B_ kP#E<O^#hW,5O:Z-N+hqښ~rλv-j^ WX9P4XDzI*U񸊸Ko,n(pZMm UU>3% a>7?-{%/y|ĂkwWu*cI?,?{dϋoDTGU罨⩨fTDs{n +s. U/x"F8]3n^zgK^n})oT~]`guWɬu\T.pd˻ 8hGd7]Zu8KbGWkVθ)ϺG]72D ,ץ5L8CļҋǺ0Y, |z/j3 KaEn#ɏ>ѧ8".&+2ʑE9&~9Zg}pLH dG?pmPghSYZ2`7jb**2׺iFae# e+G =M]; c*yEۢqޱmq:$3!ֵ5}'`믏ɺ60'nLSRlٌ|;3aW7ͬfHtѻ D.EHt )$CHWvĈiq31w?|]I~DGj˄=S}э{g\NIsKMal#opIgxé ׿oRZKdn()M}d0=m0]SP{rY1FGj)< Ce<9gHr7QΛ I4XDJaoD߁#O!vs;o8ۼC>gz'Ir㿻^h7qP?{$J(?&cdB tʹ,]/reendstream endobj 303 0 obj << /BitsPerComponent 8 /ColorSpace 218 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 304 0 obj << /Filter /FlateDecode /Length 7557 >> stream x=˒7rag֔ o@=h#$َ+ׇGCJpMR3B& ݵCjP@"/'ӛOaټ{v3Eݕ~FDS\/N09kw){rsOSJNx~[_7hx[_q8WL;K;{jqO6Er)* bXsIϳ ?pAi}  qWD?iU᭶C:4VM*"I1YYx~C<$BZ[4X ӼPTm8:Li6D 5VONlZt^+0k+| Xu!Xϟ?H3-Eh2msp>'a.w;7u^@#{QF Hϟ v?BR?A~2vwsf5͋g9|*( ot4x5f Ph@M!5|sI{dllM2|RQ!<+c @mᎤZ/5G.?G  JeCVF݌)BQK[;dI-[h?Æ|8W|2 :7g0Â.3, I61m᳅)wLYܝ@v~v ~8bzZ%TL߬,r p*Z+V0_9E-q锪Ds`hߌ*d8bg'3*'|(mF#@u12aLFV\ȶP% EV(xwzE5@o2RHxUy*(W.cfKKGЄ ։:3 J:gI2KaYv8I1L.7hCqIG;Q eFkZU- ڞ[XHtVz}RWku5l1u:ԓ)}8[`&cL3JѳA +.rv3LBG'(7]},ymw. O3DUw^V_Է?t~\0eC~ݍ#[mwJ. O`Gy~Qi?Ax]t1(6mMfQt|Q‚O]EA</o`uWuq|ǽ$g]b|wlɯ*뮾f }Z6`Yw,YNy[?c>|5>Uwm^wPo" A4 w(ڥq{lY}4ݪ"k:m~W/o.?:3ucᇣ%2Gn{˲Ŕ-ϋ}KleJg;wԸz ;w]~n,𾛪V܈'E,}@A5]hN)y2T˓jJ6c _)zhu'\tglD.4zbh:, ˥ | aK}مfTcC1!m/$KM-DԲ.KE"4 Rh:Pg`[=^* W Ho>*/A)T3unrXs0X4ɻĢlo 0"̟va`V;v0J)#3e>z` 1= u&~y}˞YnsG|6vFU+ 5_$)tsv]w48E EA9 Ao/ξ[},Cا?ymVf(,o.ѶBc,L\?l۪ >˺ Wuooѐ:BP&Һ'l*y<+Q^vs1sțWQuul À rG)ZdKU yÆ<BUl.1{H0$`3sK֭o3u*uH-vM] ph,+պ@=Wm/"l*2Q#Y|c钝;&glX6 Mn0c4l:6x# -X889&Xyr*eMlvN“iۦ; 0&^%mK J@лkd>"1|ees!+R1|'I A ،9y$s˞y(L_8Pjk͘ڢ67F3օjZv۠J ;ϯ:`t"ɦ-n4XوPﰿ8ƥShAJLr,R3"E{ldn}ƬB97m]I@ F`Y\"A[#YqJ8͙٭(nӵ)6`˯8$6L9 ˚G?.'5e)rML3`F ܳPgAI[Ql܄KUd{IipR={?[ Ď|OMZcTHȦNSFj0^0ÛO<¯ :rvCBwZн=郓G>2fcSj?Ѱ&פۿJ:LIǫ2.~ty]%.7G/} v$h3frU&l"xށ!Єw6jRAlU {?띚B|7L!m~ZI#b9 ;Hp(j*IzU{Gp]Fά>wIb+jK s`UMK t9o?0Hk l 7j԰k~CxLυw(C;7dy;Id(0&] ,N0–4䓚Es1|BH< mI!ڽ#Vr0Ub Dt=*c4D2&]FwL.MVXUm *:bS٧5\Tcf+-˓eGW,з.}"ijIbWlPL[qS:p?+4i5+ $įFY:.\|$!OMf]~R! ߭k r]$-{cxC&xelYÄuZ`&q[!* "D'S7`0AUN]MS+3 j{t" }9x{,d_VwgG#a|^ Lr=ϳ/c4g˪QOӹBMh[yx!)cz9N b25&urlCQ]|[_ǦOAmZ:$Lp_9fN֚nZOkW\,ؾX;{\wb(/Y;j<}Klҡh i:ߒ(%O?dPQˈ(nʻ*S@a7)@ &6i>>c ;]&mowvB[vYZݘekizfmTh\Τq5*o>R)(NhluIx,f G6Ҡ鴉4^vظtKǯ vo/<\)%ğa"cK,z$&߸z edq>y(fjCiZeuw_,6u6[_`BY#9F@ ,_Q:(ӘɝTPc =2T*I*hN83e0#QUR>|wn8@"lePŋ(q*v/]>sR+S|ʼ ^_Ӳ,"N /ybzߨl_`g Jl ?PH3d"dCRQ&R|k#Uk“ƿ )JԄ@`EN5s6fclzyvʳ]XGq9)5j^ Y".I1gjMo؛9v__҆궔OJvClKgBTMG;ڼKa\jP5M^,|„Ɖw'rh.k3da#(jQ"YAbH oɣ-p4v]M\o}Aq94*wM.X 'Qr3R97ppH(^me"c\h*>ȰQEmMk=#}-Bl(/^ :)| *:=ڌVi4ڲ|wװ/ }X'L?]Ⱥ?;Ё?YQkŨiNDY՘2a@inbX|0"1$%\12KV\O d_35l0T61F(ʙhƋ34_1QǕ;ɫpItO3ia ZD{ye.q,\LCE_귽ųKò;&éMtl԰)I@υ**d("!|4]_>ZQN2D|Zs{S7h ᯸|Jo̾vJߖ;er/ٺYK4:P%U$d '·{^tg Y9)\lQNI@g08o 8[auOibYܙ롫v\L8p)LxƢ¨]д^J[)USnCT;!Oiz`;F!ύe>=. .d:#]xq0y/.%ڶ6C^QH&حwC'5pdH*`!6<mƧ*$ɞiE)Uedx KGŲ/UF-:$j9ύa:xc8S2a4oҫaڀXc&om{fuZms"sHփD3 %f "GN XpXbhϷۭb4eOnRl8ZGL{/hնOsŸ$Ooh6kxnwozt9o+&7 +Q5g83S~|t7$9\~F#Nnt(Rx&2ٗb U 9*ynL[EԘc޿r:CG_0x`ith=l(?8g㋆mPg|Lsŕ a:^B'^nYod֦bĩnMRN v ?tai&ꪮǏOQ-ug@KElJώ؅{vB*`<9Yz >7qS|QŠ^.Ǻ[0.uy/DigS=5 ,&xxK '@endstream endobj 305 0 obj << /Type /XRef /Length 225 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 306 /ID [<5f8a45a448fe16a95ef340f9eb060e98><91c962191133316b418581bf0dc916da>] >> stream xcb&F~0 $8JP?j -_M#Ϡ񍦄Gg] džl"E A" d'$F[XDrkHY DHo @l <"@$s4X,dG e1 R|9di үDO $Hqb^ "MoAOvnDrH R<[& endstream endobj startxref 307412 %%EOF gstat/inst/doc/gstat.R0000644000176200001440000001466314127330245014376 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/CITATION0000644000176200001440000000167613777370515013537 0ustar liggesuserscitHeader("To cite package gstat in publications use:") citEntry(entry="Article", title = "Multivariable geostatistics in {S}: the gstat package", author = personList(as.person("Edzer J. Pebesma")), journal = "Computers & Geosciences", year = 2004, volume = 30, pages = "683-691", textVersion = paste("Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package.", "Computers & Geosciences, 30: 683-691.") ) citEntry(entry="Article", title = "Spatio-Temporal Interpolation using gstat", author = personList(as.person("Benedikt Gräler"), as.person("Edzer Pebesma"), as.person("Gerard Heuvelink")), year = 2016, journal = "The R Journal", volume = 8, issue = 1, pages = "204-218", url = "https://journal.r-project.org/archive/2016/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/external/0000755000176200001440000000000014053224431014171 5ustar liggesusersgstat/inst/external/ncp.dbf0000644000176200001440000000457013777370515015455 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/inst/external/no2.csv0000644000176200001440000003022514053224431015406 0ustar liggesusersstation_european_code,station_local_code,country_iso_code,country_name,station_name,station_start_date,station_end_date,type_of_station,station_ozone_classification,station_type_of_area,station_subcat_rural_back,street_type,station_longitude_deg,station_latitude_deg,station_altitude,station_city,lau_level1_code,lau_level2_code,lau_level2_name,EMEP_station,NO2 DENI063,DENI063,DE,Germany,Altes Land,1999-02-11,,Background,rural,rural,unknown,,9.685031,53.524181,3,,,3359028,Jork,no,13.10280590444669 DEBY109,DEBY109,DE,Germany,Andechs/Rothenfeld,2003-04-17,,Background,rural,rural,regional,,11.220172,47.968754,700,,,9188117,Andechs,no,7.135128196791652 DEBE056,DEBE056,DE,Germany,B Friedrichshagen,1994-02-01,,Background,rural,rural,near city,,13.64705,52.447697,35,,,11000000,"Berlin, Stadt",no,12.7990107440876 DEBE062,DEBE062,DE,Germany,"B Frohnau, Funkturm (3.5 m)",1996-02-01,,Background,rural,rural,near city,,13.296081,52.653269,50,BERLIN,,11000000,"Berlin, Stadt",no,11.830893889864175 DEBE032,DEBE032,DE,Germany,B Grunewald (3.5 m),1986-10-01,,Background,rural,rural,near city,,13.225144,52.473192,50,BERLIN,,11000000,"Berlin, Stadt",no,11.980110277555427 DEHE046,DEHE046,DE,Germany,Bad Arolsen,1999-05-11,,Background,rural,rural,unknown,,8.928172,51.430901,343,BAD AROLSEN/KOHLGRUND,,6635002,"Bad Arolsen, Stadt",no,8.935610662702798 DEBY122,DEBY122,DE,Germany,Bad Hindelang/Oberjoch,2010-06-21,,Background,rural,rural,regional,,10.404233,47.518013,1169,,,9780123,"Bad Hindelang, M",no,7.020689619637259 DESL019,DESL019,DE,Germany,Biringen,2003-02-01,,Background,rural,rural,regional,,6.552036,49.416885,339,,,10044114,Rehlingen-Siersburg,no,9.226796157053245 DENW081,DENW081,DE,Germany,Borken-Gemen,1998-09-11,,Background,rural,rural,near city,,6.874553,51.862,45,BORKEN,,5554012,"Borken, Stadt",no,18.70002344794623 DESH008,DESH008,DE,Germany,Bornhöved,1988-11-08,,Background,rural,rural,regional,,10.240596,54.09323,45,,10575785,,Ruhwinkel,no,9.159836327480242 DESN093,DESN093,DE,Germany,Brockau,2011-01-01,,Background,rural,rural,regional,,12.211111,50.608135,430,,145235120,,"Netzschkau, Stadt",no,8.54799427254379 DEST039,DEST039,DE,Germany,Brocken,1993-01-28,,Background,rural background,rural,remote,,10.618275,51.798626,1142,SCHIERKE,,,,no,3.5893264081276546 DEHE039,DEHE039,DE,Germany,Burg Herzberg (Grebenau),1983-05-01,,Background,rural,rural,unknown,,9.459403,50.770382,491,HERZBERG,,6632004,Breitenbach a. Herzberg,no,8.400254268233276 DEBY124,DEBY124,DE,Germany,Burgbernheim/Am Hessinggraben,2012-01-01,,Background,rural,rural,regional,,10.316582,49.444516,384,,,,,no,12.012725102002506 DESN076,DESN076,DE,Germany,Collmberg,1998-10-01,,Background,rural background,rural,remote,,13.009405,51.303772,313,COLLM,,14730330,Wermsdorf,no,8.636825016306878 DEST104,DEST104,DE,Germany,Domäne Bobbe,2009-12-17,,Background,rural,rural,unknown,,11.891525,51.83728,71,,,15082256,Osternienburger Land,no,9.354437456798943 DETH026,DETH026,DE,Germany,Dreißigacker,1991-07-01,,Background,rural,rural,regional,,10.3753,50.561752,450,DREIßIGACKER,160665050,,"Meiningen, Stadt",no,8.995248039863394 DEBW004,DEBW004,DE,Germany,Eggenstein,1976-09-01,,Background,rural,rural,near city,Unknown,8.40666,49.07655,109,,,8215102,Eggenstein-Leopoldshafen,no,20.493843279960355 DENI059,DENI059,DE,Germany,Elbmündung,1998-03-20,,Background,rural,rural,unknown,,8.80122,53.83017,3,,,3352011,"Cuxhaven, Stadt",no,11.104789649054135 DEUB046,DEUB046,DE,Germany,Forellenbach,2000-01-01,,Background,rural background,rural,remote,,13.420573,48.947611,858,,92729444,,Gdefr. Geb. (Lkr Freyung-Grafenau),no,4.333945989382777 DEHE028,DEHE028,DE,Germany,Fürth/Odenwald,1986-10-01,,Background,rural,rural,unknown,,8.81725,49.653465,484,FÜRTH/ODENWALD,,6431007,Fürth,no,8.120225166556141 DEMV026,DEMV026,DE,Germany,Garz,2013-01-01,,Background,rural,rural,unknown,,13.342138,54.323514,17,,,,,no,4.383776623560161 DETH040,DETH040,DE,Germany,Großer Eisenberg,1994-12-04,,Background,rural background,rural,remote,Wide street: L/H > 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.jpg0000644000176200001440000017505113777370515016226 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.shp0000644000176200001440000020355413777370515015517 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