plotmo/0000755000176200001440000000000015130145251011561 5ustar liggesusersplotmo/tests/0000755000176200001440000000000014563612461012736 5ustar liggesusersplotmo/tests/test.plotmo.R0000644000176200001440000000037512764100512015344 0ustar liggesusers# test.plotmo.R # This does a basic sanity test of plotmo. # For more comprehensive tests, see plotmo/inst/slowtests. library(plotmo) library(rpart) data(kyphosis) rpart.model <- rpart(Kyphosis~., data=kyphosis) plotmo(rpart.model, type="vec", trace=1) plotmo/tests/test.plotmo.Rout.save0000644000176200001440000000125214563612461017036 0ustar liggesusers > # test.plotmo.R > # This does a basic sanity test of plotmo. > # For more comprehensive tests, see plotmo/inst/slowtests. > library(plotmo) Loading required package: plotrix > library(rpart) > data(kyphosis) > rpart.model <- rpart(Kyphosis~., data=kyphosis) > plotmo(rpart.model, type="vec", trace=1) stats::predict(rpart.object, data.frame[3,3], type="vec") stats::fitted(object=rpart.object) fitted() was unsuccessful, will use predict() instead got model response from model.frame(Kyphosis~Age+Number+Start, data=call$data, na.action="na.pass") plotmo grid: Age Number Start 87 4 13 > plotmo/MD50000644000176200001440000002146115130145251012075 0ustar liggesusersbaa855568e74426b03e51ae4eea82892 *DESCRIPTION 9ba41c61bddd7e40d954567ff463b141 *NAMESPACE a5ec84c501b739b560ae64d3264600c2 *NEWS.md 1467cd99f814516a11538ec00e136c45 *R/as.char.R d6a7da076d299dcaa2edbe35fb81a026 *R/bx.R 9589326d4f3a274b329d915352034a1b *R/c50.R 4dcc6a18a5be035a1e4497dae7b7cedd *R/call.dots.R f0439166fbc6b21e9d4e640e1a75989e *R/caret.R 8313e46b929e7315b0f6ab1b29aa3675 *R/check.index.R a121377a2962c8a2b3b5ea2f9952a34c *R/do.par.R 3c28173aa59055555bf5ed7079e0f51b *R/dot.R 5a08d54148030b9ae3a10edad3ec4691 *R/dotlib.R 861fba8a34b68a1dd39a3e0f62ab7f14 *R/elegend.R fc659fa5f851f0df094c0bb5534ac32d *R/fitted.R bd52a69a45afb78dbb223c21fb71178d *R/gbm.R 272513f4ff639e72b385cad93ab315f6 *R/gbm.backcompat.R 5172a61a9d181a16591b6a93942b1aca *R/glmnet.R 50d71591ca9a7c399438fb94642b32b1 *R/grid.R 0c68215c3f8b5dc1372e1c3b42972d32 *R/grid.func.R 4e49674bccadc64a471abb5ace5c91e6 *R/lib.R 48179c86ac55d52efdb85ae534844741 *R/meta.R 18b191e6548aab28f7a4075d407862f1 *R/methods.R 004839b1e52cb50638840b2635bba62b *R/mlr.R d69ebbe9df32a922e8886d735e779092 *R/naken.R eabfd1a547ed2884045cec7779e2dc7c *R/partdep.R 964b5ce6e0729493ed20c043970ab59d *R/partykit.R e39718c602ae220a981100c028306674 *R/pint.R 0d312be618b142b4dc3708d9318e4881 *R/plot_gbm.R f2774ccdbdbb11d4b57d22f795826900 *R/plot_glmnet.R 9d562e0797425ec09fe2bdda6600cba2 *R/plotcum.R fdae81bfd8a98ed9298551fe3c56571e *R/plotmo.R df1786a88b8cd00b6b956c8258ca906c *R/plotqq.R 86f491633c494f22d6c65cd00d0bb170 *R/plotres.R 7fa451303357b01ce9207cd3df49e867 *R/plotresids.R 08885181eaa44b48330f54c2e77b898e *R/pre.R fe85abd429fee44f6d609c9309ed0aff *R/predict.R bdf8896a82a46f9c2097e337c0f4a217 *R/predict.nn.R a7cfa01bdb6be6069eeed7f427df35ee *R/printcall.R e19ea08aed52cfd4a2caf0bb11c749c9 *R/prolog.R 54dfa8ee78967bfd14bfe08adcef43cb *R/quantreg.R 11c642968a5174f4a2978df23753ec74 *R/residuals.R 3ce40ca65e3f40673602c7d4fac0fcb7 *R/response.R 9dd8f0a7e56fda7f21bb776f7486bb07 *R/rpart.R 4eb1463adfa036aa03bc9a20e69710b6 *R/singles.R 52a0a2ea4b38645148ca48de84a0567b *R/spread.labs.R 10b221ee9b9f19e92623e133b629efe1 *R/stop.if.dots.R d185816800d45ffd92def6c50d05ec43 *R/type.R ab47d88809f7314f4f82e2e6aef5f448 *R/w1.R 56f3cb29e97b0e21d67feaea1bdfb896 *R/xgboost.R 8239ac7e684324b49c66f3cb1d13ba2f *R/xy.R c10762bf6beb8ae594fe98e62f03566a *README.md 28ee4ac45e2d25b80da2885692fc764c *inst/README-figures/plotmo-randomForest.png bc9547d06efe15fe844a910dc1726dc9 *inst/README-figures/plotres-glmnet-gbm.png 48c0bceb3c05b9c442a6767c92d87dcb *inst/README-figures/plotres-randomForest.png 8ab9f7e2da731b548e17ec146cba9ba0 *inst/doc/index.html d813e70517a4d18022f7aee721171ab1 *inst/doc/modguide.pdf fad3f7e850be2f26957ba8de392f2ea6 *inst/doc/plotmo-notes.pdf 3b8d5d63c7d856d214b0c53bf4963319 *inst/doc/plotres-notes.pdf 9e35189fa10d4674f2284552fcbbfe64 *inst/slowtests/README.txt e397d716147bd83e7c5d84f8eef6a735 *inst/slowtests/darlingtonia.tab e64833b093ebe9ceed33758e0944d362 *inst/slowtests/linmod.R 42c25d22bd1996d34193935c602afef7 *inst/slowtests/linmod.methods.R 72d2ea19f32d670c448703471b187346 *inst/slowtests/make.README.R 69d13741915a025d2deae417733fa0be *inst/slowtests/make.README.bat 07d625248e3a7c2bcd017771e0b84eb4 *inst/slowtests/make.README.figs.R af4e7fcf61ad20030a33ba2a3a26ccc4 *inst/slowtests/make.bat 153b4a6a14d4b0dd4424e722577babd6 *inst/slowtests/makeclean.bat c5bf9446a0eeb97275ad7a7e61ed86b4 *inst/slowtests/modguide.model1.R 08fe3d6be516a61bf72da88502c184c2 *inst/slowtests/modguide.model2.R c2ddbbb20a0c65ef2ccd60de7523d92d *inst/slowtests/test.c50.R 69af490113c14840727e4f59bcb5ff30 *inst/slowtests/test.c50.Rout.save 74ec8262d3de605de39e382328a80153 *inst/slowtests/test.c50.bat 9deb8fde036cc52a51d15bedbc26fbb9 *inst/slowtests/test.caret.R ef3779e3c312cddc44174887bfa29a91 *inst/slowtests/test.caret.Rout.save efa64f0d0d28bc44191308ace8698589 *inst/slowtests/test.caret.bat 08890c43763882c3f9c60f1e4db81d23 *inst/slowtests/test.center.R 3e699701331939677dffc36627b59a74 *inst/slowtests/test.center.Rout.save 9339ceb3b7f9f2e9a844d558fdb32782 *inst/slowtests/test.center.bat edd4aa48ab07211045b03469d1feda3c *inst/slowtests/test.degree.R df0bc255b5f61d1a3ec4c6ce0367c38b *inst/slowtests/test.degree.Rout.save 8a920a93d9382febfa92d6422b8e7f36 *inst/slowtests/test.degree.bat 9bb9c0c749fa373398fde8d760651904 *inst/slowtests/test.dots.R cc1b24d974a892398459c4a74e924f74 *inst/slowtests/test.dots.Rout.save 48187c9359e97ef6cf1364bcba96347f *inst/slowtests/test.dots.bat 7306baea0c61d656121cd743183c8172 *inst/slowtests/test.epilog.R d8dd1aa1fdfd8a908d1d568d5646da4f *inst/slowtests/test.fac.R 4dbadc709933462c35a8d58497a74f08 *inst/slowtests/test.fac.Rout.save 58626d83049ed9729c59b8f212a09229 *inst/slowtests/test.fac.bat f699dac6d1f2e78dcc6f922ae4f7de42 *inst/slowtests/test.gbm.R 9909243a3417eeef74e3e09f013897a6 *inst/slowtests/test.gbm.Rout.save dc385fec5f97ac079c5a9f6f72e8e36c *inst/slowtests/test.gbm.bat 51b3736ee000e97783d80713a0a29b67 *inst/slowtests/test.glmnet.R d9faa1afcc8c4ef72255e003c419ee67 *inst/slowtests/test.glmnet.Rout.save 8bddc9f5438d3de9a76212cd1986bc76 *inst/slowtests/test.glmnet.bat 8496d462371e78d7e4d2f7999ab645d7 *inst/slowtests/test.glmnetUtils.R 2ae3176073faaf1856ee95027104e7b5 *inst/slowtests/test.glmnetUtils.Rout.save 0f7d18a4480a159b21480480ecbb8eba *inst/slowtests/test.glmnetUtils.bat 07a08d4c8cf37da28c0764ce116642ad *inst/slowtests/test.linmod.R d969b43841305639600194d577003e85 *inst/slowtests/test.linmod.Rout.save 7bb385a445718738179b4fd18ac4310c *inst/slowtests/test.linmod.bat c69bc15b4c2e8e30e3b01f7f0d78d850 *inst/slowtests/test.mlr.R c1070c9441d92c5afd345e16ba250725 *inst/slowtests/test.mlr.Rout.save 3d6c1296ef5a4b01b40e7d3e2aff3478 *inst/slowtests/test.mlr.bat da121b113f85eabc4b1b044d15c1f5e9 *inst/slowtests/test.modguide.R f8a90b64cca57032357382747319d752 *inst/slowtests/test.modguide.Rout.save 4379788987ae88f4f1b48fe0d383c198 *inst/slowtests/test.modguide.bat d665c3792390c0a1a96cbc8c2949111c *inst/slowtests/test.non.earth.R 7b3a24d4483c5fbb7883cbaef04a4cc8 *inst/slowtests/test.non.earth.Rout.save 38f179d8cea3d995c19a7935139fb7ea *inst/slowtests/test.non.earth.bat 664cae41f5a42939cd7c51c32b576ca4 *inst/slowtests/test.parsnip.R 18185d98609f1f9f62e0647b77c9c33b *inst/slowtests/test.parsnip.Rout.save bdbfe8216e83fbab7a98b165abc0fab0 *inst/slowtests/test.parsnip.bat cc523ea72083c545c0c27f1b0d999076 *inst/slowtests/test.partdep.R a78ad8dc7686256a8e637c5af98b29e3 *inst/slowtests/test.partdep.Rout.save ea228bd2c485800ed26442b3f1a5ab72 *inst/slowtests/test.partdep.bat e7b4ddac909472912a9e8328be7f94b4 *inst/slowtests/test.partykit.R 8d8a1aeac4f0d598a68896f932bdcb50 *inst/slowtests/test.partykit.Rout.save 9ae31be9dbf254a4b7c5e7aff4c4a02d *inst/slowtests/test.partykit.bat cb7d93b2b463bc75a6329ab2eed2ca7a *inst/slowtests/test.plotmo.R ea72303b9f6d991fe8528b13f3624770 *inst/slowtests/test.plotmo.Rout.save 666466cb642df4dede54601e130d3830 *inst/slowtests/test.plotmo.args.R 16280d6d059b012633a5e186ca94a1dd *inst/slowtests/test.plotmo.args.Rout.save 30381cff03917565c12aea890a40702f *inst/slowtests/test.plotmo.args.bat db441cbe828ad7835f9daae470bec78a *inst/slowtests/test.plotmo.bat 20d163931383b7ef67b6dffa9b4ff142 *inst/slowtests/test.plotmo.dots.R 9813c5977ad4893417e6521342f8ebb6 *inst/slowtests/test.plotmo.dots.Rout.save b2c8a1250432fc86d4502a7299fd0e3a *inst/slowtests/test.plotmo.dots.bat a2a01720e39bc85f95048c6a7190b8c1 *inst/slowtests/test.plotmo.x.R 2aa66c56e6ac567739e3f0a383c500de *inst/slowtests/test.plotmo.x.Rout.save ecfbe92c5274fec9d2ce4aba48196c9b *inst/slowtests/test.plotmo.x.bat c03367d07adb236f7ac4a98901666484 *inst/slowtests/test.plotmo3.R f22c406a8cee10828c05ca0801fc73ae *inst/slowtests/test.plotmo3.Rout.save 2141c7f6d7845f3b4adb1856076f5ad6 *inst/slowtests/test.plotmo3.bat 28c18027816c319271d47340b26fe665 *inst/slowtests/test.plotres.R 2938ffec638894b4d36e21acb0011918 *inst/slowtests/test.plotres.Rout.save ba62cd4b7a44f5ab5314d7ee98ed3954 *inst/slowtests/test.plotres.bat c1db5aad2002cf85a950ffc2fb5d68f1 *inst/slowtests/test.pre.R eb9f2cdf9b513ccc675f0d4546263c70 *inst/slowtests/test.pre.Rout.save 4e7e78a859eec0da14d08d3358704d76 *inst/slowtests/test.pre.bat 6e1bdddcf2d7ae571462722b81db918e *inst/slowtests/test.printcall.R 26d77e59a4b728dc3620a37bd3e53377 *inst/slowtests/test.printcall.Rout.save a5218a1d86898cf2853fcedc5d9c72e1 *inst/slowtests/test.printcall.bat e152b8519f616894608c34ee2b5c27a9 *inst/slowtests/test.prolog.R f9acb0955d92b42144d713bd758f1b76 *inst/slowtests/test.unusual.vars.R a5401a929d1526a0f0a82217773fdc2b *inst/slowtests/test.unusual.vars.Rout.save 1d30728a7dc5eabf37200720071f4c96 *inst/slowtests/test.unusual.vars.bat 97f4b1936b2d0a85e0d0e4c6e8717dfa *man/plot_gbm.Rd a6f6ed5990f2f359b77bed2e67b99b24 *man/plot_glmnet.Rd c89eb75643f8e92dbdb2bb25325db678 *man/plotmo.Rd 751ab8af1d939886b1a97fb7381b6991 *man/plotmo.misc.Rd 7dba1aaed70ac6223a85f5fca7e47cb5 *man/plotres.Rd 3ac7804a66f1f72eabc7d38afc3d4565 *tests/test.plotmo.R 04765eb169cdade58d3e4fb3a67893da *tests/test.plotmo.Rout.save plotmo/R/0000755000176200001440000000000015126336007011770 5ustar liggesusersplotmo/R/predict.nn.R0000644000176200001440000000725214663771205014175 0ustar liggesusers# predict.nn.R: plotmo support for the neuralnet package # Note that the neuralnet package is not the V&R nnet package. # # The neuralnet function doesn't save the standard terms etc., so we # have to do things in a slightly non-standard way below. # # The rep argument must be "mean" (return mean of predicted value over all # reps) or "best" (return predicted value on best rep) or a column index # (return predicted value from the given rep), or an integer vector # (return mean of predicted value over the given reps) # # Some of the error tests below may be duplicated in neuralnet::compute, # but we do them here just to be sure and to avoid obscure failures later, # and also to detect if internal implementation of nn objects changes. # # TODO error handling in this function hasn't been completely tested predict.nn <- function(object, newdata=NULL, rep="mean", trace=FALSE, ...) { stop.if.dots(...) # "..." is required for compat with the # generic predict, although we don't use it stopifnot(is.numeric(trace) || is.logical(trace), length(trace) == 1) if(is.null(newdata)) newdata <- object$covariate stopifnot(length(dim(newdata)) == 2) if(NCOL(newdata) != NCOL(object$covariate)) stop0("newdata has ", NCOL(newdata), " columns but original data had ", NCOL(object$covariate), " columns") varnames <- object$model.list$variables if(!is.null(colnames(newdata)) && !is.null(varnames)) { stopifnot(length(colnames(newdata)) == length(varnames)) if(any(colnames(newdata) != varnames)) warning0("colnames(newdata) do not match the ", "colnames of the original data\n", " colnames(newdata): ", paste.trunc(colnames(newdata)), "\n", " colnames(orginal): ", paste.trunc(varnames)) } check.df.numeric.or.logical(newdata) result.matrix <- object$result.matrix if(is.null(result.matrix)) { # following happens if neuralnet() gave warning "algorithm did not converge" stop0("predict.nn: object does not have a result.matrix (did neuralnet converge?)") } stopifnot(length(dim(result.matrix)) == 2) stopifnot(is.character(rep) || is.numeric(rep)) reps <- rep if(is.character(rep)) switch(match.choices(rep[1], c("best", "mean"), "rep"), best = { reps <- which.min(result.matrix["error",]) if(trace) cat("predict.nn: rep = \"best\" is rep =", reps, "\n") }, mean = { reps <- seq_len(NCOL(result.matrix)) if(trace) cat("predict.nn: rep = \"mean\" will take the mean of", length(reps), "reps\n") }) stopifnot(!is.null(reps)) mean.yhat <- rep_len(0, NROW(newdata)) for(rep in reps) { stopifnot(length(rep) == 1, floor(rep) == rep, rep >= 1, rep <= NCOL(result.matrix)) yhat <- neuralnet::compute(x=object, covariate=newdata, rep=rep)$net.result stopifnot(NROW(yhat) == NROW(newdata)) mean.yhat <- mean.yhat + yhat } mean.yhat / length(reps) } # plotmo method for predict.nn # this wrapper is used merely to pass trace.call.global to predict.nn plotmo.predict.nn <- function(object, newdata, type, ..., TRACE, FUNC=NULL) { # the following invokes predict.nn plotmo.predict.default(object, newdata, # type arg is unused trace=trace.call.global >= 1, ..., TRACE=TRACE) } plotmo/R/c50.R0000644000176200001440000000323714663771205012517 0ustar liggesusers# c50.R: plotmo functions for model objects from the C50 package plotmo.prolog.C5.0 <- function(object, object.name, trace, ...) # invoked when plotmo starts { # "imp" is a vector of variable indices (column numbers in x), most # important vars first, no variables with relative.influence < 1%. imp <- order.C5.0.vars.on.importance(object) attr(object, "plotmo.importance") <- imp if(trace > 0) cat0("importance: ", paste.trunc(object$predictors[imp], maxlen=120), "\n") object } order.C5.0.vars.on.importance <- function(object) { imp <- C50::C5imp(object) stopifnot(is.data.frame(imp) && all(dim(imp) == c(object$dims[2], 1))) imp <- imp[imp >= 1, , drop=FALSE] stopifnot(length(imp) > 0) imp <- match(rownames(imp), object$predictors) stopifnot(!anyNA(imp)) imp } plotmo.singles.C5.0 <- function(object, x, nresponse, trace, all1, ...) { if(all1) return(1:length(object$predictors)) importance <- attr(object, "plotmo.importance") stopifnot(!is.null(importance)) # uninitialized? # indices of vars with importance >= 1%, max of 10 variables # (10 becauses plotmo.pairs returns 6, total is 16, therefore 4x4 grid) importance[1: min(10, length(importance))] } plotmo.pairs.C5.0 <- function(object, ...) { importance <- attr(object, "plotmo.importance") stopifnot(!is.null(importance)) # uninitialized? # choose npairs so a total of no more than 16 plots # npairs=5 gives 10 pairplots, npairs=4 gives 6 pairplots npairs <- if(length(importance) <= 6) 5 else 4 form.pairs(importance[1: min(npairs, length(importance))]) } plotmo/R/partykit.R0000644000176200001440000002075214663771205014000 0ustar liggesusers# partykit.R: hackery for plotmo to support the partykit package plotmo.prolog.party <- function(object, object.name, trace, ...) # called when plotmo starts { check.mob.object(object) # Attach plotmo.importance (a character vector) to the model. object <- attach.party.plotmo.importance(object, trace) # Following is necessary because we will shortly change the class of the object # (and therefore getCall.party won't work, we must rely on getCall.default). # We need the call to get the data used to build the model. (We can't use # object$data because that may contain "variable names" like "log(lstat)".) object$call <- getCall(object) # The meaning of "[[" is redefined for party objects i.e. the partykit # package defines "[[.party". Since in the plotmo code we need [[ to do # things like object[["x"]], we change the class of the object here, so # [[ has its standard meaning for the object while we are in plotmo. trace2(trace, "changing class of %s from %s to \"party_plotmo\" for standard \"[[\"\n", object.name, quote.with.c(class(object))) original.class <- class(object) # save for plotmo.predict.party_plotmo class(object) <- "party_plotmo" object$original.class <- original.class object } plotmo.predict.party_plotmo <- function(object, newdata, type, ..., TRACE) { stopifnot(is.character(object$original.class)) class(object) <- object$original.class # suppress warnings: # Warning: 'newdata' had 2 rows but variables found have 297 rows # Warning in rval[ix[[i]]] <- preds[[i]] : number of items to replace is not a multiple of replacement length on.exit(options(warn=old.warn)) options(warn=-1) old.warn <- getOption("warn") predict <- plotmo.predict(object, newdata, type=type, ..., TRACE=TRACE) predict } # attach plotmo.importance (a character vector) to the model attach.party.plotmo.importance <- function(object, trace) { varimp <- try(varimp(object), silent=TRUE) if(is.try.err(varimp)) { # only some party objects support varimp # the variable(s) before the | in the formula varnames <- colnames(attr(object$info$terms$response, "factors")) # append variables actually used in the tree, in order of importance varnames <- c(varnames, names(varimp_party(object))) } else varnames <- names(sort(varimp, decreasing=TRUE)) varnames.original <- varnames for(i in seq_along(varnames)) varnames[i] <- naken.collapse(varnames[i]) # e.g. log(lstat) becomes lstat if(trace >= 1) cat("variable importance:", varnames, "\n") attr(object, "plotmo.importance") <- varnames object } # Like varimp.constparty but works for all party trees, including mob trees. # Splits that affect more observations get more weight. # Splits near the root get slightly more weight (lower depth). # (This is to disambiguate vars that have equal importance otherwise.) varimp_party <- function(object) { init.varimp <- function(node, varimp, depth) { # update varimp for tree starting at node by walking the tree varid <- node$split$varid if(!is.null(varid)) { check.index(varid, "varid", varimp) # paranoia nobs <- if(!is.null(node$info$nobs)) node$info$nobs else 1 varimp[varid] <- varimp[varid] + nobs - .0001 * depth } knodes <- partykit::kids_node(node) for(node in knodes) if(!is.null(node)) varimp <- init.varimp(node, varimp, depth+1) # recurse varimp } #--- varimp_party starts here varnames <- colnames(object$data) varimp <- repl(0, length(varnames)) names(varimp) <- varnames varimp <- init.varimp(object$node, varimp, depth=0) sort(varimp[varimp != 0], decreasing=TRUE) # discard vars not in tree, sort } plotmo.singles.party_plotmo <- function(object, x, nresponse, trace, all1, ...) { all <- seq_along(colnames(x)) if(all1) return(all) varnames <- attr(object, "plotmo.importance") stopifnot(!is.null(varnames)) i <- match(varnames, colnames(x)) ina <- which(is.na(i)) # sanity check if(length(ina)) { warnf( "could not find \"%s\" in %s\nWorkaround: use all1=TRUE to plot all variables", varnames[ina[1]], quote.with.c(colnames(x))) i <- i[!is.na(i)] } if(length(i) == 0) { warnf("could not estimate variable importance") i <- seq_along(length(colnames(x))) # something went wrong, use all vars } # indices of important variables, max of 10 variables # (10 becauses plotmo.pairs returns 6, total is 16, therefore 4x4 grid) i[1: min(10, length(i))] } plotmo.pairs.party_plotmo <- function(object, x, nresponse, trace, all2, ...) { singles <- plotmo.singles(object, x, nresponse, trace, all1=FALSE, ...) # choose npairs so a total of no more than 16 plots # npairs=5 gives 10 pairplots, npairs=4 gives 6 pairplots npairs <- if(length(singles) <= 6) 5 else 4 form.pairs(singles[1: min(npairs, length(singles))]) } # Check the mob object formula and issue a work-around message when # the formula won't work for predictions with new data. # This prevents err msg: 'newdata' had 1 row but variables found have 167 rows check.mob.object <- function(object) { call.fit <- getCall(object)$fit # was a fit func passed to the model building func? if(is.null(call.fit)) return() # it's a mob object func <- eval(call.fit) stopifnot(inherits(func, "function")) func <- deparse(func, width.cutoff=500) # Is there a "(" followed by "~" followed by a lone "x," in the function body? # Or a "(" followed by "~" followed by "x - 1,". regex1 <- "\\(.*\\~.*[^a-zA-Z0-9_\\.]x," regex2 <- "\\(.*\\~.*x \\- 1," regex <- paste0(regex1, "|", regex2) grepl <- grepl(regex, func) if(any(grepl)) { # Issue the following message (details will vary depending on the fit func): # # The following formula in the mob fit function is not supported by plotmo: # # glm(y ~ 0 + x, family = binomial, start = start, ...) # # Possible workaround: Replace the fit function with: # # function (y, x, start = NULL, weights = NULL, offset = NULL, ...) # { # glm(as.formula(paste("y ~ ", paste(colnames(x)[-1], collapse="+"))), # family = binomial, start = start, ...) # } # # Error: The formula in the mob fit function is not supported by plotmo (see above) printf("\nThe following formula in the mob fit function is not supported by plotmo:\n\n") ifunc <- which(grepl)[1] cat(func[ifunc]) regex <- "\\([^,]+," func[ifunc] <- sub(regex, "(as.formula(paste(\"y ~ \", paste(colnames(x)[-1], collapse=\"+\"))),\n data=x,", func[ifunc]) printf("\n\nPossible workaround: Replace the fit function with:\n\n") printf(" %s <- ", as.character(call.fit)) for(i in 1:length(func)) printf("%s\n ", func[i]) printf("\n") stop0("The formula in the mob fit function is not supported by plotmo (see above)\n", " This is because predict.mob often fails with newdata and type=\"response\"\n", " e.g. example(mob); predict(pid_tree, newdata=PimaIndiansDiabetes[1:3,], type=\"response\")") } } # cforest objects plotmo.prolog.parties <- function(object, object.name, trace, ...) # called when plotmo starts { attr(object, "plotmo.importance") <- order.parties.vars.on.importance(object, trace) # a char vector object } order.parties.vars.on.importance <- function(object, trace) # a char vector { varimp <- try(varimp(object), silent=TRUE) varnames <- if(is.try.err(varimp)) colnames(object$data)[-1] # -1 to drop response TODO is this reliable? else names(sort(varimp, decreasing=TRUE)) if(trace >= 1) cat("variable importance:", varnames, "\n") varnames } plotmo.singles.parties <- function(object, x, nresponse, trace, all1, ...) { plotmo.singles.party_plotmo(object, x, nresponse, trace, all1, ...) } plotmo.pairs.parties <- function(object, x, nresponse, trace, all2, ...) { plotmo.pairs.party_plotmo(object, x, nresponse, trace, all2, ...) } plotmo/R/partdep.R0000644000176200001440000001133514663771205013565 0ustar liggesusers# partdep.R: functions for partial dependence plots # get the dataframe of variables we integrate over for partdeps get.partdep.x <- function(pmethod, x, y, n.apartdep, grid.levels, pred.names) { if(pmethod != "partdep" && pmethod != "apartdep") return(NA) partdep.x <- if(pmethod == "partdep" || nrow(x) <= n.apartdep) x else { # apartdep stopifnot(nrow(x) == NROW(y)) # order on y with sample_int randomly break ties in y index <- order(as.numeric(y), sample.int(NROW(y))) # select n.apartdep equally spaced rows index <- index[seq.int(1, nrow(x), length.out=n.apartdep)] x[index, , drop=FALSE] } if(!is.null(grid.levels)) { # grid.levels argument was specified? check.grid.levels.arg(x, grid.levels, pred.names) for(ipred in seq_len(ncol(x))) { grid.val <- get.fixed.gridval.for.partdep(x[[ipred]], ipred, pred.names[ipred], grid.levels) if(!is.na(grid.val)) partdep.x[[ipred]] <- grid.val } } partdep.x } check.grid.class <- function(x1, xgrid, predname) # paranoia { class.x1 <- class(x1)[1] class.xgrid <- class(xgrid)[1] # the integer check is necessary because plotmo converts # integer predictors to a numeric range if(!(class.x1 == class.xgrid || (class.x1 == "integer" && class.xgrid == "numeric"))) { cat("\n") stopf("class(%s) == \"%s\" but class(xgrid) == \"%s\"", predname, class.x1, class.xgrid) } } degree1.partdep.yhat <- function(object, type, nresponse, pmethod, inverse.func, trace, # plotmo args partdep.x, xframe, ipred, pred.names, resp.levs, # internal args ...) { trace0(trace, "calculating %s for %s%s", pmethod, pred.names[ipred], if(trace >= 2) "\n" else " ") xgrid <- xframe[[ipred]] # grid of values for predictor nxgrid <- length(xgrid) stopifnot(nxgrid >= 1) check.grid.class(partdep.x[[ipred]], xgrid, pred.names[ipred]) # For efficiency, predict for all values in xgrid at once. # This reduces the number of calls to plotmo_predict, but requires more memory. expanded.partdep.x <- partdep.x[rep(1:nrow(partdep.x), times=nxgrid), , drop=FALSE] expanded.partdep.x[[ipred]] <- rep(xgrid, each=nrow(partdep.x)) # gets recycled # plotmo_predict always returns a numeric 1 x n matrix yhats <- plotmo_predict(object, expanded.partdep.x, nresponse, type, resp.levs, trace, inverse.func, ...)$yhat trace0(trace, "\n") colMeans(matrix(yhats, ncol=nxgrid), na.rm=TRUE) } degree2.partdep.yhat <- function(object, type, nresponse, pmethod, inverse.func, trace, # plotmo args partdep.x, x1grid, ipred1, x2grid, ipred2, # internal args pred.names, resp.levs, ...) { trace0(trace, "calculating %s for %s:%s %s", pmethod, pred.names[ipred1], pred.names[ipred2], if(trace >= 0 && trace < 2) "0" else if(trace >= 2) "\n") n1 <- length(x1grid) stopifnot(n1 >= 1) check.grid.class(partdep.x[[ipred1]], x1grid, pred.names[ipred1]) n2 <- length(x2grid) stopifnot(n2 >= 1) check.grid.class(partdep.x[[ipred2]], x2grid, pred.names[ipred2]) # For efficiency, predict for all values of xgrid2 for each value of xgrid1. # This reduces the number of calls to plotmo_predict, but requires more memory. yhat <- matrix(0., nrow=n1, ncol=n2) # will store predictions in here pacifier.i <- n1 / 10 # for pacifier pacifier.digit <- -1 expanded.partdep.x <- partdep.x[rep(1:nrow(partdep.x), times=n2), , drop=FALSE] for(i in 1:n1) { while(pacifier.i < i) { # print pacifier if(trace >= 0 && pacifier.digit != floor(10 * pacifier.i / n1)) { pacifier.digit <- floor(10 * pacifier.i / n1) cat(pacifier.digit) } pacifier.i <- pacifier.i + n1 / 10 } expanded.partdep.x[[ipred1]] <- x1grid[i] # whole columm all the same value expanded.partdep.x[[ipred2]] <- rep(x2grid, each=nrow(partdep.x)) # gets recycled # plotmo_predict always returns a numeric 1 x n matrix yhats <- plotmo_predict(object, expanded.partdep.x, nresponse, type, resp.levs, trace, inverse.func, ...)$yhat yhats <- matrix(yhats, ncol=n2) yhat[i,] <- colMeans(yhats, na.rm=TRUE) if(trace > 0) trace <- 0 # only show the first call to plotmo_predict } trace0(trace, "0\n") # print final 0 for pacifier matrix(yhat, nrow=n1 * n2, ncol=1) } plotmo/R/lib.R0000644000176200001440000013044615126336007012671 0ustar liggesusers# lib.R: miscellaneous functions for plotmo and related packages # functions in this file are in alphabetical order any1 <- function(x) { any(x != 0) # like any but no warning if x not logical } cat0 <- function(...) # cat with no added spaces { cat(..., sep="") } check <- function(object, object.name, check.name, check.func, na.ok=FALSE) { any <- check.func(object) if(na.ok) any <- any[!is.na(any)] else { which.na <- which(is.na(any)) if(length(which.na)) { stopf("NA in %s\n %s[%d] is %g", object.name, object.name, which.na[1], object[which.na[1]]) } } if(any(any)) { which <- which(check.func(object)) stopifnot(length(which) > 0) stopf("%s in %s\n %s[%d] is %g", check.name, object.name, object.name, which[1], object[which[1]]) } } # TODO commented out the following because it is too slow for big data # (the as.character is very slow) # # # The args argument is assumed to be a list of arguments for do.call. # # An argument in args will be an unforced promise if it couldn't be # # evaluated earlier e.g. if call.plot was invoked with arg=nonesuch. # # If an argument is such an unforced promise, issue an error message now # # to prevent very confusing error messages later. To do this, we have to # # determine if the arg is a promise, which we do with the if statement # # below. # # This makes me nervous, because the R language manual says "There is # # generally no way in R code to check whether an object is a promise or not". # # check.do.call.args <- function(func, args, fname) # { # stopifnot(is.list(args)) # for(i in seq_along(args)) { # if(length(args[i]) == 1 && !is.na(args[i]) && # substr(as.character(args[i]), 1, 2) == "..") { # printf("\n") # s <- paste0(strwrap(list.as.char(args), # width=getOption("width"), exdent=7), collapse="\n") # stop0("cannot evaluate ", quotify(names(args)[i], "'"), # " in\n ", fname, "(", s, ")") # } # } # } # mostly for checking user arguments (so error wording is for that) # but also occasionally used for other sanity checking check.boolean <- function(b) # b==0 or b==1 is also ok { if(length(b) != 1) stop0("the ", short.deparse(substitute(b), "given"), " argument is not FALSE, TRUE, 0, or 1") if(!(is.logical(b) || is.numeric(b)) || is.na(b) || !(b == 0 || b == 1)) stop0(short.deparse(substitute(b), "the argument"), "=", as.char(b), " but it should be FALSE, TRUE, 0, or 1") b != 0 # convert to logical } is.boolean <- function(b) # b==NA or b==0 or b==1 { length(b) == 1 && (is.logical(b) || is.numeric(b)) && (is.na(b) || b == 0 || b == 1) } check.classname <- function(object, substituted.object, allowed.classnames) { expected.classname <- quotify(allowed.classnames) if(length(allowed.classnames) > 1) expected.classname <- sprint("one of\n%s", expected.classname) if(is.null(object)) stopf("object is NULL but expected an object of class of %s", expected.classname) if(!inherits(object, allowed.classnames)) { stopf("the class of %s is \"%s\" but expected the class to be %s", quotify(paste.trunc(substituted.object, maxlen=30)), class(object)[1], expected.classname) } } # adjust name so e.g. error message is "argument is NULL" not "NULL is NULL" tweak.name <- function(name, quote=TRUE) { quoted.name <- quotify(name, quote="'") if(name %in% c("NULL", "NA") || (substr(name[1], 1, 1) %in% c("+", "-")) || grepl("[0-9]", substr(name[1], 1, 1))) { quoted.name <- name <- "argument" } if(quote) quoted.name else name } check.integer.scalar <- function(object, min=NA, max=NA, null.ok=FALSE, na.ok=FALSE, logical.ok=TRUE, char.ok=FALSE, object.name=short.deparse(substitute(object))) { stop.msg <- function(s) { s.null <- if(null.ok) ", or NULL" else "" s.na <- if(na.ok) ", or NA" else "" s.logical <- if(logical.ok) ", or TRUE or FALSE" else "" s.char <- if(char.ok) ", or a string" else "" stop0(s, " but it should be an integer", s.null, s.na, s.logical, s.char) } if(is.character(object)) { if(!char.ok || length(object) != 1) stop.msg(paste0(tweak.name(object.name), " is a string")) } else { check.numeric.scalar(object, min, max, null.ok, na.ok, logical.ok, char.ok.msg=char.ok, object.name=object.name) if(!is.null(object) && !is.na(object) && object != floor(object)) stop.msg(paste0(tweak.name(object.name, quote=FALSE), "=", object[1])) } object } check.level.arg <- function(level, zero.ok) { if(anyNA(level) || is.null(level)) # treat NA and NULL as 0 level <- 0 check.numeric.scalar(level) if(!((zero.ok && level == 0) || level >= .5 || level < 1)) { stop0("level=", level, " but it should be ", if(zero.ok) "zero or " else "", "between 0.5 and 1") } level } check.no.na.in.mat <- function(object) { if(anyNA(object)) { # quick initial check # detailed check for detailed error message for(icol in seq_along(ncol(object))) { check.name <- if(!is.null(colnames(object))) colnames(object)[icol] else sprint("%s[,%d]", short.deparse(substitute(object), "matrix"), icol) check(object[,icol], check.name, "NA", is.na, na.ok=FALSE) } } } # x can be a data.frame or matrix check.df.numeric.or.logical <- function(x, xname=trunc.deparse(substitute(x))) { stopifnot(!is.null(x), length(dim(x)) == 2) for(icol in seq_len(NCOL(x))) { if(!is.numeric(x[,icol]) && !is.logical(x[,icol])) stopf("the class of %s is \"%s\" (expected numeric or logical)", colname(x, icol, xname), class(x[,icol])) is.na <- is.na(x[,icol]) if(any(is.na)) stopf("%s[%g] is NA", colname(x, icol, xname), which(is.na)[1]) is.infinite <- !is.finite(x[,icol]) if(any(is.infinite)) stopf("%s[%g] is Inf", colname(x, icol, xname), which(is.infinite)[1]) } } check.numeric.scalar <- function(object, min=NA, max=NA, null.ok=FALSE, na.ok=FALSE, logical.ok=FALSE, char.ok.msg=FALSE, # only affects error msg object.name=short.deparse(substitute(object))) { s.logical <- if(logical.ok) ", or TRUE or FALSE" else "" if(na.ok) logical.ok <- TRUE # needed because NA is a logical any.na <- !is.null(object) && # following needed because anyNA gives error on some objects (is.numeric(object) || is.logical(object) || is.list(object) || is.character(object)) && anyNA(object) if(is.null(object)) { if(!null.ok) stop0(tweak.name(object.name), " is NULL") } else if(any.na && !na.ok) stop0(tweak.name(object.name), " is NA") else if(!is.numeric(object) && !(is.logical(object) && logical.ok)) { s.na <- if(na.ok) ", or NA" else "" s.null <- if(null.ok) ", or NULL" else "" s.char <- if(char.ok.msg) ", or a string" else "" stopf("%s must be numeric%s%s%s%s (whereas its current class is %s)", tweak.name(object.name), s.null, s.na, s.char, s.logical, class.as.char(object, quotify=TRUE)) } else if(length(object) != 1) stopf("the length of %s must be 1 (whereas its current length is %d)", tweak.name(object.name), length(object)) if(!is.null(object) && !any.na) { if(!is.na(min) && !is.na(max) && (object < min || object > max)) { stop0(tweak.name(object.name, quote=FALSE), "=", object, " but it should be between ", min, " and ", max) } if(!is.na(min) && object < min) { stop0(tweak.name(object.name, quote=FALSE), "=", object, " but it should be at least ", min) } if(!is.na(max) && object > max) { stop0(tweak.name(object.name, quote=FALSE), "=", object, " but it should not be greater than ", max) } } object } # We allow 20% of x to be nonpositive, useful if the response is essentially # positive, but the predicted response has a few nonpositive values at the extremes. # Needed for example if we will later take log(x) or sqrt(x). check.that.most.are.positive <- function(x, xname, user.arg, non.positive.msg, frac.allowed=.2) { check.numeric.scalar(frac.allowed) stopifnot(frac.allowed >= 0, frac.allowed <= 1) nonpos <- x <= 0 if(sum(nonpos, na.rm=TRUE) > frac.allowed * length(x)) { # more than frac.allowed nonpos? ifirst <- which(nonpos)[1] stop0(sprint( "%s is not allowed because too many %ss are %s\n", user.arg, unquote(xname), non.positive.msg), sprint( " %.2g%% are %s (%g%% is allowed)\n", 100 * sum(nonpos) / length(x), non.positive.msg, 100 * frac.allowed), sprint(" e.g. %s[%d] is %g", unquote(xname), ifirst, x[ifirst])) } } check.vec <- function(object, object.name, expected.len=NA, logical.ok=TRUE, na.ok=FALSE) { if(!(NROW(object) == 1 || NCOL(object) == 1)) stop0(tweak.name(object.name), " is not a vector\n ", "It has dimensions ", NROW(object), " by ", NCOL(object)) if(!((logical.ok && is.logical(object)) || is.numeric(object))) stop0(tweak.name(object.name), " is not numeric") if(!is.na(expected.len) && length(object) != expected.len) stop0(tweak.name(object.name), " has the wrong length ", length(object), ", expected ", expected.len) if(na.ok) object[is.na(object)] <- 1 # prevent check is.finite from complaining else check(object, object.name, "NA", is.na) check(object, object.name, "non-finite value", function(object) {!is.finite(object)}) } cleantry <- function(err) # clean up a try.err (remove "Error: " etc.) { stopifnot(is.try.err(err)) attributes(err) <- NULL err <- gsub("^[^:]*: *", "", err) # remove "Error: " (actually everything up to the first colon) err <- gsub("\n", " ", err, fixed=TRUE) # remove newlines err <- gsub(" +", " ", err) # multiple spaces to single spaces gsub(" $", "", err) # remove trailing space } # returns the column name, if that is not possible then something like x[,1] colname <- function(object, i, object.name=trunc.deparse(substitute(object))) { check.numeric.scalar(i) check.index(i, object.name, object, is.col.index=TRUE, allow.negatives=FALSE) colnames <- safe.colnames(object) if(!is.null(colnames)) colnames[i] else if(NCOL(object) > 1) sprint("%s[,%g]", object.name, i) else sprint(object.name) } # if trace>0 or the func fails, then print the call to func do.call.trace <- function(func, args, fname=short.deparse(deparse(func), "FUNC"), trace=0) { stopifnot(is.logical(trace) || is.numeric(trace), length(trace) == 1) # TODO commented out the following because it is too slow for big data # check.do.call.args(func, args, fname) trace <- as.numeric(trace) if(trace > 0) printf.wrap("%s(%s)\n", fname, list.as.char(args)) try <- try(do.call(what=func, args=args), silent=TRUE) if(is.try.err(try)) { if(trace == 0) # didn't print call above? then print it now printf.wrap("\n%s(%s)\n\n", fname, list.as.char(args)) else if(trace >= 2) # TODO is this best? printf("\n") # Re-call func so user can do a traceback within the function. Note that # if do.call.trace was called with try, this will be caught by that try. # TODO is there a better way to achieve this, perhaps using tryCatch # this could be confusing if func has side effects (unlikely) do.call(what=func, args=args) # should never get here stop0("second do.call(", fname, ", ...) did not give the expected error: ", try[1]) } invisible(try) # TODO is invisible necessary? } # identical to base::eval() but has trace and expr.name arguments eval.trace <- function( expr, envir = parent.frame(), enclos = if(is.list(envir) || is.pairlist(envir)) parent.frame() else baseenv(), trace = 0, expr.name = NULL) { stopifnot(is.environment(envir)) stopifnot(is.environment(enclos)) if(trace >= 2) printf("eval(%s, %s)\n", if(is.null(expr.name)) trunc.deparse(substitute(expr)) else expr.name, environment.as.char(envir)) eval(expr, envir, enclos) } exp10 <- function(x) # e.g. exp10(-3) = 1e-3 { exp(x * log(10)) } # This function is used for checking both xlim and ylim. # This checks that lim is is a 2 element numeric vector. # Also, if xlim[1] == xlim[2], then plot() issues a confusing message. # We don't want that, so use this function to make sure xlim[2] # is different to xlim[1]. fix.lim <- function(lim) { if(!is.null(lim) && !inherits(lim, "Date")) { stopifnot(is.numeric(lim), length(lim) == 2) # constants below are arbitrary small <- max(1e-6, .01 * abs(lim[1] - lim[2])) if(abs(lim[2] - lim[1]) < small) # illegal lim? lim <- c(lim[1] - small, lim[2] + small) } lim } # Ensure all columns of x have column names. Won't overwrite existing column names. gen.colnames <- function(x, prefix="x", alt.prefix=prefix, trace=0) { if(NCOL(x) == 0) return(NULL) # If prefix is long and has characters like ( or [ then use the # alternate prefix. This is sometimes necessary when prefix is # generated using deparse and the arg is something like # "cbind(trees$Volume,trees$Volume+100)" if(any(nchar(prefix) > 30) && grepany("[([,]", prefix)) { trace2(trace, "using alt.prefix \"%s\" instead of prefix \"%s\"\n", alt.prefix, prefix) prefix <- alt.prefix } stopifnot(length(prefix) <= NCOL(x)) prefix <- substr(prefix, 1, 60) new.colnames <- if(NCOL(x) == length(prefix)) prefix else if(grepany("\\[", prefix)) new.colnames <- paste0(prefix, "[", seq_len(NCOL(x)), "]") else new.colnames <- paste0(prefix, seq_len(NCOL(x))) colnames <- org.colnames <- colnames(x) if(is.null(colnames)) colnames <- new.colnames else { missing <- !nzchar(colnames) if(any(missing)) colnames[missing] <- new.colnames[missing] } if(length(unique(colnames)) != length(colnames)) stop0("Duplicate colname in ", paste.trunc(prefix), " (colnames are ", paste.with.quotes(colnames, maxlen=60), ")") if(trace >= 2 && !identical(org.colnames, colnames)) trace2(trace, "colname%s %s now %s\n", if(length(colnames) > 1) "s were" else " was", if(is.null(org.colnames)) "NULL" else paste.trunc(quotify(org.colnames)), paste.trunc(quotify(colnames))) colnames } get.mean.rsq <- function(rss, tss, wp) { if(is.null(wp)) wp <- repl(1, length(rss)) stopifnot(length(rss) == length(tss), length(wp) == length(tss)) total.rsq <- 0 for(iresp in seq_along(rss)) total.rsq <- total.rsq + wp[iresp] * get.rsq(rss[iresp], tss[iresp]) sum(total.rsq) / sum(wp) } # Get the environment for evaluating the model data: # 1. Return the environment in which the model function # was originally called. # 2. Else if the model already has an attribute .Environment, use that. # 3. Else return the environment in which the caller of this function # was called (e.g. return the environment of plotmo's caller). get.model.env <- function(object, object.name="object", trace=0, use.submodel=FALSE) { # check args, because this func is called very early in plotmo (and friends) check.numeric.scalar(trace, logical.ok=TRUE) if(trace >= 2) { callers.name <- callers.name() my.call <- call.as.char(n=2) printf.wrap("%s trace %g: %s\n", callers.name, trace, my.call) printf("--get.model.env for object with class %s\n", class.as.char(object)) } stopifnot.string(object.name) if(is.null(object)) stopf("argument %s is NULL", object.name) if(!is.list(object)) stopf("%s is not an S3 model", object.name) if(class(object)[1] == "list") # some packages build models without a specific class stopf("%s is a plain list, not an S3 model", object.name) obj <- object # Special handling for parsnip models. Their class is like c("_earth", "model_fit"). # For these models, use the env if any saved with the submod (e.g. earth) # (We don't do this for caret models because caret models have a terms field.) # # TODO this code is preliminary (works with parsnip 0.1.3) # and only works if model saves the data (e.g. lm, earth(keepxy=TRUE), not rpart if(use.submodel && inherits(object, "model_fit")) { # parsnip trace2(trace, "plotmo parsnip model: will plot %s$fit, not %s itself\n", gsub("'", "", object.name), object.name) obj <- object[["fit"]] if(!is.list(obj)) # sanity check stopf("plotmo parsnip model: %s$fit is not an S3 model", gsub("'", "", object.name)) # TODO following is temporary, hopefully if(inherits(obj, "rpart") && is.null(obj$model)) stop0( "Cannot plot parsnip rpart model: need model=TRUE in call to rpart\n", " Do it like this: set_engine(\"rpart\", model=TRUE)") } if(trace >= 2) { call <- getCall(obj) if(is.null(call)) printf("object has no call field (it's class is %s)\n", class.as.char(object)) else printf.wrap("object call is %s\n", strip.deparse(call), maxlen=120) } terms <- try(terms(obj), silent=trace < 3) # Following will fail (correctly) for non-formula models because they have no terms. # # TODO Also, if use.submodel, don't use terms (because the term env was # inside the parsnip func that created the submodel) # But that also fails later when we eval the formula because # eval will use GlobalEnv instead of the data passed to the model if(!is.null(terms) && !is.try.err(terms)) { model.env <- attr(terms, ".Environment") if(is.null(model.env)) { if(inherits(obj, "glmnet.formula") || # glmnetUtils package inherits(obj, "cv.glmnet.formula")) if(inherits(obj, "glmnet.formula")) stop0( "for this plot, glmnet.formula must be called with use.model.frame=TRUE") if(inherits(obj, "cv.glmnet.formula")) stop0( "for this plot, cv.glmnet.formula must be called with use.model.frame=TRUE") stop0("attr(terms, \".Environment\") is NULL") } if(!is.environment(model.env)) stop0("attr(terms, \".Environment\") is not an environment") else { trace2(trace, "using the environment saved in $terms of the %s model: %s\n", class.as.char(obj), environment.as.char(model.env)) return(model.env) } } model.env <- attr(obj, ".Environment") if(is.environment(model.env)) { trace2(trace, "using attr(obj,\".Environment\") saved with %s model: %s\n", class.as.char(obj), environment.as.char(model.env)) return(model.env) } if(!is.null(model.env)) stop0("attr(obj, \".Environment\") is not an environment") # n=2 is the caller of the function that called get.model.env # for plotmo it will be the caller of plotmo, typically R_GlobalEnv model.env <- parent.frame(n=2) trace2(trace, "assuming the environment of the %s model is that of %s's caller: %s\n", class.as.char(obj), callers.name, environment.as.char(model.env)) model.env } get.rsq <- function(rss, tss) { rsq <- 1 - rss / tss # following makes testing easier across machines in presence of numerical error rsq[rsq > -1e-5 & rsq < 1e-5] <- 0 rsq } get.weighted.rsq <- function(y, yhat, w=NULL) # NAs will be dropped before calc { stopifnot(length(y) > 0, length(y) == length(yhat)) if(is.null(w)) { is.na <- is.na(y) | is.na(yhat) y <- y[!is.na] yhat <- yhat[!is.na] if(length(y) == 0) stop0("length(y) == 0 after deleting NAs in y or yhat") rss <- sos(y - yhat) tss <- sos(y - mean(y)) } else { stopifnot(length(w) == length(yhat)) is.na <- is.na(y) | is.na(yhat) | is.na(w) y <- y[!is.na] yhat <- yhat[!is.na] w <- w[!is.na] if(length(y) == 0) stop0("length(y) == 0 after deleting NAs in y or yhat or w") rss <- sos(y - yhat, w) tss <- sos(y - weighted.mean(y, w), w) } get.rsq(rss, tss) } get.quant <- function(level, df=Inf, trace=FALSE) # e.g for level=.95 return 1.96 { check.level.arg(level, zero.ok=FALSE) stopifnot(level > 0, level < 1) level2 <- 1 - (1 - level) / 2 # .95 becomes .975 quant <- abs(qt(level2, df)) # .975 becomes 1.96 if(trace) { callers_name1 <- callers.name(n=1) callers_name2 <- callers.name(n=2) callers_name3 <- callers.name(n=3) callers_name4 <- callers.name(n=4) callers_name5 <- callers.name(n=5) callers_name6 <- callers.name(n=6) printf("%s: %s: %s: %s: %s: %s:\nget.quant_plotmo2(level %g df %g) level2 %g quant %g\n", callers_name6, callers_name5, callers_name4, callers_name3, callers_name2, callers_name1, level, df, level2, quant) } quant } # TRUE if pattern is in any of the strings in x grepany <- function(pattern, x, ignore.case=FALSE, ...) { any(grepl(pattern, x, ignore.case=ignore.case, ...)) } # scalar form of ifelse, with short name :-) # only evaluates the "no" argument if necessary ife <- function(ife.test, ife.yes, ife.no) { ife.test <- check.boolean(ife.test) stopifnot(!missing(ife.yes)) stopifnot(!missing(ife.no)) if(ife.test) ife.yes else ife.no } # returns an index, choices is a vector of strings imatch.choices <- function(arg, choices, argname=short.deparse(substitute(arg), "function"), errmsg.has.index=FALSE, # TRUE if integer "arg" is legal elsewhere errmsg="", # error message, "" for automatic errmsg.ext="") # extension to error message { errmsg.ext <- paste0( if(errmsg.has.index) " an integer index or" else "", if(nchar(errmsg.ext)) paste0(" ", errmsg.ext, " or") else "") if(nchar(errmsg) == 0) errmsg <- sprint("Choose%s one of: %s", errmsg.ext, quotify(choices)) if(!is.character(arg) || length(arg) != 1 || !nzchar(arg)) stopf("illegal %s argument\n%s", quotify(argname, "'"), errmsg) if(argname %in% c("NULL", "NA")) argname <- "argument" imatch <- pmatch(arg, choices) if(anyNA(imatch)) { imatch <- NULL for(i in seq_along(choices)) if(pmatch(arg, choices[i], nomatch=0)) imatch <- c(i, imatch) if(length(imatch) == 0) { if(length(choices) == 1) stopf("%s=\"%s\" is not allowed\n Only%s %s is allowed", argname, paste(arg), errmsg.ext, quotify(choices)) else stopf("%s=\"%s\" is not allowed\n%s", argname, paste(arg), errmsg) } if(length(imatch) > 1) stopf("%s=\"%s\" is ambiguous\n%s", argname, paste(arg), errmsg) } imatch } # TRUE if all values in object are integers, ignoring NAs # assumes object is numeric or logical (check this before call this function) is.integral <- function(object) { object <- object[!is.na(object)] length(object) > 0 && is.null(dim(object)) && # prevent error in floor for e.g. survival objects all(floor(object) == object) } # is.specified's main purpose is to see if a plot component should be # drawn, i.e., to see if the component "has a color" is.specified <- function(object) { try <- try(!is.null(object) && !anyNA(object) && !is.zero(object) && # following needed for e.g. col=c("red", 0) because 0 is converted to string !identical(object, "0") && !identical(object, "0L") && !identical(object, "NA"), silent=FALSE) if(is.try.err(try)) { # this occurs if object is say a closure and anyNA fails # anyNA was introduced in R 3.1.0 printf("\n") # separate from any message printed by try() above stop0(deparse(substitute(object)), ": illegal value") } try } is.try.err <- function(object) { class(object)[1] == "try-error" } is.zero <- function(object) # needed because identical(object, 0) fails if object is 0L { identical(object, 0) || identical(object, 0L) } # Lighten color by amount 0 ... 1 where 1 is white. # If amount is negative, then darken the color, -1 is black. lighten <- function(col, lighten.amount, alpha=1) { # stopifnot.scalar(lighten.amount) # stopifnot(lighten.amount >= -1 && lighten.amount <= 1) rgb <- col2rgb(col) / 255 # empirically, sqrt makes visual effect of lighten.amount more linear lighten.amount2 <- sqrt(abs(lighten.amount)) rgb <- if(lighten.amount > 0) rgb + lighten.amount2 * (c(1,1,1) - rgb) # move each r,g,b towards 1 else # darken rgb - lighten.amount2 * rgb # move each r,g,b towards 0 rgb[rgb < 0] <- 0 # clamp rgb[rgb > 1] <- 1 if(alpha == 1) rgb(rgb[1,], rgb[2,], rgb[3,]) else rgb(rgb[1,], rgb[2,], rgb[3,], alpha) } # returns the expanded arg (error msg if arg is not an allowed choice in calling func) match.arg1 <- function(arg, argname=deparse(substitute(arg))) { formal.args <- formals(sys.function(sys.parent())) formal.argnames <- eval(formal.args[[argname]]) formal.argnames[imatch.choices(arg[1], formal.argnames, argname)] } # returns a string, choices is a vector of strings # error msg if arg is not an allowed choice match.choices <- function(arg, choices, argname=deparse(substitute(arg)), errmsg="", # error message ("" for automatic) errmsg.ext="") # extension to error message { choices[imatch.choices(arg, choices, argname, errmsg=errmsg, errmsg.ext=errmsg.ext)] } # This uses the object's .Environment attribute, which was # pre-assigned to the object via get.model.env # If this gives an error saying that class(model.env) is "NULL" # then that pre-assignment wasn't done. model.env <- function(object) { model.env <- attr(object, ".Environment") if(!is.environment(model.env)) stopf("class(model.env) is \"%s\"", class(model.env)[1]) model.env } # Like as.data.frame() but retains the original colnames, if any, and can # handle matrices from the Matrix etc. packages, if as.matrix() works for # them. Also it has a stringsAsFactors argument which works even if x is # already a data.frame. my.data.frame <- function(x, trace, stringsAsFactors=TRUE) { if(is.data.frame(x)) { if(stringsAsFactors) { # Convert any character columns to factors. Note as.data.frame # won't do this for us when x is already a data.frame. # We don't have a levels argument to pass to factor() # but I believe that this will not be a problem in the # context in which we use my.data.frame (plotmo_x). for(i in seq_len(length(x))) if(is.character(x[[i]])) x[[i]] <- factor(x[[i]]) } return(x) } df <- try(as.data.frame(x, stringsAsFactors=stringsAsFactors), silent=TRUE) if(is.try.err(df)) { # come here for sparse matrices from the Matrix package df <- try(as.matrix(x)) if(is.try.err(df)) stopf("Cannot convert %s object to a data.frame or matrix", quotify(class(x)[1])) df <- as.data.frame(df, stringsAsFactors=stringsAsFactors) trace2(trace, "converted %s object to data.frame\n", class(x)[1]) } colnames(df) <- safe.colnames(x) # restore original column names df } # default min.nrow=3 to use fixed point only if more than intercept and one other term my.fixed.point <- function(x, digits, min.nrow=3) { if(is.null(dim(x))) x <- as.matrix(x) if(NROW(x) >= min.nrow) x <- apply(x, 2, zapsmall, digits+1) x } # If s is a string vector s, return the number of lines in # the element that has the most lines # Examples: nlines(c(" ", " \n ") is 2 # nlines(c(" ", " \n") is 2 # nlines(" ") is 1 # nlines("") is 0 (special case) nlines <- function(s) { if(!nzchar(s[1])) # special case, caption="" is not printed 0 else if(anyNA(s)) 0 else length(strsplit(s, "\n")[[1]]) } paste.c <- function(object, maxlen=16) # return 'x1' or 'c(x1, x2)' { if(length(object) == 1) paste.trunc(object) else paste0("c(", paste.trunc(object, collapse=",", maxlen=maxlen), ")") } paste.with.quotes <- function(object, maxlen=16) # return '"x1"' or '"x1", "x2"' { if(is.null(object[1])) "NULL" else if(length(object) == 0) "EMPTY" else paste0(paste.trunc("\"", object, "\"", collapse=", ", sep="", maxlen=maxlen)) } paste.collapse <- function(...) { paste(..., collapse=" ") } # collapse, and truncate if strings in ... are too long paste.trunc <- function(..., sep=" ", collapse=" ", maxlen=60) { s <- paste(..., sep=sep, collapse=collapse) if(nchar(s) > maxlen) { stopifnot(maxlen > 3) s <- paste0(substr(s, 1, maxlen-3), if(substr(s, maxlen-3, maxlen-3) == ".") ".." # avoid 4 dots else "...") } s } pastef <- function(s, fmt, ...) # paste the printf style args to s { paste0(s, sprint(fmt, ...)) } print_first_few_elements_of_vector <- function(x, trace, name=NULL) { try(cat(" min", min(x), "max", max(x)), silent=TRUE) spaces <- " " if(!is.null(name)) spaces <- sprint("%*s", nchar(name), " ") # nchar spaces cat0("\n", spaces, " value") len <- if(trace >= 4) length(x) else min(if(is.logical(x)) 20 else 10, length(x)) if(is.logical(x)) for(i in 1:len) cat0(if(x[i]) " T" else " F") else for(i in 1:len) cat0(" ", x[i]) if(length(x) > len) cat(" ...") cat("\n") if(trace >= 4) { cat("\n") print(summary(x)) } } # A safe version of sprintf. # Like sprintf except that %s on NULL prints "NULL" rather than # preventing the entire string from being printed # # e.g. sprintf("abc %s def", NULL) returns an empty string -- a silent failure! # but sprint("abc %s def", NULL) returns "abc NULL def" # # e.g. sprintf("abc %d def", NULL) returns an empty string! # but sprint("abc %d def", NULL) causes an error msg (not a silent failure) sprint <- function(fmt, ...) { dots <- list(...) dots <- lapply(dots, function(e) if(is.null(e)) "NULL" else e) do.call(sprintf, c(fmt, dots)) } printf <- function(fmt, ...) # like c printf { cat(sprint(fmt, ...), sep="") } # like printf but wrap at terminal width # exdent=NULL for automatic determination of xdent (line up to func opening paren) # TODO maxlen seems to be ignored, strwrap truncates before that? printf.wrap <- function(fmt, ..., exdent=NULL, maxlen=2000) { s <- paste.trunc(paste.collapse(sprint(fmt, ...)), maxlen=maxlen) if(is.null(exdent)) { # align to opening paren of func call e.g. "graphics::par(xxx)" or "foo$method(" # TODO this doesn't account for leading newlines if any exdent <- 4 igrep <- gregexpr("[ ._$:[:alnum:]]+\\(", s)[[1]] if(igrep[1] == 1) { len <- attr(igrep, "match.length")[1] exdent <- min(25, len) } } # strwrap doesn't preserve newlines in the input string, so do it manually :( for(i in seq_len(nchar(s))) # print leading newlines if(substr(s, i, i) == "\n") cat0("\n") else break cat(paste0(strwrap(s, width=getOption("width"), exdent=exdent), collapse="\n")) if(nchar(s) > i) for(j in nchar(s):i) # print trailing newlines if(substr(s, j, j) == "\n") cat0("\n") else break } pt.cex <- function(ncases, npoints=ncases) { n <- if(npoints > 0) min(npoints, ncases) else ncases if (n >= 20000) .2 else if(n >= 5000) .3 else if(n >= 3000) .4 else if(n >= 1000) .6 else if(n >= 300) .8 else if(n >= 30) 1 else 1.2 } # like short.deparse but quotify the deparsed obj (unless the alternative is used) quote.deparse <- function(object, alternative="object") { s <- strip.deparse(object) if(nchar(s) > 60) alternative else quotify(s, quote="'") } quote.with.c <- function(names) # return "x" or c("x1", "x2") { if(length(names) == 1) sprint("\"%s\"", names) else sprint("c(%s)", paste0("\"", paste(names, collapse="\", \""), "\"")) } quotify <- function(s, quote="\"") # add quotes and collapse to a single string { # called quotify because quote is taken if(is.null(s)) "NULL" else if(length(s) == 0) paste0(quote, quote) else if(substr(s[1], 1, 1) == "'" || substr(s[1], 1, 1) == "\"") paste.collapse(s) # already has quotes else paste0(quote, paste(s, collapse=paste0(quote, " ", quote)), quote) } # like quotify, but use the alternative name if s is too long quotify.short <- function(s, alternative="object", quote="\"") { stopifnot(is.character(s)) s <- paste0(s, collapse="") if(nchar(s) > 60) # 60 is arb but seems ok for plot titles etc alternative else quotify(s, quote) } quotify.trunc <- function(s, quote="\"", maxlen=60) { stopifnot(is.character(s)) s <- quotify(s, quote) if(nchar(s) > maxlen) { stopifnot(maxlen > 3) paste0(substr(s, 1, maxlen-3), "...") } else s } range1 <- function(object, ...) { stopifnot(length(dim(object)) <= 2) if(!is.null(dim(object))) object <- object[,1] if(is.factor(object)) c(1, nlevels(object)) else if(inherits(object, "Date")) # Sep 2020, R 4.0.2: range no longer works with Date objects c(min(object), max(object)) else range(object, finite=TRUE, ...) } recycle <- function(object, ref.object) { repl(object, length.out=length(ref.object)) } repl <- function(object, length.out) { # following "if" added for R-2.15.3 otherwise # get warning: 'x' is NULL so the result will be NULL if(is.null(object)) return(NULL) check.numeric.scalar(length.out) stopifnot(floor(length.out) == length.out) stopifnot(length.out > 0) rep(object, length.out=length.out) } # the standard colnames() can crash for certain objects # TODO figure out when and why safe.colnames <- function(object) { colnames <- try(colnames(object), silent=TRUE) if(is.try.err(colnames)) NULL else colnames } # if deparse(object) is too long, return the alternative short.deparse <- function(object, alternative="object") { s <- strip.deparse(object) if(nchar(s) > 60) alternative else s } # Remove duplicates in x, then sort (smallest first). # Also works for Dates. sort_unique <- function(x) { sort(unique(x), na.last=NA) # na.last=NA drops NAs } sos <- function(x, weights=NULL) # sum of squares { if(is.null(weights)) sum(as.vector(x^2)) else { stopifnot(length(weights) == length(x)) sum(weights * as.vector(x^2)) } } stop0 <- function(...) { stop(..., call.=FALSE) } stopf <- function(fmt, ...) # args like printf { stop(sprint(fmt, ...), call.=FALSE) } # stop if s is not a one element character vector stopifnot.string <- function(s, name=short.deparse(substitute(s)), null.ok=FALSE, allow.empty=FALSE) { if(name %in% c("NULL", "NA")) name <- "argument" if(is.null(s)) { if(null.ok) return() else stop0(quotify(name, "'"), " is NULL (it should be a string)") } if(!is.character(s)) stop0(quotify(name, "'"), " is not a character variable (class(", name, ") is \"", class(s), "\")") if(length(s) == 0) stop0(quotify(name, "'"), " is empty (it has no elements)") if(length(s) != 1) stop0(quotify(name, "'"), " has more than one element\n ", name, " = c(", paste.trunc("\"", s, "\"", sep=""), ")") if(!allow.empty && !nzchar(s)) stop0(quotify(name, "'"), " is an empty string") } strip.deparse <- function(object) # deparse, collapse, remove most white space { s <- strip.space.collapse(deparse(object)) gsub(",", ", ", s) # put back space after commas } strip.space <- function(s) { gsub("[ \t\n]", "", s) } strip.space.collapse <- function(s) # returns a single string { gsub("[ \t\n]", "", paste(s, collapse="")) # paste converts vec to single } # like text, but with a white background # TODO sign of adj is backwards? text.on.white <- function(x, y, label, cex=1, adj=.5, font=1, xmar=.3, srt=0, white="white", ...) { stopifnot(length(label) == 1) if(length(adj) == 1) adj <- c(adj, .5) width <- strwidth(label, cex=cex, font=font) char.width <- strwidth("X", cex=cex, font=font) height <- strheight(label, cex=cex, font=font) char.height <- strheight("X", cex=cex, font=font) if(srt == 0) { if(is.specified(label)) rect(x - adj[1] * width - xmar * char.width, y - adj[2] * height - .3 * char.height, # .3 for extra space at bottom x + (1-adj[1]) * width + xmar * char.width, y + (1-adj[2]) * height + .1 * char.height, col=white, border=NA) text(x=x, y=y, labels=label, cex=cex, adj=adj, font=font, ...) } else if(srt == 90 || srt == -90) { # width and height are in usr coords, adjust these for flip of coords usr <- par("usr") # xmin, xmax, ymin, ymax xrange <- abs(usr[2] - usr[1]) yrange <- abs(usr[4] - usr[3]) height <- xrange / yrange * height width <- yrange / xrange * width char.height <- xrange / yrange * char.height char.width <- yrange / xrange * char.width if(is.specified(label)) rect(x + (1-adj[1]) * height, # left y + (1-adj[2]) * width + xmar * char.width, # bottom x - adj[1] * height, # right y - adj[2] * width - xmar * char.width, # top col=white, border=NA) text(x=x, y=y, labels=label, cex=cex, adj=adj, font=font, srt=srt, ...) } else stop0("srt=", srt, " is not allowed (only 0, 90, and -90 are supported)") } to.logical <- function(object, len) # object can be a boolean or numeric vector { xlogical <- repl(FALSE, len) xlogical[object] <- TRUE xlogical } trace0 <- function(trace, fmt, ...) { stopifnot(!(is.numeric(trace) && is.logical(trace))) if(trace >= 0) cat(sprint(fmt, ...), sep="") } trace1 <- function(trace, fmt, ...) { stopifnot(!(is.numeric(trace) && is.logical(trace))) if(trace >= 1) cat(sprint(fmt, ...), sep="") } trace2 <- function(trace, fmt, ...) { stopifnot(is.numeric(trace)) if(trace >= 2) cat(sprint(fmt, ...), sep="") } # Truncate deparse(object) if it is too long. # Necessary because deparse(substitute(x)) might return something very # long, like c(1000, 1001, 1002, 1003, 1004, 1005, 1006, 1008, 1009, etc.) # Return a one element character vector. trunc.deparse <- function(object, maxlen=60) { s <- strip.deparse(object) if(nchar(s) > maxlen) { stopifnot(maxlen > 3) paste0(substr(s, 1, maxlen-3), "...") } else s } # Return the number of lines in s (where lines are separated by \n). try.eval <- function( expr, envir = parent.frame(), trace = 0, expr.name = NULL, silent = trace < 2) { if(trace && is.null(expr.name)) expr.name <- trunc.deparse(substitute(expr)) try(eval.trace(expr, envir, trace=trace, expr.name=expr.name), silent=silent) } unquote <- function(s) # remove leading and trailing quotes, if any { if(is.character(s)) { s <- gsub("^\"|^'", "", s) # leading quotes s <- gsub("\"$|'$", "", s) # trailing quotes } s } # warn.if.not.all.finite helps preempt confusing message from code later. # Return TRUE if warning issued. warn.if.not.all.finite <- function(object, text="unknown") { is.factors <- sapply(object, is.factor) if(any(is.factors)) { if(NCOL(object) == 1 || all(is.factors)) # TODO suspect return(FALSE) object <- object[, !is.factors] # remove factor columns before is.finite check } if(any(sapply(object, is.na))) { warning0("NA in ", text) return(TRUE) } if(!all(sapply(object, is.finite))) { warning0("non finite value in ", text) return(TRUE) } FALSE } warnf <- function(fmt, ...) # args like printf { warning(sprint(fmt, ...), call.=FALSE) } warning0 <- function(...) { warning(..., call.=FALSE) } # Binomial pairs response: fraction true for each row. # # This function is used by both earth and plotmo. # If you change it here, change it there too. # # The first column of y is considered to be "true", the second "false". # # Example y: # survived died # 1 1 # 0 0 # both values zero # 3 4 # # becomes: # survived # .5 # 1 / (1 + 1) # 0 # special case (both survived and died equal to 0) # .43 # 3 / (3 + 4) bpairs.yfrac <- function(y, trace) { stopifnot(NCOL(y) == 2) both.zero <- (y[,1] == 0) & (y[,2] == 0) y[both.zero, 2] <- 1 # so zero rows will be translated to 0 in next line yfrac <- y[, 1, drop=FALSE] / (y[,1] + y[,2]) # fraction true trace.bpairs.yfrac(yfrac, trace) yfrac } trace.bpairs.yfrac <- function(yfrac, trace) { # based on code in print.earth.fit.args if(trace >= 4) cat("\n") if(trace >= 1 && trace < 7) { # don't print matrices when doing very detailed earth.c tracing tracex <- if(trace >= 5) 4 else 2 # adjust trace for print_summary details <- if(trace >= 4) 2 else if(trace >= 1) -1 else 0 print_summary(yfrac, "yfrac", tracex, details=details) if(details > 1) printf("\n") } } plotmo/R/glmnet.R0000644000176200001440000001651114663771205013415 0ustar liggesusers# glmnet.R: plotmo functions for glmnet and glmnetUtils objects plotmo.prolog.glmnet <- function(object, object.name, trace, ...) # invoked when plotmo starts { # save (possibly user specified) s for use by plot_glmnet and predict.glmnet s <- dota("predict.s", ...) # get predict.s from dots, NA if not in dots if(is.na(s)) s <- dota("s", ...) # get s from dots, NA if not in dots if(is.na(s)) s <- 0 # unspecified, default to match plotmo.predict.glmnet check.numeric.scalar(s) attr(object, "plotmo.s") <- s object } plotmo.predict.glmnet <- function(object, newdata, type, ..., TRACE) { s <- attr(object, "plotmo.s") # get the predict.glmnet s stopifnot(!is.null(s)) # uninitialized? # newx for predict.glmnet must be a matrix not a dataframe, # so here we use plotmo.predict.defaultm (not plotmo.predict.default) yhat <- plotmo.predict.defaultm(object, newdata, type=type, force.s=s, ..., TRACE=TRACE) if(length(dim(yhat) == 2) && NCOL(yhat) == 1) colnames(yhat) <- paste0("s=", signif(s,2)) # so s=.12 appears in plot title yhat } plotmo.predict.glmnet.formula <- function(object, newdata, type, ..., TRACE) # glmnetUtils package { # same as plotmo.predict.glmnet but doesn't convert newx to a matrix s <- attr(object, "plotmo.s") # get the predict.glmnet s stopifnot(!is.null(s)) # uninitialized? yhat <- plotmo.predict.default(object, newdata, type=type, force.s=s, ..., TRACE=TRACE) if(length(dim(yhat) == 2) && NCOL(yhat) == 1) colnames(yhat) <- paste0("s=", signif(s,2)) # so s=.12 appears in plot title yhat } plotmo.singles.glmnet <- function(object, x, nresponse, trace, all1, ...) { # return the indices of the 25 biggest coefs, but exclude zero coefs s <- attr(object, "plotmo.s") # get the predict.glmnet s stopifnot(!is.null(s)) # uninitialized? lambda.index <- which.min(abs(object$lambda - s)) # index into object$lambda trace2(trace, "plotmo.singles.glmnet: s %g lambda.index %g\n", s, lambda.index) beta <- object$beta if(is.list(beta)) { # multiple response model? check.integer.scalar(nresponse, min=1, max=length(beta)) beta <- beta[[nresponse]] } beta <- as.vector(beta[, lambda.index]) # as.vector converts from dgCMatrix order <- order(abs(beta), decreasing=TRUE) max.nsingles <- if(all1) Inf else 25 # extract the biggest coefs beta <- beta[order][1:min(max.nsingles, length(beta))] nsingles <- sum(abs(beta) > 1e-8) # drop zero coefs order[seq_len(nsingles)] } plotmo.prolog.cv.glmnet <- function(object, object.name, trace, ...) # invoked when plotmo starts { # cv.glmnet objects don't have their call field in the usual place, # so fix that (tested on glmnet version 2.0-2). # Note that getCall() doesn't work on cv.glmnet objects. if(is.null(object[["call"]])) { object$call <- object$glmnet.fit$call stopifnot(!is.null(object$call), is.call(object$call)) } # save (possibly user specified) s for use by plot_glmnet and predict.glmnet s <- dota("predict.s", ...) # get predict.s from dots, NA if not in dots if(is.na(s)) s <- dota("s", ...) # get s from dots, NA if not in dots if(is.na(s)) s <- "lambda.1se" # unspecified, default to match predict.cv.glmnet s <- match.choices(s, c("lambda.1se", "lambda.min"), "s") attr(object, "plotmo.s") <- s object } plotmo.predict.cv.glmnet <- function(object, newdata, type, ..., TRACE) { s <- attr(object, "plotmo.s") # get the predict.glmnet s stopifnot(!is.null(s)) # uninitialized? if(inherits(object, "cv.glmnet.formula")) { # glmnetUtils package yhat <- plotmo.predict.default(object, newdata, type=type, force.s=s, ..., TRACE=TRACE) } else { # glmnet package # newx for predict.glmnet must be a matrix not a dataframe, # so here we use plotmo.predict.defaultm (not plotmo.predict.default) yhat <- plotmo.predict.defaultm(object, newdata, type=type, force.s=s, ..., TRACE=TRACE) } if(length(dim(yhat) == 2) && NCOL(yhat) == 1) colnames(yhat) <- paste0("s=\"", s, "\"") # so s="lambda.1se" appears in plot title yhat } plotmo.singles.cv.glmnet <- function(object, x, nresponse, trace, all1, ...) { # return the indices of the 25 biggest coefs, but exclude zero coefs s <- attr(object, "plotmo.s") # get the predict.glmnet s beta <- coef(object, s=s) if(is.list(beta)) { # multiple response model? check.integer.scalar(nresponse, min=1, max=length(beta)) beta <- beta[[nresponse]] } beta <- as.vector(beta) # as.vector converts from dgCMatrix beta <- beta[-1] # drop intercept order <- order(abs(beta), decreasing=TRUE) max.nsingles <- if(all1) Inf else 25 # extract the biggest coefs beta <- beta[order][1:min(max.nsingles, length(beta))] nsingles <- sum(abs(beta) > 1e-8) # drop zero coefs order[seq_len(nsingles)] } # glmnet family="binomial", y is a vector of 1s and 2s. # convert 1s and 2s to 0s and 1s to match predicted values plotmo.y.lognet <- function(object, trace, naked, expected.len, nresponse, ...) { # plotmo.y.default returns list(field=y, do.subset=do.subset) list <- plotmo.y.default(object, trace, naked, expected.len) # following is needed for glmnetUtils:glmnet.formula models (but not for glmnet xy models) if(is.data.frame(list$field)) list$field <- list$field[[1]] stopifnot(!is.null(list$field)) # paranoia list$do.subset <- FALSE # glmnet doesn't support subset so don't even try # TODO following only works correctly if default ordering of factor was used? list$field <- as.numeric(list$field) # as.numeric needed if y is a factor list$field - min(list$field) # convert 1s and 2s to 0s and 1s } # glmnet family="multinomial" plotmo.y.multnet <- function(object, trace, naked, expected.len, nresponse, ...) { # plotmo.y.default returns list(field=y, do.subset=do.subset) list <- plotmo.y.default(object, trace, naked, expected.len) list$do.subset <- FALSE # glmnet doesn't support subset so don't even try if(is.null(nresponse)) # plotmo uses nresponse=NULL in initial checking nresponse <- 1 if(NCOL(list$field) > 1) # if y is multiple columns assume it's an indicator matrix y <- list$field else { # else convert it to an indicator matrix # TODO following only works correctly if default ordering of factor was used? y1 <- as.numeric(list$field) # as.numeric needed if y is a factor stopifnot(min(y1) == 1 && max(y1) > 1) # sanity check # convert y1 to an indicator matrix of 0s and 1s (NA_real_ to avoid type convert) y <- matrix(NA_real_, nrow=length(y1), ncol=max(y1)) for(i in 1:max(y1)) y[,i] <- as.numeric(y1 == nresponse) } y } # glmnet family="mgaussian" plotmo.y.mrelnet <- function(object, trace, naked, expected.len, nresponse, ...) { plotmo.y.multnet(object, trace, naked, expected.len, nresponse, ...) } plotmo/R/dotlib.R0000644000176200001440000000664214663771205013410 0ustar liggesusers# dotlib.R: miscellaneous functions for the dots routines # Arguments for par() which take a vector value (i.e. length of value is not one). PAR.VEC <- c("fig", "fin", "lab", "mai", "mar", "mfcol", "mfg", "mfrow", "mgp", "oma", "omd", "omi", "pin", "plt", "usr", "xaxp", "yaxp") # Add the elements of the extra list to the original list. Elements of the # original list that have the same names as extra elements get overwritten. # # Like utils::modifyList(keep.null=TRUE) except: # (i) input args can be NULL (NULL is treated as an empty list) # (ii) unnamed elements in extra are added to original (modifyList drops them) merge.list <- function(original, extra) { if(is.null(original)) original <- list() if(is.null(extra)) return(original) stopifnot(is.list(original)) stopifnot(is.list(extra)) # pairlist would probably be ok too for(i in seq_along(extra)) { e <- extra[[i]] name <- names(extra)[i] if(is.null(name) || !nzchar(name)) # extra element is unnamed? original <- c(original, if(is.null(e)) list(NULL) else e) else if(is.null(e)) original[name] <- list(NULL) # avoid "assign deletes elem if rhs is null" else original[[name]] <- e } original } # Evaluate each element of the list dots in the environment specified by n. # (This function can actually be used any list, but the evaluating # environment and enclosure are set up for dot arg lists.) # # TODO "scalar" is ugly, it is for par() alone and prevents # e.g. error: graphical parameter "lty" has the wrong length eval.dotlist <- function(dots, n=1, scalar=FALSE) { stopifnot(is.list(dots) || is.pairlist(dots)) env <- parent.frame(n) dotnames <- names(dots) for(i in seq_along(dots)) { e <- try(eval(dots[[i]], envir=env, enclos=env), silent=TRUE) if(!is.try.err(e)) { if(is.null(e)) dots[i] <- list(NULL) # avoid "assign deletes elem if rhs is null" else if(!scalar || (dotnames[i] %in% PAR.VEC) || length(e) == 1) dots[[i]] <- e else dots[[i]] <- e[[1]] # select first element of e only # TODO it would be better to drop the element entirely } } dots } # Is the string s a valid R lexigraphic identifier? # If allow.specials=TRUE we allow special chars used in DROP and KEEP strings. # The name argument is used only in error messages. stopifnot.identifier <- function(s, name=short.deparse(substitute(s)), allow.empty=FALSE, allow.specials=FALSE) { if(!is.character(s)) stop0(name, " is not a character variable (class(", name, ") is \"", class(s)[1], "\")") if(length(s) != 1) stop0(name, " has more than one element\n ", name, " = c(", paste.trunc("\"", s, "\"", sep=""), ")") if(!allow.empty && !nzchar(s)) stop0(name, " is an empty string") # TODO the following allows integers (no alphabetic characters), it shouldn't start <- if(allow.specials) # include , * $ regexpr("[^._:[:alnum:],*$]", s) else regexpr("[^._:[:alnum:]]", s) if(start > 0) stop0("illegal character \"", substr(s, start, start), "\" in ", name, " = \"", s, "\"") } plotmo/R/type.R0000644000176200001440000000666614663771205013122 0ustar liggesusers# type.R: plotmo functions for getting the default type arg for predict() and residuals() # this is used when plotmo's argument "type" is NULL (the default) # get the default type for predict() plotmo.type <- function(object, ..., TRACE) { UseMethod("plotmo.type") } plotmo.type.default <- function(object, ..., TRACE) { "response" } plotmo.type.nnet <- function(object, ..., TRACE) { "raw" } plotmo.type.knn3 <- function(object, ..., TRACE) { "prob" } plotmo.type.tree <- function(object, ..., TRACE) # tree package { "vector" } plotmo.type.fda <- function(object, ..., TRACE) # mda package { "class" } # get the type for residuals() plotmo.residtype <- function(object, ..., TRACE) { UseMethod("plotmo.residtype") } plotmo.residtype.default <- function(object, ..., TRACE) { plotmo.type(object, ..., TRACE=TRACE) # use the predict type } # TRUE if we are predicting probabilities. # This is used for setting the default ylim to c(0,1). # Not always reliable (but if wrong, the user can override with explicit ylim arg). # It can save a call get.ylim.by.dummy.plots, and also works for objects # for which get.ylim.by.dummy.plots doesn't automatically figure out c(0,1) is.yaxis.a.probability.aux <- function(object, type, trace) { if(inherits(object, "WrappedModel")) { # mlr package # will be we be predicting probabilities? # TODO this will be wrong if use say nresponse="response" in call to plotmo call <- object[["call"]] if(!is.null(call)) { # TODO assumes environment for learner is available and correct learner <- eval(call[["learner"]]) if(!is.null(learner)) { predict.type <- mlr::getLearnerPredictType(learner) if(substr(predict.type[1], 1, 1) == "p") # prob return(TRUE) } } # continue processing, but use the learner.model object <- object$learner.model } type.firstchar <- substr(type[1], 1, 1) # type argument to predict() substr(type[1], 1, 4) == "prob" || # catchall (inherits(object, "rpart") && object$method[1] == "class" && type.firstchar == "p") || # following not strictly necessary for earth models because # get.ylim.by.dummy.plots can also figure this out # The "r" below is for "response" (inherits(object, "earth") && is.nomial(object$glm.list[[1]]) && type.firstchar == "r") || # the "r" below is for "response" (inherits(object, c("glm", "glmnet", "pre")) && is.nomial(object) && type.firstchar == "r") || (inherits(object, "cv.glmnet") && !is.null(object$glmnet.fit$classnames)) || (inherits(object, "randomForest") && is.character(object$type) && object$type[1] == "classification" && type.firstchar == "p") || (inherits(object, "C5.0") && type.firstchar == "p") } is.yaxis.a.probability <- function(object, type, trace) { # This wrapper exists because we don't want plotmo to completely stop # (issue an error) if a package changes the model fields. (This function is # vulnerable to changes because it accessess internal fields in multiple # different models.) is.prob <- try(is.yaxis.a.probability.aux(object, type, trace), silent=trace < 2) if(is.try.err(is.prob)) FALSE else is.prob } plotmo/R/pint.R0000644000176200001440000001354215126335242013072 0ustar liggesusers# pint.R: plotmo functions for confidence and prediction intervals # Handle plotmo's "level" argument. Return a prediction interval dataframe # with either or both of the following sets of columns. What columns get # returned depends on the capabilities of the object's predict method. # For example, predict.lm allows us to return both i and ii, and for # earth models we can return only i. # # (i) lwr, upr intervals for prediction of new data # # (ii) cint.lwr, cint.upr intervals for prediction of mean response plotmo_pint <- function(object, newdata, type, level, trace, ipred, inverse.func) { if(!is.specified(level)) return(NULL) trace2(trace, "plotmo_pint for %s object\n", class.as.char(object)) stopifnot.string(type) # call plotmo.pint.xxx where xxx is object's class intervals <- plotmo.pint(object, newdata, type, level, trace) if(!is.null(intervals$lwr)) { intervals$lwr <- apply.inverse.func(inverse.func, intervals$lwr, object, trace) intervals$upr <- apply.inverse.func(inverse.func, intervals$upr, object, trace) } if(!is.null(intervals$cint.lwr)) { intervals$cint.lwr <- apply.inverse.func(inverse.func, intervals$cint.lwr, object, trace) intervals$cint.upr <- apply.inverse.func(inverse.func, intervals$cint.upr, object, trace) } print_summary(intervals, "prediction intervals", trace) intervals } # Return a data.frame with either or both of the following variables: # (i) lwr, upr intervals for prediction of new data # (ii) cint.lwr, cint.upr intervals for prediction of mean response plotmo.pint <- function(object, newdata, type, level, trace, ...) { UseMethod("plotmo.pint") } plotmo.pint.default <- function(object, newdata, type, level, trace, ...) { stop0("the level argument is not supported for ", class.as.char(object, quotify=TRUE), " objects") } plotmo.pint.lm <- function(object, newdata, type, level, trace, ...) { # lm objects with weights do not support confidence intervals on new data if(!is.null(object$weights)) stop0("the level argument is not supported on lm objects with weights") pints <- predict(object, newdata, interval="prediction", level=level) cints <- predict(object, newdata, interval="confidence", level=level) data.frame( lwr = pints[,"lwr"], # intervals for prediction of new data upr = pints[,"upr"], cint.lwr = cints[,"lwr"], # intervals for prediction of mean response cint.upr = cints[,"upr"]) } plotmo.pint.glm <- function(object, newdata, type, level, trace, ...) { predict <- try(predict(object, newdata, type="link", se.fit=TRUE)) if(is.try.err(predict)) stopf("\"predict(mod, newdata, type=\"link\", se.fit=TRUE)\" failed for \"%s\" model", class(object)[1]) ilink = try(family(object)$linkinv) if(is.try.err(ilink)) stopf("\"family(mod)$linkinv\" failed for \"%s\" model", class(object)[1]) df <- try(df.residual(object)) if(is.try.err(df)) stopf("\"df.residual(mod)\" failed for \"%s\" model", class(object)[1]) q <- get.quant(level, df=df, trace=trace>=2) # e.g for level=.95 return 1.96 if df=Inf if(!is.null(object$weights) && !all(object$weights == object$weights[1])) warnf("the level argument may not work correctly on glm objects built with weights") data.frame(cint.lwr = ilink(predict$fit - q * predict$se.fit), # changed in plotmo 3.7.0, jan 2026 cint.upr = ilink(predict$fit + q * predict$se.fit)) } # package mgcv, or package gam version less than 1.15 plotmo.pint.gam <- function(object, newdata, type, level, trace, ...) { quant <- 1 - (1 - level) / 2 # .95 becomes .975 predict <- predict(object, newdata, type=type, se.fit=TRUE) # special handling for where user used gam::gam instead of mgcv::gam # (applies only package gam version less than 1.15) if(class(predict)[1] == "numeric" && "package:gam" %in% search()) { cat("\n") stop0("gam objects in the 'gam' package do not support ", "confidence intervals on new data") } if(!is.null(object$weights) && !all(object$weights == object$weights[1])) warnf( "the level argument may not work correctly on gam objects built with weights") data.frame(cint.lwr = predict$fit - quant * predict$se.fit, cint.upr = predict$fit + quant * predict$se.fit) } # package gam version 1.15 or higher plotmo.pint.Gam <- function(object, newdata, type, level, trace, ...) { quant <- 1 - (1 - level) / 2 # .95 becomes .975 predict <- predict(object, newdata, type=type, se.fit=TRUE) if(class(predict)[1] == "numeric") { cat("\n") stop0("Gam objects do not support confidence intervals on new data") } if(!is.null(object$weights) && !all(object$weights == object$weights[1])) warnf( "the level argument may not work correctly on Gam objects built with weights") data.frame(cint.lwr = predict$fit - quant * predict$se.fit, cint.upr = predict$fit + quant * predict$se.fit) } plotmo.pint.quantregForest <- function(object, newdata, type, level, trace, ...) { q0 <- (1 - level) / 2 # .95 becomes .025 q1 <- 1 - q0 # .975 predict <- predict(object, newdata, quantiles=c(q0, q1)) data.frame(lwr = predict[,1], upr = predict[,2]) } plotmo.pint.earth <- function(object, newdata, type, level, trace, ...) { pints <- predict(object, newdata=newdata, type=type, interval="pint", level=level) if(is.null(newdata)) { cints <- predict(object, newdata=NULL, type=type, interval="cint", level=level) pints$cint.upr <- cints$upr pints$cint.lwr <- cints$lwr } pints } plotmo/R/naken.R0000644000176200001440000001326514663771205013226 0ustar liggesusers# naken.R: # Like naken.collapse but don't collapse a vector of strings into a single string. # # e.g. c("num","sqrt(num)","ord","offset(off)") # becomes c("num","num" "ord", "off") naken <- function(s) { naked <- character(length(s)) for(i in seq_along(s)) naked[i] <- naken.collapse(s[i]) naked } # Collapse s to s single string and then "naken" it # (i.e. return only the variables in the string, separated by "+"). # # e.g. "x1" becomes "x1" # "sqrt(x1)" becomes "x1" # "s(x1,x4,df=4)" becomes "x1+x4" # "sqrt(x1) as.numeric(x4)" becomes "x1" # c("sqrt(x1)", "as.numeric(x4)") becomes "x1" # `x 3` becomes "`x 3`" (variables in backquotes unchanged) naken.collapse <- function(s, warn.if.minus=FALSE) { s <- paste.collapse(s) s.org <- s untouchable <- get.untouchable.for.naken(s) s <- strip.space(untouchable$s) # strip space from everything except untouchables # for "ident" gsubs below if(grepl("--", s, fixed=TRUE)) # '--'causes problems because '-' gets turned to '+' below warning0("Consecutive '-' in formula may cause problems\n Formula:", s.org) # # check for "- ident" in formula (but -1 is ok) # # # commented out because this is invisible to the user, because # # plotmo does not plot the -ident variable # # if(warn.if.minus && grepl("\\- *[._[:alpha:]]", s)[1]) # warnf("plotmo will include the variable prefixed by \"-\" in the formula\n Formula: %s", s) # TODO we can't ignore "-" below because of the paste0(collapse=" + ") later below s <- gsub("[-*/:]", "+", s) # replace - / * : with + # next two gsubs allow us to retain "x=x1" but drop "df=99" from "bs(x=x1, df=99)" s <- gsub("\\(._$[[:alnum:]]+=", "(", s) # replace "(ident=" with "(" s <- gsub("[._$[:alnum:]]+=[^,)]+", "", s) # delete "ident=any" # replace ",ident" with ")+f(ident", thus "s(x0,x1)" becomes "s(x0)f(x1)" s <- gsub(",([._$[:alpha:]])", ")+f(\\1", s) regex <- "[._$[:alnum:]]*\\(" if(grepl(regex, s)) { s <- gsub(regex, "", s) # replace ident( s <- gsub("[,)][^+-]*", "", s) # remove remaining ",arg1,arg2)" } # s is now something like x1+x2, split it on "+" for further processing s <- strsplit(s, "+", fixed=TRUE)[[1]] s <- unique(s) # remove duplicates # remove numbers e.g. sin(x1*x2/12) is nakened to x1+x1+12, we don't want the 12 is.num <- sapply(s, function(x) grepl("^([0-9]|\\.[0-9])", x)) # but keep the intercept if there is one which1 <- which(s == "1") is.num[which1] <- FALSE s <- paste0(s[!is.num], collapse=" + ") replace.untouchable.for.naken(s, untouchable$replacements) } # In the function naken.collapse(), terms such as [string] and `string` # must remain the same (regardless of the enclosed string). # That is, strings in brackets or backquotes must remain untouched. # # This function searches for such terms, replaces them with dummies, and # remembers where they were in the original string (for re-replacement later). # # For example, if s = "x1 + x[,2] + `x 3`" we return: # # out: "x1 + x!00000! + !00001!" # note the dummies !00000! and !00001! # # replacements: # replacement original # "[00000]" "[,2]" # "[00001]" "`x 3`" get.untouchable.for.naken <- function(s) # utility for naken { # for efficiency, check for most common case (no [ or ` in s) if(!grepl("[\\[\`]", s)[1]) return(list(s=s, replacements=NULL)) # no [ or ` in s stopifnot(length(s) == 1) # out and untouchables will be the returned string and table of untouchables # for simplicity, create untouchables as a vec and convert to a mat at the end out <- "" untouchables <- NULL cs <- strsplit(s, split="")[[1]] # split into individual chars for loop efficiency len <- length(cs) i <- 1 while(i <= len) { c <- cs[i] # i==len below is for malformed strings with extra [ or ` on end if((c != "[" && c != "\`") || i == len) # normal character out <- paste0(out, c) else { # char is [ or `, skip to matching ] or ` istart <- i nestdepth <- 0 endchar <- if(c == "[") "]" else "\`" for(i in (istart+1):len) { if(c == "[" && cs[i] == "[") nestdepth <- nestdepth + 1 # nested brackets if(cs[i] == endchar) { if(nestdepth <= 0) break else nestdepth <- nestdepth - 1 } } replacement <- sprint("!%05.5g!", length(untouchables) / 2) out <- paste0(out, replacement) untouchables <- c(untouchables, replacement, substr(s, istart, i)) } i <- i + 1 } if(length(untouchables)== 0) # malformed s="[" or s="`" return(list(s=s, replacements=NULL)) replacements <- matrix(untouchables, byrow=TRUE, ncol=2, nrow=length(untouchables) / 2) colnames(replacements) <- c("replacement", "original") list(s=out, replacements=replacements) } # undo the effect of get.untouchable.for.naken replace.untouchable.for.naken <- function(s, replacements) { for(i in seq_len(NROW(replacements))) s <- gsub(replacements[i, 1], replacements[i, 2], s, fixed=TRUE) s } plotmo/R/gbm.backcompat.R0000644000176200001440000001151514664445173015001 0ustar liggesusers# gbm.backcompat.R: # # TODO change name of this module? this is actually for new functions (not back compat funcs) # # The following functions were added in Oct 2016 for # Paul Metcalfe's changes to gbm (version 2.2 and higher). # # The idea is that we work with both the old and the new gbm models, and # give error messages appropriate to the object (not to an object # converted by to_old_gbm). plotmo.prolog.GBMFit <- function(object, ...) { if(is.null(object$gbm_data_obj)) stop0("use keep_gbm_data=TRUE in the call to gbmt ", "(object$gbm_data_obj is NULL)") # "importance" is a vector of variable indices (column numbers in x), most # important vars first, no variables with relative.influence < 1%. We attach # it to the object to avoid calling summary.gbm twice (it's expensive). attr(object, "plotmo.importance") <- order.GBMFit.vars.on.importance(object) object } order.GBMFit.vars.on.importance <- function(object) { # order=FALSE so importances correspond to orig variable indices importance <- summary(object, plot_it=FALSE, # calls summary.GBMFit order=FALSE, normalize=TRUE)$rel_inf stopifnot(!is.null(importance)) # NA assignment below so order() drops vars with importance < .01 importance[importance < .01] <- NA importance <- order(importance, decreasing=TRUE, na.last=NA) # return a vector of variable indices, most important vars first importance[!is.na(importance)] } plotmo.singles.GBMFit <- function(object, x, nresponse, trace, all1, ...) { plotmo.singles.gbm(object, x, nresponse, trace, all1, ...) } plotmo.pairs.GBMFit <- function(object, ...) { plotmo.pairs.gbm(object, ...) } plotmo.x.GBMFit <- function(object, ...) { plotmo_x_gbm_aux(object$gbm_data_obj$x, object$gbm_data_obj$x_order, object$variables$var_levels) } plotmo.y.GBMFit <- function(object, ...) { plotmo_y_gbm_aux(object$gbm_data_obj$y, object$gbm_data_obj$x_order) } plotmo.predict.GBMFit <- function(object, newdata, type, ..., TRACE) { plotmo.predict.gbm(object, newdata, type, ..., TRACE=TRACE) } gbm.short.distribution.name <- function(obj) { substr(tolower(obj$distribution$name), 1, 2) } gbm.n.trees <- function(obj) { ncol.fit <- NCOL(obj[["fit"]]) stopifnot(ncol.fit >= 1) # paranoia n.trees <- length(obj$trees) / ncol.fit if(!is.null(obj$n.trees)) stopifnot(obj$n.trees == n.trees) # paranoia n.trees } gbm.train.fraction <- function(obj) { train.fraction <- if(is.null(obj$train.fraction)) { # TODO following returns the wrong results # obj$params$train_fraction # TODO work around if(is.null(obj$gbm_data_obj)) stop0("use keep_gbm_data=TRUE in the call to gbmt ", "(obj$gbm_data_obj is NULL)") stopifnot(!is.null(obj$gbm_data_obj$original_data)) train.fraction <- obj$params$num_train / NROW(obj$gbm_data_obj$original_data) # check.numeric.scalar(train.fraction, min=0, max=1) # stopifnot(train.fraction > 0) train.fraction } else obj$train.fraction check.numeric.scalar(train.fraction, min=0, max=1) train.fraction } gbm.bag.fraction <- function(obj) { bag.fraction <- if(is.null(obj$bag.fraction)) obj$params$bag_fraction else obj$bag.fraction check.numeric.scalar(bag.fraction, min=0, max=1) bag.fraction } gbm.cv.folds <- function(obj) { cv.folds <- if(is.null(obj$cv.folds)) obj$cv_folds else obj$cv.folds check.numeric.scalar(cv.folds, min=1, null.ok=TRUE) cv.folds } gbm.train.error <- function(obj) { train.error <- obj$train.error stopifnot(!is.null(train.error)) stopifnot(is.numeric(train.error)) stopifnot(length(train.error) == gbm.n.trees(obj)) train.error } gbm.valid.error <- function(obj) { valid.error <- obj$valid.error if(!is.null(valid.error)) { stopifnot(is.numeric(valid.error)) stopifnot(length(valid.error) == gbm.n.trees(obj)) } valid.error } gbm.oobag.improve <- function(obj) { oobag.improve <- obj$oobag.improve if(!is.null(oobag.improve)) { stopifnot(is.numeric(oobag.improve)) stopifnot(length(oobag.improve) == gbm.n.trees(obj)) } oobag.improve } gbm.cv.error <- function(obj) { cv.error <- if(is.null(obj$cv.error)) obj$cv_error else obj$cv.error if(!is.null(cv.error)) { stopifnot(is.numeric(cv.error)) stopifnot(length(cv.error) == gbm.n.trees(obj)) } cv.error } plotmo/R/gbm.R0000644000176200001440000001144114664447040012667 0ustar liggesusers# gbm.R: plotmo functions for gbm objects # # TODO Add support for plotmo's level argument (quantile regression). plotmo.prolog.gbm <- function(object, object.name, trace, ...) # invoked when plotmo starts { if(is.null(object$data)) # TODO could do more if object had a call component stop0("use keep.data=TRUE in the call to gbm ", "(cannot determine the variable importances)") # "importance" is a vector of variable indices (column numbers in x), most # important vars first, no variables with relative.influence < 1%. We attach # it to the object to avoid calling summary.gbm twice (it's expensive). importance <- order.gbm.vars.on.importance(object) attr(object, "plotmo.importance") <- importance if(trace > 0) cat0("importance: ", paste.trunc(object$var.names[importance], maxlen=120), "\n") object } order.gbm.vars.on.importance <- function(object) { # order=FALSE so importances correspond to orig variable indices importance <- summary(object, plotit=FALSE, # calls summary.gbm order=FALSE, normalize=TRUE)$rel.inf # NA assignment below so order() drops vars with importance < .01 importance[importance < .01] <- NA stopifnot(length(importance) > 0) importance <- order(importance, decreasing=TRUE, na.last=NA) # return a vector of variable indices, most important vars first importance[!is.na(importance)] } plotmo.singles.gbm <- function(object, x, nresponse, trace, all1, ...) { importance <- attr(object, "plotmo.importance") stopifnot(!is.null(importance)) # uninitialized? if(all1) nsingles = length(importance) else # indices of vars with importance >= 1%, max of 10 variables # (10 becauses plotmo.pairs returns 6, total is 16, therefore 4x4 grid) nsingles = min(10, length(importance)) if(nsingles == 0) return(NULL) importance[1: nsingles] } plotmo.pairs.gbm <- function(object, ...) { # pairs of four most important variables (i.e. 6 plots) importance <- attr(object, "plotmo.importance") stopifnot(!is.null(importance)) # uninitialized? # choose npairs so a total of no more than 16 plots (including singles) # npairs=5 gives 10 pairplots, npairs=4 gives 6 pairplots npairs <- if(length(importance) <= 6) 5 else 4 if(npairs == 0) return(NULL) form.pairs(importance[1: min(npairs, length(importance))]) } # following is used by plotmo.x.gbm and plotmo.x.GBMFit plotmo_x_gbm_aux <- function(x, x.order, var.levels) { stopifnot(!is.null(x)) stopifnot(!is.null(x.order) && !is.null(dim(x.order))) stopifnot(!is.null(var.levels) && is.list(var.levels)) # Return the first ntrain rows of the x matrix. The x matrix is stored # with the gbm object as a vector, so we must convert it back to # a data.frame here, one column for each variable. ntrain <- nrow(x.order) if(is.null(dim(x))) # for efficiency (new versions of gbm don't require this) x <- matrix(x, ncol=ncol(x.order)) stopifnot(ncol(x) == ncol(x.order)) x <- data.frame(x[seq_len(ntrain), ]) colnames(x) <- colnames(x.order) # convert numeric columns that are actually factors # TODO this only works correctly if default ordering of factors was used for(i in seq_len(ncol(x))) if(typeof(var.levels[[i]]) == "character") x[[i]] <- factor(x[[i]], labels=var.levels[[i]]) x } # following is used by plotmo.y.gbm and plotmo.y.GBMFit plotmo_y_gbm_aux <- function(y, x.order) { stopifnot(!is.null(y)) stopifnot(!is.null(x.order) && !is.null(dim(x.order))) ntrain <- nrow(x.order) y[seq_len(ntrain)] } plotmo.x.gbm <- function(object, ...) { plotmo_x_gbm_aux(object$data$x, object$data$x.order, object$var.levels) } plotmo.y.gbm <- function(object, ...) { plotmo_y_gbm_aux(object$data$y, object$data$x.order) } plotmo.predict.gbm <- function(object, newdata, type, ..., TRACE) { # TODO I've only tested the distributions listed below although more may work dist <- gbm.short.distribution.name(object) if(!(dist %in% c("ga", "la", "td", "be", "hu", "ad"))) stop0("gbm distribution=\"", object$distribution$name, "\" is not yet supported\n", " (A direct call to plot_gbm may work)") # The following invokes predict.gbm. # predict.gbm doesn't do partial matching on type so we do it here with pmatch. # n.trees is defaulted so first time users can call plotmo(gbm.model) easily. type = match.choices(type, c("link", "response"), "type") n.trees <- gbm.n.trees(object) plotmo.predict.default(object, newdata, type=type, def.n.trees=n.trees, ..., TRACE=TRACE) } plotmo/R/prolog.R0000644000176200001440000000136314663771205013430 0ustar liggesusers# prolog.R: plotmo.prolog functions, called at the start of plotmo and plotres # gets called at the start of plotmo and plotres plotmo.prolog <- function(object, object.name, trace, ...) { trace2(trace, "--plotmo_prolog for %s object %s\n", class.as.char(object), object.name) UseMethod("plotmo.prolog") } plotmo.prolog.default <- function(object, object.name, ...) { # prevent confusing downstream errors by doing an initial check here if(is.null(getCall(object)) && is.null(object[["x"]])) stopf("%s does not have a 'call' field or %s", object.name, if(is.null(object[["y"]])) "'x' and 'y' fields" else "an 'x' field") object } plotmo/R/pre.R0000644000176200001440000000576614663771205012727 0ustar liggesusers# pre.R: plotmo functions for "pre" package plotmo.prolog.pre <- function(object, object.name, trace, ...) # invoked when plotmo starts { # importance is a vector of variable indices, most important vars first importance <- order.pre.vars.on.importance(object, trace) attr(object, "plotmo.importance") <- importance object } order.pre.vars.on.importance <- function(object, trace) { varimps <- try(pre::importance(object, plot=FALSE)$varimps, silent=TRUE) if(is.try.err(varimps)) { cat("\n") warning0("pre::importance(pre.object) failed\n", "(Will plot all variables regardless of importance. Use all2=TRUE to get degree2 plots.)\n") # NULL be will be treated as all vars by plotmo.single.pre, # and as no vars by plotmo.pairs.pre. return(NULL) } stopifnot(is.data.frame(varimps)) if(NROW(varimps) == 0) { # based on code in importance function in pre.R warning0("importance(pre.object)$varimps is empty") return(NULL) } stopifnot(!is.null(varimps$varname)) # following is needed for multiple response models # we get the combined importance across all responses if(is.null(varimps$imp)) varimps$imp <- rowSums(varimps[,-1]) stopifnot(!is.null(varimps$imp)) # discard variables whose importance is less than 1% of max importance varname <- varimps[varimps$imp > .01 * varimps$imp[1], ]$varname # convert variable names to column indices allvarnames <- object$x_names stopifnot(!is.null(allvarnames) && length(allvarnames) > 0) # paranoia importance <- match(varname, allvarnames) if(any(is.na(importance) | (importance == 0))) { # sanity check warning0("could not get variable importances\n varname=", paste.c(varname, maxlen=30)) return(NULL) } if(trace > 0) cat0("importance: ", paste.trunc(allvarnames[importance], maxlen=120), "\n") importance # return a vector of var indices, most important vars first } plotmo.singles.pre <- function(object, x, nresponse, trace, all1, ...) { importance <- attr(object, "plotmo.importance") if(all1 || is.null(importance)) return(seq_len(NCOL(x))) # all variables # 10 most important variables # (10 becauses plotmo.pairs returns 6, total is 16, therefore 4x4 grid) importance[seq_len(min(10, length(importance)))] } plotmo.pairs.pre <- function(object, x, ...) { importance <- attr(object, "plotmo.importance") if(is.null(importance)) return(NULL) # importances not available so don't plot any pairs # choose npairs so a total of no more than 16 plots # npairs=5 gives 10 pairplots, npairs=4 gives 6 pairplots npairs <- if(length(importance) <= 6) 5 else 4 form.pairs(importance[1: min(npairs, length(importance))]) } plotmo.pairs.gpe <- function(object, x, nresponse=1, trace=0, all2=FALSE, ...) { return(NULL) # not yet supported because importance(gpe) not supported } plotmo/R/grid.func.R0000644000176200001440000002070414663771205014005 0ustar liggesusers# grid.func: apply grid.levels or grid.func to x (a column from the input x mat) # to get a scalar value for the given background variable get.fixed.gridval <- function(x, pred.name, grid.func, grid.levels) { gridval.method <- "grid.levels" # used only in warning messages gridval <- get.fixed.gridval.from.grid.levels.arg(x, pred.name, grid.levels) if(is.na(gridval)) { # pred.name is not in grid.levels? gridval.method <- "grid.func" if(is.null(grid.func)) { grid.func <- default.grid.func gridval.method <- "default.grid.func" } check.grid.func(grid.func) if(length(x) == 0) # paranoia stop0("length(", pred.name, ") is zero") x <- x[!is.na(x)] if(length(x) == 0) # paranoia stop0("all values of ", pred.name, " are NA") gridval <- try(grid.func(x, na.rm=TRUE), silent=TRUE) } check.fixed.gridval(gridval, gridval.method, x, pred.name) # returns gridval } default.grid.func <- function(x, ...) { if(inherits(x, "integer")) # return median rounded to integer return(as.integer(round(median(x)))) if(inherits(x, "logical")) # return most common value return(median(x) > .5) if(inherits(x, "factor")) { # return most common value lev.names <- levels(x) ilev <- which.max(table(x)) if(is.ordered(x)) return(ordered(lev.names, levels=lev.names)[ilev]) return(factor(lev.names, levels=lev.names)[ilev]) } median(x) # default to median } # Check grid.levels arg passed in by the user. This checks that the names # of the list elements are indeed predictor names. The actual levels will # be checked later in get.fixed.gridval.from.grid.levels.arg. check.grid.levels.arg <- function(x, grid.levels, pred.names) { if(!is.null(grid.levels)) { # null is the default value if(!is.list(grid.levels)) stop0("grid.levels must be a list. ", "Example: grid.levels=list(sex=\"male\")") for(name in names(grid.levels)) { if(nchar(name) == 0) stop0( "All elements of grid.levels must be named\n You have grid.levels=", as.char(grid.levels)) if(!pmatch(name, pred.names, 0)) stop0("illegal variable name '", name, "' in grid.levels") } } } # this returns NA if pred.name is not in grid.levels get.fixed.gridval.from.grid.levels.arg <-function(x, pred.name, grid.levels) { if(is.null(grid.levels)) return(NA) gridval <- NA names.grid.levels <- names(grid.levels) # look for pred.name in the grid.levels list, if found use its value iname <- which(pmatch(names.grid.levels, pred.name, duplicates.ok=TRUE) == 1) if(length(iname) == 0) # no match? return(NA) if(length(iname) > 1) # more than one match? stop0("illegal grid.levels argument (\"", names.grid.levels[iname[1]], "\" and \"", names.grid.levels[iname[2]], "\" both match \"", pred.name, "\")") # a name in grid.levels matches pred.name stopifnot(length(iname) == 1) gridval <- grid.levels[[iname]] if(length(gridval) > 1) stop0("length(", pred.name, ") in grid.levels is not 1") if(is.na(gridval)) stop0(pred.name, " in grid.levels is NA") if(is.numeric(gridval) && !all(is.finite(gridval))) stop0(pred.name, " in grid.levels is infinite") if(is.factor(x)) { lev.name <- grid.levels[[iname]] if(!is.character(lev.name) || length(lev.name) != 1 || !nzchar(lev.name)) stop0("illegal level for \"", pred.name, "\" in grid.levels ", "(specify factor levels with a string)") lev.names <- levels(x) ilev <- pmatch(lev.name, lev.names, 0) if(ilev == 0) stop0("illegal level \"", lev.name, "\" for \"", pred.name, "\" in grid.levels (allowed levels are ", quotify(lev.names), ")") gridval <- if(is.ordered(x)) ordered(lev.names, levels=lev.names)[ilev] else factor(lev.names, levels=lev.names)[ilev] } # do type conversions for some common types # (e.g. allow 3 instead of 3L for integer variables) class.gridval <- class(gridval)[1] class.x <- class(x)[1] if(class.gridval != class.x) { if(class.gridval == "numeric" && class.x == "integer") gridval <- as.integer(round(gridval)) else if(class.gridval == "integer" && class.x == "numeric") gridval <- as.numeric(gridval) else if(class.x == "logical") { if(!is.logical(gridval) && !is.numeric(gridval)) stop0("expected a logical value in grid.levels for ", pred.name) gridval <- gridval > .5 } } return(gridval) } check.grid.func <- function(grid.func) { if(!is.function(grid.func)) stop0("'grid.func' is not a function"); formals <- names(formals(grid.func)) # check grid.func signature, we allow argname "na.rm" for mean and median if(length(formals) < 2 || formals[1] != "x" || (!any(formals == "na.rm") && formals[2] != "...")) stop0("The formal arguments of 'grid.func' should be 'x' and '...'\n", " Your 'grid.func' has ", if(length(formals) == 0) "no formal arguments" else if(length(formals) == 1) "a single formal argument " else "formal arguments ", if(length(formals) > 0) paste0("'", formals, "'", collapse=" ") else "") } check.fixed.gridval <- function(gridval, gridval.method, x, pred.name) { if(is.try.err(gridval)) { if(inherits(x, "logical") || inherits(x, "factor")) warning0(gridval.method, " failed for ", pred.name, ", so will use the most common value of ", pred.name) else warning0(gridval.method, " failed for ", pred.name, ", so will use the default grid.func for ", pred.name) gridval <- default.grid.func(x) } if(length(gridval) != 1) { warning0(gridval.method, " returned multiple values for ", pred.name, ", so will use the default grid.func for ", pred.name) gridval <- default.grid.func(x) # revert to default.grid.func } if(is.na(gridval)) { warning0(gridval.method, " returned NA for ", pred.name, ", so will use the default grid.func for ", pred.name) gridval <- default.grid.func(x) # revert to default.grid.func } # possibly type convert gridval class.gridval <- class(gridval)[1] if(class.gridval != class(x)[1]) { if(inherits(x, "integer")) # silently fix so e.g. grid.func=mean works gridval <- as.integer(round(median(gridval))) else if(inherits(x, "logical")) { # silently fix if possible if(!is.logical(gridval) && !is.numeric(gridval)) stop0("expected a logical value in grid.levels for ", pred.name) gridval <- gridval > .5 } else if(inherits(x, "factor")) { warning0(gridval.method, " returned class \"", class.gridval, "\" for ", pred.name, ", so will use the most common value of ", pred.name) gridval <- default.grid.func(x) } else { warning0(gridval.method, " returned class \"", class.gridval, "\" for ", pred.name, ", so will use the default grid.func for ", pred.name) gridval <- default.grid.func(x) } } gridval } # this retunrs NA if pred.name is not in grid.levels get.fixed.gridval.for.partdep <- function(x, ipred, pred.name, grid.levels) { gridval <- get.fixed.gridval.from.grid.levels.arg(x, pred.name, grid.levels) # common type conversions were already done in get.fixed.gridval.from.grid.levels.arg # check here if that wasn't possible if(!is.na(gridval)[1] && class(gridval)[1] != class(x)[1]) stop0("the class \"", class(gridval)[1], "\" of \"", pred.name, "\" in grid.levels does not match its class \"", class(x)[1], "\" in the input data") gridval } plotmo/R/fitted.R0000644000176200001440000000407614747633354013416 0ustar liggesusers# fitted.R: plotmo functions for getting the fitted data for an arbitrary model # Like fitted() but will get fitted response even if not already with object. # Returns an n x 1 matrix (unless nresponse=NULL then returns an n x q dataframe?). # The returned columns may not be named. # The type and dots args are used if the call to fitted(object) fails. plotmo_fitted <- function(object, trace, nresponse, type, ...) { if(!is.null(nresponse)) check.integer.scalar(nresponse, min=1, na.ok=TRUE, logical.ok=FALSE, char.ok=TRUE) fitted <- try(call.dots(stats::fitted, DROP="*", KEEP="PREFIX", # following prevents reprint of fitted msg if fail TRACE=if(trace <= 0) -1 else (trace >= 2 || trace.call.global), force.object=object, ...), silent=trace <= 1) if(!is.try.err(fitted) && !is.null(fitted)) { # if(trace.call.global >= 1 && trace < 2) # print_summary(fitted, "fitted is ", details=-1) temp <- process.y(fitted, object, type, nresponse, expected.len=NULL, expected.levs=NROW(fitted), trace, "fitted(object)") fitted <- temp$y } else { # fitted(object) failed if(trace >= 1) printf("fitted() was unsuccessful, will use predict() instead\n") type <- plotmo_type(object, trace, "plotmo", type, ...) # we have already printed call to predict so clear trace flag # (this is dependent on the sequence of calls in plotmo_meta) assignInMyNamespace("trace.call.global", 0) temp <- plotmo_predict(object, newdata=NULL, nresponse, type, expected.levs=NULL, trace=trace, inverse.func=NULL, ...) fitted <- temp$yhat trace2(trace, "got fitted values by calling predict (see above)\n") } if(!is.null(colnames(fitted))) colnames(fitted) <- sub(".*\\$", "", colnames(fitted)) # trees$Volume to Volume list(fitted = fitted, # n x 1 numeric unless nresponse=NULL resp.levs = temp$resp.levs) } plotmo/R/plot_gbm.R0000644000176200001440000003404514663771205013734 0ustar liggesusers# plot_gbm.R: plot gbm models # # This code is derived from code in gbm 2.1.1 (Aug 2016). # # TODO when selecting best n.trees, why is OOB smoothed but not test or CV? # TODO maybe add arg to rescale errs e.g. RSquared rather than Squared Error # TODO add right hand axis for OOB, or scale OOB to same units when possible? # TODO if gbm calculated CV stddev across folds then we could plot CV conf bands plot_gbm <- function(object=stop("no 'object' argument"), smooth = c(0, 0, 0, 1), col = c(1, 2, 3, 4), ylim = "auto", legend.x = NULL, legend.y = NULL, legend.cex = .8, grid.col = NA, n.trees = NA, col.n.trees ="darkgray", ...) { # GBMFit was added in Oct 2016 for Paul Metcalfe's changes to gbm (version 2.2) check.classname(object, "object", c("gbm", "GBMFit")) obj <- object if((!is.numeric(smooth) && !is.logical(smooth)) || any(smooth != 0 & smooth != 1)) stop0("smooth should be a four-element vector specifying if train, ", "test, CV, and OOB curves are smoothed, e.g. smooth=c(0,0,0,1)") smooth <- rep_len(smooth, 4) # recycle smooth if necessary col <- rep_len(col, 4) # recycle col if necessary col[is.na(col)] <- 0 # make using col below a bit easier check.integer.scalar(n.trees, min=1, max=n.trees, na.ok=TRUE, logical.ok=FALSE) n.alltrees = gbm.n.trees(obj) # final.max is max of values on the right of the curves (excluding OOB) train.error <- gbm.train.error(obj) valid.error <- gbm.valid.error(obj) cv.error <- gbm.cv.error(obj) final.max <- max(train.error[length(train.error)], valid.error[length(valid.error)], cv.error [length(cv.error)], na.rm=TRUE) if(any1(col)) { # must anything be plotted? par <- par("mar", "mgp") # will be modified in init.gbm.plot on.exit(par(mar=par$mar, mgp=par$mgp)) init.gbm.plot(obj, ylim, final.max, par$mar, ...) if(is.specified(grid.col[1])) grid(col=grid.col[1], lty=3) # draw n.trees vertical gray line first, so other plots go on top of it if(is.specified(n.trees)) vertical.line(n.trees, col.n.trees, 1, 0) } leg.text <- leg.col <- leg.lty <- leg.vert <- leg.imin <- NULL # for legend voffset <- 0 # slight offset to prevent overplotting of dotted vertical lines # train curve y <- maybe.smooth(train.error, "train", smooth[1], n.alltrees) imin <- which.min1(y) # index of minimum train error imins <- c(imin, 0, 0, 0) # index of train, test, CV, OOB minima names(imins) <- c("train", "test", "CV", "OOB") train.fraction <- gbm.train.fraction(obj) if(is.specified(col[1])) { lines(y, col=col[1]) leg.text <- c(leg.text, if(train.fraction == 1) "train" else sprint("train (frac %g)", train.fraction)) leg.col <- c(leg.col, col[1]) leg.lty <- c(leg.lty, 1) leg.vert <- c(leg.vert, FALSE) leg.imin <- imin } # test curve (aka valid.error curve) if(train.fraction != 1) { y <- maybe.smooth(valid.error, "test", smooth[2], n.alltrees) imin <- imins[2] <- which.min1(y) if(is.specified(col[2])) { if(imin) vertical.line(imin, col[2], 3, voffset) voffset <- voffset + 1 lines(y, col=col[2]) leg.text <- c(leg.text, if(!imin) "test not plotted" else sprint("test (frac %g)", 1-train.fraction)) leg.col <- c(leg.col, col[2]) leg.lty <- c(leg.lty, 1) leg.vert <- c(leg.vert, FALSE) leg.imin <- c(leg.imin, imin) } } # CV curve if(!is.null(cv.error)) { y <- maybe.smooth(cv.error, "CV", smooth[3], n.alltrees) imin <- imins[3] <- which.min1(y) if(is.specified(col[3])) { if(imin) vertical.line(imin, col[3], 3, voffset) voffset <- voffset + 1 lines(y, col=col[3]) leg.text <- c(leg.text, if(!imin) "CV not plotted" else sprint("CV (%g fold)", gbm.cv.folds(obj))) leg.col <- c(leg.col, col[3]) leg.lty <- c(leg.lty, 1) leg.vert <- c(leg.vert, FALSE) leg.imin <- c(leg.imin, imin) } } # OOB curve bag.fraction <- gbm.bag.fraction(obj) if(bag.fraction != 1) { oobag.improve <- gbm.oobag.improve(obj) y <- maybe.smooth(-cumsum(oobag.improve), "OOB", smooth[4], n.alltrees) imin <- imins[4] <- which.min1(y) if(is.specified(col[4])) { if(imin) draw.oob.curve(y, imin, voffset, col[4], smooth, train.error) voffset <- voffset + 1 leg.text <- c(leg.text, if(!imin) "OOB not plotted" else "OOB (rescaled)") leg.col <- c(leg.col, col[4]) leg.lty <- c(leg.lty, 2) leg.vert <- c(leg.vert, FALSE) leg.imin <- c(leg.imin, imin) } } # legend entry for vertical line at n.trees if(is.specified(n.trees)) { leg.text <- c(leg.text, "predict n.trees") leg.col <- c(leg.col, col.n.trees) leg.lty <- c(leg.lty, 1) leg.vert <- c(leg.vert, TRUE) leg.imin <- c(leg.imin, n.trees) } if(any1(col)) { # was anything plotted? box() # replot box because vertical.line overplots it slightly gbm.legend(legend.x, legend.y, legend.cex, leg.text, leg.col, leg.lty, leg.vert, leg.imin) gbm.top.labels(leg.imin, leg.text, leg.col) } invisible(imins) } init.gbm.plot <- function(obj, ylim, final.max, mar, ...) { xlim <- dota("xlim", ...) # get xlim from dots, NA if not in dots n.alltrees <- gbm.n.trees(obj) if(!is.specified(xlim)) xlim <- c(0, n.alltrees) xlim <- fix.lim(xlim) ylim <- get.gbm.ylim(obj, xlim, ylim, final.max) ylab <- get.gbm.ylab(obj) # set mar[3] space for top labels and possibly (user-specified) main main <- dota("main", ...) # get main from dots, NA if not in dots nlines.needed.for.main <- if(is.specified(main)) nlines(main) + .5 else 0 par(mar=c(mar[1], mar[2], max(mar[3], nlines.needed.for.main + 1), mar[4])) par(mgp=c(1.5, .4, 0)) # squash axis annotations # Call graphics::plot but drop args in dots that aren't graphics args # or formal args of graphics::plot. # If argname below is prefixed with force. then ignore any such arg in dots. # Any argname below prefixed with def. can be overridden by a user arg in dots. # force.main="" because we add (user-specified) main manually because top labels. train.error <- gbm.train.error(obj) call.plot(graphics::plot, force.x=1:n.alltrees, force.y=train.error, force.type="n", force.main="", force.xlim=xlim, def.ylim=ylim, def.xlab="Number of Trees", def.ylab=ylab, ...) if(is.specified(main)) mtext(main, side=3, line=1.3, cex=par("cex")) # above top labels } get.gbm.ylim <- function(obj, xlim, ylim, final.max) { train.error <- gbm.train.error(obj) valid.error <- gbm.valid.error(obj) cv.error <- gbm.cv.error(obj) if(is.character(ylim) && substr(ylim[1], 1, 1) == "a") { # auto ylim? imin <- max(1, min(1, xlim[1])) imax <- min(length(train.error), max(length(train.error), xlim[2])) cv.error <- gbm.cv.error(obj) ylim <- range(train.error[imin:imax], valid.error[imin:imax], cv.error [imin:imax], na.rm=TRUE) # decrease ylim[2] to put more resolution in the "interesting" # part of the curve by putting final.max half way up plot ylim[2] <- ylim[1] + 2 * (final.max - ylim[1]) # ensure 75% of training curve is visible # (typically needed when no test or CV curve) i <- floor(xlim[1] + .25 * (xlim[2] - xlim[1])) if(i >= 1 && i <= length(train.error[imin:imax])) ylim[2] <- max(ylim[2], train.error[i]) } else if(!is.specified(ylim)) # ylim=NULL or ylim=NA ylim <- range(train.error, valid.error, cv.error, na.rm=TRUE) fix.lim(ylim) } get.gbm.ylab <- function(obj) { dist <- gbm.short.distribution.name(obj) if(dist =="pa") # pairwise switch(obj$distribution$metric, conc="Fraction of Concordant Pairs", ndcg="Normalized Discounted Cumulative Gain", map ="Mean Average Precision", mrr ="Mean Reciprocal Rank", stop0("unrecognized pairwise metric: ", obj$distribution$metric)) else # not pairwise switch(dist, ga="Squared Error Loss", # gaussian la="Absolute Loss", # laplace td="t-distribution deviance", be="Bernoulli Deviance", # logistic hu="Huberized Hinge Loss", mu="Multinomial Deviance", ad="Adaboost Exponential Bound", ex="Exponential Loss", po="Poisson Deviance", co="Cox Partial Deviance", qu="Quantile Loss", stop0("unrecognized distribution name: ", obj$distribution.name)) } vertical.line <- function(x, col=1, lty=1, voffset=0) # draw a vertical line at x { if(is.specified(col)) { usr <- par("usr") # xmin, xmax, ymin, ymax range <- usr[4] - usr[3] lwd <- 1 if(lty == 3) { # dotted line? # increase lwd to make dotted lines more visible lwd <- min(1.5, 2 * par("cex")) # small vertical offset so multiple dotted lines at same xpos visible voffset <- 0.008 * voffset * range } else voffset <- 0 lines(x=c(x, x), y=c(usr[3], usr[4]) - voffset, col=col, lty=lty, lwd=lwd) lines(x=c(x, x), y=c(usr[3], usr[3] + .02 * range), col=col, lty=1) # tick } } # this returns a single NA if y has non finite values maybe.smooth <- function(y, yname, must.smooth, n.alltrees) { if(any(!is.finite(y))) { # infinities in OOB curve occur with distribution="huberized" warning0("plot_gbm: cannot plot ", yname, " curve (it has some non-finite values)") return(NA) } if(must.smooth) { x <- 1:n.alltrees if(n.alltrees < 10) # loess tends to fail for small n.alltrees, use lowess instead y <- lowess(x, y)$y else # use loess for compatibility with gbm y <- loess(y~x, na.action=na.omit, # paranoia, prevent warnings from loess # enp.target is the same as gbm.perf for compatibility # (this does only minimal smoothing) enp.target=min(max(4, n.alltrees/10), 50))$fitted } y } which.min1 <- function(x) # like which.min but return 0 if x is all NA { if(all(is.na(x))) return(0) which.min(x) } draw.oob.curve <- function(y, imin, voffset, col, smooth, train.error) { stopifnot(!is.na(imin)) vertical.line(imin, col, 3, voffset) # rescale y to fit into plot usr <- par("usr") # xmin, xmax, ymin, ymax y <- y - min(y) y <- y / max(y) # y is now 0..1 e <- train.error n <- length(e) # start and end of OOB curve same as 10% into train curve and end train curve y <- e[n] + (e[max(1, 0.1 * n)] - e[n]) * y lines(1:n, y, col=col, lty=2) } gbm.legend <- function(legend.x, legend.y, legend.cex, leg.text, leg.col, leg.lty, leg.vert, leg.imin) { xjust <- 0 usr <- par("usr") # xmin, xmax, ymin, ymax if(is.null(legend.y)) legend.y <- usr[3] + .65 * (usr[4] - usr[3]) if(is.null(legend.x)) { # Automatically position the legend just to the left of the # leftmost vertical line that is to the right of .7 * usr[2]. # Hopefully that puts it not on top of anything interesting. xjust <- 1 imin <- c(usr[2], leg.imin[which(leg.imin > usr[1] + .7 * (usr[2]-usr[1]))]) legend.x <- min(imin) - .05 * (usr[2] - usr[1]) legend.y <- usr[4] - .05 * (usr[4] - usr[3]) } if(is.specified(legend.x)) elegend(x=legend.x, y=legend.y, legend=leg.text, col=leg.col, lty=leg.lty, vert=leg.vert, # vert is supported by elegend but not by legend bg="white", cex=legend.cex, xjust=xjust, yjust=xjust) } # print the best number-of-trees for each curve along the top of the plot gbm.top.labels <- function(leg.imin, leg.text, leg.col) { # don't print number-of-trees for the training curve stopifnot(substring(leg.text[1], 1, 5) == "train") leg.col[1] <- 0 # darker than darkgray seems needed for top text # to be perceived as darkgray, not sure why leg.col[leg.col == "darkgray"] <- lighten("darkgray", -0.1) usr <- par("usr") # xmin, xmax, ymin, ymax # TODO spread.labs is buggy for horizontal labels (too much space sometimes)? x <- spread.labs(leg.imin,mindiff=par("cex") * max(strwidth(paste0(leg.imin, " "))), min=usr[1], max=usr[2]) # use of "ok" prevents display off the right or left of the plot # (necessary if user specifies xlim) # check against leg.imin is for when which.lim1(NA) returns 0 margin <- .05 * (usr[2] - usr[1]) ok <- (x > usr[1] - margin) & (x < usr[2] + margin) & (leg.imin != 0) if(any(ok)) text(x=x[ok], # this call to text works with call to text in init.gbm.plot y=usr[4] + .4 * strheight("X"), # just above plot labels=leg.imin[ok], col=leg.col[ok], adj=c(.5, 0), # x is middle of text, y is bottom of text xpd=NA) # allow plotting out the plot area } plotmo/R/do.par.R0000644000176200001440000002104714663771205013312 0ustar liggesusers# do.par.R: functions setting par() and for setting the overall caption # main1 is not called main else would clash with main passed in dots (which # we ignore but cause an error message). Likewise for xlab1 and ylab1. do.par <- function(..., nfigs, caption, main1, xlab1, ylab1, trace, nlines.in.main=if(is.specified(main1)) nlines(main1) else 1, def.cex.main=1, def.font.main=2, # use 1 for compat with plot.lm def.right.mar=.8) { nrows <- ceiling(sqrt(nfigs)) # Note that the plain old cex argument is used in plotmo only in par() # (but we also query it later using par("cex")). # We use plain old cex relative to the cex calculated by nrows (so passing # cex=1 to plotmo causes no changes, and cex=.8 always makes things smaller). # TODO cex.axis etc. should be treated in the same way # TODO consider moving this into the dotargs functions, also extend for cex.axis, cex.main plain.old.cex <- dota("cex", DEF=1, ...) check.numeric.scalar(plain.old.cex) cex <- if(nrows == 1) 1 else if(nrows == 2) .83 else if(nrows >= 3) .66 cex <- plain.old.cex * cex # set oma to make space for caption if necessary stopifnot.string(caption, allow.empty=TRUE, null.ok=TRUE) def.oma <- dota("oma", ...) if(!is.specified(def.oma)) { def.oma <- par("oma") def.oma[3] <- max(def.oma[3], # .333 to limit cex adjustmment 2 + (plain.old.cex^.333 * nlines(caption))) } cex.lab <- dota("cex.lab", # make the labels small if multiple figures DEF=if(def.cex.main < 1) .8 * def.cex.main else 1, ...) mgp <- # compact title and axis annotations if(cex.lab < .6) c(1, 0.2, 0) else if(cex.lab < .8) c(1, 0.25, 0) else c(1.5, 0.4, 0) # margins are small to pack plots in, but make bigger if xlab # or ylab specified (note that xlab or ylab equal to NULL means # that we will later auto generate them) mar <- c( if(is.null(xlab1) || (is.specified(xlab1) && any(nzchar(xlab1)))) 4 else 3, # bottom if(is.null(ylab1) || (is.specified(ylab1) && any(nzchar(ylab1)))) 3 else 2, # left 1.2 * nlines.in.main, # top def.right.mar) # right if(nrows >= 5) # small margins if lots of figures mar <- cex * mar trace2(trace, "\n") call.dots(graphics::par, DROP="*", # drop everything KEEP="PREFIX,PAR.ARGS", # except args matching PREFIX and PAR.ARGS TRACE=if(trace >= 2) trace-1 else 0, SCALAR=TRUE, def.mfrow = c(nrows, nrows), def.mgp = mgp, # compact title and axis annotations def.tcl = -.3, # shorten tick length def.font.main = def.font.main, def.mar = mar, def.oma = def.oma, def.cex.main = def.cex.main, # ignored by most plot funcs so do it here def.cex.lab = cex.lab, def.cex.axis = cex.lab, force.cex = cex, # last, overrides any cex set by any arg above ...) # any remaining graphic dot args are also processed } # call do.par on any graphics args in dots, and return a list of their # old values so the caller can use on.exit to restore them do.par.dots <- function(..., trace=0) { dots <- match.call(expand.dots=FALSE)$... if(length(dots) == 0) return(NULL) oldpar <- args <- list() env <- parent.frame() for(dotname in PAR.ARGS) if(is.dot(dotname, ...)) { arg <- list(par(dotname)) names(arg) <- dotname oldpar <- append(oldpar, arg) dot.org <- dota(dotname, ...) dot <- try(eval(dot.org, envir=env, enclos=env), silent=TRUE) if(is.try.err(dot)) dot <- dot.org # TODO consider moving this into the dotargs functions, also extend for cex.axis, cex.main # special handling for cex args: we want cex to be relative # to the current setting, so e.g cex=1 causes no change if(substr(dotname, 1, 3) == "cex") { olddot <- par(dotname) dot <- dot[[1]] * olddot } else if(!(dotname %in% PAR.VEC) && length(dot) != 1) dot <- dot[[1]] # similar to handling of argument "scalar" in eval.dotlist arg <- list(dot) names(arg) <- dotname args <- append(args, arg) } if(length(args)) { if(trace >= 2) printf.wrap("\npar(%s)\n", list.as.char(args)) do.call(par, args) } oldpar # a list of old values of args that were changed, empty if none } check.do.par <- function(do.par, nfigs) # auto do.par if null, check is 0,1, or 2 { if(is.null(do.par)) do.par <- nfigs > 1 if(is.logical(do.par)) do.par <- as.numeric(do.par) stopifnot(length(do.par) == 1) if(!is.numeric(do.par) || (do.par != 0 && do.par != 1 &&do.par != 2)) stop0("do.par must be 0, 1, or 2") do.par } auto.caption <- function(caption, resp.name, type, model.call, object.name, my.call) { sresponse <- stype <- smodel <- scaption <- smy.call <- "" if(!is.null(caption)) scaption <- sprint("%s ", caption) # the test against "y" is because "y" may just be a fabricated # name created because the actual name was not available if(!is.null(resp.name) && resp.name != "y") sresponse <- paste0(resp.name, " ") if(type != "response") stype <- paste0("type=", type, " ") if(!is.null(model.call)) { smodel <- strip.deparse(model.call) smodel <- sub("\\(formula=", "(", smodel) # delete formula= } else smodel <- paste0("model: ", object.name) s <- paste0(scaption, sresponse, stype, smodel) smy.call <- process.my.call.for.caption(my.call) if(nzchar(smy.call)) s <- paste0(s, if(nzchar(s)) "\n" else "", smy.call) s } # Call this only after a plot is on the screen to avoid # an error message "plot.new has not been called yet" draw.caption <- function(caption, ...) { if(!is.null(caption) && any(nzchar(caption))) { # allow use of dot args for caption specs cex <- dota("caption.cex cex.caption", DEF=1, NEW=1, ...) font <- dota("caption.font font.caption", DEF=1, NEW=1, ...) col <- dota("caption.col col.caption", DEF=1, NEW=1, ...) line <- dota("caption.line", DEF=1, ...) # trim so caption fits # strwidth doesn't have units of device coords so work with usr coords # TODO the algorithm below is not quite correct caption <- strsplit(caption, "\n")[[1]] usr <- par("usr") # xmin, xmax, ymin, ymax n <- par("mfrow")[2] # number of figures horizontally across page avail <- .7 * n * (usr[2] - usr[1]) strwidth <- max(strwidth(caption)) if(strwidth > avail) { which <- strwidth(caption) > avail max <- max(nchar(caption)) max.nchar <- max * avail / strwidth if(max.nchar < max) { # TODO should always be FALSE but actually isn't caption <- substr(caption, 1, max.nchar) caption[which] <- paste0(caption[which], "...") } } caption <- paste(caption, collapse="\n") mtext(text=caption, line=line, outer=TRUE, cex=cex * par("cex")^.333, col=col, font=font) } caption } get.caption <- function(nfigs, do.par, caption, resp.name, type, model.call, object.name, my.call) { stopifnot.string(caption, null.ok=TRUE, allow.empty=TRUE) if(nfigs > 1 && do.par && (is.null(caption) || !is.null(my.call))) auto.caption(caption, resp.name, type, model.call, object.name, my.call) else paste0(if(is.null(caption)) "" else caption, if(!is.null(caption) && !is.null(my.call)) "\n" else "", if(!is.null(my.call)) "" else process.my.call.for.caption(my.call)) } process.my.call.for.caption <- function(my.call) { s <- "" if(!is.null(my.call)) { s <- sub("\\(object=", "(", my.call) # delete object= s <- sub(", trace=[-._$[:alnum:]]+", "", s) # delete trace=xxx s <- sub(", SHOWCALL=[-._$[:alnum:]]+", "", s) # delete SHOWCALL=xxx } s # a string, may be "" } plotmo/R/grid.R0000644000176200001440000002417514663771205013061 0ustar liggesusers# grid.R: functions for creating the grid of values to be plotted in plotmo graphs # Get the x matrix (actually a data.frame) with median values (or first level # for factors), ngrid1 rows, all rows identical, nrow(xgrid) is ngrid1. get.degree1.xgrid <- function(x, grid.func, grid.levels, pred.names, ngrid1) { stopifnot(!is.null(pred.names)) check.grid.levels.arg(x, grid.levels, pred.names) xgrid <- data.frame(matrix(0, ngrid1, ncol(x), byrow=TRUE)) for(ipred in seq_len(ncol(x))) xgrid[[ipred]] <- get.fixed.gridval(x[[ipred]], pred.names[ipred], grid.func, grid.levels) warn.if.not.all.finite(xgrid, "'xgrid' for degree1 plots") colnames(xgrid) <- pred.names xgrid } # Update xgrid for the predictor currently being plotted. # That is, replace this predictor's column with a range of values. # For factors or discrete variables, we shorten the frame to match the nbr of levels. get.degree1.xframe <- function(xgrid, x, ipred, ngrid1, ndiscrete, ux.list, extend, mean) { x1 <- x[[ipred]] # uxlist is a list, each elem is the unique levels for corresponding column of x u1 <- ux.list[[ipred]] if(is.factor(x1) && length(u1) > ngrid1) stop0("ngrid1=", ngrid1, " is less than the number ", "of levels ", length(u1), " in '", colnames(x)[ipred], "'\n Workaround: call plotmo with ngrid1=", length(u1)) if(is.factor(x1) || is.logical(x1) || length(u1) <= ndiscrete) { levels <- get.all.levs(x1, u1) xframe <- xgrid[1:length(levels), , drop=FALSE] # shorten xframe xframe[[ipred]] <- levels } else { xframe <- xgrid xrange <- range1(x1) if(extend != 0) { # extend the range of x (TODO consider allowing extend with discrete vars) stopifnot(xrange[2] >= xrange[1]) ext <- extend * (xrange[2] - xrange[1]) xrange[1] <- xrange[1] - ext xrange[2] <- xrange[2] + ext } xval <- seq(from=xrange[1], to=xrange[2], length.out=ngrid1) # # following commented out because it causes cliffs to slope more than necessary # # e.g. test.fac.R plotmo(rpart(survived ~ pclass.num+parch.int, data=et)) # if(is.integer(x1)) { # xval <- unique(as.integer(xval)) # if(length(xval) < ngrid1) # xframe <- xframe[1:length(xval), , drop=FALSE] # shorten xframe # } xframe[[ipred]] <- xval } xframe } # We want to display discrete variables in degree1 plots as quantized. # (Factors get handled elsewhere.) So if a variable is discrete, then # modify the xframe and yhat to do so. For example, an xframe that was # # pclass yhat # 1 1.1 # 2 2.2 # 3 3.3 # # becomes # # pclass yhat # 1.0 1.1 # 1.5 1.1 # 1.5 2.2 # 2.5 2.2 # 2.5 3.3 # 3.0 3.3 blockify.degree1.frame <- function(xframe, yhat, intervals, ipred, ux.list, ndiscrete) { u1 <- ux.list[[ipred]] # TODO the integral check is necessary for compatibility with blockify.degree2.frame # (the code here can handle non integers but the code in blockify.degree2.frame can't) if(length(u1) <= ndiscrete && !is.factor(xframe[[ipred]]) && !inherits(u1, "Date") && is.integral(u1)) { # discrete, so duplicate each elem in yhat yhat <- rep(yhat, each=2) if(!is.null(intervals)) { new.intervals <- data.frame( lwr = rep(intervals$lwr, each=2), upr = rep(intervals$upr, each=2)) if(!is.null(intervals$fit)) new.intervals$fit <- rep(intervals$fit, each=2) if(!is.null(intervals$cint.lwr)) { new.intervals$cint.lwr <- rep(intervals$cint.lwr, each=2) new.intervals$cint.upr <- rep(intervals$cint.upr, each=2) } intervals <- new.intervals } # duplicate each row of xframe, except the first and last row xframe <- xframe[rep(seq_len(nrow(xframe)), each=2), , drop=FALSE] if(nrow(xframe) >= 4) { x1 <- xframe[[ipred]] for(i in seq(2, length(x1)-1, by=2)) x1[i] <- x1[i+1] <- (x1[i] + x1[i+1]) / 2 xframe[[ipred]] <- x1 } } list(xframe=xframe, yhat=yhat, intervals=intervals) } # Get the x matrix (actually a data.frame) to plot in degree2 plots. # Each row of xgrid is identical (the medians). get.degree2.xgrid <- function(x, grid.func, grid.levels, pred.names, ngrid2) { check.grid.levels.arg(x, grid.levels, pred.names) xgrid <- list(ncol(x)) for(ipred in seq_len(ncol(x))) xgrid[[ipred]] <- get.fixed.gridval(x[[ipred]], pred.names[ipred], grid.func, grid.levels) warn.if.not.all.finite(xgrid, "'xgrid' for degree2 plots") xgrid <- as.data.frame(xgrid) colnames(xgrid) <- pred.names xgrid[seq_len(ngrid2^2), ] <- xgrid xgrid } # Update xgrid for the predictor pair currently being plotted (ipred1 # and ipred2 are column numbers in x). That is, replace two columns # with a range of values. # # This will also shorten xgrid if possible (i.e. if predictor is discrete # with number of discrete values less than ngrid2, typically because # predictor is a factor.) This shortening is for efficiency later, # because it means we avoid duplicate cases in xgrid. get.degree2.xframe <- function(xgrid, x, ipred1, ipred2, ngrid2, xranges, ux.list, ndiscrete) { ret1 <- get.degree2.xframe.aux(xgrid, x, ipred1, ngrid2, xranges, ux.list, ndiscrete) ret2 <- get.degree2.xframe.aux(xgrid, x, ipred2, ngrid2, xranges, ux.list, ndiscrete) # pack x1grid and x2grid into xgrid if(ret1$n != ngrid2 || ret2$n != ngrid2) xgrid <- xgrid[1:(ret1$n * ret2$n), , drop=FALSE] # shorten xgrid xgrid[[ipred1]] <- ret1$xgrid # will recycle xgrid[[ipred2]] <- rep(ret2$xgrid, each=ret1$n) list(xframe=xgrid, x1grid=ret1$xgrid, x2grid=ret2$xgrid) } get.degree2.xframe.aux <- function(xgrid, x, ipred1, ngrid2, xranges, ux.list, ndiscrete) { n1 <- ngrid2 # will change if ipred1 is discrete u1 <- ux.list[[ipred1]] nlevs1 <- length(u1) if(is.factor(x[[ipred1]]) && nlevs1 > ngrid2) stop0("ngrid2=", ngrid2, " is less than the number", " of levels ", nlevs1, " in '", colnames(x)[ipred1], "'\n Workaround: call plotmo with ngrid2=", length(u1)) x1 <- x[[ipred1]] x1grid <- if(is.factor(x1) || is.logical(x1) || nlevs1 <= ndiscrete) { # discrete? n1 <- nlevs1 x1grid <- get.all.levs(x1, u1) } else seq(from=xranges[1,ipred1], to=xranges[2,ipred1], length.out=ngrid2) if(is.integer(x1)) { x1grid <- unique(as.integer(x1grid)) n1 <- length(x1grid) } list(xgrid=x1grid, n=n1) } # we want to draw discrete variables in persp and contour plots using "blocks" blockify.degree2.frame <- function(x, yhat, x1grid, x2grid, ipred1, ipred2, ux.list, ndiscrete) { is.discrete2 <- function(ipred, x1grid) { if(is.factor(x[[ipred]])) return(TRUE) u1 <- ux.list[[ipred]] # the integral check is necessary with the current # implementation which adds/subtracts a hardcoded .499 # TODO make this like blockify.degree1.frame (which can handle non integers) length(u1) <= ndiscrete && is.integral(x1grid) } if(is.discrete2(ipred1, x1grid)) { yhat <- rep(yhat, each=2) # duplicate each elem in yhat x1grid <- rep(x1grid, each=2) # duplicate each elem in x1grid is.even <- (1:length(x1grid)) %% 2 == 0 x1grid[!is.even] <- x1grid[!is.even] - .499 # sub .5 from odd elems x1grid[is.even] <- x1grid[is.even] + .499 # add .5 to even elems } if(is.discrete2(ipred2, x2grid)) { # duplicate each block in yhat (each block has n1 elements) y.old <- yhat yhat <- double(2 * length(yhat)) n1 <- length(x1grid) for(i in 1:length(x2grid)) { start <- n1 * (i-1) end <- n1 * i yhat[(2 * start + 1): (2 * end)] <- y.old[(start + 1): end] } x2grid <- rep(x2grid, each=2) # duplicate each elem in x2grid is.even <- (1:length(x2grid)) %% 2 == 0 x2grid[!is.even] <- x2grid[!is.even] - .499 # sub .5 from odd elems x2grid[is.even] <- x2grid[is.even] + .499 # add .5 to even elems } list(yhat=yhat, x1grid=x1grid, x2grid=x2grid) } # if x is a factor # return a factor vector with nlevs elements, e.g. pclass1, pclass2, pclass3. # else # return a vector with all unique values in x, e.g. 1,2,3 or FALSE, TRUE get.all.levs <- function(x, levels) { if(!is.factor(x)) return(levels) # TODO Sanity check, quite expensive, make sure no gaps in factor coding # Could remove this if convert levels to factors in a better way below? range <- range(as.numeric(x), na.rm=TRUE) if(range[1] < 1 || range[2] > length(levels)) stop0("internal error: illegal factor range ", range[1], " ", range[2], " for levels ", quotify(levels)) if(is.ordered(x)) ordered(1:length(levels), labels=levels) else factor(1:length(levels), labels=levels) } # Print the grid values, must do some finagling for a nice display print_grid_values <- function(xgrid, trace) { trace1(trace, "\n") # extra space when tracing row <- xgrid[1, , drop=FALSE] names(row) <- c(paste("plotmo grid: ", names(row)[1]), names(row)[-1]) rownames(row) <- "" print(row) trace1(trace, "\n") } plotmo/R/plotresids.R0000644000176200001440000010713015126335271014307 0ustar liggesusers# plotresids.R plotresids <- function( object, which, info, standardize, level, versus1, id.n, smooth.col, grid.col, jitter, npoints, center, type, fitted, rinfo, rsq, iresids, nversus, colname.versus1, force.auto.resids.xlim, force.auto.resids.ylim, SHOWCALL=NA, # this is here to absorb SHOWCALL from dots ...) { stopifnot(length(which) == 1) info <- check.boolean(info) ok <- which %in% c(W3RESID,W5ABS:W9LOGLOG) if(!all(ok)) stop0("which=", which[!ok][1], " is not allowed") # id.n has already been checked in plotres.data id.indices.specified <- FALSE if(which %in% c(W3RESID, W4QQ:W8CUBE) && id.n != 0) id.indices.specified <- TRUE level <- check.level.arg(level, zero.ok=TRUE) if(which %in% (W5ABS:W9LOGLOG)) level <- 0 # no pints pints <- NULL cints <- NULL level.shade <- dota("level.shade shade.pints", DEF="mistyrose2", ...) level.shade2 <- dota("level.shade2 shade.cints", DEF="mistyrose4", ...) if(which == W3RESID && is.specified(level)) { p <- plotmo.pint(object, newdata=NULL, type, level, trace=0) if(!is.null(p$fit) && max(abs(p$fit - fitted)) != 0) { # TODO $$ happens with test.unusual.vars.R:earth.glm.spaced.bx warning0("Internal inconsistency: p$fit != fitted", if(inherits(object, "earth")) "\n Workaround: no 'glm' arg in call to earth, or no 'level' arg n call to plotres" else "") fitted <- p$fit # hack } if(is.specified(level.shade) && !is.null(p$upr)) { pints <- data.frame(upr=rinfo$scale * (p$upr - fitted), lwr=rinfo$scale * (p$lwr - fitted)) colnames(pints) <- c("upr", "lwr") } if(is.specified(level.shade2) && !is.null(p$cint.upr)) { cints <- data.frame(upr=rinfo$scale * (p$cint.upr - fitted), lwr=rinfo$scale * (p$cint.lwr - fitted)) colnames(cints) <- c("upr", "lwr") } } if(is.null(pints) && is.null(cints)) level <- 0 resids <- rinfo$scale * rinfo$resids if((which %in% W7VLOG:W9LOGLOG)) check.that.most.are.positive( versus1, "fitted", sprint("which=%d", which), "nonpositive") # TODO following is redundant after above check? # abs(resids) must be nonnegative to take their log if(which %in% W7VLOG:W9LOGLOG) check.that.most.are.positive( abs(resids), "abs(residuals)", sprint("which=%d", which), "zero") trans.versus <- trans.versus(versus1[iresids], which) trans.resids <- trans.resids(resids[iresids], which) x <- if(nversus == V2INDEX) 1:length(trans.versus) else trans.versus jitter <- as.numeric(check.numeric.scalar(jitter, logical.ok=TRUE)) stopifnot(jitter >= 0, jitter <= 10) # 10 is arbitrary jittered.x <- x jittered.trans.resids <- trans.resids if(jitter > 0) { # we use amount=0 (same as S) which seems to work better in this context jittered.x <- jitter(x, factor=jitter, amount=0) jittered.trans.resids <- jitter(trans.resids, factor=jitter, amount=0) } derived.xlab <- derive.xlab(dota("xlab", DEF=NULL, ...), which, colname.versus1, nversus) derived.ylab <- derive.ylab(dota("ylab", DEF=NULL, ...), which, rinfo$name) main <- derive.main(main=dota("main", DEF=NULL, ...), derived.xlab, derived.ylab, level, attr(object, "plotmo.s")) # allow col.response as an argname for compat with old plotmo pt.col <- dota("col.response col.resp", DEF=1, ...) pt.col <- dota("pt.col col.points col.point col.residuals col.resid col", EX=c(0,1,1,1,1,1), DEF=pt.col, NEW=1, ...) # recycle pt.col <- repl(pt.col, length(resids)) pt.cex <- dota("response.cex cex.response", DEF=1, ...) pt.cex <- dota("pt.cex cex.points cex.point cex.residuals cex", EX=c(0,1,1,1,1), DEF=pt.cex, NEW=1, ...) pt.cex <- pt.cex * pt.cex(length(x), npoints) pt.cex <- repl(pt.cex, length(resids)) pt.pch <- dota("response.pch pch.response", DEF=20, ...) pt.pch <- dota("pt.pch pch.points pch.point pch.residuals pch", EX=c(0,1,1,1,1), DEF=pt.pch, NEW=1, ...) pt.pch <- repl(pt.pch, length(resids)) ylim <- get.resids.ylim(ylim=dota("ylim", ...), force.auto.resids.ylim, object, fitted, trans.resids, which, info, standardize, id.indices.specified, center, pints, cints, rinfo$scale, nversus) xlim <- get.resids.xlim(xlim=dota("xlim", ...), force.auto.resids.xlim, which, x, trans.versus, ylim, nversus, id.indices.specified) id.indices <- NULL if(id.indices.specified) id.indices <- get.id.indices(rinfo$scale * rinfo$resids, id.n, if(nversus == V4LEVER) hatvalues1(object, sprint("versus=%g", V4LEVER)) else NULL) call.plot(graphics::plot.default, PREFIX="pt.", force.x = x, force.y = jittered.trans.resids, force.main = main, force.xlab = derived.xlab, force.ylab = derived.ylab, force.xlim = xlim, force.ylim = ylim, force.col = NA, # no points will actually be plotted at this stage ...) if(is.specified(grid.col)) grid(col=grid.col, lty=1) else if(which != W9LOGLOG) abline(h=0, lty=1, col="lightgray") # axis if(level && nversus != V4LEVER) { if(is.specified(level.shade)) draw.pint.resids(pints=pints, x=versus1, shade=level.shade, nversus=nversus, ...) if(is.specified(level.shade2)) draw.pint.resids(pints=cints, x=versus1, shade=level.shade2, nversus=nversus, ...) } if(nversus == V4LEVER) { # vertical line at mean leverage mean <- mean(x, na.rm=TRUE) abline(v=mean, col="gray") # add label "mean" if(which == W3RESID) { # not for others otherwise put text over the points usr <- par("usr") # xmin, xmax, ymin, ymax text(mean, if(info) usr[3] + .1 * (usr[4] - usr[3]) # beyond density plot else usr[3] + .02 * (usr[4] - usr[3]), "mean", adj=c(0, -.2), cex=.8, srt=90) } if(standardize && inherits(object, "lm")) draw.cook.levels(object, ...) } call.plot(graphics::points, PREFIX="pt.", force.x = jittered.x, force.y = jittered.trans.resids, force.col = pt.col[iresids], force.cex = pt.cex[iresids], force.pch = pt.pch[iresids], ...) box() # plot points with unity leverage as stars draw.bad.leverage.as.star(jittered.x, rinfo, iresids, pt.cex, smooth.col) coef.rlm <- NULL if(info && nversus != V4LEVER && (which == W5ABS || which == W9LOGLOG)) coef.rlm <- draw.rlm.line(which, versus1, resids, nversus, ...) if(which != W9LOGLOG) draw.smooth(x, trans.resids, rinfo$scale[iresids], smooth.col, ...) col.cv <- dota("col.cv", ...) oof.meanfit.was.plotted <- FALSE if(level && !is.null(object$cv.oof.fit.tab) && is.specified(col.cv)) { draw.oof.meanfit(object$cv.oof.fit.tab, fitted, versus1, rinfo, which, col.cv, nversus) oof.meanfit.was.plotted <- TRUE } # TODO implement id.indices for nversus=V2INDEX if(id.indices.specified && nversus != V2INDEX) { # TODO as.numeric is needed if versus1 is a factor # is.na test needed for which=7 (if some are negative?) x1 <- as.numeric(trans.versus(versus1, which)[id.indices]) if(!anyNA(x1)) plotrix::thigmophobe.labels(x=x1, # TODO labels should take into account jitter y=trans.resids(resids, which)[id.indices], labels=rinfo$labs[id.indices], offset=.33, xpd=NA, font=dota("label.font", DEF=1, ...)[1], cex=.8 * dota("label.cex", DEF=1, ...)[1], col=dota("label.col", DEF=if(is.specified(smooth.col)) smooth.col else 2, ...)[1]) } if(info) draw.resids.info(which, info, versus1, resids, nversus, rsq, coef.rlm, ...) else possible.plotres.legend(which=which, level=level, smooth.col=smooth.col, oof.meanfit.was.plotted=oof.meanfit.was.plotted, ...) list(x=x, y=trans.resids) # does not include jittering } get.plotres.data <- function(object, object.name, which, standardize, delever, level, versus, id.n, labels.id, trace, npoints, type, nresponse, ..., must.get.rsq) { # the dot argument FORCEPREDICT is to check compat with old plot.earth meta <- plotmo_meta(object, type, nresponse, trace, avoid.predict=!dota("FORCEPREDICT", DEF=FALSE, ...), ...) nresponse <- meta$nresponse # column index resp.name <- meta$resp.name # used only in automatic caption, may be NULL type <- meta$type # always a string (converted from NULL if necessary) residtype <- meta$residtype # ditto # we get rsq only if necessary, because error reporting if we can't get it # is weak (because of nested try blocks, here and in do.call.trace) rsq <- NA if(must.get.rsq) { rsq <- try(plotmo_rsq1(object=object, newdata=NULL, trace=if(trace == 1) -1 else trace, meta=meta, ...), silent=trace < 2) if(is.try.err(rsq)) { trace0(trace, "Cannot get training rsq (%s)\n", cleantry(rsq)) rsq <- NA } } # get the residuals and fitted info rinfo <- plotmo_rinfo(object=object, type=type, residtype=residtype, nresponse=nresponse, standardize=standardize, delever=delever, trace=trace, leverage.msg= if(any(which %in% c(W3RESID,W5ABS:W9LOGLOG))) "plotted as a star" else "ignored", expected.levs=meta$resp.levs, labels.id=labels.id, ...) fitted <- rinfo$fitted # n x 1 numeric matrix rinfo$fitted <- NA # prevent accidental use of rinfo$fitted later stopifnot(NCOL(fitted) == 1) stopifnot(length(dim(fitted)) == 2) colnames(fitted) <- "Fitted" # colname will be used in labels in plots # get the values we will plot against (by default the fitted values) vinfo <- get.versus.info(which, versus, object, fitted, nresponse, trace) stopifnot(nrow(fitted) == length(rinfo$resids)) ncases <- length(rinfo$resids) id.n <- get.id.n(id.n, ncases) # convert special values of id.n # convert special values of npoints check.integer.scalar(npoints, min=-1, null.ok=TRUE, logical.ok=TRUE) npoints.was.neg <- FALSE if(is.null(npoints)) npoints <- 0 else if(is.logical(npoints)) npoints <- if(npoints) ncases else 0 else if(npoints == -1) { npoints.was.neg <- TRUE npoints <- ncases } else if(npoints > ncases) npoints <- ncases # Use a maximum of NMAX residuals (unless npoints is bigger or negative). # Allows plotres to be fast even on models with millions of cases. NMAX <- 1e4 nmax <- max(NMAX, npoints) if(!npoints.was.neg && nrow(fitted) > nmax) { if(trace >= 1) printf("using %g of %g residuals%s\n", nmax, ncases, if(id.n > 0) ", forcing id.n=0 because of that (implementation restriction)" else "") # see comment in plotres for use of V4LEVER here isubset <- get.isubset(rinfo$resids, nmax, id.n, use.all=(vinfo$nversus == V4LEVER), rinfo$scale) fitted <- fitted [isubset, , drop=FALSE] rinfo$resids <- rinfo$resids[isubset, , drop=FALSE] rinfo$scale <- rinfo$scale [isubset] vinfo$versus.mat <- vinfo$versus.mat [isubset, , drop=FALSE] # Can no longer draw point labels because row numbers are different. # TODO Come up with a solution so it doesn't have to be that way. id.n <- 0 } list(nresponse = nresponse, # col index in the response (converted from NA if necessary) resp.name = resp.name, # used only in automatic caption, may be NULL type = type, # always a string (converted from NULL if necessary) rinfo = rinfo, # resids, scale, name, etc. vinfo = vinfo, # versus.mat, icolumns, nversus, etc. fitted = fitted, # n x 1 numeric matrix, colname is "Fitted" id.n = id.n, # forced to zero if row indexing changed npoints = npoints, # special values have been converted rsq = rsq) } get.id.n <- function(id.n, ncases) # convert special values of id.n { check.integer.scalar(id.n, null.ok=TRUE, logical.ok=TRUE) if(is.null(id.n)) id.n <- 0 else if(is.logical(id.n)) { id.n <- if(id.n) ncases else 0 } else if(id.n == -1) id.n <- ncases else if(abs(id.n) > ncases) id.n <- ncases id.n } get.versus.info <- function(which, versus, object, fitted, nresponse, trace=0) { versus.mat <- fitted icolumns <- 1 trim.which <- FALSE got.versus <- FALSE nversus <- versus if(is.numeric(versus)) { got.versus <- TRUE trim.which <- TRUE if(length(versus) != 1) stop0( "illegal 'versus' argument (length of 'versus' must be 1 when 'versus' is numeric)") if(floor(versus) != versus) versus.err() if(versus == V1FITTED) trim.which <- FALSE else if(versus == V2INDEX) NULL else if(versus == V3RESPONSE) { versus.mat <- plotmo_y(object, nresponse, trace, expected.len=NROW(fitted), object$levels)$y colnames(versus.mat) <- "Response" } else if(versus == V4LEVER) { # TODO handle constant leverages for factors in the same way as plot.lm versus.mat <- matrix(hatvalues1(object, sprint("versus=%g", V4LEVER)), ncol=1) colnames(versus.mat) <- "Leverage" } else versus.err() } else if(!is.character(versus)) versus.err() else if(length(versus) == 1 && nchar(versus) >= 2 && (substr(versus, 1, 2) == "b:" || substr(versus, 1, 2) == "B:")) { # use the basis matrix got.versus <- TRUE trim.which <- TRUE nversus <- 0 plotmo_bx <- plotmo_bx(object, trace, versus=substring(versus, 3)) # substring drops "bx:" versus.mat <- plotmo_bx$bx icolumns <- plotmo_bx$icolumns } if(!got.versus) { # user specified x variables trim.which <- TRUE prefix <- substr(versus, 1, 1) nversus <- 0 # following are needed if versus is a vector if(any(prefix == "*")) stop0("\"*\" is not allowed in this context in the 'versus' argument\n", " Your 'versus' argument is ", quote.with.c(versus)) versus.mat <- plotmo_x(object, trace) versus.mat <- as.matrix(versus.mat) colnames(versus.mat) <- gen.colnames(versus.mat, "x", "x", trace) icolumns <- check.index(versus, "versus", seq_len(NCOL(versus.mat)), colnames=colnames(versus.mat)) } if(trim.which) { # remove all entries from which except standard resid and abs resid plots org.which <- which which <- which[which %in% c(W3RESID,W5ABS)] if(length(which) == 0) warnf( "which=%s is now empty because plots were removed because versus=%s", paste.c(org.which, maxlen=50), paste.c(versus, maxlen=30)) } list(which = which, # which after possibly removing some plots versus.mat = versus.mat, # either fitted, response, x, or bx icolumns = icolumns, # desired column indices in versus.mat nversus = nversus) # versus as a number, 0 if versus is character } get.resids.xlim <- function(xlim, force.auto.resids.xlim, which, x, trans.versus, ylim, nversus, id.indices.specified) { if(force.auto.resids.xlim || !is.specified(xlim)) { # auto xlim? if(which == W9LOGLOG) { # don't show lower 5% of points quant <- quantile(trans.versus, probs=c(.05, 1), names=FALSE) min <- quant[1] max <- quant[2] # extra left margin so slope of linear fit not flattened if(min > .2 * ylim[1]) min <- .2 * ylim[1] xlim <- c(min, max) } else if(nversus == V4LEVER) # room for labels on high leverage points xlim <- c(0, 1.1 * max(x, na.rm=TRUE)) else xlim <- range1(x, na.rm=TRUE) range <- xlim[2] - xlim[1] if(id.indices.specified) # space for point labels xlim <- c(xlim[1] - .04 * range, xlim[2] + .04 * range) } stopifnot(is.numeric(xlim), length(xlim) == 2) fix.lim(xlim) } get.resids.ylim <- function(ylim, force.auto.resids.ylim, object, fitted, resids, which, info, standardize, id.indices.specified, center, pints, cints, scale, nversus) { if(force.auto.resids.ylim || !is.specified(ylim)) { # auto ylim? if(!is.null(pints)) { min <- min(resids, pints$lwr, na.rm=TRUE) max <- max(resids, pints$upr, na.rm=TRUE) } else if(!is.null(cints)) { min <- min(resids, cints$lwr, na.rm=TRUE) max <- max(resids, cints$upr, na.rm=TRUE) } else { min <- min(resids, na.rm=TRUE) max <- max(resids, na.rm=TRUE) } maxa <- mina <- 0 # adjustments to max and min if(which %in% (W5ABS:W8CUBE)) min <- 0 else if(which == W3RESID && center) { # want symmetric ylim so can more easily see asymmetry if(abs(min) > abs(max)) max <- -min else if(abs(max) > abs(min)) min <- -max } else if(which == W9LOGLOG) maxa <- .5 # more space on top, looks better range <- abs(max - min) if(id.indices.specified) { # space for point labels # TODO only do this if point labels are near the edges mina <- max(mina, .03 * range) maxa <- max(maxa, .03 * range) } if(nversus == V4LEVER && standardize && inherits(object, "lm")) { maxa <- max(maxa, maxa + .2 * range) # space for cook distance legend mina <- max(mina, mina + .1 * range) # space for "mean" label } if(info) { # space for extra text (on top) and density plot (in the bottom) maxa <- maxa + max * if(id.indices.specified) .2 else .1 mina <- mina + max * if(id.indices.specified) .2 else .1 } ylim <- c(min-mina, max+maxa) } fix.lim(ylim) } draw.pint.resids <- function(pints, x, shade, nversus, ...) { if(!is.null(pints)) { # abscissa must be ordered for polygon to work order <- order(x) x <- x[order] pints <- pints[order,] x <- if(nversus == V2INDEX) c(1:length(x), length(x):1) else trans.versus(c(x, rev(x)), 0) call.plot(graphics::polygon, PREFIX="level.", drop.shade=1, drop.shade2=1, force.x = x, force.y = trans.resids(c(pints$lwr, rev(pints$upr)), 0), force.col = shade, def.border = shade, def.lty = 0, ...) } } # this should be used only for models with homoscedastic errors draw.cook.levels <- function(object, ...) { cook.levels <- dota("cook.levels", DEF=c(0.5, 1.0), ...) stopifnot(is.numeric(cook.levels), all(cook.levels > 0)) col <- dota("cook.col", DEF="slategray4", ...) lty <- dota("cook.lty", DEF=1, ...) lwd <- dota("cook.lwd", DEF=1, ...) # based on code in stats::plot.lm.R leverage <- hatvalues1(object, "'standardize'") p <- length(coef(object)) leverage.range <- range(leverage, na.rm=TRUE) # though should never have NA x <- seq.int(0, 1, length.out=101) for(cook.level in cook.levels) { cl <- sqrt(cook.level * p *(1 - x) / x) lines(x, cl, col=col, lty=lty, lwd=lwd) lines(x, -cl, col=col, lty=lty, lwd=lwd) } # we don't use bottomleft like plot.lm because we may plot the density there usr <- par("usr") # xmin, xmax, ymin, ymax legend(usr[1]-.7 * strwidth("X"), # jam it into the corner usr[4]+.5 * strheight("X"), legend="Cook's distance", col=col, lty=lty, lwd=lwd, box.col="white", bg="white", x.intersp=.2, seg.len=1.5) xmax <- min(0.99, usr[2]) ymult <- sqrt(p * (1 - xmax) / xmax) axis(4, at=c(-sqrt(rev(cook.levels)) * ymult, sqrt(cook.levels)*ymult), labels=paste(c(rev(cook.levels), cook.levels)), mgp=c(.25,.15,0), las=2, tck=0, cex.axis=.7, col.axis=col, font=2) # makes the gray labels a bit more legible } # Plot points with unity leverage as stars. We plot them on # the axis, which is arguably incorrect but still useful. # TODO add a test for this to the test suite draw.bad.leverage.as.star <- function(x, rinfo, iresids, pt.cex, smooth.col) { which <- which(is.na(rinfo$scale[iresids])) if(length(which) > 0) { points(x[which], 0, col=1, cex=pt.cex[iresids], pch=8) # pch 8 is a star # add label if possible (not poss if not all points plotted, see npoints) if(length(iresids) == length(rinfo$scale)) { label <- which(is.na(rinfo$scale)) text.on.white(x=x[which], y=0, label=label, col=if(is.specified(smooth.col)) smooth.col else 2, cex=.8, adj=-.5, xpd=NA) } } } draw.smooth <- function(x, resids, scale, smooth.col, ...) { if(!is.specified(smooth.col)) return(NULL) # na.rm is needed if we take logs of nonpos, see check.that.most.are.positive. # That's why we calculate delta explicitly instead of using lowess default. delta <- .01 * diff(range1(x, na.rm=TRUE)) # Replace points with NA scale with 0 (else lowess stops at the NA). # Zero is appropriate because the points are 0 resids with leverage 1. resids[which(is.na(scale))] <- 0 # we use lowess rather than loess because loess tends to give warnings smooth.f <- dota("smooth.f loess.f", DEF=2/3, NEW=1, ...) smooth.iter <- dota("smooth.iter", DEF=3, ...) check.numeric.scalar(smooth.f) stopifnot(smooth.f > .01, smooth.f < 1) smooth <- lowess(x, resids, f=smooth.f, iter=smooth.iter, delta=delta) call.plot(graphics::lines.default, PREFIX="smooth.", drop.f=1, force.x = smooth$x, force.y = smooth$y, force.col = smooth.col, force.lwd = dota("smooth.lwd lwd.smooth lwd.loess", EX=c(0,1,1), DEF=1, NEW=1, ...), force.lty = dota("smooth.lty lty.smooth", EX=c(0,1), DEF=1, NEW=1, ...), ...) } derive.xlab <- function(xlab, which, colname.versus1, nversus) { if(is.specified(xlab)) { stopifnot.string(xlab, allow.empty=TRUE) if(!nzchar(xlab)) return("") } if(!is.specified(xlab)) xlab <- colname.versus1 stopifnot.string(xlab) if(which %in% (W7VLOG:W9LOGLOG)) xlab <- sprint("Log %s", xlab) if(nversus == V2INDEX) xlab <- sprint("%s index", xlab) xlab } derive.ylab <- function(ylab, which, rinfo.name) { if(is.specified(ylab)) { stopifnot.string(ylab, allow.empty=TRUE) if(!nzchar(ylab)) return("") } if(!is.specified(ylab)) ylab <- sprint("%ss", rinfo.name) if(which == W5ABS) ylab <- sprint("Abs %s", ylab) else if(which == W6SQRT) ylab <- sprint("Sqrt Abs %s", ylab) else if(which == W7VLOG) ylab <- sprint("Abs %s", ylab) else if(which == W8CUBE) ylab <- sprint("Cube Root Squared %s", ylab) else if(which == W9LOGLOG) ylab <- sprint("Log Abs %s", ylab) ylab } derive.main <- function(main, xlab, ylab, level, predict.s) # title of plot { # TODO should really use strwidth for newline calculation # The "Fitted" helps with limitations of the formula below newline <- xlab != "Fitted" && xlab != "Fitted index" && xlab != "Response" && nchar(ylab) + nchar(xlab) > 15 if(xlab == "Leverage" && ylab == "Residuals") # special case, mainly for which=1 with lm newline <- FALSE else if(grepl("Standardized", ylab[1]) || grepl("Delevered", ylab[1])) newline <- TRUE if(!is.specified(main)) { # generate a main only if user didn't specify main main <- sprint("%s vs%s%s", ylab, if(newline) "\n" else " ", xlab) if(!is.null(predict.s)) { # include the s argument that is used to make the model predictions if(is.character(predict.s)) # "lambda.1se" or "lambda.min" main <- sprint("%s (s=\"%s\")", main, predict.s) else if(is.numeric(predict.s)) { main <- sprint("%s (s=%s)", main, if(predict.s == 0) "0" else signif(predict.s,2)) } else warning0("predict.s has an unexpected class ", quotify(class(predict.s))) } } if(xlab != "Leverage" && level && !newline) # two newlines is too many main <- sprint("%s\n%g%% level shaded", main, 100*(level)) main } # plot resids of oof meanfit with col.cv (default lightblue) draw.oof.meanfit <- function(cv.oof.fit.tab, fitted, versus1, rinfo, which, col.cv, nversus) { # mean of each row of oof.fit.tab meanfit <- apply(cv.oof.fit.tab, 1, mean) meanfit <- rinfo$scale * (meanfit - fitted) order <- order(versus1) trans.versus1 <- trans.versus(versus1[order], which) x <- if(nversus == V2INDEX) 1:length(trans.versus1) else trans.versus1 lines(x, trans.resids(meanfit[order], which), col=col.cv) } draw.density.along.the.bottom <- function(x, den.col=NULL, scale=NULL, ...) { if(is.null(den.col)) den.col <- dota("density.col", DEF="gray57", EX=0, ...) den <- try(density(x, adjust=dota("density.adjust", DEF=.5, EX=0, ...), na.rm=TRUE), silent=TRUE) if(is.try.err(den)) warning0("draw.density.along.the.bottom: cannot determine density") else { usr <- par("usr") # xmin, xmax, ymin, ymax if(is.null(scale)) scale <- .08 / (max(den$y) - min(den$y)) den$y <- usr[3] + den$y * scale * (usr[4] - usr[3]) call.plot(graphics::lines.default, PREFIX="density.", drop.adjust=1, force.x=den, force.y=NULL, def.col=den.col, ...) } } draw.rlm.line <- function(which, versus1, resids, nversus, ...) { trans.resids <- trans.resids(resids, which) trans.versus <- trans.versus(versus1, which) x <- if(nversus == V2INDEX) 1:length(trans.versus) else trans.versus if(which == W9LOGLOG) { # ignore lower 10% of points (very small residuals i.e. very neg logs) quant <- quantile(trans.versus, probs=.1, na.rm=TRUE, names=FALSE) ok <- which(x > quant) x <- x[ok] trans.resids <- trans.resids[ok] } # # regression on 10 bootstrap samples so we can see variance of versus1 # for(i in 1:10) { # j <- sample.int(length(x), replace=TRUE) # trans.resids1 <- trans.resids[j] # trimmed.trans.fit1 <- x[j] # rlm <- MASS::rlm(trans.resids1~trimmed.trans.fit1, # method="MM", na.action="na.omit") # if(draw) # abline(coef(rlm), col="lightgray", lwd=.6) # } # robust linear regression of trans.resids on x # na.omit is needed if some versus1 (or resids) were nonpos so log(versus1) is NA rlm <- MASS::rlm(trans.resids~x, method="MM", na.action="na.omit") call.dots(abline, force.coef = coef(rlm), force.col = "lightblue", force.lwd = dota("smooth.lwd lwd.smooth lwd.loess", EX=c(0,1,1), DEF=1, NEW=1, ...) + 1, ...) box() # abline overplots the box coef(rlm) } draw.resids.info <- function(which, info, versus1, resids, nversus, rsq, coef.rlm, ...) { trans.versus <- trans.versus(versus1, which) x <- if(nversus == V2INDEX) 1:length(trans.versus) else trans.versus # TODO consider also drawing the density along the right side draw.density.along.the.bottom(x, ...) if(nversus != V4LEVER) { lm.text <- "" slope.text <- "" if(which == W5ABS || which == W9LOGLOG) { # added linear regression line? stopifnot(length(coef.rlm) == 2) slope.text <- sprint(" slope %.2g", coef.rlm[2]) } # exact=FALSE else get warning "Cannot compute exact p-value with ties" cor.abs <- cor.test(versus1, abs(resids), method="spearman", exact=FALSE) if(nversus == V3RESPONSE) { cor <- cor.test(versus1, resids, method="spearman", exact=FALSE) text <- sprint("spearman abs %.2f resids %.2f\n%s", cor.abs$estimate, cor$estimate, slope.text) } else if(which == W3RESID && nversus == V1FITTED) text <- sprint("rsq %.2f spearman abs %.2f", rsq, cor.abs$estimate) else text <- sprint("spearman abs %.2f%s", cor.abs$estimate, slope.text) cex <- .9 usr <- par("usr") # xmin, xmax, ymin, ymax text.on.white(x = usr[1] + strwidth("x", font=1), y = usr[4] - cex * (strheight(text, font=1) + .5 * strheight("X", font=1)), label = text, cex = cex, adj=c(0, 0), font=1, col=1, xpd=NA) } } my.log10 <- function(x) # log of very small values is silently set to NA { i <- which(x < max(x) / 1e6) x[i] <- 1 x <- log10(x) x[i] <- NA x } trans.versus <- function(versus, which) { if(which %in% (W7VLOG:W9LOGLOG)) my.log10(versus) else versus } trans.resids <- function(resid, which) # transform the residuals { if(which == W5ABS) abs(resid) else if(which == W6SQRT) sqrt(abs(resid)) else if(which == W7VLOG) abs(resid) else if(which == W8CUBE) { # do it in two steps so no problem with negative numbers resid <- resid^2 resid^(1/3) } else if(which == W9LOGLOG) my.log10(abs(resid)) else resid } # Get a subset of x. Size of subset is nsubset. Returns an index vector. # The subset includes the 20 biggest absolute values in x. # If you want more than the 20 biggest values, set nbiggest. get.isubset <- function(x, nsubset, nbiggest=0, use.all=FALSE, scale=NULL) { check.vec(x, "x passed to get.isubset", length(x)) ix <- seq_len(length(x)) if(nsubset > 0 && nsubset < length(x) && !use.all) { # TODO move this into caller # take a sample, but make sure it includes the 20 biggest absolute values nsubset <- min(nsubset, length(x)) nbiggest <- min(max(20, nbiggest), nsubset) isorted <- order(abs(x), decreasing=TRUE) # expensive ikeep <- seq_len(nbiggest) if(nsubset > nbiggest) ikeep <- c(ikeep, seq(from=nbiggest + 1, to=length(x), length.out=nsubset - nbiggest)) ix <- isorted[ikeep] # force in points with unity leverage if(!is.null(scale)) { which <- which(is.na(scale)) if(length(which) > 0) ix <- sort_unique(c(which, ix)) } } ix # index vector } # get the indices of the id.n biggest resids (requires a sort) get.id.indices <- function(resids, id.n, hatvalues=NULL) { # id.n has already been checked in plotres.data if(id.n == 0) return(NULL) if(id.n > 0) { # same as plot.lm i <- sort.list(abs(resids), decreasing=TRUE, na.last=NA) if(length(i) > id.n) i <- i[1:id.n] } else { # id.n is negative: most positive and most negative residuals id.n <- -id.n i <- sort.list(resids, decreasing=TRUE, na.last=NA) if(length(i) > id.n) i <- i[c(1:id.n, length(i) + 1 - (1:id.n))] } if(!is.null(hatvalues)) { # add the worst hatvalues i.e. the worst leverages i <- unique(c(i, order(hatvalues, decreasing=TRUE)[1:id.n])) } i } possible.plotres.legend <- function(which, level, smooth.col, oof.meanfit.was.plotted, ...) { # add legend, else red and blue may confuse the user legend.pos <- dota("legend.pos", DEF=NULL, ...) if(level && oof.meanfit.was.plotted && (is.null(legend.pos) || !all(is.na(legend.pos)))) { if(is.null(legend.pos)) { # auto? legend.x <- "bottomleft" legend.y <- NULL } else { # user specified legend position legend.x <- legend.pos[1] legend.y <- if(length(legend.pos) > 1) legend.pos[2] else NULL } legend.txt <- NULL legend.col <- NULL legend.lwd <- NULL legend.lty <- NULL if(which != W9LOGLOG && is.specified(smooth.col)) { # smooth plotted? legend.txt <- "smooth" legend.col <- smooth.col legend.lwd <- dota("smooth.lwd lwd.smooth lwd.loess", EX=c(0,1,1), DEF=1, NEW=1, ...) legend.lty <- 1 } if(oof.meanfit.was.plotted) { legend.txt <- c(legend.txt, "cross validated oof fit") legend.col <- c(legend.col, dota("col.cv", ...)) legend.lwd <- c(legend.lwd, 1) legend.lty <- c(legend.lty, 1) } if(!is.null(legend.txt)) call.dots(graphics::legend, DROP="*", KEEP="PREFIX", force.x = legend.x, force.y = legend.y, force.legend = legend.txt, def.col = legend.col, def.lwd = legend.lwd, def.lty = legend.lty, def.bg = "white", def.cex = .8, ...) } } plotmo/R/methods.R0000644000176200001440000002773214663771205013601 0ustar liggesusers# methods.R: plotmo method functions for miscellaneous objects plotmo.x.mars <- function(object, trace, ...) # mda package { # like plotmo.x.default but ignore object$x get.x.or.y(object, "x", trace, try.object.x.or.y=FALSE) } plotmo.type.bruto <- function(object, ..., TRACE) "fitted" plotmo.predict.bruto <- function(object, newdata, type, ..., TRACE) # mda package { # TODO fails: predict.bruto returned a response of the wrong length plotmo.predict.defaultm(object, newdata, type=type, ..., TRACE=TRACE) } plotmo.type.clm <- function(object, ..., TRACE) "prob" # ordinal package plotmo.predict.clm <- function(object, newdata, type, ..., TRACE) # ordinal package { as.data.frame(plotmo.predict.default(object, newdata, type=type, ..., TRACE=TRACE)) } plotmo.type.lars <- function(object, ..., TRACE) "fit" plotmo.predict.lars <- function(object, newdata, type, ..., TRACE) # lars package { # newx for predict.lars must be a matrix not a dataframe, # so here we use plotmo.predict.defaultm (not plotmo.predict.default) plotmo.predict.defaultm(object, newdata, type=type, ..., TRACE=TRACE)$fit } plotmo.predict.mvr <- function(object, newdata, type, ..., TRACE) # pls package { # the following calls predict.mvr y <- plotmo.predict.default(object, newdata, type=type, ..., TRACE=TRACE) dim <- dim(y) if(length(dim) == 3) { # type="response" returns a 3 dimensional array if(dim[2] != 1) stop0("multiple response models are not supported") y <- y[,1,] } y } plotmo.predict.quantregForest <- function(object, newdata, ..., TRACE) { # the following calls predict.quantregForest plotmo.predict.default(object, newdata, def.quantiles=.5, ..., TRACE=TRACE) } # plotmo.type.cosso works only if before calling plotmo # you manually do class(cosso.object) <- "cosso" plotmo.type.cosso <- function(object, ..., TRACE) "fit" # cosso package plotmo.predict.cosso <- function(object, newdata, type, ..., TRACE) { # xnew for predict.cosso must be a matrix not a dataframe, # so here we use plotmo.predict.defaultm (not plotmo.predict.default). # We default M so first time users can call plotmo easily. yhat <- plotmo.predict.defaultm(object, newdata, type=type, def.M=min(ncol(newdata), 2), ..., TRACE=TRACE) stopifnot(NCOL(yhat) == 1) # class(yhat) is "predict.cosso" but that chokes as.data.frame later class(yhat) <- "vector" yhat } plotmo.type.lda <- function(object, ..., TRACE) "class" plotmo.type.qda <- function(object, ..., TRACE) "class" plotmo.predict.lda <- function(object, newdata, type, ..., TRACE) # MASS package { # the following calls predict.lda yhat <- plotmo.predict.default(object, newdata, ..., TRACE=TRACE) get.lda.yhat(object, yhat, type, trace=0) } plotmo.predict.qda <- function(object, newdata, type, ..., TRACE) # MASS package { # the following calls predict.qda yhat <- plotmo.predict.default(object, newdata, ..., TRACE=TRACE) get.lda.yhat(object, yhat, type, trace=0) } # Special handling for MASS lda and qda predicted response, which # is a data.frame with fields "class", "posterior", and "x". # Here we use plotmo's type argument to choose a field. get.lda.yhat <- function(object, yhat, type, trace) { yhat1 <- switch(match.choices(type, c("class", "posterior", "response", "ld"), "type"), class = yhat$class, # default posterior = yhat$posterior, response = yhat$x, ld = { warning0("type=\"ld\" is deprecated for lda and qda models"); yhat$x }) if(is.null(yhat1)) { msg <- paste0( if(!is.null(yhat$x)) "type=\"response\" " else "", if(!is.null(yhat$class)) "type=\"class\" " else "", if(!is.null(yhat$posterior)) "type=\"posterior\" " else "") stop0("type=\"", type, "\" is not allowed for predict.", class(object)[1], ". ", if(nzchar(msg)) paste("Use one of:", msg) else "", "\n") } yhat1 } plotmo.type.varmod <- function(object, ..., TRACE) "se" plotmo.x.varmod <- function(object, trace, ...) { attr(object$parent, ".Environment") <- get.model.env(object$parent, "object$parent", trace) plotmo.x(object$parent, trace) } plotmo.y.varmod <- function(object, trace, naked, expected.len, nresponse, ...) { attr(object$residmod, ".Environment") <- get.model.env(object$residmod, "object$residmod", trace) plotmo.y(object$residmod, trace, naked, expected.len, nresponse) } order.randomForest.vars.on.importance <- function(object, x, trace) { importance <- object$importance colnames <- colnames(importance) if(!is.matrix(importance) || # sanity checks nrow(importance) == 0 || !identical(row.names(importance), colnames(x)) || is.null(colnames)) { warning0("object$importance is invalid") return(NULL) } colname <- if("%IncMSE" %in% colnames) # regression model: "%IncMSE" # importance=TRUE else if("IncNodePurity" %in% colnames) "IncNodePurity" # importance=FALSE else if("MeanDecreaseAccuracy" %in% colnames) # classification model: "MeanDecreaseAccuracy" # importance=TRUE else if("MeanDecreaseGini" %in% colnames) "MeanDecreaseGini" # importance=FALSE else { warning0("column names of object$importance are unrecognized") return(NULL) } if(trace > 0) printf("randomForest built with importance=%s, ranking variables on %s\n", if(colname == "%IncMSE" || colname == "MeanDecreaseAccuracy") "TRUE" else "FALSE", colname) # vector of var indices, most important vars first order(importance[,colname], decreasing=TRUE) } plotmo.singles.randomForest <- function(object, x, nresponse, trace, all1, ...) { importance <- order.randomForest.vars.on.importance(object, x, trace) if(all1) return(importance) if(is.null(importance)) seq_len(NCOL(x)) # all variables # 10 most important variables # (10 becauses plotmo.pairs returns 6, total is 16, therefore 4x4 grid) importance[seq_len(min(10, length(importance)))] } plotmo.pairs.randomForest <- function(object, x, ...) { if(is.null(object$forest)) stop0("object has no 'forest' component ", "(use keep.forest=TRUE in the call to randomForest)") importance <- order.randomForest.vars.on.importance(object, x, trace=FALSE) if(is.null(importance)) return(NULL) # choose npairs so a total of no more than 16 plots # npairs=5 gives 10 pairplots, npairs=4 gives 6 pairplots npairs <- if(length(importance) <= 6) 5 else 4 form.pairs(importance[1: min(npairs, length(importance))]) } possible.biglm.warning <- function(object, trace) { if(inherits(object, "biglm")) { n <- check.integer.scalar(object$n, min=1) y <- plotmo.y.default(object, trace, naked=TRUE, expected.len=NULL)$field if(NROW(y) != n) warnf("plotting %g cases but the model was built with %g cases\n", NROW(y), n) } } plotmo.predict.biglm <- function(object, newdata, type, ..., TRACE) # biglm package { # predict.biglm: newdata must include the response even though it isn't needed # The following extracts the response from the formula, converts it to a # string, then "nakens" it (converts e.g. "log(Volume)" to plain "Volume"). resp.name <- naken.collapse(format(formula(object)[[2]])) if(TRACE >= 1) printf("plotmo.predict.biglm: adding dummy response \"%s\" to newdata\n", resp.name) data <- data.frame(NONESUCH.RESPONSE=1, newdata) colnames(data) <- c(resp.name, colnames(newdata)) plotmo.predict.default(object, data, type=type, ..., TRACE=TRACE) } plotmo.predict.boosting <- function(object, newdata, # adabag package type="prob", newmfinal=length(object$trees), ...) { stopifnot(inherits(object, "boosting") || inherits(object, "bagging")) predict <- predict(object, newdata=newdata, newmfinal=newmfinal, ...) # adabag (version 4.0) returns a list, so use the type arg to select what we want # note that data.frames are lists, hence must check both below if(is.list(predict) && !is.data.frame(predict)) predict <- switch(match.arg(type, c("response", "votes", "prob", "class")), response = predict$prob, # plotmo default, same as prob votes = predict$votes, prob = predict$prob, class = predict$class) stopifnot(!is.null(predict), NROW(predict) == NROW(newdata)) predict } plotmo.predict.bagging <- function(object, newdata, # adabag package type="prob", newmfinal=length(object$trees), ...) { plotmo.predict.boosting(object, newdata=newdata, type=type, newmfinal=newmfinal, ...) } plotmo.predict.svm <- function(object, newdata, type, ..., TRACE) # package e1071 { # treat warnings as errors (to catch if user didn't specify # probability when building the model) old.warn <- getOption("warn") on.exit(options(warn=old.warn)) options(warn=2) predict <- plotmo.predict.default(object, newdata=newdata, ..., TRACE=TRACE) # no type arg probabilities <- attr(predict, "probabilities") decision.values <- attr(predict, "decision.values") if(!is.null(decision.values) && !is.null(probabilities)) stop0("predict.svm: specify either 'decision.values' or 'probability' (not both)") if(!is.null(decision.values)) # user specified decision.values decision.values else if(!is.null(probabilities)) # user specified probability probabilities else predict } plotmo.prolog.model_fit <- function(object, object.name, trace, ...) # parsnip package { # sanity check: that it is indeed a parnsip model if(!is.list(object[["spec"]]) || !is.list(object[["fit"]])) stop0("unrecognized \"model_fit\" object (was expecting a parsnip model)") # USE.SUBMODEL is an undocumented plotmo dots argument, default is TRUE # TODO this is supposed to be temporary solution use.submodel <- dota("USE.SUBMODEL", DEF=TRUE, ...) if(is.specified(use.submodel)) object$fit else object } # TODO Following commented out because polyreg is not supported by plotmo # So with this commented out we support plotmo(fda.object) # but not plotmo(fda.object$fit). # If it were not commented out, we would support neither. # # plotmo.singles.fda <- function(object, x, nresponse, trace, all1, ...) # { # trace2(trace, "Invoking plotmo_x for embedded fda object\n") # x <- plotmo_x(object$fit, trace) # plotmo.singles(object$fit, x, nresponse, trace, all1) # } # plotmo.pairs.fda <- function(object, x, nresponse, trace, all2, ...) # { # trace2(trace, "Invoking plotmo_x for embedded fda object\n") # x <- plotmo_x(object$fit, trace) # plotmo.pairs(object$fit, x, nresponse, trace, all2) # } # # Simple interface for the AMORE package. # # Thanks to Bernard Nolan and David Lorenz for these. # # Commented out so we don't have to include AMORE in plotmo's DESCRIPTION file. # # plotmo.x.MLPnet <- function(object, ...) # { # get("P", pos=1) # } # plotmo.y.MLPnet <- function(object, ...) # { # get("T", pos=1) # } # plotmo.predict.MLPnet <- function(object, newdata, type, ..., TRACE) # { # # the following calls AMORE::sim.MLPnet # plotmo.predict.default(object, newdata, func=AMORE::sim.MLPnet, ..., TRACE=TRACE) # } plotmo/R/singles.R0000644000176200001440000002043714663771205013575 0ustar liggesusers# singles.R: plotmo.singles and plotmo.pairs #------------------------------------------------------------------------------ # Return a vector of indices of predictors for degree1 plots, e.g, c(1,3,4). # The indices are col numbers in the x matrix. The caller will sort the # returned vector and remove duplicates. The default method simply # returns the indices of all predictors. The object specific methods # typically return only the predictors actually used in the model. # # Note on the x argument: # If the formula is resp ~ num + sqrt(num) + bool + ord:num + fac # then colnames(x) is num bool ord fac plotmo.singles <- function(object, x, nresponse, trace, all1, ...) { UseMethod("plotmo.singles") } plotmo.singles.default <- function(object, x, nresponse, trace, all1, ...) { seq_len(NCOL(x)) } #------------------------------------------------------------------------------ # Get the pairs of predictors to be displayed in degree2 plots. # Each row of the returned pairs matrix is the indices of two predictors # for a degree2 plot. Example (this was returned from plotmo.pairs.rpart): # # 1 2 # 1 2 # 2 1 # # The indices are col numbers in the x matrix. The caller will remove # duplicated pairs and re-order the pairs on the order of the predictors # in the original call to the model function. The above example will # become simply # # 1 2 # # It is ok to return NULL or a matrix with zero rows. plotmo.pairs <- function(object, x, nresponse=1, trace=0, all2=FALSE, ...) { UseMethod("plotmo.pairs") } # Predictors x1 and x2 are considered paired if they appear in # the formula in forms such as x1:x2 or I(x1*x2) or s(x1,x2) # # We use both formula(object) and attr(terms(object), "term.labels"). # formula(object) is necessary for gam formula like "s(x,v1)" because it # appears in attr(terms,"term.labels") as "x" "v1" (i.e. as unpaired). # But our rudimentary parsing of the formula is not reliable, so we also # use the term.labels. An lm formula like Volume~(Girth*Height2)-Height # has term.labels "Girth" "Height2" "Girth:Height2" plotmo.pairs.default <- function(object, x, nresponse, trace, all2, ...) { formula.vars <- NULL formula <- try(formula(object), silent=trace < 2) if(is.try.err(formula) || is.null(formula)) trace2(trace, "formula(object) failed for %s object in plotmo.pairs.default\n", class.as.char(object)) else { trace2(trace, "formula(object) returned %s\n", paste.trunc(format(formula), maxlen=100)) # Note that formula() returns a formula with "." expanded. # After as.character: [1] is "~", [2] is lhs, and [3] is rhs rhs <- as.character(formula(object))[3] # rhs of formula # Sep 2020: removed code below because a `var` may have a "-" in its name # if(grepl("\\-", rhs)) { # "-" in formula? # # formula() gives "(Girth + Height)-Height" for Volume~.-Height # rhs <- sub("\\-.*", "", rhs) # delete "-" and all after # rhs <- gsub("\\(|\\)", "", rhs) # delete ( and ) # } formula.vars <- unlist(strsplit(rhs, "+", fixed=TRUE)) formula.vars <- gsub("^ +| +$", "", formula.vars) # trim leading and trailing spaces trace2(trace, "formula.vars %s\n", quotify.trunc(formula.vars)) } term.labels <- NULL terms <- try(terms(object), silent=trace < 2) if(is.try.err(terms) || is.null(terms)) trace2(trace, "terms(object) failed for %s object in plotmo.pairs.default\n", class.as.char(object)) else { term.labels <- attr(terms, "term.labels") if(is.null(term.labels)) trace2(trace, "attr(terms,\"term.labels\") is NULL in plotmo.pairs.default\n") else trace2(trace, "term.labels %s\n", quotify.trunc(term.labels, maxlen=100)) } if(is.null(formula.vars) && is.null(term.labels)) return(NULL) plotmo_pairs_from_term_labels(c(formula.vars, term.labels), colnames(x), trace) } get.all.pairs.from.singles <- function(object, x, trace, all2) { singles <- plotmo.singles(object, x, nresponse=1, trace, all1=TRUE) if(length(singles) == 0) return(NULL) # no pairs (must be an intercept only model) if(any(is.na(singles))) { # We already issued warning0("NA in singles, will plot all variables") singles <- seq_len(NCOL(x)) # plot all pairs } singles <- unique(singles) if(all2 >= 2) { max <- 20 # note that 20 * 19 / 2 is 120 plots if(length(singles) > max) { warning0("too many predictors to plot all pairs,\n ", "so plotting degree2 plots for just the first ", max, " predictors.") singles <- singles[1:max] } } else { max <- 7 # note that 7 * 6 / 2 is 21 plots if(all2 && length(singles) > max) { warning0("too many predictors to plot all pairs,\n ", "so plotting degree2 plots for just the first ", max, " predictors.\n ", "Call plotmo with all2=2 to plot degree2 plots for up to 20 predictors.") singles <- singles[1:max] } } form.pairs(singles) } form.pairs <- function(varnames) # return a two column matrix, each row is a pair { col1 <- rep(varnames, times=length(varnames)) col2 <- rep(varnames, each=length(varnames)) pairs <- cbind(col1, col2) pairs[col1 != col2, , drop=FALSE] } # Given the term.labels, return a npairs x 2 matrix specifying which predictors # are paired. The elements in the returned matrix are column indices of x. # # This routine is not infallible but works for the commonly used formulas. # It works by extracting substrings in each term.label that looks like a # predictor pair. The following combos of x1 and x2 for example are # considered pairs: x1*x2, x1:x2, s(x1,x2), and similar. plotmo_pairs_from_term_labels <- function(term.labels, pred.names, trace, ...) { trace2(trace, "plotmo_pairs_from_term_labels\n") trace2(trace, "term.labels: %s\n", quotify.trunc(term.labels, maxlen=100)) trace2(trace, "pred.names: %s\n", quotify.trunc(pred.names, maxlen=100)) pairs <- matrix(0, nrow=0, ncol=2) # no pairs initially for(i in 1:length(term.labels)) { untouchable <- get.untouchable.for.naken(term.labels[i]) if(NROW(untouchable$replacements)) { # weird variable name (backquoted in formula handling) e.g. `sexmale*h(16-age)` # the gregexpr below won't work because of spaces etc. in the variable name warnf("Cannot determine which variables to plot in degree2 plots (use all2=TRUE?)\n Confused by variable name %s", quotify.trunc(term.labels[i])[1]) return(pairs) } s <- strip.space(term.labels[i]) s <- gsub("[+*/,]", ":", s) # replace + * / , with : s <- gsub("=[^,)]+", "", s) # delete "=any" # get the indices of expressions of the form "ident1:ident2" igrep <- gregexpr("[._$[:alnum:]]+:[._$[:alnum:]]+", s)[[1]] trace2(trace, "considering %s", s) if(igrep[1] > 0) for(i in seq_along(igrep)) { # extract the i'th "ident1:ident2" into pair start <- igrep[i] stop <- start + attr(igrep, "match.length")[i] - 1 pair <- substr(s, start=start, stop=stop) pair <- strsplit(pair, ":")[[1]] # pair is now c("ident1","ident2") # are the variables in the candidate pair in pred.names? ipred1 <- which(pred.names == pair[1]) ipred2 <- which(pred.names == pair[2]) trace2(trace, " ->%s%s", if(length(ipred1)) sprint(" %g=%s", ipred1, pred.names[ipred1]) else "", if(length(ipred2)) sprint(" %g=%s", ipred2, pred.names[ipred2]) else "") if(length(ipred1) == 1 && length(ipred2) == 1 && pair[1] != pair[2]) pairs <- c(pairs, ipred1, ipred2) } trace2(trace, "\n") } matrix(pairs, ncol=2, byrow=TRUE) } plotmo/R/call.dots.R0000644000176200001440000006706614663771205014025 0ustar liggesusers# call.dots.R: functions to handle prefixed dot arguments # # This file provides support for "prefixed" dot arguments. For example in # plotmo(), the user can specify predict.foo=3 as a dots argument. From # the prefix, plotmo recognizes that the argument is for predict, and # passes the argument to predict as foo=3. #----------------------------------------------------------------------------- # call.dots calls function FUNC with special processing of the dot arguments. # # It drops all args in dots matching DROP except those matching # PREFIX and FORMALS, then passes the remaining dot args to function FUNC. # By default FORMALS is the formal arguments of FUNC. # # If argname is prefixed with "force." then ignore any such arg in dots. # Any argname prefixed with "def." can be overridden by a user arg in dots. call.dots <- function( FUNC = NULL, # the function to call ..., PREFIX = NULL, # default NULL means no prefix DROP = "*", # default drops everything except args matching PREFIX KEEP = "PREFIX", TRACE = 0, # for debugging FNAME = if(is.character(FUNC)) FUNC else trunc.deparse(substitute(FUNC)), FORMALS = NULL, # formal args of FUNC (NULL means get automatically, but # can't always do that because because CRAN doesn't allow :::) SCALAR = FALSE, # see argument "scalar" in eval.dotlist CALLARGS = NULL, CALLER = NULL) { stopifnot(is.logical(TRACE) || is.numeric(TRACE), length(TRACE) == 1) TRACE <- as.numeric(TRACE) if(TRACE >= 2) { if(is.null(CALLER)) CALLER <- callers.name() printf("%s invoked call.dots\n", CALLER) } if(is.null(CALLARGS)) CALLARGS <- callargs(call.dots) args <- deprefix(FUNC=FUNC, PREFIX=PREFIX, ..., DROP=DROP, KEEP=KEEP, TRACE=TRACE, FNAME=FNAME, FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=CALLARGS) do.call.trace(FUNC, args, FNAME, trace=TRACE) } # A version of call.dots specialized for calling plotting functions. # This drops all args in dots except those matching PREFIX and PLOT.ARGS. call.plot <- function( FUNC = NULL, # same as call.dots ..., PREFIX = NULL, # if not specified, match only PLOT.ARGS TRACE = 0, # same as call.dots FORMALS = NULL, # same as call.dots SCALAR = FALSE) # same as call.dots { fname <- trunc.deparse(substitute(FUNC)) callargs <- callargs(call.plot) caller <- callers.name() # function that invoked call.plot call.dots(FUNC=FUNC, PREFIX=PREFIX, ..., DROP="*", # drop everything KEEP="PREFIX,PLOT.ARGS", # except args matching PREFIX and PLOT.ARGS TRACE=TRACE, FNAME=fname, FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=callargs, CALLER=caller) } deprefix <- function( FUNC = NULL, ..., PREFIX = NULL, DROP = NULL, KEEP = NULL, TRACE = 0, FNAME = if(is.character(FUNC)) FUNC else trunc.deparse(substitute(FUNC)), FORMALS = NULL, SCALAR = FALSE, CALLARGS = NULL) { stopifnot(is.logical(TRACE) || is.numeric(TRACE), length(TRACE) == 1) TRACE <- as.numeric(TRACE) if(!is.null(FUNC)) match.fun(FUNC) # check that FUNC is available and is a function FNAME <- init.fname(FNAME, FUNC, TRACE) higher.caller <- higher.caller.to.deprefix(..., FNAME=FNAME) PREFIX <- init.prefix(PREFIX, FUNC, FNAME) if(is.null(CALLARGS)) CALLARGS <- callargs(deprefix) DROP <- expand.drop(DROP, PREFIX, FUNC, FORMALS) KEEP <- expand.drop(KEEP, PREFIX, FUNC, FORMALS, namedrop="KEEP", callargs=CALLARGS, include.standard.prefixes=TRUE) dots <- match.call(expand.dots=FALSE)$... trace.prolog(TRACE, PREFIX, DROP, KEEP, dots, higher.caller) stopif.unnamed.dot(dots, higher.caller, ...) org.dots <- dots if(!is.null(DROP)) dots[grep(DROP, names(dots))] <- NULL stopifnot(!is.null(KEEP)) for(name in names(org.dots)) if(grepl(KEEP, name)) dots[[name]] <- org.dots[[name]] trace.after.dropkeep(TRACE, dots) args <- deprefix.aux(FUNC, dots, PREFIX, FNAME, FORMALS, TRACE) # workhorse eval.dotlist(args, n=2, scalar=SCALAR) # n=2 for caller of deprefix e.g. call.dots } deprefix.aux <- function(func, dots, prefix, fname, formals, trace) # workhorse { force <- "^force\\." # "force." as a regex def <- "^def\\." # "def." as a regex # change prefix to a regex, "plot." becomes "^plot\." prefix <- paste0("^", gsub(".", "\\.", prefix, fixed=TRUE)) groups <- list() # list with three elements: force, prefix, def args for(pref in c(force, prefix, def)) { # put args matching pref into group, with the prefix pre removed which <- grep(pref, names(dots)) # select only args matching pref group <- dots[which] # put them into the group group <- expand.dotnames(group, pref, func, fname, formals) names(group) <- sub(pref, "", names(group)) # remove prefix groups[[pref]] <- group dots[which] <- NULL # remove args in this group from dots } # dots is now just those arguments which did not have a special prefix dots <- expand.dotnames(dots, prefix="", func, fname) # "" matches anything args <- groups[[def]] # "def." args lowest precedence args <- merge.list(args, dots) # next come remaining dots args <- merge.list(args, groups[[prefix]]) args <- merge.list(args, groups[[force]]) # "force." args overrule all others args <- drop.args.prefixed.with.drop(args) order.args(args, trace) } # Argument names for plot functions. We exclude "overall" par() args like # mfrow that shouldn't be included when calling functions like plot(), # lines(), or text(). # # If specified in a DROP or KEEP string, the actual argument must exactly # match the PLOT.ARGS argument to be dropped or kept --- abreviated actual # args won't be matched (otherwise we would match too much, e.g. an actual # arg "s" would match "srt"). PLOT.ARGS <- c("add", "adj", "bty", "cex", "cex.axis", "cex.lab", "cex.main", "cex.sub", "col", "col.axis", "col.lab", "col.main", "col.sub", "crt", "family", "font", "font", "font.axis", "font.lab", "font.main", "font.sub", "lend", "ljoin", "lmitre", "lty", "lwd", "main", "pch", "srt", "xaxp", "xaxs", "xaxt", "xlab", "xlim", "xlog", "xpd", "yaxp", "yaxs", "yaxt", "ylab", "ylim", "ylog") # Arguments for par(). This list includes all par arguments except # readonly arguments (e.g. cin) and unimplemented arguments (e.g. err). # The actual argname must be an exact match to be recognized (no abbreviations). # Following omitted because they change too much: col, lwd PAR.ARGS <- c("adj", "ann", "ask", "bg", "bty", "cex", "cex.axis", "cex.lab", "cex.main", "cex.sub", "col.axis", "col.lab", "col.main", "col.sub", "crt", "err", "family", "fg", "fig", "fin", "font", "font.axis", "font.lab", "font.main", "font.sub", "lab", "las", "lend", "lheight", "ljoin", "lmitre", "lty", "mai", "mar", "mex", "mfcol", "mfg", "mfrow", "mgp", "mkh", "new", "oma", "omd", "omi", "pch", "pin", "plt", "ps", "pty", "srt", "tck", "tcl", "usr", "xaxp", "xaxs", "xaxt", "xlog", "xpd", "yaxp", "yaxs", "yaxt", "ylbias", "ylog") # Arguments for par() which take a vector value (i.e. length of value is not one). PAR.VEC <- c("fig", "fin", "lab", "mai", "mar", "mfcol", "mfg", "mfrow", "mgp", "oma", "omd", "omi", "pin", "plt", "usr", "xaxp", "yaxp") # Arguments that are used for subplots in plotmo and similar programs. # # Useful for dropping all args that could conceivably be plotting # arguments and will never(?) be a predict() or residuals() argument. # # When "PLOTMO.ARGS" is used in a DROP string, any actual arg _prefixed_ # with any of these is dropped (as opposed to PLOT.ARGS and PAR.ARGS we drop # actual argnames that _exactly_ match argnames in PLOT.ARGS and PAR.ARGS). # # "nresiduals", is for back compat with old versions of plot.earth PLOTMO.ARGS <- c( "caption.", "cex.", "col.", "contour.", "cum.", "degree1.", "degree2.", "density.", "filled.contour.", "font.", "func.", "grid.", "heatmap.", "image.", "jitter.", "legend.", "label.", "level.", "line.", "lines.", "lty.", "lty.", "lwd.", "main.", "mtext.", "nresiduals", "par.", "pch.", "persp.", "plot.", "plotmath.", "prednames.", "qq.", "qqline.", "pt.", "response.", "rug.", "smooth.", "text.", "title.", "vfont.") # from now on in this module function defs are in alphabetic order add.formals.to.drop <- function(drop, func, formals, namedrop) { stopifnot(grepl("FORMALS", drop)) if(is.null(func)) stop0("\"FORMALS\" specified in ", namedrop, ", but FUNC is NULL") formals <- merge.formals(func, formals, must.exist=TRUE) formals <- paste0(formals, collapse=",") # vector to string drop <- sub("FORMALS[,]", "", drop) # remove "FORMALS," from drop paste.drop(">FORMALS", formals, drop) # add the formal args } # Return the names of the actual args passed to the caller of this function, # ignoring args matching formals of the caller and ignoring dots. # # For example, for call.dots(foo, PREFIX="anything", x=1, y=1, ...), this # function returns c("x", "y"), because x and y are in the argument list # in the call to call.dots but don't match any of the formals of call.dots # (as PREFIX does). The "..." is ignored. # TODO if these were forced we wouldn't need the force.argument callargs <- function(func) { # names of arguments passed to the func that invoked callargs # args passed in dots will not appear in names names <- names(sys.call(-1)) names <- names[names != ""] # drop unnamed args # drop formal arguments (typically PREFIX, KEEP, etc.) names[!(names %in% names(formals(func)))] } # return string "a,b,c,d,e" if given c("a", "b,c", "d e") # i.e. white space converted to comma, c() collapsed to single string canonical.drop <- function(drop, namedrop) { drop <- gsub(" +|,+", ",", drop) # convert space or multi commas to comma drop <- gsub("^,+|,+$", "", drop) # drop leading and trailing commas drop <- unlist(strsplit(drop, split=",")) # convert to a vector drop <- paste0(drop, collapse=",") # collapse stopifnot.identifier(drop, namedrop, allow.specials=TRUE) drop } # TODO add this check elsewhere in earth and plotmo too check.regex <- function(s) # check for some common regex errors { if(grepl("||", s, fixed=TRUE)) stop0("\"||\" in following regex matches everything:\n", "\"", s, "\"") if(grepl("^\\|", s)) stop0("\"|\" at the start of the following regex matches everything:\n", "\"", s, "\"") if(grepl("\\|$", s)) stop0("\"|\" at the end of the following regex matches everything:\n", "\"", s, "\"") } # convert drop to a regex, "x,y*,prefix." becomes "^x|^y.*|^prefix\." convert.drop.to.regex <- function(drop) { drop <- gsub(",", "|", drop) # change comma to | drop <- gsub(".", "\\.", drop, fixed=TRUE) # escape period, "plot." becomes "plot\." drop <- gsub("*", ".*", drop, fixed=TRUE) # change * to .* # clean up, for example we now may have "||" in drop which must be changed to "|" for(iter in 1:2) { # two iterations seems sufficient in practice drop <- gsub(" +", "", drop) # delete spaces drop <- sub("^\\|", "", drop) # delete | at at start drop <- sub("^\\|", "", drop) # delete | at at end drop <- gsub("^^", "^", drop, fixed=TRUE) # change ^^ to single ^ drop <- gsub("||", "|", drop, fixed=TRUE) # change || to | } # prepend ^ to match prefixes only, "x|y" becomes "^x|^y" drop <- unlist(strsplit(drop, split="|", fixed=TRUE)) drop <- ifelse(substr(drop, 1, 1) == ">", drop, paste0("^", drop)) drop <- paste0(drop, collapse="|") check.regex(drop) # sanity check for some common regex errors drop } # TODO add to test suite (although this is tested implicitly in the plotmo tests) # what happens if the argname is abbreviated and no formals to match against? drop.args.prefixed.with.drop <- function(args) { for(name in names(args)) if(grepl("^drop\\.", name)) { check.integer.scalar(args[[name]], logical.ok=FALSE, object.name=name) if(args[[name]] != 1) stop0(name, "=1 is not TRUE") args[[name]] <- NULL # drop the drop.xxx argument itself name <- sub("drop.", "", name, fixed=TRUE) # delete "drop." from name # TODO allow dropping if just the prefix of name matches name <- paste0("^", name, "$") # turn it into a regex for exact matching args[grep(name, names(args))] <- NULL # drop args that exactly match name } args } # Only dot names that have the given prefix are considered. Expand the # suffix of each of those dot names to its full formal name using the # standard R argument matching rules. # # Example: with prefix = "persp." and func = persp.default, # "persp.sh" in dots gets expanded to "persp.shade", because # "shade" is the full name of an argument of persp.default. # # Among other things, This makes it possible for deprefix to properly # process two actual argument names that are different but both match # the same formal argument name. # # It also helps prevent downstream name aliasing issues, because here we # can pre-emptively check for argname matching problems, and issue clearer # error messages than the standard R arg matching error messages. expand.dotnames <- function( dots, prefix, # a regex, not a plain string func = NULL, # if NULL then we just check for duplicate args and go home fname, # used only in error messages formals = NULL) # manual additions to the formal arg list of func { stopifnot(is.list(dots)) dot.names <- names(dots) matches <- grep(prefix, dot.names) # indices of arg which match prefix if(length(matches) == 0) return(list()) if(is.null(func)) { duplicated <- which(duplicated(dot.names)) if(length(duplicated)) stop0("argument '", dot.names[duplicated[1]], "' for ", fname, "() is duplicated") return(dots[matches]) } # match against the formal arguments of func stopifnot(!is.null(dot.names)) unexpanded.names <- dot.names formals <- merge.formals(func, formals) for(idot in matches) { # for all arguments which match prefix dot.name <- dot.names[idot] stopifnot(nzchar(dot.name)) raw.prefix <- "" raw.dotname <- dot.name if(nzchar(prefix)) { # strip off the prefix substring in dot.name (we will put it back later) start <- regexpr(prefix, dot.name) stopifnot(start == 1) # prefix matches only prefixes stop <- start + attr(start, "match.length") stopifnot(stop > start) raw.prefix <- substr(dot.name, start=start, stop=stop-1) # as string not regex raw.dotname <- substring(dot.name, first=stop) # dotname with prefix removed } match <- charmatch(raw.dotname, formals) if(anyNA(match)) { # No match, not necessarily a problem assuming FUNC has a dots formal arg. # We will allow FUNC to check for itself later (if someone calls it). NULL } else if(match == 0) { # multiple matches matches <- grep(paste0("^", raw.dotname), formals) stopifnot(length(matches) >= 2) stop0("'", raw.dotname, "' matches both the '", formals[matches[1]], "' and '", formals[matches[2]], "' arguments of ", fname, "()") } else # single match, this is the ideal situation dot.names[idot] <- paste0(raw.prefix, formals[match]) # prepend prefix } stopifnot.expanded.dotnames.unique(dot.names, unexpanded.names, fname, formals, prefix) names(dots) <- dot.names dots } # returned the expanded the drop argument as a regex expand.drop <- function(drop, prefix, func, formals=NULL, # manual additions to the formal arg list of func namedrop="DROP", callargs=NULL, include.standard.prefixes=FALSE) { if(is.null(drop)) { if(include.standard.prefixes) return(paste0("^force.|^def.|^", prefix)) else return(NULL) } drop <- canonical.drop(drop, namedrop) if(drop == "*") return(".*") # regex to match everything # TODO following is helpful in the trace print only if # you put special identifiers AFTER the other identifiers drop <- paste.drop(">EXPLICIT", drop, "") if(length(callargs) > 0) drop <- paste.drop(">CALLARGS,", paste0(callargs, "$", collapse=","), drop) if(include.standard.prefixes) { drop <- sub("PREFIX", "", drop) # delete "PREFIX" from drop, if present drop <- paste.drop(">PREFIX,", prefix, drop) drop <- paste.drop(">STANDARDPREFIXES,", "force.,def.,drop.", drop) } else drop <- paste.drop(">PREFIX,", sub("PREFIX", prefix, drop), "") if(grepl("FORMALS", drop)) drop <- add.formals.to.drop(drop, func, formals, namedrop) temp <- paste.drop(">PLOT_ARGS,", paste0(PLOT.ARGS, "$", collapse=","), "") drop <- sub("PLOT.ARGS", temp, drop) temp <- paste.drop(">PAR_ARGS,", paste0(PAR.ARGS, "$", collapse=","), "") drop <- sub("PAR.ARGS", temp, drop) temp <- paste.drop(">PLOTMO_ARGS,", paste0(PLOTMO.ARGS, collapse=","), "") drop <- sub("PLOTMO.ARGS", temp, drop) convert.drop.to.regex(drop) # convert drop to a regex } higher.call.args <- function(..., CALLX, FNAME) { stopifnot(is.list(CALLX)) CALLX[1] <- NULL # remove fname from CALLX if(CALLX[length(CALLX)] == "...") # remove dots from CALLX CALLX[length(CALLX)] <- NULL args <- eval.dotlist(as.list(CALLX)) # add dots to args, if they are not already in args dots <- as.list(match.call(expand.dots=FALSE)$...) arg.names <- names(args) dot.names <- names(dots) for(i in seq_along(dots)) { if(!(dot.names[i] %in% arg.names)) { list <- list(eval(dots[[i]])) names(list) <- dot.names[i] args <- append(args, list) } } args[[1]] <- as.name(FNAME) list.as.char(args) } # used only for tracing and error messages # TODO simplify this and friends when match.call is working (R 3.2.0) higher.caller.to.deprefix <- function(..., FNAME=FNAME) { # search the stack looking for org caller of prefix e.g. call.plot sys.calls <- sys.calls() ncalls <- length(sys.calls) stopifnot(ncalls > 2) higher.fname <- "FUNC" try.was.used <- FALSE for(i in max(ncalls-10, 1) : ncalls) { fname <- paste(sys.calls[[i]][1]) # TODO is [1] in the correct position? if(grepl("^call\\.|^deprefix", fname)) break if(grepl("^doTry|^try", fname)) try.was.used <- TRUE else higher.fname <- fname } call <- as.list(sys.calls[[i]]) fname <- paste(call[[1]]) if(try.was.used) higher.fname <- paste0(higher.fname, " via try ") # use try here for paranoia args <- try(higher.call.args(..., CALLX=call, FNAME=FNAME), silent=TRUE) if(is.try.err(args)) args <- sprint("%s, ...", FNAME) sprint("%s called %s(%s)", higher.fname, fname, args) } init.fname <- function(FNAME, FUNC, TRACE) { # check deparse(substitute(FUNC)) issued a good function name # e.g. FNAME will be "NULL" if FUNC is NULL if(is.null(FNAME) || length(FNAME) != 1 || FNAME == "NULL") FNAME <- "FUNC" stopifnot.string(FNAME) FNAME <- sub(".*:+", "", FNAME) # graphics::lines becomes lines stopifnot.identifier(FNAME, "FNAME") FNAME } init.prefix <- function(PREFIX, FUNC, FNAME) { if(is.null(PREFIX)) { # automatic prefix, so check that we can generate it safely if(is.null(FUNC)) stop0("PREFIX must be specified when FUNC is NULL") PREFIX <- sub("\\..*$", "", FNAME) # lines.default becomes lines # Was deprefix invoked using FUNC=FUNC or in a try block? # This won't catch all cases of FUNC=unusable.name but it helps # The stopifnot.identifier() below also helps. if(PREFIX %in% c("FUNC", "doTryCatch")) stop0("PREFIX must be specified in this context ", "(because FNAME is \", fname, \")") PREFIX <- paste0(PREFIX, ".") # add a period stopifnot.identifier(PREFIX, "the automatically generated PREFIX") } stopifnot.identifier(PREFIX, "PREFIX", allow.empty=TRUE) if(PREFIX == "") PREFIX <- ">NOPREFIX" # no argname can match this PREFIX } # return a char vector: formal() of func plus names in manform # manform is manually specified formals merge.formals <- function(func, manform, must.exist=FALSE) { formals <- names(formals(func)) if(!is.null(manform)) formals <- c(formals, strsplit(canonical.drop(manform, "manform"), ",")[[1]]) if(must.exist) { if(length(formals) == 0) stop0("\"FORMALS\" specified but formals(FUNC) ", "returned no formal arguments") if(length(formals[formals != "..."]) == 0) stop0("\"FORMALS\" specified but formals(FUNC) returned only \"...\"") } formals <- formals[formals != "..."] # drop arg named "..." in formals, if any sapply(formals, stopifnot.identifier) # check that all names are valid unique(formals) } # Put the "anon" args first in the argument list. # Then put args named "object", "x", etc. at the front of the list # (after the anon args if any). This is necessary because all the # manipulation we have done has sadly done some reordering of the args # (meaning that the order of the args supplied to call.dots is only # partially retained). The names object, x, etc. are usually what we want # at the start for the predict and plot functions used with call.dots. order.args <- function(args, trace) { trace2(trace, "return dotnames ") if(length(args)) { # order anonymous args on their names, then delete their names which <- which(grepl("^anon", names(args))) anon <- args[which] # select args with "anon." prefix args[which] <- NULL # remove them from the arg list anon <- anon[order(names(anon))] # order them on their names trace2(trace, "%s", paste0(names(anon), collapse=" ")) names(anon) <- NULL # delete their names args1 <- anon # anon args go first in the arg list # Put arguments named "object", "x", etc. first (after anon args if any). # We want mfrow and mfcol early so subsequent args like cex have the last say. for(argname in c("object", "x", "y", "type", "main", "xlab", "ylab", "mfrow", "mfcol")) { args1[[argname]] <- args[[argname]] args[[argname]] <- NULL # remove from args } args <- append(args1, args) # append remaining args to the list if(trace >= 2) cat0(paste.collapse(names(args)), "\n") } trace2(trace, "\n") args } # paste.drop("prefix", "", drop) returns "prefix,DROP" # paste.drop("prefix", "x", drop) returns "prefix,x,DROP," # paste.drop("prefix", "x,y", drop) returns "prefix,x,y,DROP," # paste.drop("prefix", c("x","y"), drop) returns "prefix,x,y,DROP," paste.drop <- function(prefix, s, drop) { s <- paste(s, collapse=",") if(nzchar(s)) paste0(prefix, ",", s, ",", drop) else paste0(prefix, ",", drop) } stopif.unnamed.dot <- function(dots, higher.caller, ...) # called from deprefix() { which <- which(names(dots) == "") if(length(which)) { call <- sprint("\n %s\n", paste0(strwrap(higher.caller, width=getOption("width"), exdent=10), collapse="\n")) dot <- dots[[ which[1] ]] env <- parent.frame(2) arg <- try(eval(dot, envir=env, enclos=env), silent=TRUE) if(is.try.err(arg)) # fallback to weaker error message "(argument ..1 is unnamed)" stop0("Unnamed arguments are not allowed here", " (argument ", as.char(dot), " is unnamed)", call) else stop0("Unnamed arguments are not allowed here", "\n The argument's value is ", as.char(arg), call) } } stopifnot.expanded.dotnames.unique <- function(expanded.names, unexpanded.names, fname, formals, prefix) { duplicated <- which(duplicated(expanded.names)) if(length(duplicated) == 0) return() # no duplicates if(is.null(formals)) stop0("argument '", unexpanded.names[duplicated[1]], "' for ", fname, "() is duplicated") else { # a little processing is needed because we want to report the # error using the unexpanded.names, not the expanded names # get the index of the duplicated argument's twin duplicated <- duplicated[1] for(twin in 1:duplicated) if(expanded.names[twin] == expanded.names[duplicated]) break stopifnot(twin < duplicated) # get the formal argument matched by the duplicated arguments match <- charmatch(sub(prefix, "", expanded.names[duplicated]), formals) if(anyNA(match)) # Dot args are duplicated, but don't match any formal arg. Probably # because e.g. force.xlab is specified but force.xlab is also passed # in dots to call.dots (an error in the way call.dots is invoked). stop0("argument '", unexpanded.names[duplicated[1]], "' for ", fname, "() is duplicated") else if(unexpanded.names[twin] == unexpanded.names[duplicated]) # dot args are identical and they both match the formal stop0("argument '", unexpanded.names[duplicated[1]], "' for ", fname, "() is duplicated") else # dot args are not identical but both match the formal stop0("'", unexpanded.names[twin], "' and '", unexpanded.names[duplicated], "' both match the '", formals[match[1]], "' argument of ", fname, "()") } } trace.after.dropkeep <- function(trace, dots) { if(trace >= 2) printf("after DROP and KEEP %s\n", paste.collapse(names(dots))) } trace.prolog <- function(trace, prefix, drop, keep, dots, higher.caller) { if(trace >= 2) { printf.wrap("TRACE %s", higher.caller) printf("\nPREFIX %s\n", prefix) printf("DROP %s\n", if(is.null(drop)) "NULL" else gsub("\\|>", "\n >", drop)) printf("KEEP %s\n", if(is.null(keep)) "NULL" else gsub("\\|>", "\n >", keep)) names <- names(dots) names[which(names=="")] <- "UNNAMED" printf("input dotnames %s\n", paste.collapse(names)) } } plotmo/R/bx.R0000644000176200001440000000361614747633243012544 0ustar liggesusers# bx.R: plotres functions for accessing a model's basis matrix # TODO turn this into a method function plotmo_bx <- function(object, trace, msg, versus) { if(inherits(object, "mars") || inherits(object, "earth")) { if(inherits(object, "mars")) bx <- object[["x"]] else bx <- object[["bx"]] if(is.null(bx) || NCOL(bx) == 0) stopf("versus=\"b:\": no basis matrix for this %s object", class.as.char(object, quotify=TRUE)) else if(NCOL(bx) == 1) { # intercept only? bx <- bx icolumns <- 1 } else { bx <- bx[, -1, drop=FALSE] # drop the intercept if(is.null(colnames(bx))) # mars model? colnames(bx) <- paste0("bx", seq_len(NCOL(bx))) icolumns <- check.index(versus, "versus", seq_len(NCOL(bx)), colnames=colnames(bx)) } } else if(inherits(object, "Gam") || # package gam version 1.15 or higher # the additive.predictors check below is to ensure mda:gam (not mgcv:gam) # (applies only to package gam version less than 1.15) (inherits(object, "gam") && !is.null(object[["additive.predictors"]]))) { bx <- model.matrix(object) if(is.null(bx) || NCOL(bx) == 0) stopf("versus=\"b:\": model.matrix(object) for this %s object returned NULL", class.as.char(object, quotify=TRUE)) else if(NCOL(bx) == 1) { # intercept only? bx <- bx icolumns <- 1 } else { bx <- bx[, -1, drop=FALSE] # drop the intercept icolumns <- check.index(versus, "versus", seq_len(NCOL(bx)), colnames=colnames(bx)) } } else stopf("versus=\"b:\" is not supported for this %s object", class.as.char(object, quotify=TRUE)) list(bx=bx, icolumns=icolumns) } plotmo/R/plotres.R0000644000176200001440000002506214663771205013620 0ustar liggesusers# plotres.R: plot model residuals # values for which W1 <- 1 # model selection W2CUM <- 2 # cumulative distribution W3RESID <- 3 # residuals vs fitted W4QQ <- 4 # qq plot W5ABS <- 5 # abs residuals vs fitted W6SQRT <- 6 # sqrt abs residuals vs fitted W7VLOG <- 7 # abs residuals vs log fitted W8CUBE <- 8 # cube root of the squared residuals vs log fitted W9LOGLOG <- 9 # log abs residuals vs log fitted # values for vs V1FITTED <- 1 # fitted V2INDEX <- 2 # obs number V3RESPONSE <- 3 # response V4LEVER <- 4 # leverages plotres <- function(object = stop("no 'object' argument"), which = 1:4, info = FALSE, versus = 1, standardize = FALSE, delever = FALSE, level = 0, id.n = 3, labels.id = NULL, smooth.col = 2, grid.col = 0, jitter = 0, do.par = NULL, caption = NULL, trace = 0, npoints = 3000, center = TRUE, type = NULL, # passed to predict nresponse = NA, object.name = quote.deparse(substitute(object)), ...) # passed to predict { init.global.data() on.exit({init.global.data(); gc()}) # release memory on exit object # make sure object exists trace <- as.numeric(check.integer.scalar(trace, logical.ok=TRUE)) use.submodel <- dota("USE.SUBMODEL", DEF=TRUE, ...) # undoc arg (for parsnip models) use.submodel <- is.specified(use.submodel) # Associate the model environment with the object. # (This is instead of passing it as an argument to plotmo's data access # functions. It saves a few hundred references to model.env in the code.) object.env <- get.model.env(object, object.name, trace, use.submodel) ret <- plotmo_prolog(object, object.name, trace, ...) object <- ret$object # the original object or a submodel (parsnip) my.call <- ret$my.call attr(object, ".Environment") <- object.env if(!is.numeric(which) || !is.vector(which) || anyNA(which) || any(which != floor(which)) || any(which < 1) || any(which > W9LOGLOG)) { which.err() } info <- check.boolean(info) standardize <- check.boolean(standardize) delever <- check.boolean(delever) level <- check.level.arg(level, zero.ok=TRUE) smooth.col <- get.smooth.col(smooth.col, ...) grid.col <- dota("col.grid", DEF=grid.col, ...) if(is.specified(grid.col) && is.logical(grid.col) && grid.col) # grid.col=TRUE grid.col <- "lightgray" check.integer.scalar(nresponse, min=1, na.ok=TRUE, logical.ok=FALSE, char.ok=TRUE) temp <- get.plotres.data(object, object.name, which, standardize, delever, level, versus, id.n, labels.id, trace, npoints, type, nresponse, ..., must.get.rsq=info || trace >= 1) # get rsq only if necessary nresponse <- temp$nresponse # col index in the response (converted from NA if necessary) resp.name <- temp$resp.name # used only in automatic caption, may be NULL type <- temp$type # always a string (converted from NULL if necessary) rinfo <- temp$rinfo # resids, scale, name, etc. vinfo <- temp$vinfo # versus.mat, icolumns, nversus, etc. fitted <- temp$fitted # n x 1 numeric matrix, colname is "Fitted" which <- temp$vinfo$which # plots we don't want will have been removed id.n <- temp$id.n # forced to zero if row indexing changed npoints <- temp$npoints # special values have been converted rsq <- temp$rsq # r-squared on the training data possible.biglm.warning(object, trace) nfigs <- length(which) * length(vinfo$icolumns) if(nfigs == 0) { if(trace >= 0) warning0("plotres: nothing to plot") return(invisible(NULL)) } do.par <- check.do.par(do.par, nfigs) # do.par is 0, 1, or 2 # Prepare caption --- we need it now for do.par() but # can only display it later after at least one plot. caption <- get.caption(nfigs, do.par, caption, resp.name, type, getCall(object), object.name, my.call) if(do.par) { oldpar <- par(no.readonly=TRUE) do.par(nfigs = nfigs, caption=caption, main1=NA, # nlines.in.main below explicitly specified below xlab1 = dota("xlab", DEF=NULL, ...), # used only for margin spacing ylab1 = dota("ylab", DEF=NULL, ...), # ditto trace = trace, nlines.in.main = # nbr of lines in main is needed for margins nlines.in.plotres.main(object=object, which=which, versus=versus, standardize=standardize, delever=delever, level=level, ...), def.font.main = 1, # for compat with lm.plot ...) if(do.par == 1) on.exit(par(oldpar), add=TRUE) } else { # do.par=FALSE oldpar <- do.par.dots(..., trace=trace) if(length(oldpar)) on.exit(do.call(par, oldpar), add=TRUE) } # force.auto.resids.xlim is for back compat with old versions of earth. # To pass ylim to the w1 plot, use a w1. prefix, just like any other arg. # So plain ylim gets passed to the residuals plot not the w1 plot. # But for backwards compatibility when the w1 plot is # an earth model pass plain ylim to the w1 plot unless w1.ylim is set force.auto.resids.xlim <- length(which) > 1 && (W1 %in% which) && inherits(object, "earth") && !is.dot("w1.xlim", ...) force.auto.resids.ylim <- length(which) > 1 && (W1 %in% which) && inherits(object, "earth") && !is.dot("w1.ylim", ...) w1.retval <- list(plotted=FALSE, retval=NULL) w3.retval <- NULL attempted.w1.plot <- FALSE if(any(which == W1)) { w1.retval <- plot_w1(object=object, which=which, info=info, standardize=standardize, delever=delever, level=level, versus=versus, id.n=id.n, labels.id=rinfo$labs, smooth.col=smooth.col, grid.col=grid.col, do.par=do.par, # must do caption here if will not call plot1 later caption=if(all(which == W1)) caption else "", trace=trace, npoints=npoints, center=center, type=type, nresponse=nresponse, object.name=object.name, ...) attempted.w1.plot <- TRUE which <- which[which != W1] if(length(which) == 0 && !w1.retval$plotted && trace >= 0) warning0("plotres: nothing to plot") } if(length(which) == 0) # nothing more to plot? return(invisible(if(attempted.w1.plot) w1.retval$retval else w3.retval)) # we do this after the w1 call so we pass NULL to w1 if labels.id were NULL if(is.null(rinfo$labs)) rinfo$labs <- paste(1:length(rinfo$resids)) # We plot only the residuals in iresids, but use all the # residuals for calculating densities (where "all" actually means # a maximum of NMAX cases, see the previous call to get.isubset). # # The "use.all=(nversus == V4LEVER)" keeps things easier later # for leverage plots, but it would be nice to not have to use it. iresids <- get.isubset(rinfo$resids, npoints, id.n, use.all=(vinfo$nversus == V4LEVER), rinfo$scale) xlim <- dota("xlim", DEF=NULL, ...) # TODO what is this? for(icolumn in vinfo$icolumns) { for(iwhich in seq_along(which)) { if(which[iwhich] == W2CUM) plotmo_cum(rinfo=rinfo, info=info, nfigs=nfigs, add=FALSE, cum.col1=NA, grid.col=grid.col, jitter=0, ...) else if(which[iwhich] == W4QQ) plotmo_qq(rinfo=rinfo, info=info, nfigs=nfigs, grid.col=grid.col, smooth.col=smooth.col, id.n=id.n, iresids=iresids, npoints=npoints, force.auto.resids.ylim=force.auto.resids.ylim, ...) else w3.retval <- plotresids(object=object, which=which[iwhich], info=info, standardize=standardize, level=level, # versus1 is what we plot along the x axis, a vector versus1=vinfo$versus.mat[, icolumn], id.n=id.n, smooth.col=smooth.col, grid.col=grid.col, jitter=jitter, npoints=npoints, center=center, type=type, fitted=fitted, rinfo=rinfo, rsq=rsq, iresids=iresids, nversus=vinfo$nversus, colname.versus1=colnames(vinfo$versus.mat)[icolumn], force.auto.resids.xlim=force.auto.resids.xlim, force.auto.resids.ylim=force.auto.resids.ylim, ...) } } draw.caption(caption, ...) if(trace >= 1) printf("\ntraining rsq %.2f\n", rsq) invisible(if(attempted.w1.plot) w1.retval$retval else w3.retval) } which.err <- function() { stop0("Bad value for which\n", "Allowed values for which:\n", " 1 Model\n", " 2 Cumulative distribution\n", " 3 Residuals vs fitted\n", " 4 QQ plot\n", " 5 Abs residuals vs fitted\n", " 6 Sqrt abs residuals vs fitted\n", " 7 Abs residuals vs log fitted\n", " 8 Cube root of the squared residuals vs log fitted\n", " 9 Log abs residuals vs log fitted") } versus.err <- function() { stop0("versus must be an integer or a string:\n", " 1 fitted (default)\n", " 2 observation numbers\n", " 3 response\n", " 4 leverages\n", " \"\" predictors\n", " \"b:\" basis functions") } nlines.in.plotres.main <- function(object, which, versus, standardize, delever, level, ...) { w1.does.own.mar4 <- # these models do their own top margin spacing in w1 plot inherits(object, c("gbm", "GBMFit", "glmnet", "multnet")) auto.main.has.extra.line <- # conservative guess if main will have two lines standardize || delever || level || any(which %in% W6SQRT:W9LOGLOG) || (versus %in% V4LEVER) || is.character(versus) max(1 + auto.main.has.extra.line, nlines(dota("main", ...)), 1 + if(w1.does.own.mar4) 0 else nlines(dota("w1.main", ...))) } plotmo/R/spread.labs.R0000644000176200001440000000757214663771205014334 0ustar liggesusers# Copied from the orphaned package TeachingDemos version 2.12.1 on Feb 16, 2024. # ------------------------------------------------------------------------------ # # --Title-- # # Spread out close points for labeling in plots # # --Description-- # # This function takes as set of coordinates and spreads out the close # values so that they can be used in labeling plots without overlapping. # # --Usage-- # # spread.labs(x, mindiff, maxiter = 1000, stepsize = 1/10, min = -Inf, max = Inf) # # --Arguments-- # # x The coordinate values (x or y, not both) to spread out. # mindiff The minimum distance between return values # maxiter The maximum number of iterations # stepsize How far to move values in each iteration # min Minimum bound for returned values # max Maximum bound for returned values # # --Details-- # # Sometimes the desired locations for labels in plots results in the # labels overlapping. This function takes the coordinate values (x or #- y, not both) and finds those points that are less than mindiff # (usually a function of strheight or strwidth ) apart and # increases the space between them (by stepsize * mindiff ). # This may or may not be enough and moving some points # away from their nearest neighbor may move them too close to another # neighbor, so the process is iterated until either maxiter steps # have been tried, or all the values are at least mindiff apart. # # The min and max arguments prevent the values from going # outside that range (they should be specified such that the original # values are all inside the range). # # The values do not need to be presorted. # # --Return Value-- # # A vector of coordinates (order corresponding to the original x ) # that can be used as a replacement for x in placing labels. # # --Author-- # # Greg Snow email 538280@gmail.com # # --See Also-- # # The spread.labels function in the plotrix package. # # --Examples-- # # # overlapping labels # plot(as.integer(state.region), state.x77[,1], ylab='Population', # xlab='Region',xlim=c(1,4.75), xaxt='n') # axis(1, at=1:4, lab=levels(state.region) ) # # text( as.integer(state.region)+.5, state.x77[,1], state.abb ) # segments( as.integer(state.region)+0.025, state.x77[,1], # as.integer(state.region)+.375, state.x77[,1] ) # # # now lets redo the plot without overlap # # tmp.y <- state.x77[,1] # for(i in levels(state.region) ) { # tmp <- state.region == i # tmp.y[ tmp ] <- spread.labs( tmp.y[ tmp ], 1.2*strheight('A'), # maxiter=1000, min=0 ) # } # # plot(as.integer(state.region), state.x77[,1], ylab='Population', # xlab='Region', xlim=c(1,4.75), xaxt='n') # axis(1, at=1:4, lab=levels(state.region) ) # # text( as.integer(state.region)+0.5, tmp.y, state.abb ) # segments( as.integer(state.region)+0.025, state.x77[,1], # as.integer(state.region)+0.375, tmp.y ) # } spread.labs <- function(x, mindiff, maxiter=1000, stepsize=1/10, min=-Inf, max=Inf) { unsort <- order(order(x)) x <- sort(x) df <- x[-1] - x[ -length(x) ] stp <- mindiff * stepsize i <- 1 while( any( df < mindiff ) ) { tmp <- c( df < mindiff, FALSE ) if( tmp[1] && (x[1] - stp) < min ) { # don't move bottom set tmp2 <- as.logical( cumprod(tmp) ) tmp <- tmp & !tmp2 } x[ tmp ] <- x[ tmp ] - stp tmp <- c( FALSE, df < mindiff ) if( tmp[length(tmp)] && (x[length(x)] + stp) > max ) { # don't move top tmp2 <- rev( as.logical( cumprod( rev(tmp) ) ) ) tmp <- tmp & !tmp2 } x[ tmp ] <- x[ tmp] + stp df <- x[-1] - x[-length(x)] i <- i + 1 if( i > maxiter ) { warning("Maximum iterations reached") break } } x[unsort] } plotmo/R/stop.if.dots.R0000644000176200001440000000306514663771205014461 0ustar liggesusers# stop.if.dots.R: # stop.if.dots issues an an error message if any args in dots. # We use it to test if any dots arg of the calling function was used, for # functions that must have a dots arg (to match the generic method) but don't # actually use the dots. This helps the user catch mistyped or illegal args. stop.if.dots <- function(...) { dots <- match.call(expand.dots=FALSE)$... if(length(dots)) dots.used.err(STOPFUNC=base::stop, MSG=": unrecognized", ...) } warn.if.dots <- function(...) { dots <- match.call(expand.dots=FALSE)$... if(length(dots)) dots.used.err(STOPFUNC=base::warning, MSG=" ignored", ...) } dots.used.err <- function(..., STOPFUNC, MSG) # utility for stop.if.dots and friends { callers.name <- callers.name(n=2) dots <- match.call(expand.dots=FALSE)$... for(idot in seq_along(dots)) # STOPFUNC is either stop() or warning() { desc <- describe.dot(dots, idot) STOPFUNC(callers.name, MSG, desc, call.=FALSE) } } describe.dot <- function(dots, idot, n=4) # utility for dots.used.err { nchar <- nchar(names(dots)[idot]) if(length(nchar) && nchar > 0) return(sprint(" argument '%s'", names(dots[idot]))) # the argument that was passed in dots is unnamed call <- call.as.char(n=4) # n=4 to describe call to caller of stop.if.dots sprint(" unnamed argument\n The call was %s", paste0(strwrap(call, width=max(40, max(25, getOption("width")-20)), exdent=25), collapse="\n")) } plotmo/R/plot_glmnet.R0000644000176200001440000002773214663771205014462 0ustar liggesusers# plot_glmnet.R: # # This code is based on code in glmnet version 2.0-5 (march 2016). plot_glmnet <- function(x=stop("no 'x' argument"), xvar=c("rlambda", "lambda", "norm", "dev"), label=10, nresponse=NA, grid.col=NA, s=NA, ...) { check.classname(x, "x", c("glmnet", "multnet")) obj <- x beta <- get.beta(obj$beta, nresponse) ibeta <- nonzeroCoef(beta) # ibeta is a vector of coefficient indices if(length(ibeta) == 0) { plot(0:1, 0:1, col=0) # dummy plot legend("topleft", legend="all glmnet coefficients are zero", bty="n") return(invisible(NULL)) } # following was in original plot.glmnet code but seems unnecessary # if(length(ibeta) == 1) { # warning("1 or less nonzero coefficients; glmnet plot is not meaningful") # plot(0:1, 0:1, col=0) # legend("topleft", legend="only one coefficient is nonzero", bty="n") # return() # } beta <- as.matrix(beta[ibeta, , drop=FALSE]) xlim <- dota("xlim", ...) # get xlim from dots, NA if not in dots xvar <- match.arg1(xvar) switch(xvar, "norm"= { if(inherits(obj, "multnet") || inherits(obj, "mrelnet")) { # we don't (yet) precalc norm or support type.coef, so have to stop here stop0("xvar=\"norm\" is not supported by plot_gbm for ", "multiple responses (use plot.glmnet instead)") } x <- apply(abs(beta), 2, sum) if(!is.specified(xlim)) xlim <- c(min(x), max(x)) xlab <- "L1 Norm" approx.f <- 1 }, "lambda"= { x <- log(obj$lambda) if(!is.specified(xlim)) xlim <- c(min(x), max(x)) xlab <- "Log Lambda" approx.f <- 0 }, "rlambda"= { x <- log(obj$lambda) if(!is.specified(xlim)) xlim <- c(max(x), min(x)) # backwards xlab <- "Log Lambda" approx.f <- 0 }, "dev"= { x <- obj$dev.ratio if(!is.specified(xlim)) xlim <- c(min(x), max(x)) xlab <- "Fraction Deviance Explained" approx.f <- 1 }) xlim <- fix.lim(xlim) if(xvar != "rlambda") stopifnot(xlim[1] < xlim[2]) else if(xlim[2] >= xlim[1]) # backwards stop0("xlim[1] must be bigger than xlim[2] for xvar=\"rlambda\"") iname <- get.iname(beta, ibeta, label) # index of varnames on rhs of plot old.par <- par("mar", "mgp", "cex.axis", "cex.lab") on.exit(par(mar=old.par$mar, mgp=old.par$mgp, cex.axis=old.par$cex.axis, cex.lab=old.par$cex.lab)) mar4 <- old.par$mar[4] # right hand margin if(length(iname)) { cex.names <- min(1, max(.5, 2.5 / sqrt(length(iname)))) # seems ok # ensure right margin is big enough for the varnames # can't use strwidth because no plot yet, so just estimate mar4 <- max(old.par$mar[4] + 1, .75 * cex.names * par("cex") * max(nchar(names(iname)))) } # set mar[3] with space for top axis and maybe main, and mar[4] for rhs labels main <- dota("main", ...) # get main from dots, NA if not in dots nlines.needed.for.main <- if(is.specified(main)) nlines(main) + .5 else 0 par(mar=c(old.par$mar[1], old.par$mar[2], max(old.par$mar[3], nlines.needed.for.main + 2.6), mar4)) par(mgp=c(1.5, .4, 0)) # squash axis annotations par(cex.axis=.8) ylab <- "Coefficients" if(is.list(obj$beta)) # multiple response model? ylab <- paste0(ylab, ": Response ", rownames(obj$dfmat)[nresponse]) coef.col <- get.coef.col(..., beta=beta) # color of coef lines # discard lines with color NA or 0 keep <- which((coef.col != "NA") & (coef.col != "0")) iname <- iname[iname %in% keep] beta[-keep,] <- NA # Call graphics::matplot but drop args in dots that aren't graphics args # or formal args of graphics::matplot. # If argname below is prefixed with force. then ignore any such arg in dots. # Any argname below prefixed with def. can be overridden by a user arg in dots. # force.main="" because we later manually add a top axis and possibly main. call.plot(graphics::matplot, force.x=x, force.y=t(beta), force.main="", force.col=coef.col, def.xlim=xlim, def.xlab=xlab, def.ylab=ylab, def.lty=1, def.lwd=1, def.type="l", ...) abline(h=0, col="gray", lty=3) # zero axis line maybe.grid(x=x, beta=beta, grid.col=grid.col, coef.col=coef.col, ...) if(xvar == "rlambda") { # args are named below to prevent potential clash with argnames in dots annotate.rlambda(lambda=obj$lambda, x=x, beta=beta, s=s, grid.col=grid.col, coef.col=coef.col, ...) toplab <- "Lambda" } else { top.axis(obj, x, nresponse, approx.f) toplab <- "Degrees of Freedom" } mtext(toplab, side=3, line=1.5, cex=par("cex") * par("cex.lab")) if(is.specified(main)) mtext(main, side=3, line=3, , cex=par("cex")) # above top axis if(length(iname)) right.labs(beta, iname, cex.names, coef.col) invisible(NULL) } get.beta <- function(beta, nresponse) { if(is.list(beta)) { # multiple response model? check.integer.scalar(nresponse, min=1, max=length(beta), na.ok=TRUE, logical.ok=FALSE) if(is.na(nresponse)) stop0( "Use the nresponse argument to specify a response for this multiple response model.\n", " Example: nresponse=", length(beta)) check.index(nresponse, "nresponse", beta) beta <- beta[[nresponse]] } beta } get.coef.col <- function(..., beta) { # default colors are distinguishable yet harmonious (at least to my eye) # adjacent colors are as different as easily possible def.col <- c("black", "red", "gray50", "orangered3", "darkorange", "magenta2") col <- dota("col", DEF=def.col, ...) # get col from dots, def.col if not in dots # the colors must stay in the above order as we move down rhs of plot order <- order(beta[, ncol(beta)], decreasing=TRUE) coef.col <- vector(mode="character", nrow(beta)) coef.col[order] <- rep_len(col, nrow(beta)) coef.col } # named index of varnames to be printed on right of plot, NULL if none get.iname <- function(beta, ibeta, label) { iname <- NULL check.integer.scalar(label, min=0, logical.ok=TRUE, na.ok=TRUE) if(!is.na(label) && label) { # allow label=NA, treat as FALSE names <- if(is.null(rownames(beta))) paste(ibeta) else rownames(beta) names[!nzchar(names)] <- paste(ibeta)[!nzchar(names)] iname <- order(abs(beta[, ncol(beta)]), decreasing=TRUE) if(is.logical(label)) # label=TRUE is special meaning all iname <- iname[1:length(iname)] else if(length(iname) > label) iname <- iname[1:label] names(iname) <- abbreviate(names[iname], minlength=8) } iname # named index of varnames to be printed, NULL if none } maybe.grid <- function(x, beta, grid.col, coef.col, ...) { if(is.specified(grid.col[1])) { grid(col=grid.col[1], lty=1) # replot over the grid (using add=TRUE) call.plot(graphics::matplot, force.x=x, force.y=t(beta), force.add=TRUE, force.main="", force.col=coef.col, def.lty=1, def.lwd=1, def.type="l", ...) } } right.labs <- function(beta, iname, cex.names, coef.col) # varnames on right of plot { usr <- par("usr") text(x=usr[2] + .01 * (usr[2] - usr[1]), y=spread.labs(beta[iname, ncol(beta)], mindiff=1.2 * cex.names * strheight("X")), labels=names(iname), cex=cex.names, col=coef.col[iname], adj=0, xpd=NA) } top.axis <- function(obj, x, nresponse, approx.f) { at <- pretty(x) # use is.list(obj$beta) to determine if multiple response model df <- if(is.list(obj$beta)) obj$dfmat[nresponse,] else obj$df # compute df by interpolating to df at next smaller lambda # thanks to Yunyang Qian prettydf <- approx(x=x, y=df, xout=at, rule=2, method="constant", f=approx.f)$y axis(3, at=at, labels=prettydf) } # Draw the top axis of an rlambda plot. # Also draw a labeled vertical line at lambda=s, if s isn't NA. # Dot arguments prefixed with "s". can be used to set the annotation # attributes e.g. s.col=NA or s.col=0 for no vertical line. # This is achieved with call.plot(text.on.white, PREFIX="s.", ...) below. annotate.rlambda <- function(lambda, x, beta, s, grid.col, coef.col, ...) { check.numeric.scalar(s, na.ok=TRUE, null.ok=TRUE, logical.ok=FALSE) s.col <- dota("s.col", DEF=1, ...) # get s.col from dots, 1 if not in dots add.s.line <- !is.null(s) && !is.na(s) && is.specified(s.col) # top axis at <- pretty(x) labs <- signif(exp(at), digits=2) # hack: delete confusing rightmost lab (if any) with a value greater # than s but drawn to the right of the vertical line at s if(add.s.line && s <= labs[1]) labs[1] <- "" axis(3, at=at, labels=labs) if(add.s.line) # add vertical line showing s? add.s.line(lambda=lambda, x=x, beta=beta, s=s, grid.col=grid.col, coef.col=coef.col, s.col=s.col, ...) } add.s.line <- function(lambda, x, beta, s, grid.col, coef.col, s.col, ...) { line.col <- "gray" line.lty <- 1 if(is.specified(grid.col)) { line.col <- 1 line.lty <- 3 } log.s <- log(max(lambda[length(lambda)], s)) abline(v=log.s, col=line.col, lty=line.lty) # vertical line at s # replot over the vertical line (using add=TRUE) call.plot(graphics::matplot, force.x=x, force.y=t(beta), force.add=TRUE, force.main="", force.col=coef.col, def.lty=1, def.lwd=1, def.type="l", ...) # add s label on vertical line # to minimize overplotting, y coord of label is biggest gap between matplot lines usr <- par("usr") # xmin, xmax, ymin, ymax col.index <- which.min(abs(lambda-s)) # lambda column corresponding to s y <- sort(c(usr[3], beta[, col.index], usr[4])) # include plot edges, and sort which <- which.max(diff(y)) # call graphics::matplot() but drop args in dots that aren't graphics args # or argnames prefixed with "s." or formal args of text.on.white call.plot(text.on.white, PREFIX="s.", force.x=log.s, force.y=(y[which]+y[which+1]) / 2, force.label= # gsub below drops leading and trailing zeros for compactness if(s == 0) "s=0" else paste0("s=", gsub("^0|0$|\\.0*$", "", signif(s,2))), force.col=s.col, force.cex=.8, def.srt=90, def.xpd=NA, ...) } # Return NULL or an integer vector # Reproduced here (from glmnet version 2.0-16, nov 2018) # so don't have to import glmnet into plotmo. nonzeroCoef = function (beta, bystep = FALSE) { ### bystep = FALSE means which variables were ever nonzero ### bystep = TRUE means which variables are nonzero for each step nr=nrow(beta) if (nr == 1) {#degenerate case if (bystep) apply(beta, 2, function(x) if (abs(x) > 0) 1 else NULL) else { if (any(abs(beta) > 0)) 1 else NULL } } else { beta=abs(beta)>0 # this is sparse which=seq(nr) ones=rep(1,ncol(beta)) nz=as.vector((beta%*%ones)>0) which=which[nz] if (bystep) { if(length(which)>0){ beta=as.matrix(beta[which,,drop=FALSE]) nzel = function(x, which) if (any(x)) which[x] else NULL which=apply(beta, 2, nzel, which) if(!is.list(which))which=data.frame(which)# apply can return a matrix!! which } else{ dn=dimnames(beta)[[2]] which=vector("list",length(dn)) names(which)=dn which } } else which } } plotmo/R/dot.R0000644000176200001440000001724114663771205012716 0ustar liggesusers# dot.R: functions to access dot arguments # Stephen Milborrow Mar 2015 Durban # # TODO when match.call is fixed (R 3.2.1), remove the dots arg in all # these funcs i.e. use the parent's dots #----------------------------------------------------------------------------- # dota() returns the value of the arg in dots that matches ARGNAME. # Returns DEF if no match (default is NA). # Issues an error message if multiple dot arguments match ARGNAME. # # ARGNAME must specify the full argument name (not abbreviated). # ARGNAME can be a vector of argument names. Example: # dotarg(c("name1", "name2"), ...) # First we look for a dot arg matching the first name in the ARGNAME vector. # If that fails we look for a match against the second name. And so on # for further names in ARGNAME. If nothing matches, DEFAULT is returned. # EXACT can also be a vector, with elements corresponding to the elements # of ARGNAME. Example: # dotarg(c("name1", "name2"), ..., EXACT=c(FALSE, TRUE)) # # Common mistake: Using dotarg(xlab, ...) instead of dotarg("xlab", ...). # The former usually causes the error message: object 'xlab' not found. # # If EX is TRUE then the name in dots must match ARGNAME exactly. # If EX is FALSE match partial names in dots against ARGNAME following the # standard R argname matching rules ("Argument Matching" in the R Language # Definition). But here were are matching against only a single "formal" # argument name, instead of all formal argnames simultaneously. # # NEW is currently unused (but will be for processing deprecated args). # "NEW" is used instead of say "DEP" (for deprecated) so it is easily # distinguishable from "DEF". # # Note that this function invokes eval to force the argument promise. # The uppercase formal argnames prevent aliasing with names in dots. # # TODO I wanted to call this function dot but in base R there is # already a function dot (plotmath). dota <- function(ARGNAME, ..., DEF=NA, EX=TRUE, NEW=NA) { dots <- drop.unnamed.dots(match.call(expand.dots=FALSE)$...) argname <- process.argname(ARGNAME) exact <- process.exact(argname, EX) new <- process.new(NEW, argname, deparse(substitute(DEF))) for(i in seq_along(argname)) { idot <- dotindex.aux(argname[i], dots, exact[i]) if(!anyNA(idot)) { argval <- try(eval(dots[[idot]], parent.frame(1))) if(is.try.err(argval)) stop0("cannot evaluate '", argname[i], "'") dotname <- names(dots)[idot] # TODO following commented out until we want to start # issuing deprecated messages for earth and plotmo # maybe.deprecate.arg(dotname, new, argname[i]) return(argval) } } DEF } # Like dota() but default is existing value of ARGNAME. # For example, dotd("xlab", ...) is equivalent to dota("xlab", DEF=xlab, ...). # TODO add to test suite dotd <- function(ARGNAME, ..., EX=TRUE) { if(is.dot("DEF", ...)) stop0("'DEF' cannot be used with dotd") if(is.dot(ARGNAME, ..., EX=EX)) dota(ARGNAME, ..., EX=EX) else # use the current value of ARGNAME as the default eval(as.name(ARGNAME), parent.frame(1)) } # Does a dot argument match ARGNAME? Return TRUE or FALSE, never NA. # Issue an error message if there are multiple matches. is.dot <- function(ARGNAME, ..., EX=TRUE) { dots <- drop.unnamed.dots(match.call(expand.dots=FALSE)$...) argname <- process.argname(ARGNAME) exact <- process.exact(argname, EX) for(i in seq_along(argname)) if(!anyNA(dotindex.aux(argname[i], dots, exact[i]))) return(TRUE) FALSE } # Return the index of the dot argname that matches ARGNAME. # Return NA if no dot argument matches ARGNAME. # Issue an error message if there are multiple matches. dotindex <- function(ARGNAME, ..., EX=TRUE) { dots <- drop.unnamed.dots(match.call(expand.dots=FALSE)$...) argname <- process.argname(ARGNAME) exact <- process.exact(argname, EX) for(i in seq_along(argname)) { idot <- dotindex.aux(argname[i], dots, exact[i]) if(!anyNA(idot)) return(idot) } NA } drop.unnamed.dots <- function(dots) { dots[which(names(dots) == "")] <- NULL dots } # allow comma or space separated argnames # e.g. convert c("a", "b,c d") to c("a", "b", "c", "d") process.argname <- function(argname) { stopifnot(is.character(argname)) argname <- gsub(" +|,+", ",", argname) # convert space or multi commas to comma argname <- gsub("^,+|,+$", "", argname) # drop leading and trailing commas if(any(!nzchar(argname))) stop0("empty string in ARGNAME") unlist(strsplit(argname, split=",")) # convert to a vector } process.exact <- function(argname, exact) { stopifnot(is.numeric(exact) || is.logical(exact), all((exact == 0) | (exact == 1))) if(length(exact) > length(argname)) stop0("length(EX)=", length(exact), " is greater than length(ARGNAME)=", length(argname)) recycle(exact, argname) } process.new <- function(new, argname, defname) # returns NA or a string { if(anyNA(new)) return(NA) if(is.numeric(new)) { if(length(new) != 1) stop0("length(NEW) != 1") if(new < 0 || floor(new) != new) stop0("NEW=", new, " is not allowed") if(new == 0) { if(!grepl("^[[:alnum:]._]+$", defname)) stop0("NEW=0 cannot be used when DEF=", defname, " (not an identifier)") # following helps prevent mistakes when e.g. defname=NA or NULL if(grepl("^[A-Z]+$", defname)) # all upper case stop0("NEW=0 cannot be used when DEF=", defname) return(defname) } if(new > length(argname)) stop0("NEW=", new, " but length(ARGNAME) is only ", length(argname)) return(argname[new]) } # new is a string stopifnot.identifier(new, "NEW") new } dotindex.aux <- function(argname, dots, exact=FALSE) # workhorse { stopifnot.identifier(argname, "ARGNAME") if(length(dots) == 0) return(NA) # first look for an exact match caller <- callers.name(n=2) index <- which(argname == names(dots)) if(length(index) > 1) # multiple exact matches? stop0("argument '", argname, "' for ", caller, "() is duplicated") if(length(index) == 0) # no exact match index <- NA if(!anyNA(index) || exact) return(index) # look for a partial match index <- which(!is.na(charmatch(names(dots), argname))) if(length(index) == 0) # no match return(NA) if(length(index) == 1) # single match return(index) # length(index) > 1 multiple matches stopifnot(all(index >= 0)) name1 <- names(dots)[index[1]] name2 <- names(dots)[index[2]] if(name1 == name2) # e.g. foo("abc", a=1, a=2) stop0("argument '", name1, "' for ", caller, "() is duplicated") # e.g. arguments 'a' and 'ab' both match 'abc' in foo() stop0("arguments '", name1, "' and '", name2, "' both match '", argname, "' in ", caller) } maybe.deprecate.arg <- function(dotname, new, argname) { if(is.specified(new) && argname != new) { # require.period prevents a warning if user uses say a # dot arg of plain 'col' when ARGNAME="pt.col col.pt col" require.period <- grepl("\\.", argname) if(!require.period || grepl("\\.", dotname)) warning0("'", dotname, "' is deprecated, please use '", new, "' instead") } } plotmo/R/plotmo.R0000644000176200001440000023111214665400025013424 0ustar liggesusers# plotmo.R: plot the model response when varying one or two predictors # # Stephen Milborrow Sep 2006 Cape Town plotmo <- function(object = stop("no 'object' argument"), type = NULL, nresponse = NA, pmethod = "plotmo", pt.col = 0, jitter = .5, smooth.col = 0, level = 0, func = NULL, inverse.func = NULL, nrug = 0, grid.col = 0, type2 = "persp", degree1 = TRUE, all1 = FALSE, degree2 = TRUE, all2 = FALSE, do.par = TRUE, clip = TRUE, ylim = NULL, caption = NULL, trace = 0, grid.func = NULL, grid.levels = NULL, extend = 0, ngrid1 = 50, ngrid2 = 20, ndiscrete = 5, npoints = 3000, center = FALSE, xflip = FALSE, yflip = FALSE, swapxy = FALSE, int.only.ok = TRUE, ...) { init.global.data() on.exit({init.global.data(); gc()}) # release memory on exit object.name <- quote.deparse(substitute(object)) object # make sure object exists trace <- as.numeric(check.integer.scalar(trace, logical.ok=TRUE)) use.submodel <- dota("USE.SUBMODEL", DEF=TRUE, ...) # undoc arg (for parsnip models) use.submodel <- is.specified(use.submodel) # Associate the model environment with the object. # (This is instead of passing it as an argument to plotmo's data access # functions. It saves a few hundred references to model.env in the code.) object.env <- get.model.env(object, object.name, trace, use.submodel) ret <- plotmo_prolog(object, object.name, trace, ...) object <- ret$object # the original object or a submodel (parsnip) my.call <- ret$my.call attr(object, ".Environment") <- object.env # We will later make two passes through the plots if we need to # automatically determine ylim (see get.ylim.by.dummy.plots). # The trace2 variable is used for disabling tracing on the second pass. trace2 <- trace # trace=100 to 103 are special values used for development # (they are for tracing just plotmo_x with no plotting) special.trace <- FALSE if(trace >= 100 && trace <= 103) { special.trace <- TRUE trace <- trace - 100 } pmethod <- match.choices(pmethod, c("plotmo", "partdep", "apartdep"), "pmethod") clip <- check.boolean(clip) all1 <- check.boolean(all1) all2 <- check.integer.scalar(all2, min=0, max=2) center <- check.boolean(center) swapxy <- check.boolean(swapxy) xflip <- check.boolean(xflip) yflip <- check.boolean(yflip) type2 <- match.choices(type2, c("persp", "contour", "image"), "type2") level <- get.level(level, ...) pt.col <- get.pt.col(pt.col, ...) jitter <- get.jitter(jitter, ...) smooth.col <- get.smooth.col(smooth.col, ...) check.integer.scalar(ndiscrete, min=0) extend <- check.numeric.scalar(extend) stopifnot(extend > -.3, extend <= 10) # .3 prevents shrinking to nothing, 10 is arb if(!is.specified(degree1)) degree1 <- 0 if(!is.specified(degree2)) degree2 <- 0 if(!is.specified(nresponse)) nresponse <- NA if(!is.specified(clip)) clip <- FALSE if(center && clip) { clip <- FALSE # otherwise incorrect clipping (TODO revisit) warning0("forcing clip=FALSE because center=TRUE ", "(a limitation of the current implementation)") } # get x so we can get the predictor names and ux.list x <- plotmo_x(object, trace) if(NCOL(x) == 0 || NROW(x) == 0) stop("x is empty") # seen with an intercept only model for some model classes (not earth) if(special.trace) # special value of trace was used? return(invisible(x)) meta <- plotmo_meta(object, type, nresponse, trace, msg.if.predictions.not.numeric= if(level > 0) "the level argument is not allowed" else NULL, ...) y <- meta$y.as.numeric.mat # y as a numeric mat, only the nresponse column nresponse <- meta$nresponse # column index resp.name <- meta$resp.name # used only in automatic caption, may be NULL resp.levs <- meta$resp.levs # to convert predicted strings to factors, may be NULL type <- meta$type # always a string (converted from NULL if necessary) ngrid1 <- get.ngrid1(ngrid1, y, ...) ngrid2 <- get.ngrid2(ngrid2, y, ...) n.apartdep <- ngrid1 # following prevents aliasing on nrow(data) to ensure we catch the following: # "warning: predict(): newdata' had 31 rows but variable(s) found have 30 rows" if(ngrid1 == length(y)) { trace2(trace, "changed ngrid1 from %g to %g\n", ngrid1, ngrid1+1) ngrid1 <- ngrid1 + 1 } temp <- get.unique.xyvals(x, y, npoints, trace) ux.list <- temp$ux.list # list, each elem is unique vals in a column of x uy <- temp$uy # unique y vals npoints <- temp$npoints y <- apply.inverse.func(inverse.func, y, object, trace) if(center) y <- my.center(y, trace) # get iresponse ncases <- nrow(x) iresponse <- NULL if(is.specified(pt.col)) { iresponse <- get.iresponse(npoints, ncases) if(is.null(iresponse)) pt.col <- 0 } # singles is a vector of indices of predictors for degree1 plots singles <- plotmo_singles(object, x, nresponse, trace, degree1, all1) nsingles <- length(singles) # each row of pairs is the indices of two predictors for a degree2 plot pairs <- plotmo_pairs(object, x, nresponse, trace, all2, degree2) npairs <- NROW(pairs) temp <- get.pred.names(colnames.x=colnames(x), nfigs=nsingles + npairs, ...) pred.names <- temp$pred.names abbr.pred.names <- temp$abbr.pred.names def.cex.main <- temp$def.cex.main is.int.only <- FALSE # is intercept only model? if(nsingles == 0 && npairs == 0) { # is this an intercept only model? (which causes nsingles == 0 && npairs == 0) # if so, we plot it anyway (unless degree1=0) trace2(trace, "\n----plotmo_singles for %s object, all1=FALSE %s \n", class.as.char(object), "(determine if is.int.only)") sing <- plotmo.singles(object=object, x=x, nresponse=nresponse, trace=trace, all1=FALSE) # note that all1=FALSE is.int.only <- length(sing) == 0 trace2(trace, if(is.int.only) "intercept-only model\n\n" else "model has an intercept\n\n") } if(is.int.only && int.only.ok && !all(degree1 == 0)) { singles <- 1 # plot the first predictor nsingles <- 1 } if(nsingles > 64 && trace >= 0) { cat0("More than 64 degree1 plots.\n", "Consider using plotmo's degree1 argument to limit the number of plots.\n", "For example, degree1=1:10 or degree1=c(\"", pred.names[singles[1]], "\", \"", pred.names[singles[2]], "\")\n", "Call plotmo with trace=-1 to make this message go away.\n\n") } else if(nsingles > 200) { # 220 is arb, 15 * 15 warning0("Will plot only the first 200 degree1 plots (of ", nsingles, " degree1 plots)") singles <- singles[1:200] nsingles <- length(singles) } if(npairs > 64 && trace >= 0) { cat0("More than 64 degree2 plots.\n", "Consider using plotmo's degree2 argument to limit the number of plots.\n", "For example, degree2=1:10 or degree2=\"", pred.names[singles[1]], "\"\n", "Call plotmo with trace=-1 to make this message go away.\n\n") } else if(npairs > 200) { warning0("Will plot only the first 200 degree2 plots (of ", npairs, " degree2 plots)") pairs <- pairs[1:200,] npairs <- NROW(pairs) } if(extend != 0 && npairs) { warning0("extend=", extend, ": will not plot degree2 plots ", "(extend is not yet implemented for degree2 plots)") pairs <- NULL npairs <- 0 } nfigs <- nsingles + npairs if(nfigs == 0) { if(trace >= 0) warning0("plotmo: nothing to plot") return(invisible()) } do.par <- check.do.par(do.par, nfigs) # do.par is 0, 1, or 2 # Prepare caption --- we need it now for do.par() but # can only display it later after at least one plot. # nfigs=2 (any number greater than 1) because by default we do.par in plotmo. caption <- get.caption(nfigs=2, do.par, caption, resp.name, type, getCall(object), object.name, my.call) if(do.par) { # TODO document what happens here and in plotres if only one plot oldpar <- par(no.readonly=TRUE) # need xlab etc. so so we can figure out margin sizes in do.par xlab <- dota("xlab", DEF="", ...) ylab <- dota("ylab", DEF="", ...) main <- dota("main", ...) do.par(nfigs=nfigs, caption=caption, main1=main, xlab1=xlab, ylab1=ylab, trace=trace, def.cex.main=def.cex.main, ...) if(do.par == 1) on.exit(par(oldpar), add=TRUE) } else { # do.par=FALSE oldpar <- do.par.dots(..., trace=trace) if(length(oldpar)) on.exit(do.call(par, oldpar), add=TRUE) } trace2(trace, "\n----Figuring out ylim\n") is.na.ylim <- !is.null(ylim) && anyNA(ylim) jittered.y <- apply.jitter(as.numeric(y), jitter) # get.ylim will do dummy plots if necessary temp <- get.ylim(object=object, type=type, nresponse=nresponse, pmethod=pmethod, pt.col=pt.col, jitter=jitter, smooth.col=smooth.col, level=level, func=func, inverse.func=inverse.func, nrug=nrug, grid.col=grid.col, type2=type2, degree1=degree1, all1=all1, degree2=degree2, all2=all2, do.par=do.par, clip=clip, ylim=ylim, caption=caption, trace=trace, grid.func=grid.func, grid.levels=grid.levels, extend=extend, ngrid1=ngrid1, ngrid2=ngrid2, npoints=npoints, ndiscrete=ndiscrete, int.only.ok=int.only.ok, center=center, xflip=xflip, yflip=yflip, swapxy=swapxy, def.cex.main=def.cex.main, x=x, y=y, singles=singles, resp.levs=resp.levs, ux.list=ux.list, pred.names=pred.names, abbr.pred.names=abbr.pred.names, nsingles=nsingles, npairs=npairs, nfigs=nfigs, uy=uy, is.na.ylim=is.na.ylim, is.int.only=is.int.only, trace2=trace2, pairs=pairs, iresponse=iresponse, jittered.y=jittered.y, n.apartdep=n.apartdep, ...) ylim <- temp$ylim trace2 <- temp$trace2 if(nsingles) plot_degree1(object=object, degree1=degree1, all1=all1, center=center, ylim=if(is.na.ylim) NULL else ylim, # each graph has its own ylim? type=type, nresponse=nresponse, pmethod=pmethod, trace=trace, trace2=trace2, pt.col=pt.col, jitter=jitter, iresponse=iresponse, smooth.col=smooth.col, grid.col=grid.col, inverse.func=inverse.func, grid.func=grid.func, grid.levels=grid.levels, extend=extend, ngrid1=ngrid1, is.int.only=is.int.only, level=level, func=func, nrug=nrug, draw.plot=TRUE, x=x, y=y, singles=singles, resp.levs=resp.levs, ux.list=ux.list, ndiscrete=ndiscrete, pred.names=pred.names, abbr.pred.names=abbr.pred.names, nfigs=nfigs, uy=uy, xflip=xflip, jittered.y=jittered.y, n.apartdep=n.apartdep, ...) if(npairs) plot_degree2(object=object, degree2=degree2, all2=all2, center, ylim=if(is.na.ylim) NULL else ylim, # each graph has its own ylim? type=type, nresponse=nresponse, pmethod=pmethod, clip=clip, trace=trace, trace2=trace2, pt.col=pt.col, jitter=jitter, iresponse=iresponse, inverse.func=inverse.func, grid.func=grid.func, grid.levels=grid.levels, extend=extend, type2=type2, ngrid2=ngrid2, draw.plot=TRUE, do.par=do.par, x=x, y=y, pairs=pairs, resp.levs=resp.levs, ux.list=ux.list, ndiscrete=ndiscrete, pred.names=pred.names, abbr.pred.names=abbr.pred.names, nfigs=nfigs, nsingles=nsingles, npairs=npairs, xflip=xflip, yflip=yflip, swapxy=swapxy, def.cex.main=def.cex.main, n.apartdep=n.apartdep, ...) draw.caption(caption, ...) invisible(x) } # plotmo.retval <- function(x, singles, pairs, pred.names) # plotmo's return value # { # degree1 <- vector("list", length(singles)) # names <- vector("character", length(singles)) # for(isingle in seq_along(singles)) { # ipred <- singles[isingle] # ipred is the predictor index i.e. col in model mat # temp <- degree1.data(isingle) # stopifnot(!is.null(temp)) # stopifnot(nrow(temp$xframe) == length(temp$yhat)) # data <- data.frame(temp$xframe[[ipred]], temp$yhat) # names[isingle] <- pred.names[ipred] # colnames(data) <- c(pred.names[ipred], "PLOTMO") # degree1[[isingle]] <- data # } # names(degree1) <- names # # npairs <- NROW(pairs) # degree2 <- vector("list", npairs) # names <- vector("character", npairs) # for(ipair in seq_len(npairs)) { # ipred1 <- pairs[ipair,1] # index of first predictor # ipred2 <- pairs[ipair,2] # index of second predictor # temp <- degree2.data(ipair) # stopifnot(!is.null(temp)) # # TODO this fails if blockify.degree2.frame kicks in # stopifnot(nrow(temp$xframe) == length(temp$yhat)) # data <- data.frame(temp$xframe[ipred1], temp$xframe[ipred2], as.vector(temp$yhat)) # names[ipair] <- paste0(pred.names[ipred1], ":", pred.names[ipred1]) # colnames(data) <- c(pred.names[ipred1], pred.names[ipred2], "PLOTMO") # degree2[[ipair]] <- data # } # names(degree2) <- names # # list(x=x, degree1=degree1, degree2=degree2) # } plotmo_prolog <- function(object, object.name, trace, ...) { object <- plotmo.prolog(object, object.name, trace, ...) my.call <- call.as.char(n=2) SHOWCALL <- dota("SHOWCALL", ...) if(!is.specified(SHOWCALL)) my.call <- NULL list(object=object, my.call=my.call) } get.pred.names <- function(colnames.x, nfigs, ...) { # numbers below are somewhat arb nrows <- ceiling(sqrt(nfigs)) # nrows in plot grid minlength <- 20; def.cex.main <- 1.2 if (nrows >= 9) { minlength <- 6; def.cex.main <- .7 } else if(nrows >= 8) { minlength <- 7; def.cex.main <- .8 } else if(nrows >= 7) { minlength <- 7; def.cex.main <- .8 } else if(nrows >= 6) { minlength <- 7; def.cex.main <- .8 } else if(nrows >= 5) { minlength <- 8; def.cex.main <- 1 } else if(nrows >= 4) { minlength <- 9; def.cex.main <- 1.1 } stopifnot(!is.null(colnames.x)) # plotmo_x always returns colnames (unless no columns) minlength <- dota("prednames.minlength", DEF=minlength, ...) prednames.abbreviate <- dota("prednames.abbreviate", DEF=TRUE, ...) prednames.abbreviate <- check.boolean(prednames.abbreviate) abbr.pred.names <- if((prednames.abbreviate)) abbreviate(strip.space(colnames.x), minlength=minlength, method="both.sides") else colnames.x list(pred.names = colnames.x, abbr.pred.names = abbr.pred.names, def.cex.main = def.cex.main) } # always returns a vector of 2 elems, could be c(-Inf, Inf) get.ylim <- function(object, type, nresponse, pmethod, pt.col, jitter, smooth.col, level, func, inverse.func, nrug, grid.col, type2, degree1, all1, degree2, all2, do.par, clip, ylim, caption, trace, grid.func, grid.levels, extend=extend, ngrid1, ngrid2, npoints, ndiscrete, int.only.ok, center, xflip, yflip, swapxy, def.cex.main, x, y, singles, resp.levs, ux.list, pred.names, abbr.pred.names, nsingles, npairs, nfigs, uy, is.na.ylim, is.int.only, trace2, pairs, iresponse, jittered.y, n.apartdep, ...) { get.ylim.by.dummy.plots <- function(..., trace) { # call the plotting functions with draw.plot=FALSE to get the ylim trace2(trace, "--get.ylim.by.dummy.plots\n") all.yhat <- NULL if(nsingles) { # get all.yhat by calling with draw.plot=FALSE # have to use explicit arg names to prevent alias probs # with dots, because the user can pass in any name with dots all.yhat <- c(all.yhat, plot_degree1(object=object, degree1=degree1, all1=all1, center=center, ylim=ylim, type=type, nresponse=nresponse, pmethod=pmethod, trace=trace, trace2=trace2, pt.col=pt.col, jitter=jitter, iresponse=iresponse, smooth.col=smooth.col, grid.col=grid.col, inverse.func=inverse.func, grid.func=grid.func, grid.levels=grid.levels, extend=extend, ngrid1=ngrid1, is.int.only=is.int.only, level=level, func=func, nrug=nrug, draw.plot=FALSE, x=x, y=y, singles=singles, resp.levs=resp.levs, ux.list=ux.list, ndiscrete=ndiscrete, pred.names=pred.names, abbr.pred.names=abbr.pred.names, nfigs=nfigs, uy=uy, xflip=xflip, jittered.y=jittered.y, n.apartdep=n.apartdep, ...)) } if(npairs) { all.yhat <- c(all.yhat, plot_degree2(object=object, degree2=degree2, all2=all2, center=center, ylim=ylim, type=type, nresponse=nresponse, pmethod=pmethod, clip=clip, trace=trace, trace2=trace2, pt.col=pt.col, jitter=jitter, iresponse=iresponse, inverse.func=inverse.func, grid.func=grid.func, grid.levels=grid.levels, extend=extend, type2=type2, ngrid2=ngrid2, draw.plot=FALSE, do.par=do.par, x=x, y=y, pairs=pairs, resp.levs=resp.levs, ux.list=ux.list, ndiscrete=ndiscrete, pred.names=pred.names, abbr.pred.names=abbr.pred.names, nfigs=nfigs, nsingles=nsingles, npairs=npairs, xflip=xflip, yflip=yflip, swapxy=swapxy, def.cex.main=def.cex.main, n.apartdep=n.apartdep, ...)) } # 1 2 3 4 5 q <- quantile(all.yhat, probs=c(0, .25, .5, .75, 1), names=FALSE) ylim <- c(q[1], q[5]) # all the data check.vec(ylim, "automatic ylim", expected.len=2) # iqr test to prevent clipping in some pathological cases iqr <- q[4] - q[2] # middle 50% of the data (inter-quartile range) if(clip && !is.na(iqr) && iqr > .05 * (max(y) - min(y))) { median <- q[3] ylim[1] <- max(ylim[1], median - 10 * iqr) ylim[2] <- min(ylim[2], median + 10 * iqr) } if(is.specified(pt.col) || is.specified(smooth.col) || is.specified(level)) ylim <- range1(ylim, jittered.y) # ensure ylim big enough for resp points else if(is.specified(smooth.col)) ylim <- range1(ylim, y) # binary or ternary reponse? # the range(uy) test is needed for binomial models specified using counts else if(length(uy) <= 3 || all(range(y) == c(0,1))) ylim <- range1(ylim, y) if(is.specified(nrug)) # space for rug ylim[1] <- ylim[1] - .1 * (ylim[2] - ylim[1]) trace2(trace, "--done get.ylim.by.dummy.plots\n\n") # have called the plot functions, minimize tracing in further calls to them trace2 <<- 0 # note <<- not <- ylim } #--- get.ylim starts here if(!(is.null(ylim) || is.na(ylim[1]) || length(ylim) == 2)) stop0("ylim must be one of:\n", " NULL all graphs have same vertical axes\n", " NA each graph has its own vertical axis\n", " c(min,max) ylim for all graphs") if(length(ylim) == 2 && ylim[2] <= ylim[1]) stop0("ylim[2] ", ylim[2], " is not greater than ylim[1] ", ylim[1]) if(is.na.ylim) ylim <- c(NA, NA) # won't be used else if(is.null(ylim)) # auto ylim ylim <- if(is.yaxis.a.probability(object, type, trace)) { if(is.specified(pt.col)) c(-0.1, 1.1) # leave space for possibly jittered points else c(0, 1) } else if(is.int.only) range(y, na.rm=TRUE) else get.ylim.by.dummy.plots(trace=trace, ...) if(!anyNA(ylim)) ylim <- fix.lim(ylim) if(trace >= 2) printf("ylim c(%.4g, %.4g) clip %s\n\n", ylim[1], ylim[2], if(clip) "TRUE" else "FALSE") list(ylim=ylim, trace2=trace2) } do.persp.auto.par <- function(simple.ticktype) # want small margins for bigger persp plots { # persp ignores both the global mgp and any mgp passed as arguments # directly to persp so we must adjust margins using par() old.mar <- par("mar") axis.space <- max(par("mgp")) mar <- old.mar if(simple.ticktype) { # Reduce bottom and left margins so we get a bigger persp plot. # This puts the bottom corner of the perp plot at same height at the # bottom of the axis labels on the degree1 plots. mar[1] <- max(mar[1] - axis.space - .5, .5) # bottom margin mar[2] <- max(mar[2] - axis.space - .5, .5) # left margin } else { # detailed mar[1] <- min(mar[1], 1) # enough space for axes mar[2] <- min(mar[2], 1) } par(mar=mar) } do.degree2.auto.par <- function(type2, nfigs, simple.ticktype) { if(type2 == "persp") # perspective plot do.persp.auto.par(simple.ticktype) else { # contour or image plot nrows <- ceiling(sqrt(nfigs)) if(nrows >= 5) mar <- c(2, 2, 1.2, .5) # space for bottom and left axis labels else mar <- c(3, 3, 2, .5) par(mar=mar) cex <- par("cex") # TODO would be better to use nfigs here? mgp <- # compact title and axis annotations if (cex < .7) c(1.2, 0.2, 0) else if(cex < .8) c(1.3, 0.3, 0) else c(1.5, 0.4, 0) par(mgp=mgp) } } plotmo_singles <- function(object, x, nresponse, trace, degree1, all1) { trace2(trace, "\n----plotmo_singles for %s object\n", class.as.char(object)) singles <- plotmo.singles(object=object, x=x, nresponse=nresponse, trace=trace, all1=all1) if(is.character(degree1)) # get all singles, not just those used in the model? singles <- seq_len(NCOL(x)) if(!is.null(singles) && any(is.na(singles))) { # !is.null required only for old R # Following occurs when plotting # train(Petal.Length ~ ., data=iris, method="rpart", tuneLength=4) # because caret converts factor predictors to indicator columns and # thus creates new variable names e.g. Speciesversicolor warning0("NA in singles, will plot all variables (as if all1=TRUE)") singles <- seq_len(NCOL(x)) } if(length(singles)) singles <- sort_unique(singles) # this will drop NAs if any nsingles <- length(singles) if(length(singles)) { degree1 <- check.index(degree1, "degree1", singles, colnames=colnames(x), allow.empty=TRUE, is.degree.spec=TRUE) singles <- singles[degree1] } else if(is.degree.specified(degree1) && degree1[1] != 0 && trace >= 0) warning0("'degree1' specified but no degree1 plots (maybe use all1=TRUE?)") if(trace >= 2) { if(length(singles)) cat("singles:", paste0(singles, " ", colnames(x)[singles], collapse=", "), "\n") else cat("no singles\n") } singles # a vector of indices of predictors for degree1 plots } plotmo_pairs <- function(object, x, nresponse, trace, all2, degree2) { trace2(trace, "\n----plotmo_pairs for %s object\n", class.as.char(object)) pairs <- NULL if(is.character(degree2) && length(degree2) == 2) { # degree2 is a two element character vector # treat as a special case (intentional inconsistency) singles <- seq_len(NCOL(x)) # get all singles, not just those used in the model i1 <- check.index(degree2[1], "degree2", singles, colnames=colnames(x)) if(length(i1) > 0) { i2 <- check.index(degree2[2], "degree2", singles, colnames=colnames(x)) if(length(i2) > 0) { if(i1[1] == i2[1]) warning0("both elements of degree2 are the same") pairs <- matrix(c(i1[1], i2[1]), nrow=1, ncol=2) } } } else { pairs <- if(all2) get.all.pairs.from.singles(object, x, trace, all2) else plotmo.pairs(object, x, nresponse, trace, all2) if(NROW(pairs)) { # put lowest numbered predictor first and remove duplicate pairs pairs <- unique(t(apply(pairs, 1, sort))) # order the pairs on the predictor order order <- order(pairs[,1], pairs[,2]) pairs <- pairs[order, , drop=FALSE] i <- check.index(degree2, "degree2", pairs, colnames=colnames(x), allow.empty=TRUE, is.degree.spec=TRUE) pairs <- pairs[i, , drop=FALSE] # length(i) will be 0 if check.index not ok } else if(is.degree.specified(degree2) && degree2[1] != 0 && trace >= 0) warning0("'degree2' specified but no degree2 plots (maybe use all2=TRUE?)") } if(trace >= 2) { if(NROW(pairs)) { cat("pairs:\n") print(matrix(paste(pairs, colnames(x)[pairs]), ncol=2)) } else cat("no pairs\n") } pairs } # pt.col is a formal arg, but for back compat we also support col.response get.pt.col <- function(pt.col, ...) { pt.col <- pt.col if(!is.specified(pt.col) && !is.dot("col", ...)) pt.col <- dota("col.response", EX=0, ...) # partial match, "col" excluded above # if any other response argument is specified, set the response color if(!is.specified(pt.col) && is.dot("pch cex.response pch.response pt.cex pt.pch", EX=c(1,1,1,0,0), ...)) pt.col <- "slategray4" if(!is.specified(pt.col)) pt.col <- 0 pt.col } get.jitter <- function(jitter, ...) { if(anyNA(jitter)) # allow jitter=NA jitter <- 0 check.numeric.scalar(jitter, logical.ok=TRUE) jitter <- as.numeric(jitter) if(jitter < 0 || jitter > 100) stop0("jitter=", jitter, " is illegal") jitter } get.smooth.col <- function(smooth.col, ...) { smooth.col <- dota("col.smooth", DEF=smooth.col, ...) # back compat # if any other smooth argument is specified, set the smooth color if(!is.specified(smooth.col) && is.dot("lty.smooth lwd.smooth lwd.loess smooth.lty smooth.lwd", EX=c(1,1,1,0,0), ...)) smooth.col <- 2 if(!is.specified(smooth.col)) smooth.col <- 0 smooth.col } get.ngrid1 <- function(ngrid1, y, ...) { check.integer.scalar(ngrid1) if(ngrid1 < 2) stop0("illegal ngrid1 ", ngrid1) if(ngrid1 > 1000) { warning0("clipped ngrid1=", ngrid1, " to 1000") ngrid1 <- 1000 } ngrid1 } get.ngrid2 <- function(ngrid2, y, ...) { check.integer.scalar(ngrid2) if(ngrid2 < 2) stop0("illegal ngrid2 ", ngrid2) if(ngrid2 > 500) { warning0("clipped ngrid2=", ngrid2, " to 500") ngrid2 <- 500 } ngrid2 } get.level <- function(level, ...) { if(anyNA(level) || is.null(level)) # treat NA and NULL as 0 level <- 0 check.numeric.scalar(level) # some code for backward compatibility (se is now deprecated) se <- 0 if(is.dot("se", ...)) se <- dota("se", ...) check.numeric.scalar(se, logical.ok=TRUE) if(se && level) # both specified? stop0("plotmo's 'se' argument is deprecated, please use 'level' instead") if(identical(se, TRUE)) { level <- .95 warning0( "plotmo's 'se' argument is deprecated, please use 'level=.95' instead") } else if(se < 0 || se > 5) # 5 is arb stop0("plotmo's 'se' argument is deprecated, please use 'level=.95' instead") else if(se > 0 && se < 1) # e.g. se=.95 stop0("plotmo's 'se' argument is deprecated, please use 'level=.95' instead") else if(se > 0) { level <- 1 - 2 * (1 - pnorm(se)) # se=2 becomes level=.954 warning0(sprint( "plotmo's 'se' argument is deprecated, please use 'level=%.2f' instead", level)) } else if(level != 0 && (level < .5 || level >= 1)) stop0("level=", level, " is out of range, try level=.95") level } get.unique.xyvals <- function(x, y, npoints, trace) { # convert special values of npoints ncases <- nrow(x) check.integer.scalar(npoints, min=-1, null.ok=TRUE, logical.ok=TRUE) npoints.was.neg <- FALSE if(is.null(npoints)) npoints <- 0 else if(is.logical(npoints)) npoints <- if(npoints) ncases else 0 else if(npoints == -1) { npoints.was.neg <- TRUE npoints <- ncases } else if(npoints > ncases) npoints <- ncases # Use a maximum of NMAX cases for calculating ux.list and uy # (unless npoints is bigger or TRUE or negative). # Allows plotmo to be fast even on models with millions of cases. NMAX <- 1e4 nmax <- max(NMAX, npoints) if(!npoints.was.neg && ncases > nmax) { trace2(trace, "using %g of %g cases to calculate unique x and y values\n", npoints, ncases) isubset <- get.isubset(y, npoints) y <- y[isubset] x <- x[isubset, , drop=FALSE] } list(ux.list = get.ux.list(x, trace), uy = unique(y), npoints = npoints) } # return a list, each element is the unique levels for corresponding column of x # TODO this is where we spend a lot of time in plotmo for big data get.ux.list <- function(x, trace) { ux.list <- list(colnames(x)) for(i in seq_len(ncol(x))) ux.list[[i]] <- if(is.factor(x[,i])) levels(x[,i]) else sort_unique(x[,i]) trace2(trace, "number of x values: %s\n", paste.trunc(colnames(x), sapply(ux.list, length))) ux.list } points.or.text <- function(..., x, y, pt.col, iresponse) { stopifnot(!is.na(pt.col)) cex <- dota("pt.cex cex.response", DEF=1, EX=c(0,1), NEW=1, ...) cex <- cex * pt.cex(NROW(x)) pch <- dota("pt.pch pch.response pch", DEF=20, EX=c(0,1,1), NEW=1, ...) # recycle then select only iresponse points n <- length(y) col <- repl(pt.col, n)[iresponse] pch <- repl(pch, n)[iresponse] cex <- repl(cex, n)[iresponse] x <- x[iresponse] y <- y[iresponse] if(is.character(pch) && pch[1] != ".") call.plot(graphics::text.default, PREFIX="pt.", force.x = x, force.y = y, force.labels = pch, force.col = col, force.cex = pmax(.1, .9 * cex), def.xpd = NA, # allow writing beyond plot area ...) else call.plot(graphics::points.default, PREFIX="pt.", force.x = x, force.y = y, force.pch = pch, force.col = col, force.cex = cex, # commented out because looks messy in image plots # def.xpd = NA, # allow writing beyond plot area ...) } # TODO Following handling of global variables is unpleasant. # I would prefer to have two namespace level variables, # degree1.data.global and degree2.data.global (similar to # degree1.xgrid.global etc.) # But CRAN check won't allow # unlockBinding(degree1.data.global, asNamespace("plotmo")) # so we can update those variables. # Also, we can't directly use assignInMyNamespace for these # variables because we need to update individual list elements. make.static.list <- function() { data <- list() func <- function(i, newdata=NULL) { if(is.null(i)) # init the data? data <<- list() else if(!missing(newdata)) # assign to the data? data[[i]] <<- newdata else if(i <= length(data)) # return the data element data[[i]] else # return the element, but it's NULL NULL } func } # The following global variables are for efficiency when we make two # passes through the plot. We store the data from the first pass so we # don't have to regenerate it. (We make two passes if we need to # precalculate ylim before doing the actual plotting.) # NULL is used here to indicate uninitialized. degree1.xgrid.global <- NULL degree2.xgrid.global <- NULL partdep.x.global <- NULL # dataframe of background vars we integrate over degree1.data <- make.static.list() degree2.data <- make.static.list() # the following global variables are for communicating across functions trace.call.global <- 0 # nonzero to trace call to predict, residuals, etc init.global.data <- function() { assignInMyNamespace("trace.call.global", 0) assignInMyNamespace("degree1.xgrid.global", NULL) assignInMyNamespace("degree2.xgrid.global", NULL) assignInMyNamespace("partdep.x.global", NULL) degree1.data(NULL) # clear the degree1 data by passing NULL degree2.data(NULL) } plot_degree1 <- function( # plot all degree1 graphs # copy of args from plotmo, some have been tweaked slightly object, degree1, all1, center, ylim, type, nresponse, pmethod, trace, trace2, pt.col, jitter, iresponse, smooth.col, grid.col, inverse.func, grid.func, grid.levels, extend, ngrid1, is.int.only, level, func, nrug, # the following args are generated in plotmo draw.plot, # draw.plot=FALSE means get predictions but don't actually plot x, y, singles, resp.levs, ux.list, ndiscrete, pred.names, abbr.pred.names, nfigs, uy, xflip, jittered.y, n.apartdep, ...) { get.degree1.data <- function(isingle) { # check if plot_degree1 was already called by get.ylim.by.dummy.plots data <- degree1.data(isingle) if(!is.null(data)) # data is already initialized? return(data) # yes, use it intervals <- NULL # prediction intervals, NULL if level argument not used # create data.frame of predictor values to be plotted, # by updating xgrid for this predictor (one column gets updated) xframe <- get.degree1.xframe(xgrid, x, ipred, ngrid1, ndiscrete, ux.list, extend) trace2(trace, "degree1 plot%d (pmethod \"%s\") variable %s\n", isingle, pmethod, pred.names[ipred]) if(pmethod == "partdep" || pmethod == "apartdep") { # following commented out because causes warning in R 4.2.0: length(x) = 64 > 1' in coercion to 'logical(1)' # stopifnot(!is.na(partdep.x) && !is.null(partdep.x)) yhat <- degree1.partdep.yhat(object, type, nresponse, pmethod, inverse.func, trace2, partdep.x, xframe, ipred, pred.names, resp.levs, ...) if(level > 0) { # get prediction intervals? warning0( "ignoring the 'level' argument because plotmo pmethod=\"", pmethod, "\"") level <- 0 } } else { # classic plotmo plot yhat <- plotmo_predict(object, xframe, nresponse, type, resp.levs, trace2, inverse.func, ...)$yhat if(level > 0) # get prediction intervals? intervals <- plotmo_pint(object, xframe, type, level, trace2, ipred, inverse.func) } temp <- blockify.degree1.frame(xframe, yhat, intervals, ipred, ux.list, ndiscrete) xframe <- temp$xframe yhat <- temp$yhat intervals <- temp$intervals if(center) { yhat <- my.center(yhat, trace2) intervals$fit <- my.center(intervals$fit, trace2) intervals$lwr <- my.center(intervals$lwr, trace2) intervals$upr <- my.center(intervals$upr, trace2) intervals$cint.lwr <- my.center(intervals$cint.lwr, trace2) intervals$cint.upr <- my.center(intervals$cint.upr, trace2) } all.yhat <- c(all.yhat, yhat, intervals$lwr, intervals$upr, intervals$cint.lwr, intervals$cint.upr) data <- list(xframe=xframe, yhat=yhat, intervals=intervals, all.yhat=all.yhat) if(!draw.plot) # save the data, if there is going to be a next time degree1.data(isingle, data) data } draw.degree1 <- function(...) { draw.degree1.fac <- function(...) { draw.grid(grid.col, nx=NA, ...) # nx=NA for horiz-only grid draw.fac.intervals(xframe[,ipred], intervals, ...) if(is.specified(pt.col)) points.or.text(x=jittered.x, y=yscale * (yshift + jittered.y), pt.col=pt.col, iresponse=iresponse, ...) draw.smooth1(smooth.col, x, ipred, yscale * (yshift + y), ux.list, ndiscrete, center, ...) # formal args for plot.factor, needed because "CRAN check" # doesn't allow ":::" and plot.factor isn't public plot.factor.formals <- c("x", "y", "legend.text") call.plot(graphics::plot, # calls plot.factor PREFIX = "degree1.", FORMALS = plot.factor.formals, TRACE = if(isingle == 1 && trace >= 2) trace-1 else 0, force.x = xframe[,ipred], force.y=yhat, force.add = TRUE, def.xaxt = if(xaxis.is.levs) "n" else "s", def.yaxt = if(yaxis.is.levs) "n" else "s", force.lty = 1, # else lty=2 say is printed weirdly force.lwd = 1, ...) if(xaxis.is.levs) # plot x level names along the x axis mtext(xlevnames, side=1, at=1:length(xlevnames), cex=par("cex") * cex.lab, line=.5, las=get.las(xlevnames)) if(yaxis.is.levs) # plot y level names along the y axis mtext(ylevnames, side=2, at=1:length(ylevnames), cex=par("cex") * cex.lab, line=.5, las=get.las(ylevnames)) } draw.degree1.numeric <- function(...) { draw.grid(grid.col, ...) draw.numeric.intervals(xframe[,ipred], intervals, ...) draw.func(func, object, xframe, ipred, center, trace, ...) if(is.specified(pt.col)) points.or.text(x=jittered.x, y=yscale * (yshift + jittered.y), pt.col=pt.col, iresponse=iresponse, ...) draw.smooth1(smooth.col, x, ipred, yscale * (yshift + y), ux.list, ndiscrete, center, ...) call.plot(graphics::lines.default, PREFIX="degree1.", force.x = xframe[,ipred], force.y = yhat, force.col = dota("degree1.col col.degree1 col", EX=c(0,1,1), DEF=1, NEW=1, ...), force.lty = dota("degree1.lty lty.degree1 lty", EX=c(0,1,1), DEF=1, NEW=1, ...), force.lwd = dota("degree1.lwd lwd.degree1 lwd", EX=c(0,1,1), DEF=1, NEW=1, ...), ...) draw.degree1.numeric.rug(nrug, numeric.x, jittered.x, ...) } #--- draw.degree1 starts here x1 <- x[,ipred] numeric.x <- jittered.x <- as.numeric(x1) jittered.x <- apply.jitter(numeric.x, jitter) xlim <- get.degree1.xlim(ipred, xframe, ux.list, ndiscrete, pt.col, jittered.x, xflip, ...) # title of the current plot main <- dota("main", ...) main <- if(is.specified(main)) repl(main, isingle)[isingle] else { main <- "" if(nfigs > 1 && !is.degree.specified(degree1)) main <- paste0(isingle, " ") # show plot number in headers paste(main, abbr.pred.names[ipred]) } xlevnames <- abbreviate(levels(xframe[,ipred]), minlength=6, strict=TRUE) xaxis.is.levs <- is.factor(x1) && length(xlevnames) <= 12 yaxis.is.levs <- length(resp.levs) >= 1 && length(resp.levs) <= 12 if(yaxis.is.levs) ylevnames <- abbreviate(resp.levs, minlength=6, strict=TRUE) yaxis.is.levs <- FALSE # TODO should only do this if response is a string or a factor xlab <- dota("xlab", ...) xlab <- if(is.null(xlab)) abbr.pred.names[ipred] else if(is.specified(xlab)) repl(xlab, isingle)[isingle] else "" ylab <- dota("ylab", DEF=NULL, ...) ylab <- if(is.specified(ylab)) repl(ylab, isingle)[isingle] else "" call.plot(graphics::plot.default, PREFIX="degree1.", TRACE = if(isingle == 1 && trace >= 2) trace-1 else 0, force.x = xframe[,ipred], force.y = yhat, force.type = "n", # nothing in interior of plot yet force.main = main, force.xlab = xlab, force.ylab = ylab, force.xlim = xlim, force.ylim = ylim, def.xaxt = if(xaxis.is.levs) "n" else "s", def.yaxt = if(yaxis.is.levs) "n" else "s", ...) if(yaxis.is.levs) # plot y level names along the y axis mtext(ylevnames, side=2, at=1:length(ylevnames), cex=par("cex") * cex.lab, line=.5, las=get.las(ylevnames)) if(center && !is.specified(grid.col) && !is.specified(dota("col.grid", ...))) abline(h=0, col="gray", lwd=.6) # gray line at y=0 temp <- get.y.shift.scale(pt.col, ylim, uy, ndiscrete, trace) yshift <- temp$yshift yscale <- temp$yscale if(is.factor(x1)) draw.degree1.fac(...) else draw.degree1.numeric(...) if(is.int.only) # make it obvious that this is an intercept-only model legend("topleft", "intercept-only model", bg="white") } #--- plot_degree1 starts here trace2(trace, "--plot.degree1(draw.plot=%s)\n", if(draw.plot) "TRUE" else "FALSE") # get the x matrix we will plot, will be updated later for each predictor one by one if(!is.null(degree1.xgrid.global)) # already have the data? xgrid <- degree1.xgrid.global # yes, use it else { xgrid <- get.degree1.xgrid(x, grid.func, grid.levels, pred.names, ngrid1) if(!draw.plot) # save the data, if there is going to be a next time assignInMyNamespace("degree1.xgrid.global", xgrid) } if(!is.null(partdep.x.global)) # already have partdep.x? partdep.x <- partdep.x.global # yes use it else { partdep.x <- get.partdep.x(pmethod, x, y, n.apartdep, grid.levels, pred.names) if(!draw.plot) # save the data, if there is going to be a next time assignInMyNamespace("partdep.x.global", partdep.x) } if(pmethod == "plotmo" && draw.plot && trace >= 0 && ncol(xgrid) > 1) print_grid_values(xgrid, trace) cex.lab <- dota("cex.lab", DEF=.8 * par("cex.main"), ...) all.yhat <- NULL for(isingle in seq_along(singles)) { if(isingle == 2 && trace2 == 2) { trace2 <- 1 printf("Reducing trace level for subsequent degree1 plots\n") } ipred <- singles[isingle] # ipred is the predictor index i.e. col in model mat # following happens with lm if you do e.g. ozone1$doy <- NULL after using ozone1 # this won't catch all such errors if(ipred > NCOL(x)) stop0("illegal index=", ipred, " (missing column in x?) NCOL(x)=", NCOL(x)) temp <- get.degree1.data(isingle) xframe <- temp$xframe yhat <- temp$yhat intervals <- temp$intervals all.yhat <- temp$all.yhat if(draw.plot) draw.degree1(...) } all.yhat # numeric vector of all predicted values } # When we are predicting a probability (0 to 1), we want the displayed # points to be on the plot, even if factor levels are say 1 and 2. # In that situation, we scale the displayed points into range 0...1. get.y.shift.scale <- function(pt.col, ylim, uy, ndiscrete, trace) { yshift <- 0 yscale <- 1 if(is.specified(pt.col)) { # for efficiency, only calculate if necessary ymin <- min(uy) ymax <- max(uy) if(is.specified(ylim[1]) && round(ylim[1]) >= 0 && is.specified(ylim[2]) && round(ylim[2]) <= 1 && # check that y is a factor (or factor-like) round(ymax) == ymax && length(uy) <= ndiscrete && min(uy) >= 0) { yshift <- -ymin yscale <- 1 / (yshift + ymax) trace2(trace, "Will shift and scale displayed points specified by pt.col: yshift %g yscale %g\n", yshift, yscale) } } list(yshift=yshift, yscale=yscale) } get.degree1.xlim <- function(ipred, xframe, ux.list, ndiscrete, pt.col, jittered.x, xflip, ...) { xlim <- dota("xlim", ...) if(is.specified(xlim)) stopifnot(is.numeric(xlim), length(xlim) == 2) else { x1 <- xframe[,ipred] xlim <- range1(x1) if(is.factor(x1)) { xlim[1] <- xlim[1] - .4 xlim[2] <- xlim[2] + .4 } else if(length(ux.list[[ipred]]) <= ndiscrete) xlim <- c(xlim[1] - .1, xlim[2] + .1) if(is.specified(pt.col)) xlim <- range1(xlim, jittered.x) } xlim <- fix.lim(xlim) if(xflip) { temp <- xlim[1] xlim[1] <- xlim[2] xlim[2] <- temp } xlim } apply.jitter <- function(x, jitter, adjust=1) { if(jitter == 0) return(x) jitter(x, factor=adjust * jitter) } get.iresponse <- function(npoints, ncases) # get indices of xrows { check.integer.scalar(npoints) if(npoints == 0) return(NULL) if(npoints == 1) npoints <- -1 if(npoints <= 1 || npoints > ncases) # -1 or TRUE means all cases npoints <- ncases if(npoints == ncases) seq_len(ncases) else sample(seq_len(ncases), size=npoints, replace=FALSE) } draw.smooth1 <- function(smooth.col, x, ipred, y, ux.list, ndiscrete, center, ...) { if(!is.specified(smooth.col)) return(NULL) x1 <- x[,ipred] is.discrete.x <- FALSE if(is.factor(x1)) { is.discrete.x <- TRUE levels <- sort_unique(as.numeric(x1)) } else if(length(ux.list[[ipred]]) <= ndiscrete) { is.discrete.x <- TRUE levels <- ux.list[[ipred]] } if(is.discrete.x) { # x1 has discrete levels, display the mean y at each value of x1 smooth <- sapply(split(y, x1), mean) if(center) smooth <- my.center(smooth) else smooth call.plot(graphics::lines.default, PREFIX="smooth.", drop.f=1, force.x = levels, force.y = smooth, force.col = smooth.col, force.lty = dota("smooth.lty lty.smooth", EX=c(0,1), DEF=1, NEW=1, ...), force.lwd = dota("smooth.lwd lwd.smooth lwd.loess", EX=c(0,1,1), DEF=1, NEW=1, ...), force.pch = dota("smooth.pch", DEF=20, EX=0, ...), def.type = "b", ...) } else { # For less smoothing (so we can better judge earth inflection points), # we use a default value for f lower than the default 2/3. smooth.f <- dota("smooth.f loess.f", DEF=.5, NEW=1, ...) check.numeric.scalar(smooth.f) stopifnot(smooth.f > .01, smooth.f < 1) smooth <- lowess(x1, y, f=smooth.f) y <- if(center) my.center(smooth$y) else smooth$y call.plot(graphics::lines.default, PREFIX="smooth.", drop.f=1, force.x = smooth$x, force.y = y, force.col = smooth.col, force.lty = dota("smooth.lty lty.smooth", EX=c(0,1), DEF=1, NEW=1, ...), force.lwd = dota("smooth.lwd lwd.smooth lwd.loess", EX=c(0,1,1), DEF=1, NEW=1, ...), force.pch = dota("smooth.pch", DEF=20, EX=0, ...), ...) } } draw.degree1.numeric.rug <- function(nrug, numeric.x, jittered.x, ...) { if(is.character(nrug)) draw.density.along.the.bottom(numeric.x, ...) else { # must be numeric nrug check.integer.scalar(nrug, logical.ok=TRUE) rug.x <- # nrug < 0 is for backwards compat if(nrug == 1 || nrug < 0 || nrug > length(numeric.x)) jittered.x else if(nrug > 0) quantile(numeric.x, probs=seq(from=0, to=1, length.out=nrug+1), na.rm=TRUE, names=FALSE) else NA if(length(rug.x) > 1) { stopifnot(length(jittered.x) == length(numeric.x)) call.plot(graphics::rug, force.x=rug.x, def.quiet=TRUE, ...) } } } draw.grid <- function(grid.col, nx=NULL, ...) { if(is.specified(grid.col) || is.specified(dota("col.grid", ...))) { if(is.specified(grid.col) && is.logical(grid.col) && grid.col) grid.col <- "lightgray" grid.col <- if(is.specified(grid.col)) grid.col else dota("col.grid", DEF="lightgray", ...) # grid() doesn't have a dots arg so we invoke call.plot without dots call.plot(graphics::grid, force.nx = dota("grid.nx", DEF=nx, ...), force.ny = dota("grid.ny", DEF=NULL, ...), force.col = grid.col, force.lty = dota("grid.lty", DEF=1, ...), force.lwd = dota("grid.lwd", DEF=1, ...)) } } get.level.shades <- function(intervals, ...) { level.shade <- dota("level.shade shade.pints", DEF="mistyrose2", ...) if(is.null(intervals$lwr) || is.null(intervals$cint.lwr)) c(level.shade, level.shade) else { # use level.shade2 only if two kinds of intervals # use exact match here because level.shade2 is also matched by level.shade level.shade2 <- dota("level.shade2 shade2.pints", DEF="mistyrose4", ...) c(level.shade, level.shade2) } } # draw std err bars for a numeric predictor draw.numeric.intervals <- function(x, intervals, ...) { if(!is.null(intervals)) { level.shades <- get.level.shades(intervals, ...) if(!is.null(intervals$lwr)) polygon1(x=x, lwr=intervals$lwr, upr=intervals$upr, shade=level.shades[1], ...) if(!is.null(intervals$cint.lwr)) polygon1(x=x, lwr=intervals$cint.lwr, upr=intervals$cint.upr, shade=level.shades[2]) if(!is.null(intervals$lwr) || !is.null(intervals$cint.lwr)) box() # replot the box because intervals sometimes drawn over it } } # TODO you can't get just the confidence lines with no shading, following looks not ok: # plotmo(a, level=.8, level.lty=1, level.border=1, level.shade=2, level.density=0) polygon1 <- function(x, lwr, upr, shade, ...) { call.plot(graphics::polygon, PREFIX="level.", drop.shade=1, drop.shade2=1, force.x = c(x[1], x, rev(x)), force.y = c(lwr[1], lwr, rev(upr)), force.col = shade, def.border = shade, def.lty = 0, ...) } # draw std err bands for a factor predictor draw.fac.intervals <- function(x, intervals, ...) { draw.intervals <- function(lwr, upr, shade) { for(ilev in seq_along(levels(x))) { min <- min(lwr[[ilev]]) max <- max(upr[[ilev]]) polygon(c(ilev - .4, ilev - .4, ilev + .4, ilev + .4), c(min, max, max, min), col=shade, border=shade, lty=0) } } if(!is.null(intervals)) { level.shades <- get.level.shades(intervals, ...) if(!is.null(intervals$lwr)) draw.intervals(split(intervals$lwr, x), split(intervals$upr, x), level.shades[1]) if(!is.null(intervals$cint.lwr)) draw.intervals(split(intervals$cint.lwr, x), split(intervals$cint.upr, x), level.shades[2]) if(!is.null(intervals$lwr) || !is.null(intervals$cint.lwr)) box() # replot the box because intervals sometimes drawn over it } } # draw the func arg, if specified draw.func <- function(func, object, xframe, ipred, center, trace, ...) { if(!is.null(func)) { print_summary(xframe, "Data for func", trace) if(!is.function(func)) stop0("'func' is not a function"); y <- process.y(func(xframe), object, type="response", nresponse=1, nrow(xframe), expected.levs=NULL, trace, "func returned")$y if(center) y <- my.center(y, trace) call.plot(graphics::lines.default, PREFIX="func.", force.x = xframe[,ipred], force.y = y, def.type = "l", force.col = dota("func.col col.func", EX=c(0,1), DEF="lightblue3", NEW=1, ...), force.lty = dota("func.lty lty.func", EX=c(0,1), DEF=1, NEW=1, ...), force.lwd = dota("func.lwd lwd.func", EX=c(0,1), DEF=2, NEW=1, ...), ...) } } get.def.nticks <- function(x, ipred1, ipred2) # for persp plot { # nticks is just a suggestion for persp, so we don't fret over it too much nticks <- 5 # default nticks if both axes numeric (no factors) if(is.factor(x[[ipred1]])) # use number of factor levels to nticks <- length(levels(x[[ipred1]])) # avoid e.g. "1.5" on factor axes if(is.factor(x[[ipred2]])) nticks <- max(nticks, length(levels(x[[ipred2]]))) nticks <- max(nticks, 2) # must be at least 2 min(nticks, 6) # but not more than 6 (not enough space) } plot_degree2 <- function( # plot all degree2 graphs # copy of args from plotmo, some have been tweaked slightly object, degree2, all2, center, ylim, type, nresponse, pmethod, clip, trace, trace2, pt.col, jitter, iresponse, inverse.func, grid.func, grid.levels, extend, type2, ngrid2, # the following args are generated in plotmo draw.plot, # draw.plot=FALSE means get and return all.yhat but don't actually plot do.par, x, y, pairs, resp.levs, ux.list, ndiscrete, pred.names, abbr.pred.names, nfigs, nsingles, npairs, xflip, yflip, swapxy, def.cex.main, n.apartdep, ...) { get.degree2.data <- function(ipair) { data <- degree2.data(ipair) if(!is.null(data)) # data is already initialized? return(data) # yes, use it # create data.frame of x values to be plotted, # by updating xgrid for this predictor (two columns get updated) # (but for partdep plots, xframe isn't used, we use just x1grid and x2grid) temp <- get.degree2.xframe(xgrid, x, ipred1, ipred2, ngrid2, xranges, ux.list, ndiscrete) xframe <- temp$xframe # data frame of medians x1grid <- temp$x1grid # vec of values for the first predictor x2grid <- temp$x2grid # vec of values for the second predictor trace2(trace, "degree2 plot%d (pmethod \"%s\") variables %s:%s\n", ipair, pmethod, pred.names[ipred1], pred.names[ipred2]) if(pmethod == "partdep" || pmethod == "apartdep") { # following commented out because causes warning in R 4.2.0: length(x) = 91 > 1' in coercion to 'logical(1)' # stopifnot(!is.na(partdep.x) && !is.null(partdep.x)) yhat <- degree2.partdep.yhat(object, type, nresponse, pmethod, inverse.func, trace, partdep.x, x1grid, ipred1, x2grid, ipred2, pred.names, resp.levs, ...) } else { # classic plotmo plot yhat <- plotmo_predict(object, xframe, nresponse, type, resp.levs, trace2, inverse.func, ...)$yhat } x1grid <- as.numeric(x1grid) x2grid <- as.numeric(x2grid) # image plots for factors look better if not blockified if(type2 != "image") { temp <- blockify.degree2.frame(x, yhat, x1grid, x2grid, ipred1, ipred2, ux.list, ndiscrete) yhat <- temp$yhat x1grid <- temp$x1grid x2grid <- temp$x2grid } if(center) yhat <- my.center(yhat, trace2) data <- list(xframe=xframe, x1grid=x1grid, x2grid=x2grid, yhat=matrix(yhat, nrow=length(x1grid), ncol=length(x2grid)), def.nticks=get.def.nticks(x, ipred1, ipred2)) if(!draw.plot) # save the data, if there is going to be a next time degree2.data(ipair, data) data } draw.degree2 <- function(type2 = c("persp", "contour", "image"), def.nticks, ...) { name1 <- abbr.pred.names[ipred1] name2 <- abbr.pred.names[ipred2] # title of the current plot main <- dota("main", ...) main <- if(is.specified(main)) repl(main, nsingles+ipair)[nsingles+ipair] else { main <- "" if(nfigs > 1 && !is.degree.specified(degree2)) main <- paste0(ipair, " ") # show plot number in headers if(swapxy) paste0(main, name2, ": ", name1) else paste0(main, name1, ": ", name2) } if(clip) { yhat[yhat < ylim[1]] <- NA # we don't clip upper values for persp plot because its own clipping is ok # (whereas its own clipping for lower values tends to allow overwrite of axes). if(type2 != "persp") yhat[yhat > ylim[2]] <- NA } switch(type2, persp=plot.persp( x=x, x1grid=x1grid, x2grid=x2grid, yhat=yhat, name1=name1, name2=name2, ipred1=ipred1, ipred2=ipred2, ipair=ipair, nsingles=nsingles, trace=trace, ylim=ylim, xflip=xflip, yflip=yflip, swapxy=swapxy, ngrid2=ngrid2, main2=main, ticktype2=ticktype, def.cex.main=def.cex.main, def.nticks=def.nticks, ...), contour=plot.contour( x=x, x1grid=x1grid, x2grid=x2grid, yhat=yhat, name1=name1, name2=name2, ipred1=ipred1, ipred2=ipred2, xflip=xflip, yflip=yflip, swapxy=swapxy, main2=main, pt.col=pt.col, jitter=jitter, ux.list=ux.list, ndiscrete=ndiscrete, iresponse=iresponse, ...), image=plot.image( x=x, x1grid=x1grid, x2grid=x2grid, yhat=yhat, name1=name1, name2=name2, ipred1=ipred1, ipred2=ipred2, xflip=xflip, yflip=yflip, swapxy=swapxy, main2=main, pt.col=pt.col, jitter=jitter, ux.list=ux.list, ndiscrete=ndiscrete, iresponse=iresponse, ...)) } #--- plot_degree2 starts here trace2(trace, "--plot.degree2(draw.plot=%s)\n", if(draw.plot) "TRUE" else "FALSE") stopifnot(npairs > 0) # need ticktype to determine degree2 margins ticktype <- dota("persp.ticktype", DEF="simple", EX=0, ...) ticktype <- match.choices(ticktype, c("simple", "detailed"), "ticktype") simple.ticktype <- substr(ticktype, 1, 1) == "s" if(draw.plot) { if(do.par) { opar=par("mar", "mgp") on.exit(par(mar=opar$mar, mgp=opar$mgp)) do.degree2.auto.par(type2, nfigs, simple.ticktype) } else if(nsingles && type2 == "persp") { # persp needs smaller margins than degree1 plots # the nsingles check above prevents us from modifying margins # if the user is simply plotting one or more degree2 plots opar=par("mar", "mgp") on.exit(par(mar=opar$mar, mgp=opar$mgp)) do.persp.auto.par(simple.ticktype) } } # get the x matrix we will plot, will be updated later for each pair of predictors xranges <- get.degree2.xranges(x, extend, ux.list, ndiscrete) if(!is.null(degree2.xgrid.global)) # already have the data? xgrid <- degree2.xgrid.global # yes, use it else { xgrid <- get.degree2.xgrid(x, grid.func, grid.levels, pred.names, ngrid2) if(!draw.plot) # save the data, if there is going to be a next time assignInMyNamespace("degree2.xgrid.global", xgrid) } if(!is.null(partdep.x.global)) # already have partdep.x? partdep.x <- partdep.x.global # yes use it else { partdep.x <- get.partdep.x(pmethod, x, y, n.apartdep, grid.levels, pred.names) if(!draw.plot) # save the data, if there is going to be a next time assignInMyNamespace("partdep.x.global", partdep.x) } all.yhat <- NULL for(ipair in seq_len(npairs)) { ipred1 <- pairs[ipair,1] # index of first predictor ipred2 <- pairs[ipair,2] # index of second predictor if(ipair == 2 && trace2 == 2) { trace2 <- 1 printf("Reducing trace level for subsequent degree2 plots\n") } temp <- get.degree2.data(ipair) xframe <- temp$xframe x1grid <- temp$x1grid x2grid <- temp$x2grid yhat <- temp$yhat all.yhat <- c(all.yhat, yhat) if(draw.plot) draw.degree2(type2, temp$def.nticks, ...) } all.yhat } get.degree2.xranges <- function(x, extend, ux.list, ndiscrete) { # we use a data.frame for xranges so columns can have different types (e.g. Dates) xranges <- as.data.frame(matrix(NA, ncol=ncol(x), nrow=2)) colnames(xranges) <- colnames(x) for(icol in seq_len(ncol(x))) { x1 <- x[,icol] xrange <- range1(x1, na.rm=TRUE) nxvals <- length(ux.list[[icol]]) # TODO this extends xrange correctly but that doesn't suffice # because get.degree2.xframe doesn't necessarily use xranges if(extend != 0 && nxvals > ndiscrete && !is.factor(x1)) { stopifnot(xrange[2] >= xrange[1]) ext <- extend * (xrange[2] - xrange[1]) xrange[1] <- xrange[1] - ext xrange[2] <- xrange[2] + ext } xranges[,icol] <- xrange } xranges } draw.response.sites <- function(x, ipred1, ipred2, pt.col, jitter, ux.list, ndiscrete, iresponse, swapxy, ...) { if(swapxy) { x1 <- x[,ipred2] x2 <- x[,ipred1] } else { x1 <- x[,ipred1] x2 <- x[,ipred2] } points.or.text( x=apply.jitter(as.numeric(x1), jitter, adjust=1.5), y=apply.jitter(as.numeric(x2), jitter, adjust=1.5), pt.col=pt.col, iresponse=iresponse, ...) } get.diag.val <- function(yhat, diag1, diag2) # return first non NA along diag { vals <- yhat[diag1, diag2] (vals[!is.na(vals)])[1] # return first non NA in vals, length zero if all NA } plot.persp <- function(x, x1grid, x2grid, yhat, name1, name2, ipred1, ipred2, ipair, nsingles, trace, ylim, xflip, yflip, swapxy, ngrid2, main2, ticktype2, def.cex.main, def.nticks, ...) { get.theta <- function(...) # theta arg for persp() { theta <- dota("persp.theta theta", EX=c(0,1), ...) if(anyNA(theta)) { # theta not specified by the user? # rotate graph so highest point is farthest (this can swap axes) # imax corner numbering with theta=-35 # 1 # 2 /\ 4 # \/ # 3 theta <- -35 nr <- nrow(yhat) nc <- ncol(yhat) imax <- which.max(c( get.diag.val(yhat, nr:1, nc:1), get.diag.val(yhat, 1:nr, nc:1), get.diag.val(yhat, 1:nr, 1:nc), get.diag.val(yhat, nr:1, 1:nc))) if(length(imax)) # length>0 unless entire diag is NA theta <- theta + switch(imax, 0, 90, 180, 270) } theta } #--- plot.persp starts here # following needed because persp() rejects a reversed xlim or ylim if(xflip) warning0("ignoring xflip=TRUE for persp plot") if(yflip) warning0("ignoring yflip=TRUE for persp plot") theta <- get.theta(...) cex1 <- par("cex") # persp needs an explicit cex arg, doesn't use par("cex") trace2(trace, "persp(%s:%s) theta %.3g\n", name1, name2, theta) if(swapxy) { temp <- x1grid; x1grid <- x2grid; x2grid <- temp # swap x1grid and x2grid temp <- ipred1; ipred1 <- ipred2; ipred2 <- temp # swap ipred1 and ipred2 temp <- name1; name1 <- name2; name2 <- temp # swap name1 and name2 yhat <- t(yhat) } zlab <- dota("ylab", DEF="", ...) # use ylab as zlab if specified zlab <- repl(zlab, nsingles+ipair)[nsingles+ipair] # zlab <- paste0("\n", zlab) # else zlab is too close to axis labels cex.lab <- dota("persp.cex.lab", # make the labels small if multiple figures DEF=if(def.cex.main < 1) .8 * def.cex.main else 1, ...) # persp ignores mgp so prefix a newline to space the axis label # we also prepend spaces else bottom of label tends to get cut off if(theta < 0) theta <- theta + 360 theta <- theta %% 360 if((0 < theta && theta <= 90) || (180 < theta && theta <= 270)) { xlab <- paste0("\n", name1, " ") ylab <- paste0("\n ", name2) } else { xlab <- paste0("\n ", name1) ylab <- paste0("\n", name2, " ") } # We use deprefix directly (and not call.plot) because # we have to do a bit of manipulation of the args for nticks. # Also we cannot use graphics:::persp.default because CRAN check complains # about ":::". Instead we explicitly pass the formal argnames with formals. persp.def.formals <- c( # formal args for persp.default (R version 3.2.0) "x", "y", "z", "xlim", "zlim", "xlab", "ylab", "zlab", "main", "sub", "theta", "phi", "r", "d", "scale", "expand", "col", "border", "ltheta", "lphi", "shade", "box", "axes", "nticks", "ticktype") args <- deprefix(graphics::persp, # calls persp.default FNAME = "persp", KEEP = "PREFIX,PLOT.ARGS", FORMALS = persp.def.formals, TRACE = if(ipair == 1 && trace >= 2) trace-1 else 0, force.x = x1grid, force.y = x2grid, force.z = yhat, force.xlim = range(x1grid), # prevent use of user specified xlim and ylim force.ylim = range(x2grid), # persp won't accept zlim=NULL force.zlim = if(is.null(ylim)) ylim <- range(yhat) else ylim, force.xlab = xlab, force.ylab = ylab, force.theta = theta, force.phi = dota("persp.phi phi", EX=c(0,1), DEF=30, ...), force.d = dota("persp.d dvalue", EX=c(0,1), DEF=1, ...), force.main = main2, def.cex.lab = cex.lab, def.cex.axis = cex.lab, def.zlab = zlab, def.ticktype = "simple", def.nticks = def.nticks, def.cex = cex1, force.col = dota("persp.col col.persp", EX=c(0,1), DEF="lightblue", NEW=1, ...), def.border = NULL, def.shade = .5, ...) # if ticktype="simple" we must call persp without the nticks arg # else persp emits confusing error messages if(substr(ticktype2, 1, 1) == "s") args["nticks"] <- NULL # We use suppressWarnings below to suppress the warning # "surface extends beyond the box" that was introduced in R 2.13-1. # This warning may be issued multiple times and may be annoying to the plotmo user. # (Unfortunately this also suppress any other warnings in persp.) # TODO Want to use lab=c(2,2,7) or similar in persp but persp ignores it suppressWarnings( do.call.trace(graphics::persp, args, fname="graphics::persp", trace=0)) } plot.contour <- function(x, x1grid, x2grid, yhat, name1, name2, ipred1, ipred2, xflip, yflip, swapxy, main2, pt.col, jitter, ux.list, ndiscrete, iresponse, ...) { get.lim <- function(xflip, x1grid, ipred) { # contour() automatically extends ylim, so we don't need to do it here xrange <- range(x1grid) if(xflip) c(xrange[2], xrange[1]) else c(xrange[1], xrange[2]) } #--- plot.contour starts here x1 <- x[,ipred1] x2 <- x[,ipred2] levnames1 <- levels(x1) levnames2 <- levels(x2) is.fac1 <- is.factor(x1) && length(levnames1) <= 12 is.fac2 <- is.factor(x2) && length(levnames2) <= 12 xlab <- if(is.fac1) "" else name1 # no lab if fac else on top of lev name ylab <- if(is.fac2) "" else name2 if(swapxy) { temp <- levnames2; levnames2 <- levnames1; levnames1 <- temp temp <- is.fac2; is.fac2 <- is.fac1; is.fac1 <- temp temp <- ylab; ylab <- xlab; xlab <- temp } xlim <- get.lim(xflip, x1grid, ipred1) ylim <- get.lim(yflip, x2grid, ipred2) if(swapxy) { temp <- xlim; xlim <- ylim; ylim <- temp } levels <- get.contour.levs(yhat) labels <- signif(levels, 2) # else contour prints labels like 0.0157895 cex.lab <- par("cex") * dota("cex.lab", DEF=1, ...) # We use suppressWarnings below to suppress the warning "all z values are # equal" This warning may be issued multiple times and may be annoying to # the plotmo user. (Unfortunately this also suppress any other warnings # in contour.default.) suppressWarnings( call.plot(graphics::contour.default, force.x = if(swapxy) x2grid else x1grid, force.y = if(swapxy) x1grid else x2grid, force.z = if(swapxy) t(yhat) else yhat, force.xlim = xlim, force.ylim = ylim, force.xlab = xlab, force.ylab = ylab, def.xaxt = if(is.fac1) "n" else "s", def.yaxt = if(is.fac2) "n" else "s", def.main = main2, def.levels = levels, def.labels = labels, def.labcex = par("cex") * cex.lab, ...)) if(is.fac1) { levnames1 <- abbreviate(levnames1, minlength=6, strict=TRUE) mtext(levnames1, side=1, at=1:length(levnames1), cex=cex.lab, line=.5, las=get.las(levnames1)) } if(is.fac2) mtext(abbreviate(levnames2, minlength=6, strict=TRUE), side=2, at=1:length(levnames2), cex=cex.lab, line=.5, las=2) if(is.specified(pt.col)) draw.response.sites(x=x, ipred1=ipred1, ipred2=ipred2, pt.col=pt.col, jitter=jitter, ux.list=ux.list, ndiscrete=ndiscrete, iresponse=iresponse, swapxy=swapxy, ...) } get.contour.levs <- function(yhat) { # the default, as calculated internally by plot.contour levs <- pretty(range(yhat, finite=TRUE), 10) # reduce the default if the number of unique yhat values is less # this is mainly for factors unique.yhat <- sort_unique(yhat) if(length(unique.yhat) > 1 && length(unique.yhat) < length(levs)) levs <- unique.yhat levs } plot.image <- function(x, x1grid, x2grid, yhat, name1, name2, ipred1, ipred2, xflip, yflip, swapxy, main2, pt.col, jitter, ux.list, ndiscrete, iresponse, ...) { # like image but fill the plot area with lightblue first so NAs are obvious image.with.lightblue.na <- function(x1grid, x2grid, yhat, ...) { if(anyNA(yhat)) { image(x1grid, x2grid, matrix(0, nrow(yhat), ncol(yhat)), col="lightblue", xlab="", ylab="", xaxt="n", yaxt="n", bty="n", main="") par(new=TRUE) # so next plot is on top of this plot } call.plot(graphics::image.default, force.x=x1grid, force.y=x2grid, force.z=yhat, ...) box() # image() tends to overwrite the borders of the box } get.lim <- function(xflip, x1grid, is.discrete) { xrange <- range(x1grid) if(is.discrete) { xrange[1] <- xrange[1] - .5 xrange[2] <- xrange[2] + .5 } else { range <- xrange[2] - xrange[1] # .025 seems the max we can use without getting unsightly # gaps at the edges of the plot xrange[1] <- xrange[1] - .025 * range xrange[2] <- xrange[2] + .025 * range } if(xflip) c(xrange[2], xrange[1]) else c(xrange[1], xrange[2]) } #--- plot.image starts here x1 <- x[,ipred1] x2 <- x[,ipred2] levnames1 <- levels(x1) levnames2 <- levels(x2) use.fac.names1 <- is.factor(x1) && length(levnames1) <= 12 use.fac.names2 <- is.factor(x2) && length(levnames2) <= 12 xlab <- if(use.fac.names1) "" else name1 # no lab if fac else on top of lev name ylab <- if(use.fac.names2) "" else name2 if(swapxy) { temp <- levnames2; levnames2 <- levnames1; levnames1 <- temp temp <- use.fac.names2; use.fac.names2 <- use.fac.names1; use.fac.names1 <- temp temp <- ylab; ylab <- xlab; xlab <- temp } xlim <- get.lim(xflip, x1grid, use.fac.names1 || length(ux.list[[ipred1]]) <= ndiscrete) ylim <- get.lim(yflip, x2grid, use.fac.names2 || length(ux.list[[ipred2]]) <= ndiscrete) # default col: white high values (snowy mountain tops), dark low values (dark depths) if(swapxy) image.with.lightblue.na(x1grid=x2grid, x2grid=x1grid, yhat=t(yhat), force.col = dota("image.col col.image", EX=c(0,1), DEF=grDevices::gray((0:10)/10), NEW=1, ...), force.main = main2, force.xlim = ylim, force.ylim = xlim, force.xaxt = if(use.fac.names1) "n" else "s", force.yaxt = if(use.fac.names2) "n" else "s", force.xlab = xlab, force.ylab = ylab, ...) else image.with.lightblue.na(x1grid=x1grid, x2grid=x2grid, yhat=yhat, force.col = dota("image.col col.image", EX=c(0,1), DEF=grDevices::gray((0:10)/10), NEW=1, ...), force.main = main2, force.xlim = xlim, force.ylim = ylim, force.xaxt = if(use.fac.names1) "n" else "s", force.yaxt = if(use.fac.names2) "n" else "s", force.xlab = xlab, force.ylab = ylab, ...) cex.lab <- par("cex") * dota("cex.lab", DEF=1, ...) if(use.fac.names1) { levnames1 <- abbreviate(levnames1, minlength=6, strict=TRUE) mtext(levnames1, side=1, at=1:length(levnames1), cex=cex.lab, line=.5, las=get.las(levnames1)) } if(use.fac.names2) mtext(abbreviate(levnames2, minlength=6, strict=TRUE), side=2, at=1:length(levnames2), cex=cex.lab, line=.5, las=2) if(is.specified(pt.col)) draw.response.sites(x=x, ipred1=ipred1, ipred2=ipred2, pt.col=pt.col, jitter=jitter, ux.list=ux.list, ndiscrete=ndiscrete, iresponse=iresponse, swapxy=swapxy, ...) } apply.inverse.func <- function(inverse.func, y, object, trace) { if(!is.null(inverse.func)) { if(!is.numeric(y[1])) stopf("inverse.func cannot be used on \"%s\" values", class(y[1])[1]) y <- process.y(inverse.func(y), object, type="response", nresponse=1, length(y), NULL, trace, "inverse.func")$y } y } # should the factor labels on the x axis be printed horizontally or vertically? get.las <- function(labels) { if(length(labels) * max(nchar(labels)) <= 20) # 20 is arbitrary 0 # horizontal else 2 # vertical } # true if a plot was selected by the user (excluding the default setting) is.degree.specified <- function(degree) { !is.logical(degree) || length(degree) > 1 } my.center <- function(x, trace=FALSE) { if(!is.null(x) && !is.factor(x)) { x <- x - mean(x[is.finite(x)], na.rm=TRUE) if(trace >= 2) { name <- paste0("centered ", trunc.deparse(substitute(x))) cat(name, "length ", length(x)) print_first_few_elements_of_vector(x, trace, name) } } x } plotmo/R/caret.R0000644000176200001440000000640014664434456013226 0ustar liggesusers# caret.R: plotmo functions for caret objects # # TODO Currently only caret "train" objects have explicit support. # sanity check that object a caret train object # (since "train" is a quite generic name) check.is.caret.train.object <- function(object) { class <- class(object)[1] stopifnot.string(class) mod <- object[["finalModel"]] # S3 models are lists, S4 models aren't lists. # Plotmo support S4 models only if they are wrapped in a caret model. # Example S4 model: kernlab::ksvm created with train(..., method="svmRadial", ...). if(class != "train" || is.null(mod) || (!is.list(mod) && !isS4(mod))) stop0("unrecognized \"train\" object ", "(was expecting a train object from the caret package)") } plotmo.prolog.train <- function(object, object.name, trace, ...) { check.is.caret.train.object(object) # call plotmo.prolog for the finalModel for its side effects # (e.g. may attach plotmo.importance to the finalModel) finalModel <- try(plotmo.prolog(object$finalModel, object.name, trace, ...), silent=trace < 2) is.err <- is.try.err(finalModel) trace1(trace, "plotmo.prolog(object$finalModel) %s\n", if(is.err) "failed, continuing anyway" else "succeeded (caret model)") if(!is.err) object$finalModel <- finalModel object } plotmo.singles.train <- function(object, x, nresponse, trace, all1, ...) { check.is.caret.train.object(object) singles <- try(plotmo.singles(object$finalModel, x, nresponse, trace, all1, ...), silent=trace < 2) is.err <- is.try.err(singles) trace2(trace, "plotmo.singles(object$finalModel) %s\n", if(is.err) "failed" else "succeeded") if(is.err) plotmo.singles.default(object, x, nresponse, trace, all1, ...) else singles } plotmo.pairs.train <- function(object, x, nresponse, trace, all2, ...) { check.is.caret.train.object(object) pairs <- try(plotmo.pairs(object$finalModel, x, nresponse, trace, all2, ...), silent=trace < 2) is.err <- is.try.err(pairs) trace2(trace, "plotmo.pairs(object$finalModel) %s\n", if(is.err) "failed" else "succeeded") if(is.err) plotmo.pairs.default(object, x, nresponse, trace, all2, ...) else pairs } # determine "type" arg for predict() plotmo.type.train <- function(object, ..., TRACE) { "raw" # check.is.caret.train.object(object) # trace <- TRACE # type <- try(plotmo.type(object$finalModel, ..., TRACE=TRACE), silent=trace < 2) # is.err <- is.try.err(type) # trace2(trace, "plotmo.type(object$finalModel) %s\n", # if(is.err) "failed" else "succeeded") # if(is.err) # "raw" # else # type } # determine "type" arg for residuals() plotmo.residtype.train <- function(object, ..., TRACE) { "raw" # check.is.caret.train.object(object) # trace <- TRACE # type <- try(plotmo.residtype(object$finalModel, ...), silent=trace < 2) # is.err <- is.try.err(type) # trace2(trace, "plotmo.residtype(object$finalModel) %s\n", # if(is.err) "failed" else "succeeded") # if(is.err) # "raw" # else # type } plotmo/R/mlr.R0000644000176200001440000001417114663771205012721 0ustar liggesusers# mlr.R # # TODO WrappedModels need to save the call (and ideally the calling environment too). # Then we can work directly with the WrappedModel, # not with the learner.model. Then predictions etc. are handled with # the mlr predict interface (more consistent for mlr users) # # TODO In documentation mention that NAs in model-building data will # often be a problem for plotmo # # TODO In documentation mention that plotres with prob models usually isn't helpful. # # TODO WrappedModels need a residuals() method? (using probabilities if available) plotmo.prolog.WrappedModel <- function(object, object.name, trace, ...) { object.name <- gsub("'", "", object.name) # remove begin and end quotes callers.name <- callers.name(n=3) # TODO this is fragile call <- getCall(object) if(is.null(call)) stopf( "getCall(%s) failed.\n Possible workaround: call %s like this: %s(%s$learner.model, ...)", object.name, callers.name, callers.name, object.name) # make x and y available for get.plotmo.x.default and get.plotmo.y.default # TODO This eval gets the object called "task" in the parent.frame. # If that environment doesn't match the environment when the model # was built, then we may get the wrong task object. task <- eval(call[["task"]]) if(is.null(task)) stop0("object call does not have a \"task\" field") stopifnot(inherits(task, "Task")) stopifnot.string(task$task.desc$id) trace2(trace, "task$task.desc$id for '%s' is \"%s\"\n", object.name, task$task.desc$id) data <- mlr::getTaskData(task) if(!inherits(data, "data.frame")) # sanity checks stop0("getTaskData(task) did not return a data.frame") stopifnot(!is.null(object[["subset"]])) subset <- object[["subset"]] stopifnot(NROW(subset) == object$task.desc$size) stopifnot(is.null(object[["x"]])) # check no pre-existing field x stopifnot(is.null(object[["y"]])) object$x <- get.xy.WrappedModel(data, object$features, subset, object.name, task$task.desc$id, trace) object$y <- get.xy.WrappedModel(data, task$task.desc$target, subset, object.name, task$task.desc$id, trace) # recursive call to plotmo.prolog to possibly update learner.model # (because for some models, plotmo.prolog adds var imp etc. fields to model) object <- plotmo.prolog_learner.model(object, object.name, trace, ...) object } get.xy.WrappedModel <- function(data, names, subset, object.name, task.desc.id, trace) { # sanity checks check.index(names, index.name=deparse(substitute(names)), object=data, is.col.index=2) # exact match on column name check.index(index=subset, index.name="object$subset", object=data) x <- try(data[subset, names, drop=FALSE], silent=trace < 2) if(is.try.err(x)) stopf("Could not get the original data from %s with %s", object.name, task.desc.id) x } get.learner.field <- function(object) # returns a string { if(identical(class(object), c("ClassificationViaRegressionModel", "BaseWrapperModel", "WrappedModel")) || identical(class(object), c("FilterModel", "ChainModel", "WrappedModel")) || identical(class(object), c("FilterModel", "BaseWrapperModel", "WrappedModel"))) "$learner.model$next.model$learner.model" else "$learner.model" } plotmo.prolog_learner.model <- function(object, object.name, trace, ...) { learner.field <- get.learner.field(object) learner.model <- eval(parse(text=sprint("object%s", learner.field))) if(is.null(learner.model[["call"]])) # preempt error in try() trace2(trace, "%s object %s%s does not have a \"call\" field\n", class(learner.model)[1], object.name, learner.field) else { learner.model <- try(plotmo.prolog(learner.model, sprint("object%s", learner.field), trace, ...), silent=trace < 0) if(!is.try.err(learner.model)) { # update the learner model # TODO these assignments are clumsy if(learner.field == "$learner.model") object$learner.model <- learner.model else if(learner.field == "$learner.model$next.model$learner.model") object$learner.model$next.model$learner.model <- learner.model } else trace0(trace, "plotmo.prolog(object%s) failed, continuing anyway\n", learner.field) trace2(trace, "Done recursive call in plotmo.prolog for learner.model\n") } object } plotmo.predict.WrappedModel <- function(object, newdata, type, ..., TRACE) { predict <- predict(object, newdata=newdata)$data stopifnot(is.data.frame(predict)) predict } plotmo.singles.WrappedModel <- function(object, x, nresponse, trace, all1, ...) { learner.field <- get.learner.field(object) learner.model <- eval(parse(text=sprint("object%s", learner.field))) singles <- try(plotmo.singles(learner.model, x, nresponse, trace, all1, ...), silent=trace < 2) is.err <- is.try.err(singles) trace2(trace, "plotmo.singles(object%s) %s\n", learner.field, if(is.err) "failed" else "succeeded") if(is.err) plotmo.singles.default(object, x, nresponse, trace, all1, ...) else singles } plotmo.pairs.WrappedModel <- function(object, x, nresponse, trace, all2, ...) { learner.field <- get.learner.field(object) learner.model <- eval(parse(text=sprint("object%s", learner.field))) pairs <- try(plotmo.pairs(learner.model, x, nresponse, trace, all2, ...), silent=trace < 2) is.err <- is.try.err(pairs) trace2(trace, "plotmo.pairs(object%s) %s\n", learner.field, if(is.err) "failed" else "succeeded") if(is.err) plotmo.pairs.default(object, x, nresponse, trace, all2, ...) else pairs } plotmo/R/response.R0000644000176200001440000001570114663771205013765 0ustar liggesusers# response.R: plotmo functions to get the response column from the given newdata # mostly used for calculating RSq on newdata # # TODO overall structure here needs a bit of work plotmo_rsq <- function(object, newdata=NULL, trace=0, nresponse=NA, type=NULL, ...) { init.global.data() # needed if plotmo has never been invoked object.name <- quote.deparse(substitute(object)) use.submodel <- dota("USE.SUBMODEL", DEF=TRUE, ...) # undoc arg (for parsnip models) use.submodel <- is.specified(use.submodel) # TODO revisit, not really reliable because it may use parent.frame attr(object, ".Environment") <- get.model.env(object, object.name, trace, use.submodel) meta <- plotmo_meta(object, type, nresponse, trace, ...) plotmo_rsq1(object=object, newdata=newdata, trace=trace, meta=meta, ...) } plotmo_rsq1 <- function(object, newdata, trace, meta, ...) { trace2(trace, "--plotmo_response for plotmo_rsq1\n") ynew <- plotmo_response(object=object, newdata=newdata, trace=max(0, trace), nresponse=meta$nresponse, type=meta$type, meta=meta, ...) trace2(trace, "--plotmo_predict for plotmo_rsq1\n") yhat <- plotmo_predict(object=object, newdata=newdata, nresponse=meta$nresponse, type=meta$type, expected.levs=meta$expected.levs, trace=trace, inverse.func=NULL, ...)$yhat if(ncol(yhat) != 1 || ncol(ynew) != 1 || nrow(yhat) != nrow(ynew)) { if(trace > -1) { printf("\n") print_summary(ynew, "response", trace=2) printf("\n") print_summary(yhat, "predicted values", trace=2) printf("\n") } stopf("response or predicted values have the wrong dimensions%s", if(trace > -1) " (see above)" else "") } get.weighted.rsq(ynew, yhat) } # If newdata is null, return the fitted response (same as plotmo_y). # # Else extract the response column from newdata. # Use the model object to figure out which column is the response column. plotmo_response <- function(object, newdata=NULL, trace=0, nresponse=NA, type=NULL, meta=NULL, ...) { print_summary(newdata, "--plotmo_response for newdata", trace) object.name <- quote.deparse(substitute(object)) # TODO revisit, not really reliable because it may use parent.frame attr(object, ".Environment") <- get.model.env(object, object.name, trace) if(is.null(meta)) meta <- plotmo_meta(object, type, nresponse, trace, msg.if.predictions.not.numeric="RSq is not available", ...) expected.len <- if(is.null(newdata)) NROW(meta$fitted) else NROW(newdata) y <- NULL if(is.null(newdata)) y <- plotmo_y(object, meta$nresponse, trace, expected.len=expected.len, resp.levs=meta$resp.levs)$y else if(length(dim(newdata)) != 2) stop0("plotmo_response: newdata must be a matrix or data.frame") else { terms <- try(terms(object), silent=TRUE) if(is.try.err(terms) || is.null(terms)) # model doesn't have terms? y <- response.from.xy.model(object, newdata, trace, meta$resp.name) else # model has terms, presumably it was created with a formula y <- get.x.or.y.from.model.frame(object, field="y", trace, naked=FALSE, na.action=na.pass, newdata)$x } if(!is.good.data(y, "response", trace, check.colnames=FALSE)) stop0("response with newdata", format_err_field(y, "response", trace)) y <- cleanup.x.or.y(object, y, "y", trace, check.naked=FALSE) if(!is.good.data(y, check.colnames=FALSE)) stop0("response with newdata", format_err_field(y, "response", trace)) y <- convert.glm.response(object, y, trace) # TODO test this and factor responses # TODO following will sometimes give the wrong results? if(!is.null(meta$nresponse) && meta$nresponse > NCOL(y)) { trace2(trace, "plotmo_response: forcing meta$nresponse=%g to 1 because response has one column\n", nresponse) meta$nresponse <- 1 } process.y(y, object, meta$type, meta$nresponse, expected.len=expected.len, meta$resp.levs, trace, "plotmo_response")$y } # the model was created with the x,y interface (no formula) response.from.xy.model <- function(object, newdata, trace, resp.name) { if(!is.character(resp.name) || length(resp.name) != 1 || !nzchar(resp.name)) { if(trace > 2) { printf("\nresp.name:\n") print(resp.name) printf("\n") } stop0("could not get the response name") } trace2(trace, "response.from.xy.model: resp.name \"%s\"\n", resp.name) # following is for e.g. trees$Volume to Volume in earth(trees[,1:2], trees$Volume) resp.name <- sub(".*\\$", "", resp.name) # Hackery: look for responses of the form trees[,3] or trees[,3,drop=FALSE] # This happens if you build a model like lm(trees[,1:2], trees[,3]) if(grepl("\\[.*,.+\\]", resp.name)) { col.name <- sub("[^,]*,", "", resp.name) # delete up to the comma and the comma col.name <- gsub(",.*", "", col.name) # delete (2nd) comma if any, and all after col.name <- gsub("\\]", "", col.name) # delete final ] if above gsub didn't do it # print a message because we don't always get this right if(trace >= 0) printf("Assuming response %s implies that the response column is %s\n", resp.name, paste(col.name)) # the following will do something like eval(3, env) col.index <- try.eval(parse(text=col.name), model.env(object), trace=trace, expr.name=col.name) if(is.try.err(col.index)) stopf("could not parse the response name %s", resp.name) if(is.null(colnames(newdata))) resp.name <- paste0("newdata[,", col.index, "]") else # TODO is the following correct? resp.name <- paste0(colnames(newdata)[col.index]) y <- newdata[, col.index, drop=FALSE] } else { # resp.name doesn't have [] in it, hopefully it's just a name colnames.newdata <- colnames(newdata) if(is.null(colnames.newdata)) stop0("cannot get response from newdata because newdata has no column names") which <- which(colnames.newdata == resp.name) if(length(which) == 0) stop0("no column names in newdata match the original response name\n", sprint(" Response name: %s\n", resp.name), " Column names in newdata: ", paste.collapse(colnames.newdata)) if(length(which) > 1) stopf("multiple column names in newdata match the original response name %s", resp.name) y <- newdata[, colnames.newdata[which], drop=FALSE] } y } plotmo/R/meta.R0000644000176200001440000004533714663771205013065 0ustar liggesusers# meta.R: plotmo function to get the "metadata" from the model plotmo_type <- function(object, trace, fname="plotmo", type, ...) { if(is.null(type)) # get default type for this object class? type <- plotmo.type(object, ..., TRACE=trace) else { stopifnot.string(type) if(pmatch(type, "terms", nomatch=0)) stop0("type=\"terms\" is not supported by ", fname) } type } plotmo_residtype <- function(object, trace, fname="plotmo", type, ..., TRACE) { if(is.null(type)) # get default type for this object class? type <- plotmo.residtype(object, ..., TRACE=TRACE) else stopifnot.string(type) type } # In plotmo and plotres there is some general data we need about the # model. For example, the response name. This routine provides that # data, which we call "metadata". # # Also, plotmo and plotres should work automatically, as much as possible, # without requiring the user to specify arguments. This routine # facilitates that. # # For example, it converts the default nresponse=NA to a sensible column # number in the response. It will issue an error message if it can't do # that. # # It also converts the default type=NULL into an appropriate # model-specific type for predict(). It can't always do that, and we will # only know for sure later when we call predict with the calculated type. # In this routine we call plotmo_predict with type=NULL to get all the # response columns. The dots are passed on to predict. # # If you don't need the response, set get.y=FALSE to reduce the amount of processing. plotmo_meta <- function(object, type, nresponse, trace, avoid.predict=FALSE, residtype=type, msg.if.predictions.not.numeric=NULL, ...) { type <- plotmo_type(object, trace, "plotmo", type, ...) residtype <- plotmo_residtype(object, trace, "plotmo", residtype, ...) assignInMyNamespace("trace.call.global", trace) # trace call to resids, etc if(avoid.predict) { trace2(trace, "\n----Metadata: plotmo_resids(object, type=\"%s\", nresponse=NULL)\n", type) plotmo_resids <- plotmo_resids(object, type, residtype, nresponse=NULL, trace, ...)$resids if(is.null(plotmo_resids)) { if(trace >= 1) printf("residuals() was unsuccessful, will use predict() instead\n") avoid.predict <- FALSE # fall back to using predict } else { # trace2(trace, # "got residuals using residuals(object, type=\"%s\", ...)\n", type) # use fitted rather than predict (TODO not right but ok for plotres) trace2(trace, "\n----Metadata: plotmo_fitted with nresponse=NULL\n") # nresponse=NULL so this returns multiple columns if a mult respe model plotmo_fitted <- plotmo_fitted(object, trace, nresponse=NULL, type, ...) yhat <- plotmo_fitted$fitted if(!inherits(object, "earth")) colnames(fitted) <- NULL # ensure get.resp.name.from.metadata doesn't use this } } if(!avoid.predict) { trace2(trace, "\n----Metadata: plotmo_predict with nresponse=NULL and newdata=NULL\n") # newdata=3 for efficiency plotmo_predict <- plotmo_predict(object, newdata=3, nresponse=NULL, type, expected.levs=NULL, trace, inverse.func=NULL, ...) yhat <- plotmo_predict$yhat if(!is.null(msg.if.predictions.not.numeric)) { if(!is.null(plotmo_predict$resp.levs)) stopf("%s when the predicted response is a factor", msg.if.predictions.not.numeric) if(plotmo_predict$resp.class[1] == "character") stopf("%s when the predicted values are strings", msg.if.predictions.not.numeric) } trace2(trace, "\n----Metadata: plotmo_fitted with nresponse=NULL\n") # nresponse=NULL so this returns multiple columns if a multiple response model plotmo_fitted <- plotmo_fitted(object, trace, nresponse=NULL, type, ...) } assignInMyNamespace("trace.call.global", 0) yfull <- NULL # plotmo_y with nresponse=NULL trace2(trace, "\n----Metadata: plotmo_y with nresponse=NULL\n") # nresponse=NULL so this returns multiple columns if a multi response model yfull <- plotmo_y(object, nresponse=NULL, trace, expected.len=nrow(plotmo_fitted$fitted))$y nresponse.org <- nresponse nresponse <- plotmo_nresponse(yhat, object, nresponse, trace, sprint("predict.%s", class.as.char(object)), type) stopifnot(!is.na(nresponse)) trace2(trace, "nresponse=%g%s ncol(fitted) %d ncol(predict) %d ncol(y) %s\n", nresponse, if(identical(nresponse, nresponse.org)) "" else sprint(" (was %s)", if(is.character(nresponse.org)) paste0("\"", nresponse.org, "\"") else paste(nresponse.org)), NCOL(plotmo_fitted$fitted), NCOL(predict), sprint("%d", NCOL(yfull))) y.as.numeric.mat <- NULL # y as single column numeric mat, only the nresponse column nresponse.y <- nresponse trace2(trace, "\n----Metadata: plotmo_y with nresponse=%g\n", nresponse) if(ncol(yfull) == 1 && nresponse.y > 1) { # e.g. lda(survived~., data=etitanic) with predict(..., type="post") nresponse.y <- 1 trace1(trace, "nresponse=%d but for plotmo_y using nresponse=1 because ncol(y) == 1\n", nresponse) } assignInMyNamespace("trace.call.global", trace) # trace how we get the response y.as.numeric.mat <- plotmo_y(object, nresponse.y, trace, nrow(plotmo_fitted$fitted))$y assignInMyNamespace("trace.call.global", 0) resp.name <- get.resp.name.from.metadata(nresponse, trace, yhat, plotmo_fitted$fitted, yfull, nresponse.y) resp.levs <- plotmo_resplevs(object, plotmo_fitted, yfull, trace) trace2(trace, "\n----Metadata: done\n\n") fitted <- plotmo_fitted$fitted list( yfull = yfull, # response as a data.frame, all columns y.as.numeric.mat = y.as.numeric.mat, # response as a single col numeric mat # only the nresponse column fitted = fitted, # fitted response as a data.frame (all columns) type = type, # type for predict() # always a string (converted from NULL if necesssary) residtype = residtype, # type for residuals() # always a string (converted from NULL if necesssary) nresponse = nresponse, # col index in the response (converted from NA if necessary) resp.name = resp.name, # our best guess for the response name (may be NULL) resp.levs = resp.levs) # levels of y before conversion to numeric (may be NULL) # necessary to convert predicted strings to factors } get.resp.name.from.metadata <- function(nresponse, trace, yhat, fitted, yfull, nresponse.y) { # the order we look for the response name below seems to work but is not cast in stone if(is.factor(yhat[,1])) { # this prevents us putting a misleading first level name in plot headings resp.name <- NULL trace2(trace, "response name is NULL because is.factor(yhat[,1])\n") } else if(!is.null(colnames(yhat)) && nresponse <= length(colnames(yhat))) { # e.g. earth model resp.name <- colnames(yhat)[nresponse] trace2(trace, "got response name \"%s\" from yhat\n", resp.name) } else if(!is.null(yfull) && !is.null(colnames(yfull))) { # e.g. lm model resp.name <- colnames(yfull)[nresponse.y] trace2(trace, "got response name \"%s\" from yfull\n", resp.name) } else if(nresponse < length(colnames(fitted))) { resp.name <- colnames(fitted)[nresponse] trace2(trace, "got response name \"%s\" from plotmo_fitted\n", resp.name) } else { resp.name <- NULL trace2(trace, "response name is NULL\n") } resp.name } # Init resp.levs (the factor levels of the original response, may be NULL). # The resp.levs is used if predict() returns strings (and therefore # we must convert to them to a factor with the correct levels). plotmo_resplevs <- function(object, plotmo_fitted, yfull, trace) { levels.yfull <- if(is.null(yfull)) NULL else if(length(dim(yfull)) == 2) levels(yfull[,1]) else levels(yfull[1]) if(!is.null(object[["levels"]])) { resp.levs <- object[["levels"]] # levels stored with earth trace2(trace, "got resp.levs from object$levels\n") } else if(!is.null(levels.yfull)) { resp.levs <- levels.yfull trace2(trace, "got resp.levs from yfull\n") } else if(!is.null(plotmo_fitted$resp.levs)) { resp.levs <- plotmo_fitted$resp.levs trace2(trace, "got resp.levs from plotmo_fitted$resp.levs\n") } else { resp.levs <- NULL trace2(trace, "resp.levs is NULL\n") } if(trace >= 2 && !is.null(resp.levs)) printf("response levels: %s\n", paste.trunc(resp.levs)) resp.levs } # This is used for processing "model response" variables such as the # return value of predict(), fitted(), and residuals(). # # # If nresponse=NULL, return a data.frame but with y otherwise unchanged. # # Else return a numeric 1 x n matrix (regardless of the original class of y). # If nresponse is an integer, return only the specified column. # If nresponse=NA, try to convert it to a column index, error if cannot # # If !is.null(nresponse) and y is character vector then convert it to a factor. # expected.levs is used to do this (and not for anything else). # # returns list(y, resp.levs, resp.class) process.y <- function(y, object, type, nresponse, expected.len, expected.levs, trace, fname) { if(is.null(y)) stop0(fname, " NULL") if(length(y) == 0) stop0(fname, " zero length") print_summary(y, sprint("%s returned", fname), trace) if(is.list(y) && !is.data.frame(y)) # data.frames are lists, hence must check both stop0(fname, " list, was expecting a vector, matrix, or data.frame\n", " list(", list.as.char(y), ")") returned.resp.levs <- if(length(dim(y)) == 2) levels(y[,1]) else levels(y[1]) resp.class <- class(y[1]) colnames <- NULL resp.name <- NA dimy <- dim(y) if(length(dimy) == 3 && dimy[3] == 1) # hack for glmnet multnet objects y <- y[,,1] if(is.null(nresponse)) y <- my.data.frame(y, trace, stringsAsFactors=FALSE) else { check.integer.scalar(nresponse, min=1, na.ok=TRUE, logical.ok=FALSE, char.ok=TRUE) nresponse <- plotmo_nresponse(y, object, nresponse, trace, fname, type) stopifnot(!is.na(nresponse), nresponse >= 1) if(nresponse > NCOL(y)) stopf("nresponse is %d but the number of columns is only %d", nresponse, NCOL(y)) resp.name <- colname(y, nresponse, fname) y <- get.specified.col.and.force.numeric(y, nresponse, resp.name, expected.levs, trace, fname) if(!is.na(nresponse) && nresponse > 1) print_summary(y, sprint("%s returned", fname), trace, sprint(" after selecting nresponse=%d", nresponse)) } any.nas <- anyNA(y) any.non.finites <- FALSE # we use apply below because is.finite doesn't work for dataframes any.non.finites <- !any.nas && any(apply(y, 2, function(x) is.numeric(x) && !all(is.finite(x)))) if(any.nas) { trace2(trace, "\n") warning0("NAs returned by ", fname) } if(any.non.finites) { trace2(trace, "\n") warning0("non-finite values returned by ", fname) } # Error message for the aftermath of: # "Warning: 'newdata' had 100 rows but variable(s) found have 30 rows" if(!is.null(expected.len) && expected.len != nrow(y)) stopf("%s returned the wrong length (got %d but expected %d)", fname[1], nrow(y), expected.len[1]) print_summary(y, sprint("%s after processing with nresponse=%s is ", fname, if(is.null(nresponse)) "NULL" else format(nresponse)), trace) list(y = y, # n x 1 numeric, column name is original y column name resp.levs = returned.resp.levs, resp.class = resp.class) } # always returns a one column numeric matrix get.specified.col.and.force.numeric <- function(y, nresponse, resp.name, expected.levs, trace, fname) { # nresponse=NA is not allowed at this point stopifnot(is.numeric(nresponse), length(nresponse) == 1, !is.na(nresponse)) if(length(dim(y)) == 2) y <- y[, nresponse] else stopifnot(nresponse == 1) if(is.factor(y[1])) { trace2(trace, "converted to numeric from factor with levels %s\n", quotify.trunc(levels(y))) # plotmo 3.1.5 (aug 2016): Use as.vector to drop attributes, # else all.equal fails when expected.levs has "ordered" attribute. all.equal <- isTRUE(all.equal(as.vector(expected.levs), levels(y[1]))) # TODO this may be a bogus warning if(!is.null(expected.levs) && !all.equal) warning0(fname, " returned a factor with levels ", quotify.trunc(levels(y[1])), " (expected levels ", quotify.trunc(expected.levs), ")") } else if(is.character(y[1])) { # convert strings to factor old.y <- y y <- if(is.null(expected.levs)) factor(y) else factor(y, levels=expected.levs) trace2(trace, "converted to numeric from strings using factor levels %s\n", quotify.trunc(expected.levs)) which <- (1:length(y))[is.na(y)] if(length(which)) { cat("\n") print_summary(old.y, fname, trace=2) cat("\n") printf("%s[%d] was %s and was converted to \"%s\"\n", fname, which[1], old.y[which[1]], if(is.na(y[which[1]])) "NA" else paste0("\"", y[which[1]], "\"")) cat("\n") stopf("could not convert strings returned by %s to a factor (see above)", fname) } } if(any(!is.double(y))) # convert logical or factor to double y <- as.vector(y, mode="numeric") y <- as.matrix(y) colnames(y) <- resp.name y } plotmo_nresponse <- function(y, object, nresponse, trace, fname, type="response") { check.integer.scalar(nresponse, min=1, na.ok=TRUE, logical.ok=FALSE, char.ok=TRUE) colnames <- safe.colnames(y) nresponse.org <- nresponse if(is.na(nresponse)) { nresponse <- plotmo.convert.na.nresponse(object, nresponse, y, type) if(!is.na(nresponse)) { if(trace > 0 && nresponse != 1) printf("set nresponse=%s\n", paste(nresponse)) } else { # nresponse is NA # fname returned multiple columns (see above) but nresponse is not specified cat("\n") print_summary(y, fname, trace=2) cat("\n") colnames <- NULL if(is.null(colnames) && !is.null(dim(y))) colnames <- colnames(y) icol <- min(2, NCOL(y)) if(is.null(colnames)) msg1 <- sprint("%s\n Example: nresponse=%d", "Use the nresponse argument to specify a column.", icol) else msg1 <- sprint( "%s\n Example: nresponse=%d\n Example: nresponse=%s", "Use the nresponse argument to specify a column.", icol, quotify(if(is.na(colnames(y)[icol])) colname(y, 1) else colname(y, icol))) printf( "%s returned multiple columns (see above) but nresponse is not specified\n %s\n\n", fname, msg1) warning0("Defaulting to nresponse=1, see above messages"); nresponse <- 1 } } else if(is.character(nresponse)) { # convert column name to column index stopifnot.string(nresponse) if(is.vector(y)) stop0("nresponse=\"", nresponse, "\" cannot be used because the predicted response is a vector (it has no columns)") if(is.factor(y)) stop0("nresponse=\"", nresponse, "\" cannot be used because the predicted response is a factor (it has no columns)") if(is.null(colnames)) stop0("nresponse=\"", nresponse, "\" cannot be used because the predicted response has no column names") # TODO investigate [1] e.g. for plotmo(a1h.update2, nresponse="numd") nresponse <- imatch.choices(nresponse, colnames, errmsg.has.index=TRUE)[1] } check.integer.scalar(nresponse, min=1, na.ok=TRUE, logical.ok=FALSE, char.ok=TRUE) # note that msg is inhibited for trace<0, see trace1 in plotmo_rinfo # TODO this causes a spurious trace message with cv.glmnet models with nresponse=2 # message is plotmo_y[500,1] with no column names. So I changed the if statement. # if(nresponse > NCOL(y) && trace >= 0) { if(nresponse > NCOL(y) && trace > 0) { cat("\n") print_summary(y, fname, trace=2) cat("\n") check.index(nresponse, "nresponse", y, is.col.index=1, allow.negatives=FALSE, treat.NA.as.one=TRUE) } if(trace >= 2 && (is.na(nresponse.org) || nresponse.org != nresponse)) cat0("converted nresponse=", if(is.character(nresponse.org)) paste0("\"", nresponse.org, "\"") else nresponse.org, " to nresponse=", nresponse, "\n") nresponse } plotmo.convert.na.nresponse <- function(object, nresponse, yhat, type="response", ...) { UseMethod("plotmo.convert.na.nresponse") } plotmo.convert.na.nresponse.default <- function(object, nresponse, yhat, type, ...) { stopifnot(is.na(nresponse)) if(NCOL(yhat) == 1) 1 else if(NCOL(yhat) == 2 && substr(type, 1, 1) == "p") 2 # probability (also works for posterior as in lda models) else NA } plotmo/R/elegend.R0000644000176200001440000002700114663771205013526 0ustar liggesusers# elegend.R: same as graphics::legend (R 3.1.2) but # i) has a vert argument to specify which lines are vertical # ii) allows col to be a character vector with "1" meaning 1 elegend <- function(x, y = NULL, legend, fill=NULL, col = par("col"), border="black", lty, lwd, pch, angle = 45, density = NULL, bty = "o", bg = par("bg"), box.lwd = par("lwd"), box.lty = par("lty"), box.col = par("fg"), pt.bg = NA, cex = 1, pt.cex = cex, pt.lwd = lwd, xjust = 0, yjust = 1, x.intersp = 1, y.intersp = 1, adj = c(0, 0.5), text.width = NULL, text.col = par("col"), text.font = NULL, merge = do.lines && has.pch, trace = FALSE, plot = TRUE, ncol = 1, horiz = FALSE, title = NULL, inset = 0, xpd, title.col = text.col, title.adj = 0.5, seg.len = 2, vert = FALSE) # logical, which lines are vertical, will be recycled { trace <- check.boolean(trace) plot <- check.boolean(plot) ## the 2nd arg may really be `legend' if(missing(legend) && !missing(y) && (is.character(y) || is.expression(y))) { legend <- y y <- NULL } mfill <- !missing(fill) || !missing(density) if(!missing(xpd)) { op <- par("xpd") on.exit(par(xpd=op)) par(xpd=xpd) } title <- as.graphicsAnnot(title) if(length(title) > 1) stop("invalid 'title'") legend <- as.graphicsAnnot(legend) n.leg <- if(is.call(legend)) 1 else length(legend) if(n.leg == 0) stop("'legend' is of length 0") auto <- if (is.character(x)) match.arg(x, c("bottomright", "bottom", "bottomleft", "left", "topleft", "top", "topright", "right", "center")) else NA if(anyNA(auto)) { xy <- xy.coords(x, y); x <- xy$x; y <- xy$y nx <- length(x) if (nx < 1 || nx > 2) stop("invalid coordinate lengths") } else nx <- 0 xlog <- par("xlog") ylog <- par("ylog") rect2 <- function(left, top, dx, dy, density = NULL, angle, ...) { r <- left + dx; if(xlog) { left <- 10^left; r <- 10^r } b <- top - dy; if(ylog) { top <- 10^top; b <- 10^b } rect(left, top, r, b, angle = angle, density = density, ...) } segments2 <- function(x1, y1, dx, dy, lty, lwd, col) { x2 <- x1 + dx; if(xlog) { x1 <- 10^x1; x2 <- 10^x2 } y2 <- y1 + dy; if(ylog) { y1 <- 10^y1; y2 <- 10^y2 } # explicit loop allows use of char lty's with "1" meaning 1 and "NA" meaning NA for(i in seq_along(x1)) { lt <- lty[i] if(lt == "1") lt <- 1 else if(is.na(lt) || lt == "NA") lt <- 0 segments(x1[i], y1[i], x2[i], y2[i], lty=lt, lwd=lwd[i], col=col[i]) } } points2 <- function(x, y, ...) { if(xlog) x <- 10^x if(ylog) y <- 10^y points(x, y, ...) } text2 <- function(x, y, ...) { ##--- need to adjust adj == c(xadj, yadj) ?? -- if(xlog) x <- 10^x if(ylog) y <- 10^y text(x, y, ...) } if(trace > 0) catn <- function(...) do.call("cat", c(lapply(list(...),formatC), list("\n"))) cin <- par("cin") Cex <- cex * par("cex") # = the `effective' cex for text ## at this point we want positive width even for reversed x axis. if(is.null(text.width)) text.width <- max(abs(strwidth(legend, units="user", cex=cex, font = text.font))) else if(!is.numeric(text.width) || text.width < 0) stop("'text.width' must be numeric, >= 0") xc <- Cex * xinch(cin[1L], warn.log=FALSE) # [uses par("usr") and "pin"] yc <- Cex * yinch(cin[2L], warn.log=FALSE) if(xc < 0) text.width <- -text.width xchar <- xc xextra <- 0 yextra <- yc * (y.intersp - 1) ## watch out for reversed axis here: heights can be negative ymax <- yc * max(1, strheight(legend, units="user", cex=cex)/yc) ychar <- yextra + ymax if(trace > 0) catn(" xchar=", xchar, "; (yextra,ychar)=", c(yextra,ychar)) if(mfill) { ##= sizes of filled boxes. xbox <- xc * 0.8 ybox <- yc * 0.5 dx.fill <- xbox ## + x.intersp*xchar } do.lines <- (!missing(lty) && (is.character(lty) || any(lty > 0)) ) || !missing(lwd) ## legends per column: n.legpercol <- if(horiz) { if(ncol != 1) warning(gettextf("horizontal specification overrides: Number of columns := %d", n.leg), domain = NA) ncol <- n.leg 1 } else ceiling(n.leg / ncol) has.pch <- !missing(pch) && length(pch) > 0 # -> default 'merge' is available merge <- check.boolean(merge) if(do.lines) { x.off <- if(merge) -0.7 else 0 } else if(merge) warning("'merge = TRUE' has no effect when no line segments are drawn") if(has.pch) { if(is.character(pch) && !is.na(pch[1L]) && nchar(pch[1L], type="c") > 1) { if(length(pch) > 1) warning("not using pch[2..] since pch[1L] has multiple chars") np <- nchar(pch[1L], type="c") pch <- substr(rep.int(pch[1L], np), 1L:np, 1L:np) } ## this coercion was documented but not done in R < 3.0.0 if(!is.character(pch)) pch <- as.integer(pch) } if (anyNA(auto)) { ##- Adjust (x,y) : if (xlog) x <- log10(x) if (ylog) y <- log10(y) } if(nx == 2) { ## (x,y) are specifiying OPPOSITE corners of the box x <- sort(x) y <- sort(y) left <- x[1L] top <- y[2L] w <- diff(x)# width h <- diff(y)# height w0 <- w/ncol # column width x <- mean(x) y <- mean(y) if(missing(xjust)) xjust <- 0.5 if(missing(yjust)) yjust <- 0.5 } else {## nx == 1 or auto ## -- (w,h) := (width,height) of the box to draw -- computed in steps h <- (n.legpercol + !is.null(title)) * ychar + yc w0 <- text.width + (x.intersp + 1) * xchar if(mfill) w0 <- w0 + dx.fill if(do.lines) w0 <- w0 + (seg.len + x.off)*xchar w <- ncol*w0 + .5* xchar if (!is.null(title) && (abs(tw <- strwidth(title, units="user", cex=cex) + 0.5*xchar)) > abs(w)) { xextra <- (tw - w)/2 w <- tw } ##-- (w,h) are now the final box width/height. if (anyNA(auto)) { left <- x - xjust * w top <- y + (1 - yjust) * h } else { usr <- par("usr") inset <- rep_len(inset, 2) insetx <- inset[1L]*(usr[2L] - usr[1L]) left <- switch(auto, "bottomright"=, "topright"=, "right" = usr[2L] - w - insetx, "bottomleft"=, "left"=, "topleft"= usr[1L] + insetx, "bottom"=, "top"=, "center"= (usr[1L] + usr[2L] - w)/2) insety <- inset[2L]*(usr[4L] - usr[3L]) top <- switch(auto, "bottomright"=, "bottom"=, "bottomleft"= usr[3L] + h + insety, "topleft"=, "top"=, "topright" = usr[4L] - insety, "left"=, "right"=, "center" = (usr[3L] + usr[4L] + h)/2) } } if (plot && bty != "n") { ## The legend box : if(trace > 0) catn(" rect2(",left,",",top,", w=",w,", h=",h,", ...)",sep="") rect2(left, top, dx = w, dy = h, col = bg, density = NULL, lwd = box.lwd, lty = box.lty, border = box.col) } ## (xt[],yt[]) := `current' vectors of (x/y) legend text xt <- left + xchar + xextra + (w0 * rep.int(0:(ncol-1), rep.int(n.legpercol,ncol)))[1L:n.leg] yt <- top - 0.5 * yextra - ymax - (rep.int(1L:n.legpercol,ncol)[1L:n.leg] - 1 + !is.null(title)) * ychar if (mfill) { #- draw filled boxes ------------- if(plot) { if(!is.null(fill)) fill <- rep_len(fill, n.leg) rect2(left = xt, top=yt+ybox/2, dx = xbox, dy = ybox, col = fill, density = density, angle = angle, border = border) } xt <- xt + dx.fill } if(plot && (has.pch || do.lines)) col <- rep_len(col, n.leg) ## NULL is not documented but people use it. if(missing(lwd) || is.null(lwd)) lwd <- par("lwd") # = default for pt.lwd if (do.lines) { #- draw lines --------------------- ## NULL is not documented if(missing(lty) || is.null(lty)) lty <- 1 lty <- rep_len(lty, n.leg) lwd <- rep_len(lwd, n.leg) ok.l <- !is.na(lty) & (is.character(lty) | lty > 0) & !is.na(lwd) if(trace > 0) catn(" segments2(",xt[ok.l] + x.off*xchar, ",", yt[ok.l], ", dx=", seg.len*xchar, ", dy=0, ...)") if(plot) { # TODO vert handling could be simplified xs <- xt[ok.l] + x.off * xchar vert <- as.logical(recycle(vert, xt)) dx <- as.numeric(!vert) * seg.len * xchar strheight <- strheight("A", cex=cex) ys <- yt[ok.l] - as.numeric(vert) * .9 * strheight dy <- as.numeric(vert) * 1.6 * strheight # stagger consecutive vertical lines shifted <- FALSE for(i in seq_along(vert)) { if(vert[i]) { if(shifted) { shifted <- FALSE xs[i] <- xs[i] + .75 * seg.len * xchar } else { shifted <- TRUE xs[i] <- xs[i] + .5 * seg.len * xchar } } else shifted <- FALSE } segments2(xs, ys, dx = dx, dy = dy, lty = lty[ok.l], lwd = lwd[ok.l], col = col[ok.l]) } # if (!merge) xt <- xt + (seg.len+x.off) * xchar } if (has.pch) { #- draw points ------------------- pch <- rep_len(pch, n.leg) pt.bg <- rep_len(pt.bg, n.leg) pt.cex<- rep_len(pt.cex, n.leg) pt.lwd<- rep_len(pt.lwd, n.leg) ok <- !is.na(pch) if (!is.character(pch)) { ## R 2.x.y omitted pch < 0 ok <- ok & (pch >= 0 | pch <= -32) } else { ## like points ok <- ok & nzchar(pch) } x1 <- (if(merge && do.lines) xt-(seg.len/2)*xchar else xt)[ok] y1 <- yt[ok] if(trace > 0) catn(" points2(", x1,",", y1,", pch=", pch[ok],", ...)") if(plot) points2(x1, y1, pch = pch[ok], col = col[ok], cex = pt.cex[ok], bg = pt.bg[ok], lwd = pt.lwd[ok]) ##D if (!merge) xt <- xt + dx.pch } xt <- xt + x.intersp * xchar if(plot) { if (!is.null(title)) text2(left + w*title.adj, top - ymax, labels = title, adj = c(title.adj, 0), cex = cex, col = title.col) text2(xt, yt, labels = legend, adj = adj, cex = cex, col = text.col, font = text.font) } invisible(list(rect = list(w = w, h = h, left = left, top = top), text = list(x = xt, y = yt))) } plotmo/R/as.char.R0000644000176200001440000002257015126274546013451 0ustar liggesusers# as.char.R: brief description of an object as a string e.g. "c(1,2)" # this file also includes print_summary for matrices and data.frames as.char <- function(object, maxlen=20) { check.integer.scalar(maxlen, min=1) if(is.null(object)) "NULL" else if(is.name(object)) paste.trunc(object, maxlen=maxlen) # e.g. "..3" for unforced dot args else if(is.environment(object)) environment.as.char(object) else if(is.call(object)) { # e.g. x is a call object in foo(x=1:3) s <- strip.space.collapse(format(object)) if(nchar(s) > maxlen) s <- paste0(substr(s, 1, maxlen), "...)") s } else if(NCOL(object) == 1 && is.character(object)) paste.c(paste0("\"", object, "\"")) else if(NCOL(object) == 1 && is.logical(object)) paste.c(object) else if(NCOL(object) == 1 && is.numeric(object)) { # digits=4 is arb but seems about right, and zapsmall means more can # be displayed in limited space if just one val is say 3.553e-15 paste.c(signif(zapsmall(object, digits=4), digits=4)) } else if(length(dim(object)) == 2) sprint("%s[%g,%g]", class(object)[1], NROW(object), NCOL(object)) else if(class(object)[1] == "list") # not is.list() because e.g. lm objects are lists paste0("list(", paste.trunc(list.as.char(object), maxlen=maxlen+12), ")") else if(inherits(object, "Date")) paste0("Date:", paste.trunc(object, maxlen=maxlen+12)) else paste0(class.as.char(object), ".object") } # compact description of an object's class # typically quotify=TRUE for error messages (full class name with quotes), # and quotify=FALSE for trace messages (just first field of class name, no quotes) class.as.char <- function(object, quotify=FALSE) { if(quotify) quotify(paste.trunc(class(object), collapse=",", maxlen=60)) else class(object)[1] } # compact description of a list # maxlen is max length of each list element (not of the entire list) list.as.char <- function(object, maxlen=20) { stopifnot(is.list(object) || is.pairlist(object)) s <- "" names <- names(object) for(i in seq_along(object)) { if(i != 1) s <- sprint("%s, ", s) name.ok <- length(names) >= i && !is.na(names[i]) && nzchar(names[i]) if(name.ok && names[i] == "...") s <- sprint("%s...", s) # print dots as ... not as ...=pairlist.object else { if(name.ok) s <- sprint("%s%s=", s, names(object)[i]) s <- sprint("%s%s", s, as.char(object[[i]], maxlen=maxlen)) } } s # one element character vector e.g "x=1, 2" } environment.as.char <- function(env, maxlen=60) # compact description { if(is.null(env)) # illegal, but we still want to format it return("env(NULL)") stopifnot(is.environment(env)) # format(env) returns "" stripped.env <- gsub("", "", format(env)[1]) # if it's a standard environment return the environment's name if(grepl("^namespace:|^R_[[:alnum:]]+Env", stripped.env)) stripped.env # something like "namespace:stats" or "R_GlobalEnv" else # return the names of the objects in the environment sprint("env(%s)", paste.trunc(paste0(ls(env, all.names=TRUE), collapse=", "), maxlen=maxlen)) } # The main purpose of this routine is to summarize matrices and data.frames, # but it will also (semi)gracefully handle any object that is passed to it. # # Note that this only does anything if trace >= 2. # # If x is a matrix or dataframe or similar, print first few rows and last row. # If trace >= 4, then print all rows and cols, up to 1000 rows and 100 cols. # # the details argument: # 0=don't print data, print the colnames truncated to one line of output # 1=don't print data, print all colnames # -1=like print data but don't prefix the output with spaces # 2=print the data print_summary <- function(x, xname=trunc.deparse(substitute(x)), trace=2, msg="", prefix="", details=2) { check.numeric.scalar(trace) if(trace < 2) return() if(is.null(x)) { printf("%s: NULL\n", xname) return() } if(length(x) == 0) { printf("%s: length zero\n", xname) return() } # try(data.frame(), silent=TRUE) is not actually silent # for language objects, so handle them specially if(is.language(x)) { x$na.action <- NULL # don't want to print the na.action if there is one s <- try(format(x)) max <- if(trace <= 2) 8 else 1000 if(length(s) > max) { s <- s[1:max] s[max] <- paste(s[max], "\n...") } s <- gsub("[ \t\n]", "", s) # remove white space s <- gsub(",", ", ", s) # replace comma with comma space s <- paste(s, collapse="\n ", sep="") printf("%s%s%s:\n%s\n", prefix, xname, msg, s) return() } if(is.list(x) && !is.data.frame(x)) { # data.frames are lists, hence must check both if(details < 2 && trace < 4) { printf("%s: list with elements %s\n", xname, quotify.trunc(paste(names(x)))) return() } printf("%s ", xname) str(x) return() } df <- try(my.data.frame(x, trace, stringsAsFactors=FALSE), silent=TRUE) if(is.try.err(df)) { # be robust for whatever gets passed to this function printf("print_summary: cannot convert class \"%s\" to a data.frame (%s)\n", class(x)[1], cleantry(df)) printf("%s%s%s:\n", prefix, xname, msg) if(length(dim(x)) == 2) { # it's a matrix or other 2D object? if(trace >= 4) { try(print_with_strings_quoted(x)) try(print(summary(x))) } else { try(print_with_strings_quoted(head(x))) printf("...\n") } } else try(print_with_strings_quoted(x)) return() } if(details < 2 && trace < 4) { # don't print the data, just the dimensions and colnames if(details != -1) printf(" ") printf("%s%s[%d,%d]%s ", prefix, xname, nrow(df), ncol(df), msg) print_colnames(x, full=details == 2, newline="") if(NCOL(x) == 1 || NROW(x) == 1) # if a vector, print first few values cat0(", and values ", # if double, print 4 significant digits paste.trunc(if(is.double(x)) sprint("%.4g", x) else x, collapse=", ", maxlen=32)) cat0("\n") return() } colnames <- safe.colnames(x) printf("%s%s[%d,%d]%s%s:\n", prefix, xname, nrow(df), ncol(df), msg, if(is.null(colnames)) " with no column names" else "") df.short <- df maxrows <- if(trace >= 4) 1000 else 5 if(maxrows < nrow(df)) { df.short <- df[c(1:(maxrows-1), nrow(df)), , drop=FALSE] if(is.null(rownames(df.short))) rownames(df.short) <- c(1:(maxrows-1), nrow(df)) rownames(df.short)[maxrows-2+1] <- "..." } maxcols <- if(trace >= 4) 100 else 10 if(maxcols < ncol(df)) { df.short[,maxcols] <- "..." df.short <- df.short[, 1:maxcols, drop=FALSE] if(!is.null(colnames)) colnames(df.short)[maxcols] <- "..." } try(print_with_strings_quoted(df.short)) is.fac <- sapply(df, is.factor) if(is.null(colnames)) colnames(df) <- sprint("[,%d]", seq_len(NCOL(x))) if(any(is.fac)) { names <- paste0(colnames(df), ifelse(sapply(df, is.ordered), "(ordered)", "")) if(sum(is.fac) == 1) # only one fac, so enough space to print levels too printf(" %s is a factor with levels: %s\n", paste.trunc(names[is.fac]), paste.trunc(levels(df[,is.fac]))) else printf(" factors: %s\n", paste.trunc(names[is.fac])) } if(trace >= 4) try(print(summary(df))) } print_colnames <- function(x, full=FALSE, newline="\n") { colnames <- safe.colnames(x) if(is.null(colnames)) printf("with no column names%s", newline) else { colnames[which(colnames == "")] <- "\"\"" if(full) # full colnames (up to 1000 characters) printf("with colname%s %s%s", if(length(colnames(x)) > 1) "s" else "", paste.trunc(colnames, maxlen=max(25, getOption("width")-20)), newline) else # short version of colnames printf.wrap("with colname%s %s%s", if(length(colnames(x)) > 1) "s" else "", paste.trunc(colnames), newline) } } # Like print but puts quotes around strings. # Useful for disambiguating strings from factors. # # "..." is not quoted because it is used as a # "something was deleted" indicator in print_summary print_with_strings_quoted <- function(x) { if(length(dim(x)) == 2) for(j in seq_len(NCOL(x))) if(is.character(x[,j])) for(i in seq_along(x[,j])) if(x[i,j] != "...") x[i,j] <- paste0("\"", x[i,j], "\"") print(x) } plotmo/R/w1.R0000644000176200001440000002145514663771205012461 0ustar liggesusers# w1.R: plotres functions for the which=1 plot plot_w1 <- function(object, which, # currently used only to get the total nbr of plots (for xlim and ylim) # most of these args are merely for the recursive call to plotres for lm models info, standardize, delever, level, versus, id.n, labels.id, smooth.col, grid.col, do.par, caption, trace, npoints, center, type, nresponse, object.name, SHOWCALL=NA, # this is here to absorb SHOWCALL from dots ...) { if(inherits(object, "train")) { # caret check.is.caret.train.object(object) object <- object[["finalModel"]] # fall through to process the finalModel object } else if(inherits(object, "WrappedModel")) { # mlr package learner.field <- get.learner.field(object) object <- eval(parse(text=sprint("object%s", learner.field))) # fall through to process the learner.model object } if(inherits(object, "lm")) { # check that the model supports hatvalues(), needed for versus=V4LEVER. if(is.try.err(try(hatvalues(object), silent=TRUE))) retval <- list(plotted=FALSE, retval=NULL) else { # do a recursive call to plotres to plot the residuals versus leverage plot if(trace >= 1) printf( "plotres(object, which=3, versus=4, ...) (recursive call for leverage plot)\n") retval <- plotres(object=object, which=W3RESID, info=info, versus=V4LEVER, standardize=standardize, delever=delever, level=level, id.n=id.n, labels.id=labels.id, smooth.col=smooth.col, grid.col=grid.col, do.par=FALSE, caption=caption, trace=if(trace==1) 0 else trace, npoints=npoints, center=center, type=type, nresponse=nresponse, object.name=object.name, ...) } } else # call method function for object retval <- w1(object=object, trace=trace, type=type, nresponse=nresponse, which=which, grid.col=grid.col, ...) draw.caption(caption, ...) # necessary if w1 is only plot called by plotres retval } w1 <- function(object, trace, type, nresponse, which, grid.col, ...) { UseMethod("w1") } w1.default <- function(object, trace, type, nresponse, which, grid.col, ...) { list(plotted=FALSE, retval=NULL) } w1.earth <- function(object, trace, type, nresponse, which, grid.col, ...) { call.earth.modsel(object=object, trace=trace, grid.col=grid.col, ...) } w1.mars <- function(object, trace, type, nresponse, which, grid.col, ...) { # mda::mars, convert first to an earth model if(trace) printf("calling mars.to.earth (needed for the model selection plot)\n") earth.mod <- earth::mars.to.earth(object, trace=trace >= 2) earth.mod <- update(earth.mod, trace=trace >= 2) call.earth.modsel(object=earth.mod, trace=trace, grid.col=grid.col, ...) } # Note that by specifying col and lty in the arg list we drop # them from dots passed to earth_plotmodsel, else get # 'col' matches both the 'col.rsq' and 'col.grsq' arguments. # TODO call.dot should be able to do this dropping for us but currently can't call.earth.modsel <- function(object, trace, grid.col, col=NA, lty=NA, ...) { list(plotted = TRUE, retval = call.dots(earth::earth_plotmodsel, PREFIX="w1.", DROP="*", KEEP="PREFIX,PLOT.ARGS,PLOTMO.ARGS", trace=trace >= 1, force.x=object, grid.col=grid.col, ...)) } w1.rpart <- function(object, trace, type, nresponse, which, grid.col, ...) { if(requireNamespace("rpart.plot", quietly=TRUE)) # plotmo 3.1.5 (aug 2016): use prp not rpart.plot for a more # minimal plot because there isn't much space using (mfrow=c(2,2)) call.w1(rpart.plot::prp, def.box.palette="auto", ..., object=object, trace=trace) else { printf("Please install the \"rpart.plot\" package for better rpart plots.\n") plot(object, compress=TRUE, uniform=TRUE) list(plotted=TRUE, retval=text(object, xpd=NA)) } } w1.tree <- function(object, trace, type, nresponse, which, grid.col, ...) { call.w1(graphics::plot, def.type="uniform", ..., object=object, trace=trace) n <- nrow(object$frame) def.cex <- if(n < 8) 1 else if(n < 20) .9 else .8 call.w1(graphics::text, def.pretty=3, def.digits=3, def.cex=def.cex, ..., object=object, trace=trace) } w1.randomForest <- function(object, trace, type, nresponse, which, grid.col, ...) { call.w1(graphics::plot, ..., def.main=dota("main", DEF="Error vs Number of Trees", ...), object=object, trace=trace) } w1.gbm <- function(object, trace, type, nresponse, which, grid.col, ...) { # # don't allow n.trees argument to prevent a common mistake # if(!is.na(dota("n.trees", EX=0, ...))) # stop0("n.trees is not allowed (please use predict.n.trees)") # don't allow w1.n.trees argument, except w1.n.trees=NA predict.n.trees <- dota("predict.n.trees", DEF=gbm.n.trees(object), ...) w1.n.trees <- dota("w1.n.trees", DEF=predict.n.trees, ...) if(!is.na(w1.n.trees) && w1.n.trees != predict.n.trees) { if(is.na(dota("predict.n.trees", EX=0, ...))) stop0("w1.n.trees is not allowed (please use predict.n.trees)") else stop0("w1.n.trees is not allowed") } check.integer.scalar(w1.n.trees, min=1, max=gbm.n.trees(object), na.ok=TRUE, logical.ok=FALSE, object.name="n.trees") call.w1(plot_gbm, w1.n.trees=w1.n.trees, ..., object=object, trace=trace) } w1.GBMFit <- function(object, trace, type, nresponse, which, grid.col, ...) { w1.gbm(object, trace, type, nresponse, which, grid.col, ...) } w1.cosso <- function(object, trace, type, nresponse, which, grid.col, ...) { call.w1(graphics::plot, def.M=2, ..., object=object, trace=trace) } w1.glmnet <- function(object, trace, type, nresponse, which, grid.col, ...) { call.w1(plot_glmnet, def.xvar="rlambda", def.grid.col=grid.col, force.s=attr(object, "plotmo.s"), force.nresponse=nresponse, ..., object=object, trace=trace) } plot_with_axis_par <- function(object, which, trace, type, ...) { if(length(which) > 1) { # slightly smaller axis annotations to fit all top labels old.cex.axis <- par("cex.axis") on.exit(par(cex.axis=old.cex.axis)) par(cex.axis=min(old.cex.axis, .9)) } call.w1(graphics::plot, ..., object=object, trace=trace) } w1.lars <- function(object, trace, type, nresponse, which, grid.col, ...) { plot_with_axis_par(object, which, trace, type, ...) } w1.sparsenet <- function(object, trace, type, nresponse, which, grid.col, ...) { plot_with_axis_par(object, which, trace, type, ...) } w1.cv.glmnet <- function(object, trace, type, nresponse, which, grid.col, ...) { plot_with_axis_par(object, which, trace, type, ...) } w1.pre <- function(object, trace, type, nresponse, which, grid.col, ...) # pre package { importance <- try(pre::importance(object, plot=FALSE), silent=TRUE) if(is.try.err(importance)) { warning0("pre::importance(pre.object) failed") list(plotted=FALSE, retval=NULL) } else if(NROW(importance$varimps) == 0) # based on code in importance function in pre.R list(plotted=FALSE, retval=NULL) else call.w1(pre::importance, force.plot=TRUE, ..., object=object, trace=trace) } call.w1 <- function(FUNC, ..., object, trace) { keep <- "PREFIX" # drop everything except args matching PREFIX fname <- trunc.deparse(substitute(FUNC)) list(plotted = TRUE, retval = call.dots(FUNC=FUNC, PREFIX="w1.", DROP="*", # drop everything KEEP=keep, # except args matching keep TRACE=trace >= 1, FNAME=fname, force.anon=object, ...)) } # # TODO commented out because plot.C5.0 ignores par settings # w1.C5.0 <- function(object, trace, type, nresponse, which, grid.col, ...) # { # call.w1(graphics::plot, ...) # } # TODO commented out because plot.nn uses grid graphics # which doesn't coexist with base graphics # w1.nn <- function(object, trace, type, nresponse, which, grid.col, ...) # { # rep <- dota("w1.rep", DEF="best", ...) # if(is.null(rep)) # stop0("rep=NULL is not allowed here for plot.nn ", # "(because it invokes dev.new)") # call.w1(plot.nn, def.rep=rep, ..., object=object, trace=trace) # } plotmo/R/check.index.R0000644000176200001440000001724214663771205014314 0ustar liggesusers# check.index.R # Check that an index vector specified by the user is ok to index an object. # We want to preclude confusing R messages or behaviour later. # An example is when max(index) > length(object) which quietly # returns NA and can cause confusing downstream behaviour. # This returns a vector suitable for indexing into object (will # be identical to index unless index is a character vector). # # If index is a character vector, then matching (regex if is.col.index != 2) # is used against the names in the object, and an integer vector is returned. check.index <- function(index, index.name, object, colnames = NULL, is.col.index = 0, # 0=row index, 1=col index, 2=exact non-regex col name if char allow.empty = FALSE, # if index is char will warn if necessary regardless of allow.empty allow.zeros = FALSE, allow.negatives = TRUE, allow.dups = FALSE, treat.NA.as.one = FALSE, is.degree.spec = FALSE) # special handling for degree1 and degree2 specs { index.name <- quotify.short(index.name, "index", quote="'") # check that the given index and object can be evaluated try <- try(eval(index)) if(is.try.err(try)) stop0("illegal ", index.name) try <- try(eval(object)) if(is.try.err(try)) stop0("illegal ", quotify.short(object, quote="'")) is.col.index <- check.integer.scalar(is.col.index, min=0, max=2) allow.empty <- check.boolean(allow.empty) allow.zeros <- check.boolean(allow.zeros) allow.negatives <- check.boolean(allow.negatives) allow.dups <- check.boolean(allow.dups) treat.NA.as.one <- check.boolean(treat.NA.as.one) if(is.null(index)) { if(!allow.empty) stop0(index.name, " is NULL and cannot be used as an index") return(NULL) } if(treat.NA.as.one && (length(index) == 1 && is.na(index)[1])) index <- 1 if(anyNA(index)) stop0("NA in ", index.name) if(NROW(index) != 1 && NCOL(index) != 1) stop0(index.name, " must be a vector not a matrix (", index.name, " has dimensions ", NROW(index), " x ", NCOL(index), ")") len <- get.len(object, is.col.index) if(is.character(index)) # currently only works for column names of object check.character.index(index, index.name, object, colnames, len, is.fixed=(is.col.index==2), allow.empty, is.degree.spec) else if(is.logical(index)) check.logical.index(index, index.name, len, allow.empty) else if(is.numeric(index)) check.numeric.index(index, index.name, len, allow.empty, allow.negatives, allow.dups, allow.zeros, treat.NA.as.one) else stop0(index.name, " must be an index vector (numeric, logical, or character)") } get.len <- function(object, is.col.index) { if(is.col.index) len <- NCOL(object) # index is for columns of object else if(is.null(dim(object))) len <- length(object) else len <- NROW(object) # index is for rows of object # NROW also works for lists stopifnot(length(len) == 1) stopifnot(len > 0) len } matchmult <- function(x, tab) # like match but return multiple matches if present { matches <- integer(0) for(i in seq_along(x)) { xi <- x[i] for(itab in 1:length(tab)) if(xi == tab[itab]) matches <- c(matches, itab) } matches } # This does regex matching of index and returns an integer vector # index arg must be character # if names arg is NULL, use colnames(object) check.character.index <- function(index, index.name, object, names, len, is.fixed, allow.empty, is.degree.spec) { stopifnot(is.character(index)) is.fixed <- check.boolean(is.fixed) # certain regular expressions match everything, even if names not avail if(!is.fixed && length(index) == 1 && index %in% c("", ".", ".*")) return(1:len) if(is.null(names)) names <- colnames(object) if(length(names) == 0 || !is.character(names)) stop0(index.name, " specifies names but the names are unavailable") matches <- integer(0) warning.names <- integer(0) # these regexs don't match any column names for(i in seq_along(index)) { name <- index[i] if(!is.fixed) # regex match igrep <- grep(name, names) else { # exact match if(nchar(name) == 0) warning0(unquote(index.name), "[", i, "] is an empty string \"\"") igrep <- which(name == names) } if(length(igrep)) matches <- c(matches, igrep) else warning.names <- c(warning.names, name) } if(is.degree.spec) { if(is.null(dim(object))) # vector, degree1 matches <- matchmult(matches, object) else if(length(dim(object)) == 2) # 2D matrix, degree2 matches <- c(matchmult(matches, object[,1]), matchmult(matches, object[,2])) else stop0("that kind of object is not yet supported for ", index.name) } new.index <- unique(matches[!is.na(matches)]) for(name in warning.names) warning0("\"", name, "\" in ", unquote(index.name), " does not ", if(is.fixed) "" else "regex-", "match any names\n", " Available names are ", paste.trunc(quotify(names))) new.index } check.logical.index <- function(index, index.name, len, allow.empty) { stopifnot(is.logical(index)) if(!allow.empty) { if(length(index) == 0) stop0("length(", unquote(index.name), ") == 0") if(length(index[index == TRUE]) == 0) stop0(index.name, " is all FALSE") } # note that a single FALSE or TRUE is ok regardless of length(object) if(length(index) > len && length(index) != 1) { stop0("logical index ", index.name, " is too long.\n", " Its length is ", length(index), " and the max allowed length is ", len) } index } check.numeric.index <- function(index, index.name, len, allow.empty, allow.negatives, allow.dups, allow.zeros, treat.NA.as.one) { stopifnot(is.numeric(index)) if(!allow.empty) { if(length(index) == 0) stop0(index.name, " is empty, (its length is 0)") else if(all(index == 0)) if(length(index) == 1) stop0(index.name, " is 0") else stop0(index.name, " is all zeros") } if(!is.integral(index)) stop0(index.name, " is not an integer") if(any(index < 0) && any(index > 0)) stop0("mixed negative and positive values in ", index.name) if(!allow.zeros && any(index == 0) && length(index) != 1) warning0("zero in ", index.name) if(!allow.negatives && any(index < 0)) stop0("negative value in ", index.name) if(!allow.dups && any(duplicated(index))) warning0("duplicates in ", index.name) if(any(abs(index) > len)) { if(length(index) == 1) prefix <- paste0(unquote(index.name), "=", index, " but ") else prefix <- paste0(index.name, " is out of range, ") if(len != 1) stop0(prefix, "allowed values are 1 to ", len) else if(treat.NA.as.one) stop0(prefix, "the only allowed value is 1 (or NA)") else stop0(prefix, "the only allowed value is 1") } index } plotmo/R/xy.R0000644000176200001440000014776414663771205012606 0ustar liggesusers# xy.R: get a model's x or y (the plotmo_x and plotmo_y functions) # # Tracing is verbose and error messages are detailed throughout this # file, to facilitate diagnosis when a model doesn't work with plotmo. #------------------------------------------------------------------------------ # Return the "x" matrix for a model. This returns a data.frame which # always has column names. It tries hard to get x regardless of the model. # It can be used for models without a formula, provided that getCall(object) # or model$x is available. # # The returned columns are for the "naked" predictors e.g. "x3" instead of # "ns(x3,4)". Column names are manufactured when necessary, as "x1", # "x2", etc. This is needed for example for rpart(x,y) where x does not # have column names. # # It can handle sparse matrices from the Matrix package. These get # returned as a (non sparse) data.frame. # # If stringsAsFactors=FALSE, strings do not get converted to factors. plotmo_x <- function(object, trace, stringsAsFactors=TRUE) { trace2(trace, "--plotmo_x for %s object\n", class.as.char(object)) x <- plotmo.x(object, trace) do.subset <- TRUE # plotmo.x.default returns list(field, do.subset), so handle that if(is.list(x) && !is.data.frame(x) && !is.null(x$do.subset)) { do.subset <- check.boolean(x$do.subset) x <- x$field } # Following are mainly for when plotmo.x didn't invoke plotmo.x.default. # It shouldn't be needed but is included here to make sure. x <- cleanup.x.or.y(object, x, "x", trace, check.naked=FALSE) stopifnot(is.good.data(x, "plotmo_x", check.colnames=FALSE)) x <- my.data.frame(x, trace, stringsAsFactors) if(do.subset) { subset <- get.and.check.subset(x, object, trace) if(!is.null(subset)) { trace2(trace, "subset applied to x[%d,%d] ", NROW(x), NCOL(x)) x <- x[subset, , drop=FALSE] trace2(trace, "to yield x[%d,%d]\n", NROW(x), NCOL(x)) } } colnames(x) <- gen.colnames(x, "x", "x", trace) print_summary(x, "plotmo_x returned", trace) x } plotmo.x <- function(object, trace, ...) { # returns x or list(field=x, do.subset=do.subset) UseMethod("plotmo.x") } plotmo.x.default <- function(object, trace, ...) { # returns list(field=x, do.subset=do.subset) get.x.or.y(object, "x", trace, naked=TRUE) } # plotmo_y is similar to model.response but can handle models # that were created without a formula. # # For more details on the args and return value, see process.y. # If nresponse is not NULL we return the naked response variables # e.g. Volume not log(Volume). # # If convert.glm.response=TRUE and the model is a glm model we may # convert the response. See convert.glm.response() for details. plotmo_y <- function(object, nresponse=NULL, trace=0, expected.len=NULL, resp.levs=NULL, convert.glm.response=!is.null(nresponse)) { trace2(trace, "--plotmo_y with nresponse=%s for %s object\n", if(is.null(nresponse)) "NULL" else format(nresponse), class.as.char(object)) y <- plotmo.y(object, trace, naked=FALSE, expected.len, nresponse) do.subset <- TRUE # plotmo.y.default returns list(field, do.subset), so handle that if(is.list(y) && !is.data.frame(y) && !is.null(y$do.subset)) { do.subset <- check.boolean(y$do.subset) y <- y$field } if(convert.glm.response) y <- convert.glm.response(object, y, trace) if(do.subset) { subset <- get.and.check.subset(y, object, trace) if(!is.null(subset)) { trace2(trace, "subset applied to y[%d,%d] ", NROW(y), NCOL(y)) y <- if(is.null(dim(y))) y[subset] else y[subset, , drop=FALSE] trace2(trace, "to yield y[%d,%d]\n", NROW(y), NCOL(y)) } } process.y(y, object, type="response", nresponse, expected.len, resp.levs, trace, "plotmo_y") } # Note that the naked argument is irrelevant unless the response was # specified with a wrapper function like log(Volume) instead of plain Volume. # # The default for nresponse allows this to work with old versions of earth # (old plotmo.y.earth doesn't have a nresponse argument). plotmo.y <- function(object, trace, naked, expected.len, nresponse=1, ...) { # returns y or list(field=y, do.subset=do.subset) UseMethod("plotmo.y") } plotmo.y.default <- function(object, trace, naked, expected.len, ...) { # returns list(field=y, do.subset=do.subset) get.x.or.y(object, "y", trace, try.object.x.or.y=TRUE, argn=2, nrows.argn=expected.len, naked) } # Get x or y from the given model object # Returns list(field=x, do.subset=do.subset) where x is "x" or "y". get.x.or.y <- function( object, # the model field, # "x" or "y" trace, try.object.x.or.y=TRUE, # FALSE if object[[field]] should be ignored argn=0, # if nonzero, consider argument nbr argn of the model call nrows.argn=NULL, # expected NROWS of argument argn naked=TRUE) # TRUE to return colnames like "x3" not "ns(x3,4)" { ret.good.field <- function(x, do.subset=TRUE, source) { if(trace.call.global >= 1 && field == "y") { field <- if(field == "x") "predictors" else "response" if(grepl("model.frame(", source, fixed=TRUE)) source <- sub(",", # insert newline after first comma if(field == "response") ",\n " else ",\n ", source) printf("got model %s from %s\n", field, source) } list(field=x, do.subset=do.subset) } stopifnot(is.list(object)) stopifnot(field == "x" || field == "y") # try using object$x (where x is actually x or y throughout this file) object.x <- get.object.x.or.y.field(object, field, trace, try.object.x.or.y, naked) # object.x is object$x or NULL or an err msg if(is.good.data(object.x)) return(ret.good.field(object.x, FALSE, sprint("object$%s", field))) call <- getCall(object) if(!is.null(call)) trace2(trace, "\nobject call is %s\n", trunc.deparse(call, maxlen=80)) # try getting x or y from the model formula and model frame temp <- get.x.or.y.from.model.frame(object, field, trace, naked) model.frame.x <- temp$x do.subset <- temp$do.subset # TRUE when newdata is NULL source <- temp$source # model.frame.x is now x or y or NULL or an err msg if(is.good.data(model.frame.x)) { formula.as.char <- paste.collapse(format(temp$formula)) if(naked && grepl("\`", formula.as.char)) { # exception for hinge funcs etc trace2(trace, "setting check.naked=FALSE because backtick in formula\n") naked <- FALSE } model.frame.x <- cleanup.x.or.y(object, model.frame.x, field, trace, check.naked=naked && field != "y") if(!is.errmsg(model.frame.x)) return(ret.good.field(model.frame.x, do.subset, source)) } # try getCall(object)$x call.x <- get.data.from.object.call.field(object, field, trace) # call.x is getCall(object)$x or an error message if(is.good.data(call.x)) return(ret.good.field(call.x, TRUE, sprint("getCall(object)$%s", field))) # else { # TODO may not want to do this if x is ok except for no colnames # # try getCall(object)$X (note upper case "X") # upfield <- toupper(field) # call.x <- get.data.from.object.call.field(object, upfield, trace) # # call.x is getCall(object)$X or an error message # if(is.good.data(call.x)) { # # paranoia, check that argument number is correct # ifield <- if(field == "x") 2 else 3 # ok <- names(getCall(object))[ifield] == upfield # if(!is.na(ok) && length(ok == 1) && ok) # return(ret.good.field(call.x, TRUE, # sprint("getCall(object)$%s", upfield))) # else if(trace >= 2) # printf("ignoring getCall(object)$%s because it isn't arg number %d\n", # upfield, ifield) # } # } trace2(trace, "\n") # consider argument number argn of the model call (ignoring its name) temp <- get.argn.from.call(argn, object, field, trace, nrows.argn) argn.x <- temp$x argn <- temp$argn # may clear argn (for uncluttered errmsg later) # argn.x is the evaluated n'th arg or NULL or an err msg argn.name <- sprint("argument %g of the model call", argn) if(is.good.data(argn.x)) return(ret.good.field(argn.x, TRUE, argn.name)) # We don't have an x with colnames, so see if we have one without colnames. # We re-call is.errmsg() below to prevent re-issuing messages # in is.good.data() which we have already issued previously. if(try.object.x.or.y && !is.errmsg(object.x) && is.good.data(object.x, sprint("object$%s", field), trace, check.colnames=FALSE)) return(ret.good.field(object.x, FALSE, sprint("object$%s", field))) if(!is.errmsg(call.x) && is.good.data(call.x, sprint("call$%s", field), trace, check.colnames=FALSE)) return(ret.good.field(call.x, TRUE, sprint("getCall(object)$%s", field))) if(argn && !is.errmsg(argn.x) && is.good.data(argn.x, argn.name, trace, check.colnames=FALSE)) return(ret.good.field(argn.x, TRUE, sprint("object$%s", field))) # unsuccessful errmsg.for.get.x.or.y(field, trace, try.object.x.or.y, argn, object.x, model.frame.x, call.x, argn.x) is.earth.cv.model <- is.null(object.x) && !is.null(object$ifold) && inherits(object, "earth") stopf("cannot get the original model %s%s", if(field == "x") "predictors" else "response", if(is.earth.cv.model) " (use keepxy=2 in the call to earth)" else "") } is.errmsg <- function(x) { is.try.err(x) || (is.character(x) && length(x) == 1) } # Is the x argument a valid x or y for a model? # This returns TRUE or FALSE, silently unless trace >= 2. is.good.data <- function(x, xname="field", trace=0, check.colnames=TRUE) { good <- !is.null(x) && !is.try.err(x) && NROW(x) >= 3 has.colnames <- good && !is.null(colnames(x)) && !any(colnames(x) == "") if(trace >= 2) trace.data(good, has.colnames, x, xname, trace, check.colnames) good && (!check.colnames || has.colnames) } trace.data <- function(good, has.colnames, x, xname, trace, check.colnames) { stopifnot.string(xname) colnames.msg <- if(good && has.colnames) { sprint(" and has column name%s %s", if(length(colnames(x)) == 1) "" else "s", paste.trunc(colnames(x), maxlen=100)) } else if(good) sprint(" but without colnames %s", if(check.colnames) "so we will keep on searching" else "but we will use it anyway") else "" if(good) printf("%s is usable%s\n", xname, colnames.msg) else if(is.null(x)) printf("%s is NULL%s\n", xname, if(check.colnames) " (and it has no colnames)" else "") else if(!is.character(x) && NROW(x) < 3) printf("%s has less than three rows\n", xname, if(check.colnames) " (and it has no colnames)" else "") else printf("%s is not usable%s\n", xname, colnames.msg) # print bad data, but only on the first go around for this data # (use check.colnames as an indicator of first go around) if(!is.null(x) && check.colnames) { if(!good) printf("%s:%s\n", xname, format_err_field(x, xname, trace)) else if(trace >= 4) { printf("trace>=4: ") print_summary(x, xname, trace=2) } } } errmsg.for.get.x.or.y <- function(field, trace, try.object.x.or.y, argn, object.x, model.frame.x, call.x, argn.x) { printf("\nLooked unsuccessfully for the original %s in the following places:\n", if(field == "x") "predictors" else "response") ifield <- 1 if(try.object.x.or.y) { printf("\n(%d) object$%s:%s\n", ifield, field, format_err_field(object.x, field, trace)) ifield <- ifield + 1 } printf("\n(%d) model.frame:%s\n", ifield, format_err_field(model.frame.x, field, trace)) ifield <- ifield + 1 printf("\n(%d) getCall(object)$%s:%s\n", ifield, field, format_err_field(call.x, field, trace)) ifield <- ifield + 1 if(argn) printf("\n(%d) argument %d of the model call:%s\n", ifield, argn+1, format_err_field(argn.x, field, trace)) printf("\n") } format_err_field <- function(x, xname, trace=0) { if(is.try.err(x)) { errmsg <- sub(".* : *", "", x[1]) # strip prefix "Error in xxx : " errmsg <- gsub("\n *\\^", "", errmsg) # strip " ^" in some err msgs errmsg <- gsub("[\n\t ]+", " ", errmsg) # collapse newlines and multiple spaces errmsg <- gsub("^ *| *$", "", errmsg) # delete remaining leading and trailing space sprint(" %s", errmsg) } else if(is.errmsg(x)) sprint(" %s", x) else if(is.null(x)) sprint(" NULL") else if(NROW(x) < 3) sprint(" less than three rows") else if(!is.null(dim(x))) { print_summary(x, xname, trace=2) sprint(" is not usable (see above)") } else sprint(" class \"%s\" with value %s", class(x), try(paste.trunc(format(x))[1])) } # Get object$x or object$y from the model. # Return x (or y) or NULL or an error message. # # The approach taken in all helper routines for get.x.or.y # (such as get.object.x.or.y.field) is that we issue trace messages # here in the helper routine, and the caller silently checks # the returned value for good data. # # For a model with a formula, the standard path is to apply the # naked formula to the data using model.frame(). # Example with argument field="x": # # formula(object) resp~num + sqrt(num) + bool + ord:num + fac # naked formula resp~num + bool + ord + fac # data colnames resp bool ord fac str num nx int date # returned colnames num bool ord fac get.object.x.or.y.field <- function( # get object$x or object$y object, # the model field, # "x" or "y" trace, try.object.x.or.y=TRUE, # FALSE if object[[field]] should be ignored naked=TRUE) # TRUE for columns like "x3" not "ns(x3,4)" { trace2(trace, "\nget.object.%s:\n", field) x <- NULL xname <- sprint("object$%s", field) # for tracing if(!try.object.x.or.y) # e.g. we must ignore object$x for mda::mars models trace2(trace, "ignoring %s for this %s object\n", xname, class.as.char(object)) else { # note we use object[["x"]] rather than object$x to prevent partial # matching (but the error messages use object$x for readability) x <- object[[field]] if(is.good.data(x, xname, trace)) x <- cleanup.x.or.y(object, x, field, trace, check.naked=naked && field != "y") else if(!is.null(x) && !is.good.data(x, check.colnames=FALSE)) { # Issue a warning because predict.lm will probably crash # later when it internally accceses object$x. # We call is.good.data(check.colnames=FALSE) above to check if the # prior call to is.good.data() failed merely because of a colname # issue (if it's just a colname issue then don't issue warning). warnf("object$%s may be corrupt", field) } } x # return x or NULL or an error message } # Get getCall(object)$x (or similar) from the model's call field. # Return x (or similar) or NULL or an error message. get.data.from.object.call.field <- function(object, field, trace, check.is.good.data=TRUE) { trace2(trace, "\nget.data.from.object.call.field:\n") x <- NULL xname <- sprint("getCall(object)$%s", field) call <- getCall(object) if(is.null(call)) trace2(trace, "getCall(object) is NULL so cannot get %s\n", xname) else if(!is.call(call)) trace2(trace, "getCall(object) is not actually a call so cannot get %s", xname) else { x <- try.eval(call[[field]], model.env(object), trace=trace, expr.name=xname) if(is.errmsg(x)) trace2(trace, "%s\n", x) else if(check.is.good.data) # invoke is.good.data purely for issuing trace messages is.good.data(x, xname, trace) } x } # Get the n'th arg in the call to the model function. # # This is for those model functions whose second argument is the # response (what we call "y"), although that argument's name is # not "y". For example, argn=2 will select the "grouping" arg in # qda(x=lcush[,2:3], grouping=lcush[,1]). # # Returns list(argn.x, argn) # where argn.x is the evaluated n'th argument or NULL or an error message. # and argn will be set 0 if routine processing says we should ignore argn. get.argn.from.call <- function(argn, object, field, trace, nrows.argn) { x <- NULL if(argn) { temp <- get.argn.from.call.aux(argn, object, field, trace, nrows.argn) x <- temp$x argn <- temp$argn if(is.errmsg(x)) trace2(trace, "%s\n", x) else # invoke is.good.data purely for issuing trace messages is.good.data(x, sprint("argument %d of the model call", argn), trace) } list(x=x, argn=argn) } # auxilary function for get.argn.from.call get.argn.from.call.aux <- function(argn, object, field, trace, nrows.argn) { ret <- function(x, argn) { list(x=x, argn=argn) } #--- get.argn.from.call.x starts here stopifnot(argn > 0) call <- getCall(object) if(is.null(call)) return(ret("getCall(object) is NULL so cannot use argn", argn)) if(!is.call(call)) return(ret("getCall(object) is not actually a call so cannot use argn", argn)) if(length(call) <= argn) return(ret(sprint( "cannot use argn %d because getCall(object) does not have %d arguments", argn, argn), argn)) names.call <- names(call) # some names may be "" trace2(trace, "names(call) is %s\n", quotify(names.call)) # If argn is field (i.e. "x" or "y"), don't process it here because # we process call$x and call$y elsewhere (in get.data.from.object.call.field). # This is a common case, so we clear argn for uncluttered message # later in errmsg.for.get.x.or.y. # If the arg name is "" in getCall(object) this won't work, not serious. if(identical(names.call[argn+1], field)) return(ret(sprint( "the name of argument %d is \"%s\" so we will not process it with argn", argn, field), argn=0)) # If an argument of the call is "formula" then return, because # any arg named "x" or "y" is unlikely to be model data. # This is a a common case, so clear argn. if(pmatch("formula", names.call[2], 0)) return(ret(sprint( "ignoring argn %g because there is a formula argument", argn), argn=0)) x <- try.eval(call[[argn+1]], model.env(object), trace=trace, sprint("argument %d of the model call", argn)) if(is.data.frame(x)) x <- x[[1]] if(!(is.numeric(x[1]) || is.logical(x[1]) || is.factor(x[1]))) return(ret(sprint( "cannot use argn %d because it is not numeric, logical, or a factor", argn), argn)) if(is.null(nrows.argn)) # should never happen stop0("cannot use argn because the expected number of rows is unspecified") if(NROW(x) != nrows.argn) return(ret(sprint( "cannot use argn %g because it has %g rows but expected %g rows", argn, NROW(x), nrows.argn), argn)) list(x=x, argn=argn) } # If object has a formula, use that formula to get x or y (field is "x" or "y"). # Returns list(x, do.subset, form.as.char, source) where x may be an err msg and source # is a string describing where we got the data from (only used if no err msg). get.x.or.y.from.model.frame <- function(object, field, trace, naked, na.action="auto", newdata=NULL) { ret <- function(...) # ... is an err msg in printf form { errmsg <- sprint(...) trace2(trace, "%s\n", errmsg) list(x=errmsg, do.subset=FALSE, formula=NULL, source="model frame") } #--- get.x.or.y.from.model.frame starts here stopifnot(field == "x" || field == "y") trace2(trace, "\nget.%s.from.model.frame:\n", field) mf <- get.model.frame(object, field, trace, naked, na.action, newdata) if(!is.good.data(mf$x)) return(mf) model.frame <- mf$x if(field == "x") { # Check if any vars have $ in their name, this confuses predict() later. # They cause "Error in model.frame.default: variable lengths differ" # or "newdata had 50 rows but variables found have 330 rows" ibad <- grep("[._[:alnum:]]\\$", colnames(model.frame)) if(any(ibad)) { warnf("%s: \"$\" in colnames(model.frame) is not supported by plotmo, %s", colnames(model.frame)[ibad[1]], "will try to get the data elsewhere") return(ret("\"$\" in colnames(model.frame)")) } } # got the model.frame, now get the column index(s) of the response in the model.frame iresponse.col <- get.iresponse.col(object, model.frame, mf$isFormula, trace=if(field=="y") trace else 0) # reduce number of msgs if(field == "x") { # drop the response column(s) x <- model.frame[, -iresponse.col, drop=FALSE] if(!is.good.data(x, sprint("x=model.frame[,-%s]", paste.c(iresponse.col)), trace)) return(ret("invalid model.frame[,-iresponse]")) } else { # field == "y" # select the response column(s) # we don't use model.response() here because that drops the column name x <- model.frame[, iresponse.col, drop=FALSE] if(!is.good.data(x, sprint("y=model.frame[,%s]", paste.c(iresponse.col)), trace)) return(ret("invalid model.frame[,iresponse]")) } list(x=x, do.subset=mf$do.subset, formula=mf$formula, source=mf$source) } # The following is derived from stats::model.frame.default but tries to # also handle models that didn't save the terms etc. in a standard way. # It never uses parent.frame (as some model.frame methods do). # # We will use the given na.action. But if na.action="auto" then get # na.action from the model itself, and do a little special handling. # # Returns list(x, do.subste, formula, source, isFormula) # where x may be an err msg # source s a string describing where we got the data from (only used if no err msg) get.model.frame <- function(object, field, trace, naked, na.action="auto", newdata=NULL) { ret <- function(x, do.subset=FALSE, formula=NULL, source="model frame", isFormula=FALSE) { list(x=x, do.subset=do.subset, formula=formula, source=source, isFormula=isFormula) } #--- get.model.frame starts here # get.model.formula returns a Formula or formula with an environment, or an error string modform <- get.model.formula(object, trace, naked) formula <- modform$formula if(is.errmsg(formula)) return(ret(formula)) # return errmsg isFormula <- inherits(formula, "Formula") # Formula vs formula trace2(trace, "formula is valid, now looking for data for the model.frame\n") if(!is.null(newdata)) { if(!is.good.data(newdata, "newdata", trace)) return(ret("bad newdata")) # return errmsg data <- newdata data.source <- "newdata" } else { # use object$model if possible (e.g. lm) # TODO the following code really belongs in get.data.for.model.frame? x <- object[["model"]] if(is.good.data(x, "object$model", trace)) { # Drop column named "(weights)" created by lm() if called with weights # (must drop else x will be rejected because non-naked colname). x <- x[, which(colnames(x) != "(weights)"), drop=FALSE] if(trace >= 3) print_summary(x, "model.frame", trace) # Note that we call check.naked even when the naked=FALSE. # Not essential, but gives more consistency so we select the same object$x, # getCall(object), or etc. regardless of whether naked is set or clear. if(is.null(check.naked(x, "object$model", trace))) # good object$model? return(ret(x, FALSE, formula, "object$model", isFormula)) } temp <- get.data.for.model.frame(object, trace) data <- temp$data data.source <- temp$source if(!is.good.data(data)) { # data is not usable (could be NULL) # following is for when no data argument when model was built data <- model.env(object) data.source <- "model.env(object)" } } if(is.character(na.action) && length(na.action) == 1 && na.action == "auto") { na.action <- na.action(object) class.na.action <- class(na.action) # following is for rpart's and ctree's (special but useful) NA handling if(is.null(na.action)) na.action <- if(inherits(object, "rpart") || inherits(object, "party_plotmo")) "na.pass" else "na.fail" else if(length(class.na.action) == 2 && class.na.action[1] == "na.rpart") na.action <- paste0("na.", class(na.action)[2]) else if(class.na.action[1] %in% c("exclude", "fail", "omit", "pass")) na.action <- paste0("na.", class(na.action)[1]) trace2(trace, "na.action(object) is %s\n", as.char(na.action)) } if(!is.function(na.action) && !is.character(na.action)) { errmsg <- sprint("bad na.action: %s", as.char(na.action)) trace2(trace, "%s\n", errmsg) return(ret(errmsg)) } if(trace >= 3) { printf("model.env is %s\n", environment.as.char(model.env(object))) print_summary(data, "data", trace) } data.source <- if(is.environment(data)) environment.as.char(data) else if(is.null(data)) "NULL" else data.source mfcall.as.char <- sprint("model.frame(%s, data=%s, na.action=%s)", paste.trunc(modform$form.as.char, maxlen=40), data.source, trunc.deparse(na.action)) trace2(trace, "stats::%s\n", mfcall.as.char) x <- try(do.call(stats::model.frame, # calls model.frame.default args=list(formula=formula, data=data, na.action=na.action)), silent=trace < 2) if(trace >= 3) print_summary(x, "model.frame returned", trace) ret(x, if(is.null(newdata)) TRUE else FALSE, formula, mfcall.as.char, isFormula) } get.data.for.model.frame <- function(object, trace) { ret <- function(errmsg, data=NULL, source="model frame") { if(!is.null(errmsg)) trace2(trace, "%s\n", errmsg) list(data=data, source=source) } # try object$data e.g. earth models with formula and keepxy=T # the inherits check is becauses party objects for e.g. "medv ~ log(lstat) + rm^2" # save "log(lstat)" not "lstat" in object data, that confuses model.frame.default if(!inherits(object, "party_plotmo")) { data <- object[["data"]] if(is.good.data(data, "object$data", trace)) return(ret(NULL, data, "object$data")) } # look for the data in getCall(object) call <- object[["call"]] if(is.null(call)) return(ret("getCall(object) is NULL so cannot get the data from the call")) if(!is.call(call)) return(ret("getCall(object) is not actually a call so cannot get the data from the call")) data <- NULL argname <- "NULL" # try getCall(object)$data idata <- match(c("data"), names(call), 0)[1] if(idata > 0) { trace2(trace, "argument %g of the call is 'data'\n", idata-1) argname <- "call$data" # Mar 2019: TODO this doesn't work (if model was built internally to another # function?) because it tries to get data from .RGlobalEnv (which in that # environment is a function "data"). Perhaps failure is because terms(mf) seems # to generate a terms field ".GlobalEnv" regardless of where the mf was evaluated. # Workaround for earth models: use keepxy=TRUE (to avoid this code) data <- try(eval.trace(call[[idata]], model.env(object), trace=trace, expr.name=argname), silent=FALSE) # so user can see what went wrong is.good.data(data, argname, trace) # purely for tracing } else { # no getCall(object)$data, search for an arg that looks like good data trace2(trace, "getCall(object) has no arg named 'data', will search for an arg that looks like data\n") if(length(call) >= 3) { # start at 3 to ignore fname and first arg (the formula) for(icall in 3:length(call)) { arg <- call[[icall]] if(class(arg)[1] == "name") { # paranoia, will always be true? argname <- sprint("call$%s", quotify(as.character(arg))) data <- eval.trace(arg, model.env(object), trace=trace, expr.name=argname) if(is.good.data(data, argname, trace=trace)) { trace2(trace, "%s appears to be the model data\n", argname) idata <- icall break } else { trace2(trace, "%s is not the model data\n", argname) data <- NULL } } } } } if(is.good.data(data, argname)) { # following needed for e.g. nnet(O3~., data=scale(ozone1), size=2) # Else get Error in model.frame.default: 'data' must be a data.frame. if(!is.data.frame(data)) { data <- try(my.data.frame(data, trace)) # invoke is.good.data purely for issuing trace messages is.good.data(data, sprint( "%s converted from \"%s\" to \"data.frame\"", argname, class(data)[1]), trace) } } ret(NULL, data, argname) } # get the column index(s) of the response in the model.frame, return 1 if can't (best guess is 1) get.iresponse.col <- function(object, model.frame, isFormula, trace) { assuming <- sprint("assuming \"%s\" in the model.frame is the response, because", gen.colnames(model.frame, prefix="model.frame", trace=trace)[1]) iresponse.col <- 1 terms <- try(terms(object), silent=TRUE) if(is.null(terms)) { # e.g. bagEarth.formula and nn trace1(trace, "%s terms(object) is NULL\n", assuming) return(1) # assume iresponse.col is 1 } if(is.try.err(terms)) { trace1(trace, "%s terms(object) did not return the terms\n", assuming) return(1) } # object seems to have a valid terms field iresponse.col <- attr(terms, "response") if(is.null(iresponse.col) || !is.numeric(iresponse.col) || length(iresponse.col) != 1) { trace1(trace, "%s attr(terms, \"response\") is invalid\n", assuming) return(1) } if(iresponse.col != 0) { if(isFormula) { trace1(trace, "%s object used Formula (not formula) yet attr(terms, \"response\") is nonzero\n", assuming) return(1) } iresponse.col <- try(check.index(iresponse.col, "attr(terms, \"response\")", model.frame, is.col.index=TRUE, allow.negatives=FALSE)) } else { # iresponse.col == 0 if(!isFormula) { trace1(trace, "%s attr(terms, \"response\") is 0\n", assuming) return(1) } # isFormula iresponse.col <- attr(terms, "Response") if(is.null(iresponse.col)) { # will happen for any model that uses Formula (not formula), except earth trace1(trace, "%s the model was built with Formula (not formula)\n", assuming) return(1) } if(is.null(iresponse.col) || !is.numeric(iresponse.col)) { trace1(trace, "%s attr(terms, \"Response\") is invalid\n", assuming) return(1) } iresponse.col <- try(check.index(iresponse.col, "attr(terms, \"Response\")", model.frame, is.col.index=TRUE, allow.negatives=FALSE)) } if(is.try.err(iresponse.col)) { trace1(trace, "%s calculated index was invalid\n", assuming) iresponse.col <- 1 } iresponse.col } isa.formula <- function(x) { (typeof(x) == "language" && as.list(x)[[1]] == "~") || (is.character(x) && length(x) == 1 && grepany("~", x)) } get.index.of.formula.arg.in.call <- function(call, trace) { iform <- match(c("formula"), names(call), 0) if(iform) return(iform) # no arg named "formula" in call, so look for a formula elsewhere in call # TODO for which model was this code added? I think it's needed if formula arg is unnamed? call <- as.list(call) # start at 2 to skip call[1] which is the function name for(iform in 2:length(call)) { if(isa.formula(call[[iform]])) { # warning0("the formula in the model call is not named 'formula'") trace2(trace, "argument %d in getCall(object) is a formula\n", iform) return(iform) # note return } } 0 # no formula } # return a Formula or formula with an environment, or an error string get.model.formula <- function(object, trace, naked) { ret <- function(...) # ... is an err msg in printf form { errmsg <- sprint(...) trace2(trace, "%s\n", errmsg) list(formula=errmsg, form.as.char="formula") } #--- get.model.formula starts here # try getting the formula from the terms field (object used formula) terms <- try(terms(object), silent=TRUE) if(is.null(terms)) trace2(trace, "terms(object) is NULL, will look for the formula elsewhere\n") else if(is.try.err(terms)) trace2(trace, "terms(object) did not return the terms, will look for the formula elsewhere\n") else { # object has a valid terms field # TODO Sep 2020 ask Formula package people to extend # (currently only earth supports attr(terms, "Formula") and "Response" form <- attr(terms, "Formula") isFormula <- !is.null(form) # "Formula" vs "formula" if(isFormula) { trace1(trace, "object created with Formula (not formula): using attr(terms, \"Formula\")\n") form <- formula_as_char_with_check(form, "attr(terms, \"Formula\")", trace) } else { form <- try(formula(terms), silent=TRUE) form <- formula_as_char_with_check(form, "formula(object)", trace) } if(!is.null(form$form.as.char)) return(process.formula(object, form$form.as.char, isFormula, trace, naked)) # if there was a $ in the form.as.char there is no point in looking at the call # formula, so to avoid issuing the same warning twice, we return # immediately here if(grepl("\"$\"", form$errmsg, fixed=TRUE)) return(ret(form$errmsg)) } # try getting the formula from getCall(object) call <- object[["call"]] if(is.null(call)) return(ret("getCall(object) is NULL so cannot get the formula from the call")) if(!is.call(call)) return(ret("getCall(object) is not actually a call so cannot get the formula from the call")) iform <- get.index.of.formula.arg.in.call(call, trace) if(iform == 0) # no formula? return(ret("no formula in getCall(object)")) # nasty name change, else model.frame.default: invalid type (language) # TODO clean this up, this won't work because it doesn't change the calling obj # names.call <- names(call) # names.call[iform] <- "formula" # names(call) <- names.call # note <<- not <- form.name <- sprint("model call argument %d", iform-1) form <- eval(call[[iform]], model.env(object)) form <- formula_as_char_with_check(form, form.name, trace) if(is.null(form$form.as.char)) return(ret(form$errmsg)) # TODO More classes could be added to the following assignment to isFormula # (and remember we can only get here if object doesn't have a terms field, # and I believe the objects below do in fact have a terms field) isFormula <- inherits(object, c("pre")) process.formula(object, form$form.as.char, isFormula=isFormula, trace, naked) } # convert the formula to character, and also check it formula_as_char_with_check <- function(form, form.name, trace) { ret.null <- function(...) # ... is an err msg in printf form { errmsg <- sprint(...) trace2(trace, "%s\n", errmsg) list(form.as.char=NULL, errmsg=errmsg) } if(is.try.err(form)) return(ret.null("%s did not return a formula", form.name)) if(is.null(form)) return(ret.null("%s is NULL", form.name)) if(class(form)[1] != "formula" && !class(form)[1] == "Formula" && !(is.character(form) && length(form) == 1)) return(ret.null("%s is not a formula or Formula (its class is \"%s\")", form.name, class(form)[1])) form.as.char <- paste.collapse(format(form)) trace2(trace, "%s is %s\n", form.name, paste.trunc(form.as.char)) if(!grepl("[^ \t]+.*~", form.as.char)) return(ret.null("%s has no response", form.name)) # Check if any vars have $ in their name, this confuses predict() later. # TODO Following comments are no longer accurate? # We do this check in get.x.or.y.from.model.frame but pre-emptively also here # (where we have the formula) for a slightly more informative error message. # (The other message kicks in if we get the model.frame from object$model.) rhs <- gsub(".*~ *", "", form.as.char) if(grepany("[._[:alnum:]]\\$", rhs)) { # check for "ident$" warnf("\"$\" in the formula is not supported by plotmo, %s\n formula: %s", "will try to get the data elsewhere", rhs) return(ret.null("%s: \"$\" in formula is not allowed", form.name)) } list(form.as.char=form.as.char, errmsg=NULL) } # Return a formula with an environment. Also process naked. # TODO this includes Height in Volume~Girth-Height, it shouldn't process.formula <- function(object, form.as.char, isFormula, trace, naked) { stopifnot(is.character(form.as.char)) stopifnot(length(form.as.char) == 1) if(naked) form.as.char <- naken.formula.string(form.as.char, trace) form <- try(formula(form.as.char, env=model.env(object)), silent=TRUE) if(isFormula && !is.try.err(form)) form <- try(Formula::Formula(form)) if(is.try.err(form)) { # prepend "formula(%s) failed" for a clearer msg in format_err_field later form <- sprint("%s(%s) failed%s", if(isFormula) "Formula" else "formula", quotify(form.as.char), # only append err msg if tracing because err msgs can be obscure if(trace >= 1) sprint("(%s)", cleantry(form)) else "") trace2(trace, "%s\n", form) form <- sprint("Error : %s", form) } list(formula=form, form.as.char=form.as.char) } # Given a formula (as string), return a string with the "naked" predictors. # This is used for getting the data to pass to predict. # # Example: log(y) ~ x9+ns(x2,4) + s(x3,x4,df=4) + x5:sqrt(x6) # becomes: log(y) ~ x9 + x2 + x3 + x4 + x5 + x6 # which will later result in a model.matrix with columns x9 x2 x3 x4 x5 x6. # # Note that we don't naken the response (so for # example in the above log(y) remains unchanged). # # This routine is not infallible but works for the commonly used formulas. # It's a hack that relies on regular expressions. naken.formula.string <- function(form.as.char, trace) { stopifnot(is.character(form.as.char)) form.as.char <- paste.collapse(form.as.char) old.form.as.char <- form.as.char naked <- gsub(".*~", "", form.as.char) # extract everything after ~ naked <- naken.collapse(naked, warn.if.minus=TRUE) if(grepl("~", form.as.char)) { response <- gsub("~.*", "", form.as.char) # extract up to the ~ response <- gsub("^ +| +$", "", response) # trim leading and trailing spaces if(nchar(response)) response <- paste0(response, " ~") naked <- paste.collapse(response, naked) } trace2(trace, if(strip.space(naked) == strip.space(old.form.as.char)) "naked formula is the same%.0s\n" # e.g. O3~vh+wind else "naked formula is %s\n", naked) naked } is.naked <- function(colnames) # returns a logical vector { naked <- logical(length(colnames)) for(i in seq_len(length(colnames))) { colname <- strip.space(colnames[i]) naked[i] <- colname == naken.collapse(colname) } naked } # Return an err msg if colnames(x) is not "naked". # Return NULL if everything is ok. # # Example: in lm(Volume~poly(Height, degree=3), data=trees, x=T), # object$x, object$data, and object$model have # colnames like "poly(Height, degree = 3)1" # where plotmo (actually model.frame.default) gives "Error: object 'x1' not found" # unless we preempt that obscure error message here. check.naked <- function(x, xname, trace) { errmsg <- NULL colnames <- colnames(x) # column name "(Intercept)" must be considered naked colnames <- sub("(Intercept)", "Intercept", colnames, fixed=TRUE) is.naked <- is.naked(colnames) if(any(!is.naked)) { # e.g. lm(formula=log(doy)~vh, ...) errmsg <- sprint( "%s cannot be used because it has%s non-naked column name%s %s", xname, if(sum(!is.naked) > 1) "" else " a", if(sum(!is.naked) > 1) "s" else "", quotify.trunc(colnames[!is.naked])) trace2(trace, "%s\n", errmsg) } errmsg } # Returns x or an error message (currrently an error message # is returned only if naked=TRUE but colnames are not naked). cleanup.x.or.y <- function(object, x, field, trace, check.naked) { x <- handle.nonvector.vars(object, x, field, trace) # remove column "(Intercept)" e.g. object$x for lm(y~x1+x2, x=TRUE) if(!is.na(i <- match("(Intercept)", colnames(x)))) { trace2(trace, "dropped \"(Intercept)\" column from %s\n", field) x <- x[,-i, drop=FALSE] } if(check.naked) { errmsg <- check.naked(x, field, trace) if(!is.null(errmsg)) return(errmsg) } x } # This tries to clean up columns of x that are themselves matrices or data.frames. # # Example (where the actual values in the x and y are not important): # x <- matrix(c(1,3,2,4,5,6,7,8,9,10, # 2,3,4,5,6,7,8,9,8,9), ncol=2) # colnames(x) <- c("c1", "c2") # y <- 3:12 # a <- lm(y~x) # seems natural, but lm doesn't handle it as we might expect # Cannot get predict to work with newdata on above lm model # Causes for example 'newdata' had 8 rows but variables found have 10 rows # # Another example: # library(ElemStatLearn); x <- mixture.example$x; # g <- mixture.example$y; a <- lm(g ~ x) # # This routine also prevents a misleading error msg later in plot_degree1 # (illegal index, missing column in x) caused by the following code: # data(gasoline, package='pls') # plotmo(earth(octane ~ NIR, data=gasoline)) # where NIR has class "AsIs" and is a matrix. # There appears to be no easy fix for this (July 2011). handle.nonvector.vars <- function(object, x, field, trace) { if(!is.data.frame(x)) return(x) ndims.of.each.var <- sapply(x, function(x) NCOL(x)) if(all(ndims.of.each.var == 1)) { # we are ok: NCOL is 1 for all variables (even though some # may not be vectors i.e. they could be single column mats) return(x) } format <- paste0("%s variable on the %s side of the formula is a matrix or data.frame\n", " plotmo often cannot process such variables") msg <- sprint(format, if(ncol(x) == 1) "the" else "a", if(field == "x") "right" else "left") if(field == "x") { # We issue the warning only if this is the rhs, because we seem to be able # to recover when the lhs is a non vector. Thus we correctly don't issue # warnings for valid models like earth(cbind(O3,doy)~., data=ozone1) and # glm(cbind(damage, 6-damage)~temp, family=binomial, data=orings). warning0(msg) } else if(trace >= 2) { printf("%s\n", msg) printf("the number of dimensions of each variable in %s is %s and ", field, paste.trunc(ndims.of.each.var)) # details is 1 not 2 below else huge output print_summary(x, sprint("%s is ", field), trace, details=-1) } # Attempt to fix the problem by replacing x with x[[1]]. However # for the rhs this only sometimes works --- there may be downstream # problems, typically in predict (because the column names are wrong?). if(ndims.of.each.var[1] > 1) { # first variable is not a vector trace2(trace, "replacing %s with %s[[1]]%s\n", field, field, if(length(ndims.of.each.var) == 1) "" else ", ignoring remaining columns") org.colnames <- colnames(x) x <- x[[1]] # add column names (helps keep track later) if(is.null(colnames(x))) { safe.org.colnames <- if(is.null(org.colnames)) # can never happen, but best to be sure field else org.colnames if(NCOL(x) > 1) colnames(x) <- paste0(safe.org.colnames[1], "[,", 1:NCOL(x), "]") else # e.g. glm(formula=response~temp, family="binomial", data=...) colnames(x) <- safe.org.colnames[1] trace2(trace, "%s colnames were %s and now %s\n", field, if(is.null(org.colnames)) "NULL" else quotify.trunc(org.colnames), quotify.trunc(colnames(x))) } } x } # Detect if the model is a glm model, and if so possibly convert the # response. We do this in the same way as glm() does internally: # # o A factor response get converted to indicator column of # ones and zeros (first level vs the rest). # # o Two column binomial responses get converted to a single # column of fractions. # # Note that responses for earth models are handled independently # in plotmo.y.earth (two level factor to single numeric column, # three of more level factors to three or more indicator columns). convert.glm.response <- function(object, y, trace) { # check if y is is factor, or first column of y is a factor is.factor <- is.factor(y) || (length(dim(y) == 2) && ncol(y) == 1 && is.factor(y[,1])) if(is.factor) y <- convert.glm.response.factor(object, y, trace) else if(NCOL(y) == 2) # possibly a two column binomial model y <- possibly.convert.glm.two.column.response(object, y, trace) y } is.nomial <- function(object) { is.nomial.string <- function(family) { family[1] == "binomial" || family[1] == "quasibinomial" || family[1] == "multinomial" } if(!is.list(object)) return(FALSE) family <- object$family if(is.character(family)) # glmnet models return(is.nomial.string(family)) fam <- try(family(object), silent=TRUE) if(inherits(fam, "family")) { # lm, glm, etc models family <- fam$family if(is.character(family)) return(is.nomial.string(family)) } FALSE } convert.glm.response.factor <- function(object, y, trace) { if(!is.nomial(object)) { # e.g. rpart(formula=Kyphosis~., data=kyphosis) trace2(trace, "the response is a factor but could not get the family of the %s model\n", class.as.char(object)) } else { # e.g. glm(formula=sex~., family=binomial, data=etitanic) if(!is.null(dim(y))) { # data.frame or matrix levels <- levels(y[,1]) y[,1] <- y[,1] != levels[1] } else { # vector levels <- levels(y) y <- y != levels[1] y <- data.frame(y) } # column naming helps us keep track that we did this manipulation of x colnames(y) <- if(length(levels) > 1) paste0("is", levels[2]) else paste0("not", levels[1]) trace2(trace, "generated indicator column \"%s\" from levels %s\n", colnames(y)[1], paste.trunc(levels)) } y } possibly.convert.glm.two.column.response <- function(object, y, trace) { if(is.nomial(object)) { # following are sanity checks # note also that here we treat a two column multinom model as a binom model stopifnot(NCOL(y) == 2) if(!is.numeric(y[,1]) || !is.numeric(y[,2])) warning0("non-numeric two column response for a binomial model") else if(any(y[,1] < 0) || any(y[,2] < 0)) warning0("negative values in the two column response ", "for a binomial model") # example 1 glm(formula=response~temp, family="binomial", data=orings) # example 2 glm(formula=cbind(damage,6-damage)~temp, family="bi...) org.colnames <- colnames(y) y <- bpairs.yfrac(y[,1:2], trace=(trace!=0)) y <- data.frame(y) # column naming helps us keep track that we did this manipulation of x if(!is.null(org.colnames)) { colnames(y) <- # gsub deletes things like "[,2]" paste0(gsub("\\[.*\\]", "", org.colnames[1]), ".yfrac") trace2(trace, "created column \"%s\" from two column binomial response\n", colnames(y)) } } y } get.and.check.subset <- function(x, object, trace) { is.valid <- function(subset) { !is.null(subset) && (is.numeric(subset) || is.logical(subset)) } #--- get.and.check.subset starts here subset <- object$subset if(is.valid(subset)) msg <- "object$subset" else { subset <- try(eval(getCall(object)$subset, model.env(object)), silent=TRUE) if(is.try.err(subset)) subset <- NULL else msg <- "getCall(object)$subset" } if(!is.valid(subset)) subset <- NULL else { # duplicates are allowed in subsets so user can specify a bootstrap sample check.index(subset, "subset", x, allow.dups=TRUE, allow.zeros=TRUE) if(trace >= 2) { cat0("got subset from ", msg, " length " , length(subset)) print_first_few_elements_of_vector(subset, trace) } } subset } plotmo/R/predict.R0000644000176200001440000001270314663771205013560 0ustar liggesusers# predict.R: plotmo wrapper functions for predict() # Returns an n x 1 matrix (unless nresponse=NULL then returns an n x q dataframe) # # The newdata argument can be a positive integer n, which is the same as # newdata=NULL but may return only n rows if that is more efficient. # This is for efficiency in plotmo_meta. plotmo_predict <- function(object, newdata, nresponse, type, expected.levs, trace, inverse.func=NULL, ...) { # handle special case where newdata specifies the number of rows nrows <- 0 if(is.numeric(newdata) && length(newdata) == 1 && newdata > 0) { nrows <- newdata newdata <- NULL } if(is.null(newdata)) { # It generally faster to use newdata=NULL. But not all models correctly # process the type argument with null newdata. So here we check for some # models that are known good that way. The inherits function is not # used here because for example a glm model inherits("lm") but with # NULL newdata doesn't process type as we might hope. if(class(object)[1] %in% c("lm", "earth")) trace2(trace, "calling predict.%s with NULL newdata\n", class.as.char(object)) else { # assume object cannot handle newdata=NULL trace2(trace, "plotmo_predict with NULL newdata%s, %s", if(nrows) sprint(" (nrows=%d)", nrows) else "", "using plotmo_x to get the data\n") newdata <- plotmo_x(object, trace) if(nrows) newdata <- newdata[seq_len(nrows),,drop=FALSE] trace2(trace, "will use the above data instead of newdata=NULL for predict.%s\n", class.as.char(object)) } } else print_summary(newdata, "newdata", trace) yhat <- plotmo.predict(object=object, newdata=newdata, type=type, ..., TRACE=if(trace >= 2) trace else trace.call.global) temp <- process.y(yhat, object, type, nresponse, expected.len=nrow(newdata), expected.levs, trace, fname="predict") yhat <- apply.inverse.func(inverse.func, temp$y, object, trace) list(yhat = yhat, # n x 1 matrix (unless nresponse=NULL then an n x q dataframe) resp.levs = temp$resp.levs, resp.class = temp$resp.class) } # TRACE is passed to do.call.trace (if TRACE>0 print the call to predict) plotmo.predict <- function(object, newdata, type, ..., TRACE) { stopifnot.string(type) UseMethod("plotmo.predict") } # this handles a common mistake # (TODO I think this is now pre-empted by plotmo initial tests on model) plotmo.predict.list <- function(object, ...) { stop0("object does not have a predict method") } # plotmo.predict.default calls predict for the given object, # and does tracing and error handling. # # It also allows use to pre-program default args for predict, # which can be overruled or augmented by args passed in dots. # These defaults args must be specified in the calling function. For example # plotmo.predict.default(object, newdata, type=type, def.foo=3, ...) # will pass foo=3 to predict --- unless the caller of plotmo passes # predict.foo=0 to plotmo, which will override the default and pass foo=0 # to predict. # When specifying defaults, use the full arg name (no abbreviations) # prefixed by "def.". plotmo.predict.default <- function( object, newdata, ..., # extra args to predict, first typically is type="xxx" TRACE, # passed to do.call.trace (if TRACE>0 print the call to predict) FUNC=NULL) # predict function, NULL means use stats::predict { fname <- "PREDICTFUNC" if(is.null(FUNC)) { FUNC <- stats::predict fname <- "stats::predict" } # Create arg list for predict. # We invoke deprefix directly (and not call.dots) because we have to # specify a DROP argument and also do a bit of other processing. # OBJECT and NEWDATA must be passed as unnamed arguments to predict, # because different predict methods use different arg names for these. # We want to allow the user to pass normal (unprefixed) dots argument to # predict. So here we use KEEP=NULL but drop any plot arguments, and # any prefixed dot arguments that are necessary elsewhere in plotmo. # We can't specify a FUNC argument to deprefix because we don't # know which specific predict.method will be called (a few lines down). args <- deprefix(FUNC=NULL, DROP=paste0("w1. SHOWCALL FORCEPREDICT PLOT.ARGS PAR.ARGS PLOTMO.ARGS"), PREFIX="predict.", FNAME=fname, force.anon1=object, force.anon2=newdata, ...) yhat <- do.call.trace(func=FUNC, args=args, fname=fname, trace=TRACE) if(is.null(yhat) || length(yhat) == 0) stopf("failed call to predict(%s)", list.as.char(args)) yhat # plausibility of yhat will be checked shortly in plotmo_predict } # Like plotmo.predict.default but first convert newdata to a matrix. # Needed because some predict methods require a matrix, not a data.frame. plotmo.predict.defaultm <- function(object, newdata, type, ..., TRACE, FUNC=NULL) { stopifnot(is.data.frame(newdata)) check.df.numeric.or.logical(newdata) # following calls predict.xxx where xxx is the class of object plotmo.predict.default(object, data.matrix(newdata), type=type, ..., TRACE=TRACE) } plotmo/R/rpart.R0000644000176200001440000000541314663771205013256 0ustar liggesusers# rpart.R: plotmo methods for rpart objects plotmo.type.rpart <- function(object, ..., TRACE) { # use same default as predict.rpart if(object$method == "class") "prob" else "vector" } plotmo.residtype.rpart <- function(object, ..., TRACE) { "usual" } plotmo.singles.rpart <- function(object, x, nresponse, trace, all1, ...) { if(all1 == 2) # return all variables, not just those used in the model return(seq_len(NCOL(x))) # get all variables used in the tree varnames <- as.character(object$frame$var) # factor to character varnames <- unique(varnames[varnames != ""]) match(varnames, colnames(x)) } plotmo.pairs.rpart <- function(object, x, ...) { # we consider rpart variables paired if one is the direct # parent of the other in the tree. irow <- as.integer(row.names(object$frame)) var.names <- character(length=max(irow)) var.names[irow] <- as.character(object$frame$var) # factor to character ivar <- charmatch(var.names, colnames(x)) # following is the same as var.names != "" & var.names !="" is.split <- !is.na(ivar) & ivar > 0 if(sum(is.split) == 0) # no splits? (intercept-only model) return(NULL) pairs <- NULL for(i in 1:length(ivar)) { if(is.split[i]) { left <- 2 * i if(left <= length(ivar) && is.split[left] && ivar[i] != ivar[left]) pairs <- c(pairs, ivar[i], ivar[left]) right <- left + 1 if(right <= length(ivar) && is.split[right] && ivar[i] != ivar[right]) pairs <- c(pairs, ivar[i], ivar[right]) } } if(!is.null(pairs)) pairs <- matrix(pairs, ncol=2, byrow=TRUE) pairs } plotmo.predict.rpart <- function(object, newdata, type, ..., TRACE) { # change option warnPartialMatchDollar to work around issue within predict.rpart: Warning: partial match of 'split' to 'splits' old.warnPartialMatchDollar <- getOption("warnPartialMatchDollar") if(!is.null(old.warnPartialMatchDollar)) on.exit(options(warnPartialMatchDollar=old.warnPartialMatchDollar)) options(warnPartialMatchDollar=FALSE) # do some hand holding to avoid obscure message from predict.rpart pmatch <- pmatch(object$method, c("anova", "class", "exp", "poisson")) if(pmatch == 2) { # class if(!pmatch(type, c("vector", "prob", "matrix", "class"), nomatch=0)) stop0("predict.rpart does not support type=\"", type, "\"") } else if(!pmatch(type, c("vector", "matrix"), nomatch=0)) stop0("predict.rpart does not support type=\"", type, "\" (for \"", object$method, "\" rpart objects)") plotmo.predict.default(object, newdata, type=type, ..., TRACE=TRACE) } plotmo/R/xgboost.R0000644000176200001440000000037214663771205013612 0ustar liggesusers# xgboost.R: plotmo.prolog.xgb.Booster <- function(object, object.name, trace, ...) # xgboost model { stop0("xgboost models do not conform to standard S3 model guidelines ", "and are thus not supported by plotmo and plotres") } plotmo/R/residuals.R0000644000176200001440000002017414663771205014122 0ustar liggesusers# residuals.R: plotmo functions for residuals (the residuals, their scale, and name) # "rinfo" is "residual info" plotmo_rinfo <- function(object, type=NULL, residtype=type, nresponse=1, standardize=FALSE, delever=FALSE, trace=0, leverage.msg="returned as NA", expected.levs=NULL, labels.id=NULL, ...) { trace2(trace, "----plotmo_rinfo: plotmo_resids(object, type=\"%s\", nresponse=%s)\n", type, if(is.na(nresponse)) "NA" else if(is.null(nresponse)) "NULL" else paste(nresponse)) # TODO e.g. earth pclass nresp=1, plotmo_y returns pclass1st 0 or 1 but predict is 1, 2, 3 if(!is.na(pmatch(type, "class"))) { # if(inherits(object, "lda") || inherits(object, "qda")) # stopf( # "plotres does not support type=\"class\" for %s objects\n Note: plotmo extends predict.%s internally:\n%s%s\n", # class.as.char(object, TRUE), # class.as.char(object), # " 'type' can be one of c(\"class\", \"posterior\", \"response\")\n", # " This is discussed in the plotmo vignette.") # else stopf( "plotres does not (yet) support type=\"class\" for %s objects\n Try type=\"response\" ?", class.as.char(object, quotify=TRUE)) } # try calling residuals() directly tracex <- if(trace == 1) 0 else trace # already printed call to residuals in plotmo_meta plotmo_resids <- plotmo_resids(object, type, residtype, nresponse=nresponse, trace=tracex, ...) if(!is.null(plotmo_resids)) { resids <- plotmo_resids$resids labs <- plotmo_resids$labs fitted <- plotmo_fitted(object, trace, nresponse, type, ...)$fitted } else { # trace=2 not 1 because we have already printed this message info in plotmo_meta if(trace >= 2) printf("calling predict() because residuals() was unsuccessful\n") fitted <- plotmo_predict(object, newdata=NULL, nresponse, type, expected.levs, trace, inverse.func=NULL, ...)$yhat labs <- rownames(fitted) check.numeric.scalar(nresponse) # nresponse should be specified by now if(nresponse == 1) plotmo_y <- plotmo_y(object, nresponse, trace, nrow(fitted), object$levels) else { # TODO needed for e.g. rpart and lars where y has one col but predict has multiple cols tracex <- if(trace <= 0) -1 else trace # prevent msg in plotmo_nresponse, see note there plotmo_y <- try(plotmo_y(object, nresponse, tracex, nrow(fitted), object$levels), silent=trace == 0) if(is.try.err(plotmo_y)) { trace1(trace, "the call to plotmo_y was unsuccessful with nresponse=%g, trying again with nresponse=1\n", nresponse) nresponse <- 1 plotmo_y <- plotmo_y(object, nresponse, trace, nrow(fitted), object$levels) trace1(trace, "plotmo_y is ok with nresponse forced to 1\n") } } y <- plotmo_y$y resids <- y - fitted colnames(resids) <- "resids" # TODO following will sometimes give the wrong results? if(!is.null(nresponse) && nresponse > NCOL(resids)) { if(trace >= 1) printf( "forcing nresponse %g to 1 because response - fitted has one column\n", nresponse) nresponse <- 1 } resids <- process.y(resids, object, type, nresponse, expected.len=nrow(fitted), expected.levs=expected.levs, trace, "residuals")$y trace2(trace, "generated the residuals using plotmo_predict() and plotmo_y()\n") } scale <- get.resid.scale(object, resids, standardize, delever, trace, leverage.msg) trace2(trace, "----plotmo_rinfo: done\n") if(!is.null(labels.id)) # user specified labels.id? labs <- repl(paste(labels.id), length(resids)) # recycle if necessary list(resids = resids, # numeric vector, standardize and delever not applied labs = labs, # resids names, may be NULL fitted = fitted, # predicted values for newdata=NULL and given type scale = scale$scale, # vector of 1s unless standardize or delever set name = scale$name) # "Residual" or "Delevered Residual" etc. } # return NULL if call to residuals failed plotmo_resids <- function(object, type, residtype, nresponse, trace, ...) { stopifnot.string(type) stopifnot.string(residtype) if(inherits(object, "train")) { # Caret train model. Force use of predict to calculate residuals # instead of residuals(), for consistency with plotmo. if(trace >= 2) printf("inherits(object, \"train\"): plotmo_resids returns NULL\n") return(NULL) } resids <- try(call.dots(stats::residuals, DROP="*", KEEP="PREFIX", # following prevents reprint of residuals msg if fail TRACE=if(trace == 0) -1 else trace, force.object=object, force.type=residtype, ...), silent=trace <= 1) # is.null check is for residuals(glmnet) which silently returns NULL if(is.try.err(resids) || is.null(resids)) return(NULL) if(trace >= 2) print_summary(resids, "residuals is ", details=if(trace>=2) 2 else -1) list(resids = process.y(resids, object, type, nresponse, expected.len=NULL, expected.levs=NULL, trace, "residuals")$y, labs=if(!is.null(names(resids))) names(resids) else rownames(resids)) } get.resid.scale <- function(object, resids, standardize, delever, trace, leverage.msg) { scale <- repl(1, length(resids)) name <- "Residual" standardize <- check.boolean(standardize) if(standardize) { scale <- plotmo_standardizescale(object) name <- "Standardized Residual" } delever <- check.boolean(delever) if(delever) { if(standardize) # don't allow double denormalization stop0("the standardize and delever arguments cannot both be set") hatvalues <- hatvalues1(object, "'delever'") hat1 <- which(hatvalues == 1) if(trace >= 0 && length(hat1) > 0) warnf("response[%s] has a leverage of one and will be %s", paste.c(hat1), leverage.msg) scale <- 1 / sqrt(1 - hatvalues) name <- "Delevered Residual" } # leverages of 1 cause an inf scale, change to NA for easier handling later scale[is.infinite(scale)] <- NA check.vec(scale, "scale", length(resids), na.ok=TRUE) check(scale, "scale", "non-positive value", function(x) { x <= 0 }, na.ok=TRUE) list(scale = scale, name = name) } # scale for standardization, inf if leverage is 1 plotmo_standardizescale <- function(object) { if(inherits(object, "earth")) { if(is.null(object$varmod)) stop0("\"standardize\" is not allowed because\n", "the model was not built with varmod.method") se <- predict(object, type="earth", interval="se") } else if(inherits(object, "rlm")) se <- object$s else if(inherits(object, "glm")) se <- sqrt(summary(object)$dispersion) else if(inherits(object, "lm")) se <- sqrt(deviance(object) / df.residual(object)) else stop0("'standardize' is not yet supported for this object") stopifnot(is.numeric(se)) stopifnot(all(!is.na(se)), all(se > 0)) 1 / (se * sqrt(1 - hatvalues1(object, "'standardize'"))) } hatvalues1 <- function(object, argname) # try hatvalues, specific err msg if fails { hatvalues <- try(hatvalues(object)) if(is.try.err(hatvalues)) stop0(argname, " is not supported for this object ", "(the call to hatvalues failed)") hatvalues } plotmo/R/printcall.R0000644000176200001440000001323714663771205014121 0ustar liggesusers# printcall.R: functions for printing call information # If call is specified, print it (where call is from match.call or similar). # Else use the call stack to determine the call. The n arg tells us how # far to go back in the call stack. # # Examples: printcall() describe the call to the current function # printcall(n=2) describe the call to the caller of the current function # printcall(call) describe call where call is from match.call or similar printcall <- function(prefix="", call=NULL, all=FALSE, n=1) { # check prefix and n here, other args checked in call.as.char stopifnot.string(prefix, allow.empty=TRUE) stopifnot(is.numeric(n)) call <- call.as.char(call, all, n+1) printf.wrap("%s%s\n", prefix, call) } # returns args and concise description of their values, dots are included # all=TRUE to include all formal args (not always avail e.g. for primitives) # # TODO Does not expand the dots (just prints "..."), need fixed version of match.call # to expand the dots see e.g. higher.call.to.deprefix (but that would only work # here if dots for caller at n where the same as the dots to printcall). call.as.char <- function(call=NULL, all=FALSE, n=1) { stopifnot(is.numeric(all) || is.logical(all), length(all) == 1) stopifnot(is.numeric(n), length(n) == 1, n > 0) if(is.null(call)) call <- match.call2(all=all, n=n+1) # +1 to skip call to call.as.char else if(all) # we have the call but not the func itself, so can't get formals stop("all=TRUE is not allowed when the call argument is used") fname <- fname.from.call(call) if(all) { formals <- formals(attr(call, "sys.function")) call[[1]] <- NULL # delete func name from call, leave args formals[["..."]] <- NULL # delete ... in formal args if any call <- merge.list(formals, call) } else call[[1]] <- NULL # delete func name from call, leave args ret <- paste(fname, "(", list.as.char(call, maxlen=50), ")", sep="") attr(ret, "fname") <- fname # needed for alignment with nchar in printcall ret } # Similar to match.call but with args "all" and "n". # Also, this always returns a call, even if it is merely "unknown()". # So you can safely call it with any n (although n must be a positive int). match.call2 <- function(all=FALSE, n=1) { stopifnot(is.numeric(all) || is.logical(all), length(all) == 1) stopifnot(is.numeric(n), length(n) == 1, n > 0) # get sys.function and sys.call for the given n, needed for match.call sys.function <- try(sys.function(-n), silent=TRUE) if(is.try.err(sys.function) || is.null(sys.function)) # typically "not that many frames" return(call("unknown")) sys.call <- try(sys.call(-n), silent=TRUE) if(is.try.err(sys.call) || is.null(sys.call)) return(call("unknown")) # TODO following can cause incorrect "... used in a situation where it does not exist" # R version 3.1.4 will fix that issue in match.call (I hope) # envir <- parent.frame(n+1) # use when new version of match.call is ready call <- try(match.call(definition=sys.function, call=sys.call, expand.dots=TRUE), silent=TRUE) if(is.try.err(call)) { # match.call failed, fallback to a weaker description of call # no expansion of dots and no arg values :( call <- sys.call } attr(call, "sys.function") <- sys.function call } callers.name <- function(n=1) { stopifnot(is.numeric(n), length(n) == 1, floor(n) == n, n >= 0) call <- try(sys.call(-(n+1)), silent=TRUE) fname.from.call(call) # will also check if try error } fname.from.call <- function(call) # call was obtained using sys.call() or similar { if(is.try.err(call)) return("unknown") # most likely n was misspecified (too big) if(is.null(call)) # e.g. NULL->source->withVisible->eval->eval->print->test->callers.name return("NULL") caller <- as.list(call)[[1]] if(is.name(caller)) # e.g. foo3(x=1) caller <- as.character(caller) else { # class(caller) is "call" e.g. plotmo::localfunc(x=1) stopifnot(is.call(call)) caller <- format(caller) } if(grepl("function (", substr(caller[1], 1, 10), fixed=TRUE)) paste0("function(", paste.trunc(strip.space.collapse(substring(caller, 11))), ")") else paste.trunc(strip.space.collapse(caller)) } # if EVAL is FALSE this will print something like xlim=..1, ylim=..2 # TODO add n arg when match.call is fixed (R version 3.2.1) # TODO also then make this callable as printdots() instead of printdots(...) printdots <- function(..., EVAL=TRUE, PREFIX=sprint("%s dots: ", callers.name)) { sys.call <- as.list(sys.call()) ensure.dots.present(sys.call) callers.name <- callers.name() printf.wrap("%s%s\n", PREFIX, dots.as.char(..., EVAL=EVAL)) } dots.as.char <- function(..., EVAL=TRUE) { sys.call <- as.list(sys.call()) ensure.dots.present(sys.call) dots <- match.call(expand.dots=FALSE)$... if(is.null(dots)) return("no dots") if(EVAL) { stopifnot(is.numeric(EVAL) || is.logical(EVAL), length(EVAL) == 1) dots <- eval.dotlist(dots) } list.as.char(dots) } # issue error message if ... wasn't used in the call to dots.as.char ensure.dots.present <- function(sys.call) { dots.present <- FALSE for(i in seq_len(length(sys.call))) if(sys.call[i] == "...") dots.present <- TRUE if(!dots.present) stop0("dots.as.char should be invoked with dots, for example dots.as.char(...)") } plotmo/R/plotqq.R0000644000176200001440000001317414663771205013451 0ustar liggesusers# plotqq.R plotmo_qq <- function(rinfo, info, nfigs, grid.col, smooth.col, id.n, iresids, npoints, force.auto.resids.ylim, ...) { old.pty <- par("pty") par(pty="s") # square on.exit(par(pty=old.pty)) # we figure out the shape of the qq line with all resids but # plot only npoints points (selecting them with iresids) resids <- rinfo$scale * rinfo$resids # qqnorm sets NAs in trans.resids (leverage==1) to NA in # qq$x and qq$y, and thus NAs don't get plotted (R PR#3750) main <- dota("main", DEF=sprint("%s QQ", rinfo$name), ...) qq <- qqnorm(resids, main=main, plot.it=FALSE) id.indices <- get.id.indices(resids, id.n) xlim <- NULL ylim <- NULL if(nfigs == 1) # user can set xlim only if this is the only figure xlim <- dota("xlim", DEF=xlim, ...) if(!force.auto.resids.ylim) ylim <- dota("ylim", DEF=ylim, ...) xlim <- dota("qq.xlim", DEF=xlim, ...) ylim <- dota("qq.ylim", DEF=ylim, ...) if(!is.specified(xlim) && !is.null(id.indices)) { # extra space for point labs? min <- min(qq$x, na.rm=TRUE) max <- max(qq$x, na.rm=TRUE) xlim <- c(min - .1 * (max - min), max + .1 * (max - min)) } if(!is.specified(ylim)) { min <- min(qq$y, na.rm=TRUE) max <- max(qq$y, na.rm=TRUE) ylim <- c(min, max) if(!is.null(id.indices)) # extra space for point labs? ylim <- c(min - .05 * (max - min), max + .05 * (max - min)) if(info) # extra space for density plot? ylim[1] <- ylim[1] - .1 * (max - min) } xlim <- fix.lim(xlim) ylim <- fix.lim(ylim) # allow col.response as an argname for compat with old plotmo pt.col <- dota("col.response col.resp", DEF=1, ...) pt.col <- dota("pt.col col.points col.point col.residuals col.resid col", EX=c(0,1,1,1,1,1), DEF=pt.col, NEW=1, ...) pt.col <- dota("qq.col col.residuals col.resid col", EX=c(0,1,1,1), DEF=pt.col, NEW=1, ...) # recycle pt.col <- repl(pt.col, length(resids)) pt.cex <- dota("response.cex cex.response", DEF=1, ...) pt.cex <- dota("pt.cex cex.points cex.point cex", EX=c(0,1,1,1), DEF=pt.cex, NEW=1, ...) pt.cex <- dota("qq.cex cex.qq cex.residuals", EX=c(0,1,1), DEF=pt.cex, NEW=1, ...) pt.cex <- pt.cex * pt.cex(length(resids), npoints) pt.cex <- repl(pt.cex, length(resids)) pt.pch <- dota("response.pch pch.response", DEF=20, ...) pt.pch <- dota( "qq.pch pt.pch pch.points pch.point pch.residuals pch", EX=c(1,0,0,1,1,1), DEF=pt.pch, NEW=1, ...) pt.pch <- repl(pt.pch, length(resids)) ylab <- rinfo$name ylab <- sprint("%s Quantiles", ylab) drop.line.col <- function(..., qqline.col=NA, qqline.lwd=NA, qqline.lty=NA) { call.plot(graphics::plot, PREFIX="qq.", force.x = qq$x[iresids], force.y = qq$y[iresids], force.col = pt.col[iresids], force.cex = pt.cex[iresids], force.pch = pt.pch[iresids], force.main = main, force.xlab = "Normal Quantiles", force.ylab = ylab, force.xlim = xlim, force.ylim = ylim, ...) } drop.line.col(...) if(is.specified(grid.col)) grid(col=grid.col, lty=1) qqline.col <- dota("qqline.col", DEF=1, ...) qqline.lwd <- dota("qqline.lwd", DEF=1, ...) qqline.lty <- dota("qqline.lty", DEF=3, ...) if(is.specified(qqline.col) && is.specified(qqline.lwd) && is.specified(qqline.lty)) call.plot(qqline, force.y=resids, force.col=qqline.col, force.lwd=qqline.lwd, force.lty=qqline.lty, ...) if(info) { # draw actual and theoretical density along the bottom usr <- par("usr") # xmin, xmax, ymin, ymax scale <- .1 * (usr[4] - usr[3]) / (max(qq$y) - min(qq$y)) draw.density.along.the.bottom(qq$x, den.col=smooth.col, scale=scale, ...) draw.density.along.the.bottom( resids / sd(resids, na.rm=TRUE), # TODO correct? scale=scale, ...) legend("bottomright", inset=c(0,.06), legend=c("actual", "normal"), cex=.8, lty=1, col=c("gray57", smooth.col), box.col="white", bg="white", x.intersp=.2, seg.len=1.5) } if(is.specified(grid.col) || is.specified(qqline.col) || info) { # replot box and points because they may have been obscured box() drop.line.col <- function(..., qqline.col=NA, qqline.lwd=NA, qqline.lty=NA) { call.plot(graphics::points, PREFIX="qq.", force.x = qq$x[iresids], force.y = qq$y[iresids], force.col = pt.col[iresids], force.cex = pt.cex[iresids], force.pch = pt.pch[iresids], ...) } drop.line.col() } if(!is.null(id.indices)) plotrix::thigmophobe.labels( x = qq$x[id.indices], y=qq$y[id.indices], labels = rinfo$labs[id.indices], offset = .33, xpd=NA, font = dota("label.font", DEF=1, ...)[1], cex = .8 * dota("label.cex", DEF=1, ...)[1], col = dota("label.col", DEF=if(is.specified(smooth.col)) smooth.col else 2, ...)[1]) } plotmo/R/plotcum.R0000644000176200001440000001153214663771205013610 0ustar liggesusers# plotcum.R plotmo_cum <- function(rinfo, info, nfigs=1, add=FALSE, cum.col1, grid.col, jitter=0, cum.grid="percentages", ...) { trans.resids <- abs(rinfo$scale * rinfo$resids) # TODO what happens here if NA in trans.resids (leverage==1) ecdf <- ecdf(trans.resids[,1]) xlab <- rinfo$name xlab <- sprint("abs(%ss)", xlab) cum.grid <- match.choices(cum.grid, c("none", "grid", "percentages")) annotation.cex <- .7 * dota("cum.cex", DEF=1, ...) if(!add && info && cum.grid == "percentages") { # ensure right margin big enough for right hand labels old.mar <- par("mar") if(old.mar[4] < 3.5) { on.exit(par(mar=old.mar)) par(mar=c(old.mar[1:3], annotation.cex * 5)) } } if(is.na(cum.col1)) cum.col1 <- dota("cum.col", DEF=1, ...) cum.col1 <- cum.col1[1] # no recycling # user can set xlim and ylim if this is the only figure xlim <- dota("xlim", DEF=NULL, ...) if(nfigs > 1 || !is.specified(xlim)) xlim <- range(abs(rinfo$scale * rinfo$resids), na.rm=TRUE) xlim <- fix.lim(xlim) ylim <- dota("ylim", DEF=NULL, ...) if(nfigs > 1 || !is.specified(ylim)) ylim <- c(ylim=if(info) -.1 else 0, ymax=if(cum.grid == "percentages") 1 + annotation.cex * .06 else 1) ylim <- fix.lim(ylim) call.plot(stats::plot.stepfun, PREFIX="cum.", drop.cum.grid=1, force.x = ecdf, force.add = add, force.main = dota("main", DEF="Cumulative Distribution", ...), force.xlim = xlim, force.ylim = ylim, force.xlab = xlab, force.ylab = "Proportion", force.col.points = NA, # finer resol graph (points are big regardless of pch) force.col = cum.col1, force.col.hor = cum.col1, force.col.vert = cum.col1, ...) if(!add) { if(info) draw.density.along.the.bottom(abs(trans.resids), ...) if(cum.grid %in% c("grid", "percentages")) { linecol <- if(is.specified(grid.col)) grid.col else "lightgray" # add annotated grid lines, unattractive but useful for(h in c(0,.25,.5,.75,.90,.95,1)) # horizontal lines abline(h=h, lty=1, col=linecol) probs <- c(0, .25, .50, .75, .9, .95, 1) q <- quantile(trans.resids, probs=probs, names=FALSE) for(v in q) # vertical lines at 0,25,50,75,90,95,100% quantiles abline(v=v, lty=1, col=linecol) box() # abline overwrite the box, so restore it if(cum.grid == "percentages") { draw.percents.on.top(probs, q, annotation.cex) if(info) draw.quantiles.on.right.side(probs, q, annotation.cex) } # replot data over grid call.plot(stats::plot.stepfun, PREFIX="cum.", drop.cum.grid=1, force.x = ecdf, force.add = TRUE, force.xlim = xlim, force.col.points = NA, force.col = cum.col1, force.col.hor = cum.col1, force.col.vert = cum.col1, ...) } } } # Adding percents and quantiles on the wrong axes is considered a no no, # but here we are more-or-less forced into it because the percentile text # can be too long to display on the "correct" axis. draw.percents.on.top <- function(probs, q, annotation.cex) { is.space.available <- function(i) # is horizontal space available { q[i] - q[i-1] > 1.2 * strwidth && q[i+1] - q[i] > 1.2 * strwidth } draw.percent <- function(i, label) { # xpd=NA to allow text out of plot region (usually not needed) x <- q[i] if(i == 1) x <- x + .05 * strwidth # so 0% doesn't overwrite box else if(i == 7) x <- x - .3 * strwidth # so 100% doesn't overwrite box text.on.white(x=x, y=1.05, label, annotation.cex, xmar=0, xpd=NA) } #--- draw.percents starts here --- strwidth <- strwidth("25%", cex=annotation.cex) draw.percent(1, "0%") if(is.space.available(2)) draw.percent(2, "25%") draw.percent(3, "50%") if(is.space.available(4)) draw.percent(4, "75%") draw.percent(5, "90%") if(is.space.available(6)) draw.percent(6, "95%") draw.percent(7, "100%") } draw.quantiles.on.right.side <- function(probs, q, annotation.cex) { y <- spread.labs(x=probs, mindiff=1.2 * annotation.cex * strheight("A"), min=-.1) q[q < max(q) / 1e4] <- 0 # prevent labels like 2.22e-16 text(1.01 * par("usr")[2], y, sprint("%.3g", q), xpd=TRUE, cex=annotation.cex, adj=0) } plotmo/R/quantreg.R0000644000176200001440000000572615126334453013756 0ustar liggesusers# quantreg.R: plotmo method functions for the quantreg package # # Currently we support only rq (which for some reason returns objects of # class "rqs", so we need to support both "rq" and"rqs") plotmo.predict.rq <- function(object, newdata, type, ..., TRACE) { if(type != "response") warning0("plotmo.predict.rq: ignored type=\"", type, "\"") if(is.null(object$tau)) stop0("rq object has no 'tau' field") # The following invokes predict.rq or predict.rqs. It may return multiple # responses, which are handled later in plotmo.convert.na.nresponse.rq. yhat <- plotmo.predict.default(object, newdata, type="none", ..., TRACE=TRACE) } plotmo.predict.rqs <- function(object, newdata, type, ..., TRACE) { plotmo.predict.rq(object, newdata, type, ..., TRACE=TRACE) } # quantreg::predict.rq returns a column for each value in the tau arg # in the call to rq. Select the column corresponding to tau=.5 plotmo.convert.na.nresponse.rq <- function(object, nresponse, yhat, type, ...) { if(NCOL(yhat) == 1) nresponse <- 1 else { nresponse <- which(abs(object$tau - .5) < 1e-8) if(length(nresponse) == 0) { # no tau=.5? nresponse <- length(object$tau) %/% 2 warning0( "rq object has multiple taus, none are tau=.5, so plotting tau=", object$tau[nresponse]) } nresponse <- nresponse[1] # needed if tau=.5 specified twice in call to rq } nresponse } plotmo.convert.na.nresponse.rqs <- function(object, nresponse, yhat, type, ...) { plotmo.convert.na.nresponse.rq(object, nresponse, yhat, type) } plotmo.pint.rq <- function(object, newdata, type, level, ...) # quantreg package { if(length(object$tau) == 1) stop0("object was built with single tau (tau=", object$tau, ")\n", "Plotmo needs multiple taus to plot confidence bands, ", "something like tau=c(.05,.5,.95)") q0 <- (1 - level) / 2 # .95 becomes .025 q1 <- 1 - q0 # .975 tau <- object$tau i0 <- which(abs(tau - q0) < 1e-8) # 1e-8 allows limited precision i1 <- which(abs(tau - q1) < 1e-8) if(length(i0) == 0 || length(i1) == 0) { i0 <- 1 i1 <- length(tau) warning0( "You specified level=", level, " but rq was called with tau=", if(length(tau) == 1) tau else sprint("c(%s)", paste(tau, collapse=", ")), "\n Try plotmo level=", 1 - 2 * tau[1], " to make this warning go away", "\n Continuing anyway, with confidence bands for tau=", tau[i0], " and ", tau[i1]) } predict <- predict(object, newdata=newdata, type="none") data.frame(lwr = predict[,i0], upr = predict[,i1]) } plotmo.pint.rqs <- function(object, newdata, type, level, ...) # quantreg package { plotmo.pint.rq(object, newdata, type, level) } plotmo/NAMESPACE0000644000176200001440000001127215126337176013021 0ustar liggesusersimportFrom(plotrix, thigmophobe.labels) importFrom(Formula, Formula) export(plotmo) export(plotres) export(plot_gbm) export(plot_glmnet) # by convention, the prefix "plotmo_" is for # standard functions and "plotmo." is for methods # (but check.index is a historical name) export(check.index) export(plotmo.convert.na.nresponse) export(plotmo.pairs) export(plotmo.pint) export(plotmo.predict) export(plotmo.prolog) export(plotmo.residtype) export(plotmo.singles) export(plotmo.type) export(plotmo.x) export(plotmo.y) export(plotmo.y.default) export(plotmo_cum) export(plotmo_fitted) export(plotmo_nresponse) export(plotmo_predict) export(plotmo_prolog) export(plotmo_resplevs) export(plotmo_response) export(plotmo_rinfo) export(plotmo_rsq) export(plotmo_standardizescale) export(plotmo_type) export(plotmo_y) S3method(plotmo.convert.na.nresponse, default) S3method(plotmo.convert.na.nresponse, rq) S3method(plotmo.convert.na.nresponse, rqs) S3method(plotmo.pairs, C5.0) S3method(plotmo.pairs, default) S3method(plotmo.pairs, gbm) S3method(plotmo.pairs, GBMFit) S3method(plotmo.pairs, gpe) S3method(plotmo.pairs, parties) S3method(plotmo.pairs, party_plotmo) S3method(plotmo.pairs, pre) S3method(plotmo.pairs, randomForest) S3method(plotmo.pairs, rpart) S3method(plotmo.pairs, train) S3method(plotmo.pairs, WrappedModel) S3method(plotmo.pint, default) S3method(plotmo.pint, earth) S3method(plotmo.pint, Gam) S3method(plotmo.pint, gam) S3method(plotmo.pint, glm) S3method(plotmo.pint, lm) S3method(plotmo.pint, quantregForest) S3method(plotmo.pint, rq) S3method(plotmo.pint, rqs) S3method(plotmo.predict, bagging) S3method(plotmo.predict, biglm) S3method(plotmo.predict, boosting) S3method(plotmo.predict, bruto) S3method(plotmo.predict, clm) S3method(plotmo.predict, cosso) S3method(plotmo.predict, cv.glmnet) S3method(plotmo.predict, default) S3method(plotmo.predict, defaultm) S3method(plotmo.predict, gbm) S3method(plotmo.predict, GBMFit) S3method(plotmo.predict, glmnet) S3method(plotmo.predict, glmnet.formula) S3method(plotmo.predict, lars) S3method(plotmo.predict, lda) S3method(plotmo.predict, list) S3method(plotmo.predict, mvr) S3method(plotmo.predict, nn) S3method(plotmo.predict, party_plotmo) S3method(plotmo.predict, qda) S3method(plotmo.predict, quantregForest) S3method(plotmo.predict, rpart) S3method(plotmo.predict, rq) S3method(plotmo.predict, rqs) S3method(plotmo.predict, svm) S3method(plotmo.predict, WrappedModel) S3method(plotmo.prolog, C5.0) S3method(plotmo.prolog, cv.glmnet) S3method(plotmo.prolog, default) S3method(plotmo.prolog, gbm) S3method(plotmo.prolog, GBMFit) S3method(plotmo.prolog, glmnet) S3method(plotmo.prolog, model_fit) S3method(plotmo.prolog, parties) S3method(plotmo.prolog, party) S3method(plotmo.prolog, pre) S3method(plotmo.prolog, train) S3method(plotmo.prolog, WrappedModel) S3method(plotmo.prolog, xgb.Booster) S3method(plotmo.residtype, default) S3method(plotmo.residtype, rpart) S3method(plotmo.residtype, train) S3method(plotmo.singles, C5.0) S3method(plotmo.singles, cv.glmnet) S3method(plotmo.singles, default) S3method(plotmo.singles, gbm) S3method(plotmo.singles, GBMFit) S3method(plotmo.singles, glmnet) S3method(plotmo.singles, parties) S3method(plotmo.singles, party_plotmo) S3method(plotmo.singles, pre) S3method(plotmo.singles, randomForest) S3method(plotmo.singles, rpart) S3method(plotmo.singles, train) S3method(plotmo.singles, WrappedModel) S3method(plotmo.type, bruto) S3method(plotmo.type, clm) S3method(plotmo.type, cosso) S3method(plotmo.type, default) S3method(plotmo.type, fda) S3method(plotmo.type, knn3) S3method(plotmo.type, lars) S3method(plotmo.type, lda) S3method(plotmo.type, nnet) S3method(plotmo.type, qda) S3method(plotmo.type, rpart) S3method(plotmo.type, train) S3method(plotmo.type, tree) S3method(plotmo.type, varmod) S3method(plotmo.x, default) S3method(plotmo.x, gbm) S3method(plotmo.x, GBMFit) S3method(plotmo.x, mars) S3method(plotmo.x, varmod) S3method(plotmo.y, default) S3method(plotmo.y, gbm) S3method(plotmo.y, GBMFit) S3method(plotmo.y, lognet) S3method(plotmo.y, mrelnet) S3method(plotmo.y, multnet) S3method(plotmo.y, varmod) importFrom("grDevices", "as.graphicsAnnot", "col2rgb", "gray", "xy.coords") importFrom("graphics", "abline", "axis", "box", "grid", "image", "legend", "lines", "mtext", "par", "plot", "points", "polygon", "rect", "segments", "strheight", "strwidth", "text", "xinch", "yinch") importFrom("stats", "approx", "coef", "cor.test", "density", "deviance", "df.residual", "family", "formula", "getCall", "hatvalues", "loess", "lowess", "median", "model.matrix", "na.omit", "na.pass", "pnorm", "predict", "qqline", "qqnorm", "quantile", "qt", "rnorm", "sd", "update", "weighted.mean") importFrom("utils", "assignInMyNamespace", "head", "str") plotmo/NEWS.md0000644000176200001440000004220015126334401012657 0ustar liggesusersChanges to the plotmo package ----------------------------- ## 3.7.0 Dec 30, 2025 Fixed incorrect calculation of interval bands for glm models with the plotmo "level" argument Thanks to Marcia Barbosa for help on this. Updated some web addresses in the man pages. ## 3.6.4 Aug 29, 2024 Updates for R version 4.4.1 Fixed an issue with gbm3 version 3.0. Thanks to Marcia Barbosa for help on this. ## 3.6.3 Feb 16, 2024 Updates for R version 4.3.2. For example, had to change "sort.unique" to "sort_unique". Removed dependency on possibly orphaned package TeachingDemos. ## 3.6.2 May 21, 2022 Minor updates for R version 4.2.0. ## 3.6.1 Jun 2, 2021 Minor updates for R version 4.1.0. These updates quieten some warnings from sprintf when plotmo's trace flag is set. Also updated some of the test scripts. ## 3.6.0 Sep 12, 2020 We now have better support for models with unusual variable names. For example, variable names with spaces in them, and formula terms like "as.numeric(x1)". This required a fairly large change to the handling of formulas. We now support models like "earth(formula, data=func(data))", where the data argument is a function call. Minor code change because base::range no longer seems to work with Date objects. Better support for residuals plots for earth-glm models. Support for the "ordinal" package ("clm" models). Basic support for "parsnip" models. Minor documentation updates. Updated the libraries shared with the earth and plotmo packages. Extended the test scripts and updated them for R version 4.0.2. ## 3.5.7 Apr 15, 2020 Added new dot arguments "prednames.abbreviate" and "prednames.minlength". o Use prednames.abbreviate=FALSE for full predictor names in graph axes. (The default is prednames.abbreviate=TRUE.) o The "prednames.minlength" argument is passed on internally to base::abbreviate(). Reinstated the tests for the emma package (were removed before because emma gave the message "package 'clusterSim' could not be loaded"). ## 3.5.6 Oct 26, 2019 The family of a model can now be a string (as well as a "family" object). This allows better support of glmnet objects. ## 3.5.5 June 27, 2019 S4 models wrapped in caret models are now supported e.g. train method="svmRadial" (which creates a kernlab ksvm model). Modifications for glmnet models: The glmnet residuals plot now includes the predict arg "s" in the plot title. The default ylim for glmnet probability models is now c(0,1). For glmnet cv models: we now pass the predict.s argument to plotmo and plotres, and plotmo now by default plots a maximum of 25 coefs (the largest coefs). Updated test scripts for the new random number generator that came with R version 3.6.0. ## 3.5.4 Apr 6, 2019 Added a reminder to use keepxy=2 for earth if you want to use plot.earth or plotmo on an earth cross-validation submodel. Plotmo now requires R version at least 3.4.0. Minor updates to libraries shared with earth and rpart.plot. ## 3.5.3 March 16, 2019 Extended plotmo to support earth version 5.0.0, which allows multiple responses using the Formula package. Plotmo now also has partial support for other models also created using Formula (as well as those that use formula). Added "Depends: Formula" to the DESCRIPTION. Binomial pair responses are now more uniformly converted to a "fraction true" before plotting. If nresponse is not specified for multiple response models, plotmo now defaults to nresponse=1 with a warning (whereas previous versions of plotmo issued an error message). Updates to the libraries shared with earth. ## 3.5.2 Jan 2, 2019 Improved support for models specified with a formula containing an offset term. The grid.levels argument can now be used with pmethod="partdep". ## 3.5.1 Nov 23, 2018 Can now plot multinomial models from the "pre" package. Tweaked linmod.R to better handle models with all-zero residuals, and updated the documentation. Minor changes to internal function calls to prevent warnings when options(warnPartialMatchArgs=TRUE). Added "LazyData: yes" to the DESCRIPTION file. ## 3.5.0 Aug 19, 2018 The default pegged value of background variables has changed in this version, but only for logical and factor variables. For these variables the value occurring most often in the training data is used as the background value. (In previous plotmo versions, the first level of factors was used. But the majority level seems more consistent with the median used for numerics. Also, in previous versions logicals and integers were sometimes incorrectly converted to numeric.) Note this change doesn't affect pmethod="partdep" and "apartdep", which continue to behave as in previous versions. We now support base::Date variables. Plotmo now has better support for caret rpart models with factor predictors. ## 3.4.2 July 3, 2018 Added support for the partykit and evtree packages. Thanks to Achim Zeilis for his help. Plotmo is now more intelligent about maximizing the number of degree2 plots in the 4x4 grid. Minor updates to linmod.R and linmod.methods.R. ## 3.4.1 June 8, 2018 If plotting a probability and pt.col is specified, we now scale the response range to 0...1 so the points are displayed on the probability scale. Expanded is.predict.prob() function for more models. Fixed a minor bug in pmethod="partdep" which sometimes incorrectly caused an error message under certain conditions when there is only one predictor (added a missing drop=FALSE). Enhanced support for the mlr package (but we can't support mlr objects properly until the call is saved with WrappedModels). Enhanced support for the caret package (we now use get.singles and get.pairs on the submodel). ## 3.4.0 May 31, 2018 If predict.rpart is predicting a probability, plotmo now recognizes that and sets ylim=c(0,1) appropriately. Plotting of intercept-only models was slightly inconsistent. Fixed that. We now attempt to better set the default nticks in persp plots. We now position the labels in persp plots slightly better along the axes (they were sometimes too far away from the front corner). When degree2 is exactly two strings, we now assign the x1 and x2 axes in the order specified in degree2 (although persp plots still get rotated for optimum visibility of the surface, and this rotation can reverse the order of the axes). Added basic support for the mlr package (see test.mlr.R). Documentation updates, especially to modguide.pdf and linmod.R. ## 3.3.7 May 15, 2018 Added a README file. If degree2 is exactly two strings, plotmo now prints just that degree2 plot e.g. degree2=c("wind", "humidity"). We plot the variable pair even that pair isn't used in the model (because we implicitly set all2=TRUE if degree2 is two strings). If degree1 is of type character, we now plot the variable even if it isn't used in the model (because we implicitly set all1=TRUE if degree1 is is of type character). For the qq plot in plotres, changed the diagonal qq line to dotted black. This gives more compatibility with plot.lm, and also means that the legend for the density subplot along the bottom of the qq plot (with info=TRUE) isn't mistakenly assumed to apply to the main plot. For the old behavior use qqline.col="gray", qqline.lty=1. Added basic support for the "pre" package (using the importance function in that package). Fixed minor bug: the plotmo grid wasn't printed if ylim was specified by the user. The vignettes are now compressed with gs and qpdf as in tools::compactPDF, (but that happens outside the standard CRAN build system). It does mean that the tar.gz file for plotmo is a little smaller (now 1155 kByte). ## 3.3.6 Mar 20, 2018 Minor documentation updates. ## 3.3.5 Feb 26, 2018 Added support for package gam version 1.15 and higher (the S3 class of gam objects changed from "gam" to "Gam" to prevent clashes with the mgcv package). Plotmo now works with both the old and new versions of gam. ## 3.3.4 July 26, 2017 Added support for glmnetUtils objects. ## 3.3.3 May 4, 2017 Error "glmnet.formula must be called with use.model.frame=TRUE" is now issued when necessary. Tweaked test scripts because cosso models fail with R version 3.4.0. ## 3.3.2 Dec 2, 2016 Support for the C50 package. Better handling of NA and 0 colors in plot_glmnet. Better messages to the user for models with too many variables to fit on a page. With all2=2, plotmo will now plot up to a maximum of all pairs of 20 variables (and as always, with all2=TRUE plotmo will plot a maximum of all pairs of 7 variables). ## 3.3.1 Nov 24, 2016 When choosing which variables to plot for randomForest models, variable importance is now calculated using a more correct measure, viz. one of IncMSE or IncNodePurity (regression models), or MeanDecreaseAccuracy or MeanDecreaseGini (classifications models). The second option is used if importance=TRUE was used when building the model. Use trace=1 when calling plotmo to see which measure of importance is used. The plot_gbm function now displays the gray vertical line at the correct position when n.trees is specified. Documentation touchups. ## 3.3.0 Nov 11, 2016 Added support for partial dependence plots (the pmethod argument). Extended the vignette with new chapters on partial dependence plots and classification models. Plotmo's nrug argument now supports quantiles. The title on persp plots is now better aligned to the degree plot titles. The margins for persp plots are now more optimal (they now give bigger plots when do.par=FALSE and there are also degree1 plots). Added support for e1071::predict.svm decision.values and probability arguments. Fixed error message when plot_gbm was used on multinomial models. Fixed warnings in plot_gbm when gbm.ntrees is very small (less than 10). ## 3.2.1 Oct 27, 2016 Added support for gbm package version 2.2. See gbm.backcompat.R. Extended linmod.R: support for no-intercept models, support for 'keep' argument, better handling of newdata in predict.linmod. Also extended the tests for linmod.R in inst/slowtests. ## 3.2.0 Sep 7, 2016 The functions plot_gbm and plot_glmnet are now exported and available for the user. These functions have been enhanced for this version. Improved support for gbm and glmnet and related models. The plotres function now works better with caret "train" models (but caret support is still a bit minimal). We now print "plotmo grid:" instead of just "grid:" for context when it's printed from within a body of code. Removed deprecated interface functions like get.plotmo.pairs. Updated dot library functions for eventual move to a dots package. Revamped the vignettes. ## 3.1.5 Aug 26, 2016 The pt.cex argument now works correctly in plotres QQ plots. Changed default colors in plot.glmnetx. The colors stay in the order they are passed to plot.glmnetx as we move down the rhs of the plot. Extended test suite to include adabag package. Fixed code in meta.R which assumed all.equal() always returned TRUE or FALSE. Merged the library source file lib.R with the earth and rpart.plot packages's lib.R. Updated and extended vignettes. ## 3.1.4 Jul 29, 2015 Added support for the adabag package. Added imports for standard grDevices, stats, and utils functions, as now required by CRAN check. Documentation updates. Thanks to Achim Zeileis for his feedback. ## 3.1.3 Jun 24, 2015 Added plotmo.prolog.cv.glmnet (to handle missing "call" in cv.glmnet objects). More work on the issue where vars on the rhs of formula are multidimensional. Documentation updates. ## 3.1.2 Jun 15, 2015 Added the new vignette "Guidelines for S3 Regression Models". Documentation touchups. ## 3.1.1 May 27, 2015 Removed references needed for old versions of earth. Fixed a gbm column naming issue. Other minor code and document updates. ## 3.1.0 May 6, 2015 Removed references to functions in old versions of earth. Simplified the way xlim and ylim are calculated internally. Simplified the way jitter is handled. If type="probability" or similar, and the response has two columns, nresponse now automatically defaults to column 2. Added support for biglm objects. The predict.biglm method (unnecessarily) requires that newdata has a response column, so plotmo adds a dummy response column before calling predict.biglm. We now find the data argument for formula models even if the argument is unnamed. ## 3.0.0 Apr 29, 2015 Added the plotres function. Reworked the internal functions that get the data from the model. Reparameterized the argument list of plotmo, but maintained backwards compatibility using the "dots" routines. ## 2.2.1 Jan 7, 2015 If pch.response has type character, we now plot the response points as text. Earth models with no degree1 terms but with degree2 terms were incorrectly labelled as intercept-only models. Fixed that. Changes to match changes to earth's predict.varmod interval argument. ## 2.2.0 Dec 10, 2014 Fixed incorrect printing of some messages when trace=-1. Expansions to check.index for earth. Documentation touchups. ## 2.1.0 Nov 30, 2014 Added a vignette "Notes on the plotmo package". Some more functions are now exported to allow earth::plotmor to easily get the model data Some documentation touchups as usual. ## 2.0.0 Nov 19, 2014 Plotting of prediction or confidence levels is now more comprehensive. We now allow both prediction and confidence intervals to be plotted for those predict methods that support it on new data (currently only lm). The "se" argument is now deprecated and superseded by the "limit" argument (you will get a warning). Plotmo will now plot the model even if it is an intercept-only model. Use int.only.ok=FALSE for the old behaviour (i.e., issue an error for intercept-only models). The "grid:" message in now printed for only multiple predictor models. Remember that you can always suppress this message in any case with trace=-1. The xlim argument is now supported. Typically only useful if only one degree1 plot. Plotmo now supports quantreg and quantregForest objects. Basic support for the AMORE package has been provided. Thanks to Bernard Nolan and David Lorenz for this. But this has been commented out in the source code to avoid having "suggests(AMORE)" in the plotmo DESCRIPTION file. To use functions, search for AMORE in the plotmo source code, and cut and paste the commented-out code into your environmemt. The default pch.response is now 20 (was 1). The default cex.response is now NULL (meaning automatic, was 1). Minor other changes to fix formatting of captions etc. ## 1.3-3 Feb 4, 2014 Clerical changes to satisfy recent CRAN check requirements. ## 1.3-2 Dec 1, 2011 You can now use trace=-1 to inhibit the "grid: " message. Removed a call to .Internal(persp) ## 1.3-1 Sep 16, 2011 Fixed an minor incorrect message introduced in the previous release. ## 1.3-0 Sep 15, 2011 You can now specify variables by name in degree1 and degree2. Suppressed annoying "Warning: surface extends beyond the box". We no longer issue an incorrect err msg if data frame has an "AsIs" field. ## 1.2-6 Removed an incorrect stopifnot.integer(y.column) in plotmo_y.wrapper ## 1.2-5 Jun 11, 2011 Fixed an incorrect stop when trace>0 and x had no column names. We no longer print the plot index in the plot title when all1 or all2 specified but also degree1 and degree2. Added get.plotmo.default.type.fda Touchups to the documentation. ## 1.2-4 Apr 27, 2011 Removed hooks for the earth package (which are no longer necessary with earth 2.6-2). The file plotmo.methods.R was deleted. Added the grid argument. ## 1.2-3 Apr 17, 2011 This package no longer needs the earth package. However the current earth (2.6-1) needs some hooks in this package to build. After earth 2.6-2 is on CRAN that will no longer be necessary, and the hooks will be removed from this package. We now have better error reporting for bad y's. We now have better jittering of response points with a binary response. ## 1.2-0 Apr 12, 2011 Added ndiscrete arg (variables with a small number of levels are now plotted as "blocks", like factors). Added smooth.col and related args (plotmo can add a loess line). Made tweaks necessary because earth now imports this package. Added dvalue and npoints args. Added center arg (preliminary implementation). Added basic support for lars, nnet, and knn3 models. Jittering now works better. We now jitter response points for factors and discrete variables by default. plotmo is now faster: We cache the plot data to avoid calling predict twice for each plot For discrete vars and factors we only call predict for their original values ngrid1 is much smaller (ok to do that because of ndiscrete arg) Better error reporting for illegal args. Reduced the number of default colors (just grays and lightblue now). Out-of-range values in image plots are now plotted in blue. Fixed an issue where the wrong environment could be used. Better error reporting for unsupported models. Fixed handling of factors with non contiguous levels Modified test scripts to conform to R 2.13.0's way of printing numbers Numerous other document and code touch ups. ## 1.0-1 Apr 01, 2011 plotmo was printing degree1 graphs for all used earth predictors, not just those appearing in degree1 terms. Fixed that. plotmo was not handling all1=TRUE correctly for earth models with factor predictors. Fixed that. ## 1.0-0 Mar 31, 2011 Initial release. Moved plotmo from earth 2.5-1 to here. plotmo/inst/0000755000176200001440000000000014334575431012552 5ustar liggesusersplotmo/inst/doc/0000755000176200001440000000000014334575431013317 5ustar liggesusersplotmo/inst/doc/plotmo-notes.pdf0000644000176200001440000315776715126340250016471 0ustar liggesusers%PDF-1.5 %¿÷¢þ 1 0 obj << /Type /ObjStm /Length 4875 /Filter /FlateDecode /N 89 /First 750 >> stream xœÅ\YSI¶~¿¿¢ÞÆ7¨Ü·‰ž‰c»½àf€îv÷„d©µ…DK¸ﯿßÉÌÒV*(öYKVæÉ³~'3 YðB‚»BF›Â·ÂA„ÂBsQøBxŠPH%ªÒ Ü(/„,d°¦ªP „.” ²¦PÖèBØBsŽ=…z¾0Ü¢éP)U!yaº”¢0Æ¢”…qN£³Â¼/uaêKSXEõma©é '-S8Æ%èõ ƒá… ¸V \iY(YxÃq_Þ¡3¥ ï‘Eà%Æjè=Wïl¡04ÎQKœHô¤9๦Ñ hVpC#"ÖYP«1@N݃…ÍbÐ,¨ 1V!C(41M¨Â¢eÃA'ÉÇ(ÇÁjœXôÉ lÜíhß¡e«‰'ÚAsв5ž‚‡WpSØ€K0V8A²AËNz¼…–Æ}P"œ%q¡eç!g M¸à!8´ì1 H' ¯{MÊèQ‡4É‚°'P8´)¼Už6pÜA˲,HMƒ°ò~ø¡`GÕ¼7èÍ{PqèþIÁŽ{Õ»Þ§j4+èùû›«Yñ<¢‹Ó‚ÿúW!Ö®>ÒŸøÞ f9ûëº*Øs´;š\àqìjÿf~9™?œWççœC˸ƒ-X¨£ã(}:·ç×z€sÐkû8pÃâhl<â¹C§Ï§Uo>œŒ{óªxvøÉaÐJ0âÝãþoœÿíï¹ú~ö®wV}(n‡óËâ4N§Õ9¿­þºL³â.Ž&ƒûš;žN7ý í½:~W¼ºœÌæ³þtx=‡¶—¿¨szóéª?¯‡‡ØÏ¤Ó°ixçÂÙp>ªLÙ¨k†ÄëcÒ›82ó¨>ÝwÄP“dqÀp­Ê V¹ŽKíÅv}¾×BY–ÚóÉÍxN~…½HL±ÈEˆEHJ¼ å‹—I¥`J±Hº›‹…Ê離!7W?å©%™ßá:?NÕ‚…Ë çÞ”ÈeýR¦ÍgbRm•[Nw?ÖºšÔw1æñ¼Ïgp«©6Ìd0ìL¾FS€# Ó‡•}¤§¨Z+þI5›ÜLûU2ž—h‡B@2¬é¤ZÍÑ;>|‰~«¯ól;Kj z³*¾Í^~xý¿Ï> SöbÜŸ †ã ²âØìËát6~Ù›Rì‰=VI¡ï‰3ì]oQED͜ǩ[Q÷žzûu8˜_’”mdu×ãÅâ\MñA¹Åµ‚ë£5áy»©vn=J–¢®ƒ¢ùøÄ!29N=x¸LŠQ.äb)žÒM¯ÉÓúXz¸Mé ,–åõÕðâ—œ.!*Ò”glŸ°çì{É~d¯Ù;vÄÞ³ŸØ1û7;a§ìŒýÊzìë³þd4ãïÕU XÅbcìœñû¥bçPJvÁ.œÞe5fCö™Ø³ñp\± ›àï5»&]Uçót6­ÀK'öçM5#W‹“ɼ|ÅzõEª¯Òé”ÍØ¬ú‚¾fïlÎæ—ÓªbóÛ »a_Ø-ûÊþbÿWM'𔤯Ċ=‰PÍ^Žz3@®¨µÉÅg‚‚1ìczúr8ª\Ž\të}ïªjØÌk„¡a|G ö g3XPTõ(gv:¯®~!@°j +fÄ>dñ^iXèï^ýzú½­Y(Œi¼?ž —7–¶ µÙIhتíh«.ÆD7“u8_?ôh¾É7Ú^ÞÛ|ÒÖï¶6ù–ÖC÷ÃÇY÷¶iAŠí©u5Vl“ÌyÍ6“e.­2ÙäϰÉÞ¬?·£A…S2‰ÙgØé§i¯ÿ¹šGÃÉçÉXÚ ¸úó¦7Šf¼Õ†ÿˆV<ªf³¥)o®>UÓÙðbÜɪ¯G73öçÂŒWÍvÔ›]¶nÓt‘pdÓEj±j»{"=5”º½i»rÓv7¬iÓv{_Wd³nÉt'Y2Ðô}† Ý4äjô¥šû½#ö qÜeˆv~ï]ŸâåO=@ˆ•¦ìÛ:~uôæÃ1¸q‚Ô¢›kÑM×’¡Ï.8@êíEŸÿ¦3¾(ïÿÑ.EXäžköç;h½®¡¹]¼QS”Jº³¬©ŒÎÓµµ„´ßféaͶãå¶ßÀ¦OSl&YÁ솰52ªk2’FL»ÝϸZ…l4™izƒ@šò<ïV¤;€8TRݮ՗®ìÚ¦d€b‹Š ÓÐR »"¬ôOÏ”¡Ù%ûµ`GÊH÷ã5êRI³a4ÆØ=S4‰õ…NMð RWºÇ•‰hß,Ê4¹•îGbqmD(1#ÖËÏé~bK*ë{D•tP›T?¸poö`¶d‡¥¼ŠÄövKñ3û™Äoì÷èñŽR®ªq,€VèwxGîñÇòi¯ìŒ\ ýË´äg™žèuˆýˆOÍö5ó³éÏ×͸szÒ†jj71™ªiöJ‘ˆçä‘ë ¼@þ&ÏØ°¿ýŽp\rÈUiæÅøf4¢º?‚*r`}zÃë’“aH]ÒÔ²p®´{ÁùoŽÞ|  pÒyæy çõΜ‡âÖG“óë 3ñ²çùÝœOkBÔÚçí&ç×xÓ•ó®+çß¼úyÿè§8=ÀWQmæå+þª‰j;sÜ¿þc···åÕpôiRN¦l0é³ëéuy=8ÿ{ zíàX4éVªÔ€'ÊÊ’¼ðøE^çJ¨è> P~¿¶ls"B!ê%8ļ½ju¡Ç‡BÕKAõ¢Î-óæsE»GWZ}ƒF“ù´šíêj¶«×¥Fn`¼*i/ð¶$ erÓQÄݵ¢€u⢵(5Wmú9Òn$í|Éáñ ‹¥¥u Êð퉃”†rü­Äi)JOÊeÁ9 MŒ&4”ÌtLª:Z®nÒæ X| m†‡’¦g •¶SAëiÍR~RÚ¶ðÍp@· ÕhýFÒ<9ÀŠâ²TÃÇÅ·×8 ·GÄIš¦Kïi[/ ?ÒÇÒ«oMÔ§ÞµÑoÆÍ‘r—ž#â‰Ó^t@£é¸°°;qÖ‘ÜÚB…ÃhyyW©hG9Í1Ð^j«øS†Š\álÞ›ÏJüí®¾ö/{㋪TXL'͘ €M>Í{Ã1"ìÞçñävT .ª½óéäj¯·7í89ŸÀÎwð›) ¹(­ÑöKòTŽö¥—ÖuE‡h²±m` yÏö~{óSÚõ³†ysÄYÁ¼ª!Ìfz÷€­sØæjòleýÎêõCûßæwÔå+to»ßÞæ¶q³>»¬ó~>ÚàÜØÏ·Ø‰²È6,»u? |=} ;)},输i÷ˆ@(£ Áó#µXÌ:k|DI2ë¼û”¸E÷V·ÅRžàkâ 2úòé;g€}„mC–†{€b³$N"AÀÿÄm ôèž>ri ôÒ–”÷ÚþR€W‰hå¥Uß’+drζѦ ¤XÒ¦MI ߉8 XRªV„ä b~Iœ‚Góˆ“àœnŽÂRè–ÄÈõ݈£î¼i3V¬…>Ê\4­v} â¶z©J¥[u.@çâ¾ÔD€'ÜÞw#Ž™Rmy :·4V)=m\ú^ÄÉ `¢5»'\!ެU©ï¦s”izP4Åài'¡+=íPD€°ž²~íž4…–MâîÞa†Ü¦ <ÀS—U@Aù`[›Ž¤-·Ìî¿¢^oäw.]ض°Íý²üAYŶ|¡k®±ÛOÑo{¾^«ÃiL;—«8¼Jx—pm® ¡N b\~Ý*}ËW"<=Žˆ}¬ƒÊŧŽË ñ2Þ U¶-È,Q%"HC¿ŽÞ¾?üí8~\vöº³‚¹- ÖøâKtM[-Y wËuoÂVØ •Ì´÷†JºVyÕG»Q[ù¦v8.×W;ìª>P.v’W7.ò'óõEÙòEÄžé±@tŒÝlè@ã#¿†º®E´.Ä­¬EÜ“M4\žx¨ËSœ#CÛ501W¸@¡ÿ5aàûä£&¿îšnÒ Š®¤ÏÂ[Ò šW¥¥L©•ö¾Tžþ Cè8áºñI íh¯/ ­¶ž"yØzaáþ)$çéŸ[lNZnïH#Î[D^„ª¾Þ²ç8pò¨­j§=Ç]çûÓÞ¸œî]O'´)x±fÒG×Óá'ö²7íÝöþÚ;>ÙßmåDç­%í^¢u€³sP™ðÍgc @Ìm³±ÚçY·¤ ɰ!Ñ<š¶Mc©?¾Š´éD›‡­Þšz›;§Ýh4 dE6By¢iìŽÈª³> stream GPL Ghostscript 10.00.0 2026-01-03T17:21:44-08:00 2026-01-03T17:21:44-08:00 LaTeX with hyperref Plotting model surfaces with plotmoStephen Milborrowplotmo endstream endobj 92 0 obj << /Type /ObjStm /Length 2910 /Filter /FlateDecode /N 89 /First 808 >> stream xœÕ[]w·}ï¯Àcrz ˜ÁWOšsd;jÜX©+5mÓœ<ÐÒZbC‘,IÕÉK{ï`w)J"•]’²Ú8öbw±Ø‹™Ù™;0“2*³²!ªì•ËIå Øã,ªÀ¸—Tr¤rFË)kŒ²6VY"œ\åÑÀÕÀÊào’ŽÆ+›}@#(g­\‰hDé“”£€û&+çŒj” ãX«\t <ﱤHþ±–Kg¯ˆ³\ Š¢‘§¢¢€Å&ÅÆÊ•Œfa1:[¹…±˜ä–sŠ9fÆAwŒ†ÇKW ÀÄ’ô‰ÊÆ»€É›<.+ïpÙbþž¦CVyÏ"§|€Ì å“Ç8ÄÊg+W¼ 29KA䊈ØÉãI/ò¡¬þƒD IæŽACŽèÌNEÃJ$y ²Žœð{}–[AÅèE!QÅÌòÔ'-g•H”æJœ¥aU IN¥ÖCÏx­g•méãU† Ñ0’†X†“,¥ÈÇg1 (s¹+f@bb4>¡O«‰b)A *±[lI& yºb‰P´èBd„¡¤_ÅŠ=EÑ~µMfE·$²Ët,o#ƒ=aÔ(ÊLÐ-O‚4åI-¹r7‹ÖŸÈ³Æ¨Ò—|4¿ùâ 58šL¦Ë…ú¡X¯Q§Åxåè (9þ¨¯¦“e5A/—©\œT£áËéÏxÎàO€UG ¾ï†stU\÷;­Ó›ùyµPò®cŒƒq]}ïÝ|z~V-1ÄàÝëc5øKõó#|ù%š¿Ì*ê²Âi¹÷† Ÿe·’rõãv£„üþðí¯Q¤«)t}´ÍÑm€ö‡MûÁ¦65°¹Í¶±Ç¼vÜßi?c`×À¤ ðÒþReÞ ži¤hå›®¡æÈÍÑo€Ÿ÷‡oÂð_NçÕ¼y) Ê‰­O^W ¨UÜß¿ÿ‡J^Êq“u‹ŸÜŒÇÒ÷k5x#ÈÎå Ä7íˆsÒ¡Ô‘ׄHá­Õ.ýÏnÞ/ ž·£ÉO-¶"ÎýÁÁ4Âô6p„»ø†Và¼ÕâáŸ\ã!î€ó‰5‚Ý6pžµè}.$ úòÉÀ1eÂ6pÑj“×Àa*|ŸSF#mÖ`rˆê-6Ð-äkl¶=i±¹‡Øb *. r7ÅÍ™;mô{;\m5[™'µÓ-^lð·ÑÅòJü)¾IWÜÖ“+&€nzh„[Űqà§CÚLËVî@ÃÁö·@C.¡=2ñNNX(‘&@uµCzÑÑlÊ'°Án.îÝCnvš¶†\D)m„tHH裎¥Î`å::¨ŽÞs´_qì œN0 ± ‘¥Úh6§®¾S*vå<¥´aÝê,”‚RÇzZj\&¶ÏôöÌeEXÓ ­|ØgÍx«…=N j„‡ÐÁ¸CªÑ®hÊ$V#a0k€Ü¦È "$SH|åœat%XfW^·Ê´È¢j°K¢¸ƒ¾ïr¾mw$€kU‹úÉïˆåU wËî9³Õl¶' àVœU4¬))jh ‹é”ã®`MÎ;}Œqíc´ —9â#Œ¤#mK±)V„c ˜§8Eæà3|,ŽöÉg"ñ—[@D)­&PÑŒoÒ’–b¿…ç'î(Ô=²z‚Æi›Æ îËÑ8h<‹—><¸M‘2ÀkŽÛÀ‘ƒVã-8†µŸ œ¼.¥­’㌨¸.8dA ¸Žj›¯;*ŽäL ¾;}³ÿ|9šNêKŸ]-—³ß ?~Ô×£ñû©žÎ/ÓóA5œ/¯^ü{8¿ž^èÙŇϋ§Ù.+û0ÓÂü*𤅥9‘²ÁèâbÇ}wåjÛÈÅ}n×,JÖâàZɂ㙭,¾<Â[xY Á‘$qf¯`t8½G'C[ÀÒ^}«O_ÌæÓâõÅÜfÃóŸ@¾?©næÃñDŠE}í L[x:±³]"&ÁéˆNàû}Çšé3ÏÁ"–Ê:#ÐË&…:Æ2æ´XÚ!½8õ6„YþoÁQBï²æÒÜ!<»˜í` îf Œ@˜[óJ`ºÈgC¿2 †{sRøŽZö’ ÉAêvXÃèï=à5¼D ”a‹ú릪÷z±N>`2ºº¸üçj¸XŽªÁWãêúl9\¾ïžì aÌ5#¦R}… Ah"RPÌBÁŸUÀ–eÕ[•dŽ‘59`5Z6¢´æ{£‹®8غTRõ~èñe]¯wð H#¸y ýiå(Ä’¥ÿo£oýudÙ|¤e›ydÊ]×â:Ò×ÜŸUÀ˜Và ËÖÓÜ!Dû¯›ád9¯.w°¸´\ˆš×ɯYr±dþ/¦°2xåÈþÖD,2Ã|PÙSH11Ø8OøŽüàÚýmÝÁ±ƒK 6Yƒ®'¶Cè~>œ\L¯§sL¤¿þx±l uRL B|XG؃ NÛƒ®¢ô÷A6ÕÊ.,#»ŠA%dßpa¿Ò£U‹Nàœ3‘Vàœ“BõwÈoW °àa,;½!]/¼,XäÆ˜2tχ•roÐr›À»Êfm]ö©ÃK™œŸ×X06a… Ô°ÙüßÛ!  BzewOy,‚•ãUì²,‰ò!«GO¿ \±WÖ¥jËïÚAKsýÍVòïí [ \ý°íV™›Ï†óå‹Ùxºì S‰¯0]Þ, *9é ¿“ÈZ~Vñ¼E7–ÅšÔ:-÷Bö\•Në‘ïÊ HÒ)ÄB{ËÆXìa+È©·PCÐL¶…Æ€V~æÓÚ-™ýZ•ö}=Ý…í M²õ‡kÒ–¢–ÝcÑ hçƒJlºã‘g¯‚XÉo‚X׿„"8ƒÚŸEôãb „°ç $ÙÛpQ=²SîõèÇj^Md{Ʋ³±Ý%ˆ˜¤Öv ªf¡¼´~ËjŒ]^$Û5‡u*€ÑÊîϲûtãxÿÃŒ9iendstream endobj 182 0 obj << /Type /ObjStm /Length 2668 /Filter /FlateDecode /N 87 /First 791 >> stream xœÕ[moÇþÞ_±ÚÛÝ™} R²S!âÀœØiá4u–XS$Ë£b÷ß÷™¢b ¼cŽ â½îÎÎ<3óÌìÙ&RFÙÄÊz_¯ÈZüÅ!á7ªà~“ŠIîg•÷3Þ19â'Îãíì”e‹Ë™0TÀŸŒ«ÑfÈ‹rPμ•+s椑ÜÊÊ1sÆ(g'1áÌ8å2•W ï +r^nA\JòVPäIÞŠŠfv&)Jeœ¬Øà¾ƒplƒÇULoY§˜£Ü",—0e… ˜ÂzÅID°ÐDöÓFå­•×Ê8YyrxËåYDÅ ÞË8¸ê#çá@¦p¬|ÆJó*˜rp1—%{Ìå’ ¡—Uðr@F…ÄZ Ëu=Dm*ŠàŽKÆ ‘²<Td’[QE[9‚ý"Ë­ CBÇr æLFtˆi’‹r@ sbÉÌ*y˜ÝáÍÇA¥\Ž*[’g’ÊThÈÃ0L"3–”£Ö;•³×Æâ•C² á w4Ê] Ë$Q4 •w$[Þ @™%±6Þ‚Iœ~ªÂæ¶ Œ€MÁ›ƒµ¬£¸€9 % r£<‡9\ rs¸ló_¾ÿ^UÏçËËz©þ ÿïUõ'¶=ù¡nVržqz®ªw¿ýÊÒ† SÊV' f·Ó©<û£ª^ªê¼Ë‰µŠCöºø’Ï:\Ñ$ àé‹Û«ÿ,jUý4™}RÕ›r|:›ÍWêÙ³¢9óµhÑ[ò>Ñ¢ÓP5Ü×hÇÉi†CY6@^{¦Gdpt@,§B¸á´7„¨3Œ> pö¾Ö\ <I ëˆ0ÁÈh–$•¢f¤7DE̓¢ !ê@O0Œ‡qaÈ!ª â°¹áP/…Êà MH­„B©­Ô¦B]{&ÕÖ¨`˜:˜$l3:*í>+¬ó0¤²-€ŽÆA˜j š O†-=‚´7(ÙE:¥yv^ÇtGBB’z:uôÐ-ãåŒç—Êw°NÆ#ä-T2…)† ’ƒ¦ò]²XEÒÛØl’:ÂT6(™´.ƒ"k§t8°vŸt!!䣾 È“ÉÊÛ}eÍÀJÇÖ.ýØ þ—â>ý€PçȰšÓ^ˆE@|ÈÃ2±p(ìÁX-*Vâ¤ü ý˜a)Eï¤MÔ‡âÞ ³@ÝN Ûvàhº£î$›‹!^@¨ì¤£‘ÞîéÎlÒôø*KZûçýŽç9ª:»Õwæ4Òý°:§a!·C6v@™=®*…œtŒPmjé—±”÷ƒBÎ•÷•%¨Ñ5Ò7ò”-iœ´éšŸ¶På@U>UçÒV]G©ó¨Ú£¬îluä$OÒÙaÄéR2Ú Þ±ƒßKÑòVL‘šÎyi1/z,ÍsˆÚH†…Ófp@,BGáèWzM~]÷÷s†c'i8‡”ÂÒ•×q<¬—õ´%¶–­þ”GÌ>J§»„§ŽÊ6Ò^g¶nÐ>-t¡ª_Î_n¯&óÙÝ¥o®W«ÅwUõùóg}3™~˜ëùòªºœ«Åt¾ZÖÍ ¨½¸üømñ±Ý*Ö”ÝC‚­WÖ»ßlÊ:9ñÎwì» b T)€)ÀzðíìcÍÒÍQ È&fdszÐkqÇ}.ûF¦5¢“Ý’öÄg µÃ¼»—-}¼[ãÞ¨©Kp­Þœ½ýõÝ›¿¾xõæ%D«þ>Ï/'³+U½ÌNgÍäþÂÙdÙ¬^\–B±Jh†>ÇËÉb5_–š2ÓO£õC€À–ND¶UÊÝÌo'—«ë¦¸ˆ]ìá?Ù÷x¿s3–4!WÕ‹ÑâÇzruÝžb:É ßT£júm1syöãVgÓÑUƒÀh%÷—™Ÿ·iHî{òe÷w÷Î&ÓšJû¡,F.ý<º©¿RÓËÕh:ŸÎ®¦5ž¬^Mš:*+RI¿ºXÕ7¿* ikÉ[êªÞ­À(d6–K¥–$’?ØGÈ6Ôc-¾wPhšÕhÕhüª¿Œ¯G³«Zç7Õ¿oáCx¼©PzY¢j‚L¿\,ëÖ²-W“Ñôä²^Ô³Ëz6®O$˜4'7£åÕd†;õÇp¨æä¶)ÏãæÍ¼xi©bk ¶4BŒ4µNÚÕ¸_ß@³E©Ý*Í:•îßtEÝ™A¥DbD;gÁ¡K‰ä5å?­òGÕ¼¥R?€Ji É#ûsXrƒÇ¡$›+©07ŽCtô"fñ %÷1˜ŒF#U…*W;³È‡ÄæBˆ•më‡nføãpýGèÏšn›z‰H9ŸMÆzV¯ª1ðºêÓ¤`¤$Û£âc~Cƒ˜>wÝ}2ñ[ÆW¶$åƒöX† ¾äÝÌz°/Ãw@MÊ25ƈ¼N7² ܃ÆX7áÄ•ß —P”×O¸ÎyýÅùéÏúüd±œÿ ÓÊ¿@ŽGÀûÛÕôøe5™6 —H—O¡ ¿¬½wyåÿd-ˆ}¯ô½ÑIöÙ‘÷¤x;Ö^7 $iãÆp á\ý„DÅnP-9mÁ­< ('Ušø$ÙB*ÄŽ¢G¤›jÙ'ùi#Ù{äc×?zq´ˆ^þ^¸˜½ìQ„ë JùÂAÒ­p^²˜íiÖ!@¹”Ú£?,(–¶ÒôG]êÃ"¿£B¸ž–TÊexz–.*lÐ2”Œ0•Ÿ–6dM²ÏÛ #„‹G®7,ƒÙœM:Jðé#[.uW.Ï¿èÑXß~ª·ªW§Ü²#ÆH˜ì¡Nºï »6]ù4¢·Ù“¥ D ,O^¾Kð¥0xR¸–ÞhV+œ½’¯œ [´Êg/ò‰D+\ Q¾ŸpCQ1ü•ï×Dµ†E· î…ìQÄoaK Ë@˜Hgc€ÉÒS‡ m+šàÂûp ÑboÐZÙ‹©ôÍ“|¼¦@ìœNËÿ!Œ~s5þýpÌ’Å*’Û`–ë@·ežNü³.˦aZ‘2ìI+Ú5h[Ùdc“ûÉ6„jÇó¦9 ¹Ü–²EmAÇÓÿÊ¿Á²IùOAÈ.Iþ_Ød±¨B á(Ïæ~Â=Ú¯ßjæý ¾Uvendstream endobj 270 0 obj << /Filter /FlateDecode /Length 15819 >> stream xœí}[¯l¹mæûùõ¸0]Öýò ``€‰}€y0ü±Ûv½»íFòë‡)Õ^’X'㘃y©é®^«¶JâåIQäŸoîîoÿÿþÍû'wûý§?òüô6þõ›÷Û?}ùô³_Ô[p÷RB¾}ùÝ'ù O߉÷VÚ­ä~o.ݾ¼úÕÛÿøü»§Þ›óoß_>ÿxùü—'Ÿ¿»|þá÷Ÿ¿‰5ß³ko?áyv.öðö->G缯o¿¿|ÿ§Ëçëwþ7>×Þ»ïËçïžÌíùYúãå뽎ÿ;~á\)õíßð¹ÓÜrxûÍöè¹ðö·}´–Þ¢¬}|þÃç_ù9Qº_)ýQØÝ¾ü–hû'|¿8bÚŽÏ?Êç{“1Çó÷ó;øŒúç/ŸþÜ=Üb-õö.Ÿs¡|ÿ)µÐ–Ïüï?ýáÓÿ¼ý@2r/9öÛßH~NÿÿG’ùäk&yH·]¹÷H#†ÜÚ½—Ç“ï?ýRùÖãI(åž+¸î¡\ÇšO®ßŠ˜I»~k>¹~k›Åe^—o}Mú=ɺ¿Ç’Â"þ¥ß]‰·ä˜+âÜço|Œí-Íe~hîóƒòô·õNCÄ¢ÞçƒLbt](u~'—{ '×/ZI ×/'—/AÒî±]¾4Ÿ\¿4fpùÒeNÿwu¾™|ñ÷iz¡ß}B"¢Gð-ÝIÜ}¼Õ|’Kmw<˜KÙþû*†SøïÑßbwþÞÓÍ×F@VÿþéÛ¤ýï—ŒàH{¿†Å·?üõý»ß~÷—ÿüåê$Zxë·Ô€£ƒ:?þÇgŸß~üáÛð\×%xOBG¼ñ±ÒÏ×ÇTï)fÂôý³ãÅ¿ e%Ñ]Uøéi!÷s¯‹ð;Ñ(%'mÂ܉?}"\¢%Ntù{¤õ¥ViÀv±üã_I(ˆd©ÒL ÆK$d‰ %û{ò+®áÁI‰H‰Wÿð€Ø[ XƒÁ€H‡ñhÅM´÷/oô™Vl²àÈ`Oë%„1˜Ÿ«÷dÁ¹& ¡&`†“Pûìmd&ûÄKnÞ€%0åj(„jÌ0ç»zÌKNQh-¤š¤ÐCï  ËBlHMª½Ërˆ%Ç®%e#.7 dðÀ°‰êõl0C0ÅUoÿ)’U&p],6¨I sg±iFšÇL¦ V t½ª…æa¯P”FÞŽÅ€l’ÂBF^°€Wˆ5#Mˆz NBÒÆ`pI¦Xì&o£ Ïéq6¡³ Á½`s{,Ý‘ÅFJLVx%ƒ(%£ã±Žô ³Ûc€‚W6ÖMœn˜r]²3m.$`Õ.÷¯Lø*Ñ=3x/>˜8P¥Ò./É”&µU¦Xƒ‚&·ÑftÏî\ZRj8ÛÂìL•ëÝx¾²dCB?JZ˜$çc@äàÔ×ääá½>’œÑ€=3¸zÃKâ°BºÉþDn(BÂ(Ÿ“Ò3ë¸jrÒ1ýd®ÔbâOdG;§œŽ“ G–Ar~’IšîÂ;Yr4‰ŸÉ½Rø'6ffÄ3†ÐæTŠÝüâ(ícvU"%ÄÛ$ÚE>ÐáÐÍyj%üCŽS"Ä61@*Š'ða YÙ¯‘¬jÈýE¤:Y¹&.: \Å®¢ †*Hm’#LúÑQÆ'Oõ›æ^çj<«÷žäHº™Ä g¶gÅ­C#óÞ'‚q&wžJ VŒ;¯6»ñp$ÌÂàžf$9Ó¦Ìò¬ë¸jIJ(“[ /½"í,Håfƒ ¨Âì ë\BQèŒì†j‘ÅŒ›^m ÎâØÜ“ü9NŒ3ª\õ¨0ˆë†6Wö1ÃÌ–5‰2 JA1¼¿Ž ÆH#ïÉW²»ê¨”dRÿ []é&Ùô³ R­Mrˆp9ËIŽ«·É.œfƒÕe* M4´IÜKÃuyl®gyòJ$]=[”iœAÜQ®ÆÄÝiR õ&å7Pé8H¡·jS~£[(Âd!؇Z²§$ÁFÝj!bh  >Èi²·‰ð9Öa˜‡Ý¤@ ñ®jU¤¤{„ÉÎeéhØ‚\÷u&1Lì,xMŠv©ÌE±0¾xK©‚^&Ù]­i@ žð€c†Á":0ªÌZίÌ[°øc~&Û Šªg 2›zXäGAÂb¨÷(Ç“ÅL²*ÄŸPËÖµ…ÍðQnÛs*¤©‰´ÙhW¢’ŠT"ªgžóÞ«]•öÛÕ¨ ø#BeUö 4vÈ…|,T€´¸ÔýQˆ´râ˜á€6µ®•Rm:8„®Å04ê!"%eŒv;`Wê£è»Ue¾$hUåó£÷Ò»LüîL´ƒšÍÞŠPW «Pó˜Äzçlºt`#‘þ Ñ$_ìQ–ÓH‘Ù†ßÿê€|]¨¶ÛßFs¯ˆÄl´§q»°Z¤´g†WçÑf©6Ïmµr"ŸíÂÈO ¸ñFöqº‡ÄOBâ[>9Ä|ñDê?ñw¸•o¥ð­´éJ2NC7 wTÀ“îW.È…âq:šLEyâ;?ÉîÎ5º>ž+!WÙGs,ßÉ[áÊeåŽù‡Ø1pb'?Á!FIdu~‚ ÜÜÁ(ü¤îÂ…½E¾‚vM&ðÄ“êGN!Áµ~ÂÑ©k,*x|êòWL  t“ÒÒ“à°1^¿ƒˆߨ‡DxÂ…Ýð¤J£°€Ã…Ìãp÷ ¹~+–À÷ñ­ùäú­mÝJüCÝ#ɳ‡›wíÑã.g1{ËòZóVçóìßú¥ù]L„{H¨ôœO®Mù´o%„’—No=Z>¾uiøÿÑ+p~ëÚ+pŸÅå[ÿõf‘33û?Ò,ðƒfB¹{»ˆõ|òèøXÌþ`ïQ¥ ͱ^|~ª€Õ_ð¿ :Ýs!“KÿÀ¿|ûþ'ìÌÄ"«ªrVÿÞ;p_Ïÿ÷æ±C-›FÂ×Ú²³{–s £Â‘4Œ}E«æ¼âÑΤo[¤ÍµMŠñsóÞ˜íNUcCý9oÖ=<£]¢‰óIjO¶U²kˆ‘%`Ö>ðC¬ÚÏ$·3Û‰aB€ìÚ&2 rív©ä³øbVíc|Ô¬}à‡`5qXÄÆXlr·kH˜Ê!3à €ö<.äj”W;9U5›µLä¶ìÚBQROvíIbhG©ví ®5»þ Hiv3´é ½‹Í®`$N8ö猺±D‰\XõÓ‹(¯5ΞLúbÁˆµŒäüsmb«õ’£_FœÐ$ ‹m.w6*©)½]A†UÄç­b·0[[ŠfAÁì‰0jHšuŒäËU »Ú˜pð$ wM1ê ÈžD3ì È<©v±âÆ®ŽQA6üƒÝé,l…ê’]ÁÈÅû¼]Áä7µêˆÎ£.ƒÕP°s˨ l)Û5„;ë³aADU‚Yû@Þ‹k°;XŒœ®‘ìÚriôí´‰X.äÜìÚ2.8µeq~eÕâäF²j 22«¡ï‰›pÍlVl Å°ÓZìð9³]A†šéEX$ç$‡F Ŭƒ »9£†I!Ääû=·l×A¡sΖµê øÀ5ꇨODÔǪƒ \·“ktõb×ALé9ÙÝÀ€?¿Ý¬ŠÂÛ°ê kdÚ™µŒÈ÷a.ݦS|d«‚ˆíq“C«‚(Õ=«§n×B0q#ãd×B0–,wæ¬Z¾J®v-#Ÿ'»‚0m¸ç«UAà!ïóV=9¸Â¹ôF=9 î«ÝÅø‡`[UøGüÇÇl×DmöjØD÷ålñ †6WxËv=#oMÁ¬‰ öÜ’¡Šª ³œ‡Eíƒä½œL[uLHDç'«.‚8}rѰ`â&xv]q¶cÙD0ùÂezÍšÂ)+=[5|×VMáãÅ‚´‰&—n×Deº6LH0Êf R@qŸf×D.c±k!ˆ4=$0˜µdk¡D»‚ìij‚Pá’»]A>‚†Yq¿Þ¨ƒ W’]ANžµ)M:âŠDÕ®ƒ`ŠžoÛuÄ’Ë(cÒAq•’¬:>¤Æªƒà´Ì:bÀÌÚé‘ÁÅÌÂߎͰ ’Š]ABt¶ªÔ!d™uÄ…Ÿ‹]AØÀrcÔA!\¾,cÔ@…Æ6d ÎV yÀq€gÒöƒmV£‚ pß­:ÂFJ£‚¯†j_`¿$»‚‰ã„«8®‡ñy–Q"8ñ¡j³‚öŸ nm°KêÙ™uä Ôw»‚ØâKvSì|Ī Ì.>³´j H«¼{³ö|ײgVŠ…ÓJÌÚâz Š.™yŸc<³ö“jÅ® HèK´ëȾDÉvý§’XµLÒÍÚÒÎyo½Ûõ”©Õ® ®È¡š¤YÿÀ„~;9ÙõÄ€©E»þ|°cs«‚€ÖbØ?ç ÷Ͱ ~»þ˜!’‡Ì:J1‹lÖA¦‘‹v ·•öv Yfj2 "øf×@0‘#ë“]ÁÍĨ ;Èè-gÕ@-¤íÂBrܔĨ â¶Ý° ïÇèÛiÕ@0¡"A°ëÈÑL›î AO«î ^ƒ1cU6yšÀfÝYåR³ë˜’Tf7 §'šY4ë[!çd×=4†ÍA8«æ€}gÙ<Bº·kÅk>Ú5ðgÄS¬š"\ÑGÕ|“W½]÷@„+øàΪ{ ß@.Ù®{àGBœÑe >üLvÍ ÁaŽYïŽøÔn×<ýœcY5„ ‡ °f͇ŠvÍl’aóÀ¹¡˜5„§ƒ¼`³æ|x­š¦L;¼E«æ<`óvÝ´HÜøÚ¨{ GAP<ƪ} ìÖž ÛÎÔ³»cÎdÞ¨}àÃÛ±jȪ¦X%¾KÀ`×>iè ûòA̸{mR\…/±dÂl—fy,]¹IYA¾™ rµ–‘øn’šŸ‚¿;Wìb@_‹]A޹‚ËVÁå€|«‚ð{ßé3j!øà²U AÜ–"òFëW9´ë ȹvp{¬z…¡J«Ù®ƒ`âZɪGŸ""&áK‘©[Îi­fW%¦›õdä‚/oÕC¸ÑΪ‡ fb´k"Èún×Df‹Á®‰àã ÞÎÅý•d ›˜ìºb†>w».‚¼ƒ¦f×FÓœKoÕFðqý¨ ד]ANsêÙ® oñ½ÛÅùÒׇ6*wÆù€¡ØµĆwÑðâk!Ú¶Äu¾ŠeÁËÂqf³6‚Ìåq­Ô¤ _³·l#˜¸¼´aÁz’Fm–œÕ%vÒe»«Íÿɪ… Jíò­_ìò­Ë‚li"nÕ@WÛ¸ï°UA.0Ê{št|⛣ÿ‘IA¾DË•×>¶'«‚ìŽÆ3& —&¬2,X5d“‹Ó¢šò!Yjv͹X¨‹vÍ™!ˆZ5d‘ñÉ®y /™í£æ¼y¦h×<-tÅ´êQì&$»î\à3v|·êø(æd6CÒ_º]ÿ@.•— ;r˜TìZ>*JZµÄŽìrí’b×?ëx”h×?3f´Ð¤B%j ¦`×?zçr°+ÓÎeÞbµ¬N}3, k ‘óËÍú²Þ¥`×v ‚Ý]6ëÈ•îC4lá€ëY.XõdŽÄ™rmY'ê ŒüV»2Ÿ¨yÙ½]ÿ@.Pƒ>Vý'ø›U Æ¥}Ãî]?Œºrõß Õm;ÿŽæ1‡Æ¾2šaqƒªq)ðñä{z‚­„‹¯fiF ’³äAëü¹~áú¤zZ«é­ç'ñ<þó“ܹå’v¼<áöñÒ¹Pž4ô„JÒÝÐÉ“½ ¹»!Éaâ+Ó9»ù§QlÀGô·Ã„ì0ç¥s79ci£ŸÌü `CÂn¾„'©KƒAN›ã'ÕIƒAÜJ‘ïtÏ ¹IúL9¤é_tÒA/¹™È%ŽfsÉqîBU÷ñUI’´Ìü ¤ÛReáÉû*øhò-õp깩 žEaž ß£çMÎ_[æ&`ô$8Ϭjó‡Èíäæx­4ao )2§ZËh­‡'h©ÇY~\ÅDa¼<É<0÷°Âµp—¤dŠ¡2§îÈ´Ôkøß«ÀiÉ—]èÒþ0¡É–Ç© ±ÐAu\{@D~¹ØõIæV™{ÒÉUn™]CÎ?á ëx’…¿,Š1ÈaºF¾€é¤÷bB—ÂX.O¤åôíýÑF O²<ÊŽ¼ËçX¹ÝZ„ ýÌß¹6!;Çûû:~Õÿ¼á×W°äõêõêõêõêõêõêõêõêõêõêõêõêõêõêõêõêõêõêõêõêõêõêõêõêõêõêõêõêõêõêõêõêõêõêÿÙ+¼|%Ö¼^½^½^½^½^½^½^½^½^½^½^½^½^½^½^½^½^½^½^½^½^½^½^½^½^½^½^½^½^½^½^½^½^½^m¯ð2 ¡H@³Çwùü,±†¿3kÐÑeIŒA!©¥DR¨¨ðÃ…¤P‹(÷[è­K!©_Ïð­ZQž'¢ÌQœßZŸÑäPž´ÐœrRMê—dz÷c¸x,nL}ìTác§ (ø s'WžêûÁi…¡s›Û×R팅½Dš*ÆJPŒÂ©Q´%Áƒ…ÕÏb…Š ½O2¾C,%±™¯+§>ž+|ŽÄ0²"&ÛaM@¸p[áä¹Â!÷¬­…w’: GF7[›ŽIð~p[aæ¹ÄÁÞŽ™'Æ32¶…½hìÐeMÙ»2\ãfhôíàå;—ܳâzN”ýÇnQ6¢ tá'N{^WGýþ™:,D`Ê Î1=!U)Xl‚™ñ~ˆ”&.'Çf.Û8Û;‚ $Ü7#ŒÖ‘Òäå$âà0+Xe>£IKŠÃB¸Q¨V`•)M`Î51hæÂÐé´¡\¶Çâû¡M¨4‰99mÍ2„Óq—hˆlì»æ±)»Ë”&/¡‘‹ZðWôÇ—ùóÀ¡Ê¾+ä)Â^‡t—(MZN à-+±= mfùq犊¥¼ ”&,''þ¤Ûc_ÏBž›L%óï¼¥‰ËIÃU>ùgœ, bV ^%úŽ2…ˆ20Њh³¸k:·Qqî½,:L¡ê¦³’À úl€ï‡ÈjâxRqBDà – (MÓEÛ<±K6‘UÄñ$â¢IgÙ<"ºÐ‚þ«ÀjšG+fHÚ|¨”ËÉö8Ä“~Þዾ gXMOâr2LÃmSŸ ‹(ë!Û²¹/« ãI¿1}øao+'?ðŸæD_,EÐyWM>g-|pØÂDPL?¤U“Ä“„S61t)Œž~ø*%­ID3ú¾ «&ˆÇô[…‘yP‡ƒì ó@ob•UMONphp¨Cw¹^yè Q$ÑÝ !¡aÑ®ésjóNÃiŸ°eÂL.i€3­µ€Áô'®²ô¯ú  {¨$Q·ƒ&7ÍQNE'ÃUè!fÿ¦š´Lâ}qó‡ÈW …ã`EóâÏ- ¡IûÉ¥ñ¼/&Ð0o[¡µ÷Ð$†°i„"í'µÑÇæŽè 9øÅ÷C#4i?I8v/–ÿäËM,!‰“lyô'ÓþÜTB‘÷“„Óxè·N*~˜ÿÊ2mÑ–é³ê„&ï '@äÛ$“>)ÙN€\úÑTðaÑMÚO®Öaý°I’‡±!¦‰ù»i„&í¡&.ØO³ W]‹7øœxïh ø¼h„"í'‹}xgFôؽzG<’þÖUÓÞФýäÑêøÎ°#Pæ0Tè9 ó@Iv =ñ°j¿W1içÒàtë‚,Q˜ç8¨¿iœ¦O'–ù‹ <¬xý¥_ ´éœ¦O§Y+L–¸@aÓÒ{Ò±þWÓÔéäÑP`Þ†&?@¦q+ܧâýP9EN.þW5*ÚsлdüMå4u:I8b^ì*,E¦_Ñ6k§q¼p×8M›hN™!/n´ñ {î‰É“Æöâ¹E BáÂMá4u:y47˜8 Œè9> àË8XÛ4NÓ¦“EÓ„`èþ„1"%a±…/êµ*œ¦L‹†ýÃÈYùª¦LmÁ¼§iÓÉ£5þ³œT YœxÚï‡Æ)Útòhqd›ÄgМÆ'²ˆ·©œ¦N'“fÔó6ÇyZXÉ!Œf=y´¯—'ßÄÛ˜48Àª;ýw‘ Ff™ÚSØÿÝTZÓדKó°¢0B³ž 5ŠˆÑe&¬:­)ìÉ¥é@bhÇ,vÑ…(”ù›A nWjMaCÉM”ºu±J„ò*;mx0DðŠÕTÂΫRk {JÁÜ#ËíájÌгçÃd"Bß­Ö4öäÒº çI#%cæl ¿j­¨ìɤgN íÇQ–JÂ&6ʦ՚ƞLzJ Ö]þ4NeÕjMeO.inL|ÄÈ:þG~Ebd‹Zk*{rišqÃâ],·‡‘BâwEÑU­5•=™4D”ãÏ•ƒˆÍ]ØËY%^$H°ªµ¦²'›¦‡w`Fù~€0> mj­©ìɦyjçoóˆ' C«$–?uÊF°éµ¦³¤Î3Fp¯§ ¢ÈûMl3Œ‘"§â ¯Š­)í)ÓWê·ÇÑì0µÐÓ*‚.Œ#n½ÈO"Ÿ+¨Ð½ÉÁÓsMòãäØfšDºWÜÐ0ჹÑÌ ºlËâëq÷µ€N^N,Ñ74P8ÅàéF@[„}›G1rh¨pŠÁÀ!Œ\Ø +óTÜñ9:sOpzÅ N! f#k¬b˜ºìû ZÒ ¹ÌHè74L8¹48Ìnž¸|i,ÝÕ\?eFBàÐ@áäÒzÆ™n‡œäÜ£Ø!A¶ú74L8™ô”BDèîÑš“PhÇ N6 bá›:Š5Šk*ñÒæíýÀ Bn#€€–¨— Î¹C¨G<ÂqW½è@)A‰74L8å`ü€DBjÄ›Ð|—ô! _sn N1xjï²3ŠÙ¢?²ØÓ lhpJÁó­8Ð&B>"!0Í:‹»ºÀ† §<=(… ‹y…³^±æVØÐ ᔂé°rîƒÉh}eG‡Ÿçý¾ã†† §h$JŒÞ¤ Σ‚ÃÉ\dŸðPʦ° ÀzZ[‰˜¹]<]•KqÅ$ o ˜‡Ù~xÈ ìpweý ÃTß Iƒ›S¦·Í޶¤ 鬡Žôi«/¤ÁÍ)k¸UŒ•@dgL—Ä?˰B’7‡ °ÞæÂÇ ]æŸqNDßDÿOÏáè ‘4´!çÆ3“\OË4_1|µåállˆ¤¡Í)ÓYbSW~ÆKù†Ðß*{äŠGÖœ2ð4E‡vnÄÉÔpÊŠGØ"0£ÅGáp4~J‚õ+§É6‰vìx¤aÍ)«Îü•óÚ;*Ó¹îï’(¹á‘†5§ Œ¨ù6ÏÌËXÁ 82eðwÅ# lNÆÈ9¢r qBJ+ #?ÍxÁ HâRðœÃ íX±ú9à½c’‚7‡ ôg¹\M¸eëà}7\IC›S¾²»`8¿g9îÙIƒ›S–pÙb> !-O7hC$mN ˜öó•=8¨ŸÑÊ™æ`üßI›Å%ŽŽô ^¢Ñ#±´Ž˜4Ka"T¥¹67/ZR¦){ÛÎvéƒó°râ37äáxt¤?ÐNC²S¾–T>ј©rÉy'Ûãw–¦P§ŽÃZ#äØ÷þÜ)XvÊ×W¬çÌãÒLº€ÏŽw–6¤Ÿå¦ðYC‡1™D]œÈ(è¶â†e§ˆ-âɱ‚)ž3Fâü ¶nx§aÙ)ÏO"22Ð-K¨lÇ;Ë!x¦!¹iætعÅx^ÐN²S&ö3ês¨¦Lë*€!4ÒÆ5’î4(;Eà94Ú˜ú%I²Âw”"°ø.lÃ…<Ð ·eh*H¨{…; ËN Ð@"¡9£;Ñï;ÞiXR "Ô¸–HQçt_²7¬Óp씯% q½^F“”©5\®ãÙoX§áØ)_#ÞÏ{Šc¸KŽsÃ*Ñ1IÄÅ: ÇN› ޼iñ“†Ï‹9˜Ø3yß±N²SÀ¦ô§:Øy‡ø€ô f/wÉ[±NñS¦er“„Çq m‘©z!r ¼`‚c‡|=¥MÌÅñT«KÃåÍLV'9üÖwÊEÂÖ´üJ›WãÈÒ Iœ}ñˆ6(Õpò”°5çĸ*KYÚ ½«b4ï`ªå)`Ï26Ø á“î†]²a©‚“‡x-þx‰?M8Û¦’/˜å¬zER &OñҌ±-âBH…ܵáSlPªáä!`Cw•"Nô†P±€zï–j8yŠÀ³äaÂ)Üw¦)V¹·‚d'ÿ,³pŠe5ŠTðw†Vº.g ;Øi@v Àz’QÝH+Åù)JÇŠÞ°Ó€ì”ñ×kï#«®B<W²¤ ì`§!Ù)ó<ÿ¸ÝÄw»P/ÃÊö²¢†d§ ,vó5{;äÄã’¦ÇÑXáN³m;ý8N˜zûq·;ƒ<4‘’çÍâ ï40;„ìyn8Èþ¶0ÏÂ/x§aÙ)d8œ*DzØü8 ª!ŽhðŠv’6Ó†ùœ…ÑÆÕ#x:|PIÐ"ûâŠv ”ò5}nóH!û™™Ù©õ‘­·Âe‡x=ßÖ‹/X2Áo¥Ú)HvH×ÓpLÌSk8•GBU…Aä®ÈýÞs£Üek¦ ôÛ¼s1a#ßW"“¸P̤Hž²õô˜+&Ô_‚ £´‘8 ÕPò­5ƹQÆ4ž+é¡Ü§YqTÃÈS´f&ïåB®®bu‚9„šêÙpTÃÈS¸‹yik "bENIWÕ ò®3 <m¸ èø›E¢;ŠjyJÀ Ãߦ|ÆDeÙeP“C® æÛù?0!Ì2 H°{¢¤ñ¿ªøB;ÈivJÀÓô?Æ§Š•ÓÎ]Ò4÷/0§aØ)OMÎPÉW×þ+Îi vJÀØå*÷RíYY<¹ÐƦ¾!‚b§Ίv”â5}–8@ÔI¥!]0¦Üx^ÀN²S¸ž§C¢žK¼*î†uŽâ5wŽòöó€Žöè©Iß°NñC4wÞ§–öÕûq¡}A: Å xÆ‹Ü ð˜å¢ÕŠsˆ0hӧ؈þ2¬å&ã“^öqd: ÇN ÐR¶FœS¼Z@‘Œ³ë4$;%àiFa¤ý…ûUdàn›|# kNX,7/qøq|é*ûkÀ´q~³â‘†5‡Ì­}^SúpЏ@97áˆ#¶á‘6‡Lì¿Þ¤øÀÍ$FÑÙ Œ4¤9%` ®Å!>eHùÌRsE#iNþOg´Ýö³W”¶gg*Ž„¹4¤Ùw»¯áQ²³²Å݇vm`¤ÍÉþy>IJ3·fÞMã2Ò#äþ F МÜŠlÙÅA‰]ÒE70Ræ€5e…÷ö1ùY£!ã&’x\+iPsÀ$Ž¿Í˜Ø´ù1Gv4‹œmX¤áÌÉÿU¯8«jq‰-7{K¬H¤¡ÌÉþ™j/´±€"RqÍUŽþV$ÒPæ`ÿ˜>ûB’Ö3+‚.²Ðø¢Ô )spÿYºÁ»˜!K>ßûB ÄœÜÿJž1) Ž#‚4N?`HØ“ûOÍ5èI˜»Ÿ˜³¢†1'÷ÇðçœèàN ’ '4 8ÙóÖpõ”¯ö‘ƒ$®Ðœ Z-*»œ½ÒäØ"È£ò l ºæè.µH¿=ò¤]ªXm8¡`ÀÉ¡iÎrÉí’¢K2æº|Q"ÌWÐ`ß$ö(Àíqñƒ¯,3]p®=:4\AB€“÷OÓßsd^Ee7ŒPôÿdý³äåÏà ÿÅÝ BÑÿ“ïÏ­dT…ÀÅ:„~à NÖÏÔq¦ýÍÍúÙü€Î¦0ê¹l¡ÀÎû§‰õÑ‹¥GZæguÍ#4ý?x¯׿}à æÝÄâ"4õ?Ù3Ýÿ£º&T‡2Hð•Þ+BhÚ²gFN»8ærâýÓï…¥‰øUÕ€8´ÿäÎó˜8úšÕ(“9û+BhêðgÝggÉ9ñK|V˜ë­íj¬éèÉ ç¡5Ú¿°E’ä7)e´é±¦¤ƒ†lž•’ø §üðAFiëU“55=9ô4=4†È‡úq%­~ÑdMKOÍäÊk-šáþsî OÌÜTùTÓ ÃŸ¢Gùr Q¦Œˆþ¦ÇŠ’žÌ*9rû„¨áq·(²¦¤'w¦ó|ÛÊ‘Ž'fçÆIý¦Èš–Ü™fŽR…¹°ø[ »lj¬iéÁ›çR“ˆµæ8]ŸM‘%=ù³˜¯lN3ÁáxLîßÈïXYSÒ“AÏSï2>1ÝÀ]_ÞwEV”ôäÏÌ 'A8L9Ý1 ã|ž]‘5%=y4¸{ÖÒDùJä³gú I|ÜYÓÒ“G«÷v½p€Â)¼€äÖ6uÓtéäÑš¶,GéãÀ&ðÜÀ_ñ¹y'}“XMO*Nõ:úÖDßùÂ<úñ¼‘Už4Y9ù,Í}tÔ¤ÁÒHª¹Š“&,çú´Œ Q‡°s\lñQdu‘'MVv…ÜžûøIì\§/$P½Š“&+'ýžds“•Çí¶húÃAÜ¥I“”~ËùÌMž%c$cà,ö]Š4 9i7-ä£ú8W| ~™ù"Eš„œ‹[R.{y‡ç„ù#Ž;zù,b¤Iɹƹ—ŸErP]ùŠû€bè,œÖ¸x,ñy&ìœåÇ:kƒo¬>Øx.ðy\óˆ’Ô*æ^y­ñqSÕ¾œ=xIÓ!6¶ÔßYY­ññ\rj8›‰š¾/Äç_X­±q[ßtȲq\§Ê±Ù²h Ÿ&žëÓ2]fs¾ôgnõÊhç ŸÚ"\T'Qj«½üÐh}Nb9—=”汞dj tùÌ…!±7aûZ™‡q]0v¹KÁß•­Ïõ­‰üÏ6²%t™ûÆÖÇúžœÒ6$¸ð)A—¡Ï Þžµ_PñáŽÊŽîÄWzi´8§ðP 95P‡$Ýîs ½Zìâ°y?׎ô ¹Ž`ë‰ì¯Ó¨qÎaÚ9g9';wåZÊF2ç$f´ôÚ^<=ˆØ×FÅýmMÚ|wºª:òÿ{“²XÁ•Ñv[“6ßs 8/5÷q_òçK˜ç@ëOjÃíë–øÕÍÝ¢‘ô¿¦Ï¿ýä÷í·¿}ò·ŸÓÿÿñ“»ýËÇq°G’N› ×àA}I>OùåñŒVŽã(4¦€ È5¼è[8ûE;’œ¶}¬ýôgšÊ ÿÿúÍû퟾|úÙ/hUð‘ÓíËïh†ül„·íæCçùyÿô«·_~þ†äÞ½ëoÁg×;îh¾}‹ÿHÎÇXßþtùÒ.Ÿù;±Óô·>ƒÄ×îâÛÿÏsï­¶·ï/Ÿÿ×çoPÑ­—úöãåñOøL*]Z—Ïs?~æv,%¾ýíãë¿þBDGk9"Ì7Ds×ýíËoi)?çïÐ0®½ýÛeø0Ч•¼ýõ2wþFqDŒºþè¿ËBÈ'}‹—Qþ›<¦¿x —Çî2ÌõyùxŽ ÿób׿~ú?bÇ~‘endstream endobj 271 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5606 >> stream xœX TTWÒ~mC¿'*.ä)˜øÚ}_0—Dc\@Qˆ(.(. .ˆl "ȾuW7ȾC³ˆ,­ˆ@£h`¢q‰·£F£ã$MtL=¼Ì?ÿ} Iü'™sr†ÛœÝÕ÷¾ªúª¾¯®Œ1ëÁÈd2vó|·©ïJ’úŽYpG¬9ô–Co³‚wÞ>9cû#Û÷T?Fú™3Ï~À‚öAÁ»ïv õØãé¶ÙyËÇ[—msñZ¾}…·ëJ_¿5½'Nšl;õÝivï Ÿ>cæ¬÷Ǭ;wà g–1#f$³œ͸2c˜•Ì*f³šϬaܘùÌZf3‰YÇ,d&3öÌƱe1S™ÅÌ»Œ#3YÂØ1ï1NŒ3ó13“ñcú0–L_¦?3€±bÞbxf Ê b¬f0ó6Ã1ÞLOf(cÁ|He̘hæ‰l¹¬¶Ç„Å=P¾\^c¶Ô,Åœ5ß`^¢)*Ùaì n$çÉ=îéÔó…«Å½Võjï=´wXŸúüËÒ¯oß¾ëú1ýœû=é¯ìß:ÀmÀ×V¼Õx«%VõVøÖžá]øïº¼:hÞ “ÖvÖ~ÖÕ6oÙÙü8øc1Ù²ãÑÖ(.)‘‰;fññEêýÁêÄø0¢íüÙ:>ÔÉAÉI°¸0•â€î,TA%\‡2õ'½GÙݰ²S2A§KmÃÖ¨Wœ'¶æ“TŠZÝS¨‡Zø *L¦Yò@ ç‘#ædŸÂ²ÃŒ¢…A†r”áF”ÉŃx†ÿÞó$é±ÀyûGÞ‚{(Èœ8s{.¶(ÉW*¶Lw ÒõËùèÍ"s»íÂ}ð\Tþ‘ kÙÑ@ÝüÄ€eFŽÂ¾ø?øŽühÇ|^õªóé0•èÆâ¬;Ÿ|?ó é“©Ä‘•ïB ÷xÆmb'UäKËБ}¡Ÿ³Ö~ËÒSIÆ‘oxüÝYìYH˜NÞïVi)žI¨d5Øs°·\¬ÄßžòŒL%3ìFdÐãI8g²EǾóa×éŠ**à´ÁC8iú±ÁªvöIƦù]ÌÛ4AX‰U8BÓ b~éC=°—%ġղúË~Y.öçòÅ‘ †Ø!)9:>19 `[šp~d<ñßîšDee¢!!b‚ÀƒûÐBÜœ ž %í^àB y—’°ìˆÏO×AA‰p øØöO¡lÚ±Úœ4„)=y§­ÊZš½,Np‚åiöA:A™!áC)eùŽù¬ç–È~¢ðèÓ$G/q#d$ºz(4cÝÇŽMævÜ!5ì°»»®Ýh>}ChóXÃ:úùû.ƒKe‚åk9 Þ1#»‚w­åÁƒøWF…¿z(xÑ5üu4lªW¤ˆÜÆ¢WFöwŸHõÌVé~†:º~†*S˜‡á1¼MŽýÑ'4kæ4¸\ëom_‰ó¿¤Ú»ñã9%U´ ø„%¿ †sÉÿçòpÇ(hßWà¼4s#ëG•¢k)N§({J}AýÀƒÔ43*¼ÔcÀƒ®1àez\4ë|JÌTlî94Ñõêºp!íð(Q/òF™'Zòéù©ç3²^j5xÂNPà Óleib¼4‰1JÒ“d™·»ÔöÔÈ–C Éì<‹ ;dîÑ%–Mdè2K8ÚUºNèØ"öáÓ SÒ?—NðWGÒ€zBd÷3²™'!’ž£Nr ‹õæŸÁjz€}޵&«3lJÜþÈÔØ”„¬`Hur¼&y.YnM,–ìw©Q{p¿n{œÔÙ?=,5¾l²)’2J^a‘õ+R¹[úצRÒÒ‹8Kј`@ÏJ´3ÈÑyJ<¡ÂSüãùçÈ0Wb‘8ã6¬²ºJ___´7[0d–C1p—·ÎRnfÉ»dÚ&"·E.ôÊ_O65—(·êG¡U¡Ï€R},ìS:i¡Ê8";ÍOšæ³ÎÓpüoÈÔü°_  |MsøÒÚdçff|6FÖ•fÁ›†W]1*Ö'ÆSÎT«•vãÆbó¦_<öƒUÝ6WY´%+( Œ‰Ú?lTìYjhi‚ƒ]dº'dº´éÊçhŽrò¶¹‡JQ®»D;M5m]VöݘlÀU­´a¶Ô·t,áßl·?6±…Å…Å%­«Û£h{^Ý£Ü7dÒ#2ÄeýOå~wþð‰SEMô³~@¬7ŠàmJ_÷õ1>°¶ØWJ!2£Æ#¥räLý7Þ!œ†u1pCŧhcT¬S¿ «aÅ›E(~.A˜¬7ˆ²R)kqb_>-/5ã‚„2ouÒÿDZ¶"““4ÉŽ÷“·°ZÂq0 b ´K7Ž/°èÜ9*1jŸb”MÈF{H‚(ˆNÓi«s ž3ëý|ƒC¼×7{œ½ûéæšÅdÚ›(oÕSV^„rq;öäs¢!&\£‰Jâ÷ì\<…rÉ0À‰ÇÎhqJ?£NÔh4j2992‚8C{+ôõ¹-w ›¶Š8ØSRfÉ;ßOÁ18µ¹tÚ½NuÇiL‹øR:¤­x/Ž¥ ¡ÄìM£rI»5šÀ¤0u¨& ¸]*E™î–‰¿î–*»X)"Á)þ©-”rb»–ŊΟ÷G§Å‚M!¤eíÏÆêŽÖZ)ÄŠJÝK8D×K¨ìêfâÓWFâ͆@,ĆpoÂDò>MjnÏ%ÙÓÝÂ6²»‹7U9PF†’Ϧ£M{K±á¨r ‹¿54‘%²ÎG¼ÇÇn‘”dH?@«/©h)­WÖœ>“VÐfØÄ™šx\ZÄ„9;¦ó1Ùm(ýRà+Æuþ=;J«É›rH+SŠwX(Õj¤éJ´ET¡H¥6‡¢$fÃ.JÊØJÐAyrU’V»¹ÎéŠY uèZ…vɳØÇrÑ ù²4¨¨Ž¿¹¡EéÑäš»\ÒÓG‘dè [œ€޽*Ì€„pMrd‚2p‰cˆ;µ¥Á·O+«ÌtÚ£úºâÚÃ¥FÊ'™¤·v- ùý¨úŽ~u&¶‡É;Êðïú"å^ã忝®Uœ¡ 㬪jã‘å9Δ7ÆFÏ\ëä½R58K|bjPLE´ùˇ’œñ“hWa$½^(^~Y`ÈÖiÔiBDLì^á6׆(­ËonôjZhKä[ 'Œš§ºA^ÿ9“IwϯÇ6Sù[a u‡J“ÏyüPüýþ d&Þ'³”»*^ñ{rÅÁâS§À¬EŽ0ƒLQ%¶Q9s†l¨Åw߬ÅÈC²š»ü*í®âþDàiÈ—šUû_¿jõ¯‹ÊRV”§ê’éÉ…äí9p ¯X_Vë¡ò <Ë·dºÑ¤+?´÷ÍòlòVîݶ˜ªl›><8Áy¬à\..F'|ÿÞ§7¿]^”#¸—/…itÊÙ‰ZUzT=%Œ m~v.‡½Òx;¸rü8\yð6l;åiâÎ_ÿ*rÍöíË©Dµö:]á<äS…zŸ¬ÆauO â~)áï oÀ£t²¯æóøÞ¹hÁý§äg6BV‹p€˜Ïþp/ª±ï¹LȈÔDÇi” ž+ãèÈåž—9’XÅ“Á§á <ÌüKÓ—uíë®ÁçpcWËì&û”©°ŒvH2n´ƒçå­e›€sÛ´}ýÞ”]¢&óزw}3Ú_UUrè„~Çúå/ã—Ôþ`½n¡Ÿ$|P¼I*Ÿÿ÷Øí(Cˆ°Î8À§z6È*B< ÕÇÛu†kð)÷|ø=â,tšÿЧ—&<ýãWw„µ:‰½ PUXíM´˜.ÏVïSÛïjJû)çQ^a\JäM|¤F™¸Ö7$–Bü¥¸ÇœUDB[ü Âh«/áIO¬£ጔY.+5vä¥%^¤p[Ä‘R1É1¸CÎ7î¨Ùâéë½ukwãQCM£@GÚ>ϼ1\¡ÓðA¸Ð]7Î≞£ŒlƒìÜ#¼þHŽé¢?¶4ùäq­†3OŸ>XOé…”Ðw hta%AŸ¬‰‰Të‚ôkާ¤1bîT"[\·>oŸòÔšƒ /w=ߣ. ɬ 7N2›˜M#Êj'hŠ %ôQïÒ%êµÚÌ,!;;3·¢âó w#¥ÍöËW¯¾s~Ddeßž’á-‰Û·ÐéÿŸc¡$ƼI‘‰²Œû8¸;ß’ *ÅmÝ J3_À_àv—> ~{›¥32IÓˆÒ¥•Ð]R$r¼ü”“•yELêPªÁµ»C³9åÉqI IT0‘%d´¹¨b3)²•påWœ f ròsK‹°±µN£<¡ábBaŸ bËu_RÓVȃ¦.%¡­Ý—’”Ç™r+>míJ¬ß¿)¥®Ã®š»úb_ÏyãzbSׯ¼ã>-Ç[N³Ñëù„ á÷å/… °Æ9ÄûÓ÷²;§Î)Ý=ç?TËŸ0a-ß1ÓÄê;ze¯kÄñéEº´{’®ZK•é *˜æCpw ¿…}P'Å*ÉìÎd‘èkþ½Qᣞ [ÁÆw›Ýc C†t2Ä|'\ãhõ‰Ôm€±ÿäÒö¦Hzjóô´œ/zXã‚N´pӻŰ?5½˜35|}ê:öÖKS6n¡1.®ä“ÈÈç,•µY ÙuZ-øÆDC ·­2øá`Y}ûÆÏG™èMú£ã¥K ¾F{¶"M³]InþÑçâd–¦›¬Öã¨"¼0 ¾‚ §òž]K/…Z8‘7ƒrÚûð1èˆ}~~¡¡;c‚)Ý‹g("SŒÍ%2zйŸu°|•|„yK‰\ºŸÛ£*V†¶´†\®³”(Ul“îÐB×«î² CXi´À hÓj”FtÁ·ä¢}¨²O‰w‰ˆ‰‹Ÿ”R§(êkÿö—ül”s¹žph1ô*%@óñK'®6F”ÕÔé7ùê}S…†ãm©zà7´`Îêž*%ñ#¡1±´>ÃlöŠ3¥#£Ž¢€ß÷šêd·°:Kj"ïѹF¸o„a„ qL9ä®4fæ×@5×è_åéáïï1åù*싳¾þÛó“Aß“)•·•_œƒ¯¹› Î%1›åòþÚ£áª/‹9´>]hj¼ iÀ=?¿¤ tÌ ôToUGiB5Iê„dˆ‡$noHƒ '•JÒÝ'þU"?{œÊ?5Žç)*4©AajˆˆÈÓÎeæ*:Ϻ÷xª‹Åž\%ÐååUì“ ?¢yÝ”9ŽÒô?Y,àÅURaSŸÁ¥ÆšâSÇèȹr¢41†ðuÑ®´lݳׯë’uÉÀEAÌ^%i¦<º$K§ÍÊròêšïÓ(ä٠`é»Í)ï3oe[nCi]`å6¿aëí¾ž½pòÓ‡Ø-g> C6»Çù¨”–â-»Ê¡ín¡g‰_ñê9;œ]7ÆÆi44"RIäýtm¾ÜÑîúFIdd;ðÏššB€Äð)Z¬“µ ^h%Çùø¿<´ç~ZÚÔzô"U[uÉåA[“Â`'çU¹«ö€¡°ùìæ/†“þdÎ’·H>Æ õ·¨<:þ麦oPFÎòK!èÓ¤Œ}¸ ™öm;uæ|0f,|0Ât¼žÖž…|Wi 3ˆOøÌ,: PÖ÷RÄS‰´?J”ªÎVgqŠ(×ÑØ~U˜™ö P‚tTÐánXd¸¯‹ áb§Â:nq+dTä妧 ¹Í€“òÐìüMÎä­ø:zÏÞ–®åÌøOœ>·¸Sš‰ŒØ,œ;~Uå²[b¾v¬¡cãsW´Æ±n#‡²÷ZÜ dñ >4; Œ>âíŸue÷Oltô S­Ø!žïñ(Ì6ì1ƒ›Í-ëÚöõõcÇOTvº-Ú ø¿R ­p»TŃð0oĉØúze„Uiz=Ôru;Ë|wìÝdßîö‚šNþ³/æ’p"Œû€ŠRå“°wÓ'ùWk¢XÍ…;?<(»P¶":U™å§s†œ½ÿØBW'DÛ_»¡Èý¾’6³ß·HÚMÅ_Z²t;øçhÂ/=u~‰4‡tØ^ äu· çNËÌÐj!•ËŒÊJØ7j±q4¬<Ý\i8ZT·Þ?,".NðŸ5µIªþõJ©xé„hAâxHÝž"b†f*\ÒkíIœŽf´ÄsLÛåDAb¬B2’°‹ˆ `§+d'ÜÝ:ÈnäÐB÷X%\àp Y^dàRçÅžÕ{ªj+KÆ<2„Æ#Ÿé¨Îý.eóÚ•Q‘a{•S'Ã(ØÊù°º˜lÈää~½²•Ìå|j7oöñÙ¼¹Ö§¡¡¶¶áMߢËñêx@'\D†#Xª†à£ * ÔÅaJ4#fFúÒkí:2˜ó¨(Sª¢r`¦ôšö2:.æ, ³%½{Bo èÝ z`˜ÿøòendstream endobj 272 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5128 >> stream xœ¥XyX纟˜ŒŠ¨è´`{g<Õ£RëҺ׫–EQD­ ¨àÙ—„-HÛÂNØ„°Ê&jE,Z¬‚±µ¢ÖºÖíX[k­µím¿ñ|ôžó… Iö¹Ï}®8“™ïÝ~ïïý½#¢¬P"‘H²d…§çÛïÿËg`¹ {æb­¶l¬J_Ma‡2‡#›¡§†QÆ‹/ ]¶,<"2*z›ÌÇMî»"fûÊî;Wíòóð_#õ X¸ûÍMßòš4yÊÔ·ß™–0}ƬÙoÌóî¼ù)ê ÊZE¥VSÔ8j 5žò¤ÖRë¨õÔ”µZBM¢6RïQ“©MÔRj µŒšJ-§Þ¦Þ§œ©i” 5r¥fPnÔLjµ’LÍ£l¨!ÔÊ–J £†SvÔj$µ…b©W({ÊS£(+ê5ê¿(ŽH ¢“¸É(ê[ÑxQá롉Wˆ;¬Ü¬¬‡XZÿA'KÉ.ÉGŒS>pÎ@í jbеÁsëÿastȤ!_Ú¾iûùÐ9C †7ìÄðMÃ{ìfÛ)íNØ=ÁX8"zÄé‘#G&±6l0{õçWÊ^øªï«·ì³ìÏ:¼îàåÐ2Š m…BÐ#+½0¤BT'l£Ï„{¬ò@4D@ (R“ð°ž}öÒ ªƒbþº¸êëÃ!¯EVÖh&]‹­¬ÃÿüsHyœ‚°¹ (1û8£¦5Å+!ã–Û›,~¥ý`@ž±0µ³?zµÏY¾e‡,†;žœ3JN¬%'¶ânóOסÏû gúqwÛ)½VêÁáXÉËŸ¢‰=•ÝÖ‹ô¤#ö6£@ ŸúS˜š:ÇvßMüý÷ï~@vÞ„g³KV\}ôð‹s/~áB#ÐÐY?ŽqòÚ²'‰o†’?g¯g¿Eö~âØÓ]]†/õNoO\¾ü½E;ïvpfs7õ¢Vª )rF³{¡*@ ‘2N&‘Uì<¼Œ'rœ„GbÛûèrk[¥ŽÇáÞ’ø¾Ú£)¦â‡½i„Ø5gÏ]¸âòƒï/^¼~µíÝœ©ô1zäÛ™½á"‰mje‘=í²æ&¨ÚËÝ‘˜LËü8l|QúFZMÍPYΓ4ª ü9ü?t¿ÙºeˆùJI7çæ7ñ_KúýwÅ“án=I»¹]£@´šEƒï\º›Ùœf×¾´\`ªJË*Û¶•nxßc÷/þC“±qæ^ÅÝ -À˜a†Ù´ÉD°éE?Ðë†c$¶¹¨E¯¿<¶×QR¿[•9š†ånóc¶·É ëKzT¢ ³…q½¨ WEdp¾Õ^M*6+r¶¿Ouð~ß$¯O¹•ðaòÍðdvúûMvÝVóe—RœV ñ(š+‰…È}Ú|h-áÚw|’Ö ZȦàW9ÀT–—Ô][ðBOûWó·)±zÏñCÛ‡•åü6H8ügvsAöì¯9‹–¬¾üà‡îîK†c«Ö›ùm !v¾bû£! :.¬ÏNe2ÒdµJøŸÌ؉dD×%æ‡îý9ö̶×úò¦A«9Ä ù•’^óaÇ7c¬²G–A§&ÕÊOô1ÐèNô¡ nT~N,LGž¬®¢Îß“~f&ǶØî©#ŠØcßÔæ¤WÊTÉq*>lµKŠ fƒóç‰×u'[t×Ðñ9üº™Y˜~ÁÖi@u${[žEG£ê°3vŽ Ámø¨.9#g]jã°7Ö²S!²:±=á<€Óð\*<^ÜÙPt n@“¢xv3̇•°$®Mü 2|2ô#$míbøù¦qÜ ±hë!ôõ‹ÐÄ¥çíl.­Òî;½âÎÝú·v‚yöý„»ß²yæ÷ßê“z½¼”Þ+–Ô,F#æâwß<\ò ¦yøWZ 6×*„”V¿Ñ?´-]çáýþ$þoÆÃ±¼ -ëÒw!Ÿ.Q·­1|xZŒ<>c^pª\“••ÇWÄ7'æÛ‹—ïÕ¨£šùÚâjM‰:'°>C Œ¶&¯¡<®yÜ;Uº—Vùç3u©ÓŒÈìûvñ²à´Ý ¿²à¼$ÏÝÑka;3û©¡ËOÏÞAcñRr›Ínð>zæLûÑO¶yyxlõZÇ×㧬£ÓÑö’ì–ƒU|UI\æ>Ó¼œ¶8òψ>º~q‡@/NÿåÿPè½úžÝ=r57¼:"=D§ÙΦ†Spйítâð‚¿j$²èL8qƒ(¢Fh ®Š"óq+,… rÿÒÐÚ8¢½ÎU\8P‘T¾;=<)9ÍWGOwCΞ~DBB}x…"ŸÁL#ë„‚.Óßu߸q‹û”þqúíÚCðÒ)|ÁÖDW„…EG‡…UD×ÔTTÔpx~íówÜi Ô4š£ž€îÒ½™ìï¨gQëY±àÜ·E¥+·)¸m¹~„….œ¶ªe{ŽŠ?²­,õ¿Ã®Ä”¥Öï,ƒ`fíV÷y3–¼ŸÂe”d”í˜ëÕœºÌ¼#Z®së…äV¢9­/ý㛋[¦eñ¾­²¬qÕ9Ûó•™>%Òøˆ9Ùññ…+'|gqYfÂ>‹I¦ã>vÍ#‘÷¼4r÷ç‘WC)l{¦Ò [ƒw†øC8‘Ìáê˜,¦n—G$-ùh…\AÁ¡v¸ÆË$ÏÓa"ÎZe@Ä\™éÈá%r~¸i8›GÁÇhTr“Îfü‡®71‹­^ô;!å”G: ²n° –qæzµÐx&žl~5Ù[iþ壥·E]ÇY¬gwèë_ÍôŽuÀóÍY™1]ÈÒ‹®Pé/W]…jlÁ9ø1E.kׯsíD‡×Iþâ¹_h<äö¤'On†Xˆ¢ÈÞìõÍ7<Þ¢Km{”ØÖâú¬Eléþï'»cü P[ ÈjšŸìÎNUyhxC`2)£) äÀì6W<î–Dö}ç¹T ä‘›äΓG÷åùmæ°RóÜÿËÿ§GˆstÂ(² E*V¬6'?J˜òm|²2%MÅañ2اù*Êâ‹bcãò Pª38u´z5D`ñ{•F™ L|ŒB—Ÿ¤UñˆY7…*) âdeŠâܼlM‡Ä2\Óc`;Èä%Š’Ò⢲ª´û°{²²:6rÁ¡¸L[®MÎOÊáÃJ<ë}tÆ6[ÿÌ‘ä?„ÔwÙ³aæï ؉–&'ð¸Jsöìç“EÞŸ93W‡æÐ¼Š¾ò¡Z½A5ASs ñ©7È®ZMDÓÆsx #I€icï‹ÇÐ @z¡±¸÷ë¯CƒµÕŸ£z ›½ccLRz\ Ș„’˜Òº'#ê¤ôÈ–ÑA!ÒšðÆœ\ufgŽ@N\8öìo}r²@ŒãŽØÑâÚÉ$¸È«¨Ö ê&·žZÖìøyºßQ#¾Œny!k1:ßÅ6‡T„…ì® mh®®«ïu@÷,¢BtZ+Ö?Éjr5¹Ëèb´qQʘ=)þú·´ä´dHvˆ*S”èòJ ³ÍdÚa@Iò·åÉÊ Èžì•"G< »â•O°=¢èG4 ¹rØ—H”ynhrDŽ~º|ùÂxìˆ'¸aÛy}*™ÕÿLJ¡$y8-Ü`K 6(F•” âd[¥ëÖ¥ÆeD¥C(S ¨ìj;’©ázO³øn£27ö4SW;ÿÄרœœ÷…°ÅÚ§÷‰DOºiTe ¦ÏÚÖ’–³·²¸®<9'%‹+>ÙÞ¢æî•Óç¯r_»™Ç!xMbRZ(Œ68ô3]™CöÎF×§u£Â9¬2ñ Ê;‹¼õ¢K_£\b0bmwZë¼zÅ´ñÞ§Š3Õ™j5Ÿ•«Éƒ|F[8ý‘+²Evw<:|iÚ!î³CuŸÂ'Ì•E’CñüM‹¥5{Jþ•*óAÍ5ºYLwÇ®ÍA²Ùo$ó;ÓcÓS!:=%â™ ”‹"$¡¢{è‘XXdLb|q\brJ’’ËÈØêJPe'ç…4Ê´!àÒÐ=Ê0YD È™¸âø’ÂÜìü„’Ù¤²mÉ¿¢Ô:¥ãî`}ÏÜvîhÀóÕ"ôOº99ÏŸ‹ Ã!%C!cðüž¡, B¿Xã_$¦¤~¨G³ô¢û½²Q°'ümîá":@© äq…$ÂJ³² ò¸†–£¥Ÿsýø{ï½»ÔmÖúu5Çä|VVn.q¼.¢8&) eû¬ÛKÐ4äÇÈêé¢'˜‘nQElãg¯EЪµ>%Ökx=LÄJpaH¯77ªI¯kзÐJġхdW*bŒÞpø­VGôn?»ú†¤®šëC†ùèE§ ¨Š ã.ºÍÞ¬þè$t1·f_ÇñÀÙóç¬>¾þZ7.`Ç2XÃ8~7ÀÂö»{O:w^ü{·¨ž·æãSúã×®é7y®õØ8ŸÇç¬f¸}vîÒùÓ·îÜß_ê²zV/ÜСœ Ñ¿(ÅUê΃{âQÿE V]•\ïià›¡ÙXˆ}íÕ‰êÐ:ØêZuƒÜÐVVsÜO£?PîÌL-Äþöêxuè>¨3>QhZEÐÜ3¨Ì)ªüJ,…ÅîÁó&L"Š#X#/ËÎÑäl—ÇëBCãdlø 9 ˆEëP–|6ƒ°ÂLlƒýcú¯]º£‡9¢ŸÙ¢’))Yg‰à‰“‚4 ´<ú¿Å–4CsS (xü;°›¤¡™hýþ逖XäÁBQrV|æù£1ð5¡±hôãâ‚\c+¤”†‡-^íâÅ­™<Þ,><ùȪv×Ë+‰Æ­Î.Ë·8°‰4Ãc24àºìé’Çþí‹Ï=¡ŠIRä¦ìUÝ4£l oáñxÌ„„$e $0I91U5_é íœþVí÷ð cË ²’Û ›A`3lì(êß¶g¦ endstream endobj 273 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2327 >> stream xœ­•iTWÇ«lè* Ë@–*3£1£QÔƒ‰Ipˆ  .¸°iè°¦êvÓÐ(44Ý,M#‹(âŠ"‚(ãQ\âÄ$ÆÉj’a^19g çd<3óiê}©÷¾å÷¿ÿ{IÂaA’¤Ü'`Õ¼£/nt¸8˜_tÚ? 9¹]›pr"1úMÙ–”œ’ªôOܬˆ‰ ÞúÚÜù¯¿ID±’&VkˆYÄ:â‡XOÌ!| ?Ÿð"ˆg7âYb2ññœt(á@ì$ɲœË¸øq7dz‡©ZGwǃò‰r½ü ª˜ºH?CóôÐxpr \E#ØÅ©fòQ7Šî–‰¯£³LWÎçØiÑæQ™¬ðH޲Ô¹=y8ÜDÅhó—± Ê¦o»´:ÀÆŸrù½Z¦5´q(„ú¦÷òÀõ¿ ,ÖüïXW1Lc½ÌdýÔpA&ú xMžó&19gžŒ'=œ…HD>üMbqŽ`6BÔ¾Ô¶”Ž‚^h‡£úÓöŽªýmÍ]Ò¾‡Rl±MÁ¶B4˜¼!iS„*hémx­½açZÈ»QùJÆï0cw ¤"&wýÓ£/Ñ‹h’×wÓ×ÇG%q×(ìü¯'$þ—g|(3PÕm­E†–ÆS@_;?˱|ÙœEEWžHävÕ@1˜iWô×1À?v!ê’ ÍDÙÌwG¾þÔh Œ,(sÛ­9e5Æ}Í Uq‹ãßÍáDÊ1ý±—nÐ]P?†Ò' :8é %kG «Èºk‘¡Yâ« šjÇSQ€ZÎO‹÷&OgÜÇ-” °¢Ïµô]gϪƒ)ßäM‘Û¢ª°+Y|©õŸu€Nˆ‹™'ÇûS Â>xaîÉÓ,ºKágF/vêAEã –B„=É´«NqaÿÕ’jZ7GŽœKíTÐîâNýr2ÌWEÞNv¢y’hã²NXÖ¯` B‘`Új35ÚvXR¶«2·-í_q÷ÖÕÞ{eœÎzh¡Å·(¨„}úbƒµš€¶S<,áS 6A¤^¢¡°Q·ôÙq®Ãžšjñ;‰zûdâmô-Suî°¾B'e¤ ÒDÀŽÇT_©†Èåwó¹³qûtÔÉ JÀàao3k§RùHØ.E( u,£€¯^Ý_EGóMÒÕ ŸÄn—bS@ q6Û¥¥ñhq7ì*”¶5‚A_Tñ êqÿ÷ex#x”@a¡ÁDúÁŒ2ÌUWo›ÉÃýhs÷IÇTÆÀE8Ù¶eÄÞ8 ­ ðÛÒÈ›jKöÕ©Jwh󡀫þøŒåЧzÂpáT¿Dœ¸ðóÑäy~% <>:‘Ó¯cÀ…åÕmç{‹¬@7þ’WâõR?Ù¾5¬¬/˶Jô,Ò1*n¿´“eŸÈÄç%½êú;tå£ «„AiécDè’@9|~~–Ô)jݱ3êÈ/“Àê‹’ÿVþÿç<@zépçVôÒ]òç.òG˜µ5U©R§*-ªÚ«¥–ÅãñJ©-õ–<ÕIømpä‰A|ñAN”Kmǘažm#w¢O;e¢ÿ°7ctyy¼v·–Mô‹éYY·<¦/|{úVcxK$×ºé€æ³´FÍ©]{µg·7B0í³î]¯©3Σ©¹¬`t¹@k!Ãa”Z'õEM嬮ôÖC§üîíì‘7 Vζp‘ÂÊ6”åò\¾º<Õ˜RŸÔ”Ó Íô'§¯ ]|»U°…Ò6F ÷@aåƒaçÖÇf?eµc]'ñkš^SÞ¿K"/³ Í73úÝP˜šŸ<ð´Ö 5_@²ýÚ?mTª2 kfM™©¨´Daæa3yè2Jóø-t~á×È϶ Õ­… °Bãõžv¼«t^M‹M»¹³ ŽÃ€õÈ·— wàƒñufÄô켑}¾€^¸ LýÖÁ^{›$Ow²u¡i•n)xƒ?xg¥a2H;:¨Ã O¤ï ‰vòÈ”vY&¾<µz¹½ý`úа¨?¦pÈ ÷2x å­W[~}Xy|÷s–hØ ¡°¢Ò¢”›R7IèY'u’Ëxpqgp™Dÿç@”endstream endobj 274 0 obj << /Filter /FlateDecode /Length 2229 >> stream xœí[Ko7¾ ý:®f9|óT8A ´hФ1ÐCÛƒ+5¶QIv;hÿ}‡Ë}̬DÙ‘Ö±dj—ËÎó›êÃT ˜Êô×üŸ¯&rz6ù0úê´ù7_M_œL¾ýÅOÁ ÖLOÞOò0 VHaê-Ãôd5ù­z9;’ÂÄb¬.Éx=ÓRĨtuC®þ•Æ*ƨ»R±ÓØãX‡?N~œ¼:™¼dÚ®w’ "Z«¶’«¬0`2¹0;ŠÒ +uõÃì ¤´®#BK¨®ÓØJ©•J›Â)&*_-nç7äΟÕ×3BùgmòGN´Ê‹+íÌHän?ïsZw°®uoF›)#ßÒIêJ¨1ûƨšàv0Þ¬Ù¤õ¼mSÀ=¡0[¿W…9ç«m‰z«…öš„ÿÎnIú˪”´¤zž-q£J¹à¢ˆÅxaSŸꆇ”çÞÒ£Œk]"Cwýû¬ÿr •« u£v|7ŠCåIæQp£ÇëÖó)æäþ!Žô”‹2¼[v~1σû2ª;Ã~|Ÿõœ¥„‡t–½|÷jyß¡‹„7PÐEÒ£9¾ê”‹Wˆ10š¡Rö'/øA TGt¼º4"’Ž4N†V´šò”²Ö«É4äÕ>·×€/zĉUhYúÞi´­!Ò_×÷:eõiæju€M°žË– ŒÒï£>ßõthýŠ"çO…ëËÞŒ¶ eL1•éúÓË ·hK–Ã>`y·bÊTbMÅ„^1¿Ÿ2ÉmWÇ9É3¶zÛóððä€Aê*û••wîWù ‚ÙÜ®ê·ûrhI͘V¡)Þ6H› E[º.ß_¯›8èÍKºG;tü…ûŒ‰T\z|qY%\›òÒ½¼èñÑù|ÐÛáüâ…É,±³æ¼g°Ìž·•„A(ÿ ÆBª‚êùب©¥3©äú¡2ðœ5T ð› ¥:PEÄиÝ,ñ\Fl³k ëV¤¤è–)Ïûz#®b*rü…¨ÛÛí<¸þP'ÊS æ€sáÑÓ㯡\Y''ŠHí~7p#ͽ‡îª^w_1XŒò—Ò« >¨Â•Îr­»ü|Ë©ö« iBêîLaîS®Ï®ïÑlƒ.> stream xœµyx×¶õaÍÐL˸3ôNÓ{°)¡0˜bŠ ¸Pl¹WÜä"KÚ’-÷.É]6à‚MÇ€!„J„„Rî=cŽ“ÿ?#ABr“—wß÷>ü}sFg¯³öÚk$Tûv”D"‘9-uç þ«ïvœö2 5Á:K¡sû¾C'ö@'º£Þ]›»Qâ/—9rGÿuNnsçÍ^ò^è°Eá›GlY¹ui”§³×2ïå>+¶¹l_¹cÕNWßÕ~kÖì5–Z@£Þ£¨…Ôxj5ZLM¤–P“¨¥ÔdÊ™šBÍ :S~TjeKùS]©nTwª¥¦zRoQ,Õ‹ §Þ¦ì({ª7Õ‡êKÉ(†ÚNu úQ%%¨•)ª=¥–t‘$Jµ n÷@º]z´ý€ö¹6´ŸÍ§²º½Žþ…ñ`;ŒèÔñÝŽïwRtvé|¦‹]—=¶6¶&Ûï»îìú¢ÛÒn¦ît÷kz2=õo¹¼UÅ®a÷÷êßëìÛÓÞû¹]­}€}ªýíÞá½›{ÚûE›>ûlès§ïà¾ÓúVÿcê?Ò¸ñ\%?Œç[ûÅökê/ëa@Ç1®tX5hÇ`AeÛfäaæ%ÂÛ­KØ”\uz Ä€Z¥Ü…½ÚžÚÅlñ\¬aäô9ö@… usçfz³6ÈD~N>ï0²·CzÙ)>­3‡ãþòÙušjƶu!âªí7Kw }ñHz u6+7Ò×SÞ|[í­R8qár¡³ ±|s×ñSÜ)Z|õ"Üd¾˜p¿Íáùø#éè=ºŒƒê!{^7Ñuáš)XÊÃ_±îêŒ=<2£eô7Í“gMsž3œ·b%‚ƒQR} Uß’ îh‹Øá?`wÕ÷Ào=‰d¨ã³oQïÀ›XoØT(?pHóì‡8Ws¨êÀÁÂZØû#+=k6Âð†m°4pƒÿú^ÀXN¸Õ†Tõé©ð­ð»çäáÜÀ˜é•j5y4:‚…œ6›bƒcÕ*Å.ÏÄUص$g«S!ÝÞT‘ZÇ™éõ4ð'Ÿ¹l]ðä©J|~j‡×½FHVª»G6Ã=(³`N;ª³ky´¶m]fnc–´<‚+¤­ýZg²Å W$kÔŠdÎmÆ¦Ó jÀ/Æäã·¢ x,Zˆ¦k|ôI¦4i\bÊ®d`ä¥ñ…Fc^eu@•Ç$ù˜ˆdNƒ¤2ÜûOĨJw ª¡>z¥x"ùsêHU=IUÍä·µªU%Rá a[å¿oJV¦ûм£¾³å~ôunt_ÒO²wL¶–;Y±c47e¿*·» óê|ÜŸ”k+ôR…IÅ’=‡Pä!)º+L·ôYbDhBç[“ ØÅgáªxØÖ°ßí¿7ép©ø5é sýÒóá,Sc:üIÒßñÕqÚÄ H&ôÅ”¬03Š5 Ã,Š0ý®´•Gnì¾4ýE¢6êùà;aXÔ¦†þ25·_Lc~;1p^ví#½¿âàµ?.Áó*8]üo½ô›Ê"¯s>5ŠÐu!‘Žqx3Q–ñDY}t·ôb=_¼sÏŽL`2!½hF7"ɽÍhŠQòÃ%Ô·DŠfCXÔߌû£%¡2ÍhŸ‘cULøç¸†ÆÒ!'/ì9{?tí$ßì¹qÖ¡z‰0Øl9ëw¥ÂáG¶>5û:g4Ë‚ÕSANJ›úJF_5.Vàd×óÔoíMh"êlõ:ë¤Ê®çQ1:‹ÿî)¢„"}_]ô¾àȾfózÒ¦¹ïNU9É¡ÏhÜ_äù-P9ðx KÁ§zGY`SÜqrâ»a¯Ù\ZØÀŒ£Ÿmc¦$fã‘@Û¢¾©¾w¥ÈÏ ÀM®D,m")Ìœ¬µ´úæo¥½Ë…Š›þ‚l¹¼Út(ý®uÓy “ÐÇ,)B¤Â(ô›URt࢖ 3¹:|! ¢a£u6íWëý ÔJeÜ`œc‡Û£Ze¾@o_ÑÅ„`Aê5dúí ~ÅÙºä4d§äú¢ø¥>F§Ì… H×e„0㹄8³äøwh$™£Ý„‰4½ly‹9§oÐô+‘¦mî´Ã†å®aË3ÏøqÕÊêb¨cÊv•o Œñž{iéƒÏŸEíUÖ¼*¨ÕA*|O *¹pPW$¤Ž$ÉÉî\­»;¤Î €Ð@RŠb .°ŠêÈuj_U&²õòüN²b¥uEä©sbõɹ;2Â'a•ÝHT®Ì#+Òì+÷Á²÷u²b‰uÅq‚@ÎNÔƒ Ÿš”Y OÕ>G vÏqƒ~—^•ö9š‘–ÈæÅˆ¢ å÷Î%?B[.Ý"¢Ö Y¢øîû¶íÞ”ïÌÔ%®‹ä†˜Ò²¢¢²&ˆæK÷-næð^ãø­4Þ¨š=f13¾:÷á¡Æ£.mCñ'¦3ùŸò§CWÒ.Á‰1^p²€[tŒî¸ÃÃmKÝQd‡fåÖé~ºß8&ô&³…ûê ‡þQUuGg!Fl‚@X!ÖMšâ…褄Ð0|µC·èc9ðÁã=G–n|[퓉¸ÿ±—èÉñpLt¨¢ÑR\–œ–¤SÚëR´JHfü}`—eÕÇdU4C­u•+DéwÇ+™<Ì’l!IŠö xÖܰ¿Å`j:|$c·hÐ<ˆAó/r<ë¬ÛÉS&CD%Ä''.žf7óUZrdØCº¾¸ÚJšµ¿§ôq0¨M¨m§S§% WÍ®ˆuwu÷]}qõˆ‘ÔA³uoÁ©)…™Ùy¦=Me5÷úÙ…’7&Cbâ®qQ…îì{È¢³ÖE«!R¼›±jÊ#ÚÞH¦)*&vkzë"Öê¥,ÊÒö´„NˬjNË(õ>àõ{ï%]µ!hóv^çÊB1èr ËêšSýS^õžbs°î»Õw¸Â¶Ú¨ÊX¤Øšè \¶øÅÐXÜ;3Áj„½t.÷Wm–ÉÕã‰åõ‡¿Ud¢ëñ0ßâÍÃM©0=`+/Ñà•Ìì$GðkÕ«³BH¦!2“¢ŒõvXŠÊ“óI*ÒÚWÔ‚Ñ2ÇÜH‹‰§èb]r2•y¾hx[;;÷þ NIŒò ðÚŒoD1ðP›V[‘¦{Õ{Ÿ<ÝtìB¾Šd¾×bña›îKÑ/‚Œó†-ÁEQe¥†|óåyG§áï C1c6È®uÎÊJU‚F§âCçºú¹ã<í$…¦}ÞÔÜp*Ú³”·}ɾÂ/ŠnHQTë(6É !%2x̯ÞDKÀ†QOwÒèN¾öt£àH%/ÐÒ(ùçŽD3³Á>‹DÂô”Òjk§m»)û-|jÉŸþj,“H¨z=óðY(h4‰XÞö¡©J{£¤Rh'º CÙ¬Q¼˜œ$ˆâðeb›ÇÛœþ½¡I“Þ×ö›H”pèqÍKˆkNÀ²¨õ¸“èvdoÒ“ X|AŠNŠÆùÕÐ ¤Ã̵ÎäQfèpüîùt8jwë`³!ŸŸO£þ¿Ž6áŸô¢¶,9tULhð¶-òuÀb*­¾žÛX²‡7Ö4Ö4Ãy¨Ý”½+7Š{ä!¬o™0®LŠÂZDZ ym(ù¶ÑrÙ(‡Ê$¦m-ÿk˜Í¼PJg&‚:+NèÝöÈ.;F«É ­KÓêá*m†#O-t[m i«!ÐJ·§°Aη-¤­ 0 'KÞLøƒ—¦³s*†~È—A:ÔçñóŸÐÛ#±t4}%Õìÿ Ëëä[òÃt*ÌeývíL Æ#z_™Ù´·á}㆕9üëë'Qþêj"l]ãËhÐ÷²7§™é÷ Ê3ÌD¨xÚˆNY©¸ÿñ·&©0 =f¿+ýä|Â<Ã6÷ñ Ÿø2¾¾u¹ÿ{u%­ÅÐû >¾Ò¯ñÇóaô(ˆÞr˜ÛyL鯀d…†W.“ì„ 8’xR“‘|@UžÔœ²Û¯&>'°rU3:—%&º@¥kJËÒVƒ˜»è-À#'lXŒ{‘Ž-#H2¨ç3±c¥ÈQhc+ÂJýCÃüÊ"ÊjŠ+J8Ìag"º³’‰è–ÿÖGÉæsà ì}uS˜¢ßÇ í‰l5†™[ÇUJZΠëg¤ÈS˜È®ÍÛÔ ™k§/ÜFSJð$tN)Ù¯r%ÚdÉ~ªˆMâv8¯?¿0×d?é4‡Áë‹Üë·òµžµ EÖ&žŠÉO>Rã +™wWϲiiÎ7nʼn”ëš=Qi_çÝM–¼›®Õåfpi™¦úÌ‚º­¶AÚþîSÔî\È¡€=¼÷¡M9žÙ ‘-b ?b,8l¿ÿˆáN€¨6û‡…–„VTÊÊ8<ÔÄÍ,‘JƒèUñsV¨}!?„«Ðgˆ·)*ŠŠ ^ßxâúçqB¼xƒF& µW‚>$i¹ë4¶í™,Òr”²ê1OU©6ª´q´™éí3œó‘Ëvë~€}äó#ì¶ ìC‡ü½¼`¦¡\—U˜–©3ƒÈ ²|ò±ƒåAô§²Ý(X´s¢C-fA›” ZH½Ð’™yõìA­Itáê@â©ÅÎ´Žœ"MnìbÂÃ#5&–ÄF£ÿ´oÄSsÞQ¨z£oþI_<ý æ Â2â!Æ>2FF-'¦³’xUâW­xäß$ÎVÂÞÖ¨ýÏJÑF±¸ß¨©£— lDNœðÖßFj[FÌÔñwPßçœ`KŸûÄÕ®d”ʉçüm˜XyÞjÓh%ù»°¸owÌR\óïŠ÷kj F¾¥R wÙ¬ò¢ƒ·E×Züþ²Ç5þNœ·:9/kSØáuB‘RtA:{s3”["Ël²?Xð:²œ‡B(ØŠbÛÚ,!6Ÿ˜ymªb[O¿yË.Ê\ëæ?ÈÜؼl—gÌ'®%KþO/Ýÿ'êø2Á [ÑKwéËîÂ=¶ð¨Ùج}“Ü ý\_CpNS¼“À¦T%ª“ð¨6¹ž$€&UI²rõI(³À6‡À&'CðÕÁž„|UNdFl†ožØæb‡'J‚ž˜¯«C…åú{¶… ¿®i!ý’ë…ÜÚ~±ÓG§¥dA¦˜– Ð4¡ÐMo+ÔGëU™¢NKÓa(éõ/ê%ˆ©—¢TœÊÖxéð¬÷þ%š4¶n– 5Ö£&rB¿ÔK…h‹Ì²üb(6D‘ØŒÍâOPQÑ6c3 ‘EPÀ#ò“,"‹‰lpÖÖ¡uý¬V¼ÖD^„¥ óÙdPhÔâbˆïì€ldß?hø û¨f{5·Yå//‹-*.Ë­9¾áЬ±¸ã:Lñ˜þƒ‡ú3J£»h}8=v +ÿë'E='0¸šÐ»dD8¥hM {>lŸ§<"40ÀZ]“¡OçRSµDdÄ(.sßȧ¨È¦S¥^©ÏºuÑÜ`v$`ŽiM`qoïg¿8ŒðF½e¶èZÑ"ÉAyRT†V°-8Ï• ’”e”€#ÿÅÛbÂÅÝÀ3ɃgR´ä[b ’‡‡ù•G”V–˜ª8Ñ®¥š^®4JZ„îRÁ±u«/PtLž"=1V•«äðÃ_•±dV¨íã3sòR³sÒÄ…aÆÖÞFIÓ-”yK*¬B³p_y×çÖ–ûN%n°æÊ½§ø/Q,LÁˆ Ǻ¹ûf_ > ù„ùLÝMÝ·p†Áø»G IüY¸EŒÖ=¸QøAÑåã5bh?b˜˜çBúxfÇ;GàvK"¶‰÷ö1„惄JþW¥¨©•eKAάó$Á—’s9UÁ´Ó>ª¸ñœ¯\V©{Fýø*-çåKWåwüÒÇÚKoéKo´_¼ÃE$á#ôò ±â’cOÐŽûRa šA’·**q•bWR‚ YbÐd•¥ç.V”‘ÀÙïô øŽ„ý±Ÿ`¯ ›¸ö ¤š* vWEüÔ Qq†+-‡/óù‰¹c&¹ÍqYL¦.³ $â×…U~õ-\†º<º\&¹ò­%&} Âl”&E ŒBOÔú°ìó†y#ñÛ ¶¹­ŸZú¡œß­4‹·næ0£p`Œ—ÃWŽb°ùòÑ‹¯ç\YÄ=(?ý1ÜfîL=3bègÇ­5‰¦²‚êÝÁù¡É–5\yB¼7³çRôðÕJ¹ïç¾] ±Â‹8³àNð=ú¡ýÜʳÐÇ$ª .‘Ã-m>6rT8–öV+­ÖÌú¿ ¾^˜‡Ð ….l[œb­Ñ_"#âoæ%/*Ñ®»Rô–p=S«!ÑÙ\¿ŸŸ¦Ö'ÁKIàW¯WÂBØ`ŒÈLJ%[&’wñ¸™Ø•ä\½V››ÍU5)ks¤[fT‘§Ö ¼ÈÇÅS¨g;Y¼èPäÇzuº†ZT™½·*¢0(20ÁsÒ1Ú|÷” ÅNÓ¿àâä(Æa˜µw»Ñ,Ò¾¶ÂϬ6I«„X¢)ÓæÏOHÿû×Ú¨wn ÙùÆ­¯{»2Ï åK¯ÿèy , ã×÷šÊ$M÷PÊ=)É2/X”Žº6¶ÔÕÅû¸8/ØZQQ^T`>áu|îí0‹pê¼ôs$yüõBöï|5ÔaÇ,ºâ+ìð;`J¨Pƒk̺ïž2{o/à ½Éôõ NfS„WÐzŸ¨­–n 3 ×>Ê%§=—PÝ¿U–âdwu^Š •ùâ Ä¥gÏËÉL¿I&.ƒ¶ÉúãQžCðÀËíãakÓ~Ø—Ç5Ó€†—!æÈeË{+[»’ª£ÃMRtýÌ6W~|>cL>;fØLDZ۳·Wmçrbµškn#6­{™þ/~¤ïýô½Ó¡™G9Ü÷!›µµŽ1—®4]¾~q“³»ÛŠÜüÕ,ê2£"ê°/8ÛÏžµfú$Çó÷o¿áRµÒ†{Â× íÐAÇp[¼:µ6ˆK—e¨ëÒ¡ž)‰6îŠ \Ú¼ùꎺ {ä‡JpûËãq»cÌvÇ=¿ÑÐrÜÈá·&TŽ'v5CwNÃÑŠ¦âÊJs ¼æuÙ!F7˜ÑÌd¯‘ã9‹ð"Å+ízþ»øâíÿ]_ËÊç±2ª­ Û`®ó»É¢‰W[è•qíêP¯:ïöš^†Œô4=GlÑJ#ú(Ãø•QÌ«JÐdñoi« fíò`®ãÜ)¸#¶½>ýúõÓ‘”Ã=ñB6Æ19¢¹×Ó N5ÏÔílW¾žL¡ô,]*è-óA¡R*¹Å'%zA‰Ón‡™B³ùÃûÌêúðfþ’×i¥™8ÜSú“{´»6—Ÿ§%'¨U ´ÏJÌÎÒgdè¹raôŸ}/Aåu[Î'=9÷?íI±­‡>CsÁÇXÛzžÂj2ˆ(ä2ß½z5+K4B yƒ2aÆ,[ZºµÑl(©¨Œ(ñ ˆÐˆmý=o+tÃi¦—«Œ’o[¤è6&>4tQEC_¬DSyZ}MG ê˜m}UºR—;Õi¸·vHH?À]Á!w:ÑïÜùÞ"¢iz]:ѧ-ðì¾ Ý¾“œåý«%?Ü’¢¤dჲ/_ܬ2UÔÀ æÜæ›x¦–Ï[ìS™XPT–[M’V¨ùj®äÄ™²“¢Ò‚£×òȈ¨H~cè;à̬'šš’“Å\=ËV„–úE‹©¶ÊTRùFA(‚TT‹t,ÜR n+³užz)˜¥:Yê¢(þùÓx*`À«7àéd$vTXÏ(Y¯NË»wýÛcÜñïK¨3‘‰+¿^ƒ/çyáë;Ra‘x&3cu}q°ù`A¾R•þÇ‹°ºmÕë¶zEqõ+õÀŒÄí×ôÿo[:Ï¿½:ñȆþþó†³!ÌÌ(# ¢²b ’S¢ ã‰Ï¤­Ñãw†Tô¤ÂƒÿГ:® ðßɇ×n6®æL¯í÷ß.ÆëÕöˆëþña]KM½"Èȹ«·'Feï*Læ5Iä cLÓ¶\Çö“;@çŽÐ¹tîAQÿi-endstream endobj 276 0 obj << /Filter /FlateDecode /Length 4113 >> stream xœÅ\YoÇ~'ü#òƒwíxúœn yHqÀGäAòÉ$DJ4)*Vä·§ª«{¦úÚ]’²Öh¶ªê:¾ª®Ñ/«q«ÿ‹ž]«Ÿ~9áí*þqv½úËñÑW?N+1 R½:~}D3ÄÊ™aT^¬&#ëÝêøúèÅZl¶BH3±þ×o7J ãèìúýf;Ú{çýú–=¿Ûlaˆv^¯ÏïÏÒ(á×—ù q0ãhGKþtü7 Jø•ƒ7F"UÊfr~uü÷£ã/_¬q‚G!ýú yµ¼ éÙl XºÉ_ÇçÀÅ ¶ã¨€î+öLdx¯¬!~âûër =·èÔ¤¶ìôšÑyOƒÿ±·aŸÉ{ ºÄ90Z«q…¢ßØßßoàp½µ>DN J‹ƒøÏÿÆ;›¿Si§`éa¼ÁMÅú„­t¶‘8§õ›ÑƒpÊÑïqןÙó+ZGŽzý_ƒÚØQ _ýpDê|Û×ðœÈ¤âJùÁ(»š„ I*>o;åÌÆ½¼ XÔ*ßæ'âÔÅ+2Îßl$Øãh$?ÕõÝ"ƒËExPøÚùh¾Þ½×ôæ# Ÿ|Tq7ŽF<ÖpP"ÔլЋ>hé`¸%óŽóø–üÀcÂöw9Cóóe¹ x=)”üVZ‹K¬¶BZ[AêVÞ[áȼҶ01³½fTÜú ù*ÐHX.›Êíñ‡L°Âq´t|0 ~°BØõyaŽ$ËM×À¡‘ï‚]8»Òt3™¼¢Ýä(ç3™O½2Õ(ëÈ*ÉYGÞÒXg} T;p'B¦Í„‹’¼ëH©ðh3AW4¶¨¥·è„ &?»Âyv%³Ûœ§Ü]Æ÷9S¨&J(¬KÞçœíp9{ߟ‰R“/vþÕMNFÍÂðäú@ÁŒñó«)£7èu:ãà“¶‰Ž­Ô䣲¶b–4xV®ossl¸ÃÁ&(Ca&ÒL1",£ùúþ^EþâŠ#óÔmOLtL¯ã^ÎRÝŠÌ[Ý%š Éd æ•ëkPëYÈ ËÑMÀ,¨ÏH>‰pc®…Ó¡r½úµ£?a¯ÊÊz–ùŸŽF^dJ ÜMs<,¬Š$¾ëô ©ÀðNÄ!tè„ËM­ð5Œõ˜ÏKê®]'É3k_ŸäAÝd2Ý“.×ÍçÑ­€‡:Eî£òâËÉb8×¹×Dd`HåÈõïxg{SZ)L§˜<Ï¿ÊÐwžkùp·þ°1 ”íûe>‘ QLo0âSÐò¥ÅÒ.QÅ2»3d ß fܘç÷É÷%G8ýû2 r]à ^œ’ôè̹¾/ý̆ª<^ïÀ¯f úHû:ð¥|pîT»5ÆÜÑ’è‚OèÑxÛÕžÊñöL³Ø.l¯÷¡âÎìô8dô]F#h·ºà`ØéZzBŽqç2ÙäO®——ÙTŒv^oPE™4aÔÚòC0óõ×;™vÓ9нŸ*ޝä·_DkøêGëxJ°Mlç8öüÕFC.àDßâ#h-’j“€X_‰fR¬Qüš§µm_¨<wGv€ÑOÁ»q}F¥o›h,·nd¥ôƒ¬DÔëƒòè´§ÃÑìûŽ Í8³¢9^E&S:Ó³á !V©9ŸaHânìû® 7A½ƒØQĄґJ1EÒ]XE‡‰BB ·.d.fÔ1êï°ÊÜßœÎ4 Гö;äö¢¿$i¤KàÜÔ(3kň­² ØZVÐÈÊ ªªÚïG npž*AgÆBt ñN‡Š†2Ê„Øa»*Å%àüšg绪ÊßÏ’…õ)W%‘ ‰š—ÊËŸáÂQéØn l páC³rÓ÷üµª1J‚æ">RšáeÚªVú"¢¬œ¨q*SÑ/v4è†T¶ÂM”NàÙênü»Ó_2JRéHxƒñ)`vß;+ª7•ÇŠC0“i)`^õËÃͤ†ÉLn ²) œœ½¡@cFÌ»û·çÍc±påešÿÐ8_6îî„uueK)BÒË5[íLУӒäB€àŠ£"qƒØWŒž¦­à£€;$«Ö/_2j{áè¢c8\ÏhMû`ðÞõÃMWúrÖA[¡‹þ–yKbG¹ÎÉ€lnˆë{4µ4Esb˜ÆÌZ¹Õ 6¥»?eÞ/ä‘áEÏ«ªb# ,¥uŒÍ¨À0 Š_7ÄÏó‚rŸÕÖDÜ剅 eª¤ÇµñœÆá‘|†ã~Í×È” -ýPø»©Ì<¥œ·¼¥-Ñá]—ãÎËòLY' ¢”MæŒÝw„VÙôûPÆAÙ¹ÎÖ„FSž<·€Do…¤]÷ÔÔ­^q@¿Íp>éÆ xå”—Ý´ïkpùf"o0i–.yÅr´ÂXÊ")F…IÒjGøf ÷rû3œª(6{…IRû— ÀtÎZH#?;H+J´ÊD:pd›öõŽ~6îSà·^š…;ìŠQ"r¨ùÎ>fáòqY8IºD×ùéÈ„(<|ìݵ‚ nRÕ¶K¨c"±—ÇDn©0«,©HO©+ôƒˆÇbŠ'?-´S(ä¶!»Hh‰Ø`ž{^éÿ ¼6u¼÷>¼ÖM.L¨Øv%ÀbFðË’CªyùU黄û´ µªF„?µ“¼pr¢ŒÏâL`hÚ{ Æ ;GŠ,ãIÌä×îx%TUnÈ-KlçÑP©ý$øK pw&Ù0õ!øEar?ûfº#L÷â®Õw„¦Ùxu[FÔ÷Îs·’-®Unš±Ž›5aå•cŒ›ÎN½·%’J>)+/h/JõbõbrØ[LØqçƒË˱º~&Ö!ÄþF¥o-B•`OÄQ¤±›W¨a¢Á‰*ºÿLí"¿wRØe&D7<¦……>‹ht”×KpG5”8Ö/\aÍ•2GS{¤2ãø¦2»A³^ªPo¼F¶×«¡†ÑƒpŽªÓ¶™ètÓ1è ¬jƒ¥Ž|±´‡sõÝò!&y]†Àž±ýùnî:q‚˜—utÍ{~Q3‡E³|xh¶¼¹¹gbkIZ"'³ ¡Tê?Z¬í`ĬÅ;®u‰ëÜbNpIå¥YÄ’yœ–%€Í ~’E•›»ò"Æ5-¡è#™Ÿ¿aã rÝå<ÌŠ&ÀƒÒdF´·eïù&]âæ­È4´>,¦ÅçÊ Ì-°ñyè¬Yµç4Ö¯„÷ú¦3æ`ár­(]±Dµ´æºLJ›}¤G$š¥ýw+!Lˆ´x«ÝãKQ¡í€:“ þ²`¹FrµŒ9øœ‹šÝ½‘diÌÔ…ÿW´6Wê.¶ªºEÙtÄ~d½E»lJ©Ô‘ªè3K?ÿQù„JÚ“Á'5ˆI­´Û¶–:´}®ômþF,#§|é,ÁzžîÕ)Ê,/Ô€T­¥ø€OÒ6Î* ¤d|RÍÅç*p‹õ"×È¢Òi¦n· …0å­H=Ý^!6,`U«mÍv©¿c'“£+½}hµEN=mÎÜ!7úe «£^­'TÒpe+²"HÕ›Õr¤ËoöÂj)åãíÕÔ æD¸Ê¹`^mÉL¸Aß;N)'B׿ƒ«>ÊX¦õ:û‹;¸¼?'ˆ™šµ>ÌÝÙó>­+…߆þ*mFްŵWqYr[ZûHŸrãTõ·_Tmã[H¬õ5ÉÍü-Õ×dỨT˜«7XÆï¥n®â_D¢檘{ÑÜ>¢úk¯Å+´ÒQk莦"œ.ccÞ’™–6ìv©#\Ê(0N[Ö‹lj@_j»1Ã8‰âi’,¯k$€õËvÙ™õCvJOÖK}fZ!Ñ ˆ.?ÛzB´Ö' ¶Ï–.¯#wñRq²™΢n—fx™²) ñog‡<ÿÖi ùÍp¯;ÖöVÕË”œÙ$fÇñùf <… £û±ðL2Óp¯{²Œæ#xâWôcsTC«¨rqÎIZ½æ8Ó„bx±Q#ñ¹¬‰ áð4'¦—(±±ºc%i\vVäÏ•P#5ï;ÔWþ¨ÁU…œ[™ÕN÷ª\!°SvH½Ýùûl‹Bx¼H‚„k6G¿þ#{½]li§—~½”¼`ãŸ/Â=ëIàÿ{¯6)£ !ñõó…þš+·1îŠxy¦W½ågý±¤’“ Cwú³ÎÔWn ®ÐÑ<ëPvÚÙê[’´ þðS®ªø…¯oz‚k¦´;ηñ(;:UP¥ùŒ¶‹ÅVkgÇÞ<ê8W¯ÿ»XõÁGºÅÛbzGšòËNŸ\|þ²³SïˆØé>ÐǬÿ´H¸g xèzÀßÑmί?_ ¥rûMÇYä,U¥*-Ò×Ô.@VÃèU†2ëðG-£qhÿÊåŠ)äÿá†\Ézš8ìZ¨QÕævµØ’ûÝÂ*t³k¡† v©ì$ZúA®ÿàåkem€Œjµ(“Ž4zÕñk6¾r?ä~«PFªº“Ÿ=drÿŽºJòrä¤È×q‚Yhú̼’ºžûob?RŒ8w§q—ÝA0ÁƤü¿ØØÎ˘†JV7] ^¹}pCv;Žwýú“ï!™ÇÅXØq4·|Õ¾à5;µO3vrÿ{^Mè9€þƒ<ÇÌëaŽ£Š^aÏ]žãwq_2iö‘E]¸YÎ'Éà¼#ƒ›ÎûÜ1†ê¨÷ƒ›š¸•>+9­Y:à_Ûjî·ï4”_.”’n¾Aà³BÍó‡£ÿ³yO–endstream endobj 277 0 obj << /Filter /FlateDecode /Length 4377 >> stream xœ½[[s,·q~gò#¶òâ¥K\î@cK®¸”J$³Ê–VäîF{áᒒοO_l3CRǧRªÒÎF£/_7z>.†•Z ø_þ÷îp5,®>^)z»ÈÿÜÿq{õ‡ïÃB…•VÎ.n?\ñ µˆn5˜¤Á¤U°fq{¸úûÒ\ß(¥ÝÊ©å·×7Ã*¦U\îðÙÂsJ˃x–ïŸÅóŸÓ08ê{•‡»aðC\ž.¯g|0ÕÄÜþVi¡Ô*9§‘cãW.Ä´¸ýöêö÷_Þâh= J§åø]nÄ‹§LÊ&‹ïÆ3?~LôS#TÒÈ›ZñoѬï× ©-íé„è–{œMÄõ‰DAÊ5¬È÷$Ë&!–Î>¼¾ÑÂÉËx–K¼²g£UPB6’‰²u^Ì.ñïý grâ¹óË1Dnêçkía€uûÖÁ$ÅOYª)–P1ÌVÎ$PßÛ{PVâŽ6ë@u¬åƒÊu²mu`Ï”áH­nœ”ê/y[ƒn8ýP6àg¤a£Š-%%ï\Âé0Ã+–÷b«•áÍ®à¸Ç›²ÉeWÖzÅ{ý-J¯=¬?¼ªõ4¤ÓÆ}Ö´JyöÀ4X+‰ZÒ¥î=‹1$Î9ÅÜ3)†FÁË©o¿„•-Ë9'~íR>•¼cG'_ÙÙð‡¥Õ‚™:$©Àü‚Ò€g8|«ŒCÆŸAB½¨+ÃAFèpI÷•‹î}ƒ›Ö§sá#õ ó[õ  WQè+lÊÃ[Þç}ã ¨lu‘ø÷“¾gÓóÌcUD¢Æªºë‹Õ<ï§Us¥ÀfTœuo#ëNMæ~jm¦+(ñÒÿx?nÚ÷ì}³úÈ%-ràñ€Ôÿ‚ÓjJ7ãŽìàPR/Õœó‹ãê2‰C0`»2ÖS¶ƒqÀ¦†ú¸\‰gUÐÃò?IU¶,›”håShƒ^Ê÷ÇkZ§Œ¦(ŒÉ¤`´© 'Æï£/A,¿/àCÛö½Ï~øIø¡W õü0Ê€r¨/'eV<',†‡‘gt)ïèÌ`È×ÅÒD],«êÁŒ•¡FO IÇúÁ¿+fjçB£E}èDî€ÖtèT)àÔÉNbzvàoÙ:fIKÚ蟅‚ã^~=jîªÞæÃ›ÐÇÅŒ¼/Z¿öÅûn/žò„Ä-<6!ãœu"¦×NÇ[]óbn Mì. yèHãföÝ0©UBf¸‰¯o¯¾»âÌài>Y  È( J& Në•Öq‚BÊÉ‚BòÈ'+ÈÏSnͪÏC\;"“>e{ˆÁ1ÚBG&/;fÇZ2ò¸‚4üàø˜²¿Dö QîÕµ~ì׺Ãã—?‰#”æ+íLª„è¤÷—ýóµ³ C&Άð9+ý±×îQ4ó¤œÓÙ„düA8 9æž©¤dz©27»üWdâ×pŒ§Ó6É‘ùÞÑTî_²ª•‡$6á\འé<þFƒ´ƒæiß\GtÎ4JB5&R'éþ:yÉE]¼ýFèÔW@Éç1VÀ„”ÑA}C/ÚÓWsùåûMvÚ°ôF ¼ùÊûlXú²ø?a³ç;l)O:tƒÖõ¨sòØÉáƒØæ³Â>5¨K—7B61U‚0™ùQ©0ýÃ÷íŽÁå:ïŠÎý*&ªV”#Yù•A¿–gN+ùÈ–AMÄ÷K’ ãXXÄúÚ»U&£µÏù#9±µåÝOHú´ÐH ]ê17j8p=¯©x37Ê9ó) ™¯öhE.g.ÔÄGFKÉNzk0yÊøæ°Ø–®¬:ôù4Î I¦í„ –)È”ïU½1TKÉj†T-ý†ji»:”™àð<Ê ˜ù£ØÅ(§|ûmX–L§‘~Ô»-™RAT@ r TÓ‰Nè„ÿ¦£}™°5JÄϘ’{‚lF…Ï‘;D#ybI-YCYƒ¬tKÇ£D™–b‹R,k”à?‰?\óT´½®‚¯ýŒí5eŒ[EÈ´Û”{VöŒ@¤÷´‘6*Ԕ진îQe?Kæ {™V ~Ñ=~ìnð&¶)” Óˆ?lZ¥Þãé¨ülzžWÇRç¡ß|)9Lb²cYQ/ÃôþÑ’¨ LüŸâO⸉(VC#qhsµx€¬\`V10jîÕ¤åÌ{:N‹»ÂK!7³Ê¥>ÿ¡ñq õ*êj˜’ýÃdV “Ö>?#S!+M¡3•·œÚ’ªçÛßf-seÛQUU¼ŽGrNóz^4ô¥Pè±í=5åØý·˜EŽ—m*/qƒÏ gº«'Që€FkXsTû€0ÜQmo3ey­­Ö"_ÍçùË5Y Ц‚ÃÇÉ»žw2T,FÜ0qÊ^LмÆ_'®—ö½Ž?嬤 ²¬)Ïõ¥×áz£_‡;uN•bg™7µ¢UøI_¤üTßKõšÃÅ}f[pñ¤C=öõ–¬^…!`ÔÚé8F•±ü«rϤg71òžmqUAGÈ´)j& z[œNž<'Ú‘xò‘DÕ£ ä]ÊE³*B¿øôIó›s.s6´ª$îç]r¶®ÞHÖ­J ß””㣗Ù6ü‹È<>Ä3û®Â$ŽM)MƒèLgΙµ®_{0†Yœ}FB‚C§%üw' æhlø’ i¹sW{e|$Ý&½nhȪVQ¢úâÎ`5’`{UÃ_2p5Ü%ù^<¦Q• ¹ÃÐõ#ää3ÐéÏèí=ɲ¯xW~°¯]d"_µº_öØÂr)€*_ü– ŠÔëWkƒF»^ó`Ì5žéÖ`pïQfVÎ¥ ;QšxŸy,/TóÀU•ØÍCr>˜8²“`è!Ÿ  ŠƒaÖ5ú±±‚ÈräÇBÏšÉz ûînðL1 /þ§u÷O…ÕV(2¬Œ2Qü竼*Ùðv™šCê®+Tl;{ÙK‡L›Wó‰ yO76S%˜§žµW«—t2sÖ*íöÍÉäö9œ UÞºèmqfÈuøW¥º<*ï«z1[BÖà~h-ªU² %Ÿ/œf-å;ØÏõ¿ÈŸ·F6ÍŒ@+næ7¹_nVzÓýÊãÂ}#Ö9]¬ô˜Ð;]–>60‚Q+cjúÿ©àÁ¹þjêQ¦¸¨Æ))™Ô—qæHË¥÷8ó³˜Xá{Ùr ßÿkÂmgDÓ4¥EÀe®xqìÏmdNYy/îÓuDáÙ†1'<öÐä 2ºxóf[Œ¡«X3N»)å£âþ'¦’{oMüsî·ˆß|G4êõxæQoº* ?¼u½M –÷#Å7 }—ïr•”³^!¯y¨rR´ëUvâ"—ÞË®²Muý=ð€Na@˜£B }¥ú’MVKêê9–U-z*rÉ×l´¯6 ƒ;u1†FÙê[ËQ°Û¬¯È9ÃgªÎR)îscÒÆØÔ;$;Œ®9¤ºQøëî÷Ÿ ³¸0ykEíÄ?;Hl4ç’F(bÔ5q£,‰yE5®r:K&¸ÎRWz¶×hTåÄ*%æ°ùÉfLª¤úßÕ«Ž×ºH³à_+GÒ†|×^9¬LÄ1œí;]ö‡(ôl„œ'V¹/*5˜äUìyC­ÒK°sÁx*n×I| ÷Vù¢ìå.­Ww¤‘ü? ÙÑ)Dí5I<%ê]j ôòmÂOÉJü>@͉°å8r—)J+í—¸AO]aŠzæ±ØË•¬a+Êî/eH‚ݺï©QŒÐäC^~èw݃YVÄÒ’à|[y;ä;á¾ß¬ò™pñ[áTeA%¾çž;þzHÊ¥¶Nà¾Ú»×Në$v‘Z?¡uèë|ð©‹—}‘9F‚%ì-dM÷9ÖX-ЬÓuÐJÌäµÛ€¯ ¢KK†å»9©|‘  ia<€Uø—Ú$F¨B&´#\×Qës Ï+þ,]_ëðÚ×äI!þëÙvzÑ+úveq\ø•SS(p}»3ð¿ä£ùþÏWO48¶ÁÒÒâpÎöxy³¿úëg´ºXìÔín{-?³‚Q•ù@Öc¬ xÕ IDQ;PMf1º§•?N' ý­–ÑXôêËLšñÍÈolræ¬TΑ«_ЭÄeS [t®\-럯¢Ã˜«f4k=©ö <„«oðHçŽ&BÆèJž&øE70Í„(͈>Fü,IåÏ’Y@Tòj±÷ïŸA±n «Ó†…öuš‚$kMºìÕÀõx./ØçƒÆàzzæ1‰Š¶Ô^Ã÷¤ð|#2nŒk¦]SS Aü@–£rÎ÷¸>CHpà$£poškR™‹Ÿ$a<ñ c›d­aŒëi™³x-gžÄ˜õžùÆZÂ?È{1cÇÛP³ä1™}…5ÛË»Îz”à­â—@@%ÆèÁ†^Ä[žŠ½BvÛ —’ûñ^n<‹R%ÃâÓo‹oLå‹I¯|Õ1¶`ˆ³Ê£ØçúNü E‡ù¼×xqVÆ„šUâÏù-@Y),¹æny¦ŽæC?UاÏKr»Î"Õ ê씀PÀAÐùÚPˈUõÑ8"‚=æ9zJ=ôŸø€ì¬­­â‡ 7% b…Dª‰´ ¢a4‘4,zªG Œ`@ªûiýáB{³Cw%WJ64šM|áçAqùD’¼ÔÔSn 4ªÑNI\háïÄ:ÏeGVšáf†«=3Ž%R/Å–‰à|+xí÷»¤åâg&g@INä“qÉI^Šô5RYi]ùö­û óòXɯ·§EÚUf\T×'¦Jbž_Åðû¢!bÉ#Ìù1A…Õ?³ÇêïM-Ÿ\ð.š¦ èi³øÛâxõ‘ð é7¿à¹<Õâ§ÄÝâO' üÝoK}3DÈ×»^¿Å¥~Ä•rŸágh+[£þýºô•ùØ4–a3ßPK ·Û ^ÞÊ ÏÛõã5µ\QC-É»Œg dSÆ@ â@³@ó‘D\¿~Âù¿ÜÛœ3-øæx.c¢[Þ½<1‚ÐÆÛåϼP…Xß^-×çëßõ qvæ&›?G}Åí†5Þù^:â~^ËÅw°¢`}Á°ËÏ~|Ù=gX@ÖõÞÝïþeÃ{пA{£f)~8=ñœØy¿»»v˜ÎóÄÅb.ôƒ "yüBj‚–¡)¸Ý¿lÎùoE3Ñ,˜À>SÂu ¶Â¡ÎX›låö¯nà´±¿ÀòFLå{Ú-JGEï© è°~ØÐŸ¥µÃûɬ6û—óMÝÙsÞ–ƒüþ÷añÛ5€³ŒðÙN‰Èš¾s}ÞÒt›ÐO>l+Õ5öï&Ò=Œ)ølñúƒõ-±¿ª1¢e;¤åß0©Ž vÏàb| næü­4±ûéqÇ3cÐÖ@IÒòð²Þe½±àK!+^gíÀY‡Sr¿AIà:`¯d6zúãqz>œÊãM×½e‰qUI1V üvÿ=¼Üm/dë7‡ÛÝÃv#Uýæ~wØÏ»Ó1ã¨Zªà ³â›ê2…µÁ¬ð2<—Ö>+b[m#gûÝÕÿ‹ÓÛjendstream endobj 278 0 obj << /Filter /FlateDecode /Length 6756 >> stream xœÍ]Is\Gr¾cô#:æ"ÀA´kUvø ;<^blS#†/’ÄÂ%€RÃ?™YËËÚ^7@Êáà×UõjÉ=¿¬þu'ör'ð_úÿòöDì^Ÿüz"éé.ýwy»ûç'ÿ—e'—½’Öì^¼:‰=äÎÛ½ÐAî+÷.øÝ‹Û“OÍÙ¹”Êî­<ýîì\ì­NøÓülBð!œ>°Ï×øY… ôéÖüî%þ ¤¨Û¿e>iè+Œ£hxjüéýÙ¹^ìÞËØ/µ}ŸšàNßç¹È€KÞü¶îššÿüâ?a/dØI¹Ö*Ü íövña÷âÏ'/þîÇÓ´!¤ §o`+ÒãZá‚ Ÿ+'á›pJkuBhïú&ÐYâtdlfCÐΞÞ)·«ÓÏq/Üéoøp r¦jÙ©-~]Æ»O¯”&®)½òU|,½9½d“åMîð3€òôª]Õ>¸gÞ²Öôåëø,.×÷ÈZ-§±Ñ ëEGá…°ÒV£ÓQƒó(Ïßâ·ìÁ¡ùÉtòÁkcb ~ 7qÂ@qqë¡1l¨“ÒõË¿9C²Ð2à÷À/®€ ê̓c¡Lµ¬wñNØêq¦: Öì 4N§»@+ërWëCœM^}¿l ³èÉâ׳­¶Wsž—s.ÍÞ'Ùª€ýb‰j¼‡> )|tòô}»‘¯ÍòÉíÏÎÒ{+&Ž‘Èé~]= 'CÚ™•J÷KÚ ©S»² ¿²­üXÓCÓGbã;¾Ší¼û‚È 9Ìãë\\'T¾‘ü ÕÀ`¾ãD|Ÿv®;†n¶~é&"ƒ’LY½œvØè#dRé:½ÀÛ¸›÷‘´µÝKå3iß±¥9¡zâºY ïR¯ô^·¯ÄÎ êvø¸v¸‰”m^Ê¥>¾ê.PPìÓÉÐÔì5{~ÝyZXMä/‘ß¶Ìò1’Q† }Â>«WÛC3Vãi¿-¤úŠ‘ü»vâi¸ÛvUü]#&Æ·©§;q'’X¾æ'š@qüy:[%—šefïàdNÇò9nŠ«¨â|POàÀà佊+ã„㉗Ͳ ~…‰]. f$ÇéD²(o0 öü¯ñlœÑt4‰˜-&Û­¥7äq0^‚ Ï_åùÐ6àG'MÖlÎÚPT‘^ª ¡ià¼"e§UDʶK\L£pùþÃT5°ªiqÜ ›¥ˆiµByàÙº;‘—h²“Õ‰À¯âÐÁû–bal\%¾6Ö=ë¢dË4„‹!·€I °ï2ÉÀTC|lÇ¿(K*Õ’¯9:S~§„dÒ i´v]€+¦ßÓa†žÏap"yYí î!Íȼ,øX†ZÓ2/Ïè0‰È±ìÖñº‹ö ú{ÔÐÚGC[íÍ@^–†ü0ÞÄݽ° ûk&ŸîÒ’<B°LVzT4`ØzhÙ,ac3ó gê)òØQõÎþBZ ¸¹•6¹_Þ°}’žLGá†&ÒÒSÖ#…ä?/FB%:Îsgã<¯«fìg&€Ãó½{õñåÍýù§ûóo®Ï,2áÈw |]ŒÖÃ<¬çͲšmÄ5ÎÀ!ÈVí´êd5¸ ßñ''2”–N£*:HÇØnzÛv7Ä+vàC½gÚ™ˆ-{&л"Ά›qpd·NEÕDŒ•µK¥îZ-‘h,;N8´ K±<Ðí3¶’à$ûGÛ‡}‘uùl/’»²ìWøc`Ó ü ?YÜA_¿…<2œ\ˆ`Ïȵ6U^#òûÔ1Î’þ²ýõ¼[¦Dù? MÔÒڙơGLÊ%+µÙ0\g­îõÌívÚÑNì›Îxú82hí¶²ch£y‹¤÷<œá\0†1:ŠÉAMF,y·3 ƒÌŒfÑ! ŽJn(4 ¢d•5Ó¦ÏÝNsõ—&w߯͞ŸGÒÊ€¿¡lñC^µ[ÊÞ-þêìfgÉÑÿét²O7­±ô.vB®Ì6=‹PS¿l衖猽"Ï3»tšÜn{ð ½oúpåÞX[‹|¾ØËCú…øÝ”CÿÓYÔ‰^®*þDúágíá”dÍ/[*HÏ?ÇQ°Sp‹Â Y맯1öÕ„Vð1pGïEý‚‘%¬"Åœf¢ u‹vG96?˜ÖŠÊé«i>Ø¥GYl4 Jжêô§ŸØÓúh¢ád÷K!Ïì%Œ#XС­?âá©cÅ p JÓÓÚGl$]Ë\{¬L¢ÚIÝþõÅÉ÷'1^ýa®ù ǰ¥°{£íŒÀ½B{êö(C¨ ÓÅqE&éyí¯¿®6{d(Ì<©u‡h©àðøÝoiÅù7X/pª6°pµmØÝžQ˽³åÉÍÉ›áýÉÞxK§Qí Æ•‚Egú‡vƒºd'z»¸_÷«¶×xÇo3‹a»-‘Ó=6vÒ2©qŒÿõ†"µAÚ>žÐE6®ÓŒÀê>šOgÆD¶õp@Ћc'"½ì€„!¶Êf,ZXT•@e3·ûe” BíͲd¡°Æ±ZÿFóreáJðÜuxƒNlnB7IaãªwçßN\xtÅÜâ‚sqaø"ØNUè±·Ÿºø§¶p~­ÉÅM¿Æ$Ôä[ÚÖ|©iaÃ~Yw£‰<&G5²öÐF,Æ·;®ë]-†·G6ÃÞ–Ù, ÄSaÓðë·¬ •–ÔÙ¹Ò]’  ó0ýú–Ò'›F¯o2û,á”ÖU2c¸Úó.$ÌͦH~Ã4¥††‹ïí¾D±—EP&»Oì¾õØã¶¨iÜwÔÄIŽ'JU:z3tùÿÍϗɬg0‚¥lZ—:xˆƒ/ùÌG: mݱ4Äû³ƒù66SãI9¥Õ>,-“²Jž2³ ž±rŽJb0Æ)ÃF±à:DÆ-ßb“×%WÜ @'Ïg`|!¤–ûE,#WðÃDR\±Ïo+RöЋoÛ‡BÍ›†Ç¶B÷áºñ6Œå¸óãxm›_X’– SFD¥u‹öí†+ F“@Ù¨Æñw"zйx0Ü¢ZÆq0äJ›ù£ì™ÑqyPåa óÏ¡ÍîŸØç?NQ§¸“jƒÓ9gØ3:êvØ6Ïý̲Ög9ßa4ˆ,¹•ÉËÂYG ¯ˆÔàxÎWœJ„™V+˜àÛÒÙÿv™ŠFjè’» ÎÑXüäB€¼ì÷5c—™!È?«¸@  §…ÿ3‚p@Ì0«B#î'šÏŽctBK `²9_P=Z©äÑB >ÏííB¬b…†o€S3¬3Þï1ßKNç)|W5º»¼ŽÝö¸a¯x×N#}¾oÙ¥q…@ W”òVn•ég£ >¬ÎÇ,ÞL‚8Z¸X |×AS¢ƒÒ„Ê%¹‹ïÃÐÝL¥"Q£e684æ+¶Þ°ÄÅë-Oyìótám(?¥æ×ó/î§ØCPÚ6éfEÚδP ¾I\àp˨&I> /íeí+üCË÷(@ÄaX¡É„ÖÂgÛ¡€ûw._:ó•ÇipäŸF‡âã%,S§›^ÕÚµ¤ø’Œ‚·zívÆÃwAǰƒ¯µDÿÑCƒMê|¨‡þ9® ‚nã/Ï0úèÔ<Ðæ´µ£ó”챨O¨tåm4“ìt¬ Þl¤³1ëfl€ b žâ"9`£œL&Åç¸ ÖíHˆ,{íë°ÆšoL¹.–à|Ít5ç´gqˆ¸è"Ç3 ¹sÚ;¡×Å YÚ|‚hëºt>`s`u‘ÅF|%ÖmC«Ð]–^¹éÔ6¦@¿ÁAùwm¬õ#4å ÃÇ¢-M~•ªê6Ží“Qwé1H?! ÑæÎ"ܘ©\‚7K2A8ütL~Ëzäm n*±9 tØÍ:ÁO0³ä}Âð?ó"³•ê ÓÌEÚÚ¹1¾µì}°•’O Í”(|{èñ= ¾/–xF©½âÄ,’5)Ðj¿ŠÄ3°k XÆÕÐ?§¸¼$sÚ*IRþy+æàFAl¨KéTÜ ÛÀP8oùiå¬XVpy—Ѐx°-iÚ5eµòHG†éùÍ—<ƒÑ’¡ C†˜…!Ïçx¯œŠ8tÓÁX ˆŽ®üûömÐaš™¾ËËò“׿ó¼u¸'J€GÛ³‰´›YqM~7…d+ Ò ¼ŒÑ,LZ&B0v£FžÿêW%ƒœÛÄØQÄ]oõ?Îó*Íë¸Øn/kÒwšU&PúË z0Hr˜H±ÿ„Œ¦˜?†Üj_SÒ«|ö˜˜ÅMø»zÑÁŸñm…¡ºI 5ÝãyhsíöA—lœ:i;¯)aÅ#ÓÅ“|‚·ªUýq^+ÂàENÐ{½Â¶>¥ŒÅÀ,ADêL%ÑóUÒè;cøã_ØPMНd~ß÷Øš ×´VØ"iÌìËâ kÉߛרšÂ"§žx€…Cú@ä,Å•ŠHiMqqUÛ€)KçŽ6¶°½×DJPÚ`û‹Œuä´³úFÆ;ºUã|NÝ<®K“|BàîŒe6 IÑC›C¬­Mè+„âž ìUÏÈá´:GI†“oÂ1!­Šž[@S1r†×±„7×M5ÄUqB+ˆtDN¶c-´JT¦ qƇ…WVç‹ÈRš­ô Ï4äe·©†d2û¨­ÇÅAMWŒ°òtëo,r5 ’*YS0\)tÆ×Cœ˜oðųü'—È-™ã$dÿ&}š`¾Ý®Ò¼)‘ˆ]—Øw[;Lóyƒ)Êóg'… ùÙ°Bžu¼Ú Ê5i@Õ,o?Û¼ÿ+ þ’›µÌKH8›R±†‹­y€£Fé€ÀóKÿÚ¤:àÏ@,5UA±„béxšjoWœ#­*žçMÀŽ4Öé±xP,µ=˜R®„ãƒÃÚÎ|œKEÒfw^r ¸ÉÿÍV–«† &%®c!²ÊÀH`P0½sC¢ò½ŠP¨Öcb†EX,¬£ ïÌ ‡/‰YY êPéé£%ÿ‡Z&=1f3߇ÅÕCW‰ßýYIü¡¡å“NH³ÿQ‹2êË3´tN„> D¥ ¹`Ý{Ó»?{#.¡ñúƒL##QÔ žGP»/‚S&V÷?&û´áµëUø„ ¶à%`ìGÔR³Ùtåu2• nAaEW–_]xl€àò‚ÎÙSFh„2‚ÉlÚ%Ô@ÔdqµVê§µQŒTUÒ´ÔÆz«æ³óŸó&ÔÆP‘!h ­eÜŠÜÙYŽr:c=ñÓ¡"eå Lx¼ÓÁµŠå%ÅAÔêÊ9‰IŵdåþÍË÷g1Ô…»>DÌÉýb}Q„]!¾"älíÃ×@ÔØ¦öf>¶îI<ü tkNâJeèð£qÐ.=¸’ë—¤œ§-g–ßM|Ærñe„ŸëŒ&)Ó%Çf7Àð•æ©ê9 mÃÆ×/Ü­ð¡mGAÖºÈwèWmq˜&øé|Œï›4 LÜ•àÒ¬Ä.‰=4 Óã.½\níh}.ºÍ q„Å̶„ë=îЫ4¾é–“i7i’¸èš*€-nkØ"²_5²lDé®Døû#®¨É˜!QýÕ »¹á6sÆë”â(øF ³4„A37ÍBûÇð/;ûæ:®·§K¢5ü‚oG$ÇHdÒËA‚sÀïÙëß”hC­Á­ßÕ»3+N¯ïïÎBˆÕéß> õ#XZ6xu¶¤RbOÜk\3N]ú#ª\…\1&GñŽlý 1´5UÀ£’«P¦sKÕg1,a'ø—Mß»c]¤yq1ýSu9ÅÅÆ¦K”U~ÛÓ\ˆ®¦žæ(O÷˜ æãÂ<èx0Èðî 7Ñ¡[¨Ù»&ت/ðDµ°{W¯¬*(_³â¶£Rã©Ô\™P\+¯µpnøzB Yf"•s(wçgóŠE!ðÚÛ~|5‘k2Gˆw¾fb^0Ð%#Óç?±ö Ó»òšØwˆ@_@LøÝ¼ÅU ïÖ(âñ‰Q\eP«ý´š’¾@fG–K–‘9<ǯQ6ÑPû]*Õp2l–+ D3êß%Ô° $m¹ßqg¨q Æuγ}bQ6ã‹ËÁ&›º†kÔä ¸è›äQw5žs_ºJÚË@ùèGŠ3p^÷¾ºO¡9rClƒÍ%X½ÅûŠXj-À£Pf§Œß{—àËWÒpºà'WCÿÏ¢À¦âªhJŒÆçŒó1èÚyZäÜ01’®¡¯è"§:Íú~åÈLË5Û?¤ášË»øØær­£L×òå³|÷díV°dÎ]RÔ˜–ò ~†ŸHW[}Èd¥Îƒš¤ŒNñ_f¬³e%²Y›‹»ÙÍrŸ†Úq~æR‡^§âU#k×AA(½ëž,|wØýÐ êŒúÔNuå웢øCì³Dgj„èãõ(]”ÚM¾nêGªû/hŽÛ7‘8”w_óâ‡Aì ¢ çãçF#¤UWáðV§4ºjk§©ôùeüÞÆ¥²4ú‰ÏgµÑ7›úáä1ÓF"µïBr«Qyqyeoyw¿^9HôÍÓ.ÌÑÝÆû`†w_¬RL)Eù‡ÃYÎ(™ †æ¾¦×?C’¨xëhvv×D›y¡•Ïpà¯V’R)Œß?±ºtÝÖ­,c:±©"i¹˜½]†—;6¸ºZPpc¤³Ö™ø¦ !G‰6EWa `Š[#ëxJƒ­ê­Ö(Æøvh¼‚~/ÛÃKŸŸ×œ5ô›»k#æ†)p¦¼õÙxn±ŠsiÌ ~¨Ÿ˜2{^sÅqSœ»çý^{(Æ—s ]ut{ŠõÍ£ ‹¤iwdÆi—÷,ó¿&KæîÂõäŸ×|hë†ø®Ëj[kØ,”öÞ*Mì †Ò ‰³ÛÂM/ȾV¼×¢äWõ¦P¯ë¤+éBôxT½¦§:S¼ ß ý3;›6,gº« ¸«èOßGGÇnT›œÆ^M>ó6“ë9Jª‡Õý¡–añP½/‡jÃáCUjN7X‹Ñ…|Šñþ`Ñ&µ¸Áý*§²Êùêìc ÀPLmà-Û_£lPšxwf¬µÑ]@ü èQZ¹g´:— :§‡¿ÚÐÙcÉÁ‹iŸ0dhDbjWE¦gϘ4fؾí^DÛd–Õ9}ÍõþC­Ætb{%¢¼Ñù7<6Œ/ŽëbËì³èg3.åS¼N•ù fÛtçÏ×ìd˜9œôÈ˾ å=Á†z*¨i½éE{»×Öm$íýêN¡Ì¶(‘p8›WZ¬À$nçÆ(CXï=MéîG{Ö ~œ)²°‰(Ó‘lâ©—†f.*ÿ•ž~⯠gÜs™¢ áéQböÖWÕ}ÏdrrËVãuÄåwhð¶l¹yK–÷ˆWÚT«P¡¹I{ßçWIž7Þ×yl#}‹œÆðîbë–ÆSK=f‹ìÒó‹_®ò˜vÚ8²ˆì›6¹³­á¤Œ¯FäÂ<Òë5-0 ÁÆÄsÈUÞó;¿þ™<³Y«1€È ‰Ež§<ýŽÝ?÷ð›¥kzf2ú²üªÓ›"âÒBç—àÎâ ×1ôT®¥PT_YGÆI¸ÇÕºà+ïVùçt‡Òša€>§îaiÃVøØÅ…p¾àVØàh˜Ú> stream xœí\Y·ò¸È˜—À³†¦Íû0b àÀ òÛëäAöÃjWÇÆ{Y»kÉÈÈÏNî"›œ™Þ# Á€Lõ°Éb±ê«¯Šlý´b_1ü/ýÿä‭^ütÀÃÓUúßÉÅêGŸ}cWÜ‚kµ:zußà+§&=_YÍãÝêèâàùÚn8zÐ|ý÷7g‡6(ï÷ë“CÉÆ™]¿9ÜH«xöó¡ƒ`B®±'tsÜ­ß’·Âš1ÃÜØ‡3¿~qN~x‰m måÖ78¸Üúu§Ãmì ¼[_Ÿ§™¸__‘î·6æôwÓ_~8ú3èˆûçƒ×Z ’¤´u~uô—ƒ£OŸ¯°·`Œ ëç8–ðñõiúûØái‡Ekï¥Ñë;ìxŽÜÆ·3¸à±3dì"ãÚ cÒ;ÌË9h_Kè­Lœ$uÚ·Þ+¯Pû¼øñE”€ Œ9nœÅ”78¶ kºN¢2ØfgàÁ¼$=cÊF•:Æ4×E›u‡‚Y m\•‚âJ¬×81¸Cyâ<‚9¿¾õl½NqaJ:WŒº…?¢ x'•Z_ÆÑAúñ7áàGîó~¡Ü v¦XæÍ4ÝÙ!Ú…ä0ˆ9:ï¸ÉÚ×qƒ‚Ó*Áåv}ÀHq@Æ¥,zàxê÷[˜A¡ªßÅ×@èçð3ÊóåÑÁ×ѹßöý½´åìðÊÂÊV–ëC‡àîœ(’´ÉL‹'q`Ëiž=†ô¬¬+¿{ù5hSþñå×̃e›r`Aäg#¿Wb²œæŸÍ¡ïµŒ1j0ÑJ² ð%g5m?`ˆ JÛršÐ݆´§ËŒYm„‚¾„žŠÃH¿äuÀø²ÐUÀ'a! DCåâÔ¸ÌRÚ;2DVP¡Á’¿œô•œl¸´ê32üqÄk0Ãuì£Ê_”¾‰sð–Ë­‰ª@$¨tXs"ðô°Zsšó4é"Ö.~DM VÆÞ`ÐYö WƒR€Aa YBˆ 8„)u4•¦†6G–åÐU”Ä ¨Ö"/ã(¾2¾æò¡ŸƒÈÛv”ž ÏðÅã¢2:ý"ï*Ýæc’çí£ÒœwÚ4|AÀyþ iGÚ_–¸Xƒ‘öƒ0¾)Í%±¼à[Ÿ‘+ÍÖX¯ô %ï—¬W<ázõ YšaZc°Oaý`œ­×qðh*’S£‹±• -Ws«Klš;û>|Z3²ðÞº¶€=*€89^‡².žÁnãæMfsªéy%$a$2Öxcv¸Žâáˆ|§Dª—¤ýº^í“L‰öçÛMFÁ†3±‡´DȈüƒDn´Å}E¦;L'½-™nçå!äÉÞGÛߣ›Šøú˜õ·uØŸ ·Á¶bLh£¾ÈLŠ†Ï£ÁY)VBw nàÈ1…ÙðÂÙ>If'5š¡ÛŠÎ‘¤AsLÑë¸qÇÓ®=^ƹ9¶%Û8¯{¯çÁ8dƒN{#hŽ˜õûnÞ8WoU?‡=„Ìcø¯ñí·~·Q(ÇÊœú=é~]ØÊE¤¶-N—ÓP´)­·,§Ÿ¨Kë%p'æø“c®ÙpJ¥ pÏÜr8 N»HDtèŠ#$¤3÷ Mi€d1ëòˆ9µ¦ä ÓØâno¨§žxFŒ2¢Í*0™é=ùÖ‹ú—“H4‡þû`ÕäñÏÖÓØ]Ó,)@÷ŸÞ(wÿ`aà-ó®`!f„ïP"è-%í¾Hî˜j˜1‡¯­ÿuxô¸5Heâ`ö*Ç“x5Û‘bcû-iߦ6&îo|ÞÐà–\S€\øl§Ê¥ß'¾ò©w›M^ØÞUJ ~N 3ÏÙ2y’µ¹‚|å\Æ—sZÙSñõ“0yLcY¤X2´Ýúû5évÙ¨/F߯Å!@Ún%ÆÒÅ‹XÒdš”?Pùþ0!3{Í{Q…é†mÒ.n8¼ô¸$>°Ñ®‰"¯CÁ<ÌU6ͨ ‘£p€^ûpU«Šª¤±ç¼ë= ÛÌç.à†Ä™"ƤœµÄ"¼ÝËøj5jÐLñA ç÷…Q —×; aôvz¾FýÿŒn%ÿ§WgVžmí6XajbF8²(ñõmÇ"¶ç²%úÈGVü‡FŸwäñ›:8ªYDø)„.ˆW3Do#§´$Ŷޞ]‹°e!yk^Ï—E3¾Ñ¶ä|î³FŽÍÊôâ~³ êÒn‰)bõdXDñç’´O ]‘ç¤ýGÒ¦}èø”>Þ6¡ŒÍ‚_pFFÁõ‡†§&KʺQ)ǜ܎¤üW“Š[Ó…&ãÔ[¥hÉ示Öi6U7;X‰´­uZ=õ»­ ßQ%½«Xõl«ãa[p˧K÷JÂqo‹ƒ:Ê»è+¾âmð!@Ú•n/þ±¤ 9¶)q¤°êCU%¢z/ wöí®ŽL-ºäÜü¤5­ÊÙ™½ð"O#Ýœ]Û9g˜åÖ%Ii¯™90“n´öã±´…Ø¡–xží‘* R#‚±ÜM3Ÿ‘‹NhÁ´Í—©Ú…+RkU N9^Ä9#‚\Ôä¨w —(Æ-y>3!š5Pä ÒÞzà–æÚqàæÅ ð–ÙT‹Ä½ÞV"Nœm·9ì™JVƒ’?©ý®D+É'oñU\D î=Ÿ™ý²O>©o¢ÎY°—E yÃ!†x%*š…ùX*?)×û@?E“p0Ð8$ŸÌV›æÞ à°ŸªÇÃɾxóÝ‚ÓuLÖŒG„·õ4œbæiUÔ–•}±xNKgª8HX5E½œ5Ó=ù°˜”yçŒ+Ût‘s,ºv•ø¼Ð^rE-€+ºÌ!¥øp‚¿Æ³SÒô)%W»Ââg÷r³Íz,œnŽ™þ ¨Ç‚¯Ûb hÆxǬ¢Ÿ˜1²tŠù“3O˜ÁD éË,®T` Ã~4µÌUfQäý¤¶Ú¢f@ Òa-¼äÇóÎÝðCocJ6þï:Îkx^à]±P”ðrߢDv,¼ mRpØ](Pîc¡àc¡à¿¤PðØgS» +äú@«R ¤ –³¥R€]òÕÛ-8Ý—](·Üø4~Êo0šGáF–tÃè A‚ú_jP©î}ˆAj[TgÛOo’T—3hpÛ?wÆêþÚ ÎO³ÌWyï:cî‘¡¶ÑÌPŽ´¿aÂu3ãêëfÃÛÞ/ýƨ}üðGÝ}á½ ˆ¡™{ÐN Ë÷°±[÷°qßdÿ=”¦ÜD59²ÎßîØr .>Ú:½"ý›ö©Ò,‰ˆ¼ó,jyvr(Ê,¾‰à–bÁ…ýÈÞKöþt`œió.,®µuuÞ‘¡¼‡9žŠö˜™"” áØ †¦›®Û_Ú+vf«KÒ‰ùuõ)@V¨æœ×ö8GKŽ¥‡e̵`mÍ®6ñÆ*dKÏ6Ï“í‘:À ÖhQß·¬Æ›ÒrúÔ‚¦) æX˜®É.Ÿëxé\~Ù\t-ï¬pã¼sÚ0—•U¸Wó¥Æ]ÿÀàU"×b±¥·¦_NÒ##Dˆh´ô·XÞÔNÍ<°‰ 4JoìtÚ¢ç•¤î¬æGÍmšÑòOÈK9åqí+"$ÕÏ]=óXƒs.ܸŠÂLê8#Ÿ°¾­GÚr“ G µ ¦;Ý.Ëèú\WB\t:ƒ@>gŸëÊ’ÁÜ÷scŽ\Ëi †ÛÍ"1{–öe‘ i×´í¾ðï2€ÿÛKW÷8vx…ÿà`•íC/bÙS˹‹çãÑÍn«aóQ,uÛÓÛò ÔÇÅÛ^/?i1¹…ÖƒK1÷+c!9Ç™ Ueçm¢×+™Ð­¿(0P•ŸÖ"³™ú^§@Б’¼/ý„¿ùõ§ØÄ/rEÑcŸ¥ ÛòÙ’T‚ŒíÏI{&Jä“ÍÃT¦.7ÏÝýàùè—7äåzRQÉŸÆÛQbBë¾F7°¸$-úDI|#z|}ðo×cØçendstream endobj 280 0 obj << /Filter /FlateDecode /Length 4727 >> stream xœå\Ko$·¾ þ'€GÁªÃw“ö`ö!ØI¬œl´Ò¬-[ÒÈšÑÚFþ|ªH6»øš‡$;6Œ=l«‡Í.ëñÕƒýý‚ |Áð_üÿòö„-¾>ùþ„û»‹øßåíâ“ó“?ÿ{\ðq\«Åù»“ð_X=0éøbÔ|0Î.ÎoO¾Xާgœ =h¾üÇé´sv´Ë5^+¸vn¹%×+¼Î ¹ÜœžÉQ£3Ùè»p›1»¼·¹[^û¹3p{ƒ×#Œ–vyé'”ðƒ²Ë›y<¹¼ÀKǘãòŽ_“95nyOŸ¸<•pí`yß1&³ ¿žßC§ö$ZŒ1_ÿ ÊÝ‚óÁi-£Ò z´nqþæäüO_,Ï=S wËo€Ÿ¸ZŽs¡nãtqÀŠ\_â5‡·Ã ¶‘+Ê©ð¼_žaLZƒLBjã-?æý©0¸Ï6›6¾Y0“½y÷W [ÃÆ•“VࣞPç²á÷p»An¼ö {h_~€¤\–Hø«± O‰À¦5R¯8sËæ‡¿3vÃ<ƒv³Åùˆì=™ò†\ÓWmÉõmX·•JÑ1Íuƒ¶ŽOoºÈ‰O ¾ê[tòAK3>•ÎBçŠÜßì¦YÔ«D²gì™ èæ j”žl¤„O[.˜®%dæŸEc \tÎhí7šsÓ‘(7Jp^y“›ʳaôíQƒ¨TœIfÐÈÅWƒR†‡ßFeã`87a•Tloâ\FàJ¾ˆ»÷éùÉ¿N‚Ý|è›ÒœÙ“-å0×ÈÆÅÈ€äQ[ªòŠó=µ”ƒV.ŸúÕKÐ,í %Ï'6/C³BC§~š•…{ÅÄœ ›Úsè70¡á?ýFªä9¥_¼ ý#ˆ¶´?ýî•rNé—/C¿“ ¼?‡ü8ygúô»‘ÁÁ3™¿æ¿Í©Ÿ´ pñp¯X†(ÅèùË@jdµ “ã{ö2¤mýe¼Œ5hdaA¿"þ{ˆ’uƵ@}¦8¸PÜÉ':7ªqù: @PÕ^å¹¾ Èê19;Šè^µ˜gŒm!†r½"ó_å0]_–¨"ŽÈ}Šß–©0FÀ5ÀÆH$E~›À ‘Ã?êåoÈhzMYy…³X2 î6 q¦¹FlC%±à%Pi˜˜¨¼#4 %kú,n/ pÃÀë_ã%DJ.‡*”‘ß–3Ò͉³o+fƒá ë‹#²{ùÇÓóo+©¸~Ö:×{@¦Ç^£‹3€ƒ7WºBÑ;Ñ•Œù«zNÜî3Ä^ÂýÆŠ ÔOäú¾Ãƒ×Dä?<@79×~oÊyêw5yÊcYŠ%«€ä*…6­O £™ÞÌáõd&D@¤;BL†s$¶&W$G1È"´ù+Ù<Øyaõä~Mn¬‚ìp§3uú¦ ¼¶!²r½=… †øOñ&ˆÌ}ùñüuLYxyšÈÀW›"ãp¾tB‰ R×à+‡VZqjÇëJµãöWªÝ°›RLcÈ.–àªÜQ+;Ž™žDýZ¶hØ…ûhê’¾VY€øÌÎânÀš²qa¾ñ˜ùÈõªÜÈx„P¶ V^ºß$úž\?’ë*õsD†ºŽÏ:¦ì3X#…\k$l–R¿-7ò$~G_—ô·ù7b‚×èŽë=HGÁ`?H‡ŽYç¬l^ïÉ¡ææð×-• ƒý½éÊo;\¥úå²ü¡á‰Öå»7Dú‡ŽÛ‹òe$™Y¢ ýò”üñ*®, ¹éˆ¶>pƒd§>nAg¹×ú ˜Ÿ˜s+†¶ƒúS *ôïÉõ¾pV<΢ö¸á«4f¼‰qäí¿8Ë’€y,ÀÆåw§«-2ßû¯K–pðnô;Ž“ZÆKõÄ}äÖ=W?qv0ôúÉ5Ö“Û¸*×ÒØÆërën£M åVG½ªßp]G„ÑN ØþÄ胊D=éïå&.:÷{^•Þß–ü´{‰gÒ•<†2Ê¥XÉÇ †çµJ F¤ã‘€u¸Åg§k@"—¿!#>G~}fâ N¯ð ÌquïöšjYÅ¥ò\©©ø˜`®Ô–üÁÄ8…Qœ†÷„ ïeA\ת™¯—Z€ËÁ$ÚꚀu=áTí • NQB$Dw\%U¦‹õ̾-Æ]XÈ9°™ßQÆXQRîÈÚ\Q>›èËcï®íõDf`|“Òõ6tVbÛþR«¥Z!„ÞÕˆòÝ×ñ ?Z5 ¯S ¹(ú;Jáí Iñ5à½ËWÔœ.¼L ÁÖªØçpˆ¤zÑ_Mu`0ó‹–Òv=Üc)˜SyÚ™8îÝ”x« ðƒÖŒ™ûö—¼ýr?( áE¥˜ÜÁ°« Ã_ŸZâ'SW‡çXv£í?À€'çCåÊ%…i¥ÌõåLêA‚}Ÿf?¸*Ÿ²I̧䠬jjPÕT©~‰¦Š‘æôÒ–äeBa9î]-…d\kif€ÚچѠ¡ñÐyö€¾“ÖòØèÆÌjt¡gC‹J‡f…Wš/rÈ÷œR¢tè’õB9ˆÖ­ª »/ÓŒ¡ÄKC³×|vÜEsõ.,P0^ƒÜ¦ÞpÃgDcf2?:7­×É…p-ÜM7TüÐF;t—c¥^¸` +Zƒ/än0ºÌC?R]-\ŠêevNÖVïrÎñ‰ª.O-‹ÌoUÍB­§›ñÉf¶ÖPLã*÷såc‰“ÄX'z1Lµà¼&Ì Ø€¦QVØÖ"_J“›Æ ~·àœ¤¬pw[4ùáÞâN~ÖmøÙõ??r]JÃ78Î`¶¡) ;6‡K¹f3H9S%bzWä4ádÓß00¸Y‹ãËlÔ+ä1‚'T Ò‘‡6;æ SO®¶ƒÊ7êÖÐÂFS$jw‡AzòHæ›ÙnFÙõAïã|û&êÂ(w¸ã€yè}ÒÄ$öêNk¡EQš]굇öª{ ž€Ÿ˜™ûC;(ëL#ÈÌìþ‡åžQœÁV/ݰ,Ø#9ú$‹šù̬zÈhΙD)W€ªü†´ðàÎHš†²Fa\UõR{È(ô ‰ØtÑR†Þ”L»$fÀ' Ð5búU˜[p‘¥2*nQO¼÷*Á8LY%ÜH u'÷0ú4ü —E@3æVRhi .)x+v8¸®Ü‹¾‰C*þÔxôŠ*ÛλhbrßðÍBsNp‚›YÛ´À*LGbÅ2!—î?–Ù‚»rSÐ:î³nïCZ™2ž¦tôÑÀ5%¤7Ÿÿ,e¸Šäf·Ôt] ï„‘~ÓæÙ"vpWJ}Ž`wWÊŽÄŒ…¸ÞÊ—vm*¸6ç÷lonÅoGìí)ÊÐN¨’Xà¾&äIÝqÅÁX°p§xÏìT‡zg ª^•µ”½¡¶ôx[Û±epçS ã1*EB$®âÖ7šz ÔcÚqÙðÚîFñŸ•ç6Z¹k“Éêùܘ«ð.O¹± ÏQ·Yµ‡Ð°éÇ©;(“ñwsªmN!6¼ÀÙ`?]Ú¶|(z§«iz2"²2";“r´‘…&|P‚)³Î9­=¡Ff|o½å¹Û& š…LÀ¨Rój§cÅ”Nø¡Pk8ÏpSÇŸ·Ð“0ŠVHJº7š)vàfuÇŸRÃTïyï¾ÌÌ" õ‡DšÔ$yÖ1—Um[©;0µ‚¥Èð9]-=׳Çók ã¾ µ)`,MUÀÙàYEËÝSrªÇ$0¢Ãïp1x?å %¼ëxé)ƒ6熈ù("U[öã’Ú^V)f öÅåÀ©ô ñÈiª‡ÀC–ç‹_9 KÕð¯“DV£¯½7:¼Ý` W2ù e¨ÞsI•>6ð¢OV£”­TÝ;ªm´—“6TÑýå£e‘l><©ž”场#}‚û©[MÓqH©œŸyoÙ2V)-žµ.P|挔YÚi7^¸:h<7 k(Ę2z!ÅÞqskª–‰Æ³ Û¾¦t¹°+pOÈÆ1£ÿŸ6W€™â[7EÕhcñT-?,ìÂ<Õ¾v‡¶­hÁÅ´ÚׂÍAçBõ±êFNÖÔÖë©&z8õ¥A´ÜSÕ0¤îåtáûšÚ¸Àî¢Ûp|¨ V¡¥zYÄŠ.hGÄê[Á§O*%Û:¨¢è¿Š2XÞ—õžZúeµÃ90ôFÌÈ¡¾Á¡›÷ ;œVGÆùèY¯é÷}çþͬòÝêˆhvc=?O§& U®> Þ¨ÇÏ$¤Ø¤ÆÁ qî±ÀÉl;ŸÄÈ#¼¬+Ç„LX³ÔÌMljª,)0H†beɇ#þçcC8°*B53>«rW-½î¿;2¾:÷µÃ}8@4Œ×˜=Q_äá ³«F‘‡ö1èE£›'x³§£^ßh¶læ°S¦‡ ý:ÝQ:ÈD¼{­#-¬22f57PÇÔ³R±»øtRêJŒ»cé¢kÈÇÒ2ÆÒ¨»£) Ä©ö˜n3äåé1Y´™œ'¼6aÁ*ô]GMBxˆøÀaá§$¬M­ø<Ú(ìI¢‰Þª»+EtöI4Oø—Ðsà6ǯë€F‡sp¹8ƒÿ•‰dÜ?¬®®/·ÃÝÝ—ËõÛoW—[tî"|2ènõÃÕÅöâõ?þóæÍtÿ°ºýáíêâîÃ4V,·—«×Ÿ}üæóOÁß·{×ï§(ª4!uk\p¯­øD`«•¬ 2Ò[éÛÕfû¤•¶Ööîa};¯ §žÿ‚·íq»‚oxzÇ2~U'É\ïÐ …Å/54%Z‚ÒαeÑÇ¢=Klø¢MØÆx»—Q£²ì›¯ð˜›«![ª’‹l§u…ß.l·,ÿäã “UˆrdšñQ`µ¡¨&"?(¡må@”w ýûXžMÙ._$)xŽ|!°+)¦™.ª¼2cdPUBçÎÿ°t;ê1nOân”ƒÑÏûæànŒÖ9äe«m‘K(‡‰Î½«ñ!kïJK¦©0ÓÌXÌ4ëœs,¾—PŸðz›jCjLLŠ,Oé†#X¾ècŽ>0™š‘qî°‰<åhi.–î{¯5•bí=½)ŠáÁ²½™±œ-óê>JÇø³w·ž6ô¢j+(qolD–Xm/pJFàчäþJ(¥æˆÙž/¾€4ÜØcª¡ ÑŠ›™õFV›öç»úg±вØa^•}]†.…!zÊq¼Dò´i`Ý|S²ÂB“~*c4gÚ:Aå´²§öHæ)˜Âg–ª<òi’ü]îñÁ"A6o/fî}« ü5*úY¯&Þçƒfcó(åßsrPFÓ‰ôe×I.åXg n “Ò´ O8Ê¢@Ÿ9*D^‹<&ïYßzä£0±ð}Ù"~ßúe¾ïÈñËOFfS£L‡NBßza®Ïô¼áMé÷ŠÒm}ÿhˆ4Å|$Òf¦ Ï#ºmTzÝ;Eç÷ÁÌÔÉÕ^:á±„Š­êVë¸ç±µ#ˆõ¬Q=CNñ!Í‘nÏÞg¼ô싋Ƴ3<‘…Ça V¤f1õØùâCÌüâHµ¥endstream endobj 281 0 obj << /Filter /FlateDecode /Length 12436 >> stream xœí}[o%¹‘æ»Æ?âÀû°G†uÌk’ô¬°ñ` /°v ðC·Ô’ªJ^UYR¹«1˜ùídžC2"YÝe/0XpŒ©>ÊÈä%â‹/‚—dþu§z§ðå¿·Ç µ{{ñ× MWwå?·ÇÝo®/~ñǰÓá`´w»ë7ù ½‹þ lÒ»`ã!İ»>^|½O—WZðzÿ¿/­:¸dÜþæòJbJQÇý3þvð;¥ýkõû{¥›û«{®îîñ/“’±û—WP~J˲§«žuqÿt×üu YŸào¿ÿ°–¥Óþ}UÝkõûo‡¨Üþ›ýÆ=ïªþ|ý;ÐOªõc@1A9ÐÑõhä= qÄß‹Ò&…Üèrýµºþ._n)¤Ÿwç;r•I–xÐ1ÚµÊUZ¥¬o¯Œ2Ëþí¹ÿÕõFch5ж?Yîþæòô;×®¡Çú¼7X=¨ÌB}fwe—ƒJçfü†ŠM)¸°ÿþòÊsÉaW4T -TÖCçßMö-·”b¿ÿˆ÷=â?¯ùá¨j³\|Ÿ5¢l\rSCJЧŽZAYx  \ö?Ág>‘b”òÚçN—j_rFé\T¹å]n)•¡“Þ‹—&FëÜþöÒ,P¯ ûÿS=ö¶jÙsu½nñǪ•OXì5aÿ·KP¥QvÉõ¥î±ÿyß¶ÕÓâ3ª©g]7@õ:zÓçŸ׬ՠ×<çQ¹[ŽU·°öœN5'•ta‚"8\^…ÅCã÷ÿVù”Èôpê±ÁGŒiŒ_×wÃõnk¹ççPÉâ ×Zg†ZbÍPÆ„ƒ·áÌÉ^êuØß¬üh·}¸y„ƒÒý=’§Û|Ÿ`‰øR‚ö¤Šé·¸é¬I4ŽÀIÈ'YJ¹ÿ©ú]þ3"h|¤®÷͸®µ ŒdPuKA²K¹?5Ý„ èBw6Œî8—¯5Äô92=—µ’>èSKžå2>Κ~òKÄòbmøA(4®Â!ØS2Sz©×fo©ºïd¿+Ê(”2>¬Áܘ‘$R׃+}PÊË!pÕNq2ˆýaŽÙ:DévKíßfêŠÓg,¥‰/m"³Ö¿N®ð q`Ê/HkN÷ü÷ø5jœÒ3Ki ©MBZž>öX©k.¿×„žºæ»óo‰ä¤\H @”­uRtì¼Ä —é•ßáì}ßž¦9"§Š«ZU[+„5³VHQÂ݆Òêr~:VŽ÷ ª4㨉€ì´ÿíe4ðÃÇL™[>õn#Ï{>«†<äá„!l|ì…5”¤L,°05"ïýã|Ð@P²Å}Ⱥ:;>à}ÑqåŠ#㊆%ÎWo« YゲDñAŒ+†F]ëÜê)——r¬B£j«ÞçaŒÆó6q@€Lí’†âeæÂ>Ñ¡z`TòUßÉÛ*^µ4[?ßYv½ŽŠÿ—ë‹?\äñÿóö”@‹çuNÀ*}°À›‹›—ç\ë ¥ü]4\S)´EóMÕ_×At+ט|êÇs ¤4 ½­cùš3-,ƒMj>ÿÁ1]"ä}í;ÌÐòpÛ@-@0ܶ  ]¢S"ÿÁ™’ˆOž~ëuJfÿkê*”m(^ÚèuRÅ|*pë4C:è`ŒšçQJ9ÕÃÑYs€VC qý³¯÷וßÕ…ŠC}nEÓÚgY4íÀŒ¶Qpó~iô¥ù£]'¢µ‹o!kíE¬™°K`Bæ’!ž®oeJTéš)umYÙO bªD$h>\|d–Ÿ©°‰"käè˜ÌÄ„5âÃ$xÈúÏe#žÊûIßt)”ý ùwóu¦‹]^``ð]_\h3œ°M¤#‡OÐ8È„Õå½f|MÜA®è£M4ëA׿gý-$;&Aözš{ùT5Hó* ’uNñTªÎôâ´TŸù{볋&í£ÁTJ›mè¤Î 6B]3­q?TgÄ&¨Sºöý¸O@^'_%wžfxÎ~÷¹S¿»Q,Z;[ÆxÉ—qjòœ-ö:©šÓé¢Ä„\µo°Iidâ¼æû¢6}ÖHC‡~ûpÕ½Íý_,0ÑÇóå ƒÿ½ÉŠ»zp¿8È,|Î(ü?$Yq1lômÑ'$D bŠÒÏÔ8eª™š5)®ùb}Tw"vÐþc=™S& Å)œ5WÍ 'R¸ M\dM­cäiÖø‡‡k} &ps›4W0¢ÈºäÞ€³›íÜFÞrÆ,O|e…¸=ÓŽ´ùüDûé÷š¾á€Ì¹íè~M|?iг–ÉŸg;rÈÕý¬íšu “Vd'a[©ÍÙÌ+vêË益èu5gÄ[%Êv¼ubÞ_ž¯25ìbÞ™tž¹ÅŸ»+ Sàìáq( MûWøòؼóñéöõáýÓ7ûOúçå¨ù“ÁIë|SÜÿ{NCâa±ŠÕöà}.õáÍýãË=®™µî+mÀÌÁ4•ïÿãòú/¤ˆ'ÙŠ0®PÿL"¨ó|¹¾åùãÓÛoöOß\þs£íSŸÎ7ëêæõš«›ŽÒ÷ÏÇÇïÏ%Ý=¼¼>?|ûñõþîd@¿šïîæõ¦Ü þZ· %‡7Ï7G4®þU…AÔȯ>™ “ßÿêMRÔ¯!íŠË«' 4¢äˆëL‘m¿[q2K ú˜¯ã.¼Á(ŸÇ L£ãIó™*ðþî/4ìˆhÌ’‡=?–"Ž&·2ôS¹)׋+Ëqs¶ºNìîú sRÄöô ‹¹eþ¤¦ª×ÜŒx^Æ,Z/|Xö˜kÄUŽfõ± #[“ïúÖ×3Cµ†ß{Õj‚æí3ÚW+µ\¹~¡“z`…)øÇüis%¯ÊÐ×%ì%”¥²aà“]òÉ—uYš¢ŽÔDý'B¾^ó›<¯Æ¦_ÚVSŒŒÿïbäMnŠO l¶^ë`€ÅÅÏïØRîŸÿ샖ü6uQÈRe=ý<áxsÝþWœÐÈ» üÁ…ÓÈs{fcù‹@¿<áYÌD`¬n~1u.²|øöùæùûoöÏ7Owï¿}ÿ|ÿò H.1îøþîWšVß¾ÿþ?U°À@ò+ü§ÄƒSôÌèÃãû×ãûo°l ÇVC¨¬3‡»»Çûs¬yóðöãó}jîîßÜ|||]/èRâù ü›jîª«Úøáxÿúîýݯ~úáæùõîþÃO±)`&'y~xûîõüÌ©!ດ8á³eÉ=/·ß m Ø_/1ѵ;ÒO“Ô²{¼€ÄJ7¿é–Ç‹wÚ=]„ƒ‹‹ß}Ã2Ðâî/0û׋dÓ!dttb(O;åÚîŒÒUðøWìÞ¿,ÔP9_îj¯/"`wbgapI7u—ެTRH Ö§Õ—hbÙ Ž”ïê®mµŠµ½+î2P»k6âÒØÆ]‚¶ºçð®mhró»1Ðp`­wÑ÷ÀG¡Ë.퀀œO œðôë$Ó0ضà²ÖЮ sc žHÁ (hì°ÀꬃA )@6»"5Å+(À$L¬¨À®§fh`ÉC¹é­‡}ÀE¸âáJø‚*¡©¤}ÈËm¥J®’c r›î Ô¸oï j 5BM‚»Af‚uîäj¸t6œ·Á,íu ÒêG‘EwX;lÑræÜ~ÁH0²Ðd¥„ªûñoQÜ¢ºXn%µ`þ ôàBähÊ9pc¸bÝÁ}A• ¢šUh­È5ÌJÜÓ.Ú@51ȯ1‚q‚ÎÖZœl¥¸„l&£‚Zš .BÌÜU?ŠlI €cA–ºÉ=Øí¾õ@/jAåvúq]p‡*$f§ˆ° R]J™ãbð€Ñ F¾_m Ö¨‡±vo&Ææ²à… 拜 ¼ß-HÝʵ«ÍD5~iôÃ,x‹>‡ó£2:kFõðCb$ÜMæ•ÍÆÃŒ¶Ébbn\T(ÁZs—u;cæ1G¨¦xéQmq°&áTª{ë0Š¥²Aä «°‡s»l€p¸¶ 7«ÔyRé¶Ô%^_é$ä½è#@iNgK6½–ºÄë+ ƒ†ÃU Üma]¯…iÌÝ =³NK³h‹0Ôàa˜C p@$Ô£f£GktM/Í‚èÝàû ¡µÓ ¤ÞöRXŠhƒ!r‚c¯AI;¼¾\–‰;g tIÀZ JêÑ4µ€eAK+€9H@I=À>sE«BI?¬í¥8Ö×µH©äE %õ°¶—v¥€ËB+(1À¬ŠFiH21Ó²hÚ®í+ò)v@3zÊ‘™CÒ5o|Ñ>ü Uà!¿3‡¤kÊxô’¦çÎÈG­C f¨’•tötÍÛ¾z‘"~Â×U²Æ:{ºæm/íÂ<u œç2Q·ötÍÛ^†—±½fkí!éš7¾h7 @a.§óûÚ’®µÁei( š€©z) cÆSÐ#üë åQµÃ×  8'H-aÅ+‡SU0Ø OX‘ Ø©§ÔÀ"6XOçŸÃ4눯da®±¢@Í@K ÷ÎLР@21ÓØœ#) RøCnW ÉÀ¼íÅäx4×_ü’yÛK'n΀ .'²HÉÂZƒž¡0F]ÐVc›Ã@3°047flQ Y˜ëgÛæž­rÅ—:Hæåú*ºC´Ôˆ0:æåêZU±¡.âÛëÜT¯l;â]sH¨'‘¸C0umª•¥ÑÑ­Eë{ÜI˜â +Ê€ §°_˜¬dZoq'aŠ+,¦#I ú‡¤-ì$Hi/C°ô)KŽAæ,6^§¤Jtì`'AŠigc7+ts,"ß u¢¸¶ŠZÁà v*ÐÜÔ‘¡N‚W×d(I\L1\; R\]Ûº@ÊC'_¤v¦:}],ó`c`ôir´oA'Šëkäp m_Ük!»yGOéºU&Ç6u¡}îÖÄ_ÇéеvÔ]ƒÛLÏI‡k“m ­Å*0¿Ïa£Å¹€anmK€@ÌM r ÃÜ@Å¿ÓB™:€£Ðp‡s ÃLW#P˜•Exâ\" Ì%smm«ò,Tšÿæ!Wsa®®5‡JØR°·E{Ì%su £ˆAD<Ó²F‘ 愹¾¶A ,ö@|­‡@ÝÂ\°ÆI„3AIU‰ˆj›uŒÂ­9np.˜Ûc³ý˜“¡a4´Ä䜠ºbn¢‘úÓà'0ˆB¸¡úÂA}¡@Ef™ÆDÛê M·ÎÉ™w žÃ-4ò%šyD¯°%˜uÞ%y3Ѷ+ž=J8™sI¾Ó™¨¸’†èÂÕZŸsÓÆ¹$ÇáÚÆJìšuqˆXBsãX’ÓpûlëÞþ@‹+$Ùù•ä4Ü>#ìèŒ3ÃþƒsëX‚Óp m»‘Ê ¨CD€™c1§á&©¡95¸uÁÑ0ª|€³6$^ëL´­þ¸dMÆ´æv­7KžÊm4Ò¿O´N—B‚k9%¨½YòTn¢Í(\Û Ûù’{µÞ,xªVà˜$(|ë·NÓ5z­M†|×eûº‚\3 yâ¦vgÉU9¶×lÛ® 5+w–\•Ûg˜‚P~n˜}Ì%WeöÙ.Å£óB',…ØÖ›%Oeæ4,AS- _VÉ HëÌ’§2ûlënD+i¸Ñ˜“¸âƒ¶ä/K~Êí3Ó$Z#R^—¶óeÉO™†ù&À}© seÉO¹…¶=7#à³K*óv/KžªÉªçÁ05| 9mí¸†r„¼21Òº²ä§# C2ë⻋ÊöŒ “¨ºƒÀ68q&X…•õ;žx€Ûd\0¡FÝû5¬´T!Ð7ÿ¶i¡Ã”N¹qKpë˜R$çËReG póoëÞeBG·qe‚±¡Šž¸y†•ƵSpñµñUH4Àí3ÒD øŒ+éxG pû 3*êT@+ÞGF p m£‡öïbç-mFè™B`°”Ç26dñ|âø´AæM4D€\>ÊQC p “6‹¬^ÞåsÒÖP…ă¡§§ ¤pa3'm[HLÀ!0ÌØwƒrõ:‰Ó°…D󾁪6,Þ¯)Gp ŒØ¢ÒRà]V¾È€ƒ TàðIì$îÍÓTþ‚SdЖêÍÓ‰‹ÉÇ:9³PÐ`›|tŽI ‹*3Ï ItÓ`dÜD ÚW%_îøHâ€ÁPzA}R*Ÿ¡ÙÑ‘Ä5#ã"¶Q?¸³Â¬óÚI\ðN°ö=9ä¥É–Ž$®ÁÙJãt½­›Œ¥/øf8Œî‹yÁ¬¸Ê…JÈ)yKGÕp|&ïŒÔ˜„z?2:’¨†ƒ`0`G'QÔã#ã"‰j8†Y§ÆT  €p欳¡#‰k8¶í‹JE¨éuÌÒñ‘Ä5 #|BSˆzÝ:¨hÙH¢†•{BÇÓdÒPËYgÄ­¼ 7™œt6l$‘ ‡À¶ySŽ|ʸ2éÛ#aÞ¹ÐrøâŽ[·&U|$p À`2 •5¢´Ž‰Z>’¸†`d] |˜×xµ®0¶|$p GÀVRÀsÝ}]v"u|$ *JáNâ}´5;xÊ},n0G$Qè2´·îµjþ­Ä0 ‰¤PÖlm>eU!ànÚXЉ{ŒÏܕ٧#<‰Í8Ä>“>ëÂTæ”>WŒ'±‡Ù¶àZ€ËÉyhT3žÄfd#À|^c8y@Ëx›qm»©ƒÆZ‡^ã lÆA6耂i¡¨Äæuƒ†ñ6ã8Hb6‡Í_âR’gêCtue]¢e<‰Í8¶Í»ÐL;‰Ï“ñáI|Ö!`˜:›¼ž‹{µ|'‘·ÿpÆ„V{”)#»Žð$2ãöfΊ–iT@úÈ‹B áIlưIoPFÄ…‚ˆË‘¨Ÿžð$6ãoµüFè9ñ4Å“ŠtÙûÚ2žDg `'~Ãò©)Z_Â#N¹@Ï]^3néN¢2°avN‹`=]²ÏŽî$*c Ì˸¼ŸšR²ó–í$2ã î5è,˜¢å±cKx™qm",„X =2“،£l!Á…Ñ£eZrY")‰Öº;•‹"w˺ÐÖ1ŸÄjc#ž³™$@åýÊŽù$Vc [+¹ñ´V¥ÖÁ@ÊsÙÐp:™¡">‰Õ8Ð<§ðuYÜ%íly±°c>‰Ö8Ô†CsÐy1°¼³Û0ŸDkiƒ3:\yݨÓQŸDkiƒp¹Ük‰ü @bާC,¨Bí¡6œ”K¹· ¿¢Ñ¯i—¥<€öP…Kl)5¿tÕ‘«@œj#*Eøà.Uü&VÞÎÔp«Äi›†Ó¸ÏPPÆ”íæ¿JÜÉ6œ›£Y% X9éjéU¢NŽ´™:· /f]ÕnèU¢NƒQ´¤8 ÜÕÍ:ú“¨£`„RœÀ`hÊÒ^Ç~³qœÊçò׉|KY‚Öº4аŸÄl#®ƒL=—hm±rÃ~³q$ ÷Ñð«ÄgÛlš@‹×9m>ôãÈøUâN޵á>QK[ÿÑÊ>ц^îä@…Ì%Ÿ{†‹U9ïêøOâ6„á\ZÊ)¸QÞ‹×ÒŸDm £éÊîÓ ›ûIÌÆ0è:fè2ôudì'QÂJv} ÔžÓ»¼•rsš.\ײŸ@m›!¼ ¢AáÚ:ÐCfÐe« 5eB¶£?‰Ú8ÐF( Y!˜š¸²f_ÓŸDm h£ˆ™R^Mrkf×±ŸDmi#²Cº¼S?ž&Ó*ú¸me;Ú‘ç]Þ\UF´Ç“ˆ,.ëªDEµq  È'hèô&[^îéO¢6޵QÐÄ%¸€‘»ZÁº Xˆ¢=Ô†»h˜1•¸ßò«Dž i£‰¹BÊÓ‰1/Þ·ü*p'GÚg¦ëp|„;<\™®køU O´AÌôà,ôn;zÓiR¬Džj#:Õyk·I¶Lšv+‘'‡ÚÉÈi“¼ö´ÁÖàò¼^w™t +Ñ'CÂ(hBÇñ\¿ˆ°ÌÉ]Ë€»q( רÑ1$Ú’>v (ЇÂ(lâI ôr̺O¦£@‰Þ8Fv‰ŽWÂ3rnÔQ Äo ƒ¤”„ýUjÝéÜ‘ Dp Ê£q*¢´…‘¿ç@‰ßúx;Žœ¸‚kó¤YžŸm9Pâ7¶pzæÌLÙÎÒq @pkƒÈ¹àG·lž_Ït$(1Ûp^¦û ,ºrV[Ç‚Åq° B'PñRÞÌ3ƒ J DZ¶Ý…„ŸgÀS,è‹ÎyÖ¥eA‰á8ØF¡3BIÀƒGý©ÑR0í°¶–Ï_EÄ7MžsR§MÃÇ üÉ6 œx” M,º¢ Žc%þäHNÝAâOÇ)Gnµ+ñ'Ú(rž¸Q—ãÇ:Ž•ø“#mĨ6§‡Cݺy²¢X‰>9ÐN;Wù«xöhìëÎØŽb%úäPDÎ@¥ËgyÞ¨c@‰Þ8†ëî†Î+Åg¦¼žÒP Äo ƒÐ¹@ТÅ&à.SÆ JüÆÁ02t"\CXteY°ã@‰ß8F¡sñÙÒ1•Ž%‚ãhPžHŒ§ [ÜdKÛ€:”® ¸ãйñ€èÖiÔ–~ã`[ËWø €%[«umŸ¬K;dBYÛoHPb8޵Qä„òñÊ|FeÇ‚Ãq¬ 'Ø4Ê‚QÑ— ¶š%†ãPÛœ¸K‰PþTÍoIP"8Ž´Šð¤qˆö%=j9Pâ7޳n§)Z9_Ö÷C¶A((í9Pâ7Ž„Ad ŠŽ”¡…×\CÇ¿q$Œ¿d‡læÖSœ;”ø!aÙp#5vÚ²Yª¥@‰Þ8F„çéÂõ°×#£@‰ÞF‘ͺü¾ îÉÏvnPb7Ž…QdÃJ8½¥zº¨èI"Ž„µ|áàIœÞ¢WFNguw %±GÂ(®YQ ­ÊÛ~;†’؇CaÄGx&(f'F•ü¢c(‰~8Fq-éwÏIXËQÿp, É– XoòW\:Ž’¨†g¨RXdî°è²JîÈõqÏž*Ûs’’ˆƒaxb×ã*~žŠìHJ" †á4•)QÅ­»ÊZ’ˆcaxÖ }ý©%(‰|8Fag¡C— 5q‰l J"Ž„µêC°Äçwµ±ÿÊ—w1;ö˜[jðëÓTƒ]g´[ö˜[jÄx@þú>cK3pC b‚×娿žGÑчD ÜPƒ˜€yŒ nýÌAG7ôd ™ð9ê–óLZú¨Ca‚¦£åÀñ—RCG9p(ˆtáJ–J¯sÒÊ-ŸôªDb…AH€þ“íúÎ@G 9p$ŒèßÉ@ºˆëA‰HäÀ‘0 &äÑžõ§ÃÅ‘ÈcaÐÞõ§Åż-j9W[³‡Ä ÌH#¶˜åàfwzï°!‰¸•†ó"øÅ-:N7–[jîxÛhD×1ä“ °‚üævË/p èjɻ˫çgK^ˬ4bk<6†Ìµž¸Û9¶ä´ÜL×óÀ:ÑÐE‡°¶¿skÉg™•F\íB~1¿Úµæu•[K.Ë4ž‰§/”Ð÷ió^ˆÆ«%íù}LÕ¨":Ë•·N:¯–<–Áà´™#–¢ñs¨ëÒ`ÙÁŠ ÌT´Ž-x-7Ó6‘.0üÅ%||õ²lûj[rZn§‘ãF%:í}= ¡ulÉk¹F<Š»P¿øÚ¼¡¦õlÉk¹6x´lC]ÆrxVçÖ‚Ïrˆ¿ðL¯Ûòzrç×’Ïr+m{1æåôÉu5ªókÁg™‰4ê³ÚéícS¦k·–\–[hÀ¢žNµ]º2íØ9àPÜF«uÉaÁÄu®E:ž LÙ:§“<Š+qÄs¸†…£Ë±²u;É¥˜G§Çb.…ß É“9×I.Õ±ãçœNy[#Ð}^Pë¼Nò(n¨Ñ- tˆëöÍÎó$·â–0-]HKY*ê¬ztž!Áž«q‹' =Æ£pT(ŸpmüBÂ<Óá6Oà~FTÏ˶‡Î)$ÀsŽh"äw;ÏGʵ>!ákp›&\ÞT MŠëæî °¹Gáq­œ¦gÖOYÖx•ÀÈU¸–o*t÷…Æá9¿øÂP*›ÀJ`lœ~쾡¬}Ú¥ðO‡V ‰\‡÷µxÎ n„ e3EXŒL…ï]2V–üÕ©cW ‹\ƒ#çuô^€BX_æjð*a‘ëpËw}júÖ} X% rí <×ä“ gÊ«Û-V% 2õ üÊÆòþÔº¤“”®ƒ#¿ÂMZØú°*¾E’Ö¿[ÙÌ(ç{rnØIBIï‹CÇÂï;âÛqQ›²w¢C’®Á‘cáG¾q¿._êÐ$…épàYxj(œv¯´xÀµ¸||3|Ÿ@•S,41¤ðÞ €ïè[zÁÙþ³Z0 Pá½ ÉÙØ”r„PkmÉ’¼‡ðãùñØ÷Å«bÛÆØ‚!yà÷ ¦1€¿¥¬~vÆ–,ٹ̚ }“&;ËòjkpÉž¬ÛØ4Šv3iï52ï‘™\²'ïä8ñttl :ËØº5¸dLÞÃ>O‹E‚púpÌÙÞ’5yGð1 MÒ.ÆT/ÚT´ÍÚ0ÀO 7f!1XÖϼ6öt݃nŒŸ¤²íÀI‹Z›Húæ}È*Ú«ˆ å)­M$…ónLŒk¥o]Ï8ìl"(œ·adbOïüÒ™9ïì”&)„7b`dÈfðà‡ï¹ä±o«4I!4†&ÀA!Þ˜ª •Ê$}ð&l[ÀjZòÍ6” ”Fe’:x#¶„'µâA§÷q”Wkë.IÍíµ:TP ppkX¸í’Ô\Ö†Aû}\RãÒóÜ@W£PZßéRþ×;µ3-ÁÆŸwRá¸{wÇiÜŸ…MýŠ]ƒ»’óù‹Â!f¦ýê"š²TÇvú¢ÔîíÅ_/´ÚáÿÊn»ß\_üâ!°C„‘ïõ› oÙá64‡¯cÄìëãÅþÍǧÛׇ÷O»—Ïonnï/¯ÿrñ/×€æ~ÜOk‰×ʧ$­O!óZ(ß9úJ¸ë|‡8žî²*oÖ¬Ê:]©îêʯk<ßµÕu0˜%6Ç +‹ë_ø.§¥Ž½WuyeSRðË—_àÓ—¾þ]Ö€qQÑþƒ%©üNÜzÅààt6ƒtôÜœ.Ô7{äƒçÊ=åïæ–Röùžª²Òiìðö·à*ƒÃ@x†$ç^›…^´Ë§?RØèûÙ ñZ½\ ygæ¹ý•)€Ncwö›DÛÁ,Z]ÿ¦{Ðãþ´{úÀ£w?ï -K»ß¿ys©ñ“¤KØßß¾îÞ¿Ù}ÒÔó+ú.˜íph÷õÜÿÉìÞ<|Ê8¿¿¿Ûݼî^_vÇû»‡›'z²µaªnWxVg€åì¡p­³q€Ðö7”%C¾øýÉùHIòè+!0fJ8£œø|¿C­h4žÝ}þü?Vñ¯ÙùðcRÎÒ+äèŽP@g˜ ‚Íbó§4.ƒóxÍ/bÀ•#ÂPv–R„Uâ»Æ@–CDd諸Kº¾Á’Mþx*½Tnð³Õ!¿L«`|‰d†_¸õt87Bã1³è1wä˜|ž<ýmòçøèäM|ÌïÆÃ4³*èü/=„çThÚ?¤sð°.wX4‘£EG{ÕB(¦±Þ©üÒNJSã|èýþ„á³€ aüYPë]ÒÍïÁ÷JúÎV‡”¦v5oòN†Úmø]ç+gRt88jhø|å|W_~]ãù®‘»I$ëtF²D²´ÓpåÙüGC7šB[¤O$º^©ÙOº _= מž\¹v½©"Û¾ôê¦/e[‡K8§úl{êØÙ VçU´Ö+gv=w¢¿Òó-p©ZÁJ¿Z<ß:'ã;b"߯ĸO³m ÷ÃÍóå²á‰×‡›ÇÝÝý‡û§»û'HO8Ûb0&²-~Ý*,qÀ¶½ê~ Û’'úò%m“}Ó‡|(¤7ô’£•%b°Â­Y6ŸÀó–ç åV–3ž}£›¾Ä«ó‘ÀÎã·$ðÊR†ÉŽŽ Á+¨uôWؤÙª ¹+»€-P ‹/^âéÝ5‡ç¤ä[ty()Ò-ÑæÁˆÃuuº'èÒ-ú&¾‘¦süÂ×eðŠ-¯œzüne>ò¨|œÅãþZS>ÂNoÖz|«>Ñ€/,Þ‘’p×(Lú»x‘ŒÏ"JÍ•ÿª¥!¬p°ß† Ù ÃS4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ES4ESôÿ±…‹I;m‚Úé§IjÙ=^x—tó›ny¼xwñ§Ý=‡EO}I)ššóüöTœÚ½Ýìí/þ¨¡@}HÞ›Ýõ›RµÞEP Ræ°˜¸»>^|½ÿíÃå•Þ¿½¼RŸR ~ÿ/<ã…’KnyeÍrÐ1î=^^”²qÙÿîûóõï°ºšúÜÁ¹Eï®qý³¯÷¿¿ôΩƒQJ›´óz™^bý¬ó‡d"¶øúZ÷k¨Ú«CRnÿæãÓíëÃû'¸âÒ!E¿ùH­ôÐcöonn/½¢Æ¢<™ýË»÷ß=<½ÍE(­÷/¯Ï— ó Úòþ$P~ÿðôz_DÚìoÖzHöß^Ò»ìï_¿»¿¤Ú“Ýß?•hߨÛDè¤q¹ ûOúòú/¬›z9J7÷7Owù¦¾$sÚŵ$#–dÞÛµ¤C)§5È• `vW'Ó rÿj/*ø?·¨p‡¿5\^þö þÐvÿH¶H€õ*KŠV\Pq‚oo^^nI¡T{óx6‡Ç÷¯Ç÷«ùú{`Ì×w÷ëvÿál½û“µîn_ó_ÚGìI¾;ìóÍÚúýý˲gòˆˆ—µDe÷»)à2ÔðýZõþæE¶ºµþõò¬žÊ=·ïnžÞÞ¿üï„¢õ!vÚ÷ðúN†?8åõ5ľÞÿäSQ…­T±ìo*?¼¾¬ìånÐÖÝÃÍÒSBYº›ÑÄ4ƧQþT*½5P“ÿxiâÁG o+y‡¿UdY»ß ”pX•V5ü>‘n!íŸÎÖ¾9käCû›š^^n¯îî?Ç<ÝÝ?ÝžÔYQN‹Ù¢÷ÿ”©#ÁïÛ× ¦÷o6(DCãòcìûð²Vå÷7Ëlæ’×û›·•GÖúšêÐÅ}XÌxþ`´)ü +²¯ˆK(õÿ¬´¹ãendstream endobj 282 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7385 >> stream xœ­ytTõ¶÷†  AÑь奃) ŠPŠô^!!Lz&3“dúÌ™}&“©é™Ì¤MzHº"UEz@PÁëÕkùÞõózÿOî[ï’`{\ßós±–¬Sþ{ÿÚÞG@ B‚a –¯[2c&ÿ×'£9ëOŸ÷j‚ XÁCKžœ¸z4Ê=0êȃÿßü7çK$-L~3å­ÔEiéK22Ãe»–eE,—G®Ø½2jUôê˜5±kãÖůOذgcðL}nÚô3ŸaÌì_ž¸mÒ¼ÉÄb%1–XEŒ#Vã‰5Äb-1‘XGL"Öˆ)ÄFb1ŸØL, ¦[ˆ…ÄsÄVâMbñ1XDÌ 3‰%ÄóÄRââmb±Œ˜M,'^$V/{ˆ‘D1ŠxxˆMU|²üdÕ˜+3¦³éù\—1Ì`”ä:rË|®²R+Ò»ð#êô =·„¨ wž8‹?½Ê«jA¡£§¹§újbôÚ éÿG”Ðè‚=…†!Ñ×WzÍEÿ³âó[ð9yaÝûœ€âôÜEñduîµãêIÐpÑÒUá/¼:ÑÜî/âD3ë¶‚ÅZD_@­Ahžèºwù¦1³&?C‡LuCCΡ‚s€5ˆxû½×¹n4÷ 7‰#>\ … Ñh,š@qÀyÅá±-çT¢!'èÖsGêZçz²Öæ}‹§|ô×÷¿‰ 8z‡’I3)iÍ0ò]¶—<`â6øÑ´l,>+üœ{D¬MÐéw©RƒLkgòéjð[j ÿϸÓCVz2;Y{7ZF»RªbºñS¸Ï¡ñw¶¿ÿÖ²oë ´æP´7ö¾@‘aTÒïÊÅŽúÓ·Þ²¥u•áH.¬#“RŸç†Do.êVQ-øq²"Ë‘£4®[q"æ#ôô~$<~{aÉV7•d‹v@Yí=³ÃŸoÇe4eøQŽ?0‰W¿…½Ï£Uâ£,{£Õêp;t1LDÂ.ËnþÕ 좽MiÌœ¬L¢“¶.ŽzÈùc÷£™7ѬO¾§/|v{ïGÿ^íN#Ó€ÌJþHf_ùq íú¢èâIÚ‘ä‰ÆUÅ4dY2]Ç^ð¤ÍÇ0â!r&ˆ?•ºúmXN¿*jG3X ë쿱,E“Ž3’›4[ô3”oŠp†LÈÅÐÚ^þÎw‡Ñ¤|ÞfUfFe r"'/Å6›mo,¶ú¬Å¸WÞAšz¢ü¨0À[‹0µ­dq®3GªMÁL\Àub¬ªƒ$3<*f;aš®ÆSÍ_ûÎÑ_~!xÈöÔ½[¦Çrõal^‘•rÔUýnCjŠ:9c5?3gD’3N¦êlö´7PîÈúŒfh¿Ð_Ú\pòÈ@`NÓS™/Éb¤@¦*Êï¾ið€,Ÿ ¼" „zÅŽ&—ýŒA5é(ˆd¢`7DZ¢ø¦jU¥²CéIЩÐ< [5ÑzÝ"bÔƒ€n6K+ì…v¦•¿ÈÁZ2i"”È#æÁ =w¢ì(y‹Wæ‘â#™…Y²YšÆbÀàõ%åE‚LÞÎpÃ7eïo¯é+ßiÊQyßÕ‰à„Æh’ã¯):ÑËпª1’©»O~¯ôèg'Ð"üìh®X·Çœ Z2;áÅõ«UÇšö—žlü’*î°ºîóYq3TÛ šœ|%ýHu“íT å]yZ_× íÚKÅh"œ"ïu@ˆŒZ•±>~ë& ùcÖÚk Òöº²Ë¿­Ê½ò`£KÁ¢ôK¸áíL-ÎsCæ²[[˜¯‹Êl–uÇ$arüÊÏ::ª»öÒî]jß}ƒcm™XŸ¼rö=-ì”}¦ÎlR3ÐÊâKH}µÀ#8ÒƒŽ_"ÏŠÓõ9Yù³¨w¯s'nNØ•¤¤T Í›œ¸™“dòõt³–’|ÚwíàÁ@ú|Š­iêmmHåž`´ªØ”õa`€tÈ*ò;ì•P@–g»äÉ™éIû³Ú;j:½”#µ: ƒö»#Hâé?0r±hÛ:lëáúeކ‚C´Íëê°×–÷xzNaç©€²lò.Ql‰Ž¢¤³Bt¤÷y±ÅÎæá²:u¬ÂüGÖÄùÜAmBÄÚµ ù³Êµ¯Î[RB©wänŠÙI -Ôµ´°¼K«Š2uÌêMmqG~¸óãוT×PçÕûº00?0\œbN—A*™â58]­¶£Ýá­+îFþñ§W~Œ¼õ÷"»Ö¡7™Í-µaÁëRžqI]'“Ó©CMûÀÇ h+ò1˜Xÿ+;›lŽ3@–:}ƒ.ʨÜW}B×Î2^3›Š97Rt`ûhŸG¾x+³‡‘Ôæ,Ãl¥k¡ÞâÇù¼~0Ÿß*÷°R;ζN\n=ØÊŠÞëûÉ"³˜ @‚cF¾£00¬w(þ17¦ïÃß&‰<º O›ÍЭLóÝY' åZp8l>ké§Š=¨ÈS|J€æ£IâE‹ÂÞÀº§År[`§Š+k°_» ¼ñ¥)EYõ@þí8zØçÐ[´*³Ic¢S­É”‚”¶¤Âø’\ì‹&PŽi;ÐÙÕÕþõg· e¤C ø´æ•´M™‰…NmϪRø²=ñ@.Øõœ ƒÃŠÉï²Òr?x TS¤oËÄŠ É J¥ZMÞU»~zò‚·s“µY¬ÄM­ÙH­â4Ù )þF ókó éuå÷äã±²;ð±¸äL§½ÕBⳕºñ}i)ìaa$Xù¦è0u1ìt«Ù£Â?Öษç†ö­ å–j Åf6¿µèg9k@ïåéÝõ¿ÂPh 2Eöý`Íeya³`­¥º‡R<è5L!ÑYdh"9RŠ›Ñ*@£»¢ö®ËÑã¹…Ž.øì·¼¡y³Ds£a¿½ÖÕFÛ<âvôüw®2 Û}ÒØ§¹—!|š _ï«^šp+}]Ø[X#Fãg£ Žâ¶s;8 §àÆÝæ†" mAáH‰r©¾1}«Ä3WßB!§}襛hýáßnvžò“óK¸Ç¸ÍupKèt KTÙÕ€Ú^¸èõ’zÐ¥!ªÂÑîú/ÑnžÈ¹ÏÖRú±s¿ûp+ÆKËbuú$P‘²"u©ÏWÖØéÛõl ÷h¬ŽÊàAË~ÎëôIÑÂ>aîJF£X!Q…çn‹#¤°9e­vk8ú-(--+.²5­ãf7fÕSÓ\g%zã`ÔM!:‰.ŠÑTz…þødÉÙ§i®í^òð;åæT3´ZZ0‘Ûˆìø‘iKqz*pT<°!ïˆnµÅ­ÌÒLÝ´–6švlŽçÄÑ"~ôÝéq_ú»'0žWÉÿÒr2ä e©})M8~>ÑÜxn´ë?8ÖuÀn§ã¹GU »ç½ ÄB²Ûëtz ˆ,Ô”¤e¦Èãw·)z¾¿úþ •Öˆµq+æ®r=ÓSp°•쥫0Eöã à˜¥gÌFÃ#‚ÛpûŽöx\\ÿ«‰ÚPVo¥MŒ6~þŠ4ž¼7Jêëò]~J³ §Éd,¹z¤±¥¡‚ª?T~$»1O¯gŒ*•µ&,lNÓÊÚÛ4÷ŠM¼°.ù&Ü€îR4ûKôø¡‹7?¸ä_OÎá‚§m瀛=žf©Oâü¾~×êír‹Áª¡ÑØBqŽ.Z¤&:[»;:â¢Ôæ\³šþ$Ýè_Ìõû¢ddÔX”¸ }7M9f<4Jrœ¹¥µ¶j»…ƒ¸Í‡õõüé¥ÞÛáQ±R ÄíŠïzÐ;8O8.¶ãˆ«C_‰ÑƒþO?OÉßø ¡8ë}b± öö›ÊÞ{bñ<ª B„èFé†(…6V—B뤚(ü^;›rü㺜üç$¥1q@Æ3þÚ:û1k= –üV(‚s»šÃÊÈ9âñ¢P©£Ážçd%vK”yæ{x6ËÀ­âvð´(rø¨]êŠË³Ýò¬d…4MOeY5Å-볋µéru[Fã—¿¯_òŒ5@ªró+«‹ZÊÑ'ÑlgžÚË$Gâj"§Åq“ ¿Š- Õ_áØâ™*Y/×eáöwgø{gÔЖ3(ü´°—è}MÌöOýü^1a+ÔRa+£.¾YXLJsC0±‚Ó-»Z"銴2ÃG™ÆŽ\Ó™] aäôׯMŸ»°í{—¥ÆVI±Ž |ƒŠ1+ŒÔF.Òlb´-x¶XY¶ÀEuªÙÕ$h$œ GoDtm.¡µ–7+d¶xç¶"¸JÞ¾qçS ÜЄ)F ˜IÜh»{`Ø/ ®ËòþbF÷ =ï Ѹ˜Eê’Œ´ôŒ4¥[éñy½^ŠÛü¯¹bÕÎÝs–ƒl¶³Î•_Î~HO“%F·Èö}|åbO9õU`°ùåP,9 í\?yNZ‡ÙæfÙ2;Uy®ýäa «òdé¹f¥> ‹Á*ì˜D“ Њӕ½Ö–Ã'63ì!w:ôoíÑn2)øýŒŽßÏôo´òJò¨:´Ä‚C °^á©>3a +¸e¡¸TºõWž‹e=ê0šì­DOÙ$òQ§ç™ÇO«{5QZõläÀß ú²tÃA8Ìtów¹-$W$LJVàô¥f¡Ï ‹kÐ:{®H@ç©ó=RŽ¢ˆJSKð c`Ô†LüÿlráþÔÖÖÊê†Rª¼©ð],r¿¤”ì5²;ÌÊu×{Áâl¦qá­à†«³+¶;ü%_{wËþöÎ8I9U,kЦ€²óùʪeu;VíØ°=’Z»8S›¥%q~Á ~Ü/@ÛÎ 2ÌÙNÛ¯3L$0RXR‹ùž†Éeô3¹ŸB¹aÇNrÍæöÛ>kƒÍKÿg`ü@x–ô‡g èˆb¢! v[¢ï=ËLñ ¥„qsÉëC°‹÷cäæ©=½¡u‚¯Þ¨ùgÁÁšîc V•’ M1š<¾Ú"ª¬±è}LY,d£ôØMF¥I“³E¾2ö×ñ/MEïléñóbÿÁJÿ;6ë`¡”_Ó2T:$1ix^I´$ógÑ&Ÿ¶™ëH„\m¶ÉÀëƒÐR¦Œ©9ÍJŠïÖ!b˜Xˆ‡XKÂÝk1]ót‰yô©¾Y²,ÆB‚%ÏQˆ›Ô10ù÷Šx× øÏAÎñÿásÐæèuÑ”þü6ßVX [¢7ÿ™OC%v²¸ö¢)¶ª|¯­"ßëj} ÿŠÓMŠL|I½„+Å=1#Q9rî~Mú)r Ú?%.ŠÛ¯´Z½xwòÕ¶òô” OËj‹´¿b¹¥¶›m´ÃÜn‚8ÈÕ«Z® /-4#À˜=æªó¬ÄéÜdÅõ¯'ß‚t ósµPØš¯“[hVÁFã ÅdÔšN×·"43`2{Í•°—k°]ûÍÅ<ÀCnÿ*¬p?hSYºú_6 ŒÅƒí*F WhEŸ• ÿk/8K°vt÷G×›ý;É)—ëúÃë×>_Ñæ_­y°¶yüþBꦔ2k™µ”¾.9õ  ¸\‘£•u;»<ßžE#¡NAUb‚A9dŽSáÃÐx‘A*'ZÁ=‘DÉ&ÿ6øÎïž»,g‹>]¢MÈÝz?ÁÛÉú ôú·4ô{!Z[,–Ï [¹="¿+Vd£UŸ_ŠF `4Ì«oŒŠO’&H+Ôå¾â"–Å×þ_´æ¨à3BtçHX Ïm±ÙÊÁÆ“h(“ß³«½^zžÛ%ü#Üÿ¢è÷ÄuiN¹4!)!½D^YÓPÕØÿ…,¯â§µAiàŽ0ðmo˜8/ßjç%TëR© :µêëø¯E&žûl¯j·+ßîÊç/Ìðô>Ž3yÃ$kèŵ€žææÔËúÖ-XUò4 ºyýzð$Õpá z¾&¹î>ƒxgBË™WÐé}×è–3}˜5‡²_znW —ÑÊ;¸'žå—<&ðRjÑ °±W|÷S”ÕdÓÌæ\ ¾zÝæùº\ìú Ç|39k; ý÷@_²6V£™í]Û²Ó°ÏÒ û`?Ó9øÝ`À¶´¢…à,`ÁÖ¿á5eœs{žù;ñ±^ªAÁ4þ!ú剫Š*K+K?:Öý.|I~³ìÂLnâ«ÜŽ¥q…ÒæíhTs…º^mÔõ 0yÊ®d•¸ŸÒnÈ2™©¤ôÃËh5Õµ?îU9óÒ¦ùÔ¶¥/oKVrS^ˆæ&ãì…C v‹ÛJ9Jêê ªeþÌY­¼H$Ú:wuÙFZ±)|ù l$1ÎTÛ.W’-;`hMGþzc?¿Æçû‚ˆ+ˆöŸÅ¶ëü­öjÍçžKTŸàqó½X®Å5±A]#º>;K5}×:zëúôH<·omºB…}lUz¾f ,Ëy«{Í-ô õ#Ѭ:ýV{È‹›NÏäȉcfo«QTïÝßrÈ£òß-€UOÙ³YÌK2:Vš„™WÖó—o¿ëØŸ¾([íã^ø,[ž÷{ýk¸¿“ÐVq^¿F$‹s]Ù:…1[Ké”±Üxm|N~la¶5¦@VŽÑ­1:xöÌòz¾-éÒɤú,ÛÒ1»¹‡ær­™2{jXJŽN©ÄÅ59rl¶B·«€rÚ]ŽàÅDoέÑH'Óã¸'B¹† þ3VÖò¢Š|ªM°™`Iý©¢B«®Pg3¶Z¹>CÏû`™“˜ÿÃÅ„èpà'qÖ¤e+â“Ôš~2ò ùE(‰Ð7tïˆJ‹OJ/RTW;;…#DþÞqb§t”:j*nPaSc$Zä;Y¶ØIBÃov½‹sªMW”äÌtÉüPåN‡u>7™æD}Sĵ™™{¥‰I9åuþšº_õ“.d±^ Z,*v}üEûX³w÷MáJ9Ù išY£ðÌñ¶ ÍE‹/ "@ó៩HðzFí·¿ì¿.UôGˆ©=è¥4©G8ùû-˜ë@Ù÷EÇœÞržj T¶G§IÅ󖪊 çΊ“R¸‡¢uT:74ˆ“‹ÜG ?.>än´Û \n‡¯¤OéõL…Bú¢'x8€à x4Aü7ƒÙîendstream endobj 283 0 obj << /Filter /FlateDecode /Length 3802 >> stream xœí\Ys7~×¯à›‡Uá÷áª}Hœd³[96’â­Ý$´DK³æeÇûë·‡=˜ŠiÇÙr¹Ê‚f0G_Ðo#VòÃéçÕâŒnÎ~;ãáé(ý¸ZŒ¾¸<{|ÎýˆóÒk-F—/Îâ'|ätɤç#«yi¼].Î~.~OxÁÇVjïÕ…Á²aL:Sü:ž(ÏKÆeqõJøÝ@+Ìßa5Á¾¨ðÝÿ{>žW¬H¯°l½W^µÊ«±0¥Â¯ßàSî=g;à¿^þD0®%Ó¥• ĸ¼†A?2gU1 mjèKˆ¢š.¯ÆÊ—ÞyYÌ`¬Ö”Þ›b±ŠO­(®gózû>Xîʳ±f ™4M›BUlnÇq@ÙœJ(3±Ðgã Œ>÷… Â3RNsì¤R…&ÏAd§p²xVásXÃxqCê,qngqžÈ]l°ìÓ\oËBk„6ªäÎ/Èe ‚kh.Îcmím±Æ¦¤Ú®uÐ×˱–Ð6­÷tx©W‡˜úœæ› =ÜP¾…^aÒ”•8ƒa忺<ûñ,îæWüwsæKkb¥-…–qß’alò2lyi4 ß<BÊórªÿ†<*—¤¼ ßVäùœ”Ÿ“òŠl•2N§´g-蘯Ú¼¨?#åÎò5óÆJéqÍZS;- JíŒ)^ÐÊb`d×3¸êÅ®L6Ï»*Fixé„ooèÞÔ}ÅÓ\ÕÑ-L·<ŒL ‡J¤µTK|lá1ï³›|úS‚ËÃOB¿D ôa¶-'}ù“Lœ‚ ’\v&.œä‰Í*¬M„*óQSvðÆîÇMC½Œ7Þ”ÒJ·Uïëùj³XjPÌÁhtñlC1Pº¶€w0 /@NcöF1œmQp±èQ•<*>PÁ°RÚ)_Ìêêún:¯?C‘c]ëå:@˜× ɲž…J*€ÆtyÍÙθ"Œ)ï`†6Õt¾ä—¤Ö,5 S>[^Ï@q¤œ#–„U´–VoÂaaÁãŒdP÷‚¤Ð¥6Ê”RÃ8M$“v¤[Ô‘çHðwŸÄ¦’úµˆ&ÙÁíÓ(¥“G;¨wåcŠkœ¡„w" -N2Ÿt!SYÓÓ¶Ø­¡: Ÿê[5²Õ²<¾¢Oisuœ¦ÍCá->ƒµçÅ%D3¾ø†î7rlZg—Z{³Ø"œ×|«6U®w²œEzõ­T¥v¥ ú>G!éPˆñ&œ Ý9.UÚ'½l  Ju>hI?‰ŒB:WZî2ÅDéÒÝ|S½ÎLû NHU߀³0Ï]q=]CÕðJ…ýE8S3Œ›WøP¡S ®«ýL†u±žWËÙ{áÀp¤¥ìÅ£FVƒ&¾ [(3ñ GƃÉ-¸é:ßu‰½°ƒÙKZȰ%€åî0 ˜çCÙË!Œe¯é¼Ûѽp{°éÜ¥qßq öˆÉöÝ]~RÛÄ&€à«:eþ<ÕÏ@¶W‚«¼ôí2CϬ?&»æ0£}W¾í_™cðIá| JhŒàÓIÍçîq:'d)RšÒIß–ì4¦³Táí¦÷¨þ£ÉŠx‘:“¥co/—ƒE7¦³¶²„“̯dÂÞÇYÈLSÎòͪ}\‚¯TÛÅ©úaàî0@aY£êoæ‹åló¤M5¯ÑüÑÌÎ^U› 0d"™Æýþbõ*–q?úkð@›Ðì£~²• ð á¢ãã2õ¡€ŒRŠ ¬$Ôö h$öº‚™ôÆfò;€NÇLN@s°™œÊ“P€2'2@ÙkA§Ù± {@z¨dA÷x·§}½$»ã]-hZ‡Âò‚´y¨ý4ð¼Úyœióu{1Š]i¼iÐ-–ßv­ãAg€Šo CU<;Éœ! FÛ=Ÿ³–Š—p&„îUñ‚¨xªÑˆŠZSœg§æå ö,—5§PCoŸÐª1ò†|oš¸Ö4˜ªhN½MY§ZU7ñ±ƒñLó=ž€9“º¶þ x£Õož/DVDѾ†.gÁDÑLC_ó꿳蔕!"‚îND‚/ðƒäs]5ÆÍªÞÌváÍ]íà !tÈ¢]¬/Ø&iÛ!ZÚkjÅ©mä}Ë{á*•U[×Âö€«`ኂ ¼7¹;A!KoøÖå%=`mîò:ĵuŠð£7jK´õ(è½Ð–êòwú:ÆLëPS’à×Q±E[*iÚ»â-žÒ@RàSò¶tò$(ƒI ÆeÇéÝŽé@ÃV”NévÃ'ЇãÆÌš|ÌÛ%êõBï\öÇH¥tÍ2©NýZ€ÂE¾”mçú ÐDXÙñ¥˜OGE0ÿr ¦£ãÊõù…;Žæ€Ùó^¢ë3yšo›L™žï—ùËi –’sôInú‰á¡ •"qÆhnK¬ŽîJa‚[˜¾§8N>í+QÁ-oåG,LjÌÂ8­îãpÒA¶-BS_êzÀ?¸ •]/y¸º£ÔÁ늀˸ê‰;§j°WËj‰lMEçuXKé©#»¤Ä0‡ó¥D—A Ú/Çù C6Ä¥&- 9vIhJ].ÓA1iEžÃük«¯®E¯nÃ\p6€§ºH\`—úm•¼¡N’¶ èàÌrL–óŸBÒ§$$É…°× ~ !y5°xw CÃÁ[¥µ[`š¼Š'õáah ˆ±åäÊ”ah&­9-áÌ·Õô)ø · =ŒVçá/Üš’kÞ3.Ï{‰  ª×¶û;=i-­ÍºÉ\ŠS¾ös „»ü)Pñ=ú^™iÀÏÍ@¡¾^6èÀµ¶2eç9-©c3b€1ʼ¤,„HCì)”ÞŒHå~’¦ú:Æ¢›¡¼E1ç÷Ò în0¹…UÍýœ”/.žàv2Árq·ÞeŸ­Z\$1χt·¼BQ'#8Ud©!šÐ6ÝLëÙ¦Þ¾LîxôWÀ¤Äqtô,'‰X`ؽã2x>G>¦ûa*_è 6E ¾ Ì™C¬ZÏgoÕɃã–z ‰æY´¼(žœDžyQŒ!ƒ¹ˆÇJâæÓ‘©¬³m$#Oˆ,Š0SôO^ô;x>ÿ¥ˆöû@!¶@ëÐxôË×yý$Ëóþú1æ&ñ€ò¾¬‹ŠvA°÷"'ÀÇã ˜ Î`š²)¥êO¸NÝŽj4.àI×)¢>–ˆ±Ú´%; 8 8AŒ»vÓï3b,ŒØÌdyè ¤C9ÙÙ mtň9÷„u€ç˜‡áÙ»l?-s šásÚ“ul”c?>«˜&t(>‡!‰ãsˆ¾ŸÁ u?`¹œ{ßã,¸Ðãy˜¼XQ›þÍ4+x 8XÄýžÞì.ñÎø3Ï¥å»:)Ì0Û¼Y‘õ—u¬†SÁ=übZ¡ L Ûâ6ºñDžÍ³\-Bª»–1;þÛq¸ ü"&¶CO7“oÉÊTË$©‰þ-up> ¦ï÷;8Û²…åðap<Ë9“Á© ‘¶xõq9¸¥”GýaN…‡ðr*ô@÷ÁN…4ä§B„h \[牑{ã÷ ¢v7¤úÔݰ—téÀ1°ïDé…I°Ø¡°ÿÑÛ…Åð­lKsßB¢‘OT5¿7ÂNUKžøMü”¼:wFiþcâ_8ùá0ÀêØc×·V§Ê1{?p·ñxeìW:Ýt¶KœŒxøœ8|zÏá«âÕÜqÎÁ¾õù¤*†œ²U8H†yC‹×û29pÆšC³¸¹zý}6Ü¥£§ú}w<ÐÛ4Žf©Ð÷Ö€Ú ÌÓÕb}·™nbb=~-'G‹~}[]ÍgÛUñ¦Âó³­GÓ#Ÿ>#Lïñçä—¿‘òÓÇçäÌÑóG‰"9øq½\i…ÛÞbÔ6NGþ2€€$›Û%v@£pßrS-Â^†9Ë6ÕÙ.ÝGô–€ |¸'žtï³urk°Ò}·>l@)Q?Œ»J©?Q¿?=õ[ Ô§R¾>-õc,˜¡ÿ'ÔJsú\záDEä“–Ñ@0<í=a‹ÎuaéŠÚ.SoeaêÝ7ÔÓÑa% !™óÅ¿‰ê½Í±›–• ëDZIÎnC J'ƒ~37Mýk(ÊÒD  W i#C€)„.9oî²]‘<Ëÿ€6èÉ(¾¦ÄrƒÌ!0ýdònÞJ´hÒ;> stream xœí\[w7’~WöGðmš{Âî—ìÙãL6ã™ÝØÚ‡dh‰²8¦HE¢ìxö·o€î.t£IʤãxONΉ[M4. ê«¯ øyÂj>aø_ú÷âæŒM^Ÿý|ÆÃÛIúçâfòÇó³¯^Ø ·µàZMίÎâ|âtͤç«ym¼›œßœýX½˜ÎXͼ÷ÖÛjøCúê Ÿ÷N»ìý>+xï}ö~}Ñü%duÖ{.üßÏ¿‡q?á¼öZ ì‘®–\Nf’ÕžI>9¿„®ü8ñŠã—ª·ºúût¦<”ð¢úþ\áÿ–ø¿ù”ÕÒ+.yµžÎ¤°PJVßN¨S~ÇÞ3&‰=†Î(¯à½0ð¡1Õ;|²žÛøN1fª÷SÇkÁŒ¬jh$öÜ8ÚsÎd u‚®Øä$ØÍU¦¿§ºÁÐ"Ú Å—© ¿œ¸öƒE’åiÇ¥Ëð­ç-j<Á…ëï,ìÛõݼ¿J;ÈÐÖHÁIÏW’<˜ø*Âwc†eÅLp@©¢ÝIÇK=Šq¶©Ç€šÎû@ùÕtº&ïCAZá|ÚÚ´u"ç…B2À“Öf•¼ä‡U†T–ÿœo£+.Ñ”þùö:Øc°ÄµûaQ ¯jáxÚÖÊÇVâñ ¤ÐC<=T#ÀYß…h„ÇáØhê€åír+|ºi»Im>¾\®çÛE¬äH‘Þâþ"´ê¬€þn‹X@€MV®lò’xÿ$@ï—iý £Cw¡è{¨Q{fà1îVhŽÔ"štï ÔÃGr·töb¢­­58’Ú õF&k¦32R€Æ)©HýhÙõü&°Ì ºR¡ÍÕw¸þLÇ>FsvÓE·w™"‡¡qÝRäa‡Y蕎؆&{¼{º| .tn¾Z4¼zX_¤-oxÐÕ9ãѾƒöËò&(tÊꆜ“Ä ›òOèNYz4õtäür‰;¨­ùds“myŽÈëX“o¶wÂ÷óÆ)âà+“!†êâ5Äù?†ÛÓÀ÷^L†œý“ur©yß½ a…`ùþ¹Šî‡Ç—ýíG!{z/4j®¡¢/™*QXÂîMû|Œ!x25GË4qWpF qúéhœa¯ƒø«@ë ]™‚Ž9ô’à&»‰–¾–Nx!ûa´Ì«îZ0ñª¶° ‡ÊÅ”•ËË! …G°1*§ez J[î`ŒVJ×Zt! 4’¶º~àëKüM/=µ¡]~t_Çð Óªz×_×TžŽ7,[œCR5uˆ¶0†5ïb•   i\-ÆÍÀ¥Nêhà9¦ºßÄï,Ìã«(*ã«÷Í˨÷tï¢™Š¤«pB¼P’Àn˜wº+ÇÌL€ÃÎÊžŸ¶^<$£ ¡'«õb Ö,"ļÁ40MÍÀr¼V‰ ¾Âg,HW™ÂÊR!€0Pí» ¥±Þ”i°Ì|ÇË€#¾Sr¢œDO Ì:ÿàÓA ±‡—ÁXÜå©ãWª<-ƒ ÜÍ À×Zhu/CC5åeÉq0/“žg¹fžÅÑ’í¤l’NP6ctFG¶=>ŠSrí¤lÒâx,e³)ó@ê¼éÃê€z¶¹Ô?Ð èš¹‰r  ˜;>$?)lõ$œÉGsz×¾Fš` ´ DPT%aË‚¢ç<á†JAµsœÛä`ôd­u£ž¦–šVFg¬g¼ :¸’dõÐß{fx/5Á%ôª ÓÜvQý[PLÆÆì‡Œ} Æ`»D[¡B¦…ËÝ÷Û6Þ³X_.Ö1™§EóÈê]m¶eË C¶„XÒa–%Q¥,ŠÂ1ÌÝ‹8†‹±<çZÎ_û}Îú©òp‰1å'(.Nk\RV,e{ÔÐN³“”ðÁá€Bù& NmZ ÿ–hý—ý÷G' .TFL`5cýçn¶Tù`N”À0ñSäÔs%=r;àÊv ÐÊ)N‚¬“æ!Ýì;ê:H‡ •*@ê@»ÀÐêDm.±Ø¨P…ó&fŸqì_P ²µ±2ÏPs&dvèŠ vŒ ‰q²ú>tOÂ5‘m=ÇqÌ7ûpÎM(Ð\¬¥|ϯ‘ü ©º¢qçÕâf±Þ"—cEˆø£·#­ŠiÛùvy¿]^´¬5š±P KarS¼(gÍ¡õu$Äzßž÷ô7Ô^nçhllh˜RæÁ ÖL…fÿƒü¶¾Z ‘ÏøAŒÄ‡Z{Á.+€ðËD-*mÂý©éûLf—K,öÓ´ìàA79o‘ªǃƒ\ÜÛÎÅí-€‚§K8î¬4.Ìånþ¬@É…îj& ?Ut¤s9ûú3ëg2/ŸÉU‹ÝÒŽ¦ëõ²¿€_µ©Ûr<¬£ŒÉ€ÎNµÞœ ‡ÐéÚjV$“–CxHÞà»»÷ª x„öšê:ÑHù˜=¿ik1Ræ¡<®˜bc|¢–3Füÿo^DªO²2×ýÁìð’tb1"Ügäy52°òü2ÖØ€p }x>Rç€Éú´Ç` N0ž¯Íc0wçQHEébl-q0–Æû^ÖÖ¡iÔ\’€A(9Á¤wƒý8aF‚F"òªK„ò#4ÊHK ‹µÎ¢>ºíÄxÌx@qΛé2,T &W`™ƒe!Å¡GÑRä Ź=&éÃ ÜøAŽk±1œ¯ç7èY#ïÊ<ŽåeÊ#vÅèÀ|Éù¼Dsý M “ïŠÇýj h¸µçhz1ðçüAnu/çÞ¦c/¢AEîñ«‘³Õ{ü©úÕÖÖ¦Osx{ˆm<ܯ³“Q~ì¡B†UúbàW§ew «ü!}ϱ`Ã…æû’ìBC'٘У“ì>±}=RÿM.þeZAçpí&Rúösw«¥K“FžDPÒÁ¶r~ ¨ž_-j[Òßôü#U3A—ó?8–ÿõ:¬p¦Lž´ŽYjÒ†ˆßŸ‰bÞ„l1ít?:KáS ÇcY'ãjTµiiÉŸæëmr¾,§©]˜§a|pM~ÀBËÕ"zؘ8ù¢Mù~ì‘)T¡’hoÌ€Á6>@{+cVå§½þm±¢!¦ +˜ûÚ©_G{r‹Ë"¬÷œijoíŒ9!-’U¹ûr¤C•ŸŠý™Ôù0RÏ:VY<‹r»§PýLc ã«þSú#P5`y™ìô7<³ÆÏ›):'‘,:úD™PµÓ3:,wšaIS)ë¢ñ:Ãa‡=6ŽöŠØ¸'­D0ÉóW-Ø…çda¥kÂÉvŸøBKӥ벗¨Ï2Hòy[äÙçl·„ìzO‚”*°<–`C7ÍVZʘ+5V íÝ@á}›M¾îïµUì*¦N§ô©BIð~µùñíM,¢anà‚  ¨”qn˜ÇA†T$\OL5æ»MÓ—‘&.mGõ¤Û8ý¨o<1€É)>ÏU~ˆz ÿvæwEæq@Àާ q0UªÏs“Ü¢õåæ&å²¢ã‘lW sþÃ}ó#ïw FKšc)a:pŸêö.¦ËãçÊÓÙè+Ö «$ëÖÅj?ÿ ‰ Ìú‡ÛÂ!¼é†L:|!Z>àËè2cæçœ`3·'"Mé0ov°ýW>Ć#³ÂwBü~ˆm¤Ù„­8=@Ëv¢ ìr¤ÿ”þvˆeC?Ç@Üs~‚³ Ù üÍ€k¯9%ñ k±tµ´æ”þ>^Óáy^óŽñÑü³ʬ½ÓÜT#<—UÝg.¸ÂsNû`UÚÖýµ;W0–- fCúÌ|¦u¼*‰"º¶HÉÓ€”L8Óôì%ç‡ z\ÈþÓ. d¥[Ì2NxDÀÁ®““^@ƒîˆN›èÈ(-È HCò^#¹É`…„hïŽÂ3ãÖž 2jq;¥Í9ºŽ’É pµ.¤Òî±Åª`‹?Ò%3ÐA%A10¨U™]2C­S*ÿ»1>=[Òmâb[Ä–$c<0Ò{¾=½‘ÆëɤùÊÄ­¦ðÖ¼G†‡Ã¥)ƒ×:G]¸'÷ £Ãúĸx™Œ9>²ªÁËyfÍ|¤H1èiðgGäN3 0®œç­´`Žã¡q[Jà£æš !j®iÒÐ<Y²zK€ß2ÉÊÈp$hÔ:¿V8šÞÝdyÌC~Fм%]#ÉzsìP ¸~›ÌŲͯ£…Lj—^…âçÈ–< £ˆþúŸIÌè±=(2 Ÿ7FåPø±Œa™M ƒ†O–¡Ë÷ êÝÇÖñhðß"ób,‡ ä¸*$T$s»SÖ(ŠCT«Ž©i%åö1¡³IS=ñ˜ %àp,p*PÒ.#iò/p'Xì:%("CLÜ•¶ÍÉ\p؆˜ã å /ay <¬›þÙg¼ÖI‰èO]ÅgLŒÜ^/Ò7~ìˆA–ž¹½ §ãç2«ªMü¼ù:ìýAúd@“›WéÌs3º<§hþj¹Znß#³åcÞÉuºéH»*;0×–É®`HÔ“ÒÕæáûÂRffF¢uƒºÉ8°Õûp:›Ë28Qò?MCލçÿ;ÖYÂÙÕ«‹rXQXYKNobTá ÈøÍ©4®¨ãûtØÂz\ô!Š‹!<í þpXaŽ…c—¿vRH:lŽ x‡\º8FN ñpá°E³›?lñ±€2}_S¡-[.sLwµ5²ðßÏþ†¥•ÊGó„P=l¹¾ÌJÇ É÷9ê– ÷2*¼v“ÓÿÒ—ÿ*ž˜ o8j gž¥W<ÆXÌhw¹ƒ"a*œ`Mx¤ÓØñd½£ÛúvµÙ†„@Ž)ôŽÄ¡ê´a …ÊúçRi´^7›öòL¬»_žL…ª™×BŠ©xDïz¾N÷í ÝÒHeàåÛm+ò1*%ÉÆÆK€q@u(ªÀN»êvpcù2 ^)KYšIÛxm‡ÄJ8y–„–ìÅoóààýz3«qÐÀ­úØôý±gªå)Ÿ¿$Ï+ÒMýߌÔóXkq×c!WðnD& 49[´éζ߅ãOæyð2t6—ǘ„Oq/xÜJ*:ž`@h\ñžÐ% jŽ×yï´ z·MGôœÝa0˜ZÊ\h C¸eÊ;N®þ¥ùㆼÛÂjê<,AA/׋ûæ›L1j‹1êê¥lްÙCÃÕV}Ý3å,Bð,Á÷$:·9…ø¸ßluîë5Õÿ,;ß—ërò]ý½€A{ÁÝè¥3w±ˆt<>j2#ž qØÒ œ £j$­” 5Û+pº2'áñÁ—Ѳ0ZXvGô*h]Êã.–b‰.ø_ôs3RÏëI‰‹5ãÜ—#Åý¡¤.Œÿ&gÜŽ±2Ö×x6&[ Ÿ·1¶VBæ#¢ªHDp3kø@p‰H¶¨ÑÖøÚ9[œ¥ƒ\?œý’Ϲendstream endobj 285 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 423 >> stream xœœcþCMR8‹vøzù-‹ ‹ ›øÄ½¸123OÁEøˆø§‹¬ø«¬·Ÿ÷Ú÷Îù¦‰ŒpbcVs,‹j¦‹Á‹Å¦ü•fˆ,hj´Žá‹¸‹¸‹â‹´ˆ½ #¬h,ˆ—°ø§‹Ý÷ïôí¬Àô÷tê÷®÷`›šµ¬›™ÉÄÆÂ‹æ÷ 'Øûû <02Z²„™ ªš±¿Y‹¨ÔΤ¼‹è»<7#B?û û ûû€‹‰‹rø¨÷GlˆwƒYx…ƒ?‹{‹ûFø§v©Ô÷÷±òÅ¥Õñ÷bó÷‘÷âÚ½Q"ûDfVT@ŸÀh¯¤¢¬«t¢kpozc,ñM÷÷èçïÞI×%¡Ú§ÆÏ‹ÛÛ1Ä# :Q?f¤{¥ªŸ¡¨°k™uŒµÂØŽ‹¥×ƒ$Ena}{mlt‰N‡xŠƒŠ‹~}”‹œ 7Ÿ ‹ ‹ ‹ ¼:·7endstream endobj 286 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 432 >> stream xœ¥ZþCMR7‹wø–ù,‹ ‹ ›ø'Ľ¸123Q½NøˆøÍ‹¯ø¤¯·Ÿ÷’Ü÷ãù¦‰ŒoKL0Šb‹g£‹Í‹Â§ü’j‹~'egŒ÷ް‹ª‹÷ˆ¡Š½ #¯e'‹˜¬øÍ‹à÷ìõè¯Êõ÷ƒìø÷JiˆuP~ƒ…>‹}‹ûLôè®§ÇºÕÆÐÉ‹ê÷ !Õûû74/X¶†•£¨œ¯„®WªÒÏ¡º‹ï¿=:4MFkgû…û‚‚‹‰‹oø0øÍw«Ñ÷÷!§÷ò¨àò÷oö÷¥÷âÙÃU ûCfQc3–Æaº–¬‹ «s¢loozb-óN÷ ÷ëèïÙKÙû¢ô±±Ö‹ÈÚ0Æûû6U;i¡x©ªŸ¢§¨w l®·Ð–°‹¸Êu4a}]qljeo‰Yˆr‰‰‹†Š‰ƒ‰€}”‹œ 7Ÿ ‹ ‹ ‹ R”¾ endstream endobj 287 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3766 >> stream xœµW TSg¶>!s´ˆJzF¨½çÔjµZkµ­µNµ¾ªÕVë ðÅ‚ˆbx" „7ÉNAòL Aµjmu¸×Ú±R§ÚÒ±Ú»®µVevX¿÷ñ‡묹µºæ†µ²œ?{ïïûö·÷/a\]‰D"[¶fÜَOòuw)¸»V{˜{‡»2jþ¨ £_]ùLŽû÷0÷?QéöÈûêXÕXÝXë¸×;þýñ<{®‡ýØìn*“'º\ÆÐËä]è‚wybd4°RP°-ú^C=Xà”öî¤ûd»R]"®f^9{éb‰ï¨ÿÇg7tndalŠVuexÍzX þAQk8yÿ#–LÒ¸)Xy×çE™[E¡Í`Ã>¶ÛÜ:HÅÛéüÝêË—à*÷Ýk7Èï„Ç.Š:Y¿A&>®cå´šw…X…ýyzë_¿›ÿ%‘–ŠkÈužŒ—ùk ›E´à:ö^笕ïmš?Eô°çjÌöÙ&IÃMl¼)µïÁpŸ6HÆñ3ˆ„Œ'üÃWp޹ÿ#ÊCüù 4FWƒO¡ÚáLݱúãÝÆ#p Žª,A– X¡¾ª@U@`äà(âÄφ3MvïN¥Ùsð2VÜœ ¿‹‹íî|K¦8à¸R˜(Ê¿~¼k×CúS ÔC¯¶åi°Ø‚}¾×€Ãgþˆ<ÊgÜ#®¢üîBدâòH9±¬µ·ÇÚ ÜŸ>}ƒ¸‘1Ëç- ­éˆÕFÐC ç1”¶!‰M‚€]þ“´eh¯¨cG`ÑE† PÀ—qn qY$’gÿý~Gûa';?É>ƒËªÞ÷Ž®;0‘&¬ Û½aýTZùÐÊî6’àó·p«_1癥øüWüH«²N,qSÊ”dVÜR²8âý Q5ß³wKö¼%š±J)›«QÌæ`¦Ì) ^†¯B½O9³, Un/ŒèÀÃ>qDàƒ}ƒäýø~Ë£ KDÔú“wý*÷v}·¡Ž@7Éu@½—]¢-iq•É­k…Є\]|*ÄpQÆdS•¹´©Ia äýK!l¥:ˆ–ù-³Û†Çeú˜q²Yj¿>´€|ü‰<#¸ÊZò¾¢Âé€ÛÐ:0œ e-"êØ+)x^Zø+Â\ÜÿKÁî2œæD {ØÉþVµg³YyÍq'&ÈoáôãM97öÁ2nó®…óÂÎ}› ä–éòÓ€KÌD‘x±IYR ×WW ªªmïÒ©–ØãÿüÅéˆÆÔR1¼iGÑö"Ú©KV–®ÅÒ1€.sAŸ~ À•AAµxŸ­„BM¶RS„Üœ´ôœÜІ`H¦ìy„®Ü¸«"ª^%Êo5Å4d}¡¦ à¥1ã´Œ²áÛ5’‡—ñ9ª%ö)ì’ˆÐ+áv¥@ÛHcRuRfŸW‚}âu~‹SJÜlìòŒÂÊ+"K¦=ᙬ`ßÜöþÒy9ݧüö—ÿ|¹¯‹d»fãLAžpŽ5X?£iÖiŒöçl’j»Zjøµ•GûôœÓFêâ þ`HÒSÆl›®$ ]›“£y‰yWlÊ*£ð¼-íP%ØØÝFmDCˆ>Â0|ä"äg•)p A¯ýjCv”AþübªžÎ°UCK¤öÿÄ[|ÕI[Y‹#¬Š†UA$œa[u¦Dú{h³Sf“^/cSN©ÎÞõíPC£Fê6kc!"G¢¶A…¶8¥ «$¢0a.Éöš‰5Ù¥4Ïü‘Ρ[¥Ý{Á_í„ësÐëº×Þ#¼×«ä™më×i÷‚·‚µlz X¡S[ç´oU^f”ƒÉÚüéצyiÊöQÓÓ“£uœ‚mÔŸ5˜¨Û·ëµÃûB¢!ÎÊ kžªc² wvŽLŽd:9Æðøù/£cXç0³z}ÑÁúnNÞWÞ¹åêÄ‘ù0ý‘‰òä…ä¿/‘· ƒY¨}IEûÙ‹ê  ZcêB-Áy vj×FìU„†ûB„ÕŶё‘UŽæ ÛMUߨU´?¾‘Úß :µ\ìÕWÀ“öHƒÊ £MW‘D÷€46;u*Ñy)šrеùTv–6¨œ8&=Ý'hJwáŒÇ¯ìuxVŠÊ'jŇ ´ÏªlùE&¨à, qñª”ˆ€Î°“;Ϋ£ ¯£ÖÒ|§Íìyè&nº£6;¶‡QÉã¼§\Ô…µÁ¹YÂÅTÅ7Xj*ÿeQû»dük„!ãù#òì½—‘ÃçšÐ½¸8 riKgi…ÈY¤îNn÷{ã(ÎG¼Ç{˜©‚ºO²}ÜÇü*§ýê>=ö‡O³BldkÅ—Úâè§žÈ|d\‚®Cæ&®d;KÓj’"¶¨‚˜[bÇt䞣ó¡ÍpÁÚe´n>-Йl (I-$r΢#Œ¸ÔäI÷–ô>åpÕ®XÀïÇéߘ÷ ˜LÜ!’ô½<6ÉLy`¼ç{—.3ÜkSÈx‘ýܣȢGJ«‹3 ÙéÚ¬ ­°kÊHƒ-Ò×qú •óÀóÄo~Sd’ kß露̾ŒGŽýˉÇòÊ!³\HÍIL%W_o-¯©kÛÙì·ü-¿Ia(®“þÿkÐ~‰2K­„×â†óßÔ"Ôz6œŠÿ—~Ùr*ðüù_5¨ÄÅü›ðSm½¾©Ü,•Ö6î;˜­Û“¬3Rã¢B(ÌÜò¡¶²¦=ª#·¸._îoÛצ¬[µTÑ^.€<&'[©\RYjEquamejÓŽøÀ¬àíÂöæíy*àf­Xñn )Ô¼WLIN ‡]œ|ˆEY¨-~mÒž á–ÝóAý°÷«uïæÁ¯a=|D™ú=ù{m@¹B.óSWôž>~¸íXžø‰l]a®ï{[¦‹Î|XKç(“¢Ë5þÿoûžk“B9|ð´8=°qxOÂ1ƒž_.ï› ÿ—Û?âÉ ŽGþx ‹ê×4¨IÆPGUØ2hUNA»(¿Ÿo?Ì7)Q UtL´)ÆÖ`66 t¢ÑožoÄ%m’V3ÝÂ"³thÖÐ|þ1ʈÊÍ,;ˆsË›ñ¨¢Ék9 8Ž®ž»Aý¢¢uäý ÇéÏè–Jû"<$ÚëX¨ƒUù%´ìj _P~Ì^‰œV1’Á>éà8›©è¬ÐGtG´¿Âù€½ôqÿ¤Î蔓@ŸkÐb0RǶê¬Îçv‚ BO9¾ï¥3dï§.˜åBqÑÅÞNƒÑ1 "sS Š.úk j§éUëŠ5ñêÔŒL2‰xxÙãþï! ¥\Ú'ÅåCðOûw%û$ßÓ3˜¡GÛöýCWÿöÖ6¼ÿôü#/nÿ(™©¿[RðäÂ÷õ“ _çõÓ¦8Šì­VÇŠŽ«ï|@ÅwoÒ…ðxaJ°Hjÿw0ìR–x¦ïÓÑxËoê´ZPO$£ÑMvoàÈg­iq5B°6+ öqá–”êÚÚŠÆO|:—Ì"Ïl&ÈþÆ”þûØÏR¾ˆ¯q/žšdôÀQ*“Ãcõü¥ØŽ]‰Ñ11•Ñ­¥û‹Šé*í¦×ëÔF}è/feѬr¸Ì‚œ‚ÒëבÜŸwO†ù/äËHXendstream endobj 288 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 386 /Subtype /Image /Width 644 /Length 23654 >> stream ÿØÿîAdobedÿÛC    %,'..+'+*17F;14B4*+=S>BHJNON/;V\UL[FMNKÿÛC $$K2+2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKÿÀ‚„"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?õZ(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ )¯"'ße_©ÅP›]Ò È“Q´V;|å'òÎhFŠÃ“źDlWí,Xp"np3ÆG5ñH—eÒu9”œ|§ñÏJçCEsãX×$ bðós×}Ò®?1IÿTÉó.ß>Ù‡ó+Ðf‚@®xi~ ‘1.¼ˆOP–ª\ƒOÃ×®§3ãœÜ¹ö^Ժœ…P2I8¨6¿¤®ö•©$d•I?LjˆðvŒ\I4Nãi&sŒ~5£§B GeÀÀ%?™ç¹ Z™òøÃEFØ·/+çc…Ï?\b™ÿ Fð|­U'Ÿ½nW¥nÇ qgËELõÚ1ž1N8€ÔæÆ­â+¦Å¶…ºtó..ÿÇF ˜ÛŒ~¹¬­'MÕ®u JÞÛÄ7‘}‘ÐG4€Ê$åXã¶8ãÚº9.žXò‡nxǽeÝÜ\i—Ÿlµ£2ç ŸóÞ©Á÷1X„™;Üx¯NUßigª¢ŽZ'òœûœñùOÿ„ÊÂÜĺœzyíS< · 8ýq[Z}äwö‘ÜG÷\r;©õS¼i"‘C+ ak7ØíßTW³Ô쯉—PÌÀdª8$qÔU¬Öç„t[©¢É`™~ì–äÄAõÂðO=Áªáý^Åó¤ëóù'“ ≱ôcÈ8Å©ÔQ^y'ÄIô›©lõXìn¦ˆ•/e9Æ@`ƒÎN;rWEoã-)Î˧–Æa÷£¹Œ©^}:÷Å:*k¨.ã[MÑž†ñ5QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE„â–³|G’hwÞL²E"Ä]Z6ÚÙ_›÷Ʊ  `£,psTŸZÓ#ÎýBÕq×3/­sö¾ÐfÓ Ô5%iI‰d’YîdÚ ÷ZÝ·Ðt˜÷Z}°Çú°r?=CRŒ¾5У”Ä·¦iAÀXbwÉô ~´‡ÅHä,N§+0Êâƒøæ·a·†Û Iú"€?J~(Ϧ«®Ü Ñh"Î35ÒçþùÿëÓœøšUÄcM„‘ÎàäÄ*ÞÅ f iZäƒuÆ»´ž©ºà~<óÞ˜|/$Ä›­oS|õXæØ§Nk¢¢€0“Â:@}»Hë<¬K}yÅ[ƒAÒ­ðcÓí·ŒÑ†oÌóZTP4@*¨ƒú( Š)(i3Q\\Ám{‰£‰V‘ÂÌ×!yâ‹;K×[MT\+üÀBÆÀqéøŠ ”¹NÓ4Ö•†` r±xªK¨×ìúv£;çœB#›¡u=bpʺ$päu¸½PÔ j«#'W²ûΔN$.G=Å#¸@K2Mr&m|KóÝé°g´0I/RÀzÑ.—|‡íºýáõXB£ò÷õªÑî·vŽ´¾TéXšæ¡§Cùomã`pwL£Û¦sPZøsLžßmع¼#µÅäŽí•Î?NÕ«gáý&ÛkC¥ÙF{r?Rz!¤ªis•´ñ^˜dq’\0q O'·aíZ)©µÌE#ðþ¥pHÇïbXS¯ûl+nýáÓãÇdyÀU¬íÐñ‘là±çOþ½Rw[œíFœ­b…潦^,RZØZÛܾMq¼Æyë´sÇn¢º9,µ©âÚÚ¼6sºÞËŸ;0ý+”Õe{¨_ÌÎ[æSî8ÏåZ~Öf¹–K+‰…Mñg¨äg¿_³±ÙF­ô6“C%X\êz•ÎáÔÜyXúyai¯á2m¿i†[ ‡ ]\I0üˆ­Š)F½¦éÑhÛùqÙÛ±EÌÛ–c¹Çã[AÌmñ$±°ÁWPÀþ²|\AÓ ˆÿËkëXÿò2é[TX iRöé5œ£îÉm)R¿N tô¨Ž—â c¬%Úþ¢ò.£ýñÉ#ð÷®–’X繪ØÈ«©h“Éÿ–ödH3þær¹«.ѯ]£ûWÙç@ År¦&\ýxü‰­¼ ­y§Yßcív°ÎT¦D Fzàö  ¢š9£Y"uxØd2œƒô4úç_Áš|r4ùnôö'-öiÙwÇ8ú EµñE’Ÿ*úÒùTqçǰžO{c’Ms¤¢¹¯øJ.mTSD¾µeÞ0%Dú°àUû/é7Åðîr«…‰èldý( £ZŠLZ(´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÙdFGV#ÔS© aøGqУ¶™½«¼¹ÜSŒ{ÖµÔ¯onòEÎê2#BoÌYc¯­Ù0%ÂÌœu Ÿ×"·qT÷ÜÍ-Ct“<¶òˆe#år›¶þ¬íGT¼·Ô¡²µÓ„ÆdgIe¸¡+Õx Ùäv©¯Ed®Ìí–Ó­n—>ÿrŸ&}> š½Ä|`­¼Q ?÷Ò±if£šâtÝ<©ú»­Q‡D‚5K‹éØ ’îO›ê úS­ô&Ú_:6Ñf>g’¥óþö3@ iJ¤­ü2à¼×ÿ¾W$þT±kà1·°¿/÷­Ì9úy›kFŒP[Þê²çìÚR'¡ºº ÿ §”ÕäE"{ø—ÉyGàw/ò­ZËM¾$5ƳrÍžV(£DüŠ“ÿRMáû;†cq%äÁŽJ½ä»?ïØý+VšÎ¨2Ì{œP(4]2Üæ>Õõ+ ‚~§³jfd ƒÏ…ÈÇ#üúV–sH@ ‚2 É]Xãí¯–Öe·Í…<ðkBI˜äŸ—²ñšÉÔì͵ܑ €Ú2NF85vÆ_>ÛÄílñÍn­cÈmó8±·Hî9Á$ƒÏæG§ZšÏ2D9dÆr0|ãó©ßOiW©iwåþ­Ko pKœäž>fÆqíBDÉY«±ŠD}ÌNÃÖµz ÕIdTMÌ@QÔ±Æ*8oä¨.2 ã<Ô´å©×NQ§x•µ´ûE”Á†Yºã¨#üšä¾d`Y²[ïcßé]Áô# × ²Êîága£­'LvëÇL~~ô;µ.ÝËs*«±Q¹HS‚3ƒýxÿ¸í]V™®éúªfÖáÁ ÆH>«×ž£Ú¡ðÓ-ŵåêøû¼•¾¡O–§þùM:ïúUÚº½œi¼åŒ9Œ“ï·üi«šZåäÐæÓŒ1iþ žÞWȆ+—Yã’ª§È).5mIdmFÖÊæby 6q>n§ƒLÔÑH)h¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Bmü_컳*¼ó¹'ôe­±X¾ ýÍîs´’.¼œƒ¡Ço”ƶ…7²°õëo5= \Æd‹Í‘0Œ1Œ°éÛ :ܬýUS6s9Á†é ŸvÌû=Üqܳwu ³Ï;l‰1¸…'ã æ¦ŠEtóG5´K4£QŸ`<óÎjD“QIõ¥ Š( Š( ¸Ü¥NpF88¬;…1HÛŽr2znÕºk;R·Ý‰9ÇF¿½4s×MÇB]:äÏaרöíW+À‹y²¹ÃaHôýjÛŠ©+j%Í=ÑCQ°Žç Àú¯ù5‘`!µË.ã$€É®Ži8ÙÛ¢Œ×«^Ï üª.ËîOmÜñþ{ÒNÚ˜b#$ÖçhòRÎ@P2On•}¬…r PÈ;˜ãŸL~\ûÖL7Wqîk‡ƒ€ ëÛך¯;ÝÝxÉ£ÿ¯T¥Øåœ¹·5-5nc\¶Ác×ƯÚ]¹PIùÀ\}_Ò¹í+ž$†Áçüÿ*Ó‘Äs°F7dc€:ãò¡=nÌ®íî—üG®ÛhZ|—WÁ <»c€?ǵaé> —Äÿjø°È^C˜¬ÈHWß’yÀàcßÙt)|Uâ6Ö¯#?ÙÖ³ÿ‰Áû߇_®= zL¥sÕ£K•s=Ìh´+49Ó­bµVåÄJ?ýn•Ô­­ßdó ž08úã§ãZ÷^&FW[èkÍoÖHË`¯$-‚ݸíT¤Ò±ÍˆJ2º:=KU’ed‡å†ßvÍeè:õÅ–§¬ŒÖY&Þ*O¸ã’Gà)A¼ä6 Œg¨¬}MÄW"`ÅQ—'žäg>üÔ9Yê*Mó\ïoÔÉã ùeks!üLkýkz¸ˆ|W¦Ë¯ØÌ²‰_Ll¥´m3‡fBW ËߺVóêµÄ`Øi>Y=úaÇcµ7Àí4LÙ¨åš8P¼®‘ êÌÀY¿ÙڕÃy«2 9ò¬á…˜³~EjK} N‚eŸìÂYÓîÍpÍ4‹ôg$΀5è&V6÷WØè`‹ÜãåwÚø5f±uòáµ±ÉùLÌfp=Õpú1ZÔ¢€2ÛFk„Û{¨Þ\)\2)õÿVãØ“W-tû;2M­¬êcŒ.~¸«Tmq Ü%»J‚gRëo˜¨ÆHœÎ€$¥ª÷2\#B €J@²&Ý‹ƒ–éÏn=è½·{«W…'–Ýœ`I—éšœ ’@©5ŸªÁo¢\êpIÄ1@ò«Fá•ö‚x#Üb¯ƒÏëÅqÅ.—žÀ¾¹† c+¼3o‘Z€$ð´w6ú-µ­Ý¯Ùä¶"ÎðÞfrütËÁô­ ‚í¦7c(C…ÚI-œg'×T–€#xcwI3µŠä®zàö¬-zO´ëš>œÁ•®]‡`ƒøò+ ®~À½ç‹õÊâX#·BOV$± ~$s@éKEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE‘âµfÐn™kE¶PsŒl`Ý{t­+yDÐG(èê~"’òÞ;»I­¦ŽhÚ7Ä`ÿ:¡á™šm ÌÈx±„b8þ”ú¡«Y~$“ìúD·w wŽb=‘Õè+R©kp½Æ} xó$·‘W>¥HGtÝ-Gù£ÿyA©)Šæ'š‘Ï$ q‰# Hçý G·Jy!G'ÞQ\ÛÅu CqKýäu §ê IKP]\-¤WId¶(Ë·'509 ¤'f˜Íǵ2[°úk t*à ŒhŒ’)ô†µF4¶’`p@Î2:´mŸ œ°þT^0Ž®âŠH§Ò¹+]nÌF©ü2[ßÚ´^ò³8¥û™]&«!1ùjWžN}{Wâ+|\‡EÀe#=Hÿ8Ð,Ò\+`žøéÛüEcxŠ3$1I»¶¶{g4I{§=IsϘËÓ]Œ«pSùc&¬M¼;Á Æ ßòªÚ\~Tòß4ŠzôÏAZ c_Ýä}ì'ZÎ,Æqmìnw‘nyùã®ýf›â÷•í`°µ`÷7Ó,*3Àç×Ó$õê­Õݽ¯ÎìA18?ŸåùS´]Q¯¼j·pÙ]_ÛÚÄDf·aØpI8 žIíCw6ÃBòØô½.Â-3O·³€“ê}ϹëV³ÍcÇ6¹v[¶º|Âfs3Ÿª®ÿ¾W}If©ªÞÞF'fvlÆy=«Z×tùlæŽÖsq2®í°)“oÔ¯ñÅG¡è¶3É›ˆÞéÀ3³>q÷O¥oÌ,,­$k§†ÞÍù§@ìAÞ‡y+×Sƒ³¾Ôd‘ÞÖ49ÀyØáˆÈíÏ÷­ ]"÷Q¹Xî/åÜN<«@#Éë×®:òj”:Í€šCtóYÄNa–[vEìF3×üù­kY.¼VÏgáùÎÄ.ïÙ0Ï»þYƧœSƒî:¢¬t:né-’ÓK‚íôí OMgVë.%ùà¶í’ÍÔŒgþªë| Â5¦4/0žêwó' c öÔý*þƒ¢YxN[==ŒÌÌAgoR}iÏ©Ä÷7VèŽ%¶Û¸²a[##¿½h‘¬Ÿ*Ñ—„ë´œŠ£$Ä·,{VL·7'Q‰£ugç°íŠ·yamx±ý¢0V'! WæÇÁäsÐÖ©$pT«)­KW×ÐXÛ=ÍÎDq®[8ü+ϵ]Aµ%àl®@È^Ã={WEâ[Ô’ÜÙBrÀÃþ]kš{dòÞ@£pÀÆ2~•”ßAs7¹VÞa°‰vï<‡Ïô¡áS8f}Ì'¦?ÒŸ«Æå£PË÷IQšD„`Œ‚2=Ž¥g¹¬[½ŽÃáê…[í¬¬–xÆG Á®Æ¸ß‡§þ?‡úÀ벫g¡OáAER,(¢Š(¢Š(¢ŠCXþ6Wd’onæœýÒÅSÛUOãVõ»–´ÑïnáâÙHë¸)Ç늓K³];Mµ³C•·…b×h4jŠ)(Ä¿é7Ú>Ÿ¸…šäÊã³* •>Ç?¥o æàO¶øæêbIK Tˆp²Äÿß-þ{t´QLŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ³íu« ½JëM‚à5å hŠ2•¿#r:g¨­ á¼T¿Ø>3ÑõôP-îØ¯¯Ýcþ€PU¨k:lö^OåËy'—„f.ÜqÀ8ê9ŸÊ²ì§\ s·xÁ'·¡®—T‹Í²íÜè7(µÊÇ<»¢RK=kh¾‡“]5>dO«)®‘&J´:à63˜Û¯åZ’ÆÒáÔg<íïùU-FÒu}.æP~[ø÷g¯Í¹¨­ëÛË=.ØÍuq´ß•±“øõ5-XèPrйŸ¥ÜEÛ>Õ¾µÁ’IWbôÉç¸À¬(­n¼{;^Íwqiáõ%!¶‰Ê5ÎÞob—nµ‹®x‚O_®“¥»E¥+¹œ®ùìáÜõâ½F’±ŽÚÙºˆÑ3œ(.ìÒ0÷:ˆú=¤V+meoºÄ>EEÛXP\lhܸ8#sôô®´·ôËë0}žà”«ËòôÎr?3BZÜν­s¦‚Uš%Î=)Í€ #ŽõƒáËÿ2Im²@Þ¤œ“É~ƒó«zíñ··ò£¼¼qׯçÒªQ³.5S§ÌÎ2éà·žH- ädudíÔóÛëŽÕ%Ö±5Õ´p)1ªŒ3wo¯¥SÔ–2ÿ{è WYˆª¿{ƒñ檱&F/¸çÇ=ÿžk26Ä»þl†á};f´@b[p¬¯r¤f\ñ;͒ÓïøÕ«9TÛÄŠ'ƒÏJ©© M€ÛGûsíÒ¥²pa I'<Þ½é$ŒË7¡J|§tÏéY²¹!P6âaнsÌD’ØsëT§Ù媃‚xù½ɤh†*ï`{g¯½M Iå3‘r?l`ÊTÈÎH4¸e黦ìUa6>ÚPòH$úñK:þíÄ{†ÕÉç oþ½%¼,dበc\}y®«NðÊi/.P†Ýô.~µ¾  ®~á¾×ãKX‚elmZRäñ—8À÷Àt4QLŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( 5átYÜZ‚¸·º–0£øFâGèkf±läòÕ>þ™ý:š$M£r’;ç*•¤iç€Ä7`søÕر¸–È qÛ⮎w£*m_;vx­HȈC‡û óÓ¾}ê‘ERäžWߌT–Ò¬Ö¿,§pAâ‘OkÞ¨pŽªtÇ?äÔvçÁ·Lýx«—HM³>ÌmÀôéPY’œ^xÈ¥ml%±5¶H“îúýýuFU\€6xàøVý¦‘6 ¹Á[øä$ŽG­t:~gbHÃÉõŒ2.ÕNÆ.Zž}¤²°Xóƒ•)ë[6º-¯aUãor;ý?ê/Ò8˜$ت2zŽqPC¨Ûmù¡˜Œ‚;ÿõêã9+;Ÿ¦Ûiê<ˆÈrs¹ÎãŸO×µj$ªWœY¯y¸m_”ž<‘Q¤Œ²d·Í×$ö÷Åiʇ¸ì_½n¢+’­ü,¤ƒŸð¬[ ‰4û–Šçp‰ÞÌH‰ë[‘²<{•¾ÿëYšÔHÄd+¨!ˆÇ+Œç=x¨¶¥Iß^¦ÖTŒð}ëŸÖ­$†_´ÁÀc¸œgc cŸãNÑ5!*ýžV×îœvü«i‘&Œ¬€#¿zvqÔ¥5SDG¢ê_o·>` qUb=øŽÕ¥\‚yšEð*¿ê“€ýà=³ß×ê+«‚Tž%’6ܬ2 fû£º”ù•žè’Š(©6 (¢€,‰O$Œf=MdøJ"º30Ãݼ—Mž¿¼rã>ø`? _ÌbðíðQ—š?!´„ û°­+;uµµ†Ý>ìH¨>€bô&¤=)j¦©wö:æä(fŠ6eRq¹±ÀϹÀ F7…œÞjzÞ¡åÉr!ŒƒÁ3øŒWIXÞ´6ž³WÉ’D1#–çŸ|`~³@ØQE(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+#Qcµ¦Kªþd-îHGþ:k^²ÄÕ¤™‚©-ˆî™ò¸ ‡Ï9Jƒ®Òº”Mik+Iº`>Ï3nÇþ¾Õ©PÎÈ»«‹ER(Àñ1[‹ÝOÜOz%+ê‘)sød ú‘[¹Çòî¼{ïÜl´öm£øYÜÌ]%a\ÿ]ŸIŽÉ—¿¹ŽÜc¶NãŸÁHú‘]sº¦ûßi–Š£Ê´Fº•¾U@üGå@#~$X£TA…PŸIK@‚Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ©êößkÒî zH˜)ôlp¸­¿ Û­¦­®A· çÄäãŒÆèk)Ç[t6Œ¯¡-¬R}’Ý'””LåA9õõ­m(‹xRßj  ãÔÿ:¹¨:Ãe4̬ÞR®âp3ÀîkÉ&ˆÉ±£@+‚>¢¦)U:RM8¬ÍIˆa’ ðsV­§§$ Lñ«¡SÐÓjÅ?Þ- ›I¤ŠEG#cqyÖµPnäôúV\ˆ!vUÇÌGÞÇ5~ÒrˇêõMis*M)r³Ä:z£‹È×+‘æ(Àzþ'ÿõÔú-ÚÍ…‰2Ä9<ò;:½ypž\ˆHq†SÓõäšeüŠ3DG+Ÿ˜u§ó©½·I.otîð2G#wùþµÎp­–?/*´WÿiŽ9£Có€rM,e›rÿ“Ôã#ÿ­Z$bç}Vò2ùª~÷$™öúóYè”ïQœ ;ŒçÏÖ¶Ú=ÑbF_ƒ“Y2F¶Ò1uÁÈlò:ÇéQ%m„ïÔ[Vl©P,qǹïSÇ)ŠPáÀÎëÔãŸÃŠÍ»Ef¼27(ô©m *¨·¨ œþEJvgJ®%D‘[*ç­cêöX“ÏF\!ÛÈã®*³¥É#© ÎÞsÆ{֪Ƹ+ÜðjÞÆ±NlÏЮYâò% ‘÷Kw•±ÏjȺ¶û9Ü?)î¾ÕkO¾ŽéJûŰúÔ½u:iË•ò2®µjV/:%ttÇçòç6“©yìa—!úÆ[«~1‘úÕçR9àÖÖ“<3‰mc[zpx?…5f¬ÂNPŸ‡Œþ"¥œuãx_±B1æ¡Ê2sÇùÿëÔVò:Ü+"€€ä‘óÍMo—™ÔdäÇáëQ:± ¦pŸÏ¸ªGšõGTÅš1ž2~µ(Ó⺌4‹ÐäqŒÕ-OµA mÎ0F+}"…Q€ô­e+loB’ž¯c:8#¶cA€xQþx¬ýpñn´çtÍú8þ•¥©ÈÐíÚ1¼õÏzæ4ÙäƒÆÓä¬Ö@“×8þ½¢¢ý”ÚgjÌc€I=«&îÞ+…[˜\4L FÈ'׊Õ*²FUÀea‚ ŠdÐÁn°AÅ .ÕD =«4ìtÊèεo%þöPÖ€9 Ö=íÌVrÈ’8zóÚ›i¨ ФgsÎ1ÛOÖ´²8Gr–µI¢U8ÃH ’3Ð{úu¬Õf#à•ôÿ?δßt¡†0¤Ïzçî£xäes´ƒƒŒâ©v1ªïï#¡Gó6wdgŠÃñ-¿Ëꪛ°‡< ÖŽ’Æ{UA鑜ò}8ú֕Ζ·vOûrFTŽ6žÇÒ¢qè:iµsœðµñ= +Á%s}Çùõ®’(°á˜ŒÎIƼi÷ |­¯ÿëŽ:žÕØÚγۣ©‘ÈÉ8=ÿpØ—$™$‡ {(…gßÂgÚè?y€¤ù>Þõ¦Èe ¡AÏJzF‰…#ñëš·±¥¹½ 5ÓZTS)ÛŸ»ŽÝ{~tØ!XNJ· œr3í[rÆ')9ïøöö¬ëù¡`v1wSŽ;ñÏãéY¸¡8¨—#ÆÇÀ<öjÜ3o$†ýkœÓµM’´AÂq¹¹Çùþµí \“Á^™«Ñ“òꙫ,k(Ôµ JÐiçJl.nbŠYÕ³'—¼n;TRGÒº›[9ft¹Ôi° ħ)ëÇ©÷öãvH–A†ŸcH©'Ì•†ÙÛCgmµ²á‰B"Ž€•=RT–;OËéž?úÝêÄ3, àò8 ö¤Õ‹Œï£Ñ™1¹x49#ˆ%ˬáÌ?ïÕ­iÚÚÃn„•‰z2k]?mñ.aŸÝÆZîAž~^LäWH)ôŠ( AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPU5MJÛJ´k«É6F¤(ÌÄà(’O ª:Χ} ÂXéV qw"nóeÊÁÎ2ÍÜÿ²9ª~ûF¡ÌZÓ¥Ýæ™¨:¤›6€v‚¤£(þ‹â =i®"·Y¡¸· KÄf9=jåüKwq©^Ïý“¦^·‘–÷WOÈ9 'ç#æè;ý \¹Õ4ý?Ç7÷—S¬^M”6»,òÈîÌQË6ôõ®Äò(vw9+M¸Ö4ÛKTšhÞ%*å£9 ½út©52×N²…¬àXQ_kmœô,z“O­XµHÕZѳö+³¾Üãˆäþ$Ï¡ê?JÕ¼·[»w…ñ†ÇQœræ ¢º·Fpñ©W%5z iÉbLQ1Îuü+v >BB ·]Ì2jvû‡'ëV¢y\–ÜN¶K4¦p{šÐè+çQ†…mÍÓ zUý:ëív©)1`@#­9G©½ ©û„—p¬ñ#'¨ö5Ƽ-‹íK€ÙÉÿ¡/¥wW#âXÌ~1ФùvJ“¡ãž=ÐԮƕ ¬çÖÌélßt{IÎ:QKej,­„"i¦Á'|ϹŽ}ê¢Ì" ’±©ìå¡g»hX³±O(sßjšêgFiÆÏtfxŽÕdT¸ a~Vãœvþ¿a[:A8*Øb»+˜ê!nÆ>ž†¹y4—Y[Ì™CŒðqUMósE—%G}ݽ¿DúkRß/B¤f®iʉ ƒóH£‰ÉÇj´Ãp*yŽ)ì )­LÝ>8ì[j/ù˜÷­d;Àq÷OB*¶*ç‚Ãò«vd*„,Ä‘Šrî\4|¦n½¦yéç¦î;J©¡ ¶¢i3G`×JFq\æ·³˜NœDÜÆàÿ:ˆè©¤ùþqŒS]öŒ±•¦ê‚xDN •p9?xzÕÐß3uVÝ-ÔòLçIcŸåŸÆº”hÕ‚Š(¦ ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š­i¦Û™ï®b·„o•ÂŒús@h®GÄÚ­Ä·ZU­¼é©È#{è%ùäìtÝ€ôý{]þ½žk‹K dÓ§™·7z&=Èê=¨ª®FŽh|WâQÄ›yQ¶ü¥¶ml_”WCI@ðèZt:¼úªÛ!¾Ÿ¦nHcŒôãÓ­hÑEUÔ,ÒúÙ¢~Tnè݈ªú5ó\Å$–­åξøá¾„r+J±µ„’ÊtÕ` þRìž0Àn9ÝÏÿ‘L¨ë¡vþeI'±.od¸ ªzõQÓ§5³|‹}§1ˆ‡ ©çéXaN2ÃŽ§¡¢ìàÄFÎåGÉÚCn=­\a^ݘ7(Ï# ?Ó󬩾èe üjî‘ ©r²¬@)?3tÈéøö«cŽŸ»Q4tã¥s¾$¶óµÍ‰!DÒ©#¨Ìdå]¬_ 7z$„d¦ ½³Ö7áSÏ]èˆdNXK©Ç5cF¹wÁ$/”Ø]Øù‡¨«WV~d›Ô€ïqU­g¶ûD‘Ç0y¢ 8<ãŽ? ´îp8ºr»5UqÖ©jVÍ GÔ}áê1W#pã"žy¨½™ØãÆÆ+$.[níšÒ‹k¨lõéQÝ@UÃÁ9úUxîR6Á8SüëVùŽ :R´‹²ª²žj‘"1¸°óÖ§yw´ãœU;ø²›‚Œ7v>Ô㦄U´µEÈnÈHàƒŽi³Ä“Û¼OÑ—÷¬ûY7W(N?Qþ5°©‘‘Çé¹T8VK>ãÊñ¶ÐpßO» 3碱N}Ò§¹¶[”Áá—¦ gÚ<¶®DäžyàUss+ Òör×TjÆ»xãëO Ô u AçJë`d³ }sÒ¹¡âkÍo1xfÍåŒðo®P¤#žÙåùÅdÎȵm íKS³ÓcW»#f8sóH}z“ô®eÛÄ".!fÑ´öFaþ‘'¸ë·¿§ÔÖ¾—á˜m§ûmüϨêçϘ}ÑØ*ôSë[l¡…ãsLÐít˜ÏÙÁÝ#n–BpÎ}N+NÁù[˜• $½äuEÞ >†ÏQTÊ$nÀ` #>殎•[ìâê[¡ïåEGlž@Î:w5 غ°æZr(o—šœŸz òؤŸjšÖmà©Ç9«qêsÒ«¯+%hš6þ!Œ×5t‚9ÌnÀpG^}ÿJéð=Ash’:Ë´N”“°êÓöˆÌ²¼Yc J— ’1úÕÿ,2áÎsÔtªÉû™xAÓŽœÿœUÄpÜ÷=«W±Ë­˜Ï-å@ö$OØt¥m½ûÖ>µ¯éº.ß¶]"¹#§26xáG&§ÔÒÍ;£p;Öˆõý#L-ÝÜbïh 6d>ƒ³ïY/}âOI%¾k&‹f¤¹¼Œ‰˜wظ㎨­ýÚn‰ú,§oõ—|ÒÈ}KåQètÛ™ZGšv£â[¥}ZÚKM&6 öWfW—Ž­Ó¦1ü½k½³H!¶H­‘#…`/¶;S®­–eÎ0ý¬øüÛyJ˜ÔpFx5I]jc6àôZÀäP0zÓ tt0A©ޤT³Xê®!Á\˜¦ˆ›#<ú{TÁ¥;¥+š{;êÈ>Τóߨfží´O#°HÐfcÐw5“«ø–ÚÆcgl{¨‘ò[CÉÏmÄ}Ñý9ª© Ýk­ÇˆfÞŠw%Œ$¬Kþ÷9cøã¯QS{šF[ 6¹u«9·ðôAו’ö@Dq‘Ød|Çð?—"Þ™áÛk+Ÿ¶ÎZïP=nfaêÐr+Z8Ö5ŠT`*ŒO¤P˜¥¢Š`QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE%aÝø³LµÔ`³iZA) ÓÆEB«0èIR? ÐÖ,ŸPÓg¶†âKi]w4m‚Œ9é‘Èî+Í´9b°¶ÙišÍ¤Kó$ƒˆîžy4lE?ˆnïá‰.Z·»2öIÙ#²@çË ó•Æ9ä“[°i÷WS¾­á­ZnG“tÒÂZ)>_1@=x=85-—„-®í AÕü+å£v_9ü»À#qÆ2k¦†(à‰"‰8ÐUQ€£Ð ÏÐt;M ÌAhœ°_6CÖV ãîqZtQ@Q@Q@WQÔ-t»V¹¾™`H #g=3X:§Žô;}.ê{MNÖ{ˆâfŠ ü³c®(¤‚h®#C"È„NFAÁýA%qÞ¸Óô¿ YÛÜj–†îlÍ"›…Èg9Æ3×>¹®Æ€ Ã×-ÚÖtÕà ºÛpª@\Ÿ÷y?Lõâ·)È ¡(Ñ«© déR‘kÇþ%WçNb¬¹{OoïGøuÇØÖÎi²RKB&B3ŠÃñ ?ð‹j=p#fºâ¥/á½QC?eä{)5QzÜÉÅ&l#@GB2*&o¶™Óù^ß³íCgïgéÆ3Š«áù¼Ý"Åʵ¼dgÝE[v¹‘ªG¶(K¹s¸7`9{ÒjÍ¢á.h¦E{ÈuϪD¬¬ržEk2†R ÕY“iƒÖžèÊ-ÆNûÇJk aȧ•ÕÌ6<÷¤P Ë;¶sPt»5© Ÿ)þ•ÂÝ.¡ã-zóLûTÖš›”ÅÓ6>è>ûûŽEh\ëw~)g¶ð·îíÔí¸ÔdBsŽ#ï6=zqê+oCÒ Ñ4謭¾ìc—ÀËžì}Í^ç#\Žåí+K³Ò,Ò×O·H!^Š½Ï©=I÷5i”0 Ôq¹<ST½˜µ$Q–-ƒ’Üž1MŠM…— ¼ÈH5XÚ±'jÑI[S’td¥xuÆ*@™ŠXã¸üi—ZÂó\J‘Dƒ,îÁUG¹5›gLamɵfëZõŽŒ‹ö—fšN"‚!ºI`é“Yo¬êzì¦"Ô¯¨\'Êëšõ=úŒqÚ´´ŸÙé²5Æâõù{©ŽéཆARkc6;WÄI«c`zYFß<ƒ9ùÛð{ôR+¡³´‚ÆÝ µ…!‰>ê À©©i€QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEV6¿£É~ö·–2¬›îŠF+)ûÈÞªGêlÑ@ HÑ eE z1š}PEPMu¥XR0AèE:ŠÈÒã}:vÓœ–„eí]›$¦yCžr¹Üc¾kL¯­WÔ­ZæܸŽâ3¾#!XzûAö&–Âío µÁ+"wG?CUЙZæOƒ¡h|?,rÐÉ,dóü20ïô­i!ŽIä£;‘™A*zdzVw†IHuØü±_Îè[?Ö³5=QõÐm|;3<‘È7]Æq ƒÛ×ñ¦Ý™Œ—RçˆüO‹äÚÁ»ÔnX$ÊØ'''°ÿ>µFÓš†©r×~)¾ûB0;, b!>§¹ÿ95wAð¼LÒ]Í4—ÚŒ§2]O‚Ý1…ôçÒº%9úÒedzoo´+ $Q ¢(UØ l‰‚XtïSÒšIعEIX­¿ò©c}ÃޚђÀ•" ÛF0Œ“Fj®¥©Zipy׳¬HNy,qœ9'éXÊúƾI]úNœxéŒyá'ßz“ ·«kÉfßf²ï¯Û…‚.€ä™º(àçÒªÃáûJeºñ épW˜íbbú·ùÖ¶™¥ÚipyVp¬csugúž§©üêå!ˆˆ¨¡UB¨ )ÔQLAQ™áY–•¬7,7늒¹íwÁš>¹qö«˜¤ŽóŒ\C!WéíÇÒ€¦jWw7Öle—6¶BaŒ `°É'Ôæ§ñN·s¤ÅZu¨»¾œ³$$‘û´œÿ =ØW¤išõ§ŠõØtMQ&–ÑaW7Ãy™Jdݱ]¿‡nµË£/öî™mhÑ©$Rîßî8á@6©m¬é°ßZ6è¥\㺞àûƒWkƒ‚×S‹Å•¿†H·°”ƒu-ÄGˆoâòljGO~•ÝŽœÐÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVÔ'šÞÂâkX>Ñ4q³$A±¼Ó4`ÖuáûÏÛ2»à\dð½ƒÿCíÏjçtØÁm­­kªÓ^Æ6Ú "8<€ƒ' äoNÕ{^·Õµý–Z|Öðh×VàÍx0ï"¶àQNWŸïpx¦˜ý©Õõ_êz]´‘G¥I;És2ƒ¸ƒòíSž ×ëÙG¥ ;I[-!µÙ›*9äžä‘žk7Â:$>[-&2 ÏŒ¾eÀSù3õµ½u3ÃÉM+(ÈEêi½ÈvWÙïB“œÒŒº‚F3ÎjiëLÉÝ;“šZ‰ž*–«­Zé{RRòÎÿrWtôŸåRô7‹æF` –8©5ÏÜø†[Ùeµðô y:|¯;äA÷oâú þ4&›¨ëR,ÚËýžÓ VÂ&ÎO\»qžÜtâ·-­ ´ ¶…!‰#Pª>€R(ÉÓ<:\ý»Qœê‡i¤Tì¯EéÔ{ôÍmŠ)hQEQEQE¤èCOÖµmM§2I¨ºpT`s[4Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@5E¼}:átæ/2!i>ê·bx=+–Ñ|Ï kk¢ÜÌòé÷ù{9äl•—øÐŸsÈú×iX'ðü¾"6ÖÒܬ·™ Dýë8×K³KK(V8Q“ÉêI<“îjÕU½·iUdˆ4GtdúúcH·ð-‰¼™¼˜•K9“˜êÒ­ΙÊí§?ñïpBÊ á_€­øðáîi¡2ôR¤Ñ¤‘Èà2ŸPj+©â¶‰¦žEŽ$fc€*–§«iVÎʹ½‘IXÐ|¨=\ôQõëÚ«ÛhRÜN.µ©ÅÛŽRÜÜÆ}ûßSéÓ½+ö¯¹Ûõ-o+£/Ùm ÇÛ§\ﱯ©÷ô­]3H¶ÓhÃI;ýùä;ýr{tè8«ø´u² (¢Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@5ÐH¥X¬0AS¨ -­!´BF±©98O©õ©è¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€?ÿÙendstream endobj 289 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6345 >> stream xœYX×ÚžeavìÊ:êI¬‰%Q=bK@1FQÔ(¶ d)˲»ô¥ìYz¯»ô¦ˆ±Ä‚%bYK’ÅvãÆ¨M4QsÍýÆòßÿ, »¹ñ/>ë3söœó½çýÞïýekC‰D"É"7w÷©SÌ¿òÉX!ì~áj§ë/BýŨ¿mÉÈ×í¡y8 úb0eþ·Ì9(xÑÎÅ!KdKCÃ> oܶ\±ÝíÓ^;Vzû¬ò]íçî¿&`m Ç‚ ŸLÜ8iÓä·Þž¢œ:MýNô»Óß›9jÖèÙcæÌ0oüü7Þ¤¨QÔGÔJj õ15–ZE£VSã)wj õ&µ–ò ÖQ ©õÔ"j2µZL½E-¡Þ¦–RPS©)êÊ•z—ZFM§–S3(7ê=j5“zêGÍ¥úSó¨Ô|j 5ˆL ¡6Rö””ò¤†R›)–F9RN”˜NÙR#(;j$õ7ʇâ(†â©>T_j9†gúz÷½ÙÏ­_mÿ~ý},pdàÖÇùº9xæàãC¸![†œ²–f}wèΡG‡þ“Îîdó؃ì/Ãæ ;í0Ô!ÆÑÆ1ßñ'o§‡Ãçß7¢ßˆÂ‘n#“ÿ¶äo¥{Äà6rUÜS~„ŠB2þÓ¦›¢ZÁO &á&¿W­ @AH‰â½ð€Nƒ£…!Mj¬F‡¢™ÀTÊ=£ËªPC£yó•ÿ´ƒtåh;o9 ¬Beü3º´5&åÅdòšôp¤B ^$„³:ú6ÙaGºkQ8ot7Ú?6»ÉAú ̆²M¨x;·VÊÈD5¨ˆ?„Ïo¶\Á;t™·Q†”üfXBK=¹¶÷øÉ¢à8,ÿTÒ5®Ö÷Žrxœíþ­ã›¢Ç?MûùõO<¾¼ôq}j‘ןÐí¬ûŸÐí>!AmÝ2A™I|N¶gd1_Ñ©§{¯` ÷à5˜ïN‡ ؉ǒÎ#¬ ~$»6ì„Üçc<‹­"¹Ö]%Aß]x-G¾>(Ê‹ÛY¿­fÁÌvì$,Ńœ6_n©4ð؃D%CU¨„‡9tq5Ùh(Ùèz)»jìYήí÷´›¾½~h¾ ×ͯp#lîÌÁtÈ´‘€öûc#hÙ¹ÀÓ»²s›øI÷"äÜR¬—H;!$Û²y7ª(çöQ“çËuö¡U!d{æY¬Ù “M°ô®ƒôÈ`ûãÙG0€Ó…–Ê«S¡/©Õǘ¹n™b¹;/ýfw÷T؆îô&>?ÛrEt±ù€BŠÇâžUüÌÑ3Œ$1Šá}¨ca$ýʽ?HÅÞ‡XÙÕ©ö³:Ù·,@{Ð/óÆþŠbŒFéS89lX†<]–”ñAúŒ©ijü黢ÀtN•ÕØCa“Äœ¡ÉêÄTn³a3Š$g<'l–÷ÛÏ£¨yéÃÖ„o£×ß±ÃoÊÆÕù7d\RYr~bÌ'ÂO(‘¬!·D×RÀµzŸL­#ÔžÖôÝQ^úý³ÿÌžŒþÚø«^dÆ{ÁA&Ð,Ì´lϼE÷ò¬w»µ¢šÄx§Ð¿ö¾zíæÁŽ2dðñÓFDqZ·Uqaˆ™NTóÝ0GÁÓ(ºkÂYá[m5w?ËUcOìž~ª íY¬ºS-³\A?Ë(D€ŽY¶õÓnðÝͤz)˜‘ð{«ó7 2Ä\¥KªQcCRóžp‹î:Ö?©¨/ÑÊ©³cüç¢]MTJþ:"—žh ½ÊI#÷£ýy-ufL“OÀu£¨JØ)8¬bêcÙgEø:Áu»º?è³ ~Xà«GäTŽ*Qþ®®é àl±QT"ÄŠ…Mæ $ˆP¤ B+BÉü•¨œo¥×ããvZ:¹&úpÌ~Å…”|Gž’¸sÉrFK{Àq»Ö"{¿n@ ü9Ü‘–®Ú‡œö¡ôÜ2cõ=]Qz££3=ZpŸŒ„‚¨2T€ZPzIFó婯'FûS¦-àFŽlšØŠ€£Ú½ˆ©« [”!ÕÖ¸Ìô$—×ÜÆc¶ŒE  ʪâºÜ‡rt:}Z‘®å"æï'óÒ#xI ´~âð¥\ŸqÒˆt>ûH#K4á= ©­Ÿ*¼£Cñ¼Î§\]…˜*CiýÕÑÈ/ø|÷ÿq,Ø¿ûçÒšŒ6AƒQÔÞÕmb8(ر1ÞñAš ’qGÞ‚Ô¬¸*R#fuw¼ÔÄwª%þ=ÁÜzI^ÑIò7]ÄîÑ9a…^™‰Y ‰¨åä¥g}Y']gýÊ/«%M†®&e(YÒ›V_whÏKý~ŒõFê}œµz Y¯P¯i´´µÞo[É–X4±ËÜŸðáQ:P[WÏ€¿íbÉjÏ™ót¹ãQû¥ö‹­«Ý-°Òk³"÷^ýf%¹B°Ž†å)…>%ÚäÔP¾—²ª%½#^·Öõ`mO}y†E§LPE Å\XÍÊQ ÐË~ÆÃp¿‰ã‰øt°àxä~µùè )‘‰|øº5ñÁhZpLy‡Ñc‹®ž=ÕŽN ó²Ü1ÌK€!$)–›ßC–¹¼ ´âåÀ#ô¯P—œûi³¾²¤îܤœ3Ó»ÜÚñ–Z÷Ÿgñ)Pe±ãzÜÄr#¤E$ÅSIâ͆TbŒi`®ÞøÐù>–ð8ÌÊætª­¬°–ÉiAmûýèàÒµk·,H€2§ â8Ÿ>u6³¯?i®aŸùøŠƒô_± †Åìš­GNžþüó_ظvÕæÍüT6=uoX+b\½ÒÑ_UÇ ª2 uY;+óSZYP_Ù¸&vƒÖw¯Ì÷)ß„˜É‹ÌØRêWÉK1«ŒŽ|Šd¹1ΞèËL¾†ÂÐçç¿oQ[WËEgo­˜Š˜%tŠF i*¤A1E±EZ=JCiEy ôÃØñ ~^–ÛÔ¤ç«KrÑUÄt€š¾yÁ–ñ=é×EmQWi ïÃaÖÜs|hî78Xñ Tÿ/mÍÿ£©¡»:õ=öÏžøÓV“ž¤•¦½¼B?ø|å'9 Nj«žËù?ZnEêGɦÍlNrX»f«å-«BMãx’<ï^ÐÕ"¹­ê V¦×ªãØp“þöɾ·»ß+tAÓ×2}@wD¯®› –¤Ý^ÃËZBÖg­Ä ÿH¿æâá±ÖõÄ¿8ø±AB¦yÕ¨_h<èîÛOžÜ}ƒ¬œHdx_ýù¬ºRwX§šÌ`¹¾e¥ÉÃÌ;L0˜G™ êÞßCϺc»—5 f~>>½6òýÄ-f×Ñœ\ß2AprlþËÈ=„n¥y^%¨9Õ¢r”ÛÂXµš'Û Ÿùc~7 Ʋ© r¤@Œ¿åëø¼Ä;¢GNîu#¼yø@"míØdeQ”+‡Õ’È—šsýOƒþÏ!IÄx=-p[ô§Áœjwp™b¤7ýQ :4œéÂöš`™Q”/hÅB0#ÿ¥«›k¥Hôf|'aE¢‡6˜¢¹¸6h³â+ÃP<ñýrG|ÿF¼1ÉX”©-OüÂCxÍÚ£Ííö¸u(—×ÑW:õ™>UÄá;å"=ÊÓ§gÑûˆÿÏðü+t©Ù²”MžW¡Ìæn£rÜHœÔq£èó¶Ú`I›X#(Ø”´®hæ¸NÇv¸_ûìk­€ó%J¼$ÞÚˆ?€Ø ^»ût}]0Š‹JAqq¼¿W¬/QjP0 Þ|úì׺Cq+*ùeø2»që¹·Ÿ:pèógÏö\µÅ\Mî"„Eøátá²ÞþkÁË¿tþ‚,Öè»Cß¾µV™†r£/,+.ÉMÕñ²Òv…uÖ± »0•3¨~;‡/J«Ñ}‰êIì»üü_|Î%-„ÃÔun*JDNòh…*2_S˜Èƒh%¦VÆ$FkÜ)íã`ð•Ô­ rŠG~»v¡]¹õÚ/SkÌY1Óøb4É ɹ^ `-Œw¡ýãýù?–I²âvsàb• “^Œ6çÃMÌk‡ù¤S—·“¤‚*FÑͨ¹ÙÅðxŒ¦ P³ò‰áðh«Š½b E¿Åk5h= f¦J7Ry+½UëµaˆÑÈ5¡UÚ<¾F ¢”´5 ž-AÈóDаS‰GCšúÆz™.žÇ#ÓÑÔÈÀt ªNÙïÞp ºx—®º[…Æg„RId{ÞÅFjbb’8¯±‘©JmD*Y[V–T\¾?kïç\çì)‹éɰÐtJÏ‹ORUN\‡z“ø«3l|‚& ©™€jTÂÁƒî“¬éy¯ÌáxúìñG×î»Ðvø"ú–þã®ã¸ïÜY3vÔÅ–*Kë ’ ã³¹âÃGO!æÖ7›ÞY²ác÷Wax–EuèGý'5Ë3|Ed6¤<™.•àæÇ`ýöbÿƒa«ýS7¢d/•àǦvAIöXz÷'ýÍb^—…Ž¡:澄€V¼§dOñQ]U÷™4„êâøP¶IKmcº8içÀÓhÿyÇG°Ó´X“Ç‚î²m{êN£/˜k ¿ÂÜÉ'KýªÕzs;ÃyÿYªwêªdBAŒôW3õ¹Ãô/Ç?üxÅêåS¶ÏÏ?Âgffg!=S©—……«ü§=þ˜ø‡ï<ä¤Ñåg]Ì{b ¿ë%û»ð«ƒô{ÁEø;[¢*QÆj’4‰\`pˆRMJABntAt¡Üà‹v¢`eX”\ŽŒ²XY’Ÿ•™•Í5ÔÕ”¡<âG c £õ»Q-ª+©,Õ×W ²žÒI…>zQ};ÈÚÄ{!…&ý¼œñËMlä SnVæøC OÜ€ºa¹šÏé]‰9¾\0Š’´ÑrÏédXÁ3;üLÒrÛmàŒ0¸Õ޵&Ðÿ ‚ëƒ6'n g`$ZzK\Ñ­¤¸\¢@aMe™y9\mÓþ²3¤¢þ~ëÐB×9‹?z/xYΩ`‚hN6A´>¬$BÿéÌÛKÀ†ürÄœô_OçÿL ¿y¡…Ô4Ói’øHåÅÎx¹/Þ‰° £F~Í¥¥ùõ\&´ÀdXh<«/KKCEŒy+DJhM‰ÂüjÊ…Gò[{†bèdºj;Ñvô7Nâ±ÊmóBþì·µ‡ZÑiæÖŒ¸îÿÞÜÙ«¯ÿG'ýuAIJ• †Oxø û÷_w=ëlàæâ&v¦K›ÉxæÂN/_±ÔeõÌ. ½ GDÿ¦¢ÏQ?ÝúIüoêÆ¿)á"›~Ä7'E¢ ØôÍ…x³£N•QG)³LWjFwËÿ>¢;˜Yç¡…8)“GDß0§Á¨aãðàyoL$öÃ[Q’‘™™…J™*…>D& ô/[LúIGÂá!°“> ›&añ¸™x¦ïMÂëèDé¡ý “ÁÎ^ûÕµ»—Û®¬ “—ð5~ëHÇ™ªMEI()C‰â÷5«fv9OŒj‡qí0J/j6ˆxý»¥RºÐe0Îî¨å†]’Ì–Ð<r @ÉAÚà8æ•wç[ªÍW´³Û`¹ñ­ÄƒP2Ò2Š¢(Ccz}AWí~}Å}< ~`íša Ý]·ÀÅR»Û¿/|ÖöÕí¬ñÚmp¿}ž°ÏþÌÅeß¹f®Íà0Ô³_FôDëÐ:ÏËb™ d±J♵­Bu<+#/U2u¡¥òxïäM3ÏÌ&–ÛanðPu ·WËßAí¨5ø<¶–‘þ×IøT²+ù˜ºd]\BR ŠfHWUk¨*hùÆý î›ÇµtµuH¦ä¼$Ø&zÙûÈ…fa æ0í¶«òÖîAÇÑÑ£ûÎç1ÝŽ‚É®ØÍžbÈʳæ?޼2~éÕ¶lô¯HU‚&Eˆ”]^£âÑ`ûe`“—wH°op©O«”6ƒ°YßíV J6?»0‡x»ÊÈe|Š6^Íá[x{¼&:E:¡èœØ¼D¸ƒ½‹âÓµD–KÊ *ËÉÝlï»—yÄpV8Ϧ+EŒL.—ñiòì®Sê"HcQt]‰9*ðh¿Õ.Ú+¸‹7xÂì"LÛÔ<é’Ô;[v™MÙs<‰-j!OüÌ6æw:ÆëGAÃ~³£e›Ÿ"$t§>¬!;S‡Ò¸ ¯‰LY4wŸ—D Q”ª‹ª~3ýÀ°Š¤cn–T˜—£:7EedLX$¹KÌì>ì‚ÉÿØÄ.lÂÊcJrÓu¹EæÉf^„§àlþ3Î'f( ðàÛ›À -z²xþCI~v*fr’ô!Ax vŸßá©Í빓 ¯¯&e´&SŸÃ[&ÛCJ÷s ¥úmºïslíÕmfd5òU~bf 3±¨OG®hüÌãST„uHÅ$dÉ«ëa ‘\n ××VÜ¿êßõï‡úÛSÔM†]endstream endobj 290 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1302 >> stream xœm”mLSWÆï¥¥»bEÁÜMÜvëËtn&N‰.ºÄmñ ·ÅÄ*¦C@|Á¢¶ -}Áåh)-…¶@[J[‘ò²IDœÉبlÊ‹ºÄÍ·8ç–ÍeºäÜå°e·Äm_v>'çyÎïù?‡$„1I’Ôö=臘nXÝ¿XÍÝù#&¶NL‚Xb¡û…ؼÄû ×^YDD×|e‘úè Ùºõ’7Ä~"xŸØE¼K¼G,$ˆDb1ñ,!æï%„„†ø‘ôÆ$Åt $‚· ¸',>á|ñœÏäEFHNûƒ½u‘fuPÕT‰ÛÐjh»ÔÌÑy3t90ÜÝ? -0PãQ™ªÊ*@I¶k}máæÑÉámš} Mc çdÁC@­UâÕl…¥¤ë¬¹Åg•ØÏ;†C@Ù=¬Ü5¬N ÉzÃC¢#ÓôˆÑE® „Cr0H¶ŠÂh©Å õ`Nj×95§+å5Ì1üjì:‘á4Èä!h‘ÜíÆ=±CYŸ£˜²ÔúO²FMSüAVNPºbkÈ õ×S½[òÎCÔÏ?ÓâiCz¶^:0ØX§ÇYï åÑz”…òÒ™=“šÂÝLøX¯)"¯!aT €5è«$jéÁüã@å«;zZì}V¿„gdë27;ÝIn·×î'´˜,:Cy…´s˜ƒæ‰ñÌó©¹GKŠ”Œ",k’µ<“‡£˜‚–f§Eâ … ·)óMµÆÓSÛK#(1B"f UN P ’ÒÓpÕÞßúUOãx©Ï2†·áLãÅx•Ôs8XÀ gC?ôÂåº NwÃ4•jU·kÏTšªY¦D#“ã J¶Ÿk]]»¤6B÷Þ¾12TOGiÁŽe›þåõí}¦‚S.›¤j—J¡â'Ω yƒm] ÎM£« Õ•PB¥_È»òÛŠëŽRR°ú2–)Ý››ŠA×èitöÙ¼G )èúÇ—¸ë­ÐJ}œÝ—¶jž'‹2èlhr50þ//´z€jk6––³åµÕQ+Xá£^<@:ÞËÀÿz)˜ý6å-[ u–zÛÓ4Eª“ÇŠ‰_¿~ðùýeqCØ“Æ2û¥X°/8='m±»™ÐÄÈY¿§ÕXÈþ3¥€H” ÐO3´_Óu4ÿˆ<ûxH÷õ2ü3ÎÆ‡#º®N ¸qîu-Þ݈×àõX…³WŒ¬ù­DÑ)”Çà¡Y!½GqóJAóЮGc}ÒdœŒ)|xåœV„›?þ¤ä2¹º®'d¥,Õ~¹ÎTQVÁ¤¬Meå5êš ¨2«6è2÷Ž2/Ínˆ]+Ò)øNùN ‹ÈàK¤àK´Yõw«ç»]ÏOÎŽÇôűñÎÛPÜ%ô\ÐóÔã-38'¿†—eèmú€Ã ÞF¦=óØ7Ôõ±ÜíÉ[s0³O"U*Ú»çÐå.~œÍ9‡ ¼6ÆÑÝv8}ú q@;`â›²è ´¼ÇSjÓ¨&M•¤x眃 ƒ¼fUãvYÝ 35GíÓoA›"佇¨›77Â]¤ü÷`Ÿ¨ôPyj7îXÂêù/‰¥ŒVMÀe6Û›WËðà= ¦½é9/¯ØüŠv§ùƒÄiç‹ç¦üj·ê¸ödî›3é?# ZŠhÉÝý·VɲLê&ž‰jäây Žñ|'Äß©G³]endstream endobj 291 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1507 >> stream xœU{LSW¿µp½`AÑ4¶>îB[6÷J6gtÑM§n2ÇcÌ·ÓbEliË£-´Ü¯-}Ržå]Š•UÀ)Df⦉ÙÜf¦Ûœç²¹-z.žþ±‹=ÿäËw~ßïñ2aòñ†×^¸ÌWàí BÜã ¡ ‚(ĵ`úâÙ7¢.Ì<=‹˜83oŒûlï>YZBz&A$/K‰µÄûÄ:b=±xƒø€ˆ#D|["„Ðf îN³ Ã…m!¯‡\ $×’=œ1’ëü\h­« ˆ»Bt–[$¾JºÝÐ^—f YsÂb¯lªòÖž+Õ”ï9X°·dk!-ÃKB—“Ê|+Ýàd.“kq—Az(‘nIEÓ¿BŒÛQê\–Uéè]±©ÊC@i M³µÜÅDŽÇA€û5 àvŒâr‡Éä5טšM6 üd Ú]j³ŽI€ÍÆH†DK2 Š¢‹SÏ5’µàem,Ž^’4,«d Y[T.™¯œ*â2É&°€µá*’K,UæJ(§ê Uë@UJ\•‚à¥@m&µ6nAmi-ó9 Xp §&úVOõerÉbÈ0—ÉÝൖøQü°àÞ}á¸h@‹Ï^ï=næùP<‡e³õ´.C¹*¨B½µiRñ—¸LFV·3a—:¨Ã鎑3=hfmãûý¬Ó =Ж[»‡‡Ù®ó£?zÓ/@ÓÌ„¨ÉÅ£(=ºÅ¿¯Æ3ð\¼_¯GQç,ž!æLC_Ø(ë‘æb£ôzzõ²% j‹¼û\KU_µ©ö‹ƒ5í]m¾“.PÇ›²öÇà·à#&’‹ÁÛýÜheû .¢!ºÃGM#Ýu<‘JžÈhÒhF ªv§Íåà`úÜBe¤²ê=þŽþÀÖ® x– R´´ò…ÐW9ãgrm0ª8©¬¨à©Q­IÊ€2žÆÚí¶v‚‹j=â9 KËÜ‘:xà\ïµ í'*<Ö“|ðàÐr?7Ë/¸!7Ì…ŠË]P æ‡Ì**ÒjiyëþPøñÛX¼èròÍ®N«ÇÇä¯ÉYš Oi¶ZÜU^°S-ІÌ4™|{ܺoPÄ¡_é8´A¬MÛ´íS ’JÏö GÓ}mˆ—¦ºT¶9ˆ‹ÿKˆÆžÅB8&øAÍ[*Íö([mG+NÙèóÈ\Õ6|{ ¤'`¯"~ž©ÜÎh³Å ¦¶ eœùgÍo˜p“¢ ´îPÖK @•j¡®¡Æk÷1ŽÞ~#ÔµM+Rö¨ÒvÒ‘ãæûÔéGÙ\/б zîõ¸Ý£°öŸ®À…Âð\ßb_{Bdÿg—< ×)² À œ6<1\—P»dÎÀ=Òy Vªtéúl¦ ¹L * P´±ûn÷ßv¾¾Ha€#%´*õ\”¬¬Ãë«ýG¦êï¦JjŽŽå÷Rx~£8–¼€œåN0ñK Ÿüþ:¬ÌS/Ù-cöd$kSø0#4)E  Éf$rÔø<±WÑx`_zzZV}^{¯Ï×CcU°I\¢2êžÊ¬½ªÅdfn"m¥Ëb§t8¥;1:ÏÏÓØÁé©{9mõ¶þ6TE5( ôÙl‰xhX0v÷Yí º¦~ŠG3†-¾z;ýôõI‡‡(ŠÂ@¢ šMÿí¨ƒ‡endstream endobj 292 0 obj << /Filter /FlateDecode /Length 12439 >> stream xœµ}[³7ræ;Ã?â„_¦Ïư]¸ŽØ;ÖãØ oìZ£X?Ì̇¤HÚ¼H$%­þýæ—™@%ª»xÂ1V3 $yϬî¶³»Ûðúß§omw/ýðÈ1ôNÿóôÍÝ?ûè¾iwÎ[JþîÛïÉóš»+És«wß¾yôçÓ÷÷·sÞ¶Póé=~§ÖjI§çú;ätzfƼ2¿ŸšßÍø³¿6¿ßì¿ÿúíi™nZgvçäZ£µ~ûŒVö»ûÇîôÐmU™wæÎ¥8ן°k{{cmÏûÕß?™ßOÌø×¯9…³s¹ö<9Î^·-¹tzaà?â7!9oq²$¿mÎ7Z¶OôÇØdÑúø_îÍ?~ÿ8ø2½ê­™òþœé_îô·ûǾž7çüéÝ:ÙKžŒF—›k.zšå{,÷µyÙ­i?ÎÏíõÅÕJ‹ã¶Ó/+-úüŒ7ûG"9‡óyìhª¸Õ»Ç>žK•ã\þ ˜ ×™­m[œ–öÝNiœÇI<œ-á©<—w¸VAˆLº¾oéô§ã1Ûç>š¼ûRò{+“à|¼ݣ$CRF¾“åøÓ-Á½Æ ^ÀŒ|-gBñé÷ChyOî·sh~«m¢Š'÷„èPc8ý|ϧ·ÅmË8Ó1òwŽþÝüÆÛKã?õæ­MT„sþ—oýû#áyïo³Aw•â!ÜbR6h‰ŽÁ®ÌžÜá–àòTÚúáÂŒá/{Dk·‡|¸ñûÕ‘Æßâu¸Ïãb‡€´BQžÆþ—UŽa`‹îC½ûY‘öÍ¿>"4„sð„ßÎùîÍ£˜éG‹ðúÑŸ”1ב3‘±ä »ÖÛù5§3-*ŽÍÍÜYçÿì©K"É“ç©ÿ ôÓ=‹>åö GïB¿î`‹–&^©¥Çøn^âc¢†s,åç³Õ™¸ÒK}•pÝ(¢É2ˆ3QÌjÙ‰ý½ð¹D[Øè(œ'¼yÁ×ÿ½¯4²Ò›.‰]û“ãÚ,›—èÄM,’cÞ§½±ä"*ëµ Ä]Ó6G¯ð]f[àbéVöèï—žkˆq ’0hó„‘­W¤Ëä+ÑMLòe·‰H,3¦ÿ¼oñkOÒ×vޤrMó›KuÊK.X Œû-ͯù«9)Ñièžy'û¿<Š„§0u“?õ'ž^¿m—Ê•’ ]àé-L—W”"ÜÅxb×H‹tŸâW‘Öme3Dâ€ÛP¿?Þ'ÆN©µûO‘h<ÍòÊò ‹—ó¸'žîq(ù¼Uw÷8FR/HTt]ŠèŸfñ^^ïU?²ªO”E'úþ£yâ•ùýÎü~‹Ã!>L“‰*–iÖ~ :æ½ IŽæ|o༗@{iáô야¹úzzª/ö!ÇËËÕA_Óˆ·÷Dç”®¼è½™û§û –’ƒ ›ä}*Ê¡ä-7׺j$Iðo¾ýof…m·|²«XCtÀ¢ß‡› ¥5_¦©TµÅT~ “tè´¿91óœ#5—[‚dbï?1͵êŽòвiy·ÈØà!㿚/¾°T%%ø—{‘›õhyDGä,R-„¥xScñô;ó=†º]á-¹†q¤>_ò'»ô°óÍã@#ˆ‚4²‰•è»~éäpyìÇD«+äÎ|ÍâÿG£¾°šó€%ÇêQ!ÖŽ×ü3û¶ùTŽªÆã¾Qybë¶r·Ô‚pWÈb§¹©ÝÚÑÆð bÞ<›_vV{ìaóÆùT¿?ŠƒkЏ3‹µ&Ù—<›¬ÃÕÙ¤'gnÒßÅÞ\! éæ0..d™ÁE¼4tÞ¯™}Ú.‡›¤" À^!æ½$àþNàÇg`‚åk½FЖ‘çJM¢K[ûâ ¯`ê÷PÙþg¶ t-ºNåòvþ¿™Äfýº âý€³v}~ Ã­ãæ»‚QW})˜nŸ­¦ W³’òIêÙ5Úà“\+¼{.ˆþ¢Ì,pÞ -È ÇÎw$]ÌÒ¾v‡)íð¥ñç1Ǿp\Ú‹ñTpS·Z.ùȧð¾ÙTšˆ‚™´ËùÔ“ÝÏ쿹F“Þ‹2}tE’5ìêuÞ†G<ûß›G¾1¿-ÉNÔz½í‰*¶_còIJ৫Z¡%œ màƒ,þ·äƒêÑßËÞRK¿êÙÆ¸BÇ~Ðw5×%ºü-Ý$†YܯÔ3á[Ä$\ SàB±f‘òŒ1Ø54ðñʪӭþ¦·°õôƘ_(*kÎõã-ç§¼bóO×@X¦p>EÁ,ÑÿÔERjôº<Éë™!•’0KO&¨hÂ;xû}Á¢6ç®2Õëjš¬=þë–¼…›‰T¯G[Hþ®«½ùª–÷À6¨hÑ})Gxon㽆¶˜Ï-ï|è`ëMA¤Ëxý…û"T+I‡€Gp,Ü@QAð3)Í¿1z÷+Xaÿ€»Œ1èãOG´_c a¶ã.8•Ú3#AÃgŽ©I‚FTªü7Å0Ó=³uf>D§!ÃÖªG{àR¯SþCl7ª/Ôe}â"Rù·aRüZ†^ré™öã2ã”_Sû0®¤õÌ„¦É5ïqy‹Ÿ ¹¨ç@ßɼð]°èÕu=׎ÿVä¦Xc—PǰšÃbsŠ©Óٛ㳎ï›EC¼ê »@éÇ{1Ä‹:¿•JL)q$àŸ^_w¢t¤tM[I²6$Ë-ç™Ú²ÕOˆø·Èæ¦]Ë»€|%%j§øÀŒôšuÀ».Ø®dì+HÌÁuÛôÒëyÏñy s/q%ãÁ\6›3‡à9ûcÌ2É“—Ã|þE†ÎþÔÝC;"’ìÂÛfð‘ÀA»I¾g¿cšâ”›ñÔäM‡.b·‚iã<±lw=^Â/oá '1Ø+dnßøI1Xë‰4–çÿ>PV_¸‘=‚.œË”yöLCݹ˜µš¯°~23’3Ä/OŒ·Íí×[†ŽÆ³ ßS/R%*™æ“þûBNšÕ{T•6©ý?î´ÝÍw¼ I“Çë©Ü_v;sÿ[Y¨ÖŒîŸþƒÃ+´éiâë¬Ã…îq,7ïî yS"l/É—¬ÄÕJ¹‹9œsK’så÷dÞ8Û_š:ÙèPŠ›ßÒS'Õ …ï-øYáÿÖ áH[ù*Þ³^1K.Œnáš·i¦JRõrnÆ azòõôîÕÛ?¿úðü*%â6idZíBõs¢åÅ;Îyp¯¿H¸^ôÇq–/’¸Ÿ bÚ!ñ÷"£Z_Þiê­H…ûrióý¸W>Á›·îá~Û÷ÁákZij»‰# ÎÖĶMnF[¹pœº4/‰+_nÙ ªzˆ–V,/¹¡}턎 ¤­Ýˆ'ÀöÊÛƒñ„+a¬u]f“ó¥^ÚQ™Vë±üÿ"MéA‹÷©,¦ÕgÄ`'­9—›(–ä1®ÄÑ'‘üì–9$gõYg:Ç– É?äed)ž+…GMçv‘V<ã|?$y‹XÖPï'-ähôAq~¡ïÐk­ÛâûI®ž/œü¡Zžå2Ò~íbªƒŸ×=+çû¡«bò½ ³:S»:tQÑ”å&WÁE ˆ8P8k…Ñí®P´Uq^W'»,阫ª6xÐóÕ~Øð‡Zò±ºãÞ‹d./s4÷ײÿi6¯Åeu%²gÝiÏî{Êî,í|…ÿnh?¯Þüøúã“·Ï¡;Ñ[‰Ê~¼®6zÌ‚ý„,•¿;6{d¬³´WIÈ~ŠøÓŽGis^ìÝNlëäp Ò^K¿š®Î#GÃ]z¶¯:G|¾È'd^O‰FÅ•hRµi _ZÌp‘’ð½þ?_o?–æL™ØÐñ~xD&ë] ¨øÁ¯PèÜ_?JÁÅé7F¼~ôòÑܽ}DĹ¡vÈÝý‘þ÷Ÿ¤'þ+iû…duº#y„Û€’GÄW—ƒvMdñ¨´™QbFÕQ¯dF È>ê°³ª}̃j®»#Ü ^œçŠ3­=¨.}N0ýèùx"Ðþcü…ôlúË^'²q¢ø/Huw؃B7©œ²Ó+£\Å&0 j¤èöA °ƒúìc}Ý'¡hxìx1!Zƒ'–‘ˆNàjDšHc }e2\½÷'üårÿûñ Y„8ÖN5È$Û‚ cKk´}ðÛLÛZ™ýÍC:q?D ¥Þ‘Rɨʟ(8$¨J 8½~sÿí¹ïîq;‡”"§Ò¾éæêÝOîþðêãÇçÏ0ö€^ºð…ž!;0ðÌî£öqÃhã•(Î~ùxF2šÿ74£ˆøQ,Ýkñ‰hùýó»«W›ä@Äõ¾ ¯qR†¾€;0âD2ÍMZ¢ËCÚ£ºÎ`’îS%*ôÄÈpÇnï Ÿc+Ÿ9!˜¾oŒžœý‚ é¶ä|幺`ÂDr,D®ìr.,˜ëšÁ,ȨŠqÁ„ÍóV}&Á¥Òµ ¶Â!\®8”œÎ!9å°b…Õ¹ Ž.°ÜªU+,縄lJ;ûÚ˜lÚ’-“ÑÑ\”æt8&$¶˜Ú‚ ‘îÂF2~Y#Iç\—lØK‡¤n+Ž"¹%Æ`‰ î‰ßˆ%€×²ÛŠ-£º ’\%í,’°€_ûs%m„$Kö+X$º¢ÙVÐ`g u¸+” Â`nÉ Užv6®X!É">^`]‚B‘OìL++.r%VHć¶°Bœè!Ãù±-¡Â>¡#íª,ž0ä÷Îotº¤'‘À_™p¡¥ø*ý=+Š›x<ÙÌùWFíc:$/ÛA`Æ´ŒÀ¢4 û¨àh ›5Uwˆ®R¬Ù»CÌ(„VÒ4j@̨î-¾Âðõ ¾;7¾‘†Á—RROÿòã_…þ¦EcüÑdqž!Š#p§’GKÆð•QðÞ·™FU’qÅÛQ ™FµˆÆYfì’it¶êi”wñÜ’¥i”îÇŒ2;ü<{Û£Ù©-èŽ%7®‡ Ù³pêq=ø˜è=uö6ŒíïD'Ñ^¼ٯپ‰#ähm“-]»¹Í¿•+„J\Çþþ<{»ÁбÍ#c0#H”¬¹ N¿Á7ÈélêüËéé»·ßÝ=yûìîû÷ϟݽzûñùûûÇp€úc_h=‘Åü—û[¼£ÃNoͽ·Ý‘©ÜÌï_KÙÈš™Ò£0™òl‡t<f$Ë…( $½ 0®3É_¸Wp}«gR€R¡,¤@°Z30à‚\_P ©-3$oÞøUR„ØF†³€JZ\q¹ÂÉUŸBf†¬¯ÆJöÁ/"ò«*=HA%­ÌCc„w ©¼@2Ðô„JB?1$dø„¶(€¤z„œ‚ì ÔíL+.t7 ®yØè ¨rïÆš'øžéy™!1 „.† œâ¡ôÒ6+CÚ†¨AhØŸé&E ! ¤ÑbxbÖe|CÈœ!ô¸@Jª5`›ÌÆ(' ÁUÏ2cèoiÒ&Ð!aad½f䱂X= 46ó=CP(›BV4Šq”À€Œ1ˆs&sBKtƒ‹Bˆ:xW‘ˆŸ!´óÄ(Ñ1ð!òj8–ϺxÍD†ÊR~9ü³ ”F˜”å$ßÒtW‰X¥Á ÎïJ%É<¼žÔ’BHˆ ™H&0ËæH=ãÿÌü"ÒWÒô¨Èœ™4Âkj; pD¯˜gB2ÑLËlYÖ¦ï >åbÖF˜Ï:¯®? ¤x³Çõ{³x ã }ׂ+:Ó„ÿîø$q_Šs‚°ÐÞÏ…^åç³ DýgÍùE¹®Ê}œ!“à¿¶Ñ%D´¡52Џ„;=dÕ¡Ólà‚Èbèš6ž„¿tÚ'^_õUz?â”ÚôÑ_¢Þ½gÁÑ;åÆè] pÜ»lî+=ÂBs¥I!†Í\ûï¬`GYA茓a¤´Â°sz%q¹ºó ŸŸygSÁѳµVàÜšawq²«Îƒ#›‹a›´òªìNY+AœÜ¼Î~I”F(Ã;‹&U¤Bî\œ N™¶rzÂ@¿l—DpUxC—¡uE#U€%#vÂF#§]2 ÿSÙEH,çM¦ñFM©-tΉ‘È}Îê$ a5{+²KÆQd$cÁ¢•ŒØ¯ˆ¢. \•ÕJÆRšÜµ! ™²ì. ü‘ÎJƺõí¢±º¢„ÑE#þ+R¸‹FðqŸ­h¬D_)[ÑXI.—I4VºñbútÑX‰º½•Œ•–%A •Œµ¹Nÿ"ÛÖ¯y—ŒmƒÉJÆF[HÙJF0d—¬dl!*kꢱq—-Aí±¢±uò¢±¡û_µ¢±‰$ïr±U'jð‹­­XlÈ*n– mÜcƲªv)ÂJ¹Ù渽áÎï@“-Y–¸qw?Ë67Ceb­[çƒýn$ÃEohÛ‘-ßPN,«ß@¢VànŠdïcƒz’­TÙ sZ©H|Àu§ÒiCØÀ Fæ Q!·‘銑ƒhx·YÁHú¸höãðu¢óz’_V ¢=õÕ‡³ö9v_Ovv—HÇ ÎbÂ!óÂâÊ¥"—wàÓEMœ»ÐôUý\`O·éìàKôöxí yKàÆ-Z*i]ëtïµ›HmH¡AŽE_Ô…âF*˜ŠIŠ[RÅ|ÅjºPÜ¢×§ºPÜBR§ Å =%œŠíRÕQŠÚZE+7,ÝÞx‚aZ;W $‰Ê:8GëªPg.0œa?¸¼nÒÝkyX#ªÁò9he*ï”Bq«V&$Êí<µq²¯å» MèŠåÍÐ…Ëvþ=ØØàñ ­L£•ÍG ¡YµZqÒº:?DN# s3R‘Ølm¥Ë-pb]´Uº&,I¿[èKûÍMúO4€qß¾ÆÏtCÂ9ºZ`/ˆ»qÌ’ÓU"ÖØ%Mòw8G&b[ ÄrˆyF‰ë/C!㊯©_„¹BœC—+Âd$d¾”ü_?_@ù´„xV̾>^ï ‹”_Ÿ»ñxŽsHÜÒ»#3_Y©ESÚ*,åE+O„î­˜0Éô‹K®\#f8®Jd³`BxÃà„…á½"¤EÚIóÆÿ-K5ì!6Ö„¦I_£³(ŒBÏ*¶ÀN›u$ÃÎìÙ]Ž´ñKnqFÿ7^hN bŒ]0‘á@êÞIG"Ó³Ëé¼ù+Ô#†á°"LÛçsDÓy! Ò|©­L0½2ØÎ×¹LW9w%Ö±öfè¹Õ«W½kÂ¥Á*Ë•Ì?)Ô5ªoyèÜæPµzy…Éä­îÏöV&ÿLqêáþ™RþøôýäŸ!AÜ&ÿÌp›ì6 ± V½w»ek~²m¼ë>œnþÀ<óÖB Ý<ï6]‚è&3‹Ð–fS .}ëÃ$UD£8»ƒ6§›4¥I ewÐt{mwд †à01á p“ºUõŽSÕË›¬Yº 9M/(h²‰Ci·›£º ºeº¸ÛÞðMš¼M~í þÞÉ?4Û°AŠ:ç‡D'Âð ŸÃÖÄÃ-ÔŠ6¹.|P§úpo@Æ´É”ø‡—®e79Rà~_Uw¶ÀE-Πî A‰pg³˜¿ÞTŒh<¬©˜©i2ú.Gí=q Bî#qz5 fTyØäˆbFeš?O£ÄŒ*Ð8‚5 fŽn5 û¨ã¾-&¾"9"$qt37¢<á¹4WF؉X&{ŽÞ H µK.Ο®ŽBÞLiqÌv”B¦QðК!â°ÝÿÎ 'Ù!2Bš‚@¥i”îÅŒ2»û¼¼ˆ¸!±‰&éê”QáYë‰èc‘çĈ±÷ ¼oæ^ð?woɾþ#äè? Ù2’Á¿oÝÞ¯J‰ˆÄAaxHÑ þ|zþýÙ¸Ë_<}|9'6×û9‰ Ü2V“Øp„¼Óp,‘ÙÀb)º¥g½;HfëÄÕ ¼ÃœÙÀ®Çè‰Ñ3$j\/¢ãd"2Xˆ WšÙÀÌ7ò‡xÒä0"ÌǹaPzBc9bá耔Ì-Hì †ÂѦö,ð"·ÔÉ’ÚÀ²5â+ˆ[ µAH}Öš¦60)×ÛBÜED‘î¢Í0ÛŽ‰4ÅNB` Þ’r–à ÎÁ­$:ELeÄ¢Œi^Â]ðb€T‰vsÍHWàd6æÄ“«†»¢8bc&¹ÊçEvFdwH¸kc) Ú¯fÑ÷Ø‘ ŸÆ¿Øm é/í"Ù/dQøkGÐî¼’^9þ¥Q¼XIáp´>è‚ )š9+§nr9Ðà4iApÓ@eì;ˆâ˜pƒp „+’&ÜýÁ@Ò†\¢8AМd†€Ó)ùA˜7[Úcp"È!j8@2FÈB@®í dÏnèOYˆÌl!òvÑZˆìÂBd§"ذÁØéXµÁ¼…ÈéXˆœ …ð! IŒRAÛ“J(!Ä*Ú['¦Û‰µ·Np¹J”«›!\NÚ`u w€-/× À9šòv½#¬s‚/U_®W-À1­WM®c@BŸ¼\¯,§h°¢Ø¯5+àòr½úÁÃX { =h„MYÇEÙòNÈ—+"Ȧ/WVEæ€&!tvt,/W–Çéòre‹‹*œalz¤dØ+ »¢oWÌÑêW,Ÿ6k,‰²V 0$ŽyÚx^²@|Ë.Š‹:¯ðÊ’*ºÂÝw„çdÇYR_?aAN9‡áI9]yÙ'$Vœ Òì¡pX½·…¿í}üÜð â» ʲ44õžëN[ˆ§æÐÌa™“«õ3Df{ÀàÞ7æ ?^ƒp’Ci'/8d× ¤‰ðp®p:s‹Ì€Æ9έcq(rfòø!8íܹäÄõêð944©‡qèFȬµ]¶oËAR(?…Þ ©Zê5nCÓ‚Çm,qa-ÆG‹°! ~Ëâ¤$íœç•r~7-5„^ II ¨k‹ )œi@*²Õ¡£1Cb–Z.‡n°>Ÿ¢dJ¸„:M@²fe¸”ùæ:tEÛä©ÊnX4p•ô|´ÿ:bðS984MÏw9qªã©ÈS%)¤eT°‚®J€¢KÖâ“T38Ž3z‚ ÊcA¡ó‡ÚWh•§«œ}HTDos¢+:8๠…$œcÚaµ‹¦J,Šd“º#¾Ñ*‡ $OhYRsR÷AqÓÄ”o Ä©bIg5‚“l EA(ö¨I?\Ó“Ñ*(K^´ìëvQÓO<×Ù¼ÔNù¨´‘Æršì#®¡%H•ìï ‚ÿ)çü8)v¢Û´M Á8)ÐW–¬®?Â5»ÕN‹²^YL5R¤Ò´,娌söTM”ËÐOÇj·ôºËA%UÑí‘påž7tTbÐëÒI­€ÁxKŽe½%ÙgðDÕ…h$Kù› övðƒ½@¹j)ȸd Ü£½ˆ¹D¡£qYsÎzû…Ψ;NöÒgd MŒ!#p“-ó€Nï’e0H¨c[c0¡ìµ$l0ªŒ¬Ñb™YF>j± /µr`Š ™ñÅ2ÎT; ìÌ5 $ œ²R×`Ò©ç) Fžzd0ûcgÿ*RPúê2)VÂë»\R¢•QЯ‰É8>–~Ä©Wô…«!ê\7!§BC†#R±¢S’+ús+æC/’W°ý–ô…B<|qé°mEo-Ô²‘ú= Æõ‚ödp1@xCW]Ò¬‹´ã >Ã’jºÂˆÆ+ZÐU”­@‡Àç»WMq¼2ÜÀ´ÂóºO˜ÎKæ ò,°å%Ý.û™ ÚdI¯FîY¢Y’˜ï7‰îpçÞ%eÆ K²s[ÒÆ/6‘Œp¢®èŠìuÇÚ)÷”\pMPßZ¡€œÝ’¶€Ê\ÂKƒÐ ,¶·D¥ "=uÉ-ÆG  u'\Ó§WÅÚÁ,i ÛPÂ> E Mû#µ""¿OHÌÅ=¶.á\Á†­r×Ët=:ôήÈz|s5ˆ»V”]¤NgõaÔ!—fUfd”‰’ßµjxÄÒ5ot’eGþPιãÕߥäÐêøÒµÒÚ( «¨Û øvž˜vÝžÀƒ59BÒŽÃ, ¾SkºÀÀÑŸaÞD8k…¦H†™7 4 S óÕhÍ-|ðGvÞM²¤ëÙ°Ú›à'W "ãâ±èÖ_L­[‘j!ÂEPµ"coÍ3,MþôV¶Ö(‚‚Án±ÂÀ v«6¡Å¾É'Ýy7ŽSоEÀ†ù%;W;¥¨ïf8*ú«µÔQΡ§aÍÃ<œ]5SÉÆ»S 1ÈÆ»ß ÷nGõ0 Øá}@®·:fÔC²ék×)ÐÖÏ€—4ˆè¾LXgÒþNìÖ§’kÒ~ÔDTëš)[î^ñ…-´•è°{çMcþ]ŒÙ&À!íF÷1ýßfˆ6ÝÇ À>¨÷Ý4f¶Ý €¤F÷A`ÍÛµûÿЏLï_‘ÿ¯º˜Ñ”žëÞ© iHaÅ~µï'Ä­H]׆(p`‡% DÕÍ ’Ñ^]œ.èVL(½µ`ã¦%=tú|DÒ+N¤÷ê„new·%å'Út ]:òŠÏõ>]øèÎ’ÐNïÓ…HGZá¦ï}ºÛYòùžÞ¨ ñ¶¶Â¯Þu‘íº²}"1[]Ò¾Oh†“ Vð¬.E·¦}Ÿ4êBd¯ˆ›±ÄþÁ×Nua°",ÝÏòiEqä˜o[SÊhæÛÖ°iÔõ Q„ÝñØ<:uuÀ®s\Ç6{·Õ¤¹èÛvRwèËŸí7FŒ!ÛxÞ!¯!ØæôÒUÄÍšž´‚Í6ýuÐ?ÄËÛÍ Ä$ô;$jŠ„žð9Ìô—Ó6ÅjÒ°›ÌÄ+²µŒ ÛN¡ôÆÏݺ U+⇈~‡D­4@¤Åt·ävH·ö™:©[ˆZ¢†eèÍ0†íÉ_··ºœ|ÙÞÚ°¨ˆ¨Û¹±÷¶pB÷ÛM!ú)1©SêÎP£;ÝÝ.OÜzÆÚîˆLÖ¾$N>€”·Þq]ý¢¾d©Bý ©÷ >‰úMºÓ"‘¢O©cd»uH÷`éÝ}(ìwF8ŸMûw‰+&±¨¹[Eè]·†¡Ø[T›ïbÌØ=í½1×>hÌ í˵3HÛríƒÀ Ò®\û 0ƒ´)×>höA‡ [ |EA›t}byǧ5é‚0û+ƒ¤Õ• #Œ1#Œ0™0Â5Âc” #×`F}q¡÷Öúê8ÂXÜ8St´$-ÿnŽ1ú2;>¸³–ܹÞpËõ‹fMñçTî<*|%qíôâ‰~wŒØo$½áêwÇÞ¾ûxüîXi9ôïŽ9wí»c‡}~N(¢v:þ–j6ݹ:dolÂ:4ÑZOÇ9VÒÁ‹k=‚§›”ƒJ­'-F Ez­'éNX}¯õt’Œr·×z:|.BRêé!U…ZêIËSžÝK=I'hÚ8JK=Oêå\t¥ŸŒÔz’Þ îÉ^ëÉ%Á6çrÝ”þ6RëéBÿØK¯õtø¦T0j­çîÊ×bO®ŸÐæ:Rìéð)…H±§ƒQm±'‰å¨k±' ü¤XÖbO‡Í°Óº×{º¸i?Ì^ïé°=ix£õžd•e‰»ôzO.…ð¶Þ“LÁ¬ÕzOÉ­°­Ø¿·í’=®ûÒ’O®|(¶äÓŦڢ–|:î:ÂÓHɧKtE8ÞЫ> ÒD‰êUŸd¹i€¡W}²È•nkZõI /‰ Ы>‰gi«¦^õIª„2èUŸìfìôªO‚Tñm÷ªO"wýžO¯únõ^ôIzLÐi´è“S¢<$EŸÑq‚º…èìS$õ]ûÌtż-9u¹Be,5 ¬nŒM ñ]v£¨@pÕ"úL a0 BµH…4#>o0ÆáôÈ~€UuÌqÆ¥_ÈNü­JK()é'ý1¥¸éèÝ.ND RÙl¡2Ñ—~qh'n´Útj•ÐÄ~IhYÕ6è"roRW±_6Ô:Øêk ;Ø]\T骽ØÄ¸z]·^þH²×Ùjp:j-ë<÷Z˜Ü`3HTq+’#²ìªt.ÜYZ(®Q¶‡odjoCe!é§iû è¬8±Ø º8î)åÞU£çv²Üœ?oW-ÃG§t)ÕîBÁ·b¥†- »dy'ûVáƒÀrÉV>I{O+Ã25ç"ÍC?äõ[4çZ¬º|¢¤_Û˜kYˆ¥7æZ7¡6æZ³é}T–Ål´íɪMo˵,fÓÛr­ŠÙhƒ¥e!›ÞódYÌf,pQȦwåZ²éM´–Ålö mzW®eA›q&+Z†ik¥eA›Þ‘kYЦwäZ´é¹–mzG®eA›Þ‘kUÐfp…UQ›A5«Â6C¬ Ûô†\ËÂ6]2­ŠÚô†\Ë¢6ãW…mö Åmì„K7½!×'nv/|„üñÒ ÛÒ¬oòIŽ¡'Ó×–µ]•öú9ç]ÝÆgX&u<&qvï>šþµøÝICêv|4EÓÃvMíáðÑ´Þî{=t7D`åÉX!{ÍMö ‰ôm¶y¢¦îv‘TeYÛ)ëg:†‹†Ö ÖçpÑTmÃ><4-ô¦ëÝ#_‰cÏéQwƒÐ{ÉEÝÆþóݰÄgs'Û3©­¾Û§£Çذa‹~ÓswÐô¨Íî ·½,¦û0¨z?v£Û뢇]Ž-›†\$4 ÙûÞÊ`wd§Âá)nnŸ¾çþíÞ™¦Ø›vƒØN¿m¿;6zǰÝù´ùÇî !å…M·Ý‰B†:¯pwÏäM’Ow÷LÑxþé¡;»G&êA€§.… ¨M»ùüáÕýcwzqÿ nµ¤Ó¼ ´FØ;=¿ ¿Ÿ«ù”&úý4¾ßø¥vûëPIŠî™›x“ÿ‰ÛæS¡Y#Ü¢ÍÓœ xùôìÕÓ¯Þ½¥wЫÔÕLk¡¿yúéÉëø ¾0}úùÕÇ—<ŒŒ§ï_¿ûøæÝùþ1Ü8ÛVNß¾|þáyÿ{å¿Y~Î/¦Ó §çf…:zÇËq®œžýøPÂĴȾˆ|úÛ/ú»ÖÓÇ—<áuK§§c´™­¿Ž~Ó®Ç?ñ ºÉ‚&™ŠŸóce„ç?½z÷ãýíò{™Û×Ó“ÏÏ÷róyƒ§:bÍšúxõê;stmÿm¼÷ÿ×þ[Šendstream endobj 293 0 obj << /Filter /FlateDecode /Length 4963 >> stream xœÅ\KoÉ‘¾sý#¾lÓ˜®Í÷†aì,lË=Ø<>P$õ€EJ–ÈÑèß;"2³*òQÕÝ¢f T¬®ŠŒÌŒç‘õϘäNà¿üÿÍý…ؽ¾øç…¤»»üßÍýîû«‹ÿú‹ßI?)iÍîêÕEzCî‚„Žrç­œ\ »«û‹¿ííåAJe'+÷/Þ_Ädb”qŸ/CŒû»ËƒövRq{‡·UŒJïÙ×x A†ý[¼¶B8öðÒÃ#:üýêEwRNÑZ…§'”Pû[ä…%FƒVÚ´”–Éd¦i aݜˈ¦zçÍ¥˜`Á½‹Î%y’éù |uû#{÷.ó%Õþ)¯ñpaù¼žKïÒ@¸bé}ºí`ä°Ûi`@#Œ/‹"]Ö;θD™ÑJMÖiå«[\ήQR§å¢^ÏÛñ!/a½ùœÓûöÇ n$-2“6Ž$ôP†?bëvÖ‚€/Îײ¨ÕþO—îÎZ…P†8$-Ñ I³~e…É·¯/µœ@tìþ ’€EЉÏüûÓãòÇP¥Ôdœ˜UêOl=—±À®·í‚Ì»‹ÛÀZȼ’´æ\¯P"ƒ!¯%ì]^v|ä¿z¥ì.½³;¾EŸ! /·*4‰Þuæ³ß"ól^×Î÷gfbb†ë ‡‹$l6Ü ½­j5 ÂVf溆K÷//*L$§ð„Æ…l’‘Ú›d6)/¿¦ùß&ÕÑfÑÕáˆT'ñP)áÛy«g+“—;¶·+ZI+Iô°NRK6ú<ùFñæëìº3]éz$ó#ÀÉÉÝ×'Ó€×LÒË ‘÷6ß'ɾï è0Šm%ÁÅB(3y#Ÿ­`ì ¸´NvPì­îÜ, 9.ç{ÏÇ÷®ÑG$£Næ8O¤˜cpy ˆŸÛ dÿØçÛlW¹2 IÚÇ7ñUšº(Î4¤¬ršœ©D§³·Åñ#Qaú±bÅÑçHézËõöÏ‚€àñµFrAÈmW˜¹‘øFòKq’JñÚ ëÁnûÂÁêç8Ð<ã5츌rˆÎ÷B£¶ù?” $­11̓‹ïÃLç —&“ý--|ÉØl4–¸þ}ÔÎf i H9€9Ú`{ñ;shõÝ%ùf!ëGÞ'z9H™7áú-»›÷¡¶Ó«e…­ÒðxµU·-¥9¡±Ctb¬†&_9× Ôú÷—à-€\hw€ÖT¨ê½ŸÚ€sÖÌ$ÏbÒ>y^6ƒ“(‹ »í_Ĭq Ø2eŒ»ãæ>­X¾~³íÀÛYoçdƒë¬³Ð¾÷‚Á}(Þ)K«Mãb‰X} «4Dy¶"±h>àÁØŽÂ%ü Ã¥/­ ˆº…â¹ÿñåp3C2vn¾¾Çô†0IÍ ê¦å¼MÏÁâ´*ƒ·E—Öð™›ý/ZßÐx8I$¼yž/9VäM”q”¸6 ê¤ dD;'"§Ë¼)]yïãŠÐ?°ëµXéž]ÿ~åNÿ.m¨Ó` >•j¤H’(­¾VÒÆ…5=B™jCµ“ôH‹H ëªá¾q:‹‘¤„÷|ôD\hƒœæå2s]&?sGq$,þL™4™â§É[¢¡¡°¿Äk!kÙe2\¿ñZI/“£ÀÂíÿšEÆu¤ Üm+7nc´­²qL‚[|ÜF»ênÊs<_×1lR5±H __N$ïy€`t*ÃöBå4àìKZ]IÐÃ7/C”(#’’Ðl•mÜÚË#V™øaì'5É P« Ï\$IÔ+wB ů9T…ö.€)¦_&¹ äœà^(1e“§ÔB—éTx ²µ.è<ÀáèÒ(!C°É‡Î·G¶¦ „qX ·;±;2]*Œ±ÄPÿqÂó=$²mÞ¥I*XÙI7@öœqU Uà”¹qF0hN,âï®.þ|‘äëàrí" ºl4µqg $û„.»Ú½dú瓤jÊ?üÀfñ×7K~Tt…B›7Y˜aÕ²½µ›öö«tt?„¬¢ÜPQÄ&ѵ…„¬2˜6‚&›e„"ø¥‹æìžÁ¸ãžåôÛ?.©–“æ‹Hºtú?V¬a“~pÚNË…C£+l&LÀÁcô ÒÊã[mtùªp˜±‰µÑ9©lˆÆÎ€O±±ÇmdU8çMl5ÓG=9#Ó‡]GÅ3ýlEGù>Ø>B7ò}\;_c‘A‡.Á–Ž,n§mû³d“óÔê¸é”ÔP–û3Š“’ìÝ ›Òž¢ed†€x0$û—MøD6$šÂ iãóD.åB´û›CD°Fj:‡ÁÊg^Dƒ›Í&0Íî§We]åþCÒYð^¢î…XÏ&JÚE F žLpÈU£}uÀE8çÑìöÛyÛr®K¥^ã`šVx„âHŽ­4F‹rѬ^+\7«àºNákWP&Zƒ»ê•®#•,Î{xË®oZeLÏ‘%P~ö„™iB|A‘ýaPʘ5‹‚˜s!i4UyÆ¢!`Ä8«ÓòW,<æ´ŸÚ°ü1ñÁŸAà‹®)‹¯%÷my^E³×¢úHQÊ–eÎíP~ïÛ5\óDÂÇ þÉ8i´+ÙÅ]!fÜ6£CècæÒ:â$ÒØÅ;ÜB‹m¤8cÑôÁ2ÞÍ!–ÚtÓö}fëìA×f»¤ÄHi,ñ² ÁøÑŽ!$…M@gUx?奣·fï¸L<µ†±Iy‰H*®Ûm?Ä51k3oãýõcJ³¿!ÿérØ·þÚ©Yâ8káû’Kæ|&/'D/+eýÅD+—ëô –ír‡¡tUg½–d”mlNÙ³5‡CD;1ì†wC‘J@‚ šÝµ öWuÿ‘axbKF–ˆ‹man§1-u u ïmâbÛ´Ï,=K P+A> ¬{ž—6Tg^íÜ(òÐÉ6~ÝPaJRYz¢¾”¥YhŽi™l>a,HÊQµ¼)ˆ>…a²¡ÆßgDSBä>Ã: 5)þrî`(s)§òí5EkëD™ìOeÞµ£c©Ü¾ë]ß^{~“g4hiåÝYÀK‘ ë]½q'; ‚ôã()pù($R'yKÞq1ð¢³S˜4–Ü6a¼ì„_¶&ðe‹v}‚k±îZšÖÇÔ÷=Þ†§5…q?åV=5‹B×t‚C#wb$—Ö¬¶‚POÝCoŠdçÿ$ Ff~(Cwåר·Eq7v?›‘Oé5Õ´ç¿O·ÔÖ¼¿£k2[è ¶=Ȩ¨ñÝPã´ì“ìþž.×Êt¯#×AvLžÐú>SiÚz¢5ª!ÐeK ±Œà‰Í Üt;2@HGžFQñήmÍ)‚sìP‘–þ ôåœ\÷P înà&ú†ùŸFJk˜zÑþÚÔošwÅêk¯¯Ù¨çä@3j™ÑÏ,8Û ê¸Æ‚öFÏœÑ*Ÿå‚äˆá–Ê(¶‡ŽØ×9¢$3U`Õ”¹Äò+ýåÚÓC·ãJ‚PZwÊš)ª|ž7ÔÁÝWv\I Á¶S5éªåj|ÚéH S}BÓ%$°m8Ö&@õf®¼[ k#F^FµÀµ`¥‹Ôß}.°0ßÿ%Ò¤×-ãCŽï}J/ªÒ—½~às(ñ§õwk7069à`ØçE£t7˜ÑùÚfHH®“i3b;ód ÆÌ(|c$, ÞÌ^ì uvF!ú¦6œÝZ±üäÂÔvî3š‚W.²oá›ü%ÁŒeÌC9ãˆ#õ Gã©ÆÁGí¬t%p—NØxá)aM}tÊSÒ¶·y³«$È”<óÒv¦„u¯sr5ÖTÖ5øÒ€s ¨¿ÙûÌ·‡@~£üʃXÐÅ%Âýÿ„¹Í¬ùߥ£ŒˆF¾ÌÉÍh æ…`jésǧ†¡ )ߪŸL!ïcytpjý3µ÷§.a:›)Ü\Ìgëý%àÒº‹6ÐJ á›®›Q>×Jîb˜”¶ø¼×ÒU¥ý“ªÙÁlÝje[Ö*e†G‡—Ó«HR Ý",ª†P›M¤ÇÇ!‘ NyZè´©1»}¡)SÆÁñØË†Ná#ØPÆ©þˆÒ9¸nBðR¢„—‹ÈɤÖrÓ¹3¯ #n1\™Pã–Gdµ%t##™ýÆèzå¹…*û†˜<»¶!f‘ìy_¤²âؼ„ñiëÆo)£ª4)£b>¬à=OX«M®ùØ/iLOªK?–uœŒÑá‹ßæ´ÌØc”-8Š-˜JŸGÞûµû½ÿ.Ä0Z‰÷m¢‰v¨˜¬Œ‹•o‹aC]˜ WÍdƒ’g ýKPʃªÖÇ™e²±Äòw…ͯúðEWâdNù]ΪïjÑ}ø§ž½gïÙ ”& žqpë°v¦nI_‰‘“—ü“bÀÒ7=cKÓˆ}¬”4mAi”éa<ÊÏ3%þÜ$žªôùSHiV5¸´'Õ!Y“`ïQUå¿”Áékìsø7f.×éSñ®=áf>{Æïn·mý]›Ïm‹F?ÏW'ÀSg@S^¦iJϧÙ%y¼Š88²¾ö© ¬ÝÉôÙ¼5I(°2×c]‰¶:N1 ãçÞ"0°ÇJÁ÷9àæ™yåŸ"}ðªy*€Õª]×»²u~éËÍ«ºÙ=_Út…í:²Yâ«’÷býj­ãŽgã·)Ð@Ûö–çøcl‘ékª+õµJ·fû?WÝ$xtš‹4_‡±Ÿüùâ_¾ Kþendstream endobj 294 0 obj << /Filter /FlateDecode /Length 2762 >> stream xœ½ZKoɾ+‚X È00gûý8ø»Ø{H6ÌiW¢,Â"%›’mýûTu÷ÌT?f$-ŒÀ€Ýnö£ÞõUõ|\±ž¯þIÿ^/ØêýÅÇ fWéŸËãê¯Û‹ïá~ÅyﵫíõEÜÂWN÷Lz¾²š÷Æ»Õöxñk÷·õ†õ‚1.|w³Þðn‡Ú{itw‰÷db¿Þ(á{îT÷§¹÷œ¹zã®s½õÝçµ–p¾2ñwØt¦»Å ø×žsN§{•-þ„cǘ扸¸ýLÈß“ñU<Ê¡×dú.?—8ΑÜñ†›Dþ&˜è~#¼9©Tw¹KÓ} ÛÞÏLo|ı÷Î0E‹TJÖ3.9I3Ëúì¦k·äG*‡s’—wQaiú€{ÖÿÝþãBŸZy°íØÃMè %ñ÷d|] -Od|9#1¹ÑÖ+¯ø@Í.?%ˆž÷Œ)ÛbḎÚp‰Â3,µ;›4“,Ž¥[2Þ“õŸËùÆúó2«–÷ÚJ×b5PiA™ NêÇÁwŽD§Á*Nk¡Qó>S=u± ׈îǵ @íJ§’Á=,œŒW+ ®ú•GÉ Ü/ØobWXˆp½g¼‚v\oŒr«½2.)çÓᪿ~<]h¡Àó}÷‡ô¸èŽûÝiÝžçgÝå.¶Ò¤¦µ?Ðr»ÿ¼¿=' jnç‡wÝyÿõíwÇÝíþ»7‰fây¿+ø»õ3ÄÊ^¢Âmÿ)‚ 4¼Q…Iõ7¥¦«¢¼u_c:¸´.»÷†¨#Î)ç]0¶ q·õ&3Xwi6HWß§³‹Àu§5XáqŒäiˇµ0…¥jÚÅ[µS³1Fâ«¥œöëA •uÓU…›áŒÔ—39å÷ò!ŒSÊBH—¶7v éÅ)ì•éRl³XeªIã/Ï:Pm•µ7$™D¦ÀpàTˆÇÜhÐÎc²„ä©Þ do¸ê•‚”¨/Dí•Q Œ‰•k¼ ‘ÃÂ8O!€q/$4ôñè“àþª—Ê—Tà¶Ú®¶?_lÿük§qƒA‹=+ØÌÁùu·ÅYéá|€MQ ^’P§£˜fF5>ìÛhPi| ãc3a´J¢Í"“u\­H0Gíİár:|LOV¸‘œ¿Ÿæ_EÀ§(,gÄ8A/à˜GòŸ . ÚàM%úÂÞÒŠs >N63å†[ ÎÊXDk.#!ÿ$j†@ã?u¯c†¼UÑ‚3w¢1ÎÓ˜zø´àăY(ç2³h€ JŽË¢š ໎°ÜÈ7@Up%7\Ídc7š4Ân(<â‹<àèm<†hJ¤Ï@¤`½]p‰õóWòܪ< ¿kÿ-ð…c)s+Í”‚Çþ)1.kdítuú¢”¤{Ó‘ÖÛEÛU²¯n1¯ùùB3­u‚Slƒ†sSÇ-ŠS“Š è å+l3çâN¡›ž&¶Jzü ä\5:cŒBJù"£˜\ïy£˜­²}€Å*‹h¸£Åy…ÖOQ…#Ö‰'8e‡lróø-Î(IýxjæL•fÿÂl6® ׌¡nŠõS f£Þà•W㱆«ÜA$èÙsŽv ƒ¨Ù†ð~"¸¥‰xͶüaæ¨"Yã±®*þ“Zö3§&2Üx“hgv¶<ÌÌE Éb3xdJ0^£Rë¤ä@ϨÐWÈ2ädpºj²À]†5ä°t3Jw §,™Ï³Ôïë >VÆ ;Ši®Ü‡Z‚Ÿ%;}é@–œ–òú[ŠÓ"6u©»à,úÁ\ôCdˆÝÃÏø6±ÔÃ%ì~€¸±Q„H籯VÔ,ØFIzy¾hi›Ðk3%ņH+ˆ%ÆÑµ å‡ÜRªÂˆ3ß2Âû^âû@tÙHzQÎ>õAû(lÁÚoOÑ4øR Ü,~Ç\y¹×RCÁÆ(‹¨h>ä¢A^×s Ž«x* ¯|ø‹ÄH £âRØVWÝ\jÝ¢IëÂÛ_S¸xo¼;,À#´—!ÓütÜ•ƒ~³\5®a`øl{3 Çþjð$̰¼ê£;¿Ä%X¯Woy”«‰ÿIµcøà—ÒããX¥ãÊÙ« v ?S/ffëCM%ƒR½ìÂ[Ì(bTN òå Šê67¹±Ó<@óCóM›±ÐxD=ÅÅŽåà‡áI1Ûø+ ºY­÷Gé}׋®GKùËÜ0¨ýfÓ{U.5|%uoÀã* Ö…¾ñ:ø¡»³Ôlÿ9³®ò|ꡊñ€y~o-KÔZ!oÉtUD'%€U7Z>]°h³Ï‚­ˆg+v\ÇŠ&KåWs¡h£äUŸ¸ÊÛjÃEèSf‘Áҩ͵3ËäÔžQ³ÈUÑ! QsêoSK‹ ‹ ‰ì‚m3Œý²¼GæÄó@ý|¯«h1ñ¬l§¦=°©r­8™ù!íp52aㆹw»À… p8+‡W±¼a0çÎË/.ÐÜdï6ÏÀž{2~•ŠûÉü_Èøg2þ7ÿ÷bçºùUÂüôÒ@ËÁ>J˜ÊdZ n´Lh·¼™´œlC¯› €{iŠ,3Wy «±ÐšA÷œã:l€Uöee\Ç7Æ4ÍȱLKàv(s„C–¿ò>E@bõ¬u^ErüÌ£È@êâÛ `#ßø4ìõõ+9‹ï$K×åEVæKțඑ°ÓY „©§BòyIæ¼ýrïêæØ‘SÛ*â%\G“O´»ôâß@=5Ü(«æ³³Vuès“×µF¿¦_NmOy׊>3¡é‚¼3u¥‘·D 7®zU¤•ƒ±€æqöà°H¼‰«À7f¸NÇO\ÓûÆ!ð‰WüŸ„0í–8 ¨ŠîcžBÐû´ñÒeW=Ô{KܸpU–þÃW>©ÍTd^¿)<9>Э´yü¾㺆ÏÄó lE?W~»‚`Y²°YX-'AfÅÉðB&mícÁZ†GŽã½ ßc…ú_¦ÏÝD®úa{ñ/øó?x5öendstream endobj 295 0 obj << /Filter /FlateDecode /Length 4302 >> stream xœÍÛN$Çõù#Žä&^:uíª’ÂCe•D–"ÛD~0y`–yfÀìf_òí9§.ݧ.=ìZŠ Õu;÷[æ×cÖóc†?ñïõæˆßýzÄýÛãøçzsüç‹£?ü`޹é×êøâÝQXÁ­î™tüØH×%/6G?wöôŒs¡{Í»¿œž±^9gëÖäyÏŽ1-L÷€ÏÆ9.Üøl¥íVdþW×~‰ÓÝÇü|žé}b»@:â£vfˆ–¨Óq >¼3/Ónàfä«\†£÷0QÝŽœO÷»*Æ„6ˆòYÂùŒ«^©Ô“¨   ÷ž @ΞÒ([h„Ô¸³ÝeG´€’æ}IÇ™˜6°:Ó¢´&Œ ¥ŒîJ]Ò^¦›(³÷D€ü Ÿp…ím_ ¿$Œ‡×ÛîÊË&SI F'³9ÀÁž ‘dì‚Àþyþyþëôܲbpî¢v\ä>"‚"Ü‚Gô`P\Zý–¬þyþŽ<ÿXÂìBÓ l—§D*û@;gí¼å•^½D‹•^¨,2KR1oyç4ã>²07®”œô„$DÉÌ{uÈ­j¯`Öe'–ú'œî•–…þmF¹ŽÚv9 |´n„EZö37(…Ryj ¬N¡ÒJ8Ê Arå¢ÊJ7{ç žƒõ.¾f®´†¹³yG‚¹ v6Ø]î¾²ó›Ñ€€a Á[ÔE˜P2‡:éŒ7¾W¸ø‰œü 4®â#ÑuŒøTbýad¯ÐÚd Ý¼œ“pw§€€$’ÝRWTŽso‚_ªÇXÆ÷æKCt¬sz0³{7¦jè>øP…+KÏÉe^£Îæ¢NiñK؃™°DÌÔ!fCâ‘‚×'bL7–?†s€þÁ”Q"ÞÅâ@9:?ºÿ¦d×7E¼Óð¥à툧²íâêOäù¾´){|;’É͸öàÓƒ¢6#^ ÓâmIÞ‚€^ÊBl›ó`†ÆVÊM]\â9†ý·ä}a÷#sÁîkÌ]å‰0ü…-9.<ü¢.쮜AWÔË!I+ó3ˆ*ƾQŠ~,ÁÞ°ÙlFpHÕ¿^}RùÝ|vŸS>¥÷b€ÀÃ6W!¹×䤞@ r^ÆS_| ÐFØìÄ2T†cÔ\G€Ë@Ñ2HŸ3T·ÓR0F¥³“ÁnVáI=æÂC EJ‰¬cV!.“!âudϬÌtô§7DWAö—äÎ܇wN& W uñÁû`î jµ®G's´-êê\:·ùm©ˆ‹Æ‚ŽC\08cxi\©ò9•³½–†?ËîFm>dwA—¥5-ÃKåƒF‡4®Üo­¤–€œÞ—©êÈ1'áyåbo$vE¶ì‡ÆiN4Þçê“eÈ;ïž_Gƒ,2…<µžÖiÍâf«îË… 7wCžWäùº¤Î¼€(Ù³A"–LûX®°ÿ-³Vr® ÜC, )‹S¶ÐCêËHyËy´=§‚xƒë•/¸QÕ»+i‘`€ØÄj÷,ÂG­{6áÃü&áuo \M§~h¸l$…v¢ôí7ŒM_ˆK1Žeäîí)dK°Æ–ò‰G—Õ~ºÿ(C6c0R8-š² ì( Å‘ÒÃtU¦ÓÛ›˜ŸN†˜f­ëv=Üc?èÑòQí^çH쵟¼ç|RMoÐÚiŽ4Yš3•69±à>F—aw.؆uXO𢹶#ä é*‘‡ €’÷Ƹ"^Í6Fu¡Ñ«Rõ®Æ“ÖãS•A@!ÀÜÓjƒMb9bõ^èòºsò|R*ncþg'QèNö‹¶'V^B¾*"S‰¿F1±, ‰¥Þ+&@cLú?œ‚'˜>Ï9·Oa2¤Ø™*Ò)”›¸78w®ª´U2_ÿçd!|oœ©ô<¾ž3dTCIq1és±œ0劓˜ÉÌ[µœ+ƒdjp¯ÌhgÅŒZ’ÕŒýÄjqHlÀ †s"6¡ ä/}LRaF[’T‰Ä\¬ai¢flÃds!Õ¡¨ä^„Œø*¢~6îíEÈ¥Ë'ä@bè¯âÓ(ѤìÜ ä,Q ]¸ÿú¶¤QU•!Nh*³NýÙ|f®öÀƒë$!tî2+PÇ!¬ñÈ ½ ™Ï «t1Âü4å`þ˜ºîÕ<†‚Ycbmžvž/^úyj便t˜%‚Piçë(Ò—ãË»º¦jP<+"T¾qroj²ªb×-9†J qUVûå©ô›â6™ùk8Mf˜ÜT`OÚèT¨aÀ×—£ñ.[ ÓÊjýÆ®!ÚExž«d!ëÊÛ®FÊÕÒC…‚/\çö7]þTX;"è1ËÃËâ§2Ä«wµbá°]†(':{ªnãm `¨,¹-É 4÷!b«–ŠÒÀÀÎeag€DÔÚTp(³¼êñ¯Á ÏÞ`’[þx  Ï¿uÉÙB¤6³…ãî·®‡â)·V‹Ó×ñîmd•_áœy^ÿ†Ô ý‹s:‡ø€fì›\\ÓÍJ³ ÌŸBëWÕÍ£OúusíúAZù¥+Q…vcý}ˆÐ[tòα*ÇE~Ù"Sݓ㎠ßýxVbŒ—³ÃñºÛß&²Í.:À† ½TeÓJ•œÑŠe•õMŽJøØ/¤$Xx½_I¾H‡'a®ûºêW@©Á‚ hU^lT¿Š2Áøþm9ç p rf\Ï'ÅÚ¢ Š5º bJ3ßÝ6¶Z<  €§Öb¤-änŸÓ‰Ö2N÷¨öÖC ª±g4Á>-ÚËÕºPó[rõLrÛ[›úX”#òظ' ±æS©b)`–lðuá("zîE‡‡¢h¿Ç©Ú”ÀÛÝýlž÷÷áT^29ô8 {dª±´k^:ïõUÓ`ÃY͵“áõ€4ÿ?Ί Û¼¯þ|gHîÊ _c9e.Àš R.…ëÕÍìǸ݆&×–mt{•˂ز곬Œþ”š'&t‹Çã/êZ kr¯þ.¼Æð6z¿$ós·Ýs9`¡4SþfaèþN¦Äƒ!鞬þ2£f;:Ú¼Œ},‰f²Éãy¯¹ ›šç"Ó[ŒróW·óÝÇ:x,7*žc=Áû:^ßé¸P/»è¢ÈR•üjHB–\ b£êçuü%œôŲÔ+åÄÉ!„D€Õmeyë [è;ß”Äɉ-÷Æ=åþ{3~987y0ãÇyØØýÙaÓŒÃaS}QlÄÒŸ¹HãÒ%òËüâ®­®º1çÞSŸú¬Ç°‡eó ðT]žsŸ.4z#æü¢Ã;å1BûTžÜˆÄ]iaï…mUg¢õÙ ¨¹Je¼¬·Ü‹‘Ïɉæ83Û@[¼¿¨ŒIA«C<˜ë èR€Ê¡êª0ÊñÔRåYU&46&xë/Ÿ}mݺ ÃxÍ>Õ“’ïeµí5Ÿ’ªâJ<F?ëzYIíÎ,òôa®õ~ËP‰þJ 20¥ã§Ïspšqs_%´ ,+;êü¸]ª{I P®•¾êÕ®ïSO¨º!«ÑEâ|xJ HÃÌÈù/P˜Þ Ê™e ®~3ÏØš™'–mÎR!üÛžHJ"E˜˜½FJSø3\Õô9=mFW# ^êy$¶ôü ga0¸ \䀨Îüò À¬åø<¿¯ÏáצΆêÚa¶×iî­u¦Ó<ä‚N}îᵜ¶$aJT¡`‘˜íª‘ofy)÷ rÕøEbNMSäUšV„n‹«R6^”¨r³N @$W­Ð®õ½ ¼RÃD²­| E¦X¦ë³ñ9ß”j Þ 6HBéÁ_ó¶n ¤æþZçð€ñ¶‰Ä±æõµÀ³eFÚæ×¸$Âj€R&ðìü&¤e©µ–µ[5¸N¥á¶œ39’ƒ° –ª¾ µäYµóÕ­ºM=òº‰‘3ž¹oW“îÅ H_z›I£ ¯÷9íÚÊ¢¿5ÇÒ`«¡ íÓ*§Ï+³•S-U¾5©œÆÃøÀœNŽŽ ™m/û†Ç|¯ÌبÙ®ÿtio¿òÔÌŸë8Êx÷O¢÷÷¥‹i~]T&S_¬ðŸºå.‘Þ¶Î|4É¥èI÷'­ÿÒzë²D,>¿'ZqWžŸçZgèYU¬Ð8놜µœÙç@{ ]pCó+™»@BíÚõ³Äëç$å'NVõå—ƒä´ß~a°/‰ìp/¶$`Ì}8ÿêêY#*éù…CÓx‘‚Ý—þ’Ú«Ú½¶õ’O»‹²Þ~Tµh1ËzÒøÁQý–þׂ1‘äBm®:Xu‘LB+= ‚~Fû.%!ö5qàµåƒ³‚é3;¼¢z‚™”}ˆR@IçqTEaÀ¨÷Ž9ž>13ûZº›Åãâ²[íV—§§ß€Mߘ^ð-Ç;]Ýýñ ÿ*ÀEú%ý»Ýb³¼ì>¬v·«í ÿGVhs`…¯Sâ¿ûñ~y½Z>Ä·àÎÏÓdÞŒœ¼ñ±, Õþ /‰ 6V0—ÛÛGlíb«QõËûźÿÎÏŠûàr7~¶ùquã×xîÜúŸp!|Ã’Ávgb{ÓízÓoîn¦å”00H(òßþMGš{z¾I„Ý»Åfµþt~rµÚÞmV‹õ 6!%*}ýõDRØxDJ3•º_ß=nî.PaµòE¯„¢»Y¾[<­'?Ý/ÏOvˇû»íÃò$Ùí–O»íÃ4ñ~wwµ¸Z­WÈ?ß•hX¯®v‹Ý§Ën¹ØyÊ-i¡°û¡Kü@"f€š3lY‘Sû2q“œ7ËÛÝry.Ù!XÊœ¯W—‰Ö‰Ô—§‘Ï#Gp¼xD'XGD7·×<žŠk–á‰#‰” ‹‰c^ŠÃ>ðzø,2ñ™¶~¸Œ pyú-< búfÚeŸtw5Μ ãko¯6áÁ䌅I(G¯ö!xõ2ý¸Îv,wÛ»§õzuB†VÛÇ厰ƒþ¸ÿpÎÁ{E<‰ÀM(_M(×ßè¼ÏñækøQŠWyÚaÝú¤ñû£ÿÀÁ§$endstream endobj 296 0 obj << /Filter /FlateDecode /Length 2749 >> stream xœÕZKo举û#3V¸>Er_6ØEì!8¹lïAÓ-»{§¶Z¶g.ùí©")>$µ×ãõ‚ÆjŠ,V}õdQ÷3RÒÁþïjAf·÷ÔŽÎüŸÕ~öýõÅ_þ¥fT•ŒJ1»¾¹p+èLË’pCgŠëRi5»Þ_üRÐù‚”ÂmLAæ J™,%-þ™ ·ø, ©ˆ.|fÆ0^¬·ÉœU—üH_“çÃ|Á•(¡a ÅQN`Œ«¢nÄáYhÇ€›ü8¯XÉ­Š !’©b'œpYj ±,z)íMBü×ë^&Å‹I/`v½„,q (ÏUE(3 X™Oæ;â™2$)•ìI§2$BÞÆÇ‡½ã›Ve˜8Ô´‘Eg/çáÙmMA0Z)î½à„—°ÙlÁeYiÎÿ>Y¥d÷ÙK vÖ€ÂP§ÃŠ®+·›2FQXÞ@P<›ó-.²D)°B"Æ‘•Ê”BfûµMòÜ#Ì+™'ó§Ää¢ä•¡È~e›p›Œ?$’ì‘û&ä0ŸÀ5(<'´ÔÔÁ AsT¢èYEiÀl–ÎÍÓ”ã<¦KÞ–ÍØ&+ý®¸)«€QO SÛ€q®8FÀç(¤àZgÔ õopùz,iœ±š  œs4@^pn%xOUà»åw•Œ¦n‡Vvp”t÷ªlYÊz›Œ?Î%/©– t‚:S`#ÑÜrèÊùB :ˆ,®“áÍž 3^á’ëÙ‚òR ­ÝwC“³áÀ3ì z=Ô»^ ÍÍŸ2t˜TU/ÖÈnSWÝx„™ÚÂîÎá™ 4zã†éÀÑ{$8Z"¼O¨QˆÅ#CÚ9:f`æ )pT¿åæžW¹¸£&ìˆÞ +…®šk/ÌÙ°wçÿczh¸ÁX:Ǫ2™im¼ÍwÚ ·!¡ø!þ”¬OƒÎ>p‚–f&Ïd>ydAN—³<‘·qþ­3… ÜŠæ‡[gàœ¢™ô–0°Ù®/~¾põA{¾dÈM«¯„b¥"rViSJ)]ÍPåñ×ÓÿrÒHꜴË`^þï@No÷ ’(¦Jë6‘p7 »`¦„ cPîâ®n—Åþ¦=>]­–»äË9»þí}èÿtqýgðþãmÙµM K†ÆhŠ¿.úgޝ—…}¬ØQȱïñQZwÙ×›ø¢Ûô?ÀÔÛæ´]ŸüT4Úc›LÝ÷ÇÓªY×§n»²j£\Aä>xŸŽ“½–Å¡Y5§SÝ~ŽtnŽmÜr·6--#JŪú$1>½ßÏ0ÓÎ[pÙ]™AÄÚíËýqÝì"(ûeñŸãîaßü÷ïÍövÓ]öB²b]wõUÕsƒ@ßíŽÝ2¾ŒœÜwë+™¬=¬ÚãétÅSë˜)÷M·9®Êw^þEN5$\¯ÃDŽC*~GANm–DЖ/¹ªVÁiÜ?ÔÀáö¼¿E=ôs£*Úûç<±½©'Y‹®~À€•")É!6ÛX™º.ÂÙóòb—`ÙÞ¿K¦½È!ŽžºçÂWˆl¸(Ûž"ŠuÔî®þÜ´Ãã!Æš¼õ¸tœCv›º‹2Õ»Ýñ) ùèÓÛU· tà@<ÛJ0Ö½ÛPùÖ‚ÿ)Ê’jµ[Þ´õ¾YNõQ×r‰ïۛ܌ò,7غø”˜Q¤ê ­O0ií $l“®ÿ ïR~ÎD”›Èm=™Öœ5E¨÷·«ÇX X³q‚Àúçp‚×ÁßN=îËyô­Éì7 UØéÅPòKï#:äm˜`dq8vã×d˜QÓ g벂ܱ0uN–¢ø»ÎŽ4ðFªŠx2³gÙôýíðœŸ×ÅÔÐqÕŸÎ[»yžüi~ãyN4Å*Áº»†ø*µoýBY!xlDc? HS­õ˜œ$ŒW¾qáãă_©4– ‡~1c\†æ»†¨µêJ©HÇ8'´Þõ”ÐT„þx²ÑˆKšboˆÇƵ2}ówIĘJ%‡7!÷~o· I¨>4†å>?…¼q®‡›ÄÔW´±bcrÐO +útB‡})œ¡…bIëRBÁ „K>ØYs9Å5y󶜴b½|Deï Y›Ù´w§’L–¶ˆ{’G÷º¢ÉÛÏ ;›ÀPˆqÎè —Žu-ªq“Ûr/ìËŠÄiB7ß–z`( —.ßåálÑ¿^  ê&…ffz«ì)¸f ã”Áh69ƒ~Ü7Ž+6`ÐYˆ«E,iJ—ÖMQצGUfò3£Vy´·Ø*O.&i‚ÕÁ1êœÚ¦íy‹¨ñ(Ñ’çæ—¢v0ê&µðÜ›×3w~:£*)yÞ3 Iî0®áÏ`Q¸_Z)½¨ÙY*ÎÕH!®ÕêZ¥³›&°–Š%û@æÒà:˜u«¹0²þÏñÔc«ð4¨öÃQž„Ê®ªñ´3j]Bp“;!¢¢:ë¹cPöÿæÖ>Ö‰ª¾ŽÔn†4™éÅ`7Çaw¼×´¸wÎ䢜æú¬­=ä†?hð>݈™»n!/‰7¡¹½Çç¡ÁO™:ƒø‹ GO °gIlnë­>t>¬­ƒç¿ØÖ.cjÊÖCå/µ.ð¾ù9u ¬ Â=•½R3yOE“ëê³÷|•r,^)î÷ÒËë7¼ßÓPWUáZgú‚/ éý·Û Y^&¤>Ÿ«±L•PƸ½òL? r ¤­Øž†*HÚÿ&î*ÆŒK $ÄŸÌQ“ÙÅë˜öšrÄ]QŸ«Fœ1XÙ *ÝÕ1D  <›S²+»8œ¢Úß•[µQ:L¾]œê’éj÷_kø ç”…QœwgØî c±–P±Úo4Šœ¨x³ÿªÏ@ìµ:‚ÊÎü~£Øy?ÿÄÉ4p}v¬«gŠ ËyR÷N87U¦„,3õ5Ê>>O¦h´6Ñ/|åísx>9i° ÿ0ý}ÈÀ?81¶‡ýžÝeœ q˜Œ<êŵ}øæ"ó&g[ÕPAvØè±<9Ócþó”úŒøµ#Q¿YþœèZ²ƒ;qæH8µÈZ+ã4ø{½šŸ/þOÚ¨endstream endobj 297 0 obj << /Filter /FlateDecode /Length 3410 >> stream xœ½ZY“·~gþË/¦D ÷á*—ã3q*JäÕ:y°ü@íR»kó2ɵ¼åòO7Ž™f†ZI©”„6€îF_7ðË”-ø”á¿ôÿÕf¦7“_&<|¦ÿ®6Ó/.'O/ì”Û…àZM/_Oâ >uzÁ¤çS«ùÂx7½ÜL~hølÎÊ{ç=Ž9z¡yóÍŒ µpÌ7ŸÏ$ƒ/Œ7ß!)Ð9î~¼ü{ÜE-¤2wQlÁŒ™^þcrùçš¿!­Zk›]\A4ofsiõB9ÛœÂïŒI!á÷ðv½º#Ÿ)É*’H¦›ýºœ:H¿©i”wFðÈ6÷SÎ^ëÀ· €gÆ¿EjÁ¾y=›+Áá/ß<Ì„A…º¸œ¥iî‘@,¼·8äÍ‘L^ÅÉÜùÈ™õ^yÕÜ"Ý]"Þ5{ü{I¾Âí¬ç¶ùy¦%,©LñûMR¯4:o$XX—7ÎÀxycÌâLfâN÷„ì~X“wµ ãùpW68ä¨a‘|wdA#›v2ÈÉàà·(D¥8Æ4×ÍXQÁgîk~èÎTº̵!‡Ú›b›$ Z”naœ¿¸¼/8ª €²Óm`™Ë`b¸õýeqÈ¥¬D͇Ô0Qp~»ÎfS苬@W'ò#ãóÌù|O)m£i˜&Ñnœn~€¿‘üëËÉw“ãá¢ôˆ/¼…™£V(/’0¶³B²×»nÃ9†#_nó#ÊóIbºâZÈé\È…S2Šü"‰Üºµ”`F=ËÝ¢‚,*¹yVim.xƒ(]ü@6 ã…ÂÙoÈJ‹ÄñÓ ã Y™YH¡³¹í×»Óf÷ Z=ê˜7ÏCŒbLhÛÀoÀfø!8½ÔY!Ž=˜ßn†×ëÕúãc"b²¹˜ÁDíøÄñîú~¹>>é£?îgá£I¶ÇÕ“n›åö:xÈyf ì9— ­#ã”Ïå¡ ²¢9Ý-×y#×|EÈVi'Q|{½Ú^Ö9¨y•'ˆZþãl(RÜ…ƒaR"èZI*œ)úúó gÙ~,u`?9–ÊXšÆ«èAÜÉæeCœPFÆ ´˜F¯'Í_ž-·pn¿GÙ/¯~^ÞÀù\þ4U(­y<å\TÃéî´¶9 jm>Í5¤pPpó{kfr¹wªyl+üå5*!’ÊæÙìèåáØ}¹ ö“'À·}²–¸¢ ÖÒþñ|yˆváÍW«}<óU^ÄŽ< 'œ,+fÞåýévwH“!·PI^œVûÛÕ¶“äÙÝúÕîpؽ!+)/òZ+´N®­®uiÒ¥9H¸ÝVÄy3Ù¤C Óî ¥à¬§òÛÓiÿÉÓ§_^|þÏÅÅ|Øý´º:-v‡›§i‘Oã¡d1UóGò¶Ã…ßàØ+œ5ÇÌÁ þ+`.‡ÿo1x}ÜB9‡y7b*"– )~—1B4sÒ¤ gÌe1¦xl{“à,¿L±H(’> ¿Yç㜈·Âo˜ç*,©ƒkû•®xEÉérTŒåMJ%H8@s"߉¸£0Ôš èû ^Ðüô¢˜ çá˜ÍQ‰F–u=NˆF“OÉø’Œ/ý÷äû×ÝxH Þv¸†¦G„ÙZDòš·#ÑwU*§ ÂSð[«{Q J•˜€¦)XGp";gÚ€éÂ*)I®U„•¡”8…šé`Ÿ­_ìCµáËçwŒë¿‡¯Óg0çMW+ÎMßÖYH^‚5á{sþþ¡5ä} M)nŠå>‚uSƤ÷¬$xÇT¹t ¤aÈÿ϶§BVAªK k<*J§q/J'œ×‹Òiü.QJ8ÅZ/Ì%w4 Yô‚kVÕ7Ç œ ¥ÃP@Îaƒ+Û¦«ëü‚âà óóÏ¥Gì^;ÿ2yŸ³º­Œ‡NR¬ÅÍc˜¦©ì-L‹Ž~ˆi°o”²š(é®UÏ£5MÀzH\äãc¬50„R‡®ºHF+SI‘NÔÙ;40¼¨ƒ(nÆ)’±ÑÚG¼àpû:?a?HÁ”®ü*q´ñ õXÄÑÚÇCþWlÂ1´VV4·ªf< gAñô¥¡ ˶‘i Ä{ ë'áË–æmžÊ›_±¡ÊMÇ-Aw\ç5ØБ/(´ ùfÏÿFä µÀ1’Ö¥-Õp8ˆü™c÷mðÜxîëŽmTªz\·—jþ³¨á¹}D·÷y™~y‹0"Q{Ú”©U`ÇÁé¾ã¦8°nɱC1CÑ FÃÜ:uÓÒ4øÝÕ—"µ3 5UdŸè¨Î<YoÛ~uʉkâ–AGQGŽ«:Æp|ÃTÝvÊãðÏÕ(9Šë+nqqÁ†cò#[½Ï1„6ö“z¼È8.tìÙ½~×ʪ2e”‘4€ÇBDá!p–-¬ß9F>’Òe×팫A0•ƒD£© ‚àío¯l&à–œÎ!ý£¿¨*ý'Ë›K¶é|øo‰‰»ëôþ: ©¡¯b\Õº”#·íµK•‚Ïö^µô{9gòžsŽC%ÒHÛ†„‘ŠªPù=­¡’Ò5ÖØ«:i¤b!²?´[Ýsµë%Í:0ÁÇT4í<ô ëbŸp„d̼ò>¸/FÝ1ÀS¨(vrZ€¢p–(–¢µiéâÉ‘?ïÈä éíž,• ìQž|ÆNÁ©`7•w=”»µiíŽØëæ¼-B4Õ¼«SÎÔÖ¶Õ&¬éB'äL©1“½^LnùÐ[ÔU‚…Þ ÔäpcÙeÑ™[¼YJÎ…ZXéSOý›ö*˜–8ÄýÐM63‚Úr£sÓŒ{A… Êê‚2µÈ' ©s9jóm1À‹>à–GÛK÷®É<…ÖöÿÑ'ðÔ{¡çbc-¯ÉVäUá{¶„ãçªØñåK²å%Ñ­Sð²çߺîbnrfëâ¬%¹NfÎÊZ®WGíóRn´mF-÷¾äb¼ªÄcP¥hò£¸—á5׉]Ó¡š³Ï4—zÖ’âÓ‡‹Bos朱pÚŽù+оÉÚJÚžó‘]LÅAé¼F2¹UÈ[KBSÈ­B-hÍ>|Ñx¶m&@:U7=„UÑ •½~@°q/ÿwý‹xüѰk\ Uµ×[#kÕ´(µ1”êæc¼½ˆ(uqEàe¯qBê4bêI-ÛÔs‹N#Îc"ÿ¹®È£á¢ÄE¡%.tÇÓ tÓ:ü—#…nÖ>%§rý&iÉhàãç 2Ú¶”±oBÄ›7!ÕMD }•AãòzˆZù©È‡„¡ü>NàS"™‚}–ü€»VJôÙ ì. Æ}™Zr>ÈîsÑ5æ²½ÙUï!‚ч9"9W9x Cƒ®Âõm`²òw©¥cüSåÝÆfPÌTX=mëµbG³äüO#n:–â¨KàÅCµ˜†£Áªë®Î(q¹›ü(åÅó¦ú±5cœnú&YóÅ_'Ncšûä\GO7%=­îËzòâ=r"¬‚­ØÒîǺ¦xéA ±m߬äwAñéÁšŒÏ¾ÏLýÎ]nCÚf¬kú&¼ E|³ÄœÝ? üp {ÀÇØ¨Åô±?iÅë|¥P5 Cß–¢½GÚQ¥}Å4v\ª‚Í›zn×-mçâu0C*ßÅÂ9ÛðÌ,¾‹õôaì5i~~‹C.¡)‹tûŸC+ß\å~k!õ©kñR†(I:®Ð„¥€ÂÂëÑRkŸu£íUnßç…ì?\h¶Ð@G›*øÀ™†ÓÄç8`±âßœP¼å†Êp8 ß¶]àÈ,‹uë%A·8¥hÿ³S|gÍôè­{•+‘˜ïC¬±l|&÷áZÜi’göÜÒ·«$1ÃêÈ” 6ö*_Ö<ÄÅGÞ)ÌÛšrè¡B»ó)/R†G|õÌ7B Ìvc]®M äÚëÁÔ©²nØÊ 4c+l’YzLXÎh»¢»È½a²/cuf,„Ès%yãÐу-î ñɃ‹Am`ëë'"vÃæ÷¿>4bR¢ë–‘^>Ç#)•ñ:§ì±+>NñºNÆ”˜j?gˆ¬Áñ*4iUÊ #/,ÛdøÝä¿–;aFendstream endobj 298 0 obj << /Filter /FlateDecode /Length 4943 >> stream xœÕ\IÉq¾7ú }00¯yåÜ>Ȇ5°a§}é@v÷-õB‘l‘4ôã™Y¹½÷šÔx,ðÀêz¹FÆòÅ’õ§s±ÈsÿòÿW÷gâüõÙŸÎ$½=Ïÿ]ÝŸÿóåÙ?¼ðçÒ/JZs~ùÓYê!σ]„ŽòÜ[¹¸Î/ïÏ~ÜÉ‹½XLŒ!ƾØK©ìbåî×øÚ áDØ]]Ýà_*F¥wïñÑC{Ög©âî–uxx}±×Æ~÷½s“Þk)w÷y^wðVÂ3ŒrM3ihnÂv×/ñ}ªzHzk—"þþòßaç2žK¹Dkn]»ÅúÏ/ÿãìòïÜ]Ò>„À¿Íâª%nCù°È˜w”ܰç+|–8MHÓîM4©ÿ#¾pBèàv8–_bt»k>Áp¤§öÇ÷ìÇ›ú=­0ت9ŸøǺIíÐÿöÓöú-6»#bÆàD½xÚY"K›Æã?~Ë:½O»”Ѧsϯ.€yàÑW#ñ¼cïp:? Üd .«&Çr±7J,Öý_ìõs–û¶!ÂdÈÀXK0¤áòxÿ¦=m`|:¹¼G%l5p¶þ’Í}Õ±FIÝžb¢5­ÞðSTi!/'[|™ˆ+áŒÔM‹ƒàæ÷e÷{icœLD(C aHˆ pö+òiea:›kü™ÛWBP]UEûÅI™á¦>@I‡«]âîßjáÂ)|Ì›OÃX˜¨%ešÍõäã,õ!µ Bí>²î´¥¦#í,˜áq¤¹Ì*dë@]ã¼m¡íF-…¸vyÂgP^R9P¡$W“o'ŒþP‹"Î"£©ä"ëbzÏTaú™hæå Ig¯+r{E^F0x')d00C„u@« Œ«öûX Ãf¸¨kú(z˜UV¼ÒÍý3¼|ʧ©|HƒxÏ¿6#Ëß(À¤QÄÿ#é­Þ_³ç›Z­Ï ©8ˆ­gÌëÀžFÐgÖ&~@ D# ·-d¹[9åóÖ —ó¯—g¿=KnË»¹'àl¨’{2Æ+@2îÜ9»e“'£qxÀ8` Ùðó‘b”¡ adðH‚O#_sË.;$B¬-ÆÈ+¦½Ž ZV6Œ3s±GÁ[F8²¶:ª¬%²¹#JÇ¿fäþÇÌͰ5Z L°Cé i®ß혒 ~wˆ(Ár…EwZ½Õ?{? ‚j7Ðq?‘˜kfoj¦i8Wèʯƒçáwwqù‡v°k{¢ÎßG³€ ®g¤ªè„N/Ĉ¨¦ÅÀf>š¨cÂXØÍè@þ§D§À&Œ'¤°âÛ|0F`Ë' 4\>%}t$@gyS\¹âò‚TGO!BudE' 37‚ø½2‰oòp‰HcJ]`Ö!ì†. 8ý$ûãÄ ziÊSñ%݃+ö%!dä÷•Y_¦Ñ€ò`·ÆõÆÕYðó ”ÍOw"U…'ʆ´¯6D:wÝ)Ùv™Kß^E‹P¯Q-#'nu‰b¯MN.MŒ]œê*”Ýw¬ã}ŠXß›p¾ƒïÒ 1v|HÚÇ•qœï9rÝÃ*hèŽHØÒŸ/’«V·­‰¸üך? Ï +ÿh`|ߵƟD2¾Ã”Ys¾°îºùë¢`¸™¥älÖNÀ¦‡ÔÓ¦£B$·wÕQÊ“ÓêxŽ–^²%Ãò-giúˆGf>ȈGrT¾qÙñGe¾+>éŒG¾ÂBI&ÂÛ“,Ô€îºcY¨#JlžÆÕÛÝŸ‡sƒ8QôØW[E…þš ǬâŸÙaÆCÆjo„ µD’Z«‰¼W)Φ›^ã\ð] ½¸Žßß¶žeÀt)îÁYt 6™.p‘Â$Ó'nŒQ)Õ‡”ºxp6â\F^·L¹`Ê^Huð|a’sð0/”Og8rÏ´Eë<0­3Â?UÅÁ6Kä¯óéùámR|Ì ¢ß3 ü«Ö‘kƒNP¨ñ€µÇV:;TÁ GZíxXÑF€ï+úœ^›!›`ÌÐt¶WÃ\äóêîÒP±q”y4hŠ¡[bÇ„oÈÙQðeÓ <@ê(ny`ñ9ø&ýæÅ$)¯´†1¸ÈÊ(ª5Câdh÷Q›®.tÎ!ÊucŽñ¤ÀùñDà?§Ÿ"%}·u›Ë*?A>mðÑ"Ɔ“i†Bĵ¢×¸”nÊÁ¦‰%‹",'ã ažæ”]g-1,eÀ…†¹òïü=ŽO^¹^‘h xfÂØì £<¡‰™è:ÛÝØ[g»{‘¨æ4 #Γ¯[fÄ(Ê™úŽò€É8ìþ³^i?k‡"![ÈB§!¯óùP^|Þ y@ft8ôùý™‰N-Æ­oîÎ~ø‚ȇE‡Ãøúø~Ì’ù5|aýc=°dIJ5ùÂÈ œÕ…­§ù} ©·$…ˆœktÍ9¿€‡'Tm^¹ˆÓ‰“Í”ñ‘20ϵØÚµñÌY ó@Ò™X‡C/³÷‰î¾É+Ƕ¤x¤ªÖÛ±5‚(nÚpw¥RfÉ%+,]}L38ÐK‰Ý”8× 7iÜä±DxÚi Mæ0‚ž×Ŷ¡:Ü!Nâ›l{·Ù§-Ø?Ë LŠC¶¶öö›‹€ûa·È2-¾ŽýwP)›ÈÒ[4q‰B£¾Â¡p'¦oß§k›3ùíÚ@Pþ|+‚Èþbí\Â0˜ìíÆ’œ•»Ç«ÕëüKš‘2 ‡Œ„”ožEÕ¦ÙGΕMe`vävU&ç{~lŸ³P¼oÙlî¾°|•wû<LGZtëõ¬)èÖ¯aS”ÇÖ5’‚ðÕm«ÎHÄf‘¹™Ýå}OÒ}àç}[];ÂFúEKÓƒÒ5T_”•r(Év–PIJ.¤s„æR;Šq­RÅCm÷y‘Í å.-É-Ƨ4±µ!›ÅçÚjX¾‡ Ò̽½ß(Ñ¥59ª»ºHµôSÚ”…•qÙ2D†éëXÑZílôSgŠ{JEû`Ÿ \ciÆ~D'WxÕÒ™lŠ’‹¶k–ù¶µ)$2 Q]îgÂê–.G\¥w ǼHa£c†lޤ@çæˆf-èˆJÍ¢K2Pö·7à®ØHØjCʾåg CœÔJc›RSHHXD+“‰~vù¡¯ñ€]R5 *E<ºGy·šh¹{z¸úÀf¸M½ƒSyoùýÃVª8”k˜YÌk‰ 0€ìX½I—î]ƒÞ{ž\ƎȉÏ„Ø/ÆSñà ‰í$º¨­{gxÓ³ØlPA4ž²cbX6ôŸ Êº`¼lÕU‰Ùd¹ûïI8wdYQÞå ä>´è}nn˜&ù'ö^µ¬Ê˜:_ÀŠpš£ t)ýHç¡qU[ÅHìäE‰Šèß­lÓŽrY‡ÒÓ³z®“jý´õs|¤á˜pÓ ^›±”¹Ã~± HQVÇ™<¼â¿É(ûÀÇSËnwÃ]*àˆÃÝgÈ;Íð y7Î ‰Öžq#¤óOÎ “ЏB´gäYÓMaÉ¢\:¤¹6¢¶Ël“PÜ8¶08¶½R`ÎÐHTîÄÃäÈ>2væÇ×Ùpþ>µ ¥V—ñ@=Ú}síˆËVV –ÄSA×¢:>.J¡†<¦û¡LÕ_£„t†(HGRͳœe“d…¡ú;-8:¨T‹·bt˜ŠôSËáëÒÕ3õ†‹§ÞaN¬#^1ò³G~–C~>0ÀpN¯Æú Ï TÆAž; 2ç¶[8«{¢c[S4ÿx¥—ƒËÊÚ˜f~ú5Ó ÚßI3Úž ÇDª ¸æ[ƒŽ’#æ§ë~™~)FO?´ÈZ“úõ'٬ǔãÕö1;³<¦5cÈ7y‡Ád°3CwÖa¶zn[s¹Æã•ùIMoúy k`“f™—&'™I9Ú ™Œ Ü” ïñ…Æ›ãuFám*ˆ ¡¾è<ϰ OwÊ6#•KîM%rÇ 3‚YÝû *­VÇã¶‹ô^ï‘BÂ_PƒÓ‡ÃEki…u¢s˜Üˆ}N¼Ù%]¡þ‚¤Ï°. Ü*$²e5ñZU8é>“ñÔÊsu%ˆ¶õìÒ)‡]à¨Y"Q%tõÞû²ÖZ…o½VKÅü#²2¡2#0ó[¥Ø ü1u[ˮߧ¿\qÿŠø.}W.yÏŒˆåê3Ö]2bË¡P…UG\.+ãÜϤù2ZÍYÖQväÍ ¾ñÒ#îêï¸Ö,Ô‘Ï›Cô7¡.U±iã°¶‰ÃßMÃñ\Sþ˜ÆÃjÂkÖÌ6Æ3ߊÌ£h»öyŠÖ?# ´a¸ÂÕ©rñô¡ømÙëü¯úpSÐv'M‰ý6Y†ät5ˆ­9¼ŰM[¯q*âG·Z0ùCwy¾? còÜ» ž¿?S“§v}ƒ×xfW`°ã½ü è?‹RNÖgŸEÁ¯%Êu›>KtÊ‘t¼=ßk8?'T}C4Ÿ¼-Ø,ŸèÀB—¯8à.9"Y€E^¦àêdÞkئ߽¼b}ÓQ!‘’ÃCa¼KÄvÈÒ§‰q×Ïiønãˆë— û˜šà…3bRÆòzƒ‘º¬WSHš"¾JW+yHc{´yá2” X.c²Pçgª Aë£R˜FIhJœÆ…ª_Í€Ta+|»ÍÏ Á»"r—žôÂ-kò!Í1˜Ç»ò>¦6¢|§Œ¤b®ÓJVÞ T¡R’©i¤äýÞ0úÜlôÉÚWyÆa K‹)Úwwÿx}s—- çC€>ʯé7ãá ShŸ>ÒHÄ-µ–¹ ÝRˆÑêtíI­×³ó拏4åó?vuËF®÷‰»wÂV“<Ò±iÐ,¾T2G=Úÿ^›¸ ªÛ'“”êïîDš†$Ï!ðæÖc¹æ×Oæ´lϦaÍò~ˆ9¸è0=¸ÜÌß b%°;S[WÒc¿=û_;>Ôendstream endobj 299 0 obj << /Filter /FlateDecode /Length 46798 >> stream xœä½M³-Ëm%6¿¿b‡{òh‹G•UYáXêŽP8ÂÑzÏѵù¤¦ÌCQÛr÷ »±dÂÇNR²Ø“Á{ÏÝ»*XX‰D"xmåµá¿ú÷Ï>¿m¯¿ýöß ÿö¥ýìóõ'?|ûã?¿^¥|\û^_?üÍ7ùFyûÇÖ®òíú½½~øüößýò'?Ý>ŽmkçñÝ/ðó~]çØ¿ûký¹ûw¿y|æ¯??ÿ_ŸÿOß=þáo?ÿõãçÏÇÏÿé'?ùiíc£_|÷o¿§Ÿ÷Ò鱿×cþò‡?ûFŸîý(¯þ÷o?üÏ¿¥³û|ŒöãÍ þþñóÏe Gißý¯_ÿ¿Þéÿ]ëñerù??7}Nùî¿ÏU3®?úzÑÏß(ã·o~ÿoegëÝLé¿ùÇCΧyü/?ÿã›W=ÿ?½Qûs8ÿåÍ3ÿñÍ{ŸßýÕ›wéðíõfÀ?¾ð¿}ü\sÑÿê'€X;êÇuœdR?üœ èãÍ{~óæ?¾™ôóýåñó&“>ÚVåççïöó´‚ŸÎ1þ”í¡_2Ô_?¾òˇ5üý£Ï)¼³Á±~á÷±ï`bú]gboçSþ7¢‡ýjqÏ1&óp|´}ôRúy­‡«ÏY0‚‡È~uƒÀç¬ÿïÇ#…*¤ß!Òu+<¥ð³7#{Žø×<Ùº—·¼ýã×k8Qÿ”ö»§üö~Ï;Û}êé§oäø£yþû_ùïªi¼ûÌÏâ\Áâ¿fSîíø×´ä¥Äªˆ¦O;Û‡<èÿ_PýÙ»á;}®v©¥³¯çÇyÕ:óÿ¡®Ê_½¸¸*…|©ÄU‰®À›ÇüW寳ûú*a|ÿ"W幎™oþçÇÏÿ%¾Š±ô ;øÔ ø­WßC2ˆý»ÿåËêÞŽç#ðϯÃóñP}þï˜ïsÌíß«Ï7ÿ£¯çÿ~ŽÝäÙ§¾sëèM7ÐàÐþà^À;ÓùçzÓ­+ïW’_>󤛧WúÃã÷þøùÿ|üü§NçG»[n—CHï_0„‰ä7 ñuÿùRþékÇôÿÅ~Nögo¾û 3^NËùÑZë鯦ðÆzü}–Y}òOyI(g\°ÿ ¯Þüü£öüòï^~ïG¾](þÑKgýÈG.˸ÑÏçû)î ã9. &LGó|øS±Ëìk0s7úf[ ñwyUa5“Åò¿™ú`çýTÂψÄÛÕK+oIåÇwƒÿûÇ3ÿÛÝÜc.åí¶ú¿½yÙsÌa,ìôÎcÿÙ1üWÿxýù¹ý0¿ç]ö~|œ¥L.)2.võÿè‹WÞm¸ßñW˜ªþüï?ÿoŸÿ÷ÇÏß?†à× CVsè?½ ÷¶ùþg²É¿l»S¼Þº`ï6jïCïÔôOŸCpG<¤­%+[½èßfˆ^ÝÿàNýÛßCoÿøµ¬Ûíø—©LKyT{>úç_¤|ø–w‘¬wÎú‡Cýã?/&4­¶ò¢¿?úuhœŠuU·­Ô Ž˜ÊÚÞ>hu}üÿJÿ¿Ó‚_÷2'¨ Ÿ9 ›CÁŒðLôÿÿÇÇ“ç&Kíèñ‚øõE»ðç×ÿü|n R)¾ùÖ[¥^ýðofQÑ`­Ð^»ô³áÑüòKá¬øEò$|nÐ2õ4Ú¿‘‰ÖÒe¢ôou^¬&;ñçóuÎuæ-<_ëõ4¯úÍc.Ïy=_ñs<¶lôXÒÍøØJ¹¾”34üÒÀ¶?â/%z„úôOÿ‚ámë/S˜b¼ªšm«û p’Äé™×wÿ×Oxâ»5Ò`ú܇t„äuì–ä¿_®ë(g ½üß¼0°ÈŸÅ x¦ãºúÕ¿f@Ÿ­Å²Þ_«6èŸh>‡à‡>tÞ_ØN±?}§à€Ún4úE-IDðKòêúÝ_|!“þÓ¾ý‡orÐô›÷gO%=|ª4Ó}ë¯}«˜±>]–ôùÿìG“*Ú>ì£ÿè_qèíú(Õ=ÿ¢/ÿ:ÓØI­ÿᦱƒñÝóŸËåö¯3c|4ò~þ`ÓôÜ«½ŸÆ¿’6Nìõ‡›ÆIöp\ï§ÑþU¦Ñ6¢‚qØ×üåc ýšË?|åúµ½Zí´Ó>_¥’›DO®çø¸êë7?¾þãëWßαµ±¿þ‰ÞCûÓ×ßÑÈþý·óìׯ6NzüñúüV°¼új×NO)¯_~û>üŸÛÇ6^D£ý£ìú)û»ÏoãØ9ÐéñGåOùß}†1ð³Ö‚ýÕŽæÃ¯žÚè{µŒS>å~÷n\aôîéü)zØG§OµZ>öúæS‰¼Ü÷ð)ÑÊxU„=>ùÇ~nø·º›ù™?òËoÿùt´ÄJy]„ðmV@;c?¹C¶7Çë§÷O÷¿•NÞE'@Z÷Hß½ô?¿ýñó×?ùáïC96Hn'‘4ÍìÜñ7Íõ8ËM•Ö¦sˆØŽ ´Òï=ed*Ä` 9Hž¿ö;f9È¿äYîmÔs;{ëd äŸN²‘¾øšë~ðñ׿Ӽ§X ­í ÉÐ8ÉX;Z"èm4R¥@åêÄ·€Êq\ä"¤ŸºHÏäþÑgàÓ‰NZ@@‹ÁG,Fߢ h‚ÂeÒc”“ÆÜ+A¿´ôS£·vñghB4ý>6N@¢9! £vpÜ;å’Àˆdz»ºÂ½½u²8* z ¶ThÛD(£ß0FcÜþÉ7~íί=ùµ¯-­RgÇ‹úÅ/°¯ÌžWq"}ëÑãñGÃã°}”CO(cÙÇÇÉàì9j4\Ì£1ðâŒüÌøùñt~<3ýØL°ïæÆJ®[Â芋ûᢓ/•¨{ÇGëd77l¬qóûÅâŽíä7«I<Þ:`ñÐ~ëÀóúEF„çes£˜o8«>›þ$Qâ •XaP/2(ž‚Y&‘OcùL)¿@ñƒ_pÐädi2bËDG±ÂÐèDxQ÷%2bËDGq i>›þÜF•–’p¥Eïd!Y©e)DÙ`š9G‡@••\Îr«:ŸÖyü0(¨”¤°¬äDínŽ·No[û ‡‡?¦V'™¼Ãf@dÆòy †¬F2iÇ1Ì\“õèÏCAÚKw6c«‘LÜ¥–ã£É¨Î§ø÷`e¾á»û®çT’‰;Nreeä{° ha""«”DàaŽóùy‚&)¦Æ¢å_iåÛYÅÆZ±ZÓxT~–K3®Xõi•€Å3°jÏTg©o §XŸMÒ?°Œ6’}tãú3h=ªt:mËèöœ€²D{²Y(+™ØÅ ¬Ú3•ÆIÞ(MH¢Ài  ´¿Uz¢Ñ8EGåAp$z…Ê„#¬Ê3uƾåˆJnÞ…Ðnå€Z…gÊŒ3œêåq7þsÈ p'l_©$gõi³rYÀzäö~Ôãi Ð.0ù±wL•ž*@>%{`4þÂ`LLÂËðÆÏˆ$·Ag4”k®õPX¢W$G_𸌗ÜQ\‚-ËדåÎvO3¨â¶:Lex‰“\‘¼íh¢ª 0aŽ7‚øÉLu½‹!´3 :-&dz¼i³ ÊC;†›Jú ­pÏ…@i´-L‘x®X…U™ ʼn"d‰±K®] « 2QŒ7‰D -<zòã/DøÀFô8,ð€•@&òSP“[“™“.1‚6^YÜK³¶—ÙUTÓœ[±]“atB Ü%rìm/³«¨¦÷‹2}‡œ²*[ËK¬*h鿢þX•Åó-´e!dÓ‹†¸œáeV¥¸Z•é³Þ@»SY÷åeV¥8çÐ&I@ªè`ë›ÁF^›x×Îô2³*aA‹ÞTM¤1.üô‘ ¤?ƒáeFõäB ]ùb†@è×4º>½wcy‰YE=Ý\÷egGÑU¿`_J€úxgy™UE5ÙUŸùhl¢äÞÇv#Ȭky™UE--}7ìk‰èÀZ^fUQO«EŸ-¢9t¶—VPÓ|>?Y\ø&*¦¿ä°Šì|æ%‘ $ìçõ´r+ÈU( èÓù ÆnÐSiéw¼úPÒC kÛ™ÝF=Í)ôÉC°da»­âå«]cSÏÈÙvf·eÛN «]Âò;޵dE°õ‹ï¬qg†°ò[è³c—á‰[áŒ;3ݨ)çÃ_j¬¬äMT&çáξ3Ûªº µiŽ‹(z;:DBš+PÝg°ïÌx£ª²ó­¢Ëf—] æ°KÞ‚5ðÌxƒª2Çå21µ­8…û æØnTÔíº0™²Éµâº;Âj>UDÎÀ3ãŠZ¹.4R/¡zÃêû <1Þ¨'ëºÈÙÁíºTQ_9æÑÇú3ËJšãß'á ˜ùô¢õ„OÞ/’‹„5ug–{‘E µ¯]ä+­×C\ØÙ&¾©5íÌn# æó_sC[cïHæšy“ÓSvV9Ç2™2¸s½®§ëµóÞ”&¿Ï€‘厌"\Ìn<·8 wwðÙ6wÊ–;2^ˆ@¸ {Æõ®Wãu¤]4ßÎspÜ‘ñBÂÂõ*l)4… ûáÏ@ -D$,\¯‚ÌàÂ}§gàT¹##†¨©ÄùÚåýdõÒô‡úŽ;2^ˆŠZì3OPLæDôõ3PGÆ QOÎùÚŸÎ×ÁÖBßf¼ZîÈx!jiŽ_޶ØÔFç \d=­Ÿ4o”=w$¼€¿‰Àéµ÷:uíhs*43TBŽ=2fˆ8¸;æ ^û¿¼;²SóR6uô‘QCÄÁ*¸Ü¥8A”¨šeŒ"Çh7Þ¶¢qAÇ/8X¿ŽÕpûu/¥5ËZæˆ##…ˆ‚¥_·}0n#ÁkC+Dè ?ZBveºÈ¥¤d¢²Ñ?6ÄþH瓇’£À:Žö ”Ì™p0ÙÅ:jÊh'Â`üÝ/ÑÂyè6ÐqSÆ;Îqäå ж»„‹¡Kš#§Œx"VŽ#> S>‡n49eÜÁp³Ñ®›XúS‚RíÁvHý$ò)‚ç§Œ|.Úr"Ù—c³f˜­ëÓ3å;HsIÊqì”1O„‚sMûÓ5Åþ¥ 4ªfØ)cžˆÇEÏÿvé Ú®®‘£§Œz"2×ôœGÖ;§î^ãÔÇòSàžˆ‚Û3¢pL™*.rt6VðÉáéÏ@OõD¼÷Lá³AŸÇ©ù †›2Þ‰˜LtÕ‡gªúÝRÙ\ {¾Ž›2â ÈÓyÞÞ 7èÛ æXnÊx'b`u˜Lƒ9wù¬ÆÞ-7e¼0àüÒóé—Ò`.zÜIŠd9fÊX' sKõôƒ³ñhüMOb/eœp0ÇÏ7XC"v®_"ù y‚)%„\~ _½YãµL–Lq÷ë¸üX½‰øÄàé5²—k›‡ØÊ¥>‡X:Î$¡Å’^FhcéÁÁô©US³Â?éeŒ1¶ð©åÀ‡¬}Ô‘^FhdYêçô©a¡0}×lGz©E˜·z°2†¬xðŽüÿþ£È1_Æji™_­@Ò ãFbš–û2b‹XpnuU¶`¤Â“bÞ$Ÿß“_Bl ·š¶C®–Ðz(îŽû2^‹PX¸Õ„Ÿ!– §¤ŽùV‹8È‚,¥À:uE'ÒŸºYžÌ—±Z„Áʯ>Y24×S3p÷%¼P`‰ŽÕ0D`/Þ×È(F óe´vŽ`¶³\Æ—k|kB`º«?º¹¼u)¶Ô—ñZDØ"·‘,ÿ<Ë.—R<õe´!¶tÙ›8ËõÔl G}­Ee‡gÓe§QÀN•Æz-÷e¼P¶òØ+á*êm9æËX-‚ìæ¹KHþº¸s4¦s+‚‡ ðÄ—‘š‡ÙÄ\Öû®qXÜ: 2›CnHõ·œ& ˆâúéqö~;@B>š@h<þ&§f„Q–;u]ë‰VŽ! ×5áÇpjF˜d‹„„ÏÉ"ùЀõèϰjƘd‹$w\5, ¿2óÞ ­fœQæ6ý±#8p) h&»á,}Ï«iF˜½ß€RX |ƒî3Ðj™68q=c *¶ÆM—1K|«E¬2p_%£WuVõe´q°Ú`«+ãÕãË|«¬NÌ 7 :âKH-¢`±!`v£ñyÙÉÐ^FinCÀã—…àÂ-hk ±9Ç{‘ÓÜÚú ¹ãkG ç÷;M•…«ä²%0¬—PZÀX¶#˜ÙɃ—&Þ¬HlËò^ÆibvC ÇqûLæÚñ-R]Ñ3QG|©EŒ­ÎDa€,ñe¤A–ít?°á€fpŠ·îi/ã´€²,®¥ÛŽ_cÕ"(1€ëeŒA61Ä/å¾+I *X_3†øuˆ•É*—M‡±{«q¨ÿðØjmBy` ¹àH5cÌ€²÷§}´‚WÌ|Tõ£§f„1–çêi.'Ý“8Î ™YJÍè2"l‘fEÞ7Äþ hK© ]F„-ŽsiÇÅH'ÑòiF–`«} þT,4½(g(5ãˈó856*[¾¿×p×[üPËy ¡E ,¶w+èYEª"xÊËø,b`‘ÂÕO¤1@¹*§¼ŒÎVIt¸eÔª VŽñ26‹0Xn ï"N’Ì&©Œ–ó>‹(p4CH’Ô5xøvœ—ñ™_XÃV ‰³Å'=xRvOÊË(- ìíN7—Ê)zm8/᳈2»0g”šáGúì°úÏÀz£E˜­²_Ÿ$]3™ÔÐ^Fif‹¼ö68HB2Ú§›ei/#µ³ÅY4úâ!E<C|©MñFCN7º²ÄAÜ0Œk¨›rœw §³]ÿ2Y5-ÄÞo2:ßÒdQk©åÔŒ/#ÆVG 8WÃp Q ©f”A–¦0Ö;]›Í+¹ÈðjÆ™c«Ô¹*. œKv’–WÎŒ{Ð(çv²‚«ÔñjÆ™bo7•z^b)I±ŒšÑeå7¹Õ¯[ùw?´O‘d!Çw ™E¬60Z†Ï¼«î(/ã³€ÅÁg?.Ãà'°”—ÑYDÀj@VˆÚ10uÉÆw”—ñY„ÀûMU‡@C6òŽñ26‹0XœnW¸8ô¼AOi-³Œ—š_X»€òšÓèšÕvô ÏjðÄ?ã%„a¶Ú”ŽÌk¦ 9št´—QZÄÙêt7'™wÛg ½ŒÒ"Љa›G³ó"¤¥½„Ó"Ζ[N+¦ÇÙ;ÞËH-"íý :¬Žø8ªDk<ïN‹(›*`•Yt½yˆ+F¯è ÄI¿p(Qdë¦CÚj·q4ŽGBš²Ÿ±ÜšñfDZOѨ+N0TÐÑÍÆµf¼Qf÷æ&mãjSô¸sºY–ZÚŒ[d,v Ežå˜Ù–Y3ÖŒ[¥¢nÍ%µ¡ŽY3ÖŒ Ë6³èy8<šZ4]ËqkÆ›7Ï]hÇ¡›ý£ %VÙ |ñ^Fj÷6 ‡}ÀɨgíJJ­#½ŒÐ"ÒdE –]¨ºöôBée„1àNÏÍFÕ–.è÷Ôû§Žô2F‹XíÈ‚ñQÜÑ84#õIz¡E,NÏq$Å eÓƒÏz©ùåõ±`o‹Í¸«?t è}”–[9øƒU­¹ÀÄžËs' „—‘YDØb'0Ðxƒ››JËw™EˆÙ˜Šœ¯ªzwb@c‘´~GxE­¶<?ºFÊËø,B,ɶœG¬šŠ;‚–È™%½ŒÐÄV¹ºzrt ô/Q3Ãx›ŒÍÑgÅŒè18Mè3^Bg.âq=# "py~Yãet1°Ø”‹ïv¢·€†Žé%„0°:Ee<+$OÈ’^FhÉvàN§Ýy›KohzÝ‘^Fh.ÕÒlhéƒ# G´lI/á´ˆƒ;"1BDâ@“ Ò×Ñæ–É1SÆ: +wfÛ™”‰qÔ”ñNDBrzÇ$‘ù>!²”YnÊx'baå®#66¶}Vë1Ü”O„Â*%϶c^é¶ì˜'àà}>í5`Áǘ+±%§„xÜò÷p¤cev=0u12GL ëD¤g”(\úðØU»Ž™2Ö‰pŽô³g9$S V¬…ç,3%´d+ª“‚µ £Åál&-/eœÕ¿ð¤ë`‚9p2"Úµ´”QN@€u¤Ÿ×¢P0i DzzNìH)£œˆ‚UÈõÞ0úŽzÒ†•2Ɖ(xïJv.iª—Þñµ””ÑM„Àâ«lÏmSWÚ0RÆ6nyÜ|Cù¦/çl„d )c›ˆ‚Ô“Ö¸(RQ£r ÝRÂ7 gôàV=¤ªÙlOÎÈ!êh‘̼££4Lû¬&™Z–42BˆJJ]Q=ÅE:q7°¤‘0BTRzÌ7QÔµb0Ë™£Œ¢’Þ§Œâºm‡ £SÝ9Ç 'ø…cíÎàhhI¥Eÿ,qd¤àpà¶Ûü§ÞS&cæh¹šÍcY#c„ƒ•7:Ä\Hlz6cy#ㄈ‚Õ!i‰ÇKbÑC8K)DØ”NëŽ"âßÄukwmÍsd¬qàÜÑçÍÓ¢5ÖqÜW sd´q°ò›¬³Ð¡w;îȨ!h*=À%ìÜÓ‹@³ÏšÚ–<2bˆŠr¾â³RØvuŇ ?ydÌ属åìˆÀyßNÈÕ¼EË3=YÎô ¨'êhl`bÉÖ¶ƒÝF%­N˜ãäÅ´ýº»ØYÛÎ 7ªiåÐuÞ ±€ä’£µíÌp£–ÞŸ3õ!W‡ŽVf•0kÛ™Ý%­R!"©DŽegVë~íÒm²Çƒeö™ºø0ìÌj# Þz\(¨Ï»‡>ï·8»Nl6*iuBÓ¸'C;¶ë®5` ;3Ú¨¥…ËEø`´ŽY¦ØÚuf³QMIÞ–z\h5ÇmM³§Y'6µt»\†kõ>%»Äƒ–ãgÕ™ÑF--Ž7vDi,;*rjüÏvf´QM+§KïXAMÌŸ†mTÓ*·ªŸr-]k#9ËN¬6ªÉúD¶j'.'AÂõœGÖò2«ŠšZy-ÇÁ©Mó=œéevÄh{L@üH2#¶»>•1½Ì¬¢­ÓbÓϪ„5€]ÈÎÚ^fWŽ!×>ËÑx©‚–¥Â³½Ì°¢¢VN‹´›kÈ#¼¯;~_fXQOY¨}ú,"!Z¥µ8«³½Ì®¢ž2ŸE7P(Æy°f×)g{™aE=­ÒýËÉ\‰K ZÙ_fYQQ+¯eHNÁ± MÅtÖ—YVÐÔÊ«h| ªánµ6K1Æ—VãÊ©h ˆ«ŠXšµ½Ì®¢‹>} fºC‘×LzXF†ú(Ä÷‹> ^Ü×ó­]d "L¼÷…—* ª#œZ·ÓFú(ÄÅšKÕ€Öš³v‘aÞó×rÍ?¹ÿhC›ãnaù0‹ òQK‹E¿óâ…C g ⃖+òv ¦É–ájgä£Ý’lò Ìç1Ú€ÂØE†ù(ÆÅšŒÊ¢Ï¡ëÍ&gè£WkòÎ;_zCÑm¸3÷Qïî;Š;ìh~wˆ°¦‘Á>ÊцeÉTKàÙ§hA’3t3XF9®–Lœ2ÁWD¿k½d°›3Šqµ¤|pASØ´]¬oLOë\ÒÂ%ïAh«F Þ ˜Qé’Ö5lºK¿÷›ñx3`FA®Ö´r°ó¹÷»»•o†Ì(ÉÅ!lnn;nøŠmá›A3JÒfLÚT•/÷Ò¶YßÑÂ7ƒf”¤]×¶y(¡A¡4äÃÚ&ÂÀ7Ãf”d²0h²^;ù0¡á®šzG\pâ4³…A»OUÔÁ a¥Þ10àÊ€§i×ST™qêlíÀ•Ç›é*#­ÈØ·þ¡Õñ °2ÐD)fëÂ9£^§ÈWî|`e ‰R\­ MâHAÞµ‡€Vš(EwŒó¼#Ѻ”ÛÛ·ÝtÈÊPç¹àíBðf)ÑþKhÛ+Mœf’”3Iuä7·äO½g:s\QêεHH‹Y½g:“\Pê†xÖŽ7ôyšlõžéÔ[Ïšð W]j(š*¶ìôžé4Î3%<½Ö¶sc,zé;N«÷L§qš ¾õw±ú1ãNï™Vã,W|WäÊi—ӈϠùL«a–+º&É 5Øw ’µd"ƒXÑE¹ØÍÅ$qÀ©%“¹‡ßš.jç´Þ/-‘âô’Éñ*(ð‚v>޹Êë‡Ïoßýòó'?üÝ·?ýFqÔvqKYšÇ@I°„„—tÚ¤MÈ/¼™˜xí¦¢Gÿýïïh,ÿþ[E©H~)Ÿä5œ«qåÇ]‘û}ø>Õ¥)òƒ9Šò}øÝç·ŠŒ=4VQâSþwŸ~ü(DB+î ijÌ3ºW=4å÷nXaðîé<,\N‡Wu#(ý”—–ÿÚ„FÝÈ«QlðÏ ˆ6€¬ÇÏ¿78hí!wÿl‚ÄÆ.ûL26rœ~zÿtÿjx"±¹!ˆsí —þç·?~þúQ 7 kÈ¯å¦Æ Mîx1¼v©æBâ¥pêÞÞô4;~ªUlwØ#ÖJNßÿ®yZÔyž;’M0»³7‰—Ý?È?UÔpâ¸<ÊÎ<Ë_üõoçDïIV\rAŒË_a§Oor=¢qýÖ0Ñgââ ‚=³ø©º_\Äc(0àBqa6­…C8çhA¯µ~4…>îøïÒ8–ñ>Tq)mpWÐSî®~ÿÏ0ñ{éàà:v§D¼ï”+—{;­’¹ÝÙEËS¤Yñz´¦¶ÞÓo¶GÛ¶a‰À¯w-(èŸ}µ¢ÛÊΟ9‡d %‰ÐEþ—½jØÐZÒQ2o9dcõ/ä‡UTBF¯¯Nn܇ٱfã¨Hþmú¯Ì>62z˜¶!ôcÍÆ_¨ã¸8Y+›4¹Al—«±f³öoÓ9î\¤cûÏáP?ëlFwZ»>ìëJ+–ÜDaz;élBñ}ú¬Îqúõ&¡/3élBñm:E¢°Š'5ݵúIgª×&Ö…®ûù5,tóÀ8š®@­ DR“Is¬Lfè:¬±ë°NIópâËDG>ÁÅ£;ÖG±G+½L8áuêɆ|°ÿuJࢢÌ/÷>Çe†‹Eh…š Œ6p7šÃ&ÅÔ;ŒDÓP#…'ÖºP§—tbœ£Ê•„ÅÄÓ4îë%‰1ÎG‹Â\ "k³«"éS´ôF®»¤áXoÂrFg‰>â¸å9çà½S/C÷ÿ^=™èÉÙhX‰è3ç#Ÿ¶!fòX7ñ»¼&2A‡±¯ CâáNÏXÆÙes Ê„g´‚­¨S5Þâ´–i$ÎRutðQ=kȵ9£µL'q:·0XeÁû¤zîÚ]ÇÌDN—™ž*êÇq7?Z¯Ÿ÷=*§¯6Ž 5ÉhšÒÃz¯BO»ôì›öJÌ ìäµ6ó‘´!ý ðI á¨–<ò^¤Œøg€I(,…ðÁ­›:6~§xò™ºãÈWî|ÌÝQ>¥ †-N2Ä)½+|s<¹£®:ß‘òXÉpPQ†ƒ»ç‘`ž÷\Rd 4>„‡o²p¬$8ˆ‚\L-Mx=Æ‘‚,B¬ D.ì‘5ôx;49Â(G”àÖ­JY:]n 6„h;ì[‘N´$/AdãÓÄN¿Ÿ®‹…h?'-¥£Â»„Ž‚Ú›Ð‘…b³(5ºM>ˆ$ö‹·u¢êà®kk˜ýˆmˆR±79–ö Ëe³2D¸ìØáì]š{Ôe¸Š2[bÖÙÈCh"$ ¾ XQê=HC-RfòzœeŠB›Îµ4uŽ|•…Y€P”ÍÂÂÈ_h<íª[P½ VQ4+ #18†žÒ¶‚†oå,sÚÑ༰ǸçZ¥¹­’vÚ:ŽM¸ó°‰L)Œw.¾ßqk‘ûSx`g ÚXQeÓ7ô!«´vÚ¨5ër">Ò·®}b=†3|F™Íí Wîïèå5·7Ã>£|V&LŸ½€wÔ„é`g¸âYYðÁ‡À$.7.=¸3àF™©wÎOëÈ8j²°8Î`e¦ÀE‚#dŽÆ/ÌæÊNëhœµÛ±Ý}^I‘‹.«ûÃOñXÎpäÿž%®M¯èŽÐ…%,’3”Fñ¯Xââ,ÖŽØ=çàµZø>Í`“³ÍÈN!*ì‹óéûÖ4ï×JfA!3ÜRe–­M0kí$³(ûqÙ8Ô€ÓGÙ8“Èð­Æk˜ä.µ_=ú3dGAÌÕŠ³3YsCÚ¢?Cv”„Š¿p“#™¶`ðèÏ ]ù^:™ÒgŸ­I‘õŠj’CÙ‡$;xø'ÐŽ¢^ ù@ÓŠ”JóøÏ° ÂżxWMy¨gHŽ PáEÞÚ46æÑž 9ÊvvÈ5ñÚ-Ø3 GI/8£r†#·Š×à›Á†í(èeÔ¢DÙRö:¹+<‰ýšg ‰8éOY¤ÁyÉM|ä§…eÖ…?×RÎù§ahe oa™õDñËÀp©íÒH›½…eÖS!d¼!Zñ´§Øw­¢'â uMö–™OÔæÊ v.ÒÔ"ØïðÇÃÄ2ó ˜ sã`0ÃK‘·°Ìz¢ÔžnиʇˆÖÚWfY¼4¶ãì/³­¨GEÏV86Í%.Å ~Ú_f[Q3¤¾qX'ž›D¯­ýeÆU¦Ò:8¤ÛqD%g¼Î3ëŠ2ëý{#É‘˜µÀ̺¢T¿6³Á»Ò9 ̬ËKuƦ.иº¤ÑzûKl+ U­­r±=Ö¡Ûk™mU\S¯,Óç-YÚ6ðuZzÖ®»6gj‰EýÈa Boz·À[Uf1Q?sÁ•¼h`MOUe&µ£²?å„ NñYe&Õ£²J¯´oâ_[³ÊŒ&ègá¶Eõ¡§ ÆÐ2#Š [ÑÜqIt£j†i«WškZdé ñ5ÎM·¸k×u}è&ÈXrf¥^‹Ó«Øä•õ’[;Îl4hqšê”4$oÆÑD£§SÁ¹c4¬]]\gÆ™Fɸ€‚Û¨ZÆuâ½gFZ÷s,•íáVÐþgç.†×.iÿÞŽ3#ê™.J¿¨¶‰ kÈ™‘FÍ-’ä¡°Ã&N5äÌL£†¦‹RÄ1ªUúySÎì4êH-)ù,³*ÉbÞ–;*RÖlœEÏÒ¤Dc·™MF)g’¿ àèδ&š™_TÐÜE]œÓ{‘”†ø‡ÆD£ùEíL¿ƒ'ØÑýb7ßšhb~Q9s %w°¯sæp9Í 0*gÁ™' Ñ Y¦½áfFé4¶Ø>áÎÉ~>ïM93ÓŠ[*<O\Ë7(HªÌqÈ?d Ö®ÉB;4¨¦‘/ ˆ `!³ö†é1í"«ÒoÉBfì_;:´ŽCÍ%“%„ÌØ#¦ÏÄ×A;À({MG™±GÝ+ ÑØ­wÏ*,ç !³ö¨iµÿ­s \Fžì-#dT4½¦!» \%‡å„ÌÞ£Žæ‘·k\3Žb9!3ù¨£é7u‰:l÷¡„¥…Ìæ£Žæ±JÓÔ¡UEæ5æž™rTôÜ>J]Jä¼p0Þ›{bËQÏjÝmHàð—ƒkï™-G=«q ãjrc›{fÊQÍo‰¼mXðüª äŽ2뎚_Q9n—áñNkš©UŠ–J¹ý‰†™RÖ9ýÛL{²Ì’°FÃtã6ÙÕnÚÝÙ3KÆ sç )ҭdzJÆ Ê!(=‹ço›dyVÉ#ê]ñÇr 9JÉè"êX „‡dLxFÉ#êæË…c§ýš"Ž 2KÊ™ÛÞ¯"÷÷STË™©G)$6.0E#;d³êé 3õ¨ >îA¶G“˜£ƒÌÔ£ŠTüC.z^rãÓ›~fÖQEÊà7_ÏzZyfÁžó¿¼³óƒÕ¨ìfŒ<pT²št—†zjõÉ l<³à¨äé›qöŽìªÉÆÊ3 ŽJžãÎwîýÔ ÐÃÊ3  ¶§|>äVfÛª6ÍFÊôë3~fÔAé+æ&h¡T2ˆÅø\Ù¹E²öΨ:œ]Üj©ã*7kI©ü ƒyDÀ7ži8ÚÚ1JÆ·ˆ!šìè$£Šˆ‚¹ùnˆA6n©ç“†N2ª°(˜ïïƒÉd†„c,“d,5>÷Ý×]Ì· oX&Éh©WY£ó=ˆ†@¿z}–G2’Š™ÞZåýàvÞç2Æü3ª™™@Uh·šÄ_³$xTÍtØš¤ÈœzXçI 3𨟹õ.\}I²»ì¼ $6µ3_¸"­t…i»&Ѹƒn»“ $6u¶²úÎË%—”0ÇÞÌýbðå® ‰8®åF‘£‚`æó¬¢r±é«w³c‚ÌÌ#TÕdó§ËÍú'df±0·Ý› ¾W ü8*ðfð>u¬á“»¶M¯YZ~Èl?a¥åK Ä]½HÏ TÍg×,ÚáÎ× wÖò®IW á{$̃‘*7Pi£Õ…á-ý$ÔÁðå!rt &¢hK?·80¨¢O®IÚpoJ.Ù8òɈ%‚aº‡]²Ñd^¼CÃ=¯Õ+Ñ âëГiK=¯D-¯˜FûŸØ¹H œåžŒY¢ÊG#ÄTš›x‰ãH#ᄨÆy0²qñ†«Õ™jy#ㄨÉén’õŒ*ŸâÄ[ÞÈh!ªrî๓LCê𗣎Œ‚.çéHýjäå饂 D¥©p/ÄvÕkFa,'$&ï‡/'ó8õœã„ÌÞ£¢ç _•¤AÉÑBfíQÍÓÃ;`œ]:Îéä=!X{Ôñ½/çZT—¸Ÿ2k:žŽü%ýÈ‹æ[H¶´œ@1ÿ¡·\Ÿ4‘P@Tü‚ìõˆ«q#s9†±Ü‘C„ƒ¶ã †»©£Ú;ç.s :øËÖ‰ípËÚ²i„c¡Œa"NVDZ¤~xÒµÊm}ÃBÅDìÌÈ÷›$Á9,ó4”QL„ÏôB7Ébr-Á³PÆ0(3nÀí$¯2#ÒŽƒ~‰Ð5ù”†+8ù×ÃAÁD)MÐÛ7N‚ÇOâÈX!èfnø/±ù¢Œ qd¤3ýÁ?‚†Ô”Qqd¼53wû –ÒøbîöŸÜ‘ñBÔÍ{ÛhÈÅÙ¸~‘Nuž;2f[FkÙ¯j°¨ã”M¿!ŒüZòåÊAÑF†Êµ=y$Äà ±â ôÄ8¤+å&7KÌ‘±‚CÉ25­sÊÌÖOÝ:ÚÈ8!Bg†Xr ·Æ–62JˆÈYmÆ%•tÏ}Þ„5\’ðDÄÍjý¨R·ýÚ†¦Þ[‚ÉØ#âF—Ôäå”b­ Ü:Z:½8gŸ˜Ùzâa3¤¸¦UB@Ÿ­2*r(Q¤nìVpΫä/;®J¨(Bb†&U÷¼”ïè*c£ˆ å'R›¾I4Ò2VÆFAý3ê”ð.ªØ -aedT½b'œn>‹9ºJ¨(jlµ]88ÐÄy¶réÒ1L ¨Æ¡ ˆÀÍO-Èè)&0HÔìŠSÊ.ù§CÓ;Édµ­”R¹ÓoC‘dêY’É$j{!CZ+*TG'YDÍ΄«ãÙç¥==wdÄà›*êT·^×pÜ‘CDÄ<|êÚ8ô”p€'@ Qù3ŠÙåMWHO3D]ÏØBåÚ•ç¥É={dÌt½XÆ*çë«å g”„-"VkCç¤Ò†ÛAÜMÁÓLB!ªðS2Þ¸ vßNÉeìRó1[,&Vû ùôìIXE˜¬ø©)4ôþ'¬Œ"zV %N#¡¸hž¥ã¬Œ’"¤S@ öªžÒ:ÚÊ()Bj>dlçÙÕAs´•qR„²šÈHš2¼•qRЯ.ö×.·šê¼…a™&c‘¨Ê¯C)T«äjˆ¯Ï@4D¥Í¥\c«EƒNŽj2 êùŠYà¸õ”“§ÏÀ4 ‹Dí̃)Î7 É£¼ýë3JÆA;3#ŒסÚdäàW•›.;Íi=¥¡%Œ‚®W|Ñ¥úòÝ Ó1HFËø'šw”|Û„0 ƒdìA±â‹²Ißø}hÎ…cŒ"TVë î)@"½ÏõÅ2HF@«ËCyÓShK+eDT©@ÈÞ¸kMQÄ8ZI8#è\Iäà2­œ}*yêŽV2Îú'\Òt`ìZ´ÖÑJFQ“3î©o˜7{­$”U6ÃÒ#çD¶ÃŒfæ030'敽‘/ÃmÉŽCý1k™uÑ«X_4æ†zÍ×ZB†ô(ú™µQ¤­ÊõœÑë‡5dH¢QjlÒý¬¥Þ¨~†ê õ N9*ãz9²Œgö¤sƒºI*: H´ÔÁ<Ãp”êŒ.£dÍW[Oó ÂQ¨ ²¨u—.‚`E& ‡ý ÙQÒ+¬“B‡¼@$k±pD¿be\/Bg¹ó®1bŸÀ:jC.ÎèY‡œ³{èg°ŽêPµm§ £Ï;!ú¬£d蛜sÿ<)té ŸÀ: BÁ |ö qpÍ %ñµäþŠíuÀ¢5Cb”ƒÎñâ‹ô¨6ÏÆ-03ÐE9¬`X¹Þ×,0ÜyVX# Æ1/ô¾Ñ^,OlfÀ‹²W(–]ÕûÔÁ‚3^¾úÇC¸~'…î63ÜyѨŽ@ ÚxR“Œ,23Ø1ÌeeãÅ ýEß™ê¢fhmË]Ø 3ƒ]ƒNðRÒÁ¼üg ™Á. bYîÒß´ÔyãÒÂ$Ã@”„Îò¬|дo—^Ëq8I0¡  '~Ô˜w J"¼ùÜ3< g¢çªÌС$A@ üð =«Ì²Ü%¢f´†ë-p+Gí>aQ’A ÊAAú%è¶wÍ:‡&¢$æ”\qîJR “ QÓ£œÔ¥ëÕg€I‚(‰yBÃm~¹9å,üc´›©.~Æ çQtN— ©Uo¦º8xUæ.'”}hÆ«7SCù­Ëë®Ò³IÑpÊÍ1ä¦rRfé0£ÜLqQ3k°êÀæ…,§ÜLsQ&¼Žšýî‘ôPn¦¸8ø¹ÌŸ2ŒcÖprÊÍ?s ¸q÷Þœ7ž É„?·|;ßEѾ_ŸA!™°ãàçB¹3ÁuO“ó«LØ™_QT&àÖgÂüS™¤ãÈUöM»£v­÷뵑I:Ž|8_hèV£•½­62Q‡ÁÏÉ&̓[Õ3§LÒqðÓ÷¾¸qàÝÔÆ0“N|ÛW°NÖ6´í‡‘`&¯û/gùd§µw-ok$˜HÇ\…µwv${)³r¹_&š8òé6öüúV?$èéÄ—I'¾púa¼ôµvÕÛ3“3Šo›ôÅw¿9qJ믚IgòêúБ鳯5ïÚIgŠ/ür+iÝŽkßÙIgsŠ/œöx¢ÊrkH?–°cÍÆádóµDn¸Þú1;Òlñuv+v7euOϾé'£Ï =ƒ“‡Ãsâ‚¢_}~ýï>ÓN´ISÛäY˜Æ°i×`ô­ÐW×à¿øî7¿þ«ßü䧸F¹ã»ßþä/ø³¯&•s ú4îèä î¹ûâöãâ˾Ï.Âþwô)Dþh×ëGŸÂRŠ©.ÂþwŸa ø-ÛâŠÝ™û{í\Gü©<ÿ»7ã £÷OçOÍ>°7¨ÒOEy¹ïM¸Ê„ ÿ¬Ù;¹éÏŸÿ}„áÂtÜíú—õîcãþª_}„÷­Êúè#L~jU\c8ñS}ÿ!úwÝãÿŽ6½ã¦Ä£‹0‘«4@~tîl5åÑE8~ªWéól#ܱ+G=8œ¸óá/JH y¦×}~„XŒ»§ ½×?Â5FvmA±7”~?Ÿñ%’þ”’éoõʇæÜOí¹iËZ\ÑÃX`HÛx´Öí}꾃0@‡èÓqò-âÊí ú!îg·sÄÈ¿2{Q_ñéøyPmšípx«ºKÃ?ø÷¬¦Û¬ôÆS“)ù!ÌðYçž÷ûÐ O@•ÞPOu妔 ·ãüîÀÎg+yð9Œ6äéW(ëè·Íqb?Ÿl´qS>Lå`½D:ÜŽÛ«ª_ZNFÃoôþs"/?„9~ŽÏ›BOärZ#Y‹æ#zEitr!KŸÊÒ_³œÔAàüpíÇââ2\^d™8âæZašä?‡¼aÐ^…éQßGfà„–I$Žb¾O2h«?µÄLÐ!|¨+륖ɤ£À¾æ<ŸF†Á¬d¨‚§pðG¹V•Ì¢Ær(¥‚™«ÝÍr¾@ZøDfW˜v©çRw™x½d2³Ô74–N/•éIeDN3äY÷SbO^/™Ìã(î9p ƒmÖ3À88?^¼psÜë%‘yßáÞÕnOá}çs*ü1”…ÈAFÙ<¤lUñ?ŒN2yÇNùp¯‹.KºªIQ,Ë^•æœN2yÇÎ70S‹5Àêx ''­Òøš:4(,X‹üf*Jpe§9Í⒞ǮDqp®í§6iáæUž©3NÒt° 90ì(ÂÏCë3¦ §ò OvÙH.¼²åâ ûDZž…&ŠŒÿÚäÎë¥wŠ/¹Ô­f` #C=í–‹ïÙLÃÝ 1×íº‰4.¶ˆ‚’²*[ÛÈpõ4-a“­—²ßTË÷ìänE2gæGâ ªœ±mô'¶fm#Ã}ä[÷}|#“‹²ëÓZFû(Æ;Ò¾"!M·˜§t;CuÝbËÈP¥8'°óŸÇÉA‚Èøî…ë,#C}¢Óÿ¹ïº¢un€ƒÆ¤]V4c ê£ïå€4ŠnÅYÃôeà×ùøØ[F†úÞ·.­‡ún/}°ÇÒxÑls“yqQ9.#tªwj,#C}ÔÓ½"L×½@šnÂõ6¬´zþ –‘¡>èir;F5êÓó˜Eš5‡½£_Bãn›îé3zrŠšZ.s þå·à´k›9>äô–—™UÔÔÔó³ä¢ât0‘‘o%«5¼Ì¨¢–îñóÈ9”³«ctàt‚YfHÓboy™UE-Ý|Ív²?£·×ÜЧêɈ±¼Ä¬¢‹>¢,ÌK›8;ÓËì*Êñ:Ž× m¢€†Ü×WûRoy™Uõ†3jÚ?+–%xrˇÔZYÁ›]fRQI‹Åfß7íŽÙ¦¬Ù%&u䘔ý ±1Ä¡¹:é´gu™EÝDÊ«ÌÆúíB´™úàþ:›nòÍeöut;,¢8Åt‹ê{|ë¶Í¨û—ÍeöUdEÚ¶FÃ8M©u!³&—™SÔ²lgÑ­ÓÐ*Ì]¯ÑtÍgáZSJr í9%Í7È®æšqkÙyp?u¾)4êŒ:³Ø¨&·½”>¾]CQ—öÿ=¤à¾·êÌd­šn‡n|9tCÔŽMF²]r\él:ØkG6—ܭúìMNS ¦ð9ú&¦2‹±y›Îì5¢`eÁ4c®†ZO²¯±6lÔÑ{Ö̆».²7êÄ`£‚æãÙx÷y²ÂøÁÝ\ArIÉ™tf®AC+è!À³ßY‹Î,6*ÉËõça Çw¯O e:³ÎL6*éŽá rºØuo|î²B!ÙQHÔZuf±QKï1Â_âÀ½°S6MƦ3{ jZ§ß®--ÇŒX“öæu´XZã©?È™tf²äü\FW°ñ;báGé"”š¶f™lDÁmb×ëëèR4pmE:®Ò|¹ÃcÇÕ¡ÌSÚ>eÄía`t`QJ¤-µm/-ßî‰##…F;”ŽÄÕâ#ynª›{K/D$8‡}è‚Ú‡Ô‚œ·ñy$̱pçp‹ýÝV§»%žÊ¥ W[òȈ!Báý þÞ·»ûÖÖg ôÁ/D=Y¦hד)*W¸äϲ§1Ü‘ñBT“;[|ºCÈ-äBw»VÆtä‘CPÒ½<Î$tg?6naA£=uKc©#£†¨¥l-ÓÕ²^_~C³'î¸æé#£†^O¥­<úÏðœtŸ>.Š"!Ù;úȨ!aAxçØ%63‰{úȨ!aºÿÚS"‰EtL—ÅqGÆ YnîÉö.fÀ÷|>sd¬°réºÖ‚;ºìöÌ‘ñBÂâpm¸# <ÈÎØpGÆ oæÐ¦ 1¾ÔqeH:ß6éñ’.‹à^Švê÷é¨!§Œx"¬Oq>vöˆtóuÛÙ[ÏsSF< îäL¸®èÖ»Ê_Ôì·Å’SB=÷rsø`õqnÒ»µíJu–2æ 0¸©hÍt™›Š-÷7Šrµ#§Œxz­poIó‚kGóB. ZõŽŠg¦Œu" §¯(Ñz±tùž×g`¦„u" l˜÷”´±K7÷CJ,ïì[}nJx'‚`Jˆ‘Ó¦{û:´ï$"ÃLë ¸ñë+ §áb˜Ü@ s´”QN„Àb_ŒJüícSp´”qNDËF»^_‡ç5tÄ_‡ðÄ”‘NÁêØòÔ>8}×|GLéD¸å˜ÿÔÃi4p¦K#¦Œt\Œô|ÄHW¬i›­;RÊ'â`µÐìr% iè¢bËJ åD,:jÛEÇLMw´”PN¯´0t-ÝsðÆ]’´®‡'½ŒÒÆYÕußD›÷ZïX/£´²·YXy•í—n7.ÂÆ¸’|™/c6ÐÜ¿ØqÅš[©8ZÍ(3Âì6¹Ì‹Û.;­é·mR|ÁÓjÆ™fwJi¼‚ØüËùXŠÍè3"aá¼  $Î| Npp˜±[„Â"XŠRĬg,²C° ˜Ñ[ÄÂí…2gãÎ4ÛC‹*9ÌØ-ba‘GÔn‰t³8LØ-"áÎ@xù»ñ(]ƸFsΤÕfäq°ÊCw³Kf/Ù†Ž3róKíz‹p²×pŽ*õŽÿeÜpfÓ’ÍÄÉ:Ú¾Â\år¿¥¿„Ú"ÌÞï’Ïó”®H¥Ï]²¥¿ŒÛ"̲S•™‹ŠLúY©9åø/㶈3Ê1e:p4?šcú¿Ž3r‹P›±¹#ö¬±´ÎÅO”hK3ô—Q[Úí¸ô×× ø)(:9ù…fŠÕPYÂ×)™Ué2j‘–ñ*™"„2šh",djé5£Îˆ´…–/h™¿=šŽ^3îŒX[máª\5²ïè5£Îµ÷‹&w`< Ü ý ôšQgDZF¦mÞ—+b Û¥–`é5ãε÷5Üg…´ Ž%ØŒ<#Þ;Ø;’i™Nû5—LË ¹E ,踯º,MóVfì‘à ¼ÕÔ½,w„<ÔzÏÃR`Fo ÎÖ8ú¥ù(_¨– ‹²cÀŒÝ)c­_TRBŸ¹·þ˸-"!a»6ó}N5}vÌ=‚eÀŒÝüR»052SN©m¨”½K\Í`Bniwj)çšHj©:û%Lƒæ³¤aÀŒÝ"Ôç+í†-fì¡6ç zŽ××….Ö¥HΓ…aÀŒÝ"ÔVñÙX©~Æîfì±¶Øç #¨ ºnZÌè-bm±n¢ÝÐ¥{m.ÖAªœŸC®œ®¤l‹Ô®£Kjä@r§tY–Í4¢m±Û¤µjÈte b6£Ïˆ´iËZiÏr¦%I[Äh羡،>Ò»(õ?v™ª…cØŒ=#Ô2>Õ,â6ø =o—þŽaöŒ@»ÃR¯éÏR#Ç5ÄÎÐ8FŽb ÁfäAàÈ®=È7À[m“$hO·EdÙã>nÇPúLtì—1[D J=ï#´J"’¼+G~±EÌÝF¹{Öõ4Û¡-ô½W [ò˘- ÀåêÝè€á¢$÷>™/cµ€›æŠÒÏÍÕKÚ³JãO|©ùEvú%Â’ÔÂ{ å‰/#µ³Õa/Z7C$åвJŽø2R‹@[œÆ¢=VyÒÄ“ø2R‹([,øh1ƒtô|ÒP‹%¾„Ô"ÈÜÈ󯇭7<š³Ä—‘ZÚ*ÒÒ¹~$}¹h’»ã½ŒÕ"Ò¦Œ’ÊYz»»jõdG}¯E,„„öÓ<`[ü:K~±9 8Ç÷õ8-%§–)K ôé™/cµƒ›G“ë*d08íFS'¹èï¨/£µˆƒ›èbõçFj0!2IiÆá¨/¡µˆ›•c.â<ýàž´mn ù%ÌQ°pÜiö{ ›Ð„§¦Œv"låÂ&³Þ§dççÜ#;jÊh'a±ÿ«p'óc¦8jʘ'a¡dt‘B‡Â±SF=Ù‚¬~;·Š`K0Ç‘SB<+·mœ¯fŽjÊhÇ/‚£)·‹Üáõ30SÆ:‹£R0 NêViêa¦À:n){^:C/9øû¨l«ç7–š2Þ‰ ˜©Ezw‘«Xk`ü„G.ò¨µ£¦Œv" \N‚Æ–%Å¡bƇitÌ”ÑNÄÍt¯ss çá¿ôñx)cˆ‚÷+ ;Ì êÚ/YŽ=5e´Q`="½6«w>;Æ9ËW[jJh'â`µq¢½õÅ:¨š1à¨)£GDÏÙhÔƒ3D“”ßQSF; 6Eíyq Í0]ÔÀ–¸»¥¦„w"Üñ–I¶Þ¸¹Þ±o³—„¥ŽŒ¢šI”ȯ¬ÁªwœudÌõ”fé­ôTæéV½{fÉ##†¨¦EÎB|Ü@ ÃÓRúOòȈ!êi‘&ˆf_ˆp{l½¼hØ#c·ˆ¬¶—މi(}F|ŸÔ‘ÑBDÁj)¸.±—VÅ!òÔ‘ÑBDÁ"a]b £t&ì;êÈx! ;[ѸSðO9f¤ÎrGÆ ‹Õà”ÖÅm!µä­eŽŒ" \NÈëëÆv‰k‡Ä>=sd´à``HMå&´D³KÀ¢êé“72Nˆ:ZœÛ\E²†tú ¼‘qBÔQÆCš•ÃM§`7q$ò䌢’²lŠY¨_5øUzDjy##… ¥{ã«Åˆ`AæhÎ"qRc×™Ù=­˜šÇø«ºµô–YmÔSš±¯Y9—ô˜Hµ±µìÌjƒža´*2z³ ±bk׉ÍF-ÝD›;µÎ¢çVzRýÜvf´žÞ’ÍôóÃÓÐ?·ÍLJ]£ pÉÏ*hÂÎc¥]ÕÖ®3£*šN5WÒ̧²9 \¡™Æ®3›:Zd±6\ñ¾Û~³Îl6êh $g$ƒ£1Ë¦éÆ®›J²;³gÝ£‹ ¿7ü-uœU'&µ´"R4þå¹íîäÌ:3Ù¨¦Eº Ú'bWt q®œ™«N,6j)sx5ý’Öä_,ç¬:3Ù¨¤÷+%ä 4ì„ ­—i­.1ª¨¥ûT‘·Ýzª8[y°æIÇç,Ïo /3ª(Å{çW_¾ÅI?wë¬3Lg /3ª(ÆSÐ(>x,CÓ?­Ýe6å¹q‰Åiò ÐVfÓ¬4cw™QE=Y%”§ÉÁ@i[Me±–—™UÔ“¥:©}¤T‡´Tl)Ž2û9:ÓËÌ*è)]k´&*é F„rŒ—VxZ^fVAOÉd6ÎÀƒã¦÷#­éefõ´HF‡hÐèkÊtXŒíe†uï^§‚¿–t†€w⸮½BŒñe†äèžž9gáð$=n›©,Öö2Ê‚t™u]Ñ$EÒyw?ªÞPrÆ‘? r éµùFjÚëwßg³ gî£36šY]¨6 ]‡-:ÛHpÅx[‚oƇNÍ£Ëp¥r¯³ŒöŽÀg6õ+ž¯[3â$>%Dqí‡h-#C}TÒC6—OaÀá‘’Ö.2ÌG%Ý.E,þÒA<Ë^õàÏÙE‚ù(ÄÅÞh´ <áŒ"|”a–99{²ÎÔBžvÓ’Æ&2¼G!¾Ïá&ˆ7¾09½·6‘á=Š0=žV–è][wÍ#r6‘>Š1%ë™AÁ‡m¯cv•µ°Í å¸Ê¤ß¹–HÛ àf Œ’\$öMr`vÔù׬=Ü •Þü§ÏbõÎR®2àSk÷~7e”âb-8pöŒÑ¢£²En†Ê(Å·L­Uì e QXàf Œ"tflÂápGŠ(@n ;àf t2\Å'ÐpE,Tξ h3@FÞ±ãÏŽå„Ä,½#iA›2qaÇ£r¥ žÁ~ͼÏ/De€‰³Lª¹·ƒ#4ƒª"²˜Êð'iÏv]ôƒO3:Î ï4Ÿª2ÈxË\N\äQ!\F-¬d‚]ѳâçAJÂBHÕÓ‹ª 1Qˆï3Ѻt”n}ÌÅØ*Láâàò8¹×-¿`¦ºPeˆ “|Ÿä³#©üÄóg1K‹© /qŽ+@Þý ÈÁ¨Óx¢Ð8ÇE˜K"8¬³TSz¦Ñ0Ëdë׿º,¢fI—*SŸAé™F½áx¢3}yÓ쬖ϠõD£q’ KQ”Žôm;f”ži4NrÒ“sˆ¨Ï¾ÁNë™Jã$Ý™ÜL‡’ýwáÜuZ¾'U[µ'*Ó\% ãö2¼Ëþñ3h%yÄûÄg.wÊBBA=mõÔK&s¾°ñxFÁG~A™5^2™Çi¾MbAÎ1²ï;J*ˆßkµ’‰¿í™,ãŇBÜ”>U6NÔémœ3g1>ë?|û‡o´q+¯zñ )ÿÜO¹¹ÓÑåòñ3cÿ¯_}Û^Kß-Û ÿÕ¿~öùú“¾ýñŸÓèaú‡¿ùVä/† ZÀ0ÚËë‡Ïoßýæ¯~õó¿ÿüwÿ›ÿñ·?ùáï¾ýé4"Œ ÇʃX°Ti]jE0¦Ô“ïüþæÇÆp’ÙHÒÿD/ù3úßßѨþý7> ãUN¸í˜yÜIûu+Zoéûð;|jpP¯"ŒwÓ߇ß}~9,ôÔŠù\"kÿ»Ï0~Î7I×ÕT9ÿ¬\ûÆ9[ÌÍ߇߽W½{:ª\ì°ÒÔsÏ>•ÈË}o"e‹\ g{àG°\·c3?óG~œ”òÂJÑ(7]‚Ph²z¼~zÿtÿî UrÊÐ9°6AÑKÿóÛ?}£(ÇÉí„¿Yв‰ÃÇqPš*¢ÑUŒ¢€áH¨e?/1°ð¡‚z²dqe†¾¾ÿ]“´›áIîHŽÄÔN¤ßpCøùƒüÓ‰Úl;aþ•ÈSüÅ_ÿvÎòža)k”Fë9ï,q²/ô2ÙH~ÿ eBJIé‡På¬šËØú$lâ;@qWt¨éF¿©¨QÒxÄqí¯ZO©I?À5Ú–×JxVÄýþž.‚ïT{ðU´Š-¯,$˜ yýr˜'šRiü²Ùƽ1 Ÿ‡6mÂ9¢ëßžUZákú@weÔh¨R¨ðŒy\ONË+›y7›ŽBšpVå …/hT,¥›LÀÌ(0)§!ç£ÂÞÏß! (øl“ªk~RÙ€Ã æ ¤žýs_º ‹fpJ™ ²b>ãá±ë–JÍ â>“΢’jÀ_«È®!+µL$¥|×µöfd§Zhì-Ô;áÅ–ˆ$â½U°ÜË ªžðbËDñþh¦ÔíÙ+Üe.šï¥–I¤ÔήzÅ–x7¶¶aDñ‡HT@>¶Ž_;¦jws\()Žˆf_»‚QJ&ñ8É÷>(I³`ŸN^Ùu/áF+™Äã(ìß³ j©Ø…ÒÆÇR²ZÉ$^*­U< Tq7ntØ~uLwt]'ŸZÉ$ç¸ÂÐ8äÛE#Z^+™ÄÃߞΔ.5xIZt­àÎ5¸íÞVg¸2StiìÂz¥Uî›D#ÑÌB¯òLqŠY&€´JŹ ¦á7¿Á©<Óg¡UáKúÖiÞSbH[”¡kÆŠWy¦Ñ8ÍF;†ÙK¼ÖÆYÞíP$¨à\gƒp^ÖL«ö Ò8Ç÷[="z$õU|å]„Õz¦Ñ8Å©cmñڢl‡æ«x¥g -µè7ÛèÏ“‡Ê„óv‘a¾l49øÁh(kŽ^.ÙƒöuA©ZGŸdmÍ"ƒ|TÓûUò×.Þü¸Э7‹ óAM+¢Ø¹‰H®&z³È0¥h³;Ÿw ÑÜÊTz|ˆOdì"Ã|”âbmCÔŸ½Ô¥p†‘>Jñ}¢v)‡i¶UZ[zÃÈPåh¯<.z¢7±b›KìÀZF†ú Ç…Û…áJÞ4§Ê[F†ú² ®EJŸ9Ì ´û';_m.˜Ä`ôÑJKÉ)J°¦‘Á>*jåT ¹ ÄY›Æßi$°zš:à…F] Y‘wìÚ髽sNOÙwN†¬Uš?ÿ2å&¯¥IfBÁe,¾¸æ /3ª¨¤ûÊ‹\\«¯ûâZéŸ6Ó††Ð­áeV•4_/W’×ÌÇZôÙ2·gÖò2«ŠJzŸ´B<Ã÷z+ #*[[Ëˬ*ÈñN= Åo úЗtZø –—XUã"¦¼¡¢ß%7Éõ†—UÙ:—¸ Ï&&ž€*¨žŠÐ>"4Å1v—ÙTTÓMuÏjês¾4Ic9åj–·»Ì¨¢šl8/kz!¢ Ê:h0¬áeF•´bº‹ë`”Kºª~ËËÌ*ª)É=S¯r»Œ_váÎò2³ jZ9]» “T ¡.gy™UE5M„ò@e§eU-CuŒRÁj×­FÂ~VM Ô·®PÂdëa ;1Ú¨¥›'žuW. Cu˜YE‹#qº¬]'F•´2ã: 1š@“µÀÙuf³…gÒñ™a®B(iþbÓ@×%lºw²vmDÁŠIO^jY\~Èvf´QMCÚ[àQ2£ 8ƒÍoEªt—åiØ™ÙF=­”@²ˆÆ%÷E¼egVeajVdx›×sWIMG0¦˜mÐÓ"ÌR‘z>gÙ™ÕF=¹ýeÝ9’×AÄuÓ‹Þ´£Ù--¨”>íF«ç!˱µìÌl£šÞo‘á40–­©Ãά6êè=„P­‚L hrM×Yvfµ˜š|‰¨5«u'§êUNm¸È2å€×vfµöPåYƒ‹ˆ¹ñ· ®ð³ˆpµÄsÒGFÞ«½Íš›±#ŽŒ" Òƒ9õJ»l‹ iåpÑGÆ +šè\H¥ ¤„,qd¤`àÜêGw Ú9ž(ÎV‹þgà„" îë¡>2m7<†'° U[âÈH!êiq2'——*RŒ.õ¸ o$¬µ´8¶ Ÿ8îÉzo™#c… &ǤŒ!õyÑñüij"ˆ!ŽŒ¢–<ÁáØ!<ä‰#c…‹V†ÎV Æ®¼œ¯ûÊ íK¹Þ1KHò½ud´qžÌêÓ jWÄ+9‘ÚSGF FH$^âyÄA z=ï²°\ÿñ|GLéD,äF”_?Å5Ä”±ND¿Ö ¤âc¸wPÚ²P`˜ q«Ígñ“Òg¹V‚´Töð$”LÔøŠràpcøM}sÇAÁD/Ò1ÚÆ…÷ zHî×L }°PÆ0Qç Dn|ìÈà`™'¡ŒaЮf\<…ñ¸&XPõ¼\bý²ˆ;·â%½ojýÉ¢åà³Ð(‚¤«Þ ðŒ–±UÄÔ½Ÿ{}u˜Ðð0úš±tµ„#´Œ¬"ªVô¥ P;u¿þೌ¬"¢~HGbζOúr„–±UDÔ-ä?ž —¦å <£%lµÚ I?Öp•Ч¥´Œ®" ÛÝÍ}ß?Îé#?è,£ª÷çñ¥ìbxd®ràï.!0‹€,ypzÈÎvØè|~˸+à=›]Hil+‡ºKžü–qWÔÿû`O=«ìÊL uô–QWÔÿ{xžPf/ò<.Œàè-£.®R_ôãwÞG8|MÍ×Q^Ægcïóô<QÕ8ÊËè,‚,C¨záÜŠª–»#|ÆËè,mEp3‡ šgËÙ…¥¼ŒÒÎ\ÀíQͺ +ÞÑÉWväü˰^Æhh Ž#t2£K!&àI/c´€3]wö*È/M9hç-bj,Œl…tZÖ¡;D¹ÍëmŽ@3rŒ˜ZÈ·vŠÉáI´û"Є# ÞÓ%÷aÁJQ7)8å Ô³cÀ’ÙpÚÓpÜ…Õm(Ú)P· š±cÓ‚/É–®†X‹V÷ šÑcD“•Ï£Å5„HÑ儯$Ќ#î5%^áú3Ç3¶é(.£/‹€;§%1¡½XEL‘à† wr hø-㮈ô”kºøU¢‡T„ò—‘WÄÁŠÎ¶SCƒ’ÄGp {Eܯö|©Ï¶±ýôZ×›1–á2öŠ8X,Šóª)¦ÀõŒÃ%ìåÒõ¢Xùö aèÐ+bŽö2N‹8{x\Ú  7ö%{ZËz£E¤Ý3xTŽÓ ÍŠsÛ9‹ëe´¡¶ º/ôÓ(¯LæK˜-âlµM„Ï È ¾Ü °ì—1[Ú‚ëæuÉ ˜M=ûeÌ€¶Ð§\¬)pî™®i™qµïR³2[<ÐÞ'mÔÊ=½Ë9v)æêÙ5cΈ´g:÷ãbÆÞ¡½Ší›f±Zbõ¤¶¢QnCM|½÷3ðjÆ™a6ͺÎF*’8V@„äÒT=·¼šqfDØ{½Ð|¨c0[WÏßñjFša‹û89„HÎ~Çß-±f¤!°X*AXðŠë©¡SÇ{§EÜBŠW0Kgt³9J«c¾ŒÕ"'™¨Y8më”nBžù2V XXÐò¨YœC¶_Žø2V‹H¸7dë¦G±p6wTMhšâ˜/cµˆ„÷<‡‘B_ATöØ=ó%¬æWØõj¹s%ÓŠb º%°Ì—ÑZÄÚŠ”=+ØØJPÕq_Ækk‹] ’áívœR”Ùñ_Æoj ÆÛÄM(¨6+B²˜ñ[ÀÚj½<;„^ä}’^Fj+šÛ¹A e×[7Žø2V‹@°02w0›ÜQ/¨.¿é Æ'óe¬qðžçû¦çK Ö1_Æj~…]®•(ðä&IíAË|«E -d4CdéäÀÉ2_Æjj«µíÔÛóƹc¿@miï¹n㪯4²™°ãØ/c¶ˆ³Éu措Þã%é>c× Ç~³˜½§:¤µUTî;ÛÇjÉ/#¶ˆ³ÕZ9&†ŠÚ ûÎø¨z=>Y==ÎV¹Ð'w;纘šPoé5£Îˆ³7k%ŒŠÜ=ô4Â0kÆšbïytç;Ò4Œ¦iŽY3ÖŒ0[-—$>Ñ«óDÈRkÆ›e+"Eá$¸!hLpg­=¨5£Í³ù†Ø7¾àv1 f  äyXfÍh3b`µX^zÿôlšèä˜/cµ„©äØã¤»èˆµ<¿g¾ŒÕ"Ë%­á§^‡—Ô_Âko‰nM6uX=$SÖR_Fk.[Ü”’ú^dø›Fpõ%¼q°`:rÇOŽ,U­¤å¹/ã5¿Æ®WË]ýÜèM¡¾ŒÖ"Ð2Í¢\r¢ YuÓ†ù2V‹8[­•×Îéæ[ÝÔ”-ûeÌqöžëˆ6ÀùÐÂöžý2f‹H[-—»’ˆÆ,'gÙ/¡¶´÷dÇÖV9Ë©)&Žþ2j‹H[¬—giæ;wÍù;‘q€Èñ5 d+¨ƒÚêÔccg“=·¦Å3Ÿ›‘g„Ú»årïr»¦RG®q˜-˜”Ð#կљBï ·f¼¶Z0Q&¡Sî:jMx3¢ì=“v–KA«Òªùl†[3ÞŒ KsX4¼ IK›÷J,·fÄ °X-GmÂÇP–°Ì—±ZDÁ­âÐÖ½àÞ)“<[ ~XêËh-Â`±X\ “ö§E•à˜/£µˆƒ·D·¡‰4leŸ!Ë|«E,VKÜb>»rÌ—ÑZÄÁ‚èKÉ{w" öK=õe´æÙõryâŒY²ÞQ_Fkj)ŒôçëwÇ5©Ú_Æji‹åò¨ü®0ÚÌTz°_Âli+®ëºš“q^ZJ˰_Æll«çmLÇ,Õüd¿ŒÚ"ÔÞ“ÝvˆÃ&w·÷e¼QvQèÄSÐ*â9®¦>£ã¾„×"Þ-d§¤˜mÛ,íêx/#µ€ÍB.6ŒíÒô G|©E,V24aa%©ÊJï˜/c5€÷,Gcb îE·–÷2N‹X­dƒíÂ%/Àñ^Æi«¥lçˉ\cM•lY)aœˆƒ)!–½„{û¼Ç«±+œ(Iš£¥Œr"KÙU$—sŸ9½Ž•2ʉ0X‘P©JC㎖2Ê PX-fôe$À@"RÖıRÆ9 ïXs'ÛÐÐìŒ'/eœãW¿íù,³.CË1fYTGKçD¬–™ýÀrH:+^8nÊx'Â`ÅD¨£‡Át5dGMíD¬–™Á—”z¬ÜâµÄI'Bà= ÕÁY£fwÄ”±ŽƒÀj‘éÜw“ô[fŽ˜¥¥Œr"Þ¬2@¯Ô˜GöŽ’2¾‰ú_1PÙ¥Ë .ê™Óh夌o"V«Ì®GaÇ,æH)#œmrVA£©*%GJ áD¬Vškˆ ozäí8)㛈ƒÅ®¾;ŸÕGÑŒ^K%DE½_r¤¸jR›¥¡kdŒõ´â2slX4 aŒ¢šVËÀ.6zH‹ìOÇ'D5½c $ìb¢›Òw¼8Á¯ËE Ñ°ekú“åŒV‹¹šl@$Ýt[êÈh!‚`A¸`Hz¤ïhŠ¡§ŽŒ‹š&^,‘ª2Ç+x¬X¢ï†sžô9ÞÈH!Â`µà¤VÜÏYeÏGF +šhܵ’^@’—ÓPÃ)D5­¸ú¬¸^Ðu^|!Ç+D=-xº<b|M²Ì‘ÑBÔÔ‚¬QQú£YÌRGF AS+-`CEöˆ–‰7æ˜nÔÔ‚¬w-{ƒj¡wŒôaÝ™åFE­ly/’¶KŠ•3îÄp£šV\Fp‡Ö›´OÛÎì6jiŦh …§Íà3íÌl£–V†La@Cò²m²¦™mÔÓŠN/ÎXàÙ¥™€Æ´³jZ©7Ã!¤Zf}kÚ™ÝE-è­#‘FxâîÆ>#€ÛÎì6jjeÉð¡]º¹±¦ÙmÔÓŠLÑ[ú’*JŸÁ¶3ËzZ(¡IÏvšB—ÍŸ3½Ì¬¢žøUFXE+J#Ë,(ÈkÁjûÆM—ùiZmÊYf@Q\+“ªÇÚ8aD´­‘eäÉpMkH¢þ¿}M%Ç­å¾~ÅŬJƒ‘œñ•‘9›Áð<À˜ÅØjÀ ?/d«-ËPI¶Õž7ïßO’‘•ü¸Ñ¶`u©úÞÌòðƒÁ áÉòÙ¶±È€¼BV&…Í(°µÕ™÷§,0 «¥«5&u —¯‹ÌÇ©iaOȉƱoóš‹¶°È|¼–¤V«wzÁ6½mb‘ùx5­TЩbXB u®Ž©M,2¯%1(”ž gÕyT™X`@N`+v+'¢FTIovi‹ È lÅ.… ™Þúüjˆàíä%²ŽÉmOrt4Ø=’´Vì’)/f<¬Ì‚šì½¸VЮT¡jŒ¿Èi‘{„dËIkv99D m‡¥9B{„d§´+¯ž­Ï3;öÉ^M¢Ïnz‡Iy‹öË^d+S¯Tã–ê%s·\ƒ÷Ë^d+yœ¤”ñ†MTjð€Ù‹LÄ1vï}ÞÖ5€àì%¶2v¤{§Ý´ãKlòž½ÈVÆ>üäÒ"š(Ý¡ °y±4P' w«y«­±áÊKŒ†È,®¿Â ¥˜­Æ^,k¯KË“ûòã Wõ ¾X^<ËåŽ#ºñ†ÌÙä|²¼Ðk™n{S`¾eÐAË me{{çáÖ.¾š_-/´Ø2‡¬[Y(~¶¼Ì¦ßŠÃãQ‰]`ƒ¾Y^bü(4tÅåðVÚÌרˆôî†.F€žø&®®²?­QiØ^Œà ²5 ݤXå‘‚­å¬m)?xA—Š‘~½p–qêÐ:Þ0o˜ D ö"•£P'žEîÞ "ýz‰Æ+Z ?¬ÍŽæ~ýȧÓi)ËžÞ@ R¯9? Í£!‡m¶:Ôê‰DïÇ-0”KßÒðýÍi"’²ù\õ+eL`¥ÉrUû®‰Hλ—à% ²âüü êßTÉÙ]ƵӚšÐð¼Èò{×…—³ø$J¡»ÂU²"äì>WAºQ0žUä–˜ÑE$g7pyÖx)øU·Ù¿0ò‹dãß7ŠWƒsâ“_ «ùK^H½Ú®HætW-ÁH<~ì2®!(äè£Cë!T®DˆÇ]†{›xÖ€´d²jFâñï“Yn™ßQóå)ªyGsò/œÜÕèv2jÉ&YÏ;š”ÑÙ5ËMžÛb¿BÏ;š“Ÿþc<û×ãÿƒù·—±õ¤5î(’²Zp ˆÑQˆýk÷;| Tu>2ªØÐ–õk÷»·—Œ7ÆE–ø”ýÝ›= ,2„HÕÎÒzã·ïª²¿{6,7xótnôbërA(ü”•–ýÚÄÆ€ò9ÁA? "J´n?ÿËè&‹J…á1ô=&ÍEê^†¿ùåõÓõwTgÛepÐp‡üïÓÇ·¿] Š¡QG¡Ee¬¹tdUJã…sÇâRX¼g«ç-\å?U®Dį¿þÜ4û‘xš­ô±Š} |¾ùqýÀEÀá#•hø¾˜ä÷ü4çyÍ1Ó4ðÍ!eZ3¹ƒÈa;äœd(xçD JE8Âå†åD•=~À"S*C@Ìà0jLž g¦ù;ø sæ&¿þCI¨ö‚&­ùjþ5 ߢjÞÏt;½ Ñɳ‘å4j™›QÅ‘ ém©lð%:>S¿RÉ®ÐzÙøV*Y9íé̃§e\Ë#)æ½åsÁ½,\zçPgtù[FmudJW´,ï£Å…_|u+|ÒnnjͿOöÞ’oLžÜƒŒ½ÈÆ\<6phìD[ÅLÏ dAoÈçà3°Ú“ o…M4£gO¾=ºoé;fF‹ ~¤›®V@Ñìý ô ÚýØ*Æ2|$Yš´€¢ÉûAˆ8ÊÆâR!U+ hò¥©5wÓÄi ê€(Í ÿ¬$nä3»“„Ê4óy*ŒŒû+'óâ„­NË?’­Ÿãó UA6î†þÔœ³óæ ×B'°ÓiI`ÏðɨùÍÙ8;Õj%øØ„u®{·ÏLa§ÌîŒ×ÊBÒj‰dî§)ˆ©Ü±ªl’%guÉ×Ïèù!KAf²g1WŠh•á2³×zH¦EfFFç»<2Ú혮^Љ*%G ôÓœoÈÜ–ŽÀyPN–sVi;ø2ºUr¤Ar­Ð'÷Ö_Á Šf–©ÙU1ZŽ4èçÞ«à9œc\(’÷ã+Ö³Ö|¤U?ÍhÅäuº `sŸDYÍGjõÓ|~5$£ï®ža;Io°ªÔêç©AÞpÀó£6›R·Âª>Rëpj©)çøŒÎ3 ®Ø¤† 0EÉ]ö+(Ú!õ&'Œ¡}I>—ÒpKØô1¾“7\p¼$#s8YH'M|È(MÊPØŠpãåø<±–œ¡šƒg+[lE¸ñ³|>ôI¨äÈJ^­…V7K£å[GԌ˖Ô@¨qJ§Vš|ŒíÎvògT&Û½ ØÉ(ÂUU’ô'·¸Š0㥸¢ |¶poðÂ:иŠ0ãÅÈ‹ ²ÝÐ$ò Õb(ˆ—Ùj‘i”DýäÙª: .£/‡vfdöÜÇ袠2 o«sÃqCi„@/3ƒIÒ,g"e¤§Ô4¯rX Ó‚^ŽSF¾}hî|æ–Ó H*äh`A0cÛHºM×ôePÞ:¸’ÏN»DæƒÒ^ŠFBí.¡F=Æ3²4)Á¢4B —bdVb¶•êÅf Û%(äF¨tR\¬‘¸”GãÝyT¨ée¸ÚªPŽ×YæÜM Ú^„ â?¸‘9Šó‹ü5f#@z®Ì¸· ßÌkç“`áÄçý¡ak)Îçûîr¹÷KŸƒ ˆˆŒQDˆÏ¸Š~î¶µa<ƒ ©YÐ×ì-dí"¼WÔ¥„vñzߌÏ& ¸ó wkä½¢.žpmhó‘è,‚*ö³ ïŸ ­œ\†3Ó­+eà½ÜÙéÜy¨ªq…}k⽟+8SÙ!Åa»ˆÚ,"È{®H¢r¼9›ÄÓÖ,Ì)ÎñK©™£l(~J…t%1ÆEøÜ‡Â©í\ߟFÎæ> ³ï—ÎÄÇÐÖ&"¼{5­ÖMSӵþÛD„w¯¥Ð}c„¦Ab‘Xã¼À±©C&)€îò¼dudhè”õ˜t€±†6®ßol.2(¯¦•=¶ÿTFôÜgÔêft‘My%­œÃ†W1†d!ÐvÙ”SÒÐ^n$î’yöé¸Î)”ÙE&儸ࠔ7rÕÐJThmuΤŒçà“%¤ wî)"Ô[Do-.°¦Œ9À©2âƒðépº;w÷Dµ/Žhƒ‹ŒÉë'd¸.ѪmH¥¬6Þfkƒ‹¬É+hµ üˆo£‡6Û—±¸Èž¼†.–{ïCÉ­È\¤æÂ1¹Èž¼¢¾š WîSÊŒÚÞL.²(¯©UT þ%iN›\`N^K †CÇ@´@…ØWÄ¡î”Æ™yžóœ’.Š£B¸eÚ1ˆ43òË*[°¶éÀ^½’V7œ§-†7|Ú¢Áz™EòVmLY¥`—5ëÀfó¾£s;UuÜ Î=  suÒSYʪ#‹õ¸Ô¶›” ¦›·SRi­QGë5´@cøò¾sÒµéÈ^½Žn,* ȲB¢ÅÐ#^´µèÈZ½ŽV×´³xgçpkÒ‘¹z5=71Ú %*•8…N™td¯^IÏCL…•xù£ÛóÖ¦#ƒõZšo"¾¤‰:7KRW¿ CÚ¦#ƒõzZp(_| zö²_½Ûtd²^IÁ ŽîÞ6©È¸I<ÅXud²y`%×›º¯Ï]‡‚HðÖ¹P*»ŽlÖ€`±“Ì•î|Ï6ÞPðÎ}.áÔ²ê9Ûb`¾ LÑÜ(·50úÂ÷º,kDŒà1`fpçˆáƒS)û$ ­9#â‹­]µÙéêkáã Íxý/ãŸÔ+…êˆñ‘º&Œˆ œúÃ`\•mäÁ½§à&ψè."6ð zÊ*h#Gmwʌ߈ÈÀ«h¡Î¥’¡²@*¶ˆ˜À©hy&å<‘7"çaŠ-".ð:Zìƒw*ËVä_¶ˆ˜ ãÎ a A— üÈ*ϱÜÊ%ËPØVNÛW8"ðú_l±s¢þã9_°d1ÀÅý$.àÎ}Çö“"GHä,dÃ8¬ÂdU£Ì($;€;[x&ðú7Ì_oîÿ¾óº‡]. ^‘EÄ^ÿÏàóÉ•ÿ2d‡à[Làõÿ<#D Fð2ûæ'Ý\ÏØ±¡K€ ?Ü¥fT/Æg·1¦™_±QÄ4NÿOÏÜ=@y±¼µÖ\ñŒUè–ÈÞ.qëÄm¿|ó4cµÿœõ)“#ÅÖMN½4E$ã´¿ØXà.Ñ.} (8¦x(â˜Ü9KXjª_Ú,ËÏMH‰Ðït"‡~Õï5EDã´¿Š› »ÝN®M -E<ã°Ø¹£*™Œ—®'[* xÆ`y²Ü¹nÒ`Ó=2ŒNF—Š$K½*¶àƒó%t…–¾MÛÞRPRŠ:cKÆp=383 À­¹ÌX›:ÅeQÔ¿shIÓ^@if –À5ÀÞY¥rF¥i/¢4³Å:òïñÙ"A\Ë{ŽÔ<ÎëL=3V*‰þkÞ‹8Í#måS¼«Ô´Q¦Ùj¡sD54™—ô&ͪez,@š®=ˆÚ»ìñE¤æA°X(á ðpy™1´pšè¦Ñ\'KF¨á½ˆÕ<<·îAމÌsšù"Vó0ÐQX.à(yÀØ+¢ àÑ«¤9iâ‹HÍÃ`AsèÙJßÎy ª‰Ï±š]\ßUà Ü–Ak”´q1›7Ç|«y˜-<êƒåšñž9•G3_Äjh‹ÕÅéP­Z…ç4óE¬æ¡¶ÚY6j†Iø¾³æ¾ˆØ<Ô‡~ØðÂ#ɦÕä1›ÇÚs®K´%J¨]rÎÚübó8[Áè¤{HälòsÔrÉ wi X?-ÒV«¥Œ¸3š]#êôH[‘i#ŽI…Õì1§ÚMóZËyåóà ÎÂÕÅ ·Äé0¶<ò¤P¡üàŠÌoŽ[#Þô[˜ñ¾s[”Ù;œ0ªÉ5"N³(+'÷”Œ˜Žáò™±¦Öˆ6=VÝNnµ7‘ᾈ×<.=fÞbK’‘Š9o’3iC}­9,f€| “0tHìÃ0_Äj‹]M§Ñ¢6kXÓ^Äi‹´K”½"Ö$ApÃ{§9<51Gï$†¦<ãgï´qš]_o hµšl :SÄpg÷kSp㽈Ô<ÌV†ØjG£_l4Ä‘šÇÙD¸Ò†ª¨ ”9+^_Djg«µrx´‰Ì@n¶ê ˆÍm±«Á©|¢V)³œ!¿ˆØ<ÐVTÇ净7^Œ-ùEÄæ°¦q$:`U¤ì]¢ú±¥6*ID›y¾®Ÿ jÏ£°`ø *Èç¬ó£Ù5¢N´…%äNu.ˆT¸ð¦¡×ˆ:ÒŒîÇYúÀ°XÉá½¢×€:Ð@I×CžÏ ,†]#æôH{ÊEû0E€ô}ŠZ#Úô›ÏæÛi´éò&æž®lšXÒôXñÜE?gß2_Äj‹¥ô‹Ñaöy©ßˆ/"5€p rÖć ã³›°„!¾ˆÕ<¢µrF?Æ·ï£Éb`™/â5}N 2¬6æPr↊–ø"Ró@XÑÜFÝ Ìœ…oˆ/ 5»Æ®a4äK߯I\–÷"RóH{º§93ý% É%PÍ{§y -@”Qª3GJVó^ÀigZ*8oê͉…9pT¤–"¾ˆÕ<V§ê¨IGÂ#YVª­ôæ¨/â5»À.—pV˼'’šæ¾ˆ×ÌÂLÒ.§öÜI«÷ÎARK}­y -HbÖx‡ºä₦¾ˆÖ<ÔV¡d(jLjéâ𛣾ˆÖ<Ô–Ûê¼2p´Ë4õE´æ ö|½ä»Ó³fâa¾€Ø<Òž‡ÐX,©ïW]cM}­y,T\Mv²ù¹q5Ôñš‡Áó é9"¸ï ÕÔњǀ!:îU.¥Á†^a¤ýœÍ}¯9¬²03R¥cK¿1ÔÑšGÁuàäËVlLð©£}›Ù¶7Íaµš;Ïá8¨l…妀w< –ß”Ó?f0ÃMï8 ,”Œön$δKR»¡¦ˆvVËÚñ`¸‡ìü 1E¤ã O¾ÕÕd (ÙǦb–§UİŽÇÁóå¬P!ìÒ>ó©53E´cAëV«Ò?Ãìu¦ÇrŠˆÇã@£ôî²4­­L¼=6ÜñŽÇÁ"Žy”§ÐŽy}D³SD= ϧ†•¤ä.ɘ†êñ8XÑ~RUñÙÂ/°ôQ‡ÂµÞ¸J—eKT/uì½8H¡é)¢…ÕŠ³s€n†Üïôq‡Â"ëü8Ø_@5¤ÄHÕüpGœÁžÄŠÇ¿ë¬FÅÇg“¤m~ ¸Ç#aµæ Œ³_±FÅO÷x$LÝÊÐÌR¼eL}xV|eÝÐSÄ=W¸Ú—s< wÏ逊ÜËVüqƒ×“R‚, S êUŒñÍêÓ†@"rðŠzž uR^|ÂÚ.!4}DÔàô´ÈêBãµ>¶aIªÞ+öˆ¨ÁëiEÃ>[ Zúˆ¨Á®$ët¨ƒ “§ž¤3«¥ˆ<žoc u Õòu<Ã5x ç*²‡BQÉI*böˆ¨Á#!šÁtO©{BŽƒŽš="jðPX‘ÅFÈntgè#â…èl¢^‰Ÿˆ'vv•ÂŽŠ?"nðH¸”à+#¢7}v`Ž›þˆ¸Ák*¤l9ÝÂ„Ž ©ÑüqƒWÕóx×^™ f1C5x5™sv]Ú±q“o9oRÑGD ^M«¨é@:žŸ•ÙÔÚvd·^K+¾>©¦(éoM•qG†ëµÆCf!Îë ’woθ#Ãõz Ï©%+­QËò!¤<+4iëŽ,×kjEÙc+\X ùhëŽ,×½‹'пÏéßÑ2¡Ü“4Ñæ™®ÃIˆG7z¥Ï½9óŽL×ëjµÄsÐðws‡ƒ™ÉAh\ïéÍ*BŒŸåC‚ã„,ª"ÄXËtF¶ßŒ,mTs=µ!+ñƒ4®Ô81>7âŒ{ ¸²ŒK”ÜäÑ+c£¹3hg •š4°"Ôx9.娀HjC2³×¦BV?ÏÅjy윀 €RŸ]C+‚Ÿg4‡i œ–zÂKF—Ò| V?Íçî9;°¤6qJ@¥úH­~š E#£m§7t¹2gT©ÕšPl 2ÔËÃ`R“$w£ùH«~š+=K´¥:§ 5iÕOsµhò™gBåÈ&çJó‘Zý< ÃZ”ÀáP74ªÔêç¹âŒáðà, â¦ËãÍ)&º„Qý<]‡¿ ¨ãEQL$t‹?{jsCÒX)µ'Uñí´R"û9®TÐ (Õþ^qX)%¸ŸãjõGˆcØQÝÙ÷2:‰äíÇð|Ù”_h‘©Mî*‘Eâp#xNvÔÈ G·uØ>o,Ä"iXT¬5ç£Åµ’X$?ˆ• ”Nð«y—Ã#²@"n « ðæ¨ÂgçTÏ(®•ëz=à{*ç9ûÂê)ãõƒXÍ`ç#·Ò“\7¯Œžgæ-/øýc{àfËØÎýaüømôðc;¤½câ»Ì_»ß ·NV‘Ko¼MŸª…\ƒŒ+ˆç³gýæåï/(ôøH‰kÕáç! ò³;j}Þ~¦Ï`ì¿{üø²=¾ßMÛÿÈz{üòÃË/~‹¥p8Îùúðç—ÄŸxdê¢:žŽºêùþðöòúÝ7o_|øë˯>Œ`(uÛùB&Žà¾æŒšÊiHÖþ¼z0Ë6fúøñì_ÿÿu æß^*.¼Rö?Џë~R rãÆ_»ßOasˆ^0IZ[¿v¿ŸB¢Þð ¦8éSæwon øT£p'Â…¹s…šF «ºR—ýÝ“q¹ÑÛ§Ó§ÚðÄQcâ‚Qø)//ó½ ¡ü4B? (Æ*RÔÏÿ2@Æ 1ô;¸‚µ´7ÎÍ6½í/¯Ÿ®¿Øu‹;N‚ÏCþ÷éãÛß.=AÇx[”Cr†:Pâ”ìTèªP7“De4Zø©†º8¦Û‘aÄzùÌ<û‘xž­ô|`vG-œ­xýÀUÑ ò¤ÐÚW4fùý?͉^“¬µ³ªê&¥ç+îvÐéÞY9j÷“O‰KáSSÿ©š[¥b¨ Ófœý]_*P?¨Å QØ ŸBÙíŽî;§ùOU´÷8©ÿRþêQÿšoQM»'êEäxqÛÛXE‰PTÆ äý©²'òp+²ôsÅo¶[Üfüz£žQmKì.›§G߬ˆ5u<}ëºBë} |\q‹‚îõ”ŠL (ó7Hkj4|3†èù,¢±®U*€QOi/b§·âêK½añÄÅ+ˆï”›4vJÁxý®$9_¸òj¯ê@W´È`6d7˜^ÙYDNfv + òCûŸzVŽ¡X¡©ÃÑ£ž5xAÿœà7Ñã2_}·B‹$â±’QæÂu¸LI…~­Ô"‘øQ,æÐp¾‚7œ›¬IFl‘LjCö(iª™`¥K©ˆ"ÑóŽMÖY¸Ã(\Ì[¬Hóvž+=`]%)I¹«™Hê~ž =àhè¤K:«™Hê~+= Daå7Ъd5I}ì@3¡«žIRNõ*ÎÛ;ž7·vV3‘Ôý¨èÂJóÍÓŽ”Å?+_±<¸ì4Ÿ§ðTéˆøxw0•ê#µúiGçÕŒÔ /;Fï‘NÇž¨Ègºn{tK[K”Ã7t,Õ¥¬Ö#ú)®pŠ¢c&NØÈŒÖ#úYNS^D¡ÝWáàýPW¢ò±µÐ¨ÞœÖ#•úy®”\¸–>+k§V{¤R?ÏëŒÏÕ„Š¡ÈáðO×M+>Rj…Ià#èv{~&N¥LóÂU9ÆC6RXîý+¶‚LÉ9£FÉÃÛ…âó`"¹>D=Í…M+⳦ñJª÷MO£{_VdœgÂ%É_.cÏuË: ÔùpÂ*ŒŸã BhµBÊtŠk1áÅOR^À…*;ÙñÁ¦ŠµBâ){»S`*Dƒ }ÎIS©‡Pï;ÖŒ-;å0PEˆñR|D îÁnÉÞ±ð¾9TEˆñb¼nZ¸ª³c+»1ÄÙTß®Ìx).¬, /'ôd"…¶…ô*ÅžãD)póšÚ¦‹Ýy!)gšÜF˜ôR|¾ÖtnŸWqíŠ×2…Ú‘^„F)ƒVãCh¢t+€.¾Ó- ‹Ú’C[ô΄,É3Эœ)tùÿe›ë¥ÁmJ'ÅçÁЊóåÄhèlǶ$#3Ns!²9ˆü²[§QAÒ‹qaÇçÆÍÛÆã8>e`@Ò q‚”ÆÎnEå|•!‡“m ‰¼ÇQ¨ é¥8ÍØ×¹&z2Ñ'¹%b¡Ò‹ñòa…ÞSøÖZ¥èõ‘ì\’´¢ÈJ¡¦¿…/UD¦måxetºËu %EŸµÈnߨF„ûZ‘›A—³u«…LÇõÆ2•È(|Ùïá1ö^S‹|6B9nóJ™F{¯§)¡s^«ÿ¯N =$ÄL­í"¼á vŠÆ]IÊœµ‹ô^„Ó è@I–ý¹Å<±ˆQ6N60vaÞIpÅ€_æø‰@›Ey/Å)!:7,,"¾Wqñï ÖmI6gÆ,"È{1NÝ+lW1‚B-8¨R¯—Æ,"ÈךN®YPuÎJ&‡šãÃE¨¡qôsÿ=Ã!Ê,"Ì;EE‰©“Š:÷•*8ÊÉs~3‹ô^SŒÄg9]̤Æ[Ý®Aið¶O?4"'£©…Woð¤Zˆ“V”éEfåÕ´04´w„‘&q¹ŒåEVå”t¥þA0÷{›Ãg¦„Ä\·“Îç­ÝFåU4…ÓwQ-Œí”å¸ÒÑ,µkà‡6¼È¨Œ§pÈç-ôøRÅ¡ÃÝ-è©Ëå ku‘Ey.öu#ËHâ2«‹,j ?S¢²dîîD@HXF³ôaÜÏyÂv3ºÀ¢¼–&Ó=ønºÏð¾¯ÉÈ®}Ÿ¶¸Èš¼Š.og¯®b_È @—Œ–d3Y“×ÒJ•ÓQ'ÃÖÆâ"ƒòZRK}¡[X“å:ˆ´‘)« ,Ê+éb[kŒ­rC&4äàÎÝè"‹òj2qÆ[2UÅ…mêrZå躢\#¥lÂ8é5­ô/÷–5Ö®Íz]VÜÞ­¸ÈÑM;¸lßøŽšµëÈfŽ*ý`x¤yødÌ:0ÙZöÆ_Ê»²1ž‰K·É:YåDn¼ K@\™ud³B·²7‰¯ëQ²¿eL;2[¯¥9Â'æÍmò—©•E-|;Ýšvd¶^Q:‘ê½4/‘äI%gš,ÄÆ°#£õzZì:v\„35ÆÍ[WmבÕz=]›w_v%•§ dâ3*ÓŽìÖëéiŠpEMœáÀœcáÆ´#³õjzžwY±ˆSzZ.³´iG–ë.gr`>¨õø!Û&eÜáz=­L¹QO²1Þ$+¾1îÈr+*¯!Ï3語ˆ«05¬’†º²óPEYw`¹‘H뤚<YÆt¨ž‰îÎPÏA^ú68xîÑál˜ª/t©!f¹#âƒÉ„O>e¬»Ð5*/`0¥ÊAµáŽˆ<ž2˜x£’¦óìÏpGÄ óù¾ÂAE– õj˜ â wD¼àQðüÆÎð©: øØ)ÑûÍqGD ^Q‹CÞ#SÇ#Ê=ysì1ƒWÔâø²âŠ <$MJÐÜñ‚WÔŒí·`l“`ìÎnÿ!³æŽˆœžVL1 Á㥄€7Ç/Ô‚¼¶•Ÿ}ÎØÍUýiØüÆuà†à»œÌ)êxÁãàiæñ0úÌ*N»D{ wDÄàa0Up/žÛdçJ=çù·fŽˆ<L “Ø¢ÏXr¦"šµn¬`Í+8x)Ð̱‚Á"<±±$)œ$Z­˜#¢‚HOº žq}˜®)Tì`ÊÎNå—Ç˃BÁÔÁaƒh-ó¥á«s%¦ˆt<V¹&'lj·$Å ,1E¤ãq°rY6êýtô6½w^Š8ÇÃ`áXïz(ÐgÏ+/íÆKéx,4œÏÄßO db H‡r ©®úU_Ö(©m¯l³R¾å¥ˆt<44>ÚwÑ“MLéxÌ<6]¿bìÝ7 a(|ö}祈s,VIu™ûéô+…Q“R@8&Ч Â-fÑ_ËIßxý_k̃ÏɶYÒ¶â]“tâ÷•š’"ºñXÀ“ÍmI<MIßxè­1a¨žâFŒNÂQNö# )E„cðüzÈ`’»ö³q}DËHÛx,\¹‚3<é“Áð׌ñ‡Ád _³¢_Í>\%ÉrRD8‹Ôؼs›Íc?$ÄhH)bœá¬qçÌáüLB |Xêzîâžã]᪋Å+Ûiצ†s·o7ÔÇ*Õ¥Ú«x£†ö"JóH[ìÊræÈü5öµ4íE”æ±6_àÈÕš©rB-!Nÿ6ÄçyÍ!m¢hvÌÿ–ux?)¨ôÞ´É0_Dkg‹ãʲIQ?J5÷E¼æa¶:=Í5¢Ã}¯y¬˜¡™ÆM·Ø]7Ü›‡¡ºÂN5Wv0Š8±«¢¸ÏñšG€ >ÝbOçx஬_Í|«9 ˜4Æ«ÊÀWßÁIØŒª(Ú‹8Í!`AÞa;ø2Òkø8WÓ^Di+’+Æß9gÂP^Dgà éH”Æÿ™$Ì3ÓÕ ê¥ÍIÛ†ñ6óð ‚6»8êi“*ÄÒäÖ^Df]‹­*ê3s•6£šð"2ó»è;–Én`ÆlªŒ…=!Ãw›yŒ]‰t¾šøÔ^<¡<Ì!¡íÊV”ñ™Ù‚€ò˜-u7ßáÀœá¼ˆÐ<ÐV(’âç1jp:™œ3à­›i+…ý\tøàÍ€¢Õˆ2Ôžæ·Ñuvà›jfPÍ©_z¤E§‰Â c$'±ÄgäÍqjÄ™i‹ :D”¨,=²âÙ_TĦÚ"‘áB‚t-\ÔRk@›g«tpôЦ²ÒY‚B†Z#Út( AÒ'‡4ÉE 殣¬÷šxöÊC=äÔPÑ\Àa^áQrÁ¼œ0>KMj’‹Ìiû¾+i6Ö;®¨„–?| fH.b0¯n“}o¿UwŒâä²çÂišå"óú^qr® ¸’ ËE v_J?ãõ7î:Ý79û7 ±—‡Ùs¯œ Ü^€S²5¿äå1¦o TÎ%”ÐF:¤ï·ÜÌ·Ñ—ÇÙÂ%ܤ»ÀÅdžâ"úò8»väÒrfÔ2~H(‹‚ ÃEüåa¶ØaãÚ)5+Ò¤Ár\D`f+lòhñG'à ,kaO9X(-Ô˜ÓZ§t Y?™O^4clèaµðdá½7Êæ’{àŠF#Šô  ü(qók£µ=r¶Æç³ŠD#†ô˜ŠògÀ¤ûKì%ÞycÑ€!= žŸ=–Úá$i cI4"H§Vv4Ë|PÇ”.g³ŠC#~ôxêရ¨+m“B±–ã"þ20Éï·H*®B¢å*Gù††&¸ˆ½<® À!ÛCÀL¼¾@B–¿a¸ˆ½ ¡¼y˜r5™³üq—‡€^oÒGùE*Á‹t·:eoôQ—G@Df’õ‹{ù´CH§ì³ ½EÔeWÑÏøø™ÌZ•›P†Þ"êò([y€c¾èn…6ðלšCÚ" hxƒV˜„ çE”æ‘üeQÌ•«uïr‚…f½ˆÑ<Ò¢Ëò‚>>KUñ{·é4ëE¬æ±¦Ã‘yÖžâhØÆ½Ç.‡£U†ú"ZóX{®å†(µnªâ}6´Á"{î/[á2i°&‹"ŠkRÏ i fx4âH*½(Jë½$§¬Rx{œÜe˜Ô±¤Ç”áÍû¥¡¡Q ~“«†G#’tZ\è­I‹ƒC¸ :Žôx r/ÖÄŽxçæCß7<q¤ÇÓjQ,\œƒÞÔL±¤ƒÀóE±ȇr³$à’‹Ì`EiiN ræžá¸€¿<&!waPŽº3]ÑqÃqy\çì®ïáXö*+yß寓a¹ˆÂ<žêU¡On“ÁÃqy,XPŸú­ÌNÊ–ã"þ²ëégÜ|¹ŽU:gY[Ž‹øËCMm°F)Ü€†AÃqyX]¹ܤæV3}¨wgrM»Dr ÉEæqµØY @°z¨´þ›¦¹€Â<¤®EÜvE«h$An’øaH.â0©‹Õü½š2L¶wþ,Ÿ)ž‹8Ìcjµ¶LI%s8¶!—ÚHùg^ƒ%Ñ@ŠáBån©«JÀpfÀ‡Q×èzϾ³§œ¾9ÖŒÑ#jq¾QÁBÒ–*s¾–b͈ ¢VÛ¾s˜6Ól gF|èAu1$y}··ïÙZ òÝy-gF|èAµZ[e%W)Ò I3"Dƒç« Œ"sÎìÎÖ„‘•GÁjDmoÿÌ40,1˜CÁTòCߢV`àn”O§^\D^&ô}«ÄZkÖÌÊ Ån{y<þØšp͵±ã(—â·ˆ»œöŸfÉåƒÏû@×?1ä—]0?ãÌÓ¡NÂaç xŠÜ"âòðš.¾êD½²Ë<(¿‘[Ä\IséðÞ+%öSά-»EÌåá´8ŠÃùЦÐ%ëÑ›c.‡¦EP·7.JˆÛÙì*in‹xËá)Zù’Šq]P4Ä‘–Ô ,c/C7v“”}ni£$~)—è—B(Y÷ °“kr¼C“dÄ€OQ~Ú)[ƒN.Ö¹ÍYC“z8­Hqãʵ¨Ý×®‚š7š (ÐÃI¯|”]q­|§ÈGÒ~4OFèµLã*æ½l»wžŒHÐjµæuJÆx¯ƒj¨2àAgñ¸F=!Ú•—úæˆ,b)€•vG0pæ*u 4½EÔå°8ðE˜™ÚžiÖ”ÑôQ—GÁŠÌ®îvÒKÜÐ[À^Á²7½x¾wuÕ5ä—Ó™˜·Q(”òŽg´{ëÂŽ_ÍbùžCýç&÷Ü𖇘,{÷EQStOãƒ.Ãmqy4©²g/ûe¤ŸI¯Ÿ7gó‘A{ñ‹hOºš0¶Ï]¬¶ïÀ|½øùY úýYÆšKÕ|~i©q<ê>3o¶Yª×äýÇû}Ïr%SrZ]9´¦¬9²T§ÇeøaÇ2µ“æ oƘCõj4iÔ÷»€Î~pGì“#ï7kv–굺â`”²¨÷gkŽ,Õëz:x8BÏê³62æÀP½®çÉ]çöÁµIPJÛrd§^ì×ÚìïÃ`³I„lÙrµ-G†jä¾Üïê2»×÷ý¾²äÈJ½è§›Up4Iý¸%´­-92S'ûyÊ5;K’skì/²-/ýEŠ ôéÛm¦ ¬Ë %Û“qwÎÌð›FÖåÅÏâÀþ¥ùc‹ÌÉ‹_8É*ùþ0c]‘åX&}wh¨.:µŸýøîÖَץXî)PÃòCî)óŠLÇ õùÆ‹r»*=—*dƼœéx1fÚäñ\1Ò˜Wd:^öÓ¿ ²§ãaeVãÖæ˜ŽýŠ>ÉÂ5†Ø©Kûla`l+2/ú•dw¾ƒ7p¾­6®Èp¼ðE°çp#7L‚Ú¸"ÃñŸNÁF}Åw´‘gŸ@™C„u/}QSÊ,"ôåõYÙCv'¡‹JÕáÒ¾óÒˆ†~„l/¡‹^Yø×à Ð#[’¹¤¿Qün‘}´oIjKœGörþÌ~„D´QRë›Ãyb/|ì`Fj˜|Ϋ­èˆ½ðg¼úäNöR H¡·øÁ«¸p”QH$l?öËÚˆ†Ñx×o#ÃH>þ…“÷ù(ñ½­¨‘a$ ‹€w/˜êƒ¥aÇ3È „ È^D†K.Î1Wk!FòƒŸþa%÷¯¶«š»b$ ÿÂéˆU~ÇØCMGLÍ;š”á$2Î`DßÞ´™‰G“²Z{xÉÃò,±f&MÊ¿ðÝ·€Ž+j2ÌôÄ£IùNÃä yxkÒKM5‡ÎûrIurSÁV¦Ïåò6Öhþ…z·Uzº[=>úª<ì÷íQ°´¶ÇÆßFO‡…֘õ漗¯ÝïÞ^†ÙÒ»sé÷ŠãSiëÒ>øG(xÖo^þþRz¤”ÈU¥Ÿó™(qºnEýLŸÁØ÷øñe{|7¾›¶þ‘?þôöøå‡—_ü~ì€ÍÖþü’ø± j¯sÛÆöýÃÛËë?~üôŇ¿¾üêÃÉož>Ô”†© &¸=ðh_mÃk~œ •ñçxàï_ÿ×÷_|™^¿ûâK„;Σ·×âÿÀ/úyŽÝþëÇ/¾,ˆƒÇk¯÷m+ÇþúßÇçþðá×ãuûqò¦SÆK?|;^ðð•ºm¹õ×~úôöÓxõá9^¿ûÇX¾ÎòúÍßþòóøýØ^g¿þô£|f¼åÿ~CCi[.{}ýþ§^Ÿ;_dzèS=¿~ûñ‡ŸÿÛû¾ûøãG~ø‘×o>}ä–ñAùPê¯üÏù…þúé/ç_”×?}ÁÙ_¢ŸÒøð·óï·öúý5¾CñÓÇÿ÷é«/ ”/§¾¤A9³0þç_îä{Õן¿ÿñ»ÆwQNeKx>I%—›X>^ù˜ù›xË߆å¿¶üúçŸþÁÿÑÆ(ß¿ðÍŸþÂÏ>­œÞ¿úýÏó#ãçñ{@©¯?üóçO4†–J³ÒãñÖ׿|”´öúqˆ¾·íõÿü$OšƒxçÏß~üó7ÿüaŽ:Ñƨ ©„Ó›a]þ÷ˇÿúû×o¿ÿùo?|óŸÐ2öÈç˜ ~¬¤ðŸú¿D2þã§?¿ÿŒçý,Ÿc#A¤zNyýù›·ü1•׿]šýæ»óA…¥‰ÿÜh¥É£Ø8¿rC­”1Ò¯å ©½^l÷ßþéÓ÷ch˜50í?žó‚6¬‹Ð3÷ª-ão/ì)¬hæÉãp5fìûã~ÿúïÿþ;Xݹå=§×¿|ÏÓgY‹üæ?|ü™1_cåÁ=_’N÷ĘÿŽ”&æE}ìÿã¿°½XÎBeØm,Æ_fÔ„/?ª¼ÓÏ%Äß¼ü”,qÊendstream endobj 300 0 obj << /Filter /FlateDecode /Length 253 >> stream xœ35Ô32Q0P0SеP01U0³TH1ä2Ð30 !Œ‘œËU¨`laT072Ì€X$”sòäÒ÷ôU()*MåÒ*äÒ÷ªâÒw pV0äÒw‰Ë¥ï¦ïìì䨨è{+èeœósJsóŠZìì¸<]Ô86$ÍÛÿÿ‡Ã‡͇øýý]9>U±6¿ÐÝ·áÞô¯û¿i×ýÿïÛƒ%Wmª¿ý“ßð·??á›ÜáÃæÍµŸ/¸¿ûû÷ó~/ôýÿ¿ýï½|ÃÿÇ}Ùöõ½w¾w‡؎µk[·6s³qóèÿÿûmƒ—«§B ?"aÂendstream endobj 301 0 obj << /Filter /FlateDecode /Length 166 >> stream xœ3±Ð37U0P0U0S01¡C.=C Âɹ\… Æ`AÃˆÍ ÀRNž\úž¾ %E¥©\úá@i.}0éà¬`È¥ï 43–KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææÛÙqyº(¨-xòàƒÃ‡æË‡øýýý¿ü÷ÿ§ÿÏ7èÿ­¿ëoݺu˜;›GGBƒ¡ƒËÕS! „­4 endstream endobj 302 0 obj << /Filter /FlateDecode /Length 176 >> stream xœ]OA ¼ó ~ÝFIÃ¥^zÐõ–†CPzð÷°<Ì&³»3™aýpœM”Ý£WOLÔX§#.~ 鈓u¤ª­J_V¦še ¬¿Êðz¤ÛšÊorFöhá\VM)¯q Ra”nBÒq.:cA§ÿNmŒfÿQÁõIlEð˜©ÀŠÛ®ËÆ9➈ª5Ft©ô(9s<ëðW5øUtùbóZkendstream endobj 303 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 311 >> stream xœcd`ab`dddwö Ž441%º»rý¨gíæaîæa™ýý¸ÐeÁ3üÇ@rÜù©yI¥99©% ÌüL| % +ÛXY4—?ùÑÁ÷£ãð‚ïïç3þ!Îü#à{Ÿè7£GJ¿LŒ”gøòäÑ79¾Ÿs§,øá;Ÿñ»úræ’ßW‰þŽù]?½³·¹[²±±©¡¥·sZƒü÷˜ß±¿¸¡¡³³»E²ajÓÔɽ½Ó§Ë}Âäßɽ]“Ú&vKNŸnendstream endobj 304 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 166 >> stream xœcd`ab`dddwöõõ441%ºóZÿXÌÚÍÃÜÍÃ2û»¢ÐÁ½ü»@€Ñ†A–‰‘‘%øGßÏÞü?¦Íg¼ûã%óOõÕ¢s'÷NêžÈ1­yrCgWWk­ÜŸ¿{+›;[º[%»[zZç5ý HÌhííêíæ˜6yò´‰“*'Ëÿ™þ½‘•OŽ‹Å|>g7W7w7ŸP;>endstream endobj 305 0 obj << /Filter /FlateDecode /Length 29071 >> stream xœÝ½K¯-Çq.8?¿bA·‡ q»òYUF{â†m@¸ƒ–uHÈ"ERÍEZ¯ Oú·wóþxÒ{/ûãëw¥än~¦K¾~÷å»{|ónÛŽÞÇïÒãðßßmy—¶íxì[ÚÞöwKµoçkäëw¿r—à¯ýÜó[;åï{zÛ²¹„GÌU©Ô·­WɈ½êìã÷?¯sUîÛx þjþ^r™žHFìUG{;ÍɈ¹jš‘×Wm/@,‰õ~ÿ|üã‡w÷¯)=ú[O5—LJ?¼c)¦¼UÞö wIo©×LJç»_¿¯oí“OSíû[:Þ÷·MÉïwøËo?üâÝ?}x÷Ëwg¯o;ÜnßòþVNx¦k¤ÖúvTz¦àªÜßZݯsU.¾h¼JFÌUrÿáªáÜ àÛŠÓ€o^J‡)8ÞÜŠ¦`£·Þ{ƒïƒ_Úë€T4/±4˜¾6@÷©=½5Ô„×k¸‘ð¿ ëÇÙ­†¥V’ù™.Q [`Á³œ0ŸÒÖÞ*àžóè'NÀûôx|ýù7_|ÿå'þȯŠ3?f=η#Ú¶·tè»Ï÷:~nO@8ß:¾Òyf,ÎU^)ø6Û–ÞÊÁ#ôzøM4þÐy¾4áH~ˉFà†â©”·Ôh¤o¿ tn‡#uG-‘öÆ­¿tcø tÀÝ÷|k|ÉÞÞ Þ·æ·­ÒÈQßèm'?ÍYÞ¼/hc¥ør|Š}kù­gIù­â|½fÊé­ã{a ÚÞN¼ó¾½ñ‡*Ì Þx?äËS=ß*ÞøØå’v¼íxßsë|PÓî ÅœÒÃ}SÎo'êèonœàÅwzót6üiO¾'6¸múä‡Ë©¾e¼í¹á_pˆ¬¡ºÂeš¬  Ø3ƒe™k"bËðÜMMn E¶çNþ5qæ)9¼ÓÁßÕÏ·î\¶®÷8áÎHž™GŽã qS@T½T†)hpçÒŠ?¿Ã ˆµÐ5%—áw}ñ’Û[Æ;ã·ÜJa]-@Œ¯©…àV·*pÃï@¸UTzžÒ3Á­Â7È50w·šA¬4«åØo5tø˜M\͇~ê< pÀ¾Ñ·×í ÀU€v¥kj¢™‚' ‹"Þ*ð$ßB¼UÔ‚lÈä'2×p›Fk”7vªÖb»«tÄX¶´‚táºJFÌUhSêãU2b®:+‰m¸JFÆ«æg}=ýßfK°9(µ¥y4ŸåõËVv0$p}C5YÉkd°lÑUóÃÚÒëªË–^W ¶t¾ÿpÕÇÛÒÔ@ùûÇÙÒ×Ë]bA×ìÝÀk䲜¯×p#“-KySúY@Ÿ3ÌÈøóßjMwTðݘÓüxüðÕg“5”¬)è벦—r!Á'V./Ú‡´á·~"ql pÊA çáÙpdßÈôÂHÁÓȉH‚‘M¬éžÒª„&“Èl´h"€ ;±°ê¾t‚‡g¢‰¼U¼3X^¾¤5²à¹â“ãøh!ª?ÎN, ÆéößBh—­Þ^ˆ„öŸ~€Ó€¬À[¥ç;R"ք݈xí˜)1Ü\ŒöMq¦hMðÆøºü)0êhZ¾M8Þ8ýãûàTâá+Ù6{'û¶ClÈ=Úð1ð~8rV²è,œôž'ü„öüôŽp¾c#ó¯Eóufze2ø…¾ëKÑB`ÂÙ6žà7ìè7€cÂsz‚H(äA^ÚyäÄσ'¡Öû‹Üvö-ØæŸ€«xvz‰þ´áA l¼O0’…’Ä–'oà:tºñÆ&-oà:?' ÞÀþ%rtHáÐg+äæ4þâŒÞq8Àø8h¤Ñýa$¿±šn^…¼¥³Ñü„hÛÀ}  FN‚Û¯–øYÀm H D¶ówdza¤±838}·  Y*€ð÷¾Ýç'·¦Êf°ë ¥!°“‘+ø.¡_A5x‚^Áïx‰ŒŒWi¨ûºJGÌUêWÉÈxE»¯Kè×ñïê¾.Ñs•„ºÃU22^5ÍÈ0GÃUC𠪻ƒ~LðÛ3Dú ~{oäLŒëp•¬:b®ª•…á*1WÉý‡«†oüØà8oô1Áï(u_нF:Ì!Yœ×k¸‘ð¢a@ ðÜàÁ`—7tgARo øj?&Ü®Cÿ(§ˆÐ@¯¢]}.íž?.Úíóœä„I¨¨#¯PFª†b*ÂÈ)–BBÅžái/*ö ž†P±c $·áP±cXÅ!ŠÄŠ=ŸjX%Vì%ið-±bGE=ÆX±c %×p¬Ø øi óª. {#WÇp±×$F\¢ÅN¡J¢Eð‰v c$Zìu']E‹½ž:;-‚âýI´Ø[!÷ã-ö†ù1D‹P ±!G‹½¡áÚ‡h±zðÚW´ØûFÎÅ+Z„‘S^]¢ÅÞÑhÔ!Zìl÷>‹0°ËÇŠàÐ%qÊ$V„‘&Ž›ÄŠ0r ~ÅŠ½ƒðy%V„‘,nÄŠ0RU9Xìèz²å—`Fº2̓yk@^Äæ¹ûpÑð}iÜ2ãF¹Üvb ¿ÿˆ\®>ØGY·†þI®C.—F8<\.ŒáIæÒÈÉIWNæ6L9K®É\i ’Ì…‘Žë•Ìm¨&eÌæ6|zæGIçÂH–8HÒ¹ ¥Æ‰YIç¶ÊQÝ+Û0›ÀŒ)6FÄt‰‰lnœKQ #M •˜èVažöc°Ñ­‘KV˜mtCcƯ.6ºµ¤FHl4X®,!³ØèÖŠ„eb¢[C@ÕÁD·3ÀI`1Ñ­Aè&–”Mtë[ÖkØD7ðv$*6´4i¶–m4Ü^¸6ºa¦¡ &ºa^¡ƒ‰n˜EØó`¢Û޹ø<˜è¶Ãíú`¡ª&Çëb¡ÛŽNƒ…nû©o.Œø&É ±Ð0r"N_ºðéc0Ðí@=ȃ…†‘C.a Ós” #;ÎþËB·} 4G"Fú`á×cµÎ0rÊ]Å:7¤‹ó¿Å:KéÅsš 5Ú]uŒ†L·ÃU:2^%‰Ûá*¯’Äíp•Ž WÍÏ:<ýßd:5•kLç_™Ê}Åkd0eÑUœ~Mçu•šÎ뢗éœï>\ôñ¦S¹c:_¯v EÒ¶/H]#—¡|½†™L'&o‰'jÓ)‰ÛÑv.·Æt^‰Û¿`:/Åi𩽉[éBdœ¸…, WIÜ6 ;ñí%q #]Ö%q #Y‚>IÜ‚%8%’Ä-Ù^s’Ä-Œðœµsr )IÚFº,hKÚFŠ˜hIÛ’bS!iÛFQ¬›äma¤J˜#y[Éš^å¼mCØ±Ë ‰Û†á/OJâF ­äma@ã2ÉÛ‚Ù<0ùÊÛÂHpIÞF ›IÛÂ@’Tª¤m—<’¶…‘.A¡¤ma¤Š‘´-Œd¼ß+m “Šýxema`(Y[Q¯G²¶0¢Ù|ÉÚˆZhÉÚ’ Áv]²¶0¢q¢¤maDsÏ’¶…‘úƹSÎÚÂ@Ö¼(gma$¡×òJÛ6Äzã¬,gnadç/×Ì-ŒHP¯™[©š§åÌ-Œ–§fnÉW"J3·0ÂEš¸,ìïiâ¶an€ä©‰[éœ]ÑÄ-¹eýüï°§ÖŽå cÔ¦#Wd;\B¿bJ¡jUDZã%22^%qìp•Ž˜«8ޝ’‘ñ* e‡Kè×ñïÇ—船ŠãØñ*¯šfd˜£áªl+ºnà}Ld[1áA(¸"!Ìðï¶Òh¸JâQ1WRœcm“Ž˜ØVî?ĶÃ7~dl[ÁßÞŠ3Ð`“ÿrâv G²/è^±-.åTɺ‘ðcl[[Â…Ÿ:´EµnýG„¶ú\ÚBxG¬ø¼b7yÅnuOMb‰Ýꎺ2Öâ%±\»ÁˆÚ; Þ*ÚÏ}‚7à5 £%xîÛÅžHðF#œ”à HµK`-ÁPñ!Ë›¼U´su Þh¤ÑŒœ¼Ò¦Ñ]#iYŽÞê¤ÌµDoã‡oìfÖ ß`DM•„o`b¶Ç¾ÁH¿¼Â7á ' ߯ŽßÆŽßÆàÆàÆàÌÍÂ0"Ü8ÂAÜ8ÂAÜ8ÂAÜkä¿+ˆ{)´†Aƹ«®‘‘³%d®Ò‘ñ* Ù†«td¼JB¶á*®šŸuxú¿ÉJhg¬Ä_ĽøÿrúÎŽ®âÐk´×U—•¸®¬Ä|ÿ!Œûx+¡aÜÇX‰×Ë]b‘ íª+Œ»lÂë5æ‘ÙJh÷S[ â3±ŒâŒ•øk£8`îSj¬$*Ò‘WTT1eÅFU¢¢q„£"1Õ,4Â9?‰ŠÈJhñ EEƒÝ¨¨¢®J ‡E0Ò%”°h°H#Á§Yß“¸ˆî,qÇEt ‡• ######™ ŒÆŒÆŒÆŒÆŒ^########™ŠŒÆÆ† Æ^#¬’KuÑ6.£m˜}…`ªIZ«D.ucƒË€~SnÀ∮­±âÏctÕŽ °ÜÆ%À¿rcpú˜,ÅÙ–eÊyì9?]´ƒ{œµgZa€‹v\À›ƒ¢Õ&WÙ±ÛÇš~º;]… háöŒ’¹¹ÈM–ýÔK"ì }4I²aØN¬GÃ:°Ãc<à»À&œåñéõÓõ7¬FØ.",\ñpžö X„“Lwãldvpi‹˜|¬7!»„KGxø¢ìCÇÔ2–[â[¶²Wz·£–Îåðÿ)¢i?È{ç\™|Ñë3.¡¶NËJ„°“y¿\Ëå¹À«âs‚3ŸKxQ.€/r—öÂË"ø1 l&ú éA¾ÓЧ^…õ€èNvªˆ®Êè’ã%Èýõ¯ÕfôøN üiï6=¾û¡žé–*QÀ½'ª"µÒdIäÕæ õpQ -ê‰Ex™œÖ?àh&:<;ÕL>ç›GÌ _=í¾óæ¾/rÁhp¡d0 Ƙ'#zPûu|«œyR7æ*ûÑdÌñµÂßõz$Td|$N˜>ÝCà¿MÞŽ–3áVg†áíèè9)y¾ïôu|/à Ôa¼WáI^8x™Œ‰Æ³ñ}héS¦éä¬íîé…£·™¾Kæéà0 ‡xšÌÛFoâ¿ o… ‹UÒçW`7™˜FNÒÓMAôŠ !ìÆ]!_iHm/~Á±Ó€"Rì‡ñOª—×ü–"Ê(Ó½êÉÒ1óìæÐ¿è­?ÂhQ1›yŽæÐ¿tËøÒàØÂÿï€x|itŠñ³•rO7ÍÑfÌä¢?v¢ó&µuù1x…6ÓM¡{Ç*(ÃŽÂ0óM«ÃÅÓ£×@·ÛÞXŠX,-âØYŠF¦=ëœYh(f$#ÚHnþ}D’ÎÁ^vüø™$‰6¿ Pšã9Ë6’[FóHO…ûèþÂ\T²Òp;ªÍ{:Ùróï¸@"îÈÂÏrèieÉͽàJ·+K‰ð9‹6›¿ Á{kôðmÊÓÉ;’åô‚úôtß­ÒÓŸ<5˜À€Ëp³ƒø’FÖ‘ 3¦èéq¯Ù_íQ1ÏHO°]Âx¯³°;OF€|;ƒÂWTéJ·R¾2¸‰@á'kóCn—>ÙÓ'À…Ÿ¯aUŒîá˰gìDÀð/yó†û éYd—ì  ÿ†|÷žðÁ÷Žßq$Ñ"¬“ÂT‡z;.2Ƙ=Ç~;׳³SQû¨¤;.ü.ôóÜø¸5s9ý ¨,~ª´WJ œ\põt€ŠÐâ&q1Agaç´RÝÆ=[aYbLÉ(×4‰âQIâî•Ä¥2àŒ€ç'l¡K'eï៤X·àŒ°ç'LÑØ çˆF®è«G§¹ÏŸøàC›¬HH¤¼¢õLII"=@#ôùY\(+¯ñÃ|4̹<B#ôùY\èkçÛg‘¼Ä„Ð}nWÌžyË|ØîY€Fàó“¸PX¬iÇÛq çÓ¡6B¤ŸÄ…‰­~¢LæÓ¡6B¤ŸÄû)Býd¢=\”€§K¼üêð4‚¡” “ wž"\ʸPxKï¬äáC´9>u¼œÈ;‹•hwéYv±ˆ“ZD÷bº§ t¼0~¦.i¸I-"È{1-h¦¦ÒZf¾¬–Q‹ó~WV+QMÂY(ÿûtzaÞÏâ‚&26u ƒ¡V˨Ey?‰ –àÜ!®¿òóOZ!ÞÏáÊjÁÄó“lEÖ àý.žM6n€Îê`Z¥ˆŸ±µJº×„;dh²±`ìé4"B»—Њ‚ZZ8A`½h#Úî´PÿkYTS®ÿ°„(;|ˆ7èñ·¿@ï;;•Œ=gBˆÔÝà–(-ƒõ„»ú_ºîe¿xt$½åFUèOË‘¶{Ñ/x;;\O‰ ,#DêîE¿âuÎ)aûÎJXšˆ(ÀË~Áë‰÷Õç®n¡‰€œèùîåÀûòµÄ”CM?¤z]–uh!=àǹÞÈAíà0ïä‹RééÓñPÀ1“üï)GvGRDÇ”6‘PÀ0Nü÷¢E2Ç¢MÜ)¾KHlH(b/ÿáó¾Ð¦Ë`–‚~q²_à²7ÆåU”f(¢øÐF Hêù±´&Wœ¨‰eL© EôâeK8)qÙXê¼ñÙPPÄ/^ô [RhOjÝÏCAi9(¢/ü…1Ÿè¨§MœÕ‰†"Žñò_H÷¨´÷߀)ËCÇxÜs2n%ÖéWºÆòPÀ2 Þ 0Ž5™81QÄ2V ØœÇÃ*y ’- 9Žñ0sOºÛAÏ٣ܹæ (ÕÉ–‡’ñò_ÐL(Ši?»dÒ'"ŠHÆÉaQ°y ’¶Í<- ãE¿À%¶Ï¢]gÔFå9óPÀ1¹Ô]`™y—èÕF7¦:ä¾K…†–z£j/ªVÉ ’Ѐh­ÌÕI²=®®ÑE$æÑuKkÛ&›Î {øÏE4æÑµ€Næ'Ö~K&ËR]Dc^ ‹U©a(@aÓ$½¥ºˆÆ&€­œäÄ{(áñÙÇŸx."1‡°•Ñ¢šÌ_3§Y–‹(ÌËAj0ûDXXAZÕQhÎQ˜—ÿÂhUjÐ S‘¤†x¢¹ˆÅ¼üå ’úȘÃËâ)7."¿bºˆÆ¼üWFëDAá pÄÄt‹y¬lÖIÊu´SC Ãt“y,ûÒÓnBœÛE\–qw*íÏÁv¼ƒrE솵ò8Ý›nU™ø.â2±•]='3,ÛETæáE‹4¸ùaˆoEîh85Î2PËh±´0ƒšÓÚ´ßÁÄœž=’<É5á]" ‰9#VôXZÝQî?Ð¥ÒÄgDŠK¢Gä;í¶ÃÏZMÝ CE¶(YâŒHÑÁiCdZ¬£Ÿ²Žbx3 E§{;ˆ½ÕȉÁ‡iÞgÄŠ·4†ÎE•ÄãÄkiy,Ì nËÆÉØ©·ÎÓ[DZòø¶žD ìáS¯UÒj¶"–Ù"ÚòXyød‚À­Ò”»e¶€µ<žä¦µà©K¬;'nά5h±E¬å忲'3,?º¥µˆ²f«©$ÖO S³f¿-­”å‘´ª–+܇ Ù7³¼iÓ–ÈüMHÒTB€#Å›‡Û0%Y*Ÿˆ-"-¥u¢«vîmRe5x$¶ˆ´<”î’ãÅþ!ó]Ë-¯œåÁ´2x‡4t)ºly-"-‡'ÆÊ©)$„µoÔžš¦‘ó œñ´°xhqwNiH¾ØrdÄP·Œ(u#è8°Á°ñŸGÓ)›NüækqÙPdDLáJÜŠ­8¨ÛG¿Ê† CFìçÁ´²wÒŽÏY”²¡‘!#úó`Ѝ@øœ&qÕ®ö3ɳØÍ/´GÀ>š:øt~"U:dI]VtŒç…½¤î³ìº!{¢²ˆ¦œ°ƒ¬aÑEbnz‹³³5]$~QYDS W {&]ËÛ'&‹XÊ#`q¢Žïµj¯ËdKyظÅ$:gÜq§žˆ×2YÄR«¤S¦~¦{-ìÄLD±Ôl/¿¼RnlzÏÅ“E,åe—Ì÷ǰd¾ñÉøh²„`™,b)‡¨…™¡íàðbÓDdKyH­ÌYÏŸÞ8Ö·ä1—Í56¢DlÕ>Ö“E,å±C÷*'kÉ^é—§#­€±8a¯s:ÄY³£÷DÌ⬦)×t:]ƒVÂéB`Ø'b‡‚ ìR<ÈÌë|¥Jêx¢†Hí½ˆT•Ž”OìÒþÌ2C¤õ^D ¨…bÂSG¤Ç¯a¯õ^B‘‡-󃡴¾_Dy'fˆÔÞKh•&©dFsžœè"¢‚Ù<¬ê8à¾[fEéÒæEx,Xþ8Øí¸’H_D\à°`‡Î94ôo¤=±¡‹ˆ <4O;¡³¤N\ð€—>çd69Õ,g ô&ZˆTÞKzµjIuá˜Vå…ʼnŸ­ÎžÖZò§.ÚÆ&|sK ‘Â{AÜ30°^•žrÒÝËpB¤ï^ ȼ\Ž‘´,ùXNˆ4Þ hÁÀ;eƒk re…H㽄d‚:× ³3Æg„ìù: Éjm¤”^H †Àƒ7p{]’¢`£¸‘R:)-´´%ö³Ò®aü¨¶‘JzÝs0îk?ilÕ Š/µtÒËgUL6ÿA'íj-‰ÑåHO'Ò#AÝ Ç•íe“r«ÊNO½ìš+M—ù‡Ôz]ŽôÔ gÁŽEú€€\¥¾Ö¨r¤§V6 ­¥Ì¤Ç MJ)¨—ŒåË*ŠËN“lDizþۤđ‚:ÑÈÓ»^ úÒºE:Ua­ GêéesϘØßEÈpÓùIƒíô²YèkáÃ’ñà@)0©§—Ђ0!2M´ X®5r£Â‘Šz i–œ‚iÇl‘ûœøˆÎÔ5ü¶j©‘—ÑB±`r«às—-}FÕ5rs¸ 4\Þ Ÿ«iZÕhÚ¬E~úîõªœtV.žòJÖ¨h‘M ¸ª‡ÅÓ>ÐÑÅIt³Õ³@‡¼hnµ ·C*“4‘˜ô,Ò!/˜u %…yX>QtÑvP´H‹œhj¥Œµ]u‰VÑ"-šä³ ´=½íW ütZi—Ï8;ã^ Œñè ÑíÔ ­’E ä´P)œØÌÀ”ŒœU²@ƒüü-8Of |ÞÕÄÞjY¤F~ÍÊÜùx-Ìa‹qZ´Út÷šU†é~o±ß¥¢g«šÍ²Ú!ÝÏà‚r2;|X˵“6H÷3¸ÀþÆlØqy7Ц‹ûY¦Zò®ã%§-eˆ€îås}lÜC°ÞÒì”!º—Ïú™{#÷óÐo« Òýü-¨áþéð`ÑÏá-:;m´À$Ÿî¢àAÑOà½bá•xó"ESKPüË-R÷¸½·ò‘àº=Õ€)Êü‚·ÀÉÔ«ë]uYÀ )BɬŒKµ‚¸>7«¬àY$E(q¸â|:®¢bÇ 9ŽØ)B‰ŸÀ[ÜTnXݱm8ûÊINü.¿<=»v“´`Šâß“»{’³Õu±zŽ…{™{ˆwæ\ •³»¬`¡¹WY@ü¤않 ¥@ÈÈ5’™¿[)B4ƒYOܱÄ-S&¹FB›TcÍ]…²KØ~L?+×HhþYŒxn/=kÓzT+Ø@lþu¸ÖOÎÄëºvL›ÄÈÈ?9?NÝ*i× +²HþÉù±6JÎWÜ+Á¦dš¿hnü÷ñsq¢©âë.vÏÌ_493ô¹ Õ'Wl¯*‰Ú ŒfÇ?»T¿rGñŽ«ìKÛŒfÇ?;ß X–ž«’>f0šÿ}üŽé ó‰1 .¸}ëèü÷ñsU­š>›Þ:z£YbyqÉÄiÚÀ¾uôFþû_™eô:Ô¾uôFþûDwÆa¾ªÃí“FO1ÏÌ¥Cöóô¬ç;LO=…ÿ>Á×NérŒ^ææÑç—á[ýú±=2úm}ü~þìðÓÑö?¼K_À|·=þåžZÔökSHåè»ýQ²÷Wn WZwʰµmK|$\•*ü†××6 Á½~ùîOp%6n‡×Âu¥òÀ]òp/ª5ÜöÇwŸ?þíñ <ÝpiÚø?ùç÷ÏÇ?~x÷wÿ 1…v‚gòáð.tÉ#çþ†µÕt¬@ëÏwïaú?ÿæ‹ï¿üûÇ_}öý—Ÿ|øã»úq4˜£“ò”ø#Ħ8Ÿ¥@$?þL—à¬âSų˜6@p9Jã,á{Ÿ¯|ïùú{«æñï;5)/‘‘ñª„«Lm¼JGÌUg¿ÿù¯Ê}/¡_Ç¿—\¦'ÒsÕA]BÆ«dd¼jš‘aކ«V"fIˆ}9m` `šPä¿~zûɧ‰g8ÞCP§¿ä÷šO~ûá  >àv𸙋st¤f®âlu°:2Ú³è*L‰Z z}ò² zÕhAçûW}¼E ‚?Ê‚¾^î :dÇèüéÈË^¾^c™-h¢¾Ž?½Ý1€Û ÍÀGžŸ‹,(¦$Œ½4Ù¿±´€ÅØ4áRLÄì<Àˆ™ cçÑ"~²ÎTØÈ²¥ý%h6IëA¤2x¾U$\¥?ÉÒ6=X>ˆHÇ6ìT2Ÿ0ç_ÉÂbuq¯ãq™“¸7:¢7‹g˳=Çj©Œ7ÎU¬.vÁ¬dÂx7SÚÁhï…m­7&ìÝ}Òw^ÃKØ­‚œ‰¼‹%ÄêF7>ÄäËa4ÂVkA7ºóÉ;ƒÒQ©MGÁc yv°ŠŽ\"e wæ R”ýqï2º xê3;Çšduþ.0ì肜UVM:5肜UªÎ.Y]tWèÎ8Qï ÏÕøS…Ò×4Â2–sÐéS´àæ|£0ï|ð}@- ÝYA CY žÎ.È žÂQø½Xê''âh66þÔI'¿ü‹¼mÔ#•DÊgFoà)æÒ!} 1ˆ%ÌŸÂ9µ­Æ¾1ßž¬‹;È»´¶–s›îŠÙxqÁ¦²\i´a2§ð'ç6nFŸâF|º]rgÎ>oçÁ Ãó3(…x×=}yJA—d%K£m¬œG iäacðd˜ºÜÀL/U8—º±|ѱ¼pÐÙÀw%ŸàWnŒ®Úi9?“ÝÐ«ÌØóJ#o¤£¿š‡žî è"\¨FŽ)¿&“õWnìö©ægŸîÎ)Ê“ìTǹæè"?Yöcsä£Y-Ùv¢µÂôõß@ÍÄZ…Ñòøôúéú[Æžjƒwl’“‰ò6ÝÀ@ªK Ò˜uÚ˜EB ÖÉÖ¬çíÎWQ½,4Üîrþ({½n|®,•Þí¨¥ÐRûõÿ)¤i?|ÿÆfl¾èõŠ”hG Ä.',&ìïH†ªfÅ!v'M~q9Õ|M…bïn—å?üT>™æw=m$ÃO,—Ä"^µñ‰# —'[xUÆø.‘žý•2ßl¬\”ê!´µFIWpº¹ZˆOúH5éÖõÂg†¥bÎð {v¦ñ³O÷uÑÝr˹p,¹¬± A!C¿*eúÆ1MoÚVe~Ÿé V»¢yÃdB+ªE&Ó\ÌÏJ§(ÐÉy,º”¶~fg×mr´‰,rÍñô:ÑÓúg/xh—,™ƒš¸aÜ&K ÂP¡“s¾ŽçjzݰI»h%쨯=§¦Ssïfº‚© S;}&½ˆ¹ß¶Ü¾éB›Dµè2¤®h*Ü#ØÉ7Ь\·‰ªTiØ‹fÃ?Ãb~6Í4É|O3ÍhråpÙ`ÝËa)½€9©‡ì£¬À¡Íö‘Ï/)/P‹hÕ¸#—¼Þ©/`eÌ·Ç@Â:A…›²§«ÝÜ$“h¾ý3Ü«oÅå(ÌØœW7ÁA ÑdÓ¾NÜÔB¾ÖX2Q¯"cbj¿jA^‰&Û¿¡™~*ªÀô"ãçÀsâÓUð=É#šlÿŽªåï¼Ç'‰ìsQǵ’ëûøš' eßQž¿¥áùµ$ž›e l Ó¿ä­m©­ÙcrSªwqG¢¤e²B™ì±A_Wù+7O‘ŒÛÓI;¥¿@·ºö¡§·kŸb#îH”Ó .¶æõΟ<Š–XXYrô/¨’Õ Àµ§ÑNŒ”ÕUšdÉѽ DX÷2ôâÑ/g…b¾U:“Z}Àîetï°aG9¬ßÚJ“rÄI!"´»9¼þ†á½»37iD„v?‡÷6w>h™[ŠÝŒ>X÷ówG×ÏÙÄ©8ä¬^£ÖýõuNŠåª¥Uqg'}ˆ°î§PÙ‡j†É5éÒ×µI71Çúk"B;mqÁÈ­Ø -Q" @^Ç«‡ÑˆíNH÷ä_O>`ÛµõפÚ½””úã*­Ö–'T1ϦÆÒFÎ…jCш&!-L/©æ†›D™}¬¾ºä%disjVç¾mXE!­X…‹”ÉI(bmˆt`I8ÄU3Fá"uòºß·Q{æ÷äå—Iß"]ò(à/êrÆJwöQ¹&u‹TÉO ÜŸŽú¡$XS½¤E®B|:m‹4)×n·n7‘ºÚöÌKO ~ĸm TÉ èÞçÇfd÷ZÒÝñVÛ"Mò2’ùAÍ2Gõö­JéÐqÕk”-R$/¢ûÍýxÌ8Í$¦ Ä´Ú©’‘ö §=‰|cÝê§:åVÛMòº×-ôèq/Øvìj­¶EªäE$ó“ô(*ÞØÈ»œ¥R [ÏÀåU=É#Û!ß!«³ïÀÇ!nùÚÖ5ès¤«NB‹Ý.{¯‰ Åž³:Gªê%$ÄÏÇuí9ŠeÜ [½¬›&}Žt5—sç¾²™7Œ[:ye¸›PRØF]õSØL éÚ"_d®e'ƒÕæHS'ñ(rúÀl’ÿ=ùL$TÝ{ÝXeŽÕÉGî~‹¬ˆ¨Ã2vj']ŽÕËgµ¼EI¥²'Éjs¤ª^@÷n9n„ *ÍM&hÒæHS½ˆÔ´0m²÷Ö.¿¤Èr«4±Úiª—’ú%¾ VÅN08ßY_À*s «^Hæö¤û¦ÉuyïÔ¦4VŸ#eõBõ%ðpp]…=±î³Ë³°c8)t¤¬Ôªª„N“ó ]êj•¶¬žÑçHY=Œ 4>^;qîR¥ºI²³cÅÒΘնož®',\«&/ŸŽ¡‘ÀÀŽ<ÔµjÝ®ÙôàŸ#K¶K+&ÎøÀCà6£‡Ä[IºI W,eDtà°r­çÀ«š®‰2":pXùVÜý-_»¶N½#b/ å‡ý¡G5Y€EMÏL§ºV_D\à%¤Æw>J©ëC7,eeÓhØ"¢/ ãXñ©KÚ!b'\ô»XN\ñ€—Ž0ùûCc¢‰+"ÈX†„«.8rü%ǪH«ì‡zÎ\¿†ìçC}«~5§é¼2Ü“-Y®ˆxÀà~¡¢råì¶íÊœ–*"&p¸Ãž6±‰UŲTñ€‡À}°œ¤ƒ«ÈA£åŠˆ<îJ‰DRW·ÍPE@Nþ÷ù˜Á~&’?µù$6sÁãñÍLò!˜`RV¯´hï¤BÙ¢-Q?ô§£¢ˆg<”ùOÏüX€v0ôή¾áÅEÏxÜÇìÈê(¨-ˮ퉌"¦ñXÔÞq[kÕ¥œ‘Ž"ªñt#³÷V%߉'5×ÊÐãÏET“‹œç‡ŽJ[®aâîä£>†¥KFÓxÈìµ ÷ˆÓ€,B[‚ú&è™Ø(bšf“¤Ë˜x¼rBàm›x Dã°¨+iܘ*É:‘墈gfé‹dÉUcôW™ùrpƒÌñX&ŠXÆ ß†‹&Ï¿ñDìçÕzÜ0Q@3^ø÷•½²éÔ.š–Š"šñÒŸ þ®º‰Fû(`2Šæò,E$㥿ªœ žžV%³DÑŒG€OV‰^m™õ Å4ð"¢ˆdî‚u¬TÇH‡v½µ$QŒ¿ñxˆ9«,ÒÞºLÖZŽ·4QLÆ-yˆˆ­Øsš9-El§óñ/˜dÎߓب¢'?vlXT¶¢m½èÐ KºÎi~]ÄbaÊkgàß(½H”Þ²úËÑyóð2w§lCe3pßé‰ÚÒÝÈð\Db_ê.WŸˆ¬•¡_Õ¦Œ<ç9ÌÃká,cµNá&çcO4q˜G—]?¦8H*ñp®üoð(rú%ºˆÅœðïœM¤§S<%v6'š‹(ÌË^¦Þý£™0|DÑ¥Kt‰yñ«EÔ‘CaOßym¬mor~›á¹ˆÃ&ñkŽä|¨MÇd9›¬“®Ãç(r褡¹€Ã<îjÁÚF„g“µ–ç"óÒ_dx¸‘í–>dǃṈÃr  YJ{zE®xcÎHÍÒ\Da`šqç^UÚÆÉû¿eyȲ\Da_ºþáÏ›hgbg¦íàky.b10¿¾Õ_Iì ‚mô`0Ãt‹y„E*Á¾ôÙB-Ët•9-¸MÎ’GW’áoÙ.b21‰²z‰QÄ5+z4=z”Ú[QIqÓ3n½™œ1v[j‰Ž;G9ÒMÌriÀ“a÷«gØÓç {]Å+™Ø4bJ0üê݇-?p³£d»,qF¤èÑ4™a"™Lvì¹ã{ÂîE Þ_ÄéHÑCIqҚѬb£pß­qn€G¶†7#RtPZ‘h.¨f¡xKœ+zY¯=ûó…±§c¶ˆµ¼°ƒ|‘<Ýy¿ê¡»U&f‹XË@× ƒõÊ)#©ô¯ê¾Ṉ–€®ô=¦ Ü7G›tOÝš9ñZDZšQð …ÄOË<²ÕÀÐZ@Y‹°³P†€¦'»M´qÖl;_™ö*™4öðÙ·Ï –ºK`5[DZb÷f°wÞV~Q݉Ù"Úòølìwïú³sŸ¹¸7Ï‹so¨-¢-1³ÖA,ÑŽ+#…­gN\Î2Cw•y­üûwbm’ÌŸØ.b3²•Ï÷G#ÍÍà-ãlæA&·Ç»³Ž‰ïxøËÉÏ*KÅ'7ãÃm‰áØÅ b÷K¹˜ÎbM<´€ÓjD–b÷^ÔÔ]#–P#²ô3ø,z¨º&½¨ŸÐ~Ê®ï‰Q#¶ô“/Îÿn›X€ÅçóN„¥‡˜a ZLâ+q¯#l´$‡²JèÒAì–ÚÖx»{¡³&ž3£Fté `ÒÏ1uÑ6®žÄžì例¸Ì#ÀÖÏŽ«±YAÉ›f.,áEdæ` Ç…ú†ýXPMœ|Ãw—yˆxÉ1¡2Ý!ñ…‘”›-ÙEDæÅ—ÄMà´Â‰QÎU¿ö¢ºˆÆœô~[mDZ[‘ú©‰è"›íé*—$EûŸyõÓ‘]Dd_2;Áåu/Ü{ìèRâ4‘]Äd_J=ù¡ z™Æ$O‡fºIç3ÛELæ¦14onà¶ÇœøÊÜûe×Ñ'®‹xÌC,*0;M î&{U×d1™ÙÊ2RwX¶œno¸.à12¾}¦¼Q¡¥²¢‹ô (ø¬ AÜ5;ÊS–ì, 32–Æ?~0&ΪðŠl£µd0¥‡Øt‘U§µk©räÒˆ'=¾‚Ô—.£ã¡„=·{âÒˆ'=¬]¬£aD‘ù—½†K#žôÓU{èr}ËUà¡aO9,b Óˆ(=¾fê”Ú£DÙrße¶¥Ò€'½ìý:®yh>Ÿ˜-Ód>×E<æÄ¯ck5„ŒxtpfÑÊ  –ê"óâ_”—|Ž_ÊÛU[l¨.¢1'~S~döe`ÇÀ&/ åG†ê"›¤øûzBuçX¹žºŸÍÒ\@a^þ‹Õ –ÄÛМµ¥¹ˆÃ&[:¹ûuò÷±Sn —: ËE æÑ¥“ãûÃŒV“6šÒíÛ’\Ä`]¦¬ø8$fdwŸ÷Jeí0?Ñ\Äa\÷Õ;hïNÄA×öÛÏEæáeN»Ã~ãÊ«*·ŸŽç"ó³n•Áž—†ud)œˆ.â1‡1µŠxFi£NgŸ4ö浿U¥®žÛ!ÙŠÐPZ”ÉE;ò6™oÐö*Ý+ F\éaæk…°i:Õ Ã]y~&: ¨Ò£ÌÚE=‰ˆíâÉçzÒóc ›FLéA¦f±H¢Iˆ Vuìì+;R ™Dé!v›/§<Ú¾‰Ob¹Ôñ¤G×-9àV>* ߎëXÃ¥Qzéþ @ÓõØòe;wÝ1aé.â2/þÛP½ö“[bS]åè.¢2/þÀß—ˆ¨'ÚÅDMeÔßé.¢2/~A¾ì(©×Ž´y%дl1™“¿© µy°Î).%ºˆÄ¼ü•Y¸û™Í5{›Ï6›Òëöä+Ø4žzŸÃ>ʼnæ óàRÖ÷ —0ÅE­/{“Æ$ÍEæáu_w‡‡C$F¾T£–‹(Ì+°ŠI ¿:7"lM·š–‹̃Ë.Qh<­U§´>ƒù]9td¹ˆÂ<ÀV6ñdgoßdú'ž‹xÌ#LŒ"Ñ1/yf6<ɯ!³a*Šá“)!#M–„"+9AÌøœ†9‘hr¯ ‘F$éñ¥”?ì¡ÕÕ÷×Þ®£É&"HÒ#LM¢Ï ¶Î ‚ÝôÄ$ŽD‘¤X°þ$öðä%ìýJ°Y(ÒÁë¾^¹nÜÛÇžšb{‘h@[Ö"j&27ÅãÎ8Ãö"ш ½ìïÓ#Ø´W¶¥›øú†æ"ó²×òšæ\Ln¥Ä‚Õ]†ç"s¿-ÌêXÿ/ýãùùG– ÌË^á¸In¿²_•Ÿ]'X’‹Ì ÿžñ±kò–]¥ªå¬ÉE 6‰?²†éªS¦Þ¼{ÒM–â"úšlèuzn^[¬fí›4àtâ·ˆ»<¶ÖäwòDËÎÙß"îò¸2råm³’¼Àã›hR_¨·üq׌¬ûkì6B'tÔv¡iè-à.­¨d-_…²Ô{®ˆ%·üp—–.Ÿs?h…–ØLâsÃo{yhÜ6 5ÈMø¬¹Ñï¥r–«¨ËÆ \ ºe¢|b—ðFü8ËF>»Éªít¢î·å•¬‰@#rôàº7ƒÕgôïjÖíÖ–?nôà²Ac¯܌ϽŠª>hÄ^wuhå6iº¾7Í©½4 G‡­{ÿ¦R!1“Äü–>5:Áß/€âY4/™ú >-»EÌå„ãE={Â1IUê¼ »Eäå[½@§°e¦^„˜øÍs—{´¼ú:ó’[òoº‚hù-"/'y›I6…_OUÄåiðcø-b//û…Ü7&«vm´ Ñ×l=C”%8<†+Op½‘Wç'’‹l˜‰˜ÍNJìø„S­û4'~säå°uŸÇs‰©r“Ü¿EÜåÁu_·&{ õ¬„§#¸ˆ½<¼î˜˜”¸ªE*;,Ãìåàeê“m]ÄɇÏÉ™OGqyt-lU>øTÜP!­< Ë$æ tL ?´I'»TK4ªšˆ.â1ÿ`·×ŽKŽ0MY™&ª‹xÌcÀzRjµ´‚•VfO­{´\1™‡@P‘¯dW¦çßu§©%»€È<V‹Û‰³M|T×Ó‘]ÄdÆÞŽ Nè m*í×9žñˆ*r_-+»œé¢ÇÅŽdp—¿ÚÞß®¾².>“înÚ0t⣈k<î‹úøfxüM2™–"¦ñò_Tíì²ô»¿¶«6 ¨ÆËQ¹°ï2•º‰{¢£ˆkfk·,JÄåM:NäÐeËGÙ8 ÜGϘ"ŸY:ÚN|qšbŸMm›—CNNêR¶fù(â*o—ô-·Èr¹¡žˆV¼¼ï¸;Hà(I3Ë=±xß» …öC’Xš´7ÜñŠ—·j«—å!gUwBXÅËÛfèÆåþÊÒÐ Wǵíy Ÿˆ\œ¼o ]À£ÉØ»ì™Ø'bŪIÎor®V“Œ#ùDÄâ`’hfZë‰?ÜÊUÿiÈ'b€ûjð0Œíޤ󧘊$›¥ iD„àq _p>d+FoÚõ‚Ž7¢óÒt³”¡Œ€<L"ùòȸó[4LŠF,età! Žyj‡ZDæZ³¦ãúvÍŒ¼#¢€E\¥ÓçáR:Xõé(#¢ëìŒ=N±Z€&Ÿ€{:ƈèÀ 辦¦—"ôxjÍ‘¥Œˆ¼Œ¬·9vSBþÕãö8”˜(# '¤ ½º÷ó‘’¸Óuqr Œˆ ¼ŒF_|jÁ C <ø‚]5£Î‘ªzèײWêá9P×òÞ Í‘¦z­2™k„S‘^h“>GÊêE4}™–DØ@™áHãϑ²zEËŸÚ‘(±ròù›ÏY¡#m)}ÊžC‚·À6|¶¼IO–I¡#eõPó5n Ò¦|–žœ"þti«ѽ|;8~2õò‰I£#mõRº_²©Ø ˆ¤[¹'ÔÕ é~û0 4id:RV/£{úä“hú¥Áû¨Î‘ªziV?ØßT+o-Â×rÖ Ï‘®zÝ9ÏH‹|zè)y€I›#MõⱫã>elêB³Ÿ´qÕçHW€dò‹Â~{uÐÎtPÍ0ûVÝ"UrZD¡}“ƒµngÒ¶H“üÞQžŒÀg®îJÍV×"=r¨IàashÖj¾ƒÏ¼ÅuN‰Lªz4óa¨YÇ«µIßz>íÓ)[¤I^D÷KfGá“~qÿç¡‹+/m‹TÉKH½Îz¹Z/:E¬˜º0äm‘&yÝWeá¾R2«Ø6æÔØqзH—¼ŒF·ÙÏÐ>Ïd(Ç@Zu tɋȤ€kå»í|ªó–µ‰³Ñ·@—œ„î¼rì»BJ‚GÀòÜXe‹ÉÏŸeÎQw±™hì¤)]ºªäçï›x’:UoXÆvÝhC„t7÷ĉ]þfžÔÌVÝ(C„t?…AÔ{m.;ødk¸]•öâF"¨û)´k‹cäº5ÖœM[õMêA}¦¬¥iir`. Nç±úÝKÉÒØ¨xì:Þ_Ï œô!@»—ҭ啤ÑK¾V!"°û\À§P°à©ëròŒUˆí~ïBvl¢ÉðÌ’Ó˜"»Ÿ¿Ñ0êF *ŠLO‘¨Ô*Dv?…‹ZëTžž_ØÁ*Dv?…÷®fd U}¢9}:¼FXô“Hl\g;ä^¬I™ìÜtݯ¥$~'JKãBÙk¦½âZåž&bŒÞøì0xô¦Ëd˜èüT-æY¼küYɲЌpç&pUûÌŽGŽKá‹…f„;7…ɼÚ@8àþzäæÍv~&Ù“xK|ÁÕ`ÀB3‚ŸÄEü߳ܮhzßà5£ŸÃÅó7Z(nö”ü—ÁT„ÿŽÕh‹ :ª€^/cþK ÀŽá}êu9gç,êˆ Ð2ëäÊÜiç:<¼–aL€ŠÀâgð^ºx@Ýn×ü˨,~ ïÓƒµRØ_°kÏ` ¨.~ï勦’¬ <>¤C‹Tÿ–÷• 0m{Ö¦ÍR^ü;KnýœN‘_9:Ýãé„ Ô¿ã­#~ò:Ãp{+òHœî 8ëèìIÀJ<’æ¬6K„â ôEOѲ¤é_r±ì‚¥GoªX‰GòôoyŸäix†ÞÿJZ‘Gâô/¹(Z>hŸ'}AÓ0zy OÿŠ l;_Ú4ŽžDM·õPN¡rPu´ƒ›tM‰f{ÆÝrþKe°µ¢¾š‘H4Ûþ×é˜2¸–^›V"Ñtûw\Xà“ú–£rЍ•H4ÛîxÆ4“µi';aÑløg¸„*F&_¥fþV¿|÷'¸0%Ú:»cšüÑyÅeÇÀ¯¿ûüñooàá¾€KÓöÀÿÉ?¿>þñû¿ûWˆm°aÁ Âùðxºä‘±›–¾cswÞ‡ç»÷ ^ŸóÅ÷_þý㇯>ûþËO>üñÝ?}€‡ÀÇ8LÑI5køãÞ)…[Jîægº'Ÿ*žÄ´aß(j<ƒ”˜*·)Ô|ïùþu«\C…çžÐã%:2\•¸ÝápÕ52^uöñûŸÃÈpDOã%üëð÷ÂÇ —\#ãU¥Æ«td¸jš‘qŽ^W­DžÒ£ƒ6¶F‘Ã[+ȈZ#Äý€O>M¨Jéxßß6ý%¿Ì|òÛ¿`œD!VÓS°wàA·…ž(¸ˆ@¶_#æªÜ¥ðéºJFÌU|ûá¢×÷ý¸·Ç7ÿ§¨&$c*v*üþ½òŽìŸá—öúà½ÿK$vª½`{`Q-v¿^ `íz+À«¨>È ?•–ãöKˆÌ 6(¶c%-7ê=?î-}`ýÓˆ“'ˆ5wâÉà…Jn©#fxÓ5³ƒÇš`®•‚Ex¶Ž G°p€>µóŠfÂ-Œèþ#xFS1#0K%¾¾ ûãàº÷0‚n¢yÜÜÙw3­†;c_ÍtÚ‘“ÜM|.‚jÂæbàfrà€¿wJz䜸(0áßäqäè´ú6Œœ\øTÐÿ@‘2«°„xäJÛ¸†<Æî\j¦e’” ùy›ÉÈm*We é¦jô”ñh±dF:oAݧÃm`„cûŒ­°I8y§Í¥$©uLhÂpŸdiJ‘2xƒ ñ‹0u”‚£þtIItFÕ8’É—( ’é«°Om3ŒÝOªý©4:$jÀ@©Œ;/¾¿pOiÎà6 œ„¶kËkûxÓšH?‡ ǛⶦšFžú‰ÍgïÔLùEE+õ1«3ZPwÕkd°4;zCûxÕ52\…îfÁ^W]#ÃUXdÒm»F^WÍÏ:>ýßbÛð‡=íÆ¶åÑœ•×/X½ÛS¯t‚ÂËl]#/FaÒÚÚ¶ëªË¶]W ¶mºýpÑGÛ6:ˆ œm{½Ú%t“ŽÑ%»F.Köz 72Ù¶„Iàý¿Á¶¡o"[~®ëü`dÛÐÿ1¶íR› šÏr?há›Ç×>7–pÙ„Ðv¬ö<ÍDn¨ xŒ ’=s 5Œà~¸OÚO1${¥ÞðU…‹Ÿ@;±{ÆÅwšô 7²û0ó‚ìŽ^,%MÓ~PvF2gná+òÄî ç<ÍHJÌî›4vIi!»ç³s%.ŒPO™‚ „y œÄîØ]͆vÈî/kx4j 6ŽàQµøÈHÙüU;™”ñ>å$ ŠÌˆIl¸sÊMTÈð¤d7p…mè0vm(8œ¾IX”k\ÃH¥>]e;¥¸ŒóÆÃ0rRb‚™æ³Ì#˜O-æS-ù#ðî–¹>•7˜ðžÌöxÙ‡Oå ·»Ó3§Õ6=¯È\¹dxºo§Kv,•8»{JÌ_°a“˜»}¢ù¹§»s–Rùµh·ù‰²›“ ÏÑl˜ • À~ß¹x£Âhy|zýtý ^¾3ã—¾‰ÀžÜ`S…'¹ ‡œ£‘fc‹SÜ \|'»ˆ ¦^E›´Èƒï·²þ‹æwƒ¹ü ¥ƒ•Þí¨À“tN‹þÀÊXWºIpš…,¾èõŠÔ§¯>1KËGµU:ZP†]cIÑY޶WPGbrÉ´C~èIxZÎñÊ;Pæ^µÑÁ™XT¸«2:ÿxI—ƒqÿ*-¾Y­\ZPå°F l²m³á Z8 ˆœªªðŠ+ñN{±÷B¢å¯Ÿ¢Cõ(üIÇ«˜éÚꀺ)Ç`o*ÑteôŒãwñ2¿àZ+·V˜1zê´…\Mö:=ŒF³.AÙÇtà¿LÞŽÊ aTwuc ù”ŸÂ÷¾Œï•Ù¼—´ß¶¯½NnuV§{õ—ð¨S% nÚåß¾qôBþëd®hiÓËixæ•£×ñ߯éæð<‚6…¢’èn73 Á+ÒöL]–Ýž¦ã«½±T…_òÍ~ŠXuŸt ±ùÕ‰¶^ŒhEáìÜGóêßQ¤vPŸJ|ë°¬ÅsÍ«ÿ6Ù8´dÄÒ[ô gTžnò£™½‚a¿½õÆ$¬ÝÛN~©rj}ß0ûÑÌί¸ ÷û+Üäé¦>šVÿ†rnï.ÇW:Œ˜áÑN­³Ié:Û<ó+þ…Â|ܪ &¬¼#iú— &è*kà])ØFóµ±dx$MZȤp¤usôO _ˆÎÊ¢ÚŠV÷Òô¯¸€'æÑ9Å%ÇÓY‰GÒôo¸/º!(̬¬À#aú7¼Çgâ-eØÕ´¦«îæ’w$KÿŠºg48ù¤ÓÝð@"§w$J*¹¤`µ}Ì}û ìAŒmô ¤úô¤V<*wÜS;©ƒ™Á{ìà¾+|ó®MØ-˜"¨¸ \@_‚Ø‚G³rM¤AS„? ì4I·Ý3mÑ!Å¿â=öÑÂä*ê~Ý NVÜ;.ÀƒM$£,Û† œ"¨P[<,A(ÅœžûÊ—/øœáAÅÍ Ì>ŸIE.ÿÅ›±SzÅdÆsS?{‹©.A¹•k¿â¦)núdj‚sU–8²ÎK³ø)w ë•Ó´iöÀ¬•+ÊšªÝ. bȃA!gi[¤(ôóg$kOˆaSÕY … F(¤N1X B¶ƒE°ä6  ´«oj€B?ÑNTmÚBǘ:²ùÐ:ªT# ú \Q~&¿º ÿ¨•$Vú \ óèB¸]IÍ`5¢Ÿ@‘m/"UÌÙêÁ™ [Ö^n°@t¸˜ìûŒ3‹rÊZdÿÂjD?rÿ Xç¬%­§eéB°ñÒX®’? TÙNàâñ u.Ñž }£ Îá3…ªžr©æ˜±ù”â0QhÁêBt/U\äd5Xä Òd‹7e•!Bº“ЂÐ…ÁŸÒ´Q†énЧ5ÔuTšU†ê~ï÷0gÞêR8ötÚ@ÝÏàŠè(Z3æ¨sR‡ën ïÁ8¦5^,7P£5hCu?ƒ÷V K=;J 7È>K£Ø3’ —m†Þ§ÑÉ&ãRõyñ9(Dv/"óö(0u&Ë&,&…ÀîE´ Ÿœ(Œ*]6ku,?ÀÉ'y—~-ð#`°Ì!IC6£p6y-ô ÷ IöIO )“—‘Ìã(‹èG7sn‡”6$í±b5.R'/£ÿ€ªPéT>¯Fåuòs¸P°£]9ÁRÕö¾T.Ò'?‰÷¹œUüpÞŠ6/¶:éS¦´¾5žúÒ€LU¢Ü)©húÌ%ØI¶qY¥‹ÊKi¡b`5ÍEði5.R'/¢•u?ÅøÕ˺*©“Ñ‚à¦?i ­Õ¸H¼ˆTƒvõ•ŸC}ÙbT.R'/!yðõ΢+×&.«r‘:y! C÷H+&éñT6ªGÄIƒªJÍ}) Ëݨʳ"ZÅ»RKÐu ‹ÕçHY½ˆê‹§u}اÓçHY„ڻɺýy¼±ócÕ9RUj~‹Þn†(xtÍi‹ÏÁ‹hãf`t=šî0´ÚiªÀmÀŽzˆI䌫1RÿRæHQ½|Ö¾ «n’4ö¤Ì¦zù,&Ÿ;ÞkÇÓis¤©^BBpãL¦1k÷:Isa†½\{W]ŽÕ h¡ºÀ¶ãà|¥Â^ºéé$ {µ…ùÜê°4éq ¤^: ÚÀiMg½:ŽŠ)©—Žº “³è5èÅIå'b~^ ¶zè¨Î=p ; Ï®’®T£G Jçxã1:yÛÆs©¹ÙAÛ¦+CHQâHA½ä5ÑÃÍÛèÁZ.š‰šõð–F‡Àl'Ä{üŠž¤yäº'ÎOIf={ƲDDNük‡Šž?{9TOD$àä¿r¨h^@šRL<q€Ã€<¿œÍCRж¢™7è—¶é:¨%ŠˆlÀΜ¬gÿÐF,Ò=üzä Ç^>÷¬°I± %Ëñ°#OD$àų˜ûBç@Á,nìJ–ˆ(À G7+ú¦? KX[:ÉâYžˆXÀKgÁ XÆOÅB§˜Ã‘)" ^¢8‚ÅëCK!Î1¤¾ÇÕô$q¤Ðù»OG8á/ˆ·ö1èºÜD8,2̲ó-»új–*ð°Ï¯³t-ûÑ»Ïí …*ðXùjñ‹âNTÐÀ©þȬ}µjÊÎRB î^ÔâuЮJ^h*â÷–xùèжÂxä4.G"üØ…Œ(’µo=í{}Ü‹+cá˜x}†s"Nñ¾eìýÄÒÆ ïD¤â…½Ž™qù4zûH<©xQ/R…¿È)–u"FñXpŒ”˜¦CÄœX'"•Œ@¢Oi$1ñ*­ý€Ûí$¹ííÚ“;ðNÀ)^þ –É|„X}›cy'à/ÿ• aLx–çs,ïD¤2É_t‹–µ -q=é1¦ËXéDŒâ°² ´H…å†\Í5‘Žc/}+ÛfÔZT‘»3NTñŒÿ‚yª„’×Y°E<ã対dAX¿Øµ¬¢·²Kn¦¢ˆf¼üe†ÂãN© zÉXýÂ墈g<Öñ~¢7Øô¼VËEÕxÜ'Ó°Öºžü8ÒQD5 x6f]ÜaÑåtCCGÕÀ§¨Ç|Á-{ÃÓ.Bï\T”tw8–QSîYCÎÉñ¶lÂØmå–Í "â¾@Ùï>r]Dda jÛøéK{Ëšh¨.â1¯uº‚˜ kd-Åpã1.»ˆËVKWRø˜´ÇUþù⺈Ç&l­Œ5¿)¸“c6KtyhÙ$¾!†“Ï_Á"|)K±\ñ˜“þ‚ذÂÁ¥R*o©.¢1/!ž *’!Í4Q1<q˜—=ß|£X3Q7êtUGTZߟ”ÝMËrƒ9ᯒ!E8¡©[lI."0'ÿE ×Q’UË’-ÅE æÅ¿xþÊ]ˆq7wÙ›X.`0¿ƒeÁi—O±);ã#ÇEüåÁµ@>Ln«ÂÙçâ}Krƒy|)-—ϵZìxœ\FŠGŠæ`/–‹Ìãkl!Gâ²íJ¶ ,‘˜Ø}¬ÒdkV†H)´%:Çb_ ì€1¢C{–oÓE4æñ%¼ GL<^-ê»4³¯¯³q“;-fïRË™H‹0õwü)XîvHœ#GZ& XÒì~é°§v2rYÖD¤Iλ'ÍŠ“ÏÐX4bH­h][‚80x¸î—§ÉgÃLáÕ[ñEŒëyhݯÓa*ühèÊ–ÄÑžÇÖ:‘EÏß›MÔèhÏKž(ð`;! ïlt3è¶n–3ÌèYÏAkeÞhË"Õz[„‘™G€hXpÈ7nï“D¹qaù.â2{vëœ@KàÀrîÔÒ]Äe³A]±6¿äÖÝMšÅX¾‹èÌClQi/9®Ä”òtœñ™ÃØ}96ÉŽ}>vYBš(/¢3±UŒ¢’TÓµSÀ0^Äfb OwÆZã-Ë´m_Ö-ßE\æ!¶J†Q-Õ,ü?Ñ]Äec·ô°§] 77WÍ{>xµ÷PªŒÌ¥EØbù7mj£(‡¯X.ˆÒÃ뾚óh)ñR ou°d¥‡×=u¶]ûûI@=‘iÄ”^wëlí䫸¬íÚž4piÄ“^ æ”x_¶>—FDéñu¿>‹©´JÄuU”2ˆÒc`Ám|ÊGÁæèÜ3ob»ˆÊlÜ>0?¦º¨Ø ¼ã–ÇÕk!»€È<Ô²<æÖ ¸2MèÄ‚?I‡®‹xÌc`£$8öÆÕ¡‘ëóXènãsxò¹éЖì""sXW"SMLÿÉé°‘ê"›¬éŠ×°B]Ž]wY¦ X̃k0¢’ìü¬ÚcîÅt‹yléÌð¹Fí:Ö¨ãŽ8Ún-ËÄs‰ylÝÓZ­ì̓ÕÓt˜!ºˆÄ´ö É;l¯’ª¦:¤ÍDt‰yhÝÓZ9¹w_*YBKt‰9pÉý© “OÈnâïøÁŒÇqèw)öÆóxª#i±µ(OÜÝ õ£4]–H4bÈ \ Âì;v µ”òã‰Avôà’ÛG÷0}€ (Û°”>PhÄ]‚ÌðìÞD›¹UòÄ ;zp­³l4÷x~\Ñ,ÛÀ ?zpéª(ÙsN•ŸõZO'Gþ*S84àG/ÿ[ÅÅ¥lŠ2»†êËEæ! ÷z`¤“ççÞx†æ"óðS,$»stm47ÞÔ³é Xª‹hÌƒàžØ åî©ÿ¶œ,m©. 1{Òo;m.ýèu×âŸÓE,æ°àµ}ç f‰yÓ,6Ñ%­óÐ9í”$íHt‰yti]•D™BÀ¶I~îrE&¢s$æ±¥r¥õ¡±I†;mGÚØÇI.b0«¥5‰r•u­‰ä"ó¸â/H¤M‰æ']õAâcO=9úEr9X­R_;Ö[ÃÓK/Ήâ"úò¨2÷ŸØå.³¹ËñœÃEôå%Oh·k—¾rÅEôåä_j°sßjœIm‚‹ÈË‹_°3n3ÔJÆÄݬqˈÖ\Ä^“øïÉLNmH%)0-½EÜååoKxÌ¢D|$[ñ_ ¹EÌå…¿ vìh5,IÒÝÐOD/^újª‚¾-§œ±òêØh)(b'•->ºˆ—NÍþ±èZÊ0 Æ‹~Á9åà…¯´_))ÃBÃxñËì§7lxT9²‘Ä‹e¡€dV)©ÂéÖÔ%,·<qÌlÝVÅe©Éþµª £ E㥿ÈXw>€úÕ€câ¡€c&ñ«Û=ç´“¥O(jkY(¢/±'ä£eO.Zd³10Ϋ&ÞÒ£/ü{ÒÙ2é|âVqOGCÅ8é òÉAQ¬Éù&;´$“DTüGgR<EDêïe£‚-ƒ`%Œžg(µm´aˆˆ¼ln)ûÿŸ<‹œj1 hÿlbÿRœŠWSjÃxÑëâ¼ïèÑw^—zÕeM4Q€½e>RéÕjŸô»{É⪡‰ˆ<î«q5ßÒ­»æDžˆHÀ#`A zfÕV%…?EDÁêùkJ ×w´¨Ò…cS7h{oâgÖ’&k“†)"ð"²…‰cóbTr‚r?´tÍ2E@^B·µâ˜WøH¾b䊈¼xÔÚöÇÕ{ü:§¤¼IIàÕzðÅ xáÜ{Ø5µ%~xYù´Úéª|ùibq¯ºAîm—8ÅñtúéªÐB{[á6ˆfiaô9ÒU'#¹?Õ0 õkHKœÓz:uŽTÕIé^wËɇ„mÀÀ¢»V›#M5„'3ÅYktŠ.LÊSV•Mõ0œi&‚E'ôâm3f´9ÒT/ Õ­2ë¨3ßè7Wõ§eŽ4Õ hLyu*nÝ=‰* )­8Œ:Gºê$ÔOÞŽÏ&=Iäd wÙt?(s¤©^>‚Lª'ãX¥)ñœ‡‚y¨+nµ9ÒT/ õyôM¦ˆª6A¦&{Ö*Gjêųªx<éa·óªi²ª¨©“ކXˆœœ8Ð’¬¸”6.“::Kg‘uÁ]ÐP®þ*ƒ¢EZ䥘m‡òÖVø,o¹›-R"?}º*ìû| †Ð…«^pÒ´H‹üÞ'íàÐâÑA§²Ö(Z¤E3΋«uô9«$Í^ µM‹ôÈ‹H‹ÝÅS{ÕºKg+æ® (ƒ¢EJä„w§—€í¸’ù´:é‹„ISÐÚþ5Ë™¼ØŽk ØêT 0^ºyJR”µ•]^†JØŸVzé Jå5fÂýn”åÜ*n‡Q©H]¼¬Ï÷ö|V^aIº%vÒ¨H[üä ü(dvÔÕ€S|u­¥žô)Ò•yî”vÛCשv]z/uÛ¯Š+‹öÌ~m°ù`÷Œã.«ZËkÙÏŸšTn'AÖ$>ˆYÙŸ´ ¹ŸÁU-éFenÝ4Ú!BùLIs5ãØ¼¶µÆ/û¢w« é^B‹l<(â]ŽI"¤Ï"RäGµˆK†y«q-õbF" û 4µòfß­4>{õj™´Á#ÝÏž@“·ïU.>‘H3užþÈÓiC„t?ÉŽýSµ0½‘'Ýt?¸Õ†ënÅrP·o’p>^‹I*5=^xÒ†é~m2¤ ÉlŽ'4mÀ¸Ò¨ß‚5¢ŸÃ{à ÚRåZ^Ç,F“f¶˜gð<Y`;_Û£ T#Îʾ,uÓ Ý-k¿kE?*Ü]äJ߯ LÜT»áb;»ó­ýüEª«KJM‚º«ú ª ý¹Ú}±Ò"KD“.8 P`èço‘HÈœXÝÚ¡Ù] Õ†~#—U×dèèl,Y)²=pDj„C7ƒ÷ËIè.–ƒe[$ÃeÐ!Å¿"ÁFQÔFnëvmN£µ(„±l.µhŠâ^Qž?*ðǵ4q¦uWõ LTŒ2¾n4ÏÚ¹—æö:ØÍ`)‰Ÿ½{sŽ}ÛpÁhÃöjì (E0ñ³·ÐªÊçq£'¶]§_P p2MÞý6FãÔ2¤—ªÅQ„ÿ~ê·‡¦¸jy±1‰©iâÕâ(Àˆ{»ÛE=¨|«M³ºVÔ‘ýjå÷ ãVr¬ÍÅKóFÔ‘Ýû¶D;‰çÊ °¹J‹b+h'ÆYI¦¼ÓÁaŠžè&Þb½Ú‹QGbt¯§+ÜJ’fæ:°f§Ý„Te³AÒýûÝ­7l‰2Âú&c+ëHŽî eêŵçsG˜Ê¨Ôî~êªFÐýë™Êc2æU— )IWž’šdL´{-Ýõõ´ëóV´éÍ$‹h¢'¬­f>B’5±2É"˜gÿ‚‹àô½)•|«F4Õþ E²E¥º AeNÁ€æè¡ñFÁdûgPª¾d­ !LoåÅ€i¾¢ÉðO°˜©xßrÒ£ˆÌ„E“1CbY°´s™ß–//ÄNX4înW™/:Ä-xâaŽM†‚Åã7êV ÷ïjNì ;Ïéü£â•[ÓØÐ¾Pô´þ(s&èù<«ÝÜ<úàü~|«_?¶GÆ^û0Ó¿…Ÿ?{†øè ñÞ¥Ç/à¿?¾Ûÿ‚÷ƒWogF ËÁ‘Ä=sxâ5jþ•ÃÙx‹§IP®Ê'ÆkÙonôËw‚ËpI_2SŠ wAÁvl‹/öÝç{|Ïö\›¶þOþùýóñÞýÝ¿Âôƒ+ÖNp>üÞ„.yd˜†«ùØ=µÇ‡ç»÷0ùŸóÅ÷_þý㇯>ûþËO>üñÝ?}€§øåòþé|ЪM3÷/Øp "ÌÏÔ„ù†ûÿúý?õɧ¸>pô-½ÿîÀ¶¿ÿ_Ÿ|šÞ‡È.µ÷Ÿò)öœLÇþ¾×ýýëó¿ýð ørÐðå`®rÁoŸÁ×ý_xuÝ6ðYàæ÷žn `…Ûõ÷Ÿ}õûïù7pÞ_I?ïïÿƒ®n[Êï¿ýwüñ?}èû¾ýô÷_ÿîÏÃ}žßÒ·{~ÿÙç_ÿùí~;3³Ÿ¶L¶ðS %<Œo=Îâ×ÃÏÏ×Ïx/Ì¡ås|øŸï>üï¿Æé½®üÝðówÃÏß?Ioy¥Ò[â-¾¸¹EôÅ€[ùâñSÿ~ÿ)¼ôÏßÿs}éw7ÏòÍðógÃÏß¾^g¼Ýûž¯ ¦eœº?ó}:ÐË8],¼qF´nÀ”(>Ü_?M†•å÷õWÿþÝï¾û¯ß¼ÿùÛŠµ÷ÿã|ò).G}ÿçÿ| °#R[æò«ï¾úóÛ~÷{½°¼ÿ?>}ýŒMø+Ü‹þyC8ã­ä’ãýwŸÿé}õâY¿éwzey7þÑM¿o¡®Ÿ$ø~õ‡¯~ÿ»ï¿úö›×çóþ›o¿—_Ïòº]zÿõ·_ÀÕ_à ªÐôñÿ·ÿüê»/¾úþª_¶/’äA~óþ«?€f|þ~±×‡~þ³ÿúüÏ?ûùϾùög¿ùd¸=¼éÛóÛÏ^/4Nüñ7ï¯[ü¿o?×gnï?ûÝ÷¿û}¶Ÿ¿^íûÿúÏÿágÿç§öÕöó× ýÇwßþ;sÄýÇý¿ÿix˜Aÿñõ·ßƒº_Ÿú¾ùö‡?³œ¾üö‡×ÿík ¾üÝ7Ÿ}ýùøMŸ#w½‰4q0»¯¿ Ó0üÕ¿Ñ©¹^î¼n8ßCßùÊ|ûÍŸahÂuÆö÷ÿõõWÏøýoÞo?O—p­ú¼zü;x‘oŸÿü-Üë{Äz‚ß ÖÇ+^ îo½¹ç5‰ÿ¿E¿‘ùw´^dœ-# §,ö;uøæûï>ÿüÒ¶ _:ˆI¡Æ_ïÔq6ªÎ.¹çì[P׉ £Þc?™AÓ@ÈÅ’°x/ÿ¯åµ^endstream endobj 306 0 obj << /Filter /FlateDecode /Length 1995 >> stream xœÅYKoÛF¾«ýB/¥Šj»ïÇ!— Š¢‡&Ð-É!~$6,ÉŽl·5Ðß™}³KR²E‡&ggç=ߌ¿.9KŽÿòÿç»_~Y|]ˆøv™ÿ;ß-Ý,~y'ÂRŒ‘ËÍçE:"–Þ0®‚X:#˜ ~¹Ù-Þw›Õš3ɹ¡»Z­Ew?îWk­>tw«µô ¾«îi-çÊÛD¶_IÃBÝÒ{æñ8gÀÍZ­tbã½èxÖ… ƒî>µ|äù"çBwgƒ”✬zžQdJ·Åk|¡9—ÆU‚j)Tލ”©ä]„Žv Žptµµg(Îëˆ)ZP§>¦z‚²&Ù2ÓüIžG•g‚þz†~;<'aëvè@VoBñfnd`*Ú›É,;¢»²ÌkU˜fDÚ“ç òLãvGÞ¿ii¨)†p¨»P~~8¡~`R¹^ý»>}³çŸ.@ÌÞ¬Œ†TþXDöõâÃ*Å•4PóÙjí……œã‹ËdjêÒ3—ÓEóDÚÇ¢©áú_h##u#Ê›ÖEÊïzH‡TŒ‚JlTàR ˆ ü)©ê‚ï^Ú¯„óc[=cgRÁ §bgÆ„uMjêL |ˆÁ,ÈkNÒˆáM^x<ãð·>!Ñýö‰ÐQkÑL¹ÎfÅCzÕeM‡¼=×ã4Í•’E’îýð •½Y¼]$d{x)Ø•R2«íÒqÏš Á®¯S#ó9kÏt5ëµ6"9O+2¬¥fNg×M%DtC—VC¹7³øø’ˆ]t<#š:†°Ñð¡hpt"–)ËnÓïÆ×Èw„¿áÝÈ^+p6õä¶íþ¹fBÛž'ÑûhÝ'6\˜ªvdÁW7akBïܵößcñã滑E$!³Ò•â{¤sÓZVWˆSƒè~Æ)œ 5¼T G&SãT$™FöñÇS2›g¨vÖ¼E؆PŠ¿SÛŒG¹äj¤²í4†²á7É}TM VŒ©¢4ÐÁȘ@RN‚JEëuPOk‹MMiƒ­2J:¨¨)˜Ïxˆ€SsXÿþßç51”>]׈ٔÞ(V‰òÌ…Ñ:\ƒ§Afà†ÙqzŸHà—Ô±š‚”Ž«ñ P·È4aü¾B_4êê¸iЖpŒ;í+$žE|"ÏyR˜ôŠ<ÿ0+TIaÛMr“U`;rvb (÷jj\¸M¶ÂB<ÂQãy,&ŽÆ^Ù# Ô$åtœï['æÞ½£t\O‹´N Cô¶Ú25›á83*té@H’ȿ״XiŽS€É½Ð³á׆›ÓdŒj;MjöÑŒ; ¶$›ý¿f\Ô»õܦ¥wkÉ»ÔE$ÖÐ`# Yj<î‚<Õk‡’ßà<X~ÆðÚ„XFÚ™‰9%ß,¬GVº*¨©¨—"Þ¸™ˆ/¡UŸ &ç¾ ¹Ðߤ/Âer94Þ…PD{»Â5‘€n:D Ê+àîÅæ§÷Ý›áê9—xlU0dCi‰SJo ÍU´½æªíCJâÐÁ‘A?–™vÀdßà&e.>G`¢r€uðz Šš&ÒyøvÑfÊw3Xv®mdH6اÔèo„ò&!Û¼uRþ&Lß…úM`´zŸ‡×wmLÔÕÔ½|¥ŠkâÆ¦ÕJµ92 ~ò1§aÒr´ÔÉÑWÖ8˜T|œA´Œè˜ö¸¨U^~™8 "¢íCöÒ³W)l¥ª24ú› mŒŽIaÚÂe×EzÏ÷9ÆÜDÌ×àߣ˜´¨­Ûn¡Yµ5åBóè£îÍÊKÄÞ£­/^å|-ã‘u݉¸Ç1À„¸:®À^±{N[\L P{!©‹~¬v!0'ûÞ37™ž„qÒ Ahr½t¨ÃgrƒF7¯fÞóö9Á¸)èSùŸ1 %_™6!& ÈÉÿØ´’”nÐ4÷Í€D×s1ÓJÐaµ+Šö†¢‘ç§¡äA)ŠÆxŠÊE>—=%Ó™‘›Í •öà#`ƒL3¹ÎåÀÜß1hF<¥›\8>Içµ§õ=ibVÂwðQ‰ §guZ ¤dÊxù­¶¯*¦¬}>n*ݶ­•bV µ\‡ "G M$W+÷goÿ˜ïe%endstream endobj 307 0 obj << /Filter /FlateDecode /Length 1825 >> stream xœ­YIo[7¾ëWE<Ñ+÷å˜é¡(Š,ê)îÁ[7’íxI‘ßn’ïÉvRˆ(j8œõ›úó’|Éð_ú<Ý-ØòÃâó‚‡Ýeú8Ý-Ù,~~c—\R±Ü¼_Ä|éôȤçK«ùh¼[nv‹wƒ\­Ù¨¼wÞ #Y‹Õšs¡G=¼J»ÊŠáך1)äpŒkϘP|8½#?\õ)¥Ú®ÖÒjà–5}º`×ï;#øp7sqwo¢¿"ëË[übA/iþÞüæá~Éùèµö‘bT†ùåæÅæ§wéc\øá#Xa8'7‰•ò ÷¥0#÷6Šd@ gz $b¸FVô7zæ”\qGh.ðÐé ¾;ͽ¯Î 5…Á¸ä‘vWVcLs]£ûÁb`Ã’ÅÍ%2¸ê .ª3Wq[ƒtgHvU4\ÿ-:>F:ÆT»Í³%WÀÖ3´)¬cfø¶Þ ·ä *ñ®°kçï@$ã&ŠJ¹]a(HÁGé=¤Çæ ’!©Ìî=šä%¢ž Ï{ø•²2ª¼Mz£ 6™á2žñ^oB¼z#Ákc9Š¢¬³,k¡F«x”èU%ò:¹IƒÏ¬®ì¸«])HÛ—­Þçû`:K^FZÁux‰…v¾S8Ë™«b–Þp[¯…õ!E¦œnfI’㨙“JµÁ´aÁØ ,æµ±Ò!s¾rZD­¼’Î!/áЮ¶ŠÇ.“/Ämvd1`ödÙ8KiU6‚]?Dí4ÜzH»GÄâžñ󗼤H\Ò¨ÇKMÉ0¼ÆÔÔgEQ;¼ŸÉž›*B–ÆÈŽ17YG¸œÆ™ ¸7L©ÝQ£5&¥L oêø*¤&Žci×…f ëVº&ö"övÇ3y,U-p˜¬Âuk¤´>O"K£Q‡²Ñæ µZŒí© ¤äÈŒâùV%Á €1¿­œoh×ú Usã"€{ ˜n"°/Z:CÓn#[ÁmH”²ÿŒ`#Ê~ñjB…¹šwb]RN¿m«C0­“ÃÛ–áÎgÀ4ZÇœràé³]ŠÎÛR Ñ¥äU¥2á?UÏzWÉ~ŒY¥˜V×U´‚fÈ ™á”N™¡|Œš{ìè5ÜMÄ­€ð2Ê墱×ô %n·m"Ô1 ñ|“mø”Î4@š1•ík&pm7T òžT’ …k~¨äà} lÛªoºúHÃA—Y“ÝшŜ¦/mSl½Sµr¢V‡t˜îÈ»‡çhNÛ§mÇ4]Ö•°d#,ô·3f<ß“¼mñ¼ëP‹‘B½bj4ÎMË>Aðåfñzg•›ùñ¥ŽÄ<¿(­GgìÒ Ìuœ_8¹JÖîzò5–κúš£#rÏ‹ÓÃPƒD±Ü>Pq×ð9:é›9¹} ¨#yÚbÑ’DG‘ ?Ô‘ÉQ´Ü‘Æ)×$Y5£71òmn†ë}²…vàq"ŒZÞUý”ËiD€~¦ËÜDü)%Ìcf¼ :Œë6_®Z[ííúÇçÈÄñ1è™g¹ˆ ಓ}á›ëœï² ª‡4ZÎO«ÔÝœ÷Ö×Ù’‡áïËJ+ ê¹™‡ªEiNbîK°»49÷·•Ã}‘»Öã™xÛ·†Æ;â©ûš×˜eIÜ:ËÊœ¦ñ2;š…–h.ê.š¤&©Nl›nñ¼oÙ÷$<Óá|ß&‚æa2›Ò>­ß[ãFm¡í÷ C(4ü•§î[ºùB2{—Ù ¶‡Ñ äõáŽ0–'ê•qꯦ"Ѥ,e’¯ 9kÕlôÍåÏ×è»1Ù$°ÕæP²µY¶®Ëåy«9q&ºÄu6D ~m£=º²@‡±’Ý+@Z<ÜE*°¬¥‹œ{ÿšŠdÚJ£@+ÑÓ5€! @|Ÿ÷᪠3I%ö :ig£ÄëÍ?}§VÉ5Ð$A¡1˧Ãö¢ÛI€-šw]'nCýx,(j5c *N^FÅÄ–T9<4¼¬=Q¸Òu׬ÂDÃô$ÒO®©@Û€¥±Ç§£[x%”ÞÄWB °^•ú*e¬D ŠK4ý„û}+jòèCÇ©MÁµ’çL’OmÝÃ0¦ïÁ—ãåzøóÅmÆ(]*ƪéžoVH‡uäh˜Áá»HãøÄàxX÷¹`W#‡ŽïCSˆÎõt_ò-ìhE8aô2¢wþýDc¯êûv®}ìMÒœµ\Û2T:ŠŒ ûçàb;5znù&˜Ÿ0z;E|ï¨ìG[ÚÉ‘9ÞZ¢FÑoµò_¤pG#«Q+• _gð>ww.¼LjhÚkš^tݽ¬ÁÆù z¥'‹' W‡vÍ„•õƒØ’PŸµ6àÉ„*zÂØ¯ÿ Þåendstream endobj 308 0 obj << /Filter /FlateDecode /Length 562528 >> stream xœ¼Ý_“cWv¦÷{†?DEÛE» NààüS¸/dÇŒ#‡=ê _¨uÁ&«›‘UT‘mnüÙ½7°ÞwDa?‹lÉcGŒª³. ‘@.œdþ¸ÿéÍËéüæ¥ÿÿñ¿þá‹—7þ⟾8ß>ú&þÏ×?¼ùŸÿÅÿø×7çëiº.—7¿ÿÓ÷âüf›O/Ó~~³Nûi½No~ÿÃÿvýòÝËéºïÛ¾½=þ|þòÝù|™OóÛß÷Nû¾Ÿ··ß¾ïÿã²ïóyú‡ßÿoí–öã--ûiÙ—½ÝÚï¿i³ÿCç6o]ßþíáÏ÷äÏ/—å>ðÕ]Ÿ®§ýÅó~üªÇûËËåz~ûõ—Óùôòr]ßþã—ËåtyÙæ·Ç¿ÿóý“Ù–Ëùm»×Ó:·û½½J>|óå“Obo¿¶?Æ~Ÿwðí7ýÏËËËz‰AÃ;~YOóeÞ4¤¾ÕöÉœçÍ·úO¿ôVÏmÊù´ÏómÊ»Ë|=]–åÍ»6o^®Û}ÚíKxyy9_ö·ß¶/l@æKÐÖ·?öÿý©ë¾_÷ëÛ÷‡ø›þ—ßõÿçëÃGîÿôtÚÎoˆaÇ¿ò oûŸ_Î×e½¬o?~ùî²æþÔº ýé~ÎûþöO‡þc|®Ó¶ÜïÔöò2Ÿg?`ù©ž§­ýC×W_¦ø¿9üù«üó³ìr=­í†_}âŸüpûšµ'ÐËùv—ŸÜ‡öú8·gà«/Ú¿ú>ÜÓþp­§å|^î×ñ1þþpÇ~º)Úsüoñáº.§ée~ýÒŒ»÷·‡?ÿÝó??»ÛS»µ9ïöíyOÏmº^Û3æ²´§ÂK¶gåy›¶WïŸ>~zøòþ9­í)ôÕ󧃞¿ç}zõþ—Còóë¼7×Ëyê_Öó«ÇôöÑoî÷öMäötÿðeûÚî[ûîòdÎí¶ŽwçÝí{M{yÏk¤Ú3}?mËöæÝy:Í×ýr„>¡ö½oî_Èóýÿù—ö jéÖÛîß^ç—í~O^QgÝ¿öô{¸ÝøïãIãGëøýpxÂ|¼ßÒr¾¼JâÃóöú>>þÿØ¿ž—sûz¾¿ßøyÛ>j¿~Îëé²õùù0í_þññ™¯•­}ιFÏãsë/‡Ïþ³ïW÷¯s{^}ÚmÎí)ÛþùÏ¿u~÷úÕ×µóþúûãÃw‘iYÛ·ÁóÛ?Þ¾¶?]ŽàÇ×±g¿¿Ï¾´»sLß,Ÿ=àK{^&=<¿9üƒ_þ|üfy¼³? þüþ¢\×ÓuZýe>~'úü•ö§Áõ?_‰þÍÀÿã·Ï¿ ¿›ööíår‰—Û¶}þÉÿxxÕ}Œ?·/À«Oòøì|ÿø¼Šþ»ÃÇ?[U¿ìÁjO†e}ñÎhŸS{ оèëçï¯Íg{ç|ÚÖýé—ùÓãgñä3ýñð]ú³§ß“/ÿû_ñÙµ·çÍŸ]{!]·þmu©_H×Û›¸û G÷°õ^¿t¿¾§Ü^¾gyÖåÕ‡¿ý²½yYÖöõÕ¾yòðîS//ÿªWQ<¼¿æUÔnu¹žO =×ãÏø\Ÿ÷ejð/y®Ÿ÷ÏžëÛ¯xŸw{®ç9~¦ÿå—?¸m·Ï×|pÿ›ÇïJßÇ»‚©Ú7h-ÙÛcÿîúÒ7æã>׳«]„ø]õ´¶÷ßíŸÿîoy®¯ßòÜnå/‡ô¼/Ã÷ÞÇõü—Ç7é_ ý¾¯S{l÷¶gn;m»ïØá7‘öÞò4ç;ÂOƒãÓã›Ç§‡ßê=j¯–_ñæxmïòúEë_ù}:M—õ¿Ö§øW¾ÿØýÍÇÚÞ'´—×zøfx{vµgÛëïk¯Ÿ O…¹=/ò¹ÿá< Ÿm‹'ß~Á¶xöÙÎí­ñ4?½â‚wpã·n—WoÝn/ש}¿®ñ~`þüÅÚßì¶÷²ó~ý•Û&_™íY¥ ”>jyýðø#_ó?èû¥ü5ïôÛízÞ ÖYoúÛÉõú|ü¦r»³çWß1?» ½½Éë»~ZnïtÿÝ¡;^“¿Ø·GC×.¯Þõ^ú;êõõÛÈ|·ðÙsãÓãý¿^ýÉðï~ÿÅÿõÅý‡cŸÆ?/{ýÕÌ®/ýmÄüfé/ ¶‚n?0›^?½cþ¯Ý^áóözô«7»ãïhçöìÜ|Ô¾ ÞÞî¾´OðüæÝ4µ¶}oÏï·ß÷ÇO_}ú—?¼ýûw׿üþ?á]õ¿ñûÿþïß~ÿõ_~ú¶_åÎoÿ§wýÿ^Û · ߯~þêô§O_ýðþoÿ/?¾ÿÝW?>üå‡÷Ÿ¾ûúoÿ—ö|÷áÏ?ýwýoþðåooÿøí+üýÇ?ç_ÿýoÏsù‡?|ù‡/ÿ¾ýáüÛ¸ý€+^|÷[ÿ§o¾:ýðñ ˜^݇ö—÷ׇ®oÿß,O¿Õ‡Ï·{û»ÛgÒ>Ç~#íYÿ²·÷Aq3?~ÿñç>þA7×þÉýzÝû«í¿ÍúîÏùô>þ÷KûæõíÇþ ÿyyûÇ÷ßüçÛðk{‰mûãÚÿêûï/¿ûýüOÿ®MßÚE›yœÞ§ÅÞçëÞ·Wù‡ŸßúêëŸóÓì÷÷'?Z·K—û'òs{4.¿ûÍw?|õç÷¿i7´ô/z»s‡úËOï£{˜ŸÃw~úùýW‡‡ûãŸ7úþÓO?fû§Ÿª»x»‡ýn}øó§ï¾¹ü®½´Û}ZÛÕÔÃ}úîÃןÞõÓá ùéýO¿ÿËÏß}ü emUþýÃ÷­½zöÜ¢Ó׿ÿ]{RþæûïþüíÏ?~÷á£'dûú›¿úþýŸ?½ÿáì·;tÿøý_Þÿ¦?Ÿ<Ò?þ| OûÿáìÛ¹öüǯ¿íù×ß~Õ©÷Ÿ>ûâ¹ùÎÏŸÛ³4.KÛÃý‡·ÚÃòãÇ?½?>tù‚8ÿÍÔ¿,—ýñ¹ûáãÏùź?qo/ƒËíç䯟¨Ÿ¿î_€Û“ëw¿ùñãO?ç#¸ä}úÿôÛÏ_óç/=×oÏ«Ó?~úæý§ßýÂí1¾ýÍÏß¾o¯Þé¥jÓ²^>µŸÚ÷ v‹OÒW/ªûKÈáOó¹õõW²ûúã?~Õ^öþ¦ýO_ló˛弼ùáö§iÝ®o¾ÿ¢]¼þs/¾ÿâÛ/þï7¾h·Ñž;ó›nßÈÛ3éÍnßúÿ×ö¿}‡_ç7—ë4·Ç¿Í»Lóvjß–ô‘ï¿ø»'U~¤ýß)ªöþît^•?r¨¦½¿9VþÈ¡š·½}鎕?r¨ÚÕÕéÕÝÒÍÞ¯-.ÇÈÉêr^–þçÃãàª‡Çæøhe…+õüf9­SEåFmŸþuYÞ\úZÜöûFmïÂÚ½.ýöö|z9þýM{^Žs‰¿iO›ùítü›é8íÚþÆÏ¥þ`\–öhÌíÖ—sûœô‘i^Û}½Ü>§'U[NçiõG^Uíýå©ýÝ¡Š«éežÛ_*}äU5Û'º«øÈ«*îë¡:Üû_ôÕè_‰wýK²_Ú—cêÏ´­]Ý,÷/Çí+p¹®í9x½Úÿè?ѽnÓöÃ%þæ–MOç|î\¯ííâvx¥é#·o1ëÞ>âÏï³_ŸúŽp9ï“¿%Ü>÷ËÜ>ÇãŸo‰¾'࿇ÝÞ´÷yÛÚ€|ªž§sÿWŒíþì§ëK<6¿ÿréo%¦önþçO_}ûåy¿½ïþ—o>}yéÑÞý|üº¼ýÅܾC~÷ÓLJïgÝw´sùÖøüf=]Û“áÕ«í|»²îßnÖÓÔÿ æ_´w÷í]ç»óéÒÞ7Ooöþ£Ÿû¿€Ô߬í1ï—eí½ì¼¾Lçü»~ Õ÷Ö»ö†{î?íÉ¿iíyŸß¼»½¼ÛÜœwiW’×ök÷dj×rù7zÏßÞ_ÿªOn9·'Pûú¼´kŸíþÉýñv“S{ç½´+‚w[û¬o_ºoâ¯Ú?Ñ.E×7íÛB¿–÷Çû¿›×~÷Û—pó/æö¯ËÒ^;óy·Ã?ñrš¶öúmÿÈtÙösþÍ»6ìÚ®ßô¿.óáæ{¼\æ7íÑ?|pî—Áí6ÚwW·Ý¾Ù¬ëÔâö®äzÍûbéü×]ŽßëÛ[œö‘ó«ïÚŸWù‘|71½Lí;Ëñ=G~äP]ú×d9VþÈ¡jOÉö=îXù#‡j½l÷Þ9TŸÑñsüW¼º¬÷x|+ônj;uz¹ô÷;ï.ñçö>æÝ¹ý¹ÿ(¬/àm[noŽò—\0í›w{Éî‡×†>r| <«Ú«v~ý&Ç•ßä¸:¼Éñ|¿ÉQu|“ãÊor\Þä<Þ×CõW¿ÉißfÚîYÿßäø±ñ“âz¾^û#—O|}$ßÒøóûì#orÚ[˜—Û´ö.æöqÙ·Óµ­ƒy]ûwŽøùëß×LçvËý;X¾¯yû~zÿç_}hïi¾ûøý«ïÓÿÕÞ«\_ú¿“i/âù¥_ Þ«Ìýç­íkÙžö¥=¼ƒx×–ØÞßv´o“kû»ã»Žþü6­½Ñ™ç—ã_õG¯½[h«øòòòúŸiÏû¹íáö¸·7§ó¿Ý;•©ïõ¿Ú½º¬Çw*íÕÜ®ôÞßÝß_Ìí#íY_Š/ëáG{­Ìý[›6/Óá}Dû›¥­ˆ¾uÏ~ãvû«k{†õ7"ý[É|yõÏlí¹4··1ýg/¯þjêcæ~CÓÖßúoÚûÜþÞ±½%y×ß÷mñÃÍû{–ö½´7emÞÙoÿÕïZ¦½½cjïcÛ·ðöxíù¶åzšo?ôh_9ßǯõXûÏZÚÕàËuÙoNÚû„ó4µ·[K{{uÍ¿é¿GÙÿícû®|ÕCñúMËãkõW½iiË»½àÖ÷Üéå:ß¶ˆ¿åN/ýߤß8§µ½!u½8­í›ÊñÝE»æéï_}dïÿ.âø‘ír=më«Ìç~9üHû¸ßMLûËܘtüHû ·¯üñ#s{o3½úH[J—ã=¼¶+¦ö˜¼úH{Äöë«´÷tÛôÿÛ•ö5jOÿõÍ6¯ýÂæ~QÚÿ}³?rÿÁÎcåô·ãíåp«®ýìÇJ9VK–lÇJ9VÛÔ¾ÀÇ(>ph.ýÑz9Fþȱj—tíýö±ÒGŽÕÃg}xÕ¯~3sîßIÚ‹¦¿§ioùK¶]ŠMù³œþ?ü³œø›‹ÿæö㛗̦ãß¼úYÎù¥½­mOèv9wêÿzåä¼·w¹ÄOó>¯Ú—Í9Vçs{óü²*}äU5µEq¾«øÈ«jnWˆ¯«øÈ«ª¿º/çcyUÅgt¨Ÿã¯{3tno»Û«ãMÿ ãÒ®‡ü®³]Êù]gûsÿ^÷w/ýßÜßxöß‘»ÿÖù¥ÿÖ[ÿ:~þ9>±Ö—~½’/0}äÒßׯý#ú§>ÿÈñeùù7‚ö¶èzøAÿ|üFðëŸÄ×þŽíÍҗ릟øœûÏr¶þŸ/ûÚ:~ûÕ·_^úŸ/×þ£ŸûO|úà/çíøŸü9[_í½þ¹}î+æ69ßt}Ùww»=¿ío¿^ý¬èñÑ8_û/„´'f{ÿØÖklœvm«]ûÿÛš¶_Ûžûuà¶µÙ.Úûe}ÿŸ~AÞlñéý:DíóíWÂMíëñµëÞsÿŽ“ööê×Ý<©½QÙ÷jRÿ~²ò¤½½¡ºìÅßûæ/Åßû‘ærÒ~êÉ“Îý›iuÇÛ×»-é*jïk¯ç"ºtQÝñþ‹ÚÕ—eï¿lÑ×?GmÙï[ñôwÕ ŽFö≹·M¸ÎÕýn/¼y«nî:µ·•ÕýŽIó ½ÿêY1èöÖªú¢Ìíhõ‚j/ùÓµüÊ-·_Q)&-ý‡RÕór™Okù‚ZÚÛÄòÕÞ“^ËÔí÷ðª;Þ®Ø^ÊT»Bïÿ$Ojn)_Pýç„å×nÛN—òËҾ뿔/¨~u©žtûrªµ«‹êÕ¶ÿÙ=OjÑ|»ž(¢õTß\ÿFñÉûÅÁ|.'-§êÙÛ¢ývõÄ“úÏНo‹Úeb9h=UÏðóËÔ%^5©½ó®ž¼-šÛŠ*onëOŤëùvUÇ“®÷Ÿ5“Öþ–¶šÔ”VEóåT½êÎýx®'m·ëQŽú¿<*^Q-ê!ÕCÐEPù`.ûí§ýµkÿ©œ´ÎåŽjQ,Õß^n×ÿN­õŽ:¯/õŽ:¯S½£ÎýGRå+ªÿ»ŸòßÎõŽ:÷+îzÒZï¨s¿â._QýŠ»üÚµ+îrGûw5éÒ®¸ËuûU¸êuyYëuéWÜÕƒyiWÜ厺ܮ¸ËI[¹£ú¿¦/wÔå&£ËIK½£.· îjRÿ·äÅuM‹æzG]Úw¹£úO•ËuéWÜåÞ®¸Ëué—Üå¤vÉ]î¨þß](wÔ¥_r—xÿ÷ÿåƒÙ/¹ëIs½£.ý’»øéÅù²žëÕ…¤ÜQ—vÉ]î¨K¿ä.'µKîjG]¶¹ÞQ—~Å]>–튻ÜQ—~Å]OZú¯U“özGõ_à(wÔÔ®¸Ë5õ+îrR»â.wÔÔ¯¸«/ÝÔ®¸Ë5õ+îê5õ+îêË2õ+îòÁ¼¬õŽšÚ%w¹£¦~É]½¢¦›”*'mõŽšú¿‚/¿v×k½£ú/T;jjoË5õ+îò±œçzGõ_&,wÔÔ®¸Ë5µ÷åŽêÿê©ÜQý·[Ê5µ+îk9©ÿ7‰Ê³_q—_ºvÅ]_q—¯¨~Å]~Y¶½ÞQS¿ä.¿ví’»ÜQS¿ä®^Q]b]«/˵_rW[£kïrGuÀWî¨þ;|å­µ+îrG]ûwõX^û¿®¾t×~Å]Ošëuíÿ=§êKwmWÜS9©]q—;ªÛÒrG]ûÚ¬|0ûwù¥»ÎõŽºö+îêuí¿vV~Yúwù`ÎK½£®ý—fÊIý’»|EõKîòËÒ/¹Ëçøzû]bÔ¯¸Ë¯J»â®VÔí—-Ë[ëÜåCÙ.¸ËuíÜå¤ý¥^Q×}ªWÔµ]poõ¤­^Qs»à.WÔür­WÔÜ/¸«çÀü²×+jîÜÕ×nnÜ劚ûwõ`Ηs½¢nÿ©»zÒR¯¨¹]q—+j¾ÿ^z1©]qWO‚¹_pW/¨¹]p—7Ö¯·Ë/J¿Þ.ÊÎÊʯ\¿Þ.'Í×zCÍýz»ü¢,/õ†š—©ÞPsÇ„e³Õ jî—ÛåW¥‹zÒZ/¨¹ÿBzùUé—Ûå«`›ë5·ëírAÍýz»üÒíS½ æ~½]>˜íz»z˜–~¹] ZÚåvµ –~µ]ÞZ¿Ú®Ê¥]m— jéWÛõ¤½^PK¿Ú®¾(ËåZ/¨¥ÿÇ-«¯ÜÒ®¶ëfª÷Ó2-ÕnWÚårZn¿ì^F×z9uxR.§¥_j—_·v©].§¥_j—_·v©].§¥_j—¯ö¾±|ô+ízÐ~ªØÒ/´Ë/Êí?þ[ÝZ{ßX.§¥_h—“Ú…v¹œ–~¡]~Q¶½^NK»Ð.—ÓÒ.´«å´´ëìr9­ý×|ËfªwÓÚ/³«æÚ.³ËÝ´Þÿ3 Ut½éÊ"ZëÝ´öëìê+·öÿ$GõEYûuvõ*èl°úMÅóÚ¯³ËIÓõT>ý2»z=Ýþ âÕ«`m—ÙårZûev=i«—ÓzÓ]Õ¤þ+Ïõ¤¥^Nk»Ì.›þß%/_Kù|k—ØårZû%vùjjרårZû5vyŸº[,'µ‹ìr9­ý"»üºµ‹ìr9­ý"»| ô‹ìzÒ\o§µ]dWÛiëרÕWeëרÕ÷æ­_cWåÖ¯±«WÓÖ®±Ëí´õkìꫲµkìr;míMc¹¶v]>ý?¥P½ ¶v‰]>JÓ¥ÞN[¿Â.¿rÓãoª>›Ô/±‹ßinÑTo§­ÿGÜËÏ®_c—_¹v]n§­_cW¯‚®GÊí´õkìrR»Æ.e~ØNOm§J@œ·õü¦êÖ¯±Ë×ÓºÖÛiëרåW¥]c—ÛiÛSõ餭ÜN[§¯åË ~–ìK½¶~}]}Ýöv]n§îF+!Т­ÞNûí?;RFS½öv…]n§½_aW_·½½k,·Ó඘´–ÛiïØåW¥_aW¯¦}ú¿¥º÷‹ìêÕ´·‹ìr;íý"»üªôÿ4Q9i~ü-Õg“ÚEvù´kìr;íí»|”Ú%v¹öåñwTŸFK½ö~]¾žÚEv¹öv‘=Õ“¶z;íí"»ü¾³÷‹ìò+×.²Ëí´÷‹ìrR»È.~]¾žúEvñ¥»¼¼<þŽêç“údâ4òö¯èJs=¿|>)"+MEO&¥Ò„I©4i’•&M²ÒO:(MЬ4Ç7wPš4ÉJ&¥Ò„I©4)²Ò„(•&EVšYiRd¥ •& J¥Iƒ¬4aR*MЬ4áæ¬4i•& J¥ “RiÒ$+M˜”J&¥Ò¤IVšYiÂÍ¥Ò„I©4i’•&M²Ò„I©4aÒf¥I‘•&D©4)²Ò¤HJ“+Íñ#pPšãI¥‰‘®}鿬4i’•&N’ÒÄIRš4ÉJ“&Iiâ )Md¥I“¬41’ÒÄ›“Ò¤IVš4ÉJ'Iiâ$)MЬ41Òµ/FRšYib$¥I•&N’Ò¤ÈJ£¹ÜQ¥IwÜJ“&Yiâ$)MœJ“YiÒ +Mœ$¥ “Rib$¥ 7—J'IiÒ$+Mšd¥‰‘”&EVš]âG<ÍåŽ:(Mz¬4i’•&N’ÒÄI{½£RiÒÍYi⤭ÞQ©4i’”&Zê•J“&YiÒ$+MŒÖzG¥Ò¤IVš8i©wT*MЬ41ºÖ;*•&EVš]ê•J'm;êɤTš0)•&Fk½£RiÒ$+Mšd¥‰“¶rG¥Ò¤AVš8i©wT*Mšd¥I“¬41Zë•J“&Yib´Ô;*•&EVš]ë•J“+Mšd¥‰“æzG¥Ò¤IVš]ë•J'íõŽ²Ò¤AÛ\ï¨Tš4ÉJ“&Yiâ$)Mœ´×;*•&Ü\*Mœ$¥I“¬4i’•&FK½£RiRd¥‰ÑµÞQ©4é!°Ò¤IVš8iyØQO'mõŽJ¥I7g¥‰“ÖrG¥Ò¤AVš8i®wT*Mšd¥I“¬41Zê•J“&YiÒ$+Mœ´Õ;*•&FS½£Rib´×;*•&=Vš8i­wT*M˜”J'-õŽJ¥I7'¥Iƒ¬4qÐZï¨Tš4ÉJ'ÍõŽJ¥I‘•&F×zG¥Ò¤;n¥I“¬41šë•J“"+MŒ¦zG¥Ò¤‡ÀJ“&YiÒ$+Mœ´>ì¨g“¤4i•&FK¹¢RiÒ +Mšd¥‰“ÖzE¥Ò¤IVšÍ+êi´Õ+*•&ÜñTš8i}XQO'íõŠJ¥‰Ñ\¯¨TšYiÒ·ÒÄIK½¢RiÒ$+Mš$¥‰ƒÖzCYiÒYiâ ¥ÞP©4i’•&M²ÒÄIRš4ÉJ“&YibJ›­^P©4é~[i⤵^P©4)²ÒÄh®T*Mšd¥I“¬4qÒR/(+M”JYib³Ö *•&M²ÒÄIK½ RiÒ$+Mšd¥‰“ÖzAYib3Õû)”&Ýi+Mc¥‰Ñµ^N©4)²Ò¤;n¥‰“æz9¥Ò¤IVš4IJ-Ëéé ýT-°TšÍõrJ¥I“¬4i’•&NZêå”J“&Yibt-—S*Mˆ¬4±™êÝ”J€Tš4ÉJ#)MŒÖz7¥Ò¤;n¥‰“æz7¥Ò¤IVš4IJ-õrJ¥I·f¥I“¬4qÒV/§Tš4ÉJ'-õr²Ò¤ÆJ£òùf¥I‘•&}úVš8IJ#)MЬ41ºÖË)•&M²Ò¤IVš8i®·“•& J¥ ƒRi⤵þá@*Mº9+Mšd¥‰“¶z;¥ÒÄh*·S*MŒör;mVšÍõvJ¥I“¬4i’•&NZêí”J“nÎJ“&Yi⤵ÞN©4i’”&š¶ÓÓAÛ©¥‰ÑµÞN©4qÒ^o§Tš4i{üMÕ§“¶r;¥ÒĨ³ÔÛ)•&ÜéTš0)•&NÚêí”J£©ÞN©4qÒ^o§Tš4ÉJ'­åvJ¥Iƒ¬4qÒ/ø-ÕTštsVš4ÉJ'­õvJ¥I“¤4qÐ\o'+Mj¬41züÕ§ÑRo§TšôXiÒ$+Mœ´ÕÛ)•&Ýœ•&NZêí”J“&IiÒ +M´–Ûé 4Ç“JóÙ¤v—©RšŠPiFÄJS*ME¨4¡Ò¼G…ÒT„JS*ME¨4#b¥©•¦"Tš±ÒT„JS*ME¨4#B¥©•¦"Tš±ÒT„JS)M5¨4#b¥©•¦"Tš±ÒT„JS*ME¨4#b¥©•¦"TšŠPiFÄJS*ME¨4#b¥©•¦"RšjPiÞ£Bi:"¥éˆ”¦"TšŽHi:"¥éˆ”¦"TšŽ@iº!¥©•¦#RšŽHi:"¥©•¦#RšŽHi:"¥©•¦#RšŽHi*B¥éˆ”¦#RšŽHi*B¥éˆ”¦#RšŠPi:"¥éˆ”¦£}üoÆÕ ÒtDJÓ)͈Xi:"¥éˆ®‘ÒT„JÓ)MG¤4¡Òttñ8"¥éˆ”¦"TšŽHi:"¥éˆ”¦"TšŽHi:"¥©•¦#PšnHi:ÚëÅJÓ)MG¤4¡Òt4Õ;Š•¦#RšŠPi:"¥éˆ”¦"TšŽHi:"¥éˆ”fD¬4‘ÒtDJÓ)ME¨4‘ÒtJS *MG¤4‘ÒtDJS*MG¤4‘ÒT„JÓ)MG¤4‘ÒT„JÓ)MG¤4¡ÒtDJÓ)MG¤4¡ÒtDJÓ)MG¤4‘ÒtCJÓ)ME¨4‘ÒtDJÓ)͈Xi:"¥éˆ”¦"TšŽHi:"¥éˆ”¦"TšŽHi:"¥©•¦#RšŽHi:"¥©•¦#RšŽ@iªA¥éˆ”¦#RšŽHi*B¥éˆ”¦#RšŽHi*B¥éˆ”¦#RšŠPi:"¥éˆ”¦£½ÞQ¬4‘ÒtDJ3"VšŽHi:"¥éˆ”¦"RšnHi:"¥©•¦£K½£Xi:"¥©•¦#RšŽHi:"¥©•¦#RšŽHi*B¥éˆ”¦#RšŽHi*B¥éˆ”¦#RšŠHiº™ê…JÓ )ME¨4‘ÒtDJS*MG¤4‘ÒtDJ3"VšŽHi:"¥éˆ”¦"TšŽHi:"¥©•¦#RšŽHi:"¥©•¦#PšnHi*"¥é†”¦#RšŽHi*B¥éˆ”¦#RšŠPi:"¥é”¦RšŠPi:"¥éˆ”¦#RšŠPi:"¥éˆ”¦"TšŽHi:"¥é”f4¬4ÒtCJS*MG¤4‘Òt´× Š•¦#RšŽHi*"¥é†”¦£á¯Î¹ ¥©•¦#RšŽHi*B¥éèR/'VšŽHi*B¥é”¦RšŽ@iªA¥éˆ”¦#RšŠPi:"¥éˆ”¦#RšŠvRšŽ@iº!¥*M7S½›Xi:"¥©•¦#RšŽHi*B¥éˆ”¦#RšŽHi*B¥é”¦RšŽHi*B¥éˆ”¦#RšŠPi:"¥éˆ”¦#PšjPi:*Ÿo¨4¡ÒtDJÓ)MG¤4¡ÒtDJÓ)ME¨4‘ÒtDJÓ(ÍhXi:"¥éˆ”¦#RšŠPi:"¥éˆ”¦"TšŽ@iº!¥é”¦TšŽHi:"¥©•¦#RšŽHi:"¥©•¦#RšŽHi*B¥é”¦RšŽHi*B¥éˆ”¦#RšŽHi*B¥éˆ”¦#PšjPi:ªÇÒtDJ3"VšŽHi:"¥©•¦#RšŽHi:"¥©•¦#RšŽ@iªA¥éˆ”¦£_ð[ª¬4¡ÒtDJÓ)ME¨4ÒtCJÓ(M5¨4‘ÒtDJÓ)ME¨4‘ÒtDJS*MG¤4‘ÒtDJSÑJÓ )MG¤4ïQ¡4M¤4—#Ñ|v$ç­°Ï|vg/gŽfì–™Ãf™Ã6™ƒ9,¬1·r ˜Ãv˜£‰0G3R` óËQ‘örX^ «Ëaar9úlí-G#[GXZŽf$³6–£[1°ް®HZ9š‘®r8èr4#EåhFrÊá [ÊaaH9º•T”£I(‡3ì'‡3Œ'G3RNŽf$›6“£"Áä°°–Ë©a'9ødHr0ã $ÇÅz*nÅ6r8Ã0r›!/7a,7.^ Éä†#lä†3 äÆ3Öb1$ΰ‹óÃbø¼ØŠÅntOÓÂg¬‹áó{±’À‹¹X ‰ß†…åÛðžš½g,ÅbHð6œaí6œ!ê6±{ÁÈmxnãK±Ò¶ g¶ gXµgˆ´ gس g³‹lã`+ÖB¶á5`ÏX‹µtmXØ­‹¹X )Ö†3ÌÕ†3lÕÆ3–b-X©F$Q°Ok±R¦ g˜¥g,ÅZH6œa6œaŠ6ž±kÁmLÅV~6¼—¶gÆgãâZ¬„$gÃÂÞlxOÍÆ3æb%$3ΰ1Î0XVÂç#öîŒteãb.VBвá s²á [²ñŒ¥X ©È†3LÈÆÅ•WBâ±Qa96¦b#¤}® Ɔ3¬ÅÆ…¨Ø¸X‹HlxO-ÄÆ3æb#¤ Î0 Î XŠ•lx#Æ`Ö`ã[±Ò€ g€g,ÅJ0ýv_ゟ<_ÃÂÜkø™Úzg,ÅJHå5,L¼ÆÅµX ‰»†3,»†3̺Æ3æb'tF¤æHÊ5ž±³‰¸†·bÁ5œa¾5ž±;!áÖ¸˜x'$Ù;ï„ÍXk\ÌÅNH¦5œa£5œa 5ž±;!iÖðV첆3Œ²Æ3Öb'$ÇÎŘvÂç#¶þô`‹k±_gìÅNHv5œ±=þÆÜç36Þ ©­ÆE1`)vB"«Ñ½La5š‘¼j9ã.š$šã9)4aŽ&̱ÏÎ9ðLh¬3‡·uÀ™0Ç6s<'iæxNÊLh 3ÇMºLhÌ2¡±Ê„Æ(sü¹ÛdŽÇ$É„1™ã9 2¡±Çß–9&Œ±ÆIŒ9ž“æ˜bŽç¤ÄÏIˆ sì0¡1ÃßV*ÌñœD˜0Çæ˜`Žç¤ÀÏI€ ýå¸I~ õ%4Ë©³Ë^?õ½Î9ÈKjZr[v—0Çì’æ,§â©z@—0Çææˆ\Ò‰Kcp sì-©·¤Û’¶„9W8^ÝÍõá€ægsD-iޤ%4†–Ô<ž¬þ¬ÙƧ3«±²¤FÈ>wKš#b …%5sµu¾î³y%̱®¤9•4g?UOCÓJcYIs+ÇsÒUR#V9¾­T•4G¨æØT“Jj$*¡¹<£þ¬¹Äc¨™«­sДð¹Sœéñ õgsD)iÎ^n„”p[v”4g+·N*J˜#DIc–rë$¡„9”0Ç€’šµÜ:É'aŽõ$ÍYÊ­“vÓIj®åÖI8 Ý$5—r뤚¤9ÛÃÖù|NšÉñœ$“Ô¬åÖI0 sì%a޹$ÍÙª­“XÆØJÒœ¥Ü:)%aŽ¡$̱“¤f-·N*I˜c$IÍRn$’ÐXHRs-·NúHøÜÍ#aŽu$͙˭“6æ˜FRs-·NÂHš³—[Ç,ÆXEÒ˜­Ü:i"aŽI$Í‘ˆ¤9{¹uÒCŽo+9$Í‘†„9Æ0Ç’š¥Ü:)!¡1„¤æZndð¹[AÂ#Hš³wsGš³–['±ãxNZGš³”['¥#Ü– #Œ±s¤1k¹uR9Â#Gš3—['‰#4ŽÔ\Ë­“¾î³y#̱n¤f.·NÚFhL©™Ê­“°>w»F˜cÖs¬iÎú°užÌ‘i„1&Ô,ÕÒIÐcìaŽ9#ÍYË¥“˜æØ2R3?,gÍV.„ŒãûœŽ‘æ¬KçÙœ½\:‰©™Ë¥“„ F¸ÏŒ4g)—NòE˜c½s„iÌZîÓE¸%ËE³”;'Ý"Ì1[„9V‹4GhæØ,“EjB,R²•+'½"ÜesEš³–+'±"4¶ŠÔÌåÊI©s aŽ"ÍYÊ•c¥8“Hq<ÆF‘’µ\9)aŽ"ÍYÊ•“<æX'ÂãDš³–+Ç4‘’©Ü8áþÚ%³Dj®åºI”M"Üg“Dš3—ë&A"̱G„9âˆ4fyX7ÏÆì§b#¥E¤f.×MJD˜cˆsìiÎR®›Tˆ0Ç‘škµn’ Ž DJ¦rÛ¤?æÉaŽõ!5‡Ԭå¶Iz÷ÙòæÌå¶IwsÌaŽÔ!YÊu“ænÊäæXÒœ­\7é a޹!ÍYÊucl‰­!5ÕÓËÒCCø¼í iÎR®›T†ÐRs-×MC˜cas iÎ\îóÂñ˜Ô…ã1‰ iÎZ^¬'-„Û²,„9†…4g+÷M²Bj¦jß$*¤f¯öÍfRHÍ\î›…0Çžæ˜Òœ¥Ü7‰ á¶l aŽ)!ÍYË}“æÈÒ˜ùaß<³ŠßÖ? Bj®å¾IBHsörß$ „9Ûão`>›³Uû&õ 5å¥Ü7IÇ÷7åàxNÂAš³•û&Ù 5S¹o Òœ½Ü7IaŽÅ ÍY«}“^Ƙ Òœú·/ ÂmÙ ÂSAš³–û&¡ Ì‘¤1s¹o¬!1¤æñw/Ÿ5K¹oRÂgn sìiÎVî›Ôp[Æ4g)÷MÒ@˜#c iÌZí› Î9¨À§sÚ5ïZ²ÀˆØÞ£FÄ20"¦± ¼EŒˆu`DÌ#bx  Áˆ˜Þ£ÂFÄH0"V‚1¼Gì£a(KÁ{TPÁˆØ F„X0Ö‚÷¨à‚±ŒˆÁà=*Ä`DL#b3£Á{T¨Áˆ˜ FÄn0"†ƒ÷¨ƒ1Œˆíà=*ð`D¬#B> ûÁ[TBE(!!Œˆ ¡"D„ŠP*BF;BE Õ $Œˆ)¡"´„Š*BMsBEè !(T„¢0"&…ŠÐ*BT«BEÈ ¡+T„°0"–…Š*B[ãBE¨ !/TD¾0†ŠP*Bbx c¨‘¡"¼ÎU„Ì0"v†Š*BiSCEúá"ĆŠPFÄÜPzCE¡8ŒˆÉ¡"4‡ŠFÄêP±C5è!<Œˆå¡"¤‡ŠÐFÄøPÑT拓*BDE(!AŒˆ ¢"DˆŠP!*B†x ‡¨!¢"”ˆŠ"FÄQbDE¤£aލ=¢"‰ŠP$FÄ$QšDEˆ#b•¨Y¢"t‰Š&FÄ2QÒDEh#bœ¨u¢"䉊Ð'FÄ@Q EEH¡QŒ‘¢TŠŠ)FÄNQBEE(!U¼G…UT„XQjň˜+*B¯¨Á¢"‹1YT„fQ¢ÅˆX-*B¶¨Ý¢"„‹±\T„tQÙÅh/*B½¨ù¢"ô‹1`T„‚QFEh#bĨ£"dŒ±cT„QJFEH#b˨1£"ÔŒ÷¨àŒŠÐ3*ZêUˆÆˆ4ªAÓ¨QcD¬]êU¸FE#bÙ¨i£"´Š7FĺQòFEè#bਅ£"$ŽŠÐ8FÄÈQ*GEÈ#Bç¨fªWKG5H#b먱£"ÔŽ1wT„ÞQ‚GE(ïQA¡yT„èQªÇˆ˜=*B÷¨ácD,!}T„öQâLjX?*"þ¨ýcD Õ €T„RȈA*B©dDì !„TDR RȈØB*B ©5¤"䱇T„ RŠÈˆ˜D*B©Q¤"R‘÷¦`‘ŠÈEªAËHEH#¡T„82"Ö‘ŠG*BI5($oNɈI*B%©™dDì$]êåTHIEH%#b+©ˆ°¤Ô’ŠˆKFÃ^R‚IE(&#b2©ͤ"D“ŠPMFÄlR¹I5'ïËI5S½› ;©ñdD¬'!ŸT„~2"”ŠPP*BB© eDŒ(‘¢TƒŒR:ʈR*BI©)eDl)!¦T„šRqÊhØS**Ÿo,*#bR©M¥"D•ŠPUFĬRºJE+#bY©i¥"´•ŠWÞ›BW*B^©}¥"–±°T„ÄRˈY*"e©™¥"r–Ñ0´T„ÒRRˈØZ*Bl©µ¥"ä–±·T„àRŠËˆ˜\*"s©Ñ¥"T—1»T„îRÂKE(/#bz©í¥"—Ѱ¾TTA©æ=*¦"$˜ŠÐ`FÄS*LEÈ0¡ÃŒˆ!¦"”˜ŠˆbFÃSbLE¿à·T Ž{LE2¡ÈŒˆI¦"2™je*"• ³LEè2!ÌT„23"¦™ŠÐf*BœëLEÈ3¡ÏT„@3"šjh*B£y‹*¤©h"¥¹÷Ïü 4ŸœéÈJóé)÷(•&LJ¥I“¬4i’•æxÒAiRd¥9¾¹ƒÒ¤IVš0)•&LJ¥I‘•&D©4)²Ò¤ÈJ“"+Mx¬4aP*Md¥ “RiRd¥ 7g¥Iƒ¬4aP*M˜”J“&Yi¤Tš0)•&M²Ò¤ÈJn.•&LJ¥I“¬4i’•&LJ¥ “RiRd¥ Q*MЬ4)ZNõ +Íñ#pPšãI¥‰ÑzªoÎJ“&Yiâ¤åT={J“&YiÒ$)M$¥Iƒ¬4i’•&FRšxsRš4ÉJ“&Yiâ$)Mœ$¥I‘•&FºöÅh~îÈJ#)Mz¬4q’”&EVšÍåŽ:(MºãVš4ÉJ'Iiâ¤ýT>1­4i•&N’Ò„I©41’Ò„›ëoÉ_êIRš4ÉJ“&Yib$¥I‘•&F—øFs¹£J“+Mšd¥‰“¤4qÒ^ï¨TštsVš8i«wT*Mš$¥‰ƒ–zG¥Ò¤IVš4ÉJ£µÞQ©4i’•&NZê•J“"+MŒ®õŽJ¥I‘•&F—zG¥ÒÄIÛÃŽz2)•&LJ¥‰ÑZï¨Tš4ÉJ“&Yi⤭ÜQ©4i•&NZê•J“&YiÒ$+MŒÖzG¥Ò¤IVš-õŽJ¥I‘•&F×zG¥Ò¤‡ÀJ“&Yi⤹ÞQ©4i’•&F×zG¥ÒÄI{½£¬4i•&Úê•J“&Yiâ$)Mœ´×;*•&Ü\*Mœ$¥I“¬4i’•&FK½£RiRd¥‰ÑµÞQ©4é!°Ò¤IVš8iyØQO'mõŽJ¥I7g¥‰“ÖrG¥Ò¤AVš8i®wT*Mšd¥I“¬41Zê•J“&YiÒ$+Mœ´Õ;*•&FS½£Rib´×;*•&=Vš8i­wT*M˜”J'-õŽJ¥I7'¥Iƒ¬4qÐZï¨Tš4ÉJ'ÍõŽJ¥I‘•&F×zG¥Ò¤;n¥I“¬41šë•J“"+MŒ¦zG¥Ò¤‡ÀJ“&YiÒ$+Mœ´>ì¨g“¤4i•&FK¹¢RiÒ +Mšd¥‰“ÖzE¥Ò¤IVšÍ+êi´Õ+*•&ÜñTš8i}XQO'íõŠJ¥‰Ñ\¯¨TšYiÒ·ÒÄIK½¢RiÒ$+Mš$¥‰ƒÖzCYiÒYiâ ¥ÞP©4i’•&M²ÒÄIRš4ÉJ“&YibJ›­^P©4é~[i⤵^P©4)²ÒÄh®T*Mšd¥I“¬4qÒR/(+M”JYib³Ö *•&M²ÒÄIK½ RiÒ$+Mšd¥‰“ÖzAYib3Õû)”&Ýi+Mc¥‰Ñµ^N©4)²Ò¤;n¥‰“æz9¥Ò¤IVš4IJ-Ëéé ýT-°TšÍõrJ¥I“¬4i’•&NZêå”J“&Yibt-—S*Mˆ¬4±™êÝ”J€Tš4ÉJ#)MŒÖz7¥Ò¤;n¥‰“æz7¥Ò¤IVš4IJ-õrJ¥I·f¥I“¬4qÒV/§Tš4ÉJ'-õr²Ò¤ÆJ£òùf¥I‘•&}úVš8i©—S*MЬ41ºÖË)•&M²Ò¤IVš8i®·“•& J¥ ƒRi⤵þá@*Mº9+Mšd¥‰“¶z;¥ÒÄh*·S*MŒör;mVšÍõvJ¥I“¬4i’•&NZêí”J“nÎJ“&Yiâ$)Mšd¥I“¤4qÐü°žÚN•€8(MŒ®õvJ¥‰“öz;¥Ò¤IÛãoª>´•Û)•&Fõ˜¥ÞN©4áN§Ò„I©4qÒVo§TšMõvJ¥‰“öz;¥Ò¤IVš8i-·S*Md¥‰“~Áo©¦Ò¤›³Ò¤IVš8i­·S*Mš$¥‰ƒæz;YiRc¥‰Ñãï¨>–z;¥Ò¤ÀJ“&Yi⤭ÞN©4鿬4q’”&NÚëíd¥Iƒ¬4qÐZn§ƒÒO:(Íg“Ú»¼ý\¥©ÏÒŒˆÏÒT„gi*³4áYš÷¨8KSž¥©ÏÒT„giFÄgi*³4áYšñYšŠð,MEx–¦"ßð,MEx–¦#:KÓ¥éˆÎÒT„gi:¢³4ÑYšŠð,MGt–¦#:KÓœ¥ Ÿ¥éˆÎÒtDgi:¢³4é,MGt–¦#:KSž¥éÎÒtCgi:ÚËí´áYšŽè,MGt–¦"KSž¥éˆÎÒtDgi*³4]ÊíÄgi:‚³4ÕàYšŽè,MGt–¦#:KSž¥éˆÎÒtDgi*³4ÑYšŽè,MGt–¦":KÓ ¥éˆÎÒ¼GÅYšŽ&8K³«–­Tš±Ò¼G…ÒŒè‚J3"Vš±Ò¼E•ÒŒˆ•fD¬4#b¥yά4#b¥+Í{T(͈XiFÄJ3"Vš÷ˆ•f4¬4#b¥y ¥+͈PiFÃJóJ3"Vš±Ò¼G…ÒŒˆ•fD¬4#b¥y ¥+͈XiFÄJóJ3"Vš±Ò¼G…ÒŒˆ•fD¨4£a¥y‹*¥©•¦"Tš±ÒT„JS*ME¨4#b¥©ˆ”¦Tš±ÒT„JS*ME¨4#b¥©•¦"TšŠPiFÄJS*ME¨4#b¥©•¦"TšŠPiFÄJS*ME¨4#b¥©•¦"TšŠHiFÃJS*ME¨4ïQ¡4¡ÒT„׿ŠPiFÄJS*ME¨4#b¥©èB?âQ„JS*͈Xi*B¥©•¦"Tš±ÒT„JS*͈Xi*"¥©•¦"Tš±ÒT„JS*͈Xi*šêU(ME¨4#b¥©•¦"Tš±ÒTt©wT¡4¡Ò¼G…ÒT„JS*ME¨4#:£ÒT„JS)ÍhXi*B¥©•¦"Tš±ÒT„JS*͈Xi*B¥©h©wT¡4#b¥©•¦"Tš±ÒT„JS*ME¨4#b¥©•¦"TšŠPiF„JS *ME¨4#b¥©•¦"TšŠPiÞ£Bi*B¥©•fD¬4¡ÒT„JS*͈Xi*B¥©•fD¬4¡ÒT„JS*͈Xi*B¥©ˆ”f4¬4¡ÒT„JS*͈Xi*B¥©•¦"Tš±ÒT„JS*͈Xi*B¥©•¦"Tš±ÒT„JS*Í{T(ME¨4¡ÒT„J3"TšjPi*B¥+ME—zGJS*͈Xi*B¥©•¦"Tš±ÒT„JS*͈Xi*B¥©•¦"Tš±ÒT„JS*͈Piª™êÅJS *͈Xi*B¥©•fD¬4¡ÒT„JS*Í{T(ME¨4¡ÒT„J3¢3*ME¨4¡ÒŒˆ•¦"TšŠPi*B¥+ME¤4Õ ÒŒ•¦TšŠ–zCJ3"VšŠPi*B¥+ME¨4‘ÒTƒJ3"VšŠPi*B¥©•fD¬4¡ÒT„J3"VšŠPi*B¥©ˆ”æ½)”¦"RšjPiFÄJS*ME¨4¡ÒŒˆ•¦"TšŠPiF„JS *MEã_SJ3"VšŠPi*B¥+ME—z9JS*͈Xi*"¥©•¦"RšÑ°ÒT„JS*͈Xi*B¥©•¦"Tš±ÒTDJS *Í{ÄJSÍTï¦Bi*B¥+ME¨4¡ÒŒˆ•¦"TšŠPi*B¥+ME¤4Õ ÒT„J3"VšŠPi*B¥+ME¨4¡ÒTDJ3VšŠÊç+͈Xi*B¥©h©—S¡4#b¥©•¦"Tš±ÒT„JS*ME¤4ïM¡4¡ÒT„JS*͈Xi*B¥©•fD¬4‘ÒTƒJS)ÍhXi*B¥©•fD¬4¡ÒT„JS*͈Xi*B¥©•fD¬4‘ÒTƒJS*͈Xi*B¥©•¦"Tš±ÒT„JS)ÍhXi*ªÇ ÒT„JóJS*ME¨4#b¥©•¦"TšŠPiFÄJS*ME¤4£a¥©•¦¢_ð[ª…ÒŒˆ•¦"TšŠPiFÄJS)M5¨4‘ÒŒ†•¦"TšŠPi*B¥+ME¨4¡ÒŒˆ•¦"TšŠPi*B¥*M5¨4¡Ò¼E•ÒT4‘ÒÜû¯ÂVJ3"Vš÷¨Pš±ÒŒˆ•fD¬4oQ¥4#b¥+͈XiÞ£BiFÄJ3"Vš÷¨Pš±ÒŒˆ•fD¬4ï+ÍhXiFÄJóJ3"Vš¡ÒŒ†•æ=*”fD¬4#b¥y ¥+͈XiFÄJóJ3"Vš±ÒŒˆ•æ=*”fD¬4#b¥y ¥+͈PiFÃJóUJS*ME¨4#b¥©•¦¢…~»X*͈Xi*"¥©•fD¬4¡ÒT„JS*͈Xi*B¥©•¦"Tš±ÒT„JS*͈Xi*B¥©•¦"Tš±ÒT„JS*͈Xi*B¥©•¦"RšÑ°ÒT„JS*Í{T(ME¨4áõ¯"Tš±ÒT„JS*͈Xi*ºÐx¡ÒT„J3"VšŠPi*B¥©•fD¬4¡ÒT„J3"VšŠHiªA¥©•fD¬4¡ÒT„J3"VšŠ¦zGJS*͈Xi*B¥©•fD¬4¡ÒT„JS*Í{T(ME¨4¡ÒT„J3"VšŠPi*"¥ +ME¨4¡ÒT„J3"VšŠPi*B¥+ME¨4-õŽ*”fD¬4¡ÒT„J3"VšŠPi*B¥©•fD¬4¡ÒT„JS*͈PiªA¥©•fD¬4¡ÒT„JS*Í{T(ME¨4¡ÒŒˆ•¦"TšŠPi*B¥+ME¨4¡ÒŒˆ•¦"TšŠPi*B¥+ME¨4‘ÒŒ†•¦"TšŠPi*B¥+ME¨4¡ÒT„J3"VšŠPi*B¥+ME¨4¡ÒT„J3"VšŠPi*B¥y ¥©•¦"TšŠPiF„JS *ME¨4#b¥©èRï¨Bi*B¥+ME¨4¡ÒT´×;ªPšŠPi*B¥+ME¨4¡ÒT„J3"VšŠPi*B¥*M5S½¢XiªA¥+ME¨4¡ÒŒˆ•¦"TšŠPi*B¥y ¥©•¦"TšŠPiFÄJS*ME¨4#b¥©•¦"TšŠPiFÄJS)M5¨4#B¥©•¦¢¥ÞP…ÒŒˆ•¦"TšŠPiFÄJS*ME¤4Õ ÒŒˆ•¦"TšŠPi*B¥+ME¨4¡ÒŒˆ•¦"TšŠPi*"¥yo ¥©ˆ”¦Tš±ÒT„JS*ME¨4#b¥©•¦"Tš¡ÒTƒJSÑøWçT ÒŒˆ•¦"TšŠPiFÄJSÑ¥^N…ÒT„J3"VšŠHiªA¥©h‡ß4ކ•¦"TšŠPiFÄJS*ME¨4¡ÒŒˆ•¦"RšjPiÞ#Všj¦z7JS*͈Xi*B¥©•fD¬4¡ÒT„JS*͈Xi*"¥©•¦¢½^N…ÒT„JS*͈Xi*B¥©•¦"RšÑ°ÒTT>ßXiFÄJS*ME¨4¡ÒŒˆ•¦"TšŠPiFÄJS*ME¨4‘Ò¼7…ÒT„JS*ME¨4#b¥©•¦"Tš±ÒTDJS *ME¤4£a¥©•¦"Tš±ÒT„JS*ME¨4#b¥©•¦"Tš±ÒTDJS *ME¨4#b¥©•¦"TšŠPiFÄJS*ME¤4£a¥©¨ƒJS*Í{T(ME¨4¡ÒŒˆ•¦"TšŠPi*B¥+ME¨4‘ÒŒ†•¦"TšŠ~Áo©J3"VšŠPi*B¥+ME¤4Õ ÒTDJ3VšŠPi*B¥©h¯·S¡4¡ÒT„J3"VšŠPi*B¥©•fD¨4Õ ÒT„JóUJSÑJórû ±Bi*B¥+ME¨4¡ÒT„JóJS*ME¨4í¤4#b¥©•¦"Tš±ÒT„JS*ME¨4#B¥©•¦"Tš±ÒT„JS)M5¨4#b¥©•¦"Tš±ÒT„JS*ME¨4#b¥©•¦"TšŠPiFÄJS*ME¨4#b¥©•¦"RšjPiÞ£Bi:"¥éˆ”¦"TšŽHi:"¥éˆ”¦"TšŽ@iº!¥©•¦#RšŽHi:"¥©•¦#RšŽHi:"¥©•¦#RšŽHi*B¥éˆ”¦#RšŽHi*B¥éˆ”¦#RšŠPi:"¥éˆ”¦#PšjPi:"¥éˆ”fD¬4‘ÒtD׿ŽHi*B¥éˆ”¦#RšŠPi:ºÀx‘ÒtDJS*MG¤4‘ÒtDJS*MG¤4‘ÒT„JÓ(M7¤4‘ÒT„JÓ)MG¤4¡Òt4Õ;Š•¦#RšŠPi:"¥éˆ”¦"TšŽHi:"¥éˆ”fD¬4‘ÒtDJÓÑ^ï(VšŽHi:¥©•¦#RšŽHi:"¥©•¦#RšŽHi*B¥éˆ”¦#RšŽHi*B¥éˆ”¦#RšŠPi:šêÅJÓ)ME¨4‘ÒtDJÓ)ME¤4ÝÒtDJS*MG¤4‘ÒtDJ3"VšŽHi:"¥©•¦#RšŽHi:"¥©•¦#RšŽHi*B¥éˆ”¦#RšŽHi*B¥éˆ”¦#PšjPi:"¥éˆ”¦#RšŠPi:"¥éˆ”¦#RšŠPi:"¥éˆ”¦"TšŽHi:"¥éˆ”¦"TšŽHi:"¥+MG¤4‘ÒtDJS)M7¤4‘ÒT„JÓÑ¥ÞQ¬4‘ÒT„JÓ)MG¤4íõŽb¥éˆ”¦#RšŠPi:"¥éˆ”¦#RšŠPi:"¥éˆ”¦"Ršn¦zE¡ÒtCJS*MG¤4‘ÒT„JÓÑT¯(VšŽHiFÄJÓ)MG¤4‘ÒT„JÓ)MG¤4¡ÒtDJÓ)MG¤4¡ÒtJÓ )ME¤4ÝÒtDJÓ)ME¨4‘ÒtDJS*MG¤4ÒtCJS*MG¤4‘ÒtDJS*MG¤4‘ÒT„JÓ)MG¤4ÒŒ†•¦#PšnHi*B¥éˆ”¦#RšŽHi*B¥éˆ”¦#RšŠHiº!¥éhø«s.Hi*B¥éˆ”¦#RšŠPi:ºÔˉ•¦#RšŠPi:¥é†”¦#PšjPi:"¥éˆ”¦"TšŽHi:"¥éˆ”¦"TšŽ@iº!¥*M7S½›Xi:"¥©•¦#RšŽHi*B¥éˆ”¦#RšŽHi*B¥é”¦RšŽHi*B¥éˆ”¦#RšŠPi:"¥éˆ”¦#PšjPi:*Ÿo¨4¡ÒtDJÓ)MG¤4¡ÒtDJÓ)ME¨4Mà`‘ÒtJ3VšŽHi:"¥éˆ”¦"TšŽHi:"¥©•¦#PšnHi:¥©•¦#RšŽHi*B¥éˆ”¦#RšŽHi*B¥éˆ”¦#RšŠPi:¥é†”¦#RšŠPi:"¥éˆ”¦#RšŠPi:"¥é”¦TšŽê1¤4‘ÒŒˆ•¦#RšŽHi*B¥éˆ”¦#RšŽHi*B¥éˆ”¦#PšjPi:"¥éèü–*+ME¨4‘ÒtDJS*MG 4ÝÒtJS *MG¤4‘ÒtDJS*MG¤4‘ÒT„JÓ)MG¤4‘ÒTDJÓ )MG¤4ïQ¡4M¤4—þÚ>(Í¥ÃÇIYi*z2)•&LJ¥I“¬4i’•æxÒAiRd¥9¾¹ƒÒ¤IVš0)•&LJ¥I‘•&D©4)²Ò¤ÈJ“"+Mx¬4aP*Md¥ “RiRd¥ 7g¥Iƒ¬4aP*M˜”J“&Yi¤Tš0)•&M²Ò¤ÈJn.•&LJ¥I“¬4i’•&LJ¥ “RiRd¥ Q*MЬ4)’Ò¤ÆJsü”æxÒAib¤k_º9+Mšd¥‰“¤4q’”&M²Ò¤IRš8HJ“YiÒ$+MŒ¤4ñæ¤4i’•&M²ÒÄIRš8IJ“"+MŒtí‹‘”&EVšIiÒC`¥‰“¤4)²ÒÄh.wÔAiÒ·Ò¤IVš8IJ'…Ò¤AVš4ÈJ'Ii¤TšIiÂÍ¥ÒÄIRš4ÉJ“&Yib$¥I‘•&F—øFs¹£Î©4é!°Ò¤IVš8IJ'íõŽJ¥I7g¥‰“¶zG¥Ò¤IRš8h©wT*Mšd¥I“¬41Zë•J“&Yi⤥ÞQ©4)²ÒÄèZï¨TšYibt©wT*Mœ´=ì¨'“Ri¤Tš­õŽJ¥I“¬4i’•&NÚÊ•J“]¦zG¥ÒÄIRš4ÉJ“&Yib´Ö;*•&M²ÒÄh©wT*MЬ41ºÖ;*•&=Vš4ÉJ'ÍõŽJ¥I“¬41ºÖ;*•&NÚëe¥Iƒ¬4qÐVï¨Tš4ÉJ'Ii⤽ÞQ©4áæRiâ$)Mšd¥I“¬41Zê•J“"+MŒ®õŽJ¥I•&M²ÒÄIËÃŽz:i«wT*Mº9+Mœ´–;*•& ²ÒÄIs½£RiÒ$+Mšd¥‰ÑRï¨Tš4ÉJ“&Yi⤭ÞQ©41šê•J£½ÞQ©4é!°ÒÄIk½£Ri¤Tš8i©wT*Mº9)Md¥‰ƒÖzG¥Ò¤IVš8i®wT*MЬ41ºÖ;*•&Ýq+Mšd¥‰Ñ\ï¨TšYib4Õ;*•&=Vš4ÉJ“&Yiâ¤õaG=›$¥Iƒ¬41ZÊ•J“YiÒ$+Mœ´Ö+*•&M²ÒÄh~XQO£­^Q©4ᎧÒÄIëÊz:i¯WT*MŒæzE¥Ò¤ÈJ“îøeªWT*Mœ´×+*•&M’ÒÄAk½¡¬4鯬4qÐRo¨Tš4ÉJ“&Yiâ$)Mšd¥I“¬41 ¥‰ÍV/¨Tšt¿­4qÒZ/¨TšYib4× *•&M²Ò¤IVš8i©”•& J¥ ƒ¬4±Yë•J“&Yi⤥^P©4i’•&M²ÒÄIk½ ¬4±™êýJ“î´•&±ÒÄèZ/§TšYiÒ·ÒÄIs½œRiÒ$+Mš$¥‰ƒ–‡åôtÐ~ªX*MŒæz9¥Ò¤IVš4ÉJ'-õrJ¥I“¬41º–Ë)•&DVšØLõnJ¥ @*Mšd¥‰‘”&Fk½›RiÒ·ÒÄIs½›RiÒ$+Mš$¥‰ƒ–z9¥Ò¤[³Ò¤IVš8i«—S*Mšd¥‰“–z9YiRc¥‰Qù|³Ò¤ÈJ“>}+Mœ´ÔË)•&EVš]ëå”J“&YiÒ$+Mœ4×ÛÉJ¥Ò„A©4qÒZÿp •&Ýœ•&M²ÒÄI[½Rib4•Û)•&F{¹6+MŒæz;¥Ò¤IVš4ÉJ'-õvJ¥I7g¥I“¬4qÒZo§Tš4IJÍÛéé íT ˆƒÒÄèZo§Tš8i¯·S*Mš´=þ¦êÓI[¹RibTYêí”Jît*M˜”J'mõvJ¥‰ÑTo§Tš8i¯·S*Mšd¥‰“Ör;¥Ò¤AVš8éü–j*Mº9+Mšd¥‰“Öz;¥Ò¤IRš8h®·“•&5Vš=þŽêÓh©·S*Mz¬4i’•&NÚêí”J“nÎJ'-õvJ¥I“¤4i•&ZËítPšãI¥ùtÒí_·TgiFÄgiÞ£â,͈ø,͈ø,͈ø,Í[T¥Ÿ¥Ÿ¥Ÿ¥yг4#â³4#â³4ïQq–fD|–fD|–fD|–æ=â³4£á³4#â³4ïQq–fD|–fDx–f4|–æ=*ÎÒŒˆÏÒŒˆÏÒ¼GÅYšMx–fD|–fD|–æ=*ÎÒŒˆÏÒŒˆÏÒŒˆÏÒ¼GÅYšñYšñYš÷¨8K3">K3"KóUgi*³4áYšñYšŠð,MEx–¦"KS¥©ÏÒŒˆÏÒT„gi*³4áYšñYšŠð,MEx–¦"KSž¥©ÏÒŒˆÏÒT„gi*³4áYšñYšŠð,MEx–fD|–¦"KSž¥©ÏÒŒˆÏÒT„gi*³4áYš÷¨8KSž¥©ÏÒT„giFÄgi*³4ÑYšÑðYšŠð,MEx–¦"KSž¥©ÏÒŒˆÏÒT„gi*³4áYšñYšŠð,MEx–fD|–¦¢©ÞQÅYšŠð,͈ø,MEx–¦"KS ž¥©ÏÒŒˆÏÒT„gi*³4áYš÷¨8KSž¥©ÏÒŒˆÏÒT„gi*³4áYšñYšŠð,MEx–fD|–¦"KS¥©ÏÒŒÏÒTƒgi*³4áYšñYšŠð,MEx–fD|–¦"KS¥©ÏÒ¼G|–¦š©ÞMÅYšŠð,͈ø,MEx–¦"KSž¥©ÏÒT„giFÄgi*¢³4ÕàYšŠð,͈ø,MEx–¦"KSž¥©ÏÒTDgiFÃgi**Ÿo|–fD|–¦"KS¥©ÏÒTDgiFÃgi*³4áYšŠð,͈ø,MEx–¦"KSž¥©ÏÒT„giF„giªÁ³4áYš·¨:KSÑgiö—m…4£A£yo˜hFƒB3šÑ Ï¼5ÏŒuf4ˆ3£A›yo˜fFƒ23„™÷†]f4È2£A• ¢Ì{ƒ&3$™Ñ È¼7 2£A qÌHPcÞƘѠŌ)æ½a‰ BÌhÐaFƒ óÞ°ÂŒf4h0£Ù‰`Þ˜Ñ ÀŒýå½a~ êËh_F‚öòÖôR ÉK5/£Aw©†Ø¥R—j]FƒæR K%$.£Ap©†¼¥â–jH[FƒØR YK5D-Õ´Œ¡¥r–jˆYFƒÊR !K5d,Õ±Œ…¥–jÈWFƒ¼R éJ5„+Õ€­Œi¥’•jVÞv•jˆUª¡ëU5„*£AS©†H¥•Ñ ¨Tsƨ!N©†4e4ˆ)Õ¥TC”R IÊhRª!G©†e4¨(Õ¢TB†R ÊhPPª!@©†üd4È'ÕLåÖa<©†ìd4H'ÕœTCp2t“jˆMª!5©†Ðä½a3©†È¤“jLFƒ^R qI5 %#A,©†¬¤¢’jHJFƒPR 9I5Ä$£A%©†¤2’jˆHFƒBR I5ä#£A©†t¤‘jÈFFƒ4R ÉH5#ÕìåÖA©„T¤B‘Ñ ‰TC$R ‰H5"ï {H5Ä!Õ†Œ1¤²jˆBª!  BH5ä ÕƒŒ¤BjÈ@ª! H5 Õ€Œù£Òj?ª!û ÒG5$Õ|TCî1djH=ª!ô šG5DÕxTCà1ôŽjˆ;ª!íxo;ª™à_8«!ꨆ¤c4•sTCÌ1TŽj.åÖa㨆ˆc4(ÕpTC¾Q ñÆhP7ª!ܨ†lc4HÕlTC°Q ¹Æh5ª!Õ¨†Pc4d•LåÒAѨ„@c4èÕgTCš1ÄŒjÈ2ª!ʨ†$ã½aȨ†£bŒjöré0bTC†Q ÆhP0ª!À¨†ü¢â‹Ñ ^TxQ ÙÅhˆ.*!¹¨†à¢r‹Ñ [TCjQ ¡ÅhÐ,ª!²¨Ä¢‹Ñ WTC\Q iE5„£A«¨†¨¢’ŠÑ TTCNQ 1E5 ï #E5`•QŒ…¢ŠjÈ'ª!ž êD5„ÕMŒ†h¢’©Ü8KŒY¢R‰j%Fƒ&QÍ¥\7,ÕHŒ=¢àˆJH#ªŒ ZD5DÕDŒ!¢rˆjˆ!ª!… "D5`•A¼7(•Lå¶a¨†øa4¨Õ>TCö0¤‡jHª!x¨†Üa4ÈÕ€:TBèP ™Ãhª!q¨†Àa4è Õ7TCÚP `ÃHЪ©ž^( £Ah¨†œ¡b†jHFƒÈP C5D £Aa¨†€¡ò…j€ÞÖ…jª![¨†ha4( Õ,TC®0d…j@*!T¨La$H Õ(TC 0ô„jˆª!M¨†0a4h Õ%TC’0„„j¦jß0#TCŠ0D„jȪ!B¨†a4ÕT|0ÔƒjÊ!dÕ¼7,ÕTCn0dƒjH ª!4¨†Ì`4HÕT`0ô‚j¦rß°TCX0´‚jˆ ª!) BA5à•TJ0D‚jȪ!"¨†„`4ÕTC<0Ôjª!¨†h`4$• TC.ðÖ,PÍD*péßü,ðÙ)ŠìŸQÂ@˜”2&™Ò$ÛÀñ¤¤È:p|sH“ìaRA˜”B"AˆÒRd$H‘• Ef‚ðØ Â „‚4ÈR&%¤ÈVnÎXY  ä‚0)½ M2„I)aR’Ašd3H‘Ñ Ü\ªA˜”l&Ù Ò$ÃA˜”r&%¤Èv¢ÄƒYR´œêAöƒãGàÇ“‚£õTßœ !M2"ÄIË©zö!M²#¤I‚„8H’™Ò¤I–#aB¼9iBšdNH“ì q’@!N’(¤È¤#]Ñb´Áá犬 1+¤‡À®' RdYˆÑ\-¤;n\H“¬ q’x!N _Hƒ i…!N1„Ii 1šÂÍ¥2ÄIb†4ÉÎ&b$iH‘©!F—øá Fs¹£ÚsCšdoˆ“qÒ^ï¨$‡ts6‡8i«wTªCš$vˆƒ–zG%<¤I–‡4Éô£µÞQ‰i’õ!NZê•þ"DŒ$1Zë•£K½£R!â¤íaG=™”&%DÄh­wTRDšd‹H“ŒqÒVî¨äˆ4È'-õŽJ‘H“Li’M"Fk½£R%Ò$³DŒ–zG%L¤È2£k½£Ò&ÒC`œH“¬qÒ\ï¨ô‰4É@£k½£’(⤽ÞQFŠ4ÈJmõŽJ§H“ q’¤"NÚë•Vn.±"N’V¤IæŠ4É^£¥ÞQ))2YÄèZï¨D‹ôX-Ò¤i:U?<§[ÄI[½£R.ÒÍ™.⤵ÜQ‰iõ"Nšë•~‘&0Ò$ FŒ–zG¥a¤IFŒ4ÉŠ'mõŽJLjÑT﨔ŒíõŽJËH1#NZ땜&¥gÄIK½£R4Ò͉4Ò ›F´Ö;*U#M2kÄIs½£6RdوѵÞQiéŽ7Ò$ëFŒæzG¥o¤ÈÀ£©ÞQIé!°q¤IFŽ4ÉÊ'­;êÙ$9GdèˆÑR®¨¤Ž4ÈÖ‘&;⤵^QÉi’½#FóÊzmõŠJòw<Í#NZVÔÓI{½¢’=b4×+*á#E–tÇMqÒR¯¨Ä4Éú‘&‰?â µÞPtc8h©7THšdI“¬ q’$M²ƒ¤I†…„Äf«TZHºßÆ8i­TrHŠì!1šë•"’&™DÒ$›Hœ´Ô Ê*%‹„Av‘جõ‚JI“L#qÒR/¨Ä‘4É:’&™G⤵^P’ØLõ~ "IwÚF’ÆIbt­—S2IŠì$éŽJ⤹^NI%i’­$M–ÄAËÃrz:h?U ,½$Fs½œRLÒ$“Išd3‰“–z9¥š¤If“]Ëå”p"ËIl¦z7¥„ ñ$M²žÄH|£µÞM (éŽ[P⤹ÞMi(i’%M’¢ÄAK½œÒQÒ­RÒ$KJœ´ÕË)-%M2¦ÄIK½œÌ)©±§Ä¨|¾YTRdRIŸ¾M%NZê唪’"³JŒ®õrJXI“,+i’i%Nšëíd\ ƒRW ä•8i­8À’nÎÂ’&™X⤭ÞN‰,1šÊí”Ì£½ÜN›¡%Fs½’ZÒ$[Kšdl‰“–z;%·¤›³·¤I—8i­·S’Kš$s‰ƒæ‡íôtÐvªÄ]bt­·SÂKœ´×Û)é%MÚSõ餭ÜN©/1ªÇ,õvJ€ w:&LJ‚‰“¶z;%ÂÄhª·S2Lœ´×Û)!&M²ÄÄIk¹ÒbÒ cLœô ~K59&Ýœ=&M2ÈÄIk½’dÒ$™L4×ÛÉ*“³LŒGõi´ÔÛ)e&=¦™4É6'mõvJI7gž‰“–z;%ФIš4ÈD­åv: Íñ¤ƒÒ|6©½ëx9WJS*͈Xi*B¥©•¦"Tš÷¨PšŠPi*B¥©•fD¬4¡ÒT„J3"VšŠPi*ZHi*B¥*M5¨4¡ÒŒˆ•¦"TšŠHiªA¥+ME¨4¡ÒŒˆ•¦"TšŠPi*B¥+ME¨4¡ÒT„J3"VšŠPi*B¥+ME¨4‘ÒTƒJóJÓ)MG¤4¡ÒtDJÓ)MG¤4¡ÒtJÓ )ME¨4‘ÒtDJÓ)ME¨4‘ÒtDJÓ)ME¨4‘ÒtDJS*MG¤4‘ÒtDJS*MG¤4‘ÒT„JÓ)MG¤4ÒTƒJÓ)MG¤4#b¥éˆ”¦#ºþuDJS*MG¤4‘ÒT„JÓÑ~Ä㈔¦#RšŠPi:"¥éˆ”¦#RšŠPi:"¥éˆ”¦"TšŽ@iºYêÅJS*MG¤4‘ÒT„JÓÑTï(VšŽHi*B¥éˆ”¦#RšŠPi:"¥éˆ”¦#Rš±ÒtDJÓ)MG¤4¡ÒtDJÓ(M5¨4‘ÒtDJÓ)ME¨4‘ÒtDJSÑ•”¦#RšŽHi:"¥©•¦#RšŽHi*B¥éˆ”¦#RšŽHi*B¥éˆ”¦#RšŽHi*"¥é†”¦#RšŠPi:"¥éˆ”¦#Rš±ÒtDJÓ)ME¨4‘ÒtDJÓ)ME¨4‘ÒtDJS*MG¤4‘ÒtDJS*MG¤4ÒTƒJÓ)MG¤4‘ÒT„JÓ)MG¤4‘ÒT„JÓ)MG¤4¡ÒtDJÓ)MG¤4¡ÒtDJÓ)͈Xi:"¥éˆ”¦#RšŠHiº!¥éˆ”¦"TšŽ.õŽb¥éˆ”¦"TšŽHi:"¥éˆ”¦"TšŽHi:"¥©•¦#RšŽ–zG±ÒT„JÓ)MG¤4‘Òt3Õ+ •¦RšŠPi:"¥éˆ”¦"TšŽHi:"¥éˆ”fD¬4‘ÒtDJÓ)ME¨4‘ÒtDJS*MG¤4‘ÒtDJS*MG 4ÝÒTt¥é†”¦#RšŽHi*B¥éèÿcì–â`“$íöŽd³dÂýߨîR†{è—ÁŠïhzY$Å0ýŽTÎ7ê¯JS_x+M]j¥ÉK©4yéë×ùƒÙJS‡ZiòR*M\ÚJ“(•&>n+M^J¥©K­4u©•&Q*M¡VšD¿ç¯xˆ>Î7ê¯JSß‚VšºÔJ“—RiòÒ×ýFm¥©k¥ÉKŸ÷µ•¦.¥Òä¡ÇýFm¥©K­4u©•&Ñó~£¶ÒÔ¥Vš¼ô¸ß¨­4…Zi½ßoÔVšB­4‰~ßoÔVš¼ôùÏõÍ¥­4qi+M¢çýFm¥©K­4u©•&/}žoÔVš:ÔJ“—÷µ•¦.µÒÔ¥VšDÏûÚJS—Þßî7j+M¢¯ûÚJ“èý~£¶ÒÔ· •¦.µÒä¥ûÚJS—Zi½ßoÔVš¼ôu¿Q­4u¨•&}ÞoÔVšºÔJ“—RiòÒ×ýFm¥‰ÛJ“—RiêR+M]j¥Iô¸ß¨­4…Zi½ßoÔVšú´ÒÔ¥Vš¼ôøçúöÒçýFm¥©k¥ÉKÏóÚJS‡ZiòÒÇýFm¥©K­4u©•&Ñã~£¶ÒÔ¥VšºÔJ“—>ï7j+M¢·ûÚJ“èë~£¶ÒÔ· •&/=ï7j+M\ÚJ“—÷µ•¦>.•¦µÒä¡çýFm¥©K­4yéã~£¶Òj¥Iô~¿Q[iê o¥©K­4‰>î7j+M¡VšDo÷µ•¦¾­4u©•¦.µÒä¥ç?oÔw—RiêP+M¢ÇùDm¥©C­4u©•&/=ï'j+M]j¥IôñÏõ-ú¼Ÿ¨­4ñ…o¥ÉKÏž¨o/}ÝOÔVšD÷µ•¦P+M}á­4yéq?Q[iêR+M]J¥ÉCÏû…j¥©{O¥ÉCû…ÚJS—ZiêR+M^J¥©K­4u©•&ÑTš4Ÿ÷µ•¦¾îVš¼ô¼¨­4…Zi}ÜÔVšºÔJS—ZiòÒã~ ZiâÐVš8ÔJ“æy?P[iêR+M^zÜÔVšºÔJS—ZiòÒó~ ZiÒ¼ÝïÓTšú¢[iêL+M¢÷ûqÚJS¨•¦¾ðVš¼ôq?N[iêR+M]J¥ÉC§o}ýº°­4‰>îÇi+M]j¥©K­4yéq?N[iêR+M¢÷óqÚJ¨•&ÍÛý6m¥‰oÀVšºÔJ“(•&Ñó~›¶ÒÔÞJ“—>î·i+M]j¥©K©4yèq?N[iêÓZiêR+M^ú¼§­4u©•&/=îÇ©•¦L+M¢óç­•¦P+MýÇo¥ÉKûqÚJS¨•&Ñûý8m¥©K­4u©•&/}ܯS+MÚJ‡¶Òä¥çý—[iêãZiêR+M^ú¼_§­4‰ÞÎ×i+M¢¯óuúl¥Iôq¿N[iêR+M]z»_§­4‰¾î×i+M]j¥ÉKÏûuÚJS—RiòÐÇ?¯Ó·‡>]Ä_•&Ñûý:m¥ÉK_÷ë´•¦.}þû›ªß^ú<_§­4‰î3ûuÚJ_ôVš¸´•&/}Þ¯ÓVšDo÷ë´•&/}ݯÓVšºÔJ“—žçë´•¦µÒä¥ÿð[ª[iêãZiêR+M^zÞ¯ÓVšº”J“‡>îש•¦L+M¢Gõ[ô¸_§­4õ h¥©K­4yéó~¶ÒÔǵÒä¥Çý:m¥©K©4u¨•&=Ï×é¯JóçKUšß^ú\•æ Wš/tTšƒ\ir¥9È•ætUšƒ\ir¥9È•æ •æ Wšƒ\i¾ÐQir¥9È•æ Wš/äJsŒ+ÍA®4_è¨4¹ÒÄJsŒ+Í:*ÍA®4¹Ò|¡£ÒäJs+ÍA®4_è¨4¹ÒäJs+Í:*ÍA®4¹Ò|¡£ÒäJs+Í1®4ÿ «Ò b¥ÄJs+Í VšA¬4ƒXir¥¤J3†•æ WšA¬4ƒXi±ÒäJ3ˆ•f+Í Všƒ\i±Ò b¥9È•f+Í VšA¬4¹Ò b¥ÄJs+Í VšA¬4ƒTiŽq¥ÄJ3ˆ•æ •f+Í þù7ˆ•æ WšA¬4ƒXir¥ô[ÅÄJ3ˆ•æ WšA¬4ƒXi±ÒäJ3ˆ•f+ÍA®4ƒTiÆ°Ò b¥9È•f+Í Všƒ\i½ÝoÔQi±ÒäJ3ˆ•f+ÍA®4ƒXi±Ò b¥ùBG¥ÄJ3ˆ•f+ÍA®4ƒXi©ÒãJ3ˆ•f+Í Všƒ\i±Ò b¥9È•f+Í VšA¬4¹Ò b¥ÄJs+Í VšA¬4ƒXir¥ÄJ3ˆ•f+ÍA¬4cXi±ÒäJ3ˆ•fÐCÿ5D+Í:*Í VšA¬4¹Ò b¥ÄJ3ˆ•æ WšA¬4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒXi©ÒãJ3ˆ•f+Í Všƒ\i±Ò b¥ÄJs+Í VšA¬4¹Ò b¥ÄJ3ˆ•æ WšA¬4ƒXi¾ÐQi±Ò b¥ÄJs+ÍVšA¬4¹Ò ú}¿QG¥ÄJs+Í VšA¬4ƒXir¥ÄJ3ˆ•æ WšA¬4ƒXi±ÒäJ3ˆ•f+ÍA¬4cÞî'Ê•f +ÍA®4ƒXi±ÒäJ3ˆ•f+Í Vš/tTšA¬4ƒXi±ÒäJ3ˆ•f+ÍA®4ƒXi±Ò b¥9È•f*ÍVšƒXiÆ°Ò b¥ÄJs+Í VšA¬4¹Ò b¥¤J3†•æ WšA¬4ƒXi±ÒäJ3ˆ•f+ÍA®4ƒXi=îÊ•æË•f*ÍVšƒ\i±Ò b¥ÄJs+Í VšA¬4±ÒŒa¥ôó¯ÎE°ÒäJ3ˆ•f+ÍA®4ƒ~ßÓQi±ÒäJ3H•f +Í Ušc\i±Ò b¥9È•f+Í VšA¬4¹Ò R¥ÃJó…\iƼÝoÓQi±ÒäJ3ˆ•f+ÍA®4ƒXi±Ò b¥9È•f*ÍVšA¬4¹Ò b¥ÄJs+Í VšA¬4ƒTiŽq¥tþ¼¹ÒäJ3ˆ•f+Í Všƒ\i±Ò b¥9È•f+Í VšAª4_æ¨4ƒXi±Ò b¥9È•f+Í Všƒ\i©ÒŒyܯ“+Í1®4ƒXi±ÒäJ3ˆ•f+Í Všƒ\i±Ò b¥9È•f*ÍVšA¬4¹Ò b¥ÄJ3ˆ•æ WšA¬4ƒTiŽq¥tŸa¥ÄJó…ŽJ3ˆ•f+ÍA®4ƒXi±Ò b¥9È•f+Í Ušc\i±Ò ú¿¥zTšƒ\i±Ò b¥9È•f*ÍVšAª4Ç¸Ò b¥ÄJ3ˆ•æ WšA¬4ƒXir¥ÄJ3ˆ•f+ÍA¬4cXi±Òüƒ®J3è •æÇŸÿ2ø¯Jó»UΠVšß­rÚJ—¶ÒÔ¥VšºÔJóçKUšB­4þ¸¿*M]j¥‰K[iâÒVšB­4¶Òj¥)ÔJS¨•&¾­4qh+Mj¥‰K[i µÒÄǽ?þúýîP+MÚJ—¶ÒÔ¥Vš¸´•&.m¥©K­4…Ziâã¶ÒÄ¥­4u©•¦.µÒÄ¥­4qi+M¡Vš@[i µÒzüºµÒüù;ðW¥ùó¥¿*M¢ç¯ûãZiêR+M^züº~zÿª4u©•¦.¥Òä¡Tš:ÔJS—Zi¥ÒäÇ¥ÒÔ¥VšºÔJ“—RiòR*M¡VšDù³/Ñ'ÆèƒZi¥ÒÔ· •&/¥Òj¥Iôq¾QUšúÂ[iêR+M^J¥ÉK_¿ÎÌVš:ÔJ“—RiâÒVšD©4ñq[iòR*M]j¥©K­4‰Ri µÒ$ú=ÅCôq¾QUšú´ÒÔ¥Vš¼”J“—¾î7j+M}\+M^ú¼ß¨­4u)•&=î7j+M]j¥©K­4‰ž÷µ•¦.µÒä¥ÇýFm¥)ÔJ“èý~£¶Òj¥Iôû~£¶Òä¥ÏÞ¨o.m¥‰K[i=ï7j+M]j¥©K­4yéó|£¶ÒÔ¡Vš¼ô¸ß¨­4u©•¦.µÒ$zÞoÔVšºÔJ“èq¿Q[i µÒ$z¿ß¨­4õ-h¥©K­4yéã~£¶ÒÔ¥VšDï÷µ•&/}ÝoT+Mj¥ÉCŸ÷µ•¦.µÒä¥Çü×¼ôu¿Q[iâã¶Òä¥TšºÔJS—Zi=î7j+M¡VšDï÷µ•¦¾­4u©•&/=þy£¾½ôy¿Q[iêãZiòÒó|£¶ÒÔ¡Vš¼ôq¿Q[iêR+M]j¥Iô¸ß¨­4u©•¦.µÒä¥ÏûÚJ“èí~£¶Ò$úºß¨­4õ-h¥ÉKÏûÚJ—¶Òä¥ÇýFm¥©K¥©C­4yèy¿Q[iêR+M^ú¸ß¨­4…Zi½ßoÔVšúÂ[iêR+M¢ûÚJSèãÿÝoÔVšDûÚJS—ZiêR+M^zþóF}w)•¦µÒ$zœOÔVš:ÔJS—ZiòÒó~¢¶ÒÔ¥VšDÿM¥©/º•¦Î´Ò$z¿§­4…>þßý8m¥ÉK÷ã´•¦.µÒÔ¥Tš<ôøçqúöÐׯëÛJ“èã~œ¶ÒÔ¥VšºÔJ“—÷ã´•¦.µÒ$z?§­4ZiÒ¼ÝoÓVšøl¥©K­4‰Ri=ï·i+M}á­4yéã~›¶ÒÔ¥Všº”J“‡÷ã´•¦>­•¦.µÒä¥ÏûqÚJS—ZiòÒã~œZiÊ´Ò$:ÞZi µÒÔüVš¼ô¸§­4…Zi½ßÓVšºÔJS—ZiòÒÇý:µÒÄ¡­4qh+M^zÞ9°•¦>®•¦.µÒä¥ÏûuÚJ“èí|¶Ò$ú:_§ÏVšD÷ë´•¦.µÒÔ¥Vš¼ô¸_§­4õq­4u©•&/=ï×i+M]J¥ÉCÿ¼NßúüuUšDï÷ë´•&/}ݯÓVšºôùïoª~{éó|¶Ò$ºÏ<î×i+M|Ñ[iâÒVš¼ôy¿N[i½Ý¯ÓVš¼ôu¿N[iêR+M^zž¯ÓVš:ÔJ“—þÃo©n¥©k¥©K­4yéy¿N[iêR*Mú¸_§Vš2­4‰þýÕoÑã~¶ÒÔ7 •¦.µÒä¥ÏûuÚJS×J“—÷ë´•¦.¥ÒÔ¡Vš<ô<_§¿*ÍŸ/ýUi~{éíÿOäØÒ â–æ oiqK3ˆ[šAÜÒ|¡cK3ˆ[šAÜÒ â–æ oiqK3ˆ[šƒ¼¥Ä-Í niqKs·4c¸¥Ä-ÍAÞÒ â–f¶4c¸¥9È[šAÜÒ â–æ oiqK3ˆ[šAÜÒä-Í niqK3ˆ[šƒ¼¥Ä-Í niò–f·4ƒ´¥Ã-Í:¶4‹´¥Y¤-Í niiK³H[šEÚÒ â–f¶4k´¥Ä-Í"miiK³H[šAÜÒ,Ò–f‘¶4‹´¥Ä-Í"miiK3ˆ[šEÚÒ,züóÏœ|{I[šAÜÒ,Ò–f‘¶4ƒ¸¥Y¤-Í"miaK3†[šEÚÒ,Ò–æ oiiK³HÿJQ‘¶4ƒ¸¥Y¤-Í"miqK³è÷¯Ÿÿ!®"miiK3ˆ[šEÚÒ,Ò–f‘¶4ƒ¸¥Y¤-Í"mi}hK³[š5ÚÒ,Ò–f·4‹´¥Y¤-Í ni½Ýo”·4‹´¥Ä-Í"miiK3ˆ[šEÚÒ,Ò–f‘¶4yK³H[šEÚÒ,Ò–f·4‹´¥Y„-ÍniiK³H[šEÚÒ â–f‘¶4‹´¥Ä-Í¢·ûò–f‘¶4ƒ¸¥Y¤-Í"miqK³H[šEÚÒ,Ò–f·4‹´¥Y¤-Í"miiK³F[šEÚÒ â–f‘¶4‹øÇ"‹´¥9È[šEÚÒ,Ò–f·4‹´¥Y¤-Í"miqK³H[šEÚÒ â–f‘¶4‹´¥Y¤-Í niiK³[š1ÚÒ,Ò–f‘¶4‹´¥Ä-Í"miiK³H[šAÜÒ,Ò–f‘¶4ƒ¸¥Y¤-Í"miiK3ˆ[šEÚÒ,Ò–æ oiiK³H[šEÚÒ Ò–f¶4‹´¥Ä-Í¢ß÷å-Í"miqK³H[šEÚÒ,Ò–f·4‹´¥Y¤-Í miiK³H[šEÚÒ â–f‘¶4‹´¥¤-Íš·û‰â–f¶4ƒ¸¥Y¤-Í"miqK³H[šEÚÒ,Ò–æ oiiK³H[šEÚÒ â–f‘¶4‹´¥Ä-Í"miiK³H[šAÜÒ,–f¶4ƒ´¥Y󆹲"miiK3ˆ[šEÚÒ,Ò–f·4‹´¥Y„-ÍmiqK³H[šEÚÒ,Ò–f·4‹´¥Y¤-Í niiK³èq?PÜÒã-Í"liÖhK3ˆ[šEÚÒ,Ò–f‘¶4ƒ¸¥Y¤-Í"miiK³F[šE?ThK3ˆ[šEÚÒ,Ò–fЇ¶4‹~ß“·4‹´¥Ä-Í"liÖhK³[š1ÜÒ,Ò–f‘¶4ƒ¸¥Y¤-Í"miiK3ˆ[šEØÒ¬Ñ–æ niÖ¼Ýo“·4‹´¥Ä-Í"miiK3ˆ[šEÚÒ,Ò–f‘¶4ƒ¸¥Y„-ÍmiiK3ˆ[šEÚÒ,Ò–fЇ¶4‹´¥Y¤-Í"liÆpK³èüyã–f·4‹ÞîÇÉ[šEÚÒ â–f‘¶4‹´¥Ä-Í"miiK³[šc¼¥Y¤-Í"miiK3ˆ[šEÚÒ,Ò–f·4‹°¥Y£-Í"liÆpK³H[šEÚÒ â–f‘¶4‹´¥Y¤-Í niiK³H[šAÜÒ,–f¶4‹´¥Ä-Í"miiK³H[šAÜÒ,Ò–f¶4c¸¥YtŸÑ–f‘¶4yK³H[šEÚÒ â–f‘¶4‹´¥Y¤-Í niiK³[š1ÜÒ,Ò–fÑø-UoiqK³H[šEÚÒ úЖf¶4k´¥Y„-ÍniiK³H[šEÚÒ â–f‘¶4‹´¥Ä-Í"miiK³H[šAÚҬіf‘¶4_èØÒ,zÓ–æÿý¯åÇYir¥ùBG¥9È•æ Wšƒ\iþAW¥9È•æ Wšƒ\i¾ÐQir¥9È•æ •æ Wšƒ\ir¥ùB®4ǸÒäJó…ŽJsÐ+ÍA¬4ǸÒ|¡£ÒäJs+Í:*ÍA®4¹ÒäJó…ŽJs+ÍA®4¹Ò|¡£ÒäJs+Í:*ÍA®4±ÒãJóº*Í VšA¬4¹Ò b¥ÄJ3ˆ•æ WšAª4cXir¥ÄJ3ˆ•f+ÍA®4ƒXi±Ò b¥9È•f+Í Všƒ\i±Ò b¥ÄJs+Í VšA¬4¹Ò b¥ÄJ3H•æWšA¬4ƒXi¾ÐQi±Ò ⟃Xir¥ÄJ3ˆ•æ WšA¿õWó¸_§£Ò|¡£Ò b¥ÄJs+Í VšA¬4ƒXir¥ÄJ3H•æWšA¬4ƒþÃo©•æ WšA¬4ƒXir¥¤J3†•f*Í1®4ƒXi±Ò b¥9È•f+Í Všƒ\i±Ò b¥ÄJs+ÍVšA¬4ÿ «Ò zC¥ùøS‡•f+ÍA®4ƒXi±Ò b¥ùBG¥ÄJ3ˆ•f+ÍA®4ƒXi±ÒäJ3ˆ•f+Í VšƒXiÆ°Ò b¥9È•f+Í Uš1¬4¹Ò b¥ÄJs+Í VšA¬4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒXi±ÒäJ3ˆ•f*ÍVš/tTšEª4‹Ti±Ò,R¥Y¤J³H•f+Í"Tš5ª4ƒXi©Ò,R¥Y¤J3ˆ•f‘*Í"UšEª4ƒXi©Ò,R¥ÄJ³H•f‘*Í"UšA¬4‹Ti©Ò b¥Y¤J³H•f*ÍVšEª4‹Tir¥Y¤J³Hþ-R¥ÄJ³H•f‘*Í VšE¿ñW®•¦.µÒä¥Tš¼”JS—ZiêR*MJ¥©C­4u©•&Q*M~\*M]j¥©K­4y)•&/¥Òj¥I”?û¥Òj¥I”JSß‚Vš¼”JS¨•&ÑÇùFýUiê o¥©K­4y)•&/M¥©C­4u¨•&/¥ÒÄ¥­4‰Riâã¶Òä¥TšºÔJS—Zi¥Òj¥Iô{þЇ(•&Q*M} ZiêR+M^J¥ÉK_÷µ•¦>®•&/}ÞoÔVšº”J“‡÷µ•¦.µÒÔ¥VšDÏûÚJS—ZiòÒã~£¶Òj¥Iô~¿Q[i µÒ$ú}¿Q[iòÒç?oÔ7—¶ÒÄ¥­4‰ž÷µ•¦.µÒÔ¥Vš¼ôy¾Q[iêP+M^zÜoÔVšºÔJS—Zi=ï7j+M]j¥Iô¸ß¨­4…Zi¥Ò$zÞoÔVšºôx»ß¨­4yéóŸ7ê»K­4‰Þï7j+M^úºß¨Vš:ÔJ“‡>ï7j+M]j¥ÉK©4yéë~£¶ÒÄÇm¥ÉK©4u©•¦.µÒ$zÜoÔVšB­4‰Þï7j+M} ZiêR+M^züóF}{éó~£¶ÒÔǵÒä¥çùFm¥©C­4yéã~£¶ÒÔ¥VšºÔJ“èq¿Q[iêR+M]j¥ÉKŸ÷µ•&ÑÛýFm¥Iôu¿Q[iê[ÐJ“—ž÷µ•&.m¥ÉKûÚJS—JS‡ZiòÐó~£¶ÒÔ¥Vš¼ôq¿Q[i µÒ$z¿ß¨­4õ…·ÒÔ¥VšD÷µ•¦P+M¢·ûÚJSß‚VšºÔJS—ZiòÒóŸ7ê»K©4u¨•&Ñã|¢¶ÒÔ¡VšºÔJ“—ž÷µ•¦.µÒ$úøç‰ú}ÞOÔVšøÂ·Òä¥ç?OÔ·—¾î'j+M¢û‰ÚJS¨•¦¾ðVš¼ô¸Ÿ¨­4u©•¦.¥Òä¡çýBµÒÔ‡µÒä¡ÇýBm¥©K­4u©•&/¥ÒÔ¥Çÿ»_¨­4‰¦Ò¤ù¼¨­4õu·Òä¥çý@m¥)ÔJ“èã~ ¶ÒÔ¥VšºÔJ“—÷ÕJ‡¶ÒÄ¡Vš4ÏûÚJS—ZiòÒã~ ¶ÒÔ¥VšºÔJ“—ž÷ÕJ“æí~Ÿ¦ÒÔÝJSgZi½ßÓVšB­4õ…·Òä¥ûqÚJS—ZiêR*Mzüó8}{èë×õ€m¥Iôq?N[iêR+M]j¥ÉKûqÚJS—Zi½ŸÓVš@­4iÞî·i+M|¶ÒÔ¥VšD©4‰ž÷Û´•¦¾ðVš¼ôq¿M[iêR+M]J¥ÉCûqÚJSŸÖJS—ZiòÒçý8m¥©K­4yéq?N­4eZi?o­4…Ziê?~+M^zÜÓVšB­4‰ÞïÇi+M]j¥©K­4yéã~ZiâÐVš8´•&/=ï¿ØJS×JS—ZiòÒçý:m¥Iôv¾N[i}¯Óg+M¢ûuÚJS—ZiêR+M^zܯÓVšú¸VšºÔJ“—ž÷ë´•¦.=ÞÎ×i+MúüuUšDï÷ë´•&/}ݯÓVšºôùïoª~{éó|¶Ò$ºÏ<î×i+M|Ñ[iâÒVš¼ôy¿N[i½Ý¯ÓVš¼ôu¿N[iêR+M^zž¯ÓVš:ÔJ“—þÃo©n¥©k¥©K­4yéy¿N[iêR*Mú¸_§Vš2­4‰þýÕoÑã~¶ÒÔ7 •¦.µÒä¥ÏûuÚJS×J“—÷ë´•¦.¥ÒÔ¡Vš<ô<_§¿*ÍŸ/ýUi~{éù¿_Ô¸¶4yKó…Ž-ÍAÞÒä-ÍAÞÒüƒ®-ÍAÞÒä-ÍAÞÒ|¡cKs·4yKó…Ž-ÍAÞÒä-ÍAÞÒ|!oiŽñ–æ oi¾Ð±¥9È[šƒ¸¥9Æ[š/tliò–æ oi¾ÐÃ[šƒ¼¥9È[šƒ¼¥ùBÇ–æ oiò–æ oi¾Ð±¥9È[šƒ¼¥ùBÇ–æ oiâ–æoiþA×–f·4ƒ¸¥9È[šAÜÒ â–f·4yK3H[š1ÜÒä-Í niqK3ˆ[šƒ¼¥Ä-Í niqKs·4ƒ¸¥Ä-ÍAÞÒ â–f·4ƒ¸¥9È[šAÜÒ â–æ oi½i&ˆ[šAÚÒã-Í niqKó…Ž-Í niñ_) â–æ oiqK3ˆ[šƒ¼¥ôûþ!® niqKs·4ƒ¸¥Ä-Í niò–f·4ƒ¸¥9È[šAÚÒŒá–f·4yK3ˆ[šAÜÒä-Í ·û:¶4ƒ¸¥9È[šAÜÒ â–æ oiqK3ˆ[šAÜÒ|¡cK3ˆ[šAÜÒ â–æ oiqK3H[šc¼¥Ä-Í niqKs·4ƒ¸¥Ä-ÍAÞÒ â–f·4ƒ¸¥9È[šAÜÒ â–æ Všºôà–f·4ƒ¸¥9È[šAÜÒ â–f·4qK3†[šAÜÒä-Í niqK3ˆ[š/tliqK3ˆ[šƒ¼¥Ä-Í niqKs·4ƒ¸¥Ä-ÍAÞÒ â–f·4ƒ¸¥9È[šAÜÒ Ò–æoiqK3ˆ[šAÜÒä-Í niqK3ˆ[šƒ¼¥Ä-Í niò–fÐÛýF[šAÜÒä-Í niqKó…Ž-Í niqK3ˆ[šƒ¸¥Ã-Í niò–fÐïû:¶4ƒ¸¥9È[šAÜÒ â–f·4yK3ˆ[šAÜÒä-Í niqK3ˆ[šƒ¼¥Ä-Í niâ–fÌÛýDyK3†[šƒ¼¥Ä-Í niò–f·4ƒ¸¥Ä-Í:¶4ƒ¸¥ôÔ?HÄ-ÍAÞÒ â–f·4yK3ˆ[šAÜÒ â–æ oiiK3†[šƒ¸¥Ã-Í niqKs·4ƒ¸¥Ä-ÍAniqK3H[š1ÜÒä-Í niqK3ˆ[šƒ¼¥Ä-Í niò–f·4ƒ¸¥¤-Í—9¶4ƒ´¥Ã-ÍAÞÒ z»¨cK3ˆ[šƒ¼¥Ä-Í niâ–f ·4ƒ~8ˆà–æ oiqK3ˆ[šƒ¼¥ôû~œŽ-Í niò–f¶4c¸¥¤-Í1ÞÒ â–f·4yK3ˆ[šAÜÒ â–æ oiiK3†[š/ä-͘·ûm:¶4ƒ¸¥9È[šAÜÒ â–æ oiqK3ˆ[šAÜÒä-Í miÆpK3ˆ[šƒ¼¥Ä-Í niò–f·4ƒ¸¥¤-Í1ÞÒ :ÞÜÒä-Í niqK3ˆ[šƒ¼¥Ä-Í niò–f·4ƒ¸¥¤-Í—9¶4ƒ¸¥ô¼ÿràØÒä-Í niqKs·4ƒ´¥Ã-Í miŽñ–f·4ƒ¸¥9È[šAÜÒ â–f·4yK3ˆ[šAÜÒä-Í miÆpK3ˆ[šƒ¼¥Ä-Í niqKs·4ƒ¸¥¤-Í1ÞÒ ºÏpK3ˆ[š/tliqK3ˆ[šƒ¼¥ôv¿NÇ–f·4yK3ˆ[šAÚÒã-Í niý‡ßR=¶4yK3ˆ[šAÜÒä-Í miÆpK3H[šc¼¥Ä-Í niqKs·4ƒ¸¥Ä-ÍAÞÒ â–f·4ƒ¸¥9ˆ[š1ÜÒ â–ætmi½aKóù¿¿<;"Í1l4_ƉæšchŽaŸùÇyæÖ™cgŽa›ù2N3ǰÌÃ0óeÜeŽa–9†UæF™/Ã&s“Ì1,2_ÆAæö˜c”caù2Ž1ǰÅÃóe\bŽaˆ9†æf˜/ã s #Ì1O5˜c˜`¾Œ Ì1 0ǰ¿|ç—cX_ŽQ|9„íås¤—1*/c^Žaw£ì2FÕeŒ¢Ë1l.c\†¨¸Ãà2F½eŒrËÕ–c[ƨµŒQj£Òr CËu–1Ê,ǰ²ŒQd£Æ2F‰å–1 ,cÔWŽa^£º2Fqe ÚÊ!L+cTVÆ(¬|w•1Ê*côçÕE•cØTÆ(©ŒQQ9†AeÌoüeLŒrÊÕ”cSƨ¥ŒQJ£’r CÊu”1Ê(ǰ¢ŒAD¢†2F å”1 (cÔOŽa>óv¾:Ž'cÔNŽa:£r2Fáäv“1Ê&cTMÆ(š|7“1J&cžç«ã`r {Éå’1¨%‡0–ŒQ+£T2F¥ä†’1ê$c”IŽa%£H2FdŒÉ1,$cHƨÃ<2FudŒâȵ‘c˜FƨŒŒQ£.rŒ²ÈU‘1Š"ǰ‰ŒQ£"2FAä˸‡ŒQ£r cȵ1J!cTBŽa£2FäV1Š cÔ@Æ(Ã2Fd úÇ!ÌcT?Æ(~ŒQû8†écŒÊÇ…1êÇ0{ŒQõ£èq ›Ç%1*c<Žaï£Ü1FµãË8vŒQë£Ô1F¥ã…Ž!êc”9Žaåóû|uÜ8Æ(qÃÂ1FcŒúÆåcX7Æ(nŒQÛ8†icŒÊÆ…1êÇ0kŒQÕ£¨qÌMcÈÛùè°h QÐ8†=cŒrÆÕŒc3ƨeŒQÊ£’ñe2ƨcŒyâwAbT1ŽaÄ£†1F ãŒ1 cÔ/Æ(_Ãz1ñbˆÚÅ1JCT.Æ(\ŒQ·8†ÙbŒªÅE‹cØ,Æ(YŒA±¢`q {ÅåŠ1ªc+Ža«£T1F¥â†Š1êc”)Æ R|GŠ1hC”(Ža¡£@1F}bŒòÄ1¬c'ƨM£41DebÌ¿- .q ³ÄU‰1ŠǰIŒù}>7.c$Žaƒ1D5b bÄ!lc”"ƨDÃ1FbŒ2ÄUˆc!Æ A Q‚ø2,CÞÎׯýaŒòÃ1¬cƨ=Ãô0FåaŒÂÃu‡c˜Æ : Qt£æp “Ç1 ǰ7ŒQn£Ú0±á¶†1×KÃ1O…†1ê c”ƨ2ÃÈ0FaŒÃ1, cƨ/ŒA^ø"® cƨ-ŒQZ8†eaŒÂÂu…c˜Æ * QTƒ¦p“Â…1 ǰ'ŒQN£š0F1á¶„1J cTŽaHƒŽ0DaŒ*Â1ŒcÔÆ(!ŒQA8†aŒúÁäƒCXÆœGÔÆ(|—ƒ1 cÔ Ža6£j0FÑ`ŒšÁ1LcT Æ Â^0F¹`ÌýÛ—ŽǰŒQ*£Rp CÁt‚!ÊcP a$£F0F‰`Œ Á1 cÔÆ(Ã:0Fq`ŒÚÀ¥cT†( ŒQøÇY`Ì›ªÀ?ß—¿²ÀïV ƒÚ~·9hÃ@\Ú2P—šêRÛÀŸ/ý µüùãþÊu©} .m ˆK[ 5ÚFP¨‘ P+A¡f‚ø´Ä¡ u¨¥ .m*(ÔV×XP‡Z âÐæ‚¸´½ .5Ä¥-qi“A]j3(Ôh·Õ .m6¨Kíu©á .m9ˆK› µÚxP¨õ PòA™öƒ?þ ¾ôWAHôüu\B]jDÈK_×Oï_¡.µ#Ô¥„„<”’P‡šêR[B¢Ä„ü¸Ô„ºÔœP—ÚòR‚B^JQ(Ô¤(¢%úÄøyP«B¢d…ú´+䥄…B- ‰>Î7꯶P_xãB]j]ÈKÉ yéë×ùƒÙÀP‡ZòRC\ÚÆ(‘!>n+C^Jf¨Kí u©¡!QJC¡¦†D¿ç/oˆ>Î7ê¯ÚP߂憺ÔÞ—òÒ×ýFmr¨ksÈKŸ÷µÕ¡.%;ä¡ÇýFmx¨K-u©é!Ñó~£þ÷gÜóÚú—÷µý¡PD¢÷ûÚQ¨ "ÑïûÚ ‘—>ÿy£¾¹´".mˆHô¼ß¨Mu©-¢.5Fä¥ÏóÚQ‡Ú#òÒã~£¶HÔ¥&‰ºÔ&‘èy¿Q[%êR³D¢ÇýFm˜(Ô2‘èý~£¶MÔ· q¢.µNä¥ûÚ>Q—(½ßoÔ&мôu¿Qu¨•"}ÞoÔvŠºÔP‘—R*òÒ×ýFm«ˆÛX‘—R+êRsE]j¯Hô¸ß¨-…š,½ßoÔF‹ú´ZÔ¥f‹¼ôøçúöRÂE¡–‹ú¸¦‹¼ô<ߨu¨õ"/}ÜoÔö‹ºÔ€Q—Z0=î7jF]jĨK­yéó~£¶c$z»ß¨-‰¾î7j[F} 3òÒó~£6gÄ¥íyéq¿Q[4êã’4êP›FzÞoÔVºÔ¬‘—>î7jÃF¡–Dï÷µm£¾ðƺԺ‘èã~£¶ojàHôv¿Q›8ê[ÐÆQ—9êR+G^Jæ¨KÏéuèâ>ÿo%¥#?,©£µuԥƎ¼ô¼Ÿ¨Íu©½#ÑÇ?OÔ·èó~¢6yľÍ#/=ÿy¢¾½ôu?Q›=}ÜOÔ†B-õ…7}ä¥ÇýDmü¨K­u)ù#=瘝>¬$=îjH]j©K­ y)¤.µƒÔ¥†DSBÒ|ÞÔ¶úºCòÒó~ 6‡jIôq?P[DêR“H]jÉK‰"yéë| 6‹Ä¡v‘4ÏûÚ2R—šFòÒã~ 6ŽÔ¥Ö‘ºÔ<’—ž÷Õ@’æí~Ÿ&‘ÔÝFRgI½ßÓf’Bí$õ…7”ä¥ûqÚTR—ÚJêRbIzüó8}{èë×õ€m/Iôq?N[LêR“I]j3ÉKûqÚjR—šM½ŸÓ†“@-'iÞî·iÛI|6žÔ¥Ö“DÉ'‰ž÷Û´¥¾ð”¼”„’—ÒPêR#J]JEÉCûqÚŽRŸÖR—ZRòÒçý8mK©K)yéq?NÍ)eÚS?o-*…šTê?þóí~œ6ª$JU)Ô¬’èý~œ6¬Ô¥–•ºÔ´’—>îשq%m]‰C›WòÒóþË ,õq-,u©‰%/}Þ¯ÓF–Doçë´™%Ñ×ù:}6´$ú¸_§M-u©­¥.5¶ä¥Çý:mn©ko©K .yéy¿N›\êRšKúøçuúöÐ篫€ø+»$z¿_§ /yéë~6½Ô¥ÏSõÛKŸçë´õ%Ñ}æq¿N`â‹Þ—6Áä¥ÏûuÚ“èí~6Ã䥯ûuÚS—ZbòÒó|¶ÅԡƘ¼ô~KusL}\{L]jÉKÏûuÚ$S—ÒdòÐÇý:µÊ”i–Iôïï¨~‹÷ë´e¦¾M3u©m&/}Þ¯ÓÖ™ú¸æ™¼ô¸_§ 4u)…¦5Ñä¡çù:ýiþ|é¯JóÛKú‰k¼q×_è˜oäýÆApäÇ?èšpä ÇAqäÇ:fyÇq‡_èXrôÆ)ÇAÞrä1ÇòšãÏ9òžã ƒŽƒ¼è8ˆ“Žc¼éøBǨ㠯:ò¬ã »Žƒ<ì8ÈËŽƒ<íøBǶã ;òºã Ï;¾Ð±ï8ȃ¼ðøBÇÄã o<âÈã¯<þA×Ìcwƒ8ô8ÈKAœz âÖcÇyí1Hs1Ü{äÁÇ .>qò1ˆ›ƒ<úÄÕÇ Î>q÷q‡ƒ¸üÄéÇAÞ~ âøc׃8ÿ8ÈûA€ âä O@q2ˆ#AZãÈ î@qò…Ž%È NAñ_# âä ¯Aq2ˆ{ƒ<ôûþ‰­ NBqrG!ƒ¸ ÄYÈ îBò0d—!ƒ8 9ÈÛAoçu¬Cqr÷!ƒ8Ä…ÈAOND½ÝoÔ1Ä•ÈAž‰ âNd‡"y)2ˆS‘AÜŠ âXä k‘Aœ‹ â^d#y12ˆ“‘AÚŒãÑÈ ·û:f#ƒ¸9ÈÑA\Ž âtä oGq<2ˆë‘AœäýÈ HqAr'$ƒ¸!ÄÉ ®HòŒdw$ƒž÷u,Iâ”d ·$ƒ8&9Èk’Aœ“ âžd%_èX” â¤d7%yT2ˆ«’Aœ• â®ä KqY2ˆÓ’ƒ¼-ÄqÉ ®Kq^r÷%ƒ80¤…É1ž˜ âÆdG&ƒ¸29È3“AÜ™ âÐd—&yj2ˆ[“A›äµÉ ÎMqo2ˆƒ“ƒ¼8ÄÉÉ nN¾Ð1:ÄÕÉ ÎNqwr‡'c¸<ÄéÉAÞž ú}¿QÇúdç'y2ˆ”A\  âå oPq„2ˆ+”ƒ3ˆû™ƒ< ÄÍ Nhò†fÐÛý:+šAœÑÄÍiqIóº¦4ƒÞ°¥ùù¿víª4ƒXir¥ÄJ3ˆ•f+Í:*Í VšA¬4ƒXir¥ÄJ3ˆ•æ WšA¬4ƒXi±ÒÄJ3†•f+ÍA®4ƒXi©ÒŒa¥9È•f+Í Všƒ\i±Ò b¥ÄJs+Í VšA¬4ƒXir¥ÄJ3ˆ•æ WšA¬4ƒTiưÒ|¡£Ò,R¥Y¤J3ˆ•f‘*Í"UšEª4ƒXi¡Ò¬Q¥ÄJ³H•f‘*Í"UšA¬4‹Ti=ñ—;Eª4ƒXi©Ò,R¥ÄJ³H•f‘*Í"UšA¬4‹Ti©Ò b¥Y¤J³H•f*ÍVšEª4‹Tir¥Y¤J³Hþ-R¥ÄJ³H•f‘*Í VšE¿ñWYi±Ò b¥¤JsŒ+Í VšA¬4_è¨4ƒXiñÏ¿A¬4¹Ò b¥ÄJs+Í ßú+ž VšA¬4¹Ò b¥ÄJ3ˆ•æ WšA¬4ƒXir¥¤J3†•f+ÍA®4ƒXi±ÒäJ3èí~£ŽJ3ˆ•æ WšA¬4ƒXir¥ÄJ3ˆ•f+Í:*Í VšA¬4ƒXir¥ÄJ3H•æWšA¬4ƒXi±ÒäJ3ˆ•f+ÍA®4ƒXi±Ò b¥9È•f+Í Všƒ\i±Ò b¥ÄJs+Í VšA¬4ƒXib¥ÃJ3ˆ•æ WšA¬4ƒXi±Ò|¡£Ò b¥ÄJs+Í VšA¬4ƒXir¥ÄJ3ˆ•æ WšA¬4ƒXi±ÒäJ3ˆ•f*Í1®4ƒXi±Ò b¥9È•f+Í VšA¬4¹Ò b¥ÄJsÐ'+Í VšA¬4ƒXir¥ÄJ3ˆ•æ •f+Í VšA¬4±ÒŒa¥ÄJs+Í ß÷uTšA¬4¹Ò b¥ÄJ3ˆ•æ WšA¬4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒXi±ÒÄJ3æí~¢\iưÒäJ3ˆ•f+ÍA®4ƒXi±Ò b¥ùBG¥ÄJ3ˆ•f+ÍA®4ƒXi±ÒäJ3ˆ•f+Í Všƒ\i©ÒŒa¥9ˆ•f +Í VšA¬4¹Ò b¥ÄJs+Í VšAª4cXir¥ÄJ3ˆ•f+ÍA®4ƒXi±ÒäJ3èí~ ŽJ3H•æË•f*ÍVšƒ\i±Ò b¥ÄJs+Í VšA¬4±ÒŒa¥ôó¯ÎE°ÒäJ3ˆ•f+ÍA®4ƒ~ßÓQi±ÒäJ3H•f +Í Ušc\i±Ò b¥9È•f+Í VšA¬4¹Ò R¥ÃJó…\iƼÝoÓQi±ÒäJ3ˆ•f+ÍA®4ƒXi±Ò b¥9È•f*ÍVšA¬4¹Ò b¥ÄJs+Í VšA¬4ƒTiŽq¥tþ¼¹ÒäJ3ˆ•f+Í Všƒ\i±Ò b¥9È•f+Í VšAª4_æ¨4ƒXi±Ò b¥9È•f+Í Všƒ\i½¯ÓQi©ÒãJ3ˆ•f+ÍA®4ƒXi±Ò b¥9È•f+Í Všƒ\i©ÒŒa¥ÄJs+Í VšA¬4ƒXir¥ÄJ3H•æWšA÷VšA¬4_è¨4ƒXi±ÒäJ3ˆ•f+Í Všƒ\i±Ò R¥9Æ•f+Í ÿð[ªG¥9È•f+Í Všƒ\i©ÒŒa¥¤JsŒ+Í VšA¬4ƒXir¥ÄJ3ˆ•æ WšA¬4ƒXi±ÒÄJ3†•f+Í?èª4ƒÞTiþßOÿï¿+ÍÇÿÃ/ j¥ôÍ¥­4qi+M]j¥©K­4¾ôW¥)ÔJóçû«ÒÔ¥Vš¸´•&.m¥)ÔJh+M¡VšB­4…Ziâ[ÐJ‡¶ÒÔ¡Vš¸´•¦P+M|\+Mj¥‰C[iâÒVšºÔJ—¶ÒÄ¥­4u©•¦P+M|ÜVš¸´•¦.µÒÔ¥Vš¸´•&.m¥)ÔJh+M¡VšB©4eZiþüø«ÒüùÒ_•&Qþì«k¥©K­4y)•&/¥ÒÔ¥Všº”J“‡RiêP+M]j¥I”J“—JS—ZiêR+M^J¥ÉK©4…ZiåϾD©4…Zi½ýºþ×ê_•&/¥Òj¥Iôq¾QUšúÂ[iêÒg*M^J¥ÉKSiêP+Mj¥ÉK©4qi+M¢Tšø¸­4y)•¦.µÒÔ¥VšD©4…Ziýž¿â!ú8ߨ¿*M} ZiêR+M^J¥ÉK_÷µ•¦>®•&/}ÞoÔVšº”J“‡÷µ•¦.µÒÔ¥VšDÏûÚJS—ZiòÒã~£¶Òj¥Iô~¿Q[i µÒ$ú}¿Q[iòÒç?oÔ7—¶ÒÄ¥­4‰ž÷µ•¦.µÒÔ¥Vš¼ôy¾Q[iêP+M^zÜoÔVšºÔJS—Zi=ï7j+M]j¥Iô¸ß¨­4…Zi½ßoÔVšú´ÒÔ¥Vš¼ôq¿Q[iêR+M¢÷ûÚJ“—¾î7ª•¦µÒä¡ÏûÚJS—ZiòR*M^úºß¨­4ñq[iòR*M]j¥©K­4‰÷µ•¦P+M¢÷ûÚJSß‚VšºÔJ“—ÿ¼Qß^ú¼ß¨­4õq­4yéy¾Q[iêP+M^ú¸ß¨­4u©•¦.µÒ$zÜoÔVšºÔJS—ZiòÒçýFm¥Iôv¿Q[i}ÝoÔVšú´Òä¥çýFm¥‰K[iòÒã~£¶ÒÔÇ¥ÒÔ¡Vš<ô¼ß¨­4u©•&/}ÜoÔVšB­4‰Þï7j+M}á­4u©•&ÑÇýFm¥)ÔJ“èí~£¶ÒÔ· •¦.µÒÔ¥Vš¼ôüçúîR*Mj¥Iô8Ÿ¨­4u¨•¦.µÒä¥çýDm¥©K­4‰>þy¢¾EŸ÷µ•&¾ð­4yéùÏõí¥¯û‰ÚJ“èã~¢¶Òj¥©/¼•&/=î'j+M]j¥©K©4yèy¿P­4õa­4yèq¿P[iêR+M]j¥ÉK©4u©•¦.µÒ$šJ“æó~ ¶ÒÔ×ÝJ“—ž÷µ•¦P+M¢ûÚJS—ZiêR+M^zÜT+MÚJ‡ZiÒ<ïj+M]j¥ÉKûÚJS—ZiêR+M^zÞT+Mš·û}šJS_t+Mi¥Iô~?N[i µÒÔÞJ“—>îÇi+M]j¥©K©4yèñÏãôí¡¯_×¶•&ÑÇý8m¥©K­4u©•&/=îÇi+M]j¥Iô~>N[iµÒ¤y»ß¦­4ñ ØJS—Zi¥Ò$zÞoÓVšúÂ[iòÒÇý6m¥©K­4u)•&=îÇi+M}Z+M]j¥ÉKŸ÷ã´•¦.µÒä¥Çý8µÒ”i¥Itþ¼µÒj¥©ÿø­4yéq?N[i µÒ$z¿§­4u©•¦.µÒä¥ûuj¥‰C[iâÐVš¼ô¼ÿr`+M}\+M]j¥ÉKŸ÷ë´•&ÑÛù:m¥Iôu¾NŸ­4‰>î×i+M]j¥©K­4yéq¿N[iêãZiêR+M^zÞ¯ÓVšº”J“‡>þy¾=ôùë* þ[i½ß¯ÓVš¼ôu¿N[iêÒç¿¿©úí¥ÏóuÚJ“è>ó¸_§­4ñEo¥‰K[iòÒçý:m¥Iôv¿N[iòÒ×ý:m¥©K­4yéy¾N[iêP+M^ú¿¥º•¦>®•¦.µÒä¥çý:m¥©K©4yèã~ZiÊ´Ò$ú÷wT¿EûuÚJS߀VšºÔJ“—>ï×i+M}\+M^zܯÓVšº”JS‡ZiòÐó|þª4¾ôW¥ùÝ¥ÿûÿ ?¾®-Í niò–f·4ƒ¸¥Ä-Í:¶4ƒ¸¥Ä-Í niò–f·4ƒ¸¥9È[šAÜÒ â–f·4qK3†[šAÜÒä-Í niiK3†[šƒ¼¥Ä-Í niò–f·4ƒ¸¥Ä-ÍAÞÒ â–f·4ƒ¸¥9È[šAÜÒ â–æ oiqK3H[š1ÜÒ|¡cK³H[šEÚÒ â–f‘¶4‹´¥Y¤-Í niaK³F[šAÜÒ,Ò–f‘¶4‹´¥Ä-Í"miiK³H[šAÜÒ,Ò–f‘¶4ƒ¸¥Yô†²"miiK3ˆ[šEÚÒ,Ò–f·4‹´¥Y¤-Í"liÆpK³H[šEÚÒä-Í"mié_)*Ò–f·4‹´¥Y¤-Í niýþõó?ÄU¤-Í"miqK³H[šEÚÒ,Ò–f·4‹´¥Y¤-Í niaK³F[šEÚÒ â–f‘¶4‹´¥Ä-Í¢·ûò–f‘¶4ƒ¸¥Y¤-Í¢çýFyK³H[šEÚÒ,Ò–æ oiiK³H[šEÚÒ â–f‘¶4‹°¥Ã-Í"miiK³H[šAÜÒ,Ò–f‘¶4ƒ¸¥Y¤-Í"miiK3ˆ[šEÚÒ,Ò–f·4‹´¥Y¤-Í"miqK³H[šEÚÒ,Ò–f¶4k´¥Y¤-Í niiK³H[šEÚÒä-Í"miiK3ˆ[šEÚÒ,Ò–f‘¶4ƒ¸¥Y¤-Í"miqK³H[šEÚÒ,Ò–f·4‹´¥Y„-ÍniiK³H[šEÚÒ â–f‘¶4‹´¥Y¤-Í niiK³H[šAÜÒ,Ò–f‘¶4‹´¥Ä-Í"miiKs·4‹´¥Y¤-Í"miiK³F[šEÚÒ â–fÑïûò–f‘¶4ƒ¸¥Y¤-Í"miiK3ˆ[šEÚÒ,Ò–f·4‹´¥Y¤-Í"miqK³H[šEÚÒ Ò–fÍÛýDqK³F[šAÜÒ,Ò–fÑó~¢¼¥Y¤-Í"miiKs·4‹´¥Y¤-Í"miqK³H[šEÚÒ â–f‘¶4‹´¥Y¤-Í niaK³F[šAÚҬіf‘¶4‹´¥Ä-Í"miiK3ˆ[šEÚÒ,–f¶4ƒ¸¥Y¤-Í"miiK3ˆ[šEÚÒ,Ò–f·4‹ÞîÊ[šEØÒã-Í"liÖhK3ˆ[šEÚÒ,Ò–f‘¶4ƒ¸¥Y¤-Í"miiK³F[šE?ThK3ˆ[šEÚÒ,Ò–f·4‹~ß“·4‹´¥Ä-Í"liÖhK³[š1ÜÒ,Ò–f‘¶4ƒ¸¥Y¤-Í"miiK3ˆ[šEØÒ¬Ñ–æ niÖ¼Ýo“·4‹´¥Ä-Í"mi=ï·É[šEÚÒ,Ò–f‘¶4ƒ¸¥Y„-ÍmiiK3ˆ[šEÚÒ,Ò–f·4‹´¥Y¤-Í"liÆpK³èüyã–f·4‹´¥Y¤-Í"miqK³H[šEÚÒ úÒ–f‘¶4‹´¥Y„-Í1ÞÒ,Ò–f‘¶4‹´¥Ä-Í"miiK3ˆ[šEØÒ¬Ñ–f¶4c¸¥Y¤-Í"miqK³H[šEÚÒ,Ò–f·4‹´¥Y¤-Í niaK³F[šEÚÒ â–f‘¶4‹´¥Y¤-Í niiK³[š1ÜÒ,ºÏhK³H[šƒ¼¥Y¤-Í"miqK³H[šEÚÒ,Ò–f·4‹´¥Y„-ÍniiK³è?ü–ª·4ƒ¸¥Y¤-Í¢çý:yK³[š5ÚÒ,–f ·4‹´¥Y¤-Í"miqK³H[šEÚÒ â–f‘¶4‹´¥Y¤-Í miÖhK³H[š/tli½aKóÿ¾–ÿ÷8+ÍA®4_èË•æ Wšƒ\ir¥ù]•æ Wšƒ\ir¥ùBG¥9È•æ Wš/tTšƒ\ir¥9È•æ ¹ÒãJs+Í:*ÍA®4±ÒãJó…ŽJs+ÍA®4_è¨4¹ÒäJs+Í:*ÍA®4¹ÒäJó…ŽJs+ÍA®4_è¨4¹ÒÄJsŒ+Í?èª4ƒXi±ÒäJ3ˆ•f+Í Všƒ\i©ÒŒa¥9È•f+Í VšA¬4¹Ò b¥ÄJ3ˆ•æ WšA¬4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒXi±ÒäJ3ˆ•f+Í Ušc\i±Ò b¥ùBG¥ÄJ3ˆþ b¥9È•f+Í Všƒ\iýÖ_ñ±Ò b¥9È•f+Í VšA¬4¹Ò b¥ÄJs+Í Uš1¬4ƒXir¥ÄJ3ˆ•æ WšAo÷uTšA¬4¹Ò b¥ÄJsÐ+Í VšA¬4ƒXi¾ÐQi±Ò b¥ÄJs+Í VšAª4Ç¸Ò b¥ÄJ3ˆ•æ WšA¬4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒXi±ÒäJ3ˆ•f+Í Všƒ\i±Ò b¥ÄJs+ÍVšA¬4¹Ò b¥ÄJ3ˆ•æ •f+Í Všƒ\i±Ò b¥ÄJs+Í VšA¬4¹Ò b¥ÄJ3ˆ•æ WšA¬4ƒTiŽq¥ÄJ3ˆ•f+ÍA®4ƒÞï7ê¨4ƒXir¥ÄJ3ˆ•æ WšA¬4ƒXi±ÒäJ3ˆ•f+Í:*Í VšA¬4ƒXib¥ÃJ3ˆ•æ WšA¿ï7ê¨4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒXi±ÒäJ3ˆ•f+Í Všƒ\i±Ò b¥9ˆ•fÌÛýD¹ÒŒa¥9È•f+Í Všƒ¾Xi±Ò b¥ÄJó…ŽJ3ˆ•f+Í Všƒ\i±Ò b¥9È•f+Í VšA¬4¹Ò R¥ÃJs+ÍVšA¬4ƒXir¥ÄJ3ˆ•æ WšA¬4ƒTiưÒäJ3ˆ•f+Í Všƒ\i±Ò b¥9È•f+Í VšAª4_æ¨4ƒTiưÒäJ3ˆ•f+Í Všƒ\i±Ò b¥9ˆ•f +Í Ÿu.‚•æ WšA¬4ƒXir¥ôû~œŽJ3ˆ•æ WšAª4cXi©ÒãJ3ˆ•f+ÍA®4ƒXi±Ò b¥9È•f*ÍVš/äJ3æí~›ŽJ3ˆ•æ WšA¬4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒTiÆ°Ò b¥9È•f+Í Všƒ\i±Ò b¥¤JsŒ+Í óçÍ•æ WšA¬4ƒXi±ÒäJ3ˆ•f+ÍA®4ƒXi±Ò R¥ù2G¥ÄJ3ˆ•f+ÍA®4ƒXi±ÒäJ3H•f +Í Ušc\i±Ò b¥9È•f+Í VšA¬4¹Ò b¥ÄJs+Í Uš1¬4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒXi©ÒãJ3è>ÃJ3ˆ•æ •f+Í Všƒ\i±Ò b¥ÄJs+Í VšAª4Ç¸Ò b¥ô~Kõ¨4¹Ò b¥ÄJs+Í Uš1¬4ƒTiŽq¥ô~wG¥ÄJs+Í VšA¬4¹Ò b¥ÄJ3ˆ•æ Vš1¬4ƒXiþAW¥ô¦Jóy×Yir¥ùBG¥9È•æ Wšƒ\iþAW¥9È•æ Wšƒ\i¾ÐQir¥9È•æ •æ Wšƒ\ir¥ùB®4ǸÒäJó…ŽJs+ÍA¬4ǸÒ|¡£ÒäJs+Í:*ÍA®4¹ÒäJó…ŽJs+ÍA®4¹Ò|¡£ÒäJs+Í:*ÍA®4±ÒãJóº*Í VšA¬4¹Ò b¥ÄJ3ˆ•æ WšAª4cXir¥ÄJ3ˆ•f+ÍA®4ƒXi±Ò b¥9È•f+Í Všƒ\i±Ò b¥ÄJs+Í VšA¬4¹Ò b¥ÄJ3H•æWšA¬4ƒXi¾ÐQi±Ò ⟃Xir¥ÄJ3ˆ•æ WšA¿õW®•&/}ÞoÔVšº”J“‡÷µ•¦.µÒÔ¥VšDÏûÚJS—ZiòÒã~£¶Òj¥Iô~¿Q[i µÒ$ú}¿Q[iòÒç?oÔ7—¶ÒÄ¥­4‰ž÷µ•¦.µÒÔ¥Vš¼ôy¾Q[iêP+M^zÜoÔVšºÔJS—Zi=ï7j+M]j¥Iô¸ß¨­4…Zi½ßoÔVšú´ÒÔ¥Vš¼ôq¿Q[iêR+M¢÷ûÚJ“—RiêR*Mj¥ÉCŸ÷µ•¦.µÒä¥Tš¼ôu¿Q[iâã¶Òä¥TšºÔJS—Zi=î7j+M¡VšDï÷µ•¦¾­4u©•&/=þy£¾½ôy¿Q[iêãZiòÒó|£¶ÒÔ¡Vš¼ôq¿Q[iêR+M]j¥Iô¸ß¨­4u©•¦.µÒä¥ÏûÚJ“èí~£¶Ò$úºß¨­4õ-h¥ÉKÏûÚJ—¶Òä¥ÇýFm¥©K¥©C­4yèy¿Q[iêR+M^ú¸ß¨­4…Zi½ßoÔVšúÂ[iêR+M¢ûÚJS¨•&ÑÛýFm¥©oA+M]j¥©K­4yéùÏõÝ¥Tš:ÔJ“èq>Q[iêP+M]j¥ÉKÏû‰ÚJS—Zi}üóD}‹>ï'j+M|á[iòÒóŸ'êÛK_÷µ•&ÑÇýDm¥)ÔJS_x+M^zÜOÔVšºÔJS—RiòP*M¡Tšú°Vš<ô¸_¨­4u©•¦.µÒä¥çü2—.µÒÔ¥VšDSiÒ|ÞÔVšúº[iòÒó~ ¶Òj¥Iôq?P[iêR+M]j¥ÉKûj¥‰C[iâP+Mšçý@m¥©K­4yéq?P[iêR+M]j¥ÉKÏûj¥Ióv¿OSiê‹n¥©3­4‰ÞïÇi+M¡VšúÂ[iòÒÇý8m¥©K­4u)•&¥Ò䡯_×¶•&ÑÇý8m¥©K­4u©•&/=îÇi+M]j¥Iô~>N[iµÒ¤y»ß¦­4ñ ØJS—Zi¥Ò$zÞoÓVšúÂ[iòÒÇý6m¥©K­4u)•&=îÇi+M}Z+M]j¥ÉKŸ÷ã´•¦.µÒä¥Çý8µÒ”i¥Itþ¼µÒj¥©ÿø­4yéq?N[i µÒ$z¿§­4u©•¦.µÒä¥Tš¼ôy¾N[iâÐVš¼ô¼ÿr`+M}\+M]j¥ÉKŸ÷ë´•&ÑÛù:m¥Iôu¾NŸ­4‰>î×i+M]j¥©K­4yéq¿N[iêãZiêR+M^zÞ¯ÓVšº”J“‡>þy¾=ôùë* þª4‰Þï×i+M^úº_§­4uéóßßTýöÒçù:m¥ItŸyܯÓVšø¢·ÒÄ¥­4yéó~¶Ò$z»_§­4yéë~¶ÒÔ¥Vš¼ô<_§­4u¨•&/ý‡ßRÝJS×JS—ZiòÒó~¶ÒÔ¥Tš<ôq¿N­4eZiýû;ªß¢Çý:m¥©o@+M]j¥ÉKŸ÷ë´•¦>®•&/=î×i+M]J¥©C­4yèy¾N¿·ÒüùÒï­4¿½ô翸ñ–f‘¶4ƒ¸¥Y¤-Í"miiKs·4‹´¥Y¤-Í"miqK³H[šEÚÒ â–f‘¶4‹´¥Y¤-Í miÖhK³H[šAÜÒ,Ò–f¶4k´¥Ä-Í"miµÒÄ%niiK³H[šEÚÒ â–f‘¶4‹´¥Y¤-Í niiK³H[šAÜÒ,Ò–f¶4k´¥9È[š‹°¥¹[šEÚÒ\„-ÍEØÒ\„-Í"mi.úyKs ¶4‹´¥¹[š‹°¥¹[šEÚÒ\„-ÍEØÒ\„-Í"mi.–æ"liiKs¶4aKs¶4‹´¥¹[š‹°¥Y¤-ÍEØÒ\„-ÍE?oiÖhKs¶4aK3ˆ[š‹°¥¹ÿJÑ"liiKs¶4aK³H[š‹~ÿúñâZ„-ÍEØÒ,Ò–æ"li.–æ"liiKs¶4aK³H[š‹~ÞÒ\ƒ-ÍEØÒ,Ò–æ"li.–f‘¶4½Ýo·4aK³H[š‹°¥¹[šEÚÒ\„-ÍEØÒ\„-Í ni.–æ"li.–f‘¶4aKsÑÏ[š5ÚÒ\„-ÍEØÒ\„-Í"mi.–æ"liiKs¶4aKs¶4‹´¥¹[š‹ž÷Å-ÍEØÒ\„-ÍEØÒ,Ò–æ¢÷ûâ–æ"liaKs ¶4aK³H[š‹°¥¹[š‹°¥Ä-ÍEØÒ\„-Í"mi.–æ"li.–f‘¶4aKs¶4‹´¥¹[š‹°¥¹[šEÚÒ\„-ÍE?oiÖhKs¶4aKs¶4‹´¥¹[š‹°¥¹[šEÚÒ\„-ÍEØÒ,Ò–æ"li.–æ"liiKs¶4aK3ˆ[š‹°¥¹[š‹°¥Y„-Í5ØÒ\„-Í"mi.ú}¿QÜÒ\„-Í"mi.–æ"li.–f‘¶4aKs¶4‹´¥¹[š‹°¥¹[šEÚÒ\„-ÍEØÒ,–暷û‰Ò–æliiKs¶4aK³H[š‹°¥¹[š‹°¥Ä-ÍEï÷Å-ÍEØÒ,Ò–æ"li.–f‘¶4aKs¶4aK³H[š‹~ÞÒ\ƒ-Í"li®Á–æ"li.–f‘¶4aKsÑóçr¿H[š‹°¥¹èç-Í5ØÒ,Ò–æ"li.–æ"liiKs¶4aK³H[š‹°¥¹[š‹~ÞÒŒá–æ¢Ÿ·4×`K³H[š‹°¥¹[š‹°¥Y¤-ÍEØÒ\„-Í"li®Á–梟V`K³H[š‹°¥¹[šEÚÒ\ôû~œ¸¥¹[šEÚÒ\ôó–æli.úyK³F[š‹°¥¹[šEÚÒ\„-ÍEØÒ\„-Í"mi.úyKs ¶4ƒ´¥¹æí~›¸¥¹[šEÚÒ\„-ÍEØÒ,Ò–æ"li.–æ"liiKsÑû{0k°¥¹[šEÚÒ\„-ÍEØÒ,Ò–æ"li.–梟·4k´¥¹èüyÓ–f‘¶4aKs¶4aK³H[š‹°¥¹[šEÚÒ\„-ÍEØÒ\ôó–f ·4½ÿ¼V¶[š‹°¥Y¤-ÍEØÒ\„-Í"mi.úyKs ¶4ý¼¥Y£-ÍEØÒ\„-Í"mi.–æ"li.–f‘¶4aKs¶4‹´¥¹èç-Í5ØÒ\„-Í"mi.–æ"li.–f‘¶4aKsÑÏ[š5ÚÒ\tŸÁ–æ"liqKs¶4aK³H[š‹°¥¹[š‹°¥Y¤-ÍEØÒ\ôó–f¶4aKsÑø-UniiKs¶4aK³H[š‹~ÞÒ\ƒ-ÍE?oiÖhKs¶4aKs¶4‹´¥¹[š‹°¥Y¤-ÍEØÒ\„-ÍEØÒ,–æli.–æ ßÜÒ\ô¦-Íçÿ~-äª4¹Ò|¡£ÒäJs+ÍA®4ÿ «ÒäJs+ÍA®4_è¨4¹ÒäJó…ŽJs+ÍA®4¹Ò|!Wšc\ir¥ùBG¥9È•æ Všc\i¾ÐQir¥9È•æ •æ Wšƒ\ir¥ùBG¥9è•æ Wšƒ\i¾ÐQir¥9È•æ •æ WšƒXiŽq¥ù]•f+Í Všƒ\i±Ò b¥ÄJs+Í Uš1¬4¹Ò b¥ÄJ3ˆ•æ WšA¬4ƒXi±ÒäJ3ˆ•f+ÍA®4ƒXi±Ò b¥9È•f+Í Všƒ\i±Ò b¥¤JsŒ+Í VšA¬4_è¨4ƒXiñÏ¿A¬4¹Ò b¥ÄJs+Í ßú+ž VšA¬4¹Ò b¥ÄJ3ˆ•æ WšA¬4ƒXir¥¤J3†•f+ÍA®4ƒXi±ÒäJ3èí~£ŽJ3ˆ•æ WšA¬4ƒXir¥ÄJ3ˆ•f+Í:*Í VšA¬4ƒXir¥ÄJ3H•æWšA¬4ƒXi±ÒäJ3ˆ•f+ÍA®4ƒXi±Ò b¥9È•f+Í Všƒ\i±Ò b¥ÄJs+Í ÷û:*Í VšƒXiÆ°Ò b¥9È•f+Í VšA¬4_è¨4ƒXi±ÒäJ3ˆ•f+Í Všƒ\i±Ò b¥9È•f+Í VšA¬4¹Ò b¥¤JsŒ+Í VšA¬4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒXi±ÒäJ3ˆ•f+Í Všƒ\i±Ò zÞoÔQi±Ò b¥ÄJs+ÍVšA¬4¹Ò ú}¿QG¥ÄJs+Í VšA¬4ƒXir¥ÄJ3ˆ•æ WšA¬4ƒXi±ÒäJ3ˆ•f+ÍA¬4cÞî'Ê•f +ÍA®4ƒXi±ÒäJ3ˆ•f+Í Vš/tTšAï÷uTšA¬4¹Ò b¥ÄJs+Í VšA¬4ƒXir¥¤J3†•æ Vš1¬4ƒXi±ÒäJ3ˆ•f+ÍA®4ƒXi©ÒŒa¥9È•f+Í VšA¬4¹Ò b¥ÄJs+Í VšA¬4ƒTi¾ÌQi©ÒŒa¥9È•f+Í VšA¬4¹Ò b¥ô¼(Wš1¬4ƒ~þÕ¹Všƒ\i±Ò b¥9È•fÐïûq:*Í Všƒ\i©ÒŒa¥¤JsŒ+Í VšA¬4¹Ò b¥ÄJ3ˆ•æ WšAª4cXi¾+͘·ûm:*Í Všƒ\i±Ò b¥9È•f+Í VšA¬4¹Ò R¥ÃJ3ˆ•æ WšA¬4ƒXir¥ÄJ3ˆ•f*Í1®4ƒÎŸ7Wšƒ\i±Ò b¥ÄJs+Í VšA¬4¹Ò b¥ÄJ3H•æË•f+Í VšA¬4¹Ò b¥ÄJs+Í Uš1¬4ƒTiŽq¥ÄJ3ˆ•æ WšA¬4ƒXi±ÒäJ3ˆ•f+ÍA®4ƒþÿŒÝ]r\Y“\ÑÑTHäæ?1u1ÃýÀðᮨ'½,‹!´ŽÈÆ.W¥ÃJ3ˆ•æ WšA¬4ƒXi±ÒäJ3ˆ•f*Í1®4ƒö3¬4ƒXi¾ÑRi±Ò b¥9È•f+Í VšA¬4¹Ò b¥¤JsŒ+Í VšAÿá·T—Js+Í VšA¬4¹Ò R¥ÃJ3H•æWšA¬4ƒXi±ÒäJ3ˆ•f+ÍA®4ƒXi±Ò b¥9ˆ•f +Í VšÑViÝPiþó÷¯CK¥ÄJs+Í VšA¬4ƒXi¾ÑRi±Ò b¥ÄJs+Í VšA¬4¹Ò b¥ÄJ3ˆ•æ Vš1¬4ƒXir¥ÄJ3H•f +ÍA®4ƒXi±ÒäJ3ˆ•f+Í Všƒ\i±Ò b¥ÄJs+Í VšA¬4¹Ò b¥¤J3†•æ-•f‘*Í"UšA¬4‹Ti©Ò,R¥ÄJ³•f*Í VšEª4‹Ti©Ò b¥Y¤J³H•f‘*Í VšEª4‹Ti±Ò,R¥Y¤J³H•f+Í"UšEª4ƒXi©Ò,R¥Y„J3†•f‘*Í¢'þ—ƒ\i©Ò,Òß‹Ti±Ò,R¥Y¤J3ˆ•fÑþ‰§H•f‘*Í VšEª4‹Ti©Ò b¥Y¤J³H•f+Í"Tš5ª4‹Ti±Ò,R¥Y¤J3ˆ•fÑm£\i©Ò b¥Y¤J³H•f+Í"UšEª4‹Tir¥Y¤J³H•f‘*Í VšEª4‹PiưÒ,R¥Y¤J³H•f+Í"UšEª4ƒXi©Ò,R¥Y¤J3ˆ•f‘*Í"UšA¬4‹Ti©Ò,R¥ÄJ³H•f‘*Í"UšAª4kTi©Ò b¥Y¤J³H•f‘*ÍA®4‹Ti©Ò úG•f‘*Í"UšEª4ƒXi©Ò,R¥ÄJ³H•f‘*Í"UšA¬4‹Ti¡ÒŒa¥Y¤J³H•f‘*Í VšEª4‹Ti©Ò b¥Y¤J³H•f+Í"UšEª4‹Ti±Ò,R¥YôÜß(WšEª4‹Ti©Ò R¥Y£J³H•f+Í¢ýr¥Y¤J3ˆ•f‘*Í"UšEª4ƒXi©Ò,R¥ÄJ³H•f‘*Í"UšA¬4‹Ti©Ò R¥YsÛŸ(Vš5ª4ƒXi©Ò,R¥ÄJ³H•f‘*Í"Ušƒ\i©Ò,R¥Y¤J3ˆ•f‘*Í"UšA¬4‹Ti©Ò,R¥ÄJ³•f*Í Uš5ª4‹Ti©Ò b¥Y¤J³H•f+Í"UšE¨4kTi±Ò,R¥Y¤J³H•f+Í"UšEª4ƒXi©Ò,R¥Y„JsŒ+Í"Tš5ª4ƒþQ¥Y¤J³H•f‘*Í VšEª4‹žûÅJ³F•fÑå¯ÎU¨Ò b¥Y¤J³H•f+Í¢ýqr¥Y¤J3ˆ•f*ÍUšE¨4cXi©Ò,R¥ÄJ³H•f‘*Í"UšA¬4‹PiÖ¨ÒÄJ³æ¶¿M®4‹Ti±Ò,R¥Y¤J3ˆ•f‘*Í"UšEª4ƒXi¡Ò¬Q¥Y¤J3ˆ•f‘*Í"UšA¬4‹Ti©Ò,B¥ÃJ³hýyc¥ÄJ³H•f‘*Í"UšA¬4‹Ti©Ò b¥Y¤J³H•f*Í1®4‹Ti©Ò,R¥ÄJ³H•f‘*Í VšE¨4kTi¡ÒŒa¥Y¤J³H•f+Í"UšEª4‹Ti±Ò,R¥Y¤J3ˆ•f*ÍUšEª4ƒXi©Ò,R¥Y¤J3ˆ•f‘*Í"Tš1¬4‹ö3ª4‹Tir¥Y¤J³H•fÐ?ª4‹Ti©Ò,R¥ÄJ³H•f*ÍVšEª4‹þÃo©ºÒ b¥Y¤J³H•f+Í"Tš5ª4‹PiưÒ,R¥Y¤J³H•f+Í"UšEª4ƒXi©Ò,R¥Y¤J3H•f*Í"Ušo´TšE7UšŸÿþ߯·Jóño`øóÒ VšA¿\:•&.JS—ZiêR+ÍëKß*M¡Vš×÷­ÒÔ¥Vš¸t*M\:•¦P+M Si µÒj¥)ÔJß‚Vš8t*Mj¥‰K§Òj¥‰k¥©C­4qèTš¸t*M]j¥‰K§ÒÄ¥SiêR+M¡Všø¸SiâÒ©4u©•¦.µÒÄ¥SiâÒ©4…ZiJS¨•¦P*M™Vš×ßo•æõ¥o•&Qþî«û'•¦.µÒä¥Tš¼”JS—ZiêR*MJ¥©C­4u©•&Q*M~\*M]j¥©K­4y)•&/¥Òj¥I”¿û¥Òj¥I”JSß‚Vš¼”JS¨•&Ñ}}£¾UšúÂ[iêR+M^J¥ÉKSiêP+Mj¥ÉK©4qéTšD©4ñq§Òä¥TšºÔJS—Zi¥Òj¥Iô1ÿÄCt_ߨo•¦¾­4u©•&/¥Ò䥯ý:•¦>®•&/½ö7êTšº”J“‡ûu*M]j¥©K­4‰žûu*M]j¥ÉKý:•¦P+M¢Ïý:•¦P+M¢ý:•&/½~¼Q¿\:•&.J“蹿Q§ÒÔ¥VšºÔJ“—^ëu*Mj¥ÉKý:•¦.µÒÔ¥VšDÏý:•¦.µÒ$zìoÔ©4…Zi}îoÔ©4õ-h¥©K­4y龿Q§ÒÔ¥VšDŸûu*M^úÚߨVš:ÔJ“‡^ûu*M]j¥ÉK©4yék£N¥‰;•&/¥ÒÔ¥þßþFJ“豿Q§Òj¥Iô¹¿Q§ÒÔ· •¦.µÒä¥Ç7ê×K¯ý:•¦>®•&/=×7êTš:ÔJ“—îûu*M]j¥©K­4‰ûu*M]j¥©K­4y鵿Q§Ò$ºíoÔ©4‰¾ö7êTšú´Òä¥çþFJ—N¥ÉKý:•¦>.•¦ýó¹¿Q§ÒÔ¥VšºÔJ“—îûu*M¡VšDŸûu*M}á­4u©•&Ñ}£N¥)ÔJ“è¶¿Q§ÒÔ· •¦.µÒÔ¥Vš¼ôüñFýv)•¦µÒ$z¬OÔ©4u¨•¦.µÒä¥çþDJS—ZiÝ÷ÇéTšB­4õ…·Òä¥ûþ8JS—ZiêR*Mzüxœ~=ôõg{ÀN¥Itß§SiêR+M]j¥ÉKýq:•¦.µÒ$ú\§SiµÒ¤¹íoÓ©4ñ 8•¦.µÒ$J¥I”JS¨•¦¾ðVš¼tßߦSiêR+M]J¥ÉCýq:•¦>­•¦.µÒä¥×þ8JS—ZiòÒcœZiÊ´Ò$ZÞZi µÒÔ¿•&/=öÇéTšB­4‰>÷ÇéTšºÔJS—ZiòÒ}ZiâЩ4qèTš¼ôÜÿqàTšú¸VšºÔJ“—^ûët*M¢Ûú:J“èk}^­4‰îûët*M]j¥©K­4y)•&Ñ×þ:JS—ZiòÒsN¥©K©4yèþãuúõÐëÏV@|«4‰>÷×éTš¼ôµ¿N§ÒÔ¥×ÏßTýõÒk}N¥I´Ÿyì¯Ó©4ñEŸJ—N¥ÉK¯ýu:•&ÑmN¥ÉK_ûët*M]j¥ÉKÏõu:•¦µÒä¥ÿð[ª§ÒÔǵÒÔ¥Vš¼ôÜ_§SiêR*Mºï¯S+M™VšD?GõWôØ_§SiêÐJS—ZiòÒkN¥©k¥ÉKýu:•¦.¥ÒÔ¡Vš<ô\_§o•æõ¥o•毗žÿþÏѶ¥9È[šo´liò–æ oiò–æ_´miò–æ oiò–æ-[šƒ¼¥9È[šo´liò–æ oiò–æyKsŒ·4yKó–-ÍAÞÒÄ-Í1ÞÒ|£eKs·4yKó–-ÍAÞÒä-ÍAÞÒ|£eKs·4yKs·4ßhÙÒä-ÍAÞÒ|£eKs·4qKsŒ·4ÿ¢mK3ˆ[šAÜÒô·4ƒ¸¥Ä-Í niò–f¶4c¸¥9È[šAÜÒ â–f·4yK3èS0AÜÒ â–æ oiqK3ˆ[šƒ¼¥Ä-Í niqKs·4ƒ¸¥Ä-ÍAÞÒ â–f·4ƒ´¥9Æ[šAÜÒ â–æ-[šAÜÒ â¥(ˆ[šƒ¼¥Ä-Í niò–fÐÇü‡¸‚¸¥Ä-ÍAÞÒ â–f·4ƒ¸¥9È[šAÜÒ â–æ oiiK3†[šAÜÒä-Í niqKs·4ƒnûµliqKs·4ƒ¸¥Ä-ÍAÞÒ â–f·4ƒ¸¥ùFË–f·4ƒ¸¥Ä-ÍAÞÒ â–f¶4ÇxK3ˆ[šAÜÒ â–æ oiqK3ˆ[šƒ¼¥Ä-Í niqKs·4ƒ¸¥Ä-ÍAÞÒ â–f·4ƒ¸¥9È[šAÜÒ â–f·4qK3†[šAÜÒä-Í niqK3ˆ[šo´liqK3ˆ[šƒþá–f·4ƒ¸¥Ä-ÍAÞÒ â–f·4yK3ˆ[šAÜÒ â–æ oi}îo”·4ÇxK3ˆ[šAÜÒ â–æ oiqK3ˆ[šAÜÒä-Í niqKs·4ƒ¸¥Ä-Í niò–f·4ƒ¸¥ùFË–f·4ƒ¸¥Ä-ÍAÜÒŒá–f·4yK3èc£–-Í niò–f·4ƒ¸¥Ä-ÍAÞÒ â–f·4yK3ˆ[šAÜÒ â–æ oiqK3è©ÿ¤ñ niÆÜö'Ê[š1ÜÒä-Í niqKs·4ƒ¸¥Ä-Í ni¾Ñ²¥Ä-Í niqKs·4ƒ¸¥Ä-ÍAÞÒ â–f·4ƒ¸¥9È[šAÚÒŒá–æ niÆpK3ˆ[šAÜÒä-Í niqKs·4ƒ¸¥¤-Íniò–fÐçþ@-[šAÜÒä-Í niqKs·4ƒ¸¥Ä-Í mi¾Í²¥¤-Íniú‡[šAÜÒ â–f·4yK3ˆ[šAÜÒÄ-Íni]DpKs·4ƒ¸¥Ä-ÍAÞÒ úاeK3ˆ[šƒ¼¥¤-ÍniiKsŒ·4ƒ¸¥Ä-ÍAÞÒ â–f·4ƒ¸¥9È[šAÚÒŒyî“·4cnûÛ´liqKs·4ƒ¸¥Ä-ÍAÞÒ â–f·4ƒ¸¥9È[šAÚÒŒá–f·4yK3ˆ[šAÜÒä-Í niqK3H[šc¼¥´þ¼yKs·4ƒ¸¥Ä-Í niò–f·4ƒ¸¥9È[šAÜÒ â–f¶4ßfÙÒ â–f·4ƒ¸¥9È[šAÜÒ â–æ oiiK3†[šAÚÒã-Í niqKs·4ƒ¸¥Ä-Í niò–f·4ƒ¸¥9È[šAÚÒŒá–f·4yK3ès–-Í niò–f·4ƒ´¥9Æ[šAûniqKó–-Í niqKs·4ƒ¸¥Ä-Í niò–f·4ƒžëë´liqK3è?ü–ê²¥9È[šAÜÒ â–æ oiiK3†[šAÚÒã-Í niqK3ˆ[šƒ¼¥Ä-Í niò–f·4ƒ¸¥Ä-ÍAÜÒŒá–fÐs}¶-Í ¶4ÿýÿvÝ·J3ˆ•æ WšA¬4ƒXi±Ò|£¥Ò b¥ÄJ3ˆ•æ WšA¬4ƒXir¥ÄJ3ˆ•f+ÍA¬4cXi=Uir¥ÄJ3H•f +ÍA®4ƒXi±ÒäJ3ˆ•f+Í Všƒ\i±Ò b¥ÄJs+Í VšA¬4¹Ò b¥¤J3†•æ-•f‘*Í"UšA¬4‹Ti©Ò,R¥ÄJ³•f*Í VšEª4‹Ti©Ò b¥Y¤J³H•f‘*Í VšEª4‹Ti±Ò,R¥Y¤J³H•f+Í"UšEª4ƒXi©Ò,R¥Y„J3†•f‘*Í"Ušƒ\i©Ò,Òß‹Ti±Ò,R¥Y¤J3ˆ•fÑþ‰§H•f‘*Í VšEª4‹Ti©Ò b¥Y¤J³H•f+Í"Tš5ª4‹Ti±Ò,R¥YôÜß(WšE·ýr¥Y¤J3ˆ•f‘*Í"UšA¬4‹Ti©Ò,R¥9È•f‘*Í"UšEª4ƒXi©Ò,B¥ÃJ³H•f‘*Í"UšA¬4‹Ti©Ò b¥Y¤J³H•f‘*Í VšEª4‹Ti±Ò,R¥Y¤J³H•f+Í"UšEª4‹Ti©Ò¬Q¥Y¤J3ˆ•f‘*Í"UšEª4¹Ò,R¥Y¤J3ˆ•f‘*Í"UšEª4ƒ>Ti©Ò,R¥ÄJ³H•f‘*Í"UšA¬4‹Ti¡ÒŒa¥Y¤J³H•f‘*Í VšEª4‹Ti©Ò b¥Y¤J³H•f+Í"UšEª4‹Ti±Ò,R¥Y¤Js+Í"UšEª4‹Ti©Ò¬Q¥Y¤J3ˆ•fÑÇþF¹Ò,R¥ÄJ³H•f‘*Í"UšA¬4‹Ti©Ò b¥Y¤J³H•f‘*Í VšEª4‹žø_–©Ò¬¹íO+ÍUšA¬4‹Ti©Ò b¥Y¤J³H•f‘*ÍA®4‹Ti©Ò,R¥ÄJ³H•f‘*Í UšEª4‹Ti©Ò b¥Y„J³F•f*ÍUšEª4‹Ti±Ò,R¥Y¤J3ˆ•f‘*Í"Tš5ª4ƒXi©Ò,R¥Y¤J3ˆ•f‘*Í"UšA¬4‹Ti©Ò,B¥9Æ•f*ÍUšA¬4‹Ti©Ò,R¥ô¡J³H•f‘*Í Uš5ª4‹.u®B•f+Í"UšEª4ƒXi}ì“+Í"UšA¬4‹PiÖ¨Ò,B¥ÃJ³H•f‘*Í VšEª4‹Ti©Ò b¥Y„J³F•æ Vš5·ýmr¥Y¤J3ˆ•f‘*Í"UšA¬4‹Ti©Ò,R¥ÄJ³•f*Í"UšA¬4‹Ti©Ò b¥Y¤J³H•f*ÍVšEëÏ+Í VšEª4‹Ti©Ò b¥Y¤J³H•f+Í"UšEª4‹PiŽq¥Y¤J³H•f‘*Í VšEª4‹TiýûnßpVš5ª4‹PiưÒ,R¥Y¤J3ˆ•f‘*Í"UšEª4ƒXi©Ò,R¥ÄJ³•f*Í"UšA¬4‹Ti©Ò,R¥ÄJ³H•f*ÍVšEûUšEª4¹Ò,R¥Y¤J3ˆ•f‘*Í"UšEª4ƒXi©Ò,B¥ÃJ³H•fÑø-UWšA¬4‹Ti©Ò b¥Y„J³F•f*ÍVšEª4‹Ti©Ò b¥Y¤J³H•f+Í"UšEª4‹Ti©Ò¬Q¥Y¤Jó–J³è¦Jóï_w·Js+Í7Z*ÍA®4¹ÒäJó/Ú*ÍA®4¹ÒäJó–Js+ÍA®4ßh©4¹ÒäJs+Í7r¥9Æ•æ Wšo´Tšƒ\ib¥9Æ•æ-•æ Wšƒ\i¾ÑRir¥9È•æ Wšo´Tšƒ\ir¥9È•æ-•æ Wšƒ\i¾ÑRir¥9ˆ•æWšÑVi±Ò b¥9È•f+Í VšA¬4}°Ò R¥ÃJs+Í VšA¬4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒXi±ÒäJ3ˆ•f+Í Všƒ\i±Ò b¥9È•f+Í VšAª4Ç¸Ò b¥ÄJó–J3ˆ•fÿþÄJs+Í VšA¬4¹Ò úÐ?ñ±Ò b¥9È•f+Í VšA¬4¹Ò b¥ÄJs+Í Uš1¬4ƒXir¥ÄJ3ˆ•æ WšA·ýZ*Í Všƒ\i±Ò b¥9È•f+Í VšA¬4ßh©4ƒXi±Ò b¥9È•f+Í Ušc>Xi±Ò b¥ÄJs+Í VšA¬4¹Ò b¥ÄJ3ˆ•æ WšA¬4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒXi±Ò b¥9ˆ•f +Í Všƒ\i±Ò b¥ÄJó–J3ˆ•f+ÍA®4ƒXi±Ò b¥9胕f+Í Všƒ\i±Ò b¥ÄJs+Í VšAª4Ç¸Ò b¥ÄJ3ˆ•æ WšA¬4ƒXi±ÒäJ3ˆ•f+ÍA®4ƒXi±Ò b¥9È•f+Í Všo´TšA¬4ƒXi±ÒÄJ3æs£–Js+Í ýZ*Í Všƒ\i±Ò b¥ÄJs+Í VšA¬4¹Ò b¥ÄJ3ˆ•æ WšA¬4ƒXib¥sÛŸ(Wš1¬4¹Ò b¥ÄJs+Í VšA¬4ƒXi¾ÑRi±Ò b¥ÄJs+Í VšA¬4}°Ò b¥ÄJ3ˆ•æ WšAª4cXib¥ÃJ3ˆ•f+ÍA®4ƒXi±ÒäJ3ˆ•f*ÍVšƒ\i±Ò b¥ÄJs+Í VšA¬4¹Ò b¥ÄJ3H•æÛ,•f*ÍVšƒ\i±Ò b¥ÄJsÐ+Í VšA¬4±ÒŒa¥tý«s¬4¹Ò b¥ÄJs+Í ýqZ*Í Všƒ\i©ÒŒa¥¤JsŒ+Í VšA¬4¹Ò b¥ÄJ3ˆ•æ WšAª4cXi¾‘+͘Ûþ6-•f+ÍA®4ƒþþŸb¥9È•f+Í VšA¬4¹Ò R¥ÃJ3ˆ•æ WšA¬4ƒXir¥ÄJ3ˆ•f*Í1®4ƒÖŸ7Wšƒ\i±Ò b¥ÄJs+Í VšA¬4¹Ò b¥ÄJ3H•æÛ,•f+Í VšA¬4¹Ò b¥ÄJs+Í Uš1¬4ƒTiŽq¥ÄJ3ˆ•æ WšA¬4ƒXi±ÒäJ3ˆ•f+ÍA®4ƒTiÆ°Ò b¥9È•f+Í VšA¬4¹Ò b¥¤JsŒ+Í ý +Í Všo´TšA¬4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒXi©ÒãJ3ˆ•fÐø-Õ¥ÒäJ3ˆ•f+ÍA®4ƒTiÆ°Ò R¥9Æ•f+Í VšA¬4¹Ò b¥ÄJs+Í VšA¬4ƒXib¥ÃJ3ˆ•æ_´UšA7UšÏÿ‡í[¥ùø70üyiP+Í _.J—N¥©K­4u©•æõ¥o•¦P+ÍëûViêR+M\:•&.JS¨•&Щ4…Zi µÒj¥‰oA+M:•¦µÒÄ¥Si µÒÄǵÒÔ¡Vš8t*M\:•¦.µÒÄ¥SiâÒ©4u©•¦P+M|Ü©4qéTšºÔJS—ZiâÒ©4qéTšB­4N¥)ÔJS(•¦L+ÍëïÀ·JóúÒ·J“(÷ÕǵÒÔ¥Vš¼”J“—RiêR+M]ú˜J“‡RiêP+M]j¥I”J“—JS—ZiêR+M^J¥ÉK©4…Ziåï¾D©4…Zi¥ÒÔ· •&/¥Òj¥It_ߨo•¦¾ðVšºÔJ“—RiòÒTš:ÔJS‡ZiòR*M\:•&Q*M|Ü©4y)•¦.µÒÔ¥VšD©4…Zi}Ì?ñÝ×7ê[¥©oA+M]j¥ÉK©4yék£N¥©k¥ÉK¯ý:•¦.¥Òä¡ÇþFJS—ZiêR+M¢çþFJS—ZiòÒc£N¥)ÔJ“ès£N¥)ÔJ“èc£N¥ÉK¯oÔ/—N¥‰K§Ò$zîoÔ©4u©•¦.µÒä¥×úFJS‡ZiòÒc£N¥©K­4u©•&Ñs£N¥©K­4‰ûu*M¡VšDŸûu*M} ZiêR+M^ºïoÔ©4u©•&ÑçþFJ“—¾ö7ª•¦µÒä¡×þFJS—ZiòR*M^úÚߨSiâãN¥ÉK©4u©•¦.µÒ$zìoÔ©4…Zi}îoÔ©4õ-h¥©K­4yéñãúõÒk£N¥©k¥ÉKÏõ:•¦µÒä¥ûþFJS—ZiêR+M¢ÇþFJS—ZiêR+M^zíoÔ©4‰nûu*M¢¯ý:•¦¾­4y鹿Q§ÒÄ¥SiòÒc£N¥©K¥©C­4y蹿Q§ÒÔ¥Vš¼tßߨSi µÒ$úÜߨSiê o¥©K­4‰îûu*M¡VšD·ý:•¦¾­4u©•¦.µÒä¥ç7ê·K©4u¨•&Ñc}¢N¥©C­4u©•&/=÷'êTšºÔJ“èþã‰ú½ö'êTšøÂO¥ÉKÏOÔ¯—¾ö'êTšD÷ý‰:•¦P+M}á­4yé±?Q§ÒÔ¥Všº”J“‡žû ÕJSÖJ“‡û u*M]j¥©K­4y)•¦.µÒÔ¥VšDSiÒ¼öêTšúº[iòÒs N¥)ÔJ“è¾?P§ÒÔ¥VšºÔJ“—ûÕJ‡N¥‰C­4ižûu*M]j¥ÉKý:•¦.µÒÔ¥Ïý:•¦P*MšÛþ>M¥©/º•¦Î´Ò$úܧSi µÒÔÞJ“—îûãt*M]j¥©K©4yèñãqúõÐןí;•&Ñ}œN¥©K­4u©•&/=öÇéTšºÔJ“ès}œN¥ ÔJ“æ¶¿M§ÒÄ7àTšºÔJ“(•&Ñs›N¥©/¼•&/Ý÷·éTšºÔJS—RiòÐcœN¥©Ok¥©K­4yéµ?N§ÒÔ¥Vš¼ôاVš2­4‰ÖŸ·VšB­4õÇo¥ÉKýq:•¦P+M¢Ïýq:•¦.µÒÔ¥Vš¼tß_§Vš8t*M:•&/=÷8•¦>®•¦.µÒä¥×þ:J“è¶¾N§Ò$úZ_§W+M¢ûþ:JS—ZiêR+M^zì¯Ó©4õq­4u©•&/=÷×éTšº”J“‡î?^§_½þlÄ·J“èsN¥ÉK_ûët*M]zýüMÕ_/½Ö×éTšDû™Çþ:J_ô©4qéTš¼ôÚ_§SiÝö×éTš¼ôµ¿N§ÒÔ¥Vš¼ô\_§SiêP+M^ú¿¥z*M}\+M]j¥ÉKÏýu:•¦.¥Òä¡ûþ:µÒ”i¥IôówTEýu:•¦¾­4u©•&/½ö×éTšú¸Vš¼ôØ_§SiêR*Mj¥ÉCÏõuúVi^_úViþvéß_u~l[šAÜÒä-Í niqK3ˆ[šo´liqK3ˆ[šAÜÒä-Í niqKs·4ƒ¸¥Ä-Í niâ–f ·4ƒ¸¥9È[šAÜÒ Ò–f ·4yK3ˆ[šAÜÒä-Í niqK3ˆ[šƒ¼¥Ä-Í niqKs·4ƒ¸¥Ä-ÍAÞÒ â–f¶4c¸¥ùFË–f‘¶4‹´¥Ä-Í"miiK³H[šAÜÒ,–f¶4ƒ¸¥Y¤-Í"miiK3ˆ[šEÚÒ,Ò–f‘¶4ƒ¸¥Y¤-Í"miqK³H[šEÚÒ,Ò–f·4‹´¥Y¤-Í niiK³H[šEØÒŒá–f‘¶4‹´¥9È[šEÚÒ,Ò¥¨H[šAÜÒ,Ò–f‘¶4ƒ¸¥Yôñçú?ÄU¤-Í"miqK³H[šEÚÒ,Ò–f·4‹´¥Y¤-Í niaK³F[šEÚÒ â–f‘¶4‹´¥Ä-Í¢ÛþFyK³H[šAÜÒ,úÜß(oiqK³H[šEÚÒ,Ò–æ oiiK³H[šEÚÒ â–f‘¶4‹°¥Ã-Í"miiK³H[šAÜÒ,Ò–fÑs£¼¥Y¤-Í"miiK3ˆ[šEÚÒ,Ò–f·4‹´¥Y¤-Í"miqK³H[šEÚÒ,Ò–f¶4k´¥Y¤-Í niiK³H[šEÚÒä-Í"miiK3ˆ[šEÚÒ,Ò–f‘¶4ƒ¸¥Y¤-Í"miqK³H[šEÚÒ,Ò–f·4‹´¥Y„-ÍniiK³H[šEÚÒ â–f‘¶4‹´¥Y¤-Í niiK³H[šAÜÒ,Ò–f‘¶4‹´¥Ä-Í"miiKs·4‹´¥Y¤-Í"miiK³æs£¼¥Ä-Í¢ýò–f‘¶4ƒnÚÒ,Ò–f‘¶4‹´¥Ä-Í"miiK3ˆ[šEÚÒ,Ò–f‘¶4ƒ¸¥Y¤-Í"miiK³æ¶?QÜҬіf·4‹´¥Y¤-Í niiK³H[šEÚÒä-Í"miiK³H[šAÜÒ,Ò–f‘¶4ƒ¸¥Y¤-Í"miiK3ˆ[šEØÒ¬yî/·4k´¥Y¤-Í"miqK³H[šEÚÒ â–f‘¶4‹°¥Y£-Í niiK³H[šEÚÒ â–f‘¶4‹´¥Ä-Í"miiK³[šc¼¥Y„-ÍmiqK³H[šEÚÒ,Ò–f·4‹´¥Y¤-Í miÖhK³èrà B[šAÜÒ,Ò–f‘¶4ƒ¸¥Yô±?NÞÒ,Ò–f·4‹°¥Y£-Í"liÆpK³H[šEÚÒ â–f‘¶4‹´¥Y¤-Í niaK³F[šƒ¸¥YsÛß&oiiK3ˆ[šEÚÒ,Ò–f·4‹´¥Y¤-Í"miÝ´¥Y„-ÍmiiK3ˆ[šEÚÒ,Ò–f·4‹´¥Y¤-Í"liÆpK³hýyã–f·4‹´¥Y¤-Í"miqK³H[šEÚÒ â–f‘¶4‹´¥Y„-Í1ÞÒ,Ò–f‘¶4‹´¥Ä-Í"miiK3ˆ[šEØÒ¬Ñ–f¶4c¸¥Y¤-Í"miqK³H[šEÚÒ,Ò–f·4‹´¥Y¤-Í niaK³F[šEÚÒ â–f‘¶4‹´¥Y¤-Í niiK³[š1ÜÒ,ÚÏhK³H[šƒ¼¥Y¤-Í"miqK³H[šEÚÒ,Ò–f·4‹´¥Y„-ÍniiK³è?ü–ª·4ƒ¸¥Y¤-Í"miqK³[š5ÚÒ,–f ·4‹´¥Y¤-Í"miqK³H[šEÚÒ â–f‘¶4‹´¥Y¤-Í miÖhK³H[šo´liݰ¥ù×{ÜÖJs+Í7Z*ÍA®4¹ÒäJó/Ú*ÍA®4¹ÒäJó–Js+ÍA®4ßh©4¹ÒäJs+Í7r¥9Æ•æ Wšo´Tšƒ\ib¥9Æ•æ-•æ Wšƒ\i¾ÑRir¥9È•æ Wšo´Tšƒ\ir¥9È•æ-•æ Wšƒ\i¾ÑRir¥9ˆ•æWšÑVi±Ò b¥9È•f+Í VšA¬4¹Ò R¥ÃJs+Í VšA¬4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒXi±ÒäJ3ˆ•f+Í Všƒ\i±Ò b¥9È•f+Í VšAª4Ç¸Ò b¥ÄJó–J3ˆ•fÿþÄJs+Í VšA¬4¹Ò úÐ?ñ±Ò b¥9è߿߬ßLWšA¬4ƒXir¥ÄJ3ˆ•æ WšAª4cXi±ÒäJ3ˆ•f+ÍA®4ƒnûµTšA¬4¹Ò b¥ÄJs+Í VšA¬4ƒXi¾ÑRi±Ò b¥ÄJs+Í VšAª4Ç¸Ò b¥ÄJ3ˆ•æ WšA¬4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒ>÷7j©4¹Ò b¥ÄJ3ˆ•æ WšA¬4ƒXi±ÒÄJ3†•f+ÍA®4ƒXi±Ò b¥ùFK¥ÄJ3ˆ•æ WšA¬4ƒXi±ÒäJ3ˆ•f+ÍA®4ƒXi±Ò b¥9È•f+Í Ušc\i±Ò b¥ÄJs+Í VšA¬4ƒXir¥ÄJ3ˆ•æ WšA¬4ƒXi±ÒäJ3ˆ•f+Í7Z*Í VšA¬4ƒXib¥ÃJ3ˆ•æ WšAûµTšA¬4ÝXi±Ò b¥ÄJs+Í VšA¬4¹Ò b¥ÄJ3ˆ•æ WšA¬4ƒXib¥sÛŸ(Wš1¬4¹Ò úÜŸ¨¥ÒäJ3ˆ•f+Í Všo´TšA¬4ƒXi±ÒäJ3ˆ•f+ÍA®4ƒXi±Ò b¥9È•f*ÍVšƒXiÆ°Ò b¥ÄJs+Í VšA¬4¹Ò b¥¤J3†•æ WšA¬4ƒXi±ÒäJ3ˆ•f+ÍA®4ƒXi±Ò R¥ù6K¥¤J3†•æ WšA¬4ƒXi±ÒäJ3ˆ•f+ÍA¬4cXi]ÿê\+ÍA®4ƒXi±ÒäJ3ècœ–J3ˆ•æ WšAª4cXi©ÒãJ3ˆ•f+ÍA®4ƒXi±Ò b¥9È•f*ÍVšoäJ3æ¶¿MK¥ÄJs+Í VšA¬4¹Ò b¥ÄJ3ˆ•æ WšAª4cXi±ÒäJ3ˆ•f+ÍA®4ƒXi±Ò R¥9Æ•fÐúóæJs+Í VšA¬4ƒXir¥ô¹?NK¥9È•f+Í VšAª4ßf©4ƒXi±Ò b¥9È•f+Í Všƒ\i©ÒŒa¥¤JsŒ+Í VšA¬4¹Ò b¥ÄJ3ˆ•æ WšA¬4ƒXir¥¤J3†•f+ÍA®4ƒXi±Ò b¥9È•f+Í Ušc\iígXi±Ò|£¥Ò b¥ÄJs+Í VšA¬4ƒXir¥ÄJ3H•æWšA¬4ƒþÃo©.•æ WšA¬4ƒXir¥¤J3†•f*Í1®4ƒXi±Ò b¥9È•f+Í Všƒ\i±Ò b¥ÄJs+ÍVšA¬4ÿ¢­Ò º©Ò|}O4›äü+ÚgþºÇùúg^Ý8eæåf™—7Úd^Üød^ŠÖ˜Ÿò-ż¼ÑóêÆ‰0¯nœóR4¿¼§½¼ //E«ËKÑäòêOÛÞòêÄ­±å剖–W7Nfy)ÚX^}JËË­+¯Nœ´òêÆé*/o4ª¼ºqŠÊ«'§¼¼Ñ–òR4¤¼ú”SQ^Ý8 ååö“—7O^Ý8åäÕ“M^Š6“Wâ“—¢µä¥xüYN´“¼øÃ~‹$/n|+$¯ÅóÏò)m#/o4Œ¼¾ñøÃÂoIäåö—7C^ŸH yy¢äå6×"äõ§¤~¼¼ÑôñòF»Ç뉯o¤x¼Í¯Eþy-^Øsÿ+Z9^‹$Ž—Úö×77^Š–×âî—á[Óxù•6h¼¼ÑšñúFRÆë_ü#ÖˆñòD ÆëɯnœvñZ$\¼ú”S-^ßH²xy£½âåÆŠ×"¥â¥h¦x->æ8®ÅÝ/÷:ñòOÛ4ñòÆíóÇËð¿7%^ßøZ^†“#^~J[Äë¯åe8âå$ˆ×'ËËpâÃË-/o4;¼Ïåe8ÁáåÖ†×7ËËp:ÃKÑÈðZ|./ÃÉ /EÛÂkñ±¼ §*¼¾ñúñ2ü¼qz«'&¼Ïåe8áå6„—7^ßxùe8éàå‰vƒ×7ËËpŠÁËÍ/o´¼Ïåe8•àå&‚×â±¼ '¼-¯Åçò2œ&ðòOÛ ðòFkÀë÷åe8àåF€×âsyNþw}ãkyþ]žhõw}âµ¼ §÷»¼ÑØïúFJ¿ë_ËËp¿«O9ßõÔ}—7šö]Þh×w-ËËpоKÑœïZ|./à ù.ÿ´­ø.o4Ỿñøñ2üï×ò2œrïòSší]ßxúe8ÁÞå‰Öz×7îËËp:½Ëô.o´Ð»åe8mÞå†y—7Zå]ßx-/Ãéñ®ÅmyN‰w-¾–—á4x—Úx×7žËËpÒ»«§»»¾ñX^†SÜ]~Jr»Ëmí®O<——áTv—7šØ]߸//Éë.E˺kñ¹¼ §©»üJÔ]ÞhMw-îËËp:ºKшîZÜ–—áäs—Ú¶s—7Î]Þh5w}ãùãeøŸéå.O4–»? '“»<ÑFîòF¹ëÏåa8iÜåvq×âþãaø_ñZ†“Ã]}¥§…»¾ñüñ0üï¯åa8 ܵ¸/Éß.E˷˯´ÙÛõÇò0œàíòFk·ËIÝ®O<—w¡‘Ûåg´p»>ñXÞ…Ó¶]ÞhØvy£UÛõ$m—7Ú³]ÞhÌv-¦d»¯åY8 ÛåÚ€íúÆsyNºv)Ú­]‹ûò,œbíòFsµËmÕ®o<–g¡•ÚÕ‰“¨]hŸv žË³pÊ´ËÍÒ®o<–gái—7Z£]ÞhŠv}ã¹< ЮÁmy&?»ü*Ûž]hxv->—'á$g—¢½ÙåWÚØìúÆ}yNfvy£Ùåf×'?ž„ÿ=ñõ‡oÆéÊ®Å}yNQvy£9Ùå¶d×7Ë“p*²ËMȮŧŸ„]‰–c×à¶¼§»ú³ž`ìòFk±k‘TìZ<—áDb—_i ±ë÷åE8mØå†a—7R…]Ÿx,OÂéÁ.?¤1Øå–`×7^Ë“p°Ë À®o<–'¡é×%h÷u-üÃÓâëR4÷ºü“¶õº¾ñXž„Sy]Š&^×âsyNÜuy£e×åf]×7î˛РëêÄ©¹®Nœ”ëúÆsùË쉸.?¥×åæ[×7^Ë›p­kqó›p’­kñå7áÕXëZÜ—7ádZ—7Úh]Þh u}ã±¼ 'ͺü”vY—7e]ßx.oÂɱ.o¤Åº>qÿñ&üï‰×þô·ëZ|.o‰¯®o|-oÂÉ®.o¼~þÆÜÿÞxùM8µÕµX<–7áDVW_å)¬®nœ¼êúÆkyNXu-nË›p’ªë_Ë›pbªË-©®o<ý&œ†êòDªëÛoËtêòSÚM]Þh4u}ã¹¼ '—º¼‘VêúÄ}yZI]‚&R×âçïÊý¯x,oÂ)£.ÿ¬Í¢.o´‰º¾ñZÞ„SC]~JS¨ëåM8ÔåP—'š?]ŸxúMø>]ÜøV=ývãÿþ§àÿþŸ%| bû4ÈùS ¨ FPAì ÞhI¡‚XC1ˆ b5ÈYT˨ ÆQƒÜG1‘ b%ÄPj[©æRA,¦9š b7¤t*†õÔ TAl¨‚˜Q rIĘ*ˆ=U“ªA®ª‚V±­ b^5È…U#« vVƒœZ±¶ RpÃæê–ìªHåU‘â« öWEJ°ŠTa)Ä b‹U„«FEV£¬"uYEJ³ŠTg1Ð*R£U¤L«H¥Vc­"õZEJ¶‚Xm)Ü*R»U¤|+ˆW‘"®"u\AL¹ŠTs)è*BÓì«HeW‘â®A”xéï­E ½‚Øz)÷*RñÄè«èÿàR¤ô«HõW°"5`EÊÀŠT‚1+RV¤$,ˆUX°µaEÊÂXˆ)+R'ÄT¬è¶¿QÆŠÔŒ1+R9V¤x,ˆýX‘²"UdE ɹ%+RNV¤¢¬HQY»²"¥eE¨Ëb˜©1+RfV¤Ò,ˆ±Y‘z³"%gA¬ÎŠž©=+R~Ä­HZ‘:´ ¦hEªÑФ©I b–V¤2­HqZ‘ú´ %j5ªÔŠª±U+R®V¤b­HÑÚ wkEJ׊T¯1`+RÃV¤Œ­H%[c¶"õlEJÚ‚Xµ)l+RÛV¤¼-èS…[‘"·"tn1LÝŠT»)x+RóÄì­Hå[‘â·"õoALàŠTÁ)„ b W¤®HE\‘¢¸ vqEJãŠTÇ r W¤F®H™\‘J¹ År5ê劔̱š+úØß(·sEÊç‚XÐ)¢+RGW¤”.ˆ5]‘‚º"5uAÌêŠTÖ)®+R_ÄÄ®H•]‘B» µv5·ý‰bqW£è.ˆÝ]‘Ò»"ÕwA ðŠÔà)Ã+R‰7È1^‘z¼"%yEªò‚æ©Í+RžÄB¯H‘^‘:½"¥zA¬õŠìÕ¨Ù R¶W£r¯Hñ^‘ú½ &|EªøŠò±å+RÎW„¢¯FQ_»¾"¥}EªûŠø±ñ+RæW¤Ò/ˆ±_‘z¿"%E¨þÆ8ü+BûW£ü/ˆ`‘"À"u€EJƒX),R¤,°Fe`ÑåoÌU¨ úT"X¤J°H¡`[Á¢ýqr1X¤h0ˆÝ`ÒÁÕƒEcØ)#,RIʰH=a‘’Â"U…A ‹ÐÖ(/İ涿Mî ‹”±6,RpX¤æ0ˆÙa‘ÊÃ"ŇEꃘ ¡B¬QˆX¤1ˆ9b‘ŠÄ"E‰Aì‹”&©N,B ÃF±hýyc©ÄX±H½b‘’Å"U‹A ‹Ô.)_ bÁX¤ˆ±HcRÆ1®‹4©i,RÖIJ±Hqc‘úÆ &ŽE¨k:¡uŒaîX¤â±HÑc»Ç"¥Eª‹@±,RY¤2ˆ1dzÈ%‘Eª"ƒF©,RY¤B2ˆ‘d‘:É"¤’1¬%‹ö3j&‹”Mr9Y¤x²HýdÊ"U”E )‹ÔR1§,RQY„¨2†]e‘ÒÊ¢ÿð[ª,ƒ>ÕX)³,RiÄØ²½e’Ë"T—1 /‹Ô^)¿,RijHf‘RÌ Ö˜E 2‹Ôd)Ë R™Y£8³H}æ-‰fÑM•æß†ûViþ¶rÔJó·•»A§ÒÄ¥SiêR+M]j¥y}é[¥)ÔJóúã¾UšºÔJ—N¥‰K§Òj¥ t*M¡VšB­4…Ziâ[ÐJ‡N¥©C­4qéTšB­4ñq­4u¨•&J—N¥©K­4qéTš¸t*M]j¥)ÔJw*M\:•¦.µÒÔ¥Vš¸t*M\:•¦P+M Si µÒzüÙµÒ¼þ|«4¯/}«4‰~î²ÿöq­4u©•&/=þl?½ß*M]j¥©K©4y(•¦µÒÔ¥VšD©4ùq©4uéS»ìEŸ?¦½”J“—Ri µÒ$ú¹Ëþ+zaÜ9¨•&Q*M} ZiòR*M¡VšD÷õúViê o¥©K­4y)•&/}ýY0[iêP+M^J¥‰K§Ò$J¥‰;•&/¥ÒÔ¥VšºÔJ“(•¦ÐÇÏmö_ÑÇüÑ}}£¾Ušú´ÒÔ¥ÛÏuö_/¥Ò䥯ý:•¦>®•&/½ö7êTšº”J“‡ûu*M]j¥©K­4‰žûu*M]j¥ÉKý:•¦P+M¢Ïý:•¦P+M¢ý:•&/½~¼Q¿\:•&.J“蹿Q§ÒÔ¥VšºÔJ“—^ëu*Mj¥ÉKý:•¦.µÒÔ¥VšD©4õq­4u©•&Ñc£N¥)ÔJ“ès£N¥©oA+M]j¥ÉK÷ý:•¦.µÒ$úÜߨSiòÒ×þFµÒÔ¡Vš<ôÚߨSiêR+M^J¥ÉK_ûu*M|Ü©4y)•¦.µÒÔ¥VšDý:•¦P+M¢Ïý:•¦¾­4u©•&/=~¼Q¿^zíoÔ©4õqŸ©4yé¹¾Q§ÒÔ¡Vš¼tßߨSiêR+M]j¥I”J“÷µ¿Q§ÒÔ¥Vš¼ôÚߨSiÝö7êTšD_ûu*M} ZiòÒs£N¥‰K§Òä¥ÇþFJS—JS‡ZiòÐs£N¥©K­4y龿Q§Òj¥Iô¹¿Q§ÒÔÞJS—ZiÝ÷7êTšB­4‰nûu*M} ZiêR+M]j¥ÉKÏoÔo—RiêP+M¢ÇúDJS‡ZiêR+M^zîOÔ©4u©•&Q*M¢×þDJ_ø©4yéùã‰úõÒ×þDJ“è¾?Q§Òj¥©/¼•&/=ö'êTšºÔJS—RiòÐs¡ZiêÃZiòÐc¡N¥©K­4u©•&/¥ÒÔ¥VšºÔJ“h*Mš×þ@JS_w+M^zîÔ©4…ZiÝ÷êTšºÔJS—ZiòÒc ZiâЩ4q¨•&Ís N¥©K­4yé±?P§ÒÔ¥VšºÔJ“—žûÕJ“æ¶¿OSiê‹n¥©3ŸÿìÓ©4‰žûãt*M}á­4yé¾?N§ÒÔ¥Všº”J“‡?§_}ýÙ°SiÝ÷ÇéTšºÔJS—ZiòÒcœN¥©K­4‰>×ÇéTš@­4inûÛt*M|N¥©K­4‰Ri=÷·éTšúÂ[iòÒ}›N¥©K­4u)•&=öÇéTšú´VšºÔJ“—^ûãt*M]j¥ÉKýqj¥)ÓJ“hýyk¥)ÔJSüVš¼ôاSi µÒ$úܧSiêR+M]j¥ÉK÷ýuj¥‰C§ÒÄ¡SiòÒsÿÇSiêãZiêR+M^zí¯Ó©4‰nëët*M¢¯õuzµÒ$ºï¯Ó©4u©•¦.µÒä¥Çþ:JS×JS—ZiòÒsN¥©K©4yèþãuúõÐëÏV@|«4‰>÷×éTš¼ôµ¿N§ÒÔ¥×ÏßTýõÒk}N¥I´Ÿyì¯Ó©4ñEŸJ—N¥ÉK¯ýu:•&ÑmN¥ÉK_ûët*M]j¥ÉKÏõu:•¦µÒä¥ÿð[ª§ÒÔǵÒÔ¥ÏÏýu:•¦.Ýþ–êo—RiòÐ}ZiÊ´Ò$úù;ª¿¢Çþ:JS߀VšºÔJ“—^ûët*M}\+M^zì¯Ó©4u)•¦µÒä¡çú:}«4¯/}«4½ô÷½Ušƒ\i¾ÑRir¥9È•æ WšÑVir¥9È•æ Wšo´Tšƒ\ir¥ùFK¥9È•æ Wšƒ\i¾‘+Í1®4¹Ò|£¥ÒäJs+Í1®4ßh©4¹ÒäJó–Js+ÍA®4¹Ò|£¥ÒäJs+ÍA®4ßh©4¹ÒäJó–Js+ÍA¬4ǸÒü‹¶J3ˆ•f+ÍA®4ƒXi±Ò b¥9È•f*ÍVšƒ\i±Ò b¥ÄJs+Í VšA¬4ƒXir¥ÄJ3ˆ•æ WšA¬4ƒXi±ÒäJ3ˆ•f+ÍA®4ƒXi±Ò R¥9Æ•f+Í Všo´TšA¬4ƒø÷ß Všƒ\i±Ò b¥9È•fЇþ‰'ˆ•f+ÍA®4ƒXi±Ò b¥9È•f+Í Všƒ\i©ÒŒa¥ÄJs+Í VšA¬4¹Ò ºíoÔRi±ÒäJ3ˆ•f+ÍA®4ƒXi±Ò b¥ùFK¥ÄJ3ˆ•f+ÍA®4ƒXi©ÒãJ3ˆ•f+Í Všƒ\i±Ò b¥9È•f+Í VšA¬4¹Ò b¥ÄJs+Í VšA¬4ƒXir¥ÄJ3ˆ•f+ÍA¬4cXi±ÒäJ3ˆ•f+Í Všo´TšA¬4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒXi±ÒäJ3ˆ•f+Í Všƒ\i±Ò R¥9Æ•f+Í VšA¬4¹Ò b¥ÄJ3ˆ•æ WšA¬4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒ>÷7j©4ßh©4ƒXi±Ò b¥9ˆ•f +Í Všƒ\i}ìoÔRi±ÒäJ3ˆ•f+Í Všƒ\i±Ò zíoÔRi±Ò b¥ÄJs+Í VšA¬4±ÒŒ¹íO”+ÍVšƒ\i±Ò b¥9È•f+Í VšA¬4ßh©4ƒXi±Ò b¥9È•f+Í Všƒ\i±Ò b¥ÄJs+Í Uš1¬4±ÒŒa¥ÄJ3ˆ•æ WšA¬4ƒXir¥ÄJ3H•f +ÍA®4ƒXi±Ò b¥9È•f+Í Všƒ\i±Ò b¥¤Jóm–J3H•f +ÍA®4ƒXi±Ò b¥9È•fÐçþ@-•æ Vš1¬4ƒ®u.‚•æ WšA¬4ƒXir¥ô±?NK¥ÄJs+Í Uš1¬4ƒTiŽq¥ÄJ3èµ?NK¥ÄJ3ˆ•f+ÍA®4ƒTiưÒ|#Wš1·ýmZ*Í Všƒ\i±Ò b¥9È•f+Í VšA¬4¹Ò R¥ÃJ3ˆ•æ WšA¬4ƒXir¥ÄJ3ˆ•f*Í1®4ƒÖŸ7Wšƒ\i±Ò b¥ÄJs+Í VšA¬4¹Ò b¥ÄJ3H•æÛ,•f+Í VšA¬4¹Ò b¥ÄJs+Í Uš1¬4ƒTiŽq¥ÄJ3ˆ•æ WšA¬4ƒXi±ÒäJ3ˆ•f+ÍA®4ƒTiÆ°Ò b¥9È•f+Í VšA¬4¹Ò b¥¤JsŒ+Í ý +Í Všo´TšA¬4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒXi©ÒãJ3ˆ•fÐø-Õ¥ÒäJ3ˆ•f+ÍA®4ƒTiÆ°Ò R¥9Æ•f+Í VšA¬4¹Ò b¥ôÚ_§¥Ò b¥ÄJ3ˆ•æ Vš1¬4ƒXiþE[¥tC¥yÿû¾}«4[å j¥ùÛ*ç SiâÒ©4u©•¦.µÒ¼¾ô­Òj¥yýqß*M]j¥‰K§ÒÄ¥Si ½RiJS¨•¦P+M¡Všø´ÒÄ¡SiêP+M\:•¦P+M|\+Mj¥‰C§ÒÄ¥SiêR+M\:•&.JS—Zi µÒÄÇJ—N¥©K­4u©•&.J—N¥)ÔJèTšB­4…öC­4¯¿ß*ÍëKß*M¢çŸýãZiêR+M^züÙ~z¿UšºÔJS—RiòP*Mj¥©K­4‰RiòãRiêR+M]j¥ÉK©4y)•¦P+M¢üÝ—è…1ú VšD©4õ-h¥ÉK©4…ZiÝ×7ê[¥©/¼•¦.µÒä¥Tš¼ôõgýÁl¥©C­4y)•&.J“(•&>îTš¼”JS—ZiêR+M¢TšB­4‰>æŸxˆîëõ­ÒÔ· •¦.µÒä¥Tš¼ôµ¿Q§ÒÔǵÒä¥×þFJS—RiòÐc£N¥©K­4u©•&Ñs£N¥©K­4y鱿Q§Òj¥Iô¹¿Q§Òj¥Iô±¿Q§Òä¥×7ê—K§ÒÄ¥Si=÷7êTšºÔJS—ZiòÒk}£N¥©C­4y鱿Q§ÒÔ¥VšºÔJ“蹿Q§ÒÔ¥VšDý:•¦ÐýŸý:•&Ñs£N¥©K­4y龿Q§ÒÔ¥VšDŸûu*M^úÚߨVš:ÔJ“‡^ûu*M]j¥ÉK©4y)•&Щ4ñq§Òä¥TšºÔJS—Zi=ö7êTšB­4‰>÷7êTšú´ÒÔ¥Vš¼ôøñFýz鵿Q§ÒÔǵÒä¥çúFJS‡ZiòÒ}£N¥©K­4u©•&Ñc£N¥©K­4u©•&/½ö7êTšD·ý:•&Ñ×þFJSß‚Vš¼ôÜߨSiâÒ©4y鱿Q§ÒÔÇ¥ÒÔ¡Vš<ôÜߨSiêR+M^ºïoÔ©4…Zi}îoÔ©4õ…·ÒÔ¥VšD÷ý:•¦P+M¢ÛþFJSß‚VšºÔJS—ZiòÒóÇõÛ¥Tš:ÔJ“è±>Q§ÒÔ¡VšºÔJ“—žûu*M]j¥ItÿñDýŠ^ûu*M|á§Òä¥ç'ê×K_ûu*M¢ûþDJS¨•¦¾ðVš¼ôØŸ¨SiêR+M]J¥ÉCÏý…j¥©k¥ÉCý…:•¦.ÝÿÙ_¨SiòR*M]j¥©K­4‰¦Ò¤yíÔ©4õu·Òä¥çþ@JS¨•&Ñ} N¥©K­4u©•&/=öª•&J‡ZiÒ<÷êTšºÔJ“—ûu*M]j¥©K­4yé¹?P­4inûû4•¦¾èVš:ÓJ“èsœN¥)ÔJS_x+M^ºïÓ©4u©•¦.¥Òä¡ÇÇé×C_¶ìTšD÷ýq:•¦.µÒÔ¥Vš¼ôاSiêR+M¢Ïõq:•&P+MšÛþ6J߀SiêR+M¢TšDÏým:•¦¾ðVš¼tßߦSiêR+M]J¥ÉCýq:•¦>­•¦.µÒä¥×þ8JS—ZiòÒcœZiÊ´Ò$ZÞZi µÒÔ¿•&/=öÇéTšB­4‰>÷ÇéTšºÔJS—ZiòÒ}ZiâЩ4qèTš¼ôÜÿqàTšú¸VšºÔJ“—^ûët*M¢Ûú:J“èk}^­4‰îûët*M]j¥©K­4y鱿N§ÒÔÇÝÿÙ_§SiòÒsN¥©K©4yèþãuúõÐëÏV@|«4‰>÷×éTš¼ôµ¿N§ÒÔ¥×ÏßTýõÒk}N¥I´Ÿyì¯Ó©4ñEŸJ—N¥ÉK¯ýu:•&ÑmN¥ÉK_ûët*M]j¥ÉKÏõu:•¦µÒä¥ÿð[ª§ÒÔǵÒÔ¥Vš¼ôÜ_§SiêR*Mºï¯S+M™VšD?GõWôØ_§SiêÐJS—ZiòÒkN¥©k¥ÉKýu:•¦.¥ÒÔ¡Vš<ô\_§o•æõ¥o•毗>ÿý¿üeK3ˆ[šƒ¼¥Ä-Í niqKó–-Í niqK3ˆ[šƒ¼¥Ä-Í —¶4yK3ˆ[šAÜÒ â–æ niÆpK3ˆ[šƒ¼¥Ä-Í miÆpKsÐ[šAÜÒ â–æ oiqK3ˆ[šAÜÒä-Í niqK3ˆ[šƒ¼¥Ä-Í niò–f·4ƒ´¥Ã-Í7Z¶4‹´¥Y¤-Í niiK³H[šEÚÒ â–f¶4k´¥Ä-Í"miiK³H[šAÜÒ,Ò–f‘¶4‹´¥Ä-Í"miiK3ˆ[šEÚÒ,Ò–f‘¶4ƒ¸¥Y¤-Í"miqK³H[šEÚÒ,–f ·4‹´¥Y¤-ÍAÞÒ,Ò–f‘þ+EEÚÒ â–f‘¶4‹´¥Ä-Í¢?×ÿ!®"miiK3ˆ[šEÚÒ,Ò–f‘¶4ƒ¸¥Y¤-Í¢×þFyK³[š5ÚÒ,Ò–f·4‹´¥Y¤-Í niÝö7Ê[šEÚÒ â–f‘¶4‹´¥Ä-Í"miiK³H[šƒ¼¥Y¤-Í"miiK3ˆ[šEÚÒ,–f ·4‹´¥Y¤-Í"miqK³H[šEÚÒ â–f‘¶4‹´¥Y¤-Í »¶4‹´¥Y¤-Í niiK³H[šEÚÒ â–f‘¶4‹´¥Y¤-Í miÖhK³H[šAÜÒ,Ò–f‘¶4‹´¥9È[šEÚÒ,Ò–f·4‹´¥Y¤-Í"miqK³H[šEÚÒ â–f‘¶4‹´¥Y¤-Í niiK³[š1ÜÒ,Ò–f‘¶4‹´¥Ä-Í"miiK³H[šAÜÒ,Ò–f‘¶4ƒ¸¥Y¤-Í"miiK3ˆ[šEÚÒ,Ò–æ oiiK³H[šEÚÒ Ò–f¶4‹´¥Ä-Í¢ýò–f‘¶4ƒ¸¥Y¤-Í"miiK3ˆ[šEÚÒ,zío”·4‹´¥Y¤-Í"miqK³èÿIã"miiK³æ¶?QÜҬіf·4‹´¥Y¤-Í niiK³H[šEÚÒä-Í"miiK³H[šAÜÒ,Ò–f‘¶4ƒ¸¥Y¤-Í"miiK3ˆ[šEØÒ¬Ñ–f¶4k´¥Y¤-Í"miݵ¥Y¤-Í"miqK³H[šEØÒ¬Ñ–f·4‹´¥Y¤-Í"miqK³H[šEÚÒ â–f‘¶4‹´¥Y„-Í1ÞÒ,–f¶4ƒ¸¥Y¤-Í"miiK3ˆ[šEÚÒ,Ò–f¶4k´¥Yt9pP¡-Í niiK³H[šAÜÒ,úØ'oiiK3ˆ[šEØÒ¬Ñ–f¶4c¸¥Y¤-Í"miqK³H[šEÚÒ,Ò–f·4‹>×ÇÉ[šƒ¸¥YsÛß&oiiK3ˆ[šEÚÒ,Ò–f·4‹´¥Y¤-Í"miqK³[š5ÚÒ,Ò–f·4‹´¥Y¤-Í niiK³H[šEØÒŒá–fÑúóÆ-Í niiK³H[šEÚÒ â–f‘¶4‹´¥Ä-Í"miiK³[šc¼¥Y¤-Í"miiK3ˆ[šEÚÒ,Ò–f·4‹°¥Y£-Í"liÆpK³H[šEÚÒ â–f‘¶4‹´¥Y¤-Í »¶4‹´¥Y¤-Í niaK³F[šEÚÒ â–f‘¶4‹´¥Y¤-Í niiK³[š1ÜÒ,ÚÏhK³H[šƒ¼¥Y¤-Í"miqK³H[šEÚÒ,Ò–f·4‹´¥Y„-ÍniiK³è?ü–ª·4ƒ¸¥Y¤-Í"miqK³[š5ÚÒ,–f ·4‹´¥Y¤-Í"miqK³H[šEÚÒ â–f‘¶4‹´¥Y¤-Í miÖ|·4ßhÙÒ,ºiKóïo5m•æ Wšo´Tšƒ\ir¥9È•æ_´Ušƒ\ir¥9È•æ-•æ Wšƒ\i¾ÑRir¥9È•æ WšoäJsÌ'+ÍA®4ßh©4¹ÒÄJsŒ+Í7Z*ÍA®4¹Ò|£¥ÒäJs+ÍA®4ßh©4¹ÒäJs+Í7Z*ÍA®4¹Ò|£¥ÒäJs+Í1®4ÿ¢­Ò b¥ÄJs+Í VšA¬4ƒXir¥¤J3†•æ WšA¬4ƒXi±ÒäJ3ˆ•f+Í Všƒ\i±Ò b¥9È•f+Í VšA¬4¹Ò b¥ÄJs+Í VšA¬4ƒTiŽq¥ÄJ3ˆ•æ-•f+Í þý7ˆ•æ WšA¬4ƒXir¥ô¡â b¥ÄJs+Í VšA¬4ƒXir¥ÄJ3ˆ•æ WšAª4cXi±ÒäJ3ès£–Js+Í ÛþF-•f+ÍA®4ƒXi±ÒäJ3ˆ•f+Í Všo´TšA¬4ƒXi±ÒäJ3ˆ•f*Í1®4ƒXi±Ò b¥9È•f+Í Všƒ\i±Ò b¥ÄJs+Í VšA¬4¹Ò b¥ÄJ3ˆ•æ WšA¬4ƒXi±ÒÄJ3†•fÐk£–J3ˆ•f+Í Všo´TšA¬4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒXi±ÒäJ3ˆ•f+Í Všƒ\i±Ò R¥9Æ•f+Í VšA¬4¹Ò b¥ÄJ3ˆ•æ WšA¬4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒXi±Ò|£¥Ò b¥ÄJ3ˆ•æ Vš1¬4ƒXir¥ô±¿QK¥ÄJs+Í VšA¬4ƒXir¥ÄJ3ˆ•æ WšA¬4ƒXi±ÒäJ3èSÿËò VšƒXiÆÜö'Ê•f +ÍA®4ƒXi±ÒäJ3ˆ•f+Í Všo´TšA¬4ƒXi±ÒäJ3ˆ•fÐk¢–J3ˆ•f+Í Všƒ\i©ÒŒa¥9ˆ•f +Í VšA¬4¹Ò b¥ÄJs+Í VšAª4cXir¥ÄJ3ˆ•f+ÍA®4ƒXi±ÒäJ3ˆ•f+Í Ušo³TšAª4cXir¥ÄJ3ˆ•f+ÍA®4ƒXi±ÒÄJ3†•fÐõ¯ÎE°ÒäJ3ˆ•f+ÍA®4ƒ>öÇi©4ƒXir¥¤J3†•f*Í1®4ƒXi±ÒäJ3ˆ•f+Í Všƒ\i©ÒŒa¥ùF®4cnûÛ´TšA¬4¹Ò b¥ÄJs+Í VšA¬4ƒXir¥¤J3†•f+ÍA®4ƒXi½öÇi©4ƒXi±Ò R¥9Æ•fÐúóæJs+Í VšA¬4ƒXir¥ÄJ3ˆ•æ WšA¬4ƒXi©Ò|›¥Ò b¥ÄJ3ˆ•æ WšA¬4ƒXir¥¤J3†•f*Í1®4ƒXi±ÒäJ3ˆ•f+Í Všƒ\i±Ò b¥9È•f*ÍVšA¬4¹Ò b¥ÄJ3ˆ•æ WšA¬4ƒTiŽq¥´Ÿa¥ÄJó–J3ˆ•f+ÍA®4ƒXi±Ò b¥9È•f+Í Ušc\i±Ò ú¿¥ºTšƒ\i±Ò b¥9È•f*ÍVšAª4Ç¸Ò b¥ÄJ3ˆ•æ WšA¬4ƒXir¥ÄJ3ˆ•f+ÍA¬4cXi±Òü‹¶J3è†Jóñ÷7J—J3ˆ•æ WšA¬4ƒXi±Ò|£¥Ò b¥ÄJ3ˆ•æ WšA¬4ƒXir¥ÄJ3ˆ•f+ÍA¬4cXi±ÒäJ3ˆ•f*ÍVšƒ\i±Ò b¥9È•f+Í VšA¬4¹Ò b¥ÄJ3ˆ•æ WšA¬4ƒ^ª4¹Ò b¥¤J3†•æ-•f‘*Í"UšA¬4‹Ti©Ò,R¥ÄJ³•f*Í VšEª4‹Ti©Ò b¥Y¤J³H•f‘*Í VšEª4‹Ti±Ò,R¥Y¤J³H•f+Í"UšEª4ƒXi©Ò,R¥Y„J3†•f‘*Í"Ušƒ\i©Ò,Òß‹Ti±Ò,R¥Y¤J3ˆ•fÑþ‰§H•f‘*Í VšEª4‹Ti©Ò b¥Y¤J³H•f+Í"Tš5ª4‹Ti±Ò,R¥Y¤J3ˆ•fÑm£\i©Ò b¥Y¤J³H•f+Í"UšEª4‹Tir¥Y¤J³H•f‘*Í VšEª4‹^ëåJ³H•f‘*Í"UšA¬4‹Ti©Ò b¥Y¤J³H•f‘*Í VšEª4‹Ti±Ò,R¥Y¤J³H•f+Í"UšEª4‹Ti©Ò¬Q¥YôÚß(WšEª4‹Ti©ÒäJ³H•f‘*Í VšEª4‹Ti©Ò b¥Y¤J³H•f+Í"UšEª4‹Ti±Ò,R¥Y„J3†•f‘*Í"UšEª4ƒª4‹Ti©Ò,R¥ÄJ³H•f‘*Í VšEª4‹Ti©Ò b¥Y¤J³H•æ WšEª4‹Ti©Ò R¥Y£J³H•f+Í¢ýr¥Y¤J3ˆ•f‘*Í"UšEª4ƒXi©Ò,R¥ÄJ³H•f‘*Í"UšA¬4‹Ti©Ò R¥YsÛŸ(Vš5ª4ƒXi©Ò,R¥ÄJ³H•f‘*Í"Ušƒ\i©Ò,R¥Y¤J3ˆ•f‘*Í¢×þD¹Ò,R¥Y¤J³H•f+Í"Tš5ª4ƒTiÖ¨Ò,R¥Y¤J3ˆ•f‘*Í"UšA¬4‹Ti¡Ò¬Q¥ÄJ³H•f‘*Í"UšA¬4‹Ti©Ò b¥Y¤J³H•f*Í1®4‹PiÖ¨Ò b¥Y¤J³H•f‘*Í VšEª4‹Ti©Ò¬Q¥Ytù«sª4ƒXi©Ò,R¥ÄJ³ècœ\i©Ò z¨Ò,B¥Y£J³•f +Í"UšEª4ƒXi©Ò,R¥Y¤J3ˆ•f*ÍUšƒXiÖÜö·É•f‘*Í VšEª4‹Ti±Ò,R¥Y¤J³H•f+Í"Tš5ª4‹Ti±Ò,R¥Y¤J3ˆ•f‘*Í"UšE¨4cXi­?o¬4ƒXi©Ò,R¥Y¤J3ˆ•f‘*Í"UšA¬4‹Ti©Ò,B¥9Æ•f‘*Í"UšEª4ƒXi©Ò,R¥ÄJ³•f*Í"Tš1¬4‹Ti©Ò b¥Y¤J³H•f‘*Í VšEª4‹Ti±Ò,B¥Y£J³H•f+Í"UšEª4‹Ti±Ò,R¥Y„J3†•fÑ~F•f‘*ÍA®4‹Ti©Ò b¥Y¤J³H•f‘*Í VšEª4‹PiưÒ,R¥Yô~KÕ•f+Í"UšEª4ƒXi¡Ò¬Q¥Y„J3æ¡J³H•f‘*Í"UšA¬4‹Ti©Ò b¥Y¤J³H•f‘*Í Uš5ª4‹Ti¾ÑRiÝTiþû¿!øi>þí z›6š1ÿ{ç$š×wN¡‰; 4q§}æåoy&LëÌËÏúgâNÛÌë;'ͼ¾sÊL˜†™×æt™0Í2aZeÂ4ʼþ³·É¼>s’Lœi‘y}ç™0í1¯?«9&δƼ>sbÌë;§ÅĦ˜×wN‰y}焘¸Ó¦æõg óúΉ0q§ &î4Á¼¾s Ìë;'À„iymN~ Óú&ñ%HÛËË?ú·ôòòηòR&Ågµ»Äf—º“êRw]âN›KÜIr©3).q¦Á%î´·”In©ÏJm‰;-q§­¥î$µÔ”–0 -eò·W™d–0¶Gç[d‰?{KÝIb ÓÂRæ¾½:ßúJ|ÍÍ+q§u¥î$®Ôi+q¦i%δ¬Ô„•×wNW)“¬òú³NU©;‰*q§M%î4©”IQ Ó Ræcþ1Fæ¾½:ßjJüÙSâN[JÝIJ©;_ë«sBJ|V;JÝy­¯Î©(q'¥Î<ÖWç$”¸Ó‚wPÊ<×Wç䓸ÓzRwë«sÚI˜¦“2Ÿë«sÂI˜v“2ë«sªIÝyýxuþ÷Îi&¯ïœdRæ¹¾:'˜Äö’¸Ó\Rw^Û«sbIœi+©;õÕ9¥$î4”Äv’2ÏõÕ9•$î4’”y¬¯ÎI$aZHÊ|®¯Îé#ñgo‰;­#uç¾¾:§Ä¦‘2Ÿë«sÂHÝùZ_f‘8Ó*Rg^ë«sšHÜi©;)"uçk}uNyýY'‡ÔÔ¸ÓwÚBÊ<ÖWç”0 !e>×Wçdø³·‚ÄFºóøñêüvçµ¾:§€Äg5€ÔçöêœügZ?êÎ}}uNûˆ;ÖWç”2õÕ9Ý#î4{ÄVºóZ_Ó<ÊÜÖWç2_ë«szGüÙ›;êÎs}uNìx}ç´ŽºóX_S:â³:âL;Gy®¯Î©q§‘£îÜ×Wç$Ž0-e>×Wçôøš›7âNëF™ûúꜶ¦i£Ìm}uN؈?{»FÜiÖˆ;­uçùãÕùåNšFœiÒ(óØ4âL{FÜiΨ;ÏõÑ91#î´e”¹ÿxt~3¯õÑ9!ãõ×|:FÝyþxt~»óµ>:'b”¹¯ÎIaZ0âknÀ¨;õÑ9ù"î´^ÄÄ‹:ó\ßœ¦‹ø¤–‹:óXßœÓ-âN³EÜiµ¨;‰q§Í"î4Y”™bQäµ>9§WÄ—Ü\Qwžë“sbE˜¶Š2÷õÉ9¥"î4TÄvŠºóXŸœVŠ×gN¤x}¦¢Ès}rN¡ˆ; uç±>9'OÄÖ‰¸Ó8Qwžë“Ó4Qä¶¾8&âëm—ˆ#Íe>×çæD‰0mñ57IÔûúÜœ wÚ#âNrDyüxn~;óõgy‘N‹(s_Ÿ›S"âNCDÜi‡¨;õ¹9"î4B”ùÜž›“ ^›ˆ"·õµ9ýáõŸü䇸ÓúP&ñ¡Ìs}mNzˆ¯¹å¡îÜ×׿t‡¸ÓìwRêÌc}nNsˆjrˆ;-uçµ>7§7Äæ†ºóXŸ›Æ† m e¶¯–†0 ñçng¨;õ¹9•!L#C™Ïõ¹9‰!î´0Ćºs_ß›æ…×gN]x}æÄ…ºó\ÿ²~ÒB|VËBÜiX¨;¯õ½9Y¡Ìm{oNT(óµ½7¯&…2÷õ½9A!î´'Äæ„ºóXß›â³ÚâNSBÝy®ïÍ q'¡Îܼ7¿yýY~[ÿ[D(ó¹¾7'!Ô¯õ½9!î¼~þæow^Û{sêA™õÈc}oN:xýõžrðúÎ uçµ¾7'”¹­ï͉uçk}oN2ˆ;-uç¹½7§ę悺³ÿöå‰ñYmq§© î<×÷æ„‚¸“NPgîë{ÓJ¤‘ ÌÏß½üÍ<Ö÷æ‚ø“7ÄöºóZß›Sâ³êÎc}oNˆ;)q¦a Î<·÷æ[xyç[øë׿ÿ¼m7òvã-Ûƒ¼Ý8ÈÛƒ¼ÝømÛƒ¼Ý8ÈÛƒ¼ÝøFËvã o7òvã-Ûƒ¼Ý8ÈÛƒ¼ÝøFÞnãíÆAÞn|£e»q·q»qŒ·ßhÙnäíÆAÞn|£e»q·y»q·ßhÙnäíÆAÞnäíÆ7Z¶y»q·ßhÙnäíÆAÜnãíÆ¿hÛn âvc·y»1ˆÛAÜn âvã o7i»1†Ûƒ¼ÝÄíÆ n7q»q·ƒ¸ÝÄíÆ n7òvc·ƒ¸Ý8èÁíÆ n7q»1ˆÛƒ¼Ýt_ߨm»q·ƒ¸ÝÄíÆ m7Žñvc·ƒ¸ÝøFËvc·ƒø_Å âvã o7q»1ˆÛƒ¼Ýôñÿá§ n7q»q·ƒ¸ÝÄíÆ n7òvc·ƒ¸Ý8ÈÛAÚnŒávc·y»1ˆÛAÜnäíÆ ÛþF-ÛAÜnäíÆ n7q»q·ƒ¸ÝÄíÆ n7¾Ñ²ÝÄíÆ n7q»q·ƒ¸Ý¤íÆ1Þn âvc·ƒ¸Ý8ÈÛAÜn âvã o7q»1ˆÛAÜnäíÆ n7q»q·ƒ¸ÝÄíÆ n7òvc·ƒ¸ÝÄíÆAÜnŒávc·y»1ˆÛAÜn âvã-ÛA÷ýZ¶y»1ˆÛAÜn âvã o7q»1ˆÛƒ¼ÝÄíÆ n7q»q·ƒ¸Ý¤íÆ1Þn âvc·ƒ¸Ý8èÁíÆ n7q»1ˆÛƒ¼ÝÄíÆ n7òvc·ƒ¸ÝÄíÆAÞn âvc·ßhÙn âvc·ƒ¸Ý8ˆÛ1Ün âvã o7}ìoÔ²ÝÄíÆAÞn âvc·ƒ¸Ý8ÈÛAÜn âvã o7q»1ˆÛAÜnäíÆ n7q»q·cnûåíÆn7òvc·ƒ¸Ý8ÈÛAÜn âvc·ßhÙn âvc·ƒ¸Ý8ÈÛAÜn âvã o7q»1ˆÛAÜnäíÆ ûŸí‡`ÙnÄíÆn7q»1ˆÛƒ¼ÝÄíÆ n7òvc·ƒ´ÝÃíÆAÞn âvc·ƒ¸Ý8ÈÛAÜn âvã o7q»1ˆÛAÚn|›e»1HÛ1ÜnäíÆ n7q»1ˆÛƒ¼ÝÄíÆ n7âvc ·ƒ®ÿƒúÜnäíÆ n7q»q·ƒ>öÇiÙn zíӲݤíÆn7i»qŒ·ƒ¸ÝÄíÆAÞn âvc·ƒ¸Ý8ÈÛAÚnŒávãy»1æ¶¿MËvc·y»1ˆÛAÜnäíÆ n7q»1ˆÛƒ¼Ý¤íÆn7q»q·ƒ¸ÝÄíÆAÞn âvc·ƒ´Ý8ÆÛAëÏ›·y»1ˆÛAÜn âvã o7q»1ˆÛƒ¼ÝÄíÆ n7i»ñm–íÆ n7q»1ˆÛƒ¼ÝÄíÆ n7òvc¶c¸Ý¤íÆ1Þn ºï¯Ó²Ý8ÈÛAÜn âvc·y»1ˆÛAÜnäíÆ m7Æp»1ˆÛƒ¼ÝÄíÆ n7q»q·ƒ¸ÝôZ_§e»1h?ÃíÆ n7¾Ñ²ÝÄíÆ n7òvc·ƒ¸ÝÄíÆAÞn âvc¶Çx»1ˆÛAÿá·T—íÆAÞn âvc·y»1HÛ1Ün Òvão7q»1ˆÛAÜnäíÆ n7q»q·ƒ¸ÝÄíÆ n7âvc ·ƒ¸ÝømÛA7l7þßûöúÜ*Í Všƒ\i±Ò b¥ÄJó–J3ˆ•f+Í Všƒ\i±Ò b¥9È•f+Í VšA¬4±ÒŒa¥ÄJs+Í VšAª4cXir¥ÄJ3ˆ•æ WšA¬4ƒXi±ÒäJ3ˆ•f+Í Všƒ\i±Ò b¥9È•f+Í Uš1¬4ßh©4‹Ti©Ò b¥Y¤J³H•f‘*Í VšE¨4kTi±Ò,R¥Y¤J³H•f+Í"UšEª4‹Ti±Ò,R¥Y¤J3ˆ•f‘*Í"UšEª4ƒXi©Ò,R¥ÄJ³H•f‘*Í"Tš1¬4‹Ti©ÒäJ³H•f‘þþ[¤J3ˆ•f‘*Í"UšA¬4‹>ðOöÇi©4ƒXir¥¤J3†•f*Í1®4ƒîûã´Tšƒ\i±Ò b¥ÄJs+Í Uš1¬4ßÈ•fÌm›–J3ˆ•æ WšA¬4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒTiÆ°Ò b¥9È•f+Í Všƒ\i±Ò b¥¤JsŒ+Í õçÍ•æ WšA¬4ƒXi±ÒäJ3ˆ•f+ÍA®4ƒXi±Ò R¥ù6K¥ÄJ3ˆ•f+ÍA®4ƒXi±ÒäJ3H•f +Í Ušc\i±Ò b¥9È•f+Í VšA¬4¹Ò b¥ÄJs+Í Uš1¬4ƒXir¥ÄJ3ˆ•f+ÍA®4ƒXi©ÒãJ3h?ÃJ3ˆ•æ-•fÐ]•f+ÍA®4ƒXi±Ò b¥9È•f+Í Ušc\i±Ò ú¿¥ºTšƒ\i±Ò b¥9È•f*ÍVšAª4Ç¸Ò b¥ÄJ3ˆ•æ WšA¬4ƒXir¥ÄJ3ˆ•f+ÍA¬4cXi±Òü‹¶J3è¦Jóÿ~Ô^ß+ÍÇ¿áÏKƒZiýréTš¸t*M]j¥©K­4¯/}«4…Zi^Ü·JS—ZiâÒ©4qéTšB­4N¥)ÔJS¨•¦P+M| ZiâЩ4u¨•&.JS¨•&>®•¦µÒÄ¡SiâÒ©4u©•&.J—N¥©K­4…ZiâãN¥‰K§ÒÔ¥VšºÔJ—N¥‰K§Òj¥ t*M¡VšB©4eZi^¾Uš×—¾UšDù»¯>®•¦.µÒä¥Tš¼”JS—ZiêR*MJ¥©C­4u©•&Q*M~\*ÍÿOÙ½¤Ç™ÍšJ€O ¸`DÕ¯ù7JÉÏÍ6 ,ÏÓRgÑ ñ?û›¦K­4u©•&/¥Òä¥TšB­4‰òg_¢TšB­4‰Riê[ÐJ“—Ri µÒ$º¯oÔ·JS_x+M]j¥ÉK©4yi*Mj¥©C­4y)•&.J“(•&>îTš¼”JS—ZiêR+M¢TšB­4‰>æ¯xˆîëõ­ÒÔ· •¦.µÒä¥Tš¼ôµ¿Q§ÒÔǵÒä¥×þFJS—RiòÐc£N¥©K­4u©•&Ñs£N¥©K­4y鱿Q§Òj¥Iô¹¿Q§Òj¥Iô±¿Q§Òä¥×7êÍ¥SiâÒ©4‰žûu*M]j¥©K­4yéµ¾Q§ÒÔ¡Vš¼ôØß¨SiêR+M]j¥IôÜߨSiêR+M¢ÇþFJS¨•&ÑçþFJSß‚VšºÔJ“—îûu*M]j¥Iô¹¿Q§Ò䥯ýj¥©C­4y赿Q§ÒÔ¥Vš¼”J“—¾ö7êTšø¸SiòR*M]j¥©K­4‰ûu*M¡VšDŸûu*M} ZiêR+M^züx£Þ^zíoÔ©4õq­4yé¹¾Q§ÒÔ¡Vš¼tßߨSiêR+M]j¥IôØß¨SiêR+M]úçnY¿™Ï×þFJ“è¶¿Q§Ò$úÚߨSiê[ÐJ“—žûu*M\:•&/=ö7êTšú¸Tš:ÔJ“‡žûu*M]j¥ÉK÷ý:•¦P+M¢Ïý:•¦¾ðVšºÔJ“辿Q§Òj¥ItÛߨSiê[ÐJS—ZiêR+M^zþx£Þ]J¥©C­4‰ëu*Mj¥©K­4yé¹?Q§ÒÔ¥VšD÷OÔ[ôÚŸ¨Siâ ?•&/=¬•&=öêTšºÔJS—ZiòR*M]j¥©K­4‰¦Ò¤yíÔ©4õu·Òä¥çþ@JS¨•&Ñ} N¥©K­4u©•&/=öª•&J‡ZiÒ<÷êTšºÔJ“—ûu*M]j¥©K­4yé¹?P­4inûû4•¦¾èVš:ÓJ“èsœN¥)ÔJS_x+M^ºïÓ©4u©•¦.¥Òä¡ÇÇéí¡¯?Ûv*M¢ûþ8JS—ZiêR+M^zìÓ©4u©•&Ñçú8J¨•&Ím›N¥‰oÀ©4u©•&Q*M¢çþ6JS_x+M^ºïoÓ©4u©•¦.¥Òä¡Çþ8JSŸÖJS—ZiòÒkœN¥©K­4yé±?N­4eZi­¿ßZi µÒÔ?~+M^zìÓ©4…Zi}îÓ©4u©•¦.µÒä¥ûþ:µÒÄ¡SiâЩ4yé¹ÿåÀ©4õq­4u©•&/½ö×éTšD·õu:•&Ñ×ú:½ZiÝ÷×éTšºÔJS—ZiòÒcN¥©k¥©K­4y鹿N§ÒÔ¥TšZ§ãÔ¡vœ¼ôØ­ÓqêR;N]jÇIôÜ­“mêR³M¢Çþhló úß5¿ª§N·ã$zî¯Øé8u©'/Ý÷WìtœºÔŽ“èsÅNÇÉK_û+ÖŽS‡ÚqòÐkÅNÇ©Kí8y)'/}íÖé8ñq§ãä¥tœºÔŽS—Úq=öGëtœBí8‰>÷Gëtœú´ãÔ¥vœ¼ôøñh½½ôÚ­ÓqêãÚqòÒs}´NÇ©Cí8yé¾?Z§ãÔ¥vœºÔŽ“è±?Z§ãÔ¥vœºÔŽ“—^ûŸ´NÇItÛߨÓq}íoÔé8õ-hÇÉKÏý:'.Ž“—ûu:N}\:NjÇÉCÏý:§.µãä¥ûþFŽS¨'ÑçþFŽS_x;N]jÇItßߨÓq µã$ºíoÔé8õ-hÇ©Kí8u©'/=¼Qï.¥ãÔ¡vœDõ‰:§µãÔ¥vœ¼ôÜŸ¨ÓqêR;N¢û'ê-zíOÔé8ñ…ŸŽ“—ž?ž¨·—¾ö'êtœD÷ý‰:§P;N}áí8yé±?Q§ãÔ¥vœº”Ž“‡žû ÕŽSÖŽ“‡û u:N]jÇ©Kí8y)§.µãÔ¥vœDÓqÒ¼öêtœúºÛqòÒs NÇ)ÔŽ“è¾?P§ãÔ¥vœºÔŽ“—ûÕŽ‡NljCí8ižûu:N]jÇÉKý:§.µãÔ¥vœ¼ôܨvœ4·ý}šŽS_t;NiÇIô¹?N§ãjÇ©/¼'/Ý÷ÇétœºÔŽS—ÒqòÐãÇãôöÐןí;'Ñ}œNÇ©Kí8u©'/=öÇétœºôÏ®ÿÍ¥ã¤yîS;NšÛþ6Ž߀ÓqêR;N¢tœDÏým:§¾ðvœ¼tßߦÓqêR;N]JÇÉCýq:§>­§.µãä¥×þ8ŽS—ÚqòÒcœÚqÊ´ã$Z¿µãjÇ©üvœ¼ôاÓq µã$úܧÓqêR;N]jÇÉK÷ýujljC§ãÄ¡ÓqòÒsÿËÓqêãÚqêR;N^zí¯Óé8‰nëët:N¢¯õuzµã$ºï¯Óé8u©§.µãä¥Çþ:ŽS׎S—ÚqòÒsNÇ©Ké8yèþãuz{èõgk$¾uœDŸûët:N^úÚ_§ÓqêÒëçϲ¾½ôZ_§Óqígûët:N|ѧãÄ¥ÓqòÒkNÇItÛ_§ÓqòÒ×þ:ŽS—ÚqòÒs}NÇ©Cí8yé_üëé8õqí8u©'/=÷×étœº”Ž“‡îûëÔŽS¦'ÑÏŸb}‹ûët:N}ÚqêR;N^zí¯Óé8õqí8y鱿N§ãÔ¥¯õu:'=××é[Çùû¥oçÛK÷~ÖlÙã âç ïqq3ˆ{œAÜã¼Ð²ÇÄ=Î îqqs÷8ƒ¸ÇÄ=ÎAÞã âg÷8ƒ¸Ç9ˆ{œ1Üã âç ïqq3H{œ1Üãä=Î îqqs÷8ƒ¸ÇÄ=Î îqòg÷8ƒ¸ÇÄ=ÎAÞã âg÷8y3ˆ{œAÚãŒáç…–=Î"íqi3ˆ{œEÚã,Òg‘ö8ƒ¸ÇY„=Îíqq³H{œEÚã,zaë,ˆ{œEÚã,Òg‘ö8ƒ¸ÇY¤=Î"íqq³H{œEÚã,Òg÷8‹´ÇY¤=Î îqi³H{œEØãŒùÒg‘ö8‹´Ç9È{œEÚã,ҿǨH{œAÜã,Òg‘ö8ƒ¸ÇYôñç÷UW‘ö8‹´ÇÄ=Î"íqi³H{œAÜã,Òg‘ö8ƒ¸ÇY„=Îíqý¾Çù®¾œ_ÅÎ" ti 3ˆE·ýÑòg‘ö8ƒ¸ÇY¤=Î"íqq³H{œEÚã,Òç ïqi³H{œEÚã âg‘ö8‹°ÇÃ=Î"íqi³H{œAÜã,ÂçAšß âüf‘æ7‹4¿Y¤ùÍ Îoi~³Hó›Ašß|Ó–æWi³H{œEÚã âg‘ö8‹´ÇY¤=Î íqÖh³H{œAÜã,Òg‘ö8‹´Ç9È{œEÚã,Òg÷8‹´ÇY¤=Î"íqq³H{œEÚã âg‘ö8‹´ÇYôÚ-ïqi³{œ1Üã,Òg‘ö8‹´ÇÄ=Î"íqi³H{œAÜã,Òg‘ö8ƒ¸ÇY¤=Î"íqi3èK{œEÚã,Òç ïqi³H{œEÚã Ògö8‹´ÇÄ=΢ýòg‘ö8ƒ¸ÇY¤=Î"íqi3ˆ{œEÚã,Òg÷8‹´ÇY¤=Î"íqq³H{œEÚã ÒgÍm¢¸ÇY£=Î îqi³H{œAÜã,Òg‘ö8‹´Ç9È{œEÚã,Òg‘ö8ƒ¸ÇYtߟ(ïqq³H{œEÚã,Òg÷8‹°ÇY£=Î íqÖh³H{œEÚã âg‘ö8‹´ÇÄ=Î"íqa³æµ?PÞã,Òg‘ö8‹´ÇÄ=Î"íqi3ˆ{œEÚã,Ògö8Çx³{œ5Úã âg‘ö8‹´ÇY¤=Î îqi³H{œAÚã¬Ñgѯ# Úã âg‘ö8‹´ÇÄ=΢ýqòg‘ö8ƒ¸ÇY„=Îíqa3†{œEÚã,Òg÷8‹´ÇY¤=Î"íqµã$Âgö8q³æ¶¿MÞã,Òg÷8‹´ÇY¤=Î îqi³H{œEÚã âgö8k´ÇY¤=Î îqi³H{œAÜã,Òg‘ö8‹°ÇÃ=΢õ÷÷8ƒ¸ÇY¤=Î"íqi3ˆ{œEÚã,Òg÷8‹´ÇY¤=Î"ìqŽñg‘ö8‹´ÇY¤=Î îqÝ÷×É{œAÜã,Âgö8‹°ÇÃ=Î"íqi3ˆ{œEÚã,Òg‘ö8ƒ¸ÇY¤=Î"íqq³{œ5Úã,Òg÷8‹´ÇY¤=Î"íqq³H{œEØãŒágÑ~F{œEÚãä=Î"íqi3ˆ{œEÚã,Òg‘ö8ƒ¸ÇY¤=Î"ìqÆp³H{œEÿâçX½ÇÄ=Î"íqi3ˆ{œEØã¬Ñgö8c¸ÇY¤=Î"íqi3ˆ{œEÚã,Òg÷8‹´ÇY¤=Î"íq}a³F{œEÚã¼Ð²ÇYtÓçÿí±vœƒÜq^hé8¹ãäŽs;οhë8¹ãäŽs;Î -ç wœƒÜq^hé8¹ãäŽs;Î ¹ããŽs;Î -ç wœƒØqŽqÇy¡¥ãäŽs;Î -ç wœƒÜqrÇy¡¥ãäŽs;ÎAî8/´tœƒîì8¹ã¼ÐÒqrÇ9ˆçwœÑÖq±ã bÇ9Èg;Î vœAì8¹ã RÇÃŽs;Î vœAì8ƒØqrÇÄŽ3ˆg;ÎAî8ƒØq±ãäŽ3ˆg;Î vœƒÜq±ã bÇ9Èg;Î vœAê8Ǹã bÇÄŽóBKÇÄŽ3ˆþ bÇ9Èg;Î vœƒÜq}è¯x‚Øq±ãäŽ3ˆg;Î vœƒÜq±ã bÇ9ÈgЯç»ú2¿ˆagÐïaçAî8ƒØq±ãäŽ3è¶?ZKÇÄŽs;Î vœAì8¹ã bÇÄŽ3ˆç…–Ž3ˆg;Î vœƒÜq±ã RÇ9Æg;Î vœAì8¹ã bÇÄŽs;Î vœAì8ƒØqrÇÄŽ3ˆç uœ1Û b¶„lóM6:¿Êg;Î vœAì8±ãŒaÇÄŽs;Î vœAì8ƒØq^hé8ƒØq±ãäŽ3ˆg;Î vœƒÜq±ã bÇ9Èg;Î vœAì8¹ã bǤŽsŒ;Î vœAì8ƒØqrÇÄŽ3ˆg;ÎAî8ƒØq±ãäŽ3ˆg;Î vœƒÜq±ã bÇy¡¥ã bÇÄŽ3赿Qî8cØq±ãäŽ3èc£–Ž3ˆç wœAì8ƒØq±ãäŽ3ˆg;ÎAî8ƒØq±ã bÇ9Èg;Î vœƒØqÆÜö'Êg ;ÎAî8ƒØq±ãäŽ3ˆg;Î vœZ:Î vœAì8ƒØqrÇtߟ¨¥ãäŽ3ˆg;Î vœƒÜq©ãŒaÇ9ˆg ;Î vœAì8¹ã bÇÄŽs;Î vœAê8cØqrÇÄŽ3ˆg;ÎAî8ƒØq±ãäŽ3ˆg;Î uœ—Y:Î uœ1ì8¹ã bÇÄŽ3ˆç wœAì8ƒØqbÇÃŽ3è÷®‹xíÓÒq±ã bÇ9ÈgÐÇþ8-g;ÎAî8ƒÔqưã RÇ9Æg;Î vœƒÜq±ã bÇÄŽs;Î uœ1ì8/äŽ3æ¶¿MKÇÄŽs;Î vœAì8¹ã bÇÄŽ3ˆç wœAê8cØq±ãäŽ3ˆg;ÎAî8ƒØq±ã RÇ9ÆgÐúûÍç wœAì8ƒØq±ãäŽ3ˆg;ÎAî8ƒØq±ã RÇy™¥ã bÇÄŽ3ˆç wœAì8ƒØqrǤŽ3†g:Î1î8ƒØq±ãäŽ3ˆg;Î vœƒÜq±ã bÇ9Èg:ÎvœAì8¹ã bÇÄŽ3ˆç wœAì8ƒÔqŽqÇ´ŸaÇÄŽóBKÇÄŽ3ˆç wœAì8ƒØq±ãäŽ3ˆg:Î1î8ƒØqý‹Ÿc]:ÎAî8ƒØq±ãäŽ3Hg ;Î uœcÜq±ã bÇÄŽs;Î vœAì8¹ã bÇÄŽ3ˆç vœ1ì8ƒØqþE[Çtû½ãüûÃAKÆ£Šs #Î5œ1J8cTp^ÆgŒúÍå›1ª7Ç0ÞŒQ»£ts ËÍ…›1ê6c”mŽQµ¢h3FÍæ&›1*6cl†¨×Ã\3FµfŒbÍ1l5c”jƨԌQ¨9†fŒ2ÍUš1Š4ǰьQ¢£Bs Íõ™1È3CTg^Æqf Ṳ́™1*3kf֠ˬA–£*³æ÷(³MfŒ’Ì™52kÐcÆ(ǬAYƒ³-fŒRÌ”˜51cÔaÖ Ã¬A…Yƒ3F f ̘1 0kÐ_Ö ¿¬ù½¾ Q|Yƒö²éå–—5/kðçÕš×ï? £ê²Ñe šË%—5¿ÿeL ‚Ëô–1Ê-kP[Ö ¶¬Ak£Ô²¥e BËt–ÿÛPöý¾ŸY‚ʲ‘eŒË$–5(,cXÖÜÖgˆye êÊÅ•5h+kVƨ¬¬AXYƒ®²YåV•5ˆ*kÐTÖ ©ŒQQYƒ ²æ÷ž2D9e jÊÄ”5h)c”RÖ ¤¬AH£Ž²e *ÊD”1j(kPÖ  ŒQ@Yƒ~²ùd êɵ’5H%kPJþO©Ù_„r2ád ºÉd“1ª&kMÖ ™¬A29æï,ÿÝ0˜¬A/£\²µd bÉ´’1J%kPJÖ ”ŒQ'YƒL²•d "É5’5H$k~/$CHÖ ¬AYƒ:2Fqd ÚȤ‘5(#cFÖ ‹¬A£*²Qd šÈ$‘1*"kDÖ ‡Ã²5d bÈš×úê(…,A Yƒ2FdÍÇúê°‚¬A£² d È1êk?Ö ~ŒQüXƒö±éc ÊÇ…5èk=Æ z,¹­ŽšÇ$1*k<Ö wŒQîXƒÚ±±c ZÇ1LkP:Ö t¬Aç£Ì±•c "Ç5Ž5HkP8Ö pŒQßXó{ÞX‚º1qc ÚÆ¤5(c6Ö k¬AÖ£ª±QcÍïMc ’Æ5kÐ3Ö gŒQÍXƒ˜±-cŒRÆ”Œ5k~ï‡0c¬ù½b,AÄ£†± c ÆŒ1êk/Ö ^ŒA¼X‚v±æ·Ÿ'+x­Ï ÃÅt‹5ÈcT-Ö|¬Ï ›Å$‹1*k~KÐ+Öüž+†¨V¬A¬XƒV1F©b JÅ„Š5èc”)Öü^)– R£F±ä¶¾6,k(ƨO¬AžXƒ:1Fqb ÚĤ‰5(c&ÖüÞ%– K¬A•£(±Mb ’ĉ5kÐ#Öüž#†¨F¬Ù~{©EŒQŠXƒ±!b :Äeˆ5¨k!ƨA¬A‚Xƒ±æ÷qûÃä‡5¨kƨ=¬AzXƒò0FáaÍïÝa ²Ãšß«ÃE‡5hkƨ8¬ApXƒÞ°¹aŒjÃĆ5h c”Öü^– 4¬Ag£Ì°•a "Ã4†1J kPÖü†¨/¬Y .¬A\8†ma Ò”…1 kÐÖ +¬AU£¨°MaÍïIaˆŠÂ…5ûÏg2'ŒQMXƒ˜°-aŒRšßK„„5¿w„!ÊkPÖ "¬AC£„°a Âõƒ5ÈkPÖ ŒA;X‚t°åàeÖÜÔ Þÿ<žßÃÁÇ?ñÛÏCƒZ½¹tÒA\:í .5Ô¥Öƒ¿_ú– µüý㾄ºÔ‚—NBˆK§!jDt*B¡f„Bí…â[Ð’‡NJ¨Cm qéÄ„B­ ñqÍ u¨=! —NQ¨KM qé4…¸t¢B]jU(Ô¬wºB\:a¡.µ,Ô¥¦…¸tÚB\:q¡PëB “ µ/J`(ÓÂð÷ïÀ·Äð÷KßC¢üV×ÊP—šòR:C^Jh¨K- u)©!¥5ԡƆºÔÚ(¹!?.½¡.58Ô¥‡¼”ä—Ò 5:$ÊŸh‰’ µ;$Jx¨oAËC^Jz(Ôöè¾¾QßêC}áÍu©ý!/%@ä¥)u¨ ¢µAä¥Dˆ¸t*D¢dˆø¸Ó!òRBD]j‰¨KM‰Ò" 5F$ú˜¿¼!º¯oÔ·Qß‚‰ºÔ"‘—’$òÒ×þF(Q×*‘—^¿¾Qï’ÃùU u:a¢¾Æ–‰<ôµ?Z§MԥƉDÏýÑ:y¢.µOä¥ÇþhBQ¨‰"ÑçþhHQ¨•"ÑÇþhN‘—^?­7—N©ˆK'U$zîÖ‰u©µ¢.5Wä¥×úh`Q‡Z,òÒc´N³¨Ku©Õ"Ñs´N·¨K ‰û£uÒE¡¶‹DŸû£uêE} š/êRûE^ºïÖ)u© #Ñçþhˆ‘—¾ö7ªÕ¢5[|sèM2™_õÚ­S2êklÊÈKiyék´þþuîöÍýç?×GëôŒºÔ Q—Z4=öGë4B‰>÷Gëdú´kÔ¥†¼ôøñh½½ôÚ­Ó6êã7òÒs}´NÞ¨Cíyé¾?Z§pÔ¥&ŽºÔÆ‘è±?Z§rÔ¥fŽºÔΑ—^û£uJG¢ÛþhÖ‘èk´Ní¨oAsG^zîÖ qé¼ôØ­Ó<êã=êP«GzîoÔéu©á#/Ý÷7ê¤Bm‰>÷7êÔú›?êRûG¢ûþFR¨ $Ñm£N©oA+H]j©Kí yéùãzw)%¤5…$z¬OÔ‰!u¨5¤.5‡ä¥çþD R—ZDÝ®E¦.5Éä¥çþ:(S—ReòÐýÇëôöÐëÏÖH| 3‰>÷×餙¼ôµ¿N'ÎÔ¥×ÏŸe}{éµ¾N§Ï$ÚÏ<ö×é$šø¢O£‰K'Òä¥×þ:L“è¶¿N'Ô䥯ýu:©¦.µÕä¥çú:ZS‡škòÒ¿ø9ÖlêãZlêR“M^zî¯Ó‰6u)Õ&Ý÷שݦLÃM¢Ÿ?Åú=ö×é´›ú4ÞÔ¥Ö›¼ôÚ_§ÓoêãpòÒcN©Ki8u¨'=××é[Æùû¥oçÛK_ÿü¿$Ûä /@^h™€ä ÈAwŽ@ò ä_´Í@òä Aòä…–)ÈAÞ‚ä1È -kƒ<9È{ƒ<y!/BŽñ$ä oB^h…äUÈAœ…ã]È -ü 9ÈÓZ¶!yr×!yòBË>ä DòBä OD^hÙˆä‘ÈA^‰¼Ð29È;‘ƒ89ÆK‘Ñ6Ä­È ŽEòZdç"ƒ¸ÄÁÈA^Œ Òdd 7#y42ˆ«‘Aœ ânä Gq92ˆÓ‘AÜŽäñÈ ®Gq>r÷#ƒ8 ÄÉ NHò†dG$ƒ¸"9È3’AÜ‘ âd–$ÇxJ2ˆ[’A“¼Ð²&Ä9É þûŠ‚8(9È‹’Aœ” â¦ä J}üÁ¿„+è¾¾QÛ®ä KqY2ˆÓ’AÜ–äqÉ ß×%ß%šùUÜ›„ÁÉoH“1\˜ âÄä oLqd2ˆ+“ƒ<3tÛ­eh2ˆK“ƒ<5Ä­É ŽMòÚdç&ƒ¸7ÄÁÉ -‹“Aœœ âædG'yu2ˆ³“AÚãáÉ .Oqz2ˆÛ“ƒ<>ÄõÉ ÎOòþd(ƒ¸@ôµ?ZËeG(ƒ¸B9È3”AÜ¡ âe—(yŠ2ˆ[”A£<ˆã“ƒ¸>ÃùÉ îOòe(ßd£ùUܤ â(å…Nlj’þÒw}´–]ÊA¦ â2e§)ƒ¸M9Èã”A\§ â<å ïSq 2ˆ •Aœ¨äÊ ŽTi¥rŒg*ƒ¸Stß­e©r§*ƒ¸UÄ±Ê ®Uò\e÷*ƒ8X9È‹•Aœ¬ âfeG+yµ2ˆ³•AÜ­¼Ð2\ÄåÊ NWq»rÇ+c¸^ÄùÊAÞ¯ úпý8ˆ –Aœ°ä Ë ŽXqÅ2ˆ3–ƒ¼cÄ!Ë .Yò”e·,ƒ8fÄ5ËAž³ âže-qÑ2æ¶?QÞ´Œá¨å ¯ZqÖ2ˆ»–ƒ÷ÇétœºÔŽS—ÚqòÒ}ÚqâÐé8qètœ¼ôÜÿràtœú¸vœºôŸûþ:ŽS—ÚqÝÖ×étœD_ëëôjÇItß_§ÓqêR;N]jÇÉKýu:§>®§.µãä¥çþ:ŽS—ÒqòÐýÇëôöÐëÏÖH|ë8‰>÷×étœ¼ôµ¿N§ãÔ¥×ÏŸe}{éµ¾N§ã$ÚÏ<ö×étœø¢OljK§ãä¥×þ:Ž“è¶¿N§ã䥯ýu:§.µãä¥çú:ŽS‡ÚqòÒ¿ø9ÖÓqêãÚqêR;N^zî¯Óé8u)'Ý÷ש§L;N¢Ÿ?Åú=ö×étœú´ãÔ¥vœ¼ôÚ_§ÓqêãÚqòÒcNÇ©Ké8u¨'=××é[Çùû¥oçÛKÿýÿÜ×=ÎAÞã¼Ð²Ç9È{œƒ¼Ç9È{œѶÇ9È{œƒ¼Ç9È{œú÷8ys÷8/´ìqòç ïqòç…¼Ç9Æ{œƒ¼Çy¡es÷8qsŒ÷8/´ìqòç ïq^hÙãä=ÎAwîqòç…–=ÎAÞãä=ÎAÞã¼Ð²Ç9È{œƒ¼Çy¡es÷8qsŒ÷8ÿ¢m3ˆ{œAÜãä=Î îqq3ˆ{œƒ¼Ç¤=Îîqòg÷8ƒ¸ÇÄ=ÎAÞã âg÷8ƒ¸Ç9È{œAÜã âç ïqq3ˆ{œAÜãä=Î îqqs÷8ƒ¸ÇÄ=Î íqŽñg÷8ƒ¸Çy¡e3ˆ{œAü÷qs÷8ƒ¸ÇÄ=ÎAÞã úøƒUW÷8ƒ¸Ç9È{œAÜã ú}ó]¢™_ÅÎAèü†¸ÇÄ=ÎAÞã Òg ÷8ƒ¸Ç9È{œAÜã âç ïqÝöGkÙã âç ïqq3ˆ{œƒ¼ÇÄ=Πûþh-{œZö8ƒ¸ÇÄ=Î îqú÷8ƒ¸Ç¤=Î1Þã âg÷8ƒ¸Ç9È{œAÜã âç ïqq3ˆ{œAÜãä=Î îqqs÷8ƒ¸ÇÄ=Î îqòg÷8ƒ¸ÇÄ=ÎAÜãŒág÷8y3ˆ{œAÜã âç…¸Çyç7ƒ8¿9Èó›Aœß Âüæ›"4¿êk´–=Î îqqs÷8ƒ¸ÇÄ=Î îqòg÷8ƒ´Ç9Æ{œAÜã âg÷8y3ˆ{œAÜã âç ïqq3ˆ{œƒ¼ÇÄ=Î îqqs÷8ƒ¸ÇÄ=Î -{œAÜã âg÷8q3†{œAÜãä=ΠýÑZö8ƒ¸Ç9È{œAÜã âg÷8y3ˆ{œAÜãä=Î îqq3ˆ{œƒ¼ÇÄ=Î îqâgÌm¢¼ÇÃ=ÎAÞã âg÷8y3ˆ{œAÜã âç…–=Î îqq3ˆ{œƒþÃ=Î îqqs÷8ƒ¸ÇÄ=Î îqògö8c¸Ç9ˆ{œ1Üã âgÐ×þB-{œAÜã âç ïqq3H{œ1Üãä=Î îqq3ˆ{œƒ¼ÇÄ=Î îqòg÷8ƒ¸Ç¤=ÎË,{œAÚãŒáç ïqq3ˆ{œAÜãä=Î îqqs÷8c¸ÇôûHB÷8y3ˆ{œAÜãä=ΠýqZö8ƒ¸Ç9È{œAÚãŒágö8Çx3ˆ{œAÜãä=Î îqq3ˆ{œƒ¼Ç¤=Îîq^È{œ1·ýmZö8ƒ¸Ç9È{œAÜã âç ïqq3辿MËç ïqi3†{œAÜãä=Î îqqs÷8ƒ¸ÇÄ=Î íqŽñgÐúûÍ{œƒ¼ÇÄ=Î îqqs÷8ƒ¸ÇÄ=ÎAÞã âg÷8ƒ´Çy™e3ˆ{œAÜã âç ïqq3ˆ{œƒ¼Ç¤=ÎîqisŒ÷8ƒ¸ÇÄ=ÎAÞã âg÷8ƒ¾ö×iÙã âg÷8y3H{œ1Üã âç ïqq3ˆ{œAÜãä=Î îqisŒ÷8ƒö3Üã âç…–=Î îqqs÷8ƒ¸ÇÄ=Î îqòg÷8ƒ´Ç9Æ{œAÜã ú?Ǻìqòg÷8ƒ¸Ç9È{œAÚ㌹ﯓ÷8Çx3ˆ{œAÜã âç ïqq3ˆ{œƒ¼ÇÄ=Î îqqs÷8c¸ÇÄ=οhÛã ºaóãïeKÇÄŽs;Î vœAì8ƒØq^hé8ƒØq±ã bÇ9Èg;Î vœƒÜq±ã bÇÄŽs;ÎvœAì8¹ã bǤŽ3†ç wœAì8ƒØqrÇÄŽ3ˆg;ÎAî8ƒØq±ã bÇ9Èg;Î vœƒÜq±ã RÇÃŽóBKÇY¤Ž³Hg;Î"uœEê8‹¾ð“[Aì8‹ÐqÖ¨ã bÇY¤Ž³Hg‘:Î vœEê8‹Ôq©ã bÇY¤Ž³Hg;Î"uœEê8‹Ôq±ã,RÇY¤Ž3ˆg‘:Î"uœEè8cØq©ã,RÇ9Èg‘:Î"ýù·Hg;Î"uœEê8ƒØq}à¯xŠÔq©ã bÇY¤Ž³èÿ¨ãì¯RÇÄŽ³Hg‘:Î vœEè8kÔq©ã bÇY¤Ž³Hg;΢Ûþh¹ã,RÇÄŽ³Hg‘:Î vœEê8‹Ôq©ã䎳Hg‘:Î"uœAì8‹Ôq¡ãŒaÇY¤Ž³Hg‘:Î vœEê8‹Ôq±ã,RÇY¤Ž³Hg;Î"uœEê8ƒØq©ã,RÇY¤Ž3ˆg‘:Î"uœEê8ƒÔqÖ¨ã,RÇÄŽ³Hg‘:Î"uœƒÜq©ã,RÇÄŽ³Hg:΃¾ö7ÊÙf²ÍÿÍFû«Ôq±ã,RÇY¤Ž³Hg;Î"uœEè8cØq©ã,RÇY¤Ž3ˆg‘:Î"uœEê8ƒØq©ã,RÇÄŽ³Hg‘:Î"uœAì8‹Ôq©ã䎳Hg‘:Î"uœAê8kÔq©ã bÇYô±?Zî8‹Ôq±ã,RÇY¤Ž³Hg;Î"uœEê8ƒØq©ã,RÇY¤Ž3ˆg‘:Î"uœAê8knûÅŽ³Fg;Î"uœEê8ƒØq©ã,RÇY¤Žs;Î"uœEê8‹Ôq±ã,RÇY¤Ž3ˆg‘:Î"uœEê8ƒØq¡ã¬QÇ¤Ž³Fg‘:΢¯ý…rÇY¤Ž³Hg;Î"uœEè8kÔq±ã,RÇY¤Ž³Hg;Î"uœEê8ƒØq©ã,RÇY„ŽsŒ;Î"tœ5ê8ƒØq©ã,RÇY¤Ž3ˆg‘:Î"uœAê8kÔqýúÃuê8ƒØq©ã,RÇÄŽ³ècœÜq©ã bÇY„޳Fg:ÎvœEê8‹Ôq±ã,RÇY¤Ž³Hg;Î"tœ5ê8±ã¬¹ío“;Î"uœAì8‹Ôq©ã bÇY¤Ž³Hg‘:Î vœEè8kÔq©ã bÇY¤Ž³Hg;Î"uœEê8‹Ðqưã,Z¿±ã bÇY¤Ž³Hg‘:Î vœEê8‹Ôq±ã,RÇY¤Ž³çwœEê8‹Ôq©ã bÇY¤Ž³Hg;Î"tœ5ê8‹Ðqưã,RÇY¤Ž3ˆg‘:Î"uœEê8ƒØq©ã,RÇÄŽ³g:Î"uœAì8‹Ôq©ã,RÇÄŽ³Hg:ÎvœEûuœEê8¹ã,RÇY¤Ž3ˆg‘:Î"uœEê8ƒ>Ôq©ã,BÇÃŽ³HgÑ¿ø9VwœAì8‹Ôq©ã bÇY„޳Fg:ÎvœEê8‹Ôq©ã bÇY¤Ž³Hg;Î"uœEê8‹Ôq©ã¬QÇY¤ŽóBKÇYtSÇù÷¥Ü:ÎAî8/´tœƒÜqrÇ9Èç_´uœƒÜqrÇ9Èç…–Žs;ÎAî8/´tœƒÜqrÇ9Èç…ÜqŽqÇ9Èç…–Žs;ÎAì8Ǹã¼ÐÒqrÇ9Èç…–Žs;ÎAî8¹ã¼ÐÒqrÇ9Èç wœZ:ÎAî8¹ã¼ÐÒqrÇ9ˆçwœÑÖq±ã bÇ9Èg;Î vœAì8¹ã RÇÃŽs;Î vœAì8ƒØqrÇÄŽ3ˆg;ÎAî8ƒØq±ãäŽ3ˆg;Î vœƒÜq±ã bÇ9Èg;Î vœAê8Ǹã bÇÄŽóBKÇÄŽ3ˆþ bÇ9Èg;Î vœƒÜq}è¯x‚Øq±ãäŽ3è÷Žó]¢™_õ{Øù ±ãäŽ3ˆg;ÎAî8ƒÔqưã bÇ9Èg;Î vœƒÜqÝöGké8ƒØqrÇÄŽ3ˆç wœAì8ƒØq±ã¼ÐÒq±ã bÇÄŽs;Î vœAê8Ǹã bÇÄŽ3ˆç wœAì8ƒØqrÇÄŽ3ˆg;ÎAî8ƒØq±ãäŽ3ˆg;Î vœƒÜq±ã bÇÄŽs;ÎvœAì8¹ã bÇÄŽ3ˆç…–Ž3ˆg;ÎAî8ƒØq±ã bÇ9Ègæ7‹˜mR¶ù¦ͯbÇÄŽ3ˆç wœAì8ƒÔqŽqÇÄŽ3ˆg;ÎAî8ƒØq±ã bÇ9Èg;Î vœƒÜq±ã bÇÄŽs;Î vœAì8/´tœAì8ƒØq±ãÄŽ3†g;ÎAî8ƒ>öGké8ƒØqrÇÄŽ3ˆg;ÎAî8ƒØq±ãäŽ3ˆg;Î vœƒÜq±ã bÇ9ˆgÌm¢ÜqưãäŽ3ˆg;ÎAî8ƒØq±ã bÇy¡¥ã bÇÄŽ3ˆç wœAì8ƒØqrÇÄŽ3ˆg;ÎAî8ƒÔqưãÄŽ3†g;Î vœƒÜq±ã bÇ9Èg;Π;~Ü+†ç wœAì8ƒØq±ãäŽ3ˆg;ÎAî8ƒØq±ã RÇy™¥ã RÇÃŽs;Î vœAì8ƒØqrÇÄŽ3ˆç vœ1ì8ƒ~ÿáºvœƒÜq±ã bÇ9ÈgÐÇþ8-g;ÎAî8ƒÔqưã RÇ9Æg;Î vœƒÜq±ã bÇÄŽs;Î uœ1ì8/äŽ3æ¶¿MKÇÄŽs;Î vœAì8¹ã bÇÄŽ3ˆç wœAê8cØq±ãäŽ3ˆg;ÎAî8ƒØq±ã RÇ9ÆgÐúûÍç wœAì8ƒØq±ãäŽ3ˆg;ÎAî8ƒØq±ã RÇy™¥ã bÇÄŽ3ˆç wœAì8ƒØqrǤŽ3†g:Î1î8ƒØq±ãäŽ3ˆg;Î vœƒÜq±ã bÇ9Èg:Θû×éí!vœƒÜq±ã bÇÄŽs;Î vœAê8Ǹã Úϰã bÇy¡¥ã bÇÄŽs;Î vœAì8ƒØqrÇÄŽ3HçwœAì8ƒþÅϱ.ç wœAì8ƒØqrǤŽ3†g:Î1î8ƒØq±ã bÇ9Èg;Î vœƒÜq±ã bÇÄŽs;ÎvœAì8ÿ¢­ã º©ãüúç·Ñ·ŽóñO‚øóÒ vœAo.Ž—NÇ©Kí8u©çï—¾uœBí8ÿ¸o§.µãÄ¥ÓqâÒé8…ÚqŽS¨§P;N¡vœø´ãÄ¡ÓqêP;N\:§P;N|\;NjljC§ãÄ¥ÓqêR;N\:'.ŽS—Úq µãÄÇŽ—NÇ©Kí8u©'.Ž—NÇ)ÔŽètœBí8…ÒqÊ´ãüý;ð­ãüýÒ·Ž“(öÕǵãÔ¥vœ¼”Ž“—ÒqêR;N]JÇÉCé8u¨§.µã$ºOÃKÇ©Kí8u©'/¥ãä¥tœBí8‰òg_¢tœBí8‰Òqê[ÐŽ“—Òq µã$º¯oÔ·ŽS_x;N]jÇÉKé8yi:NjÇ©Cí8y)'.Ž“('>îtœ¼”ŽS—ÚqêR;N¢tœBí8‰>æ¯xˆîëõ­ãÔ· §.µãüßKï:Îüªtœ<ýµ?Z§ãÔ?I;N^zíÖé8u)'=öGëtœºÔŽS—Úq=÷GëtœºÔŽ“—û£u:N¡vœDŸû£u:N¡vœDû£u:N^zýx´Þ\:'.Ž“è¹?Z§ãÔ¥vœºÔŽ“—^ë£u:NjÇÉKýÑ:§.µãÔ¥vœDÏýÑ:§.µã$zìÖé8…Úq}îÖé8õ-hÇ©Kí8y龿Q§ãÔ¥vœDŸûu:N^úÚߨvœ:ÔŽ“‡^ûu:N]jÇÉKé8yék£Nlj;'/¥ãÔ¥vœºÔŽ“('Ñ×þFŽ“ès£NÇ©oA;N]j¶ÉKoÔÛK¯ßߨ7Ùèüªvœúüvœúütœ:ÔŽS‡ÚqòÒ}´NÇ©Kí8u©'Ñc´NÇ©Kí8u©'/½öGëtœD·ýÑ:'Ñ×þhŽSß‚vœ¼ôÜ­ÓqâÒé8yé±?Z§ãÔÇ¥ãÔ¡vœ<ôÜ­ÓqêR;N^ºïÖé8…Úq}îÖé8õ…·ãÔ¥vœDé8‰^û£u:N¢ÛþhŽSß‚vœºÔŽS—ÚqòÒóÇ£õîR:NjÇIôXŸ¨ÓqêP;N]jÇÉKÏý‰:§.µã$ºÿx¢Þ¢×þDŽ_øé8yéùã‰z{ék¢NÇItߟ¨Óq µãÔÞŽ“—ûu:N]jÇ©Ké8y蹿Pí8õaí8y豿P§ãÔ¥vœºÔŽ“—ÒqêR;N]jÇItÿ³ýo5§ãjÇ©¯»'/=÷êtœBí8‰îûu:N]jÇ©Kí8yé±?Pí8qètœ8ÔŽ“æ¹?P§ãÔ¥vœ¼ôبÓqêR;N]jÇÉKÏýjÇIsÛß§é8õE·ãÔ™vœDŸûãt:N¡vœúÂÛqòÒ}œNÇ©Kí8u)'=~×Çétœ@í8inûÛt:N|NÇ©Kí8‰Òq=÷·étœúÂÛqòÒ}›NÇ©Kí8u)'=öÇétœú´vœºÔŽ“—^ûãt:N]jÇÉKýqjÇ)ÓŽ“hýýÖŽS¨§þñÛqòÒcœNÇ)ÔŽ“èsœNÇ©Kí8u©'/Ý÷ש'އNÇÉKÏý/NÇ©kÇ©Kí8y鵿N§ã$º­¯Óé8‰¾Ö×éÕŽ“辿N§ãÔ¥vœºÔŽ“—ûët:N}\;N]jÇÉKÏýu:§.¥ãä¡û×éí¡×Ÿ­‘øÖq}î¯Óé8yékNÇ©K¯Ÿ?ËúöÒk}NÇI´Ÿyì¯Óé8ñEŸŽ—NÇÉK¯ýu:'ÑmNÇÉK_ûët:N]jÇÉKÏõu:§µãä¥ñs¬§ãÔǵãÔ¥vœ¼ôÜ_§ÓqêR:Nºï¯S;N™vœD?Šõ-zì¯Óé8õ hÇ©Kí8y鵿N§ãÔǵãä¥Çþ:ŽS—ÒqêP;Nz®¯Ó·Žó÷Kß:Îw—nÿü¼Ô2Ç9†kœ—ñçnqŽáç.qþ5ËçîpŽá ç®p^Æ#œc¸Á9†œ—ñçpŽáþæ˜/Ío^†ë›C8¾9†Û›—ñôæ.oŽÑðæîn^Ƴ›c¸º9†£›—ñææNnŽáâæn^Æ{›c8·9†k›c8¶yomŽáÔæ.m^ÆC›c¸³9F3›C¸²ù×,#›1ÚØŒÑÄæ.lÆh`3Fûš1š×ÃuÍŒk†h[s §5c´¬sÇFYŒv5ÇpV3F«š1ՌѦæNjÆhQ3Fƒšc¸§£9Í­iÆhLs ·4c4¥£%Í1ҌюfŒf4c°¢9„#š1ÚЌфæe¼ £Íý{‡b4Ÿ9†ë™1ÏŒÑvæNgÆ|üùý_ª£áÌífŽÁlæ›’2¿è÷Íc4š£ÍÌ1œÌŒÑbfŒ3Çp/3s™!ZËŒÑXæneÆh*3FK™c8”s[Ÿ!ÏdÆh%s G2c´‘£‰Ì1\ÈŒÑ@fŒö1c4y¯cÆh3FÛ˜1šÆÃeÌ cÆ`sg1c´Š£Q̘/üûÇÜ4‰£EÌ bŽáfŒæ0c´†£1Ì1ÜÂŒÑfŒ–0Çp3F;˜1šÁŒÑ æŽ`Æh3F˜1ZÀ£Ìí_Æhþr ×/c4~£íËM_^ÆË—1¾ŒÑîåÎ^Æhõ2F£—1Ú¼ÃÉË-^ÆhðrŒö.k´n£qËm[Žá´e –-ÿ7¶Ì/ÂÒå]Æ|¬Ïg.c´r9†#—1Ú¸ŒÑÄeŒ.Çpà2Fû–1š·ÃuË[ÆhÛ2FÓ–c¸l£aËíZ^Ƴ–1ZµŒÑ¨eŒ6-ÇhÒ2D‹–1´Ã=˘õòšeŒÆ,ÇpË2FS–1Z²ŒÑåîXÆhÆ2F+–c8b£ ËMXÆ|­Ï,c´_£ùÊ1Z¯ ¹­öáveˆ¦+Çp¹2FÕ1Ú­ÃÙÊ­VÆh´2F›•—ñdeŒ+c4X£½Ê1œ«ŒÑZeŒÆ*Çp«2FS•1ZªŒÑP嘛v*c0S¢•Ê1© ÑFeŒ&*c´P9†•1Ú§ŒÑ<å®SÆhœ2æþû¿Â>DÓ”c¸L£aÊíRÆh–r W)c4J£MÊ1œ¤ŒÑ"eŒ)c°GyÏQÆ`2Dc”c¸E£)Ê-QÆhˆr w(c4C£Ê1¡ Ñe̯»Z ÃÊíOÆh~r ×'c>ÖçÆÛ“1šžÃåÉ O†hw2³“C¸:£ÑÉmNŽáädŒ'c48óµ>7ž›ŒÁÚdˆÆ&/íÉÛúÚxi2FC“c¸3£™É­LŽáÈdŒ6&c41£…É1˜ŒÁ¾dˆæ%c´.9†ã’1Ú–ŒÑ´ä.KÆhX2F»’1˜•ÂUɘí·7%ÇpR2F‹’1”ŒÑžäÎIÆhM2Fc’c¸%£)É-IÆ`Hò"Þ‘ŒÑŒdŒV$c4"9†’1šŒÑ‚äHÆ`?2Dó‘1XrÓxdŒ¶#c49†Ë‘1ŽŒÑndŒf#Çp52F£‘1ÚŒÃÉÈ,F†h02F{‘c8£µÈEÆh+r §"c´ƒ¡È!܉ŒYh%2F#‘—ñFdŒ&"c´9†‘1Ú‡ŒÑöGk ƒX8râÄÆ1ˆ‘c+ÇA΃Ø91täÒ1ˆ©c[Ç ÆŽƒ\;1w bïx¡%x bñÄä1ˆÍã F1¬ƒ˜=r÷ô±?ZKùÄôqÛÇ ÆA¬ƒ˜?rÿÄ2ˆä 'Al ƒA±‚ä 2ˆdCÈA,!cnû›å2†1ä ×AÌ!ƒØCrÄ"2ˆId›È -Qd«È f‘Aì"9Œ bÄ4rÛÈ Æ‘A¬#ƒ˜Gº± R ÃBrÉ6’AŒ$ƒXIr&ÄN2ˆ¡ä —’AL%ƒÔJÆ0–äZ2ˆ¹d{É “ƒ\L1™ b39ÈÑd«É f“Aê&/³„“A*'c˜Nr;Äx2ˆõdóÉAî'ƒP± Ä„2† eÐï?YÁŠr3Ê v”A )¹¤ úا¥¥ bL9È5erÊö”A *Ǹ¨ bRĦr£Ê V•AÌ*ƒØUrX¤²2†iå…ÜVÆÜö·i©+ƒ˜Wr_ÄÀ2ˆ…å '–Al,ƒY±²äÌ2He CË ––ƒœZ±µ bl9ȵesË ö–A .Ǹ¸ Z¿¹¹äè2ˆÕe³Ë v—ƒ^±¼ bz9ÈíeãË Ö—AÊ//³ô—A 0ƒX`1Áä3ˆf+ÌAÎ0ƒÔaÆ0Ä R‰9Æ)f[Ì Æ˜ƒ\c1Ç bÄ s‹Ì &™Al29Ê R•Ã,3ˆ]æ ‡™A,3ƒ˜f±Íä83ˆufòÌ1î3ƒö3,4ƒ˜h^hi4ƒi±ÒäL3ˆfCÍ –šƒœj±Õ R¬9ƵfsÍ Çþ:-Áæ ›AL6ƒØlr´¤j3†ÙfºÍ17ƒXn1Ý b»9ÈñfëÍ æ›ƒÜo1à bÁÄ„sÎFœA¬8ÿ¢-ã º©ãüû¿5|ë8ß-Iµã|»$y¡ÓqâÒé8u©§.µãüýÒ·ŽS¨çï÷­ãÔ¥vœ¸t:N\:§P;N Óq µãjÇ)ÔŽß‚vœ8t:NjljK§ãjljkÇ©Cí8qètœ¸t:N]jljK§ãÄ¥ÓqêR;N¡vœø¸ÓqâÒé8u©§.µãÄ¥ÓqâÒé8…ÚqŽS¨§ÐãÏ~¨çïßoçï—¾uœDÏ?ûǵãÔ¥vœ¼ôø³ýîýÖqêR;N]JÇÉCé8u¨§.µã$JÇÉKÇ©Kí8u©'/¥ãä¥tœBí8‰òg_¢ÔƒÚq¥ãÔ· '/¥ãjÇIt_ߨo§¾ðvœºÔŽ“—ÒqòÒןõ7f;NjÇÉKé8qétœDé8ñq§ãä¥tœºÔŽS—Úq¥ãjÇIô1ÅCt_ߨoçÿ~ Þ%šó«vêt;N}woé8yék´NÇ©kÇÉK¯ýÑ:§.¥ãä¡ÇþhŽS—ÚqêR;N¢çþhŽS—ÚqòÒc´NÇ)ÔŽ“ès´NÇ)ÔŽ“èc´NÇÉK¯Ö›K§ãÄ¥Óq=÷GëtœºÔŽS—ÚqòÒk}´NÇ©Cí8yé±?Z§ãÔ¥vœºÔŽ“è¹?Z§ãÔ¥vœDýÑ:§P;N¢ÏýÑ:§¾í8u©'/Ý÷7êtœºÔŽ“ès£NÇÉK_ûÕŽS‡ÚqòÐk£NÇ©Kí8y)'/}íoÔé8ñq§ãä¥tœºÔŽS—Úq=ö7êtœBí8‰>÷7êtœú´ãÔ¥vœ¼ôøñF½½ôÚߨÓqêãÚqòÒs}£NÇ©CÍ6yéþûõ¦ͯzíÖé8õE¶ã$zìÖé8u©§.µãä¥×þhŽ“è¶?Z§ã$úÚ­Óqê[ÐŽ“—žû£u:N\:'/=öGëtœú¸tœ:ÔŽ“‡žû£u:N]jÇÉK÷ýÑ:§P;N¢ÏýÑ:§¾ðÛ×þhŽ“è¾?Z§ãjÇItÛ­Óqê[ÐŽS—ÚqêR;N^zþx´Þ]JÇ©Cí8‰ë›u:NjÇ©Kí8yé¹?Q§ãÔ¥vœD÷OÔ[ôÚŸ¨Óqâ ?'/=¬'=öêtœºÔŽS—ÚqòR:N]jÇ©Kí8‰¦ã¤yíÔé8õu·ãä¥çþ@ŽS¨'Ñ} NÇ©Kí8u©'/=öª'އÚqÒ<÷êtœºÔŽ“—ûu:N]jÇ©Kí8yé¹?Pí8inûû4§¾èvœ:ÓŽ“èsœNÇ)ÔŽS_x;N^ºïÓé8u©§.¥ãä¡ÇÇéí¡¯?Ûv:N¢ûþ8ŽS—ÚqêR;N^zìÓé8u©'Ñçú8ލ'Ím›NljoÀé8u©'Q:N¢çþ6ŽS_x;N^ºïoÓé8u©§.¥ãä¡Çþ8ŽSŸÖŽS—ÚqòÒkœNÇ©Kí8yé±?Ní8eÚq­¿ßÚq µãÔ?~;N^zìÓé8…Úq}îÓé8u©§.µãä¥ûþ:µãÄ¡ÓqâÐé8yé¹ÿåÀé8õqí8u©'/½ö×étœD·õu:'Ñ×ú:½ÚqÝ÷×étœºÔŽS—ÚqòÒcNÇ©kÇ©Kí8y鹿N§ãÔ¥tœ:Þ©ŒÁLeˆV*Çh¤2D•1š¨ŒÑBåTÆhŸ2Fó”c¸N£qÊlS†hšr —)c4L£]ÊÍRŽá*eŒF)c´I9†“”1Z¤ŒÑ e ö(/â9ʬQ†hŒr ·(c4E£%Ê QŽáeŒf(c´B9F#”!Ú Œùu @ ”c8@£ýÉÍOŽáúdÌÇúÜx{2FÓ“c¸<ƒáÉíNÆ`vrW'c4:£ÍÉ1œœŒÑâdŒ'c´79†s“1X› ÑØäe¸5r[_/MÆhhr w&c43£•É1™ŒÑÆdŒ&&c´09†“1Ø— ѼdŒÖ%Ç|j\2FÛ’1š–ÃeÉ KÆhW2æk{n¼*³ýöâ¦äNJÆhQ2Fƒ’1Ú“Ã9É­IÆhLr ·$c4%£%É I^Ä;’1š‘ŒÑŠdŒF$ÇpC2F’1ZÃÉìG†h>2ë‘C8£íÈMGŽárdŒ†#c´£ÙÈ1\ŒÑhdŒ6#Çp22‹‘!ŒŒÑ^äÎEÆh-2Fc‘1ÚŠéÈ-EÆ`(rw"cÖ#Z‰ŒÑHäe¼£‰È-DŽá@dŒö!c4£uÈ1‡ŒÑ6d ¦!‡p2FÃ1ûÏgzr W!c4 £MÈ1œ„ŒÁ"dˆ!c°9„s1ZƒŒÑdŒ¶ Çp 2FK1‚ÃÈÍ@Æh2F#c´¢ È-@þ5ËdÌ ûÿüe÷çr9x¡%ävpãÁA®ÿ¢-ä~pÂA./´$„ƒÜrDx¡¥"äŒp;ÂA /ä’pŒSÂAn /´Ä„ƒ\bN8Æ=á…– p‹ÂAN /´4…ƒrU8ÈYá…–®pÃÂA. 9-¼ÐÒr\8Èuá…–¼pûÂA Ǹ0ü‹¶Ä0ˆa#ÃA® ƒ˜±3 bh8È¥aRö†ƒ±6 bnÄÞpƒÃ ‡ALƒØrtÄê0ˆÙá w‡A ƒX1=äö0ˆñaëÃA΃Ø1@ R8Æ bÄ FˆZ*Ä fˆAüsnCÄA.ƒ˜"±Eä1èCyô{Žø.5̯ú=P<ÈAb‹Ä &‰Al}2J b•Ä,q»Ä …‰1,ƒ˜&r›Ä81ˆuâ ç‰A·ýÑZÅ Šƒœ(±Q b¤8È•b3Å vŠA /´”ŠALƒØ*1VäZ1ˆ¹bzÅ1ƒX,1Y b³8ÈÑb«Å f‹ƒÜ-1\ zìÖ’.r»Äx1ˆõâ ç‹Aìƒ0±`ä„ñÿ£ìÞÒ±’åŒÎHŸM·ùOÌR!#6ÍVJ/î—U Š®sö)ÿŽ 6ŒAŒƒX1bÆÃŽ1ˆ!ã —ŒALƒØ21f|¡¥f bÎÄžqƒÆ ALƒØ4rÔĪ1ˆYã wA ƒX61mä¶1ˆqcêÆ1΃Ø71p bá8ȉcǃØ4!j|SKίræÄÎ1ˆ¡ã —ŽALƒØ:1väÚ1ˆ¹c{ÇZ‚Ç ALƒØ<bôÃê1ˆÙã wA_û£µ”AL¹} büÄú1ˆùã oöA ƒX@rÄ2ˆd+ÈAÎ ƒØA1„Ä2沿Yn!cCr Ä2ˆ=ä ‘A,"ƒ˜D±‰|¡%Š bÄ,2ˆ]ä ‡‘A,#ƒ˜FrÄ82ˆudóÈAî#ƒHưÄD2†dÐm¡–Jr3É v’A %¹” b*¤V2†±ä ×’AÌ%ƒØK1˜äb2ˆÉd›ÉAŽ&ƒXM1› R7ù2K8¤r2†éä ·“AŒ'ƒXO1Ÿä~2ˆe ÊAL(cØP}þɺV”ƒœQ±£ bH9È%eÐ×þ8--ecÊA®)ƒ”Sư§ RP9ÆEe“Ê 6•ƒU±ª bVÄ®rÃÊ ••1L+_ÈmeÌe›–º2ˆyå ÷•A ,ƒXXrbÄÆ2ˆ‘e+ËAÎ,ƒÔYÆ0´ bi9È©e[Ë Æ–ƒ\[1· bo¤àrŒ‹Ë õ÷››ËAŽ.ƒX]ÝöÇié.9¼ byÄôrÛË Æ—A¬/ƒ”_¾ÌÒ_1À bÄsÌ F˜A¬09à R‡Ã3H%様Al1ƒcrÄ3ˆ=fƒÌA.2ƒ˜d±Éä(3HUf ³Ì v™ƒf±Ì bšÄ6sãÌ Ö™AÊ3Ç¸Ï ÚϰРb¢ùBK£ÄH3ˆ•æ gšAì4ƒj±ÔäT3ˆ­fbÍ1®5ƒ˜ký‹Ÿc]‚ÍA.6ƒ˜l±Ùäh3HÕf ³Í u›cn±Ü bºÄvsãÍ Ö›AÌ7¹ß bÀÄ‚3ˆ ç 6œ1Œ8ƒXqþA[ÆtQÇùüççD¶Žs;ÎZ:ÎAî8¹ãäŽóÚ:ÎAî8¹ãäŽó…–Žs;ÎAî8_hé8¹ãäŽs;ÎrÇ9Æç wœ/´tœƒÜqbÇ9Æç -ç wœƒÜq¾ÐÒqrÇ9Èç wœ/´tœƒÜqrÇ9Èç -ç wœƒÜq¾ÐÒqrÇ9ˆçwœÐÖq±ã bÇ9Èg;Π›~Ü8ˆç wœAê8cØqrÇÄŽ3ˆg;ÎAî8ƒØq±ã bÇ9Èg;Î vœƒÜq±ã bÇÄŽs;Î vœAì8¹ã bÇÄŽ3HçwœAì8ƒØq¾ÐÒq±ã ⟃ØqrÇÄŽ3ˆç wœA_úWÿp];ÎAî8ƒØq±ãäŽ3èkœ–Ž3ˆç wœAê8cØq©ããŽ3ˆg;ÎAî8ƒØq±ã bÇ9Èg:Îvœ/äŽ3沿MKÇÄŽs;Î vœAì8¹ã bÇÄŽ3ˆç wœAê8cØq±ãäŽ3ˆg;ÎAî8ƒØq±ã RÇ9ÆgÐúûÍç wœAì8ƒØq±ãäŽ3ˆg;ÎAî8ƒØq±ã RÇù2KÇÄŽ3ˆg;ÎAî8ƒØq±ãäŽ3Hg ;Î uœcÜq±ã bÇ9Èg;Î vœAì8¹ã bÇÄŽs;Î uœ1ì8ƒØqrÇÄŽ3ˆg;ÎAî8ƒØq©ããŽ3h?ÃŽ3蹿NKÇÄŽ3ˆç wœAì8ƒØq±ãäŽ3ˆg:Î1î8ƒØqý‹Ÿc]:ÎAî8ƒØq±ãäŽ3Hg ;Î uœcÜq±ã bÇÄŽs;Î vœAì8¹ã bÇÄŽ3ˆç vœ1ì8ƒØqþA[ÇtAÇùÏïÙÇÖq±ãäŽ3ˆg;Î vœ/´tœAì8ƒØq±ãäŽ3ˆg;ÎAî8ƒØq±ã bÇ9ˆg ;Î vœƒÜq±ã RÇÃŽs;Î vœAì8¹ã bÇÄŽ3ˆç wœAì8ƒØq±ãäŽ3ˆg;ÎAî8ƒØq©ãŒaÇùBKÇY¤Ž³Hg;Î"uœEê8‹Ôq±ã,BÇY£Ž3ˆg‘:Î"uœEê8ƒØq©ã,RÇY¤Ž3ˆg‘:Î"uœAì8‹Ôq©ã,RÇÄŽ³Hg‘:Î vœEê8‹Ôq¡ãŒaÇY¤Ž³Hç wœEê8‹ôçß"uœAì8‹Ôq©ã bÇYô…ÅSôŸ:Îþ*uœAì8‹Ôq©ã,zî–;Î"uœEê8ƒØq¡ã¬QÇY¤Ž3ˆg‘:Î"uœAì8‹.û£å޳Hg;Î"uœEê8ƒØq©ã,RÇY¤Žs;Î"uœEê8‹Ôq±ã,RÇY„Ž3†g‘:Î"uœEê8ƒØq©ã,RÇÄŽ³Hg‘:Î"uœAì8‹Ôq©ã bÇY¤Ž³Hg‘:Î vœEê8‹Ôq©ã RÇY£Ž³Hg;Î"uœEê8‹ÔqrÇY¤Ž³Hg;Î"uœEê8‹Ôq±ã,RÇY¤Ž3ˆg‘:Î"uœEê8ƒØq©ã,BÇÃŽ³Hg‘:Î"uœAì8‹Ôq©ã,zîo”;Î"Ío)Û R¶ù¿Eh•:Î"uœEê8ƒØq©ã,RÇ9Èg‘:Î"uœEê8ƒÔqÖ¨ã,RÇÄŽ³èk´Üq©ã bÇY¤Ž³Hg‘:Î vœEê8‹Ôq±ã,RÇY¤Ž³Hg;Î"uœEê8ƒÔqÖ\ö7‹g:Î vœEê8‹Ôq±ã,RÇY¤Ž³Hç wœEê8‹Ôq©ã bÇY¤Ž³Hg;Î"uœEê8‹Ôq±ã,BÇY£Ž3Hg:Î"uœEê8ƒØq©ã,RÇÄŽ³Hg:ÎuœAì8‹Ôq©ã,RÇÄŽ³Hg‘:Î vœEê8‹Ôq=×Êg:ÎuœAì8‹Ôq©ã,RÇÄŽ³Hg‘:Î uœ5ê8‹>þp]…:Î vœEê8‹Ôq±ã,úÚ'wœEê8ƒØq¡ã¬QÇY„Ž3†g‘:Î"uœAì8‹Ôq©ã,RÇÄŽ³g:ÎAì8k.ûÛ䎳Hg;Î"uœEê8ƒØq}ío“;Î"uœAì8‹ÐqÖ¨ã,RÇÄŽ³Hg‘:Î vœEê8‹Ôq¡ãŒaÇY´þ~cÇÄŽ³Hg‘:Î"uœAì8‹Ôq©ã bÇY¤Ž³Hg:Î1î8‹Ôq©ã,RÇÄŽ³Hg‘:Î vœEè8kÔq¡ãŒaÇY¤Ž³Hg;Î"uœEê8‹Ôq±ã,RÇY¤Ž3ˆg:ÎuœEê8ƒØq©ã,RÇY¤Ž3ˆg‘:Î"tœ1ì8‹ö3ê8‹ÔqrÇY¤Ž³Hg;Î"uœEê8‹Ôq±ã,RÇY„Ž3†g‘:΢ñs¬î8ƒØq©ã,RÇÄŽ³èk}Üq¡ãŒaÇY¤Ž³Hg‘:Î vœEê8‹Ôq±ã,RÇY¤Ž³Hg:ÎuœEê8_hé8‹.ê8ÿþ¿n?;ÎÛ? âïKƒÚq½¹t:N\:§.µãÔ¥vœŸ/ýè8…Úq~þ¸§.µãÄ¥ÓqâÒé8…ÚqŽS¨§P;N¡vœø´ãÄ¡ÓqêP;N\:§P;N|\;NjljC§ãÄ¥ÓqêR;N\:'.ŽS—Úq µãÄÇŽ—NÇ©Kí8u©'.Ž—NÇ)ÔŽètœBí8…ÒqÊ´ãüüøÑq~¾ô£ã$ÊŸ}õqí8u©'/¥ãä¥tœºÔŽS—ÒqòP:NjÇ©Kí8‰ÒqòãÒqêR;N]jÇÉKé8y)§Ð5'QþìK”ŽS¨'Q:N} ÚqòR:N¡vœD×õúÑqê oÇ©Kí8y)'/MÇ©Cí8u¨'/¥ãÄ¥Óq¥ãÄÇŽ“—ÒqêR;N]jÇI”ŽS¨'Ñ×ü+¢ëÇ7ê]Ç™_•ŽSß“vœúüvœ¼”Ž“—žû£u:N}\;N^zìÖé8u)'ÝöGëtœºÔŽS—ÚqÝ÷GëtœºÔŽ“—nû£u:N¡vœDßû£u:N¡vœD_û£u:N^züz´Þ\:'.Ž“è¾?Z§ãÔ¥vœºÔŽ“—ë£u:NjÇÉK·ýÑ:§.µãÔ¥vœD÷ýÑ:§.µã$ºíÖé8…Úq}¯°úÑqê[ÐŽS—ÚqòÒu£NÇ©Kí8‰¾÷7êtœ¼ôÜߨvœ:ÔŽ“‡ûu:N]jÇÉKé8y鹿Q§ãÄÇŽ“—ÒqêR;N]jÇItÛߨÓq µã$úÞߨÓqê[ÐŽS—ÚqòÒí×õöÒc£NÇ©kÇÉK÷õ:§]¿ö7êtœ¼ôØß¨ÓqêR;N¢ÛþFŽS—ÚqêR;N^zìoÔé8‰.ûu²Í7èMš_õÜ­Óqê{ÒŽ“—îû£u:N\:'/ÝöGëtœú¸tœ:ÔŽ“‡îû£u:N]jÇÉK×ýÑ:§P;N¢ïýÑ:§¾ðvœºÔŽ“èº?Z§ãjÇItÙ­Óqê[ÐŽS—ÚqêR;N^ºÿz´Þ]JÇ©Cí8‰në›u:NjÇ©Kí8y龿Y§ãÔ¥vœD×_oÖ[ôØß¬Óqâ ?'/ݽYo/=÷7ëtœD×ÏoÖAý‰:§¾ðvœ¼tÛŸ¨ÓqêR;N]JÇÉC÷ý…jÇ©kÇÉC·ý…:§.µãÔ¥vœ¼”ŽS—ÚqêR;N¢é8iûu:N}Ýí8yé¾?P§ãjÇItݨÓqêR;N]jÇÉK·ýjljC§ãÄ¡vœ4÷ý:§.µãä¥Ûþ@ŽS—ÚqêR;N^ºïT;NšËþ>MÇ©/º§Î´ã$úÞ§Óq µãÔþ÷Ÿ½×Çétœ¼ôاÓqêR:NºýzœÞzþµ=`§ã$ºîÓé8u©§.µãä¥Ûþ8ŽS—Úq}¯Óé8ÚqÒ\ö·étœøœŽS—Úq¥ã$ºïoÓé8õ…·ãä¥ëþ6ŽS—ÚqêR:NºíÓé8õií8u©'/=öÇétœºÔŽ“—nûãÔŽS¦'Ñúû­§P;Nýã·ãä¥Ûþ8ŽS¨'Ñ÷þ8ŽS—ÚqêR;N^ºî¯S;N:'Ž“—îû¿8§>®§.µãä¥Çþ:Ž“è²¾N§ã$z®¯Ó£'ÑuNÇ©Kí8u©'/Ýö×étœú¸vœºÔŽ“—îûët:N]JÇÉC×_¯ÓÛC¿¶FâGÇIô½¿N§ãä¥çþ:ŽS—¿–õí¥Çú:Ž“h?sÛ_§Óqâ‹>'.Ž“—ûët:N¢Ëþ:Ž“—žûët:N]jÇÉK÷õu:§µãä¥ñs¬§ãÔǵãÔ¥vœ¼tß_§ÓqêR:Nºî¯S;N™vœD¿hõ-ºí¯Óé8õ hÇ©Kí8y鱿N§ãÔǵãä¥Ûþ:ŽS—ÒqêP;Nº¯¯ÓŽóó¥çÛKÏ~6vÛãä=ÎZö8}qs÷8yóÚö8ys÷8yó…–=ÎAÞãä=ÎZö8ys÷8yó…¼Ç9Æ{œƒ¼ÇùBËç ïqâçïq¾Ð²Ç9È{œƒ¼ÇùBËç ïqòç ïq¾Ð²Ç9È{œƒ¼Ç9È{œ/´ìqòç ïq¾Ð²Ç9È{œƒ¸Ç9Æ{œжÇÄ=Î îqòg÷8ƒ¸ÇÄ=ÎAÞã Òg ÷8y3ˆ{œAÜã âç ïqq3ˆ{œAÜãtåg÷8ƒ¸Ç9È{œAÜã âg÷8y3ˆ{œAÜãä=Î îqq3H{œc¼ÇÄ=Î îq¾Ð²ÇÄ=Î þ÷qs÷8ƒ¸ÇÄ=ÎAÞã úúëÓU×»D3¿êó@çÄ=ÎAÞã âg÷8ƒ¸Ç9È{œAÜã âç ïqi3†{œAÜãä=Î îqqs÷8ƒ.û£µìqqs÷8ƒ¸ÇÄ=ÎAÞã úÚ­e3ˆ{œ/´ìqq3ˆ{œAÏýÑZö8ƒ¸Ç¤=Î1Þã âg÷8ƒ¸Ç9È{œAÜã âç ïqq3ˆ{œAÜãä=Î îqqs÷8ƒ¸ÇÄ=Î îqòg÷8ƒ¸ÇÄ=ÎAÜãŒág÷8y3ˆ{œAÜã âç -{œAÜã âç ïqq3è¶¿QËç ïqq3ˆ{œƒ¼ÇÄ=Î îqqs÷8ƒ¸Ç¤=Î1Þã âg÷8ƒ¸Ç9È{œAÜã âg÷8y3ˆ{œAÜã¤=΃8¿ÄùÍ ÎoÒüæ›"4¿Š{œAÜã|¡e3ˆ{œAÜã âç îqÆp3ˆ{œƒ¼Çôµ?ZËg÷8y3ˆ{œAÜã zîÖ²ÇÄ=Î îqòg÷8ƒ¸ÇÄ=ÎAÞã âg÷8q3沿YÞãŒáç ïqq3ˆ{œƒ¼ÇÄ=Î îqqó…–=Î îqq3ˆ{œƒ¼ÇÄ=Î îqòg÷8ƒ¸ÇÄ=ÎAÞã Òg ÷8q3†{œAÜã âç ïqq3ˆ{œƒ¼ÇÄ=Î íqÆps÷8ƒ¸ÇÄ=Î îqòg÷8ƒ¸Ç9È{œAÜã âgö8_fÙã Òg ÷8y3ˆ{œA·ýZö8y3ˆ{œAÜãÄ=Îîq}Iˆàç ïqq3ˆ{œƒ¼Çôµ?NËg÷8y3H{œ1Üã zbSfŒ÷8ƒ¸ÇÄ=ÎAÞã âg÷8ƒ¸Ç9È{œAÚãŒáç y3沿MËg÷8y3ˆ{œAÜãä=Î îqq3ˆ{œƒ¼Ç¤=Îîq=÷ÇiÙã âg÷8y3ˆ{œAÜã Òçïq­¿ß¼Ç9È{œAÜã âg÷8y3ˆ{œAÜãä=Î îqq3H{œ/³ìqq3ˆ{œAÜãä=Î îqqs÷8ƒ´ÇÃ=Î íqŽñg÷8ƒ¸Ç9È{œAÜã ºí¯Ó²Ç9È{œAÜã âç ïqi3†{œAÜãä=Î îqq3ˆ{œƒ¼ÇÄ=Î íqŽñgÐ~†{œAÜã|¡e3ˆ{œAÜãä=Î îqq3ˆ{œƒ¼ÇÄ=Î íqŽñg÷8ƒþÅϱ.{œƒ¼ÇÄ=Î îqògö8c¸Ç¤=Î1Þã âg÷8ƒžûë´ìqq3ˆ{œƒ¼ÇÄ=Î îqqs÷8c¸ÇÄ=Î?hÛã º`óõ#cKÇÄŽs;Î vœAì8ƒØq¾ÐÒq±ã bÇôTÇ9Èg;Î vœƒÜq±ã bÇÄŽs;ÎvœAì8¹ã bǤŽ3†ç wœAì8ƒØqrÇÄŽ3ˆg;ÎAî8ƒØq±ã bÇ9Èg;Î vœƒÜq±ã RÇÃŽó…–Ž³Hg‘:Î vœEê8‹Ôq©ã bÇY„޳Fg;Î"uœEê8‹Ôq±ã,RÇY¤Ž³Hg;Î"uœEê8ƒØq©ã,RÇY¤Ž3ˆg‘:Î"uœAì8‹Ôq©ã,BÇÃŽ³Hg‘:ÎAî8‹ÔqéÏ¿Eê8ƒØq©ã,RÇÄŽ³èëã¿âyÓqöW©ã,RÇÄŽ³Hg‘:Î"uœAì8‹Ôq©ã bÇY„޳Fg‘:Î vœEê8‹Ôq±ã,ºì–;Î"uœAì8‹Ôq©ã bÇY¤Ž³Hg‘:ÎAî8‹Ôq©ã,zî–;Î"uœEè8cØq©ã,RÇY¤Ž3ˆg‘:Î"uœAì8‹Ôq©ã,RÇÄŽ³Hg‘:Î vœE—ýrÇY¤Ž3ˆg‘:Î"uœEê8ƒÔqÖ¨ã,RÇÄŽ³Hg‘:Î"uœƒÜq©ã,RÇÄŽ³Hg‘:Î"uœAì8‹Ôq©ã bÇY¤Ž³Hg‘:Î vœEê8‹Ðqưã,RÇY¤Ž³Hg;Î"uœEê8‹Ôq±ã,RÇY¤Ž3ˆg‘:Î"uœEê8ƒÔq¤l³Ùæÿ¡ó«Üq©ã,RÇY¤Ž3Hg:Î"uœAì8‹¾öGËg‘:Î vœEê8‹Ôq=÷GËg‘:Î"uœAì8‹Ôq©ã,RÇÄŽ³Hg‘:Î uœ5—ýÍbÇY£Ž3ˆg‘:Î"uœAì8‹.û›å޳Hç wœEê8‹Ôq©ã bÇY¤Ž³Hg;Î"uœEê8‹Ôq±ã,BÇY£Ž3Hg:Î"uœEê8ƒØq©ã,RÇÄŽ³Hg:ÎuœAì8‹Ôq©ã,RÇÄŽ³Hg‘:Î vœEê8‹Ôq¡ã㎳g:Î vœEê8‹Ôq©ã bÇY¤Ž³Hg:ÎuœE¸®Bg;Î"uœEê8ƒØq}í“;Î"uœAì8‹ÐqÖ¨ã,BÇÃŽ³Hg‘:Î vœEê8‹Ôq©ã bÇY„޳Fç vœ5—ýmrÇY¤Ž3ˆg‘:Î"uœAì8‹Ôq©ã,RÇÄŽ³g:Î"uœAì8‹Ôq©ã bÇY¤Ž³Hg:ÎvœEëï7vœAì8‹Ôq©ã,RÇÄŽ³Hg‘:Î vœE”2Eê8‹ÐqŽqÇY¤Ž³Hg‘:Î vœEê8‹Ôq±ã,BÇY£Ž³g ;Î"uœEê8ƒØq©ã,RÇY¤Ž3ˆg‘:Î"uœAì8‹ÐqÖ¨ã,RÇÄŽ³Hg‘:Î"uœAì8‹Ôq¡ãŒaÇY´ŸQÇY¤Žs;Î"uœEê8ƒØq©ã,RÇY¤Ž3ˆg‘:Î"tœ1ì8‹Ôqý‹ŸcuÇÄŽ³Hg‘:Î vœEè8kÔq}ì8ÿþ¿Þþ~$þþù}ùûÿýûþ¿¿ÜtÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³HqgâÎQíÚ³Hµç -µgÑEµçŸŸêÝjÏA®=_h©=¹öäÚskÏ?h«=¹öäÚskÏZjÏA®=¹ö|¡¥öäÚskÏA®=_ȵçמƒ\{¾ÐR{rí9ˆµçמ/´Ôžƒ\{ríùBKí9èÂÚskÏA®=_h©=¹öäÚskÏZjÏA®=¹ö|¡¥öäÚskÏ1®=ÿ ­ö bíÄÚskÏ ÖžA¬=ƒX{rí¤Ú3†µç מA¬=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgkÏ ÖžA¬=¹ö bíÄÚskÏ ÖžA¬=ƒT{ŽqíÄÚ3ˆµç -µgkÏ þ)9ˆµç מA¬=ƒX{ríôõñ_½«=ó«X{±öäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgjÏÖžA¬=¹ö bíÄÚskÏ Ëþh-µgkÏA®=ƒX{±öäÚ3ˆµgkÏ Öž/´ÔžA¬=ƒX{±öäÚ3ˆµgjÏ1®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=¹ö ºìoÔR{±öäÚ3ˆµgkÏ ÖžƒX{ưö bí9ȵgkÏ ÖžA¬=_h©=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgkÏ ÖžA¬=¹ö bí¤ÚsŒkÏ ÖžA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{±ö ÒHç %î BÜùæ¯ãò«X{±öÄÚ3†µgkÏA®=ƒ¾öGk©=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgÐm´–ÚskÏ ÖžA¬=±öŒ¹ìo–kÏÖžƒ\{±ö bí9ȵgÐe³–Ú3ˆµç -µgkÏ ÖžA¬=¹ö bíÄÚskÏ ÖžA¬=ƒX{rí¤Ú3†µç Öž1¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{©öŒaí9ȵgkÏ ÖžA¬=¹ö bíÄÚskÏ ÖžA¬=ƒT{¾ÌR{©öŒaí9ȵgkÏ ÖžA¬=¹ö bíÄÚskÏÖžAŸ¸.‚µç מA¬=ƒX{ríôµ?NKíÄÚskÏ Õž1¬=ƒT{ŽqíÄÚ3ˆµç מA¬=ƒX{±öäÚ3Hµg kÏrísÙߦ¥ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏ Õž1¬=ƒX{ríÄÚ3ˆµç מA¬=ƒX{©öãÚ3hýýæÚskÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מA¬=ƒX{©ö|™¥ö bíÄÚ3ˆµç מA¬=ƒX{rí¤Ú3†µgjÏ1®=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgjÏÖžA¬=¹ö bíÄÚ3ˆµç מA¬=ƒT{Žqí´ŸaíÄÚó…–Ú3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Õžc\{±ö ú?ǺԞƒ\{}®=?e“ù•L@9 RÃ4Sž1®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö ºíOÖR{Ò”g ãÎ ÆÐw]>ÇoþÊûïgégìyû§Sü}ùeÚzÆü_âsRÏÏwNé‰; =q§çÇ;?2O˜Vž?ëGä‰;mC'Ä?{ûHÜi‰;­#uçþëzs'm$Î4”¹m¯Ð #q¦]$î4‹Ôûú (wÚDÊ\½BïÌc}…Nùùk>=¤îܽBïî<×WèÄ2×õ:)$LKH|Í !uç¶¾B'ƒÄV¸“Rgîë}š@â“Z@êÌm}sNÿˆ;Íq§õ£î$~͏ÓôQfÊG‘Çúäœî_r³Gݹ¯OΉaÚ<Ê\×'ç¸ÓàwÚ;êÎm}rZ;~>sbÇÏgÚ:ŠÜ×'甎¸ÓÐQwnë“s2GÜiåˆ;uç¾>9ME.ë‹3#¾Þö8Ò¼Qæ{}nNÜÓ¶_sÓFݹ®ÏÍ q§]#î$kÔ™Û¯çæÝ™ç_Ë‹tšF™ëúÜœ¢w4âN{Fݹ­ÏÍ©q§1£Ì÷öÜœ”ñ³iÉ(rY_›Ó1~þ'?#î´b”IÄ(s__›“0âknÁ¨;×õµ9ý"î4_ÄÔ‹:s[Ÿ›Ó.⣚.âNËEÝy¬ÏÍéq§Ù¢îÜÖç¦Ñ"H›E™í·W‹E˜‹øçn¯¨;·õ¹9µ"LcE™ïõ¹9©"î´TÄ†Šºs]ß›fŠŸÏœJñó™)êÎ}ýÃúIñY-q§¢î<Ö÷æä‰2—í½9q¢Ìs{oMe®ë{sÂDÜi—ˆ;Íuç¶¾7'JÄgµIÄ&‰ºs_ß›$âNzD¹þzoÞyüµü<ÿQæ{}oNЍ;Ïõ½9!"î<~ÿŒæ»;í½9¢Ìzä¶¾7'Aüüõžñó êÎc}oN~(sYß›êÎs}oNzˆ;-uç¾½7§;Ä™f‡ºóùç3?e€ó ë#tBD|íuç¾>B'8Äô†:s]¡Ö† e~ÿ„æ;s[¡S⟼¡!î´3ÔÇúÊŸÕÈPwnë#tCÜIaˆ3 uæ¾=B?òÂw~Ô…oîüï_êÞÿüUò²%Ä-ÉAÞ’ â–d·$ƒ¸%ùBË–d·$ƒ¸%Ä-ÉAÞ’ â–d·$yK2ˆ[’A7mIqKr·$c¸%Ä-ÉAÞ’ â–d¶$c¸%9È[’AÜ’ â–ä oIqK2ˆ[’AÜ’ä-É nIqK2ˆ[’ƒ¼%Ä-É nIò–d·$ƒ´%Ã-ÉZ¶$‹´%Y¤-É nIiK²H[’EÚ’ â–d¶$k´%Ä-É"mIiK²H[’AÜ’,Ò–d‘¶$‹ž˜å â–d‘¶$‹´%Ä-É"mIiK²H[’AÜ’,Ò–d‘¶$ƒ¸%Y¤-É"mIaK2†[’EÚ’,Ò–ä oIiK²Hÿý áÚSŸßÚ“è{´Ní©’ÖžºÔÚ“èº?Z§öjíItÙ­S{ê[ÐÚS—Z{êRkO^ºÿz´Þ]Jí©C­=‰në›ujOjí©K­=y龿Y§öÔ¥ÖžD×_oÖ[ôØß¬S{â ?µ'/ݽYo/=÷7ëÔžD×ýÍ:µ§PkO}á­=yé¶¿Y§öÔ¥Öžº”Ú“‡îû“ÕÚSÖÚ“‡nû“ujO]jí©K­=y)µ§.µöÔ¥ÖžDS{Ò<öêÔžúº[{òÒ} Ní)ÔÚ“èº?P§öÔ¥ÖžºÔÚ“—nûÕÚ‡Ní‰C­=iîûujO]jíÉK·ý:µ§.µöÔ¥Öž¼tߨ֞4—ý}šÚS_tkOiíIô½?N§öjí©/¼µ'/]÷ÇéÔžºÔÚS—R{òÐí×ãôöÐó¯í;µ'ÑuœNí©Kÿ³?N§öä¥Ûþ8ÚS—Z{}¯Ó©=Z{Ò\ö·éÔžøœÚS—Z{¥ö$ºïoÓ©=õ…·öä¥ëþ6ÚS—Z{êRjOºíÓ©=õi­=u©µ'/=öÇéÔžºÔÚ“—nûãÔÚS¦µ'Ñúû­µ§PkOýã·öä¥Ûþ8ÚS¨µ'Ñ÷þ8ÚS—Z{êRkO^ºî¯SkO:µ'Ú“—îû¿8µ§>®µ§.µöä¥Çþ:Ú“è²¾N§ö$z®¯Ó£µ'ÑuNí©K­=u©µ'/Ýö×éÔžú¸ÖžºÔÚ“—îûëtjO]JíÉC×_¯ÓÛC¿¶FâGíIô½¿N§öä¥çþ:ÚS—¿–õí¥Çú:Ú“h?sÛ_§S{â‹>µ'.Ú“—ûëtjO¢Ëþ:Úó/}h4û+Ÿû“uP}¡­=yé¾>Y§öÔ¡Öž¼ô/~¸õÔžú¸ÖžºÔÚ“—îû“ujO]JíÉC×ýÉjí)ÓÚ“è÷O²¾E·ýÉ:µ§¾­=u©µ'/=ö'ëÔžú¸Öž¼tÛŸ¬S{êRjOjíÉC÷õÉúQ{~¾ô£ö|séÍßåþÑ˶g·=yÛ3ˆÛžAÜö â¶ç -ÛžAÜö â¶g·=yÛ3ˆÛžAÜöämÏ n{qÛ3ˆÛžƒ¸íÃmÏ n{ò¶g·=ƒ´íÃmÏAÞö â¶g·=yÛ3ˆÛžAÜö â¶ç o{qÛ3ˆÛžAÜöämÏ n{qÛs·=ƒ¸ítÃe ·=_hÙö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{iÛ3ˆÛžEØö¬Ñ¶g·=‹´íY¤mÏ"m{qÛ³HÛžEÚö,Ò¶g·=‹´íY¤mÏ n{iÛ³HÛžEÚö â¶g‘¶=‹´íôжg‘¶=‹´íY„mÏn{iÛ³HÛžƒ¼íY¤mÏ"ý×iÛ3ˆÛžEÚö,Ò¶gÐÛöì¯úúëóX‘¶=‹´íÄmÏ"m{iÛ³HÛžAÜö,Ò¶g‘¶=ƒ¸íY„mÏm{iÛ3ˆÛžEÚö,Ò¶g·=‹.û£åmÏ"m{qÛ³HÛžEÚö â¶g‘¶=‹´íY¤mÏAÞö,Ò¶g‘¶=‹´íÄmÏ"m{aÛ3†ÛžEÚö,ºí–·=ƒ¸íY¤mÏ"m{qÛ³HÛžEÚö,Ò¶g·=‹´íY¤mÏ n{iÛ³HÛžEÚö â¶g‘¶=‹´íY¤mÏ m{ÖhÛ³HÛžAÜö,Ò¶g‘¶=‹´í9ÈÛžEÚö,Ò¶g·=‹´íY¤mÏ"m{qÛ³HÛžEÚö â¶g‘¶=‹´íY¤mÏ n{iÛ³Ûž1Üö,Ò¶g‘¶=‹´íÄmÏ"m{iÛ³HÛžAÜö,Ò¶g‘¶=ƒÚö,Ò¶g‘¶=‹´íÄmÏ"m{iÛs·=‹´íY¤mÏ"m{iÛ³FÛžEÚö Ò¶çA_ûå)Ï"MyiÊóÓß5.ÛžEÚö,Ò¶g·=‹´íY¤mÏ n{iÛ³HÛžEÚö â¶g‘¶=‹´í¤mÏšËþfqÛ³FÛžAÜö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{iÛs·=‹´íY¤mÏ"m{qÛ³HÛžEÚö â¶g‘¶=‹nû›åmÏ n{aÛ³FÛžAÚö¬Ñ¶g‘¶=‹´íÄmÏ"m{iÛ3ˆÛžEÚö,¶g¶=ƒ¸íY¤mÏ"m{iÛ3ˆÛžEÚö,Ò¶g·=‹´íY¤mÏ"l{Žñ¶g¶=k´íÄmÏ"m{iÛ³HÛžAÜö,Ò¶g‘¶=ƒ´íY£mÏ¢Û Úö â¶g‘¶=‹´íÄmÏ¢¯ýqò¶g‘¶=ƒ¸íY„mÏm{aÛ3†ÛžEÚö,Ò¶gÐCÛžEÚö,Ò¶g‘¶=ƒ¸íY„mÏm{â¶gÍe›¼íY¤mÏ n{iÛ³HÛžAÜö,Ò¶g‘¶=‹´íÄmÏ"l{ÖhÛ³HÛžAÜö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{aÛ3†ÛžEëï7n{qÛ³HÛžEÚö,Ò¶g·=‹´íY¤mÏ n{iÛ³HÛžEØöãmÏ"m{iÛ³HÛžAÜö,Ò¶g‘¶=ƒ¸íY„mÏm{aÛ3†ÛžEÚö,Ò¶g·=‹´íY¤mÏ"m{qÛ³HÛžEÚö â¶g¶=k´íY¤mÏ n{iÛ³HÛžEÚö â¶g‘¶=‹°íÃmÏ¢ýŒ¶=‹´í9ÈÛžEÚö,Ò¶g¶=?5šù•ü,Òàg‘?ƒ0øùiÛ³Ûž1Üö,Ò¶gÑ¿øáVo{qÛ³HÛžEÚö â¶g¶=k´íY„mÏn{iÛ³HÛžEÚö â¶g‘¶=‹´íôжg‘¶=‹´íY¤mÏ m{ÖhÛ³HÛž/´l{ýùÏ÷—Þü ìßÿËûk­=¹ö|¡¥öäÚskÏA®=ÿ ­öäÚskÏA®=_h©=¹öäÚó…–ÚskÏA®=¹ö|!מc\{ríùBKí9ȵç Öžc\{¾ÐR{rí9ȵç -µç מƒ\{ríùBKí9ȵç מƒ\{¾ÐR{rí9ȵç -µç מƒX{ŽqíùmµgkÏ Öžƒ\{±ö bíÄÚskÏ Õž1¬=¹ö bíÄÚ3ˆµç מA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bí¤ÚsŒkÏ ÖžA¬=_h©=ƒX{ñÄA¬=¹ö bíÄÚsЬ=ó«¾ôo†‚X{±öäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgjÏÖžA¬=¹ö bíÄÚskÏ Ëþh-µgkÏA®=ƒX{±öäÚ3ˆµgkÏ Öž/´ÔžA¬=ƒX{±öäÚ3ˆµgjÏ1®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3ˆµç מA¬=ƒX{±öÄÚ3†µgkÏA®=ƒX{±ö bíùBKíÄÚ3ˆµç מA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Õžc\{±ö bíÄÚskÏ ÖžA·ýZjÏA®=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{±ö bíùBKíÄÚ3ˆµgkÏA¬=cX{±öäÚ3èk£–Ú3ˆµç Õž1î BÜùéo-·ÚskÏ ÖžA¬=¹ö bíÄÚ3ˆµç מA¬=ƒX{bísÙß,מ1¬=¹ö bíÄÚskÏ ÖžA¬=ƒX{¾ÐR{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3ˆµç מAª=cX{bíÃÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgjÏÖžƒ\{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3HµçË,µgjÏÖžƒ\{±ö bíÄÚskÏ ÖžA¬=±öŒaíôù§í"X{ríÄÚ3ˆµç מA_ûã´ÔžA¬=¹ö RísÓ'©öãÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgjÏÖž/äÚ3沿MKíÄÚskÏ ÖžA¬=¹ö bíÄÚ3ˆµç מAª=cX{±öäÚ3ˆµgkÏA®=ƒX{±ö Rí9ƵgÐúû͵ç מA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{±ö Ríù2KíÄÚ3ˆµgkÏA®=ƒX{±öäÚ3Hµg kÏ Õžc\{±ö bí9ȵgkÏ ÖžA¬=¹ö bíÄÚskÏ Õž1¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{©öãÚ3h?sÛ_§¥ö|¡¥ö ú\{~j4ó+™€Bú±ö bíÄÚskÏ ÖžAª=Ǹö bíô/~¸u©=¹ö bíÄÚskÏ Õž1¬=ƒT{ŽqíÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ ÖžƒX{ưö bíùmµgÐå¿Ôžÿüdès«=ƒX{ríÄÚ3ˆµgkÏZjÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מA¬=ƒX{±öÄÚ3†µgkÏA®=ƒX{©öŒaí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מA¬=ƒT{ưö|¡¥ö,RíY¤Ú3ˆµg‘jÏ"ÕžEª=ƒX{¡ö¬QíÄÚ³Hµg‘jÏ"ÕžA¬=‹T{©ö,RíÄÚ³Hµg‘jÏ ÖžEª=‹T{©ö bíY¤Ú³HµgkÏ"ÕžEª=‹P{ưö,RíY¤ÚskÏ"ÕžEúq‘jÏ ÖžEª=‹T{ý·Ú³¿ê ÿf¨Hµg‘jÏ ÖžEª=‹nø—@Eª=ƒX{©ö,RíÄÚ³µgjÏ"ÕžA¬=‹T{©ö bíYtÙ-מEª=ƒX{©ö,RíÄÚ³Hµg‘jÏ"Õžƒ\{©ö,RíY¤Ú3ˆµg‘jÏ"Ôž1¬=‹T{©ö,RíÄÚ³Hµg‘jÏ ÖžEª=‹T{©ö bíY¤Ú³HµgkÏ"ÕžEª=‹T{±ö,RíY¤Ú³HµgjÏÕžEª=ƒX{©ö,RíY¤ÚskÏ"ÕžEª=ƒX{©ö,RíY¤Ú3ˆµg‘jÏ"ÕžA¬=‹T{©ö,RíÄÚ³HµgjÏÖžEª=‹T{©ö bíY¤Ú³è¶¿Q®=ƒX{©ö,RíÄÚ³Hµg‘jÏ"ÕžA¬=‹T{©öäÚ³Hµg‘jÏ"ÕžAª=kT{©ö bíYôµ¿Q®=‹T{±ö,RíY¤)Ï"ÅAŠ;?ýýçR{©ö bíY¤Ú³Hµg‘jÏ ÖžEª=‹T{©ö¬¹ìokÏÕžA¬=‹T{©ö zªö,RíY¤Ú³Hµç מEª=‹T{©ö bíY¤Ú³HµgkÏ"ÕžEª=‹T{±ö,BíY£Ú3HµgjÏ"ÕžEª=ƒX{©ö,RíÄÚ³HµgjÏÕžA¬=‹T{©ö,RíÄÚ³Hµg‘jÏ ÖžEª=‹T{¡öãÚ³µgjÏ ÖžEª=‹T{©ö bíY¤Ú³HµgjÏÕžEÚ®BµgkÏ"ÕžEª=ƒX{}í“kÏ"ÕžA¬=‹P{Ö¨ö,BíÃÚ³Hµg‘jÏ ÖžEª=‹T{©ö bíY„Ú³Fµç Öž5—ýmríY¤Ú3ˆµg‘jÏ"ÕžA¬=‹T{©ö,RíÄÚ³µgjÏ"ÕžA¬=‹T{©ö bíY¤Ú³HµgjÏÖžEëï7ÖžA¬=‹T{©ö,RíÄÚ³Hµg‘jÏ §jÏ"ÕžEª=‹P{ŽqíY¤Ú³Hµg‘jÏ ÖžEª=‹T{±ö,BíY£Ú³µg kÏ"ÕžEª=ƒX{©ö,RíY¤Ú3ˆµg‘jÏ"ÕžA¬=‹P{Ö¨ö,RíÄÚ³Hµg‘jÏ"ÕžA¬=‹T{¡öŒaíY´ŸQíYô¹öüÐhίtZ¤ÁÏ"ÕžA¬=‹T{©ö,RíÄÚ³HµgjÏÖžEª=‹þÅ·ºö bíY¤Ú³HµgkÏ"Ôž5ª=‹P{ưö,RíY¤Ú³HµgkÏ"ÕžEª=ƒX{©ö,RíY¤Ú3HµgjÏ"Õž/´ÔžE—ÿT{þývÜ~Öž·BÅß§µö úÿ¾ÈúçËxý=.ÚS—Z{êRkÏÏ—~ÔžB­=?ÜÚS—Z{âÒ©=qéÔžB­=Ní)ÔÚS¨µ§PkO| Z{âЩ=u¨µ'.ÚS¨µ'>®µ§µöÄ¡S{âÒ©=u©µ'.Ú—Ní©K­=…Z{âãNí‰K§öÔ¥ÖžºÔÚ—Ní‰K§öjí tjO¡ÖžB©=eZ{~þü¨=?_úQ{åOÈú¸ÖžºÔÚ“—R{òRjO]jí©K©=y(µ§µöÔ¥ÖžD©=ùq©=u©µ§.µöä¥Ôž¼”ÚS¨µ'Qþ„L”ÚS¨µ'QjO} Z{òRjO¡ÖžD×õúQ{ê oí©K­=y)µ'/Mí©C­=u¨µ'/¥öÄ¥S{¥öÄÇÚ“—R{êRkO]jíI”ÚS¨µçÿ¢wµg~Õ×ü›!ž¾®ÖÚSߓ֞ºÔÚ“—R{òÒs´Ní©kíÉKýÑ:µ§.¥öä¡ÛþhÚS—Z{êRkO¢ûþhÚS—Z{òÒm´Ní)ÔÚ“è{´Ní)ôÏÁ×ÿ‰jí©oAkO^züz´Þ\:µ'.Ú“è¾?Z§öÔ¥ÖžºÔÚ“—ë£ujOjíÉK·ýÑ:µ§.µöÔ¥ÖžD÷ýÑ:µ§.µö$ºíÖ©=…Z{}ïoÔ©=õ-hí©K­=y麿Q§öÔ¥ÖžDßûujO^zîoTkOjíÉCý:µ§.=S{òRjO^zîoÔ©=ñq§öä¥ÔžºÔÚS—Z{Ýö7êÔžB­=‰¾÷7êÔžú´öÔ¥Öž¼tûõF½½ôØß¨S{êãZ{òÒ}}£Ní©C­=y麿Q§öÔ¥ÖžºÔÚ“è¶¿Q§öÔ¥ÖžºÔÚ“—ûujO¢ËþFړ蹿Q§öÔ· µ'/Ý÷7êÔž¸tjO^ºíoÔ©=õq©=u¨µ'Ý÷7êÔžºÔÚ“—®ûujO¡ÖžDßûujO}á­=u©µ'Ñu£NÜù}ú›Ôµ§N·ö$ºíÖ©=u©µ§.µöä¥û¯GëÝ¥Ôž:ÔÚ“è¶¾Y§öÔ¡ÖžºÔÚ“—îû›ujO]z^ö7ëÔžDýÍ:µ'¾ðS{òÒý×›õöÒs³NíItÝ߬S{ µöÔÞÚ“—nû›ujO]jí©K©=yè¾?Y­=õa­=yè¶?Y§öÔ¥ÖžºÔÚ“—R{êRkO]jíI4µ'Íc±Ní©¯»µ'/Ý÷?UÚS¨µ'Ñu Ní©K­=uéyÙ¨S{òÒs} Ní‰C­=iîûujO]jíÉK·ý:µ§.µöÔ¥Öž¼tߨ֞4—ý}šÚS_tkOiíIô½?N§öjí©/¼µ'/]÷ÇéÔžºÔÚS—R{òÐí×ãôöÐó¯í;µ'ÑuœNí©K­=u©µ'/ÝöÇéÔžºÔÚ“è{}œNí Ôړ沿M§öÄ7àÔžºÔÚ“(µ'Ñ}›Ní©/¼µ'/]÷·éÔžºÔÚS—R{òÐmœNí©Okí©K­=yé±?N§öÔ¥Öž¼tÛ§Öž2­=‰Ößo­=…Z{꿵'/ÝöÇéÔžB­=‰¾÷ÇéÔžºÔÚS—ž©=y麿N­=qèÔž8tjO^ºïÿràÔžú¸ÖžºÔÚ“—ûëtjO¢Ëú:Ú“è¹¾NÖžD×ýu:µ§.µöÔ¥Öž¼tÛ_§S{êãZ{êRkO^ºï¯Ó©=u)µ']½No=þÚ‰µ'Ñ÷þ:Ú“—žûëtjO]züþYÖ·—ëëtjO¢ýÌíãëô)ä̯|îOÖ©=ñ5œÚ“—û“ujO¢ËþdÚ“—žû“ujO]jíÉK÷õÉ:µ§µöä¥ñí§öÔǵöÔ¥Öž¼tߟ¬S{êRjOºîOVkO™ÖžD¿’õ-ºíOÖ©=õ hí©K­=yé±?Y§öÔǵöä¥ÛþdÚS—R{êPkOº¯OÖÚóó¥µç›KoþŽòöOÓ²m{ò¶ç Ú—–mÏAÞöämÏ?hÛöämÏAÞöämÏZ¶=yÛs·=_hÙöämÏAÞöämÏò¶ço{ò¶ç -Ûžƒ¼í9ˆÛžc¼íùB˶ç o{ò¶ç -Ûžƒ¼í9ÈÛžƒ¼íùB˶ç o{ò¶ç o{¾Ð²í9ÈÛžƒ¼íùB˶ç o{â¶ço{þAÛ¶g·=ƒ¸í9ÈÛžAMÐqÛ3ˆÛžƒ¼í¤mÏn{ò¶g·=ƒ¸íÄmÏAÞö â¶g·=ƒ¸í9ÈÛžAÜö â¶ç o{qÛ3ˆÛžAÜöämÏ n{qÛs·=ƒ¸íÄmÏ m{Žñ¶g·=ƒ¸íùB˶g·=ƒø_ÄmÏAÞö â¶g·=ýÇmÏüª¯¿ðßÄmÏ n{ò¶g·=ƒ¸íÄmÏAÞö â¶g·=yÛ3HÛž1Üö â¶ç o{qÛ3ˆÛžƒ¼ítÙ­eÛ3ˆÛžƒ¼íÄmÏ n{jíIÄmÏ n{qÛó…–mÏ n{qÛ3ˆÛžƒ¼íÄmÏ m{Žñ¶g·=ƒ¸íÄmÏAÞö â¶g·=yÛ3ˆÛžAÜö â¶ç o{qÛ3ˆÛžƒ¼íÄmÏ n{qÛs·=ƒ¸íÄmÏ n{â¶g ·=ƒ¸í9ÈÛžAÜö â¶g·=_hÙö â¶g·=yÛ3貿Q˶g·=yÛ3ˆÛžAÜöämÏ n{qÛ3ˆÛžƒ¼íÄmÏ m{Žñ¶g·=ƒ¸íÄmÏAÞö â¶g·=ƒ¸í9ÈÛžAÜö â¶ç o{qÛ3ˆÛžAÜöämÏ n{qÛó…–mÏ n{qÛ3ˆÛžƒ¸íÃmÏ n{ò¶gÐ×þF-ÛžAÜöämÏ n{Ýö7jÙö¤mσ8åÄ)ÏAžò ”秿“ݶ=ƒ¸í9ÈÛžAÜö â¶ç n{Æ\ö7ËÛž1ÜöämÏ n{qÛsГ۞AÜö â¶g·=_hÙö â¶g·=ƒ¸í9ÈÛžAÜö â¶ç o{qÛ3ˆÛžAÜöämÏ m{ÆpÛs·=c¸íÄmÏ n{ò¶g·=ƒ¸í9ÈÛžAÜö Ò¶g ·=yÛ3ˆÛžAÜö â¶ç o{qÛ3ˆÛžƒ¼íÄmÏ n{iÛóe–mÏ m{ÆpÛs·=ƒ¸íÄmÏ n{ò¶g·=ƒ¸í9ˆÛž1Üö ú¼­ÁmÏAÞö â¶g·=yÛ3èkœ–mÏ n{ò¶g¶=c¸í¤mÏ1Þö â¶g·=yÛ3ˆÛžAÜö â¶ç o{iÛ3†Ûž/ämϘËþ6-ÛžAÜöämÏ n{qÛs·=ƒ¸íÄmÏ n{ò¶g¶=cnûã´l{ò¶g·=ƒ¸í9ÈÛžAÜö â¶g¶=ÇxÛ3hýýæmÏAÞö â¶g·=ƒ¸í9ÈÛžAÜö â¶ç o{qÛ3ˆÛžAÚö|™eÛ3ˆÛžAÜö â¶ç o{qÛ3ˆÛžƒ¼í¤mÏn{iÛsŒ·=ƒ¸íÄmÏAÞö ºì¯Ó²íÄmÏAÞö â¶g·=yÛ3HÛž1Üö â¶ç o{qÛ3ˆÛžAÜöämÏ n{iÛs ¶=?ešù•ûm~}ü,Z¶=ƒ¸íÄmÏAÞö â¶g·=ƒ¸í9ÈÛžAÜö Ò¶ço{qÛ3è_üpë²í9ÈÛžAÜö â¶ç o{iÛ3†ÛžAÚöãmÏ n{Ýö'kÙöämÏ n{qÛs·=ƒ¸íÄmÏ n{â¶g ·=ƒ¸íùmÛžA—ÿ°íùÏߢo±gŒZÏ1L=cTzÆ(ôŒQçù2ÎYƒz²ñdŒÚɤ“5('kNƨ›¬A6YƒjrÌ?ÿññï¤kÐLÖ ™¬A1ƒ`²½d rÉÕ’5_ë«ÃV²©dŒJÉ„’5·õÕa&£J²‘d É%’5($kÐCÖ ‡üð÷¡Î#kPGÖ ŽŒAYrY_!•‘%#cÔEÖ ‹¬A£(²Md ’È‘cDÖ ‡¬AYƒ2F1d ZȤ1*!kBÖ ƒ¬A£ ²æsY‚2 d È5èc”?Ö ~¬Aü£ö±écÍçò±ácŒºÇd5¨k=ƨy¬AòXƒâ1FÁc zÇäŽ5ŸkÇ!Œk>·Ž%HcT:Ö t¬AçXƒÌ1F•c "Ç4Ž1HKP8Ö|ú³ô1ÊkP7Ö nŒQÛXóµ>7,k6ƨk¬ùœ5– j¬ù5†¨i¬AÒXƒ¢1FAc zÆäŒ5¨c3Ö|nK2ŽQÉXrY_vŒ5ÈcT1Ö b¬Aㄱc Æô‹1Êk>׋%ˆkÐ.Æ(]¬A¹Xƒp1FÝb ²ÅT‹5Ÿ£Å5‹5Ûo/‹1 kÐ+Ö W¬A­£X±­b RÅ•Š5kÐ)Ö|·°R¬A¤XƒF±‰bŒ ÅŠ5èc”'Ö|®K'Ö|nC”&Ö L¬A˜£.±Yb ªÄD‰1jk$Ö HŒQXó¹G,AŽXƒ1F1b ZĤˆ5(c"Ö|îßçƒý…ŸÛĤ‰Ç¬GÐ Ö Añb úÃå‡5¨kÖ =ŒQzXƒò°æsx¢î°ÙaÍþC›ŒcÔÖ 9¬Aq£à°æsoX‚ܰæsm¢Ø°­a RÔ†1 kÐÖ 3ŒQeXƒÈ°a Æ% kоŒóšËª ÿþßT÷Ÿyᛙʢö…of*ƒN`ˆK§0Ô¥&†ºÔÆð󥑡P+ÃÏ÷#3Ô¥v†¸tBC\:¥¡PSC Ó 56jm(ÔÜß‚ö†8t‚CjqˆK'9jsˆkt¨C­qèd‡¸tºC]jxˆK§<Ä¥“êRÛC¡Æ‡ø¸SâÒÉu©ý¡.5@Ä¥S âÒI…Ú Q¨¢Ðí¯ýP;ÄÏß!âçK?JD¢û_ûǵEԥƈ¼tûkûÝû#GÔ¥öˆº” ‘‡R$êP“D]j“H”(‘—*Q—š%êR»D^J˜ÈK)…š&åϽDÏëìE­‰’'ê[Ð>‘—( µP$º®oÔFQ_x#E]j¥ÈKÉyéù×ú³¡¢µT䥤ЏtZE¢ÄŠø¸S+òRrE]j¯¨K ‰R, 5Yü_ô.Y̯úš½ÃÓ×õÑúQ-ê{ÒlQ—Ú-òRÂE^zîÖIõqmyé±?Z§^Ô¥ä‹ItÝ߬P µ ÔÞ„’—nû›u"J]jE©KÉ(yè¾?Y )õa-)yè¶?Y§¥Ô¥Æ”ºÔš’—’SêR{J]jPI4E%Íc±NS©¯»Q%/Ý÷ëd•Bí*‰®û‹uÊJ]jZ©Km+yé¶?P­+qèä•8Ô¾’æ¾?P§°Ô¥&–¼tÛ¨YêR+K]jfÉK÷ýjhIsÙß§I-õE·µÔ™Æ–DßûãtrK¡ö–úÂ\òÒuœNr©Km.u)Ñ%Ý~=No=ÿÚ°Ó]]÷Çé”—ºÔôR—Ú^òÒmœN}©KÍ/‰¾×Çé˜@-0i.ûÛtL|N„©K­0‰’aÝ÷·é„˜úÂ[bòÒu›N‹©K1u)5&ÝöÇéô˜ú´™ºÔ"“—ûãtšL]j”ÉK·ýqj–)Ó.“hýýÖ2S¨i¦þñÛfòÒmœN)Ô<“è{œN ©K-4u©‰&/]÷ש‘&J‡N¦ÉK÷ý_œPS×RS—šjòÒcN¬ItY_§“k=××éÑ`“躿N'ÙÔ¥6›ºÔh“—nûët²M}\»M]j¸ÉK÷ýu:é¦.¥Ýä¡ë¯×éí¡Ç_[#ñ#ß$úÞ_§pòÒsNÂù¿—>å™ù•¿ÀõíùÇúdŠ“h?sÛŸ¬râ‹>%'.”“—û“ubN¢Ëþdœ“—žû“u‚N]jÑÉK÷õÉ:M§5êä¥ñí'ëÔǵëÔ¥†¼tߟ¬“vêRÚNºîOVëN™æD¿’õ-ºíOÖ)<õ hâ©KmîÔž¸tjO]jí©K­=qéÔž¸tjO¡Öž@§öjí)”ÚS¦µççïÀÚóó¥µ'Ñý¯ýãZ{êRkO^JíÉK©=u©µ§.¥öä¡Ôž:ÔÚS—Z{¥öäÇ¥öÔ¥ÖžºÔÚ“—îó¯€x)µ§PkO¢üa˜(µ§PkO¢Ôžú´öä¥ÔžB­=‰®ëõ£öÔÞÚS—Z{òRjO^šÚS‡Z{êPkO^Jí‰K§ö$Jí‰;µ'/¥öÔ¥ÖžºÔÚ“(µçÿ¢7µg~UkOníIt]­µ§¾'­=u©µ'/¥öä¥çþhÚS×Ú“—û£ujO]JíÉC·ýÑ:µ§.µöÔ¥ÖžD÷ýÑ:µ§.µöä¥ÛþhÚS¨µ'Ñ÷þhÚS¨µ'Ñ×þhÚ“—¿­7—Ní‰K§ö$ºïÖ©=u©µ§.µöä¥ÇúhÚS‡Z{òÒm´Ní©K­=u©µ'Ñ}´Ní©K­=‰n­蹿Q§ö$úÞߨS{ê[ÐÚS—Z{òÒu£Ní©K­=‰¾÷7êÔž¼ôÜߨ֞:ÔÚ“‡ûujO]jíÉK©=y鹿Q§öÄÇÚ“—R{êÒÿý?ûujO¢ÛþFÚS¨µ'Ñ÷þFÚS߂֞ºÔÚ“—n¿Þ¨·—ûujO}\kO^º¯oÔ©=u¨µ'/]÷7êÔžºÔÚS—Z{Ýö7êÔžºÔÚS—Z{òÒc£NíItÙߨS{=÷7êÔžú´öä¥ûþFÚ—NíÉK·ý:µ§>.µ§µöä¡ûþFÚS—Z{òÒu£Ní)ÔÚ“è{£Ní©/¼µ§.µö$ºîoÔ©=…Z{]ö7êÔžú´öÔ¥ÖžºÔÚ“—î¿Þ¨w—R{êPãN¢ÛÇ'êÓß\ÿ¨=u¹µ§þ9Z{òÒ}³Ní©K­=‰®¿Þ¬·è±¿Y§öÄ~jO^ºÿz³Þ^zîoÖ©=‰®û›ujO¡ÖžúÂ[{òÒm³Ní©K­=u)µ'Ý÷'«µ§>¬µ'Ýö'ëÔžºÔÚS—Z{òRjO]jí©K­=‰¦ö¤yì/Ö©=õu·öä¥ûþbÚS¨µ'Ñu±Ní©K­=u©µ'/Ýö«µ'Ú‡Z{ÒÜ÷êÔžºÔÚ“—nûujO]jí©K­=yé¾?P­=i.ûû4µ§¾èÖž:ÓÚ“è{œNí)ÔÚS_xkO^ºîÓ©=u©µ§.¥öä¡Û¯Çéí¡ç_ÛvjO¢ëþ8ÚS—Z{êRkO^ºíÓ©=u©µ'Ñ÷ú8Ú¨µ'Íe›Ní‰oÀ©=u©µ'QjO¢ûþ6ÚS_xkO^ºîoÓ©=u©µ§.¥öä¡Ûþ8ÚSŸÖÚS—Z{òÒcœNí©K­=yé¶?N­=eZ{­¿ßZ{ µöÔ?~kO^ºíÓ©=…Z{}ïÓ©=u©µ§.µöä¥ëþ:µöÄ¡S{âЩ=yé¾ÿËS{êãZ{êRkO^zì¯Ó©=‰.ëëtjO¢çú:=Z{]÷×éÔžºÔÚS—Z{òÒmNí©kí©K­=y龿N§öÔ¥Ôž4šý•ßû“uP~ ÏýÉ:µ§.=~ÿ€ëÛKõÉ:µ'Ñ~æ¶?Y§öÄ}jO\:µ'/=ö'ëÔžD—ýÉ:µ'/=÷'ëÔžºÔÚ“—îë“ujOjíÉKÿâ‡[Oí©kí©K­=yé¾?Y§öÔ¥ÔžSßjÏßfCƒZ{þ6@:èÔž¸tjO]jí©K­=ß_úV{ µö|ÿqßjO]jí‰K§öÄ¥S{ µö:µ§PkO¡ÖžB­=ñ#hí‰C§öÔ¡Öž¸tjO¡Öžø¸Öž:ÔÚ‡Ní‰K§öÔ¥Öž¸tjO\:µ§.µöjí‰;µ'.ÚS—Z{êRkO\:µ'.ÚS¨µ'Щ=…nÿýV7”ÚS¦µçûŸÀ·Úóý¥oµ'ÑóÏþq­=ué?©=y)µ'/¥öÔ¥Öžº”Ú“‡R{êPkO]jíI”Ú“—ÚS—Z{êRkO^JíÉK©=…Z{å/ÃD©=…Z{¥öÔ µ'/¥öjíIt_ߨoµ§¾ñÖžºÔÚ“—R{òÒÔž:ÔÚS‡Z{òRjO\:µ'QjO|Ü©=y)µ§.µöÔ¥ÖžD©=ÿýV{ÎWµöÔéÖžD÷õÑúV{êgÒÚS—Z{òRjO^úÚ­S{êãZ{òÒk´Ní©K©=yè±?Z§öÔ¥ÖžºÔÚ“è¹?Z§öÔ¥Öž¼ôØ­S{ µö$úÜ­S{ µö$úØ­S{òÒëÇ£õË¥S{âÒ©=‰žû£ujO]jí©K­=yéµ>Z§öÔ¡Öž¼ôØ­S{êRkO]jíIôÜ­S{êRkO¢ÇÛGëúÚߨS{}îoÔ©=õ#hí©K­=y龿Q§öÔ¥ÖžDŸûujO^úÚߨ֞:ÔÚ“‡^ûujO]jíÉK©=yék£Ní‰;µ'/¥öÔ¥ÖžºôŸÛþFÚ“èk£NíIô¹¿Q§öÔ µ§.µöä¥Ç7ê×K¯ý:µ§>®µ'/=×7êÔž:ÔÚ“—îûujO]jí©K­=‰ûujO]jí©K­=y鵿Q§ö$ºíoÔ©=‰¾ö7êÔžú´öä¥çþFÚ—NíÉKý:µ§>.µ§µöä¡çþFÚS—Z{òÒ}£Ní)ÔÚ“ès£Ní©o¼µ§.µö$ºïoÔ©=…Z{Ýö7êÔžú´öÔ¥ÖžºÔÚ“—ž?Þ¨ß.¥öÔ¡ÖžDõ‰:µ§µöԥƿ\z÷/ʿ՞:ÝÚSßdkO¢û7ëWôÚ߬S{â?µ'/=¼Y¿^úÚ߬S{Ý÷7ëÔžB­=õ·öä¥ÇþfÚS—Z{êRjOzîOVkO}XkOzìOÖ©=u©µ§.µöä¥ÔžºÔÚS—Z{MíIóÚ_¬S{êûníÉKÏýÅ:µ§PkO¢ûþbÚS—Z{êRkO^zì/VkO:µ'µö¤yî/Ö©=ué?·ý/U§öä¥ÔžºÔÚS—Z{òÒs Z{ÒÜö÷ijO}Ó­=u¦µ'Ñçþ8ÚS¨µ§¾ñÖž¼tß§S{êRkO]JíÉCÓ¯‡¾þlØ©=‰îûãtjO]jí©K­=yé±?N§öÔ¥ÖžDŸëãtjO Öž4·ým:µ'~§öÔ¥ÖžD©=‰žûÛtjO}ã­=y龿M§öÔ¥Öžº”Ú“‡ûãtjO}ZkO]jíÉK©=u©µ§.µöä¥Çþ8µö”iíI´þykí)ÔÚSÿó[{òÒcœNí)ÔÚ“èsœNí©K­=u©µ'/Ý÷שµ'Ú‡NíÉKÏýœÚS×ÚS—Z{òÒkNíIt[_§S{}­¯Ó«µ'Ñ}Ní©K­=u©µ'/=ö×éÔžú¸ÖžºÔÚ“—žûëtjO]Jíù¿‡Þ5šùÂû'ë×ë¯?[8ñ­ö$úÜŸ¬S{òÒ×þdÚS—^?Áõ×K¯õÉ:µ'Ñ~æ±?Y§öÄ7}jO\:µ'/½ö'ëÔžD·ýÉ:µ'/}íOÖ©=u©µ'/=×'ëÔž:ÔÚ“—þÁ/·žÚS×ÚS—Z{òÒs²Ní©K©=yè¾?Y­=eZ{ýüMÖ_Ñc²Ní©@kO]jíÉK¯ýÉ:µ§>®µ'/=ö'ëÔžº”ÚS‡Z{òÐs}¾Õžï/}«=¹ô¿ÿë㿠ܶíôÔ¶ç o{qÛ3ˆÛžAÜö¼Ð²íÄmÏ n{qÛs·=ƒ¸íÄmÏAÞö â¶g·=ƒ¸í9ˆÛž1Üö â¶ç o{qÛ3HÛž1ÜöämÏ n{qÛs·=ƒ¸íÄmÏ n{ò¶g·=ƒ¸íÄmÏAÞö â¶g·=yÛ3¨µ§¶=c¸íy¡eÛ³HÛžEÚö â¶g‘¶=‹´íY¤mÏ n{aÛ³FÛžAÜö,Ò¶g‘¶=‹´íÄmÏ"m{iÛ³HÛžAÜö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{iÛ3ˆÛžEÚö,Ò¶g·=‹´íY¤mÏ"l{ÆpÛ³HÛžEÚöämÏ"m{é?T¤mÏ n{iÛ³èùo¶=óUÜö,úøóþ?ùU¤mÏ"m{qÛ³HÛžEÚö,Ò¶g·=‹´íY¤mÏ n{aÛ³FÛžEÚö â¶g‘¶=‹´íÄmÏ¢ÛþhyÛ³HÛžAÜö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{iÛs·=‹´íY¤mÏ"m{qÛ³HÛžEØöŒá¶g‘¶=‹´íY¤mÏ n{iÛ³HÛžAÜö,Ò¶g‘¶=‹´íÄmÏ"m{iÛ3ˆÛžEÚö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{iÛ3HÛž5Úö,Ò¶g·=‹nøÏRiÛ³HÛžƒ¼íY¤mÏ"m{qÛ³HÛžEÚö,Ò¶g·=‹´íY¤mÏ n{iÛ³HÛžEÚö â¶g‘¶=‹žëåmÏ"m{iÛ³HÛžAÜö,Ò¶g‘¶=‹´íÄmÏ"m{iÛ3ˆÛžEÚö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{ò¶g‘¶=‹´íY¤mÏ m{Öh۳蹿Qÿý×7ÊÛžEÚö,Ò¶g·=‹´íY¤mÏ"m{qÛ³HÛžEÚö â¶g‘¶=‹´íY¤mÏ n{iÛ³HÛžAÚö¬¹íO·=k´í¤mσ4åY¤)Ï My¾ûWî˶g‘¶=‹´í9ÈÛžEÚö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{q۳趿YÞö,Ò¶g·=‹°íY£mÏ m{ÖhÛ³HÛžEÚö â¶g‘¶=‹´íÄmÏ"m{aÛ³FÛžAÜö,Ò¶g‘¶=‹´íÄmÏ"m{iÛ3ˆÛžEÚö,Ò¶g¶=ÇxÛ³Ûž5Úö â¶g‘¶=‹´íY¤mÏ n{iÛ³HÛžAÚö¬Ñ¶gÑÛm… m{qÛ³HÛžEÏýqò¶gÑÇþ8yÛ³HÛžAÜö,¶g¶=‹°íÃmÏ"m{iÛ3ˆÛžEÚö,Ò¶g‘¶=ƒ¸íY„mÏm{â¶gÍm›¼íY¤mÏ n{iÛ³HÛžAÚö,Ò¶g‘¶=‹´íÄmÏ"l{ÖhÛ³HÛžAÜö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{aÛ3†ÛžEëŸ7n{qÛ³HÛžEÚö,Ò¶g·=‹´íY¤mÏ n{iÛ³HÛžEØöãmÏ"m{iÛ³HÛžAÜö,Ò¶g‘¶=ƒ¸íY„mÏm{aÛ3†ÛžEÚö,Ò¶g·=‹´íY¤mÏ"m{qÛ³HÛžEÚö ¶盒³_‰ÁÏ ~½ü<ˆÛžEÚö,zîO–·=ƒ¸íY¤mÏ"l{ÆpÛ³h?£mÏ"m{ò¶g‘¶=‹´íÄmÏ"m{iÛ³HÛžAÜö,Ò¶g¶=c¸íY¤mÏ¢ðË­Þö â¶g‘¶=‹´íÄmÏ"l{ÖhÛ³Ûž1Üö,Ò¶g‘¶=‹´íÄmÏ"m{iÛ3ˆÛžEÚö,Ò¶g‘¶=ƒ´íY£mÏ"m{^hÙö,ºý›mÏÿþß]÷µöäÚóBKí9ȵç מƒ\{þE[í9ȵç מƒ\{^h©=¹öäÚóB®=¹öäÚskÏ ¹öãÚskÏ -µç מƒX{Žqíy¡¥öäÚskÏ -µç מƒ\{ríy¡¥öäÚskÏA®=/´Ôžƒ\{ríy¡¥öäÚskÏ1®=ÿ¢­ö bíÄÚskÏ ÖžA¬=ƒX{rí¤Ú3†µç מA¬=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgkÏ ÖžA¬=¹ö bíÄÚskÏ ÖžA¬=ƒT{ŽqíÄÚ3ˆµç…–Ú3ˆµgÿBÄÚskÏ ÖžAÿ®öœ¯ú`íô¡ÄÚ3ˆµç מA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒT{ưö bí9ȵgkÏ Öžƒ\{ÝöGk©=ƒX{ríÄÚ3ˆµç מA¬=ƒX{±ö¼ÐR{±ö bíÄÚskÏ ÖžAª=Ǹö bíÄÚ3ˆµç מA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{±ö bíÄÚskÏÖžA¬=¹ö bíÄÚ3ˆµç…–Ú3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏ ÖžAª=Ǹö bíÄÚ3ˆµç מA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ ÖžZjÏ ÖžA¬=ƒX{bíÃÚ3ˆµç ÖžAûµÔžA¬=¹ö bíÄÚ3ˆµç מA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{±öÄÚ3æ¶?Q®=cX{ríÄÚ3ˆµç Õž1î BÜùî_Þoµç…–Ú3ˆµgkÏ Öžƒ\{±ö bí9ȵgkÏ ÖžA¬=¹ö RíÃÚskÏÖžA¬=ƒX{ríÄÚ3ˆµç מA¬=ƒT{ưöäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgÐm±–Ú3Hµçe–Ú3Hµg kÏA®=ƒX{±ö bí9ȵgkÏ ÖžƒX{ưö zÿÛv¬=¹ö bíÄÚskÏ ýqZjÏ Öžƒ\{©öŒaí¤ÚsŒkÏ ÖžA¬=¹ö bíÄÚ3ˆµç מAª=cX{^ȵgÌm›–Ú3ˆµç מA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒT{ưö bí9ȵgkÏ Öžƒ\{±ö bí¤ÚsŒkÏ õÏ›kÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bí¤Úó2KíÄÚ3ˆµgkÏA®=ƒX{±öäÚ3è¶¾NKí¤ÚsŒkÏ ÖžA¬=¹ö bíÄÚ3ˆµç מA¬=ƒÞמïBÎùJ$ ßjÏÖžA¬=¹ö bíÄÚ3ˆµç מA¬=ƒT{Žqí´ŸaíÄÚóBKíÄÚ3ˆµç מA¬=ƒX{±öäÚ3ˆµgjÏ1®=ƒX{ýƒ_n]jÏA®=ƒX{±öäÚ3Hµg kÏ Õžc\{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3ˆµç Öž1¬=ƒX{þE[ítûWµçß›µÕžƒ\{^h©=¹öäÚskÏ¿h«=¹öäÚskÏ -µç מƒ\{^h©=¹öäÚskÏ ¹öãÚskÏ -µç מƒX{Žqíy¡¥öäÚskÏ -µç מƒ\{ríy¡¥öäÚskÏA®=/´Ôžƒ\{ríy¡¥öäÚskÏ1®=ÿ¢­ö bíÄÚskÏ ÖžA¬=ƒX{rí¤Ú3†µç מA¬=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgÐMáLkÏ Öžƒ\{±ö bí9ȵgkÏ ÖžAª=Ǹö bíÄÚóBKíÄÚ3ˆ!bí9ȵgkÏ W{ÎW¹ö úÐ? bíÄÚskÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מAª=cX{±öäÚ3ˆµgkÏA®=ƒnû£µÔžA¬=¹ö bíÄÚskÏ ÖžA¬=ƒX{^h©=ƒX{±ö bí9ȵgkÏ Õžc\{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3ˆµç מA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{±ö bí9ˆµg kÏ Öžƒ\{±ö bíÄÚóBKíÄÚ3ˆµç מA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Õžc\{±ö bíÄÚskÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מA¬=ƒX{±öäÚ3ˆµgkÏ -µgkÏ ÖžA¬=±öŒaíÄÚskÏ ýZjÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3ˆµç מA¬=ƒX{bísÛŸ(מ1¬=¹ö bíôÜŸ¨¥ö bíÄ)Ï ÆbÜùî×¶Ú3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{©öŒaí9ˆµg kÏ ÖžA¬=¹ö bíÄÚskÏ ÖžAª=cX{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3è¶¿XKí¤Úó2Kí¤Ú3†µç מA¬=ƒX{±öäÚ3ˆµgkÏA¬=cX{½ÿm»Öžƒ\{±ö bí9ȵgÐÇþ8-µgkÏA®=ƒT{ưö Rí9ƵgkÏ Öžƒ\{±ö bíÄÚskÏ Õž1¬=/äÚ3æ¶¿MKíÄÚskÏ ÖžAÏýmZjÏ ÖžA¬=ƒX{rí¤Ú3†µgkÏA®=ƒX{±öäÚ3ˆµgkÏ Õžc\{­Þ\{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ Õž—YjÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מAª=cX{©öãÚ3ˆµgkÏA®=ƒX{±ö bí9µç»F3_É4ˆƒŸƒ\{©öŒaíÄÚskÏ ÖžA¬=ƒX{ríÄÚ3HµçמAûÖžA¬=/´ÔžA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{©öãÚ3ˆµgÐ?øåÖ¥öäÚ3ˆµgÐs²–Ú3Hµg kÏ Õžc\{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3ˆµç Öž1¬=ƒX{þE[ítû7µçÿýöçc«=ƒX{ríÄÚ3ˆµgkÏ -µgkÏ ÖžA¬=¹ö bíÄÚskÏ ÖžA¬=ƒX{bíÃÚ3ˆµç מA¬=ƒT{ưöäÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ ÖžA¬=¹ö bíÄÚskÏ ÖžAª=cX{^h©=‹T{©ö bíY¤Ú³Hµg‘jÏ ÖžE¨=kT{±ö,RíY¤Ú³HµgkÏ"ÕžEª=‹T{±ö,RíY¤Ú3ˆµg‘jÏ"ÕžEª=ƒX{©ö,RíÄÚ³Hµg‘jÏ"Ôž1¬=‹T{©öäÚ³Hµg‘þB\¤Ú3ˆµg‘jÏ¢U{æ«X{}à©ö,RíÄÚ³Hµg‘jÏ"ÕžA¬=‹T{©ö bíY„Ú³Fµg‘jÏ ÖžEª=‹T{±ö,ºí–kÏ"ÕžA¬=‹T{=÷G˵g‘jÏ"ÕžEª=¹ö,RíY¤Ú³HµgkÏ"ÕžE¨=cX{©ö,RíY¤Ú3ˆµg‘jÏ"ÕžA¬=‹T{©ö,RíÄÚ³Hµg‘jÏ ÖžEª=‹T{©ö bíY¤Ú³Hµg‘jÏ Õž5ª=‹T{±ö,RíY¤Ú³Hµç מEª=‹T{±ö,RíY¤Ú³HµgkÏ"ÕžEª=ƒnª=‹T{©ö,RíÄÚ³HµgjÏÖžEª=‹T{©ö bíY¤Ú³Hµg‘jÏ ÖžEª=‹T{±ö,RíY¤Ú³HµgkÏ"ÕžEª=¹ö,RíY¤Ú³HµgjÏÕžEª=ƒX{}ìo”kÏ"ÕžA¬=‹T{©ö,RíÄÚ³Hµg‘jÏ ÖžEª=‹T{©ö bíY¤Ú³HµgjÏšÛþD±ö¬QíÄÚ³HµgÑs¢\{©ö,RíY¤Ús§<‹w!î|÷ KíÄÚ³Hµg‘jÏ ÖžEª=‹T{©ö bíY„Ú³FµgjÏÕžEª=‹T{±ö,RíY¤Ú3ˆµg‘jÏ"Ôž5ª=ƒX{©ö,RíY¤Ú3ˆµg‘jÏ"ÕžA¬=‹T{©ö,Bí9ƵgjÏÕžA¬=‹T{©ö,RíÄÚ³Hµg‘jÏ jÏÕžEoÛ®BµgkÏ"ÕžEª=ƒX{}ì“kÏ"ÕžA¬=‹P{Ö¨ö,BíÃÚ³Hµg‘jÏ ÖžEª=‹T{©ö bíY„Ú³Fµç Öž5·ýmríY¤Ú3ˆµg‘jÏ"ÕžA¬=‹T{©ö,RíÄÚ³µgjÏ"ÕžA¬=‹T{©ö bíY¤Ú³HµgjÏÖžEëŸ7ÖžA¬=‹T{©ö,RíÄÚ³Hµg‘jÏ ÖžEª=‹T{¡öãÚ³Hµg‘jÏ"ÕžA¬=‹T{©ö bíY„Ú³FµgjÏÖžEª=‹T{±ö,RíY¤Ú³è}íù&äÌWrð³Hµg‘jÏ ÖžE¨=kT{©ö bíY¤Ú³Hµg‘jÏ ÖžEª=‹P{ưö,ÚϨö,Rí9ȵg‘jÏ"ÕžA¬=‹T{©ö,RíÄÚ³HµgjϘ›jÏ"ÕžEÿà—[]{±ö,RíY¤Ú3ˆµgjÏÕžE¨=cX{©ö,RíY¤Ú3ˆµg‘jÏ"ÕžA¬=‹T{©ö,Rí¤Ú³Fµg‘jÏ -µgÑí_ÕžŸÿ H¾Õžÿ†Š?Ojíôÿ|“:µ'.ÚS—Z{êRkÏ÷—¾ÕžB­=ßÜ·ÚS—Z{âÒ©=qéÔžB­=Ní)ÔÚS¨µ§PkOüZ{âЩ=u¨µ'.ÚS¨µ'>®µ§µöÄ¡S{âÒ©=u©µ'.Ú—Ní©K­=…Z{âãNí‰K§öÔ¥ÖžºÔÚ—Ní‰K§öjí tjO¡ÖžB©=eZ{¾ÿ |«=ß_úV{åoÈú¸ÖžºÔÚ“—R{òRjO]jí©K©=y(µ§ÝR{êRkO¢Ôžü¸ÔžºÔÚS—Z{òRjO^Jí)ÔÚ“(&Jí)ÔÚ“(µ§~­=y)µ§PkO¢ûúF}«=õ·öÔ¥Öž¼”Ú“—¦öÔ¡Öž:ÔÚ“—R{âÒ©=‰R{âãNíÉK©=u©µ§.µö$Jíù¿è·Ús¾ªµ§N·ö$º¯Ö·ÚS?“ÖžºÔÚ“—R{òÒ×þhÚS×Ú“—^û£ujO]JíÉCýÑ:µ§.µöÔ¥ÖžDÏýÑ:µ§.µöä¥ÇþhÚS¨µ'ÑçþhÚS¨µ'ÑÇþhÚ“—^?­_.Ú—NíIôÜ­S{êRkO]jíÉK¯õÑ:µ§µöä¥ÇþhÚS—Z{êRkO¢çþhÚS—Z{=Þ>ZßÐ×þFÚ“ès£Ní©AkO]jíÉK÷ý:µ§.µö$úÜߨS{òÒ×þFµöÔ¡Öž<ôÚߨS{êRkO^JíÉK_ûujO|Ü©=y)µ§.µöÔ¥ÖžDý:µ§PkO¢Ïý:µ§~·ÿo£NíÉKoÔ¯—^ûujO}\kO^z®oÔ©=u¨µ'/Ý÷7êÔžºÔÚS—Z{=ö7êÔžºÔÚS—Z{òÒk£NíItÛߨS{}íoÔ©=õ#híÉKÏý:µ'.Ú“—ûujO}\jOjíÉCÏý:µ§.µöä¥ûþFÚS¨µ'ÑçþFÚSßxkO]jíItßߨS{ µö$ºíoÔ©=õ#hí©K­=u©µ'/=¼Q¿]Jí©C­=‰ëujOjí©K­=yé¹?Q§öÔ¥ÖžD÷OÔ¯èµ?Q§öÄ7~jO^zþx¢~½ôµ?Q'îü½ûÕ„oµ'O¿ö7ëÔžú_ÒÚ“—û›ujO]jí©K©=yè¹?Y­=õa­=yè±?Y§öÔ¥ÖžºÔÚ“—R{êRkO]jíI4µ'Ík±Ní©ï»µ'/=÷ëÔžB­=‰îû‹ujO]jí©K­=y鱿X­=qèÔž8Ôړ湿X§öÔ¥Öž¼ôØ_¬S{êRkO]jíÉKÏýÅjíIsÛ¬©=õM·öÔ™ÖžDŸûãtjO¡ÖžúÆ[{òÒ}œNí©K­=u)µ'=~÷ÇéÔžºÔÚS—Z{òÒ}Z{âЩ=qèÔž¼ôÜÿiÁ©=õq­=u©µ'/½ö×éÔžD·õu:µ'Ñ×ú:½Z{Ý÷×éÔžºÔÚS—Z{þï¥wf¾ò±?Y'Õ÷ÐÚS—Z{òÒs²Ní©K©=yèþãÉúõÐëÏN|«=‰>÷'ëÔž¼ôµ?Y§öÔ¥×Ï_pýõÒk}²NíI´ŸyìOÖ©=ñMŸÚ—NíÉK¯ýÉ:µ'Ñm²NíÉK_û“ujO]jíÉKÏõÉ:µ§µöä¥ðË­§öÔǵöÔ¥Öž¼ôÜŸ¬S{êRjOºïOVkO™ÖžD?“õWôØŸ¬S{êÐÚS—Z{òÒkNí©kíÉKýu:µ§.¥öÔ¡Öž<ô\_§oµçûKßjÏ_.ýò¯Tþï¡^§=/ãeÏ¿fö¼Œw=/ãYÏËxÕó¿fõ¼Ì'7=/ãIÏËxÑó¯Y=/ã=ÏËxÎó¯YÖæe89„ë˜c8ŽyocŽùX_es ‡1/ã]Ì1Ÿë«³¬bŽá(æe¼‰9†“˜c¸ˆybŽáæÎaŽáæe<†9†[˜c8…y.a¹­Žw0‡pó2^ÁÃÌ1ÜÀ¼Œ'0Çps 0Çpÿò¯Yæ/Çpýr Æ/k8uy/]ŽÁÐå›»¿ _^Æ»—c8{9†«—c8zyo^ŽÑäå.^^†ƒ—C¸w9†s—c¸vy]ŽáÖåN]^ÆK—c8t9F;—C8sy¯\ŽáÈån\ŽáÄåe¼p9†—c¸oyÏ[ŽáºåŽ[ŽÑ¶å_²L[ŽÑ²å[^Æ»–c8k9†«–c8jyoZŽá¤å.Z^æ¦AË!ܳó~N`×,/ã1Ë1ܲÃ)ËËxÉrÌÇúÜ,;–c8cy¯XŽùÜž›eÃrŒ&,/âË1°ÃýÊËx¾r ×+Çp¼r ·+/ãéÊ1Z®Âáʿƻ•Cnëk³¬VŽáhåe¼Y9†“•c¸XyVŽá^åÎUŽáZåe9„ã“c¸=yOOŽáòäOŽáîäe<;9†«“c4:yoNŽYpqr 'ÿšeor ç&Çpmò2›íÉ1œšÃ¥ÉËxhr w&Çhfò"^™ÑÉ1û/m.“—ñÂäLŽá¾äe[{ µöÄǵöÔ¡Öž8tjO\:µ§.µöÄ¥S{âÒ©=u©µ§PkO|Ü©=qéÔžºÔÚS—Z{âÒ©=qéÔžB­=Ní)ÔÚSèñg?ÔÚóýOà[íùþÒ·Ú“èùgÿ¸ÖžºÔÚ“—¶?½ßjO]jí©K©=y(µ§µöÔ¥ÖžD©=ùq©=u©µ§.µöä¥Ôž¼”ÚS¨µ'Qþ2LôÂ:{PkO¢Ôžú´öä¥ÔžB­=‰îëõ­öÔ7ÞÚS—Z{òRjO^úú³þÁlí©C­=y)µ'.Ú“(µ'>îÔž¼”ÚS—Z{êRkO¢Ôžÿ‹~«=ç«Z{êtkO¢ûúh}«=õ3ií©K­=y)µ'/}íÖ©=õq­=yéµ?Z§öÔ¥Ôž<ôØ­S{êRkO]jíIôÜ­S{êRkO^zìÖ©=…Z{}îÖ©=…Z{}ìÖ©=yéõãÑúåÒ©=qéÔžDÏýÑ:µ§.µöÔ¥Öž¼ôZ­S{êPkO^zìÖ©=u©µ§.µö$zîÖ©=u©µ'Ñãí£õ }íoÔ©=‰>÷7êÔžú´öÔ¥Öž¼tßߨS{êRkO¢Ïý:µ'/}íoTkOjíÉC¯ý:µ§.µöä¥Ôž¼ôµ¿Q§öÄÇÚ“—R{êRkO]jíIôØß¨S{ µö$úÜߨS{êGÐÚS—Z{òÒãÇõë¥×þFÚS÷ù¹¿Q­=u¨µ§µöä¥ûþFÚS—Z{êRkO¢ÇþFÚS—Z{êRkO^zíoÔ©=‰nûujO¢¯ý:µ§~­=y鹿Q§öÄ¥S{òÒc£Ní©Kí©C­=y蹿Q§öÔ¥Öž¼tßߨS{ µö$úÜߨS{êoí©K­=‰îûujO¡ÖžD·ý:µ§~­=u©µ§.µöä¥ç7ê·K©=u¨µ'Ñc}¢Ní©C­=u©µ'/=÷'êÔžºÔÚ“èþã‰ú½ö'êÔžøÆOíÉKÏOÔ¯—¾ö'êÔžD÷ý‰:µ§PkO}ã;yéñþ‰z÷;ßjOní©o2µ'=÷'«µ§>¬µ'=ö'ëÔžºÔÚS—Z{òRjO]jí©K­=‰¦ö¤yí/Ö©=õ}·öä¥çþbÚS¨µ'Ñ}±Ní©K­=u©µ'/=ö«µ'Ú‡Z{Ò<÷ëÔžºÔÚ“—û‹ujO]jí©K­=y鹿X­=inûƒ5µ§¾éÖž:ÓÚ“ès­Ní)ÔÚSßxkO^ºï¡:µ§.µöÔ¥Ôž<ôøñ8ýzèëÏö€Ú“è¾?N§öÔ¥ÖžºÔÚ“—ûãtjO]jíIô¹>N§öjíIsÛߦS{âpjO]jíI”ړ蹿M§öÔ7ÞÚ“—îûÛtjO]jí©K©=yè±?N§öÔ§µöÔ¥Öž¼ôÚ§S{êRkO^zìSkO™ÖžD럷֞B­=õ?¿µ'/=öÇéÔžB­=‰>÷ÇéÔžºÔÚS—Z{òÒ}Z{âЩ=qèÔž¼ôÜÿiÁ©=õq­=u©µ'/½ö×éÔžD·õu:µ'Ñ×ú:½Z{þ/z×hæ+ïû“uP}­=u©µ'/=ö'ëÔžú¸ÖžºÔÚ“—žû“ujO]JíÉC÷OÖ¯‡^¶pâ[íIô¹?Y§ö䥯ýÉ:µ§.½~þ‚믗^ë“ujO¢ýÌc²Ní‰oúÔž¸tjO^zíOÖ©=‰nû“ujO^úÚŸ¬S{êRkO^z®OÖ©=u¨µ'/ýƒ_n=µ§>®µ§.}~îOÖ©=uéþówY»”Ú“‡îû“ÕÚS¦µ'ÑÏßdý=ö×éÔžú´öÔ¥Öž¼ôÚ_§S{êãZ{òÒcNí©K©=u¨µ'=××é[íùþÒ·Úó—K¿ü›‰¿ÿª}«=¹ö¼ÐR{rí9ȵç מÑV{rí9ȵç מZjÏA®=¹ö¼ÐR{rí9ȵç מrí9Ƶç מZjÏA®=±öãÚóBKí9ȵç מZjÏA®=¹öäÚóBKí9蓵ç מƒ\{^h©=¹öäÚóBKí9ȵç Öžc\{þE[íÄÚ3ˆµç מA¬=ƒX{±öäÚ3Hµg kÏA®=ƒX{±ö bí9ȵgkÏ ÖžA¬=¹ö bíÄÚskÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מA¬=ƒX{©öãÚ3ˆµgkÏ -µgkÏ þ…8ˆµç מA¬=ƒþ]í9_åÚ3èCÿ(ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{©öŒaíÄÚskÏ ÖžA¬=¹ö ºíÖR{±öäÚ3ˆµgkÏA®=ƒX{±ö bíy¡¥ö bíÄÚ3ˆµç מA¬=ƒT{ŽqíÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgkÏ ÖžA¬=¹ö úÜߨ¥ö bí9ˆµg kÏ Öžƒ\{±ö bíÄÚóBKíÄÚ3ˆµç מA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Õžc\{±ö bíÄÚskÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מA¬=ƒX{±öäÚ3ˆµgÐs£–Ú3ˆµgkÏ ÖžƒX{ưö bí9ȵgÐÇþF-µgkÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=±öŒ¹íO”kÏÖžƒ\{±ö bí9ȵgkÏ ÖžA¬=/´ÔžAŸûµÔžA¬=¹ö bíÄÚskÏ ÖžA¨=bÜ9Hqç»ßÎXjÏÖžƒX{ưö bíÄÚskÏ ÖžA¬=¹ö bí¤Ú3†µç מA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{±ö Ríy™¥ö RíÃÚskÏ ÖžA¬=ƒX{ríÄÚ3蹿X®=cX{½ÿm»Öžƒ\{±ö bí9ȵgÐÇþZ-µgkÏA®=ƒT{ưö Rí9ƵgkÏ Öžƒ\{±ö bíÄÚskÏ Õž1¬=/äÚ3æ¶¿MKíÄÚskÏ ÖžA¬=¹ö bíÄÚ3ˆµç מAª=cX{±öäÚ3ˆµgkÏA®=ƒX{±ö Rí9ƵgÐúç͵ç מA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{±ö Ríy™¥ö bíÄÚ3ˆµç מA¬=ƒX{rí¤Ú3†µgÐÛÚó]È9_ˆôbíÄÚskÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מAª=cX{±öäÚ3ˆµgkÏ Öžƒ\{±ö Rí9ƵgÐ~†µgkÏ -µgkÏ Öžƒ\{±ö bíÄÚskÏ ÖžAª=Ǹö bíô~¹u©=¹ö bíÄÚskÏ Õž1¬=ƒT{ŽqíÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ ÖžƒX{ưö bíùmµgÐíßÔžÿ÷äÿßÿýV{þ6ÔÚó·ÒA§öÄ¥S{êRkO]jíùþÒ·ÚS¨µçûûV{êRkO\:µ'.ÚS¨µ'Щ=…Z{ µöjí‰AkO:µ§µöÄ¥S{ µöÄǵöÔ¡Öž8tjO\:µ§.µöÄ¥S{âÒ©=u©µ§PkO|Ü©=qéÔžºÔÚS—Z{âÒ©=qéÔžB­=Ní)ÔÚS(µ§LkÏ÷?oµçûKßjO¢çŸýãZ{êRkO^JíÉK©=u©µ§.¥öä¡Ôž:ÔÚS—Z{¥öäÇ¥öÔ¥ÖžºÔÚ“—R{òRjO¡ÖžDùË0QjO¡ÖžD©=õ#híÉK©=…Z{Ý×7ê[í©o¼µ§.µöä¥Ôž¼4µ§µöÔ¡Öž¼ôœEK§ö$Jí‰;µ'/¥öÔ¥ÖžºÔÚ“(µçÿ¢_jÏ|UkOníIt_­oµ§~&­=u©µ'/¥ö䥯ýÑ:µ§>®µ'/½öGëÔžº”Ú“‡û£ujO]jí©K­=‰žû£ujO]jíÉKýÑ:µ§PkO¢ÏýÑ:µ§PkO¢ýÑ:µ'/½~÷7êÔžúÆ[{êRkO¢ûþFÚS¨µ'Ñm£Ní©AkO]jí©K­=yéùãúíRjOjíIôXŸ¨S{êPkO]jíÉKÏý‰:µ§.µö$ºÿx¢~E¯ý‰:µ'¾ñS{òÒóÇõ륯ý‰:µ'Ñ}¢Ní)ÔÚSßxkO^zìOÔ©=u©µ§.%îä¡çûêݯyœÚSŸÞÚSßÚ“—¾ö'ëÔžºÔÚ“—R{êRkO]jíI4µ'Ík±Ní©ï»µ'/=÷ëÔžB­=‰îû‹ujO]jí©K­=y鱿X­=qèÔž8Ôړ湿X§öÔ¥Öž¼ôØ_¬S{êRkO]jíÉKÏýÅjíIsÛ¬©=õM·öÔ™ÖžDŸûkujO¡ÖžúÆ[{òÒ}­Ní©K­=u)µ'=~¼V¿úú³ýŸˆ§ö$ºïÓ©=u©µ§.µöä¥Çþ8ÚS—Z{}®Ó©=Z{ÒÜö·éÔžøœÚS—Z{¥ö$zîoÓ©=õ·öä¥ûþ6ÚS—Z{êRjOzìÓ©=õi­=u©µ'/½öÇéÔžºÔÚ“—ûãÔÚS¦µ'Ñúç­µ§PkOýÏoíÉKýq:µ§PkO¢Ïýq:µ§.µöÔ¥Öž¼tß_§Öž8tjO:µ'/¥ö$úÚ_§S{êRkO^zí¯Ó©=‰nëëtjÏÿEoJÎ~å×úd½Z{Ý÷'ëÔžºÔÚS—Z{òÒc²Ní©»ÿg²NíÉKÏýÉ:µ§.¥öä¡û'ë×C¯?[8ñ­ö$úÜŸ¬S{òÒ×þdÚS—^?Áõ×K¯õÉ:µ'Ñ~æ±?Y§öÄ7}jO\:µ'/½ö'ëÔžD·ýÉ:µ'/}íOÖ©=u©µ'/=×'ëÔž:ÔÚ“—þÁ/·žÚS×ÚS—Z{òÒs²Ní©K©=yè¾ÿ…ªµ§LkO¢Ÿ¿Éú+zì¯Ó©=õhí©K­=y鵿N§öÔǵöä¥Çþ:ÚS—R{êPkOz®¯Ó·Úóý¥oµç/—~ù×ÿiÕV{ríy¡¥öäÚskÏA®=ÿ¢­öäÚskÏA®=/´Ôžƒ\{ríy¡¥öäÚskÏA®=/äÚsŒkÏA®=/´Ôžƒ\{bí9Ƶç…î®=¹öäÚóBKí9ȵç מƒ\{^h©=¹öäÚskÏ -µç מƒ\{^h©=¹öÄÚsŒkÏ¿h«=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{©öŒaí9ȵgkÏ ÖžA¬=¹ö bíÄÚ3ˆµç מA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ Õžc\{±ö bíy¡¥ö bíÄ¿±öäÚ3ˆµgп«=ç«\{}è±ö bí9ȵgkÏ ÖžA¬=¹ö bíÄÚskÏ Õž1¬=ƒX{ríÄÚ3ˆµç מA·ýÑZjÏ Öžƒ\{±ö bí9ȵgkÏ ÖžA¬=/´ÔžA¬=ƒX{±öäÚ3ˆµgjÏ1®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚsеgkÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=ƒX{bíÃÚ3ˆµç מA¬=ƒX{±ö¼ÐR{±ö bí9ȵgkÏ ÖžA¬=¹ö bíÄÚskÏ ÖžA¬=ƒX{ríÄÚ3HµçמA¬=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgkÏ ÖžA¬=¹ö bíÄÚóBKíÄÚ3ˆµgkÏA¬=cX{±öäÚ3èc£–Ú3ˆµç מA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ ÖžƒX{ÆÜö'ʵg kÏA®=ƒX{±öäÚ3ˆµgkÏ ÖžZjÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מA¬=ƒX{±öäÚ3Hµg jÏ"Äï~d«=ƒX{±ötgíÄÚ3ˆµç מA¬=ƒT{ưöäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgkÏ ÖžAª=/³ÔžAª=cX{ríÄÚ3ˆµgkÏA®=ƒX{±öÄÚ3†µgÐûß¶‹`í9ȵgÐçþZ-µç מAûkµÔžA¬=¹ö RíÃÚ3HµçמA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒT{ưö¼kϘÛþ6-µgkÏA®=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{©öŒaíÄÚskÏ ÖžA¬=¹ö bíÄÚ3HµçמAëŸ7מƒ\{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3Hµçe–Ú3ˆµgkÏ Öžƒ\{±ö bí9µç»H3_©4æ}ú ©öãÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{©öŒaíÄÚskÏ ÖžA¬=ƒX{ríÄÚ3HµçמAûÖžA¬=/´ÔžA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{©öãÚ3ˆµgÐ?øåÖ¥öäÚ3ès²–ÚskÏ Õž1¬=ƒT{ŽqíÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ ÖžƒX{ưö bíùmµgÐí_Õž?÷[íùÛlhPkÏßHÚ—Ní©K­=u©µçûKßjO¡Öžï?î[í©K­=qéÔž¸tjO¡Öž@§öjí)ÔÚS¨µ'~­=qèÔž:ÔÚ—Ní)ÔÚ×ÚS‡Z{âЩ=qéÞÚS—Z{âÒ©=qéÔžºÔÚS¨µ'>îÔž¸tjO]jí©K­=qéÔž¸tjO¡Öž@§öjí)”ÚS¦µçûŸÀ·Úóý¥oµ'ÑóÏþq­=u©µ'/¥öä¥ÔžºÔÚS—R{òPjOjí©K­=‰R{òãR{êRkO]jíÉK©=y)µ§PkO¢üe˜(µ§PkO¢Ôžú´öä¥ÔžB­=‰îëõ­öÔ7ÞÚS—Z{òRjO^šÚS‡Z{êPkO^Jí‰K§ö$Jí‰;µ'/¥öÔ¥ÖžºÔÚ“(µ§PãÎÿE¿%¡ùªù‡@<}_­oµ§~&­=u©µ'/¥ö䥯ýÑ:µ§>®µ'/½öGëÔžº”Ú“‡û£ujO]jí©K­=‰žû£ujO]jíÉKýÑ:µ§PkO¢ÏýÑ:µ§PkO¢ýÑ:µ'/½~®µ'/=×7êÔž:ÔÚ“—îûujO]jí©K­=‰ûujO]jí©K­=y鵿Q§ö$ºíoÔ©=‰¾ö7êÔžú´öä¥çþFÚ—NíÉKý:µ§>.µ§µöä¡çþFÚS—Z{òÒ}£Ní)ÔÚ“ès£Ní©o¼µ§.µö$ºïoÔ©=…Z{Ýö7êÔžú´öÔ¥ÖžºÔÚ“—ž?Þ¨ß.¥öÔ¡ÖžDõ‰:µ§µöÔ¥Öž¼ôÜŸ¨S{êRkO¢û'êWôÚŸ¨S{â?µ'/=ô‚X{±öäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgjÏÖžA¬=¹ö bíÄÚskÏ Ûþh-µgkÏA®=ƒX{±öäÚ3ˆµgkÏ ÖžZjÏ ÖžA¬=ƒX{ríÄÚ3HµçמA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=ƒX{bíÃÚ3ˆµç מA¬=ƒX{±ö¼ÐR{±ö bí9ȵgkÏ ÖžA¬=¹ö bíÄÚskÏ ÖžA¬=ƒX{ríÄÚ3HµçמA¬=ƒX{±öô`íÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{±ö bíy¡¥ö bíÄÚ3ˆµç Öž1ŸûµÔžƒ\{}ìoÔR{±öäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgkÏ ÖžA¬=¹ö bíÄÚskϘÛþD¹öŒaí9ȵgkÏ Öžƒ\{±ö bíÄÚóBKíÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{©öŒaí9ˆµg kÏ ÖžA¬=©ö<ˆqgâÎw¿è²ÕžA¬=ƒT{ưöäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgkÏ ÖžAª=/³ÔžAª=cX{ríÄÚ3ˆµgkÏA®=ƒX{±öÄÚ3†µgÐûß¶‹`í9ȵgkÏ Öžƒ\{}ì¯ÕR{±öäÚ3Hµg kÏ Õžc\{±ö bí9ȵgkÏ ÖžA¬=¹ö RíÃÚóB®=cnûÛ´ÔžA¬=¹ö úÔ/'±öäÚ3ˆµgkÏ Öžƒ\{©öŒaíÄÚskÏ ÖžA¬=¹ö bíÄÚ3HµçמAëŸ7מƒ\{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3Hµçe–Ú3ˆµgkÏ ÖžƒP{¾ 9ó•ïÐoˆµç מAª=cX{©öãÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{©öŒaíÄÚskÏ ÖžA¬=ƒX{ríÄÚ3HµçמAûÖžA¬=/´ÔžA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{©öãÚ3ˆµgÐ?øåÖ¥öäÚ3ˆµgkÏA®=ƒT{ưö Rí9ƵgkÏ ÖžA¬=¹ö bíÄÚskÏ ÖžA¬=ƒX{bíÃÚ3ˆµç_´ÕžA·U{þýG‘[í9ȵ煖ÚskÏA®=¹öü‹¶ÚskÏA®=¹ö¼ÐR{rí9ȵ煖ÚskÏA®=¹ö¼kÏ1®=¹ö¼ÐR{rí9ˆµçמZjÏA®=¹ö¼ÐR{rí9ȵç מZjÏA®=¹öäÚóBKí9ȵç מZjÏA®=±öãÚó/ÚjÏ ÖžA¬=¹ö bíÄÚ3ˆµç מAª=cX{ríÄÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3HµçמA¬=ƒX{^h©=ƒX{ñ/ÄA¬=¹ö bíÄÚsп¬=óUú‡@A¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3Hµg kÏ Öžƒ\{±ö bí9ȵgÐm´–Ú3ˆµç מAŸû£µÔžƒ\{±ö bíÄÚóBKíÄÚ3ˆµgkÏA®=ƒX{©öãÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgkÏ ÖžA¬=¹ö bíÄÚskÏ ÖžA¬=ƒX{ríÄÚ3ˆµgkÏA¬=cX{±öäÚ3ˆµgkÏ ÖžZjÏ ÖžAO•4ƒ\{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3ˆµç מA¬=ƒT{ŽqíÄÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=/´ÔžA¬=ƒX{±öÄÚ3æs£–ÚskÏ ýZjÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3ˆµç מA¬=ƒX{bísÛŸ(מ1¬=¹ö bíÄÚskÏ ÖžA¬=ƒX{^h©=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏ Õž1¬=±öŒaíÄÚ3ˆµç מA¬=ƒ8å9Hqç»ß†ÙjÏ Õž1¬=¹ö bíÄÚ3ˆµç מA¬=ƒX{ríÄÚ3ˆµgjÏË,µgjϘçþb-µgkÏ ÖžA¬=¹ö bíÄÚskÏÖžAïÛ.‚µç מA¬=ƒX{ríô±¿VKíÄÚskÏ Õž1¬=ƒT{ŽqíÄÚ3ˆµç מA¬=ƒX{±öäÚ3Hµg kÏ ¹öŒ¹íoÓR{±öäÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgjÏÖžA¬=¹ö bíÄÚskÏ ÖžA¬=ƒT{Žqí´þy{°öäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgkÏ ÖžAª=/³ÔžA¬=ƒÞמïÍ|%ÐAü bíÄÚskÏ Õž1¬=ƒT{ŽqíÄÚ3è¹?YKíÄÚ3ˆµgkÏA®=ƒX{±öäÚ3Hµg kÏ Öžƒ\{±ö bíÄÚskÏ ÖžAª=Ǹö Úϰö bíy¡¥ö bíÄÚskÏ ÖžA¬=ƒX{ríÄÚ3HµçמA¬=ƒþÁ/·.µç מA¬=ƒX{rí¤Ú3†µgjÏ1®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏÖžA¬=ÿ¢­ö ºý›Úóÿ¼Ûç÷ÚóñßPñÇé ÖžAß¿ÉA§öÄ¥S{êRkO]jíùþÒ·ÚS¨µçûûV{êRkO\:µ'.ÚS¨µ'Щ=…Z{ µöjí‰AkO:µ§µöÄ¥S{ µöÄǵöÔ¡Öž8tjO\:µ§.µöÄ¥S{âÒ©=u©µ§PkO|Ü©=qéÔžºÔÚS—Z{âÒ©=qéÔžB­=Ní)ÔÚS(µ§LkÏ÷?oµçûKßjO¢üeX×ÚS—Z{òRjO^Jí©K­=u)µ'¥öÔ¡ÖžºÔÚ“(µ'?.µ§.µöÔ¥Öž¼”Ú“—R{ µö$Ê_†‰R{ µö$Jí©AkO^Jí)ÔÚ“è¾¾QßjO}ã­=u©µ'/¥ö䥩=u¨µ§µöä¥Ôž¸tjO¢Ôžø¸S{òRjO]jí©K­=‰R{ µöü_ôKíÙ¯ú˜ÄÓ÷õÑúV{êgÒÚS—Z{òRjO^úÚ­S{êãZ{òÒk´Ní©K©=yè±?Z§öÔ¥ÖžºÔÚ“è¹?Z§öÔ¥Öž¼ôØ­S{ µö$úÜ­S{ µö$úØ­S{òÒëÇ£õË¥S{âÒ©=‰žû£ujO]jí©K­=yéµ>Z§öÔ¡Öž¼ôØ­S{êRkO]jíIôÜ­S{êRkO¢ÇþhÚS¨µ'ÑçþFÚS?‚ÖžºÔÚ“—îûujO]zþg£Ní©kíÉK_ûÕÚS‡Z{òÐk£Ní©K­=y)µ'/}íoÔ©=ñq§öä¥ç”4ºÔÚS—Z{=ö7êÔžB­=‰>÷7êÔžú´öÔ¥Öž¼ôøñFýz鵿Q§öÔǵöä¥çúFÚS‡Z{òÒ}£Ní©K­=u©µ'Ñc£Ní©K­=u©µ'/½ö7êÔžD·ý:µ'Ñ×þFÚS?‚Öž¼ôÜߨS{âÒ©=y鱿Q§öÔÇ¥öÔ¡Öž<ôÜߨS{êRkO^ºïoÔ©=…Z{}îoÔ©=õ·öÔ¥ÖžD÷ý:µ§PkO¢ÛþFÚS?‚ÖžºÔÚS—Z{òÒóÇõÛ¥Ôž:ÔÚ“è±>Q§öÔ¡ÖžºÔÚ“—žûujO]jíItÿñDýŠ^ûujO|ã§öä¥ç'ê×K_ûujO¢ûþDÚS¨µ§¾ñÖž¼ôØŸ¨S{êRkO]JíÉCÏý…jí©kíÉCý…:µ§.µöÔ¥Öž¼”ÚS—Z{êRãN¢‰;1ï~­æ[í©ËÏÿüx±~ûÒÚ“—žû‹ujO¡ÖžD÷ýÅ:µ§.µöÔ¥Öž¼ôØ_¬Öž8tjOjíIóÜ_¬S{êRkO^zì/Ö©=u©µ§.µöä¥çþbµö¤¹íÖÔžú¦[{êLkO¢Ïýµ:µ§PkO}ã­=y龿V§öÔ¥Öžº”Ú“‡?^«_}ýÙ^´S{Ý÷×êÔžºÔÚS—Z{òÒc­Ní©K­=‰>ß¾VÇ<÷Ç©µ'Ím›Ní‰À©=u©µ'QjO¢çþ6ÚSßxkO^ºïoÓ©=u©µ§.¥öä¡Çþ8ÚSŸÖÚS—Z{òÒkœNí©K­=yé±?N­=eZ{­ÞZ{ µöÔÿüÖž¼ôاS{ µö$úܧS{êRkO]jíÉK÷ýují‰C§öÄ¡S{þï¥7!g¿ò¹ÿ#„S{ê{hí©K­=yéµ?Y§ö$º­OÖ©=‰¾Ö'ëÕÚ“è¾?Y§öÔ¥ÖžºÔÚ“—û“ujO}\kO]jíÉKÏýÉ:µ§.¥öä¡û'ë×C¯?[8ñ­ö$úÜŸ¬S{òÒ×þdÚS—^?Áõ×K¯õÉ:µ'Ñ~æ±?Y§öÄ7}jO\:µ'/½ö'ëÔžD·ýÉ:µ'/}íOÖ©=u©µ'/=×'ëÔž:ÔÚ“—þÁ/·žÚS×ÚS—Z{òÒsNí©K©=y辿N­=eZ{ýüMÖ_ÑcNí©@kO]jíÉK¯ýu:µ§>®µ'/=ö×éÔžº”ÚS‡Z{òÐs}¾Õžï/}«=¹ôË?–þo®²L{Žá²çe<ì9†»žc8ë9†«žÍ2ê9†›žc8é9†‹ž—ñ çîyŽáœçe¼æ9†cžc¸å9†Sž—á’çyŽáŽçe<ã9†+žc4â9„ž—ñ„ç.xŽá€çe¼ß9†óc¸Þ9†ã—yr»s §;Çp¹s ‡;/ãÝÎ1œíÃÕÎËx´s 7;Çh²s;ÿše°3F{1?ÿkF¿|×:c4Ö£­ÎMuŽáRg †:C´Ó9†31ZéŒÑHgŒ6:Çp¢3F 1èŒÑ>çÎsÆh3Fãœc¸Í£iÎ-sÆh˜s w9c4Ë£UÎ1åŒÑ&gŒ&9c°È9„ƒœ1ÚãŒÑçe¼Æ£1ÎýçŠb4Å9†Kœ1âŒÑç˜7Ù/úøóþ?ΣÎmpŽágŒ8c4À£ýÍ1œßŒÑúfŒÆ7Çp{3Ó›!ZÞŒÑðæînÆhv3F«›c8ºs[Ÿ!OnÆhqs 7c´·£¹Í1\ÛŒÑØfŒ¶6c4µy/mÆhh3F;›1šÙÕÍlÆ`cs'6c´°£ÍíkŽá¼fŒÖ5c4®9†Ûš1šÖŒÑ²fŒ†5ÇpW3F³š1ZÕÃQÍmjÆhR3F‹šcžԌўfŒæ4c´¦9Fcš!ÚҌєæ.iÆhH3F;š1šÑ¼ŒW4c4¢óÄ>ÙNhÆhA3Fš1ÚÏÃù̘ÏõÕñxængÆh:3FË™1ÎÃÝÌÍfÆ`5sG3c´™£ÉÌ-fŽá`fŒö2c4—£µÌ1ËŒÑVfŒ¦2Çp)3FC™1ÚÉŒÑLæ®dÆh$3F™—ñDfŒ2c4£}Ì1šÇ Ñ:fŒÆ1Çp3æc}u¼Œ£aÌ1ÜÅŒÑ,fŒV1c4Š9†›˜1šÄŒÑ"æbÆh3Fs˜1ZÃÃ1ÌmaÆh sŒ–0Cnë£ÃÌÍ`Žá fŒF0c´9†˜1ZÀŒÑfŒö//ãùË­_Æhü2FÛ—c8}£åË _ŽáîeŒf/c´z£ÑË1ܼŒÁäeˆ/Çhð2D{—1š»ŒÑÚåŽ]Æ|®oާ.Çhé²F»–1˜µ Ѫå˜'F-ßüªÊ2r£ËM\ŽáÂeŒ.c´o9†ó–1Z·ŒÑ¸e ¶-/âiË,[†<×7È»–1šµŒÑªeŒF-ÇpÓ2F“–1Z´£AËíYƼКåŽYÆhË2FS–c¸dó±¾?Þ±ŒÑŒå®XÆ`Ä2D–1˜°ÂË XÆh¿r ç+c´^£ñÊmWŽáte –+C4\yîV†ÜÖׯ«•1­ÃÍÊMVÆh±r +c´W£¹Ê­UŽáXe ¶*C4U£¥Ê1ªŒÑNeŒf*Çp¥2F#•1Ú¨ŒÁDå.TÆl¼¸O9†ó”1Z§ŒÑ8eŒ¶)Çpš2FË”1¦Ã]ÊÍRÆh•2£”Ñ&å»q¾P;•1ïg*Ñ åîQÆhŽ2Fk”c8Fƒ-ÊMQÆ`‰r‡(c´C£Ê1\¡ŒÑeŒ6(c4A9† ”1Ÿë#äýÉ1œŸŒÁúdˆÆ'c´=9æ¹ÿ⦗'c4<£ÝÉ1œŒÑêd F'‡ps2f=¢ÅÉ N^Æ{“1š›ŒÑÚäŽMÆhk2FS“1ZšáÉíLÆ`frW&c42³ÿÒ¦'&Çpa2F“1Ú—ÃyɬK†h\2Û’C8-£eÉ KÆhWr g%c´*£QÉ1Ü”ŒÑ¤dŒ%c4(9F{’!š“ŒÑšä_³ŒIÆÜþÕ–ä߿元Ü^h ¹0äÄpÿh‹ ¹2äÌp;à -¡á —†ƒœ^hi 96äÚpsà ¹7ãàp‹Ã -Éá 7‡ƒŽqux¡%;äîpÃà -åá §‡ƒÜr|x¡¥>äüpûÃA/´ˆƒœ rƒx¡%Bä q3Ä1îÿ¢-D b‰Äq[Ä ÆˆA¬ƒ˜#rôùçýÿyÃ"q“Ä 6‰AŒƒX%r–Ä.1ˆabËÄANƒØ&1Nä:1ˆybûÄ Šƒ\(1Q b£8È‘b+Å fŠAêÇ8T úÔ¿Dbªx¡¥U b¬Ä¿ø1Wä^1ˆÁb‹ÅAÿ2YÌW}èï1Z bµ8ÈÙb»Å †‹A,9] b»ÄxqëÅ å‹1ìƒ0rÁÄ„1ˆ ã GŒA·ýÑZ2Æ vŒƒ2±d bÊ8È-ccÆ ÖŒAÌ/´ôŒA ƒX41iä¦1ˆQcªÆ1΃Ø51l bÙ8ÈicÛÆ ƃ\71o bßÄÀq Ç &ŽAl9r båÄÌ1ˆã ‡ŽA,ƒ˜:±uÄØ1†µcsÇAîƒ<±x bòx¡¥y bôÄêq³Ç vA ƒX>rúô¹¿QKü8ÈõcóÇ öA ¹€ b¤rŒ#È VAÌ ƒØArÄ2ˆ)d[ÈAŽ!ƒXC½ö7jé!ƒD±ˆ b9ÈMd£È V‘Z²È v‘A #ƒXFbÃ62ˆqä בAûµô‘A $¹ b"ÄF2ˆ‘ä W’AÌ$ƒØIr(ÄR2ˆ©d[ÉAŽ%ƒXK1—Ä^2æ¶?Q.&c˜Lr3Äh2ˆÕä g“Aì&ƒN±œ¼Ð’N± b<ÄzróÉ ö“A (¹  bBĆ2ˆå W”AÊ(cØQbHÃ’2ˆ)e[ÊAŽ)ƒ>÷jÉ)¹§ bP¤¢2†Iå 5•±¡ BDùîW}¶¬r»Ê †•A,+9­ b[ĸ2Huåe–¼2H}e ËA.,ƒ˜X±± bd9È•e3Ë v–ƒZư´ zÿ«vl-9¶ bmÄÜr{Ë ýµZŠË &—ƒÜ\)ºŒau¤ìrŒ»Ë †—A,/9½ b{Äø2ˆõå ç—Aê/c`^ÈfÌm¬–3ˆæ W˜AÌ0ƒØarˆÄ3ˆ)f[ÌAŽ1ƒTcÆ0Ç b9ÈAf‹Ì &™ƒÜd1Ê b•¤,sŒ»Ì õÏ›ËÌAN3ƒØf1Î b9ÈyfûÌ šƒ\h1Ñ b£ô6Ò|`^_¨tób¦ÄN3ˆ¡æ —šAL5ƒØjr¬¤Z3†¹fzÍ16ƒXl1Ùäf3ˆÑf«Í f›ƒÜm1Ü b¹9ÈéfÚÍÆ›A¬79ß b¿Ä€3ˆç 'œAl8ƒqŽqÅ´ŸaÇÄóBKÉÄ”3èµ?YKÌÄš3ˆ9g{ÎA:ƒXt)éã¦3ˆQgÐ?øåÖ%ëä®3ˆagËÎAN;ƒÔvÆ0î RÝ9ÆygûÎ žA,<9ñ bãÄÈs+Ï fžAì<ƒzbéÃÔ3ˆ­ç_´ÅžA·S{¾þ[[}¯=›© jíùÛàå S{âÒ©=u©µ§.µö|é[í)ÔÚóýÇ}«=u©µ'.Ú—Ní)ÔÚèÔžB­=…Z{ µöÄ µ'ÚS‡Z{âÒ©=…Z{âãZ{êPkO:µ'.ÚS—Z{âÒ©=qéÔžºÔÚS¨µ'>îÔž¸tjO]jí©K­=qéÔž¸tjO¡Öž@§öjí)ôø³jíùþ'ð­ö|é[íIôü³\kO]jíÉK?ÛŸÞoµ§.µöÔ¥Ôž<”ÚS‡Z{êRkO¢Ôžü¸ÔžºÔÚS—Z{òRjO^Jí)ÔÚ“(&za=¨µ'QjOýZ{òRjO¡ÖžD÷õúV{êoí©K­=y)µ'/}ýYÿ`¶öÔ¡Öž¼”Ú—NíI”ÚwjO^Jí©K­=u©µ'QjO¡Öžÿ‹~©=ûUóxú¾>ZßjOýLZ{êRkO^JíÉK_û£ujO}\kO^zíÖ©=u)µ'=öGëÔžºÔÚS—Z{=÷GëÔžºÔÚ“—û£ujO¡ÖžDŸû£ujO¡ÖžDû£ujO^zýx´~¹tjO\:µ'Ñs´Ní©K­=u©µ'/½ÖGëÔž:ÔÚ“—û£ujO]jí©K­=‰žû£ujO]jíIôØ­S{ µö$úÜߨS{êGÐÚS—Z{òÒ}£Ní©K­=‰>÷7êÔž¼ôµ¿Q­=u¨µ'½ö7êÔžºÔÚ“—R{òÒ×þFÚwjO^Jí©K­=u©µ'Ñc£Ní)ÔÚ“ès£Ní©AkO]jíÉKoÔ¯—^ûujO}\kO^z®oÔ©=u¨µ'/Ý÷7êÔžºÔÚS—Z{=ö7êÔžºÔÚS—Z{òÒk£NíItÛߨS{}íoÔ©=õ#híÉKÏý:µ'.Ú“—ûujO}\jOjíÉCÏý:µ§.µöä¥ûþFÚS¨µ'ÑçþFÚSßxkO]jíItßߨS{ µö$ºíoÔ©=õ#hí©K­=u©µ'/=¼Q¿]Jí©C­=‰ëõßÍýµ~Úë?ûujO^zîOÔ©=u©µ'ÑýÇõ+zíOÔ©=ñŸÚ“—ž?ž¨_/}íOÔ©=‰îûujO¡ÖžúÆ[{òÒc¢Ní©K­=u)µ'=÷ªµ§>¬µ'=öêÔžºÔÚS—Z{òRjO]jí©K­=‰¦ö¤yíÔ©=õ}·öä¥çþ@¸S¨qç/èÝ/ }«=õ¿¤µ§>¿µ§.µöä¥ÇþbµöÄ¡S{âPkOšçþbÚS—Z{òÒc±Ní©K­=u©µ'/=÷«µ'Ím°¦öÔ7ÝÚSgZ{}î¯Õ©=…Z{êoíÉK÷ýµ:µ§.µöÔ¥Ôž<ôøñZýzèëÏö¢Ú“辿V§öÔ¥ÖžºÔÚ“—ûkujO]jíIô¹¾V§öjíIsÛ«S{âpjO]jíI”ړ蹿M§öÔ7ÞÚ“—îûÛtjO]jí©K©=yè±?N§öÔ§µöÔ¥Öž¼ôÚ§S{êRkO^zìSkO™ÖžDÿ?e÷–Ù–$Y´GwŒìAÿ;–áÙ$M½þ•?5‚òª]îÉ Yÿ¼µöjí©ÿø­=yé¾?N§özþgœNí©o¼µ§.µöÔ¥Öžÿ{éE¤Ù¯¼íOVP|Ÿ§öÄ¡S{òÒcÿ'„S{êãZ{êRkO^zîOÖ©=‰Þ×'ëÔžDŸë“õlíItÛŸ¬S{êRkO]jíÉK÷ýÉ:µ§>®µ§.µöä¥ÇþdÚS—R{òÐíÇ“õë¡ç?[8ñ­ö$úØŸ¬S{òÒçþdÚS—ž?Áõ×KÏõÉ:µ'Ñ~æ¾?Y§öÄ7}jO\:µ'/=÷'ëÔžDïû“ujO^úÜŸ¬S{êRkO^z¬¯Ó©=u¨µ'/ý‹_n=µ§>®µ§.µöä¥Çþ:ÚS—R{òÐmZ{Ê´ö$úù›¬¿¢ûþ:ÚS?€ÖžºÔÚ“—žûëtjO}\kO^ºï¯Ó©=u)µ§µöä¡Çú:}«=__úV{þré—¸ýúǺeÛ3ˆÛžƒ¼íÄmÏ n{qÛóB˶g·=ƒ¸íÄmÏAÞö â¶g·=yÛ3ˆÛžAÜö â¶ç n{ÆpÛ3ˆÛžƒ¼íÄmÏ m{ÆpÛs·=ƒ¸íÄmÏAÞö â¶g·=ƒ¸í9ÈÛžAÜö â¶g·=yÛ3ˆÛžAÜöämÏ n{iÛ3†ÛžZ¶=‹´íY¤mÏ n{iÛ³HÛžEÚö â¶g¶=k´íÄmÏ"m{iÛ³HÛžAÜö,Ò¶g‘¶=‹´íÄmÏ"m{iÛ3ˆÛžEÚö,Ò¶g‘¶=ƒ¸íY¤mÏ¢'fÒ‚¸íY¤mÏ"m{aÛ3†ÛžEÚö,Ò¶ç o{iÛ³HÿõGEÚö â¶g‘¶=‹´íôwÛžýª·^ÿW~iÛ³HÛžAÜö,Ò¶g‘¶=‹´íÄmÏ"m{iÛ3ˆÛžEØö¬Ñ¶g‘¶=ƒ¸íY¤mÏ"m{qÛ³è}´¼íY¤mÏ §¶=‹´íY¤mÏ n{iÛ³HÛžEÚöämÏ"m{iÛ³HÛžAÜö,Ò¶g¶=c¸íY¤mÏ"m{iÛ3ˆÛžEÚö,Ò¶g·=‹´íY¤mÏ"m{qÛ³HÛžEÚö â¶g‘¶=‹´íY¤mÏ n{iÛ³HÛžEÚö Ò¶g¶=‹´íÄmÏ"m{iÛ³HÛžƒ¼íY¤mÏ"m{qÛ³HÛžEÚö,Ò¶g·=‹´íY¤mÏ n{iÛ³HÛžEÚö â¶g‘¶=‹°íÃmÏ"m{iÛ³HÛžAÜö,Ò¶g‘¶=‹´íÄmÏ"m{=÷7ÊÛžEÚö,Ò¶g‘¶=ƒ¸íYô±¿QÞöämÏ"m{iÛ³HÛžAÚö¬Ñ¶g‘¶=ƒ¸íYô¶¿QÞö,Ò¶g·=‹´íY¤mÏ"m{qÛ³HÛžEÚö â¶g‘¶=‹´íY¤mÏ n{iÛ³HÛžAÚö¬yߟ(n{ÖhÛ3è©mÏ"m{iÛ3ˆÛžEÚö,Ò¶g‘¶=yÛ³HÛžEÚö,Ò¶g·=‹´íY¤mÏ n{iÛ³HÛžEÚö â¶g¶=k´í¤mÏm{iÛ³HÛžAÜö,Ò¶g‘¶=ƒ¸íY¤mÏ"l{ÖhÛ3ˆÛžEÚö,¶çAšò â”g¦<_ýfѲíÄmÏ"m{iÛ³Ûžc¼íY„mÏm{qÛ³HÛžEÚö,Ò¶g·=‹>öËÛžAÚö¬Ñ¶gÑËm… m{qÛ³HÛžEÚö â¶gÑÛþZyÛ³HÛžAÜö,¶g¶=‹°íÃmÏ"m{iÛ3ˆÛžEÚö,Ò¶g‘¶=ƒ¸íY„mÏm{â¶gÍûþXyÛ³HÛžAÜö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{iÛ3ˆÛžEØö¬Ñ¶g‘¶=ƒ¸íY¤mÏ"m{qÛ³HÛžEÚö,¶g ·=‹Ö?oÜö â¶g‘¶=‹´íY¤mÏ §¶=‹´íY¤mÏ l{¾ 9ó•ü,ÒàgÑËÁÏo{iÛ³HÛžEÚö â¶g‘¶=‹´íÄmÏ"l{ÖhÛ³Ûž1Üö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{iÛ3ˆÛžEÚö,Ò¶g·=‹°íY£mÏ"m{qÛ³HÛžEÚö,Ò¶g·=‹´íY„mÏn{íg´íY¤mÏAÞö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{iÛ3ˆÛžEûëÄmÏn{iÛ³è_ür«·=ƒ¸íY¤mÏ"m{qÛ³Ûž5Úö,¶g ·=‹´íY¤mÏ"m{qÛ³HÛžEÚö â¶g‘¶=‹´íY¤mÏ m{ÖhÛ³HÛžZ¶=‹ÞÿjÛóëm²Õžƒ\{^h©=¹öäÚskÏ/´Õžƒ\{rí9ȵ煖ÚskÏA®=/´Ôžƒ\{rí9ȵç…\{Žqí9ȵ煖ÚskÏA¬=Ǹö¼ÐR{rí9ȵ煖ÚskÏA®=¹ö¼ÐR{rí9ȵç מZjÏA®=¹ö¼ÐR{rí9ˆµçמ_h«=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{©öŒaí9ȵgkÏ ÖžA¬=¹ö bíÄÚ3ˆµç מA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ Õžc\{±ö bíy¡¥ö bíÄ¿±öäÚ3ˆµgkÏAY{æ«Þô@A¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3Hµg kÏ Öžƒ\{±ö bí9ȵgÐûþh-µgkÏA®=ƒX{±öäÚ3ˆµgkÏ ÖžZjÏ ÖžA¬=ƒX{ríÄÚ3HµçמA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=ƒX{bíÃÚ3蹿QKíÄÚ3ˆµgkÏ -µgkÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3ˆµç מA¬=ƒT{ŽqíÄÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏ ýZjÏ -µgkÏ ÖžA¬=±öŒaíÄÚskÏ ·ýZjÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3ˆµç מA¬=ƒX{bíó¾?Q®=cX{ríÄÚ3ˆµç מA¬=ƒX{±ö¼ÐR{±ö bíÄÚskÏ ÖžAÏý‰ZjÏ ÖžA¬=ƒX{rí¤Ú3†µç Öž1¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{©öŒaí9ȵgkÏ ÖžA¬=¹ö BíyãÎAŠ;_ýŽÒV{±ö Ríy™¥ö RíÃÚskÏ ÖžA¬=ƒX{ríô±¿XKí9ˆµg kϠ׿mÁÚskÏ ÖžA¬=¹ö zÛ_«¥ö bí9ȵgjÏÖžAª=Ǹö bíÄÚskÏ ÖžA¬=ƒX{rí¤Ú3†µç…\{ƼïÕR{±öäÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgjÏÖžA¬=¹ö bíôܧ¥ö bíÄÚ3HµçמAëŸ7מƒ\{±ö bíÄÚskÏ ÖžA¯kÏW!ç|%ÐoˆµgkÏ Õž—YjÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מAª=cX{©öãÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{©öŒaíÄÚskÏ ÖžA¬=ƒX{ríÄÚ3HµçמAûÖžA¬=/´ÔžA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{©öãÚ3ˆµgпøåÖ¥öäÚ3ˆµgkÏA®=ƒT{ưö Rí9ƵgkÏ ÖžA¬=¹ö bíÄÚskÏ ÖžA¬=ƒX{bíÃÚ3ˆµçÚjÏ ÷¿©=ÿûÿÜÿ÷ïhKíÄÚskÏ ÖžA¬=ƒX{^h©=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏÖžA¬=¹ö bí¤Ú3†µç מA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ §jÏA®=ƒX{©öŒaíy¡¥ö,RíY¤Ú3ˆµg‘jÏ"ÕžEª=ƒX{¡ö¬QíÄÚ³Hµg‘jÏ"ÕžA¬=‹T{©ö,RíÄÚ³Hµg‘jÏ ÖžEª=‹T{©ö bíY¤Ú³HµgkÏ"ÕžEª=‹P{ưö,RíY¤ÚskÏ"ÕžEú q‘jÏ ÖžEª=‹T{ý]íÙ¯zÃ?©ö,RíÄÚ³Hµg‘jÏ"ÕžA¬=‹T{©ö bíY„Ú³Fµg‘jÏ ÖžEª=‹T{±ö,zß-מEª=ƒX{©ö,RíÄÚ³Hµg‘jÏ"Õžƒ\{©ö,RíY¤Ú3ˆµg‘jÏ¢çúh¹ö,RíY¤Ú³HµgkÏ"ÕžEª=ƒX{©ö,RíY¤Ú3ˆµg‘jÏ"ÕžA¬=‹T{©ö,RíÄÚ³Hµg‘jÏ"ÕžAª=kT{=÷7ʵg‘jÏ"ÕžEª=¹ö,RíY¤Ú3ˆµg‘jÏ"ÕžEª=ƒX{©ö,RíÄÚ³Hµg‘jÏ"ÕžA¬=‹T{¡öŒaíY¤Ú³Hµg‘jÏ ÖžEª=‹T{©ö bíY¤Ú³HµgkÏ"ÕžEª=‹T{±ö,RíY¤ÚskÏ"ÕžEª=‹T{©ö¬QíY¤Ú3ˆµgÑÛþF¹ö,RíÄÚ³Hµg‘jÏ"ÕžA¬=‹T{©ö bíY¤Ú³Hµg‘jÏ ÖžEª=‹T{©ö¬yߟ(Öž5ª=ƒX{©ö,RíÄÚ³Hµg‘jÏ"Õžƒ\{©ö,RíY¤Ú3ˆµg‘jÏ¢çþD¹ö,RíY¤Ú³HµgkÏ"Ôž5ª=ƒT{Ö¨ö,RíY¤Ú3ˆµg‘jÏ"ÕžA¬=‹T{¡ö¬QíÄÚ³Hµg‘jÏ"ÕžA¬=‹T{©ö úÔ”g‘âÎ"į~ÛɵçמE¨=kT{±ö,RíY¤Ú³HµgkÏ"ÕžEª=ƒT{Ö¨ö,zùÛvª=ƒX{©ö,RíÄÚ³èm­\{©ö bíY„Ú³FµgjÏÖžEª=‹T{±ö,RíY¤Ú³HµgkÏ"Ôž5ª=±ö¬yß+מEª=ƒX{©ö,RíÄÚ³Hµg‘jÏ"ÕžA¬=‹P{Ö¨ö,RíÄÚ³Hµg‘jÏ ÖžEª=‹T{¡öŒaíY´þycíÄÚ³Hµg‘jÏ"ÕžA¬=‹^מ/BÎ~¥?ƒX{©ö,RíY„ÚsŒkÏ"ÕžEª=‹T{±ö,RíY¤Ú3ˆµgjÏÕžE¨=cX{©ö,RíÄÚ³Hµg‘jÏ"ÕžA¬=‹T{©ö bíY„Ú³Fµg‘jÏ ÖžEª=‹T{©ö bíY¤Ú³µģjÏ¢ýŒjÏ"Õžƒ\{©ö,RíÄÚ³Hµg‘jÏ"ÕžA¬=‹T{¡öŒaíY¤Ú³è_ür«kÏ ÖžEª=‹T{±ö,BíY£Ú³µg kÏ"ÕžEª=‹T{±ö,RíY¤Ú3ˆµg‘jÏ"ÕžEª=ƒT{Ö¨ö,Ríy¡¥ö,zÿ«ÚóOM÷½ö¼ÿ žÔÚ3èÿ}“:µ'.ÚS—Z{êRkÏ×—¾ÕžB­=_Ü·ÚS—Z{âÒ©=qéÔžB­=Ní)ÔÚS¨µ§PkOüZ{âЩ=u¨µ'.ÚS¨µ'>®µ§µöÄ¡S{âÒ©=u©µ'.Ú—Ní©K­=…Z{âãNí‰K§öÔ¥ÖžºÔÚ—Ní‰K§öjí ôÙÚS¨µ§PjO™Öž¯ßjÏ×—¾ÕžDù˰>®µ§.µöä¥Ôž¼”ÚS—Z{êRjOJí©C­=u©µ'QjO~\jO]jí©K­=y)µ'/¥öjíI”¿ ¥öjíI”ÚS?‚Öž¼”ÚS¨µ'Ñm}£¾ÕžúÆ[{êRkO^JíÉKS{êPkOjíÉK©=qéÔžD©=ñq§öä¥ÔžºÔÚS—Z{¥öjíù¿è·Ú3_õ6ÿÄÓ·õÑúV{êgÒÚS—Z{òRjO^úÜ­S{êãZ{òÒs´Ní©K©=yè¾?Z§öÔ¥ÖžºÔÚ“è±?Z§öÔ¥Öž¼tß­S{ µö$úØ­S{ µö$Jí©AkO^zþx´~¹tjO\:µ'Ñc´Ní©K­=u©µ'/=×GëÔž:ÔÚ“—îû£ujO]jí©K­=‰û£ujO]jíItß­S{ µö$úØß¨S{êGÐÚS—Z{òÒm£Ní©K­=‰>ö7êÔž¼ô¹¿Q­=u¨µ'=÷7êÔžºÔÚ“—R{òÒçþFÚwjO^Jí©K­=u©µ'Ñ}£Ní)ÔÚ“èc£Ní©AkO]jíÉK÷oÔ¯—žûujO}\kO^z¬oÔ©=u¨µ'/Ýö7êÔžºÔÚS—Z{Ý÷7êÔžºÔÚS—Z{òÒs£NíIô¾¿Q§ö$úÜߨS{êGðù±¿Q§öÄ¥S{âÒ©=y龿Q§öÔÇ¥öÔ¡Öž<ôØß¨S{êRkO^ºíoÔ©=…Z{}ìoÔ©=õ·öÔ¥ÖžD·ý:µ§PkO¢÷ý:µ§~­=u©µ§.µöä¥Ç7ê·K©=u¨µ'Ñ}}¢Ní©C­=u©µ'/=ö'êÔžºÔÚ“èöã‰ú=÷'êÔžøÆOíÉKOÔ¯—>÷'êÔžD·ý‰:µ§PkO}ã­=yé¾?Q§öÔ¥Öžº”Ú“‡û ÕÚSÖÚ“‡îû ujO]jí©K­=y)µ§.µöÔ¥ÖžDS{Ò<÷êÔžú¾[{òÒc Ní)ÔÚ“è¶?P§öÔ¥ÏÿìÔ©=yé¾?P;9ôê7¢¾Õž¸Üړ汿X§öÔ¥Öž¼tß_¬S{êRkO]jíÉKýÅjíIó¾?XS{ê›ní©3­=‰>ö×êÔžB­=õ·öä¥ÛþZÚS—Z{êRjOºÿx­~=ôùÏö¢Ú“è¶¿V§öÔ¥ÖžºÔÚ“—îûkujO]jíIô±¾V§öjíIó¾?V§öÄàÔžºÔÚ“(µ'Ñc¬Ní©o¼µ'/ÝöÇêÔžºÔÚS—R{òÐ}œNí©Okí©K­=yé¹?N§öÔ¥Öž¼tß§Öž2­=‰Ö?o­=…Z{ê?~kO^ºïÓ©=ÿ½j4ç+›€ê|Pý§ií©K­=u©µ'/Ýö'«µ'Ú‡NíÉKýŸNí©kí©K­=yé¹?Y§ö$z_Ÿ¬S{}®OÖ³µ'Ñm²Ní©K­=u©µ'/Ý÷'ëÔžú¸ÖžºÔÚ“—û“ujO]JíÉC·OÖ¯‡žÿláÄ·Ú“èc²NíÉKŸû“ujO]zþü×_/=×'ëÔžDû™ûþdÚßô©=qéÔž¼ô|ùdÔÚ“è}NíÉKŸûëtjO]jíÉKõu:µ§µöä¥ñË­§öÔǵöÔ¥Öž¼ôØ_§S{êRjOºí¯SkO™ÖžD?“õWtß_§S{êÐÚS—Z{òÒsNí©kíÉK÷ýu:µ§.¥öÔ¡?ÿsý¿O­=__úV{¾¾ô­öüåÒ/ÿ¶ùßÿÏÚ}ÝöämÏ -Ûžƒ¼í9ÈÛžƒ¼íù…¶mÏAÞöämÏAÞö¼Ð²í9ÈÛžƒ¼íy¡eÛs·=yÛs·=/ämÏ1þT/0·mÏ -Ûžƒ¼í9ˆÛžc¼íy¡eÛs·=yÛóB˶ç o{ò¶ç o{^hÙöämÏAÞöämÏ -Ûžƒ¼í9ÈÛžúô¶ç o{â¶ço{~¡mÛ3ˆÛžAÜöämÏ n{qÛ3ˆÛžƒ¼í¤mÏn{ò¶g·=ƒ¸íÄmÏAÞö â¶g·=ƒ¸í9ÈÛžAÜö â¶ç o{qÛ3ˆÛžAÜöämÏ n{qÛs·=ƒ¸íÄmÏ m{Žñ¶g·=ƒ¸íy¡eÛ3ˆÛžAü¯? â¶ç o{qÛ3ˆÛžƒþrÛ3_õöþ+¿‚¸íÄmÏAÞö â¶g·=ƒ¸í9ÈÛžAÜö â¶ç o{iÛ3†ÛžAÜöämÏ ýÑZ¶=yÛ3è}´–mÏ n{ò¶g·=ƒ¸í9ÈÛžAÜö â¶g·=/´l{qÛ3ˆÛžAÜöämÏ n{iÛsŒ·=ƒ¸íÄmÏ n{ò¶g·=ƒ¸í9ÈÛžAÜö â¶g·=yÛ3ˆÛžAÜöämÏ n{qÛ3ˆÛžƒ¼íÄmÏ n{qÛs·=c¸íÄmÏAŸÜö â¶g·=ƒ¸íy¡eÛ3ˆÛžAÜöämÏ n{qÛ3ˆÛžƒ¼íÄmÏ n{ò¶g·=ƒ¸íÄmÏAÞö â¶g¶=ÇxÛ3ˆÛžAÜö zîoÔ²íÄmÏ n{qÛs·=ƒ¸íÄmÏAÞö â¶g·=ƒ¸í9ÈÛžAÜö â¶ç…–mÏ n{qÛ3ˆÛžƒ¸íÃmÏ n{ò¶gÐÛþF-ÛžAÜöämÏ n{qÛ3ˆÛžƒ¼íÄmÏ n{ò¶g·=ƒ¸íÄmÏAÞö úÐyr·=qÛ3æ}¢¼íÃmÏAÞö â¶g·=yÛ3ˆÛžAÜö â¶ç…–mÏ n{qÛ3ˆÛžƒ¼íÄmÏ n{ò¶g·=ƒ¸íÄmÏAÞö Ò¶g ·=qÛ3†ÛžAÜö â¶ç o{qÛ3ˆÛžƒ¼íÄmÏ m{ÆpÛs·=ƒ¸íÄmÏ n{ò¶g·=ƒžûµl{qÛ3ÛžiÊó2Ë”gÐë)ÏW¿Zµm{ò¶g·=ƒ¸íÄmÏAÞö â¶g·=qÛ3†ÛžA¯·"¸í9ÈÛžAÜö â¶ç o{½í¯Õ²íÄmÏAÞö Ò¶g ·=ƒ´í9ÆÛžAÜö â¶ç o{qÛ3ˆÛžAÜöämÏ õµZ¶=/ämϘ÷ý±Z¶=ƒ¸í9ÈÛžAÜö â¶ç o{qÛ3ˆÛžAÜöämÏ m{ÆpÛ3ˆÛžƒ¼íÄmÏ n{ò¶g·=ƒ¸í¤mÏ1Þö Zÿ¼yÛs·=ƒ¸íôzÛóUÈ™¯äàç ~½üü†¸í9ÈÛžAÜö â¶g¶=/³l{qÛ3ˆÛžAÜöämÏ n{=÷'kÙö Ò¶g ·=ƒ´í9ÆÛžAÜö â¶ç o{qÛ3ˆÛžAÜöämÏ n{qÛs·=ƒ´íÃmÏ n{ò¶g·=ƒ¸íÄmÏAÞö â¶g¶=ÇxÛ3h?ÃmÏ n{^hÙö â¶g·=yÛ3ˆÛžAÜö â¶ç o{qÛ3HÛžc¼íÄmÏ ñ˭˶ç o{qÛ3ˆÛžƒ¼í¤mÏn{iÛsŒ·=ƒ¸íÄmÏ n{ò¶g·=ƒ¸í9ÈÛžAÜö â¶g·=qÛ3æc–mÏ/´m{½ÿŶçŸÿ¥Ðÿ€ºö,RíÄÚ³Hµg‘jÏ"Õžƒ\{©ö,RíY¤Ú3ˆµg‘jÏ"ÕžA¬=‹T{©ö,Rí¤Ú³Fµg‘jÏ ÖžEª=‹P{Ö¨ö bíY¤Ú³HµgkÏ"ÕžEª=‹T{±ö,RíY¤Ú³HµgkÏ"ÕžEª=ƒX{©ö,BíY£ÚskσP{„Ú³HµçA¨=BíyjÏ"Õž½®=AíY¤Úó Ôž¡ö<µg‘jσP{„Úó ÔžEª=BíyÐóõÿºHµçA¨=BíyjÏ"Õž¡ö<µg‘jσP{„Úó ×µgjσP{„Ú3ˆµçA¨=Â_ˆBíY¤Úó Ôž¡ö,Bíù ½½ü7ŸÿMBÏW¡ö<µg‘jσP{„Úó ÔžEª=BíyjÏ"Õž½®=AíyjÏ"Õž¡ö<µg‘jσÞ÷G‹µçA¨=‹T{„Úó ÔžEª=BíyjσP{±ö<µçA¨=BíY¤Úó Ôž½®=kT{„Úó Ôž¡ö,RíyjσP{©ö<µçA¨=BíY¤Úó Ôž¡ö,RíyjσP{„Ú³HµçA¨=BíyjÏ"ԞǠö<µg‘jσP{„Úó ÔžA¬=BíyjÏ"Õž¡ö<µçA¨=‹T{„Úó ÔžEª=BíyjσP{©ö<µçA¯kÏÕž¡ö<µçAÏýbíyjσP{„Ú³HµçA¨=BíY¤Úó Ôž¡ö<µg‘jσP{„Ú3ˆµçA¨=BíyjÏ"ԞǠö<µg‘jσÞö7еçA¨=‹T{„Úó Ôž¡ö,RíyjσP{©ö<µçA¨=BíY¤Úó Ôž¡ö,BíyÌûþD©ö<µg‘jσP{„Ú³HµçA¨=BíyjÏ ?ÿs}¢X{„Úó ÔžEª=BíyjÏ"Õž¡ö<µçA¨=‹T{ôºö<µgjÏcP{„Úó ÔžEª=BíyjÏ"Õž¡ö<èuíy jÏ"Õž¡ö<µçA¨=‹T{„Úó çþ@±ö<µçA¨=z]{ưö<èuíy âÎ"ů~I˵çA¨=BíY¤Úó Ôž¡ö,Bíy jσ^ý¶Ý¨=‹T{„Úó ÔžEª=zÛ_+Öž¡ö,RíyÐëÚóÔž½®=kT{„Úó ÔžEª=BíyjσP{©ö<èuíy jÏ ÕžÇ¼ïkσP{©ö<µçA¨=‹T{„Úó Ôž¡ö,RíyÐëÚóÔž¡ö,RíyjσP{©ö<µçA¨=z]{Ö¨öò2Î#ǰŽÃ8ò2l#‡¼¯ŽËÈ! #/ã.r ³È1¬"/ã(r ›È1L"ǰˆü2þ7æÛ£³ôc˜CŽa yÇcØBŽa y—cBŽa9†äe\AŽùó?–3l /Ãr È1 ǰ¼ŒóÇ1¬Ç0~¼ŒÛÇ1LǨ|Âðñ2îÇ0{Ãêq £Ç˸yÃäq ‹ÇË8xÃÞq sÇ1ª¿È;ŽQë8„©ãeT:Ö°kƒ¬ñÅ/:m™ãe\9Žaä8†ãe˜8aá8æõ/˜ `ßxçcX7ŽaÜx·cÞÖ÷g)Ç0l¼Œ»Æ1ʇ°j£¨ñ"nÇ0iâñ2ǰgÜq kÆË8f£–qSÆ/ã’qÈûúü,ãfŒ—qÅ8†ã6Œ—qÂ8†ãŒcØ/^ÆùâÕ‹C/Ža»x§‹cX.Ža¸xw‹c˜-Žaµ8FÑâEÜ,ŽÙþx¹X¼ ‚ÅW-â|!&+k˜+Ža­xÇŠcØ*Žaªx—Šc*Ža§8F™âY*Å1ŒǰQÃDñ2.Ç0PÃ>ñ2ÎǨNÂ8qŒÚÄ‹8Ms[¡%L¼Œ»Ä1ÌǰJÃ(ñ2nÇ0IÃ"ñ2ǨGÂq kÄË8FÃq SÄ1,/ãq ;Ä1Ê/â qÌz„ â&ˆ_f)Ç0@Ãþð2Îǰ>Ãøp ÛÃË8=ÃòpŒÂ˸;ÃìpÌþK›Ktx7‡c˜Žaqx‡cÔan8FµáEŽak8†©á–†—qh8†áf†—qe8†‘á6†c˜^†…á†cØþ1[^8æý¯ê¯¿ù}Ë ï¹Ÿ—µ/ úßâ…N`ˆK§0Ô¥&†ºÔÆðõ¥o‘¡P+Ã×÷-3Ô¥v†¸tBC\:¥¡PSC Ó 56jm(ÔÜ?‚ö†8t‚CjqˆK'9jsˆkt¨C­qèd‡¸tºC]jxˆK§<Ä¥“êRÛC¡Æ‡ø¸SâÒÉu©ý¡.5@Ä¥S âÒI…Ú Q¨¢P2D™vˆ¯ßBÄ×—¾•ˆDù­>®-¢.5Fä¥Ôˆ¼”Q—Ú#êR‚DJ‘¨CMu©M"Q¢D~\ªD]j–¨Kíy)a"/¥LjšH”¿â%NjH”®í"/=÷Gë?­u)ù"Ý÷G댺ԂQ—š0=öGëDŒºÔŠ‘—îû£u:F¡†ŒDû£uRF¡¶ŒDoû£ujF^zþx´~¹tzF\:A#Ñc´NÒ¨Kmu©Q#/=×Gëd:Ô®‘—îû£uÊF]jÚ¨Km‰û£uêF]jÞHtß­8 µp$úØß¨Ó8êGÐÈQ—Z9òÒm£Nç¨K ‰>ö7ꤎ¼ô¹¿Qu¨µ#=÷7êôŽºÔà‘—R<òÒçþFæw¢G^Jõ¨KÍu©Ý#Ñ}£Nù(Ôô‘èc£Nü¨AëG]jþÈK÷oÔ¯—žûu H}\H^z¬oÔ‰ u¨$/Ýö7êtºÔR—ZBÝ÷7ê´ºÔR—ZCòÒs£NIô¾¿Q§ˆ$úÜߨÓDêGÐ(’—ûu²H\:]$/Ý÷7ꔑú¸¤‘:Ô6’‡ûuêH]jÉK·ý:¤P I¢ý:¤¾ñF’ºÔJ’è¶¿Q§“j(Iô¾¿Q'•Ô ­¤.5–Ô¥Ö’¼ôøñFýv)½¤5˜$º¯OÔI&u¨Í¤.5šä¥ÇþDlR—ÚMÝ~×'ëÙ`“è¶?Y'ÙÔ¥6›ºÔh“—îû“u²M}\»M]j¸ÉK)7u©é¦.¥Ýä¡Û'ë×C϶pâ[¾Iô±?Y'àä¥ÏýÉ: §.=þ‚믗žë“u*N¢ýÌýå“õ }î¯Ó)9q餜¼ôÜ_§s½ï¯ÓÉ9yésNЩK-:yé±¾N§éÔ¡F¼ô/~¹õdú¸vºÔ°“—ûëtÒN]JÛÉC·ýujÝ)Ó¼“èço²þŠîûët OýšxêRO^zî¯Ó©<õqÍf2ƒ¸Y¤‰Ì"mdq$³H+™EšÉ,ÒNæ ei)³HS™EÚÊ âXf‘Ö2‹4—ĽÌ" fi1³H“™AÜÌ,º½-«Ñjff3k´›Y¤áÌ"-gq:³HÛ™EÏ âzf‘æ3‹°ŸY£Í .hiB³HšEÑ âŠf‘f4‹´£Ä!Í"-iiJ³[šc<¦Y„5ÍÍiqO³HƒšEXÔg‘:ƒ¸ÐY¤‰Î"mti¤3ˆ+Ešé,ÒNg‡:‹°ÔY£©Î"muq¬³HkEšë,Ò^g;‹´ØY„ÉÎnvíg´ÚY¤ÙÎAÞí,Òpg‘–;ƒ8ÝY¤íÎ"wi½3ˆóEÚï,€g <‹4áYô/~¹Õ#žA\ñ,ÒŒg‘v<ƒ8äY„%ÏMy=××ÉcžEZó,Òœg‘ö<ƒ8èY¤EÏ"MzqÓ³H£žEZõ,Ò¬gv=k4ìY¤eÏ -ÓžEï³íùßÿÝÛs­=¹ö¼ÐR{rí9ȵç מ_h«=¹öäÚskÏ -µç מƒ\{^h©=¹öäÚskÏ ¹öãÚskÏ -µç מƒX{Žqíy¡¥öäÚskÏ -µç מƒ\{ríy¡¥öäÚskÏA®=/´Ôžƒ\{ríy¡¥öäÚskÏ1®=¿ÐV{±ö bí9ȵgkÏ ÖžA¬=¹ö RíÃÚskÏ ÖžA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgkÏ ÖžAª=Ǹö bíÄÚóBKíÄÚ3ˆ!bí9è?¬=ƒX{±öäÚ3èíå¿ùüV{æ«X{±öäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgjÏÖžA¬=¹ö bíÄÚskÏ ÷ýÑZjÏ Öžƒ\{±ö bí9ȵgkÏ ÖžA¬=/´ÔžA¬=ƒX{±öäÚ3ˆµgjÏ1®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3ˆµç מA¬=ƒX{±öÄÚ3†µgkÏA®=ƒX{±ö bíy¡¥ö bíÄÚskÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מA¬=ƒX{±öäÚ3ˆµgjÏ1®=ƒX{±ö bí9ȵgkÏ ÖžA¬=¹ö ºíoÔR{ríÄÚ3ˆµgkÏA®=ƒX{±ö¼ÐR{±ö bíÄÚsÐT{ưö bí9ȵgÐÛþF-µgkÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=±öŒyߟ(מ1¬=¹ö bíÄÚskÏ ÖžA¬=ƒX{^h©=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏ Õž1¬=±öŒaíÄÚ3ˆµç מA¬=ƒX{ríÄÚ3Hµg kÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bí¤Úó2Kít[¨¥öäÚ3ˆµgkÏ Öžƒ\{¡ö<ˆqç į~Mm«=ƒ^ÿ¶]kÏA®=ƒX{±öäÚ3èm­–Ú3ˆµç מAª=cX{©öãÚ3è¶¿VKí9ȵgkÏ ÖžA¬=¹ö RíÃÚóB®=cÞ÷Çj©=ƒX{ríÄÚ3ˆµç מA¬=ƒX{±öäÚ3Hµg kÏ Öžƒ\{±ö bí9ȵgkÏ ÖžA/kÏW!ç|!ÐohýCèÚskÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מA¬=ƒX{©ö¼ÌR{±ö bíÄÚskÏ ÖžA¬=¹ö RíÃÚ3HµçמA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3Hµg kÏ Öžƒ\{±ö bíÄÚskÏ ÖžAª=Ǹö Úϰö bíy¡¥ö º©ö bí9ȵgkÏ ÖžA¬=¹ö bí¤ÚsŒkÏ ÖžAÿâ—[—ÚskÏ ÖžA¬=¹ö RíÃÚ3HµçמA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{±ö bí9ˆµg kÏ Öž_h«=ƒÞÿªö|þóß¿jlµç מZjÏA®=¹öäÚó mµç מƒ\{ríy¡¥öäÚskÏ -µç מƒ\{ríy!מc\{ríy¡¥öäÚskÏ1®=/´Ôžƒ\{ríy¡¥öäÚskÏA®=/´Ôžƒ\{rí9ȵ煖ÚskÏA®=/´Ôžƒ\{bí9ƵçÚjÏ ÖžA¬=¹ö bíÄÚ3ˆµç מAª=cX{ríÄÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3HµçמA¬=ƒX{^h©=ƒX{ñ/ÄA¬=¹ö bíÄÚskÏ ·—ÿæó[홯bíÄÚskÏ ÖžA¬=ƒX{rítÛ­¥öäÚ3Hµg kÏ Öžƒ\{±ö bí9ȵgÐûþh-µgkÏA®=ƒX{±öäÚ3ˆµgkÏ ÖžZjÏ ÖžA¬=ƒX{ríÄÚ3HµçמA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíôÔÿ¢bkÏ ÖžA¬=ƒX{bíÃÚ3ˆµç מA¬=ƒX{±ö¼ÐR{±ö bí9ȵgkÏ ÖžA¬=¹ö bíÄÚskÏ ÖžA¬=ƒX{ríÄÚ3HµçמA¬=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{Ýö7j©=¹ö bíÄÚ3ˆµç מA¬=ƒX{^h©=ƒX{±ö bí9ˆµg kÏ Öžƒ\{½íoÔR{±öäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgkÏ ÖžA¬=¹ö bíÄÚskϘ÷ý‰ríÃÚskÏ ÖžA¬=¹ö bíÄÚ3è¹?QKíÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{©öŒaí9ˆµg kÏ ÖžA¬=¹ö bíÄÚskÏ ÖžAª=cX{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ Õž—YjÏ Ûú@-µç מA¬=ƒX{±öäÚ3ˆµgkÏAœòŒaÜôê—ë^ý¶ÛV{ríÄÚ3ˆµç מAoûkµÔžA¬=¹ö RíÃÚ3HµçמA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒT{ưö¼kϘ÷ý±ZjÏ Öžƒ\{±ö bí9ȵgkÏ ÖžA¬=¹ö RíÃÚ3ˆµç מA¬=ƒX{ríÄÚ3èuíùªäÌWjðsŒkÏ õ¡kÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bí¤Úó2KíÄÚ3ˆµgkÏA®=ƒX{±öäÚ3Hµg kÏ Õžc\{±ö bí9ȵgkÏ ÖžA¬=¹ö bíÄÚskÏ Õž1¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{©öãÚ3h?ÃÚ3ˆµç…–Ú3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Õžc\{±ö ú¿ÜºÔžƒ\{±ö bí9ȵgjÏÖžAª=Ǹö bíÄÚ3ˆµç מA¬=ƒX{ríÄÚ3ˆµgkÏA¬=cX{±öüB[íôþ7µçŸÿ§åí{íyÿ*þ8ÔÚ3èû79èÔž¸tjO]jí©K­=__úV{ µö|ýqßjO]jí‰K§öÄ¥S{ µö:µ§PkO¡ÖžB­=ñ#hí‰C§öÔ¡Öž¸tjO¡Öžø¸Öž:ÔÚ‡Ní‰K§öÔ¥Öž¸tjO\:µ§.µöz¦öÄÇÚ—Ní©K­=u©µ'.Ú—Ní)ÔÚèÔžB­=…R{Ê´ö|ýøV{¾¾ô­ö$Ê_†õq­=u©µ'/¥öä¥ÔžºÔÚS—R{òPjOjí©K­=‰R{òãR{êRkO]jíÉK©=y)µ§PkO¢üe˜(µ§PkO¢Ôžú´öä¥ÔžB­=‰nëõ­öÔ7ÞÚS—Z{òRjO^šÚS‡Z{êPkO^Jí‰K§ö$Jí‰;µ'/¥öÔ¥ÖžºÔÚ“(µ§PkO¢·ù7ŸÿE¿ÔžýªÛúh}«=õ3ií©K­=y)µ'/}îÖ©=õq­=yé¹?Z§öÔ¥Ôž×'ëÙÚ“è¶?Y§öÔ¥ÖžºÔÚ“—îû“ujO}\kO]jíÉKýÉ:µ§.¥öä¡Û'ë×C϶pâ[íIô±?Y§öä¥ÏýÉ:µ§.=þ‚믗žëëtjO¢ýÌ}Ní‰oúÔž¸tjO^Jí©K­=‰Þ÷×éÔž¼ô¹¿N§öÔ¥Öž¼ôX_§S{êPkO^ú¿ÜzjO}\kO]jíÉKýu:µ§.¥öä¡Ûþ:µö”iíIôó7YE÷ýu:µ§~­=u©µ'/=÷×éÔžú¸Öž¼tß_§S{êRjOjíÉCõuúV{¾¾ô­öüåÒ/ÿ´õõׯeÛ3ˆÛžƒ¼íÄmÏ n{qÛóB˶g·=ƒ¸íÄmÏAÞö â¶g·=yÛ3ˆÛžAÜö â¶ç n{ÆpÛ3ˆÛžƒ¼íÄmÏ m{ÆpÛs·=ƒ¸íÄmÏAÞö â¶g·=ƒžÚöämÏ n{qÛ3ˆÛžƒ¼íÄmÏ n{ò¶g·=ƒ´íÃmÏ -ÛžEÚö,Ò¶g·=‹´íY¤mÏ"m{qÛ³Ûž5Úö â¶g‘¶=‹´íY¤mÏ n{iÛ³HÛžEÚö â¶g‘¶=‹´íÄmÏ"m{iÛ³HÛžAÜö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{aÛ3†ÛžEÚö,Ò¶ç o{iÛ³HÿõGEÚö â¶g‘¶=‹´íÄmÏ¢·þbÛ³_¥mÏ"m{qÛ³HÛžEÚö,Ò¶g·=‹´íY¤mÏ n{aÛ³FÛžEÚö â¶g‘¶=‹´íÄmÏ¢÷ýÑò¶g‘¶=ƒ¸íY¤mÏ"m{qÛ³HÛžEÚö,Ò¶ç o{iÛ³HÛžEÚö â¶gQjO^¶g ·=‹´íY¤mÏ"m{qÛ³HÛžEÚö â¶g‘¶=‹´íY¤mÏ n{iÛ³HÛžAÜö,Ò¶g‘¶=‹žø¯¥ â¶g‘¶=‹´íY¤mÏ m{ÖhÛ³HÛžAÜö,Ò¶g‘¶=‹´í9ÈÛžEÚö,Ò¶g·=‹´íY¤mÏ"m{qÛ³HÛžEÚö â¶g‘¶=‹´íY¤mÏ n{iÛ³Ûž1Üö,Ò¶g‘¶=‹´íÄmÏ"m{iÛ³HÛžAÜö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{iÛ3ˆÛžEÚö,Ò¶ç o{iÛ³HÛžEÚö Ò¶g¶=‹´íÄmÏ¢·ýò¶g‘¶=ƒ¸íY¤mÏ"m{iÛ3ˆÛžE·ýò¶g·=‹´íY¤mÏ"m{qÛ³HÛžEÚö Ò¶gÍûþDqÛ³FÛžAÜö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{=÷'ÊÛžEÚö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{qÛ³HÛžEÚö,Ò¶g·=‹°íY£mÏ m{ÖhÛ³HÛžEÚö â¶g‘¶=‹´íÄmÏ"m{aÛ³FÛžAÜö,Ò¶g‘¶=‹´íÄmÏ"m{iÛ3ˆÛžEÚö,Ò¶g¶=ÇxÛ³Ûž5Úö â¶g‘¶=‹´íY¤mÏ n{iÛ³HÛžAÚö¬Ñ¶gÑË)… MyqʳSž¯~¹nÙö â¶gÑÛþZyÛ³HÛžAÜö,¶g¶=‹°íÃmÏ"m{iÛ3ˆÛžEÚö,Ò¶g‘¶=ƒ¸íY„mÏm{â¶gÍûþXyÛ³HÛžAÜö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{iÛ3ˆÛžEØö¬Ñ¶g‘¶=ƒ¸íYtÛ_+o{aÛóUÈ™¯ÔàgÑëÁÏoÛž1Üö,ZÿrÛ3ˆÛžEÚö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{qÛ³HÛžEÚö,¶ço{iÛ³HÛžEÚö â¶g‘¶=‹´íÄmÏ"l{ÖhÛ³Ûž1Üö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{iÛ3ˆÛžEÚö,Ò¶g·=‹°íY£mÏ"m{qÛ³HÛžEÚö,Ò¶g·=‹´íY„mÏn{íg´íY¤mÏAÞö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{iÛ3¨µ§.qÛ³Ûž1Üö,Ò¶gÑ¿øåVo{qÛ³HÛžEÚö â¶g¶=k´íY„mÏn{iÛ³HÛžEÚö â¶gÑ ÛžEÚö â¶g‘¶=‹´íY¤mÏ m{ÖhÛ³HÛžZ¶=‹ÞÿjÛó¿ÿ·ïm­=¹ö¼ÐR{rí9ȵç מ_h«=¹öäÚskÏ -µç ÿþŸ)þX ríy¡¥öäÚskÏA®=/äÚsŒkÏA®=/´Ôžƒ\{bí9Ƶ煖ÚskÏA®=/´Ôžƒ\{rí9ȵ煖ÚskÏA®=¹ö¼ÐR{rí9ȵ煖ÚskÏA¬=ǸöüB[íÄÚ3ˆµç מA¬=ƒX{±öäÚ3Hµg kÏA®=ƒX{±ö bí9ȵgkÏ ÖžA¬=¹ö bíÄÚskÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מA¬=ƒX{©öãÚ3ˆµgkÏ -µgkÏ þ…8ˆµç מA¬=ƒX{ríô¦ó zwþ–„æ«X{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3Hµg kÏ Öžƒ\{±ö bí9ȵgÐûþh-µgkÏA®=ƒX{±öäÚ3ˆµgkÏ ÖžZjÏ ÖžA¬=ƒX{rítû¿¦¤ÚsŒkÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ ÖžA¬=±öŒaíÄÚskÏ ÖžA¬=ƒX{^h©=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgkÏ ÖžA¬=¹ö bí¤ÚsŒkÏ ÖžA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{±ö bíy¡¥ö bíÄÚ3蹿Q®=cX{±öäÚ3èm£–Ú3ˆµç מA¬=ƒX{±öäÚ3è¶¿QKí9ȵgkÏ ÖžA¬=¹ö bíÄÚskϘ÷ý‰ríÃÚskÏ ÖžA¬=¹ö bíÄÚ3ˆµç…–Ú3ˆµgkÏ Öžƒ\{±ö bí9ȵgkÏ ÖžA¬=¹ö RíÃÚskÏÖžA¬=ƒX{ríÄÚ3ˆµç מA¬=ƒT{ưöäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgkÏ ÖžAª=/³ÔžAª=cX{ríÄÚ3ˆµgkÏA®=ƒX{±öÄÚ3†µgÐë_®‹xîÓR{¡ö<ˆqç ů~Mo«=ƒX{±öäÚ3Hµg kÏ Õžc\{±ö bí9ȵgkÏ ÖžA¬=¹ö RíÃÚóB®=cÞ÷Çj©=ƒX{ríÄÚ3ˆµç מA¬=ƒX{±öäÚ3Hµg kÏ Öžƒ\{±ö z]{¾ 9ç+‘€~C¬=ƒX{©öãÚ3hýCèÚskÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מA¬=ƒX{©ö¼ÌR{±ö bíÄÚskÏ ÖžA¬=¹ö RíÃÚ3HµçמA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3Hµg kÏ Öžƒ\{±ö bíÄÚskÏ ÖžAª=Ǹö Úϰö bíy¡¥ö bíÄÚskÏ ÖžA¬=ƒX{ríÄÚ3HµçמA¬=ƒþÅ/·.µç מA¬=ƒX{rí¤Ú3†µgjÏ1®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏÖžA¬=¿ÐV{½ÿMíùçû°ÅžcØz^Ʃ疞czŽaçùe–Ìs +Ï1Œ<ǰñ¼ŒÏ1,<Ç0ð¼ŒûÎ1Ì;ǰîøó2l;‡0íòó2;ǰ룬s«ÎË8êæs “Î˸èàs {Î1Ì9/ãšs cÎ1l9Ç0弌KÎ1 9ǰ㼌3Î1¬8Ç(â†óË, gŒ ΜcØoÆ(ߌQ½£xs Ûͤ›!*7Ç0ÜŒQ·£l3FÕæF›1j6c”lƨØÃ`3F½fŒrÍ1¬5ckƨՌQª9†¥fŒBÍušc˜iƨҌQ¤ƒFsÍš1 4/ã>3FyfŒþóÄïa›£43Fe憙1oø×™˜¿Ê2óEª2Ç0ÊŒQ“£$3FEæ™1ê1c”cŽaƒ3D-fŒRÌ1,1cbƨÃà 3æ}}†aƨÁÃ3FfŒÌ1ì/c”_ƨ¾ŒQ|y·—1J/cT^Æ(¼Ãî2FÙe ªË!Œ.cÔ\Æ(¹ŒQq9æÏÿðßG–Þ2F¹åÖ–1Š-cÔZÆ(µÃÒ2F¡eŒ:Ë1Ì,cTYÆ(²ŒQc9†‰eŒ Ë–1ê+Ç(¯ Q]£¸r ÛÊ¥•1*+cV^Æ]eŒ²ÊU•cUƨ©ŒQR£¢r ƒÊõ”1Ê)ǰ¦ŒQL£–2F)å–”1 )cÐQaF£Š2FeŒÊ1L(cTPÆ( ŒQ?9†ùdŒêÉÅ“cØNÆ(ŒQ9£pr »Ée“1ª&/ãh2FÍdŒ’ɘçúê0˜ Q/£\r kɘ·õÕq+£Tr KÉ…’1ê$c”IŽa%£H2Fä&’1*$cHƨÃ<2FudŒâÈ1j#CÞ×G‡edˆÂÈ1ì"c”EƨŠÃ(2FMdŒ’È‘—q£2F9dŒjÈ1Œ!cÔBÆ(…Ã2F!dŒ:Èecþüíg¨2D ä%!* c@ƨÃü1FõcŒâÇ1lc”>Æ | Qø8†ÝcŒ²ÇU1ŠǰyŒQò£âq ƒÇõŽ1ÊcP;^ıc ZÇ¥ŽcX:Æ(tŒQç£Ìq +ÇEŽ1jÇ(q Qáóò÷Éžësã¼1FucŒâÆ1®Œy{ýܼøÅµ¥lŒQØ8†]c ²ÆU1ˆ‡°iŒQÒ£¢q ƒÆõŒ1ÊcT3Žã–1D)ãeX2†¼¯Ï;ÆeŒcX1Æ(bŒQÃ8† cŒ ÆŒ1êÇ0_ŒA½¢x1Fí⤋/‚Ã|¡rÆmWŽa·£l1FÕb ¢Å!lc¶?s,Ç0XŒQ¯£\1FµâÆŠ1jc”*Ža©£P1Fb 2Å‹¸RŒQ¤£F1F‰âŠ1 cÔ'Žažƒ:1Dqb ÚÄ!ïJcT&Æ(LÃ.1FYbŒªÄE‰cØ$Æ(IŒQ‘8†Ab zÄåˆ1ªÇ0FŒQ‹£1F%ↈ1êc!a…³Qƒ£ñ2.c ƨ?Ãü0FõaŒâõ‡c˜ƨ<ŒAx8„ÝaŒ²Ã˜ý—6Žas£ä0FÅá‡1è C”Æ 6ÂØ0F­aŒRÕ†cƨ3ŒQf8†•aŒ"Ã5†1J Ǩ0 Q`£¾ðË,yaÌû_Õ…_¯Á·¼ðþ'‘ûyyPû ÿ÷-^膸t C]jb¨Km __ú µ2|ýqß2C]jgˆK'4Ä¥S 55:­¡PcC¡Ö†BÍ ñ#xOoˆC'8Ô¡‡¸t’C¡6‡ø¸F‡:Ôê‡NvˆK§;Ô¥†‡¸tÊC\:é¡.µ=j|ˆ;õ!.üP—ÚêRD\:".Q¨ "Љ…Z! %C”i‡øú'ð-D|}é[‰H”¿ÑêãÚ"êRcD^JÈKÉu©=¢.%H䡉:Ô$Q—Ú$%JäÇ¥JÔ¥f‰ºÔ.‘—&òRÊD¡¦‰Dù+.QâD¡Ö‰DÉõ#hŸÈK …Z(ÝÖ7ê[£¨o¼‘¢.µRä¥dм4¢5TÔ¡–м”T—N«H”XwjE^J®¨Kíu©Á"QŠE¡&‹Doó¯9D·—oÔoÑb¾*Õ¢~&Íõùíy)á"/}îÖIõqmyé¹?Z§^Ô¥ä‹îD¼”êQ—š=êR»G¢ûþFòQ¨é#ÑÇþFøQ?‚ÖºÔü‘—î?Þ¨_/=÷7êú¸&¼ôXߨAêP+H^ºíoÔé u©!¤.µ„$ºïoÔi!u©1¤.µ†ä¥çþF’è}£NIô¹¿Q§‰Ô Q$/=ö7êd‘¸tºH^ºïoÔ)#õqI#u¨m$=ö7êÔ‘ºÔ<’—nûuI¡’DûuI}ã$u©•$Ñm£N')ÔP’è}£N*©A[I]j,©K­%yéñãúíRzIj0It_Ÿ¨“LêP›I]j4ÉKý‰:Ù¤.µ›$ºýx¢~EÏý‰:é$¾ñÓNòÒãÇõë¥Ïý‰:ù$Ñm¢N@)Ô‚RßxJ^ºïOÔ‰(uéÏ߸׿ûd”<ôØ_¨†”ú°–”×'ëÙ`“è¶?Y'ÙÔ¥6›ºÔh“—îû“u²M}\»M]j¸ÉKýÉ:é¦.¥Ýä¡Û'ë×C϶pâ[¾Iô±¿N'àä¥Ïýu: §.µáä¥çú:Š“h?sß_§râ›>%'.”“—žûëtbN¢÷ýu:9'/}î¯Ó :u©E'/=Ö×é4:Ô¨“—þÅ/·ž¬S×®S—vòÒcNÚ©Ki;yè¶¿N­;ešwýüMÖ_Ñ}Ná©@O]jãÉKÏýu:•§>®™'/Ý÷×鄞º”ÒS‡šzòÐc}¾Åž¯/}«=ÿÝ¿ë<ÿ4-Û˜ä ¯I^h™“ä=ÉA”äEÉ/´MJò¦ä Jòªä…–YÉAÞ•äaÉ -Ë’ƒ<-9ÈÛ’ƒ<.y¡w®KŽñ¼ä ïK^h˜ä…ÉAœ˜ãÉ -#“ƒ¼29È3“Zv&yhr—&yjòBËÖä MòÚä ÏM^hÙ›äÁÉA^œ¼Ð299È›“ƒ8:9Æ«“_h› âîd‡'yy2ˆÓ“AÜž âøä ¯Oi~2†û“ƒ<@ÄÊ NPqƒrG(ƒ¸BÄÊ îPòePþ2LÄ)ÊAÞ¢ âe×(ƒ8G9È{”A¤ â"å ORq“2ˆ£”AZ¥ãYÊ îRq˜òBË2e§)ƒø_sÄqÊA^§ âÆ(}ŒAù¢ðq »Çe1ªc=Žaó£ä1FÅã1êc”;Æ v¼ˆcÇ´Ž!JǰtŒQè£Î1F™ãVŽ1ŠcÔ8ŽQâ¢Â1æåoü1FucŒâÆ1lcÞÖçÆecŒÂÆ1ìc^g%ˆ_ü®£Æ!lc”4ƨhà1F=cŒrÆÕŒc3Æ e QÊx–Œ!ïëóãŽ1FãVŒ1ŠcÔ0Ža£‚1FcŒúÅ1Ìc^Ö‹/ÂÄ|Ýë¢ñµ‹c>”.ƨ\ŒQ¸8†ÝbŒ²ÅU‹1ˆ‡°YŒÙþ̱XÃ`1F½bŒrÅÕŠc+ƨUŒQª8†¥bŒBÅuŠ1È/âJ1F‘bŒÅ%ŠcX(Æ(PŒQŸ8†yb êÄʼn1h‡0MŒQ™£0q »Äe‰1ªc%Ža“£$1FEâ‰1èC”#ƨFÃ1F-bŒRÄ•ˆc"ƨCŒA†8„bÌzD bŒÄ˸@ŒQ€£þp óÃÕ‡1ŠcÔŽaz£ò0ááv‡1Êcö_Útt8†ÍaŒ’ÇcÆ 7 QnƒÚpcõ†1J cTŽah£Î0F™áV†1Š cÔÆ(1£Â0DaŒúÂ/³ä…1ïU~ýsÍ·¼ð·™Ê ö…¿ ^:!.ÂP—šêRÃ×—¾E†B­ _Ü·ÌP—ÚâÒ q锆BM Nk(ÔØP¨µ¡PsCüÚâÐ u¨Å!.äP¨Í!>®Ñ¡µ:Ä¡“âÒéu©á!.ò—Nz¨Km…âãN}ˆK'?Ô¥ö‡ºÔ—NˆK'Ajƒt"D¡VˆB÷öCí_ÿ¾…ˆ¯/}+‰ÿì×Q—#òÒýŸíOï·Q—Ú#êR‚DJ‘¨CMu©M"Q¢D~\ªD]j–¨Kíy)a"/¥LjšH”¿â=±ÎÔ:‘(y¢~íy)¢P E¢ÛúF}kõ7RÔ¥Vм”L‘—>ÿYÿ`6TÔ¡–м”T—N«H”XwjE^J®¨Kíu©Á"QŠE¡&‹Doó¯9D·—oÔoÑb¾*Õ¢~&Íõùíy)á"/¥\úxÛ­Ó.òÒs´N½¨KÉyè¾?Z'`Ô¥ŒºÔ„‘è±?Z'bÔ¥VŒ¼tß­Ó1 5d$úØ­“2 µe$zÛ­S3òÒóÇ£õË¥Ó3âÒ ‰û£u’F]jÓ¨Kyé¹>Z'kÔ¡v¼tß­S6êRÓF]jÛHôØ­S7êRóF¢ûþhÀQ¨…#ÑÇú«o£~u©•#/Ýö7êtŽºÔБèc£NêÈKŸûÕØQ‡Z;òÐs£Nï¨K y)Å#/}îoÔiñq'zä¥TºÔìQ—Ú=Ý÷7ê”BM‰>ö7êÄú´~Ô¥æ¼tÿñFýz鹿Q§€ÔÇ5ä¥ÇúFR‡ZAòÒm£N©K !u©%$Ñ}£N ©K!u©5$/=÷7êôDïûuŠH¢Ïý:M¤~"y)U$.,—NÉK÷ý:e¤>.i¤µä¡ÇþF:R—šGòÒm£N )ÔB’èc£N#©o¼‘¤.}¼íoÔÉ$‰žûuBI¢÷ý:©¤~m%u©±¤.µ–ä¥Ç7ê·Ké%u¨Á$Ñ}}¢N2©Cm&u©Ñ$/=ö'êd“ºÔn’èöã‰ú=÷'ꤓøÆO;ÉKOÔ¯—>÷'êä“D·ý‰:¥P J}ãM(y) %/}îOÔ©(u)%=öª!¥>¬%%Ý÷ê´”ºÔ˜R—ZSòRrJ]jO©K *‰¦¨¤yîÔi*õ}7ªä¥Çþ@¬R¨]%Ñm NY©KM+u©m%/Ý÷ªu%¼‡ÚWÒ<öê–ºÔÄ’—îûu"K]je©KÍ,yé±?P -iÞ÷÷iRK}Óm-u¦±%ÑÇþ8ÜR¨½¥¾ñ—¼tÛ§“\êR›K]JtÉC÷Ó¯‡>ÿÙ°“Yþ‚^ý2ã·ðRßòRŸßôR—Ú^òÒ}­N}©KÍ/‰>Ö×ê˜@-0iÞ÷Çê4˜øœS—Za%Ã$zìÕ 1õ·Ää¥ÛþXS—cþï¥W¥e¾òãŸõÇÒ“èsÂN©K·ý ;I¦.µÉÔ¥F™¼tߟ°f™2í2‰Ö?„-3…šfê?~ÛL^ºïOØ©3…šg¥ÏÔ7Þ@S—ZhêRM^ºíoX#M:•&L“—û?!œPS×RS—šjòÒs²N¬Iô¾>Y'×$ú\Ÿ¬gƒM¢ÛþddS—ÚlêR£M^ºïOÖÉ6õqí6u©á&/=ö'뤛º”v“‡n?^§_=ÿÙ‰où&ÑÇþ:€“—>÷×é$œºôüù ®¿^z®¯Ó©8‰ö3÷ýu:!'¾éSrâÒI9y鹿N'æ$JÍ©kÎÉKŸûët‚N]jÑÉKõu:M§5êä¥ñË­'ëÔǵëÔ¥†¼ôØ_§“vêRÚNºí¯SëN™æD?“õWtß_§SxêÐÄS—ÚxòÒsNå©kæÉK÷ýu:¡§.¥ôÔ¡¦ž<ôX_§o±çëKßjÏ÷$_áËV{ríy¡¥öäÚsеç מ_h«=¹öäÚskÏ -µç מƒ\{^h©=¹öäÚskÏ ¹öãÚskÏ -µç מƒX{Žqíy¡¥öäÚskÏ -µç מƒ\{ríy¡¥öäÚskÏA®=/´Ôžƒ\{ríy¡¥öäÚskÏ1®=¿ÐV{±ö bí9ȵgkÏ ÖžA¬=¹ö RíÃÚskÏ ÖžA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgkÏ ÖžAª=Ǹö bíÄÚóBKíÄÚ3ˆ!bí9ȵgkÏ Öžƒ\{½éß|‚nU{æ«X{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3Hµg kÏ Öžƒ\{±ö bí9ȵgÐûþh-µgkÏA®=ƒX{±öäÚ3ˆµgkÏ ÖžZjÏ ÖžA¬=ƒX{ríÄÚ3HµçמA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=ƒX{bíÃÚ3ˆµç מA¬=ƒX{±ö¼ÐR{±ö bí9ȵgkÏ ÖžAŸûµÔžA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{©öãÚ3ˆµgÐm£–ÚskÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מA¬=ƒX{±öäÚ3ˆµgkÏ -µgkÏ ÖžA¬=±öŒaíÄÚskÏ ·ýZjÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3ˆµç מA¬=ƒX{bíó¾?Q®=cX{ríÄÚ3ˆµç מA¬=ƒX{±ö¼ÐR{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3ˆµç מAª=cX{bíÃÚ3ˆµgÐçþB-µgkÏ Öžƒ\{±ö RíÃÚskÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מA¬=ƒX{©ö¼ÌR{©öŒaí9ȵgkÏ ÖžA¬=¹ö bíÄÚskÏÖžA¯¹.‚µç מA¬=ƒX{ríô¶?NKíÄÚskÏ Õž1¬=ƒT{ŽQíyãΠį~-r«=ƒX{±ö bí9ȵgjÏÖžríó¾?VKíÄÚskÏ ÖžA¬=¹ö bíÄÚ3èuíù*䜯Dú ©öŒaíÄÚskÏ ÖžA¬=¹ö bíÄÚ3HµçמAëBמƒ\{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3Hµçe–Ú3ˆµgkÏ Öžƒ\{±ö bí9ȵgjÏÖžAª=Ǹö bíÄÚskÏ ÖžA¬=ƒ>÷'k©=ƒX{±öäÚ3Hµg kÏ Öžƒ\{±ö bíÄÚskÏ ÖžAª=Ǹö Úϰö bíy¡¥ö bíÄÚskÏ ÖžA¬=ƒX{ríÄÚ3HµçמA¬=ƒþÅ/·.µç מA¬=ƒX{rí¤Ú3†µgjÏ1®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏÖžA¬=¿ÐV{½ÿMíùß?ÄÿoÛó·ÕР֞¿Í:µ'.ÚS—Z{êRkÏ×—¾ÕžB­=_Ü·ÚS—Z{âÒ©=qéÔžB­=þ³{ËŽ+K’lÛ#U0ÚýïØÀQ‘BÀ¦:ïWþLª(ŽÚI&–Ë©=…Z{ µöjí‰oAkO:µ§µöÄ¥S{ µöÄǵöÔ¡Öž8tjO\:µ§.µöÄ¥S{âÒ©=u©µ§PkO|Ü©=qéÔžºÔÚS—Z{âÒ©=qéÔžB­=Ní)ÔÚS(µ§LkÏ÷ßoµçûKßjO¢ç?ûǵöÔ¥Öž¼”Ú“—¾žÊåRkO]JíÉC©=u¨µ§.µö$JíÉKí©K­=u©µ'/¥öä¥ÔžB­=‰ò—a¢ÔžB­=‰R{ê[ÐÚ“—R{ µö$º¯oÔ·ÚS_xkO]jíÉK©=yijOjí©C­=y)µ'.Ú“(µ'>îÔž¼”ÚS—Z{êRkO¢ÔžB­=‰>æß|ˆîoߨ_jÏþªÔžúž´öÔç·öä¥Ôž¼ô¹?Z§öÔǵöä¥×þhÚS—R{òÐc´Ní©K­=u©µ'Ñs´Ní©K­=yé±?Z§öjíIôg´Ní)ÔÚ“èc´NíÉK¯Ö/—Ní‰K§ö$zîÖ©=u©µ§.µöä¥×úhÚS‡Z{òÒc´Ní©K­=u©µ'Ñs´Ní©K­=‰û£ujO¡ÖžDÖ¿X}«=õ-hí©K­=y龿Q§öÔ¥ÖžDö7êÔž¼ô¹¿Q­=u¨µ'½ö7êÔžºÔÚ“—R{òÒçþFÚwjO^Jí©K­=u©µ'Ñc£Ní)ÔÚ“èÏþFÚS߂֞ºÔÚ“—?Þ¨_/½ö7êÔžú¸Öž¼ô\ߨS{êÐýc£NíÉK¯ý:µ§.µö$zìoÔ©=u©µ§.µöä¥×þFÚ“è¶¿Q§ö$úÜߨS{ê[ÐÚ“—žûujO\:µ'/=ö7êÔžú¸Ôž:ÔÚ“‡žûujO]jíÉK÷ý:µ§PkO¢?ûujO}á­=u©µ'Ñ}£Ní)ÔÚ“è¶¿Q§öÔ· µ§.µöÔ¥Öž¼ôüñFýv)µ§µö$z¬OÔ©=u¨µ§.µöä¥çþDÚS—Z{Ý÷×éÔžºôúù®¿^z­¯Ó©=‰ö3ýu:µ'¾èS{âÒ©=y鵿N§ö$ºí¯Ó©=yésNí©K­=yé¹¾N§öÔ¡Öž¼ô/~¸õÔžú¸ÖžºÔÚ“—žûëtjO]º¬¯Ó©=‰^ëëtjO¢Ÿ?Éú+zì¯Ó©=õ hí©K­=y鵿N§öÔǵöä¥Çþ:ÚS—R{êPkOz®¯Ó·Úóý¥oµç/—~ù‹¯ŸÛjÏA®=/´Ôžƒ\{rí9ȵçÚjÏA®=¹öäÚóBKí9ȵç מZjÏA®=¹öäÚóB®=ǸöäÚóBKí9ȵç Öžc\{^h©=¹öäÚóBKí9ȵç מƒ\{^h©=¹öäÚskÏ -µç מƒ\{^h©=¹öÄÚsŒkÏ/´ÕžA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒT{ưöäÚ3ˆµgkÏ Öžƒ\{±ö bíÄÚsеgkÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3HµçמA¬=ƒX{^h©=ƒX{ñ/ÄA¬=¹ö bíÄÚskÏ ý›OÐûÚózwþ–„ίríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3Hµg kÏ Öžƒ\{±ö bí9ȵgÐm´–Ú3ˆµç מA¬=ƒX{ríÄÚ3ˆµgkÏ -µgkÏ ÖžA¬=¹ö bí¤ÚsŒkÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{Ý÷7j©=¹ö bíÄÚ3ˆµç Öž1¬=ƒX{ríÄÚ3ˆµgkÏ -µgkÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3ˆµç מA¬=ƒT{ŽqíÄÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{±ö bíÄÚskÏ ÖžA¬=/´ÔžA¬=ƒX{±öÄÚ3†µgkÏA®=ƒ>ö7j©=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{±ö bí9ˆµgÌm¢\{ưöäÚ3ˆµgkÏA®=ƒX{Ýõ³^A¬=/´ÔžA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgjÏÖžƒX{ưö bíÄÚskÏ ÖžA¬=¹ö bí¤Ú3†µç מA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{±ö Ríy™¥ö RíÃÚskÏ ÖžA¬=ƒX{ríÄÚ3ˆµç Öž1¬=ƒÞÿp]kÏA®=ƒX{±öäÚ3ècœ–Ú3ˆµç מAª=cX{©öãÚ3ˆµgkÏAª=bÜ„¸óÝOanµç מAª=cX{^ȵgÌm¬–Ú3ˆµç מA¬=ƒX{Bíù.ä̯|Ÿ€~C¬=ƒX{rí¤Ú3†µgkÏA®=ƒX{±öäÚ3ˆµgkÏ Õžc\{­]{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgÐ}Ã\{^f©=ƒX{±ö bí9ȵgkÏ Öžƒ\{©öŒaí¤ÚsŒkÏ ÖžA¬=¹ö bíÄÚ3ˆµç מA¬=ƒX{rí¤Ú3†µgkÏA®=ƒX{±ö bí9ȵgkÏ Õžc\{ígX{±ö¼ÐR{±ö bí9ȵgkÏ ÖžA¬=¹ö bí¤ÚsŒkÏ ÖžAÿâ‡[—ÚskÏ ÖžA¬=¹ö RíÃÚ3HµçמA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{±ö bí9ˆµg kÏ Öž_h«=ƒnU{~þ÷‡Ô¿Õž¿Í†µöüm€tЩ=qéÔžºÔÚS—Z{¾¿ô­öjíùþã¾ÕžºÔÚ—Ní‰K§öjí tjO¡ÖžB­=…Z{â[ÐÚ‡Ní©C­=qéÔžB­=ñq­=u¨µ'Ú—Ní©K­=qéÔž¸tjO]jí)ÔÚwjO\:µ§.µöÔ¥Öž¸tjO\:µ§PkO S{ µöJí)ÓÚóýwà[íùþÒ·Ú“èùÏþq­=u©µ'/¥öä¥ÔžºÔÚS—R{òPjOjí©K­=‰R{òãR{êRkO]jíÉK©=y)µ§PkO¢üe˜(µ§PkO¢Ôžú´öä¥ÔžB­=‰îëõ­öÔÞÚS—Z{òRjO^šÚS‡Z{êPkO^Jí‰K§ö$Jí‰;µ'/¥öÔ¥ÖžºÔÚ“(µ§PkO¢ù7¢ûúF}«=ÿ÷[ð[í9¿ªµ§N·öÔw·µ'/}îÖ©=õq­=yéµ?Z§öÔ¥Ôž<ôØ­S{êRkO]jíIôÜ­S{êRkO^zìÖ©=…Z{ýÙ­S{ µö$úØ­S{òÒëÇ£õË¥S{âÒ©=‰žû£ujO]jí©K­=yéµ>Z§öÔ¡Öž¼ôØ­S{êRkO]jíIôÜ­S{êRkO¢ÇþhÚS¨µ'ÑŸýÑ:µ§¾­=u©µ'/Ý÷7êÔžºÔÚ“èÏþFÚ“—>÷7ªµ§µöä¡×þFÚS—Z{òRjO^úÜߨS{âãNíÉK©=u©µ§.µö$zìoÔ©=…Z{ýÙߨS{ê[ÐÚS—Z{òÒãÇõë¥×þFÚS×Ú“—žëujOjíÉK÷ý:µ§.µöÔ¥ÖžDý:µ§.µöÔ¥Öž¼ôÚߨS{Ýö7êÔžDŸûujO} Z{òÒs£Ní‰K§öä¥ÇþFÚS—ÚS‡Z{òÐs£Ní©K­=y龿Q§öjíIôg£Ní©/¼µ§.µö$ºïoÔ©=…Z{Ýö7êÔžúÜ?÷7êÔžºÔÚ“—ž?Þ¨ß.¥öÔ¡ÖžDõ‰:µ§µöÔ¥Öž¼ôÜŸ¨S{êRkO¢û'êWôÚŸ¨S{â ?µ'/=VïBÎù•M@õ»ií©¯¡µ'/¥öÔ¥Öžº”Ú“‡ûvjO}ZkO]jíÉK¯ý ;µ§.µöä¥Çþ„µö”iíI´þqní)ÔÚS¿ýÖž¼ôØŸ°S{ µö$ú³?a§öÔ¥ÖžºÔÚ“—îûÖÚ‡Ní‰C§öä¥çþO§öÔǵöÔ¥Öž¼ôÚß°S{ÝÖ'ëÔžDŸë“õjíItߟ¬S{êRkO]jíÉKýïW§öÔǵöÔ¥Öž¼ôÜ_§S{êRjOºÿx~=ôúg '¾ÕžDö×éÔž¼ô¹¿N§öÔ¥×ÏpýõÒk}NíI´Ÿyì¯Ó©=ñEŸÚ—NíÉK¯ýu:µ'ÑmNíÉKŸûëtjO]jíÉKÏõu:µ§µöä¥ñí§öÔǵöÔ¥Öž¼ôÜ_§S{êRjOºï¯SkO™ÖžD?’õWôØ_§S{êÐÚS—Z{òÒkNí©kíÉKýu:µ§.¥öÔ¡Öž<ô\_§oµçûKßjÏõ¯ÿùËÈýsÛö â¶ç o{qÛ3ˆÛžAÜö¼Ð²íÄmÏ n{qÛs·=ƒ¸íÄmÏAÞö â¶g·=ƒ¸í9ˆÛž1Üö â¶ç o{qÛ3HÛž1ÜöämÏ n{qÛs·=ƒ¸íÄmÏ n{ò¶g·=ƒ¸íÄmÏAÞö â¶g·=yÛ3ˆÛžAÚöŒá¶ç…–mÏ"m{iÛ3ˆÛžEÚö,Ò¶g‘¶=ƒ¸íY„mÏm{qÛ³HÛžEÚö,Ò¶g·=‹´íY¤mÏ"m{qÛ³HÛžEÚö â¶g‘¶=‹´íY¤mÏ n{iÛ³HÛžAÜö,Ò¶g‘¶=‹>ßÿç“c¸íY¤mÏ"m{ò¶g‘¶=‹ôŸ?*Ò¶g·=‹´íY¤mÏ n{}üóþ¿ðU¤mÏ¢¿Úö̯â¶g‘¶=‹´íY¤mÏ n{iÛ³HÛžAÜö,¶g¶=‹>÷GËÛžEÚö,Ò¶g·=‹nû£åmÏ"m{qÛ³HÛžEÚö â¶g‘¶=‹´íY¤mÏAÞö,Ò¶g‘¶=‹´íÄmÏ"m{aÛ3†ÛžEÚö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{qÛ³HÛžEÚö,Ò¶g·=‹´íY¤mÏ n{i۳辿QÞö â¶g‘¶=‹´íY¤mÏ m{ÖhÛ³HÛžAÜö,Ò¶g‘¶=‹´í9ÈÛžEÚö,Ò¶g·=‹´íY¤mÏ"m{qÛ³HÛžEÚö â¶g‘¶=‹´íY¤mÏ n{iÛ³Ûž1Üö,Ò¶g‘¶=‹´íÄmÏ"m{iÛ³HÛžAÜö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{}îo”·=‹´íY¤mÏAÞö,Ò¶g‘¶=‹´í¤mÏm{iÛ3ˆÛžEûåmÏ"m{qÛ³HÛžEÚö,Ò¶g·=‹´íY¤mÏ n{iÛ³HÛžEÚö zhÛ³HÛžEÚö Ò¶gÍm¢¸íY£mÏ n{iÛ³HÛžAÜö,Ò¶gÑÿeÿ"m{ò¶g‘¶=‹´íY¤mÏ n{iÛ³HÛžAÜö,Ò¶g‘¶=‹´íÄmÏ"l{ÖhÛ3HÛž5Úö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{qÛ³HÛžEØö¬Ñ¶g·=‹´íY¤mÏ"m{qÛ³HÛžEÚö â¶g‘¶=‹´íY„mÏ1Þö,¶g¶=ƒ¸íY¤mÏ"m{}î”·=‹´íY¤mÏ m{ÖhÛ³èí”B…¶=ƒ¸íY¤mÏ"m{qÛ³ècœ¼íY¤mÏ n{aÛ³FÛžEØöŒá¶g‘¶=‹´íÄmÏ"m{aÛó MyqʳSž5˜ò|÷ƒ¡Þö¬¹í•·=‹´íÄmÏ¢÷ÛžoBÎþJ ~aðóÒ¶g‘¶=‹´íÄmÏ"l{ÖhÛ³HÛžAÜö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{aÛ3æ¡mÏ¢õÏ·=ƒ¸íY¤mÏ"m{iÛ3ˆÛžEÚö,Ò¶g·=‹´íY¤mÏ"l{Žñ¶g‘¶=‹´íY¤mÏ n{iÛ³HÛžAÜö,¶g¶=‹°íÃmÏ"m{iÛ3ˆÛžEÚö,Ò¶g‘¶=ƒ¸íY¤mÏ"m{qÛ³Ûž5Úö,Ò¶g·=‹´íY¤mÏ"m{qÛ³HÛžEØöŒá¶gÑ~FÛžEÚöämÏ"m{iÛ3ˆÛžEÚö,Ò¶gÑçþ:yÛ³HÛžEØöŒá¶g‘¶=‹þÅ·zÛ3ˆÛžEÚö,Ò¶g·=‹°íY£mÏ"l{ÆpÛ³HÛžEÚö,Ò¶g·=‹´íY¤mÏ n{iÛ³HÛžEÚö Ò¶g¶=‹´íy¡eÛ³èö7Ûž×Ó¹Õžƒ\{^h©=¹öäÚskÏ/´Õžƒ\{rí9ȵ煖ÚskÏA®=/´Ôžƒ\{rí9ȵç…\{Žqí9ȵ煖ÚskÏA¬=Ǹö¼ÐR{rí9ȵ煖ÚskÏA®=¹ö¼ÐR{rí9ȵç מZjÏA®=¹ö¼ÐR{rí9ˆµçמ_h«=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{©öŒaí9ȵgkÏ ÖžA¬=¹ö bíÄÚ3ˆµç מA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ Õžc\{±ö bíy¡¥ö bíÄ¿±öäÚ3ˆµgkÏA®=ƒ>ôo>A¬=ƒþ®öœ_åÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgjÏÖžA¬==X{±ö bí9ȵgÐm´–Ú3ˆµç מA¬=ƒX{ríÄÚ3ˆµgkÏ -µgkÏ ÖžA¬=¹ö bí¤ÚsŒkÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מA¬=ƒX{±öäÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ ÖžA¬=±öŒaíÄÚskÏ ÖžA¬=ƒX{^h©=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{±ö bí9ȵgkÏ ÖžA¬=¹ö bí¤ÚsŒkÏ ÖžA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ Öžƒ\{±ö bíy¡¥ö bíÄÚ3ˆµç Öž1¬=ƒX{ríô±¿QKíÄÚskÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מA¬=ƒX{±öô`íÄÚ3ˆµç Öž1·ý‰ríÃÚskÏ ÖžA¬=¹ö bíÄÚ3ˆµç…–Ú3ˆµgkÏ Öžƒ\{±ö bí9ȵgkÏ ÖžA¬=¹ö RíÃÚskÏÖžA¬=ƒX{ríÄÚ3ˆµç מA¬=ƒîøq¯Öžƒ\{±ö bíÄÚskÏ ÖžA¬=¹ö bíÄÚ3Hµçe–Ú3Hµg kÏA®=ƒX{±ö bí9ȵgkÏ ÖžƒX{ưö zÿÃu¬=¹ö bíÄÚskÏ ýqZjÏ Öžƒ\{©öŒaí¤ÚsŒkÏ ÖžA¬=¹ö bíÄÚ3ˆµç מAª=cP{)î|÷ã[íÄÚ3ˆµç ÔžïBÎüÊ÷ è7ÄÚskÏ ÖžA¬=ƒX{rí¤Ú3†µgkÏA®=ƒX{±öäÚ3ˆµgkÏ Õžc\{­Þ\{ríÄÚ3ˆµgkÏA®=ƒX{±öäÚ3ˆµgkÏ Õž—YjÏ ÖžA¬=ƒX{ríÄÚ3ˆµç מAª=cX{©öãÚ3ˆµgkÏA®=ƒX{±ö bí9ȵgkÏ Öžƒ\{©öŒ¹ÿx~=ÄÚskÏ ÖžA¬=ƒX{ríÄÚ3HµçמAûÖžA¬=/´ÔžA¬=ƒX{ríÄÚ3ˆµgkÏA®=ƒX{©öãÚ3ˆµgпøáÖ¥öäÚ3ˆµgkÏA®=ƒT{ưö Rí9ƵgkÏ ÖžA¬=¹ö bíÄÚskÏ ÖžA¬=ƒX{bíÃÚ3ˆµçÚjÏ Û_Õžÿý Ë{^Æ­ç—YRÏ˸ô¼ŒCÏ˸óü¯Ù2Ï˸ò¼Œ#Ï˸ñü2Kâyž—qàùe–¾ó2Î;/ãºó2Ž;¿ŒÛ΋8í¼ŒËÎ/³„—q×yfqÕùe–¨ó2n:/ã¤óË,Eçet^Æ=çeœs~™¥æ¼ŒcÎ˸弌SÎ/³”œ—qÈywœ_fÉ8/ãŠó2Œ8/â†ó¿fK8ǰàÀó2î7Ç0ßÃzs ãÍ˸Ý£tsËÍË8ÜÃnsÌ]ÌV›—q´9†Íæ&›cXl^ÆÁæöšc˜k^ƵæÆšcØjŽaªy—šcjŽa§ygšcXiŽa¤9FæEœhŽa¡9†æ—YúÌ1Ì3Çð/°cg^Æm榙cXf^Æaæ˜ýëÌf™cþ®Ê¼~‘£Ì1l2Ç0ÉÃ"ó22ǰÇÃó2®1Ç(ÆÂs SÌ˸ÄÃs ;ÌË8Ãs[Ÿ¡%ÂÃó2N0ǰÀÃó2î/Ç0¿Ãúr ãË/³´—c˜^Žay9†áåeÜ]Žav9FÕåE]Žas9†Éå——qp9†½åæ–—qm9†±å¶–c˜Z^ƥ冖cØY^Æ™åV–cYŽacy'–cXXŽa`9†}åe˜Wa]9†qåeÜVŽaZ9†e冕_fé*Ç0«êò2Ž*ǰ©är ‹ÊË8¨Þr sÊ˸¦Ør [Ê1L)/ã’r CÊ1ê(/âŒr +Ê1Œ(ǰ¡¼ŒÊ1,(Ç0 Ã~ò2Î'ǰžÃxò2n'Ç0Ãrr ÃÉ˸›Ãlr «É/³D“cØLŽa29†ÅäeLa/9†¹äe\KŽùX_¥•ÃTò2.%Ç0”ÃNr 3É˸’ÃHr ÉË8‘ÃBr É1ì#/㎹ãGŸ†0|¼Œ»Ç1ÌǰzÃèñ2nÇ0yÃâñ2ǰwÃÜqŒjÇ/²ÄŽcÔ:aêx—Žc:Žaç8†™ãe\9Žaä8†ãe˜8aá8æýÏ“ `ßxçcX7ŽaÜx·c>Öçf)Ç0l¼Œ»Æ1ʇ°j£¨ñ"nÇ0iâñ2ǰgÜq kÆË8f£–qSÆ/ã™Ê!·õµa¶øæ,™1¾+¯_è!Ë1Œǰa¼ŒÆ1,Ç0`Ã~ñ2ÎǨ^Âxq ÛÅË8]Ãrq ÃÅ˸[Ãlq «Å1ŸÛ£´4‹c¶?^./ã`q {Å1ÌǰV¼ŒcÅ1lÇ0U¼ŒKÅ1 ǰS£Lñ‹,•âFŠcØ(Ža¢xŠc(ŽaŸxç‰cT'aœ8FmâEœ&Ža™8†aâeÜ%Ža–8†UâF‰—q“8†I≗q8F=âæˆcX#^Æ1ⶈc˜"Ža‰x‡ˆcØ!ŽQ†xWˆcÖ#lÇ0Aü2K8†âö‡—q~8†õáƇcØ^Æéá–‡c^ÄÝáf‡cöÚ\¢Ã˸9Ãäp ‹ÃË88£ÞpsÃ1ª /âØp [Ã1L ǰ4¼ŒCÃ1ì Ç03¼Œ+Ã1Œ ǰ1ÃÄð2, ‡00þð¿fË ÇÜþ¦.üÏÿÃýçõ-/|ü7‘ûq9¨}aÐ÷/qÐ q醺ÔÄP—Ú¾¿ô-2jeøþã¾e†ºÔΗNhˆK§4jjtZC¡Æ†B­ …šâ[ÐÞ‡Np¨C-qé$‡Bmñqu¨Õ!ì—Nw¨K q锇¸tÒC]j{(ÔøwêC\:ù¡.µ?Ô¥ˆ¸t D\: ¢PD ! µBJ†(ó™ñýwà[ˆøþÒ·‘(£ÕǵEԥƈ¼”‘—’#êR{D]JÈC)u¨I¢.µI$J”ÈK•¨KÍu©]"/%L䥔‰BM‰òW\¢Ä‰B­‰’'ê[Ð>‘—( µP$º¯oÔ·FQ_x#E]j¥ÈKÉyi:Ej¨¨C-y)©".V‘(±">îÔŠ¼”\Q—Ú+êRƒE¢‹BM‰>æ_sˆîëõ­ZüßoÁ/Õb~U³En·¨ïnÃE^úÜ­“.êãÚ.òÒk´N½¨KÉyè±?Z'`Ô¥ŒºÔ„‘è¹?Z'bÔ¥VŒ¼ôØ­Ó1 5d$ú³?Z'ejËHô±?Z§fä¥×Gë—K§gÄ¥4=÷Gë$ºÔ¦Q—5òÒk}´NÖ¨Cíyé±?Z§lÔ¥¦ºÔ¶‘è¹?Z§nÔ¥æDýÑ:£P G¢?û£uG} 9êR+G^ºïoÔéu©¡#ÑŸý:©#/}îoTcGjíÈC¯ý:½£.5x䥼ô¹¿Q§yÄÇè‘—R=êR³G]j÷HôØß¨S> 5}$ú³¿Q'~Ô· õ£.5ä¥Ç7ê×K …Z@êãš@òÒs}£N©C­ y龿Q§ƒÔ¥†ºÔ’豿Q§…Ô¥gbH]j ÉK¯ý:=$Ñm£NIô¹¿Q§‰Ô· Q$/=÷7êd‘¸tºH^zìoÔ)#õqI#u¨m$=÷7êÔ‘ºÔ<’—îûuI¡’Dö7ê4’úÂIêR+I¢ûþFNR¨¡$Ñm£N*©oA[I]j,©K­%y)¹¤.¥—Ô¡“Dõ‰:ɤµ™Ô¥F“¼ôÜŸ¨“MêR»I¢û'êWôÚŸ¨“Nâ ?í$/=N'ÀjIsÛߦÓ`âpšËÿ½ô¦¹Ì¯lt©¯¡Õ%Ñs°Nw©ßMÃK^JyÉKI/u©í¥.%¾ä¡ÇþbüRŸÖþR—`òÒk±N‚©Km0y鱿X­0eša­Þb µÄÔo¿)&/=öëĘB­1‰þì/Öé1u©A¦.µÈä¥ûþdµÉÄ¡eâЩ2yé¹ÿ‹Áé2õq 3u©e&/½ö'ë´™D·õÉ:u&Ñçúd½ÚgÝ÷'뚺ÔDS—ÚhòÒcN¥©k¦©Kí4y鹿N§ÔÔ¥¤šá&.r“—^ûëtÚM¢Ûþ:z“—>÷×éô›ºÔ€“—žëëtNjÃÉKÿâgYOÅ©kÆ©Kí8y鹿N§äÔ¥¤œö7Êã—EZ¿ âüe‘ö/‹4€Y¤Ì N`i³H#˜A\Á,Ò f‘v0‹4„Ä%Ì"Mai 3Hc˜5·ý‰âfö0ƒ8ˆY¤EÌ"Mbq³H£˜EZÅ,Ò,æ ïbi³H˘EšÆ â6f‘Æ1‹´ŽÄyÌ"íci ³ès¢<‘Y„Ìdi%³F3™EÚÉ,ÒPf—2‹4•Y¤­Ì Žei-³s™5ÚË â`f‘3‹4™Y¤ÍÌ Žfi5³H³™AÜÍ,Òpf‘–3‹09ÆÛ™EϬÑzfç3‹´ŸY¤Í"-hqB³HšEÑ ÒŠff4‹ÞÎ&ThH3ˆKšEšÒ,Ò–fÇ4‹>öÇÉsšEÚÓ â f5k4©Y„M͘§F5‹´ªY¤YÍ îjiX³HËšEšÖ â¶fÆ5k´®9ˆóš5·ýmâÀæA=¨™_ÉEÍ"MjiS3ˆ£šEZÕ,Ò¬f‘v5ƒ8¬Y„eÍMki[3ˆãšEZ×,Ò¼f÷5‹4°Y¤…Í"LlÆpc³hýóÆ•Í Îlig³HC›EZÚ âÔf‘¶6‹4¶ĵÍ"Ímio³ƒ›c¼¸Y¤ÉÍ"mnit3ˆ«›EšÝ,Òîf‡7‹°¼Y£éÍ"loÆp|³Hë›Ešß âþf‘8‹´ÀY¤ Î npi„³H+œAœá,Âg†8‹´ÄÄ)Î"mqiŒ³HkœAœã,Òg9c¸ÈY´ŸÑ&g‘F9y•³H³œEÚå â0g‘–9‹4ÍY¤mÎ Žsi³óœ1Üç,Ò@gÑ¿øYVOtq£³H#EZé âLgv:k4ÔY„¥ÎNui«³HcEZë zj®³H{Eì âbg‘&;‹´ÙY¤ÑÎ ­vÖh¶³H»Z†;‹nµÜùùßìÚâÎAŽ;/´ÄƒwrÜ9ÈqçÚâÎAŽ;9îä¸óBKÜ9Èqç ÇZâÎAŽ;9îä¸óBŽ;Ç8îä¸óBKÜ9Èqç ‡~yŒãÎ -qç ǃw^h‰;9îä¸sãÎ -qç ǃwrÜy¡%îä¸sãÎ -qç ǃwŽqÜù…¶¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgâÎƃw1î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î RÜ9ÆqgãÎ ÆZâÎ ÆAü qãÎAŽ;ƒw1îä¸3èCÿæĸ3ˆqç ¿Œ;ó«w1î bÜ9ÈqgãΠƃw)îŒaÜĸsãÎ ÆAŒ;9î ºíÖw1îä¸3ˆqgãÎAŽ;ƒw1î bÜy¡%î bÜĸ3ˆqç ÇAŒ;ƒwŽqÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸ3ˆqç Æ1Œ;ƒwrÜĸ3ˆqgÐçþF-qgãΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwŽqÜĸ3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎ ÆAŒ;/´ÄAŒ;ƒûµÄƒwÆ0î bÜ9ÈqgÐÇþF-qgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎ ÆAŒ;1íO”ãÎƃw1î bÜ9ÈqgãÎ ÆAŒ;/´ÄAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgâÎƃwÆ0î bÜĸsãÎ ÆAŒ;9î bܤ¸3†qç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î RÜy™%î RÜøsãÎ ÆAŒ;ƒwrÜĸ3ˆqç Æ1Œ;ƒÞÿp]ãÎAŽ;ƒw1îä¸3ècœ–¸3ˆqç ÇAŠ;cw)îã¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgâÎÆrÜsÛߦ%î úû¸s~¥ãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŠ;cw1îä¸3ˆqgãÎAŽ;ƒw1î RÜ9ÆqgÐúçÍqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î RÜy™%î bÜĸ3ˆqç ÇAŒ;ƒwrܤ¸3†qgÐçúd½w1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ Å1Œ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw)îã¸3h?ø3ˆqç…–¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ Åcw1î ú?˺ăw1î bÜ9ÈqgâÎÆAŠ;Ç8î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŒ;cw1îüB[Ütû›¸ó¿Ëk‹;ƒwrÜĸ3ˆqgãÎ -qgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwbÜø3ˆqç ÇAŒ;ƒwÆ0îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŠ;cw^h‰;‹w)î bÜY¤¸³Hqg‘âÎ ÆEˆ;kw1î,RÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEŸˆ;ƒw)î,RÜĸ³Hqg‘âÎ"Ä1Œ;‹w)î丳Hqg‘þB\¤¸3ˆqg‘âÎ"ÅAŒ;‹>ðo>EŠ;‹wý]ÜÙ_¥¸³Hqg‘âÎ ÆEŠ;‹w1î,BÜY£¸³HqgãÎ"ÅEŠ;ƒwÝöGËqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³Hqç ÇEŠ;‹w)î bÜY¤¸³qg ãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w)î,RÜôBÜY£¸³HqgãÎ"ÅEŠ;‹>÷7Êqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³qg ãÎ"ÅEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"Ńw)î,RÜY¤¸3HqgâÎ"ÅAŒ;‹>ö7Êqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3HqgÍm¢wÖ(î bÜY¤¸³HqgãÎ"ÅEŠ;‹wrÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³HqgãÎ"Ä5Š;ƒwÖ(î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w!î¬QÜĸ³Hqg‘âÎ"ÅA/ÅEŠ;‹w1î,RÜY¤¸³qçÇEˆ;kw1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒwÖ(î,zûÃuŠ;ƒw)î,RÜĸ³ècœw)î bÜY„¸³FqgâÎÆEŠ;‹w1î,RÜY¤¸³HqgãÎ"Ä5Š;1ío“ã΢÷qçAè8ß ý•Š;‹w1î,RÜY¤¸³HqgãÎ"Ä5Š;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEˆ;cw­Þw1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY„¸sŒãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqgâÎÅEˆ;cw)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w)î bÜY„¸³Fqg‘âÎ ÆEŠ;‹w)î úïÿ\/1î,BÜø³h?£¸³Hqç ÇEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEˆ;cw)î,ú?Ëê¸3ˆqg‘âÎ"ÅAŒ;‹wÖ(î,BÜø³Hqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎ Å5Š;‹w^h‰;‹nw~ý¯õßâÎǻğ§5î ú¾È ¸—NÜ©K;u©qçûKßâN¡Æï?î[Ü©K;qéĸtâN¡Æ@'îjÜ)Ô¸S¨q'¾;qèÄ:Ô¸—NÜ)Ô¸׸S‡wâЉ;qéĺԸ—N܉K'îÔ¥ÆB;ñq'îÄ¥wêRãN]j܉K¯Æ¸tâN¡Æ@'îjÜ)”¸S¦qçûïÀ·¸óý¥oq'Qþ2¬kÜ©K;y)q'/%îԥƺ”¸“‡wêPãN]jÜI”¸“—¸S—wêRãN^JÜÉK‰;…wå/ÃD‰;…w%îÔ· q'/%îjÜIt_ߨoq§¾ðƺԸ“—wòÒÄ:Ô¸S‡wòRâN\:q'QâN|܉;y)q§.5îÔ¥ÆD‰;…w}Ì¿ùÝ×7ê[Ü©oAãÎÿ½ô[Ü™_õçÇ£õëéÄú"w 5îÔÇ5îä¥×þh¸S—wòÐc´NÜ©K;u©q'Ñs´NÜ©K;yé±?Z'îjÜIôg´NÜ)Ô¸“èc´NÜÉK¯Ö/—N܉K'î$zîÖ‰;u©q§.5îä¥×úh¸S‡wòÒc´NÜ©K;u©q'Ñs´NÜ©K;‰û£uâN¡ÆDöGëÄú4îԥƼtßߨwêRãN¢?ûuâN^úÜߨÆ:Ô¸“‡^ûuâN]jÜÉK‰;yés£N܉;q'/%îԥƺԸ“豿Q'îjÜIôg£NÜ©oAãN]jÜÉKoÔ¯—^ûuâN}\ãN^z®oÔ‰;u¨q'/Ý÷7êĺԸS—w=ö7êĺԸS—wòÒk£NÜItÛߨw%îjÜ©oAãN^zîoÔ‰;qéļôØß¨wêãwêPãNzîoÔ‰;u©q'/Ý÷7êÄB;‰þìoÔ‰;õ…7îÔ¥ÆD÷ý:q§PãN¢ÛþF¸S߂ƺԸS—wòÒóÇõÛ¥Ä:Ô¸“è±>Q'îԡƺԸ“—žûuâN]jÜItÿñDýŠ^ûuâN|á'îä¥ç'ê×KŸûuâN¢ûþD¸S¨q§¾ðƼôØŸ¨wêRãN]JÜÉCÏý…jÜ©kÜÉCý…:q§.5îԥƼ”¸S—wêRãN¢‰;i^ûuâN}Ý;yé¹?P'îz}ìÔ‰;õ…7îԥƺԸ“—ûÕ¸‡N܉C;ižûuâN]jÜÉKý:q§.5îԥƼôܨÆ4·ý}š¸S_tãNiÜIôgœNÜ)Ô¸S_xãN^ºïÓ‰;u©q§.%îä¡ÇÇé×CŸÿl؉;‰îûãtâN]jÜ©K;yé±?N'îÔ¥ÆDÖÇéÄ@;inûÛtâN|NÜ©K;ÿ½‹;ó+wòüs°NÜ©ßMãN^ºïÖ‰;u©q§.%îä¡Çþb¸SŸÖ¸S—wòÒk±NÜ©K;y鱿X;ew­Þw 5îÔo¿q'/=öëÄB;‰þì/Ö‰;u©q§.5îä¥ûþd5îÄ¡wâЉ;yé¹ÿ‹Á‰;õq;u©q'/½ö'ëÄD·õÉ:q'Ñçúd½wÝ÷'ëĺԸS—wòÒcNÜ©kÜ©K;y鹿N'îÔ¥Äq'.¸“—^ûëtâN¢Ûþ:¸“—>÷×éĺԸ“—žëëtâNjÜÉKÿâgYOÜ©kÜ©K;y鹿N'îÔ¥ÄPËrg–;c¸Ü9ÈËA\î ârg—;y¹3ˆËA\îÄåÎ.w½_Nˆàrç /wq¹3ˆËƒ¼Üô±?NËrg—;y¹3HË1\î Òrç/wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ´ÜÃåÎ y¹3æ¶¿MËrg—;ýÿXî̯ärg—;y¹3ˆËA\î ârç /wi¹3†ËA\îäåÎ .wq¹s—;ƒ¸ÜÄåÎ -wŽñrgÐúçÍ˃¼ÜÄåΠÇþb-˃¼ÜÄåÎ .wòrg—;ƒ¸Ü¤åÎË,ËA\î ârg—;y¹3ˆËA\îäåÎ -wÆp¹3HËc¼ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA^î ârg—;y¹3HË1\î ârç /wq¹3ˆËA\îäåÎ .wi¹sŒ—;ƒö3\î úÜ_§e¹3ˆËA\îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ -wŽñrg—;ƒþÅϲ.˃¼ÜÄåÎ .wòrg–;c¸Ü¤åÎ1^î ârg—;ƒ¸Ü9ÈËA\î ârç /wq¹3ˆËA\îÄåÎ.wq¹ó mËA·¿Yî¼þONKÜĸsãÎ ÆAŒ;ƒw^h‰;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎÆAŒ;9î bܤ¸3†qç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î RÜøóBKÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,BÜY£¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w!îŒaÜY¤¸³Hqç ÇEŠ;‹ôâ"ÅAŒ;‹w)î bÜYôó)RÜY¤¸3èïâÎþ*ÅEŠ;‹>÷GËqg‘âÎ"ÅAŒ;‹wÖ(î,RÜĸ³Hqg‘âÎ ÆE·ýÑrÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜ9Èqg‘âÎ"ÅEŠ;ƒw)î,BÜø³Hqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,ºío”ãÎ"ÅAŒ;‹w)î,Rܤ¸³Fqg‘âÎ ÆEŠ;‹w)î丳Hqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY„¸3†qg‘âÎ"ÅEŠ;ƒw)î,RÜYô¹¿QŽ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹wrÜY¤¸³Hqg‘âÎ Å5Š;‹w1î,úØß(ÇEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ Å5·ý‰bÜY£¸3ˆqg‘âÎ"ÅAŒ;‹nû帳Hqç ÇEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,BÜY£¸3HqgâÎ"ÅEŠ;ƒw)î,RÜĸ³HqgâÎÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w}®”ãÎ"Ä5Š;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŠ;kw½ýẠÅAŒ;‹w)î bÜYô±?NŽ;‹w1î,BÜY£¸³qg ãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqgâÎŃwÖÜö·Éqg‘âÎ ÄßÐûŽóMÚ_©¸3ˆqg‘âÎ"ÅEŠ;ƒw!î¬QÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,BÜø³hýóƸ3ˆqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³è†|¦HqgâÎ1Ž;‹w)î,RÜĸ³Hqg‘âÎ ÆEˆ;kw!îŒaÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqgâÎÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"Ä1Œ;‹ö3Š;‹wrÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY„¸3†qg‘â΢ñ³¬Ž;ƒw)î,RÜĸ³qgâÎ"Ä1Œ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w)î RÜY£¸³Hqç…–¸³èöWqç×Üoqç ÇZâÎAŽ;9îä¸ó mqç ǃwrÜy¡%îä¸sãÎ -qç ǃwrÜy!ÇcwrÜy¡%îä¸sãÎ1Ž;/´ÄƒwrÜy¡%îtcÜ9Èqç ÇZâÎAŽ;9îä¸óBKÜ9Èqç ÇZâÎAŽ;1îã¸ó mqgãΠƃw1î bÜĸsãÎ Å1Œ;9î bÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bܤ¸sŒãÎ ÆAŒ;/´ÄAŒ;ƒøâ ƃw1î bÜ9ÈqgЇþÍ'ˆqgãÎAˆ;¿¡÷-çoh~ãΠƃw1î bÜ9ÈqgâÎÆAŒ;9î bÜĸsãΠÛþh-qgãÎAŽ;ƒw1îä¸3ˆqgãÎ ÆZâÎ ÆAŒ;ƒwrÜĸ3HqçÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃwÝôƒ_AŒ;ƒwrÜĸ3ˆqgãÎAŒ;cw1îä¸3ˆqgãÎ ÆZâÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw)îã¸3ˆqgãΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜôÐÿ1=ˆqç ÇAŒ;ƒw^h‰;ƒw1î bÜ9ˆqg ãΠƃw}ìoÔw1îä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãΘÛþD9îŒaÜ9ÈqgãΠƃwÝö'j‰;ƒw^h‰;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎ Å1Œ;1îŒaÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3Hqg ãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bܤ¸ó2Kܤ¸3†qç ÇAŒ;ƒw1îä¸3ˆqgãÎAŒ;cw½ÿáºƃw1î bÜ9ÈqgÐÇþ8-qgãÎAŽ;ƒwÆ0î RÜ9ÆqgãΠƃw1î zìÓwrܤ¸3†qç…wÆÜö·i‰;ƒwrÜô÷qg~%ãÎAŽ;ƒw1î bÜ9ÈqgâÎÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwŽqÜ´þysÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒw^f‰;ƒw1î bÜ9ÈqgãΠƃw)îŒaܤ¸sŒãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrܤ¸3†qgãÎAŽ;ƒw1î bÜ9ÈqgãÎ Åcwígw1î¼Ðw1î bÜ9ÈqgãΠÇþ:-qç ÇAŒ;ƒwŽqÜĸ3è_ü,ëwrÜĸ3ˆqç ÇAŠ;cw)îã¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;1îŒaÜĸó mqgÐí¯âÎÿüï†ßÛÎdzğ—/Ó´3æÿù¿Ì);ßß9a'î´ëÄfoï|«:au¾ý¬oM'î4é|çï¦=ç{srN˜Öœ09aÚr¾ÿ½7å|攜8ÓóýÓqÂ4ã|ÿY­8q¦çû3§á|ç$œ¸Ó‚óýp¾¿súMÜi¾ ÓzóýgxóýÓnâNÓMÜi¹ùþÎ 7ßß9Ý&L³Í÷æT›06aÒl‚4Ù|û[ÿVl¾½ó-Ø”ÉßoñYÍ5q§µ¦î$ÖÔ´š¸ÓTwRjêLBMœi§‰;Í4eRiê³iâNMÜi¢©;)4u'&LûL™üuV&u&LãL™´™ø½7ÍÔ”™0 3eîÛ«ó-ËÄ×Ü*weêÎ×ÿb¹Ü™$gZdâLƒLÝIùþÎÉ1eRc¾ÿ¬cêNZLÜiЉ;-1eb´Ôù˜‘¹o¯Î·¿÷6˜¸Óóïü–`Î/J©ÃŸë3túKü&š_êÎk}†N|‰;i/uæ±>Cÿ·å%î4¼Äv—2Ïõ:Õ%î4ºÔÇú ä¦Å¥ÌŸõ:½%LsK™õ:±¥î¼~C§³Äf–¸ÓÊRw^Û3tKœib©;õ:%î´¯Äæ•2Ïõ:q%î´­”y¬ÏÐ)+aVÊüYŸ¡“Uâ÷ÞªwUêÎ}}uNR‰;-*eþ¬¯Îé)uçs}uZSâLcJy­¯ÎI)q§%¥î$¤ÔÏõÕ9åûÏ:¥î$¢Ä6”¸Ó„Ræ±¾:' „i?)óg}uN=‰ß{ãIÜi;©;¯Îow^ë«sÂI|V»IÝyn¯Î©&q¦Ñ¤îÜ×Wç$“¸ÓbwLÊ<ÖWçä’¸ÓZwKêÎk}uN*)s[_JÊ|®¯ÎÉ$ñ{o%©;ÏõÕ9äû;'‘ÔÇúêœ@Ÿ•>gšGêÌs}uN‰;m#uç¾¾:§Œ„i)óg}uN‰¯¹U$î4Š”¹¯¯ÎI"aZDÊÜÖWçôø½7‡ÄÖ¸ÓRwž?^_î$…Ä™–2íÑ9$Î4ƒÄVºó\Ó@âNH™ûGç7óZÓ?¾ÿšOþ¨;ÏÎow>×Gç´2÷õÑ9å#LÃG|Ííuç±>:§zÄF¸“æQgžë›ÓâŸÔàQgë›srGÜiíˆ;u'­#î4uÄ–Ž2:мÖ'çdŽø’[9êÎs}rNãÓÄQæ¾>9'pÄö¸Ó¼Qwë“óßÿ±|{NÛøþLÓF‘çú䜰wÚ5êÎc}rNÕˆ;q§M£î<×'§E£Èm}q¦gÄ×ÛœGZ3ÊüYŸ›Ó2Â4eÄ×Ü’Qwîëss:FÜiƈ;©uæñã¹ùíÌç?Ë‹tF™ûúÜœ€wÚ/âNóEÝy¬Ï͉q§í¢ÌŸí¹9åâ{ÓpQä¶¾6'[|ÿ;?Õ"î4Z”I³ø¿æ]³8¿ð¹>A§XÄo¤Á¢îÜ×'è䊸ÓZw+êÌc}ƒNªˆj©ˆ; uçµ¾A'SÄVŠºóXß 6Š Me¶?^ aÚ'â÷Ý« "î´@ÔçúÞœþw’êÌýÇ{óÛ™×?ËÏôkeþ¬ïÍ)uçs}oNwˆ;¯Ÿ?§ùÛ×öÞœèPf=òXß›S¾ÿzOpøþÎé uçµ¾7§6”¹­ïÍi uçs}oNiˆ; uç¹½7'3Ä™V†º³ÿŒæi ñYM q§…¡î<×÷æô…¸“¼Pgîë{Ó¸¤m¡ÌÏŸÐüÍ<Ö÷æ„…ø·+Äf…ºóZß›â³ÚêÎc}oNQˆ; q¦=¡Î<·÷æ[Møöη˜ð—;ÿ>þ£ÿó¿”x)²HK‘A\Š,ÒRd‘–"‹´9ÈK‘EZŠ,ÒRd‘–"ƒ¸Y¤¥È"-Eq)²HK‘EZŠ,ÒRd–"k´Y¤¥È .Ei)²K‘5ZŠ âRd‘–"‹´Ä¥È"-Ei)²HK‘A\Š,ÒRd‘–"‹>±Ä¥È"-Ei)2ˆK‘EZŠ,ÂRd–"y)ò ,E„¥È"-E„¥Èƒ°y–"‹´yÐû¥Èc°Y¤¥Èƒ°y–"ÂRd‘–"ÂRäAXŠ<K‘EZŠ<K‘a)²HK‘a)ò ,E„¥È"-E„¥Èƒ°Y¤¥Èƒ°yPªD^z¿Y£¥Èƒ°y–"ƒ¸y–"Â]ç ,Ei)ò ,E„¥È"-EôñÏÛÿ€ÔAXŠ<K‘EZŠ<èo–"ϯÂRäAXŠ,ÒRäAXŠ<K‘EZŠ<èýRä1XŠ<K‘EZŠ<K‘a)²HK‘ÝöG‹K‘a)²HK‘a)ò ,Ei)ò ,E„¥Èƒ°ĥȃ°y–"ÂRd‘–"ÂRäAï—"k´y–"ÂRäAXŠ,ÒRäAXŠ<K‘EZŠ<K‘a)ò ,Ei)ò ,E„¥È"-E„¥Èƒ°y–"‹´y–"ÂRäAŸû¥¥Èc°y–"‹´y–"ÂRäAXŠ âRäAXŠ<K‘EZŠ<K‘a)ò ,Ei)ò ,E„¥È"-Et{ÿß=<K‘a)²HK‘a)ò ÷K‘5ZŠ<K‘a)ò ,Ei)ò ,E„¥Èƒ°Y¤¥Èƒ°y–"‹´y–"z¼ÿ/ó„¥È"-E„¥Èƒ°ĥȃ°y–"ÂRd–"ÁRäAXŠ,ÒRäAûťȃ°Y¤¥Èƒ°y–"ÂRd‘–"ÂRäAXŠ,ÒRäAXŠ<K‘a)²HK‘a)ò ,Ea)ò˜ÛþDi)ò,Ei)ò ,E„¥È"-E„¥Èƒ°y–"ƒ¸y–"ÂRäAŸûťȃ°y–"‹´y–"ÂRäAXŠ,ÒRäAï—"ÁRd–"ÁRäAXŠ<K‘EZŠ<K‘a)²HK‘ÝöJK‘Ç`)²HK‘a)ò ,E„¥È"-E„¥Èƒ°Y¤¥Èƒ°y–"z¿åȃÞ/Eƒ¥È"-E„¥Èƒ°y–"‹´y–"ÂRd–"ÁRäAïþKýG`)²HK‘a)ò ,Ei)ò ýqâRäAXŠ,ÒRäAï—"ÁRäAï—"k´y–"ÂRd‘–"ÂRäAXŠ<K‘EZŠ<èýRä1XŠ ÒRä1·ýmâRäAXŠ,ÒRäA»y~%–"‹´y–"ÂRäAXŠ,ÒRäAï—"ÁRäAXŠ,ÒRäAXŠ<K‘EZŠ<K‘a)ò ÷K‘5ZŠ®q§.5îä¥Ä¼”¸S—wêRâNJÜ©C;u©q'QâN~\âN]jÜ©K;y)q'/}ý/0 jÜI”¿ %îjÜI”¸S߂Ƽ”¸S¨q'Ñ}}£¾ÅúÂwêRãN^JÜÉKwêPãNjÜÉK‰;qéÄD‰;ñq'îä¥ÄºÔ¸S—w%îjÜIô1ÿæCt_ߨoq§¾;u©qçÿ^ú%îì¯JÜÉÓŸû£uâNýNwòÒk´NÜ©K‰;yè±?Z'îԥƺԸ“è¹?Z'îԥƼôØ­w 5î$ú³?Z'îjÜIô±?Z'îä¥×Gë—K'îÄ¥w=÷GëĺԸS—wòÒk}´NÜ©C;yé±?Z'îԥƺԸ“è¹?Z'îÔ¥ÆDýÑ:q§PãN¢?û£uâN} wêRãN^ºïoÔ‰;u©q'ÑŸý:q'/}îoTãNjÜÉC¯ý:q§.5îä¥Ä¼ô¹¿Q'îÄǸ“—wêRãN]ú¿·ý:q'ÑçþF¸“èÏþF¸S߂ƺԸ“—?Þ¨_/½ö7êÄú¸Æ¼ô\ߨwêPãN^ºïoÔ‰;u©q§.5î$zìoÔ‰;u©q§.5îä¥×þF¸“è¶¿Q'î$úÜߨwê[и“—žûuâN\:q'/=ö7êÄú¸Ä:Ô¸“‡žûuâN]jÜÉK÷ý:q§PãN¢?ûuâN}á;u©q'Ñ}£NÜ)Ô¸“è¶¿Q'îÔ· q§.5îԥƼôüñFýv)q§5î$z¬OÔ‰;u¨q§.5îä¥çþD¸S—wÝN'îjÜIsÛߦwâpâN]jÜI”¸“èùömzwæW6îÔï¦q§¾†Æ¼”¸S—wêRâNzì/Ö‰;õi;u©q'/½öëĺԸ“—û‹Õ¸S¦q'Ñúǹq§PãNýöwòÒc±NÜ)Ô¸“èÏþb¸S—wêRãN^ºïOVãN:q'¸“—žû¿œ¸S׸S—wòÒk²NÜIt[Ÿ¬w}®OÖ«q'Ñ}²NÜ©K;u©q'/=ö¿N¸S׸S—wòÒsNÜ©K‰;yèþãuúõÐ럭“øwýÙ_§wòÒçþ:¸S—^?žõ×K¯õu:q'Ñ~汿N'îÄ}âN\:q'/½ö×éÄD·ýu:q'/}î¯Ó‰;u©q'/=××éÄ:Ô¸“—þÅϲž¸S׸S—wòÒsNÜ©K‰;y辿N;ewýüIÖ_ÑcNÜ©o@ãN]jÜÉK¯ýu:q§>®q'/=ö×é唸S‡wòÐs}¾Åï/}‹;¹ôKÜùõÃHËrg—;y¹3ˆËA\î ârç…–åÎ .wq¹3ˆËƒ¼ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA\îŒárg—;y¹3ˆËAZîŒárç /wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Ü9ÈËA\î Òrg —;/´,wi¹³HËA\î,Òrg‘–;‹´ÜÄåÎ",wÖh¹3ˆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-w%îârg‘–;‹´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wa¹3†ËEZî,Òrç /wi¹³Hÿµ£"-wq¹³HËEZî ârgÑÇ?ïÿƒ^EZî,Òrg—;‹Þ/w~Cï‡:+@ó«´ÜÄåÎ"-wi¹3ˆËEXî¬Ñrg‘–;ƒ¸ÜY¤åÎ"-wq¹³è¶?Z^î,Òrg—;‹´ÜY¤åÎ .wi¹³HËEZîäåÎ"-wi¹³HËA\î,Òrg–;c¸ÜY¤åÎ"-wi¹3ˆËEZî,Òrg—;‹´ÜY¤åÎ"-wq¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³HËEZî Òrg–;‹´ÜÄåÎ"-w}ýÏí’–;y¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹´ÜÄåÎ"-wa¹3†ËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Òrg—;‹´ÜY¤åÎ"-wq¹³HËEZîäåÎ"-wi¹³HËAZî¬Ñrg‘–;ƒ¸ÜYô±¿Q^î,Òrg—;‹´ÜY¤åÎ"-wq¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³HËAZíO—;k´ÜÄåÎ"-wi¹3ˆËEZî,Òrg‘–;y¹³HËEZî,Òrg—;‹´ÜY¤åÎ .wi¹³HËEZî ârg–;k´Ü¤åÎ-wi¹³HËA\î,Òrg‘–;ƒ¸ÜY¤åÎ",wÖh¹3ˆËEZî,ÒrgÑçþ@y¹³HËEZî ârg‘–;‹ûÅåÎ1^î,Ârg–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Òrg–;k´ÜYôv9¡BËA\î,Òrg‘–;ƒ¸ÜYô±?N^î,Òrg—;‹°ÜY£åÎ",wÆp¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wa¹³F˃¸ÜYsÛß&/wi¹3ˆËEZî,z¿ÜyF:ß ù•Zî,Òrg‘–;ƒ¸ÜY„åÎ-wi¹3ˆËEZî,Òrg—;‹´ÜY¤åÎ",wÆp¹³hýCÈåÎ .wi¹³HËEZî ârg‘–;‹´ÜÄåÎ"-wi¹³Ëc¼ÜY¤åÎ"-wi¹3ˆËEZî,Òrg—;‹°ÜYóØŸ,.wÆp¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Ârg–;‹´ÜÄåÎ"-wi¹³HËA\î,Òrg–;c¸ÜY´ŸÑrg‘–;y¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³Ë1\î,ÒrgÑ¿øYV/wq¹³HËEZî ârg–;k´ÜY„åÎ.wi¹³HËEZî ârg‘–;‹´ÜÄåÎ"-wi¹³HËAZî¬Ñrg‘–;/´,wÝþf¹ó¿?µýÚâΠƃw1î bÜĸóBKÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃwÆ0î bÜ9ÈqgãÎ Å1Œ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgâÎÆZâÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqgâÎÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³èÿE‘âÎ ÆEŠ;‹w1î,RÜY¤¸³qg ãÎ"ÅEŠ;9î,RÜY¤¿)î bÜY¤¸³Hqgã΢ü›O‘âÎ"ÅAŒ;‹wýUÜÙ_¥¸3ˆqg‘âÎ"ÅAŒ;‹wÖ(î,RÜĸ³Hqg‘âÎ ÆE·ýÑrÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜ9Èqg‘â΢ÿ³;\Žëj’özGŠ7Ð@7pÿ7æO<•¹1Î*É¿&±X Âôl“ƒG©¸³HqgãÎ"ÅEˆ;cw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³Hqg‘âÎ Å5Š;‹w1î,RÜYôÄÿ¡¢Hqç ÇEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"Ä1Œ;‹w)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹wrÜY¤¸³Hqg‘âÎ Å5Š;‹w½)î,zÛß(ÇEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ Å5ý‰bÜY£¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜ9Èqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹wÖ(î RÜY£¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY„¸³FqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘â΢çþ@1î㸳qgâÎ ÆEŠ;‹w)î bÜY¤¸³HqgâÎÅE·?\W¡¸3ˆqg‘âÎ"ÅAŒ;‹ÞöÇÉqg‘âÎ ÆEˆ;kw!îŒaÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,BÜY£¸sãΚÇþ69î,RÜĸ³Hqg‘âΠ·ÿwöW*î,RÜY¤¸3ˆqgâÎÅEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"Ä1Œ;‹Ö?„Œ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,BÜ9Æqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³qgâÎ"Ä1Œ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,BÜY£¸³HqgãÎ"ÅEŠ;‹w1î,RÜY„¸3†qgÑ~Fqg‘âÎAŽ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹wÆ0î,RÜYô/~–ÕqgãÎ"ÅEŠ;ƒw!î¬QÜY„¸3†qg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"ÅAŠ;kw)î¼Ðw=þSÜùøû׿ſ‚5îüm^tЉ;qéĺԸS—wÞ_úw 5î¼ÿ¸oq§.5îÄ¥wâÒ‰;…w½5îjÜ)Ô¸S¨q'¾;qèÄ:Ô¸—NÜ)Ô¸׸S‡wâЉ;qéĺԸ—N܉K'îÔ¥ÆB;ñq'îÄ¥wêRãN]j܉K'îÄ¥w 5î:q§PãN¡Ä2;ï¿ßâÎûKßâN¢×_ûÇ5îԥƼ”¸“—wêRãN]JÜÉC‰;u¨q§.5î$JÜÉKÜ©K;u©q'/%îä¥ÄB;‰ò—a¢ÄB;‰wê[и“—w 5î$úXߨoq§¾ðƺԸ“—wòÒÄ:Ô¸S‡wòRâN\:q'QâN|܉;y)q§.5îÔ¥ÆD‰;…Þòb¢·ù7¢õúwê[иS—wòRâÎ^ú-î̯úÚ­wêówòÒçþh¸S—wòÐs´NÜ©K;u©q'Ñk´NÜ©K;yé¹?Z'îjÜIô¾?Z'îjÜIô¶?Z'îä¥ÏÖ/—N܉K'î$zíÖ‰;u©q§.5îä¥ÏõÑ:q§5îä¥çþh¸S—wêRãN¢×þh¸S—w=÷GëÄB;‰Þ÷GëÄú4îԥƼôqûh}CŸ?Þ¨ß.5î$zßߨwòÒ×þF5îÔ¡Æ<ô¹¿Q'îԥƼ”¸“—¾ö7êÄø¸wòRâN]jÜ©K;‰žûuâN¡ÆDïûuâN} wêRãN^zþx£~½ô¹¿Q'îÔÇ5îä¥×úF¸S‡wòÒÇþF¸S—wêRãN¢çþF¸S—wêRãN^úÜߨw=ö7êÄD_ûuâN} wòÒk£N܉K'îä¥çþF¸S—¸S‡wòÐk£NÜ©K;yéc£NÜ)Ô¸“è}£NÜ©/¼q§.5î$úØß¨w 5î$zìoÔ‰;õ-hÜ©K;u©q'/½~¼Q¿]JÜ©C;‰žëuâNjÜ©K;yéµ?Q'îÔ¥ÆD?ž¨_ÑçþD¸_ø‰;yéõã‰úõÒ×þD¸“èc¢NÜ)Ô¸S_øÛc¢NÜÉK_ûuâN]JÜÉC¯ý…jÜ©kÜÉCÏý…:q§.5îԥƼ”¸S—wêRãN¢‰;i>÷êÄúºwòÒk NÜ)Ô¸“èc NÜ©K;u©q'/=÷ªq'¸‡wÒ¼öêĺԸ“—žûuâN]jÜ©K;yéµ?P;iûû4q§¾èÆ:Ó¸“è}œNÜ)Ô¸S_xãN^úاwêRãN]JÜÉCÏÓ¯‡¾þÚ°w}ìÓ‰;u©q§.5îä¥çþ8¸S—w½¯Ó‰;wÒ<ö·éÄøœ¸S—w%î$zíoÓ‰;ÿù…ßÅù•oûƒuâN}_wêRãN]JÜÉCÏýÅ:q§>­q§.5îä¥ÏýÅ:q§.5îä¥çþb5î”iÜI´þ!lÜ)Ô¸S¿ýƼôÜ_¬w 5î$zß_¬wêRãN]jÜÉKû“Õ¸‡N܉C'îä¥×þ/'îÔÇ5îԥƼô¹?Y'î$z¬OÖ‰;‰¾Ö'ë³q'ÑÇþd¸S—wêRãN^zîOÖ‰;õq;u©q'/½ö×é唸“‡>~¼N¿úükë$¾ÅDïûëtâN^úÚ_§wêÒçÏŸgýõÒçú:¸“h?óÜ_§wâ‹>q'.¸“—>÷×éÄDýu:q'/}í¯Ó‰;u©q'/½Ö×éÄ:Ô¸“—þÅϲž¸S׸S—wòÒkNÜ©K‰;yècwÊ4î$úù“¬¿¢çþ:¸S߀ƺԸ“—>÷×éÄú¸Æ¼ôÜ_§wêRâNjÜÉC¯õuúwÞ_úwþré—¸óÿýïé·u¹s—;/´,wòrç /wòrç´-wòrç /wòrç…–åÎA^îäåÎ ½y¹s—;y¹s—;/äåÎ1^îäåÎ -˃\îÄåÎ1^î¼Ð²Ü9È˃¼Üy¡e¹s—;y¹s—;/´,wòrç /wòrç…–åÎA^îäåÎ -˃¼Ü9ˆËc¼ÜùmËA\î ârç /wq¹3ˆËA\îäåÎ -wÆp¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA^î ârg—;y¹3ˆËA\î ârç /wq¹3ˆËƒ¼ÜÄåÎ .wi¹sŒ—;ƒ¸ÜÄåÎ -ËA\î âí(ˆËƒ¼ÜÄåÎ .wzûù_;ú½ý…ÿ W—;ƒ¸Ü9ÈËA\î úoËùU\îäåÎ .wq¹s—;ƒ´ÜÃåÎ .wòrg—;ƒ¸Ü9ÈËAýÑZ–;ƒ¸Ü9ÈËA\î ârç /wq¹3ˆËA\î¼Ð²ÜÄåÎ .wq¹s—;ƒ¸Ü¤åÎ1^î ârg—;ƒ¸Ü9ÈËA\î ârç /w=öGkYî ârç /wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎ .wârg —;ƒ¸Ü9ÈËA\î ârg—;/´,wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA^î ârg—;ƒ¸Ü9ÈËA\î Òrç/wq¹3ˆËA\îäåÎ .w=÷7jYîäåÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Üy¡e¹3ˆËA\î ârç .wÆp¹3ˆËƒÞ¸Üô¶¿QËrg—;y¹3ˆËA\î ârç /wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA\îŒyìO”—;c¸Ü9ÈËA\î ârç /wq¹3ˆËA\î¼Ð²ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA^î ârg—;ƒ¸Ü9ÈËAZîŒárç .wÆ<4ŽÄåÎ .wòrg—;ƒ¸Ü9ÈËA\î Òrg —;y¹3ˆËA\î ârç /wq¹3ˆËƒ¼ÜÄåÎ .wi¹ó2Ërg–;c¸Ü9ÈËA\î ârg—;y¹3ˆËA\îÄåÎ.wÝ/'Dp¹s—;ƒ¸ÜÄåÎA^î zÛ§e¹3ˆËƒ¼Ü¤åΘ§†f‚´Ü9ÆËA\î ârç /wq¹3ˆËA\îäåÎ -wÆp¹óB^îŒyìoÓ²ÜÄåÎA^î ârg—;a¹óºé¼+@ó+¹ÜÄåÎA^î Òrg —;ƒ¸Ü9ÈËA\î ârç /wq¹3ˆËAZîãåΠõ¡—;y¹3豿XËrg—;y¹3ˆËA\îäåÎ .wq¹3HË—Y–;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Ü9ÈËAZîŒárg–;Çx¹3ˆËA\îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ .wòrg–;c¸ÜÄåÎA^î ârg—;ƒ¸Ü9ÈËA\î Òrç/wígžûë´,w^hYî ârg—;y¹3ˆËA\î ârç /wq¹3HËc¼ÜÄåΠñ³¬Ërç /wq¹3ˆËƒ¼Ü¤åÎ.wi¹sŒ—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Ü9ÈËA\î ârg—;q¹3†ËA\îüƒ¶åΠÇYîü;*ynqgãÎAŽ;ƒw1î bÜy¡%î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŒ;cw1îä¸3ˆqgâÎƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3Hqg ãÎ -qg‘âÎ"ÅAŒ;‹w)î,RÜĸ³qgâÎ ÆEŠ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY„¸3†qg‘âÎ"Ńw)î,Ò_ˆ‹w1î,RÜY¤¸3ˆqgÑþͧHqg‘âÎ ÆEŠ;‹žÿ%îì¯RÜĸ³Hqg‘âÎ ÆEˆ;kw)î bÜY¤¸³Hqgã΢Çþh9î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w)î丳Hqg‘âÎ"ÅAŒ;‹w!îŒaÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒwÖ(î,RÜĸ³Hqg‘âÎ"Ńw)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w)î z(î,RÜY¤¸³HqgãÎ"ÅEˆ;cw)î,RÜY¤¸3ˆqg‘â΢çþF9î bÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸sãÎ"ÅEŠ;‹w)î¬QÜY¤¸3ˆqgÑÛþF9î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w)î¬yìOãÎÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎAŽ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w)î bÜY„¸³FqgâÎÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"Ä5Š;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,BÜ9ÆqgâÎÅAŒ;‹w)î,RÜĸ³Hqg‘âΠâÎÅE·?\W¡¸3ˆqg‘âÎ"ÅAŒ;‹ÞöÇÉqg‘âÎ ÆEˆ;kw!îŒaÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,BÜY£¸sãΚÇþ69î,RÜĸ³Hqg‘âÎ ÆEÿ9îì¯TÜY¤¸3ˆqgâÎÅEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"Ä1Œ;‹Ö?„Œ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,BÜ9Æqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³qgâÎ"Ä1Œ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,BÜY£¸³HqgãÎ"ÅEŠ;‹w1î,RÜY„¸3†qgÑ~Fqg‘âÎAŽ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹wÆ<w)î,ú?Ëê¸3ˆqg‘âÎ"ÅAŒ;‹wÖ(î,BÜø³Hqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎ Å5Š;‹w^h‰;‹ÿ)îüÿ›ì±Æƒw^h‰;9îä¸sãÎ?h‹;9îä¸sãÎ -qç ǃw^h‰;9îä¸sãÎ 9îã¸sãÎ -qç ǃwŽqÜy¡%îä¸sãÎ -qç ǃwrÜy¡%îä¸sãÎAŽ;/´ÄƒwrÜy¡%îä¸sãÎ1Ž;ÿ -î bÜĸsãÎ ÆAŒ;ƒwrܤ¸3†qç ¿_ïåOøw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw)îã¸3ˆqgãÎ -qgãÎ þ…8ˆqç ÇAŒ;ƒwrÜô¦ó bÜĸsãÎ ÆA÷qç7tßrþV€Î¯rÜĸ3ˆqç ÇAŠ;cw1îä¸3ˆqgãÎAŽ;ƒû£µÄAŒ;9î bÜĸsãÎ ÆAŒ;ƒw^h‰;ƒw1î bÜ9ÈqgãÎ Åcw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1î bÜ9ˆqg ãΠƃw1î bÜĸóBKÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAÆAŒ;ƒw1îä¸3ˆqgâÎ1Ž;ƒw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãΠÇþF-qgãÎAŽ;ƒw1î¼Ðw1î bÜĸsãÎÆAŒ;9î zÛߨ%î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç Æ1ý‰rÜøsãÎ ÆAŒ;9î bÜĸ3ˆqç…–¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î RÜøsãÎÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒwÆ0îä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŠ;/³ÄAŠ;cwrÜôب%î bÜ9ÈqgãΠƃŠ;cwÝÿp]ãÎAŽ;ƒw1îä¸3èmœ–¸3ˆqç ÇAŠ;cw)îã¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgâÎÆrÜóØß¦%î bÜ9ÈqgãΠƃwý÷¸3¿’qgãÎAŽ;ƒwÆ0î bÜ9ÈqgãΠƃw1î bܤ¸sŒãΠõ¡ãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bܤ¸ó2KÜĸ3ˆqgãÎAŽ;ƒw1îä¸3Hqg ãÎ Åcw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ Å1Œ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw)îã¸3h?ø3ˆqç…–¸3ˆqgãÎAŽ;ƒûë´ÄAŒ;9î bܤ¸sŒãÎ ÆAÿâgY—¸sãÎ ÆAŒ;9î RÜø3HqçÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ˆqg ãÎ ÆÐw=þSÜùú^v>ÿŽÞ}}Ï:#þÏ—÷úÞtÞÝ8AçíÖœ·7šrÞÜøÖqÞŠFœ7Ÿò­à¼½Ñ|óîÆi7ïnœpóV´Ú¼'Ù¼í5oEcÍ[ÑRóîwÛLóîÄi4oO4м»qêÌ[Ñ4óîSÚeÞžh”ywâ™w7NŽy{£-æÝbÞÝ8æí&˜·¢ýåݧœøòîÆ)/oo4»¼½ÑæòîÆ .ïnœÚòV4µ¼§³¼,oE Ë[мòæ7û­­¼¹ñ-¬¼ù[èí§4©¼½ÑžòþFbÊû))oo4£¼½‘†òþDÊÛ­'oo<’NÞ‹t“÷Ÿ’hòöF‹ÉÛÍ%ïo¤•¼¿‘PòV´’¼ù+å½Hy+GÞ‹”‘·¿Ûf‘÷7ÒDÞŠ‘÷âÃ/÷òö+my{£äý÷7&¼=ÑöñöDÃÇû©ïnœäñ^¤w¼û”;ÞßHéx{£™ãí6Ž÷"ã­hÝx/Þæ_<îŇ_†oQãíï¶EãíæŒ÷7Ò2Þßøº}~ _ß+ÆÛmÂxû±íoo4^¼½‘rñþÄsy*N³x{£ÁâíÖŠ÷âµ<§S¼½ÑHñþÆsy*Nžx+Ú&Þ‹÷å©8Uâ­h’x/Þ–§âĈ÷7><?oœ ñîÆiïÅky*N}x{£éáív‡÷7>ýTœâðöDsÃûÏå©8¡áíV†·7šÞ‹×òTœ¸ðöFËÂ{ñ\žŠÓÞŠ…÷â}y*NJxû»mGx{£áýå©8ùàí¶ƒ÷â}yN5xãkyÚ Þžh,xâsyN&x{£àý‚÷7¾–—á¤wŸrºÀû‰oo´¼½Ñð^<——á„€·¢à½x_^†ÓÿÝþnÿÝÞx<þâ¿?}Ëþîo|./à þn?¥µßý—_†ÓùÝžhäwãcyNÞw{£mßí†}÷â¹¼ '黽ўïöFc¾ûŸËËp2¾{ñX^†ðÝ‹¯åe8éÞíï¶ÝÞý×ò2œbïîÆÉõîo<——á„z·Ÿ’JïöD½û¯åe8qÞí–y÷7>–—á4y·¢AÞ½x_^†“âÝ~¥íðno4»ËËpò»[Ñöî^<–—áTw·¿Û&w·7ÚÛÝÞhlwãõãeøÇdv·'ÚØÝ‹§†S×ÝžhZw{£]Ýý×ò0œ¢îöFsº{ññãaø§ø\†SÑÝ}¥'¡»¿ñúñ0üóÆ×ò0œrî^|,ÃiænEƒ¹Û¯´µÜýçò0œNîöF#¹Û)äîO¼–w¡mÜíg4Œ»?ñ\Þ…“ÄÝÞhw{£1Üý”p·7šÁÝÞhw/&€»ŸË³pÒ·Û/´ÝÛý×ò,œâíV4w»˳pB·Û­Üno4q»¿ñ\ž…Æmw'NÙvw¢YÛ=x-Ï Úno´f»¿ñ\ž…Ó±ÝÞhÄv{£Ûý×ò,´]»åU˜jíö«l²v{ ½Ú½x_ž„SªÝŠfj·_iµûË“pê´ÛMÓno¤K»?ñüñ$üóÄ×_|3NŽv/>–'á„h·7Z¡ÝÞh‚vã¹< '>»½Ñòì^¼ûI8ÍÙhpvË‹pR³»ßëéÌno42»)ÌîÅkyN[vû•6,»¿ñqû"Ü¥g¯ïIÙíáöd·_\b²ûÏå8Ù퇴!»½Ñ€ìþÆçòNœtìöF»±ûÏåh1v š‹Ý ÿ‰j(v+Z‰ÝþN›ˆÝßx.ïĉÃnE˰{ñ¾¼§ »½Ñ ìöFk°ûËCÑìîĉÀîNœìþÆkùîi¿n?¥á×íV_÷7>—‡âô^÷âá‡â”^÷âËÅg¯{ñ±<§îº½Ñ´ëöF»®ûÏå¡8E×í§4纽іëþÆkyNÅu{# ×ý‰oÂ?O|þÅŸ•þVnÝ‹÷åM8ÍÖý¯åM8µÖíÏŸ?W÷ÏŸ~N¤u/–ÏåM8mÖÝWy¬»§Êº¿ñ¹¼ §ÇºåM8%Öý¯åM8 ÖíX÷7^~Nzu{¢ÝÕýígêNquû)Í­no´µº¿ñZÞ„SYÝÞHbuâcyWÝ‚–U÷âçOÔýS<—7áU·¿×ÖT·7šRÝßø\Þ„QÝ~J ªûÏåM8íÔí„S·'ZMÝŸxùMøÖKÝÜøKýr㟱ÔûŸ§nY âÞ /áq /ˆKxA\»в„Ä%¼ .áq o—ð‚¸„Ä%¼A^ â^—ð‚¸„7ˆKx1\ âÞ /áq /HKx1\Âä%¼ .áq o—ð‚¸„Ä%¼ .á ò^—ð‚¸„Ä%¼A^ â^—ðy /ˆKxAZ‹áÞ…–%¼"-ái /ˆKxEZÂ+Ò^‘–ð‚¸„W„%¼-áq ¯HKxEZÂ+Ò^—ðŠ´„W¤%¼"-áq ¯HKxEZ â^‘–ðŠ´„W¤%¼ .ái ¯HKxA\Â+z`°¡HKxEX‹á^‘–ðŠ´„7ÈKxEZÂ+Ò=¤HKxA\Â+Ò^‘–ð‚¸„Wôö×ý §HKxEZ â^‘–ðŠ´„WôŸ–ðò«¸„W¤%¼"-áq ¯Kx5ZÂ+Ò^—ðŠ´„W¤%¼ .á=öGËKxEZ â^‘–ðŠ´„Ä%¼"-ái ¯HKxƒ¼„W¤%¼"-ái /ˆKxEZÂ+Â^ —ðŠ´„W¤%¼"-áq ¯HKxEZ z×^‘–ðŠ´„W¤%¼ .ái ¯HKxA\Â+Ò^‘–ðŠ´„Ä%¼"-ái ¯HKxAZ«Ñ^‘–ð‚¸„W¤%¼"-ái o—ðŠ´„W¤%¼ .ái ¯HKxEZ â^‘–ðŠ´„Ä%¼"-ái ¯HKxA\Â+Ò^–ðb¸„W¤%¼"-ái /ˆKxEZÂ+Ò^‘–ð‚¸„W¤%¼"-áq ¯è±¿Q^Â+Ò^—ðŠ´„W¤%¼A^Â+Ò^‘–ðŠ´„¤%¼-ái /ˆKxEoûå%¼"-áq ¯HKxEZÂ+Ò^—ðŠ´„W¤%¼ .ái ¯HKxEZ â^‘–ðŠ´„¤%¼šÇþDq ¯FKxA\Â+Ò^‘–ð‚¸„W¤%¼"-ái o—ðŠ´„W¤%¼"-áq ¯HKxEZ â^‘–ðŠ´„W¤%¼ .áa ¯FKxAïX«Ñ^‘–ðŠ´„Ä%¼"-ái /ˆKxEZÂ+Â^–ð‚¸„W¤%¼"-ái /ˆKxEZÂ+Ò^—ðŠ´„W¤%¼",áñ^–ðj´„Ä%¼¢Çþ@y ¯HKxA\Â+Ò^‘–ð‚´„W£%¼¢Ûÿy…–ð‚¸„W¤%¼"-áq ¯èmœ¼„W¤%¼ .áa ¯FKxEX‹á^‘–ðŠ´„Ä%¼"-ái ¯HKxA\Â+Â^–ðq ¯æ±¿M^Â+Ò^—ðŠ´„W¤%¼ .áÝ/á}C÷£w7Íb¥–ð‚¸„W„%¼-ái /ˆKxEZÂ+Ò^—ðŠ´„W¤%¼",áÅp ¯hýCÈ%¼ .ái ¯HKxEZ â^‘–ðŠ´„Ä%¼"-ái ¯Kxc¼„W¤%¼"-ái /ˆKxEZÂ+Ò^—ðŠ°„W£%¼",áÅp ¯HKxEZ z×^‘–ðŠ´„W¤%¼ .ái ¯HKxA\Â+Â^–ðŠ´„Ä%¼"-ái ¯HKxA\Â+Ò^–ðb¸„W´ŸÑ^‘–ðy ¯HKxEZ â^‘–ðŠ´„W¤%¼ .ái ¯Kx1\Â+Ò^Ñ¿øYV/áq ¯HKxEZ â^–ðj´„W„%¼.ái ¯HKxEZ â^‘–ðŠ´„Ä%¼"-ái ¯HKxAZ«Ñ^‘–ð.´,á=þËÞÿûÿÃx½¯qç ÇZâÎAŽ;9îä¸óÚâÎAŽ;9îä¸óBKÜ9Èqç ÇZâÎAŽ;9îä¸óBŽ;Ç8îä¸óBïŽ;9îĸsŒãÎ -qç ǃw^h‰;9îä¸sãÎ -qç ǃwrÜy¡%îä¸sãÎ -qç ǃwŽqÜùmqgãΠƃw1î bÜĸsãÎ Å1Œ;9î bÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bܤ¸sŒãÎ ÆAŒ;/´ÄAŒ;ƒøâ ƃw1î bÜ9ÈqgЛþÍ'ˆqgãÎAŽ;ƒw1î úoqçü*ÇAŒ;ƒwrܤ¸3†qgãÎAŽ;ƒw1îä¸3è±?ZKÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç…–¸3ˆqgãΠƃw1î RÜ9ÆqgãÎ ÆAŒ;9î bÜĸsÐ;ãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãΠƃwÆ0î bÜ9ÈqgãÎ ÆAŒ;/´ÄAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î RÜ9ÆqgãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1î¼Ðw1î bÜĸsãÎÆAŒ;9î zÛߨ%î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãΠÇþF-qgãÎAŽ;ƒw1îĸ3æ±?QŽ;cwrÜĸ3ˆqç ÇAŒ;ƒw1î¼Ðw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŠ;cwzWÜø3ˆqgãÎAŽ;ƒw1îä¸3ˆqgâÎƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3Hqçe–¸3Hqg ãÎAŽ;ƒw1î bÜ9ÈqgãΠƃwÆ0î ºÿáºƃw1î bÜ9ÈqgÐÛþ8-qgãÎAŽ;ƒwÆ0î RÜ9ÆqgãΠƃw=öÇi‰;ƒwrܤ¸3†qç…wÆ<ö·i‰;ƒwrÜĸ3ˆqç ÇAŒ;ƒþ{Ü™_ɸsãÎ Å1Œ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw)îã¸3hýCè¸sãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw)î¼Ìw1î bÜĸsãÎ ÆAŒ;9î RÜø3HqçÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3Hqg ãΠƃw1î bÜĸsãÎ ÆAŠ;Ç8î ÚÏ0î bÜy¡%î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3HqçÇAŒ;ƒþÅϲ.qç ÇAŒ;ƒwrܤ¸3†qgâÎ1Ž;ƒw1î bÜ9ÈqgãΠƃw=ö×i‰;ƒwbÜø3ˆqç´ÅAÿwþùq¬oqço‹ A;tâN\:q§.5îÔ¥Æ÷—¾ÅB;ï?î[Ü©K;qéĸtâN¡Æ@'îz$îjÜ)Ը߂Æ8tâNj܉K'îj܉kÜ©C;qèĸtâN]j܉K'îÄ¥wêRãN¡Æø¸wâÒ‰;u©q§.5îÄ¥wâÒ‰;…w¸S¨q§Ðó¯ýPãÎûïÀ·¸óþÒ·¸“èõ×þq;u©q'/=ÿÚþô~‹;u©q§.%îä¡Ä:Ô¸S—w%îäÇ%îԥƺԸ“—wòRâN¡ÆDùË0Ñ'æíƒw%îÔ· q'/%îjÜIô±¾QßâN}á;u©q'/%î䥉;u¨q§5îä¥Ä¸tâN¢Äø¸wòRâN]jÜ©K;‰w 5î$z›ó!úXߨoq§¾;u©q'/%î䥯Û7ê·¸s~UãN}~ãN}~ãN]jÜ©K‰;yè¹?Z'îԥƺԸ“èµ?Z'îԥƼôÜ­w 5î$zß­w 5î$zÛ­wòÒçGë—K'îÄ¥w½öGëĺԸS—wòÒçúh¸S‡wòÒs´NÜ©K;u©q'Ñk´NÜ©KïýÑ:q'Ñ×þh¸“è}´NÜ©oAãN]jÜÉKû£uâN]jÜIô¾¿Q'î䥯ýjÜ©C;yès£NÜ©K;y)q'/}íoÔ‰;ñq'îä¥ÄºÔ¸S—w=÷7êÄB;‰Þ÷7êÄú4îԥƼôüñFýzés£NÜ©kÜÉK¯õ:q§5îä¥ý:q§.5îÔ¥ÆDÏý:q§.5îԥƼô¹¿Q'î$zìoÔ‰;‰¾ö7êÄú4îä¥×þF¸—NÜÉK‰;‰>÷7ªq§5îä¡×þF¸S—wòÒÇþF¸S¨q'ÑûþF¸S_xãN]jÜIô±¿Q'îjÜIôØß¨wê[иS—wêRãN^zýx£~»”¸S‡w=×'êÄ:Ô¸S—wòÒk¢NÜ©K;‰>~÷êÄúºwòÒk NÜ)Ô¸“èc NÜ©K;u©q'/=÷ªq'¸‡wÒ¼öêĺԸ“—žûuâN]jÜ©K;yéµ?P;iûû4q§¾èÆ:Ó¸“è}œþþŸëãtâN}á;yécœNÜ©K;u)q'=N'îjÜIóØß¦wâpâN]jÜI”¸“赿M'îÔÞ¸“—>nߦ»¸3¿2q§Î7îÔš¸“‡žû‹uâN}ZãN]jÜÉKŸû‹uâN]jÜÉKÏýÅjÜ)Ó¸“hýCظS¨q§~û;y鹿X'îjÜIô¾¿X'îԥƺԸ“—>ö'«q'¸‡NÜÉK¯ý_ NÜ©kÜ©K;yés²NÜIôXŸ¬w}­OÖgãN¢ýÉ:q§.5îԥƼôÜŸ¬wêãwêRãN^zí¯Ó‰;u)q'}üx~=ôù×ÖI|‹;‰Þ÷×éļôµ¿N'îԥϟ?Ïúë¥Ïõu:q'Ñ~湿N'îÄ}âN\:q'/}î¯Ó‰;‰ûëtâN^úÚ_§wêRãN^z­¯Ó‰;u¨q'/ý‹Ÿe=q§>®q§.5îä¥×þ:¸S—wòÐÇþ:5î”iÜIôó'YEÏýu:q§¾;u©q'/}î¯Ó‰;õq;y鹿N'îÔ¥Ä:Ô¸“‡^ëëô-ô-îüåÒ?ãÎ?'—¸3ˆqç ÇAŒ;ƒw1î¼Ðw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç Æ1Œ;ƒwrÜĸ3Hqg ãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î bÜĸsãÎ ÆAŒ;9î bܤ¸3†qç…–¸³Hqg‘âÎ ÆEŠ;‹w)î bÜY„¸³FqgãÎ"ÅEŠ;‹w1î,RÜYô¿ö)î bÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEˆ;cw)î,RÜ9Èqg‘âÎ"ý…¸HqgãÎ"ÅEŠ;ƒw½áß|Šw)î bÜY¤¸³HqgÑ}ÜyZÎ_ Ðþ*ÅEŠ;ƒw!î¬QÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹û£å¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸sãÎ"ÅEŠ;‹w1î,RÜY„¸3†qg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹^ûå¸3HqgâÎ"ÅAŒ;‹w)î,RÜ9Èqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³qġâÎ"ÅEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"Ńw)î,RÜY¤¸3HqgâÎ"ÅAŒ;‹Þö7Êqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³HqgЇâÎ"ÅEŠ;‹w1î,RÜY¤¸3HqgÍc¢wÖ(î bÜY¤¸³HqgãÎ"ÅEŠ;‹wrÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³HqgãÎ"Ä5Š;ƒwÖ(î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w!î¬QÜĸ³HqgÑk w1î,RÜY¤¸3ˆqg‘âÎ"ÅEˆ;Ç8î,BÜY£¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,Rܤ¸³FqgÑí×U(î bÜY¤¸³HqgЇâ΢·ýqrÜY¤¸3ˆqgâÎÅEˆ;cw)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹wÖ(îĸ³æ±¿MŽ;‹w1î,RÜY¤¸3ˆqg‘â΢û¸óºï8o ÐüJÆEˆ;kw)î bÜY¤¸³HqgЇâÎ"ÅEŠ;‹wÆ0î,Zÿ2î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³qçÇEŠ;‹w)î bÜY¤¸³HqgãÎ"Ä5Š;‹wÆ0î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³qgâÎ"ÅAŒ;‹w)î,RÜĸ³HqgâÎÆEûÅEŠ;9î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,BÜø³HqgÑ¿øYVÇAŒ;‹w)î úPÜY„¸³FqgâÎÆEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹w)î¬QÜY¤¸óBKÜYôøOqçãïÿ£ê·¸ó·QРƿ͋:q'.¸S—wêRãÎûKßâN¡Æ÷÷-îԥƸtâN\:q§PãN w 5îjÜ)Ը߂Æ8tâNj܉K'îj܉kÜ©C;qèĸtâN]j܉K'îÄ¥wêRãN¡Æø¸wâÒ‰;u©q§.5îÄ¥wâÒ‰;…w¸S¨q§PâN™Æ÷ßoqçý¥oq'Ñë¯ýãwêRãN^JÜÉK‰;u©q§.%îä¡Ä:Ô¸S—w%îäÇ%îԥƺԸ“—wòRâN¡ÆDùË0QâN¡ÆD‰;õ-hÜÉK‰;…w}¬oÔ·¸S_xãN]jÜÉK‰;yiâNjÜ©C;y)q'.¸“(q'>îS—wêRãN¢ÄB;‰Þæß|ˆ>Ö7ê[Ü©oAãN]jÜÉK‰;yék£NÜùÏû-î̯úØ­wêwò‘¸S—wòÐs´NÜ©K;u©q'Ñk´NÜ©K;yé¹?Z'îjÜIô¾?Z'îjÜIô¶?Z'îä¥ÏÖ/—N܉K'î$zíÖ‰;u©q§.5îä¥ÏõÑ:q§5îä¥çþh¸S—wêRãN¢×þh¸S—w=÷GëÄB;‰Þ÷GëÄú4îԥƼô±?Z'îÔ¥ÆDïûuâN^úÚߨÆ:Ô¸“‡>÷7êĺԸ“—wòÒ×þF¸wâN^JÜ©K;u©q'Ñs£NÜ)Ô¸“è}£NÜ©oAãN]jÜÉKÏoÔ¯—>÷7êÄú¸Æ¼ôZߨwêPãN^úØß¨wêRãN]jÜIôÜߨwêRãN]jÜÉKŸûuâN¢ÇþF¸“èk£NÜ©oAãN^zíoÔ‰;qéļôÜߨwêãwêPãNzíoÔ‰;u©q'/}ìoÔ‰;…w½ïoÔ‰;õ…7îÔ¥ÆDûuâN¡ÿíoÔ‰;‰žûuâN]jÜ©K;yéõãúíRâNjÜIô\Ÿ¨wêPãN]jÜÉK¯ý‰:q§.5î$úøñDýŠ>÷'êÄøÂOÜÉK¯OÔ¯—¾ö'êÄDûuâN¡ÆúÂwòÒs¢NÜ©K;u)q'½öªq§>¬q'=÷êĺԸS—wòRâN]jÜ©K;‰&î¤ùܨwêënÜÉK¯ý:q§PãN¢ý:q§.5îԥƼôܨÆ8tâNjÜIóÚ¨wêRãN^zîÔ‰;u©q§.5îä¥×þ@5î¤yìïÓÄú¢wêLãN¢÷ýq:q§ÐÇÿöÇéļô±?N'îԥƺ”¸“‡ž?§_}ýµ=`'î$úاwêRãN]jÜÉKÏýq:q§.5î$z_§w5î¤yìoÓ‰;ñ 8q§.5î$JÜIôÚߦwê oÜÉKûÛtâÎ^º‹;çW6îÔùÄú:w}í/Ö‰;u©q'/}î/Ö‰;ué㱿X'î$úZ_¬w­w 5îÔo¿q'/=÷ëÄB;‰Þ÷ëĺԸS—wòÒÇþd5îÄ¡wâЉ;yéµÿ‹Á‰;õq;u©q'/}îOÖ‰;‰ë“uâN¢¯õÉúlÜIô±?Y'îԥƺԸ“—žû“uâN}\ãN]jÜÉK¯Û'ë Æº”¸“‡>~¼N¿úükë$¾ÅDïûëtâN^úÚ_§wêÒçÏŸgýõÒçú:¸“h?óÜ_§wâ‹>q'.¸“—>÷×éÄDýu:q'/}í¯Ó‰;u©q'/½Ö×éÄ:Ô¸“—þÅϲž¸S׸S—wòÒkNÜ©K‰;yècwÊ4î$úù“¬¿¢çþ:¸S߀ƺԸ“—>÷×éÄú¸Æ¼ôÜ_§wêRâNjÜÉC¯õuúwÞ_úwþré—¸óÏÿ]y‹;9î¼ÐwrÜ9Èqç ÇÐwrÜ9Èqç ÇZâÎAŽ;9î¼ÐwrÜ9Èqç ÇrÜ9Æqç ÇZâÎAŽ;1îã¸óBKÜ9Èqç ÇZâÎAŽ;9îä¸óBKÜ9Èqç ǃw^h‰;9îä¸óBKÜ9Èqç ÆcwþA[Üĸ3ˆqç ÇAŒ;ƒw1îä¸3Hqg ãÎAŽ;ƒw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãΠ‡:™ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwŽqÜĸ3ˆqç…–¸3ˆqgÿBĸsãÎ ÆAŒ;9î zÓ¿ù1î bÜ9ÈqgãÎ ÆAŒ;ýǸ3¿ŠqgãÎAŽ;ƒwÆ0î bÜ9ÈqgãΠƃw=öGk‰;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1î¼Ðw1î bÜĸsãÎ ÆAŠ;Ç8î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î bÜĸsãÎÆAŒ;9î bÜĸ3ˆqç…–¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎ ÆA¯õZâÎ ÆAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î bÜy¡%î bÜĸ3ˆqç Æ1Œ;ƒ^ûµÄAoûµÄAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îĸ3æ±?QŽ;cwrÜĸ3ˆqç ÇAŒ;ƒw1î¼Ðw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŠ;cwbÜø3ˆqgãÎAŽ;ƒw1îä¸3ˆqgâÎƃw1î bÜĸsãÎ ÆAŒ;9î zìÔw)î¼Ìw)îŒaÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎÆA÷?\Á¸sãÎ ÆA¯ýqZâΠ·ýqZâΠƃw)îŒaܤ¸sŒãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŠ;cw^ÈqgÌc›–¸3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgÐ;çW:î RÜø3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgâÎ1Ž;ƒÖ?„Ž;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgâÎË,qgãÎ ÆAŒ;9î bÜĸsãÎ Å1Œ;ƒwŽqÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒwÆ0î bÜ9ÈqgãΠ×þ:-qç ÇAŒ;ƒwŽqÜ´ŸaÜĸóBKÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgâÎ1Ž;ƒwý‹Ÿe]âÎAŽ;ƒw1îä¸3Hqg ãÎ Åcw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç Æ1Œ;ƒwþA[Üôø/qçóÏ_–¸3襸sãÎ ÆAŒ;ƒw^h‰;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎÆAŒ;9î bܤ¸3†qç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î RÜøóBKÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,BÜY£¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w!îŒaÜY¤¸³Hqç ÇEŠ;‹ôâ"ÅAŒ;‹w½ð>AŒ;‹Þðo>EŠ;‹w1î,RÜY¤¸³HqgЋ;û«w)î bÜY„¸³Fqg‘âÎ ÆEŠ;‹w1î,zì–ãÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎAŽ;‹w)î,RÜĸ³HqgâÎÆEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3詸³Hqg‘âÎ"ÅAŒ;‹w)î,Rܤ¸³Fqg‘âÎ ÆEŠ;‹w)î丳Hqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜYôZß(ÇEŠ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;9î,RÜY¤¸³HqgâÎÅE¯ýrÜYô¶¿QŽ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŠ;kûŸ³FqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸sãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw!î¬Qܤ¸³Fqg‘âÎ"ÅAŒ;‹w)î z*î,RÜY„¸³FqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEˆ;Ç8î,BÜY£¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,Rܤ¸³FqgÑí×U(î bÜY¤¸³èµ?NŽ;‹ÞöÇÉqg‘âÎ ÆEˆ;kw!îŒaÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,BÜY£¸sãΚÇþ69î,RÜĸ³Hqg‘âÎ ÆEŠ;‹wÝÇ¡ãüßïh%âÎÅEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"Ä1Œ;‹Ö?„Œ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,BÜ9Æqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³qgâÎ"Ä1Œ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w=w!î¬QÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,BÜø³h?£¸³Hqç ÇEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEˆ;cw)î,ú?Ëê¸3ˆqg‘âÎ"ÅAŒ;‹wÖ(î,BÜø³Hqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎ Å5Š;‹w^h‰;‹ÿ)î|ÿûÇ9¾ÅÏ¿»ÄŸ§5î ú?_ä…N܉K'îԥƺԸóþÒ·¸S¨qçýÇ}‹;u©q'.¸—NÜ)Ô¸èÄB;…w 5îÄ· q'¸S‡wâÒ‰;…wâãwêPãN:q'.¸S—wâÒ³q'.¸S—w 5îÄǸ—NÜ©K;u©q'.¸—NÜ)Ô¸èÄB;…wÊ4î¼ÿ|‹;ï/}‹;‰ò—a}\ãN]jÜÉK‰;y)q§.5îÔ¥Ä<”¸S‡wêRãN¢Äü¸ÄºÔ¸S—wòRâN^JÜ)Ô¸“(&JÜ)Ô¸“(q§¾;y)q§PãN¢õúwê oÜ©K;y)q'/MÜ©C;u¨q'/%îÄ¥w%îÄǸ“—wêRãN]jÜI”¸S¨q'ÑÛü›ÑÇúF}‹;õ-hÜ©K;y)q'/}íoÔ‰;ÿùqÿû%î̯úØ­wêwÒ¸S—wòÐs´NÜ©K;u©q'Ñk´NÜ©K;yé¹?Z'îjÜIô¾?Z'îjÜIô¶?Z'îä¥ÏÖ/—N܉K'î$zíÖ‰;u©q§.5îä¥ÏõÑ:q§5îä¥çþh¸S—wêRãN¢×þh¸S—w=÷GëÄB;‰Þ÷GëÄú<ÿ·?Z'îä¥ýÑ:q§.5î$zßߨwòÒ×þF5îÔ¡Æ<ô¹¿Q'îԥƼ”¸“—¾ö7êÄø¸wòRâN]jÜ©K;‰žûuâN¡ÆDïûuâN} wêRãN^zþx£~½ô¹¿Q'îÔÇ5îä¥×úF¸S‡wòÒÇþF¸S—wêÒßÿsýu;ùq_ûuâN]jÜÉKŸûuâN¢ÇþF¸“èk£NÜ©oAãN^zíoÔ‰;qéļôÜߨwêãwêPãNzíoÔ‰;u©q'/}ìoÔ‰;…w½ïoÔ‰;õ…7îÔ¥ÆDûuâN¡ÆDý:q§¾;u©q§.=wòÒëÇõÛ¥Ä:Ô¸“è¹>Q'îԡƺԸ“—^ûuâN]jÜIôñã‰ú}îOÔ‰;ñ…Ÿ¸“—^?ž¨_/}íOÔ‰;‰>ö'êÄB;õ…7îä¥çþD¸S—wêRâNzí/TãN}XãNzî/Ô‰;u©q§.5îä¥ÄºôüßþB¸“hâNšÏý:q§¾îƼôÚ¨w 5î$úبwêRãN]jÜÉKÏýj܉C'îÄ¡Æ4¯ý:q§.5îä¥çþ@¸S—wêRãN^zíTãNšÇþ>MÜ©/ºq§Î4î$zß§w 5îÔÞ¸“—>öÇéĺԸS—žïëãtâNúúk{ÀNÜIô±?N'îԥƺԸ“—žûãtâN]jÜIô¾>N'îjÜIóØß¦wâpâN]jÜI”¸“赿M'îÔÞ¸“—>ö·éĺԸóŸ—îâÎüÊ÷¿ÖoKãN¢¯ýÅ:q§.5îä¥ÏýÅ:q§.5îä¥çþb5î”iÜI´þ!lÜ)Ô¸S¿ýƼôÜ_¬w 5î$zß_¬wêRãN]jÜÉKû“Õ¸‡N܉C'îä¥×þ/'îÔÇ5îԥƼô¹?Y'î$z¬OÖ‰;‰¾Ö'ë³q'ÑÇþd¸S—wêRãN^zîOÖ‰;õq;u©q'/½ö'ë唸“‡>~¼N¿úükë$¾ÅDïûëtâN^úÚ_§wêÒçÏŸgýõÒçú:¸“h?óÜ_§wâ‹>q'.¸“—>÷×éÄDýu:q'/}í¯Ó‰;u©q'/½Ö×éÄ:Ô¸“—þÅϲž¸S׸S—wòÒkNÜ©K‰;yècwÊ4î$zßk‹w}í¯Ó‰;u©q'/}î¯Ó‰;õq;y鹿N'îÔ¥Ä:Ô¸“‡^ëëô-ô-îüåÒ/qçŸÿãÕ¶Ü9ÈËZ–;y¹s—;y¹óÚ–;y¹s—;y¹óBËrç /wòrç…–åÎA^îäåÎA^î¼—;Çx¹s—;/´,wòrç .wŽñrç…–åÎA^îäåÎ =½Ü9È˃¼Ü9ÈËZ–;y¹s—;y¹óBËrç /wòrç…–åÎA^îÄåÎ1^îüƒ¶åÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg–;c¸Ü9ÈËA\î ârg—;y¹3ˆËA\î ârç /wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA^î ârg—;ƒ´Ü9ÆËA\î ârç…–åÎ .wñ¿vÄåÎA^î ârg—;y¹3èí/ü½‚¸ÜÄåÎA^î z× 9ˆËA\î„åÎoè~¨ó·4¿ŠËƒ¼Ü¤åÎ.wq¹s—;ƒ¸ÜÄåÎA^î zìÖ²ÜÄåÎA^î ârg—;y¹3ˆËA\î ârç…–åÎ .wq¹3ˆËƒ¼ÜÄåÎ -wŽñrg—;ƒ¸ÜÄåÎA^î ârg—;y¹3ˆËA\î ârç /wq¹3ˆËƒž\î ârg—;ƒ¸Ü9ÈËA\î ârg—;q¹3†ËA\îäåÎ .wq¹3ˆËZ–;ƒ¸ÜÄåÎA^î ârg—;ƒ¸Ü9ÈËA\î ârç /wq¹3ˆËA\îäåÎ .wi¹sŒ—;ƒ¸ÜÄåÎ .wòrgÐûþF-ËA\îäåÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Üy¡e¹3ˆËA\î ârç .wÆp¹3ˆËƒ¼Üô¶¿QËrg—;y¹3ˆËA\î ârç /wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA\îŒyìO”—;c¸Ü9ÈËA\î zíOÔ²ÜÄåÎ .wq¹óBËrg—;ƒ¸ÜÄåÎA^î ârg—;y¹3ˆËA\î ârç /wi¹3†Ëƒ¸ÜÃåÎ .wq¹s—;ƒ¸ÜÄåÎAO.wq¹3HË1\îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ .wòrg—;ƒ¸Ü¤åÎË,ËAZîŒárç /wq¹3ˆËA\îäåÎ .wq¹s—;c¸Üt¿œÁåÎA^î ârg—;y¹3èmœ–åÎ .wòrg–;c¸Ü¤åÎ1^î ârg—;y¹3ˆËA\î ârç /wi¹3†ËòrgÌc›–åÎ .wòrg—;ƒ^ûÛ´,wq¹3ˆËA\îôÿc¹3¿RË1\î ârç /wq¹3ˆËƒ¼ÜÄåÎ .wi¹sŒ—;ƒÖ?„O.wòrg—;ƒ¸ÜÄåÎA^î ârg—;y¹3ˆËA\î Òrçe–åÎ .wq¹3ˆËƒ¼ÜÄåÎ .wòrg–;c¸Ü¤åÎ1^î ârg—;y¹3ˆËA\î ârç /wq¹3ˆËƒ¼Ü¤åÎ.wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ´Ü9ÆËAû.wq¹óBËrg—;ƒ¸Ü9ÈËA\î ârg—;y¹3ˆËAZîãåÎ .wý‹Ÿe]–;y¹3ˆËA¯ýuZ–;ƒ´ÜÃåÎ -wŽñrgÐÏŸdýq¹3ˆËƒ¼ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA\îŒárg—;ÿ m¹3èñ_–;_~n`‰;ƒwrÜĸ3ˆqgãÎ -qgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwbÜø3ˆqç ÇAŒ;ƒwÆ0îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŠ;cw^h‰;‹w)î bÜY¤¸³Hqg‘âÎ ÆEˆ;kw1î,RÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"Ä1Œ;‹w)î丳Hqg‘þB\¤¸3ˆqg‘âÎ"ÅAŒ;‹þþ¾"ÅEŠ;ƒw)î,RÜY¤¸3ˆqgÑŠ;û«w1î,BÜY£¸³HqgãÎ"ÅEŠ;ƒw=öGËqg‘âÎ ÆEŠ;‹^û£å¸³Hqg‘âÎ"Ńw)î,RÜY¤¸3ˆqg‘âÎ"Ä1Œ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸³HqgâÎÅEŠ;ƒw)î,RÜY¤¸sãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³HqgâÎÆEŠ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;9î,RÜY¤¸³HqgâÎÅEŠ;ƒw½ío”ãÎ"ÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³HqgÐ qgÍc¢wÖ(î bÜY¤¸³èµ?QŽ;‹w)î,RÜ9Èqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹wÖ(î RÜY£¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY„¸³FqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEˆ;Ç8î,BÜY£¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,Rܤ¸³FqgÑí×U(î bÜY¤¸³Hqgã΢·ýqrÜY¤¸3ˆqgâÎÅEˆ;cw)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹wÖ(îĸ³æ±¿MŽ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒþ{ÜÙ_‰¸³Fqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³qg ã΢õ!ãΠ—âÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEˆ;Ç8î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw!î¬QÜY„¸3†qg‘âÎ"ÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ ÆEˆ;kw)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹wÆ0î,ÚÏ(î,RÜ9Èqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³HqgâÎÆEŠ;‹þÅϲ:î bÜY¤¸³HqgãÎ"Ä5Š;‹wÆ0î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸3HqgâÎ"ÅZâ΢ÇŠ;ÿþËßÖv^Æiç³”—qØyw—qÖù·ÙªÎË8꼌›ÎË8éüc–¢ó2:/ãžóYrÎ˸漌cÎ˸åücœr^Ä%çerþ1KÇygœ—aÅyGœÌÒp^Æ çe\pþ1KÀy÷›—q¾y×›Ìo^Æíæeœn^Æå泄›—q·yg›ÌRm^ÆÑæeØl^ÄÉæßf+6Ç0ØÃ^ó2Î5ǰÖÃXs [ÍË8Õ£RsCÍ˸ÓÃLs +Í1Œ4/ãFs Í1,4Ç0мŒûÌ1Ì3ǰμŒãÌ1l3Ç0ÍÃ2ó23ǰËÃ,ó2®2Ç0ÊÃ&sŒ’Ì‹¸Èà s {Ì?fÉ1ǰÆÿÀŽa‹y§˜cXbŽaˆyw˜cÞô¯3cXaŽa„y7˜c˜`Ža9†æeÜ_Žùoùåü"Ö——q|9Fí妗cX^^Æáåv—c˜]^æÅêrÌc}†–ær “Ë˸¸Ãàr {ËË8·ÃÚr cË1l-ÿ˜%µÃÒr CË1ì,/ãÌr +Ë1Š,/âÆr Ë1,,Ç0°¼ŒûÊ1Ì+ǰ®¼ŒãÊ1l+Ç0­òò2+ǰ«ìò2®*Ç0ªær “Ê˸¨ó¾þågé)Ç0§¼ kÊ!Œ)ǰ¥¼ŒSÊ1,)Ç0¤ÃŽòY2Ê1¬(Ç0¢¼ŒÊ1L(ǰ Àò2î'Ç0ŸÃzò2Ž'ǰÃtr ËÉË8œÃnrŒ²É‹¸šÃhr ›É1L&/ãbr ƒÉ1ì%Ç0—¼ŒkÉ1Œ%ǰ•¼ŒSÉ1,%Ç0”ÃNò2Î$ǰ’ÃHòYÉ1L$ǰÃ@ò2ì#‡0Ã:ò2Ž#Ǽ­¯Î’FŽay‡‘cØEŽa9†UäeEŽa9†Iäe\DŽa9†=äæ—q 9†1ä¶—y)…òX‡CØA^ÆäVcA^Æ ä&cX@ŽaùÇ,ýã˜÷õÑYêÇ1Œ/ãöq ÓÇ1,/ãðq »Ç1Ìǰz¼Œ£Ç1j‡0y¼ ‹Ç! ǰwÃÜñ2®Ç0vÃÖñ2Nǰt£Ðq;ÇË8sÃÊq #Ç1l/ãÄq Ç1 /ã¾q óÆ1¬Ç(nüC–¶qŒÒÆ!,/ã°q »Æ1Ìǰj¼Œ£Æ1lÇ0i¼ ‹Æ! ÇÜÿ<ÙæŒ—qÍ8†1ã¶Œ—qÊ8æm}n–q ;ÆË8c£Šq#Æ1j/â„q Æ1 /ã~q óÅ1¬Ç0^¼ŒÛÅ1J‡°\üc.y¬¯Í’-ŽaµxG‹cØ,Ža²x‹c,Ža¯8†¹âeP+óþ×Íoý.hœ_ÇVq SÅ˸TÃPq ;ÅË8SÃJq #Å1j/âDqÌögÎâeÜ'Žaž8†uâƉ—q›8†iâ–‰—q˜8†]âf‰cT%þ!K”8æ]ÕÇ&‰cX$^ÆAâöˆc˜#^Æ5âňCØ"ŽQŠx—ˆc"Ža‡xgˆcX!Ža„8† âeœ Ža8†âeÜŽQ~8„õáƇ—q{8†éá–‡c^ÆÝáf‡cT^ÄÑá˜õ“Ã1,ÿ˜%8ÃÞp sÃ˸6ÃØp [Ã1L /ãÒp CÃ1ê /âÌp +Ã1ûÏh.áeœŽaa8†áeÜŽQ^8„uáÅ…q[8†iá–…c^Æ]áf…cX^ÆQá6…c˜ŽaQx…CØŽaNø·ÙjÂ1ÿ¾þ~ ¾Õ„Ï¿‹¸Ÿ—5' ú?_â…NOˆK'(Ô¥…ºÔ¤ðþÒ·¦P¨QáýÇ}« u©Y!.®—NX(Ô²褅Bm … µ.Ä· y!¾P‡âÒ) …šâãÚêP#C:•!.ÌP—ÚâÒ q锆ºÔÔP¨­!>îƸô÷ÿf[ÿ?¨“êR{C\:Á!.âP¨É!Ði… ¥:”ivxÿøÖÞ_úåo´ú¸¦‡ºÔö—òRêC]j~¨Kéy(¢µ@Ô¥&ˆDiùq‰u©¢.5Cä¥tˆ¼”Q¨%"QþŠK”Q¨1"QjD} š#òRzD¡‰Dëõ-IÔÞ&Q—%òRªD^š,Q‡Ú%êPÃD^J™ˆK'M$J›ˆ;q"/¥Nԥ扺Ô>‘(¢P E¢·ù×¢õú)ê[ÐJQ—š)òR:E^úÚߨS*êãš*þóÒo©b~ÕçþhXQ_djEzîÖéu©Á¢.µX$zíÖiu©Ñ"/=÷Gëd‹Bí‰.½öG뤋Doû£uâE^úüñhýré䋸túE¢×þh‚Q—š0êRF^ú\­S1êP3F^zîÖ u©%£.5e$zíÖ‰u©5#Ñs´NÏ(Ô ‘è}´NÒ¨oA›F]jÔÈKû£u²F]j×Hô¾ÿÅꔼôµ¿Qmu¨q#}îoÔÉu©}#/%p䥯ý:‰#>î4޼”ÈQ—Z9êR3G¢çþFÐQ¨¥#ÑûþFÖQ߂ƎºÔÚ‘—ž?Þ¨_/}îoÔ õq-yéµ¾Q§yÔ¡F¼ô±¿Q'{Ô¥vºÔð‘蹿Q'}Ô¥¶ºÔø‘—>÷7êäDý:$Ñ×þFRß‚6¼ôÚߨSAâÒÉ y鹿Q'„ÔÇ¥„Ô¡¦<ôÚߨCêRkH^úØß¨ÓC 5ˆ$zßߨ“Dê o©K"‰>ö7êd‘Bí"‰ûuÊH} šFêRÛH]jÉK¯oÔo—’GêPûH¢çúDBR‡šHêRI^zíOÔ©$u©™$ÑÇ'êWô¹?Q§”Ä~RI^zýx¢~½ôµ?Q§–$úØŸ¨ÓK 5˜ÔÞb’—žûušI]j4©K©&y赿Pí&õa 'y蹿P'Ô¥¶“ºÔx’—ROêRóI]j?I4%Íçþ@„R_÷ë} NDIôµ?P'£$úبRêRKJ]jJÉKÏýjL‰C§¦Ä¡æ”4¯ý:A¥.µ¨ä¥çþ@¦R—UêR«J^zíT»JšÇþ>MY©/ºi¥Î´­$zß§SW 5¯ÔÞ¾’—>öÇé–ºÔÄR—ÒXòÐóÇãô롯¿¶ìd–DûãtBK]ji©KM-yé¹?N'¶Ô¥Ö–DïëãtzK —4ým:É%¾§¹Ô¥F—D©.‰^ûÛtºK}á /yéc›Nz©Km/u)ñå?ÝÅ—ù…ÏýÅ:ù¥¾„ö—ºÔ“—>÷ë$˜ºÔ“—žû‹Õ S¦&Ñú‡°!¦PKLýö›bòÒs±NŒ)Ô“è}±N©K 2u©E&/}ìOV›L:Q&*“—^û¿œ.S×0S—ZfòÒçþd6“è±>Y§Î$úZŸ¬Ïö™Dû“u M]j¢©Km4yé¹?Y§ÒÔÇ5ÓÔ¥vš¼ôÚŸ¬SjêRRMúøñ:ýzèó¯­“øVk½ï¯Óé5yékN±©KŸ?žõ×KŸëët¢M¢ýÌsN·‰/ú„›¸tÊM^úÜ_§Ón=ö×éÔ›¼ôµ¿N§ßÔ¥œ¼ôZ_§“pêPN^ú?Ëz*N}\3N]jÇÉK¯ýu:%§.%åä¡ýujÌ)Óš“èçO²þŠžûët‚N}ZtêR“N^úÜ_§uêãZuòÒsNשK ;u¨e'½Ö×é[Ûyé[ÜùË¥Æ×7u™Š âVä Eq-2ˆs‘AÜ‹¼Ð2ÄÅÈ NFq3rG#ƒ¸ÄÙÈAÞ âpd—#ƒ89ˆÛ‘1 âzä ÏGq?2H’1\ä É nHqDrW$ƒ8#ÄÉ Iò’dл¦$ƒ¸%Ä1ÉA^“ âœd÷$yP2ˆ‹’Aš”Œá¦ä…–QÉ"­JiV2ˆ»’E–,Ò²d‘¦%ƒ¸-Y„qÉšþS÷Aœ—,Ò¾d‘&‹´0ĉÉ"mLid²H+“Aœ™,ÒÎd‘†&ƒ¸4Y¤©É"mMil2ˆk“Eš›,ÒÞd'‹´8Y¤ÉÉ"lNÆpt²H«“EšäÝÉ" Oé¿jT¤éÉ nOi|²Hë“AœŸ,zûëþ?ÕU¤Ê"-Pq‚²H”E¡,Ò eg(‹þÓe•†(ƒ¸DY„)ÊmQiŒ2ˆk”Eš£,Òe)‹û£åIÊ"mRq”²H«”Eš¥ â.e‘†)‹´LY¤iÊAÞ¦,Ò8e‘Ö)‹4OÄ}Ê" Ta¡2†•EÚ¨,ÒHe‘V*ƒ8SY¤Ê" Uq©²HS•EÚª,ÒXe×*‹4WY¤½Ê Vi±²H“•EÚ¬ âheÑûþ+ÏVi·2HÕ5Z®,Òte·+‹4^Y¤õÊ"ÍWò~e‘,‹´`Ä Ë"mXiIJH+–Aœ±,ÒŽeÑk£¼dY¤)Ë"mYiÌ2ˆk–Eš³,že -‹´hY¤IË"mZqÔ²H«–Ešµ,Ò®e‡-‹´lY¤iË Om[iܲHë–Eš· â¾e‘.‹´p9È—EÚ¸,ÒÈe‘V.ƒ4sY£Ë" ]qé²èm£¼uY¤±Ë ®]iî²H{—E¼ ââe‘&/‹´yÄÑË"­^iö²H»—A¾,Òòe‘¦/ƒ´}YóØŸ(®_Öhþ2ˆû—EÀ,Òf'0‹´Y¤Ì"­`ò fÑûþDy³HK˜AœÂ,Òf‘Æ0ƒ¸†Y¤9Ì"íai3ˆ‹˜E˜Ä¬Ñ&fF1k´ŠY¤YÌ"íbq³H˘EšÆ â6f‘Æ1‹°ŽY£yÌ îci ³H ™EšÈ âFf‘F2‹´’Ä™Ì"ídi(³K™c<•Y„­Ìeq-³Hs™EÚË,Ò`f3‹4™Y¤ÍÌ fÖh5³èv6¡B»™AÎ,Òrf‘¦3ƒ¸Yô¶?N^Ï,Ò|f÷3‹0 Y£Í"LhÆpC³H#šEZÑ úÔŒf‘v4‹4¤Y¤%Í NiaK³Fcšƒ¸¦YóØß&ïiiP3ˆ‹šEšÔ,Ò¦fG5‹´ªY¤YÍ"íjqX³è¿.köjZ³HÛšA×,Òºf‘æ5ƒ¸¯Y¤Í"-lab3†›EëB®lqf³H;›EÚ,ÒÒf§6‹´µY¤±Í ®min³H{›EÜãÅÍ"Mnis³H£›A\Ý,Òìf‘v7ƒ8¼Y„åÍMoa{3†ã›EZß,Òüf÷7‹4ÀY¤Î"Mpqƒ³H#œE¯ýÉò gv8k4ÄY¤%Î Nqi‹³HcœEZã âg‘ö8‹0ÈÃE΢ýŒ69‹4Ê9È«œEšå,Ò.g‡9‹´ÌY¤iÎ"msqœ³HëœE˜çŒá>g‘:‹þÅϲz¢3ˆEé,ÒJgg:‹°ÓY£¡Î",uÆpª³H[Eë,ÒZgç:‹´×Y¤ÁΠë.ÇÉÎ"mvi´3H«5ší,Ònç…–á΢ÇYîüüÓflqç ÇZâÎAŽ;9îä¸óÚâÎAŽ;9îä¸óBKÜ9Èqç ÇZâÎAŽ;9îä¸óBŽ;Ç8îä¸óBKÜ9Èqç Æcw^h‰;9îä¸óBKÜ9Èqç ǃw^h‰;9îä¸sãÎ -qç ǃw^h‰;9îĸsŒãÎ?h‹;ƒw1îä¸3ˆqgãΠƃw)îŒaÜ9ÈqgãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îôɸ3ˆqgãÎ Åcw1î bÜy¡%î bÜÄ¿1îä¸3ˆqgãÎAŽ;ƒÞôo>AŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒîãÎoè¾åü­_å¸3Hqg ãΠƃw1î bÜ9ÈqgÐc´–¸3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎ -qgãÎ ÆAŒ;9î bܤ¸sŒãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ ÆAŒ;1îŒaÜĸsãÎ ÆAŒ;ƒw^h‰;ƒw1îä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î zßß(Çcw1î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç OÆAŒ;ƒw1îä¸3ˆqgãÎ -qgãÎ ÆAŒ;1îŒaÜĸsãΠ·ýZâΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwbÜóØŸ(Ç1Œ;9î bÜĸsãÎ ÆAŒ;ƒw^h‰;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎ Å1Œ;1îŒaÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3Hqg ãÎAŽ;ƒÞ÷j‰;ƒwrÜĸ3ˆqç ÇAŒ;ƒw)î¼Ìw)îŒaÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎÆA÷?\Á¸sãÎ ÆAŒ;9î zÛ§%î bÜ9ÈqgâÎÆAŠ;Ç8î bÜĸsãÎ ÆAŒ;ƒwrܤ¸3†qç…wÆ<ö·i‰;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3è6îüfî;λ4¿’qç ÇAŒ;ƒwrÜĸ3ˆqgâÎ1Ž;ƒÖ?„Ž;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgâÎË,qgãÎ ÆAŒ;9î bÜĸsãÎ Å1Œ;ƒwŽqÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒwÆ0î bÜ9ÈqgÐûþ:-qgãÎAŽ;ƒw)îã¸3h?ø3ˆqç…–¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ Åcw1î ú?˺ăw1î bÜ9ÈqgâÎÆAŠ;Ç8î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŒ;cw1îüƒ¶¸3èñŸâÎ?ÿ—õoqço£ A;›tâN\:q§.5îÔ¥Æ÷—¾ÅB;ï?î[Ü©K;qéĸtâN¡Æ@'îjÜ)Ô¸S¨q'¾;qèÄ:Ô¸—NÜ)Ô¸׸S‡wâЉ;qéĺԸ—N܉K'îÔ¥ÆB;ñq'îÄ¥wêRãN]j܉K'îÄ¥w 5î:q§PãN¡Ä2;ï¿ßâÎûKßâN¢×_ûÇ5îԥƼ”¸“—wêRãN]JÜÉC‰;u¨q§.5î$JÜÉKÜ©K;u©q'/%îä¥ÄB;‰ò—a¢ÄB;‰wê[и“—w 5î$úXߨoq§¾ðƺԸ“—wòÒÄ:Ô¸S‡wòRâN\:q'QâN|܉;y)q§.5îÔ¥ÆD‰;…w½Í¿ù}¬oÔ·¸S߂ƺԸ“—wòRâN¡Æú¸Æ¼ôyûFýwίjܩӉ;õ56î䡯ýÑ:q§.5î$zíÖ‰;u©q'/=÷GëÄB;‰Þ÷GëÄB;‰ÞöGëļôùãÑúåÒ‰;qéÄD¯ýÑ:q§.5îԥƼô¹>Z'îԡƼôÜ­wêRãN]jÜIôÚ­wêRãN¢çþh¸S¨q'Ñûþh¸S߂ƺԸ“—>öGëĺԸ“è}´NÜÉK_ûÕ¸S‡wòÐçþF¸S—wòRâN^úÚߨwâãNÜÉK‰;u©q§.5î$zîoÔ‰;…w½ïoÔ‰;õ-hÜ©K;yéùãúõÒçþF¸S׸“—^ëuâNjÜÉKûuâN]jÜ©K;‰žûuâN]jÜ©K;yés£NÜIôØß¨w}íoÔ‰;õ-hÜÉK¯ý:q'.¸“—žûuâN}\âNjÜÉC¯ý:q§.5îä¥ý:q§PãN¢÷ý:q§¾ðƺԸ“èãÿãìîÒÛ°’&ÝÎHO› ~8ÿ‰²› ¬”ÎUÝ,&X,wï–š¯c£NÜ)Ô¸“貿Q'îÔ q§.5îԥƼtÿñF½º”¸S‡wÝÖ'êÄ:Ô¸S—ŸûuâN]jÜ©K;‰®?ž¨—è±?Q'îÄ7~âN^ºÿx¢^^úÚŸ¨w]÷'êÄB;õ7îä¥Ä¼ôµ?Q'îÔ¥ÄÑw)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹wÖ(î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEˆ;cw)î,ºãÿ7bãÎ"ÅEúq‘âÎ ÆEŠ;‹w1î,úÀßù)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹wýUÜ™¯bÜY„¸³Fqg‘âÎ ÆEŠ;‹w1î,ºì–ãÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎAŽ;‹w)î,RÜĸ³HqgâÎÆEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,RÜY¤¸3HqgâÎ"ÅAÏÿ\.1î,RÜY¤¸sãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³HqgâÎÆEŠ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅE÷ýrÜY¤¸³Hqg‘âÎ Å5Š;‹w1î,úØß(ÇEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ Å5—ý‰bÜY£¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜ9Èqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹wÖ(î RÜY£¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY„¸³FqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3èßÿ\ÿ§cÜY¤¸³qçÇEˆ;kw1î,RÜY¤¸³HqgãÎ"ÅE÷ýbÜY£¸³èí/×U(î bÜY¤¸³Hqgã΢ýqrÜY¤¸3ˆqgâÎÅEˆ;cw)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹wÖ(îĸ³æ²¿MŽ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw!î¬ù븳_©¸3ˆqg‘âÎ"ÅAŒ;‹w)î,BÜø³hý‡qgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEˆ;Ç8î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw!î¬QÜY„¸3†qg‘âÎ"ÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ ÆEˆ;kw)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹wÆ|)î,ÚÏ(î,RÜ9Èqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³HqgâÎÆEŠ;‹þàwYw1î,RÜY¤¸3ˆqgâÎÅEˆ;cw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,Rܤ¸³Fqg‘âÎ'Zâ΢Ë_ÅŸÿþFÚ·¸óÕ(hPãÎWó¢ƒN܉K'îԥƺԸóý¥oq§PãÎ÷÷-îԥƸtâN\:q§PãN w 5îjÜ)Ô¸?‚Æ8tâNj܉K'îj܉kÜ©C;qèĸtâN]j܉K'îÄ¥wêRãN¡Æø¸wâÒ‰;u©q§.5îÄ¥wâÒ‰;…w}5îjÜ)”¸S¦qçûŸÀ·¸óý¥oq'Ñý×þq;u©q'/%îä¥ÄºÔ¸S—wòPâNjÜ©K;‰wòãwêRãN]jÜÉK‰;y)q§PãN¢üa˜(q§PãN¢Äú4îä¥ÄB;‰®ëõ-îÔ7Þ¸S—wòRâN^š¸S‡wêPãN^J܉K'î$J܉;q'/%îԥƺԸ“(q§PãN¢ù;¢ëúF}‹;õ#hÜ©K;y)q'/}íoÔ‰;õq;yéñözwÎW5îÔéÄúwòÐ×þh¸S—wÝ÷GëĺԸ“—nû£uâN¡ÆDŸû£uâN¡ÆDû£uâN^züx´^\:q'.¸“è¾?Z'îԥƺԸ“—ë£uâNjÜÉK·ýÑ:q§.5îÔ¥ÆD÷ýÑ:q§.5î$ºíÖ‰;…w}îÖ‰;õ#hÜ©K;yéº?Z'îÔ¥ÆDŸû£uâN^úÚߨÆ:Ô¸“‡ûuâN]jÜÉK‰;yék£N܉;q'/%îԥƺԸ“è¶¿Q'îjÜIô¹¿Q'îÔ q§.5îä¥Û7êå¥ÇþF¸S׸“—îëuâNjÜÉK×ý:q§.5îÔ¥ÆD·ý:q§.5îԥƼôØß¨w]ö7êÄD_ûuâNý¾>÷7êĸtâN\:q'/Ýö7êÄú¸Ä:Ô¸“‡îûuâN]jÜÉK×ý:q§PãN¢Ïý:q§¾ñƺԸ“躿Q'îjÜItÙߨwêGиS—wêRãN^ºÿx£^]JÜ©C;‰nëuâNjÜ©K;yé¾?Q'îÔ¥ÆD×OÔKôØŸ¨wâ?q'/ݬq'ÝöêĺԸS—wòRâN]jÜ©K;‰&î¤yìÔ‰;õ}7îä¥ûþ@¸S¨q'Ñu NÜ©Kÿþy{ýŸ®q'/Ýöªq'¸‡wÒÜ÷êĺԸ“—nûuâN]jÜ©K;yé¾?P;i.ûû4q§¾éÆ:Ó¸“èsœNÜ)Ô¸SßxãN^ºîÓ‰;u©q§.%îä¡ÛÇé塯_ÛvâN¢ëþ8¸S—wêRãN^ºíÓ‰;u©q'Ñçú8¸¨q'Íe›N܉À‰;u©q'QâN¢ûþ6¸SßxãN^ºîoÓ‰;u©q§.%îä¡ÛÛÇé]Ü™¯üÚ_¬wê{hÜÉKýÅ:q§.5îä¥Ûþb5î”iÜI´þCظS¨q§þë7îä¥Ûþb¸S¨q'Ñçþb¸S—wêRãN^ºîOVãN:q'¸“—îûßœ¸S׸S—wòÒc²NÜItYŸ¬w}­OÖ£q'Ñu²NÜ©K;u©q'/Ýö'ëÄú¸ÆºÔ¸“—îû“uâN]JÜÉC×OÖËC_['ñ-î$úÜ_§wòÒ×þ:¸S—?Ÿõå¥Çú:¸“h?sÛ_§wâ›>q'.¸“—ûëtâN¢Ëþ:¸“—¾ö×éĺԸ“—îëëtâNjÜÉKð»¬'îÔÇ5îԥƼtß_§wêRâNºî¯SãN™ÆD?“õ%ºí¯Ó‰;õhÜ©K;y鱿N'îÔÇ5îä¥Ûþ:¸S—wêÐ×çþ:¸óý¥oqçûKßâΗ^ÄÿûSÄm;9î|¢%îä¸sãÎAŽ;£-îä¸sãÎAŽ;Ÿh‰;9îä¸ó‰–¸sãÎAŽ;9î|"ÇcwrÜùDKÜ9Èqç Æcw>ÑwrÜ9Èqç-qç ǃwrÜùDKÜ9Èqç ǃw>ÑwrÜ9Èqç-qç ǃwŽqÜùmqgãΠƃw1î bÜĸsãÎ Å1Œ;9î bÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bܤ¸sŒãÎ ÆAŒ;Ÿh‰;ƒwñÄAŒ;9î úT'ĸsãΠýOãΠƃw1î bÜĸsãÎ ÆAwÎW9î RÜø3ˆqç ÇAŒ;ƒwrÜtÙ­%î bÜ9ÈqgãΠƃw1î bÜĸ󉖸3ˆqgãΠƃw1î RÜ9ÆqgãÎ ÆAŒ;9î bÜtß­%î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1î bÜ9ˆqg ãΠƃw1î bÜĸ󉖸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎ ÆAŠ;Ç8î bÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ ÆO´ÄAŒ;ƒw1îĸ3†qgãÎAŽ;ƒ>ö7j‰;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î bÜ9ˆqgÌe¢wÆ0îä¸3ˆqgãÎAŽ;ƒw1î bÜùDKÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw)ï/”ãÎÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒwÆ0îä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŠ;Ÿf‰;ƒwÆ0îä¸3ˆqgãΠƃw1î bÜ9ˆqg ãΠ÷¿\Á¸sãΠÏýqZâÎAŽ;ƒ>öÇi‰;ƒwrܤ¸3†qgâÎ1Ž;ƒw1îä¸3ˆqgãΠƃw)îŒaÜùDŽ;c.ûÛ´ÄAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrܤ¸3æ}Üù ½ï8ß ó•Ž;ƒw1îä¸3ˆqgãÎ Åcw­ÿ:îä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŠ;Ÿf‰;ƒw1î bÜ9ÈqgãΠƃw)îŒaܤ¸sŒãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrܤ¸3†qgãÎAŽ;ƒw1î bÜ9ÈqgãÎ Åcwígw1î|¢%î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3HqçÇAŒ;ƒþàwY—¸sãÎ ÆAŒ;9î RÜø3HqçÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ˆqg ãÎ Æ¿Ñw]þ"î¼ÿ¿ßÿ×ý·¸óÅ(hQãΣ A'îÄ¥wêRãN]jÜùþÒ·¸S¨qçûûwêRãN\:q'.¸S¨q'Љ;…w 5îj܉AãN:q§5îÄ¥w 5îÄÇ5îÔ¡Æ8tâN\:q§.5îÄ¥wâÒ‰;u©q§PãN|܉;qéĺԸS—wâÒ‰;qéÄB;NÜ)Ô¸S(q§LãÎ÷?oqçûKßâN¢û¯ýãwêRãN^JÜÉK‰;u©q§.%îä¡Ä:Ô¸S—w%îäÇ%îԥƺԸ“—wòRâN¡ÆDùÃ0QâN¡ÆD‰;õ#hÜÉK‰;…w]×7ê[Ü©o¼q§.5îä¥Ä¼4q§5îԡƼ”¸—NÜI”¸wâN^JÜ©K;u©q'QâN¡ÆDów>D×õúwêGиS—wòRâN^úÚߨwêãwòÒc£NËùßKÿ-@ÏW]ÖGëÄúwêRãN]jÜItß­wêRãN^ºíÖ‰;…w}îÖ‰;…w}ìÖ‰;yéñãÑzqéĸtâN¢ûþh¸S—wêRãN^z¬Ö‰;u¨q'/ÝöGëĺԸS—wÝ÷GëĺԸ“(q'Ñ×þh¸“ès´NÜ©AãN]jÜÉK×ýÑ:q§.5î$úÜ­wòÒ×ÛGë Ä:Ô¸“‡ûuâN]jÜÉK‰;yék£N܉;q'/%îԥƺԸ“è¶¿Q'îjÜIô¹¿Q'îÔ q§.5îä¥Û7êå¥ÇþF¸S׸“—îëuâNjÜÉK×ý:q§.5îÔ¥ÆD·ý:q§.5îԥƼôØß¨w]ö7êÄD_ûuâNýwòÒ}£N܉K'îä¥ÛþF¸S—¸S‡wòÐ}£NÜ©K;y麿Q'îjÜIô¹¿Q'îÔ7Þ¸S—w]÷7êÄB;‰.ûuâNýwêRãN]jÜÉK÷oÔ«K‰;u¨q'Ñm}¢NÜ©C;u©q'/Ý÷'êĺԸ“èúã‰z‰ûuâN|ã'îä¥û'ê奯ý‰:q'Ñu¢NÜ)Ô¸SßxãN^ºíOÔ‰;u©q§.%îä¡ûþB5îÔ‡5îä¡ÛþB¸S—wêRãN^JÜ©K;u©q'ÑÄ4ý:q§¾ïƼtߨw 5î$ºîÔ‰;u©q§.5îä¥Ûþ@5îÄ¡wâPãNšûþ@¸S—wòÒm NÜ©K;u©q'/Ý÷ªq'MâN¢ÛöM7îÔ™ÆDŸûãtâN¡ÆúÆwòÒuœNÜ©K;u)q'Ý~×ÇéÄ@;i.ûÛtâNüNÜ©K;‰wÝ÷·éÄúÆwòÒu›NÜ©K;u)q'ÝöÇéÄÿý´×qg¿²q§Î7îԙƺԸS—wòÒm±wÊ4î$Zÿ!lÜ)Ô¸SÿõwòÒm±NÜ)Ô¸“ès±NÜ©K;u©q'/]÷'«q'¸‡NÜÉK÷ýo NÜ©kÜ©K;yé±?Y'î$º¬OÖ‰;‰¾Ö'ëѸ“èº?Y'îԥƺԸ“—nû“uâN}\ãN]jÜÉK÷ýÉ:q§.%îä¡ë'ëå¡Ç¯­“øw}î¯Ó‰;yékNÜ©KŸ¿ÏúòÒc}NÜI´Ÿ¹í¯Ó‰;ñMŸ¸—NÜÉKýu:q'ÑeNÜÉK_ûëtâN]jÜÉK÷õu:q§5îä¥?ø]ÖwêãwêRãN^ºï¯Ó‰;u)q']÷שq§LãN¢Ÿ¿ÉúÝö×éÄú4îԥƼôØ_§wêãwòÒmNÜ©K‰;u¨q'Ý××é[ÜùþÒ·¸óÅ¥qçÿþßÙËpgŒv;Çp¶3F«1íŒÑfçÓx²3F‹1ìŒÑ^çÎuÆh­3Fcc¸Õ£©Î-uÆh¨sŒv:C4Ó£•Î1éŒÑFg &:C´Ð9†1ÚçŒÑ<ç®sÆhœ3FÛœ1šæÃeÎ sÆh—3F³œc¸Ê£QÎmrŽá$gŒ9c0È¢=Χñg Ö8k0Æ£-ÎLqÖ`‰³Cœ1Úá¬y?ÃY‚ÎpÖ`ƒ³œ5XàŒÑg ö7k0¿YƒõÍoÖ`{³Ó›1ZÞ¬Áðf v7k0»£ÕÍŒnÖ`s3F“›5XܬÁàfÍû½ÍÍmÖ`m³c›c¸µYƒ©ÍüÛ‰j0´£ÍÌlÖ`e3F#›5¿Þþ«·j0±Yƒ…Í lÖ`_³óš5X׌Ѹf ¶5kÞOkÖ`HóU|9_ô~X³»š5˜ÕŒÑªf F5k°©£IÍšËú qP³{š1šÓ¬Ášf Æ4c´¥Yƒ)Í,iÖ`Hs w4k0£YƒÍŒhÆhC³š5ï4C4 YƒýÌÌgÖ`=3Fã™5ØÎ¬¹¯Ï—3k0œYƒÝÌÌfÆh5³æs}†¸™£ÉÌ,fÖ`0³{™1šË¬ÁZf Æ2k°•ƒ©Ì,eÖ`(3F;™5˜É¬ÁJf F2Çp#³™5XÈŒÑ@f ö1k0YƒuÌcÖ`³Ó˜1ZƬÁ0f v1k0‹£UÌŒbÖ¼ßÄ Ñ$f 1k0ˆYƒ=ÌÍaÖ` ³c˜5ØÂŒÑf –0k0„£ÌÌ`Ö`³#˜1ÚÀ¬Áf 0Çp³û—5˜¿¬Áúe Æ/K°}YƒéË-_Ö|¬¯w/k0{£ÕËŒ^Ö`󲓗1Z¼¬Áàe ö.c4wYƒµËŒ]Ö`ë2FS—5Xº¬ÁÐe v.K.룣•ËŒ\Æhã²æs}t¸p£Ëì[Ö`Þ²ë–c8nYƒmËL[Ö`Ù2FÖ5ص¬Á¬eŒV-k0jYƒMËLZÆhѲæý eÉ}}s4gY‚5ËŒYÖ`Ë2FS–5X²¬ÁeŒv,k0cYó~Ų#–1Ú°¬Á„e ,k0`£ýÊÌWÖ`½2Fã•5Ø®¬ÁteÍûåÊ!®¬y¿[Y‚ÙÊ­VÖ`´²›•5˜¬ŒÑbe +k°Wƒ¹Ê¬UÖ¼ (ÀVeŒ¦*k°TYƒ¡ÊíTÖ|¬Ï W*k0R£Êš÷•%X¨¬y?P¢}ÊÌSÖ`2Fã”5ئ¬Á4e –)c4LYó~—²³”c´JYrY_nRÖ`’2F‹”5¤¬ÁeŒæ(k°FYƒ1ÊlQÆhвæýe †(kþv‡2_¨Ê¬PÖ`„2F”5˜ ¬ÁeÍûÊíOÖlÿÌi}2Fã“5Øž¬Áôd –'c4Ñ’8±q º+7äÊ1ˆ™c;Ç †Žƒ\:1u bë8ȱckÇ æŽAì9x bñ¤äqŒ›Ç FA¬ƒ˜=r÷Äð1ˆåcÓÇAnƒ?±~äü1ˆýcÈ ƒœ@± bùDKÄ 2ˆdCÈA,!c˜B±…ä2èc£–2ˆ=ä ‘A,"ƒ˜D±‰ä(2ˆUd³ÈAî"ƒF±Œ b9ÈmdãÈ Ö‘ƒ˜GÆ\ö'Êd ÉAN$ƒ>÷'j‰$¹’ b&ÄN2ˆ¡ä-¥dSÉ ¶’AŒ%¹– b.Ä^rƒÉ “AL&ƒØLr4¤j2†Ùä v“1 'ƒXN1äv2ˆñdëÉAÎ'ƒØO) ŒaA9È eÊ F”A¬(9£ bGÄrKÊ ¦”Al)ƒS>ÍRS)§Œ¹ïÔT±¨ bRĦr£Ê V•AÌ*±«ŒaXôþ7ë"˜Vr[ĸ2ˆuå ç•Aûã´–A,,9± RcÃÈ2H•åg–Aì,ƒZriÄÔ2ˆ­ecËA®-ƒ”[ư·|"—1—ýmZ’Ë 6—ƒ]±º bv9ÈÝeÃË –—AL/¹½ R|Ãú2è}~yRËwf¾’f ÌAN0ƒØ`1 R…9ÆfÐú¡CÌA.1ƒ˜b±Å bŒ9È5fsÌ ö˜ƒd±È b’¤&ói–(3ˆUf³Ì v™ƒf±Ì bš9ÈmfâÌÖ™AÊ3Ç¸Ï b tߟ¬%Ñ b£ÄH3ˆ•æ gšAì4ƒjr©¤T3†­fcÍA®5ƒ˜k±× b°9ÈÅf“Í 5›cmíg˜m±Û|¢%Ü b¹ÄtsÛÍ Æ›A¬7ƒ˜or¿Ä€3Hç'œAl8ƒþàwY—Šs3Î vœA 9¹ä RÊÖ3H1çלAÌ9ƒØs1èä¢3ˆIg›ÎAŽ:ƒXu1ë b×9ˆag ËÎ ¦¿ÑÖv]þ&îüç÷ÿÐw1îä¸3ˆqgãÎ ÆO´ÄAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ˆqg ãΠƃw1î RÜøsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw)îŒaÜùDKÜY¤¸³èç†_}ãÎ"ÅEŠ;‹w1î,BÜY£¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w!îŒaÜY¤¸³Hqç ÇEŠ;‹ôâ"ÅAŒ;‹w)î bÜYô¿ó)RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,RÜôwqg¿ qgâÎ"ÅAŒ;‹w)î bÜYtÙ-ÇEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"Ńw)î,RÜY¤¸3ˆqg‘âÎ"Ä1Œ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸³HqgâÎÅEŠ;ƒw)î,RÜY¤¸sãÎ"ÅEw„3AŒ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³qg ãÎ"ÅEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"Ńw)î,RÜY¤¸3èÄ5Š;‹w1î,úØß(ÇEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ Å5—ý‰bÜY£¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜ9Èqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹wÖ(î RÜY£¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY„¸³FqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEˆ;Ç8î,BÜYsß(ÇEŠ;‹w)î bÜY¤¸³HqgâÎÅEo¹®BqgãÎ"ÅEŠ;ƒw}ì“ãÎ"ÅAŒ;‹wÖ(î,BÜø³Hqg‘âÎ ÆEŠ;‹w)î bÜY„¸³Fqç Æ5—ýmrÜY¤¸3èÅEŠ;‹w1î,RÜY¤¸³HqgãÎ"Ä5Š;‹wý}ÜÙ¯TÜY¤¸3ˆqg‘âÎ"ÅEˆ;cw­ÿ2î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³qçÇEŠ;‹w)î bÜY¤¸³HqgãÎ"Ä5Š;‹wÆ0î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³qgâÎ"ÅAŒ;‹w)î,RÜĸ³HqgâÎÆEûÅEŠ;9î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,BÜø³HqgÑü.«ãÎ ÆEŠ;‹w1î,BÜY£¸³qg ãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒwÖ(î,RÜùDKÜYtù«¸ó¯ùã{Üyû·KüyzPãΠÿóM>щ;qéĺԸS—w¾¿ô-îjÜùþã¾ÅºÔ¸—N܉K'îjÜ tâN¡ÆB;…wâGи‡NÜ©C;qéÄB;ñq;u¨q'¸—NÜ©K;qéĸtâN]jÜ)Ô¸wâN\:q§.5îԥƸtâN\:q§PãN w 5îJÜ)Ó¸óýOà[ÜùþÒ·¸“(ÖÇ5îԥƼ”¸“—wêRãN]JÜÉC‰;u¨q§.5î$JÜÉKÜ©K;u©q'/%îä¥ÄB;‰ò‡a¢ÄB;‰wêGи“—w 5î$º®oÔ·¸SßxãN]jÜÉK‰;yiâNjÜ©C;y)q'.¸“(q'>îS—þIÜ©K;‰w 5î$ú˜¿ó!º®oÔ·¸S?‚ƺԸ“—wòÒ×þF¸S׸“—ûuâN]JËùßC¯Ð|Ñm´NÜ©ï±q§.5î$ºïÖ‰;u©q'/ÝöGëÄB;‰>÷GëÄB;‰>öGëļôøñh½¸tâN\:q'Ñ}´NÜ©K;u©q'/=ÖGëÄ:Ô¸“—nû£uâN]jÜ©K;‰îû£uâN]jÜItÛ­w 5î$úÜ­wêGиS—wòÒu´NÜ©K;‰>÷Gëļôµ?Z;u¨q'=ö7êĺԸ“—wòÒ×þF¸wâN^JÜ©K;u©q'Ñm£NÜ)Ô¸“ès£NÜ©AãN]jÜÉK·oÔËKý:q§>®q'/Ý×7êÄ:Ô¸“—®ûuâN]jÜ©K;‰nûuâN]jÜ©K;y鱿Q'î$ºìoÔ‰;‰¾ö7êÄú4îä¥ûþF¸—NÜÉK·ý:q§>îŸÖ7êÄ×ÇéÄ@;i.ûÛtâNüNÜ©K;‰wÝ÷·éÄúÆwòÒu›NÜ©K;u)q'ÝöÇéÄú´Æÿ½ô.îÌW^÷ëÄúFwêRãN^ºí/VãN™ÆDë?„;…wê¿~ãN^ºí/Ö‰;…w}î/Ö‰;u©q§.5îä¥ëþd5îÄ¡wâЉ;yé¾ÿÁ‰;õq;u©q'/=ö'ëÄD—õÉ:q'Ñ×úd=w]÷'ëĺԸS—wòÒm²NÜ©kÜ©K;yé¾?Y'îÔ¥ÄѲÜ9È˃¸Ü9ÆËO´,wòrç /w>ѲÜ9È˃¼Ü9ÈËO´,wòrç /wòrç-˃¼Ü9ÈËO´,wòrç .wŽñrço´-wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ>ñ¯FŽárç /wq¹3ˆËA\îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA^î ârg—;y¹3ˆËA\î Òrç/w}êß?ÄåÎ'Z–;ƒ¸ÜÄÛQ—;ýÃåÎ .wq¹s—;ƒ>~á_èÄåÎ .wòrg—;ƒ¸ÜÄåÎA^î ârg—;a¹óz;Ôù*îÌq¹3ˆËƒ¼ÜÄåÎ .wòrgÐe´–åÎ .wòrg—;ƒ¸Ü9ÈËA\î ârg—;ŸhYî ârg—;ƒ¸Ü9ÈËA\î Òrç/wq¹3ˆËA\îäåÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Ü9ÈËA\î ârg—;y¹3ˆËA\î ârç .wÆp¹3ˆËƒ¼ÜÄåÎ .wq¹ó‰–åÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrgÐçþF-˃¼ÜÄåÎ .wq¹s—;ƒ¸Ü¤åÎ1^î ârg—;ƒ¸Ü9ÈËA\î ârg—;y¹3ˆËA\îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ .w>ѲÜÄåÎ .wq¹sÐ?ZîŒárg—;y¹3èc£–åÎ .wòrg—;ƒ¸ÜÄåÎA^î ârgÐc£–åÎ .wq¹3ˆËƒ¼ÜÄåÎ .wârgÌe¢¼ÜÃåÎA^î ârg—;y¹3ˆËA\î ârç-ËA\î ârg—;y¹3ˆËA\îäåÎ .wq¹3ˆËƒ¼Ü¤åÎ.wârg —;ƒ¸ÜÄåÎA^î úÜ_¨e¹s—;ƒ¸Ü¤åÎ.wòrg—;ƒ¸ÜÄåÎA^î ârg—;y¹3ˆËA\î ÒrçÓ,ËAZîŒárç /wq¹3ˆËA\îäåÎ .wq¹s—;c¸Üô~9!‚˃¼ÜÄåÎ .wòrgÐÇþ8-ËA\îäåÎ -wÆp¹3HËc¼ÜÄåΠÇþ8-ËA\î ârg—;y¹3HË1\î|"/wÆ\ö·iYî ârç /wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ´ÜÃåÎ .wúÿ±Ü™¯ärg—;y¹3ˆËA\î Òrç/w­ÿz¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Ü9ÈËA\î ârg–;ŸfYî ârg—;ƒ¸Ü9ÈËA\î ârç /wi¹3†ËAZîãåÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrgÐçþd-˃¼Ü¤åÎ.wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ´Ü9ÆËAû.wq¹ó‰–åÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ´Ü9ÆËA\î úƒße]–;y¹3ˆËA\îäåÎ -wÆp¹3HËc¼ÜÄåÎ .wq¹s—;ƒ¸ÜôØ_§e¹3ˆËA\î ârç .wÆp¹3ˆË¿Ñ¶Ütù›åÎÿý¿Ãþ÷¿áw1îä¸3ˆqgãÎ ÆO´ÄAŒ;ƒw1îä¸3ˆqgпÿÿý¿Ò9î bÜĸ3ˆqç Æ1Œ;ƒwrÜĸ3Hqg ãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î bÜĸsãÎ ÆAŒ;9î bܤ¸3†qç-qg‘âÎ"ÅAŒ;‹w)î,RÜĸ³qgâÎ ÆEŠ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY„¸3†qg‘âÎ"Ńw)î,Òˆ‹w1î,RÜY¤¸3ˆqgÑþΧHqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³è±¿QŽ;‹þ&îì)î,RÜĸ³Hqg‘âÎ ÆE—ýÑrÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜ9Èqg‘âÎ"ÅEŠ;ƒw)î,BÜø³Hqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;‹w)î¬QÜY¤¸3ˆqg‘âÎ"ÅEŠ;9î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒ>w)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w!îŒaÜY¤¸³Hqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸sãÎ"ÅEŠ;‹w)î¬QÜY¤¸3ˆqgÑÇþF9î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w=ö7Êqg‘âÎ"ÅEŠ;ƒw)î,Rܤ¸³æ²?QŒ;kw1î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;9î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒ>w)î,RÜY¤¸3ˆqgâÎÅAŠ;kw)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹wÖ(î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³qçÇEˆ;kw1î,RÜY¤¸³HqgЇâÎ"ÅEŠ;ƒwÖ(î,zûËuŠ;ƒw)î,RÜĸ³ècœw)î bÜY„¸³FqgâÎÆEŠ;‹w1î,RÜY¤¸³HqgãÎ"Ä5Š;1ìo“ãÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEˆ;kw)î BÜù ½ï8ß ýJÅAŒ;‹w)î,BÜø³hý‡qgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEˆ;Ç8î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒ>w!î¬QÜY„¸3†qg‘âÎ"ÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ ÆEˆ;kw)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹wÆ0î,ÚÏ(î,RÜ9Èqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³HqgâÎÆEŠ;‹þàwYw1î,RÜY¤¸3ˆqgâÎÅEˆ;cw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,Rܤ¸³Fqg‘âÎ'Zâ΢Ë_ÅŸÿþŸ¾oqç«QРƯæE¸—NÜ©K;u©qçûKßâN¡Æï?î[Ü©K;qéĸtâN¡Æ@'îjÜ)Ô¸S¨q'~;qèÄ:Ô¸—NÜ)Ô¸׸S‡wâЉ;qéĺԸ—N܉K'îÔ¥ÆB;ñq'îÄ¥wêRãN]j܉K'îÄ¥w 5î:q§PãN¡Ä2;ßÿ¾Åï/}‹;‰î¿ökÜ©K;y)q'/%îԥ唸“‡wêPãN]jÜI”¸“—¸S—wêRãN^JÜÉK‰;…wåÃD‰;…w%îÔ q'/%îjÜIt]ߨoq§¾ñƺԸ“—wòÒÄ:Ô¸S‡wòRâN\:q'QâN|܉;y)q§.5îÔ¥ÆD‰;…w}Ìßù]×7ê[Ü©AãN]jÜÉK‰;yék£NÜ©kÜÉKý:q§.%îüï¡Wqg¾è¶?Z'îÔ÷ظS—wÝ÷GëĺԸ“—nû£uâN¡ÆDŸû£uâN¡ÆDû£uâN^züx´^\:q'.¸“è¾?Z'îԥƺԸ“—ë£uâNjÜÉK·ýÑ:q§.5îÔ¥ÆD÷ýÑ:q§.5î$ºíÖ‰;…w}îÖ‰;õ#hÜ©K;yéº?Z'îÔ¥ÆDŸû£uâN^úÚ­Æ:Ô¸“‡ûuâN]jÜÉK‰;yék£N܉;q'/%îԥƺԸ“è¶¿Q'îúøçÇß¼DŸûuâNýwêRãN^ºýx£^^zìoÔ‰;õq;yé¾¾Q'îԡƼtÝߨwêRãN]jÜItÛߨwêRãN]jÜÉKý:q'Ñe£NÜIôµ¿Q'îÔ q'/Ý÷7êĸtâN^ºíoÔ‰;õq‰;u¨q'Ý÷7êĺԸ“—®ûuâN¡ÆDŸûuâN}ã;u©q'Ñu£NÜ)Ô¸“貿Q'îÔ q§.5îԥƼtÿñF½º”¸S‡wÝÖ'êÄ:Ô¸S—wòÒ}¢NÜ©K;‰®?ž¨—è±?Q'îÄ7~âN^ºÿx¢^^úÚŸ¨w]÷'êÄBÿìOÔ‰;yé¶?Q'îԥƺ”¸“‡îû Õ¸SÖ¸“‡nû uâN]jÜ©K;y)q§.5îÔ¥ÆDwÒ<öêÄú¾wòÒ} NÜ)Ô¸“èº?P'îԥƺԸ“—nûÕ¸‡N܉C;iîûuâN]jÜÉK·ý:q§.}$îÔ¥ÿs¿tߨÆ4—ý}š¸SßtãNiÜIô¹?N'îjÜ©o¼q'/]÷ÇéĺԸS—wòÐíÇãôòÐׯí;q'ÑuœNÜ©K;u©q'/ÝöÇéĺԸ“ès}œNÜ Ô¸“沿M'îÄàĺԸ“(q'Ñ}›NÜ©o¼q'/]÷·éĺԸS—wòÐmœNÜ©OkÜ©K;ÿ{é]Ü™¯|ì/Ö‰;õ6îä¥Ûþb5î”iÜI´þCظS¨q§þë7îä¥Ûþb¸S¨q'Ñçþb¸S—wêRãN^ºîOVãN:q'¸“—îûßœ¸S׸S—wòÒc²NÜItYŸ¬w}­OÖ£q'Ñu²NÜ©K;u©q'/Ýö'ëÄú¸ÆºÔ¸“—îû“uâN]JÜÉC×OÖËC_['ñ-î$úÜÿѲÜ9È˃¼ÜùDËrç /wòrç /w>ѲÜ9È˃¼Ü9ÈËO´,wòrç /w>ѲÜ9È˃¸Ü9ÆË¿Ñ¶ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA\î Òrg —;y¹3ˆËA\î ârç /wq¹3ˆËA\îäåÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Ü9ÈËA\î ârg–;Çx¹3ˆËA\î|¢e¹3ˆËAü·q¹s—;ƒ¸ÜÄåÎA^î úø…¡W—;ƒ¸Ü9ÈËA\î ârg—;y¹3ˆËA\îäåΠ¿ZîÌq¹3ˆËƒ¼ÜÄåÎ .wòrgÐe´–åÎ .wòrg—;ƒ¸Ü9ÈËA\î ârg—;ŸhYî ârg—;ƒ¸Ü9ÈËA\î z¬Ö²ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA^î ârg—;ƒ¸Ü9ÈËA\î ârç /wq¹3ˆËA\îäåÎ .wq¹3ˆËƒ¸ÜÃåΠÇþF-ËA\î ârg—;ŸhYî ârg—;y¹3ˆËA\î ârç .wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ¸Ü¤åÎ1^î ârg—;ƒ¸Ü9ÈËA\î ârg—;y¹3ˆËA\îäåÎ .wq¹3ˆËƒ¼Üô¹¿QËrç-ËA\î ârg—;q¹3†ËA\îäåΠýZ–;ƒ¸Ü9ÈËA\î ârg—;y¹3ˆËA\îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ .wârgÌe¢¼ÜÃåÎA^î ârg—;y¹3ˆËA\î ârç-ËA\î ârg—;y¹3ˆËAý‰Z–;ƒ¸ÜÄåÎ .wòrg–;c¸Ü9ˆË1\î ârg—;y¹3ˆËA\îäåÎ .wi¹3†Ëƒ¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA^î ârg—;ƒ´Üù4Ërg–;c¸Ü9ÈËA\î ârg—;}p¹3ès –åÎA\îŒárgÐûå„.wòrg—;ƒ¸Ü9ÈËAûã´,wq¹s—;ƒ´ÜÃåÎ -wŽñrg—;ƒ¸Ü9ÈËA\î ârg—;y¹3HË1\î|"/wÆ\ö·iYî ârç /wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ´ÜÃåÎ .wòrgÐß/wæ+û‹µ,wq¹3ˆËAZîãåΠõB/wòrg—;ƒ¸ÜÄåÎA^î ârg—;y¹3ˆËA\î ÒrçÓ,ËA\î ârg—;y¹3ˆËA\îäåÎ -wÆp¹3HËc¼ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA^î ârg—;y¹3HË1\î ârç /wq¹3ˆËA\îäåÎ .wi¹sŒ—;ƒö3\î ârç-ËA\î ârç /wq¹3ˆËA\îäåΠÏýuòrç/wq¹3è~—uYîäåÎ .wq¹s—;ƒ´ÜÃåÎ -wŽñrg—;ƒ¸ÜÄåÎA^î ârg—;y¹3ˆËA\î ârç .wÆp¹3ˆË¿Ñ¶Ütù›åÎÿý±ñöµÅAŒ;9î bÜĸ3ˆqç-qgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwbÜø3ˆqç ÇAŒ;ƒwÆ0îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜôPÜ9ÈqgãÎ Å1Œ;Ÿh‰;‹w)î bÜY¤¸³Hqg‘âÎ ÆEˆ;kw1î,RÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"Ä1Œ;‹w)î丳Hqg‘þ@\¤¸3ˆqg‘âÎ"ÅAŒ;‹>ðw>EŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw½;¿™÷-ç‹´_¥¸3ˆqg‘âÎ"ÅAŒ;‹.û£å¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸sãÎ"ÅEŠ;‹w1î,RÜYôX-ÇEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,RÜY¤¸3Hqgâ΢ÇþF9î,RÜY¤¸³Hqç ÇEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"Ä1Œ;‹w)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹wrÜY¤¸³Hqg‘âÎ Å5Š;‹w1î,úØß(ÇEŠ;ƒ.Š;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³HqgâΚËþD1î¬QÜĸ³Hqg‘âÎ ÆEŠ;‹w)î丳Hqg‘âÎ"ÅAŒ;‹w=ö'Êqg‘âÎ"ÅEŠ;ƒw!î¬Qܤ¸³Fqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³qgâÎ ÆEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹wŽqÜY„¸³FqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3Hqgâ΢·¿\W¡¸3ˆqg‘âÎ"ÅAŒ;‹>öÇÉqg‘âÎ ÆEˆ;kw!îŒaÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,BÜY£¸sãΚËþ69î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w)î º(î,BÜY£¸³Hqgã΢¿Ž;û•Š;ƒw)î,RÜY„¸3†qgÑú!ãÎ ÆEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹wŽqÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,BÜY£¸³qg ãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹wÖ(î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w!îŒaÜY´ŸQÜY¤¸sãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"Ä1Œ;‹wýÁï²:î bÜY¤¸³HqgãÎ"Ä5Š;‹wÆ0î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸3HqgâÎ"ÅO´ÄE—¿Š;¯¿þßm;9î|¢%îä¸sãÎAŽ;£-îä¸sãÎAŽ;Ÿh‰;9îä¸ó‰–¸sãÎAŽ;9î|"ÇcwrÜùDKÜ9Èqç Æcw>ÑwrÜ9Èqç-qç ǃwrÜùDKÜ9Èqç ǃw>ÑwrÜ9Èqç-qç ǃwŽqÜùmqgãΠƃw1î bÜĸsãÎ Å1Œ;9î bÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bܤ¸sŒãÎ ÆAŒ;Ÿh‰;ƒwñÄAŒ;9î bÜĸsãΠýOãΠƃ.Œ;ƒw1î bÜ9ÈqgãΠƃw)îŒù»¸3_ŸsãÎ ÆAŒ;9î ºìÖw1îä¸3ˆqgãÎAŽ;ƒw1î bÜùDKÜĸ3ˆqgãÎAŽ;ƒw)îã¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqgãÎAŒ;cw1îä¸3ˆqgãÎ ÆO´ÄAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î RÜ9ÆqgãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1î|¢%î bÜĸ3ˆqç Æ1Œ;ƒwrÜô±¿QKÜĸsÐ…qgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç Æ1—ý‰rÜøsãÎ ÆAŒ;9î bÜĸ3ˆqç-qgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrܤ¸3†qç Æ1Œ;ƒw1îä¸3ˆqgãÎAŽ;ƒw)îŒaÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒw>Íw)îŒaÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎÆAï¹.‚qç ÇAŒ;ƒwrÜô±?NKÜĸsãÎ Å1Œ;ƒwŽqÜĸ3ˆqç ÇAŒ;ƒw1îä¸3Hqg ãÎ'rÜsÙߦ%î bÜ9ÈqgãΠƃw1î bÜĸsãÎ Å1Œ;ƒwrÜô>îü†Þwœï ÐùJÇAŒ;ƒw)îã¸3hý‡Ðqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î RÜù4KÜĸ3ˆqgãÎAŽ;ƒw1îä¸3Hqg ãÎ Åcw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ Å1Œ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw)îã¸3h?ø3ˆqç-qgãΠƃw1î bÜĸsãÎ ÆAŠ;Ç8î bÜô¿ËºÄƒw1î bÜ9ÈqgâÎÆAŠ;Ç8î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŒ;cw1îü¶¸3èòWqçãß_¸ÿwÞþížÔ¸3èÿ|“OtâN\:q§.5îÔ¥Æï/}‹;…w¾ÿ¸oq§.5îÄ¥wâÒ‰;…w¸S¨q§PãN¡Æø4îÄ¡wêPãN\:q§PãN|\ãNj܉C'îÄ¥wêRãN\:q'.¸S—w 5îÄǸ—NÜ©K;u©q'.¸—NÜ)Ô¸èÄB;…wÊ4î|ÿøw¾¿ô-î$ʆõq;u©q'/%îä¥ÄºÔ¸S—wòPâNjÜ©K;‰wòãwêRãN]jÜÉK‰;y)q§PãN¢üa˜(q§PãN¢Äú4îä¥ÄB;‰®ëõ-îÔ7Þ¸S—wòRâN^š¸S‡wêPãN^J܉K'î$J܉;q'/%îԥƺԸ“(q§PãN¢ù;¢ëúF}‹;õ#hÜ©K;y)q'/}íoÔ‰;õq;y鱿Q'îÔ¥Ä÷GëÄú4îԥƼtÝ­wêRãN¢ÏýÑ:q'/}íVãNjÜÉCý:q§.5îä¥Ä¼ôµ¿Q'îÄǸ“—wêRãN]jÜItÛߨw 5î$úÜߨwêGиS—wòÒíÇõòÒc£NÜ©kÜÉK÷õ:q§5îä¥ëþF¸S—wêRãN¢ÛþF¸S—wêRãN^zìoÔ‰;‰.ûuâN¢¯ý:q§~;y龿Q'îÄ¥wòÒm£NÜ©KÜ©C;y辿Q'îԥƼtÝߨw 5î$úÜߨwêoÜ©K;‰®ûuâN¡ÆD—ý:q§~;u©q§.5îä¥û7êÕ¥Ä:Ô¸“è¶>Q'îԡƺԸ“—îûuâN]jÜItýñD½Dý‰:q'¾ñwòÒýÇõòÒ×þD¸“èº?Q'îjÜ©o¼q'/Ýö'êĺԸS—.wòÐ}¡wêÃwòÐm¡NÜ©K;u©q'/%îԥƺԸ“hâNšÇþ@¸SßwãN^ºïÔ‰;…w]÷êĺԸS—wòÒm wâЉ;q¨q'Í} NÜ©K;yé¶?P'îԥƺԸ“—îûÕ¸“沿Ow꛾<öÇéÄDŸûãtâN¡ÆúÆwòÒuœNÜ©K;u)q'Ý~×ÇéÄ@;i.ûÛtâNüNÜ©K;‰wÝ÷·éÄúÆwòÒu›NÜ©K;u)q'ÝöÇéÄú´ÆºÔ¸“—o§wqç|eãNoÜ©o´q'Ñ×úb¸“hý‡°q§PãNý×oÜÉK·ýÅ:q§PãN¢ÏýÅ:q§.5îԥƼtÝŸ¬Æ8tâN:q'/Ý÷¿18q§>®q§.5îä¥Çþd¸“è²>Y'î$úZŸ¬GãN¢ëþd¸S—wêRãN^ºíOÖ‰;õq;u©q'/Ý÷'ë唸“‡®?ž¬—‡¿¶Nâ[ÜIô¹?Y'î䥯ýu:q§.=~þ>ëËKõu:q'Ñ~æ¶¿N'îÄ7}âN\:q'/=ö×éÄD—ýu:q'/}í¯Ó‰;u©q'/Ý××éÄ:Ô¸“—þàwYOÜ©kÜ©K;y龿N'îÔ¥Ä:ÇpŸs ç9ŸÆëœc8Î9†Ûœc8Íù4^æÃaÎ1ÜåÃYΧñ*çŽrŽá&çÓx’s 9Çhs÷8›eŽ3æŠ?DŒÆ8Çp‹3FSœ1ZâŒÑçîpÆ`†3D+œc8£ ÎMpÆhs 8c´¿£ùÍ­oŽáøfŒ¶7c4½9†Ë›1ÞŒÑîfŒf7Çpu3F£›1ÚÜÃÉÍ-nÆhp3{›C8·£µÍm>·6c4µ£;QŒ†6Çpg3F3›1ZÙÑ͘_ïÿÕ[1šØŒy`¬l 6c´¯£yÍ­kŽá¸fŒ¶5c4­9†Ëš1Ö ù«]Í|‘f5ÇpU3F£š1ÚÔÃI͘Ëú yP3F{šc8§£5ÍiŽá–fŒ¦4c´¤£!ͧñŽfŒf4c´¢£Í1ÜЌфf 4‡p@3Fû™1šÏŒÑzæŽgÆ\×gÈÓ™c¸œ£áÌífÆh6s W3c4š£ÍÌ1œÌŒÑbfŒ3c´—9†s™1ZËŒÑXfŒ¶2Çh*3DK™1ÊÃÌÍdÆh%3F#™OãÌMdÆh!s 2c´£yÌ­cŽá8fŒ¶1c49†Ë˜1ÆŒÑ.fŒf1Ç|j3F£˜1ØÄÂIÌ-bÆh3F{˜c8‡£5ÌaÆh s §0c´„£!Ì1ÜÁŒÑ fŒV0c4‚9†˜1šÀŒÑæÓx3Fû—1š¿ŒÑúå_†hû2FÓ—c¸|ó±¾:Þ½ŒÑìå®^Æhô2F›—1š¼ÃÅË ^Æhïr ç.c´v£±Ëm]ŽáÔeŒ–.c4t9F;—!—õÑáÊeˆF.Çpã2F—1Z¸ÃËí[ÆhÞ2Fë–OãqËm[ÆhÚ2FË–c8l£]ËÍZŽáªeŒF-c´i£IË1\´ŒÁ eˆö,ÇhÎ2Dk–1³ŒÑ–åNYÆhÉ2FC–c¸c£Ë¬X†hÄr 7,c4a£Ë XŽá~eŒæ+c´^9†ã•1Ú®ŒÑte –+ŸÄÕ1Ø­ Ñlå®VÆh´2F›•1š¬ÃÅÊ VÆh¯rŒæ*C´Vóv, @[•c>5U£¥Ê UŽáNeÌÇúÜx¥2æ±>7Þ¨ŒÁDeˆ*c0P9„û”1š§ŒÑ:åŽSÆh›2FÓ”1Z¦ÃaÊìR†h–òi¸JrY_oRÆh’r )c4H£=Ê1œ£ŒÑeŒÆ(c´E9†S”1X¢ ÑeŒv(Çp†2F+”1=B9_È ÊMPÆh2”C¸?³ý3ÇõÉ1ŸŒÑödŒ¦'c´<9†Ã“1ÚŒÑìä®NÆht2F›“1˜œ|/NÆhp2F{“1š›õÉMÆhkr §&c°4¢¡ÉìLáÌdŒV&c429†“1š˜ŒÑÂdŒ&Çp_2Fó’1Z—ÃqÉlK†hZ2FË’c8,£]ÉÍJÆhUr G%c´)óØÞ/JƬG´'£9ɧñšdŒÆ$c´%9†S’1Z’ŒÑdŒv$ÇpF2F+’1‘ ÉMHÆì¿£éÉ1ŸÚŒÑ|dŒÖ#Çp<2Û‘!šŽŒÁräGÆh72F³‘1ZÃÑÈmFÆh2r #c4£½ÈÍEŽÑZdˆÆ"c´ùÛ,S‘1—¿YŠüß‘þ¹¯5á ç„O´ô„ƒrQ8ÈIáo´5…ƒrU8ÈYá-]á ‡…ƒ\>Ñ’r[8Èqá ×…Oä¼pŒûÂA Ÿh) 91ÄÆpŒ#Ã'Z*ÃAÎ ¹3|¢%4äÒpSÃAn Ÿh‰ ¹6äÜp{Ã'Z‚ÃA.99|¢¥9äèp«Ã1Σ­; bxÄòpÓà ¶‡AŒƒXr~¤þ0†â ˆALƒØ 1BôÉ?Ý1C b‡ÄqKÄ ¦ˆAl9F bÄ1ˆ=â ‰A,ƒ˜$r“Ä(1ˆUb²Ä1îƒ&±L|¢%M b›Ä?ø±Nä<1ˆ}bÅA.ƒ>ô·9Alƒ)r¥ÄL1ˆbCÅA.ƒ˜*±UäX1HµbÌû\ñzŸ'¾jç«,±X b²8ÈÍbÐe´–j1ˆÙâ w‹A ƒX.rºÄv1ˆñbëÅ'ZòÅ ö‹A ƒX0rÂĆ1HãWŒÃØ11dä’1ˆ)c[ÆAŽƒX31g bÏ8ÈAc‹Æ &ƒÜ41j bÕĬq»Æ †A,ƒ˜6bÛø1ˆuã çAìƒ8±p|¢%q ºîoÔ9råÄÌ1ˆcCÇA.ƒ˜:±uäØ1ˆµcsÇ öŽƒ><±x Rò8ÆÍc£Ç VA̹{ bøÄò1ˆéã ·AŒƒX?rþÄþ1ˆd ÈAN ƒØ@1‚|¢¥‚ bÄ2ˆ!ä –1L!ƒØBr ô±¿QKÄrƒÈ ‘AL"ƒØDrÄ*2ˆYä w‘A #ƒXF1ä62ˆqdëÈAÌ#c.ûå@2†…ä '’Al$ƒIr%ÄL2ˆdCÉ'ZJÉ ¦’Al%ƒKr-Ä\2ˆ½ä “A,&ƒ˜L±™äh2芌%†Ùä v“1 'ƒXN1äv2ˆñdëÉAÎ'ƒØO) ŒaA9È eÊ F”A¬(9£ bGÄrKÊ ¦”Al)ƒS>ÍRS)§ŒaO9ÈAe‹Ê &•Al*9ª bUĬr»Ê†•Aï³.‚iå O¶•AŒ+ƒXWr^ô±?NK`ÄÂrË 5–1Œ,ƒTYŽqfÄÎ2ˆ¡å —–AL-ƒØZ1¶äÚ2H¹e {Ë'rpsÙߦ%¹ bs9ÈÑe«Ë f—ƒÜ]1¼ byÄôrÛË Å—1¬/ƒ˜_rÄ3èï ÌùJ'˜Al0ƒa©Âã 3hý‡Ð!æ —˜AL1ƒØb1Æä3ˆ9f{ÌA2ƒXd1É R“ù4K”Ä*3ˆYf»ÌA3ƒXf1Íä63Hqf ëÌ å™cÜg]÷'k)49Ñ b£ÄH3ˆ•æ gšAì4ƒjr©¤T3†­fcÍA®5ƒ˜k±× b°9ÈÅf“Í 5›cmíg˜m±Û|¢%Ü b¹ÄtsÛÍ Æ›A¬7ƒ˜or¿Ä€3Hç'œAl8ƒþàwY—Šs3Î vœA 9¹ä RÊÖ3H1çלAÌ9ƒØs1èä¢3ˆIg›ÎAŽ:ƒXu1ë b×9ˆag ËÎ ¦¿ÑÖv]þ*îüýgË-îä¸ó‰–¸sãÎAŽ;9îü¶¸sãÎAŽ;9î|¢%îä¸sãÎ'ZâÎAŽ;9îä¸ó‰wŽqÜ9Èqç-qç ǃwŽqÜùDKÜ9Èqç ÇO´ÄƒwrÜ9Èqç-qç ǃwrÜùDKÜ9Èqç ÇO´ÄƒwbÜ9Æqço´ÅAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒwÆ0îä¸3ˆqgãΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇA×õÚâÎAŽ;ƒw1î RÜ9ÆqgãÎ ÆO´ÄAŒ;ƒøâ ƃw1î bÜ9ÈqgЇþÎ'ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw)îŒaÜôwqç|•ãÎ ÆAŒ;9î ºìÖw1îä¸3ˆqgãÎAŽ;ƒw1î bÜùDKÜĸ3ˆqgãÎAŽ;ƒw)îã¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqgãÎAŒ;cw1îä¸3ˆqgãÎ ÆO´ÄA×ýZâÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎ ÆAŠ;Ç8î bÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ ÆO´ÄAŒ;ƒw1îĸ3†qgãÎAŽ;ƒ>ö7j‰;ƒûµÄAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃwÆ\ö'Êqg ãÎAŽ;ƒw1îä¸3ˆqgãÎ ÆO´ÄAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgÐýL ãÎAŒ;cw1î bÜ9ÈqgãΠƃw1î RÜøsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw)î|š%î RÜøsãÎ ÆAŒ;ƒwrÜĸ3ˆqç Æ1Œ;ƒÞÿr]ãÎAŽ;ƒw1îä¸3ècœ–¸3ˆqç ÇAŠ;cw)îã¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgâÎÆOä¸3沿MKÜĸsãÎ ÆAŒ;9î bÜĸ3è÷.—w)îŒaÜĸsãÎ ÆAïã΃Ðq¾+@ó•Œ;ƒw)îã¸3hý‡Ðqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î RÜù4KÜĸ3ˆqgãÎAŽ;ƒw1îä¸3Hqg ãÎ Åcw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ Å1Œ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw)îã¸3h?ø3ˆqç-qgãΠƃw1î bÜĸsãÎ ÆAŠ;Ç8î bÜô¿ËºÄƒw1î bÜ9ÈqgâÎÆAõuZâÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îĸ3†qgãÎßh‹;ƒ.w^ÿÞw1îä¸3ˆqgãΠ‡âÎ'ZâÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îĸ3†qgãÎAŽ;ƒw)îŒaÜ9ÈqgãΠƃw1î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒwÆ0î|¢%î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw!î¬QÜĸ³Hqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹wÆ0î,RÜY¤¸sãÎ"ÅEúq‘âÎ ÆEŠ;‹w1î,úÀßù)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w)î bÜY„¸³FqgÑ_Åù*ÆEŠ;‹w1î,ºì–ãÎ"ÅAŒ;‹w)î bÜY¤¸³HqgÑ¿ó5Èqg‘âÎ"ÅEŠ;ƒw)î,BÜø³Hqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âΠ«âÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒwÖ(î,RÜĸ³Hqg‘âÎ"Ńw)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹wÆ0î,RÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,RÜ9Èqg‘âÎ"ÅEŠ;ƒwÖ(î,RÜĸ³èc£w=ö7Êqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w)î RÜYsÙŸ(Æ5Š;ƒw)î,RÜĸ³Hqg‘âÎ"Ńw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³qgâÎ Å5Š;‹w)î º*î,RÜY¤¸3ˆqg‘âÎ"Ä5Š;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,BÜ9ÆqgâÎÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ Å5Š;‹Þþr]…âÎ ÆEŠ;‹w1î,úØ'ÇEŠ;ƒw!î¬QÜY„¸3†qg‘âÎ"ÅAŒ;‹w)î,RÜĸ³qgâÎAŒ;k.ûÛ丳HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqgâÎÅEŠ;ƒw)î,RÜô÷qg¿Rqg‘âÎ"Ä1Œ;‹Öw1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY„¸sŒãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqgâÎÅEˆ;cw)î,RÜĸ³Hqg‘âÎ"ÅAÿþçú? ãÎ"ÅAŒ;‹wÖ(î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w!îŒaÜY´ŸQÜY¤¸sãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"Ä1Œ;‹wýÁï²:î bÜY¤¸³HqgãÎ"Ä5Š;‹wÆ0î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸3HqgâÎ"ÅO´ÄE—¿Š;ÿÏó-î¼ýÛ%þ<=¨qgÐÿù&ŸèĸtâN]jÜ©K;ß_úw 5î|ÿqßâN]j܉K'îÄ¥w 5î:q§PãN¡ÆB;ñ#h܉C'îԡƸtâN¡Æø¸Æ:Ô¸‡®;qéĺԸ—N܉K'îÔ¥ÆB;ñq'îÄ¥wêRãN]j܉K'îÄ¥w 5î:q§PãN¡Ä2;ßÿ¾Åï/}‹;‰ò‡a}\ãN]jÜÉK‰;y)q§.5îÔ¥Ä<”¸S‡wêRãN¢Äü¸ÄºÔ¸S—wòRâN^JÜ)Ô¸“(&JÜ)Ô¸“(q§~;y)q§PãN¢ëúF}‹;õ7îԥƼ”¸“—&îÔ¡Æ:Ô¸“—wâÒ‰;‰wâãNÜÉK‰;u©q§.5î$JÜ)Ô¸“ècþ·躾QßâNýwêRãN^JÜÉK_ûuâN}\ãN^zìoÔ‰;u)q'Ýö7êÄÿ½ô*jÜ©Ó;‰îû£uâN]jÜÉK·ýÑ:q§PãN¢ÏýÑ:q§PãN¢ýÑ:q'/=~Q'îԡƺԸ“—îûuâN]jÜItýñD½Dý‰:q'¾ñwòÒýÇõòÒ×þD¸“èº?Q'îjÜ©o¼q'/Ýö'êĺԸS—wòÐ}¡wêÃwòÐm¡NÜ©K×öêS—wêRãN¢‰;iûuâN}ß;yé¾?P'îjÜItݨwêRãN]jÜÉK·ýj܉C'îÄ¡Æ4÷ý:q§.5îä¥Ûþ@¸S—wêRãN^ºïTãNšËþ>MÜ©oºq§Î4î$úܧw 5îÔ7Þ¸“—®ûãtâN]jÜ©K‰;yèöãqzyèë×ö€¸“èº?N'îԥƺԸ“—nûãtâN]jÜIô¹>N'îjÜIsÙߦwâpâN]úÿ8»Û¤H³$[³3r¹ ØóŸXgðêÞ‡"±¥áý«DZjâ%çº7OìÆD‰;‰w 5îÔ7Þ¸“—nûÛtâN]jÜ©K‰;yè¾?N'îÔ§5îԥƼôܧwþï¥Wqg¾ò}±NÜIô¹¾X'î$Zÿ6îjÜ©ŸnãN^ºï/Ö‰;…w}ì/Ö‰;u©q§.5îä¥Ûþd5îÄ¡wâЉ;yé±ÿ‹Á‰;õq;u©q'/=÷'ëÄDïë“uâN¢ÏõÉz6î$ºíOÖ‰;u©q§.5îä¥ÄDŸû“uâN]jÜÉKýÉ:q§.%îä¡Û'ë×CÏ?['ñ-î$úØŸ¬wòÒçþ÷©wêÒóçï³þzé¹¾N'î$ÚÏÜ÷×éÄø¦O܉K'îä¥çþ:¸“è}NÜÉKŸûëtâN]jÜÉKõu:q§5îä¥ñ»¬'îÔÇ5îԥƼôØ_§wêRâNºí¯SãN™ÆD?“õWtß_§wêиS—wòÒsNÜ©kÜÉK÷ýu:q§.%îÔ¡Æ<ôX_§oqçëKßâÎ_.ýw~UÛrç /w^hYîäåÎA^îäåÎ/´-wòrç /wòrç…–åÎA·?ZîäåÎ -˃¼Ü9È˃¼Üy!/wŽñrç /w^hYîäåÎA\îãåΠݼÜ9È˃¼Üy¡e¹s—;y¹s—;/´,wòrç /wòrç…–åÎA^îäåÎ -˃¼Ü9ˆËc¼Üù…¶åÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg–;c¸Ü9ÈËA\î ârg—;y¹3ˆËA\î ârç /wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA^î ârg—;ƒ´Ü9ÆËA\î ârç…–åÎ .wñ¿vÄåÎA^î ârg—;y¹3èíþƒ^A\î ârç /wq¹3ˆËA\îäåÎ .wq¹s—;ƒ´ÜÃåΠ¿[òrg—;ƒ¸Ü9ÈËAïû£µ,wq¹s—;ƒ¸ÜÄåÎA^î ârg—;ƒ¸Üy¡e¹3ˆËA\î ârç /wÝþ`r&HËc¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA^î ârg—;ƒ¸Ü9èÆåÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA\îŒárg—;y¹3ˆËA\î ârç…–åÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Ü9ÈËA\î ârgÐs£–åÎ .wi¹sŒ—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA^î ârg—;y¹3ˆËA\î ârç /wq¹3ˆËZ–;ƒ¸ÜÄåÎ .wârg —;ƒ¸Ü9ÈËAoûµ,wq¹s—;ƒ¸ÜÄåÎ .wòrgÐm£–åÎA^î ârg—;ƒ¸Ü9ÈËA\î ârç .wƼïO”—;c¸Ü9ÈËA\î ârç /wq¹3ˆËA\î¼Ð²ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA^î ârg—;ƒ¸Ü9ÈËAZîŒárç .wÆp¹3ˆËA\îtãrg—;ƒ¸Ü9ÈËA\î ÒrgÌs –åÎ .wq¹3ˆËƒ¼ÜÄåÎ .wòrg—;ƒ¸Ü¤åÎË,ËAZîŒárç /wq¹3ˆËA\îäåÎ .wq¹s—;c¸Üôz9!‚˃¼ÜÄåÎ .wòrgÐÛþ8-ËA\îäåÎ -wÆp¹3HËc¼ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA^î Òrg —;/äåΘ÷ýmZ–;ƒ¸Ü9ÈËA\î ârç /wq¹3ˆËA\îäåÎ -wÆp¹3ˆËƒ¼ÜtÛ§e¹sÐÿåÎ|%—;ƒ¸Ü¤åÎ1^î Zÿz¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Ü9ÈËA\î ârgÐs}²–åÎ .wq¹3ˆËƒ¼ÜÄåÎ .wòrg–;c¸Ü¤åÎ1^î ârg—;y¹3ˆËA\î ârç /wq¹3ˆËƒ¼Ü¤åÎ.w=µ6ÈËA\î ârg—;y¹3ˆËAZîãåΠý —;ƒ¸Üy¡e¹3ˆËA\îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ -wŽñrg—;ƒþÅï².˃¼ÜÄåÎ .wòrg–;c¸Ü¤åÎ1^î ârg—;ƒ¸Ü9ÈËA·¯Ó¯—¸Ü9ÈËA\î ârg—;q¹3†ËA\îüBÛrgÐûß,wÞ¿þÿÑ/qgãÎAŽ;ƒw1î bÜy¡%î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŒ;cw1îä¸3ˆqgâÎƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3Hqg ãÎ -qg‘âÎ"ÅAŒ;‹w)î,RÜĸ³qgâÎ ÆEŠ;‹w}ý?–KŒ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹wÆ0î,RÜY¤¸sãÎ"ÅEú q‘âÎ ÆEŠ;‹w1î,zÿù)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w)î bÜY„¸³FqgÑë¸ó ´œ¿ ý*ÅEŠ;ƒw½ï–ãÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎAŽ;‹w)î,RÜĸ³HqgâÎÆEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,RÜY¤¸3HqgâÎ"ÅAŒ;‹w)î,RÜ9Èqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w=÷7Êqg‘âÎ"Ä1Œ;‹w)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹wrÜY¤¸³Hqg‘âÎ Å5Š;‹w1î,zÛß(ÇEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜtWÜY¤¸³HqgâΚ÷ý‰bÜY£¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜ9Èqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹wÖ(î RÜY£¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY„¸³æ¹?PŽ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w!î㸳qgâÎ ÆEŠ;‹w)î bÜY¤¸³HqgâÎÅE/¹®BqgãÎ"ÅEŠ;ƒw½í“ãÎ"ÅAŒ;‹wÖ(î,BÜø³Hqg‘âÎ ÆEŠ;‹w)î bÜY„¸³Fqç Æ5ïûÛ丳HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqgâÎÅEŠ;ƒw)î,RÜô÷qg¿Rqg‘âÎ"Ä1wÅEëBÆAŒ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w!î㸳Hqg‘âÎ"ÅAŒ;‹w)î bÜY„¸³FqgâÎÆEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw!î¬QÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,BÜø³h?£¸³Hqç ÇEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEˆ;cw)î,ú¿Ëê¸3ˆqg‘âÎ"ÅAŒ;‹wÖ(î,BÜø³Hqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎ Å5Š;‹w^h‰;‹Þÿ*î¼ýóìßâÎßFAƒwþ6/:èĸtâN]jÜ©K;__úw 5î|ýqßâN]j܉K'îÄ¥w 5î:q§PãN¡ÆB;ñ#h܉C'îԡƸtâN¡Æø¸Æ:Ô¸‡N܉K'îԥƸtâN\:q§.5îj܉;q'.¸S—wêRãN\:q'.¸S¨q'Љ;…w %î”iÜùú'ð-î|}é[ÜIôø³\ãN]jÜÉK‰;y)q§.5îÔ¥Ä<”¸S‡wêRãN¢Äü¸ÄºÔ¸S—wòRâN^JÜ)Ô¸“(&JÜ)Ô¸“(q§~;y)q§PãN¢ÛúF}‹;õ7îԥƼ”¸“—&îÔ¡Æ:Ô¸“—wâÒ‰;‰wâãNÜÉK‰;u©q§.5î$JÜ)Ô¸“èmþ͇趾QßâNýwêRãN^JÜÉKŸûuâN}\ãN^zîoÔ‰;u)q'Ý÷7êĺtOÜù¿—~‹;óUû£uâN}~ãN]jÜÉK÷ýÑ:q§PãN¢ýÑ:q§PãN¢·ýÑ:q'/=®q'/=Ö7êÄ:Ô¸“—nûuâN]jÜ©K;‰îûuâN]jÜ©K;y鹿Q'î$zßߨw}îoÔ‰;õ#hÜÉKý:q'.¸“—îûuâN}\âNjÜÉCý:q§.5îä¥ÛþF¸S¨q'ÑÇþF¸SßxãN]jÜItÛߨw 5î$zßߨwêGиS—îoûuâN^züx£~»”¸S‡wÝ×'êÄ:Ô¸S—wòÒc¢NÜ©K;‰n?ž¨_Ñs¢N܉oüļôøñDýzés¢NÜItÛŸ¨w 5îÔ7Þ¸“—îûuâN]jÜ©K‰;y豿P;õa;y辿P'îԥƺԸ“—wêRãN]jÜI4q'Ís NÜ©ï»q'/=öêÄB;‰nûuâN]jÜ©K;yé¾?P;qèÄ8Ô¸“æ±?P'îԥƼtߨwêRãN]jÜÉKýjÜIó¾¿Owê›nÜ©3;‰>öÇéÄB;õ7îä¥Ûþ8¸S—wêRâNºÿxœ~=ôùg{ÀNÜItÛ§wêRãN]jÜÉK÷ýq:q§.5î$úX§w5î¤yßߦwâpâN]jÜI”¸“豿M'îÔ7Þ¸“—nûÛtâN]jÜ©K‰;yè¾?N'îÔ§5îԥƼôܧwêR;Îÿ½ôªÍWÞ÷«q§LãN¢õaãN¡Æú™4îä¥ûþb¸S¨q'ÑÇþb¸S—wêRãN^ºíOVãN:q'¸“—û¿œ¸S׸S—wòÒs²NÜIô¾>Y'î$ú\Ÿ¬gãN¢Ûþd¸S—wêRãN^ºïOÖ‰;õq;u©q'/=ö'ë唸“‡n?ž¬_=ÿlÄ·¸“èc²NÜÉKŸû“uâN]zþü}Ö_/=××éÄDû™ûþ:¸ßô‰;qéļôÜ_§w½ï¯Ó‰;yésNÜ©K;yé±¾N'îԡƼô/~—õÄú¸ÆºÔ¸“—ûëtâN]JÜÉC·ýujÜ)Ó¸“èço²þŠîûëtâNýwêRãN^zî¯Ó‰;õq;y龿N'îÔ¥Ä:Ô¸“‡ëëô-î|}é[ÜùË¥_âί÷Ú–;y¹óBËrç /wòrç /w~¡m¹s—;y¹s—;/´,wòrç /w^hYîäåÎA^îäåÎ y¹sŒ—;y¹óBËrç /wârç/w^hYîäåÎA^î¼Ð²Ü9È˃¼Ü9ÈËZ–;y¹s—;y¹óBËrç —;y¹óBËrç /wârç/w~¡m¹3ˆËA\îäåÎ .wq¹3ˆËƒ¼Ü¤åÎ.wòrg—;ƒ¸ÜÄåÎA^î ârg—;ƒ¸Ü9ÈËA\î ârç /wq¹3ˆËA\îäåÎ .wq¹s—;ƒ¸ÜÄåÎ -wŽñrg—;ƒ¸Üy¡e¹3ˆËAü¯q¹s—;ƒ¸ÜÄåÎA^î úçÿûЏÜÄåÎA^î ârg—;ƒ¸Ü9ÈËA\î ârç /wi¹3†ËA\îtÿ»åÎ|—;ƒ¸Ü9ÈËAïû£õ/wq¹s—;ƒ¸ÜÄåÎA^î ârg—;ƒ¸Üy¡e¹3ˆËA\î ârç /wq¹3HËc¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA^î ârg—;ƒ¸Ü9ÈËA\î ârç /wq¹3ˆËA\îäåÎ .wq¹3ˆËƒ¸ÜÃåÎ .wòrg—;ƒ¸ÜÄåÎ -ËA\î ârç /wq¹3ˆËA\îäåÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ´Ü9ÆËA\î ârg—;y¹3ˆËA\î ârç /wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎ -ËA\î ârgÐs£¼ÜÃåÎ .wòrgÐÛþF-ËA\îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎAw.wq¹3ˆËƒ¸Üó¾?Q^îŒárç /wq¹3ˆËƒ¼ÜÄåÎ .wq¹óBËrg—;ƒ¸ÜÄåÎA^î ºíOÔ²Ü9ÈËA\î ârg—;y¹3HË1\îÄåÎ.wq¹3ˆËƒ¼ÜÄåÎ .wòrg—;ƒ´ÜÃåÎA^î ârg—;ƒ¸Ü9ÈËA\î ârç /wq¹3ˆËAZî¼Ì²Ü¤åÎ.wòrg—;ƒ¸ÜÄåÎA^î ârg—;q¹3†ËA¯—"žûã´,wq¹3ˆËƒ¼Üô¶?NËrg—;y¹3HË1\î Òrç/wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ´ÜÃåÎ y¹3æ}›–åÎ .wòrg—;ƒ¸Ü9ÈËA\î ârg—;y¹3HË1\î ârç /wq¹3ˆËƒ°Üù ½é|wæ+¹Ü¤åÎ1^î Zÿz¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Ü9ÈËA\î ârg–;/³,wq¹3ˆËA\îäåΠÛþd-˃¼Ü¤åÎ.wi¹sŒ—;ƒ¸ÜÄåÎA^î ârg—;ƒ¸Ü9ÈËA\î ârç /wi¹3†ËA\îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ -wŽñrgÐ~†ËA\î¼Ð²ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA^î ârg–;Çx¹3ˆËAÿâwY—åÎA^î ârg—;y¹3HË1\î Òrç/wq¹3ˆËA\îäåÎ .wq¹s—;ƒ¸ÜÄåÎ .wârg —;ƒ¸Üù…¶åΠ÷¿Yî|üó¿ÀÒvŽaÚy—cvŽa×9†Yç—YªÎ1Œ:ǰéäó2.:Ç0èÞó2Î9ǰæØs [ÎË0åÂ’s CÎ˸ãÃŒsŒ*Î!Œ8/ã†s Î1,8/ã€s ûÍ1Ì7ǰ޼ŒãÍ1l7Ç0ÝÃró27ǰÛÃló2®6Ç0Ú£fs“Í/³›1 6cÔkŽa®£Z3F±fŒZÍ1L5cPj†(ÔÃN3F™fŒ*ÍEšcØhÆ(ÑŒQ¡£@s ûÌå™1ª3Ç0ÎŒQ›£43Fe憙1ê2c”eŽa•£(3FMf ’Ì!,2cdƨǼŒsÌÕ˜1ú lÌ¿2<†)fŒJÌ…˜cØaƼá_gbTaÆ(ÂÃ3F fŒ ̘cØ_Æ(¿ŒQ}9†ñe ÚË¥—1*/Çü]x™/Rw£ìr «Ë˜÷õú›Ë%—cX\Æ(¸ŒQo9†¹eŒjËÅ–1j-/ãÔ2F¥eŒBËu–c˜Yƨ²ŒAd9„eŒË–1 ,ǰ¯ŒQ^£ºr ãʵ•1J+cTVŽaX£®2FYåV•1Š*cÔTÆ(©â2FAeŒzÊå”cTS†(¦ŒQK9†)eŒJÊ…”1ê(/ãŒ2FeŒ"Ê1l(c”Pƨ ŒQ@9†ýdŒòÉÕ“cOƨŒQ:£rr ÃÉu“1È&‡°šŒQ4£f2FÉä“1 &cÔKÆ(—óP-£X2F­ä¦’1*%cJƨ“ÃL2F•dŒ"É˸‘ŒQ"£B2æ¹¾:ì#C”GƨŽÃ82æm}uœFƨŒÃ02F]dŒ²ÈU‘cEƨ‰ŒQ9†EdŒ‚Èõ1Ê!ǰ†ŒQ £rŒRÈ÷õÑa¢r 3ÈU1Š Ç°ŒQ£2FäeÜ?Æ(ŒQý£øq ÛÇ¥1*Ç0|ŒQ÷£ì1FÕãF1hC”<ŽQñ¢à1F½cŒrÇ1¬c;ƨuÃÔ1F¥c BÇuŽc˜9ƨrŒQ䣯q ÇŽ1 ǰoŒQÞ£º1qãEÜ6Æ m QÙ8†acŒºÆe1ªÇ0jŒQÓ£¤qŒŠÆ1/Ÿ,à¹>7®c3ƨeÔ1æm}n2ƨcÃŒ1cˆ"Æ4ŒCJcT0Æ(`Ã~1FùbŒêÅÅ‹cØ.Æ ] Q¹x†‹!ïëkãl1FÕâF‹1jc”,Ža±£`1F½bŒrÅ1¬c+†¨UŒQª8†¥bŒBÅuŠc˜)Æüu¥˜/T¤ƒFqŘíÏÅ1ìc”'ƨNŒQœ8†mbŒÒÄ•‰c&ƨKŒQ–ƒ*ñ"ŽcÔ$Æ(IŒQ‘8†AbŒzÄåˆcX#Æ F Q‹ƒqKÄ…ˆ1êÇ0CŒQ…£1F â&ˆ1*c Žaƒü0DõaŒâÃ1lc”ƨ<ŒQx8†ÝaŒ²ÃT‡CƬG”ƨ8¼ŒƒÃõ†1Ê Ç°6ŒQl£Ö0F©á–†1 cÐaf£Ê0fÿM7†c˜ƨ0ŒQ`8†}a òÂÕ…1ˆ ‡°-ŒQZ£²0FaᘇºÂe…1ª Ç0*ŒQS£¤0FEá…!ê c”~™¥&Œyÿ«˜ðöÏß>¶šps -=á …ƒ\rRø…¶¦p£ÂA® 9+¼ÐÒrX8Èeá…–´pÛÂAŽ ¹.¼óÂ1î 90¼ÐRrb8ˆáG†Z*ÃAÎ ¹3¼Ðri8È©á ·†ZbÃA® 97äÞðBKp8ÈÅá '‡ZšÃAޱ:ãìð mÝaÃà –‡ƒœ±= b|Äúpóà õ‡1 ¹@ b‚Ä1ˆâ WˆÃØ!1Dä1ˆ)b[ÄAŽƒX#1G b8èÁ 1ˆEb“ÄAnƒ%±J R–8Æ]bÃÄ –‰ZÒÄ ¶‰Aü‹oëÄA΃Ø'1PäB1èMÿšÄF1ˆ‘â WŠÃØ)1TäR1ˆ©b[ÅAŽƒT+Æ0W b¯8Áâ7ô:Pü­jÌW1Yäf1è}´–j1ˆÙâ w‹A ƒX.rºÄv1ˆñbëÅ -ùbûÅ ŒA,9a bäˆqŒ+Æ fŒAìƒ2rÉÄ”1ˆ-ã ÇŒA¬ƒ˜3±gä 1ˆEc“ÆAnƒ5±j bÖ8È]cÃÆ –AL±mŒaÜĺqóÆ öA ƒX8^hIƒØ81räÊ1ˆ™c;Ç †Žƒ\:1u bë8ȱckÇ æŽAì9x bñ¤äqŒ›Ç FA·ýZ²ÇAîƒ>±| bú8èÁö1ˆñcëÇA΃Ø?1€ b9È dÈ FZ*È fAì ƒBb Ã2ˆ-ä ÇAoûµäAì!9ˆ bÄ$2ˆMä G‘A¬"ƒ˜ErÄ02ˆedÓÈAn#ƒG±ŽÄ<2æ}¢HưäD2ˆd#ÉA®$ƒ˜I±“ b(y¡¥” b*ÄV2ˆ±ä ×’AÌ%ƒØKr0Äb2ˆÉd›ÉAŽ&ƒTMÆ0›Än2†ádËÉ ¦“ƒÜN1ž b=9ÈùdûÉ ”1,(9¡ bCĈ2ˆå g”Aì(ƒRrIÄ”2ˆ-ebÊË,5erÊö”ƒT±¨ bRĦr£Ê V•AÌ*±«ŒaXôú7ë"˜Vr[ĸ2ˆuå ç•Aoûã´–A,,9± RcÃÈ2H•åg–Aì,ƒZriÄÔ2ˆ­ecËA®-ƒ”[ư·¼ƒË˜÷ýmZ’Ë 6—ƒ]±º bv9ÈÝeÃË –—AL/¹½ R|Ãú2ˆùå ÷—A 0ƒX`r‚ô÷ f¾’f*Ì1Î0ƒÖ?„1¹Ä bŠÄ3ˆ1æ טAÌ1ƒØcrÄ"3ˆIfšÌË,Qf«Ì f™Aì29Ì b™Ä4sÛÌ Å™1¬3ƒ”gŽqŸÄ@3ˆ…æ 'šAl4ƒi±ÒäL3ˆfCÍA.5ƒ”jÆ°Õ b¬9ȵfsÍ öšA 6¹Ø b²¤fsŒ£Í ý ³Í v›ZÂÍ –›AL7¹Ý b¼Äz3ˆùæ ÷›A 8ƒTpŽqÂĆ3è_ü.ëRqrÆÄŽ3ˆ!ç —œAJ9cØr)æãš3ˆ9g{Î ƒ\t1é bÓ9ÈQg«Î fAì:1ìŒaÙÄ´ó mmgÐû_ÅÿDhßãÎû?]âÏÓƒwýŸoòB'îÄ¥wêÒ-q§.5î|}é[Ü)Ô¸óõÇ}‹;u©q'.¸—NÜ)Ô¸èÄB;…w 5îÄ q'¸S‡wâÒ‰;…wâãwêPãN:q'.¸S—wâÒ‰;qéĺԸS¨q'>îĸtâN]jÜ©K;qéĸtâN¡Æ@'îjÜ)”¸S¦qçëŸÀ·¸óõ¥oq'Qþ2¬kÜ©K;y)q'/%îԥƺ”¸“‡wêPãN]jÜI”¸“—¸S—wêRãN^JÜÉK‰;…wå/ÃD‰;…w%îÔ q'/%îjÜIt[ߨoq§¾ñƺԸ“—wòÒÄ:Ô¸S‡wòRâN\:q'QâN|܉;y)q§.5îÔ¥ÆD‰;…w½Í¿ùÝÖ7ê[Ü©AãN]jÜÉK‰;yés£NÜ©kÜÉKÏý:q§.%îä¡ûþF¸S—wêRãÎÿE¿ÅùªÇþh¸SŸß¸“—îû£uâN¡ÆDû£uâN¡ÆDoû£uâN^zþx´~¹tâN\:q'QâN~Üçþh¸S—wòÒs}´NÜ©C;yé¾?Z'îԥƺԸ“è±?Z'îÔ¥ÆD÷ýÑ:q§PãN¢ýÑ:q§~;u©q'/ÝöGëĺԸ“èc´NÜÉKŸû£Õ¸S‡wòÐs´NÜ©K;y)q'/}îoÔ‰;ñq'îä¥ÄºÔ¸S—wÝ÷7êÄB;‰>ö7êÄú4îԥƼ”¸“—žûuâN}\ãN^z¬oÔ‰;u¨q'/Ýö7êĺԸS—wÝ÷7êĺԸS—·ý:q§PãN¢÷ý:q'ÑçþF¸S?‚ƼôØß¨wâÒ‰;y龿Q'îÔÇ%îÔ¡Æ<ôØß¨wêRãN^ºíoÔ‰;…w}ìoÔ‰;õ7îÔ¥ÆD·ý:q§PãN¢÷ý:q§~;u©q§.5îä¥Ç7ê·K‰;u¨q'Ñ}}¢NÜ©C;u©q'/=ö'êĺԸ“èöã‰ú=÷'êÄøÆOÜÉKOÔ¯—>÷'êÄD·ý‰:q§PãN}ã;yé¾?Q'îԥƺ”¸“‡û Õ¸SÖ¸“‡îû uâN]jÜ©K;y)q§.5îÔ¥ÆDwÒ<÷êÄú¾wòÒc NÜ)Ô¸“è¶?P'îԥƺԸ“—îûÕ¸‡N܉C;iûuâN]jÜÉK÷ý:q§.5îԥƼôبÆ4ïûû4q§¾éÆ:Ó¸“ècœNÜ)Ô¸SßxãN^ºíÓ‰;u©q§.%îä¡ûÇé×CŸ¶ìÄD·ýq:q§.5îԥƼtß§wêRãN¢õq:q'PãNš÷ým:q'~'îÔ¥ÆD‰;‰ûÛtâN}ã;yé¶¿M'îԥƺ”¸“‡îûãtâN}ZãN]jÜÉKÏýq:q§.5îä¥ûËÇéUš¯ü\_¬w­w 5îÔϤq'/Ý÷ëë®—w}ì/Ö‰;u©q§.5îä¥Ûþd5îÄ¡wâЉ;yé±ÿ‹Á‰;õq;u©q'/=÷'ëÄDïë“uâN¢ÏõÉz6î$ºíOÖ‰;u©q§.5îä¥ûþd¸S׸S—wòÒc²NÜ©K‰;yèöãÉúõÐóÏÖI|‹;‰>ö'ëļô¹?Y'îÔ¥çÏßgýõÒs}NÜI´Ÿ¹ï¯Ó‰;ñMŸ¸—NÜÉKÏýu:q'Ñûþ:¸“—>÷×éĺԸ“—ëëtâNjÜÉKÿâwYOÜ©kÜ©K;y鱿N'îÔ¥Ä÷7êÄú¸Æ¼ôÜߨwêRâNºïoÔ‰;u©q§.5î$z¼|£~+@ç«wêtãNýoÒ¸“—žû£uâN¢ýÑ:q§PãN¢·ýÑ:q'/=÷7êÄú4îä¥ÇþF¸—NÜÉK÷ý:q§>.q§5îä¡ÇþF¸S—wòÒm£NÜ)Ô¸“èc£NÜ©o¼q§.5î$ºíoÔ‰;…w½ïoÔ‰;õ#hÜ©K;u©q'/=~¼Q¿]JÜ©C;‰îëuâNjÜ©K;yé±?Q'îÔ¥ÆD·OÔ¯è¹?Q'îÄ7~âN^züx¢~½ô¹?Q'î$ºíOÔ‰;…wêoÜÉK÷ý‰:q§.5îÔ¥Ä<ôØ_¨Æú°ÆN¯âÎ|åçúb¸“hýCظS¨q§~&;y龿X'îjÜIô±¿X'îԥƺԸ“—nû“Õ¸‡N܉C'îä¥Çþ/'îÔÇ5îԥƼôÜŸ¬w½¯OÖ‰;‰>×'ëÙ¸“è¶?Y'îԥƺԸ“—îû“uâN}\ãN]jÜÉKýÉ:q§.%îä¡Û'ë×CÏ?['ñ-î$úØŸ¬wòÒçþd¸S—ž?Ÿõ×KÏõu:q'Ñ~澿N'îÄ7}âN\:q'/=÷×éÄDïûëtâN^úÜ_§wêRãN^z¬¯Ó‰;u¨q'/ý‹ße=q§>®q§.5îä¥Çþ:¸S—wòÐmwÊ4î$úù›¬¿¢ûþ:¸S?€ÆºÔ¸“—žûëtâN}\ãN^ºï¯Ó‰;u)q§5îä¡Çú:}‹;__úwþréãÎÿþ/ðßÿ›Y–;ƒ¸Ü9ÈËA\î ârg—;/´,wq¹3ˆËA\îäåÎ .wq¹s—;ƒ¸ÜÄåÎ .wârg —;ƒ¸Ü9ÈËA\î Òrg —;y¹3ˆËA\îäåÎ .wÝ´ÜÄåÎA^î ârg—;ƒ¸Ü9ÈËA\î ârç /wq¹3HË1\î¼Ð²ÜY¤åÎ"-wq¹³HËEZî,úļ?ˆËEXî¬Ñrg—;‹´ÜY¤åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY¤åÎ .wi¹³HËEZî ârg‘–;‹´ÜÄåÎ"-wi¹³Ë1\î,Òrg‘–;y¹³HËEú¯i¹3ˆËEZî,Òrg—;‹Þþ¼þzi¹³HËA\î,Òrg‘–;‹´ÜÄåÎ"-wi¹3ˆËEXî¬Ñrg‘–;ƒ¸ÜYôz¹óz=ÔùKÜ™¯ârgÑûþhy¹³HËA\î,Òrg‘–;ƒ¸ÜY¤å΢Ûþhy¹s—;‹´ÜY¤åÎ"-wq¹³HËEXîŒárg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹´ÜÄåÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3HË5Zî,Òrg—;‹´ÜY¤åÎ"-wòrg‘–;‹´ÜÄåÎ"-wi¹³ès£¼ÜY¤åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY„åÎ.wi¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹´Üô©åÎ"-wi¹s—;‹´ÜY¤åÎ"-wi¹³FËEZî ârgÑÛþFy¹³HËA\î,Òrg‘–;‹´ÜÄåÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹³æ}¢¸ÜY£åÎ .wi¹³HËA\î,Òrg‘–;‹´Ü9ÈËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³HËEZî,Òrg—;‹°ÜY£åÎ -wÖh¹³HËEŸû ååÎ"-wi¹3ˆËEZî,Ârg–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Òrg—;‹´ÜY¤åÎ",wŽñrg–;k´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒ´ÜY£å΢—Ë Zî ârg‘–;‹´ÜÄå΢·ýqòrg‘–;ƒ¸ÜY„åÎ-wa¹3†ËEZî,Òrg—;‹´ÜY¤åÎ"-w}j¹³Ë5ZîÄåΚ÷ýmòrg‘–;ƒ¸ÜY¤åÎ"-wq¹³HËEZî,Òrg—;‹°ÜY£åÎ"-wq¹³HËEZî ârg‘–;‹þz¹³_‰åÎ.w­¹ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wa¹sŒ—;‹´ÜY¤åÎ"-wq¹³HËEZî ârg–;k´ÜY„åÎ.wi¹³HËA\î,Òrg‘–;‹>÷'ËËEZî,Òrg—;‹°ÜY£åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY„åÎ.wíg´ÜY¤åÎA^î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Ârg —;‹´ÜYô/~—ÕËA\î,Òrg‘–;ƒ¸ÜY„åÎ-wa¹3†ËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³HËEZî,ÒrgÐ'–;k´ÜY¤åÎ -ËEï³Üùßÿ7íçÛwrÜy¡%îä¸sãÎAŽ;¿ÐwrÜ9Èqç ÇZâÎAŽ;9î¼ÐwrÜ9Èqç ÇrÜ9Æqç ÇZâÎAŽ;1îã¸óBKÜ9Èqç ÇZâÎAŽ;9îä¸óBKÜ9Èqç ǃw^h‰;9îä¸óBKÜ9Èqç Æcw~¡-î bÜĸsãÎ ÆAŒ;ƒwrܤ¸3†qç ÇAŒ;ƒw1îä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwŽùdÜĸ3ˆqç…–¸3ˆqgÿBĸsãÎ ÆAŒ;9î zÓ¿ù1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ Å1Œ;ƒwrÜĸ3èïâÎù*ÇAïû£µÄAŒ;9î bÜĸsãÎ ÆAŒ;ƒw^h‰;ƒw1î bÜ9ÈqgãÎ Åcw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1î bÜ9ˆqg ãΠƃw1î bÜĸóBKÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ Åcw1î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îôɸ3ˆqgãÎ -qgãÎ ÆAŒ;1îŒaÜĸsãΠ·ýZâΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwbÜó¾?QŽ;cwrÜĸ3ˆqç ÇAŒ;ƒw1î¼Ðw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŠ;cwbÜø3ˆqgãÎAŽ;ƒw1îä¸3ˆqgÐ ¿îøsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw)î¼Ìw)îŒaÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎÆA¯¹.‚qç ÇAŒ;ƒwrÜô¶?NKÜĸsãÎ Å1Œ;ƒwŽqÜĸ3ˆqç ÇAŒ;ƒw1îä¸3Hqg ãÎ 9îŒyßߦ%î bÜ9ÈqgãΠƃw1î bÜĸsãÎ Å1Œ;ƒwrÜĸ3ˆqç ÇAŒ;ƒþ>îÌW*îã¸3hýCè¸sãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw)î¼Ìw1î bÜĸsãÎ ÆAŒ;9î RÜø3HqçÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3HqgÌMùLãÎAŽ;ƒw1î bÜ9ÈqgãÎ Åcwígw1î¼Ðw1î bÜ9ÈqgãÎ ÆAŒ;9î bܤ¸sŒãÎ ÆAÿâwY—¸sãÎ ÆAŒ;9î RÜø3HqçÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ˆqg ãÎ Æ_h‹;ƒÞÿ*îüú…Ý-îä¸óBKÜ9Èqç ǃw~¡-îä¸sãÎAŽ;/´ÄƒwrÜy¡%îä¸sãÎAŽ;/ä¸sŒãÎAŽ;/´ÄƒwbÜ9Æqç…–¸sãÎAŽ;/´ÄƒwrÜ9Èqç…–¸sãÎAŽ;9î¼ÐwrÜ9Èqç…–¸sãÎAŒ;Ç8îüB[Üĸ3ˆqç ÇAŒ;ƒw1îä¸3Hqg ãÎAŽ;ƒwÝÎ1îä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwŽqÜĸ3ˆqç…–¸3ˆqgÿBĸsãÎ ÆAŒ;9î zÓ¿ù1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ Å1Œ;ƒwrÜĸ3èïâÎù*ÇAïû£µÄAŒ;9î bÜĸsãÎ ÆAŒ;ƒw^h‰;ƒw1î bÜ9ÈqgãÎ Åcw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1î bÜ9ˆqg ãΠƃw1î bÜĸóBKÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ Åcw1î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw}îoÔw1î bÜy¡%î bÜĸ3ˆqç Æ1Œ;ƒwrÜô¶¿QKÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŒ;cÞ÷'Êqg ãÎAŽ;ƒw1îä¸3ˆqgãÎ ÆZâÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3Hqg ãÎAŒ;cw1î bÜ9ÈqgãΠƃw1î ºá×½bwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãÎ Å—YâÎ Å1Œ;9î bÜĸ3ès –¸3ˆqgãÎAŒ;cw½þåºƃw1î bÜ9ÈqgÐÛþ8-qgãÎAŽ;ƒwÆ0î RÜ9ÆqgãΠƃw1î bÜĸsãÎ Å1Œ;/ä¸3æ}›–¸3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒwÆ0î bÜ9ÈqgãΠƃw1î zw~C/;ÎWè|¡ãΠõ¡ãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bܤ¸ó2KÜĸ3ˆqgãÎAŽ;ƒw1îä¸3Hqg ãÎ Åcw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ Å1Œ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw)îã¸3h?ø3ˆqç…–¸3ˆqgãÎAŽ;ƒw1î úÜ_§%î bܤ¸sŒãÎ ÆAÿâwY—¸sãÎ ÆAŒ;9î RÜø3HqçÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ˆqg ãÎ Æ_h‹;ƒÞÿ"î|þ¿¯ÿÿ-ßâÎû?]âÿ=]Ô¸3èÛé wâÒ‰;u©q§.5î|}é[Ü)Ô¸óõÇ}‹;u©q'.¸—NÜ)Ô¸èÄB;…w 5îÄ q'¸S‡wâÒ‰;…wâãwêPãN:q'.¸S—wâÒ‰;qéĺԸS¨q'>îĸtâN]jÜ©K;qéĸtâN¡Æ@'îjÜ)”¸S¦qçëŸÀ·¸óõ¥oq'Qþ2¬kÜ©K;y)q'/%îԥƺ”¸“‡wêPãN]jÜI”¸“—¸S—wêRãN^JÜÉK‰;…wå/ÃD‰;…w%îÔ q'/%îjÜIt[ߨoq§¾ñƺԸ“—wòÒçŸõfãNjÜÉK‰;qéÄD‰;ñq'îä¥ÄºÔ¸S—w%îjÜIô6ÿæC”¸“(q§~;u©q'/%îä¥Ïý:q§>®q'/=÷7ê唸“‡îûuâN]jÜ©K;‰/ߨÿ;ûU;uºq§þ7iÜÉKÏýÑ:q'ÑÇþh¸S¨q'ÑÛþh¸“—ž?­_.¸—NÜIôØ­wêRãN]jÜÉKÏõÑ:q§5îä¥ûþh¸S—wêRãN¢Çþh¸S—wÝ÷GëÄB;‰w=öGëĺԸ“—nû£uâN]jÜIô±?Z'îä¥ÏýÑjÜ©C;yè¹?Z'îԥƼ”¸“—>÷7êÄø¸wòRâN]jÜ©K;‰îûuâN¡ÆDûuâNýwêRãN^ºÿx£~½ôÜߨwêãwòÒc}£NÜ©C;yé¶¿Q'îԥƺԸ“辿Q'îԥƺԸ“—žûuâN¢ÄD‰;‰>÷7êÄú4îä¥ÇþF¸—NÜÉK÷ý:q§>.q§5îä¡ÇþF¸S—wòÒm£NÜ)Ô¸“èc£NÜ©o¼q§.5î$ºíoÔ‰;…w½ïoÔ‰;õ#hÜ©K;u©q'/=~¼Q¿]JÜ©C;‰îëuâNjÜ©K;yé±?Q'îÔ¥ÆD·OÔ¯è¹?Q'îÄ7~âN^züx¢~½ô¹?Q'î$ºíOÔ‰;…wêoÜÉK÷ý‰:q§.5îÔ¥Ä<ôØ_¨Æú°ÆöëĺԸS—wòÒm²wâЉ;qèļôØÿÅàÄú¸ÆºÔ¸“—žû“uâN¢÷õÉ:q'Ñçúd=wÝö'ëĺԸS—wòÒ}²NÜ©kÜ©K;yé±?Y'îÔ¥Ä÷ŠËa¹ó ,wa¹ó,wôj9á,wi¹ó ,w„åÎ"-wô¶?N\î<ËEZî<èõrç1Xî<èõrg–;ÂrçAXî,ÒrçAXî<Ëa¹³H˽^î<ËAZî<æ}›¸Üy–;‹´Üy–;Ârg‘–;ÂrçAXî<ËEZî<èõrç1Xî<ËEZî<Ëa¹³HËa¹ó ,wô—ËýB-w´þ!Ôrg‘–;ÂrçAXî<ËEZî<Ëa¹³HËa¹ó ,wôz¹3†Ëa¹ó ,w„åÎ"-w„å΃°ÜY¤å΃^/wƒå΃^/wÖh¹ó ,w„åÎ"-w„å΃°Üy–;‹´Üy–;Ârg‘–;z½Üy –;Ârg‘–;ÂrçAXî<ËEZî<˽^î¬ÑrçAû,w„åÎ .w„å΃°ÜY¤å΃°Üy–;Ârg‘–;ÂrçA¯—;k´Üy–;ºï¯—;‹´Üy–;Ârg‘–;z½Üy –;z½ÜY£å΃°Üy–;Ârg‘–;ÂrçAXî,ÒrçAXî<Ëa¹³ËÇ`¹ó ,wòrçAïµÜùÏßb¶¶ó2N;¿ÌRv^ÆaçeÜu^ÆYç?f«:/ã¨ó2n:/ã¤óË,Eçet^Æ=ç—YrÎ˸漌cÎ˸åü2N9/â’ó29¿ÌÒq^ÆçeXq^Äç—YÎË8Ἄ Î/³œ—q¿yç›—q½ùe–xó2n7/ãtó2.7¿Ìn^ÆÝæeœm~™¥Ú¼Œ£Í˰ټˆ“ÍÌVlŽa°9†½æeœkŽa­9†±æ¶š—qª9F¥æ†š—q§9†™æVšci^Ææ&šcXhŽa y÷™c˜gŽayÇ™cØfŽaš9†eæefŽa—9†Yæe\eŽa”9†Mæ%™q‘9†Aæö˜_fÉ1ǰÆÿÀŽa‹y§˜cXbŽaˆyw˜cÞô¯3cXaŽa„y7˜c˜`Ža9†æeÜ_Ža~9†õåe_ŽQ{9„éå–——qx9†Ýåf——ùËêr¾è}}†–ær “Ë˸¸Ãàr {ËË8·ÃÚr cË1l-¿Ì’ZŽai9†¡åv–—qf9†•åE–qc9†‰å–cX^Æ}åæ•cXW^Æqå¶•c˜VŽaYy‡•cØUŽaVyW•cUŽaS9†Iåe\TŽaP9†=åæ”—aM9„1å¶”—qJ9†%冔cØQ~™%£Êr #Ê˸¡Är Ê1 (/ã~r óÉ1¬'/ãxr ÛÉ1w¥“cXN^Æáäv“c”M^ÄÕäF“cØLŽa2y“cLŽa/9†¹äe\KŽa,9†­äeœJŽa)9†¡äv’—q&9†•äF’_fi$Ç0‘ÃBr É˰ÂÃøð2nÇ0=Ãòp ÃÃ˸;ÃìpŒªÃ‹8:³ar8†Åá—Y‚Ã1ì Ç07¼ŒkÃ1Œ ǰ5ÃÔð2. Ç04£Îð"Πǰ2³ÿŽæÒ^Ɖá†c^Æ}áå…CXŽQ\x·…c˜ŽaY8†aáeÜŽaV8†UáeŽaS8†Iá…—aP8„=áæ„ÿ˜­&óþ71á?ÿO¶ÇV1'äž0ˆAa‹Â &…ZšÂ F…A¬ ƒ˜rWİ0ˆeá §…Al ƒ±.ļ0†}aÃA. ƒ˜©1Œad8È•a3à v†ƒ±4 bjÄÖpcà ֆAÌ ƒØrpÄâ0ˆÉá 7‡AŒƒTÆ|*;¼ÐÒ)<,RyÄô°Hía‘âÃ"Õ‡AÌ‹ÐÖ(@ bX¤±H b‘"Ä VˆEÊ‹Ô!)D b‰X¤±H-bcÄ"ÕˆEÊ‹Ô#1H,R‘X¤$1ˆMb‘¢Ä"U‰EÈcØ%)L,R™8Èib‘ÚÄ"ýÅ·HubóÄ"õ‰E ƒX(½á_sŠÔ()R b¥X¤L±Hb‘BÅ –ŠEJ‹Ô*1V,B­X£\±H½bƒÅ"‹EJƒþ®YìW½ï–«Å"e‹Aì‹.©\ bºX¤v±Hñb‘êÅA΋Ô/)`,RÁÄ„±H c"ÆVŒEÊ‹Ô1)d bÉX¤”±H-ccÆ"ÕŒEÊ‹Ô31h,RÑX¤¤1ˆMc‘¢Æ"UEʃØ5)l,RÙX¤´1HmcâÆ"ÕAÌ‹Ô7)p,Rá8ȉc‘Ç"EŽA¬‹”9©s,RèÄÒ±H©c‘ZÇ ÆŽEª‹”;©w bðX¤â±Éc ›Ç¢·ýrõX¤ì1ˆÝc‘ÂÇ"•EJƒØ>)~,RýÄü±Hýc‘È"AL ‹Ô@)‚ä ²Hd‘:È"…A*!k”B©… b Yô¶¿QÎ!‹ÔC1ˆ,RY¤$²HMd£È"U‘EÊ"ƒØE)Œ,RY¤42ˆmd‘âÈ"Õ‘AÊ#kÞ÷'Šd É &’Ej$‹I±’,R&Y¤N²H¡ä —’EJ%‹ÔJ)– újÉ"å’Eê%ƒL©˜,R2Yô¹?QŽ&‹PMÖ(› R7Y£p²Håd‘ÒÉ ¶“EŠ'‹TO1Ÿ,R?Y„€²FeÊ"5”EŠ(‹TQ1£,RGY¤2ˆ%e‘RÊ"µ”Eˆ)Ǹ¦,BNY£ž2ˆAe‘ŠÊ"%•Ej*ƒU©ª,RV¤®²FaeÑË߬«PZͲHqe‘êÊ æ•EoûãäÀ²H…eË"4–5Š,‹PYÆ0³,RgY¤Ð2ˆ¥e‘RË"µ–EŠ-ƒX[!·¬Qo9ˆÁeÍûþ69¹,RsÄè²HÕe‘²Ë v—E /‹T^)½ b{Y„ø²Fõe‘òË ö—E 0‹T`1Á,RƒY¤³èo+Ì|!3Ì¢õ!CÌ –˜EJ1‹Ôb)Æ bY¤³H=fƒÌ"™EJ2‹ÐdŽq”Y¤*³HYf‘ºÌ þçö.3‹”f±Í,BœY£:³yf ûÌ"šE*4ƒ˜h©Ñ,R¤Y¤J3ˆ™f‘:Í"…šA,5‹jÖ¨Õ,R¬ÄZ³H¹f‘zÍ"›A,6‹”l¡ÙŒa´Y´ŸQ¶Y¤nsÃÍ"•›EJ7ƒØn)Þ,R½Y¤|3ˆýf‘Î"œ1L8‹Ôpý‹ßeuÅÄŒ³Hg‘BÎ –œEH9kÔr!æŒaÍY¤œ³H=g‘‚Î EJ:‹Ôt1ê,RÕY¤¬³H]gÂΕEJ;/´´EïwÞÿy¦¾Å÷ºÄŸ§5î ú?ßä…N܉K'îԥƺԸóõ¥oq§PãÎ×÷-îԥƸôŸÆ¸tâN¡Æ@'îjÜ)Ô¸S¨q'~;qèÄ:Ô¸—NÜ)Ô¸׸S‡wâЉ;qéĺԸ—N܉K'îÔ¥ÆB;ñq'îÄ¥wêRãN]j܉K'îÄ¥w 5î:q§PãN¡Ä2;_ÿ¾Å¯/}‹;‰ò—a}\ãN]jÜÉK‰;y)q§.5îÔ¥Ä<”¸S‡wêRãN¢Äü¸ÄºÔ¸S—wòRâN^JÜ)Ô¸“(&JÜ)Ô¸“(q§~;y)q§PãN¢ÛúF}‹;õ7îԥƼ”¸“—&îÔ¡Æ:Ô¸“—wâÒ‰;‰wâãNÜÉK‰;u©q§.5î$JÜ)Ô¸“èmþ͇趾QßâNýwêRãN^JÜÉKŸûuâN}\ãN^zîoÔ‰;u)q'Ý÷7êĺԸS—w=ö7êÄÿ{é·¸3_õ¾?Z'îÔ7Ù¸S¨q'ÑÇþh¸S¨q'ÑÛþh¸“—ž?­_.¸—NÜIôØ­wêÒÞöGëļô\­wêPãN^ºïÖ‰;u©q§.5î$zìÖ‰;u©q'Ñ}´NÜ)Ô¸“èc´NÜ©AãN]jÜÉK·ýÑ:q§.5î$úØ­wòÒçþh5îÔ¡Æ<ôÜ­wêRãN^JÜÉKŸû_¬N܉;q'/%îԥƺԸ“辿Q'îjÜIô±¿Q'îÔ q§.5îä¥û7ê×KÏý:q§>®q'/=Ö7êÄ:Ô¸“—nûuâN]jÜ©K;‰îûuâN]jÜ©K;y鹿Q'î$zßߨw}îoÔ‰;õ#hÜÉKý:q'.¸“—îûuâN}\âNjÜÉCý:q§.5îä¥ÛþF¸S¨q'ÑÇþF¸SßxãN]jÜItÛߨw 5î$zßߨwêGиS—wêRãN^züx£~»”¸S‡wÝ×'êÄ:Ô¸S—wòÒc¢NÜ©K;‰n?ž¨_Ñs¢N܉oüļôøñDýzés¢NÜItÛŸ¨w 5îÔ7Þ¸“—îûuâN]jÜ©K‰;y豿P;õa;y辿P'îԥƺԸ“—wêRãN]jÜI4q'Ís NÜ©ï»q'/=öêÄB;‰nûuâN]jÜ©K;yé¾?P;qèÄ8Ô¸“æ±?P'îԥƼtߨwêRãN]jÜÉKýjÜIó¾¿Owê›nÜ©3;‰>öÇéÄB;õ7îä¥Ûþ8¸S—wêRâNºÿxœ~=ôùg{ÀNÜItÛ§wêRãN]jÜÉK÷ýq:q§.5î$úX§w5î¤yßߦwâpâN]jÜI”¸“豿M'îÔ7Þ¸“—nûÛtâN]jÜ©K‰;yè¾?N'îÔ§5îԥƼ”¸S—wêRãN^ºïSãÎÿ5¯âÎùÂÆº~_ÿ6îjÜ©ŸIãN^ºï/Ö‰;…w}ì/Ö‰;u©q§.5îä¥Ûþd5îÄ¡wâЉ;yé±ÿ‹Á‰;õq;u©q'/=÷'ëÄDïë“uâN¢ÏõÉz6î$ºíOÖ‰;u©q§.5îä¥ûþd¸S׸S—wòÒc²NÜ©K‰;yèöãÉúõÐóÏÖI|‹;‰>ö'ëļô¹?Y'îÔ¥çÏßgýõÒsýûÔ‰;‰ö3÷ýu:q'¾éwâÒ‰;y鹿N'î$zß_§wòÒçþ:¸S—wòÒc}NÜ©C;yé_ü.ë‰;õq;u©q'/=ö×é唸“‡nûëÔ¸S¦q'ÑÏßdýÝ÷×éÄú4îԥƼôÜ_§wêãwòÒ}NÜ©K‰;u¨q'=Ö×é[ÜùúÒ·¸ó—K¿Äÿý=×åÎA^î¼Ð²Ü9È˃¼Ü9ÈË_h[îäåÎA^îäåÎ ýÇ˃¼Ü9ÈËZ–;y¹s—;y¹óB^îãåÎA^î¼Ð²Ü9È˃¸Ü9ÆËZ–;y¹s—;/´,wòrç /wòrç…–åÎA^îäåÎA^î¼Ð²Ü9È˃¼Üy¡e¹s—;q¹sŒ—;¿Ð¶ÜÄåÎ .wòrg—;ƒî˜ ârç /wi¹3†Ëƒ¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Ü9ÈËA\î ârg—;y¹3ˆËA\îäåÎ .wq¹3HËc¼ÜÄåÎ .w^hYî ârgÿkGA\îäåÎ .wq¹s—;ƒÞþà?èÄåÎ .wòrg—;ƒ¸ÜÄåÎA^î ârg—;y¹3HË1\î ârç /wq¹3ˆËƒ°Üù ½¿|£~+@óU\î ârç /wq¹3ˆËƒ¼ÜÄåÎ .wq¹óBËrg—;ƒ¸ÜÄåÎAÿárg—;ƒ´Ü9ÆËA\î ârg—;y¹3ˆËA\îäåÎ .wÝ÷GkYîäåÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA\îŒárg—;y¹3ˆËA\î úÜ­e¹3ˆËA\îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA^î ârg–;Çx¹3èm£–åÎ .wòrg—;ƒ¸ÜÄåÎA^î ârg—;y¹3ˆËA\î ârç /wq¹3ˆËZ–;ƒ¸ÜÄåÎ .wârg —;ƒ¸Ü9ÈËAoûµ,wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Ü9ÈËA\î ârg—;y¹3ˆËA\îÄåΘ÷ý‰òrg —;y¹3ˆËA\îäåÎ .wq¹3ˆËZ–;ƒ¸ÜÄåÎ .wú—;ƒ¸ÜÄåÎA^î ârg—;ƒ¸Ü9ÈËAZîŒárç .wÆp¹3辿PËrç /wq¹3ˆËƒ¼ÜÄåÎ -wÆp¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Ü9ÈËA\î ârg–;/³,wi¹3†Ëƒ¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA\îŒárgÐëå„.wòrg—;ƒ¸Ü9ÈËAoûã´,wq¹s—;ƒ´ÜÃåÎ -wŽñrg—;ƒ¸Ü9ÈËA\î ârg—;y¹3HË1\î¼—;cÞ÷·iYî ârç /wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ´ÜÃåÎ .wòrg—;ƒ¸Ü9ÈËA\î ârgÐËåÎc0ÒùªÍW®½Ü9ÈËA\î ºï/Ö²Ü9ÈËA\î ârç /wq¹3ˆËAZî¼Ì²ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA^î Òrg —;ƒ>×'ëéåÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Ü9ÈËAZîŒárg—;y¹3ˆËA\î ârç /wq¹3HËc¼Ü´Ÿárg—;/´,wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ¸Ü¤åÎ1^î ârgпø]Öe¹s—;ƒ¸ÜÄåÎA^î Òrg —;ƒ´Ü9ÆËA\î ârg—;y¹3ˆËA\îäåÎ .wq¹3ˆËƒ¸ÜÃåÎ .w~¡m¹3èýo–;ÿù[êm‹;ƒwrÜĸ3ˆqgãÎ -qgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwbÜø3ˆqç ÇAŒ;ƒwÆ0îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŠ;cw^h‰;‹w)î bÜY¤¸³Hqg‘âÎ ÆEˆ;kw1î,RÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEŸˆ;ƒw)î,RÜĸ³Hqg‘âÎ"Ä1Œ;‹w)î丳Hqg‘þB\¤¸3ˆqg‘âÎ"ÅAŒ;‹Þðo>EŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw!î¬QÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹Þÿ&îìW)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w)î丳Hqg‘âÎ"ÅAŒ;‹w!îŒaÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒwÖ(î,RÜĸ³Hqg‘â΢ÏýÑrÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,BÜø³Hqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³Hqç ÇEŠ;‹w)î RÜY£¸³Hqgã΢·ýrÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w)î RÜYó¾?QŒ;kw1î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;9î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqgâÎÅAŠ;kw)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹wÖ(î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³qçÇEˆ;kw1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒwÖ(î,zùËuŠ;ƒw)î,RÜĸ³èmœw)î bÜY„¸³FqgâÎÆEŠ;‹w1î,RÜY¤¸³HqgãÎ"Ä5Š;1î¬yßß&ÇEŠ;ƒw)î,RÜĸ³èm›w)î bÜY„¸³Fqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³qgÌßÇýÊõ!ãÎ ÆEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹wŽqÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,BÜY£¸³qg ãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹wÖ(î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w!îŒaÜY´ŸQÜY¤¸sãÎ"ÅEŠ;ƒw)î,RÜY¤¸3èMqg‘âÎ"Ä1Œ;‹wý‹ßeuÜĸ³Hqg‘âÎ ÆEoëë丳qg ãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒþ?Îî-)Ò,IÖèŒBZpüÂü'Ö•ü¦ºi –eôÓyY˜#œ¬ÞQ|©Š;kw)î¼ÐwÝþ*îüÏyx[ãÎAŽ;/´ÄƒÞwrÜ9Èqç'ÚâÎAŽ;9îä¸óBKÜ9Èqç ÇZâÎAŽ;9îä¸óBŽ;Ç8îä¸óBKÜ9Èqç Æcw^h‰;9îä¸óBKÜ9Èqç ǃw^h‰;9îä¸sãÎ -qç ǃw^h‰;9îĸsŒãÎO´ÅAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒwÆ0îä¸3ˆqgãΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgâÎ1Ž;ƒw1î¼Ðw1î ∃wrÜĸ3ˆqç ÇAoú;Ÿ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrܤ¸3†qgãÎAŽ;ƒw1îä¸3èöWqg¾ŠqgãÎAŽ;ƒw1îä¸3èm´–¸3ˆqç…–¸3ˆqgãΠƃw1î RÜ9ÆqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãΠƃwÆ0î bÜ9ÈqgãÎ ÆAŒ;/´ÄAŒ;ƒwrÜĸ3豿QKÜ9ÈqgãΠƃw1î bÜĸsãÎ ÆAŠ;Ç8î bÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ ÆZâÎ ÆAŒ;ƒwbÜø3ˆqç ÇAoûµÄAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îĸ3æ¶?QŽ;cwrÜĸ3ˆqç ÇAŒ;ƒw1î¼Ðw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŠ;cwbÜø3ˆqgãÎAŽ;ƒw1îä¸3ˆqgâÎƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3Hqçe–¸3Hqg ãÎAŽ;ƒw=öj‰;9î bÜĸsãÎÆA¿ÿr]ãÎAŽ;ƒw1îä¸3èmœ–¸3ˆqç ÇAŠ;cw)îã¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgâÎÆrÜsÛߦ%î bÜ9ÈqgãΠƃw1î bÜĸsãÎ Å1Œ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw)îóÿˆ;ó•ë?„Ž;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgâÎË,qgãÎ ÆAŒ;9î bÜĸsãÎ Å1Œ;ƒwŽqÜĸ3ˆqç ÇAŒ;ƒû“µÄƒw1î bÜ9ÈqgâÎÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwŽqÜ´ŸaÜĸóBKÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgâÎ1Ž;ƒwý‹ße]âÎAŽ;ƒw1îä¸3Hqg ãÎ Åcw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç Æ1Œ;ƒw~¢-î ºýUÜùŸÿüñ5î|üÓ%~?=¨qgÐÿù&/tâN\:q§.5îԥƿ_úw 5îüýã¾ÄºÔ¸—N܉K'îjÜ tâN¡ÆB;…wâGи‡NÜ©C;qéÄB;ñq;u¨q'¸—NÜ©K;qéĸtâN]jÜ)Ô¸wâN\:q§.5îԥƸtâN\:q§PãN w 5îJÜ)Ó¸ó÷ŸÀ—¸ó÷K_âN¢üaX׸S—wòRâN^JÜ©K;u)q'%îԡƺԸ“(q'?.q§.5îԥƼ”¸“—w 5î$ʆ‰w 5î$JÜ©AãN^JÜ)Ô¸“è¾¾Q_âN}ã;u©q'/%î䥉;u¨q§5îä¥Ä¸tâN¢Äø¸wòRâN]jÜ©K;‰w 5î$z›¿ó!º¯oÔ—¸S?‚ƺԸ“—wòÒÇþF¸S׸“—^ûuâN]JÜÉCý:q§.5îÔ¥ÆDÏý:q§.5îüïK?ÅùªÇþh¸S¨q'Ñûþh¸S¨q'ÑÛþh¸“—^ß­.¸—NÜIôÜ­wêRãN]jÜÉK¯õÑ:q§5îä¥Çþh¸S—wêRãN¢çþh¸S—w=öGëÄB;‰Þ÷GëÄú4îԥƼtß­wêRãN¢÷ýÑ:q'/}ìVãNjÜÉC¯ýÑ:q§.5îä¥Ä¼ô±?Z'îÄǸ“—wêRãN]jÜIôØß¨w 5î$zßߨwêGиS—wòÒãÛõã¥×þF¸S׸“—žëuâNjÜÉK÷ý:q§.5îÔ¥ÆDý:q§.5îԥƼôÚߨwÝö7êÄDûuâNýwòÒs£N܉K'îä¥ÇþF¸S—¸S‡wòÐs£NÜ©K;y龿Q'îjÜIô¾¿Q'îÔ7Þ¸S—wÝ÷7êÄB;‰nûuâNýwêRãN]jÜÉKÏooÔO—wêPãN¢ÇúD¸S‡wêRãN^zîOÔ‰;u©q'ÑýÛõ#zíOÔ‰;ñŸ¸“—žßž¨/}ìOÔ‰;‰îûuâN¡ÆúÆwòÒc¢NÜ©K;u)q'=÷ªq§>¬q'=öêĺԸS—wòRâN]jÜ©K;‰&î¤yíÔ‰;õ}7îä¥çþ@¸S¨q'Ñ} NÜ©K;u©q'/=öªq'¸‡wÒ<÷êĺԸ“—ûuâN]jÜ©K;yé¹?P;inûû4q§¾éÆ:Ó¸“è}œNÜ)Ô¸SßxãN^ºïÓ‰;u©q§.%îä¡Ç·ÇéÇC¶ìÄD÷ýq:q§.5îԥƼôاwêRãN¢÷õq:q'PãNšÛþ6¸?€wêRãN¢ÄDÏým:q§¾ñƼtßߦwêRãN]JÜÉCýq:q§>­q§.5îä¥×þ8¸S—wòÒcœwÊ4îüoô[Ü™¯\ÿ!lÜ)Ô¸S?“ƼôØ_¬w 5î$zß_¬wêRãN]jÜÉK÷ýÉj܉C'îÄ¡wòÒsÿƒwêãwêRãN^zíOÖ‰;‰në“uâN¢õÉz5î$ºïOÖ‰;u©q§.5îä¥Çþd¸S׸S—wòÒs²NÜ©K‰;yèþíÉúñÐëÏÖI|‰;‰Þ÷'ëļô±?Y'îÔ¥×÷ßgýñÒk}²NÜI´Ÿyì¯Ó‰;ñMŸ¸—NÜÉK¯ýu:q'ÑmNÜÉKûëtâN]jÜÉKÏõu:q§5îä¥ñ»¬'îÔÇ5îԥƼôÜ_§wêRâNºï¯SãN™ÆDß“õGôØ_§wêиS—wòÒkNÜ©kÜÉKýu:q§.%îÔ¡Æ<ô\_§/qçï—¾Ä?\úï¸ó?ÿ9þŸÇ¶ÜÄåÎA^î ârg—;ƒ¸Üy¡e¹3ˆËA\î ârç /wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;c¸ÜÄåÎA^î ârg–;c¸Ü9ÈËA\î ârç /wq¹3ˆËA\îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ .wòrg—;ƒ´ÜÃåÎ -ËEZî,Òrg—;‹´ÜY¤åÎ"-wq¹³Ë5Zî ârg‘–;‹´ÜY¤åÎ .wi¹³HËEZî ârg‘–;‹´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wa¹3†ËEZî,Òrç /wi¹³Hÿ¶£"-wq¹³HËEZî ârgÑÛŸßÿ…^EZî,Òrg—;‹´ÜY¤å΢ýòrg‘–;‹´ÜÄåÎ",wÖh¹³HËA\î,Òrg‘–;ƒ¸ÜYtÛß( uþP€ö«´ÜÄåÎ"-wi¹3ˆËEZî,Òrg‘–;y¹³HËEZî,Òrg—;‹´ÜY„åÎ.wi¹³HËEZî ârg‘–;‹´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒ¸ÜYtÛ-/wi¹3ˆËEZî,Òrg‘–;ƒ´ÜY£åÎ"-wq¹³HËEZî,Òrç /wi¹³HËA\î,ÒrgÑc£¼ÜÄåÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ",wÆp¹³HËEZî,Òrg—;‹´ÜY¤å΢ýòrg‘–;‹´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;y¹³HËEZî,Òrg–;k´ÜY¤åÎ .w½ío”—;‹´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Òrg–;knûÅåÎ-wq¹³HËEZî ârgÑm¢¼ÜY¤åÎA^î,Òrg‘–;‹´ÜÄåÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY„åÎ-wi¹³FËEZî,Òrg—;‹´ÜY¤åÎ .wi¹³Ë5Zî ârg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹>ÖÊËEXî¬Ñrg—;‹´ÜYôØ(/wq¹³HËEZî Òrg–;‹~]N¨Ðrg—;‹´ÜY¤åÎ .w½í“—;‹´ÜÄåÎ",wÖh¹³Ë1\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEXî¬Ñrç .wÖÜö·ÉËEZî ârg‘–;‹´ÜÄåÎ"-wi¹³HËA\î,Ârg–;‹´ÜÄåÎ"-wi¹3ˆËEZî,Òrg–;cþ~¹³_¹þCÈåÎ .wi¹³HËEZî ârg‘–;‹´ÜÄå΢¶ÑŠ´ÜY„åÎ1^î,Òrg‘–;‹´ÜÄåÎ"-wi¹3ˆËEXî¬Ñrg–;c¸ÜY¤åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY¤åÎ .wa¹³FËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³Ë1\î,ÚÏh¹³èc¼ÜY¤åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY„åÎ.wi¹³è_ü.«—;ƒ¸ÜY¤åÎ"-wq¹³Ë5Zî,Ârg —;‹´ÜY¤åÎ"-wq¹³HËEZî ârg‘–;‹´ÜY¤åÎ -wÖh¹³HËZ–;‹n³ÜùŸÿˆÞ×¶ó2N;?ÍRv^ÆaçeÜu^ÆYç?f«:/ã¨ó2n:/ã¤óÓ,Eçet^Æ=ç§YrÎ˸漌cÎ˸åü4N9/â’ó29?ÍÒq^ÆçeXq^Äç§YÎË8Ἄ ÎO³œ—¹±ß¼ŒóÍ˸Þü4K¼y·›—qºy—›Ÿf 7/ãnó2Î6?ÍRm^ÆÑæeØl^ÄÉæ?f+6Ç0ØÃ^ó2Î5ǰÖÃXs [ÍË8Õ£RsCÍ˸ÓÃLs +Í1Œ4/ãFs Í1,4Ç0мŒûÌ1Ì3ǰμŒãÌ1l3Ç0ÍÃ2ó23ǰËÃ,ó2®2Ç0ÊÃ&sŒ’Ì‹¸Èà s {ÌO³ä˜cXcŽá`ǰżŒSÌ1,1Ç0ļŒ;Ì1oúÛ™1¬0Ç0¼ŒÌ1L0ǰÀÃó2î/Ç0¿Ãúò2Ž/Ǩ½Âôr ËËË8¼Ãîr ³Ë˸ºs[_¿m.狘\^ÆÅå—cØ[^ƹåÖ–c[Žakùi–Ôr KË1 -ǰ³¼Œ3Ë1¬,Ç(²¼ˆË1L,ǰ°ÃÀò2î+Ç0¯úò2Ž+ǰ­ôr ËÊË8¬îr ³Ê˸ªs[Ÿ¡¥©äò2.*Ç0¨Þr sÊ˰¦˜r [ÊË8¥Ã’r CÊ1ì(?Í’QŽaE9†åeÜPŽaB9†å”—q?9†ùäÖ“—q<9†í䦓cXN^Æáäv“c”M^ÄÕäF“cØLŽa2y“cLŽa/9†¹äe\KŽa,9†­äeœJŽa)9†¡äv’—q&9†•äF’Ÿfi$Ç0‘ÃBr É˰ÂŽaú8†åãe>Ža÷8†ÙãV—qô8FÍã&—añ8„ÁãöŽc˜;^ƵãÆŽcØ:^Ʃ㖎c:açxgŽcX9Žaä8†ãeœ8Žaá8†ãeÜ7ŽaÞ8†uãÅŸdiÇ(m²ñ2ǰkìq «ÆË8jæq “ÆË°h qÌï¿O6€9ãe\3ŽaÌ8†-ãeœ2Žy[Ÿ›%dÃŽñ2ÎǨbˆqŒÆ‹8aÂq ÆË¸_Ã|q ëÅ1Œ/ãvqŒÒÅ!,?ÃÅ!·õµY²Å1¬/ãhq ›Å1L/ãbq ƒÅ1ìÇ0W¼ŒkÅ1Ї°UÃTñ2.Ç0TÃNñ2ÎǰRÃHqŒÅ‹ü?ÅùÂíŸ9Š—qŸ8†yâÖ‰c'^Æm⦉cX&^Æaâv‰c˜%ŽQ•øI–(q ›Ä1LǰH¼ŒƒÄ1ìÇ0G¼ŒkÄ1Ї°E£ñ".Ç0DÃñ2ÎǰBÃq ÄË8AÃq Ä˸?£üpëÃ1Œ/ãöp ÓÃ1,Ç0<¼Œ»Ã1ÌǨ:¼ˆ£Ã1ë&‡cX~š%8ÃÞp sÃ˸6ÃØp [Ã1L /ãÒp CÃ1ê /âÌp +Ã1ûïh.áeœŽaa8†áeÜŽQ^8„uáÅ…q[8†iá–…c^Æ]áf…cX^ÆQá6…cë{³…—aP8„=áæ„ÿ˜­&sû«˜ðó÷Œ¶šps -=á …ƒ\rRø‰¶¦p£ÂA® 9+¼ÐÒrX8Èeá…–´pÛÂAÆ…ƒ\^Èyá÷…ƒ^h) 91ÄÆpŒ#à -•á g†ƒÜ^h ¹4äÔp[à -±á ׆ƒœrox¡%8äâp“à -Íá G‡ƒXŽqvø‰¶î0ˆáaËÃANƒØ1> b}8Èùaúȃ\ 1A bƒÄq+Ä fˆAìƒ"r‰Ä1ˆ-â LjA¬ƒ˜#±Gä 1ˆEb“ÄAnƒ%±J R–8Æ]bÃÄ –‰ZÒÄ ¶‰AüƒoëÄA΃Ø'1PäB1èM›ÄF1ˆ‘â WŠÃØ)1TäR1ˆ©b[ÅAŽƒT+Æ<ö7jé9X b±Ädq›Å ÛþFýmµ˜¯b¶8ÈÝbÃÅ –‹ƒœ.±] b¼ÄzñBK¾Ä~1ˆc ÆANƒØ0)bãŠ1ˆc;Æ †Œƒ\21e bË8È1ckÆ æŒAì9h bÑĤq›Æ FA¬ƒ˜5r×İ1ˆecÐÇþh¹mŒaÜĺqóÆ öA ƒX8^hIƒØ81räÊ1ˆ™c;Ç †Žƒ\:1u bë8ȱckÇ æŽAì9x bñ¤äqŒ›Ç FA¬ƒ˜=r÷Äð1ˆåcÓÇAnƒ?±~äü1ˆýcÈ ƒœ@± by¡¥‚ bÄ2ˆ!ä –1L!ƒØBr ô¶¿QKÄrƒÈ ‘AL"ƒØDrÄ*2ˆYä w‘A #ƒûµ¤‘ƒÜF1Ž b9ˆydÌm¢HưäD2ˆd#ÉA®$ƒ˜I±“ b(y¡¥” b*ÄV2èc¢–Z2ˆ¹d{ÉA&ƒXL1™ b39ÈÑdªÉf“ƒØMÆ0œ b9ÄtrÛÉ Æ“A¬'9Ÿ b?¤€2†å '”Al(ƒQ±¢äŒ2ˆeCÊA.)ƒ˜R±¥ RLy™¥¦ RNÞrƒÊ •AL*ƒØTrTĪ2ˆYå v•1 +ƒ~ÿͺ¦•ƒÜV1® b]9ÈyeÐÛþ8-e ËAN,ƒÔXÆ0² Re9Æ™e;Ë †–ƒ\Z1µ bkÄØrkË å–1ì-/äà2æ¶¿MKrÄær£Ë V—AÌ.¹» bxÄò2ˆéå ·—AŠ/cX_1¿äþ2ˆf ÌAN0ƒØ`1 R…9æÿ‘aæ+×br‰Ä3ˆ-fcÌA®1ƒ˜c±Çä 3ˆEf“Ì 5™—Y¢Ì V™AÌ2ƒ>ö'k 3ƒXf1Íä63Hqf ëÌ å™cÜg1Ð b¡9ȉfÍ FšA¬49Ó b§ÄPsKÍ ¥š1l5ƒkr­Ä\3ˆ½fƒÍA.6ƒ˜l©Ùãh3h?Ãl3ˆÝæ…–p3ˆåfÓÍAn7ƒo±Þ b¾9ÈýfÎ œcœp±á ú¿ËºTœƒœq±ã bÈ9È%gRζœAŠ9Ǹæ bÎÄž3ˆAç AL:ƒØtrÔĪ3ˆYg»ÎA ;cXv1íüD[Ûtû›¸ó?ÿ ãíýkÜùø§Küv:¨qgÐ×orЉ;qéĺԸS—wþ~éKÜ)Ô¸ó÷ûwêRãN\:q'.¸S¨q'Љ;…w 5îj܉AãN:q§5îÄ¥w 5îÄÇ5îÔ¡Æ8tâN\:q§.5îÄ¥wâÒ‰;u©q§PãN|܉;qéĺԸS—>wâÒ‰;qéÄB;NÜ)Ô¸S(q§LãÎß_âÎß/}‰;‰ò‡a}\ãN]jÜÉK‰;y)q§.5îÔ¥Ä<”¸S‡wêRãN¢Äü¸ÄºÔ¸S—wòRâN^JÜ)Ô¸“(&JÜ)Ô¸“(q§~;y)q§PãN¢ûúF}‰;õ7îԥƼ”¸“—&îÔ¡Æ:Ô¸“—wâÒ‰;‰wâãNÜÉK‰;u©q§.5î$JÜ)Ô¸“èmþ·达Q_âNýwêRãN^JÜÉKûuâN}\ãN^zíoÔ‰;u)q'=ö7êĺԸS—w=÷7êĺԸ“—¿¾Q?Äýª×þh¸“è}´NÜ)Ô¸“èm´NÜÉK¯oÖ—N܉K'î$zîÖ‰;u©q§.5îä¥×úh¸S‡wòÒc´NÜ©K;u©q'Ñs´NÜ©Kï·ýÑ:q'ÑÇþh¸“è}´NÜ©AãN]jÜÉK÷ýÑ:q§.5î$zß­wòÒÇþh5îÔ¡Æ<ôÚ­wêRãN^JÜÉKû£uâN|܉;y)q§.5îÔ¥ÆDý:q§PãN¢÷ý:q§~;u©q'/=¾½Q?^zíoÔ‰;õq;yé¹¾Q'îԡƼtßߨwêRãN]jÜIôØß¨wêRãN]jÜÉK¯ý:q'Ñm£NÜIô±¿Q'îÔ q'/=÷7êĸtâN^zìoÔ‰;õq‰;u¨q'=÷7êĺԸ“—îûuâN¡ÆDïûuâN}ã·ý:q'Ñ}£NÜ)Ô¸“è¶¿Q'îÔ q§.5îԥƼôüöFýt)q§5î$z¬OÔ‰;u¨q§.5îä¥çþD¸S—wÝ¿=Q?¢×þD¸ßø‰;yéùí‰úñÒÇþD¸“è¾?Q'îjÜ©o¼q'/=ö'êĺԸS—wòÐs¡wêÃÞwòÐc¡NÜ©K;u©q'/%îԥƺԸ“hâNš×þ@¸SßwãN^zîÔ‰;…wÝ÷êĺԸS—wòÒc wâЉ;q¨q'Ís NÜ©K;yé±?P'îԥƺԸ“—žûÕ¸“æ¶¿Owê›nÜ©3;‰Þ÷ÇéÄB;õ7îä¥ûþ8¸S—wêRâNz|{œ~<ôñg{ÀNÜItß§wêRãN]jÜÉKýq:q§.5î$z_§w5íoÓ‰;ñ8q§.5î$JÜIôÜߦwêoÜÉK÷ým:q§.5îÔ¥Ä<ôاwêÓwêRãN^zíÓ‰;u©q'/=öÇ©q§LãÎÿF¿ÄýÊõÂÆB;õ3iÜÉKýÅ:q§PãN¢÷ýÅ:q§.5îԥƼtߟ¬Æ8tâN:q'/=÷¿18q§>®q§.5îä¥×þd¸“è¶>Y'î$úXŸ¬WãN¢ûþd¸S—wêÒûm²NÜIô±?Y'îԥƼôÜŸ¬wêRâNº{²~<ôú³u_âN¢÷ýÉ:q'/}ìOÖ‰;uéõý÷Y¼ôZŸ¬wígûëtâN|Ó'îÄ¥wòÒkNÜItÛ_§wòÒÇþ:¸S—wòÒs}NÜ©C;yé_ü.ë‰;õq;u©q'/=÷×é唸“‡îûëÔ¸S¦q'Ñ÷ßdý=ö×éÄú4îԥƼôÚ_§wêãwòÒcNÜ©K‰;u¨q'=××éKÜùû¥/qç—~ˆ;ÿüòȲÜÄåÎA^î ârg—;ƒ¸Üy¡e¹3ˆËA\î ârç /wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;c¸ÜÄåÎA^î ârg–;c¸Ü9ÈËA\î ârç /wq¹3ˆËA\îäåÎ .wq¹3èC˃¼ÜÄåÎ .wòrg—;ƒ´ÜÃåÎ -ËEZî,Òrg—;‹´ÜY¤åÎ"-wq¹³Ë5Zî ârg‘–;‹´ÜY¤åÎ .wi¹³HËEZî ârg‘–;‹´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wa¹3†ËEZî,Òrç /wݰÜY¤ÛQ‘–;ƒ¸ÜY¤åÎ"-wq¹³èíÏïÿB¯"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³Ë5Zî,Òrg—;‹´ÜY¤åÎ .wÝö7JË_ÐïC? óU\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹s—;‹´ÜY¤åÎ"-wq¹³HËEXîŒárg‘–;‹û£ååÎ .wi¹³HËA\î,Òrg‘–;‹´ÜÄåÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-w}ì—;k´ÜY¤åÎ .wi¹³HËEZîäåÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY„åÎ.wi¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹´ÜÄåÎ"-wi¹s—;‹nø7%i¹³HËAZî¬Ñrg‘–;ƒ¸ÜYô¶¿Q^î,Òrg—;‹´ÜY¤åÎ"-wq¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³HËAZíO—;k´ÜÄåÎ"-wi¹3ˆËEZî,Òrg‘–;y¹³HËEZî,úØŸ(/wi¹³HËA\î,ÒrgÑc¢¼ÜÄåÎ",wÖh¹3HË5Zî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³HËEXî¬Ñrg—;‹´ÜY¤åÎ"-wq¹³HËEZî ârg‘–;‹´ÜY„åÎ1^î,Ârg–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Òrg–;knûû„åÎ -wq¹³HËEZî ârgÑÛþ8y¹³HËA\î,Ârg–;‹°ÜÃåÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY„åÎ-wârgÍm›¼ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹´ÜÄåÎ",wÖh¹³HËA\î,Òrg‘–;ƒ¸ÜY¤å΢Çþ8q¹3æï—;û•ë?„\î ârg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹°Ü9ÆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³Ë5Zî,Ârg —;‹´ÜY¤åÎ .wi¹³HËEZî ârg‘–;‹´ÜÄå΢Ûúdy¹³HËA\î,Òrg‘–;‹´ÜÄåÎ"-wa¹3†ËEû-wi¹s—;‹´ÜY¤åÎ .wi¹³HËEZî ârg‘–;‹°ÜÃå΢Ûþ:y¹³HËA\î,Òrg‘–;ƒ¸ÜY„åÎ-wa¹3†ËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³HËEZî,Òrg–;k´ÜY¤åÎ -ËE·¿Zîü|¶¸sãÎ -qç ǃwrÜù‰¶¸sãÎAŽ;9î¼ÐwrÜ9Èqç…–¸sãÎAŽ;9î¼ãÎ1Ž;9î¼ÐwrÜ9ˆqçÇZâÎAŽ;9î¼ÐwrÜ9Èqç ÇZâÎAŽ;9îä¸óBKÜ9Èqç ÇZâÎAŽ;=ô¿OŒqÜù‰¶¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgâÎƃw1î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î RÜ9ÆqgãÎ ÆZâÎ ÆAüqãÎAŽ;ƒw1îä¸3èMçĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒwÆ0î bÜ9ÈqgãΠƃwÝö7j‰;ƒþ.rÜĸ3ˆqç ÇAŒ;ƒw1î¼Ðw1î bÜĸsãÎ ÆAŠ;Ç8î bÜôØ­%îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎ ÆAŒ;ƒwbÜø3ˆqç ÇAŒ;ƒw1î¼Ðw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3HqçÇAŒ;ƒw1îä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸóBKÜĸ3ˆqgãÎAŒ;cw1îä¸3èm£–¸3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃwÆÜö'Êqg ãÎAŽ;ƒw1îä¸3ˆqgãÎ ÆZâÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒûµÄƒw)îŒaÜ9ˆqg ãÎ ÆAŒ;9î bÜĸsãÎ ÆAŠ;cwrÜĸ3ˆqgÐÇþ@-qgãΠƃw1î bܤ¸ó2Kܤ¸3†qç ÇAŒ;ƒw1îä¸3ˆqgãÎAŒ;cwýþËuŒ;9î bÜĸsãΠ·ýqZâΠƃw)îŒaܤ¸sŒãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŠ;cw^ÈqgÌm›–¸3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒwÆ0î bÜ9ÈqgãΠƃw1î bܤ¸s âÎ/è—Þ~Ë?óeŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgâÎË,qgãÎ ÆAŒ;9î bÜĸsãÎ Å1Œ;ƒwŽqÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒwÆ0î bÜ9ÈqgãÎ ÆAû“µÄAŒ;ƒwŽqÜ´ŸaÜĸóBKÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgâÎ1Ž;ƒwý‹ße]âÎAŽ;ƒw1îä¸3Hqg ãÎ Åcw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç Æ1Œ;ƒw~¢-î ºýMÜùŸ?ýçÿ{¾Ä?‚5îüi^tЉ;qéĺԸS—wþ~éKÜ)Ô¸ó÷ûwêRãN\:q'.¸S¨q'Љ;…w 5îj܉AãN:q§5îÄ¥w 5îÄÇ5îÔ¡Æ8tâN\:q§.5îÄ¥wâÒ‰;u©q§PãN|܉;qéĺԸS—wâÒ‰;qéÄB;NÜ)Ô¸S(q§LãÎß_âÎß/}‰;‰žökÜ©K;y)q'/%îԥƺ”¸“‡wêPãN]jÜI”¸“—¸S—wêRãN^JÜÉKÎ5î$ʆ‰w 5î$JÜ©AãN^JÜ)Ô¸“è¾¾Q_âN}ã;u©q'/%î䥉;u¨q§5îä¥Ä¸tâN¢Äø¸wòRâN]jÜ©K;‰w 5î$z›¿ó!º¯oÔ—¸S?‚ƺԸ“—wòÒÇþF¸S׸“—^ûuâN]JÜÉCý:q§.5îÔ¥ÆDÏý:q§.5îä¥ÇþF¸ó¿Ñqg¾ªq§N7î$zîÖ‰;‰ÞöGëļôúöhýpéĸtâN¢çþh¸S—wêRãN^z­Ö‰;u¨q'/=öGëĺԸS—w=÷GëĺԸ“è±?Z'îjÜIô¾?Z'îÔ q§.5îä¥ûþh¸S—w½ïÖ‰;yéc´wêPãNzíÖ‰;u©q'/%îä¥ýÑ:q'>îS—wêRãN¢ÇþF¸S¨q'ÑûþF¸S?‚ƺԸ“—ßÞ¨/½ö7êÄú¸Æ¼ô\ߨwêPãN^ºïoÔ‰;u©q§.5î$zìoÔ‰;u©q§.5îä¥×þF¸“è¶¿Q'î$úØß¨wêGи“—žûuâN\:q'/=ö7êÄú¸Ä:Ô¸“‡žûuâN]jÜÉK÷ý:q§PãN¢÷ý:q§¾ñƺԸ“辿Q'îjÜItÛߨwêGиS—wêRãN^z~{£~º”¸S‡w=Ö'êÄ:Ô¸S—wòÒs¢NÜ©K;‰îßž¨Ñk¢N܉oüļôüöDýxéc¢NÜItߟ¨w 5îÔ7Þ¸“—ûuâN]jÜ©K‰;y蹿P;õa;y豿P'îԥƺԸ“—wêRãN]jÜI4q'Ík NÜ©ï»q'/=÷êÄB;‰îûuâN]jÜ©K;yé±?P;qèÄ8Ô¸“æ¹?P'îԥƼôبwêRãN]jÜÉKÏýjÜIsÛß§‰;õM7îÔ™ÆDïûãtâN¡ÆúÆwòÒ}œNÜ©K;u)q'=¾=N?úø³=`'î$ºïÓ‰;u©q§.5îä¥Çþ8¸S—w½¯Ó‰;wÒÜö·éÄøœ¸S—w%î$JÜ)Ô¸SßxãN^ºïoÓ‰;u©q§.%îä¡Çþ8¸SŸÖ¸S—wòÒkœNÜ©K÷Ûþ8¸“èc}œNÜIôË?o¿Äý²ÄºÝ¸S?“ƼôØ_¬w 5î$zß_¬wêRãN]jÜÉK÷ýÉj܉C'îÄ¡wòÒsÿƒwêãwêRãN^zíOÖ‰;‰në“uâN¢õÉz5î$ºïOÖ‰;u©q§.5îä¥ÄDû“uâN]jÜÉKÏýÉ:q§.%îä¡û·'ëÇC¯?['ñ%î$zߟ¬wòÒÇþd¸S—^ߟõÇK¯õÉ:q'Ñ~汿N'îÄ7}âN\:q'/½ö×éÄD·ýu:q'/}ì¯Ó‰;u©q'/=××éÄ:Ô¸“—þÅﲞ¸S׸S—wòÒsNÜ©K‰;y辿N;ew}ÿMÖÑcNÜ©@ãN]jÜÉK¯ýu:q§>®q'/=ö×é唸S‡wòÐs}¾Ä¿_úwþp釸óñÏçnqç ÇZâÎAŽ;9îä¸ómqç ǃwrÜy¡%îä¸sãÎ -qç ǃwrÜy!ÇcwrÜy¡%îä¸sãÎ1Ž;/´ÄƒwrÜy¡%îä¸sãÎAŽ;/´ÄƒwrÜ9Èqç…–¸sãÎAŽ;/´ÄƒwbÜ9Æqç'ÚâÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŠ;cwrÜĸ3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3HqçÇAŒ;ƒw^h‰;ƒwñÄAŒ;9î bÜĸsãΠ7ýOãΠƃw1î bÜĸsãÎ ÆAŒ;9î RÜø3ˆqç ÇAŒ;ƒwrÜtÛߨ%î ú»¸s¾ÊqgãΠƃw1î bÜĸóBKÜĸ3ˆqgãÎAŽ;ƒw)îã¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqgãÎAŒ;cw1îä¸3ˆqgÐCÿCEãÎ -qgãΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwŽqÜĸ3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎ ÆAŒ;/´ÄAŒ;ƒw1îĸ3†qgãÎAŽ;ƒÞö7j‰;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î bÜ9ˆqgÌm¢wÆ0îä¸3ˆqgãÎAŽ;ƒw1î bÜy¡%î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒwÆ0îĸ3†qgãΠƃw1î bÜ9ÈqgãÎ Å1Œ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3è±?PŽ;/³ÄAŠ;cwrÜĸ3ˆqgãÎAŽ;ƒw1îĸ3†qgÐï¿\Á¸sãÎ ÆAŒ;9î zÛ§%î bÜ9ÈqgâÎÆAŠ;Ç8î bÜĸsãÎ ÆAŒ;ƒwrܤ¸3†qç…wÆÜö·i‰;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3Hqg ãΠƃw1î bÜ9ÈqgãÎ ÆAŠ;Ç8î ú˸3_ƸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw)î¼Ìw1î bÜĸsãÎ ÆAŒ;9î RÜóØŸ,Çcw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ Å1Œ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw)îã¸3h?ø3ˆqç…–¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ Åcw1î ú¿ËºÄƒw1î bÜ9ÈqgâÎÆAŠ;Ç8î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŒ;cw1îüD[Ütû›¸óŸàëÿ,wþ4 Ô¸ó§yÑA'îÄ¥wêRãN]jÜùû¥/q§PãÎß?îKÜ©K;qéĸtâN¡Æ@'îjÜ)Ô¸S¨q'~;qèÄ:Ô¸—NÜ)Ô¸׸S‡wâЉ;qéĺԸ—N܉K'îÔ¥ÆB;ñq'îÄ¥wêRãN]j܉K'îÄ¥w 5î:q§PãN¡Ä2;ÿ |‰;¿ô%î$zþÙ?®q§.5îä¥Ä¼”¸S—wêRâNJÜ©C;u©q'QâN~\âN]jÜ©K;y)q'/%îjÜI”? %îjÜI”¸S?‚Ƽ”¸S¨q'Ñ}}£¾ÄúÆwêRãN^JÜÉKwêPãNjÜÉK‰;qéÄD‰;ñq'îä¥ÄºÔ¸S—w%îjÜIô6çCt_ߨ/q§~;u©q'/%îä¥ý:q§>®q'/½ö7ê唸“‡ûuâN]jÜ©K;‰žûuâN]jÜÉKý:q§P[ÎÿF? ýª÷ýÑ:q§PãN¢·ýÑ:q'/½¾=Z?\:q'.¸“è¹?Z'îԥƺԸ“—^ë£uâNjÜÉKýÑ:q§.5îÔ¥ÆDÏýÑ:q§.5î$zìÖ‰;…w½ïÖ‰;õ#xüÏþh¸“—îû£uâN]jÜIô¾?Z'îä¥ýÑjÜ©C;yèµ?Z'îԥƼô˜ÿ¡‚—>öGëÄø¸wòRâN]jÜ©K;‰ûuâN¡ÆDïûuâNýwêRãN^z|{£~¼ôÚߨwêãwòÒs}£NÜ©C;y龿Q'îԥƺԸ“豿Q'îԥƺԸ“—^ûuâN¢ÛþF¸“èc£NÜ©AãN^zîoÔ‰;qéļôØß¨wêãwêPãNzîoÔ‰;u©q'/Ý÷7êÄB;‰Þ÷7êÄúÆwêRãN¢ûþF¸S¨q'Ñm£NÜ©AãN]jÜ©K;yéùíúéRâNjÜIôXŸ¨wêPãN]jÜÉKÏý‰:q§.5î$º{¢~D¯ý‰:q'¾ñwòÒóÛõã¥ý‰:q'Ñ}¢NÜ)Ô¸SßxãN^zìOÔ‰;u©q§.%îä¡çþB5îÔ‡5îä¡ÇþB¸S—wêRãN^JÜ©KÿÙ_¨wMÜIóÚ¨wêûnÜÉKÏý:q§PãN¢ûþ@¸S—wêRãN^zìTãN:q'5î¤yîÔ‰;u©q'/=öêĺԸS—wòÒs wÒÜö÷iâN}Ó;u¦q'Ñûþ8¸S¨q§¾ñƼtß§wêRãN]JÜÉCoÓ‡>þl؉;‰îûãtâN]jÜ©K;yé±?N'îÔ¥ÆDïëãtâN Æ4·ým:q'~'îÔ¥ÆD‰;‰žûÛtâN}ã;y龿M'îԥƺ”¸“‡ûãtâN}ZãN]jÜÉK¯ýq:q§.5îä¥Çþ85î”iÜIôË?o¿Äý²ÄºÝ¸S?“ƼôØ_¬w 5î$zß_¬wêRãN]jÜÉK÷ýÉj܉C'îÄ¡wòÒsÿƒwêãwêRãN^zíOÖ‰;‰në“uâN¢õÉz5î$ºïOÖ‰;u©q§.5îä¥Çþd¸S׸S—wòÒs²þù×'«q'Ý¿=Y?zýÙ:‰/q'Ñûþd¸“—>ö'ëĺôúþû¬?^z­OÖ‰;‰ö3ýu:q'¾éwâÒ‰;y鵿N'î$ºí¯Ó‰;yécNÜ©K;yé¹¾N'îԡƼô/~—õÄú¸ÆºÔ¸“—žûëtâN]JÜÉC÷ýujÜ)Ó¸“èûo²þˆûëtâNýwêRãN^zí¯Ó‰;õq;y鱿N'îÔ¥Ä:Ô¸“‡žëëô%îüýÒ—¸ó‡K?ÄŸÿ c‹;9î¼ÐwrÜ9Èqç ÇŸh‹;9îä¸sãÎ -qç ǃw^h‰;9îä¸sãÎ 9îã¸sãÎ -qç ǃwŽqÜy¡%îä¸sãÎ ýó!¶ÿ@mqç ǃw^h‰;9îä¸sãÎ -qç ǃw^h‰;9îĸsŒãÎO´ÅAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒwÆ0îä¸3ˆqgãΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgâÎ1Ž;ƒw1î¼Ðw1î ∃wrÜĸ3ˆqç ÇAoú;Ÿ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrܤ¸3†qgãÎAŽ;ƒw1îä¸3è¶¿QKÜĸsÐ_Æù*ÆAŒ;9î bÜĸ3ˆqç…–¸3ˆqgãΠƃw1î RÜ9ÆqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ãÎ ÆAŒ;ƒwrÜĸ3ˆqgãÎAŒ;cw1îä¸3ˆqgãÎ ÆZâÎ ÆAŒ;9î ºíoÔw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ Åcw1î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎ -qgãÎ ÆAŒ;1îŒaÜĸsãΠ·ýZâΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwbÜsÛŸ(Ç1Œ;9î bÜĸsãÎ ÆAŒ;ƒw^h‰;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎ Å1Œ;1îŒaÜĸ3ˆqç ÇAŒ;ƒwz0î bܤ¸3†qç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î RÜy™%î RÜøsãÎ ÆAŒ;ƒwrÜĸ3ˆqç Æ1Œ;ƒ~ÿåºƃw1î bÜ9ÈqgÐÛþ8-qgãÎAŽ;ƒwÆ0î RÜ9ÆqgãΠƃw1î bÜĸsãÎ Å1Œ;/ä¸3æ¶¿MKÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŠ;cw1îä¸3ˆqgãÎAŽ;ƒw1î RÜ9ÆqgÐ_Æù2ƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3Hqçe–¸3ˆqgãΠƃw1î bÜ9ÈqgâÎÆAŠ;Ç8î bÜĸsãΠÛþd-qgãÎAŽ;ƒw1îä¸3Hqg ãΠƃw1î bÜĸsãÎ ÆAŠ;Ç8î ÚÏ0î bÜy¡%î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3HqçÇAŒ;ƒþÅï².qç ÇAŒ;ƒwrܤ¸3†qgâÎ1Ž;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎÆAŒ;?ÑwÝþ*î|üóŸ¾/qçO£ A;štâN\:q§.5îԥƿ_úw 5îüýã¾ÄºÔ¸—N܉K'îjÜ tâN¡ÆB;…wâGи‡NÜ©C;qéÄB;ñq;u¨q'¸—NÜ©K;qéĸôhÜ©K;…wâãN܉K'îԥƺԸ—N܉K'îjÜ tâN¡ÆB‰;ewþþøwþ~éKÜIôü³\ãN]jÜÉK‰;y)q§.5îÔ¥Ä<”¸S‡wêRãN¢Äü¸ÄºÔ¸S—wòRâN^JÜ)Ô¸“(&JÜ)Ô¸“(q§~;y)q§PãN¢ûúF}‰;õ7îԥƼ”¸“—&îÔ¡Æ:Ô¸“—wâÒ‰;‰wâãNÜÉK‰;u©q§.5î$JÜ)Ô¸“èmþ·达Q_âNýwêRãN^JÜÉKûuâN}\ãN^zíoÔ‰;u)q'=ö7êĺԸS—w=÷7êĺԸ“—ûuâN¡Æÿ~Š;óUïû£uâN¡ÆDoû£uâN^z}{´~¸tâN\:q'Ñs´NÜ©K;u©q'/½ÖGëÄ:Ô¸“—û£uâN]jÜ©K;‰žû£uâN]jÜIôØ­w 5î$zß­wêGиS—·ýÑ:q'/½¾=Z?]jÜIô¾?Z'îä¥ýÑjÜ©C;yèµ?Z'îԥƼ”¸“—>öGëÄø¸wòRâN]jÜ©K;‰ûuâN¡ÆDïûuâNýwêRãN^z|{£~¼ôÚߨwêãwòÒs}£NÜ©C;y龿Q'îԥƺԸ“豿Q'îԥƺԸ“—^ûuâN¢ÛþF¸“èc£NÜ©AãN^zîoÔ‰;qéļôØß¨wêãwêPãNzîoÔ‰;u©q'/Ý÷7êÄB;‰Þ÷7êÄúÆwêRãN¢ûþF¸S¨q'Ñm£NÜ©AãN]jÜ©K;yéùíúéRâNjÜIôXŸ¨wêPãN]jÜÉKÏý‰:q§.5î$º{¢~D¯ý‰:q'¾ñwòÒóÛõã¥ý‰:q'Ñ}¢NÜ)Ô¸SßxãN^zìOÔ‰;u©q§.%îä¡çþB5îÔ‡5îä¡ÇþB¸S—wêRãN^JÜ©K;uéqÛ_¨Æ4¯ý:q§¾ïƼôܨw 5î$ºïÔ‰;u©q§.5îä¥Çþ@5îÄ¡wâPãNšçþ@¸S—wòÒc NÜ©K;u©q'/=÷ªq'ÍmŸ&îÔ7ݸSgw½ïÓ‰;…wêoÜÉK÷ýq:q§.5îÔ¥Ä<ôøö8ýxèãÏö€¸“è¾?N'îԥƺԸ“—ûãtâN]jÜIô¾>N'îjÜIsÛߦwâpâN]jÜI”¸“蹿M'îÔ7Þ¸“—îûÛtâN]jÜ©K‰;yè±?N'îÔ§5îԥƼôÚ§wêRãN^zìSãN™ÆD¿üóö[Ü™/KÜ©Û;õ3iÜÉKýÅ:q§PãN¢÷ýÅ:q§.5îԥƼtߟ¬Æ8tâN:q'/=÷¿18q§>®q§.5îä¥×þd¸“è¶>Y'î$úXŸ¬WãN¢ûþd¸S—wêRãN^zìOÖ‰;õq;u©q'/=÷'ë唸“‡îßž¬½þlÄ—¸“è}²NÜÉKû“uâN]z}ÿ}Ö/½Ö'ëÄDû™Çþ:¸ßô‰;qéļôÚ_§wÝö×éļô±¿N'îԥƼô\_§wêPãN^ú¿ËzâN}\ãN]jÜÉKÏýu:q§.%îä¡ûþ:5î”iÜIôý7YDýu:q§~;u©q'/½ö×éÄú¸Æ¼ôØ_§wêRâNjÜÉCÏõuúwþ~éKÜùÃ¥ÿŽ;ÿó„·Ç¶ÜÄåÎA^î ârg—;ƒ¸Üy¡e¹3ˆËA\î ârç /wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;c¸ÜÄåÎA^î ârg–;c¸Ü9ÈËA\î ârç /wq¹3ˆËA\îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ .wòrg—;ƒ´ÜÃåÎ -ËEZî,Òrg—;‹n˜)Òrg‘–;ƒ¸ÜY„åÎ-wq¹³HËEZî,Òrg—;‹´ÜY¤åÎ"-wq¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹°ÜÃåÎ"-wi¹s—;‹´ÜY¤ÛQ‘–;ƒ¸ÜY¤åÎ"-wq¹³èíÏïÿB¯"-wi¹3ˆËEZî,zà_èU¤åÎ .wi¹³HËA\î,Ârg–;‹´ÜÄåÎ"-wi¹3ˆËE·ýòrg‘–;ƒþn¹³_¥åÎ"-wq¹³HËEZî,Òrç /wi¹³HËEZî ârg‘–;‹°ÜÃåÎ"-wi¹³HËA\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Òrg—;‹´ÜY¤åÎ"-wq¹³HËEZî,Òrg–;k´ÜY¤åÎ .wi¹³HËEZîäåÎ"-wi¹3ˆËE·ýòrg‘–;ƒ¸ÜY¤åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY„åÎ.wi¹³HËEZî ârg‘–;‹ûååÎ .wi¹³HËA\î,Òrg‘–;‹´ÜÄåÎ"-wi¹s—;‹´ÜY¤åÎ"-wi¹³FËEZî ârgÑÛþFy¹³HËA\î,Òrg‘–;‹´ÜÄåÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-w=±ÜYsÛŸ(.wÖh¹3ˆËEZî,Òrg—;‹´ÜY¤åÎ"-wòrg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹´ÜÄåÎ",wÖh¹3HË5Zî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³HËEXî¬Ñrg—;‹´ÜY¤åÎ"-wq¹³HËEZî ârg‘–;‹´ÜY„åÎ1^î,Ârg–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Òrg–;k´ÜYôërB…–;ƒ¸ÜY¤åÎ"-wq¹³èmœ¼ÜY¤åÎ .wa¹³æ¡™",wÆp¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wa¹³F˃¸ÜYsÛß&/wi¹3ˆËEZî,Òrg—;‹´ÜY¤åÎ"-wq¹³Ë5Zî,Òrg—;‹´ÜY¤åÎ .wi¹³HËEXîŒárgÑß-wöË´ÜôÔrg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹°Ü9ÆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³Ë5Zî,Ârg —;‹´ÜY¤åÎ .wi¹³HËEZî ârg‘–;‹´ÜÄåÎ",wÖh¹³HËA\î,Òrg‘–;‹´ÜÄåÎ"-wa¹3†ËEû™Çþ:y¹s—;‹´ÜY¤åÎ .wi¹³HËEZî ârg‘–;‹°ÜÃåÎ"-wý‹ßeõrg—;‹´ÜY¤åÎ .wa¹³FËEXîŒárg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹´Ü¤åÎ-wi¹óBËrgÑío–;ÿóßý·5îä¸óBKÜ9Èqç ǃw~¢-îä¸sãÎAŽ;/´ÄƒwrÜy¡%îä¸sãÎAŽ;/ä¸sŒãÎAŽ;/´ÄƒwbÜ9Æqç…–¸sãÎAŽ;/´ÄƒwrÜ9Èqç…–¸sãÎAŽ;9î¼ÐwrÜ9Èqç…–¸sãÎAŒ;Ç8îüD[Üĸ3ˆqç ÇAŒ;ƒw1îä¸3Hqg ãÎAŽ;ƒw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw)îã¸3ˆqgãÎ -qgãÎ þ8ˆqç ÇAŒ;ƒwrÜô¦¿ó bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŠ;cw1îä¸3ˆqgãÎAOÆA·ýZâΠƃw~A¿·œ? ù*ƃw1î bÜĸóBKÜĸ3ˆqgãÎAŽ;ƒw)îã¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqgãÎAŒ;cw1îä¸3ˆqgãÎ ÆZâÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw)îã¸3ˆqgãΠƃw1î bÜĸsãÎ ÆAŒ;9î ºíoÔw1îä¸3ˆqgãÎ -qgãÎ ÆAŒ;1îŒaÜĸsãΠ·ýZâΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwz*íO”ãÎƃw1î bÜ9ÈqgãÎ ÆAŒ;/´ÄAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgâÎƃwÆ0î bÜĸsãÎ ÆAŒ;9î bܤ¸3†qç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î RÜy™%î RÜøsãΠÛþ@-qgãÎAŽ;ƒw1îĸ3†qgÐï¿\Á¸sãÎ ÆAŒ;9î zÛ§%î bÜ9ÈqgâÎÆAŠ;Ç8î bÜĸsãÎ ÆAŒ;ƒwrܤ¸3†qç…wÆÜö·i‰;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3Hqg ãΠƃw1î bÜ9ÈqgãÎ ÆAŠ;Ç8î ú˸3_ƸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw)î¼Ìw1î bÜĸsãÎ ÆAŒ;9î RÜø3HqçÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3Hqg ãΠƃw1î bÜĸsãÎ ÆAŠ;Ç8î ÚÏ0î bÜy¡%î bÜĸsãΠÛþ:-qgãÎAŽ;ƒw)îã¸3ˆqgпø]Ö%îä¸3ˆqgãÎAŽ;ƒwÆ0î RÜ9ÆqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwbÜø3ˆqç'ÚâΠÛ_ÅŸÿËÍwrÜy¡%îä¸sãÎAŽ;?ÑwrÜ9Èqç ÇZâÎAŽ;9î¼ÐwrÜ9Èqç ÇrÜ9Æqç ÇZâÎAŽ;1îã¸óBKÜ9Èqç ÇZâÎAŽ;9îä¸óBKÜ9Èqç ǃw^h‰;9îä¸óBKÜ9Èqç Æcw~¢-î bÜĸsãÎ ÆAŒ;ƒwrܤ¸3†qç ÇAŒ;ƒw1îä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãΠ›~9ˆqgâÎ1Ž;ƒw1î¼Ðw1î ∃wrÜĸ3ˆqç ÇAoú;Ÿ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrܤ¸3†qgãÎAŽ;ƒw1îä¸3è¶¿QKÜĸsãΠ¿‹;óUŒ;9î bÜĸ3ˆqç…–¸3ˆqgãΠƃw1î RÜ9ÆqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãΠƃwÆ0î bÜ9ÈqgãÎ ÆAŒ;/´ÄAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î RÜ9ÆqgãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜtÛߨ%î bÜ9ÈqgãÎ ÆZâÎ ÆAŒ;ƒwbÜø3ˆqç ÇAoûµÄAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îĸ3æ¶?QŽ;cwrÜĸ3ˆqç ÇAŒ;ƒw1î¼Ðw1î z~{¢~¼Ä¸sãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŠ;cwbÜø3ˆqgãÎAŽ;ƒw1îä¸3ˆqgâÎƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3Hqçe–¸3Hqg ãÎAŽ;ƒnûµÄAŒ;9î bÜĸsãÎÆA¿ÿr]ãÎAŽ;ƒw1îä¸3èmœ–¸3ˆqç ÇAŠ;cw)îã¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgâÎÆrÜsÛߦ%î bÜ9ÈqgãΠƃw1î bÜĸsãÎ Å1Œ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw)îã¸3è/ãÎ|ãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bܤ¸ó2KÜĸ3è¹ÿÁwrÜĸ3ˆqç ÇAŠ;cw)îã¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw)îŒaÜĸsãÎ ÆAŒ;ƒwrÜĸ3HqçÇAûÆAŒ;/´ÄAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw)îã¸3ˆqgпø]Ö%îä¸3ˆqgãÎAŽ;ƒwÆ0î RÜ9ÆqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwbÜø3ˆqç'ÚâΠÛßįÏÿÑüKÜùø§Küv:¨qgÐ×orЉ;qéĺԸS—wþ~éKÜ)Ô¸ó÷ûwêRãN\:q'.¸S¨q'Љ;…w 5îj܉AãN:q§5îÄ¥w 5îÄÇ5îÔ¡Æ8tâN\:q§.5îÄ¥wâÒ‰;u©q§PãN|܉;qéĺôLÜ©K;qéĸtâN¡Æ@'îjÜ)”¸S¦qçï?/qçï—¾ÄDùð>®q§.5îä¥Ä¼”¸S—wêRâNJÜ©C;u©q'QâN~\âN]jÜ©K;y)q'/%îjÜI”? %îjÜI”¸S?‚Ƽ”¸S¨q'Ñ}}£¾ÄúÆwêRãN^JÜÉKwêPãNjÜÉK‰;qéÄD‰;ñq'îä¥ÄºÔ¸S—w%îjÜIô6çCt_ߨ/q§~;u©q'/%îä¥ý:q§>®q'/½ö7ê唸“‡ûuâN]jÜ©K;‰žûuâN]jÜÉKý:q§PãN¢÷_ߨâÎ~Õs´NÜIô¶?Z'îä¥×·Gë‡K'îÄ¥w=÷GëĺԸS—wòÒk}´NÜ©C;yé±?Z'îԥƺԸ“è¹?Z'îÔ¥ÆDýÑ:q§PãN¢÷ýÑ:q§~;u©q'/Ý÷GëĺԸ“è}´NÜÉKû£Õ¸S‡wòÐk´NÜ©K;y)q'/}ìÖ‰;ñq'îä¥ÄºÔ¸S—w=ö7êÄB;‰Þ÷7êÄú4îԥƼôøöFýx鵿Q'îÔÇ5îä¥çúF¸S‡wòÒ}£NÜ©K;u©q'Ñc£NÜ©K;u©q'/½ö7êÄD·ý:q'ÑÇþF¸S?‚ƼôÜߨwâÒ‰;y鱿Q'îÔÇ%îÔ¡Æ<ôÜߨwêRãN^ºïoÔ‰;…w½ïoÔ‰;õ7îÔ¥ÆD÷ý:q§PãN¢ÛþF¸S?‚ƺԸS—wòÒóÛõÓ¥Ä:Ô¸“è±>Q'îԡƺԸ“—žûuâN]jÜItÿöDýˆ^ûuâN|ã'îä¥ç·'êÇKûuâN¢ûþD¸S¨q§¾ñƼôØŸ¨wêRãN]JÜÉCÏý…jÜ©kÜÉCý…:q§.5îԥƼ”¸S—wêRãN¢‰;i^ûuâN}ß;yé¹?P'îjÜItߨwêRãN]jÜÉKýj܉C'îÄ¡Æ4Ïý:q§.5îä¥Çþ@¸S—wêRãN^zîTãNšÛþ>MÜ©oºq§Î4î$zß§w 5îÔ7Þ¸“—îûãtâN]jÜ©K‰;yèñíqúñÐÇŸí;q'Ñ}œNÜ©K¯ÿÙ§wòÒcœNÜ©K;‰Þ×ÇéÄ@;inûÛtâNüNÜ©K;‰w=÷·éÄúÆwòÒ}›NÜ©K;u)q'=öÇéÄú´ÆºÔ¸“—^ûãtâN]jÜÉKýqjÜ)Ó¸“è—Þ~‰;ûe‰;u»q§~&;y鱿X'îjÜIô¾¿X'îԥƺԸ“—îû“Õ¸‡N܉C'îä¥çþ7'îÔÇ5îԥƼôÚŸ¬wÝÖ'ëÄDë“õjÜItߟ¬wêRãN]jÜÉKýÉ:q§>®q§.5îä¥çþd¸S—wòÐýÛ“õã¡×Ÿ­“øw½ïOÖ‰;yéc²NÜ©K¯ï¿Ïúã¥×úd¸“h?óØ_§wâ›>q'.¸“—^ûëtâN¢Ûþ:¸“—>ö×éĺԸ“—žëëtâNjÜÉKÿâwYOÜ©kÜ©K;y鹿N'îԥĮq'/½÷7ê唸“‡žûuâN]jÜ©K;‰^ûuâN]jÜÉKÏý:q§PãN¢ûþF¸óÑOqç|Õçÿ³?Z'îÔϤq'/½¿=Z?\:q'.¸“èµ?Z'îԥƺԸ“—Þë£uâNjÜÉKÏýÑ:q§.5îÔ¥ÆD¯ýÑ:q§.5î$zîÖ‰;…wÝ÷GëÄú4îԥƼôØ­wêRãN¢ûþh¸“—>÷G«q§5îä¡÷þh¸S—>wòRâN^úÜ­wâãNÜÉK‰;u©q§.5î$zî°:q§PãN¢ûþF¸S?‚ƺԸ“—žßÞ¨/½÷7êÄú¸Æ¼ôZߨwêPãN^zìoÔ‰;u©q§.5î$zîoÔ‰;u©q§.5îä¥÷þF¸“è¶¿Q'î$úÜߨwêGи“—^ûuâN\:q'/=÷7êÄú¸Ä:Ô¸“‡^ûuâN]jÜÉKý:q§PãN¢ûþF¸SßxãN]jÜIôØß¨w 5î$ºíoÔ‰;õ#hÜ©K;u©q'/½¾½Q?]JÜ©C;‰žëuâNjÜ©K;yéµ?Q'îÔ¥ÏÛþD¸“è½?Q'îÄ7~âN^z}{¢~¼ô¹?Q'î$zìOÔ‰;…wêoÜÉKÏý‰:q§.5îÔ¥Ä<ôÚ_¨Æú°Æ<ôÜ_¨wêRãN]jÜÉK‰;u©q§.5î$š¸“æ½?P'îÔ÷ݸ“—^ûuâN¡ÆDý:q§.5îÔ¥þsýŸJãN^ú\¨wâPãNš×þ@¸S—wòÒs NÜ©K;u©q'/½öªq'ÍmŸ&îÔ7ݸSgwÝ÷ÇéÄB;õ7îä¥Çþ8¸S—wêRâNz~{œ~<ôù×ö€¸“è±?N'îԥƺԸ“—žûãtâN]jÜIt_§w5íoÓ‰;ñ8q§.5î$JÜIôÚߦwêoÜÉKým:q§.5îÔ¥Ä<ôܧwêÓwêRãN^zïÓ‰;u©q'/=÷Ç©q§LãÎÿE¿ÅùÊõÂÆB;õ3iÜÉKÏýÅ:q§PãN¢ûþb¸S—wêÒgâN^zìOVãN:q'¸“—^ûßœ¸S׸S—wòÒ{²NÜIt[Ÿ¬w}®OÖ»q'Ñc²NÜ©K;u©q'/=÷'ëÄú¸ÆºÔ¸“—^û“uâN]JÜÉCoOÖ‡ÞmÄ—¸“è¾?Y'îä¥ÏýÉ:q§.½¿ÿ>ë—Þë“uâN¢ýÌsN܉oúĸtâN^zï¯Ó‰;‰nûëtâN^úÜ_§wêRãN^z­¯Ó‰;u¨q'/ý‹ße=q§>®q§.5îä¥×þ:¸S—wòÐcwÊ4î$úþ›¬?¢ÄDŸûëtâN]jÜÉKïýu:q§>®q'/=÷×é唸S‡wòÐk}¾Ä¿_úwþp釸óÿþ×á¹.wòrç…>½Ü9È˃¼Ü9ÈËжÜ9È˃¼Ü9ÈËZ–;y¹s—;/´,wòrç /wòrç…¼Ü9ÆËƒ¼Üy¡e¹s—;q¹sŒ—;/´,wòrç /w^hYîäåÎA^îäåÎ -˃¼Ü9È˃¼Üy¡e¹s—;y¹óBËrç /wârç/wþAÛrg—;ƒ¸Ü9ÈËA\î ârg—;y¹3HË1\îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA^î ºi-ˆËA\îäåÎ .wq¹s—;ƒ¸ÜÄåÎ -wŽñrg—;ƒ¸Üy¡e¹3ˆËAü·q¹s—;ƒ¸ÜÄåÎA^î úø ÿB¯ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Ü9ÈËAZîŒárg—;y¹3ˆËA\îäåΠÛþF-ËA\îäåÎ .wý·åÎùªO.wq¹3ˆËA\î¼Ð²ÜÄåÎ .wq¹s—;ƒ¸Ü¤åÎ1^î ârg—;ƒ¸Ü9ÈËA\î ârç /wq¹3ˆËA\îäåÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA\îŒárg—;y¹3ˆËA\î ârç…–åÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Ü9ÈËA\î ârg—;y¹3ˆËAZîãåÎ .wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA^î ârg—;ƒ¸Ü9ÈËA\î ârç…–åÎ .wq¹3ˆËƒ¸ÜÃåÎ .wòrgÐÇþF-ËA\îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA^î ârg—;q¹3æ¶?Q^îŒárç /wq¹3èµ?QËrg—;ƒ¸ÜÄåÎ -ËA\î ârg—;y¹3ˆËA\îäåÎ .wq¹3ˆËƒ¼Ü¤åÎ.wârg —;ƒ¸ÜÄåÎA^î ârg—;y¹3ˆËAZîŒárç /wq¹3ˆËA\îäåÎ .wq¹s—;ƒnûµ,wi¹ó2Ërg–;c¸Ü9ÈËA\î ârg—;y¹3ˆËA\îÄåÎ.wý¾œÁåÎA^î ârg—;y¹3ècœ–åÎ .wòrg–;c¸Ü¤åÎ1^î ârg—;y¹3ˆËA\î ârç /wi¹3†ËòrgÌm›–åÎ .wòrg—;ƒ^ûÛ´,wq¹3ˆËA\îäåÎ -wÆp¹3ˆËƒ¼ÜÄåÎ .wòrg—;ƒ¸Ü¤åÎ1ÿ?–;ó•ë?„^îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ .wòrg—;ƒ¸Ü¤åÎË,ËA\î ârg—;y¹3ˆËA\îäåΠÛúd-ËAZîãåÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Ü9ÈËAZîŒárg—;y¹3ˆËA\î ârç /wq¹3HËc¼Ü´Ÿárg—;/´,wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ¸Ü¤åÎ1^î ârgпø]Öe¹s—;ƒ¸ÜôÚ_§e¹3HË1\î Òrç/wq¹3ˆËA\îäåÎ .wq¹s—;ƒ¸ÜÄåÎ .wârg —;ƒ¸ÜùmËA·ÿ°ÜùùÿüùÇEŠ;ƒw)î,RÜY¤¸sãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒwÖ(î,RÜĸ³HqgâÎÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEˆ;kwrÜyâ΃w)î<qçAˆ;BÜY¤¸ó ßãÎcw)î<qçAˆ;BÜY¤¸ó Ä!î<qg‘â΃w„¸³HqçAˆ;BÜyâÎ"Å!î<qg‘â΃w„¸ó ßãÎÅ!î<qgã΃w„?„¸³HqçAˆ;BÜY¤¸ó ßÿÎç Ä!î,RÜyâ΃w„¸³HqçAˆ;BÜY¤¸ó ßãÎcw„¸³HqçAˆ;BÜY¤¸ó ÛþF1î<qg‘â΃wôÚß(µœÿ[€ž¯BÜyâ΃w1î<qçAˆ;BÜY¤¸ó ÄýwÖ(î<qçAˆ;BÜY¤¸ó Ä!î,RÜyâ΃w„¸³HqçAˆ;BÜY¤¸ó Ä!î<qg‘â΃w„¸ó ÄEˆ;AÜyâÎ"Å!î<qçAˆ;ƒw„¸ó ÄEŠ;BÜyâ΃w)î<qçAˆ;‹w„¸ó Ä!î,RÜyâ΃~;kw„¸ó Ä!î,RÜyâ΃w„¸³HqçAˆ;BÜY¤¸ó Ä!î<qg‘â΃w„¸3ˆqçAˆ;BÜyâÎ"ÄÇ î<qg‘â΃>ö7ŠqçAˆ;‹w„¸ó Ä!î,RÜyâ΃w)î<qçAˆ;BÜY¤¸ó Ä!î,BÜyÌm¢wƒ¸³HqçAˆ;zíOã΃w„¸ó ÄAŒ;BÜyâ΃w)î<qçAˆ;‹w„¸ó Ä!î,RÜyÐïqç1ˆ;‹wƒ¸ó Ä!î,RÜyâ΃w)î<qçA¿ÇÇ î,RÜyâ΃w„¸³HqçAˆ;BÜY¤¸ó Ä!î<è÷¸3†qçA¿ÇÇ î,RÜyâ΃w„¸³HqçAˆ;BÜY„¸óÄýöËuG î,RÜyâ΃w)î<ècœw„¸³HqçA¿ÇÇ î<è÷¸³FqçAˆ;BÜY¤¸ó Ä!î<qg‘â΃~;Aܤ¸ó˜Ûþ61î<qg‘â΃w„¸³HqçAˆ;BÜyâÎ"Åýwƒ¸ó ÄEŠ;BÜyâÎ"Å!î<qçA¿Ç5ÿ9î<_¹þC¨¸³HqçAˆ;BÜyâÎ"Å!î<qg‘â΃w„¸ó ßãÎÆ!î<qçAˆ;‹w„¸ó ÄEŠ;ú=î<qçA¿Ç5Š;BÜyâÎ"Å!î<qçAˆ;‹w„¸ó ÄEŠ;ú=î<qçAˆ;‹w„¸ó Ä!î,RÜyâ΃~;kw´ŸAÜyâÎ Æ!î<qg‘â΃w„¸ó ÄEŠ;BÜyÐïqgâ΃wô/~—•qg‘â΃w„¸³HqçA¿ÇÇ î<è÷¸³FqçAˆ;BÜyâÎ"Å!î<qg‘â΃w„¸ó ÄEˆ;AÜyâÎAŽ;ºý§¸óŸ¿ªÙÚÎË8íüc–²ó2;/ã®ó2Î:ÿ1[ÕyG—qÓy'ÌRt^ÆAçeÜsþ1KÎyל—qÌy·œŒS΋¸ä¼ŒCÎ?fé8/ãŒó2¬8/âˆóYÎË8Ἄ Î?f 8/ã~ó2Î7/ãzóYâÍ˸ݼŒÓÍ˸Üüc–pó2î6/ãlóYªÍË8Ú¼ ›Í‹8ÙüÇlÅæ›cØk^ƹæÖšckŽa«y§šcTja¨ywšc˜iŽa¥9†‘æeÜhŽa¢9†…æš—qŸ9†yæÖ™—qœ9†m榙cXf^Æaæv™c˜e^ÆUæF™cØdŽQ’y™cdŽaùÇ,9æÖ˜cøØ1l1/ãs KÌ1 1/ãṡþvf +Ì1Œ0/ãs Ì1,0Ç0À¼ŒûË1Ì/ǰ¾¼ŒãË1j/‡0½Ãòò2/ǰ»Ãìò2®.ÇÜÖWgi.Ç0¹¼Œ‹Ë1 .ǰ·¼ÌÌ-ç‹X[Žal9†­å³¤–cXZŽah9†åeœYŽae9F‘åEÜXŽab9†…å–—q_9†yåÖ•—q\9†m妕cXV^Æaåv•c˜U^ÆUåF•cØTŽaRy•cTŽaO9†9åeXSaL9†-åeœRŽaI9†!åv”Ì’QŽaE9†åeÜPŽaB9†å”—q?9†ùäÖ“—q<9†í䦓cXN^Æáäv“c”M^ÄÕäF“cØLŽa2y“cLŽa/9†¹äe\KŽa,9†­äeœJŽa)9†¡äv’—q&9†•äF’ÌÒHŽa"9†…ä’—a9„yäÖ‘—q9æc}u–4r ËÈË8Œs__%‹Ã*ò2Ž"ǰ‰Ã$ò2."Ç0ˆÃr sÈ˸†Ãr [ÈË0…r[‡CØA^ÆäVcA^Æ ä&cX@ŽaùÇ,ýãæcX?Žaüx·c˜>Žaùx‡cØ=Žaö8†Õãe=ŽQó8„ÉãeX<að8†½ã掗qí8†±ã¶Ž—qê8†¥ã…ŽCØ9^Æ™ãVŽc9Žaãx'ŽcX8Žaàx÷c˜7ŽaÝ8Fqã²´c”6aÙx‡cØ5ŽaÖ8†Uãe5ŽaÓ8†IãeX4aÐ8æ÷ß'Àœñ2®Ç0fÖñ2NÇ|¬ÏÍ2ŽaÇxgŒcîÛs³DŒcÔ0^Ä ãŒc0^Æýâæ‹cX/Ža¼x·‹c”.a¹øÇ8\r[_›%[Ãjñ2ŽǰYÃdñ2.Ç0XÃ^q sÅ˸V£Xq[Å1L/ãRq CÅ1ì/ãLq +Å1ŒǨQ¼ÈÿDq¾pûgÎâeÜ'Žaž8†uâƉ—q›8†iâ–‰—q˜8†]âf‰cT%þ!K”8†Mâ&‰cX$^ÆAâöˆc˜#^Æ5âňCØ"ŽQŠx—ˆc"Ža‡xgˆcX!Ža„8† âeœ Ža8†âeÜŽQ~8„õáƇ—q{8†éá–‡c^ÆÝáf‡cT^ÄÑá˜õ“Ã1,ÿ˜%8ÃÞp sÃ˸6ÃØp [Ã1L /ãÒp CÃ1ê /âÌp +Ã1ûïh.áeœŽaa8†áeÜŽQ^8„uáÅ…q[8†iá–…c^Æ]áf…cX^ÆQá6…c˜ŽaQx…CØŽaNøÙjÂ1·ÿ¾þùݱ/5áóŸ"îûåAÍ ƒþ?ßâ…NOˆK'(Ô¥…ºÔ¤ð÷K_šB¡{¢Âß?îKU¨KÍ qét…¸tÂB¡–…@'-j[(Ô¸P¨u!~Í qèô…:ÔÀ—Na(ÔÄׯP‡âЩ qéd†ºÔΗNhˆK§4Ô¥¦†Bm ñq'6Ä¥SêRsC]joˆK'8Ä¥S 59:Í¡P£C¡T‡2Íÿ |é¿ô%<$ÊŸhõqMu©í!/%>ä¥Ô‡ºÔüP—ÒòPDj¨KM‰Ò òã!êR+D]j†ÈKéy)!¢PKD¢ü—(-¢PcD¢Ôˆú4Gä¥ôˆB ‰ëõ%IÔ7Þ&Q—%òRªD^š,Q‡Ú%êPÃD^J™ˆK'M$J›ˆ;q"/¥Nԥ扺Ô>‘(¢P E¢ùÛ¢ÇúF}‰õ#h¥¨KÍy)"/}îoÔ)õqMy齿Q'VÔ¥ÔŠ<ôÜߨÓ+êRƒE]j±HôÚߨÓ,êR£E^zîoÔÉ…Ú-Ý÷7ꔋBMÿý”.æ«>öGëÄ‹üü÷·Gë‡K'_Ä¥Ó/½öG댺ԄQ—Ú0òÒ{}´NŨCÍyé¹?Z'dÔ¥–ŒºÔ”‘èµ?Z'fÔ¥ÖŒDÏýÑ:=£PƒF¢ûþh¤Q?‚6ºÔ¨‘—û£u²F]j×Htß­S6òÒçþhµmÔ¡Æ<ôÞ­“7êRûF^JàÈKŸû£uG|Üiy)‘£.µrÔ¥fŽDÏýÑ:¡£PKG¢ûþFÖQ?‚ÆŽºÔÚ‘—žßÞ¨/½÷7êú¸¼ôZߨÓ<êP£G^zìoÔÉu©Ý£.5|$zîoÔIu©í£.5~ä¥÷þFü‘è¶¿Q'€$úÜߨ“@êGÐ’—^ûu*H\:$/=÷7ê„ú¸”:Ô’‡^ûubH]j ÉKý:=¤PƒH¢ûþF$Rßx›H]jIôØß¨“E µ‹$ºíoÔ)#õ#h©Km#u©q$/½¾½Q?]J©Cí#‰žëu Ij"©Km$yéµ?Q§’Ô¥f’DoOÔè½?Q§”Ä7~RI^z}{¢~¼ô¹?Q§–$zìOÔé%…Lêo1ÉKÏý‰:ͤ.5šÔ¥T“<ôÚ_¨v“ú°†“<ôÜ_¨“NêRÛI]j<ÉK¯ùÍ.]j>©Kí'‰& ¤yïÔI(õ}·¡ä¥×þ@ŠR¨%Ñc NH©K-)u©)%/=÷ª1%š‡šSÒ¼öꕺԢ’—žûušJ]jT©K­*yéµ?Pí*inûû4e¥¾é¦•:Ó¶’è¾?N§®j^©o¼}%/=öÇé–ºÔÄR—ÒXòÐóÛãôã¡Ï¿¶ìd–Dýq:¡¥.µ´Ô¥¦–¼ôܧ[êRkK¢ûú8Þ¨Á%Ím›Nr‰Ài.u©Ñ%QªK¢×þ6îRßxÃK^zìoÓI/u©í¥.%¾ä¡çþ8üRŸÖþR—`òÒ{œN‚©Km0yé¹?N­0ešaþ/ú-ÃÌW®ÿ6Äj‰©ŸISL^zî/Ö‰1…ZcÝ÷ëô˜ºÔ S—ZdòÒc²ÚdâЉ2qèT™¼ôÚÿÆàt™ú¸†™ºÔ2“—Þû“uÚL¢Ûúd:“ès}²Þí3‰û“u M]j¢©Km4yé¹?Y§ÒÔÇ5ÓÔ¥vš¼ôÚŸ¬SjêRRMz|{²~<ôþkë$¾ÔšD÷ýÉ:½&/}îOÖ)6uéýý÷Y¼ô^Ÿ¬mígžûëtºM|Ó'ÜÄ¥SnòÒ{N»ItÛ_§SoòÒçþ:~S—pòÒk}N©Cm8yé_ü.ë©8õqÍ8u©'/½ö×锜º””“‡ûëÔ˜S¦5'Ñ÷ßdý=÷×éú´èÔ¥&¼ôÞ_§uêãZuòÒsNשK ;u¨e'½Ö×éKÛùû¥/qç—þ7îüçÿÜÝ·©È nEòXd×"ƒ8Ä½È -ƒ‘Aw-Fq22ˆ›‘ƒ<ÄÕÈ ÎFònd‡#ƒ¸ÄéÈAÜŽŒáxd×#y>2ˆû‘AŒá‚ä OHqC2è¥ÉA^‘ âŒdw$ƒ8$9ÈK’Aœ’ â–dÇ$yM2ˆs’AÜ“äAÉ .JiR2†›’ZF%‹´*Y¤YÉ îJiX²HË’Eš– â¶dÆ%k´.ÄyÉ"íKi`²H “Aœ˜,ÒÆd‘F&‹´2Ä™É"íLih2ˆK“Ešš,ÒÖd‘Æ&ƒ¸6Y¤¹É"íMqp²H‹“Ešœ,Âæd G'‹´:Y¤ÙÉAÞ,Òðd‘þ­FEšž âöd‘Æ'‹´>ÄùÉ¢¿~ÿWui€²H ”Aœ ,Òe‘F(‹´BÄÊ"íPiˆ2ˆK”E˜¢¬Ñe‘Æ(ƒ¸FY¤9Ê"íQq²è¶¿Qž¤,Ò&eG)‹´JY¤YÊ ÿ¶KÙ¯Ò0e‘–)‹4M9ÈÛ”E÷ýÑò:e‘æ)ƒ¸OY¤Ê",TÆp¢²H•E©,ÒJeg*‹´SY¤¡Ê .Uiª²H[•E« âZe‘æ*‹^û£åÁÊ"-Vi²²H›•A­,Òje‘f+‹´[¤áÊ-Wiº2ˆÛ•E¯,Òze‘æ+y¿²H–EZ° ú[–EÚ°,Òˆe‘V,ƒ8cY¤Ë" YqɲHS–EÚ²,Ò˜e×,‹4gY„=ËZiѲH“–EÚ´ â¨e‘V-‹4kY¤]Ë [iÙ²HÓ–Aܶ,Ò¸e‘Ö-‹4oÄ}Ë" \iár'.‹´qY¤‘Ë"­\iæ²F;—Eº âÒeÑÇþFyë²Hc—A\»,ºïo”÷.‹4xÄÅË"M^ió2ˆ£—EZ½,Òìe‘v/ƒ8|Y¤åË"M_iû²æ¶?Q\¿¬Ñüe÷/‹4€Y¤Ì N`i³H#˜EZÁäÌ"í`i³HK˜AœÂ,Òf‘Æ0ƒ¸†Y¤9Ì"íai3ˆ‹˜E˜Ä¬Ñ&fF1k´ŠY¤YÌ"íbq³H˘E/ükûƒ¸Y¤qÌ"¬cÖh3ˆû˜EÈ,ÒBf‘&2ƒ¸‘Y¤‘Ì"­dq&³H;™EÊ,ÂRæOea+³Fc™Ak-³Hs™EÚË,Ò`f3‹4™Y¤ÍÌ fÖh5³è×Ù„ ífq8³HË™EšÎ âvfÑÇþ8y=³Hó™AÜÏ,º¯“4‹0¡à Í"hiE3ˆ3šEÚÑ,Òf‘–4ƒ8¥Y„-ÍiâšfÍm›¼§Y¤AÍ .jiR³H›šAÕ,Òªf‘f5‹´«ÄaÍ",kÖhZ³HÛšA×,Òºf‘æ5ƒ¸¯Y¤Í"-lab3æ¿olö+×¹²Ä™Í"ílih³HK›AœÚ,ÒÖfÑk±¼¶Y¤¹Í"ímapsŒ7‹4¹Y¤ÍÍ"nqu³H³›EÚÝ âðf–7k4½Y„íÍŽoi}³Hó›AÜß,Òg‘8‹4ÁÄ Î"pi…3ˆ3œEØá¬Ñg‘–8ƒ8ÅY¤-Î"qi3ˆsœEÚã, g 9‹ö3Úä,Ò(ç ¯ri–³H»œAÿüçöO€—9‹4ÍY¤mÎ Žsi³óœ1Üç,Ò@gÑ¿ø]VOtq£³H#EZé âLgv:k4ÔY„¥ÎNui«³HcEZë â\g‘ö:‹4ØÄÅÎ"Mvi³³H£AZí¬Ñlg‘v;/´ wÝþËrçßÿtSkÜ9Èqç…–¸sãÎAŽ;9îüƒ¶¸sãÎAŽ;9î¼ÐwrÜ9Èqç…–¸sãÎAŽ;9î¼ãÎ1Ž;9î¼ÐwrÜ9ˆqçÇZâÎAŽ;9î¼ÐwrÜ9Èqç ÇZâÎAŽ;9îä¸óBKÜ9Èqç ÇZâÎAŽ;1îã¸óÚâÎ ÆAŒ;ý͸3ˆqgãΠƃw)îŒaÜ9ÈqgãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãÎ Åcw1î bÜy¡%î bÜÄ?1îä¸3ˆqgãÎAŽ;ƒ>ôw>AŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3Hqg ãΠƃw1î bÜ9ÈqgÐm£–¸3ˆqç ÇAŒ;ƒwBÜùýÞrþT€æ«w1î¼Ðw1î bÜĸsãÎ ÆAŠ;Ç8î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃwÝ÷Gk‰;ƒwbÜø3ˆqç ÇAŒ;ƒw1î¼Ðw1î bÜ9èoÆAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ Åcw1î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎ -qgãÎ ÆAŒ;1îŒaÜĸsãΠýZâΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwbÜsÛŸ(Ç1Œ;9î bÜĸsãÎ ÆAŒ;ƒw^h‰;ƒîûµÄAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrܤ¸3†qç Æ1Œ;ƒw1îä¸3ˆqgãÎAŽ;ƒw)îŒaÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒw^f‰;ƒwÆ0îô7ãÎ ÆAŒ;ƒwrÜĸ3ˆqç Æ1Œ;ƒ~ÿåºƃw1î bÜ9ÈqgÐÇþ8-qgãÎAŽ;ƒwÆ0î RÜ9ÆqgãΠƃw1î bÜĸsãÎ Å1Œ;/ä¸3æ¶¿MKÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAwü.r ãΠƃw1î bÜ9ÈqgãÎ ÆA¿Æ¿u›ó…(>¿ õBǃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3Hqçe–¸3è®|&ˆqgãÎAŽ;ƒw1îä¸3Hqg ãÎ Åcw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ Å1Œ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw)îã¸3h?ø3ˆqç…–¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ Åcw1î ú¿ËºÄƒw1î bÜ9ÈqgâÎÆAŠ;Ç8î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŒ;cw1îüƒ¶¸3èöŸâÎ?·Åƒw^h‰;9îä¸sãÎ?h‹;9îä¸sãÎ -qç ǃw^h‰;9îä¸sãÎ 9îã¸sãÎ -qç ǃwŽqÜy¡%îä¸sãÎ -qç ǃwrÜy¡%îôÏÿiÛ¾ñ%îä¸óBKÜ9Èqç ÇZâÎAŽ;1îã¸óÚâÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŠ;cwrÜĸ3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3HqçÇAŒ;ƒw^h‰;ƒwñÄAŒ;9î bÜĸsãΠýOãΠƃw1î bÜĸsãÎ ÆAŒ;9î RÜø3ˆqç ÇAŒ;ƒwrÜtÛߨ%î bÜ9ÈqgãΠƃwý·¸3_Ÿ3ˆqç…–¸3ˆqgãΠƃw1î RÜ9ÆqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3è¾?ZKÜĸsãÎÆAŒ;9î bÜĸ3ˆqç…–¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎ ÆAŠ;Ç8î bÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠ×þF-qgãÎ ÆAŒ;1îŒaÜĸsãΠýZâΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwbÜsÛŸ(Ç1Œ;9î bÜĸsãÎ ÆAŒ;ƒw^h‰;ƒîûµÄAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrܤ¸3†qç Æ1Œ;ƒw1îä¸3ˆqgãÎAŽ;ƒw)îŒaÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒw^f‰;ƒwÆ0îä¸3ˆqgãΠƃw1î zí”ãÎÆA¿ÿr]ãÎAŽ;ƒw1îä¸3ècœ–¸3ˆqç ÇAŠ;cw)îã¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgâÎÆrÜsÛߦ%î bÜ9ÈqgãΠƃw1î bÜĸsãÎ Å1Œ;ƒwrÜĸ3ˆqç ÇAŒ;ƒwýç¸s¾ÐqgÐú¡ãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bܤ¸ó2KÜĸ3ˆqgãÎAŽ;ƒw1îä¸3Hqg ãÎ Åcw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ Å1Œ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw)îã¸3h?ø3ˆqç…–¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ Åcw1î ú¿ËºÄƒw1î bÜ9ÈqgâÎÆAŠ;Ç8î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŒ;cw1îüƒ¶¸3èö_âÎþ ¯qçóŸ.ñÛé ÆA_¿ÉA'îÄ¥wêRãN]jÜùû¥/q§PãÎß?îKÜ©K;qéĸtâN¡Æ@'îjÜ)Ô¸S¨q'~;qèÄ:Ô¸—NÜ)Ô¸׸S‡wâЉ;qéĺԸ—N܉K'îÔ¥ÆB;ñq'îÄ¥wêRãN]j܉K'îÄ¥w 5î:q§PãN¡Ä2;ÿ |‰;¿ô%î$ʆõq;u©q'/%îä¥ÄºÔ¸S—wòPâNjÜ©K;‰wòãwêRãN]jÜÉK‰;y)q§PãN¢üa˜(q§PãN¢Äú4îä¥ÄB;‰ëõ%îÔ7Þ¸S—wòRâN^š¸S‡wêPãN^zÍEK'î$J܉;q'/%îԥƺԸ“(q§PãN¢ù;¢ÇúF}‰;õ#hÜ©K;y)q'/}îoÔ‰;õq;y齿Q'îÔ¥Ä<ôÜߨwêRãN]jÜIôÚߨwêRãN^zîoÔ‰;…wÝ÷7êÄB;‰>~}£~ˆ;ûUýÑ:q'~º'îÄ¥w½öGëĺԸS—wòÒ{}´NÜ©C;yé¹?Z'îԥƺԸ“èµ?Z'îÔ¥ÆDÏýÑ:q§PãN¢ûþh¸S?‚ƺԸ“—û£uâN]jÜItß­wòÒçþh5îÔ¡Æ<ôÞ­wêRãN^JÜÉKŸû£uâN|܉;y)q§.5îÔ¥ÆDÏýÑ:q§ÐÇßßþîàGtßߨwêGиS—wòÒóÛõã¥÷þF¸S׸“—^ëuâNjÜÉKý:q§.5îÔ¥ÆDÏý:q§.5îԥƼôÞߨwÝö7êÄDŸûuâNýwòÒk£N܉K'îä¥çþF¸S—¸S‡wòÐk£NÜ©K;y鱿Q'îjÜItßߨwêoÜ©K;‰ûuâN¡ÆD·ý:q§~;u©q§.5îä¥×·7ê§K‰;u¨q'Ñs}¢NÜ©C;u©q'/½ö'êĺԸ“èñí‰ú½÷'êÄøÆOÜÉK¯oOÔ—>÷'êÄDý‰:q§Ð?ÿ¹ýÏîļôÜŸ¨wêRãN]JÜÉC¯ý…jÜ©kÜÉCÏý…:q§.5îԥƼ”¸S—wêRãN¢‰;iÞûuâN}ß;yéµ?P'îjÜIôبwêRãN]jÜÉKÏýj܉C'îÄ¡Æ4¯ý:q§.5îä¥çþ@¸S—>wêRãN^zíTãNšÛþ>MÜ©oºq§Î4î$ºïÓ‰;…wêoÜÉKýq:q§.5îÔ¥Ä<ôüö8ýxèó¯í;q'ÑcœNÜ©K;u©q'/=÷ÇéĺԸ“è¾>N'îjÜIsÛߦwâpâN]jÜI”¸“赿M'îÔ7Þ¸“—ûÛtâN]jÜ©K‰;yè¹?N'îÔ§5îԥƼôÞ§wêRãN^zîSãÎÿ5¿ÄùÂÆºþ\ÿ!lÜ)Ô¸S?“ƼôÜ_¬w 5î$ºï/Ö‰;u©q§.5îä¥Çþd5îÄ¡wâЉ;yéµÿÁ‰;õq;u©q'/½÷'ëÄD·õÉ:q'Ñçúd½w=ö'ëĺԸS—wòÒs²NÜ©kÜ©K;yéµ?Y'îÔ¥Ä<ôøödýxèý×ÖI|‰;‰îû“uâN^úÜŸ¬wêÒûûï³þxé½þyêÄDû™çþ:¸ßô‰;qéS—wÝö×éļô¹¿N'îԥƼôZ_§wêPãN^ú¿ËzâN}\ãN]jÜÉK¯ýu:q§.%îä¡Çþ:5î”iÜIôý7YDÏýu:q§~;u©q'/½÷×éÄú¸Æ¼ôÜ_§wêRâNjÜÉC¯õuúwþ~éKÜùÃ¥âÎû?zYî ârç /wq¹3ˆËA\î¼Ð²ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA^î ârg—;ƒ¸Ü9ˆË1\î ârç /wq¹3HË1\îäåÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA^î ârg—;y¹3ˆËAZîŒárç…–åÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ>´ÜY„åÎ-wq¹³HËEZî,Òrg—;‹´ÜY¤åÎ"-wq¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹°ÜÃåÎ"-w½ðïŸäåÎ"-wéßvT¤åÎ .wi¹³HËA\î,úøë÷¡W‘–;‹´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒ¸ÜY„åÎ-wi¹3ˆËEZî,Òrg—;‹nûååÎ"-wq¹³HËEZî ârgÑZîìWi¹³H˃¼ÜY¤åÎ"-wi¹3ˆËEZî,ÂrgÌ??³ýÏÒËEZî,Òrg—;‹´ÜY¤åÎ .wi¹³HËEZî ârg‘–;‹´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;‹´Ü¤åÎ-wi¹3ˆËEZî,Òrg‘–;y¹³HËEZî ârg‘–;‹´ÜY¤åΠ-wi¹³HËA\î,Òrg‘–;‹´ÜÄå΢ûþFq¹3†ËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Òrg—;‹´ÜY¤åÎ"-wq¹³HËE¯ýòrg‘–;‹´ÜY¤åÎ -wÖh¹³HËA\î,úØß(/wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY¤åÎ -wÖÜö'ŠË5Zî ârg‘–;‹´ÜÄåÎ"-wi¹³H˃¼ÜY¤åÎ"-wi¹3ˆËEZî,ÒrgÐ?âÞþgçåÎ"-wi¹3ˆËEXî¬Ñrg–;k´ÜY¤åÎ"-wq¹³HËEZî ârg‘–;‹°ÜY£åÎ .wÝ÷ÊËEZî ârg‘–;‹´ÜÄåÎ"-wi¹³Ëc¼ÜY„åÎ-wq¹³HËEZî,ÒrgЇ–;‹´ÜYôÚ(.wÖh¹³è×å„ -wq¹³HËEZî ârgÑÇþ8y¹³HËA\î,Ârg–;‹°ÜÃåÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY„åÎ-wârgÍm›¼ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹´ÜÄåÎ",wÖh¹³HËA\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wý×åÎ|!—;‹Ö¹ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wa¹sŒ—;‹´ÜY¤åÎ"-wq¹³HËEZî úÐrg–;k´ÜY„åÎ.wi¹³HËA\î,Òrg‘–;‹´ÜÄåÎ"-wi¹3ˆËEXî¬Ñrg‘–;ƒ¸ÜYtߟ,/wi¹3ˆËEZî,Ârg —;‹ö3Zî,Òrç /wi¹³HËA\î,Òrg‘–;‹´ÜÄåÎ"-wa¹3†ËEZî,ú¿ËêåÎ .wi¹³HËA\î,Ârg–;‹°ÜÃåÎ"-wi¹³HËA\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3HË5Zî,Òrç…–å΢Û?ÿùó¥âκ¸5îä¸óBKÜ9Èqç ǃwþA[Ü9Èqç ǃw^h‰;9îä¸óBKÜ9Èqç ǃw^Èqçǃw^h‰;9îĸsŒãÎ -qç ǃw^h‰;9îä¸sãÎ -qç ǃwrÜy¡%îä¸sãÎ -qç ǃwŽqÜùmqgãΠƃw1î bÜĸsãÎ Å1Œ;9î bÜĸ3ˆqç ÇAwýrãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwŽqÜĸ3ˆqç…–¸3ˆqgÿ@ĸsãÎ ÆAŒ;9î úÐßù1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ Å1Œ;ƒwrÜĸ3ˆqç ÇA·ýZâΠƃw1î bÜ9ÈqgÐïqçô{ËùSš¯bÜy¡%î bÜĸ3ˆqç ÇAŒ;ƒwŽqÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸ3ˆqç Æ1Œ;ƒwrÜĸ3ˆqgãÎ -qgãΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇA÷ýrÜ9ÆqgãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1î¼Ðw1î bÜĸsãÎÆAŒ;9î úØß¨%î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3è¥ÿ:}ãΘÛþD9îŒaÜ9ÈqgãΠƃw1î bÜĸóBKÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw)îŒaÜ9ˆqg ãÎ ÆAŒ;9î bÜĸsãÎ ÆAŠ;cwrÜtߨ%î bÜ9ÈqgãΠƃw1î bܤ¸ó2Kܤ¸3†qç ÇAŒ;ƒw1îä¸3ˆqgãÎAŒ;cwýþËuŒ;9î bÜĸsãΠýqZâΠƃw)îŒaܤ¸sŒãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŠ;c^ûãä¸3æ¶¿MKÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŠ;cw1îä¸3ˆqgãÎAŽ;ƒwýwþnæ+->qÜ´þCè¸sãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw)î¼Ìw1î bÜĸsãÎ ÆAŒ;9î RÜø3HqçÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3Hqg ãΠƃw1î bÜĸsãÎ ÆAŠ;Ç8î ÚÏ0î bÜy¡%î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3èµ¾NKÜĸ3è_ü.ëwrÜĸ3ˆqç ÇAŠ;cw)îã¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;1îŒaÜôZ_§-î ºý—¸óÿþØø'¾Ä?‚5îüi^tЉ;qéĺԸS—wþ~éKÜ)Ô¸ó÷ûwêRãN\:q'.¸S¨q'Љ;…w 5îj܉AãN:q§ýóþö}Ÿ¸S¨q'>®q§5îÄ¡wâÒ‰;u©q'.¸—NÜ©K;…wâãN܉K'îԥƺԸ—N܉K'îjÜ tâN¡ÆB‰;ewþþøwþ~éKÜIôúkÿ¸ÆºÔ¸“—wòRâN]jÜ©K‰;y(q§5îÔ¥ÆD‰;ùq‰;u©q§.5îä¥Ä¼”¸S¨q'Qþ0L”¸S¨q'QâNýwòRâN¡ÆDõúwêoÜ©K;y)q'/MÜ©C;u¨q'/%îÄ¥w%îÄǸ“—wêRãN]jÜI”¸S¨q'ÑÇüÑc}£¾Äú4îԥƼ”¸“—>÷7êÄú¸Æ¼ôÞߨwêRâNzîoÔ‰;u©q§.5î$zíoÔ‰;u©q'/=÷7êÄB;‰îûuâN¡ÆDûuâÎÿ½ôCÜÙ¯z{´~8}âN|“'î$zíÖ‰;u©q§.5îä¥÷úh¸S‡wòÒs´NÜ©K;u©q'Ñk´NÜ©K;‰žû£uâN¡ÆD÷ýÑ:q§~;u©q'/=öGëĺԸ“è¾?Z'îä¥ÏýÑjÜ©C;yè½?Z'îԥƼ”¸“—>÷GëÄø¸wòRâN]jÜ©K;‰žû£uâN¡ÆD÷ýV'îÔ q§.5îä¥ç·7êÇKïý:q§>®q'/½Ö7êÄ:Ô¸“—ûuâN]jÜ©K;‰žûuâN]jÜ©K;y齿Q'î$ºíoÔ‰;‰>÷7êÄú4îä¥×þF¸—NÜÉKÏý:q§>.q§5îä¡×þF¸S—wòÒc£NÜ)tûûÛõ#ºïoÔ‰;õ7îÔ¥ÆDý:q§PãN¢ÛþF¸S?‚ƺԸS—wòÒëÛõÓ¥Ä:Ô¸“è¹>Q'îԡƺԸ“—^ûuâN]jÜIôøöDýˆÞûuâN|ã'îä¥×·'êÇKŸûuâN¢ÇþD¸S¨q§¾ñƼôÜŸ¨wêRãN]JÜÉC¯ý…jÜ©kÜÉCÏý…:q§.5îԥƼ”¸S—wêRãN¢‰;iÞûuâN}ß;yéµ?P'îjÜIôبwêRãN]jÜÉKÏýj܉C'îÄ¡Æ4¯ý:q§.5îä¥çþ@¸S—wêRãN^zíTãNšÛþ>MÜ©oºq§Î4î$ºïÓ‰;…wêoÜÉKýq:q§.5îÔ¥Ä<ôüö8ýxèó¯í;q'ÑcœNÜ©K;u©q'/=÷ÇéĺԸ“è¾>N'îjÜIsÛߦwâpâN]jÜI”¸“赿M'îÔ7Þ¸“—ûÛtâN]ºý½?N;yè¹?N'îÔ§5îԥƼôÞ§wêRãN^zþú8ýwö+?×ëÄDë?„;…wêgÒ¸“—žû‹uâN¡ÆD÷ýÅ:q§.5îԥƼôØŸ¬Æ8tâN:q'/½ö¿18q§>®q§.5îä¥÷þd¸“è¶>Y'î$ú\Ÿ¬wãN¢Çþd¸S—wêRãN^zîOÖ‰;õq;u©q'/½ö'ë唸“‡ßž¬½ÿÚ:‰/q'Ñ}²NÜÉKŸû“uâN]zÿ}Ö/½××éÄDû™çþ:¸ßô‰;qéļôÞ_§wÝö×éļô¹¿N'îԥƼôZ_§wêPãN^ú¿ËzâN}\ãN]jÜÉK¯ýu:q§.%îä¡Çþ:5î”iÜIôý7YDÏýu:q§~;u©q'/½÷×éÄú¸Æ¼ôÜ_§wêRâNjÜÉC¯õuúwþ~éKÜùÃ¥âÎû?¿‘¶,wq¹s—;ƒ¸ÜÄåÎ .w^hYî ârg—;ƒ¸Ü9ÈËA\î ârç /wq¹3ˆËA\îÄåÎ.w5îÄ%/wq¹3HË1\îäåÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA^î ârg—;y¹3ˆËAZîŒárç…–åÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY„åÎ-wq¹³HËEZî,Òrg—;‹´ÜY¤åÎ"-wq¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹°ÜÃåÎ"-wi¹s—;‹´ÜY¤ÛQ‘–;ƒ¸ÜY¤åÎ"-wq¹³èã¯ßÿ…^EZî,ÒrgÐMËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³Ë5Zî,Òrg—;‹´ÜYôÚß(/wÝö7ÊËEZî ârg‘–;‹´ÜÄåÎ"-wý§åÎ~•–;y¹³HËEZî,Òrg—;‹´ÜY„åÎ.wi¹³HËEZî ârg‘–;‹´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ´ÜY£åÎ"-wq¹³HËEZî,Òrç /wi¹³HËA\î,Òrg‘–;‹´ÜÄåÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ",wÆp¹³HËEZî,Òrg—;‹´ÜY¤åÎ"-wq¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³H˃¼ÜY¤åÎ"-wi¹3HË5Zî,Òrg—;‹>ö7ÊËEZî ºi¹³HËEZî,Òrg—;‹´ÜY¤åÎ .wi¹³HËEZî ârg‘–;‹^øw%i¹³æ¶?Q\î¬Ñrg—;‹´ÜY¤åÎ .wi¹³HËEZîäåÎ"-wi¹³HËA\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEXî¬Ñrg–;k´ÜY¤åÎ"-wq¹³HËEZî ârg‘–;‹°ÜY£åÎ .wi¹³HËEZî ârg‘–;‹´ÜÄåÎ"-wi¹³Ëc¼ÜY„åÎ-wq¹³HËEZî,Òrg—;‹´ÜY¤åÎ -wÖh¹³è×å„ -wq¹³è¾?N^î ârgÑÇþ8y¹³HËA\î,Ârg–;‹°ÜÃåÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY„åÎ-wârgÍm›¼ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹´ÜtÓrg–;k´ÜY¤åÎ .wi¹³HËA\î,ú}¹ó·n3_ùûœç„åÎ.w­ÿr¹3ˆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³HËEZî,Ârç/wi¹³HËEZî ârg‘–;‹´ÜÄåÎ",wÖh¹³Ë1\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Òrg—;‹°ÜY£åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY„åÎ.wíg´ÜY¤åÎA^î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Ârg —;‹´ÜYô/~—ÕËA\î,ºï¯“—;ƒ¸ÜY„åÎ-wa¹3†ËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³HËEZî,Òrg–;k´ÜY¤åÎ -ËE·ÿ´Üùú'aÙâÎAŽ;/´ÄƒwrÜ9Èqç´ÅƒwrÜ9Èqç…–¸sãÎAŽ;/´ÄƒwrÜ9Èqç…wŽqÜ9Èqç…–¸sãÎAŒ;Ç8î¼ÐwrÜ9Èqç…–¸sãÎAŽ;9î¼ÐwrÜ9Èqç ÇZâÎAŽ;9î¼ÐwrÜ9ˆqçÇÐw1î bÜ9ÈqgãÎ ÆAŒ;9î RÜøsãÎ ÆAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŠ;Ç8î bÜĸóBKÜĸ3ˆ bÜ9ÈqgÐ]LãÎAŽ;ƒ>ôw>AŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3Hqg ãΠƃw1î bÜ9ÈqgÐm£–¸3ˆqç ÇAŒ;ƒwrÜĸ3è¿Åù*ÆZâÎ ÆAŒ;ƒwrÜĸ3HqçÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎ ÆAŒ;ƒwbÜø3ˆqç ÇAŒ;ƒw1î¼Ðw1î z)œä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bܤ¸sŒãÎ ÆAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î bÜy¡%î bÜĸ3ˆqç Æ1Œ;ƒwrÜô±¿QKÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŒ;cnûå¸3†qç ÇAŒ;ƒwrÜĸ3ˆqgãÎ -qgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrܤ¸3†qç Æ1Œ;ƒw1îä¸3ˆqgãÎAŽ;ƒw)îŒaÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒw^f‰;ƒwƼöj‰;ƒw1î bÜ9ÈqgãΠƃwÆ0î úý—ë"wrÜtß§%îä¸3ècœ–¸3ˆqç ÇAŠ;cw)îã¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgâÎÆrÜsÛߦ%î bÜ9ÈqgãΠƃw1î bÜĸsãÎ Å1Œ;ƒwrÜĸ3ˆqç ÇAÿ=îÌW2î RÜ9ÆqgÐú¡ãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bܤ¸ó2KÜĸ3ˆqgãÎAŽ;ƒw1îä¸3Hqg ãÎ Åcw1î zíOÖw1î bÜĸsãÎ ÆAŒ;9î RÜø3ˆqç ÇAŒ;ƒw1îä¸3ˆqgâÎ1Ž;ƒö3Œ;ƒw^h‰;ƒw1îä¸3ˆqgãΠƃw1î RÜ9ÆqgãΠñ»¬KÜ9ÈqgãΠƃw)îŒaܤ¸sŒãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îĸ3†qgãÎ?h‹;ƒnÿ%îü¿ÿÅZÛÎ1L;/ã²s ÃÎ1ì:Ç0ëüc–ªs £Î1l:Ç0鼌‹Î1 :ǰ缌sÎ1¬9Ç0æÖó2L9‡°äÃó2î8Ç0㣊s#Î˸áÄs ÎË8àÃ~s óÍ1¬7/ãxs ÛÍ1L7ǰܼŒÃÍ1ì6Ç0Û¼Œ«Í1Œ6ǨÙÂdóYŠÍ›1ßÿ|ûÃg1׌Q­£X3F­æ¦š1(5CjŽa§£L3F•fŒ"Í1l4c”hƨЌQ 9†}fŒòÌÕ™cgƨ͌Qš£2s ÃÌu™1Ê2ǰʌQ”£&3Iæ™1 2cÔc^Æ9fŒjÌý6F-榘1*1cbŽa‡ó¿‰Q…£s Ì%˜1*0c`Ža£ü2Fõ寗1h/C”^ƨ¼Ãð2FÝeŒ²Ë1¬.cnë«ãæ2FÉå—1 .cÔ[Žan£Ú2æ÷Øò˜ßÓÊ‚Ì닜Zƨ´ŒQh£Îr 3ËU–1ˆ,‡°±ŒQb£Â2Fåö•1Ê+cTWŽa\£¶2FieŒÊÊ1 +cÔUÆ(«ê2FQeŒšÊ%•cXTÆ(¨ŒQO£œrŒjÊÅ”1j)Ç0¥ŒQI£2FåeœQƨ¢Œy!PÆ2F eŒ Ê”cØOÆ(ŸŒQ=9†ñdŒÚÉ¥“1*'ÇÜNƨ›ŒA69„ÕdŒ¢É5“1J&ǰ˜ŒQ0£^2F¹äÖ’1Š%cÔJŽa*£R2F¡dŒ:É1Ì$cTIÆ(’¼ŒÉ%’1*$cHŽQ¢<2Fu䯑1ë«ã42Fe䆑1ê"c”EƨŠÃ(2FMdŒ’È1,"cDƨ‡ŒQ9†5dŒbȵc”B†ÜÖG‡!dˆ:È1Ì cTAÆ(‚Ã2F dŒ È—qÿ£ü1FõcŒâÇ1lc”>ƨ|Ãð1FÝcŒ²ÇUc=Æ y Qò8FÅcˆ‚ÇõŽ1ÊǰvŒQì£Öq SÇ•Ž1CÔ9Žaæ£Ê1F‘cŒÇ1LcT8Æ(pþ1FycŒêÆÄqÛƒ´1äµ>9cÔ5Æ(kŒQÕ8†QcŒšÆ%cT4†(hŒùõ÷É”3޹«fŒQÌ£–q SƘõ¹qÈ£Žq 3ÆTŒ!ŠcÐ0a£‚1Fãö‹1ÊcT/Æ(^Ãv1ébˆÊÅË0\ ¹­¯³ÅU‹c-ƨYŒQ²8†ÅbŒ‚ÅõŠ1ÊǰVŒA¬¢V1F©â–Š1 cÔ)Ža¦óŸ+Å|¡"Å4ŠC˜(ÆlÿÌ1PÃ>1FybŒêÄʼncØ&Æ(MŒQ™8†abŒºÄe‰1¨/â(1FMbŒ’ĉc$ƨGŒQŽ8†5b bĵˆ1H‡°DŒQˆ£q 3ÄUˆ1ŠcÔ Ža‚£1Fâö‡1ÈCTÆ(>Ãö0FéaŒÊÃ…‡cØÆ(;ŒAu8„ÑaÌzDÉaŒŠÃË88ŒQo£Üp kÃņ1j c”Žai£Ð0áf†1ª cößÑtc8æ®Ä0F…aŒÃ1ì c†¨.ŒA\8„maŒÒ•…1 ǰ+ŒQV£ªp £Â5…1J cTŽQP¢ž0F9á³Ô„1·ÿþßÿÏøõµ&|þSÄ}¿<¨9aÐÿç[¼Ðé qé…ºÔ¢P—šþ~éKS(Ô¨ð÷ûRêR³B\:]!.°P¨e!ÐI …Ú 5.j]ˆAóB:}¡50Ä¥S 51Äǵ1Ô¡F†8t*C\:™¡.µ3Ä¥âÒ) u©©¡P[C|܉ qéÔ†ºÔÜP—ÚâÒ qé‡BMNs(ÔèP(Õ¡L³Ãß_ºÃß/} ‰ò'Z}\ÓC]j{ÈK‰y)õ¡.5?Ô¥ô‡<”Q‡Z êRD¢4ˆü¸DˆºtÏŸnu©"/¥C䥄ˆB-‰òG\¢´ˆB‰R#êGБ—Ò# 5H$z¬oÔ—$Qßx›D]j”ÈK©yi²Dj—¨C y)e".4‘(m">îĉ¼”:Q—š'êRûD¢ŠB-‰>æosˆëõ%RÔ •¢.5Sä¥tмô¹¿Q§TÔÇ5Uä¥÷þFXQ—R+òÐs£N¯¨K u©Å"Ñk£N³¨Ky鹿Q'[j·HtßߨS. 5]$úØß¨/òÒûÛu.ýT/^_uòEœ>ý"Ñk´NÁ¨KMu© #/½×GëTŒ:ÔŒ‘—žû£uBF]jɨKM‰^û£ubF]jÍHôÜ­Ó3 5h$ºïÖIõ#hÓ¨Kyé±?Z'kÔ¥vD÷ýÑ:e#/}îVÛFjÜÈCïýÑ:y£.µoä¥޼ô¹?Z'qÄÇÆ‘—9êR+G]jæHôÜ­: µt$ºïÖiõ#hì¨K­yéùíúñÒ{£Nð¨»ß÷7ªÉ£µyÔ¡F¼ôØß¨“=êR»G]jøHôÜߨ“>êRÛG]jüÈKïý:ù#Ñm£NIô¹¿Q'Ô  $/½ö7êT¸t2H^zîoÔ !õq)!u¨)$½ö7êĺÔ’—ûuzH¡‘D÷ý:I¤¾ñ6‘ºÔ(’豿Q'‹jItÛߨSFêGÐ4R—ÚFêRãH^z}{£~º”­ý¥.5Àä¥÷þ8ó/ý–Wæ+oû‹u"L¢ÏõÅ:&ÑúaCL¡–˜úé6Åä¥çþbS¨5&Ñ}±N©K 2u©E&/=ö'«M&(‡N•ÉK¯ýo N—©k˜©K-3yé½?Y§Í$º­OÖ©3‰>×'ëÝ>“è±?Y§ÐÔ¥&šºÔF“—žû“u*M}\3M]j§ÉK¯ýÉ:¥¦.%Õä¡Ç·'ëÇCï¿¶NâK­Itߟ¬ÓkòÒçþç©SlêÒûûï³þxé½¾N'Ú$ÚÏ<÷×ét›ø¦O¸‰K§Üä¥÷þ:v“è¶¿N§Þä¥Ïýu:ý¦.5àä¥×ú:„S‡ÚpòÒ¿ø]ÖSqêãšqêÒý¾¿N'äÔ¥Ç÷ßeýéRRNzì¯ScN™ÖœDß“õGôÜ_§têТS—štòÒ{NÔ©kÕÉKÏýu:]§.%ìÔ¡–<ôZ_§/mçï—¾Ä?\ú!î|ÿóZ¶©ÈAÞŠ¼Ð29Èk‘ƒ<9È{‘Ð69È‹‘ƒ<9È›‘ZF#y5rg#/´ìFòpä /Gòtä…¼9Æã‘ƒ¼y¡e>r÷#q@rŒ$/´LHºsCrG$/´¬HòŒä ïHòä…–%ÉAž’ä-ÉA“¼Ð²&9Ès’ƒ¼'y¡ePr%qRrŒ7%ÿ mT2ˆ«’Aœ•ä]É KqY2ˆÓ’ƒ¼-¤qÉ®Kò¼d÷%ƒ80Ä…ÉAwþ«‹‚¸1Ä‘É ®LòÌdw&ƒ849ÈK“Aœš âÖdÇ&ym2ˆs“AÜ›äÁÉ .Nqr2H›“c<:ÄÕÉ ÎN^hÙ âðdÿ­FAœžäíÉ ŽOq}rç'ƒ>þ¿ª+ˆ”A\ ä Ê nPq„2ˆ+”ƒ›ÁÝÌAwgq93ˆÓ™ƒ¼ô±?NËzfç3y?3Hš1\Ð Ò„æohqD3ˆ+šƒ<£ÄÍ iqIs§4ƒ´¥Ã1Í yM3æ¶¿MËžf5yQ3ˆ“šAÜÔäQÍ ®jqV3ˆ»šƒ<¬¤eÍNkq[sÇ5ƒ¸®ôû¼æoÝæ|¥G7ƒ~_Ýü‚¸°¤‰Í1ÞØ Zÿ!ôÊæ Ïlqg3ˆC›A\Úä©Í ûþb-c›ƒ¼¶Ä¹Í îmipó2Ëâf'7ƒ¸¹ÄÑÍA^Ý âìfw7yx3HË›1œÞ Òöæoq}3ˆó›ƒ¼¿ÄÎ .pq‚s78ƒ8ÂÄÎAžá Òg ‡8ƒ¸Ä9ÈSœAÜâ âg×8yŽ3ˆ{œAäãEΠý 79ƒ8Êy¡e•3ˆ³œAïýuZ†9ƒ¸ÌÄiÎ nsò8g×9ƒ4Ï9ÆûœAè ú¿ËºLtòFgG:ƒ¸Ò9È3AÚéŒáPg–:Çxª3ˆ[Aë âZç Ïuq¯3ˆƒƒ¼ØÄÉÎ nvq´sW;c8ÛÄÝÎ?hî ºý—åÎÇŸÿh‰;ƒwrÜĸ3ˆqgãÎ -qgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwbÜø3ˆqç ÇAŒ;ƒwÆ0îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŠ;cw^h‰;‹w)î bÜY¤¸³Hqg‘âÎ ÆEˆ;kw1î,RÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,z£“ bÜY¤¸³HqgâÎÆEŠ;‹wrÜY¤¸³H .RÜĸ³Hqg‘âÎ ÆEø;Ÿ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹wÖ(î,RÜĸ³Hqg‘âÎ ÆE·ýrÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,ú=î,RËùCÚ¯RÜY¤¸³HqgãÎ"ÅEˆ;cw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜôPÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸³HqgâÎÅEŠ;ƒw)î,RÜY¤¸sãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³HqgâÎÆEŠ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹Þû帳Hqg‘âÎ"ÅAŒ;‹w)î丳Hqg‘âÎ"ÅAŠ;kw)î bÜYô±¿QŽ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŠ;knûŸ³FqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸sãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw!î¬Qܤ¸³Fqg‘âÎ"ÅAÅEŠ;‹w1î,RÜY„¸³FqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEˆ;Ç8î,BÜY£¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,Rܤ¸³Fqgѯ¿\W¡¸3ˆqg‘âÎ"ÅAŒ;‹>öÇÉqg‘âÎ ÆEˆ;kw!îŒaÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,BÜY£¸sãΚÛþ69î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w)î bÜY„¸³Fqg‘âÎ ÆEŠ;‹þsÜ™¯dÜY¤¸³HqgâÎÆEë?„Œ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,BÜ9Æqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³qgâÎ"Ä1Œ;‹w)î bÜY¤¸³Hqg‘âΠ‡âÎ"ÅEŠ;ƒw!î¬QÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,BÜø³h?£¸³Hqç ÇEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEˆ;cw)î,ú¿Ëê¸3ˆqg‘âÎ"ÅAŒ;‹wÖ(î,BÜø³Hqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎ Å5Š;‹w^h‰;‹nÿ)îü¿×üý5îüi4¨qçOó¢ƒN܉K'îԥƺԸó÷K_âN¡Æ¿Ü—¸S—wâÒ‰;qéÄB;NÜ)Ô¸S¨q§PãNüwâЉ;u¨q'.¸S¨q'>®q§5îÄ¡GãN\:q§.5îÄ¥wâÒ‰;u©q§PãN|܉;qéĺԸS—wâÒ‰;qéÄB;NÜ)Ô¸S(q§LãÎß_âÎß/}‰;‰^í׸S—wòRâN^JÜ©K;u)q'%îԡƺԸ“(q'?.q§.5îԥƼ”¸“—w 5î$ʆ‰w 5î$JÜ©AãN^JÜ)Ô¸“è±¾Q_âN}ã;u©q'/%î䥉;u¨q§5îä¥Ä¸tâN¢Äø¸wòRâN]jÜ©K;‰w 5î$ú˜¿ó!z¬oÔ—¸S?‚ƺԸ“—wòÒçþF¸S׸“—ÞûuâN]JÜÉCÏý:q§.5îÔ¥ÆD¯ý:q§.5îä¥çþF¸S¨q'Ñ}£NÜ)Ô¸“èc£þnÜÉKïooÔ—NÜù¿—~Š;óU÷ýÑ:q'?ÿs´NÜ©K;yé½>Z'îԡƼôÜ­wêRãN]jÜIôÚ­wêRãN¢çþh¸Sèñ÷þh¸“èµ?Z'îԥƼôØ­wêRãN¢ûþh¸“—>÷G«q§5îä¡÷þh¸S—wòRâN^úÜ­wâãNÜÉK‰;u©q§.5î$zîÖ‰;…wÝ÷GëÄú4îԥƼôüöFýx齿Q'îÔÇ5îä¥×úF¸S‡wòÒc£NÜ©K;u©q'Ñs£NÜ©K;u©q'/½÷7êÄD·ý:q'ÑçþF¸S?‚ƼôÚߨwâÒ‰;y鹿Q'îÔÇ%îÔ¡Æ<ôÚߨwêRãN^zìoÔ‰;…wÝ÷7êÄúÆwêRãN¢ÇþF¸S¨q'Ñm£NÜ©AãN]jÜ©K;yéõíúéRâNjÜIô\Ÿ¨wêPãN]jÜÉK¯ý‰:q§.5î$z|{¢~Dïý‰:q'¾ñwòÒëÛõã¥Ïý‰:q'Ñc¢NÜ)Ô¸SßxãN^zîOÔ‰;u©q§.%îä¡×þB5îÔ‡5îä¡çþB¸S—ï/Ô‰;y)q§.5îÔ¥ÆDwÒ¼÷êÄú¾wòÒk NÜ)Ô¸“è±?P'îԥƺԸ“—žûÕ¸‡N܉C;i^ûuâN]jÜÉKÏý:q§.5îԥƼôÚ¨Æ4·ý}š¸SßtãNiÜItß§w 5îÔ7Þ¸“—ûãtâN]jÜ©K‰;yèùíqúñÐç_ÛvâN¢Çþ8¸S—wêRãN^zîÓ‰;u©q'Ñ}}œNÜ Ô¸“æ¶¿M'îÄàĺԸ“(q'Ñk›NÜ©o¼q'/=ö·éĺԸS—wòÐsœNÜ©OkÜ©K;ÿ÷ÒoÝf¾ò½¿X'îÔ7Ú¸“—žû‹Õ¸S¦q'ÑúaãN¡Æú~ãN^zî/Ö‰;…wÝ÷ëĺԸS—wòÒc²wâЉ;qèļôÚÿÆàÄú¸ÆºÔ¸“—Þû“uâN¢Ûúd¸“ès}²Þ;‰û“uâN]jÜ©K;yé¹?Y'îÔÇ5îÔ¥þsûß‚wêRãN]JÜÉCoOÖ‡ÞmÄ—¸“è¾ÿyêļô¹¿N'îÔ¥÷÷ßgýñÒ{}NÜI´Ÿyî¯Ó‰;ñMŸ¸—NÜÉKïýu:q'ÑmNÜÉKŸûëtâN]jÜÉK¯õu:q§5îä¥ñ»¬'îÔÇ5îԥƼôÚ_§wêRâNzì¯SãN™ÆDß“õGôÜ_§wêиS—wòÒ{NÜ©kÜÉKÏýu:q§.%îÔ¡Æ<ôZ_§/qçï—¾Ä?\ú!î|ÿó;é[Ü9Èqç…–¸sãÎAŽ;9îüƒ¶¸sãÎAŽ;9î¼ÐwrÜ9Èqç…–¸sãÎAŽ;9î¼ãÎ1Ž;9î¼ÐwrÜ9ˆqçÇZâÎAŽ;9î¼ÐwrÜ9Èqç ÇZâÎAŽ;9îä¸óBKÜ9Èqç ÇZâÎAŽ;1îã¸óÚâÎ ÆAŒ;9î bÜĸ3ˆqç ÇAwü·ç1Œ;9î bÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bܤ¸sŒãΠ»þ+Š ÆZâÎ ÆAüqãÎAŽ;ƒw1îä¸3èCçĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒwÆ0î bÜ9ÈqgãΠƃwÝö7j‰;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1î¼Ð;óUŒ;ƒw1îä¸3ˆqgâÎ1Ž;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒw1îĸ3†qgÐ{´–¸3ˆqgãÎ ÆZâÎ ÆAŒ;9î bÜĸ3ˆqç ÇA÷ýÑZâÎAŽ;ƒw1î bÜ9ÈqgãÎ Åcw1î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎ -qgãÎ ÆAŒ;1îŒaÜĸsãΠýZâΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwbÜsÛŸ(Ç1Œ;9î bÜĸsãÎ ÆAŒ;ƒw^h‰;ƒw1î bÜ9ÈqgãΠ÷þD-qgãÎ ÆAŒ;9î RÜøsãÎÆAŒ;ƒwrÜtß_¨%îä¸3ˆqgâÎƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3Hqçe–¸3Hqg ãÎAŽ;ƒw1î bÜ9ÈqgãΠƃwÆ0î úý—ë"wrÜĸ3ˆqç ÇAûã´ÄAŒ;9î RÜø3HqçÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒwÆ0î¼ãΘÛþ6-qgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw)îŒaÜĸsâÎߺÍ|åïÅçôÞ_¬%î bÜĸ3HqçÇAë?„Ž;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgâÎË,qgãÎ ÆAŒ;9î bÜĸsãÎ Å1Œ;ƒwŽqÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒwÆ0î bÜ9ÈqgãÎ ÆAŒ;9î bܤ¸sŒãΠý ãÎ ÆZâÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwŽqÜĸ3è_ü.ëwrÜĸ3ˆqç ÇAŠ;cw)îã¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;1îŒaÜĸóÚâΠÛ‰;ÿÇç׸ó§QРÆ?Í‹:q'.¸S—wêRãÎß/}‰;…wþþq_âN]j܉K'îÄ¥w 5î:q§PãN¡ÆB;ñ#h܉C'îԡƸtâN¡Æø¸Æ:Ô¸‡N܉K'îԥƸtâN\:q§.5îj܉;q'.¸S—wêRãN\:q'.¸Sè¸èÄB;…wÊ4îüý'ð%îüýÒ—¸“èõ×þq;u©q'/%îä¥ÄºÔ¸S—wòPâNjÜ©K;‰wòãwêRãN]jÜÉK‰;y)q§PãN¢üa˜(q§PãN¢Äú4îä¥ÄB;‰ëõ%îÔ7Þ¸S—wòRâN^š¸S‡wêPãN^J܉K'î$J܉;q'/%îԥƺԸ“(q§PãN¢ù;¢ÇúF}‰;õ#hÜ©K;y)q'/}îoÔ‰;õq;y齿Q'îÔ¥Ä<ôÜߨwêRãN]jÜIôÚߨwêRãN^zîoÔ‰;…wÝ÷7êÄB;‰>ö7êïÆ¼”¸—NÜù¿—~ˆ;ûU÷ýÑ:q'?ÿs´NÜ©K;yé½>Z'îԡƼôÜ­wêRãN]jÜIôÚ­wêRãN¢çþh¸S¨q'Ñ}´NÜ©AãN]jÜÉKýÑ:q§.5î$ºïÖ‰;yés´wêPãNzïÖ‰;u©q'/%îä¥ÏýÑ:q'>îS—wêRãN¢çþh¸S¨q'Ñ}´NÜ©AãN]jÜÉKÏooÔ—ÞûuâN}\ãN^z­oÔ‰;u¨q'/=ö7êĺôü{£NÜIôÜߨwêRãN]jÜÉKïý:q'Ñm£NÜùÿRvoÉq^K²n{D3È úß±ZÂî!GHOçe0Ħ¹ÈÂ''úÜߨwê[и“—ûuâN\:q'/Ý÷7êÄú¸Ä:Ô¸“‡ûuâN]jÜÉK·ý:q§PãN¢ý:q§¾ðƺԸ“è¶¿Q'îjÜIô¾¿Q'îÔ· q§.5îԥƼôøñFýv)q§5î$º¯OÔ‰;u¨q§.5îä¥ÇþD¸S—wÝ~ÖÇéÄ@;iÞ÷·éÄøœ¸S—w%î$zìoÓ‰;õ…7îä¥Ûþ6¸S—wêRâNºïÓ‰;õi;ÿyéEÜÙ_yÛ_¬wê mÜ©K;y龿X;ew­w 5îÔo¿q'/Ý÷ëÄB;‰>öëĺԸS—wòÒm²wâЉ;qèļôØÿÅàÄú¸ÆºÔ¸“—žû“uâN¢÷õÉ:q'Ñçúd=wÝö'ëĺԸS—wòÒ}²NÜ©kÜ©K;yé±?Y'îÔ¥ÄwrÜy¡%îä¸sãÎ1Ž;/´ÄƒwrÜy¡%îä¸sãÎAŽ;/´ÄƒwrÜ9Èqç…–¸sãÎAŽ;/´ÄƒwbÜ9ÆqçÚâÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŠ;cwrÜĸ3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3HqçÇAŒ;ƒw^h‰;ƒwñ/ÄAŒ;9î bÜĸsãΠ7ý›OãΠƃw1î bÜĸsãÎ ÆAŒ;9î RÜø3ˆqç ÇAûµÄƒw½ïoÔw1îä¸3ˆqgãÎAŽ;ƒw1î bÜy¡%î úoqg~ãΠƃw1î RÜ9ÆqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãΠƃwÆ0î bÜ9ÈqgãÎ ÆAŒ;/´ÄAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î RÜ9ÆqgãÎ ÆAÏýZâÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎ -qgãÎ ÆAŒ;1îŒaÜĸsãΠ·ýZâΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAú?§1îĸ3æ}¢wÆ0îä¸3ˆqgãÎAŽ;ƒw1î bÜy¡%î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒwÆ0îĸ3†qgãΠƃw1î bÜ9ÈqgãÎ Å1Œ;9î bÜĸ3ˆqç ÇAŒ;ƒžûµÄAŒ;ƒw)î¼Ìw)îŒaÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎÆA¯¸.‚qç ÇAŒ;ƒwrÜô¶?NKÜĸsãÎ Å1Œ;ƒwŽqÜĸ3ˆqç ÇAŒ;ƒw1îä¸3Hqg ãÎ 9îŒyßߦ%î bÜ9ÈqgãΠƃw1î bÜĸsãÎ Å1¯ãÎWÝf~%ç<9î bÜĸsãÎ ÆAŒ;ƒwŽqÜ´þ!tÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒw^f‰;ƒw1î bÜ9ÈqgãΠçþd-qgâÎÆAŠ;Ç8î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŠ;cw1îä¸3ˆqgãΠƃw1î RÜ9ÆqgÐ~†qgãÎ -qgãΠƃw1î bÜĸsãÎ ÆAŠ;Ç8î bÜô/~–u‰;9î bÜĸsãÎ Å1Œ;ƒwŽqÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃwÆ0î bÜù…¶¸3èý¿Ä¿ÿÔßÚÎûßYâËcšvÆ|ÿ/sÊÎ×wN؉;í:q§YçË;ߪN˜F/?ë[Ó‰;M:_ß9Eçë;'è„iÏùÚœœ¦5'LcN˜¶œ¯ïM9_Ÿ9%'Î4ä|}çtœ0Í8_V+NœiÄùúÌi8_ß9 'î´à|}眯ïœ~wšo´Þ|ýY'Þ|}ç´›¸ÓtwZn¾¾sÂÍ×wN· Ólóµ9Õ&L£M˜4› M6_þÖ¿›/ï| 6eò÷[|VsMÜi­©;‰5u'­&î4ÕÄ”š:“PgÚiâN3M™Tšú¬Dš¸ÓFwšhêN MÝI  Ó>S&•yÎÿ$†iœ)“6¿÷¦™º“2¦a¦Ìm{u¾e™øš[eâN£LÝI“©;“dâL‹Lœi©;é1_ß99¦LjÌןubLÝI‹‰;M1q§%¦LBL˜v˜2oó¯32·íÕùaâ÷Þwš`êN LÝù\_Ó_Ⳛ_êÎs}uN|‰;i/uæ¾¾:§¼Ä†—¸ÓîRæ±¾:§ºÄF—ºs__“\´¸”ùX_Ó[Â4·”y[_[êÎóÇ«óÏ;'µ|}ç”–ÿ4¿”–ùEõ:%>¼™%î´²Ôçö ÆgšXêÎ}}†N`‰;í+q§y¥Ìc}†N\‰;m+eîë3tÊJ˜†•2ë3t²JüÞ[UâN£Jݹ­ÏÐI*qçñ×ú  ŸÕžRw>×g¨5%Î4¦Ô™çú ”wZRêNBJÝù\Ÿ¡“Q¾þ¬SQêN"JÜiC‰;M(eîë3tJ˜ö“2ë3têIüÞOâNÛIݹÿxu~»ó\_Nâ³ÚMêÎc{uN5‰3&uç¶¾:'™Ä“¸Ó`Ræ¾¾:'—ÄÖ’¸ÓXRwžë«sRI™÷õÕ9¡¤ÌçúêœL¿÷V’ºóX_ÓH¾¾sIݹ¯¯Î $ñYé#q¦y¤Î<ÖWçÄ‘¸Ó6Rwnë«sÊH˜†‘2ë«s²H|Í­"q§Q¤Ìm}uN Ó"Ræ}}uN‰ß{sHÜi ‰;!uçñãÕùåNRHœi )sßÓAâL3HÜi©;õÑ9 $î4”¹ýxt~3ÏõÑ9ýãë¯ùäºóøñèüvçs}tNû(s[S>Â4|Ä×ÜîQwîë£sªGÜiôˆ;iuæ±¾9-ñI uæ¾¾9'wÄÖŽ¸ÓØQwÒ:âNSGÜié(3¡£Ès}rNæˆ/¹•£î<Ö'ç4Ž0Menë“sGÜi߈;Íuç¾>9_Ÿ9mãë3MEë“sÂFÜiר;÷õÉ9U#î4jÄ6ºóXŸœ"ïë‹3=#¾ÞæŒ8ÒšQæc}nNËÓ”_sKFݹ­ÏÍéq§#î¤bÔ™ûçæ·3Ÿ–é$Œ2·õ¹9#î´_Äæ‹ºs_Ÿ›/âNÛE™í¹9åâkÓpQä}}mN¶øúw~ªEÜi´(“fQæ±¾6§XÄ×Ü`QwnëksrEÜi­ˆ;‰ÿyæE‡˜_w_ß “*âó[*âNCEÝy®oÐÉq§•¢îÜ×7¨"HE™íÏ\E˜ö‰ø}7OÔûú8¦m¢ÌÇú2w&âN»Dݹ­P«Ä×gN”øúÌiuç±þ þ‰ø¬‰¸ÓQwžë#tjD™÷í:-¢Ìçö=["ÊÜÖGètˆ¸Ó wZ!êÎ}}„NƒˆÏj‚ˆ;-uç±>B§?Ää‡:sûñÞüvæùgù™þoí¡ÌÇúÞœòPw>×÷æt‡¸óüùsš¿Ýynï͉eÖ#÷õ½9Åáë¯÷‡¯ïœÞPwžë{sjC™÷õ½9­¡î|®ïÍ) q§¡¡î<¶÷æd†8ÓÊPwöŸÑ«‰!î´0ÔÇúÞœ¾w’êÌm}o‚´-”ùùš¿™ûúÞœ°¿óv…¸Ó¬Pwžë{s¢B|V›Bݹ¯ïÍ) q'A!δ'Ô™ÇöÞ|« _Þùþrç—˜ðö÷ëe)2ˆK‘ƒ¼Ä¥È .Eq)òBËRd—"ƒ¸Ä¥ÈA^Š âRd—"y)2ˆK‘A\Š âRä .EÆp)2ˆK‘ƒ¼Ä¥È -EÆp)r—"ƒ¸Ä¥ÈA^Š âRd—"ƒ¸9èÁ¥È .Eq)2ˆK‘ƒ¼Ä¥È .EòRd—"ƒ´Ã¥È -K‘EZŠ,ÒRd—"‹´Y¤¥È"-Eq)²K‘5ZŠ âRd‘–"‹´Y¤¥È .Ei)²HK‘EZŠ âRd‘–"‹žøÏsq)²HK‘EZŠ,ÒRd—"‹´Y¤¥È .Ei)²HK‘EXŠŒáRd‘–"‹´9ÈK‘EZŠ,Ò]§HK‘A\Š,ÒRd‘–"ƒ¸Yôöçõ@ªHK‘EZŠ âRd‘–"‹´Y¤¥È .Ei)²HK‘A\Š,ÂRd–"‹´Ä¥È"-Ei)2ˆK‘Eïûå¥È"-Eq)²HK‘EZŠ âRd‘–"‹´Y¤¥ÈA^Š,úOK‘ýUZŠ,ÒRd—"‹´Y„¥È.Ei)²HK‘EZŠ âRdÑm´¼Ä¥È"-Ei)²HK‘A\Š,ÒRd‘–"ƒ¸Y¤¥È"-Ei)2è¡¥È"-Ei)²HK‘AZЬÑRd‘–"ƒ¸Y¤¥È"-Ei)r—"‹´Y¤¥È .Ei)²HK‘EZŠ âRd‘–"‹´Ä¥È"-Ei)²HK‘A\Š,ÒRd–"c¸Y¤¥È"-E=÷7ÊK‘EZŠ,ÒRd‘–"ƒ¸Y¤¥È"-Eq)²HK‘EZŠ,ÒRd—"‹´Y¤¥ÈA^Š,ÒRd‘–"‹´¤¥È-Ei)2ˆK‘Eoûå¥È"-Eq)²HK‘EZŠ,ÒRd—"‹´Y¤¥È .Ei)²HK‘EZŠ âRd‘–"‹´¤¥Èš÷ý‰âRd–"ƒ¸Y¤¥È"-Eq)²HK‘EZŠ,ÒRä /Ei)²HK‘EZŠ âRd‘–"‹´Ä¥È"-Ei)²HK‘A\Š,ÂRd–"ƒ´Y£¥È"-Ei)2ˆK‘EZŠ,ÒRd—"‹´Y„¥È-E=´Y¤¥È"-Ei)2ˆK‘EZŠ,zî”—"‹´Y¤¥È",EŽñRd–"k´Ä¥È"-Ei)²HK‘A\Š,ÒRd‘–"ƒ´Y£¥È¢—ÿ¥þ -Eq)²HK‘EZŠ âRdÑÛþ8y)²HK‘A\Š,ÂRd–"‹°Ã¥È"-Ei)2ˆK‘EZŠ,ÒRd‘–"ƒ¸Y„¥È-EâRdÍûþ6y)²HK‘A\Š,ÒRd‘–"ƒ¸Y¤¥È"-Ei)2K‘¯ÂÊüJÌGÖ¼žü†´Ä¥È"-Ei)2ˆK‘EZŠ,ÒRd–"c¸Y´þ!äRd—"‹´Y¤¥È"-Eq)²HK‘EZŠ âRd‘–"‹´Y„¥È1^Š,ÒRd‘–"‹´Ä¥È"-Ei)2ˆK‘EXЬÑRd–"c¸Y¤¥È"-Eq)²HK‘EZŠ,ÒRd—"‹´Y¤¥È .Ea)²FK‘EZŠ zü‹ŸgõRd‘–"‹´Ä¥È"-Ea)2†K‘Eû-Ei)r—"‹´Y¤¥È .Ei)²HK‘EZŠ âRd‘–"‹°Ã¥È"-Eý‹ŸeõRd—"‹´Y¤¥È .Ea)²FK‘EXŠŒáRd‘–"‹´Y¤¥È .Ei)²HK‘A\Š,ÒRd‘–"‹´¤¥È-Ei)òBËRdÑûZŠüûÏÞÖv^Æiç—YÊÎË8켌»ÎË8ëüÛlUçeu^ÆMçeœt~™¥è¼ŒƒÎ˸çü2KÎyל—qÌy·œ_Æ)çE\r^Æ!ç—Y:ÎË8ã¼ +΋8âü2KÃy'œ—qÁùe–€ó2î7/ã|ó2®7¿Ìo^Æíæeœn^Æåæ—YÂÍ˸ۼŒ³Í/³T›—q´y6›q²ù·ÙŠÍ17ýOˆ1ì5/ã\s kÍ1Œ5ǰռŒSÍ1*5‡0Ô¼Œ;Í1Ì4ǰÒÃHó2n4Ç0ÑÃBs Í˸ÏÃŽaú8†åãe>Ža÷8†ÙãV—qô8FÍã&—añ8„ÁãöŽc˜;^ƵãÆŽcØ:^Ʃ㖎c:açxgŽcX9Žaä8†ãeœ8Žaá8†ãeÜ7ŽaÞ8†uãÅ_diÇ(m²ñ2ǰkìq «ÆË8jæq “ÆË°h qÌëŸ'Àœñ2®Ç0fÖñ2NǼ­ÏÍ2ŽaÇxgŒcT1aÄ8F ãEœ0ŽaÁ8†ãeÜ/Ža¾8†õâÆ‹—q»8Féâ–‹_Æáâ÷õµY²Å1¬/ãhq ›Å1L/ãbq ƒÅ1ìÇ<_þtí«ñú…HQ¬8„­â¦Š—q©8†¡âvŠ—q¦8†•âFŠcÔ(^ĉâ˜íÏœÅ˸Oà b~X„þ°Fb Ä"%ˆEj‹!±B,R†X¤±H!bKÄ"¥ˆEjƒ#©F,RŽX¤1ˆAb‘ŠÄ"%‰Al‹%©J,B–Ã.±Hab‘ÊÄAN‹Ô&é/¾Eªƒ˜'©O,R ÄB±è ÿšS¤F±H‘b+Å"eŠEê‹*±T,RªX¤V1ˆ±bjÅåŠEêƒ,©X,R²Äf±è}£\-)[ b·X¤p±HåbÓÅ"µ‹EŠ‹žøiªA΋Ô/ý§€±¿JcÆ"5ŒEˆcX1)c,RÇX¤1ˆ%c‘RÆ"µŒAŒ‹T3)g,RÏÄ ±HEc‘’Æ 6EŠ‹T5)k b×X¤°±Hec‘ÒÆ µ5Š‹T71o,RßX¤À±H…ã 'ŽEj‹9±r,RæX¤Î±H¡cKÇ"¥ŽEjƒ;©v,RîX¤Þ1ˆÁc‘ŠÇ"$1l‹=©z,RöÄî±Hác‘ÊÇ"¥Al‹?©~ bþX¤þ±Hd‘ È &Ej ‹ArY¤ ²Hd‘BÈ •5J!‹ÔB1†,zÛß(çEÏýrY¤"²HId‘šÈ F‘Eª"‹”E±‹,RY¤2²HidÛÈ"Å‘Eª#ƒ”GÖ¼ïOÉ’AO%’Ej$‹I±’,R&Y¤N²H¡ä —’EJ%‹ÔJ)– b-Y¤\²H½dƒÉ"“EJ&‹ÔL1š,B5Y£l2HÝdÂÉ"•“EJ'ƒØN)ž,R=Ä|²HýdÊ”AL(‹ÔP)¢,REÄŒ²He‘BÊ –”EJ)‹ÔR!¦ãš²9ezÊ •E**‹”T©© bTY¤ª²HYeºÊ…•E/²®BieÛÊ"Å•Eª+ƒ˜W½í“Ë"–AL,‹ÐXÖ(²,BeÃ̲He‘BË ––EJ-‹ÔZ)¶ bmY„ܲF½å —5ïûÛää²HÍe£Ë"U—EÊ.ƒØ]½/_“ý•Ê1‹^÷˜±½,B|Y£ú²HùeûË"˜E*0ƒ˜`©Á,R„Y„ 3†fÑú‡!fKÌ"¥˜Ej1‹cýýÿ]/1Ç,RÄ ³HEf‘’Ì"4™ce©Ê,R–Y¤.3ˆaf‘ÊÌ"¥™Al3‹gÖ¨Î,BžÃ>³Hf‘ Í &šEj4‹i©Ò b¦Y¤N³H¡fKÍ"¤š5j5‹k±Ö,R®Y¤^³HÁf‹Í"%›Eh6cmíg”m©Ûäp³Håf‘ÒÍ ¶›EŠ7‹To)ß b¿Y¤€³g Î"5œEÿâgY]q1ã,RÇY¤3ˆ%gRεœEˆ9cXs)ç,RÏY¤ 3ˆEg‘’Î"5AŒ:‹Tu)ë,Rפ°³Feg‘ÒÎ -mgÑûŠ;¿þœßâÎûß]âÏÓƒwý¿/òB'îÄ¥wêRãN]jÜùúÒ·¸S¨qçëûwêRãN\:q'.¸S¨q'Љ;…w 5îj܉oAãN:q§5îÄ¥w 5îÄÇ5îÔ¡Æ8tâN\:q§.5îÄ¥wâÒ‰;u©q§PãN|܉;qéĺԸS—wâÒ‰;qéÄB;NÜ)Ô¸S(q§LãÎ×ßoqçëKßâN¢üeX׸S—wòRâN^JÜ©K;u)q'%îԡƺԸ“(q'?.q§.5îԥƼ”¸“—w 5î$Ê_†‰w 5î$JÜ©oAãN^JÜ)Ô¸“è¶¾QßâN}á;u©q'/%î䥉;u¨q§5îä¥Ä¸tâN¢Äø¸wòRâN]jÜ©K;‰w 5î$z›ó!º­oÔ·¸S߂ƺԸ“—wòÒçþF¸S׸“—žûuâN]JÜÉC÷ý:q§.5îÔ¥ÆDý:q§.5îä¥ûþF¸Sèù×þF¸“豿Q'î$zÛߨwòÒóÇõË¥wâÒ‰;‰/ߨßâÎüªÏýÑ:q§~';yé¹>Z'îԡƼtß­wêRãN]jÜIôØ­wêRãN¢ûþh¸S¨q'ÑÇþh¸S߂ƺԸ“—nû£uâN]jÜIô±?Z'îä¥ÏýÑjÜ©CÏÛþh¸S—wêRãN^JÜÉKŸû£uâN|܉;y)q§.5îÔ¥ÆD÷ýÑ:q§PãN¢ýÑ:q§¾;u©q'/ÝöÇéÄB;õ…7îä¥Ûþ8¸S—wêRâNºÿxœ~=ôùg{ÀNÜItÛ§wêRãN]jÜÉK÷ýq:q§.5î$úX§w5î¤yßߦwâpâN]jÜI”¸“豿M'îüçþªÛ̯|Û¬wêûÒ¸S—wêRâNºï/Ö‰;õi;u©q'/=÷ëĺԸ“—îû‹Õ¸S¦q'Ñú‡°q§PãNýöwòRâN¢ÄB;‰>öëĺԸS—wòÒm²wâЉ;qèļôØÿÅàÄú¸ÆºÔ¸“—žû“uâN¢÷õÉ:q'Ñçúd=wÝö'ëĺԸS—wòÒ}²NÜ©kÜ©K;y鱿N'îÔ¥Äÿþá‘m¹s—;/´,wòrç /wòrçÚ–;y¹s—;y¹óBËrç /wòrç…–åÎA^îäåÎA^î¼—;Çx¹s—;/´,wòrç .wŽñrç…–åÎA^îäåÎ -˃¼Ü9È˃¼Üy¡e¹s—;y¹s—;/´,wòrç /w^hYîäåÎA\îãåÎ/´-wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ´ÜÃåÎA^î ârg—;ƒ¸Ü9ÈËA\î ârg—;y¹3ˆËA\îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ .wòrg—;ƒ¸Ü¤åÎ1^î ârg—;/´,wq¹3ˆÿµ£ .wòrg—;ƒ¸Ü9ÈËAoðô ârg—;y¹3ˆËA\î ârç /wÝö7jYîäåÎ -wÆp¹3ˆËƒ¼ÜÄåÎ .wòrgÐûþF-ËA\îôärg—;ƒ¸Ü9ÈËA\î ârg—;/´,wq¹3è¿-wæWq¹s—;ƒ¸Ü¤åÎ1^î ârg—;ƒ¸Ü9ÈËA\î ârç /wq¹3ˆËA\îäåÎ .wq¹s—;ƒ¸ÜÄåΠ§þ+”ƒ¼ÜÄåÎ .wq¹s—;c¸ÜÄåÎA^î ârg—;ƒ¸Üy¡e¹3ˆËA\îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA^î ârg–;Çx¹3ˆËA\î ârç /wq¹3ˆËA\îäåΠÛþF-˃¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎ -ËA\î ârg—;q¹3†ËA\îäåΠ·ýZ–;ƒ¸Ü9ÈËA\î ârg—;y¹3ˆËA\îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ .wârgÌûþDy¹3†Ëƒž\î ârg—;y¹3ˆËA\î zîOÔ²ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA^î ârg—;ƒ¸Ü9ÈËAZîŒárç .wÆp¹3ˆËA\îäåÎ .wq¹s—;ƒ¸Ü¤åÎ.wòrg—;ƒ¸ÜÄåÎA^î ârg—;y¹3ˆËA\î Òrçe–åΠÛú@-˃¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA\îŒárgÐëå„.wòrg—;ƒ¸Ü9ÈËAoûã´,wq¹s—;ƒ´ÜÃåÎ -wŽñrgÐmœ–åÎA^î ârg—;ƒ¸Ü9ÈËAZîŒárç…¼Üó¾¿MËrg—;y¹3ˆËA¯—;_u›ó+=çôzÎóârg—;y¹3HË1\î ârç /wq¹3ˆËƒ¼ÜÄåÎ .wi¹sŒ—;ƒÖ?Î^îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ .wòrg—;ƒ¸Ü¤åÎË,ËA\î ârg—;y¹3ˆËA\îäåÎ -wÆp¹3HËc¼ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA^î ârg—;y¹3HË1\î ârç /wq¹3ˆËA\îäåÎ .wi¹sŒ—;ƒö3\î ârç…–åΠ۟­#Ø–;y¹3ˆËA\î ârç /wq¹3HËc¼ÜÄåΠñ³¬Ërç /wq¹3ˆËƒ¼Ü¤åÎ.wi¹sŒ—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Ü9ÈËA\î ârg—;q¹3†ËA\îüBÛrgÐûYîüüú½%î bÜ9ÈqgãÎ ÆAŒ;/´ÄAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ˆqg ãΠƃw1î RÜøsãÎ ÆAŒ;9î bÜĸ3詸sãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒwÆ0î¼Ðw)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹wÖ(î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEˆ;cw)î,RÜ9Èqg‘âÎ"ý…¸HqgãÎ"ÅEŠ;ƒw½áß|Šw)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,BÜY£¸³HqgãÎ"ÅEŠ;ƒw½ïo”ãÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎAŽ;‹w½Ž;¿¡×-ç/h~ãÎ"ÅEˆ;cw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w=ñ¨bÜY¤¸³Hqg‘âÎ Å5Š;‹w}*î,RÜY¤¸³Hqç ÇEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"Ä1Œ;‹w)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹wrÜY¤¸³Hqg‘âÎ Å5Š;‹w1î,zÛß(ÇEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ Å5ïûŸ³FqgãÎ"ÅEŠ;ƒw)î,RÜYôÜŸ(ÇEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,BÜY£¸3HqgâÎ"ÅEŠ;ƒw)î,RÜĸ³HqgâÎÅAŒ;‹w)î,RÜĸ³Hqg‘âΠOÅEŠ;‹w!î㸳qgâÎ ÆEŠ;‹w)î bÜY¤¸³HqgâÎÅE/¸®BqgãÎ"ÅEŠ;ƒw½í“ãÎ"ÅAŒ;‹wÖ(î,BÜø³Hqg‘âÎ ÆEŠ;‹w)î bÜY„¸³Fqç Æ5ïûÛ丳HqgâÎIf¥ŠÏ¢×ÅçAŒ;‹w)î,RÜĸ³qgâÎ"ÅAŒ;‹w)î bÜY¤¸³HqgâÎÆEëŸ7ÆAŒ;‹w)î,RÜĸ³Hqg‘âÎ ÆEŠ;‹w!î㸳Hqg‘âÎ"ÅAŒ;‹w)î bÜY„¸³FqgâÎÆEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw!î¬QÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,BÜ󩸳h?£¸³Hqç ÇEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEˆ;cw)î,ú?Ëê¸3ˆqg‘âÎ"ÅAŒ;‹wÖ(î,BÜø³Hqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎ Å5Š;‹w^h‰;‹ÞÿSÜù¿ÿç¹; jÜùÛ¼è wâÒ‰;u©q§.5î|}é[Ü)Ô¸óõÇ}‹;u©q'.¸—NÜ)Ô¸èÄB;…w 5îÄ· q'¸S‡wâÒ‰;…wâãwêPãN:q'.¸S—wâÒ‰;qéĺԸS¨q'>îĸtâN]jÜ©K;qéĸtâN¡Æ@Ÿ;…w %î”iÜùú;ð-î|}é[ÜIôø³\ãN]jÜÉK‰;y)q§.5îÔ¥Ä<”¸S‡wêRãN¢Äü¸ÄºÔ¸S—wòRâN^JÜ)Ô¸“(&JÜ)Ô¸“(q§¾;y)q§PãN¢ÛúF}‹;õ…7îԥƼ”¸“—&îÔ¡Æ:Ô¸“—wâÒ‰;‰wâãNÜÉK‰;u©q§.5î$JÜ)Ô¸“èmþ͇趾QßâN} wêRãN^JÜÉKŸûuâN}\ãN^zîoÔ‰;u)q'Ý÷7êĺԸS—w=ö7êĺԸ“—îûuâN¡ÆDûuâN¡ÆDoûuâN^zþx£~¹tâN\:q'Ñc£NÜùÏK¿Åó«wêtãN}‘‰;u¨q§5îä¥ûþh¸S—wêRãN¢Çþh¸S—wÝ÷GëÄB;‰>öGëÄú4îԥƼtÛ­wêRãN¢ýÑ:q'/}îVãNjÜÉCÏýÑ:q§.5îä¥Ä¼ô¹?Z'îÄǸ“—wêRãN]jÜItß­w 5î$úØ­wê[иS—wòÒýÇ£õë¥çþ«wêãwòÒc}£NÜ©C;yé¶¿Q'îԥƺԸ“辿Q'îԥƺԸ“—žûuâN¢÷ý:q'ÑçþF¸S߂ƼôØß¨wâÒ‰;y龿Q'îÔÇ%îÔ¡Æ<ôØß¨wêRãN^ºíoÔ‰;…w}ìoÔ‰;õ…7îÔ¥ÆD·ý:q§PãN¢÷ý:q§¾;u©q§.5îä¥Ç7ê·K‰;u¨q'Ñ}}¢NÜ©C;u©q'/=ö'êĺԸ“èöã‰ú=÷'êÄøÂOÜÉKOÔ¯—>÷'êÄD·ý‰:q§PãN}á;yé¾?Q'îԥƺ”¸“‡û Õ¸SÖ¸“‡îû uâN]jÜ©K;y)q§.5îÔ¥ÆDwÒ<÷êÄúºwòÒc NÜ)Ô¸“è¶?P'îԥϿöêļtߨÆ8tâNjÜIóبwêRãN^ºïÔ‰;u©q§.5îä¥Çþ@5î¤yßß§‰;õE7îÔ™ÆDûãtâN¡ÆúÂwòÒmœNÜ©K;u)q'Ý÷ëŸD‰;‰ûƒuâNü?ç‰;yé¶?X'îԥƺ”¸“‡îû‹uâN}ZãN]jÜÉKÏýÅ:q§.5îä¥ûþb5î”iÜI´þykÜ)Ô¸S¿ýƼtß_¬w 5î$úØ_¬wêRãN]jÜÉK·ýÉj܉C'îÄ¡wòÒcÿƒwêãwêRãN^zîOÖ‰;‰Þ×'ëÄDŸë“õlÜIt{ùd}C?žõ·K;u©q'/Ý÷×éÄú¸ÆºÔ¸“—ûëtâN]JÜÉC·¯Ó¯‡ž¶Nâ[ÜIô±¿N'îä¥Ïýu:q§.=þ<믗žëëtâN¢ýÌ}N܉/úĸtâN^zî¯Ó‰;‰Þ÷×éļô¹¿N'îԥƼôX_§wêPãN^ú?ËzâN}\ãN]jÜÉKýu:q§.%îä¡Ûþ:5î”iÜIôó'YE÷ýu:q§¾;u©q'/=÷×éÄú¸Æ¼tß_§wêRâNjÜÉCõuúw¾¾ô-îüåÒ/qç׫¸Åƒw^h‰;9îä¸sãÎ/´ÅƒwrÜ9Èqç…–¸sÐqç ÇZâÎAŽ;9îä¸óBŽ;Ç8îä¸óBKÜ9Èqç Æcw^h‰;9îä¸óBKÜ9Èqç ǃw^h‰;9îä¸sãÎ -qç ǃw^h‰;9îĸsŒãÎ/´ÅAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒwÆ0îä¸3ˆqgãΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgâÎ1Ž;ƒw1î¼Ðw1î â_ˆƒwrÜĸ3ˆqç ÇAoú7Ÿ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrܤ¸3†qgãÎAŽ;ƒw1îä¸3è}£–¸3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎ -qgãÎ ÆAÿ-îœ_å¸3覟JRÜ9ÆqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãΠƃwÆ0î bÜ9ÈqgãÎ ÆAŒ;/´ÄAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠçþ«%î bܤ¸sŒãÎ ÆAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î bÜy¡%î bÜĸ3ˆqç Æ1Œ;ƒwrÜô¶¿QKÜĸsãÎ ÆAŒ;ƒwrÜtÛߨ%îä¸3ˆqgãΠƃw1î bÜ9ˆqgÌûþD9îŒaÜ9ÈqgãΠƃw1î bÜĸóBKÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw)îŒaÜ9ˆqg ãÎ ÆAŒ;9î bÜĸsãÎ ÆAŠ;cžûµÄAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î RÜy™%î RÜøsãÎ ÆAŒ;ƒwrÜĸ3ˆqç Æ1Œ;ƒ^ÿp]ãÎAŽ;ƒw1îä¸3èmœ–¸3ˆqç ÇAŠ;cw)îã¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgâÎÆrÜóþòmzÕmæW¾.>¿!ƃw1î bÜ9ÈqgãÎ ÆAŒ;9î RÜø3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgâÎ1Ž;ƒÖ?oŽ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgÐs}²–¸3ˆqgãΠƃw1î bÜ9ÈqgâÎÆAŠ;Ç8î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŠ;cw=¼N¿]rÜĸ3ˆqgãÎAŽ;ƒw)îã¸3h?ø3ˆqç…–¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ Åcw1î ú?˺ăw1î bÜ9ÈqgâÎÆAŠ;Ç8î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŒ;cw1îüB[Üôþïãη¿+ž¿þßrç?GAjÜùÏQТwâÒ‰;u©q§.5î|}é[Ü)Ô¸óõÇ}‹;u©q'.¸—NÜ)Ô¸èÄB;…w 5îÄ· q'¸S‡wâÒ‰;…wâãwêPãN:q'.¸S—wâÒ‰;qéĺԸS¨q'>îĸtâN]jÜ©K;qéĸtâN¡Æ@'îjÜ)”¸S¦qçëïÀ·¸óõ¥oq'ÑãÏþq;u©q'/%îä¥ÄºÔ¸S—wòPâNjÜ©K;‰wòãžÎèRãN]jÜÉK‰;y)q§PãN¢üe˜(q§PãN¢Äú4îä¥ÄB;‰nëõ-îÔÞ¸S—wòRâN^š¸S‡wêPãN^J܉K'î$J܉;q'/%îԥƺԸ“(q§PãN¢·ù7¢ÛúF}‹;õ-hÜ©K;y)q'/}îoÔ‰;õq;y鹿Q'îԥĮq'/=Ö7êÄ:Ô¸“—nûuâN]jÜ©K;‰îûuâN]jÜ©K;y鹿Q'î$zßߨw}îoÔ‰;õ-hÜÉKý:q'.¸“—îûuâN}\âNjÜÉCý:q§.5îä¥ÛþF¸S¨q'ÑÇþF¸S_xãN]jÜItÛߨw 5î$zßߨwê[иS—wêRãN^züx£~»”¸S‡wÝ×'êÄ:Ô¸S—wòÒc¢NÜ©K;‰n?ž¨_Ñs¢N܉/üļôøñDýzés¢NÜItÛŸ¨w 5îÔÞ¸“—îûuâN]jÜ©K‰;y豿P;õa;y辿P'îԥƺԸ“—wêRãN]jÜI4q'Ís NÜ©¯»q'/%î$úܨwÝöêĺԸS—wòÒ} wâЉ;q¨q'Íc NÜ©K;yé¾?P'îԥƺԸ“—ûÕ¸“æ}Ÿ&îÔݸSgw}ìÓ‰;…wê oÜÉK·ýq:q§.5îÔ¥ÄN'îü'úµÉì¯lñ‰ë§ø$J܉ïʉ;u©q'QâN¢Çþ`¸S_xãN^ºíÖ‰;u©q§.%îä¡ûþb¸SŸÖ¸S—wòÒs±NÜ©K;y龿X;ew­Þw 5îÔo¿q'/Ý÷ëÄB;‰>öëĺԸS—wòÒm²wâЉ;qèļôØÿÅàÄú¸ÆºÔ¸“—žû“uâN¢÷õÉ:q'Ñçú:=w%îÔ7àýçϳþv©q§.5îä¥ûþ:¸S׸S—wòÒcNÜ©K‰;yèöãuúõÐóÏÖI|‹;‰>ö×éļô¹¿N'îÔ¥çÏŸgýõÒs}NÜI´Ÿ¹ï¯Ó‰;ñEŸ¸—NÜÉKÏýu:q'Ñûþ:¸“—>÷×éĺԸ“—ëëtâNjÜÉKÿâgYOÜ©kÜ©K;y鱿N'îÔ¥ÄS&•y¾³¯iœ)“6¿÷¦™º“2¦a¦Ìm{u¾e™øš[eâN£LÝI“©;Ÿ¶?†-2q¦A¦î¤Ç|}çä˜2©1_Ö‰1u'-&î4ÅÄ–˜2 1aÚaʼͿÎÈܶWç[„‰ß{LÜi‚©;)0uçs}uN‰Ïj~©;ÏõÕ9ñ%ԙûúêœòw^âN»K™Çúêœêw]êÎ}}uNr ÓâRæc}uNo ÓÜRæm}uNl©;ϯÎ?ïœÔòõSZÊ<ÖWçt–¸ÓÌòŸw~Ë,祲Ôáçö ÆgšXêÎ}}†N`‰;í+q§y¥Ìc}†N\‰;m+eîë3tÊJ˜†•2ë3t²JüÞ[UâN£Jݹ­ÏÐI*q§E¥ÌÇú žRw>×g¨5%Î4¦Ô™çú ”wZRêNBJÝù\Ÿ¡“Q¾þ¬SQêN"JÜiC‰;M(eîë3tJ˜ö“2ë3têIüÞOâNÛIݹÿx†~»ó\Ÿ¡Nâ³ÚMêÎc{uN5‰3&uç¶¾:'™Ä“¸Ó`Ræ¾¾:'—ÄÖ’¸ÓXRwžë«sRI™÷õÕ9¡¤ÌçúêœL¿÷V’ºóX_ÓH¾¾sIݹ¯¯Î $ñYé#q¦y¤Î<ÖWçÄ‘¸Ó6Rwnë«sÊH˜†‘2ë«s²H|Í­"q§Q¤Ìm}uN Ó"Ræ}}uN‰ß{sHÜi ‰;!uçñãÕùåNRHœi )sßÓAâL3HÜi©;õÑ9 $î4”¹ýxt~3ÏõÑ9ýãë¯ùäºóøñèüvçs}tNû(s[S>Â4|Ä×ÜîQwîë£sªGÜiôˆ;iuæ±¾9-ñI uæ¾¾9'wÄÖŽ¸ÓØQwÒ:âNSGÜié(3¡£Ès}rNæˆ/¹•£î<Ö'ç4Ž0Menë“sGÜi߈;Íuç¾>9_Ÿ9mãë3MEë“sÂFÜiר;÷õÉ9U#î4jÄ6ºóXŸœ"ïë‹3=#¾ÞæŒ8ÒšQæc}nNËÓ”_sKFݹ­ÏÍéq§#î¤bÔ™ûçæ·3Ÿ–é$Œ2·õ¹9#î´_Äæ‹ÿ¼óª'œ_x_ß S4â‹lÐ(ó±½A§\|m.м¯OÐÉ_ÿÎOµˆ;eÒ,Ê<Ö'è‹øš,êÎm}‚N®ˆ;­q'±¢ÎÜ×7褊ø¨–ЏÓPQwžët2EÜi¥¨;÷õ j£ÒDQfûãÕ@¦}"~ßÍuç¾¾A'N„i›(ó±¾A§LƉ¸Ó.Qwnë#Ô*ñõ™%¾>sšDÝy¬ƒ?E">«A"î´GÔçúÞœQæ}{oN‹(ó¹½7Ï–ˆ2·õ½9"î4CÄVˆºs_ß›Ó â³š âN DÝy¬ïÍéq'ù¡ÎÜ~¼7¿yþY~¦ÿ[{(ó±¾7§<ÔÏõ½9Ý!î<þœæowžÛ{s¢C™õÈ}}oNqøúë=Ááë;§7ÔçúÞœÚPæ}}oNk¨;Ÿë{sJCÜih¨;í½9™!δ2Ôýg4OcˆÏjbˆ;- uç±¾7§/Ää…:s[ߛƅ m e~þ„æoæ¾¾7',Äï¼]!î4+ÔçúÞœ¨ŸÕ¦Pwîë{sŠBÜIPˆ3í uæ±½7o§&|yçíÄ„ÿ¼óKLø××?â/K‘A\Šä¥È .Eq)2ˆK‘Z–"ƒ¸Ä¥È .EòRd—"ƒ¸9ÈK‘A\Š âRd—"q)2†K‘A\Šä¥È .Ei)2†K‘ƒ¼Ä¥È .EòRd—"ƒ¸Ä¥ÈA^Š âRd—"ƒ¸9ÈK‘A\Š âRä /Eq)2HK‘1\Š¼Ð²Y¤¥È"-Eq)²HK‘EZŠ,ÒRd—"‹°Y£¥È .Ei)²HK‘EZŠ âRd‘–"‹´Y¤¥È .Eýü/ëüŠ´Ä¥È"-Ei)²HK‘A\Š,ÒRd‘–"ƒ¸Y¤¥È"-Ea)2†K‘EZŠ,ÒRä /Ei)²Hÿu"-Eq)²HK‘EZŠ âRdÑÛŸ×ÿ©"-Ei)2ˆK‘EZŠ,ÒRd‘–"ƒ¸Y¤¥È"-Eq)²K‘5ZŠ,ÒRd—"‹´Y¤¥È .E½ïo”—"‹žûå¥È"-Ei)2ˆK‘EZŠ,ÒRd‘–"y)²HK‘EZŠ,ÒRdÐ[Šì¯ÒRd–"c¸Y¤¥È"-Ei)2ˆK‘EZŠ,ÒRd—"‹´Y¤¥È"-Eq)²HK‘EZŠ âRd‘–"‹´Y¤¥È .Ei)²HK‘EZŠ ÒRdÍm´¼Ä¥È"-Ei)²HK‘ƒ¼Y¤¥È"-Eq)²HK‘EZŠ,ÒRd—"‹´Y¤¥È .Ei)²HK‘EZŠ âRd‘–"‹°Ã¥È"-Ei)²HK‘A\Š,ÒRd‘–"‹´Ä¥È"-Ei)2ˆK‘EZŠ,ÒRd‘–"ƒ¸Y¤¥È"-EòRd‘–"‹´Y¤¥È -EÖh)²HK‘A\Š,zÛß(/Ei)2ˆK‘EZŠ,ÒRd‘–"ƒ¸Y¤¥È"-Eq)²HK‘EZŠ,ÒRd—"‹´Y¤¥È -EÖ¼ïO—"kž˜5 âRd‘–"‹´Ä¥È"-Ei)²HK‘ƒ¼Y¤¥È"-Ei)2è/-Ei)²HK‘A\Š,ÒRd‘–"‹´Ä¥È",EÖh)2HK‘5ZŠ,ÒRd‘–"ƒ¸Y¤¥È"-Eq)²HK‘EXЬÑRd—"‹´Y¤¥È"-Eq)²è¶?P^Š âRd‘–"‹´Y„¥È1^Š,ÂRd–"ƒ¸Y¤¥È"-Ei)2ˆK‘EZŠ,ÒRd–"k´Yôò¿Ô_¡¥È .Ei)²HK‘A\Š,zÛ'/Ei)2ˆK‘EXЬÑRd–"c¸Y¤¥È¢×K‘/ÉüJÎGi>²Hó‘Eš Â|ä7„¥È-EâRdÍûþ`y)²è¹?X^Š,ÒRd‘–"ƒ¸Y¤¥È"-Ei)2ˆK‘EXЬÑRd‘–"ƒ¸Y¤¥È"-Eq)²HK‘EZŠ,ÂRd —"‹Ö?o\Š âRd‘–"‹´Y¤¥È .Ei)²HK‘A\Š,ÒRd‘–"‹°9ÆK‘EZŠ,ÒRd‘–"ƒþÒRd‘–"‹´Ä¥È",EÖh)²K‘1\Š,ÒRd‘–"ƒ¸Y¤¥È"-Ei)2ˆK‘EZŠ,ÒRd—"‹°Y£¥È"-Eq)²HK‘EZŠ,ÒRd—"‹´Y„¥È.Eíg´Y¤¥ÈA^Š,ÒRd‘–"ƒ¸Y¤¥È"-Ei)2ˆK‘EZŠ,ÂRd —"‹´Yô/~–ÕK‘A\Š,ÒRd‘–"ƒ¸Y„¥È-Ea)2†K‘EZŠ,ÒRd‘–"ƒ¸Y¤¥È"-Eq)²HK‘EZŠ,ÒRd–"k´Y¤¥È ½y)²èý¿,EþïÑýïo5[Ü9Èqç…–¸sãÎAŽ;9îüB[Ü9Èqç ǃw^è/ǃwrÜy¡%îä¸sãÎAŽ;/ä¸sŒãÎAŽ;/´ÄƒwbÜ9Æqç…–¸sãÎAŽ;/´ÄƒwrÜ9Èqç…–¸sãÎAŽ;9î¼ÐwrÜ9Èqç…–¸sãÎAŒ;Ç8îüB[Üĸ3ˆqç ÇAŒ;ƒw1îä¸3Hqg ãÎAŽ;ƒw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw)îã¸3ˆqgãÎ -qgãÎ þ…8ˆqç ÇAŒ;ƒwrÜô¦ó bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŠ;cw1îä¸3ˆqgãÎAŽ;ƒÞ÷7j‰;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1î¼Ð›ãÎ ÆAŒ;ƒwúëuÜù ½n9+@ó«wŽqÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸ3ˆqç Æ1Œ;ƒwrÜĸ3ˆqgãÎ -qgãΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwŽqÜĸ3è¶¿QKÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç…–¸3ˆqgãΠƃwÆ0î bÜ9ÈqgÐÛþF-qgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎ ÆAŒ;1îŒyߟ(Ç1Œ;9î bÜĸsãÎ ÆAŒ;ƒw^h‰;ƒw1î bÜ9è/ÆAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒwÆ0îĸ3†qgãΠƃw1î bÜ9ÈqgãÎ Å1Œ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgâÎË,qgâÎƃw1î bÜĸsãÎ ÆAŒ;1îŒaÜôú‡ë"wrÜĸ3ˆqç ÇAoûã´ÄAŒ;9î RÜø3èeÜùª¶œ_èâ3ˆÅgÐëâó ÇAŒ;ƒw1îä¸3Hqg ãÎ 9îŒy߬%î bÜ9ÈqgãΠƃw1î bÜĸsãÎ Å1Œ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw)îã¸3hýóæ¸sãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw)î¼Ìw1î bÜĸsãÎ ÆAŒ;9î RÜø3HqçÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3Hqg ãΠƃw1î bÜĸsãÎ ÆAŠ;Ç8î ÚÏ0î bÜy¡%î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3HqçÇAŒ;ƒþÅϲ.qç ÇAŒ;ƒwrܤ¸3†qgâÎ1Ž;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎÆAŒ;¿Ðw½ÿ§¸óÿ‹ý¹Æƒw^h‰;9îtcÜ9ÈqçÚâÎAŽ;9îä¸óBKÜ9Èqç ÇZâÎAŽ;9îä¸óBŽ;Ç8îä¸óBKÜ9Èqç Æcw^h‰;9îä¸óBKÜ9Èqç ǃw^h‰;9îä¸sãÎ -qç ǃw^h‰;9îĸsŒãÎ/´ÅAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒwÆ0îä¸3ˆqgãΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgâÎ1Ž;ƒw1î¼Ðw1î â_ˆƒwrÜĸ3ˆqç ÇAoú7Ÿ ÛúFmqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒwÆ0î bÜ9ÈqgãΠƃw½ïoÔw1îä¸3ˆqgãÎAŽ;ƒw1î bÜy¡7ÇAŒ;ƒw1îä¸3è¿ÅùUŠ;Ç8î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgÐçþh-qgãΠƃw1î bÜĸsãÎ ÆAŒ;ƒwbÜø3ˆqç ÇAŒ;ƒw1î¼Ðw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3HqçÇAŒ;ƒnûµÄƒw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒw^h‰;ƒw1î bÜ9ˆqg ãΠƃw½íoÔw1îä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãΘ÷ý‰rÜøsãÎ ÆAŒ;9î bÜĸ3ˆqç…–¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î RÜøsãÎÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒwÆ0îä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŠ;/³ÄAŠ;cwrÜĸ3ˆqgãÎAŽ;ƒw1îĸ3†qgÐ뮋`Ü9ÈqgãΠƃw½íÓw1óUo™_©â3†Ågæ<Ç8î bÜĸsãÎ ÆAŒ;ƒwrܤ¸3†qç…wƼïÖw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgâÎÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwŽqÜ´þysÜ9ÈqgãÎ ÆAŸÊg9î bÜĸsãÎ ÆAŒ;ƒw^f‰;ƒw1î bÜ9ÈqgãΠƃw)îŒaܤ¸sŒãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrܤ¸3†qgãÎAŽ;ƒw1î bÜ9ÈqgãÎ Åcwígw1î¼Ðw1î bÜ9ÈqgãÎ ÆAŒ;9î bܤ¸sŒãÎ ÆAÿâgY—¸sãÎ ÆAŒ;9î RÜø3HqçÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ˆqg ãÎ Æ_h‹;ƒÞÿKÜù¿ÿ_ËÇí{Üyÿ»Küq:¨qgÐ÷/rЉ;qéĺԸS—w¾¾ô-îjÜùúã¾ÅºÔ¸—N܉K'îjÜ tâN¡ÆB;…wâ[и‡NÜ©C;qéÄB;ñq;uè3q'¸—NÜ©K;qéĸtâN]jÜ)Ô¸wâN\:q§.5îԥƸtâN\:q§PãN w 5îJÜ)Ó¸óõwà[ÜùúÒ·¸“(ÖÇ5îԥƼ”¸“—wêRãN]JÜÉC‰;u¨q§.5î$JÜÉKÜ©K;u©q'/%îä¥ÄB;‰ò—a¢ÄB;‰wê[и“—w 5î$º­oÔ·¸S_xãN]jÜÉK‰;yiâNjÜ©C;y)q'.¸“(q'>îS—wêRãN¢ÄB;‰Þæß|ˆnëõ-îÔ· q§.5îä¥Ä¼ô¹¿Q'îÔÇ5îä¥çþF¸S—wòÐ}£NÜ©K;u©q'Ñc£NÜ©K;y龿Q'îjÜIô±¿Q'îjÜIô¶¿Q'îä¥ç7ê—Ko;qéÄDý:q§.5îÔ¥Æÿ¼ôKÜÙ_õ\­wêklÜÉK÷ýÑ:q§.5îÔ¥ÆDýÑ:q§.5î$ºïÖ‰;…w}ìÖ‰;õ-hÜ©K;yé¶?Z'îÔ¥ÆDû£uâN^úÜ­Æ:Ô¸“‡žû£uâN]jÜÉK‰;yés´N܉;q'/%îԥƺԸ“è¾?Z'îjÜIô±?Z'îÔ· q§.5îä¥ûGë×KÏýÑ:q§>®q'/=Ö7êÄ:Ô¸“—nûuâN]jÜ©K;‰îûuâN]jÜ©K;y鹿Q'î$zßߨw}îoÔ‰;õ-hÜÉKý:q'.¸“—îûuâN}\âNjÜÉCý:q§.ýýWðýÒm£NÜ)Ô¸“èc£NÜ©/¼q§.5î$ºíoÔ‰;…w½ïoÔ‰;õ-hÜ©K;u©q'/=~¼Q¿]JÜ©C;‰îëuâNjÜ©K;yé±?Q'îÔ¥ÆD·OÔ¯è¹?Q'îÄ~âN^züx¢~½ô¹?Q'î$ºíOÔ‰;…wê oÜÉK÷ý‰:q§.5îÔ¥Ä<ôØ_¨Æú°Æ®q§.5îä¥Çþ:¸S—wòÐíÇëôë¡çŸ­“øw}ì¯Ó‰;yésNÜ©KÏŸ?Ïúë¥çú:¸“h?sß_§wâ‹>q'.¸“—žûëtâN¢÷ýu:q'/}î¯Ó‰;u©q'/=Ö×éÄ:Ô¸“—þÅϲž¸S׸S—wòÒcNÜ©K‰;yè¶¿N;ewýüIÖ_Ñ}NÜ©o@ãN]jÜÉKÏýu:q§>®q'/Ý÷×é唸S‡wòÐc}¾Å¯/}‹;ÿyé·¸óÿ›öm[î ârç /wq¹3ˆËA\î¼Ð²ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA^î ârg—;ƒ¸Ü9ˆË1\î ârç /wq¹3HË1ŸZîäåÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA^î ârg—;y¹3ˆËAZîŒárç…–åÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY„åÎ-wq¹³HËEZî,Òrg—;‹´ÜY¤åÎ"-wq¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹°ÜÃåÎ"-wi¹s—;‹´ÜY¤ÿÚQ‘–;ƒ¸ÜY¤åÎ"-wq¹³èíÏëÿ W‘–;‹´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒ¸ÜY„åÎ-wi¹3ˆËEZî,Òrg—;‹Þ÷7ÊËEZî ârg‘–;‹´ÜÄåÎ"-wi¹³H˃޸ÜY¤åÎ"-wi¹3ˆËEÿi¹³¿ Ë1\î,Òrg‘–;‹´ÜÄåÎ"-wi¹3ˆËEZî,ÒrgÑçþhy¹³HËEZî ârg‘–;‹nû£ååÎ .wi¹³HËEZî Òrg–;‹´ÜÄåÎ"-wi¹³H˃¼ÜY¤åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY¤åÎ .wi¹³HËEZî ârg‘–;‹°ÜÃåÎ"-wi¹³HËA\î,Òrg‘–;‹´ÜÄåÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wòrg‘–;‹´ÜY¤åÎ -wÖh¹³HËA\î,zÛß(/wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY¤åÎ -wÖ¼ïO—;k´ÜÄåÎ"-wi¹3ˆËEZî,ºá?ä_¤åÎA^î,Òrg‘–;‹´ÜÄåÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY„åÎ-wi¹³FËEZî,Òrg—;‹´ÜY¤åÎ .wi¹³Ë5Zî ârg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹°Ü9ÆËEXî¬Ñrg—;‹´ÜY¤åÎ"-wq¹³HËEZî Òrg–;‹^.'Th¹3ˆËE¯—;_Õ–ù•šó âœgÑÛþbyγHsžA˜óü†°ÜY£åÎ",wÆp¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wa¹³F˃¸ÜYó¾?X^î,Òrg—;‹´ÜY¤åÎ .wi¹³HËEZî ârg–;k´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹°ÜÃå΢õÏ—;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Òrg—;‹´ÜYtÛ_'.wŽñrg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Ârg–;‹°ÜÃåÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³Ë5Zî,Òrg—;‹´ÜY¤åÎ"-wq¹³HËEXîŒárgÑ~FËEZîäåÎ"-wi¹3ˆËEZî,Òrg‘–;ƒÞ´ÜY¤åÎ",wÆp¹³HËEÿâgY½ÜÄåÎ"-wi¹3ˆËEXî¬Ñrg–;c¸ÜY¤åÎ"-wi¹3ˆËEZî,Òrg—;‹´ÜY¤åÎ"-wi¹³FËEZî¼Ð²ÜYôþŸ–;ÿ÷¿ >׸sãÎ -qç ǃwrÜù…¶¸sãÎAŽ;9î¼ÐwrÜ9Èqç…–¸sãÎAŽ;9î¼ãÎ1Ž;9î¼ÐwrÜ9ˆqçÇZâÎAŽ;9î¼ÐwrÜ9Èqç ÇZâÎAŽ;9îä¸óBKÜ9Èqç ÇZâÎAŽ;1îã¸ó mqgãΠƃw1î bÜĸsãÎ Å1Œ;9î bÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bܤ¸sŒãÎ ÆAŒ;/´ÄAŒ;ƒøâ ƃw1î bÜ9ÈqgЛþÍ'ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw)îŒaÜĸsãÎ ÆAŒ;9î zßߨ%î bÜ9ÈqgãΠƃw1î bÜĸóBKÜĸ3ˆqgãÎAŽ;ƒ^ÇßÐË–ó·t~‘ãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒwÝöGk‰;9î bÜĸ3ˆqç Æ1Œ;ƒwrÜĸ3ˆqgãÎ -qgãΠƃw1î bÜô¹?ZKÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgâÎ1Ž;ƒw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç…–¸3ˆqgãΠƃwÆ0î bÜ9ÈqgÐÛþF-qgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎ ÆAŒ;1îŒyߟ(Ç1Œ;9î bÜĸsãÎ ÆA7ý¬WãÎ -qgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrܤ¸3†qç Æ1Œ;ƒw}î/Ôw1î bÜ9ÈqgãÎ Å1Œ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgâÎË,qgâÎƃw1î bÜĸóÿ(»»äF¬$I£;ÒAüíc-%Âý²YÀ éiÌÆ,Žjng6?ù ÇAŒ;ƒwbÜø3èÃ/×}ª-óe,>¹ø ú\|þ@Œ;9î úÚ_¬%î bÜ9ÈqgâÎÆAŠ;Ç8î bÜĸsãÎ ÆAŒ;ƒwrܤ¸3†qç 9ìÖw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgâÎÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwŽqÜ´þóæ¸sãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw)î|™%î bÜĸ3ˆqç ÇAŒ;ƒwrܤ¸3†qgâÎ1Ž;ƒw1îä¸3ˆqgãΠçþ:-qgãΠƃw)îŒaÜĸsãÎ ÆAŒ;ƒwrÜĸ3HqçÇAûÆAŒ;_h‰;ƒw1îä¸3ˆqgãΠƃw1î RÜ9ÆqgãΠñ»¬KÜ9ÈqgãΠƃw)îŒaܤ¸sŒãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îĸ3†qgãÎ?h‹;ƒ.ÿ%îüûê¹Þ~ÆïFAƒw¾›tâN\:q§.5îԥƟ/ýˆ;…w~þ¸q§.5îÄ¥wâÒ‰;…w¸S¨q§PãN¡Æø4îÄ¡wêPãN\:q§PãN|\ãNj܉C'îÄ¥wêRãN\:q'.¸S—w 5îÄǸ—NÜ©K;u©q'.¸—NÜ)Ô¸èÄB;…wÊ4îüüøw~¾ô#î$ºÿµ\ãN]jÜÉK‰;yé9¿ß¥K;u)q'%îԡƺԸ“(q'?.q§.5îԥƼ”¸“—w 5î$ʆ‰w 5î$JÜ©AãN^JÜ)Ô¸“躾Q?âN}ã;u©q'/%î䥉;u¨q§5îä¥Ä¸tâN¢Äø¸wòRâN]jÜ©K;‰w 5î$úš¿ó!º®oÔ¸S?‚ƺԸ“—wòÒs£NÜ©kÜÉKý:q§.%îä¡ÛþF¸S—wêRãN¢ûþF¸S—wòÒm£NÜ)Ô¸“è{£NÜ)Ô¸“èk£NÜÉK_oÔ›K'îÄ¥wÝ÷7êĺԸS—wòÒãÓõ&îÌ5îÔåÆúwòRâN]º$îÔ¥ÆD÷ýÑ:q§.5î$ºíÖ‰;…w}ïÖ‰;õ#hÜ©K;yéº?Z'îÔ¥ÆDßû£uâN^zîVãNjÜÉCýÑ:q§.5îä¥Ä¼ôÜ­wâãNÜÉK‰;u©q§.5î$ºíÖ‰;…w}ïÖ‰;õ#hÜ©K;yéöëÑz{é±?Z'îÔÇ5îä¥ûú«wêPãN^ºîoÔ‰;u©q§.5î$ºíoÔ‰;u©q§.5îä¥ÇþF¸“貿Q'î$zîoÔ‰;õ#hÜÉK÷ý:q'.¸“—nûuâN}\âNjÜÉC÷ý:q§.5îä¥ëþF¸S¨q'Ñ÷þF¸SßxãN]jÜItÝߨw 5î$ºìoÔ‰;õ#hÜ©K;u©q'/ݽQï.%îÔ¡ÆD·õ‰:q§5îԥƼtߟ¨wêRãN¢ë¯'ê-zìOÔ‰;ñŸ¸“—¨·—žûuâN¢ëþD¸S¨q§¾ñƼtÛŸ¨wêÒåk¢wòÐ}¡wêÃwòÐm¡NÜ©K;u©q'/%îԥƺԸ“hâNšÇþ@¸SßwãN^ºïÔ‰;…w]÷êĺԸS—wòÒm wâЉ;q¨q'Í} NÜ©K;yé¶?P'îԥƺԸó/}ˆ)û•÷ýÕjñIsÙ­)>õŸ¤q§Î4î$úÞ_¬w 5îÔ7Þ¸“—®û‹uâN]jÜ©K‰;yèöëÅz{èù×öª¸“躿X'îԥƺԸ“—nû‹uâN]jÜIô½¾X'îjÜIsÙ¬wâpâN]jÜI”¸“è¾?X'îÔ7Þ¸“—®ûƒuâN]jÜ©K‰;yè¶¿X'îÔ§5îԥƼôØ_¬wêRãN^ºíSãN™ÆDë?o;…wê?~ãN^ºíÓ‰;…w}ïÓ‰;u©q§.5îä¥ëþ:5îÄ¡wâЉ;yé¾ÿÁ‰;õq;u©q'/=ö×éÄD—õu:q'Ñs}þþ¿Û_§wêpùýû¬ï.5îԥƼtÛ_§wêãwêRãN^ºï¯Ó‰;u)q']½No=þÚ:‰q'Ñ÷þ:¸“—žûëtâN]züþ}Ö·—ëëtâN¢ýÌmN܉oúĸtâN^zì¯Ó‰;‰.ûëtâN^zî¯Ó‰;u©q'/Ý××éÄ:Ô¸“—þÅﲞ¸S׸S—wòÒ}NÜ©K‰;y躿N;ewýþMÖ·è¶¿N'îÔ q§.5îä¥Çþ:¸S׸“—nûëtâN]JÜ©C;yè¾¾N?âÎÏ—~Äÿ{é]Üyý'aY–;ƒ¸Ü9ÈËA\î ârg—;_hYî ârg—;ƒ¸Ü9ÈËA\î ârç /wq¹3ˆËA\îtÑrg —;ƒ¸Ü9ÈËA\î Òrg —;y¹3ˆËA\îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA^î ârg–;c¸ÜùBËrg‘–;‹´ÜÄåÎ"-wi¹³è‰y—;‹°ÜY£åÎ .wi¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹´ÜÄåÎ"-wi¹3ˆËEZî,Òrg–;c¸ÜY¤åÎ"-wòrg‘–;‹ôo;*Òrg—;‹´ÜY¤åÎ .w}ýõù_èU¤åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY¤åÎ .wa¹³FËEZî ârg‘–;‹´ÜÄå΢ËþFy¹³HËA\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹s—;‹´ÜY¤åÎ"-wq¹³HËEÿe¹3_ÄåÎ"-wi¹³HËA-wi¹³HËA\î,Òrg‘–;‹´ÜÄåÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3HË5Zî,Òrg—;‹´ÜY¤åÎ"-wòrg‘–;‹´ÜÄåÎ"-wi¹³è¹?Z^î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Ârg —;‹´ÜY¤åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY¤åÎ .wi¹³HËEZî ârg‘–;‹´Ü9ÈËEZî,Òrg‘–;ƒ´ÜY£åÎ"-wq¹³èk£¼ÜY¤åÎ .wi¹³HËEZî ârg‘–;‹´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒ´ÜYsÙŸ(.wÖh¹3ˆËEZî,Òrg—;‹´ÜY¤åÎ"-wòrg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹´ÜtÑrg–;k´Ü¤åÎ-wi¹³è¹¿P^î,Òrg‘–;ƒ¸ÜY¤å΢ëç—–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Òrg—;‹´ÜY¤åÎ",wŽñrg–;k´ÜÄå΢ÏËŸBÊ|¥æ<‹4çÄ9Ï"ÍyiÎ3Hsž5šó,ú8§P¡åÎ .wi¹³HËA\î,úÚ_,/wi¹3ˆËEXî¬Ñrg–;c¸ÜY¤åÎ"-wq¹³HËEZî,Òrg—;‹°ÜY£åÎA\ì–—;‹´ÜÄåÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY„åÎ-wi¹3ˆËEZî,Òrg—;‹´ÜY¤åÎ",wÆp¹³hýçËA\î,Òrg‘–;‹´ÜÄåÎ"-wi¹3ˆËEZî,Òrg–;Çx¹³HËEZî,Òrg—;‹´ÜY¤åÎ .wa¹³FËEXh¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,ÂrgÍÛhEZî ârg‘–;‹´ÜY¤åÎ .wi¹³Ë1\î,ÚÏh¹³H˃¼ÜY¤åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY„åÎ.wi¹³è_ü.«—;ƒ¸ÜY¤åÎ"-wq¹³Ë5Zî,Ârg —;‹´ÜY¤åÎ"-wq¹³HËEZî ârg‘–;‹´ÜY¤åÎ -wÖh¹³HË/´,w]þÓrçßÿ)okÜ9Èqç -qç ǃwrÜùmqç ǃwrÜùBKÜ9Èqç Ç/´ÄƒwrÜ9Èqç 9îã¸sãÎZâÎAŽ;1îã¸ó…–¸sãÎAŽ;_h‰;9îä¸sãÎZâÎAŽ;9îä¸ó…–¸sãÎAŽ;_h‰;9îĸsŒãÎ?h‹;ƒw1îä¸3ˆqgãΠƃw)îŒaÜ9ÈqgãΠ«Â™ ƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgâÎ1Ž;ƒw1î|¡%î bÜÄ?1îä¸3ˆqgãÎAŽ;ƒ¾ôw>AŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3Hqg ãΠƃw1î bÜ9ÈqgÐe£–¸3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎZâÎ ÆAŒ;ƒwrÜĸ3è?ÅóEŽ;ƒw1î zêI1ÈqgãΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒw1îĸ3†qgãÎAŽ;ƒw1î bÜùBKÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ Åcw1î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎZâÎ ÆAŒ;ƒwbÜø3ˆqç ÇA_ûµÄAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgÐs£–¸3ˆqgãÎAŒ;c.ûå¸3†qç ÇAŒ;ƒwrÜĸ3ˆqgãÎZâÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3Hqg ãÎAŒ;cw1î bÜ9ÈqgãΠƃw1î ºâ×½bwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãÎ Å/£¸óSI™¯TñÃâs‹Ï ÏÅçĸ3ˆqç ÇAŒ;ƒwbÜø3èóoÜE0îä¸3ˆqgãÎAŽ;ƒ¾ök‰;ƒwrܤ¸3†qgâÎ1Ž;ƒw1îä¸3ˆqgãΠçþb-qgâÎÆ/ä¸3æ²?XKÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŠ;cw1îä¸3ˆqgãÎAŽ;ƒw1î RÜ9ÆqgÐúÏ›ãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bܤ¸óe–¸3ˆqgãΠƃw1î bÜ9ÈqgâÎÆAŠ;Ç8î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŠ;cw1îä¸3ˆqgãΠƃw1î RÜ9ÆqgÐ~†qgãÎZâÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwŽqÜĸ3è_ü.ëwrÜĸ3ˆqç ÇAŠ;cw)îã¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAÏýurÜø3ˆqç´ÅA—ÿw~ÿ‰%–¸3ˆqç ÇAŒ;ƒw1î|¡%î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgÐSqç Æ1Œ;ƒwrÜĸ3Hqg ãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î bÜĸsãÎ ÆAŒ;9î bܤ¸3†qç -qg‘âÎ"ÅAŒ;‹w)î,RÜĸ³qgâÎ ÆEŠ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY„¸3†qg‘âÎ"Ńw)î,Òˆ‹w1î,RÜY¤¸3ˆqgÑþΧHqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³HqgãÎ"Ä5Š;‹w1î,RÜY¤¸3ˆqgÑe£w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹wrÜY¤¸³Hqg‘âÎ ÆEŠ;‹>ÆÇ å|S€ö«w)î,zâIĸ³Hqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸³HqgâÎÅEŠ;ƒw)î,RÜY¤¸sãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³HqgâÎÆE_û帳HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,RÜ9Èqg‘âÎ"ÅEŠ;ƒwÖ(î,RÜĸ³èk£w)î bÜY¤¸³Hqg‘âΠoÅEŠ;‹w1î,RÜY¤¸³è¹¿QŽ;‹w)î RÜYsÙŸ(Æ5Š;ƒw)î,RÜĸ³Hqg‘âÎ"Ńw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³qgâÎ Å5Š;‹w)î bÜY¤¸³HqgãÎ"ÅEˆ;kw1î,RÜY¤¸³HqgãÎ"ÅEŸãΑd¾’Åg‘ŠÏ"ŸE(>ÇxγqgâÎ ÆEŠ;‹w)î bÜY¤¸³HqgâÎÅEã®BqgãÎ"ÅEŠ;ƒw}í/–ãÎ"ÅAŒ;‹wÖ(î,BÜø³Hqg‘âÎ ÆEŠ;‹w)î bÜY„¸³Fqç Æ5—ýÁrÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³qgâÎ"ÅAߊ;‹w)î bÜY¤¸³HqgâÎÆEë?oŒ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,BÜ9Æqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³qgâÎ"Ä1Œ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,BÜY£¸³HqgãÎ"ÅEŠ;‹w1î,RÜY„¸3†qgÑ~Fqg‘âÎAŽ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹wÆ0î,RÜYô/~—ÕqgãÎ"ÅEŠ;ƒw!î¬QÜY„¸3†qg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"ÅAŠ;kw)î|¡%î,ºü§¸óÏÿª{‹;9î|¡%îä¸sãÎAŽ;ÿ -îä¸sãÎAŽ;_h‰;9îä¸ó…–¸sãÎAŽ;9î|!ÇcwrÜùBKÜ9Èqç Æcw¾ÐwrÜ9Èqç -qç ǃwrÜùBKÜ9Èqç ǃw¾ÐwrÜ9Èqç -qç ǃwŽqÜùmqgãΠƃw1î bÜĸsãÎ Å1Œ;9î bÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bܤ¸sŒãÎ ÆAŒ;_h‰;ƒwñÄAŒ;9î bÜĸsãΠ/ýOãΠƃw1î bÜĸsÐ7ãÎ ÆAŒ;9î RÜø3ˆqç ÇAŒ;ƒwrÜtÙߨ%î bÜ9ÈqgãΠƃw1î bÜĸ󅖸3ˆqgãΠƃw1î RÜ9æ?Æù*ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ ÆAŒ;1îŒaÜĸsãÎ ÆAŒ;ƒw¾Ðw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3HqçÇA_ûµÄAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1î|¡%î bÜtÛߨ%îĸ3†qgãÎAŽ;ƒ¾ö7j‰;ƒwrÜĸ3ˆqgãÎAߌ;ƒw1îä¸3ˆqgãΠƃw1î bÜ9ˆqgÌe¢wÆ0îä¸3ˆqgãÎAŽ;ƒw1î bÜùBKÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw)îŒaÜ9ˆqg ãÎ ÆAŒ;9î bÜĸsãÎ ÆAŠ;cwrÜĸ3èsÜù)¤ÌW²øäâ3ˆÅgæ<ƒw1î bܤ¸óe–¸3Hqg ãÎAŽ;ƒw1î bÜ9ÈqgãΠƃwÆ0î úüwŒ;9î bÜĸsãΠ¯ýÅZâΠƃw)îŒaܤ¸sŒãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŠ;cw¾ãΘËþ`-qgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw)îŒaÜĸsãÎ ÆAŒ;9î bÜĸ3HqçÇAë?oŽ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgâΗYâÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŠ;cw)îã¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw)îŒaÜĸsãÎ ÆAŒ;ƒwrÜĸ3HqçÇAûÆAŒ;_h‰;ƒw1îä¸3ˆqgãΠƃw1î RÜ9ÆqgãΠñ»¬KÜ9ÈqgãΠƃw)îŒaܤ¸sŒãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îĸ3†qgãÎ?h‹;ƒ.ÿ)î|þóß™qçíŸ.ñ÷éA;ƒþß7ùB'îÄ¥wêRãN]jÜùùÒ¸S¨qççûwêRãN\:q'.¸S¨q'Љ;…w 5îj܉AãN:q§5îÄ¥w 5îÄÇýóß´Çv¨q'¸—NÜ©K;qéĸtâN]jÜ)Ô¸wâN\:q§.5îԥƸtâN\:q§PãN w 5îJÜ)Ó¸óóOàGÜùùÒ¸“(ÖÇ5îԥƼ”¸“—wêRãN]JÜÉC‰;u¨q§.5î$JÜÉKÜ©K;u©q'/%îä¥ÄB;‰ò‡a¢ÄB;‰wêGи“—w 5î$º®oÔ¸SßxãN]jÜÉK‰;yiâNjÜ©C;y)q'.¸“(q'>îS—wêRãN¢ÄB;‰¾æï|ˆ®ëõ#îÔ q§.5îä¥Ä¼ôÜߨwêãwòÒc£NÜ©K‰;yè¶¿Q'îԥƺԸ“辿Q'îԥƼtÛߨw 5î$úÞߨw 5î$úÚߨwòÒã×õæÒ‰;qé«q'Ñ}£NÜ©K;u©q'/=Ö7êÄÿ{è]Ü™¯ºìÖ‰;õ=6îԥƺԸ“è¾?Z'îÔ¥ÆD·ýÑ:q§PãN¢ïýÑ:q§~;u©q'/]÷GëĺԸ“è{´NÜÉKÏýÑjÜ©C;yè±?Z'îԥƼ”¸“—žû£uâN|܉;y)q§.5îÔ¥ÆD·ýÑ:q§PãN¢ïýÑ:q§~;u©q'/Ý~=Zo/=öGëÄú¸Æ¼t_­wêPãN^ºîoÔ‰;u©q§.5î$ºíoÔ‰;u©q§.5îä¥ÇþF¸“貿Q'î$zîoÔ‰;õ#hÜÉK÷ý:q'.¸“—nûuâN}\âNjÜÉC÷ý:q§.5îä¥ëþF¸S¨q'Ñ÷þF¸SßxãN]jÜItÝߨw 5î$ºìoÔ‰;õ#hÜ©K;u©q'/ݽQï.%îÔ¡ÆD·õ‰:q§5îԥƼtߟ¨wêRãN¢ë¯'ê-zìOÔ‰;ñŸ¸“—¨·—žûuâN¢ëþD¸S¨q§¾ñƼtÛŸ¨wêRãN]JÜÉC÷ý…jÜ©kÜÉC·ý…:q§.5îԥƼ”¸S—wêRãηWó6’ÌWNñÉëýÕ:ŧþôøä¥ûþj¸S¨q'ÑuµNÜ©K;u©q'/ÝöW«q'¸‡wÒÜ÷WëĺԸ“—nû«uâN]jÜ©K;y龿Z;i.û£5q§¾éÆ:Ó¸“è{±NÜ)Ô¸SßxãN^ºî/Ö‰;u©q§.%îä¡Û¯ëí¡ç_Û«vâN¢ëþb¸S—wêRãN^JÜÉKÏýÅ:q'Ñ÷ú8¸¨q'Íe›N܉À‰;u©q'QâN¢ûþ6¸SßxãN^ºîoÓ‰;u©q§.%îä¡Ûþ8¸SŸÖ¸S—wòÒcœNÜ©K;yé¶?N;ew­ÿ¼5îjÜ©ÿø;yé¶?N'îjÜIô½?N'îԥƺԸ“—®ûëÔ¸‡N܉C'îä¥ûþ7'îÔÇ5îԥƼôØ_§w]Ö×éÄDÏõuz4î$ºî¯Ó‰;u©q§.5îä¥Ûþ:¸S׸S—wòÒ}NÜ©K‰;yèúëuz{èñ×ÖIüˆ;‰¾÷×éļôÜ_§wêÒã÷ï³¾½ôX_§wígnûëtâN|Ó'îÄ¥wòÒcNÜItÙ_§wòÒsNÜ©K;yé¾¾N'îԡƼô/~—õÄú¸ÆºÔ¸“—îûëtâN]JÜÉC×ýujÜ)Ó¸“è÷o²¾E·ýu:q§~;u©q'/=ö×éÄú¸Æ¼tÛ_§wêRâNjÜÉC÷õuúw~¾ô#îüßKoâÎþ¦è{[î ârç /wq¹3ˆËA\î|¡e¹3ˆËA\î ârç /wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;c¸ÜÄåÎA^î ârgÐ ‹31\îäåÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA^î ârg—;y¹3ˆËAZîŒyj¹ó…–åÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY„åÎ-wq¹³HËEZî,Òrg—;‹´ÜY¤åÎ"-wq¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹°ÜÃåÎ"-wi¹s—;‹´ÜY¤ÛQ‘–;ƒ¸ÜY¤åÎ"-wq¹³èë¯ÏÿB¯"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³Ë5Zî,Òrg—;‹´ÜY¤åÎ .w]ö7ÊËEZî ârg‘–;‹´ÜÄåÎ"-wi¹³H˃¼ÜY¤åÎ"-wi¹3ˆËEZî,Ârg –; ÏCo Ð~•–;‹´ÜÄåÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY¤åÎ"-wi¹³FËEZî ârg‘–;‹´ÜY¤åÎA^î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Òrg—;‹´ÜY¤åÎ"-wq¹³HËEXîŒárg‘–;‹´ÜY¤åÎ .wi¹³HËEZî ârg‘–;‹´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;y¹³HËE·ýòrg–;k´ÜY¤åÎ .w}ío”—;‹´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Òrg–;k.ûÅåÎ-wq¹³HËEZî ârg‘–;‹´ÜY¤åÎA^î,Òrg‘–;‹´ÜÄåÎ"-wi¹3ˆËEZî,ÒrgÑs¢¼ÜY„åÎ-wi¹³FËEŸ—;?äýJÍyqγHsžEšó âœg‘æ<‹0çY£9Ï Îyiγèóœç¤åÎ .wi¹³HËA\î,Òrg‘–;‹°Ü9ÆËEXî¬Ñrg—;‹´ÜY¤åÎ"-wq¹³HËEZî Òrg–;‹>Î)Th¹3ˆËEZî,Òrg—;‹¾öËËEZî ârg–;k´ÜY„åÎ.wi¹³HËA\î,Òrg‘–;‹´ÜÄåÎ",wÖh¹s—;k.ûÛäåÎ"-wq¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wa¹³FËEZî ârg‘–;‹´ÜÄåÎ"-wi¹³è¹>N^î,Zÿyãrg—;‹´ÜY¤åÎ"-wq¹³HËEZî ârg‘–;‹´ÜY„åÎ1^î,Òrg‘–;‹´ÜÄåÎ"-wi¹3ˆËEXî¬Ñrg–;c¸ÜY¤åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY¤åÎ .wa¹³FËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³Ë1\î,ÚÏh¹³H˃¼ÜY¤åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY„åÎ.wi¹³è_ü.«—;ƒ¸ÜY¤åÎ"-wq¹³Ë5Zî,Ârg —;‹´ÜY¤åÎ"-wq¹³HËEZî ârg‘–;‹´ÜY¤åÎ -wÖh¹³HË/´,w]þËrçߪùû™ÚâÎAŽ;_h‰;9îä¸sãÎ?h‹;9îä¸sãÎZâÎAŽ;9î|¡%îä¸sãÎAŽ;_Èqçǃw¾ÐwrÜ9ˆqçÇ/´ÄƒwrÜùBKÜ9Èqç ǃw¾ÐwrÜ9Èqç Ç/´ÄƒwrÜùBKÜ9Èqç ÆcwþA[Üĸ3ˆqç ÇAŒ;ƒw1îä¸3Hqg ãÎAŽ;ƒw1î bÜ9ÈqgãÎ ÆAŒ;]w1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwŽqÜĸ3ˆqç -qgãÎ þ8ˆqç ÇAŒ;ƒwrÜô¥¿ó bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŠ;cw1îä¸3ˆqgãÎAŽ;ƒ.ûµÄAŒ;9î bÜĸsãÎ ÆAŒ;ƒw¾Ðw1î bÜĸsãÎ ÆAŠ;Ç8î úoqg¾ŠqgãÎAŽ;ƒw1îä¸3ˆqgÐm´–¸sãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒw1îĸ3†qgãÎAŽ;ƒw1î bÜùBKÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ Åcw1î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎZâÎ ÆAŒ;ƒwbÜø3ˆqç ÇA_ûµÄAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îĸ3æ²?QŽ;cwrÜĸ3ˆqç ÇAŒ;ƒw1î|¡%î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAˆ;?U’ùJŸ1,>±øŒañtÛŸ­%îä¸3ˆqgãÎAŽ;ƒw)îŒaÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒw¾Ìw)îŒaÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎÆAŸã.‚qç ÇAŒ;ƒwrÜôµ¿XKÜĸsãÎ Å1Œ;ƒwŽqÜĸ3ˆqç ÇAŒ;ƒw1îä¸3Hqg ãÎrÜsÙߦ%î bÜ9ÈqgãΠƃw1î bÜĸsãÎ Å1Œ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw)îã¸3hýçÍqç ÇAŒ;ƒnûã´Äƒw1î bÜ9ÈqgãÎ ÆAŠ;_f‰;ƒw1î bÜ9ÈqgãΠƃw)îŒaܤ¸sŒãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrܤ¸3†qgãÎAŽ;ƒw1î bÜ9ÈqgãÎ Åcwígw1î|¡%î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3HqçÇAŒ;ƒþÅï².qç ÇAŒ;ƒwrܤ¸3†qgâÎ1Ž;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎÆAŒ;ÿ -î ºü§¸óïÿ/øºÆƒw¾ÐwrÜ9Èqç ÇÐwrÜ9Èqç Ç/´ÄƒwrÜùBKÜ9Èqç ǃw¾ãÎ1Ž;9î|¡%îä¸sãÎ1Ž;_h‰;9îä¸ó…–¸sãÎAŽ;9î|¡%îä¸sãÎAŽ;_h‰;9îä¸ó…–¸sãÎAŒ;Ç8îüƒ¶¸3ˆqgãÎAŽ;ƒwÝô;ÈAŒ;9î RÜøsãÎ ÆAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŠ;Ç8î bÜĸ󅖸3ˆqgÿ@ĸsãÎ ÆAŒ;9î úÒßù1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ Å1Œ;ƒwrÜĸ3ˆqç ÇA—ýZâΠƃw1î bÜ9ÈqgãÎ ÆAŒ;_h‰;ƒw1î bÜ9ÈqgãÎ Åcwý·¸3_Ÿ3ˆqç ÇAŒ;ƒwrÜĸ3è¶?ZKÜ9ÈqgãΠƃw1î bÜĸsãÎ ÆAŒ;ƒwbÜø3ˆqç ÇAŒ;ƒw1î|¡%î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgâÎ1Ž;ƒw1î bÜ9ÈqgãÎ ÆAÏýZâÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒw¾Ðw1î bÜĸsãÎÆAŒ;9î úÚߨ%î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç Æ1—ý‰rÜøsãÎ ÆAŒ;9î bÜĸ3ˆqç -qgãÎ ÆAŒ;9î úw~Êó•,>¹ø bñÄâ3ˆÅç Ïy)îŒaÜ9ˆqg ãΠÛþl-qç ÇAŒ;ƒwrÜĸ3Hqg ãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bÜô\_­%î RÜøsãÎ ÆAŒ;ƒwrÜĸ3ˆqç Æ1Œ;ƒ>ÿÆ]ãÎAŽ;ƒw1îä¸3èkœ–¸3ˆqç ÇAŠ;cw)îã¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgâÎÆ/ä¸3沿MKÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŠ;cw1îä¸3ˆqgãÎAŽ;ƒw1î RÜ9ÆqgÐúÏ›ãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bܤ¸óe–¸3ˆqgãΠƃw1î bÜ9ÈqgâÎÆAŠ;Ç8î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŠ;cw1îä¸3ˆqgãΠƃw1î RÜ9ÆqgÐ~†qgÐs–¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ Åcw1î ú¿ËºÄƒw1î bÜ9ÈqgâÎÆAŠ;Ç8î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŒ;cw1îüƒ¶¸3èò_âÎ?-×ϸóöO—øëtPãΠŸßä wâÒ‰;u©q§.5îü|éGÜ)Ô¸óóÇýˆ;u©q'.¸—NÜ)Ô¸èÄB;…w 5îÄ q'¸S‡wâÒ‰;…wâãwêPãN:q'.¸S—wâÒ‰;qéĺԸS¨q'>îĸtâN]jÜ©K;qéĸtâN¡Æ@'îjÜ)”¸S¦qççŸÀ¸óó¥q'Qþ0¬kÜ©K;y)q'/%îԥƺ”¸“‡wêPãN]jÜI”¸“—¸S—wêRãN^JÜÉK‰;…wåÃD‰;…w%îÔ q'/%îjÜIt]ߨq§¾ñƺԸ“—wòÒÄ:Ô¸S‡wòRâN\:q'QâN|܉;y)q§.5îÔ¥ÆD‰;…w}Íßù]×7êGÜ©AãN]jÜÉK‰;y鹿Q'îÔÇ5îä¥ÇþF¸S—wòÐm£NÜ©K;u©q'Ñ}£NÜ©K;yé¶¿Q'îjÜIô½¿Q'îjÜIôµ¿Q'îä¥Ç¯7êÍ¥wâÒ‰;‰îûuâN]jÜ©K;yé±¾Q'îÔ¡Æÿ{éMÜÙ¯ºíÖ‰;õM6îÔ¥ÆD÷ýÑ:q§.5î$ºíÖ‰;…w}ïÖ‰;õ#hÜ©KÿüŸû¥ëþh¸S—w}ïÖ‰;yé¹?Z;u¨q'=öGëĺԸ“—wòÒs´N܉;q'/%îԥƺԸ“è¶?Z'îjÜIô½?Z'îÔ q§.5îä¥Û¯Gëí¥Çþh¸S׸“—îë£uâNjÜÉK×ý:q§.5îÔ¥ÆD·ý:q§.5îԥƼôØß¨w]ö7êÄDÏý:q§~;y龿Q'îÄ¥wòÒm£NÜ©KÜ©C;y辿Q'îԥƼtÝߨw 5î$úÞߨwêoÜ©K;‰®ûuâN¡ÆD—ý:q§~×çþF¸S—wòÒý×õîRâNjÜIt[Ÿ¨wêPãN]jÜÉK÷ý‰:q§.5î$ºþz¢Þ¢ÇÇ'êCþ8_yŠOü§9Å'¾‡S|òÒs·NñItÝß­w 5îÔ7Þ¸“—nû»uâN]jÜ©K‰;yè¾?[;õa;yè¶?['îԥƺԸ“—wêRãN]º]ög«q'ÍcµNÜ©ï»q'/Ý÷WëÄB;‰®û«uâN]jÜ©K;yé¶¿Z;qèÄ8Ô¸“澿Z'îԥƼtÛ_­wêRãN]jÜÉK÷ýV;i.ûû4q§¾éÆ:Ó¸“è{œNÜ)Ô¸SßxãN^ºîÓ‰;u©q§.%îä¡Û¯Çéí¡ç_ÛvâN¢ëþ8¸S—wêRãN^ºíÓ‰;u©q'Ñ÷ú8¸¨q'Íe›N܉À‰;u©q'QâN¢ûþ6¸SßxãN^ºîoÓ‰;u©q§.%îä¡Ûþ8¸SŸÖ¸S—wòÒcœNÜ©K;yé¶?N;ew­ÿ¼5îjÜ©ÿø;yé¶?N'îjÜIô½?N'îԥƺԸ“—®ûëÔ¸‡N܉C'îä¥ûþ7'îÔÇ5îԥƼôØ_§w]Ö×éÄDÏõuz4î$ºî¯Ó‰;u©q§.5îä¥Ûþ:¸S׸S—wòÒ}NÜ©K·Ëú:¸“‡mĸ“è{NÜÉKÏýu:q§.=~ÿ>ëÛKõu:q'Ñ~æ¶¿N'îÄ7}âN\:q'/%îÔ¥ÆD—ýu:q'/=÷×éĺԸ“—îëëtâNjÜÉKÿâwYOÜ©kÜ©K;y龿N'îÔ¥Äÿ ½Š´ÜY¤åÎ .wi¹³HËEÏýòrg‘–;‹´ÜÄåÎ",wÖh¹³HËA\î,Òrg‘–;ƒ¸ÜYtÙß(/wi¹3ˆËEZî,Òrg—;‹´ÜY¤åÎ"-wòrg‘–;‹´ÜY¤åÎ .wi¹³Ë1\î,ú¼Üù}ê|W€æ«´ÜÄåÎ"-wi¹3ˆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³è²?Z^î,Òrg—;‹´ÜY¤åÎ"-wi¹³FËEZî ârg‘–;‹´ÜY¤åÎA^î,Òrg‘–;ƒ¸ÜY¤å΢Ûþhy¹3ˆËEZî,Òrg—;‹´ÜY¤åÎ"-wq¹³HËEXîŒárg‘–;‹´ÜY¤åÎ .wi¹³HËEÏýòrg‘–;‹´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;y¹³HËEZî,Òrg–;k´ÜY¤åÎ .w}ío”—;‹´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Òrg–;k.ûÅåΚÏËŸÊÆùJÎyiγHsžAœó,ºìï–ç<‹4ç9ÈsžEšó,Òœg‘æ<ƒ8çYôyÎóÒrg—;‹´ÜY¤åÎ"-wq¹³Ë5Zî Òrg–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg–;k´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒ¸ÜY¤åÎ"-w=×WËËEXî¬Ñrg—;‹´ÜYtÛ(/wq¹³HËEZî Òrg–;‹>Î)Th¹3ˆËEZî,Òrg—;‹¾öÇÉËEZî ârg–;k´ÜY„åÎ.wi¹³HËA\î,Òrg‘–;‹´ÜÄåÎ",wÖh¹s—;k.ûÛäåÎ"-wq¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wa¹³FËEZî ârg‘–;‹´ÜÄåÎ"-wi¹³Ë1\î,Zÿyãrg—;‹´ÜY¤åÎ"-wq¹³HËEZî ârgÑÛhEZî,Ârç/wi¹³HËEZî ârg‘–;‹´ÜÄåÎ",wÖh¹³Ë1\î,Òrg‘–;ƒ¸ÜY¤å΢Ûþ:y¹3ˆËEZî,Òrg—;‹°ÜY£åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY„åÎ.wíg´ÜY¤åÎA^î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Ârg —;‹´ÜYô/~—ÕËA\î,Òrg‘–;ƒ¸ÜY„åÎ-wa¹3†ËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³HËEZî,Òrg–;k´ÜY¤åÎZ–;‹.ÿi¹óïÿ‡¾­qç Ç/´ÄƒwrÜ9Èqç´ÅƒwrÜ9Èqç -qç ǃw¾ÐwrÜ9Èqç Ç/ä¸sŒãÎAŽ;_h‰;9îĸsŒãÎZâÎAŽ;9î|¡%îä¸sãÎAŽ;_h‰;9îä¸sãÎZâÎAŽ;9î|¡%îä¸sãÎ1Ž;ÿ -î bÜĸsãÎ ÆAŒ;ƒwrܤ¸3†qç ÇAŒ;ƒw1îä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸsãÎ ÆAŒ;ƒwŽqÜĸ3ˆqç -qgãÎ þ8ˆqç ÇAŒ;ƒwrÜô¥¿ó bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŠ;cw1îä¸3ˆqgãÎAŽ;ƒ.ûµÄAŒ;9î bÜĸsãÎ ÆAŒ;ƒw¾Ðw1î bÜĸsãÎ ÆAŠ;Ç8î bÜôßâÎ|ãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸ3ˆqç Æ1Œ;ƒwrÜĸ3ˆqgãÎZâÎ ÆAŒ;9î bÜtÛ­%îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ Åcw1î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎZâÎ ÆAŒ;ƒwbÜø3ˆqç ÇA_ûµÄAŒ;9î bÜĸ3蹿QKÜĸ3ˆqç ÇAŒ;ƒw1óS™¯dñÄâs‹Ï˜Ëþn¹øŒù\|ä¸3ˆqgãÎAŽ;ƒw1î bÜùBKÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw)îŒaÜ9ˆqg ãÎ ÆAŒ;9î bÜĸsãÎ ÆAŠ;cwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãÎ Å/³ÄAŠ;cwrÜĸ3è¶?PKÜ9ÈqgãΠƃwÆ0î úüwŒ;9î bÜĸsãΠ¯ýqZâΠƃw)îŒaÜôÄ/(qÜĸ3ˆqç ÇAŒ;ƒw1îä¸3Hqg ãÎrÜsÙߦ%î bÜ9ÈqgãΠƃw1î bÜĸsãÎ Å1Œ;ƒžûã´ÄAŒ;ƒwrÜĸ3ˆqgâÎ1Ž;ƒÖÞwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãÎ Å/³ÄAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒwÆ0î RÜ9ÆqgãΠƃw1î bÜĸsãÎ ÆAŒ;9î RÜø3ˆqç ÇAŒ;ƒw1îä¸3ˆqgâÎ1Ž;ƒö3Œ;ƒw¾Ðw1î bÜ9ÈqgãÎ ÆAŒ;9î bܤ¸sŒãÎ ÆAÿâwY—¸sãÎ ÆAŒ;9î RÜø3HqçÇAŒ;ƒw=÷×i‰;ƒw1îä¸3ˆqgãΠƃwÆ0î bÜùmqgÐå¿Ä÷?½È¸óÝ(hPãÎwó¢ƒN܉K'îԥƺԸóó¥q§PãÎÏ÷#îÔ¥gâN\:q'.¸S¨q'Љ;…w 5îj܉AãN:q§5îÄ¥w 5îÄÇ5îÔ¡Æ8tâN\:q§.5îÄ¥wâÒ‰;u©q§PãN|܉;qéĺԸS—wâÒ‰;qéÄB;NÜ)Ô¸S(q§LãÎÏ?qççK?âN¢û_ûÇ5îԥƼ”¸“—wêRãN]JÜÉC‰;u¨q§.5î$JÜÉKÜ©K;u©q'/%îä¥ÄB;‰ò‡a¢ÄB;‰wêGи“—w 5î$º®oÔ¸SßxãN]jÜÉK‰;yiâNjÜ©C;y)q'.¸“(q'>îS—wêRãN¢ÄB;‰¾æï|ˆ®ëõ#îÔ q§.5îä¥Ä¼ôÜߨwêãwòÒc£NÜ©K‰;yè¶¿Q'îԥƺԸ“辿Q'îԥƼtÛߨw 5î$úÞߨw 5î$úÚߨwòÒã×õæÒ‰;qéÄD÷ý:q§.5îԥƼôXߨwêPãN^º}|£ÞÄýªÄ:ݸSßdãN¢ûþh¸S—wÝöGëÄB;‰¾÷GëÄú4îԥƼtÝ­wêRãN¢ïýÑ:q'/=÷G«q§5îä¡Çþh¸S—wòRâN^zîÖ‰;ñq'îä¥ÄºÔ¸S—wÝöGëÄB;‰¾÷GëÄú4îԥƼtûõh½½ôØ­wêãwòÒ}}´NÜ©C;yéºÿÁêĺԸS—wÝö7êĺԸS—wòÒc£NÜItÙߨw=÷7êÄú4îä¥ûþF¸—NÜÉK·ý:q§>.q§5îä¡ûþF¸S—wòÒu£NÜ)Ô¸“è{£NÜ©o¼q§.5î|û?.¿+û•×ýá:ŧP‹O¢ËþpâS?—ŸºÔâS—wòÒý×ÃõîRâNúçÏåëËwòÃwêPãN]jÜÉK÷ýÝ:q§.5î$ºþz·Þ¢Çþn¸ßø‰;yéþëÝz{鹿['î$ºîïÖ‰;…wêoÜÉK·ýÝ:q§.5îÔ¥Ä9†ã“1ÚžŒÑôdŒ–'Çpx2F»“1šÃÕÉNÆhs2““/âÅÉ NÆho2Fs“c¸6£±ÉmMŽáÔd –&C44ƒÉ!œ™ŒÑÊdŒF&Çpc2F“1Z˜ŒÑÀäîKÆh^2Fë’c8.ƒmÉMKÆhYr ‡%c´+£YÉ­JŽá¨dŒ6%c0)9„‹’1ëíIÆhNòe¼&£1ÉmIŽá”dŒ–$c4$£É1œ‘ŒÑŠd F$‡pC2F’1ûïhz@r ÷#c4£õÈ1ŒÁvdˆ¦#c°9„Ñ1ÚŒÑldŒV#Çp42F›‘1šŒÃÅÈ FÆÜÖ÷Æs‘c´¢±ÈmEþ1ËTdÌå?-E>ÿùan5á ç„/´ô„ƒrQ8ÈIá´5…ƒrU8ÈYá -]á ‡…ƒ\¾Ð’r[8èÆ¸pëÂr^8Æ}á †/´†ƒœbc8Æ‘á -•á g†ƒÜ¾Ðri8È©á ·†/´Ä†ƒ\rn8Ƚá -Áá ‡ƒœ¾ÐÒrt8ˆÕág‡ÐÖ1< by8ÈéaÛà ƇA¬9? RÃq Ä &ˆAlƒ!r…Ä 1ˆbCÄA.ƒ˜"±Eä1ˆ5bsÄ öˆƒ$±H b’8ÈMb£Ä V‰AÊǸK b˜Ä2ñ…–41ˆmbÿàÄ:qóÄ ö‰A ¹P úÒßæ±Q b¤8È•b3Å vŠA ¹T bªÄVqcÅ ÕŠ1·ýZzÅAƒX,1Yäf1貿QKµÄlq»Å †‹A,9] b»Äx1ˆõâ -ùbûÅ ŒA,9a bäˆqŒ+Æ fŒAŸ;Æès·ø.vœ¯rÉÄ”1ˆ-ã ÇŒA¬ƒ˜3±gä 1ˆEc“ÆAnƒ5±j bÖ8È]cÃÆ –AL±mŒaÜĺqóÆ öA ƒX8¾Ð’8±q bä8È•c3Ç vŽA ¹t bêÄÖqcÇ ÖŽÃØ;rðÄâ1HÉã7AŒƒX=1{äî1ˆácËÇ ¦ƒÜ>1~ bý8ÈùcûÇ A, 9 bÄò…TA~Êüò•l#ƒG±ŽÄ<2†}dÉA.$ƒ¾ö‡kÉ!ƒØCrÄ"2ˆId›ÈAŽ"ƒXE1‹ä.2ˆadÐm¸–4rÛÈ Æ‘A¬#1Œ¹ìï–É’ƒœH±‘ b$9È•d3É v’A %_h)%ƒ˜J±• b,9ȵdsÉ ö’ƒL±˜ b2Äfr£É U“1Ì&±›Œa8Är2ˆéä ·“AŒ'ƒXOr>Ä~2He ÊAN(ƒØP1¢ zîÔ’Q±£ bH9È%eSÊ ¶”AŠ)_f©)ƒ”Sư§ä 2ˆEe“Ê 6•ƒU±ª bV9ˆ]e ÃÊ Ï¿nÁ´rÛÊ Æ•A¬+9¯ úÚ§%° ba9ȉeËF–Aª,Ç8³ bgÄÐrKË ¦–Al-ƒ[rm¤Ü2†½å 9¸Œ¹ìoÓ’\±¹äè2ˆÕe³ËAî.ƒ^±¼ bz9ÈíeâËÖ—AÌ/¹¿ b€ÄsÌ 6˜AŒ0ƒTaŽq†´þóæsKÌ ¦˜Al1ƒcrÄ3ˆ=æ ™A,2ƒ˜d©É|™%Ê b•Ä,3ˆ]æ ‡™A,3ƒ˜fr›¤83†ufòÌ1î3ƒh±ÐäD3ˆf#Í Všƒœi±Ó b¨9È¥fRͶšAŒ5¹Ö b®Ä^3蹿NK±Äd3HÍæG›Aûf›Aì6_h 7ƒXn1Ýäv3ˆñfëÍ æ›ƒÜo1à RÁ9Æ gΠñ»¬KÅ9Èg;Î †œƒ\r)åŒaˤ˜sŒkÎ æœAì9ƒtrÑĤ3ˆMç GA¬:ƒ˜u±ëİ3†egÓÎ?hk;ƒ.ÿ%îüûçõ÷–¸3ˆqç ÇAŒ;ƒw1î|¡%î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎAŒ;cw1îä¸3ˆqgâÎƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3Hqg ãÎZâÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqgâÎÅAŒ;‹w)î,RÜĸ³Hqg‘â΢'™ ÆEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY„¸3†qg‘âÎ"Ńw)î,Òˆ‹w1î,RÜY¤¸3ˆqgÑþΧHqg‘âÎ ÆEŠ;‹w)î bÜY¤¸³HqgãÎ"Ä5Š;‹w1î,RÜY¤¸3ˆqgÑe£w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹wrÜY¤¸³Hqg‘âÎ ÆEŠ;‹wÆ0î,RÜY¤¸³è?Åù*ÆEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒwÖ(î,RÜĸ³Hqg‘âÎ"Ńw)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹wÆ0î,RÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,RÜY¤¸3q燲±_©â³HÅg‘ŠÏ ŸE*>‹T|òîe‘âÎ"ÅEŠ;ƒwÖ(î,RÜĸ³èk¸w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒwÖ\öw‹qgâÎ ÆEŠ;‹w1î,RÜY¤¸³Hqç ÇEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹w1î,BÜY£¸3HqgâÎ"ÅEŠ;ƒw)î,RÜĸ³HqgâÎÅAŒ;‹w)î,zî”ãÎ"ÅEŠ;ƒw)î,RÜY„¸sŒãÎ"Ä5Š;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŠ;kw}ü» ÅAŒ;‹w)î bÜYôµ?NŽ;‹w1î,BÜY£¸³qg ãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqgâÎŃwÖ\ö·Éqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³HqgãÎ"Ä5Š;‹w1î,RÜY¤¸3ˆqg‘âÎ"ÅEˆ;cw­ÿ¼1î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,RÜY¤¸³qçÇEŠ;‹w)î bÜY¤¸³HqgãÎ"Ä5Š;‹wÆ0î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³qgâÎ"ÅAŒ;‹w)î,RÜĸ³HqgâÎÆEûÅEŠ;9î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,BÜø³HqgÑ¿ø]VÇAŒ;‹w)î bÜY„¸³FqgâÎÆEŠ;‹w)î bÜY¤¸³HqgãÎ"ÅEŠ;‹w)î¬QÜY¤¸ó…–¸³èòŸâÎ?ÿŠqçíŸ.ñ÷éA;ƒþß7ùB'îÄ¥wêRãN]jÜùùÒ¸S¨qççûwêRãN\:q'.¸S¨q'Љ;…w 5îj܉AãN:q§5îÄ¥w 5îÄÇ5îÔ¡Æ8tâN\:q§.5îÄ¥wâÒ‰;u©q§PãN|܉;qéĺԸS—wâÒ‰;qéÄB;NÜ)Ô¸S(q§LãÎÏ?qççK?âN¢üaX׸S—wòRâN^JÜ©K;u)q'%îԡƺԸ“(q'?.q§.5îԥƼ”¸“—w 5î$ʆ‰w 5î$JÜ©AãN^JÜ)Ô¸“躾Q?âN}ã;u鑸“—wòÒÄ:Ô¸S‡wòRâN\:q'QâN|܉;y)q§.5îÔ¥ÆD‰;…w}Íßù]×7êGÜ©AãN]jÜÉK‰;y)q§PãN}\ãN^zìoÔ‰;u)q'Ýö7êĺԸS—wÝ÷7êĺԸ“—nûuâN¡ÆDßûuâN¡ÆD_ûuâN^züz£Þ\:q'.¸“辿Q'îԥƺԸ“—ëuâNjÜÉK·ý:qçÿ^zwÎW5îÔéÆD÷ýÑ:q§.5î$ºíÖ‰;…w}ïÖ‰;õ#hÜ©K;yéº?Z'îÔ¥ÆDßû£uâN^zîVãNjÜÉCýÑ:q§.5îä¥Ä¼ôÜ­wâãNÜÉK‰;u©q§.5î$ºíÖ‰;…w}ïÖ‰;õ#hÜ©K;yéöëÑz{é±?Z'îÔÇ5îä¥ûúh¸S‡wòÒu´NÜùöÑz-ÎW¶øÔùŸD·ýá:ŧ.µøÔ¥Ÿ¼ôØ®S|]ö‡ëÄDÏýá:q§~;y)q'.¸—NÜÉK·ýá:q§>.q§5îä¡ûþp¸S—wòÒu¸NÜ)Ô¸“è{¸NÜ©o¼q§.5î$ºî׉;…w]ö‡ëÄú4îԥƺԸ“—î¿®w—wêPãN¢Ûún¸S‡wêRãN^º|·jÜ©K;‰®¿ž¨·è±?Q'îÄ7~âN^ºÿz¢Þ^zîOÔ‰;‰®ûuâN¡ÆúÆwòÒm¢NÜ©K;u)q'Ý÷ªq§>¬q'ÝöêĺԸS—wòRâN]jÜ©K;‰&î¤yìÔ‰;õ}7îä¥ûþ@¸S¨q'Ñu NÜ©K;u©q'/Ýöªq'¸‡wÒÜ÷êĺԸ“—nûuâN]jÜ©K;yé¾?P;i.ûû4q§¾éÆ:Ó¸“è{œNÜ)Ô¸SßxãN^JÜÉKýq:q§.%îä¡Û¯Çéí¡ç_ÛvâN¢ëþ8¸S—wêRãN^ºíÓ‰;u©q'Ñ÷ú8¸¨q'Íe›N܉À‰;u©q'QâN¢ûþ6¸SßxãN^ºîoÓ‰;u©q§.%îä¡Ûþ8¸SŸÖ¸S—wòÒcœNÜ©K;yé¶?N;ew­ÿ¼5îjÜ©ÿø;yé¶?N'îjÜI”¸SßxãN]jÜ©K;y麿N;qèÄ8tâN^ºï9pâN}\ãN]jÜÉKýu:q'Ñe}NÜIô\_§GãN¢ëþ:¸S—wêRãN^ºí¯Ó‰;õq;u©q'/Ý÷×é唸“‡®¿^§·‡mĸ“è{NÜÉKÏýu:q§.=~ÿ>ëÛKõu:q'Ñ~æ¶¿N'îÄ7}âN\:q'/=ö×éÄD‰;õq;y鹿N'îԥƼt__§wêPãN^ú¿ËzâN}\ãN]jÜÉK÷ýu:q§.%îä¡ëþ:5î”iÜIôû7YߢÛþ:¸S?€ÆºÔ¸“—ûëtâN}\ãN^ºí¯Ó‰;u)q§5îä¡ûú:ýˆ;?_úwþï¥7qçßÿÓñßÿ]–;ƒ¸Ü9ÈËA\î ârg—;_hYî ârg—;ƒ¸Ü9ÈËA\î ârç /wq¹3ˆËA\îÄåÎ.wq¹s—;ƒ¸Ü¤åÎ.wòrg—;ƒ¸Ü9ÈËA\î ârg—;y¹3ˆËA\î ârç /wq¹3ˆËƒ¼ÜÄåΠþ=“1\î|¡e¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wa¹³FËA\î,Òrg‘–;‹´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Òrg—;‹´ÜY¤åÎ",wÆp¹³HËEZîäåÎ"-wéßvT¤åÎ .wi¹³HËA\î,úúëó¿Ð«HËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Ârg–;‹´ÜÄåÎ"-wi¹3ˆËE—ýòrg‘–;ƒ¸ÜY¤åÎ"-wq¹³HËEZî,Òrç /wi¹³HËEZî ârg‘–;‹°ÜÃåÎ"-wÝö7ê?.w櫸ÜY¤åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY¤åÎ .wi¹³HËEZî ârg‘–;‹´ÜY¤åÎ -wÖh¹³HËA\î,Òrg‘–;‹´Ü9ÈËEZî,Òrg—;‹´ÜY¤åÎ"-wq¹³HËEZî ârg‘–;‹>/w~¨û•šó âœg‘æ<‹0çÃ9Ï"ÍyiγHsžAœó,Òœg‘æ<‹4çÄ9Ï"ÍyiÎ3sž?–;‹´ÜY¤åÎ .wi¹³H˃¼ÜY¤åÎ"-wi¹3HË5Zî,Òrg—;‹¾ö‡ËËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹´ÜÄåÎ"-wi¹3HË5—ý‰ârg–;ƒ¸ÜY¤åÎ"-w=µÜY¤åÎ"-wi¹s—;‹´ÜY¤åÎ"-wq¹³HËEZî ârg‘–;‹nûååÎ .wa¹³FËAZî¬Ñrg‘–;‹´ÜÄåÎ"-wi¹3ˆËEZî,Ârg–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Òrg—;‹´ÜY¤åÎ",wŽñrg–;k´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒ´ÜY£å΢s Zî ârg‘–;‹´ÜÄå΢¯ýqòrg‘–;ƒ¸ÜY„åÎ-wa¹3†ËEZî,Òrg—;‹´ÜY¤åÎ"-wq¹³Ë5ZîÄåΚËþ6y¹³HËA\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEXî¬Ñrg‘–;ƒ¸ÜY¤åÎ"-wq¹³HËE·ýqârg —;‹ÖÞ¸ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒžZî,Òrg‘–;‹°Ü9ÆËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³Ë5Zî,Ârg —;‹´ÜY¤åÎ .wi¹³HËEZî ârg‘–;‹´ÜÄåÎ",wÖh¹³HËA\î,Òrg‘–;‹´ÜÄåÎ"-wa¹3†ËEû-wi¹s—;‹´ÜY¤åÎ .wi¹³HËEZî ârg‘–;‹°ÜÃåÎ"-wý‹ßeõrg—;‹´ÜY¤åÎ .wa¹³FËEXîŒárg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹´Ü¤åÎ-wi¹ó…–å΢ËYî|þùŸý·¸sãÎz:îä¸sãÎAŽ;ÿ -îä¸sãÎAŽ;_h‰;9îä¸ó…–¸sãÎAŽ;9î|!ÇcwrÜùBKÜ9Èqç Æcw¾ÐwrÜ9Èqç -qç ǃwrÜùBKÜ9Èqç ǃw¾ÐwrÜ9Èqç -qç ǃwŽqÜùmqgãΠƃw1î bÜĸsãÎ Å1Œ;9î bÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bܤ¸sŒãÎ ÆAŒ;_h‰;ƒwñÄAŒ;9î bÜĸsãΠ/ýOãΠƃw1î bÜĸsãÎ ÆAŒ;9î RÜø3ˆqç ÇAŒ;ƒwrÜtÙߨ%î bÜ9ÈqgãΠƃžŒ;ƒw1î bÜùBKÜĸ3ˆqgãÎAŽ;ƒw)îã¸3ˆqgãΠÏqçAh9ß ù*ÆAŒ;9î ºìÖw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ ÆAŒ;1îŒaÜĸsãÎ ÆAŒ;ƒw¾Ðw1î bÜ9ÈqgÐç¸óS´˜¯dñÄâs‹Ï ŸA,>¹ø bñô¹øüwrÜĸ3HqçÇAŒ;ƒw1îä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;9î bÜĸ󅖸3ˆqgãΠƃwÆ0î bÜ9ÈqgÐ×þp-qgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎ ÆAŒ;1ìO”ãÎƃw1î bÜ9èɸ3ˆqgãÎ Æ/´ÄAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgâÎƃwÆ\ÔÏ1î bÜ9ÈqgãΠƃw1î RÜøsãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw)î|™%î RÜøsãÎ ÆAŒ;ƒwrÜĸ3ˆqç Æ1Œ;ƒ>ÿÆ]ãÎAŽ;ƒw1îä¸3èkœ–¸3ˆqç ÇAŠ;cw)îã¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgâÎÆ/ä¸3沿MKÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŠ;cw1îä¸3ˆqgãÎAŽ;ƒw1î RÜ9ÆqgÐúÏ›ãÎAŽ;ƒ.ûã´ÄAŒ;9î bÜĸsãÎ ÆAŒ;ƒw¾Ìw1î bÜĸsãÎ ÆAŒ;9î RÜø3HqçÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3Hqg ãΠƃw1î bÜĸsãÎ ÆAŠ;Ç8î ÚÏ0î bÜùBKÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgâÎ1Ž;ƒwý‹ße]âÎAŽ;ƒw1îä¸3Hqg ãÎ Åcw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç Æ1Œ;ƒwþA[ÜtùOqçíŸÏýw¾ jÜùn^tЉ;qéĺԸS—w~¾ô#îjÜùùã~ĺԸ—N܉K'îjÜ tâN¡ÆB;…wâGи‡NÜ©C;qéÄB—Äø¸Æ:Ô¸‡N܉K'îԥƸtâN\:q§.5îj܉;q'.¸S—wêRãN\:q'.¸S¨q'Љ;…w %î”iÜùù'ð#îü|éGÜItÿkÿ¸ÆºÔ¸“—wòRâN]jÜ©K‰;y(q§5îÔ¥ÆD‰;ùq‰;u©q§.5îä¥Ä¼”¸S¨q'Qþ0L”¸S¨q'QâNýwòRâN¡ÆD×õúwêoÜ©K;y)q'/MÜ©C;u¨q'/%îÄ¥w%îÄǸ“—wêRãN]jÜI”¸S¨q'Ñ×üÑu}£~Äú4îԥƼ”¸“—žûuâN}\ãN^zìoÔ‰;u)q'Ýö7êĺԸS—wÝ÷7êĺԸ“—nûuâN¡ÆDßûuâN¡ÆD_ûuâN^züz£Þ\:q'.¸“辿Q_;u©q§.5îä¥ÇúF¸S‡wòÒm£NÜ©K;ÿ÷Ò»¸3_uÝ­wêówêRãN¢Ûþh¸S¨q'Ñ÷þh¸S?‚ƺԸ“—®û£uâN]jÜIô½?Z'îä¥çþh5îÔ¡Æ<ôøøh}êç+[|êü3ŧ¾ÑþÏåï~Ÿ@§øÄÇâ“—R|êR‹O]jñItÛ_²w 5î$úÞ_²wêGиS—wòÒí×KööÒcÉNÜ©kÜÉK÷õ%;q§5îä¥ëþ’¸S—wêRãN¢Ûþp¸S—wêRãN^zì׉;‰.ûÃuâN¢çþp¸S?‚Ƽtß®wâÒ‰;yé¶?\'îÔÇ%îÔ¡ÆP'îÄ¡Æ4÷ý:q§.5îä¥Ûþ@¸S—wêRãN^ºïTãNšËþ>MÜ©oºq§Î4î$úÞ§w 5îÔ7Þ¸“—®ûãtâN]jÜ©K‰;yèöëqz{èù×ö€¸“èº?N'îԥƺԸ“—nûãtâN]jÜIô½>N'îjÜIsÙߦwâpâN]jÜI”¸“辿M'îÔ7Þ¸“—®ûÛtâN]jÜ©K‰;yè¶?N'îÔ§5îԥƼôاwêRãN^ºíSãN™ÆDë?o;…wê?~ãN^ºíÓ‰;…w}ïÓ‰;u©q§.5îä¥ëþ:5îÄ¡wâЉ;yé¾ÿåÀ‰;õq;u©q'/=ö×éÄD—õu:q'Ñs};‰®ûëtâN]jÜ©K;yé¶¿N'îÔÇ5îԥƼtß_§wêRâNºþzÞJÜ©K÷ñû¬'îÔÇ5îä¥çþ:¸S—¿Ÿõí¥Çú:¸“h?ó”ÝQvÖ‘lÑiµ   œÿÄž­ÊˆÄ£òWÿFAhv_“ÆV>î×iq'¾èÅXZÜÉ¥ÏûuZÜÉèí~wré÷ý:-îÔRq'—žçë´¸SCÅ\ú?˺¸SWÜ©¥âN.=ï×iq§–‚;9ôq¿NÅjŠ;ýù“¬ßFûuZÜ©o@q§–Š;¹ôy¿N‹;õqÅ\zܯÓâN-wj¨¸“CÁ?/}Á?/}Áÿ½ô߸ó??¸þïÿwoÜÙH¸3qg#áÎF„;'2îl$ÜÙH¸³‘pg"âÎF„;w6îl$ÜÙH¸3‘pgáÎF‰ˆ; w6îl#Ü™ˆ¸³‘pg#áÎDÄ„; w6îLDÜÙH¸³‘pg#áÎDÄ„; w&"îl$ÜÙ¸³pçDÆwnÜÙH¸s#à΀;7îl$ܹÑϸsàÎFÂwnܹpg#á΀;7îܸ³‘pçFÀw6îܸs£ÇÏÿmÄFÀ„;7îܸ³‘pçFÀwnô3îl#ܹpçFÀ‰ˆ;7îÜ Þ¸³‘pçFÀw6îÜè×Ïç³pçFÀ„;7îܸs#àÎFÂwnÜÙH¸s£Ÿqç6Àw6îܸs#àÎF½ÝoqçFÀ„;7îܸ³‘pçFÀwnÜ™ˆ¸s#à΀;7îl$ܹpçF?ãÎ6Âwnܹpg£ÿ wî¯îܸ³‘pçFÀwnÜÙH¸s#à΀; wnܹÑϸó{µ¸¿ⳑÄçFŸA|nñÙâsˆÏ~Ÿ wnܹÑãçÿöb#àÎDÄwnÜÙH¸s#à΀;7îl$ܹpçFÀ„;7îܸs#àÎFÂwnô3îl#ܹpçFÀw6îܸs#à΀; wnܹpg#á΀;7îܸ³‘pçFÀw&"îܸs#à΀;wnܹpg#áÎ~ÝoqçFÀ„;7îܸs#àÎFÂwnÜÙH¸s#à΀;7îl$ܹpçFÀ€;·y»Ÿ(áÎm€; wnܹpg#á΀;7îܸ3qçFÀwnÜÙH¸s#à΀; wnܹpçFÀ„;7úwnÜÙ¸sà΀;7îl$ܹpçFÀ„;7îÜègܹ pg#á΀;7îܸ³‘pçFÀw6îܸs£Çý@ w¦!îÜègܹ pg#á΀;7îܸ³‘pçFÀw6îܸs£Ÿ~ân àÎFÂwnÜÙH¸s£_÷ãDܹpg#áÎ~ÆÛwnô3îl#ܹpçFÀ„;7îܸs#àÎFÂýŒ;·îL$ܹÍÛý6wnÜÙH¸s#à΀; wnܹpçFÀ„;7úwnܹpg#á΀;7îl$ܹpçFÀýŒ;Ûwntþ~îl$ܹpçFÀw6îܸs#àÎFÂwnܹÑϸ3 qçFÀwnÜÙH¸s#à΀; wnô3îܸs£Ÿqgá΀;7îl$ܹpçFÀw6îܸs#àÎFÂýŒ;·îܸ³‘pçFÀwnÜÙH¸s#àÎ~Æm„;7ºg€;7îLDܹpçFÀ„;7îܸs#àÎFÂwnô3îl#ܹpçFÿàgY‰; wnܹpg#áÎ~ÆÛwnô3îl#ܹpçFÀw6îܸs#àÎFÂwnܹpg#àÎm€;7îœÈ¸s£·ÿ w¾ýçïf¿àÎoŽ‚6*îüæ¼h¢ÅXZÜ©¥âN-wþ¼ôw**îüùã¾àN-wbiq'–w**îD´¸SQq§¢âNEÅøwbhq§†Š;±´¸SQq'>®¸SCÅZ܉¥ÅZ*îÄÒâN,-îÔRq§¢âN|ÜâN,-îÔRq§–Š;±´¸K‹;w"ZÜ©¨¸SQp§šâΟ¿ÿZÜùóÒ¿w2zþu\q§–Š;¹ÜÉ¥àN-wj)¸“CÁ*îÔRq'£àN~\p§–Š;µTÜÉ¥àN.w**îd”? 3 îTTÜÉ(¸Sß‚âN.w**îdôq¾Q_p§¾ðâN-wr)¸“Kƒ;5TÜ©¡âN.wbé?ÿÉúýú†/îÄÇ-îäRp§–Š;µTÜÉ(¸SQq'£_ów>Œ>Î7ê îÔ· ¸SKÅ\ îäÒïûZÜ©+îäÒçýF-îÔRp'‡÷µ¸SKÅZ*îdô¼ß¨ÅZ*îäÒã~£w**îdô~¿Q‹;w2úu¿Q‹;¹܉¥ÅXZÜÉèy¿Q‹;µTÜ©¥âN.}žoÔâN wréq¿Q‹;µTÜ©¥ZÎÿ޾ ùUÏûÑZÜùíô·1¿òí~ÉV|2ú}¿d+>½ß/ÙŠO}_*>µTñÉ¥û%[Ü©¥âNFï÷K¶¸“K¿ï—¬¸SCÅú¼_²ÅZ*îäRp'—~ß/ÙâN|ÜâN.wj©¸SKÅŒ÷K¶¸SQq'£÷û%[Ü©oAq§–Š;¹ôøã%ûvéó~ÉwêãŠ;¹ô<_²Å*îäÒÇý’-îÔRq§–Š;=î‡kq§–Š;µTÜÉ¥ÏûZÜÉèí~£w2ú}¿Q‹;õ-(îäÒó~£wbiq'—÷µ¸SÜ©¡âN=ï7jq§–Š;¹ôq¿Q‹;w2z¿ß¨Åú‹;µTÜÉèã~£w**îdôv¿Q‹;õ-(îÔRq§–Š;¹ôüãún)¸SCŌ絸SCÅZ*îäÒó~¢wj©¸“ÑÇOÔ·ÑçýD-“KÏ?ž¨o—~ßOÔâNF÷µ¸SQq§¾ðâN.=î'jq§–Š;µÜÉ¡çýBwêÊ;9ô¸_¨ÅZ*îÔRq'—‚;µTÜ©¥âNFƒ;Ù|ÞÔâN}ÝÅ\zÞÔâNEÅŒ‚;õ…wj©¸SKÅ\zÜTq'†wb¨¸“Íó~ wj©¸“KûZÜ©¥âN-wréy?PÅlÞî÷ip§¾èâNÍw2z¿§ÅŠŠ;õ…wréã~œwj©¸SKÁzüñ8};ôû¯ë[ÜÉèã~œwj©¸SKÅ\zÜÓâN-w2z?§ÅˆŠ;Ù¼ÝoÓâN|wj©¸“Qp'£çý6-îÔ^ÜÉ¥ûmZÜ©¥âN-wrèq?N‹;õiÅZ*îäÒçý8-îÔRq'—÷ãTÜ©¦¸“Ñùû­¸SQq§þñ‹;¹ô¸§ÅŠŠ;½ßÓâN-wj©¸“K÷ëT܉¡ÅZÜÉ¥çý—‹;õqÅZ*îäÒçý:-îdôv¾N‹;ý>_§ÏâNF÷ë´¸SKÅZ*îäÒã~wêãŠ;µTÜÉ¥çý:-îÔRp'‡>þx¾úüër_p'£÷ûuZÜÉ¥ß÷ë´¸SKŸþ<ë·KŸçë´¸“Ñ=ó¸_§Åø¢wbiq'—>ï×iq'£·ûuZÜÉ¥ß÷ë´¸SKÅ\zž¯ÓâN wréü,ëâN}\q§–Š;¹ô¼_§ÅZ îäÐÇý:wª)îdôçO²~=î×iq§¾ÅZ*îäÒçý:-îÔÇwréq¿N‹;µÜ©¡âN=Ï×é îüyé îüï¥ïpçß°»pçDƯèÀwNdÜ9‘qçßÑ…;'2îœÈ¸s"ãÎWtàΉŒ;'2î|EîœÈ¸s"ãΉŒ;_‘qç4Æw¾¢wNdÜ9qç4ƯèÀwNdÜùŠÜ9‘qçDÆw¾¢wNdÜ9‘qçDƯèÀwNdÜùŠÜ9‘qçDÄÓwþ]¸3qg"âΉŒ;½éÇw&"îœÈ¸3‘pgâΉŒ;w&"îLDÜ9‘qg"âÎDĉˆ;'2îLDÜ™ˆ¸s"ãÎDĉˆ;wNdÜ™ˆ¸3qçDƉˆ;w&îœÆ¸3qg"âÎWtàÎDĉøâDÄw&"îLDÜ9‘qg¢_ú;ŸDĉˆ;'2îLDÜ™ˆ¸3qçDƉˆ;wNdÜ™H¸3 qg"âΉŒ;w&"îœÈ¸3ÑÛýF¸3qçDƉˆ;wNdÜ™ˆ¸3qg"âÎWtàÎDĉˆ;wNdÜ™ˆ¸3‘pç4Ɖˆ;w&"ó'\™_ù³øüxNàù%¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™ˆ–3-çD¶œ‰h9Ñr&¢åœˆ–3 -g"ZΉl9Ñr&¢åLDËùŠË™ˆ–3-çD¶œ‰Þî‡ë°œ‰h9'²åLDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™ˆ–3‘,ç4¶œ‰h9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–ó–3-g"ZÎD´œÑr¦¡åLDË9‘-g¢_÷uXÎD´œÙr&¢åLô¸ß¨ÃrNdË™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉh9Ó¼ÝO”-gZΉl9Ñr&¢åœÈ–3-g"ZÎD´œ¯è°œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9‘-g"YÎ4´œÑr¦¡åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™H–3 -çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åL$ËùjË™H–3 -çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉh9ÓÐr&úùìRÐrNdË™ˆ–3-çD¶œ‰~ÝÓa9ÑrNdË™H–3 -g"YÎil9Ñr&¢åœÈ–3-g"ZÎD´œÙr&’åLCËùŠl9Ó¼ÝoÓa9ÑrNdË™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3‘,gšÇý8–s"[ÎD´œ‰h9'²åLDË™ˆ–3‘,ç4¶œ‰Îßo¶œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™ˆ–3‘,ç«9,g"ZÎD´œ‰h9'²åLDË™ˆ–s"[ÎD²œih9ÉrNcË™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ér¦¡åLDË9‘-g"ZÎD´œ‰h9'²åLDË™H–s[ÎD÷ -g"ZÎWtXÎD´œ‰h9'²åLDË™ˆ–3-çD¶œ‰h9ÉrNcË™ˆ–3Ñ?øÑÕÃrNdË™ˆ–3-çD¶œ‰d9ÓÐr&’åœÆ–3-g¢Çý:–s"[ÎD´œ‰h9'²åLDË™ˆ–3-çD´œih9Ñrþ]–3ÑÛÿb9ÿýÿîÞÞ¿ZÎïn€&ªåüîšèDk9±´–SKµœZªåüyé‹åTTËùóÇ}±œZªåÄÒZN,­åTTˉh-§¢ZNEµœŠj9ñ-¨åÄÐZN Õrbi-§¢ZN|\-§†j91´–Kk9µTˉ¥µœXZË©¥ZNEµœø¸µœXZË©¥ZN-Õrbi-'–Ör*ªåD´–SQ-§¢Ç_÷P-çÏß/–óç¥/–“Ñó¯ûãj9µTËÉ¥Ç_×ïÞ/–SKµœZŠåäP,§†j9µTËÉ(–“Ë©¥ZN-Õrr)–“K±œŠj9åÃŒb9Õr2ŠåÔ· –“K±œŠj9}œoÔË©/¼–SKµœ\ŠåäÒXN Õrj¨–“K±œXZËÉ(–÷ŸÿŒþ÷R,§–j9µTËÉ(–SQ-'£_ów>Œ>Î7ê‹åÔ· –SKµœ\ŠåäÒïûZË©«åäÒçýF­åÔR,'‡÷µ–SKµœZªådô¼ß¨µœZªåäÒã~£Ör*ªådô~¿Qk9Õr2úu¿Qk9¹ôùÇõÍÒZN,­ådô¼ß¨µœZªåÔR-'—>Ï7j-§†j9¹ô¸ß¨µœÿ½ôÓ̯,ðÔ|-'£çýp­åÔR-'£Çýp­åTTËÉèý~¸Örê[PË©¥ZN.}Ü×ZN-Õr2z¿®µœ\ú}?\µœªåäÐçýp­åÔR-'—b9¹ôû~¸ÖrâãÖrr)–SKÿú¿ûáZËÉèq?\k9Õr2z¿®µœúÔrj©–“K?®o—>ï‡k-§>®–“KÏóáZË©¡ZN.}Ü×ZN-Õrj©–“Ñã~£Örj©–SKµœ\ú¼ß¨µœŒÞî7j-'£ß÷µ–Sß‚ZN.=ï7j-'–Örréq¿Qk9õq±œªåäÐó~£Örj©–“K÷µ–SQ-'£÷ûZË©/¼–SKµœŒ>î7j-§¢ZNFo÷µ–Sß‚ZN-Õrj©–“KÏ?Þ¨ï–b95TËÉèq>Qk95TË©¥ZN.=ï'j-§–j9}üñD}}ÞOÔZN|ák9¹ôüã‰úvé÷ýD­ådôq?Qk9Õrê ¯åäÒã~¢Örj©–SK±œzÞ/T-§>¬–“Cû…ZË©¥ZN-Õrr)–SKµœZªåd4–“Íçý@­åÔ×]ËÉ¥çý@­åTTËÉèã~ Örj©–SKµœ\zÜT-'†Örb¨–“Íó~ Örj©–“KûZË©¥ZN-Õrréy?PµœlÞî÷i,§¾èZNÍÔr2z¿§µœŠj9õ…×rréã~œÖrj©–SK±œzüñ8};ôû¯ë[ËÉèã~œÖrj©–SKµœ\zÜÓZN-Õr2z?§µœˆj9Ù¼ÝoÓZN|Örj©–“Q,'£çý6­åÔ^ËÉ¥ûmZË©¥ZN-Årrèq?Nk9õiµœZªåäÒçý8­åÔR-'—÷ãTË©¦–“Ñùû­–SQ-§þñk9¹ô¸§µœŠj9½ßÓZN-Õrj©–“K÷ëTˉ¡µœZËÉ¥çý—k9õqµœZªåäÒçý:­ådôv¾Nk9ý>_§ÏZNF÷ë´–SKµœZªåäÒã~Örêãj9µTËÉ¥çý:­åÔR,'‡>þx¾úüëb_,'£÷ûuZËÉ¥ß÷ë´–SKŸþøê·KŸçë´–“Ñ=ó¸_§µœø¢×rbi-'—>ï×i-'£·ûuZËÉ¥ß÷ë´–SKµœ\zž¯ÓZN ÕrréüèêZN}\-§–j9¹ô¼_§µœZŠåäÐÇý:Õrª©ådôç®~=î×i-§¾µœZªåäÒçý:­åÔÇÕrréq¿Nk9µË©¡ZN=Ï×é‹åüyé‹åüï¥ï,ç~Ð÷8Ë9 ¯r¾圆79§áIÎix‘óïæ8È9 ïqNóÐ9ÎixóÕøç4¼Å9 Oq¾_✆‡8§áÎix†óÕð ç$<Â9 op¾Ÿàœ†8§ÑÎIxóÕøüæ4¼¾9 o¾ßÞœ†§7§áåÍixxóÕøîæ4<»9 ¯nN㛯Æ77§áÉÍixqóÕøàæ4¼·9ÎmNÂk›7DZÍ4ºµ™F§6§ù—.m¦Ñ¡Í4º³™Fg6§á•Í48²™D76§á‰Í4º°™F6Óè¾æ4<¯™F×5Óè¸fÝÖœ†§5Óè²fÖœ†w5Óè¬f]ÕL££šÓð¦fÔL£‹šÓð fÝÓL£sšipMsÓL£[šitJóÕø’fÒL£QÑœ†W4ÓèˆfÝМ†'4ÓüúëçÓVÐL£û™Óð|f]ÏL£ã™it;sžÎL£Ë™it8sÞÍLƒ³™It53ŽfNÛ™it23.fNÙiÞÎWÇç2ÓèZæ4<–™F·2ÓèTæ4¼”™F‡2ÓèNfÉ|5¾’™FG2ÓèFfÈœ†2Óè@fÜÇœ„ç1Ó¼¯ŽŽcþd%çê`æ4¸—¹.c¦ÑaÌix3Îb¦ÑUÌ4:Š9 ob¦ÑIÌ4ºˆ9 b¦Ñ=Ì4:‡™F×0§á1Ì4º…™F§0Óèæ4:„™Dw0Óè æ4¼‚™FG0ÓèfÀ|5¾€™F0Óèþå4ÿÒùË4º~™FÇ/Óèöå4<}™F—/Óèðå4¼{™Fg/Óèêe½œ†7/Óèäe\¼œ„/ÓèÞe»L£k—ÓðØeݺL£S—itérºL£;—itær^¹L£#—itã2N\Nà —ità2î[¾Ÿ·L£ë–itÜ2n[N£Ó–ItÙ2[Nû–i~¯Ž¯Z¦ÑQËixÓ2NZ¦yœ¯ŽZNÃ{–itÎ2®YNÃc–iÞÎWǧ,Óè’å4e§œ†×)Óè8eݦœ†§)Óè2e¦Lƒ»”¯Äg)Óà*e¥œæ_ºI™F')Óè"e¤œ†÷(Óèe]£œFÇ(“èešï$Ð%Êixˆ2îP¦ÑÊix…2ͯó¹ñ Ê4:A9 /P¦ÁÊ$º?™ç''áõÉ4:>™F·'§áéÉ4oçsãÓitwržLƒ«“IttòÕðæd’·óµñÅÉ4:89 ïM¦Ñ¹É4º69 M¦Ñ­É4:5™F—&§á¡É4¸3™Dg&ÓèÊä4<2™F7&ÓèÄä4¼0™F&Óè¾dœ—œ„×%Ó\¿½x[rž–L£Ë’itX2îJNó’itU2ŽJNÛ’itR2.J¦ÁAÉWâ{’itN2®I¦Ñ1ÉixK2NI¦Ñ%ÉixH2 îH&ÑÉ4¸"9 H¦Ñ É4:!9 /H¦ÑÉ4º™Fç#§áõÈ4:™F·#§áéÈ4¸™D‡#Óènä4<™FW#ÓèhdÝŒœ†'#ÓèbdŒœ„÷"Óœ#º™FÇ"_oE¦Ñ©È4º9Í¿t(2îD¦Ñ™È4º9 D¦ÑÈ489 /D¦ÑÈ4÷dú<ä4¼™FÇ!Óè6ä4< ™—!“è0dÜ…œ„g!Óè*d…L£›Óð$d]„L£ƒÓðdš·ó½ñ5È4:9nA&Ñ)È4ºùws‚Lóö?Ýüû¿ó¸ðàDÖƒ¯èàƒÙNd@8‘áßÑE'²!œÈˆp"+ÂWt0‰ì'2$|E‡$œè”p"[‰Œ _‘5á4æ„Ù¾¢NdQ8Iá46…¯è@…YNdVøŠW8‘aáD–…™¾¢ÃNd\8‘uáDæ…¯èð…NdaøŠb8‘áDD†ÓXþ]Ì0a"BÉ, ‘&¢5LDl8‘µa"qÃ4ô†&¢8LDr˜ˆæp"£ÃDT‡‰ÈÑNdx˜ˆò0éáD¶‡‰ˆQ&"?œÈþ0b" ĉLÑ &"BL$…8b":ÄD„ˆ¯èˆ‰Hñ¾‰ˆ'²FLDŽ˜ˆq"ƒÄD¿ô·9‰HÑ$Nd”˜ˆ*1Yb"ºÄ‰ Q&&"MœÈ61ÑÛùF:1yâDö‰‰Q(Nd¢˜èí~£¤˜ˆJq"3ÅDtЉ'²TLDª˜ˆV1±â+:´b"rÅDôЉ'²XLD²˜Hfq£ÅDo?¾Q?‰ÄüÊŸ-ã—ˆnq"ÃÅD”‹‰H'²]LD¼˜ˆz1ùâDö‹‰Q0Nd˜ˆ†1c"*ƉÌÑ1&"dLDÉ8)cZÆDÄŒY3&"gLDϘˆ ñ¢1Ic"šÆ‰ŒQ5&"kLD×8‘ac"ÊÆD¤Ù6&"nLDݘˆ¼q"ûÆDމ$§1qLD㘈È1•ãDfމè:&¢tœÈÔ1­c"blj¬‘;&¢wLDð8‘Åc"’ÇD4¯è@‰¨‘=&¢{œˆð1 åc"Òljlýºß¨C?&"œÈþ1d" ÈD$Ù@&"‚LD9‘d¢·û: d"JȉL!ÑB&"†œˆ2ÍÛýDÙC¦!ˆœÈ"2Id"šÈ‰Œ"QE&"‹LDùŠ™ˆ22Ñó'êÛ%ÚȉŒ#QG&"œÈ>2d" ÉD$’ÙH&’LC%9™d:ÉD„’‰(%'2•LD+™ˆXr"kÉDä’‰ä%ÓLNd1™ˆd2Íd"¢É‰¬&‘M&¢›œÈp2åd"ÒÉD²“¯æÀ“‰¤'ÓONd?™ˆ€2e"ʉl(Q&¢¢œˆŒ2 e¢Ÿº.%åD¦”‰h)SNdM™è×ý8ž2AåD•‰D*ÓÐT&ªœÆª2Ye"ºÊ‰ +QV&"­LD[9‘qe"éÊ4䕯Ⱦ2ÍÛý6Â2‰åD6–‰ˆ,QYNdf™ˆÎ2¡e"JˉL-ÉZ¦!¶LDm9‘¹e"zËD—Y\&"¹LDs™Hèr«ËDçï7»Ë‰ /Q^&"½LD{9‘ñe"êËDä—Ù_&"ÀLD™HóÕ3f¢çý—ÜÈ3!f"J̉L1Éb¦!ÆL$99f"zÌD™Yd&"ÉLD“™ˆ(s"«ÌDd™‰è2'2ÌL$™™†43mæDÆ™‰¨3‘g&¢ÏœÈ@3…f"Íil4Ý3Tš‰È4_Ñá4j&¢ÔœÈT3­f"bÍDÔš™k&¢×L$°9Åf"’ÍDÿàGW´9‘Õf"²ÍDt›n&’ÜLCº™HvsãÍDÔ›‰È7ÑoNdÀ™ˆ‚3 çD6œ‰ˆ8Qq&"㜈Ž3 !g"Jr&zû_,ç¿ÿÔúñ¯Ër&¢åœÈ–3-g"ZÎD´œ¯è°œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9-gZÎD´œÙr&¢åL$Ë™†–s"[ÎD´œ‰h9'²åLDË™ˆ–3-çD¶œ‰h9=e9ÑrNdË™ˆ–3-çD¶œ‰h9Ér¦¡å|E‡ål$ËÙH–3-g#YÎF²œd9Ñr6‚ål#Ë™ˆ–³‘,g#YÎF²œ‰h9Ér6’ål$Ë™ˆ–³‘,g#YÎD´œd9Ér6’åLDËÙH–³‘,g"ZÎF²œd9Ár¦¡ål$ËÙH–s"[ÎF²œôâF²œ‰h9Ér6’åLDËÙèþΧ‘,g#YÎD´œd9Ér6’åLDËÙH–³‘,g"ZÎF°œmd9Ér&¢ål$ËÙH–3-g£·û²ål$Ë™ˆ–³‘,g#YÎD´œd9Ér6’åœÈ–³‘,g£çýFÙr&¢ål$ËÙ–3 ,çL³¿ògàù%’ål$Ë™ˆ–³‘,g#YÎD´œd9Ér6’åLDËÙH–³‘,g"ZÎF²œd9Ér&¢ål$ËÙH–³‘,g"YÎ6²œd9Ñr6’ål$ËÙH–s"[ÎF²œd9Ñr6’ål$ËÙH–3-g#YÎF²œ‰h9Ér6’ål$Ë™ˆ–³‘,g#XÎ4´œd9Ér6’åLDËÙH–³‘,g#YÎD´œd9Ér&¢ål$ËÙH–³‘,g"ZÎF²œd9'²ål$ËÙH–³‘,g"YÎ6²œd9ý’ålôë~£l9Ér&¢ål$ËÙH–³‘,g"ZÎF²œd9Ñr6’ål$ËÙH–3-g#YÎF²œ‰d9Û¼ÝO-gYÎD´œd9Ér&¢ål$ËÙH–³‘,çD¶œd9=ñ1d9Ñr6’ål$Ë™ˆ–³‘,g#YÎF²œ‰h9Ár¶‘åL$ËÙF–³‘,g#YÎD´œd9Ér&¢ål$ËÙ–³,g"ZÎF²œd9Ér&¢ål$ËÙH–3-g#YÎF²œ`9§±ålËÙF–3-g#YÎF²œd9Ñr6’ål$Ë™H–³,g£À®…,g"ZÎF²œd9Ñr6úu?N¶œd9Ñr6‚ål#ËÙ–3 -g#YÎF²œ‰h9Ér6’ål$Ë™ˆ–³,gYΉh9Û¼Ýo“-g#YÎD´œd9Ér&ú%ËÙH–³‘,g#YÎD´œ`9ÛÈr6’åLDËÙH–³‘,g"ZÎF²œd9Ár¦¡åltþ~£åLDËÙH–³‘,g#YÎD´œd9Ér&¢ål$ËÙH–³,ç4¶œd9Ér6’åLDËÙH–³‘,g"ZÎF°œmd9Ár¦¡ål$ËÙH–3-g#YÎF²œd9Ñr6’ål$Ë™ˆ–³,gYÎF²œ‰h9Ér6’ål$Ë™ˆ–³‘,g#XÎ4´œîYÎF²œÙr6’ål$Ë™ˆ–³‘,g#YÎF²œ‰h9Ér6‚åLCËÙH–³Ñ?øÑU[ÎD´œd9Ér&¢ålËÙF–³,gZÎF²œd9Ér&¢ål$ËÙH–3-g#YÎF²œd9Ér¶‘ål$ËùŠËÙèí²œÿþ£ÏçWËùøCüsz¢ZÎDÿßùŠÖrbi-§–j9µTËùóÒË©¨–óçûb9µTˉ¥µœXZË©¨–ѯZNEµœŠj9Õrâ[Pˉ¡µœªåÄÒZNEµœø¸ZN Õrbh-'–Örj©–Kk9±´–SKµœŠj9ñqk9±´–SKµœZªåÄÒZN,­åTTˉh-§¢ZNE±œjj9þ|±œ?/}±œŒò‡a}\-§–j9¹ËÉ¥XN-Õrj)–“C±œªåÔR-'£XN~\,§–j9µTËÉ¥XN.År*ªåd”? 3ŠåTTËÉ(–Sß‚ZN.År*ªådôq¾Q_,§¾ðZN-Õrr)–“Kc95TË©¡ZN.Årbi-'£XN|ÜZN.Årj©–SKµœŒb9ýʈýš¿óaôq¾Q_,§¾µœZªåäR,'—~ßoÔZN}\-'—>ï7j-§–b99ô¸ß¨µœZªåÔR-'£çýF­åÔR-'—÷µ–SQ-'£÷ûZË©¨–“ѯûZËÉ¥Ï?Þ¨o–Örbi-'£çýF­åÔR-§–j9¹ôùÓõÓœ_Xà©õZN}µœ\ŠåÔR-§–j9=ï‡k-§–j9=î‡k-§¢ZNFï÷õ–Sß‚ZN-Õrréã~¸Örj©–“Ñûýp­åäÒïûáªåÔP-'‡>ï‡k-§–j9¹ËÉ¥ß÷õ–·–“K±œZªåÔR-'£Çýp­åTTËÉèý~¸Örê[PË©¥ZN.=þx¸¾]ú¼®µœú¸ZN.=Ï?\­åÔP-'—>î7j-§–j9µTËÉèq¿Qk9µTË©¥ZN.}ÞoÔZNFo÷µ–“ÑïûZË©oA-'—ž÷µ–Kk9¹ô¸ß¨µœú¸XN Õrrèy¿Qk9µTËÉ¥ûZË©¨–“ÑûýF­åÔ^Ë©¥ZNF÷µ–SQ-'£·ûZË©oA-§–j9µTËÉ¥çoÔwK±œªådô8Ÿ¨µœªåÔR-'—ž÷µ–SKµœŒ>þx¢¾>ï'j-'¾ðµœ\zþñD}»ôû~¢Ör2ú¸Ÿ¨µœŠj9õ…ÿçÞKû‰ZË©¥ZN-Årrèy¿Pµœú°ZN=îj-§–j9µTËÉ¥XN-Õrj©–“ÑXN6Ÿ÷µ–S_w-'—ž÷µ–SQ-'£ûZË©¥ZN-Õrréq?PµœZˉ¡ZN6ÏûZË©¥ZN.=îj-§–j9µTËÉ¥çý@Õr²y»ß§±œú¢k95SËÉèý~œÖr*ªåÔ^ËÉ¥ûqZË©¥ZN-ÅrrèñÇãôíÐï¿®l-'£ûqZË©¥ZN-Õrréq?Nk9µTËÉèý|œÖr"ªådóv¿Mk9ñ XË©¥ZNF±œŒž÷Û´–S_x-'—>î·i-§–j9µËÉ¡Çý8­åÔ§Õrj©–“KŸ÷ã´–SKµœ\zÜS-§šZNFçï·ZNEµœúǯåäÒã~œÖr*ªådô~?Nk9µTË©¥ZN.}ܯS-'†Örbh-'—ž÷_¬åÔÇÕrj©–“KŸ÷ë´–“ÑÛù:­ådôû|>k9}ܯÓZN-Õrj©–“KûuZË©«åÔR-'—ž÷ë´–SK±œúøãuúvèó¯‹E|±œŒÞï×i-'—~߯ÓZN-}þùã«ß.}ž¯ÓZNF÷Ìã~Örâ‹^ˉ¥µœ\ú¼_§µœŒÞî×i-'—~߯ÓZN-Õrréy¾Nk95TËÉ¥ð£«k9õqµœZªåäÒó~Örj)–“C÷ëTË©¦–“ÑŸ?¸úmô¸_§µœúÔrj©–“KŸ÷ë´–SWËÉ¥Çý:­åÔR,§†j99ô<_§/–óç¥/–ó¿—¾³œÿÓu—s"ßå|EÇ]Ή|—s"ßåœÈw9ÿŽ®»œù.çD¾Ë9‘ïr¾¢ã.çD¾Ë9‘ïr¾¢_¾Ë9‘ïrN仜ù.ç+ò]Îi|—s"ßå|EÇ]Ή|—s"ÞåœÆw9_Ñq—s"ßåœÈw9_Ñq—s"ßåœÈw9'ò]ÎWtÜåœÈw9'ò]Ή|—ów9'ò]Ή|—ów9'zûÏ—zE¼Ë9ïrþ]w9ñ.g"ÞåœÈw9ñ.g"ÞåLÄ»œù.g"ÝåLûœù.g"ÞåLÄ»œ‰x—s"ßåLÄ»œ‰x—3ïrN仜‰x—3ïrN仜‰x—3ïr&â]Ή|—3ïr&â]Ή|—3ïr&â]ÎDºË9ïr&â]ÎD¼ËùŠŽ»œ‰x—3ÿåF‰x—s"ßåLÄ»œ‰x—s¢_¼Ë™è×_ø÷w%â]ÎD¼Ë9‘ïr&â]ÎD¼Ë™ˆw9'ò]ÎD¼Ë™ˆw9'ò]ÎDºË™†w9ñ.çD¾Ë™ˆw9ñ.çD¾Ë™èí~£Ž»œ‰x—s"ßåLÄ»œ‰x—s"ßåLÄ»œ‰x—3ïr¾¢ã.g"ÞåLÄ»œ‰x—s"ßåLôó]Οœf~¥ŽuNƒc_"ÞåLÄ»œ‰x—s"ßåLÄ»œ‰x—s"ßåLÄ»œ‰x—3ïrN仜‰x—3ïrN仜‰x—3ïr&â]Ή|—3ïr&â]ÎD¼Ë9ïr¦á]ÎD¼Ë9‘ïr&zÓ¿x2ïr&â]ÎWtÜåLÄ»œ‰x—s"ßåLÄ»œ‰x—3ïrN仜‰x—3ïrN仜‰x—3ïr&â]Ή|—3ïr&zžoÔq—3ïr&â]ÎD¼Ë9‘ïr&â]ÎD¼Ë™ˆw9'ò]ÎD¼Ë™ˆw9'ò]ÎD¼Ë™ˆw9ñ.çD¾Ë™ˆw9ñ.ç+:îr&â]ÎD¼Ë™ˆw9'â]Î4¼Ë™èy¿QÇ]ÎD¿î7ê¸Ë™ˆw9'ò]ÎD¼Ë™ˆw9ñ.çD¾Ë™ˆw9ñ.çD¾Ë™ˆw9ñ.g"ÞåœÈw9ñ.g"Þ圈w9Ó¼ÝO”ïr¦á]Ή|—3ïr&â]Ή|—3ïr&â]ÎD¼ËùŠŽ»œ‰x—3ïr&â]Ή|—3ïr&â]Ή|—3ÑÛýDw9ñ.çD¾Ë™Hw9Óð.çD¼Ë™†w9ñ.g"ÞåœÈw9ñ.g"ÞåœÈw9ñ.g"ÝåLûœù.g"ÞåLÄ»œ‰x—s"ßåLÄ»œ‰x—s"ßåLÄ»œ‰x—3‘îr¾šã.g"ÝåLûœù.g"ÞåLÄ»œ‰x—s"ßåLÄ»œ‰x—s"ÞåLûœ‰~>–‚w9'ò]ÎD¼Ë™èy?NÇ]ÎD¿îÇé¸Ë™ˆw9'ò]ÎDºË™†w9é.ç4¾Ë™ˆw9ñ.çD¾Ë™ˆw9ñ.g"ÞåœÈw9é.gÞå|E¾Ë™æí~›Ž»œ‰x—s"ßåLÄ»œ‰x—s"ßåLÄ»œ‰x—3ïrN仜‰t—3 ïr&â]Ή|—3ïr&â]Ή|—3ÑÛý8w9é.ç4¾Ë™èüý滜ù.g"ÞåLÄ»œ‰x—s"ßåLÄ»œ‰x—s"ßåLÄ»œ‰x—3‘îr¾šã.g"ÞåLÄ»œ‰x—s"ßåLÄ»œ‰x—s"ßåL¤»œix—3‘îrN㻜‰x—3ïrN仜‰x—3ïr&â]Ή|—3ïr&â]Ή|—3‘îr¦á]ÎD¼Ë9‘ïr&â]ÎDÏûu:îrN仜‰x—3‘îrN㻜‰îÞåLÄ»œ¯è¸Ë™ˆw9ñ.çD¾Ë™ˆw9ñ.g"ÞåœÈw9ñ.g"ÝåœÆw9ñ.g¢ð£«Ç]Ή|—3ïr&â]Ή|—3‘îr¦á]ÎDºË9ïr&â]ÎD¼Ë™ˆw9'ò]ÎD¼Ë™ˆw9'ò]ÎD¼Ë™ˆw9ñ.çD¼Ë™†w9ñ.çßÑu—3ÑÛÿr—óßÿÇþï?Ž–3ÑS–s"[ÎD´œ‰h9Ñr¾¢Ãr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™ˆ–3-çD´œih9ÑrNdË™ˆ–3‘,gZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™H–3 -ç+:,g#YÎF²œ‰h9Ér6’ål$Ë™ˆ–³,gYÎD´œd9Ér6’åLDËÙH–³‘,g#YÎD´œd9Ér&¢ål$ËÙH–³‘,g"ZÎF²œd9Ñr6’ål$ËÙ–3 -g#YÎF²œÙr6’ål¤?7’åLDËÙH–³Ñᓈ–³Ñ/üO#YÎF²œ‰h9Ér6’ål$Ë™ˆ–³‘,g#YÎD´œ`9ÛÈr6’åLDËÙH–³‘,g"ZÎFo÷eËÙH–3-g#YÎF²œ‰h9Ér6’ål$Ë9‘-g#YÎF²œd9ÁrþÀ4û+ž_"XÎ4´œd9Ér6’åLDËÙH–³‘,g"ZÎF²œd9Ér&¢ål$ËÙH–3-g#YÎF²œd9Ñr6’ål$ËÙH–3‘,gYÎF²œ‰h9Ér6’ål$Ë9‘-g#YÎF²œ‰h9Ér6’ål$Ë™ˆ–³‘,g#YÎDo²œd9Ér6’åLDËÙH–³Ñó|£l9Ér6’ål$Ë™ˆ–³‘,g#YÎF²œ‰h9Ér6’åLDËÙH–³‘,g#YÎD´œd9ÉrNdËÙH–³‘,g#YÎD²œmd9=ï7Ê–³Ñ¯û²ål$Ë™ˆ–³‘,g#YÎF²œ‰h9Ér6’åLDËÙH–³‘,g#YÎD´œd9Ér&’ålóv?Q´œmd9Ñr6’ål$Ë™ˆ–³‘,g#YÎF²œÙr6’ål$ËÙH–3-g#YÎF²œ‰h9Ér6’ål$Ë™ˆ–³,gYÎD²œmd9Ér6’åLDËÙH–³‘,g"ZÎF²œ`9ÛÈr&¢ål$ËÙH–³‘,g"ZÎF²œd9Ñr6’ål$ËÙ–s[ÎF°œmd9Ñr6’ål$ËÙH–3-g#YÎF²œ‰Þ`9ÛÈr6úñìZÈr&¢ål$ËÙèy?N¶œ~Ý“-g#YÎD´œ`9ÛÈr6‚åLCËÙH–³‘,g"ZÎF²œd9Ér&¢ålËÙF–s"ZÎ6o÷ÛdËÙH–3-g#YÎF²œ‰h9Ér6’ål$Ë™ˆ–³,gYÎF²œ‰h9Ér6’åLDËÙH–³‘,g#XÎ4´œÎßo´œ‰h9Ér6’ål$Ë™ˆ–³‘,g#YÎD´œd9Ér6‚åœÆ–³‘,g#YÎF²œ‰h9Ér6’åLDËÙ–³,g#XÎ4´œd9Ér&¢ål$ËÙH–³‘,g"ZÎF²œd9Ñr6‚ål#ËÙH–3-g#YÎF²œd9Ñr6’ålË™†–³Ñ=#ËÙH–s"[ÎF²œd9Ñr6’ål$ËÙH–3-g#YÎF°œiÞd9Ér6ú?ºjË™ˆ–³‘,g#YÎD´œ`9ÛÈr6‚åLCËÙH–³‘,g#YÎD´œd9Ér&¢ål$ËÙH–³‘,g"YÎ6²œd9_Ña9½ýO–óo‡pYΉl9_Ña9'²åœÈ–s"[ο£ËrNdË9‘-çD¶œ¯è°œÙrNdËùŠË9‘-çD¶œÙr¾"[Îil9'²å|E‡åœÈ–s"ZÎil9_Ña9'²åœÈ–ó–s"[Ήl9'²å|E‡åœÈ–s"[Ήl9_Ña9'²åœÈ–ó–s"[Ήh9§±åü;º,g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD²œih9'z£åLDË™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD´œÙr&¢åLDË™H–s[ÎD´œ‰h9_Ña9Ñr&âˆÑrNdË™ˆ–3-çD¶œ‰~éï|Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË9‘-g"YÎ4´œ‰h9'²åLDË™ˆ–s"[ÎDo÷uXÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9_Ña9Ñr&¢åLô³åü¿˜æüJëlDË™H–s[ÎD´œ‰h9ÑrNdË™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD´œ‰h9'¢åLCË™ˆ–s"[ÎD´œ‰h9Ñr¾¢Ãr&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–s¢7ZÎD´œ‰h9ÑrNdË™ˆ–3‘,ç4¶œ‰h9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–ó–3-g"ZÎD´œÑr¦¡åLDË9‘-g¢_÷uXÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™ˆ–3-çD¶œ‰h9ÑrNDË™æí~¢l9ÓÐrNdË™ˆ–3-çD¶œ‰h9Ñr&¢å|E‡åLDË™ˆ–3-çD¶œ‰h9ÑrNdË™ˆ–3-g"ZΉl9Ér¦¡åœˆ–3 -g"ZÎD´œÙr&¢åLDË9‘-g"ZÎD²œih9'²åLDË™ˆ–3-çD¶œ‰h9ÑrNdË™èí~ Ë™H–óÕ–3‘,gZΉl9Ñr&¢åLDË9‘-g"ZÎD´œ½Ér¦¡åLôóØ¥ åœÈ–3-g"ZΉl9ýº§Ãr&¢åœÈ–3‘,gZÎD²œÓØr&¢åLDË9‘-g"ZÎD´œ‰h9'²åL$Ë™†–óÙr¦y»ß¦Ãr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9‘-g"YÎ4´œ‰h9'²åLDË™ˆ–s"[ÎD´œ‰h9ÉrNcË™èüýfË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–s"[ÎD´œ‰h9Ér¾šÃr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLôv¾N‡åL$Ë9-g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åL$Ë™†–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"YÎil9Ý3´œ‰h9_Ña9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åL$Ë9-g"ZÎDÿàGWË9‘-g"ZÎD´œÙr&’åLCË™H–s[ÎD´œ‰h9ÑrNdË™ˆ–3-çD¶œ‰h9Ñr&¢åœˆ–3 -g"Zο£Ër&zûŸ,ç¿ÿÏáñÕr>þÃÿœž¨–3Ñÿ÷E¾¢µœXZË©¥ZN-Õrþ¼ôÅr*ªåüùã¾XN-Õrbi-'–Ör*ªåD´–SQ-§¢ZNEµœøÔrbh-§†j9±´–SQ-'>®–SCµœZˉ¥µœZªåÄÒZN,­åÔR-§¢ZN|ÜZN,­åÔR-§–j9±´–Kk9Õr"ZË©¨–SQ,§šZΟ¿_,çÏK_,'£üaXWË©¥ZN.Årr)–SKµœZŠåäP,§†j9µôËÉ(–“Ë©¥ZN-Õrr)–“K±œŠj9åÃŒb9Õr2úû?yß‚ZN.År*ªådôq¾Q_,§¾ðZN-Õrr)–“Kc95TË©¡ZN.Årbi-'£XN|ÜZN.Årj©–SKµœŒb9Õr2ú5çÃèã|£¾XN} j9µTËÉ¥XN.ý¾ß¨µœú¸ZN.}ÞoÔZN-Årrèq¿Qk9µTË©¥ZNFÏûZË©¥ZN.=î7j-§¢ZNFï÷µ–SQ-'£_÷µ–“KŸ¼Qß,­åÄÒZNFÏߨŸ˜f~åïûáZË©šZN.}ž×ZN Õrréq?\k9µTË©¥ZNFÏûáZË©¥ZNFûáZË©¨–“Ñûýp­åÔ· –SKµœ\ú¸®µœZªådô~?\k9¹ôû~¸j95TËÉ¡ÏûáZË©¥ZN.Årré÷ýp­åÄÇ­åäR,§–j9µTËÉèq?\k9Õr2z¿®µœúÔrjéíí¯ë/ ÿµ–“KŸ÷µ–SWËÉ¥çùF­åÔP-'—>î7j-§–j9µTËÉèq¿Qk9µTË©¥ZN.}ÞoÔZNFo÷µ–“ÑïûZË©oA-'—ž÷µ–Kk9¹ô¸ß¨µœú¸XN Õrrèy¿Qk9µTËÉ¥ûZË©¨–“ÑûýF­åÔ^Ë©¥ZNF÷µ–SQ-'£·ûZË©oA-§–j9µTËÉ¥çoÔwK±œªådô8Ÿ¨µœªåÔR-'—ž÷µ–SKµœŒ>þx¢¾>ï'j-'¾ðµœ\zþñD}»ôû~¢Ör2ú¸Ÿ¨µœŠj9õ…×rréq?Qk9µTË©¥XN=殺SVËÉ¡ÇýB­åÔR-§–j9¹Ë©¥ZN-Õr2ËÉæó~ Örêë®åäÒó~ Ör*ªådôq?Pk9µTË©¥ZN.=Ck91TËÉæy?Pk9µTËÉ¥Çý@­åÔR-§–j9¹ô¼¨ZN6o÷û4–S_t-§fj9½ßÓZNEµœúÂk9¹ôq?Nk9µTË©¥XN=þxœ¾úý×õ€­ådôq?Nk9µTË©¥ZN.=îÇi-§–j9½ŸÓZNDµœlÞî·i-'¾k9µTËÉ(–“Ñó~›Örê ¯åäÒÇý6­åÔR-§–b99ô¸§µœú´ZN-Õrréó~œÖrj©–“KûqªåTSËÉèüýVË©¨–Sÿøµœ\zÜÓZNEµœŒÞïÇi-§–j9µTËÉ¥ûuªåÄÐZN ­åäÒóþ˵œú¸ZN-Õrréó~Ör2z;_§µœŒ~Ÿ¯Óg-'£ûuZË©¥ZN-Õrréq¿Nk9õqµœZªåäÒó~Örj)–“C¼Nß}þu±ˆ/–“Ñûý:­åäÒïûuZË©¥Ï?|õÛ¥ÏóuZËÉèžyܯÓZN|Ñk9±´–“KŸ÷ë´–“ÑÛý:­åäÒïûuZË©¥ZN.=Ï×i-§†j9¹ô~tu-§>®–SKµœ\zÞ¯ÓZN-Årrèã~j9ÕÔr2úóW¿÷ë´–S߀ZN-Õrréó~Örêãj9¹ô¸_§µœZŠåÔP-'‡žçëôÅrþ¼ôÅrþ÷Ò7–óßÿ1äó¢œÓPr¾CÎiè8§!㜆Šóïæ@œÓÐpNCÂ9 ç«1àœ†~sòÍWc½9 ñæ4´›Ón¾ÊÍI7§¡Û|5f›ÓPmN#´9 Íæ«1Ùœ†bs‚ÍWc¯9 ¹æ4ÔšÓk¾[ÍiH5§¡Ôœ†PóÕØiNC¦9 •æ«1Òœ†FsÍI(4ÿn ™F>3xæ4Ô™i„3ÓÈf¦Íœ†23 `f¹ÌiÈ2ÓHe¦ÊL#“9 If‰Ì4™iä1§!ÇL#™FsZÌ4¢˜i$1ÓbNC‡™F 3æ4D˜id0Óˆ`¦Àœ„3üeñËWc}™Fø2þ›FôrÊË4‚—iä.§!»Ló ;“Fè2Ìå4$—i$.Ó\¦‘·œ†Ü2´eaËih-Ó€Z&‘´L#h9 e1Ë4R–ÓY¦y;_Ë4–ÓX¦‘¯Ló<_ëÊ4•id+ÓˆV¾ËÊ4?ÃÊÌd~áÏØr±Êi¨*ÓU¦©œ„¤2DeÊ4ò”ÓS¦‘¦L#L9Í»,eQÊ4’”i)§¡£L#F™FŠr"Ê42”iD(ÓHPNC@™F~2ødéÉi„'“ÈN¦œ†r2àd¹É4b“¯Æj2Ðd™ÉiH&ÓHL¦˜L#/9 ¹diÉ4Â’ÓÐJ¦•L#)™FPr:É4b’i $'!’L##™FD2„ä4’iä#ÓˆG¦‘Žœ†82ldÑÈi(#ÓF¦‘‹L#9 Ud¡È42‘¯Æ$2DdÈ4òÓˆC&‘†L# 9 -dš_ç«c ™Fr:È4bi¤ ÓANC™F2ä4iäÓˆ?¦‘~œ†ø1ìcÑÇi$“¼Ýc±Çi¨Ó=¦yžŽÉc‰Ç4iä_¹ciÇ4ÂŽid§!uL#é˜FÐq:Ç4bŽi¤Ó9NCã˜Ä1‰„ã4ïŽIäÓˆ7¦‘nœ†¸1lcÑÆi(Ó6¦kL"Ö8 Uc¡Æ42iD§¡hL#ИFžqrÆ4ÒŒi„ÓÀ2¾SÆ4ŒI§¡cL#ƘFŠ1ã44ŒiDÓH0N#À˜D~1Í?S–@zqâÅ4²‹iD§¡\Lóë|nìÓˆ-NCµ˜h1‰ÌbÅI(Ó,¦‘Wœ†\1´baÅ4²ŠÓ*¦TL"¨øj蓼¯•b!ÅihÓˆ(¦‘Pœ†@1|bñÄ4Ò‰Ó'¦ML"š˜F2qÂÄ4r‰iħ¡JL#”˜F&1 Hâ$‰i®ß^ôˆÓ#¦‘FL#Œ˜FqRÄ4’ˆi§¡CL#†˜F 1 â+±AL#‚˜F1â4ô‡iÄÓHNC|˜ö0‰èaÈÃIÓȦ;œæ]ê0Ða™Ã4"‡ÓP¦8L#o8 ¹ahÃ$†id §!5L#i˜FÐ0œá4d†i¤ ÓNBc˜æ‘0L#`øjì Óˆ¦‘.œ†¸0laÑÂ4’…Ó¦‘+LV8 Ua¡Â4÷dšNCQ˜F 0<á4ä„i  “¦%œ„”0$aAÂ4r„Ó¦‘"L#D8 aÂ4„i§‘L">˜FzðïæÀƒiÞþ';øþ׿ž_ñàw'&U~w¬r¢åƒXZ?¨¥B-Uþ¼ô…*ª!üùã¾ B-Ubi!–Ö**$D´’PQ)¡¢ZBEÅ„øTbh9¡†ê ±ô^P¨¨¢WR¨¡šB -*ÄÒªB-•bi]!–j©²PQi!>nm!–j©ºPKå…XZ_ˆ¥†Š* -1TTc¨èñ×=Teøówà 3üyé‹3dôüëþ¸JC-•réñ×õ»÷ 6ÔRµ¡– 9o¨¡‚C-U2 9äÇÅj©èPKU‡\ ;äRÜ¡¢ÂCFù#.£O\VOT{È(øPß‚êC.…*ª?dôq¾Q_¢¾ðD-Õ r)‘K¿ÿ:c–!j¨‘KˆXZ‰È(·‘KÁˆZªFÔR9"£xDE‰Œ~Íßæ0ú8ߨ/&Qß‚¢D-U%r),‘K¿ï7ja¢>®2‘KŸ÷µ6QKÁ‰zÜoÔòD-Õ'j©@‘Ñó~£–(j©F‘KûZ¥¨¨L‘ÑûýF-TTT©Èè×ýF­UäÒçoÔ.ý„ _¿r #æ×02zÞׂE-U,j©d‘KŸçõhQCU‹\zÜ׺E-.j©r‘Ñó~¸Ö.j©x‘Ñã~¸–/*ª_dô~?\+õ-(aÔR #—>î‡k£–ʽß×BF.ý¾®RF Õ2rèó~¸V3j©œ‘KñŒ\ú}?\+ñqK¹Ó¨¥¢F-U52zÜ׺FE…ŒÞï‡ki£¾µZ*näÒã7êÛ¥ÏûZߨ{päÒó|£–8j¨Æ‘K÷µÊQKeŽZªsdô¸ß¨•ŽZ*uÔR­#—>ï7jµ#£·ûZïÈè÷ýF­xÔ· ä‘KÏûZôˆ¥U\zÜoÔºG}\ࣆ*9ô¼ß¨µZ*~äÒÇýF-TTÿÈèý~£V@ê /ÔR $£ûZ©¨ ’ÑÛýF-„Ô· RK¥Zª…äÒó7껥hH •C2zœOÔ‚H UDj©$’KÏû‰Z©¥ªHFÿºXÄœÉèý~–gré÷ý:-ÐÔÒçŸ?¾úíÒçù:­ÑdtÏ<î×i™&¾èušXZ¨É¥ÏûuZªÉèí~kré÷ý:-×ÔR½&—žçë´bSC%›\ú?ººhSWµ©¥÷÷ûuZ·©¥?tõ»¥ÈM}ܯSí¦šâMFþàê·Ñã~ÖoêPÀ©¥ N.}Þ¯ÓN}\'—÷ë´ŒSKqœ*ääÐó|¾PΟ—¾XÎÿ^úÎrþýP_–s"[ÎWtXΉl9'²åœÈ–óï貜½ÓrNdË9‘-ç+:,çD¶œÙr¾¢ÃrNdË9‘-çD¶œ¯È–s[Ήl9_Ña9'²åœˆ–s[ÎWtXΉl9'²å|E‡åœÈ–s"[Ήl9_Ña9'²åœÈ–s"[ÎWtXΉl9'²å|E‡åœÈ–s"ZÎil9ÿŽ.Ë™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3‘,gZΉl9Ñr&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™ˆ–3-çD¶œ‰h9Ñr&’åœÆ–3-g"ZÎWtXÎD´œ‰øâD´œÙr&¢åLDË9‘-g¢_ú;ŸD´œ‰h9'²åLDË™ˆ–3-çD¶œ‰h9ÑrNdË™H–3 -g"ZΉl9Ñr&¢åœÈ–3ÑÛýF–3-çD¶œ‰h9ÑrNdË™ˆ–3ÑÏ–ó'¦™_ù3ðltXÎDï÷ÃuXÎD´œÙr&¢åL$Ë9-g"ZÎD´œ‰h9'²åLDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZÎD´œÑr¦¡åLDË9‘-g"ZÎD´œ‰h9_Ña9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åLô¼ß¨Ãr&¢åLDË™ˆ–s"[ÎD´œ‰d9§±åLDË™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD´œ¯è°œ‰h9Ñr&¢åœˆ–3 -g"ZΉl9ýºß¨Ãr&¢åœÈ–3ÑûýF–3-çD¶œ‰h9ÑrNdË™ˆ–3-g"ZΉl9Ñr&¢åœˆ–3ÍÛýDÙr¦¡åœÈ–3-g"ZΉl9Ñr&¢åLDËùŠË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&’åLCË9-gZÎD´œ‰h9'²åLDË™ˆ–s"[ÎD´œ‰d9ÓÐrNdË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD²œ¯æ°œ‰d9ÓÐrNdË™ˆ–3-g"ZΉl9Ñr&¢åœˆ–3 -g¢ŸÀ.-çD¶œ‰h9ÑrNdË™è×ý8–3-çD¶œ‰d9ÓÐr&’åœÆ–3-g"ZΉl9Ñr&¢åLDË9‘-g"YÎ4´œ¯È–3ÍÛý6–3-çD¶œ‰h9ÑrNdË™ˆ–3-g"ZΉl9Ér¦¡åLDË9‘-g"ZÎD´œÙr&¢åLDË™H–s[ÎDçï7[Ήl9Ñr&¢åLDË9‘-g"ZÎD´œÙr&¢åLDË™H–óÕ–3-g"ZÎD´œÙr&¢åLDË9‘-g"YÎ4´œ‰d9§±åLDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™ˆ–3Ñó~Ë™H–3 -g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD²œÓØr&ºgh9Ñr¾¢Ãr&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™H–s[ÎD´œ‰þÁ®–s"[ÎD´œ‰h9'²åL$Ë™†–3‘,ç4¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9-gZÎD´œG—åLôö¿XÎÿüùè__-çw?Õr~w:t¢µœXZË©¥ZN-Õrþ¼ôÅr*ªåüùã¾XN-Õrbi-'–Ör*ªåD´–SQ-§¢ZNEµœøÔrbh-§†j9±´–SQ-'>®–SCµœZˉ¥µœZªåÄÒZN,­åÔR-§¢ZN|ÜZN,­åÔR-§–j9±´–Kk9Õr"ZË©¨–SÑã¯{¨–óçïÀËùóÒËÉèù×ýqµœZªåäÒã¯ëwïË©¥ZN-Årrèù×õ;ü‹åÔR-'£XN~\,§–j9µTËÉ¥XN.År*ªåd”? 3úÄiûDµœŒb9õ-¨åäR,§¢ZNFçõÅrê ¯åÔR-'—b9¹ôû¯ó7f-§†j9¹ˉ¥µœŒb9ñqk9¹Ë©¥ZN-Õr2ŠåTTËÉè×ü£óúb9õ-¨åÔR-'—b9¹ôû~£Örêãj9¹ôy¿Qk9µËÉ¡ÇýF­åÔR-§–j9=ï7j-§–j9¹ô¸ß¨µœŠj9½ßoÔZNEµœŒ~ýøFýÀ4û+?î‡k-'¾Ãk9±´–“Ñó~¸Örj©–SKµœ\ú<®µœªåäÒã~¸Örj©–SKµœŒž÷õ–SKµœŒ÷õ–SQ-'£÷ûáZË©oA-§–j9¹ôq?\k9µTËÉèý~¸Örré÷ýpÕrj¨–“CŸ÷õ–SKµœ\ŠåäÒïûáZˉ[ËÉ¥XN-Õrj©–“Ñã~¸Ör*ªådô~¿Qk9õ-¨åÔR-'—¼Qß.}ÞoÔZN}\-'—žçµ–SCµœ\ú¸ß¨µœZªåÔR-'£ÇýF­åÔR-§–j9¹ôy¿Qk9½ÝoÔZNF¿ï7j-§¾µœ\zÞoÔZN,­åäÒã~£Örêãb95TËÉ¡çýF­åÔR-'—>î7j-§¢ZNFï÷µ–S_x-§–j9}ÜoÔZNEÿùŸçÿZj9=î7j-§–j9µTËÉ¥çoÔwK±œªådô8Ÿ¨µœªåÔR-'—ž÷µ–SKµœŒ>þx¢¾>ï'j-'¾ðµœ\zþñD}»ôû~¢Ör2ú¸Ÿ¨µœŠj9õ…×rréq?Qk9µTË©¥XN=殺SVËÉ¡ÇýB­åÔR-§–j9¹Ë©¥ZN-Õr2ËÉæó~ Örêë®åäÒó~ Ör*ªådôq?Pk9µTË©¥ZN.=Ck91TËÉæy?Pk9µTËÉ¥Çý@­åÔR-§–j9¹ô¼¨ZN6o÷û4–S_t-§fj9½ßÓZNEÿw?Nk9¹ôq?Nk9µTË©¥XN=þxœ¾úý×õ€­ådôq?Nk9µTË©¥ZN.=îÇi-§–j9½ŸÓZNDµœlÞî·i-'¾k9µTËÉ(–“Ñó~›Örê ¯åäÒÇý6­åÔR-§–b99ô¸§µœú´ZN-Õrréó~œÖrj©–“KûqªåTSËÉèüýVË©¨–Sÿøµœ\zÜÓZNEµœŒÞïÇi-§–j9µTËÉ¥ûuªåÄÐZN ­åäÒóþ˵œú¸ZN-Õrréó~Ör2z;_§µœŒ~Ÿ¯Óg-'£ûuZË©¥ZN-Õrréq¿Nk9õqµœZªåäÒó~Örj)–“C¼Nß}þu±ˆ/–“Ñûý:­åäÒïûuZË©¥Ï?|õÛ¥ÏóuZËÉèžyܯÓZN|Ñk9±´–“KŸ÷ë´–“ÑÛý:­åäÒïûuZË©¥ZN.=Ï×i-§†j9¹ô~tu-§>®–SKµœ\zÞ¯ÓZN-Årrèã~j9ÕÔr2úóW¿÷ë´–S߀ZN-Õrréó~Örêãj9¹ô¸_§µœZŠåÔP-'‡žçëôÅrþ¼ôÅrþ÷Òw–óßÿ)óóºË™ˆw9'ò]ÎD¼Ë™ˆw9ñ.ç+:îr&â]ÎD¼Ë™ˆw9'ò]ÎD¼Ë™ˆw9'ò]ÎD¼Ë™ˆw9ñ.çD¼Ë™†w9ñ.çD¾Ë™ˆw9é.gÞåœÈw9ñ.g"ÞåœÈw9ñ.g"ÞåLÄ»œù.g"ÞåLÄ»œ‰x—s"ßåLÄ»œ‰x—s"ßåLÄ»œ‰t—3 ïr¾¢ã.g#Ýål¤»œ‰x—³‘îr6Ò]ÎFºË™ˆw9á.g›'þµü‰x—³‘îr6Ò]ÎFºË™ˆw9é.g#Ýål¤»œ‰x—³‘îr6Ò]ÎD¼ËÙHw9é.g#ÝåLÄ»œt—³‘îr&â]ÎFºËÙHw9á.gÞål¤»œt—s"ßål¤»œô/7j¤»œ‰x—³‘îr6Ò]ÎD¼ËÙè×_?ÿû»é.g#ÝåLÄ»œt—³‘îr6Ò]ÎD¼ËÙHw9é.g¢Ýål„»œmt—³‘îr&â]ÎFºËÙHw9ñ.g£·ûò]ÎFºË™ˆw9é.g#ÝåL„»œ?1ÍüJëlôó±Î/‘îrN仜t—³‘îr6Ò]ÎD¼ËÙHw9á.gÞål¤»œt—³‘îr&â]ÎFºËÙHw9ñ.g#Ýål¤»œt—3ïr6Ò]ÎFºË™ˆw9é.g#Ýål¤»œ‰x—³Ñûýpù.g#ÝåL¤»œmt—³‘îr&â]ÎFºËÙHw9é.çD¾ËÙHw9é.g"Þål¤»œt—³‘îr&â]ÎFºËÙèy¿Q¾ËÙHw9é.g#ÝåLÄ»œt—³îr¦ùÐ]ÎFºËÙHw9é.g"Þål¤»œt—³‘îr&â]ÎFºËÙHw9ñ.g#Ýål¤»œt—3ïr6Ò]ÎFºË9‘ïr6Ò]ÎFºËÙHw9é.gÝål¤»œ‰x—³Ñ¯ûò]ÎFºË™ˆw9é.g#Ýål¤»œ‰x—³‘îr6Ò]ÎDÿù¯^Ïÿµð.g#Ýål¤»œ‰x—³‘îr6Ò]ÎDºËÙæí~¢x—³îr&â]ÎFºËÙHw9ñ.g#Ýål¤»œt—s"ßålô~?Q¾ËÙHw9ñ.g#Ýål¤»œ‰x—³‘îr6Ò]ÎFºË™ˆw9á.gÝåL¤»œmt—³‘îr6Ò]ÎD¼ËÙHw9é.g"Þål¤»œp—³îr&â]ÎFºËÙHw9é.g"Þål¤»œt—3ïr6Ò]ÎFºËÙw9§ñ]ÎF¸ËÙFw9ñ.g#Ýål¤»œt—3ïr6Ò]ÎFºË™Hw9Ûè.g£%´Ð]ÎD¼ËÙHw9é.g¢Ýålôë~œ|—³‘îr&â]ÎF¸ËÙFw9á.gÞål¤»œt—3ïr6Ò]ÎFºËÙHw9ñ.g#Üål£»œñ.g›·ûmò]ÎFºË™ˆw9é.g#ÝåLÄ»œt—³‘îr6Ò]ÎD¼ËÙèýçÛ2mt—³‘îr&â]ÎFºËÙHw9Õrj‰w9é.g#ÜåLûœÎßo¼Ë™ˆw9é.g#Ýål¤»œ‰x—³‘îr6Ò]ÎD¼ËÙHw9é.g#ÜåœÆw9½ãòY#Ýål¤»œ‰x—³‘îr6Ò]ÎD¼ËÙw9Ûè.g#ÜåLûœt—³‘îr&â]ÎFºËÙHw9é.g"Þål¤»œt—3ïr6Â]Î6ºËÙHw9ñ.g#Ýål¤»œt—3ïr6Ò]ÎF¸Ë™†w9Ý3ºËÙHw9'ò]ÎFºËÙHw9ñ.g#Ýål¤»œt—3ïr6Ò]ÎF¸Ë™†w9é.g£𣫾˙ˆw9é.g#ÝåLô¡»œp—³îr6Â]Î4¼ËÙHw9é.g#ÝåLÄ»œt—³‘îr&â]ÎFºËÙHw9é.g"Ýål£»œt—ów9½ýOw9Ÿýû—åœÈ–ó–s"[Ήl9'²åü;º,çD¶œÙrNdËùŠË9‘-çD¶œ¯è°œÙrNdË9‘-ç+²åœÆ–s"[ÎWtXΉl9'¢åœÆ–ó–s"[Ήl9_Ña9'²åœÈ–s"[ÎWtXΉÞi9'²åœÈ–ó–s"[Ήl9_Ña9'²åœˆ–s[ο£Ër&¢åLDË9‘-g"ZÎD´œ‰h9'²åL$Ë™†–s"[ÎD´œ‰h9ÑrNdË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰d9§±åLDË™ˆ–ó–3-g"þ8-çD¶œ‰h9ÑrNdË™è—þÎ'-g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD´œÙr&’åLCË™ˆ–s"[ÎD´œ‰h9'²åLôv¿Q‡åLDË9‘-g"ZÎD?[Ο˜æüJÏ/-g"ZÎD´œ¯è°œ‰h9Ñr&¢åœÈ–3-g"YÎil9Ñr&¢åLDË9‘-g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™ˆ–3-çD¶œ‰Þï‡ë°œ‰h9'¢åLCË™ˆ–s"[ÎD´œ‰h9Ñr¾¢Ãr&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™ˆ–3‘,ç4¶œ‰h9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™èy¿Q‡åLDË™ˆ–3-çD´œih9ÑrNdË™è×ýF–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD´œÑr¦y»Ÿ([Î4´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9_Ña9½ßOÔa9ÑrNdË™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3‘,gZΉh9ÓÐr&¢åLDË9‘-g"ZÎD´œÙr&¢åL$Ë™†–s"[ÎD´œ‰h9ÑrNdË™ˆ–3-çD¶œ‰h9Ñr&’å|5‡åL$Ë™†–s"[ÎD´œ‰h9ÑrNdË™ˆ–3Ñó~ l9ÓÐr&úùìRÐrNdË™ˆ–3-çD¶œ‰~ÝÓa9ÑrNdË™H–3 -g"YÎil9Ñr&¢åœÈ–3-g"ZÎD´œÙr&’åLCËùŠl9Ó¼ÝoÓa9ÑrNdË™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3‘,gZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰d9§±åLtþ~³åœÈ–3-g"ZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰d9_Ía9Ñr&¢åLDË9‘-g"ZÎD´œÙr&’åLCË™H–s[ÎD´œ‰h9'²åLDË™ˆ–3-çD¶œ‰h9ÑrNdË™H–3 -g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD²œÓØr&ºgh9Ñr¾¢Ãr&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™H–s[ÎD´œ‰þÁ®–s"[ÎD´œ‰h9'²åL$Ë™†–3‘,ç4¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9-gZÎD´œG—åLôö¿XÎÇßÿ]Ça9ÑrNdË™ˆ–3-g"ZÎWtXÎD´œ‰h9ÑrNdË™ˆ–3-çD¶œ‰h9Ñr&¢åœˆ–3 -g"ZΉl9Ñr&’åLCË9‘-g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™ˆ–3-çD¶œ‰h9Ér¦¡å|E‡ål$ËÙH–3-g#YÎF²œd9Ñr6‚ål#Ë™ˆ–³‘,g#YÎF²œ‰h9Ér6’ål$Ë™ˆ–³‘,g#YÎD´œd9Ér6’åLDËÙH–³‘,g"ZÎF²œd9Ár¦¡ål$ËÙè‰ÿ6b"[ÎF²œôâF²œ‰h9Ér6’åLDËÙèþΧ‘,g#YÎD´œd9Ér6’åLDËÙH–³‘,g"ZÎF°œmd9Ér&¢ål$ËÙH–3-g£·û²ål$Ë™ˆ–³ÑÏ–ó¦Ù_©c‰h9Ér6’ål$Ë9‘-g#YÎF²œd9Ñr6’ålË™†–³‘,g#YÎF²œ‰h9Ér6’åLDËÙH–³‘,g#YÎD´œd9Ér&¢ål$ËÙH–³‘,g"ZÎF²œd9Ér&’ål#ËÙH–3-g#YÎF²œd9'²ål$ËÙH–3-g#YÎF²œd9Ñr6’ål$Ë™ˆ–³‘,g#YÎF²œ‰h9Ér6‚åLCËÙH–³‘,g#YÎDYÎF²œd9Ér&¢ål$ËÙH–3-g#YÎF²œd9Ñr6’ålô¼ß([ÎF²œd9Ér&’ål#ËÙH–3-g£_÷eËÙH–3-g#YÎF²œd9Ñr6’ål$Ë™ˆ–³‘,g#YÎF²œ‰h9Ér6’åL$ËÙæí~¢h9ÛÈr&¢ål$ËÙH–3-g#YÎF²œd9'²ål$ËÙH–³‘,g"ZÎF²œd9Ñr6’ål$ËÙH–3-g#XÎ6²œ‰d9ÛÈr6’ål$Ë™ˆ–³‘,g#YÎD´œd9Ár¶‘åLDËÙH–³‘,g#YÎD´œd9Ér&¢ål$ËÙH–³,ç4¶œ`9ÛÈr&¢ål$ËÙH–³‘,g"ZÎF²œž÷EËÙF–³Ñ?`×B–3-g#YÎF²œ‰h9ýº'[ÎF²œ‰²œ`9ÛÈr6‚åLCËÙH–³‘,g"ZÎF²œd9Ér&¢ålËÙF–s"ZÎ6o÷ÛdËÙH–3-g#YÎF²œ‰h9Ér6’ål$Ë™ˆ–³,gYÎF²œ‰h9Ér6’åLDËÙH–³‘,g#XÎ4´œÎßo´œ‰h9Ér6’ål$Ë™ˆ–³‘,g#YÎD´œd9Ér6‚åœÆ–³‘,g#YÎF²œ‰h9Ér6’åLDËÙ–³,g#XÎ4´œd9Ér&¢ål$ËÙH–³‘,g"ZÎF²œd9Ñr6‚ål#ËÙH–3-g#YÎF²œd9Ñr6’ålË™†–³Ñ=#ËÙH–s"[ÎF²œd9Ñr6’ål$ËÙH–3-g#YÎF°œih9Ér6ú?ºjË™ˆ–³‘,g#YÎD´œ`9ÛÈr6‚åLóål$ËÙH–³‘,g"ZÎF²œd9Ñr6’ål$ËÙH–3‘,gYÎF²œ¯è°œÞþ'ËùþŸÿcÿb9ÿaˆNOTË™èÿû"_ÑZN,­åÔR-§–j9^úb9Õrþüq_,§–j9±´–Kk9Õr"ZË©¨–SQ-§¢ZN| j91´–SCµœXZË©¨–WË©¡ZN ­åÄÒZN-Õrbi-'–Örj©–SQ-'>n-'–Örj©–SKµœXZˉ¥µœŠj9­åTTË©(–SM-çÏß/–óç¥/–“Qþ0¬«åÔR-'—b9¹Ë©¥ZN-Årr(–SCµœZªådËÉ‹åÔR-§–j9¹ËÉ¥XNEµœŒò‡aF±œŠÿ:Ÿ¨/–Sß‚ZN.År*ªådôq¾Q_,§¾ðZN-Õrr)–“Kc95TË©¡ZN.Årbi-'£XN|ÜZN.Årj©–SKµœŒb9Õr2ú5çÃèã|£¾XN} j9µTËÉ¥XN.ý¾ß¨µœú¸ZN.}ÞoÔZN-Årrèq¿Qk9µTË©¥ZNFÏûZË©¥ZN.=î7j-§¢ZÎÿŽ~bšù•ï÷õ–SQ-'£_÷õ–“KŸ<\ß,­åÄÒZNFÏûáZË©¥ZN-Õrréó|¸Örj¨–“KûáZË©¥ZN-Õr2zÞ×ZN-Õr2zÜ×ZNEµœŒÞï‡k-§¾µœZªåäÒÇýp­åÔR-'£÷ûáZËÉ¥ß÷ÃUË©¡ZN}Þ×ZN-Õrr)–“K¿ï‡k-'>n-'—b9µTË©¥ZNFûZË©¨–“ÑûýF­åÔ· –SKµœ\züñF}»ôy¿Qk9õqµœ\zžoÔZN Õrréã~£Örjéñ¯ûZËÉèq¿Qk9µTË©¥ZN.}ÞoÔZNFo÷µ–“ÑïûZË©oA-'—ž÷µ–Kk9¹ô¸ß¨µœú¸XN Õrrèy¿Qk9µTËÉ¥ûZË©¨–“ÑûýF­åÔ^Ë©¥ZNF÷µ–SQ-'£·ûZË©oA-§–j9µôˆåäÒó7껥XN Õr2zœOÔZN Õrj©–“KÏû‰ZË©¥ZNFNk9Õr²y»ß¦µœø¬åÔR-'£XNFÏûmZË©/¼–“K÷Û´–SKµœZŠåäÐã~œÖrêÓj9µTËÉ¥ÏûqZË©¥ZN.=îÇ©–SM-'£ó÷[-§¢ZNýã×rréq?Nk9Õr2z¿§µœZªåÔR-'—>îש–Ck91´–“KÏû/Örêãj9µTËÉ¥ÏûuZËÉèí|Ör2ú}¾NŸµœŒ>î×i-§–j9µTËÉ¥Çý:­åÔÇÕrj©–“KÏûuZË©¥XN}üñ:};ôù×Å"¾XNFï÷ë´–“K¿ï×i-§–>ÿüñÕo—>Ï×i-'£{æq¿Nk9ñE¯åÄÒZN.}Þ¯ÓZNFo÷ë´–“K¿ï×i-§–j9¹ô<_§µœªåäÒ?øÑÕµœú¸ZN-Õrréy¿Nk9µËÉ¡ûuªåTSËÉèÏ\ý6zܯÓZN}j9µTËÉ¥ÏûuZË©«åäÒã~Örj)–SCµœzž¯ÓËùóÒËùßKßYÎÿ)â×y—s"ßå|EÇ]Ή|—s"ßåœÈw9ÿŽ®»œù.çD¾Ë9‘ïr¾¢ã.çD¾Ë9‘ïr¾¢ã.çD¾Ë9‘ïrN仜¯Èw9§ñ]Ή|—ów9'ò]Ήx—sßå|EÇ]Ή|—s"ßå|EÇ]Ή|—s"ßåœÈw9_Ñq—s"ßåœÈw9'ò]ÎWtÜåœÈw9'ò]ÎWtÜåœÈw9'â]Îi|—óïèºË™ˆw9ñ.çDÿ²{ËŽóJ’4:#­ÕÄóŸXKüÝì ˆíÒS½lz Ñì:I>šw9ƒ¸ËÄ]Î îrò.gv9c¸Ë9È»œAÜå â.gw9y—3ˆ»œAÜå â.ç ïrq—3ˆ»œƒÜå â.gw9ƒ¸Ë9È»œAÜå â.ç ïrq—3ˆ»œAÚåã]Î îrq—óBË.gw9ƒøq—sw9ƒ>5oÄ]ÎAÞå úø ÿ~Ww9ƒ¸Ë9È»œAÜå â.gw9y—3ˆ»œAÜåä]Î írÆp—3ˆ»œƒ¼ËÄ]Î îrò.gÐm£–]Π÷»œï2Íù•ë z?Öù q—sw9ƒ¸ËÄ]Î îr^hÙå â.gw9ƒ¸Ë9È»œAÜå Ò.çïrq—3ˆ»œAÜåä]Î îr=÷‡kÙå â.gw9ƒ¸Ë9È»œAÜå â.ç ïrq—3ˆ»œAÜåä]Î îrq—3ˆ»œƒ¸ËÃ]Î îrò.gw9ƒ¸ËÄ]Î -»œAÜå â.ç ïrq—3ˆ»œAÜåä]Î îrq—sw9ƒ¸ËÄ]Î îrò.gw9ƒ´Ë9Æ»œAÜå â.gw9=¸ËÄ]Î îrq—sw9ƒ¸ËÄ]ÎAÞå â.gw9ƒ¸Ë9È»œAÜå â.ç…–]Î îrq—3ˆ»œƒ¸ËÃ]Î îrò.gÐÇþF-»œAÜåä]Î îrq—3ˆ»œƒ¼ËÄ]Î îrò.gw9ƒ¸ËÄ]ÎAÞå â.gw9q—3æ¶?QÞåŒá.ç ïrq—3ˆ»œƒ¼ËÄ]Î îrq—óBË.gw9ƒ¸ËÄ]ÎAÞå â.gw9y—3ˆ»œAÜå â.ç ïri—3湿PÞåŒá.gw9ƒ¸Ë9È»œAÜå â.ç ïrq—3H»œ1Üåä]Î îrq—3ˆ»œƒ¼ËÄ]Î îrò.gw9ƒ¸Ë¤]ÎË,»œAÚåŒá.ç ïrq—3ˆ»œAÜåä]Î îrq—sw9c¸Ëô~,!‚»œƒ¼Ëô¹?NË.ç ïr}ìÓ²ËÄ]ÎAîri—3†»œAÚåã]Î îrq—sw9ƒ¸ËÄ]Î îrò.gv9c¸Ëy!ïrÆÜö·iÙå â.ç ïrq—3ˆ»œƒ¼ËÄ]Î îrq—sw9ƒ´ËÃ]Î îrò.gw9ƒ¸Ë9È»œAÜå â.gv9Çx—3hýýöÏÿ\Ïx—3ˆ»œAÜå â.ç ïrq—3ˆ»œƒ¼ËÄ]Î îri—ó2Ë.gw9ƒ¸ËÄ]ÎAÞå â.gw9y—3H»œ1Üå Ò.çïrq—3ˆ»œƒ¼ËÄ]Î îrq—sw9ƒ¸ËÄ]ÎAÞå Ò.g w9ƒ¸Ë9È»œAÜå â.gw9y—3ˆ»œAÚåã]Πý w9ƒ¸Ëy¡e—3ˆ»œAÜåä]Î îrq—3ˆ»œƒ¼ËÄ]Î írŽñ.gw9ƒþÅ®.»œƒ¼Ëô¹¿NË.ç ïri—3†»œAÚåã]Î îrq—3ˆ»œƒ¼ËÄ]Î îrò.gw9ƒ¸ËÄ]ÎAÜåŒá.gw9ÿ m—3èö_v9ÿ~ðÖ”s KÎË8äÃŽs 3Î1¬8ÿ˜%âÆs Î1,8/ã€s ûÍ1Ì7/ãzs ãÍ1l7Ç0ݼ ËÍ! 7ǰۼŒ³Í1¬6Ç(ÚÂfó2N6ǰØÃ`ó2î5Ç0×ÃZs cÍ˸ÕÃTs KÍ1 5/ãNs 3Í1¬4/ãHs Í1J4‡°Ðüc–@3F}fŒòÌ1¬3cgƨ͌Qš9†ef ÂÌu™c˜eƨʌQ”£&s “Ì™1 2cÔcŽaŽ£3F1涘1J1cTbÆ(ÄÃ3FfŒ*Ì1Œ0cÔ`Æ(ÁŒA9„fŒúËå——q}£ø2F€Qz9†åeŒÂËu—c˜]Æ|àogb]ƨ¹Ãä2FÅeŒ‚Ëõ–c˜[ƨ¶ŒQl9†­e RË•–1 -ǰ³ŒQf£Êr #˘Ûúê(±|SOæ¾Ï.kXƨ¯ŒQ^9†ueŒâʵ•1J+/ã²2FaeŒºÊe•cXUÆ(ªŒAS9„IeŒŠÊ•1ê)Ç0§ŒQMó\Ÿ"·”1J)cTRÆ(¤ÃŽ2FeŒ*Ê1Œ(cÔPÆ(¡ŒQA9æ©€2FýdŒòÉÕ“cO†¨ŒQ:9†ådŒÂÉu“1Ê&/ãj2FÑdŒšÉ1L&cTLÆ(˜ŒQ/9†¹dŒjÉÅ’cØJÆ(•ŒQ)£Pr ;Ée’1¨$‡0’ŒQ#£D2F…ä’1ê#c”GƨŽÃ82FmdŒÒÈ1,#cFƨ‹ŒQ9†UdŒ¢È5‘—q£"2FAdŒzÈ1Ê!CTCÆ(†Ã2æc}u\BÆ(„Ã2FdŒ*ÈEcØ@Æ(ŒQ9†dŒúÇå1ªÇ0~ŒQû£ôqŒÊÇÛúè°{ Qö8†ÕcŒ¢Ç5c˜<ƨxŒQð£Þñ2ÎcT;Æ(vŒQë8†©cŒJÇ…ŽcØ9Æ(sŒQå£Èq Ç$Ž!ÏõÍaࢾ1FycŒêÆ1ŒcÔ6Æ(mò1Fac ºÆecžªc5ƨiŒQÒ8†EcŒ‚ÆõŒc˜3ƨfŒQ̃–ñ"NcP2†(dÃŽ1FcŒ*ÆEŒcØ0Æ(aŒQÁ8FcˆúŘ·?S zq ãŵ‹1Jǰ\ŒùXŸw‹1ÊǰZŒA´¢f1Éâ‹1 cÔ+Ža®£Z1F±bŒZÅ1LcP*†(T¼ ;ÅÛúÚ¸RŒQ¤8†bŒÅŠc(ƨOŒQž£:q ãÄ´‰!JcT&Ža˜£.1FYâV‰1ŠcÔ$Æ IÂ"1fûíÅq sÄÕˆ1ŠcÔ"ŽaŠ£1F!âvˆ1ÊcT!Æ B¼ˆÄ%ˆ1*c Ža£ü0FõáƇ1hC”Æ <Âð0FÝaŒ²Ã1¬cƨ9ŒQr8†ÅaŒ‚Ãõ†c˜Æ 6 Ql£ÖpÌsÿ±L—†1 cÔŽaf£Ê0‘á6†1ë†1 /ã¾0FyaŒêÂ1Œ cÔÆ(-ŒQY8†aaŒºÂd…CXÆ(*ŒÙ$ÓIá…1 cÔŽaNƒš0D1a ZÂ!L cTÆ($ŒQG8†aŒ*ÂE„cØÆ(!ŒQA£€pŒúÁåƒ1ªÿ˜%Œ¹ý§vðÏOF~‹›˜ j=øÛXå “âÒéu©¡.µ |é[B(Ô†ðýÇ}‹u©!.Œ—NG(Ô蔄BM …Ú 5&Ä· 5!œP‡ÚâÒ …ZâãšêP›B:Q!.ªP—šâÒé qé„…ºÔ²P¨i!>îÙ¶—N\¨K­ u©y!.¾—N`(ÔÂè$†Bm …í‡Z¾ÿ|Ë ß_úÖ=ÿÚ?®¥¡.55ä¥Ç_ÛïÞo±¡.µ6Ô¥ä†<”ÞP‡êR‹C¢$‡ü¸4‡ºÔèP—ZòR²C^Jw(Ôð(Ä%zaY=¨í!QâC} ZòRòC¡ö‡D÷õúV ê o‚¨Kmy)"/M…¨CÍu¨"/%DÄ¥S"%EÄÇ‘—#êRkD]jŽH”Q¨A"ÑÇümÑ}}£¾5‰ú4JÔ¥V‰¼”,‘—¾ö7ꄉú¸–‰¼ôÚߨÓ&êRâDzìoÔÉu©}¢.5P$zîoÔIu©âÿ^z׿W>ö‡ëTŠB͉Ò)=÷‡ë”ŠDûÃuZE^zýx¸~¹tjE\:¹"Ñs¸N°¨K-u©É"/½Ö‡ëD‹:Ôj‘—ûÃuºE]j¸¨K-‰žûÃuÚE]j¼HôØ®“/ µ_$úÜ®S0ê[ЄQ—Ú0òÒ}¸NŨKÏÿ·?\§cÔÇ5d䥯ýájʨCmyèµ?\§fԥ挼”ž‘—¾ö‡ëø¸“4òRšF]jÔ¨K­‰ûuºF¡†DŸûuÒF} Ú6êRãF^züx£~½ôÚߨÓ7êã8òÒs}£Nâ¨Cmy龿Q§rÔ¥fŽºÔΑ豿Q§tÔ¥¦ŽºÔÖ‘—^ûujG¢ÛþFÞ‘èk£Nñ¨oA“G^zîoÔ‰qéT¼ôØß¨Ó=êã>êPËGzîoÔiu©ñ#/Ý÷7êäBí‰>÷7êú›@êRH¢ûþF R¨$Ñm£N©oAKH]j ©Km!yéùãúíRjHjIôXŸ¨DêP‹H]jÉKÏý‰:Q¤.µŠ$ºÿx¢~E¯ý‰:a$¾ðSFòÒóÇõ륯ý‰:q$Ñ}¢N)Ô>R_xI^zìOÔI$u©¤.%’ä¡çþB5“Ô‡µ“ä¡ÇþBRR—šJêR[I^J,©K­%u©¹$Ñô’4¯ý:Ť¾îççþ@f’èk N5ItߨÓMêRÃI]j9ÉKýj;‰C'žÄ¡Ö“4Ïý:ý¤.5 ä¥Çþ@„R—ÚPêR#J^zîT3JšÛþ>MH©/º%¥Î4¥$úܧS µ¦ÔÞœ’—îûãt‚J]jQ©KI*yèñãqúõÐ×_ÛvªJ¢ûþ8®R—VêRËJ^zìÓi+u©q%Ñçú8¼¨}%Ím›Na‰oÀI,u©%Ñçü2Ñs›Nf©/¼%/Ý÷·é”–ºÔÔR—ÒZòÐcœNm©Okn©Kí-yéµ?N§¸Ô¥&—¼ôاF—2­.‰Ößoí.…^ê?~ËK^zìÓi/…_}îÓÉ/u©ý¥.5Àä¥ûþ:5ÁÄ¡Ó`âЉ0yé¹ÿåÀÉ0õqí0u©!&/½ö×餘D·õu:1&Ñ×ú:½šcÝ÷×険Ô"S—šdòÒcN”©k•©KÍ2y鹿N'ÌÔ¥”™÷×é䙼ôµ¿N'ÐÔ¥×Ï_ýõÒk}N£I´Ÿyì¯ÓÉ4ñEŸN—N¨ÉK¯ýu:©&ÑmN¬ÉK_ûëtrM]j¯ÉKÏõu:Ŧ5Ùä¥ñ£«'ÚÔǵÚÔ¥f›¼ôÜ_§nêRÊMºï¯SÛM™Æ›D?põWôØ_§ÓoêЀS—ZpòÒkNékÄÉKýu:§.¥ãÔ¡†œ<ô\_§o)çûKßZÎÿ½ô[Ëùü§XÙ† y òBËä oAòä ¯AþAÛä ïAò ä /B^h™„äMÈA…¼Ð² 9ȳƒ¼ 9ÈÃò2äOCò6ä…–qÈA^‡ÄyÈ1Þ‡¼Ð29È ‘ƒ<y¡e#rG"y%rg"/ôôNä EòRä OE^hÙŠä±ÈA^‹¼Ð29È{‘ƒ89Æ‹‘Ð6ÄÍÈ ŽFòjdg#ƒ¸ÄáÈA^Ž Òtd ·#y<2ˆë‘Aœ â~ä HqA2ˆ’AÜäÉ ®HqFrw$ƒ8$Ä%É NIò–dÇ$ƒ¸&9Ès’AÜ“ â d%ÇxR2ˆ›’A•¼Ð²*ÄYÉ þ#FA–äeÉ NKq[rÇ%ƒ>þ¿ÌÄyÉ îKòÀd&ƒ81ÄÉA™ âÊdg&yg2HC“1\š âÔä oMql2ˆk“ƒ07ù.Ó̯¼í—V(¿!.NòädÐçþp-£“ƒ¼:ÄÙÉ îNqxòBËòd§'ƒ¸=ÄñÉA^Ÿ âüdö'Çx€2ˆ ”Aœ  âå Pq…2ˆ3”ƒ¼CÄ!Ê .QqŠr·(ƒ8FÄ5ÊAž£ âe)ƒ¸H9èÉIÊ nRq”2ˆ«”ƒ8KÃ]Ê Sò2e§)ƒ¸MÄqÊ -ë”Aœ§ zj)l*ƒ¸PÄ‰Ê nTòHeW*ƒ8S9È;•Aª âRe§*y«2ˆc•AZ«ã¹Ê îUq°2ˆ‹•ƒ÷7Ê»œAÜå,Ò.g‘v9‹´ËÄ]Î"íra—3†»œEÚå,Ò.g‘v9ƒ¸ËY¤]Î"íri—3ˆ»œEÚå,Ò.gw9‹´ËY¤]Î"írq—³H»œEÚåä]Î"íri—³H»œAÚå¬Ñ.g‘v9ƒ¸ËYô±¿QÞå,Ò.gw9‹´ËY¤]Î"írq—³H»œE¯ýò.g‘v9‹´ËY¤]Î îri—³H»œAÚ嬹íOw9k´ËÄ]Î"íri—3ˆ»œEÚå,Ò.g‘v9y—³H»œEÚå,Ò.gw9‹´ËY¤]Î îri—³H»œEÚå â.gv9k´Ë¤]Îíri—³H»œAÜå,úÜ_(ïrq—³H»œEØå¬Ñ.gw9‹´ËY¤]Î"írq—³H»œEÚå úÒ.g‘v9‹´ËY„]Î1Þå,Â.gv9ƒ¸ËY¤]Î"íri—3ˆ»œEÚå,Ò.gv9k´ËYôv,¡B»œAÜå,Ò.g‘v9ƒ¸ËYô±?NÞå,Ò.gw9‹°ËY£]Î"ìrÆp—³H»œE¯ýqò.g‘v9‹´ËY¤]Î îra—³F»œƒ¸ËYsÛß&ïri—3ˆ»œEÚå,Ò.gw9‹´ËY¤]Î"írq—³»œ5Úå,Ò.gw9‹´ËY¤]Î îri—³H»œEØåŒá.gÑúû»œAÜå,Ò.g‘v9‹´ËÄ]Î"íri—3ˆ»œEÚå,Ò.gv9Çx—³H»œEÚå,Ò.gw9‹´ËY¤]Î îra—³F»œEØåŒá.g‘v9‹´ËÄ]Î"íri—³H»œAÜå,Ò.g‘v9ƒ¸ËY„]Îíri—3ˆ»œEÚå,Ò.g‘v9ƒ¸ËY¤]Î"ìrÆ|i—³h?£]Î"írò.g‘v9‹´ËÄ]Î"íri—³H»œAÜå,Ò.gv9c¸ËY¤]΢ñ£«Þå â.g‘v9‹´ËÄ]Î"ìrÖh—³»œ1Üå,Ò.g‘v9‹´ËÄ]Î"ír½ö×É»œEÚå,Ò.g‘v9ƒ´ËY£]Î"ír^hÙå,ºý—]ÎëÿÒ¾µœƒÜr^hi9¹åä–s[Î?hk9¹åä–s[Î --ç ·œƒÜr^hi9¹åä–s[Î ¹åã–s[Î --ç ·œƒØrŽqËy¡¥åä–s[Î --ç ·œƒÜrrËy¡¥åä–s[ÎAn9/´´œƒÜrrËy¡/·œƒÜrbË9Æ-ç´µœAl9ƒØrrËÄ–3ˆ-g[ÎAn9ƒÔrưåä–3ˆ-g[Î ¶œƒÜr±å bËÄ–s[Î ¶œAl9¹å bËÄ–3ˆ-ç ·œAl9ƒØrrËÄ–3ˆ-gZÎ1n9ƒØr±å¼ÐÒr±å ∃ØrrËÄ–3ˆ-ç ·œAú;Ÿ ¶œAl9¹å bËÄ–3ˆ-ç ·œAl9ƒØrrˤ–3æ}Ëù.Ó̯|xä–3ˆ-g[ÎAn9ƒnûõ´œAl9¹å bËÄ–s[Î ¶œAl9ƒØr^hi9ƒØr±å bË9È-g[Î µœcÜr±å bËÄ–s[Î ¶œAl9¹å bËÄ–3ˆ-ç ·œAl9ƒØrrËÄ–3ˆ-g[ÎAn9ƒØr±å bË9ˆ-g [Î ¶œƒ¾Ør±å bËÄ–óBKËÄ–3ˆ-ç ·œAl9ƒØr±åä–3ˆ-g[ÎAn9ƒØr±å bË9È-g[Î µœcÜr±å bËÄ–s[Î ¶œAl9ƒØrrËÄ–3ˆ-ç ·œAl9ƒØr±åä–3ès£––óBKËÄ–3ˆ-g[ÎAl9cØr±åä–3èc£––3ˆ-ç ·œAl9ƒØr±åä–3ˆ-g[ÎAn9ƒØr±å bË9È-g[Î ¶œƒØrÆÜö'Ê-g [ÎAn9ƒØr±åä–3ˆ-g[Î ¶œZZÎ ¶œAl9ƒØrrËÄ–3ˆ-ç ·œAl9ƒØr±åä–3H-g [ÎAl9cØr±å bË9È-g[Î ¶œƒÜr±å RËÖs[Î ¶œAl9ƒØrrËÄ–3ˆ-ç /¶œAl9ƒØr©å¼ÌÒr©åŒaË9È-g[Î ¶œAl9¹å úܨ¥åÄ–3†-gÐû°‹`Ë9È-g[Î ¶œƒÜr}ìÓÒr±åä–3H-g [Î µœcÜr±å bË9È-g[Î ¶œAl9¹å RËÖóBn9cnûÛ´´œAl9¹å bËÄ–s[Î ¶œAl9ƒØrrˤ–3†-g[ÎAn9ƒØr±åä–3ˆ-g[Î µœcÜr­¿ßÜrrËÄ–3ˆ-g[ÎAn9ƒØr±åä–3ˆ-g[Î µœ—YZÎ ¶œAl9ƒØrrËÄ–3ˆ-ç ·œAj9cØr©åã–3ˆ-g[ÎAn9ƒØr±å bË9È-g[Î ¶œƒÜr©åŒaËÄ–s[Î ¶œAl9ƒØrrËÄ–3H-ç·œAû¶œAl9/´´œAl9ƒØrrËÄ–3ˆ-g[ÎAn9ƒ>÷×É-ç·œAl9ƒþÅ®.-ç ·œAl9ƒØrrˤ–3†-gZÎ1n9ƒØr±å bË9È-g[Î ¶œƒÜr±å bËÄ–s[ζœAl9ÿ ­å ºý§–óõÏ o-ç ·œZZÎAn9¹åä–óÚZÎAn9¹åä–óBKË9È-ç ·œZZÎAn9¹åä–óBn9Ǹåä–óBKË9È-ç ¶œcÜr^hi9¹åä–óBKË9È-ç ·œƒÜr^hi9¹åä–s[Î --ç ·œƒÜr^hi9¹åÄ–sŒ[Î?hk9ƒØr±åä–3ˆ-g[Î ¶œƒÜr©åŒaË9È-g[Î ¶œAl9¹å bËÄ–3ˆ-ç ·œAl9ƒØrrËÄ–3ˆ-g[ÎAn9ƒØr±åä–3ˆ-g[Î µœcÜr±å bËy¡¥å bËÄ?±åä–3ˆ-g[ÎAn9ƒ>ôw>Al9ƒØrrËÄ–3ˆ-g[ÎAn9ƒØr±åä–3èmËù.ÓÌ/äXg[ÎAn9ƒØr±åä–3è¶?\KËÄ–s[Î ¶œAl9¹å bËÄ–3ˆ-ç…––3ˆ-g[Î ¶œƒÜr±å RË9Æ-g[Î ¶œAl9¹å bËÄ–s[Î ¶œAl9ƒØrrËÄ–3ˆ-ç ·œAl9ƒØr±åä–3ˆ-g[Î ¶œƒØrưå zíoÔÒr±å bËÄ–óBKËÄ–3ˆ-ç ·œAl9ƒØr±åä–3ˆ-g[ÎAn9ƒØr±å bË9È-g[Î µœcÜr±å bËÄ–s[Î ¶œAl9ƒØrrËÄ–3ˆ-ç ·œAl9ƒØr±åä–3ès£––óBKËÄ–3ˆ-g[ÎAl9cØr±åä–3èc£––3ˆ-ç ·œAl9ƒØr±åä–3ˆ-g[ÎAn9ƒØr±å bË9È-g[Î ¶œƒØrÆÜö'Ê-g [ÎAn9ƒØr±åä–3ˆ-g[Î ¶œZZÎ ¶œAl9ƒØrrËÄ–3èµ?QKËÄ–3ˆ-g[ÎAn9ƒÔrưåÄ–3†-g[Î ¶œƒÜr±å bË9È-g[Î µœ1l9¹å bËÄ–3ˆ-ç ·œAl9ƒØrrËÄ–3ˆ-gZÎË,-gZζœƒÜr±å bËÄ–s[ΠÏýZZÎAl9cØr½ÿ»¶œƒÜr±å bË9È-gÐÇþ8--g[ÎAn9ƒÔrưå RË9Æ-g[Î ¶œƒÜr±å bËÄ–s[Î µœ1l9/ä–3æ¶¿MKËÄ–s[Î ¶œAl9¹å bËÄ–3ˆ-ç ·œAj9cØr±åä–3ˆ-gÐkœ––3ˆ-g[Î µœcÜr­¿ßÜrrËÄ–3ˆ-g[ÎAn9ƒØr±åä–3ˆ-g[Î µœ—YZÎ ¶œAl9ƒØrrËÄ–3ˆ-ç ·œAj9cØr©åã–3ˆ-g[ÎAn9ƒØr±å bË9È-g[Î ¶œƒÜr©åŒaËÄ–s[Î ¶œAl9ƒØrrËÄ–3H-ç·œAû¶œAl9/´´œAl9ƒØrrËÄ–3ˆ-g[ÎAn9ƒØr©åã–3ˆ-gпøÑÕ¥åä–3ˆ-g[ÎAn9ƒÔrưå RË9Æ-g[Î ¶œAl9¹å bËÄ–s[Î ¶œAl9ƒØrbËÖ3ˆ-ç´µœA·ÿÐrþóó•ÿ¯ào-ç㟠ñÿž.jËôí‹ :-'.–S—ÚrêR[Î÷—¾µœBm9ßÜ·–S—ÚrâÒi9qé´œBm9NË)Ô–S¨-§P[N| ÚrâÐi9u¨-'.–S¨-'>®-§µåÄ¡ÓrâÒi9u©-'.–—NË©Km9…ÚrâãNˉK§åÔ¥¶œºÔ–—NˉK§åz¥å:-§P[N¡´œ2m9ß¾µœï/}k9‰ò‡a}\[N]jËÉKi9y)-§.µåÔ¥´œ<”–S‡ÚrêR[N¢´œü¸´œºÔ–S—ÚròRZN^JË)Ô–“(&JË)Ô–“(-§¾m9y)-§P[N¢ûúF}k9õ…·åÔ¥¶œ¼”–“—¦åÔ¡¶œ:Ô–“—ÒrâÒi9‰ÒrâãNËÉKi9u©-§.µå$JË)Ô–“ècþ·(-'QZN} ÚrêR[N^JËÉK_ûuZN}\[N^zíoÔi9ÿ÷Òïæù•·õá:-§¾Î¶œºÔ–S—Úr=÷‡ë´œºÔ–“—ûÃuZN¡¶œDŸûÃuZN¡¶œDûÃuZN^zýx¸~¹tZN\:-'Ñs¸NË©Km9u©-'/½Ö‡ë´œ:Ô–“—ûÃuZN]jË©Km9‰žûÃuZN]jËIôØ®Ór µå$JËIôÜ®ÓrêR[N^ºï×i9u©-'Ñçþp–“—¾Þ>\¥åÔ¡¶œ<ôÚߨÓrêR[N^JËÉK_ûuZN|Üi9y)-§.µåÔ¥¶œDý:-§P[N¢Ïý:-§¾m9u©-'/=~¼Q¿^zíoÔi9õqm9yé¹¾Q§åÔ¡¶œ¼tßߨÓrêR[N]jËIôØß¨ÓrêR[N]jËÉK¯ý:-'QZN¢´œD_ûuZN} ÚròÒs£NˉK§åä¥ÇþF–S—–S‡ÚròÐs£NË©Km9y龿Q§åjËIô¹¿Q§åÔÞ–S—ÚrÝ÷7ê´œBm9‰nûuZN} ÚrêR[N]jËÉKÏoÔo—ÒrêP[N¢ÇúD–S‡ÚrêR[N^zîOÔi9u©-'ÑýÇõ+zíOÔi9ñ…Ÿ–“—ž?ž¨_/}íOÔi9‰îûuZN¡¶œúÂÛròÒc¢NË©Km9u)-'=÷ª-§>¬-'=öê´œºÔ–S—ÚròRZN]jË©Km9‰¦å¤yíÔi9õu·åä¥çþ@–S¨-'Ñ} NË©Km9u©-'/=öª-'–‡ÚrÒ<÷ê´œºÔ–“—ûuZN]jË©Km9yé¹?Pm9inûû4-§¾è¶œ:Ó–“èsœNË)Ô–S_x[N^ºïÓi9u©-§.¥åä¡ÇÇé×C_mØi9‰îûãtZN]jË©Km9yé±?N§åÔ¥¶œDŸëãtZN ¶œ4·ým:-'¾§åÔ¥¶œDi9‰žûÛtZN}ám9y龿M§åÔ¥¶œº”–“‡ûãtZN}Z[N]jËÉK¯ýq:-§.µåä¥Çþ8µå”iËI´þ~kË)Ô–SÿñÛròÒcœNË)Ô–“èsœNË©Km9u©-'/Ý÷ש-'–‡NËÉKÏý/NË©kË©Km9y鵿N§å$º­¯Ói9‰¾Ö×éÕ–“辿N§åÔ¥¶œºÔ–“—ûëtZN}\[N]jËÉKÏýu:-§.¥åä¡û×é×C¯¿¶,â[ËIô¹¿N§å䥯ýu:-§.½~þøê¯—^ëëtZN¢ýÌcNˉ/ú´œ¸tZN^zí¯Ói9‰nûëtZN^úÚ_§ÓrêR[N^z®¯Ói9u¨-'/ý‹]=-§>®-§.µåä¥çþ:–S—ÒròÐ}ÚrÊ´å$úùƒ«¿¢Çþ:–S߀¶œºÔ–“—^ûëtZN}\[N^zì¯Ói9u)-§µåä¡çú:}k9ß_úÖrþï¥ßZÎû??¹á]Î"írq—³H»œEÚå,Ò.ç ïri—³H»œEÚå â.g‘v9‹´ËÄ]Î"íri—³H»œAÚå¬Ñ.g‘v9ƒ¸ËY¤]Î"ìrÖh—3ˆ»œEÚå,Ò.gw9‹´ËY¤]Î"írq—³H»œEÚå,Ò.gw9‹´ËYôÂ.gw9‹´ËY„]Îírò.çAØå<»œEÚå<»œa—ó ìri—ó ÷»œÇ`—³H»œa—ó ìr„]Î"ír„]΃°Ëyv9‹´Ëyv9Â.g‘v9Â.çAØå<»œEÚå<»œa—³H»œa—ó ìrô~—³F»œa—ó ìrq—ó ìr„Üè ìri—ó ìr„]Î"írôñ×Û¿ë ìr„]Î"ír„]΃°Ëyv9‹´Ëyv9z¿Ëù.Óœ_©±ÎƒÞŽu~3Øå<»œEÚå<»œa—³H»œÝö‡‹»œa—³H»œa—ó ìri—ó ìr„]΃°ËôÏßP¬w9Â.çAØå,Ò.çAØå<èµ>\Üå<»œa—ó ìri—ó ûþpq—³H»œa—ó ìr„]Î"ír„]΃°ËY¤]΃°Ëyv9Â.g‘v9Â.çAØå<»œEØå<»œ½ö7Š»œa—ó ìr„]Î îr„]΃°ËY¤]΃°Ëyv9Â.g‘v9Â.çAØå,Ò.çAØå<»œa—³H»œa—ó ÷»œ5Úå<»œa—ó ìri—ó ìr„]΃°ËY¤]΃°Ëyv9‹´Ëyv9Â.çAØå,Ò.çAØå<»œAÜå<»œa—ó ìra—óìr„]Î"írô±¿QÜå<»œEÚå<»œa—ó ìri—ó ìr„]Î"ír„]΃°Ëyv9‹´Ëyv9Â.gv9¹íO”v9Á.g‘v9Â.çAØå,Ò.çAØå<»œa—3ˆ»œa—ó ìr„]Î"ír„]΃^ûÅ]΃°Ëyv9Â.g‘v9z¿Ëy v9‹°Ëy v9Â.çAØå,Ò.çAØå<»œEÚå<»œ½ßå<»œEÚå<»œa—ó ìri—ó ìr„]Î"ír„]΃°ËyÐû]Îîrô~—óìri—ó ìr„]΃°ËY¤]΃°Ëyv9‹°Ëy v9z7–pv9‹´Ëyv9Â.g‘v9úØ'îr„]Î"írô~—óìrô~—³F»œa—ó ìri—ó ìr„]΃°ËY¤]΃Þïrƒ]Î írsÛß&îr„]Î"ír„]΃°ËY¤]΃°Ëyv9Â.g‘v9z¿Ëy v9Â.g‘v9Â.çAØå,Ò.çAØå<»œ½ßå¬Ñ.çAëï7íri—ó ìr„]΃°ËY¤]΃°Ëyv9‹´Ëyv9Â.çAïw9c¸Ëyv9Â.çAØå,Ò.çAØå<»œEÚå<èý.ç1Øå<èý.gv9Â.çAØå,Ò.çAØå<»œa—³H»œa—ó ìri—ó ÷»œÇ`—ó ìri—ó ìr„]΃°ËY¤]΃°ËyÐû]Îír´ŸÁ.çAØå â.çAØå<»œEÚå<»œa—ó ìri—ó ìrô~—³F»œa—ó ñ£«Üå,Ò.çAØå<»œEÚå<èý.ç1Øå<èý.gv9Â.çAØå<»œEÚå<»œa—³H»œa—ó ìr„]Î"ìrƒ]΃°Ë9È»œÝþÓ.ç?O–r^Æ%糄œ—qÇygœ—qÅùÙ"Î˸ἌÎ˸àüc–€ó2î7/ã|óYêÍË8Þ¼ŒÛÍË8Ýüc\n^ÄáæeÜmþ1K¶yW›—a´y7›Ì’l^ÆÅæelþ1K¯yçš—q­yÇšÌÒj^Æ©æe\j^Æ¡æ³tš—q¦yWšÌi^Ææe˜h^Ä…æ?f 4ÇÜõ_!Æ0ϼŒëÌ1Œ3ǰÍÃ4ó2.3Ç(ÌÂ.ó2Î2ǰÊÃ(s ›ÌË8ÉÃ"s ƒÌ1ì1/ãs kÌ1Œ1/ãs SÌ1,1Ç0ļŒ;Ì1Ì0ǰ¼Œ#Ì1l0Ç0Á£ó"0ǰ¿ÃüòYêË1Œ/Çð°c˜^^Æå冗cØ]^ÆÙå˜ýíÌF—cØ\^ÆÉå—c\Žaoyç–cÞ×–ïBÊù…ï Ì·–c”Zai9†¡åeÜYŽaf9†•åeY޹­OÑ’XŽaay–cØWŽa^yוcWŽa[9†iå³”•cVŽaW9†Yåe\UŽaT9FMåEœTŽaQ9†Aåö”—qN9æ¾>EKLy·”c˜RŽaI9†!åeÜQŽaF9†åeQŽaC9† å”—q@9†ýäæ“cXO^†ñä¶“c˜N^Æå䆓cØMŽa6ùÇ,ÕäF“cØL^ÆÉä“cLŽa/yç’cXKŽa,y·’c˜JŽa)9†¡äeÜIŽa&9F•äEIŽa#9†‰ä’—q 9†}äæ‘cXG^Æqä¶‘c˜F^Æe䆑cØEŽayW‘cEŽaùÇ,Iä‘cDŽayæCXCŽa y·c>ÖWg)!Ç0„¼Œ;È1Ì Ç°‚Ãò2n Ç0Ãò2 ǰÃüq ëÇË8~Ãöq ÓÇ˰|r[wC˜=^ÆÕãFcØ<^ÆÉãc<ŽaïøÇ,¹ãÖŽc;Žaëx§ŽcX:ŽaèxwŽc˜9Žaå8†‘ãeÜ8ŽQâ8„…ãe8aß8†yãÖ—qÜ8†m㦗qÙ8†aãuC˜5^ÆUãFcØ4ŽaÒxc4ŽaÏxçŒcX3ŽaÌ8F-㲤ŒcT2aÈxwŒc˜1ŽaÅ8†ãeÜ0ŽaÂ8†ãe0a¿8æýÏ” `½xÇ‹cØ.Žaºx—‹c>ÖçféǼÖçf©Ç(ZÂfqŒ’Å‹¸XÃ`q {ÅË8WÃZq cÅ1l/ãTqŒJÅ! ÿwŠCnëk³TŠc)^Æâ&ŠcX(^Æâö‰c˜'ŽaxljcÔ&aš8†eâe&Ža—8†Yâe\%Ža”8†Mâ%‰q‘8fûíåñ2ÎǰFÃq [ÄË8EÃq CÄ˸Cà q +Ä1Šÿ¥AÃq Ä1 /ãþp óÃ1¬/ãøpŒÚÃ!LǨ<¼ˆÃÃ1ìÇ0;¼Œ«Ã1Œǰ9Ãäð2.Ç08ÃÞð2ΠǨ6ÂØp [ÃË85ÃÒp CÃ1ì /ãÌp +Ã1¯í½YÃ1ë†cþ1K_8†yáÖ…—q\8†mᦅcX^Æaáv…c”^ÄUáF…cöÉ\’Â˸(àp {ÂË8'£špcÂ1j /â”p KÂ1 ǰ#¼Œ3Â1¬Ç0"¼ŒÂ1Lǰ Àð2ì‡0Ãzð³Åƒcnÿ¥üç¯Ï- b=8Èù`ûÁ „A,/´$„Alƒ±"äŒ0ˆaCÂA. ƒ˜±% bL8ˆ5a s ö„ƒ±( RRæp£Â V…AÌ ¹+ bXIJ0ˆiá ·…AŒ ƒX1/ä¾0ˆa ÃAN ƒØ)2Œaex¡%3,RgX¤Ð0ˆ¥a‘RÃ"µ†EŠ ƒX!7¬QoÄà°HÅa‘’Ã"5‡AŒ‹T);,RwÄð°Håa‘Òà ¶‡EŠ‹T)? bX¤±HbÄ"5ˆEŠ‹P!Æ0C,R‡X¤qKÄ"¥ˆEúƒo‘bÄ ÖˆEÊ‹Ô#1H,úÀßæ)I,z! b”X¤*±HYb‘ºÄ „‰o¢ÃþJC)M b›X„8±Fub‘òÄ ö‰E ‹T(1Q,ºí—#Å"UŠAÌ‹Ô))T b©X¤T±H­b‘bÅA®‹”+©W,R°Äb±HÉbšÅF‹Eª‹”-©[ b¸X¤r±HébÛÅ"Å‹Eª‹”/±_,RÀX¤‚1ˆ c‘Æ"EŒEªƒ˜1©c,RÈX¤’1H)cZÆ"ÅŒA¬‹”3©g,RÐ8ÈEc‘’Æ"5AŒ‹T5)k,R×ݱHec‘ÒÆ ¶EŠ‹T7)o bßX¤À±…c Ç"5ŽEŠ‹T91s,RçX¤Ð±H¥cSÇ"µŽEŠƒX;)w,RïX¤à1ˆÅc‘’Ç"5ƒ=©z,RöX¤î1èŸÿ¹bùX¤ô1ˆícÑÇþF¹~,RþÄþ±Hd‘ È"%Al ‹A©‚ bY¤²H!d‘JÈ ¦Ej!‹C©†¬¹íO{È‘A,"‹”D©‰ bY¤*²HYd‘ºÈA#‹TF),RÄ8²Hud‘òÈ ö‘E $‹TH)‘ b#Y„H²F•d2Éu’E %‹TJ1•,R+Y¤X2ˆµd‘rÉ"ô’5 &ƒXL)™,R3Y¤h2ˆÕd‘²É"u“A '‹TN),B;9ÆñdêÉå“Aì'‹P© ,RBòHe‘*Ê e”5ê(‹Þþt]…JÊ ¦”Ej)‹S±¦,úØ'÷”E *ƒXT!©¬QSY„¨2†Ue‘²Ê"u•A +‹TV)­,R[ĸ²ueòÊAì+knûÛä²H‰eÐ?ÿsýšY©² bfY¤Î²H¡e‘JË ¦–Eh-k[©¶ bnY¤Þ²HÁe‹Ë"%—Ej.‹]ưº,Z¿±» bxY¤ò²Hée‘ÚË Æ—Eª/‹”_±¿,R€Y¤³ æ7˜EŠ0‹Ta)à b‡Y¤³H%fSÌ"´˜5Š1‹PcÆ0Ç,RY¤ 3ˆEf‘’Ì"5™EŠ2ƒXe)Ë,R—Ä0³efÒÌ"µ™AŒ3‹Tg)Ï,RŸÄ@³H…fÍ6šEûUšEÊ4¹Ó,R¨Y¤R3ˆ©f‘ZÍ"ÅšEª5ƒ˜k©×,B°Ãb³HÉfÑ¿øÑUG›A¬6‹”m©Û b¸Y„r³FéfÚÍÆ›Eª7‹”o©ß bÀY¤‚³H gÎ"EœEª8‹”q©ã¬QÈY¤’óBL9ÿþïùÿ¯ˆbÍþç·ŸþÏq矟 úw>þé~ÕƒwýŸ¯úB'îÄ¥wêRãN]jÜùþÒ·¸S¨qçûûwêRãN\:q'.¸S¨q'Љ;…w 5îj܉oAãN:q§5îÄ¥w 5îÄÇ5îÔ¡Æ8tâN\:q§.5îÄ¥wâÒ‰;u©q§PãN|܉;qéĺԸS—wâÒ‰;qéÄB;NÜ)Ô¸S(q§LãÎ÷ßoqçûKßâN¢üéX׸S—wòRâN^JÜ©K;u)q'%îԡƺԸ“(q'?.q§.5îԥƼ”¸“—w 5î$ÊŸŽ‰w 5î$JÜ©oAãN^JÜ)Ô¸“è¾¾QßâN}á;u©q'/%î䥉;u¨q§5îä¥Ä¸tâN¢Äø¸wòRâN]ú‰;u©q'QâN¡ÆDó—@D÷õúwê[иS—wòRâN^úzûF½ë6çW¶øÔ×иS_CãN]jÜ©K‰;yè±?\'îԥƺԸ“è¹?\'îԥƼ”¸“—^ûÃuâN¢Ïýá:q§PãN¢ýá:q'/½~<\¿\:q'.¸“è¹?\'îԥƺԸ“—^ëÃõѸS‡wòÒc¸NÜ©K;u©q'Ñs¸NÜ©K;‰ûÃuâN¡ÆDŸûÃuâN} wêRãN^ºï׉;u©q'ÑçþF¸“—¾ö7ªq§5îä¡×þF¸S—wòRâN^úÚߨwâãNÜÉK‰;u©q§.5î$zìoÔ‰;…w}îoÔ‰;õ-hÜ©K;yéñãúõÒk£NÜ©kÜÉKÏõ:q§5îä¥ûþF¸S—wêRãN¢ÇþF¸S—wêRãN^zíoÔ‰;‰nûuâN¢¯ý:q§¾;y鹿Q'îÄ¥wòÒc£NÜ©ûçÿê¶jÜÉCÏý:q§.5îä¥ûþF¸S¨q'QâN¢ÇþF¸S—wÝ÷7êÄB;‰nûuâN} wêRãN]jÜÉKÏoÔo—wêPãN¢ÇúD¸S‡wêRãN^zîOÔ‰;u©q'ÑýÇõ+zíOÔ‰;ñ…Ÿ¸“—ž?ž¨_/}íOÔ‰;‰îûuâN¡ÆúÂwòÒc¢NÜ©K;u)q'=÷ªq§>¬q'=öêĺԸS—wòRâN]jÜ©K;‰&î¤yíÔ‰;õu7îä¥çþ@¸S¨q'Ñ} NÜ©K;u©q'/=öªq'¸‡wÒ<÷êĺԸ“—ûuâN]jÜ©K;yé¹?P;inûû4q§¾èÆ:Ó¸“èsœNÜ)Ô¸S_xãN^ºïÓ‰;u©q§.%îä¡ÇÇé×C_m؉;‰îûãtâN]jÜ©K;yé±?N'îÔ¥ÆDŸëãtâN Æ4·ým:q'¾'îÔ¥ÆD‰;‰žûÛtâN}á;y龿M'îԥƺ”¸“‡ûãtâN}ZãN]jÜÉK¯ýq:q§.5îä¥Çþ85î”iÜI´þ~kÜ)Ô¸SÿñwòÒcœNÜ)Ô¸“èsœNÜ©K;u©q'/Ý÷שq'¸‡NÜÉKÏý/NÜ©kÜ©Kÿ﾿N'îÔ¥ÆD·õu:q'Ñ×ú:½wÝ÷×éĺԸS—wòÒcNÜ©kÜ©K;y鹿N'îÔ¥Ä÷×éļôµ¿N'îÔ¥×Ï_ýõÒk}NÜI´Ÿyì¯Ó‰;ñEŸ¸—NÜÉK¯ýu:q'ÑmNÜÉK_ûëtâN]jÜÉKÏõu:q§5îä¥ñ£«'îÔÇ5îԥƼôÜ_§wêRâNºï¯SãN™ÆD?põWôØ_§wêиS—wòÒkNÜ©kÜÉKýu:q§.%îÔ¡Æ<ô\_§oqçÿ^ú-î̯ºMÜù¿§‹;_ÿüP×¶Ü9ÈËZ–;y¹s—;y¹óÚ–;y¹s—;y¹óBËrç /wòrç…–åÎA^îäåÎA^î¼—;Çx¹s—;/´,wòrç .wŽñrç…–åÎA^îäåÎ -˃¼Ü9È˃¼Üy¡e¹s—;y¹s—;/´,wòrç /w^hYîäåÎA\îãåÎ?h[î ârg—;y¹3ˆËA\î ârç /wi¹3†Ëƒ¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Ü9ÈËA\î ârg—;y¹3è¾¾QÛrç /wq¹3ˆËAZîãåÎ .wq¹óBËrg—;ƒøÏq¹sÐÿãrg—;ƒ¸Ü9ÈËAá_ø ârg—;y¹3ˆËAï—;ßu›ù•œó„9ÏoˆËA\îäåÎ -wÆp¹3ˆËƒ¼ÜÄåÎ .wòrgÐm¸–åÎ .wòrg—;ƒ¸Ü9ÈËA\î ârg—;/´,wq¹3ˆËA\îäåÎ .wi¹sŒ—;ƒ¸ÜÄåÎ .wòrg—;ƒ¸Ü9ÈËA\î ârg—;y¹3ˆËA\îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;c¸ÜÄåÎA^î ârg—;ƒ¸Üy¡e¹3辿QËrç /wq¹3ˆËA\îäåÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ´Ü9ÆËA\î ârg—;y¹3ˆËA\î ârç /wq¹3ˆËƒ¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎ -ËA\î ârg—;%îÔ!/wq¹s—;ƒ>ö7jYî zíoÔ²ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA^î ârg—;ƒ¸Ü9ÈËA\î ârç .wÆÜö'ÊË1\îäåÎ .wq¹s—;ƒ¸ÜÄåÎ .w^hYî ârg—;ƒ¸Ü9ÈËA\î ârç /wq¹3ˆËA\îäåΠ;ÆÑb¸Ü9ˆË1\î ârg—;y¹3ˆËA\îäåÎ .wi¹3†Ëƒ¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA^î ârg—;ƒ´Üy™e¹3HË1\îäåÎ .wq¹3ˆËƒ¼ÜÄåÎ .wârg —;ƒÞÏ)Dp¹s—;ƒ¸ÜÄåÎA^î úاe¹3ˆËƒ¼Ü¤åÎ.wi¹sŒ—;ƒ¸ÜÄåÎA^î ârg—;ƒ¸Ü9ÈËAZîŒárç…¼ÜsÛߦe¹3ˆËƒ¼ÜÄåÎ .wòrg—;ƒ¸ÜôÒúÌ /wi¹3†ËA\îäåÎ .wq¹s—;ƒ¸ÜÄåÎ -wŽñrgÐúûÍ˃¼ÜÄåÎ .wq¹s—;ƒ¸ÜÄåÎA^î ârg—;ƒ´Üy™e¹3ˆËA\î ârç /wq¹3ˆËƒ¼Ü¤åÎ.wi¹sŒ—;ƒîûë´,wòrg—;ƒ¸ÜÄåÎA^î ârg—;y¹3HË1\î ârç /wq¹3ˆËA\îäåÎ .wi¹sŒ—;ƒö3\î ârç…–åÎ .wq¹s—;ƒ¸ÜÄåÎ .wòrg—;ƒ´Ü9ÆËA\î ú?ºº,wòrg—;ƒ¸Ü9ÈËAZîŒárgÐk}–åÎ .wq¹3ˆËƒ¼ÜÄåÎ .wòrg—;ƒ¸ÜÄåÎA\îŒárg—;ÿ ÿ¼Ü™_uû/Ëÿ³×k‹;ƒwrÜĸ3ˆqgÐKqç…–¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ ÆAŒ;1îŒaÜĸsãÎ ÆAŠ;cwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãΠƃw1î bÜ9ÈqgãÎ Å1Œ;/´ÄEŠ;‹w1î,RÜY¤¸³HqgãÎ"Ä5Š;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³HqgâÎÆEŠ;‹wrÜY¤¸³HB.RÜĸ³Hqg‘âÎ ÆEøK "ÅEŠ;ƒw½;ßt›ý•ï‹ÏoHqgãÎ"ÅEŠ;ƒw!î¬QÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹nûÃ帳HqgãÎ"ÅEŠ;ƒw)î,RÜYôÂÏ| rÜY¤¸³Hqg‘âÎ ÆEŠ;‹wÆ0î,RÜY¤¸³HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,RÜĸ³Hqg‘âÎ"ÅAŠ;kw)î bÜY¤¸³Hqg‘âÎAŽ;‹w)î bÜY¤¸³Hqg‘âΠÅEŠ;‹w1î,RÜY¤¸³HqgãÎ"ÅEˆ;cw)î,RÜY¤¸3ˆqg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"ÅAŒ;‹w)î丳Hqg‘âÎ"ÅAŠ;kw)î bÜYô±¿QŽ;‹^û帳Hqg‘âÎ"ÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w)íOãÎÅAŒ;‹w)î bÜY¤¸³Hqg‘âÎAŽ;‹w)î,RÜĸ³Hqg‘âΠÅEŠ;‹w)î bÜY„¸³FqgâÎÅEŠ;‹w1î,RÜY¤¸3ˆqg‘âÎ"Ä5Š;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,BÜ9ÆqgâÎÅAŒ;‹w)î,RÜô¡¸³Hqg‘âÎ Å5Š;‹ÞþÄ]…âÎ ÆEŠ;‹w1î,úØ'ÇEŠ;ƒw!î¬QÜY„¸3†qg‘âÎ"ÅAŒ;‹w)î,RÜĸ³qgâÎAŒ;knûÛ丳HqgãÎ"ÅEŠ;ƒw)î,RÜY¤¸3ˆqgâÎÅEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"Ä1Œ;‹ÖßoŒ;ƒw)î,RÜY¤¸3ˆqg‘âÎ"ÅAŒ;‹w)î,BÜ9Æqg‘âÎ"ÅEŠ;ƒw)î,RÜô¡¸³qgâÎ"Ä1Œ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹w1î,BÜY£¸³HqgãÎ"ÅEŠ;‹w1î,RÜY„¸3†qgÑ~Fqg‘âÎAŽ;‹w)î bÜY¤¸³Hqg‘âÎ ÆEŠ;‹wÆ0î,RÜYô/~tÕqgãÎ"ÅEŠ;ƒw!î¬QÜY„¸3†qg‘âÎ"ÅEŠ;ƒw)î,RÜĸ³Hqg‘âÎ"ÅAŠ;kw)î¼Ð;û«nÿ)îüûÿ½>Ö¸sãÎ -qç ǃwrÜùmqç ǃwrÜy¡%îä¸sãÎ -qç ǃwrÜy!ÇcwrÜy¡%îä¸sãÎ1Ž;/´ÄƒwrÜy¡%îä¸sãÎAŽ;/´ÄƒwrÜ9Èqç…–¸sãÎAŽ;/´ÄƒwbÜ9Æqç´ÅAŒ;ƒwrÜĸ3ˆqgãÎAŒ;ƒwÆ0îä¸3ˆqgãΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgâÎ1Ž;ƒw1î¼Ðw1î ⟃wrÜĸ3ˆqç ÇAúK  ÆAŒ;!î|×mæWjγˆqgãÎAŽ;ƒw1îä¸3Hqg ãΠƃw1î bÜ9ÈqgÐm¸–¸3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgãÎ -qgãÎ ÆAŒ;9î bܤ¸sÌãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw1îä¸3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãÎ ÆAŒ;1îŒaÜĸsãÎ ÆAŒ;ƒw^h‰;ƒw1îä¸3ˆqgãΠƃ>w1î bÜ9ÈqgãÎ ÆAŒ;9î bܤ¸sŒãÎ ÆAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î bÜy¡%î bÜĸ3ˆqç Æ1Œ;ƒwrÜô±¿QKÜĸsãÎ ÆAŒ;ƒwrÜtßߨ%îä¸3ˆqgãΠƃw1î bÜ9ˆqgÌm¢wÆ0îä¸3ˆqgãÎAŽ;ƒw1î bÜy¡%î bÜĸ3ˆqç ÇAŒ;ƒwú`Üĸ3ˆqgãÎAŽ;ƒwÆ0îĸ3†qgãΠƃw1î bÜ9ÈqgãÎ Å1Œ;9î bÜĸ3ˆqç ÇAŒ;ƒwrÜĸ3ˆqgâÎË,qgâÎƃw1î bÜĸsÐãÎ ÆAŒ;1îŒaÜôþ'î"wrÜĸ3ˆqç ÇAûã´ÄAŒ;9î RÜø3HqçÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒwÆ0î¼ãΘÛþ6-qgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw)îŒaÜĸsãΠûþ8-qç ÇAŒ;ƒw)îã¸3hýýæ¸sãÎ ÆAŒ;ƒwrÜĸ3ˆqç ÇAŒ;ƒw)î¼Ìw1î bÜĸsãÎ ÆAŒ;9î RÜø3HqçÇAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3Hqg ãΠƃw1î bÜĸsãÎ ÆAŠ;Ç8î ÚÏ0î bÜy¡%î bÜĸsãÎ ÆAŒ;ƒwrÜĸ3HqçÇAŒ;ƒþÅ®.qç ÇAŒ;ƒwrܤ¸3†qgâÎ1Ž;ƒw1î bÜ9ÈqgÐ]qgãÎAŽ;ƒw1î bÜ9ˆqg ãÎ ÆÐŽ;ó«nÿ)î|ýõøúw>þé~ÕƒwýŸ¯úB'îÄ¥wêRãN]jÜùþÒ·¸S¨qçûûwêRãN\:q'.¸S¨q'Љ;…w 5îj܉oAãN:q§5îÄ¥w 5îÄÇ5îÔ¡Æ8tâN\:q§.5îÄ¥wâÒ‰;u©q§PãN|܉;qéĺԸS—wâÒ‰;qéÄB;NÜ)Ô¸S(q§LãÎ÷ßoqçûKßâN¢üéX׸S—wòRâN^JÜ©K;u)q'%îԡƺԸ“(q'?.q§.5îԥƼ”¸“—w 5î$ÊŸŽ‰w 5î$JÜ©oAãN^JÜ)Ô¸“è¾¾QßâN}á;u©q'/%î䥉;u¨q§5îä¥Ä¸tâN¢Äø¸wòRâN]jÜ©K;‰w 5î$ú˜¿"º¿}£Þ%™ù•)>õ}iñ©¯¡q'/%î䥯ýá:q§>®q'/½ö‡ë唸“‡ûÃuâN]jÜ©K;‰žûÃuâN]jÜÉKýá:q§PãN¢Ïýá:q§PãN¢ýá:q'/½~<\¿\:q'.¸“è¹?\'îԥƺԸ“—^ëÃuâNjÜÉKýá:q§.5îÔ¥ÆDÏýá:q§.5î$zì׉;…w}®¸úwê[иS—wòÒ}£NÜ©K;‰>÷7êļôµ¿Q;u¨q'½ö7êĺԸ“—wòÒ×þF¸wâN^JÜ©K;u©q'Ñc£NÜ)Ô¸“ès£NÜ©oAãN]jÜÉKoÔ¯—^ûuâN}\ãN^z®oÔ‰;u¨q'/Ý÷7êĺԸS—w=ö7êĺԸS—wòÒk£NÜItÛߨw}íoÔ‰;õ-hÜÉKÏý:q'.¸“—ûuâN}\âNjÜÉCÏý:q§.5îä¥ûþF¸S¨q'ÑçþF¸S_xãN]jÜItßߨw 5î$ºíoÔ‰;õ-hÜ©K;u©q'/=¼Q¿]JÜ©C;‰ëuâNjÜ©K;yé¹?Q'îÔ¥ÆD÷OÔ¯èµ?Q'îÄ~âN^zþx¢~½ôµ?Q'î$ºïOÔ‰;…wê oÜÉKý‰:q§.5îÔ¥Ä<ôÜ_¨Æú°Æ<ôØ_¨wêRãN]jÜÉK‰;u©q§.5î$š¸“æµ?P'îÔ×ݸ“—žûuâN¡ÆD÷ý:q§.5îԥƼôبÆ8tâNjÜIóܨwêRãN^zìÔ‰;u©q§.5îä¥çþ@5íïÓÄú¢wêLãN¢Ïýq:q§PãN}á;yé¾?N'îԥƺ”¸“‡?§_}ýµ=`'î$ºïÓ‰;u©q§.5îä¥Çþ8¸S—w}®Ó‰;wÒÜö·éÄøœ¸S—w%î$zîoÓ‰;õ…7îä¥ûþ6¸S—wêRâNzìÓ‰;õi;u©q'/½öÇéĺԸ“—ûãÔ¸S¦q'Ñúû­q§PãNýÇoÜÉKýq:q§PãN¢Ïýq:q§.5îԥƼtß_§Æ8tâN:q'/=÷¿8q§>®q§.5îä¥×þ:¸“è¶¾N'î$úZ_§WãN¢ûþ:¸S—wêRãN^zì¯Ó‰;õq;u©q'/=÷×é唸“‡î?^§_½þÚ²ˆoq'Ñçþ:¸“—¾ö×éĺôúùã«¿^z­¯Ó‰;‰ö3ýu:q'¾èwâÒ‰;y鵿N'î$ºí¯Ó‰;yékNÜ©K;yé¹¾N'îԡƼô/~tõÄú¸ÆºÔ¸“—žûëtâN]JÜÉC÷ýujÜ)Ó¸“èçϨþŠûëtâN}wêRãN^zí¯Ó‰;õq;y鱿N'îÔ¥Ä:Ô¸“‡žëëô-îüßK¿ÅùU·‰;ÿ÷ô/qçßÿ5èïÿ?»,wq¹s—;ƒ¸ÜÄåÎ .w^hYî ârg—;ƒ¸Ü9ÈËA;…¸Ü9ÈËA\î ârg—;q¹3†ËA\îäåÎ .wi¹3†Ëƒ¼ÜÄåÎ .wòrg—;ƒ¸ÜôÒrç /wq¹3ˆËA\îäåÎ .wq¹s—;ƒ¸Ü¤åÎ.w^hYî,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEXî¬Ñrg—;‹´ÜY¤åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY¤åÎ .wi¹³HËEZî ârg‘–;‹´ÜÄåÎ"-wi¹³Ë1\î,Òrg‘–;y¹³HËEú犴ÜÄåÎ"-wi¹3ˆËE½û¾Þt›ý•šó,Òœgæ<¿!-wi¹³HËA\î,Òrg‘–;ƒ¸ÜY„åÎ-wi¹3ˆËEZî,Òrg—;‹nûÃååÎ"-wq¹³HËEZî ârg‘–;‹´ÜY¤åÎA^î,Òrg‘–;‹´ÜÄå΢ļ„åÎ.wi¹³HËEZî ºi¹³HËEZî ârg‘–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg‘–;‹^ø§)ƒ¸ÜY¤åÎ"-wi¹3HË5Zî,Òrg—;‹´ÜY¤åÎ"-wòrg‘–;‹´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Ârg —;‹´ÜY¤åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY¤åÎ .wi¹³HËEZî ârg‘–;‹´Ü9ÈËEZî,Òrg‘–;ƒ´ÜY£åÎ"-wq¹³èc£¼ÜY¤åÎ .wi¹³HËEZî ârgÑ}£¼ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒ´ÜYsÛŸ(.wÖh¹3ˆËEZî,Òrg—;‹´ÜY¤å΢×þDy¹³HËEZî,Òrg—;‹´ÜY¤åÎ .wi¹³HËEZî ºi¹³Ë5Zî Òrg–;‹´ÜY¤åÎ .wi¹³HËA\î,Òrg–;k´ÜÄåÎ"-wi¹³HËA\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wa¹sŒ—;‹°ÜY£åÎ .wi¹³HËEZî ârg‘–;‹´Ü¤åÎ-w½S¨Ðrg—;‹´ÜY¤åÎ .w}ì“—;‹´ÜÄåÎ",wÖh¹³Ë1\î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEXî¬Ñrç .wÖÜö·ÉËEZî ârg‘–;‹´ÜÄåÎ"-wi¹³HËA\î,Ârg–;‹´ÜÄåÎ"-wi¹3ˆËEZî,Òrg–;c¸ÜY´þ~ãrg—;‹´ÜY¤åÎ"-wq¹³HËEZî ârg‘–;‹´ÜY„åÎ1^î,Òrg‘–;‹´ÜÄåÎ"-wi¹3ˆËEXî¬Ñrg–;cnZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Òrg—;‹°ÜY£åÎ"-wq¹³HËEZî,Òrg—;‹´ÜY„åÎ.wíg´ÜY¤åÎA^î,Òrg‘–;ƒ¸ÜY¤åÎ"-wi¹3ˆËEZî,Ârg —;‹´ÜYô/~tÕËA\î,Òrg‘–;ƒ¸ÜY„åÎ-wa¹3†ËEZî,Òrg‘–;ƒ¸ÜY¤åÎ"-wq¹³HËEZî,Òrg–;k´ÜY¤åÎ ý×åÎþªÛYîüû¿á|ÞÖ¸sãÎ -qç ǃwrÜùmqç ǃwrÜy¡%îä¸sãÎ -qç ǃwrÜy¡ãÎ1Ž;9î¼ÐwrÜ9ˆqçÇZâÎAŽ;9î¼ÐwrÜ9Èqç ÇZâÎAŽ;9îä¸óBKÜ9Èqç ÇZâÎAŽ;1îã¸óÚâÎ ÆAŒ;9î bÜĸ3ˆqç ÇAŠ;cwrÜĸ3ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw1î bÜĸsãÎ ÆAŒ;9î bÜĸ3HqçÇAŒ;ƒw^h‰;ƒwñOÈAŒ;9î bÜĸsâÎwÝf~å‡þf(ˆqgãÎAŽ;ƒw1î bÜ9ÈqgãΠƃw)îŒaÜĸsãÎ ÆAŒ;9î ºí×w1îä¸3ˆqgãÎAŽ;ƒw1î bÜy¡%î bÜĸ3ˆqç ÇAŒ;ƒwŽqÜĸ3ˆqgãÎA7ÆAŒ;ƒwrÜĸ3ˆqgãÎAŽ;ƒw1îä¸3ˆqgãΠƃw1î bÜĸsãÎÆÿŸ³;H¬39’t»£D\`ÿ{%þnh 8®|# ú£_$Šªh²pÒwNdÜ™ˆ¸3qg"âÎ'Zpg"âÎDÄw&"îLDÜ™ˆ¸s"ãÎDĉˆ;'2îLDÜ™ˆ¸3qçDƉˆ; wNcÜ™ˆ¸3qg"âΉŒ;w&"îLDÜ9‘qg"âÎDÄw&"îLDÜ™ˆ¸s"ãÎDĉˆ;ŸhÁ‰ˆ;w&"¸3 qg"âΉŒ;ýÚߨw&"îœÈ¸3qg"âÎDÄw&"îLDÜ9‘qg"âÎDĉˆ;'2îLDÜ™ˆ¸s"âÎ4oûeÜ™†¸s"ãÎDĉˆ;'2îLDÜ™ˆ¸3qç-¸3qg"âÎDÄw&zߟ¨wNdÜ™ˆ¸3qg"âΉވ; w¦!¸3 qg"âÎDÄw&"îLDÜ9‘qg"âÎDÂiˆ;'2îLDÜ™ˆ¸3qçDƉˆ;wNdÜ™ˆ¸3qg"áΧYpg"áÎ4Äw&"îLDÜ™ˆ¸s"ãÎDĉˆ;'"îLCÜ™è矸KAÜ9‘qg"âÎDÄw&úµ?N îLDÜ9‘qg"áÎ4ĉ„;§1îLDÜ™ˆ¸s"ãÎDĉˆ;wNdÜ™H¸3 qçw¦yÛߦw&"îœÈ¸3qg"âΉŒ;w&"îLDÜ9‘qg"áÎ4ĉˆ;'2îLDÜ™ˆ¸s"ãÎDĉˆ; wNcÜ™hýýfÜ9‘qg"âÎDĉˆ;'2îLDÜ™ˆ¸s"ãÎDĉˆ; w>Í‚;w&"îLDÜ9‘qg¢÷ýuZpçDƉ„;Ów&îœÆ¸3qg"âΉŒ;w&"îLDÜ9‘qg"âÎDÄw&îLCÜ™ˆ¸s"ãÎDĉˆ;wNdÜ™ˆ¸3‘pç4Ɖö3ĉˆ;ŸhÁ‰ˆ;wNdÜ™ˆ¸3qg"âΉŒ;w&îœÆ¸3qg¢ÿáGWÜ9‘qg"âÎDÄw&îLCÜ™H¸sãÎDĉˆ;wNdÜ™ˆ¸3qçDƉˆ;w&"¸3 qg"âÎ?Ñ¿ÆùUoÿ wþß¿ÚÎïæF§)íünmôi®ìüùÎ…¸S׉;e?Þù¢:ÑuþøY_L'î”tþ|çŠÎŸï\Љ¦žóçærN4ÕœhŠ9ÑÔrþüÏ^Êùó™+9q¦óç;×q¢)ãüù³ª8q¦ˆóç3×pþ|çNÜ©àüùΜ?ß¹~wÊ7ÑToþüYoþ|çÚMÜ)ÝÄÊÍŸï\¸ùóë6Ñ”mþÜ\µ‰¦hÍùg=S²ùã?ú±ùã/`SÍëŸõ³Ê5q§ZSwÎ?ËoÕ/VwJ5q'RSg5q¦NwÊ4ÕDi곂4q§FwJ4u'BSw4ÑÔgªÉŸoÕ|`Ý~šâL5±™øg/ÍÔÈL4…™jÞ·Wç ËÄ×\•‰;E™º“©;Ÿÿl¿ +2q¦ Swâ1¾s9¦šhÌŸ?ëbL݉ÅÄRLÜ©ÄTˆùßÍOÆòù…Å™8^†©æ}{о L|Cj0q§Sw"0uçs}Š®¿Äg•_êÎÇú]|‰;±—:sÖ§èÊKÜ)¼ÄºK5¯õ)ºêwŠ.uç¬OÑ%—h*.Õü^Ÿ¢ë-Ñ”[ªùµ>E[êÎÇ_OÑß¹Ôòç;WZªy­OÑu–¸Sf‰;U–ºó±=E×XâL‰¥îœõ)ºÀwê+qçí}}Š®®ÄgWâNm¥šóãSt›ÏõÕ¹°RÍïõÕ¹¬ÿìU•¸ST©;ïë«sI%îTTªù½¾:×SêÎçúêTSâL1¥Î|¬¯Î¥”¸SI©;”ºó¹¾:—QþüYWQêN%îÔPâN ¥š³¾:P¢©ŸTó{}u®žÄ?{ñ$îÔNêÎùëÕùîÎÇúê\8‰Ïª›Ô×öê\5‰3E“ºó¾¾:—LâNÅ$îLª9ë«s¹$îTKâN±¤î|¬¯Î¥’jÞÖWçBI5Ÿë«s™$þÙ«$uçµ¾:×Hþ|çIÝ9ë«s$>+>gÊ#uæµ¾:GâNm¤î¼¯¯Î•‘h #Õü^_Ë"ñ5WEâNQ¤š÷õÕ¹$ME¤š·õÕ¹ÿìå¸S ‰;źóúëÕùæN($ÎTBª9Û£s$ΔAâN¤î¼ÖGçHÜ)Tóþ×£ó]ó±>:×?þü5_þ¨;¯¿ïî|®ÎµjÞ×GçÊG4…øšëuç¬ÎU¸Sôˆ;ocuæµ¾9ø¤‚G9ë›s¹#îT;âN±£îÄ:âN©#îT:ªè¨äc}r.sÄ—\å¨;¯õɹÆM‰£š÷õɹÀwêq§¼QwÎúä7þ|æÚÆŸÏ”6*y­OÎ…¸Sר;g}r®jÄ¢FÜ©iÔ×úäT4*y[_œñŒøzÿóÛ‘jF5¿×çæZF4¥Œøš+uç}}n®cÄ2F܉bÔ™ó×sóݙϖéF5ïëss#îÔ/âNù¢îœõ¹¹xwjÕüÞž›+n •¼­¯Íe‹?ÿ“_µˆ;E‹jbÕ¼Ö׿ŠE|Í‹ºó¾¾6—+âNµ"î+êÌYŸ›KñQ•ЏS¨¨;ëss™"îT)êÎYŸ›E$%Šj¶ß^ŠhêñÏ]ž¨;g}n.NDS›¨æ÷úÜ\™ˆ;…‰¸S—¨;ïë{S•øó™‹>sM¢î¼Ö?¬_‘ˆÏ*HÄzDÝùXß›«Õ¼mï͵ˆj>·÷æ£QÍûúÞ\‡ˆ;eˆ¸S…¨;g}o®AÄg• âN¢î¼Ö÷æúCÜ ?Ô™÷¿Þ›ïÎ|ü³üÿ{¨æ÷úÞ\y¨;Ÿë{sÝ!î|üýc™ßÝùØÞ›‹Õ¬GÎúÞ\qøó×{ÁáÏw®7Ôõ½¹ÚPÍÛúÞ\k¨;Ÿë{s¥!îêÎk{o.3Ä™*CÝÙ$óC|V‰!îTêÎk}o®/ÄðBy_ß›âB$µ…jþþÙËïš³¾7⟼®wÊ uçc}o.*ÄgÕêÎYß›+ q' gê uæµ½7_4áßùNÎ/zLøß‡¿Á„¿ÿ¯e)2—"'òRd".E&âRd".E>Ѳ™ˆK‘‰¸™ˆK‘y)2—"q)r"/E&âRd".E&âRäD\ŠLÃ¥ÈD\ŠœÈK‘‰¸™HK‘i¸9‘—"q)2—"'òRd".E&âRd".ENä¥ÈD\ŠLÄ¥ÈD\ŠœÈK‘‰Þµ™ˆK‘y)2—"i)2 —"ŸhYŠl¤¥ÈFZŠLÄ¥ÈFZŠl¤¥ÈFZŠLÄ¥ÈFXŠl£¥ÈD\Šl¤¥ÈFZŠl¤¥ÈD\Šl¤¥ÈFZŠl¤¥ÈD\Šl¤¥ÈFZŠLÄ¥ÈFZŠl¤¥ÈFZŠLÄ¥ÈFZŠl¤¥ÈD\Šl¤¥ÈFZŠl„¥È4\Šl¤¥ÈFZŠœÈK‘´ÙHÿºF3IÄ¥ÈF?/Eþ`û+5™ó‘_¢_ÿüü¯™j¤¥ÈFZŠLÄ¥ÈFZŠl¤¥ÈFZŠLÄ¥ÈFZŠl¤¥ÈD\Šl„¥È6ZŠl¤¥ÈD\Šl¤¥ÈFZŠLÄ¥ÈFoûÃå¥ÈFZŠLÄ¥ÈFZŠl¤¥ÈD\Šl¤¥ÈFZŠl¤¥È‰¼ÙHK‘´ÙHK‘‰¸ÙHK‘°™†K‘´ÙHK‘´™ˆK‘´ÙHK‘‰¸ÙHK‘´ÙHK‘‰¸ÙHK‘´™ˆK‘´ÙHK‘´™ˆK‘´ÙHK‘´™HK‘m´ÙHK‘‰¸ÙHK‘´ÙHK‘y)²‘–"i)2—"i)²‘–"i)2—"i)²‘–"q)²‘–"i)²‘–"q)²‘–"a)2 —"i)²‘–"i)2—"i)²‘–"i)2—"i)²‘–"q)²‘–"i)²‘–"q)²‘–"i)r"/E6ÒRd#-E6úØß(.E¶ÑRd#-E&âRd£_ûå¥ÈFZŠLÄ¥ÈFZŠl¤¥ÈFZŠLô[K‘´ÙHK‘‰¸ÙHK‘´ÙHK‘‰¸ÙHK‘´™HK‘mÞö'ŠK‘m´™ˆK‘´ÙHK‘‰¸ÙHK‘´ÙHK‘y)²‘–"i)²‘–"q)²ÑûþDy)2—"i)²‘–"i)2—"a)²–"i)²–"i)²‘–"q)²‘–"i)2—"i)²–"Ûh)2—"i)²‘–"i)2—"i)²‘–"q)²‘–"i)²–"§ñRd#,E¶ÑRd".E6ÒRd#-E6ÒRd".E6ÒRd#-E&ÒRd-E6úñ_ßßâcœ¼ÙHK‘´™ˆK‘~í“—"i)2—"a)²–"a)2 —"i)²‘–"q)²‘–"i)²‘–"q)²–"Ûh)r".E¶yÛß&/E6ÒRd".E6ÒRd#-E&âRd#-E6ÒRd#-E&âRd#,E¶ÑRd#-E&ú­¥ÈFZŠl¤¥ÈD\Šl¤¥ÈFZŠl„¥È4\Šl´þ~ãRd".E6ÒRd#-E6ÒRd".E6ÒRd#-E&âRd#-E6ÒRd#,ENã¥ÈFZŠl¤¥ÈFZŠLÄ¥ÈFZŠl¤¥ÈD\Šl„¥È6ZŠl„¥È4\Šl¤¥ÈFZŠLÄ¥ÈFZŠl¤¥ÈFZŠLÄ¥ÈFZŠl¤¥ÈD\Šl„¥È6ZŠl¤¥ÈD\Šl¤¥ÈFZŠl¤¥ÈD\Šl¤¥ÈFXŠLÃ¥ÈFû-E6ÒRäD^Šl¤¥ÈFZŠLÄ¥ÈFZŠl¤¥ÈFZŠLÄ¥ÈFZŠl„¥È4\Šl¤¥ÈFÿîz)2—"i)²‘–"q)²–"Ûh)²–"Óp)²‘–"i)²‘–"q)²‘–"i)2—"i)²‘–"i)2‘–"Ûh)²‘–"Ÿèß.EöW½ý›¥Èÿû£×n;ŸÆ´óO³ÈΧ1ì|»Î§1ëüO³©Î§1ê|›Î§1éüÓ,¢ói :ŸÆžóO³pΧ±æ|cΧ±åüÓ˜r>‰%çÓrþiÇù4fœOCÅù$FœšÅp> çÓXpþiÀù4ö›Oc¾ù4Ö›šo>íæÓ˜n>åæŸf›Oc·ù4f›šEm>ÑæÓÐl>‰ÉæšMlNC°9 ½æÓ˜kNC­9 ±æ4´šOcª9¤æ$„šOc§9 ™æ4TšÓi>æ4$šÓPhNC ù4ö™ÓgNCù4Æ™ÓÐfNCš9 eæÓfNC—9 YæÓXeNC”9 Mæ4"™Ob‘9 Aæ4ô˜š…cNC9 ÿD; -æÓ€bþ¤,çþÌ3oCˆù4v˜ÓüÒßáLC…9 æÓØ`NC‚9 æ4˜Oó›þròËi¨/ŸÆørÙËIH/§¡¼|ÃËiè.§!»|«ËiÞÖ§h1—Ó\>Åå4—ÓÐ[>¹å4Ô–Ó[NCkù§Y¨å4”–ÓZNCgù4f–ÓPYN#dù$6–ÓXNCa9 åÓØWNC^9 uåÓWNC[9 iå4”•OcX9 ]å4d•OcU9 Qå44•ÓT>Eå4•ÓÐSNCNù4Ô”“SNCKù4¦”ÓPRNCH9 åŸfa”ÓPQNCDù46”ÓPNCA9 åÓØONC>9 õäÓONC;9 éä4”“Oc89 Ýä4b“Ob59 Ñä4ï뫳ɧ±˜œ†`rzÉiÈ%ŸÆZrbÉih%ŸÆTrJÉi%§¡“|3Éi¨$§!’üÓ,FrÉi($§!|úÈIÈ#§¡Ž|ãÈi~­¯ÎB#§¡Œ|ÃÈiè"§!‹œ†*òi~ENC9 IäÓXDNC9 =ä4äOc 9 1ä4´OC 9ÉÛúèBNBù4fÓPANCù46Ó@NC9 äŸfñÓ?NCý8 ñãÓØ>NCú8 åãÓ>NC÷8 Ùã4TOcô8Ìã$$OCñ8 Áã4ôŽÓ;>µã4ÄŽÓÐ:>©ã4”ŽÓ:NBçø4fŽÓP9NCä8 ãÓ˜8NCá8 ãÓØ7NCÞ8 uã4Â’Å6N#Ú8 eãÓ6NC×8 Yã4TOcÔ8 Mã4$OCÑ8 Aã4?ÿÙäŒOcÍ8 1ã4´ŒOcÊ8ͯõ¹Y ã4tŒOcÆ8ã$DŒÓÈ0>‰ ã4ŒÓ0>ýâ4ä‹ÓP/NC¼ø4¶‹Óˆ.NB¹ø§1\œäm}m¶8 ÕâÓ-NC³8 ÉâÓX,NC°8 ½â4äŠOc­8°â$´ŠÓ*>¥â4„ŠÓÐ)>™â4TŠÓ)N#£ø$&ŠÓl¿½ ŸÆ>qòÄi¨§!N|ÛÄiH§¡L|ÃÄiè§!KœF*ñO² Äih§!Iœ†"ñi §¡Gœ†ñi¬§Fœ„qQÄ'±Dœ†q:ħ1Cœ† q"ÄihŸÆq ÄiŸÆþpñÃI¨§!>|ÛÃiH§¡<œ†ððiì§!;œFêðIŒ§YNCqø§YÀá4ô†Ó>µá4ĆÓÐNCjø4–†ÓN#gø$f†ÓPN³ÿHæb ŸÆÄp Ãi ŸÆ¾pñÂI¨ §.|ÛÂiH §¡,œ†°ðiì §!+œ†ªðiŒ §¡)œ†¤pŠÂ§!(œ„žprÂÿ4ÿZÎ/zûW˜ðÏ\nšp"sÂ'Z<áD…½SNdRø'ÚLáDF…YNdVøD‹+œÈ°p"ËÂ'ZháD¶…Nd]øDæ…ÓØNd`øD‹0œÈÄp"ÃiŒ ŸhQ†™NdgøD 4œÈÒp"SÉl ŸhÁ†YNdn8‘½á-àp"‹Ã‰LŸh1‡NDu8ÙáŸhs‡‰QNdz˜ˆö0ña"êÉÌɦ!@œÈ1 b"ÄDDˆY!&"CLD‡˜ˆq"KÄD¤ˆ‰h'2FLD˜ˆ1=âD‰‰(‘$Nd“˜ˆ(1Ub"±Äiì&&¢L|¢…&&¢MLÄ? 'úY'þ$çWz>2}b"ʼn,ýÒßù$z_® )Nd¥˜ˆL1b"Bʼn,‘*&¢UœÈX1‘´brÅDôŠ,&¢XLD²8‘Íb¢·ýáZÔb"²Å‰ì.&¢\œÈt1íb"âÅDÔ‹O´ðÅDô‹‰Q0Nd˜ˆ†1‘ã4VŒ‰ÈÑ1&"dœÈ’1)c"ZƉŒQ3&"gLDÏ8‘Ac"ŠÆD$Ù4&"jLDÕ˜ˆ¬q"»ÆD„‰(‘6NDÛ˜†¸1uãDæ‰è8&¢p|¢…8&¢qLDä8‘•c"2ÇDtމ'²tLDꘈÖq"cÇDÔŽ‰ÈÑ;Ndð˜ˆâ1‘Èã46‰ˆ½ïoÔÂ'²{LDø˜ˆò1éãD¶‰ˆQ?Ndþ˜ˆþ1d" ȉL Ñ@&"‚|¢EA&"ƒLD™ˆr"JÈ4¤‰h!'2†Lôk£™ˆr"ƒÈD‘‰H"ÑDNd™ˆ*2YäDv‘‰#QF&"œÈ62qd"êȉÈ#Ó¼íO”dšýüðD&’‰h$INd%™ˆL2d"BÉ'Z¤d"RÉD´’‰ˆ%'²–LD.™ˆ^r"ƒÉD“‰H&ÑLNd4™Hj2 ÙäDt“i'QN&"œÈv2ñd"êɉÌ'ÑO& LCA9‘ e"ÊDD”‰¨('2£LDG™ˆr"KÊD¤”‰h) S>Í¢)‰S¦¡§œÈ 2Ee"’ÊD4•U&¢ªLDV9]eÂÊD?ÿ¸] Òʉl+W&¢®œÈ¼2ѯýqZ€e" ˉL,ÉX¦!²L$e9™e":ËD„–YZ&"µLDk™ˆØr"kËDâ–iè-ŸÈà2ÍÛþ6-ä2ÑÇþ6-è2Õe"²Ë‰ì.^&¢¼LDz9‘íe"áË4Ô—‰È/'²¿LD€™ˆs"ÌD4˜‰ˆ0IaNc†™hýýfˆ9‘%f"RÌD´˜‰ˆ1'²ÆLDŽ™ˆs"ƒÌD™‰H2Éd>Í‚2Qe&"ËLD—9‘af"ÊÌD¤™Ùf&ÎLC™H÷‡ëâN}\q'/}ìןÜÉCg¸.îÔ¥âN]*îdôÚ®‹;u©¸“—Îþp]Ü©¨¸“ÑïýẸSQq'£_ûÃuq'/}üõp}séâN\º¸“Ñk¸.îÔ¥âN]*îä¥õẸS‡Š;yéìןTÜ©KÅŒ^ûuq§.w2:ûuq§¢âNF¿÷7êâN} Š;u©¸“—Þ÷7êâN]*îdô{£.îä¥Ïý*îÔ¡âNúØß¨‹;u©¸“—‚;yés£.îÄÇ]ÜÉKÁºTÜ©KÅŒÎþF]Ü©¨¸“Ñïýº¸Sß‚âN]*îä¥ó×õí¥ýº¸SWÜÉK¯õº¸S‡ÞíoÔżô±¿QwêRq'£³¿QwêRq§.wòÒÇþF]ÜÉèm£.îdô¹¿Qwê[PÜÉK¯ýº¸—.î䥳¿Qwêã‚;u¨¸“‡^ûuq§.wòÒûþF]Ü©¨¸“Ñïýº¸S_xq§.w2zßߨ‹;w2zÛߨ‹;õ-(îÔ¥âN]*îä¥×_oÔw—‚;u¨¸“ÑYŸ¨‹;u¨¸S—Š;yéµ?QwêRq'£÷¿ž¨o£ý‰º¸_øÅ¼ôúë‰úöÒçþD]ÜÉè}¢.îTTÜ©/¼¸“—ÎþD]Ü©KźÜÉC¯ý…*îÔ‡wòÐÙ_¨‹;u©¸S—Š;y)¸S—Š;u©¸“ÑàN6ûuq§¾îâN^zíÔÅŠŠ;½ïÔźTÜ©Kżtöª¸‡.îÄ¡âN6¯ýº¸S—Š;yéìÔźTÜ©KżôÚ¨âN6oûû4¸S_tq§Îw2ú½?Nw**îÔþÿ¹>NwòÒÇþ8]Ü©KÁѲܙˆË‰¸Ü™ˆËy¹3—;q¹s"/w&ârg".w&ârçD\îLÃåÎD\îœÈˉ¸Ü™HËi¸Ü9‘—;q¹3—;'òrg".w&ârg".wNäåÎD\îLÄåÎD\îœÈˉ¸Ü™ˆËy¹3—;i¹3 —;ŸhYîl¤åÎFZîLÄåÎFZîl¤åÎFZîLÄåÎFXîl£åÎD\îl¤åÎFZîl¤åÎD\îl¤åÎFZîl¤åÎDïZîl¤åÎFZîLÄåÎFZîl¤åÎFZîLÄåÎFZîl¤åÎD\îl¤åÎFZîl„åÎ4\îl¤åÎFZîœÈË~^îüÉmæWê߉Ôèç9Ïq¹³‘–;i¹3—;ýúççíW#-w6Òrg".w6Òrg#-w6Òrg".w6Òrg#-w&ârg#,w¶Ñrg#-w&ârg#-w6Òrg".w6zÛ./w6úØ./w6Òrg#-w&ârg#-w6Òrg#-wNäåÎFZîl¤åÎFZîLÄåÎFZîl„åÎ4\îl¤åÎFZîl¤åÎD\îl¤åÎFZîLÄåÎFZîl¤åÎFZîLÄåÎFZîl¤åÎD\îl¤åÎFZîl¤åÎD\îl¤åÎFZîl¤åÎDZîl£åÎFZîLÄåÎFZîl¤åÎFZîœÈË´ÜÙHˉ¸ÜÙHË´ÜÙHˉ¸ÜÙHË´Ü™ˆË´ÜÙHË´Ü™ˆË´ÜÙËi¸ÜÙHË´ÜÙHˉ¸ÜÙHË´ÜÙHˉ¸ÜÙHË´Ü™ˆË´ÜÙHË´Ü™ˆË´ÜÙHËy¹³‘–;i¹³‘–;i¹³–;i¹3—;ýÚß(/w6Òrg".w6Òrg#-w6Òrg".w6Òrg#-w&ârg#-w6Òrg#-w&ârg#-w6Òrg"-w¶yÛŸ(.w¶ùÀöL".w6Òrg#-w&ârg#-w6Òrg#-wNäåÎFZîl¤åÎFZîLÄåÎFZîl¤åÎD\îl¤åÎFZîl¤åÎD\îl„åÎ6ZîL¤åÎ6Zîl¤åÎFZîLÄåÎFZîl¤åÎD\îl¤åÎFXîl£åÎD\îl¤åÎFZîl¤åÎD\îl¤åÎFZîLÄåÎFZîl¤åÎFXîœÆË°ÜÙFˉ¸ÜÙHË´ÜÙHˉ¸ÜÙHË´Ü™HËm´ÜÙèÇ9…ZîLÄåÎFZîl¤åÎD\îlôkœ¼ÜÙHˉ¸ÜÙËm´ÜÙËi¸ÜÙHË´Ü™ˆË´ÜÙHË´Ü™ˆË°ÜÙFËq¹³ÍÛþ6y¹³‘–;q¹³‘–;i¹3—;i¹³Ñûþ6y¹3—;a¹³–;i¹3—;i¹³‘–;q¹³‘–;i¹³–;Óp¹³Ñúûˉ¸ÜÙHË´ÜÙHˉ¸ÜÙHË´Ü™ˆË´ÜÙH˰Ü9—;i¹³‘–;i¹3—;i¹³‘–;q¹³–;Ûh¹³–;Óp¹³‘–;i¹3—;i¹³‘–;i¹3—;i¹³‘–;q¹³–;Ûh¹³‘–;q¹³‘–;i¹³‘–;q¹³‘–;a¹3 —;íg´ÜÙHËy¹³‘–;i¹3—;i¹³‘–;i¹3—;i¹³–;Óp¹³‘–;ý?¥êåÎD\îl¤åÎFZîLÄåÎFXîló¾¿N\îLÃåÎFZîl¤åÎFZîLÄåÎFZîl¤åÎD\îl¤åÎFZîl¤åÎDZîl£åÎFZî|¢»ÜÙ_õö¯–;ÿïÿ ÿ±âΉŒ;ŸhÁwNdÜ9‘qçŸhÃwNdÜ9‘qç-¸s"ãΉŒ;ŸhÁwNdÜ9‘qçwNcÜ9‘qç-¸s"ãΉˆ;§1î|¢wNdÜ9‘qç-¸s"ãΉމ;'2î|¢wNdÜ9‘qçDÆO´àΉŒ;'2î|¢wNdÜ9qç4Æ¢ w&"îLDÜ9‘qg"âÎDĉˆ;'2îL$Ü™†¸s"ãÎDĉˆ;wNdÜ™ˆ¸3qg"âΉŒ;w&"îœÈ¸3qg"âÎDÄw&"îLDÜ9‘qg"âÎDĉ„;§1îLDÜ™ˆ¸ó‰„;r›ù•?‹Ï/ÿØœˆ¸s"ãÎDĉˆ;'2îLôK3”ˆ¸3qçDƉˆ;w&"îœÈ¸3qg"âΉŒ; w¦!îLDÜ9‘qg"âÎDÄw&zÛ®w&"îœÈ¸3qg"âΉŒ;w&zß®w>Ñ‚;w&"îLDÜ9‘qg"âÎDÂÓw&"îLDÜ™ˆ¸s"ãÎDĉˆ;'2îLDÜ™ˆ¸3ÑçþF-¸3qg"âΉŒ;w&"îLDÜ9‘qg"âÎDĉˆ;'"îLCÜ™ˆ¸s"ãÎDĉˆ;w>Ñ‚;w&"îœÈ¸3qg"âÎDÄw&"îLDÜ9‘qg"âÎDĉˆ;'2îLDÜ™H¸sãÎDĉˆ;wNdÜ™ˆ¸3qg"âΉŒ;w&"îœÈ¸3qg"âÎDÄw&"îLDÜùD îLDÜ™ˆ¸3qçDÄiˆ;wNdÜ™è×þF-¸3qçDƉˆ;w&"îœÈ¸3qg"âΉŒ;w&"îLDÜ9‘qg"âÎDÄw¦yÛŸ(ãÎ4Äw&"îLDÜ9‘qg"âÎDĉˆ;ŸhÁ‰ˆ;w&"îœÈ¸3qg"âΉŒ;w&"îLDÜ9‘qg"áÎ4Äw¦!îLDÜ™ˆ¸s"ãÎDĉˆ;'2îLDÜ™H¸3 qçDƉˆ;w&"îœÈ¸3qg"âΉŒ;w&"îL$Üù4 îL$Ü™†¸s"ãÎDĉˆ;wNdÜ™ˆ¸3qçDÄiˆ;ýüw)ˆ;'2îLDÜ™ˆ¸s"ãÎD¿öÇiÁ‰ˆ;'2îL$Ü™†¸3‘pç4Ɖˆ;wNdÜ™ˆ¸3qg"âΉŒ; w¦!î|"ãÎ4oûÛ´àÎDÄw&"îLDÜ9‘qg"âÎDĉˆ;'2îL$Ü™†¸3qçDƉˆ;wNdÜ™ˆ¸3qg"áÎiŒ;­¿ßŒ;'2îLDÜ™ˆ¸3ѧøÌDƉˆ;wNdÜ™ˆ¸3qg"áΧYpg"âÎDĉˆ;'2îLDÜ™ˆ¸s"ãÎDÂiˆ; wNcÜ™ˆ¸3qçDƉˆ;w&"îœÈ¸3qg"âΉŒ; w¦!îLDÜ9‘qg"âÎDĉˆ;'2îLDÜ™H¸sãÎDûâÎDÄO´àÎDĉˆ;'2îLDÜ™ˆ¸3qçDƉˆ; wNcÜ™ˆ¸3ÑÿðSª îœÈ¸3qg"âΉŒ; w¦!îL$Ü9qg"âÎDĉˆ;'2îLDÜ™ˆ¸s"ãÎDĉˆ;wNDÜ™†¸3q矈¸óKôöo,çÿýaä÷ûWËùݼh¢ZÎïæE'º–—®åÔ¥ZN]ªåüùÒË©¨–óçûb9u©–—®åÄ¥k9Õr"º–SQ-§¢ZNEµœøÔrâеœ:TˉK×r*ªåÄÇÕrêÐg,']ˉK×rêR-'.]ˉK×rêR-§¢ZN|ܵœ¸t-§.ÕrêR-'.]ˉK×r*ªåDt-§¢ZNE±œjj9þ|±œ?_úb9½þÙ?®–S—j9y)–“—b9u©–S—b9y(–S‡j9u©–“Q,'?.–S—j9u©–“—b9y)–SQ-'£üa˜Q,§¢ZNF±œúÔròR,§¢ZNFïëõÅrê ¯åÔ¥ZN^Šå䥱œ:TË©Cµœ¼Ëùß—~`šó+/ðÄ×p-'¾†k9y)–S—j9u©–“Q,§¢ZNF¿æ/‚½¯×Ë©oA-§.ÕròR,'/}î×µœú¸ZN^úØ®k9u)–“‡Îþp]Ë©KµœºTËÉèµ?\×rêR-'/ýẖSQ-'£ßûÃu-§¢ZNF¿ö‡ëZN^úøëáúæÒµœ¸t-'£×þp]Ë©KµœºTËÉKëÃu-§ÕròÒùñáúÅrêR-§.Õr2zíoÔµœºTËÉèìoÔµœŠj9ýÞߨk9õ-¨åÔ¥ZN^zßߨk9u©–“Ñïýº–“—>÷7ª–S‡j9yèc£®åÔ¥ZN^Šåä¥Ïýº–w-'/ÅrêR-§.Õr2:ûu-§¢ZNF¿÷7êZN} j9u©–“—Î_oÔ·—>ö7êZN}\-'/½Ö7êZNªåä¥÷ýº–S—j9u©–“ÑÙߨk9u©–S—j9yéc£®ådô¶¿Q×r2úÜߨk9õ-¨åä¥×þF]ˉK×ròÒÙߨk9õq±œ:TËÉC¯ýº–S—j9yé}£®åTTËÉè÷þF]Ë©/¼–S—j9½ïoÔµœŠj9½íoÔµœú¼îoÔµœºTËÉK¯¿Þ¨ï.ÅrêP-'£³>Q×rêP-§.ÕròÒk¢®åÔ¥ZNFï=QßFûu-'¾ðk9yéõ×õí¥Ïý‰º–“ÑûþD]Ë©¨–S_x-'/ý‰º–S—j9u)–“‡^û UË©«å䡳¿P×rêR-§.ÕròR,§.ÕrêR-'£±œl>öêZN}ݵœ¼ôÚ¨k9Õr2zߨk9u©–S—j9yéìT-']ˉCµœl^ûu-§.ÕròÒÙ¨k9u©–S—j9yéµ?PµœlÞö÷i,§¾èZN©ådô{œ®åTTË©/¼–“—Þ÷ÇéZN]ªåÔ¥XN:=Nßúüg{À®ådô¾?N×rêR-§.ÕròÒÙ§k9u©–“Ñïõqº–Q-'›·ýmº–߀k9u©–“Q,'£×þ6]Ë©/¼–“—Þ÷·éZN]ªåÔ¥XN:ûãt-§>­–S—j9yécœ®åÔ¥ZN^:ûãTË©æüÚ§±œ,b9Õrê¿–“—Îþ8]Ë©¨–“Ñïýqº–S—j9u©–“—Þ÷ש–‡®åÄ¡k9yéµÿåÀµœú¸ZN]ªåä¥ýuº–“ÑÛú:]ËÉès}>j9½ï¯ÓµœºTË©Kµœ¼tö×éZN}\-§.ÕròÒk®åÔ¥XNzÿëuúöÐÇ?‹øb9ýÞ_§k9yés®åÔ¥¿|õÛKëët-'£ýÌÙ_§k9ñE_ˉK×ròÒÇþ:]ËÉèm®åä¥Ïýuº–S—j9yéµ¾N×rêP-'/ý?¥z-§>®–S—j9y鵿N×rêR,'½ï¯S-§šZNFÿŒê·ÑÙ_§k9õ ¨åÔ¥ZN^úØ_§k9õqµœ¼tö×éZN]ŠåÔ¡ZNz­¯ÓËùó¥/–ó¿/}g9ßÿóß¾ÍrNdËùD‹åœÈ–s"[Ήl9ÿD›åœÈ–s"[Ήl9Ÿh±œÙrNdËùD‹åœÈ–s"[Ήl9ŸÈ–s[Ήl9Ÿh±œÙrNDË9-ç-–s"[Ήl9Ÿh±œÙrNdË9‘-ç-–s"[Ήl9'²å|¢ÅrNdË9‘-ç-–s"[Ήh9§±åüm–3-g"ZΉl9Ñr&¢åLDË9‘-g"YÎ4´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åL$Ë9-g¢Ÿ-çOL3¿ògàÙh±œ‰h9ñOɉh9'²åLDË™ˆ–s"[ÎD¿ôA‰h9ÑrNdË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3‘,gZÎD´œZÎD´œ‰h9'²åLô¶?\‹åLDË9‘-g"ZÎD´œÙr&¢åLDË™ˆ–ó‰Ë™ˆ–3-g"ZΉl9Ñr&’åœÆ–3-g"ZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–s"[ÎD´œ‰Þ÷7j±œÙr&¢åLDË™ˆ–s"ZÎ4´œ‰h9'²åLDË™ˆ–3-ç-–3-g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰d9§±åLDË™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD´œO´XÎD´œ‰h9ÑrNDË™†–3-çD¶œ‰~íoÔb9ÑrNdË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œZÎD´œ‰h9'¢åLó¶?Q¶œih9'²åLDË™ˆ–s"[ÎD´œ‰Þõó^‰h9Ÿh±œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9‘-g"YÎ4´œÑr¦¡åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™H–3 -çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åL$Ëù4‹åL$Ë™†–s"[ÎD´œ‰h9ÑrNdË™ˆ–3-çD´œih9ýüv)h9'²åLDË™ˆ–s"[ÎD¿öÇi±œ‰h9'²åL$Ë™†–3‘,ç4¶œ‰h9ÑrNdË™ˆ–3-g"ZΉl9Ér¦¡å|"[Î4oûÛ´XÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9'²åL$Ë™†–3-çD¶œ‰h9ÑrNdË™ˆ–3-g"YÎil9­¿ßl9'²åLDË™ˆ–3-çD¶œ‰h9ÑrNdË™ˆ–3Ñûþ:Ùr>Íb9Ñr&¢åLDË9‘-g"ZÎD´œÙr&’åLCË™H–s[ÎD´œ‰h9'²åLDË™ˆ–3-çD¶œ‰h9ÑrNdË™H–3 -g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD²œÓØr&ÚÏÐr&¢å|¢År&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™H–s[ÎD´œ‰þ‡ŸR],çD¶œ‰h9ÑrNdË™H–3 -g"YÎil9Ñr&¢åLDË9‘-g"ZÎD´œÙr&¢åLDË™ˆ–s"ZÎ4´œ‰h9ÿD›åLôö¯,çÿýïŸóÕr~7ù™¨–ó»ñЉ®åÄ¥k9u©–S—j9¾ôÅr*ªåüùã¾XN]ªåÄ¥k9qéZNEµœˆ®åTTË©¨–SQ-'¾µœ8t-§ÕrâÒµœŠj9ñqµœ:TˉC×râÒµœºTˉK×râÒµœºTË©¨–w-'.]Ë©KµœºTˉK×râÒµœŠj9]Ë©¨–SÑùg?TËùówà‹åüùÒËÉèõÏþqµœºTËÉKçŸíwïË©KµœºËÉC±œ:TË©KµœŒb9ùq±œºTË©Kµœ¼ËÉK±œŠj9åÃŒ>°tŸ¨–“Q,§¾µœ¼Ë©¨–“ÑûúF}±œúÂk9u©–“—b9yéóŸõ7f-çú‰iæWxò|,'¾Îk9Årâã®åä¥XN]ªåÔ¥ZNF±œŠj9ýš¿bô¾>\_,§¾µœºTËÉK±œ¼ô¹?\×rêãj9yéc¸®åÔ¥XN:ûÃu-§.ÕrêR-'£×þp]Ë©Kµœ¼tö‡ëZNEµœŒ~ï×µœŠj9ýÚ®k9yé㯇ë›K×râÒµœŒ^ûÃu-§.ÕrêR-'/}¬×µœ:TËÉKg£®åÔ¥ZN]ªådôÚߨk9u©–“ÑÙߨk9Õr2ú½¿Q×rê[PË©Kµœ¼ô¾¿Q×rêR-'£ßûu-'/}îoT-§ÕròÐÇþF]Ë©Kµœ¼ËÉKŸûu-'>îZN^ŠåÔ¥ZN]ªådtö7êZNEµœŒ~ïoÔµœúÔrêR-'/¿Þ¨o/}ìoÔµœú¸ZN^z­oÔµœ:TËÉKïûu-§.ÕrêR-'£³¿Q×rêR-§.ÕròÒÇþF]ËÉèm£®ådô¹¿Q×rê[PËÉK¯ýº–—®å䥳¿Q×rêãb9u¨–“‡^ûu-§.ÕròÒûþF]Ë©¨–“Ñïýº–S_x-§.Õr2zßߨk9Õr2zÛߨk9õ-¨åÔ¥ZN]ªåä¥×_oÔw—b9u¨–“ÑYŸ¨k9u¨–S—j9yéµ?Q×rêR-'£÷¿ž¨o£ý‰º–_øµœ¼ôúë‰úöÒçþD]ËÉè}¢®åTTË©/¼–“—ÎþD]Ë©KµœºËÉC¯ý…ªåÔ‡ÕròÐÙ_¨k9u©–S—j9y)–S—j9u©–“ÑXN6ûu-§¾îZN^zíÔµœŠj9½ïÔµœºTË©Kµœ¼töª–‡®åÄ¡ZN6¯ýº–S—j9yéìÔµœºTË©Kµœ¼ôÚ¨ZN6oûû4–S_t-§ÎÔr2ú½?N×r*ªåÔ^ËÉKïûãt-§.ÕrêR,'¿§o}þ³=`×r2zß§k9u©–S—j9yéìÓµœºTËÉè÷ú8]ˉ¨–“ÍÛþ6]ˉoÀµœºTËÉ(–“Ñk›®åÔ^ËÉKïûÛt-§.ÕrêR,'ýqº–SŸVË©Kµœ¼ô±?N×rêR-'/ýqªåTSËÉhýýVË©¨–Sÿøµœ¼töÇéZNEµœŒ~ïÓµœºTË©Kµœ¼ô¾¿Nµœ8t-']ËÉK¯ý/®åÔÇÕrêR-'/}ì¯ÓµœŒÞÖ×éZNFŸëëôQËÉè}®åÔ¥ZN]ªå䥳¿N×rêãj9u©–“—^ûët-§.ÅròÐû_¯Ó·‡>þÙXÄËÉè÷þ:]ËÉKŸûët-§.}üýã«ß^úX_§k9ígÎþ:]ˉ/úZN\º–“—>ö×éZNFoûët-'/}î¯ÓµœºTËÉK¯õuº–S‡j9yéø)Õk9õqµœºTËÉK¯ýuº–S—b9yè}j9ÕÔr2úûgT¿Îþ:]Ë©o@-§.ÕròÒÇþ:]Ë©«å䥳¿N×rêR,§ÕròÐk}¾XΟ/}±œÿ}éËùÿ3\_Œ˜¾ebºT)ÆKÁb¼ô¹?\—ŒéãªÆxéc¸®Ó¥ð1:ûÃu™.Õ‘éR)£×þp]P¦K5e¼tö‡ëÊ2EÅeŒ~ï×%fŠªÌýÚ®kÍxé㯇ë›KWœáÒEgŒ^ûÃué™.UŸéR/}¬oÔeh:T‰ÆKg£®GÓ¥’4]ªJcôÚߨkÓt©<ÑÙߨ‹ÔÕ©1ú½¿QW«é[P°¦K5k¼ô¾¿QW®éRñ£ßûu /}îoT!›Õ²ñÐÇþF]ѦKEm¼ׯKŸûuu>î7^ŠqÓ¥27]ªtctö7êz7E%oŒ~ïoÔ…oúÔ¾éRù/¿Þ¨o/}ìoÔupú¸R8^z­oÔq:TÇKïûueœ.ÇéR}£³¿QWÉéR¡œ.ÕÊñÒÇþF]1Çèm£®›cô¹¿QWÏé[P@ÇK¯ýºŒ—®¤ã¥³¿Q×ÓéãBêt¨ªŽ‡^ûum.•×ñÒûþF]d§¨ÎŽÑïýºÚN_xÁ.ÕÜ1zßߨ+ïß1zÛߨKðô-¨ÂÓ¥B<]ªÅã¥×_oÔw—"òt¨(ÑYŸ¨Kót¨:O— ôxéµ?Q—ééR¥£÷¿ž¨o£ý‰ºd_øU{¼ôúë‰úöÒçþD]¾Çè}¢.âSTǧ/¼”—ÎþD]ЧK5}ºÖÇC¯ý…*îÓ‡Õ÷ñÐÙ_¨«üt©ÐO—jýx)ÜO—*þt©èѸ?6ûuõŸ¾î@^zíÔe€Š*½ïÔõ€ºT¨KU¼töª6‡.Ä¡ A6¯ýºNP—JyéìÔƒºT3¨Keƒ¼ôÚ¨âA6oûû4„P_t¡Î2ú½?N—*ª(Ô^TÈKïûãti¡.UêR€!¿§o}þ³=`W2zß§ë u©äP—ªyéìÓµ‡ºT~Èè÷ú8]„ˆ¨‘ÍÛþ6]ˆoÀ‰ºT“È(,‘Ñk›.NÔ^ŸÈKïûÛt•¢.*êR¬"ýqºbQŸV´¨Ku‹¼ô±?NW/êR#/ýq*cTSÉÈhýýVϨ¨¤QÿøU¼töÇéÚFEåŒ~ïÓEŽºTç¨K¥Ž¼ô¾¿N8tÍ#]öÈK¯ý/.~ÔÇÕ?êR $/}ì¯Ó…ŒÞÖ×érHFŸëëôQÉè}.Ô¥êH]*䥳¿N—Iêã*%u©X’—^ûëtɤ.EMòÐû_¯Ó·‡>þÙXÄ>Éè÷þ:]DÉKŸûët)¥.}üýã«ß^úX_§k*ígÎþ:]\‰/úúJ\ºÄ’—>ö×éBKFoûët¹%/}î¯ÓE—ºTwÉK¯õuºúR‡ 0yéø)ÕË0õq•˜ºTŒÉK¯ýuº$S—¢2yè}j3Õ”g2úûgT¿Îþ:]§©o@©¦.UkòÒÇþ:]³©+Û䥳¿NoêRü¦•pòÐk}¾@Ο/}±œÿ}éËùŸ¿Àý½MÝ%âÚÝD¼KÄÍ»Dœ½KÄå»'ZÆïqÿ.'ðqo"á%â^"ÎáMäE¼DÅKÄ]¼DŸšÆ›ˆëxi8—ˆyy&/—òi,/ ÷ò&òd^"®æ%âpÞDÞÎKÄù¼D\ÐKĽ‰¼£—ˆSz‰¸¦—ˆƒzyS/gõqYo"ë%â¾^"Mì¥áÊÞ-C{´µ×Hs{‰¸¸×H£{´»×HÓ{‰¸¾×|m´Á—ˆ3|´Ä×Hc|´Ç—ˆ“|´Ê×HÃ|´Í—ˆó|´Ð×H#}‰¸Ó×HS}´Ö×Hƒ}‰¸Ù×H³}´Ü—ã}?0ÍþJú5úy×ïK„¿4òk¤-¿Fšó›È‹~4ê×Hÿ¦¢FšöKÄu¿Føk¤¿Dœùkô럟ÿ[4ö×H{‰8ù×H«4ü×HÛ‰8ÿ×H €4˜ˆ;€0ØFk€4˜ˆ›€4 ØHË€‰8Øèm¸<ØH+‰8ØH[4˜ˆ‹4ØH»48‘×i@°‘6iF0—iL°öÓpR°‘ViX°Ñ'þU‰8/ØH ƒ42˜ˆ;ƒ45ØHkƒ48˜ˆ›ƒ4;ØH˃‰8>ØHûƒ4AØH+„‰8DØH[„4GØH‹„‰þóŸÛ!î6Ò4a"®6Ò@a#m6ÒLáD^*l¤±ÂFÚ+LÄÉÂFZ-l¤áÂFÚ.LÄùÂFZ0l¤ÃDÜ1l¤)ÃFZ3l¤AÃDÜ4l¤YÃFX6LÃqÃF¿ö7ʇ´r˜ˆC‡´uØHs‡´x˜ˆ£‡´{ØHÓ‡‰¸~ØHˆ´ØH3ˆ‰¸„ØHcˆ´‡8‘'i±‘†i1‘æÛh!±‘Fq'±Ñ¯ýòZb# &&âfb#Í&6Òrb#'&â~b#M(6ÒŠb")6Ò–b#Í)6úÜß(*6Ò®b#M+&Òºb›·ý‰âÆbÍ,&âÒb#-6ÒÞb"N.6Òêb# /6ÒöâDž_l¤ÆFal¤ÆDœbl¤5ÆFdLÄMÆFšel¤eÆFgLÄ}ÆF˜hl£•ÆDjl£­ÆFškl¤ÅÆDml¤ÝÆFšnLÄõÆFpl„ Ç6šqLÄ%ÇFsl¤=ÇFštLôŸÿ\ÿ[ÀaÇFÚvLÄyÇFZxl¤‘ÇFØyœÆS°öØFƒ‰¸ùØH³´üØH㉸ÿØH´™HCm´ÙèÇ„Z„LÄQÈFÚ…l¤iÈD\‡lôkœ¼ÙH3‘‰¸Ùc‘m´Ù“‘i¸ÙHÑ´™ˆó‘´ ÙH#’>÷ÇÉS’°&ÙFƒ’qS²ÍÛþ6yY²‘Æ%q_²‘&&ie2‡&ik²‘æ&iq2G'aw²¦'i}2(iƒ²‘f(q‰²‘Æ(i²&)Óp•²ÑúûÛ”‰8OÙH •4RÙH;•‰8UÙHk•4X™ˆ›•4[ÙHË•0^9÷+i²‘V,iÈ2·,iβ‘-qÔ²v-ÛhÚ²Ö-Óp಑6.iæ2—.i첑ö.iò2W/iø²‘¶/qþ²0Ûh³‘v0q ³‘Ö0i³‘61ýß®¯“—1a3 ÷1íg´’ÙHC™y+³‘æ2i13G3i7³‘¦3i=34iC³f4ÓpI³‘Æ4ý?¥êIÍD\Õl¤aÍFÚÖLÄyÍFXØl£‘ÍFØÙLéÍFZÛl¤ÁÍFÚÜLÄÙÍFZÞl¤ñÍDÜßl¤ ÎFZálË©KÚâl£9ÎFZä|¢e”³ÑÛ¿ÙåüøãÒ6Ë9‘-ç-–s"[Ήl9'²åüm–s"[Ήl9'²å|¢ÅrNdË9‘-ç-–s"[Ήl9'²å|"[Îil9'²å|¢ÅrNdË9-ç4¶œO´XΉl9'²å|¢ÅrNdË9‘-çD¶œO´XΉl9'²åœÈ–ó‰>l9'²åœÈ–ó‰Ë9‘-çD´œÓØrþ‰6Ë™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3‘,gZΉl9Ñr&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™ˆ–3ÑÏ–ó'¦9¿ÀóKDË™ˆ–3‘,ç4¶œ‰h9Ñr>Ñb9Ñr&⟒ÑrNdË™ˆ–3-çD¶œ‰~é/‚Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË9‘-g"YÎ4´œ‰h9'²åLDË™ˆ–s"[ÎDoûõXÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9Ÿh±œ‰h9Ñr&¢åœÈ–3-g"YÎil9Ñr&¢åLDË9‘-g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™ˆ–3-çD¶œ‰h9Ñr&¢åœè?£¹²åLDË9‘-g"ZÎD´œ‰h9Ÿh±œ‰h9ÑrNdË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åL$Ë9-g¢_ûµXÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™ˆ–3-çD¶œ‰h9Ñr>Ñb9Ñr&:ûµXΉh9ÓÐr&¢åœÈ–3ѯýZ,g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'¢åLó¶?Q¶œih9'²åLDË™ˆ–s"[ÎD´œ‰h9Ñr>Ñb9Ñr&¢åLDË9‘-g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD²œih9'¢åLCË™ˆ–3-çD¶œ‰h9ÑrNdË™ˆ–3‘,gZΉl9Ñr&¢åLDË9Ñþ¸½þ·À–3-çD¶œ‰h9Ñr&’å|šÅr&’åLCË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–s"ZÎ4´œ‰~þ»´œÙr&¢åLDË9‘-g¢_ûã´XÎD´œÙr&’åLCË™H–s[ÎD´œ‰h9'²åLDË™ˆ–3-çD¶œ‰d9ÓÐr>‘-gš·ýmZ,g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&’åLCË™ˆ–s"[ÎD´œ‰h9'²åLDË™ˆ–3‘,ç4¶œ‰Ößo¶œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™ˆ–3‘,çÓ,–3-g"ZÎD´œÙr&¢åLDË9‘-g"YÎ4´œ‰d9§±åLDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™ˆ–3-çD¶œ‰d9ÓÐr&¢åœÈ–3-g"ZÎD´œÙr&¢åL$Ë9-g¢ý -g"ZÎ'Z,g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰d9§±åLDË™èø)ÕÅrNdË™ˆ–3-çD¶œ‰d9ÓÐr&’åœÆ–3-g"ZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9'¢åLCË™ˆ–óO´YÎDoÿÊrþù‘¢ÍrNdËùD‹åœÈ–s"[Ήl9ÿD›åœÈ–s"[Ήl9Ÿh±œÙrNdËùD‹åœÈ–s"[Ήl9ŸÈ–s[Ήl9Ÿh±œÙrNtþúßVß²å|¢ÅrNdË9‘-ç-–s"[Ήl9'²å|¢ÅrNdË9‘-çD¶œO´XΉl9'²å|¢ÅrNdË9-ç4¶œ¢Ír&¢åLDË9‘-g"ZÎD´œ‰h9'²åL$Ë™†–s"[ÎD´œ‰h9ÑrNdË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&úÙrþÄ4ó+9Ö9‘-g"ZÎD´œ‰d9§±åLDË™ˆ–ó‰Ë™ˆ–3ÿ”œˆ–s"[ÎD´œ‰h9'²åLôK”ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ér¦¡åLDË9‘-g"ZÎD´œÙr&zÛ®År&¢åœÈ–3-g"ZΉl9Ñr&¢åLDËùD‹åLDË™ˆ–3-çD¶œ‰h9ÉrNcË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–3-çD´œih9ÑrNdË™ˆ–3-g¢ÏýZ,g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™ˆ–3-çD¶œ‰h9ÉrNcË™ˆ–3-g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9Ÿh±œ‰h9ýZ,çD´œih9ÑrNdË™è×þF-–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD´œÑr¦yÛŸ([Î4´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9Ÿh±œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9‘-g"YÎ4´œÑr¦¡åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™H–3 -çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åL$Ëù4‹åL$Ë™†–s"[ÎD´œ‰h9ÑrNdË™ˆ–3-çD´œih9ýüv)h9'²åLDË™ˆ–s"[ÎD¿öÇi±œ‰h9'²åL$Ë™†–3‘,ç4¶œ‰h9ÑrNdË™ˆ–3-g"ZΉl9Ér¦¡å|"[Î4oûÛ´XÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9'²åL$Ë™†–3-çD¶œ‰h9ÑrNdË™ˆ–3-g"YÎil9­¿ßl9'²åLDË™ˆ–3-çD¶œ‰h9ÑrNdË™ˆ–3-g"YΧY,g"ZÎD´œ‰h9'²åLDË™ˆ–s"[ÎD²œih9}®¯Ó‡-g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åL$Ë™†–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"YÎil9ígh9Ñr>Ñb9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åL$Ë9-g"ZÎDÿÃO©.–s"[ÎD´œ‰h9'²åL$Ë™†–3‘,ç4¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9-gZÎD´œ¢Ír&zû7–ó??Îùë«å<ÿaˆNTË™èë9ѵœ¸t-§.ÕrêR-çÏ—¾XNEµœ?ÜË©Kµœ¸t-'.]Ë©¨–ѵœŠj9Õr*ªåÄ· –‡®åÔ¡ZN\º–SQ-'>®–S‡j9qèZN\º–S—j9qéZN\º–S—j9Õrâã®åÄ¥k9u©–S—j9qéZN\º–SQ-'¢k9Õr*ŠåTSËùówà‹åüùÒËÉ(ÖÇÕrêR-'/ÅròR,§.ÕrêR,'ÅrêP-§.Õr2ŠåäÇÅrêR-§.ÕròR,'/År*ªåd”? 3ŠåTTËÉ(–Sß‚ZN^úœÿK¹¢ZÎÿŽ~`šý•ïëÃõÅr꟦–S—j9y)–“—ÆrêP-§ÕròR,'.]ËÉ(–w-'/ÅrêR-§.Õr2ŠåTTËÉè×üE£÷õáúb9õ-¨åÔ¥ZN^Šåä¥ÏýẖSWËÉKûÃu-§.ÅròÐÙ®k9u©–S—j9½ö‡ëZN]ªå䥳?\×r*ªådô{¸®åTTËÉè×þp]ËÉK=\ß\º–—®ådôÚߨk9u©–S—j9yéc}£®åÔ¡ZN^:ûu-§.ÕrêR-'£×þF]Ë©KµœŒÎþF]Ë©¨–“Ñïýº–Sß‚ZN]ªåä¥÷ýº–S—j9ýÞߨk9yés£j9u¨–“‡>ö7êZN]ªåä¥XN^úÜߨk9ñq×ròR,§.ÕrêR-'£³¿Q×r*ªådô{£®åÔ· –S—j9yéüõF}{éc£®åÔÇÕròÒk}£®åÔ¡ZN^zßߨk9u©–S—j9ýº–S—j9u©–“—>ö7êZNFoûu-'£Ïýº–Sß‚ZN^zíoÔµœ¸t-'/ýº–SË©Cµœ<ôÚߨk9u©–“—Þ÷7êZNEµœŒ~ïoÔµœúÂk9u©–“ÑûþF]Ë©¨–“ÑÛþF]Ë©oA-§.ÕrêR-'/½þz£¾»Ë©CµœŒÎúD]Ë©CµœºTËÉK¯ý‰º–S—j9½ÿõD}}ìOÔµœøÂ¯åä¥×_OÔ·—>÷'êZNFïûu-§¢ZN}ᵜ¼tö'êZN]ªåÔ¥XNzí/T-§>¬–“‡ÎþB]Ë©KµœºTËÉK±œºTË©KµœŒÆr²ùبk9õu×ròÒk ®åTTËÉè} ®åÔ¥ZN]ªå䥳?Pµœ8t-'Õr²yíÔµœºTËÉKg ®åÔ¥ZN]ªåä¥×þ@Õr²yÛß§±œú¢k9u¦–“Ñïýqº–SQ-§¾ðZN^zß§k9u©–S—b9yèüõ8}{èóŸí»–“Ñûþ8]Ë©KµœºTËÉKgœ®åÔ¥Ï_ûãTËÉæµ?NµœlÞö·éZN|®åÔ¥ZNF±œŒ^ûÛt-§¾ðZN^zßߦk9u©–S—b9yèìÓµœú´ZN]ªåä¥ýqº–S—j9yéìS-§šZNFëï·ZNEµœúǯå䥳?N×r*ªådô{œ®åÔ¥ZN]ªåä¥÷ýuªåÄ¡k9qèZN^zí9p-§>®–S—j9yéc®ådô¶¾N×r2ú\_§ZNFïûët-§.ÕrêR-'/ýuº–SWË©Kµœ¼ôÚ_§k9u)–“‡Þÿz¾=ôñÏÆ"¾XNF¿÷×éZN^úÜ_§k9uéãï_ýöÒÇú:]ËÉh?sö×éZN|Ñ×râÒµœ¼ô±¿N×r2zÛ_§k9yés®åÔ¥ZN^z­¯Óµœ:TËÉKÿÃO©^Ë©«åÔ¥ZN^zí¯ÓµœºËÉCïûëTË©¦–“Ñß?£úmËÉès®åÔ¥ZN^úØ_§k9õqµœ¼tö×éZN]úüµ¾N×ròÐk}¾XΟ/}±œÿ}é;Ëùç/è—]ÎDÜåœÈ»œ‰~i—3w9q—ó‰–]ÎDÜåLÄ]ÎDÜåœÈ»œ‰¸Ë™ˆ»œy—3w9q—3w9'â.gîr&â.çDÞåLÄ]ÎDÚåLÃ]Ή¼Ë™ˆ»œ‰¸Ë9‘w9q—3w9q—s"ïr&â.g"îr&â.çDÞåLÄ]ÎDÜåœÈ»œ‰¸Ë™H»œi¸ËùDË.g#ír6Ò.g"îr6Ò.g#ír6Ò.g"îr6Â.gír&â.g#ír6Ò.g#ír&â.g#ír6Ò.g#ír&â.g#ír6Ò.g"îr6Ò.g#ír6úüq—ó'¦9¿’c~ëüi—3w9i—³‘v9a—3ͧv9i—³‘v9'ò.g#ír6Ò¿ñ¨‘v9q—³‘v9i—3w9ýúçç©W#ír6Ò.g"îr6Ò.g#ír6Ò.g"îr6Ò.g#ír&â.g#ìr¶Ñ.g#ír&â.g#ír6Ò.g"îr6zÛ.ïr6Ò.g"îr6Ò.g#ír&â.g£_ûÃå]ÎFÚåœÈ»œ´ËÙH»œ´Ë™ˆ»œ´ËÙ»œi¸ËÙH»œ´ËÙH»œ‰¸ËÙH»œ´Ë™ˆ»œ´ËÙèìo”w9q—³‘v9i—3w9i—³‘v9i—3w9i—³‘v9i—3‘v9Ûh—³‘v9q—³‘v9i—³ÑçþFy—³‘v9i—3w9i—³‘v9i—3w9i—³‘v9q—³‘v9i—³‘v9q—³‘v9a—3 w9i—³‘v9i—3w9i—³‘v9i—3w9i—³‘v9q—³‘v9i—³‘v9}j—³‘v9i—s"ïr6Ò.g#ír6Ò.g"ír¶Ñ.g#ír&â.g£_ûå]ÎFÚåLÄ]ÎFÚål¤]ÎFÚåLÄ]ÎFÚål¤]ÎDÜål¤]ÎFÚål¤]ÎDÜål¤]ÎFÚåL¤]Î6oûÅ]Î6ÚåLÄ]ÎFÚål¤]ÎDÜål¤]ÎFÚål¤]Ή¼ËÙH»œ´ËÙH»œ‰¸ËÙH»œ´Ë™ˆ»œ´ËÙH»œ´Ë™ˆ»œ°ËÙF»œ‰´ËÙF»œÎþBy—3w9i—³‘v9q—³‘v9a—³v9q—³‘v9i—³‘v9q—³‘v9i—3w9i—³‘v9a—sïr6Â.gír&â.g#ír6Ò.g#ír&â.g#ír6Ò.g"ír¶Ñ.g£ÇZh—3w9i—³‘v9q—³Ñ¯ýqò.g#ír&â.g#ìr¶Ñ.g#ìr¦á.g#ír6Ò.g"îr6Ò.g#ír6Ò.g¢Oír6Â.gírNÄ]Î6oûÛä]ÎFÚåLÄ]ÎFÚål¤]ÎDÜålôk›¼ËÙH»œ‰¸ËÙ»œm´ËÙH»œ‰¸ËÙH»œ´Ë™ˆ»œ´ËÙH»œ°Ë™†»œÖßoÜåLÄ]ÎFÚåltöÇÉ»œ‰¸ËÙH»œ´Ë™ˆ»œ´ËÙH»œ°Ë9w9i—³‘v9i—3w9i—³‘v9q—³v9Ûh—³v9Óp—³‘v9i—3w9i—³‘v9i—3w9i—³‘v9q—³v9Ûh—³‘v9q—³‘v9i—³‘v9q—³‘v9a—3 w9íg´ËÙH»œy—³‘v9i—3w9i—³‘v9i—3w9i—³v9Óp—³‘v9ý?¥ê]ÎDÜål¤]ÎFÚåLÄ]ÎF¿Ö×É»œ°Ë™†»œ´ËÙH»œ´Ë™ˆ»œ´ËÙH»œ‰¸ËÙH»œ´ËÙH»œ‰>±ËÙF»œ´ËùDË.g£·µËùço–s"[Î'Z,çD¶œÙrNdËù'Ú,çD¶œÙrNdËùD‹åœÈ–s"[Î'Z,çD¶œÙrNdËùD¶œÓØrNdËùD‹åœÈ–s"ZÎil9Ÿh±œÙrNdËùD‹åœÈ–s"[Ήl9Ÿh±œÙrNdË9‘-ç-–s"[Ήl9Ÿh±œÙrNDË9-çŸh³œ‰h9ÑrNdË™ˆ–3ÑÑ'¢åœÈ–3‘,gZΉl9Ñr&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–s"[ÎD´œ‰~¶œ?1ÍüÊŸçl9Ñr&¢åœÈ–3-g"ZÎD²œÓØr&¢åLDËùD‹åLDË™ˆJNDË9‘-g"ZÎD´œÙr&ú¥¿JDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™ˆ–3-çD¶œ‰d9ÓÐr&¢åœÈ–3-g"ZΉl9½í×b9ÑrNdË™ˆ–3-çD¶œ‰h9Ñr&¢å|¢År&¢åLDË™ˆ–s"[ÎD´œ‰d9§±åLDË™ˆ–3-çD¶œ‰h9ÑrNdË™ˆ–3ÑÙߨÅrNdË™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZÎD´œÑr¦¡åLDË9‘-g"ZÎD´œ‰h9Ÿh±œ‰h9ÑrNdË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åL$Ë9-g"ZÎD´œ‰h9'²åLDË™ˆ–3ÑçþF-–3-g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD´œO´XÎD´œ‰h9ÑrNDË™†–3-çD¶œ‰~íoÔb9ÑrNdË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË9-gš·ý‰²åLCË9‘-g"ZÎD´œÙr&¢åLDË™ˆ–ó‰Ë™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&’åLCË9-gZÎDg¡Ë9‘-g"ZÎD´œÙr&¢åL$Ë™†–s"[ÎD´œ‰h9ÑrNdË™ˆ–3-çD¶œ‰h9Ñr&ú\¨År&’åLCË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–s"ZÎ4´œ‰~þ»´œÙr&¢åLDË9‘-g¢_ûã´XÎD´œÙr&’åLCË™H–s[ÎD´œ‰h9'²åLDË™ˆ–3-çD¶œ‰d9ÓÐr>‘-gš·ýmZ,g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&’åLCË™ˆ–s"[ÎD´œ‰h9'²åLDË™ˆ–3‘,ç4¶œ‰Ößo¶œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™ˆ–3‘,çÓ,–3-g"ZÎD´œÙr&¢åLDË9‘-g"YÎ4´œ‰d9§±åLDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™ˆ–3-çD¶œ‰d9ÓÐr&¢åœÈ–3-g"ZÎD´œÙr&¢åL$Ë9-g¢ý -g¢ÏýuZ,g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰d9§±åLDË™èø)ÕÅrNdË™ˆ–3-çD¶œ‰d9ÓÐr&’åœÆ–3-g"ZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9'¢åLCË™ˆ–óO´YÎDoÿÂr¾ý_ýÿ¯_,ç7“Ÿj9¿Mt-'.]Ë©KµœºTËùó¥/–SQ-çÏ÷ÅrêR-'.]ˉK×r*ªåDt-§¢ZNEµœŠj9ñ-¨åÄ¡k9u¨–—®åTTˉ«åÔ¡ZNº–—®åÔ¥ZN\º–—®åÔ¥ZNEµœø¸k9qéZN]ªåÔ¥ZN\º–—®åTTˉèZNEµœŠb9ÕÔrþüøb9¾ôÅr2zý³\-§.ÕròÒùgûÝûÅrêR-§.ÅròP,§ÕrêR-'£XN~\,§.ÕrêR-'/ÅròR,§¢ZNFùÃ0£Ÿ—îÕr2ŠåüïoÁ÷LóþÊOžåTTËÉè}}¸¾XNý´–S—j9y)–“—ÆrêP-§ÕròR,'.]ËÉ(–w-'/ÅrêR-§.Õr2ŠåTTËÉè×üE£÷õáúb9õ-¨åÔ¥ZN^Šåä¥ÏýẖSWËÉKûÃu-§.ÅròÐÙ®k9u©–S—j9½ö‡ëZN]ªå䥳?\×r*ªådô{¸®åTTËÉè××—è}£®åÄ¥k9qéZNF¯ýº–S—j9u©–“—>Ö7êZNªå䥳¿Q¿j9u©–S—j9½ö7êZN]ªådtö7êZNEµœŒ~ïoÔµœúÔrêR-'/½ïoÔµœºTËÉè÷þF]ËÉKŸûUË©Cµœ<ô±¿Q×rêR-'/ÅròÒçþF]ˉ»–“—b9u©–S—j9ýº–SQ-'£ßûu-§¾µœºTËÉKç¯7êÛKûu-§>®–“—^ëu-§ÕròÒûþF]Ë©KµœºTËÉèìoÔµœºTË©Kµœ¼ô±¿Q×r2zÛߨk9}îoÔµœúÔròÒk£®åÄ¥k9yéìoÔµœú¸XNªåä¡×þF]Ë©Kµœ¼ô¾¿Q×r*ªådô{£®åÔ^Ë©KµœŒÞ÷7êZNEµœŒÞö7êZN} j9u©–S—j9yéõ×õÝ¥XNªådtÖ'êZNªåÔ¥ZN^zíOÔµœºTËÉèý¯'êÛèc¢®åÄ~-'/½þz¢¾½ô¹?Q×r2zߟ¨k9Õrê ¯å䥳?Q×rêR-§.ÅròÐk¡j9õaµœöÇéXN-Õrj©–“K÷ýuªåÄбœ:–“KÏý/ŽåÔÇÕrj©–“K¯ýu:–“Ñm}Žådô¹¾N¯ZNF÷ýu:–SKµœZªåäÒcŽåÔÇÕrj©–“KÏýu:–SK±œº{~zýÚXÄËÉècŽåäÒçþ:Ë©¥×÷_ýqéµ¾NÇr2Úgûët,'¾èc9±t,'—^ûët,'£Ûþ:ËÉ¥Ïýu:–SKµœ\z®¯Ó±œªåäÒ¿ø)Õc9õqµœZªåäÒsŽåÔR,'‡îûëTË©¦–“Ñ÷ŸQý1zì¯Ó±œúÔrj©–“K¯ýu:–SWËÉ¥Çþ:Ë©¥XN Õrrè¹¾N_,çû¥/–óŸK?YÎÇßÿþYΉl9¯h±œÙrNdË9‘-çŸh³œÙrNdË9‘-ç-–s"[Ήl9¯h±œÙrNdË9‘-çÙrNcË9‘-ç-–s"[Ήh9§±å¼¢ÅrNdË9‘-ç-–s¢-çD¶œÙr^Ñb9'²åœÈ–s"[Î+Z,çD¶œÙr^Ñb9'²åœˆ–s[Î?Ñf9Ñr&¢åœÈ–3-g"ZÎD´œÙr&’åLCË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–3-çD¶œ‰h9ÑrNËùŽiæW¾ž_"ZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰d9§±åLDË™ˆ–óŠË™ˆ–3ÿ”œˆ–s"[ÎD´œ‰h9'²åLô[”ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ér¦¡åLDË9‘-g"ZÎD´œÙr&ºí×b9ÑrNdË™ˆ–3-çD¶œ‰h9Ñr&¢å¼¢År&¢åLDË™ˆ–s"[ÎD´œ‰d9§±åLDË™ˆ–3-çD¶œ‰h9ÑrNdË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3Ñm£Ë™ˆ–s"[ÎD´œ‰h9ÑrNDË™†–3-çD¶œ‰h9Ñr&¢å¼¢År&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™ˆ–3‘,ç4¶œ‰h9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË9‘-g"ZÎDý õD´œÙr&¢åLDËyE‹åLDË™ˆ–3-çD´œih9ÑrNdË™è÷þF-–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD´œÑr¦¹íO”-gZΉl9Ñr&¢åœÈ–3Ñm¢Ë™ˆ–óŠË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&’åLCË9-gZÎD´œ‰h9'²åLDË™ˆ–s"[ÎD´œ‰d9ÓÐrNdË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD²œW³XÎD²œih9'²åLDË™ˆ–3-çD¶œ‰h9ÑrNDË™†–3Ñû°KAË9‘-g"ZÎD´œÙr&ú½?N‹åLDË9‘-g"YÎ4´œ‰d9§±åLDË™ˆ–s"[ÎD´œ‰ûã´XΉl9Ér¦¡å¼"[Î4·ýmZ,g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&’åLCË™ˆ–s"[ÎD´œ‰h9'²åLDË™ˆ–3‘,ç4¶œ‰Ößo¶œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™ˆ–3‘,çÕ,–3-g"ZÎD´œÙr&¢åLDË9‘-g"YÎ4´œ‰d9§±åLDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™ˆ–3-çD¶œ‰d9ÓÐr&¢åœÈ–3-g"ZÎD´œÙr&¢åL$Ë9-g¢}†–3-ç-–3-g"ZΉl9Ñr&zì¯Ób9'²åLDË™H–s[ÎD´œ‰þÅO©.–s"[ÎD´œ‰h9'²åL$Ë™†–3‘,ç4¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9-gZÎD´œ¢Ír&ºý'Ëùçß¿|±œ?œülTËùÃñÐDÇrbéXN-Õrj©–óýÒË©¨–óýÇ}±œZªåÄÒ±œX:–SQ-'¢c9Õr*ªåTTˉoA-'†ŽåÔP-'–ŽåTTˉ«åÔP-'†ŽåÄÒ±œZªåÄÒ±œX:–SKµœŠj9ñqÇrbéXN-Õrj©–KÇrbéXNEµœˆŽåTTË©(–SM-çûïÀËù~é‹ådôüµ\-§–j9¹ôøµýîýb9µTË©¥XNÅrj¨–SKµœŒb9ùq±œZªåÔR-'—b9¹Ë©¨–“Qþ0ÌèõöÒý;¦9¿²ÀSóµœú¾Ôrr)–SQ-'£ûúp}±œúÂk9µTËÉ¥ÇXN.åÔP-§†j9¹ˉ¥c9ÅrâãŽåäR,§–j9µTËÉ(–SQ-'£¿ÿï×è¾>\_,§¾µœZªåäR,'—>÷‡ëXN}\-'—^ûÃu,§–b99ôØ®c9µTË©¥ZNFÏýá:–SKµœ\zì×±œŠj9}ì×±œŠj9ýÞߨc9¹ôúöFý°t,'–ŽådôÜߨc9µTË©¥ZN.½Ö7êXN Õrr鱿QÇrj©–SKµœŒžûu,§–j9=ö7êXNEµœŒ>ö7êXN} j9µTËÉ¥ûþFË©¥ZNFûu,'—>÷7ª–SCµœzíoÔ±œZªåäR,'—>÷7êXN|ܱœ\ŠåÔR-§–j9=ö7êXNEµœŒ>ö7êXN} j9µTËɥǷ7êÇ¥×þFË©«åäÒs}£ŽåÔP-'—îûu,§–j9µTËÉ豿QÇrj©–SKµœ\zíoÔ±œŒnûu,'£Ïý:–Sß‚ZN.=÷7êXN,ËÉ¥ÇþFË©‹åÔP-'‡žûu,§–j9¹tßߨc9Õr2úØß¨c9õ…×rj©–“Ñ}£ŽåTTËÉè¶¿QÇrê[PË©¥ZN-Õrréùíúi)–SCµœŒëu,§†j9µTËÉ¥çþDË©¥ZNF÷oOÔÑk¢ŽåÄ~,'—žßž¨—>÷'êXNF÷ý‰:–SQ-§¾ðZN.=ö'êXN-Õrj)–“CÏý…ªåÔ‡Õrr豿PÇrj©–SKµœ\ŠåÔR-§–j9ådóÚ¨c9õu×rré¹?PÇr*ªådtߨc9µTË©¥ZN.=öª–CÇrb¨–“Ís ŽåÔR-'—ûu,§–j9µTËÉ¥çþ@Õr²¹íïÓXN}ѵœš©ådô±?NÇr*ªåÔ^ËÉ¥ûþ8Ë©¥ZN-Årrèñíqúqèó×ö€ËÉè¾?NÇrj©–SKµœ\zìÓ±œZªådô±>NÇr"ªådsÛߦc9ñ 8–SKµœŒb9=÷·éXN}ᵜ\ºïoÓ±œZªåÔR,'‡ûãt,§>­–SKµœ\zíÓ±œZªåäÒcœj9ÕÔr2Z¿Õr*ªåÔ?~-'—ûãt,§¢ZNFûãt,§–j9µTËÉ¥ûþ:ÕrbèXN ËÉ¥çþ—Çrêãj9µTËÉ¥×þ:ËÉè¶¾NÇr2ú\_§W-'£ûþ:Ë©¥ZN-Õrr鱿NÇrêãj9µTËÉ¥çþ:Ë©¥XNÝ¿½N?½~m,â‹ådô±¿NÇrrésŽåÔÒëû¯þ¸ôZ_§c9í3±œŒ>÷×éXN,ËÉ¥×þ:ËÉè¶¿NÇrrésŽåÔR-'—žëët,§†j9¹ô/~JõXN}\-§–j9¹ôÜ_§c9µËÉ¡ûþ:Õrª©ådôýgTŒûët,§¾µœZªåäÒkŽåÔÇÕrr鱿NÇrj)–SCµœz®¯ÓËù~é‹åüçÒ–óÿþ~^Ê9 %çÕrNCÇ9 ç4TœšqNCÃ9 ç4œWcÀ9 ýæ4ä›Wc½9 ñæ4´›Ón^ åæ$„›ÓÐm^Ùæ4T›ÓmNB³y5&›ÓPlNC°y5öšÓkNC­9 ±æÕØjNCª9 ¥æ4Ÿ‚šWc§9 ™æ4TšWc¤9 æ4"š“Phþi ™F>3xæ4Ô™i„3ÓÈf¦Íœ†23 `f¹ÌiÈ2ÓHe¦ÊL#“9 If‰Ì4™iä1§!ÇLó^c¾–ù…ï…fZÌ4¢˜i$1ÓbNC‡™F 3æ4D˜id0Óˆ`¦Àœ„3üeñË«±¾L#|™FªM#z9 åeÁË4r—Ó]¦ù¿²I#t™Fær’Ë4—i.ÓÈ[NCn™FÚ2°å4´–i@-“HZ¦´œ†Î2˜e)Ëiˆ,ÓÜÖ§ÈÄ2„å4–iä+ÓˆWNC]™F¸2leÑÊ«±¬L#X™F®2Xå4T•i„*ÓÀTNBR™F¢2@eyÊiÈ)ÓHS¦¦œ†–2(eIÊ4‚”ÓÐQ¦£L#E9 eÊ4"”i$(§! L#?™F|2ÍçúêO&‘L#:9 ådÁÉ4r“iÄ&¯Æj2Ðd™ÉiH&ÓHL¦˜L#/9 ¹diÉ4Â’ÓÐJ¦•L#)™FPr:É4b’i $'!’L##™FD2„ä4’iä#ÓˆG¦‘Žœ†82ldÑÈi(#ÓF¦‘‹L#9 Ud¡È42‘Wc™æ†-F 2<ä4âI¤!ÓCNC ™æ÷úêXB¦„œ†2d)È4BÓÐ@¦L#9 dùÇ4âi¤§!~L#û˜FôqÉÇ$·õÑ¡{L"ö8 Õc¡Ç42Ó<¦‘xL#ð˜FÞñjÌÓH;¦vLó¹>:¦Ži$Ó:NCç˜FÌ1”c!ÇihÓ€8&‘pœFÀ1‰|cñÆ4ÒÓ7¦‘mL#Ú8 ecÁÆ4pIħ¡jL#Ô˜F¦1Hã4iÓÈ3NCΘFš10cXÆ+1eLɘDq:Æ4bŒi¤Ó1NCØF„1ã4ŒIn닾˜@zqâÅ4²‹iD§¡\Ló{}nìÓˆ-NCµ˜h1‰ÌbÅI(Ó,¦‘Wœ†\1´baÅ4²ŠÓ*¦TL"¨x5tŠInëkc¥˜FHqÅ4"Ši$§!PL#Ÿ˜F<1tâ4ĉi`“ˆ&¦‘Lœ†01\b±Äi¨Ó%¦‘IL’8 Ebší·=â4äˆi¤Ó#¦‘Eœ†1$bAÄièÓˆ!¦‘BL„x%6ˆiDÓH ¦@œ†þ0øaéÃiˆÓÀ&=Ly8 áa¹Ã4b‡ÓP¦:L#s˜FäpŠÃ4‡iä §!7LsÛÞcÃ4²†Ó¦‘4L#h˜FÎp2Ã4R†i€ '¡1L³ŽH¦0¼ûÂ4â…i¤ §!.L#[˜F´0dá4„…iä Ó€NBU˜æ¶¾76…iD §¡(L#P˜FžprÂ4ЄI„ ÓÀNBJ˜F’0 a9ÂiÈÓH¦"œ††0a Â4„ÓÈ&L#=ø§Yð`šÛ²ƒ¿_ƒ/x𧓉ª:V9ÑáƒX:~PK„Zª |¿ô…*ª!|ÿq_¡–ª±t!–Ž#TTHˆèHBE¥„Šj â[PMˆ¡Ã 5TOˆ¥ UâãJ 5TSˆ¡ƒ ±tT¡–Ê ±t\!–,ÔRe¡¢ÒB|ܱ…X:¸PKÕ…Z*/ÄÒñ…X:ÀPQ…!¢C Õ*züÚ‡ª ß¾0Ã÷K_œ!£ç¯ýã* µô¡†\züÚ~÷~Á†Zª6ÔR¸!‡â 5Tp¨¥ŠCF!‡ü¸˜C-j©êKa‡\Š;TTxøÏè*̯̟{9ÿ¹õDµ‡Œ‚õ}©>äRø¡¢úCF÷õáú"õ…— j©‘KAˆ\…¨¡2D Õ!r)KG"2º EÄNjȥ`D-U#j©‘Q<¢¢‚DF¿ç¯xÝׇë‹IÔ· (QKU‰\ KäÒçþp˜¨«LäÒk¸ŽMÔRp"‡ûÃux¢–êµT Èè¹?\‡(j©F‘Kýá:JQQ™"£8EFÏý:R‘Ñïý:V‘K¯ooÔKG+bépEFÏý:`QK‹Z*YäÒk}£ZÔPÕ"—ûuÜ¢– µT¹È蹿QÇ.j©x‘Ñc£_TT¿Èèc£Ž`Ô· „QK5Œ\ºïoÔQŒZ*cdô±¿Q2rés£J5TËÈ¡×þFͨ¥rF.Å3rés£ŽhÄÇÒÈ¥˜F-5jéÿ¢=ö7ê¸FE…Œ>ö7êÐF} jµTÜȥǷ7êÇ¥×þFߨ+päÒs}£qÔP#—îûu”£–ʵTçÈ豿QG:j©ÔQKµŽ\zíoÔÑŽŒnûu¼#£Ïý:âQß‚’G.=÷7ê G,õÈ¥ÇþF÷¨ |ÔPå#‡žûu죖йtßߨÃÕ?2úØß¨# õ…—@j©’Ñ}£Ž‚TTÉè¶¿QBê[P ©¥RH-ÕBréùíúi)RCåŒëu@¤†*"µTÉ¥çþD©¥ªHF÷oOÔÑk¢ŒÄ~d$—žßž¨—>÷'êàHF÷ý‰:9‘¯DNä3‘W´Ü‰œÈ‡"'ò¥È‰|*òŠ–[‘ùXäD¾yE˹ȉ|/r"ŒœÆ#ÿDÛÉÈD¼™ˆG#'òÕÈD<™ˆw#ñpäD¾™H§#ÓðväD>™ˆ×#ñ|d"ÞœÈ$ñ‚d¢÷'$ß ÌüJ–œÈ—%½?-ù%âɉ|G2I&â%ÉD<%9‘oI&â1ÉD¼&9‘ÏI&â=ÉD<(™H%§ñIÉD¼)™ˆG%¯h¹*™è¦³’‰ø_6JÄÃ’ù²d"ž–LÄÛ’ù¸d¢ß¿ðŸëJÄó’‰x_r"˜LÄ “‰xb2oLNä#“‰xe2ÏLNä;“‰th2Íc¸–S“ùÖd"›LÄk“ùÜd¢Ûþp-'ñâäD>9™ˆ7'ñèäD¾:™ˆg'ñîd"ž¼¢åòd"žžLÄÛ“‰x|r"_ŸLÄó“‰tr LÄ ”‰x‚2oPNä#”‰x…2ÏPNä;”‰xˆ2/Q&â)ʉ|‹2Q&â5ʉ|Ž2ïQ&âAÊD¼H9‘OR&âMÊDk™ˆw-ñ°åD¼l™æ¶?Q¾m™†Ç-'òuËD›™Hw3Óðpf"^Μȧ3ñvf"ÏœÈ×3ñ|f"ÞÏL¤šÓø‚f¢õ÷›ohNä#š‰xE3Ïh&â͉|H3/i&â)͉|K3i&â5ÍD:§y5Ë=ÍD<¨™ˆ5ñ¤æD¾©™ˆG5ñªæD>«™Hw5Óð°f"]֜Ƨ5ñ¶f"לÈ×5ñ¼f"Þ×LÄ›ùÂf"žØLÄ›ùÈf"]ÙLÃ3›‰xgs"ÚLÄK›‰xj3Ñçþ:-Ç6ñÚf"ÛœÆ÷6í3¼¸™ˆ'7¯h¹¹™ˆG7ñêæD>»™ˆw7ñðf"^ޜȧ7ñöf"ßœÆ×7ñüf¢ñSªËΉ|3Op&â Ή|„3‘®p¦áÎDºÃ9q&â%ÎD<Å™ˆ·8'ò1ÎD¼Æ™ˆç8'ò=ÎD<ș豿NËIΉx“3 r&âUÎ?Ñv–3Ñí¿Üåüëÿ‹õ×ÿ8,–3-çD¶œ‰h9Ñr&¢å¼¢År&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™ˆ–3-çD´œih9ÑrNdË™ˆ–3‘,gZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™H–3 -ç-–³‘,g#YÎD´œd9Ér6’åLDËÙ–³,g"ZÎF²œd9Ér&¢ålôÞr¾ašý•ïç—èN&-g#YÎF²œ‰h9Ér6’ål$Ë™ˆ–³‘,g#YÎD´œd9Ér6‚åLCËÙH–³‘,çD¶œd9éOÉd9Ñr6’ål$Ë™ˆ–³ÑoüEP#YÎF²œ‰h9Ér6’ål$Ë™ˆ–³‘,g#YÎD´œ`9ÛÈr6’åLDËÙH–³‘,g"ZÎF78™F²œd9Ñr6’ål$Ë™ˆ–³‘,g#YÎF²œÙr6’ål$ËÙH–3-g#YÎF°œih9Ér6’ål$Ë™ˆ–³‘,g#YÎD´œd9Ér6’åLDËÙH–³‘,g"ZÎF²œd9Ér&¢ål$ËÙH–³‘,g"YÎ6²œd9Ñr6’ål$ËÙH–s"[ÎF²œd9Ñr6’ål$ËÙH–3-g#YÎF²œ‰h9Ér6’ål$Ë™ˆ–³‘,g#XÎ4´œd9Ér6’åLDËÙH–³‘,g#YÎD´œd9Ér&¢ål$ËÙH–³‘,g"ZÎF²œd9'²ål$ËÙH–³‘,g"YÎ6²œd9Ñr6ú½¿Q¶œd9Ñr6’ål$ËÙH–3-g#YÎF²œ‰h9Ér6’ål$Ë™ˆ–³‘,g#YÎD²œmnûEËÙF–3-g#YÎF²œ‰h9Ér6’ål$Ë9‘-g#YÎF²œd9Ñr6’ål$Ë™ˆ–³‘,g#YÎF²œ‰h9Ár¶‘åL$ËÙF–³‘,g#YÎD´œd9Ér&¢ål$ËÙ–³,g"ZÎF²œd9}î”-g#YÎF²œ‰h9Ér6’ålË9-g#XÎ6²œ‰h9Ér6’ål$Ë™ˆ–³‘,g#YÎD²œmd9½ý»²œ‰h9Ér6’åLDËÙè÷þ8Ùr6’åLDËÙ–³,g#XÎ4´œd9Ér&¢ål$ËÙH–³‘,g"ZÎF°œmd9'¢ålsÛß&[ÎF²œ‰h9Ér6’åLDËÙH–³‘,g#YÎD´œ`9ÛÈr6’åLDËÙH–³‘,g"ZÎF²œd9Ár¦¡ål´þ~£åLDËÙH–³‘,g#YÎD´œd9Ér&¢ål$ËÙH–³,ç4¶œd9Ér6’åLDËÙH–³‘,g"ZÎF°œmd9Ár¦¡ål$ËÙH–3-g#YÎF²œd9Ñr6’ål$Ë™ˆ–³,gYÎF²œ‰h9Ér6’ål$Ë™ˆ–³‘,g#XÎ4´œöYÎF²œÙr6’ål$Ë™ˆ–³‘,g#YÎF²œ‰h9Ér6‚åLCËÙH–³Ñ¿ø)U[ÎD´œd9Ér&¢ålËÙF–³,gZÎF²œd9Ér&¢ål$ËÙH–3-g#YÎF²œd9Ér¶‘ål$ËyE‹åltûO–ó&Ø,çD¶œW´XΉl9'²åœÈ–óO´YΉl9'²åœÈ–óŠË9‘-çD¶œW´XΉl9'²åœÈ–óŠl9§±åœÈ–óŠË9‘-çD´œÓØr^Ñb9'²åœÈ–óŠË9‘-çD¶œÙr^Ñb9'²åœÈ–s"[Î+Z,çD¶œÙr^Ñb9'²åœˆ–s[Î?Ñf9Ñr&¢åœÈ–3-g"ZÎD´œÙr&’åLCË9‘-g"ZÎD´œ‰h9'‚å|Ç4ó+u¬³-g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰d9§±åLDË™ˆ–óŠË™ˆ–3ÿ”œˆ–s"[ÎD´œ‰h9'²åLô[”ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ér¦¡åLDË9‘-g"ZÎD´œÙr&ºíoÔb9ÑrNdË™ˆ–3-çD¶œ‰h9Ñr&¢å¼¢År&¢åLDË™ˆ–s"[ÎD´œ‰d9§±åLDË™ˆ–3-çD¶œ‰h9ÑrNdË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË™ˆ–s"ZÎ4´œ‰h9'²åLDË™è¡Y‘ˆ–óŠË™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD²œÓØr&¢åLDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZÎ+Z,g"ZÎD´œ‰h9'¢åLCË™ˆ–s"[ÎD¿÷7j±œ‰h9'²åLDË™ˆ–3-çD¶œ‰h9ÑrNdË™ˆ–3-g"ZΉl9Ñr&¢åœˆ–3Ím¢l9ÓÐrNdË™ˆ–3-çD¶œ‰h9Ñr&¢å¼¢År&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™ˆ–3-çD¶œ‰d9ÓÐrNDË™†–3-g"ZΉl9Ñr&¢åœÈ–3-g"YÎ4´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™è±?P¶œW³XÎD²œih9'²åLDË™ˆ–3-çD¶œ‰h9ÑrNDË™†–3Ñû°KAË9‘-g"ZÎD´œÙr&ú½?N‹åLDË9‘-g"YÎ4´œ‰d9§±åLDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™H–3 -çÙr¦¹íoÓb9ÑrNdË™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3‘,gZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰d9§±åL´þ~³åœÈ–3-g"ZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰d9¯f±œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ér¦y쯓-ç4¶œ‰h9ÑrNdË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3‘,gZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰d9§±åL´ÏÐr&¢å¼¢År&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™H–s[ÎD´œ‰þÅO©.–s"[ÎD´œ‰h9'²åL$Ë™†–3‘,ç4¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9-gZÎD´œ¢Ír&ºýËyûóo‡¿XÎÇß ñÛt¢ZÎD_¿È‰ŽåÄÒ±œZªåÔR-çû¥/–SQ-çûûb9µTˉ¥c9±t,§¢ZNDÇr*ªåTTË©¨–ß‚ZN Ë©¡ZN,Ë©¨–WË©¡ZN ˉ¥c9µTˉ¥c9±t,§–j9ÕrâãŽåÄÒ±œZªåÔR-'–ŽåÄÒ±œŠj9Ë©¨–SQ,§šZÎ÷ß/–óýÒËÉ(ÖÇÕrj©–“K±œ\ŠåÔR-§–b99Ë©¡ZN-Õr2ŠåäÇÅrþsé Ó̯,ðÔ|-§¾ÐZN.År*ªåd”?!3ŠåTTËÉ(–Sß‚ZN.År*ªådt_®/–S_x-§–j9¹ËÉ¥±œªåÔP-'—b9±t,'£XN|ܱœ\ŠåÔR-§–j9År*ªådô{þ"ˆÑ}}¸¾XN} j9µTËÉ¥XN.}î×±œú¸ZN.½ö‡ëXN-Årrè±?\Çrj©–SKµœŒžo®Õrj©–“Ký:–SQ-'£ý:–SQ-'£ßûu,'—^ßÞ¨–ŽåÄÒ±œŒžûu,§–j9µTËÉ¥×úFË©¡ZN.=ö7êXN-Õrj©–“Ñs£ŽåÔR-'£ÇþFË©¨–“ÑÇþFË©oA-§–j9¹tßߨc9µTËÉèc£ŽåäÒçþFÕrj¨–“C¯ý:–SKµœ\zÌ¿¬àÒçþFˉ;–“K±œZªåÔR-'£ÇþFË©¨–“ÑÇþFË©oÁíûu,'—ßÞ¨—^ûu,§>®–“KÏõ:–SCµœ\ºïoÔ±œZªåÔR-'£ÇþFË©¥ZN-Õrr鵿QÇr2ºíoÔ±œŒ>÷7êXN} j9¹ôÜߨc9±t,'—ûu,§>.–SCµœzîoÔ±œZªåäÒ}£ŽåTTËÉèc£ŽåÔ^Ë©¥ZNF÷ý:–SQ-'£ÛþFË©oA-§–j9µTËÉ¥ç·7ê§¥XN Õr2z¬OÔ±œªåÔR-'—žûu,§–j9Ý¿=Q?F¯ý‰:–_ø±œ\z~{¢~\úÜŸ¨c9Ý÷'êXNEµœúÂk9¹ôØŸ¨c9µTË©¥XN=÷ª–SVËÉ¡ÇþBË©¥ZN-Õrr)–SKµœZªåd4–“Ík ŽåÔ×]ËÉ¥çþ@Ë©¨–“Ñ} ŽåÔR-§–j9¹ôبZN ˉ¡ZN6Ïý:–SKµœ\zìÔ±œZªåÔR-'—žûUËÉæ¶¿Oc9õE×rj¦–“ÑÇþ8Ë©¨–S_x-'—îûãt,§–j9µËɡǷÇéÇ¡Ï_Ûv,'£ûþ8Ë©¥ZN-Õrré±?NÇrj©–“ÑÇú8ˉ¨–“Ím›ŽåÄ7àXN-Õr2ŠådôÜߦc9õ…×rr龿MÇrj©–SK±œzìÓ±œú´ZN-Õrréµ?NÇrj©–“KýqªåTSËÉhýýVË©¨–Sÿøµœ\zìÓ±œŠj9}ìÓ±œZªåÔR-'—îûëTˉ¡c91t,'—žû_Ë©«åÔR-'—^ûët,'£Ûú:ËÉès}^µœŒîûët,§–j9µTËÉ¥Çþ:Ë©«åÔR-'—žûët,§–b99tÿö:ý8ôúµ±ˆ/–“ÑÇþ:ËÉ¥Ïýu:–SK¯ï?©úãÒk}Žåd´Ï<ö×éXN|ÑÇrbéXN.½ö×éXNF·ýu:–“KŸûët,§–j9¹ô\_§c95TËÉ¥ñSªÇrêãj9µTËÉ¥çþ:Ë©¥XNÝ÷ש–SM-'£ï?£úcôØ_§c9õ ¨åÔR-'—^ûët,§>®–“Kýu:–SK±œªåäÐs}¾XÎ÷K_,ç?—~²œ·¿øl¹Ë™ˆw9'ò]ÎD¼Ë™ˆw9ñ.ç-w9ñ.g"ÞåLÄ»œù.g"ÞåLÄ»œù.g"ÞåLÄ»œ‰x—s"ÞåLûœ‰x—s"ßåLÄ»œ‰t—3 ïrN仜‰x—3ïrN仜‰x—3ïr&â]Ή|—3ïr&â]ÎD¼Ë9‘ïr&â]ÎD¼Ë9‘ïr&â]ÎDºË™†w9¯h¹ËÙHw9é.g"Þål¤»œt—³‘îr&â]ÎF¸ËÙFw9Ýt—³‘îr6z—óÓ̯ԱÎD8Öù%Ò]ÎFºËÙHw9ñ.g#Ýål¤»œ‰x—³‘îr6z|ûO¦ü¸¤»œ‰x—³‘îr6Ò]ÎD¼ËÙHw9é.g#ÜåLûœt—³‘îrN仜t—³‘þ‹Gt—3ïr6Ò]ÎFºË™ˆw9ýþõþ?êÕHw9é.g"Þål¤»œt—³‘îr&â]ÎFºËÙHw9ñ.g#Üål£»œt—3ïr6Ò]ÎFºË™ˆw9Ýö7Êw9é.g"Þål¤»œt—3ïr6Ò]ÎFºËÙHw9'ò]ÎFºËÙHw9é.g"Þål¤»œp—3 ïr6Ò]ÎFºËÙHw9ñ.g#Ýål¤»œ‰x—³Ñm£|—³‘îr&â]ÎFºËÙHw9ñ.g#Ýål¤»œt—3ïr6Ò]ÎFºËÙHw9é.gÝål¤»œ‰x—³‘îr6zà?<ÙHw9'ò]ÎFºËÙHw9ñ.g#Ýål¤»œt—3ïr6Ò]ÎFºË™è¦»œt—³‘îr6Ò]ÎD¼ËÙHw9á.gÞål¤»œt—³‘îr&â]ÎFºËÙHw9é.g"Þål¤»œt—3ïr6Ò]ÎFºËÙHw9ñ.g#Ýål¤»œù.g#Ýål¤»œt—3‘îr¶Ñ]ÎFºË™ˆw9ýÞß(ßål¤»œ‰x—³‘îr6Ò]ÎFºË™ˆw9é.g#ÝåLÄ»œt—³‘îr6Ò]ÎD¼ËÙHw9é.g"ÝålsÛŸ(Þål£»œ‰x—³‘îr6Ò]ÎD¼ËÙHw9é.g#ÝåœÈw9é.g#Ýål¤»œ‰x—³‘îr6Ò]ÎD¼ËÙHw9é.g#ÝåLÄ»œp—³îr&Ò]Î67œ>k¤»œt—3ïr6Ò]ÎFºË™ˆw9é.g#Üål£»œ‰x—³‘îr6Ò]ÎFºË™ˆw9é.g#ÝåLÄ»œt—³Ñc x—sßål„»œmt—3ïr6Ò]ÎFºËÙHw9ñ.g#Ýål¤»œ‰n¸ËÙFw9½=–ÐBw9ñ.g#Ýål¤»œ‰x—³Ñïýqò]ÎFºË™ˆw9á.gÝål„»œix—³‘îr6Ò]ÎD¼ËÙHw9é.g#ÝåLÄ»œp—³îrNÄ»œmnûÛ仜t—3ïr6Ò]ÎFºË™ˆw9é.g#Ýål¤»œ‰x—³îr¶Ñ]ÎFºË™ˆw9é.g#ÝåLÄ»œt—³‘îr6Â]Î4¼ËÙhýýÆ»œ‰x—³Ñmœ|—³‘îr&â]ÎFºËÙHw9ñ.g#Ýål¤»œp—sßål¤»œt—³‘îr&â]ÎFºËÙHw9ñ.g#Üål£»œp—3 ïr6Ò]ÎFºË™ˆw9é.g#Ýål¤»œ‰x—³‘îr6Ò]ÎD¼ËÙw9Ûè.g#ÝåLÄ»œt—³‘îr6Ò]ÎD¼ËÙHw9á.gÞål´Ïè.g#ÝåœÈw9é.g#ÝåLÄ»œt—³‘îr6Ò]ÎD¼ËÙHw9á.gš›îr6Ò]ÎFÿâ§T}—3ïr6Ò]ÎFºË™ˆw9á.gÝål„»œix—³‘îr6Ò]ÎFºË™ˆw9é.g#ÝåLÄ»œt—³‘îr6Ò]ÎDºËÙFw9é.ç-w9ÝþÓ]οþ÷ôcµœÙr^Ñb9'²åœÈ–s"[Î?Ñf9'²åœÈ–s"[Î+Z,çD¶œÙr^Ñb9'²åœÈ–s"[Î+²åœÆ–s"[Î+Z,çD7ZΉh9§±å¼¢ÅrNdË9‘-ç-–s"[Ήl9'²å¼¢ÅrNdË9‘-çD¶œW´XΉl9'²å¼¢ÅrNdË9-ç4¶œ¢Ír&¢åLDË9‘-g"ZÎD´œ‰h9'²åL$Ë™†–s"[ÎDï-ç;¦™_ùx~‰h9'²åLDË™ˆ–3-çD¶œ‰h9ÑrNdË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD²œÓØr&¢åLDËyE‹åLDË™ˆJNDË9‘-g"ZÎD´œÙr&ú­¿JDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™ˆ–3-çD¶œ‰d9ÓÐr&¢åœÈ–3-g"ZΉl9Ýö7j±œ‰h9'²åLDË™ˆ–s"[ÎD´œ‰h9Ñr^Ñb9Ñr&¢åLDË9‘-g"ZÎD²œÓØr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLtÛߨÅr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD´œ‰h9'¢åLCË™ˆ–s"[ÎD´œ‰h9Ñr^Ñb9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™H–s[ÎD´œ‰h9ÑrNdË™ˆ–3Ñc£Ë9‘-g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9¯h±œ‰h9Ñr&¢åœˆ–3 -g"ZΉl9ýÞߨÅr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–s"ZÎ4·ý‰²åLCË9‘-g"ZÎD´œÙr&¢åLDË™ˆ–óŠË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&’åLCË9-gš›¸L"ZÎD´œÙr&¢åLDË9‘-g"ZÎD²œih9'²åLDË™ˆ–3-çD¶œ‰h9ÑrNdË™ˆ–3-g"YΫY,g"YÎ4´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'¢åLCË™èýØ¥ åœÈ–3-g"ZΉl9ýÞ§År&¢åœÈ–3‘,gš‡~9‘,ç4¶œ‰h9ÑrNdË™ˆ–3-g"ZΉl9Ér¦¡å¼"[Î4·ýmZ,g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&’åLCË™ˆ–s"[ÎD´œ‰h9'²åLDË™ˆ–3‘,ç4¶œ‰Ößo¶œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™ˆ–3‘,çÕ,–3-g"ZÎD´œÙr&¢åLDË9‘-g"YÎ4´œ‰d9§±åLDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™ˆ–3-çD¶œ‰d9ÓÐr&¢åœÈ–3-g"ZÎD´œÙr&¢åL$Ë9-g¢}汿N‹å¼¢År&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™H–s[ÎD´œ‰þÅO©.–s"[ÎD´œ‰h9'²åL$Ë™†–3‘,ç4¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9-gZÎD´œ¢Ír&ºýËù×ÿ7ä¯ÿuÿÅrþtò3Q-çOÇC':–KÇrj©–SKµœï—¾XNEµœï?î‹åÔR-'–ŽåÄÒ±œŠj9Ë©¨–SQ-§¢ZN| j91t,§†j9±t,§¢ZN|\-§†j91t,'–ŽåÔR-'–ŽåÄÒ±œZªåTTˉ;–KÇrj©–SKµœX:–KÇr*ªåDt,§¢ZNE_ûP-çûïÀËù~é‹ådôüµ\-§–j9¹ôøµýîýb9µTË©¥XNÅrj¨–óŸKo˜fe€§¾†ZN~ ±œZªåÔR-'—b9¹Ë©¨–“Qþ„Ì(–SQ-'£XN} j9¹Ë©¨–“Ñ}}¸¾XN}ᵜZªåäR,'—Ærj¨–SCµœ\ŠåÄÒ±œŒb9ñqÇrr)–SKµœZªådË©¨–“Ñïù‹ F÷õáúb9õ-¨åÔR-'—óA\úÜ®c9õqµœ\zí×±œZŠåäÐc¸ŽåÔR-§–j9=÷7êXN-Õrr鱿QÇr*ªådô±¿QÇr*ªådô{£ŽåäÒëÛõÃÒ±œX:–“Ñs£ŽåÔR-§–j9¹ôZߨc95TËÉ¥ÇþFË©¥ZN-Õr2zîoÔ±œZªådËÉès£Žådô±¿QÇrê[PË©¥ZN.Ý÷7êXN-Õr2úØß¨c9¹ô¹¿QµœªåäÐk£ŽåÔR-'—b9¹ô¹¿QÇrâãŽåäR,§–j9µTËÉ豿QÇr*ªådô±¿QÇrê[PË©¥ZN.=¾½Q?.½ö7êXN}\-'—žëu,§†j9¹tßߨc9µTË©¥ZNFý:–SKµœZªåäÒk£ŽådtÛߨc9}îoÔ±œúÔrr鹿QÇrbéXN.=ö7êXN}\,§†j99ôÜߨc9µTËÉ¥ûþFË©¨–“ÑÇþFË©/¼–SKµœŒîûu,§¢ZNF·ý:–Sß‚ZN-Õrj©–“KÏooÔOK±œªådôXŸ¨c95TË©¥ZN.=÷'êXN-Õr2º{¢~Œ^ûu,'¾ðc9¹ôüöDý¸ô¹?QÇr2ºïOÔ±œŠj9õ…×rré±?QÇrj©–SK±œzî/T-§>¬–“Cý…:–SKµœZªåäR,§–j9µTËÉh,'›×þ@Ë©¯»–“KÏý:–SQ-'£ûþ@Ë©¥ZN-Õrré±?Pµœ:–Cµœlžûu,§–j9¹ôبc9µTË©¥ZN.=÷ª–“M,'£ÇöE×rj¦–“ÑÇþ8Ë©¨–S_x-'—îûãt,§–j9µËɡǷÇéÇ¡Ï_Ûv,'£ûþ8Ë©¥ZN-Õrré±?NÇrj©–“ÑÇú8ˉ¨–“Ím›ŽåÄ7àXN-Õr2ŠådôÜߦc9õ…×rr龿MÇrj©–SK±œzìÓ±œú´ZN-Õrréµ?NÇrj©–“KýqªåTSËÉhýýVË©¨–Sÿøµœ\zìÓ±œŠj9}ìÓ±œZªåÔR-'—îûëTˉ¡c91t,'—žû_Ë©«åÔR-'—^ûët,'£Ûú:ËÉès}^µœŒîûët,§–>þ÷íuúi©–“Kýu:–SWË©¥ZN.=÷×éXN-Årrèþíuúqèõkc_,'£ýu:–“KŸûët,§–^ßRõÇ¥×ú:ËÉhŸyì¯Ó±œø¢åÄÒ±œ\zí¯Ó±œŒnûët,'—>÷×éXN-Õrré¹¾NÇrj¨–“Kÿâ§TåÔÇÕrj©–“KÏýu:–SK±œºï¯S-§šZNFßFõÇ豿NÇrêPË©¥ZN.½ö×éXN}\-'—ûët,§–b95TËÉ¡çú:}±œï—¾XÎ.ýd9ÿúßdÛYÎix•ój|”sÞ䜆'9§áEÎ?ÍrsÞ㜆ç8§á5Ϋñ1Îix‹sžâ¼_✆‡8§áÎix†ójx…sᜆ78¯æƒ'8§áÎit€sÞß¼Ÿßœ†×7§áñÍ«ñíÍixzs^Þœ†‡7¯Æw7§áÙÍixusݼßÜœ†'7§áÅÍ«ñÁÍixosÛœ„×6ÿ4˱Í4ºµ™F§6§á¥Í4:´™Fw6ÓèÌæ4¼²™G6“¼¿±ùŽ\^¿w7Ó¼?»yØL£ûšÓð¼f]×L£ãšit[sžÖL£ËšitXsÞÕL£³šitU3ŽjNÛšitR3.jNÚitO3Îi¦Á5ÍIxL3ni¦Ñ)Í«ñ%Í4:¤™Fÿ…¢4:£9 ¯h¦ÑÍ4º¡9 Oh¦ùýëý~+h¦ÑýÌix>3®g¦y࿼•F·3§áéÌ4ºœ™F‡3§áÝÌ48›™DW3Óèhæ4¼™™F'3Óèbæ4<˜™æ¶¾:>—™F×2§á±Ì4º•™F§2§á¥Ì4:”™Fw2ÓèLæÕøJfÉL£™it"s^ÈL£™ipsžÇL£ë˜it3ncNÃÓ˜it3cN󡻘it3®b¦ÑQÌix3Nb¦ÑEÌix3îa¦Ñ9Ì4º†9 a¦Ñ-Ì4:…™F—0§Ñ!Ì$ºƒ™Fg0§áÌ4:‚™F70ÓèæÕøfÀL£û—Óðüe]¿L£ã—itûrž¾L£Ë—itørÞ½L£³—itõ2Ž^NÛ—itò2 .^Nƒ—itï2Î]¦ÑµËixì2n]¦y¬¯Ž/]NÃC—itç2Î\NÃ+—inë«ã—itâr^¸L£—itßòj|Þ2®[¦ÑqË4ºm9N[&ÑeË4:l9 ïZ¦ù½¾:¾j™FG-§áMË4:i™F-Óè å4¼g™Fç,Óèšå4p¬2‰nU¦Ñ©Ê4ºT9 U¦ÑÊ4:S9 ¯T¦Ñ‘Ê4¸Q™D'*§á…Ê4:P™F÷)Óè<å4¼N™FÇ)Óè6å4@]¢œ†‡(Óèe¡œ†W(Óü^Ÿß L£”Óðe L¢û“ip~r^ŸL£ã“it{ržžL£Ë“itx2îNNó“ipu2‰ŽN^ oN&¹­¯/N¦ÑÁÉixo2ÎM¦ÑµÉixl2nM¦Ñ©É4º49 M¦ÁÉ$:3™FW&§á‘É4º1™F'&§á…É4:0™F÷%Óà¼ä$¼.™fûíÅÛ’Óð´d]–L£Ã’itWrž•L£«’itTrÞ”L£“’itQ2 J^‰ïI¦Ñ9É4º&™FÇ$§á-É4:%™F—$§á!É4¸#™Dg$ÓàŠä$<"™F7$Óè„ä4º ™F$Óè~dœ†×#ÓèxdÝŽœ†§#ÓàrdŽL£»‘Óðld]L££‘it3ržŒL£‹‘ip0rÞ‹L³ŽèZd‹¼ߊL£S‘it)rŠLs[ߟ‰L£+‘ÓðHd݈Lƒ‘“ðBdˆL³ÿô¥ÏCNÃëit2nCNÃÓip2‰C¦Á]ÈIx2®B¦ÑQÈ4º 9 OB¦ÑEÈ4:9 ïA¦Ñ9È4º™FÇ §Ñ-È$:™F— ÿ4Ë!È4·ÿtòo“³âÁ‰¬¯háƒÙNd@8‘áŸh#„ÙNdD8‘á-Œp";‰ ¯h‘„™NdK8‘1áYNcN8‘=á- p"‹Â‰H §±)¼¢NdU8‘Yá-®p"É, '2-¼¢ÅNd\8‘uáDæ…W´øÂ‰ '²0¼¢…Ndc8‘á4V†¢&¢3LDh8‘¥a"RÃD´†‰ˆ '²6Lô–¾£„ù…ï≠Q&"9LDs8‘Ña"ªÃDd‡‰è'2&"}œÈö1ÑïýZôc"òljì@&¢€LD9‘ d""ÈDT™A&¢ƒLD™ˆr"SÈD´‰ˆ!'¢†LsÛŸ({È4‘YD&"‰LD9‘Qd"ªÈDd‘‰è"¯h‘‰(#=õÓ/‰h#'2ŽLD™ˆs"ÍDš‰D4§±ÑL´ÏPi&"Ó¼¢Åi&"ÔLD©9‘©f"ZÍDÄš‰¨5'2×LD¯™H`s‹ÍD$›‰þÅO©.hs"«ÍDd›‰è6'2ÜL$¹™†t3‘ìæ4Æ›‰¨7‘o&¢ßœÈ€3g"Ήl8q&¢âLDÆ9gBÎD”œ¢r&ºýËù×ïôÿÛ,g"ZΉl9Ñr&¢åLDËyE‹åLDË™ˆ–3-çD¶œ‰h9ÑrNdË™ˆ–3-g"ZΉh9ÓÐr&¢åœÈ–3-g"YÎ4´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™èïÿý·}á¶œÙr&¢åLDË9‘-g"ZÎD²œih9¯h±œd9Ér&¢ål$ËÙH–³‘,g"XÎ7N³¿÷$ÛÈr&¢ål$ËÙH–³‘,g"ZÎF²œd9Ér&¢ål$ËÙH–3-g#YÎF²œd9Ñr6’ål$Ë™ˆ–³‘,g#YÎF°œih9Ér6’åœÈ–³‘,g#ý)¹‘,g"ZÎF²œd9Ñr6ú¿j$ËÙH–3-g#YÎF²œd9Ñr6’ål$Ë™ˆ–³,gYÎF²œ‰h9Ér6’åLDËÙè¶¿Q¶œd9Ñr6’ål$Ë™ˆ–³‘,g#YÎF²œÙr6’ålôÜß([ÎD´œd9Ár¦¡ål$ËÙH–³‘,g"ZÎF²œd9Ñr6’ål$ËÙH–3-g#YÎF²œ‰h9Ér6’ål$Ë™ˆ–³‘,g#YÎF²œ‰d9ÛÈr6’åLDËÙH–³‘,g#YΉl9Ér6’åLDËÙH–³‘,g#YÎD´œd9Ér&¢ål$ËÙH–³‘,g"ZÎF²œ`9ÓÜe9Ér6’ål$Ë™ˆ–³‘,g#YÎF²œ‰h9Ér6’åLDËÙH–³‘,g#YÎD´œd9ÉrNdËÙH–³‘,g#YÎD²œmd9Ér&¢ålô{£l9Ér&¢ål$ËÙH–³‘,g"ZÎF²œd9Ýe9Ér6’ål$Ë™ˆ–³‘,g#YÎD²œmnûEËÙF–3-g#YÎF²œ‰h9Ér6’ål$Ë9‘-g#YÎFOü@L#YÎD´œd9Ér&¢ål$ËÙH–³‘,g"ZÎF°œmd9Ér¶‘ål$ËÙH–3-g#YÎF²œ‰h9Ér6‚ål#Ë™ˆ–³‘,g#YÎF²œ‰h9Ér6’åLDËÙH–³‘,g#XÎil9Ár¶‘åLDËÙH–³‘,g#YÎD´œd9Ér&’ål#ËÙèíصåLDËÙH–³‘,g¢»,g£ßûãdËÙH–3-g#XÎ6²œ`9ÓÐr6’ål$Ë™ˆ–³‘,g#YÎF²œ‰h9Ár¶‘圈–³Ím›l9Ér&¢ål$ËÙH–3-g#YÎF²œd9Ñr6‚ål#ËÙH–3-g#YÎF²œ‰î²œd9Ér6‚åLCËÙhýýFË™ˆ–³‘,g#YÎF²œ‰h9Ér6’åLDËÙH–³‘,g#XÎil9Ér6’ål$Ë™ˆ–³‘,g#YÎD´œ`9ÛÈr6‚åLCËÙH–³‘,g"ZÎF²œd9Ér&¢ål$ËÙH–3-g#XÎ6²œd9Ñr6’ål$ËÙH–3-g#YÎF°œih9í3²œd9'²ål$ËÙH–3-g#YÎF²œd9Ñr6’ålË™†–³‘,g£ñSª¶œ‰h9Ér6’åLt—ålËÙF–³,gZÎF²œd9Ér&¢ål$ËÙH–3-g#YÎF²œd9Ér¶‘ål$ËyE‹åltûO–ó¯ï×ë«å|üÍ¿OOTË™èÿû"¯èXN,Ë©¥ZN-Õr¾_úb9Õr¾ÿ¸/–SKµœX:–KÇr*ªåDt,§¢ZNEµœŠj9ñ-¨åÄбœªåÄÒ±œŠj9ñqµœªåÄбœX:–SKµœX:–KÇrj©–SQ-'>îXN,Ë©¥ZN-ÕrbéXN,Ë©¨–ѱœŠj9Årª©å|ÿøb9ß/}±œŒò‡a}\-§–j9¹ËÉ¥XÎ.½cšó+ <5Ë©¯³–SCµœZªådËÉ‹åÔR-§–j9¹ËÉ¥XNEµœŒò'dF±œŠj9Årê[PËÉ¥XNEµœŒîëÃõÅrê ¯åÔR-'—b9¹4–SCµœªåäR,'–Žådˉ;–“K±œZªåÔR-'£XNEµœŒ~Ï_1º¯×Ë©oA-§–j9¹ËÉ¥Ïýá:–SWËÉ¥×Û‡ëD÷XN-Årr豿QÇrj©–SKµœŒžûu,§–j9¹ôØß¨c9Õr2úØß¨c9Õr2ú½¿QÇrréõíúaéXN,ËÉ蹿QÇrj©–SKµœ\z­oÔ±œªåäÒc£ŽåÔR-§–j9=÷7êXN-Õr2zìoÔ±œŠj9}ìoÔ±œúÔrj©–“K÷ý:–SKµœŒ>ö7êXN.}îoT-§†j99ôÚߨc9µTËÉ¥XN.}îoÔ±œø¸c9¹Ë©¥ZN-Õr2zìoÔ±œŠj9}ìoÔ±œúÔrj©–“KooÔK¯ý:–SWËÉ¥çúFýýïÖ7êXN.Ý÷7êXN-Õrj©–“Ñc£ŽåÔR-§–j9¹ôÚߨc9Ýö7êXNFŸûu,§¾µœ\zîoÔ±œX:–“Ký:–SË©¡ZN=÷7êXN-Õrr龿QÇr*ªådô±¿QÇrê ¯åÔR-'£ûþFË©èþ¿ý:–“Ñc£ŽåÔR-§–j9¹ôüöFý´Ë©¡ZNFõ‰:–SCµœZªåäÒs¢ŽåÔR-'£û·'êÇèµ?QÇrâ ?–“KÏoOÔKŸûu,'£ûþDË©¨–S_x-'—ûu,§–j9µËÉ¡çþBÕrêÃj99ôØ_¨c9µTË©¥ZN.Årj©–SKµœŒÆr²yíÔ±œúºk9¹ôܨc9Õr2ºïÔ±œZªåÔR-'—ûUˉ¡c91TËÉæ¹?PÇrj©–“Ký:–SKµœZªåäÒs j9ÙÜö÷i,§¾èZNÍÔr2úاc9Ýÿ·?NÇrré¾?NÇrj©–SK±œz|{œ~úüµ=`Çr2ºïÓ±œZªåÔR-'—ûãt,§–j9}¬Ó±œˆj9ÙÜö·éXN|ŽåÔR-'£XNFÏým:–S_x-'—îûÛt,§–j9µËÉ¡Çþ8Ë©O«åÔR-'—^ûãt,§–î·ýq:–“Ñçú8ËÉhýýVË©¨–Sÿøµœ\zìÓ±œŠj9}ìÓ±œZªåÔR-'—îûëTˉ¡c91t,'—žû_Ë©«åÔR-'—^ûët,'£Ûú:ËÉès}^µœŒîûët,§–j9µTËÉ¥Çþ:Ë©«åÔR-'—žûët,§–b99tÿö:ý8ôúµ±ˆ/–“ÑÇþ:ËÉ¥Ïýu:–SK¯ï?©úãÒk}Žåd´Ï<ö×éXN|ÑÇrbéXN.½ö×éXNF·ýu:–“KŸûët,§–j9¹ô\_§c95TËÉ¥ñSªÇrêãj9µTËÉ¥çþ:Ë©¥XNÝ÷ש–SM-'£ï?£úcôØ_§c9õ ¨åÔR-'—^ûët,§>®–“Kýu:–SK±œªåäÐs}¾XÎ÷K_,ç?—~²œÏ_ÿw_-çD¶œW´XΉl9'²åœÈ–óO´YΉl9'²åœÈ–óŠË9‘-çD¶œW´XΉn´œÙrNdËyE¶œÓØrNdËyE‹åœÈ–s"ZÎil9¯h±œÙrNdËyE‹åœÈ–s"[Ήl9¯h±œÙrNdË9‘-ç-–s"[Ήl9¯h±œÙrNDË9-çŸh³œ‰h9ÑrNdË™ˆ–3Ñ{ËùŽiæW¾ž'²åL$Ë™†–s"[ÎD´œ‰h9ÑrNdË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰d9§±åLDË™ˆ–óŠË™ˆ–3ÿ”œˆ–s"[ÎD´œ‰h9'²åLô[”ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9ÝÖ7j±œ‰h9'²åLDË™ˆ–s"[ÎD·ýZ,g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œW´XÎD´œ‰h9ÑrNdË™ˆ–3‘,ç4¶œ‰nûµXÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™ˆ–3Ñs£Ë9-gZÎD´œÙr&¢åLDË™ˆ–óŠË™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD²œÓØr&¢åLDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZÎ+Z,g"ZÎD´œ‰h9'¢åLCË™ˆ–s"[ÎD¿÷7j±œ‰h9'²åLDË™ˆ–3-çD¶œ‰h9ÑrNd˙趿Q‹åLDË9‘-g"ZÎD´œÑr¦¹íO”-gZΉl9Ñr&¢åœÈ–3-g"ZÎD´œW´XÎD´œ‰h9ÑrNdË™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3‘,gZΉh9ÓÐr&¢åLDË9‘-g"ZÎD´œÙr&¢åL$Ë™†–s"[ÎD´œ‰žûµXΉl9Ñr&¢åœÈ–3-g"ZÎD²œW³XÎD²œih9'²åLDË™ˆ–3-çD¶œ‰h9ÑrNDË™†–3Ñû°KAË9‘-g"ZÎD´œÙr&ú½?N‹åLDË9‘-g"YÎ4´œ‰d9§±åLDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™H–3 -çÙr¦¹íoÓb9ÑrNdË™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3‘,gZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰d9§±åL´þ~³åœÈ–3-g"ZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰d9¯f±œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ér¦¡åL$Ë9-g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åL$Ë™†–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"YÎil9í3´œ‰h9¯h±œ‰h9ÑrNdË™ˆ–3-g"ZΉl9Ñr&’åœÆ–3-g¢ñSª‹åœÈ–3-g"ZΉl9Ér¦¡åL$Ë9-g"ZÎD´œ‰h9'²åLDË™ˆ–s"[ÎD´œ‰h9ÑrNDË™†–3-çŸh³œ‰nÿÅrþõÿõÿ†_,çO'?ÕrþtîXN.Årj©–SKµœŒb9Õr2ú=Äè¾>\_,§¾µœZªåäR,'—>÷‡ëXN}\-'—^ûu,§–b99ôØß¨c9µTË©¥ZNFÏý:–SKµœ\zìoÔ±œŠj9}ìoÔ±œŠj9ýÞߨc9¹ôúöFý°t,'–ŽådôÜߨc9µTË©¥ZN.½Ö7êXN Õrr鱿QÇrj©–SKµœŒžûu,§–j9=ö7êXNEµœŒ>ö7êXN} ÿÛߨc9¹tßߨc9µTËÉèc£ŽåäÒçþFÕrj¨–“C¯ý:–SKµœ\ŠåäÒçþFˉ;–“K±œZªåÔR-'£ÇþFË©¨–“ÑÇþFË©oA-§–j9¹ôøöFý¸ôÚߨc9õqµœ\z®oÔ±œªåäÒ}£ŽåÔR-§–j9=ö7êXN-Õrj©–“K¯ý:–“Ñm£Žådô¹¿QÇrê[PËÉ¥çþFˉ¥c9¹ôØß¨c9õq±œªåäÐs£ŽåÔR-'—îûu,§¢ZNFûu,§¾ðZN-Õr2ºïoÔ±œŠj9Ýö7êXN} j9µTË©¥ZN.=¿½Q?-Årj¨–“Ñc}¢ŽåÔP-§–j9¹ôÜŸ¨c9µTËÉèþí‰ú1zíOÔ±œøÂåäÒóÛõãÒçþDËÉè¾?QÇr*ªåÔ^ËÉ¥ÇþDË©¥ZN-Årr蹿Pµœú°ZN=öêXN-Õrj©–“K±œZzüo¡Žåd4–“Ík ŽåÔ×]ËÉ¥çþ@Ë©¨–“Ñ} ŽåÔR-§–j9¹ôبZN ˉ¡ZN6Ïý:–SKµœ\zìÔ±œZªåÔR-'—žûUËÉæ¶¿Oc9õE×rj¦–“ÑÇþ8Ë©¨–S_x-'—îûãt,§–j9µËɡǷÇéÇ¡Ï_Ûv,'£ûþ8Ë©¥ZN-Õrré±?NÇrj©–“ÑÇú8ˉ¨–“Ím›ŽåÄ7àXN-Õr2ŠådôÜߦc9õ…×rr龿MÇrj©–SK±œzìÓ±œú´ZN-Õrréµ?NÇrj©–“KýqªåTSËÉhýýVË©¨–Sÿøµœ\zìÓ±œŠj9}ìÓ±œZªåÔR-'—îûëTˉ¡c91t,'—žû_Ë©«åÔR-'—^ûët,'£Ûú:ËÉès}^µœŒîûët,§–j9µTËÉ¥Çþ:Ë©«åÔR-'—žûët,§–b99tÿö:ý8ôúµ±ˆ/–“ÑÇþ:ËÉ¥Ïýu:–SK¯ï?©úãÒk}Žåd´Ï<ö×éXN|ÑÇrbéXN.½ö×éXNF·ýu:–“KŸûët,§–j9¹ô\_§c95TËÉ¥ñSªÇrêãj9µTËÉ¥çþ:Ë©¥XNÝ÷ש–SM-'£ï?£úcôØ_§c9õ ¨åÔR-'—^ûët,§>®–“Kýu:–SK±œªåäÐs}¾XÎ÷K_,ç?—~²œ~8i³œÙr^Ñb9'²åœÈ–s"[Î?Ñf9'²åœÈ–s"[Î+Z,çD¶œÙr^Ñb9'²åœÈ–s"[Î+²åœÆ–s"[Î+Z,çD¶œÑrNcËyE‹åœÈ–s"[Î+zØrNdË9‘-çD¶œW´XΉl9'²åœÈ–óŠË9‘-çD¶œW´XΉl9'¢åœÆ–óO´YÎD´œ‰h9'‚å|Ç4ó+ßÏ/-g"ZΉl9Ér¦¡åœÈ–3-g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™ˆ–3-çD¶œ‰h9ÑrNdË™ˆ–3-g"YÎil9Ñr&¢å¼¢År&¢åLÄ?%'¢åœÈ–3-g"ZΉl9ýÖ_%¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–s"[ÎD²œih9ÑrNdË™ˆ–3-çD¶œ‰nûµXÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9¯h±œ‰h9Ñr&¢åœÈ–3-g"YÎil9Ñr&¢åLDË9‘-g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'zÐr&¢åLDË™ˆ–s"[ÎD´œ‰h9ÑrNDË™†–3-çD¶œ‰þüŸÛ-g"ZÎ+Z,g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9'²åLDË™ˆ–3-çD¶œ‰h9ÉrNcË™ˆ–3-g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰h9¯h±œ‰h9Ñr&¢åœˆ–3 -g"ZΉl9ýÞߨÅr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–s"ZÎ4·ý‰²åLCË9‘-g"ZÎD´œÙr&¢åLDË™ˆ–óŠË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3Ñm¢Ë™ˆ–s"[ÎD²œih9'¢åLCË™ˆ–3-çD¶œ‰h9ÑrNô åLDË™H–3 -çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åL$Ëy5‹åL$Ë™†–s"[ÎD´œ‰h9ÑrNdË™ˆ–3-çD´œih9½ÿ»´œÙr&¢åLDË9‘-g¢ßûã´XÎD´œÙr&’åLCË™H–s[ÎD´œ‰h9'²åLDË™ˆ–3-çD¶œ‰d9ÓÐr^‘-gšÛþ6-–3-çD¶œ‰h9ÑrNdË™ˆ–3-g"ZΉl9Ér¦¡åLDË9‘-g"ZÎD´œÙr&ºíÓb9ÉrNcË™hýýfË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–s"[ÎD´œ‰h9Ér^Íb9Ñr&¢åLDË9‘-g"ZÎD´œÙr&’åLCË™H–s[ÎD´œ‰h9'²åLDË™ˆ–3-çD¶œ‰h9ÑrNdË™H–3 -g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD²œÓØr&Úgh9Ñr^Ñb9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åL$Ë9-g"ZÎDÿâ§TË9‘-g"ZÎD´œÙr&’åLCË™H–s[ÎD´œ‰h9ÑrNdË™ˆ–3-çD¶œ‰h9Ñr&¢åœˆ–3 -g"ZÎ?Ñf9Ýþ“åüëö»œÙr^Ñb9'²åœÈ–s"[Î?Ñf9'²åœÈ–s"[Î+Z,çD¶œÙr^Ñb9'²åœÈ–s"[Î+²åœÆ–s"[Î+Z,çD¶œÑrNcËyE‹åœÈ–s"[Î+Z,çD¶œÙrNdËyE‹åœÈ–s"[Ήl9¯h±œÙrNdËyE‹åœèö÷—ºE´œÓØrþ‰6Ë™ˆ–3Ñ{ËùŽiίô±ÎD´œ‰h9ÑrNdË™H–3 -çD¶œ‰h9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–s"[ÎD´œ‰h9ÉrNcË™ˆ–3-ç-–3-g"þ)9-çD¶œ‰h9ÑrNdË™è·þ"(-g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD´œÙr&’åLCË™ˆ–s"[ÎD´œ‰h9'²åLtÛߨÅr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDËyE‹åLDË™ˆ–3-çD¶œ‰h9ÉrNcË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9'²åLDË™ˆ–3-çD´œih9ÑrNdË™è¦Y‘ˆ–3-ç-–3-g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD´œÙr&¢åLDË™ˆ–s"[ÎD´œ‰d9§±åLDË™ˆ–3-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åLDË9‘-g"ZÎD´œW´XÎD´œ‰h9ÑrNDË™†–3-çD¶œ‰~ïoÔb9ÑrNdË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË9-gšÛþDÙr¦¡åœÈ–3-g¢çþD-–3-g"ZÎD´œW´XÎD´œ‰h9ÑrNdË™ˆ–3-çD¶œ‰nûµXÎD´œÙr&’åLCË9-gZÎD´œ‰h9'²åLDË™ˆ–s"[ÎD´œ‰d9ÓÐrNdË™ˆ–3-g"ZΉl9Ñr&¢åœÈ–3-g"ZÎD²œW³XÎD²œih9'²åLDË™ˆ–3-çD¶œ‰h9ÑrNDË™†–3Ñû°KAË9‘-g"ZÎD´œÙr&ú½?N‹åLDË9‘-g"YÎ4´œ‰d9§±åLDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™H–3 -çÙr¦¹íoÓb9ÑrNdË™ˆ–3Ñs›Ë™ˆ–3-g"ZΉl9Ér¦¡åLDË9‘-g"ZÎD´œÙr&¢åLDË™H–s[ÎDëï·-çD¶œ‰h9Ñr&¢åœÈ–3-g"ZΉl9Ñr&¢åL$Ëy5‹åLDË™ˆ–3-çD¶œ‰h9ÑrNdË™H–3 -g"YÎil9Ñr&¢åœÈ–3-g"ZÎD´œÙr&¢åLDË9‘-g"YÎ4´œ‰h9'²åLDË™ˆ–3-çD¶œ‰h9ÉrNcË™hŸ¡åLDËyE‹åLDË™ˆ–s"[ÎD´œ‰h9ÑrNdË™ˆ–3‘,ç4¶œ‰h9ý‹ŸR],çD¶œ‰h9=÷×i±œ‰d9ÓÐr&’åœÆ–3-g"ZÎD´œÙr&¢åLDË9‘-g"ZÎD´œ‰h9'¢åLCË™ˆ–óO´YÎD·ÿb9ŸÿMÿÊùø[!~[ž¦’3Í×/ñjä|¿s'vÊ8±SÅùvç âDSÃùö³¾NìTp¾ß9€óýÎñ›hÊ7ß7Go¢)ÞDS»‰¦tóý?{åæû™71S·ù~ç°M4U›ï?«h35›ïgÙ|¿sÄ&v 6ßï¯ù~çpMìTk¢)Ö|ÿYÇj¾ß9T;•šØ)Ô|¿sœæûÃ4ÑTi¾oÒDS£‰&DI…æÛô/@óíΟùÏæ ½Ì/ÌzñTgâ (ÎÔNl¦vB3±S™‰ÀLÍÄeb¦,;U™j‚2õY1™Ø)ÉÄNE¦v2µ‰¦SMþŒ«&M-¦šPLü³Wbj'M¦šûö}Q˜øš‹0±Sƒ©LíŒÀÄL&fê/µ~ù~çèK5Á—ï?ëØKí„^b§ò;…—jâ.Ñ”]ªù=e£æ¾=E_Ì%þÙK.±Sq©€Kí|®¯Îá–ø¬jKí¼ÖWçXKì„Zjæ±¾:Zb§Î;e–jžë«s%vj,µóX_#,ÑXªùX_Ã+ÑTWªù½¾:ÇVjçõíÕùçΑ•ïw¬Tó\_Ã*±SU‰¢Jí¼¶WçJÌTTjç±¾:ÇSb§œ;Õ”jžë«s,%vJ)Õ<ÖWç@J4u”j>ÖWç(Jü³Qb§†R;÷õÕ9‚;”j>ÖWçðIí|®¯Nñ$fj'5óZ_#'±S8©¸Ií|®¯ÎQ“ï?ë IíÄLb§d;“jë«s¼$šrI5ë«s°$þÙk%±S*©Ç·Wç§×úê'‰Ï*“ÔÎs{u’ÄL¤vîë«s„$v $±S©æ±¾:GGb§8;µ‘Úy­¯Î‘‘jnë«s\¤šÏõÕ9*ÿìE‘Úy®¯Î!‘ïwŽˆÔÎc}uއÄg…Cb¦R3ÏõÕ9;¥Ú¹¯¯Îhê Õ|¬¯ÎQøš‹ ±S©æ¾¾:G@¢)€Ts[_ÃñÏ^ýˆâGìÔ>jçùíÕùaç9ò3…jÛ£sØ#fª±Sô¨çúèòˆŠG5÷oÎOÍk}tw|ÿ5í¨ç·Gç§ÏõÑ9ÔQÍ}}ttDS爯¹ÌQ;õÑ9È;5ŽØ qÔÌs}s ñIõšy¬oÎÑØ)nÄNm£vB±SÙˆÂF5㕼Ö'ç¨F|ÉEÚy®OÎ!h*ÕÜ×'çxFì”3b§šQ;õÉ©e|?s(ãû™JF%ÏõÉ9Ž;eŒÚy¬OÎAŒØ©aÄN £vžë“SÀ¨ä¶¾8ÃñõV/b¤xQÍÇúܺˆ¦r_sá¢vîëssØ"vª±´¨™Ç·çæ§™Ï_Ë‹tÄ¢šûúܯˆrEìT+jç±>7Ç*b§TQÍÇöܨø¾©STr[_›£ßÿ“¤ˆE5!Šjžëks€"¾æúDíÜ×׿èDì'b'6Q3õ¹92U˜ˆºDí¼Öçæ¨Dì%jç±>7%‰H*Õl¿½êÑ<ÿ÷í¹ù៻Q;õ¹9M)¢šõ¹9;uˆØ)CÔÎ}}oŠßÏü¿Öþ¦ÉòëÌî³çø˜ tåªVBݹlß›âNúAœi>¨3×Ý{ó.|xç];øó;Ÿµƒ÷Ÿ$—Ýdw y2ˆ;AÜ âä6;AÜ âdw y2ˆ;AÜäÈ î@q2ˆ;ƒ¸ÃÈ î@òdw ƒ´ÃÈAÞ âdw y2ˆ;AÜ âä ï@q2ˆ;AÜäÈ î@qrw ƒ¸¤Èî@ˆ;Âüž‡,z<¹w ‹´Y¤È"í@q²;5Ú âd‘v ‹´Y¤È î@i²H;EÚ âd‘v ‹´ÄÈ"í@i²H;AÜ,Òd‘v ƒ¸Y¤È"í@a2†;EÚ,Òä ï@i²Hÿ†"í@q²H;EÚ âdÑÓ—Çÿ©"í@i2ˆ;EÚ,Òd‘v ƒ¸Y¤È"í@q²;5Ú,Òdw ‹´Y¤È «v ‹Nû7Ê;EÚ âd‘v ‹®û7Ê;EÚ,Òd‘v y²H;EÚ,Òdw ‹´Y„Èî@i²H;EÚ âd‘v ‹´ÄÈ"í@i²H;AÜ,Òd‘v ƒ¸Y¤È"í@i2ˆ;EÚ,Òd‘v ƒ´Y£È"í@q²H;EÚ,Òä ï@i²H;AÜ,Òd‘v ‹´ÄÈ"í@i2ˆ;EÚ,Òd‘v ƒ¸Y¤È"ì@Æp²H;EÚ,Òdw ‹ž÷o”w ‹´ÄÈ"í@i2ˆ;EÚ,Òd‘v ƒ¸Y¤È"í@òd‘v ‹´Y¤È í@Öh²H;AÜ,zÚ¿QÞ,Òdw ‹´Y¤È"í@q²H;EÚ âd‘v ‹´Y¤È î@i²H;AWì@ÖœöOw k´ÄÈ"í@]÷O”w ‹´Y¤È"í@òd‘v ‹´Y¤È î@i²H;AÜ,Òd‘v ‹´ÄÈ"ì@Öh2H;5Ú,Òd‘v ƒ¸Y¤È"í@q²H;EجÑdw ‹´Y¤È"í@q²H;EÚ âd‘v ‹´Y„È1Þ,Âdv ƒ¸Y¤È"í@i2ˆ;EÚ,Òdv k´Yôð_Î_¡È î@i²H;AÜ,zÚ?NÞ,Òdw ‹°Y£È"ì@Æp²H;EÚ âd‘v ‹´Y¤È î@a²F;ƒ¸YsÚ¿MÞ,Òdw ‹´Y¤È î@i²H;EÚ âdv k´Y¤È î@i²H;AÜ,Òd‘v ‹°ÃÈ¢íÏ7î@]µY¤È"í@i2ˆ;EÚ,Òdw ‹´Y¤È"ì@Žñd‘v ‹´Y¤È î@i²H;AÜ,Âdv ‹°ÃÈ"í@i2ˆ;EÚ,Òd‘v ƒ¸Y¤È"í@q²;5Ú,Òdw ‹´Y¤È"í@q²H;EØŒádÑþŒv ‹´9È;EÚ,Òdw ‹´Y¤È"í@q²H;EØŒád‘v ‹~Áw©z2ˆ;EÚ,Òdw ‹°Y£È"ì@Æp²èyßQx²H;AÜ,Òd‘v ƒ¸Y¤È"í@i2H;5Ú,Òä6;E§_µùm[ÎAn9´i9¹åä–s[Î7´k9¹åä–s[ÎmZÎAn9¹å<Цåä–s[ÎAn9ä–sŒ[ÎAn9´i9¹åÄ–sŒ[ÎmZÎAn9¹å<Цåä–s[ÎAn9´i9¹åä–s[ÎmZÎAn9¹å<Цåä–s[Î1h9ešo¿'Ïwˆ-g[ÎAn9ƒØr±å bË9È-gZζœƒÜr±å bËÄ–s[Î ¶œAl9ƒØrrËÄ–3ˆ-ç ·œAl9ƒØr±åä–3ˆ-g[ÎAn9ƒØr±å RË9Æ-g[Î ¶œÚ´œAl9ƒø«ä ¶œƒÜr±å bË9È-gГþAP[Î ¶œƒÜr}üuò§—Ør±åä–3ˆ-g[ÎAn9ƒÔrưå bË9È-g[Î ¶œƒÜröoÔ¦å bË9È-g[Î ¶œƒÜr±å bËÄ–ó@›–3ˆ-g[Î ¶œƒÜr±å RË9Æ-g[Î ¶œAl9¹å bËÄ–s[Î ¶œAl9ƒØrrËÄ–3躣6-g[Î ¶œAl9¹å bËÄ–3ˆ-ç ¶œ1l9ƒØrrËÄ–3ˆ-g[ÎmZÎ ¶œAl9¹å bËÄ–3ˆ-ç ·œAl9ƒØrrËÄ–3ˆ-g[ÎAn9ƒØr©åã–3ˆ-g[Î ¶œƒÜr=ïߨMËÄ–s[Î ¶œAl9¹å bËÄ–3ˆ-ç ·œAl9ƒØrhÓr±å bËÄ–s[ζœAl9¹å zÚ¿Q›–3ˆ-ç ·œAl9ƒØr±åä–3ˆ-g[ÎAn9ƒØr±å bË9È-g[Î ¶œƒØrÆœöO”[ζœƒÜr±å bË9È-g[Î ¶œAl9´i9ƒØr±å bË9È-g[Î ¶œƒÜr±å bËÄ–s[Î µœ1l9±åŒaËÄ–3ˆ-ç ·œAl9ƒ®ú–¯An9ƒØr©åŒaË9È-g[Î ¶œAl9¹å bËÄ–s[Î ¶œAl9ƒÔrfÓr©åŒaË9È-g[Î ¶œAl9¹å bËÄ–s[ζœA¿Á.‚-ç ·œAl9ƒØrrËô´œ6-g[ÎAn9ƒÔrưå RË9Æ-g[Î ¶œƒÜr±å bËÄ–s[Î µœ1l9ä–3æ´›6-g[ÎAn9ƒØr±åä–3ˆ-g[Î ¶œƒÜr©åŒaËÄ–s[Î ¶œAl9¹å bËÄ–3H-ç·œAÛŸon9¹å bËÄ–3ˆ-ç ·œAl9ƒ®ûÇiÓr±å bˤ–ó0›–3ˆ-g[Î ¶œƒÜr±å bË9È-gZζœAj9Ǹå bËÄ–s[Î ¶œAl9ƒØrrËÄ–3ˆ-ç ·œAj9cØr±åä–3ˆ-g[Î ¶œƒÜr±å RË9Æ-gÐþ [Î ¶œÚ´œAl9ƒØrrËÄ–3ˆ-g[ÎAn9ƒØr©åã–3ˆ-gÐ/ø.ÕMË9È-g[Î ¶œƒÜr©åŒaˤ–sŒ[Î ¶œAl9ƒØrrËÄ–3ˆ-ç ·œAl9ƒØr±åÄ–3†-g[Î7´k9ƒN¿¦å|ý'ïSÎÏ?Ç´äül8ô0+ä||guœ¸ÓŒwZq>¼ó.â„iÃùðc½K8q§çã;+à||gõ›0Í7›UoÂ4Þ„i» Ótóñ½åæã3+ÜÄ™v›ï¬l¦ÕæãÕhgÚl>>³’ÍÇwV±‰;¯†o~è«×||g嚸ÓZ¦±æãµZÍÇwVª‰;-5q§¡æã;«Ó||geš0­4›i´ф¹|ytæA}9¿_³Í‡_wæÃÿ®Ï”¹~Ù~¬Ö™¸Ó8Sw._6?ߥ™¸Ó2wfêLºLœi–‰;­2eeêc¥ÉÄ&™¸Ó"SwdêNzL˜æ˜2ù5®Ì ƒõcÚbÊ$ÅĽ%¦î$Ä„i‡)sÞ=Eï*L|Î0q§ ¦î$ÁÔ—/»Ÿ† 0q¦ý¥î$¿||gÕ—2‰/¬Õ^êNÒKÜiy‰; /eÒ]Â4»”yšd#s~ø-“æ?ö&—¸ÓâRw\êÎËöÕY¹%>VkKݹm_ÕZâNRK¹l_ZâN;KÜif)sݾ:+²Ä6–ºsÙ¾:«°„i`)ó¼}uV^ ÓºRæiûꬶRwn^ŸßYeåã;+¬”¹n_•UâN«JÜiT©;·Ý«³’JœiQ©;—í«³zJÜiN‰;­)e®ÛWgµ”¸Ó”Ræ²}uVH ÓŽRæyûꬊ?öF”¸Ó†RwÎÛWg”¸Ó€Ræyûê¬|Rw^¶¯NãIœi;©3·í«³ÊIÜi8©;é&uçeûê¬jòñÇZѤÄ&“¸ÓbRæ²}uV/ Ó\Ræyûê¬X?ö¶’¸ÓTRw.^Ïîܶ¯Îê$ñ±šIêÎu÷ê¬HgÚHêÎyûê¬BwHâNûH™ËöÕYu$î4ŽÄ¶‘ºsÛ¾:oÿgw§a¤LºH™—í«³ªHüØEêÎuûê¬$òñUDêÎeûê¬+9$δ†Ô™ëöÕY-$î4…ÔóöÕY!$L;H™çí«³*H|Î q§ ¤Ìyûꬦ¤Ìiûê¬ü?öÖ¸ÓøwÚ>êÎõëóÉ”8ÓðQæ²{tVöˆ3­q§Ñ£î\·ÎJq§Å£Ìùãó™¹m•;>þœWí¨;×Îgw^¶ÎJeÎÛGg…Ž0íñ97sÔËöÑY‘#î´qÄ$Ž:sݾ9 ñ‘Ú7êÌeû欺w7âNÛFݹÎw@áNËFÜiØ(3]£Èmû䬪Ÿr£FݹnŸœ•4´h”9oŸœÕ3âNsFÜiͨ;—í“Ó–ññ™•2>>Ó’Qäº}rVLj;Íuç²}rVĈ;mq§ £î\·ONF‘ÓöÅ™|ŸoëEi¼(ó¼}nVºÓrŸsÃEÝ9oŸ›•-âN«EÜI´¨3—ÏÍgg^¾l^¤U,Êœ·ÏÍêqçõÿìî´VÔËö¹Y­"î4U”yÞ=7+T|lÚ)Šœ¶¯ÍªÿÈW¤ˆ;me’(Ê\·¯Í ñ9·OÔóöµYu"î4NÄ´‰:sÙ>7«Lćj˜ˆ;íuç¶}nV•ˆ;uç²}nš$‚´H”ÙýôjÓ?îÖˆºsÙ>7«E„iŠ(ó¼}nVˆˆ;íq§¢îœ·ïM#ÄÇgVƒøøÌJuçºýÅú ñ±ÚâNóCݹmߛʜvïÍJe^vïÍ­á¡ÌyûÞ¬ìwZâN£Cݹlß›•âcµ8ćºsݾ7+7ÄÔ†:sþðÞ|væöeó-üïRC™çí{³BCÝyÙ¾7+3ÄÛÇïÀüìÎm÷Þ¬ÆPf{ä²}oV`øøó]}áã;+/ÔÛö½Yq¡ÌiûÞ¬´Pw^¶ïÍ q§]¡î\wïͪ q¦Q¡îì¿ûr%…øX- q§A¡î\·ïÍÊ q'5¡Îœ·ïM[B¦„2¿÷ò3sÙ¾7«#ļ!î´"ÔÛö½Y !>VBݹlß›âNúAœi>¨3×Ý{ó.|xç];øó;ŸµƒÏ_¾]w;AÜäÈ î@q2ˆ;Úì@q2ˆ;AÜäÈ î@qrw ƒ¸ÄÈ î@âd w ƒ¸9È;AÜ Òd w y2ˆ;AÍ qÉ;AÜ âdw y2ˆ;AÜ âä ï@q2ˆ;ƒ¼„ÈGáüž‡ŒÁ8dÐf²H;EÚ âd‘v ‹´Y¤È î@a²F;AÜ,Òd‘v ‹´ÄÈ"í@i²H;AÜ,Òd‘v ƒ¸Y¤È"í@i2ˆ;EÚ,ÒdÐM;EÚ,Òdv c¸Y¤È"í@òd‘v ‹ôoØ)Òdw ‹´Y¤È î@=}yü/‘*Òd‘v ƒ¸Y¤È"í@i2ˆ;EÚ,Òdw ‹°Y£È"í@q²H;EÚ âdÑiÿFy²H;AÜ,Òd‘v ƒ¸Y¤È"í@irw ‹´Y¤È"í@q²H;EØŒád‘v ‹´Y¤È î@i²H;AÜ,Òd‘v ‹´ÄÈ"í@]÷o”w ‹´Y¤È"í@q²H;EÚ,Òdv k´Y¤È î@i²H;EÚäÈ"í@i2ˆ;EÚ,Òd‘v ƒ¸Y¤È"í@q²H;EÚ,Òdw ‹´Y„Èî@i²H;EÚ âd‘v ‹´Y¤È î@i²H;A¯ÿëÎöw ‹´Y¤È î@i²H;ƒ¼Y¤È"í@i2H;5Ú,Òdw ‹žöo”w ‹´ÄÈ¢çýåÈ"í@q²H;EÚ âd‘v ‹´Y¤È î@i²H;AÚ¬9íŸ(î@Öh2ˆ;EÚ,Òdw ‹´Y¤È"í@òd‘v ‹´Y¤È î@i²H;AÜ,Òd‘v ‹´ÄÈ"ì@Öh2H;5Ú,Òd‘v ƒ¸Y¤È¢+þuñAÜ,Òdv k´ÄÈ"í@i²H;AÜ,Òd‘v ƒ¸Y¤È"í@arŒw ‹°Y£È î@i²H;EÚ âd‘v ‹´¤Èí@=ü—óWh2ˆ;EÚ,Òdw ‹žö“w ‹´ÄÈ¢çíãäÈ"ì@Æp²H;EÚ jX©KÜ,Òd‘v ƒ¸Y„Èí@âdÍiÿ6y²H;AÜ,Òd‘v ƒ¸Y¤È"í@i2ˆ;EجÑd‘v ƒ¸Y¤È"í@q²H;EÚ,Âd w ‹¶?߸ÄÈ"í@i²H;AÜ,Òd‘v ƒ¸Y¤È"í@arŒw ‹´Y¤È"í@q²H;EÚ âdv k´Y„Èî@i²H;AÜ,Òd‘v ‹´ÄÈ"í@i2ˆ;EجÑd‘v ƒ¸Y¤È"í@i2ˆ;EÚ,Âd w ‹ög´Y¤ÈAÞ,Òd‘v ƒ¸Y¤È"í@i2ˆ;EÚ,Âd w ‹´Yô ¾KÕ;AÜ,Òd‘v ƒ¸Y„Èí@a2†;EÚ,Òd‘v ƒ¸Y¤È"í@Ý´Y¤È"í@i2H;5Ú,Òä6;E§_µy}ý>‘]Ë9È-ç6-ç ·œƒÜrrËù†v-ç g¶œƒÜrrËy MË9È-ç ·œÚ´œƒÜrrË9È-çÜrŽqË9È-ç6-ç ·œƒØrŽqËy MË9È-ç ·œÚ´œƒÜrrË9È-ç6-ç ·œƒÜrrËy MË9È-ç ·œRËù(ÓœßçBl9Ǹå|C»–3ˆ-g[ÎAn9ƒØr±å bË9È-gZζœƒÜr±å bËÄ–s[Î ¶œAl9ƒØrrËÄ–3ˆ-ç ·œAl9ƒØr±åä–3ˆ-g[ÎAn9ƒØr±å RË9Æ-g[Î ¶œÚ´œAl9ƒø«ä ¶œƒÜr±å bË9È-gГþAP[Î ¶œƒÜr±å bËÄ–s[Î ¶œAl9¹å RËÖ3ˆ-ç ·œAl9ƒØrrËtÚ¿Q›–3ˆ-ç ·œAl9ƒØrrËÄ–3ˆ-g[ÎmZΠçýµi9ƒØrrËÄ–3H-ç·œAl9ƒØr±åä–3ˆ-g[ÎAn9ƒØr±å bË9È-g[Î ¶œƒÜr±å bËÄ–s[Î ¶œAl9ƒØrbËÖ3ˆ-ç ·œAl9ƒØr±å<Цå bËÄ–s[Î ¶œAl9ƒØrrËÄ–3ˆ-ç ·œAl9ƒØr±åä–3ˆ-gZÎ1n9ƒØr±å bË9È-g[Î ¶œAl9¹å bËÄ–s[Î ¶œAl9ƒØrrËÄ–3躣6-g[Î ¶œAl9±åŒaËÄ–s[Π§ýµi9ƒØrrËô¼£6-g[ÎAn9ƒØr±åä–3ˆ-g[Î ¶œƒÜr±å bË9ˆ-gÌiÿD¹åŒaË9È-g[Î ¶œƒÜr±å bËÄ–ó@›–3ˆ-g[Î ¶œƒÜr±å bË9È-g[Î ¶œAl9¹å RËÖs[ζœAl9ƒØrrËÄ–3ˆ-ç ·œAl9ƒÔrưåä–3ˆ-g[Î ¶œƒÜr±å bË9È-g[Î ¶œAj9³i9ƒÔrưåä–3ˆ-g[Î ¶œƒÜr±å ºî(·œ1l9ƒƒ][ÎAn9ƒØr±åä–3èiÿ8mZÎ ¶œƒÜr©åŒaˤ–sŒ[Î ¶œAl9¹å bËÄ–3ˆ-ç ·œAj9cØrÈ-gÌiÿ6mZÎ ¶œƒÜr±å bË9È-g[Î ¶œAl9¹å RËÖ3ˆ-ç ·œAl9ƒØrrËÄ–3ˆ-gZÎ1n9ƒ¶?ßÜrrËÄ–3ˆ-g[ÎAn9ƒØr±åä–3ˆ-g[Î µœ‡Ù´œAl9ƒØr±åä–3ˆ-g[ÎAn9ƒÔrưå RË9Æ-g[Î ¶œƒÜr±å bËÄ–s[Î ¶œAl9¹å RËÖ3ˆ-ç ·œAl9ƒØr±åä–3ˆ-gZÎ1n9ƒögØr±å<Цå bËÄ–s[Î ¶œAl9ƒØrrËÄ–3H-ç·œAl9ƒ~Áw©nZÎAn9ƒØr±åä–3H-g [Î µœcÜr±å bËÄ–s[Î ¶œAl9¹å bËÄ–3ˆ-ç ¶œ1l9ƒØr¾¡]Ëtú5-çËÛ¯6-g[ÎAn9ƒØr±å bËy MËÄ–3ˆ-g[ÎAn9ƒØr±åä–3ˆ-g[Î ¶œƒØrưå bË9È-g[Î µœ1l9¹å bËÄ–s[Î ¶œAl9ƒØrrËÄ–3ˆ-g[ÎAn9ƒØr¡å|iÎïé±Î ¶œAj9cØrhÓr©å,RËÄ–³H-g‘ZÎ"µœAl9‹ÐrÖ¨å bËY¤–³H-g‘ZÎ ¶œEj9‹Ôr©å bËY¤–³H-g[Î"µœEj9‹Ôr±å,RËY¤–3ˆ-g‘ZÎ"µœEh9cØr©å,ºâ¢ä–³H-g‘~•\¤–3ˆ-g‘ZÎ"µœAl9‹žð‚ŠÔr©å bËY¤–³H-g‘ZÎ ¶œEj9‹Ôr±å,BËY£–³H-g[Î"µœEj9ƒØröo”[Î"µœAl9‹Ôr©å bËY¤–³H-g‘ZÎAn9‹Ôr©å,RËÄ–³H-gZζœEj9‹Ôr©å bËY¤–³H-g[Î"µœEj9‹Ôr±å,RËY¤–3ˆ-g‘ZÎ"µœEj9ƒØr©å,RËY¤–3H-gZÎ"µœAl9‹Ôr©å,RË9È-g‘ZÎ"µœAl9‹Ôr©å,RËÄ–³H-g‘ZÎ ¶œEj9‹Ôr©å bËY¤–³-g [Î"µœEj9‹Ôr±å,RËY¤–³H-g[Î"µœEj9ƒØr©å,RËY¤–3ˆ-g‘Z΢ëþrËY¤–³H-g‘ZÎ µœ5j9‹Ôr±å,zÚ¿Qn9‹Ôr±å,RËY¤–³H-g[Î"µœEj9ƒØr©å,RËY¤–3ˆ-g‘ZÎ"µœAj9kNû'Š-gZÎ ¶œEj9‹Ôr½¨å,RËY¤–³H-ç ·œEj9‹Ôr©å bËY¤–³H-g[Î"µœEj9‹Ôr±å,BËY£–3H-gZÎ"µœEj9ƒØr©å,RËÄ–³H-gZεœAl9‹Ôr©å,RËÄ–³H-g‘ZÎ ¶œEj9‹Ôr¡åã–³-gZÎ ¶œEj9‹Ôr©å bËY¤–³èº ØrÖ¨å,zø vj9ƒØr©å,RËÄ–³èiÿ8¹å,RËÄ–³-gZÎ"´œ1l9‹Ôr©å bËY¤–³H-g‘ZÎ ¶œEh9kÔrbËYsÚ¿Mn9‹Ôr±å,RËY¤–3ˆ-g‘ZÎ"µœEj9ƒØr¡å¬QËY¤–3ˆ-g‘ZÎ"µœAl9‹Ôr©å,BËÖ³hûó-g[Î"µœEj9‹Ôr±å,RËY¤–3èE-g‘ZÎ"µœEh9Ǹå,RËY¤–³H-g[Î"µœEj9ƒØr¡å¬QËY„–3†-g‘ZÎ"µœAl9‹Ôr©å,RËÄ–³H-g‘ZÎ ¶œEh9kÔr©å bËY¤–³H-g‘ZÎ ¶œEj9‹Ðrưå,ÚŸQËY¤–s[Î"µœEj9ƒØr©å,RËY¤–3ˆ-g‘ZÎ"´œ1l9‹Ôrý‚ïRuËÄ–³H-g‘ZÎ ¶œEh9kÔr¡åŒaËY¤–³H-g‘ZÎ ¶œEj9‹Ôr±å,RËY¤–³H-gZεœEj9´i9‹N¿ªå|~ýÃó®å¼¼fˆOjËôwŸä^ÚrâÒj9u©-§.µå||é]Ë)Ô–óñ‡{×rêR[N\Z-'.­–S¨-'Ðj9…Úr µåjˉ/A[NZ-§µåÄ¥Õr µåćkË©Cm9qhµœ¸´ZN]jˉK«åÄ¥ÕrêR[N¡¶œøp«åÄ¥ÕrêR[N]jˉK«åÄ¥Õrþ=Ê4ç÷là‰ó«åjË)”–S¦-çã/Ë»–óñ¥w-'Q~…¬×–S—ÚròRZN^JË©Km9u)-'¥åÔ¡¶œºÔ–“(-'?\ZN]jË©Km9y)-'/¥åjËI”_!¥åjËI”–S_‚¶œ¼”–S¨-'Ñyûp½k9õ‰·åÔ¥¶œ¼”–“—¦åÔ¡¶œ:Ô–“—ÒrâÒj9‰Òrâí–“—ÒrêR[N]jËI”–S¨-'ÑÓüƒ ¢óöz×rêKЖS—ÚròRZN^zÙ¿Q«åÔ‡kËÉK·ýµZN]JËÉC—ýµZN]jË©Km9‰®û7jµœºÔ–“—.û7jµœBm9‰ž÷oÔj9…^¾îߨÕrêKЖ“—nÞ¨O.­–—VËItÝ¿Q«åÔ¥¶œºÔ–“—nÛ7jµœ:Ô–“—.û7jµœºÔ–S—Úr]÷oÔj9u©-'ÑeÿF­–S¨-'ÑóþZ-§¾m9u©-'/÷oÔj9u©-'ÑóþZ-'/½ìߨ¶œ:Ô–“‡nû7jµœºÔ–“—ÒròÒËþZ-'>Üj9y)-§.µåÔ¥¶œD—ýµZN¡¶œDÏû7jµœú´åÔ¥¶œ¼tùðF}zé¶£V˩ז“—®Û7jµœ:Ô–“—Îû7jµœºÔ–S—Úr]öoÔj9u©-§.µåä¥ÛþZ-'ÑiÿF­–“èeÿF­–S_‚—çýµZN\Z-'.­–“—.û7jµœúpi9u¨-']÷oÔj9u©-'/÷oÔj9…Úr=ïߨÕrêoË©Km9‰Îû7jµœBm9‰Nû7jµœú´åÔ¥¶œºÔ–“—®Þ¨Ï.¥åÔ¡¶œD—íµZNjË©Km9y麢VË©Km9‰Îž¨OÑmÿD­–Ÿøj9yéúá‰úôÒËþ‰Z-'ÑyÿD­–S¨-§>ñ¶œ¼tÙ?Q«åÔ¥¶œº”–“‡®ûª-§>X[Nºì_¨ÕrêR[N]jËÉKi9u©-§.µå$š–“æ¶ V˩ϻ-'/]÷Ôj9…Úr÷Ôj9u©-§.µåä¥ËþjˉC«åÄ¡¶œ4×ýµZN]jËÉK—ýµZN]jË©Km9y麠ÚrÒœöïÓ´œú¤ÛrêL[N¢çýã´ZN¡¶œúÄÛròÒyÿ8­–S—ÚrêRZNº|xœ>=ôòe÷€­–“輜VË©Km9u©-'/]öÓj9u©-'ÑóöqZ-'P[NšÓþmZ-'¾«åÔ¥¶œDi9‰Òr µåÔ'Þ–“—Îû·iµœºÔ–S—ÒròÐeÿ8­–S­-§.µåä¥ÛþqZ-§.µåä¥ËþqjË)Ó–“hûó­-§P[NýðÛròÒeÿ8­–S¨-'ÑóþqZ-§.µåÔ¥¶œ¼tÞ¿Nm9qhµœ8´ZN^ºîÿáÀj9õáÚrêR[N^ºí_§Õr¶¯Ój9‰^¶¯Ó­-'Ñyÿ:­–S—ÚrêR[N^JËIô²VË©Km9yéºVË©Ki9yèüáuúôÐíË.‹x×r=ï_§ÕròÒËþuZ-§.Ý>~§ê§—nÛ×iµœDû3—ýë´ZN|Ò«åÄ¥ÕròÒmÿ:­–“è´VËÉK/û×iµœºÔ–“—®Û×iµœ:Ô–“—~Áw©®–S®-§.µåä¥ëþuZ-§.¥åä¡óþujË)Ó–“èã÷¨~Š.û×iµœú´åÔ¥¶œ¼tÛ¿N«åÔ‡kËÉK—ýë´ZN]JË©C/Ïû×iµœ/½k9_z×rþüÒg-çÛ÷Æîv9y—ó@/Þåä]ÎAÞåä]Î7´Ûåä]ÎAÞåä]Îmv9y—sw9´Ùåä]ÎAÞåä]Îy—sŒw9y—ó@›]ÎAÞåÄ]Î1Þå<Ðf—sw9y—ó@›]ÎAÞåä]ÎAÞå<Ðf—sw9y—sw9¤]ÎG™æüžë„±Î¢Í.ç ïrâ.çïr¾¡Ý.gw9ƒ¸Ë9È»œAÜå â.gw9y—3H»œ1Üåä]Î îrq—3ˆ»œƒ¼Ëô¬=™ îrq—sw9ƒ¸ËÄ]ÎAÞå â.gw9ƒ¸Ë9È»œAÜå â.ç ïrq—3ˆ»œAÚåã]Î îrq—ó@›]Î îrñßxÄ]ÎAÞå â.gw9y—3èé þ¥^AÜå â.ç ïrq—3ˆ»œAÜåä]Î îrq—sw9ƒ´ËÃ]Î îrò.gw9ƒ¸Ë9È»œA§ýµÙå â.ç ïrq—3ˆ»œƒ^¸ËÄ]Î îrq—ó@›]Î îrq—3ˆ»œƒ¼ËÄ]Î írŽñ.gw9ƒ¸ËÄ]ÎAÞå â.gw9y—3ˆ»œAÜå â.ç ïrq—3ˆ»œƒ¼ËÄ]Î îrq—sw9ƒ¸ËÄ]Î îrâ.g w9ƒ¸Ë9È»œAÜå â.gw9´Ùå â.gw9y—3ˆ»œAÜå â.ç ïrq—3ˆ»œƒ¼ËÄ]Î îrq—sw9ƒž÷o”w9Çx—3ˆ»œAÜå â.ç ïrq—3ˆ»œAÜåä]Î îrq—sw9ƒ¸ËÄ]Î îrò.gw9ƒ¸Ëy Í.gw9ƒ¸ËÄ]ÎAÜåŒá.gw9y—3èiÿFmv9ƒ¸Ë9È»œAÜå â.gw9y—3ˆ»œAÜåä]Î îrq—3ˆ»œƒ¼ËÄ]Π«þõȃ¸ËsÚ?QÞåŒá.ç ïrq—3ˆ»œƒ^¸ËÄ]Î îrq—ó@›]Î îrq—3ˆ»œƒ¼ËÄ]Î îrò.gw9ƒ¸ËÄ]ÎAÞå Ò.g w9q—3†»œAÜå â.ç ïrq—3ˆ»œƒ¼ËÄ]Î írÆp—sw9ƒž÷Ôf—3ˆ»œƒ¼ËÄ]Î îrò.gw9ƒ¸Ë¤]ÎÃlv9ƒ´ËÃ]ÎAÞå â.gw9ƒ¸Ë9È»œAÜå â.ç îrÆp—3èñXBw9y—3ˆ»œAÜåä]Π§ýã´Ùå â.ç ïri—3†»œAÚåã]Î îrq—sw9ƒ¸ËÄ]Î îrò.gv9c®ûÇÉ»œ1§ýÛ´Ùå â.ç ïrq—3ˆ»œƒ¼ËÄ]Î îrq—sw9ƒ´ËÃ]Î îrò.gw9ƒ¸Ë9È»œAÜå â.gv9Çx—3hûóÍ»œƒ¼ËÄ]Î îrq—sw9ƒ¸ËÄ]ÎAÞå â.gw9ƒ´Ëy˜Í.gw9ƒ¸ËÄ]ÎAÞå â.gw9y—3H»œ1Üå Ò.çïrq—3ˆ»œƒ¼ËÄ]Î îrq—sw9ƒ¸ËÄ]ÎAÞå Ò.g w9ƒ¸Ë9È»œAÏû×i³ËÄ]ÎAÞå â.gv9Çx—3h†»œAÜå<Ðf—3ˆ»œAÜåä]Î îrq—3ˆ»œƒ¼ËÄ]ΠëöuÚìrq—3è|—êf—sw9ƒ¸ËÄ]ÎAÞå Ò.g w9ƒ´Ë9Æ»œAÜå â.gw9y—3ˆ»œAÜåä]Î îrq—3ˆ»œƒ¸ËÃ]ΠëöuÚír~Å.çó×·ÿ­Ã-g‘ZÎ ¶œEj9‹Ôr©åä–³H-g‘ZÎ"µœAl9‹Ôr©å bËY¤–³H-g‘ZÎ µœ5j9‹®h9ƒØr©å,BËY£–3ˆ-g‘ZÎ"µœAl9‹Ôr©å,RËÄ–³H-g‘ZÎ"´œŸgšù=x.¤–³H-g[Î"µœEh9kÔrr˹ZÎ…Ðr©å\-çBh9BËY¤–s¡Ç-ç2h9‹Ôr.„–s!´œ ¡å,R˹ZÎ…Ðr.„–³H-çBh9BËY¤–s!´œ ¡å\-g‘ZÎ…Ðr.„–³H-çBh9B˹Ðã–³F-çBh9BËÄ–s!´œ áWÉ ¡å,R˹ZÎ…Ðr©å\èéñ?Z-çBh9‹Ôr.„–s!´œ ¡å,R˹ZÎ…Ðr©å\èq˹ ZÎ…Ðr©å\-çB×ýÅ–s¡Óþb˹ZÎ"µœ ¡å\-g‘ZÎ…Ðr.„–s!´œAl9B˹ZÎ…Ðr©å\-çB[εœ ¡å\-çBh9‹Ôr.„–s!´œEj9B˹ZÎ…Ðr©å\-çBh9‹Ôr.„–s!´œ ¡å,R˹ZÎ…Ðr.„–³-ç2h9BËY¤–s!´œ ¡å\-g[Î…Ðr.„–³H-çBh9B˹ZÎ"µœ ¡å\-g‘ZÎ…Ðr.„–s!´œEj9B˹Ðã–³F-çBh9B˹ZÎ"µœ ¡å\-çBh9‹Ôr.„–s!´œEj9B˹ZÎ…Ðr©å\-çBh9ƒØr.„–s!´œ ¡å,B˹ ZÎ…Ðr©å\èiÿF±å\-g‘ZÎ…Ðr.„–s!´œEj9B˹ZÎ"µœ ¡å\-çBh9‹Ôr.„–s¡ëãÿI½-ç2§ý¥–s´œEj9B˹ZÎ"µœ ¡å\-çBh9ƒØr.„–s!´œ ¡å,R˹ZÎ…Ðr©å\-çBh9BËY¤–s¡Ç-ç2h9‹Ðr.ƒ–s!´œ ¡å,R˹ZÎ…Ðr©å\-çB[ÎeÐr©å\-çBh9BËY¤–s!´œ ¡å,R˹ZÎ…Ðr.ô¸åŒa˹Ðã–s´œEj9B˹ZÎ…Ðr©å\-çBh9‹Ðr.ƒ–s¡Gß`·ZÎ"µœ ¡å\-g‘ZÎ…žö[Î…Ðr©å\èq˹ ZÎ…·œ5j9B˹ZÎ"µœ ¡å\-çBh9‹Ôr.ô¸å\-gZÎeNû·‰-çBh9‹Ôr.„–s!´œEj9B˹ZÎ…Ðr©å\èq˹ ZÎ…Ðr©å\-çBh9‹Ôr.„–s!´œ =n9kÔr.´ýù¦–³H-çBh9B˹ZÎ"µœ ¡å\-g‘ZÎ…Ðr.„–s¡Ç-g [Î…Ðr.„–s!´œEj9B˹ZÎ"µœ =n9—A˹Ðã–³F-çBh9BËY¤–s!´œ ¡å\-g‘ZÎ…Ðr.„–³H-çB[ÎeÐr.„–³H-çBh9B˹ZÎ"µœ ¡å\èqËY£–s¡ý´œ ¡å b˹ZÎ…Ðr©å\-çBh9BËY¤–s!´œ =n9kÔr.„–s¡_ð]ªl9‹Ôr.„–s!´œEj9zÜr.ƒ–s¡Ç-gZÎ…Ðr.„–s!´œEj9B˹ZÎ"µœ ¡å\-çBh9‹Ðr.ƒ–s!´œƒÜr.túU-çóëŸìïZÎO&?‹Úr~2´ZN\Z-§.µåÔ¥¶œ/½k9…Úr>þpïZN]jˉK«åÄ¥Õr µåZ-§P[N¡¶œBm9ñ%hˉC«åÔ¡¶œ¸´ZN¡¶œøpm9u¨-'­–—VË©Km9qiµœ¸´ZN]jË)Ô–nµœ¸´ZN]jËùóK2Íù=xâüj9ñ‰®–S¨-'Ðj9…Úr ¥å”iËùø+ð®å||é]ËItý²ÿpm9u©-'/¥å䥴œºÔ–S—ÒròPZNjË©Km9‰ÒròÃ¥åÔ¥¶œºÔ–“—ÒròRZN¡¶œDù2QZN¡¶œDi9õ%hËÉKi9…Úr·×»–SŸx[N]jËÉKi9yiZNjË©Cm9y)-'.­–“(-'>Üj9y)-§.µåÔ¥¶œDi9…Úr=Í?":oߨw-§¾m9u©-'/¥å䥗ýµZN}¸¶œ¼tÛ¿Q«åÔ¥´œ¼QŸ\Z-'.­–“躣VË©Km9u©-'/ݶoÔj9u¨-'/]öoÔj9u©-§.µå$ºîߨ§¶œºÔ–“è²£VË)Ô–“èyÿF­–S_‚¶œºÔ–“—Îû7jµœºÔ–“èyÿF­–“—^öoT[NjËÉC·ýµZN]jËÉKi9yéeÿF­–nµœ¼”–S—ÚrêR[N¢ËþZ-§P[N¢çýµZN} ÚrêR[N^º|x£>½tÛ¿Q«åÔ‡kËÉK×íµZNjËÉKçýµZN]jË©Km9‰.û7jµœºÔ–S—ÚròÒmÿF­–“è´£VËIô²£VË©/A[N^ºîߨÕrâÒj9yé²£VË©—–S‡ÚròÐuÿF­–S—ÚròÒyÿF­–S¨-'ÑóþZ-§>ñ¶œºÔ–“è¼£VË)Ô–“è´£VË©/A[N]jË©Km9yéúáúìRZNjËItÙ>Q«åÔ¡¶œºÔ–“—®û'jµœºÔ–“èüá‰úÝöOÔj9ñ‰¯–“—®ž¨O/½ìŸ¨Õr÷OÔj9…ÚrêoËÉK—ýµZN]jË©Ki9y躡Úrꃵåä¡Ëþ…Z-§.µåÔ¥¶œ¼”–S—ÚrêR[N¢i9inûjµœú¼ÛròÒuÿ@­–S¨-'Ñyÿ@­–S—ÚrêR[N^ºì¨¶œ8´ZNjËIsÝ?P«åÔ¥¶œ¼tÙ?P«åÔ¥¶œºÔ–“—®ûª-'Íiÿ>MË©Oº-§Î´å$zÞ?N«åjË©O¼-'/÷Ój9u©-§.¥åä¡Ë‡ÇéÓC/_vØj9‰ÎûÇiµœºÔ–S—ÚròÒeÿ8­–S—Úr=o§Õrµå¤9íߦÕrâ °ZN]jËI”–“躛VË©O¼-'/÷oÓj9u©-§.¥åä¡ËþqZ-§>Z[N]jËÉK·ýã´ZN]jËÉK—ýãÔ–S¦-'Ñöç[[N¡¶œúá·åä¥ËþqZ-§P[N¢çýã´ZN]jË©Km9yé¼ÚrâÐj9qhµœ¼tÝÿÃÕrêõåÔ¥¶œ¼tÛ¿N«å$:m_§Õr½l_§[[N¢óþuZ-§.µåÔ¥¶œ¼tÙ¿N«åÔ‡kË©Km9yéºVË©Ki9yèüáuúôÐíË.‹x×r=ï_§ÕròÒËþuZ-§.Ý>~§ê§—nÛ×iµœDû3—ýë´ZN|Ò«åÄ¥ÕròÒmÿ:­–“è´VËÉK/û×iµœºÔ–“—®Û×iµœ:Ô–“—~Áw©®–S®-§.µåä¥ëþuZ-§.¥åä¡óþujË)Ó–“èã÷¨~Š.û×iµœú´åÔ¥¶œ¼tÛ¿N«åÔ‡kËÉK—ýë´ZN]JË©Cm9yèº}Þµœ/½k9~é³–óþ÷*Û”ó0.9ßÌ&ä<Œ;ÎÃ8ã<Œ+ÎW³‹8ã†ó0N8ã‚óÍlÎøß<ŒóÍ7³©7ãxó0n7ãtó͸Ü<ˆÃÍøÛ|3›ló0®6Ãhó n6ßÌ&Ù<Œ‹ÍÃ8Ø|3›^ó0Î5ãZó0Ž5ß̦Õ< RÍGæñ;"߬q¨ùf6æaœiÆ•æ›ÙDš‡q£y&šq¡ùjvæö™c˜gÆuæÆ™cØfŽašy—™cfa—yg™cXeŽa”9†MæaœdŽa‘9†Aæö˜‡qŽ9†5æƘ‡q‹9†)æ–˜cbÆæf˜cXaÆæ6˜c˜`ŽQy˜cØ_Ža~ùf6õ寗cø«Ú1L/ãòr̳¢–1ì.ãìrÌ“þ‘ÍF—cØ\ÆÉå—c\Žaoyç–cX[Žaly·–c”Zai9†¡åaÜYŽaf9†•åaYŽ9m_Mb9†…åaXŽa_9†yåa\WŽa\9†m妕ofSVŽaX9†]åf•‡qU9†Qå5•qR9†Eå•cØSÆ9åÖ”cSÆ-妔cXRŽaHyw”c˜QŽaEyG”cØPŽaB9†åaPŽa?9†ùäÖ“‡a<9„í䦓‡q99†áäv“c˜M¾™M59†Ñ䘫z”Ã8™Ãbr ƒÉ1ì%ã\r kÉ1Œ%ãVr SÉ1,%Ç0”<Œ;É1Ì$Ǩ’<ˆ#É1l$Ç0‘ÃBò0$ǰÃ9mwC˜=ÆÕãFcØ<ÆÉãc<Žaïøf6¹ãÖŽc;Žaëx§ŽcX:ŽaèxwŽc˜9Žaå8†‘ãaÜ8ŽQâ8„…ãa8aß8†yãÖ‡qÜ8†m㦇qÙ8†aãuC˜5ÆUãFcØ4ŽaÒxc4ŽaÏxçŒcX3ŽaÌ8F-ãÙ¤ŒcT2¹nŸœMÇ8†ãVŒc1Æ ã&ŒcX0†ãö‹cOÙÖ‹‡q¼8æyûÜlÒÅø\ó´}n6Ýâf‹‡qµ8FÑâ6‹c”,ÄÅâ‹cØ+ƹâÖŠc+Ža«x§ŠcT*a¨øfÜ)9m_›M¥8†‘âaÜ(Ža¢8†…âa(ŽaŸ8†yâÖ‰‡qœ8Fm⦉cX&Æaâv‰c˜%ÆUâF‰cØ$ŽQ’x‰cv?½Ü#Æ9âÖˆc#Ža‹x§ˆcX"Žaˆxwˆc˜!Ža…8FâÙ4ˆc˜ Ža8†âaÜŽa~8†õáaŽQ{8„éᕇqx8†Ýá˜ëö½ÙT‡cŽas8†Éáa\Žap8†½áaœŽQm8„±á¶†‡qj8†¥á††cØÆ™áV†cÄá˜í†c¾™M_8†yáÖ…‡q\8†mᦅcXÆaáv…c”ÄUáF…cöß}¹I ã¢p ƒÂ1ì ãœpŒjÂ!Œ Ǩ%<ˆSÂ1, Ç0$ÃŽð0Îǰ"Èð0nÇ0!Âp ÂðÂ|p ëÁW³‹Çœ~M;øíí ¼‹?›˜ j=øÙXå •âÒêu©¡.µ ||é]B(Ô†ðñ‡{êR+B\Z!.­ŽP¨!!Ð* …š µ%jLˆ/AkBZ9¡µ'Ä¥ µ(ćkR¨Cm qhE…¸´ªB]jVˆK«+Ä¥êRËB¡¦…øp«-üù¥Ý`~χ:ߺŸèÊ qiõ…¸´C¡†@+1jc(tù²?ÔÊðñWà]føøÒ»ÎèúeÿáZêRSC^JkÈK‰ u©µ¡.%7ä¡ô†:ÔàP—Z%9ä‡Ks¨Ku©Õ!/%;ä¥t‡B ‰òë^¢æÖƒÚ%>Ô— õ!/%?jHtÞ>\ï D}âMu© "/%B䥗/ÛŸ˜Íu¨"/%DÄ¥U"%Eć[-"/%FÔ¥ÖˆºÔ‘(=¢PƒD¢§ùGQ—(]÷oÔJu©"/]öoÔª…š)=ïߨ* µT$zÚ¿Q«Uä¥Û‡7ê“K«VÄ¥•+]÷oÔ u©Å¢.5Yä¥ÛöZÑ¢µZä¥ËþZÝ¢.5\Ô¥–‹D×ýõÔvQ—/]öoÔÊ…Ú/=ïߨU0êKЄQ—Ú0òÒyÿF­ŠQ—š1¥cÔ‡kÈÈK/û7ª)£µeä¡ÛþZ5£.5gä¥ôŒ¼ô²£Vш·’F^ºN]¢Ku©U#ÑeÿF­®Q¨a#ÑóþZi£¾mu©q#/]>¼QŸ^ºíߨÕ7êÃ5pä¥ëöZ‰£µqä¥óþZ•£.5sÔ¥vŽD—ýµJG]jê¨Kmyé¶£VíHtÚ¿Q«w$zÙ¿Q«xÔ— É#/]÷oÔŠqiU¼tÙ¿Q«{Ô‡ûömûF­ò‘‡®û7jµºÔø‘—Îû7jåB퉞÷oÔ* õ‰7Ô¥6Dçýµ*H¡fD§ýµBH} ZBêRSH]j ÉK×oÔg—RCêPsH¢Ëö‰ZA¤µˆÔ¥&‘¼tÝ?Q+ŠÔ¥V‘DçOÔ§è¶¢V‰O|•‘¼týðD}zéeÿD­8’è¼¢V)Ô>RŸxI^ºìŸ¨•HêRI]J$ÉC×ý ÕLR¬$]ö/Ô*%u©©¤.µ•ä¥Ä’ºÔZR—šKM/IsÛ?P«˜ÔçÝd’—®ûjE“B­&‰Îûju“ºÔpR—ZNòÒeÿ@µÄ¡OâPëIšëþZý¤.5 ä¥ËþZ ¥.µ¡Ô¥F”¼tÝ?PÍ(iNû÷iBJ}Ò-)u¦)%ÑóþqZ1¥PkJ}âÍ)y鼜VP©K-*u)I%]>\«L]j–ÉK×ýë´ÂL]J™ÉCç¯Ó§‡n_vYÄ»8“èyÿ:­<“—^ö¯Ó 4uéöñ;U?½tÛ¾N«Ñ$ÚŸ¹ì_§•iâ“^&.­P“—nû×i¥šD§ýë´bM^J­©KÍ5u©½&/]·¯Ó*6u¨É&/ý‚ïR]Ѧ>\«M]j¶ÉK×ýë´ÂM]J¹ÉCçýëÔvS¦ñ&ÑÇïQý]ö¯Óê7õhÀ©K-8yé¶Vé׈“—.û×ieœº”ŽS‡ròÐuû:½K9_z×rþüÒg-çóë¯jv-ç ·œÚ´œƒÜrrË9È-çÚµœƒÜrrË9È-ç6-ç ·œƒÜrhÓrrË9È-ç ·œrË9Æ-ç ·œÚ´œƒÜrbË9Æ-ç6-ç ·œƒÜrhÓrrË9-ç£s~OžRà¹[ÎAn9¹å<Цåä–s[ÎmZÎAn9±åã–ó íZÎ ¶œAl9¹å bËÄ–3ˆ-ç ·œAj9cØrrËÄ–3ˆ-g[ÎAn9ƒØr±å bË9È-g[Î ¶œƒÜr±å bËÄ–s[Î ¶œAl9¹å bËÄ–3H-ç·œAl9ƒØrhÓr±å ⯒ƒØrúÆ–3ˆ-g[ÎAn9ƒžô‚‚Ør±åä–3ˆ-g[Î ¶œƒÜr±å bË9È-gZζœAl9¹å bËÄ–s[ΠÓþÚ´œAl9¹å bËÄ–s[Î ¶œAl9ƒØrhÓr±å bËÄ–s[Î ¶œAj9Ǹå bËÄ–3ˆ-ç ·œAl9ƒØrrËÄ–3ˆ-g[ÎAn9ƒž÷oÔ¦åä–3ˆ-g[Î ¶œƒÜr±å bËÄ–s[ζœAl9¹å bËÄ–3ˆ-ç6-g[Î ¶œƒÜr±å bËÄ–s[Î ¶œAl9¹å bËÄ–3ˆ-ç ·œAl9ƒÔrŽqËÄ–3ˆ-g[ÎAn9ƒØr±å bË9È-g[Î ¶œƒÜr±å bËÄ–s[Î ¶œAl9´i9ƒØr±å bË9è›ZζœAl9¹å zÚ¿Q›–3ˆ-ç ·œAl9ƒØr±åä–3ˆ-g[ÎAn9ƒØr±å bË9È-g[Î ¶œƒØrÆœöO”[ζœƒÜr=MË9È-g[Î ¶œAl9´i9ƒØr±å bË9È-g[Î ¶œƒÜr±å bËÄ–s[Î µœ1l9±åŒaËÄ–3ˆ-ç ·œAl9ƒØrrËÄ–3H-g [ÎAn9ƒØr±å bË9È-g[Î ¶œƒÜr±å bˤ–ó0›–3H-g [ÎAn9ƒØr±å bË9È-g[Î ¶œƒØrưå zü vl9¹å bËÄ–s[Π§ýã´i9ƒØrrˤ–3†-gZÎ1n9ƒØr±åä–3ˆ-g[Î ¶œƒÜr©åŒaËy ·œ1§ýÛ´i9ƒØrrËÄ–3ˆ-ç ·œAl9ƒØr±åä–3H-g [Î ¶œƒÜr±å bË9È-g[Î ¶œAj9Ǹå Úþ|sË9È-g[Î ¶œAl9¹å zÞ?N›–s[Î ¶œAl9ƒÔrfÓr±å bËÄ–s[Î ¶œAl9¹å RËÖ3H-ç·œAl9ƒØrrËÄ–3ˆ-g[ÎAn9ƒØr±åä–3H-g [Î ¶œƒÜr±å bËÄ–s[Î ¶œAj9Ǹå ÚŸaËÄ–ó@›–3ˆ-g[ÎAn9ƒØr±å bË9È-g[Î µœcÜr±å úߥºi9¹å bËÄ–s[Î µœ1l9ƒÔrŽqËÄ–3ˆ-g[ÎAn9ƒØr±åä–3ˆ-g[Î ¶œƒØrưå bËù†v-gÐéWµœoß¹ÿ®åülñ3¨-çgÓ¡ƒVˉK«åÔ¥¶œºÔ–óñ¥w-§P[ÎÇî]Ë©Km9qiµœ¸´ZN¡¶œ@«åjË)Ô–S¨-'¾m9qhµœ:Ô–—VË)Ô–®-§µåÄ¡ÕrâÒj9u©-'.­–—VËùóK2Íù=xêshˉÏaµœ¸´ZN]jË©Km9qiµœ¸´ZN¡¶œ@«åjË)tù²?Ô–óñWà]ËùøÒ»–“èúeÿáÚrêR[N^JËÉKi9u©-§.¥åä¡´œ:Ô–S—Úr¥åä‡KË©Km9u©-'/¥å䥴œBm9‰ò+d¢öîƒÚr¥åÔ— -'/¥åjËItÞ>\ïZN}âm9u©-'/¥åä¥i9u¨-§µå䥴œ¸´ZN¢´œøp«å䥴œºÔ–S—¾¥å$JË)Ô–“èiþAÑyûF½k9õ%hË©Km9y)-'/½ìߨÕrêõåä¥ÛþZ-§.¥åä¡ËþZ-§.µåÔ¥¶œD×ýµZN]jËÉK—ýµZN¡¶œDÏû7jµœBm9‰žöoÔj9yéöáúäÒj9qiµœDi9ùá^öoÔj9u©-'/ݶoÔj9u¨-'/]öoÔj9u©-§.µå$ºîߨÕrêR[N¢ËþZ-§P[N¢çýµZN} ÚrêR[N^:ïߨÕrêR[N¢çýµZN^zÙ¿Qm9u¨-'ÝöoÔj9u©-'/¥å䥗ýµZN|¸ÕròRZN]jË©Km9‰.û7jµœBm9‰ž÷oÔj9õ%hË©Km9y)-'/ÝöoÔj9õáÚròÒuûF­–S‡ÚròÒyÿF­–S—ÚrêR[N¢ËþZ-§.µåÔ¥¶œ¼tÛ¿Q«å$:íߨÕr½ìߨÕrêKЖ“—®û7jµœ¸´ZN^ºìߨÕrêÃ¥åÔ¡oÏû7jµœºÔ–S—ÚròÒyÿF­–S¨-'ÑóþZ-§>ñ¶œºÔ–“è¼£VË)Ô–“è´£VË©/A[N]jË©Km9yéúáúìRZNjËItÙ>Q«åÔ¡¶œºÔ–“—®û'jµœºÔ–“èüá‰úÝöOÔj9ñ‰¯–“—®ž¨O/½ìŸ¨Õr÷OÔj9…ÚrêoËÉK—ýµZN]jË©Ki9y躡Úrꃵåä¡Ëþ…Z-§.µåÔ¥¶œ¼”–S—ÚrêR[N¢i9inûjµœú¼ÛròÒuÿ@­–S¨-'Ñyÿ@­–S—ÚrêR[N^ºì¨¶œ8´ZNjËIsÝ?P«åÔ¥¶œ¼tÙ?P«åÔ¥¶œºÔ–“—®ûª-'Íiÿ>MË©Oº-§Î´å$zÞ?N«åjË©O¼-'/÷Ój9u©-§.¥åä¡Ë‡ÇéÓC/_vØj9‰ÎûÇiµœºÔ–S—ÚròÒeÿ8­–S—Úr=o§Õrµå¤9íߦÕrâ °ZN]jËI”–“躛VË©O¼-'/÷oÓj9u©-§.¥åä¡ËþqZ-§>Z[N]jËÉK·ýã´ZN]jËÉK—ýãÔ–S¦-'Ñöç[[N¡¶œúá·åä¥ËþqZ-§P[N¢çýã´ZN]jË©Km9yé¼ÚrâÐj9qhµœ¼tÝÿÃÕrêõåÔ¥¶œ¼tÛ¿N«å$:m_§Õr½l_§[[N¢óþuZ-§.µåÔ¥¶œ¼tÙ¿N«åÔ‡kË©Km9yéºVË©Ki9yèüáuúôÐíË.‹x×r=ï_§ÕròÒËþuZ-§.Ý>~§ê§—nÛ×iµœDû3—ýë´ZN|Ò«åÄ¥ÕròÒmÿ:­–“è´VËÉK/û×iµœºÔ–“—®Û×iµœ:Ô–“—~Áw©®–S®-§.µåä¥ëþuZ-§.¥åä¡óþujË)Ó–“èã÷¨~Š.û×iµœú´åÔ¥¶œ¼tÛ¿N«åÔ‡kËÉK—ýë´ZN]JË©Cm9yèº}Þµœ/½k9~é“–óþ÷aw½Ùå â.ç ïrq—3ˆ»œAÜå<Ðf—3ˆ»œAÜå â.ç ïrq—3ˆ»œƒ¼ËÄ]Î îrq—sw9c¸ËÄ]ÎAÞå â.gv9c¸Ë9È»œAÏÚå â.ç ír>È4ó{r¬3c q—sw9ƒ¸ËÄ]Î îrò.gw9ƒ¸Ë9È»œAÜå Ò.g w9´Ùå,Ò.g‘v9ƒ¸ËY¤]Î"íri—3ˆ»œEØå¬Ñ.gw9‹´ËY¤]Î"írq—³H»œEÚå,Ò.gw9‹´ËY¤]Î îri—³H»œEÚå â.g‘v9‹Þþ>ró‰s—³H»œEÚå,Â.g w9‹´ËY¤]ÎAÞå,Ò.g‘þGEÚå â.g‘v9‹´ËÄ]΢§/ÿ¥^EÚå,Ò.gw9‹´ËY¤]Î"írq—³H»œEÚå â.gv9k´ËY¤]Î îri—³H»œAÜå,:íß(ïri—3ˆ»œEÚå,Ò.gw9‹´ËY¤]Î"írò.g‘v9‹´ËY¤]Î îri—³»œ1OÚå,Ò.g‘v9‹´ËÄ]Î"íri—3ˆ»œEÚå,Ò.g‘v9ƒ¸ËYô¼£¼ËÄ]Î"íri—³H»œAÜå,Ò.g‘v9‹´Ë¤]Îíri—3ˆ»œEÚå,Ò.g‘v9y—³H»œEÚå â.g‘v9‹´ËY¤]Π'íri—³H»œAÜå,Ò.g‘v9‹´ËÄ]Î"íra—3†»œEÚå,Ò.g‘v9ƒ¸ËY¤]Î"íri—3ˆ»œEÚå,ºíß(ïri—³H»œEÚå â.g‘v9‹´Ë9È»œEÚå,Ò.g‘v9ƒ´ËY£]Î"írq—³èiÿFy—³H»œAÜå,Ò.g‘v9‹´ËÄ]Î"íri—3ˆ»œEÚå,Ò.g‘v9ƒ¸ËY¤]Î"íri—³æ´¢¸ËY£]Î îr=ïŸ(ïrq—³H»œEÚå,Ò.ç ïri—³H»œEÚå â.g‘v9‹´Ëô¤]Î"íri—³H»œAÜå,Â.gv9ƒ´ËY£]Î"íri—3ˆ»œEÚå,Ò.gw9‹´ËY„]Îírq—³H»œEÚå,Ò.gw9‹´ËY¤]Î îri—³H»œEØåã]Î"ìrÖh—3ˆ»œEÚå,Ò.g‘v9ƒž´ËY¤]Î"íri—³F»œEÇ*´ËÄ]Î"íri—3ˆ»œEOûÇÉ»œEÚå â.gv9k´ËY„]Îîri—³H»œAÜå,Ò.g‘v9‹´ËÄ]Î"ìrÖh—sw9kNû·É»œEÚå â.g‘v9‹´ËÄ]Î"íri—³H»œAÜå,Â.gv9‹´ËÄ]Î"íri—3ˆ»œEÚå,Ò.gv9c¸ËY´ýùÆ]Î îri—³H»œEÚå â.g‘v9‹´ËÄ]Î"íri—³»œc¼ËY¤]Î"íri—3ˆ»œEÚå,Ò.gГv9‹°ËY£]Î"ìrÆp—³H»œEÚå â.g‘v9‹´ËY¤]Î îri—³H»œAÜå,Â.gv9‹´ËÄ]Î"íri—³H»œAÜå,Ò.gv9c¸ËY´?£]Î"írò.g‘v9‹nû×É»œEÚå,Ò.g‘v9ƒ¸ËY¤]Î"ìrÆp—³H»œE¿à»T½ËÄ]Î"íri—3ˆ»œEØå¬Ñ.gv9c¸ËY¤]Î"íri—3ˆ»œEÚå,Ò.gw9‹´ËY¤]Î"íri—³F»œEÚå<Ðf—³èôú?½ôYËùö]0»–s[ÎmZÎAn9¹åä–ó íZÎAn9¹åä–ó@›–s[ÎAn9´i9¹åä–s[ιåã–s[ÎmZÎAn9±åã–ó@›–s[ÎAh9ešÇï©Às!·œƒÜrrËy MË9È-ç ·œƒÜrhÓrrË9È-ç6-ç ·œƒØrŽqËù†v-g[Î ¶œƒÜr±å bËÄ–sÐ[Î µœ1l9¹å bËÄ–3ˆ-ç ·œAl9ƒØr±åä–3ˆ-g[ÎAn9ƒØr±å bË9È-g[Î ¶œƒÜr±å bˤ–sŒ[Î ¶œAl9´i9ƒØrñWÉAl9¹å bËÄ–s[Π'ýƒ  ¶œAl9¹å bËÄ–3ˆ-ç ·œAl9ƒØrrˤ–3†-g[ÎAn9ƒØr±åä–3è´£6-g[ÎAn9ƒØr±åä–3ˆ-g[Î ¶œÚ´œAl9ƒØr±åä–3ˆ-gZÎ1Ol9ƒØr±å bË9È-g[Î ¶œƒÜr±å bËÄ–s[Î ¶œAl9¹å bËÄ–3ˆ-ç ·œAl9ƒØr±åÄ–3†-g[ÎAn9ƒØr±å bËy MËÄ–3ˆ-ç ·œAl9ƒØr±åôÄ–3èyÿFmZÎAn9ƒØr±å bË9È-g[Î µœcÜr±å bËÄ–s[Î ¶œAl9ƒØrrËÄ–3ˆ-ç ·œAl9ƒØr±åä–3ˆ-g[ÎmZÎ ¶œAl9ƒØrbËÖ3ˆ-ç ·œAOû7jÓr±åä–3ˆ-g[Î ¶œƒÜr±å bË9È-g[Î ¶œAl9¹å bËÄ–s[ΘÓþ‰rËÖs[Î ¶œAl9¹å bËÄ–3ˆ-ç6-g[Î ¶œAl9¹å bËÄ–sÐ[Î ¶œAl9ƒØrrˤ–3†-ç ¶œ1l9ƒØr±åä–3èyÿBmZÎAn9ƒØr©åŒaË9È-g[Î ¶œAl9¹å bËÄ–s[Î ¶œAl9ƒÔrfÓr©åŒaË9È-g[Î ¶œAl9=±å bËÄ–s[ζœA¿Á.‚-ç ·œAl9ƒØrrËô´œ6-g[ÎAn9ƒÔrưå RË9Æ-g[Î ¶œƒÜr±å bËÄ–s[Î µœ1l9ä–3æ´›6-g[ÎAn9ƒØr±åä–3ˆ-g[Î ¶œƒÜr©åŒaËÄ–s[Î ¶œAl9¹å bËÄ–3H-ç·œAÛŸon9¹å bËÄ–3ˆ-ç ·œAl9ƒØrrËÄ–3ˆ-gZÎÃlZÎ ¶œAl9ƒØrrËÄ–3ˆ-ç ·œAj9cØr©åã–3ˆ-g[ÎAn9ƒØr±å bË9È-gÐóþuÚ´œƒÜr©åŒaËÄ–s[Î ¶œAl9ƒØrrËÄ–3H-ç·œAû3l9ƒØrhÓr±å bË9È-g[Î ¶œAl9¹å bˤ–sŒ[Î ¶œA¿à»T7-ç ·œAl9ƒØrrˤ–3†-gZÎ1n9ƒØr±å bË9È-g[Î ¶œƒÜr±å bËÄ–s[ζœAl9ßЮå :ýª–óí+¿k9¹å<Цåä–s[ÎAn9ßЮåä–s[ÎAn9´i9¹åä–ó@›–s[ÎAn9¹å<[Î1n9¹å<Цåä–s[Î1n9´i9¡å|”iÎïé±ÎmZÎAn9¹åä–ó@›–s[ÎAn9¹å<Цåä–s[ÎmZÎAn9±åã–ó íZÎ ¶œAl9¹å bËÄ–3ˆ-ç ·œAÏø_ÏcØrrËÄ–3ˆ-g[ÎAn9ƒØr±å bË9È-g[Î ¶œƒÜr±å bËÄ–s[Î ¶œAl9¹å bËÄ–3H-ç·œAÏúŸ(‚ØrhÓr±å ⯒ƒØrrËÄ–3ˆ-ç ·œAOúAAl9ƒØrrËÄ–3ˆ-g[ÎAn9ƒØr±åä–3H-g [Î ¶œƒÜr±å bË9È-gÐiÿFmZÎ ¶œƒÜr±å bË9È-g[Î ¶œAl9´i9ƒØr±å bË9È-g[Î µœcÜr±å bËÄ–s[Î ¶œAl9¹å bËÄ–3ˆ-ç ·œAl9ƒØrrËÄ–3ˆ-g[ÎAn9ƒØr±å bË9ˆ-g [Î ¶œƒÜr±å bËÄ–ó@›–3ˆ-g[ÎAn9ƒØr±å bË9È-gÐóþÚ´œƒÜr±å bËÄ–s[Î ¶œAj9Ǹå bËÄ–3ˆ-ç ·œAl9ƒØr±åä–3ˆ-g[ÎAn9ƒØr±å bË9È-g[Î ¶œÚ´œAl9ƒØr±åÄ–3†-g[ÎAn9ƒžöoÔ¦å bË9È-g[Î ¶œAl9¹å bËtÛ¿Q›–3ˆ-g[Î ¶œƒÜr±å bË9ˆ-gÌiÿD¹åŒaË9È-g[Î ¶œƒÜr±å bËÄ–ó@›–3ˆ-g[Î ¶œƒÜr±å bË9È-g[Î ¶œAl9¹å RËÖs[ζœAl9ƒØrrËô¼¡6-ç ·œAl9ƒÔrưåä–3ˆ-g[Î ¶œƒÜr±å bË9È-g[Î ¶œAj9³i9ƒÔrưåä–3ˆ-g[Î ¶œƒÜr±å bË9ˆ-g [ΠÇß`Á–s[Î ¶œAl9¹å zÚ?N›–3ˆ-ç ·œAj9cØr©åã–3ˆ-gÐmÿ8mZÎ ¶œAl9ƒØrrˤ–3†-çÜrÆœöoÓ¦å bË9È-g[Î ¶œƒÜr±å bËÄ–s[Î µœ1l9ƒØrrËÄ–3ˆ-ç ·œAl9ƒØr©åã–3hûóÍ-ç ·œAl9ƒØr±åä–3ˆ-g[ÎAn9ƒØr±å RËy˜MËÄ–3ˆ-g[ÎAn9ƒØr±åä–3H-g [Î µœcÜr±å bË9È-g[Î ¶œAl9¹å bËÄ–s[Î µœ1l9ƒØrrËÄ–3ˆ-g[ÎAn9ƒØr©åã–3h†-g[ÎmZÎ ¶œAl9¹å bËÄ–3ˆ-ç ·œAl9ƒÔrŽqËÄ–3è|—ê¦åä–3ˆ-g[ÎAn9ƒÔrưå RË9Æ-g[Î ¶œAl9¹å bËtÛ¿N›–3ˆ-g[Î ¶œƒØrưå bËù†v-gÐé×´œ§·oÓr±åä–3ˆ-g[Î ¶œÚ´œAl9ƒØr±åä–3ˆ-gÐM-ç ·œAl9ƒØr±åÄ–3†-g[ÎAn9ƒØr©åŒaË9H-çƒL3¿'Ç:ƒØrrËÄ–3ˆ-g[ÎAn9ƒØr±å bË9È-g[Î ¶œƒÜr±å RËÖó@›–³H-g‘ZÎ ¶œEj9‹Ôr©å bËY„–³F-g[Î"µœEj9‹Ôr±å,RËY¤–³H-g[Î"µœEj9ƒØr©å,RËY¤–3ˆ-g‘ZÎ"µœAl9‹Ôr©å,BËÖ³H-g‘ZÎAn9‹ÔréWÉEj9ƒØr©å,RËÄ–³è ÿ ¨H-g‘ZÎ ¶œEj9‹Ôr©å bËY¤–³è¶£Ür¡å¬QËY¤–3ˆ-g‘ZÎ"µœAl9‹Nû7Ê-g‘ZÎ ¶œEj9‹Ôr±å,RËY¤–³H-ç ·œEj9‹Ôr©å bËY¤–³-g [Î"µœEj9‹Ôr±å,RËY¤–3ˆ-g‘ZÎ"µœEj9ƒØr©å,RËÄ–³H-g‘ZÎ"µœAl9‹Ôr©å,Rˤ–³F-g‘ZÎ ¶œEj9‹Ôr©åä–³H-g‘ZÎ ¶œEj9‹Ôr©å bËY¤–³H-g[Î"µœEj9‹Ôr±å,RËY„–3†-g‘ZÎ"µœEj9ƒØr©å,RËY¤–3ˆ-g‘ZÎ"µœAl9‹Ôr©å,RËÄ–³H-g‘ZÎAn9‹Ôr©å,Rˤ–³F-g‘ZÎ ¶œEOû7Ê-g‘ZΠ“ZÎ"µœEj9‹Ôr±å,RËYtÛ¿Qn9‹Ôr©å,RËÄ–³H-g‘ZÎ µœ5§ýÅ–³F-g[Î"µœEj9ƒØr©å,RËY¤–s[Î"µœEj9‹Ôr±å,RËY¤–3ˆ-g‘ZÎ"µœEj9ƒØr¡å¬Qˤ–³F-g‘ZÎ"µœAl9‹Ôr©å bËY¤–³-gZÎ ¶œEj9‹Ôr©å bËY¤–³H-g[Î"µœEj9‹ÐrŽqËY„–³F-g[Î"µœEj9‹Ôr±å,RËY¤–3H-gZ΢‡ß`W¡–3ˆ-g‘ZÎ"µœAl9‹žö“[Î"µœAl9‹ÐrÖ¨å,BËÖ³H-g‘ZÎ ¶œEj9‹Ôr©å bËY„–³F-ç ¶œ5§ýÛä–³H-g[Î"µœEj9ƒØr©å,RËY¤–3褖³-gZÎ"µœAl9‹Ôr©å bËY¤–³H-gZζœEÛŸol9ƒØr©å,RËY¤–3ˆ-g‘ZÎ"µœAl9‹Ôr©å,BË9Æ-g‘ZÎ"µœEj9ƒØr©å,RËÄ–³-gZÎ"´œ1l9‹Ôr©å bËY¤–³H-g‘ZÎ ¶œEj9‹Ôr±å,BËY£–³H-g[Î"µœEj9‹Ôr±å,RËY„–3†-gÑþŒZÎ"µœƒÜr©å,RËÄ–³H-g‘ZÎ"µœAl9‹Ôr¡åŒaËY¤–³è|—ª[Î ¶œEj9‹Ôr±å,BËY£–³-g [Î"µœEj9‹Ôr±å,RËY¤–3ˆ-g‘ZÎ"µœEj9ƒÔrÖ¨å,RËy MËYtúU-çókœò®å¼¼fˆOjËôwŸäVˉK«åÔ¥¶œºÔ–óñ¥w-§P[ÎÇî]Ë©Km9qiµœ¸´ZN¡¶œ@«åjË)Ô–S¨-'¾m9qhµœ:Ô–—VË)Ô–®-§µåüù¡G™æñ{®ÀçWˉÏsµœ¸´ZN\Z-§.µåjˉ·ZN\Z-§.µåÔ¥¶œ¸´ZN\Z-§P[N Õr µåJË)Ó–óñWà]ËùøÒ»–“(¿BÖ‡kË©Km9y)-'/¥åÔ¥¶œº”–“‡ÒrêP[N]jËI”–“.-§.µåÔ¥¶œ¼”–“—Òr µå$ʯ‰Òr µå$JË©/A[N^JË)Ô–“è¼}¸ÞµœúÄÛrêR[N^JËÉKÓrêP[NjËÉKi9qiµœDi9ñáVËÉKi9u©-§.µå$JË)Ô–“èiþAÑyûF½k9õ%8}Û¿Q«å䥴œ¼ô²£V˩ז“—nû7jµœº”–“‡.û7jµœºÔ–S—Úr]÷oÔj9u©-'/]öoÔj9…Úr=ïߨÕr µå$zÚ¿Q«åä¥Û‡7ê“K«åÄ¥Õr]÷oÔj9u©-§.µåä¥ÛöZ-§µåä¥ËþZ-§.µåÔ¥¶œD×ýµZN]jËItÙ¿Q«åjËIô¼£VË©/A[N]jËÉKçýµZN]jËIô¼£VËÉK/û7ª-§µåä¡ÛþZ-§.µå䥴œ¼ô²£Vˉ·ZN^JË©Km9u©-'ÑeÿF­–S¨-'ÑóþZ-§¾m9u©-'/]>¼QŸ^ºíߨÕrêõåä¥ëöZ-§µåä¥óþZ-§.µåÔ¥¶œD—ýµZN]jË©Km9yé¶£VËItÚ¿Q«å$zÙ¿Q«åÔ— -'/]÷oÔj9qiµœ¼tÙ¿Q«åÔ‡KË©Cm9y躣VË©Km9yé¼£VË)túöáú=ïߨÕrêoË©Km9‰Îû7jµœBm9‰Nû7jµœú´åÔ¥¶œºÔ–“—®Þ¨Ï.¥åÔ¡¶œD—íµZNjË©Km9y麢VË©Km9‰Îž¨OÑmÿD­–Ÿøj9yéúá‰úôÒËþ‰Z-'ÑyÿD­–S¨-§>ñ¶œ¼tÙ?Q«åÔ¥¶œº”–“‡®ûª-§>X[Nºì_¨ÕrêR[N]jËÉKi9u©-§.µå$š–“æ¶ V˩ϻ-'/]÷Ôj9…Úr÷Ôj9u©-§.µåä¥ËþjˉC«åÄ¡¶œ4×ýµZN]jËÉK—ýµZN]jË©Km9y麠ÚrÒœöïÓ´œú¤ÛrêL[N¢çýã´ZN¡¶œúÄÛròÒyÿ8­–S—ÚrêRZNº|xœ>=ôòe÷€­–“輜VË©Km9u©-'/]öÓj9u©-'ÑóöqZ-'P[NšÓþmZ-'¾«åÔ¥¶œDi9‰®û·iµœúÄÛròÒyÿ6­–S—ÚrêÒéùËö+Ж“èeÿ8­–S—ÚròÒmÿ8­–S—ÚròÒeÿ8µå”iËI´ýùÖ–S¨-§~øm9y鲜VË)Ô–“èyÿ8­–S—ÚrêR[N^:ï_§¶œ8´ZNZ-'/]÷ÿp`µœúpm9u©-'/Ýö¯Ój9‰NÛ×iµœD/Û×éÖ–“è¼VË©Km9u©-'/]ö¯Ój9õáÚrêR[N^ºî_§ÕrêRZN:x>=tû²Ë"ÞµœDÏû×iµœ¼ô²VË©K·ß©úé¥ÛöuZ-'ÑþÌeÿ:­–Ÿôj9qiµœ¼tÛ¿N«å$:í_§ÕròÒËþuZ-§.µåä¥ëöuZ-§µåä¥_ð]ª«åÔ‡kË©Km9yéºVË©Ki9yè¼ÚrÊ´å$úø=ªŸ¢ËþuZ-§¾m9u©-'/Ýö¯Ój9õáÚròÒeÿ:­–S—ÒrêP[Nºn_§w-çãKïZΟ_ú7ßýçïnç¯ß_îóç·ÿtºÿö÷?}÷üôíïÿó«øé»üîÿþþŸ¾{ý6¾çû_ÿëwß¾ÿ×÷ÿï?~÷õûÿý»o__Õtýþõ©¹?=¾ ×·hžÿæ§þ7÷OàéõËOý½~þ߬ßëÿzmNïÿ¿ÿòÇû§ûíëÛžÿóû?ÿ?ÿö»ÿáÿüöíûûßú¿~Ä÷¿ýÿ½~ÛÚýçÿÓë»ûߥÝÓŸ¿ûáw¿ùíüîÇû¯‚ž.¯æÏ¯ÿ`èzùþ·ÿßvÿÛÕóõþ¼ϯW~ÿ Ýßtÿ%öÓýïÕ¿%_¿ÞÞýN÷¿U|y:ß¾¿ÿÇùüúIôÚ미Ï÷Ÿð?ÞÿÂ~9¿¼ûMÿëoï_ÿ¯¯ ßý¯åÿ_~t÷?qŸîUúöúí‰÷¿ö¾þèþ}>æÓùåûïá¾ÿ‰{~ûo¿åþ+Ÿã§ÈëßmßÿÊÐßpÿ‘n÷÷ùþŽ]¿>­ÿþõ›·_ ?Þ÷óùýïñíþÝ~¼ý ðýÿö7üxR^¾Þ ?Þqpÿ¹öî·\Þ²½Wp¹}=ÿÝoøöö“óþÇåõ;¾^Öo;½þ}ÌËý'ÈkOqy÷òå»%~ý—îþwl·×/ÝëŸø÷?_¿t¿ûLî¿Ê<½ÿÍÜýïiO¯%ïë‡ûýñGøõoö_Þþ8~½\në·ÜÿÒøüÚQþxÿÅÉùòþ÷ùñþGæôõþgÎÓkŽyyZ¿e>ù?¾ýøà3ùþÛýo¿Ï¯?×gþ|ÿcú ž^ÿ‘ÐÓë'þoøßþô›ï4¾>_O?üñ7÷¯áý‡túúôÿ¬ÿú¿¼þ×·¯_ÏßÎ?üá7?žž^ëÓ—N¯ÿõåþWˆÛå‡ÿñ®ÿŸßþëûG¾ÿàÞ}äûß”¿}E¾¾~öÿö‡ÿéíÒËí|ºúï?Íë[F<ö?¿;ÿïþóïÖþì#þx}ýÇþϯ_ëûþ|ÿkÀÛµ?ÿå7¯!×íúôÃ?üá§ßüøú«ý—Û퇿ü‡ùÏ/O?üíÿðúÿ¸¿h/—~:~‡ûߜݿ,¯èíÜåÛ÷¿ý?¾ûí÷oø_þå¯ÿø§úã_ï_7w¿û»¿ýîË}zý›Êß¾ž}ûgš//÷Ÿ}¯7ðõtÿqüþ?ýñ¿¼~Œó×—çþò/ÿôŸ}˜ß×ÿå§¿¼ý8}:]žxýÀ÷_<}ýzýáOÿtüçûîø1ÜÿšqÿX/÷ßð·?¼ÿ}~|û¯g÷û¿ýé/÷ßíöú?o½œøçŸþò·×ÿ×ýà·ËýÇ¿ü×Ò¹xÿ,î_ŠžÏøÛÓýgB>³øÓïÿvü¿¾o¯¬}ýá÷?ýî¯}ø%yýV“×?ýéOüÇ¿ýôߎÿæõôŸÿð׿þ·Ï¾ïþ üå?ýæÇËËííó}ýƒøúŸ_¯½~ºŸüܺ?ϯ‘˜Ÿ\›ŸD÷ŸàçûßIú‡ÿþõOº÷î¿”¾_žsïßÿÿqïú­?ù¿ùI~ÿÛ‰—çÛm~’¿~^¯Ÿ~·~zýá§ûÏëë÷©ÜŽŸ!×Û×·/îñ³üõ7¼|ûáoùçõú¿þåþ‡îv;þ@ßB¼þ›?Mþtüçw?÷/ýCÿ`?uø÷ÿí7ÿêgñyýÖ†û_ÅæöÏ÷?~øéõÿï/ïþœþÛ»¿ÂüùÃoüìÇÿú°û37ÿÕý“{yû‘¾Ü?­ã'ùçûOÓûËr|ž_ù·¿üùwûÓý‹ûöíg÷?CþãŸþö÷ŠÜÿ”îäõ§Õý/ã_ø÷?]^ÿä{û>ýóϾÌñÿΟ÷Ÿû÷/òk±ýúççú)ùíüw_š·ÿ9ìÛü8ò¹¼ýÜøð‡;ðïÿpÿnýÉøÇùóþéoÿî7_òþîãÜà×íÆýoXîq<_¾ÎWãÛ»?ßþþ þöÄü›ïþ_T,endstream endobj 309 0 obj << /Filter /FlateDecode /Length 1162 >> stream xœµWK#5¾çWô 7"Æe»ý¸"Á(·Ý=„dfwÄæ1“„Ùù÷TÙînÛÝVH(ÒŒãG=¾úê‘çFph}ÒÿÝa%š«ç„Ý&ýÛš6«ïÿ° h®´‘Íæq_@ã:.”‡ÆvÀwÍæ°zÇ\»\{ï¼c<[C»ïد´+¼ï: ìö™¾uB(©Ø5Ý×V²§lÿxʾ.mií…(…*Ûqí|¼ž® ø Û?оD+@±Ü† ­-ڬ̇ÍÏè:ø€£µÁw%¹6Â7›_V›oß±ŸZ'¹]2ðíØK»Öà¹uÕ£ÏÞËni‚è&ªÐ^“ÀŽô'0h„3Ñh”eÄÛìeh‰ I÷ÂCi¹òоGτ飾 ™ã8øŽ½¶Ò jaéÙšÊÆKöþš€. ß?œá¬Ô†èž%9—8»ÏÖOYGÛÕ(,sS£‘fÌ”ïhàÁS—Úâí¢>žû÷%à Ç|·\Ö8Þä.…0 Z 5^û`v÷×`“ì‹­´‹}ñ¯l%YÈ ép0¶®j4ãpºÍ9 >Þ¹rv rŸ*—B;ÀOÊ…’c¯Š¼øT¥ô þÐrò«¨oB…< 9"Ef©`¸7¦W:4'!éçA´«Àò»ã7]¡j?ÛÍh ýU¿tTŒFÕ$‚*ÏuÂÞéJ³Ea2 ññ€sÈW„±Yšüd¢ d¯t™t?nV¿ãç:ÁEendstream endobj 310 0 obj << /Filter /FlateDecode /Length 6359 >> stream xœÕ=Ûn%¹qoòâs‚Q§ym2@ØAì$ÈC ðƒ¤™QV·vF€?Þ¬*’]¼õ9­ ìJ-^ŠÅº_¸?žÎ“8áŸøßË»“ùôãÉ'¿žÆÿ\Þþúüäþ[øS!&oŒ<=ÿpBSÄ©3Ó¬¼8]Œ˜¬w§çw'Üýfïä4ÏFíögód¼w‹Ù}ÞŸIc'7ÛÝ|–ó,¤ßÝìÏÄîþõÿº…á·ËzЗ½´áƒ±»—´Ô²û /–Ý5}n)ÖÿSör™´S¿ÆQÞ@sXc6ÂÀä<ƒÏ~Ž0ÍS8„ˆuÒ­%Éð vž•³»{6Á]žØÚ|NFŽ,v@àlÿsþá*Š›B‡•M¸ó«€ûolQ±þL«;4“²Ò§™?í Û(»»(ËÐܰƒñ1ïáçY(k„-•®ÄûÝŸvl¡æˆÏlìû'Xl ûè.Šh£¥Lº@‰HvÒs¸©ŸŠ„õ+Áø‚Ö,XŒ_Ôð\€Ã)&ܸÛè0…æ¸ã`}ÙÃ'ýÒ£;-…‚ë:“*°¦q§gᆵ֞®iåÎ\Y*äÕ’[® Sá. Á™‹÷ÚëŒKœVz(€nÇñ“œÅÙDFºCFq62suM¢¦¡¼êt3JýiÏÆLë2€D˜C‹Óóÿ<9ÿû?îÎk¹wë¢ê. ž«ü¯[6ÈäðûÇ’VEq¶¼`\ë)þžˆ¾B .ìE&´ ^\R³+)º'`·ŠÏü§æö"Šî"ñÀ¼€ÌƒqýYoÉ®´vO>i9y«¾G>ÉIå’f†› ¬ØLíþA\b¸^‚š(ø,]zWÄ˾b+8W¬pê$<ŸÔ\†BóŠV |WÀw[‹½G$nï GDt¿K”c#å° c&i—(4¬ ÜÝvékÅ ’>¬jŽ#pä’’0d»˜ÀTÀ¼þidc‡,œšì¢\,䲂AK™f&6ƒ#€À(-ë„*tW#,=ª¨»IWQ$t•Óòýã¡Erf'ö³9pT7ic Ð:Ј-8àžŽà½¬õVPZ#ýôTGóŽÐ]`%ï¿tÉÉ…„Ì© §´.6çÓ퀴{‚þ@!,îëxéGZ¹™r_[˜×‰‚d­a-!—èÌ”‚8nâÑÙŠãÒ‘Âþ«d±ÅF~dªùH”YNÒ‚dÓG*ž°¼pE·æøù›òøùçËÁõ?¥eT˜qg¿d‘¹LÁ'µÈ´(Á¢Äœ·%¦Ua°1 ‰( ´º³¯[¾/#&l+°°ˆAz¹"Q"Ö’¥Ýu½ï;ØK# ÝÖ¤zA*H/Á´ªØä>’dÅîÙ²ÏQ,z2 [ü@ëá™|E 3PŸX\>8¶2C:(1ƒYè¼ÜRý”›îóZDÀ açxä¢ ,Z y²P2Ó|)У_Ór¬R˜C»V´<×b?Ûl o¸aBÛp}â{ôÙÐÌ)|¦‘íZû»wùÉÝQ4F‚”øì…Z˜‹ð·’ë#6ºXï;¬Éˆâxý6ø#?¼ÑÇÙp3r3ÚÜCP˜™;6Œ¿´€ ‘g®dùçU¿ð# ƒ)¼T5ì…&L`”à¶GFQtùŒQÒšÀÙ!’C¯ŠK}ÜÄKë‚‚iÄ{œôD>¡ð¶Æ.y“}0¹Škæ"»Ú/Ñ+ôÿ:í–˜‘vÖzKÞ—×vGÓ,Ǹ%tÑŠ7!Å"H©ÛÉLÜ<¹çN wLùÂ\à¿­ÓÅ„rÝÕ`‡ÏQw¨À°:ɇ´­o˜ ¸¦.4.›´‚äqàû$$#­7ÆZû ÂDá•“Ø[N­+mQê¥cE›…G3/ "€:±Ÿƒ 4“Ùý ï(løëññs£Àn04µ[4 š@§NY’mqüw탡£ÔˆcW‹ÖÜ=☰½Q1–Çðñ7´¦³RkÞ²ïgWt«Þ²Vá’.[…»¨¼¿*~»Œ€„ñ|©‡Œøýi=rOÇ(9i;ûù—Žh‘s›­âèÖ=g™YÉþRÔd;D»0Æ3cÿAÅ…Ó--.NI™+͑ĩ]jìü›ÁÀ'ڤ߆YCÀþ ¦8BÑ_%©ÊÚœDSØÈ ?{põ5K0È: «€§z=Øþ’$¬Ea•ôØ—.¥FGßö@q2…³š¢•îÇuÃu)âý#÷ŠpÓ¦«PÓIÖàHFÒ’$m «”áØ8¦ú!YûJidiÆý@×ê¡ò³töÒU»?`Ÿ&³_Ç« ˆ¡’]f$øû¾°`cE“/æDÓ ¹ö`èÛûiök,âUÇåä‘ œûxú›[é-Zîø[¸_¦ëÐ1z¹­Ù ¹‘3[­–-EUë …%Ëw øcÂ#¹Ü|øH oI0%fi„hgõ"š —eFQQI"yt¢>·òP‡²’™eË ’A9ø¥Jyé*ÉTåâõ|9T#V¸ú®¤qSŒÛüUx)«/´Á½‚ØëoöîHtÒn3s—zÅ©6(–„kÉö%x碣ѸiùDó„ÞfND¥pnìÈCtÏ»‰îlÖóo“ûŸPÏ6gæ½€ ŸJ/¸°»‡o7w_È ©™>H5o¬,üôùfiÌ2Ìïs eŸyXÊ‹¶îáø°Ô5aM0cð`Ã: ä_ÏO~wB5›ŸÇeœÎŸ`Á¬ŠSSuöêT;=ÙÅS'¦­‚I&èžâò¯-Õ³šœõaé°TbÁÒ<±ÕQÁn6rQ=­q7ÐL#P-Jü™ãŽk–b?ÿû9RŒU³,öm¸º³ïÕ¶Çþ^Ýà‹¬¡²¾¬+ÛH®k¥'!ê(V/?Xš–«½$½ê{¬˜ Gh­Çýa’ÙÈüçyy[¤72–ò^ªq¼÷ÍŒE°¾¢@î)ÍQÙ]+½…åf]_Ñçqñs¹§zK[¸Žk̵FU±{<;ÅqÍd²˜<ªx·_uYF‹ðìca[1…xÌוÖå:…´9Ó ²hö©d[™ÃKSåᣌJeÊÃ/™ õœóZ£(âšæ ó!X5_!=R“aÉüó;2ææª¢nzvÁï;Xl P,½Pf•„qÞ7»¨€!n\̲q ×S=Tþ"7¾ŸCðM¢þMqÖ”rºªO?ŠÕMÑ Ótsÿê‘-½†%37bG‰¢„!5.ÀR–…Ì¥þ©ôÌÙµ2|i²ìW2yÊm6XÇÖ9" ºN-R]ž Âg”AØg•}øZ’zjÚE¹÷Ýz¼ð>Ë‘b”ÏË¡ÜkªžºV)É‹xŠRçV5°P"¼ïR"ü œ«¦X«ÑnM%y!\63¥Z¬Ÿ®¨–àrpÙãm­?3°;ÆBŠËÀº®Šä,YtŠrIƒ€»²Ñ#Ÿ§k‹±ƒ4zè8°„©ÂðO [=HÒ ºÖœè@ϤŒ„õGYÆ9¬,òkã2¨Æt;Kæ›2‡Ç?êÏ,o“NU’8w±¸7‚4Ÿ¼ù€XÐÄÍíMÞ¡Óö, ´74ÜÄ V[¨‰4&SS§X™T¾N…•ãFe˜ SèI}Í®>;i§7­ÐøeÇðU„ÆÜCÂ[zèÇL)(Œ¢lTˆi"ÚvÞ'é<9,‰”GröÌ<èã~9*'ü)1'I®û¡`}ð{¦†ÝÛäN%”¦`/Ò<ÀkbVB=ª’Ri/ê;^‡l¥äïˆHÀ.ua㾡·¥t_£nY‚˜ÇUPk í§=š° 4]ËeúŒ0¢NºZ»ám¿Ð`0t›®¿¿­cŠ&\âpËÒV ò ^T1ïWl©ä‰i2+p6+Ì+Òíp*ú£@ÅGu+¤£•òuŠÀèZ£#ñ­êš›*͈ÕÈYmuXZ¸&¿ßµƒs_å÷gÆ™X9—{V+‡šÙ^íÀ0lìÑ8]Çjl*yt ³÷ }\üØ*? 0À26»Q6XÛÏõ«îæhߨɺ®ÉÃf‹¬»¯#~":@›1޽[¸[Ì#·+#½ÐÊ‹C´#ñ˜ªZù€&Ï¥-ÑÈ¡£•DÅt]…Qתpr§æ3ï;àƒ¼r{’üWŽúZº>ªsu>Ьú¤Ô,nÁ¨OŸ[úM ™¸UþЭ‹ø2Ugy·ç3ÄUuG£Ôwã{ñ8E:R?ÞL[Ž£Kº‰¦È–§ÚàœwÑ™àëŽ ×i™H¿ßh«Å7ÏÉ(ñ­AŸ= ÞE5äÉtUõBc-·0:rÉÕC¼Œdm©Œâ¼ŽÂJÙ–—€Yè,ºTñŽ~•ij³:X/ƒ”ca}ŠÃ®OqŒÒ&_h\C¿Ð¢Zjœ(y)_Y·‚cVb-îÒ¶2›lsçc¬-Ö+3zš¨ª¦Dܤ>YÕôÉæiÏ‘ ‚ÃæÌ Œ‘ð¬ ó;M0ÙéëD+d(î2;«@»ZÙ§©?¢L+"ÉÉnA>Ûhû=K'?\þ®ëŠ?ìžFÚX6`®k%¬èúÁÚÍÌžÀ8Ö¨Ü7xXÇùq»ÅÈ ?†º° Œºb~+ìñÀóØ2zqR‘Xv×ÜähÃÊs0ÎÓó;ˆ³Ê‰?ÐgM›aÚÚK³ºÙƒÎÕx£ +:èws04›ŽÏH<ÕŽ2ÝØÖRámò©R dŒxÚRKäRà YSIù4¸m<ß/2÷F¨SaÀÕQº!P€ƒE½GÇj¿“âÁ?EUŒU Æõ:°) M)aÊ@I^Úo¼]i?acÜ´_Ò f|ÀÒݰÑKJ/±g;F(ãe3¹*­}†i¥YÒ¿ç4FIÒ:{)9Y^|“aæJ«)q þã¢$Z¾Üй©W}¢áM–Ž]̰ ¡Ûµ¼M$ËQ~…Gøqú6ƒ<Têáoòݰ ‹®ö(vò¾Vª(r•ŸôšÅ.^Ш«Tƒ¥Ùë¥9ÂZàFð¶Íݰ¸cʯ–ELüÒ¸XÉ5tB׈Á`›B¡¯œÄTKã`Àƒ8#Ÿ“žj³yÁ¨q<+ SNOó¸Â9¶J†óë¦Ô ¬áþ@°ÉÊjˆï¿hÕºw£Ùu[¨“+î;W²éz[[¨ƒš óï›,‰à·oËÄ?×¢ÁÿËìÖ· ²rC¸}â 4³TñŸxš±b^É=ZpЦŽÊ (?/À™UurŸ*ã„\\Fd7¬E'Â#š|x úúuܨ©ù ?›¹×IÝVrrªàµQˆxûP°æ5¬6ÁUÙH&·NF /Y—14ÌëñÊöKG®qîÿ ™ìks Ie\B{ WùYÍÍ“€£®)Xj6kî‰x¼ïûèU‘ÏM<†I—_ŽPí—®ˆƒ•` A>°ÈP‚ç½DÀïy­YÉÜGƒ±B`Šº*ß•vŠ Dåçéµ£†+v©²ªCÖ–G÷É.hÐÍôÕ´p»»óý3#䟹 Àš`1¢|ÄMñu¤ô…:îítíåÔí6¿%xÒ‰*¨üÐgàaëÕïžòõW/)7ˆäà DÆo?A¤öé ¢ó½Wa÷ô‚xçA¡{öIS©òù>™¿LÄ_,ºÿH¯éóß?]Ç×Dñ0Q=3ÄAHOÅ€W|3¨€2/¨·FX‚ñÖ§‘`ÀiF‚¼VÙÐçû4(øì»û˸ª…§ç¾€$sáá q'fwX”¯ZO¥´¬Áàs×V¶”-/ú"ðMµqœš ̤ͨ–Í«ExºJÔ‘åëp𵨣òÿ¬ nãu¦ü3¾‰Âíõ/^ÃÕŒ‘’QŒ@ݵ/F.øèiÔ2 Û,þ Í1˵âòtVÀ¦¹}pö‹õSVd‹œPPš‡Ÿ^©nEÙôQßïq‘‹Ž¢¤ðùÖ~ @“.ùøňç,?,óDáô¿¶èÅUº·¨lññ1½ji›Þî_›N†â«zPó>´žL™?iÅ3?´‘çI÷‹µgŠ'DÙù•ò',S3mP=„ŸAï?g›þö¦€výí‰3pßâÔ/rRÁ’º;‘Á…˜f“¿Üžü~Ø9&ÚÉÃkð¬qØ;°Ä)>b XKr°.ÂÚCêÔOÞJKmÃÚº%Ü—‚îs§ ä_£È X÷Q‚D¶AECá± ZrŽ&W¸;°—ïé³q1—§VCg‚pŒÃó³Ê€Êµ9ÈŠ/4"ŒŽQnG–|T>ÖÛ, íºyü?ÅÄ%.Il{­q\.€}A®âé–-IdocGû0®sqµnðBsáaŒ;2©üŸTbÈ](µÔPÂù¦Bq#wá"CôÙãºú#ΡyØ£ (ÿ[ü†mÊùB¤p¢€å!mêMB™ øØ=°"aŠX‰^¥7‹(,b–^büߌæôŠ'Þ!8aùsW‘¸„KÏ5à ¨›Á½Ä3«%õaÆeà"ñb¤(°xÁ'׈‰ëÄ_Î2<$Ù‚­€U¬Èè«ÖO7Ɖý)ò ÈÐDáP;iÏ[åŠs½_—yf|˜ƒ¯×§L~."¿åcØÜ'FÁX"速0ªeM¥¬˜´°Z%T»s`ø*×€žsávì3 ŠCáý5)9î£gϯñÛ&‚§ÜÒ\P܆†-ÂeÃÖýÐõõ0îA¼=|HW5†•ZkÜõñ.Æ0ó:Çø¸ÇǓό]¸œ¹¢ÍS”Á Ö´.ù  þ÷l*gΤOµáNÞSÎ@¢(„ð}fk<±y|£JÂÔl6u/3­»sU‘=Ê1&[À^Y£‚ZZ`ŸLRú‚B.¸Rc¤ÍUW“ÓºiÏ>"˜fs8tÙ+°,®»³ëÏÙrøÝÉ_b4—endstream endobj 311 0 obj << /Filter /FlateDecode /Length 4544 >> stream xœÅ\Ýo#;¯ü Õ © Ú c{<¶¯àÐ}!ÄGwyÈ6i7Ü4-iºÝþ÷œãññW’î"w:ÛÇÇçûü¼ÿ¾ì;vÙãÿüoî/úË»‹_0ûöÒÿçæþò·×¿ü«ºdªãL—×·n»Ô²ë…a—J²n4úòúþ⇛/ún0F3ãóc\v’Í~G^?çûÊ3K?ÙÍBÁRý8[ãkOƒžíã×ûl „/zûŒ SÓ9žðY÷@ãèž,)ôl‰Ï¦ï%W³»“Cÿyý`3—ŒuFJŽ<c'•6—×¼¸þųküš÷ð¹™}®Ì6ø0‡àcÇŒ_ݰ&Ï7øÌ`uØÏÁS8˜Á·›û^èÑr‰«Îh=ÛÒ¦™n1Ý‹äµc˜1b”È%†«ãwØ}“çײßÝOHàÙ0Lžì`ïÕK&“ç‡9°µ…ìAÁH¦¦ÃŸÊgÎsGäW¾#´µÆv0±?(1ГâC§†5ûÙü ç íxü Úð»é4P¬Aâ¯W ßßï÷@¯är¶Ùáà9Øòpó©[îï>̯ëóïüoFήàõ•BÌgOŸž·«ð÷8û¸Ó?wÓzöpèºn^“³E oa÷ÑsGe!oxªZ€ 󋽌Q–- [ع˜kŒb s3Ãfø÷žÈ)›øã2a¥õÕM¡`׫{F=KœRöœoa…ãŒÁ¤ Jð`ܤÀȼOÙ`ÇÖ„«¼—â<œù#¡yŸËš^‘ç ‘ÍòþŸkg9¨nFV-ΩØ0ö:öB:+n· ­Ý{vB2vXñè™3•ÆŒRš° ˜¨8îÜ@«Æ^Y1þ[þÁÁ­§™‹-(v0Üà¼ÓÁ,sqð²Nuäy2‘ôwsÐyüØ2ÇèxQ]ð5ðWÆÀãàX½&ZJ Þ2ÚÑ­SÍ>Ïåбɗùo·D·‚áTÝcb$¡ß¨Š üÆŒœÜ•6&òbç¤k¿Ÿ/†ÎJ&ä=…éL9œª?õKÔ¥PÓ¶…k·Ì­Ü†ÑPäÞÓrNÙädJQF„уHØz sK'ð…ýŒfÃMx‚éÄchš®–ˆL³ðJ0²†óJ°&"[X0ÿ\X0÷}Õ‚ÇãÌKzbÀgÀ¬á%S<>L˜$‘΢6¾M»ø\~K‹&¬0L¸þ×yqÂwÑËß,w»‡Cüûn}ˆžþð‰ºýýæn³[nÛavÿ°Zocñ¸_¯67‡‡ýÓ¼NóXÌ×SWž­ÖO1¦ñ{qZ~^ÇŸ–~8œäÕÍr»½ŠÓÝnÖ1òá3H¹g¹‹ÏW_®âäṉk‡>ÕPEFíÓ*ÑÔuSl18· §áÇf2î›)‚Yf‚ 3ëƒ-Ýk)Ì©°6Æ\§ÃZK¸©x˜t'ö;0¥¡ëÜw NÁQGý8â§íB¡·‰IÎh˜æÚå9‹_XCPÚÚëÁ-¡ŒªfÎÁ–¯ÜžœaVŒ–™ŽZºÉ¤?ÁiùÑ‘Fƒ—Ìg0àâ „c=šnX©4¯I%\LíI3¾t§†ûcæìæìÌſåßݤL­$’^xw>Qúþúâ/® °oR •6ÊNHs)¥î„¤2à#R?â×zó2 6Æ9YæÃœì.d} ûž;.°Xál…fpþƒ˜NŽ£D>pøklhýã¤õöÝ-1*¯i8â…þÎÍ'Xõ\|`0^Í^æà”ahài@“é‰Q•ðyžÏãƒ)NÝës®ž…˜TB«,pBòLˆbâæHãMË@­ }Î5Ïpèµ5cp^–¢Tã^Ýb 8úœW=6Î&ôÛˆ)ŸKΤf‡XùMæ ÙÔû<Ù8’T°N šûY¼°`~ ‡Ô\´ª)· ÎÞ¤v yƒyG’G5¢®‚ P4£r¬”·¡z¤ª’~$ç¢ ›"‘[²~ÓzÕôþ9­)=zCÄJaLwP‚_‚§Š=ûÞÛk°yÀo•S·Ì„ø îÁ¬ÝpT¬ÏsûЖV-'‹y S-gaÔŸ-R¢¹óGøy3å«ò~~ÿ˜{}úìISªj'Ô „~rRùœ×àÄõ© n2IË|°±IHfð\`0$±D<~~…a^Ùù’¹¦¸MyÎ4¬nªTÑCàüQc…³‚˜*÷*ÎÒø¨éˆS)¼‰-Ãl*‘ª‘®‘5Rt ƒCÀíRÔ¥aൊ͑€0“ÝÅÀÀm(ž™» åhîÂd6ÐçÔ[MºLGVNëNc²÷Zš¡‘誳K.>6ÌʰrÄGÌþ•H).¾‡ççå’nÙŒëÃ. #qËç¹Äz¢p*ax¯S)§Y“MC>æjç·Š§z¬Nb¹ûöÌ¥e¹èô Bãæ7nX˜Dg…?òô#ÝÀ©¹ÅHËá´Dh%~RPÇ3Öº%÷yʹ›Û ”(_·9g^ÓtîåkGúÆÒ9D£c¢Õ¬4ƒìX²ªžfÆjezˆ‹ÑqùÑ'Óønêê¡âÉD겨 ü\#Ró*ÁœÇÌ'Ò”í .0HÄ ¤è¤œê^ãi°X)üªû>H¢"ëþ8·Ôr»•º4•5›^À@†àbÞ £O mÕëç_bëW‹Øéû²Z\¥÷7hL…õZõ:*ªXؽ¾÷BŽ¡pÔ¢¶@-¨–RB×RZä¿ok”A´uCyÛZ Q&S¼¢µçÓäLÛÛhÊ~0ÈÏzSÃý&‘_ø¨Šab) m±Eÿ×øu´ÏÔjY´R†'7/ºü"¿Í¢ üÎdË=¸×RKçbŸ£&ÇòeØFŸ×zû)WRDÆ”MBŒ¡„©Ú8›ÀkèÆ6"‰»À„u°dR¿þaò¿<±!”™ßà‡Á1ŽšZ×i¥‚;Êm|P4¨šTòC3XhüD鯈np žx.ø¢õÕôuá‰Ò!žJfÒX1sXI_o4Vв¾Ý7–#c.e‡oå&jJ½ÒzÔ£±t¶®Ô n˜Ë ìkÏR¦ßÒÄÆé‘à" 'dß:"r@ M$RÛ·Às©|uבš¦+ÆQiÆ¢e>z³  ÿÅÆ„á_ÝÖTÅ®TzC“RíiiÒc[vx¤§öÆ‚Öúé$j^¯å ]Òài¿mœýþ>?›¶WAÒ˜V²'Ǭ,¸ ¥ºS€³ŽÇèXÜ&x†ÿ¼(ˆM*šÁFê()cX>ŒVÍOˆJÑÉyŒ®Ï ÖqŠ D€$:& îE®Á÷¹ŽžöYŽ8ƒé¹Ú¿ˆ 5Œ4ט†®G•r™ž«0õh{±ÆiÃgé j~ģ幭Dgtr ¹£´¯õñ¬gjD ÒrÛLÚ[Þîcô€4 Ý;*'v?ðø§ß"3,Ù´ç:Œm«ä«Še¢f§™*éÉÊnv“Æ4ó)ºo s[7¨4¶ö[£š,E€¼àÄ2ŒCE˜i´ÖgÂ3£`!i+Z{´Ÿ]ÇÀTÇ6aš‹°YÚÁû:PƒÇOtÛû³/wûÍê}„$ xó×ïöë§Ç‡ÝÓú*cÀ5ìׇçýn½Š¸Œ¶ñ²ØÝʼn¶ëÝÝáÓYñ °’,÷»ÍîY^íÖ/˜\N e–«HëûøÇþá…€8>>Ççå~³ü¸]˜=¹]»}Ü><ïdƒB=ÄLô‘vêoÞ®¶°iÖ:º@$Ù>ÅŠ¼,Ÿ(päpXœíËÎcÚ;tüëÝî~yØo¾tü]ÜkÂú½€ïŸï×ûÍÍ»ÆÚOÏÛÍzÕ`HØ%E*¾A–+ðc¬=t·ûåýšpk³û¼Ün з&›þ0Ûnžñ°ÁGDŽ.x=¯x/þyõ­@ä‡cÛ!+ž‡üŒ# §Ù§0»™ÂÂqÆ)ÿ*Ès~c)ee6~Ví•[ÌÉIèŽÛqÅYUœ—.ÍÈS0™"¶˜ÿWqÞØ aÌ9,@9V¤{Ô ¦~ÛbfSØò`ûÆGyÛÉGÀv–‘v‰z «IÌPï1¥åQĹKÅ‘;<2c}¡]û+Jd•EÀU¢=sœÔ± óÂ,¥ßOÖ*ÌO]½ÞbrÜV7’2K{/y̘q2¼ÒËEåÍ /:ÄV RK, b~*µ;Û[Ó6æ9AžRj˜àÿqkÈ9‘·o ¤ì½Ãì—°´¡A|ÕªÞ¤¤g)8‡ý~»Z• š¥W@!÷ŽÕ£èy3ùñÄ]+½I潓À¾OQ<)/ þçENZ¢“žè…“z‰x¶R|qÀ6ûAÏÊBÂÒª0ìrIîñØšWÇhéœZüV}œ¦I-A^ï]üR˜ÎGïÙÉ,¿Ë뢷nêFf†#JüßF×á¼ØüzvÓã#© 5;È“K ÝWóþ•è–;[&Ö!­– ˜Œé8ç’ëÐ ÐF×NüÎÒË;±æOk,áÞ¤–ezíew;‰d oa¢{6e.‚Nð™ÄsÑ[˜éùXl@ÏCž=èÌ{ÛÕ„<÷´S½Úò,4ÔÞ|h¨FªøCš.¹ï­Œž…d@ôFú8ÑI±ºÍh µè™M&7Ü[ˆ†Þ5*šHÛ0’)ä4äÕ-ˆõãjS¾w =¿s{½ Š™Bz|àYX›žûû+Ø´˜Ò“´a†=ݦíy!;rrì—Cç‚”uÞàÉžëß³ø'r¦/ #´n\—ýZ¡›¶†jpíÀ©ŒjùŒ%]? ´9«ëW+þèNÉXI¥Ð–Ì€r šcOî\uš´òÖ*`Ù‹¾ ¸Ë ,PB•]ó%4µÞ’v/Òü¼dH8g?wåÖ4ñë˜ü†ñNôƒ ù"Wç\c-ǵ =k§«NŒ„¤)œÿ÷d¥Û©DB!˱n?%rFƒ‘š,ŽKé}ró0ßJDX"oß$(ô5ÿwK”(0X·é'iãÁö{7ïZ¶î¹)K?y¥¢ZÆÀydÃsºš4¸Œ×· °¨zÒ^Ø ­¸v ,4¬šnT††„ÁY†¶Î!ímÅ"Ò¸JN•M§*ÒNp« hçûXàäð„''?ú€Ñí+µ UY>‹K‘òá%²¬CwdãʳÉApS¹µ2 0÷ó¹¡ÔZµ€+«2•ê&nBÙίýL–WF&~ø »#ª‰ ׄ¨%ÀçÀnNuékýa| ý© =¾ßæÄ[uBM.q“Å?Fò¦+(Ñ!}Ë%ØA‚@WÀ+fÜNýlô*_y w£LW©;_Jp‰ ¼À(…9ù Šþrñç©6endstream endobj 312 0 obj << /Filter /FlateDecode /Length 2791 >> stream xœåZKo¹¾kƒü†9ØQMX|3Ç œ AÞÑm7­F²kd¯${ãŸ*’Í.>ºGZk±v»‡,’õøê«b·;Øú“ÿ½<œˆÍë“ïN ¾Ýä.›¯ÎO~ýPz° ÆÈÍùõIš8Jî´Óg`gƒßœN¶??=ÿ7ÎÕxØy%hÖùþäëíûÓ3±³B(o··ìù=›”5ÛGöþÐŽÉÏ;6þ½¿aÏwìùu»nž{ÅÞ39ÿ:ÿ#½:I;!ƒšNò»¸TÞ ¨Ä8=ƒí=½ðBˆk(iwà]u„lþ# q;üö{z-…¶oH_çòGy0ž~¢!ÈíÇS£QºòÛ &žï€‹àc¾%ù·ìÇ+¶øCZA ™4Ã÷TŸ#´ðZÚJØžxú­Zô=‚ÏñÂWK7ç íyÐt «&©–([ÖTe†ÆE6I¶ švUQŸí‘ y`Ñý ûHg ÐáMØœI½CHr–Ÿ*0¸L®Ò›VM<ÒÜQ8tPi¸ÿÿ¿;þoâ.!@([ðÓñ&HÜ€TKĉ.@2íÀ«îþy¡Hœ[5u…Ñï¸L’ÀûEXãQÕãðÎÈYb.ÁAIPA%¼‹Ó-€íÝø¶—߯P tÿ€Èe.QäÇÚ»ºìÊ·O~Oƒj ÔÎB¤u1g@BZôXo’— ºgšŽ‰ï²^€yå\ ÒªÕp¥™'÷®äèÞºJJãÛå}bÁ×Ì¡q:,9gG^ê>ô¾”smBþr줔€G×r2÷!ŽŽ]ì}näJÑcxaä#=ºà’½³^ešÈÙGã&À¢Ïm•¶)ö”Q;P{Z§íÆÍMרD;ÅžS¨àfedF¸3ÛWÑÉCàq· С¤Lzs8QåXÊï³@ídŽÕôþîÀ~¸JqU”Eⱈ;ƒc|‚T‹ƒTRîóŸ7¿~s•Þ+H8_ãL”mYÒ":.t›F Œ}´žÞ¨P‰ŒïUÃÐþX÷[ ›ó?œÿòëí_3ÊxGªM<òM<‚™iÉŽRt|S¼Ð$§õ¾¤¿HÈ?Ý&*ôXÊ\jçÑhkrõ“è'ZÍ£§Ãäh'RÔ p¡‡2ÎGìà¿=äé ª×<-!F;,G|*˜µö‰–À$ipÆ4ÆJ‰;ÒÛ¿-äÈcÀFÇ´`AàúÊ­•sÙ[µC…ƪ“2Çvò8\,l÷"ïTÀQ4¢q¢Yë]­Ö3‰”M8)›…¤Îo 5›lŸù™×I`ö²ybEÁ<‰·ÐØ)—Ú«b;9€ø¥üݤëHñ ö—²£b‚5+È”gª¹ÆI„Î51øÍì‡Cjn§•öÈÌu'*jkÜì 'bÖRñhû6Iã`ª›¯€¥A°ÄLÁ‚®ØáU ™èñ¤ÞµyŽT—œH^-Œ9Fѳ0yÈ·Ïã‚q²6ÇDCÖ¢2ƒ¬Žq½ªG+1æ|ÑãaÞ¯¢¤»|f¡ªŒˆ6µ"ó­í/ ŸÐsZýqa•ûK|)ßtÕi}¹)È뮥$ÇŒ7¹ÒdãXÏÄåÚz†/q=t©'sí相} }Оx5SßݵŠÔžê µD-èg/|Ó ¯Cî›~¢£¯Æ×WÓŒó#™I×vQéoÙsÓɇÅâÿj:²_ì’ìËùžÝr¥yÆëÖ¡§3ñ4á ´o[#–ÝPà’3(v²4_ºšwà8ͯYÉm4q¤:Ë+×^8{Vg§ŒÛoÙóq;eüæ* äÀ5Q—_Ñ[Dpi\)ðp&J7­Bùý: ó­Èöâû ¦Ô³Dû#ü›èAüÄ_¤™R¸Êúד@7´Cšò´;¤tŠË‚b™šÌRø0oÜU^¶„‰Kåu×—¢‰_ Cqø )5®HÍ™÷MרB18–P±:ô2øÂÌžÞ.ö‚hË/tÂÎ;êÔ ÝßI¬¤çÏ>]5æG¾î¾h?ÕÖÁGÆÞ´wIEÆnq &¸g}ÃAƒþÛ–$’ýùÀäR0<÷ÛÚ+ñ•8g°K®ïE¾Ÿ´…v'A5éx—†™°Bswaõ*Vï‚P/è/sÎþ\¯áK¥-1:5„´aJ瘛»ÂuŒeWoÙ‘®ÚçÁw4LaÇN¤}¿\. ºO¥ˆ ªÊœ7%a{”÷Sâ7=ÈgÄx͆O_`ÄÆ*– yž¯ã¡¨ÚiÏ)¢±s+‚I¬+RžÎˆ-¹W~Xp&¢f#q`…Öì[ܲÝW].‚È“GE÷]*$±mçÐ{•™zÈfµ‡\÷›R^”;æÎ|7¼Ï^>e9Ã\´ÓÎ!ÑÒCA¥y’I7µ»½:?ù;þù/ð¬r@endstream endobj 313 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 372 >> stream xœcd`ab`dddwö ñ441%º~¬þéÅÚÍÃÜÍÃ2ûû;¡Ã‚ûøw 0€Sbƒƒ/3P Ã2F‰|?&7,ü!=¿s¡Ðw†óßíOˆ ßøþñ˜è´¨ eëº7t/X2kÕÜÓv÷rLmîn©ïê*m•« ®ðÉìæ(ì^6sR÷ìIËåÏ_Ò?³»·{‚䂪 Ù-™m]rÂ;¶UdÏΖþÍü›ë·Îo5³®×ä…o¬ïÞ¾`óŽƒß'‰ÆülÎöµ é–Œi>¶rïªïœs·Ê/9±sï–nŽíKÂ;»Ú:[åù¾]øSt+ãËãÌßÿ4íéë tÎ”Ö¾æŽÆ®®9æú®†®î Ɇ©Ý3w÷¶4vtÔuwÉýüÓÑÕÞVÞ]#¶>m÷ÆùË–Ì›³næéî>°_ÚZ»Û:äZŠª\+ó»%!¾™5q±<Ÿ‹ù|În®nîn!ŸÏendstream endobj 314 0 obj << /Filter /FlateDecode /Length 3612 >> stream xœ½[Yo#¹~7ò#„ÉCZÁ¨Ã³› b,6ÀäÂ"ÈÎj²qdKc+«Ã+É3ë—üöTñè.²Ù²=G°Ëi‘E²XÇ÷éŸ'¬æ†ÿ…ÿßl/Øäöâç î¾NÂÿn¶“?Î/~÷¶pUKÕˆÉüý…Á'F×LZ>i5¯k&óíÅ¿ª¿Lg¬ÖÖš¶­öS m.ªÓ™lu­L[-÷¾­YSý›M͘­nÝ0Æ¤Õ ÛÂZÍeu #­ª¶øYY«Z’ûî‡t(vÖTËLL×gm˘P¼Z{™¦¼ÚÄ©/>|ÞùÏ ÖK¥Ü…©$Oþ‚í¶/›dGßÛ°6þÞugœKùïùß@Ñ–*Z[k­@Ùó%¨vTËDÝ0Ö tç¿È÷ÐG¨ ÒÐEtŸý”ÉÙê¶fZÛ8åý†l™*ªâHöü ¶%–·^:‡ñÚjíÄÏ`žºá“™µj˜õ³üÙb܆•rknÜá‹DãÙó0¿µ²Ñ~Ÿ†1͵;tÑ …çéN,häpfü@PŠ4AA°Ø`Qxz0·û › ¿­óÑ„;Hå¹Ï­Ös‡CW~í‚+o¡û/éºÁ>`ÛÂ:ûp{¨®§B×ÖÚê1î¾ñf nî7M[}˜º:YÏOd‚t,ê¶ïØ™[8BAoÉ»³'RW¹CûHÚ÷^YF*U:z©êL>JÿH6ïti0.¼´Î%u6z"kX“öM®•Цýóõö{IÚ¯ü°pþTþbdm›‘±Ë|.zX©>9ojcÚ¨…tˆÝfŠÛš+9™ Y¥¸ÿy>5¼6ð-M[œŒû‚BOÌßÙ°;—#9¨×¾3tAmñd{´ß±w¾ÂùaÞhÔóì,8ßÀÎB»îmîëÙA?°ƒÂ™}¶„¹^b²ÛÄ‚…“Õñ°6$ìóu†1}œí¬$Æ£¶zC˜†1º77>ÎÆ!XªV&qî÷ÁLaæM@˜Ø­ÑìSƒ‰ùgÚí~¹Ú€õiˆ} Òéýêp¼¯O뛟N÷«ËWËÕi±Þ¬–¯®¦ÓbÞ¡0“s Ù¨ ý[ˆ¥?ŒpÁ¶‡AÙqùC-õyƒj6,ó4ÍÄüŒ†ü€r·!AtZñ1:{¼#1å¹edi®ð+²‚±”²DQ ¶§“œû“ø±¬Ÿ‘¼cŽ­â5À¡8Ñm>Qص̣WŒ€Ýô¡'LBàm®ŠÚ°ƒô ŸA•#Iö4ÅHÇ«qá|¨»ÞÒ©l:3zôs`"ÏüóL2æªÉÏ:‹qý.o’ä¡[Œë191Ë 3SÄ7ØO .}Úa£d;™˜Tªáݲ©/9^ óˆ“ø’Å^én-›Y$`b@‡ÃüC½Œ„¨¡XëÜ`Ì6V^,Ï(_C锤,ÂKPä9ÐB<™€pÛIÄ—°Nê>DO„رC¥îÈht;€eØZô 2Ûµorg)`Òû÷­ScH¼æÄÈO?¿÷Ÿc/Su8§˜ñŽáì}®~Ç›†,çýǯPïìºñèd3cÚÆ£²Žé`HŸ!áBަ)Ú¦Lfë)K®Id+¬9;iÉ+éi¢ØAt‹îu?¶@DeÝNæß]Ì{®ª €…ƪ‚Âò€¯* aˆî ª@S^»@Ì#µ‰pýÈä 4kYë¶ ¦ë°VäÚÛ°w¤ã òý–|'ܼ¤Q ÃxJÈCõ`@ÈÃ÷c܆L 1œƒ»ÜС‘¡}ú…þWéŸÈ¤Z¥:£Å·s –!ëdéïC~ºNÏ „ K'“¬DïöÆ“ŸwË©w7«D 𷨬„k‚iÀª»°zWF[0 Èþ‡oòÃÏ‚4¯µC”ÞRÿ1uœ=‚ñ2r„¾Æ­‹½‹.ߤîEƒè˜7¼Œ6~z4•BG0.­q•fZp¶†µ/'Ž˜€©F^Z§`¢6²Mü­çEÎ5ˆAC˜šðDº•M¾˜ôüµF|¥‡R \áÅd©S@Æ–Ò9 M‹ iª6ëëÃâðxU­‡Ó˜òü?€Sj­Lg¤î—H2*´üþ0‹mVÿÜo¶«@ºÀŽþÛó¯úuì @aqZ„AЏì;«Õ12œ5’¹nöHè…l6ârþöÝ›×½(¤vâòÕz»¸]½zíÄ( ÔÜ;îÇ¥ÓÛÃz).5ƒ±œ×V¿î±ÞÝV‹ã*®WU‡Õ6vZïwqªzõ¿»ùú•᪻-¸ßê›ýæò´:ë¶÷‡ãU%ÙÕÃFF– Y¯¬õ±o/×ëU™²6ò,]UÜ€Qé—ÓU¨aÏ_ˆ®ºupýEø*ÊÂãx6_3èKŠ_(ŒðUË{füLŠÛᶉžIX•`.[gP+|ŒòÕ²véÉìFy*Š.ðTÜV8Þú=¸òçozÚ¶*“G´‘± G/J¬™.sÙÕŠòZð"©2ª98ýzcFsœÛ† €D·]XOöõÐ]2ŒåçÒåw©A{5­gÙáva™TŽ|±7†øOH¶ RƒÈ'!»ÔŽ?¶c X6.RžãÓ –›ò½È>-Àâ¿}%>gjÄ—æÓþðQá†ó¢¥ƒ6Ê Ï@-eÒXQy&“Æè΢Ĥ£{í‰Óöµ*—0d٘̓h©¦ƒ‘íYbX¦Ø”´ü‹•HAÖ„H‡`J ¸#Ò#Õpe‰4£>5Rµ{‘™ôÿM¤µÐoŽ%äVnžâµR‡R&çµÈÁ·¤½ mz½ê¿ðÚ¾´õID]×-×;Ê.ã5{ ’¤>Ä»z°â««»1îë,A¥\Ç5.^À¸±±%:m}¼ï>SN‰uU†ÿÒÕw”¯†g šóäåÕÂd¼àw×-ƒø8ÅrcŠ–Îð„Ð&\µ‹î°·›Î(ñ,X@ëŒA/-¤’\w ÁHá¥ñÂ$X¸ñÂ3Õ½0ïÃ̼ AžÈÊ”c(3»ŽDéŒåcaÏňÚé¢\ïöKQç‘î’8òºˆè ÐÃG1^8’¬1¹4#À ŽXcOº©)ÂŒ§‚ÜÆQ ô‰©îú¥SUÊòœ2sVäFb^·´™/ oe²•AV,3—ù$ç0Ÿâ}K=úŶ°wZGpcû×ç ³¨€4ïÑÀ†äÀø09QäA/„ÿDÚß’þß‘ï?ö›|©÷6€pïø†/¿§ø!7á¡PœíÍüâû ÿÀë0þæ+»f¾°ÂfCI†K´þÑ—&;#Ù¨Ré.ü/R`ÅC¥3ú ]°‰ó pÆ1€1>™u©uŠeb^d!>@ZQƦ/¹vSœŒµá²¤uQœ÷½ÿ¬²qË¥ÿŽÌŸ&/ZwÜe©û›añÕIwØjß}š,v¸`Î6˜å$3^^¸«?¢˜=[Xö½eu“=µK ¼aÿc5U§ä œ}1²Ä£‰öyOͶÃ>²¬„‰oˬ.•…»b°‡@0@r÷νFT$¼Ïù@H¢æÛØ=5…9[ºô‡¤žMPÈíì8ì;Á·ñ5%¾‹Ã»fD4ö‘ @©µ-Å7t(5ˆ’ð5çadtwÎ6M¼ê¡Ql©Z|èìÝÕ,QH‰p¤G–$4e[ŠA}€3h°ýÁ>´Ï{?¶´×ÖÔBö/¹F*òÅ7µB>k«朑¥b^ç󔲈ßè3‚Æ?¦ø‘V§20%[geŒÕ D9¼[~Oà=£‡¼0’ÝÀæ*c¥¿ªÊæ¤ý–´ßù±Ž‡?•þÛºiûƒ}ítv®Ò›ZæJ¼O€IšÆÈí™±ñžz2€]RÕBå…»‚~ì"ïÿJ:¢–¤@7xBy­* 2žøä·aÅúŽ{¬ü[b üÁv·bÝ _5ZÝÉʲÅ+¡c|W¾¹ºú{ˆXÌÚ÷‡3Xqé¹BP}ÃyXpÿŽÁ± NÜaTQa_ɰ Ô¸Š„N4BñXáÉ„ë“cÏÎ^ï»2Q¬ÆãÑa1À=ýðò-þ³Ø7ÆV,ñÓŒJC6%æx3 ¾×À>ðª™f2#=ø¹µXe;j}¶8´óÛ½lû0õâ‘Öažú ç©öPPx¢MãÞà ztÆ`ÎX?ü½x÷)F ;c¥+§"Ÿý¼Û…>×4pÆRRô­]Ä V æßÆwh),’‘káĽ¯—åà"¤1 ÄúCv"DIâfqWÔü)< Ù„÷úpUÍkRµÆëÖo\ˆòГ–ú¿rJÿ)¿b¹/?ø ^îËÉÝÈÈ­=ÓÁ_%ôæfþ1,˜^ <ƒkCtµe(´ ‘û¦+}ñ?±Ïümendstream endobj 315 0 obj << /Filter /FlateDecode /Length 1149 >> stream xœµWÏc5 ¾WüO\H q~ç€@€8êmgKÛ™­ÔvºY`ÿ{ì$ïÕ/}íŽ4B•¦nâ8öçÏŽçC§$tŠ>õ{µŸ©îaöayµ«_«}÷Ãröퟡ+õº[ÞÏÊ è¢“Ê$è‚éSì–ûÙñó|¡¤K)† çeÐâŸùB;UëÇ*‹_H©”Çwt*)PI‹'’CŠ):’I9$UEi âD²MÉ-ò…hEñqÏ~lH6 48q˜‰,>3ÞzŒ£åÞCeűÞ½†‘Áõ–m¬øé;ÁÌ‹-T+ÁŽßµNë”±.g• ‚ß–cQ*æOlýÐC›¬éoõ ÒèÖO=ÌQü5X¯‹ówÜádîÁþRÇÄ÷gÏÞ.E2Aê³á\f“ÑÒz•ºåo³å×oÄïY[!ÊÙE¨¦ˆP5yQ)‡È×á²WYÇ(-½râHgrÌ]‰¾Ð©Ì2¤*VÀ†u̫Ԉ?z˜k/‘”š°   ®p*TM6ÙÊÔŒwâ#9‘D_m4xŒ_W회Ù%~gÇO,@~â ì¿WtÖ%ŒŽêmXÞ’]Üû³­’Q:´FŽ[‡¾\c9Ûh«¼aòšÉÛ‚B4ÖŠ[f²<ËS„pˆ³Æ¥êÁšüß²ø¯a´b2wÇÎ~*…Þ£ªòØz4vÈKƒÉz$U¾É ÖHåõÃ7äyÔÂ8ï¯Í9Õ ±¦¯a·/•†´4É{ñ7S[ä®—<„\¾ ¬ié¬éø"X롸—Yv ?Xíxäü3+÷´·¡½€èÝ«BC÷Ê󺉔ÉdÕV }¯øi5U˜5‰SA*ÂÈ$·ÆÌ‘ggvÕþCL0Á#>6NaÇäÞêÏã«Æ:U®/F9ðpÅ(?|¸Âº‹"«…xíbÎRä—ÃŒúÿ»â©×"­ð„ßÕ;‘*\#rlæ·«Dv £û”\4>^ü;"FDÂXöJTÏë+¡!1&8`‘¿ç ‡hÌ ¢™,st!„ÐÛkºÙs~>¶¯!½58…¾ªÒWtê©XÒ`Y¡æÂ¶8ޏP ÙS­k›ÆþhMOÖí“»+- ÑÐÃμc4ß =•ž •õ‹Û-9XJVxQK®7¾¸%W}žÃWeaÙTþ£— Ãð¸Èñã¼Í›mßøHçjÛ³*å§mÏç&Š¥iû¤GxŸ¹pÏ£ÇÌš‘}›fž®mKÎl›ŠÕ ­4Px¨ÆMËŒ‰y­÷.–[oÛ!Ê^Ä=S¦ˆf䛜8T|ê8¶cßl·@Å8Fò¾÷3Þôóîî&ïuŠ2ú8bËDýÌ„QZç†ÑâËùÂ#£\ó2r$xôÃ-´3­C8Ê’‰ˆ‘öË€À­ÈÃð›,ZšÄwýË\ºi´mÆÞÇsð)|SÚ¾ÌÄ'Þ‚´!Mv–W¼ñ“ÿø`‡à•Ÿ#\º…CÕ\v5³«Çv\ÎþÀÏleN+endstream endobj 316 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 317 /ID [<51a450ad9d4830d4af8116bd710370c7>] >> stream xœíÒ« Aà™/ëmñ¶¸ˆAо‚yÁâKˆÁbr‹ÕW0`5[M6“Iƒà£`Ò´ÎÿcòfÃÇáìÌ9~Cà3¤}  ©ÕþŒDq¨:þFB¡Nˆö?!Í0PÙ¸Nu6´Èƒ;X«Ú³‘»KC˜ò¡ÁÚæ{eu‡:Û…ÅlÝx² ­§q‚ L±ŸÇÝ>;ÏÄ&0áA÷Îí[˜.qW…uæVܵĄ½ƒZr»|ÒSý L–éXi.6Üxæö:,ðU™oøÂÏź'i endstream endobj startxref 843267 %%EOF plotmo/inst/doc/modguide.pdf0000644000176200001440000024126315126340240015603 0ustar liggesusers%PDF-1.5 %¿÷¢þ 1 0 obj << /Type /ObjStm /Length 4434 /Filter /FlateDecode /N 94 /First 791 >> stream xœÕ\YsÛÈ~ϯÀ[œJs_©«dÙò)Ç+y³Ê¦ü@“Ę"µ$µöî¯Ï×3H¤ê(%ECƒžžž>¾žXfsƆL†ÌYëÀLæ¼ÂYdž£’’è .”ʼ6£YCÌfÞƒ_…¾‹û. )Ÿ‰›`5(ÜGÓÁi0O]çA¡7(Óè$—^¢_(Pß 9Á ÕÇu†÷ƒ†q®  iNâ…à ÓXŸPè\öPp’A!Ð#P–‚²”ƒE¢×èdu@O 'P–C ¬8jZ‰!³Š ø Écl1ÖPDÐW¡,¸‚1॑[KÃ*À¹e­0º”5½å@Y(…eíè(kf(Ž!r l$$† (4 ”åx””1þ.#U±BШ¡  CÊ–†Îƒ²%=([Ïq”m@7I04¦((H+œÁëS} ¤„4ô¤­ÎŒ¦pÔ oÂs¨(Æ…`þôÃ;,–ƒÑ`9ÈÐ6ÏŽ2öqpV,`(ñâÓï—EÆöñ|2;Ëž=‹¯ì]-Ïgóì‡Óâô”s£8wšsð mÀÙ§²-8—¸Ö#”Ž!ܰxÇÉtIJ{†æÅ`9žM_ –EöäÅß$—–C• )¯§Üÿ™ó?ÿ¥¬‡¶Ÿ¼|*N²oãåyvçóâß¿›ÍG‹ì .g£›È}œÏFWÃô^}|Ÿ½:Ÿ-–‹á||¹„BçÿPçøêËŠár½»J¥®YvÕ•Ý!¨tÄ.Ÿ¶Ä@×¥¨HN¡ëŸÆËIQQ×DÉ”o¯ÕŒ×Ū¢híJ˜‘›{æ¬íýÙÕt ÇÈÞ!ØÃy’fÀÑ ¶N'¸‹xJÏ }ñ”®àâ éês¥SIÍ*šNgK".!™(Ȥ…2i¦t…ýÙtYLñBH· Ä£ñàùì;(pü,,ËÁ>S3sÔ¬Ôù¨XÌ®æC4L­€ ¹Ö¤öóÙð¸X‚ûøâ\ß— ðìÙ:ÿϋ"¾ÍÞ¿>yûãÉ_÷`Xìåt8§gûy<Ý›.Æ«ãùb¹>˜“+ŒM¿(’®AËn¼”Uƒâ-cËÔ¾¨ØHÍþ<-ÏI`äžx¯Ÿ‹b¬~ެʰ،¼ÛM?ªƒp‡0e»R‡ø$ã󒯮Lu÷s=Ћ! ‡ƒß†W¹|]ŒÏΗóp‰ŽÓ|x÷ؘ\Ó› K®jm]m mmôÓƒfÒéðÂôÔíC]–   /tÔ×ÒÆ3Õë{P}:Ê,õ! ª€Ê ö  #Z[EÇÇg ŽÅp ÑÆOw"#Õ$ ç±gñ}z¢³p[’6Á×l®5+zI TgB}?2Šk#R'Il±^ùœî'¤su˜ 3D“VèÌpÍÒem{ì9Ûg/ØKv£xÍÞ°·ì=ŒãûûMäû‰ý“ýÌþÅ~aö…}™†_ ”ÓeUže6dÃÙd6Åß‹‹A´¬Ø"+.FƒÅ9Ìì”þYü÷ìnÂNá*a}ç ö¼˜Â ÿþÂ/`ŒÓñ´€EÎð÷’]’MÆRj1y<±_Ù¯WÅ‚B; ³e1ú2‰5«‹T9^¥"ù¢¸'vÅohy1þÎâsY:€å·»b¿±oì;ûýÁþ(泆OˆN6úÝp O¡ñið>Š»éBÛ)4í´¯S4Ûì:~àøäûWÏAÿùIÃ\@àOÚt…èøÞÓ'(!“w‡ VǺõWÏëÈ}½Éb«èC(;ÆÄ€«ê0`+¯s5ÈŒb `}ê­žU×ÕSuÔSô YB7 ˆ^»S]5ïðVýMom~Ò¥Ù¬Õ­Ýnë.ÇÍÚm‘Ò±½ßªáFuP…êè÷A?VÑ£­çůWƒI©í-Ç?)‹R÷opú¥sOμá¸k§Ý°d•u¨¦»é)õzÛ²Ñ¶Ž–¾¶­cð}MTM[¡;ÉVÀ߈èT×T^?ùê˜"…ïëÇC×PLËPLo;¡Y’òèè‰5 Ͱ Í ?V;®Æ°Ô>Ëš[h»-‚R6Rk ‹lKC6=]–“}cèË·‡oO>õ¾)Ø&É·s°þ’·¡>º’oÚd¼ì!y~½ä“« j-É«¶ä²é+ùmБü»ç¯?쿋舯g1ׯ„;¤1|åu%¸UÀrtÔ×JÅsí™ùfÝþYA P¡²¢¾ëÖRec¥eQKÔªEº¢šQ·:+nêû©&Í¡RɃ[º[=EëIUбOñ Í£U:Ç™WMÑà`CfÝJ(xÃÔbñ!ºþÓ…:Q¨R„FHXá ~±àfÔß ì&¤_EÇ ð,„Ðô‚ë¶E4u¶/~By#~Ú>¼}{òj?Å£†…˜¶…Õ!-» Þöµkw ·š^;Ú÷º56½Q½Å[ï¬?ÙÔÚæùÖ2ߨÂMÞÇÑn÷4&›1Wª&[åô ‘ýDF¹ü€ Ãñx8ž¯.Ry9žŒ ÉX_K³-j£-M¨wê?šM&ƒùj à›^]|)æ‹ñÙôƤŸD±žü—H0È´&ÅTØJçÛÉü º&:Ô%:¤Ì¯‹+«M¿e[Ñ! ]ÓÐÒPñ&x(kÕˆÍÇûéèMõÚÞ¦CÒ­'çËååâoŒíí}Èž^Îg´ØÏægëðëà¬øûåd¶¼€@h*úùl>*æå4wôuûñ $]¼F§h–{HóØÚ‹œÓ¢!W¹¦‰¨‡ÀϳծäýxúµfæâkO¶±=Q] ÷ËzI€üë .i}2W4É<½šL:¬árš+9“:§@uœñÈÛŠ3¹Æš79W¦°UîmØÂš2"ŠÖÞlN8B™;Z¯ó<§%Þ^ÌÕë.Aa—‘KÁÈ%¦\ZÖp xº4í*ò)ï÷)øDÅ'*>Qñ‰ŠOT|¢â•õ5ÁË…½;,’ø«í¶Hrë’Ææ<ðm#dUn…_Ð"µÛÝž9ÅCÎßœä<ÇÈXXMs—{ÀZgrz*öQÚ†¨@Ȫl2Q ²a«rÜoÊ€ ²z>±,…,=ok§J ¥U•:«ìºû:›r·P! ˜ôB¢3P´ã êÊ:šª@Þ*ßhBD›=õ´:3´øàp€èû‘sérNg­üy w©6ìR['«r¹Â+øË›½ŸxÞ´pàuIjp£d ³"܄ښ«‰Ô:‡–£¶bz¸Â8 Ê(O˜±ÅzD·U<JPœnÁyªˆ\+¢w¦çÛ‚½UH÷7GthïÝœ‚ÝêÕ$·p¡BåÒ"3:·‚Ó.—⑃¢02w´éI‰\qr½<7´ÍÈäðÕÍÛMáfK{›JÞ”¶  [wg®sÊMM ƒ3×f›ä$†ÓÓ΋¨.5Gð"-sßëÜ[H EÔºL++›ÄÊñW­ÞÁñkqìP»Î£—?¿þ‘0û›æJ9ïøüæmÙ{ÝAq2ŠtÐOñÕßzާ5¯¤Z×iË­êÐB™¥iª¹]û´)ƒž¡– ™ ôÆÖl=>Ó&•è¬øêZÕOiJÄÇ¥u^5dH=Rk1€jk×õõí©$¡Ûë ieú°^MlXfî®›õ˜/êN •kj­uƒÕ*ok’ô©tå2/àuwVHtZj¶GžŠNìX_X»ybPòšñ¨pBÓª Æ*w±I}›ìå#Ë­`dPómÜÚMá‘2 “CEÓÛxÛ!öt‘wp‹½F"Ñ冷TÝ$ Fl%uçQ2òáFÉuìõ!×rÛ(i|Wá0:àL#°9‹Ô†SÒ¾k^l“4mbÃ&¡Ú$TÇ7HSßYšîVqèОö*çȪ€ð(:襒0€ ÷:9³Z*æSêm9¬¡¡¶9r©\==c¬Î…ïÉ[á|0Í牯ьÂÈ Úö¾/†çOÓþàéÙÇ4'¶È/G§»ÏˆysÚ(¢Uhñކöjãúc±Ãÿ27~ÅàlØ•¹­@qÝÛmóp&ÙŽI¦i’išT×$%²‰†ÝäïÌ-Ô>œ¿3ëS” ÊO»R¡ÏÞn¢”<'œ@^ш¸—ÓÖ}‡¨DŒìèï6Åñ»ÏËÙ‡‹ã»K ÉWNk¸–fAâ¾-“øt`ÛÜëžë¾6˜—A-Ûæp œX5sŽ×éaîv’ó´¿RXúlØ‘(òN=.s1÷—NçðG¦øé]œ¨x\Éi‘ÓGK&äQ^!¦üÂID×ðȬAìåÇ ªÀíCG|ï;)qoÞ³7j&€eذ (!ÊicfN)•’fCsª°9Ù³;=!wkÒWЬo¹;§9ë[%qkkèÍi_úƶ­ë•Áf}Eïi_ ó]KŸû@ Ÿoß¾åãÉ—Y z&ãéÅl”íŽl”³¹Œ¶£ =1ʧè¥yNŸb<ª%„Ò¥7LÑÇpòŠ_î!”Ê{õ »ƒ]IÑ<«ñð¹’>ô³ˆ÷@½ ØßIrwŸÛ`о3u.§<6賂ÀØúçLPÛzëtµÊ°40­CÌ—ÈყO5 ̾þ`›{ó’>ØÜ Vïj[Åò|6ZÜÆÆh\Ñ—¸ˆÒ2~T«rÚéHcÌÖ¯YP§œ…†ÃsA8tÛpŸÓ‡ÆÊÒXdÀ^Ä#ÂŽ|À|²s†&xV¼Ÿkiwãí.),Ÿ”°£é(—ÇïÊAÁëÒ¬ßÿoÏhæN‰°¯bÊ,G¼74oœ‡ÇÖ'eEƒ9Ek+Á=szgKTæÅBÍœFmKKg»0÷˜Û†¤"È`#Þñk=g"Þ÷‹$v•­ÜôˆU’–üâ—÷*§¥R‚û¡'ŽØ%‚,–ƒå"Ÿ}ÏÃüê+»¼úÂ÷Ž;†ÀÏn±# žO"Ï“ "EX¯üÐI~¯ªñ@üW^AÐyúŠÒSi‘óqU#Qs¦ ¬œvZß;g·pWR£¯GKÞ4ýÇV>oYý^¼iÒ@oV¼A3ýnz¾ê`6¿¸š naQð„;i9«Õ,Aåà{æÙڃʦ„uqLzÖ!îf»ßÄmwíP~Iùš7Ê2×;ñ¶å¯Ï\ƒøi'À5Û¥^ŒOO‹y1¥iÑÇ-«db0qT׿ Ñ8§!î‰žÈØé)Ž1Ž •Çñû˜ÆÇí®™5>¥H_ˤO3ÿ lÚæw_#—­o<ßLõ¿Åuˆendstream endobj 96 0 obj << /Subtype /XML /Type /Metadata /Length 1460 >> stream GPL Ghostscript 10.00.0 2026-01-03T17:21:36-08:00 2026-01-03T17:21:36-08:00 LaTeX with hyperref Guidelines for S3 Regression ModelsStephen MilborrowS3 Regression Models endstream endobj 97 0 obj << /Filter /FlateDecode /Length 4575 >> stream xœ½Ùr·ñÉGì[–)ï÷ñ”rR‰Wœ*ˬʃ튇Ĉ—¹¤eùëÓ0 `fEÚrÊUÖhh4ú¾F?lÄ$7ÿ˞݉͛£Ždz»ÉœÝlþrrô§W~£Ä䜲›“Ë#Ú!7ÒÚÉù°ñBO:lNn޾Ý~q¼“BJ¿}Âç£wr{…ÏN¥Íöœ½¿HëcÔ.n¯Ùš´ÞÆ(¬ÞÞâsB[EëÖn÷Ç;-üEm/ñ­1ʸ½cPh‰„%ß0 š^Ûh·¯Ž\„‹yúM CN"Jï`E}»gxóg~Ï»öxdnû¼WȤàW[ ÿýÉ—ÀŒ¸‘fÒÆ)dF”“Û쬞 2çX7•ÛG¢H VB¹½OçÅÙ¾Åué7 „!áˆÁÏÛ¯æ-W¸ìší{ è‡IH¸J¡µWé”x´kžïަ‘ZoßÏgáEâ¬ñÙ)?…`aÿå)ƒy {QŒäö´ÐRµÐ?ÎpOäjÝøY¾Jp[Å^ öÌß»ù™H,Aºý¤¤5Ià圈@f5 ¯ ÑÏFB8 Üë}E)éóìù4‹½q{–)¸Oeªœ¢µ‰©;8xr«h“òtä cVâ^â ê6À-…â$‘)À‡?Ël”*o*Ïó[ °^êˆhkmá-T ìUf¾×[$«§kPi;ˆ°ûœmá?žTäË%{]äH‡Ä]Ä#Šå×O "?úm¾2ß_Ì—Q5K.é%èZaClzj® 'pJòã9mø· gìˆrè A£ éƒGå’‰U“Æ#íQ<´Œ`™ XÝ$יĉ”‘^ 0ÎàcpAW£Ö‰ógOÏÙ¾#»ã¤×ˆÃ® ±ëcŒ“„Ëží¾êy‘¬ˆuÌ’‡¢éA4¥#QåG_gŠU ŸŽwVG`Þ?ÙëG‚éƒi`(éeƒ çØÃ Dz)QõTÀ#dE¼’ ½}Ÿ G蘞/h’ê71.Lsæ ü´*>à@Ê^¨ßœ–—I:Uô“—¶H'×Ú3&O…¢¥Ý½UX$)‘ûY[%ÃõÚ^–'9.è’›HXg‡Mœ=£Š!À÷È!ÀhhòŽBRIR‹Nt´Ö¢Œ†4…ÓW:aLoœgý\y@ð1¶Ýã똄¹#;®¶ ÉûV*³®ÞT+µ`3ø?·²NDk¬ ©½`ϲ1YDL¤¨D6à¹q< ­ÎpÊ¡ÿÉ8ÞöšðH(‰d'ã Á“ŽE|a¼.˜´íWŽ&¦ v¨Ø-3†DjWXž+!ÑW.”üŒ3<pÊŠ~[c²O‡Œˆ©Lº øE Áû¿ŽNþømû²SN¬rvÝX›¨ÙfÔžÓ–â¸ÎG?:}‹q­%x×ÕÖê¨,’·É` Ý ·rW‡âëL±ÖwÄJ§Gý‰õƒÇBxd-=&éuX°‡^ ôö!»¤¾KÜÐng-"’D_öÚÑo‚A`%(‰6üôš ¤ÿîÙ…»L2¡·2}¶"‰ž÷<ÖÇ·\°Òñ¯+(.(Ï3 ZÕÉ#®‹Á0 x#é0ÐQ"Äšè û¤± ßð$Öšƒç²q0px˜a Ö'›Ñ WÍÞ¾à5ì3éd´ÏŠËê5À¬ZÖ-J‘e,[&[©Ñš'Yƒª¤í3ïz‚‘"VX,ÿR$T¬+I_:¯uòkæçÒEÈ}N{°\“Ø}`¢ÅUûªZâ7ͧòÂs¨‹kEÉ×CœùnÔžz+Ô 0^ cȰ0çŹçÉ}P<®í`7ßÐ9"»µK¼ ùX¾ôS¸R¨lsžÎ?žæP„Ké"†ÏÑ£© dŽ Â.yN¥XÍ…³a¶fÕVéˆqQñ<@º‹½Fq1ÈØ³ä×¢šu†•$P×-¸lÑ—ö¦LcÈÒæOV#€"¶V‚¤ªÄw¬EGç´N€¨p ûL‘b?DÁv¨r q«(v!ßI°ã¡š.Ák/Ejˆ‚S“shß<‘7Ú¡SÒlàzÖ“ÊË[¸J‘¦š¹úp1h$ü¾­«^$J"—JY ¿“r&lÀø,¾VKHF¬ÄTµZËÃb4†˜s°üŒY›œLÀæÓYY%s(3/ªÕ¯Ûã…:—vÀg!KôùÏ6Œ¶X8˜£ LU‡D4âËUê\k—Dt-™ &8Ö"ò!ƒÇ¤ö©Œ5×Ó£®±ŸE”©Ð1Hå¢ýmµ1‘‰rj¼fKkˆ“¬u¦6\æêt¾"¿!¨§sÔTj~Z£9Ð#};«¸¨³¤_Á]‹ «¤Ú}º±“¿Øí ‰ÜG«Y:Œ!B¹¸hëzŽd:S·~Ü`>25È|Ø\þ}6S'ÃhúxÄÜ_!`,ü<×BbEJƒ†ºNÖ®‡wëÅsÕ‚XýnÅS¬±4ç×)ÆG˜A¨&mÈEƒÎA„óîØB’$´kðçr‘[  ©5œHÅD0¡N¥Â߃XTO<߇ïŸV4uÙiuE “¢ëP*N"u¥åD+¨osL àc`Έ§ÂEúj½C—ZôIJRÞ¢ÚäXÈ~%ûÔ ·aÑœ;ûZåK ÊôLërˆNè/T”»ô.p—Œ¹ú»&ù§Ç©^ Žùpйí TA‰XkuæCª (/˺Á”TʪðKuA“2(¼½ùˆ2pA;  Si(Á憪ãíbþð”"#ЖRAw‰Oe90í¦ö<ø´ŠÈB8or}D+Ô7ˆ1J Ü—F8iÞaE8®fÁ Ûµ¢ÏëŽñS†ºæÂÎós®ÒÝÛìu)j Þ²PéGä4„za5PZppèp´Vs?¯Ü(ÓE§6.ú.r¤mQH„'•ƒ>¦ò”óƒ%_È”cXÍ£F ÝJ¹Ôoس穵õ¹ËwZ†äç+öüSMÂZŒ§c\2Á-W‡k˜IωÄsnqþŒ[œ®ì½\¹éé •.ÞÚC ák6Í ÌQ‹Ÿ„ÃÙLÞd³þ›÷Ê ìÿŸb{<,ȹ—¡5])¦IÎMùíR<ûÉü€ËB#ÙÆ÷ùeÛYÔy-`ûBªÁêOXLý•!sR;\Ùl”`_ùª<ÏñÃxö“K¹ Á áÇBâ¡’kŒ:#ž(¼ÚņÓÇ“VÓä¾¶äè»B†6‚¨û³V7ÆK&¤âÐuζö@ªÊ?†›K1¼ÁyAàñJ¹Á‘Ú1!MÚ 5rÿ€ ¤± G‚úÑ ¾¶¥®µêh ký·Ræh“×_Ð?oJý[³­…s7´:Æl’…ˆÖy~m^ƒÝ`jûòñ¸äŽTÆ5âç’ä°6æè6Eüݺà£+íA&™iéå1J‘ÒÆ­š† /!ÔÊîÌߣìšlÜʆSq. $tG+Ó€×,Æ}?7-°‹Á‰²ÁÚæ¨¡B0g¿º0ç¡=zAaz¾Ë`]æH<ÝC sLxuLÎ?iZ@}Ô/ë ee@Ñ¢Z;¤ˆ2²–ÏÁˆµ1™”òø©šCˆp˜ÕKsSà Ò;9úúˆf_ÖÇa»@.Ïô×În”ô…¡Øû> ˜g"ÚÄu!ck*nQ…ÍûŒâ«/ŽàPXƒ‡Z ÁÖææÈJ¬Jøúæúè›õ‹Ø DK°ó=¼ROÁhº‡D\p°7F§uÅ% Y¥'/bK¡ê±Ìîæ%+å8#]ªÄ•¡8\æÄó:qio7ÍpG p<©NTŠð-Ît-•(xè¸Xë,^JÇá¨rú`PÎP†=öåßÒ*°AŸ i\ë_KJJÔTÍo…/Ÿ@#f­¬¯É圿­½ã…18Øý ˜›Tbq`KçÌ¡W±2C—™GÉáf'ç4Pe®ø’gÌx·®qðŠHosù8•p4]¼Ñf Z¥3m¼Á8nµV»&÷µj±à"‚8‘òëF¸¼ìæ.è ÙIûz³k›ákå•óy“šáßmWf‰l©ã^ •¿—<ß_,CmÕyÞFz0¬203Û™ü›Ym!Aª…üÙ§Cܰ¡®o> âѸŽ$ß3¦|wÌ8\ ž¾W8é-ÏÚŒèqËémÍ/™GiŽ×©ÚÊIxZÝ{MASTÛ… Éô i]Ô¡È¡“#N?8ÙNà{×ûÆ<ã»ÏsÌz=¼žÛÄó× élþg3ÍL Ž’ŠŒÂ¹±DÎ/]*Ï«Ebô}J©†Öä#!´–B[… W­ÂÅYî!‡8?”Ãã'-¬#r2ø!R"5PÿÊ®õŠ-ùüß…1®ŒUiÉËäÅ&&@€XúKEÈŽÈwe¿ÆéøM¼.{ôHä®É‚ë|©÷ö®(ð‡® ž%+k—n&wˆ ä2cgǤS‘{¡DMõå¥,°‚Jœ®Ã¯XžªŒü‡Ã”éCíh‚w"†N²Éaèjã°]‰õ:#?­ðnÁ‘åÕÅ‘UP>ÞY§Àr™Ñvâ “ø–ù 8‹² 6‹kÓqÅáÄ®¶6'¶4²Ã”º÷VÆ¡®ˆ¯mĪY5à·Ê–H¹Ê*IáU!$[C(¥–BÃR4`u­æÚÄË#]Âì{ª¬ ErO³ÖijÛAA&KœæØ±ÖžmSy×ű[”‘n}E©é)rn»_8”âÆ:‚vº4ùñ³ï<ʹäQ³ás÷ŽIçœ^ó2ûc>SºÅà ƒ !åèÚ~Q ½ܳƦ¼¦JÞ­^r =®ÊñmåÂ3KŒt?;j£^xzÖ”±ˆ`õÐLSb¦Üûnk¤Ë”¢Aˆmm6 õÒÒµD8§ÿ¬¯7àj+Ÿn´å¬òqÎÁO7˜2Ò$Uù&­ám$Ö­œ?’äz[3¦…Ÿ’©s¹¡î­&ÖKÿ3,˜¾nÎÛø+ŽÛç𣚆ÙOÞO¢‚>¤s¨ù[ª}q,ZS¹ñu77GÊIm}s°dä7s{üà{Üñƒˆ>7·‹Ô¯®¹ ŽÿÉòUmÜ€-sÊáV`Ÿ—¿Ù¡Ä›`Ø'®€4žæ €†ÒeGæ2,%,æRšÜÞÞ_ß=ÞÜŸü·?RÛIk_Ç— þ{¾-‘‡`éØÌd)ñ x‚“¯wÈȘªJ”Òû9Š…  ¿ ,·ÆòÜÍÑVã•>šX­€QVƒK‰"î‹WõØ}p4òåSLqšïfÃü¥¾1ºXÈŒÀßÞä3ú¹Ø™KÃâA1øÝeH¾&ºùK—(d(Ÿ/£¼oï® ††¯ÈrþŒã#-‰Òp¾qd³èÈP¾·Ï[÷3Víñø”ß§)yÄš:æ1°dï RàYÏl Ô0iC¹g?¤ƒü-ò+Ï_€UyÒžò­Šb%œHÅâËÎâ;ùESt‚_å|(èrâ;ú÷ò1:ùˆTøñ$¶!Sf>·rrá×VÞ(YÐì•“øžUcϸÆÈc›ç ~| ‰%Ø6Ó€àJwÊ¿ ­:ÉŽ ŒA Mò2ÞŸtkT€FÝkAÅ??- Ù¾ æ)A­êê³e€kgvœ.$Zè·½çÓÙ‚-%qåxòîà]ä‚LÕ9N)6à¢éûRO™:üpŒ¬ééBµHì+% žüàé;¶¦»:â§@9óèXç,øIåõ3¼ƒ—µÊœe˨¬üY¶ÞrØm\SàeúSðÊ'SðÂ5Œ³àç,ûºF¾n™º¥QrÔ i´6)f¼gKNSs„ã„j8Þp-Ëÿ8Ú–;T¦©%&u£‹´ÊËÈýßÛF 4nœ‰§\~i Μ7;[…ÈÒtÚYÀúÃ4Ã_IRÂh³Á/1刡,ùõÑÿ;“åÕendstream endobj 98 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1923 >> stream xœ…•{T×Çg\܉XÇj™Ñ-£Ä`Q|$!â«V4IQD .‹€ Èkw™Ýùí²°À²,ËÃÓˆ” F=FB9>b|V¤5>b¬ÕsJîl.=íø iszÚùsÏü1sïùþ~ßÏ÷’„Ç(‚$Ieàºàù Ÿ¿ý p„»Õ<¼àåaŸJë'<ñé­k<ñü¿[•´geʺÑŸÆÇ…ÄûÄzbB„³ˆÍÄüÓÍÆ³Í\edƒÊ ´¬Ç!Þ"7íõÖWžC'¤åÌH¿×P Ã?x‘ö=,ºMáqÏ'Ñõ`Œ¢q(« BT•gÕ©¿‚A8ðUq5mœ§DžÅ£EjC^Q‡~ ¼Ý÷At{Š$šâ”„ó íöct‚1UžÁDµòb)„sÃ¥Tl çZc:urƒš—s €uœÔc¤Pö?| sMºb˜R ¦¢B+ÊuOšl¾£ Ï ù×zÓç²!áôˆ%‚rdKHmTg)\dEü *A—‰ã‡&¿ýŽ©ZÉ}ÈÞ­@îŸtgQ¼9²o1Ð3g½'ã_>ôûë`G¿ÅÌ}@¡q?Ê“~ 6_f !=1yo\B\~лߨ@!ècD—‰Ç[Õ15\y*è!ö–ÞÔ8PJúðcZn”Í‚ ¬ô³Mß`åô…¿Æ¯áIæ !Ž¡j‹ ZÁͳ)+Cã>‚ˆ¨Mìˆï†sp‚6V04ãzK;\€ãkØCÆ«AÆË[D+.”ÚÉgÝdÄæJ³¤1Æ)Žõ|V^Ák­¬Æª…$ZíÔØlÎb±-¦&*xé–é,ö PßÂwÿb’ %ÚÚq¯©zIg{I ;×Õ®@ ´Š©Ê<°¯è›zDM{B3×ÐtÔZ…Pf=/äñAg•ä•W[Ë«2»¢bÓÔ*6¡>ƺ è%+×½| ÆšË%ÄB$äƒÚ}0õ£¬È(ø„|´)Ѩ'ÝWÑT< –%G‚1Ÿ7§6À!(W•‹~Éø"œNy¹{0±w¯¼øs"þ;ãtêtse£ËÎÕUZåžÑ·‘æ…mö•¡\’a·£/d›NîC]×;ÒTô-ó¨êVÜ¢¿>ˆ§±Ø5b×6ê•çM=Ð,W4þ›ç¡ÎBK²-«}‡ŒôJ”¸¦¸¶ÈnÞô×¥•E`ÉÓ:žË_³;%BA÷¥î¼¾ÚPapéNj®`ÏÃô¢+Qµò ÉÜÎ^Q<ÞÇcfzÒ{rÊ™äI{¶¢×oËsV ?i˜q¥W%§¤¥'§8Òj\UŽÁe;Ÿ)þYl~&ÃU GGðÚ`(:ÌIJJæ!CtÏ­%w¡«] i;àErê |Ï&¬Ž>½±î·0eæ¢Å3ã-ÛnçZ·ÒÜJmҜ̲òg÷4­‡:ðãe ¦ù~¦iYÁ.µ#Ùþ";-&s³5€©ªíäê;û»€FäõûC=ií9n{_xYX™¶À!¶M¶dKR½ª9·Zè?ö\êûT°ò6–‘$}Þ·gë‹Ìu¯a°ç·ÄðÜ‹u²‰;~~×eÔ>½ƒ|«Ïk5ä¹(öš©ÑCæ›#ËÞÁ^k·nÜüñz"g6˜AŽÉZ‡]lL)ß»O­ùÔï^àR þåÙã€Ko•r×ìW.À}úÆ’³óß ˆuåÕŽrQL/OåóÁÀ³ý7Ë}¨ßÿIÜ6.aGœa§>’ > stream xœµYTWÛžuegTD£ÆÌØ¢±¢Ø»b‹ŠXQÁ‚J…¥# m)Ëî¾»°ô¾KgAC*[,1jbÔ$Mûîà%9ÿ]ML¾äË—ÿü¿#çè9÷ÎÜ÷}Ÿ÷yŸç"¡:w¢$‰lîÒ•cÄõóÅiÏÛ¬ÀZ Ö û½iß 5½‚úôhíI‰œçÈ\çºÍ š¼ daèÛa‹ÂïܱÕ)Òci”§³×2ïå>ÛVú®Ú¾z‡‹ßÿµë­Gvß8j´ý˜±ÑãÆO8qÒä)S§ ÝðÖ¬aÝl(j µŒD-§¦Rƒ©Ô4êMj%5„ZE ¥VSoQ.Ô0j 5œZK ÖQŽ”+5—E¹Qó¨ÑÔzj>eO- ÆP ©±ÔÛÔ"jµ˜O-¡&PNÔDj)5‰r¦&SÓ)ª;%§fR6Tª'õ Õ‹RS½©W)–êCí¤^£l);ª/õ:Õb(_ª ÕŸê*é*éF-#Ù¡:SjIwI¢ä~§Nw¤¾ÒÃvε¢­ü­>•%Ð}hWúf3ÓÔex—¤®³»¾Û-Ûš±^oý¤ûÛÝïÚŒ·©ë1®‡¾ÇÝž‹{¶¼RÐk`¯/{OéýðÕ…¯6±®ìù>]ú(^›mÛɶ¿íQ»Îvv'ì®ÛýÔwtß=}ÑëÖ¯ïê×­ß–7¬Þˆxã·’;Ç/ç•üÇýmûCÿ/l°o`Ä ¹ ²iÚlæ%ÂkíNlJ®:=b@­RîÂ^lc¶-Ñ0rú´N{ C¥ºÕz‰Þ¢ .!ÿO>ï ²³EzÙ ø‘-v}‘!Y™îɰ nA¹9Ç;iGuv6Ð6íkÃMíö&IÛ!¤RÚÞ¿}[ zE²F­HæÜ¦o:¹°n.Øá%Ø<›±Ç Ehò4uÊôx…F™Ä'àq˜™?˜ùxÕ>tíCË[®üø•näuq Ê&R$½Mx Ù…Q¥’ΣÂëR¤ÆSX >éâàfÏsÀ úécÄ¢Þ£¾Á’qœRTüó"Ð.§'¹óÛÿ<³„l  Í)¬9pÄÐ̵÷ÇàθÛÂñ3ýäy†|hY´ªáÔ¶KIÔB‚TØÝÞÍÌ-d0ùJˆà:œdñ8ĪT–¬jo¢‰ä<ãeýîjªÕ”q‚›¬Y…É’ð€p{¼ N”݆<š˜CÀViF­œ³}˲­“v„¼ßòWw’Þ\",ewʼGG6zž˜EJÕiÐ(l‹{= IÚZ*Zëy¼ô?÷¥Ê`aG¤<4ÔÇÛK ̬å‘Y_þìê}Öò6í£I'ž5¡†Z êw¹•JÛ{¡,6L‚Ç„ÌÃ3HúÉ,ÍTvŸþ:Ço_Š ÃdâýFpcJfi?; µ®x0S* B!VÍr£Ì’¢Ê_»¹°OO ûüpö_7¤$a1ìã¦ûgê@“Æ%¦ìJ†@F^_h4æUÕVož(·Hæ4H*Ã}ÿ„Œªu' ªàÃçŒ'‚?§žDÕ›DÕJþZ¢Z]*.ôwTýû¡dåº/É;êà.˜Ìïð§Ç«sëy¤»K?ÌÞ>Éî$ÅöQÜ8”ý<ÜWdh0˜Öäã$\¡Â(L,–ì9€"HÑMaš¹Ï#Â’8¿ ¿ô$‹Ý}­Ž‡mÛøÝï$L8Ÿ§ªØYÌæàõã­o|Æ¥ƒV£U§¥€ ˜xPFò¸ Êl½V[RÄé3@WPظ¡ Š€ùñØ©mÛw'dñ>µé‹rýÓóá}¦¶äà=$Ií§ã´‰ Lè‹IR²ÂM(Ö$¼ef„i7¥í1’Àu¡Ž±x a–q„Yx³ì\_¼cÏöL`2!½pFOBÉ}Mh²QòýyÔ¯TЦ CX4À„ §0™f”ψ1*fç縖ÆÒ«¡ÇÏî9s…{7l5=W¾Ås!<(â,Cõ9w{ÆÎ‰Xe;U(óÈŽ4»ª½`0ŸÝ•d €ìp²ì8J2³õ"H‹OMÊ,Ð§ê Ÿ FÛ'¸Q¿K¯Ê»HÍHËaDñbDQ†Š[ï%-¢­ç¯R냌,aü&÷½ÛvoÊwfŠ“Ëb¹!¦¬¼¨¨¼Ù¢ù²}‡‹›€9øž×XÞƒÆU³&ÁLfúWÁ§?8ÐtØÀ¥m¨õ!ú¤äTþ§üɰUôÊÄ/8^À->ÂsܾÙmkýad‹fæÖë8BÞ]L’l!IŠö xÖÔ¸¯ÍPÒ|ðPÆnQãl&ǼH„®–óÔ…É Q ñɉK¦ÚÎø^•–œv®/®±ä}ÝïQq ê’@Ô²Õ©Ó’ ªf S廸Ço…q#Æû‰ÓA«eÌ…¤¦@>fdfç”ìi.¯½Õß¶(Œ¼1wŠ›*uGÈlÜC6½oÙ´"u!»K[Ú‘oH¨˜(–ií‹Y‹17gÇ£R:-³º5-£Ì{¿×ïå‹tõ†à-¾¼Î……bÐå–×·˜ŽSóc^ý¶bKˆ¿ÓÏÃÏ\`[]TUl ¤ˆnô[Ÿ Ì£V14÷Æso™´Â;t½.÷Wc’ÉÕãˆjô‡¿â%d¢pØl,¾.Ä›$†kRaºÃV]8¤5ÀóNÝAJð+LÔY¡ÄNMQ¼‰õ¶XŠ*’ó‰±ÐÚUÖÑ< ÜJÅ*®´l9™Êr¶’pÇBE)2Ýj3K™M·¥èAÆÆyÃÖ¢¨ò2C¾éÂüÃSq—уDÝMôŒ²­AÖYYI JШâT|Ø<`œ§G#ÑÔÏ›[OD{–ñ6ÏØçùãË…¢«RÕ>’M2hHˆ ¶ÿu¼ké@Ø0Ò,‹Ž›=Ññ²h$ªâ…ýZ%ÿÜ•´]b6ØeW•^€RÚmlµ×d¿IëOÍÒúÓ_Õ…™Ì…êcÛËÂ@£IŒÀòŽlIÌP*Ø%UB'©ðŠ0”ÍÊûŸÉI‚(_ ÊsQžéß„ ‰‘á½oXEê ”C7ˆðt"Â3Ë¢Öãn¢`½ O’Åâ³Rt\ÔžÏçFnÚ\çL–2C‡áWqïGÃP§ë-­†|~ü:„ŸèÅWYRtULXȶ­rW`‚0•Ö\Ém*ÝÃk›j[á ÔmÊÞ•EÊù’éW.Œ-—¢ðö±lBžFF¾6J.ÛP•Ätì¥åf/”Ñ™‰ ÎŠúvÜ·ÍŽÑj2ÇéÒ´:F¸D›àÐ#3ÜÖ˜}βÀíló‹h † h®Ù²%ž‘ ½Q4[ªÃS—‡¸;–Œ{bÛï†EÛí¢JÒ•iɉd©ù Io‡nfËj4‡7ÐZ›‰ÆÞ-®†A: õ%êÂËÚ§—ŠRÈç´}-úŠEx$rÀŽÄYÃã‰nqG#ðX4-Do¡qh#‡oà{ì›Øök”…Ôˆ¿ýð[ôú¬Äy¸ŸýpÞ3Ó#J'æZrö>Ñ·³E1ceÂ4ê"»wð`sf:9—KÑ'€œ -ÜUV^XXÞàcZ?ºË›î2Cþ ¾ù·âV”ìûʉæ :ñ@ŠäˆXá2Ôå_7ž>~¿Îã{¿öÂßj52°¨ÂbPʈ)ÂV›·~“DÏŒ·” —_” ]‰äô%4÷ÒÞ#$Ýh{ȯ r€¹wáâÇU‰;vó{›ž°ùQ+R” ˆgb²ã 3‹õ¥Å1ÕÛÖzáü˶å§<öí…3WÖyg'ðqÑ‘r25VÔg*7ÆnôµÌ‚‡+QÔíÛã×*’Þ[VË­«t… à IiPd' ŠÒ‹²ó™oì8xZV ÍEU¼ÁT“]Ì] [£ù¹¿"˜*ŒØŽGÞÍÔím¬äKó³à20·‘Œ_>kƒ=ÿâBD첿º™‹cü úNöòp(ù¿½ñ /!•=iD',•Ý÷à›©0=`¿-ûø,|Ì<ÆV·ñ`û“Ú¾¸¸ý{²"Heè½Ð_ðŽQl `:µl.ˆÞz˜OòCV¼’^¹L¸6‚âPâqMFò~UERkÊnÿÚøœ ªǪ̃\–Ⱥ”AnIZ–¶ŒÀÜD¯1~Ã܇4@9É$Ó„z?@Š…¶2¼, (,<п<¢¼¶¸²”Ãv&v.+™pXÅo`?LŸ§àçwW)ú½¼Ð™°@S¸©}l•¤íºrJŠ<… 캼M­p޹|òì'hr)ž¸9ÓÅAJös§ƒ6™Ýˆ*b“¸íÎëÏ,Êu'nD:ÕáÍõEî |g]‡‘u‰'bò“…ÖºÀ*föšy“7-ÍÙïÆ­8–rE³G#× ¶ÉìÀÒµºÜ .-³¤!³ Þã¬ï„Ã;ß|„:=¸‡÷>°)Ç3›!,@¦qá§BŒ9¾·ï“D¸“DÔ„BÂÃJÃ*k ååjNĵ,JƒéÕñsV¨ý ?”«ÔgˆT(‹* ŽŠ YßtìÊ{gîsB¼x§Cˆ™zG‚> þm@ûT¶ã±,Ò|£‘²ê‘Ñ"Õ©6ª´qÊt˜h_ˆÆùÈe»ußÃ^òü»Íö¡‡Aþ;¼`¢¡B—U˜–©3È ²|ò±ƒÙ׊rO¶…ˆêH|Å,h“2A ©gÛ23/½ß¢-EÜNu‘(A°B- ^¤ÉM€]ÌΑ“ o%„ÓÚ7bÕEçqª_ꛟès'¿Æ\AxF<ÄØEÆ(ÃÉÒ ¢áªˆô#òϲ4ö€fqT|ôµ˜¿ŸªDMÅâþ#§ŒZ6¨ Íå„WÿÖäÙÐøMÄ D½õ{ 6ôéͦ%HíB&“œH¸ßfS çíVMÏþƒb|)¸#æàZœxÞ’ö¢ Y*p“ͪ(jùDÌã:³|~éŠð¨¦ v!«NŽÁË:¶ØU(RŠ¢Bggj… rÂõ,r¾Xøâ–ð BŠíè0Ûª|¢µ©¢­j?ùò½¯Hsí[þ@s“a˲]ž1»”:ý¿^ÿoØñY‚%mEÏÜ¥Ï^n±…‡MÆVís×áNàçò"§5Å;HÚ”ªDuÙ!·ÅФª3‰{«9åæ´Í!i““™ò¼°Ç!_•™›á—çƒu¬´Åã%ÉžèøjŽB¥ùBv– ¿îi#ý’ë…Ü:~±ÕG§¥dA¦èß ÐT¡ÐMë(ÔGëU™¢ºLKÓb(Ç© Ï$ˆi¢TœÊ6 æð¸÷ý%š¶L¡.M¨Çguâíò"ÐúPXÀ&ƒB£ˆ!Ú« ²’}w§ñ½ìÃßn‹Ê/^^[T\ž[{tÙcpWWLñ˜þƒŽø3¢›h,}0=v+«þóJ‘„ÉÙ]JÐlÂësR´6…=¾×Sh«)ÈÉЧs©©Z Œb”K‚–¹oäSTäÐ)ŒR¯Ôg]¿ŠhîyŒ&”Uô\'ºç\-|¯èÂÑZÑCŸ 5LÈ[IÁBxfÅ;GàNNÛÄ›èR§&S !‹€KRÔÜβe ÝÉ…ºzb¨ËH†OT2Å´*nç'—U都¾†*sæýèqª\"VŸù ,£žyKŸy³küÅ{'-¾ÿCôì!QÆ’#ÑöÛRÁ M'FX•¸Z±+)a%!i/•U•>WYNü_ÿ“Çà[â½Ç|Œ‰ÛYøÖ„u-ZRY°»: Š3\l;x˜ÏͳŸè6gå2µq¸Uˆ ?^õå7èÍrÔýþ…rÉÅûhÑÌN³Qš $0 =aûƒ²ÏçÀ¯-Üæ¶~JÙr~·Ò$Þ#™Â!A1^_:Š>ãîý§_͹2¢ˆ»Sqò#ø„¹1åÔð¡sœ=j JÊ jv‡ä‡%›OÔxñ!‘ÂÌžóÑÃ"T«ä›yw_U Æ’^Ä™w’ßÃHÑÏí™fJ¿*d½*ÁcDfR*920‰¼‹Ç­Dî$çêµÚÜl®ºùPy«hëÜ2£Š<µnàEž•›Â|<ƒÝÉæÅ"?Ò«Ó5$Тªìwª# ƒ#ƒ<'^M™Õ·ÈPí6íÛ+݃‚D7!¼e¡‘žF4“0‰ð3«MÒ*!–ÐÛÔ Ä_hZ8ãÆU$;Úäñ‚fªò Z­ìóÖ›Ó" 6~u«¹\Ò| ¥Ü’kñ”Eé¨GS[}}¼¿‹ó‚­a•E¦c^GÇã^س8W#륟#ɃG¨²ýåP‡í3<ê/²Nà2¡$¡Rq.37꿽wÂäí[Àz“é½™(¡M^Áë}¢<ÌÝ^"\þ0—T{z@»„-ÃÉ4îê¼&óÈ~K-Î:“—“™~Llm“ À#=‡àÉ€—ÛŃGó>؛ǵҀ†•#æÐó{«Ú{¨¢ƒÍRtý̶V}t>cîLzßþ­Žc|³}«}¹œX­æ²ÛðM®oƒ#3àé¢ïôÁ­¿›{`Æa÷»ÇÆfyTÂæüÅæ Wέëìî¶b·` ‹ºO¯Œ:èÎv³f®6ÑñÌíOÞ={¾Æ’ÒÆ[ŒÂ):¡Çt[²&µ.˜K—e¨ëÓ¡)6íŠ ZÚºåzuGvÈ•âÎÆáNÃíIšmŒ}rµ±í¨‘ïN$Y <š`ØÕHá8 ‡+›‹«ªLmð.˜\³Cn0¢™I^#ÆqfâEŠçÜ+ôþwòÅw:ÿ;!¿˜cæOþbgTG¶Á<çÙÉ¢ P›á•qù*êÒ :ãö^†Œô4½øÆ^@ð<ïŸâYl‰¡Ñ{KKÌBYMi¨<„›—.ee‰"„!oP&LŸƒeKË<šL†ÒʪˆRÿÀØØÿh½Ð§•<[m”|Ó&EŸ`¢SAU4ôé*4Ðf@k¡iˆA]³-¯JWêRb§ÌæÆ­ÚppÈÇÝŽõ[ßZLx%M¯K'½½ß.AŸÜ¾FÆÝíK¥ß_—¢¤dá½ò»O¯U—TÖÂ1æô–kx0¦–Ï_âS•XPTž[C\N°È—j®ôØ©òã"K£×òȈ¨H~¡cØhpfÖ>JÉÉŒb®a+ÃJƒü#BBDGY]RZõR@(‚DT‡t,\W ž«³YO9LŠR¬uQÿdÈI<ðfÀk6àidœtUXj”¬W§åݺòÍîèweˆdMZìâ¯7:D°xžýê†TX,ÞéÈL˜A]d_´´¶ä+Ué¼Ó©ßVãêáÌ5¬Ò3w^;à¿–4ž{ „+5ÍwŸ7¾ŸÑá&.P™Ñ•SœMOä"m‘ý¿Ó•fáuçJKÇU;øu[Œ®ÀŒÆôºþÿwúìIÑŽýñbÜ?Ü«o«mP9wµobTö®Âd^“D Ë`š¶áºvžd´îÖ]ÁºX÷¢¨ÿ<ÄaÞendstream endobj 100 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3118 >> stream xœW TSWú1$ï‰H;Ú¨Ôúž¨¨­ZQ9U;c]PT”K,.!U–² BØWÃ’| dQÖ°ˆ,QdI¬Ò"•)µU[«3Ó©µÇ)u¦ÒÒ–â÷âåÎÿ´õLgΙ3¹'çäœÜ¼{¿ï·}‘0ã‰DÂzú¬ X²Ôþq:Ý‹m¾2p’‚“CùsOM™„ ÷ÕSï=ÍØ_®k£¢=lˆ=¿9(Qµõ-Ÿ}ûƒCB_ó ˆ|qÉÒe/3Ì,æ5Æ—™Ãlcæ2~ÌÌvfó³ŽÙÉx2‹˜õÌ‹ÌÆ‹ÙÈlb63ËoƃÙÊø0¯2O1“˜ÉÌ3Ìtf½ãÀd2÷%$Œ[1Î8î¾T/½æàæâpW–*ë—Ï–ç³<{˜EnûøçÆë:&L˜1¡k SÓi§Ÿ'†Lü?ç—Ä|g[?XÑÝ*zWKÄ=¶• M¥öÈAˆm®&‰èGLÓ¤€6:?6?âKRÊO>„Fh€Ï VûžÓl+û!º¤  †Ã=8ešä—‰»l‘RÞb€6h¡~tëB–ÜSÈ‘NI“;Ûd`Í”¢÷ D*žÄ>Å·ªwÉ8OŸÐ5a¼ÇÉɪC2%{©ö ä/%[k¸'éz|¾†±Èü­çÊÓÁÕïUµ 5ïTZáÐz "º:ü![„# ÞÙÖ“aEÿjô6¡Ê*¹„®¢Þ"µeÙ<µPϯñôëÚT·\È!ò"q#ÁD…Ï“çQ‹^È¢3:VäèS³² S'd“…DῼaY¥ßåжð‹€<|WöÙùÞ+·‹»ààÄ &²Þ]¥ÀÕ‚¡N M$;¬èf§¶J†h´:_2¸ylQ*kÎGÐ#Õ”3+–wIpNÕ´àX«’«ÉóÁ«È:àˆ;Zúä÷‹U« 6É×d-à}±Ýå¸ÌÞeDÁYäQ˜%ùY9-S“ IœÊœ\_o®èìö?ø‡0¯ 4J©œ¬øWŠÜ¢…4ÂP7Š¿Åÿµ³8³IÒv S®IʼnâjE¦æh!;•ÏËÏÔäæG—C€‹$/™2 ŸŽoÎrÍ9‡¡#»#‚¸WÜA°µ| šÏ©Öé“SC~œ@X64e…(¯æOT½ú>T‚ËEü])ºtŘ*Õ©0ãöâ-%¯•@÷Ñ×`B©qC¬×§µÃh‚‚ZÁYÜL ÊZquµäGŠâD‹CD7α’9è$×Íœ??Ÿ{û Ò̺ގ»qólïM¾'ÈŸÝñ\­¥L”ѹî_å„Ãâ«ŠÇ `WïyuÕš¼ú‹<Þg‰×¯-Ëbç]zPw¾°òú—å¸Ö(³²>hDÚ¹—(&V ÎÆiRŽ=Z8XuX§‡N¼¨g±~äÁ‘LcV¸T€±øH 6ÙÆMÓÛ«“7†à]CÐ0úsWq`ØJÂX5dC¶š{!{õF» më~Ô6¾jo£­~ÖÜed&™ýýKèrñ|•¹]ðgÑëW‰,‘Œô+‚^ H§þBžœü1•š6¡¹·ÏX p6ɼ—s‹sZѯ_‹©ì{R1cµF¨oÒÜÚ}^²øÛf÷Ö—ÜÈ$2ó'w\€ Þ®(K…œ]~zŽã½YHw¸épz¯Ðè`èÔ·›Z«ZN×Xá'ýNÎïŠÒä• }mwÚH»ÕÈ­dÂOò¡ËÍ%Öȧfe'ƒš{«%éDMkÙÙÎËzw"ÝO8Þm­ò&yøœ¶ìnÁ¥÷nµ`ú)Ióm<8l¼-Å)è­èŠé…2;/þå“î¨ÖŒb¡±¼îp…!?—Néœúxâ‰Ç«LuI-AJ•:IÍ«êöÐrø7^ÙQ¬²„ ɉI¡ÊÚ`SÊÁŸ8xóýhnÅ—ï¼ëïÛcKùÀº-°ŒN0{!W¯,Ìh£^rT_VrŒÃ F…\?w®ß½ ^»wƒ—‡ÐKŸ}’ܴ޶+—¡Lx<›ØÑÿ7ãÉÜ7×GÚ³ç;ù“‚ýàOlË0«­xÆŒ­ÖIT©“± ]§NNOà?è˜Òj¾ïsƒ³î~D6¦Ny#åo+]?Cãñ ;ù]œ Œš˜¦0:°m¢KÕv!ô¶®¸KûW*HOÔiÒuBîÎu4lÍÕC÷¸É©9=š›„1S-W+Èxl¥Âå+}ßÐyß Îø%Øýα“FŠmREçÛÍûTaû÷7‡u¶››;y²žl¦úè{"‰¯ÓQñ$\yÄqÝú2¬6¶Cr©?ë—b¡¸U1¿&ÿçºÍ}ww‘©&¾@ ºªGሾ¬=¬5ùº¬l^ùf¬igû Ôf¯^B$›ZwO.øŸÌŠŒ/ÕÖ¨¥7FC§Tÿ8,#BÎ=Äë*¡ áq`û޶^_TÌ—”«¯ÿ`÷ítû˜äþñðð?}ú‰¤^xh7h)~…fNú±´¸¤èº=?b´ Ô0cÀâÆò£´.ÿP^NÍâMæÊD%û[jØ›ÑסƳlyiÙ±šJœHܧ¢î¥ã² W²u†éÖn8–±`IÈÔ§ädçFáºÇ°ˆü—à;ìÓÑÃ>ý•dW=1nï{Km_QNßÛw8Ìݵ1<…OùjcÙXþ>ê@¿%_\¸|¦&~Õ ø±…µ—DÉuçH1ñÆ(·ö½¡R™#ÚG¹E…^¿Àz¶Z‚i(“â÷6VѨ…p~í"µÿ9ITVÉOC±ã7RC%k1ü çé~ÔC2ÃnO€Žx]º­’^tA_|F*0œ¦b¾Z㛚uH³ R©ç,–·µ|óç²”~y­îsè8óSê²¶,ÜaM­mn5³D˜"óçz›€»wv窞*¥@"IBV63É%Y\a?2££yœtú>ci•üÇ¡ºJñ8Þ¡ÃÌÜ®„Qo.8(X‹Êš¡‰ëŒjTEE-ÜŽOáÊÏ¿|7ö[²¸ÿ{ß.ÁçÜ-ÏËD +}_ÞÙžr¢ñtÕ¹Ú¬S» yKç50÷5xEFæí¦#BLXŒv¿6C— ËÓæäƒò¸d#TócíF÷_Z.r¿í9éqø-¼£Ãòj§ñàäNÀiÃü?×endstream endobj 101 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3671 >> stream xœ¥WyTSW1äå‰ˆŠ¾3h÷œÖq[l]¨¶îT­ ¢ˆ:. ‹ „%¶„%,aÍöMÖ°Y"à^l±*¦­m,j]jÕªSµV­Õvê}=—™Î ’VzæÌNþàwß÷Ýß÷ý~¿û]a3Œb—5žžoÌ2ý˨±‚+ùÅU¤±€ìl*&Žû«Ú4æé¨“£ ÓŸÓÒP©KØrÙŠˆÈ¨è_¹ßj…ÿškwí^·'À#pƒÄ3hcpÈkN3g¿üÖ‚…Ó¦ÄË„;±Ž˜L¬'¦ˆ©„'±‘ØDl&þN,#¶.ÄkÄVâ‰XNÌ$V+‰7ˆw‰UÄl•˜C¸s‰Õ„3±†XKØ£ˆÑÄ8BH¼Dü™`ˆá„-1“@ØÑÄ}ÁTAÉ0Ñ0å°;ÂõÂÛ6 mjE„(Ÿt$+I,^-¾B͢Πw~ÄÖÞ6Âöüµa×h÷¯‘Uövöößr•?Úiô†Ñ‘£õcœÇäùÔáÏÞíc\‰=WdcàFjœ}ÂÝ¡Uí1 Á˜‘„G÷îs”DBhh#”±È²FhjŠ€`V‡lDÈ™ÔaQpÄo_G‚„Åéh]Ð|%å½OiȜȲµ >ŽæŒ— ‚GFäirΨ“þÞ«sþÊ»ä±L”ù3«È„p>¢Žx÷øYžÐT²LÇ'‡Ö­"÷=e(•x08ÎO<ô*’Ï—f@_#ªáómGÁ4óúL`âõix vøvÆóçß>B Þ†çÑ.k®>|ðÙ¹ >[å4cÍ–hà* ‚CFtªGÈ…r7é ¨•*Ò“R3˜L•J‘™ê×îUî ¦'a¯Änh~ 9 á7|Ó ‰ qé±Y¬ ™’ ”“3 hÆDÜ?õ‘ÏÌ26'ª(M ”ª´¦tXf@³j”k"o,£­€KÈú°ŽÐn ~~ðE£Þüþ•e^;’SX=”ÿ¶z½û­ª÷3OŸéî6~aXöÆŒ•+ßY²ûvcnG¬ù÷es4^àóÍE‡iäH€\ß uUÌ-qÔI@À`Gä²¶’ ˆlÕCm5sNÜ’VÈà“ aý4hìU…Yž¸q¤¾ ¨•½Ñ$Jθa­Øœ¸ÇÀ—ˆV_¢`´žF#n]¼—ê<&gϾÌ ê**kúVly×#dƒ{МlŠÔUܳ؊ jKë_&Í)¤j<3¢‰Æã<¶·Q3&m" Eš±õÚXÐ4÷ªB,OèK¾mª]4 rƒ›ÇMécJDZ¤šñ¯÷‚ž"oFÍ ô«—î—³­Š¦ô›Êƒ©×•àIí prómø"šI/Ë,‘Åï(†,Žƒ¨}¥Ep¸œéÜõaf Ph »âŸðèšmììr÷b8B5¶´~÷0×;<›ÉŽ©Ê,µ0)ÍÄ¢µ}5žÍƒæ†Ó¼h÷Œo’fø‘ f¾³¸˜©wpéôYà§ž4>ÓB­$¢¢µ»Gr$P ¡«~0ø Œ¹ t_±~#ÞrþÊ(ïÐÞ zñ‹ïKÉ™K¿üä@C¥–ÙS•̹ßI7½ýbÔqBn¿wÙ`ÂL[fiCÉ«ù &ÐQÃÐ+t$ãÇ%µP ã«¡JöSƒáË9¹Ûć¯oøÔªãÇÉ-Ø R“º¸îäV…1³TA‘¨p‹Y™š© Ôäfd·JÜÿuÔ³ãù™u0þ djϵUœÎiäQ£Ì“Ö,Ò¾›r*A ”¹¦o~6ºHÎWuê ¯z\Ç/ùþ V„UÇ׿ë³hÈÓhj²K5{¡ê`?èeíRB躬õkb¶Äºí•Ô;Ÿº?h=›×þ!£•teª¾Þ\Ùð˜ìüÖõÍ›|´Ÿ< v;dµÎ§õðGÏ÷£‘¬E™mHF#1š!j³¢ŒÐÜÀzÜ’É‹~ÕÕÿm$gðî:Oh%—aæ8‘ÆÞA÷°ƒH1 ]¡%G@¿”®5h‚s¹Ï_dXo‘I­¼’kš˜?0E<Üfh×ãTÒCÕ5ô‡*±n@¨›È–¨ §¬ ÓÑGÞ’† ~‹Œ«ðÛ¿¨¿Ìœð¨;Ó4=X[Íú‚òÐoýÇ9Ò¼æ/qYéÞ£žž‹Æãë6[¨s¿…ñ5pç.Ó‰ûc (W2^ÖŸ§¶WeÎÚåì–îFqr~J* ¯ú;šÞ;ϱ4·W šKs°\Q­¸/½ âÙ©ÔöÊÕdfIŠNq¢ç¤Óè%Þ$zPõ9!7yÒ5ÕІ¯úŽWå4Ûc‡§ÓÑ(D¿«ËϪ –§¥Æ§±²õ®ér˜«>Mú’Òœ¦÷Þ6v} ?@sîj@õh¯ Wã³ëB¦Ób¤•*Fv‘×.@+“U¸[_QWºïÌbˆ_ü¶Ï,fã4ËÑñîyÕêD.´|ÿjÿ‰ìa@Ð'묾YCC£Ñ$¢.|{÷Ë]L²8øF 4ÂRÈ0’SÙüL>:º|“‡÷»¯±1ÇŠn´¢ÛÐüº=F´ÁxðŒy|B'zÁ©êœÜÜBV› W¶uÿÂ¥; i-ÑzVWVŸS®ÉnRk€*m(l®Ž×oPxgH|YI]`¡¨×—/›•·kßV.Í D¨”¦x†Äl„Ô¼§«y·ûôì-4/ ³‘ôïc}Ôy샓G½<<|¼6±Mø)=}Ù±Îò¼¶Ž:¶®¼Îõ ³½–í˜ÎÌÄýn÷âXŒ<^<<{Uÿÿdœhðêî‘›ñ}ãŸÆ*Ñt†>ÝÚ| NQ_/»…m¼è˜VÔFRr쉯ø¢Z¥uÑüñâË!´:°"\Ï.ç´çÛµ){#B²"RR3ýapìLä'7°c•ʦmb…©z ½D~{Ì}ëÖî3O£û÷(™çËiî3º!F+“ÅÄÈdÚ˜†­¶ÁKðDzæs܃I+Ö´XPOC·É¾JNõ'΢Ãg…ܪþ©>:Kå›Èl=êQÀ[Äâų׵íÌOcøVfüSv%¶2£AZU,)µÑÇ}Á\—ŽoÒu¹º2¤bÃLßÈV“]x¤”9ís>õ0?²‰.þãîŸc™¹¬ÿayî”úÈüEªl¿rI¼Gìúàü•þÎ{™y¶rŸÕ5@nà™p¿ŽðÈ{‡Dî>€¼*Xdßû: qà#Ý …~âŒÐÄæReбS© uùµ†]LqñNø’âVˆÊav5M0¢ñ|º£ü‘ˆÆ1 !%*•„]%|óšÐ«Úfų¹¿‹ÍÎbo<ç³ òŠG¶¢f+k™béW‰±“ýdηÖòæ½^•·U_§X¸ç}‹¼v™9f‰‚.£ÈÆ>ÌLv.× ¸bDJ^_n<ºF«Cw„•çàÇ$¸nܼÉí4"ô¸Qüë~$ñȯ_{òäëïÐH«™"ª¯zý‡žj¥Rû^¶·z>kU{rðj|²Q¦ŸÛ‚ºéZ@6³ãv‡1iåQ¶7‡ªRÔ­Ñ *Ä®ZXÜ#Šê}k`Ò fÑjñ­ö“Çölg°J;°ÿKÿÓ~sHgœæ¦™ÆR½·ZõÁ¦N*ƒ HÒ¯7!@"òB"!ú¼›Ö‡Õ‡ÉdA!ºðf}}c“©Hój~‰Ô Îp“…Üæ_ÆÑ99P@ÕÄ–ÆG«b“Ó|ã_«3S3S!u|tebyMaEIžY®¨ð,òæoW7P_á"tŠþ©sÙÆUë×Ìžê}ª,[“­Ñ°¹9…PDÕÄUGDÇ(ƒç9Ðø1|H]Ybäo Â…Û–J’+ªjË+TE ašœÏ®ª§kÏöPù¼—SÙÝYqY“•®„*´†¿¡˜êðU Ê× ~%¯·îÝþJ\ø•àŒ´¦.µ)Ÿ¥ýÕ9[K°¿£&IÞû@£Óì¥ÐjäCç¼£‚PíÎÎ(ÁŽšMø>h4­(¡ÌÅC¾–r¶/V_´ªªgj¸íZsw\9%]\P’UT¢4žÉR«ÔY¤o≩©I8%©…éèÞåXQ˜VTyUiMiZqR‹£µ"Ì-ÆÜj!·=£÷6ó —ð“ /x H‚Z ”EÏð«t¹ô­ÁÈâç¤2„§‚ž?;ñr[âAÃÞÔÜ„bÌ< D¯ÀcxØŠ&£IËŠ ra/Uœ^![ºÞÕ‹Ù°Pê¯r:²®ÓíÒZÞëó*‹¬¶òÝŒ 4\“?uyعôsÞ}#ÓbS Ò«y•ÍíÄ‹àP<¿2M™¢J%•’[×pÙ`ìd 7ußÁ]Êž±µQH톃-Ø;‚øÑ÷¼endstream endobj 102 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 423 >> stream xœœcþCMR8‹vøzù-‹ ‹ ›øÄ½¸123OÁEøˆø§‹¬ø«¬·Ÿ÷Ú÷Îù¦‰ŒpbcVs,‹j¦‹Á‹Å¦ü•fˆ,hj´Žá‹¸‹¸‹â‹´ˆ½ #¬h,ˆ—°ø§‹Ý÷ïôí¬Àô÷tê÷®÷`›šµ¬›™ÉÄÆÂ‹æ÷ 'Øûû <02Z²„™ ªš±¿Y‹¨ÔΤ¼‹è»<7#B?û û ûû€‹‰‹rø¨÷GlˆwƒYx…ƒ?‹{‹ûFø§v©Ô÷÷±òÅ¥Õñ÷bó÷‘÷âÚ½Q"ûDfVT@ŸÀh¯¤¢¬«t¢kpozc,ñM÷÷èçïÞI×%¡Ú§ÆÏ‹ÛÛ1Ä# :Q?f¤{¥ªŸ¡¨°k™uŒµÂØŽ‹¥×ƒ$Ena}{mlt‰N‡xŠƒŠ‹~}”‹œ 7Ÿ ‹ ‹ ‹ ¼:·7endstream endobj 103 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 432 >> stream xœ¥ZþCMR7‹wø–ù,‹ ‹ ›ø'Ľ¸123Q½NøˆøÍ‹¯ø¤¯·Ÿ÷’Ü÷ãù¦‰ŒoKL0Šb‹g£‹Í‹Â§ü’j‹~'egŒ÷ް‹ª‹÷ˆ¡Š½ #¯e'‹˜¬øÍ‹à÷ìõè¯Êõ÷ƒìø÷JiˆuP~ƒ…>‹}‹ûLôè®§ÇºÕÆÐÉ‹ê÷ !Õûû74/X¶†•£¨œ¯„®WªÒÏ¡º‹ï¿=:4MFkgû…û‚‚‹‰‹oø0øÍw«Ñ÷÷!§÷ò¨àò÷oö÷¥÷âÙÃU ûCfQc3–Æaº–¬‹ «s¢loozb-óN÷ ÷ëèïÙKÙû¢ô±±Ö‹ÈÚ0Æûû6U;i¡x©ªŸ¢§¨w l®·Ð–°‹¸Êu4a}]qljeo‰Yˆr‰‰‹†Š‰ƒ‰€}”‹œ 7Ÿ ‹ ‹ ‹ R”¾ endstream endobj 104 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4017 >> stream xœµW T“×¶þc ÿ/ETâmÿÔê­Ci«µ–úêPµRíÕR‹R­dyŠÌäßI˜d’@ÂEDpì —[µÖéU-½ÞêZÏzJOððúÞIë[o½ÕµºîË¿VV†sÎÞûÛßÞß>Ên%Dë6¼d±õÓlÀÚÇ©£Ùöà(G»ÊçgltFÓïLíŸFY_‹¢¢câ<â6H7îMÜ•˜²ûààÐ=^[Ã#"wº}öêkiK_šï³`!EyRQ[(/j>µ•ÚF-¤¼©EÔ'Ôvj-µƒZG}J½Gí¤ÖS¯SÔûÔj#õõ&µŒÚDm¦>¤VPS¨U”5•RQ3¨DŠ¡öP“)êâ0eGR¿”‚Ǔ…³„þvövÁv‡íÛß½‰¾ÄD2'¿:ùˆƒ‡CÇs³EŽjǧèœÄN=N§™zuÚœi«§m7M1}ÁôŽé¿:+ÿ.^iQ:YÁl±ï‘œÑ¤s(èÜLq/š„î²XOûÊ`A·ª4õ`‚AÕþ¨ã\3½A½´‰~táäÙ3%Û>æpúÿ¹öˆ¾‰A^4 ƒ9¢-½*L·Ö‚ôfF|ågÏ‘ÙGÐâÞóE9ŸJœ,J™Ñ²Ø h¸šn-á(ŒE3æà)xú",ÀÓ1ûè4M¹ÿs8û°þà§9w¾„6è„ãu‡ê÷é»à”šüMþ°‚ ¶Iý¤¾~Q;€!co3r3X\{âŒÎ#çPå™â»è]‹#;DãyVw.Êý$âïÆB'â: Ô˜ T­Ïb°‚ÞOç§öl» zîÑOˆEâE÷°D|w%ìòK”2Z\Á¢xºq ¿q˜‹_.ÅöxÊz÷5AºîIºÔ #ÍžÈÁÈÐÈðLñôúžE“h,±zcƒFÜû[F:Õ}šè‚>èRZ½ÙK¯Q•´IÐkô½ž[— 5Àk8%Ÿ˜ ±L´>ÍPm,mnŽhôçÄWÖBȆtÆiôE0£>3:|@€ž¿…¶Ñ\£Ðrmt;v8¢NtE# ‘Œéé•l!jÕ^%ØvÃÐf3F»AY«ñÃô‡¿%1¢ê8‘{VØ+Ü2T jÑöqÈQ„Ñ«sŒQädádË[5Î-Ƹ#(Ù˜pd¦øÚ¼Yƒâz*¬c¶‡®t9õ}§,ãó²€É€œd v¡S §$_­®©á4ÐT×ÚÕËë Üôá¿}s,²)³TÖ¼»hW!“WɆ²Ó³ZMÝÃhRþ’ §ÎÞ`Ê ¿FrŸ®‚BY® 238¥"+[¡ j€4`°SЯÐÊèz©D|«9¶AþM:Ɉ‹ÌˆæëP´½­<:‡f…he‹æšñ\´)NÄ/|q¡‚‘~i<õNfÛ…† g¹Sq[é5‘AÁàÇ*Îi4› ü•0ÛP¼%´ŒZ°mš’+\Yª\C¸ïB¨– QGÛpÇxeп³j¬î™ì| ä¹­¶ìÄÓ«lt¨@ƒ¸â÷V‘r¤=„~O@’eö5v æ•Ø›éõû û ù¢ñü§dÄô›;ß_ë®èäÐ÷Oþ¹ Ê7$x½#7Nœt54~Å8¡ÿó¨ÀI­ñkK®q&kd+H\»aÅ“ÈLô5í“È”²\¬ÕçkÄãN¸öÄçXz…ÒæsLo™eÔXÒ…–7Ñ0»¿¶êàš1Ó ª(>âá3MŠÚz&ÝΗ$@d« ÙŸq‘ ¶CÍò2B «©ª93É{© Õ‘Û–3'/‹@ó0r)H×ä–AäíÏ+&Ulpî¹²ó6r?wÑ8Sy _fóëwõ£ÿ²ü;ÉÉ8/zKœ\¦èÍç =ÐÒ¾»sGåN`–{ølŒÔ¥˜ªu¦ÒÜ–ÏÔ’úÖþ’f`úOí~CL‹Û®\¯ÜùOÀù·»qg8bdwÕô19èmv>í¶nï§­GOôÜ@Ë 8’Qk 4 J-j!êB™lSGGÉÜÖ]Ñg8VÉǸ¼5ãëUE ©Y¹òÍ+]VÞÏ.&`¸BEÅ~m¿Q• {ÁG3×yPó}ž÷0ëò*~nç–T{Á5‚6iÌj4Bªn¼³Kµ9eP†Æ–/¿¹<ߥHV–JÒ˜Ã3t“ú¤Æ@„ “oRÙ–oƒdMB#c+#ÂŽ¹Ü3!*iDT¦°èüU±•ÎØ#­V•×÷1âþ„ŠžßÎžŽ…÷°H"N[ þ>©ÉD:*Y@C ¨K*;Ož(ªƒ^h‹­ 2h?†VyFùî Û¾RßNÔD ÕÄ“:¼ËP}Ó"%õqShYJxj:3 ®„§å‘ >é8Œf¾2…Ht¯ÊÍ|ó.Xˆ ŠbU¡©j¸qSž-#Ä¥òP´hLà’›‘&Ïnöø 䩳js^‘*SReB¢4#Ò·'äè™îS§êH†?"-µåv»ÑùÀ ôÉítB< ‘ò(¹_ï9¶ÿ ÒÊ(å‘ÁÄV'6˜tUM_¯î\…§¿Ž)<ÿŒgÜ[€4«9g’”´\ÅE½öAf00b‹÷Òƒhi Ñ2à è1¢¯ˆ¤Í²ü™Ý_b-#¦l$sø¢H†—ÙEjÚÑ$"$"n›’-亦’˜Ñ Qò´ec‡½~˜!á šè“®¶“*I§L³L;Án¤Ñüß:e¿åѳéÆtT›¿i›õŒ—b‹Z€¬Y> ½ŒÍ ÒÛá]4ɈJ–¹ÓWêoM¦)¾#¶[yŠn»æ‹Æ^½¹£å8´BOšÙ·$…ø™Ìؤe¼©6X–7QÚèlv)¯N"†VE4Š*@ÇWðµJ5IÌX >ólóY¿¦Z bŽ™}õKŸ«æóä·±».û3Õ|!0åPX#±ôÓõÐ÷Ð ”ÿTað©&tœ9Á'F2¶šOl¤­58“±-{(ΖY;”Ï …7€yXŒgï–àì½,j´ ¿·í.™å˜×çáé’ØY?/B4rêEšâ}šÜl•|ŸŠ ·²`6%´G!h#RrÚÖ%Л7‹ d7tû!ZgYÇ"†þû‘#‡´SÁe*’3 ŽI¨L¬o¬ÐÕµ·x¯Ë{‡é×ð•ߢ.!‘™¥ÄµèãÓ7kÔ:7 &^Bk/µúž)þE†âлì›ðÏÚzus…QRTZÛÐÌ0?!†O‹“ìËLˆ$‰`v³µUºÎène 0wλҞÚW+i;Ж_MX™Z^¦È•A&“R–YY\SX[•Ù¼;ÑO°‹ÛÕ²K+æ5U~† ã^IFZr„2âQ "ʂ̉ž)áþȬ»·9!‡GW[Ó¶7pÞ [àCRÔþ£ÏÛkB³yøû²ÇÀ±Ã퇴’ÏEÃÈ–m{oÇBÉø ÀFkÁø D“.³ÿÿ;øy¦1èá³uℚl30š2â|idýÐLñ´Þò!‹_´.ùë~9)%Ä¡fõqM)ˆÖ Cùñý¶˜ÔóÞŽuîQ«óû½¹-Ç•gù6¾x('FZÛH[¨Ö”r Öj[Ž™÷œ ¹E:Ñäÿ M’ˆ/Â?7^w×YÇ Ér=ZÓ.h3¢¢[¨È(}mt9;†DIXJšX9ZVÑ‚^j‚z±J¯$0d~Úé/q¢ní8Lž‡Ðmãx ý”XêhÐAyu^ ÉW *ÂÊñ2Ûœ>®Ã(¶G02$yʃR-Ð]|—ê7<¤Ïž¸2§Ç ’]“RId]ƒúsžÈi#ß8¾.¤t ‹Ñû.¼&·€HTÞ…/Š‹Î ôhôV™ŽRf@4¹ mÖ¤÷•¾X˜ž¹/ÏÁN.–„ÿE”QáªpHˆÖ~À>+®UôSiŒ`$®ýÞ:~û?o»¶y·ÿ_yáýWÕGúkJ|Ÿ^”¿{zQîŸ@k»»u C—a-Ûµè±ÛÝ.ü¯i´õßmú½hpŽÞyM–¬ ÙOÍžï Mމ­Ši«,-(*&w*{µšOÿKô‡~>¹œçAÁää+òK¯]C4÷Œ•爕¥£Ù,~!ðî¯n‹Ñ "'4Œ>‡‡,F<&“BwHt½ýý…øy(?ÿw«>•´æš ÐÁ´Åè¢âÃÓýßÙˆÈéÇpÄ4\ßtu®Þ:;[$68Gœ[£Ôð­õm¦øWôªe˜ý"¾×T]yqé µZ ŒÒá9ë6m–dfÑVÚ€-¹q9pÈûOd÷©#Ãã>XPÀôÁ72 &꜑›AŠ¿µ¾YÃ2Z¼XSJ}Hbz–\Îñ*žð‚QAy^sá7g¾’”Z¯%Z¦07/WööjìàYç{°µºÞd ël#·m¬Õ?öÒ î¢›8‡%]B“R…§#çp´Ы€Öv µh*š^öä…Vžµä},þˆÛŽ'eb!©š•%xÊ lÿž:üA10yÚBÉoG£TrvÒ²pU†¦lEöžh겿f#W(äJPÕ$K~Zp /xu0~OÃÎã ÉóÅÿø‰?çФR$„›Œç`ç®sœ Žàø8:SÔ6‡äÂendstream endobj 105 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5493 >> stream xœX XSWÚ¾a¹¹ ŠoëÜ;£u™ÖZ—Öªµ*ZmA±.¸+¸±o–’ ;_XÂÖ°‰à¾àRQ ÚÖà6uªÓÖÒj[[­µs®=t:7,&ýë?3>ñy8÷ž{η¼ßû~ç;B —xy{Ϙnþ“MÃqܾ§žöjG8Ú‚£vܸQÖhäèôÁ(Âüo‘{xĞȥâeQïF¿ã+Ù!ݹ"n—×î•~þ«×‡¬ ]öò–©Û^õ™öÚtÙŒ™ŠY sÆO˜÷ÒÄù#ÞžòW‚O¼O¬"VkˆIÄZb2áML!Ö%Ö/ˆÄbb±„x•ØL¼CL#–¯ˈw‰÷ˆ™„1‹ð$–+ˆÙ„ñ&±’p æ#ˆÄHb!áDŒ"F[ gBDøc_°%ìˆ {‚$þD 1ŒN¸ó~ó㈟s­6®6E6}¶¡v¤ØÝ··ÿŒœB¦ ÿ$l¦fQUÔãaŠaW‡GÿÆa³ÃAGWÇ'# G:Œ<àää¤E Õ4ÚqôçÎÎ7E£E³Eñ"­èÚ˜?ió”ÞMß{AöÂ]— .û]w»Vºmu{<Ö}läØc{Ñ‹«ÉUñ'#2ÝÔsÁ¶ÈÄݦUí u(„ƒ T~xDŸÞUÑ’‘˜’²¨°:(g~$+j ±IlõOöh6Y=Á>@¡a5PÁþH–×AcIj¡2—MÉŽ9Px C«É±É»’ý›¢n£·Ñù y›\DŸ yܺÊv1‹I™˜_¨JÙc¸Û×2B³ÈR~Ý&1ÈX_´”{x£ýôÙÒˆ÷,Ù-ìŸWož÷ªõ<9ùhã‘ùŒè“÷À'H*¥ø½SŒè£à¼ Õšl¹J£ÑÓ~ÀvØnÚ<‹¾ŠlÍ·ß!gïÀoÐî^7ïýá‡W¯]öœ>Ík‘;Ë/ÅFôš]tAûpÍCåt×…³—n\Xüú+K=—¾øåIO²;´ãˆª($xð-!§™ßÿe‹O\h+zÐQê÷;‡û ÿŸÃ¤e×FÁAªæ÷æþLWBUP Äû1{vÖ­áCm7q*áQß¼Œl®o«Ö³8d³P.†°Ðвè-²¬–_4Š_t3¹ !zÍæ¹sÝ={¾º×cúôæ±Ì@zbŒÈ·ß9Ó1ÓVÞÁ_é°!ëÊXŽ%[ò šÙ^ေfÖ E}(¹w‚¬uTU2÷_Ëv2Øù¢Œõ¤böµ‚^Ç\6¥1}ÃHy$ožyÕFkp WMhÙ]Ñ1$F+éoº¾C#uT¹¤¨*¶^§<×öq(e?ÇöÑ–ˆ´ô)‚-#4Íè ä윯‘Òjt=B§Q>#Éç†ç¼[ ¨ºæ¦oÿQ™Í¨ã³â›€2ïÄš„Z¨ ‹JS$g0¾z_ò9~+znÀkOâï)XÑýޤOÖõ÷ž¾umÑ-1“Z‘V ”9#ìËBˆ ´ê¶b¦#àl†‡áÌæœdEà'LëCrÍ‘hD³Œè¨QÐnBu<¬Ö!?º¦šûƒå` âaR‰í6o]Ô¼…ˆ@“Ñ«Ÿ>¾Õz)ålV¼FY7h2bûmŽMM ’3»Êvð6;¾„_ÄxÅOØ 9œ?ÜX­cc@2éð\1>Ö ÌIŸÉ'CÌ‘4šc‰!žs‡|†´¹¯Ô{-è/q:ùÊ•€ë7né­}`pfl<“éµfo4P àL-;ëX#ò1 îšP ï¡w‚®µZÛÊÇZ샑ÏïßÊ¢7«íSˆ-#ä`™%F±(ÇŠ­ gývÞfd‘žýÒL«CôPÔuR[ÛpëƒîýØúñ|7cž2d>´43¨ZøÇä+¦¨ëŒHz¶¨~·9…Q€¤|8Oñ#ªÚ-E‡ˆ>&¬ÆíVó³åigÐM£ †ÛcË-æóÒhœa‡ $à›X€nÚ~7ãYÀI$Ä÷‹ƒt ·J¨†¢³izänB¶F–K´å¶™wÐóш‚8 ɸ(~ýj¨d;ÈMø´}&™V—p\y(îRzQ ìåë!1&=yfÒ$T&¹¶ïP§h>û\ìEÜ›-?n!» ÂXû¥º4»ŠR“¹Úð°œ¤âø (†6ÈÖæTQCéša|ht>gÚÞ‹¼ø”År6ÍtUèÉÌv  U¼‰bïØ››Ä¢PáÕuŸá—¶O„ÅazYM™¡ MÍ@¾Z­Ë*U—@P;ú+:—¦c§M¯Œ]vÉóGFÛÝy'š¨DžáÞòB»;. Þ’€òÚ¹ï@Çmhb;DмHÙ¢ƒHL#M±?H–Öåi0UPϺOZøÈ¾nмþ7‘ƒÚxDÃñ< ¿a¿Ëò ÈV,„²_ §^ìd3ña–=v ‚XÙ?S>9/Þ®4òü#&û4¤bù×Õ2¢Ž‡x|ÑJY‘| øÄ…Rx“Ýuá´Ó‚` ¥ð ^ƃ¸ÓÊçÙdµõ)ü-#ÎqHœx¤ñ”!‰åÅ)EhÖP©‘Ûg¹û_¼%ø§Ä%‡ºe’©•*}rå4”ìZû|X7‘h<~š³2 Ó 2ÄsÄáÞòLPçæC UW!Þ¹c߮އÇkQó¬¹nBQ½¶œ?ІpH‘íÍ$3) Ò­î@Í^ÒóõI¢õ@Ū+5@ÕèË®O¼è}Gšâ³”º/’|îÇ a³~ƒkyQMS¨"Ÿ•Õ•~íÐ/§èPd¬iÓ<‡g’¢Ž†àÚí/bÁ+ý}ÎW/ÿÌã¨×(b÷Žp­Ïœï¼µ÷»ž{.w¬õ¶àè~'Šåc²†»F+[äÙ{€z׊øÍÔþlô³wsj­èK/ ÔfÖ[cqv;Ëij…ÏfüÅZ "2Õ~ÜE4Æ(8gB5¼âÌGki}%´!rù÷øìðÊdì„G>š„häzâ«Zsêã’Ò¥ÉlÌÆuªX‹Nɾ ÔéÒë]çzà t‹ ^¢†xæ‹b…éÁ][¤1ëäH+\ŽÒ ¸‰tF£†±|Ž»…±ƒuôå@$c!€Eï E½‡Nª.÷d°B(*¶›¿›ô_§¤ò] "g†íLØÁÈ÷ET%ºaЍ³¥_éc¹%øþ%ätéªÎù çŠ%¹ˆþ…Ž! m ò×õ쨗eA>Pº’вreA†š—¿ÛYŠˆ.×â¼’<¨¤r aƒG-ɪS nÐ ÁªpµGV$ƒ‰KŠ‚ H7IBœ\Z”R’Ì"Á*L¬R&'¤€Ä- Â2hÔµŒÈLwSApK ´4d~”QgÎ÷ãÓ |¾Å<šÞ:‚¶äÒƒ NV…°¿.†jöîc‡Už§>@ðs,*Ç£õÎh+š´ü²‹ˆC­Ù´Ük«L™¶7=.$”¼,¾¼ùÇq÷ß]Ña!~ âMž:+Ïjw¶sOÿ2ˆ6«ê˜úë<Õjì1Ð-òŸ¢šA'7Ý–›‹jèâVhm %‹¯’Ê@ l…bó$.DßÑ#@û¹G´2/ÒyÊÈT¥â‘®ò¤¤4ˆ§’ Cjr4ê¼bæçîŸW–ª²@n5…Íyåªe^?É£Ñ޿ѶèV7ÝVâ' õoŒln¯mjêwBÿ4Z'¸ÀMµå|ž:ÑyZ5@>U!/—Ä$ËRü_—%Ë2’ÜâÊâuUye%f ”ym;eBøà‡£ 4Z9¹`l7ÅžxåØÙ »‡h,â!ˆóé·=Ñp4M2ýpãzÏ_ñd<Å›í$:eþ •n9 µp0;¿¢ýˬV 4:M Ÿ»¸¥X0+žÍLMAÍBÈdòM™ü¥ã¤›x$>îlCb¹¾ºÜPœZ¢ÊcÊŽŸh:ÔO¶ÍZºyµ‡÷óbØEƒŽmhØR·"'¨xž"+ÓxÎc2ø¸S˜÷~WYÈ‘èµ![!ÂË„¼¼à‰ý¡äm,¿û­îv«ÖÀ)0P_ ù •í×î/;©®ÈIc”z/¥Æ6Yƒ[—'R+‘ŒÆr¡fg•ü´&§0ª)CT¹D¶mÎ…ˆJdüÍסMP«eÚ…hdåé/ :"~Àë)ѿ΢Ý–´S íÆ½I©JH ø6®^_SÜö‰÷5<¼ië¿Ô ±Œñb›„å Á¢4˜@óC©»5…ë÷Ãi8yò`w¡9YsºÑøn”Þ&t Z;»;æÿÛrKžŽ¦s ³rù6ÑÌåQÉRžÂpݯKÓöf¤B²›T+«¬É«(ÊaÐç?Ñ7ü»6mò_åîÞ¶êÔ©¶®ÌëïÐJiýÑ£•õÅÅ•{|}¥{xuZÇóá­Ý[6û­^ôöµ';Ú/ܘi8z¨¢±¤¤"l§¯4Bi†f§žóÕ HÜ*NFå•äóÝ@µ´X¦JÏT)|ïR¥$$Ô ò “ÑØÏµT•Éó€¶²¸º’šÇâƒÈÃ~é(ìž-êâºéìÃÑeQ@‰%1›%)ÆÞj™:–o²@­WkÍAAzîôÚ9o[Î =¤‹[x úó§}¾cTøó`káÁ†žà©tiÿ&ج½¿Ê`þMß$ñ ÌÕ?âeÀÝ|‰»Ž†²äœ¸b<ê³mÈ £usvñ͵> stream xœå\ÛnG’}çìGôÛ4êRå=SÀ>h¼ö. ïÀ#³ØñÌERRš³›²ôûÙ™U™•ÙlŠ´‹…¹X••׈'.Õ?/úN,zü/ýÿüê¨_¼?úùHÐÝEúßùÕâ§G/ßx¹¢ ÆÈÅ黣øŠ€F²³ gDgƒ_œ^-ÿ÷øôïÐ×€7¹ÓQëÎùÅ/éÄßüÇœ¡êè eè¤\\)+uÆ›£“½j’}€†ä‚ÑMPu*÷•4¡óa±‚ÑuO"}¬Ÿb¯"ÑûQèGµºcÊ  ©Op¿MÃ#žÜ HÛÉI 3¸¾)…!ÁuêU '2ç£q¨çŸ ò%ÎÂÁšYX!Puá­Mƒ+xøó¢{¥DsÎfð­—ºqðDÙjºïí0 Û/Þâ_w•]°Xï±|5£$ƒéŒWÃÑsÍãÚóKCK¸1ÙÕïWÀ^;Ø' iÐ\vl\úY.¸³Ú©H6JÐ%TW‘J´LÀ]¾+¥%Èä€÷VŒvgäBØ8iÃH‚%GDó²g¡PñDܶ¤I3†4°ïê] ™9`A0mi #ëâT6L Îâ(°ÔLc®A›ªÂ»æÃó39Kó½wƒ–bvlãxqA#Ù»!3A„ê÷pÜVH€ß‰‘‰q³siç«ÝÅÆ.¤½O=¦½ÇƒWpÞ Kg€zX=:å°üÌž½Àg_†#‚ÑègØSÙkdŸüÝn$)qò¹ÌÎàzÐ'mmÛô·‡g>óžáô kÒ\€ùRÏrj1é(ŠÔlvv»8AßËÍܸïâ{dë,63 8oÓâÆ.ÞÇfV¨¹qº sÑNYÈBèu¤ñ3|å¯ïq$r¬åヘ˜Œ¾÷ût‚¦ÂW82iû6qí€|…u$A&Ë+rÉ­ápöûÌ#É[Í<ÒùˆÑúbÌHõfðãØQJÓÌr*Ý’ºŸÙý HKšR·RÁ¤lŸøYšPF%ÕGyÒ#´¤{“%á@þLE’@û P€?à-°ØÒ¸RV9nàPЈ;ÀÞ’ÜÒ8|ˆm|ážïð»´pš{ “"aÖ5H¡&-Q½Íµr/]p@“€dþÖtA[7Z¸Üt˜½ž÷QÌÜtBõ!s0˜UËÿ¼¶¢SÂŒ³-L6ÎÖ õÐlW*tR ¨ß»—IÖùý.¦|e•ö 穲J+:#û‘7¾@·Ø16´£ Á~Œ2ö»†ÞEß-BÓxìÏ\ê+&ˆ”rF ¶q>Rè™üÇoó,Þ ¿¾‰a i2¦Á=”Â;[ {¶¡ÓÒÅûîØKÄN_JŠ´¶ïpF*­†[¢ÅH±; œThQ†_ØMð¡J‡ð’Þ¢þEÉ1+}>¢‰Í5Hîò˜§Þ’ñËÝ鸲„U. + ÒkQñ¾TFB~??þJ3ì¾T5¢†Q–Ò]<µÌÏ ò=*ˆÞÙýtL¢®}Ó®K=΂㹼dvpzç¶| ÜÑlR< Hª‚ã4Ýø:0{Ó)-vwÂCg Oöž4³x¢ fÝ nÊQM-"›C$m…Opf¹'çÇ7Þ”FgËLØ.öæ–R€7²ßËøÐ4Ê3èš…½h+gí¸•)Lú1ˆ—,‘Sì¬2IsÍåw/õIÒwpˆ*¶¯Q`×V Ñ"2·2E™`èYÕ$bn¨f V«*Å!y©iÛøpèÕçÄhÓx;?@2ž% NÝïÊb+/ä@ëäè<Æ—-å/hsZ9±´ŒçV!9Ç!0I’q›ÆÄK¹Ì&“l½í)M ©CƒÐÐÈyhb_Ue)‡¹kÌs–ð4`úFgˆÊ×Prd(-ÃË]š¸§ÈÓŒÜ ¦C…@‰ñ!Ž Ç×ð0g)ŠYáU+Ù]Ò9kÄW„l—ö7ö–Œ©Fh}Á¥Ñ©8]ðÄ÷¡ô£øÖ_ÇJ® =¤Þ éKlàü,F¹7 €ƒ¸åš´NŽmÞºd$OÎ ŠìÄ ^ï¬)œø+fIDgñîp'yå‹KSYK [é*bÇŒDHK÷X{4y±äúU³¥}ô/ö…Œ-a‡ gn:tncªè4SQ'ˆ¬|ËÚ.ϧ‚lgqý˜ÞÇŽß§ ©ïè*5…y¶{–h Aʾ’æ2»Ÿ&öiæ“”6jFý+QSƹΒ¼3~øªV™ÔnR¼>:ðûBT•OCîÝ¢ÊRXßf5p0¥±¤lð!âp1-{ÜvµÎgù1×DÊÚdÆ|ÈÕ:5£$)œ1ËRÙ(›íÅM|ÅÀåëXÜ+”k(FÙ¾Âjù¼’À|3faÜËüxò<ê±ÛçÇ«X&–5ižq-|[îè9œ @—C¯³ê:LÜ•œCæùéå+þ’"óïsT€Ш:Q= „˪ÀfS›ÕÏ¢]Q*TlS¹Œ’ Ž,ªûé ÊŠôà%iYVV4z,Ê2!6:ú!i]+Ócš!-*íõ»0ì-ü¡BÊËÂ&ŸÝ§ýÒp?„ìþõùð—L Ò<›ŒbÀD¤µCHë'Ü‘TÝ;³ü ]ˆUsß“IæA/4É“™ú†!Ô¤³cA'iv/÷ G…ÛÆNE(Y.î¼° tZJ ð£ ~Ÿf…°øŸ-Ÿ¥Uë_«¨zùF›Œ z€h5FNvg»õv·>?68CœYKr^i»Üv¨SÔÂ.^n¶©Ïãzº>9®¥—À'ý6ǘ¿Œe¤<¿1ƒÊÛÑP—ªKQæ™ýÎÚÖ æfPƒ–ÁàQ6…7¨ÔÊ‡ìæ‹!x$½îàFaÛ'0¡ ì¾`÷aõŽªóm&t³HiYûI0¡kÀv[n·$¨Ïá5üÕBm‰Ò d+z`%±R›íëþ±=Ã:½Ì;ÞS\&žºp§Œ+"Ÿe!Æšå—T³*ˆT¼î|”(1Y±©”bœåÖf-ÒÇ=ÄJL/Èìü0§>“t˜JQ!å;ik†®¹ö.ûò:¹“žÝ/”ò)_6IL[š+ZF¥ÿP®¹r}›Ÿí8ÏWìþËÆõ7ìš}ºƒ3^ÿ±\/oŸÆZa@ÑLäpÙù{id‘È™ù^I“f]U"Q‡|tuÞhݘ[« òm½ÿˆÝ^uÒ—¡ø»²f ²mÌ” †„?TÈÎ÷ŽjÁhe·Ê$[ß›ñmþ‘µŸe9ÓõÇÆX3žQ‘`~ì\¬ø‘¾Ë·ö+í-Fë° ºfpÁBõ³’‡*×Rû¹VZ߯ϵð£8©u¾°g¡( ‹(z—÷ü+’-fÁÙb%æ9V´ü^?;üŒm) &àÇÔØ–ª³­“Ät$U*»ÌyœRä6ËAøõM,€·yD¬E¥‚Dë6&×77»«, UѸr¾Ï&_ö,zHèŽ5Ý·ß'7µéC tgy¹]_ÜŸm¶Tê¬èÃþð¯C0°ëí%5Òé<»¾ІlÎã’‡ïaƒvkr,Ó$ÿµºL# º¾¸¼Ž®¨D “s Ÿ–X[lÀ¶Æý$9ëX 7!æøg4! ÷ç<»ŸHPNS¢ÕT^@£Šï£QøMÄÇjvs†‰Ì¼x”z5èз¤ƒ)ü£üC¦ÇÒÊÙ¼ll'þO±‘ÿÖèÓ˜'_Kã瞟 1ô“œ¥œÙcŒgö•”‡V¥3rpcʾ>“%:æ@¥Uøc ϵÈn ïyü¤ÑºÎªà“áñ’]7<ÿM¡À?b¤LÄÔøŸ½ˆ©ÊU?"ø À˜çøOa¨jt0ïÓMµ<»ºÂˆCÅ>¸Ð95cö.Ä/ÌN’o<ξ(ÂÈÔ8+–ÀŠ#—{}ÔÊu÷ ÖAãÇÖdTa„Ôu8Ä"<ðS ŽÇÊ^YîmcB³Ø7]-¼Oí?7Ú´|ŸŽ½{ßÀû–­¸gv©áJF†V1™'åuêG5ú9iÌ!·Ÿ= Â3—×'¸\©Ž[HÀ5ÃÌÆÿ}—ËS`)_س x¹ëÉ{~‘#à“<,…_OåÝ?¯ˆµ+n6ïJbµüVú ËÑXàŠQýs,(`&¥ä&GQc¹¦à¿)“̵©›ë×Äú]Pšý:¦Ô©X+ÌSê{‹Æß Áäêü÷&ÒM*%úú8D9/0ñw¸¶êè*áWŠª¶ŠãRÙ…Qe¶xŸ!‡~À ù·lO>ïÐï‹N`JÆÐDÛMM`ØïŽîèkUž ¸ºßœá.8šRÌQÒ "ò–4ò«©Êo”[ÞovëÛÍå4¦S½Î•ð\¯ÁCÅß.¢Ï¸Ñ/Öž*[²¥ŒýkÓÉͶ“—m£—]õj…”s,°ïHú÷¼^ê¾,ë¹.Q”~0ÂÓg>å÷‹k ‹ÞW¾>N÷¥1îë¢÷e…7ìÊIYõõ.댶…ÿÂPaè*Ƥ‚"MÒ%÷Ÿ…tiô ìBxÓÙ¯%]œ×|•KžH×.yÂ?¬ØlŒÓýžyÝG6&âtX®É œž|(U@]>ÂWŸ¾¾x_ý;&ž­8÷Ï9gÜÔÇ} “ ð°º“ÿtöä87ÀžùbžÅØ+g:çõl›²è0½ÃìZ ƒ5TQæCeø?ýŒžÉendstream endobj 107 0 obj << /Filter /FlateDecode /Length 5871 >> stream xœÍ=io$Çu߉üB a°lÕ}ùbç°F,1ÉYfIî’òCíp½ÚÀ?>ïÕÑýêjÉ•Øíí©~Uõî«J?²‰Ÿ2ü/ý}ywÂNߟütÂÃÛÓô×åÝéo.N¾ùÖŸr>y­ÅéÅ»“ø?uzbÒóS«ùd¼;½¸;ù~óogçlŒqá7gçÒŠÉ:½¹=;ç›Cü·àj³Åa†1é ¾†exÏ™‹ÏéóøÍþqMÞ^!‰°Ùd½W^mnp …˜&vL·ã®Ã÷“Ø|À_cšëb èŠþð!~éʹvøì½3ŒòsC®½“J-Ò&öäû»y8ŽoÞ æ¹#ë Øß•/ægúÝ@øèñLX˜Fª Yö'2eµ|vsöÃÅ¿ŸH)îøäâ ¸â²Dc$3Ô,×q¼»6°ë‡šä—¸PÇ`üŸÎ4—iSüþž$8颊Òð‹‰|gàµv‘Ø0œ'uƒ#ìæ;ŸuR1q@X‚dÌ(—ÈÏÀMƒ!tvú|K>%Ó#«Y(ÔQ•Ä·0@rxFELï–!‡ˆ @š‰x.ˆ&ͤ­™ù“‹ø>ât‘9dffg^ŽÃ¦•ÌĨâ (z‹Ÿ‹‘•` õ£ 0Áwøo™þÍ’NêˆÕ#åþ´ð&å~çC5 ¯ƒ¹ï ï̾ÇP ðojåð‘|“÷/œ9v¥"ãnꉫ]â‚9hª÷oµâ_ˆÆ¢CÀa€çÙÐõîÊõÎÏû3PqÒ Ýš…ŽEôYˆØ„]+p…8ƒé  Ø5V ˆ¥"³ôLp­BÚh´ Ú’ý&í\,• º¸ç•t—q¿qqÖmÄ ,âsü«·‘·Bš>XÒÎd(¤–¿ùGòþ_ëŠPö~7Ðôù«E™tXpH£,MõÚyþùœûI‰„©ŠÙÇOx›AY†tBˆ$[PÊÒKž,ë)XüÒµYÌ›U‘UëË_(.ƒÚ†; ”«çÇNŠ£²Êî5ã\p<†b½Ð'®m-a±ª˜ú]ü]ö.LüdÉç­çH™K[¨•ਅÕ÷ô ÊQLÍ¡c 2KìÜÆË¸0”ÆJ¡v`EŸtÉ4˜riq1¥Š¿ ìu3/ =n&þÝB¥xqçT^ ýUµê@2ôÄmög²Ÿ*¹º8ŒÔ š¿ sºÅJPªRÎxLûÒky—÷ª»L¿aò÷obd`nŒ½_jdpÁ1èüf>¼QÓÔAk×ÃDŽ·ùë#4eO;ºIé%›iÖ—Ä,b}| i ÷Šª–ŽƒGŸ?4=^]>X:|TGWØ}öܺ‹˜Åßy-*'« Ât_TKß :?§üTJ.¢€§&÷S¥‹$Ĭ¥f^c§'`{÷*úИ£¥O´­ÇîžÎ'mgn¬ÈXæk©Ùq'²Å—-_¡5T˜„­-w,F¸¡’}ˆ…çbÈ%1pT4«Â`6I9Ç.<Ö(!Ð qçœ~/Ðþ_3δ ùàC…ù¦”"Ñ1E°VÔ¸×øÏie7`lj‰IÒv«¸$ 1³Ê'bì:¹°jŒï¿˜) ÙQˆœ¬#u‡‰¡ÿVKfOæYV«R«Á\` ¸„D°AíýëB¢ÌÄ÷Kþ|¡ôl-IU=#4=hDm0VÓ‰Mœ8›†Ñ &[Íߟ]üØŠÃÄõ3…!ÄG¼š0˜SªáèD7DÛMƒ1Íbz ŸHÁp!±a‚¦ ìÞ{*Ï,¬ aÅŠÒ䫿"á¾| /Ø1a5(41L‰U¥–~ÃÓUc1"p7ÎêRЧõ «ª.ûŽî¨(ªOa›*F)4=¨>Ä0Xû TùŠ4OøcT@ù3yÛYt÷£«”Úö¼’³+¬®14V9]VS(¿äT8·C]·KZ3NíÆáê(K[æp¸­L¬ì›Øÿ,ˆ€ZH+~ÉØVXœKÁà«c4”]>![Of±Ç8«R+áÞ<ü.ð«3¶›FHº‹J¼+‚T$ß ¨Ïñs”ª¿…ÉÃu! }ùl`]+c,׿ß&“…¦ÖÕQ¢B45ãð¥É—3•Cí¸o@©BJts|¦["XLKÒ| Í4J#Ç Z×ZêÂn #T™‰ÞÜí¯®w—»íáÐ5q莫2ó6Š(W–YÆ Ž4BÔ:æF‹IsD4!¬ µÚ¾:ˆ¸>oC¼bXO{5©ÓÁ¥|UÅ6N*û9/Gí( û®¶!j×ãÜé(WXòX¸@MochH 4­*. oK%§(¶|ލ·n reGã$Çtšð“‘u:­Ê6† ktæzÆm°˜¦*º8h‹I©p &KÞ°U~T¬©j£8ÌyÉùÇ÷¹ÑÑp`J¸0Ò½XǕտŠU±ñÕéײ*eÉÛ£Y¬¬aÖúÂÙIqUYcÕ·Æÿzºƒ”«u¬dà :y”ÕÂõh ™â#P#¿RB— ƒïN:¨ quèUÛÆÇ”C=Öˆ Œ„$+ëš¿%"(üQwn@Gê¢iÒÆ>”Àŧ¹%*e#TÊFèaÝ`5yêÕ$¼!m(]¥ÙØ£¶4Ö«¢ç‘$àq„kõYÞŸ`®©} K&}Tö “y]³%I)áƒNбZšâ×gý™ËÉ6‘À*‚’|‚€hLÍ!=eMÐõZ¡Sã6?– xÎïT‚$‚-™¥BbbÕ`µ' +͆8Åç ÈŒ‰9'énb²ԙظµG7ÞTq{ÞÚ¨‰‡>Wýï3È¥†6z*­ob«¶m7E¤äs%õ'´¶kÂZ9Ðóp‘–ø<(# °¦Q%‘Ô— ¿4ØeòÓ²NyZ&ÆÆNM‚O—y:¤D92¤íuý¦“gKAù‡$ô·©6t²ÑË€„^b.þŠñÁ¯’zEI >$âQúD“°«L ØÉÑ&˜'B‰Õ?'~^5j¡&Åg+||ø†ÂÎ]ëÝ +“ U}ì¤ê†  ÉÍßÍùúÅ"¾³GîA ž;ª?ÍfrÖ½æŒVDT™}8, ­N×àÄØuÕßîû(Ÿ¾I$/ÁRyPjØþ…ëëd_Ñþ… € Õ»È3cܤ¤ªNT>uÄÓÎ.’ª¤Oú¦ŸfJ?¢'¦mp–þ9¾vÊ6Þ2žÛ NYœv7:P5©(&B a‡’ “{Âä<0åtl/d¬9 ýR¦C}f]ÍtŠñ‡o*Þƒš )·£vžÈí†H]%à†qGk/íº¦Y¹Ž¾¡Ñº¾Áš4DΤ˳ȩ5ËïÖ’¥‡HùId¥ŽYž”<´Ã•>èÒ G»msë}4ªÇ´Cb]¦ ûÂŽ Þ'Úðؽ¬ÃÒqNH¢†lýsÕ÷M&e¡QÇÔgѬ|;ïnöBtÛ?ŠŠÓâI™Ÿ‰ ˜­¸uáiÂQa¾;5Û˜ï07ÏoAÆ¥a.°lt÷¼ªIâëz–°§»ZvWŽÀàR]ÓpA?,ëØ—#º²f[ïë:Ãsáƒ×fPØÇ…Ñc¥z²bÖgÖqlÁÏGÝgÍë¶N«ÁÜŠ&Q)pWÉ÷ÿ, •įU0*´C>ôëÞ£»3†˜§Iªµ#NNN’ø&{u5‰‘'*xm‰bY±ôK>Ô<ÐÉÛÐòà-Yâñùœv‰àÐbnµÂrq幜Qª±‰®iž›dLlþQp£BüÓ\¢,¥¡9áC†Ç:’› uÜ„U劂+øÌȞ̾EEq©©Ï½5•˜¬žû Ñþ³¯Ãh/  ~^ŒìŽŽ» +LÔ/ÿÕÇüÚcÒ-k{8²,`+5 _ëš§í)r›ÓËæ¸YŠ#/W·8w8XÒu…ÓHKÞ¢ƒÌ ]«þ,Šl9qÜä³Ù}·a‰®ÒÚC3Ue»[ióÕ¯0§Éi«ë·tÏ¿®D*©[Ɇ“(]1 Xòù¬Ðë¦úÅùw‚|_ž¥™€¥æòdîVƒDõ袂CœCTÝm"ãÖý©}œIîÿ—@¤Õ£QîþòÜD¶UB4æw»ÈÒµÑ?O‡ôES.Üm€#”te¸°›•ñ]šï˜côÇ%Y¹>…PÆ2^Ü$ÁÀa· BŠ^Fn¥§^F¤€‰°ÚŠI1!ÿ!§< 5Í1õá¯ÇX½³à¡ ©õP“»¾>­ˆp°,ñqötÁ1Ewì’Õ¡N[(œÚü^‘xŸ.SÀù “M­~õœâ×Ù(4SýʈŠÖˆ¼RW,Æ#O>Ñè’0cm%ÍMsÈ” wåᑲõ•soªSx!…hW›€ÞއI%j-‚E³©B}“ÃijÇÜ|QÙ*„]£«K¨ bŽI!´p4 Ìr°ÆmgüˆÔô}ÇYllêu\³eY•æ£ËJ‡¤KÃùP#_2ܯåL\bçèòq·5à×ÞunKHv8E¨‚ðx>7lŠ3!—þ|.®Œazˆ E˰ݶ3IÌ›S´KþñIß™à!Öe¡ðzHà‘Eþ¿Dy5ÙÓç`õ¨Z®á'Må¡r½O]|÷Õ½^K¹ô·7ñ¸UîK ®¦*•™Y sèàlvá M`}˜ ¦¯ /Wï Ç`"óh¼éoBJRYb¨ëm¼"¯É¤á¾›;´ºÚga²ª|®8¬Ûñgëú¾K÷—¨R‚ßžÅ/N šËòF>öè®±‡Òµš·ÕœïY²“,hÿ1GU/'Ïé]^œåS€AS•,¸þOT>ÎójJ¥›î^rG§»Óûcضé÷¥Õ†?Óñ¦Ê[ ƒ]˵#^qUçF¶& «ŠeèË%÷ÓÊNìéäzj6aäÐìR…ºrÓÞ ²{{iN°“ïôÄ(¿=qk3B n¸8½;pÖ«ç7»“ïÆ!’=k¥£‘Œ‡Pï&óàùb&x‰‘ð²Pî’ö§~òF˜”qVŸžK¼eSHzŸL>Ôz.”œô܈ Oc"Rd±6$·…¦?EåñÒ˜vK|ÇŒ‹v$ AHåîÓ˜@gé§³c×ðpÖâSºE8æ`n‰£ƒ$ˆ€J·¥ç˲ÄÂ;Ÿ¾”Ó¬D=ãŽç§û–·qˆ_ÎÀËK™|¸¹l°ñ®¥€‘b{ûdš]ä.cøðîs-)rOKU¹ îïcjV„î=,]e“™D€‘¤¤ˆL˜æ.ßq¥:g“Òfðm<‹N }¿ìàŠ²BÈ×x9qQžNËØVh½ØÌaû™%‘K ù ½îÉëC¦:Ïgê ¶…Ü! vœñ mìm dÇÞ¶B…ò-ÅÛž¢?ÜF²I¼‹æ|^fºcT¾ÆRðf“›²Í$ðVÌÜŽ÷_‡+D8£Õ°m”pm¶ÆNeôí¸C†— =æ* (ÔЇ8D1SÊ#!ßu"s‡oB6õ†àDoàá/lH‹'jvwé$ U-xdzԳ‡Oè·O-ÐÂRæ¡ìJ™€""\ðæƒ«ñ»p5˜ßBÌc“ H7„„mLS&¥BAE™ðî¶’Ä=(ØWm2PÁ»Äy:L¸/2“ äÑ=’a·nN£n>é˜Ëf5Ô_¢Â˜T cöÑNî)O×N]’Œ{"ÈQRßð†¼¦l?’žðiè£ ,ÂFŸ—Ð-õtãÏFR¿}ŒÓx¶Šyœ‡ëƒâh`!PÑZa|£’H”ÎUm•fT•~ì-¦÷#±{–a-ÜÑ¥Sèû»¸}áZçã0q£1à qïv´®íÛÖ2„èþ¦³Þ]Œ¼$„AáÆòì¦õþ_8ù?Í4¸›endstream endobj 108 0 obj << /Filter /FlateDecode /Length 253 >> stream xœ35Ô32Q0P0SеP01U0³TH1ä2Ð30 !Œ‘œËU¨`laT072Ì€X$”sòäÒ÷ôU()*MåÒ*äÒ÷ªâÒw pV0äÒw‰Ë¥ï¦ïìì䨨è{+èeœósJsóŠZìì¸<]Ô86$ÍÛÿÿ‡Ã‡͇øýý]9>U±6¿ÐÝ·áÞô¯û¿i×ýÿïÛƒ%Wmª¿ý“ßð·??á›ÜáÃæÍµŸ/¸¿ûû÷ó~/ôýÿ¿ýï½|ÃÿÇ}Ùöõ½w¾w‡؎µk[·6s³qóèÿÿûmƒ—«§B ?"aÂendstream endobj 109 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 898 >> stream xœµ]L›e†ß|uºÎï`L¿:“-FœÁãÏ Ê‘èT¶ªDÈ&ÝJ‹+ëý¶_[ûô—Ò¬]Ki ¶Å6dè2ÐÚ`Ç”3&ËbâŒ&êûe¯&·8cb<òyNžƒ;÷ý\7ƒÄUˆa¼ï@›\þhãæ½xa] Õ Hıeé•m¥»–ïF›ƒU'º{ßê;®Dè%$GÍh?jA­èzm©˜!1z}Ët1¥ªŽª Qƒèk!µUHñ%òe‰!ÛË„_ ^’ai+>Mëh-ÝEe[®Lî$õdG-TÅvh.¬ñuÂ|UH29Ëåã3±yCÎ@ʈoÿ#­@…jÖ¼àÓÃÖ2luqÇÎ*ü:Àí¢QYÃrûçÅÃaYÀ’îù.Bz!Iä£a¿{ª_å²(mœSg<¤¬u§ƒ!oee´õöMûz’T_%uŸ‹vuÑ;§øÅ¿5r_™(®‹„6rƒµ;Fmp«'ÍÉ™äôÙ_ÿ`e©”ödï™ãÜBï ÌÀ,{ÎGc äq\—±ó.'§Õ+T´ª’þüJ˜¾6wšNý•DªoáÎ k¬'à BgU`枪1ªA¡ÊBDv¾¦î½I¾ãÿ%¯/iå®Lìe‰vv.ÏÇ¿™[ƒ$^íXj¦Û*ðÛéîöÉžÌ ·ôÆÌÿ'ú“@дǓ¹KìÜ•/.Ϧ ƒû°> stream xœÍ]K“7r¾Ó ÿÆ^4t°Ë…Wˆ ´aìX+Ö^:öàõâ ¥‡CŠQü÷ÎLU QÕ3)<°§…g"óËgýôxžÔãÿåÿ_¼~4?þþÑO}û8ÿ÷âõã?={ôÏÿ+5Eçôãg/¥'Ôceçivþ±wjZbxüìõ£ÿ½ø÷''è3F5‡‹Û''íÃ4ÃÇøµÑF{ñÓ“º¸J¿iå/~a¿=Åß>ão~ ³º¸Æ¿oŸh7ŰøÔM˜g§ôÕìµ»xǾ~‰Ÿõ<+/žãçežMX.^¤‰…9x|m#êà§ÍÅGì=ûí?GyÆIÀßoþß³ÿ€Q¦Úc`gž]Â>ð¡ß³Ïûüš}¦ö.cmZeþþû|Í>ÿÒΤ:"¦%è0˜ n®žýÅe>ˆu½|í/Øg¾¿|O¾Ã½ƒóºê懈åW¥ê_opÔ7Oô2ÙÙú‹OÛ|>Õ[¯RÓ›LEJUszÓnRžß»ŠD¨½ÕÊTÏr2ºa磒ž§g~dŸÏèå¤"ÜŒ`Ÿ”¬µ1FG¡ˆoq}OùNt+ÍßÃi™ÅM›ê€‰P/Óo1úêq¾ðØA^Õ‡zácº}[»L pkþ¸~O§Å;çäü]>E>šYä‰;Úçl÷Æ9XPˆ‰ÅäÉÞ–uêvmyظð|ËG„ózå2Û ?O=¹à–@OXäKÈ[–Ðlåy|)ÓÒÕ$3»Éê¥\^`PƧ£.1ŽïFždP?ãÓj‰Ã9¾gs¹N×´¦+¢ê2¿DÕ‹JÓäM_â´4Œ¥–Ø ±‰n¥¹Ë×;ÃiÓ¯vœ.ßQ>ôë•.…›ÃiàÅàX9ùƒ“A¡Öñ¹æ\q¡ AÇ ¡bÕ£;S8§c‘ô/˘¾—WÛY6G\šH’PG3ym sIÇ{¹dŸ¯ÚÝ;GbòÓá sq1³¾ƒÄ £Ëäùþýb°¥ïëeÃÍTÜ­æ.TÂKõ{Ê žy·¤ü}+\ƒ†³*ØÿI›¯®žþe°.¢÷·£¦Nàì›K§FgVÍT@.“Vù0â³"nþfŒ*»ÏOŸŸàí€Þ0ùq9 œ— |7èó〙¬¨(ÄÉÆ…/dÌE8ˆx—ve.;U@VÀð‹õ†°\>äËÌ®á`àälu^·'^§Ó]œ«QÌ-ʆv¸¿?aL…ýëà&³ ɇ)úÙ3’ÿ™Ñ,´·‡¯íºv9øõ¢ª…H·ÆF JIÀo°ÝÙÄq28TÔôj FŠâ¨K"äm£õBd³ÉåÏB\Àe°Ë×@i³šƒ3 + pT¹å&=‚4ÅÕ$NS4·‘é‚ÓNw3ÿ¸âÄËõæfr§ß¿®)—åk\?Ô”S®õ²zK` æÅ/qYÖ­I÷eW>§i„–øðkD„Pk ’†Ž Ï«¹+³¸EyS©×‚Z ºûY—‚¨`ƒcŸñyfËîy#æ2”Êó®I˜›PùV½¯i$©ƒ0w4p …‚0yE,7-Å5 >æñÂßÕ§Ð=ª´¨t·Ÿ‰r~Ę̈i~Ò•Vüƒ ŽpÄØÛ°T˲M:΃HÔºœ¼ G‘Fn×(Í)97Çk_gM?íœÍ *FãÊAjUásÞÑebç¹gï óY¯4UÚœÔ2:©éßž:é¬-ÞáÂvÅÏåû´R²¬ŒÎ—qWI,v ‹ìooGFëWó|C3Ö£M¶~pÍÛ’!ÚíqIlâƒ, ,ºwmu~ÂG€4iªs¡ñ¢ÛÀþ²»A¼@•.ߎ¬ÕWåýoÀs¥%Â=S“ ±a¹»¤¹™ϵ=Qû;yk@ÝÕe;Îb\ž„‰%JÛº °¹iÑ~UÙžß ÞŽlÉ‚ø4FPxÕ|8YŽY?®FãK]<€-Ôœ l¢`2“‚ºÛïë£LCÔ¸þeB5 ·:+ˆºÚP;ŸÞfåPPg’¿x~ûùɳÛ­ÕzœXvöÀaÐíÊ­•M˜}'Ãaü÷¹’šm®•ÒÀžhE¾dÜæ®i<Âø›æƒ%À÷qµ‘o¶%¿$ÛÒ_3ëÃG—v?ðKÑF@Gô“Àh_¥ö> £EØ•Å=ÄKk×ùË’8úN/o}SŒd†Ü:m¦ŒúkzJËêTO'k"K¬‡yí¸”×Á G8ä¢éñêéüm˜1Š_m¥1mÖü·w/=‚œø|™×7/a òAÀ¸3]\qrÚU×ã žï¼ÙT¤»öÎμ3ôŽ`P>*Š#¸Üöâó*Ï2ì“^ZÌódÐY¸gƒ_<Φ8æø%Âʮþ[1qW¯‹]û}E¨½™7Yüth^!XíÚƒœJ^Ò¼ŒK»²ôÏ©-b‚;ĉ¨àl‰ç+LÐÐXƒ4÷tYg½ƒ›¥U6ƒåÈ»onZMâlŸÀ‡ö8ÈBéð mEœiŸ?¯vœï™ìß±b±Dá ŒRr*@³-õ^NØÌ¢~=ד1.ϸôå˜Lc2¼‹X$"Nùm¢âpËÐøëd × „“ä¹!—àt&”<ˆÖ–ØDŒŽ"Þ²(R¡¬ÂµöBÜ eh‹€;ahÎND®8úÙîäm»‚=¢ÕôšTß5’„¾ÇøµW!€ßÉÆ¡Ó{ Œù ðHZ£‚E£B«ü78KôwéÔ¾„èÑ.ª]&ÂÛ=ܤ^+Tº¯Ú6 ŸEÓÛ ¼•¥ÿHÖ±D¥vÇ.ߨÌǽFaùJ·,ëOÕ-ÃP~Ñùsö9ñÓ] »ÉÂÎUŽ£ãH½#ÆÄ²~ÿ9­•´AbïÀ‘¼q:‡FcQOŽ‹Z áQ*@Œe6j9+ÃâLÃ$×Üù%9¹¥éùÐeöGÐ[ÏX‰­©’t‚JH¶bjeê2h,³­‰šŸæÛ¶ÇŒâ[…Xb›·7·ËÅ ùmh Ü L°è|°ux ³¢mÑ2Œ—‘=Ÿ¦sî¿k·ñ*µCe´QªpH´ß5ÞcŽwG "â— £ÍqBÍì¸Öï;‡`¾W­ VÖFÅwŽuCbš{‚ßä`5™-/ ±¦Ñsqiž£à“hb|B2(Síê¿£˜hÕjù7]j@ '€ˆL°h*!uAù~ˆÜ–Á¬ìâ59«µ[ˆ[3÷­s™‹¢ÉdüjgÛó óÏÏTÁ„2¯Hý±ù¯‹´rެFƒL)þÈFÀú΄}#L]P)š$mp—N_ß'D$ÍKcŽG’ìyæèH'«ÿ !O\’¼ìýÔÛh-¶7„˜Ÿ³4¦Ö*qöÍß|*Ó®Mo Öc -‚–îH2ÇMI!*hÿ±5u |P>gpŽY³F¦§GíGd‹ZÁb0†þwbFŒ“ÒaÕRG’DV2z—8(Aeh³u퉱4zRî‹T¥Ñf£Òg3ØJ¯&kÌj£+ɃåBuÁhÂýG¾ q¢62îóŠÙ[k ˆ¼¡”W|OÑU37h5`«ñ¯°z ]¹NÊ‹²“ب;E}ï‹É;?v}vv/ rÃ3N¸TB·ÔOPbÐã_*þ€6¶$çºã ×Ùñœ!WÚPš/‹Í”³–5èCz-ÒæÒÝ•Ik|½jE¡•E¶ ÑÔ³m)g̨¾9ò >4¢$áCìSÃ<ž§]W‹ø„Ò.¥àŒ²•#ÌÅ… ×÷’¿ÝN~KW{ª´¢‹/Ù¼E Ä­á`ïj"³€)Æ)è6~[¦î‘*IN6å-’Ý­å?¬÷ˆïU œ0Éí6ðÛJ¼7ºiaqq¼çïØçkˆR«n½H8¨¥PóûgþèÉ/3#y>ŸØçN’¢³3ãÕs6ÓÌ6§åGpÓ&3£ý}Ã! ì75€-‚pGËíTâPáü˜óhw_rß°/†b£­ é³ïQè'^£„¥³Æý ºËûú–õÿ?ìóŸåÏ tœ­ÅŠmÊœNž –/Ef[œä³øemÕ:G ïEÑ*t+µiœÈE"'­Bf¥-½9³ŸKÚšµúlãåZ€â“­x¥¨$~¸Ù^Påz>ŠÜÜ*ÒýåÌ…-)ÙX 2Ò†Gç™Î›Ã`‚èÊFÜÔ´„cÅy=ÍWm¢*‹î ˆ>y列©»±É0L)4êü¡­ Ÿ€ôv óxSÓ•ˆƒ¯süj·«îû]¢iêQ}ÈîˆUnëÕ€MòÏo÷Ðõæß©’w’ÃO&‚x­LrØ\h\2pŠ^b;crš7Ñ¹Ž°«½ã3&\.÷¸tëÁÕîüeê¨è0µ…ÚÅpÞéì¢ólgÄDr\VZ¹âÅEâ¶c¯dB±¨dºÎ3#Ñ@,¬,S½±kOË@« ÖN‰Ô‹m Y*­)D ¸rlHi®u¿^æQp/GÑæéÖLœOï|sT ¥¸ÀVàôçGÏþI†NšT]ÓóøëÓ‹ø25E]sdsåi?²K©Ž‚ÏaWÓdÂ’k×àÓ*Œµ‰rÆŽ´es¦‰·Ä¸m'–»£M6d{‡¬x½P¥³Ê¡œ`éùœ›x¨1Çs»¶AÚ¦øƒ» :‚;jÞdb[q¯2T}Ø%FXŽì¾]‰Ê×Lõ!² d§nÝc[R¿Æ/Ùu( ‰€œà”)â› Ñ -Jª´òpYîj*Xœ¢KöŸú åpžCÍS9;éíœÿÐ^ZA$¿o *ã˜.ð[hÏûùÃ..°k Q%•¸qÃáê&AùeúZ…AI«ºyÍx>°•G)]‘Ö,‡Âã‹ù5/®U)­õÎ@ñ¤:`ØÆ&.f2ºÍu“TEÆ|¡îM|(*ZNò¯©Ù…] 2'ÚòœS¥!{ˆÆ…˜Ù#0Na¯Êö"b¤Óîf•rõoJÆ}Ø•‡4YæZ>w¨Pi9¤¿ª‹oHœæ ”ä8ÙàV*þ\öPNgßS4`¿Ø¼€°}-^ç>;TR‹ý| €‡v5Rø³)N"z×ôxÂ*fxœŸ¥^·Dñ!ÑRJ‚xµ¢!²>¾Z±Rbw2¤kM«ßÅ¿°Ï_nWò˜œ W4ôGÚ¿6A·MI%[nm)Ïq>;Àât |ßnî.,·„üHÑí9Ïd¾è€×N>2ÚÊwj)0ù ;læ"<˜~Ä‘ÉI¬4ÔšëÏ©^'&.å8ôÝ|“ÛdÞAHqèöž|ôÐQ} ›€: ®ŸÇ–Â6ÿ¡ Áˆß9XMr ŽïZ:½,>¾±–ÓéÒPwclGõð/-ÝTq7Q»±OÏFÌoþB€Æäxón)lâ觉÷¨[‹Ý) H#uÔfCLè=ó÷ŒÖ&Êí‰Ù˜rÍŠÝÐ9ÕÌåMe!;o²ž€‚Ö(Šmo 9ÿŽìÓ8DhJ­¶”yzØ‚EÒ”àv¡CšdÍRÞ¶‡Ç’àžáÑ]1¶Ô^rÏ _YÌ‘€·ÊÊ¿Ùo)æ=¥|Læ¯W B«ªŠÞ=h›gº, Ü¶EÀS¯XËÅ’+Eoµ™Í _¤ á«ôÈYµ¡0ï×VÄÑËVm+Ç‚ÂpPMQ‡Èë…Þ òðÝ?Ï¡WQL·ºª”h:Õþd:èZ³öAŽDœ¼s[e«ÝànüîÆ~ðNãzª=ù¨ JO΋ú²ò¿NFG]þ±Ks*ÕáÂHjg2#òõÔJÐ /Ï…î@kH\IˆŽ™.å9ö#lÛš#?®Š\–e§äKÚ~™iUÌ¡nŒ-8PÙ¿}Ý`‘1|ÅQ׿F¥iqìíönÑ,‹Gb¥TøíÉã­Ä’k€²KÁª½– 9fþíPÌâ&Í]µ;$)¸Ìê//=îÔaÊ:óë¸T)¸F&h•s3•_*RÅ8ª+;–©m Û9v|½¶KR+;æÌRøRÆ þìëD²¾œQ÷ „AåÈvÁ„ ® Uvjb‘ØÑ1 BUÑ¥w£4Qµƒòmx-=쎫æ9%—‘^w¿¦3ngíxG6¢S,è AìzÇQ¶RF¸{ˆ_”`é![/Ýýwmt“2­Ëî¡â.Ô°°0Ns“´ w…Éí29wÿ`$ôÈÄñvêÍÉ@Fø»rñ *îNýr“³•‡|±É€³ê“•纄˽J—r4æÂ¬œèåà ÷#U˜,;¸I-SÐA­^Ε>ÉôuÖXT>XòØmõFVâ )óJúbMfó¼¬ù 0¦ïTËáÍAFjßTªŠnªÐrÒèÕ@¶ôÛ~Ò=ÛT )iR¥ñkŒ¨ßfza™4ÒÀ’fa“ް¾•æ(0K«He†Û<˜<ۇʨkx}ZÅÀסÎIÁ¶h®|²u »Ø2[Gz@†Iû.OÇ7õ;±Jž\ê. 娧¶õTöÚí“ÀÒåÁœÐK–½Ü¹V¾‹wÛ%ÞUÁ²tÙW{Éct…[ŒTQj/N'|æûfÔ“µäZ™8ˆ!“Ý™/>r_‹á#†ÿ·åJlô”sû×tÇöª9Ö<ÂX,Ä"(mÍc›ÞÖE†÷â«&#V=¶ÉeÝæçbÈólªH¸-Õô2³¨´$áõÝ–Ï_£´Ü·n„§èÙ>ö|o'‹•5]»{Hß³3ñîôáý[1ÿ}únjåL©JjÿÚúœ={jŠTσ×Aét‚R|ÕJ&ÜMqµ–·> T™äÝÏPé #d o–“¹sJ4‘I %C纸}ŽçÄ\Ò¼_ÿ•2wù7ž ËùÒ+IH˜ÛV q«·¸I{Û$g|ýŸ%nÉÑ®ûF‘¢£M’ŽM€~~o¾ üMŸ¥HFŸyF©žªŠ¤=/wþ7I¦ùÅxÞÛ=±±“hû*ý¦âyˆ…ö¤/ GÛ:~ÛÃÈž'y˜p|u O»Ã"›¹0Xpâ R„Äë¡–UîÕú}šsªáÀ³Ñ&%‡Óæ„aí¯aþ:íJ$AxÛo+ 6ã”'¼Wg€²\°½-+餯ín€$ö²–Oéò'ÐÓéÎÌŸ8xûEΟêÜÒã³=7Âv9Û|S•Ç;§>L{ “˜CÙÚe-D—–wª?jçÈèjlº ™Áh¿N/Œk½Ðó»œIiz£ŠbyåmÁc ‡/ð(ÇøsË“xq*S©]=w…òÀ”ýV…ŠÛzº*&Y„ßÔóèa޲[­½;Àwdimý–0ÁÊ«ßsßÌû¤—X@â!H¶©3„*¾B%«õæ ß½¡{IMôY'½güj•c¶)óÅ!gw±N©ì†(tâ²eEîYâB¯gÚu9°ýj-q!—Ca1…õo±6—©ÑèÕG8ÍX… vnÕè¦Ðê|¢ÚÔkïÂÈ^AQ¤–ö‹?ÃcÄ?P2H«^ K±Ar|¬¥ü ³d°$»š³–xï1çûû4‰µ¶›z^¶†þÒÈê…ZxºÖ.¿é?ËüGü‚lf #1i¢c:‚CøýîÜð=…ή‹¿y£Þæú½™×Ox„9?úqpñes¥:2Þ*ôzûÚÝeà‰+ª'¥°À&ÖˆSÀFë4õ¦üÛ³GÿÿþÙ>Ú/endstream endobj 111 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4337 >> stream xœ­XyTSgŸ¾1¯–bEÓ1_ûÝÛ¯­[;¶j[»[ëVÄTÜPY „-$²'7¿²„@ØÂ¾*ˆ‚Kënk«Õ*ݦv¾¯~]æ´§óÍz9sæ h§ítzz¦ÃÉÈ{ïûþžç÷<Ïïåa7qÙº¸Õ †~}(“³ü°D|ˆ«xøA]zyê_§ >@„~f½~H¼,sù ÉÊìœÜDiÁ¾uIû“7¤¤nJ‹KÏ8øÏO-|æ¥ÙsæÄ£Äzbñ8±‘˜IÌ"b‰ÙD±™ØB,%¶Û‰åÄSÄ b%ñ±€XE¬&ž!ÖÏÏÑÄ:"†¸Ÿ˜BL#¦$1‰˜LÌÆ»$ˆjÞ žwÂÌ ·øëÃ…u‡ËÃG‡&ΘØD¦LŠ˜”9yåäoï¯Ù÷‡ßßY4%lÊù4S·L=ÕugÚÄioOÏšÞ<ý á«B6hŒ9”.óñP4 fĉs¶é•& d¤ÊfªÌuЦ#³»¡Ê©aut¶YQ Uàq”9+ÞG¨PàæžcåæÌu&‘B R¼ÚB·B‡¹ Z¡i ­¶•‚×­…¢íz{=Cï!MÕ¦ˆ`Ôi‹IîÐè !Ú„>ósŸ…GT¾àÓ>^0âDÍ[|Ä¢Z¡­æšþGa›lÝn.B¶VK jÈ#w4ì½Ó‚æZœj0›Œ…J–¹ ÈBÝ_ënvøèú÷ÛîÀòdÎñÅëv¦$ Œý» ²Ty{¤ÉEë!5VÆéfY¿*?[u¶ Èz8T,5äôR®ß DÅŽb¯ßå­´P‘Aãø&Ñ„K¨ô?¨C-ÂïמYÂErQÜ_¸9ñÎæk(E¡ÇÐ,Š®F˜˜Öqåh-šÐúÝyi¨©È¡ú›ödsáéqôÞåñ’T #G6äFžðМaþHÇÈb![Â:ÀL:µÀ0Pk©5/§ŸoZ".Kår8·M˜‡¦!Þð-»ƒ¾ýYÅç¡ïk@§1˜ÔF*›ÇMzõ) ç¿x =ÜèF¯}þD½û·Ë_‰„¥½»É1Òê‰jX]f¶bì|Ü–zzˆUùŸsÓ…š ­n?JH5vÆJ×CÀÜMÐÂ~Y¹YPîdí(švIêRð[xh"z ͼ½ëòÊè­kµzZ}<¥&íw!g(¤ß” Íç?> dGUò–Ø4nj~"ºb¯8Èuº¿ã•˜täHF¼‘%7øÈ5òš° DG;TÕ5‚\FFGs=¦NÕib@4öOTÐh@€Ö¡(IÑœ¿ä"inÅ*¡³Ëxßoðå'6Š¹ç¢Ÿ¤ã¿‹+ù¸à‰u;̳¿õIÜJ¨³™7² -N0KºT`ÔÁh¤F“¯WÆqÚ»‰› $9¶Úf‹‡~5‡ß¼ã‹ ´bFCl u ¥”µ”•Po" kam`…ˆ ®0Rù¯d¿ä ‚ ˆu¶ÛÙ¡©áÞ£†|}: zFzRék)”xK¨Z´p‰ DäÖ€ŒÝ*Ý=ýiШŒÀ`šsöü²4Á$XÖVNF竪Ñï{0æ~ÀGVÔ-,)íGS>+4B¢Ð - ™W¡)÷6”u ½aïÚŸ»5™RŸÝSžùn¶ªG¢p‰ñ§™‡Î¡aá§‚‹®B±\—iT†*¦Ç Õm.ñ”Pg2ü^­ ”t‰\ò¯.#ϽZMü{íÁ7$ÆcÍ(€ÁÿßKµæw”*¤xÐcî‚^8Âô„šÁ‰õÒ¥9­$e€oíÈàã*ßùëèÙK'|¼ë·ÐÚãü`T0L˜b`‚TÚ>¥·íè¾®µ\DêÌ=ÉUyNU)¯ÒQÕ释!ŽÌÌ~†›²Í3 ¤Ž™ñëÌdu£H“dˆ‹y+õ]ôHâŸúlyÅ7•iKq@?Y_så£Þ@^ºŠD·°f=@K±lM>ÍGÎà,á'‚Jט6ËèW=hkf1ENm¹T¢ÎÅjšÄ-_$ø‘ –q½ú|(ÆíjH<ýÍ šc i¯ÒÄ(õTqFÒÜ5X{öÖr‹ßRŽ\sW(ç½Uu‚d‚ÿ$´xp‡XÈòbg‘X#Á„^ÆÆ«½(?19u êþÖsí_ú/Ñ¿µ |dOv×öùiÜl:[â±Pަú/ÏYêÖgKTYyéô…EñD.8›}üp»¯§…r'5çµC7øeÊöÒ· „w SŽŽÊAš*2W_]uo§÷$¸ÀŠƒQÂ7”à»5eéÚ$ L&é@Zi&V^7«ê¬…ÑWz{ëû»hwL¿Êÿ»_ëê²Ö/ÚäæVé` š\ÑC×_è:ä9ûB­É¨oh‹ÊW~ ©n”úxC7Ñ©øÁ¤à“Â\]QäÿØiqîCÛ2öfRÊÖŒöm@ÎÞÆ‰òCur³æ +íÿàØ±£@úýò9ª}š ZŸ›Æ=Äh”i’Í  ‡\(ðöZ(%«.YV~næ¾¾‚žÞ–†Ã5”#»>áVÁ!$ò™žÎ{cgÜv uG½ÕŽ–Òã´­ÆÕko¬ºé»yËA5xX0ÄÜßÐûƒ¿…¾V‚[t)wL“±/6Dö#M5”jwq|j|zBJ^*d‚¸LÛyÌ̆:¥\éÉ×îc6Æwúþö?¾¬¥ÆJŒß7òý·øÁ¥ÁIB‰)W Ù¤¤FïtuÚN $vÆÜóõ™ç׈øø[]ãÐM&µ†Ú²l‰8ÈøÌþ³wí½íÜñ¶#`ƒ“àÙAFþ@ܵ¥ÿ …Î6›ã•λMÇMäTrîÎè{36/25&6Sì~Á¯¸×ƒ£>ÙªÌAF¤W™ Ô“…n„fs›pó]¾—Ó²b;60'.7‹ vÍ`gF0KÍÆRa©³:Ê‚GÂðŸ¹GGßù¹š•Ðm8¿µCt2í÷ÒV³ÂXp8¬•5ÿØ-(­i¼aúFž²6³·ŒSËÊM³Õ3&µ H¬žAP«ôŒÆd 6pjE‹$°çtQ™µ±¤ŒŽ«j3×?÷«]tÞö”‘6*ÂÇ–øÐ«aÁE¤oã#*¶£ €¢ú“»6<ÆÑ3¹å³N,û—ŸÃJß…uµz¸¥ÏÞèê¦m>azæ—È¿8íî%H§#ÑILsï *€ž½ZããeÞD×nòQÖÖ[ÿ­­¯ œGl•:û܃¸DuP.MÓê2AIJ=ªJ¿ßÛÚäßû¤„{0MKåq¼ðè}‡>+X>Ê/^Ϩå1"ebñÎ0€„-òvÚ-MàëÚœœ‚I9½ àÄù\35žJע˘wS>⣳èªÍ ©hÆ·hò'«/>BsÝ¿F±_¤µµC§¹“¡{œ ŽŸ6—‡£?Oà¸dÇqŸ¼-ø¸ûÀúõ¼øXÚ`ܽc>Î;QŒ.’ûÚ·¾àÌP§ýO}Í)Ê“1”I òKÚ°þÿ…#¹™Ü¬§7¾}²ÿ¨ÝN§s*3ö¿öˆ”Yî§Ó²L]‘“/‘¥ïï–ßüîÆåa¥@›„š1‹7¹™¹Yz¬ …WtÑu˜}X[Ï铞Qÿœ¾ÃcsÆ&°ÙÆþ Œ ˜›5ú‘±È„Sƒ¨ÈY\Ùh«·›)œÄlþShÚW úÃ3ÊÚÄä41FpW^5ÆðM:àW{>æµèŽ=øôø”üðõw¸HгüNÛ k¬£»~Ä+¨6‚áÊ-ÉrMšVBkÅêdl2¯^”œú°é{'T!‡Çj-ß*N=d:hl²Ÿ´4Ó`¶v‚.ímOð’/– g ÞF•Ž{‰“ÙÍMxV$/|Oè¹ ÜîP¿ŒžºÎCÓ†Oðѵ¾°Já–dÉŹØÔ|µÞzŠ‹µ 5¹Pjrcw^뿬_Ö‚Mx)¶ÖÖ{:¼Çé³h‘³Ç6¯hè@CÒÓ¸9úŸxFKýì5 UfédÚ ÿ³4ðÐö (ñ<„ÁsñXì MNŒÑJ •°>ùêëP€•j732"×¼·#‰®ÎñêßÍ/5ô;˜Ã o$ó_}|þâåÝß¹Ì ¶ZŠu„ã‡è•ŒIn ¶rI&#£ÁlÁÓ•Ù²¥.ªÿ\ÃÞþôaEïGah:zpx_ÿ¶ Zc^Q-µ¥;wzàùÙðíOQpaE 3¢ª&mwh#°¯m¼`'ö{£ÍŠÇlXžn÷êVÔÄå¡t¬ ¥ã±y¢¤¢„jB«Í.`…t‰5aûa@/á¢gà}jLJËúÔ š[S‹²MàƒV¢}(üv©“5ªE *çžôQ8n€c0È „èårß¾b ä¬ûŽŠ… Ìf9®Ê7¯—÷ßásWnþÁþ;öÕoÊa•'<ýà„ª¹¼/»³³¶¾¥’ªj+{¬?±Å&iÌ ŠÝÍ5`v¶ÓÖ*°€n,ªÞåTøü=}=‡‚œJ–IÓk$P8ºüþª–ziÓî »·ìJ¢bWåk 4d$*QùFf4ñîœ?Êo{áÝ£D²Œ‡½BÑ–¶Ô£m>£‡ò¶z.câæÔ´ Ãªh4ÕEÛeëÓ~j‘#½ãyuDÒ¯ >tO2®Aÿ÷$ÛRâR(Ý•þ°¶g¤lû#w&¥vŸ2»ºÐ¶:k­ÚZãê<&Ý í4^ž—Ы¹J\ <`‰”Ž¢{×,Ø]7W£%_óPØw|[.”½˜°~×¾bŒ!fªÁ¢³V¢É(M¬Ñµ&§gŠ3ÄÕª*¹‡eCk!´îßø(匰)Ç)gdfäVÈjZêZC7y—Ü>TŽóö¤P„Í|›þJ„užÚÊÚÊwO¼ __E¿·›ý ·{Í2qûpšÒ^­jV´L‰ž²²…x7âTnB´ÔXQùÎûh#šÒßwàóBüRjçš—vfrO<›‚ç5‰uÀ†£¹ÛB9[*šš ê¥üi£¬H$èCËw£¶Â@Ëã×ÅÀAHufÛöº2mY˜×E 1ým¸eÉÐ)|ˆ¸ŽèÀEÜL>Þßo4|î»öv=v´è;¡LƒÔ^ºA€iµ¨@9ï&:eÇæÜ$›v´]§OÀ¶.תÞÑE+6}Œ@Sþ&·+ϯl¢¯ëÔWðy5þüBŽœýè¢ òú®¾Žã>eà^,:Ê®`ñ*ç B Œ¨…: hpìJúÔóö'`3,Ú?úWÉIï’ÔÄjeNuwPh1ZõòZ ÿ‘xKn’‘Ôä°ç}“ b2DÜQñ_¹F³endstream endobj 112 0 obj << /Filter /FlateDecode /Length 5708 >> stream xœµ<ÛnÉqïÌO~Ña Žû~I‡ â Œ5,ÓOÞUÕ=3Õ·9G–ŒVÃ3=ÝÕÕu¿ô_OÅ$Oþ—ÿ½º?§?ŸüõDÒ¯§ùŸ«ûÓ¿8ùí»x*å­U§·'é ?™I sê­œ\ §÷'Ù=Ÿ‹ÉÇh¢Ù=ž!&WüøËÙ¹ÜÝœë'%âîêL¹)Ó›Kê„ÐÁíð‡ŸÙ7ø¬„0ú:M.¤ÅÇòCZ/aá%ÿ}:;wÖÁ7rwqhHD(' ŒX`V·ûŸ”4_/ßßásŒÁ ¹¬/ìî#®ÿ‰­Iߨ´1»÷ørÏ>䛸ǗOi&‹awøê‚!£Ò+ÆT±»gy¹üRYëwoab¦B9ÿþ @ÑL3.8Þa?*LNÂâøèá÷èV àôÿ{ñ?'Z«)DÄqq ¤pOwk”Ô8;у0 ™<1ÌÀQx8 kæ£pçJpºlå|†åˆÔH ¥dÊÄÍÃRNô3þ,c”´·sYS°àb6kÓÙftIé tÐùiOë3‚/ãdT§¿?¹øç¿ìþ›s»Î€#ûNê‚9Õ¤<æ3xb{}aÏïÉD[Œ¹©q“žÓJ…0ðÎèy»LGÖBæ'ù‚¯>æÿ©’¡8Óð#­}AÓ[\Á®¨¯( ­î[†äó]±ç›„Ø ‚oÏçáLÁRžžÓÔ>Ä‚‘–ýêšžñgà‘š¢Ý¤£²L¸,0onçzÀäµ|K§d,?&¥ãäE˜Ïéòöù†cbP¡s¬Àç>9IÒìw:ûYV§Ûá~TÂ[A BŒ×IR>Õ§“Ÿù|ÓòMbu%a;ÈêÈ5>þŸgAᘆÞTtÀ±á(ö$pð 'Oà1ße‘Nb_i’ÈÈŸf‘¤|ð€Ãb0]¼¤Üî {÷ß½fp"%m¤™2ãg8íß4¸ââŠÑ>ÿyL($|Ø“Bd Ÿ ´“:Š«8Æ Í÷ nózD-×8§‡]ùJ[å!¹G:G‚$‹šá³ÿSHéøA?–TòÐ!D„@ ½:ú[Ú1‡{d]YK²‚n3èIE9™9”B&¢@Ê t9²V*_ãŸA‡+íÚ3É¿Pò}f]­º²=2²¤8F¹ü’@ó Ú±1™Ã¸ØÂíÙn2LÙ@À6T2²Ke•ÈíꔟÎJ–Â}F0]:ÌZ Tó×*Å"ɃFÏ_A`8­k—‰¶•šŒ3mßÏ£¤ïS‰À›;âÐý*gš $Y ˜BÒ&€J£ê¡&šûE®¡¼÷Åj·ég$éžñ”>‘Œ3Í6„˜?¬‘ë£ ¼ñ`ê¯ÿ%Ëo®ÃiMЗ%R–!üù‘X<„RÞ/“˜BÚ¾° I#ò½+Vhé„0Ö³y*£Çy µžCthƒn­ŸÕÎ+ƾ•E[-ÈäqÅÞ™¡ù¿OŸÆjÚÇô³“º¨¢ðe–Uù¾Î6­^+å}¸±ÛÒsÈÛ(Åò–¥Ïéñ{H¨„󮋈ÓZ%5)îÄÐéeåÌ>¤/ÀÃH´³äóÿhÎ ¹&ÓÖÑ‚­C !º–¸( Y¬ü¦V¡µÞ5R“>åÛà—QFoW™THúü˜îþ”µ',%íY––ËÃúXoãn!šòC!ÃȉÉá¬dEu«z¢l侟ÏP—ÒçC}üü9ôGöû¿±ç öüŽÿ3ûýwësÇ'´`³ ]ú„kˆO{ ,ÐDoÐÖµ¯ C;ñ«ùpG»º(¬Çð_et6Ê~Älѯ!qüƇÄûðèàxùÆGàÎOWdr°®q^Ed“å?øêB© Ë ßÒ0$ÈŽ3~·ìÓ:Ó&ε«Ûp“c~Ÿ\ü¯"f²Lð·’è1(Š—‰Üzf0ËýÓ–¤ì(ZX5é¦Èþ©Œ°‘õµš¥j˜•²‘”TO'p%Ë.qNL›û踸8¹î%2+ sD£Ú8Éb„[é¤WøÒäñ ŸÒfC ðrXÆ£êFºe¾Hæ÷lP,#aÔ*M‘ï°×/WúÕØ||8‹Ö3àÍóYGˆiD X£#®Ù/Ð>.ÞüçtJ4~b'îì€åt¨ä÷jw¨wdŒ’ |²†zf#`–Lµ&}PÙÏô”Oð”ÇÉÚ3¬ÜoꉡÛ=QN׫‘9$êdûtDÒ$ÇŠ©e݆a2M!¤úÁt7™Å‚ø²`'«—ÁƒˆDwL£ùùÃ×ÍUÀ2²J/dÿ¯„±ƒ~!b5TVumÑÉ G¼ £t'Ò©lXÀó—XæSõĉ¬B½¿»8ùãIÊL~'+¥=OË É“•V¢•bO-˜oNÛ”¬Ô¸œ†õ?äé¿2 jüAÁÌàG—fæ0ÉÐáh¬”Aê¹Öá* 3]%NhÏ*<‡ãj9“g“g•ž›ãôø™í¸ð:ˆ‡l1ç¤Lãr„!n¸À´ôƘ ô}·‹0 ›`!‡ÖÊŸ%“[j…;À·gßp;¢ã5}裬֋¹ã‰ò¹]Æ +.Žr¬Ú¥¨ÈìhÚ¾,åQ,ʘaŽYö4©n~(˜4ÈZ(­Tj¡äšÃ z¨xÈm=“ì_㞥 0ø;|DóW¶¹ÒY…âX¤‡æ(FæwN_Ó÷àwð>ŬíðÓÛ’êŽ0ÒκôO =hÖ™nIøí3žG1Þ²S´²´žæðbkÇé|,ºeo-.H¦<¸Ê05Ž389Žn|$EW@È-Ðà‰ÿP2 bdT/m¨ HI½õWÑ8~pÊ%c¶_RBø}‹Ì ÈÚ~ÇÌ8ƒ ¶V‚Ý"Š&ß5¢Æ»’thXJŠ‘qóž}ÊÇT¡öf°¿×>&É’54¦—œô˜…‘/©þã3*àU7tfÿ™NFª*L˜0ÑËPU‡"7YøZØÉKÇL.|ïÆ¹?–ê8j^Ò~.%{ºqp—êq*¿|‘Ìe„|¨x 3aÞR™aÙt@³Ú†~2þm—U(G…Sm9Lö¡É9Ý éý É ýO«¢>@oT°–se‘ s/Ÿ¤ú¢s¡I6çvEÍ(²<*-™fÝ ˜ÖŸž+8‘ 2af)JŠ<ñà3¬a•^-qbKU]¾)¥B; H°,¥²d ÚÖUå6šÆàÕ#=ij+$⨒S’“®—!"oרd2r–¿.±ŠS¨A…Gz§¿{H ç1U´‘y(· ê@¼w®k‰WÔTebˆ6ÐÁýÀ„S©ÈHª0ñ*Ï~ ~ñé3Q¡¿«d@?z,1®RœWõòÄl½›’ÀKοÍãY@ ø–Õ’õ¼WðÁ€]fDÎæj‡˜¼/wÆá¬×ÍðÜn® ¬ì„l]žP:°<›:É¡¶<®x¾aVØõ&Xd¥\éêëÀº`åzp2{?áûuð-} `;"âõVxØ[Ãs Ýuh³ŒÜZî@Û˜&ㄇÀƒúza ¬‘ÞY~»´2‘ë1\2Xvt^ƒóåXUŒÞ×Ï6:]%·øºÛq,§èí¡-žƒÆ"à*Q°¹Õ5†$¶5ÈW†Ç,ƒ–ý+9XXl„Uñfû´¿JæV`ý:X~ÄosïbáhÍÛ9™ááZmðô•ç§¡ '½ë¯!×#í5Iðy ÇBëK mr'Z2K‚-pð½ÐÒú±®NÑžÊ8ªš‡ä›ht8u]ŽVf&­™¼_Žÿ<Ö ó:>‹.Á «:1 ¾©‹•æºxV!S!JSQn)óÚmLáî§4£ª_Û‚`tÊ<ÿ©Ž&-éi)$[¡PS¨“‡¨°8f6‹…çe„ÝLmãeiæÜ~v*dEßæ¿C·Æ„,~ƒ±üXØZ«'OèÔ¾[áFí 1°†ˆ´ðR=žMÿ¢†¼ äµK7ï•Ók]]< ïdð­÷Å=Ižãnüîwby¶3”7ÎuàTw:wH½¦õBY~Ñ“hŠ“4ÔGg—+›8<Pÿ%>'˜0*Ì£#_æUj^2:Að”U]Wàv@Æ=™¨ l^öô+—q#ëz[rk€ (†™yel˜²> ?œð’¡Šò6BÜz[= É„SŸÇ1ÏlæÆÎì6Ê)î¹Ø+X@ù0Y_û±+6Ñ´L²æ°W§6r-û˵‘[±-ÁIuœ(‹b·ÍbÅ­|Ècâs=B„ó7Aý~sëè.Ö×ë\ß<‹m½þU"Åê1|'§¼°¸FÖ·Ö^û?°ÏÚÛÁŠ+ Í­R‰.Àú Vç„t°s½-iì$|ä†qõÆ ÂÚE²"×µôuÕK¯¥0+kĦ•å@ñ6ý^f½ûk¾b«/™LK~T9ȬLSް–­ФÐûÝ Én1ßOÏÖÄ?¤« Ù@á+kÓ°ëÀj¸ª~œ&K* «s©§i(9­ÒÅM_y” låÞ1Á˜m%Œñ›¤TëêŽÜXÁ#©Øæ#*Î;ŸSĪþ&2ŠjtÄçQ ¯˜›'sí ÍÜ:îð”©"feáÛ’…¨'mùÔ>¥6º†· ”ÙÚ(*Üè&Ê%†èY†ýœV¯ŠOô¥\&uX‚"–|«ð¸l¦´ºy*¦1ÕÙLŸk6Š&pY¹ã¼¨´i6éŒåU HÔë¶ä üË@wJ­¦¼=©KêÜ hb9kçª?O/ŠA¹ëp(Ðè&)p=8¹<á–ËweÛlÆï7÷âГòpWSƒV꣰øÏL?þ~û‡M¸H.ªƒpU‚߸ {À3¸%á-e™]Q<Âq­cøu@]}*=Må’ÀQ€W–2Ü>¤Q2ï5x»%™é‘ÿ¨Õ07e– ª#×ê²Åëëž pµuªˆ»thà©.m®# î§pÅüÇÙ6•SWô±uÇ\ˆÔ¼~\H. R’uè #"tb#TÈõR»: Ü­]t}iZ© =¨f™›Fõ› ±_ OØ"HŒ_á¦Í¥).RŒ“7*ÓÎËœü:V­öûœ‹2‰†³­#ýÔ¨ôqŽÎé¨zú×_sn¢/3rbèÆGc À\×gÀwUÝéß[ÕN—)% ]EhñJÅæû‘-ðÃ&;€2ve‡ÚWˆ©”÷©&Ñš€22š|èzž£–Fl¨Ãþžº±6öüÆÙ–ê֗쌆cÅø¤m¬ÖõXw“Z] ›…;‡ÕO¹ PĆ8gßFù "JD7ü²"Z&Qjºú‰Cq$ø‡ú‹Ž¡jÌÁ‰e(©æÓù:€Õµª›æ}-£¨r”ÖG‘‡ÅWÔÁ–> ¥P·]7¤Þâ'æEGuÜ>j—]ÉÓä’°‘Û¤ÛAO—^I£î§¼°ô›ml¾Þ—wï+wªªìÇ…‚h4~©¤jÙµ@^K–yKåh©'k¾MçtÂuŽŽkGã’¤¦•]XMØö‡ù`ßÐ~î9Y‰ãþ½,Û7Í•‡³|ãbø* Û9MÐ)æUK'­k:ìfô’ª¿@_•EáÜc– ,æ1ÿäŒr(“éœÑ†7‡Hw ëúé¿›ùÚnø„ã<ñ5Ý<½p©ã~-m[ÞYA1µòLð1¸ ÛJðQOÒMZE6çƒÐU•ÀÓ›KœŠûwò¸xŒi¥”Â(è¶²øõøÊ§—ÎÜ5$|µûóSR<›Ke'Ù56aI·¦(Ž)Àåa _JRë~˂ۘ6¨ÕÜò3°…UYY¦4I³ûÅ\ܳsãÉ÷ Êì÷cbo7W,îýºJ]F@Nó¬QÿƒüæÔeâ ¬ß]M>¤øPºE‘ämŠßmVy…<P*ƒõÖá£>fP©áôó‰8ý¯“`±gKžzpñ—ûå0[d—_ö'·SûSðx=Ú¬é]Tü¯`ÁâÙµÚ “gº§ r¤{&ã–Öi,dSzn¦ÝGØqH)/ñB‘Ýå>cÍHÚ¬j1¹mFÒI qH(+W€I°þœÀP’ªÜÞÌ}»ýýt{÷|vñ5´4]¨îÑͰ¥_)ø¨³ÕP±ø9ÓN¿?¬ãß$ª!ñ7î#Ð © *˜rÌÇbùöŒi6{cî‰á.·æáí4|øá%ÉÞ¶_Kló&2„æàí¼’)fÿ†¿e³¿¦!~öTò‡Ô˜nrð da\1à.nÙ‘^¥19þ&žUjA4ñÒ‰ª•x™1ª`ú„Ò<ˆ@}¡/ĺe£?å [Œæûï`”¾-Qš®¦Ò“6eùvÚß!Øs£ã$-¦?Il“aµûøéæúîªG¹XÒÈeò«­p.ÐÉ‘d¿=Ñbæ/”bÆLxµH‰Gü&Û½°b̳£hð:´È…;Ù÷¹!2áçòÃY–®lF†œ*‚Ÿ‡pººbGÂÖ¾cùøÀXò)ªa“+{vûŘöÒ"°t<ÛècîàWžÃηÄɃ£ÍHú.¤>CÞÅÅ >`¨Ëë„_›î¶BFR¦8ë~ú鬇âsv±wÓõÍíå˾K… Ùþf˜³Ÿü|šóL»[…Î-m,’ì›Ç'_$ØÉøÌ1f½_ª‡ÿ'FÂWµ(òØðª Z{ŸÃW¶¥~­);qÇ8ë¡ÿ3#R> ÖHk¼Æ¢2žÃ8KÐv¾¾ö»ÉS`¸`æeMý!]K¬Dâ)œÆÔÇÙ¥!­´Ð´éåѪР©0¡‰æáÝ”(Y'<ùd®¯Åendstream endobj 113 0 obj << /Filter /FlateDecode /Length 3857 >> stream xœµ[KsǾ³Rù ¸¸¼pë×îŒ*9$U~(å,±ru ˆ„MJŠùíéž×ö<$m¹\2—»3=3ýüº{øaÖµlÖáþçr{ÖÍ®Ï>œ1ûvæ,·³^œ}ûбZΔœ]¼?sSØL«¶†ÍÅÚÞèÙÅöìM#æ Æ¸jk¾›/ºVc˜i>ãó`Œº¹ÂgÓuŠÍŸ%¼7¦¹»õ¿Àøõ|!ÕrÓ7¯…{Vnþ#X×õÚ4{xÍZÕ¬Övx)uCHÜã£î`3ýÛ‹Á)ÌŒ±Ö(Åñ¢oÕ Íìâ§³‹oÞ48˜w0Ú47p„fƒÿ°ÿ6óß×äyi7ëÁæŽþŒÒH7}/ú®ºovHJ·Fëæ¿È`Jpj¡Ýœ÷-<‰d¿AÞ É뛸‚63•PZ»03$‹=àœe~´ÊNî'ží‘?â6á…rËàÖøäNþ‚3vVŒî;–|ÜâÇ’áÞ}8JØý>H.= áC«ŒÍÊÓwÃÌ@-n9G ¿X6S’7vвy‡¯;Æú–}ˆêÊÇ`‡rðÔ7þ|¬¹vs{Æí ñ‹NÏyU[S;K1¦W*£gbˆÇÀé’3áèS¹´ð¶g[0ÙJÙ3wÄ—9Ï­zÚM(cD¯J½Î¤¢p[‡ ÙO)7¥ºÊ)ÑI÷Ž~-'æ£AÀ½$§ýÕéWjÀÍFÕºsíQ6ñÛ”~Ò¥©ÎÝ’¹ÿõ§f2²wËõÁ0ýë› töp²´*üÛ°eî¤Îú’y~,ºz²[ üSó:Ÿâ]—î4îÑ*?-ïEP~J(seV¡¾»8ûùÌŠÃtìH¼n ,<: :ˆ:⨴ôYï¹K Þ}Ÿ.5Ú„Ú³—í ½I\6^d`œNã/玿(æ âòGy‚ ÒÞ£eŠLUiÀ—§ËÓŒ–àú©ºÉP mÝpÜþ÷sB´ƒqÛ}'e"Yºê*tàýï ûO-¸iÑËÿäv åÀJv" Z€ ߣ§cZ+4gËFåy÷5YÀ’‘ØŒõ¯™mQYÝlaGÈ¡ˆÈø|æ2çit.&ÐèãÍ‚’>N,>F÷Ê­…î`t¯ž†ç+Xá¯s%M*×ä9‹ÃHžw}óæ X¤èKg= -#¸3þE P›$ŸR~‹\+”²ƒ²µã&ga°µWÙI+| “Ɖ$ŒB…OÔ_êBC( 'RIº©ñR ÷¼'3IÅëðl߈»/éùoœå˜©!p{íÝ#Ž‹.ÁRt¼³é„¼÷~yÃrÅÅ×pÍS|Tœ·°¸B„Ýw8ð| à(¾("p°<H#€1I˜`xhš Ï5ìùk1Ò9¬¤%DËÔÒì¸Uà€.±U¡Ÿ±7Œ°~Çð€FŠ.1}&v³ÇNqÚ–ltïµVVšQƒ×©×£Ñ”jQ ï)#èZ„f%8d^¼æ3…Æ0&'1áí)¸™'K+œaÌ[R5:¡“p&Ì=Óv¡‹¹fèo´tZÃEÕ¶p÷ZÈð90ЃE±)dvœ¡/ÎAÕì(M_ŽÚen%5¸lÌ2œ¦ "¬H#ng5˜J<5ò¢ £Íʈ!1öj"ñ,ñ»ÃôàC²NÎ-oOÖÉÓ³A8ðf@¥Ê …úþº+Èœ¾KÜF$/ [|®Ro~ç#KÀûïò`5¥â~߆‹>úÀKž&¢{fUÔ‹pOk- ŠyQÌ™mšžâÓ Az`;L†¨øü~ž‚µ¸Db©éÆ1ù(µԱO•"Z«~Æ»ªN ä#š—Œƒ«`^b|JͧáÊÎRðÄuº 1|&Ç=e¹ÿ°{fõdŠ7&'£PO‰4\r‚ÅN+á| x=EÃô)«B#nØ_ÆêO$Ôàry&„~Ø8,ò2ÝiíµP ¹GË"p¿ËMµŒpŽ­þy“ë+Ť“QÚp+H´lC¡Ä$@SÊë²):Mü•U ª7&Ë87Ùƒº ™aæ,‚D<1Ö€n« ²âß f‰5T7•ÕÆ¿æáÚ8.1$Ô–le•ÌœÓô7c‡òç $©Y‹ |;eIMÁ[1¨š6R¬¶¯kš“¼û“( &°±†‰Y–­œòæÇ=nV2Æ'›uÈL¨$?ºÃô©|o§=³gg¬LávMØÏûÁXõq= $è?Kz,ë ©±&ši­‰º˜,õ·Ú‚Ç.(·_9¯-X{áÒ´\¬ë095¡G,œäb3Õìv ¸®Ãiñ7qçiÉUTU½”ès^Ù¶…)â>RåBö´rCÍ7­OPV0 L%FU¨òf"¯šèš`Wý)aTÊ›œÿÔ^­W›ò·¾"^ *<‚!Ä€s¨W È¢Ìû7y‰…:ȧ•¿b@Z¨,Õ¤À~{b™ÒîILòõ0±¿BRt ÈA ®ô…þÀó¢â1UýðGå]}ùpÔk—½ØIÅaã™WëÕ<ÚÌ «ÂÆÞQR·NìYõ ·Ö,ú),ÃSJ¶œÉ¢Ÿâ &€^ ås_¦\H¡Û~‰›HõÀ£ˆ´¶ÌëqÞÎ 0‘q'ro¼ÞÐl5iÊPJ˜lÈ ã ´z¤ )U"®*e.‰ÕÚßá™ÝÔJ?´Ò‡µ„+NÔŽ¹MÃÕI@'LôCø­¶Š(ìwqëVƒ4¿,úÝåÅBªù>§3¼•}N™CüqÇX‰ÁoX-qI7x©¢oçu­æ&¦€6}ÿà1 Ét¢Cjä¶*&Ý4-QNY \ñ6$¦m(@†'tR}u‚94 ÎÉä’ýTé™_¹ÇžMâ$ç¨22v8Ò'•×¶ë:‘P™Ò³“RŽ'Êøç¯;ôý$æ TïòÌxlõceèSu¤EHf\8®«~:[Þ†2Á[-¢ÕÔn¸‹=² ç+Ï~ÎBJðèÞ-Û.¬½¢£>òÏlîoú¸[9%Y¸–ð@næˆ^:¨€·x$Îåƒ× f/ Òw^ú‡ …¾³BƒE°qï•F Ÿ’û™KJ1ëô·~tÏY2dç7ÀÐÑ…kG\ZPâÖ y•ï÷Þ!ÔY£ýr#„¢äÿ`À W¦$V ˜‹ßÏ5GÇ#¢ÚE¨éÅʘ"½YÚ¿ò>éz²ƒífþ”»Ù*=-;ٰ؋e±îÈRk¥J»Ùv–µ¯{ªKµe¡l=ûä9ùê‡3­0‘@æô)›ÙRfxê†øæöìõó¡ç AÊó7•ýü>‘rŽÝa•’ÿ"Š ÔWR~ Ù|õÔ“`‰¨×VlWî{B—`±Ôd,¢·ä@mRÇdËò}ZPÌb¡‘†ðǬÑ;·U4á¬Í€¯x½?ÒKì]Ãý•§¦Åí½Ód]á &Ó„=²V–g8“ À·ÉÊrÔÔŠÎ=K‹Î6,TîÊùœ%q«à#*e´±#(laÈEmT'ƒ©«&'‹‘š.Ë1—±5>Î'O–à†îKq•#½Îxª™‘_t1üäE­M®qS`ÿ~\¦ÐÌ©ö±ÇW.…¨$jA»À\.=ŽY¥y•º2©³Å’Œ¿älΗoÇϘª^û»˜9Z—ªÜ!’;UÅ[dn/-´yF#­Ãë4±¤çªHKKuú_+ÊjÑêv+«Õÿ±¢O;ίպ€%T¼ÉðX÷ÖòeȽ¾îØDžñìâ—¸8ߟ‡JÏô“ˆšúð,M²çê,@ÃÇ>Ü"fRçÞ$ÒÇfm/Àu«§9œõÐYË+Ò›*Qá‹Ôy®Ý~•¶­aw•L$‡&-îpC7mD­´ë‚Œe‚×jÏu·Cî.ñî”[—ÌØÞvõ"Ã[<&ã©»w‡ÌŸ:ÝS—žžÖ¹£Å-°‰{ø Ò¦K)ªe»vÙÙÙæþ{JažÓGrçä%èžüuÜδC_u™ú€èm'yúãèºOdÕN>œüB…ïﲺF‘ÇßÂüD¾mraÞÄpáÏ™ê|VOžjßo15b»†]ª}Æw»·(c§–p´Whñš[µ|íš(²Ê?{4­ñž(æ9Ø1H\Öõ¼¬¯Á!êÉñšÄ˜€ÒFðÁáW]»¡àù‘Ý+úÆÞ;D„ìûKW¶c„:䮥PŽèÝ´}ÉÉ ¥û;z»y…Užâ†uÅ ¶!sÏ*Ìdëòã)ÎÑ-¦YÒ4zÂÅÚQ›\}ÑD¼ºG"犎ïDY7 1ðk¿‡ )r÷]l’µ…*RÖv.ÂovÁD«¤Öûœ(§µfJð¾áE¬q™8$Ù†Ù=ÇGÀ­Ê^j„5šÕÕñê²9ÖëûËùüâ—3Ü€ †ó~sd Û\Ú®Üßþìüv³ÛîW—Íö·ÛõÿÚóq’û;>*›€‡Upköœ†‡…îëÕfy¼´+žSvëOœ{AÈá‡öýáj»¾l~ØŽ7ÕEY¶ñúÇõæúæè?BFDZFw—s¿· Ú.J¶½‰ìFGBþ0,¿RWÜß9%_üîpØìÆšÍnäøúãÕíe³þ|w ¼^ï>nçãÖ»åíyÏÿb|Ü¿ûe½$§¿<8é]Â*²Ùí#»Þïv«Ó,Á½–ÓµùÓzhgûp¸9òÓª¶|·ÙÁ—»ãú°\ß…}BAť͜¾½9g/øÛËùy¦‡oÎÅ[/ï\ù0¡ÿ6=Ws\TUD¾ˆö7~Krþ—z6VOuÜ*ýÇ'TŒž*æ åþ¸Ê›¯¾ùjÔÀå~ýþÒ+nÔjP]¢Õ‡õ‡‡Ía}Ottú°Y~»ÜoïnןGjÛ«ãaóùÛ@ÌoÂV¯®×0cw¼okB„¾…¬\3  ¡½ý«‘ ±úóÙÿyÑ%endstream endobj 114 0 obj << /Filter /FlateDecode /Length 5294 >> stream xœÕ]Yo%Çu~'ô#.òâË@l×¾èÍâ AlÄ2?Hz˜!5£ñp‰Ñóò³sNm}jëÛŽ¤fßêZNå;K•~>°…þ“þ{u{ÆoÏ~>ãáí!ýçêöðo—g¿ÿÖ8_¼Öâpùæ,~ÁN/Lz~°š/Æ»ÃåíÙwÇ¿ž_ðã;ü×myºÁ½:¿`‹aL:süåüB2»8¦ŽøÚz¯¼:þˆÏ‚1.üñ<Ó6ñSÁLÕä'âž ñ± |¿ðN_Ÿ_·ÀÇ’ÌÁç*N”Nw†ñØ.Ž÷޼¾ƒo~¸ü/ —mŒZ¤0@ŸËk Æ‡zÑåùÇv´ô†ÐÞI¥ŽWäý#y^ÈóMûmz¾#Ï·äù¾7ŽWRm²3 Væ…À Jx ¢?þ!{X“cLs} »h§É9î@!×U»›é›weÛÒ¢ïâ¶@ÃãϤÝÇv‹n s=ž ˜ª7êø)qU=\š–·2N+o(w-Œ)h–æc$aàôºf&ÝOç¡5ÿˆÄ½š-JËÃW‹RÊGªR†¿k»kþ¥%5¬µ–ˆŸZÚ<ÆvŽñ¾]èCÁy³ë¿ ~]è;Û:ºk” â袚Òá…ëØÀ{Qõ·N>æuŸ3Åð!ì­wÎUœMGKÍ·|%`!| ŒE&‚Q]™s- »3iCgßé—פƒ›sä)øÂ­ÈÒV&ꢔ2Î óšèÕç(Á%‘ªuÆ5o} ”³í6‘ýÑÕþÐvï#¹„£ó|žùÜð¸JÉW‘o`h]¨†=¾VõÔßàk¤ÐE|‡vNo5:¹SI4Æû¨1¢?ó¨¨gÚ9U ˇv#ß’çF©Š«¬~„ƒêV{¤¤SòøÔn-í¹Ûü‡HÁ;û„ƒÀ†B†¿qXi7¹­æ~Œý;PÈ×e2IìöÀNMáu`i*ÈÚÌÒ÷yÕf8¡Ì»#› &ÛH©rO3;ú0±…Ô¾~œlØÍ¸Ÿ]Ô0±.k$=‘ð¶b­5S>ˆBäaw¤k„¨–N)ãûÎfܵü‚ ´ ûUû[¶pµ®X’>%{‰¯ÁþpÐŽyØjËíw´g|ÀßÖŸmD1&s+lÁmÀ„iD³¹kÁC‡,¾ª\MT\£—…›Nè1ŽlA)S±¡¦3ߤʠx|%â ÄPöâÃýf>›Ù¢›Ÿ„ÞîZk°wM¤  ¡å8J¾‚­<¡ïØä.ÍŒ‹lûÿã»ÂÇÉú!Ï×¢CAëïÄÁ0”iD>P Ïq.PªtÝó÷çdWT{üO‚« ÌmL2™ÌYÈæ¡}NvÔoºßVc7&"lD ³À·­Í~<Çq¸ßçÿŽba>NEÐóÕ²VwO—r¯£¿#¨}+dò*DÃ$ácï·¢Y¸t¾ºí"1ÅÆ"ú&úÊ%bü=ª::v_f‡ò\"@ÜTý,ºùz<Úa4 V¹ÅšÖ0å¢G•í¦‹ &æ¥Áß`¤²fx‰@K¿+Úñ”“_D ¸&B×=›mÀ‰pÚ.@‰É$Í%YùºU&Èß CßëCB^èß’8¯ÞÛØ™ád'ÛŽ|6» SÐvOs&¦\š™üïI»¦dp&;‹P·»%;_Âþ!*1ûof…v+™h§žéí›`åÇÔ,3›i³f}¢•7œ‰5åÈ"a{Y˜+U,øêš;AùônÌèŽ-­ ÒyüßóË¿wÍˤϳuS!ÄrÂTLÄ—Y?«·&0jdì4Ç—f³ vï›Øn%bBl¡ý—Ã~¹ë ì‡C:ØÉöËd{_³&o-F!o2obÿ< Jö^¥­ðb`„ÀÀ Æ ùqÁ.˜ªÙ‚â6Цf¾s\Δ÷Fkj ùŽÉNÿ“#G“¡mœÀ)Ô¥ÃÿÞº7Cõ&Z *¶1øQÃTýc Ç\C¿\Ö÷CQ̆ր;ÿ Qt±¹Ëö^σ­«m—v‹2®l×,b¶ÔÐqXIò’(Ù› ›6Náéòo‘Ó¹!ú£U牱¬h‰FLTÒ’Ì2«¤zW™Ä›Ú¿ ’<ây³8¬ìg†én Ä”äMZn;:¼Ls1¶”z@R…õ#'€ÞÈ©tOhVG™sÉ©±í‰Nÿ«dÓ°+î:ì ´a°ŸŸênÝsÀj >ãdšlWü [dJæYÆp'LEm6£®'Œø)`ð €v¨¥`‚×R“5µ6¬u™ùVˆ¢• yþŽÍ¥-·kó¡õUdu_j8s¸]³5Ýï |VL§÷kØ7u0©öjH(• ^§À¬Š®jRïÒ)Wç!Œ›à‰ÒÁÊ·Þ†B)qºÅßN$†É´1ÙX˜Ïš‘RyŒÝc ø =‡6¤ ø‡Ÿ §_:Šça]ÿ¨€%©ýèÀ¥ Ì º§+ǸÛå” ÒLÈ5B3¨l$þÉ®j¥TgrªX©,ºÕ›“àŠ]Ð{M{IlEx½'¶šyÞ§fâo¢©fªÔd>¢‹Í€•»Yá%e­Ô9Fì(ÅPJËqUC\èa%öÇÕ©øŠËim{¢~m®ÐëÎ}¸¯u€}AHÖ•`#ŒK~yŸ'3熙B;_—Х׎óÆp"æâ)V¡ÎqÞ_σ×iû?Üðš >dH­)Å.©ùI“w-[Í›LØõU.Òêjæ.JÝȲP>Ä< ßv%r¤µ©FM]ÏŠ.oòz{…rÚjÛ²_?4aÝp‰òpn§^jLm§ñ0¡.mBBC§ÉK@ÕÅ˦xwVÙaâu)¿uuE{º@„´++¾tUY“¶è¹u¢Aù’LÚУ³šPgOÖ‰Jâ ¬!€$„Añlfɨ,SÇ'½ïDÒ kñå$V4²²4nÛ‘VbÕÝÐëH› ÀãiæM1Œr2o¢tÁ¼3„3m±tÓŠl[›v‡Ée&žmÙiÊ~MÙuŠ#£ÑSR0’ÇËÚ¢V˜ˆ‰BÄIö~JêuFÇoÐÑš¡ðÎL¬¬³ŠÎÔ<çFuU†5Ùú”xcÁq˜Âì®,°Éý‡òŸìgÁà¾i©A5תÑç~DV TÖ­kI›g¢¾"õÈM¸Gkš÷£³á½^tžº”Á.Ž<õ–ò¡—<#ÿyÛ Ÿb…æ,^Dw'ùfLhC9iÁs'–òçÌ[,•Юâxê|JÉV7¹_jßåK5á“L• ³µvÈ;çf?¬é3_´ãòúØOnÞŸRJ¹Ïõ@~‹„NzhL"}>ù]Rt1w7¨™ÏÀ¶IÎSŽÞpBêÝ:ªp6‹wlÈžv¹‰›z·¤pÓxEzÍy³èºv‡áÚTän  Ãöˆn* äbá£èA#›QP|ÉRä\ßÌC8q´˜¨Àor¦Ex‡¼›l±³u~oœ:‹*äþ™L÷›@?$bRT’!%±¬k+"±§ïù‡sµJ·û&À[†‡?÷ü&uO¨R ëÀÌ^L…ùLØHílL,Ûâ|„Ýé™­×DK=Ô¼33’“Ì“ô˯@ËkU\‰§ÉPÔY¢õ¡í~—AÉ…A§†jbCw gާ´y$Ô…£=-“÷W“™Ó•v\à61EÍ{<çÊGh~'øÈ¶¯s “%x †O5É‚RëoåF˜¾âÖT0e¹¾ÀU(gFå ¿ö,3¾ªZH×f`Fzä¿®`·:Oa÷oe[‡‰U1þ¬zRl:|/²ÌÈi˜kϵã²4î6[]ë¤ÆÁñ ,]ˆˆ|ä‚€ui$ƒ< Vá;âô;JÆ>ELõLæÎ@ IIåÀ˜GÃ$o ¹¶0C{¢A9kTEaàÁz§¬èakâÍ­£$¡&»màzÃIØ„7g€1N1Õ Éh™gT,Ïz“7Qއš¾.Óä$ö¨.\ƲŽÃ!0Rù~ȪMÆZ9‰™ŸñµŽwq©ÌÂK$}±^•aX©‹úqÝ´Îá¾íôUQ¿ÀŠž±,ø[ÇkÝQŠYòðu¤«JÛ(ã²ôÌ}þ”a¿ÞŒÙ®ñ’AUÃZãþ<½ ²4»©+ÑÌg^8Ú®¡+3ðÓ=žKHS×Ò•€¤8ƒv³ã/¹¿RVX„Ð/ݡ¼6V:ªŠ›ÄC>ÁòªßÎ2³º†tvÒ•€6R¶ä_®>*ígÏõ1O1;é1–Ô¢„=ô²u×. K·’ Í³àxÓÈgË_®•…Î<ÝWÄPýá¡üëŠh§ƒZš‡8ÀÖ- ¨b,[Ú+Ǿ@° G …R¤Ã)³5¡`+W²0_¨‚wZî9;ÔMû¤Î9I üBžV¹ñ±ÖM§ãù±‡´k§·ÕMV—~"B2ÒŠy?'óK!t±hã›ÜùR³2U䛎¨!¢Y}ÎMI5Ý–\KÂä˜]Ï€c>?á•ðŽ»4æLÃ>Ä÷I<4?Îã2fŽŠ†Ç‚Zí*‰'哆d‚ˆÈö™ïÍIúOÚ†£ãÙO˜ó°ÙDü>Dgþô^¥ìÓÕoLæƒ ‘©Œv…Ò¯óÑi]5P§ÈiŒûó»Üö€m³Ëª2•ÏÏˇ5à%öéÊrmÊX÷‘‹+]Iu( RÚ¥ ºòq[Wt!ÅñTWî(›þG­}ºZô…éÕL¿Ä«]Sµ«z™aj*ÐW963ªyU9=´ÉÛvKwM¶ì¶å•ö)7«€)Ÿ_0>P‰'êíé•xÁÎð:†dºÄáCüªÜ Ùú]á·}—á`[tö]jXñJs¾{Ò¾»ÞG±xgNn‘ï ¢¥4âÒlkX‹ÓYI0[«aüÙ±îv®ø•ï°[â…î RsFx%yÜCD(AoK·Ÿî”(ÎE´¥é­ÙËÊ94çµâm üÖC!+/½á¹F7Måô¥‹-|8}S$H‡5*ø£ 5%cÿ»ó—Ýw`[AÊ0P 5ìU­¿>óè¾—‹…«žÀÉÛ®@¾ÝG¼ô†­â3E’ÒtÇ)¸øõ<ž9­XÕV +qž¹¸›ÊJ¥¨÷Ü6œŸö¶†Ú]îL¢Ôñ~Üã¢×–¦IKqL‘Ð|ë<Á×gËž›à[OÎ|¡”/!ÐÏÊðõóyv†OÕÝ2(Ãog!ñòíQjží”¢ÍNÂÑCUÏÈöéEšÕ©;ÏaŒ»szý h'é•:`1ÌJ£xë/¡8Ãzb[uüCLËnèŒta"R9|uÒFÓïò•LMý¬Yum?ɱ:ÇWÌ78rO"ï +FÖSašaÏÑ`øã9¡Å ·:{vòÈâdx[´}ö©þ?·wÜвºrWžÒPu¾mvrff*rÝM¼ƒQïÂ|£ 7Ü¿x³á¾ Eòêœ"€­=²ÁmÈ’î€9ðo|©Ëøç€9°?Â+ÕÝ–ùwƒ^r» /RÍñâ ›“dÓ }êQmàóîö…ÓI”ݾðÔÂÄÿ)A^Çšò2(”K¿8gSDÍ À_ÎþÂï°‡endstream endobj 115 0 obj << /Filter /FlateDecode /Length 4320 >> stream xœÅ[KoǾþ äàa ÷{ºäà6ÀQâ˜H¦Ôî’Z‹Ü¥—d$A~{ªú1Sý˜%ÑØÃÞžîêêz×7¿.XÏ ÿÅÿ¯nNØâêä×îGñ«›ÅŸÏN¾ú'ç ®z©ŒXœ]ž„WøÂêžIǃtý äâìæä§Nž.Y¯œ³Îv=y§KÎ…îu÷7eÎi­x·?]JÞkÎx·Þà’1iTw ãÌf ßdðÀ¤Ý×§Kx‚ùÝ·~²sŽÛî>°4Ý=™í°—Ýn½ ÔX#x·»JëÛì·›0.y÷æÇt-]wGvØ’ù+œ®zç†î† ã©üáÒ©"×ÓœŸÏþ Œu Î{à„ç+¼¢ s‹³ïOÎ~ÿSwvjyo¹òË ÛkdãW0°‚5¸Gʰ•;D*§º·øÛ™|æY&º[üí@&ãú¬÷±òÔ2Æ…‹ì Ïž° †Å-çݸ”Ä¿Mo¸A&ð¸œáð÷ÿ¦ëx ›H·6Û–R½ Sœµ‚8…rá¦Ü³Á2¦¹w·«&¦sto<ápgk…®÷E¹Þ:ëDFÃ> kgº÷§À§Á‰!;ÁL~wŠ‚!5ìÂhÙÙtêbf2]ä©ÙáfÈxÉū̅gLÏJ€ >4x•ž‘Àe¢p vA)á‹AT hæÌ8™pn#kAœ“Fº7DÄÖ¨Wp%6Qð&,ª3ÝðIpm3Z_ÁËNôŒ9|‡Ã܇-“¸">j $Ü<Ë4+Bô™Î9„U§gE“ {"¢)šô¥®ëz– Û]l(e ‰Íhûð ú“¬„ÍdSVpmVçÍhM4˜@¥Ò‰r2WA|…BKâ{5'È'Ü‹dFJ!ßþž8äHk—L “^Í^˜J]Ú–´:xíÀ²ZÕ}·†¯ÂŒ|˜†máQ¾=;ùá$8ÃüÌÌxrZðž3½0 ‹à7‚{äÓQÉò¹rr¼%]X8hÔº·A¿¼–€­yŸÛn ãdÕ;C³4Àù•±¤Za"Š7•ÎËð·Ñ Ò߯+F>ãËp3N)ŠQ”9¡õ‚… FÈ!{«OÎðïÑZØÁ[ °8pwv2Ò(ÜÍøÆ-àŸ·øð¦`†XOöuTOpÀ@Îx¶Uw:„B ƒºmaa ‘»Òèa–#‰!SŸ]xÝÝwtüª4ô•Ä‚–2;|¢ÄJæzЫ…Ѫ×ê%%V‚›pÆå+ƒVN£¥ksÔÇÍš5j3¼ÜÆk™Vºzƒ\2süþ‘HŽwôú »]ìhH>‘ýJk”°œI’ìÔãÖ/rj¿©‡|«1À‘÷I’Õ³â–ñ9Ä`}·HØÀ‰à •5:­\l‰¶×Âê>¢2zÍ}ÄX~È#+\©m0”FãåÒ‰ø›<üy°•ÉSÚÂꎘ¼hÀ’É£šŠk þ’ü@¦Ð¶ŸFžäVH$JWÏZ…“(KïÀ <5D÷Y<­Áß³¶¿ÇW@üŸÆûux¥ø%ªøW£}àD>´æ4R0%zi!‹ý7 Œ­ÙEŠ28V -!¢ð[›„¿¾Ãè°ãÊx‡Q²ÑWsœ#žLípÞÐÈ7á'mÝxmœ|æƒ ×A#Ú"ÅÁy¨]e Ø&¿:ÊĶ´Ë~ d][ü½òY2èiqGÓǰ•-"ýÀ×a.òË£s¨°Óù1Q¶Í-´2!0–½›äx Á‘FnjvT×5YØREï­Õª¥"ò¼!ÏëUÙ¼*P¤颼oªì!˜ Ç NðìmíõQ–ξr’Çr?Xy°vNû½|(6*Ñu<=øþ¹:I™öF³ýeª `Ìv¡yÈÌXJ࣠‡¼æmÚÖ¦óù:•ÂüÜšL©Òtd pu¥äBÏ™{º™™Š9±CSÌé®Tþ€±¸ ™ Frð•¢c¡eŠìÐC¼oŸå­cxvÔ[1o{k.ŒHµ(*J¢–Upñ*( œWßœ¤ñbÿÒúHÖuírN¼)ý‘fž›§»D®§/d%nžK›±1fBɬ¿K\žôUaç™9n_xP×åyzO†ø^%à„=ò¬btí¹÷Tí+»íZ!½0Ÿ^ŸNZDNð:qPz”9!ðq±D;0H$ »Þ¾9\Ï»ÛëýýÍV8ûådTÚïOºõÅýÅywØlîàÇ/OТ8›J—Û{Èé´À6‚îþ¸ŒÏνÝÝì×çÝ¿ö×7›ÿõ¯¦i¸äŸÒŠK'À<úw8AûrÞåþpóp}‘À ïî7‡Ë‹U0¢ÑÇ "Ýž\ޏ0ºX˜ÿŸ÷~xw—þ»{—hcóáv³ºß¬ý.ÕAÅñƒúýôŠ-~~5íGåÏHXÈî¥îëǴ”mÓËIuPñ¢- Ó2I‰.íä´E(¢ïgÚÚÜ`“BTËÖâëz ¾°Ñ툩I†²h°'ó/gæÓ¨’®ù0cîIݯÁ1‡M@1&^T-£ =eû¤3Ô)Ú9-÷)ÔÇ´¦š^ͳ9MÖæ\¹;zz ǰёaaÌ tð©&³¤%S<­…ü’;š…ÅùûÀôsµ4±­ØÔ㕼¨Ìg²gf’¬æ0ç[9mí 5½]é1¢Ö`Ö:ÚRZÙK[ÑöU•4ÅÌcCÔáÙISœßϰ¡ROÊÂøîŒz¶Ô‡õ’P]4jhTôoËæ†þZN õ}UHéI/Öí›Îô…Ž÷D´/Kö7æS Ûe‰Ñý GŽ‹‡ÃÖÆ‡S?5.róŒÃÊ;އûp”Xˆà‚1˜}¸P™¡F ç­Òê›Äp«ÈošÅŽ"U’_î‘h>%ܺ™p«2ÚÆüš;ß8y]ë& ¼è±LôF°C«ÑêcCa\/ …¦Ùm>y­ÆÌÏòÙ²`nufZ&‡<Ÿü °¢¿¥C¦ã›òJÒ9gˆï;d˜gGô:yOíŽä”ž]_g4rYÌæ,¿’ñÔ‘kVË㵈¹Ê¡ï¨'u×\•âëÚÆâw^EDs¡g\K%é;?ÆÓÚ\qשÐg±L3T5JðFX­ m~Q–PMÛœ2¬@F\ô=Ñ+ΣŽ(w¼'s=6Hoƾ.ˆá ¹‡;·ÒN¼§êC@ÙTÕ™b÷¦&**æ#ZJðŒ5ã†~])4]NÓr‡G4Å/WÀ³*ìÕí‘Jué7“‚LÍöØU÷`£Psòb 7·çÄö’®<1ðM'7eo™dbz& ˆ%ECBeHÃè@Eʾ;EÕfZ ¼žì ûûeÖ«ÁÄŸw?"ÃË4ÝFð§Êÿ[âGvå•Q_CýÅÔëœXû¯sµùz"¸ìʳФLlµÏê¬ˊ[M"í7ä4\L÷}°CÞ´lJᢊá-È`Á0½-=Üxqy]¾æz"”È·6RÊR%¦<Ø$Ë(¤2£ç 9ÔŽ¥1™®hª´KÜŽÖã.)Óe;àxÊâ8¿'Ï»»€&Ç`“Ž_ÆaÁðÞ¨ˆ…WU.aṓ ±Ò„…OÈÿшQ³Ü[GYøXg¥à20^} á&¤×NjGß–Ë=ŒÁ:-ìê¨.g¦â‹ã~ØÔÏ‹‡…Ó¥}ô!˜ ÐD²y¼lÕ9#HÐF…­À:ú-ŠnÌ‘>åHçhÕ=‰dp„Ý"dÈsÏŸ2»ˆ7õhà ÈχšU˜>1»Ãàƒ/g”ùO“­ŒMÈ·Â%kq_º4ÅD¯EY‚¨Ê»ñ*r\´Í*zij<˲áG<{ ¥/„ÖíÇ78À˜ÕÊH©p¬騣˜ÑL—³*†Ÿ PÆñˆÂóäY¦ê/nK—€†GÁ3Á”/AZÿ®75¸Á~MÓRPwLŠå½«  Í|œ”[2†}wicÌq9ùÖº´° šÇ†^ Mp=Ômã&Hl ,ÀLJ›Õ‘ÆàIü ÜŠ²¨ 'ê<üi1ö—ÆóøîD)[z¿Ç˜ÐCH†âÑs©§htJçQ„¹Ï‹0LSY1¡4QÆ¥õeÌç»|Ã= =w8°s8¬ÉŽûynæ“ i}ª²Ñ·ÑÕfQ¤Ä/ÁæåÀø„tÆyˆŸ<†s“þ›‘æY6—¿‡Z“ƒ¤­ƒsPÕä†{W_¦ÀüBo~?ãHa S˜6ÒŽgÕ­$¼,Î¥»v°8jÀñ¬¥©1Ï1õŖ鹈§jë¦{ýM‰$?bc|*àçM ³¸¶Y°{þÕÔ«°úï§¾_ót ÛÑQE]) iJyLÊž'åþtòi)÷553>¶?Ù+Ÿ}›“®Zó|ŽXãÑÞúÜQ‹2v™|€’V†ËÿöpØ<. ÛîJC¹½?ï>Ã#‚ Â$î¿a㯿™†§u8Üý1P§dp¿ê#ÎÕa»¼´ÆëŸƒ@¦„”=ñ)é.‰mwN¼4a_Ã#ü÷³Gï0Šiå'ò;ÄïÐ ¬ùxýUÜS($×Ç@=÷²’íp¬6Ž Ð >OR†¡€XÁG¼í &åZô\ùÊe^ga+ªü¡¥- œØ»+¥tF_~=ôëÍåÅÃ5êKБ ™Ž|õúâõWÙ]NØ!ª+—ûÃf{µ#ȧ‡Ýê~»ßMPÕÅõuzYvçÝÅájú“ŸŸöO«›‹Vÿß³Æ”×ø¾µÏÁ«d‚àþ½ÑJ.)³Ä…¶+ sÈH¸Âã-h¸D¦Õ8¹ªêÏé[¥jµ×¨¾¹¨ ’ðgõLçjÎÑöW=ÓF/õ·ë™Zƒ¡‘…Á“ï,_Æh9´¹VA©¢xEJ> stream xœ•XmoÛ6þî_!¤-F#êÕ–°ÒÍÜOÓ ¨«Ó‹#ÉŽbÿ}GRIGvWh‘¼{î¹çŽ'=Y&–Ãþ?³záX‹§áO­ñGV[¿l·.±b‡nhmŠ…8A¬u€/&V„8òkS/þB¯^-íÀõq»èçñ×5A}Yï**—T• M;õwÝæ´’Û=” zh“Ó\> Qѵ5û ¼½ëJšwe¶UîiÙgÛ¤ëå® û¡íÊ´J–xù÷æ÷!8bmî›·&Øwû&ʶé•Áªü‡*»®l À«|ºFe#M4låvÇ›\+0yÛ$Ý ‚Lw;oÖÊ€i}¦Uû,"q=Ç•‘(X‚ÏŸlY1F– Œq²”ÖècOßÓaÛæ ºn`YYMë¸(%ú8ºàḒ ¬Ñiò½RZi×èÌÈó+Å}ÓŠË¢í4bu–³´ß§R8qˆö=íæ2ýui?rGQv½–ެ­öu£ÒÑ ýQCß_H8+£»A‘ ´šÂD¤—ì:8vIlÙŒf'^[›*ç¤|èܦ=>Ð ´”°_ëtèÊc¸eìú®ã0ÓZT Íhß§ÝIÁxÞÒFéø4Kªçéâ¢Kkª¨ =IåÓQÓ>Â#E<ÂÕ }x°sšµõ®íK–fµbr<9ó#é,ki¡ ëîú¶:PÌœ>M¢#£èµ €ùÞS®XbŽI`?%È&J¦!{|â8˜ó¼ÀíË|?iÕ1ußtíó´´lk™E«.1¥—ÓÇŽÒ^Ó‰(`)‡^'aôåcºóµÝïë¢9©U €¦Ú7oßhE¤Bìî„JðV§‡Mœæêà)ôµ&£ê°Ž^í'ü‡¬=\ÈáYdoµ”mÛÊ-›KïkÈò ‰`vjŸP¿PZ1jÊæ^>¹ŠlÍ͹$fH]úïŽ~$ÊÀ©±ƒ­¬µ]D³s­‹Æ4µVè©Íñ!­ötºzÖg……Å®IêbÏɰ8µºÑŸaXu}Ï€§‚8ßÕàIÞÌj¯Ê~H¸’Š2+i3ôB+èNO-VÜjèâ(ô‰eOåÍ:ž’Ší†Ü®~ZëSš¦°Vsñ_`ôîÛ6T“’õã3Pla5ר¸È !G/âèŸ:`JH=Y®æ» ¢ósÚú˜{¢qÊ£1«Ò^$\©ÐìSòvçVxNXØÓ-4)2_ —›/ú•ŸÓ"ÝWÃKù_¸òWJ[bØà¿‚¿3wD`¿¢/9r€Ê>— ›Qô›¼c“åÍŽõkñȮŕ*Å“VÒ`êu¦ÝÇf<`!Ûb¶ýôE¥^àŒ(ÎÎD(á·]½¯Òkô[4âØõ{·K;(*q 3D+UÀW‰•µUÊ™'´¥ÙÑ÷ݨŽý§Ô×½‚a )Ãq]¬¹7|ûÍÅ®÷í´ ¨2µÜœ&µºI×ŠØ ³ƒž&|y¾?~·ä!#þÐ8%–®T1«k×Ѽ̌·‰ òh?éoÊ ›ïžyrþøx¯%L‰Bke •Ew$nö,ÎÑ$' ŠçÍúÂx*o&S6*Ó„,vZõÚûÔWm>ßiÀ¦ýbì…·Íó±÷¸:âEšÑ+.ŽóñŒ½†hJÖú‹ÎÔ\ ñ| 6‰> stream xœ3±Ð37U0P0U0S01¡C.=C Âɹ\… Æ`AÃˆÍ ÀRNž\úž¾ %E¥©\úá@i.}0éà¬`È¥ï 43–KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææÛÙqyº(¨-xòàƒÃ‡æË‡øýýý¿ü÷ÿ§ÿÏ7èÿ­¿ëoݺu˜;›GGBƒ¡ƒËÕS! „­4 endstream endobj 118 0 obj << /Type /XRef /Length 116 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 119 /ID [<45c54b38a574302420163c51771cb677><3116e8f8821f2121db2f8ec0be045183>] >> stream xœcb&F~0ù‰ $À8JŽ’D‘ÿ/²ÙØ@)GHDrÜ‘2?@$o'ˆäß" DrH)zD ¿‘– ’Ñ D²Ü‘R¿A¤ dŸ6'¬ l² ˆdßÖõžáÌ_ endstream endobj startxref 82221 %%EOF plotmo/inst/doc/plotres-notes.pdf0000644000176200001440000062620315126340260016627 0ustar liggesusers%PDF-1.5 %¿÷¢þ 1 0 obj << /Type /ObjStm /Length 3986 /Filter /FlateDecode /N 73 /First 601 >> stream xœÅ[[sÛF²~?¿oë­SÂÜo[9®Ò%ŽËYGvbÇ[y IHâš"µ$d;çáüöóõÌ@Q%9) Âef==ÓÝ_÷ dÁ UQèÂpQ˜Âj^ØÂ›P¸BÈ  _'l )•,/¤“(…(²P–ã^š;ÔÕ…¶gShçPn $ÑÀK¸)Pd¤ ……± ÄxaèH¼Û;ÜËÂ- © ËÑHjp|!ÁY¶ÀŸãõ]á$Xi§žƒ_ãÑ^àµÌ.hœeáÝ£#Òû—žè)Sxo,˜/‚P®À_õ|´A§B,èTœE'D˜Ñ$ŽiôK°—®¼,4zÇ §-.(kÈ…ûáB(Csô\(‰s\´…è…p$zPÄ’!©rõqf (K‰[” © É /2 ,= 4\ƒÊJ ‚e¥0 ”•á¶° ¬,þ[PVÏ-(kŽÁ@…u@Y+¢Cƒi04ZÚ<.:å@YÇ)Ê:@v4Ò†Ó €2:ü×wßìeU&£z„¡Á4;-Ø«ÑyµÂT‹7oþ¸ª vˆòÙâ¼xú46Ù¿®/Ë⻳êìŒs£8wšskpæ8ûtm+Î%îõ×ÇX´q2ñÚ=Å–Õ¨ž.æG£º*žýCr‰©Å•p¬îqÿ7Îÿö÷\ï~r2zS½+>Oë‹â<.—ÕŠ_T|^,'«â n^.&_#÷j¹˜\+ÐûáÕIñÃÅbU¯ÆËéU9Qrü¡Îëëÿ®ÆuÓÝØÅqf]çnP׺ñfZϪÁlÖÔYŒuI8v’Êm Õ§çkª¹ µ§r‘êÐóXÏ¥òHÛçgwp˜Gðpq=¯É°SHë_E{Ì1:A_ãM'O: Öñ!—é65ô©Ó=Ÿ3…t éô{3Ò k&Ó|¾¨‰‘¦œH]bJO"òKSMŸ^æuŸÞ¼ëp1¯«9HcÒ§Éü²šLG‹/x=±°‹.Hªûj´DÕfÒŸV«Åõr ‰Ág û“•c¹¿®jP`¯Žž¡CÕ—ž>m÷­éÚÁhUÅÖ쇟^¾<:øï×oÞà¥ìûùx1™ÎÏ öv:ߟ¯¦ëϦËU}x1Z’Œï>ªÒ”ĬORf'£\…äM󳎯&DÃGzïÛ餾ˆã¥Ûüè®yÒ\o;Úmx§Uÿùf~ ¥õ]¿öííîsìÖ¯ßo&ãjLóÀÂɰýOçQ|±LàÕójz~B¸9Fâ§yð„í³Cö={ÆNØKö;e¯Ù/ìW6b£Õx:­§³IÅ>°1/f‹9þ_^ŽØ„U,ÒbÕ®G3vÆÎÙƒ»¨ælÊþÍ>²»ds¶`‹yÅ®ØMÏYuV§«el £7]LØ®u5ù0cK¶b«ÙhuÁjV_,«ŠÕŸìš}bŸÙöûßj¹€9£éD}Ü“ðìÙlt¾"Ç'ÌARŽ=‘J©ã$ŠßSé³é¬"’Uý4º¬z³ûÎb:ÞŸŸÃrhÝèKKŽ/§«&zëÉ뺺ü€ =s[sž½Ër×ðæ=ÅzÿúÍÛƒS¼ú´£W6do´ ®z“rèi“ªMŽ?YBÍÕŸŽ*ý$Ú+B¾uOÀɉ\sÈAµS‹æG Ê¨9€=ÂÖž€Ã·>–)C å€ñÁÅçñuéìíéLƒÊa'n3ùÄlóúuר‰`kÎ2„›ç‘Ñ@ó)u‘„ëårzžÄ‘ÎÍ3bÎtMª¿©ªpŠmåL·-å<€zEý=gÇìGö"«ê?Ù+ösTØ7Qe߲ߠ¶؇åhü±ª£ºåë¤p[•x>!­;cgô7eñïSÅÎàD¶iö| ŤÞ7 +47©N¼K—Qû«ËibqU} WÓ/ÛlAßÑXÝ5ôXàhI¼Ö@nZƒ®JnƒŽúsÞ¨? êýï©ü/¯NÞýúôÞutÞñžÎË5!zJ/*=ÙýaªÝŠo+¦ü¦£¹W‚ÄfÝ(¢‹ðÐ%@“R)iŠ,ò€M:¢.À›Xß»dv<ÂS@½p>µâ†x—aƒ …*ÒÅ3"GEJIÑîU~-)²ˆur:KáU4.?!6MPñøšó[¸QÞ¨m£²o£²Žoq¦=ý›î¬t×ÕŠ¢‘»t/)Üíj¶Åá®UÌvTŒ§2á6 S›¶¡ƒULÕÅ"víéÛñþ//ž½JÞß» ÕÓ¼Áà•¦W>òm=Ù<î.Ý^«Kyó-¼W~÷»Úõù-ôÿŒcý¶¯Üˆh[Wmª`òŸä7ÿÙñ™˜‹…ú¬>fZÝxÐì¢;ÖÉb6-oÑë;œê¬Z­’’__~¨–«éù0ø|5»^µœìÃýèvT­3ª&³ØGÕzSË7ôn+ª¦Áëê<=I:0õUT-oT~±œTËG+tHaysƒÖõM¦€½ûí=‚ÿ’«@n@•Š2^óëÙŒª>»F©×%'ß¡E8°¤s%%팑¥èÖFàd:ÿØ0ó»±–ÞœU¥5ú+¼¡š A•Qc,»a¬Ýä/t2p! dHr ‰¥"÷nV"Kò!Y‰Â씕X3œëć¶·°hÌ"B‡‡ð˜Õ"Ë*óc’4MJü˜$›ÞcÀ³ –Ú4&6Q±‰ŠMTlÎY)žÏ"Ÿe>çL—Êy)•sd*ç¸TÓ>çºTâCèLOgz:ÓËóCd±wí.hÝäoï%h™Zçž¼m¾ú‡ÏWu×Häy5ûTÕÓñhï`1›´¡¦{šØN¬MGïNçýèêì?Œ ¤VÂïNêøèàôàYüãndÓÄXwE6R÷ð•НÌð¸¦ýSÐmæ^™tæz¶îÿ¦V+y¹g)Æä”iðE\QsÚX¦œM9…¸&=å±Zàõ#¶–MYûMë÷ä®â"M¾V|}ŸjÒÄታîGl‰ ^«Œ¯è™Í5â.*ûZ ³Šwf*RžâUo픟XÇBÄ´Sz±Ÿd Ht´âó‚Iyçn‹zš Þuµ£‡öD­ã8ɯb q7Ðàj´€†ï ÁeÉý6 !µ+9¸”(H{œyI3@:Sz€„  !Ì)«K­¶1GðÇrÜ‘¢ÔæQ˜ëA4×gN0G«¢·2§˜¡ÅfHr—:„Rz™ÕfGŒ–}wvÝÙsgÇývvÛ×—±ÅC\_F÷^@züþõ”TóCpz>#µ‹ ‹4ÌCÑÑ‹#m7r´¥².0-{Ào ÆÀCv“ d:]¤Ñ5¶¿àЖÆÀô‡[Ì@³$ ¶ipÒ˜0SD‘46k_Ü0³Îut“9¦Ø³­ÝM7^Ž` ca8ÏKO­ëß[C¢6“"jËh_úõx¬gÊÉûýýc2“§î3e3Y3|¦ØþLé.¢Yý ™b¸‰46fJ/UÖ‘ÆÐ™b†¦¢><üíù‹˜êšÓýÌX,îƒÜ¤#K–þ?ÎÏ ÔrRn/穎¦m1ù¬¸É-'®®¼RñiÓ†ž« pÐóŒç6D«‡š¸é¦‡;†pÑ(¯¯®AÏEã\­¡ á—:â`•L!²9k#{¹Yz¡â»7æ[/iÓC3³r›mjAÿp`5.´ßŠt œÃ€µ¥,%í® xîÕc¢Ùbñt ˆG¶bémiukUÒj‡$®’jcKZ:ýVÜÕ…´$Zj·MtZ¹R{™’FÑDŽ¢SÜCàAÊ7ö¡ô´$ëBIY\ “*ƒ*y1s””\RÈÒÓF9š¬ã+méù7Æ&jçÛ˜óÀ˜´‡Ð@3 H‰¸SˆPª¸mdo§´Îža¡ ZÍ5íÌ×¢²y4*3Æ8•M´ß2]ZOo®ã>Ê|m ÕÔ7®P  …ÍHæ¡$xL±MG%AtDñ¦´]R›!ˆ\Ú¡ºÑ×Qd^³Ž·xr5[Ô—‹=T¬VåÕ„¶ú½ \¼Y$x¶­G¼¤MxÍi“_Ø2`,ÙM §$™503ý§2¬/=íÕH Ãg–6‘îÂðîqÚ t¢4!l|híœúKÛ=J ˜0^Éô¼a/ï4Ê[ ºÙÓçæaÉÈ'Gßÿøs\„}s<þ9Ûóñº·I ]µ¡ ü¼ ­»; žJÉ+:‚cæö Ê÷—ïmްÓÀÒ¢{ÝEXr ÂÚ!û˜¾“›Ënb¬žäì¯ï13;®†é¶žÀÞ… ÛûRn5’Úòè œ!Km£IÅh¨’Öú¿±Ãs `ÀlSb_-ã®?T¸b m%07ÁkÖ4WÛ6Œ¥´ð³ k €ÌB›vam+n»ß–ËõŒwq§wÍZv¤{‹*¶-œD»àdI›óŒÔ%… Nˆihæ+Ú;¸ž_No*ŒioKzô䢮¯Vÿ`ìðtÿ§òtïj¹ ÍîåbyήFã0}ÿ3¯®—£Ù¼‚>ßåº0]úƒ†áë =àsX{,g¬bÏ¿¸ ž¾Š±:`Ô¦% ék àÚ¡ãpìAsDI(°VÜRðÕô]Îã3×÷ØFD h€}ÅbBiâGC‹üÐõõ!£Áÿ\}(Wõh~†Î”Õäšýßê´bßϪË×õ¨>©FËù=†} —Œ¾„µ%‹ã(yQª¿\Âp9š>Ó’ }jiw-/•þõk ´uݲœ5}„kŽ¡aò8}žæ¢>2¢ÝY· Jé«­†9ÃÈè°s!Üåh>Y\>[,Ñ“Ýe,,¸£¯â&¬»ñ#ZiD òê—±€ƒ /ì4w­U Šö·ùð¨I§Ý°†ÊK‰ø´L;àÕš”Ü`ûõùsy9}XÄ¡_^–õE‘ìZEÁWŸgr µÓ÷’èÁ¹Çñ°³PQ\æ4âFZÏÛ9„awÄ[GÓ³³ áÅ{Ñl䢜­›š÷"‡hìì Ç4~@w†3mwíì¦5ÅÖÂy´³—8}k’>x,¶dd©ÏJïÝó>Z¨¢U²Çå¾+¶Ç¡­MÁ.§óëÕŸCïÿ,ü@endstream endobj 75 0 obj << /Subtype /XML /Type /Metadata /Length 1449 >> stream GPL Ghostscript 10.00.0 2026-01-03T17:21:51-08:00 2026-01-03T17:21:51-08:00 LaTeX with hyperref Plotting model residuals with plotresStephen Milborrowplotres endstream endobj 76 0 obj << /Type /ObjStm /Length 2534 /Filter /FlateDecode /N 73 /First 634 >> stream xœÍZ]sÛÆ}ï¯ØGg2ÞݻߛI3#Éuí4r<’›¸Íø&‰ E°$e»ÿ¾ç.AŠ’I  ()£±±–ÀÙûyî]Ä(´ˆI˜€CžŒHZ„D"‘ ΌȸŸ¬ ²V$'ÈîzA.âv\) J÷ñ(M˜Ÿ…¡èDÖÂXK"“0“²Æ»,²Å+-ŽN˜h‚È^˜„Wæ ¬¶8Â~”“°Öá< ë ´ÆÀ…&aƒç+FØÜ„×ÛìøŠŽ/“öŸ1Â9À&…ó‘ç$á‚áçd >iá: oñ ÂC½ ŽW.|0„>Fžã…ÏBÀCƒæçP BÂ#‚õüÀ,s $<VElÔ“Ñ0f<":,ŽŒÑ{¼R‰xN1z¾• *ÃÌPϱ¬5È:ÂXI:±lQ–ÇY-ñ%%ÏòÕ¯°B ÏIÐËUâ˜ÓÐŒ‚”ùíŽÊ¤"c“yÄtwœg)—»,æàË™ÿw,2mùKˆ²ûË÷ß uØ›U/ëñ\¨Ÿ}ÿoŽO Gõ·q¿ ÇgBý:Œgë /‡ÓÙüè¼7e;UüãÕ¬?Næõ” Y‹<­×Ìa¨ÓËóÿM*¡ÞáZ?åçæç3ñ›†{ûŸó‹9¦â` ‹+|f°,¾ÃÇ·(3šÙÖj}.G¾ÎîÅñÃE³~$ž Žz“WÕðì§Ð¥â%œVsñL½U=5P•:Sçj¨FêBU­¦j¦æêR}þF(–?ç¹õ«—£ÞÙL@ûe™‡‡õ,Q/nF(ßöaqóåpTAŸ!.DÇ—Þô.ª›*y=ï†ýƒñÙ¨ÂDu<œÍ ">¸ ®œÎ«‹_Šó¬ xM7ê}³4iÖ~XOÕ´@ã? : -Oðë9Ÿ7ÐÞÿëß0i©-‚J V#_ŽF<÷ uRõùÉI #u)KcÔÒ#e‚¯|X³ˆŸ†ã?–xÆãz~dŒ4Þß,hÉ' ‡¢heÄõƆÐ+]w`³Nfذµ^¸¬sò£}bƒq­QO2ät6¤CޱŽ$G&gH:×Z9aWçÔÁ¯ç„±8ºæè›c(G†WÍàMh9®ÃÞÒŸŠ¶+sßö¦ì€‹g÷¬¾œö«™àw—`ñ³Ü{;­ûì׿aøâ%ÀV_æ% ,q¿íU%êw”¨MFZ$cœôHû6{‰LÜU¤ÔˆâXÑ’Û Ê|Q’8Qn 76³Þ!J¤‡Û0&dɹ¶«(C#ºØSs\ˆÙÄâØˆÜ4"7ÈÍ‘G}‘›Ç¹%+“ŽwˆÜj Έx»²ÎÈœZ„ÍØtA·GÓ†8š‚´y›9€°ÊBÁ²–"h]’Ì}|%ǘ=Ò ^Ïr³n[þ11H¶0ŠQ‚xc%VæFš89švØNàíTN '_Ž™š6cæ¬Í4¸Œ–+[‘¾WÕèS5ö{Ïþ8þ÷²º•ùÝBã6à*ò^޹iÆÌk—‘@Ìj YØ-€w¶oض±c“dšg¹s^r©AZL˨±;4VµÙ &}^ACd °Üdž‚Q¢lÛÍgiQv.¡9¡Æxhy´Ûi';WF!´„ÿR] ]¥פפ—6„uºXwy‡°~wè*Ö]ÏÃ%ór칂iÆF»¸çWtX›+u"+ƒ£sݦ òÆ6/€ÆJ ¥º–:M†ÃÂô"!û˜–l}M[f2=XÞEB5B]öñ":Ä +½GýŒ¦e:y¨ZËd(ø¸€áÜ duº@’û;O œ[æRѰ-¬ÛÉÞí("!ç§­MôÒ²Á#’qg€Y‚a@-‹ƒ6®Õ¯%ðõ¤Ý2Q¯˜Å‹ŸyóãÛoŽ_¿{‡·k(!âÞlZÐõZG)µì(ùB˜þß³þOßmšs}ÞÕÙW])ný|Zöy0c½GÅ7¯zT=õQõÕ@ý®ÎÖzT5©¦ÃzÐ4«>]kU™´jUÙ¯ZU¸éc.o¹ÞªŠú¯ZU7Õ}³YÕû²¶€ë­+¾²h]!°ßÕ¹²q÷ªÜFâ6 \Ïhiô¶âåœ4°ñ€ÛÒâ¿I%¹x¯ÊæþA ÑkˆRï(»¼Sã fPñÒƒ·¯î÷¨ ¹Oŵ uît(¿-yÉÍꧨഡlz˜’“Œƒ5pˆC¤å†hˈªM ½;¾^ ¢]+œ6U:¡àÖ[#d`/‡Xò-j®L…O5¶íÚòó¢`C¬ž—X žMFõü¢~މÕLN¿#¬œ õ÷ú]}RHÐ6Н¥×zuø /j î§0‰¼µÅËÔ‹ú'Ú¶M±ÇDl4Š DÉ%b‹š’›¶^Ä6ºÒ²Y"v ŽŽ9ÆŸ1J/ø,(?–’ÓAÆðeK2· ,+c„<Ì ±…Œ—V{@|QÎ.‡ƒjh ÉÄ»«`›:²J’™w%Q8ks/*ܦÝ`¤ŒÛÖ&÷„À°Ç;¼ÿ|p÷Ï*ä=t)Ik"ÂhzÙר-Zª¹k…~#u¬•·MÙz¯ó.;$­Ú~í*ˆµÕø=¬fŸ­•HÞ ïûçÉë•^ûóa=^\zv>ŸO¾SêóçÏòb8úXËzz¦u_]wàÛÜ.¹!Eì>–æV -‰›\̺Ü÷Ê¯Ñ ·p‡nçi+= ŒVØàÔ’•Ð[+¹Î Ø£“ƒ7òäùdZÿo/Òôú@“]õî²5ÖHŸX coð3qbÒˆ lã •lY數i£„º™)yx‘q"oÙèén³—³j:“³z<ìËq5WUo:?WÝ%ËûÄ6!¥ä$ $ëM”Ùʉ$µ•ìÓÁ'dDÞ9"芨ìð—7ŒiÏ)(tµ J;hY›K§´´}¸ÜÙÇ‹Äj¹·É%9'lHŘÉG™öëoÝ ’QznKp•cùh« ¸}ˆv>­ª<.Á˜‹Ä`Ä´¥Ç‘…¡Ø–_“<ü•Çé ùC=ÞUåmRÊ¥[û´.Ç}ìœWØÀA`}7pûít‚x¶Kš 2ñGh€ –éÀu]ùî´ôš÷)ÚÜ=Ëi² Òü•!ñògFàþñ©µN ùü™ë"l€?u¶ZÞBˆ÷a&ǧ§Ý­Äò>op"rçl>¢ ÒûG´ñÝÀ/ÃG„KW‹ü™Ô9ãì÷î–dB–‘VØLŒ’?8î„mÝ”¶˜Ïÿ`•qîendstream endobj 150 0 obj << /Filter /FlateDecode /Length 2583 >> stream xœÅZKs¹¾«ò#XÉ!Ô9Aã${H¶²[»µyØ«œ¬=Ð"-±LQZ’²£òÛÓ `™¡lGrR®’¡ ÑøúëzôóL´0ô/ÿys&fWg?ŸA|:Ëÿ]ÞÌþt~öÛWn&Ek­4³ó·giÌ@«V =sBµÊÏÎoÎ^7Ÿ/D+…Î4[[+ÝÜÒØ„`µnŽ4!x-¡þeÃVìhìCpš«ùB ‰ëMsCA­ •ŸJÕ¬èqBÙ¬i¬…0QZh4{¶Í8ÐP… lHÛ£’ÂÔïÙxÉTܲù‡´“¾ùÀ¦p‘G¦ÁuùÓù÷ˆpàK#Zg5¢|¾BPVH|žŸïÙxÍÆ‡2?m dÄVi+i×h‹ˆÏíJŠÐÞ?ÎÙH.x袅=$½ÐtzMóâ;´ŸBëàëæ/eɆ¦mÙº7hCß ¶;ŽpÒ§#8œ£l5¾£L ˆà‡²&´Þçg éZïLÚ¿d2w¸–l Ɉ¨¬¥?$ñœb _ä£xÛHöX°1nË8ìfàZ F'˜DÆ#Ì5Õ>iúu¤$y¼›+ÂJfúä§ÉiÛϲšqè•øóùÙ˳äÓûÓnNŠBŒ‘ÜϽi… 03Z¶!¹9ÌA ë Õ|G€¢Т?Ù^Õ¹œA’KIgÂ):H׬î/ìͦžÕws¦øçêlЛ$¥Zg’-•ÕφØÖéúdÁäG~ކÚM9Óæ¤„€ šÆH‡èIÌDûã«…w)Öô@Õ[‰”ìœ?.­êéçLò;—ä«ØìØ›!v<á,[æPj\¨žŸäUç:è'3,ÔG2_2«[­Mo’²oƒ8›vœÜ9µNùßî*‰VayÝWØJ&ߘ11ÉÔÁc4\ÝsmÙâC’é‚«l¸[¥ç¸íå©¥Û"¨~÷K—V´RÌ¿¡J«§•·}ʤñšWlœs¹W˜¶.Ùóc?™O¶¶÷—à“òÈÕËïøtžk"i\17ä<›ñ½Þ°(t™b¾Åé_Aš¯½é#ÕÈN𛳲0Î5ó k‚×­1ÐYó³°q[[goµ1='~9_ å1Õ‡æn‚è)Ôü‚ì'ÜŒ òìÙ‚†$߃ÿ•ÔUj`…A¦Iîê'ÒôÀ6N·VT¯ØV[6¾Éu˜²&Õûx|Ü~°z×= Ìš ¦ Ö~’fy<Ò,ǦYóiûÍPþáñSa…Fõøñ4˜ )ƒöŠGßA`}6~Úš?îùù©p€þÖËÿ?óóÍ4?§¬$±¶¤p+e%;+…ÿ••*ð’ÁVwË÷ÅJ_ŸˆöUñʽr¢Dãå7÷.§¡«Šä6gœðhÂéÇm)¶C-K½ðßÚT‹•s»n¤›â3ÛC©ÖzÛÛ»³Ç7so°ºù#Ý hÓ¼LXyïª"°d^¬´NÙn@jæVÙ,u¸g§ÞŸ°Ë>X\ðÀvª–äcN¤«¯}›rœ±éè–¯%VÎá5T’g®’I‡¯.ÎÞV—÷=狳º¿8ã]]:ˆ…—ÒÜ)çRHGZüpvþ›×ͫټ3}GdnäqìÕ¬èGÕ4¡d>¤…Fæhª¢cGúþMŸÓ‹dÒd¶ïžõ%wž²¦) §È´ë ý@ÉÒQï#T¢÷ŒÇ!7ú”Mi>÷DhsܧyËÎ6H›{œ}Ií%ÖÏÊ+â+´oÞ±M7Ɉ‹ØÏ¢6ãUF-¹-{<šÇE/§”q „ÛØ3dðUR‰öÖh‡J>b $Î9êViÊL!æ22ñAú„—Q¡F‡ZK|ù´¡œÊ•Œæ>Ôp’< 06q–Ý›X':Ø6 n¥ûÌ-ZHÝ·G,È]~‘»ºJYHgîZÐDùîДUF–Žñ œ†6—ÔÖz`dͼôÚ ]GQ݆Q–ëö6Iƒà‹A!e;ƒWLUÆAºåç#’P¤cº‰Ni—ÔÁPÑ÷XA¦2¥²A\ËÅÇÄ ƒ;4tºø6·i15ï#„€n3€¸'ÆûÚ&=äCÑÛSØNÑ8™#—qèxÏÃåÑ´o•ìì«!ï£!~!J[D³ŠJ<Ê'ð3‘`TV䊠3C¢tÖ¸æ4çñmêR›È‰…1ØŠã ½s˜'CS?]¨ê8÷ì›@ôˆW´žQ{r QIýóI‰¹Ã(6™+»˜à}…?Jž.Áe鸱°•”ëa½Ÿ¤Zx-mï#.>VÅü!E}ÕŠrÛå'Q+òÉDD½¨ ÑNåHœXHÌiZåŶɾ»Üñyߎߩ9sC¥': ‡2ªbŠÃŒëv契ßrØô–,í %ócŠ™§ñ P\hµ™ìeŽ0™èKä›mìc°9“8à¡´QÝN¯’ÆÆçÒoÉ$¡ÃÅhaÑáŒBÝU]ò]Õ–P2ƹæuä3®G0U¶+eZ……xÀzSKVµç]E}Ö_¦wÑoa®Þæ':Ç÷w…€¾à «…||·cB×uTHì¼pzHR¨…Gˆáñdy· ácÑ-nÃo¼pa²$$±”?µT“–Øï1¯aѬƒìÛxR|gßy;=¹‘"šF׆÷‰púôc3ŒWÇyŒýèœIŽ9,/4J¯ÒûI%Ü0âÇç]¬bCó 78w‰VFö@4…wOu é\ ôÊ“·ª‘g<Á¤Ç̇¡½=‘Ö3„Ó&‹–°ä0!ÑcJoÜÑ—ÒÍ gúdÙÁÅÎwuȦ}èÔ‡»Œ:[Ôï†wCë$oØ-9¥¾“åܪ;T(lú‚ªÄš£׳ä@BbžêÈûq¶âŸ- –Tfìa1³]¥ZÂÖ9.Ÿ9¤¿©1þ]®U‘'™Ó k“Òß;Húš£råºÝ¼Ù/÷Íþn¹?^Ì·©£ô¯î¶·Ç›Û‹ù|a=½ ͯhu¬T|¹_ºX:èë»2>Ò§¤ô‹Ï"ó"¬¾î–—ï–WëX,õ¦I¯Æ¼®4\-Ë‹æö_·»5z^Ñ7£J½«õ±ìZ©—uÈ(+nO{F0Ú›ÛUÙë‹n¬2VÍßT9ݿ˖í‹î1$©é7¤üWeRQŒbzµÞ­÷Ë㺈_2 ãîEqÔr½í5Ïæ¸(Gˆ{`é#†V+zmއ‚ ®Þ¬î—ÛÃdÿ ‚iAb!é}«­„¾6 `/Ïþnq1’endstream endobj 151 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4054 >> stream xœ¥WyTS׺?1prPDEϺØöãk}"׊V±u¶jÁ©¢(ƒ„!¦0!$@¾0OæIDëP´Xck‹ZëPk•ÛÖZk­¶·îÓµy¯ïÄI¯vÝõÖcåÎ:û|ßþ}û÷û}ß6£@ Z±vãÆ7æ˜þeÔ8‰+ÿÝÓVc/{!ØÛT½BpDÁþ9îÌxÂô7gY”dEôJéªØ¸ø„Ä Y°wRÈÚ]ëvïÙê¶A¾)bsäë3]gÍ~cŽ›ÜãÕ7Mw!ˆW b=1•ð%¦gb#±‰ØLl!Þ%–[‰ÄLŸx›p%V³ˆUÄjâb áFxs /›p'Öó‰uÄXÂGŒ'&ŽÄDb±“˜L‰— †°#Fn<†H î œå£lGÉG }…wmÙ4ضE¤YMb‘·è5‡ºhçnwl´ÃèØ13Çèíר×]:öÃ\‡r‡ãŽ»9~ÒøãýÇ¿3aÖ„GgGµ#šè;&'ýÇ$ WîÀ•ƒÙ¸±u‚f.Pˆ>æhÅ¡DˆƒHÏÎ Çã8‰ã *ª*ÙÉÊfhi‰…¶ ÙØ"w² ÛØFÄþùuˆY¬B‹éâÖ^´¯ð¥!óã*×ú4Nr2gü øÑˆ6…œ;ê¦ è^°zçnY2Ó•!Ì2-†ØÄG<Šûƒ-OÈ™¬lâÄ@ŒÖûŸ5Tˆýœ,zñ*’ϧ4 ¯ ƒÕóù¶£M˜ý˜˜=OÀŽßÏxúôû‘#ƒ·azÅÚëîzñòåO׸ÎX»tËH7pUÁ{Ft¶_ÈEq·é*h$©öee39 ERNVð¡mP˜ž‚¼{¡Qøeäˆì¾ºÿM[¤§¥¨’sYž0-+(Ww$@3ÐŒDÜ;{>pV%›_ª¬ªjêLé°Ô€æ רÀ(D;°”¶.&õÑ]Q}@ývÿšˆÆÍÿéµå;32ÙÐþ¹zƒ­ª÷—JŸëë3~nXþƌիß^ºçnc>Žd y–ÍÉx™Ï7¥‘ ²ŽvÐÕ0wD5  ƒ,”ÁN(åú“I×Þ µÌEQ›²,ŒÁÿC¦EÑ yPmyâ&‘Å¥íìWCAâeŒ®™÷øR‘÷M!Š@¾4sçÊÝÂ"P2ù{䥫ªn8Tµõ¿È ìs²iP×qÿ+‚¨-Gÿ*iN!1 (ƒà‰½b<Éc{ µÒè•c{E!ÍóØm,hZ‘–'ôš%ß6 Õ®Ö ä<¸iϘ«ŒS3!úHä)2?Þ#,X/9(cÛ“ZT·åG²nÉa#µ',ÔÕ+¨ñóFU™S.ŠßQ";U”ñ*JᨖéÞýaNPh- û²_ñøúmŬ›Ö§ ŽQÍmí?<(Ø“Çä%ÖäTX˜¤4±è—ºg5vãÁGpv4/Ú‘=c÷Û¤~\³À]ô ˜©¸tý4ì󳚟ÔAƒ8âµ_FP‹ G?|DÆÜKô³býI¼‘ä‚Õñ;¡6éEÏ¿¯ g}$¹ññáÆê:f¯ª™‹ÿ"]U=úÝ Ðq¡Bn!¿÷&³ÁD›¶>Êr $¯æk˜@×l_¼¢‰D"ü°<¬jar-4@ùAj$¼–“ ¹Í|x}ãð§V'~’ÜŠ ¶j2»)¥/£=ɘS!†pÈNOòJ\•“D©É-È`{Ò*ñÐ× g?Â÷‹B«rt0ùä•Ô]*í¬êÍoæQ#/”Ô/®{'/ó0TCwQæš¾iøÍ è3"_Õ9¨‹¾îw ¿ôwX]›ÚPÔ‘wLÃ@¡FSŸW¡Ù ƒƒÐ!=$ D­ÏõÍ^›¸5Ùk/¬¦ÞþÄç~û…ÂC2uâžÜÃ@éõæÊÆ$楱žiÞä‚e¡ÉÛ!¨õíGÏ?=ˆÆ²ev")Dh†m§e„æÔóà–N]ü‹­Nÿ/oLGÛI¢1xï®¶aVreŽÑìrü;ÚJc‡¥+´ä’Ò-¢FLp÷Ùó ,5©•Wr} ó¦ˆíl^ìzœ‚‡H‘’¾Œë¡?´ùw˦;b+7#Ìnv[Tmv³$Æ+Mn†eh4—hûòßpU²À¿•æÇóFÕ]žÑìŠÔNº/n&ÑW]ÊçjÔ ÊnSÕP«m¾4 vâ%ñ”ùØá¾3²G/u>ªbGÊÖ߇jû„è}Ž¡åÁ)Û”bŒ¢g.ÒæìÓ%ßä6K ‰Tˆb¤C€®›qJ!†å5¢¢ˆü}{¯àX§Ü'è7¢ Æ#ç„Èïc:=ÎÖæ”°uiòC@Ý»|u QÙ–ÐÁ6Uê󵚢ˆµ¨ŠÆ’ÖÚÔŽ I;²ÅA¬XV"jöÊåóâ wØËÊ$9‘¡Õ’’Ì‘‰›`åñØ›7„‰/ÜASñJ3ÛIoÝqâüùîœ9àç°™mÁi—å'ºµ…]:V§-ƒK@}ƒF[Àò.ìðØ:dHÏO®Èïùþ6¨øÿ¯é†€¡ÆqÀˆ¼Œ§Œ›(G÷Ñ9º·½õ,œ¥¾^~fðâ¿"X±Iȉ§¿ä{~´Kt |„•UVÓ”ÊOë.ªËÜ™›™•’ 'ÎõCQF#;Q.o‰­K/¥0ÕF/GQWÉïOøøûïô™5Ò0î}'@¼™örŸÒ‰uRib¢TZ—ØØXW×Èà¥øzæSÜI«ÆÐfA=Ý%ŸUrdð>}½ äÖ Þ ¹Š tÆÿ¸_q(¯â%KÜÖwî*R²Ç‚ª³ÿ)½–\Ý(©‰/“‚„Úè³pÞŠ®oTŒZ«®Žª0ólªªÏ+9VÁô^Ê:ÊOU¶WþñíåÀ9lÈQYÁ4}\Ñ®RE^°VÜ ïSgz>¸títˆû~&_–'?`5©Ë Ü{&Ü'o¡…<òÁ"÷F®‡*9 Î&!%{¢C%Ë…±šäªºv%ÅÉ£Vüï: §{˜²²ÃÝpƒâV‰†Ëa¨ƒAð”7žNTB£ñh´m«•B§YjÚIbwìj‹~5¾ÎòæýAÅ«ÚO³ðcÇòæ|çžc>|§C6–ðÑfBrÁ5#’óðâûf³UïcÕ»ðC <7mÙìÕ‹=lýź_H<öë™}ýkÕšãù‚öpìl¥$‡Av°z¾`UÓ3ë¹ÃA 'rëø¶é†ÞÎ4§ÕC+û&¾.7y¥2x²šTÙw,ãèlô‡S«~h‡3ÍáuüJ ‰&êJ÷ÖóF=¹ÕJR#·Ø3}ˆ2ý„ÜVÔG7²q KÙÍ(µñ‡·ÁˆˆRdªÛ ¨Èá˜m,î…ÇmÿÎðPÁ"oÑCgN( ÝÎ`…(y¸FWÿOKLÄdëÑhd+@-ç…¨%ŸVE$îöOÎÌMUŒ’k“«š}€ˆ3âc;÷$FE‹cÛŠŠ5yE¦ê£&£ —›n>›èýíÐÞaªëg¤<ÂÅm|*xSìd+DŸõÑÑú¨p©4<²)¦µCßÜbŠâQÿ{\à7UÈmù}_œ_ ÅT}rEj‚"9CÅà¯þÛ;'+' ²&'T§këKªÊ -Šï1¢.ž]»Fë¦#'~¼¸à—°^÷ˆ¿Hðz y18WÐ ½ÑXä‚\.ý|õê%gì‚§{c‡…Cà mxÂ_<•Îq_ÒZhŠJVfÊ•Œ,P¼ysvª:!b¨ä²ô†¾ãÇòò™Áen"‹2”f»™o“&êŸþ Õòñ£hº²âñ !…È™·L­wñÜùA9E5 •͵YEª¦òLw§¨»×üç.Zï³i;‹£ñ†}™99>Ù”ƒAOȆ"žSZª~è"šË`¥Yh¨äÚÁ_'¿BÅ|ÂRt–þµ{ù¦5¾kÝœwœ­ÌÓäi4lAq~ ”Rõ)µ± ‰òˆ¹¼r¼û݃Ӓ+n‡™7R×–ù m[&n̨2í¯JQ ¦õð¥¼j ú{ön’y¼šÅîÉMÉ͆Ä\•Ò¨¨zþJÆï„ËDv‚ô@È-51­2u_–*SÁ¨ÕÁ± eaVIt›¬"Â@“¡Êâ’!‰J­LÓ–––0Íñ£z("U±¢9¢6½Ùtii*+i¬ÕUC 5Ö€‚ ‚sF¤ãÁÞE_Ó·ôïŸ>ê¶ÇMl‡í<-ð=µåF3-|÷*Ø@¹|?—GêðýÀ£Þ=—ÿ«YÚB/ÜðÁÙ^é7 Û6nòó_Äâ‹6ó¼?¾xå³s·ï}ÞYéé;ßÄ ôe=*ªüA¤_'î|7 üƒ¸üÁi.«%Œ¿ …¨óýËqˆ“fŸ&¦€¦I³ŸBÞ(Î?š¯€PPìÉË.ÇaNš4MÌh6­(§Ìº@Amp£Ÿ¾bó"Á ­Æ]œ·[…žÐû[yá‰ù9wÑT1ˆÃÛ ‚EOðë´¶:Ú# ÅOIy$/ɾÉ(-æu³Ô†ýYie˜y†^ƒ‡ð MESV–À~ªLU+]æëÀlX$q…× ßs=¶¾Ûëê:¾¹é «K­¶ó§ñ"Ü”=^ñ0¬{Ùg|#S&g¦«jÒy3ž×_l oDagüÚty¦Br*³(Y×ø…ÁØÍn7ýßRÌh›$‰½Øû1`ïHÿ &X¿¿endstream endobj 152 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7024 >> stream xœµYt×¶!¬À ±Ì@h¡0½›À˜jŠ1Øà†Á–{¯r•t$[î]r·lÀŽCHB %H„„)ïÝ1×yëß‘ !yÉÏý`-³ÖÜÑ=ûî³ÏÞת{7J"‘ÈìW®l+þ4Äg<èL´K)Xv/2âû~hßkh@Ÿö¾”øÇa¡Üγ}À¢ÀÅAK‚—†¼º,lyøö;"ÝWFy8z®òZí½fçZŸu»ÖïvòÝà·q‹åø­¢ßž4ÙvÊÔioNŸ1sÖì9£]ÞÓËŠ¢Þ¤VQéÕÔljµ†I­¥FQë¨ÑÔzê-ʉCm ÆR©qÔ&ÊŽOm¦ì© ”3µˆz›ÚB-¦&RK¨IÔRj2õ.eK-£¦PË©©Ô jå@M§VR3(Gj&5—ò£zSó)+ÊŸêC½Fõ£úS(–H…S¯SÖ” 5ˆL ¡ʇêAõ”ô”ô¢V\¨î”JÒ[’$¹ß-¸Û]©ôr÷ÅÝ÷[ ¶PÉ&ÉÞ£iz/cÅlg>íaÛãIÏ ^-)Ë`Ë÷{;÷nµr´2ô±é£ïƒû:öÝÿÚ›ý,úè?5À‰µ`ÝÙKC>x}äë¥Ö.6œÍ\››ƒ†š?hÝ ƒRw¼jðñ!ŽCªÞx÷£Ü<.—·â³ù³CÝ2ôâ°Ãbß|gøtAiÕFäf$ÂëlZ¾*3bA¥LÆž]¬cwø®P3rúC­öB-…jU»åp#½]TFþŸ Z]Áadct²Sx².T ´ñÛAœœ®ÐÞ$ÔÂU¨0/Z‘ÛÆ`½PÎ"ecdVB+…! ¢. ÷ Ra JcáԆ쑷¸dúÀXðœ™Ψ”á! rúRv²3+ém °œ|Iµ¶ƒ|…:^îlE<â‘#ýóåÓgÏnräpü_>»‚@]ÇXu.#@\6 ýF ân ¯îKt.`åújºÂ‹ïª¥½” {.\.XÊ{ïîw·ì>ǽ øG¥—ÏÃuæ«©wðë^‚?f‘–Þ«Í:È¡~²§Óœ–mœ‰¥ü[øÖU•µ—GF´Šþ®}ÆüÙŽ ÇðVB¬¢\°5Hên ºRÁíb;æGÌ`ËñÃp?<àé8$C=úqxÞÆzÁ¶bù±€Cê÷a?4Çõ‡j,n€ØYãQ¿À vÂÊ@ÿ-[#<1p§©êó›Rá{á+vïÉÃù€1ÒëT*òh´ 9m,‹ ŽS)Ñ<ž‡k±#êHÉU¥C¦MYuz#g¤CT³ÁŸ|A°yÁÇP ,÷FÞø‘5Þü!Y…ö6AØ·¡Ò„q8m§Êmà‘ mÕ¹1ÌØ9Ñ(éx WK;‡vÎcKA§HQ«)œóÜm§—6؃ ^mÉÇ »£©xZ†f>@ÃQ·<ÈLP¨S“ùD<3‹Ç³¯Û¡ýhõÁ«?k‹Çxm<(ó)„t·o0¢‰aB¹ä§ ¨ø†©ð,ÖÌ;º4¨Íã<0ˆ~ö±¨ÿ„ï±dŠ‹Cš’¿Hc^$Ú•ÌdW¾k×_gË‚4yÅu‡Žé›¹þÁ$Ü÷Z:u¾¯¼@·TÄ –Aü‹#xã¦0ð¾tÿŸ ý(CsÐ 4­DNx0šˆgóxà/ošy#ì7³êgÙøÈ½mÙ¡E0 ÜazÂÚ…»¶¯Ú1ƒœ´Pð[µ 7P1é¤ÂJ6\æõvd³Ç©ØnÃ'`kÜÿ»1HÒq°ª½‘Ç+ÿû.r@Y,쎔‡„x{y*c€Y°ú!’"Ë+_\»¹ÚFÞªómÒ7猨©^‚†ÜBÎåÒÎ~(‡ •ãIÁ‹ð<`ð™™ú÷éïò|§ñå¨8T6-Áw7 )eæf±‘¡ÑP¿¹`Êe(Ø¢«Mn™!ªþµ÷:ˆVô5kÅOçþySJ‹e·Þÿ4[ ê .)-:yEB±ÁPPSPë6]>1"…S#© úé¨Õž‚:¨_è“HÕ¼FRURU;ùk®j}¹T¸D¸ÚUóï›’Uj¿!ïh€¯Áhz‡=U•ßÈ#í×ôÃÜ]3ÌåÎPìšÀMA¹/Ê}M†F€qC!Fʵ* ÂôRÉÞC(òÝ昺")"41™ó­òÍÜMPìí½l}ìlÞÉïñß—|8ñTB²*¼4¦ ü· -S–mi~Ê¥•‚F­Qe¤˜Häñ:RsuMY §ËmQq³K”óó‰37;víIÌá½ë2—åûeÚÂL}Ùá{H’ù¶¯–Ó$eA:0y +% ä„QœQxËÔ¿snI;yä̶dèÎmT-?Ø S!À¤ õô×éñÞü ËðëIsñª£¨…tꚃWîþä€WsÚ„ß:)èWu@Þèxj<¡ë2Òè“ñv¢Sˆ,ÿøVÅù&¾t÷Þ]ÙÀdCf1éð¾D@ÑLƒäÇ hH¹ÍF±h˜C¡2õïq“”Lø—¸žÆÒk!'Ïí={•{/t=m/ßî±”pæx0Øh:ë·¤ÂCá'¶)=÷*g0Ê‚U³@NJ›õBô^4.Vàd×óÔoíMh"ªbÝ+ªh¯ÌmâQ):Kÿî)¢d„"ƒ[_ŽHôž`ǾdóRzú¶EïÌJ=r’C_Ðx˜Èó ´åñXV‚wÝ®ÊÀ¶øãäÄ÷À>£±¢¸€™L#>×ÂH/MÊ:Æ#¶Bÿx!RCnI‘Ÿ€ë\¹XÚ4R˜9YsiåôõßJ{‡ 7ýÙrÜ}±éPúó¦ eÂ`£¤T‘ ãÑ7lNyÉó2zäªXð…0ˆ­æI²_¥óƒHT¥¦ÆÄyÖ¸;jH-Tèlª›¡”,Hµ‘̪]Ä]8š—œ†Ü´|_4?·ÖÅjSó! 2µY%D!ÌðáB¼Qrü G¦^_áŸ"M/šÞbOÎi×+4ýF¤i—+më²Ú)luö?®.µ®™Êè*ŸÀX¯EVÞýâÁ¨¡ÊÆuÚJ…HAåçjKÄ‚‚T‘¤ 9Ù“yw‡TùjHNSLÄEÖ£Q#Ù¢Òmj› ŒìÄ_µƒ<¿›¬Xg^Ñ ª¼8]Jþ®¬ðéXi=U¥65- 7í}3AÀŸ¬p0¯8NÈÛú2Ò“ó téºâ§¨Ùú)nÖEë”9`“éYyŒh5 (J_uûƒäàÇhÇ…DÔ"K¿Õµeçžm…®ÀÌrpZ.×ÇVT–”T¶yC _±ÿhi+0‡ß÷œÌ»Óx«rÁ ˜ÏÌý6èõÕs.õÞÄM”)üœ?ºŽ^œë '‹¸åÇØ1v»Üœw4EÖh~~£–à§ýcÂ`a[TÜÒT\„8ôFmíM­‰ñ° a5„˜k,S—&B(Ä$'††á3ø¨5ºA˃/ì9ú‹zUYê'XkU)D•óÆ(â\\ÜDÞL<øbû´ÐnÞ[pzZBqVvnAQÙÞ¶ÊúÛC­KBÉS )):@\T­=Fû^²èó¢ © ÞØ5e¢ù´’iŠJ‰9šÓ¹œ5;“²t=*§3²kÛ3²*¼xþÞ)I×»m÷áµN,”‚6¯¸²ñ ñ0u?Çãõï*¶{óá¾î¾›Á v6DÕÄ•Aˆ­‰^!ÀE“OPŒŽÃý±=0SÍ6AØG7jóïruF™\5…T?°ý+Q@&º7Cé !Á(Ñ_— cÐ]¶æâ^ÈÌnr¿öX“*'„$"3iŠ‘Xg¥¨*¥dMuLsÌ™´˜xŠkÍKÎ@vj/ÓÕÍÚu¨Ò’¢ü<·ãQ <4d4TFDF…)äžM^'O·;WM„o©¢ow˜|ض;Rô/AÆÆ{ÁŽà’¨Ê }¡ñâ⣳q·‡‹Ÿ˜1 d]‡,sr’A™¨VÆ+ùÐEN~NÀ8Î>‰Æ£Ù_¶µ7ŸŠñ¨à­ž³/ðã+…’kRÕ9žMÖ«I‰ žø«7ÑÐà2ÞäéNšâ×É—žn<©á…¥üÒ“hFR.Øä—Y„Ò:­¬5]×e¿¹øÏM.þó_­‘i µ/gž( µ:)Ë»>²&5C¹`cÔݤÂkÂh6'O/&/¢8|Q–€§X”Ë2Ð7! a#Ã-]oXDj¡œC7eÅÈÁ"T–ˆeQ[p/ÑíÈ^¥'A±ôœó‹¡H‡ÝÉ£Ìè1xîÿh êvã`»¾_B£a¿Ž6áôò®k,9telhðÎòÍÀb*m¸šßZ¾—7Ô·Ö·ÃYhØ–EŽ=ò•È4¤R˜\)Ea“Ùĵ&”|Û¹ìTAM2ÓÕBËÿf#/TÐÙI Ê‰uÝ·ÎÕ¨³ˆ@k34ZF¸LáÈ#Ý6˜"Õ4Óí¸Èù®e´™CzdoJ‡Ig¥BÖkAÿÌé!îeSFà¾Øú‡±ÄŽ÷:„¨²ÌÔŒ”$2?U|àŒwC¶³}T-ZÈëižÍF“¿.­…B&¦ñ!jÃ*:ç–‹>Îû´s#ú–Eîx<²Åv$ÄŽÁS‰érEãðdd–¢·Ð´•Ã7ñ=v$¶þå âï<|‚O鸙8–·B'Lòˆ2IŽ—œ»OÌù;¢³0bõÝ;|¸-»H•’Ï¥©ƒA΄GWTW6y·,žë4’Ã=æÉ?÷þÖ™‹yc%1lbœB§H‘‘Ô=O†züóæ³Çc¿Æƒy|ï×^ø[¦BzU™ÓÕCšØÂm;×:CŒçx{r:õUÒ–I>¼Œì/·#p£eìßVÈæÞÅKŸÖ$5ïÞ÷´Q9òO¥HKU@›_œ]ª+/­Ý¹ÑcwL,çW±³€„òÉï.¿¶Á+7‘‰”“©±¦!(;ukÜVoØÈ,y¸õA½žœ¼^•üþªznSõf˜Ž ‘zEn¢Ê $³$·y¢`§À³ŠRh+©áõƺÜ2`¾†Q!‘°#*€û)€©Áˆgwì½lmKs5_^˜W€¹ƒ,`êê. žZ¼áÁç娟AØCøpÙÐáûRA“É"êÈ#ô iÌ¿qc+z OAK÷îËÌ©áŠGL»GZº‡ÙçäBŽ" ’“Õ|²½sðNØ!MÁW¼2“]X=ú+@¾ Ò¢ÁžþŒ^‡Õx¸ëˆ9븨vÿ÷—³Yî¶# 0L«äѸ|Ö/zwr0n1-•Ʋ}Íï\Öåñ//‹DYø«û¢ià¾<Ö—Q£d¯N³²ÿÛ #°2BÅÓtÊLÅý¾/“ ³ÑöIŧçàSæ1¶¸ƒGpøÄŸñåÉß«+i-†n¦„ÿ}žÄ/¹xЭ(fÈi`>+¸[– 9 HQ¨ùÔUò€Ý°G’Nª³R(«’ÛÓöøÕ'äÖ¬/b&ä³ÄDÉ òË2r4u`æxÜT—x éØJ‚$ÓŠú?;VŠì„.¶:¬Â?04,À¯2¢²¾´ºœÃv$¢{>'…ˆnÕoÝy”l>ÎÀ¾÷ziº^èNd«5ÌØ9¹FÒq]=#EÂ4vSÁ¶v8Ï\9}î34³OwËä´ñ–û"W¢m¦ì§Lƒ¸dn—ã–³Ëò]Iö“ζ¹¥ÄµÉoðhHü8²!éTlaÊ‘z'XǼ³aÑÌm+ó8skN¤]UïU‹Jû2ïn3åÝL6?‹ËÈ.kÊ.jt?çóah÷[P·Cìå½mËóÈeˆlûPü¹kÂÁçÎ}„+¢.XìXZ]§¯¬äðh×sD* ×',\£ò…®Z—­'Þ¦"ª48(*2xKGà‰«ïŸ½Ï â}™$Ô> úˆ¤åa³Ù®Ç²HLa!²ÍiD¶Ä<ÕB¶Ê ÔÄCÓe¤} v ç-—íÑþ-äóì1!ìMÂ}¼`¤¡J›Sœ‘­5‚È r¼ ±­éAô§²=(X´s¢C-eA“œ H?ב}ùƒƒš2Ñu†«‰§ ;Óú;Ì…e%@¬Mdljy´Š˜ÎâU‰_5?@â‘›8[ ?™£ö?jDÅâ¡ãgMX5¼Ùs€¿ÔV4‰˜7QÄßDCžr‚ý᧦ˆ¨r"£TN<çoÃ4ÀÌóN‹V3ÉßùƒÅ}¥¸c¦âÚWœ¸ß²Î7ÅÈ·R* á›SUrð3ÇM&¿ÿÊõéqu‘?„ç­J‰Å«ºÖx³P’*º ­±ªL‘eÙŸ?,}YÎB1¹£¸®.Sˆ-$f^“.†ØÎÓ¯Þ‰‹2×¹ý27¶¯ŠöˆýÔ©ÜáÿõŠü£ŽÏͰ•M¸Í5Ú5/b’+¡ŸÓK>T—î&°¥*“TÉx|—ÜO@®Ê&Y¹î$Tš`[H`““!øâ`OB¡2/2+.Ë·ÀïZk§ ©=1_ׇjÓeõ~]ÓAú%ß9wýËZ“‘–ÙbZ.B³…bk4§«X£Sf‹v8#CWD„¡§7=·m’ ¦IŠÒq:Û4ö¹íã&<è_1´y õhE}¾hï"‘'¡ÖÇÂ6j•øXb{ Ùw›ßÏ=ªö©ã¶+}ä•q%¥•ùõÇ]ÍŸ„{nÆé?Ÿ?ã!º…&Ó‡3ãvð¸æ¿Ra²w§2ôÑu{ƒmLcφµxÈ#Bô¡uEyYºL.=]C”ÑBlêŠÀU®[ù4%Ùt“ªKÕåܸ†hîz&v&²x×ãÙŽõBƒdVè&ZÓ!ÉCRT‰Ö°¸À‰À‹r b¥âO¬¡+6\Ü <–Ü},EÇØš² yxH_UDEMyY-G–„:$m7Pö ©°}ÂÂÔ[Þ7vܱ/w†5°Hî5ÓßA±0c³ìµ,¸|îBû ã™ÆëÚïá ƒÝð5v7,/@’„à19·áZñû%׋ùLˆ~ZÁZ2L—»° Á1wsˆØ)ޙǒsl5$æYŠÚ:Y¶4á\pÀf¯@Òs÷T5ÓUJ{+ã§p¾rYö1IÓ{á;¨1ÁîKOQæ7Šf>FÏÇ+9öíº#Ð\p•QIëÑɉk‰–$«©øð|u%ÉuCOŸ€'$SOú“³ô­i›BzYuÑžÚ½¢ ÔJN©ãð`¾<±hâtç…kWá†Ã,‚‰uXÍ7ߣ‘•¨÷ý‹•’K÷Ñ&â…f£ÔijHd:"Їe_6/‡__ºÓyˬŠäüžT£x¹e 3øÆzÚ~c'懯ï?ûváÕq%ÜݪӟÀgÌÍYgÆŽ^èhç^ŸTTVYT·'¸04Å´£æK‰Åeö^ˆ¡\'wãý\}”j3’ˆ3 ®Ê£IÑ/<«]l’â“8ÜÑåm!GÅ“h/•ÂÎì€Ì¿üC¾¼ÿÌ8Š^&ôf»zã4s•ˆþ­5 þzžAò¬Eß’¢Âö@lƒš8pdqõNa†J—Bt%-‘_¼EËÀÅ‘œN¶ L¤D󸸂”|F“ŸËÕ¶©lãšsvT‰‡Æ™ä}OXë¿-ÔÛ#È•,^~(ò*SM -©ÉÝWQ˜è1ý’¶,ž<"³§×œ'o®u ò^xËÜm} h>i8+áV“¬I…8¢³—,IL'jn­›×ìlH«ûËn¬)Ðk8´vàô¼ a„áÛÛm•’¶Û(í¶”D†g,ÊD}Z;üô\¼'ì-Ѝ®*)2žð<>÷Ã֘ŸY®üIøë~§Ë«Çà s³ñɽSF/Ÿ"®Ø‹ 97b¶ExmñŽr75NX™påã|rÚ‹Õý;%lN¡qoP¤é™P™/v!6'½4çlA^væu2Ø´S6 ð…g^m“îmû¡¥€k§©DÌ‘‹¦÷Ötö!UF‡Û¤è8ú…m¯ùä0|ÁÜñÁÄ·æÙMòÉõ©õáòâ4ê+Îc·m~ì˜aÏ–ý€¤nÿüƒý¡yG9<ä—ã^ ǘ —Ú.^=¿ÑÞÑÕyÍnnÉõž[uØmÌß8gºÝÙ;Ÿ½wîBÒæÛ ¨— ÝÐA'¼é¼*xCzC—)ËR5fBS£ ŒŽ \Ù¾ý.z õF6È•ãî§ànc'˜­L~z­¹ã¸Ã¦TŽ'꣛‰o:§áhu[iM±ÞãæÜƒ3L‡f†ç¸)œI*‘â…Z ýÿ].ñÝîÿ.¡/åÞ´òé_¬ŒêêÁÂNXäøNŠè•U&ze]¹†z4)Ï:¿¤—>+3C'¾ñ%¥—>/úOù,¶ÄèÇh!!ÇDsK,BXui¨B„[—/ç䈳š!oHMœ»ËVV¸·õåÕ5å~qj±%þ£ç­„¾8£ìùzƒäû)ú «”Ú¨’ÑÏÖ¡Y€Üm8‚æ õÌ5¿*3U›7Ë~Œ3·iTÈPÀ}À¶÷:1ô}ly{9Ñ• 6“ÿí­(‚¼¶iY¸¡@}×!f5²œu!˜´TUŠT%QüÓQ§ñ,Àn€7¸à9DÓ{*Ì@¥èT·¯~Œ;þC¢Yž_úõº„ØsßÞ” ËÅ ™“(-ûê`ûÁ¢ÂTeæ/LwÖmv÷Œ â›ÖéH>‡»oö?v{Å‚«b‘ý×Íd„0#š1•[”’CX@¬ m¶¨¿ó@¢ îþ‡6Èn]€ÿn>¼a»a30oczÓÐÿq1žÿ§¶©ë@‚X÷O÷;ê›AÎUå“•]œÂ«“ÉAÆ1˜¦­¸žÝg,{€eO°ì–ý(ê¿’=ùendstream endobj 153 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5171 >> stream xœX TgÖ­¶¡«DÄ-¥’¥Ú}»MtŒŠJ‚â‚âÒ ŠÈ& ìÒìÐýºAöš¡MËÖ(DÜb4׉QcÆ%ÎD£‰ó ?23_™äÌdþ“óSÍ9Ðõºªß{÷Ý{_É‹^ŒL&c9.t™6]úóM ©oZuÆZ‚µ¬- ÞŠÑkÀ‹~mýéç~ ýí´ZºgÙ^‡·P÷•aÛ<>ؾÃsÕÎÕ^Îk||×[Ož:múŒ™ïŒ˜e7{μMãæg˜̇ÌHƉŬbœ™±Ìf³–Ϭc&0.ÌBf³ˆ™Äld3K˜)Œ=³”YÆLg˜Ìrf&óãÈ|ÀÌf|™~Ìf 3ˆyá™ÁL3„ÊØ2¯3ãÅôf†1VÌ,šcÁD3e«du½&ö*î%ÊWÉŸ[¤X\¶\ni°¼§Hb{±…œ%·ˆû¤÷¤ÞÅV³­ VÿèsÚ:Þúyß̾wml®ôSô«ì?¿ÿ‰þ°l@Ê@ÙÀœEúö5¯×¾àùóƒû|cÈš! b²MçC0ãT³¸¼D&néœÃÇiöA hãȮ맡ñ ñOLN‚½À…©•ú³PUp Ê4[4³{a;øg§d‚^ŸÚŽƒ‡¢Añ)™j9I¥¨Ó?z¨ƒ ¢;ôm–Ü#xäH“%Ù§°é´³he”¡e¸er±Ïðߺ#½9î|ßKÐb/™g©bÏ¥ƒ‡’\¶W±eú«PM_îo^,2·ÚÏ2ÍHÕï…°64ÍXf–áhì‡Á7å yÕ‹®'ÃU¢ ‹sn?xüíìÏIßL%Žªª¾­Ü#»[d¦@Ö’Ïx,Cö¹aÞ†%‹Ho%O¾âñcte±w!a¶¬ôz—°JñL‚I|Ý(«EkÌAk¹X…þ<¾1å)™FìfŽ$ƒÉG“pÚÝ{Š¢'«x2°÷Vø¸Ø¤,m<\d†S`Ú]è_â ëÁ•› „#¼`ÓÙ®6ãú\n@w³ìuÍòΘΙ|¤ìÞ_ä|tYù°%qd2MvwOÆ£í‘E´*LÐEÆÄ@´VKÞ&üúi°f9º³Þ»P€ïò¯µž<ãYÖQ¸Ø×íY¬Í„àÊ@_®¤­"ëÌ8Ú(1É~¤ÝJ£ÙáGd"ok{[χoýôŽAaòò†“Kˆ÷6åq–,øw÷º2þ»5öbèh{ApÎ8‘¡dô"—*Ui«-æÖtüøãsääè{yc:ÎÀÞ¾èøpãÜáÆÂ¦¶õÕ®s½ìÝöQ¼Èdöâå½_ ܆òn0̤`XOÁPC_Ge8 ‡â ZJ«Îy|× ‡GÃUŠ=*à´Ã8Öý!b‹5ì㌭ •ÍxÀM±0nëDa ÖàHÎ€Š…y¤/׬°?L0ŠÃÈê/aÄ%¹ØWœÏCzd‚b#…¤äèøÄdÿ‚ižÀù’ @Àþ{k•U‰Æ„ThŒm 7îOS!ØeeÁ!¡D« .’÷( ˆB|~º J„ÊâÃ;O@Øvà€´=` )RºôJ[›µ"ûÃl8Ê]x”§- Ô º¨ ©H)SÚ¼ä(Œ\ÍâÀ MÇ¡DÎß4+‚4ÃÀ>ø@OSVáðÑ,ƒÿ¶À(Ÿ7X ãò¯yúО^>Üþ¿ñ‚~ìÿË‹_æ·7)zŸ J.² h¿èð°fœ_"û"¬o³=ÅÑ<Ž2“Qèì¦ÐŽs7.™Ûu›Ô²Ãïì¹z½åäu¡Ým=ëàëçó!\,l^Êic›±ÈÜÓØ[R~ACøf…ÍÏ“ÃÀ¯;¿¤ˆÜ¢fö¿ÎH”ÀÖè=~‚šn ÇÃx‹þ½3Q–´ñ\Û¯L†/Äø_`èÂÎßòÁ¼÷“*:|Ìû_ÃŽ½è÷Sùu¸mtï*pAš¥™uŒ‡¥hÁÚˆ³è<¡¹Œ¤y`5Í-Ì OÍXp£ÇXðìi”E×b¡bMúgÐLg`êÁ,½Bg{¢AäͲN±/Ÿ^˜’~8)á(š®;D½º›y ¢´ MŠQŽ ¹„ÅzËS œ`7¸€6tGaSâöG¥Æ¦$dA"h’ãµÉóɪ¡„Áb)~f)÷Wð}“º¤‡¥Æ—‚m6…FFÉ ,ú‚dî•þµ-…”´ô"ÎF4'ѽ geiÝ%!PáqþÑÂsd¸3±J´s« «:Pc¨/Ž/ ÏŒ™åP Ü¥¦ís”ÛX2ÌØJäS‘ ùü‹cÍ-%Ê ú^hS2 Ô û”+uPe‘ä'Ù…yot7ù™Úïö 6¢¤~/i…"P]BÛìÜÌŒ¯ÀÖÌ:k4à~ ÿžã©(j4Ê™ãÇa_Ëæ_2ö…µ¯b®°8•¬¦,?V½/>~6تسz=ÔRöi†êµ ÞŸ®]z†òZ¢œ¼aé¦R”ë/RŽ:@ §'jÉ+D½nĵm”1[¢[Îåüoùôûf¶°¸°¸ ¤m]Gt#å_áÅ]*noMzHÞrÚêí®ÜïÊtôxQ3=×È ‡-°:h‡ÒÇuSŒ7,…G÷•r6v¯@6JËx7E¼}-ë2à†‰OÐ֬ب™ë`ÅoGD-/5㼄2/MÅØnŠŸÕ=ÔµBTrr‚6YIz“ýä5<`Ù!Ál)øÓB;A@wØy»F'ª÷ù%ªmƒ·xÛ/$PCtš^w ê9cÁ×'(ØkS‹ÛÙ;'®·”Ð.&Sæ ÂTOew)ZÉÅØ›Ï‰†˜­V(ćî^682ðíÃgt8‡¤ŸÑ$jµZV™œ œÛÁð C}n릭%öK¨ê²äÍo§àXœV‹\ºðÛ†H÷I“†ü™ä ^òvoñÖ{zŸcfadäÓYhÛÑZllP®gÑþ×ÁY"ëzÈ»}àE…€ôôÕÿÒzeíÉ3ieÐ-aÆ­\7™õ4¦ULh•£¹s“­Õ…ÐÐ\TÀ^­6 )L¢ nJQ¦¿Ù-®_¾ò={X©úA)~©Z”r¢‘ãºþš­ÖisÁ¶ÒÊ”âmJuºÊÔ"}‰®ˆ’·êy´þ0öt÷£Œ­=”'×$é´°—ëšE›ž•`BçüSÓ‰}$]0€/KƒŠñ76·*ÝšsWѯ9uÖh2 {>'âÄÃ/ ó#!!B›•  XîìJ#Fkñ“Ê }“®Á`*®û¨ÔLy5“Xë6p6ø¸{:1ˆZDËH.ÀWR…™ôy®øñ³c¶^«I"cbÃ!˜ÛVVYjÊoiòl^<•È·N½@u¼ü} ž!›ëpú£uuPV{ƒ^¤Ý‘ã`\Î 8 ùÒ@u|q¹ÍϤÎRÖ”§ê“© Žâ‚óB++óŠ åaun*÷à°`Á½Ü#Ó…¦#¬ùÓŸ,÷f/exhØNJ²ª²†ˆ Ç=°šsº° Wâ»wOܸ¿ª&0Gp-_3¨ÕÞ ‰:Uººž’Z†.?;—Ã>iüLøüÈøüÞ=°ß¼ìg*OWþÚå¨õ;w®¢>i¨çÉúóŸB>uf_“u8¼ÉôÄ(î7QUy#6P{+^Éçñs­8ЊÃDÀ1$‘·ÈXâIY+¨664L ÖmäüiD¶Ì´)oŸòøúê„÷<Û›£) ΪñN<—XÌ Ê8&NÐAJÈ/–թDzêt™YBvvfnEÅéÍw¢¤Eaêg/^üÍñ!‘UP”QÜ?.Û’þxÐô籊cÙ¬ÈDYÆ×8 ¸Û]÷ÉD•â–þ9„OàÏp«ÇáLïßbi@†]&é%p©zâ“¶žÒùþ‡^öÀæ -T\ù/çýf ÝÚó+ïüšBð‘Çqb1fÓRï!âë¥ù+`"¬w våþðZ*»}üÓC¥{çý<þÖæM m¬¡³Yö²Vü'Ÿ^¤O»+©ëêOVSÙ\A=êšsöiA“«$s»V“¥¢å·f…·f2]Ï}`«°»laÈ[] ±§“lñxJSÞð6¾ ÀØŸ¹´ðɵQ‡–žV€ E·¡¸¨Ë--¢ûÝbØŸš^Ìu.¾<~ ­ Ò–†´æÏÄ5|õŒ¥æÆ*«1Û!Ÿ˜¨ àvT4V—Õwl9=†(ÈÛ^¤¯0æW‚þÆàK\ÂV¤iw*Éß;/Nf¥vÓ9¹‹£äzµ{L5ÊZ¨Jí“öñ<¼Ê?L Ñ$Hü„‰@ÔÑ:Œ|*Ð7ÛxoÊ 1VDªá2œÏ8ž÷ôjz)ÔÁ¹È<;ÊòïÒ%‰DGîóõ ÙÔÀž¡J1·”Èè],åø´“åk4à-,XAäÒc“PU±â#hOkÌåºJ‰RÅ6ëÿ­ôxÍ=H~KÒ#ÊÓxmÛ̲“h‹Nøš\Ô£7õcÉÁñN‘1qñó ’ŠÌE}Ý7ÎÏFùW—Úà1‡VîPI°œ°âíuæÈ²Z“áH³Á'Uh<ÒžjîQËû‹æ­[ä®R_K=A˜m¸8[º¥º±øÑ]|­Ù$»‰½Ð‡Ë1ïÒ]Fºná„ vH9èª4gæ×®ɯÆÝÍÏÏmʳµØç|ùͳcß’)UÂýªOÎÁ—ÜEŸ%±˜ãôˆÊšŠ”ÅÜ”.47]‚4à€½¯oÒfjN¼4Û5jmˆ6I“ ñÄ…§dçh9©ÆK¤ð I–à4þ‰y‚¸@Q¡M Ó@¤Z Oº>´Tá! $™´’=¥ }žBUw='P%úóä ž,¯àœdü-sèE™#è/mT“Åþ`\•úr8›j‹¦‹Â~ÈQk5#lŽØíLÇÌ5{Sa¼>YŸ œb•¤…R[tI–^—•!ää™Z¾¦U†IsÁHÒoÇʼS^ÊöÜÆRS@Õß]a›f~i‡}pò“Ømfß#omsóVÑ÷&Š\@!\3oâL9Î/óšy»·ÄÆiµ´"±91iy?ÜEÛÏvu8oݽË󳵦(?#CÀØÁ4´»HŒ'ЪÚ$kE=qâ?xø$å\õ‰Ò涆 Ô˜’Ë·'EøÃnγjO]¥±°åì¶OFdÞ<’· H>ÆàÐïnâ06á:é²fmPFÎò+ ðDRÆ>#Ü‚Lûµ?óÞ;ÞÙ}{=+©øÎ’A7ŠùÌ,ê+©z*â©iدÖ¦j²5Yœ›bÊþ´¶— ³3Ó¾¢Û‡ jɇGEø89.vlä–µAFE^nzº[@×ÉÀIyhñé ®;[ñMôž½%=†±à?®> stream xœYw|W¶¹Œ0,&ØÀÎìB€lJ @¡'6˜0lšq·q•‹dwëÈEîE¶äÞÀ˜ÐÁTSDI °a)Ä $!¡„ÍQr½»ïÊ2Èyáí>ýô‡gæêÞS¾s¾ïŒ%Œ #‘H¤óÜ=<&N0ÿ)¦“Ó®_ÝìÕp°»ò‘â',‚ƒO fÌŸùs‚ç†l]¶0ü݈È(ù¦èÍ‹c¶¸Çnõ~›Ï¾Ëü–û{¬\ôòºW^Ý0þµ q')'Ç¿1eê›ÓFžñâ[3ß~é¯ 3ŠyŸÍ,e>`–1c™åÌ8ƃy‰YÁ¬dV1«™¹Ìf3žYËÌg^cÖ1 ˜…Ìæ]æ=fãÊLfܘ7˜EÌf13•qgÞd–0˜™Œ3™Å b™!ÌzƉ‘1žÌPƋᙘaŒ3ãÂØ2vÌÆžÉü‰˜~Lf½ÃüC,Ùc3ÎFcëhiû]‚½ý&û«ìDö¼t…ô6·ˆÓö×OÑ_èßÿç‹ìvêðp ftP«ãǃÿ:8uÈ€!Cv99:–­“Ëî }q¨×Д¡uCóqü¥¦¾px˜û°}΂³Îeª‹z¸døšƒF¼7’¹aäΑ?þiÆŸ2LUƒLU`øÙ€Æ[’z“¿-M·ø¤=Ju C$y“Ýzg%D@jfbjêˆç‚ê@+bõÏö8•­mï#‡À ¨±Ú:h*I+LÈS³#A™gŠäÕìeb´'ÎlÏ¡xÁàapºoDã0Ù§8Ã4”o²-Â\6.ŒnT¥â!rÁËz…“ÙRºosĉ^¸€•zp}Ïñ“¥!ï D¾UÚ³®Þ¼n|ßu öáê3Ù§ï§_t4g9;Ê€ž§o¨0®£Ç›ð Ó‡°_V¹ûop}Y|‘Å!ü¥ªƒ'àwmÉmb+(V AµP.Öw+YÙ“í}ŒS±h¾ë¦qÝå•¢+)æ‰ £P`¿lšë¹vëÒ7Dzpª?5HαÖhkòÁ@zâk?;b÷ÚKd‘}ÿ*Ú Í÷? “@6‘)ü÷÷¾½|ùê'—Ü&¼æ>{Žy fÀ× x¥7vjü-œZþÜÙ“¯ŸûÆ+ ܼíûõQŒµÛ·é@R p(¹ÿ=ÊÐqÒYçè'Êî7f–zÿ.ÒÝ ÿW¤Yë©× ’½F¬¦Æ{˜þÌWB•Ÿ/Äz Û7×-£9¶ó*‘‘Áß½Œ6W·UëE°Vª£!«¡!÷زZºi8Ýt-»‘_¶vúô9nßÜí4~vãÐ,WÁ’›Hzõ87Ìxȸž:øÛ}ôÔº2Ñ$²;ó ZÄ.©Å‚(¹°è¤²nŒÄaÒÍ׺ ª*…{½ã6 dzaæJ6"wµ‚^'\“6§ú ÝýX…9£æ]›ú¢Çqáa²C†KøïÎý€u¸V^ \•®¼^—°ÚêE1‹=DÙ§»,[ö™§·È…Ö+,eËÌÁ …Hl{Oñ7%Œ8’úh‹ï`#ÙçÚ>ý1û9¶±Fdg·Òßz…¯Y½Š} ;§O ˜`4 “=Äã˜ÏGäȳÃrƒsÞ-†¹º–æï?/ ÍÔ±Y±ÍÀ™OÒr¨ OW¦d ^z/ˆ¦9~+bºÏëObï*EÙ½öäÏâWß¶ÍÂúåE7Ä´Šô¢PàÌ_–ÆAXSA¹º­Xh÷9™Ù@a8©åó£¢ì!üLx}@®¹ 8Ù€ ’=F¬£°ZÞ|M547õk€5ˆûÙb·výJàf¼ƒ ŽÃñŸ=¾Ùz1‚0Z1+V“P×k2Š=6G¥%ú)ߦ-e›¨Í/’Ä•,þ™¸à€3û›ªub$È-‘¶„çŠá±NbNú$šŒ0Ëã4k É´Ûì3¤MÃÒhji ¿&ì+W|®]¿u «ô¾þª¨XAå¾lGp³àD­¥ä=̘zÚç¢ñ·^ ‡ à®±åµ=®*EO¼ÍödõwÍ϶¸‰3fÂΫ¥\QÀ¾b ¿&È¢÷Á¾Â¶sHÓOà ƒ¤Æ´ÝÖ4—:ÒÔÇ~Öx6°DBn Þ°oøÝЏð^çšX”’{Å~:ЃK%TCÑΞíõ8Lj¶I¹)ÑÖ´Á|‚ž:1"‘²1átÿj¨ÛÙ5丽ŠM¯‹?œ°/æbF‘/ì JŒÌHÙB„t9§bWáqûv D@ô³Ÿë¡I®¦¬¡ M-@¾Z­Ë*U—@p;8_”! 2ˆãšW†/¼èöHEµÁ…¼#Í\"m oJ)%Fmñ‰õ„dàÜ7ïú°ý«6“#>í"”Nýlq/†ñÈâKö{ÙÒú§M 7UP/ÎûÎCûº^ózž„ö²Ø^û“—È`2Å~‹õ.ö³d+ ůб‹8Ú‡DöfŒ>{vÆKÝ{è hÿŒ*”fytû#”º5¬¢hMèjYû¦}”8Fôá Q¦Xž1~YcwMú²éñÚ¤4HPbÄTZD )ŸvôñyªYmÝÊmÖ+“ÃÓnN‘FkLE»yªÔL:ÑÓ.ƒäÀÿ‚äyÄ/~[jLJ ‹ŠM«LÒ§T¾†)εχu3‹£È¯9; T.6=>,ØÃ'S¡un>”pµ1aÛccB7íÚÒþà:åψûšûlMÛPÂ7CjÜŽLyн~pSçu~{´¥8Bÿ!$‰jßJe p5zmãµÑàIf¿OFN&ßA'wý¨í…Éh#6$XÛa‹Lö|‚ORpj0-ŽG&cq¦fGM([nñW-b·RÕëÌí§`M¡jiцKÄ#'>?¢Ä;7E“\œR %PšŸ_š­ù5Å'9uw(ûÜ+¥-ú^ .§,”®L 垹݈ûzzó¯¼^§Î-·+¢rõONö7HŸQSfIÉeÒ%We@¬‹_T &G¶J:(ãÎZùÚ›TIŸ–í•€î~ Ðߎñ> Ü+ôíŽ&Ísºã$VÖÞ迹|ã"y¥Gx|óò?(N;`}C#‡vó¥Ë=§ÍšÿþÕ®:/w^j_îћˑçq¨ArÚˆ5Ô¯™¸œ×WB²‹~$/¯Œ#ŽdÐñȣó‘ojÍ™ŽIΈN#W¯H Ù0ûXÜWœú<_zíÜéN ú0¬àE ™™ò ’#ÖÓ]}ñ,û£ˆ;qÚNýúí莋«êq¿@6“|~2„éŽ%‡;p.À•¢Ã%çš‹oà hM*ó(^OOZî0?qEâòШIð,!8„–Ùbãý;¶¨1SÕ >Ht„½ù14 é[[uÕå çß‚¸·fmxCX9ÎÊ[É…±Váƒ5V}2¶GìÅœÇ9gNŸÇ çÏF›‰ëó|2LöK"*q>¿bÓ‘“gÚÓ‰T:©ÄäÌm±!pøäEÈOª#ôÊ¢gð¿õÀ ½,¤öÝà ¦á¼E~êh{r 죇Z>Š•=4eÚ5DV…„DF†„TE64TU5OË×éÄe,¿ì}Ù¼y;Öó ©ŸËá nÕÆ¥3CÖæÔo6Õ§ïWU¨´ªŠ€^¥Kœ{¤n•¦´¥@Ødˆ»D¥.÷É×]—|ö'”ˆ›÷nÏ{»‚“=œQ±©Ø»ޏo?zû—ÔÙ‘E©º§ÒÕÙ"·Óbƒ’…Í­+Š=)°lgÏœúÞa×ÏéÜÎQÝ(Íàž1# ÄÑ.ÖŠ'&»g¡˜Ä>«t|¡{< ±àê»Ý;J–`HÈRdÑ&žy\C„6*"26øaŽÙ—Ù=ÓãçFÇÂîuFt1¢3å÷cæyÙù9cÉ +̵²ÂItéV®ê3Îù_󉥫  ]ͦÃ,™òytD©}kŸ¹éµ>ò%SÉ«öøÄr ›U ´w+×ö™»úŒAko±Ÿ]§íáuËKŠžÐô·nh©S†Arȉf²£î5=e z>ßgP$ß±v]µj¥Û‰_ü®IJ·yÞªŸXâxçõîÜEÇ>ú(º'xÿ>W=¥ûB·’î`½¾Ý§¯¿`¶0YoÖC&…žÝúÞsÇXŽÕC«8‹œ‹_ýNÊF³jM×&µ½lrqnýÃÊÝnÝÚBïrh—z¨„‚6®Ïü{²˜¿æ— Ó>³I1ÀXN.H}¢zÛÉ×–HFˆïJeí]ûŽì«.uˆRý´çÜøÝ¢ÿº$ÊAd'mŽß"(v…Tø'»AÊðH³¥ßè£LóȽ‹èxñªÎéŠÉ™È?&ûB oðÛ¦ëÜT—ùÀéJ*Ê´ ™j1LûîÎÐRdÎ9ç•äA%—[2x^Vú#ht)€þþàŸ¬vÍ sQY )à"QD¥–¤ˆ(YJ˜¥ )ñ© wI‡à½þ$3Tå Á.Ià¿s'ì,hT}”YgÎ÷4ï£i¾Ã(šÞÿu oÍ¥+럒 þs‘4P³c—€®}òüꯣ͙¾¥Ç·;qIå.XÃã(¶¸Z[}!A$£p4[ ­¾¾à› Ñd”4þéÛ Å"U·£Ùðm¥‹‹ ãE¡– Ñ;áz»è’ùeWk6¯p_—¾##& 䜢,VÛòèÚ¶~èµ%"(À»1l§&O•×Ç%îé_ÿÒ \×>…öê?G“Wû\»Z=ý)ÖtJ:LlMÓ© Vû¯²Ïì5ƒ‡H¨mClñæ¾-¨.À;,0p[ShËžÚæægYr̈ÒX›…Õ’18ŒØ»qd8q#K‘ahƒvp8RDùRqõ¶öÇ—p¬ñ§ë×:ÿJÆ‘—ÜHÿ·Åoð˜ùû´µ<ÔÂÞìüŠ=_gµ§Ñijh*bIüäXQ• k „›(PøÄù(Ö¨èpŸ*O ªQŠu*”dd­àÈ )ç‰àý§SŽG‡ÚæÆ0u’HFfÃnhæpŠj3öy4í¯-Û©®µÔšiáMqµã’é&oîþÑ© i‚÷ÔU‰Ñ™qª¨LzvXEZYå>ÍžƒB÷Œ R+½æXa3ÁÒEÍýëÄ l4Ú~|–OJNM%g~[)à]KFêzxtˆ@’ØsǸq`ïŎ×à3ÆÞ ƒHÿ™Ó§nkHÔꫵ Åi%IyBÙá#ͧ»ýé†É Ö~àêñ¼žã¡­j\W·8ǸXZС•é´… ™4nþ¡Þo) 8±< s=¤sd¡”2‘“ÙJj£öÎ÷º[e¢ZÇ ûFJƒV¶»|wÙQu%'Máêb¸šØdevô¾9Ê:o~‡{°ëý.ÜnÜBIð¾Éïð»ÎÀ)îú܉”8,X·Ð¿V©3ûSšZ˜‘-47_5OøWŽùx)|·GŠ¡a™>™ËÒÁœì±ÂÂaö§ãï}°dùâ [f ssóè ÃÕDëÂ""“î@jØ—wï ²ûpuý9×&³M¦tp»ìt“}ir5ý/W”Ç%¦¦¥¦A!¡qJØÉñÅñ%r½l‡¸ˆX¹"8b¸¸²¸ò"M®&Ohj¨+/…Bª|JJâuQ» Ê«µº²Æ*¨èmÒŒÁÔO'iìİÛ=˜Á'ÅÓyVÎù¤4 ˜K÷>2ì=+NÜ‘¹i½zŸ°;Sòý„6ÒTñr޼ÕÍñ†ìÉ#iO;¾@Á€S¨.êZiD ò/Ødrá}Á+es$‡Ë0Ejí^U–ÎF*¥1ÑR‘“[˜/Ô·ì«8K{÷o·Íu{kþûo†,Ê?B#šŸG#ÚQ¥JÚ:í‹h‡C~úmÙ/gýH¥¥%Ëmp:%¤¿£²kUÏ›úÁø-_Šùîö×° ÊsÓè'•†0¼B^W«Ó6µûœz™¶…ád ñdOÈ´›ûJ~üÜEl™i¬ŠõÜÌáŸÉ>Þ ¶¶Ë ™•&Sèr€~ÔÇF«ò2µT(]8ìo·N¾7gŠë²y=féMmÉAãÚR&&sÈb?²ˆ §ÿV­¶¨QÈÅ6s çtYYPÊ™#$ÏÙÔòó#?ˆŒ7õФÊ^ŠYÜ@!mô0¿e7¿/¼eØÍÏu?Ôq¢ãèßožY·j™»×\ñïügõ‡Úá w{êM2€8¼9sƲÃkþ*ÈÏŽZ´töð—ïMÆ!èt÷ëû7ÜÎÍÑ 3I ?͵Ãh8{ñÛ»g/Yèº|ZO‡¾…G$ÿfâÏ3ßßþÞößÌÍ3¦K|ö¿üxˆ†àÄl¯âå¬VdG5Ð>™[¡Öš“¾ñ?¯0ƒT£:ql'ŽÒIZMkmM6ø&ÿ7+‡¹²8Öþ¨õ†7[ŠÒܶðB¸Bz°*AA:¿øÜ»³¬üñ1CÆÚ¯µÞø#Ž*.¦4VßœÝXœ%”ã ûÇϹO^ Xzܳˬ…‰ÐÕÊF&»?Ò9g÷<Šš¦?g¸þz|q&Üéì¥E]_~ºnfÛêñ06òÅð„Õ°Úsý¢Dn ÆñD!õÔl®R×äæC5×®•'ù¤o˜vvr‰Â6óPÑܵåÂ)ª<þtB{ÈOdL='û×IÜ*Ý™~LY¾zGrZÄsTÉ×ëkŠÛ>õø„ô/ÚzF‰@‹¼¥Ä&~Ñ;0Â5„Á™\§Ý²Â•»á8=º÷B!gÑ”.{|7«„!KÏ™ÿKð\ÿe÷–vÛññ+¼£É©ÊˆëQU?œB»‚Z¼}BCüB´¾íæ tèM^: ÿ/5ÅñEy%ùTuUGÇ%e¨’”¹M¶$¥Æ'C´ Äç'¦àWÄÛ¹4)[Etyequ%½›'’½èjo†êªÎÛ’=&[“;>à‹wRäl¥H•¶rÍþN³üyB^åKÛè³ÐøMð§OÚ¨¸¤L×ÿNùv­Z×<”¥äÄ“Á_l@@;x°EþmyQ^”qùiºÐ`²‘8“2àðÄÖ5Âɹ7–S2ªËÕå÷Ùl7%À'H løÆ÷ØÊk³; K•'+ŠRr3DœF$ed vÇm#"1AA3 .Y#¯mÄ茠¡¿]LˆC?pèÀÁ‰aþ,Õzöendstream endobj 155 0 obj << /Filter /FlateDecode /Length 1502 >> stream xœµXMÛ6½ýÂî!r»fù!J$PZ iQ(Òøç µ´»j,Ù‘å$›ùí~ˆ"ek“-6°VÈá›÷†CjFï#ŒH„Õ?û»©g8º½Ÿ=ÙŸMý¶šýü7aÉ%<‰V73³„D‚#Ì$‰2NP*E´ªgob:_B9â$~½›/0J¤$2®í£2.ç –qDõ†_)™Œ?©ç ,˜ˆsõ ¦‚³’cœbï·¢^Ë`<ñaXûvõ§"L"Bäœ*ÂŒ£TP ør¶úñMü‡q‹1 ­]šÈD£)Ìà ؉ôÔ$CDRãÔ¢h¥t¤\&TûÞ>yP¾ ½f¯þlíj؉µ6…ÿ‹?zHwÊ®R ;Æ›9X l¦G0 ¶Þ Õ€¯¢ÓaǘnDÛgŸ©oãc?ßM¬iç  ¶vÖÌ¡‡Jƒ•Ž?Ì9K–žî‹…­&\÷M‰ ôn®²„Qe•A*¯ HÜžâ„fâå‡Á€M/'I Ééµ 2Ó`ÁðI©ÜV×mÞÞ¯ã2o»»õ|¾à4AR$ñ¥zäzƒnvm?.âÝç]S; ™Sä]®©†x"tëÁµ5Ðg3µÕRÒ>»·5ªwÅòË¢w’êuüÓsñ—ž‹ÑUoB4üÒ¡/Å//òÛªA>8+·',÷Û]×–‡µ¥3u§PG¥§ª e@ÕͲ5ž¿ÎøÊ‹]yÛ–å’*,ÍÀT24þ@{ˆŸcîš­S°bØ:`øþX}È·eÓYTÉãn7ðR@hpcÔ;ù.;Ú=˜(”bŽŽzêG=1;ùÈØåiÐͲž>Ø–†=%Ššç…ZªÆ}î,à®ñ€úGÂúÍîLŠ 1ΛbW¿ØÁj"؈¬oáHsʇ²C‡²,Ö1¼¸v3ÞŽ›é#¸t™lz0ü7_Su{]ëÈ3‚ü‰Gk€5žnŠòì‰SÇ®:tË‹Ûüx8Tysq¥y@¡ q÷£Ëu?VMW¶ù¦[R·^ªwmÕ¼[o°Aj“KЉmœç0‡àY5`¼úg2u›¦ìΧ®š9¹ÒÎÄPÁ)ÛétÖ>ΦóawÇp‘_ ‘?TŸË!(0P”›ü~‰Ã t»rùâ×—¯ŸÛ˜·WOË_q¿/—mþñÂ.˜ Lyló­£kÉM{ˆ¦ÏÇàKEéîXWEÕÝÿÔ•õÞEìá€ñø®*вÑw}x†Œãï¯MÞ–ׯžúVÚ=øR#jϪft Љ“T—ÝÝ®X^hH{H x²9/mÑ›ò÷¶*– Ý´y Qê_þ)Ú·` ‡h=ïQ€×ŸK½‘$ïÞ:ɤqÅ ÑTåQ¥ô‰^)_Mq&(¢A¦m~P3ìÂ2Ü™éª&©4¾7p™Þ•Òë™Å2VYPQªrS€ IN«v[hjâyXaºÊÓV‹”d$(zýêôƒªÓ‰H©.Ÿ•rVÎÕ™²\±Ê@·_ÚÞØåXöUí’<%$= å6$©ÖAx9ºþP¸ò+íQàÖ¦¨†$ÀÔÕ×s݈@»æöEz}Ît“pâC—ä£j<Å6ž&VYlåÐt$"<ëÛ$Ú;ÓT𰩸õžG Jÿ¬N/ÎJ’”½G?åÒQS˜6&ÌëæF€‚$Èm§@õ£îëÚn L%ê’ÐÉFbh8H SØ.9sI¡ú,•sS­”sMã7CÚ(ÑÏW³W3óe }àcApô ((å8‰R‰Ò”J÷± §àá?š%ˆñ,„¾zBêL"BGøüi¨'êÅðý˜'e<„OŸ†8ç’|?æ)FÀ0Ä'^Æ’§‘‘Á /ÒÀÍ¿g¡ÿŸŒ,C2áÓ2ž(à󑌷Þߺ€=\¤$Zp¸–¼ õ­•œ!ñjö„c¹àendstream endobj 156 0 obj << /Filter /FlateDecode /Length 4649 >> stream xœÅ\Yo$¹‘~û íW­tò&½žÏÂ6¼¬×¶ cáÞµT:ìÒa©4ãþ÷$3ƒG–¤nÍ<©,& ÆùE°ÿ±±ñé¿g7GãêòèG‚Þ®ÒÎnVßžýüB­„¤0zurq?+o†Q±rF 6øÕÉÍÑ_×js,„4ƒëï6ÇãàCð¯¯ñYÃsëöÌßïÙó)>‡q4ÒMïEnÆÑŽ~}7¿¾}ÄgŸ*ÿ¿'ÿ‰‹•C0F"ÅÊÆù°:ùîèäg]ÿ7Ž–ã(dXï€Þ8•ω«yXY˜õCšV½Þâ³€å`iXN SÐÆÄüwXŸãß[¶À#{¦Á—øÂŽ£òv}[>Ç™Ü0Žn}¿q èëü¿S6ÅÃÈòÎ;¹»°£ˆûúé‚×l‘»âó8$ˆH:Ÿƒ“NÔìØ§i彯U&Ž·lØeœß |:ÎåÓš!çÅ2­ÓGHl<êÀOZ:1hâyrÂøÀ>Þ²çGö|Ïž“x¥uÜDg<Ìc„ÆQëc|Q*²7¸fÏû…gNÍùüÜ^¸AÙbK‰1ÓR¨xtšOµ´ X€ti§²Ð‚H޼Rv¬\¼XÃþµ¶¢¤f-(ºdJÕP=+Ò²¢Ü•r¡F B‘4~“n°BØVãvY%G¯Üú¶ M¼gJu…ãPáÈæàV¨––J¤9?§÷Û¼¤_Ÿ-0ôv¦1) à:w‹jƒÓÙq‰|bû£÷Œ$d­6ï}ÍÍZÉ¥p%‡Í±–F©õo6^MÆ7–cDËQjöÝEEL®ÎR{“Î(’n£ Á¦£T®8J’ä]:xÜ#càµ-ìMÞ v56áÃt⸴Kö<ÍÚ@ö góðB,iAqll¦¨iÏ¥zÜБ{ëâùíj¼N §ŸI´Q×zŸWpi¾kï%Ñë®éÅåQÏø||ÛW¥ÈOK<ÄOò÷Cá<‹±DãcŠu."i¢âúAʽEÏÞuÝÙ܇ԃS»ÄÈàwlÈ- ƒÞºBã9'÷Íì4Ù?eM<Ú0a4aJ\À ý…|°kOñ§|(¨ uÀm[M ÿ=öccB%,5™OĉNÀR± §­ˆ¼?2Mû¼¤ŠóUŽ”v1M:í»<ÌPiÖßãQ4¶q$ÆUÍòù7øû¬˜¥ø»ù4K¾‘µÂHNÖŠ$ <‚±NùbÆ*l~Â.Mô0“LŽdR¤3ª¦ZbÈ,Ä̈́טF\~“†ÑþB¡ÔÑ.¥Ý•vé1ɱ…載ƒÛÎ&¡†%YC{fo\†é$5Dé`ª½‚­ŠîÄáÆÐàEˆŽ‚Ü Gžê(¸rÞ­ r\Žª¦C섵äñÎÊ¥ºc*‹3iâ5àž›H™ÈùXÙgÜ=úÆÆl·Ïx¬¿>9úÃQLÓ–37-‹P2enhcÃèWVƒoÕ"fn¿Úè0ŒÏÙÆ ë”eOÛÇÇëÛËäÀŒì¯¶ÑVÃoîðS¹>ßî²YŸŸîO7ŒÔù¥èQ©¬Ò%•Y؉ۨI(ÄvÔ¥0 †|-“tƒ7Ž/¿¾ßÝía·'ûÒ=åœÙ*‰–#îé{AÏ)"×A.ûe¨‚·”•©;œ¦”Á'w§çdý·øµùÕ>ÍaªZß²gÒ”|“§Üžçí<Ÿ'qqþL/}K’ï•Hš“ø-£€åóӔ諞. ‚6QÇâqFô?9¸=ïQ-ÏøìSöÈVº½œž§,sf£ÒrPRfqŸ¼N¶1>¦ŽÃEc__Ïgóã~ÜËóŠÇe€g ¿ ¡ìK¬ßÕ†¶Jוòû•±kƒNÔ18Ì-‚/¾¹‹Soê}ü£ž§ÄÏåØI*ß"B$v€~Š™Z D å…qÆôÜC`~+úãæ½Æ5,HŸ×«W†Èò—ÒÈé}³‹vžž8š0h¡=Ë‡(ÍS<3ÂoÄà4EB·$¼WLb2Œä£lUPÄãÿ‹ŒÌË£ž–†¥ òï⟻äã®§ÔoBíúãši .¯F‡‘ ìFC3zNv õ«Ó*.ÉÄÄp›¨ö/A] =BÖy÷lڀ㠛yYÚ@ÄŒ!O„Q¦€?¿'h@DÏ•ØÓZ„K} ÍüEú”žßFŸ„_«ObýqÃF|@^Äm¼°”Ôwl)-Ù`­Öš ⨇´ä˜ßÕàwÚo3(  :Ÿ²P“ÀÛn@˜IÏѽ‰O&m°÷Öe¹hïjmK©’” ©¨¯¿ë°JÈI`Ã&´;‰›}>%G†yø­9•p,¥£,”óqE¸ÃsÁØv¡8gµü-+…†ßj‘W-7ü ŒXOØÍ›…BÆG)C˜V(=JᔟLð‹pà5†º çQT&xo)Ïk°;Z÷Si¸£Ð#½A·¶ø"éGï y}ª…rÉA¼Th©4vúô¦^4aÛºÄjÓ†ÅA?Ï« Mäq¸Ñ_%|I%^+|2äUÑ–ZEe¹O©®RóÐõœ7¥ŸãùŒà» öÑ@0ué&ƒ,’@îO™Ÿ¤X!¡f ¥êØ’’g#\eÆ›¢EU¼Áèg©Ã¿%|O’PqÌ/ÔÉ'*›‡3¢¢-…[VŠËˈC§ùnãÂÀ4£8c‰ïÏjçS—8sÇônó„’n;É ÷;)Žëpζêµèü9éÕ!£iË )jÁ"«cÉÆ B–µÓ´Þç8Âj=h_$† »ˆŸ¡‰ºATTHi"{|ööƒô"Œ!àPPî?õ³¿ãúÓd”3tœ÷…Þ¸¸Í^h&‰éÛÕŽðõ+;(µÙåäø"ÎŒÀvêp)XŠ[2b+*¡åZó9®áBÊó&ôK]Â{#+ïç2z£¨`‹ß¢ßj0ÌWÄ“ÆZbÿ›8êˆðµc‰ç$Û,§†Ý-Ê|.%€ø,Xõ#:”åƒibÛiî¸æ×û«~ÜtZj¤ @w(ôŽrŸ5–i†ù}1¨1ÎM9%Xn =y¢H£-ZÞågáîdQ ôÁÆÖºE„SŸÔ±/uðjL©ŠA“ŒÜcEVsš´©Ê:q*Ï€¸Æ®(ˆ(°Afº4b7i;þd⑽ĵ©Û³xo¡Ë| à¡ÿ»„kM¡--ÙÈ¡Œœ^Ö½gÄ hs£à}v ƒöv%‚¤6곓éØÁT}E["O”±óx/'µ%þ%fÕ!ZeÇúâ~!dŠhcÄ«¦UœVöLkÑ ÙéÌ·Ís(TÂCæU`ð1úBÓW/0£|Ì7ìùß[U|ßÇ­àÕ±çÝ+e-hÁäú/Mm€ L÷˜ôàA:JL’w]ö*/X" 1IÝÏ—³šî̤ëÔû¤ºÝËE/,Ô-C,¨csw.‹e³ºWY)bU¿¯JR ÆK:~p,ÆÉgåëîí½xLqžœ‘äÿ—/©X{› óAe¨š[æ„ñ.€Ç±Sëè U1G!<Úh¢®æÃÔd)n†|»×ôlŸÛ$§¢ôõ¦¸˜Žûšæ›þ)ð~تòÙ‹„$v‰§ )U¨N㸙·—ÖRL ä'Ù)&Ôל¾¬+APSx>šæF` 7 øž 9G„Õ‚×µáa×—W ¹@ü4Ÿ:]#±¥ÎHQwJmJêßêú5_å™’ŒmAmÎýw³ŒÎ×âb–ô"_À‚çc9\†2 þ_MG± „žAP¬2¤{ü•z½"Êi+Øß v½º¯zºPME\ʧls5\º˜—*ôŠ_\N,†Ä°På%'îµrU …©Ë° ‰«ø…ðÖÅ›8¼OzêãH%‰¥Üù%MØŸãÂ^àÕ€hà1¡‘ œlµ=ÒšRçSÍ˜Ìøþ°ÅªŒúŸò" ~ÈHDµvóÈN²œ+­td½Öø¥QÓý“-¹N Í,òK7ÃÎÏ…šhâU GG•mä•prñP½ ¤ÊÝc©ŽM(5y‡µÉÔ‡¢bwÔ‹£ôS¿EkD†éŸ+(«x·ù@mðk›ÿ<Ÿ5C ÊùNèÓöí.U‹dÓþW`Iã:…A^¬KÒUà[‹–„hº[®<Å;/þ÷xÉRiA°Í¡Û… y’›{¦¾(OJqÀkò$ç‘·ãNÓí•:›¤[4âÕ—ZjèN°m R¼X 3®h ¥_'¯¸— Þ¬§È4=EñV‰9\.,ºAÐMŽÕ­”fõóÌŽlu)u \àÂÂOJVIke2_×ð\Öü ÝÆù3׌ÃÒoÍ ½þàóAk¾2ÿôA¯Ÿ²‹[O¶öGl‘nl$aSx]}õÃѸúí‘7(YbåFpZrus$Á;£É/vGZÈÌ ÄË)ÏQ¬©ë¨ð"ê ÇDZ …,/ ÁJKVgÐdku¬àÈì(K4h—ÍY6%1 ÕJ¡fä«’4d—x À*Ü‘r#*£ã§é}úTåë[6 ‰Þ6·>N™Vîå„|ý†oÙðÄÀ ‰÷ý°SGÆ>m¤D¸¹do§ÂÙiöý€Å|ŠSƒQ yCB©œu£ÐG¸A‘ ~d³pÝÎ3ž±!ÛÌ8ìæ¦ì@¦ ‰Š.Ê¿ }Sz>jÐ!ˆ¹vu}v5\¿Éb-~¡7Q1,ª);ævv'Eñ(æÔb S1ƒÛRˆ?ýR-:Yendstream endobj 157 0 obj << /Filter /FlateDecode /Length 5286 >> stream xœí\Ýs·‘g娷,«ÄñàðÕ=(²}‰Î¹ºH¼ø!ÉÊ»7ZîÒÚ¥uÎÃýí×ÝÀÌ40rE®e»’r•5œÅF£û×À÷³¶³ÿKÿ^Ýœµ³wgߟ z;Kÿ\ÝÌ~wyöÅ+¡fÂ5R=»|{?3ošV1sF46øÙåÍÙ_æ¯Î/Ú¦ !¸àæ+üCÂ*Ìßâ³ ÁŸ½ÿ€ÏÞ‡½ß^uI5ß㣠AÈð·Ë—H‘˜ Ñc$Rdoy¡D#­].’¿œ_ˆ¹À ôîÌüoç:´ t8ûn[è0Rë ç»s ¦5ʪù ~íTk9ÿæÜ˦mµÏš¯S›¾¯%¾ /ideÍ|‹/žaW†·óËs//TêÌ·­&ëç‡siáÒEÈ·¶UÞbk¤Æy=ÿý‚½ß³/¬Ç5>Ãäm›S‰¤X¦6Ìy7Ûs|'[-…™¨ÖâßqMSNΛó é •ÓÎçtHÃâ^²&Ä·7Œº4)œ˜_³÷Ôw¸ j¥q‘«|ŠÍð¥DK.%JH4”^’Wç:4Æ£”œ·²óww› fZ©,,ï?‡õÆQ [èù“°Æá‡k ZIXRX·;ö!Ž~!ƒn¤³ ¡­­ˆ£þGÚ¸°Ú®> póÅfýþ¿iâ~äíü[6æz›šxàćØF‡ùiâÀ `h6ÎÍ—«Í¾ë$j½èþ0ó»~λD‚óåz»8¬b+œíWØ­ ^¢pî¯hdï$Ð}8¯mCilcœê Ë¡€8ÞËç¯q±^÷û@Áf.™0µìYL¼‡AÑÌ_”’t˜ØEË4”™Üâ‚¶æbç·ýVM¿½cÏ©+Ü8ݯ/Ïþtã‡{teÆ’NWПÞÎì6ªJ; źÿ䞥j辬k`m ­dë7» „­óL5ʺj|Ý34é¸ì8Ë®EÔቷ…~SÚ£p žÄ~DëIÞ)×XW¨ë@§YÜù „ uN®—àëeúMèN_h†á‹;¦Þc÷Â[IÊÈ`™h*6Ø]©Ä·çÒ /d&X×±2ÃKèýoгIŠ€uÄ…nÃHâÏ;$OiæK±Þ²fï"í6#”O™“ÃûŸ²b‡ÌÑGÚͪÕ`“B·{w}¿OßÁZ¿‰|²aþc÷RE]ô}WÝB„(n¸¨qœBÒ‘fTNÞ áB\}¾-;á.õ»h}ãUR?óíêîâüòïg ƒ è_Yèá¨õ˜®Åf»:| @yì”`#@=±6ëíz‹Kn[Pšoé¡FÚƒ^lRP7ÐåÇÎ"´ $éý¾ª2…ša×&¦?‹æöÏýºÑ¯ÀJÈœ+ж°F{ ° ¦ßÒ'q³…ÖÁB û@ȽúOßÂZ?KL?N †š¦RŒõ3k]#”Œšêšw˜x¾-¡Nzþ’=1ñü‚=¿Š|° üçÏÙûÿÊÙ˜·OÏ >-x[Juý½dcz¾š˜"6‚AH6ÚÑžä‹–tñŒ[”T¤öï'ÚŒ!=ÿ{®÷«mîJ:“ðñþ7¹‚¯ösȹòH )acË gÖÈÆ2 é,(ñihB¢ŽP#4!Ýx§UD›ü—§ û·uùdôIø¤À{gkÄ'Ž©GÓTP¨: ø*³ÑX#ƒƒS ä®i“_“ä‹CˆœàbW€è0«­~ Ìk#EŒµ«àŒ){¹‰øLÖ·ÑzùL?Ü•ÍÈ‚s`PtÜ·!÷ñ7FÂ29PŸÉdüžaÿÁ“Yî¶k´²6q½»ÛGæHæo3/çªÿlµOß ±]¦öÀ²Ã5‚'}ÆåêŒò Tcdi]ÉR@4®ÖÕfðkÛøÑÿbÍ dÍ8Z vÂôˆ-œáçôå®d=m¹Å£0(ÿð-¾Fèæ_çðý^Ž˜èŽ<Ñ`Û»ý™ûä…DÛœ€« É¥‰¿¿Ir+â—Ébï»Ù•N~&n_¦`ÛÀËi‰>ªÍÙhr…ú ±‰"÷’{y=;öìsi àED¬ c$¾“¤¼[\Pïì(.&I-8µ2úó:ÒêS{B­.Pçº0ƒžÕé^uµ.Œo 苬ëÞA,f!×ô¹®ëóË(cà6mIX™â¤Fñ²Ô^ƒžc®M©_E¦–—ÂF …„ôÀ ÀÕ6F‚n2Ö)Ÿéð)q¤ìŸEµÝ=ûÈš¿$ò$RÑù»EØkʈáÁÊSÎÔ¸>}ðê2êcŒm$Ý‘"D›ÕÍj{@5î$)rUœ&b_‡õþÐ)|ç¢Ï‚Ý€Cð-¹;¸ÄƒÉÂaè}™Ô>úÔ¡ n}ÅY`ŠÚ8˜¨È•fƒÏDÃþý¶}›"bÂÀöÚF:1NºŠD£D½Ѹè†åÄ/×W1|§%ýë\¦ï3ž-רì¯çõ êÐAÉ nô‚bGäºÞ®k!bì¹²€RÖ'Gk9éõñçoÓΊA ãA¢çb˜x\É4¿|%É ç¨ŠËë²à7øb“ö¶F·0Ç;yˆ}èõæé^¥¬ž Ö¦So÷z•ilî}Élù”'ùqÂIy“/GÕSå4p`Ÿ·ìyÊÑ[NŒµšhsWŸ²\hÐüÅõÔÆÔÙÑŠ£±´!¤Ml\\¨Ï^‡i<؉§Ä.ZRB÷ÜC`ºt‚.^2èbêÐer/þ7z=,Õ2¸AŽEBÖP%•ÞtŽU\ÀÔ:_ľü\Ž~ ¶·ùoºèdò®\ôyòÓDÐc=Ëý“aë$Š_ò Þ2ùtÐú;>ÜÈp!6ò‚ó¯3¤5%°Cþr‡–`é¿‹XÉe-§r—£)# .º¦Ï·ƒÕ]–~ÙªcÃI‘Ÿs Âu&|Ó[«u¹AnÊÀMœÙf½.-#iWÊÆµ®0­\Â8#øó(VÚ @0Éu-Y"‘løûù0Ý"e#iECáûÖ K—M¿’œLÅ÷—¥,?ÒM·@W~vÉÉ£—ÑWx±Yì÷ëß )É.OÛZÊBÅØþRðê' ,<ӛ𢚯 £ø©#×2…ÿE%ü_…‡ÐêE‹¼Û–ú9&·ÉŸ{µ†aríM¡Ë_¡?j+*9ËÓÓW0+¡Ü±Ú?EL_€!ÃäŠvàPëǯQHÿ 6 é§ç£Cú©ÿ§†ôûŒJ}ºÍD?£À}eŠ£À}e¬Gî{‰¹U ÚiñZàÎò™°ôqøÇâ]%d¯ÅçKë·3¨ÙŒNŒ7-è,J^¥¬¾pÍPA>¶Ž|žwfAP®V)Ôs ¶ˆÉ輤QQ—N!(s®ËHàÇ8¢u0BSÅD˜eW± d(˜ÊSsá¹'¤”!#8Õ 'Ž QN4åœ Ö–ñÝH°êrå1UïÀ-ˆìOy>ç]lb`…~‡¯ûG};pRÈG‚Íd SS×H£˜¹Â7h^«õ`úž‘Ó2k«ã”&Ê7ïÊn"f­Ò†0¹¼M£-1Â…¡iu³eFz»ÜÝ|sî4LȾ®Io÷„Œ#Ñ#–*,+´éëVÁÜÖ7”›0’ª8"€0š°ñ‹»ÃfÅ“ù¿Ýw?Š’€¸D òv—J°O}Ÿ’#ð9Âáó{Á ö ¬ËȺê@PÌ»8ž}Â ßžÍ ývŒZà i˜h¥©øa„ZÒþæHE³÷“÷Èy…æÜ´šúÍÊç­:837ÓX˜q @©Xà=³Šª9ø§(‹9@ù0ñ-˜-'èçq¢oÊ6‰Î4LİžZŸ×†L™!GmUzˆ<ª0ªœ!KÞéyJ”~¶8-ý½Ÿ ‰€êÚä]÷ ¤ã«PÈÕ¡foÄü;ø¿”:åóˤîPµÍ…uÓƒ“´8?b·ð6L¦mX´¡"öù9ŒØK8«e¡ß¨Rþãö¶·‹õ“32å:0#IÁÐÆâò²DÍþpñúû»ÅPކ¹|ú›‰LI, •‹³¸Ù§AE*j¦ª^ €J"Ñ¡H9A?ó«Ã0t,>)ëòbws{wè h_ídã­Reå@2ɰG£1¥à[ª? re6›Ýz{H•À4JvéXdÿgÆ×õêc_¾ÁÛ°nÕüØ{nïë…{@%ó!-„&ce­3nPx=•í¶LSóÌ79F’&ÿiŽ‘¥Iþ¼~‘Öª‘RͰ|ÄéS–;k¬v.ëyÛ±‹¦ |]¼Ná\,“Æ`ÙKNoRYÏø F5ªKy7|ž%¯+pí”ëë[8¼[ØCs»Ù!˜µZ66ü3ÑŽfRé¬Lç¦Ö¸£nv}$ O 4Ã/IeRY°M¡¨íõb›‚ok¡ej/à~a¬Öžbȸi€ݤC@،ĖtÖ6 :z`Þ³ºIÕIŽÁµ‚½'™0bø…FÞ §F;SXáTÞ³Ý>5ï9õÌ¡$‡_ëÜzöcñœén¢ŸO…¤Ê9VŠN?Lð¤CÚ6GÚ› r% q¨§Ô^×XS¬æSjTöИö¦“˜ÏˆmçØ@UÒ»³’h#^p¿ J&ïî1èèÊJ¬¨n ¡Äq–гð}»[ƒF^o©2“jDT 8 Ì_«®ÔÇKpŠt¡óëǼ%›Å‹RµÖ1ÇL¾³ˆµ¤^!¥wÌ'cI=.Ò\Ô ±ÇˆŠ~òÌ͇ØÄª.ÃGªJÜa<ÎtJÜ<௲Ÿ4xê¥,½í¥f¤5’x’¬$wO‘’ÁÊ4©gxþ+µ_3æHí-†a'¨ÄE¾˜ s7ÑÏ;ª.GaÍ;¬'š¯Ê©$n'Ú³Z §ðQ¬6¹$üºŠu¿"›ÑÄiѧ`œP#¾%'߆ê ~Úœ+E26‚twgl¤r›ŸÄã° Øþìbï›ÆÆ[_w'b¡’õÅǾR¼vØ£âÒ W¤ÃÕ†X/ï›ý³®ÖÜg?ÞÆ£f²Ý¯ž¥‚x D`¨[Z7¢kÁœ…Úb$‰H^~ºJcd»ìKI¦žºðƒ¢ ? ¨[EicäVQÑáÛ£Ü ÏÞ7]m*~)éãëêç Ÿ«Vz†‘$~÷¿è§1J?uýSݘ £÷%êAÙ€#žIÕ+Ç3IŸb~²³Î!FûåÝ´rÅ(àìFÖuo‰È°ÈqÝS1Dš”§úé ‘v1¼úÕÄò¦N( Nÿ€x\¶J–R{’ÇVdϹböœßhÃí2ÞXãH¿£;d@µå˜zÝ[Ç©dÅÇx?–U“G;ôcì o"+buøÚ=£»Ž»¤KЙÞþB”wonÐ=ÕñŒ)ÍÑå2“wg©xwåb]V>Ç®¼ÚVCìsh}œ¡ŠA‘ü`Þ©â}O†R±PÜhÁŠPä¶S)ÎÄì~ë¨LíUZÑVO9¸lïÙ¶£ã*XÑ¡iʪºÏU=ŽU¡ô‡˜{”ñ9¦|Œ Ë ÕMI!õt 2ൽ¶<$]¯y±Á v»Áz$,ÑÅZXrk‘ø›¡:! "¢?ANî„>2cÖù ‡Áâ¬ø•)Uu#˜Oò!îQ÷Ï&Å‹8‘ÓX~ª,ÖI|<ò¤á'2aýI/öJ~#@]–IÞ=LŠÿh_iß)xy¿~O_}ãWÒÅ¿dý~˜ ‡Û­U¾FÕõB‚K š± “òWîAÄÒ™ÏæDz¾\¬ÍˆQ™¡¤ˆ¡Ñû=®]bÞHŒ|•Ó•X¡íóÛ`ú2}k­®ÜÉ4uwåöù}W¯;²KS…×]s QIdþû{º&(` itüht±Ø@Î×s¦Wþ¾’¾QpŒüM'CjÈÕïdO!/íXŸ;N‹¥fºÑ$Þø¥cä0Q1ÏW»û¸4{$QÀ£FÉRóÖ®È|Ø"‚7œK«7ž<|âÄ8Ó‡Ôð¸è½äøº>:? Ÿ¡³†ê-xÊŒØapôÛ“Œá¿f#›—â„£»,O`óF僕~&"kOJ’Á¾6àRÐqŸ>>Gf%Nx¿Yy·ÁÓòeŽ*WºƒsNY(ÀuluÑuíhã'lò©/ÖAç#êÀ‹i¬qy×£$Z,û›]hÕ8’…纲vñÊŸÎþ©‰tÄendstream endobj 158 0 obj << /Filter /FlateDecode /Length 13464 >> stream xœí}[É‘Þ{Û?¢_ Ÿ6¶Ëy¿¶ÝÕj±‚ax4öa¤Σ¡ÐäŒx‘Vûë_䥲NÖ!9<Ñ«T€Ó••—/³2ÿp«}«ð_ýÿw¯oþpL¾µF›Û×üc 6Þ>Üx—õægfy¸ùáæ_oßÜ„%zÓíŸnôíïoÔí?ßhµ’· ·¥½‰K¸&™%áIœZœ(_ßdmOìÁ將ǔ³‹¥v1á©Önýýëml^|¦g´]TÆ3Z%úãÇžQ1.Þßåé=ÏM9e–ˆQ®í6 =ç”^¢½õ9Ò»"?ͧ2Þ-ÖÝú ©ÜA ^ës .çzÃBÏ‘œ­ÇçœÕ‹vŸxÎåxø]ôÑC†½N4$3ŠÑhí–<È­7¼Ê1Ï,«é+näØ^Eb”Q‹ãsÕŸzΑÞl;i¬Ç_?ÒIcµ‡ü×—çhdqhzmxxY€.Í lãU^bþÔs.ÖR×› Z-jÔ÷Úö ·˜Â’7…´d÷‰Çôíï`#uè%6•J±dû6y¦E™=J}êajçáæû›¤ìâ yÒDÜì”lI üœui iRŸz˜ÚAÛ9%R:iÝF¢ÁV;¥zô)“±†=J}êajmk2©%<3M_üB¡4CÀDЬ¶™Òžz˜Úá¶s&+ƒL:¥KÀ82»äö(]çípÛÞ§qt¯WJ—€Ñ‰5·Cé8om£#ÜÅÚv§¬-‘,z—Ò[:o‡Ûv:/i”w£¬Ò5ÉçEùÊ*Ýóvж"ÿymŽRõß½¾ý‡g7ÿý×dʰ4•Âí3’^a¹%WI ÞdzQº}öúæôþåëŸnÿ' ûîÙïoî齤{{O¾ %šÏ^Üœ^}ûÃíÿþ_·ÖG&h¶Q_î©5ò†‰y^üô;jåž&"XÈ‘Ñ<òµ™œj3ï‰Eû ޤ«È%BAÊÅÁ˜À]¡Ö=™ByM°–Y~øðúÕ‹WïÿŒ+°rµ†„M®„ú¤³}szñãõA)N澫p÷Ûg¿BÇŒ¦È‹ª4úÇWïÀã¹ëÿôìæ«µd2nú7‘ÔÞ’+¹ýÕM";Í“ÐZ¦Ò ”ú=G˵åæõûÛ-ýüØC›TíO…¥x7#íÓ¨Kc¥4‰õ§ºT{Ë]òýí«vZW ¶QœkÉÜ?ÜÐP4B«‡kÊì‘)y@·•n!‡ó o EDj¡ yŠ\DMÉCÂLwDa¤¼ðÜwx(.qÌ_½¯&QÛ‡¦ŒŠ}æú)˜ÅÐ2eJ‹±ãÛ)ÃÁ†j4 £ Šk£Üù¹)ôÇelpȼêK}†:ÌÐ1r\äZòÐy¢X tà^ªFJÔðTæÐrøúö¦”µ‡Mq}[ÍVuÓÌ'÷Hÿz[¼|€ö‘]°§Ä1%AqÆêC&ÍŠ2$bW„‘4xz!þ¡Scæø ¸=äÇ4»àîH•Œ™Tä{Öõ›º4P, 6ºñ!KF¬Üذ%¡‘“^niv%;v9‰Oã ,9‚ÔǹKhÏm•¼´·k bàønJÓØ=GŽ¢v¦Á!ࣤZ ™ð*ˆPeÕŸiâ\›í"ooîZéëšë8Ón7„aa…` ŽìžüÐ` o°£y&L–UÐ.¹Å¥Q.S2G…yR&­U©Þš…¼Ø xOž;å F½±2ç3 TP25¼=ê{0Çò8 Š»…GÕïQêS]–½å.ïþö¦’ÖÁUkm]±mœ«î›,J•W¨‰tm·‹½½ºk¦÷®k¯àLÃݹ²ƒ„)¬‚K¤Å"XÌ…Á«š@>ž7ÍuÜêÅF§Õƒ‡2ÌÁËGrÎ5Dªè¶Ù{$ÓÞF”HµÛDH~Ñ»ñí”ë•øÑ{˜Ètòát¢Ÿì¦ßËk|¨ñ¡¾xˆµsƒ¯<}ä ª JÖðTèÐrúðöª˜¡‡Uyë ¶êí–À9gLˆT1²! ¦÷ê†-ãF„ÙQŸü(æì)áð£*rT˜ƒº2ÕÀv ÷FQÝ7Ež·aCñ®Âý) àF-“3¥þ /7 Y^ïъ岎€(>¦‹cÀÏt r›C¹^Þ¹*¡ukUTëúªÌ6¼¡"ª"L Ši0*ÊÁª¸¨*L ªm5­bW ›´oðoæ:Á« 8QM€¨^F cµt!2BÎøº ¹ŸÑ“6Š4äåüFÙ–\#0ÂB#dŸÓŸ²p¨ilÖFö’Û-êú8öÎRÀpf%ß:&†{~f5Úì`õÕƒÔî fP‡0˜Aæ`U#%m,§ÈrhµŠ{xsUÉлª¶u[Åvðœ&FÛrØ€#7iô쀊w¤¡C\%JXÐÍ{3‘A¬ŸƒãB¸q”¢ä!ÊG“¢g4´ÕŽÃÀÖð”'oÓØ0uŒ£èún"‡ÑµTü/ÆŒcðä¹½bä.¥>Õ"ëÚr‹¾ëÛk€îì1¼¢…ù>Ξ tY ”"®þL•çÚjy{q×Jï[×\ïÿ™v»%8ă9PCˆä !*²Å£Ö%;邎ôr3¦‰&+ÓD½á`·*5’§ÓÅZôyC1ºB°í©DÃrKžú3V &Ѥ0cÅ@”o1Œ‚Ò"d«ÞgB{¦ ²·Û…ÝßÝôѺ·ª¬ ¡+µrU{“Ä@©Òê5®ív¡·Ww½ôÞuÝõœé·™ÂÇ`¹¼Ë!R¹tË 4[ËùE3ÖFŠ*_Æ«”2¯ d£r*pÙü-—ç,l‘H÷d¾1P[<íúƒäʇç¾9i}woPywÒ‘Á2 žmÓD¸øncûË åÓîüÕ&vtÁyCC£°±áÐ…ju¢$ˆµUÀõ¤ue %C D±0. 2A¢ðêE-Ò'§¡+OBÆÏ-%rgúøM J Û„´á݈jÑŽý³dt)c°ÙÀÖÚ8 âÞŠ®Æ>ÒUÕM#¥HlU~“êªü&ùUùM;«ò›Wå7-o•ÿ1ßèÔm[1—,h\ÞÂðQ&føÆoN¾#ƒÌ1ØÓËw쩨~OIó*€ôƒg—óæÇîrhàÖ‘|þtcQþ#aŒ”ˆxÀøÀTZ)X?œ¹V i,3“S$;2­”•)R„R¦NéLç];Õ™>TH{ޝAnºAFQ6“ÒYnêîÞ'"ýäéGoóIƒf¨.&šö,L¤Å…R"‘#  P¢¥°ç«”&&@ô€h*eä ~ƒ¸eÃå0F¦BØðD]Ÿ;S¥Œ\Q)^[¹eÃU†30­ãû,‰CÚ÷»¥š!¦ÀÆŠl«È°Ê#ýbø—@.ƒ~qü ¹_M¿„‘-­lä^v´2ØI.Åj7ÞF‰Îø’¨ô¡N”Ñä¿¢áZJ¾k'ÜÆ!‘p·$Hp·o_ÞbcË'2œcÌHŠi; ©NâüðúŽKJkOž¿õÇ;„"mòéåí/^½{ÿ–„@òHÙŸ^}Ë3>…Ó‡÷¯~|Ã!;¦Ú.ì3ŠŠLùçß¾ûÍé×/ß½zñáùûßÜÁ¬ ‚Gäõ(Áçš™X¥VÖ•jŽCƒhß(•«Ñ(ê2•Z7Bái$êÛŸÓÚ”ò°P˜k¥q.r‚¥p5Z²ÅJ‰’û¯•… ýÂß)/×P8*)Ç’9ìE Px û¢Ø6‰ñŠF©L•¦kL§(FJáê´ p\™£[£®F£š„™ ¥Ö5ót@¬Êä¸Ò¬”ÊUiNc• \šw4Jáê´Pmˆ"°ÊJ©\•æU‰ÖDIÈ ¥r5Z®Ö “4Û(…«ÑBÍ56É'×)…«ÓR'¾SȶS W£Åš‘8ÎS§®N‹q!pV)ÌÕi¨‘™ÉX†! ¡ðTdË™ Ãv+;¥puZB´`.ð­Q*W¥ÂçÚ ÀW(…«ÑLÍÓ>.ðÀLd«uØAjWJaê4^,".]_¹S˜«ÓÈÓ+õ–}u£®N£$‡g©§øWàJ¦®F£T€Åà“b7Q…§“bÉ^œÏUz…R¸-ÔºÀ!‹Ê¦S˜k¥…jñ!‡´Jáj´X3Ï6ÊF“TùLÅa§ ¾2ª”ÊÕh®d×[Å/æZi¹ZÌ1ƒ!;0Ç †ìÁ32ã² sÌ`È.Ì1ƒ!3Î1a!{0Ç †œC[ dæ˜Á=˜cCv`Ž Ù…9f0d瘰˜cCvŽ3$ä êØ!{0Ç †ìÂ3²sÌ`ÈÌ1ƒ!{0Ç †Ì8Ç„…ìÃ3²sÌ`ÈÌ1ƒ!{0Ç †ìÁ3²sÌ`ÈÌ1ƒ!3Ì1ƒ!û8Ç„…ìÀ3²ƒsLXÈ.Ì1ƒ!;0Ç †ìÂ3²sÌ`ÈÌ1ƒ!{0Ç †ìÂ32ã² sÌ`ÈÌ1ƒ!3Òq†„Ì8Ç„…Ì8Ç„…ìÂ3² sÌ`ÈÌ1ƒ!;8Ç„…ìÁ3² sÌ`ÈÌ1ƒ!»0Ç †ìÀ3² sÌ`ÈÌ1ƒ!»0Ç †ìÀ32ã²sÌ`ÈÌ1ƒ!{0Ç †ìಠsÌ`ÈÌ1ƒ!»0Ç †ìÀ3²‡sLXÈÌ1ƒ!»0Ç †ìÀ3²sÌ`È.Ì1ƒ!{0Ç †ìÀ3² sÌ`È„sLXÈ t”¯BþygƒT߯³»A*ÇXW£l¸zºÞ¹Æ¤¾qe OìL:W¥Œ\‘}²¸eÃ…]£ã +aÃÓQŸÆ³ûŒ›é˜²îHZKë«R6\8¶Åo¸*eÃU“¯«RF®æ@‡­yÍ¥Ž\e¶Luú<ÕÆmYÅ$ž¯¾ð¡ý}E¾ìó6=a+·u¨@±1ÚrÔ"“ (MŬ7ßñè?±×lgǨÅY;Ü2äT¹Pÿ¥ïý¹ƒ£j¤l.ƒÓh{õÿBƒ£P¸;ëàü£Cå£ô“Œà‹þ‹Gç*Á3<Ñá ÅÝYG—¿\wœÐäôdF‡r(o§]þrÝyD¾4莲˸ï/3:/ ÒVwZ}™òŽ¢¯§Õ’Êtl=6ŠV®c£è×Ózɸ6rl=6ŠnÖFŽ¢ÇFÑc£hå:6ŠE¢ÇFÑc£è±QôØ(zl=6ŠE¢˜ãØ(zl=6ŠnaŽc£è±QôØ(zl=6ŠE¢ÇFÑc£è±QôQ7ŠÊn ÄE*·–ϰEŸ ªD’Z£à…g,åWœ\/¼s4ì82TÂÀR¯ xee2*i”é¬CW¦Ÿ}ØœÆ-d¹Ø8¤}=ùÐßÝ[ÊÆò‰‡&ãù¹g 1à,>3ƒˆ ‹,É™Šw¾Òîu§x•WàŸ:eÕ0}ìÈU)#…åTÄÆÕ(.K&ÌiC窔 —yÙ0†'é\¬´3UÊÈÕF½rrøyç%âHxE ²Ø¿ëSQÔ=´b=Ÿ}º÷8Ñ•ãéÇÌÇÔŸ˜ŠÒŠ2µ¥TˆÈzOo«i!ýM~˜ â¶øìÈ>ʉ2N¡9ë-s[J¼6?ÿœ]g;–L3ÆaÄ­eåìÓõlÃÛ?¾»ýå«÷ï_¾àC—NûLÛÃ×?w™SÐʸþÈáB?c·Mn6³|»™Í}d3[Ýû>›høh¢ \—BwJCˆ%y.:Üñ6‹Sø©QsN%2ˆFÿöæôЇó… òi+Ð Žõ¦t Éy~Éq˜³—²BýÿôÚpk¥ºI ¢šˆqlSõÊɧiD1̺,a…âf->di«i¤¬?dI%S)§¢–S2î”PFTÉÂ"¤yâ¼ÄÄ7ñ=ßNèpar’Ðq7œQ.é¬NK‚ ZÜ…õ¤ôT¹9‰Úeˆ+€$}—¥¤' úgôâ‚Ä›z½P)$Ø ¥ˆ;›å.ü“ô^OwÈ=[Ìö0»r$<¶x¶ùxAOz¦ˆåíAg°Ž*מ×üÖ6C±äðé§Jâ2lZÆe"µ|‹¢X´È’{t‹’=¤lÎ+É™'^ÚAï Í”G«må‹eé!‹kY̰{U¡£$Êyñ"@¼Á6äˆ{ %ÌFºº5Šâq·¸ã[YI8W,é{\$‚Ô£U·â†-|‰g]Ëa‘@0­ú|/ñLºFÌâèˆýEw†âùÑdø7X¤ˆÍ¼Ç+E¥•B¾KIg(æ]ŸþÒŒ¸>ޒ㓯zÄ´,*=<òâƒ@^Ó³W²k$íZ|æI9›>dêa…X°ÏÒH†elkŒ¢aYºV z]†8dL AÜ­ œ]œDÒÄ]ÆCîvHîл§è½Äñ i»ao;㔨³ K”ˆÝ ½YŒ„54ó¬Bº‰ýÅCn âC˜$`6kqýº„ {ÐÃ'Y’v(…=¢o )â¥c݃ï³$""¶l+ó/¢H9ùªçѶªJgìR˜x¶)ž±?^>Œï\•¤]S"’„ÕT_ƒÃ?¬(~!å ­˜Ç/ÄWmÅáW©ZY|)½ú¿“(Ëz¦dÕ’Dz(=ózƒŠÊ²,Ñ`“¡µ”JÈP\)½¦ÐKu‡ä¢•¨æ{ñeüa“¡Ín‘€s»N”d!/¦àÖ %5IKdÿM|É-Y®™&%†áäÑd(f1† ˆ7(–Š{ÂMü´D¦Ù |l‰Üˆá¿DýŒÅw„’¾F¹EK¬å5«ÁÍ+!JôðÑ"`²Â,æöqœ°,×D„r"™RëaÆ—¢‚=DÈ Nt]è+€Ç[™ûRYü;0éôUþ,³G ¢O÷ ñãŠú˰˜ð$s¯GËÅ•"ö)pO7õ’¬è™zDl)n I0,‹ÄØBŠ'3Ù´ÙÖ¢hâI ,âsÿŠ&žü¾W#töÅÓ¯Q¤‚?¾³Ÿöa£%'ŠX"þ‰¨¸w}¼S_¥O,SÊÓ?6Q¼ÁG;Ì^¬Á¿A>Úqûâç#‹íþx—*<Õ³Ýíxü§Ÿ7<ýõäï,xòg¦<ý@Oÿ`Gñ›)ÄCŠø‘Z/VtwÖ_s¥‡&ånW{ì;¥¾øÆ¥"‘_ãþ·rÛÉ8•kéÎ)å ”ƒrPÊAù¢àÚà˜‰b5.Þ=(å?€‚r%FP"_ó|ÂS$x¯Þúnéö¯ƒ’ >$…¯#?(å#”Œ£Ùäýââ_œbõ,söî „¿%‚KfI|è·[t>(å/CIÆ/”íÊ')_1 _ò·¿»¸Ä`©¡%ê`ÍfG6v ætë•Cà|öúædŒÂò‚q‹²ÁÞÞk›–ˆãk_ào»ÏqIÊÙ[ ®ö7Ÿ7ËÖG»èëgŒßžcýêöw¼ô –xúÿ¼Å|Û` S¥ÅI¬—cï‚VeSDøN+WDQ’"ñ%#¶hªÓjñ_aàÌY_¿šóRÑ`2I²Aµ82eÁ!“v=¥Žš¦¢Ø©âœHÜS#q”¡Í~‰ ßZR”—øð†mR4l²'_$6d,É*/h5.QQ <è ùÄ5oÛXÜÆiVeþ”=y “ ÍÁ‰g—œ2Ï-ñIŒ&¤ h4Ô àkbbPJ`¯(`†”…ÈÐf -{ËÑæ˜%î¦ÄG ÆÖv”8—ˆ¿*åk¤ ¤”hùæG;ôÔPò¬‘]8¸ ç ²$çPàF†#rÒ¶ÑÇx§uøØx§Õš£²Äç¥|VYÖ‚ÎFQiB=C,µ·qbÄ>ËŽØq²)5bj0¨ é¯ ³)ç^iÂY§%½¡[¼/w¸z wM# ’Ù5IÐ¥”K“YµdL†Ër‚¹0.D)ïÊL¸€³ˆ üª%6Â}=yJÆmFÝ,—âÁj‚/ˆðNv‡˜%Hº5¦ø…$qÜ2¶O:“ÉáHLääè yÉ[ýḨ°ƒéˆÜê€âÎi¹yLÑŽ F©`‡/¼$ûÁ1o’Ñ“fIÔ’ÓŽfI"Ûœ%i‘,h©¹”œdƒå+>¹“Ž–Lht\Øf„ŒÚÅ%@ÁT'K|ÙŒŠI;Á¤ŸÚ³Þ6˜“ F'“nyÜÈ¥‹Ù˜¨:Î|ÀŠ–8ÃÙ°G±äÃ2½‹£Ä—Üí[\ÁZ@¿´j°q@ç"]PQ'˜,„È|"u5'ÊÀú”“,¶#5ˆyç=gÿ"é×%bé®Â Åe'-áj" pÇÀE’¸³ ÎÐIïJSÙÔ<]f*“ ­ñ‚2¤ìÒˆ–%¸O\°.ÁN"/Ø`Àá™’ó޼È¢îŸê‘`åt‚s˱lâaƒ"ó˜"|H’•Ž ]‡¡’ÉDA³¶äõ%×PsfA׊¢Ø)QXüŒT1⬌ †„äˆG,P¸3eiBä]|òïUñýAâ4èÄ»S ðCµ#æj¨!ï‹–c”p5¸I×8õ z>¦ÊQÇš"0i¬¨ŠUÈ8HR‰F<òª>±ù¥Ð”‹.–¯Ì%ŽqÑ–´ËSYáD€_T*y—8„ŽbË^Ð}é¸8ɵ6”ˆÉbvM#5Î ŠwFærº’¸˜ x+ïepJæÊx~ëÊMï2%d¾Ò=uA6”¹Û!øî\ü«È=êðZ)–•˜(Ò`L|ؽüƒèYAa!ßøJÁbxï£\ÑÒb!C†E¢¨["{¡5ZRnJ¢è ‹¢`D!ÿjkŠ9‹™§åjœ· ç%¶-•ŒÅð®$©‡ÍC°B1´i«ó‚Ù&é Y0c§f›${˜^Žq2—[bó¨‹% ‘Á"ùÀT¶~ÊÄC*1‚¾’W%WUi"'ï'rlûUDÃx9ZtM¶ %V'{¤]’ çäôqÃà"CÆ¥pØ*€Ý³(cÚEcä¦vaycœHZèpTUà“Õ­Äõz¸Þר ¨’`ø¤=d YþÁM²u³¢YÓŠŠêx_r%/`ÖØÀœ-Î-÷œ³ XMä¤ß)D)‘L8r#§emN™×%¢‰Åb7e 6úEDÇIñí È_³Ä­¼ oµ“’ .ºÊÑ  ¥2>Áò ¹‘ ’õUŠVK&]fÁŠ‘˜3tA³)¼d\ ¹}®å½HÿRâ $ ݬÇwœpÖª'qß­S$ÀPÂ] ´9×åŠWùE|æ,S(À£ÇÅA\nç°‚•N cIZÝÓ‹5Nr);¶SŠUðT ‡lyÓ€—¸œ2Ä5\¼ßZ"cÀ¾ÆÎ,v¦Šd ”$ B[Ë©‡‚™ºÍØŽIÉ|e‰‹Ç°H,cð‰aLÁÚ$ðž.|£k‚Hm‚;9×å±Ç¤\Ôj¼È‡TyÁ´Óˆ*"ó¸~ö$†ß’Ë¿BÄuÁ¼Ä(?uU‰PZÍ¡äjV*9aZèÖp3‚«mÖ.>J~õJe,o"[E¦äÍ`éI ö¡‚[G/Ñ@N²àvÔã˜â%®Ôƒµ`[„\ÖE>ÚÆrø¹VCVHŽoÄõ2©:ÌÆ ºŠwŸ"Ë?õ«òVâTà4=[¤µ‰Ê:#‡z…/‡#ÿ_$-T¨ï´`§±ÃÉÅwÐ_ ö‰Ø)pkêx¡oÃïr•*५V´þÌ8%H0‰ƒÉXÁi¬å4r|[ÜQI¥$håÕ³.“ó‡Q×nD`å’àV C ò-R2¤ Ç!^,gð8¢&ÈJ1ä ò"ó­Öar¹ÈXd) ™ÌZ*A¦Q'!8˜lFç(h3Ž\ Î‚Ë©ˆ!p8™Û)½3’Û}(I‚XÒ"Y›{”ÝŸµh ØH~à )Q‚è(õ,ç '‘içm9LŸÉX5å–åû'™ïžââ°¨cñ ™ˆ#´K* QddÌ"»¥4N)ŽZ¢ö´Ù. a¢Ég%üjÆ~^’`Š8”M$Ôñ^)¸C7#­r[ýuýv@*ŽÀä‡Èaqœ-H}~A9+½(•²’—ñ|¤…Ô·Üd,lÊÅNJÜ$;ÀY ’_ØÀ¿h#yúJO…¾½À^­å¢;%„’GxÐÜÐQ &Çïê)—2ŸøRb©±'_Y¡]4’UöÅÉ=šÈUûÄkX2+0¨Fl””:1Ÿ7¬íg ¬¶cpñ‘æO£xR ò‡‡>¸sÂ8ç0Ï­ ªMtþÙ[Õg÷øóf¦ÿlSÅÒÍ[ÐR>ì8ýúå»W/><¸ýê+¸žûLž˜Þw¯q ö/½ éýßß’˜àªL8½ó‡çoÞ¿zxùŽ´J….kr®\;1¼ ?3º¸Ï»5mÇ©Qå¡áØêó7^èA/.ãÖ|Õ%s|飚Âq‹Ü¼±ç¸Eîú!·È]oØÇ-rW#¬Ç-rWÍq‹ÜõKÇ-r×Êð¸ENbÃíq‹Üµ#>n‘»v&·È]Ÿ ·È]©äã¹kn‘»n3æq‹œ€Q·È]Ùàq‹ÜõC>n‘“(LŽ[ä®ôþÇ-rW6xÜ"w}|Ü"wu)vÜ"w­«9n‘“¨[ä®M [äìú¸EîúEéã¹ëÝáq‹ÜõEãq‹ÜÕå¸EîêwÜ"w}[ä®õ…Ç-rWyÂã9 «>n‘»N%Ç-r×6xÜ"w½[ä$ʧ㹫w²·È]帎[䮯tŽ[ä®/[ä®wÇ-r×nY9n‘»¶\]?n‘»zæ·È]­“ã¹kUrÜ"wmz}Ü"75ˆ&¿äæ£òŠ·½` w=2‰ êMD­3±}}2F¡;÷6îÂí½öºh/ðG‡?j˜)eËš²fåëŸ|îÃÀ}G_}ôÂ+r¸Z/™?ÈXû£ys­¹59,)°M|súå«»{}úÝÝ=>S6…ÓÞ‚s¦}zywo±Òšîfë|ÿƒøpá)ÄŒ¯óÀ¸èGU®Ëúû; #}zCíPˆV*ž^þÛó×?=¼l{úéáÇ÷oïpÆP¶§—ïè@CéøÃrwÏàhʧg?¼z·>55Óÿ¨ýé{ÜÓ…_Hþ§çoîJ_óØUƒ½žªwõí0ºŸ†ŸŸ?<ïן÷aq÷‡Ñ­õ×?Þñ ¢9½xù°ÔþlUuÝB‰ré{,ÚÁœðä×Ðëé þù¯5Ji“¡F)“+½©*û¡?ñ®Èά¿y<¼Ô›®Êx¥ák?G:>güÇ¥³*yTžµJ³†*ý Œ…¸YÚIùÓþœx1Ú"4dÆZ~Umœÿ±”Z(eNß’m¥ò¾—í±ôq^_„àB–©Øíõ©ó¦µîv‰ß¡ÝÇŒ ,™¼ë8!ÇžÙúÎLmlñmi1拳ú‡ /jORL|DzqáôçáÁŸxjR_ã¬È³ûGŽ9–Ò@ÃÕñ~ßþž0Ãñêà}îÝÆÍDçyôÐeý›ÓЯÏù¾Ûʦ3¾ªžd ¤h¯‡.Ìr¸å¢Dž,^dR¢¿˜·Mÿæn×:±'Ù§[\Š›9YÐÏi44‰𫦟³ý¡Œ"ËÏ›ˆ>þ<Šî5ž„‰Žþ®Î²3ÛÄË"¥W?õÉwfƒÌ@ïm©®î 4‹Þ]Péy6£éf<åOõ¡å˜¿Xά·ÿüê¼]öÊï¿+] ˆTfïY€Ým Y6Ÿœ£Oÿ²u¬eÐqv¡ÃkEñhÃ+!‰ª å(Í,zì竲›†LAØuê8ƇÑBÎÒ <§Ù_žeÆÝõûÓ†¿MöÄ;w_]ïÿ~áí/š‹4%`¾ßš ÷,#•ç¨Ú׫ìü1¹ß\åjuW¡Æ–Ÿjê¤Sy˜Ê±}{¿vN`ƒ±ÙàYªÒk9Ô•IÒDz»þ3ºá=âÚ‹Šø•Ž ë,˜¡'A±™ƒ#Ь¾”n=ߊ†w•œ%mß—VÌ¥œ‡}ÙÁžùш<*4šÑ›¬ç_ï6ìZß?›¤cß> Ãz¨’)Õ<úÌ›•ö¾¸&ä8àg¯³Çü׳7îLl|çìSlOÿ~}öjýÍÏ/÷güÞ,˜Ö´ôRÎ0U¯Ï§µ÷šOQ3üªbZ<%tÛêé÷ç™Ç^†€ÔeJÒQ˜ A‰¶ïÓÕl3„OW~ÖNsnPÅ‹S”§Þ‡ب´GM`Ïjöêñ\ºèñ>Û /Å––›àÝžÌú’¯§É³¦Ëà eÏUd®â§´çCöãºÒ.~V\ÎóÈärÕBµÏKžù¾ÒÅn½4ºäqPBpQÁ Âä¦öªŒÑè‹mÔܹi"dÚ3}t¨Ê ¤mÊ ·Ñ¦Ö(Ã…«––™‹±áÝÛFòÉ} ;æ4NŸV\µ’êÿÜ<ûoßœgª–æÏ³aÕ˜vî^¡|Ü ¯5³èf i.íWìÓ:>ùsÓ\`ÖÚæTÒ$½¬øY~+4›UÉ}q?pþxî‹¡é mÌ1ß—¦`g—ʨéùKáltÌ?”÷çì÷C0½áùs29ðÂ’/™Ö„+¼®Qdž½hòžó‹AŸã$ܯÄy¾²`ôit–!ÆQÿ~n¸ÑUWð¤­G`÷KÕŠ=—À€ŒÜ·amçcÏGFœ ?wkäCq(EvP…s¢-_¼ó¶€Mg&RÃJo>¬Þðy“qbÙa¦Ф¾6®ËÌÚµ´µµºo?#:Œ¾±H6»!zF«/%›ô bdœ’L½&å(›w…AŸMøK…Û8‰.ÍBþ™Ò{*è=G9]ÒšçåGƾu¤<Êq³Aưufß—…ɵ¾[Ч_ÞáÂ| ŸSEÆö#ºu§¯†G¾ª#"ïv§j •)QGö‘)ñmAF³w›êhÊXFx­šêëâ÷sÞ$X«K¨l?”„ÂoÓ3Ø9žNv“”ɩԃå3ÜwžòÛI¹ïJsF}tÍèçálx1j¡÷èœç¬oòí¨L*1ÂLí¿‹Ów,T¶ÃûÒv$»øPÓd ž)ÍuӇН…%¬øÚ(·‡šOx…ÊMŸ­¯îÔñUF›¹hE”å…©s'¦¸5}uþ™ùv7®Œ?‘áB¸«0[å¶vi)¬üÛ.ÒKhÁäÆÏ"¾uÔ) G>m.£ÔiÁÍciP˜Ò]xü¡bʳQ| õúÜ4Þ\pßïÊ0çî®$*_‡x¿›Éo]â0¿ù;м®W‘B/%EÍôñ.¸Ì3œ‚¥|i¡³vï7–Í N­vªÍŸµ©ž›÷5œK¨ï€V•¢È핆²š_œñ6u³5^B˜ñÛ­=Í﫾5XRʼ1r¾þ™®¾õ3³ŸÑ×óJ^üR'ÞiEJ¿¯Ð 9ýizÙÖÒ¹ˆ %œGÞ…>®ý|_¨Fí¬ž¡ ô×\æËpÀ§&îààcøü‚ÿÝ Å]ªéßÔ2ÃÄ0³÷×ʺK ¢»ùGVo QÅÑe "¾‰Û.Úê*>ñÛ)<:ææ%ÕQ/ß]ä0ªÕY 3 ñ‡¨ä)|5Í)7ƒm%¦†š2²íŠÎO£ÏÇLgÔ9²Áõ;’}K °>¶s3C©Ð—h¿ºùÿ¼G¨-endstream endobj 159 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6482 >> stream xœ­Y tSuº¿!4\°E£â½¸°úP@AqdÙ)PvZJZHº§M—ìÉÍwÓ4k›niSÚ¦ûNK²ˆ”Í”U\g†Ññ=Çù'ÞΜ÷OSÜãcžÃ9ô„Þåÿ}¿íûÂ#†!x<Þ°ù+–N›îÿqŒ„3ý°Û§ ‚`>-óÌK£QÎC(hTÿÏëoî›'ž/Y¸0iQòâ”%©KÓ–¥GH#—gìZ‘µrwôê˜ØµqëÂâ×'lØ»%ø?¶My~ê´é/ÎxùÕ 'ÄÓÄ*âb5ñ,±†G¬%Æëˆ D1‘XOL"6“‰ÄsD81ØDÌ'¦›‰ÄóÄb!ñ±ˆXLL#–K‰‰eÄKÄ b91“XA¼L¬$^'ö#‰ÙD1ŠxˆMö}èiQ¢èöã{ŸXó„yLô÷˜ÛO>þä¬' ©¨ têØÇƶŽýò© Oe?uÞ«ñíŠðxç»xh9*L§lÒÊ *d’ ;©J¨6î‡jð0Up$ø‹Êl*VC'³   œÖB[ñGHвn+3JVDÙJâ«Mt4¡™zÿÕæ(u¨!g³ÖRÅÐ;|¤¡Ü— ¢lÐkÔ¹$·¯¡­E7ÝÜÍ oÂå}ÁÅó­8ÉG,ªš+Ž£G¾ò lÊ\±ƒ ÎÜL+“tJH#·Ôíí¸S&™lJÐåôY:J'™¶È,•Å]騳ºèªïÀ;䱔óWlÙ¾‡Òw'4oƒHT¤í”F笆Tå36˺ÍTÑ©²S@VÁ¾\©.U—MÏãºuÙ`(ך[ê¶—–˜¨ß\À\¨ÓÃó^ý„ |s„þÓ[ l È4 g44÷dÿ!e¬FµDÿi…b] 'Ñ0$øþÚêÃoØé¿—ßþn“ÂÎs<ŠÓp…gÉÖjÁÕ¡á‚ë%«#^z}<' ¹¥ÜÂ}Öa£ÉI_@-AhŽàZÅŠð§gLzŠñêuCCΡ‚s|¯Õ ¿{ë¹\7š{Š›Èï­ÿ… Ñè4žâ€«FÄ5¿° i8I·œë­m²·jëÚÉ\P|¹ <)Èßê4ïM¼Î÷5ûf Ù<Ö FÒ¦†ÑRM-{-þTxí2qÛ¹X.…Sp³Ñ)èaÄ»~Íb¥oÝ,¾íÿ}hT:ƒROmç¦pÃßxÈ©³Î¡154ç/èqº÷ƒ?žÿHXÀÑ;²˜}­¦´B¾ÝÈã’{õÜz!€%gù·¹G„ªµf7rHU&Ÿ®±j¡žñüˆ; d¤&B‘µô å´=il~ ·ày4îÖ¶ó‹–o|K­¥•‡c*âî iº,úíL¡µîô''€l.‹Þ°.Ž{(=‚Ž])Nr…æÏ¸DyF+âK/ÈÃóͽÌGöûÇH­@kP,’¢‰³¾äBhná¡­Õ ø%¾ Þ‘×&¯s3–?G‡Ï~m®ä³?2¬F«Ñ‚‘°á§J!â ß+õβ&Ö &2_gÒª¢ãd”ܓܲHŽÇ Ãý?½gùûÍÍ®¦Fš5älVDd­e¯æ-™s—ÕµÐh¬ƒzÌêº_W× F£6!›P-Y5c ˜kGêшâvºêLwï O›Ÿ×Óúì ßs˜;g=¨¥Žç›†r„&%í Ðkõ ×S £J×ÊøÇ#×r“ð†~‚ý¨.è–à=«Lœ¡3*zƒz¿f™ XSaõ6J Uä¿!–„l=•>'#y¯Î ÖÖdaë1µ `GäJ%¤kãiÐ2 Ð’rä@^iU‰î ä‰*Ȥú7 2›sT =0X¸'úÛÝ9o”À,k."C¼SåèÊGNŒÖIWø(µ ó ºÑ¨Ï j ";K'Í‚$2­XUTZ]ØÜ»Ø"Þ¶;uc4¥<µ³Hò–§2?W|£q‰à¿u<Ô‡® ?œµg‰e‰^ßÒV‡1Ï™G½ƒäAwk¥£¤seI¯ùºàˆ‹ µÒu铲$´dË’è…@Î{¦ M¿Þ€f|ú-}áó›­ükµ;ô™ý–̾öýdÚýçÅS´UâŠÁUÅ4dY2]Ã^0ƃæaq‚lÞñÂO%öΤ_´£i¬‘µ Ü¿Hš¤LÅÆÅM š)øÊ7ó¹m:äbhm«Ž8ñõ41ßo³r#×R¹ Q“–a›Í¶4™Ü¦":*Îc^{xïúÌ|_‚×+´5š­g€,±á'+AKÇB4ѰÛ㯖Jþk9\Ιƒ¸AÒ.Ýÿ¥¿VR?Èš ÅØ ÍÐÆ4ù/²@–µ¬6ÚXt5¡Á®â߸ÎÊæ³FŒÌŠA»r²ì(ßËxšœXÈLdQ®-G¬Jº3ŸëÄÌT0ZQzDtì6 ·+»úš¾tŸ£­îüBp‘íÉ­›§Æq4J?ŸØ<§‰²ÖV}ùmr’"1m ?='¢Èi§’w6¹Úë)GT]Z´ËSè)i*8 yd þR4Tú+ÒX1©Úò²Á¾xƒ&tÆûßâõ ­vKåV|(èèhˆbp]!Ê=XÙ ¹JNZ΀F'óÓ·E£Q/Æ‘M1X!\c ´B;Óòc…Ô €`¬Ðó'K¢‘Ÿø}h¤°7½0Cš$MQµ˜ªnI^4ÈÈÄm\7<<»«ýÆ;îÓ”µò¾«³‹ãëb@LŽ»"ëD¯Dÿ¨ÂQÁžæºxÛ«öðþëß»ßûlÖVs'¾Ì>&fm fí.ÌÚ¨AÖ™¶ Ú MǨ :šÑ¿7sѺ9ë@´vWjåŒ`²¡¼Ö].s¦é6¼Ž»ûþxëÚgåþÔÝã¾Srôó“h1>ð4[¨ÞkH™ðòú5òc]%§þDu˜ì÷yÀ=Óä[!†œt)µ·ªÑÜ×LU¬:­©†+Ðö^õ‡Ehô‘÷ª*DÅÍŠN[¿%Hmk,Õ…GiKméGVy¿£ òXU'aÝÿ)?úƒØ;Z˜ç€<,—UaF¼: (ƒAÚW Áúó³ÈÐÑQÕÝJ;Vv+Ü÷Èu¥BM⪙÷L }–éjƒ^L?E"Åå¯÷*:~…ïò>'LÕäd@ú¾ÙæØ·)!R’EÉš69a'J÷×ÓÁ‹ói÷•C‡év˶¤(v©hmj÷£’Ç%­ßZH… §Çj©„²,Ûž™˜ž*ÙÕ•ÑÞQ_ÝYAY“«¶c¦|Ý‹D®“©¥Óo ÃÉ)Bs°´ÜZ_p˜6WØ;,5eW]Wû°¹—Ci6yý(®–‡G‘ä,õú^-l.«MÍÊ ”¡Ù¥2H,¸Î# ThµAKŒD‹þãPØ4¡©èTݹK&£˜þ„Û³w¶9Ú+þ@çÙö<»½íôÕc÷J£˜ðú{Gzÿ&´µXlW€´¼@*zD0»°í ø×ÿ.«1gš X0—\A{CqÔ5ã†[4yj¹Á¤¤öÍÚÉ=À½ä¬_¤R1·ÓÕûÑ‘ßRÍ$Îã©v­Ã´û½ry ¶¢¸˜RìÈ ß“ ª[Y(’;ÓÕ»˜5ám{z¿»õý—•Ô@×PçåžÀµûß;Ï;\˜dH•B2™T¡µÙ[ÌG{"ZVÞªÆ^õ1zð“oœ•U£7”*jÃü¹b?ã$ݧ‡«Æ¾ÃÀ ÇÀ¹… ù þù+ƒô[37\zPȸ;ýB×{Ï26sn¤à³Ã£ý®Ì%[˜½ŒH«0d(­]uFêG »ƒû^VlÁム—›EOx[CYÁ;ý?¥F}ˆp’Ë·z‡ù†â¹§ûßû¥æÑx oÂ~ØðCË=üðYE_‘ 9]E}<4M.^¼ýM¬{*Ü);°ª¨²G";BE|I’3£È?G»­£JnÐ+õtòâµébÈ„,³¤0¾8G=ÈAÍ´ììînÿò󛈄RÒª|ZCŽš’lÍÊNÇB§°dì—¹³]ñ@Î|^ŠÁaÂä·›hGmc™\P¢tjÚÒ±âBbBV–BAÞU»zú¯ s“5M¿ÅMl ÔjN™]ŸäÙù{T°0¿&¯+»ŸYiÏ Vv{?Ÿé´´I|¶’Ã^fì…ã>SÔ˜ººÅà’ã•8Ñk¸¡ýa¡Ü2oµ¶ÈÀ¦á·üˆ#[5h*üôîþ?a(Ô[Š¢ú¿3å²~a³`M%ÝCI.ô¦à,Ò6òQ&Ê6¡Õ€FwG·®~†£Çq Æÿù/yCòf©òz}—¥ÆÞF›]Âvôâ×öR ÛÝ⸱ܫO‡ cXGJ/{ôÒÅ Or}x•öãˆ{í§ˆ;G`;`n.ùØÖå8Ò‚›ºФqjä¤Ô©(q»KڢܑÏ%qÆ©©4Ž´üǹ…>%XÐÏÏ]Å(e+EòˆÜ­1 ƒ$6§´Åbªë€O¤¤dì‰jIé¸ÑƒF£uT`ªí¬Ä˜çuƒN¡‹B4E€B¡ß Ÿ.=;–æÚîÅá;µ¡'½G…yKðIÛžUÊ)áëh~Ç–©x^-ð¯vº~ãòŽóKÙÿtô”œ´L†2î¤FLŸâHn7þ…#kÞ=Ö}Ðb¡ã¹Gå »ç¼ "9ÄA¢£Âfs“,T§¤'eÆïn“]ýöòùë.*­ªö¬œ½ÈõÌÕ‚Cµ(¨¸•ÞqÜ…ÝÜ:CôŒ’þá®löìÐÌþåtŒSŽßCŸcÀS§(Ç–[Rc®²)<É›ÝX=¾ÑïÞ ¾'ÆÜ–VŽ{ø¶ Àni½ØŽœÝ¢=Ÿ} Ÿ‘¿ùBq¦ûlb#´Hfë=›ø>ª B„àzɆh™*ND«ÅÊhkÞ8›tüãÚïlþ`Ž-l‡²âØ=@Æ3žšZË1S Æüp¹Ȧí¥ä¬á8Á»¨ÄZoɳ±"‹±Ê€<ó-<—¡åVs;ü| žºÄC÷9ÊGúøÂ²lGfF¢LœŠc”«²´Šâ–÷[„ªTÈ%¹¦-­áO¿®_â´µ@Êsó+«œÍ¥‡éSh¦m?ûKE½{ª£^ØÃMÔþÌ”ë«î`S®©*¯8ªEKØÿ€ùu‰ê7`g@+[É-Åï©,¯òì,ë²RGФŠJ4ÈFtjöþé«U­RÌQn{6°Òá°±Á¦Ç/»cPør™ ceØØ,ã8j4ÚUùê¥Âÿ:ûÞ¿ú;ùwíªÔ_•ÁÎÐZF¡MÇÿf“ º’[Z*«êK¨²ÆÂ·ñ€ñ“f¯•®Ü dF®£®Œ¶&:¿ Là€Ë3Ë·Y=Å.w{OsW{çAlÒ69ËÄiUI5óÝî²ú*iíŽÕ;6l‹¢Ö-IWe¨HlQ{xhëûü€=ží4ÿÜ%Àˆa5ˆ†{Ú#“Ëh¦s?„îã†MxfÍŠŠîÖaÄ2qqÆ„»×b8Úå©÷åÑ}ýÿ0fu… *cžµ7©#0Tú~É÷jý_ædûÿáËœM1a1”æý­î-°6'Älú=_ì[\ÊhoE“Íûó+Ìåùö–høÿ›†ËÒñ%ôR®÷DŒHn͹û]$y-?Loá¡ÿômž”@õÀ&s®  ŒSÿ3,”ÑÕ8_P—ý¿S5@×UØ«{ÍÝäj"Í—'N_ „´ég‹8?Ú\O!õ[³ÔTj*¡¯£ƒlQ\®ÀÚÂ:lÝ®¿žE#¡ú`ÿ¾­B9dŽMæÆk¸È ™,ØÅ=!¡¤“~‡æõÏ]ž³Y“*R%än¹Ÿ8„‹²¾Íý  ý–Ö 3gm_µmW.~W\I“_‚F `4¬BÓ/'ˆËeî"'Ëþ¼ õÅJ”õ2j® 365}NöÏéAËüŸH^ó² XÖTL† ¿¢µGyŸ#ࣣ8ž¸ð€™ç0šÍe`܇[+H÷¯±åŒF#M +ø¹àßÿ䣘w„µ)¶Lq‚$!µ8³²º~ƒA’æò=Žãy Ã`n÷j„5€ÆrsŠåýaóWEA7®Dž¢ê/BsáK’ëé× w&4Ÿ¹~ >p…n>sÈAX}8û•ççp)µs÷Äsþ9]oR âây7ú„w¿°1éÍj­Á«¤"Ö„mš§ÎÅÖ™×z[Mg¡§ƒâèOTÅ)•s@¤ºkº;át1ƒÛõ€=¨ ÀV€G÷Í >íœÃ…ðØÖ‰õJ5 v¡qïòÑ÷(O¸ßYYRYòÁ±ž·áOäWË/Lç&¼ÎíX¶§PÜt½j*WÔ)tj†&OKY²Ø,ÜWq,7d¹T_\òÞGh ÕݵçõLæ•ðyÔÖe¯nMÌâ&¿ÃMÂ;³Ohe«/®­…z¨’zÒ«¥5™M@"AZ`\·dëhYxÄŠ•X°cmÉæH»Äœˆ&TúÞ?^ïò/»ý}AÄ%D{Îb{sñþ\s¹ú¶ëÃw«NúÛÿ­0S…kb†RºZ€õsf†|jäZ:fËúÔ(êð^6ey0#ID|zÍiѲzDIoOPEù×2¶øR­QgԃƟ’ræpo‡t ~–žUÛ-¬ÑœO9‹¿äÛ–·$Û“8B²™Ž|smb$,‚¸Óù}-W”“u{YýX1§{å LÒÇГhò';.ÎZ¾C§xÃrï~×±s<4ÎËGß³B›ÔJ²ÔÔ.B+ÇZɈTVÈ·±l‘êCÃot¿ãYí”ØÒíR”ãAÑjšÇ OX¸a7GÌÂÝ–[¤U͖ꃪ‰® 9ƒ¢ŠÝ~RÌòJƒ!3‡JܵsõVH]¡¾EßÄÔGÂFØ’KÐ)üÌDoñÑ!ïayViR¼x¯XZ˜^ÝP]WM½ÌݺaÑ1ïÄ€9¿ã£¯¼?3&._/Q(DH›¯Íw¢$@#г#:%^’ê”UUÙlV ®Ç³œ©ü‡0Ì‹‰ù¨ˆÓ ñ 5¶ÌêíÑðq£w r£,;Nnø ,XŠuÛ7nÁAšÛ¼«ކöÕEî%V84å³þ%Øwý´Û_c¥P£†ENÙ2ÖÃÌÝý“¹N:(•Vm-> stream xœµ}ÛŽ\Ù‘Ý{y>"160I£ëxßb_ŒÑƒÇ°74¤¦¡‡–جj’R‘lñ¢ùÁßîXûd̪¬a²—1Ш”<¹rŸ}‰×Ý…%îþoþ÷Ë·W½’.K’] ±/£íÊ(c‘¸‹5¶EÚîÃíî»wWúw.½í~¾Š»oõ?¾ »ß\ÅPÊú®æ–±{{•‚PæwWß=|æðAªy©ÙJ£-A6­l KÈ›‡Ö¶õ£'úÉ?Ÿ p3âÍCa÷J'&ÚTíæ½|»û—çWÿå÷yè'K(UvϼòyŒ»Ñ—ž’¢è¤¥wÏß^}¿áÙu,Aáû>ùßu iŸ7Ÿ—Íçžýéù·WÿãùÕï®z‹úϘµ!‹èúI‹},%Ù@y*–¥¥|øäè):ñuûÔüäè©6ÒRúö©ùÉÑScøüò¶Ï¬#½h;ö/›`Lî5f¹%öXõÅ¢.¹ø _cZSO²„¸ÇLêT.cØÌ÷ª¯3ÿȬ®«C\¤ßï×õƒ†í003‡·yðÉf“ÿÎ’"…ÅŸ­æÀÛÑßöÈÝÕë+«'wZßE}W‰i»Óbú†eפ.)ÌÃþíû›Û»ÝÏo>½ÞýøùîîÙó?ëyÍ­¤¤s——&˜¯›«ýï?~zÿnwóâÓ <ó`3÷¥•:ðªeûίß|út{ƒÇKQ›.&^VÚuF0„ßß~|sóùÅÝGÂUß6…²Êá— rRpâ0S!jšmÃ'O킜‹mCÎý¤/ªã«P3j—jÏi 5]8KÜ`ÖBÓ¤(!*jªØŽÈxã¬jœ»¤’†ñÆzÃK+DY¨ºuª.º C⺃EÑe5,! (`¶ë©TÆ«îß ¸B-¬Œ5–¨»›F×FÙ4C­èêª+QŒ  vŽ¥QT=%-ûž¤M£f3QoÅ1Éó˜IeˆÅ ¼IÖIHÑçþÔWu&’-Q‚_&rNt×´îC \Ÿ%ÎëD/úB’…Ŭn]›JÒÕS„*B^zÄi Š=Oˆ›ñu0.(ªÆ‰ßñBrþˆy“TxQ„aZ$ Û†" ÕFNe0eM]B¦4TÎQ^§PXŠtíË0“6èy¡\¡Cµ™l€Y€¥ØåŽ;9GÊ ¥ž‰W–Q«š¡9ä ¯i¶ý•+å•Èv*L²mÔ˜zM¤ˆWÜòvE©h ÈµM“cy Ž=ŽJѼº^òÕw Åàü—f·<Ç$Ó5iÑäÄ1’“*™îïŠ4ÂZ„©6¨N˜ºk¯ÝP¥WÃ>„Ë‚§rºùe×èI.6¾Ì¹ ôœÔé¦Äc°­@†¨i À¢ŠWqÀ2(ÛzZ(˜CŠÛUפE7Ê:å•Õð†Ru­)f­”¥C»†wŠrìô…‡{êeî§Ð‡{8Þ#ÁeaçÞC­OWF&Þ-¹îZ)w¼ž“Šü—^T£#i!n56 ürÀϤ5„"cQº.Šd^›LµáTÜ írRТx²füò Åâçj†FŠ×PMžQ|#ÅË—0‡.%Œ§€7ŠŽ°S,ФvhN6‡%1¤MŠ:BÃë_ƒ¾q´)d…'6”ÊÙBYdYJumxp„dpÉstWÝÎÔHm/nM”DL™rá©–Ô<Ü‘ ÅKª+œ«Maãµ:BׄYhîÙTÿNѬõ…Ûê+$kÇ\+0ð(™Dz!W M«ùDqwp:š)±ó„¤.÷NÊ}œâ̸ðh#'Ü|WÊm·æ¬À÷JÊgHÍ]?•â1Œº&Sq-‘’ÏàfOTdžôËààlš®çÍ/»’)o¬êeô¸e¦X iضCŠc H¶&•Á8 ^9v’ŠgäpÅ~JÙ2LoM”“WT¥©î£ÄOT6q_}¥x]c]BNDÔª| '´ZTz K„á˜;º±ÝqÝX[¯(d´ÕF21‡È Ty˜(jCBò½§ÖtvŠEÕÔƒÒÍÃ'K`íëÜ<:AJ¬ìfzòRaÔêî#s0Bó* ‘†EÖ;ªr²ÌÕÚÄPhBŽŽûfýÈ/?xØ-¼l"5Mbˆ¶¯åF):ÂèY땲 KYÄRI“ê× @Ñ«)¸2G‘]µ|îî ÑB^ât\0|šÀ3Á+p’Ö³^¡‰é AMžØ6†3ĦpFBY&|H渦„Orñ"ˆÇr„§Â֭΄F¡j×É«Oz'9q¡bBús<ÃBÈ&üI{z†UG¡U¥¯ï›é×êAÆ@ÉGæÏ¬œ DÈÊX’Ì@¥£"ÔщqR‰ ׍ބ§aÔ…’Tò†ê•’c"ÙÒìÔQ¡Ú$–Á­‘9)A?Ä®V+Š"Zu)"ô`ÄÇ*e T¼f™á”P|뉘,Vq)?wÙ/ˆcWRlGód1äΉJ„êN×AñýKTuµÙ %iQ»ÌøÅ²äèqßNY” ǵ'­—Æ®RTÏôîA¹ñdXJ*„W¡hÂÒ=]@¥× hÂUG6}ësÉ·ƒ_()ÜúŒš¢x®ûSÒ*œônÒrR8P¦Õ\Ø$J,^•ÿ”§ÅH¹QRõZ¼2˳Ê4=(ãàS K OK¦hë3 e ³‹W¨†á¥&ã,œæ”NddDÎ )Ü‘õ|Ô¡#¬$õ?Ïz–Aqºê9ñ€Qâ¤ýÇIW V&C±@óÌt œÒ‰6Ë-YiDž'pWJ $ R!(áE–P=FV)i+%éuRL½æ¨5 ¿‘™eBцõÀYÀ¨³T€Ù*-kMKeéëÆÿ„œÊÆÖWíÙ=õBqO Ò{=M_(W(r]Ãày“* ƒX£»¦Y,A2ʹo‰¤à ¸þU®gêœ5Éf;™jÈ© Í–@jé”ü)U×[ðJ²AážÂ-/žÇÁážÒK¯xÖzàÈkTõy={¦ñrœÅxzP8jÈJ©Œîˆ2…q¦ÁÇJI’è‹%V‚ËŠ‚p%fx©â•»;/*‡c ¨ú?¡¸ eV ‚ÿ´È£Í˜e‘¡Ëù.Jf .RgP çŽ×ÍÒý SÊÒz¡i•`”º4hÿÁã1…Dµ%³Œ,SÔÿ®fü´i…â¬u©ÑËc:%] !£ÍËìŸ~ù}§W;T׫›âïBÞ¯ …Gwa˜±sN*)˜VMY¯Ë 8Ň®¸Rܸ ž®«s*ñr³7å¹ %ùý‰Ì$Ê.Ôµ°¢_µÌHÙšŒ…‘’Š~û,Œf'ýP1>Q@ù扚BµXP¿ã™ÿ™¢3 AÓè*õÆ£òÔ$Ãþ³“BÉ‘®Ñ²Axed5zôW¥Wâä: çáu…‹£ WÀ½ƒsÜÇ…’4€pmwñE¢v>:‹BeÆ*9†È8zCoOB!¡þJV¤™3$pl2Yd&V&Ž< V8aÊ!°-qQ2NÈ VÉä¾ÔîE-$j:ÐRw¿õ(þ=)ÅkL…R0ˆD‰™×À"¦pÍf,LãiFæÎñ ™¾‡å-NàNKBŸrœ÷ g‰³‡ñô’¯íU/y+ý Eü—¾”ê|õ‰È‹Å!AUãÒš“ù/83»†Â7iñ¼ N¦a·£Fµ¨™×‰ªœ€°Ø+k9d± à©H×!¨G‰Ä+4 ‹;#p˜)tc[ôR‡Ã<ÿž\]`.4Ì~(º‰=l»`Q"‡ö¹,ѹ8…Ýuå3„ZÃê=1õ3'÷?Xšaöz N˜ ô(nOØ‹uí°T}NmÚXÊ$w4бÈëšP’Q0YÇwíhwp˜˜ôžs%¥A·ô˜ŒÊ•bÒ"õG&›>g ®$Ò¬ª/ð°Z//¿0¢ŒÝÏHál5‘§+\(küÆ»;Uÿå1Cq¤7SðÚ‰Æ!ÍV3,;Y½pJ–òä¥y6ERë×½nšßÁ&ŒÃCÞÏJX@\¹…«êIÉ¥öb)“Ÿ™±8Œ±Ä2®Ý„Ãâ;:PNÆ­j€Ã~é´Sª`r,xµKš+„R„ 2Í1É[XêÌšb995ð~xiG´ê2}ZDé‹Ì¬ŸHI>¿ÝTGVÍmxRe¢\wèçÓ=Ž(\`Hî…ȧ€æfî‹+Ë®©QRP(ý@éÇ$Q<IfZï°®*çÔp¸™‘?ó#8äœjeW$ÕXÞ5GÒ4«¶,è½KÉ‹ðW ˆ€Ãé—½Q ¬mJ7OÔZÏÛjÜI@=dzö’¯8Äê¹-m–שÉxWU©Vc‘’”ô˜0“L4°³O%m=ûfl¬q*ÏÕp‡§°¢}…ƒ íhfG<íÔ°ëæIÑ„–ÞúJ(îÛ,ЦP <ПAxU0º2ƒX<Âr§(i:A·Mvo+§OhÞUª&%Ï5àîdÒG‡ä¹ºÊqË,1YfFà\‹QÈÁG©í° 1CW¹Ì¾L #IJHv#tP”וBn$÷qPe&ÏFÊ=Åu¹V­uE|ɬœÈ”V¿1Q™(œ~”yñ€`£xBד7xùq££± gA DkÖ Â·ÄÈ1Ôö–œþ,S‚O~©fѱFYãâ°‚E*¼Bs¶²Â ±ýyçNYåhd¤XeN5{D+Ù¢T S²`&Å %‘tm,‹ œžnj£Ô)®)š¸±p¡ÔFr䯆þzVÍNQ6ÀA[­.”"ýQÃãá ²?ó®§êý‰é€*¼ßt¶ÔJ†`HÖÄE_ ¿+¹µ‰]¦H¨´.3Ü(€1Û]l$×À¢çÃ-”ÈiÛ>”“ôÓ™=Zz^™VDÝ—§ésªCX©äÆÕ^fQ¦ñú?sJ#]tq:ÛÇzÔsc˜Ý-Ñ,‚tSS1¸ƒJ(Ù{QÌÜ6ÝŸ#@Íà©l•’z¬6¨%HôhMU(û:®!JØ-DgGauSQ¼šg¾g «‘Q˜RCÉ Á2zy!#ÜOÖªŠcà˜<™2‡=¬½¶O8T™wü utS@ï˜ÃáFÄu'™XDASfÇ.q¬'„ÝmA9ƈ"¸ÚÊQÊ1µPrj`™x ™sBu7©ëUXf"[¥ôI‹(”«Ä¨j„Š9ù8æ1|…žÍi£V~Wª9Ô ‡à(b)ö{Zœ,¯±rÚÌIJœ¾P´fœ›“å$³Åc°ð/%´ŸÊ ÚŠè4Ý|ÓpÈèPÝ0›ÍqZF¢nßVgW7cøD`Z8w{sŸ?)•Oº ¥z¨¨S,Ô"øåNáß@†Nô°4‡ÚyïÖ ¤°Xj²÷ Cþ%G¾ÖÉÊÏɈâôb½ˆ)¢µ‡©€p:ù€ø`¶ ¦¤[¨ÆÐÝnjëXÍìá¬g•âPA®]tÇ^ \ðÈJ^.Q(ͺÁmä.¤J9ÈÕ³»Fbõšˆq²(S6 ®§8S8ýxeÒƒûñöæJR`ÙžµøIœ²Š}˜bUXAŽˆŽ@pr‚«µ\ J-r‚+e¶µ!•Y6= })dD³N©Z©*eSg ´à‚”É6²3l± ÛFwë=rrpƒñVÑVXg°'”SŒú†âåð"ûsr¢TZÚ1 îÙ”R^_šq [v>«CɨλÁá¡Ö7Ы+*U]@J7{¼†ˆ†e»2Ê@Fl¬Ñ,š·»?ìÞ]5ˆ,ÝÒ?+ü·úŸ?_…Ýo®ºEwtÌ'h§?w¬>¸;|ÐR5Ý»Ãw~røÒwó>¼:ûÊzÛêdM·¶ C±²†°~—ìsËx]´ B>Úu,ÖSìù þ)áŸÀº‰Ö×5ÁÇØýߪf)5+K¸ËÜTánG~ðÌἦ1{h€Â¯mZ?Ø<”z3”ͯ­l*# CØýCëÛ‡Ž‡¹÷æ¡°{r’¡Ãk³™åT›÷Þ¶–©¶ó¿ßÇðL§Ö2{öÉÿFó¶}Þ|^6ŸKxö§çßÎùNê0‡À7ùvý !I[…ŠMÝÃgBÂ_ë'Û‡d ´gûÐüdûPwß>4?Ù>4Æ\¨õÿ`óÈ:Èûg¶Ãþ²™Å¬^cz¨mP¼‘ã*F¿ß_c>SW‘âSh’bØ”÷Z@ª€)8‡UG®û¸ß­ë÷'p}—Ó6¢"%äí¢œë­ÿÝP&¬€H®ØþmÏÜ]½¾‚èxr‡uU‡õKÇ;L÷‹(¼d~¿ûþæön÷ó›O¯w·ÏôQ÷ÿöéÃíÛ[{õÍ,ºFlI“zˆ¿ß¿|ññö£Š°·ïŸ!¸zÝÿíöÆž?]PØ ˜r¤q°’@ üúͧOúüó?o–ÈrÊuG5KχˆùýíÇ77Ÿ_Ü}<’«ÇS¨+:­ìFɦ7Ÿ«æþùÍÃmzXÆÍ6ÅÔB£áéĹìŽÈ1Ob  `Fþ‰Û€ƒámÊYœ¶ö#Ÿ%g„Z‹«> «2£_žuY!õ0Áš¬Ä=‘‘ìr`Ýîe$‹§1™*†îe ò½ª;¢ ï›TØËdÒ« ‡]B'ãúˆÞ4Æâé‘áÕNQ.03ZÞÏ› #Ƨìçß­Kddac„}&ïÊ)V5u&22J™’Êè<ÜJ齑 å$'f†“€­^ÂRB‹Œéý£ô;ð={YgdxÉ!erñ$Ãí’`8ÍV®‰áýKÝٽąÑm$õæ]9‘EÀˆh¦¡Æî(¼ú7Œ°uwDP˜² iÒÌJË ×KBŠnqª0¸ a.qDΜä`}~‡`#´6o¨êaš±ÊÙÚò$N0$©ÙŒBe‹'1Ä+Ŀ翪JÃXeè\Î(v¦)Šu˜T„‰q…f”üÕBszæßdáubíL„Ø×Œ5ÑfKºÑ›…!_3ÊzŠW|DãýäAØp6ó¨ ‡TÛº÷lS² è—(‰L jC¬>Â’(WÔ°²bcÚaX ×ed^á)æ0¤iÒ2ôl›˜;Ï@É1XoZj„Wm3”Ë(ÄÂÚ¤Že¨Ã^¶»7[!¼²X׬xF•cF¿)™ú+ƒ(‡2k… Vr ‰i5V+4õ•6OCœ1ŽÚ šzòÂþÊà%É¡.- ï ä4]Ô,®†*ØÎJÕ¦<4ö2i;)FʽÿŒÄïÅl–Grº†É³Ù-…³k¢ŸdF£ °ô:%åœÈ2s“&Þ7Îò7a„¯shËô@ ƒ’ÊäÂôÖÎ 3ň:ˆÈ3O¶b„)Y~7#á 6ÞXFжn±äÁ+ì(¬B¤›Ç¾Î%s•o°Î5Šè*zLZGŠÞól85ŒÑ†£]Éø×H²«O)J>qNÉöèT##É/'P:ÓÊ“ÅÃ;ÊÛ4ë ϹŸà-̼ì_œäd~Ía­8«¸xMŒº^3l™(aKD~ݧ¥g#KtoÍ`P£eIÞ9Z†—sšüõ¤6•Ùrc¢çñ3È@± CðïBq Pôy4Çìî:uî®§(J¬Ío”ºy„<êœÂȉž§‚fµ/Ç+Ç™4ÞÒ€=w¢ÿ_ÍäZSý_=^Cç’b ¢¿ñêO-(#“P›ÁÑj`ñ+ŠóÆÉ¸HŒ ƒaÇc‘‡{“"GMZ R#"¸“Fu7i Äk! '&ên¤¼±ôæ CveKHœå$Œ˜<Kô:)ÏÄú@.p–8.i–á“Nª®xJ Vxͬá¸HÁ™Ò‰ñs¨Á—¤0D5F‹§qd†NƒÊŒi‘RšõG5ÉÅyå¶¢lM«íÏæ)å¤qÌd"Js-Kãv9aÓxX5QòÙz·þ²ÜáÜ¹X(”$èç³ËOà$H¨ú;ƒEŒËÉ]aæ:Q' lVö“Bjõ›S(jÿ¤ ´0¤ñEçûÈœÔ.™A’3Órp-W £@”¶¸uÜ(BK2Ëæ)v“Ná˜ršÂ9òìlÁðÃAûð®µÎ,Ê €Â:®P4I !%^ûKœ¥†hû0!-ú‡+éy¡8‘²™° y%y »ñê›;€a•À6Γñ:S‚ÜÈ17©ÿ´Ù²ÝûO'Fj¯e2 wú Ù<Ü·ÁXXtÓp<êÅTSi8é€ “ãu¯2GœuéMÖƒƒâóÔfS–^Rœæ50ä¿”ɱ68.õ2['w“²„“WòZÿáË„Ï?OÅšbÜAx¥âæg¢„TÓÚ¦—DÑ‘sµò–†Å ÂSõ‡%°Ó­³Q³ví„êâξ]™Š\álöÔUºVJ.3**‹1L$ŠüGùiõŽ]•’ˆ‹ªÒÉ¢MÉ€Q5ÄÕœÑuÏ~ïÍæ(¯;)T#§¬t,R\³¦0rcO÷຿pRfÇLIâ´Ïè=fÃPJÂOJÖOÌö %Õšã™RÈpÝfëûëe´•"X3 w&G)G_¨V?Ë‹bI6¦"=Q²}ÄÛKÙ1¦ÈÕõ×G~.hHÆÀ…èl SæT@*=S[ar³Èša!ËLc(ƒvÀ‹éü‹£X¯¹ôн(¶Ä°ˆ­2ƒkçPgÓá`¡lÔ%ë\B)cJfÎñ ¤Ó Ü«ø•9õ^`¾±9u1ÍŽœ“N)Ö}Ôzqr¦†ùŒÔ‘A} i“f§‘J šƒ6|&ns²Áó]&yO¯(‹ÞõlôY@T£IÉ´V5¤'/:I i˜ÅêàËmbÒBðwZl’!•ÉþO¹åÁˆ½™daé5¥y„¶1x¥3ˆÂP3ÂBi䣻f×^GþëVï \ `Òz„L…!ÅŠÏŽ¸ °ç$«wÓáÌIycÔt;·Ñ`$?°Xi©ÚxÍ ²f¶c´¡€›9»ß”¾X’:Y‘iD0EfÃNRœÜ¢(”srГ²epsR~ª;ø(¬:7u÷[7†jî´ÑyÞŸ€íìžN©T*UÇ,p¦œäÕ?…ºMÊ®)p6¸²Šî:³é9²›P&ýi£%Ê*#ÿT ®¬7JMX‘%ëròb*ЊQœÂ=)¡Šºp¶Pr xISiÖ} Œ&ÞÐú^{2«¥JD!EžÃe¤¾gé^ßF#DŸ®xõ¥ß™…¦Å{xFâtO'_¢K‰B…ÙÅD(w^u""ž×0!Àïù]ByeÐX߇vø×­?1«q”ÉOQ6ᆔA<Ë¡Me3˜Ó™rÏ[CÈCJZÖky:ì;%; Wó4QHÉ}†Ï9…1ªÊ%Oº«ŒŒp8”ZI¼À–yѽ†BI ¨Ãð%§œê F š›P®æ­É”SÑÒh¤"ñÐ<$_ «Š1Î7åë¦1ûŽôÿ,nñ…r*V#€ä1ðÁ ÷] …›'µÄÓ9Õ ª**´H^HÉî bÐ/ÍñqT†ºôîÜŒ^÷Æè:SÌ3%µI-óÊìI}Ã!>SÞÜIAw5Å›õ•1[¸©ìÙJ_ÅÍ“Æa`š$`P 99æhíÙ?™ã2TÀéhoÎaŸ]¢"Ãî6Ööî~\JFZµ‹SódJhLqZ'V¬j‡4Š U¿A9>>pÇ¿Ÿ(ý÷Ìû_&7Å3 “1¸bHé—gšë E­‰m൶¶ %gb¼;d«Á3êŠ Vw(<{çžÄ„U«‹Ügé~à”&è0;=gFÌÈ*d‚‹W±ð°ýŒ£L"ëÓ/0}YpŸ ¼pmÆÃÍqš§™%»@|V<€ÎðÔlˆ>;+U3Š7tòÕêy‹´öJ1Nê8R`Ä~{ȼ<øU©óŒÃ`8VŠÎÈ 4Þ›â¥â‰B¤‰fŸy¶áP+m +² Ñ:¦h¥(šÈVÇG%VSKÌÝq“0ŒþÉžfBá5QS=±’R—­kxÞ:Gq•™J4XÄlu™°Ò(tcvQÖKÂ7‹îàØ„Ò,¿ž“Ý5,i‘’Û‹Ü©n[F8Y0—ð$§øå€¨I“•Ÿ‘Áf”ÈâYŒE6Ç…û„)×¶³2K8¼~>hÔÖ ݶ&e)¢XM‰I²+ë ²`ó>¤4n»-à`x™&+?§%#<…âŒN¢Ï­Ö×lnή hØÊs„¤ªz\vçi‘õU£§­ JÛ€IwlÊ:‡¶+Ï„æaÑP Ž ÈLZ氉뮭PdC™do$êh\Q3±’BÑ`Í×jäÙ ù u¢ìˆñ®÷…¦§.ZnWä:M'!¢OƒBê„6/sH&P”uÓ2G²6×âÙEQipÁÏýÁL` §¯0P*`€°âVÎ{œÍ.;Š3³-pY€ö˜b;¡Ôײ°Šu½¥c§,Åœ”Ñ&v½sZBg=N˜Á‰å ë7JQ«­c=(ÌêµÍ¾äˆâ1Ö¸ö鉣É~xÎòz$;¼Ô‚â´žPŽ$ž?Î-k?ªÖÕT})ýÖ@*™áEÒ­H©ÛL3QÖˆ>)¢¥wÓÏU)·ˆ‰ ¦¢Wh§Q7~Üö¬œº ÃlàÆ1ÄŠîgø&Ê®U\/*\]tFmî=³5©ºklÜ{ÓGÊÛÔ¸ 8¡A¡àä(…cnBÁ®å¾$Ï‹h"êÙáМ­Væì"ØÖ¤MÓ§óV…¥Éd´·N©IÓeöF3Éä6::åˆmé„ Nߊb»…wðà®È^µSå÷ ©ºÊŒŒ©Cn9«DÐòâfig¤¢3„åZÀ-À:B‹±ßSFXÇ 0R|ÌP×g³x 7'ë,c§”û"s/Ï– .Z¸Eça¸»äd7 ®>ʕל±©Š#ô×+âˆ×>Ù>l¸QÒJ,Æ™C•5f'³nyt‡˜·ü ð¶ Étj<®l¾º…ע˪Jg¤#pZ1#£ƒyÂêf™'Çnà”ë,MKr•»;k„“>,‚@ëeo¢fö¡¡¬ã 7ÇUÝ=e8¨y\Ìg˜2EnK’™wÌ`>0Ú®ÔX‰àÖ‰±ÌþcœÁI€Ä3­X]Âìœ>XOËH¥ø~T4Œá6^àÔÎv máÔô©h˜E'œ e› :z3Sè\C\J!vÁèÿáæ é~BƒiO´Fö‹•Ò®…JM¸z@¦¦s9N€”n…Q5ÄŽÿ2 âB»X£™ÿnwؽ»Ò¿U›n»Ÿþ[ýÏŸ¯Âî7W*ÈÐ"®ZǃÝÛ«ÜÀ±<Ö©z~ÕOæW|pøÊwó>¼:û¾ ˆ,+$çmæt(H¥/È<°Þg)x×kÐê7Ù•©ÝÝ\ícëö/%,%´Ý5RÇä»þ[åh†JDV¯NQΛ2CEÙ©˜´ÆsŠÂî•M nñ“¹zbá":Áìzÿ&%­H_ã~?Xf‰qº8y°ÂPE‹±‹ÓF·H‡ä¤Ë¬ü ”9T‹7}¥z¯Šç.å‹0gûTÎÆÅÉiŠW:Vd½Q^=™‹+gG#Ï‚í¯Êø úæ3€æ·ãPu•Þìä•‹íÀ3€Æ~…Ÿ›££ËT£àY0²"írðÚ,ƒK_‘Æ0!=¨fK ¡Jr!\\Äu°¡‰·((!¬Vî"œ]ª:/½¼Rï `s¶kÆGDj8/6¦Ïàlk¤ª.ÄAé—gמÁ³¼ÁŠ …ƒ‡ N×rq6öÀ1móË Tu „È5Í“jœÌðnKµ$@È,Þ.Ì®áå)ÔFgŠWÀF×B’‰šLQC°"c—v'+ Å#k3_0ynÞ>Ô#<û=_^îrÐÒÆ‘¤ÌYe4YïfdЉ’³·B¦üÅ-ÆÎ¦æa›x±Kÿ  ÄÄ\è^Q/ö´4*öZ¿"·ýQ@n„yRÔˆB´uG)^k…Ê×ÎYd/›Çrd îºa3x9µï@»ä»nF†2œ=&÷u)¬gGôjŽ,¥ÓhT@´CÜå}3ÎzÒ.M0¨ …Ò¿ŽWgàµ%†ÙQáâ¦3€¹ ¢öŸªk|yªÇ<£ž¯ñ+hôú(ø·ÓÅ]îÎæP˜çN%‚EEúåLŒgðZwÔ‹#sâ% §˜&Y=bŒ¯ƒ1Oñš- ‡h9(¥¹¸~á à˜!‡|q1þc€Åc|<ïTñ6Ô4‘rîвyX·‰âì¹÷éℨG½ë±Õ´^œVp° ;ˆ¦s|èÃË3G΢uOo-ÉÛ)ë#ÅdTÀÜ<†}9ÍíÀj™lÊ °‹û(z+BQÆÒÄŠ&(`NùÆ tìDOAõ+¹RBFÄmÄ+^ñ’…œ¿†Bü  äLŒA)`«3jO ’YBâ¥\PAÝ×j?õFÔ»åŽ_WTxŒO–ÏO O ìͼ ªmç:i×(€U՚ĚgSâ1ª WŠyRš©3–bE‘4:u¡~eåÀŠb.5 .g9?Ø['º’J7žj¨5—W‡ÌA– å £Ì,qûôÕpBµeX>æ°p®P8¬…g“!uÈJòiöİfÞ<{B²{úÅɈg24×…"-¤B1d\Éœ¥I/'A:8Óm-Ñ ×j5z= `±x ëà)`C<†& p”FÔ“”„hB)`™y&G³§YóWpŸÁ12Or^â Çp%D?2.Ïô>X-€®ÿxqåÐÀnô²pdWYâ ÇÔ‹9µÏæŽ!‰}ÓÎô\+`÷ä¤ÂYg}â%I( u ¤å­( WD”¯(–=Ø¡9^­q«^^¦r0!|.Ø5¤„Ïu/Ïõ>hmòŸ²(ea¼ÀªN]²<“f=° "ÃÛ×(mE¾ö5é•¢çÒ,g‡º¡Ê|ånz:R¼"çÊC­6u_wïRáÉ¥ìëam¸?†² Õ„j‘y¡ çìÐ7¦8¼P]!…gãY‚¦xU Å¢€93wµImÄ”6(p¡ïÚ{S¹5Kß×ÕLƒàW<É^9Ú)Ñdl-íZ”¯¨)0YY0ä;TÀÒÝu}yó@«Ø¦¹®íwæ+ç%oÐÙ.îët°.^íÎhœ/f"8ˆÚ:žîZ'éUÛÃîVÀ2ûGsÊ'°–¯íŒ{°u+ ÛÉ6ô•Y€Þ%ܳ^)€ž0(Z| ÅûËÎWÓfê$õ¡fÐAÂ@9&Õ[ˆÒÊû YEc5B2 x¦‘ć:(`jNRÕ)š&*´¢·3ç:RV¨7h›g¡ºRÄ·jrœ“ÄQ†Õ€B¢ - ^›ðÆpð†LF©‹éUÔŒøùÀ•LYd´¢ö¾D™£  Ä[—ÎŽEw!o[Ãö4žéþäßg±¸_Å z‘4³7<ˆ²Þ1QUÁè_u )ã‹Öï—ؼÓb H[dÜðШEÈjÊ ªUR™›:-9D¢‡NÅ“]gW«òÖ 1_ \ûI˜#ÔkÉÂ1¬ÔO#’eVŸÃËÌ´¤6OâŽ,„çÑ;R .ˆãW6Ï8ˆŽÂ<+Þìf¢óÇêX„˜fØœù‰çtÅÜI#FÝЇcxrj¾¸w0#óäUcëfe ¡ÅVt‹±q6M]º ‰OÍJ˜ÝULo(pϳi/ïWyPŒº”T¦ÃNï‘õ˜P-½ÐUëA @Y+¦ßÚ_Ú fJ(Yñšêü*`Wˆª¥dzW¥x ÁàV¼Kà,²ÚOIeMó¼4¡SÆp CÛ† … x'£N$3ã'è‰Ë¬MãyŠÄìY½Û#XhÅ`¡_Ûdì ZàÀ³>(Úµö&ÄÌJ8f—Ž4Dã)éÄœ;ôö˜<”Rê *§k¥T&¨öz$ZPèL79(Y+q3ÑE }kˆ9.ï;û(`1Î)ˆšËû´L³ ‘Sµª€ØÍ(︜%ÿ `+ƒ¨v4b2—f䬉8ß9M¹¶žíÉ:$VJRˆ¶¨Êu€[˜2…`ëF8ñÊU©¶fðbÿM4šd4 „ údd§Õ& Y¢çØß”´E°k3ã1Ý9tq’C¢ˆë¦ûÙ )¹®ív=…»PÌäÞ—8Y%e=˜>ÃŽN¢Í\ës'ëZX<ÆkÔ€àÇÄ((…‰Å} 'ÅÃ1¹Ÿ†·4¤ FÐóæQÆJI2È-Tiº. i„¨;äqê ¨3ÕF8X¯<3×iÀrvNÂ`èš}¼ˆ6£â!?Ÿg3*àȉ˜ƒÝÒ21K½W8Iýðú¸' S$:¯‹7¦ÎÎgtB£òf+`ΙX‹§€Ò˜‘K´’¶ð9Ë ‰<±R‰O,û‘( ÅbY¼ä)„•LSÐÔ™º-ÊWëΣ‘@Ÿ™ž‰ý­½ÇG£d] áE¢E6Ú’PÏÈ;ɪT[=#B«”EQ jÆÏ/n‘{o$^±:$NéÏi<¡€%$bFø@§õL¬©Ew¿^ˆ%PH™Bd}@CC©ÄŒpk Ö‰üÇ èhI«,A-¨Î{càe‹Ç(“¥œ`K+ÍD‚J˜ÙÅ—’´ÀÔ„—Ä@±4RL €Ö•íÀÑ/INB²Žæ,ѼbÕŒ¤Êi¶È»P€7„ÈÃ*ÈÐ…æ‚^IÂsA°ÖÊ£%à)jÊ ‘M,*ao9Òº¨Ø<ŽvDÏáofiI%b«%æB$¬ toº( ǵX8°òºðHP ñ!2a˜Uk¨‹db8€m6x¥pj ²÷RâÑ-0o6)³€ 逰>iÁZZGsVó& ºº‘*_Õˆ2F`’‰@b–9àF‰¼Êi jBµÄÔ»ôvTíz臅×5 €}õY•š½uG-$ÀÜ/s€ÕªÏ99ÒÀëŸZP#ïDÇSZL €Òˆ9×ì‘ÈÒ 1Yïg*`êÄB(Jj<Ö6è5<À¼ .Èj𠼄ˆ ©‘ð¬³2‹m € f2‹€¨Â«`]䈽‰ë"£l €Èê’­hœX‘‘l´‹À­FĨЀhi>¬ÿ3º¹S б5S^Y¼‹;¨0)ʰv„dt„áx•¨&w¢nìºdDЪ&i„ Zôœ[¹.=7^VƒD[Ö¢1Z$˜SþCÇŒ¼.—lˆñä+éf“ âxU@ø Ù©ÀÄd |i¤7†¤‚üŸâ¼ˆžÍP‹Z¡³63‰ÒP×¢ÙGŠkXñ"èd†¤7ˆÉ°6MR !Ú¦I([rÆÊΈw°"€ÎÊ&à•è“KQ—W ¼lj KVÀš¹/Ü-"ƒž_Œ]ôj7>`øBçNsq%$Pî'Dí>OÒ(`GLÆšZPvZPˆÉÐÔüÉÐtWä*`b$P°YŸ¼2¯,!¹Ñ(ÕUSMD‡— b2,Æb¶ââZ(^Hˆ Ón¼$KŠ•¨þ+`1âl–ª€u¸Z(®kÙµõÀÙØ(\âu|Ú,03rõX%órÐØ8›Äú/©©a"̃¢B2¼£Ü–jÄÙÑ*Ñ)€½¸¼nŒüTIjBõÁ¼tÿ¹-12×'PlhÎì1sW — ¯“5: ‘™GÒ0R"o ˆhø’ÂëוQ2Àêl¡ÌÁ+#Å«¶äÞ•J‰É+ ˆÖyÂ+Chy_š@ XŠo¬½Ô 8RcnCÕ¤3·ZQ(B§9å²Çi±m2ç¤$+ Î!êí3î€Ù¸³“   X½Xj°gf2_ëW(m1sì¼.XÄÌìÄäÀ ŠëÄ#\`BU#PbárܽÄ%«Ò¥5A‘¬sG Ê(`AÅü À†dZTF‡ƒÞ¹Y'(šÃFñÊŒÉ+b2¬æCA˜¢«ëÈ*±BAso<’,V5ÐòаWç­ŠÃ&#3ä%/*`†^Ãj? @éÔ `,=â+UÔ«vÌËÐ\ö (Ë å1E7T@Äc …R`U¢Š-bÿi¦YÚÈ9) (!³Ã°•LÌ7,Ñ|š˜ÃÄh[.%-) ¯71 Âè4á €u4b•‚cÐf¥Ñµ¢˜ Ú,‰)½²~˜ˆ¥( ØGæ‘H)jK<G¤€ÖM7k@jE‰Â@§îX‘OÓvnwؽ»Ò¿3”…Ÿþ[ýÏŸ¯Âî7W%©zÃ/ÃßTvo¯ô-T 8|pwõÝ#>I½¿ü)UÃä»jýdûZaÇÝ?µ~²}jH1¢Òû§ÖO6OI4ŠŒíà×O¶O¿Ðýnž »Wg×&ÝXB‰]¶kSðÇeŠÔ„lÁ÷ûðì:Âæˆûôïaì¨uŸì€¾VÆ>¯ÿ£‡¼/ëc½ç½èÿøÓóo}aKzbØ((ÁÌt¶à­õizøäB^?8zQ¹xôÐüäè)c”lÛ§æ'GOuˆð¸}j~²}ª…°.Þ|jýäè©ù>›§6oøe‹‚¹ÆÊ”˜Œ'½Âýà:[•¡«ÕjÕeyvtÒՈӅп3ŠØuæ›øûýÊŠ±9ë'-AaÆ[ÞæÁ'Ûƒ„Óšb·zVÙþnØ>Š)øúæo{æîêõNï“´ïÁoÑêíÕ» 9ó* f³±ýï?~zÿn÷úýçoÞ½ÚýôáÍËÛ%6¡1€+Å&Îìª"ì:ê²¢lôùNäËowïžá¹ øùí·lâóéÙ îIf¸{{ó·#yu:31£ä®ìFñì…óËÔ×Ç„ÖúÉýô?%Žž:+Žž:+¶O—GGO‘GG¿wz°ï÷àûðГûðÔ“ûðÔ“ûpž<؇§6P‘‚/óe—£.¹êhL~q,"DN¬Fª¥§“Â¥€¦£Ñ˜n°OÚ v«SÀÉíÃéСxU"¯î€Jª¥b6fb…4Ñ‹ ¶Ç pÝ 5Æ +•€ÝŒÚÑÕ‘ÙH³‹8 pƒT: ¼#ÏÓ]RS ¹s0Ì30(ÓûD‰°Ua.ŠŽ,Tžo€ Þ'Zv,È f9܈+) xÎ'ZÏt¤¦„D«á^).®Yã«Ýƒ…ÒMUG^rOQ53ÖJ$ÁÊÁ÷´ŒBfñv¡öæ9 ƒÒ¯.ÃØ¼B"æšxI¬FÔº“°çBìù—“êéÂ܇z„£s{FJû„ÜÏ}笲G‰yíEÕP FÔBâU`B²£µ…#Pf£Ò¢8ÕÍsÀ1 ±Udv âIQ#ªUÞ•Óòµs¹,£t'\¦}ðâ7,™Ø¯HñªVoL$¦DïJÅ‘…hõÇ4áOëLâ|D‹¢`P )Á¬.‡ÈK™\œœ^k ˜Ë jÿ h]¸HlqÀëF e„ØÍÑÅkÞ†¼”Ùæ„tîT"ïÏM±A¯!!’)§mQ²ªù$L¾r,H®Ùè(€m¦ÍpÚz)àèž®) šJXRÊDhtà X‘£ÇºMÏ¢8´¶ó%Z-=-€Å²Y:WÁ‡ƒW¥ À>ˆé`¥ènɉÈù®€Î4e°F"·'»¯{Œ££ ˜Sc¾±ŠÕÚ‰rR ¶è(„þ¼+^ñÒð>ö…‘w@A@†ƒR@8}h$¥È‚/eL…º¯Å‹yz—¶D¤ à@>0­‹H©Kb^PÕ¶sEc Î\­­z ÅmQà-Ä~u¥™:â@)ÅýUëOD~ ¢·oG'º’ŠÞíÌd`f‹ÇêºXCâöé«á„j˰|^[’‡µðl2¤gJeÚjBF´'$,!»§¡SZÒ*`2’–ëB%òZ¯Í6'”„oŽÁt[ƒÑ!»Ûº08UXšž Q¬¥¡ŽÒˆzècz'šPàYšy&G3H'<«¿P oÅ12Or^â Çp%ÌÝ‹þ;Å@QÀš¼èŸÓ8K{õ¢Žì*Kœá - ó ÇDƒ¾igz®QÀxõеž5“$0›ZÃÊ[Q@)Þm­1¸âØŒ£…åx•ªW]åÑÒ0IãU °Xû6VÇ:¤o§V·d àèÄÀ*¨TRäQª°Xm_« 5 ˆ€# ¯^½`q-zN{ånz:­€U¨ûº›‚Dão*xUxÄ@Ù†Ãi/U«£ïkŠÃKñºžg šb)ƒâ QÀœ™»Z¤6bJ¸Ðw Ý)ŽÜ æCïJ%a¨€Öj™à­Tö.WMVÀÖˆ}SJõFETÀÄlsRŒ¤òZ*°%¦ëÚŽpg¾r^R 6‘àl©Gëֽ-šÔ¦to£é®zsÆZxÔ,Aˆå XK%†µPå`]©XQ(ØN¡÷´Ö‡þrÀ,ƒÇÀÊëë ¸ŽL‡s…2¾jÚL`ꢬq]2è(J¦“ºâç´ò>¨GVÑX­çPB„d:ê H€ t®­) P’A±,Źޔê Ú,cyâNª}IH4aQ’° Ñ„–¯€ÍÎIY8÷SW°ZâfÐ_$³!~>²ÚQ â细rN†â±­#gÇ¢»·­a{"ÄÓ¡\3Ö¤[\,2£O0ðÙ©­DHD٠ªƒ'»RƧã²p ++Ì@#Ò75{(  @ÄÆÈÌH38x”5 ]å•iÁ°Ó{¤¡í7%ÙÒ ]µ”r·;Óo­€H¹ÐÌ”P²â5ÕùUÀª£¬ ª–’é]•âT@‚Â: œEÖG6¿ä¥ ’0¦€ñÚ6D¯D«gdÝɨÉÌø‰VfmšÑ-Fbö¬Þí, ´bDN*qMôÃâY!ƒ¢]÷hsÇˬ„ƒ!6¢4ì xìÄœ;”1xüÆ4YŸ&N-( ǰ,(Ì“£’µ¢x"™è"…¾5ă"\áóÉ®[7Fsn¦YÐÈ©ZU@ìf”wtJ GGSÇAÔ p8U`䬉,)3•k, Ví0¦ `‹`­…[˜2…z· ÂñˆÇPFˆžŽÕ”†HI¹SÀ’Üq=(!(¬µkpã%µÅ!6=ÂÌsJ§h'90Z°&/ü¥äº*^¯žÂ](frïKœ, ƒ;Caú P,¹’Ø-ã5j@ôtÄ(žfbqŸÂIñpŒpî'o(Ê @ çÍ£Œ•’d2[¨Ò:tksQwÈãÔPgªp°^y4f®Ó€å4위ÁÐ5°T¢Í¨xÈÏçÙŒ 8r"fÁ`·´LÌÆRÀ Oýðú¸'(àìÙÃq„+^·è96 e‚Ǟɛ­€9gb-žJcF.°[øœå„DžX©Äƒ'–ýH†b±,^òÔð 4¥aT[ ˜'‰¢ £1Á$¬çÐH(`é™Hѯ€Íhp×S.¨j^žE6Ú’BcždUª­ž‘Ô¶€uÆÏéGâ‹ ¸)ý9'°„DÌWÀj$ ‘TS«€½b Rf£Y0K%f„+ ŒNä?VÀž‰uÔ‚êĶ|Š—Sä1 P&K%8ÀfÛXmJƒJ˜\xIëLMˆ­^Qžei&¤˜›4^¶G¼$9 i™íÜ)¢xŪI•Ól‘w¡o‘‡U¡9 Í ¼’„ç‚`­ÌþõÁªDQƒ–\D4±¨ÄŽ×o^ñjŽ<ŽvDÏáo¦ô/²Ä@lµÀ\ˆ„•4t´QN2Â•Øæ5¨…x Љ0Lƒª5ÔE21ÀÖ#SS½—n€Éx³I™õ”PxLwlÖ¬àh•×¼I‚®n¤ÊW5¢Œ˜d¢˜e¸Q"¯rZ‚šP-1õ.½Ý#U»úaáuM`Âc}d¥foÝÁ颭€¹5^æ «UŸsr¤×…9>µ F$Þ' ˜3‘T€Òˆ9×ì‘ÈÒ QE“¥€© ¡(©ñXØ ×ðó‚¸ «i&ð"2¤FvÀ+=ñضØ`&³aˆ*¼ ÖEŽ¨Ñ›8XÃcKæ¦"«J¶¢q `EDF²Ñ.R´£B#ª ­¦€¿‘à…`ÁA1¶fÊ+«¶€ ¨0)ʰv„dt„áx•¨&w¢nìºdDЪ&i„ Zôœ[¹.=7^VƒD[Ö¢1Z$˜SþCÇŒ¼.—lˆñä+éf“ âxU@ø Ù©ÀÄd |i¤7†¤‚üŸâ¼ˆžÍP‹Z¡³63‰ÒP×¢ÙGŠkXñ"èd†¤7ˆÉ°6MR !Ú¦I([rÆÊΈw°"€ÎÊ&à•è“KQ—W ¼lj KVÀš¹/Ü-"ƒž_Œ]ôj7>`øBçNsq%$Pî'Dí>OÒ(`GLÆšZPvZPˆÉÐÔüÉÐtWä*`b$P°YŸ¼2¯,!¹Ñ(ÕUSMD‡— b2,Æb¶ââZ(^Hˆ Ón¼$KŠ•¨þ+`1âl–ª€u¸Z(®kÙµõÀÙØ(\âu|Ú,03rõX%órÐØ8›Äú/©©a"̃¢B2¼£Ü–jÄÙÑ*Ñ)€½¸¼nŒüTIjBõÁ¼tÿ¹-12×'PlhÎì1sW — ¯“5: ‘™GÒ0R"o ˆhø’ÂëוQ2Àêl¡ÌÁ+#Å«¶äÞ•J‰É+ ˆÖyÂ+Chy_š@ XŠo¬½Ô 8RcnCÕ¤3·ZQ(B§9å²Çi±m2ç¤$+ Î!êí3î€Ù¸³“   X½Xj°gf2_ëW(m1sì¼.XÄÌìÄäÀ ŠëÄ#\`BU#PbárܽÄ%«Ò¥5A‘¬sG Ê(`AÅü À†dZTF‡ƒÞ¹Y'(šÃFñÊŒÉ+b2¬æCA˜¢«ëÈ*±BAso<’,V5ÐòаWç­ŠÃ&#3ä%/*`†^Ãj? @éÔ `,=â+UÔ«vÌËÐ\ö (Ë å1E7T@Äc …R`U¢Š-bÿi¦YÚÈ9) (!³Ã°•LÌ7,Ñ|š˜ÃÄh[.%-) ¯71 Âè4á €u4b•‚cÐf¥Ñµ¢˜ Ú,‰)½²~˜ˆ¥( ØGæ‘H)jK<GÿÝUؽ: «÷[ԣΠl‡a¡˜4Õœübù~ÿë7Ï®ãþÕ³ëfF•DûÏøà>hc”Qö·Ï®³ú>áãBîuÿ_õ¹?=ÿo‘¶?tLøÑç7úÿНŒ¤ýûghwjÝßÜÞ)*¢‹#íßÿ¸þ]÷Ÿ^ãçðXLûÁwKIÚþýÇOïß­ÿ÷¯ßþøæÝ+û`óâÓ‹ås½þúµ%BRcÿkBæýûO›_øñÃ3ôˆ×ŸØ¿;?ýx6úHNiÿæÕëOëcyÿ¯>Û÷K/æi¾Ð§×/Ö§bÞ¿}ñîï÷ÿ†¯ö²ÿi¢§\ËþÍKŸ (ûÛë3}ÿbRDzù‘Ûo~zó/ß¼Ð9µïKÝßý}æØ¿¼{óÓOŽÜšBøèuÖ1¶½wëGÏ|aõtD4<®¶°E÷@Eûß^=ÿÏßïŸ×ë´!®ð€±|ô½ÓG—ý›ÃÜåýÍçsR‰{¬?xØõý~ºÛ<õ~ó÷§ÍßýùžøÑ?mX³ÍǶ|àþˆ¾‡t'w}aûf½¦¸ŽÒ>ÿtæ÷ß9JE—móÝÏÛ/¿ÙüƒmH¼•Nã½-f!£_ØÌœæ£ãšõʰêÞÍ4Ï£i³œt¤áãŸÛ¾Áÿ³Ãûb~%WÁ4§ÎhÝj¶`1H×}w‡ßoü´9ññ%PL¤SApøÉ¿=S‘bîGŸ>øåŽ=çO±ñnМêùñJ×mç+ÇÑCoøjÜ_oeQ‚n!ÌËã)ú°Á±-¦³Xƒ½¶>-CÏÓvZåøEoÖñúBOˆ9û)¶x´6ÿ·øŠY»GßYß<ä£7|½ùŠN(–)YÊ€î§ Òg;ŸiD5eÊ*h·o¸ð¾Mÿ<’§¾T=—rôÛ¡½dÝýµï”½ôÄ(xÛïæÅ‚—áÛs;®ím?ßævúɧ¨ëŸßϫǮB¿ú>\z"W™À [Á¯ï÷ù~ü‹¡“Ga ÿ„÷_æÀ¯K®VX{2*À¢/ážR°hÇþ‡Ã±¶Y½›G½T›5<$Cï˜yœ-«Ïövßù³ï?û‘Q…æëðKìþôÑ×ë£å¬ÀÙ®}ûíFîØ–ú¤Û#öÜF:ñ÷êë.ºÿÊv­«‡ö~<:ÍÛcõòá~Ùþ”RWoæöÚ~u ±r,ÄÞÙìš„úÛ3UÁô5úé‰zt$Ûã²¾ŒAt”X÷œ›‘„Í#ûúôL|8s&^Ÿƒcéøˆ´{s:•§ †;­å£¹[{*–½‰jTf­ƒ²=½¾ÜuIµ¿á»Ãƒºájìû#u×ÄëgÈxÑk;I1ß Ûèõf›‡"‡?ÇÜñz¾*"¼qÿüt“C#€À\ï¾ÛÍ'—OÖ_ùÑ+ö°Ø/…v:aö3:Ø_o÷ƫӽñátý’û¥b-¡½£þS+Å=ßoÕö_ ÖÒ@L§Coçh®ŽÝÉ©¹œ¹ß\˜UÝ-î#ŸÉ/cxV•·ø…ŠÑ\„»ûSðqÝÕ¿°œìn|à¿úø)X÷ÁÍA˜þ‡Í—ÏÑ[•=&µýü”¼|ü;v´Ú¬©iiGËl7®õÀÄcùõÉô˜^± ]Dc;ú÷Y—#ºZŽ#ððf¨Sˆùûˆ&xÿÖ/ѹ§³•œ(…0IæËÛ#Ð4êc2ð8û|Fï¹[©}ÙUƒyøú«ÆgJN>Á‰²s?¹ÐÿíÜp{ªXÚÝâ€ÖÖ»å•ÿ¸Œö媗îó’³½ÏOÏõz¥äilßÿßÎà½õAVQýï§ûóv·™Ü,ôÇ3ÇÙo™ùš~´ÀÛ®†‡ZInS­ÈÑ ²™šÃ8®_KfÈ+G¢|‰¬Šûoà<)ˆP=>OÜÖûì%”ìš»=S2­ìøä$5êYÁ¯ŠgÓÿ"Êä‰îÀÅ÷îô¼<°¼~úRÍåíñ•ùè ~ ¹¼ôWI¡ÞÏ2¶r~‡0¤¶Ûskÿ¬ÈöúÅË)ÄYýé¥ Ë:õ…w÷ûõŸ/5B?˜[õÅ«%Û\ÎGo}äÐo·ÂâT3܈;äïëõ· ô|J1>}ßoÍ›Ãç4´sà»ÓÓpx]9(ùÒíÉ| 5œ¬ò`û÷ß× œºªÛQóç£ñéîUa;V»æÄ³¼Ý‚¼FùĹéZsµDÅyXuÌÚÒå‡jÊö½_»–cõ÷}™E/qª®·VwÉùRT^—öý>â'T£ü{¾tÏLj×7£s7èã{Ä\3ýà(«ÌžG½R&çœíñæô¶x·nÞ^¨c.©’O‚|+²…kNýN§Æ^)¦[=ÍóœŠçWŸŠ‹4óþ<‰+L\çc+1N& Ïõ3!ƒ3~…‰}þtØ#Ù\£qóHõoÖ{ÿõ“óé¬Äqìôys0rîÇ‹X„õ…¡^dpûªÉ‡>Va!›ƒŸnU•дwžî?:NŽsƒ™Ñï—`œûÙ_oªÓ³Y³NíFÑ?£ŒüRgšÈô,»Ô‘¹Þ™Î>p׃_çšïV¶»aó‘ÐØ®÷?ùØŽŽpÑ߬eœ\Î÷wÿ Æl4ûw ¦ÃwögGÿ¹—ó·2PñÐÁõÀŸu»>\O¾œžPƒðïó‡-ý§ÈçnÕíùÍzpòÑãË©XN¿S,YâQo"7ówÿíø\ðÞú }cã{€€xÁö¸%H}úéƒS…q¹|ÀQ:¸F·o³*©êÙøwˆ»—'›é`á_O/çOG&ø‘ÛÒ3öN¤@®:ÇÇÂçè^¯o|¼ÙÒÖªðf“;Ó'öî°WO´P<Wmk{Iz@íF)Ûƒ]xæ¬ïÿ2‰NϾ ‘Í8¸ÉâéÍ,œùüÏ]j·sÌC6ÞÈC¨ðH F õÔÞʦ™[ŽWbësÊXÄPxñèmÆæï¶IX½ïÿ÷w$ÊY·ï»ã>ŸùüT|®Ù!yÊ'á­`E(´l±®v\1;B†ÓHÞ4êu$àÞdÙÍáÿv×? ¤N)÷ëêÙc9Š,¥*68Tó›g³”ªˆæÈúÑ´K…ùg=¹­‚]vpþ¡pȯοÜ{H·Tó6®Þÿ´zRÅÖ?ß;-%Lã!”òÛÿŽÙïßÿå›?}s?€/õÎ~#öí›››»ëuºb¿Øz>îUd9œšÕ‰×`É?ÍS‰§NÓ÷þi=6Ÿ^¸@Îâê,¾õ%ú¬<®Ï>!®ñd¢}¡³î«ôTülö/ttž‹íf§–P¦õ¶ÿøúýç»›Çôä@« 'añ´}ÿsñáõøHJÐÍÊ›ÙÇ'>‹¸1LÀ˜Þ<V—ÊÁ#+õ~¨G¶’}y*©Ó?µ-A$,B—ùú[ëAj¯û©ÑõÂ36B=ä ¸ó@M<¨ GÞüGà¶5¶aÛ¿l~qf @cÏåÞszŸSÏ«/GoûïNÕs¾½ßË•hûÕájÃþ÷3râÞü?Žªpâ…µæ`Ísðâþx¸J2ßìx³ÅÙå¼ï‡=ÓáKgR(æ6ç²-®ò<¢…/fªÉ‹ƒ#ÈHg]õ‚Tõá±@|¿/$­d¥ãúO¾X^ùw›ó`vÎK?Ú–³=·D9Ž z};N{|hsÞ‰ÃW·Ï”Íq²ˆµNi?ɇÚ:4^Ÿ ‡N?ØîáÇã. :E9¹×¯·vè|Îݱ%w· NÈ1çA[.Æ£$›'Œ ‘ñÐYsz—=}Û<•ª¦§Ä%ŠQ˜M‘òD€ô0†Í;Lï`·"²cÿ‘=16g¸nþ–Õ†P_°š;'ª-å½x8Éã=R©,¿® ;’¸<’Úóùp&æ·z0N’ÚN½òf›Ÿº©pÿÕœ7ÐÆ[uz×{JIµÔ·3âù1Q ÅxˆÎø¼V¯ÐêSyô™í)~Ê1bB wÏîg•]¿¹êª‚Y[®ÆÅüö*U”™Èá“»«ï·Ød§óÒP}z/àF±bÜ¡À)¸‰±©¢às²Ún,£‚OèÇ«#¬©9†3hEQ˜ïæ>Œu¦%âý,³Èœ ¦èdÓB¦{W_jêß‘½¯þÿž-iÖZ¾±&‚?œ’—›ßxÿÎm…ÔÎ̓M”ýî=Øgßmø›ø’A€@ã¯zLï¦6æmæùÚ~ëdº|3¬»(·õz™cø Æ Â&­ÄDÝìý›^ SºMäۉ쎟ÃóÛ÷fó“/¿z¼žóïå~XZá1k 3¼©¦=Vˆó»«ÿ%=™½endstream endobj 161 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 282 >> stream xœðþCMR8‹‹øqù-‹ ‹ ›÷‘Á¼¸12OÁøˆø§‹¬ø«¬·Ÿ÷Ú÷Îù¦‰ŒpbcVs,‹j¦‹Á‹Å¦ü•fˆ,hj´Žá‹¸‹¸‹â‹´ˆ½ #¬h,ˆ—°ø§‹Ý÷ïôí¬Àô÷tê÷®÷`›šµ¬›™ÉÄÆÂ‹æ÷ 'Øûû <02Z²„™ ªš±¿Y‹¨ÔΤ¼‹è»<7#B?û û ûû€‹‰‹rø¨÷GlˆwƒYx…ƒ?‹{‹ûF 7Ÿ ‹ ‹ ‹  qZendstream endobj 162 0 obj << /Filter /FlateDecode /Length 267 >> stream xœ3±Ð37U0P0UÐ5S01QrR ¹ ô ‚@c$çr*[€, S Ö53Ë9yré{ú*”•¦ré‡ré{Uqé;8+)—h ¡±\únúÎÎn@n€¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAmcCòÿrrîªX'>:\›û2éö¥û¿/Ýÿ?BÍF?þÿûßqW«­þþýíûüç®7¾¹0ETó󾱑>øá¾¡=ïïß¿ëþý/vûÐü±þþÿ__Ÿ1K5i~ýÿ~í×÷ë¾Þ÷N|™û2ÇFuC…7‹ŽÁ†„M,îÿÿ08°p¹z*rÁe%endstream endobj 163 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 278 >> stream xœ ôþCMR7‹‹øù,‹ ‹ ›÷Á¼¸12Q½øˆøÍ‹¯ø¤¯·Ÿ÷’Ü÷ãù¦‰ŒoKL0Šb‹g£‹Í‹Â§ü’j‹~'egŒ÷ް‹ª‹÷ˆ¡Š½ #¯e'‹˜¬øÍ‹à÷ìõè¯Êõ÷ƒìø÷JiˆuP~ƒ…>‹}‹ûLôè®§ÇºÕÆÐÉ‹ê÷ !Õûû74/X¶†•£¨œ¯„®WªÒÏ¡º‹ï¿=:4MFkgû…û‚‚‹‰‹oø0 7Ÿ ‹ ‹ ‹ àIpÆendstream endobj 164 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2613 >> stream xœµViTSg¾!{U J¼tÎMQ[+u¬V-ÚÖ™ªEѺT¬•²Ê"&@Q "YÞ„U"²&“B@ H•*.m- Sµ¶Zk]:Î蜣N«e¾Ëùü1_@¨sæÌÌŸNò'çäKîó=Ûû (OJ ˆV¬Û4žûÓ4À±C§‡Â½À[Þž5¿ññôCÏOºú\ÏDÊýššš–.Wdd*wÅÆeÇçlOHLÞ¶y§T6g.Em Þ£6R›¨0j3NEP[¨åÔ êêjB­¤VQ«©5ÔBjµ–ZG­§|¨ç¨iåI•Sÿh=&x¨„s„ áWžk<ÿæ•!/’‹úè÷é³Ìo™Ãã|Æ}6þñ×'LøÁ;È;”×úò§ÀÉ{¹”?äq%\˜"îFè>‹Ít”B9)Ýf8il;œÒÒâ=ÃI‡ª¡[‚ÖÒ/íï3…oâ°ê?žÝ Ð73(Œ†Ûà”¶«jS6ÂrˆŒI[Lj¯þLã@µ—”w_¬(ø@âËkÕ6~žEÐt5ßò;Q ‹&ÏÄ>xRàI˜}ü ‡|~|€Ä–ãH6¢ÍéÇGá<´C'œ¶mÀ¥°ù ^@57¦ˆï£·yov€Æ3Ýp.•FKÄן$Þëá”ÑpR×ö,oÑûéÒ\áW€A?@,=Äžñý¥½[ÉãjeÐŽ“=Ž“À\>¿{aŸàeñ ]é• Ð@YŸ" ²ínð;tÕ®óϳxÕGÀŸSÒ ó¼Ä÷›rãúÞœ†™éAøy<éþKˆ!ø/B׋ƒ)FRÒ°3;M™‘«Ú™ Ìòõw&\¼ñõw®…„øi£6¼=E|½‰n±ÈƒÆ7!Ãꈻ1E§á¸± Ãq8¬uÃÙE/Ó™Ú%h.ýÐuçJ¹ôFN«ßr&ͼÇRg;ÐÒ"uÄpâ«Ë!)TC.Í©-üëõ~­6Å ”mË<1E|mG¬EóýG°‚y?9~ipÒ¹[Yœ¶J_²˜\(È–`: L¥C}=g4‚±®þhl·ÞL ýé«^YsÞIJËöŠØ b¯0ShÕ§SÛì]·‘Gé|©‘3äï#0UPZ/ù‘®…ru‘òr9­fo¾F›Ð{€Á¾ ¡aÉ5iJ‰øN‹¼©ð+믶¡Y (͉7_@SmB´ŒŸÉ¢N<­UˆôKd/ÌÖ0Ê[ØAãçîåµ_jºÔÏSl¦—ÉC᯵ñžÚ¢t¢ÇÒ–ÅO»ÆÎ§ÑL“—“ÙWÞChFˆÆ³ÆhÇ+é…ÛV-Ö?Å¡[O¿ù´¯Ip½æ¡9œ8ë,mr|á¶’ÚÌOu êy•_ˆn³ûÿP{dÀÀ8éL]ª>2àCcŽ(&¥;ô¦LÈ‚|F£~WøcOÔRXEè1Ø;¡ŽsÒ2}˜.Ò!Þ 3ÿ¤J «¤h&Fþe*cQTAÉþ’JÆ[KŽí´Øÿ2ÿî1‹Ÿëê¶»(øÂeÛ±¬ݾ–Ä7ÆÆ|þàuÉYE½QQ¨NÑt—r(’t&ulïÜZ³ ˜%+#WËrìMu öE­$m=¦`zÎmM’H‹ô¾¯ Ñ®•½½C±¢™7î+ú8ò8v¸þ8S€³³è9+vD}×öÉ× ´¤l„vÂË Jt&~I¼‹.>ü0ÕOîÙhƒ¡â`ãqFÜ“YíÚúõ´Ñ\Ï~ˆEñž¥ùQ6Éu ‹âh¨ƒ©¦óì™ +tC»Üš`+Þq¨ÛµKšQdÍè Q/†ºá¨ÇZênòJ"ÑM!¿Ýaí}' 50¦P6D•# 9õ59¤?÷êuEy/a½?"‹¦RW%ö¨' Éõ«u9Ï*t‚@:˜Œ‚žü‹rU)…¹ÊÍi+ß…" R×9K*,PÃØ³j2w+seQ®¤OúºÎ³‚Þ#în½Ûas·Ï–»*¢Oz6•EÁß»z÷÷é“Ú¸8m¡ ryÝî&{Cmó—¿ïüžô*¦ðDNü3žüðeÄ ©-È»²r/h‰« u\êÜ5y‰ÀˆùˆGÐ"Ò2ïŸl¸lè ›ŸÊ¿Èî7Ç•0Uû ›Ã—Ej¼ÈË&*û©¾yL‹D¸å‰O¾tP *'wF7Dµhƒ—B”ÇïŠÆ ‰ëxÑh®†~Z {ø‰gØÕ4šõK²zøÇÏÊ¥tj{Œ=ÜýÓgc‹¼ŒÜ*÷C÷![ ƒÌž8–&ŠèÔ9²mQÊ·˜öŒå]ÚsÐÆÏÝfçÇ­§¡ \{œQ¦‚3›aSfFË-~då(†éôD¥lš}Óv˜G•xÚv ÎßÅ¢‘¥ÌÃï“鯼:O’6§þDêÙ· ë+÷‹òu…ût\òÌù°¶B|sf‡ì @;ã‹>u÷¶-¼Ya Ï»?Ñ ~‹úÏ'N-®†‚j.O“ &³fw££ºÁÚ‘ØòzD ‡é·¤×ðÕÿÕéß ‘“Y† Œt—y\aÿ;B0DoÈI`УgóEÍÃs ù ú}320E|…ðëYü‚ûÈ÷Q-£j1œ6Z‰4m£Z­)픈,á?f[æ4©2]žn‘;›læwG(CóšüÎÚåýèËþûñeôïÏâÉÎuÕÛOçOŸÿ½iÁ‹£Ê8C!šžNôáð()Ðëó ¸äM2G\×k€…Á ÷.ÿ6]bҜ̻˜Ãˆï544%šå•)¼³uEpêïK{"¸§µýúv}å>ЎιÈá9Wn0šÊ90·ö:wô'Ý!™÷Ýä!_†¿¯þ>˜lC‰„’%f´¬CÐnCwP…M84wh û‰²°’Äé ZTÝŠ^:Âz¥Î¬5d2O¬ôPMç⥢®âŸày?‚®aáãéépð„·ÒÐëJLD¯z Pr/bl$oÖÛÉ]‚Ááà˜Z‰…Ð ‡õ‡u¿øàÝæj + ²²r4Yä\“á3£àÐ;FÎ%‚z±­ò׋ÊHY–\ú¼²¢ï¤ËhvO¯Tm.¤‘=nQ5ÒõúJ5äÂnUÞ¾ˆ}ýùÌ3Ê€xU8 D!CkØgk¾–ÃÛk´ ztÏøÖwèë]Ї'uϯ¹ÿZùPý°Ì5¶O_Û§{FYÀáæ]èT Ùï6§´¸{(ÚÀögtÅ'g§Ëåµéí5Ê**É*åe0èUï¦­Ž”êõ a J5¥®]C4çfsPp{Pˆ6÷²Ž kjjFFjª5Ãá°Zœ/7Þ3¸Á{xï àíGQÿ {H†endstream endobj 165 0 obj << /Filter /FlateDecode /Length 7374 >> stream xœí][sÇq~Gü#N99HëûŒ=8v¤Ä¥rÙS®”¨ˆ¸.Zâ¿O÷LwOÏž=HP•”ªÄƒïÌεû›îùv÷ü¸™'³™ñ?ú÷õåÁ¼9?øñÀTtCÿ¼¾Üüû˃ß|cÌÆ˜©„`7/ÏÚ%f“Ã4»b6É•)y·yyyðÝö‡GódçÙØ²}sxd¶Ç„R\ Û+Îpzxd“LÛ;„S)¾øvaýÎL¦ØVGœg—ãöF•ÓU½Çk.éBéÂÕ¡ ê¿mÍÚÙmß©>fçëwxµ5ÉðçZ“®õ¯wÓl|«6Ïs0a{Ýz¡Z ×ѼE ”gÓ›­ù õݵê]+—àãmeû¡µ‘g±î¢nƒ§+x¸éëú¬GL]6%ì.??üþ埜±S äå ˜Ã{ÕæÚ⤠.ÎCdvüö§qpf9­X®Œ]Â>ü曢í5…ÉÄâ¹K?©þõyZV2Z½5S‚v¹–:£+³å­qÛ_á—?«/¡nƒ•ù|ÅmŽŒŸ¼¦Õõ5Ì ¼ôšì:§°»:dõ=SŠ™3N™Ï©ºJ·gÖí¸ŠrÍbu}ÎðW.…õ‰`ä³E«Ã2Œí3ù"V—ŠÙ;õŠ_)ëùyO™“Ö÷ò¹p]+6b…±Oµ?Ù¤–“¥ãïçkõY÷Y{ìž³²ä~€¥ßáe’+CÎà¨ÀÚ+#~£>¿UŸ_ï)óÅúl­ÍÏS.&^ÔM~…^[€%F«>Û3czVÕlWßs0O>Zr>_Z¸Ô<ûáêËÖ+ðWbÜþC™zµ-&XïÀìsZÝ¿ð;k¢2rí¼ÝÈѺÑ1M©&–`–fؾ<„5ªü¨gç¦Õ›Ê8Zíz¦ê8vø__ùâ^Ï0`tέÚÉÏ@S•Ïjk};vkÕ~´½Úª?Žö4<«Ï/TcvO™W‡÷[¨™=¬§Œ·.G„é±Û?ï³Q^éµ}ÿ~ŒD—ŸJ;ܧmM¿CnÀ–нQZ;|í“«6¿2Š#—2”N‹mmÅ êŽöVí7ºàÑf@Ÿ­ºöcÌ Ì“KAVFOÈ?)ßÙaqÚ]Ѧ ƒ”¸j.D¨¡Üz»Ú‰òã÷ËÕºh"›=:èÓ-ÀܹQUÎᮕKݵº1 x(¾mÎïÄž3/^¶Ò¤žŽÃÀj²Ùµ`¹µí’ÍâŸÌ˜vr0½æ½1¨,šwqsØAô—¼Y]3´óqÙܵi“ ßäYçÊ4‚w´oƒEAžé‘tsr6tvè:jËê·«á ç¹kÓŒ‹ !ÒS¢Cb‰!Ô˜YF‡ûÈ£ÎÝ õ@nÆÂWªH¥ žùÝü_ÛÙ¦ ! ­,XHW­ãuì Æë&Á}‘¬füJЮƇ‹¨°5öÒ[ÿN&8îa\¦Ñä{2?ü 7ƒuB…™^I9W¼žãŸ#“Ü„)Qœk+½Æ%ÈB8ªbaTv(ò~Oï³nf@¬$óiÏz¾Ñ7kÙÄÁţéNŠãœš²3éµ{þó…âxB€K³{c'ìvI6:Lɇ|dçäè~εÏt„ ÎÇX%ƒ“ø·L¶D³·Æ•É{§¦b'âÐ ´Ì‡Û=¸ ÿaXÍá:ÝØû¾e/¦©V ]ÛÙ3ôòü c†…5^.ç¾ZF>qØ5®¤Žê7õô-„Eh Ãá´•NŽ\|Œigœ´Wï;àD;4 gwï¥}*Ë#Üêž“+ì#„žÞÔàh ×6.à«ùsì[kfë¬[Ë ÆƒÐÁî=ÿìb8 ‰Ïîõá\}xáèõÒôñžR³/¹Øä(~`÷6Жé§_-m£^,£›w‹cÕÈ4;ÕMé´-¾Y}É6„TÊ0¸zÞ2–ÞÝÌUU·š×Bð… ǘ×îÕJ^»ç¨lÕ¨À1`yeÚ•«`Vñ ¨lÿÖƒJc¡XêiíOJæÙ±@L‰Ks==ûBIÛæ3âœù…d€æ˜cÚ‡<&E½'†Á^Ãç¥Np)mš`€!&— ʺ£­éXÙ2D«C_Î\y×ff‘Ïü€l!‰4q×]´CÝÒ2˜GølDß^áÒ‡·¸ƒ÷šx:܆ÅyTW¶Òÿ;NÍ Í?Ærz&ÎØlݵ†nŒ[†ÑØ…7°]™qÍhêñ)ôcçøôz¹¦Ýâ)1n 9<±ÅÔÀOò¤Í˯^þëwÛßã%V¢Ôs —<)õ ”Þÿ3Õš]l£*ól½iá1\ê„®í\ ºa¾xÕOÍ"~l=øÏ}I¶Æ‡=Çö.wxÜÞu?Íìæ\­üjΧãƒò|p»\ãzDîg»²ë¬ëüÞ‘£ÿ¹´^¨Ïú´ðJ}>ÝíÞsÆó+Iýµçî„ê«ü‚‰q^ µï¡CÙõ vòÔ•,JŸ¢Ÿ*üÃŵí‡%'+Ô¤Gc‹swî/ÅÆÝl5gíÙ°Gÿñòà¯íf‚›½¿(&-n ä~j·¸qÀTýÇ× ŸËPsÛwi¿í,6×ÌÔˆ ”zÈsW¦yδœo¸9¾ùðj{~qyuz÷êðwxš‰”ûwï.®ï.¯Õwß¿Ú^\__œ~€`“(‰C4@,sy}BÅ·ÿíˆ?;n©V1]ßݼýYjúî…ùmüþÕá n)õoÒ÷ÔÖŽ]º9½}…ÍÔ¡&»?½yûúÍg®Å ¶ÿL߯^œžÝõ!ܾ=9í]ŸqÁ¸Þœö®Ÿ½=sz¸f¤Gxì Ì$>AÕfô£o#i‡ ë·‘à™'~·sP¡iOA]I†OéÇ•«ô®¯¿míHnø ÷”à0+]è»|àºûÖ¡=|ZÐè{%óßÇqq'ÿzˆâ,D¾|ž“Ùü¤£Ù½ÞkaŸ}á½÷{Á‹U'¸y{þæŽËÚOðG—b)‡ç¬–æÌL?ÿãøæ‹__]ß\þZΰºåwÇ··½)U¼÷æîzOû8ÒÚzm5 Ë@»¯¯/¾0¿uèóÆÌ6è&_¿9¾:?åúãX'\x}£fâõ›ÓË6ÄJÎ?€‡NÈÖ¸ì ¾ .Cá߆77§›¿m®³ßü$ ýÛüÉ:À¾ùêÜbBÉÞÀZC–¹¹<GKµB.н&›6&`"+’Ãû èBD2Dü”êU)N¹"xCDE  E« ÐÑ’*âÁ,+’ðDÔhq·« ÑJ7ùÚºÍ0E¸:WÓØ€ˆ¡þ8hö¸ŠÌ ÁìƒßajHjžþçVs¨=Ä4Ï–†DD¾­“+ÙÂ|á'gj£`pføŒ%.Þ¬®Ã¼ù ª‡)µFÖðòÀ˜ÉbÜ-Õˆßsë–a¢£Ó¥é¥L‚©†~¨Q¥(³dÄf禂cïcZ"Ú˜÷zvkø¬½ç#‚Í2ø2„=Å‚Ͱ7·Àdl¿¾>ß|}|ùÃÉñáË¿÷yÃû>‹ÅF¯§¢¸>=;{ûúíéÕÝ-®óòDÚÝG¹¶×JMqöÐÌl R- °T¡"5!’§d+â3–6F+-²ù‘§ZÅ¡ @ã³Arb\"Ø”Be’h*ñ"m{‡Hšj-Ö3V 7ž4Æ'ät@ loeð8 f#Ú‡‚´mqÖ  RæÉã,ù±3?4$×îÀÖRwˆ7ßÔîX”Š*‚V]Ô3L £ 8†jcÆ ÁáŸSk7×€6 [@ o+ ûÐ_×Ï…êª`Œ×Ûª`2Q‡í åº*¢6·¹!¾!¸†Ô-Äøâ¤ÔýÔTQ  £-!ÛÛhÜÒLÂGÜÉR’P+G¤43õÎÐP'#@ã&6$5Zw©!¥!x(ƒƒpsã5 ”:uq ÖgBBC u×€Ô¼ƒÒ4¤:3X¯mKHiØ]]hÒ6Ä!7¤™@„Æ]hH®+!_ AOXLM±ŽkWÁ¾VR3ÛR×/!MWð4Ðdð ƒÿ"âЛª›µ‘'ÜÊpà(mÑ4>ã ©kw4Ž\#»EÝTý€døý€€ÖµéÎwh½®MGBnkÓ¼™½ H.)ðÉ´ìÍ€ÀÚDZŒwè“–‡=Ѽ¡|d ¸{©èqžg"7A`ús¼uD u[âÒ0ÉÐÂÏz¨u\kð”uDСü€Tav@öÅ ¡ X!w„ƒb…PP¬ ЉVň8«ƒbHøqJPŒˆóCP\ÈÑ{P\ˆ0zP\Æm:(¤×âÊÔÙZ”‡ý›z[îÞmNXN¬EXnfÇ–ÄÛåiü/,73ÑËâÝÀrÍËátŒ,'$,‡±%±"m#–C Q,³"sÐ,'ó,,‡HÛ™åqQ³"&j–õh» ³®…-šåp-œ&9ÌÄÚöÈ$Š£ÐHy 9 ±½×$`[ìÀ$‡HÛ€˜ä A“"mTLrˆ´ŒI‘6N&9D›3É)„H.@Q¢þÙöP"9É!’¢&9…É!ÒÖ…IN!DrˆÔ¤PHN!¹ÐBEr !’ õXMr i$§"9DlÒ$×&9…É!b’&9…É)„HN!’ùÏmïS™¿ ’ù3Ò3AîÉü‘Ì¿àÄ ™i˜Êü ÆCæ_Ð`†Ì¿´@NeþC³!ó/è+Cæ_ø¼@2ÿÜIÎCë«Ü&p›6Lã=°aïp›6ÂdÝå™·ºË3'uŸgÂé>Ÿ[6Ù}žÙ¥û|¢ ¾û<Ç®Ý発ϧ6uÊç#ÅYÝçc[JåóKwŸm)•ÏÓ¡’òyA2]ÒBtñùHÑ[÷yAÄç™1»Ï ">ÏÙ@÷ùØÌAù<íyÊçÔG—ÓÂãCÍДÃCÒ=ø{ËT”»3 ÞÞè]9;䣯3 ®èP­»º âêaôó0:¹_D2éNî‘ "yˆdÂNÞvò~pÈNÞ‰d ]4c$#ˆD2‚H$C¡Šd‘H†tr0™ú /þ»Éì„ñܲž}tƒAÿ &ÒÆ×-Æš1WÚÚmÆ2/²ÑXÓ\ŒŸ£™ãh4#¢­Æל_Ìc©@²Ùàs,~0Ÿr;ÞË©ÒŸÕÆã£E“QÆãaÖÚÙÇ;]µíxŸ‰Ùv¼ç'¶·ªm;ÞåFŸb;Þ¥Ùˆít„m¯mǃŌQ0¶¼¶GÃáÛ9L;ë\ßñÓæ Äo§0ð>R×¼Ÿ r ïCóȼßì(*Þ‡§ójâ}‹‡[íìƒxæ3PÐM¼ó`)'Þ·oÍóŠ÷ÉíP…h¦J²Fû€8Ñ> ³Ó> ©íÅLû€d®§Ñ>LùL#íß–6ÉFû¸òë[¼q:dÅúo³nÓ@¬_×1Åú€$j†œØºz¨œØú™b^vb0OCá9±E»´^9±õغUNl=ØŒ·Ý‰­ƒ5õ[ÛRVnlÜÚAû±Å\&j?¶Á¦(³ÛKµÛð^ù1XÀÜwöc‹ÙMÑ~lQ›¡2ÍmÕŠòcçÂNÚÙâ¡Yë39²E“oê9²Ñ¯#ÛˆJŒŽôläp…Ù&h3åÈ6áb{åÈ6u­ñØ#¶Q9²M)±ÔÙ¦<ó)õw°ØzÇ[Ü|ŸO`[Àû¾ZÑ äl\i¿€FÄÇê—+íß®”êXu 7»F¤J ÒK±"ÔKuD•"EH•D•"EH•¤—údÈ–zþZ•sxF 4ê¶À:þðÈXLù#J FiBO9Åg+òW’Y‘Z”g©õ‰Rë³hò,š<‹&Ϣɳhò,š<‹&Ϣɳhò,š<‹&Ϣɳhò,š<‹&ÃÀ³h²yMžE“gÑäY4yMþD³9(#@¯fŒ¼Ì&¢‘¤X_ñqszpö‰âÈã5¹±,°æÖ°àØ'¼¯ÿö‹oçßûÔø“ƒr3lúžž'0Á Žð è¾>\ö?‡Æ£Â°==¾é"ø!ÞóŒîz?,xüŒ\‡§È8ªËú>ã0o¯ß½¿8¾»ê-u‘áÓ[ñøò6A_ýù/ÓÉÙÅ<ô0R|zÈ;±µñßW§—ï.>œ¨60GøäªaÓ4ø„+NÒïoðI!|½²Û^žL_Þ¼¦êIC¦‚ài qOãí§?Üž0è; ±´sVÞ=°ò¯GÝ*Ø÷È%ª@ÐÇX•ƒ®ùXßl¬òH;` ~XòÉÏõ^Ô!Ÿpš7]‚x†NcXò‰Kq|ÉMeÓµ!Ÿm”hC(µ‹6ä3lI5 dmXg÷—y Oæ^Ô<ˆÌ NŸ~ri·TGúãn.§6¹½” ½”·P¿~¢OUfÑÝ«§<^‡ì1Jž¯£‡ÁðM&ü˜lÖÆòcbJ¸ñ11±y1YFôCl+¥ìSA‡v½T¸ŽKé‡ë¤”<\'¥ÔÃuË^¨RŸþps˜"¡Q>ñáº%SÀ²|P;+cc¤‹É}LKdùp6JNQ?~†½u…æïÈýñºï¶_›ÍŸ¯™¾GݧжêQÏÙý„ ÁòL7jd Ÿ@‘dì0¶lºIƀĦÅdì(Ù뒱þ«4cçñ,WIưÎL1ž£,R$c|SJY2$Œ’±Ã@·j,’šÎÁ’1 ¹i!,R”^Œ¶¾°^ IÃ<êÅi*3%ù€°løÏº`\&ô’` )],W$hÁ¸"9(ÁØUÂ+Á¸"Î+Á¸"Ñ+Á¸"Ù+Á¸"MÀ&Å_,´"A+Æ€š#=u'}·§îHê.ˆ¤î‚Ü“º "©;‰=u'MX¥î¤ «Ô4ឺ“$¬Rw’„UêN’°JÝ 'ü’ºwIxC‡J{ât _:¯qøÂœÝÃæì¾¯Iø"4ÖÝI«»;’ø;Óx÷w’…»¿±('YXù;E¨Ý߉{”¿“*¬üTaåï¤ +§€Yù;©Âìï|&Ôý½#ìï‡+'Xù{GÈ߉+•¿w„ý·³îï¤ w§ýMù{…•»7Q¸{{Ó„•³7MXùzËFØÕù/ñôFêÊÑ›¬üœqsÒ•› "nFƒƒûE¼¢qp¿ˆWDìíÞvðŽƒË¡Ÿ8xG$^!­·Ç+H¼"ˆÄ+¼ùõx¥#¯ˆ¼r˜¹?®õW ƒÅßn,þvË`ñWLƒµßn¬ývã ñ—Œƒ”ßn¤üŠqˆò+Ö!ʯ˜‡(¿b¢üŠyˆò+"Ê/‰¿b$"üŠ‘°ð+6"¯؈¿b#"ü²ˆî+6"*¯ØHGÈFDöÙWlDd_±‘}ÅF²ï*÷›ñZÅëMöí´Î²¯ÐºÈ¾Bë"û­wÕ—i½«¾Dë]õeZïª/ÓzW}‰Ö»èË´.¢/³z}™Õ»èˬÞE_fõ.úVVïŠ/³zW|™Õ»èˬ.ª/“zW}‰Ô»èˤÞE_öÝ.ú²ïvÑ—|·k¾ì»]óeßíš/ùn—|Ùw»ä˾Û5ßê¼]ðeïí‚/»o|Ù}»àËîÛ_vß.ø²ûvÁ—Ý· ¾ä¾]ïe÷íz/»o×{Ù»ÞËþÛõ^öß®÷’ÿv¹—ý·Ë½ì¿]î%ÿíj/ûoW{Ù»ÚËþÛÕ^ößÇ="·{â/'Ü¿Ì#rL#ý!³ÝôoWJu¤?ŠÆj*%H/ErjU†ÔUH§<úV)oPϾ¡ØPð·ÜìÖ×xŒK¤éÛHïOó-Þ‚÷R!©ÍõÇO¶<=¿9=½Ý\Ÿm¾„'×—x.oðPÒý5é{N í[Âû–Zñ”=aî1*‹i9÷þì-þHÔöOõ'5æâíûÛ;ž|·oÆÞ¼‘Vmû³þöôÊŒgiµ¾ [ÌäímŸþÛ7×?]MÔqÔêzG©"”ñGP¾> h‹×ßÝ®½†"èdxéûÛÇÛý§Ëë“W‡íÖ¯eÓtÝø`ßZ¼Å2gùa¤¨óñýù(š–Ù;·ÝÓ%Œ]³ÑS³èÓ‹þ:ð·”·—‘o§Ø!ZˆP I†Ýo´4{qåGþzð„ak‚endstream endobj 166 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1203 >> stream xœ…“mLSgÇï¥p÷ AÓHÕÜ;…¶lnË·™¹ÌM§Z‡0¦¸Íhµ ôÒ -Pîé-Ð÷ZÀb ”Ë4¾¤BÅÈ–¸ÍÄ,›3c¯²l~˜Û²=·¹|XÙLüèùö$'çùŸÿïH"3ƒ I2ûÍÒ7*ß)yáùÅÇ*µXšO)²@*i¦MÖºåwò?Y–Ì# Úuøˆ²FQKåijÄ[ÄvbQB¼Hì$²ÓÈLBGæ‘ÆŒ'3Æ$;27f&s® 3òBVo?Mâœ|MX+»K ¶‚ŽÙJõ_´yz‡œ‘KàBC­¡zýáÎým´R\Ÿµ‰b[AÅÀÇܦ¶‰cÝ0A§|×õÚYüÄg˜ xõ mâ8‘þ ¸Š=ÈÐf‰…¬.»ŸÉM•BBø9A S„ÌîµX"Ö~˰Šˆ§‚~ˆúµV#£€=fT@¹­¦¥…ê‡ß RáÜœX¸p« [Çq,ׯi¸6@MT+û°I8F \á»XU`sZ{ÁŽ‚j0h é¢ë_¯׈í¡ iÙ& Ê¢F+x¼‘'q&°õ¦`•lW¦g÷ò[Ä-âRq¥¸A$>ßóGoØBIæjøÜ9p#WËp‡¹L&zËËëAh¯jüÆç¹¾8ÓÇ˼Óý±èØÙø%Ð…¡†£EâKð6“+‰Õ¼0›À<©Æ9ø œ#Á÷Ó p¦!°i…”+1Œ×8½Ïí;x9¯©©= õ¨á´:6ÁÇ.'ö•ˆy*‘¬4ÐìSYÏ=²ájÛB~Ǿžvý»r³V·¯zÒòt®ñ€küh¤%t\Ysì`Õôñ“sa\œ =!×¥E?Òâð&^ÈãÉ0!f„,™Ý½`ý/ íí­9Ú¯$¾ö´øŠ([{»âÞØ¨+gZ·žÜ P•ƒ¼NÙÚlá€3tF>V£TU—~cüçÜOþ8H—♡f÷÷íëš¼6s¼Ìø\ÒŒiÜÓR~JÇ´€Çe3¤Pö‡ϧŠeG©B,§ãÄeí\ € ±Aès9ÎM‹E _wkÓëvÉCìˆû#Ç7ý)¶:ÏÎü:ò‹pX]v@\ÆV3†FshÑÞdÝÕ¿¦ðêðbpÕ] ï¦'žQê2@0ÜñÄïäe¼®£¹Ý±W+ijÞ§sS¿·òêåñhb¹0‰‹l˜^¹B›’à_d8;úýW0p¶¸2¾Žçy\ˆõ]ÌHÚ¦`>6O-^@_èáa6QPgí„[8Z°bêoÊw 6kŒµ¦FF_Ñc I\h0þ§'Ý߮NZSuB¥¤ì‰Eüàò|Ë8ϧÓÔ‹Vhá|ó…²WÊŠ©›Øg÷eä—©;ßÁæfíú•Ì¡º C% \ŒÿG‘³I\pK%J­’EÔƒÇÔÖÖ4œnŽNÆã´¨Y’ujÌÆÇ:ëqž±X™{ØÐë·¹À'Ÿ©//¬W7ë<à 9Àc§]‘‘ß®rô«75r=L.½$“­—fƒt H—‚t9Aü ! }³endstream endobj 167 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1659 >> stream xœµUmPTç¾×]öÞÁèä6¤MîµSœ8‘Xª©GIP4ÄX•¯• ¬R¾سË.»¬,,°»Àò¡Ä5] uÝ€21Œ1©c’25qJ­–L¬¶gÉË^¤¦m¦íLgÚ{fÞyœ{>žóœç¥)é"ЦiYtÜž5ëçoß’:[>»#Â$&u<ÃF.»»ôÊ’Ñ'¨ùù…EÅÊÒ´Ãñ™YÙ¹yõO%P‰Ô^*‰z“ÚJ½FÅPk¨íT,µƒŠ£vQKÅ ””ú9u“ަ§E.ª“üTò¡t³Ô†LÉöÉd·™Ž 6ì9³Sc:#`"s{ü£¯[cðDýŸ}ÃÉêöà:Ý3‰}“’`4áðÉÕ$4¡WG’'ɲ;«FúΗ¸Œ'É$•;òÞâ3…#ÚqðÁ;Æ žçà™¿÷í®¬þƒ ¹pX÷FÁüC©eÀ†ãƒ…Þîú‘¹*Á°Šûòì­O,½Öƒ²VQÔQÝÚì¶ôä8³7Ù’U-è‘–ö_v|Nì¡üгÐEt%ŒáHÔŽà†ºû4V–àåàË\»ÞP§ÑëË+y­¦¦Z«ÉJ6–Hä»w¯¹_ÒW'|PáÖ¸TöJ·2Ù´¢½Qër¯L«xm ÔÀªõúR¬`T}£Ù`°šùƦ֮F›³à”bØ»÷~í/è©hòú³,iÖÄæ×Zà}ÖÓ2vïAcdŽ‘7Ô›õ À6AC›XßeÞƒôWäÛ%¸*¸’Ãå²ãT2ÝŠ¬5?ѱÇK†˜2 Rd'†.]ç/ª˜˜‚CiGåÎßó"EÄŸþEðÝàfî<;˜õÉ[·l¬ýåo0äñyà¼Ð9KØ©ž|{E·âÜ„ÁkVkX-ÃPkˆ‡‰¯ið&|6Jí þÀCãø%Ip g8ç„רj`=L©^4(ƒT8f!W0ýº6B­®FWû"éŽxGu­LO{†ÀÁ{˜b]‰ (^øc @çz=Џ"Vâ;õv0BÃ#ß"Ñ·” % ¾>8¡=q—¹SEƒÖ&£¹õO8ñg2f.7é,ð´Lvvž½<îp^›rÐÞ÷1=ðÚ9læà œJ;óÖ`ª-ØM{âbß:©k´wZ{»ËNÓÔëõZÁõÁ{í§€=?–²^Haâu¯ªò^ÏRí‡ ö•[ÊÀ˜¿ÿ¢›7¦ôÊ}Àº-S¸j³«@]‘||R·..%qÿáás'íKühϘiÀÈ.ŒéÇ̦'Ñá—àÈìß'UÁhÌé“/ûüÊ—HyêNÔW7}W,fa+ƒ;à7LÒܯ8ÈS—fçe×—{ô¹VLÀ7‘möœVdv öЂJLø‚º•­øêÃ%®Õc)Vr&“ˆ²½¿÷wDöÃõ?"KÈ÷fV}Rß×.KèjõºJ ¯Ü–˜½OljW/×ð.khå,¸â³/\…s; DʆϲàÁQ^Ù1‰—?•àÏð:‡ëdÈýá‹™™¨iò”@&²N@²0÷6“\1â®öÐ/Zúv5¦JÜUvqØÇ Í^þžaxˆ—R¶“ðy)"©mxÈw« ó/ÓNoS'˜õJP‚Û¹ŽòÁc^`§®^þÜ£öæõ ½'ÏÚ:Á`Öjô58ÎV4ÕØ[­6{G¹3GžU¦Èçóz2m9"¶ÅmØ3˜i«ò² êAaË*ÙW‘.‡ýlôLÊpÑ]ÿ'ø Y ¯§ƒ¡žÏ5—ôÂ)hw‡›½]έ¤œNñ˜žB•–ŠÇZÁCþÂEÆÆúÛúÜ¡»Í&‚ÆÞ@¬NŒIŠ©ú<¾+ìå±G*y=¢Œ„~«ssÿKeG£˜> stream xœÍ\Yo$·~ü#›‡íqv:¼ ~q‚$ŽeøÁòƒV£ žC–´ÞÕ¿OÉî.²Ù3#i6 Ø­v±X¬ã«bÑ¿ÎXËg ÿIÿ½XŸ°Ùõɯ'<¼¥ÿ\¬g_Ÿžüé?\θm×jvzu?á3§[&=ŸYé[«äìt}òScæ Î…n5oþ9_°V{ï¬k¶ø¬àÙûæ‘<_â³ð^Èæa¾V·Ö›lôfþóéߟ±Ày+2rº„I¯ÉL+|6Œ o›5y¿!ï/ÉûÇá}œ(_¬öð£ï&:ÇÁž1-l³YÖ8“¶•Λ³æ‡‰÷·ô†÷µUq&a²ã2rÃAö’ƒð¹n–ɘQ‰z¨[ .;ê|;âµHˆ–+1[HÝ'\œå4ì5C›P\¬dÈ”h®ÈoÛÄ»4gåñ_Û¹0­ôB7ñwî=g×ÏQ€%-™ƒõÛæ"'&,PÓ²YfsêæŽÐ’cÒ™(][ #"M÷= ØD Þ©¤½q¢Oä;:|tSòx[D¿ì•h w¾õ‚G »á¤eg§ÿ8iV·ïïÏïŸÎšëÕzsù›öö¤_ýýnµ}\oÃï§_þ„¬i ó4^à³ —ÍúüñþöÓYs¿ÙÞ¯ÏÎXúÍëæËî ïÏæï†_`Xöª× ¿? Ÿl¾JÄàOØê;ø3Ädæ©Î̧ŸÞñŸÃO͇ðVŒßÊa&Âç° dI˜@˜rõ4<./ï.7ˇáÅv³zVµÝtŒ)ÂXXË9„Æô›Kìu+[oÉOtmi»šOàœož€Iü÷O‡ÝÃM»¿|8C:aëJ–ªµLrŒÓ}3w´7« Å`Â+0Éäí“FÞήâ˜Á]JÍ\ç.?¾!Ï·Ä.&Æ|Ežù0¾ê¤M ÊÓM:¶âšlrÌiQ¿‹cÒ´v¦h­öÇôËDÁŒËIÓˆMErEâ½™ ½ìxœã£à–ç®þzTvƧ€CÅå‡9% %?Ià/p8"áÑ Þë„Àë†nîfæ6ã„Ò¢\mÊéWHí×gø© ")­âBÐø'Ä_±^­WŠ(rÖŒ„Z¨ N;ûÚó·å ø†  h¶>Q€Î½öoV'ßO꘯©hY$0¨Ø‹X} #°¬ºWˆ¼ªUÊð(›\¸{+Á/¢}¦Ó’,½È #¹éC™bÂŽ×OI\‹žÂÖSÙ!ìÁ{l½?àt‘“9Df)y ¨Ô(‚ÿ¢@µg¡€3 ¢®êB§¥Ðe!Ñ`ÉÅÉ~A!Tó\ejÕTÀ²v¤d½¿PÕ²A‚–i~e˜§ô¥¿‡qމάvx$‚¥{êÇCOZj_;`ø>šý««NiæUéð:I«ÚSXRàž©åÄÔ]Óè ™éCn)emEè]µR{°ë+U/ðcÉG£ª-5¶òè"žÄpènúãÝܹc¹DäÈ91ñDžïˆ« ŒNáûû‰ñ%ÍJ°!ß>LhOÏê\ÑX4¶å íÕ“”d*+ -[/ÛÍPaºG~™Cê€;@‚ÖÄ^0¼Pýz<Ä ø8IÓÊ‘KïÃÉï_Ê7%‹"È îš©§ÊCû .ÁÁç)Ù ¹.~ë"B?ïµ±EA… õØ?rblHšöµWè2³.724Ó¼¹<ÃâGŠ’,¾­+M#öY¹¨f\aåeÌIСê]yT^Lõ€<0ƒ×Ù9÷·0r™Í¸BOåi|Md0.xÈ?ÅäQçðâCG[MæˆaúxR·iK'B-0ÿ<¸XÌ ™öTŽUœè÷¶2Ê·6±jÛ‘ªõÏØŒŸéß `/0A>iY_{Ï `QÖ]ÏVŸ‘R)~1àát’RtoõE¯¨óû‘rè/-«Î´ÆFQ3=6 ð¦¶Í¸ 6W†ƒJÃd Œ+;nÁ/ñÃüR2©ƒýRR„v÷Fi@TܸZ€L]hÜé1¤¾‚èTi9åä ’¨²îrõ"Ù ƒ$'{‚¡iÛ…Ööرœë¥š)æB09f#¤OálNº¬ˆg•ãpP©R•QúÔûûã ýIQ–6öÇO㉠ÍÁºX ãµô±ÈŽVLRà‹³Súésì`yyÂ'ÃQ˜ô°T¼Ä¤g Tƒm­è ”"aZ’ †¸Î5b„Áâm)w7»þºr]b‡Ð/*.-;ª~tldÇ»cÇæì¡¥ù¥]FJC’jä <9¨œÆÖ"ÐÏV«þÍó[‹À4\$Ð c>{k‘‚,Ûºþô„ð†È–ÓPB Å5nætXªÊ½ÕC6qÀQMU A‰4Ý;>6d‹1 K`FŒ"dX¢8™Þ!ÒÆÒØn‡3DL… òc­ìÇjqØGzX;'Ÿve«„4þ0…w9ÚT'ú {ÍãxÉé™ÔJbGË9¶a™þͳ-ǪH”_àh/ïs\ö¾oÙKsÊwM¥Ÿažæ.  ˆOBˆMF[¢™a£Þ›H€ßF@5еñÞF¥³`O»!D'Ô3l©êÖE+µuc¿^)§~AÖD½Bwûc!‹âéB8ÇFPŠ4˜À5ì$ãÅÅgt<ÔךÙ~qoí%9Ò ‡±T5¶±ô'µ*ÝÞ‚D_1¯óÓïpìÀås·¢­^TûO‡5pÕþLÇï<œxü.Bíoßñ{žÈP—5}Lñ8Ã$^?'ÞŒô©RÙæ ¯êÓnF©82ú¼)éìÚX£U³‰î•¤—ë(T£u¾k¿Äz°ƒ"êQ G,‡ÂæF‡ò´ì1uˆXÆ>LÓ]Q#œºdzo«Y÷¬ÛjX¶Ö3+Æ·ÖÊZwp\]ÛM¼šôo2ÓŠ8÷°ÊѱS=‘UŒ£™ËΡ xße@$¥=/zãjwoè2ÍÂõÞ=ºû[ez£†@Û¸ö” »®ÄצNĬEKo Ü°!*;S¡îÇ`›ƒËŒÒZEZxá®Þu1øØí›Ð!8úx— µ#îî!T¼ê.A%>c¿ŽXÖõ\öÕ‹ÉGæo”ÀÊ™/ÊCÉÞì wÕR ø,ækîÿó^ ôFåjgA,ú¤ôG¦Œm¹Ð]S K'ïM*áBRqÅehè¦ tv£W…P¶^ ÛD½K¸¹‡ý–jõ¦â„tPÏ5Pð•®;¸ŽöQ›2ߎùÀÊX¥1Ýoð¦T㊑ŒÎ®“CÕ*ã ‡¨H§û1Σ°\óÔ ×5G ¸7À0Q <¡~µ*‰^ã÷vt­"Äm-ð¾ôm_† wznâ'˜3OmeHécSJÌEÂÿ‚ <¥MwA)ƒ©P[ª)³ &b†^ÆtÕþU7x¼0gМbeúí äû¸òë •‚É]]¶tüÕn€ Œ?º Ò³²œ·«Â1¦Õä€ê5ñÖ%Ë:ôÛI‹G}šr[j iö{›üy((x5:»HÃî’—GgÍ¥§Îz*Ë+€cG©GX ²xwN¼ š2›/,Ô¾;ù/q=Jendstream endobj 169 0 obj << /Filter /FlateDecode /Length 73391 >> stream xœÌ½_³%Ç•Ý÷ÞÖ‡¸1~pÃAçÿ?¶ù qH +[DÄ< ç¡Én€nNŠzðgw®µöÎ[U÷œFƒ… îùuísªVeîÜ™¹3óŸžÂ->üÏþûûï_…§¯_ýÓ«Húdÿùý÷OûÕ«ÿå?Åüû-ÅZž¾úÃ+™Ä§Qo!ÏøÔó¼õ’Ÿ¾úþÕ?¼î_|cª·_ÿÇ/¾ ·:çèãõü]Ößs¾þñð÷;üæLùõ_|™{½õÙNW¿ÿâ¿ú÷ëæéb¼¥‚ùêíúѯ¿ô;üÝBL³¿þþ™ëKÎ’óz€ä_ò½ýhœøý×ßi¾~Ë;Ì!´2^÷|Éøs¬Ÿ©Í¾:>­›šµ&|õ—±”[êùéË\om¤¡ßø¿ø¸w‡/‹zRÞa•.#„ëëø»ÏYf‘Fqýji<ÁëŸ`ÿÃá ßþÆuc®OC_k_õ l×miŸï|ô[lsº*”œ!¦Ç·¿ýÆs³Çþ›¯^ý߯òmާ?­Rõï^Ź^k­O=”tkOß¿Jë§o¥9øîÕo–¼Ó­yÁ[öëíÓþšÊÝׇ{ûÝáïïÏ÷v}O)ßb,ßö Âßëͬ²´ áÒí÷‡<¾«o~8üô{¼«øú·¯\û^ïr]|úºÏyGíVÆŒŸõŽìﯚÔ9r)ÇkîéSâ­öxü¥øúÍÁü÷_¤¶ Wè¯ÿ˵ÜâÈCÿn?u|-VŽGýõo¿ÐÃxÒüxÇuEŸC?û\_Žd¢ýøÅúêUÍ{ƒÄö¾¾>Û¹4­BØZ=ù¿°Õ³™³ÕʇIýÖbî¯ßÞiI1ëaŽ•÷¶¾ÿËÖ7¶ôôeÌ·º\¾÷ß~»ȼ«ÿ 7ñ\dX U™>~³Ç{,®§JË£·¥]—°†Õ;µü“Æý¯ÎË/Žzþê£ßè5¯bUBê¯ÿtv~e¹Ó8멌½.Ëߌ“ ü¯mÞœ_hÜ%jWÆ£å¯Ö¶´þ%½,¿vÉû¦eò̓²z¼þ­ßûÔ“æÛ¾8…’Ûòõ®¯€,)–‡u‰ObIKÓcSèþù·¯ß½ùøã7¿ýb‡šä'ß¾ùñÍo_øoÞ¿‹øòºz+<ý?ÚŸëN¾~÷£_¿ŠÐ7ïž?ÐÌm¿‹µÛÿðê«ÿùÖen’_ÿï_>ÿ­_ý‡Þ|ÿÇïÞݾ}ÿão_¿ÿõûþô|C¿ýâWÿè?PŽ7õñÍû·¾¾ßeu¸¯oß}|¾¯?|øxx€o¾}ûÃÇ7¿ÿñÛê­w&¼n÷ëß}ûþÃÛçß:ÞóúÇß¾þ»üÿÜ~uÖð×þÛ&åõÛoøñ×óõ›Ÿ~øáÛ7ïÿÆÿµøýïì·ooßýñÇo~~Å›¹Â¼D*?|óñÛ÷ÿåÍ×ï~½îäðç§øõmüÊw¼þý?ßþðá»·?ü:†_= ôþöãÇwï~øõê|…õ¢éo÷oJüäë?~÷a]øÃo]†uíWÿù¥óŠ·Õ ›.ÙWW_„ÚVçòAíõ?Ã-­?î4íOûTßî¾ù¯«wiíöÛ»ñë/¼Ä´7GûÛ^;{uÐ#\â¢íÊÞêéÒÜõGëßЧüýc‡rîšþŒÛ]®4u×Ëý}x|GñÚb Gi«<º—GúÑ}ù£Dm«hÍ9Õ |/‡Ùt‡ö»ç;×m¹çõU¿èÿÙÍÕ¨~B÷ó¿¿âºµáˆÿ`–áÓN]Š=ß—+(¥ö»m÷ó„Úö3!¹ vwlmÖò&öp±QcÃ[ᔯ Ãr„òâQÑX^õÑ˾V š&ü‚T¼UÜqY1ïÃøÿQGÿZªøëy¬PýùY½¾Û>Þô£AƒŸ1Óz‹§{ydÿè/ן{îÞá\×ú)¿˜j¦Šw_ÿ­.)áì@^ôPÿE(Î÷—ƲƒDÿ|¯Háß@^„º+À—ø{=PšÓË6Ÿ÷+Ù5!ÕŽâ¯Cø=¸ £ÈÏÝÆ£¬ªøN>Üz€q,aß_]õ{\Eïr¼çÕè¥6ØWz¼~õ“ÇR{)]¸ïqùîö8¿tŒ)¯¿[O¿`xEêè¹Îçcx®ÛŸZ©é8Æûóc@ëç Ì—ïy\ŠË©züûoŸ …gË·³9ÎÕ÷âmÜ/àëí xž‘ÑÄîÍõÜõãQƒtl¤ƒ¿ògQÕÅåNësÑyÙa6ckŠK? ÚxYšãn»€œC{¤s¨À›X¡m‹ã~µD˜OTP+©¨ ÑLý÷_Œ´þÐ ¾áNwÖÚ—ci?33í³\8+óbœ½¨’Új\ªžïÏÆ³ŸSwî šáw[øtXn·ö¢€á¨Ì£©‡n®çª>´u§ä[t“ÿú»×|²†|½ÂLÏCsö$ýåØÂw»é¼Ì¯°¼ä’>9Á7ÚvžÛåO„ZRǪ¢·’{=ÉÙÑopø#¶Óçóü#‰ŒùËöp.î»«å‹øòØ“<ü]wëË8ðhó¢÷h=Ñû I´}æQ¶cÙùA7‘.ÑÝ¥HÃÏ¢b?ª/Ü2*F‚¿æ­7’íQ£ô¨l«Ú‹¢w‰´MáÅ×ÿ«†\æjƒêž.ºßÊÞñ¬/z‹ÛÕÿ­é§RÅo¿ø¶,£ïa”ãË=GsoæNŽ€õßü\?¬/Á~ãS*Ñ;Bã2ùüA½¼öûýÆÆ(â½ \²*Û/èeÇ"1µ€Bô¯}Ä7Iœ7_ìáŸÈ eµPµõ|žXzîú}~Ô¢ŽèxQ±øÌŸžÊ÷Ÿ»Œ,†ßè϶e/:ï-ʉ§YÙ£¹÷–±åÍÞï©ãa€ú‹ËJâè±»qü®7œ1XoE-8‚§tghŒ77~nã4R`ó {IquÛZÙÓLï·}ì ýx}œcÏÈ:¨ïÎ/÷“³òýËãIùG“/z£Ÿ3p€Š3_Ê‹bp-ÍÔ°ÞÃÉ+ýÕ›áßâ,j{hÎ?úhQ~9ZÄ·_ŒY8ú F‹èÿöýßq»fråc]~¶\¼ãÃñµÏÊð =Å?>{§˜úpïÔë'Ó~¦‚³×‡DŸ×_†w*êû;sc—¾¾x\^ã‹ì‘så@bX¾›Jô¢<·õç¹Ùgr¿2+Ù_˜ÁÑã-§zš(¾¸ºS+`~þwI ¸ͯßCÿõnåÁ«?;Zvq Ã¿7ê¡ñ.|—´¥ß\ƒOäB½Œ ôåmRJ™Pb>•Øn½j"»œ_í_˜“RCZU7Ÿ¾ù8m‰PÃawâÛxKTþNDuõ®F‰¾¹º…Ÿì]³RVíîphÆäóÃ쟻àÇ÷nÕwø¦ùk?èv0™ o´Bý0æÃRwg¼„æýóÛã÷öü’"rDu„‚±±G¿Šfj•\Ì—þŸw¾ÉÃK ’’ÿb™ê'ÌÛs·ø—äG³RmœÈ}Ñqo|žR?¹Ýºüt?wTîxÝã{þ•»ÞõŸñ=¿WéBÏúô»ÇïÑ?{왿ÌùÀמDZê Áïáñ\TWèñ××E2ë§Vq9&«|»_Êwú¹À)¡ãoâg“_MLW ü`è^C»î«>G¡Ñ+žúå¯üNÃüÉW®ßº÷Ê‘XŸC†?íôÒk×/}ž‡uÿÈN.£G£-GIÿÕµu«W…ïLè…>õ¶[x4ýíÕ«?÷P®üJüÔ ãaؘ¥#þ‚(ìËÔ0¾Õ/µèE´d5êgrÀ⸕Z÷ Úi«Î¿Ä|bž–÷÷Ï!ÔsrWŠóEï| ê¬óÎü1¡ó˜Iwëã4Þº©:çý6”ëÊ/ò ŸL"»;ÒO^ðr9MÜñÇžqgy1¨øéÀÞøñ~º¶#?ê0ÖýÙmÌ'š9܆>g ûÎî[‰wŠ^ê¹ ÿŸu¬)ú¹Àz‚žò½À½<Ü»Zo¹¥yÏÿùð÷£IÑc†éß|†H?\¿ÓôAÛzºþÝýߺßþrt#~bäo#Ý%-]Gü¬±‘ãLÏ}ñðTÁÚˆ=ê(£ú Qž#ìÂשuoßÓèìÜ %GcŽÂ_¥r b“Æûÿk¸ðh éâEq)ÜÉò:í§?ψ‰å—J‡ZþpØ|;ÝQoç@ÿ sÌgª?·¦²ºaõÏö?•Ü®"ùÀõ³Ë㊜‡ûßm`–›Ýg¸´ó_–o5¶É¡§SQŒÊÎÔH€]í\qÄ9»æØ6?šêBÃØÑŃôäË„c²5/Ú¤çÙ±Ô2ן+±øªt‰"-'ÐEã‚~isµ÷ë󭳂.¨OE.ßz™_ût°–Š–dþÿzÀ Ïòž<ˆÉø"Oê8vÄÀû¿þñ´­¯¨âõç羥ǯç=—[[n4µÕЕñ/¹|ñY]_yúj³… ù?‘Èíú½5Êfê?µFùNqD_ýv|F|éÍ=ð‚§îÍ14QÁ>|yø;þþÕ•Û©|\E&‡Ž#ŽkZWÔÿ÷÷&hUDïôÆsÅÿDmïˇõ¿ÚKÖPÆ*8(?«Þ÷å%kÀ>*u“_ì%×Üj¸”ö¿ÐK>pGÏ é/|ÒϤ4ÚtÕ`›ÎB©Sùår¸SÒŒ;áÍÎ¥º?áó©I’Õé¯uØZ}šÞ{4Êó¯U÷XÑ}ÌœâŸ^Š)ÕÕÚ%lm0Ÿ*ôuëcì’òñÝÓß?½µôˆ5õ§?­ÿï×ÿÿ³öV‰Øå%r;…Ðꦹ"Ñ7AyzyÕ&u½Õ—ãUe9±VW99^…Uýa¯rr¸jµª+®.Çûrr¼*gìp¼ÊÉñªÕßl7 »ÊÉñªËs”8\õ)ŸçÓŠÎjîçõóø¥ôT›ž²v…åfBGüúº†õ!bèj5ƒ1àÓÄ‘¾>U}‚³*¯S8}ªÏWÆ×XáúÅa€´Êu|êëÚ>*ß–HZ?pó÷ðòª0–'蛯Z1Þ*Ãíp•“ÓUï—w:\eätU]ž&åãUFNW–x¼ÊÈñ*¢ç«ŽÏøYo oéËȋꭕôÔ±÷Ь»Ù_ÁPÐÛYoj`†¯¯wc¯º™Ä9­–êóßùÎ;9–®Ýæc=s’RZ‘aZd?å r¬æàÖ÷⯔$_ÇvúW|÷ê›Wð¿¼$¯§­a}Éòì¡Ù¶Iÿñ§ï÷îãÓ‡?<}õn Á]óÉ·²3¯zÔóú™~‹›H¼þÍ?ýôæã»·OÿæãÇŸþÇ~ÀªkŠ…º>he®ød•6¯úôØ«­«òòlë󳚟ªõ=±™·Z¿<åŠòW§z5“Åíùãò|5«3vKíêºCË·¼š~}®«Q\ ®:á`9«TÑ+."ÈÃ]duY²}Igƒ_±`×Á $R-ˆREÆúÁT1<Ò ØDûŠ‰È ­†=¼*D£Ë åédý[*µ£‘¬FVeõ˪”ÆÂ%ù"«9+ˆjWS“œ@ã¼Þ¹VÚ”WTôŒË|=mÂÂt»ßEPuóê° »Õ˜ÁŠÛý8Þy=̰\NVëÇSv‚pÖ} 4¥±î¸:äiÕÑ¢—°ІVsîǤËZ7UÐÄi0Z./èšÕÌ,É9 Ü@òÕQ_5âb¨Ž–rØ5i}D¤í#´õÊÓj¸E2%—ÃqB7—Ù–“ÜgŠ}NN 9¶j‰öÍ•šGÜŒ]Ó¨ùê“áûŒ@óÕ—Â+$éÔ< ß$9YÕvKÑ ò¸`µî°e'V¸C»fRô°„›LXA.Y­~Ð}õäV#(!ú `æ¾$BôÕ \×èW+¹<Áİé`Àw¬§Z…5èq0ÔºM D9Ðö;¢Ç‰j: Ø% ߶Ȫ$› \³¿Í‚lœEV+â·Ûñ×zÿëZkÇ0ò¢ò¹œâÃ1²¿Þ‚œ×'débߊùåEÚ®c+Ï@Ö«“ÀC…‹Ôâ'LÖ˜Å*jlS'|I¦ÞcB+öXå £UѬÖ½GÄ,®è=V@+–®{„Õ(,ÝgwçµÂ¨Ý—{-F:‹b_OÜ6! T»¯šbg¨ÝÛðú·j+.AŸg8€Ø¿¨»_îj÷¥¨ýöÒ j÷Ulê& VØL Q잃˜EÖv¬mÔOã7±ärÕ!;ܲHÝBAïüÕ·zãæ‘Øz°:Üm/v‚–Q[# 'л-±†‘ŽŸˆhu¬|£Ž´®ñ‰‚·Ö· “‚·Æêd`)eÕ 0ªÉ ó"׬dîbU1\²ê— B «H ɰn‚·¼+Û ¥ð@Ëš#Xz·UÆìö{¡à -Ò&x¤¸ý)!…v:à-4µ}½v€ìŽ ³~ÇjÚ®P»Î]ì  ‚Ñ¥vNLVcáÏ8©6Zã®›+¨©ëçÍÕad±€¬'Ô Xî40¢íWŒo*F‚‹[$ ’1¹+^‰î ùí.¹ëò!V)Öm¢¶!°0Pа­¾ wEšªýÛÌE’Õ`ÌٯϜˆèT»è˜[dâ‡ÒóÍ ¨]ãô*;¦ÔÆb†ì„‚csDXës˜~¶o„ ^¢nnFɽš-+ ð”ë‘Êd±&a݈e¬Ÿ~^$Y^ŸÇty×µ¼ 5#;é¼&»š+fXOõÅö¦˜0ê;ªZ~¼À¨ï˜d9:ÜjËtÁ˪¸æ½×¯×¾Hñ¢Š-ßve[M/ËËY³€`Á™Q½ŒN @1eòr$FÑž rA 1£É‹:Î 9Bº`F™’Ôâéd´ý-EŠç¼¿¦JñlÍ@ƒiXç*!³ÉOî{óê dü†JŽx6‰ Ig`×LJ“½8€F£àO°þBƒ^Ö¿Ø ãßšUldãSòõl-9¡äK"Qyý$Þ.a'Hžç~ÊE yžÍ}€¢RϽø· × Ä#1 -Èëi¡8wwµ»S«™G·’‚o”`¼Hö·H§QÚ¿žÉ·`Šç>4vózP©Eé¼&{!Dìÿ¤š\L#Vðf`¶»+! óÅë£äæLºHCÓNgNièßaF]‚c"t8¡à!îg(åtíÍ®™TmÆÜDcfÍâH”ÇôĶÈ^ÓFÙ«çj 8ç““ÁŸ ûk%O´%É”-yÞ„À›;T—H#v@:¯)û‹áÞœ˜ZU­&c»›FÉÙãûôvkÅÿ!Ú4“AÉÔ '4ªHÂde/œ•ÝlF¡æF[äpJúd²Ó*xy…kÁ7/GeþC½qFÚÃ%oØKS$3ˆB?ŠJ¾Zù&eÔÞ«· §ZWSrü@sRiñ}$Mš·íùI° ÔͪSóÚýEáNIš7mHs¼ ÉOö·ô®Ù]äàåÉ€U®r|b׳; Ü«ÌZ½†ðOì䚃ïYj—¡^(@¥ÇÆhS(6*YqBµ´Ø×T©½ênß„j£~ 4‰]²¿"Em!°ÒлÄ.»4¬Fb—àu©‰§{¯UL¬0Êá€b/ïhϽZSŠ›×õÁ-°}hm}dsŽqó #IðåÜ5ö‚gDX®·„*•Ḑ(VåH“Õ“Q¨8"û¥Šb£¬ì„’ÉÛ×4P*ÛŸ)8²ºìö9¨Å7 F—àø³ŸR<íB„aš&b/=+Z%wy3Hq $N'­‰(<æþ°Bh û¨)"' Ž0q8™´ñ¶î‘6;ŠAÖD¬¤¡ðÄ1X=6œ,mv9Ã8"m²7x“ÍÂ";òYÞ›’s»3'”A§„X#$G×Ç?wجfÇZ!Œz5 -Ýâ;Ä¡T|õ>@¨xð‚WB”∾’UÂPïà}\ìO½ƒ1€PpôŠš˜ÌOPðà1kY¿@Ń—NDÛT<kt@àˆ":,ÀEŠUßS ac· ‚ ªÞ½‚pÊ¡‰˜€8$ ûÛ„£Q³ŒÂLZ‘`×t©¾GWA¨z÷`XÊÞ³uÇ ³îDì}ji‘d±[Á€!­’¤æ˜"4¥9ÛM¡MsîŠh„š·a]vÃiÕ½¾®v…šcÌ/9i´jÖHqƒZ5ÿHÅ[µÞ.úû”qËpBÉ[¹Ù½tÆS±y³¬V‘’·lN„’·dÍ7FxIÜ77¥8¦JàÍ;_ õ°ú`Q)Q‚c7[}MI|FvÃ%Ió:ì†1sE#Ÿvé4j.çŠ*(9V='”|ùb @<Ä¿öãM’×âþ¦4I^½«‡ìCJ^}F„ª×ä78ÅF ßG'³Šh¤»`øšF»ºÔ ÕË´5ª^†ß` ¬@ìÑ+ ÕnQpMÄ Á"ƒVÞ»,ëq¨{ñþ‡ šˆyô«ñ¶Ðw’„.‰˜ðµJø=i‰±- _Š…Ã “VÙ†ˆ0Yh•¬×‡12 _Ò~Ò!áKÚO:%<6x)N(| þ\{%±Æ ÅVyZÈPZ”òy¸/Ø]1OÚ8-°ˆwâ êÂQ(Båsó§hjPAÌ›µ"å³wý :´ªÞº¯Úø[ź uŠØÛi]Ê粟«Kùì#÷¥1n"±·ƒÍciå“Aey *EЭ=Eô9´$bNF£à$¢ô(áÓô¨`yL ¿HN(|þr–Ÿ¥ð•( ²†“fFJô*Ý‘Vœ ²\'/ÒðNHìÉ{“îÉGJïÒÓ`C²#®N(»i…>-ŠChȪˆ 1‚ž”m°„š§ìïwDiŽxÙƒ{¦E(:"h»&Kô­w"Ñ­¯VF‘æhä°µ_Àjbƒ!¢9 –‡t%Ô<ú\tÁa_SÄ( PÒªïçÒ±ywBÍÍØSqŠŽD£CŸ´ªeÍ Ñ£Ã&Àƒ±g]1Ÿ‚ìOZù¼uÞW,+¶+´JÞÚ¬øº/bïoéŽc#UºÇà¡Ë!beá(¬Vxª!)*æ~Š.åѰoRoqBåƒIdU ‹È¡ðØÄ„?^WÜM჻ =ˆìš¨V?T«Xœ{©"):¡ð˜°k²„_D¯ „¯ÿ6»¦HxGULZ%7«¡Jøà#" Œ´B´À³CÞo¸ãë"“¼ªªŽqzÎ,…§…Í $ÚýNЦçÔȽN´ú zãˆfŠ“N«nÍZìÁ“¤âdÐʇg0'V’ˆ\HEF2­|TûžÊfD—³m´*þÎ#'ILžÈò@’̪Sõ0³lƒÌ)’í×'t.2ìšIáAÊtÒh­y¬)˜òQ¡>À¨Š]jŠ&¼bVQÂ/˜"‚ÕðAÚš²„Ó]Xa&R7˜˜C’P÷á£M˜Ò¤îp[všÔ×ÖÔ!"ÙS—ìÃ@(û¨ÖeÀì)eu?ç`›bÅë´*VÏAæQ4Qsì£XǶjê|÷_ ”}d«úœË¥•û/ê>|ô«f¾Z=yV“ŠôS'“Ý“ij®&{t½ÐoàO×+7“=X# "݃…°˜~¦î}z-Éé')öÍCºwwƒHô£ð}xÁÈjVAÔX×ÂHcK± î½Û 5fé{÷áÛÊ}†A¶«DBHQð^K–î½¹‚…®$šU‘î½zEÂT|Ñ‹(U²÷â~±Ð÷’¤ì„º÷ìõë–¦ˆùNåaXµÁ *­¶7-CºcÖ‚s9$±;‘îÑÂ犯!b~¦FÓ=¸<˜c®"jü— ݃‹®¬Út1ªšUk[j–ðÍG{êê:Pø6,讫£€‰œœPøæÞU™+$Vžj“ðÍ3êê:d³² X‡”LjztBå[³ÈI–T#ûÑ •o> ‚´ *ß¶nœÿ_¤Xת¶(å›$PùVl°¶¢‹Ì;ÌÎWt¢ˆ)¶þ¢ò-YÁ4’!b%J¿JbŠ5æ™’XkՔ߾º5S>ZG+RÞsY˜ÃB«p³Ÿ&|ð"Ö˜iº¢­­mJ÷:½„õ Ýë´u¯Ûc˜„Vò¬@¨{õAÞÚ“t¯¶„ºïœÕÚ³t¯Ý[2Œâ˜•µÙ½(}gŠ!Ÿ‡º×íâ¡îÕ3IëªöÔ½ú¼Ȉ"¦Wïjû«Ï”ƒP÷êyU¾‹ÄÊ\ŸÒ½é¡îu;ýÁn*‰m ï#ÑuDS>Y  2“ˆÕÒÁ”S £Ô‘MyŸ‘òÑÖ´VŸ(aŠÔ±27ª)¿½þ¨R¾xÂnå¹³"Öà.åËô­5­†+6˜rJb…n )_Üë)áKß‚YÛZ|´¼òÀPæUrF5þ'BáKõ"Æ£)D¬™œÊ91Á¦rNAL°™t•íö§ÒNALÂÆQxLIG'u¦µì·”w bNAä1 §òNA¬Nk\‹g˜Ô9LøÝ4ÌiÂGë΃´"¢6°!¢"jA†YIÕ¢)¬¿2»H5«dÊÅÈÒ£ðyšÌ-Xãš½õh¡Hø<-ÞéfÍJÙ§H=nà …Ïž(ŠA Ÿ}¸´­…GT’0ìÊ>ŸÐ‚RPCnV A(|nÖenê‘”âdš•FÛêCPøì³Hb¤ð¹ºÌQ9¨ ê§µÕcˆf¢‚bî±EE“$lý³OT´¨TS0VÓ=[Ai\Ëã­ Ò.¥»çÇ7íjJ¢Ö¤E%¡bP‹N¦­JvƒC­öÖ«­¬5ìÁÊ)’@%»çYƒt3R´Û0Ϋä' ”=M/§)IödS)muí®°\Þ„ª'Ï|jHb"jq@ºu‘¶JÕSwIS•ìÉ3,[bfMÀR)‘Øò˜Æ8ôvˆ˜¢Iɨ!ù(4UOÕ5NJF º #T}¯ÇhK&ªžŠEsȽ¥ê©Ø0NÓ[[Äg5Ûz³ vS¶ÎeOÞÞ4t håí ˆdO^õWa,]ξJ0‰©¬rObFÍdO6IB½$çn²G—]µ™ÄdÏC²{£…¼dÉîÓ° ’=(9¯Ñ!ñ³‚jdë ”IТ”TsE)©!z“ÕäU^Ž‹RRAZvBÑãðr\Ššýèãñ =v/Çè>Dsj™i6 ÚвRAò4n{ bŠ¥¥Œ¦Ù£æ‘9#lö£M·¢´Tó·eJõè“Ç­2-5DoÕš‚â ·bq•+ÓRCÌ6ÒÃXYÇY[CļGeZjˆžƒÜj1Õ“õZMuŸ ‘êÑ}…B<+üµ™êž¼ß*lBôÉ6ù1X€%¡ݧ°èK¢½*Ï&ŸÞkM‰© VŽ›­® ýESf*Hs0º€)Ú’Z|¤ËÚ+3DcªŽñ2ûf¦†à½ª|μ5eÚ€(.™úÔ$yðt†Ya·]y©ÉqHñP\Φ¼TjFÌKÈþ™‚‡Ý˜u¥¥‚h²I·l…UÝ×’›M^’æ@6žšØºrRVü '{·l½˜Øž Òz5±w[·ˆÄî‡5H@bŵ+ÍæHº©\mŽb`”©Ûñd‹Š:SĹHÊ*2ú ÁÞ³ÖÑLŒc–MVÃ’­ «@ÓCF!áÐÑÄÀ¦úqmäËG(R‚概D+ è&óþ›ˆbû&£“Tõ~z ‘$ZaÌMˆÍ öø@’UþÕ'ˆ°â™ÇNz&©æ‘þدdÈʼ²*Mkï×'Ê–ÒH¤ÜX®%ýg’Üh(7i0Â<ƒ^:#o@¹“û“uyœ@å§ln_£ÀC­¦Édv H™ÍI'Hþ,]b£Ü„b‡-?z9'SÄÕŸÌJKª.ÏÖG}@ì}€@kôÃÔ)âB'YŶÉzD¤‰ ÌJé 2@ 7§ŒŒd± Qƒ$=0¹$ÌM 8¦ž²Œ¿X½€àœ¯2ÂY‘9ÚÍ¿WŸ¤‡'-þ<ÌIHêKƒÀËd 0‡¤õæd4’¬ÚÙÑ! °½9#g$Jot±õÅèT ÃvÍT¤b$Kn´©ÙÉ hѾ·Hî¼ß’©eäï("© tMj§ýŽb“ÚØlÓ~©ßt‰¿MþM8•ddHíèõ߆iØ·NéÍTH•Á$X°s:ŸÕh`vÊæÖ@(7š`³AN*ŒŽºÁ¼&¥‚Tʼn‚6h2 Õ~‰-åÄ`ußd4yÞ˜“ RÒ&³‘5bÏÄ”TkXÜIj2‚„‰)© þ33¿Aü=f<¬²}D ¤e#‰rc¼»n"à¯UùÙ·i“ÞI¼æ¡ @P­g6û 1©ܳ:zülu/7ÉíáAÏLHÈêÕƒ Ñ™s¥íwÝ„jg¡êÿùÙ_b ;ízUàø;ÃHAT`È(Øí"ñ"Äý‘®" dÉ÷K,Er#†N°Ÿ®’ûJnB¹‘Ȩw¤´kJݙܔÚ'ÞA´ŸÁ"ÈGH;³TØO™LúÐK*LHñúˆà_ÀÞ#Æþ–äÍÓ6 8Â;5ʱ?Aí˜Èâo²²É;ì`ùãÿÅóg@ÜÓVlµ`¾¸2u6tEÒ¨8"Ö¶I#ð:¬<1÷¼•{-€Tsà•Ù¨ ©lÅ*«Qí•+[@†‚QÛáÄ‹D ’I%z»û-€X!$G®­†® ^‘[’æ…8dj^v‰hEš—]"Z‘æP@äÿÄídâha0ÿ`e¤5ižwÕ†”gÐ%zÞŨ1$÷MÜó+×$X¡nS¢#oNÅO^Žzæi—šÎAÊÉ -#Iš§]z’æ/Ò÷,Í=› O{¦^$¹gèqUºLÜt6š˜$±r¤|ÓÉ Ûª*¾ê©bÂŽèŸÀ‹YAܱtæîM,l±b„ðŸ %û%æ¡‚»½ÁÁ ÷#L¼X?bú5œLœÛ¤ëšb.w`x õ  8&_¬ˆhÏžpŒi2ko:i²ÊÃ~г% 1nÒeå`pEÝDÏÜÉàv ­áˆ— D„²Jª(q$&#l;«'*â3D‡·àç$¹çŒI`÷ÆMY@>²Ù$)^öÛFOàNc2$çMº®ñ÷.¿þ©–ÞO½€Ž5ÊÄßÿÔGù³Iî¼]Èì’;ïâ Äú‰ùZ¿»!¹‘R٠®¦Î)¹“ˆ‚äŽ^ @¸2ÑÔ³P'ç““.«"g4B’äXö±É•‘²DÇœW)=øë©“$«W V @º¬B6Ò zñm1ðyùZ€fÀÁ8€jƒŸ´­>RrL`)ðX¡ ‹áåapá@“³‘Óf 憋L&á`'H4ÀRl\"§ €@ªt/ #r¸¤æMºŒ¬™‘}]îÒ7² Ã~Š+&b‰i„‰2“YÎÝ ôÆÖ(¦]ä– “¹Ñà ôFÜRì·˜)Rƒ uÇPç02%yÝ%"~ôâ˜y bc¤(Í1E4œô3HÒ©²› y‰A.&˜Ä,™YVnBÑ1a¥À}÷®„¢¯–1áŒHÊ› Yy¹I]¢Ÿ*8óÚ ‰žl0jh¥€•’Ä´©­ê&Pq̰Qãy&SV^’2îƒ$9(lÇFÑÃ.%è˜kZòb®dÈÈšš¡…r“«Œ4©Ž-`£“*« P}`³¢§‰ù²Á*Ï îk2S¸¯ÉÌ<ñ’•9®ü¹÷ÂÄÒf+9ZR»‘HÕy¨ÝtÒd垥0ó» uûõ‰ªÕ(L‘)q“)+/(…Û/€x±(jBϤÁªy£4 §–@ú˜N <:WÓ“$@L°ÂÄÓ3¨²ñ›a~ÌäIȨzÝ>î¶]ÉQUh6*ÓNA¢âwª^vÑ©Iª#+;'Kõ²}PÍRë‘íš"ÕË.:•é1 ^tj•êKê´ UÏÛ+Õ&Õ„™§ yt'MV)R±ÒpBÕÓ.MHƒ™$Ø$™;kL™¨„ÕH”ðq—¦¥|Üné>ÄÝÏ ñò¥åÈ“™M'T᫵¤\Âd„©§ V0Z•ðÁ FkÒ=¸B·J&ÁèÆm°«Ö0oÖ˜w Ò£fÇ€xQiÌ;q·Ó˜EâÍUçN “Ë´6•ÄÔÂúåIPÔûãFŽ2JÃóNA¢:܃²ò²Ó™wz"LŽ™XG–7ê8«¼Úí0ñÄËv0j$iilï‘n0ótbØÈJSg*+ˆ—¦®ö”Y«ÉÉU™F¦„_µØÐÎ옉-~¬| áë._Z¯âÞjD àX¿®Uþ ±lBá«ìho/M#KùE¬ÝEÊ{"ìUÂßi2ŠÍH“ðˆ« øØH—ðëê&SVµŽ!Ý퇧4O6) @ÉÓvCŸ$îtfäi;%yòiîùÉ£Ï Œ™$yô‰š1³$_¸mÒdU,ÈšE’Ç]p&weñ‚3Õ¢r½æp‚°C¨ÊgÁ¦t”ü@º4»(Í.ÍÃ.8sHsŒœmÒeìÝMæÅL¬ß®›@ó8½pÍÀ­@š&°ëf”•Í4YYq›[3L®^ÝdÈÊ àĆFÄšŸ8¼HÎÀ¬SsyØ´á-ÓÞ³(4¹¸˜u beÊ#ùeaÖ)ˆ•@(9ýb¿Åå3 ÙïP­jô e€F#~ŠL8ÑÓ• ylVHgŒ’¼™»›Ú ³IR¼¹äÖ…2²¹D&+›%™±HñꥄŠW/µø3W+£øsÈÊÊèÔF.“Kì×»?‘*+›ƒ¤Ô°*>ë‚èË©»‘)Å‹—Z$19©²² L ¥G²ŒµV­I÷°‹[ëÒ=ìâ¦}ã@Üûµ!ÝÃ.n›X‚ØÔèÔþs ^”t¦B’17YqHÓ(1&á–¾ ^”:·j8¦˜‚ج g‰M˜‚TXaG$#Ì1eД7é‘ÄË\çV :½a“!+÷ƒ»5€ØlçzËB6sóI¦Vä:7k`P×ôJ`è˜áNãJ†Œ¼X¦˜‚x±L{bühÅr0} 1¦ÍØ!;€²#bjNÚ ±9jB:íå9´*Üu·µ. ùƒI&*ð$”=ZOÈJ,2J±:™²Ò\cBºcMgÒ${°„ʬ $$gf•w‚!#•wnže$ÇœHš=f*’ýD¦¬4mž° €²7kVÄx%MVAï*1åc)~]¢W¯!‰»5h^dʦ¸wÌÉSV9HójÓñ$Ô¼Úä{âÒYyÉQš—]!0(:®dF¯#Ú†x ÛL/a LQÊ:?{uÈÌ:å¸SÛ„šgkWñÄ+¡æyWÌ­¸Y²ßÒ<[6IÓoib7a½EÏ6³KBÕ“Mì',¢ìÉòCH({Ú¤DÉ~ Ü«¤äá¤ÉÊ«LÉ’=Ùt eO6%œ°²Ÿe–zâ§/‘Xa*MºGKF!i²ò*Sº”»Ö”.åã®5è6x¥)LAåd°‡˜>Ø\3ÏŸ ðÁæšu"E!ñJSÙ3ÜŸq:²òjTy€ ˆWšš$|ðJS™‚Š1SM>'®Ô¬$ÊF îGÂý3@¼"UV2ŽÆZµ©ÌAñ–¥rŒçD˜ˆ âÕë˜a5vËR¹B~t[D°°²÷áu«qÇ4îQÂáãì`ÊD S<ô£ÈÆëú O„öj„EÈ…Ä«Hã¸ê…hª;at.WÉ‘cµ½¯D»MaÜ«Lk’¼í*ƒNC$ñ Òº$o–!‘¸¬\V©%'”¼î¢Þ¦$&=Hòj94$MVÞ^tfÕ€Ä1œtX•]j{’êÅRfH(ûp? /Çè4T{½ü7/ØüU/Øè3xtÔ›d/6iN‚( 9“V°Ñg PÞMÂN ”=ïr݇dÏ»\£°xû =ôA¼ Õó.ĬÊO˜r±ap›kÙG’æÉ 5½Ë‘¥xÚEvd)~ EŠŸÈ„UÜ¥xT)ŽðÇ4€(…ƒ„’GËéIÜDDVÊØ ^h¹¸çC’‡!Ú"ðr=ƒ$–äC‚¦þH"%»XÏ(ÉÃ.Ö3Iò°ý>: O˜=óRÀ½¸ŸÌJñrÎ ‰æ\·Ÿ‘•rƒHº¬4¥Ÿ°±M&H}ƒy!ÌJåôžU—Éý@ÂܤÁjl'eËÄ«Ëäþ V]"»ÿ$J(!²Ò´ÂþB•@)%<))ÈÈjTǸ{% [%«.P^Æ“k@¬v€L«ÜjIFÊ:IÜŽIFÊ& iJ&H<8 FÍ2I(ºi¸[ÔåóIÕç)ÁmÍiŠ1œ?IëfI []QëjI$ÔºzEÁY9“(C…dÈÊ* 6Ú*ñLŠÄ®^u@ª¬¬À6_‰@Î=êdÌM«pp¯°~“Ÿ•w¸ãX!Q É”Uì\Ö”•¢Î4<­e“.#‹Ž°±n%{M ÖÙ²vc+ÄêML‰•ã‚ld¸•¸‘,½³—Á@‘ÜÉ+åN–õ’°MåN–¹ “Âò•TY)3&EN;“xùO]‚Ç]þÓâ'2 ¼F$¦Ó07¡n2ed-vlE{ Rò¸kDæfÊ ^#x^ ³ ò”&س;æ+i2ò:Šþ6f†Œ¢i5¢äŽ–{E2'‰×È‘¤yØU’ I¼J6™˜A,Š4»Žêx7¯£É"ñˆqT‰vÄ8šD–ì—°åz$iƒ–Ï„¨H’ôzŒÀ“β5À].dÊÈë-:VZ'óOA¼ÞNæŸn­ÆÎEWÑéS0WÄë6æ¼js­4‰WíÉ Äë-'Q΄aå…tYyåæ$‰7À“{ žp¯²?¹ÍU½vsvD©;$P[\¨vóÀF¢70øYu;q2’@¿ 0e¡ª€“êé37X@­^ õn^Ûq¢B"P.#ÁQ.PÂ) ¹]É$°ê“¨wóúŸ8-%MVJjKI'à2é·5'Ô»¹Àéy^É”•5Û‰¹g¥wu׃.ò™$é]ݵðx Y™oÁ9_É”•y¼Q ”³”SH”{GÒÚ™4Ê^-­‰`ˆ˜·Á© YFÊô$™gÀ,s68m„²w6 ækpd2U/îl³éHÌÙà\ª~"SVæ~p>J‘•²CÎP ²RIËçk˜.sº¦Hõb‰€‰'¸ÈÊ<UÏ–˜EIÌGá¬Êž=Öi²2'…C“EI©¶ Êä)ÛYFJk&ú©`5QÅÌŒ71r”îÉ}ˆ€ù¤ÄDió. ]טwáÉ:Ñ*«=’"Ù“ea¥¤ƒK‘˯LAÊ·sÉM²ŸH—•½áÜ¥ú ÙøciÝå)É ÉÄ<CXý)A‚GK°N8Ùˆ‚Kõ"¡àÁR½RÒÊwS%Kð©²r¯TŠÛ•"ŤÞôÅî” sNAÜ)•&ÅÃvAôîa{íß7tBW?l[¢@lÈcN‚k±HÜ%îºÀ¥æ*ÓMO„'¸—@#+‹Ixú•¬,&áY°Û)T5¡˜õÑ 4G¯Ï»2­D ’ çra‹ÖÇ&UV^›+w^ ›ôv&L“¹ˆÎy)#L7qÀêÛp9)‰W÷¤ºoöBÒ ”±–pdY–‘W÷¥zßÕ½%©Þ-Y8¥¦äã•M¨zó0G¨Qõ¶]B+R½m—Ðx4Ç… Y¹—hMª7\p€U?‘*+eÇ%œŸó•tY)é3ñ¬8Y¹+iÜë–Ì•tµ¤ÈNl› žåQŒF¢„¯Û•ô$á«÷K@úd _-ë‰dÈHIv '(gý”’ìΣðe»†^%|±ìù„Óö(|ÙŽs+²òx¥w _¶kè]—íúðe{nœAâ1¥»6”pŽ2e?ªžÝŒ(ѳ{‚¥yÞž`(?®¿o2eäuzdiž-}/á0Cjž-¥”ñUö |Ž@¤è¾ƒ EO–ppb–•{‚Ñ%zÚž`t‰ž¶'àÆ6WÒeåž`L‰žvÖÎè ^§‘2+ß ˆ-=V 5#QªGËDM8L™²GKŒ&¡îq×ë™%|ܵx*E-µÕâY¤|صX§šs©¡ÕâÉFö½‡RâOWÒdÕ,¬˜]ʇ]§Sìt )v Sʇ]C§rd0©úˆ•ÑØŸ ”Çr¤a„„]&ppì4Â¼Ó ™²RªbÂÁ U¿eU‡‡FYYåq¢²RêvÊÚCmðhîM <6—W{ŽsJ¡<¢¯¸É”•UÚ¬]á¸v4Û2ûtðÔÛMš¬”ÞpD*¢Û4¬ÒòÌTñSäñ`#Ùî… ‡¬BódçqPòg¤x÷–¤ËÆÚeœæšdí µM ˆÕOœKÅ›×Fž ÛH¬6âLe 1ÆH“âÍk#H“•µÂ8€–Šû&O$CVÊvL8U9·+™ãL¦o–™pü-÷Ý¢H¨xõ›µ™%ˆ5» CVVcy®®¬¬%A`{$J;Eð¯:œµùç…`*ûYMJ;ÅZ.õðœßy&J;M¾} ’d’o_•²öF±ZÕ©|ñZ Bå‹å©';Œ|°3éDrò'2Í*‰R¾¸/À™ÇAVZ¢AÒdeÞ‡,'YYû Bå³eq¦¬3–.±Vò=·ÎY®²RN|Â9ËAV-n‚/É”ÏÊ<ÅZó¹Kù¼½CVæ)æˆÚ&SVÿgm•|$E™§("c¤„a}›UëÂ=Fò¾HF:“$å“¥H“Pù´}JÉR>mŸR”&ƒ"[7iãLª”OZDBÐõS~Ê;U¼OÔÜ6ôL8i™’GKM8i™’ŸH“‘%â¤å$+íGÒe¥ë„£–)yÜ®¨*勇ÌÕ(Ƀ‡ Y{­_%Û]iwncP7¡ä¶¹YÊÚÀŠhUÎiòÝÎŽZ®éLšž» Òdå­v ¶³ªJ’9%bM_Þd¦3QƒŠÅVæÐš’NϺ#·Ò\\SÒ)†Rú&ÐÓ\œÎ1à.s“)+K‹Í:!Ä’`qÞ2tÇômÞ¤ÉÊUãN ØqbÖM†•€æ¾tˆ»¯Æ³Hõ.tÐâ‰p¿qwDMI§XÂVì)”tÊ9èìÊ£1—¢6¸oÆÜʃ˜KéÊ”9å2v“&+ë%àìå$+w)]y§Ñ·K8{™Ê7K '¡òÍSgqö2•oÛt¦—‚¸sèÊ;Å¢?s:|Ä+~Wæé‘(õTóú(ü3PâilîtÄ f•@iaÁb4¢¼Óè»Ö‘PöºÄPÞ)‚uY@f<“,Ùëv"C‰§LeÞ„²O,±þFÖ©A îDF“ìe»Œ¡V5Úy 0Sõbyº8m9ÈÆ‚™¡¼ÓXÜaè¬$wƒ{5˜{˜J;EÂvÚdÈÊÆTÚéñ¥"‹#oBÕó®úSi§gBÕóv“{5€hÉŒgR¥zöü_ÁLÕ³-^"i²r÷0»T϶žŽ¤ËÊÆR=o‡]dåc*ï”Iï$8s™º'w >¹3À)Ìqœ¯‰RþpòN±˜sn2Æ™p¯†Q‹}ÇB’*+KI.:¸m03g“.+ËÙÇAÌT>yÎ~ѱqØtÈœb¦òÑš dM#J< F¦”ï€ôq":ÄÜÈ•%2ã æ"+KdƹËT>º»©²²Üÿ¢3ý°™’90ĹG¢ôSüäÜdŒ3©Rþ@”ÊeÓI••99œÅee•?Á87úöŒ$SwhùÏ8‹¹ÈÊ €Ìq"Iù§˜Â‰FxR÷šÊ›`ˆËCªˆòO‘ Ö6²²@‡1Cùà[L'œ½de¹¤ UV6ÀaÌq\t¶9dÂYÌ=Œ›ÿ޲Oð§è˜Î|›êTt”'IؤÊÈÜNb†èÁ÷²&é²²dÓ¢óH/¢ßR2á0fˆŽ8uˆŽD;ùXÆÜde·1#uéLš¬Ì=á0æ,+sO £ž‰RP±(Wî §/Y™{¡èm;£¬V5ø–$”Ýw°L89ɪ٫ÉÊAÅ¢\syJùæ± `¦òm;ˆ¤|Ý¢ð$“ ¡òu»Œ’¤|õ…? ˆtƒï„™p&s‘•¥mƒÌq&JCEî¤9ˆ¢4Ô3i²r—®ƒ¬´Žd”3ᎠÜ+ÎÜJQj(Ûe”!åËvEy¨gÒeeqeNõJ†¬Ü‰èàgK#™²²58”¹ÊJËìe޲²U Tþ@Š”/ÛÑ`#$Y¹£©JEE«27™²²€ ‡2#Öå²8#ÊE y;šÚ¥ü0“äV½ª²Q1fÕ«N ï›…¦Ò?Z{Ñqà'Â]@Ü5e¤I’êÙ=QSBjHòQC²à €’'wMMÙ¨ÁvcOEǤŸA«' lT% 2±ÂØ”zS&îï°ûQ<e£b]v¬N¨uÚ¾¬s¯ì¬è¾¬+c•&v;n?…xgÿ(±£GL8„9ÈÄ]RgnMðOaFÂVb¶MÐØ‰ÒQCØ>ªWɶêJG=¥£"¶š›4ý–û±®tT¬›Œx&ܲÄ}]W>*rDÌ× ÕD ©!ì€i(!õH’TÛC(ì”i¹ý8ˆy©~!ëy@Ü楂¸¯ܲáB:»ºÁsÁ.¤ËȺ W0AÆökƒ6˜¦ƒ™©ÜÿÓ‚µÁ @lIbNýJô5îÄ&ç±A܉M概¸›<Œ›š€“É© î²&“SAÜAMnÚ@6¡ì}GB“‡‘\eïÛ‰Í&Ù»/À9ÌAV¶ÌDÀÔ’ýDº®ÑþÆ ç0ë[O0OÇ0Sön. §0ÇËgjÞÌeáfJn‡ ~–ÇÂùËYòGS¶Ç/W[}†³–C¹’&#[Ɖӗ)wsÿ22‰-ìÄÌ”»ºÿ¡Ü2$wõX '0‡~%-žHd‚ ˆuAz?“xÓ›c˜Fô™GOá³<N_ÖϨôâs“-ÂÙËq˜§(îÖpô2/î @VÀGb¯=„3èRÜr ¡âÅ»o8y9]A/g2%¸ï&LBÁ‹/ŸÀÉË5ŸI”à¾ã0I“•-OÂÉË<»Ã¡àÂ].dÊÊÖ0áèå"+ss8z9^UÏâäå(#ó{ ƒÀV„ãäå,#ó{ C×XЇ“—+¥¯ã˜åPΗ0¹æHÐC8å Õ$JußI™d>a³g[‚c—K±7ž³DOîOA(ú‰žÜŸ‚tY™CŹ˺Äü)À¼&Íý\Ž„C–ƒ~Ê<,HËg2$zrŸ 2Î`JôäÉò CF¶0Ç.Ctß :áŒeŠî{A“ÔNbK·pêrº‚.#ó¯8t9·+™æpqær‘‘…€8t9è—Üã¢k@`¯¥pslîm+Y@(ùtJî[NL[Û‚—K?“ɶÔÇ-·|"5Hïé‘Ä=uez*÷"7Ç\£Û £S@à^¸2Cš»Ï­Ü˜áD¢ `a!ÀzÉÜ]¬r¯¤3˜§ÏÜ“@½%œ³¼BHµšçÏÜÀ?÷~üŒ³¿ðÑœoåN ИJ`õgLwßù¨î¾Oþq÷íž°¼»ïÆtT‹JA†®±ç*W÷ðé¨Red‹}p¬r"°µ>]F¶Ú§*'¹ûFOà ˜Bs"S2í½Ñ pç݃„~¾¤3õtM¤Ø}ûî¥vß¾»'ÉÝ·«î2q?ݳïÛOw¦Ð\H'°eF8P9ç+ºÆá@eÝŠ­XÅéÉAFîr{—à‡kØ^bÀ|nÀ>)ÁÛvËù3ÉÝ-$˜ù˜ÃSžìÕ ±»¯niùL¢Ä>‘.+[qŽÃ’s¾ªí§?$–\Ï€é¦ îck‘ÚRoé †ˆ»áÚ¤ö‰Lwº•¹1'2$wÛ>¶éÝn~‰ÎÞlµ;@oGЂ·ƒ'¨xõx8(mú‘$IîGQ´|&Ì‹á^y“>ϤHòºnSÛÙëvºX«<Ï„Û.€¸CmMš_:‡Ó’“@Ø`\Èæ~2 b)ÄØÉÔ™½lÿÙƒD?w¨é¦ îP{”êe{Ôž$û‰P÷²=jÏÒ½x,Š3“ü’&+w»û/à¼5w»½J÷ì ì‹ ‰-°™õLºtϾÀ®Ñ_Ø»ÖÕŒ æ²IÜ[Ó¹“ØàƆ…Äý÷>oß<¢„?$áóöÖƒÉ1½§í­G–òi{ë‘¥|ÚÞ"­¸˜éLª„Ov.Mj ÿIܵ£ æ‰G—ði;^võ΄¹12då¾xL ·/žAŸH«$î9Ls%]VVž¦µ¤G0dcÎñ?ÿæÅhV¤Î3©ÝÏB!éú![5ˆ#”“¬ÜkÏ&ÕãöÈý'qÿ;Çå#’ÀxD¡yß9%ù‰PòàÎ'(çt%CVælq‚r™g¤’°I••ùßÎÉQ‹ƒ;'jIô”8A9W‚T Ùø—TIÌ!ãüdHÞ¦9d(~Ì40 ÒecÞg('ÙŽ 3 1 2ç‰DfšžJ‚˜?îQMió“dŽQÎéJ†¬l…"ŽQÆdMóÓfNMéJ yóógÎQ†ægÒ“H0ÂLSsãi–$æ´;8IÌkã$å +óÚ už ÷d1 Ò뉤 å‡ûèΔå3aN ‰by)+['Ý™þ„£?mIdgŽú• ½o~DNêÌÏ'1?Þ¹‚€Äü8NT¦òݽ6PéJª¬ÌãHå(+óã = ·eèÜd|“¡;´8‡*—t"9Hy?¹’¤ÊÊ|}ç*©'œŒj‹©A¨ü$)ßÜ‘ƒ ÑÇV&ÝH–ò'2ç™)ßÜÙãdåX¯¤ÉÊÜç:F‹Ä;WZ’˜³ÇéÊYVæì;W^I­g2¥|u÷Bå«;ûÎÅÀ$¶pdÈÊnâ„å"+sÝ ²IÌuã„e* ™î™Pùêî½s­<‰9s‘ΤJy?ß“„Êsb@ÜW—.åý P’&+[Ö‹ÕæÇ‘Œz&SÊ[:Þ¹™ÈÔzÜ¡@#Žû·œSbºöÝ4@Í‹»ûš%yqwÏýtÌÝW景¨Òûù nÍ€ã‡ÝÝWµ¦gB¹¤Kî¼›„Ê,SÁËUVÞ$Ô)¹O¤é·la*XN²²…© £žI”Ü¢µùQ$UVÞHp‡6o$x³gR¤yÞD+j~×T©~¸†©1<ÔÙ‰Ö¤»ŸÖšè‰7­Kù´›Æ,SÞzÙdÈÊVÚ±e”•­–µ¦ûHzòÉ7Ê` ¤;´µ–Q8kz’ò'Båãnz–òq7 è $o¸ã)‰7 ½Jù¸€^¥ü4)w“Л”»èL5±5¶R¨g2¤¼«•8&“®¤ÉÊÖár¤ V~ô •»ànÈ$¶àž#‡²ò&a$)¶»çê•4YÙ&D–•7£Hù©LJja7 £Jù°›„Ѥ¼ó•83¯„ÊûÁ_ óLP¾úÁ_$PSzöv4­w!³žÈän 'ÂTSo6&;¦šÒXC2Õ¬IfÈ…µKs“)+olxà‰7$̹’&+oZ&ëÈØó™Èï´qƒ¹I'Ðe¢&‰Yí0±“ ¨÷‘9¦¶ WÈÆTs傌lA5ÖMPîî ×zŒ3á> lßÊ&SVÖ´Øb©’»{cÒê™ð0kH¸KVÖ .w%ˆp«霸X-Š#Sš7ol¸Poœ—’¨ÞtÙ> \U9®dÆ3á^ ¶œËVÇ•Pøæíñ–+鲲Ћœee-]ë·¬ƒ…ÙEVÖBqy9¬ª·P HP h62$¼ŸfMBádJøêmÈ'’ƒ„?(᫯Mç& óL’„÷cöHz=%œbËDZɌgR¤¼Η°OH•í"ÃýFâ™p¯† é²²¶›Á¤+A.Ö®ª5ä&8ƒÄZÃÁ£—¯¤ÉÊÚGî$+k¹]‘¬¬5´½“@¬5ãL”sZý ÀĽ¨ê•Ôq&Ê9Å’\uü¸åW=îÕbëé¹Z<“&åD9§Ï›4YY«Êíð`•½Uå~}ƒÄÚ>n I¬¥¡òÙ[:lKXÆ™D)ïÇ”“´r&IÊgoû@º~ËÖÓcÌ,+[OÏÍ7eeëé¹ñ'¬Òn¡ªÒOñuc* J?Å ê° •OÞÖÀ1ÊÈôªJ>=€!Ù“·5ÚT׺EšLÌɵ Í“¯¤·}†—DI~¸„›5 ûe‹í¹¿ò ±í:¸—s¼J~ Ê> ›ôx&J?=“!+o·ZSƒ Ê?Å[N›TYy»Õ˜Oƒu)eƒ.#o¤Ú”äq7IMù§Ø½Óš¤$ú‰LYy“Ô•jÞž[ô?¡;7 äÁvÁñ”ü¨xð¶¨+ï”GØ—T v‹Ñ«"¬Qâ)ÖëŒMº¬¼ éÊ<­a·]™§G2$ø(õ•1mÁ±ZHù‡§ÿôï^E R–'Ìaõ{Ü ’_$snœšhþÀ £ÏZõñ›W» ¦'ÌÛá|Z%PS¬¸"bÔU™V sAÖ¿1c& pÓÌtê3ÈÒ‚™:[¢®ŠÏ çì`Õ{fØëk#;V\ ÒŒð0 ®tÊÓɪö\˧ñýéº},DÕ!âF1ØùŒØu½"­ŠŸNæ“vn°_â >î6™0Ê\^KÂåñÜ$©Ûs7òšÖr×µlFXÀ§ û¢ƒ›Âi?(Á5õHØdý7i-NVç>¾ö5‰‡Jh/çä’GьؒÇ\¬Ä5|Üã_§,b?Tˆ5±AÂC%x(LjNV×Á'zªÄîOŸÑ9‡ PgÙ5\Éǃ—LRìqôÄs³ü±¸”G‘…áªãиb·ƒƒ%x0 ½ªÄ¥|:×ÑÁªñ<¨Ó=ñXU£ 0`ƒ[÷‹eÊý‰§ëDÝ´BnžL]Ì„ ùx¸•éÌs%xžº=bæpe¤»µ_æpedã8œ,É#½°ïáJ¾È½Éí.Š«uD%H…UŽ®LæJ¾ÈMsª“Õ\G®×ëÍ\É1 a•!³c»6± ÁÑ«‹ôá53s%_ìÚW›צp!_dб DÇBÖí௴ᓈŽù'=Ta¯*víüE‚Á•)\Ã{(^u±:yݦ˜­Pc_£G¸†/"¥¡'ù&0=9ˆÍÔ’LXÁ‘ØCs}D“½^6̋䱟šÉ ±e›1Ø’3oHÞö!òصÀ*Ø©a$¼q{lv¨bå©"¦Œ•ç&:Y~1"}Ú.AjCDxœ xU`IÂAÊEì+ÖkÅbûQ*¹–Âî‹u5b-ˆ9\Œßd÷V•k÷bõ½eI 7×ßèEc„onÓç`’D7âðë":°†„c“‘‹Õ6i°ò%Ç;¡Bí‚û è?E.‚ÔO5æ4D¬õÙ Ä.ø%a'*&Šðt‰ˆ–FgOƒ@íÂc”DØ‰Š…‡Ï8ÞEg¾‘p _äJnûuÜ^M^Ù8½B ûiö¢"ôøœý|aìx É‹&3t\£$I°|/–ÔÜÕ3{„SR$\S± †½\¤Û0n7Ź׈ñ¥ÆòÜ ê)f.«`*bc«’È.[FØ(Ç^*§€¹ªÎÓ%"vèi›4E¯êÌr\¤×ýÅ<]"bë&sÊkø"¶’²J0>rÏD}¤àY¹r$\À±§—ùDd D¤Áõ{13ÈvųÎx'Á[±™0L"ÙÎa0Ÿ!b‹9ÿ%,ß‹YÉ© 8÷Û³ïe»±# q£â)ïïíR\‚‘‰_Rê3É â±x™SŠÇÝ€`ñ~)L÷óˆvc;ƒW*= —ïEn(Z¬Î]ÄÆ¤V›&˜à¿ØË\¿Çï³ÇÄ‚Å'Þ¦UÉå{$ö“Ë÷¢Õï/O|Y£9˜°ÐJöŸTÜ$8– ?±`ïÏÐÕÃÉ$ÖÌÙŒ'ULû!:2Öw¿{ž-Aߢóбéi}¢Ï’»€dhÔá.‚4UË׌Øá4=Ñû÷  7û–,¹ |ŒÌ'¶ƒÁlŠÔ.^)ðþ¨vžûî8ɸBÇtc{Sʋʣ7«ƒ~²©QzãM8S`IÒ;ÛôoÄf¦ÁŒGƒ(ö½\Æq|žâVn×$»™zËçoQ»‰Sø4‚Pˆzçfq_æjï,}”ÞXC#0$wöø¤ $³™’;g/ÌDI¦B R;'¿YžLÂuUFt3ÁïI3‹$ÎB¡Þ‰y$$\Æq²¢½$&K4÷ ÊìŠ8éÑ«JñT¬ŸR§ˆUüÖ$yÊ6òÿrõîØ–ô0¯XþâA¯Ò[sßÐËÙMoìéû€)iGÝGO”J¢Té”Ó+œ#Ë)¯¹®»dóM²Iy­Ú\¶i??Iy-±PEìˆÖ%ìè­¹û(c~R^v,T¸—ü”Ãv `(mêæáÌhZ&¢ån 2^fL;~ƒäE&/#Þ¿[CDÀ"áØä»ôxnk“ï‡uÍñÜ–‘ðRbDxør _<lÓΕVµo<åË7gWþ­˜° ›Kx3uÆ¡ÌÀ ÿâ”ÎL;1µ=ˆD)_˪ÿâ4û¢Â$µà„±•„/Óê™tÀùþjØ—{“o˜ï=S&Íóô0PÜW#Üü&_ùèÇS–t ¦Õ o¦`á‡õ$ͯòy.ã¢éA‹W fDD±ùU>/GK“¹4ÒÓ¬ky¦Ë™§¿ÈW>ú=uÄ/ò•ÞRqeBÁ)æ\Œù"xˆ.x‰òÑy«#~Ï­<¸› ΖàÉ´7"ŸÝýxý!ÛdPÀ“)X÷@Ö•H%ë{kåéôŠV›ë-váÎúŽ·Î÷åž _Fð¼ <÷ À9ß=[3ÈùŽ“bx--󙞫Ƀ×Rg}ë°€“¾›lº»œd1|0~+)jŸ‘ô݃.÷ÆùTU>²¾ãÐnL«ê*;°Nÿ¸äÈìõ˜àÅtx)üÕÅx•ÜéØe"¼ÊÐëîÿHч㓦L_ „”—*w‘ñ2x+ÅJdà„/Ó‹€sšªLß ÄÇÍ,ãNˉ¬œð«=¼—tz­xLô ï÷ª@œð‡86rÂ×Ò<ÑÝ=?=‚ÚÉøZZ™ØOÇ¿ñìá#þøÀÄI_CF0<˜:ëkèø¥3<ÆÒu\¦Îúê2”8ë«kÚêü8æåð€Ÿ‰>å¢M„¼Çéü•’÷O£Á©:(ƒSò~#$¾È¨Âq‰/:‚é Ü㈈o~ŸÏ=6äHü$ëú9Ey»!å±kï]êE¶8I9I¾KëÛ4å‰ôO”ñÎyˆ4"ä—±ÚÐ+Õ«ÿâ%ÄýdS&ì÷øÊ7-&ºî÷øÑ[Æ#iGZNøÜZE»G3$Â# ¸)u‘&€©L4ªpë|Ï%CˆS>—éà·´y®©ý÷p @F’cdý âä_&œõÑcT.­¤PÆÍ@¦çj1E¯Â¥þJSD{I{UÑÞc–YU´çмšh?%wXŒÊ!„Ì—à‡ßªϸxЈh®_~ŸÏñ¼¦˜ÿtÆ/¦dþ ÆÖ&óÝb_›Ì3"‰#Fæ»…™³ü³·#ËûãÚÓ-,–ý‘ù“k2JÞ9Â=¯]É<#¤8ÒÈüU—–Ô¾ã™îNæûæwçšßw¬4Ûïó9¢çµ'™ïq> Ä™ÇgN•¼ÈüUòâ¢ßsùÞ›ÌwÿŠ%d+·ÈðcêÆíi}b>˱OÌÇG¸-ŧœ¯Ïxm­ˆù\ã­ŠùP{!óñO`ŽhlXó#Þ8ëb~ij!æ{,æÁ#‘`SÌ÷XlŠùOÙ–˜oñm‹ùF¸zeàŸÞ=“‚™ˆo,øžÙîLÈ{ÕÈ€/Ó®šº2UñÞ4R »[÷¥ä=D¬Ÿ\]¼G¯€˜rqÄãiW®½qk+ù‚GÓ)§Òøm>Gø–Y"CUmÑ~š³Eûé„%íd߈ƒvNb@|íï!΀ÿRòG¶@È{˜hðiúò^üFŸ\ÉàÕ4x¤‹÷ ÞùNÀ‰iQUœ/¬ñ¦™âý¤™â]_øáÖ”´Ç÷ ¤=Œ'ø5åMc¢=>Ò™‘˪…µúfd+Ó§4…´·°ÁàÄô«O嵊öOGqpbJÚ³òÚHûUU2_ ç½m­’ðkê¼3<—#Z[[|@†riÄÕEÞ¡ Àio Z^à×Ôio3~úÊŽIg¤c!næ¶Ü´¤_H!é8ÿ À9o=(n~øç÷¶jjJÒhmµ}lZU[|✷°¶àÄÔ9OU˜Kït›âü‹Ÿ[Yª,þi“ÄýRø4u«iˆþ d<Üý.Ÿ—ÌEÈV]šÌzéÙž^Dú§ý&ÜšŽú´³†Zȃj näÂ{-{Ñ;Y¯ñˆÓÎ{Ž Ò^—íàÇôûÉ5I;n¯¨®EsëʵH{]:Q‚kÓªºÆÄ™¿¿Ë爆A71ŸiÆ'æg¼Ø:Tµ0€9žÊG%ñ§££’ø:c| ­¨bÊÅS0W U•CÀƒFxÝ<2•i«}“ÆV]:ý¼GÁ‹fîéÃNÚû $hWë°Ê ÌOœ‡ ˆZÕdØÀÛiW&ž±ñŒœYÅylàÜ´”7Mé§ä.Ò-Önåáã®6õb4kÎ!Îc[§£¾i–HÏbVŽõhßç±ù²û3j§‰ó%-Ü›~å&K«é«ÐÌ:ƒkÑ>¹·†ÃSÒ>ÂÖXU´Ç¾>OI{Hz€˜riºXþIééa¬!Ú[L2kˆö´¯)ÚC…d"šÐÖâr_»Ža˜r©ª-Úc›§¤½Ç<´L¼G¦ýÑÊ:åîO´g’"ÖO’Bã¶Ž˜¢7%§@d í&Öod•§›[‹é¡kwYWš!Ú9Ú¥{r¹¿Z¸D{ö'Ñãm%§@dËî´‹Ám¢=FÊÖzzÆ…ùU¾+‰.öuÆÒnE¬Ç¶~N«2ñ{-i²C’Þ”Kfª5Y5D"ð|úû ñžC7êòQwú"ë'×ïɲ­ä}ª=;xçOKÒ£¿Æwß§¾ÞÃÖ `«Îxð}ÚT%K@l½iªH?išX¹:²^5ãÁÝ)Y¯<ˆà þ•dˆôª’šø@%éŸÖ¸<%é!22Ë‹l‘þÉN²”k 1Ú¶µh9bÊÅÁ?¨$ýÓþnO÷b@œ÷{zø=uދɘ¢bxDG¨-ºÀÞoÝ]´ÇiÜž’öPM45MµêÓ¯ÄY Œ‘¢’©>ýÊŠ‘Âÿ9¢‡^6×{Ü] @ýéW¦i&+½‘JêÇFYž+äN“t;Ò°ŸL•¬Ÿ$ÆmZy&ß‹?¤ËΙœ}<†ŽOªžDüqòqDc‰/÷“Æe4WÕn„8ð%2TFx=­å­z‹óÓ<çRUOZÂð!ü öñ4†fùÕšVDy(õƒìÑIJÖÃ'÷ þ,¹ !ç+^àæ§ÆŽè%oƒË} ñ’žc«M‘¾µ£ò,‘žÃ¯-‘®X殜W–úib}É82öƒø&åÆ¯ÕŸB{ãYq/9ÊùÕaò”ÄkÞBš(Ofx&róɳ Gæ d­·ä‘œëãYÔýŽõ™œG]KœŸ^®äœ‹ô䉚¿ó_"«<¤ó|Ñ~O²÷ÃÆøþiZà¹úä­ûjj€ÐÀ=ˆú–RÅ{\Ö€3ÔºŸž—¢Þ¥tÑ~ê¢ýFæKà˜¢=»ÉÃòqEÍiq©/Sö1¼¡v½ꥉôœ£55×K5?‘>ôaÈz‡Å,"ýF¶ªâ‡E8Díå-§åÃÑäçš{:™ý_}fœÙÅz6yRVs§d=g~–º§²9i`•ø8 ¨ó™!ùÌ‘ÖYšÉ´˜ù·6´,Mé1Ù­OœwéT&¹‹cB¸Bõe¾èÀoò‹©_"‘‰;€É/¯w¦&¾›”$“pѹ†ø>i†ø>UM-òq¬ Ä??”ÜßÉѨ^‹„ÇøA%á7bªª¨#áqf §§¥?­Ùm«Ó ÜLì"Â[X[¢šó”vPeú)Æãüw¥‚r2›’šC"ô7ÉHÊ£3)W7•¨å{‰ò\üöå9è÷å9\·å4Fƒ6šISsš}¿”[ ÊÅžÕ_Ê)õ¹É±ö¯=ÒZRåv𳥯æ&ü26’r “ ¦„Ô{ºœéÉ´Dy‰)Í–([Rpª$ZYlk}ÿt6 ¨d<ø;%㟾š!㟾µÀjU.N`룞æªÿ4ëqÆiN;ÒhÊ^ˆ45W9]”Ç5¿åZ¹`«W48áµ­»çëûý)ÊO—¨H½ÛâŠTÜÀß©Sþ™¦d þ±átmxšR>Q^ddÁêåØ+2^dÀÿiUh‡Ùo¹]Œg/afþÔD=ÍUîLÂED™I¸ò¬à;ûœqˆ)›t_ˆ=#¨Ø/Ýõû÷=ƒu¹ õÏ«JHsúS‹è.ÚýÂíéKî`?5QŽz )l îáÈByh·áÎéÏøÆŽ€=j µ¨@hr±ù l žÑQw²­áQ·Ø>ž9«7‘V,œ—墩W¥%Œ·æO¦©>lM [™LiÖ/é]2Óè÷ΩEã±KsFV—ÈôŒÐñåH×@¿ë'—öÇòbó^ñá·*æSÉíÌ-È|_úÑsr‰Ú%‹9oÞÊ4­ f·MÇ¥C ïT9R™æ7a ó±[à»´¶·­£TB:b…Ýg¥_½í c¼iŠäH'd¦§…³’ù0n,eâ® îK»ªâæ‰×p!æÄÇ—wø*¥,¾¼™Ê¤Á4¥2½ÒLÉ‘ZŒÿIç G„¼‡ôîK‡ré…’™^¹$3­=FáúÄ{HQ€ìG®÷¥ÍžrV‘qŠø0o]«‰÷SŽt¦)`ÓÆh\]ć8žÚz}K"þ”3eÑžr¤3½ÊYbþäÒrzµPZÓ+—%ó1I~ôVìO̰61Í2b"x-­`H0¯ºvKæ#Mó!…Ó1^dˆù³Æ¦7†;ÍL-X´y&ó[‚Ó«Í!ŽQÇ·h} |–Šöøœktáê²=OÁ$5=m³’œ«%VŽ ŒÌXMX”ÜÄyŸ¡‹=ŸëN?’êhØþK1x.ïhµ•cÙhÒ˜žؤ1½yehq)H0OóÉè>ïfµÉ-ÃUŽ%ó‘ËÄ|¶°KdzØèR™ž~õ’Ì‹Ÿ^“yÍ•½&óš»ü2\uIez!=™dü2ߥ2½JžºV’cµÏd¾(×úó]®®6ïó‘ËrÌ׈Ùiá"ÌÆ—K¸0YõM#¥iÞîòÞ-±Qãn JfÚÂ}°y4…gÚ’™žIoôœg"—¼3\‘Î4ïÆØ˜I»ÈòÎpå’δÙ\6vÒ¾ÖX’žÀ~Ÿïür´ë=òW÷t5åœá íYs°khÏšƒ=Š‘Èô Û)•ééÁ”s†3”æøìsèþÔAä¡ÕXЧT¦ç¥™+»^‘)•é•F*Ó±ý<‡iÉ:»¾¾$]M^rÎp8]R™ž&/9g8ô¬šc=rµä]4/9gˆ»X¶$3má’È*o&ùf¸ª’ÎôLzK΄¶¤4Í»b@†êê¨<4ä3[±ªž\¦kTáHÜ]c’-¥iëaÜlyhhá,椦"©iaìJ[«x·¤¦-|’Ùã-G.Z׎ն¤¦§[>ZckKjš÷䀬òtt¯\ø¹;²_ ÷¦<é*GN©[bÓ$Ì䣡õ0ÈLzSÜ©#P’ö’ÈÖÃâ~³šWyªcô•~×ÔòÆ :eR›žšä á<=“ØôðgC¬g¹S‹~RcÒšž‘l+Ib¤5=ʤ5=d™4\·$‘I¿ïKÒáˆ)I:Ã~_¥B)†Ž#Á:C/~_KÚ#WËÑÎÐß'¹é•¦'í]åÈGC<á?DrÓè»#1Ü«ÚLÉÌì~ÿ ‰Ÿ¼ƒ\¡™øÔ­žÈ¸ßÇꢧý‹¬—ŒRD|–S¤7ÕP©.E+?@Ð.*ŠÔ¦çA”.ÚO9h¸‘´‹.ìî÷ªú¡h†A‘Þ4Æõ³Ëú¦ÙI;ã„øñ¥r5•lZô9ºØýéDýD»&?¤<¥V)NOjMÎÕËZߦú­˜ñÛ´âçs©={¤é9èßUšÓxùªïË5[8¬G ¥9=cßðS—œ3$7UšÓ+‰ÉÀM¶Ú—¤«£íËIFUµrH·@öK!¶/ûy÷ZÕšŸ¤6 OsL6¹f8ïL£Žæ ì&ÝiËŸë'Ç̾Z 1Òõú6¹eHfÚNÊõÚ–i«cÅÝóº~‘}]Ï®¸Â{ †”òkîë2 *®êÇž"ÒÈ-Ã)¸Ktz!rËFž#»¿%÷œØ#—Ü2´ÆOíÕ^ô·œ)ε.:2£[|¼]ÊÓóÞu¹e8c´Syz^«.åéU°Ü2ÄŠQ᥼#É#H=ÓÝ(¹ÜkDŽ’¼«d†»_«!ééiàôôBä—á´yô$^ã` Ÿ]òËp•#íéÕ¯™c]ïÌX9Éh2ZæÓ¯+¾Þ™!ýéyg†‰ø,g~Zò'w9ŽùÉSÀ ÏK]KOW. P€ÄËïA…#(¿¿ ˆÆ€ûÙº¤‡GÈûŽa9©§áE¦ÌÛ“DÔ¶cTÎ%ÚO®ðË _].¹HûißítæPݘ˜`˜&ø#ëó_³<€$5m)Jµ^¤&ç ˜Ä~jj”]¹¨BmrÌí@pÈHΗ"€ÑCá/9 \ahFY+(×x\[”[¼ÒK*Ôfš»å4÷o7°Â½‡ÇîiÊ2V VîL;œ2X¼[2Ô«˜šîG‘5<€8²”Kó–S†þÅJµ%¨¹AÆ¡ú$[NúïÏ–5œŸT8Ë,ëŸrªRÝÁfÿ¶RhYÚÔ¢öÖ(|õ'‰IQÓK,LF-ê•©ˆsù›ñJÎy¸õaL¥h4®ä!§Â§))×-GHy‹7Åä!<ä8²T“°QP^k0!2`MjT4˜€Ü1tIeñW/M„Ÿ4rÈdÁ·lë¿ÈV.Æ ,õ¨Pè5ü/92*ÊG=j2`)'5øÝ­ÊÄ™ˆ½IFrnjÞLÒ£nêQÃRu§ÀýYëztð$ì\u‚8à«|¸ªp?LÊ;χk)ßÇc~ŠðƒHŠšÕybè¼,Sá¹µ§šRE·´½ˆ<1t w«»SVãlB¾éܸÂ)³ ð½†v2®PFŽLeâ®~ÛU®^ë& W1Ò¢†oº?¤ó''<÷ ïˆi8·ðÖ&UŠ#ëÍ#j¸Òsd+ $¸ÄW±Em“ u|<Ût„|[¼åMÞÆ¯l“uH]RáÔßù%Þœ.M„G«ÐåÕPèËýÂøâì¢v£ãÑŠHE½Ò4ÔòëÎD!ê8ãã‹·¶KˆzÕ­ŸUYäza”x—º¤¨Wûu—*Ï ãû—€c’¹T„xˆ,dH‡zøZ5ÃocEìˆòthH‡zXU„çƒt»CfH†Ú-æøÑ4À-V†Ñ;Hã—î1’îhÝ º£K“R±¤aÈçÂ1~Ø5¾˜ÏÇÛ'åד¡v‹umJ7sø”õJSb€«”)‡ §ùSÔ iA·:4[Žo=€Ù“îÀ~ I·˜›ÒÌ$¹“îÎï•dïDæz‘®7£‹ ž4í—îõ=m[õa§?KÎÎðY%·Fîb¼¯‹–UstÒbtG)ÒÊ\HOºõð—Çû:4,yZ8Ì-éOO’c[³ßZéqSÓß’úôBèh¡o™reI|ú S™d`m:Z8Sæ–öô”»åkáJ#ñéUŒÄ§á#ô‘¯…3÷îöïè9Àõ~n¹Zè¾þ’Ì\uËÓBø­L4´l™ZLíéé÷–d&Ü¥VÄ7ªb‚¦0ýò³põÉ’sõÛègá,³&ñi.Ä&íéYnβk5)W{Mz™Ó£›…ÃIyzè´‘Œk4IOÃkí2“òƒ¬Ÿ\’žžWÐVŽr½a&? çõ1éed>o!B\Å8çȲï7¹ÂgQûEìy¡ªGÌÑ\G°ä¡LS5™8—*Öȶ‡°&Éé`¬Š€ß›©ÑÙÂHpz:ÕjÒ®Ö4:[Š ê€ aÀ{Ä#ìóM#½éiŒä¦çÁ4¹[8¦Í$]dµ%ÒO©d˜Ñ’ƒsñÙ,9çÜ dªªA¤Ks:‚Å¥š&[Ü%9#æ¤^ÄùAäoáB$9RW:2”k±É]ªÓ!µ§#k¾ý-ºúH_òêUŸ¯/ù?d=\u­¢§“;)×ûÒ%< Ÿõã¼Õ—ù[8žžrFçQÕ(2«f,&CºÓ1cºr¸nök-ø÷ÈãÀ¿"`29_šý†42W1C”¯˜þ†<.Б¥ª4gidÆŠ qHwzª’ìôjçØ1¡iN#AEÐä""4ñNú\8ÕLiNO©S>ÆŽYuJsz:0¥9˜rºÍ=c&Dkº(?ÈЂ“\Í‘”só‰ªAyQÉ+c&D'Vr¹vr ”>æ Šiâ<_—)Ç Y±NÙ¸®l ÕéáxU±žý\5X_JÒ’uµÕÄú)Fꘫ˜‘¬‹®5’uu|ͤ]t­I9Ø…Èÿ˜a™¬•´‹Òµ“öh¡%ío ÷—´«=[ªÓ[ÀÎðÚrÁ0¨ƒ®ˆìŸ†äÔŽØû&î–ƒ]crÇBºÃ`Ø]ÖÕAFĉŸ$]D*B'“tý”Úô*A1À®,R›^­•Ú4 ‘ÿE2q€l+JIE˜cÍ/V>“ÿ…aa(˜”¦§fS°«)M#°JEØd§{~1u›d1ó‹ÕÛ¤4Rd:bö"rÁ0¿˜ðMJÓ+b€]%KizµGkèÕSù`¸J–Ò”¾Ö„Œq—ŒðÉß“ ˆX'ÍŸ¼·ˆ¸‰2ñ“{½iÄ›ÊiIĈ¹\”‹óˆ{Ë-b.û‡ö ?ɺ‚çV\VÐ[þÔªQqÊ¢¦Is!y!ã‘—nÓ…˜rU¥``WE/QôߊpË$\A„+Â-“pÓ „„›^ò^$9U,b¶2ÑêF´å®L|\™„߈¯=;¾ù ܲ¾‹Æ,7s÷Ç+Ñ!—pÅJv`+‡B.3²ó)FšÓýñÒ‹#Îú…ÈE<¬­@ÖO7­Ü+—4§[!++‚.;í;¾m±ý UªÓú D].o®*Ù©bKW]nÊÄ·ÈV&ΉºÜU`bù+=U"FuEÐeòÞt´„¼·¦UºÓ~í‰WH튨Ë]¹ôzT)O#æ·#$^áÅ+¢.“xÅ udõi ¦`âXy-¨§Ü&/ '¼"æò,/Ò(ZºrÉQÃU·´§”âç}šš„§7¼"Èò÷Ò×ä¬áBV’.jÚJÒ‡J–³†ÝdýÙ¢Ç߈»LÒ{L]âÓÝãÅï_’Î2/—ò¦‘úôJSé;3?i$?Ý]€˜êâgcD^Ú¹GAäeÒÞâççØ4üd™Ô-±Õåªáê¸ä§WóvÒ%K~š§Û/ëãKÖ²•‰6'Â.ÇPWÁC¾N‡ä§çé Å{õ¾ CñÀ΋†ïM×RŸ^U¤\ƒbÈQCör¬èzÞCÑÀÜ·»TŸ^½ÞIy´VžNÛæ÷ jöç¹Mùi8/Ç”ü4'¶Y“oM?³ßüÙ~ç•Ù‚lþìÉtT;’éƒÌ÷]š’ž>ÈVÓ†rI|ºã3ÓÛ.;®ŽÊ3 O©O¯\Švæ÷% IÃ’úôòÏp&üUŸ™|I|z%s†«*iÎú´:…ygI]òͰCÌ€ ˽<+ß’o†â%YvÎ¥°$>}ÚTi_,‰O°ÿ‹!‘o†cq,ÉO·dˆ±<ÊÓœ-ùéYš·ä§g‘ÝrÍpÜõ‡óÝ’s=Ë-Ï çyo)PO¦‘c¼Ï@Þa+ú×yÏ·ü2œwiSúÖŸ÷kË-ƒÆý¶åQª|2œÕÉ$?=cÚ(¤Ù¡µ@lå°©Ôi+9Èe#˜‚]ˆä§g›ä§WÉ=/5ÝŸjƒš±«ö‘F•ž“ͤ?eQ£Ášƒ1’‹Æ)÷=@Ö§È·¿M ÙêKDH05m«iM¯Lt­ð«=}.ÒšžÆŒà;RÌÙ+›—…®®Nï¤[ϱHs¥‘Ð43ýL@ˆÜÖ=¸,gxHíž3 ù[Ï`­Z1ãíD€äÚî×Èž÷Û‡ÉÍžáYå]áB$5=ݪŒôuw•6æpQ¥4½ª¢s…«5;Y*ê+rзÂÍÂ#—·mMq¾N5¾Nc›D¦öi÷ŒðÈí™V˜½ˆ}®É»ÂƒÌx3TùÈa®×«ßaÞ$4=¯B›9Î5ò›´¦V%ò@|d¾…õ_¤<‰Mo`ó7í.Hö¯c m)Ä”‡V $7‰VÌ™Q›Ûé[ªT»¾å*Ö׃ØÓ£.¡)ΛH nã{¦&3 ÈT&±ˆŽ\rɹ‚U9?BtdRÞt„”‡¼ Ñ‘Çxèšš4af{Ššž$’ÃðÛ¹#ò°`!³BÒCÖ†èȃÀR1’™Zh©€Ìù¦¡‡ q’Â2Gn?™èbÁ¤Clä¡RŠÚ«h_WÕ™^5ií¼r­¨ÓËù%çT Îi "8rŸoššœ$H§¥ŠàÈUtÕÈR 5=NùY°?IyR3¥_”+8"' W‰LmÄ”:íËBš 8×?%2½ÒHc3Ö’)‘)c¿Y ÷e#f¶E/ 'Ó’ÆRëmÞ’ÄÔB^ÄÔ)ÍK^Nû–$¦BB ³=½Zò´ >—ô¥ñsÛAÝ’ÆFØJKâÒ«µû—ðµ“ð@Œ’¯«%ò²4ì/ ·D‚pÑ»¥-½ÒH[j3Ö°-Ì…H[z•£p_6c-Ùô²à1{õÛêÈÇ‚Mç":ògo!±|æÃÞr³`3Ô-iéUŽä/W.9Z¸J–´ôtÁäiá”l’–^HIÖwëV“õƒìwš0ùZ°ÐÇ">²k`ÎËlòµp&“²ôL¡6rrÑdmÁ\i¤,=K…­œ\4[û—Ò3³˜d¥9y›¼-\õXNçÜñ"@r«÷2d?¹ ¹ß³,Â!õÏ$‹øÈåyu¼œ#>r÷òŸ¡„Éä|ÉÞ@€äO¹l#b$“ó%Ûˆ+`xkÃù\°%S.ž· H29_ÿffO1E¢RÛ2$™´o™@H»éñ"J2i¿‘­\´%Ù?ØX¸)CPäO¹¬Bâ¥zE”äb?ÀRDI&í§\IJ¯4ò¼p!’”^-VÜ/ ,b%åÒð*’”¤*î×éC¥¤ޱ \¥Æg­@À{ùB`‹hÉS¹¸à!Z2x‘鹊fmÄKnÊ¥Zù i¦ÚCMéPS ¤Í@Æ|Š`Ü™Wd)—^J÷ …r‰JÏ3m•žgÚäƒÁBFàÉí'×óŸü9!zrûɵÅüI#Ì™MªÒóæ4Ë1¯±ÚåƒÁBÄ do: v:ÑéƒáJRsÄ«}½É°Í^õ–#>Šéâ=‹éI»|¢½ÄO³gœtª`®ÑÕ©'½Æ@_¿£½oöÙã>€°ªñ‰ò³ò`è/ \ªAù3"š§GÉÁ®á6¨…ñ‚-R~Êiì§®&ÎOªJQŽ©… þõ"s¾Èé§œ)ÖO›—X¯´mØ~€-Ú0±2z Sq«ÊU™hxÙÊ¥j±ž™5irjÒÎÊgKÖUù¤¨ˆÖÂÙÅú©ŠNî4C¬‡Dˆ "<"Cå±ßr–X?¹–X?í¡ªôEöô„æ{ÇÅúr¸k쬒Ã]“ îQìgp¯*âoäg¸¯–Ãý öNî«‹øœòÖó¹ü¬!æù¬Öí¹b­)Úsn]Ô”á>ˆýT´Eû§.B)k°ÇÏ9ž>îOœgEûËùE‹Ê.â<ÙÛEœŸ\Uœg7%¥/2ruq~ê꿜C§°Ÿ©j\òµTG]+9’—8OröŽ9&~®÷ánç§jKÎU‘ÑÃE©QRzÍ¿V~i·š´ë‰ÛYMõ4aBgõ²–´ èɺ… -÷7¬k½°™¬GŠJïÊW²M^9Ò•i‹ô¸°¼ÍdgEDT®Ï¼sòGHåà=rñVB*‡µ ´¤=`]]1¸ƒÔÈ.oÕC¤ŸŠ†H? >ËiQÉ+¬º™Ï«ˆ Êµü"kÜOA•Ûó†±ç½BTåÑŸrJIÚU{)¿´—³žŽÈz U„UnÏ* Ä Kë1Ù"ªr)÷" dއæ2eÝž\SÄkuBTå6îuȶ{ AXåQ¸†TõÁÄ{“byoR7!²rU®iïú®ÀÊM™¸™b…iŠŠ©Zî›ön­LÚ»NVL-r¦º(2½Kî¢ýÔ>D{×™-S ÙÏ:Eû©|iÁï:2û‹lÑ~ªÚ¢ý”câ=Ù1™YYLûD{ö³Ñž-nE{Š®sq„V®ÊE»Hðišx¿‘à]Mn]¼w¯#¶rðµ—'Ýi¦üYïÓj+yïX+ßâ=‡A³ä=*·ä]¹ú—¼‹ÂþÉ¾ÍætJM¯rzñCÛ„W&ñqu Á”I|\92ö‹tW×€ñ%Lñ½böKËý˜rqÏÀÊä{Ç$9L|Çu7 ä{Çd;?ñ½e!YÊ¥6Ï"Âod+· ˆ¬LÂMÚ ÄQþ”‹Ö8~ruž½˜]„Ÿ\C„ï˜Ççç'ÍÔ‚ÚwRþ~r-1ZèÒ/&~¯þraâ=“˜hÏb×—´‹œõiÁ_Ú> ®rЮG³ªŒÛ¬jÕ¤=–´G]M´›6Aˆ«ÜMÈkˆvÓ„¼†Ì,ÓåT„U.ÊD©õò·–X?i–XOþÖNÖõ–%ë+€!¹ÝBTåòVµ?ÑnºŒ¨ÊUUñÚ{º¹©:}§> Ptz üUxïRÈTÍZÛ4pí®Ybš¶P\«½·»’Psz'¡†Â ŽPsêNäk KÍÓâµé‡áÎEÑ)ͼFG W‹ªS”9ØÈô™Â?µçß@v}ƒ#Óç=..dŒl CÜ¥¥UˆÇGpU±µ@r5m5 |{þM+~A€Á¤läú?{øöüâ~G‡”áÉó¿`•Àß÷{t*Åw~2êm~Áu©\¿¦æW–×Äþókáâ¯ú-5¿š¿ñM× ê&B$¸K‹-À'D÷.uûTK·.ÀcÏîp‡‘€s8Hr1V_OpÞ|h©ÿÑÏW×OPï®Õ>•êÜÃSó9÷"h*ÄOäÜã·áð{Iš_R£gQ%ñkÞtñºápˆK›ßQs¿À-‘¿‡ìž•—ÚçwÔÜ umüÍ(îŽûS.sÆáÈœaWr YH~=ÿ‡ãûÆNu¿£æ1è/ÕbÁYÏx‚q߀rà¨JâÛKÒÉ1š‚¯kM¥ú5T³„ §üÛ˜,èìu÷j©Œ@À¸û T[ü0ÎCyU ÄËCxŒs ~IÍCÝõ(G´>™á—Ô¸pÊ?mw„1yRCbð–bp2È(Üzˆõ`£lòàq⬮ôˆ'Û”Æ?ß#(®š#ÀËi«÷˜i·ÇHÀÇ>-[›wÓVDusl¯UWàÅÅÒY›säㆱÀ‰'^5|;Ö\¶ýn>S·œíb4Í Ög»LîÏÝ¥f¹Ü(@‰ ÷q3JD Û/§-º{t€Ÿê¡íÐ3‚Êý¯&W1¿œ6é Søžt¼éo§Mºë‚ý”:ê‚1J¤IAK¤eÉün·ë‘T7o§Aé¤Áj¼ž[kñAAà`ÆëiP‰E‹¹Spõ™jò( .k‹ß :™gƯôPá~9 ¢@½ùÆËiÊ0I€®‘1åáÅsY[à³Û„ÙµarРðd¤wøìå]G\8å]‡³N<ò®fGþ q(h;3H‚kuï¦AÜw ØšAMÜÕ<I€J¹@œñ*×Ã><ñõ ¦ë7qÊ«îdøðtÊ‹î¼xìDUeesx? ÂuŽ·¹<“}ç¥Dk ÏÛ\Î_qÎ?)Ü \x‚óOúЇÎù³çü“¿Àc'8ÿ¾,ÅCR–Aëþ;ññ W.j†ßñÃ{'wk×Ìa-~zÜl¸éÕ¸Ú²v  zì%ø½4¿C30GFôäÏþï‹f8éÄ'3\ðQ¹4¾ n}Bx5 W‰J"Lû%Ž„Ê«ic)T£#XÎq?ŠS/¼vCË\t‚iÜÍj€hÜïZJâ7ÓˆèÊ›i¸H&®+## »‚.MÝ(ð؉0®µ}j o¦áºœí@ø¯ÆÛܾQ ÀÙž%Æ_ó[i¸ê—¿íaÑÖÆKic(.Ñâ ÂT…ŸÎ)¤²­“ê&|(Ò”†·ÒO%…8×°3øZ9†¢íxåü½â•4xÑ»µ6)Ç¡ÞHŸvíœñï ócóþ¶»Dakp¦ *Ü"Àý&–o÷²ÂѱøÎZ´@l¿@ün~j‡ñ»y ˆž,®ÕÐ;°÷îe4—m^Fëyf_›…€VþÍUÒ}Û¨\^FƒûÍ¢›ŸÚá4GÃhó6Zß:÷wŒ÷½cvÛ {Ð=N0ã…4z¸Æ i}džÎ7«2É0ÞH»Óp±tÏ@53"ZŒ7Ò€hµ0^âîT Yh‰Ã÷fmD4ŽŒÒÜO_dã…´îWà—v_ÄYß-¬_È·å™j¼tÆ iî{i²P[Qàx“œž4;BÎ%Ë)p¼I΋ÞxÚ$éó82•‹ÆEç[âHŸlå*x#­3Þµ眯„#¼’v§áÊy§á•4x³Zj2¯¤+'}iË÷›ÎùŠÙˆ5"[½2’¾x•¤ÀÙæ§L¤ˆ“~2ÞH‰H_q )+g}é:B÷ÍA€ö|m:éy d*“Hç¼^:  Ù•ˆÊ"]×!é…‚–ç›$½ÈŽ‚«ÍÏs}ÙÍ-Òuõ²ÀÕ&Iÿ4Ú€8éS7b œo:ëâ¬3¤¼# |й9Â;i@Æ ÄiŸK/¼o:í3>lYö¦aè œ—€8ï3N(á}sà›W›Å3 lqÞ±ààî>cfâ´Ï8Ü‚ïMç}ö°x<—Ü…øÞž«DÏo¥Ñm }Ч¬øÚtÞ§6kö À©Î7›ý"Ö^¤‰ö8~ƒ·MÒ®¯ŽÌF¤¨.F>pï„5§}è£té4WK) •ÆËi}ì §1òA[/_ãÝ´;‰ýó±å°…pŸï›Nû˜Arç§v ¦4¼›ä»iîܱâ´ØÌÂ×f­DZK™Š2ñn÷‹8ícÄÄÔù©Ý=K’öÎÛiîzrâ´ e üo’ö¦/Ñ.éLÿÍæ¹â„ˆ "Uå˜h¯"y|b=Îãö8î…·Í¢LzzÜ·ñ_U´—x4ƒ—Ón¤‰vI½í¤=מÁíî” Ž!ÚKü\?Y´˜Ž\Џ›õÎnõ€7Ó€hôÞîv¤#’ËÕà§v$¡md)­¼ncõXf&C¸3TR3y7 ˆ¦éQS×½.N ƒˆžÂäí4wźqÎûŒ xj=½rñvš»tU{òÃN¤óT‘²ñ¿÷àtòvZï-ºþ‡8ï½§“ÛÝ+턼çR3M¼ÇÙ< òŸ9LÏ¥02¾ ùŠßõý§ó€Æî–°š5eÒÈ^UÄËE#¢Å{ñvÚ‹LåÒÐæyÑ“fкí¹òÉÍL‹÷Ó0!™Òðž7©Žò~Ú‹ æâO#ëmÇrµx9­79÷¡ fDhpqÖÛŠ™Š'ÒœcY×|Ö³y9 ˆ&”ÍËi>{[ N{›1Ål^NsŸË#ý“‹—Óz“ï/·Ÿö&aŽ8í²H{뱊l^NóuŠx3àYD{‹ö\R·ÑÀm58´O´×0ìí%&ecÀ_ZK d¾‡VÅ| ž­ŠùƒðrZo%ÞëbþÔÞÅ|œGÃ'™¯±B#tÍã6E{vÓ¦h?…,Ñ~-ÚåEÔ‘)*4xŒ7ÓâøÌ5x;íjá¨bþ¤©b>¾ûკÿbnM̤‹ùÐâ³¾ð\}CÌŸ4¼žDkÖ˜d¾XŒ°Áëi½„ýßœÎ|‰M1^ÄÈ|‘ïGÖ›kò~šŸ—ô@Ö›kò~Z/ñµ ˆ3O¯ŽT2_B{6¨xrñ†šŸßÕÉ @ø•0€œçúÔÆ=èü,Ä™/ñÉŸ7ù²bI˜ |àçI%©\´Üý3©réý¢JòÉeb^R8é$ñKö"ÞPóH2;U^¤Šø /£9¢ `µ$¾&Ä‹°Å©kˆø$l$žO}Íä]Ïoñ†­ß‹WÔ^ä‡÷µy_–¼–¼+׿µN/Bv¿¸‹h¿7pÏøÚŒ‚pus7Ñž½¢Dæ&y÷¤]½Ú¼¡v=š=D{öjÑ®O·ðßéë~™ êâ²_ýÌ7ƒ ¸¢·²•I3ê6±>c®ÞZUË kÁxCͱ*ã 5 Ü !ë±Ù†¿Îª\š‹¬Šõ®³M8ñ$í=Ökã 5œ kæ±.Þ[¼×6Ä{!Q}%¢2B§ã!K™ô°l‰öÔ´°Â$UÁ[¼—^T`ñ¤{2;¾ÄP«”'­º80 q!ñUƒˆ­7MñUç±Êx9¢xFÒÀÀ†ÄËa%7?¹†ˆ A|#0“÷H²’w’ d>BÄG“·ˆañäM–§dêM¯\åñYr)"¾jº2ûCa©">[X\?“Ã5Lý-—WÔzQÞ¯ž£<¯ ѧ0@溇¼xÖ— *éŸr(8ò­@¬<ƒ§ð¢šç"@Éé]¹‰ö¢)^µ†ëçU µ©@¸îÁ£gS¦®bŒ?U„‰ïê§µ=™«_Ð-ªô4çÔ’tÓ2†/ÏþfªIw ”¦ž·Ž;Ë3Vk—õz’Œà‘fÄ×ð¨3éæ>ˆ«iQuÝú½“m.x@¦‘ ¡–æ«2ìDÚ'²³Z”'d©REw“Œ Èb.ϸ€V•‰ @–Òðƒxv\öÐxUÜÂÿ¤[ýª[aZf“H–z¼Hw•E„+t­ÿ"6ß鮲 ળ´§]*šÓà^‚ðHR’pÕ„ûÈ/áˆ=/@—&õ¼G½'å‘FËf.Mêy©q#ù}ºd4ç=çýkTáFòûÆöÊf{iRÏ,Ô-&¦ŸÚ±wŽ…Œç 9ª¬¨|ÿ†$©ÒÈø ìöÖ$ ÍÇðvسv RÏ;;fN)Qîü÷¾ùc唢wv¬$\yvòm‰ØO&KÂÅÝ”|æ<·ù%ãšàf‘•OrjÑÌ1«,×3S‚Ô3©Ï”G¹=)×<9{RÎ.ÌŒG ig®R¤G=rÎöë—ò)9jÚ@~©QÓ²[N;ß}IŒz!%íÖÈ$1j@@æk§¬&Ês_ÒÎ\Hç9¨W—!•=_ãg˜¯)Ó5GÀšÉ¹Þ°µ‚t ‰µ’ô(f'éQÌÒõ¤–´¨ù,·¤¨'Éþþ½OnŸ•s°æ3„2öií®gVQ)M”ç”¶%D=óà–õJ#ÑÌÂ[BÔÓÉ=Ey޾=“òh „¨W¯¶8ÏYbïŸq¾µxæèÛvLWìˉE…˜„3RÒtÕ8²šã\æ"vÏ02ÉPO{­%ézß­ÿRÖsjÑÛmC¤ç¨±wTÙÌy%²,1žüÚJÆ5Dl'ãâ×vÚRQ²4¨±®À9ç×~€±@ Ô|Ø@Ö3 à¬óã@¶½HK[jªœþ3ÊŒg!„wÎò # kÞ *\<”ïO"Ô«+ÇytB³òT©±x†AÏœå1=€ÈTbEb™´q€lY9Ë3Ky¬Z8élõžZÏ™E¯wiS"éiÎG@Æ31»§“_`=f |tÖgвŸI¬IxzõÒr›ÆU .:‡½HÉš0ßI¢Kwz îõp®\Ê|UǸ@‚tQLï^O®‘#]ƒ¶3(Òðf¾äý ?súüô06J¯ºFMâyŸœA¼fðÑ’yMáCòÓ«. eÎ0’Ÿæ#‰=c&ñÑ©O¯4+‰×È;‰?È~ÇÓ°$^˜_Žw®Ú@Æx:1K¯ål–$^oɬI<Í ±ÖG©OÏœ-7ô$žôL©OËs¤qMž¿¼Ï™¼GÁ+WûÈ%õé…ì4i#—ä§WÉOOšõ¥Q{=šWɉFã`•4k5 —$¨çX-ÍZ½KKÔ3.—¤2g°¬.âó½]’ æ± 8¢PåSK~šk%ñQÌʯñ´vN5Ñ)P¯\&âoÄöƒìOĤÈÌŠeb—ð‘¤Ê°Í^m PÏü´%@=ÝÚ-yW“wOÞÅòâ=ØÙ# --~[ ÔYöL©{åDK*sÖÞiÛF·,yšxÏ’íË…ÿ »>µ"Þ““ õJSïZÒ®ÊMJ™Ó@ëÉ{Óei% kÚ6dÞ¦a¡ËÄVòM^¹…¶s¼'ð3ÜÍráL–¼;‡lý© :K}’HšåÚWsSñ•@‚u>#qw1-×}¾4öõ$}¨n e$XDÔœS€Äž"ÒH€z¥Y¹©d§¹eêÖYW9{™Ï¢`EÔy§w+E´ÇFˆÅñú³w¶"¥LÝ™ú ޲•.ÞÃಕ‹G#V"!÷Ób÷ÅÌœÝMÍYâ=¬ ±—ëʵÏö9€5Þ>H}z,&Ú©_nŸ¹HX•ü4ç ?´×šƒ]«ÖíZv=áÚr°se±Ê ×P®òÚpÆ•úôBfN2s²Ë›FòÓÙÏÔd5VÕ˜•áf1ös–Èxæ k’Ÿæ& Hì.¸o±&ýé•KÔÜX«iéªöÖ’x½Æ­‰øxi[ÿ1t¬}OŒpÙž5 H¯W½Í$žv›µ•†®0sËÚ–@éFÂÜjލgä6K;W#·K€zO/9ÞUr/ÇÜR PÏ@íU¼Ÿ4-í­H#ê…tñ~ PÓ¼GÉ3í­È5“x½&}%ñ"µ¯ÜLk¤v)P/ÄrÄk\v˯=+C ÔX÷¬z/Qp1ÚÞ¡;Š”J±ÅµQÓÜŠ\-<? ±Ö` æ" $<7ó6Fn§Õ­!ê…ÌðÑ-ùo8Ý’õ[´ŸKzµÆò #Zcin©çóKÚÕ«YD{ò5å½!—lJzØ™òÞp!R ^å´ä]mž=yW›g,¬ÑÑÉH w&yo¸ª’õjàÊs£ƒØ;;M P¯n™[±ä]ô¬/‰?È|NLlIzæØU’ø@jN4šzV;ÇGHعzo–$¨²Ê3Í­‘KP¤‘õ¼‘k¦¡+KdI„z¥‘õ¬JKþÎr·öïL³Lò¼ÙïÒº¿ÜQ«äýå#¡f]»þÎ4»ÊæJ‹f‡5mˆÝÄ|š"»çÎ.r…õÔ5~vv¶g2¯§³g2È:–n"û}Ê{K»+×Þ¹iqÛ–ÄëÚ—¦®è±P¢æÔlEÄßHììôH­ž£ ÄÞÇeÒ¢^u…õ”ÜÓØ• c¡E½‘ý>d›iìF¿$F}ñ.þ&1ê™/MbÔ+ýo–Ä£9õû>ñ®ÕÄ‘‡ø?¤$ñT)˜ôn;²ú‹„ U“˜#Ï&ã Eªšìˆ½ itE& R¯æLñ~ÒHP£yÅÝ/*þ´bI{ Xgø†"Ø»SåKÖ?Ö]ŠX×tIã×·‹? &ëj_‘‡«à£jùûCºX?ˉCÌùÈë:öwd+ƒv|%©§œ™ê¨}%í :ñ•P¤ž6ï¤]Ïœ7ÇÂB’š—œï—ä)×T€ŸR2iêþCjº‘¦¾ÓûÒÞã#GÂàbP¶¯öœd(ˆýäùNâ†&õFbGíY)‹4K´ç(­ûÝb8bë!™úϲ^¿ö%í Ú50ZIÚ5[ÈRs`Ð-DÉMŽpéÿOík¡LýOÍýëï7$6ºŠÿ„2õS¬ k¿iB™ªëúŽx}°ŠOšP¦Ò󫳿™B˜zZÂÔlNÿÒÒe˜±¯‡2õ E¼çKÒkZº‘&¤©'MË­] hГõ9±÷ ÷§æóì3g™ƒÌ÷Åê¡NÍñÕWZºzûþ÷Sp¨Sbiè _Îí5€ùN£äö"2•ÜPk¡¥{LŽš£]í-G»’ôÇÌu`>3çIy4f¤•HhSOÕ3­ÜH³’t=†±%n:ÍÛIºV§aIº^óa9Éh*˜_.ùšRæ¨~¤k–´rYÌ”>U憳_fÂÒÒÒÒ¼9Û¿ ‹óSLèSOÕ©OL3ÅMm2o‰Ü²r/½ˆ³£¥bŽ>Õv &£“áÔ¾i© fȵo…HU²G¦r1Ø·Jꛦ²nÑ‘ ÷ !ÄŽ’›4eÒ9ÿ!’©NÍ/+Tª3æ—%¡kvDÀ§L3E|{²÷ÛÍ•ê&þÞÉyó§G)´Y;€õÖ³C¥š™ö—”«Ó[.®\5)WëèF³Ä‘ãÐ^E™#Á¸žÁ–‡CÄî))¿{$ã]Í‘‡ ÎYyBsú^ÿÞ‡°Cªz2ÉÕIRÕ†}yýDk™}yÿ$IUg,VÄzÖd5•ï$VãÆV 8Cú©)¤ª+Öìîë1ˆ¼7Ä5GâÊç›qãGö‚…RU] ª~î¸a?ãz•æ*ÜfÖõ ²‰B4š<ˆr¿ÓxÔçS‹½e£8KzhÚ~ý½¾÷ªª‡˜%À9ȸêŽç $º~# V„£ÝÏ«CW6W d>yÂMƒœ§9÷dټ˦«´lÝê‘Ô©q_¹–mM\h®µ®½ˆ¤©²tãš&bª¹„̃p¢ã*·‡gêÊÄ1RŠ´©º¸íÀX@i*Ã-pmM\ ÿC¦ØÎ.JS¯$Ktënµ#qa¯\)”¦^IÂ=é[ÒÔSS¥4õpY¿ä[åV)kNÁµ¾YÂ9Cã¹ÖÒ’oU)«¹ÉRd¯ç‘ÔðÍ ëõˆt©¥ËL2ô”h •Îä×À‘Õ^$¼3Äîԥžß’Õ\™ÏBu©'I+I¸ˆ`ܲ{ 5 SOsÛqÌÀª›t©§×­ÿüß§ )jN㟪jÈÌÑÍÈÚ@bx²þ©Ø­Rv²Iv²Í9q΂m+Û*§?lw©i—½$ß ¾Õï^ƒoqÙ%¦9­é-ùÖ3éý_ûöË^Ixó>×> ï+ Æ­oÃÃ)T:š«‹„«¢ñýïñ%áz0ÿõ²0ªø–÷Gö3FK¾õFK¾õ ‡D4Wš‘„GšpÅ b¹D†kv»þ>F¬Fc¿ÙIuÔ -j”`ÿÞVNéfô÷)j±`ÎB–“Œž²_S*Ô«ÔöOþSxÂ`½]›=Yî#¹aÑÊ:¥A}›oÁò¼0´Õ(sý’H¸¯áïõ;e/ÉO/„Ϋ²,ÉŽb%“9­Ûò¸¥l‰OÏL´årá¼¥>=sÆ–ú4¼åráÞÉkwžïÇ–Ã…ÓÞ-Ì.{$ãQŽÄ§gaÚ+H"seÚÉx àvvóÈÝBø rÄæ³†ÛŒ+“•d\YIÆ©Á¸¸³šŒ"…ÌyLÖþ½kŠõ$<’Œd\\™”§2“óhÍLΣœõ˹­ä<¹\¸Ú.Ú’.³$ÝÉ©ß÷r`ßYêWÒn"Ã@ìÍSƒrý–³…|Ø@曥á«°ëÝŸú >â§½Ÿ1¡ðç¢,ça ¤:¦¾úíœOV d=sjý¤5Í ˆµ)RŨê"¡i¾Œ@bG ‹„¦²ìEZR½F A5‡a-=¹V[†–ð?ç³² 2r½€ýƒ¬ :¸+ô±…†'¶˜u ÷{–û$©¹Nµõ£òK¥Ö’L«ŒZ’éÈRƒi®ˆü)“%2Û‹HS&¿d:B®åæ¬"$rûÉ+åI#qé•F®’%. —j1‘+6Xí-XÚÒ+d0iÒ–^ˆ´¥áŽQŠ pŒ¸ÈU™¶BÎ嘰".r#0JÖÞL]¬Ÿ‚%- _rŽLåâ±!â"—Ÿöͤ]ä´õK{[¹¢ël;iŸªËbŒk´X33I—´ô þ¥¥áÕË3£ô"Îõ³ær®×¢KUš³Voi F‰JÏDÖ%*½ÒŒÏL ÀêÛ²™;‚­ªû !‘çûfôfê…¬ Â÷Ú¡É~¬UÄD¶)ɶš7Š–ó°Ì9è>Èz[8ZŽr=ýÑ~Gù…3®Fx_£cC†=ƒqÈǃ¬wè i_®Ê¥)½ªÚ¿Ã<*ŠB$(=c|~¿c|ÒÍNP8#LéIÏ7åfAn>+#“óÂñÚÉ#/ E1*"#eª=¥WYc÷’ç›FzÒ«dùY¸J–ž4\R:2~ê’§…Y?¹LœŸ’åká´pÅÒ™ip7Ùž iIPzJ^ŠV–ލ¬§[«%íjàjI{ ½\KPzßI|4y&ñÑÀI×Õœ•ÄÛ „ÄËiEŒdKâ#—¥áw´"LrQ.ž³YòªËÓeÄI&ñö¯@ÞæåÊ£0`á¶"Nò¼½ VÄI&í72USQÉÒ“ÓQ'ò.Ã’éÛù ƒpKO¾‚qÞë'Ñ’‹¼Ȫ/"¯ ²U×$_pU¤\}bÊ%+Ê$( ȱ’÷Óf“ ô*G‚ÒS»IôBÙƒ#=};G{ ìª]¾€žô*X±ÀµsE¸äVß‚µ”^iv¯µÇ¤' çÓŽ„SmZnˆ—,§Úñs=!Z2Y/ñsï7AMÊbσB¬äñ´ Ñ’ËíâÚ‘9ßrÆå@v}II£yÒ‘†îŠPÉ£¾ˆ”¤T£™ÊÅU±’k{,%ix¯ˆ•^Ìië!42 ¿.¿æÁ’Ë9­" K-äù ¢%‡óƒ,{)Ik‘-„´Ÿ’%% í1“KýEH»¼¼WÄM®êײ@¶rq-Gää6ßrvúÄÒ<aÄN&óM392/ÿñ±“éÅ\¾êÙÊÅï6ˆÜ”Ëf n×bƒÀ6WII†Ú4µ¡ûøS•”¤W倡*UEøäþÓ@)^jÓ2‚ðÉÝ^DJÒ+×Nâ¹!~r… ïÚ—´ÏÈã¶¿"ˆò¨OÝM’ŠVÓk¿mòÀ1!ëýŸJÑ‚Z»–4 Vßb¤"­]KÂ(ëz0MNÝÚ‘•¬$X×shR‘^uíd=rY²Î~ö/Ipa4žÇÐå†áTÕKFKP1òÂpjê‘^ˆÕ®¥•¿ñPÚ%"MJûHÖ÷ ÄÛ:ôm!•]g¤€X}JYIºÅ;O.Œ~Z'éyšÝ’s=©!éÉ5¾ä\ïÐ(ɹ^Å!iíR{™ª‹¦b*µpX ûéÕèÔvÝÀÿßÞ»ôJ“]gzóúgÖ_¨RľoX†- a m5a$ (V‰d£Š%K&üï;ßËZ‘¢döÌQ_>'W^ÞŒxw\Öe¯gLOÍu+C•Cs ÚGjn-úLÑ/ò¡Q0X¹®Ço×WªQ;e÷÷N!½ôGên•Ç™ºû•‡]ï>ÜŠáöÊ%u÷Ö?ªçÅä¯5œCzý6£åƤçÆîb8‡´ +˜¯\ûÃ’‡»1\ ˜é1ñ»v¬±Òd‚8‡ôöybxIîGóHå­Ø'‚yˆYáàz’æáT3öþ|ëk˜®P8¿‘NT9¬½“õöF\r{ÎJÙã½VÎa‹çÄH°ëk:¡4æ°Îò[": æüA})ŸórFaÑ9&G>:J缜Öx>Iõd*Ï—#ѯ¡Çó/¥úòI0HÌ¿Ó'®Î'Iv…ã8ýN{‰ùwñ2±¨^ω‰`‰‰`w²Öóub"X>§9£ôAúz|Ïæ¹%1kdZ‹é¨˜æ™}$:ÐõhéÂa³oQ1lûð cl¥ûEzêQ=uסGæ:J‡{½ÛDt†A»õí½œ[z{•Êë$Ó‚Ïù|w§—^¤9yð"kÞ·Œî`× w÷c¸9Éôú8½¦ðy¾·>žÓ|Àu½—óL¯¯Þû»ðÝ.Áº3McÖ$Ép”ƒ”hŠ<¿ d÷ÑwÊ®£ã6Ž·‡JVº^d¸ÃõQ†MoÏq7†‘æ×+;Óôö·c(Û'ºÜ¥ ]>¥jM^õÄÏ‚¡Ëe>¤nÇp{eg›Þ¢œmZ] „™Ë<ÚŠ±¥3—©y=}° BÍë+Ôwºí`5ж0o9D×^†yËÍBó %5ׯ²î¦-×ÇβçÝ80m¹?ŸâÙ%·wrÞi~ [o¹ïºÝˆÓOsÛÙðåØÌqÏ‹m`œx:¹æAæ||äSy¨idûbåÏQËçÇ5]›`8HG¤˜´¬©ÎùpÝ·*ŒY–â5òD2\ÌXîº×‚ÊG{'±…QZM 9€é ŽaIJÔnêr@¸_1e¹{gÒÁ*¦,ó Gé…‹óP¯·*žüU›.0e™ÇUµù2<ï?ÔæcALYnóù%¢>€än>FÁeV!gYOàÙ_· ·\¸=G™¨·ìÙ_·§8«æ"U™¨µûFÀtŽ70a¹úãéÈd øE<ú«F}æ+ŽÑ‘ˆ$¿^ש¨5jÐ@æ[”2kªG¢ì7âÙ_7âv •Â&¼ûP‡×=ÌX–æÃëÈzç¢>ªêŒ}²)µÎØû›‡Õ{`óð’ê¢/LX.б£5÷Z¸½ŠknÏQ*ê ¸ÕÂ-È©¨u†?àÜàù·Z¸=Å™¨·V«…[QoOq"jáäm?Cœ…z©Ð=ø+Uèî³PWøPwªVm<”Ø;\¥+ µFÝf(Kìë)n²p{ŽòPkT»L½“á0T™kL;ÂUºRQëví+f*SíÛSœÚŸÑxÿëî°ÐŽØ÷»—ÍvøÄ#•ëóuÝ`ázÊpBM;Âe¸#µÃµ§<êó žùõ óñá†SQdÍç ·Ü2 §¢ÞžÒSp«9FAã]ðáî u;- Ä‚;Æ™4×ï8œzýÖCù¨5*1Iù|nÓù¨Õóð &){ÃÔñÀjOâŒÔkËœõíanÝ^0§ÓhêrâÈ|§£Þ‚<ðK]HÆ·íùiZ=Ï‘$ôŽo½Þôž+õ¶ºs§Þ^§sh®ç¬#¿Èž÷e!¸;æÚx—sQoD¹¨×o¿ÜRáz•–›wÄôççp?…K„5Þå^öuýòk†™„,˹37¢v ·7Þ)w<Åþ®ç GÑCÊ}¤ÜÚgÊ ÔöÇÛ%ÕŽ—)©¶¿÷vúÌí½[ îÝz»ŸB;\“ÙÉõ¬ØÑF î=ŸoÜÎ8&Øî¥pE8õ2²½ÂN|8²:ó ËAºò‚©ÉíþF‘,;¹æˆ5°-˜™|¾=žÑaÄ8<竾ʲnó’[}~'ÍÜbœƒzû(#ÅÖ7óIœ4s‹š©v¼—)\g?_cëxµEÅ2†%ŸãÌ'p…ëO§ ¦Rg µu,°££4ÌJ–ÚÅ弘•rï¡÷öë:õöÂj¡pN@}ý¤ 7àüÓÆ w“1žÄù§­øÈdÕÇW(î¢p=§8ÿùßžöu½pq…Ƽ]ƒ®ÏWÜDAmcLÖx>ÇÙ2²ß¢zŠ®cQLJ¦èÕg«ZÐ]òAÉÒ¼úšÈÐ!×(^1d¿©…BóÜð‚1É¡¹qA†ƒtz1ÉåþYꙊGŒ3en1%÷w¬5%·2µ½K^zz{NOÍã½zjÄ©§·ww…ë‹W§ž^âTgË´¨Í у8õ´E•Ó¨øÕšO¦1)™·ÌZó²¤ã ŒJ¦êzã‹fóáÈp„ÔN¡EÀ29üOûº>ZsÎi‹*.ŒIîõ5|Ìz½²“NoÄ¿®O㎠·/íœÓÙÒÁ Æ$óæÁ%CwÎéÕÝUá’¢Ÿ©¸v¹Ÿ¯ã® -J'@$ùEª%÷A?F%ón™„î¬Ó[DÍã{jî¯ÔGj~‘ýι½ÌJÉ/2Þ¾Q¬×§Ù>ŽÊ/0ŽÔܯ3ŽÔܯ3ÜVáå´Ó% Ã弄)ŒI.ýù§ÞžãÖ ×7-7ó*/Aeòó{ ·V¸~ß1rSo1¿}ª-œäúü^Û3¿Úð¹6%·ú|'ÆpƼdÉ~'ÓQ~+·\hQâ4ç›jÍ%ñد¶|| ²¥n9˜<¥4 L–ðw2÷“8ßôú€§[/ä<sþº½·;/\Ÿøt¶éƒÌòøž§³Mo¯ãlÓqó…Û묔=¾ƒgµåb¥yºûB[>ªœ§³MÛòQå,žýu=§8Û–zåâ´˜¶|g·_hۇ阜,Ý]ƒ…ÁÉ’ý†c†_×¹¦©9&TÇGÚàŠsMûáµuçš>HÏ×qZ̷̃(7`èQIBÝ»ßzëx¶G©F'Sô•4 }?‰0ô¨­™Õ¹¦ý´Íêá_=ªmfuNL?½ ÎêdÓ¡è×W¨N6½¾Bu²i?¼ZÎê =ÊŒ0@9dçxø×í½Ü‚áFœlzûÌΉ¹éãdÓ[ÔNÙý^íHÙýyš“M{Ta†r(¯Ek6wa¸Þ«•TÞO©:¬½dn5…÷OÑZ Ïi)¼¿Vë)|¼¹‡]?rsNÌíuœkz}÷c¸½¹Õ~z¡›Í¹¦ê'Jâ~ =’Ñ15YºßIïOâ– =ÍA¤{í`2mDºWe`rs²cA${ ßéÎ6í5¼©{ö׃ GÙ›º×ÔÛsÜ–áög›öîÞmz#nÍ€Bj'›öæ  Ò½ùzf)—ÚA–£lƒÃÝzäâbtòQžÏq²é¸=C~œá\Ó xð×íÓ¸9CoaÓ£§ì–b81æö§šÞÈLÙýc™²qªibå­I—ä0O™[²ÛÅts†kÓ™Î4}±žÄÝd½Eyò×õÑÏÈQº˜‡yʽ?6îÙss÷N6½$œ#7we•ƒÌç68lz‹š)¼·¸¹Rø N6½~Rô4ê×YN6½ž³ŽÜÞýy–û3\ŸgïÛû*¹½q²éí•k*¯ÓRùø<-•çte$iĉÉ~û„#7øx÷™ÊÇëÌT>Èzßä×ÊMÞGËé¦=J?@¤|$ºc²ró.©̘¬|:ªýœlÚ»;²ƒH÷Ìã­>âc;Ù´w>Ædeé‰É˜¬¬¥ÆÃá¯kÛ£¿zä ƒðîNdLV–èw²åågǪz½ÎV"˜Z?› <Þ`¶rñ—Ò‘ˆD¯€áÊ=>3ÈîÏçxDÉ8ÕôöÊžýÕ##Õy˜+qðÙwù51Y¹úKµd¯'‰55«1ZYš/Ÿê€ Gmñ¥¼¤)È ÓQͯãLSõ¼6‘ì‘åŠùʼÏÓ˜‹ñÊÇz=2l1]¹øÎd®'q£†ëÓœN5½>ÍéÉ_×÷a=ss¿ˆŽqóóÔ’›»7žZRx«QknîV£:ÙôöÊîÓp#=•WîÊRÊ= ºOÄîñ*3u÷vÂéí9+u·:u§îÞÜëNÝ­i;RwG5wj¸gœÞ¢Ü¬áFœqÚ§Â1T9t·Ê¸)ôü^­¥îþ^­½ëÞܬáú[Ï->ÈÈ->ˆ3Noï5Swÿm¥ðÞæÚz7œ9œÏo±Sy“~¤òAÎTÞúô3•ç”TÞ¿N÷„’qÞ)T °ìÔ:ýÁ”å>ˆóNûôYHwÔé×qÞéµ–tOþÊ%c–Ëz¼¹ÓN¯ß¸¯ÜÞãïÔ=¾ùNÝ­é8RwG ç^yxð׃¬·¨XU㎪¬¼kN<½'ž^AnÖp{§žª_äm{Or#Î?½}ϙۻ·¯¡Dšk×Î?½¹WCºÁØé2Þr摪ûu§›5dбXíIœ‚z#3e×)e‡Ïf1a9dçxâ×8|ò Ë¥?_Ù9¨×ÜnØp˜l'¡æaÈvêÜ®áúâÛI¨×f±=ðëpW¯úWTKÙã½[Êîoµ•…z}…=Rõ‹Œ· ª_€ª_úm·k¸ÔÚûâñ$ºò"˜®LÉóE@æã‡Âxå§ä ëþóþç¯þîãøÀE½ýò…xýû»¯³s¾~?}u¼Ÿû7_¨ä½Í`Žäúø1 ›¡n¿’â±Ãõ‚ø C¹ÉQoa¸}ð«"mu^Ûÿ2+æËGý9Ð0kz¬5¾)æâ‡d79|~Øúã±ãÁ‰Ž¹°-4ä5ú r±X°Ýá‚ýí‹_‡×0N´©Ô8<ø»oú9ªE‹Ñ]‚À·ÐuøÝuÅ»¨B›D… èV{– X-Ø”·‰èŠ7 Ç÷Ò™9Z%Ñd¶žAà[ègÏÑ™9róZ?ß;š‹ï$ð-6B?E˜ƒNî9kä°§*@1Ë®Õ Ðó÷ü{Ÿê¬€q€<Ã?Ñ0šs\á ÑuG#A (†;ŽY¼\ Ã&Ûð sÖȦ±+¨ðÆfq Ï,jt†Ù §¦U¢oîKsÌ*=Ç òÒ³S‹¾CáõÍ6í;ÈË·8Z6^˜W1é6^…—¹6“¼¾0‡þ6‰W¸õnÎ hA^ÿÂä}ø9¬Å´åj‘ÑëƒÃŸ«¤(,ÅäiMFx‰¾9­Âïy#›g’~ WóÍóØäõÑ1m¼wmjèŽõÁæES… 9zhr;ì šãþ¦&i–×gÂ0ùUý€rpýö8od#•4žÃëÜX0öôsx¡ëÐé­¦ràV¼Vô­++@¹ºjR+Zæ¾$Ǫ}Ä7`(Žš¿eeèâ%Ìäõ®8¨©«²T«µ /ÆY+þÌšã°0~ÞÊ P^êu‘ÒûCÔÓ[lcùçâ@°ä%ùâ%{½,R+?x@¯A© AGlWçã8©ö#|œØÕ¡8NÎæOÒ¡8γÊAÐÈA,þĉàX-oCg'ÚèBo$ƒØŠOÆÓúüŽÁYq;ý2¬þÄ™ó1“@ož“ëu:«?q&_× ½Qndéœ9²X¿´ƒ@o XÑT`´ÑíˆBv‚_™×·qåc·$QÐSŸ7{>x‘Å?vgõç²Ov^Ú^d)ñ^ÿÁõŸbwè,ûÄ•¥é_ ó$×£l8£úÀE­Øâ;«>q)¬iåܨÔk&¨ûĶÃ>ßyŽkwÛâZ(®øyI¼¦‹‚S3âA‚J~ßÁ… ñyQÒþk–ë´ƒé0¸®¹ì9ƒuŸ¸ê½xðüà°úƒóFg{Í Ð‡þNƒçß¼€ë}mð²6.òÆ:X÷‰ëÂÝ{(öÆÒ#êÍQ»Rsðäר‡—;|ð¶Æ1£Qîë›ðr¸7¨ÉsïÉqÁúÖ8¬ûÀuvï$“%Ÿ“9=&ü¸ž¿¼ L”|ñžyã&@ñ/09z·ò­Qõ9™©$&ϼAüùQËŽ¤&JÔ²྆m`rð@xÝdÙ'nToe“W³ySå˜AV%9–߉uŸ¸9ú¯ãwoâ³-^Ê9}°Xô‰»@Í^cš¹|[÷DÜR?twé µq.i§Cû«ܤš>€[<úÄ­­í}b1†·¿â…QòÉ;dÞ|K>Aë%î´UŽÁ>p3.^„'ÜÅ ÇbaÜÓ:hG·ÜN`á“_pg°×3䯰õp2@Ð5Åj#qÑn¾Yð‰Û’Ýx›—±'G·›ð€lr[sK>AŽºƒœßzÓÝ,ø8¼Ïl|âfk|%,þJ›õž¸?;|ܽy² rxÏÂyÀÇä7@ot´ö¦ºyÊÂÛÅ=É"ˆi³Üw§Ì6›^€TYNåäZÞªn<Óé:¦®š â…­rÖ)ï¯P|4~¢Q.®j&غ³~ pðˆª½ã½Yq’Ìâ—áà/†Uãy£_§UUó‘ 0[J~ƺ‹N¹”{¾_ySò#´•Ä4垓īcåØ>&+hDŸ\HÎë1I 9®ù{â àI^Q«fÏ͸âFÅãbßYÙÍÆUE>ž`ž~ÏNA¼*WðÁGUyof•‹Ü²8|Ô[ÙÝ}òž äUSo6’L•e‚ä°É;±%ôæÝZôŸž$ÞZÑ ÷Ø$MþPÕ‘¤x£Q·aø•pð1y¤ %ÔÏ– -3Éš$íð[5 ޤ ýl¥KðáU-º&3dL%Çõ`V’øiÕr Äê•} &~ W'óùõc«%Óvf¡S#ôÂ¥æ/r$¡æ%ö/¶Y˜‘qÄÇ[À[Œº#øø¯R&ä&ÄC©4&‡4©}æF¥Â{/Û¿õë´–d)*öãÊ%‰Wº.¸‡‚bÃSµöŒ\±³²ˆzF~Sl§—U¥’Êš:ƒl‚Ø0U_<™XgrJë#7UÖ’øHpÏ&â­E>ÌØòæÌB!$uí’`‹øÀ²*¹d6“þör#m²›0A¤$“ öe㾑¥çø½*å¤lÖ|’Iº¢N—¡n!ˆKJO–½hÓU.³ÛZ’µŸ„äd’©¤Qƈ/€tÿ¶Ê~šüàIæx’þ­Ÿr$ØodHòׇ*¿ãŠ„ª„Y’|¥ðjûlI¾ÒãuôNÆ!ÉgÚÇ8%ùƒð㠱ׄãGÞÈTT˜Î`åçYŠŠ%F‹ìƒtiþ ]QÝ+ÆýA¦¢úa2¿­ï`½‘%ÑqNj²ßJô‹ÌC¢?ˆ¾d-?òFÖx”:>@ Ío¤+(üx¶ÐüF¬y’šßÈz‹¡ùì·÷š¡y’šßÈ|‹býçYϨu„èIη‡\ÙoR¬¢ßÈSôUßE_õ]tœk<~ºÅÙ#o¤?^Ô²?6š5Bó$¬þ|#ë¹Å®šßˆ5O²ß·ó}„æ±/lÖ>ÈšßÈz„æ7²Ÿûï®!{’²‡à|à Xz·“ÝÃ`„6 @dJ÷ËËö”î—ýáªÝ;˜åá™{K÷ËhQÓ~h‚kK·_ƒì‡¥£ nßORÂÓ½€Œñ$U²çòÑx-òIZ,:^†@ö~’.Ùsñâ<÷q_ß8ú|?É”î¹*‚¬q_9Ñ·îwâ•Þë-ÇŽûšŒ¦·Ç~'³Ü—vï÷ådÝз•w²Çý0]pûýH„ã ë;ÃŽ·Û÷CN8-O2âðÊFœ.´ïÇNœ%TŸdÅñ•¸@Æ~’­ƒÙ KAg$ß,-{Üœ>/¼¡×í¡ _üéûI¶„Ï x ³“Äú³­?yÙd—'9%üÌõgqî‹·Z’¡¨XmV•ð2õ^±Ú¬&áóº$ÈRT¬-‹™1$^IÖð2ô½tX†·ÔÝɘ\ë/°¤úŠud-©QÑþ–ׇV,¼aýºBl;›-Y¯+³³?@‘Þ+— œ'è“Ų±™s»â‹F·ÔûA†¢bÙØ]z¯\$6›HÞ.%£õ-õ~¥Ë;XÖ·MQ%¾æ’Þ; º÷Ûek4»=×;™Šò"ö·UQ^@¨y^GÿÛ¦(/ èv{ôwÒå%ín©ûŽ%Â_×ÞÑÊ?ÉÖ5|/ è€ÛUXD²å; è€ å¯ëüèw{öwåqág™° tòNp(Œa‘#·{ hx{(Ê HïOŠÕÉf(I üu³=p¡Ñ·ž·;|K!Þ*jÕm·Nˆæ·‡îÚ Az¿ß9D÷[jŽ3¯$óäíF{ZW‚Õí$5ïáiè‡KÍ{xÈV” ýpûºßÚDûÛSQá`U+êèéN¹¦ K‡æ «Üoš¢#.5q§„šã”Ñ„'“©&Uªô™ÆªMð™Ö¤ûHŸiMÂô™Ö¥|ÞçEÜCQá*mHù÷»Ñ[¨@>“Pù¼ƒŒ¶¸EQe'YºËÒ˜k ŽÑ¶”Ï[ÓhÛŽÑO)?Ó1:Ë@AÂ1z‘ò+£)Ÿ·ÁÑ—Ê£žkÙŠröúãvE©¶ñD7ܳÝo°ƒ E…?t–‚‚„?ô!åWúCg)(HøC_R~¥?ô%åóî>âRùnз”ß‘\†¹EQM‡• SQN…@—ÜvÞ3 @¶¢ÂF‘ò;ýa°”d'Šòf8˜n:çv0Ø_@ÇRh’Û”Õàýo0ßÀ‰&h’ÛÓãU˜ozËŠÛdQuÜ"XI–¢Ö4a%è-ë]q¡:Î Z¨ŽžXþ„“¥ “÷’LE…CL^t`‚Ç‘ªgÊZå6yðæ6™o †1™ozK$䨒±=Ì!ÍKÚÃd!(HªL‚’ø—šS²—4Œ¹${¦± 3.e/isKö‘èŒ[ô^»&¡ì™ ƒf¹”½¦a d¥„a,¦’Ø0V•ì5 cUÉ^ó ciQ½Òs@¦¢ÂBV—î5 cu _#=s±ì_‰?h‘Kåqõ* •oik)s©¥a¬%åq m²¥|K YZT¯´#´ÍíŠ ÃØ¬ ÃØ§”oi»HùÌg¡ò=’ÅÐ7—Ê÷ÈiaúRt7ôÍíŠ Ù]Ê÷´Ô­”{6:çE……ì!å{ZÈžR¾§…l-­¼Of²¤|$n¡W.…a!{+clD6šçžŠqâÈRMÝs«Âl" HÑ»rÆÐ@·+Ê&‚v¹‡¢l" CïeAÃÜ¢(x€`éG‡ênÒ¥û [¡î™Ã†º]YmÚ,Ñ/÷PPÇC!r´Ï-ŠÐî0ï™rh ‹C\Ô£E sPÙÙB‡h KÅWx úåRòžBÍWx :枊²§€¬{ÚZèV9Ídé9N—GÝ®·äKò–2”èln´Ì-вɀPòL#D]fêí0­äC› ºè6EÙdÐ3÷P”Md(Ê&ƒž¹E)‹N<™óžÖˆ6ºUQNCÙŠ²É .„ǼÒäò8d'Ê©´É kî¹î9• ö´Ñ­ ²Ç€,=ǃ>ºÀG)èš{(hZÁÂ2P¶*±‚Åù¨¯3J5Ì~ÏùD#]棞a: Ð%2tÒ…îXº‰SRϰ¡([ :瞊²Å€ÌyÏAE/ݪ¨©sU­<ÕµLX Êö*V°²t²UãBÝñ–&Cº—´Ê´T”ØuªòR±tI–žS™— `‹©[º—´˜º¥{I‹iL²AÕ¦NK¶‡%±›(1õÊØ¡ìQƒfºMA6˜¦´Ôå¾9C!Þ°‹@ÝSÆ`Þ3…ÑI·*$¦)Á†ÙÀ&JKÅt\;L›­g{ 35a (H=’Ìóž·ŒVºUQa(mKñ–†Ò™˜ŠãûIWb*.(¶$]o~Ò™˜Ê$…`>²¨ÑHÇY¨MÒ¥7Mà*#ôÒm jÃD©©ÈuèI¨yOïèC¢g 7ÈTT¸Ig† ®w °Ö³ã§‰2S‘DaëÀéÂIÖÑ•dƒyÃöŽ¡ÔÔ+d*jTå¦"£$YŠ «À5E…U %§‚ì$”}¦1 ¦§2©#eŸéCY6¨òV;˜ŸŠ"bÅ’=ÓæApŒÅΦ&ÌOE²ˆ]a,©>Ó†òS1VÙ®0˜ŸŠÃ¼–€ªgÊ>šé6Å‘Å[i óT:þJK˜JNE…³®L8Êe è¦[õÖaSÙ©WýºéRò0•žºvìñ³Kñ{üädZ€§ª¼yÎ)¹wìð“™©(µö±ÍTf*c[?¸´ÍtAìÜ‹óHXq$ÁÕU1^º• ööÅy$“y8&J®Áœ ïÜK!±g/ŽÐ‰={)95K5ôØ…è£[TÌ;öRj*“ÿMØF$öì¥ÜT—{?^ÊM½ÊDÐ5÷TTìÇKé©,"0ÙQm;2´>IN ±•Zƒ#~“ìC’ã.© T¯¢4Í¥ä%÷ãÍÆû ±o&¨âƃÅÙU’—ÜiQ³¼Xë;ŽàQí<ã¡$¯Q"„†¹¸Á½I&«/‡JqA\ð²ôœØeqj@»ì l‘Øe÷Žúï²è˜{ªÀÇû,%o±Ï¢‡nQ”KAë‘ÐB·)hèDd+È{-Zèöó^\„†¹Hªa³°$”¼Ç>ŠºzŠ~<^*ZŠ'°Ï@×c?XþðSrg‘:åRî»(ˆ‚¼‡¢QnQ©”÷PÜtÀiœvQ´ÎÕS¼‡l“m¢ue'Ú2Ñ'÷¼•`á1Å.pCßÜ¢ˆ¨”z¸. ]s©ôkQЉÈV¡—÷PtÍíÞAÑ"÷TwP¡ ï hš«§xÿX"Þ?Ñ3·*Èes÷ q’zÆC‰½ÜlàD{\þ +vNï›hM€\”Û${Å"‹~¹ê6€-â} s»‚¼ÆNÖÅxo ÚZòÑ/·¨ÎEˆ ‹À5Öh—KÁwì¯ È¤Aí¿…Á©÷WôÆ=ë½@d輿¢an!ðþ °äýýr« ÿKSO><µÚ£Yn¯$µš”¨Œgý4à!ï­œdºÀл/Nb_­L¥YÌQ4aB*êcïÅ9A켕•ÿ ®OG§Ü¢ ¦ë2 K`ð6ñ­þd+hL,ȱS·CÅ™gîÃy4¨«Œ}3p|P °*IìÃ(Ož"ÓB>Üè«rM´Ä=â]ç|ì ¾uÉ]bn]j×Ü…ógHvÊ]sn츰Xðe²(wÖ‘2OTA#DØ’»F 9“ bî‡än¹ÏöCrãZžÉI¹[îÄí@b/îErg+³¥bŸíUr·Xa™0¤ ©ë&LÐ!p©.óaûl¼ç>‹œw8`F%‰½¸OiÞsŸíKšg‹f(*vÚ¾¥y#eÞW”ûð>´¢\ÜÏ»Å* ޽Çÿ±ßN"‰ýv‰>r¿Åá?Aì·£Iô‘ûíh}ä~‹Ã‚XuÓf@¶7Ø1$:.h$Ù÷ÂfÞcR©sì·ƒ¨ U꼃C;òØ}æž<¶DŸ¹ßâ>Aì·óæ3ãɤØ“g‘æYŠÍKì•äÔ¥^,Wýv9“LEÕäIôûòTÏ…cžŒã>ŽOÇ1$î‘i@ÁWìÜ8þ¿•óÚ¢*ËýÍ%µwîì8üð¾>™‚ʾ›~›uHí½?x%Š öõuJíûº:׀ľ¾Øláªrç%‘X±Ç 6>öþÅT’j£*Óßz1e$vÿÅTª3#ž4+ªµ$l€)»&LA]œB`ÂI$ á‹¿Æ­z§RE@g<ûRPxÄf*»’Î$k“„Ilu\@ƸMb3u±¶4‰@¸Æf*»›ú(c3õÖn€‡Î;Á ÓØ]²ŸiØùÑÄfÄCi~#Sš—4‘=¥y‰ö<†RTØÊf²Ìbλɖæ%|…‡Šrq潩uEM›pñUÔ&E¢—°.‚›íl5Xx(z ¯á23Hì5\2e¯¡µ+ÊfCKV”͆^Jà£Z^!±ûКƽ{ÄkÇåÃÕã¡T¯ÑNƒ»é`Š£&QK [·ùBbëᦩ [· -²MŠDo6#ʯ ‹wVIÞìFüÜõÖ ƒo©Ï¢ý’ÿRÈ.ŽéÒ»GG´½}ì°gîуPïÍhДãTTYI¨wb'EÙ£@–¢lRìÿ¡(›Ô*Ú¡Ð2d[ÚÞžãÞ_r„C¡ïjùL@½£½z•4>öU˜ ³8;dé ±;¡ã åáN Ô{„;¡IJQ”Ý d)jŇ™R|„=lEٞЗŠgï´g¡âÙ¥ dv’¢k7èéRåN. KQÍ‚V­ž(!Ñy{Ã(ÊŽ…¸]Qv,v”Q”- dرІ†¢Ïp,ª¾Â¢Ð¼‡TÇèª Ÿ]_@º¢\û†&8'ëÚ¦‚\´¶Ô6$ü¨.é¾Òê–î+ý¨né¾ÒÚ!ÝwúQ;¥ûN?j§Ö›~ÔŠtßéG­H÷~Ô˜skxîAŠr}zàvE¹š ½†N½WRãüð¤ÆN áI©§Øw“;1€„)5¦žªót’®¨0¥Æô[Pcæ)€õêœ>½T·y@–b\<µÔöïÖüd+*\¨3ñ{r¸PgË5îív¡Î^ $v¡ÎÄSp¡Îôöʶ u&ž‚„ u&ž.–1™°H¸Pgâ)ÅûMçüÿXýÜ…Û€ªûÏ[Š—°œqHðè‰Ð;AxÎ8¥wIϧ/é9ȿ令ç &Æ€„çŒ*ÅKzΨR¼¤ç ­¡¸Lâµa0á”-Ãg*ŽßdHñšž3†¯é9ƒÍh±5ÉVTxÎ`nÌ­eºÝRñš3¶¯i1óä5-f2á”öm ç)Ý[Ôæ€àà ù¢Õ¤Hù–3«”oé1³Jù–3Õ’ d'™Š ×™]Ê·t42$á1HªØl 3§”ïé1sJùl²…¸EQ® YŠr½ úµUE…ÇLæÆ€„ǬCÊ÷ô˜ÅÞ \ÌF’¡÷ Y>¦ïö˜U¤üHGYUÊt”U¥üˆÄgtëŠr :ÞŠr ÈP”ë\зô{2©¨p™5¥üH—YÌ —YKÊÏt™µ¥üLOY[ÊÏô2+*„ÊϨFAŸ¾®(o¼»Jø–²y›˜‡i’}Å#b©c>–Ó²ÂR6çt„¥ì!ÁWZÊž|¥¥ì)ÁWT í`Q”«G@¦¢\=‚¸UïåZ ¾Ã@ÐЂï0ô»¥à; dô{û¹} ¾Ã@@–¢l hžHÁw´°¢¢œã¼&ÁwTr샹1 ®ääœDfÂlS[7È>˜m bÙŠ²ìƒ 8—`›h9½:ï EÙ.öÉÄN·é˜ d*Êûd“Î7hI ;.îÂ6N˜&]Ê×° ¡(ÛÅ.CÊ×° ¥^޲‹]¦„¯¶ €¥˜xk­ªÞiÊ–äÍgAT¼Ù?ve®)€“zHïµ»žÒ»E-õή“è²ÚeÿصJïþ2e·Ø•% >™‹.Ã?j—Þ=ý£véÝÓ?êÞ=ý£NéÝÓ?ê”ÞÝ%»ÒC9’ÃâT¶h ±}Ô-½³á&;În’0”v¨áfOCi§Ti(í”ì# ¥é>ÒPZ‘ð# ¥±GφŽ$[Q.‘Ø­IøE^»u ?¢h„Â4”Ʊ# a(mHøl6ºÙy„$ Eƒ1AÂPÚ’ð3 … H|D‚û;¬$釔Ÿi1ýòÙÙx³ŸÄe KQ.£ØM8Ųd›MTÃb4Œ‹'‡6”Þ¤üŠ#’Í¢à{ëÕÍB]’°˜Þ¥üJ‹éCʯ´V‡’„Åt¦›òDÔÓ—”_QX±YwÈV°.£ØêˆOâ½ÕxÄ…W›Õo$a1¬H# ‹ìÒ3Š”Ï¶³›W$ÞX3N—ªö –bœ½û4àDÙE{hQÅ ¶™äõ»-ަ4aÃ0ÖÈ„±°¶…$Œeð@$Œ…•#$> Ùz¯0–Á„ÓÅÆÚ+&çŽÜZðnÖ9ØÙ'óMüN, ð.ÁÌ~{ÈÔ‚ŠËöÉf $ö&·“„‡LNá {Èd³†Å‘œI :;¢iÛf"6‰³Ñ®÷zp?²$éëÞzx3™ÄE{jAå°OŽ aÎ-I8aIÂ1Ö!Õk:Æ:¥zMÇ`î'I8²6ޱªd¯‘ô¼™Iâ:Š½ØµC„¦ ÓMç‘&éŠ `ÚÞ½53•oékJù–‡ Ìg# ÇXKMŸ[:Æb×pŒµ¥|‹ª‰½)ߢjd6^mæG‘¸Žb3¯‰$üaki…­ŸI¨|OÇ`Έc3ë””V’±î­«÷îR¾§c0ß…$ü™*ŠrÚÏŠrÅfû`×QìͼS’„Êô ¦O„g0ÍDžQŽãòÞA²åAôsHä/RÔn{Ø3H¨üðÁÈ‹T)?ì"$T~¸ŽâE˜zšÝ¿ (üô¢ƒ7† â†dŸ¢0¢É2ÎøX}ðx)Bò"K’O[È‹lI>m!$”|ÚB & ŠR  %_.¡x‘S’/—P°Áù²©¼H‘ä˦B²%Sy‘ªç˦R0ÙàT”L…d(J‡!/Ò%ù²©,EÉT^dHòmS!¡æÛ…/2%úv!Å‹,©¾]HA2UýÛáZíI"S!YŠ’©”×=¥â¬Qˆ<Ùv5•Õ„ÍG Ï ½v”©”J$SQ*šx&ž^ÝèI¶¢š,Ì<é°0õDŽB2%GyfŸ‚ÈQH ;r¸Oök‘£ ×9ÛÊhoÀ©ƒ¢ä(åàù1‰…²sª³¾ieÓŽ@«I–¢¦ã¹‰…d+JŽR0~£+JŽò"MÊ; ‰:üËP^€Y¨ a<’' û¨C—´“¨F¢`HS”j$^dIø’fQ9ÈÄ\ÝÒ½†YÔ-Ù«Ç}<"°{´C¢×0 i(ÄnÑØ¯×Á½¥7& ’Ø-Z•äÕÕ$”¼ºâEš$oé ­Iò–ÞÐzÌPo {“„74Î1 ohSš·ôÚ–ˆ½VBÖИ…ÊK÷Ý_bKòæ ˆrp‡úà„»š„’÷´ _œx›d)*Œ@ªxS`%¡ì= WéÞÓ¨IxAo¾ûxãEº„®x Á±ªNf¢^£*H¶¢Â 4Î$¼@U@ 4¼Œ·-ì}Køáã  ?ÒÐECQáãò3½`œR~:yúEÊû!+ÁPŠ ^¤Jøé"pµ/XürI¨ûLoÌ­A–­ahš *3¼ÓŒ!ÙgZNôùÂ8]„ãAÂÆ’ì+½' '‰ê$^dKö*ò2ëC²/×I E…7LåØà,îL2¥Í)’}¥[Ì"ÙW¸ p?æ’ä;íc2»æ ¦‚âèc)-·¼z(>Žt˜ÅN á0K™©ìÖ•d(*FÕX¼w§bì‹mr\ ÁV„7WT)$üf±IÃâ›°ÉäQ-R÷J’Ev³”—Šêž#ÉÒs€X(²¸› lŽ[ìRœ¤ëT¥ñ"ÌKŽÀž`*Huƒ·ª‚vMò:kB“ûÊÚ“(3»ø™„‚—t(fÚ‹ì$SQáP›™5¨Xš ¶HÔVr*;¨iÿÚK¢—4¨­ät})–bKôâê`å| rJOÙIp\K[2az*{:O¥§âzÇHÒdÏ:¦§"ɲ%˜íI”_ƒ¶ 5É&°‰G—ê5Lì<”žŠ[²G’! )똽FÑ›kDH(zs™È‹,ŠÞÂÂN储ÂÎCÙ©¸d# ;σUè…‡R¼…£§RS95 oáhç©ÜTv±K²åŸàdIä(5ut[Ü©4&ÞtîRádf*òS[¤× “L5Ò;ÆE‘l›ÜyNéÝÃäNf¤ˆlf¦"ñuléÝÃÓ@¦‚ìigaf*Ûò% Þ#,í,Ê­Ãc.OÜÎÃ#.Ï– ž K œTôçˆÇ~¸õXù¨cØË–žáí¸hnÂGŒ2R‘±Û’Pé^v{J=ÃÝNÝT\\_“l»ÛY”Pba‹&€éz–rV¦¥"]xä 0»ÛÉ{K·©`/¢`3Üí¬ž6ÃÝΪ´Td[kšÀ ';«†€¡‹Éa¢\dØÈΪ”T\eœI–žÓ-0ÎTóÊH}’® Ƽˆ†€¡ƒJI2ekÃlG*¾ÓÚšri@¼ér$“%V’­¨ð¶Æ”T”ZÚÚšRiÐÁ¦' 'kLIeÏø”|»~æE”’Š’Mk쇪žÁCI¾ÓÇšRRq(µ’ÌÛL¸Ð 0¤vŒ$KAácƒÀPê§+!õIº^8¼ §am]ù¨hhck뢡 ‹@%7/ tTd¡Ï$œrwºDîE”Jƒž7¶²®tT¶$CQáe‹&’ÙK‚%^Ö5 nìe¸Ø…‡;RqtÚÉtÌNÖ™ŽŠ$ <>‡²h4ß“Pñ⺜9©x #l¾°ÔΓ@ɨ³„—aµÍÙ|8õ&Þm†–ÊYÂ˰||x5+u–´²¡Ô.›À)™¬Sý6ÊCErIB¡«ëð^D™3¨>’,E…qq²%I×<ø0l‹IØÖdÇæ õ$a[Ò$lk*• N¥ìd&*øÏ8vâÀ}ë©TTä-“N±›+}†^FÕz/¢LTÄö$‹ lj*•ƒ’l…M¡ÕÈmÈã (•ÑGd̀إÐ[ƒ Lj) •ôk¯S‚w×ô‘à2¨º‰ÒPQsÑLª4ï."—ZMš÷t©Å– LIJQ-åÍ€ì$}¤Q-¥¡r~¹ ÓP©k‚¡ 0ª¥4TÜ­ñn3‚îãÁÅŽ ª!"Ù š>6ÂA¸ÐV*ZäÌ$}¦ ¡˜™ Lh+(6¡­¤tÈ©IömªgÁüä® 0¡Ý¥ùtQÉPÔðñßV *j[V’©(ÕÌO®Š #ÚS¢¯4¢Í– aD[93s…í-Ñ—Ó“©ù²,>îzxrMW_ƒ­9'w>VÍQÁ˜d¬"Á®÷ C1ª9â”í ©¶"€%b+ÂàdʽÊ@6s“)÷'ÂÜäCA¶¡([æ&EÙz@æ}`kÁÜäª(ì@íu¨ð¨`j2ptЦ&Cld(ÈÖƒ©ÉEQö©({Æ&WEÙ{@¶¢l>›Ü ì=˜“|(ÈÞ2dóÁää—ÄHX<,]^ÄàdˆŽf9+É&P)RÁàä® ; ' ²Ó€Øh07š£†ª$™zŽs“«ÞÊN²e§Áàdª^Âi08™ª—pª^\xT09ù·½$SQÍ–.ÕKx ÈV”½““›¢ì5˜”|(ÊÇ@ CQ¶ÌN.vN ®á>˜LÙk˜ ^q‡WfƒáÉÔ½ºÔ¨`xò¡(•‘Øl0>¹(Èf2õ› Æ'ëÓØk¶ˆ½Ó“){ ¯ÁôdÊÞÂk@({³×`xò© {MUÚéjá5uJóæ*#’¥•ŒNn R™QÁ äCQá8Ukhe.ž|**§½§å4e¢Ø®$¡è=-§±ñHxNSÚ)Á$]Q>úÁeªÞÓ…š’OWÿÖ÷’ùxöx¼bÃiC’0X;nËÛmš–O»M[Ò{¤Û4¥¢TÐnÓ”ƒþ!#ÉRT¸MWÚ)/âißè§Îç'éŠRaQÁðäSQ*,"¡âÓ•EÓ©øL¿éJ;ÅÁµëMŠÏ4œ® 4áIú¾å.¢|**,¨+í”G&ÊaÇõ$}¦u¥rŠ“¿»BTZ„‡LC¥.8bˆ2e_.-"™á?C)§¼Â™d)(üg(å­zì?C2(Ð<“tE…ÿ ¥œ‚ì$T}¥ÿàš¢Â€†RNïdHõíb£‚1ÊT}»Øˆ„blŒR>Uk’©¨0©±¥úN“ìÃÀTqoÚÓkéN—£¢Â¥¦RNÑÆ65‹„ßiS“­r~{Á4eÏaZ3„G/ Ë<• ƒ’V³azò¡(•‘tE…QMeœâXs%™Š £šjƀܕ‘d)*Œj²G?HÕTâ):Õ$‡±6ª¥v lëŸd*JåGC•‹¢êN²å­p)?fŸ*H"ØŠñ^J<Õ¸-¥ûüÖû+ŒY!6®¥¬Ó]¸V—ä%½k©ˆ½k)éGá+IWTx×RÖ)'šõ SQÝr.5d@]qK²ô^á]øÞµÕ‘×üí][Y§wR$yM7ÛÊ:±›me¢ÑJ‚#,üÁn¶•uÊ“‰$[Qáf[MРÈn¶•uŠd%]aŠRÝRÁlåª÷ZG*_ÓͶº2àÄņ¶•uÊ›I Ãp$®ŒÅõ=ÉT” Ó•©| GÁíœiWÃxå¦(;ÈV” –»ÞK•L–OE©’‰d(J•L–©|ÿ¡ò=ü –©|ÿÙŠ²aÂr/O¢¬ST”—$CQv4ŒXÆÑ-ÎìŽ$KQv4ŒX®Š²£a¢ò¡÷RE%IW”ª f,Sùáj'*?ÂÒ0e928‹,I¦¢li´ÜeK¡ò#, ƒ–q 5/ËDy§ØÔf’¡([&-½—- d)Ê–†QËX÷‘þVÏ HMBÑ}1Q—tUÒõEÌZ¦ò3, „Êϰ4ÌZ.å,EyÃ,EÂO›o÷´ÉaÒrWˆLƒ–…h7À]r(ëTH (ù “ÜeJ¾\E²¤â¨‚9ËMQ5ÞZI§8•I(ù “àedƒá†_K²e“äåª(›ÈV”- Ö)ùKôeÜò²A¤%qŒŠ‰Z4 Ñ;_UÒ)Jšt‰ËÔ|»nŠd+JuS—»¢li¸|(Ê–‚ƒ\d7ZÕª¤SYÈT”- C—_'(Ÿ²¥¼” K«lÓ–Ö˜tºyC4ÉPT³ªm@TIE²¥Jª‚¹Ë/åATœIòú¬$Þ|³’@ÂÒ“d@ÂÒ“NQà–Ö8*ŒE`¶´Æ6 aiI§›—m’lE…5&‚„5Ž #±ªèu¤¨aUÓ'@TmE2Ö)¦õCÊßÈ)åKZZgÒ) ×j*_ÒÒz•ò%-­W)_ÒÒ\¥¨°´Þ¤|IKë]Ê—KÌ_>¥Š,’¡¨eû”òÅY$Q5-­/)_ÓÒú’ò5-­o)_ÓÒsOIv’¡(o†ã”ð5 lœÒ½† ÞXØš-d°¢â‰‚ùËMï£ú¬‚ùËT½¹>‹„ª7×gÌ_¦ê-=l0ï$\ØU0~¹+J…]ã—E…-æý€„­S’´³uJò‘v¶Š$ig‹9§ ag«Jö‘v¶št ?Óàp)¦“„Á­.ågÜR>†;“lE5ÿ¤kJùË\0rùPTÜbÒ)HÜÚR~¦Á-6lذ+²)?ÓÎp.‡¨•v¶O)¿ÒÎv‘ò+íl)¿ÒÎv•ò1ä˜d*JÕ_C˜‹¢TýE²v¶»”_ig{HùŠ ƒÛSʯ4¸=¥üNƒÛKÊï48]t’0¸½¥üƒÃÔåCQ68*¿mpÃ|*Hb$SA*+Ã\¤1’¥({Æ07EÙã0tÂ#ÁÿLòZïAìqà áAv’©({Æ0CxÃÏ$û|N Û¼/dë½ìqÃ<eÃæSQÚ+¦‚ôcsUŒõ;ÙµaŸ~ijù­›<ñÞ¿fÐù|¦/Ÿë Ì“ÀއéË/Þ’,Ùñ0}¹éìx˜µ|(ÊŽÒµâã±[‰å>µ”ž1€·`úrATŒÛ%¡Ü7²%w ÙŠ²búòP”=Ó—OEÙA^{;ˆ=ã—«¢ì KQö@ `nëI°ŽŠì$]QvELb>e¡ò1/·`3•é¸$T>¦ãŒbnç“,)_ÃAº¢ìŠÅLåk¸"ÈT”]£˜‹¢ìŠ û|-©Øhä“ [QöIŒbвObó‰÷já“ XðϘ|[0Š™ÊÇä[*#Ì?©þuêò1ù–¤+ÊΉa̧ÞËÎ 2eçÄ8æ¢(û$ÈZO²¥| çÄæCßËÎ Bå{8'f2ãP‹3 “PùΉ™ÌEQª”#Áî0•=V’­¨æß¢5)ßÓL[—ò=Í´u)ßÓLqÚ ¨0ӯɶ a¯mIù‘öÚ–”i¯I¨$;ÉTTØk?¤üH3íLB}SÊÇT[’­(ÕèÌdîŠþ-z•ò#ìµW ?Â^{“î#ì•‘œ½Kò|D¹g˜mg«ïd}JìÞÚ§´žé­8Q kíKRÇDÚ‚!ÌUA.Ãkãx{ˆÔ%Wåaó¡WåPç™N;Štžé´£H畾:ªt~ê¼ÒiG“Î+vté¼Òi›4€„Ó¦ŸnÞ?®A–¢Âiǔܲå"L`îŠrI&0ŸŠrIU¡³˜¹ÌïtÚyHöN;OÉ~#…Ãfg‘ì;mvVɾÓfq²@.‹Ì£öN¦‚Âwg—ê;]vv©ãe Æ/w½²‹1~ùT”‹AF{f¢¢«‡ËA z9Òw'{5€„ËN¦¢ÞÉb¯ðÝÅ\Tö ±ï.梒Øw{5€„ï.&£>§‚„/öjØL0a>êæ„Töjq=!È|cû­@\`ˆùËzŠë ¶‰]w±SÃ0$|x±SHøð>¤û™>Œ3…'à 6SéI¶‚˜w‘ìgÚðf>êŠ cÞM²—4æÝ${̨-˜Â\ç;ÙŠrá"¦0wE¹pS˜E¹pä ,É^Ò©7ók6'Õšìoõ”0ê½%{Ì`¦ìÅÖÌútÚnðx(d;¢Hò;À+8¼Jíjï ØÕÞ¹Ë]C!ËG{'C1.‹ÄØeJãnIV%±cìrïd+ÊŽŽ±Ë]ïeGÇØåCQvtq>Èɼ’d*ʱËxᆰßHáAódL*ÅnáðCAvx ]Æ1Uñ(]=Ö.Š‰Ëµ½=\‚‰Ë]`LIÞÂÜA†>›Íó–Ë;˜ ²ÛcÜ2ïáö T¼‡·cÜr¯$¶wŒ[>e{в½cÜr©ïd*ÊþŽqËUQ.ÛÙŠþUJ“ä1 ·`ܲ‚lï”üF¦™Ô“@óîŽaË}„»ƒ,=Ç^ŽaËÀVŽÉʇ‚lå cˆÈÊ1l¹¼ƒ© ;9¦-SõéK² \ú‰qËMA.ýļåCAömŠ>÷1o™¢ÏðmŠ>ø1oYO±Kl»4Æ-7Ù¥1\ù8ßÉP”mã–OEÙ¦A]Ó–)zL&Y r¹(¦-Cô\0Z™¢Ç`¬ð v0œØ¦‚l·˜µŒû èQ7’l»-F-·ö$]¢¯´[œxklC«û »mCНpWœè±®¶Pð˜\0e™‚ï¨í¸ô_vúiÛR{§ŸöCjïôÓÎf ì¿e÷ìLJ ÷ì§äÞéž8 «ìUrï´Ê^%÷N«ÄÉÀúx…1vfÓ€hÅ|e¬1Õ„ 6WG° €wÈΔÔ'Ðc»bg €pÅ®õĶˆ‚pÅÎ a‚ƒI4 a‚؉#Øã!µf ‘v´ÁÑ_ ."p )f*W¹†dé9®RÇTå.`·LF ·ì¿n‡³‚ð¶1$õLi}¦ÛádàÓÂíÓg@ÂíÆ–Ü%Ýçávóà1~˜dê9.,ÅLe½®ëJV{’"ÁKºÝTHxݬ¼¤×MfÏ€„×áTàƒßlu³KðšV7»¿‘7bí}sJðšæ7§¯i~“«fiÅSA.3Å<å¢ —™‚à¾Â¬CŠ×(<ÙŠ óÃyAxßbò ZÔ…ù­"Å[šNì/«JñiR¼¥ââ®Íxȃ(¦«š )ÞÒúpðSŠ·¨ÞY r*&)ëu]†Š±É‡‚\† Òçƒ íL`' â= rŸR¼§AîSŠ÷ôÈ]¤xOÜEŠß³f@Â5w“ä=]s³ëH¸ææ’‰:¾3Áz#C’ÇÐäÑk¸x3”)yw­*F(SqP&˜ÇÌ–Ùu„§î-¹‡=ó“Ë•0+ùP„v{€> PêaOÅã©{*&'} {*Èz‚&¡G¸,ÈÖûØe18™BǸå‚ÁÉ:Æ-“Pèa’ ˆ‹]A–¢J|IöY±÷â“㡳“{}óÔ3¬D¯a+Æèä¢ [1ÈOR(÷ oØ ²ctrW­£“¡xŒm& ä7ÂÄSv‹,I«b18¹)Èe± {<Éäò“ æ&Ÿ ²[ƒ Ùœ17™Š¯0gU¤R|…cƒlEÙ±17¹+ÊŽ¹ÉÇ|';<c“)úÇ¡è1ü¹`lrÝïd+ʶ˜›Üå[ÌM> lâCA6qÌM.ã,{8Æ&7ÙÃA¶‚ìá›Ü R}‡«ƒ@u\?MÐjÀ¦ÑïDé1LÐ?ƒ@tð.q.†&Cô3¥IÆ~cSÑ–dé½ììš\egÙõI˜y b³ÇÔäCQ¶v¡({;Æ&—ñN^²ã(_f±É¸a†»3 dGßÄa‚^  ¥Å 6“V$û^ÁÉz]Wï,—ïbrrÇôê‚ÑÉ]oe¯ÇèäCQ¶{±ŸdJöÓ Ž^[±ácp2E/6|j~åÅ´+@?¤x‰% ¼„ã÷SzßÁTˆ·òÎF ±ô"¹cüuÁÌäþL6eGÙ•d(È5Á˜™¬§Äл侑!¹k.hD+@WN ~»øŽKj?ÈPT¬ ]‹'îI¦¢b‡ô~­¨X›-€Ä*0Š$¯¹ Œ"ÍoD©1-Æm“LE¹Ê3“){Ëu`h½“Î0´ŽôÊ0Øx$–†1¤{Ë…çï`™xÛKº·\†2cÐ]ÒKÃØþ"óð-—¾ÄÊ0™hºYןdŽ')Ò=æx“P÷ä]07™ºÇ ÉÔýA†¢bi˜l¾@²“LEÅÒ0‡tï¹6L%ÆÜÉ”î=׆¹¤{ÏÅaj-Ej¡eîw2«Ã:$|ÏÕa~äê°N CÂËàÈûwÒåêgÌP.Šrõ3ÈTT,¨1{[A±:p :I¬VN«ÃÒbŠ+^ Ö”ð2«ÃR^ ò,$KQ±,¥›¢ý¥ާ~'¸cÖby[é¦-’“LE¹hzl¯§1œdí'aX ¶cPDV’tEÅr°•nú$Sï ÄVb ÈN²å_”3p?ÐïÚËî Þ1 LÅk[’¯X ¶ÒL[L9/˜¡\ãÂk5žDi¦-FŸŒL>å~ ]Q¶ÿy(Í…s+ ¿¥™¢ÑÆL²eÿŸ„ùÁ–ÞÝDi¦¸Þ’Pñv?¥™>ÉT” S.ŠÒ °ä—ÝÒÛ3Ô ö¾ƒS¦m»„{rjö°yz-Ýáó˜¤\cŸŸœL÷$JŠa{c×ò’’ãŽÿi¢S´ï<’Ìò$Ê1Ù+ÈR”~rJ‰‹.1OùP”K¿Aº¢\ú=9™êLE¹#•‹¢ìë³(Çu‘òuÌTFR Ú¦œI ;ŽSešÞ Z’ì$CQöõY”jŠü‡™d)Ê.Ž©ÊTþF”jŠæ¡2ŠÉ‰0$®ÇXåSQ®™ŠrÍ8æ*—ñN¨|‰2r VÆqm™ñeV¥š"±{%銲‹OŽÛx'SQ¶qÌV.вƒ,½—mÕ›¢lã {?‰RMQ‘ZL”jŠŽ5¶Î. qùù¬J5í1}ž„Êßû2°{þ2Qªi‘ô$8ºE³Òa¢TSÔÃö$³<û¿“ØÆA–¢l㘰ÜeŸìƒþ$ZQ‘øršTã"þH2õ mã³)ÕôI–¢ü#7ešö˜vOBá[tÑÀœe,ùw¢LS\ioI†¢Âß›VT”—$«?É–ð-ý½+ÓÇëö÷~Hø–þÞ™&ùF¦¢Âß»²d4“Pø–þÞ•jú$¾§ãw¥š¢›‘ŸíVIìì’úZO{wÍ<ÀRˆ7‚®4SÔ1Äã½î—ïáö]¦½‡Û³a%÷;´4*o`)$ìŸ=IÂì‡VÓ'¡Ú#íŸ]IÂþ‡2Mñ5mÿ£I홊rÍýÊ4ÙI¶¢\s!ËTûF”iŠ­™„r\†2MŸd)*ö#‰a(Ó§t^æ!ÕoD™¦¸ûãßÌ‹$–ˆY$üÌa*ÓôNª”Ÿ¹D Å‘¢b‰˜Ê4Ŧ¡[?“í„Þ •ŸQçaËEQ®ó™ŠŠ%b*ÓôI¶¢bјÊ4ņè%b*ÓôIpl‹3\/K™¦ ; •_¹h¬SÊ?ÈVT,lØA‹ÆR¦)Jù{’±ž¤Iù•ËÈR¦)θu' 3—ëz'[Qî 0—2M‘Áçß”Í HbYÊ4½eš‚ì$T~ç2²”iнw&¡òa=:I,,[™¦¸]Ø“Œþ$Ê4E³[{Êö¢ºsaAy²¢bÙÊ4½“&åw.,»kÙßÑd(ÊÝ&ËTß îó ®Ó­LSÔFyeÙìÔð ZTÑ}Á+ ª+ k I¼²¬C™¦Oåq÷´˜(Ó)–g’­(¯,˜¼ÜÖ“(Ód'ŠòʲXGõN–¢ÜÕ`±ìˆÄ] Ö¡¤S$xv­ªwÂn nÇ©ðŠÒ¦ªÙíZZŸdJík gònÿާòMïdKík ‡Îê½¼Öh4,‰WuíO¢|SÜtïI¶¢¼Öpœi¥œ¢Æ¯&¡ì5ÖŽël$.GæPÍõ$]Ê×èÂÀ•Ä]8Xr= ;5pÖÑL2ô^^kœ­¦(—>sà™¢Ü̓Êú;™Šrý*$îïÀA\Äk h­'ÙR¾Åê£aT$^}8FJQ^kol<‰ÒNAv*ßcõሣóIª”ï±úp¤¢¼úpÌ¢¼Öp`OvjØìW¹‚lE¹OGÔ(Ê}"<7æ E¹sg³(Ê«'¨èz­áT“óPù«dž jÄZÃq…Äk ‡r´')R~Ä꣙$±Öt¥ ¢ÙNI²Ö“4)?rõéÊBÅõpÿ‚½KùÝ%8á|'T~D¿ ÎPT¬5]Y¨èv쵆‡HO¢,T¶JBåg®5\„I¼aª]üœÒ}ÆZC¿'ˆ×ðŠ:½¶ÀÌÎçc*>c­J?eÇÒd*ÄÍ)Øüº½“¥(·«pCiNKk&ÊAE‰rMBÁo„Ù4h€TLÅÚ2¶ô^¹¶ å ‚x%™‡ô~­¨X[¦rPQö൅­fIb%Q#ØQ*2%Yz¯xa¥ Žå®lBz¾dm·¹PCO‚XEæè;W‘© Ô'¡è;Wõ›Ülk¢T´YIúzuhÕß¹Š,å "ÅË«È:¥úÎ5c1]§¼d,å >ÉVP,K9¨¸3¤{hju'²“`Ñ¿&Ô ¿l%X Šc)uë^–rPŸ²sã0Q*N3[’©¨X–4<ÉRT¬[ Púâc+ ›cµƒ"ñú°Õ áI ;ºøz}Øœ âl;t’¸Å›µw²å¦l™CËÃV"*;{yØêÏp'LE厒`)(V‡­ö ^p© Y}+òàö"l2I¼4°…¾R‰¥­7:‰¶Ã˜7òŸ¿ú_¿ú?¾âxª×ÎÏÐ×;³õÝkÓ?Õêåãçï?þ÷?|Å)k¯/õ§¯Îÿøúÿùêøø›¯Nt˽1náºÀ¯·™L^ òC¶ŽÔÔN&6—øpçÇoÿÈÑ]/g<‘ñÚp^Œ4qV L¼ÀWý•ƒ¼6lN¢Ùü…u“IðÎãõ¿¿ý›|:§#¾>Åõô xúëÉß¾N£ÞBØgéþAòw…ƒTÖMæË0ÿáþ^êã|¾Ìɤ—ûˈèeö’ªB„“w^"LVÀüx\QëÕŸ÷·Püà·ô~óãÇ_ÿê«¿úÛº?p¿±ìññ«²øý&›[6ª¿úñ«¿ûòËÏ_ã|yÏúå׿ÿÃÇßù§Ÿ¿F™{i_~ýHò÷_ý¿ú_±óþkëýÕÿüÕ¯þ›WØ÷üåzòyøÙÅÏÆSþ‡ÿíõ„×û§¯™}œ_~úá;ÿýËúOýúëÏßÿñ7¿þá{ÐÿðÕ—þùûï~ÿ›_>þðí/?ÿý_èüÕk³ú ¶z}ÓŸÿ]a8ènÞua‡óׯ…F­½èòe÷þõ¯þ‹>ÀµeüůŒÖ û|¼òÙÖ¸¿ôëiñË2K|<^¶ÖózÕ—Ý÷óø×/ÊözÇ~¾èq·Ïú[þ×¥_?Äk»ä?‹î(VêÞÿÝx@ó»¯ðÃüßl¬×§Á'ù‰}¼^‹fk¼Ž_¹­þ/?ÿôÏ?ýüõ7œƒ{–/¿üþ§?psÊí¯û#ßñ/Øjâ‹ý /CâËâÖÍâþ¼üôŸúüÓçŸ>ÿôù§Ï?}þéóOŸúüÓçŸ>ÿôù§Ï?}þéóOŸúüÓçŸ>ÿôù§ÿ?ÿ üxaOEô_|E;o¢<_áó²öçŸ>ÿôù§Ï?}þéóOŸúüÓçŸ>ÿôù§Ï?}þéóOŸúüÓçŸ>ÿôù§Ï?}þé/ýþøÿ*ßú/xüyUûóOŸúüÓçŸ>ÿôù§Ï?}þéóOŸúüÓçŸ>ÿôù§Ï?}þéóOŸúüÓçŸ>ÿô—ü üKs®ãböŸ{Ñ¿ú[ôCA Ù^î[*ç½^ûè3Ã^)ÿÓï¿þm¶Ö8Î/¿Å¿ÇqÔ5¾üË×ßœ_~XÇÑÏþåû¯¿©¶æ—~{Þûõ7ÃøÖ—ÿžMVþêo÷ýÝÑ:-Ý_}÷z¿û[üãíß?^ÿÖ‹´rÎé>J¼Ê?}>Šk–/ß}ÿ÷|ßoÐC =«¿áÄ´¦ÁSÿ#^¸GéóË¿üñ—×§E¶Ý¾üò»ïñ­õÇ—þá§_~Æk¶]¿|ÿÇ?÷E0¨ °ýþtûð¿»ýû÷·ÿæßxÎwû÷ùïq4¢G;¿+>g|…×{ýñúüÝOR—›oNtóãô±Å`J†þý—?þúGüˆTn|ùõ+¸¢‡ýY_ÿ8ê‹þðzIôÍ©íË¿ÿÃo­Äy´‡˜88üsèCEûŸV1}÷õlÎŽÛ?¾Z@&@SªsÃ}¾Ml¹­²Û‰žê8ôÛüïø¯64q,©Öw¿×oºökëoø›_~ø¿þþëoC*4èlÞfÎ¥¸_aÓ¨í²OK^Ñíù¨”\©_~­¯ã‡×Ï~¾þÕ°aýòÃ_ÛËÞ_~“›ÕOúî{n¶»·/ßÅËô×níö!¯ä_þfÕÛsúåwü ü{EÃ-nÒÿá_ˈá×gì‚_~ùù׿ÿ÷ÿôó¯þHFÅNÝÍ*~ùõ¾Ó“Þ^óù0êWÏúÍÿùí?ýôÃwüs¯÷͉Nú±=ö)‘Maúë÷úòÛùñû?ü‚™ Ûç—?}ï?Î ß!~m¦¢Ю¡óý._~ÿ‡ÚÞ¡ûús[ó+ø‡ëu~ùéÏoÖ'Z§÷جÿmì›xÖs÷úÓï¾ÿƒw®ýåÿå÷?|‡½Ç{Xׇ‹ÝíÏÙ×»kƒVÑÐ÷›©ú|—ýt ¯ÿ fnendstream endobj 170 0 obj << /Filter /FlateDecode /Length 3858 >> stream xœ­ÛnÇõ]-ú „[ ËBÜîÜgÚ …ÄE §ˆcµ}ˆò@“+‰ )2$G)Úoï9sÙ™¥%Ë0`/wgΜ9÷›œ45™4øÇÿ»Øœ5“›³ψ};ñÿ,6“Ï/Ïþð a¢jJŸ\^Ÿ¹-d¢EÝ0C&ŠªZi=¹Üœ}[ééŒ*jAª/¦³¦æÆhcªmô¼‰žwsüO¤1ÕŸEÓÈFW«hÑŸ¬¡) »éŒ)^ÃêmÝâk‹dµ[ûåÄïôKâåu¿$Z½éW|wùw¤™R!(Ò€ÉZ(m&—¯Ï.ÿmu‰«iÓ †·@ªŒ†W¦ºŽ¾Ýã·;ük½=úûqÃñÞÄ£j “®v˜EjÉ8ðár TßáÙ4LKw ÿ:Fïë‘õ›~}éÖ\Õšªpè<ÚxÏÀÙwnA„C N’MñÂU ¦Í<ÇÔ¯Y#°GeÝ('#1==Üx¿%ü2ÜG›–¸0Æè—z=<›aO¼?[Ò=¯rîs’ÄW´ÀMM Kdh›"íÀ’sTo¨ôÛµÛN´JhK0nÙáïu'˜î¦(.¬†ù!“‚Õ°ºú[„r^rÅpÏŒS0B‚Mf„ל åö.òÛ€Pj…Ú¶T'J³žcjZš4.éúóéŒ YßG+,wâe@N ÇO‘ €CA8û(8ŒJXO­ƒL òo¤¥rÂÉ1nÕL$êçiƒ,ÓJvhu23¦FýÝ<ÇâMáœTŠ8Xv‹Z||¶ƒËh€è Ü[Æ8¯…? Ì;·ÞSD¤m(ÐØŠÖuRö!]++™—ÀÀbÒÍ·ý /}’Áù÷ýëµï¤z´ÒðÀDÏ[ýx£4³Ž§i¨PV)üNHânºìîá•!˜À¨3Yã¶Ê®¨QòQÞŒóY^Ho»Ýhtù2ÉoÚÝ0ãÜÀV{osïxÍ8o2Ú¢aaNx}R£ÝÔ`™r›{Òf?ÆëlÓCGØ›,ñøR¢¬ïÞæµ )¥´UKK«ÌÆ×ˆê»Ü¹µ€ TPÃjÍ:Áß÷çÅ×ÛEp¬yˆ‰ ó®æ}J’q/pÙ>å’`‰†Õ‡Š”èÀ)aÕ x&PÉ „íVY]RmÙxc &L"|Ä’»â +ˆAˆê éÉh€Ë”‘Ïó sÞ©–ý­‡ÈeâÑqô&׌LÙµØüw:bÖ=\+^¼VœœŒh5†:$²5¿±5tvž&´*¶Šp¤ü}„ümô¼ŠlÍ¢¼¦·C^@ûXB;áü°‘Á–7Æ ïT°– 7Ž:¤‘èÂy|®ɵŸ61QC(x¡'rVÄ °³xZ‹{5!Ã0`,N;¤",´É™½³¯ íÔ©h̲À‚t¸e1ö]¸†J=Nl Š©ÃÀ@Hà„΀v€o|ä  m#Iã­á"ZüàTò¡òZjáí 7nóUyß난àû,Gíl“™N¬ÁËÃ/f\lÖ-õÆ =_·DëΓ٥@ò„½h€ˆÌ“ÔT¸¹ê#¼'jà=^K™ÇåîºÚ‰®g„†h!aõÑ!¨?¹sð†tÌ9 ®ãB…©¥ÒIìèrÁX}bãâð,IT””§W[tñÿSÓɱ±qùy5M­6ñn׌Of¼çÞë½<8£.ŠÂGÙÈarè-ç&\Å1Ý1X– ½ˆöÄïNm“ àÂaˆÁfšà”­T,cYH¢Å{1åkÐp†,Ä©€þcðã÷Ÿå&Ñ%å·Î$O9V¯¢L§$yœÖ”=ª^S¼:’¢A½fÜÛqYpê˜ÑD}5@Â3ßg% ²Â”‰pá&8¬õi©Á ©ñ(;÷dx¨ôû”…$Wf·Ž<¢üP`œ5䇔%p5HÖ8ÖX-8–,–üÕÊ»ó¸´EÆ„úååÙ›3W/ÝŸ(¡&Œ %T‚ÂcØœRM u%T“2ÕÃ2hFÁ<È´³$þì*‹DÌÚ4† „ˆ k¤œÌ0Žo|Ef·Þ× oºWdõç>sð2¬º¾¿[WÛ»«jûîûvqÄcì7ðg¿õ[«Íj=ß÷/ŽÛƒXø5€Yö ίϪÿL?;£‘ËØ†öí!œy@&Þ®·¬{–·½;¶û‹W/_¿ý^+mËÆ=nÀàö°ZÞÏׇ°IW?z׫ã±]Zä¸ ¨2Â+Ö|‡×¿ØÍÇöªZ¶»ùþÐÌ~·˜¯×WÓó@;@g»^Ïw‡öâE “ª^\Ml.àð'`´`y[Ýöpœß-çûåê—öâò›~iÙ¡”ˆïûæM¿aû˜¦'G›p“v¶Þ.æxÝ€Y!¢Î‡P—'Pïˆè|uwñâ­EáµGá…'YÀ×å.O‘ŒŸÚýáþ‘O—É瑈ˆ±naïü¦-‘¡ °Õ§—ßÇ’˜‚XõçÆµÞ\UÿÚ®ï7müÿÂÙ´ªÏ{ÅYÎó^Ý."íÚ·@@žJšŠ»UÅݺíµy½ºk;̈́ߛí²]wº(:ÊÎ÷WÕæz¿}ߣuÑ£µ¸ªè9íEÚnæý #ä`isÞœ³óÆÊýŒ…b¯·÷ûþbHÜCψ^üÀt"A9ìæ‹¶ÿy½Ý÷xMí­ŒN¤æ 9bÑ‘T%¶ u8E&«°Yv JOìîï…VÐ+““«íu*Q᜼ 'À Q¥ú¦o¼½šد!&y9e7 ë×3t5Ä3DWwK÷y¾ˆ;d›üyØDëÚo>Òbð2Ý}¿z_Þ¸ :ƒŽaœG†ûÈ®û×EË=UÎGŸÜ:Ö¸ƒ¯j_G1È:WãØ7¯`‚ãÆ´x,aoCªÆŠÉÞ'‹$DÞà*(¸lÎŒsòÀþFÛ®ÅKŒÕ°Vð¦¿ÉsB ­¬YKN+ÕjÉãï¾¢p…pD*‘žôÅv³AEaÜ–ÜÛÐ.f;ð’kª+Ôv&P2 ½i° ®;õ‘—fœ€™à)*YýÇfÛfÀ~$«M P&IŠÆSÓˆM”FDkŠ©voú2ÜOyæd!2¦C!•Ûä@ÅRRti1SÞb^ÌkÅBó¶CUIt§ÃšZCy¶ŒŠ,ŒúDŠ\xbÅWM(DÒø;ýÃj!@¬íÁ vƒ#A 4X¦- ^)vS\ÙX5_üð\ÑïR p‚ÔcE?.|øT¸öÖs,vÆ„d)Neéô‡¤ ç”e©Ï1 œšg4Ë*í^SÐ.'¢¡róU¡DƒM¾¬ÎÊàL=¨†ÁKšõ¸»º"|#ZDEûßä5½û.ÁL¢äEb{6Ù m‹­-%Ãò–1 ¨dL=º^@¨ôB½ k„ßúeQ«þƒÅ𴔉XAÔFu_Ѐò™“تÄÛ`°`c éïìéZõƒ5î;VöuYr•L'•ÙAí¼Ÿ"ŠMtw®rܶ«~À -ð”a¡„>¯ä¤qlºf•ÛØaCÏ‘#mèu¥©´hªhÔ³‰$’ €`_¾‘VJz‚ÕAìt}C”]bSÒ­Ó^Ö:kÜ#‚žï«Ž|ƒ®t.DEfƒOQxwEN5´z±IDºcy©­ì°C£l•0kÓØ»d­r?’™2ž6Ýw”éx"»" ¯ëq—™ìCKª˜ý½G̸ôPS²À^xó뼋Գôðð½\KùñvD'Úá~Ó«†—i0hïú,er‹=†tdççHÞç9I{]oq·²-ÞÅ:y”ŠC\¬‹ã†ì`ºmø\Š?±çÖèx–ŒcQèý6'Në.MʳCöF tONF°Ÿ"䃴L¼‚ÎÔXmµ‘Â_-ÝAøDu¿Z¶X–9×F\)ƒèˆê- ¯Uõ &?B#Ïm|Èduã"ð0ÙònÃ,ÿ+TjxÛ­‡£ž* xÇK/óí“2Á1À("üi*ä„– ‚þnꦤH_rÁ6›¤®2ŽóÄLfœ#8ß þ÷í”ÛØ}p• ¥}SÊf§Î)Ú×à¶·Ñûcô|&ž¹¢ÕÝÛ!V-ý-)‰Š!ýp³ý0GH#5àÀlXÔ•EuãQ®ÎãĦœ‘*Æ&”e´r¡V‚˜ÿ±@àF£U¸ ¡ŒCª¿ô'‹.’’¡èRLÆlªñ¡v?yPúYõ.Á›«‰!µä~¢]|a#‚Öì} ¹öム-¯¦š"st>ö€tÁþ÷‡:¸¸Žñ(W‚k1 ^¤¯‹cÑ…è~Ð[ל£¥aµ›ÎGL0<¢´4ØY¢Ô„)ÄúÙì·½‚QÃø*`%ÙÅ `È=LíàOcI›lØÕÇ P•º¼à9yÌðRÜ=/¬¹ˆžÉi_ÉØ/Ö¥u7•úy>xY"$‘ ×Ä—ÄÐ}bè™wÞ—Z îÃ<6ŒÉrŸÆr‡‘9…C…¹ìµÿ +ÎÈŸÑ !èRÙul&­u{p¾x ‘cCNƒ*q?ò€°P2óÝ_lL®âØï–+Sáñ ünmÛ}ÖÖw½m\óõÔÎ02žoàˆ Ø'œJA:dÃ:ÙTŠ£É夸¿?n}LóSÝìÃØ\×!ÀNGí(oÀ&<8îCB'iþcg`ÁØ4qæMœ°”ãv‡ ËI”8ÌÏö3Ü üD…Pß]; õÃIÈœx–;d$Ñ[ËVöäò$´õ—¶ÒÓuîOŽ¥Fe¡íUãå[wtî–q‰@dÚOæ”õóùS¬ŸªÝ©±"ÜwùȽ£»«Ÿxj¬YàìÓÉ"bAö=ÔGye¡lë÷Ñ*ÿ§`l 8EÂyp “‰~+<:™9µŽ ø_%ú‘N+Šv> ]0ëq†5H¹rÈVO š¨5Ë«=cé똘ëR|èæ/‡rŽl9åSFtáÂý÷,²*œÎ³3KRr°²ñ´-ó!ºžõp ÑûËH¼«¦k¾9û?¬_8endstream endobj 171 0 obj << /Filter /FlateDecode /Length 704 >> stream xœTMO1½ï¯ðÑ+±Æ3þFê¡ôãPµÄ!MBš’H‚Pÿ}Çë…ΆDj«H›YïxüÞó›yZÐù×ý•Ó걂vUt£…8TÇW@%çP DtJ›"8P>E1XT7ò¦n@BÝhåRŠÁI—c¯µ‰^ÞÖM 4ùMåÄ z§•ÖA~­#“•“¼µLr™Ó†¬Æ÷¼0Ï6 Rå¦Ô{Éíî1}³I%ª|š¿Y­Ñ©rL½ù1Ç!EP¾BByÅJÍXúC‡áu#þULjã'ܾŽ{:&¯bL¤å`LÊ-—“íI(Å(?×ÁªR»Ec<‹ÆÍÝjÝŠL¯ˆòy¸®‰¢#-Ý [º-­]HròÔ¦Øè“Îsüɉ×9Ù>—²6EŒò~SÒ²ÃåøåÅËs¶çi¾5uæ×@@Ñ‹¬²Ö¦Ž×j1Ë:cé@#Ï2 Ÿ=°jù4mÎØÍÌ–Sï%£Ž™rlG§ìÕ!Èñd¾©‹¾;>5A|‘÷ˆê„DÇ9‰ìZ5‹;ÛFc­´l=[U—íà0P†-²üQžD>¾¯!/Ð-q'NëLÏ‹=³õ-òiP]V¥÷Ö‡Û1íëFãµ2^"ΔfüÁlÄ,Þ0B'lýø@üÅWe¯7d–÷lý¢/d?¿‹²=d]¡gÍ⋲xÂâÑŠê@5ƒ<ÝO±õ5Ò€C;_{(†âH‡»(høïÈ ûs¦» ºüwlýœÅ\Ðëݸìeöù×AUB'RÿêP¼C¢Ÿgu¹ånÎβï[m#õ!õ7sžó„êɼÌËám˼¡”ùû>ØÏiømúllÿJÿS( ^9çßÅ[ ñÑ Ñ‚+^Fu”Ëê7)j‘”endstream endobj 172 0 obj << /Filter /FlateDecode /Length 10945 >> stream xœí}[%Ç‘Þ{Ã?â¼{ÚPçý²¼k¯à…`Xšý íCs¦IönÏ wº‡¤þ½ã‹ˆÌÊê*RsIY ¸Dsú;q*oqϨÌ?™‹=ü§ÿ¾zsõïWŤ‹Iém®—bO¶†z±ñdC0—TOïïNÿçôö*_j±>ž~º²§¦ÿÿë•<㿽*¹\œ­§˜Š¿”Ó›«J,¡œbáÒéáªúx ÙŸb±öâ*.ÎdB²»X¦©îR¼;Åêò%YB¬q¿•Z`k¢¹˜zJÆÑÏ#ô]¶„¤¤4]B<%kÂÅgF<1âih‚Pó²½ÔÈ@õj<9ã/ÆqŽ¿KÎ¥Kâ¦5ž !ÆÇM9š3O»/òž¯Â?ñÔrL§ä¹T~¬'Rš¬ä-}Ã}ñÔt¡¦½7—Ì4Á¹K¤¦}ðè7h/–šö±;`¹H:Å6šr žÌâóÅà1Å]œg„Ïh¼þ³Ò-þä#$9j‘ºhî¬ Ô2±G Ö`‚€ƒ5$$^*7MŤ¥@S&ýÍÔtŠ@¢N^¦õqÔá@£4¼º™Z¯u˜i µ=¬ƒ*‘ºŽÖÁŒÜŸB­´Ns“xP•Zh–…y‹Ö’ø£EŸ\©õL Žy4…‘/ωþ‚î8°”Eã‘»„ÏDLÂÎ{ñD,ò#b6Œ†€* à,µð˜DýÌŒ¤ >$ÄanPÛm'j›Ÿã¨ñ„1ÐršÄõËEA¤;Ž/h‹ÈOöÔzBë4ºÈ4ž8ÜqëYÖÏyúT’ ™{èkº~N‘uX%kÉü+ÌJÆ ¦ŠUBL² Üx$QÆo²Á´ ¶³„¹ÉE´‘Gj»A*?7QÛ™ŸCSËͿȠ5]“ , /®~Oš+ÐB:ë,i|Ì¡ Ñ˜­[}f’‡«ï¯öÕ˜9ý–—HÖ}פÂH}Y´¹¥ZbaÖ#De©ÿPl UG*[ˆYI‘-T 2PEb&çFªŽ TŽDŠXe êÈBõ|Dã*súŽfÖ²•8é?¯ÞœþáåÕýI ø-zù­ª{*`P+é‰tzùæêgs}ãLˆç{}c3ñR­ç'ŸÏ7~Cãõ¿¼üç«ÿñ’–¶›$"$úMGHÝ'yîê–*Ó—¤¿;²¢jÆ© 0ÒU!mc¢†¬¨´ÕЫ›íHÛÑ gkPÄÅ Šxxd>¢rn·9äXÔµÑ1V­E3:zuetHÙµ—H¡‡ñ£Ñ £ÑÅc…-ÎZ>$_ÄjÒ‡n•¿b]—Vâ×ÕD¿@Ó®™(?O'Îm?O´i%~>·,]?OÖUœÇ&~>6w·‰ŸGpFñc>s£øyhõÑÇ‹p’%^hâç¡Géó¤DãÊêxÒun%}ž£‹GHÔ¸°‰ŸºQüú•ø9a½AüM°e?W›KÕÄÏѤ [6ñs$ê!âçàØ.^D aÓ(~®4O¬‰Ÿƒž¥ øÑÃ#Ĉ/Ô¥‘M­Ž#Aˆ+«ãˆåòJü\N*ÖMü€HSMü(Än>ŸŠC?Gú4I¢`7¼lÑÚ"ƒ¬‘ e ÖÈ…«Ê¾¬±T ÓwQ&û™GQF÷E(›(“­PßDþ6+ôE”é×c¬ÆÞ™’¨$C˹•$ÍI’ìdINª?InÛ.ÉÄŽ"]’›g³H2é·’d˜w·r±¼] 2ñ·(Ÿ.È4q%ÇĨ¾®äëbWrœ«Nz—cšQé_—c¹»]ŽS•¬é"ÈèV\ 2™lÑÞ]IÓ(Mä¨Aó"ÈÂËMŠ}äe¤Ê)®œGO³Ð¨ŽëBŒà\lqbO+åÆ,4!l81´ž_ 12sq”aO6!­„›’ðnB d-Äž~Â4Ü(Þüê”GâÆ(£Nj“a qa&"Œ±uÇ‘Ìé ¬—~a'¬ågy–ü EzÒÐ"ð¾%‚ºÄc«ÌK˽4‰GØ[Çü ‰ªW‘ê"Ol¹Úz"Ѭš(h"Ï ú4Š<$]¢¢&óÁ7_Pe>~^Ë’UUuëML]âh½ašìÊz#\^I¾CÒkå<ѽ¥f½}T·Þ`°1?ÈëmOH*Æ_ûÆ’]ìGÑk™ÈÙH+3”`-ìÈ‘)©“×92aç0™HØ•?™¢èÚÎ)Š’ìüB}PåÇTb:?&¬öÈŽH¥4²#tW #;& wåM&Z•:& -…¨ì˜¼ÓädcGx4²“o]cÇäê³$F"Á¯¼ÉGzdÇä’>¸±#Aä¥ñ#»Šå’kînãÇäÆ@úKÛÆŒ‰Ôi]%0€ë5fbÇd!!V÷Ž3Y3#×™ñ—±;‹ÝŸl¾"6FÑ0Á+_±OãöA¿ÛÑpD”¬r0Iqe8–t_sm³HÍpÄ/ÎbÉ-ÙœE ›³[.¯;‹ˆ0ëh8ñTZ呾ʣݶÝUtZl°øŠQÐn6JYçõ#ª,Ê*çâsÛãXœE§YÍî,‚!×A2Σ”ÂÇ««T£'=¬¬œ:¿J5‡[»ŠÈFÆQJ»3ÖÅîhug1Xm©;‹ÄÙâ°uoÑkh²x‹ÂA£·HâoW6ö{•pñ´Rë„‹'é×B‡æ-úæ±uo‘¤_ŸÝ[tªÔo‘Y¶š·èÚTtwÛQ£˜z—Ö% Œˆ´wo*c•gâW 8%õcÝÅE%¨¸.¡õó»F(ê#-¡ÉÔ¾¸ú#5€#µü/ôù55ž‰»Ýï{ÅË~øäâŠg[Ïov¶ž—⊅jA „2…­”b êÈBÕJ)ª¨´”b êÈ@¥¥UGªVJ±P-ÈBõùÅ)“²Ç~9ÊPS‘‚;SKùú¦B¬Q(`þ þ‘²x}C|ä;cR^ ¾l[\©³ÝRuÐö±†e=Š"Á£Hð(ü› ȨMÑ‘Âö8žHÔ2¯ZèÒ†úx~Š‘7Ž·8qL¼H2º(‡„%­‘<~ï!NF–M\ 2/ÿøáÍ5|4ãÒùÃÃíÓý×p#j)ç»Ó¿|zžˆžæãþ›k좘zþðtÿî-ÏÂbÈ¿q†½$ÂÛoÿtþÃÝãýë·º^‰„m…iãš©"½øßïßýðŽZ¢•#ã{îOïU ÏæÊYcáè[vQʯŸdÑw©ˆRÞ¸HE"»ÿ A¬Ñ!R(s†„i‚¤²æL^ ˜l)€ª²‹¸l2¼0ú—Öƒ¨’a‡´!LÕ0OÓƒP%dµ¢TЉ+ÊTì²8§/LžLŹÅ%úbÀ"69M€E‰à^ Pfÿ‰rÿSI²-¢=ª~JG„D1„?Yf€–ž·ÏQ*ÅH_™Èç—5D¨FN½è™Dö ó«ˆR)†jW™ì%Ù(ˆP5,ñN*¨à ‡ŽUÃr’óÜ€‹Å"D #-gõ\ÇÌõÊ(•bäY±† Öòk aªŽ…*&X¤jKG„ªa)ˆ† ¼’:"T ËE4L°Ñö?…„êåÎÇյЉbÖð¾3¨*ïÚ4D¨¦®6ìû ®öù,º%8ËYç†0UÇ¢ ð†×t "T CÑ=ó Þ+«ˆP5 Y7ž‡m¼Ò¡j)9Ö±Á‰nmˆR æHÏ±Ž äóò*("T sÒ)ÙÖæ?õ{ä½ "AéI^¦êé8Ö/%+¨!VD©#ÇaI@‚0.ˆP5Œ¸Tô r˜àWE„ªaµŠ°#:fE„J1øvŽgÊçÀ¥é6´ä{‡HVE¿x)1mˆ)†WJ˜9ìÒ¡iPd?ŒˆàwÅܦêXvª_ÞIðQ*Å §´AÕßÔÉ’¿}±`xf*šo· BÕ°3†@"Å%ñK̸`4ÿ¢_BaûÛ¡j8•Ã|ÎR5@r "'ú•íÕwD¨†j ž-äríˆP5 òÊO*ozÂT ƒwÇž\H‰_NjˆP5 ñóL±òÞ„"LÕ1ÎB Þ¡h€ ªê˜‚‘-ˆ5,q<¨JÕBq­š1`ØÐáy(•í~C„ªa•w¨ˆ † o(ÂT ƒwgy*6iD¨æ˜TÔ¼X¡ˆP5ÌgÑ2ZÖºŽpF§cщ–‰ÐÅvDò> K™I*§™øOù¾¤åXËDð?D¦ê2Kü håõE˜ªa=ùÁžÞ^S:c¸úf¬®bÓMüºšnؽÐtÀÛv74ݰ{¡é6€Ý M·ìNlº‰_7Ñé³èu'4ݰ»¡é6€Ý M·ì^hº `÷BÓm»šnؽÐtÀÛv74ݰ{¡é6€Ý M·ì^hº `÷BÓm»›nâ×ÐtÀÛv/4ݰ{¡é6€Ý M·ì^hº `wbÓMüú<:}½î†¦Ûv/4ݰ;±é&~Ý M·ì^hº `÷BÓm»M7ñënhº `÷BÓm»šnؽÐtÀîĦ›øu'4ݰ{±é&~Ý M·ì^hº `÷BÓm»šnؽÐtÀnbÓMüºšnؽÐtÀî…¦Ûv/4ݰ{¡é6€ÝD§Ï¢×ÐtÀÛv'6Ýį{¡é6€Ý M·ì^hº `÷BÓm»šnØÝÐtÀn¢ÓgÑë^hº `÷BÓm»šnؽÐtÀÛv/6Ýį{¡é6€Ý‰M7ñë^hº `÷BÓm»šnØÝÐtÀî…¦Ûv/4ݰ;±é&~Ý M·ì^hº `wBÓm»šnؽÐtÀîĦ›øu/4ݰ{¡é6€Ý M·ìNhº `wCÓm»šnؽÐtÀî…¦Ûv>‹^÷BÓm»šnØ!4…uÄ۬몃¾þ¼ê {ÆbôŸ•¨æN4˜ï¶…ÞTCßd_ÔG#éŒÐiviDË|7¢aU6¥ h/:*SYöùáöãÌ¢±æ¤!#9,üFÒX¿"ÈŠ ÅŸvE¥ÈŠª¤ þ\}_+ í@¢ÈHÕ},tP6¨æžÂõ×­­ø¨2”4úháÞRŒÍ(œÒâ Vû¯ZÐH"a=ùñ«ª!˧wàý9-g4ÿyuyÔ' ¬ÊKY}dˆ‹èß¿ÕÐPgÌÝYÆ?{pßý26ê Tì8´?{h™Œ…YÿQƆÊ:îÎ2¸úÙë½¼Öç,§ÿFcCúÉro–±YóYƒ;*’ŽŠ¤£"é¨H:*’ŽŠ¤£"é¨H:*’ŽŠ¤£"é¨H:*’ŽŠ¤£"é¨HZ¢Ó£"é¨H:*’ŽŠ¤£"é¨H:*’ŽŠ¤U{T$IGEÒQ‘tT$ýzEÒÜRÜ4fȹ,§ƒáæ0âWZ͆ Í-UGRIÍŸ³8Þ;Úª##U±|«Ò@ÕÊáXL’‡¡_ ©žõuèý@õéLj@'‘8¹ˆ`ÝË7áúÆáTMïÏ7Ž>G>> GÛ¸Â~޶‘ñ–Ã=Úõn «é†pñ“òÈ–*' ¤É_jÈŠ*ÊDUlW½Ø<¡[üÄ3g2ޤ'e€›ÑRh“iÈÕà”7>ãÇáËxŽÛÑkTqC8¬!Wññô}däËY1ã¦4o¼Y}þ¤óÖvÎNC£ÄɸÄÌò‰.Ëé/§Oÿtÿôt÷ÕˆY×ñ´˜åÛ>›ÄY¤Ÿh6ùÖŠ¸~⪠ãùÀ?¾ Ck·<Óæ{äÌ 4‚!WPôKSDL@þ† ä3ŽSÃÂåèšÁ÷Wç‡>šO|^²‘ø Gy» ÄéÉd‰)Bn5/_ö@gpƒÖþýò‰0,fšÐA'w§áLÉâ'ôG{Ò50ó$(_þ<‹›Uh-ßùå3˜áÔx^u8gü¥‡‹“ËÝ®Æ ›9œ<ßx4¡‡8½šüÿNä¦Ì`>UÕãàt?áy–x§Ü„:eĸ„z³g¬I…‚¤çYô5áyEn(ô%^(€›0bl‡„s_™¢ âk7ì Í2«TÜ0e§<÷ŠPüHú)\X±¸4dê© ˜†}CXNÈ뜡Ÿ›È—Cø‹Œÿ2á6/ þ1…>̰'wˆ£‡p8gxI‘l>áF¥)Ê0âûÈ'«Ö0ƒ qÖ8ùýx«fŠI¶>:1 ²7v†ÌçCãú­fÈ æ^nœ±Æ×éBëÅÌ`k‹-æ Çç– ÑŽÃNS¶ìvÍ0Ox ô/¦)^Rà™ÃžšÁƒˆá¸Êuqœ®À¾ røÆÍ0N¸òÇ8Ñ„fŠÔ‘Îw…Ý8' ÜBˆ/<†Tg051 ¯±Ç¶ç ¬¯pÕ‚3Sˆ¬;xg‚ϰ%8újï>–=¤°®ÂÍLÄ…fJ°°y‡ Çfwli<× !æ a˜œ™¡_߈›$B¢UI†aèp·G˜1`œOfwËÍaTPÀ´cW#ÌPÓ¸(ÆÐˆq&ü=Ëw*…v7ŒL°#x8r´Mºz†„‚ñ]za†û†[ëX«â»)Á1yÀdâp³Kr3´ô©G„ÄdF`‡ Vû(hœa:ÉÛrЂ|³ÞÓY$Ø.|»ÉŒ5AVXñ›‚Œ´YÌ^õÍÀ—ˆ„´Àã‰+Sé¸EÎÎàšˆë Á†îâ§$âp”+¬Ô”(Bîõ\Ž2#±‡´2îÊÀMJuR3ÒË)\¦ÄÆ|«|8¾abó „W¦Ä²Q$Ùó=(Sòé¸$ê¿Æb‚ŠTc%R 3ˆÛÞ]U3'‡ÄמaK¢º‘jfR£ôå êÈeȈ)Äs32*Î×eáRÀã¦$oq`æ9LS¶uÈÑ$Oé„«xçx!¸ã«\ü$®Áå¦à댷6™¼ É‹¼=ÇÈ[dpsàŒœŠM\ˆÝE;e' /i z¢)Lûºfn¹Ï_»ã³kú¥›5‚ ¿´:`k2V{>k„¯„„Ë}÷€×røJHGßÁÅFáŸÜéœ n)$ï©\äÚg\ÉqoÕ{8õ¥R£¶]à,7{”ÙÉå“H­Nz½kXo1÷¸»M.æÄUJàZõšå€‚º$Èr´gšö#¼l d½ù8àå.Ɉz£3î|ϊȽË(»àNy½´rù³Ç}gNbKRDFÊ´-ê”*z î•+?=—z\d¦÷Ì‚ Yî“–Û‚ ÉzŸ4йh$éCopð^FÿQå[7},Vªm2FƒÊ7¹„Ú;þÍc–{ª1øQuró%qK’ÙÁò¡!1 "—‰¦.bUõ‚b‹k-Óäv»u…šRÚ Ø•/eD.öÎ& ”_¹’[JÉz%ìø)a´dy.¶Œ• C 3Þ¿Šzý0r‚T¹Ù4ó;4„xm:g~‡h…ðá9ŒHg ûÒ¸Ü×J‘í…«»h¡“\cuahºŠEgÂIi—-x0>¿…oLM2¥±@5|ŵç—pä:T¯+•Ô°daPy,m£ú¶i SÑ<9µûdk”´ ý+|,¯E×·«ê Þ\œLòPôjŠ,pƒ.!|)#\GˆÓ«çqª|ï(H±F‘3} îiUYä9vx±)jv½<†–^¼úFƒÛ=yä.èeá[”hÊi½>´­L2!IÀsÀÏ‘K]a8%í¢Þ¢Šì‡YH0qܤw…ÛœGH•õtìñÅAq™ã:áR‡ü¼(Ö.MêZ‰þTðI/Ž⼠r#ºâ˜äšòÀ73"?ŠEzG¡KDYAVJ&é6žB‚\&øvûM)~ ìO±ýŸ³Y —Å!üÃŒ 4äÀU‡aNYdÈØlE‚×rEè„’-«²Ÿ^Ý„äd Ç:ÃóÌüÒ9á·›ñB•›‘f oâN¬Ù{£!#‹ƒô.qጄi5±<‡;þ¦(îEeÇŒÜi §$ÉÓaób‚à¬ÀõwqÊŠÀ¹cgÄΩˆä7'(ÛœQà\£‡p g<…æEt™ñRÞGLš<µ3vÀ¦xÕØ’JìUãH„ L’êò•íü'“«úð ë”ÄÞ#-NÉL‘ûµ>«NqâP;€}, Lñ¹(ÒA ƒK—0%@&¾6Ø·N8u†·ä@7`§uÊ>GL²ŒPgp ¶íB•·f¬1 ²Œº2'˜…†I¼k⧬^Öõ\’Á›ÉFLK‹çʼ3«Qƒ]yÏ×OÙGH™ç/ì›ã¹%‡4 Å\KÉaÄ{ÑÆ®Š·TNò †üãÕy_©ÊäüHÕ‘ U/Ș.T ©2}n¤jÈ@QwdDzʎŒTÏÆ=ÌÄV湎ãùieþúÆñI¾á|c¯o¬©dëqF—õ\}u¶ú‘ÄÛïg¿œÜÕÊ9<ª¡Œœ2-H0Ñ÷³…·TIËdYQá@kG*EFªöü…jlñãf3Ã'máÍI¼ÖïÑÙQÑsËJÖ)ñ6ñ”Äíà‡Å‚ ç,lÛ¥.¶`ƒ<¯”õ¨]£ÀŒËÈ\ X ÔÁ—'#;ÔÊ|7àLoýÞIe§ßÿžKypÀ¤£k8¢ìçÿõî=MIÀTùó¸}ûtÿp÷È“²L'¿{‹c¹Ÿ;´n ÿæ3ê‚öN0CÕÿo‡Ø*'˜õ©Ç¦žÂ;[oý•à(–:Š¥Žb©£Xê(–ú8—õ(–:Š¥>IHŽb©£Xê(–:Š¥Žb©£Xê(–:Š¥>’mŽb©£XêÓ8æ(–:Š¥Žb©xàQ,uKÅRG±ÔQ,uKÅRG±ÔQ,uKýZ,%ÿä³[Àx §/²­g·X/áT¾"PËÉ-¸ç9>¸Å8òë“[>½ÄÄyì!ÅSæ{F¥Æäñ+sÂÿ¾{xóöîéO矿úù7§?õç?]SõkMYÜv©1®šÂÍà¾âˆÊLª IñÎ?Ý_ߨów×78°ª–ϼ+ d8ßá.Bl…—sœŒ!òü÷D‡jZl76‡,=¦ÕH-ÌÃOJ¥o‹P×UߢHK‰¿žÿ0|~£ý#ux~;àwÃç§åó^·P¾eCïÖ›wס¢@Ç_ßQSØ+«Õxx÷ôtw<‰Éùüš¾áœI>ÿtÿôýšî=ª?ß=^¸°çÆâz ÓÃ=·Z ô?Ñ­jŒI]ç§~úþþ±ýåÎw?ß¾ùááî7­µt¾¥>qSÖŸ{÷ÂùÇ[^™h,EÏçûÛoP¤ßÒtüüŠGU3­ÚOíiþüµv"æŠZµ6¤Û·¯—4n áQRƒŽA‡ÿöÝýã]#ŠK·ˆƒvK¦„§&öwW/ÿËÏ/¯q§¨5ñüîú&ñ™YöüJ¦ÛcÔ¯><ÜÒüÓw†¿{úþN M>KW¬çv»ão®÷˜ŠXǬëR?LòÕðÙü:Ãð_¡³æO·Ò+^}î±Åô<>*·Ð4¼fŠóÓ»½^aÿ¡ä΀? =yÿ ,ýzø|/"PÈ>Ò„í²ýù2|þ ¢”<±ÝgŠêb(,ÕÓfTÁ‘Èa­Êùþíë{åÆÎXS–7ïd–°òîüÍŸEnàŒ¤np%@€Û'óÚ ‹¹ówÊb†\˜óÓýÂé¤xþ®Ëäퟷ–óÃýÛ»…Ñïßêç’Ç&H&ßý°<éáîÛ§E\!îÂÐç—ô“¿{¾¸Õ®¦/îÏ¿>¸b›ËMÝ>c»§_'ÜŸTÏßóŒò]J‰dŸwu™wÞ¼Õ/¨£ooßЈ°‰Ô×#'BâÎíצªPé{²Û:à¨?Þµ¿òù›ÞìÝòéíB}ûáéæþUW +=¦«øê¥¶Ú¸ù³À=—cI‰ü4Цwi‡=±Ê’6Õ©üú/L¼¡‰¯]3ü º&ýî?ýLÒƒÂ>’d^ãøÞuw~¸;wúQÿ¤n?S–„bM[;Ñóvûºý.Ÿß}xjäêCOfà‡á?Þ½e*"ïÂÀ}b›uÿö;˜$µèßÐy®ÅÇ©:×IÒOëGåÛå"žŸî0£íysûoƒÊ—.«€ýôýý«ïAzõaäçïkÒ=Tç»Î'¯îoÕìÚX~Ùì>khgm.Ê$kÇhO784[e¹²æõ¬þ/à4lïendstream endobj 173 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1847 >> stream xœµ•kL[çÆ16o M:K#ËŽ“ªaUÒfÙÔj]×*[nMZµ…’¨A\°ƒ/ø¾㿯866ØÜl(æ ÀÒ £‰›vƒDI³|Y”6Kº­íiÍkíM¤‡®I+õãÎùr¤óê=Ïóû?Ïy9Tj ÅápЮ7öçåýr{ò™¢H\MÜçÙ28Á…ŒÔÀ4‘‰©u—Ÿ8û#*y­«•HëdM%¥eÇ**«ªk¶QÔ[T•K¤ò¨|ê0µ“ÚEí¦öP¯Rû¨×¨7¨7©'¨LöST*5DÝá´rSîr«¹_¥I]äàý/æßMËI»èDÏÚDÉ—àÅ9‰çW¸XpZÀh  $hƒQW×ût÷վãós€BzQa IW—MJ³šPÁPÕìçãx}Àií«’2¥™Ö¼ÝTÙÈdq{}ÞH{HèéÁ™p}T>ùfQ™²¢‚VÏTœl€ãPפ5Wk‚œò¡AGG´vtâA@6•AgeÚ Â¤È8¾çà'W°i™›°ãˆàëýK¿#kH:ÙD„Û–ö\Ç?Ž×ãlšèˆDpDöÞN½9Ÿ,v(&œí$uGrRÇ¿x°WâµîMò‚ ’¯­‘$ >!ÞÊïŒ@,*­°ÿ>lk._€,L}·àŸ|¼»à˜¤^"”ÍÚµPõMB¬9-«òíQíîõ ³¨lõfKk@øWÒ/(2.‡1ï:^s~Ü_XHÒ~MÐ[|…ñ}VKóm.ÞÁÂW³ð-À`ªÿrt~`vøÔø`¢-Ôh2ë Pº›{ºbsË»c;• 7ŸÖ¾#ŠÚZO²™U˜¾·ðÄøÉÙ( !Fb‚6FýÌ×ãx_œ›Ø‰ï ŒFK ´¢ªA³7éœZ(}–l®Ü^";Qi¢#ò å’öÓ¹V(•F\¥¬T”ZjA y ;¾Q@×W£>®?¼o°Æ¢Úb‹ôtdð4LÃgÙ]žƒÞŠv„탱àPàxÁÃУF«z–ãø¥»ÈÅ_%ø‚ÏW!añ ?†×;ý`GV·Ú¯¬5JõmtÙÂÛöpr×øûÈïÈTÑG8å^M†±iU覂¢’"@ê&wÔ vgç£þW°x…›ˆá{‚qãd•RÙ,g£ïl¥›LHYFÆŸÊSÇÆFü³§þE».t£÷+Æ<{˜dÔ$÷xÚ»\tï_Æ;€üíF•ÞÚfT+žQ†ôü‡ÅWñ˧ñ•YúáW3Ùüª<³3i …š}*¹®Yo¡Åc"§¡6‘-D¸u>÷ÏK˜öz….]oéY˜ƒÞ)¯;æ_JÚ“Xt5šQ¨ÊÉ­½n½…dï¡[RfËŽ7,cÛ÷ÅÄÍewƒ%YÓ]â¿H®Ä mÖæxî%¶^<ü4þ=ïO¯TUhD´—|!8¢þàæÝÄ©'ÊsÿW$eï#„¶‚E·¹‰ýø?£¹Õ HÒ†‡Âýcg޾»‹H&ù)æ†Ë†«é©²‚Q˜·Íø®‹ìøQPÑÝÜb4YZ®IH ëóE¸‹9_þûFWÑt|×Sìè÷ ½ÄWK¿14Ã/'Ï­2Îú?2&Šxb$Ž×Å9³·ð·¸‰ÇÙ8Ê÷ ~gW´}Êés¸‚€œ+Ã0fö…¬KÕ;Й¬Šýæií«Gõ´Qä ·ä¢}|uë!Âzø€€\““4é–£¥³Í`wºíèDC ^UmS]máŒäã+ï^ôÒiï¬g­J¿MV,9n¢ÿ»áSª5J†O–¶7°áK#<²‘Ð??Ÿs96îëÖm´Z¬F'~™p Z@e·9lP¨9T/•5V¿þ)Ìàìs_.øh’…‚¢¦Ùy̹Áq.p°lÓ „·ëÛAݸÉÁÚ•«"?±,Pt6Jëe c4é¢IÙ½|Yk1‚š9~æÎNþæ`Ñ1´*§L\ÃvYÝj÷y“ÞÈÉHßùŸ&Ù™ÑBñXþæä1Q²›ý.o§‹îûd&ÔÕѪÒ3z«eUJÂÀ¨ae<ó½À?¬À-þÆ{¿gšÁ¦¬=—¤ wþwÌÕ›u†65É÷³ÇÜÛŽØœþ;w%(öwž¿äYâb.Ö À V½´q-áƒIÁµ¹ýtß?ÿˆoêu*E²ŒF(Û›\cø¡5ÚBÑsBUA› ”hÇ9p¸z½~}‡ÊN›m&€nèóôf»{.ÀZ)–TÔUÕÒæ b:Ê F®ÒXú4‚YniIæð:ã'¹ø—}Ê¡rñ1IqeT™ˆÒkéôT¥$ã1ÈH‡Œ5‘IQÿI[“endstream endobj 174 0 obj << /Filter /FlateDecode /Length 9919 >> stream xœí}M\9rí¾~Eî^Ö¢Òü~y÷l<`èé¼hx!·Ê3²¥nZ=üëß9ä½¼Y)Yª¢úm„FCY‘‘¼¼d0<üËÉ]üÉñ¿þïOïîþrçCq'‰ÙŸÞÙç’c:½½“šŽŸ•çíÝŸïþùôó]ºˆ¯!œþëΟþÿÿû;ýáÎç/YN9”zIl14/’7ÊÛ»ïopí)—hLµæK‹3ÓFÙ˜‚kî‚^LÏÛ(;Sh‘_NLeg’–/uæ„¥8 \™y6ÊÎtõ¾ólLîô'¼NÅ©ÿóÓ»Óßýp÷7ŒíT/97ŸO?üÛÍ“?ùŒGtǧKÌõôû»ÏÞÝ?øã¥ÆsŸ?Ç鳨çpiåœ&zÞ~ÎÅÝÿËÿx÷~¸ûîΧà.’$—T8ìRB*—”lržrImèöF9p•.!Î\ràjø®¶™«Sf®Ñ‹kî×ç *ô#ë%]*§Fæ*Û¨>¤û‡b»ø|Æ …ý%•˜â¥UûÓᚦ;¤K¨“ÀJ ¥\û»\æEòÝX𩿰-Í8´ÑÅãgåKóÒÕŠ$µqø‡7><¾>ýõ½w®Ôó«·¿=þª¯¾`”‹8¬¶T/³Žžÿøøë›×¿½zûëýÿnƒ¤¯rõŠ^~zj Ýùýãɺþ‡;LŵjùØÛˆ?A¹XêámRº”Ð >í’ >è”?ýðþîüvëÑ—7èÓ©8ñ.¯i/פÄÂ^Ð ÆÔgè¡ñoXÐ 4m¨h0Ë%‡=¬˜ç =š¬yåÊö ð’Bʱ*øÆEVL2´“`èrÉ—âÍ w¿Œ_"…Ø(37Á.,KÞX÷(ÌIueƒ zw…ÐTìÜ Õ+;n‚‚=yAƒÁ¨Æ¨Û‘[¡¸‚wª±8ÅÁ/@4bË8æ‹K d&8h.—t ½_°Ž¶˜;Ø‘0†+4W€ÅÅõ–‹»4Y2†Ðúxalý5­h«»]‘!+^8b£öèaò—R,ã¡££ ÞŒ„6(P­ô°ƒ[Ñ`‚ dƒØ¥ZZ1Ç4‚={˜± ,iÄ‚ië®yåÑ @|V4ˆ ÔÓ¨Åz)å¦j˜}FþèpS 4ña[…KQã?agÇÂ…kU.’Ô:ÖR­c_a¨Rk” èÈU;LjýQ-þ5ÍÆ®äÕuì/5+;`á–Yòö#¾‘â.Xë 4<3‘Rñ+åixÁ¬–G²†aLãIÐܦ„Â×Ì9c”Œ‚]2 "¼J¥›à$Û£.JµTø(l :Pèø„"5Ø¢ú+OJT0šyA– ¶“ðôh|gÓ…ÖE¯¬Ý$XI‘Ž)oE¼] JÁ3¹ËUˆ`ˆ·)–,F®`O°Éš¢/ŽU<Ã!‚0ç“޳˜ñ¶û5§¿þz2çèèá| g cç ʇ…V8ü‚±ÉÃJ8GÏ®–ø2ë 6ZVô Ñâ‚1Œ03 Û£E¹àÅw/ªòöFù¥sÌ)ñ꺺²ÀØÀÝO7Sì Ä:r·ÉI½ÿ%V>õCÖ9ᆱ@hÄÃÓ¬ufˆè˜p£Žp]W¸!‘Ö8-ˆݵBª%DìI'¹ÉG$ÂÌÜa`7@¶W¼r³0Æ0¬ˆñD˜?ž& àÕ׈!vÓD öË ýádÒõ‚UüU#´Zé»r®ô¯h0+ÓTu TM¬DS„­ºbJà½FÉðè .Øð$d5g`ÀBk¯Ð®fy Ñhž/ÂxiCH[uÅZÝ¥ÑÛWxã3ˆz†0´oµ÷|Ûþö9dÏ%¤éXFjépÄò”k§lgu±P…Ïz;ecÂ~/3ÏFØY¢è(L<egºêåÜïœÆHCZާ‡áþ!DìÈñüàñ‘‘€àõÈ«ñYþìõ#,ÑWa;ò¶ºÐE«#À-,ô)uОò0Ù6ÊÌD/¹”™©Sf¦Ztb&¦N™˜Fv¦¹O_x6ƒÙôÔű–>f/xp.(_2VÔøxc ö¹,€£íiÊä/}±œ@„q•ýðüßyÿøáÍO¯Þž¾ûíÕÏÞ¼}Ô£½}¤àˆ uxŒ°ò¼Ô÷^ýüúÕû×oþû{PkQίѳq6¸Òg»ŸçyÒ3þÃÞ ƒÊ ûÐïë¥ÊïOˆ»‘;Ä~<ÿß_ÞóxÙWßqx¾»—%}#† 0­’d‹!ø2Ç<¼“ìDàW­MAï ø Ó@OP? !|(‰dÈ“ H1(3”dçÚ(©†K ,ÉÄ5(×€ŽLO”™«cG&®A™¹ =21uÂÌÓÑ#Ó Ì\Wo=ÃÄõ|D =Æå¾: DxžàÂ(I ¶Z9‚@&®ï”W ¬N\2s%<È (”WïÅÄ5õ뙀®/l=6ªî¡i0÷>§í³ŸèôC¶O¹ÅÍvÑ””8ŸA$O)ó‚¹¹L¡_âÜ>¿4ŠÚa%ÂQ£ñ XÉ“C‚IDM¸ê"Í w$xF%C~5.!Ž«—n#ç®|®/ž÷ÊDI©&êO•ƒíwµpØtHØä mÿôÛ6ÓÊýºQ¼ÏZ§P†ÀŒã$ÎA‰§\eŠqÅ É-mæ”™«eâ¢f®A™¸„Z^ÒܯA™¹®ú:õþE±·ˆ aæØ›»8†ƒ"–JŒü+¿ê™†Ûü·ïàMð»àžœ9hÈ#æýp&e¬íz8w™yì´dPf¦šý˜‘ÎÔ)“êÞ2ó Ê̘+4?nPf&^~fê”™©¿ËÄ4½Ý3y$]LÛјw>r´õÈ':¨´¤G> n«=òIMg'ìÔxc&6ѱ#ˆ]î;a×mïwE¸ŽßñX`,PýÜ•Š.ÊùóKO-àf&l ‡øÝ?=Þc+hØ&Ͻ‡]Ý*>=¾¿gŠFñüêODZq<ÄSàh®Ûóއ~‡xp3³™j+\Jo¢ý¡.–À`Ñ´Š^ñE XÍ+6a‡Yat™1J˜;e â q^£'Î-Â˵¤Fì”cˆý…A<¾ò’ ^Ô¼×¢NR]²d_aƒ› hÒÆ&<{ ¼MÓîè: £,l¶Û Ü+ƒŒ–ñ®+’½"Sf³Æðü ¤/ƒL—†i KÖºîàºb\Ò`ƒu‘ôT$/ye¼jÔ1„Rl+zHÃYCÉ„¯Xwt|èËðÄV–,dz§ì¡_¿ÎŒh©ç u½Àù‡È\âÄ (œÁÊXw[dŒÕ²Ss[‚8TD¼ú½n‘nU[²hD+×b ¥êš»aä-l°¢§Kpª†L q{;¹0Š´¿‰ôhŒv¨B3\wvP´pDÌŒ3V ý(ð'j*Í=¢¾xVè–zRþ‹Ã}„Àt+îøñbm`(ûR”"±>”3,†Þj)<“£©å, »¨»h0>UÓÞU¯`,G!ìO)™©^°‹B ã5jÄ‹>ª1:˓ԪRq6‚Ft0c‰T ó¹`:{Ê£=¾Eaí ™ž-ì{³8Uÿ;3B”´ËF©¢‘"Wúø Q‘¨MF£ò ¨%fý•Çûk3 "2&é{ÐLÔ°äoð$Ï¥ÆeWð ímn‘Ñ€D¯0~ã)hl$'=ñ]‡;vp]?—Ø}4>Ɉ‹ë zýI» JÔ YÞa0Oq¦‘Z õ¸f†‰ü 3vŒ ù&DÍf†I¡°1})óÜO)UG?W8b&u4 ˆŽ,­fØhDçe׋©Äô»L£Ñ½˜Äqæ³àY&u «ï—cKl¦Ž'‚WѰ`–OT2FDZÕBw‘ž9sy¶Sl¥Æ­OÙ—`ATìi¢é>6¶GŠ(N'{ôÙõ5ê´ú%±ö(œ÷ì’Ø€¯‘µˆ‰³(FÔŠ )ƒ³£¨‰Ì•H Æ"Ã…mÃéÐX#1°¶Ô L-Ô£”ÌsRPBU¦‘‘ØÚ¶fš0 [Öõ ®Î‚ÙÕ¢Q¤P2AH=‚kL³¤rb $ ˜1[úP•ûƒª¦¡&¦`#@%<¹´¾ŠcãîTjGƬ ‚),«LP»¥’Ú¦>+ Øj„$UÏÁÂ.Y(ÛÆC«‰#VCêê¶kF¬<¦…¾Z*“f„“Ž¡…¹6&ó]5‚R­Ð@WX0¹+OÓŒ¢áÏ[Ü]9Š*Ç6)GQ:+GáYzt#:!»n„íûvÝ(4ÙLÏuå­äèíÊQX"ÍÚQÒ°í»rÄw#u(GÕeöž]9 · Ûʺr–¨°mª+GPRß”L9ª4¡+Gؼýd½+G¤MWŽ¢g=mRŽøÆõ'uå(Üj;iGPr_V]; 7èê'íˆöÂ¥ìÊQÛOaRŽ T;WWåˆÇù¾óuå(–³+Ga¥$é™d\•03ðÛÊ—¥¿ E€t§<ó4/éÑfÚPý€åïùå?þ×½ð¤ÆÅó¯§×o~ýðêçŸ'++z¯Î·Þ==ßúþzTÞݦ«måÝ­}Æ^ýý§½Ðu¬êÏì¬GæDäk6kdefV¿Þˆ:NÏ™®ô:ã~<–é‡h5·O¢2–ù}"1ˆ‘˜,~Df´c÷ê"3ª€»Mt, †}¤a\€)ødÿë !iÇzÄp£é¼ìüŸoùpyûîª?xœí¼.ëýásVeùé<%Q5¨[‘5‹[†wP,Oéšk§„nb3O î†xâÚ(;W`T;ÚôÄ2qj3?sm”‰Kè”È̵Q&.–$òs¿vÊÄuõÞóHì\ÏÉTršLÃò«ÞÏ©J®í©Jú¹Xª’kÄÌZªRçIOžèÇT%ì>0nB¥ï¯ib¡,†@ûþí¿Sf®èçÎ5(.Uyæê”WïÅÄ5õë‹S•¸E¦S „&÷QÕÚ·^ƒsš,½Ñâ·[_kWÅoûHìޜڵ»èJdz±%álosM™̶HYŠw¬RìjÙ;ü¬<Ÿ©ô4¾*Çüêš–‡ˆV%ñcÅž®GË®EZEV²²J;û>Ø4`¨†¦:÷øˆ«*LDZ0°ƒ¿F;ÜJ}­A´èÒµàmS0 é 1ñ‰ˆ}dF(-‹9qE‰[Õ¼Qøü#€4èR²\õ¼¨AØ\Iº¿¼Af¥;ެ״¶—7¨na8Ñçè…^Ú èî aäù¿ô•“bv¢ƒ»fHÞ—öÐk•'¾r±£¨—6HGœÂM/Þ¯™”–8†e‘VºÅCÒ¬iÐpÚœ”WÌòÖ`¥¯µ =®<¼1K/úlÄ<6n°P6+Ä'‡Põá*·à•™i7E'9…% âuYábÀ=û+fç²bøÚ%ØL˜^!š›¤z†Aš0¨èôÙ’ özÆE‘®qE{°ˆ%4ìÖaÞb¦?qw+!´©Z q_1ÇÌЇ6 âÖ^ý¥ 2—BÃãÃ{ Kìˆoj¥U¿´A¼º,XxAO§˜Q¹9'‹Û¯má?×Ú²†n¤¿T·ÂŒzi=º2²†.FÑó-_²Æ:#«`¨ïJa*2ŠÝ¬új‘ièeg‡ÖzÄ68 °fBÓp(¶)î ’¨V‡8z×<0IÂæÓkÖ$)ÞbÅêr–ZîÁõ (O¯ÏCßð°¤*ÖÅ:›‡NuÊÜ‚}^ˆ‘+A;È#ù—7È’Ž¾©-,+öeß5:ÊÎúü/m0)Œ6°~‚_Ò áàé5–¶+Œ¬DÈWN+6fžoòz¡ež7S =Çé+äÐì5Ù¥®°Ù £´–ˆNK›¾·3ÆñøP‚5e6{[0†{@ ÉN|Á‚FfFM“¬+œFaˆÁã+Ï\Ý Y^h š¯¹àñªItýmûðK§„É<Œl/˜tÉÉ‚Iq…‡¢•OSÕ°À áY»gÄР? úW5ƒ‚N(Óy(V«°H"®Pý<‘ô»™r_—4Èí“NC@K6xt4嘑·Â %\ßU³q\ÍòÒY9‹F7z˜VØHÄXBþÔËs7w»µ^^̬ñ4%üµ§\;e?ÞƒÆ`Õ¤™k£ì\ØŒÌ1=q£L\¬ŽRÂ̵Q&®«¾Î½ɱ#á[¼Ã©#ƒ™[£Xb0½”h‰Á,Uƒ&³VV®‡Z°›áNð¦Ö±í”HèÃ(Hü”‹hAjôN9pUârdæê”™ ž¨‚¯v®A9px©ÞÏ\rà)t‰'®N9põ7š¸¦wüÒüla ”Çä2ÒuF~vÔ2¼–Ÿ‹ïr^^túÇ y@~ÈϾr¥˜Û4caúAÙû;^S®C‘€¾ªG“„%>¯tëÓÃÊ(–š6V>ͦNL¦狧שׁìõ3­¶.oÕ¤ÝJþ“º£èuZ4a¤†ßNêÞûqhêK}Ú_3³5@œ¯†€¶y#HNâ‹üÿ¨Ì¯-=ßýoŽþ7Gÿ›£ÿÍÑÿŒö¾9úßýoŽþ7Gÿ›£ÿ²S+V g³ ~T™`;¢š–œïˆj|–ÜÕzNßÕFOž>ßBT{&iÛͨƒÂ œ)ðÍWÇ7Ê+Æ^îaãê”Ó„Zœ¹:åÀÕ{1qMýz&¢ºÑç̇˪cÖz¿ý¡2Ç©ôëô›p}ÿƒõnŸÿ±ØVÇ è¿j€ížP¦%uK›@ŠÝŽ£Þ?ÏÚäË!Õ¼?KƒE{µ¤3ŸD$ˆÎÇl.šº ãÇ…CyÿÀ‹¹š´ó‡Óÿþ×_OWñˆRÚ¸ C\ ׳q×»o“4 ñÜuSÄ¢/L±^BfúfmŠniúSï>‰'«ï°`›dÁZV…ñA.µ.Á»fMn"ˆÅ·%ˆ\¨gl¥>ò“%¸k2L Ï ][“fCP•0(WL ³ˆ3uobÖŠ ¯•:y&I.IC¦Â}0¤%Øõ ë90w \¿7È…´D‹ó²dí=„ÿA+ßk…ÃHdW‰ª½R] ½XVÆÁãÂö­5Ö—à|=Ì1^*²$ã–ä%4a\¯ÀåÍÍ ‡ üÿEXéˆWÆ¿K`´,X…¡#¶Ò×%s’.ØC¡k¼Âi€¯Õ‘àÖç–tP³¿£Já’¾H|ã,£èKLj›ú¤u9´gWuPªÛ « ¶Œùï »fkP˼­è!«©0ë˜âmmýuÀ×_Ç x¦¹»¯3+ñ@³éô½(ˆ›…¸´ú—g–p$ïf23«q誹Yž¥¬"·i_­ð Ì3-C䙂¥U0¼VÑ¢m\ÎPµ^ì™^4›©YAÒKðÀÐJ5žõyµ (Z€Í³š«¡ª›kD{bÉé#¯˜nOXA¿®!%5 Uu`YX [/î£Hk¾:oÇiÅ&úœöqîUm‚"Ë©†¢]fhMé*åO~ÀªS!E¬ÄSP \ÉÍÆB•™#îyq‚Vk Z·–µ7–UÙ›Q$¸ˆô ?»hil+†±nZáÆó½l÷28­_…ç{+{rƒRì¦ _Jûÿ„ºNXµ4ýšme#~ÅÚ(&Ì¥M¯.ßq×<‘Ï„d3·g”€øŸBXQ‚^²­N4Q8€ÓB{³ö@„3yaâiXY~ =m„G«,Î<aâa˜?Lñ©0ñ_cz¯—Ÿ"ë¢À?Ÿôʃ‰›Iýʃ™£Öú•ú]é7èW%Øú•óü.¤¹ê~ÐÒcž÷§ØeÀ¤‹Q¥ê CºŽN8ð0™1˜:åÀż?ƒÏ ®N9p1·¡ÎLF8ð°„¢F¤6¦N9p½æ~æê”Wç‰k…/âVŸ¢|Áµ¨ãñxÿ›>Ù â<ïéÐgxÅé…“W#Xÿv+¬oØö¥3û6¶½ÓÊÕÆFÜM×6ú±Ç´TÃÌŸ_ߊÉü—)¾õ´ÂK¤|7^jê^ZÝ ¼<)(€¥ÏØá•óŒ;äB%ÇŒÿX>‚Âü|<v5º_{"óÛ”î2¿x´2Ûdè Â>Ùÿ£ÎÙ7ƒ}è ÓŽ`P»ìüîñÕ~YÓs!½Šõ¤9+ÖZ,YŒn~ˆŠÔƒe" Ml–4yaˆ,Öj¥.Yõ¨Q¸É÷’ÁªÆ£MÕª„²NqÅ÷¯E«íÐE,½6'Í#6ìB¿*V€è‰×fµ.‡î‡ÒFEOeÃ>ÜXUÖÊj2/´UGå5',e§×\©ZB×3“±ôr¬f…*mÃð|d¯Í-J.Î40)4k’|¶ŠsLf#^¬/‚Ú,ÜT+KÔ÷Ï‚¤VÊK,{ÌoÕo…×aeÀnèµPÅnKƒi{ôw ºíŒÕZ ·1í r•2O;kºnz uPø3©ƒèÇím›:à]t9Ìê€õyüAð’q+ã=ÔAlÒkI} ¶Ã¬ˆÅíå~M2B —2K†ÞôgÉ€7ázAÀ.øQ B%š§õr‰]2à·D+”>$#è~ЭµQR±K¥0L‚ÁLÑxЈ: FC÷ä šFŽfÁh.Œº¬&ª¿ê,Ì‹5‚±9›`Ô4 Áàò³U3£Æ^ZtŒŠöd–‹: ²Ò©64©ƒ>{4פ…iúXq>µ:M_¡ ô£6}Ôa¡ÎÚ¼Ð+´ê}ú*/hìeØuúªà·Vø·O]g¯>{½qV ´Ï^ã­pnÖæÜ6$Oê¼%¯°“}úx?a±ú‰Ãeà!z›×ukvMÔ4}λ.L}ú¨‰ä0}¬jjÊjLß0·Ùct/IÛg¦©‡1{Îj{N³Gee3<¦ÏÕ:–µ‡5¡¦G°ò´…Àʨ|T‹+cûzÿx÷ww1"ÁÅ”c¯éÜôîŠ%:å™®Ïéßå=Ùáý¹åWÅž6k#­…|7J•´¥^|œ«S\TÆUf®N9p± x 3W§¸z/n÷ëé|}*’€=z¼ÉÁ—³A #ݵ}?„ÆÚh!Ïu"Ý)Ñ ®r$*gÏð>¦q–q½ ÜMd2œ9Z[U˜.WMfÎÿ @^P”¸g%Ó¸?ǪÐ^ôì/ÊìW…÷«Su‘Ð/FݸqF½Êa øÜ¾pк7 F0èõ…ó °[dÉ`ܹ’FÅÛv—€.õ6FMæx‰Òè÷:)eÅÄÞ ¬9Yã Z„2êÁÕ`2¯+f,Z‹ü¬€ÖòÀ 6Á~ÅAu­+UgyÅ驨!NT+é¯XÊ…ÕØƒb?Ö kÅ€8DĸN²£åÃÒ;K¤ÞBæ,Ëí¯(ÕHÀ}M X³òkÚW;‚^¢kh^Pÿg‹-®€È‹ Z,wFŠÁ3ÇuG(°_’lݱ†ÐÝÅsGú ,L]–ôp4È/Œ¡°ìqf¼zåö†²8+ñ«ÖŸÞNŒá/1¹ð¤7WÛýͤèaI*Û}QQ#¿Üê¬7YôÊO‰ì7HÁŸÖ“Þ–Æ-oZ:‰”<¢¯O)¼ªý=lšÚÑû„K¿–£8¡x½žË¢u¢a=éµÛJJÒ»£¼^”¢„¢wûzzÖÁ»ÔÔqýê·jbû£* ¬ÄpxíQÑXyBè»Q‰·ž(O°ºe‘ž¹~í·bߤè!¹>½ÇŠ^yàõ²Ñ~W“³cø²Ý»äôò4ÏKc’Ý7’o7ð¼{Æ.£P„£ÝŠý ™Ñ^%èîE¸z"°l.zd¢Á»lÌó»bƒÀþ¬h—Ñþ½Ž…¯ÊãÄ¥ùÜ8ñú3VxÆüÇ2¼9=7fñµ ·M\¢ë'Êzj¬§á¾‡È˜ŒïçÉNÛó<Îg<‘i½!]•ÊFÁ{,J^¸£W¸ôsÕ^ðþôøîžF ¦ôüÛÛW_Ÿþë͇?Ÿøõûcö§ž åÏëe€ù¹ŒÃñò,xéÇÿðæþÁцçpþ?gˆUÍçßîüù= V¡OçÇû‡ÈiX}âûÛý÷v:Öæg'J8¦ÝÙ©ØN?|;}þeúüaú|áçÔ`±ÈÿÝþÙ*a~ªðjÊj=¿ú¹×?t,‰zfÇÞO{œè¿^w~îäqZ„xè +U¨Ö?µà-ô™ÿñq ¡endstream endobj 175 0 obj << /Filter /FlateDecode /Length 1123 >> stream xœµW[c5 ~¯øG¼"âÜNò€@€xÔ·–v¦[©·íÌrù÷عœ:§§e$XU급ã|¶?;ž÷’Ð)ú”¿«ýLu›Ùû¤Õ®üYí»o–³/Ó•ÆzÝ-ŸfùtÁIe"t½écè–ûÙñý|¡¤‹1ô½8Î Ê ÅŸó…v(ª(ÖÇ"‹H©”§·t**PQ‹g’ûbp$“rA¥-ˆ3É6FÛk±I¢mć=ûñH²Q Á‰ÃÜ€Œdñ…iTë!4Ë¡²âTn ^Ccp½e+~úAðól ÅŠ{°cÇwcÐ:FF¬óY¥zÁoK¾([Ðüà™­jh£5õV!6·þ]ÃÄïƒõ²0§]žAæÎ7Д|Æ`¼øú²þÛòGbt€™q.1Ëhi½ŠÝò§Ùòó7â礭0â .”«‰\%‘A)‡Ù8—+l´ùjˆTH Ö€¿ÐZF‚¹læ’G¨Ágx}š!‹Ö„Á ¥<̵'‹:EJ#˜f›cÚÜÆ;ñÙÓ×#s9IÊäÝÖgÌÄuRòÚ¹æÀ'´÷‹ß\g(*½ayKgxÜÞ%n ­ätDž se°Ö—k¬ìÓØ¹"?2yÍämv:kÅŠ­¿0Y^ä)>`{(k‚¿½@Î(&Ü_1™»»cgKÎúÐ7*Ç1 &"›`oŠH‘oDd* ÖHå͇/¹Õè‡oøötÃi˜sq:Æ›±Ûç:Cj›è½øƒ©%úèkÓ^¯¥ º[à+a­‡ ´¢PØHßÂ4¬ÁVjÊöŠÛei’ª­ì-ÔöðÝ> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 177 /ID [<79e81ca1cc92aef896ff9a1fce348ef1><5988baab1faf09e489a1a7dda8f36f2f>] >> stream xœcb&F~0ù‰ $À8Jò?ƒû ›í7(_yŽÆàP#ÿ3(°‚b+w† Ræ4ˆí‘âû@$»ˆ*‹‘¦A¤ÔZ É b3–€ÉÉT"¹&€H9 ÉÊ"Ù®HAW.ù_ 6 ˆdæ‘Ú< ’cHV,²–aœm endstream endobj startxref 207580 %%EOF plotmo/inst/doc/index.html0000644000176200001440000000107513300570625015307 0ustar liggesusers plotmo

Documents for the plotmo package

plotmo

Plotting regression surfaces with plotmo

plotres

Plotting model residuals with plotres

Guidelines for S3 Regression Models

Guidelines for S3 Regression Models    How to build S3 regression models that are compatible with plotmo and similar functions. plotmo/inst/slowtests/0000755000176200001440000000000015126336467014625 5ustar liggesusersplotmo/inst/slowtests/test.non.earth.bat0000755000176200001440000000162015124635472020165 0ustar liggesusers@rem test.non.earth.bat: test plotmo on non-earth models @rem Stephen Milborrow, Basley KwaZulu-Natal Mar 2011 @echo test.non.earth.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.non.earth.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.non.earth.Rout: @echo. @tail test.non.earth.Rout @echo test.non.earth.R @exit /B 1 :good1 mks.diff test.non.earth.Rout test.non.earth.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.non.earth.save.ps @exit /B 1 :good2 @rem test.non.earth.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.non.earth.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.non.earth.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/modguide.model1.R0000644000176200001440000000447613725307662017736 0ustar liggesusers# modguide.model1.R: # # linmod code from Friedrich Leisch "Creating R Packages: A Tutorial" linmodEst <- function(x, y) { ## compute QR-decomposition of x qx <- qr(x) ## compute (x'x)^(-1) x'y coef <- solve.qr(qx, y) ## degrees of freedom and standard deviation of residuals df <- nrow(x)-ncol(x) sigma2 <- sum((y - x%*%coef)^2)/df ## compute sigma^2 * (x'x)^-1 vcov <- sigma2 * chol2inv(qx$qr) colnames(vcov) <- rownames(vcov) <- colnames(x) list(coefficients = coef, vcov = vcov, sigma = sqrt(sigma2), df = df) } print.linmod <- function(x, ...) { cat("Call:\n") print(x$call) cat("\nCoefficients:\n") print(x$coefficients) } summary.linmod <- function(object, ...) { se <- sqrt(diag(object$vcov)) tval <- coef(object) / se TAB <- cbind(Estimate = coef(object), StdErr = se, t.value = tval, p.value = 2*pt(-abs(tval), df=object$df)) res <- list(call=object$call, coefficients=TAB) class(res) <- "summary.linmod" res } print.summary.linmod <- function(x, ...) { cat("Call:\n") print(x$call) cat("\n") printCoefmat(x$coefficients, P.value=TRUE, has.Pvalue=TRUE) } linmod <- function(x, ...) UseMethod("linmod") linmod.default <- function(x, y, ...) { x <- as.matrix(x) y <- as.numeric(y) est <- linmodEst(x, y) est$fitted.values <- as.vector(x %*% est$coefficients) est$residuals <- y - est$fitted.values est$call <- match.call() class(est) <- "linmod" est } linmod.formula <- function(formula, data=list(), ...) { mf <- model.frame(formula=formula, data=data) x <- model.matrix(attr(mf, "terms"), data=mf) y <- model.response(mf) est <- linmod.default(x, y, ...) est$call <- match.call() est$formula <- formula est } predict.linmod <- function(object, newdata=NULL, ...) { if(is.null(newdata)) y <- fitted(object) else{ if(!is.null(object$formula)){ ## model has been fitted using formula interface x <- model.matrix(object$formula, newdata) } else{ x <- newdata } y <- as.vector(x %*% coef(object)) } y } plotmo/inst/slowtests/test.partdep.Rout.save0000644000176200001440000002437514770452327021063 0ustar liggesusers> # partdep.test.R: partdep tests for plotmo and plotres > > source("test.prolog.R") > library(plotmo) Loading required package: Formula Loading required package: plotrix > library(earth) > data(etitanic) > > mod <- earth(survived~., data=etitanic, degree=2) > > plotmo(mod, caption="plotmo classical") plotmo grid: pclass sex age sibsp parch 3rd male 28 0 0 > > plotmo(mod, pmethod="partdep", caption="plotmo partdep age") calculating partdep for pclass calculating partdep for sex calculating partdep for age calculating partdep for pclass:sex 01234567890 calculating partdep for pclass:sibsp 01234567890 calculating partdep for sex:age 0123456790 > > set.seed(2016) > plotmo(mod, pmethod="apartdep", caption="plotmo apartdep age", do.par=2) calculating apartdep for pclass calculating apartdep for sex calculating apartdep for age calculating apartdep for pclass:sex 01234567890 calculating apartdep for pclass:sibsp 01234567890 calculating apartdep for sex:age 0123456790 > > set.seed(2016) > plotmo(mod, pmethod="apartdep", ylim=c(0,1), do.par=0, + type2="image", pt.col=ifelse(etitanic$survived, "green", "red"), + degree1=0, degree2=1:3) calculating apartdep for pclass:sex 01234567890 calculating apartdep for pclass:sibsp 01234567890 calculating apartdep for sex:age 0123456790 > par(org.par) > > # compare to gbm with an artifical function of variables with a very strong interaction > library(gbm) Loaded gbm 2.2.2 This version of gbm is no longer under development. Consider transitioning to gbm3, https://github.com/gbm-developers/gbm3 > n <- 250 > set.seed(2016) > x1 <- runif(n) > x2 <- runif(n) > x3 <- runif(n) > y <- ifelse(x2 > .6, x1-.2, ifelse(x2 > .4, 1 - 1.5 * x1, .3)) + .1 * sin(4 * x3) > data <- data.frame(x1=x1, x2=x2, x3=x3, y=y) > n.trees <- 20 > set.seed(2016) > mod <- gbm(y~., data=data, n.trees=n.trees, shrinkage=.1, + distribution="gaussian", interact=5) > plotmo(mod, degree1=0, persp.ticktype="detailed", + caption="variables with a strong interaction") > par(mfrow=c(4,4), mar=c(2,3,2,1), mgp=c(1.5, 0.5, 0), oma=c(0,0,6,0)) > library(viridis); Loading required package: viridisLite > image.col <- viridis(100) > ngrid1 <- 50 > ngrid2 <- 30 > plotmo(mod, pmethod="plot", do.par=0, degree2=2, type2="im", ylim=NULL, + clip=FALSE, image.col=image.col, ngrid1=ngrid1, ngrid=ngrid2) plotmo grid: x1 x2 x3 0.5048516 0.4915547 0.5632489 > title("row1: plotmo classic\nrow2: plotmo apartdep\nrow3: plotmo partdep\nrow4: plot.gbm\n\n\n\n\n\n\n", xpd=NA) > ylim <- c(.21, .40) > set.seed(2016) # for consistent selection of rows for partdep.x > plotmo(mod, pmethod="apartdep", do.par=0, degree2=2, type2="im", ylim=ylim, + clip=FALSE, image.col=image.col, ngrid1=ngrid1, ngrid=ngrid2) calculating apartdep for x1 calculating apartdep for x2 calculating apartdep for x3 calculating apartdep for x1:x3 01234567890 > plotmo(mod, pmethod="partdep", do.par=0, degree2=2, type2="im", ylim=ylim, + clip=FALSE, image.col=image.col, ngrid1=ngrid1, ngrid=ngrid2, + trace=-1) # check that the pacifier messages are suppressed > plot(mod, i.var=1, n.trees=n.trees, ylim=ylim, continuous.resolution=ngrid1) > plot(mod, i.var=2, n.trees=n.trees, ylim=ylim, continuous.resolution=ngrid1) > plot(mod, i.var=3, n.trees=n.trees, ylim=ylim, continuous.resolution=ngrid1) > # following ignores par(mfrow=c(2,2)) > plot(mod, i.var=c(1,3), n.trees=n.trees, continuous.resolution=ngrid2, + col.regions=image.col, colorkey=FALSE, + main="gbm plot x1:x3\ncompare to plotmo partdep on previous page") > par(org.par) > > #--- compare to gbm and randomForest with a simple regression function > > data(scor, package="bootstrap") # some correlated data > n <- 50 > x1 <- scale(scor$mec[1:n]) > x2 <- scale(scor$vec[1:n]) > data <- data.frame(x1=x1, x2=x2) > > ngrid1 <- 100 > > # randomForest, simple regression function > library(randomForest) randomForest 4.7-1.2 Type rfNews() to see new features/changes/bug fixes. > data$y <- x1 > -.1 # y depends only on x1 (-.1 hand-tuned to create interesting model surface) > set.seed(2016) > # Expect Warning: The response has five or fewer unique values. Are you sure you want to do regression? > mod <- randomForest(y~., data=data, ntree=3) Warning in randomForest.default(m, y, ...) : The response has five or fewer unique values. Are you sure you want to do regression? > par(mfrow=c(4,2), mar=c(2.5,3,2,1), mgp=c(1.3,0.4,0), oma=c(0,0,7,0)) > set.seed(2016) # for consistent jitter of response sites > plotmo(mod, degree1=0, ngrid2=100, do.par=0, clip=FALSE, + type2="image", main="regression surface", + pt.col=ifelse(data$y, "green", "red")) > title("RANDOM FOREST SIMPLE REGRESSION MODEL + row1: regression surface + row2: plotmo classic type=response + row3: plotmo partdep type=response + row4: randomForest plot\n\n\n\n\n\n\n", + xpd=NA, adj=0) > plotmo(mod, degree1=0, ngrid2=100, do.par=0, clip=FALSE, + persp.border=NA, main="regression surface") > plotmo(mod, pmethod="plotmo", do.par=0, degree2=0, ngrid1=ngrid1, + type="response") plotmo grid: x1 x2 -0.03826182 0.05194756 > plotmo(mod, pmethod="partdep", do.par=0, degree2=0, ngrid1=ngrid1, + type="response") calculating partdep for x1 calculating partdep for x2 > partialPlot(mod, pred.data=data, x.var="x1", n.pt=ngrid1, + which.class="True") > partialPlot(mod, pred.data=data, x.var="x2", n.pt=ngrid1, + which.class="True") > par(org.par) > > # gbm, simple regression function > library(gbm) > n.trees <- 20 > data$y <- x1 > -.6 # y depends only on x1 (-.1 hand-tuned to create interesting model surface) > set.seed(2016) > mod <- gbm(y~., data=data, n.trees=n.trees, + shrinkage=.1, interaction.depth=4, + distribution="gaussian") > par(mfrow=c(4,2), mar=c(2.5,3,2,1), mgp=c(1.3,0.4,0), oma=c(0,0,7,0)) > set.seed(2016) # for consistent jitter of response sites > plotmo(mod, degree1=0, ngrid2=100, do.par=0, clip=FALSE, + type2="image", main="regression surface", + pt.col=ifelse(data$y, "green", "red")) > title("GBM SIMPLE REGRESSION MODEL + row1: regression surface + row2: plotmo classic type=response + row3: plotmo partdep type=response + row4: gbm plot\n\n\n\n\n\n\n", + xpd=NA, adj=0) > plotmo(mod, degree1=0, ngrid2=100, do.par=0, clip=FALSE, + persp.border=NA, main="regression surface") > plotmo(mod, pmethod="plotmo", do.par=0, all1=TRUE, degree2=0, + ngrid1=ngrid1, type="response") plotmo grid: x1 x2 -0.03826182 0.05194756 > plotmo(mod, pmethod="partdep", do.par=0, all1=TRUE, degree2=0, + ngrid1=ngrid1, type="response") calculating partdep for x1 calculating partdep for x2 > plot(mod, i.var=1, n.trees=n.trees, continuous.resolution=ngrid1) > plot(mod, i.var=2, n.trees=n.trees, continuous.resolution=ngrid1) > par(org.par) > > #--- compare to gbm and randomForest with simple binomial (two class) data > > data(scor, package="bootstrap") # some correlated data > n <- 50 > x1 <- scale(scor$mec[1:n]) > x2 <- scale(scor$vec[1:n]) > data <- data.frame(x1=x1, x2=x2) > > ngrid1 <- 100 > > # randomForest, simple binomial (two-class) data > library(randomForest) > # y depends only on x1 > # random forest requires a factor for classification (not a logical) > data$y <- factor(as.character(x1 > .4), + levels=c("FALSE", "TRUE"), + labels=c("False", "True")) > set.seed(2016) > mod <- randomForest(y~., data=data, ntree=3) > par(mfrow=c(4,2), mar=c(2.5,3,2,1), mgp=c(1.3,0.4,0), oma=c(0,0,7,0)) > set.seed(2016) # for consistent jitter of response sites > plotmo(mod, degree1=0, ngrid2=100, do.par=0, clip=FALSE, + type2="image", main="regression surface", + pt.col=ifelse(data$y=="True", "green", "red")) > title("RANDOM FOREST SIMPLE TWO-CLASS MODEL + row1: regression surface + row2: plotmo partdep type=response (FALSE or TRUE) + row3: plotmo partdep type=prob + row4: randomForest partialPlot (clipped log odds)\n\n\n\n\n\n\n", + xpd=NA, adj=0) > plotmo(mod, degree1=0, ngrid2=100, do.par=0, clip=FALSE, + persp.border=NA, main="regression surface") > > plotmo(mod, pmethod="partdep", do.par=0, degree2=0, ngrid1=ngrid1, + type="response") calculating partdep for x1 calculating partdep for x2 > plotmo(mod, pmethod="partdep", do.par=0, degree2=0, ngrid1=ngrid1, + type="prob", nresponse="True", ylim=c(0,1)) calculating partdep for x1 calculating partdep for x2 > partialPlot(mod, pred.data=data, x.var="x1", n.pt=ngrid1, + which.class="True", ylim=c(-16,16)) > partialPlot(mod, pred.data=data, x.var="x2", n.pt=ngrid1, + which.class="True", ylim=c(-16,16)) > par(org.par) > > # gbm, simple binomial (two-class) data > library(gbm) > n.trees <- 10 > data$y <- as.numeric(x1 > .6) # y depends only on x1 > set.seed(2016) > mod <- gbm(y~., data=data, n.trees=n.trees, shrinkage=.1, interact=4, + distribution="bernoulli") > par(mfrow=c(4,2), mar=c(2.5,3,2,1), mgp=c(1.3,0.4,0), oma=c(0,0,7,0)) > set.seed(2016) # for consistent jitter of response sites > plotmo(mod, degree1=0, ngrid2=100, do.par=0, clip=FALSE, + type2="image", main="regression surface", + pt.col=ifelse(data$y, "green", "red")) > title("GBM SIMPLE TWO-CLASS MODEL + row1: regression surface + row2: plotmo partdep type=response (probability) + row4: plotmo partdep type=link (log odds) + row3: gbm plot (log odds)\n\n\n\n\n\n\n", + xpd=NA, adj=0) > plotmo(mod, degree1=0, ngrid2=100, do.par=0, clip=FALSE, + persp.border=NA, main="regression surface") > plotmo(mod, pmethod="partdep", do.par=0, all1=TRUE, degree2=0, + ngrid1=ngrid1, type="response") calculating partdep for x1 calculating partdep for x2 > plotmo(mod, pmethod="partdep", do.par=0, all1=TRUE, degree2=0, + ngrid1=ngrid1, type="link") calculating partdep for x1 calculating partdep for x2 > plot(mod, i.var=1, n.trees=n.trees, continuous.resolution=ngrid1) > plot(mod, i.var=2, n.trees=n.trees, continuous.resolution=ngrid1) > par(org.par) > > source("test.epilog.R") plotmo/inst/slowtests/test.printcall.bat0000755000176200001440000000077015124635472020266 0ustar liggesusers@rem test.printcall.R: test printcall @echo test.printcall.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.printcall.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.printcall.Rout: @echo. @tail test.printcall.Rout @echo test.printcall.R @exit /B 1 :good1 mks.diff test.printcall.Rout test.printcall.Rout.save @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.printcall.Rout @exit /B 0 plotmo/inst/slowtests/test.linmod.R0000644000176200001440000017737314242001333017205 0ustar liggesusers# test.linmod.R: test example S3 model at http://www.milbo.org/doc/linmod.R source("test.prolog.R") source("linmod.R") # linear model code (http://www.milbo.org/doc/linmod.R) source("linmod.methods.R") # additional method functions for linmod options(warn=1) # print warnings as they occur almost.equal <- function(x, y, max=1e-8) { stopifnot(max >= 0 && max < .01) length(x) == length(y) && max(abs(x - y)) < max } # check that linmod model matches reference lm model in all essential details check.lm <- function(fit, ref, newdata=trees[3:5,], check.coef.names=TRUE, check.casenames=TRUE, check.newdata=TRUE, check.sigma=TRUE) { check.names <- function(fit.names, ref.names) { if(check.casenames && # lm always adds rownames even if "1", "2", "3": this seems # wasteful and not particulary helpful, so linmod doesn't do # this, hence the first !isTRUE(all.equal) below !isTRUE(all.equal(ref.names, paste(1:length(ref.names)))) && !isTRUE(all.equal(fit.names, ref.names))) { print(fit.names) print(ref.names) stop(deparse(substitute(fit.names)), " != ", deparse(substitute(ref.names))) } } cat0("check ", deparse(substitute(fit)), " vs ", deparse(substitute(ref)), "\n") stopifnot(coef(fit) == coef(ref)) if(check.coef.names) stopifnot(identical(names(coef(fit)), names(coef(ref)))) stopifnot(identical(dim(fit$coefficients), dim(ref$coefficients))) stopifnot(length(fit$coefficients) == length(ref$coefficients)) stopifnot(almost.equal(fit$coefficients, ref$coefficients)) stopifnot(identical(dim(fit$residuals), dim(ref$residuals))) stopifnot(length(fit$residuals) == length(ref$residuals)) stopifnot(almost.equal(fit$residuals, ref$residuals)) stopifnot(identical(dim(fit$fitted.values), dim(ref$fitted.values))) stopifnot(length(fit$fitted.values) == length(ref$fitted.values)) stopifnot(almost.equal(fit$fitted.values, ref$fitted.values)) stopifnot(identical(fit$rank, ref$rank)) if(!is.null(fit$vcov) && !is.null(ref$vcov)) { stopifnot(identical(dim(fit$vcov), dim(ref$vcov))) stopifnot(length(fit$vcov) == length(ref$vcov)) stopifnot(almost.equal(fit$vcov, ref$vcov)) } if(check.sigma) { ref.sigma <- ref$sigma if(is.null(ref.sigma)) # in lm models, sigma is only available from summary() ref.sigma <- summary(ref)$sigma stopifnot(almost.equal(fit$sigma, ref.sigma)) } stopifnot(almost.equal(fit$df.residual, ref$df.residual)) stopifnot(almost.equal(fitted(fit), fitted(ref))) check.names(names(fitted(fit)), names(fitted(ref))) stopifnot(almost.equal(residuals(fit), residuals(ref))) check.names(names(residuals(fit)), names(residuals(ref))) stopifnot(almost.equal(predict(fit), predict(ref))) check.names(names(predict(fit)), names(predict(ref))) if(check.newdata) { stopifnot(almost.equal(predict(fit, newdata=newdata), predict(ref, newdata=newdata))) check.names(names(predict(fit, newdata=newdata)), names(predict(ref, newdata=newdata))) } } tr <- trees # trees data but with rownames rownames(tr) <- paste("tree", 1:nrow(trees), sep="") linmod.form.Volume.tr <- linmod(Volume~., data=tr) cat0("==print(summary(linmod.form.Volume.tr))\n") print(summary(linmod.form.Volume.tr)) lm.Volume.tr <- lm(Volume~., data=tr) check.lm(linmod.form.Volume.tr, lm.Volume.tr) stopifnot(almost.equal(predict(linmod.form.Volume.tr, newdata=data.frame(Girth=10, Height=80)), 16.234045, max=1e-5)) stopifnot(almost.equal(predict(linmod.form.Volume.tr, newdata=as.matrix(tr[1:3,])), c(4.8376597, 4.5538516, 4.8169813), max=1e-5)) # character new data (instead of numeric) newdata.allchar <- as.data.frame(matrix("blank", ncol=3, nrow=3)) colnames(newdata.allchar) <- colnames(trees) expect.err(try(predict(lm.Volume.tr, newdata=newdata.allchar)), "variables 'Girth', 'Height' were specified with different types from the fit") expect.err(try(predict(linmod.form.Volume.tr, newdata=newdata.allchar)), "variables 'Girth', 'Height' were specified with different types from the fit") linmod.xy.Volume.tr <- linmod(tr[,1:2], tr[,3,drop=FALSE]) # x=data.frame y=data.frame cat0("==print(summary(linmod.xy.Volume.tr))\n") print(summary(linmod.xy.Volume.tr)) newdata.2col <- trees[3:5,1:2] check.lm(linmod.xy.Volume.tr, lm.Volume.tr, newdata=newdata.2col) stopifnot(almost.equal(predict(linmod.xy.Volume.tr, newdata=data.frame(Girth=10, Height=80)), 16.234045, max=1e-5)) stopifnot(almost.equal(predict(linmod.xy.Volume.tr, newdata=tr[1:3,1:2]), c(4.8376597, 4.5538516, 4.8169813), max=1e-5)) linmod50.xy.Volume.tr <- linmod(as.matrix(tr[,1:2]), as.matrix(tr[,3,drop=FALSE])) # x=matrix y=matrix check.lm(linmod50.xy.Volume.tr, lm.Volume.tr, newdata=newdata.2col) linmod51.xy.Volume.tr <- linmod(tr[,1:2], tr[,3]) # x=data.frame y=vector check.lm(linmod51.xy.Volume.tr, lm.Volume.tr, newdata=newdata.2col) linmod52.xy.Volume.tr <- linmod(as.matrix(tr[,1:2]), tr[,3]) # x=matrix y=vector check.lm(linmod52.xy.Volume.tr, lm.Volume.tr, newdata=newdata.2col) # newdata can be a vector stopifnot(almost.equal(predict(linmod.xy.Volume.tr, newdata=c(8.3, 70)), 4.8376597, max=1e-5)) stopifnot(almost.equal(predict(linmod.xy.Volume.tr, newdata=c(8.3, 8.6, 70, 65)), # 4 element vector, byrow=FALSE c(4.8376597, 4.5538516), max=1e-5)) options(warn=1) # print warnings as they occur # expect Warning: data length [3] is not a sub-multiple or multiple of the number of rows [2] stopifnot(almost.equal(predict(linmod.xy.Volume.tr, newdata=c(8.3, 9, 70)), # 3 element vector c(4.8376597, -12.7984291), max=1e-5)) options(warn=2) # treat warnings as errors stopifnot(almost.equal(predict(linmod.xy.Volume.tr, newdata=as.matrix(data.frame(Girth=10, Height=80))), 16.234045, max=1e-5)) # column names in newdata are ignored for linmod.default models stopifnot(almost.equal(predict(linmod.xy.Volume.tr, newdata=data.frame(name1.not.in.orig.data=10, name2.not.in.orig.datax2=80)), 16.234045, max=1e-5)) # note name reversed below but names still ignored, same predict result as c(Girth=10, Height=80) stopifnot(almost.equal(predict(linmod.xy.Volume.tr, newdata=data.frame(Height=10, Girth=80)), 16.234045, max=1e-5)) cat0("==print.default(linmod.form.Volume.tr)\n") print.default(linmod.form.Volume.tr) cat0("==check single x variable\n") linmod1a.form <- linmod(Volume~Height, data=tr) cat0("==print(summary(linmod1a.form))\n") print(summary(linmod1a.form)) lma.tr <- lm(Volume~Height, data=tr) check.lm(linmod1a.form, lma.tr) stopifnot(almost.equal(predict(linmod1a.form, newdata=data.frame(Height=80)), 36.34437, max=1e-5)) stopifnot(almost.equal(predict(linmod1a.form, newdata=data.frame(Girth=99, Height=80)), 36.34437, max=1e-5)) stopifnot(almost.equal(predict(linmod1a.form, newdata=as.matrix(tr[1:3,])), c(20.91087, 13.19412, 10.10742), max=1e-5)) linmod1a.xy <- linmod(tr[,2,drop=FALSE], tr[,3]) cat0("==print(summary(linmod1a.xy))\n") print(summary(linmod1a.xy)) check.lm(linmod1a.xy, lma.tr, newdata=trees[3:5,2,drop=FALSE]) check.lm(linmod1a.xy, lma.tr, newdata=trees[3:5,2,drop=TRUE], check.newdata=FALSE) # needed because predict.lm gives 'data' must be a data.frame, environment, or list stopifnot(almost.equal(predict(linmod1a.xy, newdata=trees[3:5,2,drop=FALSE]), predict(linmod1a.xy, newdata=trees[3:5,2,drop=TRUE]))) stopifnot(almost.equal(predict(linmod1a.xy, newdata=data.frame(Height=80)), 36.34437, max=1e-5)) stopifnot(almost.equal(predict(linmod1a.xy, newdata=tr[1:3,2]), c(20.91087, 13.19412, 10.10742), max=1e-5)) stopifnot(almost.equal(predict(linmod1a.xy, newdata=as.matrix(data.frame(Height=80))), 36.34437, max=1e-5)) # check that extra fields in predict newdata are ok with formula models stopifnot(almost.equal(predict(linmod.form.Volume.tr, newdata=data.frame(Girth=10, Height=80, extra=99)), predict(lm.Volume.tr, newdata=data.frame(Girth=10, Height=80)))) stopifnot(almost.equal(predict(linmod.form.Volume.tr, newdata=data.frame(Girth=10, Height=80, extra=99)), predict(lm.Volume.tr, newdata=data.frame(Girth=10, Height=80, extra=99)))) # check that extra fields in predict newdata are not ok with x,y models expect.err(try(predict(linmod.xy.Volume.tr, newdata=data.frame(Girth=10, Height=80, extra=99))), "ncol(newdata) is 3 but should be 2") # missing variables in newdata expect.err(try(predict(linmod.form.Volume.tr, newdata=data.frame(Girth=10))), "object 'Height' not found") expect.err(try(predict(linmod.form.Volume.tr, newdata=c(8.3, 70))), "object 'Girth' not found") expect.err(try(predict(lm.Volume.tr, newdata=data.frame(Girth=10))), "object 'Height' not found") expect.err(try(predict(linmod.xy.Volume.tr, newdata=data.frame(Girth=10))), "ncol(newdata) is 1 but should be 2") # check that rownames got propagated stopifnot(names(linmod.form.Volume.tr$residuals)[1] == "tree1") stopifnot(names(linmod.form.Volume.tr$fitted.values)[3] == "tree3") stopifnot(names(linmod.xy.Volume.tr$residuals)[1] == "tree1") stopifnot(names(linmod.xy.Volume.tr$fitted.values)[3] == "tree3") stopifnot(!is.null(names(linmod.xy.Volume.tr$residuals))) stopifnot(!is.null(names(linmod.xy.Volume.tr$fitted.values))) cat0("==print.default(linmod.xy.Volume.tr)\n") print.default(linmod.xy.Volume.tr) # check that we don't artificially add rownames when no original rownames linmod1a.xy <- linmod(trees[,1:2], trees[,3]) stopifnot(is.null(names(linmod1a.xy$residuals))) stopifnot(is.null(names(linmod1a.xy$fitted.values))) cat0("==example plots\n") library(plotmo) data(trees) linmod.form.Volume.trees <- linmod(Volume~., data=trees) print(linmod.form.Volume.trees) print(summary(linmod.form.Volume.trees)) linmod1.xy <- linmod(trees[,1:2], trees[,3]) print(linmod1.xy) print(summary(linmod1.xy)) plotmo(linmod.form.Volume.trees) plotmo(linmod1.xy) plotres(linmod.form.Volume.trees) plotres(linmod1.xy) cat0("==test keep arg\n") trees1 <- trees linmod.form.Volume.trees.keep <- linmod(Volume~., data=trees1, keep=TRUE) print(summary(linmod.form.Volume.trees.keep)) print(head(linmod.form.Volume.trees.keep$data)) stopifnot(dim(linmod.form.Volume.trees.keep$data) == c(nrow(trees1), ncol(trees1))) trees1 <- NULL # destroy orginal data so plotmo has to use keep data plotmo(linmod.form.Volume.trees.keep, pt.col=3) plotres(linmod.form.Volume.trees.keep) linmod.xy.keep <- linmod(trees[,1:2], trees[,3], keep=TRUE) print(summary(linmod.xy.keep)) print(head(linmod.xy.keep$x)) stopifnot(dim(linmod.xy.keep$x) == c(nrow(trees), 2)) stopifnot(class(linmod.xy.keep$x)[1] == "matrix") print(head(linmod.xy.keep$y)) stopifnot(dim(linmod.xy.keep$y) == c(nrow(trees), 1)) stopifnot(class(linmod.xy.keep$y)[1] == "matrix") linmod.xy.keep$call <- NULL # trick to force use of x and y in plotmo plotmo(linmod.xy.keep, pt.col=3) plotres(linmod.xy.keep) check.lm(linmod.form.Volume.trees.keep, linmod.xy.keep, check.casenames=FALSE, check.newdata=FALSE) cat0("==test keep arg with vector x\n") n <- 20 linmod.vecx.form.keep <- linmod(Volume~Height, data=trees[1:n,], keep=TRUE) print(summary(linmod.vecx.form.keep)) print(head(linmod.vecx.form.keep$data)) stopifnot(dim(linmod.vecx.form.keep$data) == c(n, ncol(trees))) stopifnot(class(linmod.vecx.form.keep$data) == class(trees)) plotmo(linmod.vecx.form.keep, pt.col=3) plotres(linmod.vecx.form.keep) linmod.vecx.xy.keep <- linmod(trees[1:n,2], trees[1:n,3], keep=TRUE) print(summary(linmod.vecx.xy.keep)) print(head(linmod.vecx.xy.keep$x)) stopifnot(dim(linmod.vecx.xy.keep$x) == c(n, 1)) stopifnot(class(linmod.vecx.xy.keep$x)[1] == "matrix") print(head(linmod.vecx.xy.keep$y)) stopifnot(dim(linmod.vecx.xy.keep$y) == c(n, 1)) stopifnot(class(linmod.vecx.xy.keep$y)[1] == "matrix") linmod.vecx.xy.keep$call <- NULL # trick to force use of x and y in plotmo plotmo(linmod.vecx.xy.keep, pt.col=3) plotres(linmod.vecx.xy.keep) check.lm(linmod.vecx.form.keep, linmod.vecx.xy.keep, newdata=trees[3:5,2,drop=FALSE], check.coef.names=FALSE, check.casenames=FALSE) cat0("==test model building with assorted numeric args\n") x <- tr[,1:2] y <- tr[,3] cat0("class(x)=", class(x), " class(y)=", class(y), "\n") # class(x)=data.frame class(y)=numeric linmod2.xy <- linmod(x, y) check.lm(linmod2.xy, lm.Volume.tr, newdata=newdata.2col) # check consistency with lm expect.err(try(linmod(y~x)), "invalid type (list) for variable 'x'") expect.err(try(lm(y~x)), "invalid type (list) for variable 'x'") linmod3.xy <- linmod(as.matrix(x), as.matrix(y)) check.lm(linmod3.xy, lm.Volume.tr, newdata=newdata.2col) linmod4.form <- linmod(y ~ as.matrix(x)) lm4 <- lm(y ~ as.matrix(x)) check.lm(linmod4.form, lm4, check.newdata=FALSE) stopifnot(coef(linmod4.form) == coef(lm.Volume.tr), gsub("as.matrix(x)", "", names(coef(linmod4.form)), fixed=TRUE) == names(coef(lm.Volume.tr))) xm <- as.matrix(x) cat0("class(xm)=", class(xm), " class(y)=", class(y), "\n") # class(xm)=matrix class(y)=numeric linmod5.form <- linmod(y ~ xm) lm5 <- lm(y ~ xm) check.lm(linmod5.form, lm5, check.newdata=FALSE) stopifnot(coef(linmod5.form) == coef(lm.Volume.tr), gsub("xm", "", names(coef(linmod5.form)), fixed=TRUE) == names(coef(lm.Volume.tr))) cat0("==test correct use of global x1 and y1, and of predict error handling\n") x1 <- tr[,1] y1 <- tr[,3] cat0("class(x1)=", class(x1), " class(y1)=", class(y1), "\n") # class(x1)=numeric class(y1)=numeric linmod.y1.x1 <- linmod(y1~x1) lm1 <- lm(y1~x1) linmod6.xy <- linmod(x1, y1) newdata.x1 <- trees[3:5,1,drop=FALSE] colnames(newdata.x1) <- "x1" stopifnot(almost.equal(predict(linmod.y1.x1, newdata=newdata.x1), c(7.63607739644657, 16.24803331528098, 17.26120459984973))) check.lm(linmod6.xy, linmod.y1.x1, newdata=x1[3:5], check.newdata=FALSE, # TODO needed because linmod.y1.x1 ignores newdata(!) check.coef.names=FALSE, check.casenames=FALSE) print(predict(linmod6.xy, newdata=x1[3:5])) stopifnot(almost.equal(predict(linmod6.xy, newdata=x1[3]), 7.63607739644657)) stopifnot(coef(linmod6.xy) == coef(linmod.y1.x1)) # names(coef(linmod.y1.x1) are "(Intercept)" "x1" stopifnot(names(coef(linmod6.xy)) == c("(Intercept)", "V1")) # following checks some confusing behaviour of predict.lm options(warn=2) # treat warnings as errors expect.err(try(predict(lm1, newdata=trees[3:5,1,drop=FALSE])), "'newdata' had 3 rows but variables found have 31 rows") expect.err(try(predict(lm1, newdata=trees[3:5,1,drop=TRUE])), "'data' must be a data.frame, environment, or list") # following checks messages when missing variables in newdata options(warn=2) # treat warnings as errors to check that we get a warning in stats::model.frame expect.err(try(predict(linmod.y1.x1, newdata=trees[3:5,1,drop=FALSE])), "(converted from warning) 'newdata' had 3 rows but variables found have 31 rows") expect.err(try(predict(lm1, newdata=trees[3:5,1,drop=FALSE])), "(converted from warning) 'newdata' had 3 rows but variables found have 31 rows") expect.err(try(predict(linmod.y1.x1, newdata=trees[3:5,1,drop=TRUE])), "(converted from warning) 'newdata' had 3 rows but variables found have 31 rows") # following checks predict.linmod error messages when missing variables # (it tries to give better error messages than predict.lm) options(warn=1) # print warnings as they occur to test stop() in linmod.R::process.newdata.formula expect.err(try(predict(linmod.y1.x1, newdata=trees[3:5,1,drop=FALSE])), "newdata has 3 rows but model.frame returned 31 rows (variable 'x1' may be missing from newdata)") expect.err(try(predict(linmod.y1.x1, newdata=trees[3:5,1,drop=TRUE])), "newdata has 3 rows but model.frame returned 31 rows (variable 'x1' may be missing from newdata)") options(warn=2) # back to treating warnings as errors # test old version of linmod.R (pre Sep 2020) # # expect.err(try(predict(linmod.y1.x1, newdata=trees[3:5,1,drop=FALSE])), # "variable 'x1' is missing from newdata") # expect.err(try(predict(lm1, newdata=trees[3:5,1,drop=FALSE])), # "(converted from warning) 'newdata' had 3 rows but variables found have 31 rows") # expect.err(try(predict(linmod.y1.x1, newdata=trees[3:5,1,drop=TRUE])), # "variable 'x1' is missing from newdata") linmod6.form <- linmod(y1~x1) check.lm(linmod6.form, linmod.y1.x1, check.newdata=FALSE) newdata <- trees[5:6,] colnames(newdata) <- c("Girth", "Height", "Volume999") # doesn't matter what we call the response stopifnot(identical(predict(linmod.form.Volume.tr, newdata=newdata), predict(linmod.form.Volume.tr, newdata=trees[5:6,]))) newdata <- trees[5:6,3:1] # reverse columns and their colnames colnames(newdata) <- c("Volume", "Height", "Girth") stopifnot(identical(predict(linmod.form.Volume.tr, newdata=newdata), predict(linmod.form.Volume.tr, newdata=trees[5:6,]))) newdata <- trees[5:6,2:1] # reverse columns and their colnames, delete response column colnames(newdata) <- c("Height", "Girth") stopifnot(identical(predict(linmod.form.Volume.tr, newdata=newdata), predict(linmod.form.Volume.tr, newdata=trees[5:6,]))) stopifnot(identical(predict(linmod.form.Volume.tr, newdata=as.matrix(trees[5:6,])), # allow matrix newdata predict(linmod.form.Volume.tr, newdata=trees[5:6,]))) newdata <- trees[5:6,] colnames(newdata) <- c("Girth99", "Height", "Volume") expect.err(try(predict(linmod.form.Volume.tr, newdata=newdata)), "object 'Girth' not found") colnames(newdata) <- c("Girth", "Height99", "Volume") expect.err(try(predict(linmod.form.Volume.tr, newdata=newdata)), "object 'Height' not found") cat0("==check integer input (sibsp is an integer)\n") library(earth) # for etitanic data data(etitanic) tit <- etitanic[seq(1, nrow(etitanic), by=60), ] # small set of data for tests (18 cases) tit$survived <- tit$survived != 0 # convert to logical rownames(tit) <- paste("pas", 1:nrow(tit), sep="") cat0(paste(colnames(tit), "=", sapply(tit, class), sep="", collapse=", "), "\n") linmod7.xy <- linmod(tit$age, tit$sibsp) lm7 <- lm.fit(cbind(1, tit$age), tit$sibsp) stopifnot(coef(linmod7.xy) == coef(lm7)) # coef names will differ linmod7.form <- linmod(sibsp~age, data=tit) lm7.form <- lm(sibsp~age, data=tit) check.lm(linmod7.form, lm7.form, newdata=tit[3:5,]) linmod8.xy <- linmod(tit$sibsp, tit$age) lm8 <- lm.fit(cbind(1, tit$sibsp), tit$age) stopifnot(coef(linmod8.xy) == coef(lm8)) # coef names will differ linmod8.form <- linmod(age~sibsp, data=tit) lm8.form <- lm(age~sibsp, data=tit) check.lm(linmod8.form, lm8.form, newdata=tit[3:5,]) # drop=FALSE so response is a data frame linmod1a.xy <- linmod(trees[,1:2], trees[, 3, drop=FALSE]) print(linmod1a.xy) print(summary(linmod1a.xy)) plotres(linmod1a.xy) # plot caption shows response name "Volume" cat0("==test model building with assorted non-numeric args\n") library(earth) # for etitanic data data(etitanic) etit <- etitanic[seq(1, nrow(etitanic), by=60), ] # small set of data for tests (18 cases) etit$survived <- etit$survived != 0 # convert to logical rownames(etit) <- paste("pas", 1:nrow(etit), sep="") cat0(paste(colnames(etit), "=", sapply(etit, class), sep="", collapse=", "), "\n") lm9 <- lm(survived~., data=etit) linmod9.form <- linmod(survived~., data=etit) check.lm(linmod9.form, lm9, newdata=etit[3:5,]) # change class of pclass to numeric etit.pclass.numeric <- etit etit.pclass.numeric$pclass <- as.numeric(etit$pclass) expect.err(try(predict(lm9, newdata=etit.pclass.numeric)), "(converted from warning) variable 'pclass' is not a factor") expect.err(try(predict(linmod9.form, newdata=etit.pclass.numeric)), "(converted from warning) variable 'pclass' is not a factor") # change class of age to factor etit.age.factor <- etit etit.age.factor$age <- etit$pclass expect.err(try(predict(lm9, newdata=etit.age.factor)), "variable 'age' was fitted with type \"numeric\" but type \"factor\" was supplied") expect.err(try(predict(linmod9.form, newdata=etit.age.factor)), "variable 'age' was fitted with type \"numeric\" but type \"factor\" was supplied") # predict for formula model ignores extra column(s) in newdata etit.extra.col <- etit etit.extra.col$extra <- etit$sibsp stopifnot(identical(predict(lm9, newdata=etit), predict(lm9, newdata=etit.extra.col))) stopifnot(identical(predict(linmod9.form, newdata=etit), predict(linmod9.form, newdata=etit.extra.col))) etit.extra.col$extra2 <- etit$sibsp stopifnot(identical(predict(lm9, newdata=etit), predict(lm9, newdata=etit.extra.col))) stopifnot(identical(predict(linmod9.form, newdata=etit), predict(linmod9.form, newdata=etit.extra.col))) # predict for formula model doesn't care if columns in different order etit.different.col.order <- etit[,ncol(etit):1] # reverse order of columns stopifnot(identical(predict(lm9, newdata=etit), predict(lm9, newdata=etit.different.col.order))) stopifnot(identical(predict(linmod9.form, newdata=etit), predict(linmod9.form, newdata=etit.different.col.order))) # linmod.default, non numeric x (factors in x) expect.err(try(linmod(etit[c(1,3,4,5,6)], etit[,"survived"])), "non-numeric column in 'x'") expect.err(try(linmod.fit(etit[c(1,3,4,5,6)], etit[,"survived"])), "'x' is not a matrix or could not be converted to a matrix") # lousy error message from lm.fit expect.err(try(lm.fit(etit[,c(1,3,4,5,6)], etit[,"survived"])), "INTEGER() can only be applied to a 'integer', not a 'NULL'") expect.err(try(linmod(data.matrix(cbind("(Intercept)"=1, etit[,c(1,3,4,5,6)])), etit[,"survived"])), "column name \"(Intercept)\" in 'x' is duplicated") linmod9a.xy <- linmod(data.matrix(etit[,c(1,3,4,5,6)]), etit[,"survived"]) lm9.fit <- lm.fit(data.matrix(cbind("(Intercept)"=1, etit[,c(1,3,4,5,6)])), etit[,"survived"]) stopifnot(coef(linmod9a.xy) == coef(lm9.fit)) stopifnot(names(coef(linmod9a.xy)) == names(coef(lm9.fit))) expect.err(try(predict(linmod9a.xy, newdata=etit.age.factor[,c(1,3,4,5,6)])), "non-numeric column in 'newdata'") expect.err(try(predict(linmod9a.xy, newdata=etit[,c(1,3,4,5)])), "ncol(newdata) is 4 but should be 5") expect.err(try(predict(linmod9a.xy, newdata=etit[,c(1,3,4,5,6,6)])), "ncol(newdata) is 6 but should be 5") # linmod.formula, logical response data.logical.response <- data.frame(etit[1:6,c("age","sibsp","parch")], response=c(TRUE, TRUE, FALSE, TRUE, FALSE, FALSE)) linmod9b.form <- linmod(response~., data=data.logical.response) print(linmod9b.form) lm9b.form <- lm(response~., data=data.logical.response) check.lm(linmod9b.form, lm9b.form, newdata=data.logical.response[2,,drop=FALSE]) # linmod.formula, factor response (not allowed) data.fac.response <- data.frame(etit[1:6,c("age","sibsp","parch")], response=factor(c("a", "a", "b", "a", "b", "b"))) expect.err(try(linmod(response~., data=data.fac.response)), "'y' is not numeric or logical") # lm.formula expect.err(try(lm(response~., data=data.fac.response)), "(converted from warning) using type = \"numeric\" with a factor response will be ignored") # linmod.formula, string response (not allowed) data.string.response <- data.frame(etit[1:6,c("age","sibsp","parch")], response=c("a", "a", "b", "a", "b", "b")) expect.err(try(linmod(response~., data=data.string.response)), "'y' is not numeric or logical") # lm.formula expect.err(try(lm(response~., data=data.string.response)), "(converted from warning) NAs introduced by coercion") # linmod.default, logical response linmod9b.xy <- linmod(etit[1:6,c("age","sibsp","parch")], c(TRUE, TRUE, FALSE, TRUE, FALSE, FALSE)) print(linmod9b.xy) # lm.fit, logical response (lousy error message from lm.fit) expect.err(try(lm.fit(etit[1:6,c("age","sibsp","parch")], c(TRUE, TRUE, FALSE, TRUE, FALSE, FALSE))), "INTEGER() can only be applied to a 'integer', not a 'NULL'") # linmod.default, factor response expect.err(try(linmod(etit[1:6,c("age","sibsp","parch")], factor(c("a", "a", "b", "a", "b", "b")))), "'y' is not numeric or logical") # linmod.default, string response expect.err(try(linmod(etit[1:6,c("age","sibsp","parch")], c("a", "a", "b", "a", "b", "b"))), "'y' is not numeric or logical") # lm.fit, string and factor responses (lousy error messages from lm.fit) expect.err(try(lm.fit(etit[1:6,c("age","sibsp","parch")], factor(c("a", "a", "b", "a", "b", "b")))), "INTEGER() can only be applied to a 'integer', not a 'NULL'") expect.err(try(lm.fit(etit[1:6,c("age","sibsp","parch")], c("a", "a", "b", "a", "b", "b"))), "INTEGER() can only be applied to a 'integer', not a 'NULL'") options(warn=2) # treat warnings as errors expect.err(try(lm(pclass~., data=etit)), "using type = \"numeric\" with a factor response will be ignored") expect.err(try(linmod(pclass~., data=etit)), "'y' is not numeric or logical") options(warn=1) # print warnings as they occur lm10 <- lm(pclass~., data=etit) # will give warnings options(warn=2) # treat warnings as errors linmod10.form <- linmod(as.numeric(pclass)~., data=etit) stopifnot(coef(linmod10.form) == coef(lm10)) stopifnot(names(coef(linmod10.form)) == names(coef(lm10))) # check.lm(linmod10.form, lm10) # fails because lm10 fitted is all NA expect.err(try(linmod(pclass~., data=etit)), "'y' is not numeric or logical") expect.err(try(linmod(etit[,-1], etit[,1])), "non-numeric column in 'x'") expect.err(try(linmod(1:10, paste(1:10))), "'y' is not numeric or logical") linmod10a.form <- linmod(survived~pclass, data=etit) lm10a <- lm(survived~pclass, data=etit) check.lm(linmod10a.form, lm10a, newdata=etit[3:5,]) expect.err(try(linmod(etit[,"pclass"], etit[,"age"])), "non-numeric column in 'x'") expect.err(try(linmod(paste(1:10), 1:10)), "non-numeric column in 'x'") lm11 <- lm(as.numeric(pclass)~., data=etit) linmod11.form <- linmod(as.numeric(pclass)~., data=etit) check.lm(linmod11.form, lm11, newdata=etit[3:5,]) # logical data (not numeric) bool.data <- data.frame(x=rep(c(TRUE, FALSE, TRUE), length.out=10), y=rep(c(TRUE, FALSE, FALSE), length.out=10)) lm12 <- lm(y~x, data=bool.data) linmod12.form <- linmod(y~x, data=bool.data) check.lm(linmod12.form, lm12, newdata=bool.data[3:5,1], check.newdata=FALSE) # needed because predict.lm gives invalid type (list) for variable 'x' linmod12.xy <- linmod(bool.data$x, bool.data$y) # hack: delete mismatching names so check.lm() doesn't fail names(lm12$coefficients) <- NULL # were "(Intercept)" "xTRUE" names(linmod12.xy$coefficients) <- NULL # were "(Intercept)" "V1" check.lm(linmod12.xy, lm12, newdata=bool.data[3:5,1], check.newdata=FALSE, # needed because predict.lm gives invalid 'envir' argument of type 'logical' check.casenames=FALSE) cat0("==check use of functions in arguments to linmod\n") identfunc <- function(x) x lm10 <- lm( sqrt(survived) ~ I(age^2) + as.numeric(sex), data=identfunc(etit)) linmod10 <- linmod(sqrt(survived) ~ I(age^2) + as.numeric(sex), data=identfunc(etit)) print(summary(lm10)) print(summary(linmod10)) check.lm(linmod10, lm10, newdata=etit[3:5,]) set.seed(2020) plotmo(lm10, pt.col="green", do.par=2) set.seed(2020) plotmo(linmod10, pt.col="green", do.par=0) par(org.par) cat0("==data.frame with strings\n") df.with.string <- data.frame(1:5, c(1,2,-1,4,5), c("a", "b", "a", "a", "b"), stringsAsFactors=FALSE) colnames(df.with.string) <- c("num1", "num2", "string") linmod30.form <- linmod(num1~num2, df.with.string) lm30 <- lm(num1~num2, df.with.string) check.lm(linmod30.form, lm30, check.newdata=FALSE) linmod31.form <- linmod(num1~., df.with.string) lm31 <- lm(num1~., df.with.string) check.lm(linmod31.form, lm31, check.newdata=FALSE) expect.err(try(linmod(string~., df.with.string)), "'y' is not numeric or logical") vec <- c(1,2,3,4,3) expect.err(try(linmod(df.with.string, vec)), "non-numeric column in 'x'") expect.err(try(linmod(etit$pclass, etit$survived)), "non-numeric column in 'x'") cat0("==x is singular\n") set.seed(1) x2 <- matrix(rnorm(6), nrow=2) y2 <- c(1,2) expect.err(try(linmod(y2~x2)), "'x' is singular (it has 4 columns but its rank is 2)") x3 <- matrix(1:10, ncol=2) y3 <- c(1,2,9,4,5) expect.err(try(linmod(y3~x3)), "'x' is singular (it has 3 columns but its rank is 2)") expect.err(try(linmod(trees[1,1:2], trees[1,3])), "'x' is singular (it has 3 columns but its rank is 1)") x2a <- matrix(1:6, nrow=3) y2a <- c(1,2,3) expect.err(try(linmod(y2a~x2a)), "'x' is singular (it has 3 columns but its rank is 2)") cat0("==perfect fit (residuals are zero)\n") set.seed(1) x2b <- matrix(rnorm(6), nrow=3) y2b <- c(1,2,3) data.x2b <- data.frame(x2b, y2b) colnames(data.x2b) <- c("x1", "x2", "y") linmod.x2b <- linmod(y~., data=data.x2b) print(summary(linmod.x2b)) # will have "Residual degrees-of-freedom is zero" comment lm.x2b <- lm(y~., data=data.x2b) print(summary(lm.x2b)) # will have "ALL 3 residuals are 0" comment check.lm(linmod.x2b, lm.x2b, newdata=data.x2b[1:2,]+1, check.sigma=FALSE) x2c <- 1:10 y2c <- 11:20 data.x2c <- data.frame(x2c, y2c) colnames(data.x2c) <- c("x", "y") linmod.x2c <- linmod(y~., data=data.x2c) print(summary(linmod.x2c)) lm.x2c <- lm(y~., data=data.x2c) options(warn=1) # print warnings as they occur print(summary(lm.x2c)) # will have "essentially perfect fit: summary may be unreliable" comment options(warn=2) # treat warnings as errors check.lm(linmod.x2c, lm.x2c, newdata=data.x2c[1:2,]+1, check.sigma=FALSE) par(mfrow=c(2,2)) # all plots on same page so can compare plot(linmod.x2b, main="linmod.x2b\nall residuals are zero") plot(lm.x2b, which=1, main="lm.x2b") plot(linmod.x2c, main="linmod.x2c") plot(lm.x2c, which=1, main="lm.x2c") par(org.par) cat0("==nrow(x) does not match length(y)\n") x4 <- matrix(1:10, ncol=2) y4 <- c(1,2,9,4) expect.err(try(linmod(x4, y4)), "nrow(x) is 5 but length(y) is 4") x5 <- matrix(1:10, ncol=2) y5 <- c(1,2,9,4,5,9) expect.err(try(linmod(x5, y5)), "nrow(x) is 5 but length(y) is 6") cat0("==y has multiple columns\n") vec <- c(1,2,3,4,3) y2 <- cbind(c(1,2,3,4,9), vec^2) expect.err(try(linmod(vec, y2)), "nrow(x) is 5 but length(y) is 10") expect.err(try(linmod(y2~vec)), "nrow(x) is 5 but length(y) is 10") cat0("==NA in x\n") x <- tr[,1:2] y <- tr[,3] x[2,2] <- NA expect.err(try(linmod(x, y)), "NA in 'x'") x <- tr[,1:2] y <- tr[,3] y[9] <- NA expect.err(try(linmod(x, y)), "NA in 'y'") # Following added Sep 2020 (prior to this, predict.linmod gave an incorrect error message) cat0("==test formulas that use functions on rhs variables, like Volume~sqrt(Girth)\n") linmod.sqrt1 <- linmod(Volume~sqrt(as.numeric(Girth)), data=tr) cat0("==print(summary(linmod.sqrt1))\n") print(summary(linmod.sqrt1)) lm.sqrt1 <- lm(Volume~sqrt(as.numeric(Girth)), data=tr) check.lm(linmod.sqrt1, lm.sqrt1) stopifnot(almost.equal(predict(linmod.sqrt1, newdata=data.frame(Girth=10, Height=80)), predict(lm.sqrt1, newdata=data.frame(Girth=10, Height=80)))) stopifnot(almost.equal(predict(linmod.sqrt1, newdata=as.matrix(tr[1:3,])), predict(lm.sqrt1, newdata=tr[1:3,]))) par(mfrow=c(2,2)) # all plots on same page so can compare plotmo(linmod.sqrt1, do.par=FALSE) plotmo(lm.sqrt1, do.par=FALSE) par(org.par) linmod.sqrt2 <- linmod(Volume~sqrt(Girth)+Height+Girth, data=tr) cat0("==print(summary(linmod.sqrt2))\n") print(summary(linmod.sqrt2)) lm.sqrt2 <- lm(Volume~sqrt(Girth)+Height+Girth, data=tr) check.lm(linmod.sqrt2, lm.sqrt2) stopifnot(almost.equal(predict(linmod.sqrt2, newdata=data.frame(Girth=10, Height=80)), predict(lm.sqrt2, newdata=data.frame(Girth=10, Height=80)))) stopifnot(almost.equal(predict(linmod.sqrt2, newdata=as.matrix(tr[1:3,])), predict(lm.sqrt2, newdata=tr[1:3,]))) par(mfrow=c(2,2)) # all plots on same page so can compare plotmo(linmod.sqrt2, do.par=FALSE) plotmo(lm.sqrt2, do.par=FALSE) par(org.par) lm.sqrt.as.numeric <- lm(survived~sqrt(age)+as.numeric(pclass), data=etit) linmod.sqrt.as.numeric <- linmod(survived~sqrt(age)+as.numeric(pclass), data=etit) check.lm(linmod.sqrt.as.numeric, lm.sqrt.as.numeric, newdata=etit[3:5,]) expect.err(try(predict(linmod.sqrt.as.numeric, newdata=data.frame(age=30))), # pclass missing "object 'pclass' not found") par(mfrow=c(2,2)) # all plots on same page so can compare plotmo(linmod.sqrt.as.numeric, do.par=FALSE) plotmo(lm.sqrt.as.numeric, do.par=FALSE) par(org.par) y.age <- etit[,"age"] x.pclass <- etit[,"pclass"] x.sex <- etit[,"sex"] linmod.y.age.sex.pclass <- linmod(y.age ~ as.numeric(x.pclass) + x.sex) lm.y.age.sex.pclass <- lm( y.age ~ as.numeric(x.pclass) + x.sex) stopifnot(identical(linmod.y.age.sex.pclass$coef, lm.y.age.sex.pclass$coef)) options(warn=1) # print warnings as they occur to test stop() in linmod.R::process.newdata.formula # TODO following says variable 'as.numeric(x.pclass)' may be missing # it should say variable 'x.pclass' may be missing expect.err(try(predict(linmod.y.age.sex.pclass, newdata=etit[3:5,1,drop=FALSE])), "newdata has 3 rows but model.frame returned 18 rows (variable 'as.numeric(x.pclass)' may be missing from newdata)") options(warn=2) # back to treating warnings as errors cat0("==misc tests with different kinds of data\n") data3 <- data.frame(s=c("a", "b", "a", "c", "a"), num=c(1,5,1,9,2), y=c(1,3,2,5,3), stringsAsFactors=F) stopifnot(sapply(data3, class) == c("character", "numeric", "numeric")) a40 <- linmod(y~., data=data3) print(summary(a40)) stopifnot(almost.equal(a40$coefficients, c(0, -4.5, -8.5, 1.5), max=0.001)) stopifnot(almost.equal(predict(a40, newdata=data3[2:3,]), c(3.0, 1.5), max=0.001)) data4 <- data.frame(s=c("a", "b", "a", "c", "a"), num=c(1,5,1,9,2), y=c(1,3,2,5,3), stringsAsFactors=T) stopifnot(sapply(data4, class) == c("factor", "numeric", "numeric")) expect.err(try(linmod(data4[,1:2], data4[,3])), "non-numeric column in 'x'") # following gives no error (and matches lm) even though col 1 of data3 is character not factor a41 <- linmod(y~., data=data4) print(summary(a41)) stopifnot(almost.equal(predict(a41, newdata=data3[2:3,]), c(3.0, 1.5), max=0.001)) data5 <- data.frame(s=c("a", "b", "c", "a", "a"), num=c(1,9,4,2,6), y=c(1,2,3,5,3), stringsAsFactors=F) stopifnot(almost.equal(predict(a41, newdata=data5[1:3,1:2]), c(1.5, 9.0, -2.5), max=0.001)) data6 <- data.frame(s=c("a", "b", "c", "a9", "a"), num=c(1,9,4,2,6), num2=c(1,9,4,2,7), y=c(1,2,3,5,3), stringsAsFactors=T) expect.err(try(predict(a41, newdata=data6[1:3,1])), "object 's' not found") expect.err(try(predict(a41, newdata=data6[1:3,c(1,1)])), "object 'num' not found") expect.err(try(predict(a41, newdata=data.frame(s=1, num=2, y=3))), "variable 's' is not a factor") expect.err(try(predict(a41, newdata=1:9)), "object 's' not found") expect.err(try(predict(a41, newdata=data.frame())), "'newdata' is empty") # perfect fit (residuals are all zero) linmod.data6 <- linmod(y~s+num, data=data6) print(summary(linmod.data6)) lm.data6 <- lm(y~s+num, data=data6) print(summary(lm.data6)) check.lm(linmod.data6, lm.data6, newdata=data6[2,,drop=FALSE], check.sigma=FALSE) expect.err(try(linmod(y~., data=data6)), "'x' is singular (it has 6 columns but its rank is 5)") tr.na <- trees tr.na[9,3] <- NA expect.err(try(linmod(Volume~.,data=tr.na)), "NA in 'y'") expect.err(try(linmod(tr.na[,1:2], tr.na[,3])), "NA in 'y'") tr.na <- trees tr.na[10,1] <- NA expect.err(try(linmod(Volume~.,data=tr.na)), "NA in 'x'") expect.err(try(linmod(tr.na[,1:2], tr.na[,3])), "NA in 'x'") a42 <- linmod(trees[,1:2], trees[, 3]) newdata1 <- data.frame(Girth=20) expect.err(try(predict(a42, newdata=newdata1)), "ncol(newdata) is 1 but should be 2") newdata3 <- data.frame(Girth=20, extra1=21, extra2=22) expect.err(try(predict(a42, newdata=newdata3)), "ncol(newdata) is 3 but should be 2") expect.err(try(predict(a42, newdata=data.frame())), "'newdata' is empty") newdata.with.NA <- data.frame(Girth=20, Height=NA) expect.err(try(predict(a42, newdata=newdata.with.NA)), "NA in 'newdata'") a43 <- linmod(Volume~.,data=trees) expect.err(try(predict(a43, newdata=newdata.with.NA)), "NA in 'newdata'") lm43 <- lm(Volume~.,data=trees) # message from predict.lm could be better expect.err(try(predict(lm43, newdata=newdata.with.NA)), "variable 'Height' was fitted with type \"numeric\" but type \"logical\" was supplied") y6 <- 1:5 x6 <- data.frame() options(warn=1) # print warnings as they occur expect.err(try(linmod(x6, y6)), "'x' is empty") options(warn=2) # treat warnings as errors y7 <- data.frame() x7 <- 1:5 expect.err(try(linmod(x7, y7)), "'y' is empty") # duplicated column names data7 <- matrix(1:25, ncol=5) colnames(data7) <- c("y", "x1", "x1", "x3", "x4") expect.err(try(linmod(data7[,-1], data7[,1])), "column name \"x1\" in 'x' is duplicated") colnames(data7) <- c("y", "x1", "x2", "x2", "x4") expect.err(try(linmod(data7[,-1], data7[,1])), "column name \"x2\" in 'x' is duplicated") colnames(data7) <- c("y", "x1", "x2", "x2", "x2") expect.err(try(linmod(data7[,-1], data7[,1])), "column name \"x2\" in 'x' is duplicated") # column name V2 will be created but it clashes with the existing column name colnames(data7) <- c("y", "V2", "", "V3", "V4") expect.err(try(linmod(data7[,-1], data7[,1])), "column name \"V2\" in 'x' is duplicated") # missing column names trees1 <- trees colnames(trees1) <- NULL cat0("a52\n") a52 <- linmod(trees1[,1:2], trees1[,3]) print(summary(a52)) trees1 <- trees colnames(trees1) <- c("", "Height", "Volume") # was Girth Height Volume cat0("linmod.form.Volume.trees1\n") linmod.form.Volume.trees1 <- linmod(trees1[,1:2], trees1[,3]) print(summary(linmod.form.Volume.trees1)) cat0("linmod.form.Volume.trees1.formula\n") expect.err(try(linmod(Volume~., data=trees1)), "attempt to use zero-length variable name") # very long names to test formatting in summary.linmod trees1 <- trees colnames(trees1) <- c("Girth.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name", "Height.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name", "Volume.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name") cat0("a55\n") a55 <- linmod(Volume.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name~ Girth.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name+ Height.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name, data=trees1) print(summary(a55)) # intercept-only model intonly.form <- linmod(Volume~1, data=trees) print(summary(intonly.form)) stopifnot(length(coef(intonly.form)) == 1) try(plotmo(intonly.form)) # Error in plotmo(intonly.form) : x is empty plotres(intonly.form) expect.err(try(plotmo(intonly.form)), "x is empty") expect.err(try(linmod(rep(1, length.out=nrow(trees)), trees$Volume)), "'x' is singular (it has 2 columns but its rank is 1)") # various tests for bad args expect.err(try(linmod(trees[,1:2])), "no 'y' argument") # test stop.if.dot.arg.used expect.err(try(linmod(Volume~., data=trees, nonesuch=99)), "unused argument (nonesuch = 99)") expect.err(try(linmod(trees[,1:2], trees[,3], nonesuch=linmod)), "unused argument (nonesuch = function (...)") expect.err(try(summary(linmod(trees[,1:2], trees[,3]), nonesuch=linmod)), "unused argument (nonesuch = function (...)") expect.err(try(print(linmod(trees[,1:2], trees[,3]), nonesuch=linmod)), "unused argument (nonesuch = function (...)") expect.err(try(predict(linmod.form.Volume.tr, nonesuch=99)), "unused argument (nonesuch = 99)") # check partial matching on type argument stopifnot(identical(predict(linmod.form.Volume.tr, type="r"), predict(linmod.form.Volume.tr))) stopifnot(identical(predict(linmod.form.Volume.tr, type="resp"), predict(linmod.form.Volume.tr))) expect.err(try(predict(linmod.form.Volume.tr, type="nonesuch")), "'arg' should be \"response\"") # test additional method functions (see linmod.methods.R) check.lm(linmod.form.Volume.tr, lm.Volume.tr, newdata=trees[3,1:2]) stopifnot(almost.equal(coef(linmod.form.Volume.tr), coef(lm.Volume.tr))) stopifnot(identical(names(coef(linmod.form.Volume.tr)), names(coef(lm.Volume.tr)))) stopifnot(almost.equal(fitted(linmod.form.Volume.tr), fitted(lm.Volume.tr))) stopifnot(identical(names(fitted(linmod.form.Volume.tr)), names(fitted(lm.Volume.tr)))) stopifnot(identical(na.action(linmod.form.Volume.tr), na.action(lm.Volume.tr))) stopifnot(almost.equal(residuals(linmod.form.Volume.tr), residuals(lm.Volume.tr))) stopifnot(identical(names(residuals(linmod.form.Volume.tr)), names(residuals(lm.Volume.tr)))) stopifnot(identical(names(case.names(linmod.form.Volume.tr)), names(case.names(lm.Volume.tr)))) stopifnot(identical(variable.names(linmod.form.Volume.tr), variable.names(lm.Volume.tr))) stopifnot(identical(nobs(linmod.form.Volume.tr), nobs(lm.Volume.tr))) stopifnot(identical(weights(linmod.form.Volume.tr), weights(lm.Volume.tr))) stopifnot(almost.equal(df.residual(linmod.form.Volume.tr), df.residual(lm.Volume.tr))) stopifnot(identical(names(df.residual(linmod.form.Volume.tr)), names(df.residual(lm.Volume.tr)))) stopifnot(almost.equal(deviance(linmod.form.Volume.tr), deviance(lm.Volume.tr))) stopifnot(identical(names(deviance(linmod.form.Volume.tr)), names(deviance(lm.Volume.tr)))) stopifnot(identical(weights(linmod.form.Volume.tr), weights(lm.Volume.tr))) stopifnot(identical(model.frame(linmod.form.Volume.tr), model.frame(lm.Volume.tr))) stopifnot(identical(model.matrix(linmod.form.Volume.tr), model.matrix(lm.Volume.tr))) stopifnot(identical(model.matrix(linmod.form.Volume.tr, data=tr[1:2,]), model.matrix(lm.Volume.tr, data=tr[1:2,]))) stopifnot(almost.equal(logLik(linmod.form.Volume.tr), logLik(lm.Volume.tr))) expect.err(try(logLik(linmod.form.Volume.tr, REML=TRUE)), "!REML is not TRUE") library(sandwich) # for estfun.lm stopifnot(almost.equal(estfun(linmod.form.Volume.tr), estfun(lm.Volume.tr))) linmod.form.Volume.tr.update <- update(linmod.form.Volume.tr, formula.=Volume~Height) lm.Volume.tr.update <- update(lm.Volume.tr, formula.=Volume~Height) check.lm(linmod.form.Volume.tr.update, lm.Volume.tr.update) check.lm(linmod.xy.Volume.tr, lm.Volume.tr, newdata=trees[3,1:2]) stopifnot(almost.equal(coef(linmod.xy.Volume.tr), coef(lm.Volume.tr))) stopifnot(identical(names(coef(linmod.xy.Volume.tr)), names(coef(lm.Volume.tr)))) stopifnot(almost.equal(fitted(linmod.xy.Volume.tr), fitted(lm.Volume.tr))) stopifnot(identical(names(fitted(linmod.xy.Volume.tr)), names(fitted(lm.Volume.tr)))) stopifnot(identical(na.action(linmod.xy.Volume.tr), na.action(lm.Volume.tr))) stopifnot(almost.equal(residuals(linmod.xy.Volume.tr), residuals(lm.Volume.tr))) stopifnot(identical(names(residuals(linmod.xy.Volume.tr)), names(residuals(lm.Volume.tr)))) stopifnot(identical(case.names(linmod.xy.Volume.tr), case.names(lm.Volume.tr))) stopifnot(identical(variable.names(linmod.xy.Volume.tr), variable.names(lm.Volume.tr))) stopifnot(identical(nobs(linmod.xy.Volume.tr), nobs(lm.Volume.tr))) stopifnot(identical(weights(linmod.xy.Volume.tr), weights(lm.Volume.tr))) stopifnot(almost.equal(df.residual(linmod.xy.Volume.tr), df.residual(lm.Volume.tr))) stopifnot(identical(names(df.residual(linmod.xy.Volume.tr)), names(df.residual(lm.Volume.tr)))) stopifnot(almost.equal(deviance(linmod.xy.Volume.tr), deviance(lm.Volume.tr))) stopifnot(identical(names(deviance(linmod.xy.Volume.tr)), names(deviance(lm.Volume.tr)))) stopifnot(identical(weights(linmod.xy.Volume.tr), weights(lm.Volume.tr))) expect.err(try(model.frame(linmod.xy.Volume.tr)), "model.frame cannot be used on linmod models built without a formula") expect.err(try(model.matrix(linmod.xy.Volume.tr)), "model.frame cannot be used on linmod models built without a formula") stopifnot(almost.equal(logLik(linmod.xy.Volume.tr), logLik(lm.Volume.tr))) par(mfrow=c(2,2)) plot(linmod.form.Volume.tr) plot(lm.Volume.tr, which=1, main="lm.Volume.tr") plot(linmod.xy.Volume.tr) plot(linmod.form.Volume.tr, xlim=c(0,80), ylim=c(-10,10), pch=20, main="linmod.form.Volume.tr: test plot args") par(org.par) cat0("==test one predictor model\n") linmod.onepred.form <- linmod(Volume~Girth, data=tr) # one predictor lm.onepred.form <- lm(Volume~Girth, data=tr) check.lm(linmod.onepred.form, lm.onepred.form, newdata=trees[3,1:2]) linmod.onepred.xy <- linmod(tr[,1,drop=FALSE], tr[,3]) # one predictor print(summary(linmod.onepred.xy)) check.lm(linmod.onepred.xy, lm.onepred.form, newdata=trees[3,1,drop=FALSE]) par(mfrow=c(2,2)) plot(linmod.onepred.form) plot(lm.onepred.form, which=1, main="lm.onepred.form") plot(linmod.onepred.xy) par(org.par) plotres(linmod.onepred.form) plotmo(linmod.onepred.form, pt.col=2) cat0("==test no intercept model\n") # no intercept models are only supported with the formula interface (not x,y interface) linmod.noint <- linmod(Volume~.-1, data=trees) # no intercept print(summary(linmod.noint)) lm.noint <- lm(Volume~.-1, data=trees) # no intercept check.lm(linmod.noint, lm.noint) linmod.noint.keep <- linmod(Volume~.-1, data=trees, keep=TRUE) print(summary(linmod.noint.keep)) check.lm(linmod.noint, lm.noint) stopifnot(class(linmod.noint.keep$data) == class(linmod.form.Volume.trees.keep$data)) stopifnot(all(dim(linmod.noint.keep$data) == dim(linmod.form.Volume.trees.keep$data))) stopifnot(all(linmod.noint.keep$data == linmod.form.Volume.trees.keep$data)) stopifnot(class(linmod.noint.keep$y) == class(linmod.form.Volume.trees.keep$y)) stopifnot(all(dim(linmod.noint.keep$data) == dim(linmod.form.Volume.trees.keep$data))) stopifnot(all(linmod.noint.keep$data == linmod.form.Volume.trees.keep$data)) # check method functions in no-intercept model stopifnot(almost.equal(coef(linmod.noint), coef(lm.noint))) stopifnot(identical(names(coef(linmod.noint)), names(coef(lm.noint)))) stopifnot(almost.equal(fitted(linmod.noint), fitted(lm.noint))) stopifnot(identical(names(fitted(linmod.noint)), names(fitted(lm.noint)))) stopifnot(identical(na.action(linmod.noint), na.action(lm.noint))) stopifnot(almost.equal(residuals(linmod.noint), residuals(lm.noint))) stopifnot(identical(names(residuals(linmod.noint)), names(residuals(lm.noint)))) stopifnot(identical(case.names(linmod.noint), case.names(lm.noint))) stopifnot(identical(variable.names(linmod.noint), variable.names(lm.noint))) stopifnot(identical(nobs(linmod.noint), nobs(lm.noint))) stopifnot(identical(weights(linmod.noint), weights(lm.noint))) stopifnot(almost.equal(df.residual(linmod.noint), df.residual(lm.noint))) stopifnot(identical(names(df.residual(linmod.noint)), names(df.residual(lm.noint)))) stopifnot(almost.equal(deviance(linmod.noint), deviance(lm.noint))) stopifnot(identical(names(deviance(linmod.noint)), names(deviance(lm.noint)))) stopifnot(identical(weights(linmod.noint), weights(lm.noint))) stopifnot(identical(model.frame(linmod.noint), model.frame(lm.noint))) stopifnot(identical(model.matrix(linmod.noint), model.matrix(lm.noint))) stopifnot(identical(model.matrix(linmod.noint, data=tr[1:2,]), model.matrix(lm.noint, data=tr[1:2,]))) stopifnot(almost.equal(logLik(linmod.noint), logLik(lm.noint))) stopifnot(almost.equal(estfun(linmod.noint), estfun(lm.noint))) # check error messages with bad newdata in no-intercept model expect.err(try(predict(linmod.noint, newdata=NA)), "object 'Girth' not found") expect.err(try(predict(linmod.noint, newdata=data.frame(Height=c(1,NA), Girth=c(3,4)))), "NA in 'newdata'") expect.err(try(predict(linmod.noint, newdata=trees[0,])), "'newdata' is empty") expect.err(try(predict(linmod.noint, newdata=trees[3:5,"Height"])), "object 'Girth' not found") # check that extra fields in predict newdata are ok with (formula) models without intercept stopifnot(almost.equal(predict(linmod.noint, newdata=data.frame(Girth=10, Height=80, extra=99)), predict(lm.noint, newdata=data.frame(Girth=10, Height=80, extra=99)))) par(mfrow=c(2,2)) plot(linmod.noint) plot(lm.noint, which=1, main="lm.noint") par(org.par) plotres(linmod.noint) plotmo(linmod.noint) cat0("==test one predictor no intercept model\n") # no intercept models are only supported with the formula interface (not x,y interface) linmod.onepred.noint <- linmod(Volume~Girth-1, data=trees) # one predictor, no intercept print(summary(linmod.onepred.noint)) lm.onepred.noint <- lm(Volume~Girth-1, data=trees) # one predictor, no intercept check.lm(linmod.onepred.noint, lm.onepred.noint) linmod.onepred.noint.keep <- linmod(Volume~.-1, data=trees, keep=TRUE) print(summary(linmod.onepred.noint.keep)) check.lm(linmod.onepred.noint, lm.onepred.noint) stopifnot(class(linmod.onepred.noint.keep$data) == class(linmod.form.Volume.trees.keep$data)) stopifnot(all(dim(linmod.onepred.noint.keep$data) == dim(linmod.form.Volume.trees.keep$data))) stopifnot(all(linmod.onepred.noint.keep$data == linmod.form.Volume.trees.keep$data)) stopifnot(class(linmod.onepred.noint.keep$y) == class(linmod.form.Volume.trees.keep$y)) stopifnot(all(dim(linmod.onepred.noint.keep$data) == dim(linmod.form.Volume.trees.keep$data))) stopifnot(all(linmod.onepred.noint.keep$data == linmod.form.Volume.trees.keep$data)) # check method functions in one predictor no-intercept model stopifnot(almost.equal(coef(linmod.onepred.noint), coef(lm.onepred.noint))) stopifnot(identical(names(coef(linmod.onepred.noint)), names(coef(lm.onepred.noint)))) stopifnot(almost.equal(fitted(linmod.onepred.noint), fitted(lm.onepred.noint))) stopifnot(identical(names(fitted(linmod.onepred.noint)), names(fitted(lm.onepred.noint)))) stopifnot(identical(na.action(linmod.onepred.noint), na.action(lm.onepred.noint))) stopifnot(almost.equal(residuals(linmod.onepred.noint), residuals(lm.onepred.noint))) stopifnot(identical(names(residuals(linmod.onepred.noint)), names(residuals(lm.onepred.noint)))) stopifnot(identical(case.names(linmod.onepred.noint), case.names(lm.onepred.noint))) stopifnot(identical(variable.names(linmod.onepred.noint), variable.names(lm.onepred.noint))) stopifnot(identical(nobs(linmod.onepred.noint), nobs(lm.onepred.noint))) stopifnot(identical(weights(linmod.onepred.noint), weights(lm.onepred.noint))) stopifnot(almost.equal(df.residual(linmod.onepred.noint), df.residual(lm.onepred.noint))) stopifnot(identical(names(df.residual(linmod.onepred.noint)), names(df.residual(lm.onepred.noint)))) stopifnot(almost.equal(deviance(linmod.onepred.noint), deviance(lm.onepred.noint))) stopifnot(identical(names(deviance(linmod.onepred.noint)), names(deviance(lm.onepred.noint)))) stopifnot(identical(weights(linmod.onepred.noint), weights(lm.onepred.noint))) stopifnot(identical(model.frame(linmod.onepred.noint), model.frame(lm.onepred.noint))) stopifnot(identical(model.matrix(linmod.onepred.noint), model.matrix(lm.onepred.noint))) stopifnot(identical(model.matrix(linmod.onepred.noint, data=tr[1:2,]), model.matrix(lm.onepred.noint, data=tr[1:2,]))) stopifnot(almost.equal(logLik(linmod.onepred.noint), logLik(lm.onepred.noint))) stopifnot(almost.equal(estfun(linmod.onepred.noint), estfun(lm.onepred.noint))) # check error messages with bad newdata in one predictor no-intercept model expect.err(try(predict(linmod.onepred.noint, newdata=99)), "object 'Girth' not found") expect.err(try(predict(linmod.onepred.noint, newdata=data.frame(Girth=NA))), "NA in 'newdata'") expect.err(try(predict(linmod.onepred.noint, newdata=trees[0,1])), "'newdata' is empty") expect.err(try(predict(linmod.onepred.noint, newdata=trees[3:5,"Height"])), "object 'Girth' not found") # check that extra fields in predict newdata are ok with (formula) models without intercept stopifnot(almost.equal(predict(linmod.onepred.noint, newdata=data.frame(Girth=10, extra=99)), predict(lm.onepred.noint, newdata=data.frame(Girth=10, extra=99)))) par(mfrow=c(2,2)) plot(linmod.onepred.noint) plot(lm.onepred.noint, which=1, main="lm.onepred.noint") par(org.par) plotres(linmod.onepred.noint) plotmo(linmod.onepred.noint) expect.err(try(linmod(Volume~nonesuch, data=trees)), "object 'nonesuch' not found") expect.err(try(linmod(Volume~0, data=trees)), "'x' is empty") # no predictor expect.err(try(linmod(Volume~-1, data=trees)), "'x' is empty") # no predictor, no intercept cat0("==check model with many variables\n") set.seed(2018) p <- 300 # number of variables n <- floor(1.1 * p) bigdat <- as.data.frame(matrix(rnorm(n * (p+1)), ncol=p+1)) colnames(bigdat) <- c("y", paste0("var", 1:p)) lm.bigdat <- lm(y~., data=bigdat) linmod.bigdat <- linmod(y~., data=bigdat) check.lm(linmod.form.Volume.tr, lm.Volume.tr) print(linmod.bigdat) print(summary(linmod.bigdat)) expect.err(try(predict(linmod.bigdat, newdata=bigdat[,1:(p-3)])), "object 'var297' not found") plot(linmod.bigdat) # plotmo(linmod.bigdat) # works, but commented out because slow(ish) # plotres(linmod.bigdat) # ditto cat0("==check use of matrix as data in linmod.form\n") # linmod.form allows a matrix, lm doesn't TODO is this inconsistency what we want? tr.mat <- as.matrix(tr) cat0("class(tr.mat)=", class(tr.mat), "\n") # class(tr.mat)=matrix expect.err(try(lm(Volume~., data=tr.mat)), "'data' must be a data.frame, not a matrix or an array") linmod.form.Volume.mat.tr <- linmod(Volume~., data=tr.mat) check.lm(linmod.form.Volume.mat.tr, linmod.form.Volume.tr) cat0("==print(summary(linmod.form.Volume.mat.tr))\n") print(summary(linmod.form.Volume.mat.tr)) plotres(linmod.form.Volume.mat.tr) tr.mat.no.colnames <- as.matrix(tr) colnames(tr.mat.no.colnames) <- NULL expect.err(try(linmod(Volume~., data=tr.mat.no.colnames)), "object 'Volume' not found") linmod.form.Volume.mat.tr.no.colnames <- linmod(V3~., data=tr.mat.no.colnames) check.lm(linmod.form.Volume.mat.tr.no.colnames, linmod.form.Volume.tr, check.coef.names=FALSE, check.newdata=FALSE) # no check.newdata else object 'V1' not found # Check what happens when we change the original data used to build the model. # Use plotres as an example function that must figure out residuals from predict(). pr <- function(model, main=deparse(substitute(model))) { plotres(model, which=3, main=main) # which=3 for just the residuals plot } cat0("==linmod.formula: change data used to build the model\n") trees1 <- trees linmod.trees1 <- linmod(Volume~., data=trees1) # delete the saved residuals and fitted.values so plotres has to use the saved # call etc. to get the x and y used to build the model, and rely on predict() linmod.trees1$residuals <- NULL linmod.trees1$fitted.values <- NULL par(mfrow=c(3,3)) pr(linmod.trees1) trees1 <- trees[, 3:1] # change column order in original data pr(linmod.trees1, "change col order") trees1 <- trees[1:3, ] # change number of rows in original data pr(linmod.trees1, "change nbr rows") # TODO wrong residuals! (lm has the same issue) cat("call$data now refers to the changed data:\n") # lm has the same problem if called with model=FALSE print(eval(linmod.trees1$call$data)) cat("model.frame now returns the changed data:\n") print(model.frame(linmod.trees1)) trees1 <- trees[nrow(tr):1, ] # change row order (but keep same nbr of rows) pr(linmod.trees1, "change row order") colnames(trees1) <- c("x1", "x2", "x3") # change column names in original data expect.err(try(pr(linmod.trees1, "change colnames")), "cannot get the original model predictors") trees1 <- "garbage" expect.err(try(pr(linmod.trees1, "trees1=\"garbage\"")), "cannot get the original model predictors") trees1 <- 1:1000 expect.err(try(pr(linmod.trees1, "trees1=1:1000")), "cannot get the original model predictors") trees1 <- NULL # original data no longer available expect.err(try(pr(linmod.trees1, "trees1=NULL")), "cannot get the original model predictors") remove(trees1) expect.err(try(pr(linmod.trees1, "remove(trees1)")), "cannot get the original model predictors") # similar to above, but don't delete the saved residuals and fitted.values trees1 <- trees linmod2.trees1 <- linmod(Volume~., data=trees1) trees1 <- trees[1:3, ] # change number of rows in original data expect.err(try(plotmo(linmod2.trees1)), "plotmo_y returned the wrong length (got 3 but expected 31)") par(org.par) cat0("==linmod.formula(keep=TRUE): change data used to build the model\n") par(mfrow=c(3,3)) trees1 <- trees linmod.trees1.keep <- linmod(Volume~., data=trees1, keep=TRUE) # delete the saved residuals and fitted.values so plotres has to use the saved # call etc. to get the x and y used to build the model, and rely on predict() linmod.trees1.keep$residuals <- NULL linmod.trees1.keep$fitted.values <- NULL pr(linmod.trees1.keep) trees1 <- trees[, 3:1] # change column order in original data pr(linmod.trees1.keep, "change col order") trees1 <- trees[1:3, ] # change number of rows in original data pr(linmod.trees1.keep, "change nbr rows") trees1 <- trees[nrow(tr):1, ] # change row order (but keep same nbr of rows) pr(linmod.trees1.keep, "change row order") colnames(trees1) <- c("x1", "x2", "x3") # change column names in original data pr(linmod.trees1.keep, "change colnames") trees1 <- NULL # original data no longer available pr(linmod.trees1.keep, "trees1=NULL") remove(trees1) pr(linmod.trees1.keep, "remove(trees1)") par(org.par) cat0("==linmod.default: change data used to build the model\n") trees1 <- trees x1 <- trees1[,1:2] y1 <- trees1[,3] linmod.xy <- linmod(x1, y1) # delete the saved residuals and fitted.values so plotres has to use the saved # call etc. to get the x1 and y1 used to build the model, and rely on predict() linmod.xy$residuals <- NULL linmod.xy$fitted.values <- NULL par(mfrow=c(3,3)) pr(linmod.xy) x1 <- trees1[,2:1] # change column order in original x1 pr(linmod.xy, "change col order") x1 <- trees1[1:3, 1:2] # change number of rows in original x1 expect.err(try(pr(linmod.xy, "change nbr rows")), "plotmo_y returned the wrong length (got 31 but expected 3)") # TODO different behaviour to linmod.trees1 cat("call$x1 now refers to the changed x1:\n") # lm has the same problem if called with model=FALSE print(eval(linmod.xy$call$x1)) x1 <- trees1[nrow(tr):1, 1:2] # change row order (but keep same nbr of rows) pr(linmod.xy, "change row order") x1 <- trees1[,1:2] colnames(x1) <- c("x1", "x2") # change column names in original x1 pr(linmod.xy, "change colnames") x1 <- "garbage" expect.err(try(pr(linmod.xy, "x1=\"garbage\"")), "cannot get the original model predictors") x1 <- 1:1000 expect.err(try(pr(linmod.xy, "x1=1:1000")), "ncol(newdata) is 1 but should be 2") x1 <- NULL # original x1 no longer available expect.err(try(pr(linmod.xy, "x1=NULL")), "cannot get the original model predictors") remove(x1) expect.err(try(pr(linmod.xy, "remove(x1)")), "cannot get the original model predictors") # similar to above, but don't delete the saved residuals and fitted.values trees1 <- trees x1 <- trees1[,1:2] y1 <- trees1[,3] linmod.xy <- linmod(x1, y1) x1 <- trees1[1:3, 1:2] # change number of rows in original x1 expect.err(try(plotmo(linmod2.x1)), "object 'linmod2.x1' not found") # TODO error message misleading? par(org.par) cat0("==linmod.default(keep=TRUE): change data used to build the model\n") par(mfrow=c(3,3)) trees1 <- trees x1 <- trees1[,1:2] linmod.xy <- linmod(x1, y1, keep=TRUE) # delete the saved residuals and fitted.values so plotres has to use the saved # call etc. to get the x1 and y1 used to build the model, and rely on predict() linmod.xy$residuals <- NULL linmod.xy$fitted.values <- NULL pr(linmod.xy.keep) x1 <- trees1[, 2:1] # change column order in original x1 pr(linmod.xy.keep, "change col order") x1 <- trees1[1:3, 1:2] # change number of rows in original x1 pr(linmod.xy.keep, "change nbr rows") x1 <- trees1[nrow(tr):1, 1:2] # change row order (but keep same nbr of rows) pr(linmod.xy.keep, "change row order") x1 <- trees1[,1:2] colnames(x1) <- c("x1", "x2") # change column names in original x1 pr(linmod.xy.keep, "change colnames") x1 <- NULL # original x1 no longer available pr(linmod.xy.keep, "x1=NULL") remove(x1) pr(linmod.xy.keep, "remove(x1)") par(org.par) cat("==test processing a model created in a function with local data\n") # pr <- function(model, main=deparse(substitute(model))) # { # plotmo(model, degree1=1, degree2=0, pt.col=2, do.par=FALSE, main=main) # } pr <- function(model, main=deparse(substitute(model))) { plotres(model, which=3, main=main) # which=3 for just the residuals plot } lm.form.func <- function(keep=FALSE) { local.tr <- trees[1:20,] lm(Volume~., data=local.tr, model=keep) } linmod.form.func <- function(keep=FALSE) { local.tr <- trees[1:20,] model <- linmod(Volume~., data=local.tr, keep=keep) # delete the saved residuals and fitted.values so plotres has to use the saved # call etc. to get the x and y used to build the model, and rely on predict() model$residuals <- NULL model$fitted.values <- NULL model } linmod.xy.func <- function(keep) { xx <- trees[1:20,1:2] yy <- trees[1:20,3] model <- linmod(xx, yy, keep=keep) # delete the saved residuals and fitted.values so plotres has to use the saved # call etc. to get the x and y used to build the model, and rely on predict() model$residuals <- NULL model$fitted.values <- NULL model } par(mfrow=c(3,2)) lm.form <- lm.form.func(keep=FALSE) pr(lm.form) lm.form.keep <- lm.form.func(keep=TRUE) pr(lm.form.keep) linmod.form <- linmod.form.func(keep=FALSE) pr(linmod.form) linmod.form.keep <- linmod.form.func(keep=TRUE) pr(linmod.form.keep) linmod.xy <- linmod.xy.func(keep=FALSE) expect.err(try(pr(linmod.xy)), "cannot get the original model predictors") linmod.xy.keep <- linmod.xy.func(keep=TRUE) pr(linmod.xy.keep) par(org.par) # test xlevels (predict with newdata using a string to represent a factor) data(iris) linmod.Sepal.Length <- linmod(Sepal.Length~Species,data=iris) lm.Sepal.Length <- lm(Sepal.Length~Species,data=iris) predict.linmod <- predict(linmod.Sepal.Length, newdata=data.frame(Species="setosa")) predict.lm <- predict(lm.Sepal.Length, newdata=data.frame(Species="setosa")) stopifnot(all.equal(predict.linmod, predict.lm)) source("test.epilog.R") plotmo/inst/slowtests/linmod.methods.R0000644000176200001440000000517613725307660017701 0ustar liggesusers# limod.methods.R: Additional method functions for the linmod example. # # See www.milbo.org/doc/modguide.pdf. # This software may be freely used. variable.names.linmod <- function(object, ...) { stopifnot(inherits(object, "linmod")) stop.if.dot.arg.used(...) names(coef(object)) } case.names.linmod <- function(object, ...) { stopifnot(inherits(object, "linmod")) stop.if.dot.arg.used(...) names(residuals(object)) } nobs.linmod <- function(object, use.fall.back = FALSE, ...) { stopifnot(inherits(object, "linmod")) stop.if.dot.arg.used(...) NROW(object$residuals) } deviance.linmod <- function(object, ...) { stopifnot(inherits(object, "linmod")) stop.if.dot.arg.used(...) sum(residuals(object)^2) } model.frame.linmod <- function(formula, ...) { stopifnot(inherits(formula, "linmod")) if(is.null(formula$terms)) # model built with linmod.default? stop("model.frame cannot be used on linmod models built without a formula") else model.frame.default(formula, ...) } model.matrix.linmod <- function(object, data = NULL, ...) { stopifnot(inherits(object, "linmod")) if(is.null(data)) data <- model.frame.linmod(object) model.matrix.default(object, data = data, ...) } logLik.linmod <- function(object, REML = FALSE, ...) { stopifnot(inherits(object, "linmod")) stop.if.dot.arg.used(...) stopifnot(!REML) # linmod does not save qr hence cannot do REML res <- object$residuals p <- object$rank n <- length(res) w <- rep.int(1, n) n0 <- n val <- .5* (sum(log(w)) - n * (log(2 * pi) + 1 - log(n) + log(sum(w*res^2)))) attr(val, "nall") <- n0 attr(val, "nobs") <- n attr(val, "df") <- p + 1 class(val) <- "logLik" val } estfun.linmod <- function (x, ...) # for sandwich package { stopifnot(inherits(x, "linmod")) stop.if.dot.arg.used(...) xmat <- model.matrix(x) res <- residuals(x) rval <- as.vector(res) * xmat attr(rval, "assign") <- NULL attr(rval, "contrasts") <- NULL return(rval) } plot.linmod <- function(x, main = NULL, ...) # dots are passed to plot() { stopifnot(inherits(x, "linmod")) call.as.char <- paste0(deparse(x$call, control = NULL, nlines = 5), sep = " ", collapse = " ") plot(fitted(x), residuals(x), xlab = "Fitted values", ylab = "Residuals", main = if(is.null(main)) substr(call.as.char, 1, 50) else main, ...) smooth <- lowess(fitted(x), residuals(x), f = .5) lines(smooth$x, smooth$y, col = 2) } plotmo/inst/slowtests/test.pre.Rout.save0000644000176200001440000001275614563614021020201 0ustar liggesusers> # test.pre.R: test the "pre" package with plotmo and plotres > > source("test.prolog.R") > library(pre) > library(plotmo) Loading required package: Formula Loading required package: plotrix > library(earth) # for ozone1 > options(warn=1) # print warnings as they occur > data(airquality) > airq <- airquality[complete.cases(airquality), (c("Ozone", "Wind", "Temp"))] > # prevent confusion caused by integer rownames which don't match row numbers > rownames(airq) <- NULL > airq <- airq[1:50, ] # small set of data for quicker test > > coef.glmnet <- glmnet:::coef.glmnet # TODO workaround required for glmnet 3.0 > predict.cv.glmnet <- glmnet:::predict.cv.glmnet > > set.seed(2018) > pre.mod <- pre(Ozone~., data=airq, ntrees=10) # ntrees=10 for faster test > plotres(pre.mod) # variable importance and residual plots > plotres(pre.mod, which=3, main="pre.mod residuals") # which=3 for just the residual vs fitted plot > plotmo(pre.mod) # plot model surface with background variables held at their medians plotmo grid: Wind Temp 10.3 75 > > # sanity check: compare model surface to to randomForest > # (commented out to save test time) > # > # library(randomForest) > # set.seed(2018) > # rf.mod <- randomForest(Ozone~., data=airq) > # plotmo(rf.mod) > > # compare singleplot and plotmo > > par(mfrow=c(2,2)) # 4 plots per page > > singleplot(pre.mod, varname="Temp", main="Temp\n(singleplot)") > > plotmo(pre.mod, + pmethod="partdep", # plot partial dependence plot, + degree1="Temp", degree2=0, # plot only Temp, no degree2 plots + do.par=FALSE, # don't automatically set par(), use above par(mfrow) + main="Temp\n(plotmo partdep)") calculating partdep for Temp > > # test penalty.par.val="lambda.min" > singleplot(pre.mod, varname="Temp", + main="penalty.par.val=lambda.min\n(singleplot)", + penalty.par.val="lambda.min") > > plotmo(pre.mod, + pmethod="partdep", + degree1="Temp", degree2=0, + do.par=FALSE, + main="penalty.par.val=lambda.min\n(plotmo partdep)", + predict.penalty.par.val="lambda.min") # use "predict." to pass it on to predict.pre calculating partdep for Temp > > par(org.par) > > # compare pairplot and plotmo > > par(mfrow=c(2,3)) # 6 plots per page > > pairplot(pre.mod, c("Temp", "Wind"), main="pairplot") Loading required namespace: interp > plotmo(pre.mod, main="plotmo partdep", + pmethod="partdep", + degree1=0, degree2="Temp", + do.par=FALSE) calculating partdep for Wind:Temp 01234567890 > > # Compare to pmethod="apartdep". An approximate partdep plot is > # faster than a full partdep plot (plotmo vignette Section 9.2). > > plotmo(pre.mod, main="plotmo apartdep", + pmethod="apartdep", + degree1=0, degree2="Temp", + do.par=FALSE) calculating apartdep for Wind:Temp 01234567890 > > # plot contour and image plots with plotmo > > plotmo(pre.mod, type2="contour", + degree1=0, degree2="Temp", do.par=FALSE) > > plotmo(pre.mod, type2="image", + degree1=0, degree2="Temp", do.par=FALSE) > > par(org.par) > > # test gpe models > > set.seed(2018) > gpe.mod <- gpe(Ozone~., data=airq, + base_learners=list(gpe_linear(), gpe_trees(), gpe_earth())) > plotmo(gpe.mod) # by default no degree2 plots because importance(gpe) not available plotmo grid: Wind Temp 10.3 75 > plotmo(gpe.mod, all2=TRUE, # force degree2 plot(s) by specifying all2=TRUE + persp.ticktype="detailed", persp.nticks=2) # optional (these get passed on to persp) plotmo grid: Wind Temp 10.3 75 > plotmo(gpe.mod, degree1=0, degree2=c("Wind", "Temp"), SHOWCALL=TRUE) # explictly specify degree2 plot > # which=3 below for only the residuals-vs-fitted plot > # optional info=TRUE to plot some extra information (RSq etc.) > plotres(gpe.mod, which=3, info=TRUE, main="gpe.mod residuals") > > # multinomial response > > set.seed(2018) > pre.iris <- pre(Species~., data=iris, ntrees=10) # ntrees=10 for faster testoptions(warn=2) # treat warnings as errors > options(warn=2) # treat warnings as errors > expect.err(try(plotmo(pre.iris)), "Defaulting to nresponse=1, see above messages") predict.pre[3,3]: setosa versicolor virginica 1 0.9746686 0.01299582 0.01233561 2 0.9746686 0.01299582 0.01233561 3 0.9750720 0.01300120 0.01192680 predict.pre returned multiple columns (see above) but nresponse is not specified Use the nresponse argument to specify a column. Example: nresponse=2 Example: nresponse="versicolor" Error : (converted from warning) Defaulting to nresponse=1, see above messages Got expected error from try(plotmo(pre.iris)) > options(warn=1) # print warnings as they occur > plotmo(pre.iris, all2=TRUE, nresponse="virginica", trace=1) importance: Petal.Length Petal.Width stats::predict(pre.object, data.frame[3,4], type="response") stats::fitted(object=pre.object) fitted() was unsuccessful, will use predict() instead assuming "Species" in the model.frame is the response, because terms(object) did not return the terms nresponse=3 but for plotmo_y using nresponse=1 because ncol(y) == 1 assuming "Species" in the model.frame is the response, because terms(object) did not return the terms got model response from model.frame(Species ~ ., data=object$data, na.action="na.fail") plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 5.8 3 4.35 1.3 > > source("test.epilog.R") plotmo/inst/slowtests/test.plotmo.args.Rout.save0000644000176200001440000001725314563614021021655 0ustar liggesusers> # test.plotmo.args..R: test dot and other argument handling in plotmo > > source("test.prolog.R") > library(earth) Loading required package: Formula Loading required package: plotmo Loading required package: plotrix > data(ozone1) > options(warn=1) # print warnings as they occur > > options(warn=2) # treat warnings as errors > lm.mod <- lm(O3~wind, data=ozone1) > > expect.err(try(plotmo(lm.mod, se=2, leve=.95)), "plotmo's 'se' argument is deprecated, please use 'level' instead") Error : plotmo's 'se' argument is deprecated, please use 'level' instead Got expected error from try(plotmo(lm.mod, se = 2, leve = 0.95)) > > expect.err(try(plotmo(lm.mod, se=T)), "plotmo's 'se' argument is deprecated, please use 'level=.95' instead") Error : (converted from warning) plotmo's 'se' argument is deprecated, please use 'level=.95' instead Got expected error from try(plotmo(lm.mod, se = T)) > > expect.err(try(plotmo(lm.mod, se=.8)), "plotmo's 'se' argument is deprecated, please use 'level=.95' instead") Error : plotmo's 'se' argument is deprecated, please use 'level=.95' instead Got expected error from try(plotmo(lm.mod, se = 0.8)) > > expect.err(try(plotmo(lm.mod, level=2)), "level=2 is out of range, try level=.95") Error : level=2 is out of range, try level=.95 Got expected error from try(plotmo(lm.mod, level = 2)) > > oz2 <- ozone1[1:40,] > set.seed(2015) > a <- earth(O3~temp+wind, dat=oz2, deg=2, nk=21, ncr=3, nfo=3, varmod.me="lm") > > expect.err(try(plotmo(a, lw=2, trace=1, thresh=.9, SHOWCALL=TRUE)), "predict.earth ignored argument 'lw'") stats::predict(earth.object, NULL, type="response", lw=2, thresh=0.9) Error : (converted from warning) predict.earth ignored argument 'lw' Got expected error from try(plotmo(a, lw = 2, trace = 1, thresh = 0.9, SHOWCALL = TRUE)) > > options(warn=1) > > # test col.response and friends > plotmo(a, col.response=2, pch.response=c(1, 2, 20), type2="co", SHOWCALL=TRUE) # pch.response tests back compat plotmo grid: temp wind 53.5 4 > plotmo(a, pt.col=c(1,2,3), pt.pch=c(1, 2, 20), type2="im", SHOWCALL=TRUE) plotmo grid: temp wind 53.5 4 > plotmo(a, pt.col=c(1,2,3), pt.pch=paste(1:nrow(oz2)), pt.cex=.8, type2="im", do.par=2, SHOWCALL=TRUE) plotmo grid: temp wind 53.5 4 > plotmo(a, pt.col=c(1,2,3), pt.pch=paste(1:nrow(oz2)), pt.cex=.8, type2="co", degree1=0, do.par=F) Warning: plotmo: nothing to plot > par(org.par) > plotmo(a, col=2, SHOWCALL=TRUE) # will cause red response points plotmo grid: temp wind 53.5 4 > plotmo(a, pt.col=4, col=3, persp.col="pink", SHOWCALL=TRUE) # col now goes to lines plotmo grid: temp wind 53.5 4 > > # test cex and nrug and smooth > plotmo(a, cex=.8, SHOWCALL=TRUE, nrug=-1, rug.col=2, rug.lwd=1, smooth.col=3, + bty="n", col.lab="darkorange", xlab="an x label", cex.lab=1.2) # esoteric, but they work plotmo grid: temp wind 53.5 4 > plotmo(a, SHOWCALL=TRUE, density.col=2, density.lty=2, smooth.col=3, smooth.f=.3, col="lightblue") plotmo grid: temp wind 53.5 4 > plotmo(a, cex=1.2, SHOWCALL=TRUE, nrug="density") plotmo grid: temp wind 53.5 4 > > # test caption, grid, interval options > plotmo(a, caption.col=3, caption.font=2, grid.col="pink", + level=.8, SHOWCALL=TRUE) plotmo grid: temp wind 53.5 4 > plotmo(a, caption.col=2, caption.font=2, caption.cex=.8, grid.col=TRUE, bty="n", + level=.8, level.shade="lightblue", level.shade2="red", + grid.lty=3, grid.lwd=4, grid.nx=NA, SHOWCALL=TRUE) plotmo grid: temp wind 53.5 4 > > # test overall plot args handled by par() and graphics args outside do.par > par(mfrow=c(2,2), mar = c(3,3,3,1), mgp = c(1.5,.5,0), oma=c(0,0,4,0)) > par(col.main="#456789") > old.mar <- par("mar") > old.mfcol <- par("mfcol") > cat("before par: cex=", par("cex"), " col.main=", par("col.main"), + " col.axis=", par("col.axis"), " mar=", par("mar"), " mfcol=", par("mfcol"), + "\n", sep="") before par: cex=0.83 col.main=#456789 col.axis=black mar=3331 mfcol=22 > plotmo(a, mfcol=c(2,3), cex.main=1.4, oma=c(5,5,5,5), SHOWCALL=TRUE) plotmo grid: temp wind 53.5 4 > plotmo(a, caption="no cex") plotmo grid: temp wind 53.5 4 > plotmo(a, cex=1, caption="cex=1, plot should be identical to previous page") plotmo grid: temp wind 53.5 4 > plotmo(a, cex=1.2, caption="cex=1.2") plotmo grid: temp wind 53.5 4 > plotmo(a, do.par=FALSE, degree2=0, degree1=1, main="do.par=FALSE no cex", caption="a test graphics args with do.par=FALSE") plotmo grid: temp wind 53.5 4 > plotmo(a, do.par=FALSE, degree2=0, degree1=1, cex=1, main="do.par=FALSE cex=1") plotmo grid: temp wind 53.5 4 > plotmo(a, do.par=FALSE, degree2=0, degree1=1, cex=.8, main="do.par=FALSE cex=.8") plotmo grid: temp wind 53.5 4 > plotmo(a, do.par=FALSE, degree2=0, degree1=1, cex=1.1, xlab="xlab", col.main=2, col.axis="blue", col.lab=3, font.lab=2, + main="do.par=FALSE cex=1.1, col.main=2\ncol.axis=\"blue\", col.lab=3, font.lab=2") plotmo grid: temp wind 53.5 4 > plotmo(a, do.par=FALSE, degree1=1, degree2=1, persp.ticktype="d", + main="do.par=FALSE persp.ticktype=\"d\"") Warning: 'degree2' specified but no degree2 plots (maybe use all2=TRUE?) plotmo grid: temp wind 53.5 4 > # all of these should have been restored > cat("after par: cex=", par("cex"), " col.main=", par("col.main"), + " col.axis=", par("col.axis"), " mar=", par("mar"), " mfcol=", par("mfcol"), + "\n", sep="") after par: cex=0.83 col.main=#456789 col.axis=black mar=3331 mfcol=22 > stopifnot(par("col.main") == "#456789") > stopifnot(par("mar") == old.mar) > stopifnot(par("mfcol") == old.mfcol) > par(col.main=1) > > # test aliasing of col with other args, and back compat of col.degree1 vs degree1.col > data(etitanic) > a20 <- earth(pclass ~ ., data=etitanic, degree=2) > plotmo(a20, nresponse=1, col=2, col.degree1=3, persp.col="pink", SHOWCALL=1, degree1=1:2, degree2=1:2) plotmo grid: survived sex age sibsp parch 0 male 28 0 0 > plotmo(a20, nresponse=1, lty=2, persp.lty=1, SHOWCALL=1, degree1=1:2, degree2=1:2) plotmo grid: survived sex age sibsp parch 0 male 28 0 0 > > # test "prednames." with a long predictor name > data(trees) > trees.with.long.predname <- trees > trees.with.long.predname$a_quite_long_variable_name <- trees.with.long.predname$Girth > trees.with.long.predname$Girth <- NULL > mod <- earth(Volume~.,data=trees.with.long.predname) > par(mfrow=c(3,2), mar = c(3,3,3,1), mgp = c(1.5,.5,0), oma=c(0,0,4,0)) > plotmo(mod, do.par=FALSE) plotmo grid: Height a_quite_long_variable_name 76 12.9 > plotmo(mod, do.par=FALSE, prednames.abbreviate=FALSE) plotmo grid: Height a_quite_long_variable_name 76 12.9 > expect.err(try(plotmo(mod, do.par=FALSE, prednames.abbreviate=c(1,2))), "the prednames.abbreviate argument is not FALSE, TRUE, 0, or 1") Error : the prednames.abbreviate argument is not FALSE, TRUE, 0, or 1 Got expected error from try(plotmo(mod, do.par = FALSE, prednames.abbreviate = c(1, 2))) > plotmo(mod, do.par=FALSE, prednames.minlength=3) plotmo grid: Height a_quite_long_variable_name 76 12.9 > > source("test.epilog.R") plotmo/inst/slowtests/test.gbm.R0000644000176200001440000006241014664454304016473 0ustar liggesusers# test.gbm.R: gbm tests for plotmo and plotres source("test.prolog.R") library(gbm) library(rpart.plot) # for ptitanic, want data with NAs for testing library(plotmo) data(ptitanic) cat("--- distribution=\"gaussian\", formula interface ----------------------------------\n") set.seed(2016) ptit <- ptitanic[sample(1:nrow(ptitanic), size=70), ] # small data for fast test set.seed(2016) # # TODO bug in gbm: following causes error: survived is not of type numeric, ordered, or factor # ptit$survived <- ptit$survived == "survived" ptit <- ptit[!is.na(ptit$age), ] train.frac <- .8 set.seed(2016) gbm.gaussian <- gbm(age~., data=ptit, train.frac=train.frac, distribution="gaussian", n.trees=50, shrinkage=.1, keep.data=FALSE) expect.err(try(plotres(gbm.gaussian)), "use keep.data=TRUE in the call to gbm") set.seed(2016) gbm.gaussian <- gbm(age~., data=ptit, train.frac=train.frac, distribution="gaussian", n.trees=50, shrinkage=.1) par(mfrow=c(2,2), mar=c(3,3,4,1)) w1 <- plotres(gbm.gaussian, which=1, do.par=FALSE, w1.smooth=TRUE, w1.main="gbm.gaussian") cat("w1 plot for gbm.gaussian returned (w1.smooth=TRUE):\n") print(w1) plot(0, 0) # dummy plot w3 <- plotres(gbm.gaussian, which=3, do.par=FALSE, info=TRUE, smooth.col=0, col=ptit$sex, # ylim=c(-40,40), wmain="nresponse=1") # compare to manual residuals iused <- 1:(train.frac * nrow(ptit)) y <- ptit$age[iused] n.trees <- plotmo:::gbm.n.trees(gbm.gaussian) # TODO following fails in the new version of gbm (version 2.2) (you have to provide newdata) # yhat <- predict(gbm.gaussian, type="response", n.trees=n.trees) yhat <- predict(gbm.gaussian, newdata=ptit, type="response", n.trees=n.trees) yhat <- yhat[iused] plot(yhat, y - yhat, col=ptit$sex[iused], main="manual gaussian residuals", pch=20, ylim=c(-40,40)) abline(h=0, col="gray") stopifnot(all(yhat == w3$x)) stopifnot(all(y - yhat == w3$y)) par(org.par) w1 <- plotres(gbm.gaussian, predict.n.trees=13, w1.grid.col=1, trace=1, SHOWCALL=TRUE, w1.smooth=TRUE, w1.main="predict.n.trees=13 w1.grid.col=1") cat("second w1 plot for gbm.gaussian returned (w1.smooth=TRUE):\n") print(w1) plotmo(gbm.gaussian, trace=-1, SHOWCALL=TRUE) # plotmo(gbm.gaussian, trace=-1, all1=TRUE, SHOWCALL=TRUE) # plotmo(gbm.gaussian, trace=-1, all2=TRUE, SHOWCALL=TRUE) # test color argument par(mfrow=c(2,2), mar=c(3,3,4,1)) plotres(gbm.gaussian, which=1) title("test color argument") plotres(gbm.gaussian, which=1, w1.col=c(1,2,3,0)) plotres(gbm.gaussian, which=1, w1.col=c(1,0,0,4), w1.legend.x=40, w1.legend.y=.3) plotres(gbm.gaussian, which=1, w1.col=c(2,3,4,1), w1.legend.x="topright") par(org.par) par(mfrow=c(2,2), mar=c(3,3,4,1)) plot_gbm(gbm.gaussian) title("test plot_gbm") w1 <- plot_gbm(gbm.gaussian, col=c(1,2,3,0), grid.col=1, smooth=TRUE, main="col=c(1,2,3,0), grid.col=1") cat("third w1 plot for gbm.gaussian returned (smooth=TRUE):\n") print(w1) par(org.par) # test xlim and ylim par(mfrow=c(2,3), mar=c(3,3,4,1)) plot_gbm(gbm.gaussian, main="test xlim and ylim default") plot_gbm(gbm.gaussian, ylim=NULL, main="ylim=NULL") plot_gbm(gbm.gaussian, xlim=c(5, 50), main="xlim=c(5, 50)") plot_gbm(gbm.gaussian, ylim=c(100, 250), main="ylim=c(100, 250)") plot_gbm(gbm.gaussian, xlim=c(10, 25), ylim=c(150, 170), main="xlim=c(10, 25), ylim=c(150, 170)") plot_gbm(gbm.gaussian, xlim=c(-10, 40), ylim=c(-10, 300), legend.x=NA, main="xlim=c(-10, 40), ylim=c(-10, 300)\nlegend.x=NA") par(org.par) # test the smooth argument par(mfrow=c(3,3), mar=c(3,3,4,1)) imin <- plot_gbm(gbm.gaussian, main="smooth=default") imin.default <- imin cat("smooth=default imin=c(", imin[1], ",", imin[2], ",", imin[3], ",", imin[4], ")\n", sep="") imin <- plot_gbm(gbm.gaussian, smooth=c(1,0,0,0), main="smooth=c(1,0,0,0)") cat("smooth=c(1,0,0,0) imin=c(", imin[1], ",", imin[2], ",", imin[3], ",", imin[4], ")\n", sep="") imin <- plot_gbm(gbm.gaussian, smooth=c(0,1,0,0), main="smooth=c(0,1,0,0)") cat("smooth=c(0,1,0,0) imin=c(", imin[1], ",", imin[2], ",", imin[3], ",", imin[4], ")\n", sep="") imin <- plot_gbm(gbm.gaussian, smooth=c(0,0,1,0), main="smooth=c(0,0,1,0)") cat("smooth=c(0,0,1,0) imin=c(", imin[1], ",", imin[2], ",", imin[3], ",", imin[4], ")\n", sep="") imin <- plot_gbm(gbm.gaussian, smooth=c(0,0,0,1), main="smooth=c(0,0,0,1)\nsame as default") cat("smooth=c(0,0,0,1) imin=c(", imin[1], ",", imin[2], ",", imin[3], ",", imin[4], ")\n", sep="") imin <- plot_gbm(gbm.gaussian, smooth=c(0,0,0,0), main="smooth=c(0,0,0,0)") cat("smooth=c(0,0,0,0) imin=c(", imin[1], ",", imin[2], ",", imin[3], ",", imin[4], ")\n", sep="") imin <- plot_gbm(gbm.gaussian, smooth=c(0,0,1,1), main="smooth=c(0,0,1,1)") cat("smooth=c(0,0,1,1) imin=c(", imin[1], ",", imin[2], ",", imin[3], ",", imin[4], ")\n", sep="") imin <- plot_gbm(gbm.gaussian, smooth=1, main="smooth=1") # gets recycled cat("smooth=1 imin=c(", imin[1], ",", imin[2], ",", imin[3], ",", imin[4], ")\n", sep="") imin.smooth <- imin imin.noplot <- plot_gbm(gbm.gaussian, col=0) # will not be plotted print(imin.default) print(imin.noplot) stopifnot(identical(imin.default, imin.noplot)) imin.noplot <- plot_gbm(gbm.gaussian, col=0, smooth=1) # will not be plotted print(imin.smooth) print(imin.noplot) stopifnot(identical(imin.smooth, imin.noplot)) par(org.par) cat("--- distribution=\"gaussian\", glm.fit interface ----------------------------------\n") set.seed(2016) ptit <- ptitanic[sample(1:nrow(ptitanic), size=70), ] set.seed(2016) ptit <- ptit[!is.na(ptit$age), ] train.frac <- .8 set.seed(2016) gbm.gaussian.fit <- gbm.fit(ptit[,-4], ptit[,4], nTrain=floor(train.frac * nrow(ptit)), distribution="gaussian", verbose=FALSE, n.trees=50, shrinkage=.1) par(mfrow=c(2,2), mar=c(3,3,4,1)) w1 <- plotres(gbm.gaussian.fit, which=1, do.par=FALSE, w1.smooth=TRUE, w1.main="gbm.gaussian.fit") cat("w1 plot for gbm.gaussian.fit returned (w1.smooth=TRUE):\n") print(w1) plot(0, 0) # dummy plot w3 <- plotres(gbm.gaussian.fit, which=3, do.par=FALSE, info=TRUE, trace=0, smooth.col=0, col=ptit$sex, # ylim=c(-40,40), wmain="nresponse=1") # compare to manual residuals iused <- 1:(train.frac * nrow(ptit)) y.fit <- ptit$age[iused] n.trees <- plotmo:::gbm.n.trees(gbm.gaussian.fit) # TODO following fails in the new version of gbm (version 2.2) (you have to provide newdata) # yhat.fit <- predict(gbm.gaussian.fit, type="response", n.trees=n.trees) yhat.fit <- predict(gbm.gaussian.fit, newdata=ptit[,-4], type="response", n.trees=n.trees) yhat.fit <- yhat.fit[iused] # plot(yhat.fit, y.fit - yhat.fit, # col=ptit$sex[iused], main="manual gaussian residuals\n(TODO gbm.fit don't match)", # pch=20, ylim=c(-40,40)) # abline(h=0, col="gray") # --- TODO known issue, these fail --- # compare to formual interface # stopifnot(all(yhat.fit == yhat)) stopifnot(all(y.fit == y)) # # sanity check # stopifnot(all(yhat.fit == w3$x)) # stopifnot(all(y.fit - yhat.fit == w3$y.fit)) plotmo(gbm.gaussian.fit, trace=-1, SHOWCALL=TRUE) par(org.par) cat("--- distribution=\"laplace\" ----------------------------------\n") set.seed(2016) ptit <- ptitanic[sample(1:nrow(ptitanic), size=70), ] ptit <- ptit[!is.na(ptit$age), ] ptit$survived <- ptit$parch <- ptit$sex <- NULL train.frac <- .8 set.seed(2016) gbm.laplace <- gbm(age~., data=ptit, train.frac=train.frac, distribution="laplace", n.trees=100, shrinkage=.1) par(mfrow=c(2,2), mar=c(3,3,4,1)) w1 <- plotres(gbm.laplace, which=1:2, do.par=FALSE, w1.smooth=TRUE, w1.main="gbm.laplace") cat("w1 plot for gbm.laplace returned (w1.smooth=TRUE):\n") print(w1) w3 <- plotres(gbm.laplace, which=3, do.par=FALSE, info=TRUE) # compare to manual residuals iused <- 1:(train.frac * nrow(ptit)) y <- ptit$age[iused] n.trees <- plotmo:::gbm.n.trees(gbm.laplace) # TODO following fails in the new version of gbm (version 2.2) (you have to provide newdata) # yhat <- predict(gbm.laplace, type="response", n.trees=n.trees) yhat <- predict(gbm.laplace, newdata=ptit, type="response", n.trees=n.trees) yhat <- yhat[iused] plot(yhat, y - yhat, main="manual laplace residuals", pch=20, ylim=c(-40,40)) abline(h=0, col="gray") stopifnot(all(yhat == w3$x)) stopifnot(all(y - yhat == w3$y)) plotmo(gbm.laplace, trace=-1, SHOWCALL=TRUE) par(org.par) # # TODO commented out because gives random slightly different results per invocation # cat("--- distribution=\"tdist\" ----------------------------------\n") # # set.seed(2016) # ptit <- ptitanic[sample(1:nrow(ptitanic), size=70), ] # ptit <- ptit[!is.na(ptit$age), ] # ptit$survived <- ptit$parch <- ptit$sex <- NULL # train.frac <- .8 # set.seed(2016) # gbm.tdist <- gbm(age~., data=ptit, train.frac=train.frac, # distribution="tdist", # n.trees=100, shrinkage=.1) # par(mfrow=c(2,2), mar=c(3,3,4,1)) # set.seed(2016) # w1 <- plotres(gbm.tdist, which=1:2, do.par=FALSE, # w1.main="gbm.tdist") # # cat("w1 plot for gbm.tdist returned (w1.smooth=default):\n") # print(w1) # # set.seed(2016) # w3 <- plotres(gbm.tdist, which=3, do.par=FALSE, info=TRUE) # # # compare to manual residuals # iused <- 1:(train.frac * nrow(ptit)) # y <- ptit$age[iused] # n.trees <- plotmo:::gbm.n.trees(gbm.tdist) # # TODO following fails in the new version of gbm (version 2.2) (you have to provide newdata) # # yhat <- predict(gbm.tdist, type="response", n.trees=n.trees) # yhat <- predict(gbm.tdist, newdata=ptit, type="response", n.trees=n.trees) # yhat <- yhat[iused] # plot(yhat, y - yhat, # main="manual tdist residuals", # pch=20, ylim=c(-40,40)) # abline(h=0, col="gray") # stopifnot(all(yhat == w3$x)) # stopifnot(all(y - yhat == w3$y)) # plotmo(gbm.tdist, trace=-1, SHOWCALL=TRUE) # par(org.par) cat("--- distribution=\"bernoulli\" ----------------------------------\n") set.seed(2016) ptit <- ptitanic[sample(1:nrow(ptitanic), size=80), ] ptit$survived <- as.numeric(ptit$survived == "survived") temp <- ptit$pclass # put pclass at the end so can check ordering of importances ptit$pclass <- NULL ptit$pclass <- factor(as.numeric(temp), labels=c("first", "second", "third")) train.frac <- .9 set.seed(2016) gbm.bernoulli <- gbm(survived~., data=ptit, train.frac=train.frac, distribution="bernoulli", n.trees=100, shrinkage=.1, cv.folds=3) par(mfrow=c(2,2)) par(mar=c(3.5, 3, 2, 0.5)) # small margins and text to pack figs in par(mgp=c(1.5, .4, 0)) # squash axis annotations w1 <- plotres(gbm.bernoulli, which=c(1,4), col=ptit$survived+2, trace=0, do.par=FALSE, w1.main="gbm.bernoulli") cat("w1 plot for gbm.bernoulli with cv.folds=3 returned:\n") print(w1) w3 <- plotres(gbm.bernoulli, which=3, predict.n.trees=40, ylim=c(-.6, 1), xlim=c(.1, .6), col=ptit$sex, trace=0, do.par=FALSE, smooth.col=0) # compare to manual residuals iused <- 1:(train.frac * nrow(ptit)) y <- ptit$survived[iused] # TODO following fails in the new version of gbm (version 2.2) (you have to provide newdata) # yhat <- predict(gbm.bernoulli, type="response", n.trees=40) yhat <- predict(gbm.bernoulli, newdata=ptit, type="response", n.trees=40) yhat <- yhat[iused] plot(yhat, y - yhat, col=ptit$sex, main="manual bernoulli residuals", pch=20, cex=1, ylim=c(-.6, 1), xlim=c(.1, .6)) abline(h=0, col="gray") stopifnot(all(yhat == w3$x)) stopifnot(all(y - yhat == w3$y)) par(org.par) plotmo(gbm.bernoulli, do.par=2) print(summary(gbm.bernoulli)) # will also plot par(org.par) cat("--- distribution=\"huberized\" ----------------------------------\n") set.seed(2016) ptit <- ptitanic[sample(1:nrow(ptitanic), size=100), ] ptit$survived <- as.numeric(ptit$survived == "survived") ptit$sibsp <- ptit$parch <- ptit$pclass <- NULL train.frac <- 1 set.seed(2016) gbm.huberized <- gbm(survived~., data=ptit, train.frac=train.frac, distribution="huberized", n.trees=200, shrinkage=.1) par(mfrow=c(2,2)) par(mar=c(3.5, 3, 2, 0.5)) # small margins and text to pack figs in par(mgp=c(1.5, .4, 0)) # squash axis annotations w1 <- plotres(gbm.huberized, which=c(1,4), col=ptit$survived+2, trace=0, do.par=FALSE, w1.main="gbm.huberized") cat("w1 plot for gbm.huberized returned (smooth=default):\n") print(w1) # TODO huberized residuals look weird w3 <- plotres(gbm.huberized, which=3, predict.n.trees=40, col=ptit$sex, trace=0, do.par=FALSE, smooth.col=0) # compare to manual residuals iused <- 1:(train.frac * nrow(ptit)) y <- ptit$survived[iused] # TODO following fails in the new version of gbm (version 2.2) (you have to provide newdata) # yhat <- predict(gbm.huberized, type="response", n.trees=40) yhat <- predict(gbm.huberized, newdata=ptit, type="response", n.trees=40) yhat <- yhat[iused] plot(yhat, y - yhat, col=ptit$sex, ylim=c(-2.5, 2.5), main="manual huberized residuals", pch=20) abline(h=0, col="gray") stopifnot(all(yhat == w3$x)) stopifnot(all(y - yhat == w3$y)) par(org.par) plotmo(gbm.huberized, do.par=2) print(summary(gbm.huberized)) # will also plot par(org.par) cat("--- distribution=\"adaboost\" ----------------------------------\n") set.seed(2016) ptit <- ptitanic[sample(1:nrow(ptitanic), size=100), ] ptit$survived <- as.numeric(ptit$survived == "survived") ptit$sibsp <- ptit$parch <- ptit$pclass <- NULL train.frac <- .8 set.seed(2016) gbm.adaboost <- gbm(survived~., data=ptit, train.frac=train.frac, distribution="adaboost", n.trees=150, shrinkage=.01) par(mfrow=c(2,2)) par(mar=c(3.5, 3, 2, 0.5)) # small margins and text to pack figs in par(mgp=c(1.5, .4, 0)) # squash axis annotations w1 <- plotres(gbm.adaboost, which=c(1,4), col=ptit$survived+2, trace=0, do.par=FALSE, w1.main="gbm.adaboost") cat("w1 plot for gbm.adaboost returned (smooth=default):\n") print(w1) w3 <- plotres(gbm.adaboost, which=3, predict.n.trees=40, col=ptit$sex, trace=0, do.par=FALSE, smooth.col=0) # compare to manual residuals iused <- 1:(train.frac * nrow(ptit)) y <- ptit$survived[iused] # TODO following fails in the new version of gbm (version 2.2) (you have to provide newdata) # yhat <- predict(gbm.adaboost, type="response", n.trees=40) yhat <- predict(gbm.adaboost, newdata=ptit, type="response", n.trees=40) yhat <- yhat[iused] plot(yhat, y - yhat, col=ptit$sex, main="manual adaboost residuals", pch=20) abline(h=0, col="gray") stopifnot(all(yhat == w3$x)) stopifnot(all(y - yhat == w3$y)) par(org.par) plotmo(gbm.adaboost, do.par=2) print(summary(gbm.adaboost)) # will also plot par(org.par) # test gbm multinomial model, also test very small number of trees in plot_gbm data(iris) set.seed(2016) gbm.iris <- gbm(Species~., data=iris, distribution="multinomial", n.tree=5) expect.err(try(plotres(gbm.iris)), "gbm distribution=\"multinomial\" is not yet supported") expect.err(try(plotmo(gbm.iris)), "gbm distribution=\"multinomial\" is not yet supported") plot_gbm(gbm.iris) # TODO following fails in the new version of gbm (version 2.2) # (distribution "multinomial" is no longer supported) # # cat("--- distribution=\"multinomial\" ----------------------------------\n") # # set.seed(2016) # ptit <- ptitanic[sample(1:nrow(ptitanic), size=500), ] # set.seed(2016) # gbm.multinomial <- gbm(pclass~., # data=ptit, train.frac=.7, # distribution="multinomial", # n.trees=100, shrinkage=.1) # # w1 <- plot_gbm(gbm.multinomial, main="gbm.multinomial", smooth=T) # cat("plot_gbm for gbm.multinomial returned (smooth=TRUE):\n") # print(w1) # # expect.err(try(plotres(gbm.multinomial)), # "gbm distribution=\"multinomial\" is not yet supported") # # expect.err(try(plotmo(gbm.multinomial)), # "gbm distribution=\"multinomial\" is not yet supported") # cat("--- gbmt distribution=\"Gaussian\", formula interface ----------------------------------\n") # # set.seed(2016) # ptit <- ptitanic[sample(1:nrow(ptitanic), size=70), ] # small data for fast test # set.seed(2016) # # # TODO bug in gbm: following causes error: survived is not of type numeric, ordered, or factor # # ptit$survived <- ptit$survived == "survived" # ptit <- ptit[!is.na(ptit$age), ] # # TODO change this to build same model as gbm.gaussian # train_params <- # training_params(num_trees = 50, # shrinkage = 0.1, # bag_fraction = 0.5, # num_train = round(.8 * nrow(ptit))) # par(mfrow=c(2,2), mar=c(3,3,4,1)) # set.seed(2016) # gbmt.gaussian <- gbmt(age~., data=ptit, # distribution=gbm_dist("Gaussian"), # train_params = train_params, # is_verbose = FALSE) # expect.err(try(plotres(gbmt.gaussian)), # "use keep.data=TRUE in the call to gbm") # set.seed(2016) # gbmt.gaussian <- gbmt(age~., data=ptit, # distribution=gbm_dist("Gaussian"), # train_params = train_params, # is_verbose = FALSE, keep_gbm_data=TRUE) # w1 <- plotres(gbmt.gaussian, which=1, do.par=FALSE, w1.smooth=TRUE, # w1.main="gbmt.gaussian") # cat("w1 plot for gbmt.gaussian returned (w1.smooth=TRUE):\n") # print(w1) # plot(0, 0) # dummy plot # set.seed(2016) # w3 <- plotres(gbmt.gaussian, which=3, do.par=FALSE, info=TRUE, # smooth.col=0, col=ptit$sex, # ylim=c(-40,40), # wmain="nresponse=1") # # # compare to manual residuals # iused <- 1:(train.frac * nrow(ptit)) # y <- ptit$age[iused] # n.trees <- plotmo:::gbm.n.trees(gbmt.gaussian) # # TODO following fails in the new version of gbm (version 2.2) (you have to provide newdata) # # yhat <- predict(gbmt.gaussian, type="response", n.trees=n.trees) # yhat <- predict(gbmt.gaussian, newdata=ptit, type="response", n.trees=n.trees) # yhat <- yhat[iused] # plot(yhat, y - yhat, # col=ptit$sex[iused], main="manual gaussian residuals", # pch=20, ylim=c(-40,40)) # abline(h=0, col="gray") # stopifnot(all(yhat == w3$x)) # stopifnot(all(y - yhat == w3$y)) # par(org.par) # # w1 <- plotres(gbmt.gaussian, predict.n.trees=13, w1.grid.col=1, trace=1, SHOWCALL=TRUE, # w1.smooth=TRUE, # w1.main="predict.n.trees=13 w1.grid.col=1") # cat("second w1 plot for gbmt.gaussian returned (w1.smooth=TRUE):\n") # print(w1) # plotmo(gbmt.gaussian, trace=-1, SHOWCALL=TRUE) # # par(org.par) # # cat("--- distribution=\"bernoulli\" ----------------------------------\n") # # set.seed(2016) # ptit <- ptitanic[sample(1:nrow(ptitanic), size=80), ] # ptit$survived <- ptit$survived == "survived" # temp <- ptit$pclass # put pclass at the end so can check ordering of importances # ptit$pclass <- NULL # ptit$pclass <- factor(as.numeric(temp), labels=c("first", "second", "third")) # # TODO change this to build same model as gbm.bernoulli # train_params <- # training_params(num_trees = 100, # shrinkage = 0.1, # bag_fraction = 0.5, # num_train = round(.8 * nrow(ptit))) # set.seed(2016) # gbmt.bernoulli <- gbmt(survived~., data=ptit, # distribution=gbm_dist("Bernoulli"), # train_params = train_params, # cv_folds = 3, # is_verbose = FALSE, keep_gbm_data=TRUE) # par(mfrow=c(2,2)) # par(mar=c(3.5, 3, 2, 0.5)) # small margins and text to pack figs in # par(mgp=c(1.5, .4, 0)) # squash axis annotations # w1 <- plotres(gbmt.bernoulli, which=c(1,4), # col=ptit$survived+2, trace=0, do.par=FALSE, # w1.main="gbmt.bernoulli") # cat("w1 plot for gbmt.bernoulli with cv.folds=3 returned:\n") # print(w1) # # w3 <- plotres(gbmt.bernoulli, which=3, predict.n.trees=40, # ylim=c(-.6, 1), xlim=c(.1, .6), # col=ptit$sex, trace=0, do.par=FALSE, smooth.col=0) # # # compare to manual residuals # iused <- 1:(train.frac * nrow(ptit)) # y <- ptit$survived[iused] # # TODO following fails in the new version of gbm (version 2.2) (you have to provide newdata) # # yhat <- predict(gbmt.bernoulli, type="response", n.trees=40) # yhat <- predict(gbmt.bernoulli, newdata=ptit, type="response", n.trees=40) # yhat <- yhat[iused] # plot(yhat, y - yhat, col=ptit$sex, # main="manual bernoulli residuals", pch=20, cex=1, # ylim=c(-.6, 1), xlim=c(.1, .6)) # abline(h=0, col="gray") # stopifnot(all(yhat == w3$x)) # stopifnot(all(y - yhat == w3$y)) # par(org.par) # # plotmo(gbmt.bernoulli, do.par=2) # print(summary(gbmt.bernoulli)) # will also plot # par(org.par) cat("--- gbm3: distribution=\"gaussian\", formula interface ----------------------------------\n") library(gbm3) set.seed(2016) ptit <- ptitanic[sample(1:nrow(ptitanic), size=70), ] # small data for fast test set.seed(2016) # # TODO bug in gbm3: following causes error: survived is not of type numeric, ordered, or factor # ptit$survived <- ptit$survived == "survived" ptit <- ptit[!is.na(ptit$age), ] train.frac <- .8 set.seed(2016) gbm3.gaussian <- gbm3::gbm(age~., data=ptit, train.frac=train.frac, distribution="gaussian", n.trees=50, shrinkage=.1, keep.data=FALSE) expect.err(try(plotres(gbm3.gaussian)), "use keep_gbm_data=TRUE in the call to gbm") set.seed(2016) gbm3.gaussian <- gbm3::gbm(age~., data=ptit, train.frac=train.frac, distribution="gaussian", n.trees=50, shrinkage=.1) par(mfrow=c(2,2), mar=c(3,3,4,1)) w1 <- plotres(gbm3.gaussian, which=1, do.par=FALSE, w1.smooth=TRUE, w1.main="gbm3.gaussian") cat("w1 plot for gbm3.gaussian returned (w1.smooth=TRUE):\n") print(w1) plot(0, 0) # dummy plot w3 <- plotres(gbm3.gaussian, which=3, do.par=FALSE, info=TRUE, smooth.col=0, col=ptit$sex, # ylim=c(-40,40), wmain="nresponse=1") # compare to manual residuals iused <- 1:(train.frac * nrow(ptit)) y <- ptit$age[iused] n.trees <- plotmo:::gbm.n.trees(gbm3.gaussian) # TODO following fails in the new version of gbm (version 2.2) (you have to provide newdata) # yhat <- predict(gbm3.gaussian, type="response", n.trees=n.trees) yhat <- predict(gbm3.gaussian, newdata=ptit, type="response", n.trees=n.trees) yhat <- yhat[iused] plot(yhat, y - yhat, col=ptit$sex[iused], main="manual gaussian residuals", pch=20, ylim=c(-40,40)) abline(h=0, col="gray") stopifnot(all(yhat == w3$x)) stopifnot(all(y - yhat == w3$y)) par(org.par) w1 <- plotres(gbm3.gaussian, predict.n.trees=13, w1.grid.col=1, trace=1, SHOWCALL=TRUE, w1.smooth=TRUE, w1.main="predict.n.trees=13 w1.grid.col=1") cat("second w1 plot for gbm3.gaussian returned (w1.smooth=TRUE):\n") print(w1) plotmo(gbm3.gaussian, trace=-1, SHOWCALL=TRUE) # plotmo(gbm3.gaussian, trace=-1, all1=TRUE, SHOWCALL=TRUE) # plotmo(gbm3.gaussian, trace=-1, all2=TRUE, SHOWCALL=TRUE) cat("--- gbm3: distribution=\"gaussian\", xy interface ----------------------------------\n") y = ptit$age x = ptit[,c(1,2,3,5,6)] train_params=gbm3::training_params(num_trees=100, interaction_depth=2, min_num_obs_in_node=3, shrinkage=0.1, bag_fraction=0.5, id=seq_len(nrow(x)), num_train=round(0.5 * nrow(x)), num_features=ncol(x)) gbm3fit <- gbm3::gbmt_fit(x, y, train_params=train_params, keep_gbm_data=TRUE, dist=gbm_dist("Gaussian")) plotmo(gbm3fit, trace=-1, SHOWCALL=TRUE) plotres(gbm3fit, trace=-1, SHOWCALL=TRUE) cat("--- gbm3: large number of variables ----------------------------------\n") set.seed(2024) N <- 1000 X <- data.frame(X1=runif(N), X2=2*runif(N), X3=3*runif(N), X4=runif(N), X5=2*runif(N), X6=3*runif(N), X7=runif(N), X8=2*runif(N), X9=3*runif(N), X10=runif(N), X11=2*runif(N), X12=3*runif(N), X13=runif(N), X14=2*runif(N), X15=3*runif(N)) # Y <- sample(c(0, 1), N, replace = TRUE) set.seed(2024) Y <- sqrt(X[,1]) + sqrt(X[,2]) + sqrt(X[,3]) + sqrt(X[,4]) + sqrt(X[,5]) + sqrt(X[,6]) + .5 * sqrt(X[,8]) + sqrt(X[,9]) + sqrt(X[,10]) + sqrt(X[,11]) + sqrt(X[,12]) data <- data.frame(Y, X) set.seed(2024) gbm3.big <- gbm3::gbm(Y~., data=data, shrinkage=0.1, dist="gaussian") y = data[,1] x = data[,2:ncol(data)] train_params=gbm3::training_params(num_trees=100, interaction_depth=3, min_num_obs_in_node=10, shrinkage=0.1, bag_fraction=0.5, id=seq_len(nrow(x)), num_train=round(0.5 * nrow(x)), num_features=ncol(x)) gbm3fit.big <- gbm3::gbmt_fit(x, y, train_params=train_params, keep_gbm_data=TRUE, dist=gbm_dist("Gaussian")) set.seed(2024) plotmo(gbm3.big, SHOWCALL=TRUE) plotmo(gbm3.big, all1=TRUE, all2=TRUE, caption="all1=TRUE, all2=TRUE") plotmo(gbm3.big, all1=TRUE, all2=2, caption="all1=TRUE, all2=2") plotres(gbm3.big, trace=-1, SHOWCALL=TRUE) set.seed(2024) plotmo(gbm3fit.big, SHOWCALL=TRUE) plotmo(gbm3fit.big, all1=TRUE, caption="all1=TRUE") plotmo(gbm3fit.big, all2=TRUE, caption="all2=TRUE") plotmo(gbm3fit.big, all2=2, caption="all2=2") plotres(gbm3.big, trace=-1, SHOWCALL=TRUE) source("test.epilog.R") plotmo/inst/slowtests/test.plotmo.x.R0000644000176200001440000002737213725307664017521 0ustar liggesusers# test.plotmo.x.R: test plotmo_x and related functions source("test.prolog.R") library(plotmo) library(earth) options(warn=1) # print warnings as they occur data(ozone1) data(etitanic) get.tit <- function() { tit <- etitanic pclass <- as.character(tit$pclass) # change the order of the factors so not alphabetical pclass[pclass == "1st"] <- "first" pclass[pclass == "2nd"] <- "class2" pclass[pclass == "3rd"] <- "classthird" tit$pclass <- factor(pclass, levels=c("class2", "classthird", "first")) # log age is so we have a continuous predictor even when model is age~. set.seed(2015) tit$logage <- log(tit$age) + rnorm(nrow(tit)) tit$parch <- NULL # by=12 gives us a small fast model with an additive and a interaction term tit <- tit[seq(1, nrow(etitanic), by=12), ] } X <- X1 <- X2 <- Y <- DF <- NULL get.data <- function() { X <<- matrix(c(1,2,3,4,5,6,7,8,9, 2,3,3,5,6,7,8,9,9), ncol=2) colnames(X) <- c("xx1", "xx2") X1 <<- X[,1] X2 <<- X[,2] Y <<- c(1,2,7,4,5,6,6,6,6) DF <<- data.frame(Y=Y, X1=X1, X2=X2) } stopifnot1 <- function(x, y){ xname <- deparse(substitute(x)) yname <- deparse(substitute(y)) if(!all(x == y)) stop(sprint("%s == %s failed\n", xname, yname, call.=FALSE)) printf("%s == %s passed\n", xname, yname) } printf("====== standard earth.formula model with a data frame\n") get.data() earth.form.df.dot <- earth(Y~., data=DF) plotmo(earth.form.df.dot, caption="test basic use of DF") printf("-- test basic use of DF\n") rv <- plotmo(earth.form.df.dot, trace=100) stopifnot1(rv, X) printf("-- test use same DF even when other variables change\n") get.data() earth.form.df.dot <- earth(Y~., data=DF) X1 <- "rubbish" rv <- plotmo(earth.form.df.dot, trace=100) stopifnot1(rv, X) printf("-- test detect that DF is now trashed\n") get.data() earth.form.df.dot <- earth(Y~., data=DF) DF <- "rubbish" X1 <- "rubbish" # DF is corrupt and will treated as NULL by plotmo, so make sure plotmo doesn't find the global X1 # invalid 'envir' argument of type 'character' expect.err(try(plotmo(earth.form.df.dot, trace=100)), "cannot get the original model predictors") # Removed this test because this no longer fails, because we get the formula using formula(object) # printf("-- DF is NULL so will get '.' in formula and no 'data' argument\n") # get.data() # earth.form.df.dot <- earth(Y~., data=DF) # DF <- NULL # # '.' in formula and no 'data' argument # expect.err(try(plotmo(earth.form.df.dot, trace=100)), "cannot get the original model predictors") printf("-- DF is NULL so will pick up X1 with same values from global environment\n") get.data() earth.form.df <- earth(Y~X1+X2, data=DF) DF <- NULL rv <- plotmo(earth.form.df, trace=100) stopifnot1(rv, X) printf("-- DF is NULL so will will pick up trashed X1 from global environment\n") earth.form.df <- earth(Y~X1+X2, data=DF) DF <- NULL X1 <- "rubbish" # variable lengths differ (found for 'X1') expect.err(try(plotmo(earth.form.df, trace=100)), "cannot get the original model predictors") printf("-- DF has only one column, so will pick up X1 from it and X2 from global environment\n") get.data() earth.form.df <- earth(Y~X1+X2, data=DF) DF <- data.frame(Y=Y, X1=X1) DF[1,2] <- 99 X2[1] <- 98 rv <- plotmo(earth.form.df, trace=100) stopifnot1(rv[1,1], 99) stopifnot1(rv[1,2], 98) printf("-- sanity check, make sure we are back to normal\n") get.data() earth.form.df <- earth(Y~X1+X2, data=DF) rv <- plotmo(earth.form.df, trace=100) stopifnot1(rv, X) printf("-- change the data frame, make sure we pick up the changed value\n") get.data() earth.form.df <- earth(Y~X1+X2, data=DF) DF[1,2] <- 99 rv <- plotmo(earth.form.df, trace=100) stopifnot1(rv[1,1], 99) printf("-- change order of columns in the data frame, should be ok\n") get.data() earth.form.df <- earth(Y~X1+X2, data=DF) DF <- data.frame(X2=X2, X1=X1) rv <- plotmo(earth.form.df, trace=100) stopifnot1(rv, X) printf("======= standard earth.formula model with a data frame and keepxy\n") get.data() earth.form.df.keepxy <- earth(Y~., data=DF, keepxy=TRUE) printf("-- test basic use of DF\n") rv <- plotmo(earth.form.df.keepxy, trace=100) stopifnot1(rv, X) printf("-- test use same DF even when other variables change\n") earth.form.df.keepxy <- earth(Y~., data=DF, keepxy=TRUE) X1 <- "rubbish" rv <- plotmo(earth.form.df.keepxy, trace=100) stopifnot1(rv, X) printf("-- DF is now trashed but it doesn't matter because keepxy=T\n") DF <- "rubbish" rv <- plotmo(earth.form.df.keepxy, trace=100) stopifnot1(rv, X) printf("-- DF is NULL but it doesn't matter because keepxy=T\n") get.data() earth.form.df.keepxy <- earth(Y~., data=DF, keepxy=TRUE) DF <- NULL rv <- plotmo(earth.form.df.keepxy, trace=100) stopifnot1(rv, X) printf("-- DF and X1 are NULL but it doesn't matter because keepxy=T\n") DF <- NULL X1 <- "rubbish" rv <- plotmo(earth.form.df.keepxy, trace=100) stopifnot1(rv, X) printf("-- sanity check, make sure we are back to normal\n") get.data() earth.form.df.keepxy <- earth(Y~., data=DF, keepxy=TRUE) rv <- plotmo(earth.form.df.keepxy, trace=100) stopifnot1(rv, X) printf("-- change the data frame, but it doesn't matter because keepxy=T\n") get.data() earth.form.df.keepxy <- earth(Y~., data=DF, keepxy=TRUE) DF[1,2] <- 99 rv <- plotmo(earth.form.df.keepxy, trace=100) stopifnot1(rv, X) printf("-- change order of columns in the data frame, should be ok\n") get.data() earth.form.df.keepxy <- earth(Y~., data=DF, keepxy=TRUE) DF <- data.frame(X2=X2, X1=X1) rv <- plotmo(earth.form.df.keepxy, trace=100) stopifnot1(rv, X) printf("======= standard lm model with a data frame but with model=FALSE\n") get.data() lm.form.df.model.false.with.dot <- lm(Y~., data=DF, model=FALSE) printf("-- test basic use of DF\n") rv <- plotmo(lm.form.df.model.false.with.dot, trace=100) stopifnot1(rv, X) printf("-- test use same DF even when other variables change\n") get.data() lm.form.df.model.false.with.dot <- lm(Y~., data=DF, model=FALSE) X1 <- "rubbish" rv <- plotmo(lm.form.df.model.false.with.dot, trace=100) stopifnot1(rv, X) printf("-- test detect that DF is now trashed\n") DF <- "rubbish" # invalid 'envir' argument of type 'character' expect.err(try(plotmo(lm.form.df.model.false.with.dot, trace=100)), "cannot get the original model predictors") printf("-- DF is NULL so will pick up X1 with same values from global environment\n") get.data() lm.form.df.model.false <- lm(Y~X1+X2, data=DF, model=FALSE) DF <- NULL rv <- plotmo(earth.form.df, trace=100) stopifnot1(rv, X) printf("-- DF is NULL so will will pick up trashed X1 from global environment\n") get.data() lm.form.df.model.false <- lm(Y~X1+X2, data=DF, model=FALSE) DF <- NULL X1 <- "rubbish" # variable lengths differ (found for 'X1') expect.err(try(plotmo(lm.form.df.model.false, trace=100)), "cannot get the original model predictors") printf("-- sanity check, make sure we are back to normal\n") get.data() lm.form.df.model.false <- lm(Y~X1+X2, data=DF, model=FALSE) rv <- plotmo(lm.form.df.model.false, trace=100) stopifnot1(rv, X) printf("-- change the data frame, make sure we pick up the changed value\n") get.data() lm.form.df.model.false <- lm(Y~X1+X2, data=DF, model=FALSE) DF[1,2] <- 99 rv <- plotmo(lm.form.df.model.false, trace=100) stopifnot1(rv[1,1], 99) printf("-- change order of columns in the data frame, should be ok\n") get.data() lm.form.df.model.false <- lm(Y~X1+X2, data=DF, model=FALSE) DF <- data.frame(X2=X2, X1=X1) rv <- plotmo(lm.form.df.model.false, trace=100) stopifnot1(rv, X) printf("======= standard lm with a data frame and model=TRUE (the default)\n") get.data() lm.form.df.with.dot <- lm(Y~., data=DF) printf("-- test basic use of DF\n") rv <- plotmo(lm.form.df.with.dot, trace=100) stopifnot1(rv, X) printf("-- test use same DF even when other variables change\n") get.data() lm.form.df.with.dot <- lm(Y~., data=DF) X1 <- "rubbish" rv <- plotmo(lm.form.df.with.dot, trace=100) stopifnot1(rv, X) printf("-- DF is now trashed but it doesn't matter because keepxy=T\n") DF <- "rubbish" rv <- plotmo(lm.form.df.with.dot, trace=100) stopifnot1(rv, X) printf("-- DF is NULL but it doesn't matter because keepxy=T\n") get.data() lm.form.df.with.dot <- lm(Y~., data=DF) DF <- NULL rv <- plotmo(lm.form.df.with.dot, trace=100) stopifnot1(rv, X) printf("-- DF and X1 are NULL but it doesn't matter because keepxy=T\n") DF <- NULL X1 <- "rubbish" rv <- plotmo(lm.form.df.with.dot, trace=100) stopifnot1(rv, X) printf("-- sanity check, make sure we are back to normal\n") get.data() lm.form.df.with.dot <- lm(Y~., data=DF) rv <- plotmo(lm.form.df.with.dot, trace=100) stopifnot1(rv, X) printf("-- change the data frame, but it doesn't matter because keepxy=T\n") get.data() lm.form.df.with.dot <- lm(Y~., data=DF) DF[1,2] <- 99 rv <- plotmo(lm.form.df.with.dot, trace=100) stopifnot1(rv, X) printf("-- change order of columns in the data frame, should be ok\n") get.data() lm.form.df.with.dot <- lm(Y~., data=DF) DF <- data.frame(X2=X2, X1=X1) rv <- plotmo(lm.form.df.with.dot, trace=100) stopifnot1(rv, X) printf("======= standard lm with a data frame and model=FALSE but x=TRUE\n") get.data() lm.form.df.model.false.x.true <- lm(Y~., data=DF, model=FALSE, x=TRUE) printf("-- test basic use of DF\n") rv <- plotmo(lm.form.df.model.false.x.true, trace=100) stopifnot1(rv, X) printf("-- test DF not available (shouldn't matter)\n") DF <- "rubbish" rv <- plotmo(lm.form.df.model.false.x.true, trace=100) stopifnot1(rv, X) printf("-- test $x trashed causes failure\n") get.data() lm.form.df.model.false.x.true <- lm(Y~., data=DF, model=FALSE, x=TRUE) DF <- "rubbish" X2 <- "rubbish1" lm.form.df.model.false.x.true[["x"]] <- "nonesuch" expect.err(try(plotmo(lm.form.df.model.false.x.true, trace=100)), "cannot get the original model predictors") printf("-- test ok with $x trashed but DF ok\n") # although with trace!=100 will get downstream failures in predict.lm, that's ok get.data() lm.form.df.model.false.x.true[["x"]] <- "nonesuch" # Warning: object$x may be corrupt rv <- plotmo(lm.form.df.model.false.x.true, trace=100) stopifnot1(rv, X) printf("-- test \"warning: object$x may be corrupt\", same as above but set options(warn=2)\n") options(warn=2) get.data() lm.form.df.model.false.x.true[["x"]] <- "nonesuch" # Warning: object$x may be corrupt expect.err(try(plotmo(lm.form.df.model.false.x.true, trace=100)), "x may be corrupt") options(warn=1) stopifnot1(rv, X) printf("====== strings in the data.frame\n") tit1 <- get.tit() tit1$char.pclass <- as.character(tit1$pclass) earth.survived.vs.pclass <- earth(survived~pclass, data=tit1, linpreds=TRUE) x.earth.survived.vs.pclass <- plotmo(earth.survived.vs.pclass, trace=100, linpreds=TRUE) stopifnot(is.factor(x.earth.survived.vs.pclass[[1]])) earth.survived.vs.char.pclass <- earth(survived~char.pclass, data=tit1) x.earth.survived.vs.char.pclass <- plotmo(earth.survived.vs.char.pclass, trace=100) stopifnot(is.factor(x.earth.survived.vs.char.pclass[[1]])) stopifnot(x.earth.survived.vs.pclass == x.earth.survived.vs.char.pclass) lm.survived.vs.pclass <- earth(survived~pclass, data=tit1, linpreds=TRUE) x.lm.survived.vs.pclass <- plotmo(lm.survived.vs.pclass, trace=100, linpreds=TRUE) stopifnot(is.factor(x.lm.survived.vs.pclass[[1]])) lm.survived.vs.char.pclass <- earth(survived~char.pclass, data=tit1) x.lm.survived.vs.char.pclass <- plotmo(lm.survived.vs.char.pclass, trace=100) stopifnot(is.factor(x.lm.survived.vs.char.pclass[[1]])) stopifnot(x.lm.survived.vs.pclass == x.lm.survived.vs.char.pclass) stopifnot(x.lm.survived.vs.pclass == x.earth.survived.vs.pclass) printf("-- test.plotmo.x done\n") source("test.epilog.R") plotmo/inst/slowtests/test.glmnetUtils.R0000644000176200001440000001414413727235376020243 0ustar liggesusers# test.glmnet.R: glmnetUtils tests for plotmo and plotres source("test.prolog.R") library(earth) library(glmnetUtils) data(ozone1) data(etitanic) get.tit <- function() # abbreviated titanic data { tit <- etitanic pclass <- as.character(tit$pclass) # change the order of the factors so not alphabetical pclass[pclass == "1st"] <- "first" pclass[pclass == "2nd"] <- "class2" pclass[pclass == "3rd"] <- "classthird" tit$pclass <- factor(pclass, levels=c("class2", "classthird", "first")) # log age is so we have a continuous predictor even when model is age~. set.seed(2015) tit$logage <- log(tit$age) + rnorm(nrow(tit)) tit$parch <- NULL # by=12 gives us a small fast model with an additive and a interaction term tit <- tit[seq(1, nrow(etitanic), by=12), ] } plotmores <- function(object, ..., trace=0, SHOWCALL=TRUE, title.extra="", ncol=2) { old.par <- par(no.readonly=TRUE) on.exit(par(old.par)) par(mfrow=c(2,ncol)) caption <- paste(deparse(substitute(object)), collapse=" ") call <- match.call(expand.dots=TRUE) call <- strip.space(paste(deparse(substitute(call)), collapse=" ")) call <- gsub(",", ", ", call) call <- paste(title.extra, call, sep="") printf("%s\n", call) # plotmo on glmnet mods is boring but we test it anyway plotres(object, trace=trace, SHOWCALL=SHOWCALL, do.par=FALSE, which=c(1,3), ...) title(paste("\n", call), outer=TRUE) plotmo(object, trace=trace, SHOWCALL=SHOWCALL, do.par=FALSE, ...) } tit <- get.tit() set.seed(2015) xmat <- as.matrix(tit[,c(2,5,6)]) agedata <- data.frame(tit[,4], xmat) colnames(agedata) <- c("age", "survived", "sibsp", "logage") set.seed(2015) mod.glmnet.xmat <- glmnet(xmat, tit[,4]) # tit[,4] is age plotres(mod.glmnet.xmat) plotmo(mod.glmnet.xmat) plotmores(mod.glmnet.xmat, predict.s=2.5) mod.glmnet.agedata <- glmnet(age~., data=agedata) expect.err(try(plotres(mod.glmnet.agedata)), "for this plot, glmnet.formula must be called with use.model.frame=TRUE") mod.glmnet.agedata <- glmnet(age~., data=agedata, use.model.frame=TRUE) plotmores(mod.glmnet.agedata, predict.s=2.5) set.seed(2015) mod.cv.glmnet.xmat <- cv.glmnet(xmat, tit[,4], nfolds=3) cat("==Test plotmo trace=1 and lambda.min\n") plotmores(mod.cv.glmnet.xmat, predict.s="lambda.min", trace=1, ncol=3) set.seed(2015) mod.cv.glmnet.agedata <- cv.glmnet(age~., data=agedata) expect.err(try(plotres(mod.cv.glmnet.agedata)), "for this plot, cv.glmnet.formula must be called with use.model.frame=TRUE") set.seed(2015) mod.cv.glmnet.agedata <- cv.glmnet(age~., data=agedata, use.model.frame=TRUE) cat("==Test lambda.min\n") plotmores(mod.cv.glmnet.agedata, predict.s="lambda.min", trace=1, ncol=3) printf("======== binomial model\n") set.seed(2016) n <- 50 p <- 4 xx <- matrix(rnorm(n*p), n, p) colnames(xx) <- paste("x", 1:ncol(xx), sep="") yy <- ifelse(xx[,1] + xx[,2] + rnorm(n) > .5, TRUE, FALSE) print(cov(xx, yy)) yy <- factor(yy) dataxy <- data.frame(yy, xx) binomial.mod <- glmnet(xx, yy, family="binomial") plotmores(binomial.mod, ncol=3) binomial.mod.form <- glmnet(yy~., data=dataxy, family="binomial", use.model.frame=TRUE) plotmores(binomial.mod.form, ncol=3) par(org.par) printf("======== glmnet family=\"mgaussian\"\n") set.seed(2015) p <- 10 n <- 30 xx <- cbind((1:n)/n, matrix(rnorm(n*(p-1)),n,p-1)) colnames(xx) <- paste0("x", 1:p) # ymultresp <- cbind(rowSums(xx[,1:5]^3), rowSums(xx[,5:p]^3), 1:n) set.seed(1) ymultresp <- cbind(xx[,1]+.001*rnorm(n), rowSums(xx[,2:5]^3), rnorm(n)) glmnet.mgaussian <- glmnet(xx, ymultresp, family="mgaussian") plotres(glmnet.mgaussian, nresponse=1, SHOWCALL=TRUE, which=c(1:3), do.par=2, info=1) # manually calculate the residuals plot(x=predict(glmnet.mgaussian, newx=xx, s=0)[,1,1], y=ymultresp[,1] - predict(glmnet.mgaussian, newx=xx, s=0)[,1,1], pch=20, xlab="Fitted", ylab="Residuals", main="Manually calculated residuals, nresponse=1, s=0") abline(h=0, col="gray") par(org.par) # # TODO is glmnet mgaussian supported with a formula interface? # dataxy <- data.frame(ymultresp, xx) # colnames(dataxy) <- c("y1", "y2", "y3", "x1", "x2", "x3", "x4", "x5", "x5", "x6", "x7", "x8", "x9", "x10") # glmnet.mgaussian.form <- glmnet(xx, ymultresp, family="mgaussian") # plotres(glmnet.mgaussian.form, nresponse=1, SHOWCALL=TRUE, which=c(1:3), do.par=2, info=1) par(mfrow=c(2,3), mar=c(3,3,3,.5), oma=c(0,0,3,0), mgp=c(1.5,0.4,0), tcl=-0.3) data(trees) set.seed(2015) # variable with a long name x50 <- cbind(trees[,1:2], Girth12345678901234567890=rnorm(nrow(trees))) mod.with.long.name <- glmnet(data.matrix(x50),data.matrix(trees$Volume)) plotmores(mod.with.long.name, ncol=3) data.x50 <- data.frame(trees$Volume, x50) colnames(data.x50) <- c("Volume", "Girth", "Height", "Girth12345678901234567890") mod.with.long.name.form <- glmnet(Volume~., data=data.x50, use.model.frame=TRUE) plotmores(mod.with.long.name.form, ncol=3) par(org.par) #-- make sure that we can work with all families set.seed(2016) par(mfrow=c(3,3), mar=c(3,3,3,1)) n <- 100 p <- 4 xx <- matrix(rnorm(n*p), n, p) g2 <- sample(1:2, n, replace=TRUE) data.xg2 <- data.frame(g2, xx) for(family in c("gaussian","binomial","poisson")) { title.extra <- paste(family, ": ") mod <- glmnet(xx,g2,family=family) plotmores(mod, xvar="lambda", ncol=3, title.extra=title.extra) title.extra <- paste("formula", family, ": ") mod.form <- glmnet(g2~., data.xg2, family=family, use.model.frame=TRUE) plotmores(mod.form, xvar="lambda", ncol=3, title.extra=title.extra) } par(org.par) # cox library(plotmo) n <- 100 p <- 20 nzc <- trunc(p/10) set.seed(2016) beta <- rnorm(nzc) x7 <- matrix(rnorm(n*p), n, p) beta <- rnorm(nzc) fx <- x7[,seq(nzc)] %*% beta/3 hx <- exp(fx) ty <- rexp(n, hx) tcens <- rbinom(n=n, prob=.3, size=1)# censoring indicator yy <- cbind(time=ty, status=1-tcens) # yy=Surv(ty,1-tcens) with library(survival) glmnet.cox <- glmnet(x=x7, y=yy, family="cox") plotmores(glmnet.cox, ncol=3, degree1=1:4) par(org.par) # TODO formula interface not tested for cox models source("test.epilog.R") plotmo/inst/slowtests/test.glmnet.Rout.save0000644000176200001440000013550315041242236020672 0ustar liggesusers> # test.glmnet.R: glmnet tests for plotmo and plotres > > source("test.prolog.R") > library(earth) Loading required package: Formula Loading required package: plotmo Loading required package: plotrix > library(glmnet) Loading required package: Matrix Loaded glmnet 4.1-10 > data(ozone1) > data(etitanic) > get.tit <- function() # abbreviated titanic data + { + tit <- etitanic + pclass <- as.character(tit$pclass) + # change the order of the factors so not alphabetical + pclass[pclass == "1st"] <- "first" + pclass[pclass == "2nd"] <- "class2" + pclass[pclass == "3rd"] <- "classthird" + tit$pclass <- factor(pclass, levels=c("class2", "classthird", "first")) + # log age is so we have a continuous predictor even when model is age~. + set.seed(2015) + tit$logage <- log(tit$age) + rnorm(nrow(tit)) + tit$parch <- NULL + # by=12 gives us a small fast model with an additive and a interaction term + tit <- tit[seq(1, nrow(etitanic), by=12), ] + } > plotmo1 <- function(object, ..., trace=0, SHOWCALL=TRUE, caption=NULL) { + if(is.null(caption)) + caption <- paste(deparse(substitute(object)), collapse=" ") + call <- match.call(expand.dots=TRUE) + call <- strip.space(paste(deparse(substitute(call)), collapse=" ")) + printf("%s\n", call) + plotmo(object, trace=trace, SHOWCALL=SHOWCALL, caption=caption, ...) + } > plotres1 <- function(object, ..., trace=0, SHOWCALL=TRUE, caption=NULL) { + if(is.null(caption)) + caption <- paste(deparse(substitute(object)), collapse=" ") + call <- match.call(expand.dots=TRUE) + call <- strip.space(paste(deparse(substitute(call)), collapse=" ")) + printf("%s\n", call) + plotres(object, trace=trace, SHOWCALL=SHOWCALL, caption=caption, ...) + } > tit <- get.tit() > set.seed(2015) > xmat <- as.matrix(tit[,c(2,5,6)]) > set.seed(2015) > mod.glmnet.xmat <- glmnet(xmat, tit[,4]) > # plotmo on glmnet mods is boring but we test it anyway > plotmo1(mod.glmnet.xmat) plotmo1(object=mod.glmnet.xmat) plotmo grid: survived sibsp logage 0 0 3.06991 > plotres1(mod.glmnet.xmat) plotres1(object=mod.glmnet.xmat) > > # compare to plot.glmnet > par(mfrow=c(4,2), mar=c(3,6,3.5,6)) # extra side margins for more square plots > plot_glmnet(mod.glmnet.xmat, main="mod.glmnet.xmat\ncompare to plot.glmnet") > plot(0,0) > plot_glmnet(mod.glmnet.xmat, xvar="norm", col=c(3,2,1)) > plot(mod.glmnet.xmat, xvar="norm") > plot_glmnet(mod.glmnet.xmat, xvar="lambda") > plot(mod.glmnet.xmat, xvar="lambda") > plot_glmnet(mod.glmnet.xmat, xvar="dev") > plot(mod.glmnet.xmat, xvar="dev") > par(org.par) > > set.seed(2015) > mod.cv.glmnet.xmat <- cv.glmnet(xmat, tit[,4], nfolds=3) > > # following was needed before plotmo 3.1.3 (before adding plotmo.prolog.cv.glmnet) > # mod.cv.glmnet.xmat$x <- as.data.frame(xmat) > # mod.cv.glmnet.xmat$y <- tit[,4] > > cat("==Test plotmo trace=1 and lambda.min\n") ==Test plotmo trace=1 and lambda.min > plotmo1(mod.cv.glmnet.xmat, predict.s="lambda.min", trace=1) plotmo1(object=mod.cv.glmnet.xmat,predict.s="lambda.min",trace=1) stats::predict(cv.glmnet.object, matrix[3,3], type="response", s="lambda.min") stats::fitted(object=cv.glmnet.object) fitted() was unsuccessful, will use predict() instead got model response from getCall(object)$y plotmo grid: survived sibsp logage 0 0 3.06991 > cat("==Test plotmo trace=2 and lambda.min\n") ==Test plotmo trace=2 and lambda.min > plotmo1(mod.cv.glmnet.xmat, predict.s="lambda.min", trace=2) plotmo1(object=mod.cv.glmnet.xmat,predict.s="lambda.min",trace=2) plotmo trace 2: plotmo(object, trace=trace, SHOWCALL=SHOWCALL, caption=caption, ...) --get.model.env for object with class cv.glmnet object call is cv.glmnet(x=xmat, y=tit[, 4], nfolds=3) assuming the environment of the cv.glmnet model is that of plotmo's caller: env(..., call, caption, object, SHOWCALL, trace) --plotmo_prolog for cv.glmnet object 'object' --plotmo_x for cv.glmnet object get.object.x: object$x is NULL (and it has no colnames) object call is cv.glmnet(x=xmat, y=tit[, 4], nfolds=3) get.x.from.model.frame: terms(object) did not return the terms, will look for the formula elsewhere no formula in getCall(object) get.data.from.object.call.field: eval(getCall(object)$x, env(..., call, caption, object, SHOWCALL, trace)) getCall(object)$x is usable and has column names survived sibsp logage plotmo_x returned[88,3]: survived sibsp logage 1 1 0 1.821847 13 1 0 3.814495 26 0 0 3.094392 ... 0 0 5.950193 1308 0 0 5.116245 ----Metadata: plotmo_predict with nresponse=NULL and newdata=NULL plotmo_predict with NULL newdata (nrows=3), using plotmo_x to get the data --plotmo_x for cv.glmnet object get.object.x: object$x is NULL (and it has no colnames) object call is cv.glmnet(x=xmat, y=tit[, 4], nfolds=3) get.x.from.model.frame: terms(object) did not return the terms, will look for the formula elsewhere no formula in getCall(object) get.data.from.object.call.field: eval(getCall(object)$x, env(..., call, caption, object, SHOWCALL, trace)) getCall(object)$x is usable and has column names survived sibsp logage plotmo_x returned[88,3]: survived sibsp logage 1 1 0 1.821847 13 1 0 3.814495 26 0 0 3.094392 ... 0 0 5.950193 1308 0 0 5.116245 will use the above data instead of newdata=NULL for predict.cv.glmnet stats::predict(cv.glmnet.object, matrix[3,3], type="response", s="lambda.min") predict returned[3,1]: s="lambda.min" 1 25.64083 13 34.58457 26 31.45755 predict after processing with nresponse=NULL is [3,1]: s="lambda.min" 1 25.64083 13 34.58457 26 31.45755 ----Metadata: plotmo_fitted with nresponse=NULL stats::fitted(object=cv.glmnet.object) fitted() was unsuccessful, will use predict() instead plotmo_predict with NULL newdata, using plotmo_x to get the data --plotmo_x for cv.glmnet object get.object.x: object$x is NULL (and it has no colnames) object call is cv.glmnet(x=xmat, y=tit[, 4], nfolds=3) get.x.from.model.frame: terms(object) did not return the terms, will look for the formula elsewhere no formula in getCall(object) get.data.from.object.call.field: eval(getCall(object)$x, env(..., call, caption, object, SHOWCALL, trace)) getCall(object)$x is usable and has column names survived sibsp logage plotmo_x returned[88,3]: survived sibsp logage 1 1 0 1.821847 13 1 0 3.814495 26 0 0 3.094392 ... 0 0 5.950193 1308 0 0 5.116245 will use the above data instead of newdata=NULL for predict.cv.glmnet stats::predict(cv.glmnet.object, matrix[88,3], type="response", s="lambda.min") predict returned[88,1]: s="lambda.min" 1 25.64083 13 34.58457 26 31.45755 ... 44.27544 1308 40.53237 predict after processing with nresponse=NULL is [88,1]: s="lambda.min" 1 25.64083 13 34.58457 26 31.45755 ... 44.27544 1308 40.53237 got fitted values by calling predict (see above) ----Metadata: plotmo_y with nresponse=NULL --plotmo_y with nresponse=NULL for cv.glmnet object get.object.y: object$y is NULL (and it has no colnames) object call is cv.glmnet(x=xmat, y=tit[, 4], nfolds=3) get.y.from.model.frame: terms(object) did not return the terms, will look for the formula elsewhere no formula in getCall(object) get.data.from.object.call.field: eval(getCall(object)$y, env(..., call, caption, object, SHOWCALL, trace)) getCall(object)$y is usable but without colnames so we will keep on searching names(call) is "" "x" "y" "nfolds" the name of argument 2 is "y" so we will not process it with argn object$y is NULL call$y is usable but without colnames but we will use it anyway plotmo_y returned[88,1] with no column names: 1 29 2 24 3 25 ... 41 88 27 plotmo_y after processing with nresponse=NULL is [88,1] with no column names: 1 29 2 24 3 25 ... 41 88 27 converted nresponse=NA to nresponse=1 nresponse=1 (was NA) ncol(fitted) 1 ncol(predict) 1 ncol(y) 1 ----Metadata: plotmo_y with nresponse=1 --plotmo_y with nresponse=1 for cv.glmnet object get.object.y: object$y is NULL (and it has no colnames) object call is cv.glmnet(x=xmat, y=tit[, 4], nfolds=3) get.y.from.model.frame: terms(object) did not return the terms, will look for the formula elsewhere no formula in getCall(object) get.data.from.object.call.field: eval(getCall(object)$y, env(..., call, caption, object, SHOWCALL, trace)) getCall(object)$y is usable but without colnames so we will keep on searching names(call) is "" "x" "y" "nfolds" the name of argument 2 is "y" so we will not process it with argn object$y is NULL call$y is usable but without colnames but we will use it anyway got model response from getCall(object)$y plotmo_y returned[88,1] with no column names: 1 29 2 24 3 25 ... 41 88 27 plotmo_y after processing with nresponse=1 is [88,1]: plotmo_y 1 29 2 24 3 25 ... 41 88 27 got response name "s="lambda.min"" from yhat resp.levs is NULL ----Metadata: done number of x values: survived 2 sibsp 5 logage 88 ----plotmo_singles for cv.glmnet object singles: 1 survived, 2 sibsp, 3 logage ----plotmo_pairs for cv.glmnet object Error in attr(x, "formula") %||% { : invalid formula formula(object) failed for cv.glmnet object in plotmo.pairs.default Error in x$terms %||% attr(x, "terms") %||% stop("no terms component nor attribute") : no terms component nor attribute terms(object) failed for cv.glmnet object in plotmo.pairs.default no pairs graphics::par(mfrow=c(2,2), mgp=c(1.5,0.4,0), tcl=-0.3, font.main=2, mar=c(3,2,1.2,0.8), oma=c(0,0,4,0), cex.main=1.2, cex.lab=1, cex.axis=1, cex=0.83) ----Figuring out ylim --get.ylim.by.dummy.plots --plot.degree1(draw.plot=FALSE) degree1 plot1 (pmethod "plotmo") variable survived newdata[2,3]: survived sibsp logage 1 0 0 3.06991 2 1 0 3.06991 stats::predict(cv.glmnet.object, matrix[2,3], type="response", s="lambda.min") predict returned[2,1]: s="lambda.min" 1 31.34766 2 31.24259 predict after processing with nresponse=1 is [2,1]: s="lambda.min" 1 31.34766 2 31.24259 Reducing trace level for subsequent degree1 plots degree1 plot2 (pmethod "plotmo") variable sibsp degree1 plot3 (pmethod "plotmo") variable logage --done get.ylim.by.dummy.plots ylim c(4.856, 44.28) clip TRUE --plot.degree1(draw.plot=TRUE) plotmo grid: survived sibsp logage 0 0 3.06991 graphics::plot.default(x=c(0,0.5,0.5,1), y=c(31.35,31.35,3...), type="n", main="1 survived", xlab="", ylab="", xaxt="s", yaxt="s", xlim=c(-0.1,1.1), ylim=c(4.86,44.28)) > cat("==Test plotres trace=1 and lambda.1se\n") ==Test plotres trace=1 and lambda.1se > plotres1(mod.cv.glmnet.xmat, predict.s="lambda.1se", trace=1) plotres1(object=mod.cv.glmnet.xmat,predict.s="lambda.1se",trace=1) stats::residuals(object=cv.glmnet.object, type="response") residuals() was unsuccessful, will use predict() instead stats::predict(cv.glmnet.object, matrix[3,3], type="response", s="lambda.1se") stats::fitted(object=cv.glmnet.object) fitted() was unsuccessful, will use predict() instead got model response from getCall(object)$y graphics::plot(cv.glmnet.object) training rsq 0.24 > cat("==Test plotres trace=2 and lambda.1se\n") ==Test plotres trace=2 and lambda.1se > plotres1(mod.cv.glmnet.xmat, predict.s="lambda.1se", trace=2) plotres1(object=mod.cv.glmnet.xmat,predict.s="lambda.1se",trace=2) plotres trace 2: plotres(object, trace=trace, SHOWCALL=SHOWCALL, caption=caption, ...) --get.model.env for object with class cv.glmnet object call is cv.glmnet(x=xmat, y=tit[, 4], nfolds=3) assuming the environment of the cv.glmnet model is that of plotres's caller: env(..., call, caption, object, SHOWCALL, trace) --plotmo_prolog for cv.glmnet object 'object' ----Metadata: plotmo_resids(object, type="response", nresponse=NULL) doTryCatch invoked call.dots TRACE plotmo_resids via try called call.dots(residuals, DROP="*", KEEP="PREFIX", TRACE=if(trace==0)-1elsetr...), force.object=object, force.type=residtype, SHOWCALL=TRUE, predict.s="lambda.1se") PREFIX residuals. DROP .* KEEP >STANDARDPREFIXES|^force\.|^def\.|^drop\. >PREFIX|^residuals\. >CALLARGS|^force\.object$|^force\.type$ >EXPLICIT input dotnames force.object force.type SHOWCALL predict.s after DROP and KEEP force.object force.type return dotnames object type stats::residuals(object=cv.glmnet.object, type="response") residuals() was unsuccessful, will use predict() instead ----Metadata: plotmo_predict with nresponse=NULL and newdata=NULL plotmo_predict with NULL newdata (nrows=3), using plotmo_x to get the data --plotmo_x for cv.glmnet object get.object.x: object$x is NULL (and it has no colnames) object call is cv.glmnet(x=xmat, y=tit[, 4], nfolds=3) get.x.from.model.frame: terms(object) did not return the terms, will look for the formula elsewhere no formula in getCall(object) get.data.from.object.call.field: eval(getCall(object)$x, env(..., call, caption, object, SHOWCALL, trace)) getCall(object)$x is usable and has column names survived sibsp logage plotmo_x returned[88,3]: survived sibsp logage 1 1 0 1.821847 13 1 0 3.814495 26 0 0 3.094392 ... 0 0 5.950193 1308 0 0 5.116245 will use the above data instead of newdata=NULL for predict.cv.glmnet stats::predict(cv.glmnet.object, matrix[3,3], type="response", s="lambda.1se") predict returned[3,1]: s="lambda.1se" 1 26.57900 13 33.26779 26 30.85060 predict after processing with nresponse=NULL is [3,1]: s="lambda.1se" 1 26.57900 13 33.26779 26 30.85060 ----Metadata: plotmo_fitted with nresponse=NULL stats::fitted(object=cv.glmnet.object) fitted() was unsuccessful, will use predict() instead plotmo_predict with NULL newdata, using plotmo_x to get the data --plotmo_x for cv.glmnet object get.object.x: object$x is NULL (and it has no colnames) object call is cv.glmnet(x=xmat, y=tit[, 4], nfolds=3) get.x.from.model.frame: terms(object) did not return the terms, will look for the formula elsewhere no formula in getCall(object) get.data.from.object.call.field: eval(getCall(object)$x, env(..., call, caption, object, SHOWCALL, trace)) getCall(object)$x is usable and has column names survived sibsp logage plotmo_x returned[88,3]: survived sibsp logage 1 1 0 1.821847 13 1 0 3.814495 26 0 0 3.094392 ... 0 0 5.950193 1308 0 0 5.116245 will use the above data instead of newdata=NULL for predict.cv.glmnet stats::predict(cv.glmnet.object, matrix[88,3], type="response", s="lambda.1se") predict returned[88,1]: s="lambda.1se" 1 26.57900 13 33.26779 26 30.85060 ... 40.43678 1308 37.63743 predict after processing with nresponse=NULL is [88,1]: s="lambda.1se" 1 26.57900 13 33.26779 26 30.85060 ... 40.43678 1308 37.63743 got fitted values by calling predict (see above) ----Metadata: plotmo_y with nresponse=NULL --plotmo_y with nresponse=NULL for cv.glmnet object get.object.y: object$y is NULL (and it has no colnames) object call is cv.glmnet(x=xmat, y=tit[, 4], nfolds=3) get.y.from.model.frame: terms(object) did not return the terms, will look for the formula elsewhere no formula in getCall(object) get.data.from.object.call.field: eval(getCall(object)$y, env(..., call, caption, object, SHOWCALL, trace)) getCall(object)$y is usable but without colnames so we will keep on searching names(call) is "" "x" "y" "nfolds" the name of argument 2 is "y" so we will not process it with argn object$y is NULL call$y is usable but without colnames but we will use it anyway plotmo_y returned[88,1] with no column names: 1 29 2 24 3 25 ... 41 88 27 plotmo_y after processing with nresponse=NULL is [88,1] with no column names: 1 29 2 24 3 25 ... 41 88 27 converted nresponse=NA to nresponse=1 nresponse=1 (was NA) ncol(fitted) 1 ncol(predict) 1 ncol(y) 1 ----Metadata: plotmo_y with nresponse=1 --plotmo_y with nresponse=1 for cv.glmnet object get.object.y: object$y is NULL (and it has no colnames) object call is cv.glmnet(x=xmat, y=tit[, 4], nfolds=3) get.y.from.model.frame: terms(object) did not return the terms, will look for the formula elsewhere no formula in getCall(object) get.data.from.object.call.field: eval(getCall(object)$y, env(..., call, caption, object, SHOWCALL, trace)) getCall(object)$y is usable but without colnames so we will keep on searching names(call) is "" "x" "y" "nfolds" the name of argument 2 is "y" so we will not process it with argn object$y is NULL call$y is usable but without colnames but we will use it anyway got model response from getCall(object)$y plotmo_y returned[88,1] with no column names: 1 29 2 24 3 25 ... 41 88 27 plotmo_y after processing with nresponse=1 is [88,1]: plotmo_y 1 29 2 24 3 25 ... 41 88 27 got response name "s="lambda.1se"" from yhat resp.levs is NULL ----Metadata: done --plotmo_response for plotmo_rsq1 --plotmo_response for newdata: NULL plotmo_response trace 2: plotmo_response(object=object, newdata=newdata, trace=max(0,trace), nresponse=meta$nresponse, type=meta$type, meta=meta, ...) --get.model.env for object with class cv.glmnet object call is cv.glmnet(x=xmat, y=tit[, 4], nfolds=3) using attr(obj,".Environment") saved with cv.glmnet model: env(..., call, caption, object, SHOWCALL, trace) --plotmo_y with nresponse=1 for cv.glmnet object get.object.y: object$y is NULL (and it has no colnames) object call is cv.glmnet(x=xmat, y=tit[, 4], nfolds=3) get.y.from.model.frame: terms(object) did not return the terms, will look for the formula elsewhere no formula in getCall(object) get.data.from.object.call.field: eval(getCall(object)$y, env(..., call, caption, object, SHOWCALL, trace)) getCall(object)$y is usable but without colnames so we will keep on searching names(call) is "" "x" "y" "nfolds" the name of argument 2 is "y" so we will not process it with argn object$y is NULL call$y is usable but without colnames but we will use it anyway plotmo_y returned[88,1] with no column names: 1 29 2 24 3 25 ... 41 88 27 plotmo_y after processing with nresponse=1 is [88,1]: plotmo_y 1 29 2 24 3 25 ... 41 88 27 response is usable and has column name plotmo_y plotmo_response returned[88,1]: plotmo_y 1 29 2 24 3 25 ... 41 88 27 plotmo_response after processing with nresponse=1 is [88,1]: plotmo_y 1 29 2 24 3 25 ... 41 88 27 --plotmo_predict for plotmo_rsq1 plotmo_predict with NULL newdata, using plotmo_x to get the data --plotmo_x for cv.glmnet object get.object.x: object$x is NULL (and it has no colnames) object call is cv.glmnet(x=xmat, y=tit[, 4], nfolds=3) get.x.from.model.frame: terms(object) did not return the terms, will look for the formula elsewhere no formula in getCall(object) get.data.from.object.call.field: eval(getCall(object)$x, env(..., call, caption, object, SHOWCALL, trace)) getCall(object)$x is usable and has column names survived sibsp logage plotmo_x returned[88,3]: survived sibsp logage 1 1 0 1.821847 13 1 0 3.814495 26 0 0 3.094392 ... 0 0 5.950193 1308 0 0 5.116245 will use the above data instead of newdata=NULL for predict.cv.glmnet stats::predict(cv.glmnet.object, matrix[88,3], type="response", s="lambda.1se") predict returned[88,1]: s="lambda.1se" 1 26.57900 13 33.26779 26 30.85060 ... 40.43678 1308 37.63743 predict after processing with nresponse=1 is [88,1]: s="lambda.1se" 1 26.57900 13 33.26779 26 30.85060 ... 40.43678 1308 37.63743 ----plotmo_rinfo: plotmo_resids(object, type="response", nresponse=1) doTryCatch invoked call.dots TRACE plotmo_resids via try called call.dots(residuals, DROP="*", KEEP="PREFIX", TRACE=if(trace==0)-1elsetr...), force.object=object, force.type=residtype, SHOWCALL=TRUE, predict.s="lambda.1se") PREFIX residuals. DROP .* KEEP >STANDARDPREFIXES|^force\.|^def\.|^drop\. >PREFIX|^residuals\. >CALLARGS|^force\.object$|^force\.type$ >EXPLICIT input dotnames force.object force.type SHOWCALL predict.s after DROP and KEEP force.object force.type return dotnames object type stats::residuals(object=cv.glmnet.object, type="response") calling predict() because residuals() was unsuccessful plotmo_predict with NULL newdata, using plotmo_x to get the data --plotmo_x for cv.glmnet object get.object.x: object$x is NULL (and it has no colnames) object call is cv.glmnet(x=xmat, y=tit[, 4], nfolds=3) get.x.from.model.frame: terms(object) did not return the terms, will look for the formula elsewhere no formula in getCall(object) get.data.from.object.call.field: eval(getCall(object)$x, env(..., call, caption, object, SHOWCALL, trace)) getCall(object)$x is usable and has column names survived sibsp logage plotmo_x returned[88,3]: survived sibsp logage 1 1 0 1.821847 13 1 0 3.814495 26 0 0 3.094392 ... 0 0 5.950193 1308 0 0 5.116245 will use the above data instead of newdata=NULL for predict.cv.glmnet stats::predict(cv.glmnet.object, matrix[88,3], type="response", s="lambda.1se") predict returned[88,1]: s="lambda.1se" 1 26.57900 13 33.26779 26 30.85060 ... 40.43678 1308 37.63743 predict after processing with nresponse=1 is [88,1]: s="lambda.1se" 1 26.57900 13 33.26779 26 30.85060 ... 40.43678 1308 37.63743 --plotmo_y with nresponse=1 for cv.glmnet object get.object.y: object$y is NULL (and it has no colnames) object call is cv.glmnet(x=xmat, y=tit[, 4], nfolds=3) get.y.from.model.frame: terms(object) did not return the terms, will look for the formula elsewhere no formula in getCall(object) get.data.from.object.call.field: eval(getCall(object)$y, env(..., call, caption, object, SHOWCALL, trace)) getCall(object)$y is usable but without colnames so we will keep on searching names(call) is "" "x" "y" "nfolds" the name of argument 2 is "y" so we will not process it with argn object$y is NULL call$y is usable but without colnames but we will use it anyway plotmo_y returned[88,1] with no column names: 1 29 2 24 3 25 ... 41 88 27 plotmo_y after processing with nresponse=1 is [88,1]: plotmo_y 1 29 2 24 3 25 ... 41 88 27 residuals returned[88,1]: resids 1 2.4210049 2 -9.2677944 3 -5.8505971 ... 0.5632234 88 -10.6374291 residuals after processing with nresponse=1 is [88,1]: resids 1 2.4210049 2 -9.2677944 3 -5.8505971 ... 0.5632234 88 -10.6374291 generated the residuals using plotmo_predict() and plotmo_y() ----plotmo_rinfo: done graphics::par(mfrow=c(2,2), mgp=c(1.5,0.4,0), tcl=-0.3, font.main=1, mar=c(4,3,1.2,0.8), oma=c(0,0,4,0), cex.main=1, cex.lab=1, cex.axis=1, cex=0.83) graphics::plot(cv.glmnet.object) training rsq 0.24 > > set.seed(2015) > x <- matrix(rnorm(100*20),100,20) # 20 variables > y <- rnorm(100) > mod <- glmnet(x,y) > plotmo1(mod) plotmo1(object=mod) plotmo grid: x1 x2 x3 x4 x5 x6 -0.02229245 -0.03060877 0.02595536 -0.2306748 0.2048663 -0.2711153 x7 x8 x9 x10 x11 x12 x13 0.04214883 -0.1573321 0.05656354 -0.2789684 -0.01729983 0.05494411 -0.04358897 x14 x15 x16 x17 x18 x19 x20 -0.184689 -0.01875314 -0.08998893 0.05206396 0.1317551 -0.033794 0.1125339 > > # test w1.label > par(mfrow=c(2,3)) > par(cex=1) > par(mar=c(3,3,3,1)) > plotres(mod, which=1, w1.main="default w1.label") > plotres(mod, which=1, w1.label=5, w1.main="w1.label=5") > plotres(mod, which=1, w1.label=0, w1.main="w1.label=0") > plotres(mod, which=1, w1.label=TRUE, w1.main="w1.label=TRUE") > plotres(mod, which=1, w1.label=100, w1.main="w1.label=100") > par(org.par) > > # test w1 and non w1 args passed > par(mfrow=c(2,2), mar=c(4,4,4,4), cex=1) > > plot_glmnet(mod, w1.col=3:4, w1.xvar="norm", + main="plot_glmnet\nw1.col=3:4 w1.xvar=\"norm\"") > > plot_glmnet(mod, col=3:4, xvar="norm", + main="plot_glmnet\ncol=3:4 xvar=\"norm\"") > > plot_glmnet(mod, col=3:4, w1.col=1:2, + w1.xvar="norm", xvar="lambda", + main="plot_glmnet\ncol=3:4 w1.col=1:2\nw1.xvar=\"norm\", xvar=\"lambda\"") > > par(org.par) > par(mfrow=c(3,2), mar=c(3,4,4,4), cex=1) > > plotres(mod, which=c(1,3), do.par=FALSE, w1.col=3:4, w1.xvar="norm", + w1.main="plotres\nw1.col=3:4 w1.xvar=\"norm\"") > > plotres(mod, which=c(1,3), do.par=FALSE, col=3:4, xvar="norm", + w1.main="plotres\nplotres\ncol=3:4 xvar=\"norm\"") > > plotres(mod, which=c(1,3), do.par=FALSE, col=3:4, w1.col=1:2, + w1.main="plotres\ncol=3:4 w1.col=1:2") > > par(org.par) > > # glmnet with sparse matrices > set.seed(2015) > n <- 100 > p <- 20 > nzc <- trunc(p/10) > x <- matrix(rnorm(n*p),n,p) > iz <- sample(1:(n*p),size=n*p*.85,replace=FALSE) > x[iz] <- 0 > sx <- Matrix(x,sparse=TRUE) > # colnames(sx) <- paste("x", 1:ncol(sx), sep="") # need column names for plotmo > inherits(sx,"sparseMatrix") # confirm that it is sparse [1] TRUE > beta <- rnorm(nzc) > fx <- x[,seq(nzc)]%*%beta > eps <- rnorm(n) > y <- fx+eps > px <- exp(fx) > px <- px/(1+px) > ly <- rbinom(n=length(px),prob=px,size=1) > mod.glmnet.sx <- glmnet(sx,y) > plotmo1(mod.glmnet.sx, all2=TRUE) # will give warning: too many predictors to plot all pairs plotmo1(object=mod.glmnet.sx,all2=TRUE) Warning: too many predictors to plot all pairs, so plotting degree2 plots for just the first 7 predictors. Call plotmo with all2=2 to plot degree2 plots for up to 20 predictors. plotmo grid: x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x19 x20 0 0 > plotmo1(mod.glmnet.sx, all2=2, caption="all2=2") # test all2=2 plotmo1(object=mod.glmnet.sx,all2=2,caption="all2=2") More than 64 degree2 plots. Consider using plotmo's degree2 argument to limit the number of plots. For example, degree2=1:10 or degree2="x1" Call plotmo with trace=-1 to make this message go away. plotmo grid: x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x19 x20 0 0 > plotmo1(mod.glmnet.sx, all2=2, degree2=1:3, caption="all2=2 degree2=1:3") plotmo1(object=mod.glmnet.sx,all2=2,degree2=1:3,caption="all2=2degree2=1:3") plotmo grid: x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x19 x20 0 0 > plotres(mod.glmnet.sx) > par(org.par) > > par(mfrow=c(2,4), mar=c(3,3,3,1), mgp=c(1.5,0.5,0), oma=c(0,0,2.5,0)) > y <- trees$Volume > x <- as.matrix(data.frame(Girth=trees$Girth, Height=trees$Height)) > glmnet <- glmnet(x, y) > plotres(glmnet, do.par=FALSE, caption="glmnet and lm: top and bottom should be the same") > lm <- lm(Volume~., data=trees) > plotres(lm, do.par=FALSE, SHOWCALL=TRUE) > > par(mfrow=c(3,2), mar=c(3,3,3,1), mgp=c(1.5,0.5,0), oma=c(0,0,2.5,0)) > plotres(glmnet, do.par=FALSE, which=c(1,3), w1.xvar="norm", + caption="glmnet with various options", SHOWCALL=TRUE) > plotres(glmnet, trace=1, do.par=FALSE, which=c(1,3), SHOWCALL=TRUE) stats::residuals(object=elnet.object, type="response") residuals() was unsuccessful, will use predict() instead stats::predict(elnet.object, matrix[3,2], type="response", s=0) stats::fitted(object=elnet.object) fitted() was unsuccessful, will use predict() instead got model response from getCall(object)$y plot_glmnet(elnet.object, xvar="rlambda", grid.col=0, s=0, nresponse=1) training rsq 0.95 > plotres(glmnet, trace=1, do.par=FALSE, which=c(1,3), predict.s=5, SHOWCALL=TRUE) stats::residuals(object=elnet.object, type="response") residuals() was unsuccessful, will use predict() instead stats::predict(elnet.object, matrix[3,2], type="response", s=5) stats::fitted(object=elnet.object) fitted() was unsuccessful, will use predict() instead got model response from getCall(object)$y plot_glmnet(elnet.object, xvar="rlambda", grid.col=0, s=5, nresponse=1) training rsq 0.84 > par(org.par) > > printf("======== glmnet additional tests\n") ======== glmnet additional tests > set.seed(2015) > p <- 10 > n <- 30 > x <- cbind(matrix(rnorm(n*p),n,p)) > y <- rowSums(x[,1:3]^3) > glmnet <- glmnet(x,y) > plotres(glmnet, SHOWCALL=TRUE, caption="glmnet: y <- rowSums(x[,1:3]^3)") > plotres(glmnet, SHOWCALL=TRUE, w1.xvar="norm") > par(mfrow=c(1,1)) > omar <- par("mar") > ocex.axis <- par("cex.axis") > ocex.lab <- par("cex.lab") > plotres(glmnet, SHOWCALL=TRUE, which=1) > stopifnot(par("mar") == omar) > stopifnot(par("cex.axis") == ocex.axis) > stopifnot(par("cex.lab") == ocex.lab) > par(org.par) > > # test some args for plot_glmnet > plotres(glmnet, predict.s=.05, SHOWCALL=TRUE, trace=0, col.main=2, + w1.xlab="my xlab", w1.ylab="my ylab", + w1.main="test some args for plot_glmnet1", + w1.col=4:1) > > plot_glmnet(glmnet, trace=0, col.main=2, main="test some args for plot_glmnet2", + xlab="my xlab", ylab="my ylab", + col=4:1, ylim=c(-2,4)) # TODO xlim=c(-5,3)) > > plotres(glmnet, predict.s=.05, SHOWCALL=TRUE, which=c(1,3), grid.col="gray", do.par=2) > plotres(glmnet, predict.s=.05, SHOWCALL=TRUE, which=c(1,3), w1.s.col=0, do.par=0) > par(org.par) > > # TODO the following issues a stream of warnings: restarting interrupted promise evaluation > expect.err(try(plotres(glmnet, w1.col=nonesuch)), "cannot evaluate 'col'") Warning in eval(dots[[i]]) : restarting interrupted promise evaluation Warning in eval(dots[[i]]) : restarting interrupted promise evaluation Warning in eval(dots[[i]]) : restarting interrupted promise evaluation Warning in eval(dots[[i]]) : restarting interrupted promise evaluation Warning in eval(dots[[i]]) : restarting interrupted promise evaluation Warning in eval(dots[[i]]) : restarting interrupted promise evaluation Warning in eval(dots[[i]]) : restarting interrupted promise evaluation Warning in eval(dots[[i]]) : restarting interrupted promise evaluation Warning in eval(dots[[i]]) : restarting interrupted promise evaluation Warning in eval(dots[[i]]) : restarting interrupted promise evaluation Warning in eval(dots[[i]]) : restarting interrupted promise evaluation Warning in eval(dots[[i]]) : restarting interrupted promise evaluation Warning in eval(dots[[i]]) : restarting interrupted promise evaluation Warning in eval(dots[[i]]) : restarting interrupted promise evaluation Warning in eval(dots[[i]]) : restarting interrupted promise evaluation Warning in eval(dots[[i]]) : restarting interrupted promise evaluation Warning in eval(dots[[i]]) : restarting interrupted promise evaluation Warning in eval(dots[[i]], envir = env, enclos = env) : restarting interrupted promise evaluation Warning in eval(dots[[i]], envir = env, enclos = env) : restarting interrupted promise evaluation Warning in eval(dots[[i]], envir = env, enclos = env) : restarting interrupted promise evaluation Warning in eval(dots[[i]], envir = env, enclos = env) : restarting interrupted promise evaluation Warning in eval(dots[[i]], envir = env, enclos = env) : restarting interrupted promise evaluation Error in eval(dots[[idot]], parent.frame(1)) : ..6 used in an incorrect context, no ... to look in plot_glmnet(elnet.object, xvar="rlambda", grid.col=0, col=..6, s=0, nresponse=1) Error in eval(dots[[idot]], parent.frame(1)) : ..6 used in an incorrect context, no ... to look in Error : cannot evaluate 'col' Got expected error from try(plotres(glmnet, w1.col = nonesuch)) > > printf("======== glmnet multinomial (multnet)\n") ======== glmnet multinomial (multnet) > par(mfrow=c(4,4), mar=c(3,3,3,1)) > set.seed(2016) > n <- 200 > p <- 4 > x <- matrix(rnorm(n*p), n, p) > colnames(x) <- paste("x", 1:ncol(x), sep="") > > # "1" is correlated with x[,1], "4" is correlated with x[,2], "2" and "3" not correlated > y <- ifelse(x[,1] > 0.5, 1, + ifelse(x[,2] > 0.0, 4, + sample(c(2,3), size=nrow(x), replace=TRUE))) > print(cov(x, y)) [,1] x1 -0.84023279 x2 0.38654310 x3 -0.11396993 x4 -0.07611821 > y <- factor(y) > > # TODO Following causes the following warning: > # Warning: from glmnet Fortran code (error code -90); Convergence for 90th lambda value not reached after maxit=100000 iterations; solutions for larger lambdas returned > multinomial.mod <- glmnet(x, y, family="multinomial") Warning: from glmnet C++ code (error code -90); Convergence for 90th lambda value not reached after maxit=100000 iterations; solutions for larger lambdas returned > > plotres(multinomial.mod, nresponse=1, w1.main="nresponse=1", + main="family=\"multinomial\"", + smooth.col=0, info=TRUE, + trace=0, which=c(1,3), do.par=FALSE, xlim=c(-.2,1.2), ylim=c(-1.2, 1.2)) > > plotres(multinomial.mod, nresponse=2, w1.main="nresponse=2", + smooth.col=0, info=TRUE, + trace=0, which=c(1,3), do.par=FALSE, xlim=c(-.2,1.2), ylim=c(-1.2, 1.2)) > > plotres(multinomial.mod, nresponse=3, w1.main="nresponse=3", + smooth.col=0, info=TRUE, + trace=0, which=c(1,3), do.par=FALSE, xlim=c(-.2,1.2), ylim=c(-1.2, 1.2)) > > plotres(multinomial.mod, nresponse=4, w1.main="nresponse=4", + smooth.col=0, info=TRUE, + trace=0, which=c(1,3), do.par=FALSE, xlim=c(-.2,1.2), ylim=c(-1.2, 1.2)) > > plotmo(multinomial.mod, nresponse=1, trace=0, do.par=FALSE, degree1=1:2) plotmo grid: x1 x2 x3 x4 -0.01157106 0.1530614 0.04853916 0.02097713 > plotmo(multinomial.mod, nresponse=2, trace=0, do.par=FALSE, degree1=1:2) plotmo grid: x1 x2 x3 x4 -0.01157106 0.1530614 0.04853916 0.02097713 > > par(mgp=c(1.5, .4, 0)) > plot(multinomial.mod, xvar="norm") # compare to plot.glmnet > par(org.par) > > # compare to earth > par(mfrow=c(4,3), mar=c(3,3,1,1)) > yfac <- factor(c("a","b","c","d")[y]) > earth.mod <- earth(x, yfac, trace=0) > > plotres(earth.mod, nresponse=1, + main=sprint("multiresponse\nnresponse=1 rsq %.2g", earth.mod$rsq.per.response[1]), + which=3, xlim=c(-.2, 1.2), ylim=c(-1.2, 1.2), + smooth.col=0, info=TRUE, + do.par=FALSE, trace=0, jitter=7, cex.response=.7) > plotmo(earth.mod, nresponse=1, do.par=FALSE) plotmo grid: x1 x2 x3 x4 -0.01157106 0.1530614 0.04853916 0.02097713 > > plotres(earth.mod, nresponse=2, + main=sprint("nresponse=2 rsq %.2g", earth.mod$rsq.per.response[2]), + which=3, xlim=c(-.2, 1.2), ylim=c(-1.2, 1.2), + smooth.col=0, info=TRUE, + do.par=FALSE, trace=0, jitter=7, cex.response=.7) > plotmo(earth.mod, nresponse=2, do.par=FALSE) plotmo grid: x1 x2 x3 x4 -0.01157106 0.1530614 0.04853916 0.02097713 > > plotres(earth.mod, nresponse=3, + main=sprint("nresponse=3 rsq %.2g", earth.mod$rsq.per.response[3]), + which=3, xlim=c(-.2, 1.2), ylim=c(-1.2, 1.2), + smooth.col=0, info=TRUE, + do.par=FALSE, trace=0, jitter=7, cex.response=.7) > plotmo(earth.mod, nresponse=3, do.par=FALSE) plotmo grid: x1 x2 x3 x4 -0.01157106 0.1530614 0.04853916 0.02097713 > > plotres(earth.mod, nresponse=4, + main=sprint("nresponse=4 rsq %.2g", earth.mod$rsq.per.response[4]), + which=3, xlim=c(-.2, 1.2), ylim=c(-1.2, 1.2), + smooth.col=0, info=TRUE, + do.par=FALSE, trace=0, jitter=7, cex.response=.7) > plotmo(earth.mod, nresponse=4, do.par=FALSE) plotmo grid: x1 x2 x3 x4 -0.01157106 0.1530614 0.04853916 0.02097713 > > print(summary(earth.mod)) Call: earth(x=x, y=yfac, trace=0) a b c d (Intercept) -0.00759508 0.4777590 0.32170406 0.2081320 h(x1-0.333835) 2.90462369 -0.8647319 -0.45258311 -1.5873087 h(x1-0.698191) -2.95380448 0.8748909 0.44797354 1.6309401 h(x2- -0.724713) 0.00083945 0.8851614 -0.25504553 -0.6309554 h(x2- -0.399683) 0.00512171 -1.9558653 -0.04067399 1.9914176 h(x2-0.255847) -0.00181500 1.1141555 0.31084638 -1.4231869 Selected 6 of 14 terms, and 2 of 4 predictors Termination condition: Reached nk 21 Importance: x1, x2, x3-unused, x4-unused Number of terms at each degree of interaction: 1 5 (additive model) GCV RSS GRSq RSq a 0.01233701 2.203452 0.9438697 0.9493692 b 0.10618691 18.965513 0.3429519 0.4073277 c 0.08491793 15.166767 0.1053911 0.1930425 d 0.07399172 13.215291 0.6874511 0.7180738 All 0.27743357 49.551022 0.6109269 0.6490472 > > par(org.par) > > printf("======== binomial model\n") ======== binomial model > > set.seed(2019) > n <- 50 > p <- 4 > x <- matrix(rnorm(n*p), n, p) > colnames(x) <- paste("x", 1:ncol(x), sep="") > y <- ifelse(x[,1] + x[,2] + .1 * rnorm(n) > .5, TRUE, FALSE) > print(cov(x, y)) [,1] x1 0.26996406 x2 0.19322507 x3 0.04850061 x4 0.01568008 > y <- factor(y) > glmnet.binomial <- glmnet(x, y, family="binomial") > par(mfrow=c(2,3), mar=c(3,3,1,1)) > plotres(glmnet.binomial, info=T, predict.s=.02, which=c(1,3), do.par=FALSE, w1.main="glmnet.binomial") > plot(glmnet.binomial) > earth.mod <- earth(x, y) > set.seed(2019) > plotres(earth.mod, info=T, which=c(1,3), do.par=FALSE) > par(org.par) > par(mfrow=c(2,4), mar=c(3,3,1,1)) > set.seed(2019) > plotmo(glmnet.binomial, do.par=FALSE) plotmo grid: x1 x2 x3 x4 0.05687241 -0.2477018 -0.1266239 -0.2475514 > plotmo(earth.mod, do.par=FALSE, main="binomial earth.mod") plotmo grid: x1 x2 x3 x4 0.05687241 -0.2477018 -0.1266239 -0.2475514 > par(org.par) > > printf("======== glmnet family=\"mgaussian\"\n") ======== glmnet family="mgaussian" > set.seed(2015) > p <- 10 > n <- 30 > x <- cbind((1:n)/n, matrix(rnorm(n*(p-1)),n,p-1)) > colnames(x) <- paste0("x", 1:p) > # ymultresp <- cbind(rowSums(x[,1:5]^3), rowSums(x[,5:p]^3), 1:n) > set.seed(1) > ymultresp <- cbind(x[,1]+.001*rnorm(n), rowSums(x[,2:5]^3), rnorm(n)) > glmnet.mgaussian <- glmnet(x, ymultresp, family="mgaussian") > plotres(glmnet.mgaussian, nresponse=1, SHOWCALL=TRUE, which=c(1:3), do.par=2, info=1) > # manually calculate the residuals > plot(x=predict(glmnet.mgaussian, newx=x, s=0)[,1,1], + y=ymultresp[,1] - predict(glmnet.mgaussian, newx=x, s=0)[,1,1], + pch=20, xlab="Fitted", ylab="Residuals", + main="Manually calculated residuals, nresponse=1, s=0") > abline(h=0, col="gray") > par(org.par) > plotres(glmnet.mgaussian, nresponse=2, SHOWCALL=TRUE, which=c(1:3), do.par=2, info=1) > # manually calculate the residuals > plot(x=predict(glmnet.mgaussian, newx=x, s=0)[,2,1], + y=ymultresp[,2] - predict(glmnet.mgaussian, newx=x, s=0)[,2,1], + pch=20, xlab="Fitted", ylab="Residuals", + main="Manually calculated residuals, nresponse=2, s=0") > abline(h=0, col="gray") > par(org.par) > plotmo(glmnet.mgaussian, nresponse=1, SHOWCALL=TRUE) plotmo grid: x1 x2 x3 x4 x5 x6 0.5166667 0.002216547 0.3749872 -0.1927516 -0.3806807 -0.03575992 x7 x8 x9 x10 0.01386232 0.0135174 0.04028881 0.0426105 > plotmo(glmnet.mgaussian, nresponse=2, SHOWCALL=TRUE) plotmo grid: x1 x2 x3 x4 x5 x6 0.5166667 0.002216547 0.3749872 -0.1927516 -0.3806807 -0.03575992 x7 x8 x9 x10 0.01386232 0.0135174 0.04028881 0.0426105 > > graphics::par(mfrow=c(2,2), mgp=c(1.5,0.4,0), tcl=-0.3, cex.main=1, + font.main=1, mar=c(4,3,1.2,0.8), oma=c(0,0,4,0), cex=0.83) > > plotres(glmnet.mgaussian, nresponse=2, SHOWCALL=TRUE, which=3, do.par=FALSE, + caption="glmnet.mgaussian compare to manually calculated residuals") > plot(x=predict(glmnet.mgaussian, newx=x, s=0)[,2,1], + y=ymultresp[,2] - predict(glmnet.mgaussian, newx=x, s=0)[,2,1], + pch=20, xlab="Fitted", ylab="Residuals", + main="Manual residuals, nresponse=2, s=0") > abline(h=0, col="gray") > > plotres(glmnet.mgaussian, nresponse=2, predict.s=.5, SHOWCALL=TRUE, which=3, do.par=FALSE) > plot(x=predict(glmnet.mgaussian, newx=x, s=.5)[,2,1], + y=ymultresp[,2] - predict(glmnet.mgaussian, newx=x, s=.5)[,2,1], + pch=20, xlab="Fitted", ylab="Residuals", + main="Manual residuals, nresponse=2, s=.5") > abline(h=0, col="gray") > > plotres(glmnet.mgaussian, predict.s=.05, nresponse=3, info=TRUE, SHOWCALL=TRUE) # essentially random > > par(org.par) > par(mfrow=c(2,3), mar=c(3,3,3,.5), oma=c(0,0,3,0), mgp=c(1.5,0.4,0), tcl=-0.3) > > data(trees) > set.seed(2015) > # variable with a long name > x50 <- cbind(trees[,1:2], Girth12345678901234567890=rnorm(nrow(trees))) > mod.with.long.name <- glmnet(data.matrix(x50),data.matrix(trees$Volume)) > plotres(mod.with.long.name, which=1, caption="test plot_glmnet with x50 and x60") > > # one inactive variable (all coefs are zero for variable "rand") > set.seed(2015) > x60 <- cbind(trees[,1], rand=rnorm(nrow(trees)), trees[,2]) > # complicate the issue: use an unnamed column (column 3) > colnames(x60) <- c("Girth", "rand", "") > mod.with.inactive.var <- glmnet(data.matrix(x60),data.matrix(trees$Volume)) > mod.with.inactive.var$beta["rand",] = 0 # TODO hack force inactive variable > plotres(mod.with.inactive.var, which=1) > plotres(mod.with.inactive.var, which=1, w1.xvar="norm") > # compare to plot.glmnet (but note that labels aren't always plotted unless par=c(1,1)?) > plot(mod.with.inactive.var, xvar="norm", label=TRUE) > # plotmo calls the unnamed column "x3", fair enough > plotmo(mod.with.inactive.var, do.par=FALSE, pt.col=2) plotmo grid: Girth rand x3 12.9 0.004544606 76 > > # single active variable > x70 <- cbind(trees[,1,drop=F], 0) > a <- glmnet(data.matrix(x70), data.matrix(trees$Volume)) > par(org.par) > par(mfrow=c(2,2), mar=c(3,3,2,4)) > plotres(a, which=1, predict.s=1, caption="single active variable") > plotres(a, which=1, w1.xvar="norm") > plotres(a, which=1, w1.xvar="lambda") > plotres(a, which=1, w1.xvar="dev") > > #--- test interaction of w1. and non w1 args ------------------------------------- > > #--- glmnet model, which=1 --- > > par(org.par) > par(mfrow=c(4,3), mar=c(3, 3, 4, 1), mgp=c(2, 0.6, 0)) > > plotres(mod.glmnet.xmat, which=1, + w1.xlim=c(6,-6), + w1.ylim=c(-5,5), + w1.col=1:2, + w1.main="TEST INTERACTION OF W1 ARGS PAGE 1 (which=1)\n\nwhich=1 w1.xlim=c(6,-6)\nw1.ylim=c(-5,5)) w1.col=1:2,") > > plotres(mod.glmnet.xmat, which=1, cex.main=1.2, + xlim=c(9,-9), + ylim=c(-60,60), + col=3:4, + w1.main="which=1 xlim=c(9,-9)\nylim=c(-60,60)) col=3:4,") > > plotres(mod.glmnet.xmat, which=1, cex.main=1, + xlim=c(9,-9), w1.xlim=c(6,-6), + ylim=c(-60,60), w1.ylim=c(-5,5), + w1.col=1:2, col=3:4, + w1.main="which=1 xlim=c(9,-9), w1.xlim=c(6,-6)\nylim=c(-60,60), w1.ylim=c(-5,5)) w1.col=1:2, col=3:4") > > #--- glmnet model, which=c(1,3,4) --- > > plotres(mod.glmnet.xmat, which=c(1,3,4), cex.main=1, + ylim=c(-70,70), xlim=c(-20, 60), + col=2:3, do.par=FALSE, + w1.main="TEST INTERACTION OF W1 ARGS PAGE 1 (which=c(1,3,4))\nlim=c(-70,70), xlim=c(-20, 60)") > > plotres(mod.glmnet.xmat, which=c(1,3,4), cex.main=1.2, + ylim=c(-70,70), xlim=c(-20, 60), qq.xlim=c(-7,5), + col=2:3, do.par=FALSE, + w1.main="ylim=c(-70,70), xlim=c(-20, 60)\nqq.xlim=c(-7,5)") > > plotres(mod.glmnet.xmat, which=c(1,3,4), cex.main=1.2, + w1.ylim=c(-7,7), w1.xlim=c(4,-4), col=2:3, do.par=FALSE, + w1.main="w1.ylim=c(-7,7), w1.xlim=c(4,-4)") > > # plotres(mod.glmnet.xmat, which=c(1,3,4), cex.main=.9, > # w1.ylim=c(-7,7), ylim=c(-20,20), > # qq.xlim=c(-7,5), col=2:3, do.par=FALSE, > # qq.ylim=c(-100,100), > # main="w1.ylim=c(-7,7) ylim=c(-20,20)\nqq.xlim=c(-7,5) qq.ylim=c(-100,100)") > > par(org.par) > par(mfrow=c(3,3), mar=c(3, 3, 4, 1), mgp=c(2, 0.6, 0)) > > plotres(mod.glmnet.xmat, which=c(1,3,4), do.par=FALSE, # w1.main="which=c(1,3,4)", + w1.xlim=c(6,-6), + w1.ylim=c(-5,5), + w1.col=2:3, + w1.main="TEST INTERACTION OF W1 ARGS PAGE 2\n\nwhich=c(1,3,4) w1.xlim=c(6,-6)\nw1.ylim=c(-5,5)) w1.col=2:3") > > plotres(mod.glmnet.xmat, which=c(1,3,4), w1.cex.main=1, do.par=FALSE, # w1.main="which=c(1,3,4)", + xlim=c(-20,70), + ylim=c(-60,60), + w1.col=2:3, + col=3:4, + w1.main="which=c(1,3,4) ylim=c(-60,60))\nw1.col=2:3, col=3:4") > > plotres(mod.glmnet.xmat, which=c(1,3,4), w1.cex.main=1, do.par=FALSE, # w1.main="which=c(1,3,4)", + xlim=c(-20,70), w1.xlim=c(6,-6), + ylim=c(-60,60), w1.ylim=c(-5,5), + col=3:4, + w1.main="which=c(1,3,4) xlim=c(9,-9), w1.xlim=c(6,-6)\nylim=c(-60,60), w1.ylim=c(-5,5)) w1.col=1:2, col=3:4") > > par(org.par) > > #-- make sure that we can work with all families > > set.seed(2016) > par(mfrow=c(3,3), mar=c(3,3,3,1)) > n <- 100 > p <- 4 > x <- matrix(rnorm(n*p), n, p) > g2 <- sample(1:2, n, replace=TRUE) > for(family in c("gaussian","binomial","poisson")) { + mod <- glmnet(x,g2,family=family) + plot(mod, xvar="lambda") + plotres(mod, w1.xvar="lambda", main=paste("family", family), + which=c(1,3), do.par=FALSE) + } > # cox > library(plotmo) > n <- 100 > p <- 20 > nzc <- trunc(p/10) > set.seed(2016) > beta <- rnorm(nzc) > x7 <- matrix(rnorm(n*p), n, p) > beta <- rnorm(nzc) > fx <- x7[,seq(nzc)] %*% beta/3 > hx <- exp(fx) > ty <- rexp(n, hx) > tcens <- rbinom(n=n, prob=.3, size=1)# censoring indicator > y <- cbind(time=ty, status=1-tcens) # y=Surv(ty,1-tcens) with library(survival) > glmnet.cox <- glmnet(x=x7, y=y, family="cox") > plot(glmnet.cox) > title("glmnet.cox", line=2) > plot_glmnet(glmnet.cox, xvar="norm") > plotres(glmnet.cox, which=3, do.par=FALSE) > par(org.par) > > # test col argument > par(mfrow=c(2,3), mar=c(3,3,5,1), cex=1) > mod <- glmnet(as.matrix(mtcars[-1]), mtcars[,1]) > plot_glmnet(mod, main="plot_glmnet default") > plot_glmnet(mod, col=c(1,2,3,0,0,NA,0,0,0,0), main="col=c(1,2,3,0,0,NA,0,0,0,0)") > g <- "gray" > plot_glmnet(mod, col=c("black","red","green",g,g,g,g,g,"steelblue","darkorange"), main="col=c('black','red','green',g,g,g,g,g,'steelblue','darkorange')") > plot_glmnet(mod, col=c("black","red","green",0,0,0,0,0,"steelblue","darkorange"), main="col=c('black','red','green',0,0,0,0,0,'steelblue','darkorange')") > plot_glmnet(mod, col=c("black","red", 0), main="col=c('black','red', 0)") # test recycling, including 0 > par(org.par) > > source("test.epilog.R") plotmo/inst/slowtests/test.partdep.bat0000755000176200001440000000150715124635472017734 0ustar liggesusers@rem test.partdep.bat: partdep tests for plotmo and plotres @echo test.partdep.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.partdep.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.partdep.Rout: @echo. @tail test.partdep.Rout @echo test.partdep.R @exit /B 1 :good1 mks.diff test.partdep.Rout test.partdep.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.partdep.save.ps @exit /B 1 :good2 @rem test.partdep.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.partdep.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.partdep.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/test.partykit.Rout.save0000644000176200001440000005361714567065443021277 0ustar liggesusers> # test.partykit.R: test partykit and evtree packages > > source("test.prolog.R") > library(plotmo) Loading required package: Formula Loading required package: plotrix > library(partykit) Loading required package: grid Loading required package: libcoin Loading required package: mvtnorm > data("BostonHousing", package = "mlbench") > data("PimaIndiansDiabetes", package = "mlbench") > > # lmtree > > boston <- transform(BostonHousing, + chas = factor(chas, levels = 0:1, labels = c("no", "yes")), + rad = factor(rad, ordered = TRUE)) > set.seed(2018) > lmtree.boston1 <- lmtree(medv ~ log(lstat) + rm^2 | + crim + ptratio + tax + dis + rad + chas, + data = boston, minsize = 40) > > boston2 <- boston > boston2$log.lstat <- log(boston2$lstat) > boston2$lstat <- NULL > boston2$rm.squared <- boston2$rm^2 > boston2$rm <- NULL > set.seed(2018) > lmtree.boston2 <- lmtree(medv ~ log.lstat + rm.squared | + crim + ptratio + tax + dis + rad + chas, + data = boston2, minsize = 40) > > plot(lmtree.boston1) > plot(lmtree.boston2) > > plotmo(lmtree.boston1, SHOWCALL=TRUE) plotmo grid: lstat rm crim ptratio tax dis rad chas 11.36 6.2085 0.25651 19.05 330 3.20745 24 no > plotmo(lmtree.boston2, trace=2, SHOWCALL=TRUE) plotmo trace 2: plotmo(object=lmtree.boston2, trace=2, SHOWCALL=TRUE) --get.model.env for object with class lmtree object call is lmtree(formula=medv~log.lstat+rm.squared|crim+ptratio+tax+dis+rad+chas, data=boston2, minsize=40) using the environment saved in $terms of the lmtree model: R_GlobalEnv --plotmo_prolog for lmtree object 'lmtree.boston2' variable importance: log.lstat rm.squared tax ptratio changing class of 'lmtree.boston2' from c("lmtree", "modelparty", "party") to "party_plotmo" for standard "[[" --plotmo_x for party_plotmo object get.object.x: object$x is NULL (and it has no colnames) object call is lmtree(formula=medv~log.lstat+rm.squared|crim+ptratio+tax+dis+rad+chas, data=... get.x.from.model.frame: formula(object) is medv ~ log.lstat + rm.squared + (crim + ptratio + tax + d... naked formula is medv ~ log.lstat + rm.squared + crim + ptratio + tax + dis + rad + chas formula is valid, now looking for data for the model.frame object$model is NULL (and it has no colnames) argument 2 of the call is 'data' eval(call$data, R_GlobalEnv) call$data is usable and has column names crim zn indus chas nox age dis rad tax ptratio b medv log.lstat rm.squared na.action(object) is "na.pass" stats::model.frame(medv ~ log.lstat + rm.squared + crim ..., data=call$data, na.action="na.pass") x=model.frame[,-1] is usable and has column names log.lstat rm.squared crim ptratio tax dis rad chas plotmo_x returned[506,8]: log.lstat rm.squared crim ptratio tax dis rad chas 1 1.605430 43.23063 0.00632 15.3 296 4.0900 1 no 2 2.212660 41.22924 0.02731 17.8 242 4.9671 2 no 3 1.393766 51.62422 0.02729 17.8 242 4.9671 2 no ... 1.078410 48.97200 0.03237 18.7 222 6.0622 3 no 506 2.064328 36.36090 0.04741 21.0 273 2.5050 1 no factors: rad(ordered) chas ----Metadata: plotmo_predict with nresponse=NULL and newdata=NULL plotmo_predict with NULL newdata (nrows=3), using plotmo_x to get the data --plotmo_x for party_plotmo object get.object.x: object$x is NULL (and it has no colnames) object call is lmtree(formula=medv~log.lstat+rm.squared|crim+ptratio+tax+dis+rad+chas, data=... get.x.from.model.frame: formula(object) is medv ~ log.lstat + rm.squared + (crim + ptratio + tax + d... naked formula is medv ~ log.lstat + rm.squared + crim + ptratio + tax + dis + rad + chas formula is valid, now looking for data for the model.frame object$model is NULL (and it has no colnames) argument 2 of the call is 'data' eval(call$data, R_GlobalEnv) call$data is usable and has column names crim zn indus chas nox age dis rad tax ptratio b medv log.lstat rm.squared na.action(object) is "na.pass" stats::model.frame(medv ~ log.lstat + rm.squared + crim ..., data=call$data, na.action="na.pass") x=model.frame[,-1] is usable and has column names log.lstat rm.squared crim ptratio tax dis rad chas plotmo_x returned[506,8]: log.lstat rm.squared crim ptratio tax dis rad chas 1 1.605430 43.23063 0.00632 15.3 296 4.0900 1 no 2 2.212660 41.22924 0.02731 17.8 242 4.9671 2 no 3 1.393766 51.62422 0.02729 17.8 242 4.9671 2 no ... 1.078410 48.97200 0.03237 18.7 222 6.0622 3 no 506 2.064328 36.36090 0.04741 21.0 273 2.5050 1 no factors: rad(ordered) chas will use the above data instead of newdata=NULL for predict.party_plotmo stats::predict(lmtree.object, data.frame[3,8], type="response") predict returned[3,1] with no column names: 1 26.03975 2 26.21389 3 35.63227 predict after processing with nresponse=NULL is [3,1] with no column names: 1 26.03975 2 26.21389 3 35.63227 ----Metadata: plotmo_fitted with nresponse=NULL stats::fitted(object=party_plotmo.object) fitted(object) returned[506,1]: (fitted) 1 7 2 6 3 6 ... 6 506 8 fitted(object) after processing with nresponse=NULL is [506,1]: (fitted) 1 7 2 6 3 6 ... 6 506 8 ----Metadata: plotmo_y with nresponse=NULL --plotmo_y with nresponse=NULL for party_plotmo object get.object.y: object$y is NULL (and it has no colnames) object call is lmtree(formula=medv~log.lstat+rm.squared|crim+ptratio+tax+dis+rad+chas, data=... get.y.from.model.frame: formula(object) is medv ~ log.lstat + rm.squared + (crim + ptratio + tax + d... formula is valid, now looking for data for the model.frame object$model is NULL (and it has no colnames) argument 2 of the call is 'data' eval(call$data, R_GlobalEnv) call$data is usable and has column names crim zn indus chas nox age dis rad tax ptratio b medv log.lstat rm.squared na.action(object) is "na.pass" stats::model.frame(medv ~ log.lstat + rm.squared + (crim..., data=call$data, na.action="na.pass") y=model.frame[,1] is usable and has column name medv plotmo_y returned[506,1]: medv 1 24.0 2 21.6 3 34.7 ... 33.4 506 11.9 plotmo_y after processing with nresponse=NULL is [506,1]: medv 1 24.0 2 21.6 3 34.7 ... 33.4 506 11.9 converted nresponse=NA to nresponse=1 nresponse=1 (was NA) ncol(fitted) 1 ncol(predict) 1 ncol(y) 1 ----Metadata: plotmo_y with nresponse=1 --plotmo_y with nresponse=1 for party_plotmo object get.object.y: object$y is NULL (and it has no colnames) object call is lmtree(formula=medv~log.lstat+rm.squared|crim+ptratio+tax+dis+rad+chas, data=... get.y.from.model.frame: formula(object) is medv ~ log.lstat + rm.squared + (crim + ptratio + tax + d... formula is valid, now looking for data for the model.frame object$model is NULL (and it has no colnames) argument 2 of the call is 'data' eval(call$data, R_GlobalEnv) call$data is usable and has column names crim zn indus chas nox age dis rad tax ptratio b medv log.lstat rm.squared na.action(object) is "na.pass" stats::model.frame(medv ~ log.lstat + rm.squared + (crim..., data=call$data, na.action="na.pass") y=model.frame[,1] is usable and has column name medv got model response from model.frame(medv ~ log.lstat + rm.squared + (crim..., data=call$data, na.action="na.pass") plotmo_y returned[506,1]: medv 1 24.0 2 21.6 3 34.7 ... 33.4 506 11.9 plotmo_y after processing with nresponse=1 is [506,1]: medv 1 24.0 2 21.6 3 34.7 ... 33.4 506 11.9 got response name "medv" from yfull resp.levs is NULL ----Metadata: done number of x values: log.lstat 455 rm.squared 446 crim 504 ptratio 46 tax 66 d... ----plotmo_singles for party_plotmo object singles: 1 log.lstat, 2 rm.squared, 4 ptratio, 5 tax ----plotmo_pairs for party_plotmo object pairs: [,1] [,2] [1,] "1 log.lstat" "2 rm.squared" [2,] "1 log.lstat" "4 ptratio" [3,] "1 log.lstat" "5 tax" [4,] "2 rm.squared" "4 ptratio" [5,] "2 rm.squared" "5 tax" [6,] "4 ptratio" "5 tax" graphics::par(mfrow=c(4,4), mgp=c(1.5,0.4,0), tcl=-0.3, font.main=2, mar=c(3,2,1.2,0.8), oma=c(0,0,4,0), cex.main=1.1, cex.lab=1, cex.axis=1, cex=0.66) ----Figuring out ylim --get.ylim.by.dummy.plots --plot.degree1(draw.plot=FALSE) degree1 plot1 (pmethod "plotmo") variable log.lstat newdata[50,8]: log.lstat rm.squared crim ptratio tax dis rad chas 1 0.5481214 38.54547 0.25651 19.05 330 3.20745 24 no 2 0.6111556 38.54547 0.25651 19.05 330 3.20745 24 no 3 0.6741898 38.54547 0.25651 19.05 330 3.20745 24 no ... 0.7372240 38.54547 0.25651 19.05 330 3.20745 24 no 50 3.6367964 38.54547 0.25651 19.05 330 3.20745 24 no factors: rad(ordered) chas stats::predict(lmtree.object, data.frame[50,8], type="response") predict returned[50,1] with no column names: 1 23.25924 2 23.24236 3 23.22549 ... 23.20861 50 22.43238 predict after processing with nresponse=1 is [50,1]: predict 1 23.25924 2 23.24236 3 23.22549 ... 23.20861 50 22.43238 Reducing trace level for subsequent degree1 plots degree1 plot2 (pmethod "plotmo") variable rm.squared degree1 plot3 (pmethod "plotmo") variable ptratio degree1 plot4 (pmethod "plotmo") variable tax --plot.degree2(draw.plot=FALSE) degree2 plot1 (pmethod "plotmo") variables log.lstat:rm.squared newdata[400,8]: log.lstat rm.squared crim ptratio tax dis rad chas 1 0.5481214 12.68072 0.25651 19.05 330 3.20745 24 no 2 0.7106832 12.68072 0.25651 19.05 330 3.20745 24 no 3 0.8732451 12.68072 0.25651 19.05 330 3.20745 24 no ... 1.0358069 12.68072 0.25651 19.05 330 3.20745 24 no 400 3.6367964 77.08840 0.25651 19.05 330 3.20745 24 no factors: rad(ordered) chas stats::predict(lmtree.object, data.frame[400,8], type="response") predict returned[400,1] with no column names: 1 6.346628 2 6.303109 3 6.259590 ... 6.216071 400 47.635075 predict after processing with nresponse=1 is [400,1]: predict 1 6.346628 2 6.303109 3 6.259590 ... 6.216071 400 47.635075 Reducing trace level for subsequent degree2 plots degree2 plot2 (pmethod "plotmo") variables log.lstat:ptratio degree2 plot3 (pmethod "plotmo") variables log.lstat:tax degree2 plot4 (pmethod "plotmo") variables rm.squared:ptratio degree2 plot5 (pmethod "plotmo") variables rm.squared:tax degree2 plot6 (pmethod "plotmo") variables ptratio:tax --done get.ylim.by.dummy.plots ylim c(3.124, 53.64) clip TRUE --plot.degree1(draw.plot=TRUE) plotmo grid: log.lstat rm.squared crim ptratio tax dis rad chas 2.430097 38.54547 0.25651 19.05 330 3.20745 24 no graphics::plot.default(x=c(0.548,0.611,0...), y=c(23.26,23.24,2...), type="n", main="1 log.lstat", xlab="", ylab="", xaxt="s", yaxt="s", xlim=c(0.548,3.637), ylim=c(3.12,53.64)) --plot.degree2(draw.plot=TRUE) persp(log.lstat:rm.squard) theta 55 persp(log.lstat:ptratio) theta 145 persp(log.lstat:tax) theta 55 persp(rm.squard:ptratio) theta 235 persp(rm.squard:tax) theta 235 persp(ptratio:tax) theta 145 > plotmo(lmtree.boston2, trace=1, all1=TRUE, degree2=c("ptratio", "log.lstat"), SHOWCALL=TRUE) variable importance: log.lstat rm.squared tax ptratio stats::predict(lmtree.object, data.frame[3,8], type="response") stats::fitted(object=party_plotmo.object) got model response from model.frame(medv ~ log.lstat + rm.squared + (crim..., data=call$data, na.action="na.pass") plotmo grid: log.lstat rm.squared crim ptratio tax dis rad chas 2.430097 38.54547 0.25651 19.05 330 3.20745 24 no > plotmo(lmtree.boston2, all1=TRUE, all2=TRUE, SHOWCALL=TRUE) plotmo grid: log.lstat rm.squared crim ptratio tax dis rad chas 2.430097 38.54547 0.25651 19.05 330 3.20745 24 no > > # TODO gives warnings because of because of price/citations in formula > # data("Journals", package = "AER") > # Journals <- transform(Journals, > # age = 2000 - foundingyear, > # chars = charpp * pages) > # j_tree <- lmtree(log(subs) ~ log(price/citations) | price + citations + > # age + chars + society, data = Journals, minsize = 10) > # plotmo(j_tree, SHOWCALL=TRUE) > > # Works, but commented out to save testing time: > # data("TeachingRatings", package = "AER") > # tr_tree <- lmtree(eval ~ beauty | age + gender + division, > # data = TeachingRatings, weights = students, subset = credits == "more", > # caseweights = FALSE) > # plot(tr_tree) > # plotmo(tr_tree, all1=TRUE, all2=TRUE, SHOWCALL=TRUE) > > # glmtree > > glmtree1 <- glmtree(diabetes ~ glucose | mass + age, + data = PimaIndiansDiabetes, family = binomial) > plot(glmtree1) Loading required namespace: vcd > plotmo(glmtree1, SHOWCALL=TRUE) plotmo grid: glucose mass age 117 32 29 > plotmo(glmtree1, all2=TRUE, SHOWCALL=TRUE) plotmo grid: glucose mass age 117 32 29 > > # mob > > pima <- PimaIndiansDiabetes[1:50,] # small set of data for fast test > > logit1 <- function(y, x, start = NULL, weights = NULL, offset = NULL, ...) + { + # note that a complicated formula is necessary + formula <- as.formula(paste("y ~ ", paste(colnames(x)[-1], collapse="+"))) # -1 drops intercept + glm(formula=formula, data=as.data.frame(x), family=binomial, start=start, ...) + } > mob1 <- mob(diabetes ~ glucose | mass + age, + data = PimaIndiansDiabetes, fit = logit1) > plot(mob1) > plotmo(mob1, trace=1, SHOWCALL=TRUE) variable importance: glucose mass age stats::predict(modelparty.object, data.frame[3,3], type="response") stats::fitted(object=party_plotmo.object) got model response from model.frame(diabetes ~ glucose + (mass + age), data=call$data, na.action="na.pass") plotmo grid: glucose mass age 117 32 29 > plotmo(mob1, pmethod="partdep", degree1=0, + degree2=c("glucose", "mass"), persp.ticktype="detailed", SHOWCALL=TRUE) calculating partdep for glucose:mass 01234567890 > plotmo(mob1, all1=TRUE, all2=TRUE, SHOWCALL=TRUE) plotmo grid: glucose mass age 117 32 29 > > logit2 <- function(y, x, start = NULL, weights = NULL, offset = NULL, ...) + { + glm(y ~ 0 + x, family = binomial, start = start, ...) + } > mob2 <- mob(diabetes ~ glucose | mass, data = pima, fit = logit2) > expect.err(try(plotmo(mob2)), "The formula in the mob fit function is not supported by plotmo") The following formula in the mob fit function is not supported by plotmo: glm(y ~ 0 + x, family = binomial, start = start, ...) Possible workaround: Replace the fit function with: logit2 <- function (y, x, start = NULL, weights = NULL, offset = NULL, ...) { glm(as.formula(paste("y ~ ", paste(colnames(x)[-1], collapse="+"))), data=x, family = binomial, start = start, ...) } Error : The formula in the mob fit function is not supported by plotmo (see above) This is because predict.mob often fails with newdata and type="response" e.g. example(mob); predict(pid_tree, newdata=PimaIndiansDiabetes[1:3,], type="response") Got expected error from try(plotmo(mob2)) > > logit3 <- function(y, x, start = NULL, weights = NULL, offset = NULL, ...) + { + glm(y ~ 0+x , family = binomial, start = start, ...) + } > mob3 <- mob(diabetes ~ glucose | age, data = pima, fit = logit3) > expect.err(try(plotmo(mob3)), "The formula in the mob fit function is not supported by plotmo") The following formula in the mob fit function is not supported by plotmo: glm(y ~ 0 + x, family = binomial, start = start, ...) Possible workaround: Replace the fit function with: logit3 <- function (y, x, start = NULL, weights = NULL, offset = NULL, ...) { glm(as.formula(paste("y ~ ", paste(colnames(x)[-1], collapse="+"))), data=x, family = binomial, start = start, ...) } Error : The formula in the mob fit function is not supported by plotmo (see above) This is because predict.mob often fails with newdata and type="response" e.g. example(mob); predict(pid_tree, newdata=PimaIndiansDiabetes[1:3,], type="response") Got expected error from try(plotmo(mob3)) > > logit4 <- function(y, x, start = NULL, weights = NULL, offset = NULL, ...) + { + glm(y ~ x - 1, family = binomial, start = start, ...) + } > mob4 <- mob(diabetes ~ glucose | age, data = pima, fit = logit4) > expect.err(try(plotmo(mob4)), "The formula in the mob fit function is not supported by plotmo") The following formula in the mob fit function is not supported by plotmo: glm(y ~ x - 1, family = binomial, start = start, ...) Possible workaround: Replace the fit function with: logit4 <- function (y, x, start = NULL, weights = NULL, offset = NULL, ...) { glm(as.formula(paste("y ~ ", paste(colnames(x)[-1], collapse="+"))), data=x, family = binomial, start = start, ...) } Error : The formula in the mob fit function is not supported by plotmo (see above) This is because predict.mob often fails with newdata and type="response" e.g. example(mob); predict(pid_tree, newdata=PimaIndiansDiabetes[1:3,], type="response") Got expected error from try(plotmo(mob4)) > > logit5 <- function(y, x, start = NULL, weights = NULL, offset = NULL, ...) + { + glm(y~x-1 , family = binomial, start = start, ...) + } > mob5 <- mob(diabetes ~ glucose | age, data = pima, fit = logit5) > expect.err(try(plotmo(mob5)), "The formula in the mob fit function is not supported by plotmo") The following formula in the mob fit function is not supported by plotmo: glm(y ~ x - 1, family = binomial, start = start, ...) Possible workaround: Replace the fit function with: logit5 <- function (y, x, start = NULL, weights = NULL, offset = NULL, ...) { glm(as.formula(paste("y ~ ", paste(colnames(x)[-1], collapse="+"))), data=x, family = binomial, start = start, ...) } Error : The formula in the mob fit function is not supported by plotmo (see above) This is because predict.mob often fails with newdata and type="response" e.g. example(mob); predict(pid_tree, newdata=PimaIndiansDiabetes[1:3,], type="response") Got expected error from try(plotmo(mob5)) > > logit6 <- function (y, x, start = NULL, weights = NULL, offset = NULL, ...) + { + glm(as.formula(paste("y ~ ", paste(colnames(x)[-1], collapse="+"))), + data=data.frame(x), family = binomial, start = start, ...) + } > mob6 <- mob(diabetes ~ glucose | mass + age, data = pima, fit = logit6) > plot(mob6) # tree is just a root (no branches) > plotmo(mob6) plotmo grid: glucose mass age 118.5 31.35 33 > > library(rpart.plot) Loading required package: rpart > rpart.Kyphosis <- rpart(Kyphosis ~ Age + Number + Start, data = kyphosis) > plotmo(rpart.Kyphosis, SHOWCALL=TRUE) plotmo grid: Age Number Start 87 4 13 > party.Kyphosis <- as.party(rpart.Kyphosis) > expect.err(try(plotmo(party.Kyphosis)), "cannot get the original model predictors") Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: object 'Kyphosis' not found (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(plotmo(party.Kyphosis)) > > library(evtree) > ## regression > set.seed(1090) > airq <- subset(airquality, !is.na(Ozone) & complete.cases(airquality)) > ev_air <- evtree(Ozone ~ ., data = airq) > # plot(ev_air) > plotmo(ev_air, SHOWCALL=TRUE) plotmo grid: Solar.R Wind Temp Month Day 207 9.7 79 7 16 > ## classification > ev_iris <- evtree(Species ~ .,data = iris) > # plot(ev_iris) > plotmo(ev_iris, SHOWCALL=TRUE) plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 5.8 3 4.35 1.3 > plotmo(ev_iris, type="prob", nresponse="versicolor", pmethod="apartdep", SHOWCALL=TRUE) calculating apartdep for Petal.Length calculating apartdep for Petal.Width calculating apartdep for Petal.Length:Petal.Width 01234567890 > plotres(ev_iris, type="prob", nresponse="setosa", SHOWCALL=TRUE) > > # cforest > > cforest1 <- cforest(dist ~ speed, data = cars) > plotmo(cforest1, trace=1, SHOWCALL=TRUE) variable importance: speed stats::predict(cforest.object, data.frame[3,1], type="response") stats::fitted(object=cforest.object) got model response from model.frame(dist ~ speed, data=object$data, na.action="na.fail") > plotres(cforest1, trace=1, SHOWCALL=TRUE) variable importance: speed stats::residuals(object=cforest.object, type="response") residuals() was unsuccessful, will use predict() instead stats::predict(cforest.object, data.frame[3,1], type="response") stats::fitted(object=cforest.object) got model response from model.frame(dist ~ speed, data=object$data, na.action="na.fail") training rsq 0.58 > > data("mammoexp", package = "TH.data") > cforest2 <- cforest(ME ~ PB + SYMPT, data = mammoexp, ntree = 5) > plotmo(cforest2, trace=1, SHOWCALL=TRUE, pmethod="apartdep") variable importance: SYMPT PB stats::predict(cforest.object, data.frame[3,2], type="response") stats::fitted(object=cforest.object) got model response from model.frame(ME ~ PB + SYMPT, data=object$data, na.action="na.fail") calculating apartdep for PB calculating apartdep for SYMPT calculating apartdep for PB:SYMPT 01234567890 > plotres(cforest2) > > source("test.epilog.R") plotmo/inst/slowtests/test.plotmo.bat0000755000176200001440000000154515124635472017611 0ustar liggesusers@rem test.plotmo.bat: this does a regression test of plotmo @rem Stephen Milborrow Apr 2007 Petaluma @echo test.plotmo.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.plotmo.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.plotmo.Rout: @echo. @tail test.plotmo.Rout @echo test.plotmo.R @exit /B 1 :good1 mks.diff test.plotmo.Rout test.plotmo.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.plotmo.save.ps @exit /B 1 :good2 @rem test.plotmo.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.plotmo.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.plotmo.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/test.unusual.vars.Rout.save0000644000176200001440000023145414567065443022073 0ustar liggesusers> # test.unusual.vars.R: test unusual variable names, and unusual formulas > # > # This file was initially created for plotmo 3.6.0 (Sep 2020) > # ALso tests the naken() func introduced in plotmo 3.6.0 and earth 5.2.0 (Sep 2020) > > source("test.prolog.R") > library(earth) Loading required package: Formula Loading required package: plotmo Loading required package: plotrix > data(ozone1) > data(etitanic) > options(warn=1) # print warnings as they occur > > check.naken <- function(s, expected, trace=0) + { + nude <- plotmo:::naken.formula.string(s, trace=trace) + printf("%-60.60s %-s\n", s, nude) + stopifnot(nude == expected) + } > printf("=== check naken.formula.string\n") === check naken.formula.string > > # edge cases > check.naken("", "") > check.naken(" ", "") > check.naken("y~", "y ~ ") y~ y ~ > check.naken("y~ ", "y ~ ") y~ y ~ > check.naken("y ~ ", "y ~ ") y ~ y ~ > check.naken("y ~ ", "y ~ ") y ~ y ~ > check.naken(" y ~ ", "y ~ ") y ~ y ~ > check.naken("[", "[", trace=2) naked formula is the same [ [ > check.naken("`", "`", trace=2) naked formula is the same ` ` > # standard formulas > check.naken("x", "x") x x > check.naken("x1", "x1") x1 x1 > check.naken("y ~ x1 : x2 + x3", "y ~ x1 + x2 + x3", trace=2) naked formula is y ~ x1 + x2 + x3 y ~ x1 : x2 + x3 y ~ x1 + x2 + x3 > check.naken("y ~ x1 + x2 - x3", "y ~ x1 + x2 + x3", trace=2) # TODO "-" is treated as a "+" naked formula is y ~ x1 + x2 + x3 y ~ x1 + x2 - x3 y ~ x1 + x2 + x3 > check.naken("y ~ .-x3", "y ~ . + x3") y ~ .-x3 y ~ . + x3 > check.naken("cbind(damage, 6-damage)~temp", "cbind(damage, 6-damage) ~ temp", trace=2) naked formula is the same cbind(damage, 6-damage)~temp cbind(damage, 6-damage) ~ temp > check.naken("depIndex~q_4 + q_2102+q_2104 +q_3105+ q_3106", "depIndex ~ q_4 + q_2102 + q_2104 + q_3105 + q_3106") depIndex~q_4 + q_2102+q_2104 +q_3105+ q_3106 depIndex ~ q_4 + q_2102 + q_2104 + q_3105 + q_3106 > check.naken("doy ~ (vh+wind+humidity)^2", "doy ~ vh + wind + humidity") doy ~ (vh+wind+humidity)^2 doy ~ vh + wind + humidity > check.naken("doy ~ s(wind) + s(humidity,wind) + s(vh)", "doy ~ wind + humidity + vh") doy ~ s(wind) + s(humidity,wind) + s(vh) doy ~ wind + humidity + vh > check.naken("log(doy) ~ I(vh*wind) + I(humidity*temp)+log(doy)", "log(doy) ~ vh + wind + humidity + temp + doy") log(doy) ~ I(vh*wind) + I(humidity*temp)+log(doy) log(doy) ~ vh + wind + humidity + temp + doy > check.naken("log(doy)~vh+wind+humidity+I(wind*humidity)+temp+log(ibh)", "log(doy) ~ vh + wind + humidity + temp + ibh", trace=2) naked formula is log(doy) ~ vh + wind + humidity + temp + ibh log(doy)~vh+wind+humidity+I(wind*humidity)+temp+log(ibh) log(doy) ~ vh + wind + humidity + temp + ibh > check.naken("O3 ~ s(humidity)+s(temp)+s(ibt)+s(temp,ibt)", "O3 ~ humidity + temp + ibt") O3 ~ s(humidity)+s(temp)+s(ibt)+s(temp,ibt) O3 ~ humidity + temp + ibt > check.naken("Ozone^(1/3) ~ lo(Solar.R) + lo(Wind, Temp)", "Ozone^(1/3) ~ Solar.R + Wind + Temp") Ozone^(1/3) ~ lo(Solar.R) + lo(Wind, Temp) Ozone^(1/3) ~ Solar.R + Wind + Temp > check.naken("Volume~(Girth*Height2)-Height", "Volume ~ Girth + Height2 + Height") Volume~(Girth*Height2)-Height Volume ~ Girth + Height2 + Height > check.naken("y ~ s(x) + s(x,z1)", "y ~ x + z1") y ~ s(x) + s(x,z1) y ~ x + z1 > check.naken("y~s(x0,x1,k=12)+s(x2)+s(x3,k=20,fx=20)", "y ~ x0 + x1 + x2 + x3") y~s(x0,x1,k=12)+s(x2)+s(x3,k=20,fx=20) y ~ x0 + x1 + x2 + x3 > check.naken("y~x[,1]+x[,2]", "y ~ x[,1] + x[,2]") y~x[,1]+x[,2] y ~ x[,1] + x[,2] > check.naken("y~x[,1]+x[,my.list$j]", "y ~ x[,1] + x[,my.list$j]") y~x[,1]+x[,my.list$j] y ~ x[,1] + x[,my.list$j] > check.naken("y~x[,i]+x[,2]", "y ~ x[,i] + x[,2]") y~x[,i]+x[,2] y ~ x[,i] + x[,2] > check.naken("Salary~Hitters[,1]", "Salary ~ Hitters[,1]", trace=2) naked formula is the same Salary~Hitters[,1] Salary ~ Hitters[,1] > check.naken("Salary~Hitters[,-1]", "Salary ~ Hitters[,-1]", trace=2) naked formula is the same Salary~Hitters[,-1] Salary ~ Hitters[,-1] > check.naken("Salary~Hitters[,c(1,2)]", "Salary ~ Hitters[,c(1,2)]", trace=2) naked formula is the same Salary~Hitters[,c(1,2)] Salary ~ Hitters[,c(1,2)] > check.naken("Salary~Hitters[,1:2]", "Salary ~ Hitters[,1:2]") Salary~Hitters[,1:2] Salary ~ Hitters[,1:2] > check.naken("Salary~Hitters[,c(1,2)]", "Salary ~ Hitters[,c(1,2)]", trace=2) naked formula is the same Salary~Hitters[,c(1,2)] Salary ~ Hitters[,c(1,2)] > # nested brackets > check.naken("y ~ x1[[2]] + x1[[3]]", "y ~ x1[[2]] + x1[[3]]") y ~ x1[[2]] + x1[[3]] y ~ x1[[2]] + x1[[3]] > check.naken("y[ , 1 ] ~ x1[[2]]", "y[ , 1 ] ~ x1[[2]]") y[ , 1 ] ~ x1[[2]] y[ , 1 ] ~ x1[[2]] > check.naken("y ~ x0[,nonesuch1 + x1[nsuch2^2 + 3 ]]", "y ~ x0[,nonesuch1 + x1[nsuch2^2 + 3 ]]") y ~ x0[,nonesuch1 + x1[nsuch2^2 + 3 ]] y ~ x0[,nonesuch1 + x1[nsuch2^2 + 3 ]] > check.naken("y ~ x0[1,x2[3]] + x4[[5]] + x6[ x7[, 8], x9[ ,x10[11] ], drop=x12[13]]", "y ~ x0[1,x2[3]] + x4[[5]] + x6[ x7[, 8], x9[ ,x10[11] ], drop=x12[13]]") y ~ x0[1,x2[3]] + x4[[5]] + x6[ x7[, 8], x9[ ,x10[11] ], dro y ~ x0[1,x2[3]] + x4[[5]] + x6[ x7[, 8], x9[ ,x10[11] ], drop=x12[13]] > # backquotes > check.naken("y ~ `a b c10` + `def`", "y ~ `a b c10` + `def`") y ~ `a b c10` + `def` y ~ `a b c10` + `def` > check.naken("`y` ~ `a b c10` + `def` + s(sqrt(`x 1`))", "`y` ~ `a b c10` + `def` + `x 1`") `y` ~ `a b c10` + `def` + s(sqrt(`x 1`)) `y` ~ `a b c10` + `def` + `x 1` > # without a response > check.naken("x1 + x[,1] + `x3`", "x1 + x[,1] + `x3`") x1 + x[,1] + `x3` x1 + x[,1] + `x3` > check.naken("Salary~Hitters[,c(1,2)]+sqrt(x)", "Salary ~ Hitters[,c(1,2)] + x") Salary~Hitters[,c(1,2)]+sqrt(x) Salary ~ Hitters[,c(1,2)] + x > check.naken("Salary~Hitters[,c(1,2)]+sqrt(x)+x99", "Salary ~ Hitters[,c(1,2)] + x + x99") Salary~Hitters[,c(1,2)]+sqrt(x)+x99 Salary ~ Hitters[,c(1,2)] + x + x99 > check.naken("Salary~x1+x2+`x6`+x3", "Salary ~ x1 + x2 + `x6` + x3") Salary~x1+x2+`x6`+x3 Salary ~ x1 + x2 + `x6` + x3 > check.naken("x[,c(1,2)] + x[,3]", "x[,c(1,2)] + x[,3]") x[,c(1,2)] + x[,3] x[,c(1,2)] + x[,3] > check.naken("x[,1] + x[,2] + x[,3] + x[,29] + x[,-14]", "x[,1] + x[,2] + x[,3] + x[,29] + x[,-14]") x[,1] + x[,2] + x[,3] + x[,29] + x[,-14] x[,1] + x[,2] + x[,3] + x[,29] + x[,-14] > check.naken("x[,c(1,2)] + x[,3] + x[,5:6] + x[,-1]", "x[,c(1,2)] + x[,3] + x[,5:6] + x[,-1]") x[,c(1,2)] + x[,3] + x[,5:6] + x[,-1] x[,c(1,2)] + x[,3] + x[,5:6] + x[,-1] > check.naken("log(y) ~ x9 + ns(x2,4) + s(x3,x4,df=4) + x5:sqrt(x6)", "log(y) ~ x9 + x2 + x3 + x4 + x5 + x6") log(y) ~ x9 + ns(x2,4) + s(x3,x4,df=4) + x5:sqrt(x6) log(y) ~ x9 + x2 + x3 + x4 + x5 + x6 > check.naken("log(y) ~ x9 + sqrt(x6) + ns(x2,4) + s(x3,x4,df=4) + x5", "log(y) ~ x9 + x6 + x2 + x3 + x4 + x5") log(y) ~ x9 + sqrt(x6) + ns(x2,4) + s(x3,x4,df=4) + x5 log(y) ~ x9 + x6 + x2 + x3 + x4 + x5 > check.naken("x[,1] + sqrt(x2) + 2.34e6 + 1", "x[,1] + x2 + 1") x[,1] + sqrt(x2) + 2.34e6 + 1 x[,1] + x2 + 1 > > printf("\n=== test problem in lm() formula with -nonesuch ===\n") === test problem in lm() formula with -nonesuch === > > # Using "-nonesuch" in a "." formula (where nonesuch is a non-existent variable name) > # causes the following error in stats::terms.formula (called via model.frame.default) > # Error in terms.formula(formula, data = data) : (converted from warning) > # 'varlist' has changed (from nvar=3) to new 4 after EncodeVars() -- should no longer happen! > options(warn=2) # treat warnings as errors > expect.err(try(lm(formula = Volume ~ . - nonesuch, data=trees)), + "'varlist' has changed (from nvar=3) to new 4 after EncodeVars() -- should no longer happen!") Error in terms.formula(formula, data = data) : (converted from warning) 'varlist' has changed (from nvar=3) to new 4 after EncodeVars() -- should no longer happen! Got expected error from try(lm(formula = Volume ~ . - nonesuch, data = trees)) > options(warn=1) # print warnings as they occur > > printf("\n=== test variables names with spaces in them ===\n") === test variables names with spaces in them === > spaced.trees <- trees > stopifnot(colnames(spaced.trees) == c("Girth", "Height", "Volume")) # sanity check > colnames(spaced.trees) <- c("Girth extra", "Height 999", "Volume") # put spaces in the names > > lm.spaced.trees <- lm(Volume~., data=spaced.trees) > options(warn=2) > expect.err(try(plotmo(lm.spaced.trees)), + "Cannot determine which variables to plot in degree2 plots") Error : (converted from warning) Cannot determine which variables to plot in degree2 plots (use all2=TRUE?) Confused by variable name "`Girth extra`" Got expected error from try(plotmo(lm.spaced.trees)) > options(warn=1) > plotmo(lm.spaced.trees) # warning, but still plots (no degree2 plots) Warning: Cannot determine which variables to plot in degree2 plots (use all2=TRUE?) Confused by variable name "`Girth extra`" plotmo grid: Girth extra Height 999 12.9 76 > plotmo(lm.spaced.trees, all2=TRUE) # no warning plotmo grid: Girth extra Height 999 12.9 76 > > earth.spaced.trees <- earth(Volume~. , data=spaced.trees, degree=2) > plotmo(earth.spaced.trees) plotmo grid: Girth extra Height 999 12.9 76 > cat("\nevimp(earth.spaced.trees)\n") evimp(earth.spaced.trees) > print(evimp(earth.spaced.trees)) nsubsets gcv rss `Girth extra` 3 100.0 100.0 `Height 999` 1 10.9 11.9 > > printf("\n=== test non standard variable names and use of earth's bx matrix ===\n") === test non standard variable names and use of earth's bx matrix === > emod <- earth(survived~., data=etitanic, degree=2) > plotmo(emod) plotmo grid: pclass sex age sibsp parch 3rd male 28 0 0 > cat("\nevimp(emod)\n") evimp(emod) > print(evimp(emod)) nsubsets gcv rss sexmale 7 100.0 100.0 pclass3rd 6 56.4 58.4 pclass2nd 5 46.3 48.4 age 4 38.0 40.2 sibsp 3 26.6 29.2 > bx <- emod$bx > bx.df <- as.data.frame(bx[,-1]) # -1 to drop intercept > bx.df$survived <- etitanic$survived > # following gsub make it a bit easier to see what's going on > # because the next call to earth also creates hinge functions > # (so we end up with nested hinge functions) > colnames(bx.df) <- gsub("h(", "H(", colnames(bx.df), fixed=TRUE) > lm.bx <- lm(survived ~ ., data=bx.df) > set.seed(2020) > earth.bx <- earth(survived ~ ., data=bx.df, degree=2) > printf("\nsummary(earth.bx):\n") summary(earth.bx): > print(summary(earth.bx)) Call: earth(formula=survived~., data=bx.df, degree=2) coefficients (Intercept) 2.05782826 sexmale -0.60749103 pclass3rd -1.27902837 pclass2nd * sexmale -0.23995151 pclass3rd * sexmale 0.25312923 h(4-sexmale * H(16-age)) -0.20886491 h(2-pclass3rd * H(4-sibsp)) -0.14508261 pclass3rd * h(5-sexmale * H(16-age)) 0.09290713 h(pclass3rd * H(4-sibsp)-2) * h(1-H(age-32)) 0.07452385 Selected 9 of 17 terms, and 7 of 7 predictors Termination condition: Reached nk 21 Importance: sexmale, pclass3rd, `sexmale*H(16-age)`, `pclass2nd*sexmale`, ... Number of terms at each degree of interaction: 1 6 2 GCV 0.1385367 RSS 139.1493 GRSq 0.4276272 RSq 0.4493265 > printf("\nevimp(earth.bx):\n") evimp(earth.bx): > print(evimp(earth.bx)) nsubsets gcv rss sexmale 8 100.0 100.0 pclass3rd 7 57.5 59.7 `sexmale*H(16-age)` 5 39.5 42.0 `pclass2nd*sexmale` 5 39.5 42.0 `pclass3rd*sexmale` 4 35.7 38.0 `pclass3rd*H(4-sibsp)` 4 30.5 33.3 `H(age-32)` 3 24.9 27.6 > plot(earth.bx, info=TRUE) > plotmo(lm.bx) # Warning: Cannot determine which variables to plot in degree2 plots Warning: Cannot determine which variables to plot in degree2 plots (use all2=TRUE?) Confused by variable name "`sexmale*H(16-age)`" plotmo grid: sexmale pclass3rd sexmale*H(16-age) pclass2nd*sexmale 1 0 0 0 pclass3rd*H(4-sibsp) pclass3rd*sexmale H(age-32) 0 0 0 > plotmo(lm.bx, all2=TRUE, SHOWCALL=TRUE) plotmo grid: sexmale pclass3rd sexmale*H(16-age) pclass2nd*sexmale 1 0 0 0 pclass3rd*H(4-sibsp) pclass3rd*sexmale H(age-32) 0 0 0 > plotmo(earth.bx, pmethod="partdep", trace=2) plotmo trace 2: plotmo(object=earth.bx, pmethod="partdep", trace=2) --get.model.env for object with class earth object call is earth(formula=survived~., data=bx.df, degree=2) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.bx' --plotmo_x for earth object get.object.x: object$x is NULL (and it has no colnames) object call is earth(formula=survived~., data=bx.df, degree=2) get.x.from.model.frame: formula(object) is survived ~ sexmale + pclass3rd + `sexmale*H(16-age)` + `p... naked formula is the same formula is valid, now looking for data for the model.frame object$model is NULL (and it has no colnames) object$data is NULL (and it has no colnames) argument 2 of the call is 'data' eval(call$data, R_GlobalEnv) call$data is usable and has column names sexmale pclass3rd sexmale*H(16-age) pclass2nd*sexmale pclass3rd*H(4-sibsp) pclass3rd*sexmale H(ag... na.action(object) is "na.fail" stats::model.frame(survived ~ sexmale + pclass3rd + `sex..., data=call$data, na.action="na.fail") x=model.frame[,-1] is usable and has column names sexmale pclass3rd sexmale*H(16-age) pclass2nd*sexmale pclass3rd*H(4-sibsp) pclass3rd*sexmale H(ag... setting check.naked=FALSE because backtick in formula plotmo_x returned[1046,7]: sexmale pclass3rd sexmale*H(16-age) pclass2nd*sexmale pclass3rd*H(4-sibsp) 1 0 0 0.0000 0 0 2 1 0 15.0833 0 0 3 0 0 0.0000 0 0 ... 1 0 0.0000 0 0 1046 1 1 0.0000 0 4 pclass3rd*sexmale H(age-32) 1 0 0 2 0 0 3 0 0 ... 0 0 1046 1 0 ----Metadata: plotmo_predict with nresponse=NULL and newdata=NULL calling predict.earth with NULL newdata stats::predict(earth.object, NULL, type="response") predict returned[1046,1]: survived 1 0.9322034 2 1.1601720 3 0.9322034 ... 0.3247124 1046 0.2025618 predict after processing with nresponse=NULL is [1046,1]: survived 1 0.9322034 2 1.1601720 3 0.9322034 ... 0.3247124 1046 0.2025618 ----Metadata: plotmo_fitted with nresponse=NULL stats::fitted(object=earth.object) fitted(object) returned[1046,1]: survived 1 0.9322034 2 1.1601720 3 0.9322034 ... 0.3247124 1046 0.2025618 fitted(object) after processing with nresponse=NULL is [1046,1]: survived 1 0.9322034 2 1.1601720 3 0.9322034 ... 0.3247124 1046 0.2025618 ----Metadata: plotmo_y with nresponse=NULL --plotmo_y with nresponse=NULL for earth object get.object.y: object$y is NULL (and it has no colnames) object call is earth(formula=survived~., data=bx.df, degree=2) get.y.from.model.frame: formula(object) is survived ~ sexmale + pclass3rd + `sexmale*H(16-age)` + `p... formula is valid, now looking for data for the model.frame object$model is NULL (and it has no colnames) object$data is NULL (and it has no colnames) argument 2 of the call is 'data' eval(call$data, R_GlobalEnv) call$data is usable and has column names sexmale pclass3rd sexmale*H(16-age) pclass2nd*sexmale pclass3rd*H(4-sibsp) pclass3rd*sexmale H(ag... na.action(object) is "na.fail" stats::model.frame(survived ~ sexmale + pclass3rd + `sex..., data=call$data, na.action="na.fail") y=model.frame[,1] is usable and has column name survived plotmo_y returned[1046,1]: survived 1 1 2 1 3 0 ... 0 1046 0 plotmo_y after processing with nresponse=NULL is [1046,1]: survived 1 1 2 1 3 0 ... 0 1046 0 converted nresponse=NA to nresponse=1 nresponse=1 (was NA) ncol(fitted) 1 ncol(predict) 1 ncol(y) 1 ----Metadata: plotmo_y with nresponse=1 --plotmo_y with nresponse=1 for earth object get.object.y: object$y is NULL (and it has no colnames) object call is earth(formula=survived~., data=bx.df, degree=2) get.y.from.model.frame: formula(object) is survived ~ sexmale + pclass3rd + `sexmale*H(16-age)` + `p... formula is valid, now looking for data for the model.frame object$model is NULL (and it has no colnames) object$data is NULL (and it has no colnames) argument 2 of the call is 'data' eval(call$data, R_GlobalEnv) call$data is usable and has column names sexmale pclass3rd sexmale*H(16-age) pclass2nd*sexmale pclass3rd*H(4-sibsp) pclass3rd*sexmale H(ag... na.action(object) is "na.fail" stats::model.frame(survived ~ sexmale + pclass3rd + `sex..., data=call$data, na.action="na.fail") y=model.frame[,1] is usable and has column name survived got model response from model.frame(survived ~ sexmale + pclass3rd + `sex..., data=call$data, na.action="na.fail") plotmo_y returned[1046,1]: survived 1 1 2 1 3 0 ... 0 1046 0 plotmo_y after processing with nresponse=1 is [1046,1]: survived 1 1 2 1 3 0 ... 0 1046 0 got response name "survived" from yhat got resp.levs from object$levels response levels: 0 1 ----Metadata: done number of x values: sexmale 2 pclass3rd 2 sexmale*H(16-age) 24 pclass2nd*sexm... ----plotmo_singles for earth object singles: 1 sexmale, 2 pclass3rd, 3 sexmale*H(16-age), 4 pclass2nd*sexmale, 5 pclass3rd*H(4-sibsp), 6 pclass3rd*sexmale ----plotmo_pairs for earth object pairs: [,1] [,2] [1,] "2 pclass3rd" "3 sexmale*H(16-age)" [2,] "5 pclass3rd*H(4-sibsp)" "7 H(age-32)" graphics::par(mfrow=c(3,3), mgp=c(1.5,0.4,0), tcl=-0.3, font.main=2, mar=c(3,2,1.2,0.8), oma=c(0,0,3,0), cex.main=1.2, cex.lab=1, cex.axis=1, cex=0.66) ----Figuring out ylim --get.ylim.by.dummy.plots --plot.degree1(draw.plot=FALSE) degree1 plot1 (pmethod "partdep") variable sexmale calculating partdep for sexmale newdata[2092,7]: sexmale pclass3rd sexmale*H(16-age) pclass2nd*sexmale 1 0 0 0.0000 0 2 0 0 15.0833 0 3 0 0 0.0000 0 ... 0 0 0.0000 0 1046.1 1 1 0.0000 0 pclass3rd*H(4-sibsp) pclass3rd*sexmale H(age-32) 1 0 0 0 2 0 0 0 3 0 0 0 ... 0 0 0 1046.1 4 1 0 stats::predict(earth.object, data.frame[2092,7], type="response") predict returned[2092,1]: survived 1 0.9322034 2 1.7676630 3 0.9322034 ... 0.9322034 2092 0.2025618 predict after processing with nresponse=1 is [2092,1]: survived 1 0.9322034 2 1.7676630 3 0.9322034 ... 0.9322034 2092 0.2025618 Reducing trace level for subsequent degree1 plots degree1 plot2 (pmethod "partdep") variable pclass3rd calculating partdep for pclass3rd degree1 plot3 (pmethod "partdep") variable sexmale*H(16-age) calculating partdep for sexmale*H(16-age) degree1 plot4 (pmethod "partdep") variable pclass2nd*sexmale calculating partdep for pclass2nd*sexmale degree1 plot5 (pmethod "partdep") variable pclass3rd*H(4-sibsp) calculating partdep for pclass3rd*H(4-sibsp) degree1 plot6 (pmethod "partdep") variable pclass3rd*sexmale calculating partdep for pclass3rd*sexmale --plot.degree2(draw.plot=FALSE) degree2 plot1 (pmethod "partdep") variables pclass3rd:sexmale*H(16-age) calculating partdep for pclass3rd:sexmale*H(16-age) 1234newdata[20920,7]: sexmale pclass3rd sexmale*H(16-age) pclass2nd*sexmale 1 0 0 0.0000 0 2 1 0 0.0000 0 3 0 0 0.0000 0 ... 1 0 0.0000 0 1046.19 1 0 15.6667 0 pclass3rd*H(4-sibsp) pclass3rd*sexmale H(age-32) 1 0 0 0 2 0 0 0 3 0 0 0 ... 0 0 0 1046.19 4 1 0 stats::predict(earth.object, data.frame[20920,7], type="response") predict returned[20920,1]: survived 1 0.9322034 2 0.3247124 3 0.9322034 ... 0.3247124 20920 1.8525142 predict after processing with nresponse=1 is [20920,1]: survived 1 0.9322034 2 0.3247124 3 0.9322034 ... 0.3247124 20920 1.8525142 56790 Reducing trace level for subsequent degree2 plots degree2 plot2 (pmethod "partdep") variables pclass3rd*H(4-sibsp):H(age-32) calculating partdep for pclass3rd*H(4-sibsp):H(age-32) 1newdata[20920,7]: sexmale pclass3rd sexmale*H(16-age) pclass2nd*sexmale 1 0 0 0.0000 0 2 1 0 15.0833 0 3 0 0 0.0000 0 ... 1 0 0.0000 0 1046.19 1 1 0.0000 0 pclass3rd*H(4-sibsp) pclass3rd*sexmale H(age-32) 1 0 0 0 2 0 0 0 3 0 0 0 ... 0 0 0 1046.19 0 1 48 stats::predict(earth.object, data.frame[20920,7], type="response") predict returned[20920,1]: survived 1 0.9322034 2 1.1601720 3 0.9322034 ... 0.3247124 20920 -0.2366511 predict after processing with nresponse=1 is [20920,1]: survived 1 0.9322034 2 1.1601720 3 0.9322034 ... 0.3247124 20920 -0.2366511 234567890 --done get.ylim.by.dummy.plots ylim c(-0.04329, 1.607) clip TRUE --plot.degree1(draw.plot=TRUE) graphics::plot.default(x=c(0,0.5,0.5,1), y=c(0.7904,0.7904...), type="n", main="1 sexmale", xlab="", ylab="", xaxt="s", yaxt="s", xlim=c(-0.1,1.1), ylim=c(-0.0433,1.607)) --plot.degree2(draw.plot=TRUE) persp(pclass3rd:sexmale*H(16-age)) theta 55 persp(pclass3rd*H(4-sibsp):H(age-32)) theta 235 > > printf("\n=== put spaces into the column names of bx (for both response and predictors) ===\n") === put spaces into the column names of bx (for both response and predictors) === > spaced.bx <- bx.df > colnames(spaced.bx) <- gsub("-", " - ", colnames(spaced.bx), fixed=TRUE) > colnames(spaced.bx)[colnames(spaced.bx) == "survived"] <- "Survived = YES" > printf("\nhead(spaced.bx):\n") head(spaced.bx): > print(head(spaced.bx)) sexmale pclass3rd sexmale*H(16 - age) pclass2nd*sexmale 1 0 0 0.0000 0 2 1 0 15.0833 0 3 0 0 0.0000 0 4 1 0 0.0000 0 5 0 0 0.0000 0 6 1 0 0.0000 0 pclass3rd*H(4 - sibsp) pclass3rd*sexmale H(age - 32) Survived = YES 1 0 0 0 1 2 0 0 0 1 3 0 0 0 0 4 0 0 0 0 5 0 0 0 0 6 0 0 16 1 > > lm.spaced.bx <- lm(`Survived = YES` ~ ., data=spaced.bx) > > set.seed(2020) > earth.spaced.bx <- earth(`Survived = YES` ~ ., data=spaced.bx, degree=2, trace=.5, + nfold=4, ncross=3, varmod.method="lm", pmethod="cv") Preliminary model with pmethod="backward": GRSq 0.428 RSq 0.449 nterms 9 CV fold 1.1 CVRSq 0.402 n.oof 779 26% n.infold.nz 320 41% n.oof.nz 107 40% CV fold 1.2 CVRSq 0.424 n.oof 785 25% n.infold.nz 320 41% n.oof.nz 107 41% CV fold 1.3 CVRSq 0.418 n.oof 786 25% n.infold.nz 320 41% n.oof.nz 107 41% CV fold 1.4 CVRSq 0.433 n.oof 788 25% n.infold.nz 321 41% n.oof.nz 106 41% CV fold 2.1 CVRSq 0.470 n.oof 784 25% n.infold.nz 320 41% n.oof.nz 107 41% CV fold 2.2 CVRSq 0.417 n.oof 775 26% n.infold.nz 320 41% n.oof.nz 107 39% CV fold 2.3 CVRSq 0.412 n.oof 787 25% n.infold.nz 320 41% n.oof.nz 107 41% CV fold 2.4 CVRSq 0.421 n.oof 792 24% n.infold.nz 321 41% n.oof.nz 106 42% CV fold 3.1 CVRSq 0.385 n.oof 777 26% n.infold.nz 320 41% n.oof.nz 107 40% CV fold 3.2 CVRSq 0.429 n.oof 792 24% n.infold.nz 320 40% n.oof.nz 107 42% CV fold 3.3 CVRSq 0.461 n.oof 780 25% n.infold.nz 320 41% n.oof.nz 107 40% CV fold 3.4 CVRSq 0.377 n.oof 789 25% n.infold.nz 321 41% n.oof.nz 106 41% CV all CVRSq 0.421 n.infold.nz 427 41% Final model with pmethod="cv": GRSq 0.425 RSq 0.452 nterms selected by cv 11 varmod method="lm" rmethod="hc12" lambda=1 exponent=1 conv=1 clamp=0.1 minspan=-3: iter weight.ratio coefchange% (Intercept) `Survived = YES` 1 2.2 0.00 0.31 -0.074 2 3.7 36.00 0.33 -0.122 3 5.3 14.02 0.34 -0.151 4 6.5 6.60 0.35 -0.168 5 7.3 3.21 0.35 -0.176 6 7.8 1.57 0.36 -0.181 7 8.0 0.76 0.36 -0.183 > printf("\nsummary(earth.spaced.bx):\n") summary(earth.spaced.bx): > print(summary(earth.spaced.bx)) Call: earth(formula=`Survived=YES`~., data=spaced.bx, pmethod="cv", trace=0.5, degree=2, nfold=4, ncross=3, varmod.method="lm") coefficients (Intercept) 2.01771627 sexmale -0.56066394 pclass3rd -1.25089642 pclass2nd * sexmale -0.26729133 pclass3rd * sexmale 0.20879448 h(4-sexmale * H(16 - age)) -0.20186359 h(2-pclass3rd * H(4 - sibsp)) -0.13902926 sexmale * h(H(age - 32)-6) -0.00607253 pclass3rd * h(5-sexmale * H(16 - age)) 0.08709723 h(pclass3rd * H(4 - sibsp)-2) * h(H(age - 32)-1) 0.00242931 h(pclass3rd * H(4 - sibsp)-2) * h(1-H(age - 32)) 0.08048994 Selected 11 of 17 terms, and 7 of 7 predictors (pmethod="cv") Termination condition: Reached nk 21 Importance: sexmale, pclass3rd, `sexmale*H(16 - age)`, `pclass2nd*sexmale`, ... Number of terms at each degree of interaction: 1 6 4 GRSq 0.4251614 RSq 0.4523366 mean.oof.RSq 0.4245627 (sd 0.0258) pmethod="backward" would have selected: 9 terms 7 preds, GRSq 0.4276272 RSq 0.4493265 mean.oof.RSq 0.4224044 varmod: method "lm" min.sd 0.0354 iter.rsq 0.070 stddev of predictions: coefficients iter.stderr iter.stderr% (Intercept) 0.4476988 0.0176523 4 Survived = YES -0.2293581 0.0258681 11 mean smallest largest ratio 95% prediction interval 1.387928 0.6949522 1.966296 2.829398 68% 80% 90% 95% response values in prediction interval 69 75< 84< 93< > printf("\nevimp(earth.spaced.bx):\n") evimp(earth.spaced.bx): > print(evimp(earth.spaced.bx)) nsubsets gcv rss sexmale 10 100.0 100.0 pclass3rd 9 57.2 60.0 `sexmale*H(16 - age)` 7 38.8 42.6 `pclass2nd*sexmale` 7 38.8 42.6 `pclass3rd*sexmale` 6 35.0 38.7 `pclass3rd*H(4 - sibsp)` 6 29.7 34.2 `H(age - 32)` 5 23.8 28.7 > > set.seed(2020) > earth.glm.spaced.bx <- earth(`Survived = YES` ~ ., data=spaced.bx, degree=2, trace=.5, + glm=list(family="binomial"), + nfold=4, ncross=3, varmod.method="lm", pmethod="cv") Preliminary model with pmethod="backward": GRSq 0.428 RSq 0.449 nterms 9 CV fold 1.1 CVRSq 0.402 n.oof 779 26% n.infold.nz 320 41% n.oof.nz 107 40% CV fold 1.2 CVRSq 0.424 n.oof 785 25% n.infold.nz 320 41% n.oof.nz 107 41% CV fold 1.3 CVRSq 0.418 n.oof 786 25% n.infold.nz 320 41% n.oof.nz 107 41% CV fold 1.4 CVRSq 0.433 n.oof 788 25% n.infold.nz 321 41% n.oof.nz 106 41% CV fold 2.1 CVRSq 0.470 n.oof 784 25% n.infold.nz 320 41% n.oof.nz 107 41% CV fold 2.2 CVRSq 0.417 n.oof 775 26% n.infold.nz 320 41% n.oof.nz 107 39% CV fold 2.3 CVRSq 0.412 n.oof 787 25% n.infold.nz 320 41% n.oof.nz 107 41% CV fold 2.4 CVRSq 0.421 n.oof 792 24% n.infold.nz 321 41% n.oof.nz 106 42% CV fold 3.1 CVRSq 0.385 n.oof 777 26% n.infold.nz 320 41% n.oof.nz 107 40% CV fold 3.2 CVRSq 0.429 n.oof 792 24% n.infold.nz 320 40% n.oof.nz 107 42% CV fold 3.3 CVRSq 0.461 n.oof 780 25% n.infold.nz 320 41% n.oof.nz 107 40% CV fold 3.4 CVRSq 0.377 n.oof 789 25% n.infold.nz 321 41% n.oof.nz 106 41% CV all CVRSq 0.421 n.infold.nz 427 41% Final model with pmethod="cv": GRSq 0.425 RSq 0.452 nterms selected by cv 11 varmod method="lm" rmethod="hc12" lambda=1 exponent=1 conv=1 clamp=0.1 minspan=-3: iter weight.ratio coefchange% (Intercept) `Survived = YES` 1 2.2 0.00 0.31 -0.074 2 3.7 36.00 0.33 -0.122 3 5.3 14.02 0.34 -0.151 4 6.5 6.60 0.35 -0.168 5 7.3 3.21 0.35 -0.176 6 7.8 1.57 0.36 -0.181 7 8.0 0.76 0.36 -0.183 > printf("\nsummary(earth.glm.spaced.bx):\n") summary(earth.glm.spaced.bx): > print(summary(earth.glm.spaced.bx)) Call: earth(formula=`Survived=YES`~., data=spaced.bx, pmethod="cv", trace=0.5, glm=list(family="binomial"), degree=2, nfold=4, ncross=3, varmod.method="lm") GLM coefficients `Survived = YES` (Intercept) 9.8189944 sexmale -3.0197582 pclass3rd -8.5391964 pclass2nd * sexmale -1.9328478 pclass3rd * sexmale 1.2008915 h(4-sexmale * H(16 - age)) -1.4278190 h(2-pclass3rd * H(4 - sibsp)) -0.7433398 sexmale * h(H(age - 32)-6) -0.0441700 pclass3rd * h(5-sexmale * H(16 - age)) 0.7564144 h(pclass3rd * H(4 - sibsp)-2) * h(H(age - 32)-1) 0.0091406 h(pclass3rd * H(4 - sibsp)-2) * h(1-H(age - 32)) 0.5068265 GLM (family binomial, link logit): nulldev df dev df devratio AIC iters converged 1414.62 1045 873.999 1035 0.382 896 6 1 Earth selected 11 of 17 terms, and 7 of 7 predictors (pmethod="cv") Termination condition: Reached nk 21 Importance: sexmale, pclass3rd, `sexmale*H(16 - age)`, `pclass2nd*sexmale`, ... Number of terms at each degree of interaction: 1 6 4 Earth GRSq 0.4251614 RSq 0.4523366 mean.oof.RSq 0.4245627 (sd 0.0258) pmethod="backward" would have selected: 9 terms 7 preds, GRSq 0.4276272 RSq 0.4493265 mean.oof.RSq 0.4224044 varmod: method "lm" min.sd 0.0354 iter.rsq 0.070 stddev of predictions: coefficients iter.stderr iter.stderr% (Intercept) 0.4476988 0.0176523 4 Survived = YES -0.2293581 0.0258681 11 mean smallest largest ratio 95% prediction interval 1.387928 0.6949522 1.966296 2.829398 68% 80% 90% 95% response values in prediction interval 69 75< 84< 93< > printf("\nevimp(earth.glm.spaced.bx):\n") evimp(earth.glm.spaced.bx): > print(evimp(earth.glm.spaced.bx)) nsubsets gcv rss sexmale 10 100.0 100.0 pclass3rd 9 57.2 60.0 `sexmale*H(16 - age)` 7 38.8 42.6 `pclass2nd*sexmale` 7 38.8 42.6 `pclass3rd*sexmale` 6 35.0 38.7 `pclass3rd*H(4 - sibsp)` 6 29.7 34.2 `H(age - 32)` 5 23.8 28.7 > > options(warn=2) > expect.err(try(plotmo(lm.spaced.bx)), + "Cannot determine which variables to plot in degree2 plots") Error : (converted from warning) Cannot determine which variables to plot in degree2 plots (use all2=TRUE?) Confused by variable name "`sexmale*H(16 - age)`" Got expected error from try(plotmo(lm.spaced.bx)) > options(warn=1) > > plotmo(lm.spaced.bx, do.par=2, SHOWCALL=TRUE) Warning: Cannot determine which variables to plot in degree2 plots (use all2=TRUE?) Confused by variable name "`sexmale*H(16 - age)`" plotmo grid: sexmale pclass3rd sexmale*H(16 - age) pclass2nd*sexmale 1 0 0 0 pclass3rd*H(4 - sibsp) pclass3rd*sexmale H(age - 32) 0 0 0 > plotres(lm.spaced.bx, do.par=0, which=c(1, 3)) > par(org.par) > > plotmo(earth.spaced.bx, degree1="sexmale", do.par=2, level=.8, SHOWCALL=TRUE) plotmo grid: sexmale pclass3rd sexmale*H(16 - age) pclass2nd*sexmale 1 0 0 0 pclass3rd*H(4 - sibsp) pclass3rd*sexmale H(age - 32) 0 0 0 > plot(earth.spaced.bx, do.par=0, which=c(1, 3), info=TRUE, level=.8, type="earth") > par(org.par) > > plot(earth.spaced.bx, versus="b:", info=TRUE, level=.8, type="earth", SHOWCALL=TRUE) > > # following should be the same as previous page (since type="earth") > plotmo(earth.glm.spaced.bx, degree1="sexmale", do.par=2, level=.8, type="earth", SHOWCALL=TRUE) plotmo grid: sexmale pclass3rd sexmale*H(16 - age) pclass2nd*sexmale 1 0 0 0 pclass3rd*H(4 - sibsp) pclass3rd*sexmale H(age - 32) 0 0 0 > plot(earth.glm.spaced.bx, do.par=0, which=1, info=TRUE, level=.8, type="earth") > # $$ TODO Following shouldn't cause Warning: Internal inconsistency: p$fit - fitted != 0 > # No warning if don't use glm=list(family="binomial") in call to earth > options(warn=2) > expect.err(try(plot(earth.glm.spaced.bx, do.par=0, which=3, info=TRUE, level=.8, type="earth")), + "Internal inconsistency: p$fit != fitted") Error : (converted from warning) Internal inconsistency: p$fit != fitted Workaround: no 'glm' arg in call to earth, or no 'level' arg n call to plotres Got expected error from try(plot(earth.glm.spaced.bx, do.par = 0, which = 3, info = TRUE, level = 0.8, type = "earth")) > options(warn=1) > plot(earth.glm.spaced.bx, do.par=0, which=3, info=TRUE, level=.8, type="earth") Warning: Internal inconsistency: p$fit != fitted Workaround: no 'glm' arg in call to earth, or no 'level' arg n call to plotres > par(org.par) > > expect.err(try(plotmo(earth.glm.spaced.bx, level=.8)), + "predict.earth: with earth-glm models, use type=\"earth\" when using the interval argument") plotmo grid: sexmale pclass3rd sexmale*H(16 - age) pclass2nd*sexmale 1 0 0 0 pclass3rd*H(4 - sibsp) pclass3rd*sexmale H(age - 32) 0 0 0 Error : predict.earth: with earth-glm models, use type="earth" when using the interval argument Got expected error from try(plotmo(earth.glm.spaced.bx, level = 0.8)) > > plotmo(earth.glm.spaced.bx, degree1="sexmale", do.par=2, SHOWCALL=TRUE) plotmo grid: sexmale pclass3rd sexmale*H(16 - age) pclass2nd*sexmale 1 0 0 0 pclass3rd*H(4 - sibsp) pclass3rd*sexmale H(age - 32) 0 0 0 > plot(earth.glm.spaced.bx, do.par=0, which=c(1, 3), info=TRUE) > par(org.par) > > printf("\n=== test combinations of variables in formula ===\n") === test combinations of variables in formula === > > vdata <- data.frame( + resp = 1:13, + bool = c(F, F, F, F, F, T, T, T, T, T, T, T, T), + ord = ordered(c("ORD1", "ORD1", "ORD1", + "ORD1", "ORD1", "ORD1", + "ORD3", "ORD3", "ORD3", + "ORD2", "ORD2", "ORD2", "ORD2"), + levels=c("ORD1", "ORD3", "ORD2")), + fac = as.factor(c("FAC1", "FAC1", "FAC1", + "FAC2", "FAC2", "FAC2", + "FAC3", "FAC3", "FAC3", + "FAC1", "FAC2", "FAC3", "FAC3")), + str = c("STR1", "STR1", "STR1", # WILL BE TREATED LIKE A FACTOR + "STR2", "STR2", "STR2", + "STR3", "STR3", "STR3", + "STR3", "STR3", "STR3", "STR3"), + num = c(1, 3, 2, 3, 4, 5, 6, 4, 5, 6.5, 3, 6, 5), # 7 unique values (but one is non integral) + sqrt_num = sqrt(c(1, 3, 2, 3, 4, 5, 6, 4, 5, 6.5, 3, 6, 5)), + int = c(1L, 1L, 3L, 3L, 4L, 4L, 3L, 5L, 3L, 6L, 7L, 8L, 10L), # 8 unique values + date = as.Date( + c("2018-08-01", "2018-08-02", "2018-08-03", + "2018-08-04", "2018-08-05", "2018-08-06", + "2018-08-07", "2018-08-08", "2018-08-08", + "2018-08-08", "2018-08-10", "2018-08-11", "2018-08-11")), + date_num = as.numeric(as.Date( + c("2018-08-01", "2018-08-02", "2018-08-03", + "2018-08-04", "2018-08-05", "2018-08-06", + "2018-08-07", "2018-08-08", "2018-08-08", + "2018-08-08", "2018-08-10", "2018-08-11", "2018-08-11")))) > > vdata$off <- (1:nrow(vdata)) / nrow(vdata) > > resp2 <- 13:1 > > vweights <- rep(1, length.out=nrow(vdata)) > vweights[1] <- 2 > > set.seed(2020) > lognum.bool.ord.off <- earth(resp ~ log(num) + bool + ord + offset(off), degree=2, weights=vweights, + data=vdata, pmethod="none", varmod.method="lm", + nfold=2, ncross=3, + trace=1) x[13,4] with colnames log(num) boolTRUE ord.L ord.Q y[13,1] with colname resp, and values 0.9231, 1.846, 2.769, 3.692, ... weights[13]: 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 Forward pass term 1, 2, 4, 6, 8 GRSq -Inf at 7 terms, 5 terms used After forward pass GRSq -in RSq 0.966 Prune none penalty 3 nprune null: selected 5 of 5 terms, and 3 of 4 preds After pruning pass GRSq -0.732 RSq 0.952 CV fold 1.1 CVRSq -0.476 n.oof 6 54% n.infold.nz 6 100% n.oof.nz 7 100% CV fold 1.2 CVRSq 0.823 n.oof 7 46% n.infold.nz 7 100% n.oof.nz 6 100% CV fold 2.1 CVRSq -0.622 n.oof 6 54% n.infold.nz 6 100% n.oof.nz 7 100% CV fold 2.2 CVRSq 0.816 n.oof 7 46% n.infold.nz 7 100% n.oof.nz 6 100% CV fold 3.1 CVRSq 0.559 n.oof 6 54% n.infold.nz 6 100% n.oof.nz 7 100% CV fold 3.2 CVRSq 0.698 n.oof 7 46% n.infold.nz 7 100% n.oof.nz 6 100% CV all CVRSq 0.300 n.infold.nz 13 100% varmod method="lm" rmethod="hc12" lambda=1 exponent=1 conv=1 clamp=0.1 minspan=-3: iter weight.ratio coefchange% (Intercept) resp 1 1.6 0.00 1.76 0.045 2 2.2 39.64 1.55 0.076 3 2.9 19.19 1.40 0.098 4 3.5 12.21 1.29 0.115 5 4.1 8.66 1.21 0.127 6 4.6 6.50 1.15 0.137 7 5.0 5.05 1.10 0.145 8 5.5 4.02 1.06 0.152 9 5.8 3.25 1.03 0.157 10 6.1 2.66 1.00 0.162 11 6.4 2.19 0.98 0.165 12 6.7 1.82 0.97 0.168 13 6.9 1.52 0.95 0.171 14 7.1 1.28 0.94 0.173 15 7.3 1.08 0.93 0.175 16 7.4 0.91 0.92 0.176 > > printf("summary(lognum.bool.ord.off)\n") summary(lognum.bool.ord.off) > print(summary(lognum.bool.ord.off)) Call: earth(formula=resp~log(num)+bool+ord+offset(off), data=vdata, weights=vweights, pmethod="none", trace=1, degree=2, nfold=2, ncross=3, varmod.method="lm") coefficients (Intercept) 6.273213 boolTRUE 1.111403 h(-7.85046e-17-ord.L) -7.600147 h(ord.L- -7.85046e-17) 4.568998 log(num) * h(-7.85046e-17-ord.L) 3.100021 Selected 5 of 5 terms, and 3 of 4 predictors (pmethod="none") Termination condition: GRSq -Inf at 5 terms Importance: ord.L, log(num), boolTRUE, ord.Q-unused Offset: off with values 0.07692308, 0.1538462, 0.2307692, 0.3076923, 0.3... Weights: 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 Number of terms at each degree of interaction: 1 3 1 GCV 28.70012 RSS 8.830806 GRSq -0.7319038 RSq 0.9518916 CVRSq 0.2995745 Note: the cross-validation sd's below are standard deviations across folds Cross validation: nterms 2.33 sd 0.52 nvars 1.00 sd 0.00 CVRSq sd MaxErr sd 0.3 0.666 -6 3.53 varmod: method "lm" min.sd 0.27 iter.rsq 0.204 stddev of predictions: coefficients iter.stderr iter.stderr% (Intercept) 1.151190 0.759983 66 resp 0.220811 0.131375 59 mean smallest largest ratio 95% prediction interval 10.57312 5.357389 14.56643 2.718942 68% 80% 90% 95% response values in prediction interval 100 100 100 100 > cat("\nevimp(lognum.bool.ord.off)\n") evimp(lognum.bool.ord.off) > print(evimp(lognum.bool.ord.off)) nsubsets gcv rss ord.L 4 -73.4 100.0 log(num) 2 -98.7 30.8 boolTRUE 1 -100.0 6.6 > > plotmo(lognum.bool.ord.off, do.par=2, level=.8, SHOWCALL=TRUE) Note: the offset in the formula is not plotted (use all1=TRUE to plot the offset, or use trace=-1 to silence this message) plotmo grid: num bool ord off 4 TRUE ORD1 0.5384615 > plot(lognum.bool.ord.off, which=1, do.par=0) > par(org.par) > > num.fac.sqrt.num.ord.bool <- earth(resp ~ num + int + fac + offset(off) + sqrt(num) + ord:bool - int, + data=vdata, pmethod="none", trace=1) x[13,10] with colnames num facFAC2 facFAC3 sqrt(num) ordORD1:boolFALSE ordORD3:b... y[13,1] with colname resp, and values 0.9231, 1.846, 2.769, 3.692, ... Forward pass term 1, 2, 4, 6, 8, 10 GRSq -Inf at 9 terms, 6 terms used After forward pass GRSq -in RSq 0.979 Prune none penalty 2 nprune null: selected 6 of 6 terms, and 4 of 10 preds After pruning pass GRSq 0.045 RSq 0.973 > plotmo(num.fac.sqrt.num.ord.bool, SHOWCALL=TRUE) Note: the offset in the formula is not plotted (use all1=TRUE to plot the offset, or use trace=-1 to silence this message) plotmo grid: num int fac off ord bool 4 4 FAC3 0.5384615 ORD1 TRUE > cat("\nevimp(num.fac.sqrt.num.ord.bool)\n") evimp(num.fac.sqrt.num.ord.bool) > print(evimp(num.fac.sqrt.num.ord.bool)) nsubsets gcv rss ordORD1:boolFALSE 4 25.3 100.0 ordORD2:boolTRUE 4 -87.6 52.9 num 3 -100.0 30.0 facFAC3 3 -100.0 30.0 > > printf("\n=== unusual formulas, compare to lm ===\n") === unusual formulas, compare to lm === > > lm1 <- lm(resp~ord+sqrt(as.numeric(fac)) + num+sqrt(num / 2)+I(2 * int)+date, data = vdata) > > # same formula terms as lm1 but in different order > earth1 <- earth(resp~sqrt(as.numeric(fac)) + ord + date + num + sqrt(.5 * num)+I(int / .5), + data = vdata, linpreds=TRUE, thresh=0, penalty=-1) > cat("\nevimp(earth1)\n") evimp(earth1) > print(evimp(earth1)) nsubsets gcv rss date 7 100.0 100.0 sqrt(as.numeric(fac)) 5 10.8 10.8 ord.L 5 5.3 5.3 num 4 3.6 3.6 I(int/0.5) 4 3.6 3.6 ord.Q 2 0.0 0.0 sqrt(0.5 * num) 1 0.0 0.0 > plotmo(lm1, SHOWCALL=TRUE) plotmo grid: ord fac num int date ORD1 FAC3 4 4 2018-08-07 > plotmo(earth1, SHOWCALL=TRUE) plotmo grid: fac ord date num int FAC3 ORD1 2018-08-07 4 4 > stopifnot(max(abs(sort(lm1$coef) - sort(earth1$coef))) < 1e-10) > stopifnot((summary(lm1)$r.squared - earth1$rsq) < 1e-10) > stopifnot(max(abs(predict(lm1, newdata=vdata[5,,drop=FALSE]) - predict(earth1, newdata=vdata[5,,drop=FALSE]))) < 1e-10) > > fac.sqrt <- earth(resp~sqrt(num)+fac, data = vdata, linpreds=TRUE, thresh=0, penalty=-1) > fac.sqrt_ <- earth(resp~sqrt_num+fac, data = vdata, linpreds=TRUE, thresh=0, penalty=-1) > cat("\nevimp(fac.sqrt)\n") evimp(fac.sqrt) > print(evimp(fac.sqrt)) nsubsets gcv rss sqrt(num) 3 100.0 100.0 facFAC3 2 37.4 37.4 facFAC2 1 18.4 18.4 > cat("\nevimp(fac.sqrt_)\n") evimp(fac.sqrt_) > print(evimp(fac.sqrt_)) nsubsets gcv rss sqrt_num 3 100.0 100.0 facFAC3 2 37.4 37.4 facFAC2 1 18.4 18.4 > # as.vector to remove names (which are slightly different: sqrt(num) vs sqrt_num > stopifnot(identical(as.vector(fac.sqrt$coef), as.vector(fac.sqrt_$coef))) > > newdata.extra <- vdata[3:5,] # extra variables unused in the model > newdata.extra$extra <- sqrt(newdata.extra[,1]) > cat("\ncolnames(newdata.extra):", paste(colnames(newdata.extra)), "\n") colnames(newdata.extra): resp bool ord fac str num sqrt_num int date date_num off extra > > newd <- vdata[3:5,c("num", "fac")] # only variables used in the formula model > newd_ <- vdata[3:5,c("num", "sqrt_num", "fac")] # only variables used in the xy model > > stopifnot(identical(predict(fac.sqrt, newdata=newdata.extra), predict(fac.sqrt_, newdata=newd_))) > stopifnot(identical(predict(fac.sqrt, newdata=newd), predict(fac.sqrt_, newdata=newd_))) > stopifnot(identical(predict(fac.sqrt, newdata=newd), predict(fac.sqrt_, newdata=newd_))) > stopifnot(identical(predict(fac.sqrt, newdata=newd), predict(fac.sqrt_, newdata=newd_))) > > stopifnot(max(abs(predict(fac.sqrt, newdata=newdata.extra) - predict(fac.sqrt_, newdata=newdata.extra))) < 1e-10) > stopifnot(max(abs(predict(fac.sqrt, newdata=newdata.extra) - predict(fac.sqrt_, newdata=newdata.extra))) < 1e-10) > > printf("\n=== two response model ===\n") === two response model === > > vdata.2resp <- vdata > resp2 <- 13:1 > vdata.2resp$resp2 <- resp2 > > earth.2resp <- earth(resp+resp2~num+sqrt(num), data=vdata.2resp, weights=vweights, trace=1, + linpreds=TRUE, thresh=0, penalty=-1) Using class "Formula" because lhs of formula has terms separated by "+" x[13,2] with colnames num sqrt(num) y[13,2] with colnames resp resp2 weights[13]: 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 Forward pass term 1, 2, 4, 6 No new term increases RSq (perhaps reached numerical limits) at 5 terms, 3 terms used After forward pass GRSq 0.584 RSq 0.584 Prune backward penalty -1 nprune null: selected 3 of 3 terms, and 2 of 2 preds After pruning pass GRSq 0.584 RSq 0.584 > printf("\nsummary(earth.2resp)\n") summary(earth.2resp) > print(summary(earth.2resp)) Call: earth(formula=resp+resp2~num+sqrt(num), data=vdata.2resp, weights=vweights, trace=1, linpreds=TRUE, thresh=0, penalty=-1) resp resp2 (Intercept) -6.0874826 20.0874826 num -0.3162815 0.3162815 sqrt(num) 7.2649780 -7.2649780 Selected 3 of 3 terms, and 2 of 2 predictors Termination condition: No new term increases RSq at 3 terms Importance: sqrt(num), num Weights: 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 Number of terms at each degree of interaction: 1 2 (additive model) GCV RSS GRSq RSq resp 6.899683 89.69588 0.5836398 0.5836398 resp2 6.899683 89.69588 0.5836398 0.5836398 All 13.799366 179.39176 0.5836398 0.5836398 > cat("\nevimp(earth.2resp)\n") evimp(earth.2resp) > print(evimp(earth.2resp)) nsubsets gcv rss sqrt(num) 2 100.0 100.0 num 1 2.4 2.4 > par(mfrow = c(2, 2), mar = c(3, 3, 3, 1), mgp = c(1.5, 0.5, 0), oma=c(0,0,4,0)) > # for formula models, plotmo plots a sinle plot for the effect of num > plotmo(earth.2resp, nresp=1, do.par=0, main="earth.2resp nresp1") > title <- paste( + "two-response model: resp+resp2~num+sqrt(num)\n", + "the top row is for earth.formula models: the combined effect of num and sqrt(num) is plotted together\n", + "the bottom row is for an earth.default model: num and sqrt(num) are plotted separately") > title(title, outer=TRUE, cex=.6) > plotmo(earth.2resp, nresp=2, do.par=0, main="earth.2resp nresp2") > > # put two response data mats into matrix form for earth.default and for lm > xmat <- vdata[,c("num", "sqrt_num"), drop=FALSE] > colnames(xmat) <- c("num", "sqrt(num)") > xmat <- as.matrix(xmat) > ymat <- vdata[, "resp", drop=FALSE] > ymat$resp2 <- resp2 > ymat <- as.matrix(ymat) > earthxy.2resp <- earth(xmat, ymat, weights=vweights, trace=1, + linpreds=TRUE, thresh=0, penalty=-1) x[13,2] with colnames num sqrt(num) y[13,2] with colnames resp resp2 weights[13]: 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 Forward pass term 1, 2, 4, 6 No new term increases RSq (perhaps reached numerical limits) at 5 terms, 3 terms used After forward pass GRSq 0.584 RSq 0.584 Prune backward penalty -1 nprune null: selected 3 of 3 terms, and 2 of 2 preds After pruning pass GRSq 0.584 RSq 0.584 > printf("\nsummary(earthxy.2resp)\n") summary(earthxy.2resp) > print(summary(earthxy.2resp)) Call: earth(x=xmat, y=ymat, weights=vweights, trace=1, linpreds=TRUE, thresh=0, penalty=-1) resp resp2 (Intercept) -6.0874826 20.0874826 num -0.3162815 0.3162815 sqrt(num) 7.2649780 -7.2649780 Selected 3 of 3 terms, and 2 of 2 predictors Termination condition: No new term increases RSq at 3 terms Importance: sqrt(num), num Weights: 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 Number of terms at each degree of interaction: 1 2 (additive model) GCV RSS GRSq RSq resp 6.899683 89.69588 0.5836398 0.5836398 resp2 6.899683 89.69588 0.5836398 0.5836398 All 13.799366 179.39176 0.5836398 0.5836398 > cat("\nevimp(earthxy.2resp)\n") evimp(earthxy.2resp) > print(evimp(earthxy.2resp)) nsubsets gcv rss sqrt(num) 2 100.0 100.0 num 1 2.4 2.4 > # for xy models, plotmo plots a separate plots for the effect of num and sqrt(num) > plotmo(earthxy.2resp, nresp=1, do.par=0) plotmo grid: num sqrt(num) 4 2 > # plotmo(earthxy.2resp, nresp=2, do.par=0) > stopifnot(identical(earth.2resp$coeff, earthxy.2resp$coeff)) > > lm.2resp <- lm(ymat~xmat, weights=vweights) > printf("\nsummary(lm.2resp)\n") summary(lm.2resp) > print(summary(lm.2resp)) Response resp : Call: lm(formula = resp ~ xmat, weights = vweights) Weighted Residuals: Min 1Q Median 3Q Max -3.5470 -2.1773 -0.3788 0.8227 5.4530 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -6.0875 10.4903 -0.580 0.575 xmatnum -0.3163 3.4983 -0.090 0.930 xmatsqrt(num) 7.2650 12.4500 0.584 0.572 Residual standard error: 2.995 on 10 degrees of freedom Multiple R-squared: 0.5836, Adjusted R-squared: 0.5004 F-statistic: 7.009 on 2 and 10 DF, p-value: 0.01251 Response resp2 : Call: lm(formula = resp2 ~ xmat, weights = vweights) Weighted Residuals: Min 1Q Median 3Q Max -5.4530 -0.8227 0.3788 2.1773 3.5470 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 20.0875 10.4903 1.915 0.0845 . xmatnum 0.3163 3.4983 0.090 0.9297 xmatsqrt(num) -7.2650 12.4500 -0.584 0.5725 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 2.995 on 10 degrees of freedom Multiple R-squared: 0.5836, Adjusted R-squared: 0.5004 F-statistic: 7.009 on 2 and 10 DF, p-value: 0.01251 > options(warn=2) # treat warnings as errors > expect.err(try(plotmo(lm.2resp, nresp=1)), + "the variable on the right side of the formula is a matrix or data.frame") Error : (converted from warning) the variable on the right side of the formula is a matrix or data.frame plotmo often cannot process such variables Got expected error from try(plotmo(lm.2resp, nresp = 1)) > options(warn=1) # print warnings as they occur > > # check that lm and earth coeffs are the same > # need order() below because coeffs appear in different row order in the coeff mat > earth.2resp.order <- order(earth.2resp$coeff[,1]) > lm.order <- order(lm.2resp$coeff[,1]) > stopifnot(max(abs(earth.2resp$coeff[earth.2resp.order] - lm.2resp$coeff[lm.order])) < 1e-10) > > printf("\n=== test glm() with spaced.bx ===\n") === test glm() with spaced.bx === > > # glm requires response to be a factor (or two columns) > spaced.bx.fac <- spaced.bx > spaced.bx.fac$`surv fac` <- factor(ifelse(spaced.bx$`Survived = YES`, "yes", "no"), levels = c("yes", "no")) > spaced.bx.fac$`Survived = YES` <- NULL > glm.spaced.bx <- glm(`surv fac` ~ ., data=spaced.bx.fac, family="binomial") > printf("summary(glm.spaced.bx):\n") summary(glm.spaced.bx): > print(summary(glm.spaced.bx)) Call: glm(formula = `surv fac` ~ ., family = "binomial", data = spaced.bx.fac) Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) -2.91353 0.28320 -10.288 < 2e-16 *** sexmale 3.18562 0.31478 10.120 < 2e-16 *** pclass3rd 5.03006 0.56669 8.876 < 2e-16 *** `sexmale*H(16 - age)` -0.24181 0.03646 -6.632 3.31e-11 *** `pclass2nd*sexmale` 1.76809 0.32676 5.411 6.27e-08 *** `pclass3rd*H(4 - sibsp)` -0.61865 0.13506 -4.581 4.64e-06 *** `pclass3rd*sexmale` -1.22270 0.39291 -3.112 0.00186 ** `H(age - 32)` 0.03757 0.01178 3.189 0.00143 ** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 (Dispersion parameter for binomial family taken to be 1) Null deviance: 1414.62 on 1045 degrees of freedom Residual deviance: 892.79 on 1038 degrees of freedom AIC: 908.79 Number of Fisher Scoring iterations: 5 > plotmo(glm.spaced.bx, do.par=2) Warning: Cannot determine which variables to plot in degree2 plots (use all2=TRUE?) Confused by variable name "`sexmale*H(16 - age)`" plotmo grid: sexmale pclass3rd sexmale*H(16 - age) pclass2nd*sexmale 1 0 0 0 pclass3rd*H(4 - sibsp) pclass3rd*sexmale H(age - 32) 0 0 0 > plotres(glm.spaced.bx, which=3, do.par=0, info=TRUE, main="plotres(glm.spaced.bx,which=3") > # TODO why is Residuals-Vs-Fitted plot different for plotres and plot for glm models? > plot(glm.spaced.bx, which=1, caption="plot(glm.spaced.bx, which=1)") > par(org.par) > plotmo(glm.spaced.bx, all2=TRUE, degree2=c("sexmale", "pclass"), SHOW.CALL=TRUE, do.par=2) plotmo grid: sexmale pclass3rd sexmale*H(16 - age) pclass2nd*sexmale 1 0 0 0 pclass3rd*H(4 - sibsp) pclass3rd*sexmale H(age - 32) 0 0 0 > plotmo(glm.spaced.bx, degree1=0, all2=TRUE, degree2=c("sexmale", "age"), do.par=0) > par(org.par) # TODO I think plot(glm.spaced.bx) doesn't restore the graphics params? > > printf("\n=== test formulas which have a rhs variable which a matrix ===\n") === test formulas which have a rhs variable which a matrix === > # This also tests that earth's naming of variables is the same as lm for such rhs variables > # > # TODO plotmo fails when rhs variable is a matrix --- would be nice to fix that > > x_ <- etitanic[,"age",drop=FALSE] > x_$pclass <- etitanic$pclass > x_$pclass <- as.numeric(etitanic$pclass) > x_ <- as.matrix(x_) > y_ <- as.matrix(as.numeric(etitanic[,"survived"])) > > earthxy.rhs.mat <- earth(x_, y_, degree=2, trace=1) x[1046,2] with colnames age pclass y[1046,1] with colname y_, and values 1, 1, 0, 0, 0, 1, 1, 0, 1, 0,... Forward pass term 1, 2, 4, 6, 8, 10 RSq changed by less than 0.001 at 9 terms (DeltaRSq 0.00055) After forward pass GRSq 0.120 RSq 0.162 Prune backward penalty 3 nprune null: selected 6 of 9 terms, and 2 of 2 preds After pruning pass GRSq 0.137 RSq 0.158 > print(summary(earthxy.rhs.mat)) Call: earth(x=x_, y=y_, trace=1, degree=2) coefficients (Intercept) 0.47789359 h(18-age) 0.03051719 h(age-18) -0.00609975 h(2-pclass) 0.28092736 h(pclass-2) -0.16376873 h(23-age) * h(pclass-2) -0.01570789 Selected 6 of 9 terms, and 2 of 2 predictors Termination condition: RSq changed by less than 0.001 at 9 terms Importance: pclass, age Number of terms at each degree of interaction: 1 4 1 GCV 0.2088003 RSS 212.8039 GRSq 0.1373292 RSq 0.1578438 > cat("\nevimp(earthxy.rhs.mat)\n") evimp(earthxy.rhs.mat) > print(evimp(earthxy.rhs.mat)) nsubsets gcv rss pclass 5 100.0 100.0 age 4 66.0 69.3 > cat("\nearthxy.rhs.mat$modvars\n") earthxy.rhs.mat$modvars > print(earthxy.rhs.mat$modvars) age pclass age 1 0 pclass 0 1 > plotmo(earthxy.rhs.mat, SHOWCALL=TRUE) # ok plotmo grid: age pclass 28 2 > > earth.rhs.mat <- earth(y_ ~ x_, degree=2, trace=1) x[1046,2] with colnames x_age x_pclass y[1046,1] with colname y_, and values 1, 1, 0, 0, 0, 1, 1, 0, 1, 0,... Forward pass term 1, 2, 4, 6, 8, 10 RSq changed by less than 0.001 at 9 terms (DeltaRSq 0.00055) After forward pass GRSq 0.120 RSq 0.162 Prune backward penalty 3 nprune null: selected 6 of 9 terms, and 2 of 2 preds After pruning pass GRSq 0.137 RSq 0.158 > print(summary(earth.rhs.mat)) Call: earth(formula=y_~x_, trace=1, degree=2) coefficients (Intercept) 0.47789359 h(18-x_age) 0.03051719 h(x_age-18) -0.00609975 h(2-x_pclass) 0.28092736 h(x_pclass-2) -0.16376873 h(23-x_age) * h(x_pclass-2) -0.01570789 Selected 6 of 9 terms, and 2 of 2 predictors Termination condition: RSq changed by less than 0.001 at 9 terms Importance: x_pclass, x_age Number of terms at each degree of interaction: 1 4 1 GCV 0.2088003 RSS 212.8039 GRSq 0.1373292 RSq 0.1578438 > cat("\nevimp(earth.rhs.mat)\n") evimp(earth.rhs.mat) > print(evimp(earth.rhs.mat)) nsubsets gcv rss x_pclass 5 100.0 100.0 x_age 4 66.0 69.3 > cat("\nearth.rhs.mat$modvars\n") earth.rhs.mat$modvars > print(earth.rhs.mat$modvars) x_age x_pclass x_ 1 1 > stopifnot(max(abs(earthxy.rhs.mat$coeff - earth.rhs.mat$coeff)) < 1e-15) > expect.err(try(plotmo(earth.rhs.mat)), # Warning: the variable on the right side of the formula is a matrix or data.frame + "model.frame.default could not interpret the data passed to get.earth.x from model.matrix.earth from predict.earth") Warning: the variable on the right side of the formula is a matrix or data.frame plotmo often cannot process such variables Warning: Cannot determine which variables to plot (use all1=TRUE?) single.names=c(x_,x_,x_,x_) colnames(x)=c(age,pclass) stats::predict(earth.object, data.frame[50,2], type="response") Error : model.frame.default could not interpret the data passed to get.earth.x from model.matrix.earth from predict.earth (actual.nrows=1046 expected.nrows=50 fitted.nrows=1046) Got expected error from try(plotmo(earth.rhs.mat)) > expect.err(try(plotmo(earth.rhs.mat, all1=TRUE)), # still fails + "model.frame.default could not interpret the data passed to get.earth.x from model.matrix.earth from predict.earth") Warning: the variable on the right side of the formula is a matrix or data.frame plotmo often cannot process such variables stats::predict(earth.object, data.frame[50,2], type="response") Error : model.frame.default could not interpret the data passed to get.earth.x from model.matrix.earth from predict.earth (actual.nrows=1046 expected.nrows=50 fitted.nrows=1046) Got expected error from try(plotmo(earth.rhs.mat, all1 = TRUE)) > > lm.rhs.mat <- lm(y_ ~ x_) > print(summary(lm.rhs.mat)) Call: lm(formula = y_ ~ x_) Residuals: Min 1Q Median 3Q Max -0.9113 -0.3505 -0.1995 0.4395 1.0350 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 1.167193 0.062574 18.653 < 2e-16 *** x_age -0.007626 0.001070 -7.125 1.94e-12 *** x_pclass -0.240589 0.018334 -13.123 < 2e-16 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 0.4553 on 1043 degrees of freedom Multiple R-squared: 0.1444, Adjusted R-squared: 0.1427 F-statistic: 87.98 on 2 and 1043 DF, p-value: < 2.2e-16 > expect.err(try(plotmo(lm.rhs.mat)), # Warning: the variable on the right side of the formula is a matrix or data.frame + "predict returned the wrong length (got 1046 but expected 50)") Warning: the variable on the right side of the formula is a matrix or data.frame plotmo often cannot process such variables Warning: 'newdata' had 50 rows but variables found have 1046 rows Error : predict returned the wrong length (got 1046 but expected 50) Got expected error from try(plotmo(lm.rhs.mat)) > expect.err(try(plotmo(lm.rhs.mat, all1=TRUE)), # still fails + "predict returned the wrong length (got 1046 but expected 50)") Warning: the variable on the right side of the formula is a matrix or data.frame plotmo often cannot process such variables Warning: 'newdata' had 50 rows but variables found have 1046 rows Error : predict returned the wrong length (got 1046 but expected 50) Got expected error from try(plotmo(lm.rhs.mat, all1 = TRUE)) > earth1.rhs.mat <- earth(y_ ~ x_, linpreds=TRUE, thresh=0, penalty=-1) # degree1 > cat("\nevimp(earth1.rhs.mat)\n") evimp(earth1.rhs.mat) > print(evimp(earth1.rhs.mat)) nsubsets gcv rss x_pclass 2 100.0 100.0 x_age 1 53.7 53.7 > options(warn=2) > expect.err(try(plotmo(earth.rhs.mat)), + "the variable on the right side of the formula is a matrix or data.frame") Error : (converted from warning) the variable on the right side of the formula is a matrix or data.frame plotmo often cannot process such variables Got expected error from try(plotmo(earth.rhs.mat)) > expect.err(try(plotmo(earth.rhs.mat, all1=TRUE)), # still fails + "the variable on the right side of the formula is a matrix or data.frame") Error : (converted from warning) the variable on the right side of the formula is a matrix or data.frame plotmo often cannot process such variables Got expected error from try(plotmo(earth.rhs.mat, all1 = TRUE)) > options(warn=1) > stopifnot(max(abs(sort(lm.rhs.mat$coeff) - sort(earth1.rhs.mat$coeff))) < 1e-12) > stopifnot(sort(rownames(lm.rhs.mat$coeff)) == sort(rownames(earth1.rhs.mat$coeff))) > > x_nonames <- x_ > colnames(x_nonames) <- NULL > lm.rhs.nonames <- lm(y_ ~ x_nonames) > print(summary(lm.rhs.nonames)) Call: lm(formula = y_ ~ x_nonames) Residuals: Min 1Q Median 3Q Max -0.9113 -0.3505 -0.1995 0.4395 1.0350 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 1.167193 0.062574 18.653 < 2e-16 *** x_nonames1 -0.007626 0.001070 -7.125 1.94e-12 *** x_nonames2 -0.240589 0.018334 -13.123 < 2e-16 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 0.4553 on 1043 degrees of freedom Multiple R-squared: 0.1444, Adjusted R-squared: 0.1427 F-statistic: 87.98 on 2 and 1043 DF, p-value: < 2.2e-16 > expect.err(try(plotmo(lm.rhs.nonames)), # Warning: the variable on the right side of the formula is a matrix or data.frame + "predict returned the wrong length (got 1046 but expected 50)") Warning: the variable on the right side of the formula is a matrix or data.frame plotmo often cannot process such variables Warning: 'newdata' had 50 rows but variables found have 1046 rows Error : predict returned the wrong length (got 1046 but expected 50) Got expected error from try(plotmo(lm.rhs.nonames)) > expect.err(try(plotmo(lm.rhs.nonames, all1=TRUE)), # still fails + "predict returned the wrong length (got 1046 but expected 50)") Warning: the variable on the right side of the formula is a matrix or data.frame plotmo often cannot process such variables Warning: 'newdata' had 50 rows but variables found have 1046 rows Error : predict returned the wrong length (got 1046 but expected 50) Got expected error from try(plotmo(lm.rhs.nonames, all1 = TRUE)) > earth1.rhs.nonames <- earth(y_ ~ x_nonames, linpreds=TRUE, thresh=0, penalty=-1) # degree1 > print(summary(earth1.rhs.nonames)) Call: earth(formula=y_~x_nonames, linpreds=TRUE, thresh=0, penalty=-1) coefficients (Intercept) 1.16719336 x_nonames1 -0.00762624 x_nonames2 -0.24058942 Selected 3 of 3 terms, and 2 of 2 predictors Termination condition: No new term increases RSq at 3 terms Importance: x_nonames2, x_nonames1 Number of terms at each degree of interaction: 1 2 (additive model) GCV 0.2067034 RSS 216.2118 GRSq 0.1443571 RSq 0.1443571 > cat("\nevimp(earth1.rhs.nonames)\n") evimp(earth1.rhs.nonames) > print(evimp(earth1.rhs.nonames)) nsubsets gcv rss x_nonames2 2 100.0 100.0 x_nonames1 1 53.7 53.7 > options(warn=2) > expect.err(try(plotmo(earth1.rhs.nonames)), # Warning: the variable on the right side of the formula is a matrix or data.frame + "the variable on the right side of the formula is a matrix or data.frame") Error : (converted from warning) the variable on the right side of the formula is a matrix or data.frame plotmo often cannot process such variables Got expected error from try(plotmo(earth1.rhs.nonames)) > expect.err(try(plotmo(earth1.rhs.nonames, all1=TRUE)), # still fails + "the variable on the right side of the formula is a matrix or data.frame") Error : (converted from warning) the variable on the right side of the formula is a matrix or data.frame plotmo often cannot process such variables Got expected error from try(plotmo(earth1.rhs.nonames, all1 = TRUE)) > options(warn=1) > stopifnot(max(abs(sort(lm.rhs.nonames$coeff) - sort(earth1.rhs.nonames$coeff))) < 1e-12) > stopifnot(sort(rownames(lm.rhs.nonames$coeff)) == sort(rownames(earth1.rhs.nonames$coeff))) > > printf("\n=== test handling consecutive '-' in formula ===\n") === test handling consecutive '-' in formula === > > options(warn=2) > lm.consec.minus <- lm(Volume~.--Girth, data=trees) # note double -- > expect.err(try(plotmo(lm.consec.minus)), + "Consecutive '-' in formula may cause problems") Error : (converted from warning) Consecutive '-' in formula may cause problems Formula: (Girth + Height) - -Girth Got expected error from try(plotmo(lm.consec.minus)) > earth.consec.minus <- earth(Volume~.--Girth, data=trees) # note double -- > cat("\nsummary(earth.consec.minus)\n") summary(earth.consec.minus) > print(summary(earth.consec.minus)) Call: earth(formula=Volume~.--Girth, data=trees) coefficients (Intercept) 29.0599535 h(14.2-Girth) -3.4198062 h(Girth-14.2) 6.2295143 h(Height-75) 0.5813644 Selected 4 of 5 terms, and 2 of 2 predictors Termination condition: RSq changed by less than 0.001 at 5 terms Importance: Girth, Height Number of terms at each degree of interaction: 1 3 (additive model) GCV 11.25439 RSS 209.1139 GRSq 0.959692 RSq 0.9742029 > cat("\nevimp(earth.consec.minus)\n") evimp(earth.consec.minus) > print(evimp(earth.consec.minus)) nsubsets gcv rss Girth 3 100.0 100.0 Height 1 10.7 11.5 > expect.err(try(plotmo(earth.consec.minus)), + "Consecutive '-' in formula may cause problems") Error : (converted from warning) Consecutive '-' in formula may cause problems Formula: (Girth + Height) - -Girth Got expected error from try(plotmo(earth.consec.minus)) > options(warn=1) > > printf("\n=== test rpart() with spaced.bx ===\n") === test rpart() with spaced.bx === > > library(rpart.plot) Loading required package: rpart > rpart.mod <- rpart(`Survived = YES` ~ ., data=spaced.bx) > printf("\nprint(rpart.rules(rpart.mod))\n") print(rpart.rules(rpart.mod)) > print(rpart.rules(rpart.mod)) Survived = YES 0.062 when sexmale is 1 & pclass3rd is 1 & sexmale*H(16 - age) >= 6.5 & pclass3rd*H(4 - sibsp) < 2 0.082 when sexmale is 1 & sexmale*H(16 - age) < 6.5 & pclass2nd*sexmale is 1 0.150 when sexmale is 1 & pclass3rd is 1 & sexmale*H(16 - age) < 6.5 & pclass2nd*sexmale is 0 0.338 when sexmale is 1 & pclass3rd is 0 & sexmale*H(16 - age) < 6.5 & pclass2nd*sexmale is 0 0.474 when sexmale is 0 & pclass3rd is 1 0.769 when sexmale is 1 & pclass3rd is 1 & sexmale*H(16 - age) >= 6.5 & pclass3rd*H(4 - sibsp) >= 2 0.932 when sexmale is 0 & pclass3rd is 0 1.000 when sexmale is 1 & pclass3rd is 0 & sexmale*H(16 - age) >= 6.5 > set.seed(2020) > plotmo(rpart.mod, do.par=2, degree1=c("sexmale", "pclass3rd"), degree2=2, pt.col="red") plotmo grid: sexmale pclass3rd sexmale*H(16 - age) pclass2nd*sexmale 1 0 0 0 pclass3rd*H(4 - sibsp) pclass3rd*sexmale H(age - 32) 0 0 0 > plotres(rpart.mod, do.par=0, which=c(1,3)) > par(org.par) > > printf("\n=== tibble, class \"Date\", and ndiscrete ===\n") === tibble, class "Date", and ndiscrete === > > library(tibble) > library(lubridate) Attaching package: 'lubridate' The following objects are masked from 'package:base': date, intersect, setdiff, union > tib1 <- tibble(y = c(1, 1, 2, 3), # even number of variables + bool = c(F, F, F, T), + date = c(ymd('2018-08-01'), ymd('2018-08-02'), ymd('2018-08-03'), + ymd('2018-08-03'))) > cat("class tib1$date: ", class(tib1$date), "\n") class tib1$date: Date > mod.tib1 <- lm(y ~ ., data = tib1) > plotmo(mod.tib1, col.response=2, all2=TRUE, ticktype="d", do.par=2, caption="mod.tib1: Dates ndiscrete=default 5") plotmo grid: bool date FALSE 2018-08-02 > plotmo(mod.tib1, col.response=2, degree1=0, all2=TRUE, ticktype="d", do.par=0, theta=-45) > par(org.par) > > plotmo(mod.tib1, col.response=2, all2=TRUE, ticktype="d", do.par=2, ndiscrete=2, caption="mod.tib1: Dates ndiscrete=2") plotmo grid: bool date FALSE 2018-08-02 > plotmo(mod.tib1, col.response=2, degree1=0, all2=TRUE, ticktype="d", do.par=0, theta=-45, ndiscrete=2) > par(org.par) > > plotmo(mod.tib1, col.response=2, all2=TRUE, ticktype="d", do.par=2, ndiscr=1, caption="mod.tib1: Dates ndiscrete=1") plotmo grid: bool date FALSE 2018-08-02 > plotmo(mod.tib1, col.response=2, degree1=0, all2=TRUE, ticktype="d", do.par=0, theta=-45, ndiscrete=2) > par(org.par) > > tib2 <- tibble(y = c(1, 1, 2, 3, 4), # odd number of variables + bool = c(F, F, F, T, T), + date = c(ymd('2018-08-01'), ymd('2018-08-02'), ymd('2018-08-03'), + ymd('2018-08-03'), ymd('2018-08-04'))) > mod.tib2 <- lm(y ~ ., data = tib2) > plotmo(mod.tib2, col.response=2, all2=TRUE, ticktype="d", do.par=2, caption="mod.tib2: Dates ndiscrete=default 5") plotmo grid: bool date FALSE 2018-08-03 > plotmo(mod.tib2, col.response=2, degree1=0, all2=TRUE, ticktype="d", do.par=0, theta=-45) > par(org.par) > > plotmo(mod.tib2, col.response=2, all2=TRUE, ticktype="d", do.par=2, ndiscrete=2, caption="mod.tib2: Dates ndiscrete=2") plotmo grid: bool date FALSE 2018-08-03 > plotmo(mod.tib2, col.response=2, degree1=0, all2=TRUE, ticktype="d", do.par=0, theta=-45, ndiscrete=2) > par(org.par) > > plotmo(mod.tib2, col.response=2, all2=TRUE, ticktype="d", do.par=2, ndiscr=1, caption="mod.tib2: Dates ndiscrete=1") plotmo grid: bool date FALSE 2018-08-03 > plotmo(mod.tib2, col.response=2, degree1=0, all2=TRUE, ticktype="d", do.par=0, theta=-45, ndiscrete=2) > par(org.par) > > source("test.epilog.R") plotmo/inst/slowtests/test.unusual.vars.R0000644000176200001440000005576513737416673020422 0ustar liggesusers# test.unusual.vars.R: test unusual variable names, and unusual formulas # # This file was initially created for plotmo 3.6.0 (Sep 2020) # ALso tests the naken() func introduced in plotmo 3.6.0 and earth 5.2.0 (Sep 2020) source("test.prolog.R") library(earth) data(ozone1) data(etitanic) options(warn=1) # print warnings as they occur check.naken <- function(s, expected, trace=0) { nude <- plotmo:::naken.formula.string(s, trace=trace) printf("%-60.60s %-s\n", s, nude) stopifnot(nude == expected) } printf("=== check naken.formula.string\n") # edge cases check.naken("", "") check.naken(" ", "") check.naken("y~", "y ~ ") check.naken("y~ ", "y ~ ") check.naken("y ~ ", "y ~ ") check.naken("y ~ ", "y ~ ") check.naken(" y ~ ", "y ~ ") check.naken("[", "[", trace=2) check.naken("`", "`", trace=2) # standard formulas check.naken("x", "x") check.naken("x1", "x1") check.naken("y ~ x1 : x2 + x3", "y ~ x1 + x2 + x3", trace=2) check.naken("y ~ x1 + x2 - x3", "y ~ x1 + x2 + x3", trace=2) # TODO "-" is treated as a "+" check.naken("y ~ .-x3", "y ~ . + x3") check.naken("cbind(damage, 6-damage)~temp", "cbind(damage, 6-damage) ~ temp", trace=2) check.naken("depIndex~q_4 + q_2102+q_2104 +q_3105+ q_3106", "depIndex ~ q_4 + q_2102 + q_2104 + q_3105 + q_3106") check.naken("doy ~ (vh+wind+humidity)^2", "doy ~ vh + wind + humidity") check.naken("doy ~ s(wind) + s(humidity,wind) + s(vh)", "doy ~ wind + humidity + vh") check.naken("log(doy) ~ I(vh*wind) + I(humidity*temp)+log(doy)", "log(doy) ~ vh + wind + humidity + temp + doy") check.naken("log(doy)~vh+wind+humidity+I(wind*humidity)+temp+log(ibh)", "log(doy) ~ vh + wind + humidity + temp + ibh", trace=2) check.naken("O3 ~ s(humidity)+s(temp)+s(ibt)+s(temp,ibt)", "O3 ~ humidity + temp + ibt") check.naken("Ozone^(1/3) ~ lo(Solar.R) + lo(Wind, Temp)", "Ozone^(1/3) ~ Solar.R + Wind + Temp") check.naken("Volume~(Girth*Height2)-Height", "Volume ~ Girth + Height2 + Height") check.naken("y ~ s(x) + s(x,z1)", "y ~ x + z1") check.naken("y~s(x0,x1,k=12)+s(x2)+s(x3,k=20,fx=20)", "y ~ x0 + x1 + x2 + x3") check.naken("y~x[,1]+x[,2]", "y ~ x[,1] + x[,2]") check.naken("y~x[,1]+x[,my.list$j]", "y ~ x[,1] + x[,my.list$j]") check.naken("y~x[,i]+x[,2]", "y ~ x[,i] + x[,2]") check.naken("Salary~Hitters[,1]", "Salary ~ Hitters[,1]", trace=2) check.naken("Salary~Hitters[,-1]", "Salary ~ Hitters[,-1]", trace=2) check.naken("Salary~Hitters[,c(1,2)]", "Salary ~ Hitters[,c(1,2)]", trace=2) check.naken("Salary~Hitters[,1:2]", "Salary ~ Hitters[,1:2]") check.naken("Salary~Hitters[,c(1,2)]", "Salary ~ Hitters[,c(1,2)]", trace=2) # nested brackets check.naken("y ~ x1[[2]] + x1[[3]]", "y ~ x1[[2]] + x1[[3]]") check.naken("y[ , 1 ] ~ x1[[2]]", "y[ , 1 ] ~ x1[[2]]") check.naken("y ~ x0[,nonesuch1 + x1[nsuch2^2 + 3 ]]", "y ~ x0[,nonesuch1 + x1[nsuch2^2 + 3 ]]") check.naken("y ~ x0[1,x2[3]] + x4[[5]] + x6[ x7[, 8], x9[ ,x10[11] ], drop=x12[13]]", "y ~ x0[1,x2[3]] + x4[[5]] + x6[ x7[, 8], x9[ ,x10[11] ], drop=x12[13]]") # backquotes check.naken("y ~ `a b c10` + `def`", "y ~ `a b c10` + `def`") check.naken("`y` ~ `a b c10` + `def` + s(sqrt(`x 1`))", "`y` ~ `a b c10` + `def` + `x 1`") # without a response check.naken("x1 + x[,1] + `x3`", "x1 + x[,1] + `x3`") check.naken("Salary~Hitters[,c(1,2)]+sqrt(x)", "Salary ~ Hitters[,c(1,2)] + x") check.naken("Salary~Hitters[,c(1,2)]+sqrt(x)+x99", "Salary ~ Hitters[,c(1,2)] + x + x99") check.naken("Salary~x1+x2+`x6`+x3", "Salary ~ x1 + x2 + `x6` + x3") check.naken("x[,c(1,2)] + x[,3]", "x[,c(1,2)] + x[,3]") check.naken("x[,1] + x[,2] + x[,3] + x[,29] + x[,-14]", "x[,1] + x[,2] + x[,3] + x[,29] + x[,-14]") check.naken("x[,c(1,2)] + x[,3] + x[,5:6] + x[,-1]", "x[,c(1,2)] + x[,3] + x[,5:6] + x[,-1]") check.naken("log(y) ~ x9 + ns(x2,4) + s(x3,x4,df=4) + x5:sqrt(x6)", "log(y) ~ x9 + x2 + x3 + x4 + x5 + x6") check.naken("log(y) ~ x9 + sqrt(x6) + ns(x2,4) + s(x3,x4,df=4) + x5", "log(y) ~ x9 + x6 + x2 + x3 + x4 + x5") check.naken("x[,1] + sqrt(x2) + 2.34e6 + 1", "x[,1] + x2 + 1") printf("\n=== test problem in lm() formula with -nonesuch ===\n") # Using "-nonesuch" in a "." formula (where nonesuch is a non-existent variable name) # causes the following error in stats::terms.formula (called via model.frame.default) # Error in terms.formula(formula, data = data) : (converted from warning) # 'varlist' has changed (from nvar=3) to new 4 after EncodeVars() -- should no longer happen! options(warn=2) # treat warnings as errors expect.err(try(lm(formula = Volume ~ . - nonesuch, data=trees)), "'varlist' has changed (from nvar=3) to new 4 after EncodeVars() -- should no longer happen!") options(warn=1) # print warnings as they occur printf("\n=== test variables names with spaces in them ===\n") spaced.trees <- trees stopifnot(colnames(spaced.trees) == c("Girth", "Height", "Volume")) # sanity check colnames(spaced.trees) <- c("Girth extra", "Height 999", "Volume") # put spaces in the names lm.spaced.trees <- lm(Volume~., data=spaced.trees) options(warn=2) expect.err(try(plotmo(lm.spaced.trees)), "Cannot determine which variables to plot in degree2 plots") options(warn=1) plotmo(lm.spaced.trees) # warning, but still plots (no degree2 plots) plotmo(lm.spaced.trees, all2=TRUE) # no warning earth.spaced.trees <- earth(Volume~. , data=spaced.trees, degree=2) plotmo(earth.spaced.trees) cat("\nevimp(earth.spaced.trees)\n") print(evimp(earth.spaced.trees)) printf("\n=== test non standard variable names and use of earth's bx matrix ===\n") emod <- earth(survived~., data=etitanic, degree=2) plotmo(emod) cat("\nevimp(emod)\n") print(evimp(emod)) bx <- emod$bx bx.df <- as.data.frame(bx[,-1]) # -1 to drop intercept bx.df$survived <- etitanic$survived # following gsub make it a bit easier to see what's going on # because the next call to earth also creates hinge functions # (so we end up with nested hinge functions) colnames(bx.df) <- gsub("h(", "H(", colnames(bx.df), fixed=TRUE) lm.bx <- lm(survived ~ ., data=bx.df) set.seed(2020) earth.bx <- earth(survived ~ ., data=bx.df, degree=2) printf("\nsummary(earth.bx):\n") print(summary(earth.bx)) printf("\nevimp(earth.bx):\n") print(evimp(earth.bx)) plot(earth.bx, info=TRUE) plotmo(lm.bx) # Warning: Cannot determine which variables to plot in degree2 plots plotmo(lm.bx, all2=TRUE, SHOWCALL=TRUE) plotmo(earth.bx, pmethod="partdep", trace=2) printf("\n=== put spaces into the column names of bx (for both response and predictors) ===\n") spaced.bx <- bx.df colnames(spaced.bx) <- gsub("-", " - ", colnames(spaced.bx), fixed=TRUE) colnames(spaced.bx)[colnames(spaced.bx) == "survived"] <- "Survived = YES" printf("\nhead(spaced.bx):\n") print(head(spaced.bx)) lm.spaced.bx <- lm(`Survived = YES` ~ ., data=spaced.bx) set.seed(2020) earth.spaced.bx <- earth(`Survived = YES` ~ ., data=spaced.bx, degree=2, trace=.5, nfold=4, ncross=3, varmod.method="lm", pmethod="cv") printf("\nsummary(earth.spaced.bx):\n") print(summary(earth.spaced.bx)) printf("\nevimp(earth.spaced.bx):\n") print(evimp(earth.spaced.bx)) set.seed(2020) earth.glm.spaced.bx <- earth(`Survived = YES` ~ ., data=spaced.bx, degree=2, trace=.5, glm=list(family="binomial"), nfold=4, ncross=3, varmod.method="lm", pmethod="cv") printf("\nsummary(earth.glm.spaced.bx):\n") print(summary(earth.glm.spaced.bx)) printf("\nevimp(earth.glm.spaced.bx):\n") print(evimp(earth.glm.spaced.bx)) options(warn=2) expect.err(try(plotmo(lm.spaced.bx)), "Cannot determine which variables to plot in degree2 plots") options(warn=1) plotmo(lm.spaced.bx, do.par=2, SHOWCALL=TRUE) plotres(lm.spaced.bx, do.par=0, which=c(1, 3)) par(org.par) plotmo(earth.spaced.bx, degree1="sexmale", do.par=2, level=.8, SHOWCALL=TRUE) plot(earth.spaced.bx, do.par=0, which=c(1, 3), info=TRUE, level=.8, type="earth") par(org.par) plot(earth.spaced.bx, versus="b:", info=TRUE, level=.8, type="earth", SHOWCALL=TRUE) # following should be the same as previous page (since type="earth") plotmo(earth.glm.spaced.bx, degree1="sexmale", do.par=2, level=.8, type="earth", SHOWCALL=TRUE) plot(earth.glm.spaced.bx, do.par=0, which=1, info=TRUE, level=.8, type="earth") # $$ TODO Following shouldn't cause Warning: Internal inconsistency: p$fit - fitted != 0 # No warning if don't use glm=list(family="binomial") in call to earth options(warn=2) expect.err(try(plot(earth.glm.spaced.bx, do.par=0, which=3, info=TRUE, level=.8, type="earth")), "Internal inconsistency: p$fit != fitted") options(warn=1) plot(earth.glm.spaced.bx, do.par=0, which=3, info=TRUE, level=.8, type="earth") par(org.par) expect.err(try(plotmo(earth.glm.spaced.bx, level=.8)), "predict.earth: with earth-glm models, use type=\"earth\" when using the interval argument") plotmo(earth.glm.spaced.bx, degree1="sexmale", do.par=2, SHOWCALL=TRUE) plot(earth.glm.spaced.bx, do.par=0, which=c(1, 3), info=TRUE) par(org.par) printf("\n=== test combinations of variables in formula ===\n") vdata <- data.frame( resp = 1:13, bool = c(F, F, F, F, F, T, T, T, T, T, T, T, T), ord = ordered(c("ORD1", "ORD1", "ORD1", "ORD1", "ORD1", "ORD1", "ORD3", "ORD3", "ORD3", "ORD2", "ORD2", "ORD2", "ORD2"), levels=c("ORD1", "ORD3", "ORD2")), fac = as.factor(c("FAC1", "FAC1", "FAC1", "FAC2", "FAC2", "FAC2", "FAC3", "FAC3", "FAC3", "FAC1", "FAC2", "FAC3", "FAC3")), str = c("STR1", "STR1", "STR1", # WILL BE TREATED LIKE A FACTOR "STR2", "STR2", "STR2", "STR3", "STR3", "STR3", "STR3", "STR3", "STR3", "STR3"), num = c(1, 3, 2, 3, 4, 5, 6, 4, 5, 6.5, 3, 6, 5), # 7 unique values (but one is non integral) sqrt_num = sqrt(c(1, 3, 2, 3, 4, 5, 6, 4, 5, 6.5, 3, 6, 5)), int = c(1L, 1L, 3L, 3L, 4L, 4L, 3L, 5L, 3L, 6L, 7L, 8L, 10L), # 8 unique values date = as.Date( c("2018-08-01", "2018-08-02", "2018-08-03", "2018-08-04", "2018-08-05", "2018-08-06", "2018-08-07", "2018-08-08", "2018-08-08", "2018-08-08", "2018-08-10", "2018-08-11", "2018-08-11")), date_num = as.numeric(as.Date( c("2018-08-01", "2018-08-02", "2018-08-03", "2018-08-04", "2018-08-05", "2018-08-06", "2018-08-07", "2018-08-08", "2018-08-08", "2018-08-08", "2018-08-10", "2018-08-11", "2018-08-11")))) vdata$off <- (1:nrow(vdata)) / nrow(vdata) resp2 <- 13:1 vweights <- rep(1, length.out=nrow(vdata)) vweights[1] <- 2 set.seed(2020) lognum.bool.ord.off <- earth(resp ~ log(num) + bool + ord + offset(off), degree=2, weights=vweights, data=vdata, pmethod="none", varmod.method="lm", nfold=2, ncross=3, trace=1) printf("summary(lognum.bool.ord.off)\n") print(summary(lognum.bool.ord.off)) cat("\nevimp(lognum.bool.ord.off)\n") print(evimp(lognum.bool.ord.off)) plotmo(lognum.bool.ord.off, do.par=2, level=.8, SHOWCALL=TRUE) plot(lognum.bool.ord.off, which=1, do.par=0) par(org.par) num.fac.sqrt.num.ord.bool <- earth(resp ~ num + int + fac + offset(off) + sqrt(num) + ord:bool - int, data=vdata, pmethod="none", trace=1) plotmo(num.fac.sqrt.num.ord.bool, SHOWCALL=TRUE) cat("\nevimp(num.fac.sqrt.num.ord.bool)\n") print(evimp(num.fac.sqrt.num.ord.bool)) printf("\n=== unusual formulas, compare to lm ===\n") lm1 <- lm(resp~ord+sqrt(as.numeric(fac)) + num+sqrt(num / 2)+I(2 * int)+date, data = vdata) # same formula terms as lm1 but in different order earth1 <- earth(resp~sqrt(as.numeric(fac)) + ord + date + num + sqrt(.5 * num)+I(int / .5), data = vdata, linpreds=TRUE, thresh=0, penalty=-1) cat("\nevimp(earth1)\n") print(evimp(earth1)) plotmo(lm1, SHOWCALL=TRUE) plotmo(earth1, SHOWCALL=TRUE) stopifnot(max(abs(sort(lm1$coef) - sort(earth1$coef))) < 1e-10) stopifnot((summary(lm1)$r.squared - earth1$rsq) < 1e-10) stopifnot(max(abs(predict(lm1, newdata=vdata[5,,drop=FALSE]) - predict(earth1, newdata=vdata[5,,drop=FALSE]))) < 1e-10) fac.sqrt <- earth(resp~sqrt(num)+fac, data = vdata, linpreds=TRUE, thresh=0, penalty=-1) fac.sqrt_ <- earth(resp~sqrt_num+fac, data = vdata, linpreds=TRUE, thresh=0, penalty=-1) cat("\nevimp(fac.sqrt)\n") print(evimp(fac.sqrt)) cat("\nevimp(fac.sqrt_)\n") print(evimp(fac.sqrt_)) # as.vector to remove names (which are slightly different: sqrt(num) vs sqrt_num stopifnot(identical(as.vector(fac.sqrt$coef), as.vector(fac.sqrt_$coef))) newdata.extra <- vdata[3:5,] # extra variables unused in the model newdata.extra$extra <- sqrt(newdata.extra[,1]) cat("\ncolnames(newdata.extra):", paste(colnames(newdata.extra)), "\n") newd <- vdata[3:5,c("num", "fac")] # only variables used in the formula model newd_ <- vdata[3:5,c("num", "sqrt_num", "fac")] # only variables used in the xy model stopifnot(identical(predict(fac.sqrt, newdata=newdata.extra), predict(fac.sqrt_, newdata=newd_))) stopifnot(identical(predict(fac.sqrt, newdata=newd), predict(fac.sqrt_, newdata=newd_))) stopifnot(identical(predict(fac.sqrt, newdata=newd), predict(fac.sqrt_, newdata=newd_))) stopifnot(identical(predict(fac.sqrt, newdata=newd), predict(fac.sqrt_, newdata=newd_))) stopifnot(max(abs(predict(fac.sqrt, newdata=newdata.extra) - predict(fac.sqrt_, newdata=newdata.extra))) < 1e-10) stopifnot(max(abs(predict(fac.sqrt, newdata=newdata.extra) - predict(fac.sqrt_, newdata=newdata.extra))) < 1e-10) printf("\n=== two response model ===\n") vdata.2resp <- vdata resp2 <- 13:1 vdata.2resp$resp2 <- resp2 earth.2resp <- earth(resp+resp2~num+sqrt(num), data=vdata.2resp, weights=vweights, trace=1, linpreds=TRUE, thresh=0, penalty=-1) printf("\nsummary(earth.2resp)\n") print(summary(earth.2resp)) cat("\nevimp(earth.2resp)\n") print(evimp(earth.2resp)) par(mfrow = c(2, 2), mar = c(3, 3, 3, 1), mgp = c(1.5, 0.5, 0), oma=c(0,0,4,0)) # for formula models, plotmo plots a sinle plot for the effect of num plotmo(earth.2resp, nresp=1, do.par=0, main="earth.2resp nresp1") title <- paste( "two-response model: resp+resp2~num+sqrt(num)\n", "the top row is for earth.formula models: the combined effect of num and sqrt(num) is plotted together\n", "the bottom row is for an earth.default model: num and sqrt(num) are plotted separately") title(title, outer=TRUE, cex=.6) plotmo(earth.2resp, nresp=2, do.par=0, main="earth.2resp nresp2") # put two response data mats into matrix form for earth.default and for lm xmat <- vdata[,c("num", "sqrt_num"), drop=FALSE] colnames(xmat) <- c("num", "sqrt(num)") xmat <- as.matrix(xmat) ymat <- vdata[, "resp", drop=FALSE] ymat$resp2 <- resp2 ymat <- as.matrix(ymat) earthxy.2resp <- earth(xmat, ymat, weights=vweights, trace=1, linpreds=TRUE, thresh=0, penalty=-1) printf("\nsummary(earthxy.2resp)\n") print(summary(earthxy.2resp)) cat("\nevimp(earthxy.2resp)\n") print(evimp(earthxy.2resp)) # for xy models, plotmo plots a separate plots for the effect of num and sqrt(num) plotmo(earthxy.2resp, nresp=1, do.par=0) # plotmo(earthxy.2resp, nresp=2, do.par=0) stopifnot(identical(earth.2resp$coeff, earthxy.2resp$coeff)) lm.2resp <- lm(ymat~xmat, weights=vweights) printf("\nsummary(lm.2resp)\n") print(summary(lm.2resp)) options(warn=2) # treat warnings as errors expect.err(try(plotmo(lm.2resp, nresp=1)), "the variable on the right side of the formula is a matrix or data.frame") options(warn=1) # print warnings as they occur # check that lm and earth coeffs are the same # need order() below because coeffs appear in different row order in the coeff mat earth.2resp.order <- order(earth.2resp$coeff[,1]) lm.order <- order(lm.2resp$coeff[,1]) stopifnot(max(abs(earth.2resp$coeff[earth.2resp.order] - lm.2resp$coeff[lm.order])) < 1e-10) printf("\n=== test glm() with spaced.bx ===\n") # glm requires response to be a factor (or two columns) spaced.bx.fac <- spaced.bx spaced.bx.fac$`surv fac` <- factor(ifelse(spaced.bx$`Survived = YES`, "yes", "no"), levels = c("yes", "no")) spaced.bx.fac$`Survived = YES` <- NULL glm.spaced.bx <- glm(`surv fac` ~ ., data=spaced.bx.fac, family="binomial") printf("summary(glm.spaced.bx):\n") print(summary(glm.spaced.bx)) plotmo(glm.spaced.bx, do.par=2) plotres(glm.spaced.bx, which=3, do.par=0, info=TRUE, main="plotres(glm.spaced.bx,which=3") # TODO why is Residuals-Vs-Fitted plot different for plotres and plot for glm models? plot(glm.spaced.bx, which=1, caption="plot(glm.spaced.bx, which=1)") par(org.par) plotmo(glm.spaced.bx, all2=TRUE, degree2=c("sexmale", "pclass"), SHOW.CALL=TRUE, do.par=2) plotmo(glm.spaced.bx, degree1=0, all2=TRUE, degree2=c("sexmale", "age"), do.par=0) par(org.par) # TODO I think plot(glm.spaced.bx) doesn't restore the graphics params? printf("\n=== test formulas which have a rhs variable which a matrix ===\n") # This also tests that earth's naming of variables is the same as lm for such rhs variables # # TODO plotmo fails when rhs variable is a matrix --- would be nice to fix that x_ <- etitanic[,"age",drop=FALSE] x_$pclass <- etitanic$pclass x_$pclass <- as.numeric(etitanic$pclass) x_ <- as.matrix(x_) y_ <- as.matrix(as.numeric(etitanic[,"survived"])) earthxy.rhs.mat <- earth(x_, y_, degree=2, trace=1) print(summary(earthxy.rhs.mat)) cat("\nevimp(earthxy.rhs.mat)\n") print(evimp(earthxy.rhs.mat)) cat("\nearthxy.rhs.mat$modvars\n") print(earthxy.rhs.mat$modvars) plotmo(earthxy.rhs.mat, SHOWCALL=TRUE) # ok earth.rhs.mat <- earth(y_ ~ x_, degree=2, trace=1) print(summary(earth.rhs.mat)) cat("\nevimp(earth.rhs.mat)\n") print(evimp(earth.rhs.mat)) cat("\nearth.rhs.mat$modvars\n") print(earth.rhs.mat$modvars) stopifnot(max(abs(earthxy.rhs.mat$coeff - earth.rhs.mat$coeff)) < 1e-15) expect.err(try(plotmo(earth.rhs.mat)), # Warning: the variable on the right side of the formula is a matrix or data.frame "model.frame.default could not interpret the data passed to get.earth.x from model.matrix.earth from predict.earth") expect.err(try(plotmo(earth.rhs.mat, all1=TRUE)), # still fails "model.frame.default could not interpret the data passed to get.earth.x from model.matrix.earth from predict.earth") lm.rhs.mat <- lm(y_ ~ x_) print(summary(lm.rhs.mat)) expect.err(try(plotmo(lm.rhs.mat)), # Warning: the variable on the right side of the formula is a matrix or data.frame "predict returned the wrong length (got 1046 but expected 50)") expect.err(try(plotmo(lm.rhs.mat, all1=TRUE)), # still fails "predict returned the wrong length (got 1046 but expected 50)") earth1.rhs.mat <- earth(y_ ~ x_, linpreds=TRUE, thresh=0, penalty=-1) # degree1 cat("\nevimp(earth1.rhs.mat)\n") print(evimp(earth1.rhs.mat)) options(warn=2) expect.err(try(plotmo(earth.rhs.mat)), "the variable on the right side of the formula is a matrix or data.frame") expect.err(try(plotmo(earth.rhs.mat, all1=TRUE)), # still fails "the variable on the right side of the formula is a matrix or data.frame") options(warn=1) stopifnot(max(abs(sort(lm.rhs.mat$coeff) - sort(earth1.rhs.mat$coeff))) < 1e-12) stopifnot(sort(rownames(lm.rhs.mat$coeff)) == sort(rownames(earth1.rhs.mat$coeff))) x_nonames <- x_ colnames(x_nonames) <- NULL lm.rhs.nonames <- lm(y_ ~ x_nonames) print(summary(lm.rhs.nonames)) expect.err(try(plotmo(lm.rhs.nonames)), # Warning: the variable on the right side of the formula is a matrix or data.frame "predict returned the wrong length (got 1046 but expected 50)") expect.err(try(plotmo(lm.rhs.nonames, all1=TRUE)), # still fails "predict returned the wrong length (got 1046 but expected 50)") earth1.rhs.nonames <- earth(y_ ~ x_nonames, linpreds=TRUE, thresh=0, penalty=-1) # degree1 print(summary(earth1.rhs.nonames)) cat("\nevimp(earth1.rhs.nonames)\n") print(evimp(earth1.rhs.nonames)) options(warn=2) expect.err(try(plotmo(earth1.rhs.nonames)), # Warning: the variable on the right side of the formula is a matrix or data.frame "the variable on the right side of the formula is a matrix or data.frame") expect.err(try(plotmo(earth1.rhs.nonames, all1=TRUE)), # still fails "the variable on the right side of the formula is a matrix or data.frame") options(warn=1) stopifnot(max(abs(sort(lm.rhs.nonames$coeff) - sort(earth1.rhs.nonames$coeff))) < 1e-12) stopifnot(sort(rownames(lm.rhs.nonames$coeff)) == sort(rownames(earth1.rhs.nonames$coeff))) printf("\n=== test handling consecutive '-' in formula ===\n") options(warn=2) lm.consec.minus <- lm(Volume~.--Girth, data=trees) # note double -- expect.err(try(plotmo(lm.consec.minus)), "Consecutive '-' in formula may cause problems") earth.consec.minus <- earth(Volume~.--Girth, data=trees) # note double -- cat("\nsummary(earth.consec.minus)\n") print(summary(earth.consec.minus)) cat("\nevimp(earth.consec.minus)\n") print(evimp(earth.consec.minus)) expect.err(try(plotmo(earth.consec.minus)), "Consecutive '-' in formula may cause problems") options(warn=1) printf("\n=== test rpart() with spaced.bx ===\n") library(rpart.plot) rpart.mod <- rpart(`Survived = YES` ~ ., data=spaced.bx) printf("\nprint(rpart.rules(rpart.mod))\n") print(rpart.rules(rpart.mod)) set.seed(2020) plotmo(rpart.mod, do.par=2, degree1=c("sexmale", "pclass3rd"), degree2=2, pt.col="red") plotres(rpart.mod, do.par=0, which=c(1,3)) par(org.par) printf("\n=== tibble, class \"Date\", and ndiscrete ===\n") library(tibble) library(lubridate) tib1 <- tibble(y = c(1, 1, 2, 3), # even number of variables bool = c(F, F, F, T), date = c(ymd('2018-08-01'), ymd('2018-08-02'), ymd('2018-08-03'), ymd('2018-08-03'))) cat("class tib1$date: ", class(tib1$date), "\n") mod.tib1 <- lm(y ~ ., data = tib1) plotmo(mod.tib1, col.response=2, all2=TRUE, ticktype="d", do.par=2, caption="mod.tib1: Dates ndiscrete=default 5") plotmo(mod.tib1, col.response=2, degree1=0, all2=TRUE, ticktype="d", do.par=0, theta=-45) par(org.par) plotmo(mod.tib1, col.response=2, all2=TRUE, ticktype="d", do.par=2, ndiscrete=2, caption="mod.tib1: Dates ndiscrete=2") plotmo(mod.tib1, col.response=2, degree1=0, all2=TRUE, ticktype="d", do.par=0, theta=-45, ndiscrete=2) par(org.par) plotmo(mod.tib1, col.response=2, all2=TRUE, ticktype="d", do.par=2, ndiscr=1, caption="mod.tib1: Dates ndiscrete=1") plotmo(mod.tib1, col.response=2, degree1=0, all2=TRUE, ticktype="d", do.par=0, theta=-45, ndiscrete=2) par(org.par) tib2 <- tibble(y = c(1, 1, 2, 3, 4), # odd number of variables bool = c(F, F, F, T, T), date = c(ymd('2018-08-01'), ymd('2018-08-02'), ymd('2018-08-03'), ymd('2018-08-03'), ymd('2018-08-04'))) mod.tib2 <- lm(y ~ ., data = tib2) plotmo(mod.tib2, col.response=2, all2=TRUE, ticktype="d", do.par=2, caption="mod.tib2: Dates ndiscrete=default 5") plotmo(mod.tib2, col.response=2, degree1=0, all2=TRUE, ticktype="d", do.par=0, theta=-45) par(org.par) plotmo(mod.tib2, col.response=2, all2=TRUE, ticktype="d", do.par=2, ndiscrete=2, caption="mod.tib2: Dates ndiscrete=2") plotmo(mod.tib2, col.response=2, degree1=0, all2=TRUE, ticktype="d", do.par=0, theta=-45, ndiscrete=2) par(org.par) plotmo(mod.tib2, col.response=2, all2=TRUE, ticktype="d", do.par=2, ndiscr=1, caption="mod.tib2: Dates ndiscrete=1") plotmo(mod.tib2, col.response=2, degree1=0, all2=TRUE, ticktype="d", do.par=0, theta=-45, ndiscrete=2) par(org.par) source("test.epilog.R") plotmo/inst/slowtests/test.parsnip.R0000644000176200001440000002740614564116107017403 0ustar liggesusers# test.parsnip.R: test the parsnip package with earth and other models # Stephen Milborrow Sep 2020 Petaluma source("test.prolog.R") options(warn=1) # print warnings as they occur library(earth) cat("loading parsnip libraries\n") # these libraries take several seconds to load library(tidymodels, quietly=TRUE, verbose=FALSE) library(timetk) library(lubridate) cat("loaded parsnip libraries\n") cat("parsnip version:", as.character(packageVersion("parsnip")[[1]]), "\n") vdata <- data.frame( resp = 1:23, bool = c(F, F, F, F, F, T, T, T, T, T, T, T, T, F, F, T, T, T, T, T, T, T, T), ord = ordered(c("ORD1", "ORD1", "ORD1", "ORD1", "ORD1", "ORD1", "ORD1", "ORD3", "ORD1", "ORD2", "ORD2", "ORD2", "ORD2", "ORD2", "ORD2", "ORD2", "ORD3", "ORD3", "ORD3", "ORD2", "ORD2", "ORD2", "ORD2"), levels=c("ORD1", "ORD3", "ORD2")), fac = as.factor(c("FAC1", "FAC1", "FAC1", "FAC2", "FAC2", "FAC2", "FAC3", "FAC1", "FAC1", "FAC1", "FAC2", "FAC2", "FAC2", "FAC2", "FAC2", "FAC2", "FAC3", "FAC3", "FAC3", "FAC1", "FAC3", "FAC3", "FAC3")), str = c("STR1", "STR1", "STR1", # WILL BE TREATED LIKE A FACTOR "STR1", "STR1", "STR1", "STR2", "STR2", "STR2", "STR3", "STR3", "STR2", "STR3", "STR2", "STR3", "STR2", "STR3", "STR3", "STR3", "STR3", "STR3", "STR3", "STR3"), num = c(1, 9, 2, 3, 14, 5, 6, 4, 5, 6.5, 3, 6, 5, 3, 4, 5, 6, 4, 5, 16.5, 3, 16, 15), sqrt_num = sqrt( c(1, 9, 2, 3, 14, 5, 6, 4, 5, 6.5, 3, 6, 5, 3, 4, 5, 6, 4, 5, 16.5, 3, 16, 15)), int = c(1L, 1L, 3L, 3L, 4L, 4L, 3L, 5L, 3L, 6L, 7L, 8L, 10L, 13L, 14L, 3L, 13L, 5L, 13L, 16L, 17L, 18L, 11L), date = as.Date( c("2018-08-01", "2018-08-02", "2018-08-03", "2018-08-04", "2018-08-05", "2018-08-06", "2018-08-07", "2018-08-08", "2018-08-08", "2018-08-10", "2018-08-10", "2018-08-11", "2018-08-11", "2018-08-11", "2018-08-12", "2018-08-13", "2018-08-10", "2018-08-15", "2018-08-17", "2018-08-04", "2018-08-19", "2018-08-03", "2018-08-18")), date_num = as.numeric(as.Date( c("2018-08-01", "2018-08-02", "2018-08-03", "2018-08-04", "2018-08-05", "2018-08-06", "2018-08-07", "2018-08-08", "2018-08-08", "2018-08-10", "2018-08-10", "2018-08-11", "2018-08-11", "2018-08-11", "2018-08-12", "2018-08-13", "2018-08-10", "2018-08-15", "2018-08-17", "2018-08-04", "2018-08-19", "2018-08-03", "2018-08-18")))) set.seed(2020) splits <- initial_time_split(vdata, prop=.9) #--- lm ---------------------------------------------------------------------- lm1 <- lm(resp~num+fac:int+date+ord+str, data=training(splits)) cat("lm1:\n") print(summary(lm1)) set.seed(2020) lmpar <- linear_reg(mode = "regression") %>% set_engine("lm") %>% fit(resp~num+fac:int+date+ord+str, data = training(splits)) stopifnot(identical(lm1$coeff, lmpar$fit$coeff)) predict.lm1 <- predict(lm1, testing(splits)) predict.lmpar <- lmpar %>% predict(testing(splits)) stopifnot(all(predict.lm1 == predict.lmpar)) par(mfrow = c(3, 3), mar = c(3, 3, 3, 1), mgp = c(1.5, 0.5, 0)) plotmo(lm1, do.par=2, SHOWCALL=TRUE) plotres(lm1, which=c(3,1), do.par=FALSE) plotmo(lmpar, do.par=2, SHOWCALL=TRUE) plotres(lmpar, which=c(3,1), do.par=FALSE) plotmo(lmpar$fit, do.par=2, SHOWCALL=TRUE) plotres(lmpar$fit, which=c(3,1), do.par=FALSE) par(org.par) lmpar.sqrtnum <- linear_reg(mode = "regression") %>% set_engine("lm") %>% fit(resp~sqrt(num), data = training(splits)) #$$ TODO # expect.err(try(plotmo(lmpar.sqrtnum)), # "cannot get the original model predictors") #--- earth ------------------------------------------------------------------- # note that sqrt(num) is ok, unlike parsnip models for lm and rpart earth1 <- earth(resp~sqrt(num)+int+ord:bool+fac+str+date, degree=2, data=training(splits), pmethod="none") cat("earth1:\n") print(summary(earth1)) set.seed(2020) earthpar <- mars(mode = "regression", prune_method="none", prod_degree=2) %>% set_engine("earth") %>% fit(resp~sqrt(num)+int+ord:bool+fac+str+date, data = training(splits)) cat("earthpar:\n") print(earthpar) cat("summary(earthpar$fit)\n") print(summary(earthpar$fit)) stopifnot(identical(earth1$coeff, earthpar$fit$coeff)) predict.earth1 <- predict(earth1, testing(splits)) predict.earthpar <- earthpar %>% predict(testing(splits)) stopifnot(all(predict.earth1 == predict.earthpar)) par(mfrow = c(3, 3), mar = c(3, 3, 3, 1), mgp = c(1.5, 0.5, 0)) plotmo(earth1, do.par=2, pt.col=3, SHOWCALL=TRUE) set.seed(2020) plotres(earth1, which=c(1,3), do.par=FALSE, pt.col=3, legend.pos="topleft") par(org.par) par(mfrow = c(3, 3), mar = c(3, 3, 3, 1), mgp = c(1.5, 0.5, 0)) plotmo(earthpar, do.par=2, pt.col=3, SHOWCALL=TRUE) set.seed(2020) plotres(earthpar, which=c(1,3), do.par=FALSE, pt.col=3, legend.pos="topleft") par(org.par) par(mfrow = c(3, 3), mar = c(3, 3, 3, 1), mgp = c(1.5, 0.5, 0)) plotmo(earthpar$fit, do.par=2, pt.col=3, SHOWCALL=TRUE) set.seed(2020) plotres(earthpar$fit, which=c(1,3), do.par=FALSE, pt.col=3, legend.pos="topleft") par(org.par) #--- rpart ------------------------------------------------------------------- library(rpart) library(rpart.plot) rpart1 <- rpart(resp~num+fac+int+date+ord+str, data=training(splits), control=rpart.control(minsplit=1, cp=.0001)) cat("\nrpart.rules(rpart1)\n") print(rpart.rules(rpart1)) set.seed(2020) # TODO note need of model=TRUE below (needed only for further processing with e.g. plotmo) rpartpar <- decision_tree(mode = "regression", min_n=1, cost_complexity=.0001) %>% set_engine("rpart", model=TRUE) %>% fit(resp~num+fac+int+date+ord+str, data = training(splits)) cat("\nrpart.rules(rpartpar$fit)\n") print(rpart.rules(rpartpar$fit)) predict.rpart1 <- predict(rpart1, testing(splits)) predict.rpartpar <- rpartpar %>% predict(testing(splits)) stopifnot(all(predict.rpart1 == predict.rpartpar)) par(mfrow = c(3, 3), mar = c(3, 3, 3, 1), mgp = c(1.5, 0.5, 0)) plotmo(rpart1, do.par=2, SHOWCALL=TRUE, trace=0) plotres(rpart1, which=c(3,1), do.par=FALSE) plotmo(rpartpar, do.par=2, SHOWCALL=TRUE, trace=0) plotres(rpartpar, which=c(3,1), do.par=FALSE) plotmo(rpartpar$fit, do.par=2, SHOWCALL=TRUE) plotres(rpartpar$fit, which=c(3,1), do.par=FALSE) par(org.par) # TODO note that this differs from the above rpart model in that we don't use model=TRUE rpartpar.nosavemodel <- decision_tree(mode = "regression", min_n=1, cost_complexity=.0001) %>% set_engine("rpart") %>% fit(resp~num+fac+int+date+str, data = training(splits)) cat("\nrpart.rules(rpartpar.nosavemodel$fit)\n") options(warn=2) expect.err(try(rpart.rules(rpartpar.nosavemodel$fit)), "Cannot retrieve the data used to build the model") options(warn=1) expect.err(try(plotmo(rpartpar.nosavemodel)), "Cannot plot parsnip rpart model: need model=TRUE in call to rpart") rpart.sqrtnum <- decision_tree(mode = "regression", min_n=1, cost_complexity=.0001) %>% set_engine("rpart", model=TRUE) %>% fit(resp~sqrt(num)+fac+int+date+ord+str, data = training(splits)) cat("\nrpart.rules(rpart.sqrtnum$fit)\n") print(rpart.rules(rpart.sqrtnum$fit)) # ok #$$ TODO # expect.err(try(plotmo(rpart.sqrtnum)), # "cannot get the original model predictors") #----------------------------------------------------------------------------------- # Test fix for github bug report https://github.com/tidymodels/parsnip/issues/341 # (fixed Sep 2020) cat("===m750a first example===\n") set.seed(2020) m750a <- m4_monthly %>% filter(id == "M750") %>% select(-id) print(m750a) # a tibble set.seed(2020) splits_a <- initial_time_split(m750a, prop = 0.9) earth_m750a <- earth(log(value) ~ as.numeric(date) + month(date, label = TRUE), data = training(splits_a), degree=2) print(summary(earth_m750a)) set.seed(2020) model_m750a <- mars(mode = "regression", prod_degree=2) %>% set_engine("earth") %>% fit(log(value) ~ as.numeric(date) + month(date, label = TRUE), data = training(splits_a)) print(summary(model_m750a$fit)) stopifnot(identical(earth_m750a$coeff, model_m750a$fit$coeff)) predict_earth_m750a <- predict(earth_m750a, newdata=testing(splits_a)[1:3,]) predict_m750a <- model_m750a %>% predict(testing(splits_a)[1:3,]) stopifnot(max(c(9.238049628, 9.240535151, 9.232361834) - predict_m750a) < 1e-8) stopifnot(max(predict_earth_m750a - predict_m750a) < 1e-20) par(mfrow = c(2, 2), mar = c(3, 3, 3, 1), mgp = c(1.5, 0.5, 0)) set.seed(2020) plotmo(model_m750a, trace=2, do.par=FALSE, pt.col="green", main="model_m750a", SHOWCALL=TRUE) set.seed(2020) plotmo(model_m750a$fit, trace=1, do.par=FALSE, pt.col="green", main="model_m750a$fit", SHOWCALL=TRUE) set.seed(2020) plotmo(earth_m750a, trace=1, do.par=FALSE, pt.col="green", main="earth_m750a", SHOWCALL=TRUE) par(org.par) cat("===m750a second example===\n") set.seed(2020) m750b <- m4_monthly %>% filter(id == "M750") %>% select(-id) %>% rename(date2 = date) print(m750b) # tibble set.seed(2020) splits_b <- initial_time_split(m750b, prop = 0.9) set.seed(2020) model_m750b <- mars(mode = "regression") %>% set_engine("earth") %>% fit(log(value) ~ as.numeric(date2) + month(date2, label = TRUE), data = training(splits_b)) # new data that only contains the feature "date" as a predictor future_data <- m750b %>% future_frame(date2, .length_out = "3 years") print(future_data) # a tibble with a single column of class "Date" stopifnot(class(future_data[,1,drop=TRUE]) == "Date") predict_m750a <- model_m750b %>% predict(new_data = future_data) par(mfrow = c(2, 2), mar = c(3, 3, 3, 1), mgp = c(1.5, 0.5, 0)) set.seed(2020) plotmo(model_m750b, trace=2, do.par=FALSE, pt.col="green", main="model_m750b", SHOWCALL=TRUE) set.seed(2020) plotmo(model_m750b$fit, trace=1, do.par=FALSE, pt.col="green", main="model_m750b$fit", SHOWCALL=TRUE) par(org.par) #----------------------------------------------------------------------------------- # multiple response earth model data(etitanic) etit <- etitanic etit$survived <- factor(ifelse(etitanic$survived == 1, "yes", "no"), levels = c("yes", "no")) etit$notsurvived <- factor(ifelse(etitanic$survived == 0, "notsurvived", "survived"), levels = c("notsurvived", "survived")) set.seed(2020) earth_tworesp <- earth(survived + notsurvived ~ ., data=etit, degree=2) print(summary(earth_tworesp)) # TODO following commented out because parsnip (version 0.1.5) says "'+' not meaningful for factors" # set.seed(2020) # mars_tworesp <- mars(mode = "regression", prod_degree=2) %>% # set_engine("earth") %>% # fit(survived + notsurvived~., data=etit) # print(summary(mars_tworesp)) # print(summary(mars_tworesp$fit)) # # stopifnot(identical(earth_tworesp$coeff, mars_tworesp$fit$coeff)) # # predict.earth_tworesp <- predict(earth_tworesp, etit[3:6,]) # predict.mars_tworesp <- mars_tworesp %>% predict(etit[3:6,]) # stopifnot(all(predict.earth_tworesp == predict.mars_tworesp)) # # plotmo(earth_tworesp, trace=0, nresponse=1, SHOWCALL=TRUE) # plotmo(mars_tworesp, trace=0, nresponse=1, SHOWCALL=TRUE) # plotmo(mars_tworesp, trace=0, nresponse=2, SHOWCALL=TRUE) source("test.epilog.R") plotmo/inst/slowtests/test.modguide.R0000644000176200001440000003323113725307664017525 0ustar liggesusers# test.modguide.bat: test model1 and model2 (linmod examples) in modguide.pdf source("test.prolog.R") options(warn=1) # print warnings as they occur almost.equal <- function(x, y, max=1e-8) { stopifnot(max >= 0 && max < .01) length(x) == length(y) && max(abs(x - y)) < max } # check that fit model matches ref lm model in all essential details check.lm <- function(fit, ref, newdata=trees[3:5,], check.coef.names=TRUE, check.casenames=TRUE, check.newdata=TRUE) { check.names <- function(fit.names, ref.names) { if(check.casenames && # lm always adds rownames even if "1", "2", "3" # this seems wasteful of resources, so linmod doesn't do this !is.null(fit.names) && !identical(fit.names, ref.names)) { print(fit.names) print(ref.names) stop(deparse(substitute(fit.names)), " != ", deparse(substitute(ref.names))) } } cat("check ", deparse(substitute(fit)), " vs ", deparse(substitute(ref)), "\n", sep="") stopifnot(coef(fit) == coef(ref)) if(check.coef.names) stopifnot(identical(names(coef(fit)), names(coef(ref)))) stopifnot(identical(dim(fit$coefficients), dim(ref$coefficients))) stopifnot(length(fit$coefficients) == length(ref$coefficients)) stopifnot(almost.equal(fit$coefficients, ref$coefficients)) stopifnot(identical(dim(fit$residuals), dim(ref$residuals))) stopifnot(length(fit$residuals) == length(ref$residuals)) stopifnot(almost.equal(fit$residuals, ref$residuals)) stopifnot(identical(dim(fit$fitted.values), dim(ref$fitted.values))) stopifnot(length(fit$fitted.values) == length(ref$fitted.values)) stopifnot(almost.equal(fit$fitted.values, ref$fitted.values)) if(!is.null(fit$vcov) && !is.null(ref$vcov)) { stopifnot(identical(dim(fit$vcov), dim(ref$vcov))) stopifnot(length(fit$vcov) == length(ref$vcov)) stopifnot(almost.equal(fit$vcov, ref$vcov)) } ref.sigma <- ref$sigma if(is.null(ref.sigma)) # in lm models, sigma is only available from summary() ref.sigma <- summary(ref)$sigma stopifnot(almost.equal(fit$sigma, ref.sigma)) stopifnot(almost.equal(fit$df, ref$df)) stopifnot(almost.equal(fitted(fit), fitted(ref))) check.names(names(fitted(fit)), names(fitted(ref))) stopifnot(almost.equal(residuals(fit), residuals(ref))) check.names(names(residuals(fit)), names(residuals(ref))) stopifnot(almost.equal(predict(fit), predict(ref))) check.names(names(predict(fit)), names(predict(ref))) if(check.newdata) { stopifnot(almost.equal(predict(fit, newdata=newdata), predict(ref, newdata=newdata))) check.names(names(predict(fit, newdata=newdata)), names(predict(ref, newdata=newdata))) } } ### Model 1: original code from Friedrich Leisch tutorial source("modguide.model1.R") cat("==example issues with predict with functions in the tutorial\n") data(trees) tr <- trees # trees data but with rownames rownames(tr) <- paste("tree", 1:nrow(trees), sep="") fit1 <- linmod(Volume~., data=tr) expect.err(try(predict(fit1, newdata=data.frame(Girth=10, Height=80))), "object 'Volume' not found") expect.err(try(predict(fit1, newdata=as.matrix(tr[1:3,]))), "'data' must be a data.frame, not a matrix or an array") library(plotmo) expect.err(try(plotmo(fit1)), "object 'Volume' not found") fit2 <- linmod(cbind(1, tr[,1:2]), tr[,3]) stopifnot(coef(fit1) == coef(fit2)) # following fail because newdata is a data.frame not a matrix expect.err(try(predict(fit2, newdata=tr[,1:2])), "requires numeric/complex matrix/vector arguments") expect.err(try(predict(fit2, newdata=data.frame(Girth=10, Height=80))), "requires numeric/complex matrix/vector arguments") expect.err(try(predict(fit2, newdata=as.matrix(data.frame(Girth=10, Height=80)))), "non-conformable arguments") expect.err(try(plotmo(fit2)), "requires numeric/complex matrix/vector arguments") cat("==a plotmo method function can deal with the issues\n") plotmo.predict.linmod <- function(object, newdata, ...) { if(is.null(object$formula)) # x,y interface? plotmo:::plotmo.predict.defaultm(object, newdata, ...) # pass matrix not data.frame else { # add dummy response column to newdata newdata[[as.character(as.list(object$formula)[[2]])]] <- 1 plotmo:::plotmo.predict.default(object, newdata, ...) } } plotmo(fit1, pt.col=2, caption="fit1 with original tutorial code and plotmo.predict.linmod") plotmo(fit2, pt.col=2, caption="fit2 with original tutorial code and plotmo.predict.linmod") remove(plotmo.predict.linmod) ### Model 2: minimal changes version for vignette "Guidelines for S3 Regression Models" source("modguide.model2.R") cat("==check that example issues with functions in the tutorial have gone\n") fit1.form <- linmod(Volume~., data=tr) cat("==print(summary(fit1.form))\n") print(summary(fit1.form)) stopifnot(abs(predict(fit1.form, newdata=data.frame(Girth=10, Height=80)) - 16.234045) < 1e-5) stopifnot(sum(abs(predict(fit1.form, newdata=as.matrix(tr[1:3,])) - c(4.8376597, 4.5538516, 4.8169813))) < 1e-5) lm.tr <- lm(Volume~., data=tr) check.lm(fit1.form, lm.tr) fit1.mat <- linmod(tr[,1:2], tr[,3]) # note no need for intercept term cat("==print(summary(fit1.mat))\n") print(summary(fit1.mat)) stopifnot(abs(predict(fit1.mat, newdata=data.frame(Girth=10, Height=80)) - 16.234045) < 1e-5) stopifnot(sum(abs(predict(fit1.mat, newdata=tr[1:3,1:2]) - c(4.8376597, 4.5538516, 4.8169813))) < 1e-5) stopifnot(abs(predict(fit1.mat, newdata=as.matrix(data.frame(Girth=10, Height=80))) - 16.234045) < 1e-5) check.lm(fit1.mat, lm.tr, newdata=trees[3:5,1:2]) cat("==example plots\n") library(plotmo) data(trees) fit1.form <- linmod(Volume~., data=trees) print(fit1.form) print(summary(fit1.form)) fit1.mat <- linmod(trees[,1:2], trees[,3]) print(fit1.mat) print(summary(fit1.mat)) plotmo(fit1.form) plotmo(fit1.mat) plotres(fit1.form) plotres(fit1.mat) cat("==test model building with different numeric args\n") x <- tr[,1:2] y <- tr[,3] fit2.mat <- linmod(x, y) check.lm(fit2.mat, lm.tr, newdata=trees[3:5,1:2]) # check consistency with lm expect.err(try(linmod(y~x)), "invalid type (list) for variable 'x'") expect.err(try(lm(y~x)), "invalid type (list) for variable 'x'") fit3.mat <- linmod(as.matrix(x), as.matrix(y)) check.lm(fit3.mat, lm.tr, newdata=trees[3:5,1:2]) fit4.form <- linmod(y ~ as.matrix(x)) lm4 <- linmod(y ~ as.matrix(x)) check.lm(fit4.form, lm4) stopifnot(coef(fit4.form) == coef(lm.tr), gsub("as.matrix(x)", "", names(coef(fit4.form)), fixed=TRUE) == names(coef(lm.tr))) xm <- as.matrix(x) fit5.form <- linmod(y ~ xm) lm5 <- linmod(y ~ xm) check.lm(fit5.form, lm5) stopifnot(coef(fit5.form) == coef(lm.tr), gsub("xm", "", names(coef(fit5.form)), fixed=TRUE) == names(coef(lm.tr))) cat("==test correct use of global x1 and y1\n") x1 <- tr[,1] y1 <- tr[,3] linmod1 <- linmod(y1~x1) fit6.mat <- linmod(x1, y1) check.lm(fit6.mat, linmod1, newdata=x1[3:5], check.newdata=FALSE, # TODO needed because linmod1 ignores newdata(!) check.coef.names=FALSE, check.casenames=FALSE) print(predict(fit6.mat, newdata=x1[3:5])) stopifnot(almost.equal(predict(fit6.mat, newdata=x1[3]), 7.63607739644657)) # production version only: # stopifnot(coef(fit6.mat) == coef(linmod1), # names(coef(fit6.mat)) == c("(Intercept)", "V1")) # names(coef(linmod1) are "(Intercept)" "x1" fit6.form <- linmod(y1~x1) check.lm(fit6.form, linmod1) cat("==check integer input (sibsp is an integer) \n") library(earth) # for etitanic data data(etitanic) tit <- etitanic[seq(1, nrow(etitanic), by=60), ] # small set of data for tests (18 cases) tit$survived <- tit$survived != 0 # convert to logical rownames(tit) <- paste("pas", 1:nrow(tit), sep="") cat(paste(colnames(tit), "=", sapply(tit, class), sep="", collapse=", "), "\n") fit7.mat <- linmod(tit$age, tit$sibsp) lm7 <- lm.fit(cbind(1, tit$age), tit$sibsp) stopifnot(coef(fit7.mat) == coef(lm7)) # coef names will differ fit7.form <- linmod(sibsp~age, data=tit) lm7.form <- lm(sibsp~age, data=tit) check.lm(fit7.form, lm7.form, newdata=tit[3:5,]) fit8.mat <- linmod(tit$sibsp, tit$age) lm8 <- lm.fit(cbind(1, tit$sibsp), tit$age) stopifnot(coef(fit8.mat) == coef(lm8)) # coef names will differ fit8.form <- linmod(age~sibsp, data=tit) lm8.form <- lm(age~sibsp, data=tit) check.lm(fit8.form, lm8.form, newdata=tit[3:5,]) # drop=FALSE so response is a data frame fit1a.mat <- linmod(trees[,1:2], trees[, 3, drop=FALSE]) print(fit1a.mat) print(summary(fit1.mat)) plotres(fit1a.mat) # plot caption shows response name "Volume" cat("==test model building with different non numeric args\n") library(earth) # for etitanic data data(etitanic) tit <- etitanic[seq(1, nrow(etitanic), by=60), ] # small set of data for tests (18 cases) tit$survived <- tit$survived != 0 # convert to logical rownames(tit) <- paste("pas", 1:nrow(tit), sep="") cat(paste(colnames(tit), "=", sapply(tit, class), sep="", collapse=", "), "\n") lm9 <- lm(survived~., data=tit) fit9.form <- linmod(survived~., data=tit) check.lm(fit9.form, lm9, newdata=tit[3:5,]) options(warn=2) # treat warnings as errors # factors in x expect.err(try(linmod(tit[,c(1,3,4,5,6)], tit[,"survived"])), "NAs introduced by coercion") options(warn=1) # print warnings as they occur expect.err(try(linmod(tit[,c(1,3,4,5,6)], tit[,"survived"])), "NA/NaN/Inf in foreign function call (arg 1)") options(warn=2) # treat warnings as errors expect.err(try(lm(pclass~., data=tit)), "using type = \"numeric\" with a factor response will be ignored") # minimal version expect.err(try(linmod(pclass~., data=tit)), "(converted from warning) NAs introduced by coercion") expect.err(try(linmod(tit$pclass, tit$survived)), "(converted from warning) NAs introduced by coercion") # # production version # expect.err(try(linmod(pclass~., data=tit)), "'y' is not numeric or logical") options(warn=1) lm10 <- lm(pclass~., data=tit) # will give warnings fit10.form <- linmod(as.numeric(pclass)~., data=tit) stopifnot(coef(fit10.form) == coef(lm10)) stopifnot(names(coef(fit10.form)) == names(coef(lm10))) # check.lm(fit10.form, lm10) # fails because lm10 fitted is all NA # production version: (minimal version just gives warnings and builds lousy model) # expect.err(try(linmod(pclass~., data=tit)), "'y' is not numeric or logical") # expect.err(try(linmod(tit[,-1], tit[,1])), "'y' is not numeric or logical") # expect.err(try(linmod(1:10, paste(1:10))), "'y' is not numeric or logical") fit10a.form <- linmod(survived~pclass, data=tit) lm10a <- lm(survived~pclass, data=tit) check.lm(fit10a.form, lm10a, newdata=tit[3:5,]) expect.err(try(linmod(paste(1:10), 1:10)), "requires numeric/complex matrix/vector arguments") lm11 <- lm(as.numeric(pclass)~., data=tit) fit11.form <- linmod(as.numeric(pclass)~., data=tit) check.lm(fit11.form, lm11, newdata=tit[3:5,]) cat("==data.frame with strings\n") df.with.string <- data.frame(1:5, c(1,2,-1,4,5), c("a", "b", "a", "a", "b"), stringsAsFactors=FALSE) colnames(df.with.string) <- c("num1", "num2", "string") fit30.form <- linmod(num1~num2, df.with.string) lm30 <- lm(num1~num2, df.with.string) check.lm(fit30.form, lm30, check.newdata=FALSE) fit31.form <- linmod(num1~., df.with.string) lm31 <- lm(num1~., df.with.string) check.lm(fit31.form, lm31, check.newdata=FALSE) expect.err(try(linmod(string~., df.with.string)), "non-numeric argument to binary operator") # production version # expect.err(try(linmod(string~., df.with.string)), "'y' is not numeric or logical") vec <- c(1,2,3,4,3) options(warn=2) # treat warnings as errors expect.err(try(linmod(df.with.string, vec)), "NAs introduced by coercion") options(warn=1) # minimal version expect.err(try(linmod(df.with.string, vec)), "NA/NaN/Inf in foreign function call (arg 1)") # production version # expect.err(try(linmod(df.with.string, vec)), "NA in 'x'") options(warn=2) # treat warnings as errors expect.err(try(linmod(df.with.string, vec)), "NAs introduced by coercion") options(warn=1) # minimal version expect.err(try(linmod(df.with.string, vec)), "NA/NaN/Inf in foreign function call (arg 1)") # production version # expect.err(try(linmod(df.with.string, vec)), "NA in 'x'") cat("==more variables than cases\n") set.seed(1) x2 <- matrix(rnorm(6), nrow=2) y2 <- c(1,2) # production version # expect.err(try(linmod(y2~x2)), "more variables than cases") # minimal version expect.err(try(linmod(y2~x2)), "'size' cannot exceed nrow(x) = 2") x3 <- matrix(1:10, ncol=2) y3 <- c(1,2,9,4,5) # production version will give a better error message expect.err(try(linmod(y3~x3)), "singular matrix 'a' in 'solve'") cat("==nrow(x) does not match length(y)\n") # note that the production version gives better error messages x4 <- matrix(1:10, ncol=2) y4 <- c(1,2,9,4) expect.err(try(linmod(x4, y4)), "singular matrix 'a' in 'solve'") x5 <- matrix(1:10, ncol=2) y5 <- c(1,2,9,4,5,9) expect.err(try(linmod(x5, y5)), "singular matrix 'a' in 'solve'") cat("==y has multiple columns\n") vec <- c(1,2,3,4,3) y2 <- cbind(c(1,2,3,4,9), vec^2) expect.err(try(linmod(vec, y2)), "'qr' and 'y' must have the same number of rows") # following does not issue any error message, it should # expect.err(try(linmod(y2~vec)), "error message") ### Model 3: production version of linmod is tested in test.linmod.R source("test.epilog.R") plotmo/inst/slowtests/test.degree.R0000644000176200001440000001057015126274546017163 0ustar liggesusers# test.pre.R: test the degree1 and degree2 and related args source("test.prolog.R") library(earth) library(plotmo) # test character degree1 and degree2 (added in plotmo version 1.3-0) data(ozone1) a80 <- earth(O3~., data=ozone1, degree=2) plotmo(a80, degree1="i", degree2="t", caption='degree1="i", degree2="t"') plotmo(a80, degree1="^temp$", degree2="^dpg$", caption='degree1="^temp$", degree2="^dpg$"') # Expect Warning: "nonesuch1" in degree1 does not regex-match any variables, ditto for degree2 plotmo(a80, degree1=c("temp", "nonesuch1"), degree2="vis", caption='degree1=c("temp", "nonesuch1"), degree2="vis")') # Expect above warnings and also Warning: nothing to plot plotmo(a80, degree1="nonesuch1", degree2="nonesuch2") # tests for plotmo version 3.3.7 (degree1 and degree2 handling changed) data(etitanic) a81 <- earth(survived~., data=etitanic, degree=2) options(warn=1) # print warnings as they occur plotmo(a81) # degree1 tests par(mfrow=c(3,3), mar=c(1,2.5,2,1), oma=c(0,0,4,0)) plotmo(a81, do.par=FALSE, degree1="pclass", degree2=0, main='degree1="pclass"', caption="test degree1 with strings") options(warn=2) # treat warnings as errors expect.err(try(plotmo(a81, do.par=FALSE, degree1="survived", degree2=0)), '"survived" in degree1 does not regex-match any names') options(warn=1) # print warnings as they occur plotmo(a81, do.par=FALSE, degree1="sibsp", degree2=0, main='degree1="sibsp"') # parch does not appear in the standard degree1 plotmo plots, but we can still specify it explictly plotmo(a81, do.par=FALSE, degree1="parch", degree2=0, trace=0, main='degree1="parch"') plotmo(a81, do.par=FALSE, degree1=c("sibsp", "pclass"), degree2=0, main='degree1=c("sibsp", "pclass")') par(org.par) # degree2 tests par(mfrow=c(3,3), mar=c(1,2.5,2,1), oma=c(0,0,4,0)) plotmo(a81, do.par=FALSE, degree1=0, degree2="pclass", main='degree2="pclass"', caption="test degree2 with two strings") plotmo(a81, do.par=FALSE, degree1=0, degree2=c("age", "se"), persp.theta=-35, main='degree2=c("age", "se")\npersp.theta=-35') plotmo(a81, do.par=FALSE, degree1=0, degree2="ag", main='degree2="ag"') plotmo(a81, do.par=FALSE, degree1=0, degree2=c("sex", "sibsp"), main='degree2=c("sex", "sibsp"') plotmo(a81, do.par=FALSE, degree1=0, degree2=c("sibsp", "sex"), main='degree2=c("sibsp", "sex")') options(warn=2) # treat warnings as errors expect.err(try(plotmo(a81, do.par=FALSE, degree1=0, degree2=c("pclass", "nonesuch"))), "\"nonesuch\" in degree2 does not regex-match any names") expect.err(try(plotmo(a81, do.par=FALSE, degree1=0, degree2=c("nonesuch1", "nonesuch2"))), "\"nonesuch1\" in degree2 does not regex-match any names") expect.err(try(plotmo(a81, do.par=FALSE, degree1=0, degree2=c("nonesuch", "pclass"))), "\"nonesuch\" in degree2 does not regex-match any names") options(warn=1) # print warnings as they occur par(org.par) par(mfrow=c(2,2), mar=c(1,2.5,2,1), oma=c(0,0,4,0)) # check that order of strings in two string degree2 is observed cat('\n\ndegree2=c("age", "se"):\n') plotmo(a81, do.par=FALSE, degree1=0, degree2=c("age", "se"), main='degree2=c("age", "se")') cat('\n\ndegree2=c("se", "age"):\n') plotmo(a81, do.par=FALSE, degree1=0, degree2=c("se", "age"), main='degree2=c("se", "age")') # check handling of bad strings in two string degree2 cat('\n\ndegree2=c("nonesuch", "age"):\n') try(plotmo(a81, do.par=FALSE, degree1=0, degree2=c("nonesuch", "age"), main='degree2=c("nonesuch", "age")')) cat('\n\ndegree2=c("age", "nonesuch"):\n') try(plotmo(a81, do.par=FALSE, degree1=0, degree2=c("age", "nonesuch"), main='degree2=c("age", "nonesuch")')) cat('\n\ndegree2=c("nevermore", "nonesuch"):\n') try(plotmo(a81, do.par=FALSE, degree1=0, degree2=c("nevermore", "nonesuch"), main='degree2=c("nevermore", "nonesuch")')) # follow should still plot the degree1 plot even though degree2 spec is wrong cat('\n\ndegree1=1, degree2=c("nevermore", "nonesuch"):\n') try(plotmo(a81, do.par=FALSE, degree1=1, degree2=c("nevermore", "nonesuch"), main='degree1=1\ndegree2=c("nevermore", "nonesuch")')) # expect warning: both elements of degree2 are the same cat('\n\ndegree2=c("sex", "sex"):\n') try(plotmo(a81, do.par=FALSE, degree1=0, degree2=c("sex", "sex"), main='degree1=1\ndegree2=c("sex", "sex")')) par(org.par) source("test.epilog.R") plotmo/inst/slowtests/test.glmnet.bat0000755000176200001440000000147215124635472017564 0ustar liggesusers@rem test.glmnet.bat: glmnet tests for plotmo and plotres @echo test.glmnet.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.glmnet.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.glmnet.Rout: @echo. @tail test.glmnet.Rout @echo test.glmnet.R @exit /B 1 :good1 mks.diff test.glmnet.Rout test.glmnet.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.glmnet.save.ps @exit /B 1 :good2 @rem test.glmnet.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.glmnet.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.glmnet.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/test.dots.Rout.save0000644000176200001440000016256614563606220020373 0ustar liggesusers> # test.dots.R > > source("test.prolog.R") > > cat0("=== test dotindex\n") === test dotindex > > test.dotindex <- function(expected, ARGNAME, ..., EX=FALSE) + { + dotindex <- plotmo:::dotindex(ARGNAME=ARGNAME, EX=EX, ...) + stopifnot(all.equal(dotindex, expected)) + } > test.dotindex(NA, "x") # empty dots > test.dotindex(NA, "x", a=10, b=20) > test.dotindex(1, "a", a=10, b=20) > test.dotindex(2, "b", a=10, b=20) > test.dotindex(1, "a1", a=10, b=20) > test.dotindex(NA, "a", a1=10, a2=20) > expect.err(try(test.dotindex(1, nonesuch, a=10, a=20)), "object 'nonesuch' not found") Error : object 'nonesuch' not found Got expected error from try(test.dotindex(1, nonesuch, a = 10, a = 20)) > expect.err(try(test.dotindex(1, "a1", a=10, a=20)), "argument 'a' for test.dotindex() is duplicated") Error : argument 'a' for test.dotindex() is duplicated Got expected error from try(test.dotindex(1, "a1", a = 10, a = 20)) > expect.err(try(test.dotindex(1, "aa1", a=10, aa=20)), "arguments 'a' and 'aa' both match 'aa1' in test.dotindex") Error : arguments 'a' and 'aa' both match 'aa1' in test.dotindex Got expected error from try(test.dotindex(1, "aa1", a = 10, aa = 20)) > stopifnot(is.na(plotmo:::dotindex("a", EX=1, a1=10, a2=20))) > stopifnot(plotmo:::dotindex("a2", EX=1, a1=10, a2=20) == 2) > > # multiple argnames > test.dotindex(NA, c("a", "b")) # empty dots > test.dotindex(1, c("a", "b"), a=2, c=3) > test.dotindex(1, c("a", "b"), a=5, b=6) > test.dotindex(2, c("a", "b"), x=1, a=5, b=6) > test.dotindex(3, c("b,a"), x=1, a=5, b=6) > test.dotindex(1, c("a b"), b=3, c=4) > test.dotindex(2, c(" a b "), c=3, b=4) > test.dotindex(NA, c("a", "b"), c=3) > stopifnot(plotmo:::dotindex(c("x", "a1"), EX=1, a1=10, a2=20) == 1) > > test.dota <- function(expected, ARGNAME, ..., DEF=NA, EX=FALSE) + { + if(is.na(DEF)) + dot <- plotmo:::dota(ARGNAME, EX=EX, ...) + else + dot <- plotmo:::dota(ARGNAME, EX=EX, DEF=DEF, ...) + stopifnot(all.equal(dot, expected)) + } > cat0("=== test dot\n") === test dot > test.dota(NA, "x") # empty dots > test.dota(NA, "x", a=10, b=20) > test.dota(10, "a", a=10, b=20) > test.dota(20, "b", a=10, b=20) > test.dota(99, DEF=99, "nonesuch", a=10, b=20) > test.dota(NA, "a", a1=10, a2=20) > expect.err(try(test.dota(1, "a1", a=10, a=20)), "argument 'a' for test.dota() is duplicated") Error : argument 'a' for test.dota() is duplicated Got expected error from try(test.dota(1, "a1", a = 10, a = 20)) > expect.err(try(test.dota(1, 99, a=10, a=20)), "is.character(argname) is not TRUE") Error in process.argname(ARGNAME) : is.character(argname) is not TRUE Got expected error from try(test.dota(1, 99, a = 10, a = 20)) > expect.err(try(test.dota(1, test.dota, a=10, a=20)), "is.character(argname) is not TRUE") Error in process.argname(ARGNAME) : is.character(argname) is not TRUE Got expected error from try(test.dota(1, test.dota, a = 10, a = 20)) > expect.err(try(test.dota(1, "", a=10, a=20)), "empty string in ARGNAME") Error : empty string in ARGNAME Got expected error from try(test.dota(1, "", a = 10, a = 20)) > expect.err(try(test.dota(1, "x^x", a=10, a=20)), "illegal character \"^\" in ARGNAME") Error : illegal character "^" in ARGNAME = "x^x" Got expected error from try(test.dota(1, "x^x", a = 10, a = 20)) > > test.dota(10, "abc", EX=T, abc=10) > test.dota(NA, "a", EX=T, a1=10, a2=20) > expect.err(try(test.dota(1, "a1", a1=10, a1=20)), "argument 'a1' for test.dota() is duplicated") Error : argument 'a1' for test.dota() is duplicated Got expected error from try(test.dota(1, "a1", a1 = 10, a1 = 20)) > > stopifnot(is.na(plotmo:::dota("a", EX=1, a1=1, a2=2))) > stopifnot(plotmo:::dota("a2", EX=1, a1=10, a2=20, a3=30) == 20) > > foo <- function(func, x) func(x) > foo(mean, 33) [1] 33 > foo(function(...) plotmo:::dota("x", ...), 33) [1] NA > foo(function(...) plotmo:::dota("x99", ...), 33) [1] NA > foo(function(...) { plotmo:::dota("nonesuch", ...) }, 33) [1] NA > > test.dota(1, "a", EX=T, a=1) > test.dota(2, "b", EX=T, a=1, b=2, c=3) > test.dota(NA, "x", EX=T, a=1, b=2, c=3) > test.dota(2, "a", EX=T, ab=1, a=2) > test.dota(2, "a", EX=T, aa=1, a=2) > test.dota(NA, "a", EX=T, aa=1, ab=2) > expect.err(try(test.dota(2, "a", EX=T, aa=1, a=2, a=3)), "argument 'a' for test.dota() is duplicated") Error : argument 'a' for test.dota() is duplicated Got expected error from try(test.dota(2, "a", EX = T, aa = 1, a = 2, a = 3)) > > expect.err(try(test.dota(2, "a", EX=T, a=none.such)), "cannot evaluate 'a'") Error : object 'none.such' not found Error : cannot evaluate 'a' Got expected error from try(test.dota(2, "a", EX = T, a = none.such)) > > # multiple argnames > test.dota(2, c("a", "b"), a=2, c=3) > test.dota(5, c("a", "b"), a=5, b=6) > test.dota(5, c("a", "b"), x=1, a=5, b=6) > test.dota(3, c("a", "b"), b=3, c=4) > test.dota(4, c("a", "b"), c=3, b=4) > test.dota(NA, c("a", "b"), c=3) > expect.err(try(test.dota(1, c("b", "aa1"), a=10, aa=20)), "arguments 'a' and 'aa' both match 'aa1' in test.dota") Error : arguments 'a' and 'aa' both match 'aa1' in test.dota Got expected error from try(test.dota(1, c("b", "aa1"), a = 10, aa = 20)) > expect.err(try(test.dota(1, c("x", ""), a=10, b=20)), "empty string in ARGNAME") Error : empty string in ARGNAME Got expected error from try(test.dota(1, c("x", ""), a = 10, b = 20)) > stopifnot(plotmo:::dota(c("x", "a2", "y"), EX=1, a1=10, a2=20, a3=30) == 20) > > test.dota(NA, c("a", "b"), aa=2, cc=3, EX=T) > test.dota(2, c("aa", "b"), aa=2, cc=3, EX=T) > test.dota(3, c("bb", "b"), bb=3, cc=4, EX=T) > test.dota(NA, c("a", "b"), c=3, EX=T) > > foo.x <- function(...) { plotmo:::dota("x", ..., DEF="default", EX=FALSE) } > stopifnot(foo.x(x=3) == 3) > stopifnot(foo.x(y=3) == "default") > > foo2 <- function(funcarg, ...) funcarg(...) > stopifnot(is.na(foo2(function(...) plotmo:::dota("x", ...), 3))) # 3 is unnamed > stopifnot(foo2(function(...) plotmo:::dota("x", EX=0, ...), x=3) == 3) > stopifnot(foo2(function(...) plotmo:::dota("x99", EX=0, ...), x=3) == 3) > stopifnot(foo2(function(...) { plotmo:::dota("x", DEF="default", EX=FALSE, ...) }, x=3) == 3) > stopifnot(foo2(function(...) { plotmo:::dota("y", DEF="default", EX=FALSE, ...) }, x=3) == "default") > # expect.err(try(foo2(function(...) { plotmo:::dota("y", DEF="default", EX=FALSE, ...) }, 3)), "unnamed arguments in ... are not allowed for funcarg()") > > stopifnot(foo2(foo.x, x=3) == 3) > stopifnot(foo2(foo.x, y=3) == "default") > > test.is.dot <- function(expected, ARGNAME, ...) + { + present <- plotmo:::is.dot(ARGNAME, ...) + stopifnot(all.equal(present, expected)) + } > cat0("=== test is.dot\n") === test is.dot > test.is.dot(FALSE, "x") # empty dots > test.is.dot(FALSE, "x", EX=0, a=10, b=20) > test.is.dot(TRUE, "a", EX=0, a=10, b=20) > test.is.dot(TRUE, "b", EX=0, a=10, b=20) > test.is.dot(TRUE, "a1", EX=0, a=10, b=20) > test.is.dot(FALSE, "a", EX=0, a1=10, a2=20) > expect.err(try(test.is.dot(TRUE, "a1", EX=0, a=10, a=20)), "argument 'a' for test.is.dot() is duplicated") Error : argument 'a' for test.is.dot() is duplicated Got expected error from try(test.is.dot(TRUE, "a1", EX = 0, a = 10, a = 20)) > expect.err(try(test.is.dot(TRUE, "a", EX=0, a=10, a=20)), "argument 'a' for test.is.dot() is duplicated") Error : argument 'a' for test.is.dot() is duplicated Got expected error from try(test.is.dot(TRUE, "a", EX = 0, a = 10, a = 20)) > stopifnot(plotmo:::is.dot("a", EX=1, a1=10, a2=20, a3=30) == FALSE) > stopifnot(plotmo:::is.dot("x", EX=1, a1=10, a2=20, a3=30) == FALSE) > stopifnot(plotmo:::is.dot("a3", EX=1, a1=10, a2=20, a3=30) == TRUE) > > # multiple argnames > test.is.dot(TRUE, EX=0, c("a1", "b1"), a=2, c=3) > test.is.dot(TRUE, EX=0, c("a1", "b1"), b=3, c=4) > test.is.dot(TRUE, EX=0, c("a1", "b1"), c=3, b=4) > test.is.dot(FALSE, EX=0, c("a1", "b1"), c=3) > expect.err(try(test.is.dot(FALSE, c("aa1", "b"), EX=0, a=10, aa=20)), "arguments 'a' and 'aa' both match 'aa1' in test.is.dot") Error : arguments 'a' and 'aa' both match 'aa1' in test.is.dot Got expected error from try(test.is.dot(FALSE, c("aa1", "b"), EX = 0, a = 10, aa = 20)) > stopifnot(plotmo:::is.dot(c("x", "a", "y"), EX=1, a1=10, a2=20, a3=30) == FALSE) > stopifnot(plotmo:::is.dot(c("x", "a2", "y"), EX=1, a1=10, a2=20, a3=30) == TRUE) > > cat0("=== test expand.drop\n") === test expand.drop > > # nchar is used an example func, it has formals "x", "type", "allowNA" > > stopifnot(is.null(plotmo:::expand.drop(NULL, prefix="prefix.", func=nchar))) > > stopifnot(plotmo:::expand.drop("a", prefix="prefix.", func=nchar) == ">PREFIX|>EXPLICIT|^a") > > stopifnot(plotmo:::expand.drop("a", prefix="prefix.", func=nchar, include.standard.prefixes=TRUE) == ">STANDARDPREFIXES|^force\\.|^def\\.|^drop\\.|>PREFIX|^prefix\\.|>EXPLICIT|^a") > > stopifnot(plotmo:::expand.drop("FORMALS", prefix="prefix.", func=base::nchar) == ">FORMALS|^x|^type|^allowNA|^keepNA|>PREFIX|>EXPLICIT") > > stopifnot(plotmo:::expand.drop("FORMALS", prefix="prefix.", func=base::nchar, include.standard.prefixes=TRUE) == ">FORMALS|^x|^type|^allowNA|^keepNA|>STANDARDPREFIXES|^force\\.|^def\\.|^drop\\.|>PREFIX|^prefix\\.|>EXPLICIT") > > expect.err(try(plotmo:::expand.drop("FORMALS", prefix="prefix.", func=NULL)), "\"FORMALS\" specified in DROP, but FUNC is NULL") Error : "FORMALS" specified in DROP, but FUNC is NULL Got expected error from try(plotmo:::expand.drop("FORMALS", prefix = "prefix.", func = NULL)) > > expect.err(try(plotmo:::expand.drop("FORMALS", prefix="prefix.", func=base::c)), "\"FORMALS\" specified but formals(FUNC) returned no formal arguments") Error : "FORMALS" specified but formals(FUNC) returned no formal arguments Got expected error from try(plotmo:::expand.drop("FORMALS", prefix = "prefix.", func = base::c)) > > foo99 <- function(...) NULL > expect.err(try(plotmo:::expand.drop("FORMALS", prefix="prefix.", func=foo99)), "\"FORMALS\" specified but formals(FUNC) returned only \"...\"") Error : "FORMALS" specified but formals(FUNC) returned only "..." Got expected error from try(plotmo:::expand.drop("FORMALS", prefix = "prefix.", func = foo99)) > > stopifnot(plotmo:::expand.drop("a,FORMALS", prefix="prefix.", func=base::nchar) == ">FORMALS|^x|^type|^allowNA|^keepNA|>PREFIX|>EXPLICIT|^a") > > stopifnot(plotmo:::expand.drop("a,FORMALS", prefix="prefix.", func=base::nchar, include.standard.prefixes=TRUE) == ">FORMALS|^x|^type|^allowNA|^keepNA|>STANDARDPREFIXES|^force\\.|^def\\.|^drop\\.|>PREFIX|^prefix\\.|>EXPLICIT|^a") > > expect.err(try(plotmo:::expand.drop("", prefix="prefix.", func=base::nchar)), "DROP is an empty string") Error : DROP is an empty string Got expected error from try(plotmo:::expand.drop("", prefix = "prefix.", func = base::nchar)) > > stopifnot(plotmo:::expand.drop("a", prefix="lines.", func=base::nchar) == ">PREFIX|>EXPLICIT|^a") > > stopifnot(plotmo:::expand.drop("a", "lines.a", prefix="lines.", func=base::nchar, include.standard.prefixes=TRUE) == ">STANDARDPREFIXES|^force\\.|^def\\.|^drop\\.|>PREFIX|^lines\\.|>EXPLICIT|^a") > > stopifnot(plotmo:::expand.drop("a*", prefix="lines.", func=base::nchar) == ">PREFIX|>EXPLICIT|^a.*") > > stopifnot(plotmo:::expand.drop("a.*", prefix="lines.", func=base::nchar) == ">PREFIX|>EXPLICIT|^a\\..*") > > stopifnot(plotmo:::expand.drop("a$", prefix="lines.", func=base::nchar) == ">PREFIX|>EXPLICIT|^a$") > > stopifnot(plotmo:::expand.drop("a$,b*,c*$", prefix="lines.", func=base::nchar) == ">PREFIX|>EXPLICIT|^a$|^b.*|^c.*$") > > stopifnot(plotmo:::expand.drop(c("a", "b,c", " d e$ f ", "g h$, i"), prefix="lines.", func=base::nchar) == + ">PREFIX|>EXPLICIT|^a|^b|^c|^d|^e$|^f|^g|^h$|^i") > > stopifnot(plotmo:::expand.drop("PLOT.ARGS", prefix="lines.", func=base::nchar) == + ">PREFIX|>EXPLICIT|>PLOT_ARGS|^add$|^adj$|^bty$|^cex$|^cex\\.axis$|^cex\\.lab$|^cex\\.main$|^cex\\.sub$|^col$|^col\\.axis$|^col\\.lab$|^col\\.main$|^col\\.sub$|^crt$|^family$|^font$|^font$|^font\\.axis$|^font\\.lab$|^font\\.main$|^font\\.sub$|^lend$|^ljoin$|^lmitre$|^lty$|^lwd$|^main$|^pch$|^srt$|^xaxp$|^xaxs$|^xaxt$|^xlab$|^xlim$|^xlog$|^xpd$|^yaxp$|^yaxs$|^yaxt$|^ylab$|^ylim$|^ylog$") > > stopifnot(plotmo:::expand.drop("abc,PLOT.ARGS", prefix="lines.", func=base::nchar) == + ">PREFIX|>EXPLICIT|^abc|>PLOT_ARGS|^add$|^adj$|^bty$|^cex$|^cex\\.axis$|^cex\\.lab$|^cex\\.main$|^cex\\.sub$|^col$|^col\\.axis$|^col\\.lab$|^col\\.main$|^col\\.sub$|^crt$|^family$|^font$|^font$|^font\\.axis$|^font\\.lab$|^font\\.main$|^font\\.sub$|^lend$|^ljoin$|^lmitre$|^lty$|^lwd$|^main$|^pch$|^srt$|^xaxp$|^xaxs$|^xaxt$|^xlab$|^xlim$|^xlog$|^xpd$|^yaxp$|^yaxs$|^yaxt$|^ylab$|^ylim$|^ylog$") > > stopifnot(plotmo:::expand.drop("abc,FORMALS,PLOT.ARGS", prefix="lines.", func=base::nchar) == + ">FORMALS|^x|^type|^allowNA|^keepNA|>PREFIX|>EXPLICIT|^abc|>PLOT_ARGS|^add$|^adj$|^bty$|^cex$|^cex\\.axis$|^cex\\.lab$|^cex\\.main$|^cex\\.sub$|^col$|^col\\.axis$|^col\\.lab$|^col\\.main$|^col\\.sub$|^crt$|^family$|^font$|^font$|^font\\.axis$|^font\\.lab$|^font\\.main$|^font\\.sub$|^lend$|^ljoin$|^lmitre$|^lty$|^lwd$|^main$|^pch$|^srt$|^xaxp$|^xaxs$|^xaxt$|^xlab$|^xlim$|^xlog$|^xpd$|^yaxp$|^yaxs$|^yaxt$|^ylab$|^ylim$|^ylog$") > > stopifnot(plotmo:::expand.drop("abc,FORMALS,PAR.ARGS", prefix="lines.", func=base::nchar) == + ">FORMALS|^x|^type|^allowNA|^keepNA|>PREFIX|>EXPLICIT|^abc|>PAR_ARGS|^adj$|^ann$|^ask$|^bg$|^bty$|^cex$|^cex\\.axis$|^cex\\.lab$|^cex\\.main$|^cex\\.sub$|^col\\.axis$|^col\\.lab$|^col\\.main$|^col\\.sub$|^crt$|^err$|^family$|^fg$|^fig$|^fin$|^font$|^font\\.axis$|^font\\.lab$|^font\\.main$|^font\\.sub$|^lab$|^las$|^lend$|^lheight$|^ljoin$|^lmitre$|^lty$|^mai$|^mar$|^mex$|^mfcol$|^mfg$|^mfrow$|^mgp$|^mkh$|^new$|^oma$|^omd$|^omi$|^pch$|^pin$|^plt$|^ps$|^pty$|^srt$|^tck$|^tcl$|^usr$|^xaxp$|^xaxs$|^xaxt$|^xlog$|^xpd$|^yaxp$|^yaxs$|^yaxt$|^ylbias$|^ylog$") > > stopifnot(plotmo:::expand.drop("abc,FORMALS,PLOTMO.ARGS", prefix="lines.", func=base::nchar) == + ">FORMALS|^x|^type|^allowNA|^keepNA|>PREFIX|>EXPLICIT|^abc|>PLOTMO_ARGS|^caption\\.|^cex\\.|^col\\.|^contour\\.|^cum\\.|^degree1\\.|^degree2\\.|^density\\.|^filled\\.contour\\.|^font\\.|^func\\.|^grid\\.|^heatmap\\.|^image\\.|^jitter\\.|^legend\\.|^label\\.|^level\\.|^line\\.|^lines\\.|^lty\\.|^lty\\.|^lwd\\.|^main\\.|^mtext\\.|^nresiduals|^par\\.|^pch\\.|^persp\\.|^plot\\.|^plotmath\\.|^prednames\\.|^qq\\.|^qqline\\.|^pt\\.|^response\\.|^rug\\.|^smooth\\.|^text\\.|^title\\.|^vfont\\.") > > test.deprefix <- function(expected, ..., FNAME="test.deprefix", KEEP=NULL) + { + args <- plotmo:::deprefix(..., FNAME=FNAME, KEEP=KEEP, CALLARGS="") + # can't use all.equal because it complains about names + # cat("args:\n") + # print(args) + # cat("expected:\n") + # print(expected) + stopifnot(length(args) == length(expected)) + for(i in seq_len(length(expected))) { + stopifnot(names(args)[i] == names(expected)[i]) + stopifnot(args[[i]] == expected[[i]]) + } + } > cat0("=== test deprefix\n") === test deprefix > > test.deprefix( + expected=list(a=1, b=2), DROP="*", + PREFIX="predict.", def.a=1, predict.b=2, c=3) > > test.deprefix(TRACE=2, + expected=list(b="predict.b", d="def.d", c="predict.c", e="predict.e"), + PREFIX="predict.", DROP="*", + a="a", b="b", c="c", w1.xlab="xlab", + def.b="def.b", def.d="def.d", + predict.b="predict.b", predict.c="predict.c", predict.e="predict.e") TRACE higher.caller.to.deprefix called higher.caller.to.deprefix(test.deprefix, FNAME="test.deprefix", a="a", b="b", c="c", w1.xlab="xlab", def.b="def.b", def.d="def.d", predict.b="predict.b", predict.c="predict.c", predict.e="predict.e") PREFIX predict. DROP .* KEEP ^force.|^def.|^predict. input dotnames a b c w1.xlab def.b def.d predict.b predict.c predict.e after DROP and KEEP def.b def.d predict.b predict.c predict.e return dotnames b d c e > > test.deprefix(TRACE=2, + expected=list(b="predict.b", d="def.d", a="a", c="predict.c", e="predict.e"), + KEEP=NULL, PREFIX="predict.", DROP="w1.", + a="a", b="b", c="c", w1.xlab="xlab", + def.b="def.b", def.d="def.d", + predict.b="predict.b", predict.c="predict.c", predict.e="predict.e") TRACE higher.caller.to.deprefix called higher.caller.to.deprefix(test.deprefix, FNAME="test.deprefix", a="a", b="b", c="c", w1.xlab="xlab", def.b="def.b", def.d="def.d", predict.b="predict.b", predict.c="predict.c", predict.e="predict.e") PREFIX predict. DROP >PREFIX >EXPLICIT|^w1\. KEEP ^force.|^def.|^predict. input dotnames a b c w1.xlab def.b def.d predict.b predict.c predict.e after DROP and KEEP a b c def.b def.d predict.b predict.c predict.e return dotnames b d a c e > > test.deprefix( + expected=list(a="predict.a"), + KEEP=NULL, PREFIX="predict.", DROP="w1.", + a="plain.a", predict.a="predict.a") > > test.deprefix(expected=list(a="aa1"), + KEEP=NULL, PREFIX="predict.", a="aa1") > > test.deprefix(expected=list(a="aa2"), + KEEP=NULL, PREFIX="predict.", def.a="aa2") > > test.deprefix(expected=list(a="aa3", b="bb3"), + KEEP=NULL, PREFIX="predict.", def.a="aa3", b="bb3") > > test.deprefix(expected=list(10, 20), TRACE=2, + KEEP=NULL, DROP="w1.,persp.,xlab.", + PREFIX="predict.", + force.anon2=20, force.anon1=10) TRACE higher.caller.to.deprefix called higher.caller.to.deprefix(test.deprefix, FNAME="test.deprefix", force.anon2=20, force.anon1=10) PREFIX predict. DROP >PREFIX >EXPLICIT|^w1\.|^persp\.|^xlab\. KEEP ^force.|^def.|^predict. input dotnames force.anon2 force.anon1 after DROP and KEEP force.anon2 force.anon1 return dotnames anon1 anon2 > > test.deprefix(expected=list(10, 20, a=3), TRACE=2, + KEEP=NULL, DROP="w1.,persp.,xlab.", + PREFIX="predict.", + force.anon2=20, force.anon1=10, + a=3) TRACE higher.caller.to.deprefix called higher.caller.to.deprefix(test.deprefix, FNAME="test.deprefix", force.anon2=20, force.anon1=10, a=3) PREFIX predict. DROP >PREFIX >EXPLICIT|^w1\.|^persp\.|^xlab\. KEEP ^force.|^def.|^predict. input dotnames force.anon2 force.anon1 a after DROP and KEEP force.anon2 force.anon1 a return dotnames anon1 anon2 a > > expect.err(try(test.deprefix(expected=list(10, 20, a=4), + KEEP=NULL, DROP="w1.,persp.,xlab.", + PREFIX="predict.", + force.anon=10, force.anon=20, + a=3, predict.a=4)), + "argument 'force.anon' for test.deprefix() is duplicated") Error : argument 'force.anon' for test.deprefix() is duplicated Got expected error from try(test.deprefix(expected = list(10, 20, a = 4), KEEP = NULL, DROP = "w1.,persp.,xlab.", PREFIX = "predict.", force.anon = 10, force.anon = 20, a = 3, predict.a = 4)) > > expect.err(try(test.deprefix(expected=list(10, 20, a=4), + KEEP=NULL, DROP="w1.,persp.,xlab.", + PREFIX="predict.", FNAME="foobar", + force.anon=10, force.anon=20, + a=3, predict.a=4)), + "argument 'force.anon' for foobar() is duplicated") Error : argument 'force.anon' for foobar() is duplicated Got expected error from try(test.deprefix(expected = list(10, 20, a = 4), KEEP = NULL, DROP = "w1.,persp.,xlab.", PREFIX = "predict.", FNAME = "foobar", force.anon = 10, force.anon = 20, a = 3, predict.a = 4)) > > test.deprefix(expected=list(10, 20, a=4), + KEEP=NULL, DROP="w1.,persp.,xlab.", + PREFIX="predict.", + force.anon1=10, force.anon2=20, + a=3, predict.a=4) > > test.deprefix(expected=list(10, 20, b=3, a=4), + KEEP=NULL, DROP="w1.,persp.,xlab.", + PREFIX="predict.", + force.anon1=10, force.anon2=20, def.b=3, + a=3, predict.a=4) > > test.deprefix(expected=list(10, 20, b=5, a=3), + KEEP=NULL, DROP="w1.,persp.,xlab.", + PREFIX="predict.", + force.anon1=10, force.anon2=20, def.b=3, + a=3, predict.b=5) > > test.deprefix(expected=list(10, 20, b=6, a=3), + KEEP=NULL, DROP="w1.,persp.,xlab.", + PREFIX="predict.", + force.anon1=10, force.anon2=20, def.b=3, + a=3, b=6) > > expect.err(try(test.deprefix(expected=NULL, KEEP=NULL, PREFIX="predict.", DROP="w1\\.")), "illegal character \"\\\" in DROP = \"w1\\.\"") Error : illegal character "\" in DROP = "w1\." Got expected error from try(test.deprefix(expected = NULL, KEEP = NULL, PREFIX = "predict.", DROP = "w1\\.")) > > test.deprefix(expected=list(b="predict.b", d="def.d", a="a", c="predict.c", w1.xl="xlab2", e="predict.e"), + PREFIX="predict.", DROP="w1.xlab$", + a="a", b="b", c="c", + w1.xlab="xlab1", # will be dropped (exact match) + w1.xl="xlab2", # will be kept (not an exact match) + def.b="def.b", def.d="def.d", + predict.b="predict.b", predict.c="predict.c", predict.e="predict.e") > > # expect.err(try(plotmo:::deprefix(FNAME="test.deprefix", PREFIX="predict.", UPPER.CASE123=99, > # def.a=1, predict.b=2, c=3)), > # "uppercase argument names like \"UPPER.CASE123\" are not allowed for test.deprefix()") > > test.expand.dotnames <- function(expected, PREFIX, FUNC=NULL, + FNAME="test.expand.dotnames", FORMALS=NULL, ...) + { + dots <- as.list(match.call(expand.dots=FALSE)$...) + args <- plotmo:::expand.dotnames(dots, PREFIX, FUNC, FNAME, FORMALS) + # can't use all.equal because it complains about named list versus unnamed list + stopifnot(length(args) == length(expected)) + for(i in seq_len(length(expected))) { + stopifnot(names(args)[i] == names(expected)[i]) + stopifnot(eval(args[[i]]) == expected[[i]]) + } + } > cat0("=== test expand.dotnames\n") === test expand.dotnames > > test.expand.dotnames(expected=list(x=9, persp.shade=3), + "persp.", graphics:::persp.default, "persp.default", x=9, persp.sh=3) > > test.expand.dotnames(expected=list(x=9, persp.shade=3, persp.nonesuch=4), + "persp.", graphics:::persp.default, "persp.default", x=9, persp.sh=3, persp.nonesuch=4) > > test.expand.dotnames(expected=list(x=9, persp.col=3), + "persp.", graphics:::persp.default, "persp.default", x=9, persp.c=3) > > # TODO not sure why this works as it does > test.expand.dotnames(expected=list(x=9, persp.x=3), + "persp.", graphics:::persp.default, "persp.default", x=9, persp.x=3) > > expect.err(try(test.expand.dotnames(expected=NULL, + "persp.", graphics:::persp.default, "persp.default", x=9, persp.l=3)), + "'l' matches both the 'ltheta' and 'lphi' arguments of persp.default()") Error : 'l' matches both the 'ltheta' and 'lphi' arguments of persp.default() Got expected error from try(test.expand.dotnames(expected = NULL, "persp.", graphics:::persp.default, "persp.default", x = 9, persp.l = 3)) > > test.expand.dotnames(expected=list(x=9, plot.foo=3, plot.xlim=c(1,2)), + "plot.", graphics:::plot.default, "plot.default", x=9, plot.foo=3, plot.xlim=c(1,2)) > > test.expand.dotnames(expected=list(x=9, plot.foo=3, plot.xlim=c(1,2)), + "plot.", graphics:::plot.default, "plot.default", x=9, plot.foo=3, plot.xli=c(1,2)) > > expect.err(try(test.expand.dotnames(expected=NULL, + "plot.", graphics:::plot.default, "plot.default", x=9, plot.foo=3, plot.xl=c(1,2))), + "'xl' matches both the 'xlim' and 'xlab' arguments of plot.default()") Error : 'xl' matches both the 'xlim' and 'xlab' arguments of plot.default() Got expected error from try(test.expand.dotnames(expected = NULL, "plot.", graphics:::plot.default, "plot.default", x = 9, plot.foo = 3, plot.xl = c(1, 2))) > > foo3 <- function(aaa=1, aa=2, bb=3, bba=4, cca=5, ccb=6, def=7) + cat0("foo3: aaa=", aaa, " aa=", aa, ", bb=", bb, " bba=", bba, + " cca=", cca, " ccb=", ccb, " def=", def, "\n") > > # --- above tests again but using formals --- > > # formal args for graphics:::persp.default (R version 3.2.0) > formals <- c( "x", "y", "z", "xlim", "zlim", "xlab", "ylab", "zlab", + "main", "sub", "theta", "phi", "r", "d", "scale", "expand", "col", + "border", "ltheta", "lphi", "shade", "box", "axes", "nticks", + "ticktype") > > test.expand.dotnames(expected=list(x=9, persp.shade=3), + "persp.", graphics:::persp, "persp", FORMALS=formals, x=9, persp.sh=3) > > test.expand.dotnames(expected=list(x=9, persp.shade=3, persp.nonesuch=4), + "persp.", graphics:::persp, "persp", FORMALS=formals, x=9, persp.sh=3, persp.nonesuch=4) > > test.expand.dotnames(expected=list(x=9, persp.col=3), + "persp.", graphics:::persp, "persp", FORMALS=formals, x=9, persp.c=3) > > # TODO not sure why this works as it does > test.expand.dotnames(expected=list(x=9, persp.x=3), + "persp.", graphics:::persp, "persp", FORMALS=formals, x=9, persp.x=3) > > expect.err(try(test.expand.dotnames(expected=NULL, + "persp.", graphics:::persp, "persp", FORMALS=formals, x=9, persp.l=3)), + "'l' matches both the 'ltheta' and 'lphi' arguments of persp()") Error : 'l' matches both the 'ltheta' and 'lphi' arguments of persp() Got expected error from try(test.expand.dotnames(expected = NULL, "persp.", graphics:::persp, "persp", FORMALS = formals, x = 9, persp.l = 3)) > > # done formals tests > > test.expand.dotnames(expected=list(x=9, plot.foo=3, plot.xlim=c(1,2)), + "plot.", graphics:::plot.default, "plot.default", x=9, plot.foo=3, plot.xlim=c(1,2)) > > test.expand.dotnames(expected=list(x=9, plot.foo=3, plot.xlim=c(1,2)), + "plot.", graphics:::plot.default, "plot.default", x=9, plot.foo=3, plot.xli=c(1,2)) > > expect.err(try(test.expand.dotnames(expected=NULL, + "plot.", graphics:::plot.default, "plot.default", x=9, plot.foo=3, plot.xl=c(1,2))), + "'xl' matches both the 'xlim' and 'xlab' arguments of plot.default()") Error : 'xl' matches both the 'xlim' and 'xlab' arguments of plot.default() Got expected error from try(test.expand.dotnames(expected = NULL, "plot.", graphics:::plot.default, "plot.default", x = 9, plot.foo = 3, plot.xl = c(1, 2))) > > test.expand.dotnames(expected=list(foo3.aa=99), + "foo3.", foo3, "foo3", foo3.aa=99) > expect.err(try(plotmo:::call.plot(foo3, "foo3.", foo3.aa=99)), "Unnamed arguments are not allowed here\n The argument's value is \"foo3.\"") Error : Unnamed arguments are not allowed here The argument's value is "foo3." plotmo:::call.plot via try called call.dots(FUNC=foo3, PREFIX=PREFIX, ..., DROP="*", KEEP="PREFIX,PLOT.ARGS", TRACE=TRACE, FNAME=fname, FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=function.object, CALLER=caller, foo3.aa=99) Got expected error from try(plotmo:::call.plot(foo3, "foo3.", foo3.aa = 99)) > expect.err(try(plotmo:::call.plot(foo3, foo, foo3.aa=99)), + "Unnamed arguments are not allowed here\n The argument's value is function.object") Error : Unnamed arguments are not allowed here The argument's value is function.object plotmo:::call.plot via try called call.dots(FUNC=foo3, PREFIX=PREFIX, ..., DROP="*", KEEP="PREFIX,PLOT.ARGS", TRACE=TRACE, FNAME=fname, FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=function.object, CALLER=caller, foo3.aa=99) Got expected error from try(plotmo:::call.plot(foo3, foo, foo3.aa = 99)) > expect.err(try(plotmo:::call.plot(foo3, NULL, foo3.aa=99)), "Unnamed arguments are not allowed here\n The argument's value is NULL") Error : Unnamed arguments are not allowed here The argument's value is NULL plotmo:::call.plot via try called call.dots(FUNC=foo3, PREFIX=PREFIX, ..., DROP="*", KEEP="PREFIX,PLOT.ARGS", TRACE=TRACE, FNAME=fname, FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=function.object, CALLER=caller, foo3.aa=99) Got expected error from try(plotmo:::call.plot(foo3, NULL, foo3.aa = 99)) > expect.err(try(plotmo:::call.plot(foo3, stop("stop was called"), foo3.aa=99)), "Unnamed arguments are not allowed here (argument ..1 is unnamed)") Error : Unnamed arguments are not allowed here (argument ..1 is unnamed) plotmo:::call.plot via try called call.dots(FUNC=foo3, PREFIX=PREFIX, ..., DROP="*", KEEP="PREFIX,PLOT.ARGS", TRACE=TRACE, FNAME=fname, FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=function.object, CALLER=caller, foo3.aa=99) Got expected error from try(plotmo:::call.plot(foo3, stop("stop was called"), foo3.aa = 99)) > expect.err(try(plotmo:::call.plot(foo3, cat("side effect\n"), foo3.aa=99)), "Unnamed arguments are not allowed here\n The argument's value is NULL") side effect Error : Unnamed arguments are not allowed here The argument's value is NULL plotmo:::call.plot via try called call.dots(FUNC=foo3, PREFIX=PREFIX, ..., DROP="*", KEEP="PREFIX,PLOT.ARGS", TRACE=TRACE, FNAME=fname, FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=function.object, CALLER=caller, foo3.aa=99) Got expected error from try(plotmo:::call.plot(foo3, cat("side effect\n"), foo3.aa = 99)) > expect.err(try(plotmo:::call.plot(foo3, nonesuch1=1, nonesuch2, foo3.aa=99)), "Unnamed arguments are not allowed here (argument ..2 is unnamed)") Error : Unnamed arguments are not allowed here (argument ..2 is unnamed) plotmo:::call.plot via try called call.dots(FUNC=foo3, PREFIX=PREFIX, ..., DROP="*", KEEP="PREFIX,PLOT.ARGS", TRACE=TRACE, FNAME=fname, FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=function.object, CALLER=caller, nonesuch1=1, foo3.aa=99) Got expected error from try(plotmo:::call.plot(foo3, nonesuch1 = 1, nonesuch2, foo3.aa = 99)) > plotmo:::call.plot(foo3, PREFIX="foo3.", foo3.aa=99) foo3: aaa=1 aa=99, bb=3 bba=4 cca=5 ccb=6 def=7 > > test.expand.dotnames(expected=list(foo3.aaa=99), + "foo3.", foo3, "foo3", foo3.aaa=99) > plotmo:::call.plot(foo3, foo3.aaa=99) foo3: aaa=99 aa=2, bb=3 bba=4 cca=5 ccb=6 def=7 > > expect.err(try(test.expand.dotnames(expected=list(foo3.aaa=99), + "foo3.", foo3, "foo3", foo3.aa=88, foo3.aa=99)), + "'foo3.aa' for foo3() is duplicated") Error : argument 'foo3.aa' for foo3() is duplicated Got expected error from try(test.expand.dotnames(expected = list(foo3.aaa = 99), "foo3.", foo3, "foo3", foo3.aa = 88, foo3.aa = 99)) > > expect.err(try(test.expand.dotnames(expected=list(foo3.aaa=99), + "foo3.", foo3, "foo3", foo3.a=88, foo3.aa=99)), + "'a' matches both the 'aaa' and 'aa' arguments of foo3()") Error : 'a' matches both the 'aaa' and 'aa' arguments of foo3() Got expected error from try(test.expand.dotnames(expected = list(foo3.aaa = 99), "foo3.", foo3, "foo3", foo3.a = 88, foo3.aa = 99)) > > expect.err(try(test.expand.dotnames(expected=list(foo3.aaa=99), + "foo3.", foo3, "foo3", foo3.aaa=88, foo3.aaa=99)), + "'foo3.aaa' for foo3() is duplicated") Error : argument 'foo3.aaa' for foo3() is duplicated Got expected error from try(test.expand.dotnames(expected = list(foo3.aaa = 99), "foo3.", foo3, "foo3", foo3.aaa = 88, foo3.aaa = 99)) > > test.expand.dotnames(expected=list(foo3.bbb=88, foo3.bba=99), + "foo3.", foo3, "foo3", foo3.bbb=88, foo3.bba=99) > expect.err(try(plotmo:::call.plot(foo3, foo3.bbb=88, foo3.bba=99)), + "unused argument (bbb = 88)") foo3(bbb=88, bba=99) Error in (function (aaa = 1, aa = 2, bb = 3, bba = 4, cca = 5, ccb = 6, : unused argument (bbb = 88) Got expected error from try(plotmo:::call.plot(foo3, foo3.bbb = 88, foo3.bba = 99)) > > # same as above but with TRACE (so don't use try in call.dots) > expect.err(try(plotmo:::call.plot(foo3, foo3.bbb=88, foo3.bba=99, TRACE=T)), + "unused argument (bbb = 88)") foo3(bbb=88, bba=99) Error in (function (aaa = 1, aa = 2, bb = 3, bba = 4, cca = 5, ccb = 6, : unused argument (bbb = 88) Got expected error from try(plotmo:::call.plot(foo3, foo3.bbb = 88, foo3.bba = 99, TRACE = T)) > > test.expand.dotnames(expected=list(foo3.bb=88), + "foo3.", foo3, "foo3", foo3.bb=88) > plotmo:::call.plot(foo3, foo3.bb=88) foo3: aaa=1 aa=2, bb=88 bba=4 cca=5 ccb=6 def=7 > > # test with FUNC=NULL > > test.expand.dotnames(expected=list(foo3.aa=99), + "foo3.", NULL, "foo3", foo3.aa=99) > plotmo:::call.plot(foo3, foo3.aa=99) foo3: aaa=1 aa=99, bb=3 bba=4 cca=5 ccb=6 def=7 > > test.expand.dotnames(expected=list(foo3.aaa=99), + "foo3.", NULL, "foo3", foo3.aaa=99) > plotmo:::call.plot(foo3, foo3.aaa=99) foo3: aaa=99 aa=2, bb=3 bba=4 cca=5 ccb=6 def=7 > > expect.err(try(test.expand.dotnames(expected=list(foo3.aaa=99), + "foo3.", NULL, "foo3", foo3.aa=88, foo3.aa=99)), + "argument 'foo3.aa' for foo3() is duplicated") Error : argument 'foo3.aa' for foo3() is duplicated Got expected error from try(test.expand.dotnames(expected = list(foo3.aaa = 99), "foo3.", NULL, "foo3", foo3.aa = 88, foo3.aa = 99)) > > test.expand.dotnames(expected=list(foo3.a=88, foo3.aa=99), + "foo3.", NULL, "foo3", foo3.a=88, foo3.aa=99) > expect.err(try(plotmo:::call.plot(foo3, foo3.a=88, foo3.aa=99)), + "'a' matches both the 'aaa' and 'aa' arguments of foo3()") Error : 'a' matches both the 'aaa' and 'aa' arguments of foo3() Got expected error from try(plotmo:::call.plot(foo3, foo3.a = 88, foo3.aa = 99)) > > expect.err(try(test.expand.dotnames(expected=list(foo3.aaa=99), + "foo3.", NULL, "foo3", foo3.aaa=88, foo3.aaa=99)), + "argument 'foo3.aaa' for foo3() is duplicated") Error : argument 'foo3.aaa' for foo3() is duplicated Got expected error from try(test.expand.dotnames(expected = list(foo3.aaa = 99), "foo3.", NULL, "foo3", foo3.aaa = 88, foo3.aaa = 99)) > > test.expand.dotnames(expected=list(foo3.bbb=88, foo3.bba=99), + "foo3.", NULL, "foo3", foo3.bbb=88, foo3.bba=99) > expect.err(try(plotmo:::call.plot(foo3, PREFIX="foo3.", foo3.bbb=88, foo3.bba=99)), + "unused argument (bbb = 88)") foo3(bbb=88, bba=99) Error in (function (aaa = 1, aa = 2, bb = 3, bba = 4, cca = 5, ccb = 6, : unused argument (bbb = 88) Got expected error from try(plotmo:::call.plot(foo3, PREFIX = "foo3.", foo3.bbb = 88, foo3.bba = 99)) > > test.expand.dotnames(expected=list(foo3.bb=88), + "foo3.", NULL, "foo3", foo3.bb=88) > plotmo:::call.plot(foo3, foo3.bb=88) foo3: aaa=1 aa=2, bb=88 bba=4 cca=5 ccb=6 def=7 > > test.expand.dotnames(expected=list(foo3.bbx=88), + "foo3.", NULL, "foo3", foo3.bbx=88) > expect.err(try(plotmo:::call.plot(foo3, foo3.bbx=88)), + "unused argument (bbx = 88)") foo3(bbx=88) Error in (function (aaa = 1, aa = 2, bb = 3, bba = 4, cca = 5, ccb = 6, : unused argument (bbx = 88) Got expected error from try(plotmo:::call.plot(foo3, foo3.bbx = 88)) > > test.expand.dotnames(expected=list(foo3.cc=77), + "foo3.", NULL, "foo3", foo3.cc=77) > expect.err(try(plotmo:::call.plot(foo3, foo3.cc=77)), + "'cc' matches both the 'cca' and 'ccb' arguments of foo3()") Error : 'cc' matches both the 'cca' and 'ccb' arguments of foo3() Got expected error from try(plotmo:::call.plot(foo3, foo3.cc = 77)) > > # following two directly compare FUNC=NULL to FUNC=foo3 > test.expand.dotnames(expected=list(foo3.cc=77), + "foo3.", FUNC=NULL, "foo3", foo3.cc=77) > expect.err(try(test.expand.dotnames(expected=NULL, + "foo3.", FUNC=foo3, "foo3", foo3.cc=77)), + "'cc' matches both the 'cca' and 'ccb' arguments of foo3()") Error : 'cc' matches both the 'cca' and 'ccb' arguments of foo3() Got expected error from try(test.expand.dotnames(expected = NULL, "foo3.", FUNC = foo3, "foo3", foo3.cc = 77)) > > test.expand.dotnames(expected=list(), "foo3.", foo3, "foo3", d=88, de=99) > > expect.err(try(plotmo:::call.plot(graphics::plot, x=1:3, y=1:3, 99)), + "Unnamed arguments are not allowed here\n The argument's value is 99\n plotmo:::call.plot via try called call.dots(FUNC=plot, PREFIX=PREFIX, ...") Error : Unnamed arguments are not allowed here The argument's value is 99 plotmo:::call.plot via try called call.dots(FUNC=plot, PREFIX=PREFIX, ..., DROP="*", KEEP="PREFIX,PLOT.ARGS", TRACE=TRACE, FNAME=fname, FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=function.object, CALLER=caller, x=c(1,2,3), y=c(1,2,3)) Got expected error from try(plotmo:::call.plot(graphics::plot, x = 1:3, y = 1:3, 99)) > > # test TRACE > print(plotmo:::deprefix(FUNC=nchar, PREFIX="foo3.", TRACE=TRUE, FNAME="nchar", allowN=1, b=2, foo3.c=3)) $allowNA [1] 1 $b [1] 2 $c [1] 3 > print(plotmo:::deprefix(FUNC=nchar, PREFIX="foo3.", TRACE=2, allowN=1, b=2, foo3.c=3)) TRACE higher.caller.to.deprefix called higher.caller.to.deprefix(nchar, FNAME="nchar", allowN=1, b=2, foo3.c=3) PREFIX foo3. DROP NULL KEEP ^force.|^def.|^foo3. input dotnames allowN b foo3.c after DROP and KEEP allowN b foo3.c return dotnames allowNA b c $allowNA [1] 1 $b [1] 2 $c [1] 3 > print(plotmo:::deprefix(FUNC=nchar, PREFIX="foo3.", TRACE=3, allowN=1, b=2, foo3.c=3)) TRACE higher.caller.to.deprefix called higher.caller.to.deprefix(nchar, FNAME="nchar", allowN=1, b=2, foo3.c=3) PREFIX foo3. DROP NULL KEEP ^force.|^def.|^foo3. input dotnames allowN b foo3.c after DROP and KEEP allowN b foo3.c return dotnames allowNA b c $allowNA [1] 1 $b [1] 2 $c [1] 3 > > expect.err(try(plotmo:::call.plot(foo3, foo3.d=88, foo3.de=99)), + "'foo3.d' and 'foo3.de' both match the 'def' argument of foo3()") Error : 'foo3.d' and 'foo3.de' both match the 'def' argument of foo3() Got expected error from try(plotmo:::call.plot(foo3, foo3.d = 88, foo3.de = 99)) > > cat0("=== test stop.if.dots\n") === test stop.if.dots > > foo3 <- function(x=1, ...) plotmo:::stop.if.dots(...) > foo3(1) # ok > expect.err(try(foo3(10, y=2)), "foo3: unrecognized argument 'y'") Error : foo3: unrecognized argument 'y' Got expected error from try(foo3(10, y = 2)) > expect.err(try(foo3(10, 99)), "foo3: unrecognized unnamed argument\n The call was foo3(x=10, 99)") Error : foo3: unrecognized unnamed argument The call was foo3(x=10, 99) Got expected error from try(foo3(10, 99)) > expect.err(try(foo3(10, y=plot)), "foo3: unrecognized argument 'y'") Error : foo3: unrecognized argument 'y' Got expected error from try(foo3(10, y = plot)) > expect.err(try(foo3(10, plot)), + "foo3: unrecognized unnamed argument\n The call was foo3(x=10, plot)") Error : foo3: unrecognized unnamed argument The call was foo3(x=10, plot) Got expected error from try(foo3(10, plot)) > > expect.err(try(foo3(20, c(1,2,3), plot)), + "foo3: unrecognized unnamed argument\n The call was foo3(x=20, c(1,2,3), plot)") Error : foo3: unrecognized unnamed argument The call was foo3(x=20, c(1,2,3), plot) Got expected error from try(foo3(20, c(1, 2, 3), plot)) > > expect.err(try(foo3(20, c(1,2,3,4,5,6,7,8,9,10,11,12), plot)), + "foo3: unrecognized unnamed argument\n The call was foo3(x=20, c(1,2,3,4,5,6,7,8,9,10,11,12), plot)") Error : foo3: unrecognized unnamed argument The call was foo3(x=20, c(1,2,3,4,5,6,7,8,9,10,11,12), plot) Got expected error from try(foo3(20, c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), plot)) > > # test that we don't crash because we eval the argument > expect.err(try(foo3(20, y=stop("stop was called"))), "foo3: unrecognized argument 'y'") Error : foo3: unrecognized argument 'y' Got expected error from try(foo3(20, y = stop("stop was called"))) > expect.err(try(foo3(20, stop("stop was called"))), "foo3: unrecognized unnamed argument") Error : foo3: unrecognized unnamed argument The call was foo3(x=20, stop("stopwascalled")) Got expected error from try(foo3(20, stop("stop was called"))) > expect.err(try(foo3(20, cat("side effect\n"))), + "foo3: unrecognized unnamed argument\n The call was foo3(x=20, cat(") Error : foo3: unrecognized unnamed argument The call was foo3(x=20, cat("sideeffect\n")) Got expected error from try(foo3(20, cat("side effect\n"))) > foo2 <- function(...) plotmo:::stop.if.dots(...) > foo2() # ok > expect.err(try(foo2(y=2)), "foo2: unrecognized argument 'y'") Error : foo2: unrecognized argument 'y' Got expected error from try(foo2(y = 2)) > expect.err(try(foo2(2)), "foo2: unrecognized unnamed argument\n The call was foo2(2)") Error : foo2: unrecognized unnamed argument The call was foo2(2) Got expected error from try(foo2(2)) > expect.err(try(foo2(y=plot)), "foo2: unrecognized argument 'y'") Error : foo2: unrecognized argument 'y' Got expected error from try(foo2(y = plot)) > expect.err(try(foo2(plot)), + "foo2: unrecognized unnamed argument\n The call was foo2(plot)") Error : foo2: unrecognized unnamed argument The call was foo2(plot) Got expected error from try(foo2(plot)) > > foo2a <- function(funcarg, ...) funcarg(...) > expect.err(try(foo2a(function(x=1, ...) plotmo:::stop.if.dots(...), x=1, y=2)), "funcarg: unrecognized argument 'y'") Error : funcarg: unrecognized argument 'y' Got expected error from try(foo2a(function(x = 1, ...) plotmo:::stop.if.dots(...), x = 1, y = 2)) > > cat0("=== test warn.if.dots\n") === test warn.if.dots > > options(warn=2) # treat warnings as errors > > foo3 <- function(x=1, ...) plotmo:::warn.if.dots(...) > foo3(1) # ok > expect.err(try(foo3(1, y=2)), "foo3 ignored argument 'y'") Error : (converted from warning) foo3 ignored argument 'y' Got expected error from try(foo3(1, y = 2)) > expect.err(try(foo3(1, 2)), "foo3 ignored unnamed argument\n The call was foo3(x=1, 2)") Error : (converted from warning) foo3 ignored unnamed argument The call was foo3(x=1, 2) Got expected error from try(foo3(1, 2)) > expect.err(try(foo3(1, y=plot)), "foo3 ignored argument 'y'") Error : (converted from warning) foo3 ignored argument 'y' Got expected error from try(foo3(1, y = plot)) > # TODO would like to improve this error messsage > expect.err(try(foo3(1, plot)), + "(converted from warning) foo3 ignored unnamed argument\n The call was foo3(x=1, plot)") Error : (converted from warning) foo3 ignored unnamed argument The call was foo3(x=1, plot) Got expected error from try(foo3(1, plot)) > foo4 <- function(...) plotmo:::warn.if.dots(...) > foo4() # ok > expect.err(try(foo4(y=2)), "foo4 ignored argument 'y'") Error : (converted from warning) foo4 ignored argument 'y' Got expected error from try(foo4(y = 2)) > expect.err(try(foo4(2)), "foo4 ignored unnamed argument\n The call was foo4(2)") Error : (converted from warning) foo4 ignored unnamed argument The call was foo4(2) Got expected error from try(foo4(2)) > expect.err(try(foo4(y=plot)), "foo4 ignored argument 'y'") Error : (converted from warning) foo4 ignored argument 'y' Got expected error from try(foo4(y = plot)) > expect.err(try(foo4(plot)), + "(converted from warning) foo4 ignored unnamed argument\n The call was foo4(plot)") Error : (converted from warning) foo4 ignored unnamed argument The call was foo4(plot) Got expected error from try(foo4(plot)) > > options(warn=1) > > foo3(1, nonesuch=12, nonesuch2=12, 999) # expect three warnings Warning: foo3 ignored argument 'nonesuch' Warning: foo3 ignored argument 'nonesuch2' Warning: foo3 ignored unnamed argument The call was foo3(x=1, nonesuch=12, nonesuch2=12, 999) > > cat0("=== test using sample functions that invoke call.dots\n") === test using sample functions that invoke call.dots > > x <- 1:10 > y <- x * x > lmfit <- lm(y~x) > par(mfrow=c(3, 2)) > par(oma=c(0, 0, 3, 0)) > > # plot1: simple example > # we choose to use predict() here rather than fitted() because nearly all > # models have a fitted() method, but many don't have a fitted() method. > > plot1 <- function(object, ...) + { + residuals <- residuals(object, ...) + + fitted <- predict(object, ...) + + plot(fitted, residuals, ...) + } > plot1(lmfit) > mtext("example plot functions using prefixed dots", outer=TRUE, font=2, line=1, cex=1) > > # Following causes error in predict.lm(). The type argument meant for > # residuals() is also sent to predict.lm(), where it is rejected. > > expect.err(try(plot1(lmfit, type="pearson")), "'arg' should be one of \"response\", \"terms\"") Error in match.arg(type) : 'arg' should be one of "response", "terms" Got expected error from try(plot1(lmfit, type = "pearson")) > > # plot2: use prefixed args > > plot2 <- function(object, ..., TRACE=2) + { + resids <- plotmo:::call.dots(residuals, object=object, ..., TRACE=TRACE) + + fitted <- plotmo:::call.dots(predict, object=object, ..., TRACE=TRACE) + + plotmo:::call.plot(plot, x=fitted, y=resids, ..., TRACE=TRACE) + } > # we can now direct args using the prefixes "residuals.", "predict.", or "plot.") > > plot2(lmfit, residuals.type="pearson") plot2 invoked call.dots TRACE plotmo:::call.dots called deprefix(FUNC=residuals, PREFIX=PREFIX, ..., DROP=DROP, KEEP=KEEP, TRACE=TRACE, FNAME="residuals", FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=CALLARGS, object=lm.object, residuals.type="pearson") PREFIX residuals. DROP .* KEEP >STANDARDPREFIXES|^force\.|^def\.|^drop\. >PREFIX|^residuals\. >CALLARGS|^object$ >EXPLICIT input dotnames object residuals.type after DROP and KEEP object residuals.type return dotnames object type residuals(object=lm.object, type="pearson") plot2 invoked call.dots TRACE plotmo:::call.dots called deprefix(FUNC=predict, PREFIX=PREFIX, ..., DROP=DROP, KEEP=KEEP, TRACE=TRACE, FNAME="predict", FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=CALLARGS, object=lm.object, residuals.type="pearson") PREFIX predict. DROP .* KEEP >STANDARDPREFIXES|^force\.|^def\.|^drop\. >PREFIX|^predict\. >CALLARGS|^object$ >EXPLICIT input dotnames object residuals.type after DROP and KEEP object return dotnames object predict(object=lm.object) plot2 invoked call.dots TRACE plotmo:::call.plot called call.dots(FUNC=plot, PREFIX=PREFIX, ..., DROP="*", KEEP="PREFIX,PLOT.ARGS", TRACE=TRACE, FNAME=fname, FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=function.object, CALLER=caller, x=c(-11,0,11,22,3...), y=c(12,4,-2,-6,-8...), residuals.type="pearson") PREFIX plot. DROP .* KEEP >STANDARDPREFIXES|^force\.|^def\.|^drop\. >PREFIX|^plot\. >CALLARGS|^x$|^y$ >EXPLICIT >PLOT_ARGS|^add$|^adj$|^bty$|^cex$|^cex\.axis$|^cex\.lab$|^cex\.main$|^cex\.sub$|^col$|^col\.axis$|^col\.lab$|^col\.main$|^col\.sub$|^crt$|^family$|^font$|^font$|^font\.axis$|^font\.lab$|^font\.main$|^font\.sub$|^lend$|^ljoin$|^lmitre$|^lty$|^lwd$|^main$|^pch$|^srt$|^xaxp$|^xaxs$|^xaxt$|^xlab$|^xlim$|^xlog$|^xpd$|^yaxp$|^yaxs$|^yaxt$|^ylab$|^ylim$|^ylog$ input dotnames x y residuals.type after DROP and KEEP x y return dotnames x y plot(x=c(-11,0,11,22,3...), y=c(12,4,-2,-6,-8...)) > > # We can also use the usual plot arguments like ylab: call.dots drops > # them; call.plot recognizes them and passes them to lines(). > > plot2(lmfit, residuals.type="pearson", ylab="pearson residuals", main="plot2") plot2 invoked call.dots TRACE plotmo:::call.dots called deprefix(FUNC=residuals, PREFIX=PREFIX, ..., DROP=DROP, KEEP=KEEP, TRACE=TRACE, FNAME="residuals", FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=CALLARGS, object=lm.object, residuals.type="pearson", ylab="pearson residuals", main="plot2") PREFIX residuals. DROP .* KEEP >STANDARDPREFIXES|^force\.|^def\.|^drop\. >PREFIX|^residuals\. >CALLARGS|^object$ >EXPLICIT input dotnames object residuals.type ylab main after DROP and KEEP object residuals.type return dotnames object type residuals(object=lm.object, type="pearson") plot2 invoked call.dots TRACE plotmo:::call.dots called deprefix(FUNC=predict, PREFIX=PREFIX, ..., DROP=DROP, KEEP=KEEP, TRACE=TRACE, FNAME="predict", FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=CALLARGS, object=lm.object, residuals.type="pearson", ylab="pearson residuals", main="plot2") PREFIX predict. DROP .* KEEP >STANDARDPREFIXES|^force\.|^def\.|^drop\. >PREFIX|^predict\. >CALLARGS|^object$ >EXPLICIT input dotnames object residuals.type ylab main after DROP and KEEP object return dotnames object predict(object=lm.object) plot2 invoked call.dots TRACE plotmo:::call.plot called call.dots(FUNC=plot, PREFIX=PREFIX, ..., DROP="*", KEEP="PREFIX,PLOT.ARGS", TRACE=TRACE, FNAME=fname, FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=function.object, CALLER=caller, x=c(-11,0,11,22,3...), y=c(12,4,-2,-6,-8...), residuals.type="pearson", ylab="pearson residuals", main="plot2") PREFIX plot. DROP .* KEEP >STANDARDPREFIXES|^force\.|^def\.|^drop\. >PREFIX|^plot\. >CALLARGS|^x$|^y$ >EXPLICIT >PLOT_ARGS|^add$|^adj$|^bty$|^cex$|^cex\.axis$|^cex\.lab$|^cex\.main$|^cex\.sub$|^col$|^col\.axis$|^col\.lab$|^col\.main$|^col\.sub$|^crt$|^family$|^font$|^font$|^font\.axis$|^font\.lab$|^font\.main$|^font\.sub$|^lend$|^ljoin$|^lmitre$|^lty$|^lwd$|^main$|^pch$|^srt$|^xaxp$|^xaxs$|^xaxt$|^xlab$|^xlim$|^xlog$|^xpd$|^yaxp$|^yaxs$|^yaxt$|^ylab$|^ylim$|^ylog$ input dotnames x y residuals.type ylab main after DROP and KEEP x y ylab main return dotnames x y main ylab plot(x=c(-11,0,11,22,3...), y=c(12,4,-2,-6,-8...), main="plot2", ylab="pearson residuals") > > # plot3: further refinements > # o namespace added to FUNC arg > # o full name for plot.default > # o force. and def. prefixes > # o explicit xlab and ylab for call.plot > # o unprefixed args are passed to residuals() > > plot3 <- function(object, ..., TRACE=2) + { + resids <- plotmo:::call.dots(stats::residuals, + DROP="plotmo:::PLOTARGS,predict.,plot.", + TRACE=TRACE, force.object=object, ...) + + fitted <- plotmo:::call.dots(stats::predict, + force.object=object, TRACE=TRACE, ...) + + plotmo:::call.plot(graphics::plot.default, force.x=fitted, force.y=resids, + def.xlab="fitted", def.ylab="residuals", + TRACE=TRACE, ...) + } > plot3(lmfit, type="pearson", main="plot3a") # type goes only to pearson, no prefix needed plot3 invoked call.dots TRACE plotmo:::call.dots called deprefix(FUNC=residuals, PREFIX=PREFIX, ..., DROP=DROP, KEEP=KEEP, TRACE=TRACE, FNAME="residuals", FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=CALLARGS, force.object=lm.object, type="pearson", main="plot3a") PREFIX residuals. DROP >PREFIX >EXPLICIT|^plotmo:::PLOTARGS|^predict\.|^plot\. KEEP >STANDARDPREFIXES|^force\.|^def\.|^drop\. >PREFIX|^residuals\. >CALLARGS|^force\.object$ >EXPLICIT input dotnames force.object type main after DROP and KEEP force.object type main return dotnames object type main stats::residuals(object=lm.object, type="pearson", main="plot3a") plot3 invoked call.dots TRACE plotmo:::call.dots called deprefix(FUNC=predict, PREFIX=PREFIX, ..., DROP=DROP, KEEP=KEEP, TRACE=TRACE, FNAME="predict", FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=CALLARGS, force.object=lm.object, type="pearson", main="plot3a") PREFIX predict. DROP .* KEEP >STANDARDPREFIXES|^force\.|^def\.|^drop\. >PREFIX|^predict\. >CALLARGS|^force\.object$ >EXPLICIT input dotnames force.object type main after DROP and KEEP force.object return dotnames object stats::predict(object=lm.object) plot3 invoked call.dots TRACE plotmo:::call.plot called call.dots(FUNC=plot.default, PREFIX=PREFIX, ..., DROP="*", KEEP="PREFIX,PLOT.ARGS", TRACE=TRACE, FNAME=fname, FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=function.object, CALLER=caller, force.x=c(-11,0,11,22,3...), force.y=c(12,4,-2,-6,-8...), def.xlab="fitted", def.ylab="residuals", type="pearson", main="plot3a") PREFIX plot. DROP .* KEEP >STANDARDPREFIXES|^force\.|^def\.|^drop\. >PREFIX|^plot\. >CALLARGS|^force\.x$|^force\.y$|^def\.xlab$|^def\.ylab$ >EXPLICIT >PLOT_ARGS|^add$|^adj$|^bty$|^cex$|^cex\.axis$|^cex\.lab$|^cex\.main$|^cex\.sub$|^col$|^col\.axis$|^col\.lab$|^col\.main$|^col\.sub$|^crt$|^family$|^font$|^font$|^font\.axis$|^font\.lab$|^font\.main$|^font\.sub$|^lend$|^ljoin$|^lmitre$|^lty$|^lwd$|^main$|^pch$|^srt$|^xaxp$|^xaxs$|^xaxt$|^xlab$|^xlim$|^xlog$|^xpd$|^yaxp$|^yaxs$|^yaxt$|^ylab$|^ylim$|^ylog$ input dotnames force.x force.y def.xlab def.ylab type main after DROP and KEEP force.x force.y def.xlab def.ylab main return dotnames x y main xlab ylab graphics::plot.default(x=c(-11,0,11,22,3...), y=c(12,4,-2,-6,-8...), main="plot3a", xlab="fitted", ylab="residuals") > plot3(lmfit, type="pearson", predict.type="response", main="plot3b") plot3 invoked call.dots TRACE plotmo:::call.dots called deprefix(FUNC=residuals, PREFIX=PREFIX, ..., DROP=DROP, KEEP=KEEP, TRACE=TRACE, FNAME="residuals", FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=CALLARGS, force.object=lm.object, type="pearson", predict.type="response", main="plot3b") PREFIX residuals. DROP >PREFIX >EXPLICIT|^plotmo:::PLOTARGS|^predict\.|^plot\. KEEP >STANDARDPREFIXES|^force\.|^def\.|^drop\. >PREFIX|^residuals\. >CALLARGS|^force\.object$ >EXPLICIT input dotnames force.object type predict.type main after DROP and KEEP force.object type main return dotnames object type main stats::residuals(object=lm.object, type="pearson", main="plot3b") plot3 invoked call.dots TRACE plotmo:::call.dots called deprefix(FUNC=predict, PREFIX=PREFIX, ..., DROP=DROP, KEEP=KEEP, TRACE=TRACE, FNAME="predict", FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=CALLARGS, force.object=lm.object, type="pearson", predict.type="response", main="plot3b") PREFIX predict. DROP .* KEEP >STANDARDPREFIXES|^force\.|^def\.|^drop\. >PREFIX|^predict\. >CALLARGS|^force\.object$ >EXPLICIT input dotnames force.object type predict.type main after DROP and KEEP force.object predict.type return dotnames object type stats::predict(object=lm.object, type="response") plot3 invoked call.dots TRACE plotmo:::call.plot called call.dots(FUNC=plot.default, PREFIX=PREFIX, ..., DROP="*", KEEP="PREFIX,PLOT.ARGS", TRACE=TRACE, FNAME=fname, FORMALS=FORMALS, SCALAR=SCALAR, CALLARGS=function.object, CALLER=caller, force.x=c(-11,0,11,22,3...), force.y=c(12,4,-2,-6,-8...), def.xlab="fitted", def.ylab="residuals", type="pearson", predict.type="response", main="plot3b") PREFIX plot. DROP .* KEEP >STANDARDPREFIXES|^force\.|^def\.|^drop\. >PREFIX|^plot\. >CALLARGS|^force\.x$|^force\.y$|^def\.xlab$|^def\.ylab$ >EXPLICIT >PLOT_ARGS|^add$|^adj$|^bty$|^cex$|^cex\.axis$|^cex\.lab$|^cex\.main$|^cex\.sub$|^col$|^col\.axis$|^col\.lab$|^col\.main$|^col\.sub$|^crt$|^family$|^font$|^font$|^font\.axis$|^font\.lab$|^font\.main$|^font\.sub$|^lend$|^ljoin$|^lmitre$|^lty$|^lwd$|^main$|^pch$|^srt$|^xaxp$|^xaxs$|^xaxt$|^xlab$|^xlim$|^xlog$|^xpd$|^yaxp$|^yaxs$|^yaxt$|^ylab$|^ylim$|^ylog$ input dotnames force.x force.y def.xlab def.ylab type predict.type main after DROP and KEEP force.x force.y def.xlab def.ylab main return dotnames x y main xlab ylab graphics::plot.default(x=c(-11,0,11,22,3...), y=c(12,4,-2,-6,-8...), main="plot3b", xlab="fitted", ylab="residuals") > > cat0("=== test callers.name\n") === test callers.name > > test.callers.name <- function(x) { + caller0 <- plotmo:::callers.name(0) # test.callers.name + caller1 <- plotmo:::callers.name(1) # caller of test.callers.name + caller99 <- plotmo:::callers.name(99) # sys.call(-n) : not that many frames on the stack + s <- sprint("0 %s 1 %s 99 %s", caller0, caller1, caller99) + cat(s, "\n", sep="") + s + } > print(plotmo:::callers.name()) # "eval" [1] "NULL" > myfunc <- function(func) func() > stopifnot(myfunc(function(x) test.callers.name(99)) == "0 test.callers.name 1 func 99 unknown") 0 test.callers.name 1 func 99 unknown > stopifnot(test.callers.name() == "0 test.callers.name 1 stopifnot 99 unknown") 0 test.callers.name 1 stopifnot 99 unknown > > source("test.epilog.R") plotmo/inst/slowtests/test.gbm.Rout.save0000644000176200001440000010356114664454472020171 0ustar liggesusers> # test.gbm.R: gbm tests for plotmo and plotres > > source("test.prolog.R") > library(gbm) Loaded gbm 2.2.2 This version of gbm is no longer under development. Consider transitioning to gbm3, https://github.com/gbm-developers/gbm3 > library(rpart.plot) # for ptitanic, want data with NAs for testing Loading required package: rpart > library(plotmo) Loading required package: Formula Loading required package: plotrix > data(ptitanic) > > cat("--- distribution=\"gaussian\", formula interface ----------------------------------\n") --- distribution="gaussian", formula interface ---------------------------------- > > set.seed(2016) > ptit <- ptitanic[sample(1:nrow(ptitanic), size=70), ] # small data for fast test > set.seed(2016) > # # TODO bug in gbm: following causes error: survived is not of type numeric, ordered, or factor > # ptit$survived <- ptit$survived == "survived" > ptit <- ptit[!is.na(ptit$age), ] > train.frac <- .8 > set.seed(2016) > gbm.gaussian <- gbm(age~., data=ptit, train.frac=train.frac, + distribution="gaussian", + n.trees=50, shrinkage=.1, keep.data=FALSE) > expect.err(try(plotres(gbm.gaussian)), "use keep.data=TRUE in the call to gbm") Error : use keep.data=TRUE in the call to gbm (cannot determine the variable importances) Got expected error from try(plotres(gbm.gaussian)) > set.seed(2016) > gbm.gaussian <- gbm(age~., data=ptit, train.frac=train.frac, + distribution="gaussian", + n.trees=50, shrinkage=.1) > par(mfrow=c(2,2), mar=c(3,3,4,1)) > w1 <- plotres(gbm.gaussian, which=1, do.par=FALSE, w1.smooth=TRUE, + w1.main="gbm.gaussian") > cat("w1 plot for gbm.gaussian returned (w1.smooth=TRUE):\n") w1 plot for gbm.gaussian returned (w1.smooth=TRUE): > print(w1) train test CV OOB 50 1 0 1 > plot(0, 0) # dummy plot > w3 <- plotres(gbm.gaussian, which=3, do.par=FALSE, info=TRUE, + smooth.col=0, col=ptit$sex, # ylim=c(-40,40), + wmain="nresponse=1") > # compare to manual residuals > iused <- 1:(train.frac * nrow(ptit)) > y <- ptit$age[iused] > n.trees <- plotmo:::gbm.n.trees(gbm.gaussian) > # TODO following fails in the new version of gbm (version 2.2) (you have to provide newdata) > # yhat <- predict(gbm.gaussian, type="response", n.trees=n.trees) > yhat <- predict(gbm.gaussian, newdata=ptit, type="response", n.trees=n.trees) > yhat <- yhat[iused] > plot(yhat, y - yhat, + col=ptit$sex[iused], main="manual gaussian residuals", + pch=20, ylim=c(-40,40)) > abline(h=0, col="gray") > stopifnot(all(yhat == w3$x)) > stopifnot(all(y - yhat == w3$y)) > par(org.par) > > w1 <- plotres(gbm.gaussian, predict.n.trees=13, w1.grid.col=1, trace=1, SHOWCALL=TRUE, + w1.smooth=TRUE, + w1.main="predict.n.trees=13 w1.grid.col=1") importance: survived pclass parch sibsp sex stats::residuals(object=gbm.object, type="response") residuals() was unsuccessful, will use predict() instead stats::predict(gbm.object, data.frame[3,5], type="response", n.trees=13) stats::fitted(object=gbm.object) fitted() was unsuccessful, will use predict() instead plot_gbm(gbm.object, main="predict.n.trees=13 w1.grid.col=1", n.trees=13, grid.col=1, smooth=TRUE) training rsq 0.07 > cat("second w1 plot for gbm.gaussian returned (w1.smooth=TRUE):\n") second w1 plot for gbm.gaussian returned (w1.smooth=TRUE): > print(w1) train test CV OOB 50 1 0 1 > plotmo(gbm.gaussian, trace=-1, SHOWCALL=TRUE) > # plotmo(gbm.gaussian, trace=-1, all1=TRUE, SHOWCALL=TRUE) > # plotmo(gbm.gaussian, trace=-1, all2=TRUE, SHOWCALL=TRUE) > > # test color argument > par(mfrow=c(2,2), mar=c(3,3,4,1)) > plotres(gbm.gaussian, which=1) > title("test color argument") > plotres(gbm.gaussian, which=1, w1.col=c(1,2,3,0)) > plotres(gbm.gaussian, which=1, w1.col=c(1,0,0,4), w1.legend.x=40, w1.legend.y=.3) > plotres(gbm.gaussian, which=1, w1.col=c(2,3,4,1), w1.legend.x="topright") > par(org.par) > > par(mfrow=c(2,2), mar=c(3,3,4,1)) > plot_gbm(gbm.gaussian) > title("test plot_gbm") > w1 <- plot_gbm(gbm.gaussian, col=c(1,2,3,0), grid.col=1, smooth=TRUE, + main="col=c(1,2,3,0), grid.col=1") > cat("third w1 plot for gbm.gaussian returned (smooth=TRUE):\n") third w1 plot for gbm.gaussian returned (smooth=TRUE): > print(w1) train test CV OOB 50 1 0 1 > par(org.par) > > # test xlim and ylim > par(mfrow=c(2,3), mar=c(3,3,4,1)) > plot_gbm(gbm.gaussian, main="test xlim and ylim default") > plot_gbm(gbm.gaussian, ylim=NULL, main="ylim=NULL") > plot_gbm(gbm.gaussian, xlim=c(5, 50), main="xlim=c(5, 50)") > plot_gbm(gbm.gaussian, ylim=c(100, 250), main="ylim=c(100, 250)") > plot_gbm(gbm.gaussian, xlim=c(10, 25), + ylim=c(150, 170), main="xlim=c(10, 25), ylim=c(150, 170)") > plot_gbm(gbm.gaussian, xlim=c(-10, 40), ylim=c(-10, 300), legend.x=NA, + main="xlim=c(-10, 40), ylim=c(-10, 300)\nlegend.x=NA") > par(org.par) > > # test the smooth argument > par(mfrow=c(3,3), mar=c(3,3,4,1)) > imin <- plot_gbm(gbm.gaussian, main="smooth=default") > imin.default <- imin > cat("smooth=default imin=c(", imin[1], ",", imin[2], ",", imin[3], ",", imin[4], ")\n", sep="") smooth=default imin=c(50,2,0,1) > > imin <- plot_gbm(gbm.gaussian, smooth=c(1,0,0,0), main="smooth=c(1,0,0,0)") > cat("smooth=c(1,0,0,0) imin=c(", imin[1], ",", imin[2], ",", imin[3], ",", imin[4], ")\n", sep="") smooth=c(1,0,0,0) imin=c(50,2,0,6) > > imin <- plot_gbm(gbm.gaussian, smooth=c(0,1,0,0), main="smooth=c(0,1,0,0)") > cat("smooth=c(0,1,0,0) imin=c(", imin[1], ",", imin[2], ",", imin[3], ",", imin[4], ")\n", sep="") smooth=c(0,1,0,0) imin=c(50,1,0,6) > > imin <- plot_gbm(gbm.gaussian, smooth=c(0,0,1,0), main="smooth=c(0,0,1,0)") > cat("smooth=c(0,0,1,0) imin=c(", imin[1], ",", imin[2], ",", imin[3], ",", imin[4], ")\n", sep="") smooth=c(0,0,1,0) imin=c(50,2,0,6) > > imin <- plot_gbm(gbm.gaussian, smooth=c(0,0,0,1), main="smooth=c(0,0,0,1)\nsame as default") > cat("smooth=c(0,0,0,1) imin=c(", imin[1], ",", imin[2], ",", imin[3], ",", imin[4], ")\n", sep="") smooth=c(0,0,0,1) imin=c(50,2,0,1) > > imin <- plot_gbm(gbm.gaussian, smooth=c(0,0,0,0), main="smooth=c(0,0,0,0)") > cat("smooth=c(0,0,0,0) imin=c(", imin[1], ",", imin[2], ",", imin[3], ",", imin[4], ")\n", sep="") smooth=c(0,0,0,0) imin=c(50,2,0,6) > > imin <- plot_gbm(gbm.gaussian, smooth=c(0,0,1,1), main="smooth=c(0,0,1,1)") > cat("smooth=c(0,0,1,1) imin=c(", imin[1], ",", imin[2], ",", imin[3], ",", imin[4], ")\n", sep="") smooth=c(0,0,1,1) imin=c(50,2,0,1) > > imin <- plot_gbm(gbm.gaussian, smooth=1, main="smooth=1") # gets recycled > cat("smooth=1 imin=c(", imin[1], ",", imin[2], ",", imin[3], ",", imin[4], ")\n", sep="") smooth=1 imin=c(50,1,0,1) > imin.smooth <- imin > > imin.noplot <- plot_gbm(gbm.gaussian, col=0) # will not be plotted > print(imin.default) train test CV OOB 50 2 0 1 > print(imin.noplot) train test CV OOB 50 2 0 1 > stopifnot(identical(imin.default, imin.noplot)) > > imin.noplot <- plot_gbm(gbm.gaussian, col=0, smooth=1) # will not be plotted > print(imin.smooth) train test CV OOB 50 1 0 1 > print(imin.noplot) train test CV OOB 50 1 0 1 > stopifnot(identical(imin.smooth, imin.noplot)) > > par(org.par) > > cat("--- distribution=\"gaussian\", glm.fit interface ----------------------------------\n") --- distribution="gaussian", glm.fit interface ---------------------------------- > > set.seed(2016) > ptit <- ptitanic[sample(1:nrow(ptitanic), size=70), ] > set.seed(2016) > ptit <- ptit[!is.na(ptit$age), ] > train.frac <- .8 > set.seed(2016) > gbm.gaussian.fit <- gbm.fit(ptit[,-4], ptit[,4], nTrain=floor(train.frac * nrow(ptit)), + distribution="gaussian", verbose=FALSE, + n.trees=50, shrinkage=.1) > par(mfrow=c(2,2), mar=c(3,3,4,1)) > w1 <- plotres(gbm.gaussian.fit, which=1, do.par=FALSE, w1.smooth=TRUE, + w1.main="gbm.gaussian.fit") > > cat("w1 plot for gbm.gaussian.fit returned (w1.smooth=TRUE):\n") w1 plot for gbm.gaussian.fit returned (w1.smooth=TRUE): > print(w1) train test CV OOB 50 1 0 1 > > plot(0, 0) # dummy plot > > w3 <- plotres(gbm.gaussian.fit, which=3, do.par=FALSE, info=TRUE, trace=0, + smooth.col=0, col=ptit$sex, # ylim=c(-40,40), + wmain="nresponse=1") > > # compare to manual residuals > iused <- 1:(train.frac * nrow(ptit)) > y.fit <- ptit$age[iused] > n.trees <- plotmo:::gbm.n.trees(gbm.gaussian.fit) > # TODO following fails in the new version of gbm (version 2.2) (you have to provide newdata) > # yhat.fit <- predict(gbm.gaussian.fit, type="response", n.trees=n.trees) > yhat.fit <- predict(gbm.gaussian.fit, newdata=ptit[,-4], type="response", n.trees=n.trees) > yhat.fit <- yhat.fit[iused] > # plot(yhat.fit, y.fit - yhat.fit, > # col=ptit$sex[iused], main="manual gaussian residuals\n(TODO gbm.fit don't match)", > # pch=20, ylim=c(-40,40)) > # abline(h=0, col="gray") > # --- TODO known issue, these fail --- > # compare to formual interface > # stopifnot(all(yhat.fit == yhat)) > stopifnot(all(y.fit == y)) > # # sanity check > # stopifnot(all(yhat.fit == w3$x)) > # stopifnot(all(y.fit - yhat.fit == w3$y.fit)) > plotmo(gbm.gaussian.fit, trace=-1, SHOWCALL=TRUE) > par(org.par) > > cat("--- distribution=\"laplace\" ----------------------------------\n") --- distribution="laplace" ---------------------------------- > > set.seed(2016) > ptit <- ptitanic[sample(1:nrow(ptitanic), size=70), ] > ptit <- ptit[!is.na(ptit$age), ] > ptit$survived <- ptit$parch <- ptit$sex <- NULL > train.frac <- .8 > set.seed(2016) > gbm.laplace <- gbm(age~., data=ptit, train.frac=train.frac, + distribution="laplace", + n.trees=100, shrinkage=.1) > par(mfrow=c(2,2), mar=c(3,3,4,1)) > w1 <- plotres(gbm.laplace, which=1:2, do.par=FALSE, w1.smooth=TRUE, + w1.main="gbm.laplace") > > cat("w1 plot for gbm.laplace returned (w1.smooth=TRUE):\n") w1 plot for gbm.laplace returned (w1.smooth=TRUE): > print(w1) train test CV OOB 75 100 0 1 > > w3 <- plotres(gbm.laplace, which=3, do.par=FALSE, info=TRUE) > > # compare to manual residuals > iused <- 1:(train.frac * nrow(ptit)) > y <- ptit$age[iused] > n.trees <- plotmo:::gbm.n.trees(gbm.laplace) > # TODO following fails in the new version of gbm (version 2.2) (you have to provide newdata) > # yhat <- predict(gbm.laplace, type="response", n.trees=n.trees) > yhat <- predict(gbm.laplace, newdata=ptit, type="response", n.trees=n.trees) > yhat <- yhat[iused] > plot(yhat, y - yhat, + main="manual laplace residuals", + pch=20, ylim=c(-40,40)) > abline(h=0, col="gray") > stopifnot(all(yhat == w3$x)) > stopifnot(all(y - yhat == w3$y)) > plotmo(gbm.laplace, trace=-1, SHOWCALL=TRUE) > par(org.par) > > # # TODO commented out because gives random slightly different results per invocation > # cat("--- distribution=\"tdist\" ----------------------------------\n") > # > # set.seed(2016) > # ptit <- ptitanic[sample(1:nrow(ptitanic), size=70), ] > # ptit <- ptit[!is.na(ptit$age), ] > # ptit$survived <- ptit$parch <- ptit$sex <- NULL > # train.frac <- .8 > # set.seed(2016) > # gbm.tdist <- gbm(age~., data=ptit, train.frac=train.frac, > # distribution="tdist", > # n.trees=100, shrinkage=.1) > # par(mfrow=c(2,2), mar=c(3,3,4,1)) > # set.seed(2016) > # w1 <- plotres(gbm.tdist, which=1:2, do.par=FALSE, > # w1.main="gbm.tdist") > # > # cat("w1 plot for gbm.tdist returned (w1.smooth=default):\n") > # print(w1) > # > # set.seed(2016) > # w3 <- plotres(gbm.tdist, which=3, do.par=FALSE, info=TRUE) > # > # # compare to manual residuals > # iused <- 1:(train.frac * nrow(ptit)) > # y <- ptit$age[iused] > # n.trees <- plotmo:::gbm.n.trees(gbm.tdist) > # # TODO following fails in the new version of gbm (version 2.2) (you have to provide newdata) > # # yhat <- predict(gbm.tdist, type="response", n.trees=n.trees) > # yhat <- predict(gbm.tdist, newdata=ptit, type="response", n.trees=n.trees) > # yhat <- yhat[iused] > # plot(yhat, y - yhat, > # main="manual tdist residuals", > # pch=20, ylim=c(-40,40)) > # abline(h=0, col="gray") > # stopifnot(all(yhat == w3$x)) > # stopifnot(all(y - yhat == w3$y)) > # plotmo(gbm.tdist, trace=-1, SHOWCALL=TRUE) > # par(org.par) > > cat("--- distribution=\"bernoulli\" ----------------------------------\n") --- distribution="bernoulli" ---------------------------------- > > set.seed(2016) > ptit <- ptitanic[sample(1:nrow(ptitanic), size=80), ] > ptit$survived <- as.numeric(ptit$survived == "survived") > temp <- ptit$pclass # put pclass at the end so can check ordering of importances > ptit$pclass <- NULL > ptit$pclass <- factor(as.numeric(temp), labels=c("first", "second", "third")) > train.frac <- .9 > set.seed(2016) > gbm.bernoulli <- gbm(survived~., data=ptit, train.frac=train.frac, + distribution="bernoulli", + n.trees=100, shrinkage=.1, cv.folds=3) > par(mfrow=c(2,2)) > par(mar=c(3.5, 3, 2, 0.5)) # small margins and text to pack figs in > par(mgp=c(1.5, .4, 0)) # squash axis annotations > w1 <- plotres(gbm.bernoulli, which=c(1,4), + col=ptit$survived+2, trace=0, do.par=FALSE, + w1.main="gbm.bernoulli") > cat("w1 plot for gbm.bernoulli with cv.folds=3 returned:\n") w1 plot for gbm.bernoulli with cv.folds=3 returned: > print(w1) train test CV OOB 100 24 99 16 > > w3 <- plotres(gbm.bernoulli, which=3, predict.n.trees=40, + ylim=c(-.6, 1), xlim=c(.1, .6), + col=ptit$sex, trace=0, do.par=FALSE, smooth.col=0) > > # compare to manual residuals > iused <- 1:(train.frac * nrow(ptit)) > y <- ptit$survived[iused] > # TODO following fails in the new version of gbm (version 2.2) (you have to provide newdata) > # yhat <- predict(gbm.bernoulli, type="response", n.trees=40) > yhat <- predict(gbm.bernoulli, newdata=ptit, type="response", n.trees=40) > yhat <- yhat[iused] > plot(yhat, y - yhat, col=ptit$sex, + main="manual bernoulli residuals", pch=20, cex=1, + ylim=c(-.6, 1), xlim=c(.1, .6)) > abline(h=0, col="gray") > stopifnot(all(yhat == w3$x)) > stopifnot(all(y - yhat == w3$y)) > par(org.par) > > plotmo(gbm.bernoulli, do.par=2) plotmo grid: sex age sibsp parch pclass male 27 0 0 third > print(summary(gbm.bernoulli)) # will also plot var rel.inf age age 32.307096 sex sex 29.921593 pclass pclass 17.323084 parch parch 13.277759 sibsp sibsp 7.170468 > par(org.par) > > cat("--- distribution=\"huberized\" ----------------------------------\n") --- distribution="huberized" ---------------------------------- > > set.seed(2016) > ptit <- ptitanic[sample(1:nrow(ptitanic), size=100), ] > ptit$survived <- as.numeric(ptit$survived == "survived") > ptit$sibsp <- ptit$parch <- ptit$pclass <- NULL > train.frac <- 1 > set.seed(2016) > gbm.huberized <- gbm(survived~., data=ptit, train.frac=train.frac, + distribution="huberized", + n.trees=200, shrinkage=.1) > par(mfrow=c(2,2)) > par(mar=c(3.5, 3, 2, 0.5)) # small margins and text to pack figs in > par(mgp=c(1.5, .4, 0)) # squash axis annotations > w1 <- plotres(gbm.huberized, which=c(1,4), + col=ptit$survived+2, trace=0, do.par=FALSE, + w1.main="gbm.huberized") Warning: plot_gbm: cannot plot OOB curve (it has some non-finite values) > cat("w1 plot for gbm.huberized returned (smooth=default):\n") w1 plot for gbm.huberized returned (smooth=default): > print(w1) train test CV OOB 169 0 0 0 > > # TODO huberized residuals look weird > w3 <- plotres(gbm.huberized, which=3, predict.n.trees=40, + col=ptit$sex, trace=0, do.par=FALSE, smooth.col=0) > > # compare to manual residuals > iused <- 1:(train.frac * nrow(ptit)) > y <- ptit$survived[iused] > # TODO following fails in the new version of gbm (version 2.2) (you have to provide newdata) > # yhat <- predict(gbm.huberized, type="response", n.trees=40) > yhat <- predict(gbm.huberized, newdata=ptit, type="response", n.trees=40) > yhat <- yhat[iused] > plot(yhat, y - yhat, col=ptit$sex, ylim=c(-2.5, 2.5), + main="manual huberized residuals", pch=20) > abline(h=0, col="gray") > stopifnot(all(yhat == w3$x)) > stopifnot(all(y - yhat == w3$y)) > par(org.par) > > plotmo(gbm.huberized, do.par=2) plotmo grid: sex age male 28 > print(summary(gbm.huberized)) # will also plot var rel.inf age age 68.12613 sex sex 31.87387 > par(org.par) > > cat("--- distribution=\"adaboost\" ----------------------------------\n") --- distribution="adaboost" ---------------------------------- > > set.seed(2016) > ptit <- ptitanic[sample(1:nrow(ptitanic), size=100), ] > ptit$survived <- as.numeric(ptit$survived == "survived") > ptit$sibsp <- ptit$parch <- ptit$pclass <- NULL > train.frac <- .8 > set.seed(2016) > gbm.adaboost <- gbm(survived~., data=ptit, train.frac=train.frac, + distribution="adaboost", + n.trees=150, shrinkage=.01) > par(mfrow=c(2,2)) > par(mar=c(3.5, 3, 2, 0.5)) # small margins and text to pack figs in > par(mgp=c(1.5, .4, 0)) # squash axis annotations > w1 <- plotres(gbm.adaboost, which=c(1,4), + col=ptit$survived+2, trace=0, do.par=FALSE, + w1.main="gbm.adaboost") > cat("w1 plot for gbm.adaboost returned (smooth=default):\n") w1 plot for gbm.adaboost returned (smooth=default): > print(w1) train test CV OOB 150 150 0 117 > > w3 <- plotres(gbm.adaboost, which=3, predict.n.trees=40, + col=ptit$sex, trace=0, do.par=FALSE, smooth.col=0) > > # compare to manual residuals > iused <- 1:(train.frac * nrow(ptit)) > y <- ptit$survived[iused] > # TODO following fails in the new version of gbm (version 2.2) (you have to provide newdata) > # yhat <- predict(gbm.adaboost, type="response", n.trees=40) > yhat <- predict(gbm.adaboost, newdata=ptit, type="response", n.trees=40) > yhat <- yhat[iused] > plot(yhat, y - yhat, col=ptit$sex, + main="manual adaboost residuals", pch=20) > abline(h=0, col="gray") > stopifnot(all(yhat == w3$x)) > stopifnot(all(y - yhat == w3$y)) > par(org.par) > > plotmo(gbm.adaboost, do.par=2) plotmo grid: sex age male 27.5 > print(summary(gbm.adaboost)) # will also plot var rel.inf sex sex 75.09661 age age 24.90339 > par(org.par) > > # test gbm multinomial model, also test very small number of trees in plot_gbm > > data(iris) > set.seed(2016) > gbm.iris <- gbm(Species~., data=iris, distribution="multinomial", n.tree=5) Warning: Setting `distribution = "multinomial"` is ill-advised as it is currently broken. It exists only for backwards compatibility. Use at your own risk. > expect.err(try(plotres(gbm.iris)), + "gbm distribution=\"multinomial\" is not yet supported") Error : gbm distribution="multinomial" is not yet supported (A direct call to plot_gbm may work) Got expected error from try(plotres(gbm.iris)) > expect.err(try(plotmo(gbm.iris)), + "gbm distribution=\"multinomial\" is not yet supported") Error : gbm distribution="multinomial" is not yet supported (A direct call to plot_gbm may work) Got expected error from try(plotmo(gbm.iris)) > plot_gbm(gbm.iris) > > # TODO following fails in the new version of gbm (version 2.2) > # (distribution "multinomial" is no longer supported) > # > # cat("--- distribution=\"multinomial\" ----------------------------------\n") > # > # set.seed(2016) > # ptit <- ptitanic[sample(1:nrow(ptitanic), size=500), ] > # set.seed(2016) > # gbm.multinomial <- gbm(pclass~., > # data=ptit, train.frac=.7, > # distribution="multinomial", > # n.trees=100, shrinkage=.1) > # > # w1 <- plot_gbm(gbm.multinomial, main="gbm.multinomial", smooth=T) > # cat("plot_gbm for gbm.multinomial returned (smooth=TRUE):\n") > # print(w1) > # > # expect.err(try(plotres(gbm.multinomial)), > # "gbm distribution=\"multinomial\" is not yet supported") > # > # expect.err(try(plotmo(gbm.multinomial)), > # "gbm distribution=\"multinomial\" is not yet supported") > > # cat("--- gbmt distribution=\"Gaussian\", formula interface ----------------------------------\n") > # > # set.seed(2016) > # ptit <- ptitanic[sample(1:nrow(ptitanic), size=70), ] # small data for fast test > # set.seed(2016) > # # # TODO bug in gbm: following causes error: survived is not of type numeric, ordered, or factor > # # ptit$survived <- ptit$survived == "survived" > # ptit <- ptit[!is.na(ptit$age), ] > # # TODO change this to build same model as gbm.gaussian > # train_params <- > # training_params(num_trees = 50, > # shrinkage = 0.1, > # bag_fraction = 0.5, > # num_train = round(.8 * nrow(ptit))) > # par(mfrow=c(2,2), mar=c(3,3,4,1)) > # set.seed(2016) > # gbmt.gaussian <- gbmt(age~., data=ptit, > # distribution=gbm_dist("Gaussian"), > # train_params = train_params, > # is_verbose = FALSE) > # expect.err(try(plotres(gbmt.gaussian)), > # "use keep.data=TRUE in the call to gbm") > # set.seed(2016) > # gbmt.gaussian <- gbmt(age~., data=ptit, > # distribution=gbm_dist("Gaussian"), > # train_params = train_params, > # is_verbose = FALSE, keep_gbm_data=TRUE) > # w1 <- plotres(gbmt.gaussian, which=1, do.par=FALSE, w1.smooth=TRUE, > # w1.main="gbmt.gaussian") > # cat("w1 plot for gbmt.gaussian returned (w1.smooth=TRUE):\n") > # print(w1) > # plot(0, 0) # dummy plot > # set.seed(2016) > # w3 <- plotres(gbmt.gaussian, which=3, do.par=FALSE, info=TRUE, > # smooth.col=0, col=ptit$sex, # ylim=c(-40,40), > # wmain="nresponse=1") > # > # # compare to manual residuals > # iused <- 1:(train.frac * nrow(ptit)) > # y <- ptit$age[iused] > # n.trees <- plotmo:::gbm.n.trees(gbmt.gaussian) > # # TODO following fails in the new version of gbm (version 2.2) (you have to provide newdata) > # # yhat <- predict(gbmt.gaussian, type="response", n.trees=n.trees) > # yhat <- predict(gbmt.gaussian, newdata=ptit, type="response", n.trees=n.trees) > # yhat <- yhat[iused] > # plot(yhat, y - yhat, > # col=ptit$sex[iused], main="manual gaussian residuals", > # pch=20, ylim=c(-40,40)) > # abline(h=0, col="gray") > # stopifnot(all(yhat == w3$x)) > # stopifnot(all(y - yhat == w3$y)) > # par(org.par) > # > # w1 <- plotres(gbmt.gaussian, predict.n.trees=13, w1.grid.col=1, trace=1, SHOWCALL=TRUE, > # w1.smooth=TRUE, > # w1.main="predict.n.trees=13 w1.grid.col=1") > # cat("second w1 plot for gbmt.gaussian returned (w1.smooth=TRUE):\n") > # print(w1) > # plotmo(gbmt.gaussian, trace=-1, SHOWCALL=TRUE) > # > # par(org.par) > # > # cat("--- distribution=\"bernoulli\" ----------------------------------\n") > # > # set.seed(2016) > # ptit <- ptitanic[sample(1:nrow(ptitanic), size=80), ] > # ptit$survived <- ptit$survived == "survived" > # temp <- ptit$pclass # put pclass at the end so can check ordering of importances > # ptit$pclass <- NULL > # ptit$pclass <- factor(as.numeric(temp), labels=c("first", "second", "third")) > # # TODO change this to build same model as gbm.bernoulli > # train_params <- > # training_params(num_trees = 100, > # shrinkage = 0.1, > # bag_fraction = 0.5, > # num_train = round(.8 * nrow(ptit))) > # set.seed(2016) > # gbmt.bernoulli <- gbmt(survived~., data=ptit, > # distribution=gbm_dist("Bernoulli"), > # train_params = train_params, > # cv_folds = 3, > # is_verbose = FALSE, keep_gbm_data=TRUE) > # par(mfrow=c(2,2)) > # par(mar=c(3.5, 3, 2, 0.5)) # small margins and text to pack figs in > # par(mgp=c(1.5, .4, 0)) # squash axis annotations > # w1 <- plotres(gbmt.bernoulli, which=c(1,4), > # col=ptit$survived+2, trace=0, do.par=FALSE, > # w1.main="gbmt.bernoulli") > # cat("w1 plot for gbmt.bernoulli with cv.folds=3 returned:\n") > # print(w1) > # > # w3 <- plotres(gbmt.bernoulli, which=3, predict.n.trees=40, > # ylim=c(-.6, 1), xlim=c(.1, .6), > # col=ptit$sex, trace=0, do.par=FALSE, smooth.col=0) > # > # # compare to manual residuals > # iused <- 1:(train.frac * nrow(ptit)) > # y <- ptit$survived[iused] > # # TODO following fails in the new version of gbm (version 2.2) (you have to provide newdata) > # # yhat <- predict(gbmt.bernoulli, type="response", n.trees=40) > # yhat <- predict(gbmt.bernoulli, newdata=ptit, type="response", n.trees=40) > # yhat <- yhat[iused] > # plot(yhat, y - yhat, col=ptit$sex, > # main="manual bernoulli residuals", pch=20, cex=1, > # ylim=c(-.6, 1), xlim=c(.1, .6)) > # abline(h=0, col="gray") > # stopifnot(all(yhat == w3$x)) > # stopifnot(all(y - yhat == w3$y)) > # par(org.par) > # > # plotmo(gbmt.bernoulli, do.par=2) > # print(summary(gbmt.bernoulli)) # will also plot > # par(org.par) > > cat("--- gbm3: distribution=\"gaussian\", formula interface ----------------------------------\n") --- gbm3: distribution="gaussian", formula interface ---------------------------------- > > library(gbm3) Attaching package: 'gbm3' The following objects are masked from 'package:gbm': gbm, gbm.fit, gbm.perf > > set.seed(2016) > ptit <- ptitanic[sample(1:nrow(ptitanic), size=70), ] # small data for fast test > set.seed(2016) > # # TODO bug in gbm3: following causes error: survived is not of type numeric, ordered, or factor > # ptit$survived <- ptit$survived == "survived" > ptit <- ptit[!is.na(ptit$age), ] > train.frac <- .8 > set.seed(2016) > gbm3.gaussian <- gbm3::gbm(age~., data=ptit, train.frac=train.frac, + distribution="gaussian", + n.trees=50, shrinkage=.1, keep.data=FALSE) > expect.err(try(plotres(gbm3.gaussian)), "use keep_gbm_data=TRUE in the call to gbm") Error : use keep_gbm_data=TRUE in the call to gbmt (object$gbm_data_obj is NULL) Got expected error from try(plotres(gbm3.gaussian)) > set.seed(2016) > gbm3.gaussian <- gbm3::gbm(age~., data=ptit, train.frac=train.frac, + distribution="gaussian", + n.trees=50, shrinkage=.1) > par(mfrow=c(2,2), mar=c(3,3,4,1)) > w1 <- plotres(gbm3.gaussian, which=1, do.par=FALSE, w1.smooth=TRUE, + w1.main="gbm3.gaussian") > cat("w1 plot for gbm3.gaussian returned (w1.smooth=TRUE):\n") w1 plot for gbm3.gaussian returned (w1.smooth=TRUE): > print(w1) train test CV OOB 50 1 0 12 > plot(0, 0) # dummy plot > w3 <- plotres(gbm3.gaussian, which=3, do.par=FALSE, info=TRUE, + smooth.col=0, col=ptit$sex, # ylim=c(-40,40), + wmain="nresponse=1") > > # compare to manual residuals > iused <- 1:(train.frac * nrow(ptit)) > y <- ptit$age[iused] > n.trees <- plotmo:::gbm.n.trees(gbm3.gaussian) > # TODO following fails in the new version of gbm (version 2.2) (you have to provide newdata) > # yhat <- predict(gbm3.gaussian, type="response", n.trees=n.trees) > yhat <- predict(gbm3.gaussian, newdata=ptit, type="response", n.trees=n.trees) > yhat <- yhat[iused] > plot(yhat, y - yhat, + col=ptit$sex[iused], main="manual gaussian residuals", + pch=20, ylim=c(-40,40)) > abline(h=0, col="gray") > stopifnot(all(yhat == w3$x)) > stopifnot(all(y - yhat == w3$y)) > par(org.par) > > w1 <- plotres(gbm3.gaussian, predict.n.trees=13, w1.grid.col=1, trace=1, SHOWCALL=TRUE, + w1.smooth=TRUE, + w1.main="predict.n.trees=13 w1.grid.col=1") stats::residuals(object=GBMFit.object, type="response") residuals() was unsuccessful, will use predict() instead stats::predict(GBMFit.object, data.frame[3,5], type="response", n.trees=13) stats::fitted(object=GBMFit.object) fitted() was unsuccessful, will use predict() instead plot_gbm(GBMFit.object, main="predict.n.trees=13 w1.grid.col=1", n.trees=13, grid.col=1, smooth=TRUE) training rsq 0.23 > cat("second w1 plot for gbm3.gaussian returned (w1.smooth=TRUE):\n") second w1 plot for gbm3.gaussian returned (w1.smooth=TRUE): > print(w1) train test CV OOB 50 1 0 12 > plotmo(gbm3.gaussian, trace=-1, SHOWCALL=TRUE) > # plotmo(gbm3.gaussian, trace=-1, all1=TRUE, SHOWCALL=TRUE) > # plotmo(gbm3.gaussian, trace=-1, all2=TRUE, SHOWCALL=TRUE) > > cat("--- gbm3: distribution=\"gaussian\", xy interface ----------------------------------\n") --- gbm3: distribution="gaussian", xy interface ---------------------------------- > > y = ptit$age > x = ptit[,c(1,2,3,5,6)] > train_params=gbm3::training_params(num_trees=100, + interaction_depth=2, + min_num_obs_in_node=3, + shrinkage=0.1, bag_fraction=0.5, + id=seq_len(nrow(x)), num_train=round(0.5 * nrow(x)), + num_features=ncol(x)) > gbm3fit <- gbm3::gbmt_fit(x, y, train_params=train_params, + keep_gbm_data=TRUE, dist=gbm_dist("Gaussian")) > plotmo(gbm3fit, trace=-1, SHOWCALL=TRUE) > plotres(gbm3fit, trace=-1, SHOWCALL=TRUE) > > cat("--- gbm3: large number of variables ----------------------------------\n") --- gbm3: large number of variables ---------------------------------- > > set.seed(2024) > N <- 1000 > > X <- data.frame(X1=runif(N), X2=2*runif(N), X3=3*runif(N), + X4=runif(N), X5=2*runif(N), X6=3*runif(N), + X7=runif(N), X8=2*runif(N), X9=3*runif(N), + X10=runif(N), X11=2*runif(N), X12=3*runif(N), + X13=runif(N), X14=2*runif(N), X15=3*runif(N)) > > # Y <- sample(c(0, 1), N, replace = TRUE) > set.seed(2024) > Y <- sqrt(X[,1]) + + sqrt(X[,2]) + + sqrt(X[,3]) + + sqrt(X[,4]) + + sqrt(X[,5]) + + sqrt(X[,6]) + + .5 * sqrt(X[,8]) + + sqrt(X[,9]) + + sqrt(X[,10]) + + sqrt(X[,11]) + + sqrt(X[,12]) > > data <- data.frame(Y, X) > set.seed(2024) > gbm3.big <- gbm3::gbm(Y~., data=data, shrinkage=0.1, dist="gaussian") > y = data[,1] > x = data[,2:ncol(data)] > train_params=gbm3::training_params(num_trees=100, + interaction_depth=3, + min_num_obs_in_node=10, + shrinkage=0.1, bag_fraction=0.5, + id=seq_len(nrow(x)), num_train=round(0.5 * nrow(x)), + num_features=ncol(x)) > gbm3fit.big <- gbm3::gbmt_fit(x, y, train_params=train_params, keep_gbm_data=TRUE, dist=gbm_dist("Gaussian")) > > set.seed(2024) > plotmo(gbm3.big, SHOWCALL=TRUE) plotmo grid: X1 X2 X3 X4 X5 X6 X7 0.5143486 0.9627323 1.474525 0.5117489 0.9737853 1.50762 0.4913198 X8 X9 X10 X11 X12 X13 X14 X15 1.009313 1.496057 0.5009011 0.9942378 1.568558 0.5078663 0.9544786 1.408739 > plotmo(gbm3.big, all1=TRUE, all2=TRUE, caption="all1=TRUE, all2=TRUE") Warning: too many predictors to plot all pairs, so plotting degree2 plots for just the first 7 predictors. Call plotmo with all2=2 to plot degree2 plots for up to 20 predictors. plotmo grid: X1 X2 X3 X4 X5 X6 X7 0.5143486 0.9627323 1.474525 0.5117489 0.9737853 1.50762 0.4913198 X8 X9 X10 X11 X12 X13 X14 X15 1.009313 1.496057 0.5009011 0.9942378 1.568558 0.5078663 0.9544786 1.408739 > plotmo(gbm3.big, all1=TRUE, all2=2, caption="all1=TRUE, all2=2") plotmo grid: X1 X2 X3 X4 X5 X6 X7 0.5143486 0.9627323 1.474525 0.5117489 0.9737853 1.50762 0.4913198 X8 X9 X10 X11 X12 X13 X14 X15 1.009313 1.496057 0.5009011 0.9942378 1.568558 0.5078663 0.9544786 1.408739 > plotres(gbm3.big, trace=-1, SHOWCALL=TRUE) > > set.seed(2024) > plotmo(gbm3fit.big, SHOWCALL=TRUE) plotmo grid: X1 X2 X3 X4 X5 X6 X7 0.5223775 0.9345499 1.439748 0.5139633 0.98243 1.518506 0.4884308 X8 X9 X10 X11 X12 X13 X14 X15 1.005225 1.582743 0.5212554 0.9505451 1.60459 0.5136175 0.9552039 1.413134 > plotmo(gbm3fit.big, all1=TRUE, caption="all1=TRUE") plotmo grid: X1 X2 X3 X4 X5 X6 X7 0.5223775 0.9345499 1.439748 0.5139633 0.98243 1.518506 0.4884308 X8 X9 X10 X11 X12 X13 X14 X15 1.005225 1.582743 0.5212554 0.9505451 1.60459 0.5136175 0.9552039 1.413134 > plotmo(gbm3fit.big, all2=TRUE, caption="all2=TRUE") Warning: too many predictors to plot all pairs, so plotting degree2 plots for just the first 7 predictors. Call plotmo with all2=2 to plot degree2 plots for up to 20 predictors. plotmo grid: X1 X2 X3 X4 X5 X6 X7 0.5223775 0.9345499 1.439748 0.5139633 0.98243 1.518506 0.4884308 X8 X9 X10 X11 X12 X13 X14 X15 1.005225 1.582743 0.5212554 0.9505451 1.60459 0.5136175 0.9552039 1.413134 > plotmo(gbm3fit.big, all2=2, caption="all2=2") More than 64 degree2 plots. Consider using plotmo's degree2 argument to limit the number of plots. For example, degree2=1:10 or degree2="X1" Call plotmo with trace=-1 to make this message go away. plotmo grid: X1 X2 X3 X4 X5 X6 X7 0.5223775 0.9345499 1.439748 0.5139633 0.98243 1.518506 0.4884308 X8 X9 X10 X11 X12 X13 X14 X15 1.005225 1.582743 0.5212554 0.9505451 1.60459 0.5136175 0.9552039 1.413134 > plotres(gbm3.big, trace=-1, SHOWCALL=TRUE) > > source("test.epilog.R") plotmo/inst/slowtests/make.README.bat0000755000176200001440000000024715124635472017170 0ustar liggesusers@rem Create README.html from README.md "C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla make.README.R cat make.readme.Rout rm -f make.readme.Rout plotmo/inst/slowtests/test.epilog.R0000644000176200001440000000034013725307662017200 0ustar liggesusers# test.epilog.R if(!interactive()) { dev.off() # finish postscript plot q(runLast=FALSE) # needed else R prints the time on exit # (R2.5 and higher) which messes up the diffs } plotmo/inst/slowtests/test.modguide.bat0000755000176200001440000000154715124635472020076 0ustar liggesusers@rem test.modguide.bat: test model1 and model2 (linmod examples) in modguide.pdf @echo test.modguide.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.modguide.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.modguide.Rout: @echo. @tail test.modguide.Rout @echo test.modguide.R @exit /B 1 :good1 mks.diff test.modguide.Rout test.modguide.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.modguide.save.ps @exit /B 1 :good2 @rem test.modguide.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.modguide.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.modguide.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/test.fac.bat0000755000176200001440000000154215124635472017025 0ustar liggesusers@rem test.fac.bat: test factor plotting in plotmo. This also tests swapxy, xflip, and yflip @rem Stephen Milborrow, Berea Mar 2011 @echo test.fac.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.fac.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.fac.Rout: @echo. @tail test.fac.Rout @echo test.fac.R @exit /B 1 :good1 mks.diff test.fac.Rout test.fac.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.fac.save.ps @exit /B 1 :good2 @rem test.fac.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.fac.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.fac.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/test.plotmo.dots.Rout.save0000644000176200001440000000711314567071010021663 0ustar liggesusers> # test.dots.plotmo.R: test dots functions with the plotmo and earth libraries > > source("test.prolog.R") > library(plotmo) Loading required package: Formula Loading required package: plotrix > library(earth) > data(ozone1) > options(warn=1) # print warnings as they occur > > a <- earth(O3~., data=ozone1, degree=2) > expect.err(try(plotmo(a, persp.s=99)), "'s' matches both the 'sub' and 'scale' arguments of persp()") plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 Error : 's' matches both the 'sub' and 'scale' arguments of persp() Got expected error from try(plotmo(a, persp.s = 99)) > > # Commented out because we now silently drop partial plot args like cex.l > # expect.err(try(plotmo(a, cex.l=.8, cex.la=.9)), "arguments 'cex.l' and 'cex.la' both match 'cex.lab' in draw.plot_degree1") > # expect.err(try(plotmo(a, persp.shad=1, persp.sh=2)), "'persp.shad' and 'persp.sh' both match the 'shade' argument of persp()") > > options(warn=2) # treat warnings as errors > > # Commented out because we now silently drop partial plot args like cex.l > # expect.err(try(plotmo(a, cex.l=.8)), "\"cex.l\" is not a graphical parameter") > # expect.err(try(plotmo(a, cex.lxx=.8)), "\"cex.lxx\" is not a graphical parameter") > # expect.err(try(plotmo(a, cex.labx=.8)), "\"cex.labx\" is not a graphical parameter") > # expect.err(try(plotmo(a, cex.l=.8, cex.lab=.9)), "\"cex.l\" is not a graphical parameter") > > expect.err(try(plotmo(a, nonesuch=.8)), "predict.earth ignored argument 'nonesuch'") stats::predict(earth.object, NULL, type="response", nonesuch=0.8) Error : (converted from warning) predict.earth ignored argument 'nonesuch' Got expected error from try(plotmo(a, nonesuch = 0.8)) > expect.err(try(plotmo(a, lw=2)), "predict.earth ignored argument 'lw'") stats::predict(earth.object, NULL, type="response", lw=2) Error : (converted from warning) predict.earth ignored argument 'lw' Got expected error from try(plotmo(a, lw = 2)) > options(warn=1) > > # test main, xlab, ylab, etc. arguments with recycling > a <- earth(O3~., data=ozone1, degree=2) > plotmo(a, caption="test main, xlab, ylab, ticktype arguments", + main=c("main1", "main2", "main3", "main4"), xlab=c("x1", "x2"), + persp.nticks=2, persp.ticktype="d", ylab=c("y1", "y2", "y3")) plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > > par(mfrow=c(2,2), mar = c(3,3,3,1), mgp = c(1.5,.5,0), oma=c(0,0,4,0)) > plotmo(a, trace=1, do.par=FALSE, degree1=1, degree2=1, caption="top: standard\nbottom: lwd=2 thresh=.9") # no errors or warnings stats::predict(earth.object, NULL, type="response") stats::fitted(object=earth.object) got model response from model.frame(O3 ~ vh + wind + humidity + temp + ib..., data=call$data, na.action="na.fail") plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > plotmo(a, lwd=2, trace=1, thresh=.9, do.par=FALSE, degree1=1, degree2=1) # no errors or warnings stats::predict(earth.object, NULL, type="response", thresh=0.9) stats::fitted(object=earth.object) got model response from model.frame(O3 ~ vh + wind + humidity + temp + ib..., data=call$data, na.action="na.fail") plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > > source("test.epilog.R") plotmo/inst/slowtests/test.plotmo.dots.R0000644000176200001440000000365614566064534020222 0ustar liggesusers# test.dots.plotmo.R: test dots functions with the plotmo and earth libraries source("test.prolog.R") library(plotmo) library(earth) data(ozone1) options(warn=1) # print warnings as they occur a <- earth(O3~., data=ozone1, degree=2) expect.err(try(plotmo(a, persp.s=99)), "'s' matches both the 'sub' and 'scale' arguments of persp()") # Commented out because we now silently drop partial plot args like cex.l # expect.err(try(plotmo(a, cex.l=.8, cex.la=.9)), "arguments 'cex.l' and 'cex.la' both match 'cex.lab' in draw.plot_degree1") # expect.err(try(plotmo(a, persp.shad=1, persp.sh=2)), "'persp.shad' and 'persp.sh' both match the 'shade' argument of persp()") options(warn=2) # treat warnings as errors # Commented out because we now silently drop partial plot args like cex.l # expect.err(try(plotmo(a, cex.l=.8)), "\"cex.l\" is not a graphical parameter") # expect.err(try(plotmo(a, cex.lxx=.8)), "\"cex.lxx\" is not a graphical parameter") # expect.err(try(plotmo(a, cex.labx=.8)), "\"cex.labx\" is not a graphical parameter") # expect.err(try(plotmo(a, cex.l=.8, cex.lab=.9)), "\"cex.l\" is not a graphical parameter") expect.err(try(plotmo(a, nonesuch=.8)), "predict.earth ignored argument 'nonesuch'") expect.err(try(plotmo(a, lw=2)), "predict.earth ignored argument 'lw'") options(warn=1) # test main, xlab, ylab, etc. arguments with recycling a <- earth(O3~., data=ozone1, degree=2) plotmo(a, caption="test main, xlab, ylab, ticktype arguments", main=c("main1", "main2", "main3", "main4"), xlab=c("x1", "x2"), persp.nticks=2, persp.ticktype="d", ylab=c("y1", "y2", "y3")) par(mfrow=c(2,2), mar = c(3,3,3,1), mgp = c(1.5,.5,0), oma=c(0,0,4,0)) plotmo(a, trace=1, do.par=FALSE, degree1=1, degree2=1, caption="top: standard\nbottom: lwd=2 thresh=.9") # no errors or warnings plotmo(a, lwd=2, trace=1, thresh=.9, do.par=FALSE, degree1=1, degree2=1) # no errors or warnings source("test.epilog.R") plotmo/inst/slowtests/modguide.model2.R0000644000176200001440000000441213725307662017725 0ustar liggesusers# modguide.model2.R: # # linmod code from Stephen Milborrow "Guidelines for S3 Regression Models" # This is called Model 2 in that document. # ## A simple linear model (extended from Friedrich Leisch's tutorial). ## Functions like print.linmod in the tutorial don't appear in the code below. linmod <- function(...) UseMethod("linmod") linmod.fit <- function(x, y) # internal function, not for the casual user { # first column of x is the intercept (all 1s) y <- as.vector(as.matrix(y)) # necessary when y is a data.frame qx <- qr(x) # QR-decomposition of x coef <- solve.qr(qx, y) # compute (x'x)^(-1) x'y df.residual <- nrow(x) - ncol(x) # degrees of freedom sigma2 <- sum((y - x %*% coef)^2) / df.residual # variance of residuals vcov <- sigma2 * chol2inv(qx$qr) # covar mat is sigma^2 * (x'x)^(-1) colnames(vcov) <- rownames(vcov) <- colnames(x) fitted.values <- qr.fitted(qx, y) names(fitted.values) <- rownames(x) fit <- list(coefficients = coef, residuals = y - fitted.values, fitted.values = fitted.values, vcov = vcov, sigma = sqrt(sigma2), df.residual = df.residual) class(fit) <- "linmod" fit } linmod.default <- function(x, y, ...) { fit <- linmod.fit(cbind("(Intercept)"=1, as.matrix(x)), y) fit$call <- match.call() fit } linmod.formula <- function(formula, data=parent.frame(), ...) { mf <- model.frame(formula=formula, data=data) terms <- attr(mf, "terms") fit <- linmod.fit(model.matrix(terms, mf), model.response(mf)) fit$call <- match.call() fit$terms <- terms fit } predict.linmod <- function(object, newdata=NULL, ...) { if(is.null(newdata)) y <- fitted(object) else { if(is.null(object$terms)) # x,y interface x <- cbind(1, as.matrix(newdata)) else { # formula interface terms <- delete.response(object$terms) x <- model.matrix(terms, model.frame(terms, as.data.frame(newdata))) } y <- as.vector(x %*% coef(object)) } y } plotmo/inst/slowtests/test.c50.bat0000755000176200001440000000142315124635472016661 0ustar liggesusers@rem test.c50.bat: c50 tests for plotmo and plotres @echo test.c50.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.c50.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.c50.Rout: @echo. @tail test.c50.Rout @echo test.c50.R @exit /B 1 :good1 mks.diff test.c50.Rout test.c50.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.c50.save.ps @exit /B 1 :good2 @rem test.c50.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.c50.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.c50.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/test.mlr.Rout.save0000644000176200001440000011104315124640132020166 0ustar liggesusers> # test.mlr.R: test the "mlr" package with plotmo and plotres > # > # TODO mlr is in maintenance mode, add mlr3 support to plotmo? > # TODO generally, plotres residuals for WrappedModel prob models aren't right > > source("test.prolog.R") > library(mlr) Loading required package: ParamHelpers > library(plotmo) Loading required package: Formula Loading required package: plotrix > library(rpart.plot) Loading required package: rpart > library(earth) > # TODO following function is temporary until mlr package is updated > train.with.call <- function(learner, task, subset=NULL, weights=NULL) + { + retval <- train(learner, task, subset, weights) + retval$call <- match.call() + retval + } > > cat("==simple one variable regression model with earth ===============================\n") ==simple one variable regression model with earth =============================== > > data(trees) > trees1 <- trees[,c("Volume", "Girth")] > > task <- makeRegrTask(data=trees1, target="Volume") > lrn <- makeLearner("regr.earth", degree=2) > regr.earth.with.call = train.with.call(lrn, task) > regr.earth = train(lrn, task) > earth <- earth(Volume~., data=trees1, degree=2) > > # SHOWCALL is just a testing thing, so we can see who created the plot on the plot itself > plotres(regr.earth.with.call, SHOWCALL=TRUE) > plotres(regr.earth$learner.model, SHOWCALL=TRUE) > plotres(earth, SHOWCALL=TRUE) > > plotmo(regr.earth.with.call, trace=1, SHOWCALL=TRUE) stats::fitted(object=WrappedModel.object) fitted() was unsuccessful, will use predict() instead got model response from object$y > plotmo(regr.earth$learner.model, trace=1, SHOWCALL=TRUE) stats::predict(earth.object, NULL, type="response") stats::fitted(object=earth.object) got model response from model.frame(Volume ~ Girth, data=call$data, na.action="na.fail") > plotmo(earth, trace=1, SHOWCALL=TRUE) stats::predict(earth.object, NULL, type="response") stats::fitted(object=earth.object) got model response from model.frame(Volume ~ Girth, data=call$data, na.action="na.fail") > > # compare partial dependence plots from mlr and plotmo packages > set.seed(2018) > plotmo(earth, pmethod="partdep", SHOWCALL=TRUE, col=2, pt.col="darkgray", grid.col="lightgray") calculating partdep for Girth > set.seed(2018) > pd <- generatePartialDependenceData(regr.earth, task, "Girth", n=c(50, NA)) Loading required package: mmpf > print(plotPartialDependence(pd, data = getTaskData(task))) Warning: `aes_string()` was deprecated in ggplot2 3.0.0. ℹ Please use tidy evaluation idioms with `aes()`. ℹ See also `vignette("ggplot2-in-packages")` for more information. ℹ The deprecated feature was likely used in the mlr package. Please report the issue at . Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size) : semi-transparency is not supported on this device: reported only once per page > > cat("==test error handling if original data is messed up===========================\n") ==test error handling if original data is messed up=========================== > > par(mfrow=c(4,2), mar=c(1.5,2.5,4,1), oma=c(0,0,0,0)) > colnames(trees1) <- c("nonesuch", "Volume") > plotmo(regr.earth$learner.model, do.par=0, degree1=1, degree2=0, main='colnames(trees1) <- c("nonesuch", "Volume")') > plotmo(regr.earth.with.call, do.par=0, degree1=1, degree2=0) > par(org.par) > expect.err(try(plotmo(earth, degree1=1, degree2=0)), "cannot get the original model predictors") Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: object 'Girth' not found (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(plotmo(earth, degree1 = 1, degree2 = 0)) > > cat("==regression model with randomForest (binary response)============================\n") ==regression model with randomForest (binary response)============================ > > library(randomForest) randomForest 4.7-1.2 Type rfNews() to see new features/changes/bug fixes. > library(earth) # for etitanic data > data(etitanic) > set.seed(2018) > # use a logical subset (since we test for numeric subset elsewhere) > # use a small subset so we can see easily if subset is applied or ignored in plots > train.subset <- rnorm(nrow(etitanic)) > 1 # 166 cases ((16% of 1046 cases)) > printf("sum(train.subset) %g (%.0f%% of %g cases)\n", sum(train.subset), + 100 * sum(train.subset) / nrow(etitanic), nrow(etitanic)) sum(train.subset) 166 (16% of 1046 cases) > task.regr.rf <- makeRegrTask(data=etitanic, target="survived") > lrn.regr.rf = makeLearner("regr.randomForest") > set.seed(2018) > regr.rf.with.call = train.with.call(lrn.regr.rf, task.regr.rf, subset=train.subset) Warning in randomForest.default(x = data[["data"]], y = data[["target"]], : The response has five or fewer unique values. Are you sure you want to do regression? > set.seed(2018) > rf <- randomForest(survived~., data=etitanic, subset=train.subset) Warning in randomForest.default(m, y, ...) : The response has five or fewer unique values. Are you sure you want to do regression? > # sanity check that the models are identical > stopifnot(identical(predict(regr.rf.with.call$learner.model), predict(rf))) > > plotres(regr.rf.with.call, info=TRUE, SHOWCALL=TRUE) > # plotres(regr.rf$learner.model, info=TRUE, SHOWCALL=TRUE) # Error: no formula in getCall(object) > plotres(rf, info=TRUE, SHOWCALL=TRUE) > > set.seed(2018) # for repeatable jitter in points (specified with pt.col) > plotmo(regr.rf.with.call, pt.col=2, SHOWCALL=TRUE) plotmo grid: pclass sex age sibsp parch 3rd male 29 0 0 > # plotmo(regr.rf$learner.model, trace=1, SHOWCALL=TRUE) # Error: no formula in getCall(object) > set.seed(2018) > plotmo(rf, pt.col=2, SHOWCALL=TRUE) plotmo grid: pclass sex age sibsp parch 3rd male 29 0 0 > > # compare partial dependence plots > set.seed(2018) > plotmo(regr.rf.with.call, degree1="age", degree2=0, pmethod="partdep", + grid.col="gray", col=2, pt.col="darkgray", SHOWCALL=TRUE) calculating partdep for age > # function from randomForest package > set.seed(2018) > partialPlot(rf, pred.data=etitanic[train.subset,], x.var="age", n.pt=50, ylim=c(0, 1)) > grid() > # function from mlr package > set.seed(2018) > pd <- generatePartialDependenceData(regr.rf.with.call, task.regr.rf, "age", n=c(50, NA)) > print(plotPartialDependence(pd, data = getTaskData(task.regr.rf))) Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size) : semi-transparency is not supported on this device: reported only once per page > > plotmo(regr.rf.with.call, degree1="pclass", degree2=0, pmethod="partdep", SHOWCALL=TRUE) calculating partdep for pclass > set.seed(2018) > # function from randomForest package > set.seed(2018) > partialPlot(rf, pred.data=etitanic[train.subset,], x.var="pclass", n.pt=50, ylim=c(0, 1)) > grid() > # TODO following fails > pd <- generatePartialDependenceData(regr.rf.with.call, task.regr.rf, "pclass", n=c(50, NA)) > try(print(plotPartialDependence(pd, data = getTaskData(task.regr.rf)))) # Error: Discrete value supplied to continuous scale Error in scale_x_continuous() : Discrete value supplied to a continuous scale. ℹ Example values: 1st, 2nd, and 3rd. > > cat("==classification model with randomForest (binary response)======================\n") ==classification model with randomForest (binary response)====================== > > set.seed(2018) > library(earth) # for etitanic data > data(etitanic) > etit <- etitanic > etit$survived <- factor(etit$survived, labels=c("notsurvived", "survived")) > > task.classif.rf <- makeClassifTask(data=etit, target="survived") > lrn.classif.rf <- makeLearner("classif.randomForest", predict.type="prob") > set.seed(2018) > classif.rf.with.call <- train.with.call(lrn.classif.rf, task.classif.rf, , subset=train.subset) > set.seed(2018) > rf <- randomForest(survived~., data=etit, method="class", subset=train.subset) > # sanity check that the models are identical > stopifnot(identical(predict(classif.rf.with.call$learner.model), predict(rf))) > > # TODO following causes Error: classif.earth: Setting parameter glm without available description object > # lrn <- makeLearner("classif.earth", degree=2, glm=list(family=binomial)) > > # TODO residuals on WrappedModel don't match direct call to rf model > set.seed(2018) # for repeatable jitter > plotres(classif.rf.with.call, nresponse="prob.survived", SHOWCALL=TRUE, jitter=2) > set.seed(2018) > plotres(classif.rf.with.call$learner.model, type="prob", SHOWCALL=TRUE, jitter=2) > set.seed(2018) > plotres(rf, type="prob", SHOWCALL=TRUE, jitter=2) > > options(warn=2) # treat warnings as errors > expect.err(try(plotmo(classif.rf.with.call)), "Defaulting to nresponse=1, see above messages") predict.WrappedModel[3,3]: prob.notsurvived prob.survived response 5 0.466 0.534 survived 7 0.358 0.642 survived 22 0.028 0.972 survived response is a factor with levels: notsurvived survived predict.WrappedModel returned multiple columns (see above) but nresponse is not specified Use the nresponse argument to specify a column. Example: nresponse=2 Example: nresponse="prob.survived" Error : (converted from warning) Defaulting to nresponse=1, see above messages Got expected error from try(plotmo(classif.rf.with.call)) > options(warn=1) > set.seed(2018) # for repeatable jitter > plotmo(classif.rf.with.call, SHOWCALL=TRUE, nresponse="prob.survived", pt.col=2, trace=2) plotmo trace 2: plotmo(object=classif.rf.with.call, nresponse="prob.survived", pt.col=2, trace=2, SHOWCALL=TRUE) --get.model.env for object with class WrappedModel object call is train.with.call(learner=lrn.classif.rf, task=task.classif.rf, subset=train.subset) assuming the environment of the WrappedModel model is that of plotmo's caller: R_GlobalEnv --plotmo_prolog for WrappedModel object 'classif.rf.with.call' task$task.desc$id for 'classif.rf.with.call' is "etit" --plotmo_prolog for randomForest.formula object object$learner.model Done recursive call in plotmo.prolog for learner.model --plotmo_x for WrappedModel object get.object.x: object$x is usable and has column names pclass sex age sibsp parch plotmo_x returned[166,5]: pclass sex age sibsp parch 5 1st female 25 1 2 7 1st female 63 1 0 22 1st female 47 1 1 ... 1st female 29 0 0 1288 3rd male 51 0 0 factors: pclass sex ----Metadata: plotmo_predict with nresponse=NULL and newdata=NULL plotmo_predict with NULL newdata (nrows=3), using plotmo_x to get the data --plotmo_x for WrappedModel object get.object.x: object$x is usable and has column names pclass sex age sibsp parch plotmo_x returned[166,5]: pclass sex age sibsp parch 5 1st female 25 1 2 7 1st female 63 1 0 22 1st female 47 1 1 ... 1st female 29 0 0 1288 3rd male 51 0 0 factors: pclass sex will use the above data instead of newdata=NULL for predict.WrappedModel predict returned[3,3]: prob.notsurvived prob.survived response 5 0.466 0.534 survived 7 0.358 0.642 survived 22 0.028 0.972 survived response is a factor with levels: notsurvived survived predict after processing with nresponse=NULL is [3,3]: prob.notsurvived prob.survived response 5 0.466 0.534 survived 7 0.358 0.642 survived 22 0.028 0.972 survived response is a factor with levels: notsurvived survived ----Metadata: plotmo_fitted with nresponse=NULL stats::fitted(object=WrappedModel.object) fitted() was unsuccessful, will use predict() instead plotmo_predict with NULL newdata, using plotmo_x to get the data --plotmo_x for WrappedModel object get.object.x: object$x is usable and has column names pclass sex age sibsp parch plotmo_x returned[166,5]: pclass sex age sibsp parch 5 1st female 25 1 2 7 1st female 63 1 0 22 1st female 47 1 1 ... 1st female 29 0 0 1288 3rd male 51 0 0 factors: pclass sex will use the above data instead of newdata=NULL for predict.WrappedModel predict returned[166,3]: prob.notsurvived prob.survived response 5 0.466 0.534 survived 7 0.358 0.642 survived 22 0.028 0.972 survived ... 0.032 0.968 survived 1288 0.906 0.094 notsurvived response is a factor with levels: notsurvived survived predict after processing with nresponse=NULL is [166,3]: prob.notsurvived prob.survived response 5 0.466 0.534 survived 7 0.358 0.642 survived 22 0.028 0.972 survived ... 0.032 0.968 survived 1288 0.906 0.094 notsurvived response is a factor with levels: notsurvived survived got fitted values by calling predict (see above) ----Metadata: plotmo_y with nresponse=NULL --plotmo_y with nresponse=NULL for WrappedModel object get.object.y: object$y is usable and has column name survived plotmo_y returned[166,1]: survived 5 notsurvived 7 survived 22 survived ... survived 1288 notsurvived survived is a factor with levels: notsurvived survived plotmo_y after processing with nresponse=NULL is [166,1]: survived 5 notsurvived 7 survived 22 survived ... survived 1288 notsurvived survived is a factor with levels: notsurvived survived converted nresponse="prob.survived" to nresponse=2 nresponse=2 (was "prob.survived") ncol(fitted) 3 ncol(predict) 1 ncol(y) 1 ----Metadata: plotmo_y with nresponse=2 nresponse=2 but for plotmo_y using nresponse=1 because ncol(y) == 1 --plotmo_y with nresponse=1 for WrappedModel object get.object.y: object$y is usable and has column name survived got model response from object$y the response is a factor but could not get the family of the WrappedModel model plotmo_y returned[166,1]: survived 5 notsurvived 7 survived 22 survived ... survived 1288 notsurvived survived is a factor with levels: notsurvived survived converted to numeric from factor with levels "notsurvived" "survived" plotmo_y after processing with nresponse=1 is [166,1]: survived 1 1 2 2 3 2 ... 2 166 1 got response name "prob.survived" from yhat got resp.levs from yfull response levels: notsurvived survived ----Metadata: done number of x values: pclass 3 sex 2 age 60 sibsp 5 parch 5 ----plotmo_singles for WrappedModel object randomForest built with importance=FALSE, ranking variables on MeanDecreaseGini plotmo.singles(object$learner.model) succeeded singles: 1 pclass, 2 sex, 3 age, 4 sibsp, 5 parch ----plotmo_pairs for WrappedModel object plotmo.pairs(object$learner.model) succeeded pairs: [,1] [,2] [1,] "1 pclass" "2 sex" [2,] "1 pclass" "3 age" [3,] "1 pclass" "4 sibsp" [4,] "1 pclass" "5 parch" [5,] "2 sex" "3 age" [6,] "2 sex" "4 sibsp" [7,] "2 sex" "5 parch" [8,] "3 age" "4 sibsp" [9,] "3 age" "5 parch" [10,] "4 sibsp" "5 parch" graphics::par(mfrow=c(4,4), mgp=c(1.5,0.4,0), tcl=-0.3, font.main=2, mar=c(3,2,1.2,0.8), oma=c(0,0,4,0), cex.main=1.1, cex.lab=1, cex.axis=1, cex=0.66) ----Figuring out ylim ylim c(-0.1, 1.1) clip TRUE --plot.degree1(draw.plot=TRUE) plotmo grid: pclass sex age sibsp parch 3rd male 29 0 0 degree1 plot1 (pmethod "plotmo") variable pclass newdata[3,5]: pclass sex age sibsp parch 1 1st male 29 0 0 2 2nd male 29 0 0 3 3rd male 29 0 0 factors: pclass sex predict returned[3,3]: prob.notsurvived prob.survived response 1 0.872 0.128 notsurvived 2 0.904 0.096 notsurvived 3 0.928 0.072 notsurvived response is a factor with levels: notsurvived survived predict returned[3,1] after selecting nresponse=2: prob.survived 1 0.128 2 0.096 3 0.072 predict after processing with nresponse=2 is [3,1]: prob.survived 1 0.128 2 0.096 3 0.072 graphics::plot.default(x=factor.object, y=c(0.128,0.096,0...), type="n", main="1 pclass", xlab="", ylab="", xaxt="n", yaxt="s", xlim=c(0.6,3.4), ylim=c(-0.1,1.1)) Will shift and scale displayed points specified by pt.col: yshift -1 yscale 1 graphics::plot(x=factor.object, y=c(0.128,0.096,0...), xaxt="n", yaxt="s", add=TRUE, lty=1, lwd=1) Reducing trace level for subsequent degree1 plots degree1 plot2 (pmethod "plotmo") variable sex Will shift and scale displayed points specified by pt.col: yshift -1 yscale 1 degree1 plot3 (pmethod "plotmo") variable age Will shift and scale displayed points specified by pt.col: yshift -1 yscale 1 degree1 plot4 (pmethod "plotmo") variable sibsp Will shift and scale displayed points specified by pt.col: yshift -1 yscale 1 degree1 plot5 (pmethod "plotmo") variable parch Will shift and scale displayed points specified by pt.col: yshift -1 yscale 1 --plot.degree2(draw.plot=TRUE) degree2 plot1 (pmethod "plotmo") variables pclass:sex newdata[6,5]: pclass sex age sibsp parch 1 1st female 29 0 0 2 2nd female 29 0 0 3 3rd female 29 0 0 ... 1st male 29 0 0 6 3rd male 29 0 0 factors: pclass sex predict returned[6,3]: prob.notsurvived prob.survived response 1 0.032 0.968 survived 2 0.098 0.902 survived 3 0.890 0.110 notsurvived ... 0.872 0.128 notsurvived 6 0.928 0.072 notsurvived response is a factor with levels: notsurvived survived predict returned[6,1] after selecting nresponse=2: prob.survived 1 0.968 2 0.902 3 0.110 ... 0.128 6 0.072 predict after processing with nresponse=2 is [6,1]: prob.survived 1 0.968 2 0.902 3 0.110 ... 0.128 6 0.072 persp(pclass:sex) theta 145 Reducing trace level for subsequent degree2 plots degree2 plot2 (pmethod "plotmo") variables pclass:age persp(pclass:age) theta 235 degree2 plot3 (pmethod "plotmo") variables pclass:sibsp persp(pclass:sibsp) theta 55 degree2 plot4 (pmethod "plotmo") variables pclass:parch persp(pclass:parch) theta 55 degree2 plot5 (pmethod "plotmo") variables sex:age persp(sex:age) theta 145 degree2 plot6 (pmethod "plotmo") variables sex:sibsp persp(sex:sibsp) theta 55 degree2 plot7 (pmethod "plotmo") variables sex:parch persp(sex:parch) theta 55 degree2 plot8 (pmethod "plotmo") variables age:sibsp persp(age:sibsp) theta 145 degree2 plot9 (pmethod "plotmo") variables age:parch persp(age:parch) theta 145 degree2 plot10 (pmethod "plotmo") variables sibsp:parch persp(sibsp:parch) theta 55 > set.seed(2018) > plotmo(classif.rf.with.call$learner.model, SHOWCALL=TRUE, type="prob", pt.col=2) plotmo grid: pclass sex age sibsp parch 3rd male 29 0 0 > set.seed(2018) > # note that in the following, get.y.shift.scale (in plotmo code) rescales the plotted y to 0..1 > plotmo(rf, SHOWCALL=TRUE, type="prob", pt.col="gray") plotmo grid: pclass sex age sibsp parch 3rd male 29 0 0 > set.seed(2018) > # in following graph, note that get.y.shift.scale doesn't rescale the plotted y because ylim=c(0,2) > plotmo(rf, SHOWCALL=TRUE, type="prob", ylim=c(0,2), pt.col="gray") plotmo grid: pclass sex age sibsp parch 3rd male 29 0 0 > > # compare partial dependence plots > set.seed(2018) > plotmo(rf, type="prob", degree1="pclass", degree2=0, pmethod="partdep", pt.col=2, SHOWCALL=TRUE) calculating partdep for pclass > set.seed(2018) > plotmo(rf, degree1="pclass", degree2=0, pmethod="partdep", pt.col=2, SHOWCALL=TRUE) calculating partdep for pclass > set.seed(2018) > # TODO following fails > pd <- generatePartialDependenceData(classif.rf.with.call, task.classif.rf, "pclass", n=c(50, NA)) > try(print(plotPartialDependence(pd, data = getTaskData(task.classif.rf)))) # Error: Discrete value supplied to continuous scale Error in scale_x_continuous() : Discrete value supplied to a continuous scale. ℹ Example values: 1st, 2nd, and 3rd. > > plotmo(rf, type="prob", nresponse="notsurvived", degree1="age", degree2=0, + pmethod="partdep", ylim=c(.3,.75), nrug=TRUE, grid.col="gray") # looks plausible calculating partdep for age > set.seed(2018) > pd <- generatePartialDependenceData(classif.rf.with.call, task.classif.rf, "age", n=c(50, NA)) > print(plotPartialDependence(pd, data = getTaskData(task.classif.rf))) Warning in grid.Call.graphics(C_segments, x$x0, x$y0, x$x1, x$y1, x$arrow) : semi-transparency is not supported on this device: reported only once per page > > cat("==examples from plotmo-notes.pdf ===============================================\n") ==examples from plotmo-notes.pdf =============================================== > > #-- Regression model with mlr ------------------------------------------- > > library(mlr) > library(plotmo) > lrn <- makeLearner("regr.svm") > fit1.with.call <- train.with.call(lrn, bh.task) > fit1 <- train(lrn, bh.task) > > # generate partial dependence plots for all variables > # we use "apartdep" and not "partdep" to save testing time > plotmo(fit1.with.call, pmethod="apartdep") calculating apartdep for crim calculating apartdep for zn calculating apartdep for indus calculating apartdep for chas calculating apartdep for nox calculating apartdep for rm calculating apartdep for age calculating apartdep for dis calculating apartdep for rad calculating apartdep for tax calculating apartdep for ptratio calculating apartdep for b calculating apartdep for lstat > plotmo(fit1$learner.model, pmethod="apartdep") calculating apartdep for crim calculating apartdep for zn calculating apartdep for indus calculating apartdep for chas calculating apartdep for nox calculating apartdep for rm calculating apartdep for age calculating apartdep for dis calculating apartdep for rad calculating apartdep for tax calculating apartdep for ptratio calculating apartdep for b calculating apartdep for lstat > > # generate partial dependence plot for just "lstat" > set.seed(2018) # so slight jitter on pt.col points in plotmo doesn't change across test runs > plotmo(fit1.with.call, + degree1="lstat", # what predictor to plot + degree2=0, # no interaction plots + pmethod="partdep", # generate partial dependence plot + pt.col=2, grid.col="gray", # optional bells and whistles + nrug=TRUE) # rug ticks along the bottom calculating partdep for lstat > set.seed(2018) # so slight jitter on pt.col points in plotmo doesn't change across test runs > plotmo(fit1$learner.model, + degree1="lstat", # what predictor to plot + degree2=0, # no interaction plots + pmethod="partdep", # generate partial dependence plot + pt.col=2, grid.col="gray", # optional bells and whistles + nrug=TRUE) # rug ticks along the bottom calculating partdep for lstat > > # compare to the function provided by the mlr package > set.seed(2018) > pd <- generatePartialDependenceData(fit1, bh.task, "lstat", n=c(50, NA)) > print(plotPartialDependence(pd, data = getTaskData(bh.task))) Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size) : semi-transparency is not supported on this device: reported only once per page > # # TODO following fails: Error: Discrete value supplied to continuous scale > # pd <- generatePartialDependenceData(fit1, bh.task, "chas", n=c(50, NA)) > # plotPartialDependence(pd, data = getTaskData(bh.task)) > > #-- Classification model with mlr --------------------------------------- > > lrn.classif.rpart <- makeLearner("classif.rpart", predict.type = "prob", minsplit = 10) > fit2.with.call <- train.with.call(lrn.classif.rpart, iris.task) > fit2 <- train(lrn.classif.rpart, iris.task) > > # generate partial dependence plots for all variables > # TODO plotmo can plot the response for only one class at a time > plotmo(fit2.with.call, + nresponse="prob.virginica", # what response to plot + # type="prob", # type gets passed to predict.rpart + pmethod="apartdep") # generate partial dependence plot calculating apartdep for Petal.Length calculating apartdep for Petal.Width calculating apartdep for Petal.Length:Petal.Width 01234567890 > > plotmo(fit2$learner.model, + nresponse="virginica", # what response to plot + type="prob", # type gets passed to predict.rpart + pmethod="apartdep") # generate partial dependence plot calculating apartdep for Petal.Length calculating apartdep for Petal.Width calculating apartdep for Petal.Length:Petal.Width 01234567890 > > # generate partial dependence plot for just "Petal.Length" > plotmo(fit2.with.call, + degree1="Petal.Length", # what predictor to plot + degree2=0, # no interaction plots + nresponse="prob.virginica", # what response to plot + # type="prob", # type gets passed to predict.rpart + pmethod="apartdep") # generate partial dependence plot calculating apartdep for Petal.Length > > plotmo(fit2$learner.model, + degree1="Petal.Length", # what predictor to plot + degree2=0, # no interaction plots + nresponse="virginica", # what response to plot + type="prob", # type gets passed to predict.rpart + pmethod="apartdep") # generate partial dependence plot calculating apartdep for Petal.Length > > # compare to the function provided by the mlr package > set.seed(2018) > pd <- generatePartialDependenceData(fit2, iris.task, "Petal.Length", n=c(50, NA)) > print(plotPartialDependence(pd, data = getTaskData(iris.task))) Warning in grid.Call.graphics(C_segments, x$x0, x$y0, x$x1, x$y1, x$arrow) : semi-transparency is not supported on this device: reported only once per page > > cat("==lda example from mlr documentation, and plotmo error handling =================\n") ==lda example from mlr documentation, and plotmo error handling ================= > > set.seed(2018) > data(iris) > task.lda <- makeClassifTask(data=iris, target="Species") > lrn.lda <- makeLearner("classif.lda") > n <- nrow(iris) > train.set <- sample(n, size=2/3*n) > test.set <- setdiff(1:n, train.set) > classif.lda.with.call <- train.with.call(lrn.lda, task.lda, subset=train.set) > classif.lda <- train(lrn.lda, task.lda, subset=train.set) > iris1 <- iris[train.set, ] > library(MASS) > lda <- lda(Species~., data=iris1) > > # expect.err(try(plotres(classif.lda.with.call)), "plotres does not (yet) support type=\"class\" for \"lda\" objects") > expect.err(try(plotres(classif.lda$learner.model)), "plotres does not (yet) support type=\"class\" for \"lda\" objects") Error : plotres does not (yet) support type="class" for "lda" objects Try type="response" ? Got expected error from try(plotres(classif.lda$learner.model)) > > options(warn=2) # treat warnings as errors > # expect.err(try(plotres(classif.lda.with.call, type="response")), "predict.lda returned multiple columns (see above) but nresponse is not specified") > expect.err(try(plotres(classif.lda$learner.model, type="response")), "Defaulting to nresponse=1, see above messages") predict.lda[3,2]: LD1 LD2 15 10.723308 -1.2184763 131 -6.507414 0.9729798 140 -5.339014 -0.8727408 predict.lda returned multiple columns (see above) but nresponse is not specified Use the nresponse argument to specify a column. Example: nresponse=2 Example: nresponse="LD2" Error : (converted from warning) Defaulting to nresponse=1, see above messages Got expected error from try(plotres(classif.lda$learner.model, type = "response")) > options(warn=1) > > expect.err(try(plotres(classif.lda.with.call, type="response", nresponse="nonesuch")), "nresponse=\"nonesuch\" is not allowed") Error : nresponse="nonesuch" is not allowed Only an integer index or "response" is allowed Got expected error from try(plotres(classif.lda.with.call, type = "response", nresponse = "nonesuch")) > expect.err(try(plotres(classif.lda$learner.model, type="response", nresponse="nonesuch")), "nresponse=\"nonesuch\" is not allowed") Error : nresponse="nonesuch" is not allowed Choose an integer index or one of: "LD1" "LD2" Got expected error from try(plotres(classif.lda$learner.model, type = "response", nresponse = "nonesuch")) > > expect.err(try(plotres(classif.lda.with.call, type="response", nresponse=0)), "nresponse=0 but it should be at least 1") Error : nresponse=0 but it should be at least 1 Got expected error from try(plotres(classif.lda.with.call, type = "response", nresponse = 0)) > expect.err(try(plotres(classif.lda$learner.model, type="response", nresponse=0)), "nresponse=0 but it should be at least 1") Error : nresponse=0 but it should be at least 1 Got expected error from try(plotres(classif.lda$learner.model, type = "response", nresponse = 0)) > > expect.err(try(plotres(classif.lda.with.call, type="response", nresponse=99)), "nresponse is 99 but the number of columns is only 1") Error : nresponse is 99 but the number of columns is only 1 Got expected error from try(plotres(classif.lda.with.call, type = "response", nresponse = 99)) > expect.err(try(plotres(classif.lda$learner.model, type="response", nresponse=99)), "nresponse is 99 but the number of columns is only 2") Error : nresponse is 99 but the number of columns is only 2 Got expected error from try(plotres(classif.lda$learner.model, type = "response", nresponse = 99)) > > expect.err(try(plotmo(classif.lda)), "getCall(classif.lda) failed") Error : getCall(classif.lda) failed. Possible workaround: call plotmo like this: plotmo(classif.lda$learner.model, ...) Got expected error from try(plotmo(classif.lda)) > > expect.err(try(plotres(classif.lda)), "getCall(classif.lda) failed") Error : getCall(classif.lda) failed. Possible workaround: call plotres like this: plotres(classif.lda$learner.model, ...) Got expected error from try(plotres(classif.lda)) > > # TODO residuals don't match > plotres(classif.lda.with.call, SHOWCALL=TRUE, type="response") > plotres(classif.lda$learner.model, SHOWCALL=TRUE, type="response", nresponse="LD2") > plotres(lda, SHOWCALL=TRUE, type="response", nresponse="LD2") > > plotmo(classif.lda.with.call, SHOWCALL=TRUE) plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 6 3 4.45 1.4 > plotmo(classif.lda$learner.model, SHOWCALL=TRUE) plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 6 3 4.45 1.4 > plotmo(lda, SHOWCALL=TRUE) plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 6 3 4.45 1.4 > > # # TODO plotPartialDependence and plotmo graphs below don't match > # pd <- generatePartialDependenceData(classif.lda, task.lda, "Petal.Width", n=c(50, NA)) # TODO generates warnings > # print(plotPartialDependence(pd, data = getTaskData(task.lda))) > plotmo(classif.lda.with.call, degree1="Petal.Width", degree2=0, pmethod="partdep", do.par=FALSE) calculating partdep for Petal.Width > > plotmo(classif.lda.with.call, SHOWCALL=TRUE, all2=TRUE, type="response") plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 6 3 4.45 1.4 > plotmo(classif.lda$learner.model, SHOWCALL=TRUE, all2=TRUE, type="class") plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 6 3 4.45 1.4 > plotmo(lda, SHOWCALL=TRUE, all2=TRUE, type="class") plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 6 3 4.45 1.4 > > plotmo(classif.lda$learner.model, SHOWCALL=TRUE, all2=TRUE, type="response", nresponse="LD1") plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 6 3 4.45 1.4 > plotmo(lda, SHOWCALL=TRUE, all2=TRUE, type="response", nresponse="LD1") plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 6 3 4.45 1.4 > > cat("==test recursive call to plotmo_prolog for learner.model===============\n") ==test recursive call to plotmo_prolog for learner.model=============== > > set.seed(2018) > n <- 100 > data <- data.frame( + x1 = rnorm(n), + x2 = rnorm(n), + x3 = rnorm(n), + x4 = rnorm(n), + x5 = rnorm(n), + x6 = rnorm(n), + x7 = rnorm(n), + x8 = rnorm(n), + x9 = rnorm(n)) > > data$y <- sin(data$x3) + sin(data$x4) + 2 * cos(data$x5) > > set.seed(2018) > library(gbm) Loaded gbm 2.2.2 This version of gbm is no longer under development. Consider transitioning to gbm3, https://github.com/gbm-developers/gbm3 > # reference model > gbm = gbm(y~., data=data, n.trees=300) Distribution not specified, assuming gaussian ... > plotmo(gbm, trace=-1, SHOWCALL=TRUE) > > set.seed(2018) > task <- makeRegrTask(data=data, target="y") > lrn <- makeLearner("regr.gbm", n.trees=300, keep.data=TRUE) > regr.gbm = train.with.call(lrn, task) > plotmo(regr.gbm, trace=-1, SHOWCALL=TRUE) > > set.seed(2018) > lrn <- makeLearner("regr.gbm", n.trees=300) > regr.gbm.nokeepdata = train.with.call(lrn, task) > # expect message: use keep.data=TRUE in the call to gbm (cannot determine the variable importances) > plotmo(regr.gbm.nokeepdata, trace=1, SHOWCALL=TRUE) Error : use keep.data=TRUE in the call to gbm (cannot determine the variable importances) plotmo.prolog(object$learner.model) failed, continuing anyway stats::fitted(object=WrappedModel.object) fitted() was unsuccessful, will use predict() instead got model response from object$y plotmo grid: x1 x2 x3 x4 x5 x6 -0.07231869 0.1672582 0.1278179 -0.03757131 -0.2269232 -0.08124337 x7 x8 x9 0.06208072 0.04337176 0.02863955 > > plotres(regr.gbm, SHOWCALL=TRUE) > > cat("==example from makeClassificationViaRegressionWrapper help page ===============\n") ==example from makeClassificationViaRegressionWrapper help page =============== > # this tests that plotmo.prolog can access the learner.model at object$learner.model$next.model$learner.model > > set.seed(2018) > lrn = makeLearner("regr.rpart") > lrn = makeClassificationViaRegressionWrapper(lrn) > ClassificationViaRegression = train.with.call(lrn, sonar.task, subset = 1:140) > plotmo(ClassificationViaRegression, SHOWCALL=TRUE) plotmo grid: V1 V2 V3 V4 V5 V6 V7 V8 V9 0.0228 0.0309 0.03415 0.0436 0.06185 0.0898 0.10905 0.1079 0.12425 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 0.14675 0.17765 0.20415 0.23515 0.284 0.34475 0.4347 0.42945 0.4559 0.4763 V20 V21 V22 V23 V24 V25 V26 V27 V28 V29 0.55465 0.60735 0.6532 0.6704 0.7206 0.70165 0.68745 0.65975 0.63945 0.56105 V30 V31 V32 V33 V34 V35 V36 V37 V38 V39 0.52325 0.468 0.3803 0.3608 0.37695 0.3663 0.41885 0.3821 0.3153 0.2847 V40 V41 V42 V43 V44 V45 V46 V47 V48 V49 0.28085 0.2602 0.23295 0.2066 0.1694 0.13395 0.09905 0.08755 0.0645 0.0362 V50 V51 V52 V53 V54 V55 V56 V57 V58 V59 0.0173 0.01325 0.01005 0.01105 0.01035 0.00835 0.0074 0.0072 0.0063 0.00705 V60 0.0059 > > source("test.epilog.R") plotmo/inst/slowtests/test.partykit.R0000644000176200001440000001251014664212517017567 0ustar liggesusers# test.partykit.R: test partykit and evtree packages source("test.prolog.R") library(plotmo) library(partykit) data("BostonHousing", package = "mlbench") data("PimaIndiansDiabetes", package = "mlbench") # lmtree boston <- transform(BostonHousing, chas = factor(chas, levels = 0:1, labels = c("no", "yes")), rad = factor(rad, ordered = TRUE)) set.seed(2018) lmtree.boston1 <- lmtree(medv ~ log(lstat) + rm^2 | crim + ptratio + tax + dis + rad + chas, data = boston, minsize = 40) boston2 <- boston boston2$log.lstat <- log(boston2$lstat) boston2$lstat <- NULL boston2$rm.squared <- boston2$rm^2 boston2$rm <- NULL set.seed(2018) lmtree.boston2 <- lmtree(medv ~ log.lstat + rm.squared | crim + ptratio + tax + dis + rad + chas, data = boston2, minsize = 40) plot(lmtree.boston1) plot(lmtree.boston2) plotmo(lmtree.boston1, SHOWCALL=TRUE) plotmo(lmtree.boston2, trace=2, SHOWCALL=TRUE) plotmo(lmtree.boston2, trace=1, all1=TRUE, degree2=c("ptratio", "log.lstat"), SHOWCALL=TRUE) plotmo(lmtree.boston2, all1=TRUE, all2=TRUE, SHOWCALL=TRUE) # TODO gives warnings because of because of price/citations in formula # data("Journals", package = "AER") # Journals <- transform(Journals, # age = 2000 - foundingyear, # chars = charpp * pages) # j_tree <- lmtree(log(subs) ~ log(price/citations) | price + citations + # age + chars + society, data = Journals, minsize = 10) # plotmo(j_tree, SHOWCALL=TRUE) # Works, but commented out to save testing time: # data("TeachingRatings", package = "AER") # tr_tree <- lmtree(eval ~ beauty | age + gender + division, # data = TeachingRatings, weights = students, subset = credits == "more", # caseweights = FALSE) # plot(tr_tree) # plotmo(tr_tree, all1=TRUE, all2=TRUE, SHOWCALL=TRUE) # glmtree glmtree1 <- glmtree(diabetes ~ glucose | mass + age, data = PimaIndiansDiabetes, family = binomial) plot(glmtree1) plotmo(glmtree1, SHOWCALL=TRUE) plotmo(glmtree1, all2=TRUE, SHOWCALL=TRUE) # mob pima <- PimaIndiansDiabetes[1:50,] # small set of data for fast test logit1 <- function(y, x, start = NULL, weights = NULL, offset = NULL, ...) { # note that a complicated formula is necessary formula <- as.formula(paste("y ~ ", paste(colnames(x)[-1], collapse="+"))) # -1 drops intercept glm(formula=formula, data=as.data.frame(x), family=binomial, start=start, ...) } mob1 <- mob(diabetes ~ glucose | mass + age, data = PimaIndiansDiabetes, fit = logit1) plot(mob1) plotmo(mob1, trace=1, SHOWCALL=TRUE) plotmo(mob1, pmethod="partdep", degree1=0, degree2=c("glucose", "mass"), persp.ticktype="detailed", SHOWCALL=TRUE) plotmo(mob1, all1=TRUE, all2=TRUE, SHOWCALL=TRUE) logit2 <- function(y, x, start = NULL, weights = NULL, offset = NULL, ...) { glm(y ~ 0 + x, family = binomial, start = start, ...) } mob2 <- mob(diabetes ~ glucose | mass, data = pima, fit = logit2) expect.err(try(plotmo(mob2)), "The formula in the mob fit function is not supported by plotmo") logit3 <- function(y, x, start = NULL, weights = NULL, offset = NULL, ...) { glm(y ~ 0+x , family = binomial, start = start, ...) } mob3 <- mob(diabetes ~ glucose | age, data = pima, fit = logit3) expect.err(try(plotmo(mob3)), "The formula in the mob fit function is not supported by plotmo") logit4 <- function(y, x, start = NULL, weights = NULL, offset = NULL, ...) { glm(y ~ x - 1, family = binomial, start = start, ...) } mob4 <- mob(diabetes ~ glucose | age, data = pima, fit = logit4) expect.err(try(plotmo(mob4)), "The formula in the mob fit function is not supported by plotmo") logit5 <- function(y, x, start = NULL, weights = NULL, offset = NULL, ...) { glm(y~x-1 , family = binomial, start = start, ...) } mob5 <- mob(diabetes ~ glucose | age, data = pima, fit = logit5) expect.err(try(plotmo(mob5)), "The formula in the mob fit function is not supported by plotmo") logit6 <- function (y, x, start = NULL, weights = NULL, offset = NULL, ...) { glm(as.formula(paste("y ~ ", paste(colnames(x)[-1], collapse="+"))), data=data.frame(x), family = binomial, start = start, ...) } mob6 <- mob(diabetes ~ glucose | mass + age, data = pima, fit = logit6) plot(mob6) # tree is just a root (no branches) plotmo(mob6) library(rpart.plot) rpart.Kyphosis <- rpart(Kyphosis ~ Age + Number + Start, data = kyphosis) plotmo(rpart.Kyphosis, SHOWCALL=TRUE) party.Kyphosis <- as.party(rpart.Kyphosis) expect.err(try(plotmo(party.Kyphosis)), "cannot get the original model predictors") library(evtree) ## regression set.seed(1090) airq <- subset(airquality, !is.na(Ozone) & complete.cases(airquality)) ev_air <- evtree(Ozone ~ ., data = airq) # plot(ev_air) plotmo(ev_air, SHOWCALL=TRUE) ## classification ev_iris <- evtree(Species ~ .,data = iris) # plot(ev_iris) plotmo(ev_iris, SHOWCALL=TRUE) plotmo(ev_iris, type="prob", nresponse="versicolor", pmethod="apartdep", SHOWCALL=TRUE) plotres(ev_iris, type="prob", nresponse="setosa", SHOWCALL=TRUE) # cforest cforest1 <- cforest(dist ~ speed, data = cars) plotmo(cforest1, trace=1, SHOWCALL=TRUE) plotres(cforest1, trace=1, SHOWCALL=TRUE) data("mammoexp", package = "TH.data") cforest2 <- cforest(ME ~ PB + SYMPT, data = mammoexp, ntree = 5) plotmo(cforest2, trace=1, SHOWCALL=TRUE, pmethod="apartdep") plotres(cforest2) source("test.epilog.R") plotmo/inst/slowtests/test.modguide.Rout.save0000644000176200001440000005402214563614021021200 0ustar liggesusers> # test.modguide.bat: test model1 and model2 (linmod examples) in modguide.pdf > > source("test.prolog.R") > options(warn=1) # print warnings as they occur > almost.equal <- function(x, y, max=1e-8) + { + stopifnot(max >= 0 && max < .01) + length(x) == length(y) && max(abs(x - y)) < max + } > # check that fit model matches ref lm model in all essential details > check.lm <- function(fit, ref, newdata=trees[3:5,], + check.coef.names=TRUE, + check.casenames=TRUE, + check.newdata=TRUE) + { + check.names <- function(fit.names, ref.names) + { + if(check.casenames && + # lm always adds rownames even if "1", "2", "3" + # this seems wasteful of resources, so linmod doesn't do this + !is.null(fit.names) && + !identical(fit.names, ref.names)) { + print(fit.names) + print(ref.names) + stop(deparse(substitute(fit.names)), " != ", + deparse(substitute(ref.names))) + } + } + cat("check ", deparse(substitute(fit)), " vs ", + deparse(substitute(ref)), "\n", sep="") + + stopifnot(coef(fit) == coef(ref)) + if(check.coef.names) + stopifnot(identical(names(coef(fit)), names(coef(ref)))) + + stopifnot(identical(dim(fit$coefficients), dim(ref$coefficients))) + stopifnot(length(fit$coefficients) == length(ref$coefficients)) + stopifnot(almost.equal(fit$coefficients, ref$coefficients)) + + stopifnot(identical(dim(fit$residuals), dim(ref$residuals))) + stopifnot(length(fit$residuals) == length(ref$residuals)) + stopifnot(almost.equal(fit$residuals, ref$residuals)) + + stopifnot(identical(dim(fit$fitted.values), dim(ref$fitted.values))) + stopifnot(length(fit$fitted.values) == length(ref$fitted.values)) + stopifnot(almost.equal(fit$fitted.values, ref$fitted.values)) + + if(!is.null(fit$vcov) && !is.null(ref$vcov)) { + stopifnot(identical(dim(fit$vcov), dim(ref$vcov))) + stopifnot(length(fit$vcov) == length(ref$vcov)) + stopifnot(almost.equal(fit$vcov, ref$vcov)) + } + ref.sigma <- ref$sigma + if(is.null(ref.sigma)) # in lm models, sigma is only available from summary() + ref.sigma <- summary(ref)$sigma + stopifnot(almost.equal(fit$sigma, ref.sigma)) + + stopifnot(almost.equal(fit$df, ref$df)) + + stopifnot(almost.equal(fitted(fit), fitted(ref))) + check.names(names(fitted(fit)), names(fitted(ref))) + + stopifnot(almost.equal(residuals(fit), residuals(ref))) + check.names(names(residuals(fit)), names(residuals(ref))) + + stopifnot(almost.equal(predict(fit), predict(ref))) + check.names(names(predict(fit)), names(predict(ref))) + if(check.newdata) { + stopifnot(almost.equal(predict(fit, newdata=newdata), + predict(ref, newdata=newdata))) + check.names(names(predict(fit, newdata=newdata)), + names(predict(ref, newdata=newdata))) + } + } > ### Model 1: original code from Friedrich Leisch tutorial > > source("modguide.model1.R") > > cat("==example issues with predict with functions in the tutorial\n") ==example issues with predict with functions in the tutorial > data(trees) > tr <- trees # trees data but with rownames > rownames(tr) <- paste("tree", 1:nrow(trees), sep="") > fit1 <- linmod(Volume~., data=tr) > expect.err(try(predict(fit1, newdata=data.frame(Girth=10, Height=80))), "object 'Volume' not found") Error in eval(predvars, data, env) : object 'Volume' not found Got expected error from try(predict(fit1, newdata = data.frame(Girth = 10, Height = 80))) > expect.err(try(predict(fit1, newdata=as.matrix(tr[1:3,]))), "'data' must be a data.frame, not a matrix or an array") Error in model.frame.default(object, data, xlev = xlev) : 'data' must be a data.frame, not a matrix or an array Got expected error from try(predict(fit1, newdata = as.matrix(tr[1:3, ]))) > library(plotmo) Loading required package: Formula Loading required package: plotrix > expect.err(try(plotmo(fit1)), "object 'Volume' not found") stats::predict(linmod.object, data.frame[3,2], type="response") Error in eval(predvars, data, env) : object 'Volume' not found Got expected error from try(plotmo(fit1)) > fit2 <- linmod(cbind(1, tr[,1:2]), tr[,3]) > stopifnot(coef(fit1) == coef(fit2)) > # following fail because newdata is a data.frame not a matrix > expect.err(try(predict(fit2, newdata=tr[,1:2])), "requires numeric/complex matrix/vector arguments") Error in x %*% coef(object) : requires numeric/complex matrix/vector arguments Got expected error from try(predict(fit2, newdata = tr[, 1:2])) > expect.err(try(predict(fit2, newdata=data.frame(Girth=10, Height=80))), "requires numeric/complex matrix/vector arguments") Error in x %*% coef(object) : requires numeric/complex matrix/vector arguments Got expected error from try(predict(fit2, newdata = data.frame(Girth = 10, Height = 80))) > expect.err(try(predict(fit2, newdata=as.matrix(data.frame(Girth=10, Height=80)))), "non-conformable arguments") Error in x %*% coef(object) : non-conformable arguments Got expected error from try(predict(fit2, newdata = as.matrix(data.frame(Girth = 10, Height = 80)))) > expect.err(try(plotmo(fit2)), "requires numeric/complex matrix/vector arguments") stats::predict(linmod.object, data.frame[3,3], type="response") Error in x %*% coef(object) : requires numeric/complex matrix/vector arguments Got expected error from try(plotmo(fit2)) > > cat("==a plotmo method function can deal with the issues\n") ==a plotmo method function can deal with the issues > plotmo.predict.linmod <- function(object, newdata, ...) + { + if(is.null(object$formula)) # x,y interface? + plotmo:::plotmo.predict.defaultm(object, newdata, ...) # pass matrix not data.frame + else { + # add dummy response column to newdata + newdata[[as.character(as.list(object$formula)[[2]])]] <- 1 + plotmo:::plotmo.predict.default(object, newdata, ...) + } + } > plotmo(fit1, pt.col=2, caption="fit1 with original tutorial code and plotmo.predict.linmod") plotmo grid: Girth Height 12.9 76 > plotmo(fit2, pt.col=2, caption="fit2 with original tutorial code and plotmo.predict.linmod") plotmo grid: 1 Girth Height 1 12.9 76 > remove(plotmo.predict.linmod) > > ### Model 2: minimal changes version for vignette "Guidelines for S3 Regression Models" > > source("modguide.model2.R") > > cat("==check that example issues with functions in the tutorial have gone\n") ==check that example issues with functions in the tutorial have gone > fit1.form <- linmod(Volume~., data=tr) > cat("==print(summary(fit1.form))\n") ==print(summary(fit1.form)) > print(summary(fit1.form)) Call: linmod.formula(formula = Volume ~ ., data = tr) Estimate StdErr t.value p.value (Intercept) -57.98766 8.63823 -6.7129 2.75e-07 *** Girth 4.70816 0.26426 17.8161 < 2.2e-16 *** Height 0.33925 0.13015 2.6066 0.01449 * --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 > stopifnot(abs(predict(fit1.form, newdata=data.frame(Girth=10, Height=80)) - 16.234045) < 1e-5) > stopifnot(sum(abs(predict(fit1.form, newdata=as.matrix(tr[1:3,])) - c(4.8376597, 4.5538516, 4.8169813))) < 1e-5) > > lm.tr <- lm(Volume~., data=tr) > check.lm(fit1.form, lm.tr) check fit1.form vs lm.tr > > fit1.mat <- linmod(tr[,1:2], tr[,3]) # note no need for intercept term > cat("==print(summary(fit1.mat))\n") ==print(summary(fit1.mat)) > print(summary(fit1.mat)) Call: linmod.default(x = tr[, 1:2], y = tr[, 3]) Estimate StdErr t.value p.value (Intercept) -57.98766 8.63823 -6.7129 2.75e-07 *** Girth 4.70816 0.26426 17.8161 < 2.2e-16 *** Height 0.33925 0.13015 2.6066 0.01449 * --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 > stopifnot(abs(predict(fit1.mat, newdata=data.frame(Girth=10, Height=80)) - 16.234045) < 1e-5) > stopifnot(sum(abs(predict(fit1.mat, newdata=tr[1:3,1:2]) - c(4.8376597, 4.5538516, 4.8169813))) < 1e-5) > stopifnot(abs(predict(fit1.mat, newdata=as.matrix(data.frame(Girth=10, Height=80))) - 16.234045) < 1e-5) > > check.lm(fit1.mat, lm.tr, newdata=trees[3:5,1:2]) check fit1.mat vs lm.tr > > cat("==example plots\n") ==example plots > > library(plotmo) > data(trees) > > fit1.form <- linmod(Volume~., data=trees) > print(fit1.form) Call: linmod.formula(formula = Volume ~ ., data = trees) Coefficients: (Intercept) Girth Height -57.9876589 4.7081605 0.3392512 > print(summary(fit1.form)) Call: linmod.formula(formula = Volume ~ ., data = trees) Estimate StdErr t.value p.value (Intercept) -57.98766 8.63823 -6.7129 2.75e-07 *** Girth 4.70816 0.26426 17.8161 < 2.2e-16 *** Height 0.33925 0.13015 2.6066 0.01449 * --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 > > fit1.mat <- linmod(trees[,1:2], trees[,3]) > print(fit1.mat) Call: linmod.default(x = trees[, 1:2], y = trees[, 3]) Coefficients: (Intercept) Girth Height -57.9876589 4.7081605 0.3392512 > print(summary(fit1.mat)) Call: linmod.default(x = trees[, 1:2], y = trees[, 3]) Estimate StdErr t.value p.value (Intercept) -57.98766 8.63823 -6.7129 2.75e-07 *** Girth 4.70816 0.26426 17.8161 < 2.2e-16 *** Height 0.33925 0.13015 2.6066 0.01449 * --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 > > plotmo(fit1.form) plotmo grid: Girth Height 12.9 76 > plotmo(fit1.mat) plotmo grid: Girth Height 12.9 76 > > plotres(fit1.form) > plotres(fit1.mat) > > cat("==test model building with different numeric args\n") ==test model building with different numeric args > > x <- tr[,1:2] > y <- tr[,3] > fit2.mat <- linmod(x, y) > check.lm(fit2.mat, lm.tr, newdata=trees[3:5,1:2]) check fit2.mat vs lm.tr > > # check consistency with lm > expect.err(try(linmod(y~x)), "invalid type (list) for variable 'x'") Error in model.frame.default(formula = formula, data = data) : invalid type (list) for variable 'x' Got expected error from try(linmod(y ~ x)) > expect.err(try(lm(y~x)), "invalid type (list) for variable 'x'") Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) : invalid type (list) for variable 'x' Got expected error from try(lm(y ~ x)) > > fit3.mat <- linmod(as.matrix(x), as.matrix(y)) > check.lm(fit3.mat, lm.tr, newdata=trees[3:5,1:2]) check fit3.mat vs lm.tr > > fit4.form <- linmod(y ~ as.matrix(x)) > lm4 <- linmod(y ~ as.matrix(x)) > check.lm(fit4.form, lm4) check fit4.form vs lm4 > stopifnot(coef(fit4.form) == coef(lm.tr), + gsub("as.matrix(x)", "", names(coef(fit4.form)), fixed=TRUE) == names(coef(lm.tr))) > > xm <- as.matrix(x) > fit5.form <- linmod(y ~ xm) > lm5 <- linmod(y ~ xm) > check.lm(fit5.form, lm5) check fit5.form vs lm5 > stopifnot(coef(fit5.form) == coef(lm.tr), + gsub("xm", "", names(coef(fit5.form)), fixed=TRUE) == names(coef(lm.tr))) > > cat("==test correct use of global x1 and y1\n") ==test correct use of global x1 and y1 > x1 <- tr[,1] > y1 <- tr[,3] > linmod1 <- linmod(y1~x1) > > fit6.mat <- linmod(x1, y1) > check.lm(fit6.mat, linmod1, newdata=x1[3:5], + check.newdata=FALSE, # TODO needed because linmod1 ignores newdata(!) + check.coef.names=FALSE, check.casenames=FALSE) check fit6.mat vs linmod1 > print(predict(fit6.mat, newdata=x1[3:5])) [1] 7.636077 16.248033 17.261205 > stopifnot(almost.equal(predict(fit6.mat, newdata=x1[3]), 7.63607739644657)) > # production version only: > # stopifnot(coef(fit6.mat) == coef(linmod1), > # names(coef(fit6.mat)) == c("(Intercept)", "V1")) # names(coef(linmod1) are "(Intercept)" "x1" > > fit6.form <- linmod(y1~x1) > check.lm(fit6.form, linmod1) check fit6.form vs linmod1 > > cat("==check integer input (sibsp is an integer) \n") ==check integer input (sibsp is an integer) > > library(earth) # for etitanic data > data(etitanic) > tit <- etitanic[seq(1, nrow(etitanic), by=60), ] # small set of data for tests (18 cases) > tit$survived <- tit$survived != 0 # convert to logical > rownames(tit) <- paste("pas", 1:nrow(tit), sep="") > cat(paste(colnames(tit), "=", sapply(tit, class), sep="", collapse=", "), "\n") pclass=factor, survived=logical, sex=factor, age=numeric, sibsp=integer, parch=integer > > fit7.mat <- linmod(tit$age, tit$sibsp) > lm7 <- lm.fit(cbind(1, tit$age), tit$sibsp) > stopifnot(coef(fit7.mat) == coef(lm7)) # coef names will differ > > fit7.form <- linmod(sibsp~age, data=tit) > lm7.form <- lm(sibsp~age, data=tit) > check.lm(fit7.form, lm7.form, newdata=tit[3:5,]) check fit7.form vs lm7.form > > fit8.mat <- linmod(tit$sibsp, tit$age) > lm8 <- lm.fit(cbind(1, tit$sibsp), tit$age) > stopifnot(coef(fit8.mat) == coef(lm8)) # coef names will differ > > fit8.form <- linmod(age~sibsp, data=tit) > lm8.form <- lm(age~sibsp, data=tit) > check.lm(fit8.form, lm8.form, newdata=tit[3:5,]) check fit8.form vs lm8.form > > # drop=FALSE so response is a data frame > fit1a.mat <- linmod(trees[,1:2], trees[, 3, drop=FALSE]) > print(fit1a.mat) Call: linmod.default(x = trees[, 1:2], y = trees[, 3, drop = FALSE]) Coefficients: (Intercept) Girth Height -57.9876589 4.7081605 0.3392512 > print(summary(fit1.mat)) Call: linmod.default(x = trees[, 1:2], y = trees[, 3]) Estimate StdErr t.value p.value (Intercept) -57.98766 8.63823 -6.7129 2.75e-07 *** Girth 4.70816 0.26426 17.8161 < 2.2e-16 *** Height 0.33925 0.13015 2.6066 0.01449 * --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 > plotres(fit1a.mat) # plot caption shows response name "Volume" > > cat("==test model building with different non numeric args\n") ==test model building with different non numeric args > > library(earth) # for etitanic data > data(etitanic) > tit <- etitanic[seq(1, nrow(etitanic), by=60), ] # small set of data for tests (18 cases) > tit$survived <- tit$survived != 0 # convert to logical > rownames(tit) <- paste("pas", 1:nrow(tit), sep="") > cat(paste(colnames(tit), "=", sapply(tit, class), sep="", collapse=", "), "\n") pclass=factor, survived=logical, sex=factor, age=numeric, sibsp=integer, parch=integer > > lm9 <- lm(survived~., data=tit) > fit9.form <- linmod(survived~., data=tit) > check.lm(fit9.form, lm9, newdata=tit[3:5,]) check fit9.form vs lm9 > > options(warn=2) # treat warnings as errors > # factors in x > expect.err(try(linmod(tit[,c(1,3,4,5,6)], tit[,"survived"])), "NAs introduced by coercion") Error in storage.mode(x) <- "double" : (converted from warning) NAs introduced by coercion Got expected error from try(linmod(tit[, c(1, 3, 4, 5, 6)], tit[, "survived"])) > options(warn=1) # print warnings as they occur > expect.err(try(linmod(tit[,c(1,3,4,5,6)], tit[,"survived"])), "NA/NaN/Inf in foreign function call (arg 1)") Warning in storage.mode(x) <- "double" : NAs introduced by coercion Error in qr.default(x) : NA/NaN/Inf in foreign function call (arg 1) Got expected error from try(linmod(tit[, c(1, 3, 4, 5, 6)], tit[, "survived"])) > > options(warn=2) # treat warnings as errors > expect.err(try(lm(pclass~., data=tit)), "using type = \"numeric\" with a factor response will be ignored") Error in model.response(mf, "numeric") : (converted from warning) using type = "numeric" with a factor response will be ignored Got expected error from try(lm(pclass ~ ., data = tit)) > # minimal version > expect.err(try(linmod(pclass~., data=tit)), "(converted from warning) NAs introduced by coercion") Error in storage.mode(y) <- "double" : (converted from warning) NAs introduced by coercion Got expected error from try(linmod(pclass ~ ., data = tit)) > expect.err(try(linmod(tit$pclass, tit$survived)), "(converted from warning) NAs introduced by coercion") Error in storage.mode(x) <- "double" : (converted from warning) NAs introduced by coercion Got expected error from try(linmod(tit$pclass, tit$survived)) > # # production version > # expect.err(try(linmod(pclass~., data=tit)), "'y' is not numeric or logical") > options(warn=1) > > lm10 <- lm(pclass~., data=tit) # will give warnings Warning in model.response(mf, "numeric") : using type = "numeric" with a factor response will be ignored Warning in Ops.factor(y, z$residuals) : '-' not meaningful for factors > fit10.form <- linmod(as.numeric(pclass)~., data=tit) > stopifnot(coef(fit10.form) == coef(lm10)) > stopifnot(names(coef(fit10.form)) == names(coef(lm10))) > # check.lm(fit10.form, lm10) # fails because lm10 fitted is all NA > > # production version: (minimal version just gives warnings and builds lousy model) > # expect.err(try(linmod(pclass~., data=tit)), "'y' is not numeric or logical") > # expect.err(try(linmod(tit[,-1], tit[,1])), "'y' is not numeric or logical") > # expect.err(try(linmod(1:10, paste(1:10))), "'y' is not numeric or logical") > > fit10a.form <- linmod(survived~pclass, data=tit) > lm10a <- lm(survived~pclass, data=tit) > check.lm(fit10a.form, lm10a, newdata=tit[3:5,]) check fit10a.form vs lm10a > > expect.err(try(linmod(paste(1:10), 1:10)), "requires numeric/complex matrix/vector arguments") Error in x %*% coef : requires numeric/complex matrix/vector arguments Got expected error from try(linmod(paste(1:10), 1:10)) > > lm11 <- lm(as.numeric(pclass)~., data=tit) > fit11.form <- linmod(as.numeric(pclass)~., data=tit) > check.lm(fit11.form, lm11, newdata=tit[3:5,]) check fit11.form vs lm11 > > cat("==data.frame with strings\n") ==data.frame with strings > > df.with.string <- + data.frame(1:5, + c(1,2,-1,4,5), + c("a", "b", "a", "a", "b"), + stringsAsFactors=FALSE) > colnames(df.with.string) <- c("num1", "num2", "string") > > fit30.form <- linmod(num1~num2, df.with.string) > lm30 <- lm(num1~num2, df.with.string) > check.lm(fit30.form, lm30, check.newdata=FALSE) check fit30.form vs lm30 > > fit31.form <- linmod(num1~., df.with.string) > lm31 <- lm(num1~., df.with.string) > check.lm(fit31.form, lm31, check.newdata=FALSE) check fit31.form vs lm31 > > expect.err(try(linmod(string~., df.with.string)), "non-numeric argument to binary operator") Warning in storage.mode(y) <- "double" : NAs introduced by coercion Error in y - x %*% coef : non-numeric argument to binary operator Got expected error from try(linmod(string ~ ., df.with.string)) > # production version > # expect.err(try(linmod(string~., df.with.string)), "'y' is not numeric or logical") > > vec <- c(1,2,3,4,3) > options(warn=2) # treat warnings as errors > expect.err(try(linmod(df.with.string, vec)), "NAs introduced by coercion") Error in storage.mode(x) <- "double" : (converted from warning) NAs introduced by coercion Got expected error from try(linmod(df.with.string, vec)) > options(warn=1) > # minimal version > expect.err(try(linmod(df.with.string, vec)), "NA/NaN/Inf in foreign function call (arg 1)") Warning in storage.mode(x) <- "double" : NAs introduced by coercion Error in qr.default(x) : NA/NaN/Inf in foreign function call (arg 1) Got expected error from try(linmod(df.with.string, vec)) > # production version > # expect.err(try(linmod(df.with.string, vec)), "NA in 'x'") > > options(warn=2) # treat warnings as errors > expect.err(try(linmod(df.with.string, vec)), "NAs introduced by coercion") Error in storage.mode(x) <- "double" : (converted from warning) NAs introduced by coercion Got expected error from try(linmod(df.with.string, vec)) > options(warn=1) > # minimal version > expect.err(try(linmod(df.with.string, vec)), "NA/NaN/Inf in foreign function call (arg 1)") Warning in storage.mode(x) <- "double" : NAs introduced by coercion Error in qr.default(x) : NA/NaN/Inf in foreign function call (arg 1) Got expected error from try(linmod(df.with.string, vec)) > # production version > # expect.err(try(linmod(df.with.string, vec)), "NA in 'x'") > > cat("==more variables than cases\n") ==more variables than cases > > set.seed(1) > x2 <- matrix(rnorm(6), nrow=2) > y2 <- c(1,2) > # production version > # expect.err(try(linmod(y2~x2)), "more variables than cases") > # minimal version > expect.err(try(linmod(y2~x2)), "'size' cannot exceed nrow(x) = 2") Error in chol2inv(qx$qr) : 'size' cannot exceed nrow(x) = 2 Got expected error from try(linmod(y2 ~ x2)) > > x3 <- matrix(1:10, ncol=2) > y3 <- c(1,2,9,4,5) > # production version will give a better error message > expect.err(try(linmod(y3~x3)), "singular matrix 'a' in 'solve'") Error in solve.qr(qx, y) : singular matrix 'a' in 'solve' Got expected error from try(linmod(y3 ~ x3)) > > cat("==nrow(x) does not match length(y)\n") ==nrow(x) does not match length(y) > # note that the production version gives better error messages > > x4 <- matrix(1:10, ncol=2) > y4 <- c(1,2,9,4) > expect.err(try(linmod(x4, y4)), "singular matrix 'a' in 'solve'") Error in solve.qr(qx, y) : singular matrix 'a' in 'solve' Got expected error from try(linmod(x4, y4)) > > x5 <- matrix(1:10, ncol=2) > y5 <- c(1,2,9,4,5,9) > expect.err(try(linmod(x5, y5)), "singular matrix 'a' in 'solve'") Error in solve.qr(qx, y) : singular matrix 'a' in 'solve' Got expected error from try(linmod(x5, y5)) > > cat("==y has multiple columns\n") ==y has multiple columns > > vec <- c(1,2,3,4,3) > y2 <- cbind(c(1,2,3,4,9), vec^2) > expect.err(try(linmod(vec, y2)), "'qr' and 'y' must have the same number of rows") Error in qr.coef(a, b) : 'qr' and 'y' must have the same number of rows Got expected error from try(linmod(vec, y2)) > # following does not issue any error message, it should > # expect.err(try(linmod(y2~vec)), "error message") > > ### Model 3: production version of linmod is tested in test.linmod.R > > source("test.epilog.R") plotmo/inst/slowtests/test.plotmo.R0000644000176200001440000010461513727235376017251 0ustar liggesusers# test.plotmo.R: regression tests for plotmo # Stephen Milborrow, Petaluma Jan 2007 print(R.version.string) source("test.prolog.R") library(earth) options(warn=1) # print warnings as they occur data(etitanic) make.space.for.caption <- function(caption="CAPTION") { oma <- par("oma") needed <- 3 # adjust for newlines in caption newlines <- grep("\n", caption) if(length(newlines) > 0) needed <- needed + .5 * newlines # .5 seems enough although 1 in theory if(!is.null(caption) && any(nchar(caption)) && oma[3] <= needed) { oma[3] <- needed par(oma=oma) } } dopar <- function(nrows, ncols, caption = "") { cat(" ", caption, "\n") make.space.for.caption(caption) par(mfrow=c(nrows, ncols)) par(mar = c(3, 3, 1.7, 0.5)) par(mgp = c(1.6, 0.6, 0)) par(cex = 0.7) } example(plotmo) caption <- "basic earth test of plotmo" a <- earth(O3 ~ ., data=ozone1, degree=2) plotmo(a, degree1=2, degree2=4, caption=caption, trace=-1) caption <- "test 5 x 5 layout" dopar(1,1,caption) a <- earth(O3 ~ ., data=ozone1, nk=51, pmethod="n", degree=2) plotmo(a, caption=caption, trace=1) caption <- "test 4 x 4 layout with ylab" dopar(1,1,caption) a <- earth(O3 ~ ., data=ozone1, nk=30, pmethod="n", degree=2) plotmo(a, caption=caption, trace=2) caption <- "test 3 x 3 layout" dopar(1,1,caption) a <- earth(O3 ~ ., data=ozone1, nk=16, pmethod="n", degree=2) plotmo(a, caption=caption, trace=3) caption <- "test 2 x 2 layout" dopar(1,1,caption) a <- earth(O3 ~ ., data=ozone1, nk=9, pmethod="n", degree=2) plotmo(a, caption=caption) caption <- "test 1 x 1 layout" dopar(1,1,caption) a <- earth(O3 ~ ., data=ozone1, nk=4, pmethod="n", degree=2) plotmo(a, caption=caption) caption <- "test plotmo basic params" a <- earth(O3 ~ ., data=ozone1, degree=2) dopar(3,2,caption) plotmo(a, do.par=FALSE, degree1=1, nrug=-1, degree2=F, caption=caption, main="test main", xlab="test xlab", ylab="test ylab") plotmo(a, do.par=FALSE, degree1=F, degree2=4, grid.func=mean, persp.col="white", ngrid2=10, persp.phi=40) set.seed(2016) plotmo(a, do.par=FALSE, degree1=1, degree1.lty=2, degree1.lwd=4, degree1.col=2, nrug=TRUE, degree2=F, main="nrug=300") plotmo(a, do.par=FALSE, degree1=1, nrug=-1, degree2=F, main="nrug=TRUE") set.seed(2016) plotmo(a, do.par=FALSE, degree1=1, nrug=10, ngrid1=50, degree2=F, main="ngrid1=50 nrug=10") plotmo(a, do.par=FALSE, degree1=NA, degree2=1, persp.phi=60) # graph args caption <- "test plotmo xlim and ylim" a <- earth(O3 ~ ., data=ozone1, degree=2) dopar(5,3,caption) plotmo(a, do.par=FALSE, degree1=2:3, degree2=4, caption=caption, xlab="ylim=default") plotmo(a, do.par=FALSE, degree1=2:3, degree2=4, ylim=NA, xlab="ylim=NA") plotmo(a, do.par=FALSE, degree1=2:3, degree2=4, ylim=c(0,20), xlab="ylim=c(0,20)") plotmo(a, do.par=FALSE, degree1=2:3, degree2=4, xlim=c(190,250), xlab="xlim=c(190,250)") plotmo(a, do.par=FALSE, degree1=2:3, degree2=4, xlim=c(190,250), ylim=c(11,18), xlab="xlim=c(190,250), ylim=c(11,18)") # check various types of predictors with grid.func and ndiscrete varied.type.data <- data.frame( y = 1:13, num = c(1, 3, 2, 3, 4, 5, 6, 4, 5, 6.5, 3, 6, 5), # 7 unique values (but one is non integral) int = c(1L, 1L, 3L, 3L, 4L, 4L, 3L, 5L, 3L, 6L, 7L, 8L, 10L), # 8 unique values bool = c(F, F, F, F, F, T, T, T, T, T, T, T, T), date = as.Date( c("2018-08-01", "2018-08-02", "2018-08-03", "2018-08-04", "2018-08-05", "2018-08-06", "2018-08-07", "2018-08-08", "2018-08-08", "2018-08-08", "2018-08-10", "2018-08-11", "2018-08-11")), ord = ordered(c("ord3", "ord3", "ord3", "ord1", "ord2", "ord3", "ord1", "ord2", "ord3", "ord1", "ord1", "ord1", "ord1"), levels=c("ord1", "ord3", "ord2")), fac = as.factor(c("fac1", "fac1", "fac1", "fac2", "fac2", "fac2", "fac3", "fac3", "fac3", "fac1", "fac2", "fac3", "fac3")), str = c("str1", "str1", "str1", # will be treated like a factor "str2", "str2", "str2", "str3", "str3", "str3", "str3", "str3", "str3", "str3")) varied.type.lm <- lm(y ~ ., data = varied.type.data) print(summary(varied.type.lm)) set.seed(2018) plotres(varied.type.lm, info=TRUE) plotmo(varied.type.lm, pmethod="apartdep", all2=TRUE, ticktype="d", col.response="red", caption="varied.type.lm\npmethod=\"apartdep\" default grid func") plotmo(varied.type.lm, all2=TRUE, ticktype="d", col.response="red", caption="varied.type.lm\ndefault grid func") plotmo(varied.type.lm, all2=TRUE, ndiscre=1, caption="varied.type.lm\nndiscrete=1") plotmo(varied.type.lm, all2=TRUE, ndiscr=2, caption="varied.type.lm\nndiscrete=2") plotmo(varied.type.lm, all2=TRUE, ndis=100, caption="varied.type.lm\nndiscrete=100") cat("grid.func=median:\n") plotmo(varied.type.lm, all2=TRUE, grid.func=median, caption="varied.type.lm\ngrid.func=median") cat("grid.func=quantile:\n") plotmo(varied.type.lm, all2=TRUE, grid.func=function(x, ...) quantile(x, 0.5), caption="varied.type.lm\ngrid.func=function(x, ...) quantile(x, 0.5)") cat("grid.func=mean:\n") plotmo(varied.type.lm, all2=TRUE, grid.func=mean, caption="varied.type.lm\ngrid.func=mean") varied.type.earth <- earth(y ~ ., data = varied.type.data, thresh=0, penalty=-1, trace=1) print(summary(varied.type.earth)) set.seed(2018) plotres(varied.type.earth, info=TRUE) plotmo(varied.type.earth, all1=TRUE, all2=TRUE, persp.ticktype="d", col.response="red") # term.plot calls predict.earth with an se parameter, even with termplot(se=FALSE) caption <- "basic earth test against termplot" dopar(4,4,caption) make.space.for.caption("test caption1") a <- earth(O3 ~ ., data=ozone1, degree=2) plotmo(a, do.par=FALSE, ylim=NA, caption=caption, degree2=FALSE) cat("Ignore warning: predict.earth ignored argument \"se.fit\"\n") termplot(a) caption <- "test change order of earth predictors and cex" dopar(4,4,caption) # minspan=1 to force two degree2 graphs for the test (wasn't necessary in old versions of earth) a <- earth(doy ~ humidity + temp + wind, data=ozone1, degree=2, minspan=1) plotmo(a, do.par=FALSE, ylim=NA, caption=caption, degree2=c(1,2), cex=1.2) termplot(a) caption <- "test all1=TRUE" a <- earth(doy ~ humidity + temp + wind, data=ozone1, degree=2) plotmo(a, caption=caption, all1=TRUE, persp.ticktype="d", persp.nticks=2) caption <- "test all2=TRUE" print(summary(a)) plotmo(a, caption=caption, all2=TRUE) oz <- ozone1[150:200,c("O3","temp","humidity","ibh")] a.glob <- earth(O3~temp+humidity, data=oz, degree=2) ad.glob <- earth(oz[,2:3], oz[,1], degree=2) func1 <- function() { caption <- "test environments and finding the correct data" dopar(4,4,caption) set.seed(2016) plotmo(a.glob, do.par=FALSE, main="a.glob oz", degree1=1, all2=1, degree2=1, type2="im", col.response=3, pt.pch=20, trace=2) mtext(caption, outer=TRUE, font=2, line=1.5, cex=1) plotmo(ad.glob, do.par=FALSE, main="ad.glob oz", degree1=1, all2=1, degree2=1, type2="im", col.response=3, pch.response=20, trace=2) # pch.response test backcompat a <- earth(O3~temp+humidity, data=oz, degree=2) plotmo(a, do.par=FALSE, main="a oz", degree1=1, all2=1, degree2=1, type2="im", col.response=3, pt.pch=20) ad <- earth(oz[,2:3], oz[,1], degree=2) plotmo(ad, do.par=FALSE, main="ad oz", degree1=1, all2=1, degree2=1, type2="im", col.response=3, pt.pch=20) oz.org <- oz oz10 <- 10 * oz # multiply by 10 so we can see by the axis labels if right data is being used oz <- oz10 # oz is now local to this function, but multiplied by 10 a.oz10 <- earth(O3~temp+humidity, data=oz, degree=2) a.oz10.keep <- earth(O3~temp+humidity, data=oz, degree=2, keepxy=TRUE) plotmo(a.oz10, do.par=FALSE, main="a oz10", degree1=1, all2=1, degree2=1, type2="im", col.response=3, pt.pch=20) ad.oz10 <- earth(oz[,2:3], oz[,1], degree=2) ad.oz10.keep <- earth(oz[,2:3], oz[,1], degree=2, keepxy=TRUE) plotmo(ad.oz10, do.par=FALSE, main="ad oz10", degree1=1, all2=1, degree2=1, type2="im", col.response=3, pt.pch=20) func2 <- function() { a.func <- earth(O3 ~ temp + humidity, data=oz10, degree=2) plotmo(a.func, do.par=FALSE, main="a.func oz10", degree1=1, all2=1, degree2=1, type2="im", col.response=3, pt.pch=20) ad.func <- earth(oz10[,2:3], oz10[,1], degree=2) plotmo(ad.func, do.par=FALSE, main="ad.func oz10", degree1=1, all2=1, degree2=1, type2="im", col.response=3, pt.pch=20) caption <- "test environments and finding the correct data, continued" dopar(4,4,caption) oz <- .1 * oz.org a.func <- earth(O3~temp+ humidity , data=oz, degree=2) plotmo(a.func, do.par=FALSE, main="a.func oz.1", degree1=1, all2=1, degree2=1, type2="im", col.response=3, pt.pch=20) ad.func <- earth(oz[,2:3], oz[,1], degree=2) plotmo(ad.func, do.par=FALSE, main="ad.func oz.1", degree1=1, all2=1, degree2=1, type2="im", col.response=3, pt.pch=20) plotmo(a.oz10.keep, do.par=FALSE, main="func1:a.oz10.keep", degree1=1, all2=1, degree2=1, type2="im", col.response=3, pt.pch=20) plotmo(ad.oz10.keep, do.par=FALSE, main="func1:ad.oz10.keep", degree1=1, all2=1, degree2=1, type2="im", col.response=3, pt.pch=20) cat("Expect error msg: formal argument \"do.par\" matched by multiple actual arguments\n") expect.err(try(plotmo(a.oz10, do.par=FALSE, main="func1:a.oz10", degree1=1, all2=1, degree2=1, type2="im", col.response=3, pt.pch=20, do.par=FALSE))) } func2() y <- 3:11 x1 <- c(1,3,2,4,5,6,6,6,6) x2 <- c(2,3,4,5,6,7,8,9,10) frame <- data.frame(y=y, x1=x1, x2=x2) foo <- function() { lm.18.out <- lm(y~x1+x2, model=FALSE) x1[2] <- 18 y[3] <- 19 frame <- data.frame(y=y, x1=x1, x2=x2) list(lm.18.out = lm.18.out, lm.18 = lm(y~x1+x2), lm.18.keep = lm(y~x1+x2, x=TRUE, y=TRUE), lm.18.frame = lm(y~x1+x2, data=frame)) } temp <- foo() lm.18.out <- temp$lm.18.out lm.18 <- temp$lm.18 lm.18.keep <- temp$lm.18.keep lm.18.frame <- temp$lm.18.frame # following should all use the x1 and y inside foo cat("==lm.18.out\n") plotmo(lm.18.out, main="lm.18.out", do.par=FALSE, degree1=1, clip=FALSE, ylim=c(0,20), col.response=2, pt.pch=20) cat("==lm.18\n") plotmo(lm.18, main="lm.18", do.par=FALSE, degree1=1, clip=FALSE, ylim=c(0,20), col.response=2, pt.pch=20) cat("==lm.18.keep\n") plotmo(lm.18.keep, main="lm.18.keep", trace=2, do.par=FALSE, degree1=1, clip=FALSE, ylim=c(0,20), col.response=2, pt.pch=20) cat("==lm.18.frame\n") plotmo(lm.18.frame, main="lm.18.frame", do.par=FALSE, degree1=1, clip=FALSE, ylim=c(0,20), col.response=2, pt.pch=20) } func1() caption <- "test earth formula versus x,y model" # dopar(4,4,caption) # mtext(caption, outer=TRUE, font=2, line=1.5, cex=1) a <- earth(O3 ~ ., data=ozone1, degree=2) plotmo(a, caption="test earth formula versus xy model (formula)") a <- earth(ozone1[, -1], ozone1[,1], degree=2) plotmo(a, caption="test earth formula versus xy model (xy)") # single predictor caption <- "test earth(O3~wind, data=ozone1, degree=2), single predictor" dopar(2,2,caption) a <- earth(O3~wind, data=ozone1, degree=2) plotmo(a) caption = "se=2, earth(doy~humidity+temp+wind, data=ozone1) versus termplot (expect no se lines)" dopar(3,3,caption) mtext(caption, outer=TRUE, font=2, line=1.5, cex=1) # minspan=1 to force two degree2 graphs for the test (wasn't necessary in old versions of earth) a <- earth(doy~humidity + temp + wind, data=ozone1, degree=2, minspan=1) cat("Ignore warning: predict.earth ignored argument \"se\"\n") termplot(a) plotmo(a, do.par=FALSE, ylim=NA, degree2=c(1:2), clip=FALSE, caption=caption) # test fix to bug reported by Joe Retzer, FIXED Dec 7, 2007 N <- 650 set.seed(2007) q_4 <- runif(N, -1, 1) q_2102 <- runif(N, -1, 1) q_2104 <- runif(N, -1, 1) q_3105 <- runif(N, -1, 1) q_3106 <- runif(N, -1, 1) q_4104 <- runif(N, -1, 1) q_6101 <- runif(N, -1, 1) q_6103 <- runif(N, -1, 1) q_7104 <- runif(N, -1, 1) q_3109 <- runif(N, -1, 1) q_4103 <- runif(N, -1, 1) q_2111 <- runif(N, -1, 1) q_3107 <- runif(N, -1, 1) q_3101 <- runif(N, -1, 1) q_3104 <- runif(N, -1, 1) q_7107 <- runif(N, -1, 1) depIndex <- sin(1.0 * q_4 + rnorm(650, sd=.8)) + sin(1.8 * q_2102 + rnorm(650, sd=.8)) + sin(1.3 * q_2104 + rnorm(650, sd=.8)) + sin(1.4 * q_3105 + rnorm(650, sd=.8)) + sin(1.5 * q_3106 + rnorm(650, sd=.8)) + sin(1.6 * q_4104 + rnorm(650, sd=.8)) + sin(1.8 * q_6101 + rnorm(650, sd=.8)) + sin(1.8 * q_6103 + rnorm(650, sd=.8)) + sin(1.9 * q_7104 + rnorm(650, sd=.8)) + sin(2.0 * q_3109 + rnorm(650, sd=.8)) regDatCWD <- as.data.frame(cbind(depIndex, q_4, q_2102, q_2104, q_3105, q_3106, q_4104, q_6101, q_6103, q_7104, q_3109, q_4103, q_2111, q_3107, q_3101, q_3104, q_7107)) cat("--plotmo(earthobj5)--\n") earthobj5 <- earth(depIndex ~ q_4+q_2102+q_2104+q_3105+q_3106+q_4104+q_6101+q_6103+q_7104+q_3109+q_4103+q_2111+q_3107+q_3101+q_3104+q_7107, data=regDatCWD) print(summary(earthobj5, digits = 2)) plotmo(earthobj5) # long predictor names a.rather.long.in.fact.very.long.name.q_4 <- q_4 a.rather.long.in.fact.very.long.name.q_2102 <- q_2102 a.rather.long.in.fact.very.long.name.q_2104 <- q_2104 a.rather.long.in.fact.very.long.name.q_3105 <- q_3105 a.rather.long.in.fact.very.long.name.q_3106 <- q_3106 a.rather.long.in.fact.very.long.name.q_4104 <- q_4104 a.rather.long.in.fact.very.long.name.q_6101 <- q_6101 a.rather.long.in.fact.very.long.name.q_6103 <- q_6103 a.rather.long.in.fact.very.long.name.q_7104 <- q_7104 a.rather.long.in.fact.very.long.name.q_3109 <- q_3109 a.rather.long.in.fact.very.long.name.q_4103 <- q_4103 a.rather.long.in.fact.very.long.name.q_2111 <- q_2111 a.rather.long.in.fact.very.long.name.q_3107 <- q_3107 a.rather.long.in.fact.very.long.name.q_3101 <- q_3101 a.rather.long.in.fact.very.long.name.q_3104 <- q_3104 a.rather.long.in.fact.very.long.name.q_7107 <- q_7107 a.rather.long.in.fact.very.long.name.for.the.response <- depIndex a.rather.long.in.fact.very.long.name.for.the.dataframe <- as.data.frame(cbind( a.rather.long.in.fact.very.long.name.for.the.response, a.rather.long.in.fact.very.long.name.q_4, a.rather.long.in.fact.very.long.name.q_2102, a.rather.long.in.fact.very.long.name.q_2104, a.rather.long.in.fact.very.long.name.q_3105, a.rather.long.in.fact.very.long.name.q_3106, a.rather.long.in.fact.very.long.name.q_4104, a.rather.long.in.fact.very.long.name.q_6101, a.rather.long.in.fact.very.long.name.q_6103, a.rather.long.in.fact.very.long.name.q_7104, a.rather.long.in.fact.very.long.name.q_3109, a.rather.long.in.fact.very.long.name.q_4103, a.rather.long.in.fact.very.long.name.q_2111, a.rather.long.in.fact.very.long.name.q_3107, a.rather.long.in.fact.very.long.name.q_3101, a.rather.long.in.fact.very.long.name.q_3104, a.rather.long.in.fact.very.long.name.q_7107)) cat("--a.rather.long.in.fact.very.long.name.for.the...A--\n") a.rather.long.in.fact.very.long.name.for.the.modelA <- earth(a.rather.long.in.fact.very.long.name.for.the.response ~ a.rather.long.in.fact.very.long.name.q_4 + a.rather.long.in.fact.very.long.name.q_2102 + a.rather.long.in.fact.very.long.name.q_2104 + a.rather.long.in.fact.very.long.name.q_3105 + a.rather.long.in.fact.very.long.name.q_3106 + a.rather.long.in.fact.very.long.name.q_4104 + a.rather.long.in.fact.very.long.name.q_6101 + a.rather.long.in.fact.very.long.name.q_6103 + a.rather.long.in.fact.very.long.name.q_7104 + a.rather.long.in.fact.very.long.name.q_3109 + a.rather.long.in.fact.very.long.name.q_4103 + a.rather.long.in.fact.very.long.name.q_2111 + a.rather.long.in.fact.very.long.name.q_3107 + a.rather.long.in.fact.very.long.name.q_3101 + a.rather.long.in.fact.very.long.name.q_3104 + a.rather.long.in.fact.very.long.name.q_7107, data = a.rather.long.in.fact.very.long.name.for.the.dataframe) print(summary(a.rather.long.in.fact.very.long.name.for.the.modelA, digits = 2)) plot(a.rather.long.in.fact.very.long.name.for.the.modelA) plotmo(a.rather.long.in.fact.very.long.name.for.the.modelA) cat("--a.rather.long.in.fact.very.long.name.for.the...C--\n") a.rather.long.in.fact.very.long.name.for.the.modelC <- earth(x = a.rather.long.in.fact.very.long.name.for.the.dataframe[,-1], y = a.rather.long.in.fact.very.long.name.for.the.response, degree = 3) print(summary(a.rather.long.in.fact.very.long.name.for.the.modelC, digits = 2)) plot(a.rather.long.in.fact.very.long.name.for.the.modelC) plotmo(a.rather.long.in.fact.very.long.name.for.the.modelC) a <- earth(survived ~ pclass+sex+age, data=etitanic, degree=2) print(summary(a)) plotmo(a, caption="plotmo with facs: pclass+sex+age") plotmo(a, caption="plotmo with facs: pclass+sex+age, all1=T, grid.col=\"gray\"", all1=T, grid.col="gray") plotmo(a, caption="plotmo with facs: pclass+sex+age, all2=T, col.grid=\"green\"", all2=T, col.grid="green") plotmo(a, caption="plotmo with facs: pclass+sex+age, all1=T, all2=T, grid=2", all1=T, all2=T, grid.col=2) plotmo(a, clip=FALSE, degree2=FALSE, caption="plotmo (no degree2) with facs: pclass+sex+age") plotmo(a, clip=FALSE, grid.levels=list(pclass="2n", sex="ma"), caption="plotmo with grid.levels: pclass+sex+age") # in above tests, all degree2 terms use facs # now build a model with some degree2 term that use facs, some that don't a <- earth(survived ~ pclass+age+sibsp, data=etitanic, degree=2) print(summary(a)) plotmo(a, caption="plotmo with mixed fac and non-fac degree2 terms", persp.border=NA) plotmo(a, caption="plotmo with mixed fac and non-fac degree2 terms and grid.levels", grid.levels=list(pclass="2n", age=20), # test partial matching of grid levels, and numeric preds persp.ticktype="d", persp.nticks=2) # check detection of illegal grid.levels argument expect.err(try(plotmo(a, grid.levels=list(pcla="1", pclass="2"))), 'illegal grid.levels argument ("pcla" and "pclass" both match "pclass")') expect.err(try(plotmo(a, grid.levels=list(pclass="1", pcla="2"))), 'illegal grid.levels argument ("pclass" and "pcla" both match "pclass")') expect.err(try(plotmo(a, grid.levels=list(pcla="nonesuch"))), 'illegal level "nonesuch" for "pclass" in grid.levels (allowed levels are "1st" "2nd" "3rd")') expect.err(try(plotmo(a, grid.levels=list(pcla="1sx"))), 'illegal level "1sx" for "pclass" in grid.levels (allowed levels are "1st" "2nd" "3rd")') expect.err(try(plotmo(a, grid.levels=list(pcla=1))), 'illegal level for "pclass" in grid.levels (specify factor levels with a string)') expect.err(try(plotmo(a, grid.levels=list(pcla=c("ab", "cd")))), "length(pclass) in grid.levels is not 1") expect.err(try(plotmo(a, grid.levels=list(pcla=NA))), 'pclass in grid.levels is NA') expect.err(try(plotmo(a, grid.levels=list(pcla=Inf))), 'pclass in grid.levels is infinite') expect.err(try(plotmo(a, grid.levels=list(pcla=9))), 'illegal level for "pclass" in grid.levels (specify factor levels with a string)') options(warn=2) expect.err(try(plotmo(a, grid.levels=list(age="ab"))), 'grid.levels returned class \"character\" for age, so will use the default grid.func for age') options(warn=1) expect.err(try(plotmo(a, grid.levels=list(age=NA))), 'age in grid.levels is NA') expect.err(try(plotmo(a, grid.levels=list(age=Inf))), 'age in grid.levels is infinite') expect.err(try(plotmo(a, grid.lev=list(age=list(1,2)))), 'length(age) in grid.levels is not 1') # more-or-less repeat above, but with glm models a <- earth(survived ~ pclass+age+sibsp, data=etitanic, degree=2, glm=list(family=binomial)) print(summary(a)) plotmo(a, ylim=c(0, 1), caption="plotmo glm with mixed fac and non-fac degree2 terms") plotmo(a, ylim=c(0, 1), caption="plotmo glm with mixed fac and non-fac degree2 terms and grid.levels", grid.levels=list(pcl="2nd")) # test partial matching of variable name in grid levels plotmo(a, type="earth", ylim=c(0, 1), caption="type=\"earth\" plotmo glm with mixed fac and non-fac degree2 terms") plotmo(a, type="link", ylim=c(0, 1), clip=FALSE, caption="type=\"link\" plotmo glm with mixed fac and non-fac degree2 terms") plotmo(a, type="class", ylim=c(0, 1), caption="type=\"class\" plotmo glm with mixed fac and non-fac degree2 terms") plotmo(a, ylim=c(0, 1), caption="default type (\"response\")\nplotmo glm with mixed fac and non-fac degree2 terms") # now with different type2s set.seed(2016) plotmo(a, do.par=FALSE, type2="persp", persp.theta=-20, degree1=FALSE, grid.levels=list(pclass="2nd")) mtext("different type2s", outer=TRUE, font=2, line=1.5, cex=1) plotmo(a, do.par=FALSE, type2="contour", degree1=FALSE, grid.levels=list(pclass="2nd")) plotmo(a, do.par=FALSE, type2="image", degree1=FALSE, grid.levels=list(pclass="2nd"), col.response=as.numeric(etitanic$survived)+2, pt.pch=20) plotmo(a, do.par=FALSE, type="earth", type2="image", degree1=FALSE, grid.levels=list(pclass="2")) # grid.levels with partdep set.seed(2018) x1 <- (1:11) + runif(11) x2 <- (1:11) + runif(11) x3 <- as.integer((1:11) + runif(11)) x4 <- runif(11) > .5 # logical y <- x1 - x2 + x3 + x4 data <- data.frame(y=y, x1=x1, x2=x2, x3=x3, x4=x4) lm.x1.x2.x3 <- lm(y ~ x1 + x2 + x3 + x4 + x1*x2 + x1*x3, data=data) cat("summary(lm.x1.x2.x3):\n") print(summary(lm.x1.x2.x3)) par(mfrow = c(5, 6), mar = c(2, 3, 2, 1), mgp = c(1.5, 0.5, 0), cex = 0.6, oma=c(0,0,8,0)) plotmo(lm.x1.x2.x3, do.par=0, ylim=c(0,16), pt.col=2, caption="row1 default\nrow2 grid.levels=list(x3=15)\nrow3 partdep\nrow4 partdetp grid.levels=list(x3=15)") plotmo(lm.x1.x2.x3, do.par=0, ylim=c(0,16), pt.col=2, grid.levels=list(x3=15)) plotmo(lm.x1.x2.x3, do.par=0, ylim=c(0,16), pt.col=2, pmethod="partdep") plotmo(lm.x1.x2.x3, do.par=0, ylim=c(0,16), pt.col=2, pmethod="partdep", grid.levels=list(x3=15)) # check auto type convert in grid.levels plotmo(lm.x1.x2.x3, degree1="x1", degree2=0, main="x1 (x2=5L))", ylim=c(0,16), do.par=0, pmethod="partdep", grid.levels=list(x2=15L)) # integer to numeric plotmo(lm.x1.x2.x3, degree1="x1", degree2=0, main="x1 (x3=5))", ylim=c(0,16), do.par=0, pmethod="partdep", grid.levels=list(x3=15)) # numeric to integer plotmo(lm.x1.x2.x3, degree1="x1", degree2=0, main="x1 (x4=1))", ylim=c(0,16), do.par=0, pmethod="partdep", grid.levels=list(x4=1)) # numeric to logical expect.err(try(plotmo(lm.x1.x2.x3, degree1="x1", degree2=0, main="x1 (x4=1))", ylim=c(0,16), do.par=0, pmethod="partdep", grid.levels=list(x4="x"))), "expected a logical value in grid.levels for x4") # char to logical expect.err(try(plotmo(lm.x1.x2.x3, degree1="x2", do.par=0, pmethod="partdep", grid.levels=list(x1="1"))), "the class \"character\" of \"x1\" in grid.levels does not match its class \"numeric\" in the input data") par(org.par) # test vector main a20 <- earth(O3 ~ humidity + temp + doy, data=ozone1, degree=2, glm=list(family=Gamma)) dopar(2, 2) plotmo(a20, nrug=-1) set.seed(2016) plotmo(a20, nrug=10, caption="Test plotmo with a vector main (and npoints=200)", main=c("Humidity", "Temperature", "Day of year", "Humidity: Temperature", "Temperature: Day of Year"), col.response="darkgray", pt.pch=".", cex.response=3, npoints=200) # cex.response tests back compat cat("Expect warning below (missing double titles)\n") plotmo(a20, nrug=-1, caption="Test plotmo with a vector main (and plain smooth)", main=c("Humidity", "Temperature", "Day of year", "Humidity: Temperature", "Temp: Doy"), smooth.col="indianred") cat("Expect warning below (missing single titles)\n") plotmo(a20, nrug=-1, caption="Test plotmo with a vector main (and smooth args)", main=c("Humidity", "Temperature"), smooth.col="indianred", smooth.lwd=2, smooth.lty=2, smooth.f=.1, col.response="gray", npoints=500) plotmo(a20, nrug=-1, caption="Test plotmo with pt.pch=paste(1:nrow(ozone1))", type2="im", col.response=2, pt.cex=.8, pt.pch=paste(1:nrow(ozone1)), npoints=100) aflip <- earth(O3~vh + wind + humidity + temp, data=ozone1, degree=2) # test all1 and all2, with and without degree1 and degree2 plotmo(aflip, all2=T, caption="all2=T", npoints=TRUE) plotmo(aflip, all2=T, degree2=c(4, 2), caption="all2=T, degree2=c(4, 2)") plotmo(aflip, all1=T, caption="all1=T") plotmo(aflip, all1=T, degree1=c(3,1), degree2=NA, caption="all1=T, degree1=c(3,1), degree2=NA") options(warn=2) expect.err(try(plotmo(aflip, no.such.arg=9)), "(converted from warning) predict.earth ignored argument 'no.such.arg'") expect.err(try(plotmo(aflip, ycolumn=1)), "(converted from warning) predict.earth ignored argument 'ycolumn'") expect.err(try(plotmo(aflip, title="abc")), "(converted from warning) predict.earth ignored argument 'title'") expect.err(try(plotmo(aflip, persp.ticktype="d", persp.ntick=3, tic=3, tick=9)), "(converted from warning) predict.earth ignored argument 'tic'") expect.err(try(plotmo(aflip, persp.ticktype="d", ntick=3, tic=3)), "(converted from warning) predict.earth ignored argument 'ntick'") options(warn=1) # expect.err(try(plotmo(aflip, adj1=8, adj2=9))) # Error : plotmo: illegal argument "adj1" # expect.err(try(plotmo(aflip, yc=8, x2=9))) # "ycolumn" is no longer legal, use "nresponse" instead # expect.err(try(plotmo(aflip, persp.ticktype="d", ntick=3, ti=3))) # Error : "title" is illegal, use "caption" instead ("ti" taken to mean "title") # expect.err(try(plotmo(aflip, persp.ticktype="d", ntick=3, title=3))) # Error : "title" is illegal, use "caption" instead # expect.err(try(plotmo(aflip, persp.ticktype="d", ntick=3, tit=3, titl=7))) # Error : "title" is illegal, use "caption" instead ("tit" taken to mean "title") # expect.err(try(plotmo(aflip, zlab="abc"))) # "zlab" is illegal, use "ylab" instead # expect.err(try(plotmo(aflip, z="abc"))) # "zlab" is illegal, use "ylab" instead ("z" taken to mean "zlab") expect.err(try(plotmo(aflip, degree1=c(4,1))), "'degree1' is out of range, allowed values are 1 to 2") # expect.err(try(plotmo(aflip, none.such=TRUE))) # illegal argument "all1" # expect.err(try(plotmo(aflip, ntick=3, type2="im"))) # the ntick argument is illegal for type2="image" # expect.err(try(plotmo(aflip, breaks=3, type2="persp"))) # the breaks argument is illegal for type2="persp" # expect.err(try(plotmo(aflip, breaks=99, type2="cont"))) # the breaks argument is illegal for type2="contour" # Test error handling when accessing the original data lm.bad <- lm.fit(as.matrix(ozone1[,-1]), as.matrix(ozone1[,1])) expect.err(try(plotmo(lm.bad)), "'lm.bad' is a plain list, not an S3 model") expect.err(try(plotmo(99)), "'99' is not an S3 model") x <- matrix(c(1,3,2,4,5,6,7,8,9,10, 2,3,4,5,6,7,8,9,8,9), ncol=2) colnames(x) <- c("c1", "c2") x1 <- x[,1] x2 <- x[,2] y <- 3:12 df <- data.frame(y=y, x1=x1, x2=x2) foo1 <- function() { a.foo1 <- lm(y~x1+x2, model=FALSE) x1 <- NULL expect.err(try(plotmo(a.foo1)), "cannot get the original model predictors") } foo1() foo2 <- function() { a.foo2 <- lm(y~x1+x2, data=df, model=FALSE) df <- 99 # note that df <- NULL here will not cause an error msg y <- 99 # also needed else model.frame in plotmo will find the global y expect.err(try(plotmo(a.foo2)), "cannot get the original model predictors") } foo2() foo3 <- function() { a.foo3 <- lm(y~x) # lm() builds an lm model for which predict doesn't work expect.err(try(plotmo(a.foo3)), "predict returned the wrong length (got 10 but expected 50)") } foo3() foo3a <- function() { a.foo3a <- lm(y~x) # lm() builds an lm model for which predict doesn't work # this tests "ngrid1 <- ngrid1 + 1" in plotmo.R expect.err(try(plotmo(a.foo3a, ngrid1=nrow(x))), "predict returned the wrong length (got 10 but expected 11)") } foo3a() foo4 <- function() { a.foo4 <- lm(y~x[,1]+x[,2]) # builds an lm model for which predict doesn't work # causes 'newdata' had 8 rows but variables found have 10 rows expect.err(try(plotmo(a.foo4)), "predict returned the wrong length (got 10 but expected 50)") } foo4() foo5 <- function() { a.foo5 <- lm(y~x1+x2, model=FALSE) x1 <- c(1,2,3) # causes Error in model.frame.default: variable lengths differ (found for 'x1') expect.err(try(plotmo(a.foo5)), "cannot get the original model predictors") } foo5() foo6 <- function() { a.foo6 <- lm(y~x1+x2, model=FALSE) y[1] <- NA # Error in na.fail.default: missing values in object expect.err(try(plotmo(a.foo6, col.response=3)), "cannot get the original model predictors") } foo6() foo7 <- function() { a.foo7 <- lm(y~x1+x2, model=FALSE) y[1] <- Inf options <- options("warn") on.exit(options(warn=options$warn)) options(warn=2) expect.err(try(plotmo(a.foo7, col.response=3)), "non-finite values returned by plotmo_y") } foo7() options(warn=1) foo8 <- function() { i <- 1 a.foo8 <- lm(y~x[,i]+x[,2]) options <- options("warn") on.exit(options(warn=options$warn)) options(warn=2) expect.err(try(plotmo(a.foo8)), "Cannot determine which variables to plot in degree2 plots (use all2=TRUE?)") options(warn=options$warn) expect.err(try(plotmo(a.foo8)), "predict returned the wrong length (got 10 but expected 50)") } foo8() options(warn=1) foo9 <- function() { my.list <- list(j=2) a.foo9 <- lm(y~x[,1]+x[,my.list$j]) expect.err(try(plotmo(a.foo9)), "cannot get the original model predictors") } foo9() foo9a <- function() { df <- data.frame(y=y, x1=x[,1], x2=x[,2]) a.foo9a <- lm(y~x1+x2, data=df) par(mfrow = c(2, 2), oma=c(0,0,4,0)) set.seed(2018) plotmo(a.foo9a, col.resp=2, do.par=FALSE, caption="top two plots should be identical to bottom two plots") x2 <- rep(99, length(x2)) a.foo9b <- lm(y~x1+x2, data=df) x2 <- rep(199, length(x2)) plotmo(a.foo9b, col.resp=2, do.par=FALSE) } foo9a() par(org.par) foo20.func <- function() { par(mfrow = c(2, 2), oma=c(0,0,4,0)) foo20 <- lm(y~x1+x2) set.seed(2018) plotmo(foo20, degree1=1:2, col.resp=2, do.par=FALSE, caption="top two plots should be identical to bottom two plots\nbecause we use saved lm$model") x1 <- 99 plotmo(foo20, degree1=1:2, col.resp=2, do.par=FALSE) } foo20.func() par(org.par) set.seed(1235) tit <- etitanic tit <- tit[c(30:80,330:380,630:680), ] a <- earth(survived~., data=tit, glm=list(family=binomial), degree=2) plotmo(a, grid.levels=list(sex="ma"), caption="smooth: survived, sex=\"m\" jitter=1", smooth.col="indianred", smooth.lwd=2, col.response=as.numeric(tit$survived)+2, pt.pch=".", type2="im", pt.cex=3, jitter=1) # big jitter set.seed(1238) a <- earth(pclass~., data=tit) plotmo(a, type="class", nresponse=1, grid.levels=list(sex="ma"), caption="smooth: pclass, sex=\"m\"", SHOWCALL=TRUE, smooth.col="indianred", smooth.lwd=2, col.response=as.numeric(tit$pclass)+1, type2="im", pt.pch=".", pt.cex=3) plotmo(a, type="class", nresponse=1, grid.levels=list(sex="ma"), caption="smooth: pclass, sex=\"m\" jitter=.3", SHOWCALL=TRUE, smooth.col="indianred", smooth.lwd=2, col.response=as.numeric(tit$pclass)+1, type2="im", pt.pch="x", jit=.3) # small jitter plotmo(a, nresponse=1, type="class", grid.levels=list(sex="ma"), caption="smooth: pclass, sex=\"m\"", SHOWCALL=TRUE, smooth.col="indianred", smooth.lwd=2, col.response=as.numeric(tit$pclass)+1, type2="im", pt.pch=paste(1:nrow(tit))) # test the extend argument plotmo(a, nresponse=1, pt.col=2, degree2=0, SHOWCALL=TRUE, caption="test extend: extend=0 (reference plot)") plotmo(a, nresponse=1, extend=.5, pt.col=2, SHOWCALL=TRUE, caption="test extend: extend=.5") plotmo(a, nresponse=1, degree1=0, extend=.2, pt.col=2, SHOWCALL=TRUE) # nothing to plot a <- earth(survived~pclass+age, data=etitanic, degree=2) # expect warning: extend=.5 not degree2 plots plotmo(a, extend=.5, pt.col=2, SHOWCALL=TRUE, caption="test extend: extend=.5") # intercept only models dopar(2, 2, caption = "intercept-only models") set.seed(1) x <- 1:10 y <- runif(length(x)) earth.intercept.only <- earth(x, y) plotmo(earth.intercept.only, do.par=FALSE, main="earth intercept-only model") plotmo(earth.intercept.only, do.par=FALSE, col.response=1, pt.pch=20) # TODO following draws a plot but it shouldn't (very minor bug because int-only model with a bad degree1 spec) plotmo(earth.intercept.only, do.par=FALSE, degree1=3) # expect warning: 'degree1' specified but no degree1 plots plotmo(earth.intercept.only, do.par=FALSE, degree1=0) # expect warning: plotmo: nothing to plot library(rpart) rpart.intercept.only <- rpart(y~x) plotmo(rpart.intercept.only, do.par=FALSE, main="rpart.plot intercept-only model") plotmo(rpart.intercept.only, do.par=FALSE, degree1=0) par(org.par) # nrug argument par(mfrow=c(3,3), mar=c(3,3,3,1), mgp=c(1.5, 0.5, 0)) mod.nrug <- earth(survived~age, data=etitanic) set.seed(2016) plotmo(mod.nrug, do.par=0, nrug=-1, main="nrug=-1") plotmo(mod.nrug, do.par=0, nrug=TRUE, main="nrug=TRUE") plotmo(mod.nrug, do.par=0, nrug=10, rug.col=2, main="nrug=10, rug.col=2") plotmo(mod.nrug, do.par=0, nrug=5, rug.col=2, rug.lwd=2, main="nrug=5, rug.col=2, rug.lwd=2") plotmo(mod.nrug, do.par=0, nrug="density", main="nrug=\"density\"") plotmo(mod.nrug, do.par=0, nrug="density", density.col=2, density.lwd=2, main="nrug=\"density\"\ndensity.col=2, density.lwd=2") plotmo(mod.nrug, do.par=0, nrug="density", density.adj=.2, density.col=1, main="nrug=\"density\"\ndensity.adj=.2, density.col=1") par(org.par) # a <- earth(ozone1[,3]~ozone1[,1]+ozone1[,2]+ozone1[,4]+ozone1[,5]+ozone1[,6], data=ozone1) # # TODO fails: actual.nrows=330 expected.nrows=50 fitted.nrows=330 # plotmo(a) # # TODO following fails in plotmo with # # Error : get.earth.x from model.matrix.earth from predict.earth: x has 2 columns, expected 4 to match: 1 2 3 Girth # a <- earth(Volume~poly(Height, degree=3)+Girth, data=trees, subset=4:23, linpreds=TRUE) # plotmo(a, trace=-1, do.par=FALSE, caption="all three rows should be the same") source("test.epilog.R") plotmo/inst/slowtests/test.mlr.bat0000755000176200001440000000142315124635472017064 0ustar liggesusers@rem test.mlr.bat: mlr tests for plotmo and plotres @echo test.mlr.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.mlr.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.mlr.Rout: @echo. @tail test.mlr.Rout @echo test.mlr.R @exit /B 1 :good1 mks.diff test.mlr.Rout test.mlr.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.mlr.save.ps @exit /B 1 :good2 @rem test.mlr.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.mlr.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.mlr.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/test.parsnip.Rout.save0000644000176200001440000010667415124641074021074 0ustar liggesusers> # test.parsnip.R: test the parsnip package with earth and other models > # Stephen Milborrow Sep 2020 Petaluma > > source("test.prolog.R") > options(warn=1) # print warnings as they occur > library(earth) Loading required package: Formula Loading required package: plotmo Loading required package: plotrix > cat("loading parsnip libraries\n") # these libraries take several seconds to load loading parsnip libraries > library(tidymodels, quietly=TRUE, verbose=FALSE) ── Attaching packages ────────────────────────────────────── tidymodels 1.4.1 ── ✔ broom 1.0.11 ✔ recipes 1.3.1 ✔ dials 1.4.2 ✔ rsample 1.3.1 ✔ dplyr 1.1.4 ✔ tailor 0.1.0 ✔ ggplot2 4.0.1 ✔ tidyr 1.3.2 ✔ infer 1.1.0 ✔ tune 2.0.1 ✔ modeldata 1.5.1 ✔ workflows 1.3.0 ✔ parsnip 1.4.0 ✔ workflowsets 1.1.1 ✔ purrr 1.2.0 ✔ yardstick 1.3.2 ── Conflicts ───────────────────────────────────────── tidymodels_conflicts() ── ✖ purrr::discard() masks scales::discard() ✖ dplyr::filter() masks stats::filter() ✖ dplyr::lag() masks stats::lag() ✖ recipes::step() masks stats::step() > library(timetk) > library(lubridate) Attaching package: 'lubridate' The following objects are masked from 'package:base': date, intersect, setdiff, union > cat("loaded parsnip libraries\n") loaded parsnip libraries > cat("parsnip version:", as.character(packageVersion("parsnip")[[1]]), "\n") parsnip version: 1.4.0 > > vdata <- data.frame( + resp = 1:23, + bool = c(F, F, F, F, F, T, T, T, T, T, T, T, T, F, F, T, T, T, T, T, T, T, T), + ord = ordered(c("ORD1", "ORD1", "ORD1", + "ORD1", "ORD1", "ORD1", + "ORD1", "ORD3", "ORD1", + "ORD2", "ORD2", "ORD2", "ORD2", + "ORD2", "ORD2", "ORD2", + "ORD3", "ORD3", "ORD3", + "ORD2", "ORD2", "ORD2", "ORD2"), + levels=c("ORD1", "ORD3", "ORD2")), + fac = as.factor(c("FAC1", "FAC1", "FAC1", + "FAC2", "FAC2", "FAC2", + "FAC3", "FAC1", "FAC1", + "FAC1", "FAC2", "FAC2", "FAC2", + "FAC2", "FAC2", "FAC2", + "FAC3", "FAC3", "FAC3", + "FAC1", "FAC3", "FAC3", "FAC3")), + str = c("STR1", "STR1", "STR1", # WILL BE TREATED LIKE A FACTOR + "STR1", "STR1", "STR1", + "STR2", "STR2", "STR2", + "STR3", "STR3", "STR2", "STR3", + "STR2", "STR3", "STR2", + "STR3", "STR3", "STR3", + "STR3", "STR3", "STR3", "STR3"), + num = c(1, 9, 2, 3, 14, 5, 6, 4, 5, 6.5, 3, 6, 5, + 3, 4, 5, 6, 4, 5, 16.5, 3, 16, 15), + sqrt_num = sqrt( + c(1, 9, 2, 3, 14, 5, 6, 4, 5, 6.5, 3, 6, 5, + 3, 4, 5, 6, 4, 5, 16.5, 3, 16, 15)), + int = c(1L, 1L, 3L, 3L, 4L, 4L, 3L, 5L, 3L, 6L, 7L, 8L, 10L, + 13L, 14L, 3L, 13L, 5L, 13L, 16L, 17L, 18L, 11L), + date = as.Date( + c("2018-08-01", "2018-08-02", "2018-08-03", + "2018-08-04", "2018-08-05", "2018-08-06", + "2018-08-07", "2018-08-08", "2018-08-08", + "2018-08-10", "2018-08-10", "2018-08-11", "2018-08-11", + "2018-08-11", "2018-08-12", "2018-08-13", + "2018-08-10", "2018-08-15", "2018-08-17", + "2018-08-04", "2018-08-19", "2018-08-03", "2018-08-18")), + date_num = as.numeric(as.Date( + c("2018-08-01", "2018-08-02", "2018-08-03", + "2018-08-04", "2018-08-05", "2018-08-06", + "2018-08-07", "2018-08-08", "2018-08-08", + "2018-08-10", "2018-08-10", "2018-08-11", "2018-08-11", + "2018-08-11", "2018-08-12", "2018-08-13", + "2018-08-10", "2018-08-15", "2018-08-17", + "2018-08-04", "2018-08-19", "2018-08-03", "2018-08-18")))) > > set.seed(2020) > splits <- initial_time_split(vdata, prop=.9) > > #--- lm ---------------------------------------------------------------------- > > lm1 <- lm(resp~num+fac:int+date+ord+str, data=training(splits)) > cat("lm1:\n") lm1: > print(summary(lm1)) Call: lm(formula = resp ~ num + fac:int + date + ord + str, data = training(splits)) Residuals: Min 1Q Median 3Q Max -3.9119 -0.6559 -0.0438 0.7549 3.1946 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -1.396e+04 5.559e+03 -2.511 0.0309 * num 1.818e-01 1.883e-01 0.966 0.3571 date 7.867e-01 3.132e-01 2.512 0.0308 * ord.L 1.254e+00 2.009e+00 0.624 0.5465 ord.Q 3.783e-01 1.910e+00 0.198 0.8470 strSTR2 5.801e-01 2.381e+00 0.244 0.8124 strSTR3 3.341e-01 3.136e+00 0.107 0.9173 facFAC1:int 6.908e-01 3.066e-01 2.253 0.0479 * facFAC2:int 2.891e-01 2.116e-01 1.366 0.2018 facFAC3:int 5.818e-01 2.621e-01 2.220 0.0507 . --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 2.341 on 10 degrees of freedom Multiple R-squared: 0.9176, Adjusted R-squared: 0.8435 F-statistic: 12.38 on 9 and 10 DF, p-value: 0.0002531 > set.seed(2020) > lmpar <- linear_reg(mode = "regression") %>% + set_engine("lm") %>% + fit(resp~num+fac:int+date+ord+str, data = training(splits)) > stopifnot(identical(lm1$coeff, lmpar$fit$coeff)) > > predict.lm1 <- predict(lm1, testing(splits)) > predict.lmpar <- lmpar %>% predict(testing(splits)) > stopifnot(all(predict.lm1 == predict.lmpar)) > > par(mfrow = c(3, 3), mar = c(3, 3, 3, 1), mgp = c(1.5, 0.5, 0)) > plotmo(lm1, do.par=2, SHOWCALL=TRUE) plotmo grid: num fac int date ord str 5 FAC2 5 2018-08-09 ORD1 STR3 > plotres(lm1, which=c(3,1), do.par=FALSE) > plotmo(lmpar, do.par=2, SHOWCALL=TRUE) plotmo grid: num fac int date ord str 5 FAC2 5 2018-08-09 ORD1 STR3 > plotres(lmpar, which=c(3,1), do.par=FALSE) > plotmo(lmpar$fit, do.par=2, SHOWCALL=TRUE) plotmo grid: num fac int date ord str 5 FAC2 5 2018-08-09 ORD1 STR3 > plotres(lmpar$fit, which=c(3,1), do.par=FALSE) > par(org.par) > > lmpar.sqrtnum <- linear_reg(mode = "regression") %>% + set_engine("lm") %>% + fit(resp~sqrt(num), data = training(splits)) > #$$ TODO > # expect.err(try(plotmo(lmpar.sqrtnum)), > # "cannot get the original model predictors") > > #--- earth ------------------------------------------------------------------- > > # note that sqrt(num) is ok, unlike parsnip models for lm and rpart > earth1 <- earth(resp~sqrt(num)+int+ord:bool+fac+str+date, degree=2, + data=training(splits), pmethod="none") > cat("earth1:\n") earth1: > print(summary(earth1)) Call: earth(formula=resp~sqrt(num)+int+ord:bool+fac+str+date, data=training(splits), pmethod="none", degree=2) coefficients (Intercept) 7.86702 ordORD2:boolTRUE -0.81733 h(5-int) 0.46965 h(int-5) 2587.95933 h(17751-date) -1.23206 h(date-17751) 1.48020 h(int-5) * facFAC2 -0.35097 h(int-5) * date -0.14573 Selected 8 of 8 terms, and 4 of 13 predictors (pmethod="none") Termination condition: GRSq -Inf at 8 terms Importance: int, date, facFAC2, ordORD2:boolTRUE, sqrt(num)-unused, ... Number of terms at each degree of interaction: 1 5 2 GCV 19.29495 RSS 2.170681 GRSq 0.47628 RSq 0.9967358 > set.seed(2020) > earthpar <- mars(mode = "regression", prune_method="none", prod_degree=2) %>% + set_engine("earth") %>% + fit(resp~sqrt(num)+int+ord:bool+fac+str+date, data = training(splits)) > cat("earthpar:\n") earthpar: > print(earthpar) parsnip model object Selected 8 of 8 terms, and 4 of 13 predictors (pmethod="none") Termination condition: GRSq -Inf at 8 terms Importance: int, date, facFAC2, ordORD2:boolTRUE, sqrt(num)-unused, ... Number of terms at each degree of interaction: 1 5 2 GCV 19.29495 RSS 2.170681 GRSq 0.47628 RSq 0.9967358 > cat("summary(earthpar$fit)\n") summary(earthpar$fit) > print(summary(earthpar$fit)) Call: earth(formula=resp~sqrt(num)+int+ord:bool+fac+str+date, data=data, pmethod=~"none", keepxy=TRUE, degree=~2) coefficients (Intercept) 7.86702 ordORD2:boolTRUE -0.81733 h(5-int) 0.46965 h(int-5) 2587.95933 h(17751-date) -1.23206 h(date-17751) 1.48020 h(int-5) * facFAC2 -0.35097 h(int-5) * date -0.14573 Selected 8 of 8 terms, and 4 of 13 predictors (pmethod="none") Termination condition: GRSq -Inf at 8 terms Importance: int, date, facFAC2, ordORD2:boolTRUE, sqrt(num)-unused, ... Number of terms at each degree of interaction: 1 5 2 GCV 19.29495 RSS 2.170681 GRSq 0.47628 RSq 0.9967358 > stopifnot(identical(earth1$coeff, earthpar$fit$coeff)) > > predict.earth1 <- predict(earth1, testing(splits)) > predict.earthpar <- earthpar %>% predict(testing(splits)) > stopifnot(all(predict.earth1 == predict.earthpar)) > > par(mfrow = c(3, 3), mar = c(3, 3, 3, 1), mgp = c(1.5, 0.5, 0)) > plotmo(earth1, do.par=2, pt.col=3, SHOWCALL=TRUE) plotmo grid: num int ord bool fac str date 5 5 ORD1 TRUE FAC2 STR3 2018-08-09 > set.seed(2020) > plotres(earth1, which=c(1,3), do.par=FALSE, pt.col=3, legend.pos="topleft") > par(org.par) > > par(mfrow = c(3, 3), mar = c(3, 3, 3, 1), mgp = c(1.5, 0.5, 0)) > plotmo(earthpar, do.par=2, pt.col=3, SHOWCALL=TRUE) plotmo grid: num int ord bool fac str date 5 5 ORD1 TRUE FAC2 STR3 2018-08-09 > set.seed(2020) > plotres(earthpar, which=c(1,3), do.par=FALSE, pt.col=3, legend.pos="topleft") > par(org.par) > > par(mfrow = c(3, 3), mar = c(3, 3, 3, 1), mgp = c(1.5, 0.5, 0)) > plotmo(earthpar$fit, do.par=2, pt.col=3, SHOWCALL=TRUE) plotmo grid: num int ord bool fac str date 5 5 ORD1 TRUE FAC2 STR3 2018-08-09 > set.seed(2020) > plotres(earthpar$fit, which=c(1,3), do.par=FALSE, pt.col=3, legend.pos="topleft") > par(org.par) > > #--- rpart ------------------------------------------------------------------- > > library(rpart) Attaching package: 'rpart' The following object is masked from 'package:dials': prune > library(rpart.plot) > rpart1 <- rpart(resp~num+fac+int+date+ord+str, data=training(splits), + control=rpart.control(minsplit=1, cp=.0001)) > cat("\nrpart.rules(rpart1)\n") rpart.rules(rpart1) > print(rpart.rules(rpart1)) resp 1 when ord is ORD1 & date < 17748 & num < 5.0 & int < 2 2 when ord is ORD1 & date < 17748 & num >= 5.0 & int < 2 3 when ord is ORD1 & date < 17748 & num < 2.5 & int >= 2 4 when ord is ORD1 & date < 17748 & num >= 2.5 & int >= 2 5 when ord is ORD1 & date >= 17748 & num >= 10.0 & fac is FAC2 or FAC3 6 when ord is ORD1 & date >= 17748 & num < 5.5 & fac is FAC2 or FAC3 7 when ord is ORD1 & date >= 17748 & num is 5.5 to 10.0 & fac is FAC2 or FAC3 9 when ord is ORD1 & date >= 17748 & fac is FAC1 14 when ord is ORD3 or ORD2 > > set.seed(2020) > # TODO note need of model=TRUE below (needed only for further processing with e.g. plotmo) > rpartpar <- decision_tree(mode = "regression", min_n=1, cost_complexity=.0001) %>% + set_engine("rpart", model=TRUE) %>% + fit(resp~num+fac+int+date+ord+str, data = training(splits)) > cat("\nrpart.rules(rpartpar$fit)\n") rpart.rules(rpartpar$fit) > print(rpart.rules(rpartpar$fit)) resp 1 when ord is ORD1 & date < 17748 & num < 5.0 & int < 2 2 when ord is ORD1 & date < 17748 & num >= 5.0 & int < 2 3 when ord is ORD1 & date < 17748 & num < 2.5 & int >= 2 4 when ord is ORD1 & date < 17748 & num >= 2.5 & int >= 2 5 when ord is ORD1 & date >= 17748 & num >= 10.0 & fac is FAC2 or FAC3 6 when ord is ORD1 & date >= 17748 & num < 5.5 & fac is FAC2 or FAC3 7 when ord is ORD1 & date >= 17748 & num is 5.5 to 10.0 & fac is FAC2 or FAC3 9 when ord is ORD1 & date >= 17748 & fac is FAC1 14 when ord is ORD3 or ORD2 > > predict.rpart1 <- predict(rpart1, testing(splits)) > predict.rpartpar <- rpartpar %>% predict(testing(splits)) > stopifnot(all(predict.rpart1 == predict.rpartpar)) > > par(mfrow = c(3, 3), mar = c(3, 3, 3, 1), mgp = c(1.5, 0.5, 0)) > plotmo(rpart1, do.par=2, SHOWCALL=TRUE, trace=0) plotmo grid: num fac int date ord str 5 FAC2 5 2018-08-09 ORD1 STR3 > plotres(rpart1, which=c(3,1), do.par=FALSE) > plotmo(rpartpar, do.par=2, SHOWCALL=TRUE, trace=0) plotmo grid: num fac int date ord str 5 FAC2 5 2018-08-09 ORD1 STR3 > plotres(rpartpar, which=c(3,1), do.par=FALSE) > plotmo(rpartpar$fit, do.par=2, SHOWCALL=TRUE) plotmo grid: num fac int date ord str 5 FAC2 5 2018-08-09 ORD1 STR3 > plotres(rpartpar$fit, which=c(3,1), do.par=FALSE) > par(org.par) > > # TODO note that this differs from the above rpart model in that we don't use model=TRUE > rpartpar.nosavemodel <- decision_tree(mode = "regression", min_n=1, cost_complexity=.0001) %>% + set_engine("rpart") %>% + fit(resp~num+fac+int+date+str, data = training(splits)) > > cat("\nrpart.rules(rpartpar.nosavemodel$fit)\n") rpart.rules(rpartpar.nosavemodel$fit) > options(warn=2) > expect.err(try(rpart.rules(rpartpar.nosavemodel$fit)), + "Cannot retrieve the data used to build the model") Error : (converted from warning) Cannot retrieve the data used to build the model (so cannot determine roundint and is.binary for the variables). To silence this warning: Call rpart.rules with roundint=FALSE, or rebuild the rpart model with model=TRUE. Got expected error from try(rpart.rules(rpartpar.nosavemodel$fit)) > options(warn=1) > expect.err(try(plotmo(rpartpar.nosavemodel)), + "Cannot plot parsnip rpart model: need model=TRUE in call to rpart") Error : Cannot plot parsnip rpart model: need model=TRUE in call to rpart Do it like this: set_engine("rpart", model=TRUE) Got expected error from try(plotmo(rpartpar.nosavemodel)) > > rpart.sqrtnum <- decision_tree(mode = "regression", min_n=1, cost_complexity=.0001) %>% + set_engine("rpart", model=TRUE) %>% + fit(resp~sqrt(num)+fac+int+date+ord+str, data = training(splits)) > cat("\nrpart.rules(rpart.sqrtnum$fit)\n") rpart.rules(rpart.sqrtnum$fit) > print(rpart.rules(rpart.sqrtnum$fit)) # ok resp 1 when ord is ORD1 & date < 17748 & sqrt(num) < 2.0 & int < 2 2 when ord is ORD1 & date < 17748 & sqrt(num) >= 2.0 & int < 2 3 when ord is ORD1 & date < 17748 & sqrt(num) < 1.6 & int >= 2 4 when ord is ORD1 & date < 17748 & sqrt(num) >= 1.6 & int >= 2 5 when ord is ORD1 & date >= 17748 & sqrt(num) >= 3.1 & fac is FAC2 or FAC3 6 when ord is ORD1 & date >= 17748 & sqrt(num) < 2.3 & fac is FAC2 or FAC3 7 when ord is ORD1 & date >= 17748 & sqrt(num) is 2.3 to 3.1 & fac is FAC2 or FAC3 9 when ord is ORD1 & date >= 17748 & fac is FAC1 14 when ord is ORD3 or ORD2 > #$$ TODO > # expect.err(try(plotmo(rpart.sqrtnum)), > # "cannot get the original model predictors") > > #----------------------------------------------------------------------------------- > # Test fix for github bug report https://github.com/tidymodels/parsnip/issues/341 > # (fixed Sep 2020) > > cat("===m750a first example===\n") ===m750a first example=== > set.seed(2020) > m750a <- m4_monthly %>% + filter(id == "M750") %>% + select(-id) > print(m750a) # a tibble # A tibble: 306 × 2 date value 1 1990-01-01 6370 2 1990-02-01 6430 3 1990-03-01 6520 4 1990-04-01 6580 5 1990-05-01 6620 6 1990-06-01 6690 7 1990-07-01 6000 8 1990-08-01 5450 9 1990-09-01 6480 10 1990-10-01 6820 # ℹ 296 more rows > set.seed(2020) > splits_a <- initial_time_split(m750a, prop = 0.9) > earth_m750a <- earth(log(value) ~ as.numeric(date) + month(date, label = TRUE), data = training(splits_a), degree=2) > print(summary(earth_m750a)) Call: earth(formula=log(value)~as.numeric(date)+month(date,label=TRUE), data=training(splits_a), degree=2) coefficients (Intercept) 1.000000e+01 h(as.numeric(date)-7639) 0.000000e+00 h(as.numeric(date)-9100) 0.000000e+00 h(12022-as.numeric(date)) 0.000000e+00 h(as.numeric(date)-13483) 0.000000e+00 h(as.numeric(date)-14579) 0.000000e+00 h(0.370142-month(date, label = TRUE)^7) 0.000000e+00 h(month(date, label = TRUE)^7-0.370142) 0.000000e+00 h(month(date, label = TRUE)^10-0.491049) -3.077492e+12 h(as.numeric(date)-9100) * h(-0.254544-month(date, label = TRUE)^8) 0.000000e+00 h(as.numeric(date)-13483) * h(month(date, label = TRUE)^11- -0.392904) 0.000000e+00 h(as.numeric(date)-13483) * h(-0.392904-month(date, label = TRUE)^11) 0.000000e+00 h(0.491049-month(date, label = TRUE)^10) * h(month(date, label = TRUE)^11-0.065484) 0.000000e+00 h(0.491049-month(date, label = TRUE)^10) * h(0.065484-month(date, label = TRUE)^11) 0.000000e+00 Selected 14 of 17 terms, and 5 of 12 predictors Termination condition: RSq changed by less than 0.001 at 17 terms Importance: as.numeric(date), month(date, label = TRUE)^10, ... Number of terms at each degree of interaction: 1 8 5 GCV 0.0004725457 RSS 0.1002179 GRSq 0.9834104 RSq 0.9871125 > set.seed(2020) > model_m750a <- mars(mode = "regression", prod_degree=2) %>% + set_engine("earth") %>% + fit(log(value) ~ as.numeric(date) + month(date, label = TRUE), data = training(splits_a)) > print(summary(model_m750a$fit)) Call: earth(formula=log(value)~as.numeric(date)+month(date,label=TRUE), data=data, keepxy=TRUE, degree=~2) coefficients (Intercept) 1.000000e+01 h(as.numeric(date)-7639) 0.000000e+00 h(as.numeric(date)-9100) 0.000000e+00 h(12022-as.numeric(date)) 0.000000e+00 h(as.numeric(date)-13483) 0.000000e+00 h(as.numeric(date)-14579) 0.000000e+00 h(0.370142-month(date, label = TRUE)^7) 0.000000e+00 h(month(date, label = TRUE)^7-0.370142) 0.000000e+00 h(month(date, label = TRUE)^10-0.491049) -3.077492e+12 h(as.numeric(date)-9100) * h(-0.254544-month(date, label = TRUE)^8) 0.000000e+00 h(as.numeric(date)-13483) * h(month(date, label = TRUE)^11- -0.392904) 0.000000e+00 h(as.numeric(date)-13483) * h(-0.392904-month(date, label = TRUE)^11) 0.000000e+00 h(0.491049-month(date, label = TRUE)^10) * h(month(date, label = TRUE)^11-0.065484) 0.000000e+00 h(0.491049-month(date, label = TRUE)^10) * h(0.065484-month(date, label = TRUE)^11) 0.000000e+00 Selected 14 of 17 terms, and 5 of 12 predictors Termination condition: RSq changed by less than 0.001 at 17 terms Importance: as.numeric(date), month(date, label = TRUE)^10, ... Number of terms at each degree of interaction: 1 8 5 GCV 0.0004725457 RSS 0.1002179 GRSq 0.9834104 RSq 0.9871125 > stopifnot(identical(earth_m750a$coeff, model_m750a$fit$coeff)) > predict_earth_m750a <- predict(earth_m750a, newdata=testing(splits_a)[1:3,]) > predict_m750a <- model_m750a %>% predict(testing(splits_a)[1:3,]) > stopifnot(max(c(9.238049628, 9.240535151, 9.232361834) - predict_m750a) < 1e-8) > stopifnot(max(predict_earth_m750a - predict_m750a) < 1e-20) > > par(mfrow = c(2, 2), mar = c(3, 3, 3, 1), mgp = c(1.5, 0.5, 0)) > set.seed(2020) > plotmo(model_m750a, trace=2, do.par=FALSE, pt.col="green", main="model_m750a", SHOWCALL=TRUE) plotmo trace 2: plotmo(object=model_m750a, pt.col="green", do.par=FALSE, trace=2, main="model_m750a", SHOWCALL=TRUE) --get.model.env for object with class _earth plotmo parsnip model: will plot model_m750a$fit, not 'model_m750a' itself object call is earth(formula=log(value)~as.numeric(date)+month(date, label=TRUE), data=data, keepxy=TRUE, degree=~2) using the environment saved in $terms of the earth model: env(data, weights) --plotmo_prolog for _earth object 'model_m750a' --plotmo_x for earth object get.object.x: object$x is NULL (and it has no colnames) object call is earth(formula=log(value)~as.numeric(date)+month(date, label=TRUE), data=data,... get.x.from.model.frame: formula(object) is log(value) ~ as.numeric(date) + month(date, label = TRUE) naked formula is log(value) ~ date formula is valid, now looking for data for the model.frame object$model is NULL (and it has no colnames) object$data is usable and has column names date value na.action(object) is "na.fail" stats::model.frame(log(value) ~ date, data=object$data, na.action="na.fail") x=model.frame[,-1] is usable and has column name date plotmo_x returned[275,1]: date 1 1990-01-01 2 1990-02-01 3 1990-03-01 ... 1990-04-01 275 2012-11-01 ----Metadata: plotmo_predict with nresponse=NULL and newdata=NULL calling predict.earth with NULL newdata stats::predict(earth.object, NULL, type="response") predict returned[275,1]: log(value) 1 8.779940 2 8.777069 3 8.795003 ... 8.799953 275 9.244442 predict after processing with nresponse=NULL is [275,1]: log(value) 1 8.779940 2 8.777069 3 8.795003 ... 8.799953 275 9.244442 ----Metadata: plotmo_fitted with nresponse=NULL stats::fitted(object=earth.object) fitted(object) returned[275,1]: log(value) 1 8.779940 2 8.777069 3 8.795003 ... 8.799953 275 9.244442 fitted(object) after processing with nresponse=NULL is [275,1]: log(value) 1 8.779940 2 8.777069 3 8.795003 ... 8.799953 275 9.244442 ----Metadata: plotmo_y with nresponse=NULL --plotmo_y with nresponse=NULL for earth object get.object.y: object$y is usable and has column name log(value) plotmo_y returned[275,1]: log(value) 1 8.759355 2 8.768730 3 8.782630 ... 8.791790 275 9.271435 plotmo_y after processing with nresponse=NULL is [275,1]: log(value) 1 8.759355 2 8.768730 3 8.782630 ... 8.791790 275 9.271435 converted nresponse=NA to nresponse=1 nresponse=1 (was NA) ncol(fitted) 1 ncol(predict) 1 ncol(y) 1 ----Metadata: plotmo_y with nresponse=1 --plotmo_y with nresponse=1 for earth object get.object.y: object$y is usable and has column name log(value) got model response from object$y plotmo_y returned[275,1]: log(value) 1 8.759355 2 8.768730 3 8.782630 ... 8.791790 275 9.271435 plotmo_y after processing with nresponse=1 is [275,1]: log(value) 1 8.759355 2 8.768730 3 8.782630 ... 8.791790 275 9.271435 got response name "log(value)" from yhat resp.levs is NULL ----Metadata: done number of x values: date 275 ----plotmo_singles for earth object singles: 1 date ----plotmo_pairs for earth object no pairs ----Figuring out ylim --get.ylim.by.dummy.plots --plot.degree1(draw.plot=FALSE) degree1 plot1 (pmethod "plotmo") variable date newdata[50,1]: date 1 1990-01-01 2 1990-06-20 3 1990-12-07 ... 1991-05-26 50 2012-11-01 stats::predict(earth.object, data.frame[50,1], type="response") predict returned[50,1]: log(value) 1 8.779940 2 8.797283 3 8.835027 ... 8.843453 50 9.244442 predict after processing with nresponse=1 is [50,1]: log(value) 1 8.779940 2 8.797283 3 8.835027 ... 8.843453 50 9.244442 --done get.ylim.by.dummy.plots ylim c(8.603, 9.289) clip TRUE --plot.degree1(draw.plot=TRUE) graphics::plot.default(x=Date:1990-01-01 1990-06-20 1990-12..., y=c(8.78,8.797,8...), type="n", main="model_m750a", xlab="", ylab="", xaxt="s", yaxt="s", xlim=Date:1990-01-01 2012-11-01, ylim=c(8.603,9.289)) > set.seed(2020) > plotmo(model_m750a$fit, trace=1, do.par=FALSE, pt.col="green", main="model_m750a$fit", SHOWCALL=TRUE) stats::predict(earth.object, NULL, type="response") stats::fitted(object=earth.object) got model response from object$y > set.seed(2020) > plotmo(earth_m750a, trace=1, do.par=FALSE, pt.col="green", main="earth_m750a", SHOWCALL=TRUE) stats::predict(earth.object, NULL, type="response") stats::fitted(object=earth.object) got model response from model.frame(log(value) ~ as.numeric(date) + month..., data=call$data, na.action="na.fail") > par(org.par) > > cat("===m750a second example===\n") ===m750a second example=== > set.seed(2020) > m750b <- m4_monthly %>% + filter(id == "M750") %>% + select(-id) %>% + rename(date2 = date) > print(m750b) # tibble # A tibble: 306 × 2 date2 value 1 1990-01-01 6370 2 1990-02-01 6430 3 1990-03-01 6520 4 1990-04-01 6580 5 1990-05-01 6620 6 1990-06-01 6690 7 1990-07-01 6000 8 1990-08-01 5450 9 1990-09-01 6480 10 1990-10-01 6820 # ℹ 296 more rows > set.seed(2020) > splits_b <- initial_time_split(m750b, prop = 0.9) > set.seed(2020) > model_m750b <- mars(mode = "regression") %>% + set_engine("earth") %>% + fit(log(value) ~ as.numeric(date2) + month(date2, label = TRUE), data = training(splits_b)) > # new data that only contains the feature "date" as a predictor > future_data <- m750b %>% future_frame(date2, .length_out = "3 years") > print(future_data) # a tibble with a single column of class "Date" # A tibble: 36 × 1 date2 1 2015-07-01 2 2015-08-01 3 2015-09-01 4 2015-10-01 5 2015-11-01 6 2015-12-01 7 2016-01-01 8 2016-02-01 9 2016-03-01 10 2016-04-01 # ℹ 26 more rows > stopifnot(class(future_data[,1,drop=TRUE]) == "Date") > predict_m750a <- model_m750b %>% predict(new_data = future_data) > > par(mfrow = c(2, 2), mar = c(3, 3, 3, 1), mgp = c(1.5, 0.5, 0)) > set.seed(2020) > plotmo(model_m750b, trace=2, do.par=FALSE, pt.col="green", main="model_m750b", SHOWCALL=TRUE) plotmo trace 2: plotmo(object=model_m750b, pt.col="green", do.par=FALSE, trace=2, main="model_m750b", SHOWCALL=TRUE) --get.model.env for object with class _earth plotmo parsnip model: will plot model_m750b$fit, not 'model_m750b' itself object call is earth(formula=log(value)~as.numeric(date2)+month(date2, label=TRUE), data=data, keepxy=TRUE) using the environment saved in $terms of the earth model: env(data, weights) --plotmo_prolog for _earth object 'model_m750b' --plotmo_x for earth object get.object.x: object$x is NULL (and it has no colnames) object call is earth(formula=log(value)~as.numeric(date2)+month(date2, label=TRUE), data=dat... get.x.from.model.frame: formula(object) is log(value) ~ as.numeric(date2) + month(date2, label = TRUE) naked formula is log(value) ~ date2 formula is valid, now looking for data for the model.frame object$model is NULL (and it has no colnames) object$data is usable and has column names date2 value na.action(object) is "na.fail" stats::model.frame(log(value) ~ date2, data=object$data, na.action="na.fail") x=model.frame[,-1] is usable and has column name date2 plotmo_x returned[275,1]: date2 1 1990-01-01 2 1990-02-01 3 1990-03-01 ... 1990-04-01 275 2012-11-01 ----Metadata: plotmo_predict with nresponse=NULL and newdata=NULL calling predict.earth with NULL newdata stats::predict(earth.object, NULL, type="response") predict returned[275,1]: log(value) 1 8.773349 2 8.779320 3 8.797022 ... 8.803553 275 9.243245 predict after processing with nresponse=NULL is [275,1]: log(value) 1 8.773349 2 8.779320 3 8.797022 ... 8.803553 275 9.243245 ----Metadata: plotmo_fitted with nresponse=NULL stats::fitted(object=earth.object) fitted(object) returned[275,1]: log(value) 1 8.773349 2 8.779320 3 8.797022 ... 8.803553 275 9.243245 fitted(object) after processing with nresponse=NULL is [275,1]: log(value) 1 8.773349 2 8.779320 3 8.797022 ... 8.803553 275 9.243245 ----Metadata: plotmo_y with nresponse=NULL --plotmo_y with nresponse=NULL for earth object get.object.y: object$y is usable and has column name log(value) plotmo_y returned[275,1]: log(value) 1 8.759355 2 8.768730 3 8.782630 ... 8.791790 275 9.271435 plotmo_y after processing with nresponse=NULL is [275,1]: log(value) 1 8.759355 2 8.768730 3 8.782630 ... 8.791790 275 9.271435 converted nresponse=NA to nresponse=1 nresponse=1 (was NA) ncol(fitted) 1 ncol(predict) 1 ncol(y) 1 ----Metadata: plotmo_y with nresponse=1 --plotmo_y with nresponse=1 for earth object get.object.y: object$y is usable and has column name log(value) got model response from object$y plotmo_y returned[275,1]: log(value) 1 8.759355 2 8.768730 3 8.782630 ... 8.791790 275 9.271435 plotmo_y after processing with nresponse=1 is [275,1]: log(value) 1 8.759355 2 8.768730 3 8.782630 ... 8.791790 275 9.271435 got response name "log(value)" from yhat resp.levs is NULL ----Metadata: done number of x values: date2 275 ----plotmo_singles for earth object singles: 1 date2 ----plotmo_pairs for earth object no pairs ----Figuring out ylim --get.ylim.by.dummy.plots --plot.degree1(draw.plot=FALSE) degree1 plot1 (pmethod "plotmo") variable date2 newdata[50,1]: date2 1 1990-01-01 2 1990-06-20 3 1990-12-07 ... 1991-05-26 50 2012-11-01 stats::predict(earth.object, data.frame[50,1], type="response") predict returned[50,1]: log(value) 1 8.773349 2 8.797894 3 8.831375 ... 8.848941 50 9.243245 predict after processing with nresponse=1 is [50,1]: log(value) 1 8.773349 2 8.797894 3 8.831375 ... 8.848941 50 9.243245 --done get.ylim.by.dummy.plots ylim c(8.603, 9.289) clip TRUE --plot.degree1(draw.plot=TRUE) graphics::plot.default(x=Date:1990-01-01 1990-06-20 1990-12..., y=c(8.773,8.798,8...), type="n", main="model_m750b", xlab="", ylab="", xaxt="s", yaxt="s", xlim=Date:1990-01-01 2012-11-01, ylim=c(8.603,9.289)) > set.seed(2020) > plotmo(model_m750b$fit, trace=1, do.par=FALSE, pt.col="green", main="model_m750b$fit", SHOWCALL=TRUE) stats::predict(earth.object, NULL, type="response") stats::fitted(object=earth.object) got model response from object$y > par(org.par) > > #----------------------------------------------------------------------------------- > # multiple response earth model > > data(etitanic) > > etit <- etitanic > etit$survived <- factor(ifelse(etitanic$survived == 1, "yes", "no"), + levels = c("yes", "no")) > etit$notsurvived <- factor(ifelse(etitanic$survived == 0, "notsurvived", "survived"), + levels = c("notsurvived", "survived")) > set.seed(2020) > earth_tworesp <- earth(survived + notsurvived ~ ., data=etit, degree=2) > print(summary(earth_tworesp)) Call: earth(formula=survived+notsurvived~., data=etit, degree=2) survived notsurvived (Intercept) 0.03829050 0.96170950 pclass3rd 0.81545352 -0.81545352 sexmale 0.57003496 -0.57003496 h(age-32) 0.00471938 -0.00471938 pclass2nd * sexmale 0.26568920 -0.26568920 pclass3rd * sexmale -0.19310203 0.19310203 pclass3rd * h(4-sibsp) -0.10222181 0.10222181 sexmale * h(16-age) -0.04505232 0.04505232 Selected 8 of 17 terms, and 5 of 6 predictors Termination condition: Reached nk 21 Importance: sexmale, pclass3rd, pclass2nd, age, sibsp, parch-unused Number of terms at each degree of interaction: 1 3 4 GCV RSS GRSq RSq survived 0.1404529 141.7629 0.4197106 0.4389834 notsurvived 0.1404529 141.7629 0.4197106 0.4389834 All 0.2809057 283.5258 0.4197106 0.4389834 > > # TODO following commented out because parsnip (version 0.1.5) says "'+' not meaningful for factors" > # set.seed(2020) > # mars_tworesp <- mars(mode = "regression", prod_degree=2) %>% > # set_engine("earth") %>% > # fit(survived + notsurvived~., data=etit) > # print(summary(mars_tworesp)) > # print(summary(mars_tworesp$fit)) > # > # stopifnot(identical(earth_tworesp$coeff, mars_tworesp$fit$coeff)) > # > # predict.earth_tworesp <- predict(earth_tworesp, etit[3:6,]) > # predict.mars_tworesp <- mars_tworesp %>% predict(etit[3:6,]) > # stopifnot(all(predict.earth_tworesp == predict.mars_tworesp)) > # > # plotmo(earth_tworesp, trace=0, nresponse=1, SHOWCALL=TRUE) > # plotmo(mars_tworesp, trace=0, nresponse=1, SHOWCALL=TRUE) > # plotmo(mars_tworesp, trace=0, nresponse=2, SHOWCALL=TRUE) > > source("test.epilog.R") plotmo/inst/slowtests/test.non.earth.R0000644000176200001440000007155313740162254017624 0ustar liggesusers# test.non.earth.R: test plotmo on non-earth models # Stephen Milborrow, Basley KwaZulu-Natal Mar 2011 source("test.prolog.R") library(plotmo) library(earth) data(ozone1) data(etitanic) dopar <- function(nrows, ncols, caption = "") { cat(" ", caption, "\n") par(mfrow=c(nrows, ncols)) par(oma = c(0, 0, 3, 0)) par(mar = c(3, 3, 1.7, 0.5)) par(mgp = c(1.6, 0.6, 0)) par(cex = 0.7) } caption <- "test lm(log(doy) ~ vh+wind+humidity+temp+log(ibh), data=ozone1)" dopar(4,5,caption) a <- lm(log(doy) ~ vh + wind + humidity + temp + log(ibh), data=ozone1) set.seed(2020) plotmo(a, do.par=FALSE, caption=caption, ylim=NA, col.response=3, pt.pch=20, smooth.col="indianred", trace=2) termplot(a) par(org.par) caption <- "test lm(log(doy) ~ vh+wind+humidity+I(wind*humidity)+temp+log(ibh), data=ozone1)" dopar(4,5,caption) a <- lm(log(doy) ~ vh + wind + humidity + temp + log(ibh), data=ozone1) set.seed(2020) plotmo(a, do.par=FALSE, caption=caption, ylim=NA, col.resp=3, pt.pch=20, clip=FALSE, smooth.col="indianred") termplot(a) par(org.par) caption <- "test lm(doy ~ (vh+wind+humidity)^2, data=ozone1)" dopar(4,3,caption) a <- lm(doy ~ (vh+wind+humidity)^2, data=ozone1) plotmo(a, do.par=FALSE, caption=caption, ylim=NULL) # termplot(a) # termplot fails with Error in `[.data.frame`(mf, , i): undefined columns selected par(org.par) caption <- "test lm(doy^2 ~ vh+wind+humidity+I(wind*humidity)+temp+log(ibh), data=ozone1)" dopar(4,3,caption) a <- lm(doy^2 ~ vh+wind+humidity+I(wind*humidity)+temp+log(ibh), data=ozone1) plotmo(a, do.par=FALSE, caption=caption, ylim=NULL) termplot(a) # termplot draws a funky second wind plot par(org.par) caption <- "test lm with data=ozone versus attach(ozone)" dopar(4,3,caption) a <- lm(log(doy) ~ I(vh*wind) + wind + I(humidity*temp) + log(ibh), data=ozone1) plotmo(a, do.par=FALSE, caption=caption, degree1=c(1,2,4,5)) attach(ozone1) a <- lm(log(doy) ~ I(vh*wind) + wind + I(humidity*temp) + log(ibh)) plotmo(a, do.par=FALSE, degree1=c(1,2,4,5)) detach(ozone1) par(org.par) # commented out because "$" in names is not yet supported # a <- lm(log(ozone1$doy) ~ I(ozone1$vh*ozone1$wind) + log(ozone1$ibh)) # plotmo(a) set.seed(1) caption <- "test lm and glm a900..a902: damage~temp family=binomial data=orings" dopar(2,3,caption) library(faraway) data(orings) a900 <- lm(I(damage/6) ~ temp, data=orings) plotmo(a900, do.par=FALSE, caption=caption, col.response=2, nrug=-1, main="lm(damage/6~temp)", smooth.col="indianred", trace=0) response <- cbind(orings$damage, 6-orings$damage) a901 <- glm(response ~ temp, family="binomial", data=orings) set.seed(2020) plotmo(a901, do.par=FALSE, col.response=2, nrug=-1, main="glm(response~temp)", smooth.col="indianred", trace=2) a902 <- glm(cbind(damage, 6-damage)~temp, family="binomial", data=orings) set.seed(2020) plotmo(a902, do.par=FALSE, col.response=2, nrug=TRUE, main="glm(cbind(damage,6-damage)~temp)", trace=0) termplot(a902, main="termplot") plotmo(a902, type="link", main="type=\"link\"", do.par=F) set.seed(2020) plotmo(a902, type="response", main="type=\"response\"", col.response=2, do.par=F) par(org.par) set.seed(1) caption <- "test glm(lot2~log(u),data=clotting,family=Gamma)" dopar(2,2,caption) u = c(5,10,15,20,30,40,60,80,100) lota = c(118,58,42,35,27,25,21,19,18) clotting <- data.frame(u = u, lota = lota) a <- glm(lota ~ log(u), data=clotting, family=Gamma) set.seed(2020) plotmo(a, do.par=FALSE, caption=caption, col.response=3, clip=FALSE, nrug=-1) termplot(a) plotmo(a, type="link", caption=paste("type=\"link\"", caption)) par(org.par) if(length(grep("package:gam", search()))) detach("package:gam") library(mgcv) set.seed(1) caption <- "test plot.gam, with mgcv::gam(y ~ s(x) + s(x,z)) with response and func (and extra image plot)" dopar(3,2,caption) par(mar = c(3, 5, 1.7, 0.5)) # more space for left and bottom axis test1 <- function(x,sx=0.3,sz=0.4) (pi**sx*sz)*(1.2*exp(-(x[,1]-0.2)^2/sx^2-(x[,2]-0.3)^2/sz^2)+ 0.8*exp(-(x[,1]-0.7)^2/sx^2-(x[,2]-0.8)^2/sz^2)) n <- 100 set.seed(1) x <- runif(n); z1 <- runif(n); y <- test1(cbind(x,z1)) + rnorm(n) * 0.1 a <- gam(y ~ s(x) + s(x,z1)) set.seed(2020) plotmo(a, do.par=FALSE, type2="contour", caption=caption, col.response=3, smooth.col="indianred", func=test1, func.col="indianred", func.lwd=5, func.lty=2, smooth.lwd=3) plotmo(a, do.par=FALSE, degree1=F, degree2=1, type2="image", ylim=NA) plot(a, select=1) plot(a, select=2) plot(a, select=3) n<-400 sig<-2 set.seed(1) x0 <- runif(n, 0, 1) x1 <- runif(n, 0, 1) x2 <- runif(n, 0, 1) x3 <- runif(n, 0, 1) f0 <- function(x) 2 * sin(pi * x) f1 <- function(x) exp(2 * x) f2 <- function(x) 0.2*x^11*(10*(1-x))^6+10*(10*x)^3*(1-x)^10 f <- f0(x0) + f1(x1) + f2(x2) e <- rnorm(n, 0, sig) y <- f + e test.func <- function(x) f0(x[,1]) + f1(x[,2]) + f2(x[,3]) library(mgcv) caption <- "test mgcv::gam(y~s(x0,x1,k=12)+s(x2)+s(x3,k=20,fx=20)) (and extra persp plot)" dopar(3,3,caption) a <- gam(y~s(x0,x1,k=12)+s(x2)+s(x3,k=20,fx=20)) plot(a, select=2) plot(a, select=3) plot(a, select=1) plotmo(a, do.par=FALSE, type2="contour", caption=caption, xlab=NULL, main="", func=test.func, ngrid2=10, contour.drawlabels=FALSE) plotmo(a, do.par=FALSE, degree1=F, degree2=1, persp.the=-35) par(org.par) set.seed(1) caption <- "test plot.gam, with mgcv::gam(doy~s(wind)+s(humidity,wind)+s(vh)+temp,data=ozone1)" dopar(3,3,caption) a <- gam(doy ~ s(wind) + s(humidity,wind) + s(vh) + temp, data=ozone1) plotmo(a, do.par=FALSE, caption=caption, type2="contour", degree1=c("wind","vh"), swapxy=T, xlab=NULL, main="", clip=FALSE) plot(a, select=1) plot(a, select=3) plot(a, select=2) plot(a, select=4) par(org.par) detach("package:mgcv") library(gam) caption <- "test gam:gam(Ozone^(1/3)~lo(Solar.R)+lo(Wind, Temp),data=airquality)" set.seed(1) dopar(3,2,caption) data(airquality) airquality <- na.omit(airquality) # plotmo doesn't know how to deal with NAs yet a <- gam(Ozone^(1/3) ~ lo(Solar.R) + lo(Wind, Temp), data = airquality) set.seed(2020) plotmo(a, do.par=FALSE, caption=caption, ylim=NA, col.response=3) # termplot gives fishy looking wind plot, plotmo looks ok # termplot(a) #TODO this fails with R2.5: dim(data) <- dim: attempt to set an attribute on NULL detach("package:gam") par(org.par) library(mda) caption <- "test mars and earth (expect not a close match)" dopar(6,3,caption) a <- mars( ozone1[, -1], ozone1[,1], degree=2) b <- earth(ozone1[, -1], ozone1[,1], degree=2) # this also tests trace=2 on a non formula model plotmo(a, do.par=FALSE, caption=caption, trace=2) plotmo(b, do.par=FALSE) par(org.par) caption <- "test mars and mars.to.earth(mars) (expect no degree2 for mars)" dopar(6,3,caption) a <- mars(ozone1[, -1], ozone1[,1], degree=2) b <- mars.to.earth(a) plotmo(a, do.par=FALSE, caption=caption, ylim=NA) plotmo(b, do.par=FALSE, ylim=NA) par(org.par) # check fix for bug reported by Martin Maechler: # form <- Volume ~ .; a <- earth(form, data = trees); plotmo(a) fails dopar(4,4, "test f <- O3 ~ .; a <- earth(f, data=ozone1)") fa <- log(O3) ~ . a <- earth(fa, data=ozone1, degree=2) print(summary(a)) plot(a, do.par=FALSE) set.seed(2020) plotmo(a, do.par=FALSE, degree1=2:3, degree2=c(1,2), col.response = "pink", smooth.col="indianred") a <- lm(log(doy) ~ I(vh*wind) + I(humidity*temp) + log(ibh), data=ozone1) plotmo(a, do.par=FALSE, degree1=1:2) fa <- log(doy) ~ I(vh*wind) + I(humidity*temp) + log(ibh) a <- lm(fa, data=ozone1) plotmo(a, do.par=FALSE, degree1=1:2) par(org.par) # test inverse.func and func caption <- "test inverse.func=exp" a <- lm(log(Volume) ~ Girth + Height + I(Girth*Height), data=trees) my.func <- function(x) -60 + 5 * x[,1] + x[,2] / 3 set.seed(2020) plotmo(a, caption=caption, inverse.func = exp, col.response = "pink", func=my.func, func.col="gray", ngrid1=1000, type2="p", smooth.col="indianred") par(org.par) # se testing caption = "level=.95, lm(doy~., data=ozone1) versus termplot" dopar(6,3,caption) a <- lm(doy~., data=ozone1) plotmo(a, level=.95, do.par=FALSE, caption=caption) termplot(a, se=2) par(org.par) caption <- "test different se options, level=.95, lm(log(doy)~vh+wind+log(humidity),data=ozone1)" dopar(4,3,caption) a <- lm(log(doy) ~ vh + wind + log(humidity), data=ozone1) plotmo(a, do.par=FALSE, caption=caption, ylim=NA, level=.95) plotmo(a, do.par=FALSE, caption=caption, ylim=NA, level=.95, level.shade="pink", level.shade2=3) plotmo(a, do.par=FALSE, caption=caption, ylim=NA, level=.95, level.shade=3) plotmo(a, do.par=FALSE, caption=caption, ylim=NULL, level=.95, level.shade=3) par(org.par) caption <- "test level=.95, lm(log(doy)~vh+wind+log(humidity),data=ozone1)" dopar(2,3,caption) a <- lm(log(doy) ~ vh + wind + log(humidity), data=ozone1) plotmo(a, do.par=FALSE, caption=caption, ylim=NA, level=.95) termplot(a, se=2) par(org.par) caption <- "test level=.95 and inverse.func, lm(log(doy)~vh+wind+log(humidity),data=ozone1)" dopar(3,3,caption) a <- lm(log(doy) ~ vh + wind + log(humidity), data=ozone1) plotmo(a, do.par=FALSE, caption=caption, ylim=NA, level=.95) plotmo(a, do.par=FALSE, caption=caption, ylim=NULL, level=.95, inverse.func=exp) termplot(a, se=2) par(org.par) caption <- "test level=.95, glm(lot2~log(u),data=clotting,family=Gamma)" set.seed(1) dopar(2,2,caption) u = c(5,10,15,20,30,40,60,80,100) lota = c(118,58,42,35,27,25,21,19,18) clotting <- data.frame(u = u, lota = lota) a <- glm(lota ~ log(u), data=clotting, family=Gamma) set.seed(2020) plotmo(a, do.par=FALSE, caption=caption, col.response=4, pt.pch=7, clip=FALSE, nrug=-1, level=.95, smooth.col="indianred") termplot(a, se=2) par(org.par) if(length(grep("package:gam", search()))) detach("package:gam") library(mgcv) set.seed(1) caption <- "test level=.95, plot.gam, with mgcv::gam(y ~ s(x) + s(x,z1)) with response and func (and extra image plot)" dopar(3,2,caption) par(mar = c(3, 5, 1.7, 0.5)) # more space for left and bottom axis test1 <- function(x,sx=0.3,sz=0.4) (pi**sx*sz)*(1.2*exp(-(x[,1]-0.2)^2/sx^2-(x[,2]-0.3)^2/sz^2)+ 0.8*exp(-(x[,1]-0.7)^2/sx^2-(x[,2]-0.8)^2/sz^2)) n <- 100 set.seed(1) x <- runif(n); z1 <- runif(n); y <- test1(cbind(x,z1)) + rnorm(n) * 0.1 a <- gam(y ~ s(x) + s(x,z1)) set.seed(2020) plotmo(a, do.par=FALSE, type2="contour", caption=caption, col.response=3, func=test1, func.col="magenta", level=.95) plotmo(a, do.par=FALSE, degree1=F, degree2=1, type2="image", image.col=topo.colors(10), ylim=NA, level=.95, main="topo.colors") plot(a, select=1) plot(a, select=2) plot(a, select=3) par(org.par) # TODO Following commented out because it causes: # Error: gam objects in the "gam" package do not support confidence intervals on new data # detach("package:mgcv") # library(gam) # set.seed(1) # caption <- "test level=.95, gam:gam(Ozone^(1/3)~lo(Solar.R)+lo(Wind, Temp),data=airquality)" # dopar(3,2,caption) # data(airquality) # airquality <- na.omit(airquality) # plotmo doesn't know how to deal with NAs yet # a <- gam(Ozone^(1/3) ~ lo(Solar.R) + lo(Wind, Temp), data = airquality) # set.seed(2020) # plotmo(a, do.par=FALSE, caption=caption, ylim=NA, col.response=3, level=.95) # # termplot(a) #TODO this fails with R2.5: dim(data) <- dim: attempt to set an attribute on NULL # detach("package:gam") # par(org.par) # test factors by changing wind to a factor ozone2 <- ozone1 ozone2[,"wind"] <- factor(ozone2[,"wind"], labels=c( "wind0", "wind2", "wind3", "wind4", "wind5", "wind6", "wind7", "wind8", "wind9", "wind10", "wind11")) # commented out because factors are not yet supported by plotmo.earth # caption <- "test wind=factor, earth(O3 ~ ., data=ozone2)" # a <- earth(doy ~ ., data=ozone2) # set.seed(1) # dopar(4,3,caption) # set.seed(2020) # plotmo(a, col.response="gray", level=.95, nrug=-1, do.par=FALSE, caption=caption) # termplot(a) # par(org.par) caption <- "test wind=factor, lm(doy ~ vh + wind + I(humidity*temp) + log(ibh), data=ozone2)" a <- lm(doy ~ vh + wind + I(humidity*temp) + log(ibh), data=ozone2) set.seed(1) dopar(4,3,caption) plotmo(a, col.response="gray", level=.95, nrug=-1, do.par=FALSE, caption=caption, smooth.col="indianred") termplot(a, se=2) par(org.par) caption <- "test level options" dopar(2,2,caption) plotmo(a, do.par=FALSE, degree1=2, degree2=FALSE, level=.95, level.shade=0, caption=caption) plotmo(a, do.par=FALSE, degree1=2, degree2=FALSE, level=.95, level.shade="orange") plotmo(a, do.par=FALSE, degree1=2, degree2=FALSE, level=.95, level.shade2=0) par(org.par) caption <- "test wind=factor, glm(y ~ i + j, family=poisson())" y <- c(18,17,15,20,10,20,25,13,12) i <- gl(3,1,9) j <- gl(3,3) a <- glm(y ~ i + j, family=poisson()) set.seed(1) dopar(2,2,caption) plotmo(a, do.par=F, level=.95, nrug=1, caption=caption) termplot(a, se=1, rug=T) par(org.par) if(length(grep("package:gam", search()))) detach("package:gam") caption <- "test wind=factor, gam(doy ~ vh + wind + s(humidity) + s(vh) + temp, data=ozone2)" library(mgcv) a <- gam(doy ~ vh + wind + s(humidity) + s(vh) + temp, data=ozone2) plotmo(a, level=.95, caption=caption) caption <- "test wind=factor, clip=TRUE, gam(doy ~ vh + wind + s(humidity) + s(vh) + temp, data=ozone2)" plotmo(a, level=.95, caption=caption, clip=FALSE) # termplot doesn't work here so code commented out # dopar(3,3,caption) # plotmo(a, do.par=FALSE) # termplot(a) par(org.par) # test lda and qda, and also col.response, pt.pch, and jitter library(MASS) etitanic2 <- etitanic etitanic2$pclass <- as.numeric(etitanic$pclass) etitanic2$sex <- as.numeric(etitanic$sex) etitanic2$sibsp <- NULL etitanic2$parch <- NULL lda.model <- lda(survived ~ ., data=etitanic2) set.seed(7) plotmo(lda.model, caption="lda", clip=F, col.response=as.numeric(etitanic2$survived)+2, type="posterior", nresponse=1, smooth.col="indianred", all2=TRUE, type2="image") set.seed(8) plotmo(lda.model, caption="lda with no jitter", clip=F, col.response=as.numeric(etitanic2$survived)+2, type="posterior", nresponse=1, all2=TRUE, type2="image", jitter=0) qda.model <- qda(survived ~ ., data=etitanic2) set.seed(9) plotmo(qda.model, caption="qda", clip=F, col.response=as.numeric(etitanic2$survived)+2, type="post", nresponse=2, smooth.col="indianred", all2=TRUE, type2="image", jitter.resp=.6, pch.resp=20) # test plotmo.y from the 2nd argument of the model function (non-formula interface) lcush <- data.frame(Type=as.numeric(Cushings$Type), log(Cushings[,1:2]))[1:21,] a <- qda(lcush[,2:3], lcush[,1]) set.seed(2020) plotmo(a, type="class", all2=TRUE, caption= "plotmo.y from 2nd argument of call (qda)", type2="contour", ngrid2=100, contour.nlevels=2, contour.drawlabels=FALSE, col.response=as.numeric(lcush$Type)+1, pt.pch=as.character(lcush$Type)) par(org.par) # # example from MASS (works, but removed because unnecessary test) # predplot <- function(object, main="", len = 100, ...) # { # plot(Cushings[,1], Cushings[,2], log="xy", type="n", # xlab = "Tetrahydrocortisone", ylab = "Pregnanetriol", main = main) # for(il in 1:4) { # set <- Cushings$Type==levels(Cushings$Type)[il] # text(Cushings[set, 1], Cushings[set, 2], # labels=as.character(Cushings$Type[set]), col = 2 + il) } # xp <- seq(0.6, 4.0, length=len) # yp <- seq(-3.25, 2.45, length=len) # cushT <- expand.grid(Tetrahydrocortisone = xp, # Pregnanetriol = yp) # Z <- predict(object, cushT, ...); zp <- as.numeric(Z$class) # zp <- Z$post[,3] - pmax(Z$post[,2], Z$post[,1]) # contour(exp(xp), exp(yp), matrix(zp, len), # add = TRUE, levels = 0, labex = 0) # zp <- Z$post[,1] - pmax(Z$post[,2], Z$post[,3]) # contour(exp(xp), exp(yp), matrix(zp, len), # add = TRUE, levels = 0, labex = 0) # invisible() # } # par(mfrow=c(2,2)) # cush <- log(as.matrix(Cushings[, -3])) # tp <- Cushings$Type[1:21, drop = TRUE] # set.seed(203) # cush.data <- data.frame(tp, cush[1:21,]) # a <- qda(tp~., data=cush.data) # predplot(a, "QDA example from MASS") # set.seed(2020) # plotmo(a, type="class", all2=TRUE, type2="contour", degree1=NA, do.par=FALSE, # col.response=as.numeric(cush.data$tp)+1) # set.seed(2020) # plotmo(a, type="class", all2=TRUE, type2="contour", degree1=NA, do.par=FALSE, # col.response=as.numeric(cush.data$tp)+1, drawlabels=F, nlevels=2) # set.seed(2020) # plotmo(a, type="class", all2=TRUE, type2="contour", degree1=NA, do.par=FALSE, # col.response=as.numeric(cush.data$tp)+1, drawlabels=F, nlevels=2, ngrid2=100) # par(org.par) library(rpart) data(kyphosis) # kyphosis data, earth model a <- earth(Kyphosis ~ ., data=kyphosis, degree=2, glm=list(family=binomial)) cat("summary(a): (Kyphosis)\n") print(summary(a)) par(mfrow=c(3, 3)) par(mar=c(3, 3, 2, .5)) # small margins to pack figs in set.seed(9) # for jitter set.seed(2020) plotmo(a, do.par=F, type2="image", col.response=ifelse(kyphosis$Kyphosis=="present", "red", "lightblue"), clip=F) plotmo(a, do.par=F, clip=F, degree1=0) par(org.par) # kyphosis data, rpart models (also test ngrid2) fit1 <- rpart(Kyphosis ~ ., data=kyphosis) plotres(fit1, SHOWCALL=TRUE) par(mfrow=c(3, 3)) par(mar=c(.5, 0.5, 2, .5), mgp = c(1.6, 0.6, 0)) # b l t r small margins to pack figs in library(rpart.plot) prp(fit1, main="rpart kyphosis\nno prior") plotmo(fit1, degree1=NA, do.par=F, main="", persp.theta=220, nresponse=2) par(mar=c(4, 4, 2, .5)) set.seed(2020) plotmo(fit1, nresp=2, degree1=FALSE, do.par=F, main="", type2="image", # test default type="prob" col.response=ifelse(kyphosis$Kyphosis=="present", "red", "lightblue"), pt.pch=ifelse(kyphosis$Kyphosis=="present", "p", "a"), image.col=gray(10:4/10), ngrid2=30) par(mar=c(.5, 0.5, 2, .5)) # b l t r small margins to pack figs in plotmo(fit1, type="class", degree1=NA, do.par=F, main="type=\"class\"") # with type="prob" and response has two columns, # nresponse should automatically default to column 2 plotmo(fit1, type="prob", degree1=0, do.par=F, main="type=\"prob\"", clip=F, ngrid2=50, persp.border=NA, trace=1) set.seed(2020) plotmo(fit1, type="prob", nresp=2, degree1=NA, do.par=F, main="", type2="image", col.response=ifelse(kyphosis$Kyphosis=="present", "red", "lightblue"), pt.pch=20, image.col=gray(10:4/10), ngrid2=5) # better rpart model with prior fit2 <- rpart(Kyphosis ~ ., data=kyphosis, parms=list(prior=c(.65,.35))) prp(fit2, main="rpart kyphosis\nwith prior, better model") plotmo(fit2, type="v", degree1=NA, do.par=F, main="", persp.theta=220, ngrid2=10) par(mar=c(4, 4, 2, .5)) set.seed(2020) plotmo(fit2, type="v", degree1=NA, do.par=F, main="", type2="image", col.response=ifelse(kyphosis$Kyphosis=="present", "red", "lightblue"), pt.pch=20, image.col=gray(10:4/10), ngrid2=100) par(org.par) plotmo(fit1, type="prob", nresponse=1, persp.border=NA, persp.col="pink", all1=TRUE, all2=TRUE, caption="plotmo rpart fit1, all1=TRUE, all2=TRUE") expect.err(try(plotmo(fit1, type="none.such1"))) # rpart model with ozone data data(ozone1) par(mfrow=c(4,4)) par(mar=c(.5, 0.5, 2, .5), cex=.6, mgp = c(1.6, 0.6, 0)) # b l t r small margins to pack figs in a1 <- rpart(O3~temp+humidity, data=ozone1) prp(a1, main="rpart model with ozone data\n(temp and humidity only)\n") plotmo(a1, do.par=F, degree1=0, main="rpart", persp.ticktype="detail", persp.nticks=2) expect.err(try(plotmo(a1, type="class"))) # compare to a linear and earth model a3 <- lm(O3~temp+humidity, data=ozone1) plotmo(a3, do.par=F, clip=F, main="lm", degree1=0, all2=TRUE, persp.ticktype="detail", persp.nticks=2) expect.err(try(plotmo(a3, type="none.such2"))) a <- earth(O3~temp+humidity, data=ozone1, degree=2) plotmo(a, do.par=F, clip=F, main="earth", degree1=NA, persp.ticktype="detail", persp.nticks=2) expect.err(try(plotmo(a, type="none.such3"))) expect.err(try(plotmo(a, type=c("abc", "def")))) par(org.par) # detailed rpart model par(mfrow=c(3,3)) a1 <- rpart(O3~., data=ozone1) prp(a1, cex=.9, main="rpart model with full ozone data") plotmo(a1, type="vector", do.par=F, degree1=NA, persp.ticktype="detail", persp.nticks=3, degree2=2:3) par(org.par) plotmo(a1, persp.border=NA, all1=TRUE, all2=TRUE, caption="plotmo rpart a1, all1=TRUE, all2=TRUE") library(tree) tree1 <- tree(O3~., data=ozone1) plotmo(tree1) plotres(tree1) # rpart data with NAs rpart.airquality <- rpart(Ozone~., data=airquality) # airquality has NAs in response and variables plotmo <- plotmo(rpart.airquality, trace=0, SHOWCALL=TRUE) print(rpart.rules(rpart.airquality)) airquality.nonaOzone <- subset(airquality, !is.na(Ozone)) # no NAs in response but NAs in variables rpart.nonaOzone <- rpart(Ozone~., data=airquality.nonaOzone) print(rpart.rules(rpart.nonaOzone)) plotmo.nonaOzone <- plotmo(rpart.nonaOzone, trace=0, SHOWCALL=TRUE) airquality.nonaOzone$Ozone <- NULL stopifnot(identical(plotmo.nonaOzone, airquality.nonaOzone)) # test xflip and yflip par(mfrow=c(4, 4)) par(mgp = c(1.6, 0.6, 0)) par(mar=c(4, 4, 2, .5)) flip.test1 <- rpart(Kyphosis ~ ., data=kyphosis) set.seed(2020) plotmo(flip.test1, type="prob", nresp=2, degree1=NA, do.par=F, main="", type2="image", col.response=ifelse(kyphosis$Kyphosis=="present", "red", "lightblue"), pt.pch=20, image.col=gray(10:4/10)) set.seed(2020) plotmo(flip.test1, type="prob", nresp=2, degree1=NA, do.par=F, main="xflip", type2="image", col.response=ifelse(kyphosis$Kyphosis=="present", "red", "lightblue"), pt.pch=20, image.col=gray(10:4/10), xflip=T) set.seed(2020) plotmo(flip.test1, type="prob", nresp=2, degree1=NA, do.par=F, main="yflip", type2="image", col.response=ifelse(kyphosis$Kyphosis=="present", "red", "lightblue"), pt.pch=20, image.col=gray(10:4/10), yflip=T) set.seed(2020) plotmo(flip.test1, type="prob", nresp=2, degree1=NA, do.par=F, main="xflip and yflip", type2="image", col.response=ifelse(kyphosis$Kyphosis=="present", "red", "lightblue"), pt.pch=20, image.col=gray(10:4/10), xflip=T, yflip=T) flip.test2 <- earth(O3~., data=ozone1, degree=2) plotmo(flip.test2, degree1=NA, degree2=2, do.par=F, main="", type2="cont") plotmo(flip.test2, degree1=NA, degree2=2, do.par=F, main="xflip", type2="cont", xflip=T) plotmo(flip.test2, degree1=NA, degree2=2, do.par=F, main="yflip", type2="cont", yflip=T) plotmo(flip.test2, degree1=NA, degree2=2, do.par=F, main="xflip and yflip", type2="cont", xflip=T, yflip=T) cat("Expect warnings: ignoring xflip=TRUE for persp plot\n") plotmo(flip.test2, degree1=NA, degree2=2, do.par=F, main="xflip and yflip", type2="persp", xflip=T, yflip=T) library(randomForest) data(etitanic) etit <- etitanic[1:300,] cat("=== rf.regression ===\n") set.seed(2016) # Expect Warning: The response has five or fewer unique values. Are you sure you want to do regression? rf.regression <- randomForest(survived~., data=etit, ntree=100, importance = FALSE) plotmo(rf.regression, trace=1) cat("=== rf.regression.importance ===\n") set.seed(2016) # Expect Warning: The response has five or fewer unique values. Are you sure you want to do regression? rf.regression.importance <- randomForest(survived~., data=etit, ntree=100, importance = TRUE) plotmo(rf.regression.importance, trace=1) etit <- etitanic[1:300,] etit$survived <- factor(ifelse(etit$survived == 1, "survived", "died"), levels = c("survived", "died")) cat("=== rf.classification ===\n") set.seed(2016) rf.classification <- randomForest(survived~., data=etit, ntree=100, importance = FALSE) plotmo(rf.classification, trace=1, type="prob", nresponse="surv", SHOWCALL=TRUE) plotmo(rf.classification, trace=1, type="prob", nresponse="died", degree2=0, SHOWCALL=TRUE) cat("=== rf.classification.importance ===\n") set.seed(2016) rf.classification.importance <- randomForest(survived~., data=etit, ntree=100, importance = TRUE) plotmo(rf.classification.importance, trace=1, type="prob", nresponse="surv", SHOWCALL=TRUE) cat("=== plotres randomForest ===\n") plotres(rf.regression) plotres(rf.regression.importance) # TODO residuals are in range 0 to 1 plotres(rf.classification, type="prob", nresponse="surv") plotres(rf.classification.importance, type="prob", nresponse="surv") #--- fda ------------------------------------------------------------------------------ par(org.par) par(mfrow=c(4,5)) par(mar = c(3, 2, 3, .1)) # b, l, t, r par(mgp = c(1.5, .5, 0)) fda.earth <- fda(Species~., data=iris, keep.fitted=TRUE, method=earth, keepxy=TRUE) fda.polyreg <- fda(Species~., data=iris, keep.fitted=TRUE, keepxy=TRUE) fda.bruto <- fda(Species~., data=iris, keep.fitted=TRUE, method=bruto) # 'fda.polyreg$fit' does not have a 'call' field or 'x' and 'y' fields expect.err(try(plotmo(fda.polyreg$fit, type="variates", nresponse=1, clip=F, do.par=F))) plot(1, main="plotmo with fda", xaxt="n", yaxt="n", xlab="", ylab="", type="n", bty="n", cex.main=1.2, xpd=NA) plotmo(fda.earth, type="variates", nresponse=1, clip=F, do.par=F) plot(1, main="plotmo with fda.earth$fit", xaxt="n", yaxt="n", xlab="", ylab="", type="n", bty="n", cex.main=1.2, xpd=NA) plotmo(fda.earth$fit, nresponse=1, clip=F, do.par=F) plot(1, main="", xaxt="n", yaxt="n", xlab="", ylab="", type="n", bty="n", cex.main=1.5, xpd=NA) plot(fda.earth) plotmo(fda.earth, clip=F, do.par=F) # default type is class plot(fda.polyreg) plotmo(fda.polyreg, type="variates", nresponse=1, clip=F, do.par=F, degree1=c(1,3,4)) plot(1, main="", xaxt="n", yaxt="n", xlab="", ylab="", type="n", bty="n", cex.main=1.5, xpd=NA) par(mfrow=c(3,3)) par(mar = c(3, 2, 3, .1)) # b, l, t, r par(mgp = c(1.5, .5, 0)) plot(fda.bruto) plotmo(fda.bruto, type="variates", nresponse=1, do.par=F) par(org.par) # neural net package # for speed we use artificial data because neuralnet is very slow on say trees library(neuralnet) n <- 20 set.seed(3) x1 <- runif(n, min=-1, max=1) x2 <- runif(n, min=-1, max=1) # x2 is noise y <- x1^2 data <- data.frame(y=y, x1=x1, x2=x2) colnames(data) <- c("y","x1", "x2") set.seed(3) nn <- neuralnet(y~x1+x2, data=data, hidden=3, rep=3) print(head(plotmo:::predict.nn(nn, rep="best", trace=TRUE))) set.seed(2020) plotmo(nn, trace=1, col.response=2, all2=TRUE, SHOWCALL=TRUE) # trace=0 below to test hushing of message "assuming "y" in the model.frame is the response, because object$terms is NULL" set.seed(2020) plotmo(nn, trace=0, col.response=2, predict.rep="best", SHOWCALL=TRUE) plotres(nn, trace=0, info=TRUE, SHOWCALL=TRUE) plotres(nn, trace=1, info=TRUE, predict.rep="best", SHOWCALL=TRUE) library(nnet) data(iris3) set.seed(301) samp <- c(sample(1:50,25), sample(51:100,25), sample(101:150,25)) ird <- data.frame(rbind(iris3[,,1], iris3[,,2], iris3[,,3]), species=factor(c(rep("seto",50), rep("vers", 50), rep("virg", 50)))) ir.nn2 <- nnet(species ~ ., data = ird, subset = samp, size = 2, rang = 0.1, decay = 5e-4, maxit = 20) plotmo(ir.nn2, nresponse=1, type="class", all2=T, degree2=2:6) plotmo(ir.nn2, nresponse=2, clip=F, all2=T, degree2=1:5) plotres(ir.nn2, nresponse=2) library(biglm) data(trees) ff <- log(Volume)~log(Girth)+log(Height) chunk1 <- trees[1:20,] chunk2 <- trees[20:31,] biglm <- biglm(ff,chunk1) biglm <- update(biglm, chunk2) plotmo(biglm, pt.col=2, SHOWCALL=TRUE) plotres(biglm, SHOWCALL=TRUE) library(adabag) data(iris) set.seed(2015) # mfinal=3 for speed during testing mod.boosting <- boosting(Species~., data=iris, mfinal=3) mod.bagging <- bagging(Species~., data=iris, mfinal=3) dopar(4, 4, caption="adabag package") plotmo(mod.boosting, nresponse=1, ylim=c(0,1), do.par=FALSE) # default type="prob" plotmo(mod.boosting, type="class", do.par=FALSE) plotmo(mod.bagging, nresponse=1, ylim=c(0,1), do.par=FALSE) plotmo(mod.bagging, nresponse=1, type="votes", do.par=FALSE) par(org.par) library(e1071) data(iris) x.iris <- subset(iris, select=-Species) y.iris <- iris$Species set.seed(2016) svm.xy <- svm(x.iris, y.iris, probability=FALSE) par(mfrow = c(3, 3), mar = c(3, 3, 3, 1), mgp = c(1.5, 0.5, 0)) expect.err(try(plotmo(svm.xy, prob=TRUE, nresponse="vers", do.par=TRUE, all2=TRUE))) # probability=FALSE in call to svm plotmo(svm.xy, decision=TRUE, nresponse="vers", do.par=FALSE, all2=TRUE, degree1=2:3, degree2=6) svm.xy <- svm(x.iris, y.iris, probability=TRUE) plotmo(svm.xy, prob=TRUE, nresponse="vers", do.par=FALSE, all2=TRUE, degree1=2:3, degree2=6) set.seed(2016) svm.form <- svm(Species ~ ., data=iris, probability=T) plotmo(svm.form, predict.p=TRUE, nresponse="vers", do.par=FALSE, all2=TRUE, degree1=2:3, degree2=6) expect.err(try(plotmo(svm.form, decision.values=TRUE, probab=TRUE))) # not both plotres(svm.form, predict.prob=TRUE, nresponse="vers", info=TRUE) plotres(svm.form, jitter=5, info=TRUE) par(org.par) source("test.epilog.R") plotmo/inst/slowtests/darlingtonia.tab0000644000176200001440000000043615126306215017757 0ustar liggesusers## leafHeight is in cm.; visited, 1 == TRUE, 0 == FALSE" leafHeight visited 67 1 84 1 49 1 70 1 77 1 77 1 66 1 65 1 53 1 57 1 18 0 38 0 16 0 69 0 34 0 45 0 45 0 42 0 64 0 38 0 32 0 33 0 29 0 43 0 48 0 83 0 32 0 58 0 34 0 39 0 29 0 46 0 36 0 37 0 30 0 25 0 50 0 20 0 59 0 45 0 20 0 14 0 plotmo/inst/slowtests/test.printcall.Rout.save0000644000176200001440000002372714563614021021403 0ustar liggesusers> # test.printcall.R > # > # TODO we don't test use of printcall in a namespace > > source("test.prolog.R") > options(warnPartialMatchArgs=FALSE) > library(plotmo) Loading required package: Formula Loading required package: plotrix > for(all in c(FALSE, TRUE)) { + for(EVAL in c(FALSE, TRUE)) { + printf("=== Test printcall with all=%s EVAL=%s ===\n", all, EVAL) + + foo30 <- function() { plotmo:::printcall(all=all) } + foo30() + + foo32 <- function(...) { plotmo:::printcall(all=all); plotmo:::printdots(..., EVAL=EVAL) } + foo32() + foo32(a=31) + + + foo34 <- function(aa=1, ...) { plotmo:::printcall(all=all); plotmo:::printdots(..., EVAL=EVAL) } + foo34() + foo34(a=31) # argname a will be expanded to aa + foo34(a=31, x=1:10, y=NULL) + foo34(a=31, y=NULL) + foo34(x=stopifnot(TRUE), y=NULL) + + foo36 <- function(aa=NULL, ...) { plotmo:::printcall(all=all); plotmo:::printdots(..., EVAL=EVAL) } + foo36() + foo36(a=NULL) + foo36(a=1) + foo36(a=1:3) + foo36(a=1:3, x=NULL) + + # check formatting of various argument types + # note that we correctly don't call stopifnot(FALSE) (which would call stop) + + foo38 <- function(aa=1:3, bb=4:6, cc=print.default, + dd=stopifnot(FALSE), + ee=function(m=1) cat(m), ff=7, ...) + { plotmo:::printcall(all=all); plotmo:::printdots(..., EVAL=EVAL) } + foo38(x=matrix(ncol=1, nrow=3)) + + list1 <- list(aa=1:3, bb=4:6, cc=print.default, + dd=stopifnot(TRUE), + ee=function(m=1) cat(m), ff=7) + + cat("list1 ", plotmo:::list.as.char(list1), "\n", sep="") + + list2 <- list(lmmod=lm(Volume~Girth, data=trees), + boolean=c(TRUE, FALSE, TRUE, TRUE, FALSE, TRUE), env=parent.frame(), + chars=c("a", "b", "c", "a", "b", "c"), + trees=trees, l=list(x=1, y="2", z=foo38)) + + cat("list2 ", plotmo:::list.as.char(list2), "\n", sep="") + + # test unnamed arguments + + foo40 <- function(aa, ...) { plotmo:::printcall(all=all); plotmo:::printdots(..., EVAL=EVAL) } + foo40() + foo40(aa=b, c) + foo40(b, c) + + # test printcall when called in an S3 method + + foo.s3 <- function(a=NULL, ...) { UseMethod("foo.s3") } + foo.s3.list <- function(a=NULL, ...) { + cat("in foo.s3.list: "); plotmo:::printcall(all=all) + plotmo:::printdots(..., EVAL=EVAL) + } + foo.s3.default <- function(a=NULL, ...) { + cat("in foo.s3.default: "); plotmo:::printcall(all=all) + plotmo:::printdots(..., EVAL=EVAL) + } + foo.s3(a=list(m=1, n=2)) + foo.s3(a=NULL) + foo.s3(a=list(m=1, n=2, o=3, p=4, q=5, r=6, s=7, t=8, u=9), b=30) + + # test formatting with long argument list + + foo46 <- function(mmmmmmmmmmm=1000, nnnnnnnnnnn=2000, ooooooooooo=3000, ppppppppppp=4000, + qqqqqqqqqqq=5000, rrrrrrrrrrr=6000, sssssssssss=7000, ttttttttttt=8000, + uuuuuuuuuuu=9000, vvvvvvvvvvv=1000, wwwwwwwwwww=2000, xxxxxxxxxxx=3000, + ...) { plotmo:::printcall(all=all); plotmo:::printdots(..., EVAL=EVAL) } + foo46(a=30) + + # test call.as.char + + foo47 <- function(aa=1, ...) { s <- plotmo:::call.as.char(all=all); cat(s, "\n", sep="") } + foo47(b=30) + + # create a variable named foo48 in foo48 + foo48 <- function(aa=1, ...) { foo48 <- 99; s <- plotmo:::call.as.char(all=all); cat(s, "\n", sep="") } + foo48(b=30) + + # Note that the following doesn't do what you might expect. + # The calling function is print(), not foo50() as you may expecty. + + foo50 <- function(...) { print(plotmo:::call.as.char(all=all)) } + foo50(a=1) + } + } === Test printcall with all=FALSE EVAL=FALSE === foo30() foo32() foo32 dots: no dots foo32(a=31) foo32 dots: a=31 foo34() foo34 dots: no dots foo34(aa=31) foo34 dots: no dots foo34(aa=31, x=1:10, y=NULL) foo34 dots: x=..1, y=..2 foo34(aa=31, y=NULL) foo34 dots: y=..1 foo34(x=stopifnot(TRUE), y=NULL) foo34 dots: x=..1, y=..2 foo36() foo36 dots: no dots foo36(aa=NULL) foo36 dots: no dots foo36(aa=1) foo36 dots: no dots foo36(aa=1:3) foo36 dots: no dots foo36(aa=1:3, x=NULL) foo36 dots: x=..1 foo38(x=matrix(ncol=1,nrow=3)) foo38 dots: x=..1 list1 aa=c(1,2,3), bb=c(4,5,6), cc=function.object, dd=NULL, ee=function.object, ff=7 list2 lmmod=lm.object, boolean=c(TRUE,FALSE,TR...), env=R_GlobalEnv, chars=c("a","b","c","...), trees=data.frame[31,3], l=list(x=1, y="2", z=function.object) foo40() foo40 dots: no dots foo40(aa=b, c) foo40 dots: ..1 foo40(aa=b, c) foo40 dots: ..1 in foo.s3.list: foo.s3.list(a=list(m=1,n=2)) foo.s3.list dots: no dots in foo.s3.default: foo.s3.default(a=NULL) foo.s3.default dots: no dots in foo.s3.list: foo.s3.list(a=list(m=1,n=2,o=3,p=4,q=5,r=6,s=7,t=8,u=9), b=30) foo.s3.list dots: b=30 foo46(a=30) foo46 dots: a=30 foo47(b=30) foo48(b=30) [1] "print(x=plotmo:::call.as.char(all=all))" attr(,"fname") [1] "print" === Test printcall with all=FALSE EVAL=TRUE === foo30() foo32() foo32 dots: no dots foo32(a=31) foo32 dots: a=31 foo34() foo34 dots: no dots foo34(aa=31) foo34 dots: no dots foo34(aa=31, x=1:10, y=NULL) foo34 dots: x=c(1,2,3,4,5,6,7...), y=NULL foo34(aa=31, y=NULL) foo34 dots: y=NULL foo34(x=stopifnot(TRUE), y=NULL) foo34 dots: x=NULL, y=NULL foo36() foo36 dots: no dots foo36(aa=NULL) foo36 dots: no dots foo36(aa=1) foo36 dots: no dots foo36(aa=1:3) foo36 dots: no dots foo36(aa=1:3, x=NULL) foo36 dots: x=NULL foo38(x=matrix(ncol=1,nrow=3)) foo38 dots: x=c(NA,NA,NA) list1 aa=c(1,2,3), bb=c(4,5,6), cc=function.object, dd=NULL, ee=function.object, ff=7 list2 lmmod=lm.object, boolean=c(TRUE,FALSE,TR...), env=R_GlobalEnv, chars=c("a","b","c","...), trees=data.frame[31,3], l=list(x=1, y="2", z=function.object) foo40() foo40 dots: no dots foo40(aa=b, c) foo40 dots: function.object foo40(aa=b, c) foo40 dots: function.object in foo.s3.list: foo.s3.list(a=list(m=1,n=2)) foo.s3.list dots: no dots in foo.s3.default: foo.s3.default(a=NULL) foo.s3.default dots: no dots in foo.s3.list: foo.s3.list(a=list(m=1,n=2,o=3,p=4,q=5,r=6,s=7,t=8,u=9), b=30) foo.s3.list dots: b=30 foo46(a=30) foo46 dots: a=30 foo47(b=30) foo48(b=30) [1] "print(x=plotmo:::call.as.char(all=all))" attr(,"fname") [1] "print" === Test printcall with all=TRUE EVAL=FALSE === foo30() foo32() foo32 dots: no dots foo32(a=31) foo32 dots: a=31 foo34(aa=1) foo34 dots: no dots foo34(aa=31) foo34 dots: no dots foo34(aa=31, x=1:10, y=NULL) foo34 dots: x=..1, y=..2 foo34(aa=31, y=NULL) foo34 dots: y=..1 foo34(aa=1, x=stopifnot(TRUE), y=NULL) foo34 dots: x=..1, y=..2 foo36(aa=NULL) foo36 dots: no dots foo36(aa=NULL) foo36 dots: no dots foo36(aa=1) foo36 dots: no dots foo36(aa=1:3) foo36 dots: no dots foo36(aa=1:3, x=NULL) foo36 dots: x=..1 foo38(aa=1:3, bb=4:6, cc=print.default, dd=stopifnot(FALSE), ee=function(m=1)cat(m), ff=7, x=matrix(ncol=1,nrow=3)) foo38 dots: x=..1 list1 aa=c(1,2,3), bb=c(4,5,6), cc=function.object, dd=NULL, ee=function.object, ff=7 list2 lmmod=lm.object, boolean=c(TRUE,FALSE,TR...), env=R_GlobalEnv, chars=c("a","b","c","...), trees=data.frame[31,3], l=list(x=1, y="2", z=function.object) foo40(aa=) foo40 dots: no dots foo40(aa=b, c) foo40 dots: ..1 foo40(aa=b, c) foo40 dots: ..1 in foo.s3.list: foo.s3.list(a=list(m=1,n=2)) foo.s3.list dots: no dots in foo.s3.default: foo.s3.default(a=NULL) foo.s3.default dots: no dots in foo.s3.list: foo.s3.list(a=list(m=1,n=2,o=3,p=4,q=5,r=6,s=7,t=8,u=9), b=30) foo.s3.list dots: b=30 foo46(mmmmmmmmmmm=1000, nnnnnnnnnnn=2000, ooooooooooo=3000, ppppppppppp=4000, qqqqqqqqqqq=5000, rrrrrrrrrrr=6000, sssssssssss=7000, ttttttttttt=8000, uuuuuuuuuuu=9000, vvvvvvvvvvv=1000, wwwwwwwwwww=2000, xxxxxxxxxxx=3000, a=30) foo46 dots: a=30 foo47(aa=1, b=30) foo48(aa=1, b=30) [1] "print(x=plotmo:::call.as.char(all=all))" attr(,"fname") [1] "print" === Test printcall with all=TRUE EVAL=TRUE === foo30() foo32() foo32 dots: no dots foo32(a=31) foo32 dots: a=31 foo34(aa=1) foo34 dots: no dots foo34(aa=31) foo34 dots: no dots foo34(aa=31, x=1:10, y=NULL) foo34 dots: x=c(1,2,3,4,5,6,7...), y=NULL foo34(aa=31, y=NULL) foo34 dots: y=NULL foo34(aa=1, x=stopifnot(TRUE), y=NULL) foo34 dots: x=NULL, y=NULL foo36(aa=NULL) foo36 dots: no dots foo36(aa=NULL) foo36 dots: no dots foo36(aa=1) foo36 dots: no dots foo36(aa=1:3) foo36 dots: no dots foo36(aa=1:3, x=NULL) foo36 dots: x=NULL foo38(aa=1:3, bb=4:6, cc=print.default, dd=stopifnot(FALSE), ee=function(m=1)cat(m), ff=7, x=matrix(ncol=1,nrow=3)) foo38 dots: x=c(NA,NA,NA) list1 aa=c(1,2,3), bb=c(4,5,6), cc=function.object, dd=NULL, ee=function.object, ff=7 list2 lmmod=lm.object, boolean=c(TRUE,FALSE,TR...), env=R_GlobalEnv, chars=c("a","b","c","...), trees=data.frame[31,3], l=list(x=1, y="2", z=function.object) foo40(aa=) foo40 dots: no dots foo40(aa=b, c) foo40 dots: function.object foo40(aa=b, c) foo40 dots: function.object in foo.s3.list: foo.s3.list(a=list(m=1,n=2)) foo.s3.list dots: no dots in foo.s3.default: foo.s3.default(a=NULL) foo.s3.default dots: no dots in foo.s3.list: foo.s3.list(a=list(m=1,n=2,o=3,p=4,q=5,r=6,s=7,t=8,u=9), b=30) foo.s3.list dots: b=30 foo46(mmmmmmmmmmm=1000, nnnnnnnnnnn=2000, ooooooooooo=3000, ppppppppppp=4000, qqqqqqqqqqq=5000, rrrrrrrrrrr=6000, sssssssssss=7000, ttttttttttt=8000, uuuuuuuuuuu=9000, vvvvvvvvvvv=1000, wwwwwwwwwww=2000, xxxxxxxxxxx=3000, a=30) foo46 dots: a=30 foo47(aa=1, b=30) foo48(aa=1, b=30) [1] "print(x=plotmo:::call.as.char(all=all))" attr(,"fname") [1] "print" > source("test.epilog.R") plotmo/inst/slowtests/test.plotmo3.R0000644000176200001440000005351615126312152017316 0ustar liggesusers# test.plotmo3.R: extra tests for plotmo version 3 and higher source("test.prolog.R") library(earth) data(ozone1) data(etitanic) options(warn=1) # print warnings as they occur # check check.numeric.scalar xtest <- NA expect.err(try(plotmo:::check.numeric.scalar(xtest)), "'xtest' is NA") xtest <- NULL expect.err(try(plotmo:::check.numeric.scalar(xtest)), "'xtest' is NULL") expect.err(try(plotmo:::check.numeric.scalar(NA)), "argument is NA") expect.err(try(plotmo:::check.numeric.scalar(NULL)), "argument is NULL") expect.err(try(plotmo:::check.numeric.scalar(try)), "'try' must be numeric (whereas its current class is \"function\")") expect.err(try(plotmo:::check.numeric.scalar('try')), "\"try\" must be numeric (whereas its current class is \"character\")") expect.err(try(plotmo:::check.numeric.scalar(NULL)), "argument is NULL") expect.err(try(plotmo:::check.numeric.scalar(1234, min=2, max=3)), "argument=1234 but it should be between 2 and 3") expect.err(try(plotmo:::check.numeric.scalar(0.1234, min=2, max=3)), "argument=0.1234 but it should be between 2 and 3") expect.err(try(plotmo:::check.numeric.scalar(.1234, min=2, max=3)), "argument=0.1234 but it should be between 2 and 3") expect.err(try(plotmo:::check.numeric.scalar(+1234, min=2, max=3)), "argument=1234 but it should be between 2 and 3") expect.err(try(plotmo:::check.numeric.scalar(-1234, min=2, max=3)), "argument=-1234 but it should be between 2 and 3") expect.err(try(plotmo:::check.numeric.scalar(+.1234, min=2, max=3)), "argument=0.1234 but it should be between 2 and 3") expect.err(try(plotmo:::check.numeric.scalar(-.1234, min=2, max=3)), "argument=-0.1234 but it should be between 2 and 3") expect.err(try(plotmo:::check.numeric.scalar("", min=0, max=3)), "\"\" must be numeric (whereas its current class is \"character\"") x.numeric.scalar <- 1234 expect.err(try(plotmo:::check.numeric.scalar(x.numeric.scalar, min=0, max=3)), "x.numeric.scalar=1234 but it should be between 0 and 3") stopifnot(identical(plotmo:::check.numeric.scalar(x.numeric.scalar, min=2, max=1235), 1234)) stopifnot(identical(plotmo:::check.numeric.scalar(1234, min=2, max=1235), 1234)) # check check.integer.scalar xtest <- NA expect.err(try(plotmo:::check.integer.scalar(xtest)), "'xtest' is NA") xtest <- NULL expect.err(try(plotmo:::check.integer.scalar(xtest)), "'xtest' is NULL") expect.err(try(plotmo:::check.integer.scalar(NA)), "argument is NA") expect.err(try(plotmo:::check.integer.scalar(NA, null.ok=TRUE)), "argument is NA") expect.err(try(plotmo:::check.integer.scalar(NULL)), "argument is NULL") expect.err(try(plotmo:::check.integer.scalar(xtest, na.ok=TRUE)), "'xtest' is NULL") expect.err(try(plotmo:::check.integer.scalar("xyz", na.ok=TRUE)), "\"xyz\" is a string but it should be an integer, or NA, or TRUE or FALSE") expect.err(try(plotmo:::check.integer.scalar("TRUE", na.ok=TRUE)), "\"TRUE\" is a string but it should be an integer, or NA, or TRUE or FALSE") stopifnot(identical(plotmo:::check.integer.scalar(TRUE), TRUE)) stopifnot(identical(plotmo:::check.integer.scalar(NA, na.ok=TRUE), NA)) x.integer.scalar <- 1234L expect.err(try(plotmo:::check.integer.scalar(x.integer.scalar, min=0, max=3)), "x.integer.scalar=1234 but it should be between 0 and 3") stopifnot(identical(plotmo:::check.integer.scalar(x.integer.scalar, min=2, max=1235), 1234L)) stopifnot(identical(plotmo:::check.integer.scalar(1234, min=2, max=1235), 1234)) stopifnot(identical(plotmo:::check.integer.scalar(x.integer.scalar, min=2, max=1235), 1234L)) stopifnot(identical(plotmo:::check.integer.scalar(1234, min=2, max=1235), 1234)) xtest <- 1.234 expect.err(try(plotmo:::check.integer.scalar(xtest, min=0, max=3)), "xtest=1.234 but it should be an integer, or TRUE or FALSE") # check check.vec xtest <- "x" expect.err(try(plotmo:::check.vec(xtest, "xtest", na.ok=TRUE)), "'xtest' is not numeric") xtest <- as.double(NA) print(plotmo:::check.vec(xtest, "xtest", na.ok=TRUE)) xtest <- as.double(1:3) print(plotmo:::check.vec(xtest, "xtest", na.ok=TRUE)) xtest <- c(1,2,3,1/0,5,6,7) expect.err(try(plotmo:::check.vec(xtest, "xtest", na.ok=TRUE)), "non-finite value in xtest") xtest <- c(1,2,3,NA,5,6,7) expect.err(try(plotmo:::check.vec(xtest, "xtest")), "NA in xtest") xtest <- c(1,2,3) expect.err(try(plotmo:::check.vec(xtest, "xtest", expected.len=2)), "'xtest' has the wrong length 3, expected 2") print(plotmo:::check.vec(c(TRUE, FALSE), "c(TRUE, FALSE)")) plotmo1 <- function(object, ..., trace=0, SHOWCALL=TRUE, caption=NULL) { if(is.null(caption)) caption <- paste(deparse(substitute(object)), collapse=" ") call <- match.call(expand.dots=TRUE) call <- strip.space(paste(deparse(substitute(call)), collapse=" ")) printf("%s\n", call) plotmo(object, trace=trace, SHOWCALL=SHOWCALL, caption=caption, ...) } plotres1 <- function(object, ..., trace=0, SHOWCALL=TRUE, caption=NULL) { if(is.null(caption)) caption <- paste(deparse(substitute(object)), collapse=" ") call <- match.call(expand.dots=TRUE) call <- strip.space(paste(deparse(substitute(call)), collapse=" ")) printf("%s\n", call) plotres(object, trace=trace, SHOWCALL=SHOWCALL, caption=caption, ...) } # basic tests of plotmo on abbreviated titanic data get.tita <- function() { tita <- etitanic pclass <- as.character(tita$pclass) # change the order of the factors so not alphabetical pclass[pclass == "1st"] <- "first" pclass[pclass == "2nd"] <- "class2" pclass[pclass == "3rd"] <- "classthird" tita$pclass <- factor(pclass, levels=c("class2", "classthird", "first")) # log age is so we have a continuous predictor even when model is age~. set.seed(2015) tita$logage <- log(tita$age) + rnorm(nrow(tita)) tita$parch <- NULL # by=12 gives us a small fast model with an additive and a interaction term tita[seq(1, nrow(etitanic), by=12), ] } tita <- get.tita() mod.lm.age <- lm(age~., data=tita) plotmo1(mod.lm.age) plotmo1(mod.lm.age, level=.95) plotmo1(mod.lm.age, level=.95, col.resp=3) sexn <- as.numeric(tita$sex) mod.lm.sexn <- lm(sexn~.-sex, data=tita) plotmo1(mod.lm.sexn) plotmo1(mod.lm.sexn, level=.95) set.seed(2020) mod.earth.age <- earth(age~., data=tita, degree=2, nfold=3, ncross=3, varmod.method="lm") plotmo1(mod.earth.age) plotmo1(mod.earth.age, level=.9, degree2=0) # tita[,4] is age set.seed(2020) mod.earth.tita.age <- earth(tita[,-4], tita[,4], degree=2, nfold=3, ncross=3, trace=.5, varmod.method="lm") cat("\nsummary(mod.earth.tita.age)\n") print(summary(mod.earth.tita.age)) plotmo1(mod.earth.tita.age) plotmo1(mod.earth.tita.age, level=.9, degree2=0) set.seed(2020) a.earth.sex <- earth(sex~., data=tita, degree=2, nfold=3, ncross=3, varmod.method="lm") plotmo1(a.earth.sex) plotmo1(a.earth.sex, level=.9) plotmo1(a.earth.sex, type="class") expect.err(try(plotmo1(a.earth.sex, level=.9, degree2=0, type="class")), "predicted values are strings") # tita[,3] is sex set.seed(2020) mod.earth.tita <- earth(tita[,-3], tita[,3], degree=2, nfold=3, ncross=3, varmod.method="lm") plotmo1(mod.earth.tita) plotmo1(mod.earth.tita, level=.9, degree2=0) plotmo1(mod.earth.tita, type="class") expect.err(try(plotmo1(mod.earth.tita, level=.9, degree2=0, type="class")), "predicted values are strings") set.seed(2020) mod.earth.sex <- earth(sex~., data=tita, degree=2, nfold=3, ncross=3, varmod.method="earth", glm=list(family=binomial)) plotmo1(mod.earth.sex) plotmo1(mod.earth.sex, type="link") plotmo1(mod.earth.sex, type="class") plotmo1(mod.earth.sex, level=.9, type="earth") # tita[,3] is sex set.seed(2020) mod.earth.tita <- earth(tita[,-3], tita[,3], degree=2, nfold=3, ncross=3, varmod.method="earth", glm=list(family=binomial)) plotmo1(mod.earth.tita) plotmo1(mod.earth.tita, type="link") plotmo1(mod.earth.tita, type="class") plotmo1(mod.earth.tita, level=.9, type="earth") # check factor handling when factors are not ordered alphabetically tita.orgpclass <- etitanic[seq(1, nrow(etitanic), by=12), ] tita <- get.tita() tita$logage <- NULL tita.orgpclass$parch <- NULL stopifnot(names(tita.orgpclass) == names(tita)) a.tita.orgpclass <- earth(pclass~., degree=2, data=tita.orgpclass) a.tita <- earth(pclass~., degree=2, data=tita) options(warn=2) # treat warnings as errors expect.err(try(plotmo(a.tita)), "Defaulting to nresponse=1, see above messages") options(warn=1) # following two graphs should be identical plotmo1(a.tita.orgpclass, nresponse="1st", all1=T, col.resp=3, type2="im") plotmo1(a.tita, nresponse="first", all1=T, col.resp=3, type2="im") # following two graphs should be identical plotmo1(a.tita.orgpclass, nresponse="2nd", all1=T) plotmo1(a.tita, nresponse="class2", all1=T) tita <- get.tita() mod.earth.pclass <- earth(pclass~., data=tita, degree=2) options(warn=2) # treat warnings as errors expect.err(try(plotmo1(mod.earth.pclass)), "Defaulting to nresponse=1, see above messages") options(warn=1) plotmo1(mod.earth.pclass, nresponse="fi") plotmo1(mod.earth.pclass, nresponse="first") plotmo1(mod.earth.pclass, nresponse=3) plotmo1(mod.earth.pclass, type="class") plotmo1(mod.earth.pclass, nresponse=1, type="class", grid.levels=list(sex="fem"), smooth.col="indianred", smooth.lwd=2, pt.col=as.numeric(tita$pclass)+1, pt.pch=1) # tita[,1] is pclass mod.earth.tita <- earth(tita[,-1], tita[,1], degree=2) options(warn=2) # treat warnings as errors expect.err(try(plotmo1(mod.earth.tita)), "Defaulting to nresponse=1, see above messages") options(warn=1) plotmo1(mod.earth.tita, nresponse="first") plotmo1(mod.earth.tita, type="class") mod.earth.pclass2 <- earth(pclass~., data=tita, degree=2, glm=list(family=binomial)) # expect.err(try(plotmo1(mod.earth.pclass2)), "nresponse is not specified") plotmo1(mod.earth.pclass2, nresponse=3) plotmo1(mod.earth.pclass2, type="link", nresponse=3) plotmo1(mod.earth.pclass2, type="class") # tita[,1] is pclass mod.earth.tita <- earth(tita[,-1], tita[,1], degree=2, glm=list(family=binomial)) plotmo1(mod.earth.tita, nresponse=3) plotmo1(mod.earth.tita, type="link", nresponse=3) plotmo1(mod.earth.tita, type="class") # plotmo vignette examples # use a small set of variables for illustration printf("library(earth)\n") library(earth) # for ozone1 data data(ozone1) oz <- ozone1[, c("O3", "humidity", "temp", "ibt")] lm.model.vignette <- lm(O3 ~ humidity + temp*ibt, data=oz) # linear model plotmo1(lm.model.vignette, pt.col="gray", nrug=-1) plotmo1(lm.model.vignette, level=.9) printf("library(mda)\n") library(mda) mars.model.vignette1 <- mars(oz[,-1], oz[,1], degree=2) plotmo1(mars.model.vignette1) plotres1(mars.model.vignette1) mars.model.vignette2 <- mars(oz[,-1,drop=FALSE], oz[,1,drop=FALSE], degree=2) plotmo1(mars.model.vignette2) # TODO causes Error in lm.fit(object$x, y, singular.ok = FALSE) : (list) object cannot be coerced to type 'double' # although still works # the error is mars.to.earth try(hatvalues.lm.fit(lm.fit(object$x, y, singular.ok=FALSE))) plotres1(mars.model.vignette2, trace=1) printf("library(rpart)\n") library(rpart) # rpart rpart.model.vignette <- rpart(O3 ~ ., data=oz) plotmo1(rpart.model.vignette, all2=TRUE) expect.err(try(plotmo1(rpart.model.vignette, level=.9)), "the level argument is not supported for \"rpart\" objects") # commented out because is slow and already tested in test.non.earth.R # printf("library(randomForest)\n") # library(randomForest) # randomForest # rf.model.vignette <- randomForest(O3~., data=oz) # plotmo1(rf.model.vignette) # partialPlot(rf.model.vignette, oz, temp) # compare to partial-dependence plot printf("library(gbm)\n") library(gbm) # gbm set.seed(2016) gbm.model.vignette <- gbm(O3~., data=oz, dist="gaussian", inter=2, n.trees=100) # commented out following because they always take the whole page # plot(gbm.model.vignette, i.var=2) # compare to partial-dependence plots # plot(gbm.model.vignette, i.var=c(2,3)) set.seed(2016) plotmo1(gbm.model.vignette, caption="gbm.model.vignette") # commented out because is slow and already tested elsewhere # printf("library(mgcv)\n") # library(mgcv) # gam # gam.model.vignette <- gam(O3 ~ s(humidity)+s(temp)+s(ibt)+s(temp,ibt), data=oz) # plotmo1(gam.model.vignette, level=.95, all2=TRUE) printf("library(nnet)\n") library(nnet) # nnet set.seed(4) nnet.model.vignette <- nnet(O3~., data=scale(oz), size=2, decay=0.01, trace=FALSE) plotmo1(nnet.model.vignette, type="raw", all2=T) printf("library(MASS)\n") library(MASS) # qda lcush <- data.frame(Type=as.numeric(Cushings$Type),log(Cushings[,1:2])) lcush <- lcush[1:21,] qda.model.vignette <- qda(Type~., data=lcush) plotmo1(qda.model.vignette, type="class", all2=TRUE, type2="contour", ngrid2=100, contour.nlevels=2, contour.drawlabels=FALSE, pt.col=as.numeric(lcush$Type)+1, pt.pch=as.character(lcush$Type)) # miscellaneous other examples tita <- get.tita() mod.glm.sex <- glm(sex~., data=tita, family=binomial) plotmo1(mod.glm.sex, pt.col=as.numeric(tita$pclass)+1, do.par=2) empty.plot() # glm binomial model: compare error band on plotmo versus manual plot wasp <- read.table("darlingtonia.tab", header=T) iorder = order(wasp$leafHeight, wasp$visited) wasp = wasp[iorder,] iseq = seq(1, nrow(wasp), by = 2) dat = wasp[iseq, ] newdat = wasp[iseq+1, ] print(summary(dat)) set.seed(2026) mod <- glm(visited ~ leafHeight, data=dat, family=binomial()) print(summary(mod)) set.seed(2026) level95 = .95 plotmo(mod, do.par=FALSE, trace=2, level=level95, level.shade="lightgray", # nrug=TRUE, grid.col="lightgray", pt.col=ifelse(dat$visited, "pink", "lightgreen"), jitter=0.1, main="plotmo: visited vs leafHeight") # wrong error bars (used prior to plotmo 3.7.0) pred = predict(mod, newdata=newdat, type='response', se.fit=TRUE) yhat = pred$fit wrong_se = pred$se.fit wrong_lwr = yhat - (2 * wrong_se) wrong_upr = yhat + (2 * wrong_se) points(newdat$leafHeight, wrong_lwr, pch=".", col="red") points(newdat$leafHeight, wrong_upr, pch=".",, col="red") # correct error bars (fixed in plotmo 3.7.0) ilink = family(mod)$linkinv pred_link = predict(mod, newdata=newdat, type="link", se.fit=TRUE) q = qt((1 - level95) / 2, df = df.residual(mod), lower.tail = FALSE) printf("darlingtonia: level95 %.4f q %.4f\n", level95, q) lwr = ilink(pred_link$fit - (q * pred_link$se.fit)) upr = ilink(pred_link$fit + (q * pred_link$se.fit)) points(newdat$leafHeight, lwr, pch="o") points(newdat$leafHeight, upr, pch="o") legend(x="topleft", legend=c("correct (plotmo 3.7.0)", "incorrect (prior to plotmo 3.7.0)"), col=c(1,2), pch=sprintf("%s%s", "o", ".")) plot(newdat$leafHeight, yhat, type="l", main="manual: visited vs leafHeight", xlim=c(15,80), ylim=c(-.05,1.1)) points(newdat$leafHeight, lwr, pch="o") points(newdat$leafHeight, upr, pch="o") # tita[,4] is age, tita[,1] is pclass printf("library(lars)\n") library(lars) set.seed(2015) xmat <- as.matrix(tita[,c(2,5,6)]) mod.lars.xmat <- lars(xmat, tita[,4]) par(mfrow=c(2,2)) plot(mod.lars.xmat) plotmo1(mod.lars.xmat, nresponse=4, do.par=F) plotres(mod.lars.xmat, trace=0, nresponse=4) if(0) { # TODO fails with R-3.4.2: object '.QP_qpgen2' not found printf("library(cosso)\n") library(cosso) set.seed(2016) cosso <- cosso(xmat,tita[,4],family="Gaussian") # TODO tell maintainer of cosso that you have to do this class(cosso) <- "cosso" set.seed(2016) plotmo1(cosso) set.seed(2016) plotres(cosso) } # examples from James, Witten, et al. ISLR book # I tested all models in their scripts manually. # All worked except for exceptions below. printf("library(pls)\n") library(pls) printf("library(ISLR)\n") library(ISLR) Hitters=na.omit(Hitters) set.seed(1) x <- model.matrix(Salary~.,Hitters)[,-1] y <- Hitters$Salary train=sample(1:nrow(x), nrow(x)/2) pcr.fit1=pcr(Salary~., data=Hitters,subset=train,scale=TRUE, validation="CV") plotmo1(pcr.fit1, nresponse=10) # set.seed(1) # x <- model.matrix(Salary~.,Hitters)[,-1] # y <- Hitters$Salary # train=sample(1:nrow(x), nrow(x)/2) # pcr.fit2=pcr(y~x,scale=TRUE,ncomp=7) # # TODO following gives Error: predictions returned the wrong length (got 263 but expected 50) # plotmo1(pcr.fit2, nresponse=5) library(splines) fit.lm2=lm(wage~bs(age,knots=c(25,40,60)),data=Wage) par(mfrow=c(1,2),mar=c(4.5,4.5,1,1),oma=c(0,0,4,0)) agelims=range(Wage$age) age.grid=seq(from=agelims[1],to=agelims[2]) pred=predict(fit.lm2,newdata=list(age=age.grid),se=T) plot(Wage$age,Wage$wage,col="gray", ylim=c(0,320)) lines(age.grid,pred$fit,lwd=2) lines(age.grid,pred$fit+2*pred$se,lty="dashed") lines(age.grid,pred$fit-2*pred$se,lty="dashed") fit.lm2=lm(wage~bs(age,knots=c(25,40,60)),data=Wage,model=F) # TODO delete plotmo1(fit.lm2, col.resp=2, do.par=F, level=.95, ylim=c(0,320), nrug=TRUE, caption="fit.lm2", ylab="wage") fit.glm2 <- glm(I(wage>250)~poly(age,4),data=Wage,family=binomial) par(mfrow=c(1,2),mar=c(4.5,4.5,1,1),oma=c(0,0,4,0)) agelims=range(Wage$age) age.grid=seq(from=agelims[1],to=agelims[2]) # their plot preds=predict(fit.glm2,newdata=list(age=age.grid),se=T) pfit=exp(preds$fit)/(1+exp(preds$fit)) se.bands.logit = cbind(preds$fit+2*preds$se.fit, preds$fit-2*preds$se.fit) se.bands = exp(se.bands.logit)/(1+exp(se.bands.logit)) preds=predict(fit.glm2,newdata=list(age=age.grid),type="response",se=T) plot(Wage$age,I(Wage$wage>250),xlim=agelims,type="n",ylim=c(0,.2)) points(jitter(Wage$age), I((Wage$wage>250)/5),cex=.5,pch="|",col="darkgrey") lines(age.grid,pfit,lwd=2, col="blue") matlines(age.grid,se.bands,lwd=1,col="blue",lty=3) # plotmo plot, side by side # TODO Warning: the level argument may not be properly supported on glm objects built with weights plotmo1(fit.glm2, level=.95, degree1.col="blue", ylim=c(0,.2), do.par=FALSE, nrug=-1, caption="fit.glm2", ylab="I(wage > 250)") # Test deparsing of the formula in plotmo.pairs.default # TODO Height is included in the plots even though formula says -Height Height2 <- trees$Height^2 a <- lm(Volume~(Girth*Height2)-Height, data=trees, x=TRUE, model=FALSE) plotmo(a) # test "the variable on the right side of the formula is a matrix or data.frame" # TODO would like to solve this problem options(warn=2) data(gasoline, package="pls") earth.octane <- earth(octane ~ NIR, data=gasoline) print(summary(earth.octane)) # ok plotres(earth.octane) # ok expect.err(try(plotmo(earth.octane)), "the variable on the right side of the formula is a matrix or data.frame") options(warn=1) # TODO May 2020 'ElemStatLearn' is not available (for R version 4.0.0) # library(ElemStatLearn) # x <- mixture.example$x # g <- mixture.example$y # lm.mixture.example <- lm(g ~ x) # options(warn=2) # expect.err(try(plotmo(lm.mixture.example)), "the variable on the right side of the formula is a matrix or data.frame") # options(warn=1) # test variable names with $ are not supported a <- earth(O3~ozone1$doy, data=ozone1) expect.err(try(plotmo(a)), "cannot get the original model predictors") a <- earth(O3~ozone1$doy + temp, data=ozone1) expect.err(try(plotmo(a)), "cannot get the original model predictors") a <- lm(O3~ozone1$doy, data=ozone1) expect.err(try(plotmo(a)), "cannot get the original model predictors") a <- lm(O3~ozone1$doy + temp, data=ozone1) expect.err(try(plotmo(a)), "cannot get the original model predictors") #--- test interaction of w1. and non w1 args ------------------------------------- par(mfrow=c(4,3), mar=c(3, 3, 4, 1), mgp=c(2, 0.6, 0)) mod78 <- earth(Volume ~ ., data = trees) par(mfrow=c(3,4), mar=c(3, 3, 3, 1), mgp=c(2, 0.6, 0)) # multiple which, earth model plotres(mod78, cex.main=1, ylim=c(-.5, .8), xlim=c(-2, 7), col=2:3, do.par=FALSE, w1.main=c("ylim=c(-.5, .8)\nxlim=c(-2, 7) col=2:3")) # multiple which, earth model plotres(mod78, cex.main=.7, w1.ylim=c(-.5, .8), w1.xlim=c(-2, 7), col=2:3, do.par=FALSE, ylim=c(-10,10), xlim=c(-30, 100), w1.main=c("w1.ylim=c(-.5, .8) w1.xlim=c(-2, 7)\nylim=c(-10,10), xlim=c(-30, 100)")) par(org.par) par(mfrow=c(3,4), mar=c(3, 3, 3, 1), mgp=c(2, 0.6, 0)) # which=1, earth model plotres(mod78, which=1, cex.main=.8, col=2:3, main="which=1, no other ylim args", w1.main="which=1, no other ylim args") plotres(mod78, which=1, cex.main=.8, col=2:3, w1.ylim=c(.3,.98), w1.xlim=c(-2, 7), main="w1.ylim=c(.3,.98)\nw1.xlim=c(-2, 7)") plotres(mod78, which=1, cex.main=.8, col=2:3, ylim=c(.3,.98), xlim=c(-2, 7), main="ylim=c(.3,.98)\nxlim=c(-2, 7)") # ylim gets passed to modsel plotres(mod78, which=1, cex.main=.75, col=2:3, w1.ylim=c(.3,.98), ylim=c(-.5,.5), w1.xlim=c(-2, 7), xlim=c(-90, 90), main="w1.ylim=c(.3,.98), ylim=c(-.5,.5)\nw1.xlim=c(-2, 7), xlim=c(-90, 90)") # ignore ylim # which=3, earth model plotres(mod78, which=3, cex.main=1, col=2:3, main="which=3, no other ylim args") plotres(mod78, which=3, cex.main=1, col=2:3, w1.ylim=c(.3,.98), w1.xlim=c(-2, 7), main="w1.ylim=c(.3,.98)\nw1.xlim=c(-2, 7)") # not usual, ignore w1.ylim plotres(mod78, which=3, cex.main=1, col=2:3, ylim=c(-10,10), xlim=c(-90,90), main="which=3, ylim=c(-10,10)\nxlim=c(-90,90)") plotres(mod78, which=3, cex.main=1, col=2:3, w1.ylim=c(.3,.98), ylim=c(-10,10), w1.xlim=c(-2, 7), xlim=c(-90,90), main="w1.ylim=c(.3,.98) ylim=c(-10,10)\nw1.xlim=c(-2, 7), xlim=c(-90,90)") par(org.par) nullarg <- NULL expect.err(try(plotmo(nullarg)), "argument 'nullarg' is NULL") expect.err(try(plotmo(NULL)), "argument 'NULL' is NULL") expect.err(try(plotmo(0)), "'0' is not an S3 model") expect.err(try(plotmo(list(1,2))), "'list(1, 2)' is a plain list, not an S3 model") expect.err(try(plotmo(list(1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0))), "object is a plain list, not an S3 model") source("test.epilog.R") plotmo/inst/slowtests/test.fac.R0000644000176200001440000002721013727235376016463 0ustar liggesusers# test.fac.R: test factor plotting in plotmo. This also tests swapxy, xflip, and yflip # Stephen Milborrow, Berea Mar 2011 source("test.prolog.R") library(plotmo) library(earth) library(rpart) data(ozone1) data(etitanic) cat("==test plotmo with factors==\n") test.fac.with.rpart <- function(ngrid2=20) { et <- etitanic col.response <- as.numeric(et$sex)+2 et$pclass.fac <- et$pclass et$parch.int <- et$parch parch.fac <- et$parch parch.fac[parch.fac >= 3] <- 3 # use non alphabetically sorted factor levels et$parch.fac <- factor(parch.fac, labels=c( "levz", "lev1", "lev2", "levf")) et$pclass.num <- as.numeric(et$pclass) et$pclass <- et$sex <- et$age <- et$sibsp <- et$parch <- NULL cat("names(et):", names(et), "\n") # survived pclass.fac parch.int parch.fac pclass.num old.par <- par(no.readonly=TRUE) on.exit(par(old.par)) par(mfrow=c(4,5)) par(mar = c(2, 2, 3, 0.5), cex=.6) # numeric x numeric a2 <- rpart(survived ~ pclass.num+parch.int, data=et) set.seed(145) plotmo(a2, do.par=F, type2="im", degree1=2, col.response=col.response, pt.cex=.3) set.seed(145) plotmo(a2, do.par=F, type2="con", degree1=NA, col.response=col.response, pt.cex=.3) set.seed(145) plotmo(a2, do.par=F, type2="persp", degree1=NA, ngrid2=40, persp.theta=NA, persp.ticktype="d", cex.lab=.8, persp.ntick=2) # factor x numeric a3 <- rpart(survived ~ pclass.fac+parch.int, data=et) set.seed(145) plotmo(a3, do.par=F, type2="im", col.response=col.response, pt.cex=.3) set.seed(145) plotmo(a3, do.par=F, type2="con", degree1=NA, col.response=col.response, pt.cex=.3) set.seed(145) plotmo(a3, do.par=F, type2="persp", degree1=NA, ngrid2=40, persp.theta=NA, persp.ticktype="d", persp.border=NA, cex.lab=.8, persp.ntick=2) # numeric x factor a4 <- rpart(survived ~ pclass.num+parch.fac, data=et) set.seed(145) plotmo(a4, do.par=F, type2="im", tra=1, col.response=col.response, pt.cex=.3) set.seed(145) plotmo(a4, do.par=F, type2="con", degree1=NA, col.response=col.response, pt.cex=.3) set.seed(145) plotmo(a4, do.par=F, type2="persp", degree1=NA, ngrid2=40, persp.theta=NA, persp.ticktype="d", persp.border=NA, cex.lab=.8, persp.ntick=2) # factor x factor a5 <- rpart(survived ~ pclass.fac+parch.fac, data=et) set.seed(145) plotmo(a5, do.par=F, type2="im", nrug=TRUE, col.response=col.response, pt.cex=.3) set.seed(145) plotmo(a5, do.par=F, type2="con", degree1=NA, col.response=col.response, pt.cex=.3) set.seed(145) plotmo(a5, do.par=F, type2="persp", degree1=NA, ngrid2=40, persp.theta=NA, persp.ticktype="d", persp.border=NA, cex.lab=.8, persp.ntick=2) # test ndiscrete par(mfrow=c(3,5)) par(mar = c(2, 2, 3, 0.5), cex=.6) plotmo(a2, do.par=F, type2="persp", degree1=2, ndiscrete=0, main="ndiscrete=0", persp.theta=NA, persp.ticktype="d", persp.ntick=2, col.response=col.response, pt.cex=.3) plotmo(a2, do.par=F, type2="im", degree1=NA, ndiscrete=0) plotmo(a2, do.par=F, type2="con", degree1=NA, ndiscrete=0) plotmo(a2, do.par=F, type2="persp", degree1=2, degree2=NA, ndiscrete=0, main="center", center=TRUE, col.response=col.response, pt.cex=.3) plotmo(a2, do.par=F, type2="persp", degree1=2, ndiscrete=3, main="ndiscrete=3", persp.theta=NA, persp.ticktype="d", persp.ntick=2, col.response=col.response, pt.cex=.3) plotmo(a2, do.par=F, type2="im", degree1=NA, ndiscrete=3) plotmo(a2, do.par=F, type2="con", degree1=NA, ndiscrete=3) plotmo(a2, do.par=F, type2="persp", degree1=2, degree2=NA, ndiscrete=3, main="center", center=TRUE, col.response=col.response, pt.cex=.3) plotmo(a2, do.par=F, type2="persp", degree1=2, ndiscrete=10, main="ndiscrete=10", persp.theta=NA, persp.ticktype="d", persp.ntick=2, col.response=col.response, pt.cex=.3) plotmo(a2, do.par=F, type2="im", degree1=NA, ndiscrete=10) plotmo(a2, do.par=F, type2="con", degree1=NA, ndiscrete=10) plotmo(a2, do.par=F, type2="persp", degree1=2, degree2=NA, ndiscrete=10, main="center", center=TRUE, col.response=col.response, pt.cex=.3) } test.fac.with.rpart() cat("==test plotmo swapxy with factors==\n") test.swapxy.with.rpart <- function(ngrid2=20) { et <- etitanic[c(1:50,300:350,600:650),] col.response <- as.numeric(et$sex)+2 et$pclass.fac <- et$pclass et$parch.int <- et$parch parch.fac <- et$parch parch.fac[parch.fac > 2] <- 2 # use non alphabetically sorted factor levels et$parch.fac <- factor(parch.fac, labels=c("lev.zero", "lev.one", "lev.two.or.more")) print(et$parch.fac) et$pclass.num <- as.numeric(et$pclass) et$pclass <- et$sex <- et$age <- et$sibsp <- et$parch <- NULL cat("names(et):", names(et), "\n") # survived pclass.fac parch.int parch.fac pclass.num old.par <- par(no.readonly=TRUE) on.exit(par(old.par)) par(mfrow=c(4,4)) par(mar = c(2, 3, 5, 0.5), cex=.6) # factor x factor a5 <- rpart(survived ~ pclass.fac+parch.fac, data=et) for(swapxy in c(F,T)) { for(xflip in c(F,T)) for(yflip in c(F,T)) { set.seed(145) plotmo(a5, do.par=F, type2="im", degree1=NA, swapxy=swapxy, xflip=xflip, yflip=yflip, main=paste("swapxy=", swapxy, "\nxflip=", xflip, "\nyflip=", yflip), col.response=col.response, pt.cex=3, pt.pch=".") set.seed(145) plotmo(a5, do.par=F, type2="con", degree1=NA, swapxy=swapxy, xflip=xflip, yflip=yflip, main=paste("swapxy=", swapxy, "\nxflip=", xflip, "\nyflip=", yflip), col.response=col.response, pt.cex=.3) } } par(mfrow=c(2,2)) set.seed(146) plotmo(a5, do.par=F, type2="persp", degree1=NA, swapxy=FALSE, main=paste("swapxy=", FALSE), ngrid2=40, persp.theta=145, persp.ticktype="d", cex.lab=.8, persp.ntick=5) set.seed(146) plotmo(a5, do.par=F, type2="persp", degree1=NA, swapxy=TRUE, main=paste("swapxy=", TRUE), ngrid2=40, persp.theta=145, persp.ticktype="d", cex.lab=.8, persp.ntick=5) set.seed(146) plotmo(a5, do.par=F, type2="im", degree1=2, swapxy=FALSE, main=paste("swapxy=", FALSE)) } test.swapxy.with.rpart() aflip <- earth(O3~vh + wind + humidity + temp, data=ozone1, degree=2) col.response<- ifelse(ozone1$O3 == 38, "red", "pink") # test xflip arg, degree1 plots par(mfrow=c(2,2)) set.seed(102) plotmo(aflip, degree1=1:2, degree2=0, do.par=F, col.response=col.response, nrug=-1, ylab="O3", smooth.col="gray") plotmo(aflip, degree1=1:2, degree2=F, do.par=F, col.response=col.response, nrug=-1, ylab="O3", xflip=T, main="xflip=TRUE, degree1 plots", , smooth.col="gray") col.response<- ifelse(ozone1$O3 == 1, "green", "pink") # test flip args, type2=persp par(mfrow=c(2,2)) plotmo(aflip, degree1=0, degree2=2, do.par=F, persp.ticktype="d") plotmo(aflip, degree1=0, degree2=2, do.par=F, persp.tickt="d", swapxy=T, main="swapxy=TRUE") plot(0, 0, type="n", axes=FALSE, xlab="", ylab="") plot(0, 0, type="n", axes=FALSE, xlab="", ylab="") # test swapxy args, type2=image par(mfrow=c(3,3)) plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="im", col.response=col.response, main="test swapxy on image plots\nreference plot") plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="im", col.response=col.response, swapxy=T, main="swapxy=T") plot(0, 0, type="n", axes=FALSE, xlab="", ylab="") plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="im", col.response=col.response, xflip=T, main="xflip=T") plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="im", col.response=col.response, yflip=T, main="yflip=T") plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="im", col.response=col.response, xflip=T, yflip=T, main="xflip=T, yflip=T") plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="im", col.response=col.response, swapxy=T, xflip=T, main="swapxy=T, xflip=T") plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="im", col.response=col.response, swapxy=T, yflip=T, main="swapxy=T, yflip=T") plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="im", col.response=col.response, swapxy=T, xflip=T, yflip=T, main="swapxy=T, xflip=T, yflip=T") # test flip args, type2=contour plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="con", col.response=col.response, main="test flip on contour plots\nreference plot") plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="con", col.response=col.response, swapxy=T) plot(0, 0, type="n", axes=FALSE, xlab="", ylab="") plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="con", col.response=col.response, xflip=T) plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="con", col.response=col.response, yflip=T) plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="con", col.response=col.response, xflip=T, yflip=T) plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="con", col.response=col.response, swapxy=T, xflip=T) plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="con", col.response=col.response, swapxy=T, yflip=T) plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="con", col.response=col.response, swapxy=T, xflip=T, yflip=T) # ordered factor cat("==test plotmo with ordered factor==\n") par(mfcol=c(2,2)) par(mar=c(3, 3, 3, 1)) par(mgp=c(1.5, .5, 0)) a <- lm(height~., data=Loblolly) termplot(a, partial.resid=T, rug=T, terms=2, main="Seed is an ordered factor") # compare to termplot plotmo(a, do.par=F, col.resp="gray", nrug=T, all2=T) #--------------------------------------------------------------------------- # test ndiscrete with integer and non integer predictors, with missing values par(mfcol=c(2,4)) par(mar=c(3, 3, 3, 1)) par(mgp=c(1.5, .5, 0)) et <- etitanic et$var <- et$parch et$var[et$var==1] <- 0 # want a "hole" in var's value, for testing et$var[1:3] <- 6 cat("table(et$var):") print(table(et$var)) cat("\n") a <- earth(survived~var+age, data=et, degree=2, pm="none") plotmo(a, trace=FALSE, ndiscrete=0, main="integral var\n(var levels are 0 2 3 4 5 6)\nndiscrete=0", cex.lab=.8, do.par=F, smooth.col="indianred", persp.ticktype="d", clip=F, degree1=0, persp.theta=40) plotmo(a, ndiscrete=0, do.par=F, smooth.col="indianred", ylim=c(-.5,1), degree2=0, degree1=1) #------------ plotmo(a, ndiscrete=10, main="integral var\nndiscrete=10", cex.lab=.8, do.par=F, smooth.col="indianred", persp.ticktype="d", clip=F, degree1=0, persp.theta=40) plotmo(a, trace=0, ndiscrete=10, do.par=F, smooth.col="indianred", ylim=c(-.5,1), degree2=0, degree1=1) #------------ et$var <- et$var / 2 cat("table(et$var):") print(table(et$var)) cat("\n") a <- earth(survived~var+age, data=et, degree=2, pm="none") plotmo(a, ndiscrete=0, main="integral var\n(var levels are 0 1 1.5 2 2.5 3)\nndiscrete=0", cex.lab=.8, do.par=F, smooth.col="indianred", persp.ticktype="d", clip=F, degree1=0, persp.theta=40) plotmo(a, ndiscrete=0, do.par=F, smooth.col="indianred", ylim=c(-.5,1), degree2=0, degree1=1) #------------ plotmo(a, ndiscrete=10, main="non integral var\nndiscrete=10", cex.lab=.8, do.par=F, smooth.col="indianred", persp.ticktype="d", clip=F, degree1=0, persp.theta=40) plotmo(a, ndiscrete=10, do.par=F, smooth.col="indianred", ylim=c(-.5,1), degree2=0, degree1=1) source("test.epilog.R") plotmo/inst/slowtests/test.c50.Rout.save0000644000176200001440000000601214563614021017766 0ustar liggesusers> # test.c50.R: c50 tests for plotmo and plotres > > source("test.prolog.R") > library(C50) > library(rpart.plot) # for ptitanic, want data with NAs for testing Loading required package: rpart > library(plotmo) Loading required package: Formula Loading required package: plotrix > library(earth) # for etitanic > data(etitanic) > get.tit <- function() # abbreviated titanic data + { + tit <- etitanic + pclass <- as.character(tit$pclass) + # change the order of the factors so not alphabetical + pclass[pclass == "1st"] <- "first" + pclass[pclass == "2nd"] <- "class2" + pclass[pclass == "3rd"] <- "classthird" + tit$pclass <- factor(pclass, levels=c("class2", "classthird", "first")) + # log age is so we have a continuous predictor even when model is age~. + set.seed(2015) + tit$logage <- log(tit$age) + rnorm(nrow(tit)) + tit$parch <- NULL + # by=12 gives us a small fast model with an additive and a interaction term + tit <- tit[seq(1, nrow(etitanic), by=12), ] + } > tit <- get.tit() > > c50.tree.xy <- C5.0(x=tit[,-1], y=tit[,1]) # predict pclass > plotmo(c50.tree.xy, type="prob", nresponse="first", pmethod="apartdep") calculating apartdep for survived calculating apartdep for age calculating apartdep for logage calculating apartdep for survived:age 0123456790 calculating apartdep for survived:logage 0123456790 calculating apartdep for age:logage 01234567890 > plotmo(c50.tree.xy, type="class") plotmo grid: survived sex age sibsp logage 0 male 30 0 3.06991 > # TODO following gives error: type should be either 'class', 'confidence' or 'prob' > # try(plotmo(c50.tree.xy, type="confidence")) > plotres(c50.tree.xy, type="prob", nresponse="first") > > c50.tree.form <- C5.0(pclass~., data=tit) # predict pclass > plotmo(c50.tree.form, type="prob", nresponse="first") plotmo grid: survived sex age sibsp logage 0 male 30 0 3.06991 > plotmo(c50.tree.form, type="class") plotmo grid: survived sex age sibsp logage 0 male 30 0 3.06991 > # TODO following gives error: type should be either 'class', 'confidence' or 'prob' > # try(plotmo(c50.tree.form, type="confidence")) > plotres(c50.tree.form, type="prob", nresponse="first") > > tit$survived <- factor(ifelse(tit$survived == 1, "yes", "no"), + levels = c("yes", "no")) > c50.tree.survived <- C5.0(survived~., data=tit, trials=5) # predict survived > plotmo(c50.tree.survived, type="prob", nresponse="yes") plotmo grid: pclass sex age sibsp logage classthird male 30 0 3.06991 > plotmo(c50.tree.survived, type="class") plotmo grid: pclass sex age sibsp logage classthird male 30 0 3.06991 > # TODO following gives error: type should be either 'class', 'confidence' or 'prob' > # try(plotmo(c50.tree.survived, type="confidence")) > plotres(c50.tree.survived, type="prob", nresponse="yes") > > source("test.epilog.R") plotmo/inst/slowtests/test.center.R0000644000176200001440000001122613725307662017206 0ustar liggesusers# test.center.R: test plotmo's center and ndiscrete args # Stephen Milborrow, Berea Apr 2011 source("test.prolog.R") library(rpart.plot) library(plotmo) library(earth) data(etitanic) et <- etitanic[, c("survived", "pclass", "sex", "age")] et$pclassn <- as.numeric(et$pclass) et <- et[c(30:80,330:380,630:680), ] par(mfrow=c(3,3)) par(mar=c(3, 3.5, 3, 0.5)) par(mgp=c(1.5, .5, 0)) ndiscrete <- 0 #--- row 1 set.seed(844) a1 <- lm(survived~pclassn+sex, data=et) plotmo(a1, all2=T, do.par=F, degree1=NA, degree2=1, center=TRUE, clip=F, main="a1: survived~pclassn+sex\n(default ndiscrete)", pt.col=ifelse(et$survived, "black", "red"), pt.pch=".", pt.cex=2.5, lab=c(1,1,1)) set.seed(844) plotmo(a1, degree1=1, all2=T, degree2=0, do.par=F, xflip=T, center=TRUE, clip=F, grid.levels=list(sex="f"), ndiscrete=ndiscrete, main="pclassn with sex=\"female\"", smooth.col="lightblue", smooth.lwd=2, pt.col=ifelse(et$survived, "black", "red"), pt.pch=".", pt.cex=2.5) set.seed(844) plotmo(a1, degree1=1, all2=T, degree2=0, do.par=F, xflip=T, center=TRUE, clip=F, grid.levels=list(sex="m"), ndiscrete=ndiscrete, main="pclassn with sex=\"male\"", smooth.col="lightblue", smooth.lwd=2, pt.col=ifelse(et$survived, "black", "red"), pt.pch=".", pt.cex=2.5) #--- row 2 a2 <- lm(survived~pclassn*sex, data=et) set.seed(844) plotmo(a2, all2=T, do.par=F, degree2=1, degree1=0, center=TRUE, clip=F, main="a2: survived~pclassn*sex\n(default ndiscrete)") set.seed(844) plotmo(a2, degree1=1, all2=T, degree2=0, do.par=F, xflip=T, center=TRUE, clip=F, grid.levels=list(sex="f"), ndiscrete=ndiscrete, main="pclassn with sex=\"female\"", smooth.col="lightblue", smooth.lwd=2, pt.col=ifelse(et$survived, "black", "red"), pt.pch=".", pt.cex=2.5) set.seed(844) plotmo(a2, degree1=1, all2=T, degree2=0, do.par=F, xflip=T, center=TRUE, clip=F, grid.levels=list(sex="m"), ndiscrete=ndiscrete, main="pclassn with sex=\"male\"", smooth.col="lightblue", smooth.lwd=2, pt.col=ifelse(et$survived, "black", "red"), pt.pch=".", pt.cex=2.5) #--- row 3 par(mfg=c(3,2)) a3 <- lm(survived~pclassn, data=et) set.seed(844) plotmo(a3, do.par=F, xflip=T, center=TRUE, clip=F, ndiscrete=ndiscrete, main="a3: survived~pclassn", degree1.col=1, smooth.col="lightblue", smooth.lwd=2, pt.col=ifelse(et$survived, "black", "red"), pt.pch=".", pt.cex=2.5) plot(0, 0, type="n", axes=FALSE, xlab="", ylab="") #--- row 1 # note that this is an example of a model that gets generated differently # with Scale.y=TRUE vs Scale.y=FALSE (although not shown here) a4 <- earth(survived~pclassn+age, data=et, degree=2) set.seed(844) plotmo(a4, do.par=F, center=TRUE, clip=F, ylim=c(-.6,.7), main="earth: survived~pclassn+age\n(default ndiscrete)", degree1=0, all2=T) set.seed(844) plotmo(a4, do.par=F, xflip=F, all1=T, center=TRUE, clip=F, ylim=c(-.6,.7), main="a4, age with pclassn=1st", ndiscrete=ndiscrete, degree2=0, degree1=2, # grid.levels=list(pclassn="1st"), grid.levels=list(pclassn=1), smooth.col="lightblue", smooth.lwd=2, pt.col=ifelse(et$survived, "black", "red"), pt.pch=".", pt.cex=2.5) set.seed(844) plotmo(a4, do.par=F, xflip=F, all1=T, center=TRUE, clip=F, ylim=c(-.6,.7), main="age with pclassn=3rd", ndiscrete=ndiscrete, degree2=0, degree1=2, grid.levels=list(pclassn=3), smooth.col="lightblue", smooth.lwd=2, pt.col=ifelse(et$survived, "black", "red"), pt.pch=".", pt.cex=2.5) #--- row 2 set.seed(844) plotmo(a4, do.par=F, center=TRUE, clip=F, type2="im", main="a4 earth: survived~pclassn+age\n(default ndiscrete)", degree1=0, all2=T, yflip=T, pt.col=ifelse(et$survived, 1, "red"), image.col=gray(seq(6, 10, length=10) / 10), xflip=T, pt.pch=".", pt.cex=2) set.seed(844) plotmo(a4, do.par=F, xflip=F, all1=T, center=TRUE, clip=F, main="pclassn with age=10", ndiscrete=ndiscrete, degree2=0, degree1=1, grid.levels=list(age=10), smooth.col="lightblue", smooth.lwd=2, pt.col=ifelse(et$survived, "black", "red"), pt.pch=".", pt.cex=2.5) set.seed(844) plotmo(a4, do.par=F, xflip=F, all1=T, center=TRUE, clip=F, main="pclassn with age=40", ndiscrete=ndiscrete, degree2=0, degree1=1, grid.levels=list(age=40), smooth.col="lightblue", smooth.lwd=2, pt.col=ifelse(et$survived, "black", "red"), pt.pch=".", pt.cex=2.5) source("test.epilog.R") plotmo/inst/slowtests/test.gbm.bat0000755000176200001440000000142315124635472017037 0ustar liggesusers@rem test.gbm.bat: gbm tests for plotmo and plotres @echo test.gbm.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.gbm.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.gbm.Rout: @echo. @tail test.gbm.Rout @echo test.gbm.R @exit /B 1 :good1 mks.diff test.gbm.Rout test.gbm.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.gbm.save.ps @exit /B 1 :good2 @rem test.gbm.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.gbm.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.gbm.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/test.glmnet.R0000644000176200001440000004463113727235376017226 0ustar liggesusers# test.glmnet.R: glmnet tests for plotmo and plotres source("test.prolog.R") library(earth) library(glmnet) data(ozone1) data(etitanic) get.tit <- function() # abbreviated titanic data { tit <- etitanic pclass <- as.character(tit$pclass) # change the order of the factors so not alphabetical pclass[pclass == "1st"] <- "first" pclass[pclass == "2nd"] <- "class2" pclass[pclass == "3rd"] <- "classthird" tit$pclass <- factor(pclass, levels=c("class2", "classthird", "first")) # log age is so we have a continuous predictor even when model is age~. set.seed(2015) tit$logage <- log(tit$age) + rnorm(nrow(tit)) tit$parch <- NULL # by=12 gives us a small fast model with an additive and a interaction term tit <- tit[seq(1, nrow(etitanic), by=12), ] } plotmo1 <- function(object, ..., trace=0, SHOWCALL=TRUE, caption=NULL) { if(is.null(caption)) caption <- paste(deparse(substitute(object)), collapse=" ") call <- match.call(expand.dots=TRUE) call <- strip.space(paste(deparse(substitute(call)), collapse=" ")) printf("%s\n", call) plotmo(object, trace=trace, SHOWCALL=SHOWCALL, caption=caption, ...) } plotres1 <- function(object, ..., trace=0, SHOWCALL=TRUE, caption=NULL) { if(is.null(caption)) caption <- paste(deparse(substitute(object)), collapse=" ") call <- match.call(expand.dots=TRUE) call <- strip.space(paste(deparse(substitute(call)), collapse=" ")) printf("%s\n", call) plotres(object, trace=trace, SHOWCALL=SHOWCALL, caption=caption, ...) } tit <- get.tit() set.seed(2015) xmat <- as.matrix(tit[,c(2,5,6)]) set.seed(2015) mod.glmnet.xmat <- glmnet(xmat, tit[,4]) # plotmo on glmnet mods is boring but we test it anyway plotmo1(mod.glmnet.xmat) plotres1(mod.glmnet.xmat) # compare to plot.glmnet par(mfrow=c(4,2), mar=c(3,6,3.5,6)) # extra side margins for more square plots plot_glmnet(mod.glmnet.xmat, main="mod.glmnet.xmat\ncompare to plot.glmnet") plot(0,0) plot_glmnet(mod.glmnet.xmat, xvar="norm", col=c(3,2,1)) plot(mod.glmnet.xmat, xvar="norm") plot_glmnet(mod.glmnet.xmat, xvar="lambda") plot(mod.glmnet.xmat, xvar="lambda") plot_glmnet(mod.glmnet.xmat, xvar="dev") plot(mod.glmnet.xmat, xvar="dev") par(org.par) set.seed(2015) mod.cv.glmnet.xmat <- cv.glmnet(xmat, tit[,4], nfolds=3) # following was needed before plotmo 3.1.3 (before adding plotmo.prolog.cv.glmnet) # mod.cv.glmnet.xmat$x <- as.data.frame(xmat) # mod.cv.glmnet.xmat$y <- tit[,4] cat("==Test plotmo trace=1 and lambda.min\n") plotmo1(mod.cv.glmnet.xmat, predict.s="lambda.min", trace=1) cat("==Test plotmo trace=2 and lambda.min\n") plotmo1(mod.cv.glmnet.xmat, predict.s="lambda.min", trace=2) cat("==Test plotres trace=1 and lambda.1se\n") plotres1(mod.cv.glmnet.xmat, predict.s="lambda.1se", trace=1) cat("==Test plotres trace=2 and lambda.1se\n") plotres1(mod.cv.glmnet.xmat, predict.s="lambda.1se", trace=2) set.seed(2015) x <- matrix(rnorm(100*20),100,20) # 20 variables y <- rnorm(100) mod <- glmnet(x,y) plotmo1(mod) # test w1.label par(mfrow=c(2,3)) par(cex=1) par(mar=c(3,3,3,1)) plotres(mod, which=1, w1.main="default w1.label") plotres(mod, which=1, w1.label=5, w1.main="w1.label=5") plotres(mod, which=1, w1.label=0, w1.main="w1.label=0") plotres(mod, which=1, w1.label=TRUE, w1.main="w1.label=TRUE") plotres(mod, which=1, w1.label=100, w1.main="w1.label=100") par(org.par) # test w1 and non w1 args passed par(mfrow=c(2,2), mar=c(4,4,4,4), cex=1) plot_glmnet(mod, w1.col=3:4, w1.xvar="norm", main="plot_glmnet\nw1.col=3:4 w1.xvar=\"norm\"") plot_glmnet(mod, col=3:4, xvar="norm", main="plot_glmnet\ncol=3:4 xvar=\"norm\"") plot_glmnet(mod, col=3:4, w1.col=1:2, w1.xvar="norm", xvar="lambda", main="plot_glmnet\ncol=3:4 w1.col=1:2\nw1.xvar=\"norm\", xvar=\"lambda\"") par(org.par) par(mfrow=c(3,2), mar=c(3,4,4,4), cex=1) plotres(mod, which=c(1,3), do.par=FALSE, w1.col=3:4, w1.xvar="norm", w1.main="plotres\nw1.col=3:4 w1.xvar=\"norm\"") plotres(mod, which=c(1,3), do.par=FALSE, col=3:4, xvar="norm", w1.main="plotres\nplotres\ncol=3:4 xvar=\"norm\"") plotres(mod, which=c(1,3), do.par=FALSE, col=3:4, w1.col=1:2, w1.main="plotres\ncol=3:4 w1.col=1:2") par(org.par) # glmnet with sparse matrices set.seed(2015) n <- 100 p <- 20 nzc <- trunc(p/10) x <- matrix(rnorm(n*p),n,p) iz <- sample(1:(n*p),size=n*p*.85,replace=FALSE) x[iz] <- 0 sx <- Matrix(x,sparse=TRUE) # colnames(sx) <- paste("x", 1:ncol(sx), sep="") # need column names for plotmo inherits(sx,"sparseMatrix") # confirm that it is sparse beta <- rnorm(nzc) fx <- x[,seq(nzc)]%*%beta eps <- rnorm(n) y <- fx+eps px <- exp(fx) px <- px/(1+px) ly <- rbinom(n=length(px),prob=px,size=1) mod.glmnet.sx <- glmnet(sx,y) plotmo1(mod.glmnet.sx, all2=TRUE) # will give warning: too many predictors to plot all pairs plotmo1(mod.glmnet.sx, all2=2, caption="all2=2") # test all2=2 plotmo1(mod.glmnet.sx, all2=2, degree2=1:3, caption="all2=2 degree2=1:3") plotres(mod.glmnet.sx) par(org.par) par(mfrow=c(2,4), mar=c(3,3,3,1), mgp=c(1.5,0.5,0), oma=c(0,0,2.5,0)) y <- trees$Volume x <- as.matrix(data.frame(Girth=trees$Girth, Height=trees$Height)) glmnet <- glmnet(x, y) plotres(glmnet, do.par=FALSE, caption="glmnet and lm: top and bottom should be the same") lm <- lm(Volume~., data=trees) plotres(lm, do.par=FALSE, SHOWCALL=TRUE) par(mfrow=c(3,2), mar=c(3,3,3,1), mgp=c(1.5,0.5,0), oma=c(0,0,2.5,0)) plotres(glmnet, do.par=FALSE, which=c(1,3), w1.xvar="norm", caption="glmnet with various options", SHOWCALL=TRUE) plotres(glmnet, trace=1, do.par=FALSE, which=c(1,3), SHOWCALL=TRUE) plotres(glmnet, trace=1, do.par=FALSE, which=c(1,3), predict.s=5, SHOWCALL=TRUE) par(org.par) printf("======== glmnet additional tests\n") set.seed(2015) p <- 10 n <- 30 x <- cbind(matrix(rnorm(n*p),n,p)) y <- rowSums(x[,1:3]^3) glmnet <- glmnet(x,y) plotres(glmnet, SHOWCALL=TRUE, caption="glmnet: y <- rowSums(x[,1:3]^3)") plotres(glmnet, SHOWCALL=TRUE, w1.xvar="norm") par(mfrow=c(1,1)) omar <- par("mar") ocex.axis <- par("cex.axis") ocex.lab <- par("cex.lab") plotres(glmnet, SHOWCALL=TRUE, which=1) stopifnot(par("mar") == omar) stopifnot(par("cex.axis") == ocex.axis) stopifnot(par("cex.lab") == ocex.lab) par(org.par) # test some args for plot_glmnet plotres(glmnet, predict.s=.05, SHOWCALL=TRUE, trace=0, col.main=2, w1.xlab="my xlab", w1.ylab="my ylab", w1.main="test some args for plot_glmnet1", w1.col=4:1) plot_glmnet(glmnet, trace=0, col.main=2, main="test some args for plot_glmnet2", xlab="my xlab", ylab="my ylab", col=4:1, ylim=c(-2,4)) # TODO xlim=c(-5,3)) plotres(glmnet, predict.s=.05, SHOWCALL=TRUE, which=c(1,3), grid.col="gray", do.par=2) plotres(glmnet, predict.s=.05, SHOWCALL=TRUE, which=c(1,3), w1.s.col=0, do.par=0) par(org.par) # TODO the following issues a stream of warnings: restarting interrupted promise evaluation expect.err(try(plotres(glmnet, w1.col=nonesuch)), "cannot evaluate 'col'") printf("======== glmnet multinomial (multnet)\n") par(mfrow=c(4,4), mar=c(3,3,3,1)) set.seed(2016) n <- 200 p <- 4 x <- matrix(rnorm(n*p), n, p) colnames(x) <- paste("x", 1:ncol(x), sep="") # "1" is correlated with x[,1], "4" is correlated with x[,2], "2" and "3" not correlated y <- ifelse(x[,1] > 0.5, 1, ifelse(x[,2] > 0.0, 4, sample(c(2,3), size=nrow(x), replace=TRUE))) print(cov(x, y)) y <- factor(y) # TODO Following causes the following warning: # Warning: from glmnet Fortran code (error code -90); Convergence for 90th lambda value not reached after maxit=100000 iterations; solutions for larger lambdas returned multinomial.mod <- glmnet(x, y, family="multinomial") plotres(multinomial.mod, nresponse=1, w1.main="nresponse=1", main="family=\"multinomial\"", smooth.col=0, info=TRUE, trace=0, which=c(1,3), do.par=FALSE, xlim=c(-.2,1.2), ylim=c(-1.2, 1.2)) plotres(multinomial.mod, nresponse=2, w1.main="nresponse=2", smooth.col=0, info=TRUE, trace=0, which=c(1,3), do.par=FALSE, xlim=c(-.2,1.2), ylim=c(-1.2, 1.2)) plotres(multinomial.mod, nresponse=3, w1.main="nresponse=3", smooth.col=0, info=TRUE, trace=0, which=c(1,3), do.par=FALSE, xlim=c(-.2,1.2), ylim=c(-1.2, 1.2)) plotres(multinomial.mod, nresponse=4, w1.main="nresponse=4", smooth.col=0, info=TRUE, trace=0, which=c(1,3), do.par=FALSE, xlim=c(-.2,1.2), ylim=c(-1.2, 1.2)) plotmo(multinomial.mod, nresponse=1, trace=0, do.par=FALSE, degree1=1:2) plotmo(multinomial.mod, nresponse=2, trace=0, do.par=FALSE, degree1=1:2) par(mgp=c(1.5, .4, 0)) plot(multinomial.mod, xvar="norm") # compare to plot.glmnet par(org.par) # compare to earth par(mfrow=c(4,3), mar=c(3,3,1,1)) yfac <- factor(c("a","b","c","d")[y]) earth.mod <- earth(x, yfac, trace=0) plotres(earth.mod, nresponse=1, main=sprint("multiresponse\nnresponse=1 rsq %.2g", earth.mod$rsq.per.response[1]), which=3, xlim=c(-.2, 1.2), ylim=c(-1.2, 1.2), smooth.col=0, info=TRUE, do.par=FALSE, trace=0, jitter=7, cex.response=.7) plotmo(earth.mod, nresponse=1, do.par=FALSE) plotres(earth.mod, nresponse=2, main=sprint("nresponse=2 rsq %.2g", earth.mod$rsq.per.response[2]), which=3, xlim=c(-.2, 1.2), ylim=c(-1.2, 1.2), smooth.col=0, info=TRUE, do.par=FALSE, trace=0, jitter=7, cex.response=.7) plotmo(earth.mod, nresponse=2, do.par=FALSE) plotres(earth.mod, nresponse=3, main=sprint("nresponse=3 rsq %.2g", earth.mod$rsq.per.response[3]), which=3, xlim=c(-.2, 1.2), ylim=c(-1.2, 1.2), smooth.col=0, info=TRUE, do.par=FALSE, trace=0, jitter=7, cex.response=.7) plotmo(earth.mod, nresponse=3, do.par=FALSE) plotres(earth.mod, nresponse=4, main=sprint("nresponse=4 rsq %.2g", earth.mod$rsq.per.response[4]), which=3, xlim=c(-.2, 1.2), ylim=c(-1.2, 1.2), smooth.col=0, info=TRUE, do.par=FALSE, trace=0, jitter=7, cex.response=.7) plotmo(earth.mod, nresponse=4, do.par=FALSE) print(summary(earth.mod)) par(org.par) printf("======== binomial model\n") set.seed(2019) n <- 50 p <- 4 x <- matrix(rnorm(n*p), n, p) colnames(x) <- paste("x", 1:ncol(x), sep="") y <- ifelse(x[,1] + x[,2] + .1 * rnorm(n) > .5, TRUE, FALSE) print(cov(x, y)) y <- factor(y) glmnet.binomial <- glmnet(x, y, family="binomial") par(mfrow=c(2,3), mar=c(3,3,1,1)) plotres(glmnet.binomial, info=T, predict.s=.02, which=c(1,3), do.par=FALSE, w1.main="glmnet.binomial") plot(glmnet.binomial) earth.mod <- earth(x, y) set.seed(2019) plotres(earth.mod, info=T, which=c(1,3), do.par=FALSE) par(org.par) par(mfrow=c(2,4), mar=c(3,3,1,1)) set.seed(2019) plotmo(glmnet.binomial, do.par=FALSE) plotmo(earth.mod, do.par=FALSE, main="binomial earth.mod") par(org.par) printf("======== glmnet family=\"mgaussian\"\n") set.seed(2015) p <- 10 n <- 30 x <- cbind((1:n)/n, matrix(rnorm(n*(p-1)),n,p-1)) colnames(x) <- paste0("x", 1:p) # ymultresp <- cbind(rowSums(x[,1:5]^3), rowSums(x[,5:p]^3), 1:n) set.seed(1) ymultresp <- cbind(x[,1]+.001*rnorm(n), rowSums(x[,2:5]^3), rnorm(n)) glmnet.mgaussian <- glmnet(x, ymultresp, family="mgaussian") plotres(glmnet.mgaussian, nresponse=1, SHOWCALL=TRUE, which=c(1:3), do.par=2, info=1) # manually calculate the residuals plot(x=predict(glmnet.mgaussian, newx=x, s=0)[,1,1], y=ymultresp[,1] - predict(glmnet.mgaussian, newx=x, s=0)[,1,1], pch=20, xlab="Fitted", ylab="Residuals", main="Manually calculated residuals, nresponse=1, s=0") abline(h=0, col="gray") par(org.par) plotres(glmnet.mgaussian, nresponse=2, SHOWCALL=TRUE, which=c(1:3), do.par=2, info=1) # manually calculate the residuals plot(x=predict(glmnet.mgaussian, newx=x, s=0)[,2,1], y=ymultresp[,2] - predict(glmnet.mgaussian, newx=x, s=0)[,2,1], pch=20, xlab="Fitted", ylab="Residuals", main="Manually calculated residuals, nresponse=2, s=0") abline(h=0, col="gray") par(org.par) plotmo(glmnet.mgaussian, nresponse=1, SHOWCALL=TRUE) plotmo(glmnet.mgaussian, nresponse=2, SHOWCALL=TRUE) graphics::par(mfrow=c(2,2), mgp=c(1.5,0.4,0), tcl=-0.3, cex.main=1, font.main=1, mar=c(4,3,1.2,0.8), oma=c(0,0,4,0), cex=0.83) plotres(glmnet.mgaussian, nresponse=2, SHOWCALL=TRUE, which=3, do.par=FALSE, caption="glmnet.mgaussian compare to manually calculated residuals") plot(x=predict(glmnet.mgaussian, newx=x, s=0)[,2,1], y=ymultresp[,2] - predict(glmnet.mgaussian, newx=x, s=0)[,2,1], pch=20, xlab="Fitted", ylab="Residuals", main="Manual residuals, nresponse=2, s=0") abline(h=0, col="gray") plotres(glmnet.mgaussian, nresponse=2, predict.s=.5, SHOWCALL=TRUE, which=3, do.par=FALSE) plot(x=predict(glmnet.mgaussian, newx=x, s=.5)[,2,1], y=ymultresp[,2] - predict(glmnet.mgaussian, newx=x, s=.5)[,2,1], pch=20, xlab="Fitted", ylab="Residuals", main="Manual residuals, nresponse=2, s=.5") abline(h=0, col="gray") plotres(glmnet.mgaussian, predict.s=.05, nresponse=3, info=TRUE, SHOWCALL=TRUE) # essentially random par(org.par) par(mfrow=c(2,3), mar=c(3,3,3,.5), oma=c(0,0,3,0), mgp=c(1.5,0.4,0), tcl=-0.3) data(trees) set.seed(2015) # variable with a long name x50 <- cbind(trees[,1:2], Girth12345678901234567890=rnorm(nrow(trees))) mod.with.long.name <- glmnet(data.matrix(x50),data.matrix(trees$Volume)) plotres(mod.with.long.name, which=1, caption="test plot_glmnet with x50 and x60") # one inactive variable (all coefs are zero for variable "rand") set.seed(2015) x60 <- cbind(trees[,1], rand=rnorm(nrow(trees)), trees[,2]) # complicate the issue: use an unnamed column (column 3) colnames(x60) <- c("Girth", "rand", "") mod.with.inactive.var <- glmnet(data.matrix(x60),data.matrix(trees$Volume)) mod.with.inactive.var$beta["rand",] = 0 # TODO hack force inactive variable plotres(mod.with.inactive.var, which=1) plotres(mod.with.inactive.var, which=1, w1.xvar="norm") # compare to plot.glmnet (but note that labels aren't always plotted unless par=c(1,1)?) plot(mod.with.inactive.var, xvar="norm", label=TRUE) # plotmo calls the unnamed column "x3", fair enough plotmo(mod.with.inactive.var, do.par=FALSE, pt.col=2) # single active variable x70 <- cbind(trees[,1,drop=F], 0) a <- glmnet(data.matrix(x70), data.matrix(trees$Volume)) par(org.par) par(mfrow=c(2,2), mar=c(3,3,2,4)) plotres(a, which=1, predict.s=1, caption="single active variable") plotres(a, which=1, w1.xvar="norm") plotres(a, which=1, w1.xvar="lambda") plotres(a, which=1, w1.xvar="dev") #--- test interaction of w1. and non w1 args ------------------------------------- #--- glmnet model, which=1 --- par(org.par) par(mfrow=c(4,3), mar=c(3, 3, 4, 1), mgp=c(2, 0.6, 0)) plotres(mod.glmnet.xmat, which=1, w1.xlim=c(6,-6), w1.ylim=c(-5,5), w1.col=1:2, w1.main="TEST INTERACTION OF W1 ARGS PAGE 1 (which=1)\n\nwhich=1 w1.xlim=c(6,-6)\nw1.ylim=c(-5,5)) w1.col=1:2,") plotres(mod.glmnet.xmat, which=1, cex.main=1.2, xlim=c(9,-9), ylim=c(-60,60), col=3:4, w1.main="which=1 xlim=c(9,-9)\nylim=c(-60,60)) col=3:4,") plotres(mod.glmnet.xmat, which=1, cex.main=1, xlim=c(9,-9), w1.xlim=c(6,-6), ylim=c(-60,60), w1.ylim=c(-5,5), w1.col=1:2, col=3:4, w1.main="which=1 xlim=c(9,-9), w1.xlim=c(6,-6)\nylim=c(-60,60), w1.ylim=c(-5,5)) w1.col=1:2, col=3:4") #--- glmnet model, which=c(1,3,4) --- plotres(mod.glmnet.xmat, which=c(1,3,4), cex.main=1, ylim=c(-70,70), xlim=c(-20, 60), col=2:3, do.par=FALSE, w1.main="TEST INTERACTION OF W1 ARGS PAGE 1 (which=c(1,3,4))\nlim=c(-70,70), xlim=c(-20, 60)") plotres(mod.glmnet.xmat, which=c(1,3,4), cex.main=1.2, ylim=c(-70,70), xlim=c(-20, 60), qq.xlim=c(-7,5), col=2:3, do.par=FALSE, w1.main="ylim=c(-70,70), xlim=c(-20, 60)\nqq.xlim=c(-7,5)") plotres(mod.glmnet.xmat, which=c(1,3,4), cex.main=1.2, w1.ylim=c(-7,7), w1.xlim=c(4,-4), col=2:3, do.par=FALSE, w1.main="w1.ylim=c(-7,7), w1.xlim=c(4,-4)") # plotres(mod.glmnet.xmat, which=c(1,3,4), cex.main=.9, # w1.ylim=c(-7,7), ylim=c(-20,20), # qq.xlim=c(-7,5), col=2:3, do.par=FALSE, # qq.ylim=c(-100,100), # main="w1.ylim=c(-7,7) ylim=c(-20,20)\nqq.xlim=c(-7,5) qq.ylim=c(-100,100)") par(org.par) par(mfrow=c(3,3), mar=c(3, 3, 4, 1), mgp=c(2, 0.6, 0)) plotres(mod.glmnet.xmat, which=c(1,3,4), do.par=FALSE, # w1.main="which=c(1,3,4)", w1.xlim=c(6,-6), w1.ylim=c(-5,5), w1.col=2:3, w1.main="TEST INTERACTION OF W1 ARGS PAGE 2\n\nwhich=c(1,3,4) w1.xlim=c(6,-6)\nw1.ylim=c(-5,5)) w1.col=2:3") plotres(mod.glmnet.xmat, which=c(1,3,4), w1.cex.main=1, do.par=FALSE, # w1.main="which=c(1,3,4)", xlim=c(-20,70), ylim=c(-60,60), w1.col=2:3, col=3:4, w1.main="which=c(1,3,4) ylim=c(-60,60))\nw1.col=2:3, col=3:4") plotres(mod.glmnet.xmat, which=c(1,3,4), w1.cex.main=1, do.par=FALSE, # w1.main="which=c(1,3,4)", xlim=c(-20,70), w1.xlim=c(6,-6), ylim=c(-60,60), w1.ylim=c(-5,5), col=3:4, w1.main="which=c(1,3,4) xlim=c(9,-9), w1.xlim=c(6,-6)\nylim=c(-60,60), w1.ylim=c(-5,5)) w1.col=1:2, col=3:4") par(org.par) #-- make sure that we can work with all families set.seed(2016) par(mfrow=c(3,3), mar=c(3,3,3,1)) n <- 100 p <- 4 x <- matrix(rnorm(n*p), n, p) g2 <- sample(1:2, n, replace=TRUE) for(family in c("gaussian","binomial","poisson")) { mod <- glmnet(x,g2,family=family) plot(mod, xvar="lambda") plotres(mod, w1.xvar="lambda", main=paste("family", family), which=c(1,3), do.par=FALSE) } # cox library(plotmo) n <- 100 p <- 20 nzc <- trunc(p/10) set.seed(2016) beta <- rnorm(nzc) x7 <- matrix(rnorm(n*p), n, p) beta <- rnorm(nzc) fx <- x7[,seq(nzc)] %*% beta/3 hx <- exp(fx) ty <- rexp(n, hx) tcens <- rbinom(n=n, prob=.3, size=1)# censoring indicator y <- cbind(time=ty, status=1-tcens) # y=Surv(ty,1-tcens) with library(survival) glmnet.cox <- glmnet(x=x7, y=y, family="cox") plot(glmnet.cox) title("glmnet.cox", line=2) plot_glmnet(glmnet.cox, xvar="norm") plotres(glmnet.cox, which=3, do.par=FALSE) par(org.par) # test col argument par(mfrow=c(2,3), mar=c(3,3,5,1), cex=1) mod <- glmnet(as.matrix(mtcars[-1]), mtcars[,1]) plot_glmnet(mod, main="plot_glmnet default") plot_glmnet(mod, col=c(1,2,3,0,0,NA,0,0,0,0), main="col=c(1,2,3,0,0,NA,0,0,0,0)") g <- "gray" plot_glmnet(mod, col=c("black","red","green",g,g,g,g,g,"steelblue","darkorange"), main="col=c('black','red','green',g,g,g,g,g,'steelblue','darkorange')") plot_glmnet(mod, col=c("black","red","green",0,0,0,0,0,"steelblue","darkorange"), main="col=c('black','red','green',0,0,0,0,0,'steelblue','darkorange')") plot_glmnet(mod, col=c("black","red", 0), main="col=c('black','red', 0)") # test recycling, including 0 par(org.par) source("test.epilog.R") plotmo/inst/slowtests/test.glmnetUtils.bat0000755000176200001440000000157315124635472020607 0ustar liggesusers@rem test.glmnetUtils.bat: glmnetUtils tests for plotmo and plotres @echo test.glmnetUtils.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.glmnetUtils.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.glmnetUtils.Rout: @echo. @tail test.glmnetUtils.Rout @echo test.glmnetUtils.R @exit /B 1 :good1 mks.diff test.glmnetUtils.Rout test.glmnetUtils.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.glmnetUtils.save.ps @exit /B 1 :good2 @rem test.glmnetUtils.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.glmnetUtils.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.glmnetUtils.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/test.partdep.R0000644000176200001440000002003714663412556017366 0ustar liggesusers# partdep.test.R: partdep tests for plotmo and plotres source("test.prolog.R") library(plotmo) library(earth) data(etitanic) mod <- earth(survived~., data=etitanic, degree=2) plotmo(mod, caption="plotmo classical") plotmo(mod, pmethod="partdep", caption="plotmo partdep age") set.seed(2016) plotmo(mod, pmethod="apartdep", caption="plotmo apartdep age", do.par=2) set.seed(2016) plotmo(mod, pmethod="apartdep", ylim=c(0,1), do.par=0, type2="image", pt.col=ifelse(etitanic$survived, "green", "red"), degree1=0, degree2=1:3) par(org.par) # compare to gbm with an artifical function of variables with a very strong interaction library(gbm) n <- 250 set.seed(2016) x1 <- runif(n) x2 <- runif(n) x3 <- runif(n) y <- ifelse(x2 > .6, x1-.2, ifelse(x2 > .4, 1 - 1.5 * x1, .3)) + .1 * sin(4 * x3) data <- data.frame(x1=x1, x2=x2, x3=x3, y=y) n.trees <- 20 set.seed(2016) mod <- gbm(y~., data=data, n.trees=n.trees, shrinkage=.1, distribution="gaussian", interact=5) plotmo(mod, degree1=0, persp.ticktype="detailed", caption="variables with a strong interaction") par(mfrow=c(4,4), mar=c(2,3,2,1), mgp=c(1.5, 0.5, 0), oma=c(0,0,6,0)) library(viridis); image.col <- viridis(100) ngrid1 <- 50 ngrid2 <- 30 plotmo(mod, pmethod="plot", do.par=0, degree2=2, type2="im", ylim=NULL, clip=FALSE, image.col=image.col, ngrid1=ngrid1, ngrid=ngrid2) title("row1: plotmo classic\nrow2: plotmo apartdep\nrow3: plotmo partdep\nrow4: plot.gbm\n\n\n\n\n\n\n", xpd=NA) ylim <- c(.21, .40) set.seed(2016) # for consistent selection of rows for partdep.x plotmo(mod, pmethod="apartdep", do.par=0, degree2=2, type2="im", ylim=ylim, clip=FALSE, image.col=image.col, ngrid1=ngrid1, ngrid=ngrid2) plotmo(mod, pmethod="partdep", do.par=0, degree2=2, type2="im", ylim=ylim, clip=FALSE, image.col=image.col, ngrid1=ngrid1, ngrid=ngrid2, trace=-1) # check that the pacifier messages are suppressed plot(mod, i.var=1, n.trees=n.trees, ylim=ylim, continuous.resolution=ngrid1) plot(mod, i.var=2, n.trees=n.trees, ylim=ylim, continuous.resolution=ngrid1) plot(mod, i.var=3, n.trees=n.trees, ylim=ylim, continuous.resolution=ngrid1) # following ignores par(mfrow=c(2,2)) plot(mod, i.var=c(1,3), n.trees=n.trees, continuous.resolution=ngrid2, col.regions=image.col, colorkey=FALSE, main="gbm plot x1:x3\ncompare to plotmo partdep on previous page") par(org.par) #--- compare to gbm and randomForest with a simple regression function data(scor, package="bootstrap") # some correlated data n <- 50 x1 <- scale(scor$mec[1:n]) x2 <- scale(scor$vec[1:n]) data <- data.frame(x1=x1, x2=x2) ngrid1 <- 100 # randomForest, simple regression function library(randomForest) data$y <- x1 > -.1 # y depends only on x1 (-.1 hand-tuned to create interesting model surface) set.seed(2016) # Expect Warning: The response has five or fewer unique values. Are you sure you want to do regression? mod <- randomForest(y~., data=data, ntree=3) par(mfrow=c(4,2), mar=c(2.5,3,2,1), mgp=c(1.3,0.4,0), oma=c(0,0,7,0)) set.seed(2016) # for consistent jitter of response sites plotmo(mod, degree1=0, ngrid2=100, do.par=0, clip=FALSE, type2="image", main="regression surface", pt.col=ifelse(data$y, "green", "red")) title("RANDOM FOREST SIMPLE REGRESSION MODEL row1: regression surface row2: plotmo classic type=response row3: plotmo partdep type=response row4: randomForest plot\n\n\n\n\n\n\n", xpd=NA, adj=0) plotmo(mod, degree1=0, ngrid2=100, do.par=0, clip=FALSE, persp.border=NA, main="regression surface") plotmo(mod, pmethod="plotmo", do.par=0, degree2=0, ngrid1=ngrid1, type="response") plotmo(mod, pmethod="partdep", do.par=0, degree2=0, ngrid1=ngrid1, type="response") partialPlot(mod, pred.data=data, x.var="x1", n.pt=ngrid1, which.class="True") partialPlot(mod, pred.data=data, x.var="x2", n.pt=ngrid1, which.class="True") par(org.par) # gbm, simple regression function library(gbm) n.trees <- 20 data$y <- x1 > -.6 # y depends only on x1 (-.1 hand-tuned to create interesting model surface) set.seed(2016) mod <- gbm(y~., data=data, n.trees=n.trees, shrinkage=.1, interaction.depth=4, distribution="gaussian") par(mfrow=c(4,2), mar=c(2.5,3,2,1), mgp=c(1.3,0.4,0), oma=c(0,0,7,0)) set.seed(2016) # for consistent jitter of response sites plotmo(mod, degree1=0, ngrid2=100, do.par=0, clip=FALSE, type2="image", main="regression surface", pt.col=ifelse(data$y, "green", "red")) title("GBM SIMPLE REGRESSION MODEL row1: regression surface row2: plotmo classic type=response row3: plotmo partdep type=response row4: gbm plot\n\n\n\n\n\n\n", xpd=NA, adj=0) plotmo(mod, degree1=0, ngrid2=100, do.par=0, clip=FALSE, persp.border=NA, main="regression surface") plotmo(mod, pmethod="plotmo", do.par=0, all1=TRUE, degree2=0, ngrid1=ngrid1, type="response") plotmo(mod, pmethod="partdep", do.par=0, all1=TRUE, degree2=0, ngrid1=ngrid1, type="response") plot(mod, i.var=1, n.trees=n.trees, continuous.resolution=ngrid1) plot(mod, i.var=2, n.trees=n.trees, continuous.resolution=ngrid1) par(org.par) #--- compare to gbm and randomForest with simple binomial (two class) data data(scor, package="bootstrap") # some correlated data n <- 50 x1 <- scale(scor$mec[1:n]) x2 <- scale(scor$vec[1:n]) data <- data.frame(x1=x1, x2=x2) ngrid1 <- 100 # randomForest, simple binomial (two-class) data library(randomForest) # y depends only on x1 # random forest requires a factor for classification (not a logical) data$y <- factor(as.character(x1 > .4), levels=c("FALSE", "TRUE"), labels=c("False", "True")) set.seed(2016) mod <- randomForest(y~., data=data, ntree=3) par(mfrow=c(4,2), mar=c(2.5,3,2,1), mgp=c(1.3,0.4,0), oma=c(0,0,7,0)) set.seed(2016) # for consistent jitter of response sites plotmo(mod, degree1=0, ngrid2=100, do.par=0, clip=FALSE, type2="image", main="regression surface", pt.col=ifelse(data$y=="True", "green", "red")) title("RANDOM FOREST SIMPLE TWO-CLASS MODEL row1: regression surface row2: plotmo partdep type=response (FALSE or TRUE) row3: plotmo partdep type=prob row4: randomForest partialPlot (clipped log odds)\n\n\n\n\n\n\n", xpd=NA, adj=0) plotmo(mod, degree1=0, ngrid2=100, do.par=0, clip=FALSE, persp.border=NA, main="regression surface") plotmo(mod, pmethod="partdep", do.par=0, degree2=0, ngrid1=ngrid1, type="response") plotmo(mod, pmethod="partdep", do.par=0, degree2=0, ngrid1=ngrid1, type="prob", nresponse="True", ylim=c(0,1)) partialPlot(mod, pred.data=data, x.var="x1", n.pt=ngrid1, which.class="True", ylim=c(-16,16)) partialPlot(mod, pred.data=data, x.var="x2", n.pt=ngrid1, which.class="True", ylim=c(-16,16)) par(org.par) # gbm, simple binomial (two-class) data library(gbm) n.trees <- 10 data$y <- as.numeric(x1 > .6) # y depends only on x1 set.seed(2016) mod <- gbm(y~., data=data, n.trees=n.trees, shrinkage=.1, interact=4, distribution="bernoulli") par(mfrow=c(4,2), mar=c(2.5,3,2,1), mgp=c(1.3,0.4,0), oma=c(0,0,7,0)) set.seed(2016) # for consistent jitter of response sites plotmo(mod, degree1=0, ngrid2=100, do.par=0, clip=FALSE, type2="image", main="regression surface", pt.col=ifelse(data$y, "green", "red")) title("GBM SIMPLE TWO-CLASS MODEL row1: regression surface row2: plotmo partdep type=response (probability) row4: plotmo partdep type=link (log odds) row3: gbm plot (log odds)\n\n\n\n\n\n\n", xpd=NA, adj=0) plotmo(mod, degree1=0, ngrid2=100, do.par=0, clip=FALSE, persp.border=NA, main="regression surface") plotmo(mod, pmethod="partdep", do.par=0, all1=TRUE, degree2=0, ngrid1=ngrid1, type="response") plotmo(mod, pmethod="partdep", do.par=0, all1=TRUE, degree2=0, ngrid1=ngrid1, type="link") plot(mod, i.var=1, n.trees=n.trees, continuous.resolution=ngrid1) plot(mod, i.var=2, n.trees=n.trees, continuous.resolution=ngrid1) par(org.par) source("test.epilog.R") plotmo/inst/slowtests/test.plotmo3.Rout.save0000644000176200001440000014714115126336164021012 0ustar liggesusers> # test.plotmo3.R: extra tests for plotmo version 3 and higher > > source("test.prolog.R") > library(earth) Loading required package: Formula Loading required package: plotmo Loading required package: plotrix > data(ozone1) > data(etitanic) > options(warn=1) # print warnings as they occur > > # check check.numeric.scalar > > xtest <- NA > expect.err(try(plotmo:::check.numeric.scalar(xtest)), "'xtest' is NA") Error : 'xtest' is NA Got expected error from try(plotmo:::check.numeric.scalar(xtest)) > xtest <- NULL > expect.err(try(plotmo:::check.numeric.scalar(xtest)), "'xtest' is NULL") Error : 'xtest' is NULL Got expected error from try(plotmo:::check.numeric.scalar(xtest)) > expect.err(try(plotmo:::check.numeric.scalar(NA)), "argument is NA") Error : argument is NA Got expected error from try(plotmo:::check.numeric.scalar(NA)) > expect.err(try(plotmo:::check.numeric.scalar(NULL)), "argument is NULL") Error : argument is NULL Got expected error from try(plotmo:::check.numeric.scalar(NULL)) > expect.err(try(plotmo:::check.numeric.scalar(try)), "'try' must be numeric (whereas its current class is \"function\")") Error : 'try' must be numeric (whereas its current class is "function") Got expected error from try(plotmo:::check.numeric.scalar(try)) > expect.err(try(plotmo:::check.numeric.scalar('try')), "\"try\" must be numeric (whereas its current class is \"character\")") Error : "try" must be numeric (whereas its current class is "character") Got expected error from try(plotmo:::check.numeric.scalar("try")) > expect.err(try(plotmo:::check.numeric.scalar(NULL)), "argument is NULL") Error : argument is NULL Got expected error from try(plotmo:::check.numeric.scalar(NULL)) > expect.err(try(plotmo:::check.numeric.scalar(1234, min=2, max=3)), "argument=1234 but it should be between 2 and 3") Error : argument=1234 but it should be between 2 and 3 Got expected error from try(plotmo:::check.numeric.scalar(1234, min = 2, max = 3)) > expect.err(try(plotmo:::check.numeric.scalar(0.1234, min=2, max=3)), "argument=0.1234 but it should be between 2 and 3") Error : argument=0.1234 but it should be between 2 and 3 Got expected error from try(plotmo:::check.numeric.scalar(0.1234, min = 2, max = 3)) > > expect.err(try(plotmo:::check.numeric.scalar(.1234, min=2, max=3)), "argument=0.1234 but it should be between 2 and 3") Error : argument=0.1234 but it should be between 2 and 3 Got expected error from try(plotmo:::check.numeric.scalar(0.1234, min = 2, max = 3)) > expect.err(try(plotmo:::check.numeric.scalar(+1234, min=2, max=3)), "argument=1234 but it should be between 2 and 3") Error : argument=1234 but it should be between 2 and 3 Got expected error from try(plotmo:::check.numeric.scalar(+1234, min = 2, max = 3)) > expect.err(try(plotmo:::check.numeric.scalar(-1234, min=2, max=3)), "argument=-1234 but it should be between 2 and 3") Error : argument=-1234 but it should be between 2 and 3 Got expected error from try(plotmo:::check.numeric.scalar(-1234, min = 2, max = 3)) > expect.err(try(plotmo:::check.numeric.scalar(+.1234, min=2, max=3)), "argument=0.1234 but it should be between 2 and 3") Error : argument=0.1234 but it should be between 2 and 3 Got expected error from try(plotmo:::check.numeric.scalar(+0.1234, min = 2, max = 3)) > expect.err(try(plotmo:::check.numeric.scalar(-.1234, min=2, max=3)), "argument=-0.1234 but it should be between 2 and 3") Error : argument=-0.1234 but it should be between 2 and 3 Got expected error from try(plotmo:::check.numeric.scalar(-0.1234, min = 2, max = 3)) > expect.err(try(plotmo:::check.numeric.scalar("", min=0, max=3)), "\"\" must be numeric (whereas its current class is \"character\"") Error : "" must be numeric (whereas its current class is "character") Got expected error from try(plotmo:::check.numeric.scalar("", min = 0, max = 3)) > > x.numeric.scalar <- 1234 > expect.err(try(plotmo:::check.numeric.scalar(x.numeric.scalar, min=0, max=3)), "x.numeric.scalar=1234 but it should be between 0 and 3") Error : x.numeric.scalar=1234 but it should be between 0 and 3 Got expected error from try(plotmo:::check.numeric.scalar(x.numeric.scalar, min = 0, max = 3)) > stopifnot(identical(plotmo:::check.numeric.scalar(x.numeric.scalar, min=2, max=1235), 1234)) > stopifnot(identical(plotmo:::check.numeric.scalar(1234, min=2, max=1235), 1234)) > > # check check.integer.scalar > > xtest <- NA > expect.err(try(plotmo:::check.integer.scalar(xtest)), "'xtest' is NA") Error : 'xtest' is NA Got expected error from try(plotmo:::check.integer.scalar(xtest)) > xtest <- NULL > expect.err(try(plotmo:::check.integer.scalar(xtest)), "'xtest' is NULL") Error : 'xtest' is NULL Got expected error from try(plotmo:::check.integer.scalar(xtest)) > expect.err(try(plotmo:::check.integer.scalar(NA)), "argument is NA") Error : argument is NA Got expected error from try(plotmo:::check.integer.scalar(NA)) > expect.err(try(plotmo:::check.integer.scalar(NA, null.ok=TRUE)), "argument is NA") Error : argument is NA Got expected error from try(plotmo:::check.integer.scalar(NA, null.ok = TRUE)) > expect.err(try(plotmo:::check.integer.scalar(NULL)), "argument is NULL") Error : argument is NULL Got expected error from try(plotmo:::check.integer.scalar(NULL)) > expect.err(try(plotmo:::check.integer.scalar(xtest, na.ok=TRUE)), "'xtest' is NULL") Error : 'xtest' is NULL Got expected error from try(plotmo:::check.integer.scalar(xtest, na.ok = TRUE)) > expect.err(try(plotmo:::check.integer.scalar("xyz", na.ok=TRUE)), "\"xyz\" is a string but it should be an integer, or NA, or TRUE or FALSE") Error : "xyz" is a string but it should be an integer, or NA, or TRUE or FALSE Got expected error from try(plotmo:::check.integer.scalar("xyz", na.ok = TRUE)) > expect.err(try(plotmo:::check.integer.scalar("TRUE", na.ok=TRUE)), "\"TRUE\" is a string but it should be an integer, or NA, or TRUE or FALSE") Error : "TRUE" is a string but it should be an integer, or NA, or TRUE or FALSE Got expected error from try(plotmo:::check.integer.scalar("TRUE", na.ok = TRUE)) > stopifnot(identical(plotmo:::check.integer.scalar(TRUE), TRUE)) > stopifnot(identical(plotmo:::check.integer.scalar(NA, na.ok=TRUE), NA)) > x.integer.scalar <- 1234L > expect.err(try(plotmo:::check.integer.scalar(x.integer.scalar, min=0, max=3)), "x.integer.scalar=1234 but it should be between 0 and 3") Error : x.integer.scalar=1234 but it should be between 0 and 3 Got expected error from try(plotmo:::check.integer.scalar(x.integer.scalar, min = 0, max = 3)) > stopifnot(identical(plotmo:::check.integer.scalar(x.integer.scalar, min=2, max=1235), 1234L)) > stopifnot(identical(plotmo:::check.integer.scalar(1234, min=2, max=1235), 1234)) > stopifnot(identical(plotmo:::check.integer.scalar(x.integer.scalar, min=2, max=1235), 1234L)) > stopifnot(identical(plotmo:::check.integer.scalar(1234, min=2, max=1235), 1234)) > xtest <- 1.234 > expect.err(try(plotmo:::check.integer.scalar(xtest, min=0, max=3)), "xtest=1.234 but it should be an integer, or TRUE or FALSE") Error : xtest=1.234 but it should be an integer, or TRUE or FALSE Got expected error from try(plotmo:::check.integer.scalar(xtest, min = 0, max = 3)) > > # check check.vec > xtest <- "x" > expect.err(try(plotmo:::check.vec(xtest, "xtest", na.ok=TRUE)), "'xtest' is not numeric") Error : 'xtest' is not numeric Got expected error from try(plotmo:::check.vec(xtest, "xtest", na.ok = TRUE)) > xtest <- as.double(NA) > print(plotmo:::check.vec(xtest, "xtest", na.ok=TRUE)) NULL > xtest <- as.double(1:3) > print(plotmo:::check.vec(xtest, "xtest", na.ok=TRUE)) NULL > xtest <- c(1,2,3,1/0,5,6,7) > expect.err(try(plotmo:::check.vec(xtest, "xtest", na.ok=TRUE)), "non-finite value in xtest") Error : non-finite value in xtest xtest[4] is Inf Got expected error from try(plotmo:::check.vec(xtest, "xtest", na.ok = TRUE)) > xtest <- c(1,2,3,NA,5,6,7) > expect.err(try(plotmo:::check.vec(xtest, "xtest")), "NA in xtest") Error : NA in xtest xtest[4] is NA Got expected error from try(plotmo:::check.vec(xtest, "xtest")) > xtest <- c(1,2,3) > expect.err(try(plotmo:::check.vec(xtest, "xtest", expected.len=2)), "'xtest' has the wrong length 3, expected 2") Error : 'xtest' has the wrong length 3, expected 2 Got expected error from try(plotmo:::check.vec(xtest, "xtest", expected.len = 2)) > print(plotmo:::check.vec(c(TRUE, FALSE), "c(TRUE, FALSE)")) NULL > > plotmo1 <- function(object, ..., trace=0, SHOWCALL=TRUE, caption=NULL) { + if(is.null(caption)) + caption <- paste(deparse(substitute(object)), collapse=" ") + call <- match.call(expand.dots=TRUE) + call <- strip.space(paste(deparse(substitute(call)), collapse=" ")) + printf("%s\n", call) + plotmo(object, trace=trace, SHOWCALL=SHOWCALL, caption=caption, ...) + } > plotres1 <- function(object, ..., trace=0, SHOWCALL=TRUE, caption=NULL) { + if(is.null(caption)) + caption <- paste(deparse(substitute(object)), collapse=" ") + call <- match.call(expand.dots=TRUE) + call <- strip.space(paste(deparse(substitute(call)), collapse=" ")) + printf("%s\n", call) + plotres(object, trace=trace, SHOWCALL=SHOWCALL, caption=caption, ...) + } > # basic tests of plotmo on abbreviated titanic data > > get.tita <- function() + { + tita <- etitanic + pclass <- as.character(tita$pclass) + # change the order of the factors so not alphabetical + pclass[pclass == "1st"] <- "first" + pclass[pclass == "2nd"] <- "class2" + pclass[pclass == "3rd"] <- "classthird" + tita$pclass <- factor(pclass, levels=c("class2", "classthird", "first")) + # log age is so we have a continuous predictor even when model is age~. + set.seed(2015) + tita$logage <- log(tita$age) + rnorm(nrow(tita)) + tita$parch <- NULL + # by=12 gives us a small fast model with an additive and a interaction term + tita[seq(1, nrow(etitanic), by=12), ] + } > tita <- get.tita() > > mod.lm.age <- lm(age~., data=tita) > plotmo1(mod.lm.age) plotmo1(object=mod.lm.age) plotmo grid: pclass survived sex sibsp logage classthird 0 male 0 3.06991 > plotmo1(mod.lm.age, level=.95) plotmo1(object=mod.lm.age,level=0.95) plotmo grid: pclass survived sex sibsp logage classthird 0 male 0 3.06991 > plotmo1(mod.lm.age, level=.95, col.resp=3) plotmo1(object=mod.lm.age,level=0.95,col.resp=3) plotmo grid: pclass survived sex sibsp logage classthird 0 male 0 3.06991 > > sexn <- as.numeric(tita$sex) > mod.lm.sexn <- lm(sexn~.-sex, data=tita) > plotmo1(mod.lm.sexn) plotmo1(object=mod.lm.sexn) plotmo grid: pclass survived sex age sibsp logage classthird 0 male 30 0 3.06991 > plotmo1(mod.lm.sexn, level=.95) plotmo1(object=mod.lm.sexn,level=0.95) plotmo grid: pclass survived sex age sibsp logage classthird 0 male 30 0 3.06991 > > set.seed(2020) > mod.earth.age <- earth(age~., data=tita, degree=2, nfold=3, ncross=3, varmod.method="lm") > plotmo1(mod.earth.age) plotmo1(object=mod.earth.age) plotmo grid: pclass survived sex sibsp logage classthird 0 male 0 3.06991 > plotmo1(mod.earth.age, level=.9, degree2=0) plotmo1(object=mod.earth.age,level=0.9,degree2=0) plotmo grid: pclass survived sex sibsp logage classthird 0 male 0 3.06991 > > # tita[,4] is age > set.seed(2020) > mod.earth.tita.age <- earth(tita[,-4], tita[,4], degree=2, nfold=3, ncross=3, trace=.5, varmod.method="lm") Model with pmethod="backward": GRSq 0.335 RSq 0.512 nterms 6 CV fold 1.1 CVRSq -0.047 n.oof 58 34% n.infold.nz 58 100% n.oof.nz 30 100% CV fold 1.2 CVRSq -0.022 n.oof 59 33% n.infold.nz 59 100% n.oof.nz 29 100% CV fold 1.3 CVRSq -0.045 n.oof 59 33% n.infold.nz 59 100% n.oof.nz 29 100% CV fold 2.1 CVRSq 0.133 n.oof 58 34% n.infold.nz 58 100% n.oof.nz 30 100% CV fold 2.2 CVRSq 0.338 n.oof 59 33% n.infold.nz 59 100% n.oof.nz 29 100% CV fold 2.3 CVRSq 0.149 n.oof 59 33% n.infold.nz 59 100% n.oof.nz 29 100% CV fold 3.1 CVRSq 0.419 n.oof 58 34% n.infold.nz 58 100% n.oof.nz 30 100% CV fold 3.2 CVRSq 0.107 n.oof 59 33% n.infold.nz 59 100% n.oof.nz 29 100% CV fold 3.3 CVRSq 0.307 n.oof 59 33% n.infold.nz 59 100% n.oof.nz 29 100% CV all CVRSq 0.149 n.infold.nz 88 100% varmod method="lm" rmethod="hc12" lambda=1 exponent=1 conv=1 clamp=0.1 minspan=-3: iter weight.ratio coefchange% (Intercept) tita[, 4] 1 1.4 0.0 13 -0.032 2 1.2 7.1 12 -0.018 3 1.3 3.0 13 -0.024 4 1.3 1.2 13 -0.022 5 1.3 0.5 13 -0.023 > cat("\nsummary(mod.earth.tita.age)\n") summary(mod.earth.tita.age) > print(summary(mod.earth.tita.age)) Call: earth(x=tita[,-4], y=tita[,4], trace=0.5, degree=2, nfold=3, ncross=3, varmod.method="lm") coefficients (Intercept) 25.664968 pclassfirst 9.028974 h(sibsp-1) -12.096706 h(1.68119-logage) -7.502937 sexmale * h(logage-2.48137) 5.062358 sibsp * h(logage-1.68119) 3.280947 Selected 6 of 14 terms, and 4 of 6 predictors Termination condition: Reached nk 21 Importance: logage, sexmale, pclassclassthird-unused, sibsp, pclassfirst, ... Number of terms at each degree of interaction: 1 3 2 GCV 174.7603 RSS 11022.31 GRSq 0.335155 RSq 0.5124778 CVRSq 0.1487371 Note: the cross-validation sd's below are standard deviations across folds Cross validation: nterms 3.89 sd 1.05 nvars 3.22 sd 0.97 CVRSq sd MaxErr sd 0.149 0.174 -39.1 32.3 varmod: method "lm" min.sd 1.49 iter.rsq 0.001 stddev of predictions: coefficients iter.stderr iter.stderr% (Intercept) 15.7287403 2.77398 18 tita[, 4] -0.0283536 0.0837154 295 mean smallest largest ratio 95% prediction interval 58.24711 55.23254 62.56685 1.13279 68% 80% 90% 95% response values in prediction interval 84 90 97 99 > plotmo1(mod.earth.tita.age) plotmo1(object=mod.earth.tita.age) plotmo grid: pclass survived sex sibsp logage classthird 0 male 0 3.06991 > plotmo1(mod.earth.tita.age, level=.9, degree2=0) plotmo1(object=mod.earth.tita.age,level=0.9,degree2=0) plotmo grid: pclass survived sex sibsp logage classthird 0 male 0 3.06991 > > set.seed(2020) > a.earth.sex <- earth(sex~., data=tita, degree=2, nfold=3, ncross=3, varmod.method="lm") > plotmo1(a.earth.sex) plotmo1(object=a.earth.sex) plotmo grid: pclass survived age sibsp logage classthird 0 30 0 3.06991 > plotmo1(a.earth.sex, level=.9) plotmo1(object=a.earth.sex,level=0.9) plotmo grid: pclass survived age sibsp logage classthird 0 30 0 3.06991 > plotmo1(a.earth.sex, type="class") plotmo1(object=a.earth.sex,type="class") plotmo grid: pclass survived age sibsp logage classthird 0 30 0 3.06991 > expect.err(try(plotmo1(a.earth.sex, level=.9, degree2=0, type="class")), "predicted values are strings") plotmo1(object=a.earth.sex,level=0.9,degree2=0,type="class") Error : the level argument is not allowed when the predicted values are strings Got expected error from try(plotmo1(a.earth.sex, level = 0.9, degree2 = 0, type = "class")) > > # tita[,3] is sex > set.seed(2020) > mod.earth.tita <- earth(tita[,-3], tita[,3], degree=2, nfold=3, ncross=3, varmod.method="lm") > plotmo1(mod.earth.tita) plotmo1(object=mod.earth.tita) plotmo grid: pclass survived age sibsp logage classthird 0 30 0 3.06991 > plotmo1(mod.earth.tita, level=.9, degree2=0) plotmo1(object=mod.earth.tita,level=0.9,degree2=0) plotmo grid: pclass survived age sibsp logage classthird 0 30 0 3.06991 > plotmo1(mod.earth.tita, type="class") plotmo1(object=mod.earth.tita,type="class") plotmo grid: pclass survived age sibsp logage classthird 0 30 0 3.06991 > expect.err(try(plotmo1(mod.earth.tita, level=.9, degree2=0, type="class")), "predicted values are strings") plotmo1(object=mod.earth.tita,level=0.9,degree2=0,type="class") Error : the level argument is not allowed when the predicted values are strings Got expected error from try(plotmo1(mod.earth.tita, level = 0.9, degree2 = 0, type = "class")) > > set.seed(2020) > mod.earth.sex <- earth(sex~., data=tita, degree=2, nfold=3, ncross=3, varmod.method="earth", glm=list(family=binomial)) Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred > plotmo1(mod.earth.sex) plotmo1(object=mod.earth.sex) plotmo grid: pclass survived age sibsp logage classthird 0 30 0 3.06991 > plotmo1(mod.earth.sex, type="link") plotmo1(object=mod.earth.sex,type="link") plotmo grid: pclass survived age sibsp logage classthird 0 30 0 3.06991 > plotmo1(mod.earth.sex, type="class") plotmo1(object=mod.earth.sex,type="class") plotmo grid: pclass survived age sibsp logage classthird 0 30 0 3.06991 > plotmo1(mod.earth.sex, level=.9, type="earth") plotmo1(object=mod.earth.sex,level=0.9,type="earth") plotmo grid: pclass survived age sibsp logage classthird 0 30 0 3.06991 > > # tita[,3] is sex > set.seed(2020) > mod.earth.tita <- earth(tita[,-3], tita[,3], degree=2, nfold=3, ncross=3, varmod.method="earth", glm=list(family=binomial)) Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred > plotmo1(mod.earth.tita) plotmo1(object=mod.earth.tita) plotmo grid: pclass survived age sibsp logage classthird 0 30 0 3.06991 > plotmo1(mod.earth.tita, type="link") plotmo1(object=mod.earth.tita,type="link") plotmo grid: pclass survived age sibsp logage classthird 0 30 0 3.06991 > plotmo1(mod.earth.tita, type="class") plotmo1(object=mod.earth.tita,type="class") plotmo grid: pclass survived age sibsp logage classthird 0 30 0 3.06991 > plotmo1(mod.earth.tita, level=.9, type="earth") plotmo1(object=mod.earth.tita,level=0.9,type="earth") plotmo grid: pclass survived age sibsp logage classthird 0 30 0 3.06991 > > # check factor handling when factors are not ordered alphabetically > tita.orgpclass <- etitanic[seq(1, nrow(etitanic), by=12), ] > tita <- get.tita() > tita$logage <- NULL > tita.orgpclass$parch <- NULL > stopifnot(names(tita.orgpclass) == names(tita)) > a.tita.orgpclass <- earth(pclass~., degree=2, data=tita.orgpclass) > a.tita <- earth(pclass~., degree=2, data=tita) > options(warn=2) # treat warnings as errors > expect.err(try(plotmo(a.tita)), "Defaulting to nresponse=1, see above messages") predict.earth[88,3]: class2 classthird first 1 0.3179514 0.3141272 0.36792134 2 0.3179514 0.3141272 0.36792134 3 0.2400614 0.6754849 0.08445368 ... 0.2180022 0.5645160 0.21748179 88 0.2400614 0.6754849 0.08445368 predict.earth returned multiple columns (see above) but nresponse is not specified Use the nresponse argument to specify a column. Example: nresponse=2 Example: nresponse="classthird" Error : (converted from warning) Defaulting to nresponse=1, see above messages Got expected error from try(plotmo(a.tita)) > options(warn=1) > # following two graphs should be identical > plotmo1(a.tita.orgpclass, nresponse="1st", all1=T, col.resp=3, type2="im") plotmo1(object=a.tita.orgpclass,nresponse="1st",all1=T,col.resp=3,type2="im") plotmo grid: survived sex age sibsp 0 male 30 0 > plotmo1(a.tita, nresponse="first", all1=T, col.resp=3, type2="im") plotmo1(object=a.tita,nresponse="first",all1=T,col.resp=3,type2="im") plotmo grid: survived sex age sibsp 0 male 30 0 > # following two graphs should be identical > plotmo1(a.tita.orgpclass, nresponse="2nd", all1=T) plotmo1(object=a.tita.orgpclass,nresponse="2nd",all1=T) plotmo grid: survived sex age sibsp 0 male 30 0 > plotmo1(a.tita, nresponse="class2", all1=T) plotmo1(object=a.tita,nresponse="class2",all1=T) plotmo grid: survived sex age sibsp 0 male 30 0 > > tita <- get.tita() > mod.earth.pclass <- earth(pclass~., data=tita, degree=2) > options(warn=2) # treat warnings as errors > expect.err(try(plotmo1(mod.earth.pclass)), "Defaulting to nresponse=1, see above messages") plotmo1(object=mod.earth.pclass) predict.earth[88,3]: class2 classthird first 1 0.3197580 0.2991394 0.3811026 2 0.3197580 0.2991394 0.3811026 3 0.2490258 0.6472095 0.1037648 ... 0.1984114 0.5220475 0.2795411 88 0.2490258 0.6472095 0.1037648 predict.earth returned multiple columns (see above) but nresponse is not specified Use the nresponse argument to specify a column. Example: nresponse=2 Example: nresponse="classthird" Error : (converted from warning) Defaulting to nresponse=1, see above messages Got expected error from try(plotmo1(mod.earth.pclass)) > options(warn=1) > plotmo1(mod.earth.pclass, nresponse="fi") plotmo1(object=mod.earth.pclass,nresponse="fi") plotmo grid: survived sex age sibsp logage 0 male 30 0 3.06991 > plotmo1(mod.earth.pclass, nresponse="first") plotmo1(object=mod.earth.pclass,nresponse="first") plotmo grid: survived sex age sibsp logage 0 male 30 0 3.06991 > plotmo1(mod.earth.pclass, nresponse=3) plotmo1(object=mod.earth.pclass,nresponse=3) plotmo grid: survived sex age sibsp logage 0 male 30 0 3.06991 > plotmo1(mod.earth.pclass, type="class") plotmo1(object=mod.earth.pclass,type="class") plotmo grid: survived sex age sibsp logage 0 male 30 0 3.06991 > plotmo1(mod.earth.pclass, nresponse=1, + type="class", grid.levels=list(sex="fem"), + smooth.col="indianred", smooth.lwd=2, + pt.col=as.numeric(tita$pclass)+1, + pt.pch=1) plotmo1(object=mod.earth.pclass,nresponse=1,type="class",grid.levels=list(sex="fem"),smooth.col="indianred",smooth.lwd=2,pt.col=as.numeric(tita$pclass)+1,pt.pch=1) plotmo grid: survived sex age sibsp logage 0 female 30 0 3.06991 > > # tita[,1] is pclass > mod.earth.tita <- earth(tita[,-1], tita[,1], degree=2) > options(warn=2) # treat warnings as errors > expect.err(try(plotmo1(mod.earth.tita)), "Defaulting to nresponse=1, see above messages") plotmo1(object=mod.earth.tita) predict.earth[88,3]: class2 classthird first 1 0.3197580 0.2991394 0.3811026 2 0.3197580 0.2991394 0.3811026 3 0.2490258 0.6472095 0.1037648 ... 0.1984114 0.5220475 0.2795411 88 0.2490258 0.6472095 0.1037648 predict.earth returned multiple columns (see above) but nresponse is not specified Use the nresponse argument to specify a column. Example: nresponse=2 Example: nresponse="classthird" Error : (converted from warning) Defaulting to nresponse=1, see above messages Got expected error from try(plotmo1(mod.earth.tita)) > options(warn=1) > plotmo1(mod.earth.tita, nresponse="first") plotmo1(object=mod.earth.tita,nresponse="first") plotmo grid: survived sex age sibsp logage 0 male 30 0 3.06991 > plotmo1(mod.earth.tita, type="class") plotmo1(object=mod.earth.tita,type="class") plotmo grid: survived sex age sibsp logage 0 male 30 0 3.06991 > > mod.earth.pclass2 <- earth(pclass~., data=tita, degree=2, glm=list(family=binomial)) > # expect.err(try(plotmo1(mod.earth.pclass2)), "nresponse is not specified") > plotmo1(mod.earth.pclass2, nresponse=3) plotmo1(object=mod.earth.pclass2,nresponse=3) plotmo grid: survived sex age sibsp logage 0 male 30 0 3.06991 > plotmo1(mod.earth.pclass2, type="link", nresponse=3) plotmo1(object=mod.earth.pclass2,type="link",nresponse=3) plotmo grid: survived sex age sibsp logage 0 male 30 0 3.06991 > plotmo1(mod.earth.pclass2, type="class") plotmo1(object=mod.earth.pclass2,type="class") plotmo grid: survived sex age sibsp logage 0 male 30 0 3.06991 > > # tita[,1] is pclass > mod.earth.tita <- earth(tita[,-1], tita[,1], degree=2, glm=list(family=binomial)) > plotmo1(mod.earth.tita, nresponse=3) plotmo1(object=mod.earth.tita,nresponse=3) plotmo grid: survived sex age sibsp logage 0 male 30 0 3.06991 > plotmo1(mod.earth.tita, type="link", nresponse=3) plotmo1(object=mod.earth.tita,type="link",nresponse=3) plotmo grid: survived sex age sibsp logage 0 male 30 0 3.06991 > plotmo1(mod.earth.tita, type="class") plotmo1(object=mod.earth.tita,type="class") plotmo grid: survived sex age sibsp logage 0 male 30 0 3.06991 > > # plotmo vignette examples > > # use a small set of variables for illustration > printf("library(earth)\n") library(earth) > library(earth) # for ozone1 data > data(ozone1) > oz <- ozone1[, c("O3", "humidity", "temp", "ibt")] > > lm.model.vignette <- lm(O3 ~ humidity + temp*ibt, data=oz) # linear model > plotmo1(lm.model.vignette, pt.col="gray", nrug=-1) plotmo1(object=lm.model.vignette,pt.col="gray",nrug=-1) plotmo grid: humidity temp ibt 64 62 167.5 > plotmo1(lm.model.vignette, level=.9) plotmo1(object=lm.model.vignette,level=0.9) plotmo grid: humidity temp ibt 64 62 167.5 > > printf("library(mda)\n") library(mda) > library(mda) Loading required package: class Loaded mda 0.5-5 > mars.model.vignette1 <- mars(oz[,-1], oz[,1], degree=2) > plotmo1(mars.model.vignette1) plotmo1(object=mars.model.vignette1) plotmo grid: humidity temp ibt 64 62 167.5 > plotres1(mars.model.vignette1) plotres1(object=mars.model.vignette1) > mars.model.vignette2 <- mars(oz[,-1,drop=FALSE], oz[,1,drop=FALSE], degree=2) > plotmo1(mars.model.vignette2) plotmo1(object=mars.model.vignette2) plotmo grid: humidity temp ibt 64 62 167.5 > # TODO causes Error in lm.fit(object$x, y, singular.ok = FALSE) : (list) object cannot be coerced to type 'double' > # although still works > # the error is mars.to.earth try(hatvalues.lm.fit(lm.fit(object$x, y, singular.ok=FALSE))) > plotres1(mars.model.vignette2, trace=1) plotres1(object=mars.model.vignette2,trace=1) stats::residuals(object=mars.object, type="response") stats::fitted(object=mars.object) got model response from getCall(object)$y calling mars.to.earth (needed for the model selection plot) training rsq 0.76 > > printf("library(rpart)\n") library(rpart) > library(rpart) # rpart > rpart.model.vignette <- rpart(O3 ~ ., data=oz) > plotmo1(rpart.model.vignette, all2=TRUE) plotmo1(object=rpart.model.vignette,all2=TRUE) plotmo grid: humidity temp ibt 64 62 167.5 > expect.err(try(plotmo1(rpart.model.vignette, level=.9)), "the level argument is not supported for \"rpart\" objects") plotmo1(object=rpart.model.vignette,level=0.9) Error : the level argument is not supported for "rpart" objects Got expected error from try(plotmo1(rpart.model.vignette, level = 0.9)) > > # commented out because is slow and already tested in test.non.earth.R > # printf("library(randomForest)\n") > # library(randomForest) # randomForest > # rf.model.vignette <- randomForest(O3~., data=oz) > # plotmo1(rf.model.vignette) > # partialPlot(rf.model.vignette, oz, temp) # compare to partial-dependence plot > > printf("library(gbm)\n") library(gbm) > library(gbm) # gbm Loaded gbm 2.2.2 This version of gbm is no longer under development. Consider transitioning to gbm3, https://github.com/gbm-developers/gbm3 > set.seed(2016) > gbm.model.vignette <- gbm(O3~., data=oz, dist="gaussian", inter=2, n.trees=100) > # commented out following because they always take the whole page > # plot(gbm.model.vignette, i.var=2) # compare to partial-dependence plots > # plot(gbm.model.vignette, i.var=c(2,3)) > set.seed(2016) > plotmo1(gbm.model.vignette, caption="gbm.model.vignette") plotmo1(object=gbm.model.vignette,caption="gbm.model.vignette") plotmo grid: humidity temp ibt 64 62 167.5 > > # commented out because is slow and already tested elsewhere > # printf("library(mgcv)\n") > # library(mgcv) # gam > # gam.model.vignette <- gam(O3 ~ s(humidity)+s(temp)+s(ibt)+s(temp,ibt), data=oz) > # plotmo1(gam.model.vignette, level=.95, all2=TRUE) > > printf("library(nnet)\n") library(nnet) > library(nnet) # nnet > set.seed(4) > nnet.model.vignette <- nnet(O3~., data=scale(oz), size=2, decay=0.01, trace=FALSE) > plotmo1(nnet.model.vignette, type="raw", all2=T) plotmo1(object=nnet.model.vignette,type="raw",all2=T) plotmo grid: humidity temp ibt 0.2954793 0.01697621 0.08267399 > > printf("library(MASS)\n") library(MASS) > library(MASS) # qda > lcush <- data.frame(Type=as.numeric(Cushings$Type),log(Cushings[,1:2])) > lcush <- lcush[1:21,] > qda.model.vignette <- qda(Type~., data=lcush) > plotmo1(qda.model.vignette, type="class", all2=TRUE, + type2="contour", ngrid2=100, contour.nlevels=2, contour.drawlabels=FALSE, + pt.col=as.numeric(lcush$Type)+1, + pt.pch=as.character(lcush$Type)) plotmo1(object=qda.model.vignette,type="class",all2=TRUE,type2="contour",ngrid2=100,contour.nlevels=2,contour.drawlabels=FALSE,pt.col=as.numeric(lcush$Type)+1,pt.pch=as.character(lcush$Type)) plotmo grid: Tetrahydrocortisone Pregnanetriol 2.04122 0.1823216 > > # miscellaneous other examples > > tita <- get.tita() > > mod.glm.sex <- glm(sex~., data=tita, family=binomial) > plotmo1(mod.glm.sex, pt.col=as.numeric(tita$pclass)+1, do.par=2) plotmo1(object=mod.glm.sex,pt.col=as.numeric(tita$pclass)+1,do.par=2) plotmo grid: pclass survived age sibsp logage classthird 0 30 0 3.06991 > empty.plot() > > # glm binomial model: compare error band on plotmo versus manual plot > > wasp <- read.table("darlingtonia.tab", header=T) > iorder = order(wasp$leafHeight, wasp$visited) > wasp = wasp[iorder,] > iseq = seq(1, nrow(wasp), by = 2) > dat = wasp[iseq, ] > newdat = wasp[iseq+1, ] > > print(summary(dat)) leafHeight visited Min. :14.0 Min. :0.0000 1st Qu.:32.0 1st Qu.:0.0000 Median :43.0 Median :0.0000 Mean :44.9 Mean :0.1905 3rd Qu.:58.0 3rd Qu.:0.0000 Max. :83.0 Max. :1.0000 > set.seed(2026) > mod <- glm(visited ~ leafHeight, data=dat, family=binomial()) > print(summary(mod)) Call: glm(formula = visited ~ leafHeight, family = binomial(), data = dat) Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) -4.71115 2.14347 -2.198 0.0280 * leafHeight 0.06385 0.03652 1.748 0.0805 . --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 (Dispersion parameter for binomial family taken to be 1) Null deviance: 20.450 on 20 degrees of freedom Residual deviance: 16.565 on 19 degrees of freedom AIC: 20.565 Number of Fisher Scoring iterations: 5 > set.seed(2026) > level95 = .95 > plotmo(mod, do.par=FALSE, trace=2, + level=level95, level.shade="lightgray", + # nrug=TRUE, + grid.col="lightgray", + pt.col=ifelse(dat$visited, "pink", "lightgreen"), jitter=0.1, + main="plotmo: visited vs leafHeight") plotmo trace 2: plotmo(object=mod, pt.col=ifelse(dat$visited,"pink","lightgreen"), jitter=0.1, level=level95, grid.col="lightgray", do.par=FALSE, trace=2, level.shade="lightgray", main="plotmo: visited vs leafHeight") --get.model.env for object with class glm object call is glm(formula=visited~leafHeight, family=binomial(), data=dat) using the environment saved in $terms of the glm model: R_GlobalEnv --plotmo_prolog for glm object 'mod' --plotmo_x for glm object get.object.x: object$x is NULL (and it has no colnames) object call is glm(formula=visited~leafHeight, family=binomial(), data=dat) get.x.from.model.frame: formula(object) is visited ~ leafHeight naked formula is the same formula is valid, now looking for data for the model.frame object$model is usable and has column names visited leafHeight x=model.frame[,-1] is usable and has column name leafHeight plotmo_x returned[21,1]: leafHeight 42 14 11 18 41 20 ... 29 26 83 ----Metadata: plotmo_predict with nresponse=NULL and newdata=NULL plotmo_predict with NULL newdata (nrows=3), using plotmo_x to get the data --plotmo_x for glm object get.object.x: object$x is NULL (and it has no colnames) object call is glm(formula=visited~leafHeight, family=binomial(), data=dat) get.x.from.model.frame: formula(object) is visited ~ leafHeight naked formula is the same formula is valid, now looking for data for the model.frame object$model is usable and has column names visited leafHeight x=model.frame[,-1] is usable and has column name leafHeight plotmo_x returned[21,1]: leafHeight 42 14 11 18 41 20 ... 29 26 83 will use the above data instead of newdata=NULL for predict.glm stats::predict(glm.object, data.frame[3,1], type="response") predict returned[3,1] with no column names: 42 0.02151400 11 0.02760091 41 0.03124279 predict after processing with nresponse=NULL is [3,1] with no column names: 42 0.02151400 11 0.02760091 41 0.03124279 ----Metadata: plotmo_fitted with nresponse=NULL stats::fitted(object=glm.object) fitted(object) returned[21,1] with no column names: 42 0.02151400 11 0.02760091 41 0.03124279 ... 0.05418670 26 0.64292551 fitted(object) after processing with nresponse=NULL is [21,1] with no column names: 42 0.02151400 11 0.02760091 41 0.03124279 ... 0.05418670 26 0.64292551 ----Metadata: plotmo_y with nresponse=NULL --plotmo_y with nresponse=NULL for glm object get.object.y: object$y is usable but without colnames so we will keep on searching object call is glm(formula=visited~leafHeight, family=binomial(), data=dat) get.y.from.model.frame: formula(object) is visited ~ leafHeight formula is valid, now looking for data for the model.frame object$model is usable and has column names visited leafHeight y=model.frame[,1] is usable and has column name visited plotmo_y returned[21,1]: visited 42 0 11 0 41 0 ... 0 26 0 plotmo_y after processing with nresponse=NULL is [21,1]: visited 42 0 11 0 41 0 ... 0 26 0 converted nresponse=NA to nresponse=1 nresponse=1 (was NA) ncol(fitted) 1 ncol(predict) 1 ncol(y) 1 ----Metadata: plotmo_y with nresponse=1 --plotmo_y with nresponse=1 for glm object get.object.y: object$y is usable but without colnames so we will keep on searching object call is glm(formula=visited~leafHeight, family=binomial(), data=dat) get.y.from.model.frame: formula(object) is visited ~ leafHeight formula is valid, now looking for data for the model.frame object$model is usable and has column names visited leafHeight y=model.frame[,1] is usable and has column name visited got model response from object$model plotmo_y returned[21,1]: visited 42 0 11 0 41 0 ... 0 26 0 plotmo_y after processing with nresponse=1 is [21,1]: visited 1 0 2 0 3 0 ... 0 21 0 got response name "visited" from yfull resp.levs is NULL ----Metadata: done number of x values: leafHeight 21 ----plotmo_singles for glm object singles: 1 leafHeight ----plotmo_pairs for glm object formula(object) returned visited ~ leafHeight formula.vars "leafHeight" term.labels "leafHeight" plotmo_pairs_from_term_labels term.labels: "leafHeight" "leafHeight" pred.names: "leafHeight" considering leafHeight considering leafHeight no pairs ----Figuring out ylim ylim c(-0.1, 1.1) clip TRUE --plot.degree1(draw.plot=TRUE) degree1 plot1 (pmethod "plotmo") variable leafHeight newdata[50,1]: leafHeight 1 14.00000 2 15.40816 3 16.81633 ... 18.22449 50 83.00000 stats::predict(glm.object, data.frame[50,1], type="response") predict returned[50,1] with no column names: 1 0.02151400 2 0.02349031 3 0.02564341 ... 0.02798820 50 0.64292551 predict after processing with nresponse=1 is [50,1]: predict 1 0.02151400 2 0.02349031 3 0.02564341 ... 0.02798820 50 0.64292551 plotmo_pint for glm object plotmo: plot_degree1: get.degree1.data: plotmo_pint: plotmo.pint: plotmo.pint.glm: get.quant_plotmo2(level 0.95 df 19) level2 0.975 quant 2.09302 Warning: the level argument may not work correctly on glm objects built with weights prediction intervals[50,2]: cint.lwr cint.upr 1 0.0006797761 0.4154360 2 0.0008215046 0.4130813 3 0.0009922489 0.4108536 ... 0.0011977732 0.4087640 50 0.1370955421 0.9532826 graphics::plot.default(x=c(14,15.41,16.8...), y=c(0.0215,0.0235...), type="n", main="plotmo: visited vs leafHeight", xlab="", ylab="", xaxt="s", yaxt="s", xlim=c(13.99,83.01), ylim=c(-0.1,1.1)) Will shift and scale displayed points specified by pt.col: yshift -0 yscale 1 > > # wrong error bars (used prior to plotmo 3.7.0) > pred = predict(mod, newdata=newdat, type='response', se.fit=TRUE) > yhat = pred$fit > wrong_se = pred$se.fit > wrong_lwr = yhat - (2 * wrong_se) > wrong_upr = yhat + (2 * wrong_se) > points(newdat$leafHeight, wrong_lwr, pch=".", col="red") > points(newdat$leafHeight, wrong_upr, pch=".",, col="red") > > # correct error bars (fixed in plotmo 3.7.0) > ilink = family(mod)$linkinv > pred_link = predict(mod, newdata=newdat, type="link", se.fit=TRUE) > q = qt((1 - level95) / 2, df = df.residual(mod), lower.tail = FALSE) > printf("darlingtonia: level95 %.4f q %.4f\n", level95, q) darlingtonia: level95 0.9500 q 2.0930 > lwr = ilink(pred_link$fit - (q * pred_link$se.fit)) > upr = ilink(pred_link$fit + (q * pred_link$se.fit)) > > points(newdat$leafHeight, lwr, pch="o") > points(newdat$leafHeight, upr, pch="o") > > legend(x="topleft", + legend=c("correct (plotmo 3.7.0)", "incorrect (prior to plotmo 3.7.0)"), + col=c(1,2), + pch=sprintf("%s%s", "o", ".")) > > plot(newdat$leafHeight, yhat, type="l", main="manual: visited vs leafHeight", + xlim=c(15,80), ylim=c(-.05,1.1)) > points(newdat$leafHeight, lwr, pch="o") > points(newdat$leafHeight, upr, pch="o") > > # tita[,4] is age, tita[,1] is pclass > printf("library(lars)\n") library(lars) > library(lars) Loaded lars 1.3 > set.seed(2015) > xmat <- as.matrix(tita[,c(2,5,6)]) > mod.lars.xmat <- lars(xmat, tita[,4]) > par(mfrow=c(2,2)) > plot(mod.lars.xmat) > plotmo1(mod.lars.xmat, nresponse=4, do.par=F) plotmo1(object=mod.lars.xmat,nresponse=4,do.par=F) plotmo grid: survived sibsp logage 0 0 3.06991 > plotres(mod.lars.xmat, trace=0, nresponse=4) > > if(0) { # TODO fails with R-3.4.2: object '.QP_qpgen2' not found + printf("library(cosso)\n") + library(cosso) + set.seed(2016) + cosso <- cosso(xmat,tita[,4],family="Gaussian") + # TODO tell maintainer of cosso that you have to do this + class(cosso) <- "cosso" + set.seed(2016) + plotmo1(cosso) + set.seed(2016) + plotres(cosso) + } > # examples from James, Witten, et al. ISLR book > # I tested all models in their scripts manually. > # All worked except for exceptions below. > > printf("library(pls)\n") library(pls) > library(pls) Attaching package: 'pls' The following object is masked from 'package:stats': loadings > printf("library(ISLR)\n") library(ISLR) > library(ISLR) > Hitters=na.omit(Hitters) > > set.seed(1) > x <- model.matrix(Salary~.,Hitters)[,-1] > y <- Hitters$Salary > train=sample(1:nrow(x), nrow(x)/2) > pcr.fit1=pcr(Salary~., data=Hitters,subset=train,scale=TRUE, validation="CV") > plotmo1(pcr.fit1, nresponse=10) plotmo1(object=pcr.fit1,nresponse=10) plotmo grid: AtBat Hits HmRun Runs RBI Walks Years CAtBat CHits CHmRun 394 102 8 50 44 36 6 1931 510 36 CRuns CRBI CWalks League Division PutOuts Assists Errors NewLeague 246 219 172 A W 211 56 7 A > > # set.seed(1) > # x <- model.matrix(Salary~.,Hitters)[,-1] > # y <- Hitters$Salary > # train=sample(1:nrow(x), nrow(x)/2) > # pcr.fit2=pcr(y~x,scale=TRUE,ncomp=7) > # # TODO following gives Error: predictions returned the wrong length (got 263 but expected 50) > # plotmo1(pcr.fit2, nresponse=5) > > library(splines) > fit.lm2=lm(wage~bs(age,knots=c(25,40,60)),data=Wage) > par(mfrow=c(1,2),mar=c(4.5,4.5,1,1),oma=c(0,0,4,0)) > agelims=range(Wage$age) > age.grid=seq(from=agelims[1],to=agelims[2]) > pred=predict(fit.lm2,newdata=list(age=age.grid),se=T) > plot(Wage$age,Wage$wage,col="gray", ylim=c(0,320)) > lines(age.grid,pred$fit,lwd=2) > lines(age.grid,pred$fit+2*pred$se,lty="dashed") > lines(age.grid,pred$fit-2*pred$se,lty="dashed") > fit.lm2=lm(wage~bs(age,knots=c(25,40,60)),data=Wage,model=F) # TODO delete > plotmo1(fit.lm2, col.resp=2, do.par=F, level=.95, ylim=c(0,320), + nrug=TRUE, caption="fit.lm2", ylab="wage") plotmo1(object=fit.lm2,col.resp=2,do.par=F,level=0.95,ylim=c(0,320),nrug=TRUE,ylab="wage",caption="fit.lm2") > > fit.glm2 <- glm(I(wage>250)~poly(age,4),data=Wage,family=binomial) > par(mfrow=c(1,2),mar=c(4.5,4.5,1,1),oma=c(0,0,4,0)) > agelims=range(Wage$age) > age.grid=seq(from=agelims[1],to=agelims[2]) > # their plot > preds=predict(fit.glm2,newdata=list(age=age.grid),se=T) > pfit=exp(preds$fit)/(1+exp(preds$fit)) > se.bands.logit = cbind(preds$fit+2*preds$se.fit, preds$fit-2*preds$se.fit) > se.bands = exp(se.bands.logit)/(1+exp(se.bands.logit)) > preds=predict(fit.glm2,newdata=list(age=age.grid),type="response",se=T) > plot(Wage$age,I(Wage$wage>250),xlim=agelims,type="n",ylim=c(0,.2)) > points(jitter(Wage$age), I((Wage$wage>250)/5),cex=.5,pch="|",col="darkgrey") > lines(age.grid,pfit,lwd=2, col="blue") > matlines(age.grid,se.bands,lwd=1,col="blue",lty=3) > # plotmo plot, side by side > # TODO Warning: the level argument may not be properly supported on glm objects built with weights > plotmo1(fit.glm2, level=.95, degree1.col="blue", ylim=c(0,.2), do.par=FALSE, nrug=-1, caption="fit.glm2", ylab="I(wage > 250)") plotmo1(object=fit.glm2,level=0.95,degree1.col="blue",ylim=c(0,0.2),do.par=FALSE,nrug=-1,ylab="I(wage>250)",caption="fit.glm2") Warning: the level argument may not work correctly on glm objects built with weights > > # Test deparsing of the formula in plotmo.pairs.default > # TODO Height is included in the plots even though formula says -Height > Height2 <- trees$Height^2 > a <- lm(Volume~(Girth*Height2)-Height, data=trees, x=TRUE, model=FALSE) > plotmo(a) plotmo grid: Girth Height2 Height 12.9 5776 76 > > # test "the variable on the right side of the formula is a matrix or data.frame" > # TODO would like to solve this problem > > options(warn=2) > data(gasoline, package="pls") > earth.octane <- earth(octane ~ NIR, data=gasoline) > print(summary(earth.octane)) # ok Call: earth(formula=octane~NIR, data=gasoline) coefficients (Intercept) 87.818970 h(NIR1016 nm- -0.050322) -307.631441 h(NIR1036 nm- -0.060936) 83.025904 h(NIR1054 nm- -0.059068) 254.542458 h(NIR1134 nm-0.028475) 34.069219 h(0.484052-NIR1194 nm) -45.522897 h(NIR1194 nm-0.484052) 50.623858 h(0.25499-NIR1208 nm) 81.506833 h(NIR1208 nm-0.25499) -92.719551 h(NIR1686 nm-1.25012) -7.936903 h(1.27324-NIR1690 nm) 3.531658 Selected 11 of 12 terms, and 8 of 401 predictors Termination condition: RSq changed by less than 0.001 at 12 terms Importance: NIR1208 nm, NIR1194 nm, NIR1134 nm, NIR1690 nm, NIR1016 nm, ... Number of terms at each degree of interaction: 1 10 (additive model) GCV 0.05120795 RSS 1.298122 GRSq 0.9784914 RSq 0.990602 > plotres(earth.octane) # ok > expect.err(try(plotmo(earth.octane)), "the variable on the right side of the formula is a matrix or data.frame") Error : (converted from warning) the variable on the right side of the formula is a matrix or data.frame plotmo often cannot process such variables Got expected error from try(plotmo(earth.octane)) > options(warn=1) > > # TODO May 2020 'ElemStatLearn' is not available (for R version 4.0.0) > # library(ElemStatLearn) > # x <- mixture.example$x > # g <- mixture.example$y > # lm.mixture.example <- lm(g ~ x) > # options(warn=2) > # expect.err(try(plotmo(lm.mixture.example)), "the variable on the right side of the formula is a matrix or data.frame") > # options(warn=1) > > # test variable names with $ are not supported > > a <- earth(O3~ozone1$doy, data=ozone1) > expect.err(try(plotmo(a)), "cannot get the original model predictors") Warning: "$" in the formula is not supported by plotmo, will try to get the data elsewhere formula: ozone1$doy Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: formula(object): "$" in formula is not allowed (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(plotmo(a)) > > a <- earth(O3~ozone1$doy + temp, data=ozone1) > expect.err(try(plotmo(a)), "cannot get the original model predictors") Warning: "$" in the formula is not supported by plotmo, will try to get the data elsewhere formula: ozone1$doy + temp Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: formula(object): "$" in formula is not allowed (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(plotmo(a)) > > a <- lm(O3~ozone1$doy, data=ozone1) > expect.err(try(plotmo(a)), "cannot get the original model predictors") Warning: "$" in the formula is not supported by plotmo, will try to get the data elsewhere formula: ozone1$doy Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: formula(object): "$" in formula is not allowed (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(plotmo(a)) > > a <- lm(O3~ozone1$doy + temp, data=ozone1) > expect.err(try(plotmo(a)), "cannot get the original model predictors") Warning: "$" in the formula is not supported by plotmo, will try to get the data elsewhere formula: ozone1$doy + temp Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: formula(object): "$" in formula is not allowed (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(plotmo(a)) > > #--- test interaction of w1. and non w1 args ------------------------------------- > > par(mfrow=c(4,3), mar=c(3, 3, 4, 1), mgp=c(2, 0.6, 0)) > > mod78 <- earth(Volume ~ ., data = trees) > par(mfrow=c(3,4), mar=c(3, 3, 3, 1), mgp=c(2, 0.6, 0)) > > # multiple which, earth model > plotres(mod78, cex.main=1, + ylim=c(-.5, .8), xlim=c(-2, 7), col=2:3, do.par=FALSE, + w1.main=c("ylim=c(-.5, .8)\nxlim=c(-2, 7) col=2:3")) > > # multiple which, earth model > plotres(mod78, cex.main=.7, + w1.ylim=c(-.5, .8), w1.xlim=c(-2, 7), col=2:3, do.par=FALSE, + ylim=c(-10,10), xlim=c(-30, 100), + w1.main=c("w1.ylim=c(-.5, .8) w1.xlim=c(-2, 7)\nylim=c(-10,10), xlim=c(-30, 100)")) > par(org.par) > > par(mfrow=c(3,4), mar=c(3, 3, 3, 1), mgp=c(2, 0.6, 0)) > > # which=1, earth model > > plotres(mod78, which=1, cex.main=.8, + col=2:3, + main="which=1, no other ylim args", + w1.main="which=1, no other ylim args") > > plotres(mod78, which=1, cex.main=.8, + col=2:3, w1.ylim=c(.3,.98), w1.xlim=c(-2, 7), + main="w1.ylim=c(.3,.98)\nw1.xlim=c(-2, 7)") > > plotres(mod78, which=1, cex.main=.8, + col=2:3, ylim=c(.3,.98), xlim=c(-2, 7), + main="ylim=c(.3,.98)\nxlim=c(-2, 7)") # ylim gets passed to modsel > > plotres(mod78, which=1, cex.main=.75, + col=2:3, w1.ylim=c(.3,.98), ylim=c(-.5,.5), + w1.xlim=c(-2, 7), xlim=c(-90, 90), + main="w1.ylim=c(.3,.98), ylim=c(-.5,.5)\nw1.xlim=c(-2, 7), xlim=c(-90, 90)") # ignore ylim > > # which=3, earth model > plotres(mod78, which=3, cex.main=1, + col=2:3, + main="which=3, no other ylim args") > > plotres(mod78, which=3, cex.main=1, + col=2:3, w1.ylim=c(.3,.98), w1.xlim=c(-2, 7), + main="w1.ylim=c(.3,.98)\nw1.xlim=c(-2, 7)") # not usual, ignore w1.ylim > > plotres(mod78, which=3, cex.main=1, + col=2:3, ylim=c(-10,10), xlim=c(-90,90), + main="which=3, ylim=c(-10,10)\nxlim=c(-90,90)") > > plotres(mod78, which=3, cex.main=1, + col=2:3, w1.ylim=c(.3,.98), ylim=c(-10,10), w1.xlim=c(-2, 7), xlim=c(-90,90), + main="w1.ylim=c(.3,.98) ylim=c(-10,10)\nw1.xlim=c(-2, 7), xlim=c(-90,90)") > > par(org.par) > > nullarg <- NULL > expect.err(try(plotmo(nullarg)), "argument 'nullarg' is NULL") Error : argument 'nullarg' is NULL Got expected error from try(plotmo(nullarg)) > expect.err(try(plotmo(NULL)), "argument 'NULL' is NULL") Error : argument 'NULL' is NULL Got expected error from try(plotmo(NULL)) > expect.err(try(plotmo(0)), "'0' is not an S3 model") Error : '0' is not an S3 model Got expected error from try(plotmo(0)) > expect.err(try(plotmo(list(1,2))), "'list(1, 2)' is a plain list, not an S3 model") Error : 'list(1, 2)' is a plain list, not an S3 model Got expected error from try(plotmo(list(1, 2))) > expect.err(try(plotmo(list(1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0))), + "object is a plain list, not an S3 model") Error : object is a plain list, not an S3 model Got expected error from try(plotmo(list(1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0))) > > source("test.epilog.R") plotmo/inst/slowtests/test.center.Rout.save0000644000176200001440000001277714563614021020676 0ustar liggesusers> # test.center.R: test plotmo's center and ndiscrete args > # Stephen Milborrow, Berea Apr 2011 > > source("test.prolog.R") > library(rpart.plot) Loading required package: rpart > library(plotmo) Loading required package: Formula Loading required package: plotrix > library(earth) > data(etitanic) > > et <- etitanic[, c("survived", "pclass", "sex", "age")] > et$pclassn <- as.numeric(et$pclass) > et <- et[c(30:80,330:380,630:680), ] > > par(mfrow=c(3,3)) > par(mar=c(3, 3.5, 3, 0.5)) > par(mgp=c(1.5, .5, 0)) > > ndiscrete <- 0 > > #--- row 1 > > set.seed(844) > a1 <- lm(survived~pclassn+sex, data=et) > plotmo(a1, all2=T, do.par=F, degree1=NA, degree2=1, center=TRUE, clip=F, + main="a1: survived~pclassn+sex\n(default ndiscrete)", + pt.col=ifelse(et$survived, "black", "red"), + pt.pch=".", pt.cex=2.5, lab=c(1,1,1)) > > set.seed(844) > plotmo(a1, degree1=1, all2=T, degree2=0, do.par=F, xflip=T, center=TRUE, clip=F, + grid.levels=list(sex="f"), ndiscrete=ndiscrete, + main="pclassn with sex=\"female\"", + smooth.col="lightblue", smooth.lwd=2, + pt.col=ifelse(et$survived, "black", "red"), + pt.pch=".", pt.cex=2.5) plotmo grid: pclassn sex 2 female > > set.seed(844) > plotmo(a1, degree1=1, all2=T, degree2=0, do.par=F, xflip=T, center=TRUE, clip=F, + grid.levels=list(sex="m"), ndiscrete=ndiscrete, + main="pclassn with sex=\"male\"", + smooth.col="lightblue", smooth.lwd=2, + pt.col=ifelse(et$survived, "black", "red"), + pt.pch=".", pt.cex=2.5) plotmo grid: pclassn sex 2 male > > #--- row 2 > > a2 <- lm(survived~pclassn*sex, data=et) > set.seed(844) > plotmo(a2, all2=T, do.par=F, degree2=1, degree1=0, center=TRUE, clip=F, + main="a2: survived~pclassn*sex\n(default ndiscrete)") > > set.seed(844) > plotmo(a2, degree1=1, all2=T, degree2=0, do.par=F, xflip=T, center=TRUE, clip=F, + grid.levels=list(sex="f"), ndiscrete=ndiscrete, + main="pclassn with sex=\"female\"", + smooth.col="lightblue", smooth.lwd=2, + pt.col=ifelse(et$survived, "black", "red"), + pt.pch=".", pt.cex=2.5) plotmo grid: pclassn sex 2 female > > set.seed(844) > plotmo(a2, degree1=1, all2=T, degree2=0, do.par=F, xflip=T, center=TRUE, clip=F, + grid.levels=list(sex="m"), ndiscrete=ndiscrete, + main="pclassn with sex=\"male\"", + smooth.col="lightblue", smooth.lwd=2, + pt.col=ifelse(et$survived, "black", "red"), + pt.pch=".", pt.cex=2.5) plotmo grid: pclassn sex 2 male > > #--- row 3 > > par(mfg=c(3,2)) > a3 <- lm(survived~pclassn, data=et) > set.seed(844) > plotmo(a3, do.par=F, xflip=T, center=TRUE, clip=F, ndiscrete=ndiscrete, + main="a3: survived~pclassn", degree1.col=1, + smooth.col="lightblue", smooth.lwd=2, + pt.col=ifelse(et$survived, "black", "red"), + pt.pch=".", pt.cex=2.5) > > plot(0, 0, type="n", axes=FALSE, xlab="", ylab="") > > #--- row 1 > > # note that this is an example of a model that gets generated differently > # with Scale.y=TRUE vs Scale.y=FALSE (although not shown here) > a4 <- earth(survived~pclassn+age, data=et, degree=2) > > set.seed(844) > plotmo(a4, do.par=F, center=TRUE, clip=F, ylim=c(-.6,.7), + main="earth: survived~pclassn+age\n(default ndiscrete)", degree1=0, all2=T) > > set.seed(844) > plotmo(a4, do.par=F, xflip=F, all1=T, center=TRUE, clip=F, ylim=c(-.6,.7), + main="a4, age with pclassn=1st", ndiscrete=ndiscrete, + degree2=0, degree1=2, + # grid.levels=list(pclassn="1st"), + grid.levels=list(pclassn=1), + smooth.col="lightblue", smooth.lwd=2, + pt.col=ifelse(et$survived, "black", "red"), + pt.pch=".", pt.cex=2.5) plotmo grid: pclassn age 1 29 > > set.seed(844) > plotmo(a4, do.par=F, xflip=F, all1=T, center=TRUE, clip=F, ylim=c(-.6,.7), + main="age with pclassn=3rd", ndiscrete=ndiscrete, + degree2=0, degree1=2, + grid.levels=list(pclassn=3), + smooth.col="lightblue", smooth.lwd=2, + pt.col=ifelse(et$survived, "black", "red"), + pt.pch=".", pt.cex=2.5) plotmo grid: pclassn age 3 29 > > #--- row 2 > > set.seed(844) > plotmo(a4, do.par=F, center=TRUE, clip=F, type2="im", + main="a4 earth: survived~pclassn+age\n(default ndiscrete)", degree1=0, all2=T, yflip=T, + pt.col=ifelse(et$survived, 1, "red"), + image.col=gray(seq(6, 10, length=10) / 10), xflip=T, + pt.pch=".", pt.cex=2) > > set.seed(844) > plotmo(a4, do.par=F, xflip=F, all1=T, center=TRUE, clip=F, + main="pclassn with age=10", ndiscrete=ndiscrete, + degree2=0, degree1=1, + grid.levels=list(age=10), + smooth.col="lightblue", smooth.lwd=2, + pt.col=ifelse(et$survived, "black", "red"), + pt.pch=".", pt.cex=2.5) plotmo grid: pclassn age 2 10 > > set.seed(844) > plotmo(a4, do.par=F, xflip=F, all1=T, center=TRUE, clip=F, + main="pclassn with age=40", ndiscrete=ndiscrete, + degree2=0, degree1=1, + grid.levels=list(age=40), + smooth.col="lightblue", smooth.lwd=2, + pt.col=ifelse(et$survived, "black", "red"), + pt.pch=".", pt.cex=2.5) plotmo grid: pclassn age 2 40 > > source("test.epilog.R") plotmo/inst/slowtests/test.plotmo.dots.bat0000755000176200001440000000156115124635472020557 0ustar liggesusers@rem test.plotmo.dots.R: test handling of dots arguments @echo test.plotmo.dots.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.plotmo.dots.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.plotmo.dots.Rout: @echo. @tail test.plotmo.dots.Rout @echo test.plotmo.dots.R @exit /B 1 :good1 mks.diff test.plotmo.dots.Rout test.plotmo.dots.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.plotmo.dots.save.ps @exit /B 1 :good2 @rem test.plotmo.dots.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.plotmo.dots.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.plotmo.dots.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/test.dots.R0000644000176200001440000007355014055527241016701 0ustar liggesusers# test.dots.R source("test.prolog.R") cat0("=== test dotindex\n") test.dotindex <- function(expected, ARGNAME, ..., EX=FALSE) { dotindex <- plotmo:::dotindex(ARGNAME=ARGNAME, EX=EX, ...) stopifnot(all.equal(dotindex, expected)) } test.dotindex(NA, "x") # empty dots test.dotindex(NA, "x", a=10, b=20) test.dotindex(1, "a", a=10, b=20) test.dotindex(2, "b", a=10, b=20) test.dotindex(1, "a1", a=10, b=20) test.dotindex(NA, "a", a1=10, a2=20) expect.err(try(test.dotindex(1, nonesuch, a=10, a=20)), "object 'nonesuch' not found") expect.err(try(test.dotindex(1, "a1", a=10, a=20)), "argument 'a' for test.dotindex() is duplicated") expect.err(try(test.dotindex(1, "aa1", a=10, aa=20)), "arguments 'a' and 'aa' both match 'aa1' in test.dotindex") stopifnot(is.na(plotmo:::dotindex("a", EX=1, a1=10, a2=20))) stopifnot(plotmo:::dotindex("a2", EX=1, a1=10, a2=20) == 2) # multiple argnames test.dotindex(NA, c("a", "b")) # empty dots test.dotindex(1, c("a", "b"), a=2, c=3) test.dotindex(1, c("a", "b"), a=5, b=6) test.dotindex(2, c("a", "b"), x=1, a=5, b=6) test.dotindex(3, c("b,a"), x=1, a=5, b=6) test.dotindex(1, c("a b"), b=3, c=4) test.dotindex(2, c(" a b "), c=3, b=4) test.dotindex(NA, c("a", "b"), c=3) stopifnot(plotmo:::dotindex(c("x", "a1"), EX=1, a1=10, a2=20) == 1) test.dota <- function(expected, ARGNAME, ..., DEF=NA, EX=FALSE) { if(is.na(DEF)) dot <- plotmo:::dota(ARGNAME, EX=EX, ...) else dot <- plotmo:::dota(ARGNAME, EX=EX, DEF=DEF, ...) stopifnot(all.equal(dot, expected)) } cat0("=== test dot\n") test.dota(NA, "x") # empty dots test.dota(NA, "x", a=10, b=20) test.dota(10, "a", a=10, b=20) test.dota(20, "b", a=10, b=20) test.dota(99, DEF=99, "nonesuch", a=10, b=20) test.dota(NA, "a", a1=10, a2=20) expect.err(try(test.dota(1, "a1", a=10, a=20)), "argument 'a' for test.dota() is duplicated") expect.err(try(test.dota(1, 99, a=10, a=20)), "is.character(argname) is not TRUE") expect.err(try(test.dota(1, test.dota, a=10, a=20)), "is.character(argname) is not TRUE") expect.err(try(test.dota(1, "", a=10, a=20)), "empty string in ARGNAME") expect.err(try(test.dota(1, "x^x", a=10, a=20)), "illegal character \"^\" in ARGNAME") test.dota(10, "abc", EX=T, abc=10) test.dota(NA, "a", EX=T, a1=10, a2=20) expect.err(try(test.dota(1, "a1", a1=10, a1=20)), "argument 'a1' for test.dota() is duplicated") stopifnot(is.na(plotmo:::dota("a", EX=1, a1=1, a2=2))) stopifnot(plotmo:::dota("a2", EX=1, a1=10, a2=20, a3=30) == 20) foo <- function(func, x) func(x) foo(mean, 33) foo(function(...) plotmo:::dota("x", ...), 33) foo(function(...) plotmo:::dota("x99", ...), 33) foo(function(...) { plotmo:::dota("nonesuch", ...) }, 33) test.dota(1, "a", EX=T, a=1) test.dota(2, "b", EX=T, a=1, b=2, c=3) test.dota(NA, "x", EX=T, a=1, b=2, c=3) test.dota(2, "a", EX=T, ab=1, a=2) test.dota(2, "a", EX=T, aa=1, a=2) test.dota(NA, "a", EX=T, aa=1, ab=2) expect.err(try(test.dota(2, "a", EX=T, aa=1, a=2, a=3)), "argument 'a' for test.dota() is duplicated") expect.err(try(test.dota(2, "a", EX=T, a=none.such)), "cannot evaluate 'a'") # multiple argnames test.dota(2, c("a", "b"), a=2, c=3) test.dota(5, c("a", "b"), a=5, b=6) test.dota(5, c("a", "b"), x=1, a=5, b=6) test.dota(3, c("a", "b"), b=3, c=4) test.dota(4, c("a", "b"), c=3, b=4) test.dota(NA, c("a", "b"), c=3) expect.err(try(test.dota(1, c("b", "aa1"), a=10, aa=20)), "arguments 'a' and 'aa' both match 'aa1' in test.dota") expect.err(try(test.dota(1, c("x", ""), a=10, b=20)), "empty string in ARGNAME") stopifnot(plotmo:::dota(c("x", "a2", "y"), EX=1, a1=10, a2=20, a3=30) == 20) test.dota(NA, c("a", "b"), aa=2, cc=3, EX=T) test.dota(2, c("aa", "b"), aa=2, cc=3, EX=T) test.dota(3, c("bb", "b"), bb=3, cc=4, EX=T) test.dota(NA, c("a", "b"), c=3, EX=T) foo.x <- function(...) { plotmo:::dota("x", ..., DEF="default", EX=FALSE) } stopifnot(foo.x(x=3) == 3) stopifnot(foo.x(y=3) == "default") foo2 <- function(funcarg, ...) funcarg(...) stopifnot(is.na(foo2(function(...) plotmo:::dota("x", ...), 3))) # 3 is unnamed stopifnot(foo2(function(...) plotmo:::dota("x", EX=0, ...), x=3) == 3) stopifnot(foo2(function(...) plotmo:::dota("x99", EX=0, ...), x=3) == 3) stopifnot(foo2(function(...) { plotmo:::dota("x", DEF="default", EX=FALSE, ...) }, x=3) == 3) stopifnot(foo2(function(...) { plotmo:::dota("y", DEF="default", EX=FALSE, ...) }, x=3) == "default") # expect.err(try(foo2(function(...) { plotmo:::dota("y", DEF="default", EX=FALSE, ...) }, 3)), "unnamed arguments in ... are not allowed for funcarg()") stopifnot(foo2(foo.x, x=3) == 3) stopifnot(foo2(foo.x, y=3) == "default") test.is.dot <- function(expected, ARGNAME, ...) { present <- plotmo:::is.dot(ARGNAME, ...) stopifnot(all.equal(present, expected)) } cat0("=== test is.dot\n") test.is.dot(FALSE, "x") # empty dots test.is.dot(FALSE, "x", EX=0, a=10, b=20) test.is.dot(TRUE, "a", EX=0, a=10, b=20) test.is.dot(TRUE, "b", EX=0, a=10, b=20) test.is.dot(TRUE, "a1", EX=0, a=10, b=20) test.is.dot(FALSE, "a", EX=0, a1=10, a2=20) expect.err(try(test.is.dot(TRUE, "a1", EX=0, a=10, a=20)), "argument 'a' for test.is.dot() is duplicated") expect.err(try(test.is.dot(TRUE, "a", EX=0, a=10, a=20)), "argument 'a' for test.is.dot() is duplicated") stopifnot(plotmo:::is.dot("a", EX=1, a1=10, a2=20, a3=30) == FALSE) stopifnot(plotmo:::is.dot("x", EX=1, a1=10, a2=20, a3=30) == FALSE) stopifnot(plotmo:::is.dot("a3", EX=1, a1=10, a2=20, a3=30) == TRUE) # multiple argnames test.is.dot(TRUE, EX=0, c("a1", "b1"), a=2, c=3) test.is.dot(TRUE, EX=0, c("a1", "b1"), b=3, c=4) test.is.dot(TRUE, EX=0, c("a1", "b1"), c=3, b=4) test.is.dot(FALSE, EX=0, c("a1", "b1"), c=3) expect.err(try(test.is.dot(FALSE, c("aa1", "b"), EX=0, a=10, aa=20)), "arguments 'a' and 'aa' both match 'aa1' in test.is.dot") stopifnot(plotmo:::is.dot(c("x", "a", "y"), EX=1, a1=10, a2=20, a3=30) == FALSE) stopifnot(plotmo:::is.dot(c("x", "a2", "y"), EX=1, a1=10, a2=20, a3=30) == TRUE) cat0("=== test expand.drop\n") # nchar is used an example func, it has formals "x", "type", "allowNA" stopifnot(is.null(plotmo:::expand.drop(NULL, prefix="prefix.", func=nchar))) stopifnot(plotmo:::expand.drop("a", prefix="prefix.", func=nchar) == ">PREFIX|>EXPLICIT|^a") stopifnot(plotmo:::expand.drop("a", prefix="prefix.", func=nchar, include.standard.prefixes=TRUE) == ">STANDARDPREFIXES|^force\\.|^def\\.|^drop\\.|>PREFIX|^prefix\\.|>EXPLICIT|^a") stopifnot(plotmo:::expand.drop("FORMALS", prefix="prefix.", func=base::nchar) == ">FORMALS|^x|^type|^allowNA|^keepNA|>PREFIX|>EXPLICIT") stopifnot(plotmo:::expand.drop("FORMALS", prefix="prefix.", func=base::nchar, include.standard.prefixes=TRUE) == ">FORMALS|^x|^type|^allowNA|^keepNA|>STANDARDPREFIXES|^force\\.|^def\\.|^drop\\.|>PREFIX|^prefix\\.|>EXPLICIT") expect.err(try(plotmo:::expand.drop("FORMALS", prefix="prefix.", func=NULL)), "\"FORMALS\" specified in DROP, but FUNC is NULL") expect.err(try(plotmo:::expand.drop("FORMALS", prefix="prefix.", func=base::c)), "\"FORMALS\" specified but formals(FUNC) returned no formal arguments") foo99 <- function(...) NULL expect.err(try(plotmo:::expand.drop("FORMALS", prefix="prefix.", func=foo99)), "\"FORMALS\" specified but formals(FUNC) returned only \"...\"") stopifnot(plotmo:::expand.drop("a,FORMALS", prefix="prefix.", func=base::nchar) == ">FORMALS|^x|^type|^allowNA|^keepNA|>PREFIX|>EXPLICIT|^a") stopifnot(plotmo:::expand.drop("a,FORMALS", prefix="prefix.", func=base::nchar, include.standard.prefixes=TRUE) == ">FORMALS|^x|^type|^allowNA|^keepNA|>STANDARDPREFIXES|^force\\.|^def\\.|^drop\\.|>PREFIX|^prefix\\.|>EXPLICIT|^a") expect.err(try(plotmo:::expand.drop("", prefix="prefix.", func=base::nchar)), "DROP is an empty string") stopifnot(plotmo:::expand.drop("a", prefix="lines.", func=base::nchar) == ">PREFIX|>EXPLICIT|^a") stopifnot(plotmo:::expand.drop("a", "lines.a", prefix="lines.", func=base::nchar, include.standard.prefixes=TRUE) == ">STANDARDPREFIXES|^force\\.|^def\\.|^drop\\.|>PREFIX|^lines\\.|>EXPLICIT|^a") stopifnot(plotmo:::expand.drop("a*", prefix="lines.", func=base::nchar) == ">PREFIX|>EXPLICIT|^a.*") stopifnot(plotmo:::expand.drop("a.*", prefix="lines.", func=base::nchar) == ">PREFIX|>EXPLICIT|^a\\..*") stopifnot(plotmo:::expand.drop("a$", prefix="lines.", func=base::nchar) == ">PREFIX|>EXPLICIT|^a$") stopifnot(plotmo:::expand.drop("a$,b*,c*$", prefix="lines.", func=base::nchar) == ">PREFIX|>EXPLICIT|^a$|^b.*|^c.*$") stopifnot(plotmo:::expand.drop(c("a", "b,c", " d e$ f ", "g h$, i"), prefix="lines.", func=base::nchar) == ">PREFIX|>EXPLICIT|^a|^b|^c|^d|^e$|^f|^g|^h$|^i") stopifnot(plotmo:::expand.drop("PLOT.ARGS", prefix="lines.", func=base::nchar) == ">PREFIX|>EXPLICIT|>PLOT_ARGS|^add$|^adj$|^bty$|^cex$|^cex\\.axis$|^cex\\.lab$|^cex\\.main$|^cex\\.sub$|^col$|^col\\.axis$|^col\\.lab$|^col\\.main$|^col\\.sub$|^crt$|^family$|^font$|^font$|^font\\.axis$|^font\\.lab$|^font\\.main$|^font\\.sub$|^lend$|^ljoin$|^lmitre$|^lty$|^lwd$|^main$|^pch$|^srt$|^xaxp$|^xaxs$|^xaxt$|^xlab$|^xlim$|^xlog$|^xpd$|^yaxp$|^yaxs$|^yaxt$|^ylab$|^ylim$|^ylog$") stopifnot(plotmo:::expand.drop("abc,PLOT.ARGS", prefix="lines.", func=base::nchar) == ">PREFIX|>EXPLICIT|^abc|>PLOT_ARGS|^add$|^adj$|^bty$|^cex$|^cex\\.axis$|^cex\\.lab$|^cex\\.main$|^cex\\.sub$|^col$|^col\\.axis$|^col\\.lab$|^col\\.main$|^col\\.sub$|^crt$|^family$|^font$|^font$|^font\\.axis$|^font\\.lab$|^font\\.main$|^font\\.sub$|^lend$|^ljoin$|^lmitre$|^lty$|^lwd$|^main$|^pch$|^srt$|^xaxp$|^xaxs$|^xaxt$|^xlab$|^xlim$|^xlog$|^xpd$|^yaxp$|^yaxs$|^yaxt$|^ylab$|^ylim$|^ylog$") stopifnot(plotmo:::expand.drop("abc,FORMALS,PLOT.ARGS", prefix="lines.", func=base::nchar) == ">FORMALS|^x|^type|^allowNA|^keepNA|>PREFIX|>EXPLICIT|^abc|>PLOT_ARGS|^add$|^adj$|^bty$|^cex$|^cex\\.axis$|^cex\\.lab$|^cex\\.main$|^cex\\.sub$|^col$|^col\\.axis$|^col\\.lab$|^col\\.main$|^col\\.sub$|^crt$|^family$|^font$|^font$|^font\\.axis$|^font\\.lab$|^font\\.main$|^font\\.sub$|^lend$|^ljoin$|^lmitre$|^lty$|^lwd$|^main$|^pch$|^srt$|^xaxp$|^xaxs$|^xaxt$|^xlab$|^xlim$|^xlog$|^xpd$|^yaxp$|^yaxs$|^yaxt$|^ylab$|^ylim$|^ylog$") stopifnot(plotmo:::expand.drop("abc,FORMALS,PAR.ARGS", prefix="lines.", func=base::nchar) == ">FORMALS|^x|^type|^allowNA|^keepNA|>PREFIX|>EXPLICIT|^abc|>PAR_ARGS|^adj$|^ann$|^ask$|^bg$|^bty$|^cex$|^cex\\.axis$|^cex\\.lab$|^cex\\.main$|^cex\\.sub$|^col\\.axis$|^col\\.lab$|^col\\.main$|^col\\.sub$|^crt$|^err$|^family$|^fg$|^fig$|^fin$|^font$|^font\\.axis$|^font\\.lab$|^font\\.main$|^font\\.sub$|^lab$|^las$|^lend$|^lheight$|^ljoin$|^lmitre$|^lty$|^mai$|^mar$|^mex$|^mfcol$|^mfg$|^mfrow$|^mgp$|^mkh$|^new$|^oma$|^omd$|^omi$|^pch$|^pin$|^plt$|^ps$|^pty$|^srt$|^tck$|^tcl$|^usr$|^xaxp$|^xaxs$|^xaxt$|^xlog$|^xpd$|^yaxp$|^yaxs$|^yaxt$|^ylbias$|^ylog$") stopifnot(plotmo:::expand.drop("abc,FORMALS,PLOTMO.ARGS", prefix="lines.", func=base::nchar) == ">FORMALS|^x|^type|^allowNA|^keepNA|>PREFIX|>EXPLICIT|^abc|>PLOTMO_ARGS|^caption\\.|^cex\\.|^col\\.|^contour\\.|^cum\\.|^degree1\\.|^degree2\\.|^density\\.|^filled\\.contour\\.|^font\\.|^func\\.|^grid\\.|^heatmap\\.|^image\\.|^jitter\\.|^legend\\.|^label\\.|^level\\.|^line\\.|^lines\\.|^lty\\.|^lty\\.|^lwd\\.|^main\\.|^mtext\\.|^nresiduals|^par\\.|^pch\\.|^persp\\.|^plot\\.|^plotmath\\.|^prednames\\.|^qq\\.|^qqline\\.|^pt\\.|^response\\.|^rug\\.|^smooth\\.|^text\\.|^title\\.|^vfont\\.") test.deprefix <- function(expected, ..., FNAME="test.deprefix", KEEP=NULL) { args <- plotmo:::deprefix(..., FNAME=FNAME, KEEP=KEEP, CALLARGS="") # can't use all.equal because it complains about names # cat("args:\n") # print(args) # cat("expected:\n") # print(expected) stopifnot(length(args) == length(expected)) for(i in seq_len(length(expected))) { stopifnot(names(args)[i] == names(expected)[i]) stopifnot(args[[i]] == expected[[i]]) } } cat0("=== test deprefix\n") test.deprefix( expected=list(a=1, b=2), DROP="*", PREFIX="predict.", def.a=1, predict.b=2, c=3) test.deprefix(TRACE=2, expected=list(b="predict.b", d="def.d", c="predict.c", e="predict.e"), PREFIX="predict.", DROP="*", a="a", b="b", c="c", w1.xlab="xlab", def.b="def.b", def.d="def.d", predict.b="predict.b", predict.c="predict.c", predict.e="predict.e") test.deprefix(TRACE=2, expected=list(b="predict.b", d="def.d", a="a", c="predict.c", e="predict.e"), KEEP=NULL, PREFIX="predict.", DROP="w1.", a="a", b="b", c="c", w1.xlab="xlab", def.b="def.b", def.d="def.d", predict.b="predict.b", predict.c="predict.c", predict.e="predict.e") test.deprefix( expected=list(a="predict.a"), KEEP=NULL, PREFIX="predict.", DROP="w1.", a="plain.a", predict.a="predict.a") test.deprefix(expected=list(a="aa1"), KEEP=NULL, PREFIX="predict.", a="aa1") test.deprefix(expected=list(a="aa2"), KEEP=NULL, PREFIX="predict.", def.a="aa2") test.deprefix(expected=list(a="aa3", b="bb3"), KEEP=NULL, PREFIX="predict.", def.a="aa3", b="bb3") test.deprefix(expected=list(10, 20), TRACE=2, KEEP=NULL, DROP="w1.,persp.,xlab.", PREFIX="predict.", force.anon2=20, force.anon1=10) test.deprefix(expected=list(10, 20, a=3), TRACE=2, KEEP=NULL, DROP="w1.,persp.,xlab.", PREFIX="predict.", force.anon2=20, force.anon1=10, a=3) expect.err(try(test.deprefix(expected=list(10, 20, a=4), KEEP=NULL, DROP="w1.,persp.,xlab.", PREFIX="predict.", force.anon=10, force.anon=20, a=3, predict.a=4)), "argument 'force.anon' for test.deprefix() is duplicated") expect.err(try(test.deprefix(expected=list(10, 20, a=4), KEEP=NULL, DROP="w1.,persp.,xlab.", PREFIX="predict.", FNAME="foobar", force.anon=10, force.anon=20, a=3, predict.a=4)), "argument 'force.anon' for foobar() is duplicated") test.deprefix(expected=list(10, 20, a=4), KEEP=NULL, DROP="w1.,persp.,xlab.", PREFIX="predict.", force.anon1=10, force.anon2=20, a=3, predict.a=4) test.deprefix(expected=list(10, 20, b=3, a=4), KEEP=NULL, DROP="w1.,persp.,xlab.", PREFIX="predict.", force.anon1=10, force.anon2=20, def.b=3, a=3, predict.a=4) test.deprefix(expected=list(10, 20, b=5, a=3), KEEP=NULL, DROP="w1.,persp.,xlab.", PREFIX="predict.", force.anon1=10, force.anon2=20, def.b=3, a=3, predict.b=5) test.deprefix(expected=list(10, 20, b=6, a=3), KEEP=NULL, DROP="w1.,persp.,xlab.", PREFIX="predict.", force.anon1=10, force.anon2=20, def.b=3, a=3, b=6) expect.err(try(test.deprefix(expected=NULL, KEEP=NULL, PREFIX="predict.", DROP="w1\\.")), "illegal character \"\\\" in DROP = \"w1\\.\"") test.deprefix(expected=list(b="predict.b", d="def.d", a="a", c="predict.c", w1.xl="xlab2", e="predict.e"), PREFIX="predict.", DROP="w1.xlab$", a="a", b="b", c="c", w1.xlab="xlab1", # will be dropped (exact match) w1.xl="xlab2", # will be kept (not an exact match) def.b="def.b", def.d="def.d", predict.b="predict.b", predict.c="predict.c", predict.e="predict.e") # expect.err(try(plotmo:::deprefix(FNAME="test.deprefix", PREFIX="predict.", UPPER.CASE123=99, # def.a=1, predict.b=2, c=3)), # "uppercase argument names like \"UPPER.CASE123\" are not allowed for test.deprefix()") test.expand.dotnames <- function(expected, PREFIX, FUNC=NULL, FNAME="test.expand.dotnames", FORMALS=NULL, ...) { dots <- as.list(match.call(expand.dots=FALSE)$...) args <- plotmo:::expand.dotnames(dots, PREFIX, FUNC, FNAME, FORMALS) # can't use all.equal because it complains about named list versus unnamed list stopifnot(length(args) == length(expected)) for(i in seq_len(length(expected))) { stopifnot(names(args)[i] == names(expected)[i]) stopifnot(eval(args[[i]]) == expected[[i]]) } } cat0("=== test expand.dotnames\n") test.expand.dotnames(expected=list(x=9, persp.shade=3), "persp.", graphics:::persp.default, "persp.default", x=9, persp.sh=3) test.expand.dotnames(expected=list(x=9, persp.shade=3, persp.nonesuch=4), "persp.", graphics:::persp.default, "persp.default", x=9, persp.sh=3, persp.nonesuch=4) test.expand.dotnames(expected=list(x=9, persp.col=3), "persp.", graphics:::persp.default, "persp.default", x=9, persp.c=3) # TODO not sure why this works as it does test.expand.dotnames(expected=list(x=9, persp.x=3), "persp.", graphics:::persp.default, "persp.default", x=9, persp.x=3) expect.err(try(test.expand.dotnames(expected=NULL, "persp.", graphics:::persp.default, "persp.default", x=9, persp.l=3)), "'l' matches both the 'ltheta' and 'lphi' arguments of persp.default()") test.expand.dotnames(expected=list(x=9, plot.foo=3, plot.xlim=c(1,2)), "plot.", graphics:::plot.default, "plot.default", x=9, plot.foo=3, plot.xlim=c(1,2)) test.expand.dotnames(expected=list(x=9, plot.foo=3, plot.xlim=c(1,2)), "plot.", graphics:::plot.default, "plot.default", x=9, plot.foo=3, plot.xli=c(1,2)) expect.err(try(test.expand.dotnames(expected=NULL, "plot.", graphics:::plot.default, "plot.default", x=9, plot.foo=3, plot.xl=c(1,2))), "'xl' matches both the 'xlim' and 'xlab' arguments of plot.default()") foo3 <- function(aaa=1, aa=2, bb=3, bba=4, cca=5, ccb=6, def=7) cat0("foo3: aaa=", aaa, " aa=", aa, ", bb=", bb, " bba=", bba, " cca=", cca, " ccb=", ccb, " def=", def, "\n") # --- above tests again but using formals --- # formal args for graphics:::persp.default (R version 3.2.0) formals <- c( "x", "y", "z", "xlim", "zlim", "xlab", "ylab", "zlab", "main", "sub", "theta", "phi", "r", "d", "scale", "expand", "col", "border", "ltheta", "lphi", "shade", "box", "axes", "nticks", "ticktype") test.expand.dotnames(expected=list(x=9, persp.shade=3), "persp.", graphics:::persp, "persp", FORMALS=formals, x=9, persp.sh=3) test.expand.dotnames(expected=list(x=9, persp.shade=3, persp.nonesuch=4), "persp.", graphics:::persp, "persp", FORMALS=formals, x=9, persp.sh=3, persp.nonesuch=4) test.expand.dotnames(expected=list(x=9, persp.col=3), "persp.", graphics:::persp, "persp", FORMALS=formals, x=9, persp.c=3) # TODO not sure why this works as it does test.expand.dotnames(expected=list(x=9, persp.x=3), "persp.", graphics:::persp, "persp", FORMALS=formals, x=9, persp.x=3) expect.err(try(test.expand.dotnames(expected=NULL, "persp.", graphics:::persp, "persp", FORMALS=formals, x=9, persp.l=3)), "'l' matches both the 'ltheta' and 'lphi' arguments of persp()") # done formals tests test.expand.dotnames(expected=list(x=9, plot.foo=3, plot.xlim=c(1,2)), "plot.", graphics:::plot.default, "plot.default", x=9, plot.foo=3, plot.xlim=c(1,2)) test.expand.dotnames(expected=list(x=9, plot.foo=3, plot.xlim=c(1,2)), "plot.", graphics:::plot.default, "plot.default", x=9, plot.foo=3, plot.xli=c(1,2)) expect.err(try(test.expand.dotnames(expected=NULL, "plot.", graphics:::plot.default, "plot.default", x=9, plot.foo=3, plot.xl=c(1,2))), "'xl' matches both the 'xlim' and 'xlab' arguments of plot.default()") test.expand.dotnames(expected=list(foo3.aa=99), "foo3.", foo3, "foo3", foo3.aa=99) expect.err(try(plotmo:::call.plot(foo3, "foo3.", foo3.aa=99)), "Unnamed arguments are not allowed here\n The argument's value is \"foo3.\"") expect.err(try(plotmo:::call.plot(foo3, foo, foo3.aa=99)), "Unnamed arguments are not allowed here\n The argument's value is function.object") expect.err(try(plotmo:::call.plot(foo3, NULL, foo3.aa=99)), "Unnamed arguments are not allowed here\n The argument's value is NULL") expect.err(try(plotmo:::call.plot(foo3, stop("stop was called"), foo3.aa=99)), "Unnamed arguments are not allowed here (argument ..1 is unnamed)") expect.err(try(plotmo:::call.plot(foo3, cat("side effect\n"), foo3.aa=99)), "Unnamed arguments are not allowed here\n The argument's value is NULL") expect.err(try(plotmo:::call.plot(foo3, nonesuch1=1, nonesuch2, foo3.aa=99)), "Unnamed arguments are not allowed here (argument ..2 is unnamed)") plotmo:::call.plot(foo3, PREFIX="foo3.", foo3.aa=99) test.expand.dotnames(expected=list(foo3.aaa=99), "foo3.", foo3, "foo3", foo3.aaa=99) plotmo:::call.plot(foo3, foo3.aaa=99) expect.err(try(test.expand.dotnames(expected=list(foo3.aaa=99), "foo3.", foo3, "foo3", foo3.aa=88, foo3.aa=99)), "'foo3.aa' for foo3() is duplicated") expect.err(try(test.expand.dotnames(expected=list(foo3.aaa=99), "foo3.", foo3, "foo3", foo3.a=88, foo3.aa=99)), "'a' matches both the 'aaa' and 'aa' arguments of foo3()") expect.err(try(test.expand.dotnames(expected=list(foo3.aaa=99), "foo3.", foo3, "foo3", foo3.aaa=88, foo3.aaa=99)), "'foo3.aaa' for foo3() is duplicated") test.expand.dotnames(expected=list(foo3.bbb=88, foo3.bba=99), "foo3.", foo3, "foo3", foo3.bbb=88, foo3.bba=99) expect.err(try(plotmo:::call.plot(foo3, foo3.bbb=88, foo3.bba=99)), "unused argument (bbb = 88)") # same as above but with TRACE (so don't use try in call.dots) expect.err(try(plotmo:::call.plot(foo3, foo3.bbb=88, foo3.bba=99, TRACE=T)), "unused argument (bbb = 88)") test.expand.dotnames(expected=list(foo3.bb=88), "foo3.", foo3, "foo3", foo3.bb=88) plotmo:::call.plot(foo3, foo3.bb=88) # test with FUNC=NULL test.expand.dotnames(expected=list(foo3.aa=99), "foo3.", NULL, "foo3", foo3.aa=99) plotmo:::call.plot(foo3, foo3.aa=99) test.expand.dotnames(expected=list(foo3.aaa=99), "foo3.", NULL, "foo3", foo3.aaa=99) plotmo:::call.plot(foo3, foo3.aaa=99) expect.err(try(test.expand.dotnames(expected=list(foo3.aaa=99), "foo3.", NULL, "foo3", foo3.aa=88, foo3.aa=99)), "argument 'foo3.aa' for foo3() is duplicated") test.expand.dotnames(expected=list(foo3.a=88, foo3.aa=99), "foo3.", NULL, "foo3", foo3.a=88, foo3.aa=99) expect.err(try(plotmo:::call.plot(foo3, foo3.a=88, foo3.aa=99)), "'a' matches both the 'aaa' and 'aa' arguments of foo3()") expect.err(try(test.expand.dotnames(expected=list(foo3.aaa=99), "foo3.", NULL, "foo3", foo3.aaa=88, foo3.aaa=99)), "argument 'foo3.aaa' for foo3() is duplicated") test.expand.dotnames(expected=list(foo3.bbb=88, foo3.bba=99), "foo3.", NULL, "foo3", foo3.bbb=88, foo3.bba=99) expect.err(try(plotmo:::call.plot(foo3, PREFIX="foo3.", foo3.bbb=88, foo3.bba=99)), "unused argument (bbb = 88)") test.expand.dotnames(expected=list(foo3.bb=88), "foo3.", NULL, "foo3", foo3.bb=88) plotmo:::call.plot(foo3, foo3.bb=88) test.expand.dotnames(expected=list(foo3.bbx=88), "foo3.", NULL, "foo3", foo3.bbx=88) expect.err(try(plotmo:::call.plot(foo3, foo3.bbx=88)), "unused argument (bbx = 88)") test.expand.dotnames(expected=list(foo3.cc=77), "foo3.", NULL, "foo3", foo3.cc=77) expect.err(try(plotmo:::call.plot(foo3, foo3.cc=77)), "'cc' matches both the 'cca' and 'ccb' arguments of foo3()") # following two directly compare FUNC=NULL to FUNC=foo3 test.expand.dotnames(expected=list(foo3.cc=77), "foo3.", FUNC=NULL, "foo3", foo3.cc=77) expect.err(try(test.expand.dotnames(expected=NULL, "foo3.", FUNC=foo3, "foo3", foo3.cc=77)), "'cc' matches both the 'cca' and 'ccb' arguments of foo3()") test.expand.dotnames(expected=list(), "foo3.", foo3, "foo3", d=88, de=99) expect.err(try(plotmo:::call.plot(graphics::plot, x=1:3, y=1:3, 99)), "Unnamed arguments are not allowed here\n The argument's value is 99\n plotmo:::call.plot via try called call.dots(FUNC=plot, PREFIX=PREFIX, ...") # test TRACE print(plotmo:::deprefix(FUNC=nchar, PREFIX="foo3.", TRACE=TRUE, FNAME="nchar", allowN=1, b=2, foo3.c=3)) print(plotmo:::deprefix(FUNC=nchar, PREFIX="foo3.", TRACE=2, allowN=1, b=2, foo3.c=3)) print(plotmo:::deprefix(FUNC=nchar, PREFIX="foo3.", TRACE=3, allowN=1, b=2, foo3.c=3)) expect.err(try(plotmo:::call.plot(foo3, foo3.d=88, foo3.de=99)), "'foo3.d' and 'foo3.de' both match the 'def' argument of foo3()") cat0("=== test stop.if.dots\n") foo3 <- function(x=1, ...) plotmo:::stop.if.dots(...) foo3(1) # ok expect.err(try(foo3(10, y=2)), "foo3: unrecognized argument 'y'") expect.err(try(foo3(10, 99)), "foo3: unrecognized unnamed argument\n The call was foo3(x=10, 99)") expect.err(try(foo3(10, y=plot)), "foo3: unrecognized argument 'y'") expect.err(try(foo3(10, plot)), "foo3: unrecognized unnamed argument\n The call was foo3(x=10, plot)") expect.err(try(foo3(20, c(1,2,3), plot)), "foo3: unrecognized unnamed argument\n The call was foo3(x=20, c(1,2,3), plot)") expect.err(try(foo3(20, c(1,2,3,4,5,6,7,8,9,10,11,12), plot)), "foo3: unrecognized unnamed argument\n The call was foo3(x=20, c(1,2,3,4,5,6,7,8,9,10,11,12), plot)") # test that we don't crash because we eval the argument expect.err(try(foo3(20, y=stop("stop was called"))), "foo3: unrecognized argument 'y'") expect.err(try(foo3(20, stop("stop was called"))), "foo3: unrecognized unnamed argument") expect.err(try(foo3(20, cat("side effect\n"))), "foo3: unrecognized unnamed argument\n The call was foo3(x=20, cat(") foo2 <- function(...) plotmo:::stop.if.dots(...) foo2() # ok expect.err(try(foo2(y=2)), "foo2: unrecognized argument 'y'") expect.err(try(foo2(2)), "foo2: unrecognized unnamed argument\n The call was foo2(2)") expect.err(try(foo2(y=plot)), "foo2: unrecognized argument 'y'") expect.err(try(foo2(plot)), "foo2: unrecognized unnamed argument\n The call was foo2(plot)") foo2a <- function(funcarg, ...) funcarg(...) expect.err(try(foo2a(function(x=1, ...) plotmo:::stop.if.dots(...), x=1, y=2)), "funcarg: unrecognized argument 'y'") cat0("=== test warn.if.dots\n") options(warn=2) # treat warnings as errors foo3 <- function(x=1, ...) plotmo:::warn.if.dots(...) foo3(1) # ok expect.err(try(foo3(1, y=2)), "foo3 ignored argument 'y'") expect.err(try(foo3(1, 2)), "foo3 ignored unnamed argument\n The call was foo3(x=1, 2)") expect.err(try(foo3(1, y=plot)), "foo3 ignored argument 'y'") # TODO would like to improve this error messsage expect.err(try(foo3(1, plot)), "(converted from warning) foo3 ignored unnamed argument\n The call was foo3(x=1, plot)") foo4 <- function(...) plotmo:::warn.if.dots(...) foo4() # ok expect.err(try(foo4(y=2)), "foo4 ignored argument 'y'") expect.err(try(foo4(2)), "foo4 ignored unnamed argument\n The call was foo4(2)") expect.err(try(foo4(y=plot)), "foo4 ignored argument 'y'") expect.err(try(foo4(plot)), "(converted from warning) foo4 ignored unnamed argument\n The call was foo4(plot)") options(warn=1) foo3(1, nonesuch=12, nonesuch2=12, 999) # expect three warnings cat0("=== test using sample functions that invoke call.dots\n") x <- 1:10 y <- x * x lmfit <- lm(y~x) par(mfrow=c(3, 2)) par(oma=c(0, 0, 3, 0)) # plot1: simple example # we choose to use predict() here rather than fitted() because nearly all # models have a fitted() method, but many don't have a fitted() method. plot1 <- function(object, ...) { residuals <- residuals(object, ...) fitted <- predict(object, ...) plot(fitted, residuals, ...) } plot1(lmfit) mtext("example plot functions using prefixed dots", outer=TRUE, font=2, line=1, cex=1) # Following causes error in predict.lm(). The type argument meant for # residuals() is also sent to predict.lm(), where it is rejected. expect.err(try(plot1(lmfit, type="pearson")), "'arg' should be one of \"response\", \"terms\"") # plot2: use prefixed args plot2 <- function(object, ..., TRACE=2) { resids <- plotmo:::call.dots(residuals, object=object, ..., TRACE=TRACE) fitted <- plotmo:::call.dots(predict, object=object, ..., TRACE=TRACE) plotmo:::call.plot(plot, x=fitted, y=resids, ..., TRACE=TRACE) } # we can now direct args using the prefixes "residuals.", "predict.", or "plot.") plot2(lmfit, residuals.type="pearson") # We can also use the usual plot arguments like ylab: call.dots drops # them; call.plot recognizes them and passes them to lines(). plot2(lmfit, residuals.type="pearson", ylab="pearson residuals", main="plot2") # plot3: further refinements # o namespace added to FUNC arg # o full name for plot.default # o force. and def. prefixes # o explicit xlab and ylab for call.plot # o unprefixed args are passed to residuals() plot3 <- function(object, ..., TRACE=2) { resids <- plotmo:::call.dots(stats::residuals, DROP="plotmo:::PLOTARGS,predict.,plot.", TRACE=TRACE, force.object=object, ...) fitted <- plotmo:::call.dots(stats::predict, force.object=object, TRACE=TRACE, ...) plotmo:::call.plot(graphics::plot.default, force.x=fitted, force.y=resids, def.xlab="fitted", def.ylab="residuals", TRACE=TRACE, ...) } plot3(lmfit, type="pearson", main="plot3a") # type goes only to pearson, no prefix needed plot3(lmfit, type="pearson", predict.type="response", main="plot3b") cat0("=== test callers.name\n") test.callers.name <- function(x) { caller0 <- plotmo:::callers.name(0) # test.callers.name caller1 <- plotmo:::callers.name(1) # caller of test.callers.name caller99 <- plotmo:::callers.name(99) # sys.call(-n) : not that many frames on the stack s <- sprint("0 %s 1 %s 99 %s", caller0, caller1, caller99) cat(s, "\n", sep="") s } print(plotmo:::callers.name()) # "eval" myfunc <- function(func) func() stopifnot(myfunc(function(x) test.callers.name(99)) == "0 test.callers.name 1 func 99 unknown") stopifnot(test.callers.name() == "0 test.callers.name 1 stopifnot 99 unknown") source("test.epilog.R") plotmo/inst/slowtests/test.partykit.bat0000755000176200001440000000145515124635472020146 0ustar liggesusers@rem test.partykit.bat @echo test.partykit.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.partykit.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.partykit.Rout: @echo. @tail test.partykit.Rout @echo test.partykit.R @exit /B 1 :good1 mks.diff test.partykit.Rout test.partykit.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.partykit.save.ps @exit /B 1 :good2 @rem test.partykit.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.partykit.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.partykit.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/README.txt0000644000176200001440000000114213306016353016304 0ustar liggesusersplotmo/inst/slowtests/README.txt -------------------------------- The tests in this directory must be run manually before submitting a new version of this package to CRAN. They are much more comprehensive than the standard CRAN checks in tests/tests.plotmo.R, but take several minutes to run. Also they compare postscript files, and there are sometimes arbitrary changes to the format of those postscript files due to changes in the postscript driver across R releases. Such changes must be manually checked by comparing the files in a postscript viewer. Complete automation isn't possible. plotmo/inst/slowtests/test.caret.bat0000755000176200001440000000152215124635472017370 0ustar liggesusers@rem test.caret.bat: test plotmo on caret models @rem Stephen Milborrow, Shrewsbury Aug 2016 @echo test.caret.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.caret.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.caret.Rout: @echo. @tail test.caret.Rout @echo test.caret.R @exit /B 1 :good1 mks.diff test.caret.Rout test.caret.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.caret.save.ps @exit /B 1 :good2 @rem test.caret.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.caret.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.caret.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/test.prolog.R0000644000176200001440000000310513727235376017231 0ustar liggesusers# test.prolog.R # A safe version of sprintf. # Like sprintf except that %s on NULL prints "NULL" rather than # preventing the entire string from being printed # # e.g. sprintf("abc %s def", NULL) returns an empty string -- a silent failure! # but sprint("abc %s def", NULL) returns "abc NULL def" # # e.g. sprintf("abc %d def", NULL) returns an empty string! # but sprint("abc %d def", NULL) causes an error msg (not a silent failure) sprint <- function(fmt, ...) { dots <- list(...) dots <- lapply(dots, function(e) if(is.null(e)) "NULL" else e) do.call(sprintf, c(fmt, dots)) } printf <- function(fmt, ...) cat(sprint(fmt, ...), sep="") cat0 <- function(...) cat(..., sep="") strip.space <- function(s) gsub("[ \t\n]", "", s) # test that we got an error as expected from a try() call expect.err <- function(object, expected.msg="") { if(class(object)[1] != "try-error") stop("Did not get expected error: ", expected.msg) else { msg <- attr(object, "condition")$message[1] if(length(grep(expected.msg, msg, fixed=TRUE))) cat0("Got expected error from ", deparse(substitute(object)), "\n") else stop(sprint("Expected: %s\n Got: %s", expected.msg, substr(msg[1], 1, 1000))) } } empty.plot <- function() { plot(0, 0, col=0, bty="n", xaxt="n", yaxt="n", xlab="", ylab="", main="") } options(warn=1) # print warnings as they occur if(!interactive()) postscript(paper="letter") org.par <- par(no.readonly=TRUE) set.seed(2020) plotmo/inst/slowtests/test.degree.Rout.save0000644000176200001440000001776314563614021020651 0ustar liggesusers> # test.pre.R: test the degree1 and degree2 and related args > > source("test.prolog.R") > library(earth) Loading required package: Formula Loading required package: plotmo Loading required package: plotrix > library(plotmo) > > # test character degree1 and degree2 (added in plotmo version 1.3-0) > > data(ozone1) > a80 <- earth(O3~., data=ozone1, degree=2) > plotmo(a80, degree1="i", degree2="t", + caption='degree1="i", degree2="t"') plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > plotmo(a80, degree1="^temp$", degree2="^dpg$", + caption='degree1="^temp$", degree2="^dpg$"') plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > # Expect Warning: "nonesuch1" in degree1 does not regex-match any variables, ditto for degree2 > plotmo(a80, degree1=c("temp", "nonesuch1"), degree2="vis", + caption='degree1=c("temp", "nonesuch1"), degree2="vis")') Warning: "nonesuch1" in degree1 does not regex-match any names Available names are "vh" "wind" "humidity" "temp" "ibh" "dpg" "ibt" "vis" "doy" plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > # Expect above warnings and also Warning: nothing to plot > plotmo(a80, degree1="nonesuch1", degree2="nonesuch2") Warning: "nonesuch1" in degree1 does not regex-match any names Available names are "vh" "wind" "humidity" "temp" "ibh" "dpg" "ibt" "vis" "doy" Warning: "nonesuch2" in degree2 does not regex-match any names Available names are "vh" "wind" "humidity" "temp" "ibh" "dpg" "ibt" "vis" "doy" Warning: plotmo: nothing to plot > > # tests for plotmo version 3.3.7 (degree1 and degree2 handling changed) > > data(etitanic) > a81 <- earth(survived~., data=etitanic, degree=2) > options(warn=1) # print warnings as they occur > plotmo(a81) plotmo grid: pclass sex age sibsp parch 3rd male 28 0 0 > > # degree1 tests > par(mfrow=c(3,3), mar=c(1,2.5,2,1), oma=c(0,0,4,0)) > plotmo(a81, do.par=FALSE, degree1="pclass", degree2=0, main='degree1="pclass"', + caption="test degree1 with strings") plotmo grid: pclass sex age sibsp parch 3rd male 28 0 0 > options(warn=2) # treat warnings as errors > expect.err(try(plotmo(a81, do.par=FALSE, degree1="survived", degree2=0)), '"survived" in degree1 does not regex-match any names') Error : (converted from warning) "survived" in degree1 does not regex-match any names Available names are "pclass" "sex" "age" "sibsp" "parch" Got expected error from try(plotmo(a81, do.par = FALSE, degree1 = "survived", degree2 = 0)) > options(warn=1) # print warnings as they occur > plotmo(a81, do.par=FALSE, degree1="sibsp", degree2=0, main='degree1="sibsp"') plotmo grid: pclass sex age sibsp parch 3rd male 28 0 0 > # parch does not appear in the standard degree1 plotmo plots, but we can still specify it explictly > plotmo(a81, do.par=FALSE, degree1="parch", degree2=0, trace=0, main='degree1="parch"') plotmo grid: pclass sex age sibsp parch 3rd male 28 0 0 > plotmo(a81, do.par=FALSE, degree1=c("sibsp", "pclass"), degree2=0, main='degree1=c("sibsp", "pclass")') plotmo grid: pclass sex age sibsp parch 3rd male 28 0 0 > par(org.par) > > # degree2 tests > par(mfrow=c(3,3), mar=c(1,2.5,2,1), oma=c(0,0,4,0)) > plotmo(a81, do.par=FALSE, degree1=0, degree2="pclass", main='degree2="pclass"', + caption="test degree2 with two strings") > plotmo(a81, do.par=FALSE, degree1=0, degree2=c("age", "se"), persp.theta=-35, + main='degree2=c("age", "se")\npersp.theta=-35') > plotmo(a81, do.par=FALSE, degree1=0, degree2="ag", main='degree2="ag"') > plotmo(a81, do.par=FALSE, degree1=0, degree2=c("sex", "sibsp"), main='degree2=c("sex", "sibsp"') > plotmo(a81, do.par=FALSE, degree1=0, degree2=c("sibsp", "sex"), main='degree2=c("sibsp", "sex")') > options(warn=2) # treat warnings as errors > expect.err(try(plotmo(a81, do.par=FALSE, degree1=0, degree2=c("pclass", "nonesuch"))), "\"nonesuch\" in degree2 does not regex-match any names") Error : (converted from warning) "nonesuch" in degree2 does not regex-match any names Available names are "pclass" "sex" "age" "sibsp" "parch" Got expected error from try(plotmo(a81, do.par = FALSE, degree1 = 0, degree2 = c("pclass", "nonesuch"))) > expect.err(try(plotmo(a81, do.par=FALSE, degree1=0, degree2=c("nonesuch1", "nonesuch2"))), "\"nonesuch1\" in degree2 does not regex-match any names") Error : (converted from warning) "nonesuch1" in degree2 does not regex-match any names Available names are "pclass" "sex" "age" "sibsp" "parch" Got expected error from try(plotmo(a81, do.par = FALSE, degree1 = 0, degree2 = c("nonesuch1", "nonesuch2"))) > expect.err(try(plotmo(a81, do.par=FALSE, degree1=0, degree2=c("nonesuch", "pclass"))), "\"nonesuch\" in degree2 does not regex-match any names") Error : (converted from warning) "nonesuch" in degree2 does not regex-match any names Available names are "pclass" "sex" "age" "sibsp" "parch" Got expected error from try(plotmo(a81, do.par = FALSE, degree1 = 0, degree2 = c("nonesuch", "pclass"))) > options(warn=1) # print warnings as they occur > par(org.par) > > par(mfrow=c(2,2), mar=c(1,2.5,2,1), oma=c(0,0,4,0)) > > # check that order of strings in two string degree2 is observed > cat('\n\ndegree2=c("age", "se"):\n') degree2=c("age", "se"): > plotmo(a81, do.par=FALSE, degree1=0, + degree2=c("age", "se"), main='degree2=c("age", "se")') > cat('\n\ndegree2=c("se", "age"):\n') degree2=c("se", "age"): > plotmo(a81, do.par=FALSE, degree1=0, + degree2=c("se", "age"), main='degree2=c("se", "age")') > > # check handling of bad strings in two string degree2 > cat('\n\ndegree2=c("nonesuch", "age"):\n') degree2=c("nonesuch", "age"): > try(plotmo(a81, do.par=FALSE, degree1=0, + degree2=c("nonesuch", "age"), main='degree2=c("nonesuch", "age")')) Warning: "nonesuch" in degree2 does not regex-match any names Available names are "pclass" "sex" "age" "sibsp" "parch" Warning: plotmo: nothing to plot > cat('\n\ndegree2=c("age", "nonesuch"):\n') degree2=c("age", "nonesuch"): > try(plotmo(a81, do.par=FALSE, degree1=0, + degree2=c("age", "nonesuch"), + main='degree2=c("age", "nonesuch")')) Warning: "nonesuch" in degree2 does not regex-match any names Available names are "pclass" "sex" "age" "sibsp" "parch" Warning: plotmo: nothing to plot > cat('\n\ndegree2=c("nevermore", "nonesuch"):\n') degree2=c("nevermore", "nonesuch"): > try(plotmo(a81, do.par=FALSE, degree1=0, + degree2=c("nevermore", "nonesuch"), + main='degree2=c("nevermore", "nonesuch")')) Warning: "nevermore" in degree2 does not regex-match any names Available names are "pclass" "sex" "age" "sibsp" "parch" Warning: plotmo: nothing to plot > # follow should still plot the degree1 plot even though degree2 spec is wrong > cat('\n\ndegree1=1, degree2=c("nevermore", "nonesuch"):\n') degree1=1, degree2=c("nevermore", "nonesuch"): > try(plotmo(a81, do.par=FALSE, degree1=1, + degree2=c("nevermore", "nonesuch"), + main='degree1=1\ndegree2=c("nevermore", "nonesuch")')) Warning: "nevermore" in degree2 does not regex-match any names Available names are "pclass" "sex" "age" "sibsp" "parch" plotmo grid: pclass sex age sibsp parch 3rd male 28 0 0 > > # expect warning: both elements of degree2 are the same > cat('\n\ndegree2=c("sex", "sex"):\n') degree2=c("sex", "sex"): > try(plotmo(a81, do.par=FALSE, degree1=0, + degree2=c("sex", "sex"), + main='degree1=1\ndegree2=c("sex", "sex")')) Warning: both elements of degree2 are the same > > par(org.par) > > source("test.epilog.R") plotmo/inst/slowtests/test.degree.bat0000755000176200001440000000156115124635472017530 0ustar liggesusers@rem test.degree.bat: test plotmo's degree1 and degree2 args with character arguments @echo test.degree.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.degree.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.degree.Rout: @echo. @tail test.degree.Rout @echo test.degree.R @exit /B 1 :good1 mks.diff test.degree.Rout test.degree.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.degree.save.ps @exit /B 1 :good2 @rem test.degree.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.degree.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.degree.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/make.bat0000755000176200001440000000557115126335341016233 0ustar liggesusers@rem plotmo/inst/slowtests/make.bat @call test.plotmo.bat @if %errorlevel% NEQ 0 goto err @call test.printcall.bat @if %errorlevel% NEQ 0 goto err @call test.dots.bat @if %errorlevel% NEQ 0 goto err @call test.plotmo.dots.bat @if %errorlevel% NEQ 0 goto err @call test.plotmo.x.bat @if %errorlevel% NEQ 0 goto err @call test.plotmo.args.bat @if %errorlevel% NEQ 0 goto err @call test.degree.bat @if %errorlevel% NEQ 0 goto err @call test.modguide.bat @if %errorlevel% NEQ 0 goto err @call test.linmod.bat @if %errorlevel% NEQ 0 goto err @call test.fac.bat @if %errorlevel% NEQ 0 goto err @call test.plotmo3.bat @if %errorlevel% NEQ 0 goto err @call test.center.bat @if %errorlevel% NEQ 0 goto err @call test.plotres.bat @if %errorlevel% NEQ 0 goto err @call test.partdep.bat @if %errorlevel% NEQ 0 goto err @call test.unusual.vars.bat @if %errorlevel% NEQ 0 goto err @call test.non.earth.bat @if %errorlevel% NEQ 0 goto err @rem The following miscellaneous models are in alphabetical order @call test.c50.bat @if %errorlevel% NEQ 0 goto err @call test.caret.bat @if %errorlevel% NEQ 0 goto err @call test.gbm.bat @if %errorlevel% NEQ 0 goto err @call test.glmnet.bat @if %errorlevel% NEQ 0 goto err @call test.glmnetUtils.bat @if %errorlevel% NEQ 0 goto err @call test.mlr.bat @if %errorlevel% NEQ 0 goto err @call test.parsnip.bat @if %errorlevel% NEQ 0 goto err @call test.partykit.bat @if %errorlevel% NEQ 0 goto err @call test.pre.bat @if %errorlevel% NEQ 0 goto err @rem we also run the earth package tests in \a\r\earth\inst\slowtests\make.bat @cd \a\r\earth\inst\slowtests @if %errorlevel% NEQ 0 goto err @call make.bat @if %errorlevel% NEQ 0 goto err @cd \a\r\plotmo\inst\slowtests @goto done :err @echo ==== ERROR ==== :done @exit /B 0 plotmo/inst/slowtests/test.plotres.R0000644000176200001440000003156713727235376017434 0ustar liggesusers# test.plotres.R source("test.prolog.R") library(earth) data(ozone1) data(etitanic) example(plotres) # basic tests of plotmo on abbreviated titanic data get.tit <- function() { tit <- etitanic pclass <- as.character(tit$pclass) # change the order of the factors so not alphabetical pclass[pclass == "1st"] <- "first" pclass[pclass == "2nd"] <- "class2" pclass[pclass == "3rd"] <- "classthird" tit$pclass <- factor(pclass, levels=c("class2", "classthird", "first")) # log age is so we have a continuous predictor even when model is age~. set.seed(2015) tit$logage <- log(tit$age) + rnorm(nrow(tit)) tit$parch <- NULL # by=12 gives us a small fast model with an additive and a interaction term tit <- tit[seq(1, nrow(etitanic), by=12), ] } tit <- get.tit() plotlm1 <- function(object) { old.par <- par(no.readonly=TRUE) on.exit(par(old.par)) par(mfrow=c(2,2), oma=c(0,0,3,0), mar=c(4, 3, 3, 1.5), mgp=c(1.5, 0.4, 0), tcl=-.3, font.main=1, cex.main=1) plot(object, sub.caption="standard call to plot.lm") } plotlm.using.plotres <- function(object) { old.par <- par(no.readonly=TRUE) on.exit(par(old.par)) par(mfrow=c(2,2), oma=c(0,0,3,0), mar=c(4, 3, 3, 1.5), mgp=c(1.5, 0.4, 0), tcl=-.3, font.main=1, cex.main=1) # residuals vs fitted plotres(object, pch=1, which=3, caption=paste(deparse(object$call), collapse=" ")) # QQ plot plotres(object, pch=1, which=4, standardize=TRUE) # scale-location plot plotres(object, pch=1, which=6, standardize=TRUE) # leverage plot plotres(object, pch=1, which=3, versus=4, standardize=TRUE) } lm.mod <- lm(Volume~., data=trees) plotlm1(lm.mod) plotlm.using.plotres(lm.mod) # various arguments plotres(lm.mod, SHOWCALL=TRUE) plotres(lm.mod, level=.95, id.n=-3, SHOWCALL=TRUE) lm.tit <- lm(survived~., data=tit) col <- ifelse(tit$survived, "green", "red") pch <- ifelse(tit$sex == "male", 20, 6) plotres(lm.tit, level=.95, col=col, pch=pch, level.shade="gray", level.shade2="lightgray", SHOWCALL=TRUE) plotres(lm.tit, col.resp=3, cum.col=2, cum.cex=1.2, grid.col=5, qq.col=1, qq.cex=.3, SHOWCALL=TRUE) plotres(lm.tit, pt.col="pink", smooth.col=0, SHOWCALL=TRUE) plotres(lm.tit, smooth.col=3, smooth.lwd=1.2, smooth.lty=2, smooth.f=.2, label.col=4, label.cex=.9, label.font=2, SHOWCALL=TRUE) foo <- function() { afoo <- earth(O3~., data=ozone1, deg=2) old.par <- par(no.readonly=TRUE) on.exit(par(old.par)) par(mfrow=c(2,2), oma=c(0,0,3,0), mar=c(4, 3, 3, 1.5), mgp=c(1.5, 0.4, 0), tcl=-.3, font.main=1, cex.main=1) # test xlim ylim etc. on qq and cum plots plotres(afoo, which=2, trace=0, xlim=c(0,20), ylim=c(-.2,1.1), grid.col="pink", info=TRUE) plotres(afoo, which=2, trace=0, grid.col="pink", info=TRUE, cum.col=2, cum.cex=1.4) plotres(afoo, which=4) plotres(afoo, which=4, trace=0, xlim=c(-7,7), ylim=c(-20, 20), qq.col=2, qq.cex=.5, label.col=1, qqline.col="orange", qqline.lty=1) # check xlim and ylim apply only to resids plots if multiple plots plotres(afoo, which=c(2:5), trace=0, xlim=c(-1,5), ylim=c(-8, 8), qq.col=2, qq.cex=.5, label.col=1, qqline.col="orange", smooth.col=3, smooth.lwd=2) } foo() # test id.n and npoints set.seed(1066) a20 <- earth(Volume~., data=trees, ncr=3, nfo=3, varmod.method="lm", keepxy=TRUE) par(mfrow=c(2,2), oma=c(0,0,3,0), mar=c(4, 3, 3, 1.5), mgp=c(1.5, 0.4, 0), tcl=-.3, cex=1) plot(a20, which=3, standardize=TRUE, smooth.col=0, id.n=-1, main="a20-00, smooth.col=0, id.n=-1", caption="test id.n and npoints") plot(a20, which=3, standardize=TRUE, smooth.col=0, id.n=10, main="a20-01, smooth.col=0, id.n=10") # this tests cex with do.par=FALSE plot(a20, which=3, standardize=TRUE, smooth.col=0, npoints=10, cex=.8, main="a20-02, smooth.col=0, npoints=10, cex=.8") # TODO labels are hosed in the following plot(a20, which=3, standardize=TRUE, smooth.col=0, npoints=5, id.n=10, main="a20-03, labels hosed\nsmooth.col=0, npoints=10, id.n=10") # test leverages and handling of unity leverages lm.mod <- lm(Volume~., data=trees) par(mfrow=c(2,2), oma=c(0,0,3,0), mar=c(4, 3, 3, 1.5), mgp=c(1.5, 0.4, 0), tcl=-.3, cex=1) a20$leverages[31] <- 1 # fake a unity leverage plot(a20, which=3, versus=4, standardize=TRUE, main="resids vs leverage\nunity leverage", caption="leverage plots") plotres(a20, which=3, standardize=TRUE, main="resids vs fitted\nunity leverage") plotres(lm.mod, which=3, versus=4, standardize=TRUE, main="lever plot for lm.mod") plotres(lm.mod, which=3, versus=4, standardize=TRUE, main="cook args", cook.levels=c(.5, .8, 1), cook.col="blue", cook.lty=2) plot(a20, which=3, versus=4, standardize=TRUE, info=TRUE, main="resids vs leverage\nunity leverage", caption="leverage plots with info=TRUE") plotres(a20, which=3, standardize=TRUE, info=TRUE, main="resids vs fitted\nunity leverage") plotres(lm.mod, which=3, versus=4, standardize=TRUE, info=TRUE, main="lever plot for lm.mod") plotres(lm.mod, which=3, versus=4, standardize=TRUE, info=TRUE, main="cook args", cook.levels=c(.5, .8, 1), cook.col="blue", cook.lty=2) # back compat tests par(mfrow=c(2,2), oma=c(0,0,3,0), mar=c(4, 3, 3, 1.5), mgp=c(1.5, 0.4, 0), tcl=-.3) plotres(a20, which=3, col.smooth=4, smooth.lwd=2, smooth.lty=2, main="a20-04 col.smooth=4, smooth.lwd=2, smooth.lty=2", caption="back compat tests with plot.earth") plotres(a20, which=4, qq.col=3, qqline.col="lightblue", qqline.lty=2, main="a20-05 qq.col=3") plotres(a20, which=4, qqline.col=0, main="a20-06 qqline.col=0") # set.seed(1066) # mod.earth.tit <- earth(tit[,-3], tit[,3], degree=2, nfold=3, ncross=3, varmod.method="earth", keepxy=TRUE) plot(0,0) plot(a20, which=1, col.grid="pink", col.rsq=3, lty.rsq=1, main="a20-07 col.grid=\"pink\", col.rsq=3, lty.rsq=1") # TODO following not working? plot(a20, which=3, col.cv=4, col.grid="pink", main="a20-08 col.cv=4, col.grid=\"pink\"") plot(a20, which=3, col.points="orange", cex.points=1.5, main="a20-09 col.points=\"orange\", cex.points=1.5") plot(a20, which=3, col.residuals="orange", smooth.f=.2, col.line=3, main="a20-10 col.residuals=\"orange\", smooth.f=.2, col.line=3") # test graphics args outside do.par par(col.main="#456789") cat("before par: cex=", par("cex"), " col.main=", par("col.main"), " col.axis=", par("col.axis"), "\n", sep="") plot(a20, which=c(2,3), caption="a20 which=c(2,3) (i.e. do.par=TRUE) no cex") plot(a20, which=c(2,3), cex=1, caption="a20 which=c(2,3) (i.e. do.par=TRUE) cex=1, plot should be identical to previous page") plot(a20, which=c(2,3), cex=1.2, caption="a20 which=c(2,3) (i.e. do.par=TRUE) cex=1.2") plot(a20, which=3, main="no cex", caption="a20 test graphics args with do.par=FALSE") plot(a20, which=3, cex=1, main="cex=1") plot(a20, which=3, cex=.8, main="cex=.8") plot(a20, which=3, cex=1.1, col.main=2, col.axis="blue", col.lab=3, font.lab=2, main="cex=1.1, col.main=2, col.axis=\"blue\", col.lab=3, font.lab=2") # all of these should have been restored cat("after par: cex=", par("cex"), " col.main=", par("col.main"), " col.axis=", par("col.axis"), "\n", sep="") stopifnot(par("col.main") == "#456789") par(col.main=1) survived <- as.numeric(tit$survived) # 0 or 1 sex <- as.numeric(tit$sex) # 1 or 2 pclass <- as.numeric(tit$pclass) # 1,2, or 3 age <- tit$age # .2 to 80 printf("======== basic operation, compare to plot.lm etc.\n") par(mfrow=c(2,2), mar=c(3,3,3,1), mgp=c(1.5,0.5,0), oma=c(0,0,2.5,0)) lm <- lm(survived~sex+pclass+age) plot(lm, which=5, pch=20) plot(0, 0) plot(lm, which=1, pch=20) plot(lm, which=2, pch=20) plotres(lm, standardize=1, cook.levels=c(.1,.2,.3), SHOWCALL=TRUE) elm <- earth(survived~sex+pclass+age, linpreds=TRUE, thresh=0, penalty=-1) plotres(elm, col=survived+2, SHOWCALL=TRUE) set.seed(2015) elm.glm <- earth(survived~sex+pclass+age, linpreds=TRUE, thresh=0, penalty=-1, glm=list(family=binomial), ncr=3, nfold=3, varmod.method="lm") plotres(elm.glm, col=survived+2, SHOWCALL=TRUE) printf("======== check type arg with earth\n") par(mfrow=c(2,2), mar=c(3,3,3,1), mgp=c(1.5,0.5,0), oma=c(0,0,2.5,0)) # following two are equivalent # TODO $$ following look wrong (the plots have changed from plotmo/earth pre Sep 2020) plotres(elm.glm, col=survived+2, standardize=TRUE, which=3, do.par=FALSE, main="standardize=TRUE") mtext("elm.glm with various type options", outer=TRUE, font=2, line=1, cex=1) plotres(elm.glm, col=survived+2, type="standardize", which=3, do.par=FALSE, main="type=\"standardize\"\nequivalent to standardize=TRUE") # TODO double standardization, should not be allowed plotres(elm.glm, col=survived+2, standardize=TRUE, type="standardize", which=3, do.par=FALSE, main="standard=TRUE, type=\"deviance\"\ndouble standardization") plotres(elm.glm, col=survived+2, type="deviance", which=3, do.par=FALSE, main="type=\"deviance\"") printf("======== multiple response earth models\n") par(mfrow=c(2,2), mar=c(3,3,3,1), mgp=c(1.5,0.5,0), oma=c(0,0,2.5,0)) set.seed(2015) emulti0 <- earth(cbind(Volume, Volume + 100 + 5 * rnorm(nrow(trees)))~., data=trees) set.seed(2015) plot(emulti0, nresponse=2, which=3, do.par=FALSE, main="emulti0 nresponse=2") set.seed(2015) rnorm1 <- rnorm(nrow(trees)) emulti <- earth(cbind(Volume, Volume + 100 + 5 * rnorm1)~., data=trees) plot(emulti, nresponse=2, which=3, do.par=FALSE, main="emulti nresponse=2") mtext("multiple response earth models", outer=TRUE, font=2, line=1, cex=1) plot(emulti, nresponse=2, FORCEPREDICT=TRUE, which=3, do.par=FALSE, main="emulti, nresponse=2\nFORCEPREDICT=TRUE") printf("======== earth model with a factor response\n") epclass <- earth(pclass~., data=tit) par(mfrow=c(2,2), mar=c(3,3,3,1), mgp=c(1.5,0.5,0), oma=c(0,0,2.5,0)) set.seed(2015) plot(epclass, nresponse="first", trace=1, which=3, do.par=FALSE, main="pclass response, nresponse=\"first\"") mtext("earth model with a factor response", outer=TRUE, font=2, line=1, cex=1) plot(epclass, nresponse="first", trace=1, FORCEPREDICT=TRUE, which=3, do.par=FALSE, main="pclass response, nresponse=\"first\"\nFORCEPREDICT=TRUE") printf("======== glm\n") glm <- glm(survived~sex+pclass+age, family=binomial) par(mfrow=c(2,2), mar=c(3,3,3,1), mgp=c(1.5,0.5,0), oma=c(0,0,2.5,0)) plot(glm, which=1, pch=20, main="plot.lm") mtext("glm model with plot.lm and plotres", outer=TRUE, font=2, line=1, cex=1) plotres(glm, which=3, main="plotres glm survived") # with plotres we can also plot pearson etc. residuals plotres(glm, which=3, type="pearson", main="plotres glm survived\ntype=\"pearson\"") printf("======== rpart\n") library(rpart) par(mfrow=c(2,2), mar=c(3,3,3,1), mgp=c(1.5,0.5,0), oma=c(0,0,2.5,0)) rpart <- rpart(survived~sex+pclass+age) plotres(rpart, SHOWCALL=TRUE) plotres(rpart, SHOWCALL=TRUE, FORCEPREDICT=TRUE) # identical # TODO following fails in plotmo.predict.rpart (which is called to get the fitted values) # plotres(rpart, type="pearson") plotres(rpart, jitter=3, w1.extra=100, w1.under=TRUE, w1.branch.type=5, col=survived+2, smooth.col=NA, label.col=1, SHOWCALL=TRUE) fit <- rpart(Kyphosis ~ Age + Number + Start, data = kyphosis) plotres(fit, nresponse=1, SHOWCALL=TRUE, jitter=5) plotres(fit, nresponse=2, SHOWCALL=TRUE, jitter=TRUE) printf("======== versus=\"b:\"\n") library(gam) gam.package.loaded <- "package:gam" %in% search() mgcv.package.loaded <- "package:mgcv" %in% search() if(mgcv.package.loaded && gam.package.loaded) { # prevent downstream confusing error messages stop0("both 'gam' and 'mgcv' are loaded") } library(earth) data(ozone1) data(ozone1) oz <- ozone1[, c("O3", "humidity", "temp", "ibt")] gam.mod <- gam(O3^(1/3) ~ lo(humidity)+lo(ibt,temp), data=oz) plotmo(gam.mod, SHOWCALL=TRUE) plotres(gam.mod, SHOWCALL=TRUE) plotres(gam.mod, versus="b:", SHOWCALL=TRUE) plotres(gam.mod, versus="b:ib", info=TRUE, SHOWCALL=TRUE) gam.linear.humidity.only <- gam(O3^(1/3) ~ humidity, data=oz) plotres(gam.linear.humidity.only, versus="b:", SHOWCALL=TRUE) library(mda) mars <- mars(ozone1[,2:3], ozone1[,1], degree=2) mars.to.earth <- mars.to.earth(mars) plotres(mars, versus="b:", caption="mars model, versus=\"b:\"", SHOWCALL=TRUE) plotres(mars.to.earth, versus="b:", caption="earth model, versus=\"b:\", should be same as previous page", SHOWCALL=TRUE) plotres(mars, versus="b:1", caption="mars model, versus=\"b:1\"", SHOWCALL=TRUE) # lars is tested in plotmo3.R # gbm is tested in plotmo3.R # TODO fda is not tested source("test.epilog.R") plotmo/inst/slowtests/test.plotmo.args.bat0000755000176200001440000000160115124635472020535 0ustar liggesusers@rem test.plotmo.args.bat: test dot and other argument handling in plotmo @echo test.plotmo.args.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.plotmo.args.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.plotmo.args.Rout: @echo. @tail test.plotmo.args.Rout @echo test.plotmo.args.R @exit /B 1 :good1 mks.diff test.plotmo.args.Rout test.plotmo.args.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.plotmo.args.save.ps @exit /B 1 :good2 @rem test.plotmo.args.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.plotmo.args.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.plotmo.args.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/test.pre.R0000644000176200001440000000745213727235376016526 0ustar liggesusers# test.pre.R: test the "pre" package with plotmo and plotres source("test.prolog.R") library(pre) library(plotmo) library(earth) # for ozone1 options(warn=1) # print warnings as they occur data(airquality) airq <- airquality[complete.cases(airquality), (c("Ozone", "Wind", "Temp"))] # prevent confusion caused by integer rownames which don't match row numbers rownames(airq) <- NULL airq <- airq[1:50, ] # small set of data for quicker test coef.glmnet <- glmnet:::coef.glmnet # TODO workaround required for glmnet 3.0 predict.cv.glmnet <- glmnet:::predict.cv.glmnet set.seed(2018) pre.mod <- pre(Ozone~., data=airq, ntrees=10) # ntrees=10 for faster test plotres(pre.mod) # variable importance and residual plots plotres(pre.mod, which=3, main="pre.mod residuals") # which=3 for just the residual vs fitted plot plotmo(pre.mod) # plot model surface with background variables held at their medians # sanity check: compare model surface to to randomForest # (commented out to save test time) # # library(randomForest) # set.seed(2018) # rf.mod <- randomForest(Ozone~., data=airq) # plotmo(rf.mod) # compare singleplot and plotmo par(mfrow=c(2,2)) # 4 plots per page singleplot(pre.mod, varname="Temp", main="Temp\n(singleplot)") plotmo(pre.mod, pmethod="partdep", # plot partial dependence plot, degree1="Temp", degree2=0, # plot only Temp, no degree2 plots do.par=FALSE, # don't automatically set par(), use above par(mfrow) main="Temp\n(plotmo partdep)") # test penalty.par.val="lambda.min" singleplot(pre.mod, varname="Temp", main="penalty.par.val=lambda.min\n(singleplot)", penalty.par.val="lambda.min") plotmo(pre.mod, pmethod="partdep", degree1="Temp", degree2=0, do.par=FALSE, main="penalty.par.val=lambda.min\n(plotmo partdep)", predict.penalty.par.val="lambda.min") # use "predict." to pass it on to predict.pre par(org.par) # compare pairplot and plotmo par(mfrow=c(2,3)) # 6 plots per page pairplot(pre.mod, c("Temp", "Wind"), main="pairplot") plotmo(pre.mod, main="plotmo partdep", pmethod="partdep", degree1=0, degree2="Temp", do.par=FALSE) # Compare to pmethod="apartdep". An approximate partdep plot is # faster than a full partdep plot (plotmo vignette Section 9.2). plotmo(pre.mod, main="plotmo apartdep", pmethod="apartdep", degree1=0, degree2="Temp", do.par=FALSE) # plot contour and image plots with plotmo plotmo(pre.mod, type2="contour", degree1=0, degree2="Temp", do.par=FALSE) plotmo(pre.mod, type2="image", degree1=0, degree2="Temp", do.par=FALSE) par(org.par) # test gpe models set.seed(2018) gpe.mod <- gpe(Ozone~., data=airq, base_learners=list(gpe_linear(), gpe_trees(), gpe_earth())) plotmo(gpe.mod) # by default no degree2 plots because importance(gpe) not available plotmo(gpe.mod, all2=TRUE, # force degree2 plot(s) by specifying all2=TRUE persp.ticktype="detailed", persp.nticks=2) # optional (these get passed on to persp) plotmo(gpe.mod, degree1=0, degree2=c("Wind", "Temp"), SHOWCALL=TRUE) # explictly specify degree2 plot # which=3 below for only the residuals-vs-fitted plot # optional info=TRUE to plot some extra information (RSq etc.) plotres(gpe.mod, which=3, info=TRUE, main="gpe.mod residuals") # multinomial response set.seed(2018) pre.iris <- pre(Species~., data=iris, ntrees=10) # ntrees=10 for faster testoptions(warn=2) # treat warnings as errors options(warn=2) # treat warnings as errors expect.err(try(plotmo(pre.iris)), "Defaulting to nresponse=1, see above messages") options(warn=1) # print warnings as they occur plotmo(pre.iris, all2=TRUE, nresponse="virginica", trace=1) source("test.epilog.R") plotmo/inst/slowtests/test.pre.bat0000755000176200001440000000142315124635472017060 0ustar liggesusers@rem test.pre.bat: pre tests for plotmo and plotres @echo test.pre.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.pre.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.pre.Rout: @echo. @tail test.pre.Rout @echo test.pre.R @exit /B 1 :good1 mks.diff test.pre.Rout test.pre.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.pre.save.ps @exit /B 1 :good2 @rem test.pre.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.pre.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.pre.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/test.fac.Rout.save0000644000176200001440000004213514563614021020136 0ustar liggesusers> # test.fac.R: test factor plotting in plotmo. This also tests swapxy, xflip, and yflip > # Stephen Milborrow, Berea Mar 2011 > > source("test.prolog.R") > library(plotmo) Loading required package: Formula Loading required package: plotrix > library(earth) > library(rpart) > data(ozone1) > data(etitanic) > > cat("==test plotmo with factors==\n") ==test plotmo with factors== > test.fac.with.rpart <- function(ngrid2=20) + { + et <- etitanic + + col.response <- as.numeric(et$sex)+2 + et$pclass.fac <- et$pclass + et$parch.int <- et$parch + parch.fac <- et$parch + parch.fac[parch.fac >= 3] <- 3 + # use non alphabetically sorted factor levels + et$parch.fac <- factor(parch.fac, labels=c( "levz", "lev1", "lev2", "levf")) + et$pclass.num <- as.numeric(et$pclass) + et$pclass <- et$sex <- et$age <- et$sibsp <- et$parch <- NULL + cat("names(et):", names(et), "\n") # survived pclass.fac parch.int parch.fac pclass.num + + old.par <- par(no.readonly=TRUE) + on.exit(par(old.par)) + par(mfrow=c(4,5)) + par(mar = c(2, 2, 3, 0.5), cex=.6) + + # numeric x numeric + a2 <- rpart(survived ~ pclass.num+parch.int, data=et) + set.seed(145) + plotmo(a2, do.par=F, type2="im", degree1=2, + col.response=col.response, pt.cex=.3) + set.seed(145) + plotmo(a2, do.par=F, type2="con", degree1=NA, + col.response=col.response, pt.cex=.3) + set.seed(145) + plotmo(a2, do.par=F, type2="persp", degree1=NA, + ngrid2=40, persp.theta=NA, persp.ticktype="d", cex.lab=.8, persp.ntick=2) + + # factor x numeric + a3 <- rpart(survived ~ pclass.fac+parch.int, data=et) + set.seed(145) + plotmo(a3, do.par=F, type2="im", + col.response=col.response, pt.cex=.3) + set.seed(145) + plotmo(a3, do.par=F, type2="con", degree1=NA, + col.response=col.response, pt.cex=.3) + + set.seed(145) + plotmo(a3, do.par=F, type2="persp", degree1=NA, + ngrid2=40, persp.theta=NA, persp.ticktype="d", persp.border=NA, cex.lab=.8, persp.ntick=2) + + # numeric x factor + a4 <- rpart(survived ~ pclass.num+parch.fac, data=et) + set.seed(145) + plotmo(a4, do.par=F, type2="im", tra=1, + col.response=col.response, pt.cex=.3) + set.seed(145) + plotmo(a4, do.par=F, type2="con", degree1=NA, + col.response=col.response, pt.cex=.3) + set.seed(145) + plotmo(a4, do.par=F, type2="persp", degree1=NA, + ngrid2=40, persp.theta=NA, persp.ticktype="d", persp.border=NA, cex.lab=.8, persp.ntick=2) + + # factor x factor + a5 <- rpart(survived ~ pclass.fac+parch.fac, data=et) + set.seed(145) + plotmo(a5, do.par=F, type2="im", nrug=TRUE, + col.response=col.response, pt.cex=.3) + set.seed(145) + plotmo(a5, do.par=F, type2="con", degree1=NA, + col.response=col.response, pt.cex=.3) + set.seed(145) + plotmo(a5, do.par=F, type2="persp", degree1=NA, + ngrid2=40, persp.theta=NA, persp.ticktype="d", persp.border=NA, cex.lab=.8, persp.ntick=2) + + # test ndiscrete + par(mfrow=c(3,5)) + par(mar = c(2, 2, 3, 0.5), cex=.6) + + plotmo(a2, do.par=F, type2="persp", degree1=2, ndiscrete=0, main="ndiscrete=0", + persp.theta=NA, persp.ticktype="d", persp.ntick=2, + col.response=col.response, pt.cex=.3) + plotmo(a2, do.par=F, type2="im", degree1=NA, ndiscrete=0) + plotmo(a2, do.par=F, type2="con", degree1=NA, ndiscrete=0) + plotmo(a2, do.par=F, type2="persp", degree1=2, degree2=NA, ndiscrete=0, main="center", center=TRUE, + col.response=col.response, pt.cex=.3) + + plotmo(a2, do.par=F, type2="persp", degree1=2, ndiscrete=3, main="ndiscrete=3", + persp.theta=NA, persp.ticktype="d", persp.ntick=2, + col.response=col.response, pt.cex=.3) + plotmo(a2, do.par=F, type2="im", degree1=NA, ndiscrete=3) + plotmo(a2, do.par=F, type2="con", degree1=NA, ndiscrete=3) + plotmo(a2, do.par=F, type2="persp", degree1=2, degree2=NA, ndiscrete=3, main="center", center=TRUE, + col.response=col.response, pt.cex=.3) + + plotmo(a2, do.par=F, type2="persp", degree1=2, ndiscrete=10, main="ndiscrete=10", + persp.theta=NA, persp.ticktype="d", persp.ntick=2, + col.response=col.response, pt.cex=.3) + plotmo(a2, do.par=F, type2="im", degree1=NA, ndiscrete=10) + plotmo(a2, do.par=F, type2="con", degree1=NA, ndiscrete=10) + plotmo(a2, do.par=F, type2="persp", degree1=2, degree2=NA, ndiscrete=10, main="center", center=TRUE, + col.response=col.response, pt.cex=.3) + } > test.fac.with.rpart() names(et): survived pclass.fac parch.int parch.fac pclass.num plotmo grid: pclass.num parch.int 2 0 plotmo grid: pclass.fac parch.int 3rd 0 stats::predict(rpart.object, data.frame[3,2], type="vector") stats::fitted(object=rpart.object) fitted() was unsuccessful, will use predict() instead got model response from model.frame(survived ~ pclass.num + parch.fac, data=call$data, na.action="na.pass") plotmo grid: pclass.num parch.fac 2 levz plotmo grid: pclass.fac parch.fac 3rd levz plotmo grid: pclass.num parch.int 2 0 Warning: forcing clip=FALSE because center=TRUE (a limitation of the current implementation) plotmo grid: pclass.num parch.int 2 0 plotmo grid: pclass.num parch.int 2 0 Warning: forcing clip=FALSE because center=TRUE (a limitation of the current implementation) plotmo grid: pclass.num parch.int 2 0 plotmo grid: pclass.num parch.int 2 0 Warning: forcing clip=FALSE because center=TRUE (a limitation of the current implementation) plotmo grid: pclass.num parch.int 2 0 > cat("==test plotmo swapxy with factors==\n") ==test plotmo swapxy with factors== > test.swapxy.with.rpart <- function(ngrid2=20) + { + et <- etitanic[c(1:50,300:350,600:650),] + + col.response <- as.numeric(et$sex)+2 + et$pclass.fac <- et$pclass + et$parch.int <- et$parch + parch.fac <- et$parch + parch.fac[parch.fac > 2] <- 2 + # use non alphabetically sorted factor levels + et$parch.fac <- factor(parch.fac, labels=c("lev.zero", "lev.one", "lev.two.or.more")) + print(et$parch.fac) + et$pclass.num <- as.numeric(et$pclass) + et$pclass <- et$sex <- et$age <- et$sibsp <- et$parch <- NULL + cat("names(et):", names(et), "\n") # survived pclass.fac parch.int parch.fac pclass.num + + old.par <- par(no.readonly=TRUE) + on.exit(par(old.par)) + par(mfrow=c(4,4)) + par(mar = c(2, 3, 5, 0.5), cex=.6) + + # factor x factor + a5 <- rpart(survived ~ pclass.fac+parch.fac, data=et) + for(swapxy in c(F,T)) { + for(xflip in c(F,T)) + for(yflip in c(F,T)) { + set.seed(145) + plotmo(a5, do.par=F, type2="im", degree1=NA, + swapxy=swapxy, xflip=xflip, yflip=yflip, + main=paste("swapxy=", swapxy, "\nxflip=", xflip, "\nyflip=", yflip), + col.response=col.response, pt.cex=3, + pt.pch=".") + set.seed(145) + plotmo(a5, do.par=F, type2="con", degree1=NA, + swapxy=swapxy, xflip=xflip, yflip=yflip, + main=paste("swapxy=", swapxy, "\nxflip=", xflip, "\nyflip=", yflip), + col.response=col.response, pt.cex=.3) + } + } + par(mfrow=c(2,2)) + set.seed(146) + plotmo(a5, do.par=F, type2="persp", degree1=NA, + swapxy=FALSE, main=paste("swapxy=", FALSE), + ngrid2=40, persp.theta=145, persp.ticktype="d", cex.lab=.8, persp.ntick=5) + set.seed(146) + plotmo(a5, do.par=F, type2="persp", degree1=NA, + swapxy=TRUE, main=paste("swapxy=", TRUE), + ngrid2=40, persp.theta=145, persp.ticktype="d", cex.lab=.8, persp.ntick=5) + set.seed(146) + plotmo(a5, do.par=F, type2="im", degree1=2, + swapxy=FALSE, main=paste("swapxy=", FALSE)) + } > test.swapxy.with.rpart() [1] lev.zero lev.two.or.more lev.two.or.more lev.two.or.more [5] lev.two.or.more lev.zero lev.zero lev.zero [9] lev.zero lev.zero lev.zero lev.zero [13] lev.zero lev.zero lev.zero lev.one [17] lev.one lev.zero lev.zero lev.one [21] lev.one lev.zero lev.zero lev.zero [25] lev.zero lev.zero lev.zero lev.zero [29] lev.zero lev.zero lev.zero lev.zero [33] lev.zero lev.zero lev.zero lev.one [37] lev.zero lev.zero lev.zero lev.zero [41] lev.zero lev.zero lev.zero lev.zero [45] lev.zero lev.one lev.one lev.zero [49] lev.zero lev.zero lev.zero lev.one [53] lev.one lev.one lev.two.or.more lev.zero [57] lev.zero lev.zero lev.zero lev.zero [61] lev.zero lev.zero lev.two.or.more lev.one [65] lev.one lev.zero lev.zero lev.zero [69] lev.zero lev.zero lev.zero lev.two.or.more [73] lev.one lev.one lev.zero lev.zero [77] lev.zero lev.zero lev.zero lev.zero [81] lev.zero lev.one lev.two.or.more lev.zero [85] lev.zero lev.zero lev.zero lev.zero [89] lev.two.or.more lev.one lev.one lev.zero [93] lev.zero lev.zero lev.one lev.zero [97] lev.two.or.more lev.zero lev.zero lev.zero [101] lev.zero lev.zero lev.zero lev.zero [105] lev.one lev.one lev.one lev.two.or.more [109] lev.zero lev.zero lev.zero lev.zero [113] lev.one lev.one lev.zero lev.zero [117] lev.zero lev.zero lev.zero lev.zero [121] lev.zero lev.zero lev.zero lev.zero [125] lev.one lev.one lev.one lev.one [129] lev.zero lev.zero lev.zero lev.zero [133] lev.zero lev.zero lev.zero lev.zero [137] lev.zero lev.zero lev.zero lev.zero [141] lev.zero lev.zero lev.zero lev.zero [145] lev.zero lev.zero lev.zero lev.zero [149] lev.zero lev.zero lev.zero lev.zero Levels: lev.zero lev.one lev.two.or.more names(et): survived pclass.fac parch.int parch.fac pclass.num plotmo grid: pclass.fac parch.fac 2nd lev.zero > > aflip <- earth(O3~vh + wind + humidity + temp, data=ozone1, degree=2) > col.response<- ifelse(ozone1$O3 == 38, "red", "pink") > > # test xflip arg, degree1 plots > par(mfrow=c(2,2)) > set.seed(102) > plotmo(aflip, degree1=1:2, degree2=0, do.par=F, col.response=col.response, nrug=-1, ylab="O3", smooth.col="gray") plotmo grid: vh wind humidity temp 5760 5 64 62 > plotmo(aflip, degree1=1:2, degree2=F, do.par=F, col.response=col.response, nrug=-1, ylab="O3", xflip=T, main="xflip=TRUE, degree1 plots", , smooth.col="gray") plotmo grid: vh wind humidity temp 5760 5 64 62 > > col.response<- ifelse(ozone1$O3 == 1, "green", "pink") > > # test flip args, type2=persp > par(mfrow=c(2,2)) > plotmo(aflip, degree1=0, degree2=2, do.par=F, persp.ticktype="d") > plotmo(aflip, degree1=0, degree2=2, do.par=F, persp.tickt="d", swapxy=T, main="swapxy=TRUE") > plot(0, 0, type="n", axes=FALSE, xlab="", ylab="") > plot(0, 0, type="n", axes=FALSE, xlab="", ylab="") > > # test swapxy args, type2=image > par(mfrow=c(3,3)) > > plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="im", col.response=col.response, main="test swapxy on image plots\nreference plot") > plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="im", col.response=col.response, swapxy=T, main="swapxy=T") > plot(0, 0, type="n", axes=FALSE, xlab="", ylab="") > > plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="im", col.response=col.response, xflip=T, main="xflip=T") > plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="im", col.response=col.response, yflip=T, main="yflip=T") > plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="im", col.response=col.response, xflip=T, yflip=T, main="xflip=T, yflip=T") > > plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="im", col.response=col.response, swapxy=T, xflip=T, main="swapxy=T, xflip=T") > plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="im", col.response=col.response, swapxy=T, yflip=T, main="swapxy=T, yflip=T") > plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="im", col.response=col.response, swapxy=T, xflip=T, yflip=T, main="swapxy=T, xflip=T, yflip=T") > > # test flip args, type2=contour > plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="con", col.response=col.response, main="test flip on contour plots\nreference plot") > plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="con", col.response=col.response, swapxy=T) > plot(0, 0, type="n", axes=FALSE, xlab="", ylab="") > > plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="con", col.response=col.response, xflip=T) > plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="con", col.response=col.response, yflip=T) > plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="con", col.response=col.response, xflip=T, yflip=T) > > plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="con", col.response=col.response, swapxy=T, xflip=T) > plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="con", col.response=col.response, swapxy=T, yflip=T) > plotmo(aflip, degree1=0, degree2=2, do.par=F, type2="con", col.response=col.response, swapxy=T, xflip=T, yflip=T) > > # ordered factor > > cat("==test plotmo with ordered factor==\n") ==test plotmo with ordered factor== > par(mfcol=c(2,2)) > par(mar=c(3, 3, 3, 1)) > par(mgp=c(1.5, .5, 0)) > a <- lm(height~., data=Loblolly) > termplot(a, partial.resid=T, rug=T, terms=2, main="Seed is an ordered factor") # compare to termplot > plotmo(a, do.par=F, col.resp="gray", nrug=T, all2=T) plotmo grid: age Seed 12.5 329 > > #--------------------------------------------------------------------------- > # test ndiscrete with integer and non integer predictors, with missing values > > par(mfcol=c(2,4)) > par(mar=c(3, 3, 3, 1)) > par(mgp=c(1.5, .5, 0)) > et <- etitanic > et$var <- et$parch > et$var[et$var==1] <- 0 # want a "hole" in var's value, for testing > et$var[1:3] <- 6 > cat("table(et$var):") table(et$var):> print(table(et$var)) 0 2 3 4 5 6 927 95 8 5 6 5 > cat("\n") > a <- earth(survived~var+age, data=et, degree=2, pm="none") > > plotmo(a, trace=FALSE, ndiscrete=0, + main="integral var\n(var levels are 0 2 3 4 5 6)\nndiscrete=0", cex.lab=.8, + do.par=F, smooth.col="indianred", persp.ticktype="d", clip=F, degree1=0, persp.theta=40) > > plotmo(a, ndiscrete=0, + do.par=F, smooth.col="indianred", ylim=c(-.5,1), degree2=0, degree1=1) plotmo grid: var age 0 28 > > #------------ > plotmo(a, ndiscrete=10, main="integral var\nndiscrete=10", cex.lab=.8, + do.par=F, smooth.col="indianred", persp.ticktype="d", clip=F, degree1=0, persp.theta=40) > > plotmo(a, trace=0, ndiscrete=10, + do.par=F, smooth.col="indianred", ylim=c(-.5,1), degree2=0, degree1=1) plotmo grid: var age 0 28 > > #------------ > et$var <- et$var / 2 > cat("table(et$var):") table(et$var):> print(table(et$var)) 0 1 1.5 2 2.5 3 927 95 8 5 6 5 > cat("\n") > a <- earth(survived~var+age, data=et, degree=2, pm="none") > > plotmo(a, ndiscrete=0, + main="integral var\n(var levels are 0 1 1.5 2 2.5 3)\nndiscrete=0", cex.lab=.8, + do.par=F, smooth.col="indianred", persp.ticktype="d", clip=F, degree1=0, persp.theta=40) > > plotmo(a, ndiscrete=0, + do.par=F, smooth.col="indianred", ylim=c(-.5,1), degree2=0, degree1=1) plotmo grid: var age 0 28 > > #------------ > plotmo(a, ndiscrete=10, main="non integral var\nndiscrete=10", cex.lab=.8, + do.par=F, smooth.col="indianred", persp.ticktype="d", clip=F, degree1=0, persp.theta=40) > > plotmo(a, ndiscrete=10, + do.par=F, smooth.col="indianred", ylim=c(-.5,1), degree2=0, degree1=1) plotmo grid: var age 0 28 > > source("test.epilog.R") plotmo/inst/slowtests/test.linmod.Rout.save0000644000176200001440000041752514563614021020700 0ustar liggesusers> # test.linmod.R: test example S3 model at http://www.milbo.org/doc/linmod.R > > source("test.prolog.R") > source("linmod.R") # linear model code (http://www.milbo.org/doc/linmod.R) > source("linmod.methods.R") # additional method functions for linmod > options(warn=1) # print warnings as they occur > > almost.equal <- function(x, y, max=1e-8) + { + stopifnot(max >= 0 && max < .01) + length(x) == length(y) && max(abs(x - y)) < max + } > # check that linmod model matches reference lm model in all essential details > check.lm <- function(fit, ref, newdata=trees[3:5,], + check.coef.names=TRUE, + check.casenames=TRUE, + check.newdata=TRUE, + check.sigma=TRUE) + { + check.names <- function(fit.names, ref.names) + { + if(check.casenames && + # lm always adds rownames even if "1", "2", "3": this seems + # wasteful and not particulary helpful, so linmod doesn't do + # this, hence the first !isTRUE(all.equal) below + !isTRUE(all.equal(ref.names, paste(1:length(ref.names)))) && + !isTRUE(all.equal(fit.names, ref.names))) { + print(fit.names) + print(ref.names) + stop(deparse(substitute(fit.names)), " != ", + deparse(substitute(ref.names))) + } + } + cat0("check ", deparse(substitute(fit)), " vs ", + deparse(substitute(ref)), "\n") + + stopifnot(coef(fit) == coef(ref)) + if(check.coef.names) + stopifnot(identical(names(coef(fit)), names(coef(ref)))) + + stopifnot(identical(dim(fit$coefficients), dim(ref$coefficients))) + stopifnot(length(fit$coefficients) == length(ref$coefficients)) + stopifnot(almost.equal(fit$coefficients, ref$coefficients)) + + stopifnot(identical(dim(fit$residuals), dim(ref$residuals))) + stopifnot(length(fit$residuals) == length(ref$residuals)) + stopifnot(almost.equal(fit$residuals, ref$residuals)) + + stopifnot(identical(dim(fit$fitted.values), dim(ref$fitted.values))) + stopifnot(length(fit$fitted.values) == length(ref$fitted.values)) + stopifnot(almost.equal(fit$fitted.values, ref$fitted.values)) + + stopifnot(identical(fit$rank, ref$rank)) + + if(!is.null(fit$vcov) && !is.null(ref$vcov)) { + stopifnot(identical(dim(fit$vcov), dim(ref$vcov))) + stopifnot(length(fit$vcov) == length(ref$vcov)) + stopifnot(almost.equal(fit$vcov, ref$vcov)) + } + if(check.sigma) { + ref.sigma <- ref$sigma + if(is.null(ref.sigma)) # in lm models, sigma is only available from summary() + ref.sigma <- summary(ref)$sigma + stopifnot(almost.equal(fit$sigma, ref.sigma)) + } + stopifnot(almost.equal(fit$df.residual, ref$df.residual)) + + stopifnot(almost.equal(fitted(fit), fitted(ref))) + check.names(names(fitted(fit)), names(fitted(ref))) + + stopifnot(almost.equal(residuals(fit), residuals(ref))) + check.names(names(residuals(fit)), names(residuals(ref))) + + stopifnot(almost.equal(predict(fit), predict(ref))) + check.names(names(predict(fit)), names(predict(ref))) + if(check.newdata) { + stopifnot(almost.equal(predict(fit, newdata=newdata), + predict(ref, newdata=newdata))) + check.names(names(predict(fit, newdata=newdata)), + names(predict(ref, newdata=newdata))) + } + } > tr <- trees # trees data but with rownames > rownames(tr) <- paste("tree", 1:nrow(trees), sep="") > > linmod.form.Volume.tr <- linmod(Volume~., data=tr) > cat0("==print(summary(linmod.form.Volume.tr))\n") ==print(summary(linmod.form.Volume.tr)) > print(summary(linmod.form.Volume.tr)) Call: linmod.formula(formula = Volume ~ ., data = tr) Estimate StdErr t.value p.value (Intercept) -57.9876589 8.6382259 -6.712913 2.749507e-07 Girth 4.7081605 0.2642646 17.816084 8.223304e-17 Height 0.3392512 0.1301512 2.606594 1.449097e-02 > lm.Volume.tr <- lm(Volume~., data=tr) > check.lm(linmod.form.Volume.tr, lm.Volume.tr) check linmod.form.Volume.tr vs lm.Volume.tr > stopifnot(almost.equal(predict(linmod.form.Volume.tr, newdata=data.frame(Girth=10, Height=80)), + 16.234045, max=1e-5)) > stopifnot(almost.equal(predict(linmod.form.Volume.tr, newdata=as.matrix(tr[1:3,])), + c(4.8376597, 4.5538516, 4.8169813), max=1e-5)) > # character new data (instead of numeric) > newdata.allchar <- as.data.frame(matrix("blank", ncol=3, nrow=3)) > colnames(newdata.allchar) <- colnames(trees) > expect.err(try(predict(lm.Volume.tr, newdata=newdata.allchar)), + "variables 'Girth', 'Height' were specified with different types from the fit") Error : variables 'Girth', 'Height' were specified with different types from the fit Got expected error from try(predict(lm.Volume.tr, newdata = newdata.allchar)) > expect.err(try(predict(linmod.form.Volume.tr, newdata=newdata.allchar)), + "variables 'Girth', 'Height' were specified with different types from the fit") Error : variables 'Girth', 'Height' were specified with different types from the fit Got expected error from try(predict(linmod.form.Volume.tr, newdata = newdata.allchar)) > > linmod.xy.Volume.tr <- linmod(tr[,1:2], tr[,3,drop=FALSE]) # x=data.frame y=data.frame > cat0("==print(summary(linmod.xy.Volume.tr))\n") ==print(summary(linmod.xy.Volume.tr)) > print(summary(linmod.xy.Volume.tr)) Call: linmod.default(x = tr[, 1:2], y = tr[, 3, drop = FALSE]) Estimate StdErr t.value p.value (Intercept) -57.9876589 8.6382259 -6.712913 2.749507e-07 Girth 4.7081605 0.2642646 17.816084 8.223304e-17 Height 0.3392512 0.1301512 2.606594 1.449097e-02 > newdata.2col <- trees[3:5,1:2] > check.lm(linmod.xy.Volume.tr, lm.Volume.tr, newdata=newdata.2col) check linmod.xy.Volume.tr vs lm.Volume.tr > stopifnot(almost.equal(predict(linmod.xy.Volume.tr, newdata=data.frame(Girth=10, Height=80)), + 16.234045, max=1e-5)) > stopifnot(almost.equal(predict(linmod.xy.Volume.tr, newdata=tr[1:3,1:2]), + c(4.8376597, 4.5538516, 4.8169813), max=1e-5)) > > linmod50.xy.Volume.tr <- linmod(as.matrix(tr[,1:2]), as.matrix(tr[,3,drop=FALSE])) # x=matrix y=matrix > check.lm(linmod50.xy.Volume.tr, lm.Volume.tr, newdata=newdata.2col) check linmod50.xy.Volume.tr vs lm.Volume.tr > linmod51.xy.Volume.tr <- linmod(tr[,1:2], tr[,3]) # x=data.frame y=vector > check.lm(linmod51.xy.Volume.tr, lm.Volume.tr, newdata=newdata.2col) check linmod51.xy.Volume.tr vs lm.Volume.tr > linmod52.xy.Volume.tr <- linmod(as.matrix(tr[,1:2]), tr[,3]) # x=matrix y=vector > check.lm(linmod52.xy.Volume.tr, lm.Volume.tr, newdata=newdata.2col) check linmod52.xy.Volume.tr vs lm.Volume.tr > > # newdata can be a vector > stopifnot(almost.equal(predict(linmod.xy.Volume.tr, newdata=c(8.3, 70)), + 4.8376597, max=1e-5)) > stopifnot(almost.equal(predict(linmod.xy.Volume.tr, + newdata=c(8.3, 8.6, 70, 65)), # 4 element vector, byrow=FALSE + c(4.8376597, 4.5538516), max=1e-5)) > options(warn=1) # print warnings as they occur > # expect Warning: data length [3] is not a sub-multiple or multiple of the number of rows [2] > stopifnot(almost.equal(predict(linmod.xy.Volume.tr, newdata=c(8.3, 9, 70)), # 3 element vector + c(4.8376597, -12.7984291), max=1e-5)) Warning in matrix(newdata, ncol = length(object$coefficients) - 1) : data length [3] is not a sub-multiple or multiple of the number of rows [2] > options(warn=2) # treat warnings as errors > > stopifnot(almost.equal(predict(linmod.xy.Volume.tr, newdata=as.matrix(data.frame(Girth=10, Height=80))), + 16.234045, max=1e-5)) > # column names in newdata are ignored for linmod.default models > stopifnot(almost.equal(predict(linmod.xy.Volume.tr, newdata=data.frame(name1.not.in.orig.data=10, name2.not.in.orig.datax2=80)), + 16.234045, max=1e-5)) > # note name reversed below but names still ignored, same predict result as c(Girth=10, Height=80) > stopifnot(almost.equal(predict(linmod.xy.Volume.tr, newdata=data.frame(Height=10, Girth=80)), + 16.234045, max=1e-5)) > > cat0("==print.default(linmod.form.Volume.tr)\n") ==print.default(linmod.form.Volume.tr) > print.default(linmod.form.Volume.tr) $coefficients (Intercept) Girth Height -57.9876589 4.7081605 0.3392512 $residuals tree1 tree2 tree3 tree4 tree5 tree6 5.46234035 5.74614837 5.38301873 0.52588477 -1.06900844 -1.31832696 tree7 tree8 tree9 tree10 tree11 tree12 -0.59268807 -1.04594918 1.18697860 -0.28758128 2.18459773 -0.46846462 tree13 tree14 tree15 tree16 tree17 tree18 -0.06846462 0.79384587 -4.85410969 -5.65220290 2.21603352 -6.40648192 tree19 tree20 tree21 tree22 tree23 tree24 -4.90097760 -3.79703501 0.11181561 -4.30831896 0.91474029 -3.46899800 tree25 tree26 tree27 tree28 tree29 tree30 -2.27770232 4.45713224 3.47624891 4.87148717 -2.39932888 -2.89932888 tree31 8.48469518 $rank [1] 3 $fitted.values tree1 tree2 tree3 tree4 tree5 tree6 tree7 tree8 4.837660 4.553852 4.816981 15.874115 19.869008 21.018327 16.192688 19.245949 tree9 tree10 tree11 tree12 tree13 tree14 tree15 tree16 21.413021 20.187581 22.015402 21.468465 21.468465 20.506154 23.954110 27.852203 tree17 tree18 tree19 tree20 tree21 tree22 tree23 tree24 31.583966 33.806482 30.600978 28.697035 34.388184 36.008319 35.385260 41.768998 tree25 tree26 tree27 tree28 tree29 tree30 tree31 44.877702 50.942868 52.223751 53.428513 53.899329 53.899329 68.515305 $vcov (Intercept) Girth Height (Intercept) 74.6189461 0.43217138 -1.05076889 Girth 0.4321714 0.06983578 -0.01786030 Height -1.0507689 -0.01786030 0.01693933 $sigma [1] 3.881832 $df.residual [1] 28 $call linmod.formula(formula = Volume ~ ., data = tr) $terms Volume ~ Girth + Height attr(,"variables") list(Volume, Girth, Height) attr(,"factors") Girth Height Volume 0 0 Girth 1 0 Height 0 1 attr(,"term.labels") [1] "Girth" "Height" attr(,"order") [1] 1 1 attr(,"intercept") [1] 1 attr(,"response") [1] 1 attr(,".Environment") attr(,"predvars") list(Volume, Girth, Height) attr(,"dataClasses") Volume Girth Height "numeric" "numeric" "numeric" $xlevels named list() attr(,"class") [1] "linmod" > > cat0("==check single x variable\n") ==check single x variable > linmod1a.form <- linmod(Volume~Height, data=tr) > cat0("==print(summary(linmod1a.form))\n") ==print(summary(linmod1a.form)) > print(summary(linmod1a.form)) Call: linmod.formula(formula = Volume ~ Height, data = tr) Estimate StdErr t.value p.value (Intercept) -87.12361 29.2731221 -2.976232 0.0058346689 Height 1.54335 0.3838693 4.020509 0.0003783823 > lma.tr <- lm(Volume~Height, data=tr) > check.lm(linmod1a.form, lma.tr) check linmod1a.form vs lma.tr > > stopifnot(almost.equal(predict(linmod1a.form, newdata=data.frame(Height=80)), + 36.34437, max=1e-5)) > stopifnot(almost.equal(predict(linmod1a.form, newdata=data.frame(Girth=99, Height=80)), + 36.34437, max=1e-5)) > stopifnot(almost.equal(predict(linmod1a.form, newdata=as.matrix(tr[1:3,])), + c(20.91087, 13.19412, 10.10742), max=1e-5)) > > linmod1a.xy <- linmod(tr[,2,drop=FALSE], tr[,3]) > cat0("==print(summary(linmod1a.xy))\n") ==print(summary(linmod1a.xy)) > print(summary(linmod1a.xy)) Call: linmod.default(x = tr[, 2, drop = FALSE], y = tr[, 3]) Estimate StdErr t.value p.value (Intercept) -87.12361 29.2731221 -2.976232 0.0058346689 Height 1.54335 0.3838693 4.020509 0.0003783823 > check.lm(linmod1a.xy, lma.tr, newdata=trees[3:5,2,drop=FALSE]) check linmod1a.xy vs lma.tr > check.lm(linmod1a.xy, lma.tr, newdata=trees[3:5,2,drop=TRUE], + check.newdata=FALSE) # needed because predict.lm gives 'data' must be a data.frame, environment, or list check linmod1a.xy vs lma.tr > stopifnot(almost.equal(predict(linmod1a.xy, newdata=trees[3:5,2,drop=FALSE]), + predict(linmod1a.xy, newdata=trees[3:5,2,drop=TRUE]))) > stopifnot(almost.equal(predict(linmod1a.xy, newdata=data.frame(Height=80)), + 36.34437, max=1e-5)) > stopifnot(almost.equal(predict(linmod1a.xy, newdata=tr[1:3,2]), + c(20.91087, 13.19412, 10.10742), max=1e-5)) > stopifnot(almost.equal(predict(linmod1a.xy, newdata=as.matrix(data.frame(Height=80))), + 36.34437, max=1e-5)) > > # check that extra fields in predict newdata are ok with formula models > stopifnot(almost.equal(predict(linmod.form.Volume.tr, newdata=data.frame(Girth=10, Height=80, extra=99)), + predict(lm.Volume.tr, newdata=data.frame(Girth=10, Height=80)))) > stopifnot(almost.equal(predict(linmod.form.Volume.tr, newdata=data.frame(Girth=10, Height=80, extra=99)), + predict(lm.Volume.tr, newdata=data.frame(Girth=10, Height=80, extra=99)))) > # check that extra fields in predict newdata are not ok with x,y models > expect.err(try(predict(linmod.xy.Volume.tr, newdata=data.frame(Girth=10, Height=80, extra=99))), + "ncol(newdata) is 3 but should be 2") Error in predict.linmod(linmod.xy.Volume.tr, newdata = data.frame(Girth = 10, : ncol(newdata) is 3 but should be 2 Got expected error from try(predict(linmod.xy.Volume.tr, newdata = data.frame(Girth = 10, Height = 80, extra = 99))) > > # missing variables in newdata > expect.err(try(predict(linmod.form.Volume.tr, newdata=data.frame(Girth=10))), + "object 'Height' not found") Error in eval(predvars, data, env) : object 'Height' not found Got expected error from try(predict(linmod.form.Volume.tr, newdata = data.frame(Girth = 10))) > expect.err(try(predict(linmod.form.Volume.tr, newdata=c(8.3, 70))), + "object 'Girth' not found") Error in eval(predvars, data, env) : object 'Girth' not found Got expected error from try(predict(linmod.form.Volume.tr, newdata = c(8.3, 70))) > expect.err(try(predict(lm.Volume.tr, newdata=data.frame(Girth=10))), + "object 'Height' not found") Error in eval(predvars, data, env) : object 'Height' not found Got expected error from try(predict(lm.Volume.tr, newdata = data.frame(Girth = 10))) > expect.err(try(predict(linmod.xy.Volume.tr, newdata=data.frame(Girth=10))), + "ncol(newdata) is 1 but should be 2") Error in predict.linmod(linmod.xy.Volume.tr, newdata = data.frame(Girth = 10)) : ncol(newdata) is 1 but should be 2 Got expected error from try(predict(linmod.xy.Volume.tr, newdata = data.frame(Girth = 10))) > > # check that rownames got propagated > stopifnot(names(linmod.form.Volume.tr$residuals)[1] == "tree1") > stopifnot(names(linmod.form.Volume.tr$fitted.values)[3] == "tree3") > stopifnot(names(linmod.xy.Volume.tr$residuals)[1] == "tree1") > stopifnot(names(linmod.xy.Volume.tr$fitted.values)[3] == "tree3") > stopifnot(!is.null(names(linmod.xy.Volume.tr$residuals))) > stopifnot(!is.null(names(linmod.xy.Volume.tr$fitted.values))) > cat0("==print.default(linmod.xy.Volume.tr)\n") ==print.default(linmod.xy.Volume.tr) > print.default(linmod.xy.Volume.tr) $coefficients (Intercept) Girth Height -57.9876589 4.7081605 0.3392512 $residuals tree1 tree2 tree3 tree4 tree5 tree6 5.46234035 5.74614837 5.38301873 0.52588477 -1.06900844 -1.31832696 tree7 tree8 tree9 tree10 tree11 tree12 -0.59268807 -1.04594918 1.18697860 -0.28758128 2.18459773 -0.46846462 tree13 tree14 tree15 tree16 tree17 tree18 -0.06846462 0.79384587 -4.85410969 -5.65220290 2.21603352 -6.40648192 tree19 tree20 tree21 tree22 tree23 tree24 -4.90097760 -3.79703501 0.11181561 -4.30831896 0.91474029 -3.46899800 tree25 tree26 tree27 tree28 tree29 tree30 -2.27770232 4.45713224 3.47624891 4.87148717 -2.39932888 -2.89932888 tree31 8.48469518 $rank [1] 3 $fitted.values tree1 tree2 tree3 tree4 tree5 tree6 tree7 tree8 4.837660 4.553852 4.816981 15.874115 19.869008 21.018327 16.192688 19.245949 tree9 tree10 tree11 tree12 tree13 tree14 tree15 tree16 21.413021 20.187581 22.015402 21.468465 21.468465 20.506154 23.954110 27.852203 tree17 tree18 tree19 tree20 tree21 tree22 tree23 tree24 31.583966 33.806482 30.600978 28.697035 34.388184 36.008319 35.385260 41.768998 tree25 tree26 tree27 tree28 tree29 tree30 tree31 44.877702 50.942868 52.223751 53.428513 53.899329 53.899329 68.515305 $vcov (Intercept) Girth Height (Intercept) 74.6189461 0.43217138 -1.05076889 Girth 0.4321714 0.06983578 -0.01786030 Height -1.0507689 -0.01786030 0.01693933 $sigma [1] 3.881832 $df.residual [1] 28 $call linmod.default(x = tr[, 1:2], y = tr[, 3, drop = FALSE]) attr(,"class") [1] "linmod" > > # check that we don't artificially add rownames when no original rownames > linmod1a.xy <- linmod(trees[,1:2], trees[,3]) > stopifnot(is.null(names(linmod1a.xy$residuals))) > stopifnot(is.null(names(linmod1a.xy$fitted.values))) > > cat0("==example plots\n") ==example plots > > library(plotmo) Loading required package: Formula Loading required package: plotrix > data(trees) > > linmod.form.Volume.trees <- linmod(Volume~., data=trees) > print(linmod.form.Volume.trees) Call: linmod.formula(formula = Volume ~ ., data = trees) (Intercept) Girth Height -57.9876589 4.7081605 0.3392512 > print(summary(linmod.form.Volume.trees)) Call: linmod.formula(formula = Volume ~ ., data = trees) Estimate StdErr t.value p.value (Intercept) -57.9876589 8.6382259 -6.712913 2.749507e-07 Girth 4.7081605 0.2642646 17.816084 8.223304e-17 Height 0.3392512 0.1301512 2.606594 1.449097e-02 > > linmod1.xy <- linmod(trees[,1:2], trees[,3]) > print(linmod1.xy) Call: linmod.default(x = trees[, 1:2], y = trees[, 3]) (Intercept) Girth Height -57.9876589 4.7081605 0.3392512 > print(summary(linmod1.xy)) Call: linmod.default(x = trees[, 1:2], y = trees[, 3]) Estimate StdErr t.value p.value (Intercept) -57.9876589 8.6382259 -6.712913 2.749507e-07 Girth 4.7081605 0.2642646 17.816084 8.223304e-17 Height 0.3392512 0.1301512 2.606594 1.449097e-02 > > plotmo(linmod.form.Volume.trees) plotmo grid: Girth Height 12.9 76 > plotmo(linmod1.xy) plotmo grid: Girth Height 12.9 76 > > plotres(linmod.form.Volume.trees) > plotres(linmod1.xy) > > cat0("==test keep arg\n") ==test keep arg > > trees1 <- trees > linmod.form.Volume.trees.keep <- linmod(Volume~., data=trees1, keep=TRUE) > print(summary(linmod.form.Volume.trees.keep)) Call: linmod.formula(formula = Volume ~ ., data = trees1, keep = TRUE) Estimate StdErr t.value p.value (Intercept) -57.9876589 8.6382259 -6.712913 2.749507e-07 Girth 4.7081605 0.2642646 17.816084 8.223304e-17 Height 0.3392512 0.1301512 2.606594 1.449097e-02 > print(head(linmod.form.Volume.trees.keep$data)) Girth Height Volume 1 8.3 70 10.3 2 8.6 65 10.3 3 8.8 63 10.2 4 10.5 72 16.4 5 10.7 81 18.8 6 10.8 83 19.7 > stopifnot(dim(linmod.form.Volume.trees.keep$data) == c(nrow(trees1), ncol(trees1))) > trees1 <- NULL # destroy orginal data so plotmo has to use keep data > plotmo(linmod.form.Volume.trees.keep, pt.col=3) plotmo grid: Girth Height 12.9 76 > plotres(linmod.form.Volume.trees.keep) > > linmod.xy.keep <- linmod(trees[,1:2], trees[,3], keep=TRUE) > print(summary(linmod.xy.keep)) Call: linmod.default(x = trees[, 1:2], y = trees[, 3], keep = TRUE) Estimate StdErr t.value p.value (Intercept) -57.9876589 8.6382259 -6.712913 2.749507e-07 Girth 4.7081605 0.2642646 17.816084 8.223304e-17 Height 0.3392512 0.1301512 2.606594 1.449097e-02 > print(head(linmod.xy.keep$x)) Girth Height [1,] 8.3 70 [2,] 8.6 65 [3,] 8.8 63 [4,] 10.5 72 [5,] 10.7 81 [6,] 10.8 83 > stopifnot(dim(linmod.xy.keep$x) == c(nrow(trees), 2)) > stopifnot(class(linmod.xy.keep$x)[1] == "matrix") > print(head(linmod.xy.keep$y)) trees[,3] [1,] 10.3 [2,] 10.3 [3,] 10.2 [4,] 16.4 [5,] 18.8 [6,] 19.7 > stopifnot(dim(linmod.xy.keep$y) == c(nrow(trees), 1)) > stopifnot(class(linmod.xy.keep$y)[1] == "matrix") > linmod.xy.keep$call <- NULL # trick to force use of x and y in plotmo > plotmo(linmod.xy.keep, pt.col=3) plotmo grid: Girth Height 12.9 76 > plotres(linmod.xy.keep) > > check.lm(linmod.form.Volume.trees.keep, linmod.xy.keep, check.casenames=FALSE, check.newdata=FALSE) check linmod.form.Volume.trees.keep vs linmod.xy.keep > > cat0("==test keep arg with vector x\n") ==test keep arg with vector x > > n <- 20 > linmod.vecx.form.keep <- linmod(Volume~Height, data=trees[1:n,], keep=TRUE) > print(summary(linmod.vecx.form.keep)) Call: linmod.formula(formula = Volume ~ Height, data = trees[1:n, ], keep = TRUE) Estimate StdErr t.value p.value (Intercept) -19.3368332 11.9072601 -1.623953 0.121767815 Height 0.5318092 0.1597269 3.329491 0.003730259 > print(head(linmod.vecx.form.keep$data)) Girth Height Volume 1 8.3 70 10.3 2 8.6 65 10.3 3 8.8 63 10.2 4 10.5 72 16.4 5 10.7 81 18.8 6 10.8 83 19.7 > stopifnot(dim(linmod.vecx.form.keep$data) == c(n, ncol(trees))) > stopifnot(class(linmod.vecx.form.keep$data) == class(trees)) > plotmo(linmod.vecx.form.keep, pt.col=3) > plotres(linmod.vecx.form.keep) > > linmod.vecx.xy.keep <- linmod(trees[1:n,2], trees[1:n,3], keep=TRUE) > print(summary(linmod.vecx.xy.keep)) Call: linmod.default(x = trees[1:n, 2], y = trees[1:n, 3], keep = TRUE) Estimate StdErr t.value p.value (Intercept) -19.3368332 11.9072601 -1.623953 0.121767815 V1 0.5318092 0.1597269 3.329491 0.003730259 > print(head(linmod.vecx.xy.keep$x)) [,1] [1,] 70 [2,] 65 [3,] 63 [4,] 72 [5,] 81 [6,] 83 > stopifnot(dim(linmod.vecx.xy.keep$x) == c(n, 1)) > stopifnot(class(linmod.vecx.xy.keep$x)[1] == "matrix") > print(head(linmod.vecx.xy.keep$y)) trees[1:n,3] [1,] 10.3 [2,] 10.3 [3,] 10.2 [4,] 16.4 [5,] 18.8 [6,] 19.7 > stopifnot(dim(linmod.vecx.xy.keep$y) == c(n, 1)) > stopifnot(class(linmod.vecx.xy.keep$y)[1] == "matrix") > linmod.vecx.xy.keep$call <- NULL # trick to force use of x and y in plotmo > plotmo(linmod.vecx.xy.keep, pt.col=3) > plotres(linmod.vecx.xy.keep) > > check.lm(linmod.vecx.form.keep, linmod.vecx.xy.keep, newdata=trees[3:5,2,drop=FALSE], + check.coef.names=FALSE, check.casenames=FALSE) check linmod.vecx.form.keep vs linmod.vecx.xy.keep > > cat0("==test model building with assorted numeric args\n") ==test model building with assorted numeric args > > x <- tr[,1:2] > y <- tr[,3] > cat0("class(x)=", class(x), " class(y)=", class(y), "\n") # class(x)=data.frame class(y)=numeric class(x)=data.frame class(y)=numeric > linmod2.xy <- linmod(x, y) > check.lm(linmod2.xy, lm.Volume.tr, newdata=newdata.2col) check linmod2.xy vs lm.Volume.tr > > # check consistency with lm > expect.err(try(linmod(y~x)), "invalid type (list) for variable 'x'") Error in model.frame.default(formula = formula, data = data, na.action = na.pass) : invalid type (list) for variable 'x' Got expected error from try(linmod(y ~ x)) > expect.err(try(lm(y~x)), "invalid type (list) for variable 'x'") Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) : invalid type (list) for variable 'x' Got expected error from try(lm(y ~ x)) > > linmod3.xy <- linmod(as.matrix(x), as.matrix(y)) > check.lm(linmod3.xy, lm.Volume.tr, newdata=newdata.2col) check linmod3.xy vs lm.Volume.tr > > linmod4.form <- linmod(y ~ as.matrix(x)) > lm4 <- lm(y ~ as.matrix(x)) > check.lm(linmod4.form, lm4, check.newdata=FALSE) check linmod4.form vs lm4 > stopifnot(coef(linmod4.form) == coef(lm.Volume.tr), + gsub("as.matrix(x)", "", names(coef(linmod4.form)), fixed=TRUE) == names(coef(lm.Volume.tr))) > > xm <- as.matrix(x) > cat0("class(xm)=", class(xm), " class(y)=", class(y), "\n") # class(xm)=matrix class(y)=numeric class(xm)=matrixarray class(y)=numeric > linmod5.form <- linmod(y ~ xm) > lm5 <- lm(y ~ xm) > check.lm(linmod5.form, lm5, check.newdata=FALSE) check linmod5.form vs lm5 > stopifnot(coef(linmod5.form) == coef(lm.Volume.tr), + gsub("xm", "", names(coef(linmod5.form)), fixed=TRUE) == names(coef(lm.Volume.tr))) > > cat0("==test correct use of global x1 and y1, and of predict error handling\n") ==test correct use of global x1 and y1, and of predict error handling > x1 <- tr[,1] > y1 <- tr[,3] > cat0("class(x1)=", class(x1), " class(y1)=", class(y1), "\n") # class(x1)=numeric class(y1)=numeric class(x1)=numeric class(y1)=numeric > linmod.y1.x1 <- linmod(y1~x1) > lm1 <- lm(y1~x1) > linmod6.xy <- linmod(x1, y1) > > newdata.x1 <- trees[3:5,1,drop=FALSE] > colnames(newdata.x1) <- "x1" > stopifnot(almost.equal(predict(linmod.y1.x1, newdata=newdata.x1), + c(7.63607739644657, 16.24803331528098, 17.26120459984973))) > > check.lm(linmod6.xy, linmod.y1.x1, newdata=x1[3:5], + check.newdata=FALSE, # TODO needed because linmod.y1.x1 ignores newdata(!) + check.coef.names=FALSE, check.casenames=FALSE) check linmod6.xy vs linmod.y1.x1 > print(predict(linmod6.xy, newdata=x1[3:5])) [1] 7.636077 16.248033 17.261205 > stopifnot(almost.equal(predict(linmod6.xy, newdata=x1[3]), 7.63607739644657)) > > stopifnot(coef(linmod6.xy) == coef(linmod.y1.x1)) # names(coef(linmod.y1.x1) are "(Intercept)" "x1" > stopifnot(names(coef(linmod6.xy)) == c("(Intercept)", "V1")) > > # following checks some confusing behaviour of predict.lm > options(warn=2) # treat warnings as errors > expect.err(try(predict(lm1, newdata=trees[3:5,1,drop=FALSE])), + "'newdata' had 3 rows but variables found have 31 rows") Error : (converted from warning) 'newdata' had 3 rows but variables found have 31 rows Got expected error from try(predict(lm1, newdata = trees[3:5, 1, drop = FALSE])) > expect.err(try(predict(lm1, newdata=trees[3:5,1,drop=TRUE])), + "'data' must be a data.frame, environment, or list") Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : 'data' must be a data.frame, environment, or list Got expected error from try(predict(lm1, newdata = trees[3:5, 1, drop = TRUE])) > > # following checks messages when missing variables in newdata > > options(warn=2) # treat warnings as errors to check that we get a warning in stats::model.frame > expect.err(try(predict(linmod.y1.x1, newdata=trees[3:5,1,drop=FALSE])), + "(converted from warning) 'newdata' had 3 rows but variables found have 31 rows") Error : (converted from warning) 'newdata' had 3 rows but variables found have 31 rows Got expected error from try(predict(linmod.y1.x1, newdata = trees[3:5, 1, drop = FALSE])) > expect.err(try(predict(lm1, newdata=trees[3:5,1,drop=FALSE])), + "(converted from warning) 'newdata' had 3 rows but variables found have 31 rows") Error : (converted from warning) 'newdata' had 3 rows but variables found have 31 rows Got expected error from try(predict(lm1, newdata = trees[3:5, 1, drop = FALSE])) > expect.err(try(predict(linmod.y1.x1, newdata=trees[3:5,1,drop=TRUE])), + "(converted from warning) 'newdata' had 3 rows but variables found have 31 rows") Error : (converted from warning) 'newdata' had 3 rows but variables found have 31 rows Got expected error from try(predict(linmod.y1.x1, newdata = trees[3:5, 1, drop = TRUE])) > > # following checks predict.linmod error messages when missing variables > # (it tries to give better error messages than predict.lm) > > options(warn=1) # print warnings as they occur to test stop() in linmod.R::process.newdata.formula > expect.err(try(predict(linmod.y1.x1, newdata=trees[3:5,1,drop=FALSE])), + "newdata has 3 rows but model.frame returned 31 rows (variable 'x1' may be missing from newdata)") Warning: 'newdata' had 3 rows but variables found have 31 rows Error in process.newdata.formula(object, newdata) : newdata has 3 rows but model.frame returned 31 rows (variable 'x1' may be missing from newdata) Got expected error from try(predict(linmod.y1.x1, newdata = trees[3:5, 1, drop = FALSE])) > expect.err(try(predict(linmod.y1.x1, newdata=trees[3:5,1,drop=TRUE])), + "newdata has 3 rows but model.frame returned 31 rows (variable 'x1' may be missing from newdata)") Warning: 'newdata' had 3 rows but variables found have 31 rows Error in process.newdata.formula(object, newdata) : newdata has 3 rows but model.frame returned 31 rows (variable 'x1' may be missing from newdata) Got expected error from try(predict(linmod.y1.x1, newdata = trees[3:5, 1, drop = TRUE])) > options(warn=2) # back to treating warnings as errors > > # test old version of linmod.R (pre Sep 2020) > # > # expect.err(try(predict(linmod.y1.x1, newdata=trees[3:5,1,drop=FALSE])), > # "variable 'x1' is missing from newdata") > # expect.err(try(predict(lm1, newdata=trees[3:5,1,drop=FALSE])), > # "(converted from warning) 'newdata' had 3 rows but variables found have 31 rows") > # expect.err(try(predict(linmod.y1.x1, newdata=trees[3:5,1,drop=TRUE])), > # "variable 'x1' is missing from newdata") > > linmod6.form <- linmod(y1~x1) > check.lm(linmod6.form, linmod.y1.x1, check.newdata=FALSE) check linmod6.form vs linmod.y1.x1 > > newdata <- trees[5:6,] > colnames(newdata) <- c("Girth", "Height", "Volume999") # doesn't matter what we call the response > stopifnot(identical(predict(linmod.form.Volume.tr, newdata=newdata), + predict(linmod.form.Volume.tr, newdata=trees[5:6,]))) > newdata <- trees[5:6,3:1] # reverse columns and their colnames > colnames(newdata) <- c("Volume", "Height", "Girth") > stopifnot(identical(predict(linmod.form.Volume.tr, newdata=newdata), + predict(linmod.form.Volume.tr, newdata=trees[5:6,]))) > newdata <- trees[5:6,2:1] # reverse columns and their colnames, delete response column > colnames(newdata) <- c("Height", "Girth") > stopifnot(identical(predict(linmod.form.Volume.tr, newdata=newdata), + predict(linmod.form.Volume.tr, newdata=trees[5:6,]))) > stopifnot(identical(predict(linmod.form.Volume.tr, newdata=as.matrix(trees[5:6,])), # allow matrix newdata + predict(linmod.form.Volume.tr, newdata=trees[5:6,]))) > newdata <- trees[5:6,] > colnames(newdata) <- c("Girth99", "Height", "Volume") > expect.err(try(predict(linmod.form.Volume.tr, newdata=newdata)), + "object 'Girth' not found") Error in eval(predvars, data, env) : object 'Girth' not found Got expected error from try(predict(linmod.form.Volume.tr, newdata = newdata)) > colnames(newdata) <- c("Girth", "Height99", "Volume") > expect.err(try(predict(linmod.form.Volume.tr, newdata=newdata)), + "object 'Height' not found") Error in eval(predvars, data, env) : object 'Height' not found Got expected error from try(predict(linmod.form.Volume.tr, newdata = newdata)) > > cat0("==check integer input (sibsp is an integer)\n") ==check integer input (sibsp is an integer) > > library(earth) # for etitanic data > data(etitanic) > tit <- etitanic[seq(1, nrow(etitanic), by=60), ] # small set of data for tests (18 cases) > tit$survived <- tit$survived != 0 # convert to logical > rownames(tit) <- paste("pas", 1:nrow(tit), sep="") > cat0(paste(colnames(tit), "=", sapply(tit, class), sep="", collapse=", "), "\n") pclass=factor, survived=logical, sex=factor, age=numeric, sibsp=integer, parch=integer > > linmod7.xy <- linmod(tit$age, tit$sibsp) > lm7 <- lm.fit(cbind(1, tit$age), tit$sibsp) > stopifnot(coef(linmod7.xy) == coef(lm7)) # coef names will differ > > linmod7.form <- linmod(sibsp~age, data=tit) > lm7.form <- lm(sibsp~age, data=tit) > check.lm(linmod7.form, lm7.form, newdata=tit[3:5,]) check linmod7.form vs lm7.form > > linmod8.xy <- linmod(tit$sibsp, tit$age) > lm8 <- lm.fit(cbind(1, tit$sibsp), tit$age) > stopifnot(coef(linmod8.xy) == coef(lm8)) # coef names will differ > > linmod8.form <- linmod(age~sibsp, data=tit) > lm8.form <- lm(age~sibsp, data=tit) > check.lm(linmod8.form, lm8.form, newdata=tit[3:5,]) check linmod8.form vs lm8.form > > # drop=FALSE so response is a data frame > linmod1a.xy <- linmod(trees[,1:2], trees[, 3, drop=FALSE]) > print(linmod1a.xy) Call: linmod.default(x = trees[, 1:2], y = trees[, 3, drop = FALSE]) (Intercept) Girth Height -57.9876589 4.7081605 0.3392512 > print(summary(linmod1a.xy)) Call: linmod.default(x = trees[, 1:2], y = trees[, 3, drop = FALSE]) Estimate StdErr t.value p.value (Intercept) -57.9876589 8.6382259 -6.712913 2.749507e-07 Girth 4.7081605 0.2642646 17.816084 8.223304e-17 Height 0.3392512 0.1301512 2.606594 1.449097e-02 > plotres(linmod1a.xy) # plot caption shows response name "Volume" > > cat0("==test model building with assorted non-numeric args\n") ==test model building with assorted non-numeric args > > library(earth) # for etitanic data > data(etitanic) > etit <- etitanic[seq(1, nrow(etitanic), by=60), ] # small set of data for tests (18 cases) > etit$survived <- etit$survived != 0 # convert to logical > rownames(etit) <- paste("pas", 1:nrow(etit), sep="") > cat0(paste(colnames(etit), "=", sapply(etit, class), sep="", collapse=", "), "\n") pclass=factor, survived=logical, sex=factor, age=numeric, sibsp=integer, parch=integer > > lm9 <- lm(survived~., data=etit) > linmod9.form <- linmod(survived~., data=etit) > check.lm(linmod9.form, lm9, newdata=etit[3:5,]) check linmod9.form vs lm9 > > # change class of pclass to numeric > etit.pclass.numeric <- etit > etit.pclass.numeric$pclass <- as.numeric(etit$pclass) > expect.err(try(predict(lm9, newdata=etit.pclass.numeric)), + "(converted from warning) variable 'pclass' is not a factor") Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : (converted from warning) variable 'pclass' is not a factor Got expected error from try(predict(lm9, newdata = etit.pclass.numeric)) > expect.err(try(predict(linmod9.form, newdata=etit.pclass.numeric)), + "(converted from warning) variable 'pclass' is not a factor") Error in model.frame.default(terms, newdata, na.action = na.pass, xlev = object$xlevels) : (converted from warning) variable 'pclass' is not a factor Got expected error from try(predict(linmod9.form, newdata = etit.pclass.numeric)) > > # change class of age to factor > etit.age.factor <- etit > etit.age.factor$age <- etit$pclass > expect.err(try(predict(lm9, newdata=etit.age.factor)), + "variable 'age' was fitted with type \"numeric\" but type \"factor\" was supplied") Error : variable 'age' was fitted with type "numeric" but type "factor" was supplied Got expected error from try(predict(lm9, newdata = etit.age.factor)) > expect.err(try(predict(linmod9.form, newdata=etit.age.factor)), + "variable 'age' was fitted with type \"numeric\" but type \"factor\" was supplied") Error : variable 'age' was fitted with type "numeric" but type "factor" was supplied Got expected error from try(predict(linmod9.form, newdata = etit.age.factor)) > > # predict for formula model ignores extra column(s) in newdata > etit.extra.col <- etit > etit.extra.col$extra <- etit$sibsp > stopifnot(identical(predict(lm9, newdata=etit), predict(lm9, newdata=etit.extra.col))) > stopifnot(identical(predict(linmod9.form, newdata=etit), predict(linmod9.form, newdata=etit.extra.col))) > etit.extra.col$extra2 <- etit$sibsp > stopifnot(identical(predict(lm9, newdata=etit), predict(lm9, newdata=etit.extra.col))) > stopifnot(identical(predict(linmod9.form, newdata=etit), predict(linmod9.form, newdata=etit.extra.col))) > > # predict for formula model doesn't care if columns in different order > etit.different.col.order <- etit[,ncol(etit):1] # reverse order of columns > stopifnot(identical(predict(lm9, newdata=etit), predict(lm9, newdata=etit.different.col.order))) > stopifnot(identical(predict(linmod9.form, newdata=etit), predict(linmod9.form, newdata=etit.different.col.order))) > > # linmod.default, non numeric x (factors in x) > expect.err(try(linmod(etit[c(1,3,4,5,6)], etit[,"survived"])), + "non-numeric column in 'x'") Error in check.linmod.x(x) : non-numeric column in 'x' Got expected error from try(linmod(etit[c(1, 3, 4, 5, 6)], etit[, "survived"])) > expect.err(try(linmod.fit(etit[c(1,3,4,5,6)], etit[,"survived"])), + "'x' is not a matrix or could not be converted to a matrix") Error in check.linmod.x(x) : 'x' is not a matrix or could not be converted to a matrix Got expected error from try(linmod.fit(etit[c(1, 3, 4, 5, 6)], etit[, "survived"])) > # lousy error message from lm.fit > expect.err(try(lm.fit(etit[,c(1,3,4,5,6)], etit[,"survived"])), + "INTEGER() can only be applied to a 'integer', not a 'NULL'") Error in lm.fit(etit[, c(1, 3, 4, 5, 6)], etit[, "survived"]) : INTEGER() can only be applied to a 'integer', not a 'NULL' Got expected error from try(lm.fit(etit[, c(1, 3, 4, 5, 6)], etit[, "survived"])) > > expect.err(try(linmod(data.matrix(cbind("(Intercept)"=1, etit[,c(1,3,4,5,6)])), etit[,"survived"])), + "column name \"(Intercept)\" in 'x' is duplicated") Error in check.linmod.x(x) : column name "(Intercept)" in 'x' is duplicated Got expected error from try(linmod(data.matrix(cbind(`(Intercept)` = 1, etit[, c(1, 3, 4, 5, 6)])), etit[, "survived"])) > linmod9a.xy <- linmod(data.matrix(etit[,c(1,3,4,5,6)]), etit[,"survived"]) > lm9.fit <- lm.fit(data.matrix(cbind("(Intercept)"=1, etit[,c(1,3,4,5,6)])), etit[,"survived"]) > stopifnot(coef(linmod9a.xy) == coef(lm9.fit)) > stopifnot(names(coef(linmod9a.xy)) == names(coef(lm9.fit))) > expect.err(try(predict(linmod9a.xy, newdata=etit.age.factor[,c(1,3,4,5,6)])), "non-numeric column in 'newdata'") Error in predict.linmod(linmod9a.xy, newdata = etit.age.factor[, c(1, : non-numeric column in 'newdata' (after processing) Got expected error from try(predict(linmod9a.xy, newdata = etit.age.factor[, c(1, 3, 4, 5, 6)])) > expect.err(try(predict(linmod9a.xy, newdata=etit[,c(1,3,4,5)])), "ncol(newdata) is 4 but should be 5") Error in predict.linmod(linmod9a.xy, newdata = etit[, c(1, 3, 4, 5)]) : ncol(newdata) is 4 but should be 5 Got expected error from try(predict(linmod9a.xy, newdata = etit[, c(1, 3, 4, 5)])) > expect.err(try(predict(linmod9a.xy, newdata=etit[,c(1,3,4,5,6,6)])), "ncol(newdata) is 6 but should be 5") Error in predict.linmod(linmod9a.xy, newdata = etit[, c(1, 3, 4, 5, 6, : ncol(newdata) is 6 but should be 5 Got expected error from try(predict(linmod9a.xy, newdata = etit[, c(1, 3, 4, 5, 6, 6)])) > > # linmod.formula, logical response > data.logical.response <- data.frame(etit[1:6,c("age","sibsp","parch")], response=c(TRUE, TRUE, FALSE, TRUE, FALSE, FALSE)) > linmod9b.form <- linmod(response~., data=data.logical.response) > print(linmod9b.form) Call: linmod.formula(formula = response ~ ., data = data.logical.response) (Intercept) age sibsp parch 1.102508872 -0.007261985 -0.182883049 -0.569470942 > lm9b.form <- lm(response~., data=data.logical.response) > check.lm(linmod9b.form, lm9b.form, newdata=data.logical.response[2,,drop=FALSE]) check linmod9b.form vs lm9b.form > > # linmod.formula, factor response (not allowed) > data.fac.response <- data.frame(etit[1:6,c("age","sibsp","parch")], response=factor(c("a", "a", "b", "a", "b", "b"))) > expect.err(try(linmod(response~., data=data.fac.response)), "'y' is not numeric or logical") Error in check.linmod.y(x, y) : 'y' is not numeric or logical Got expected error from try(linmod(response ~ ., data = data.fac.response)) > # lm.formula > expect.err(try(lm(response~., data=data.fac.response)), + "(converted from warning) using type = \"numeric\" with a factor response will be ignored") Error in model.response(mf, "numeric") : (converted from warning) using type = "numeric" with a factor response will be ignored Got expected error from try(lm(response ~ ., data = data.fac.response)) > > # linmod.formula, string response (not allowed) > data.string.response <- data.frame(etit[1:6,c("age","sibsp","parch")], response=c("a", "a", "b", "a", "b", "b")) > expect.err(try(linmod(response~., data=data.string.response)), "'y' is not numeric or logical") Error in check.linmod.y(x, y) : 'y' is not numeric or logical Got expected error from try(linmod(response ~ ., data = data.string.response)) > # lm.formula > expect.err(try(lm(response~., data=data.string.response)), + "(converted from warning) NAs introduced by coercion") Error in storage.mode(v) <- "double" : (converted from warning) NAs introduced by coercion Got expected error from try(lm(response ~ ., data = data.string.response)) > > # linmod.default, logical response > linmod9b.xy <- linmod(etit[1:6,c("age","sibsp","parch")], c(TRUE, TRUE, FALSE, TRUE, FALSE, FALSE)) > print(linmod9b.xy) Call: linmod.default(x = etit[1:6, c("age", "sibsp", "parch")], y = c(TRUE, TRUE, FALSE, TRUE, FALSE, FALSE)) (Intercept) age sibsp parch 1.102508872 -0.007261985 -0.182883049 -0.569470942 > # lm.fit, logical response (lousy error message from lm.fit) > expect.err(try(lm.fit(etit[1:6,c("age","sibsp","parch")], c(TRUE, TRUE, FALSE, TRUE, FALSE, FALSE))), + "INTEGER() can only be applied to a 'integer', not a 'NULL'") Error in lm.fit(etit[1:6, c("age", "sibsp", "parch")], c(TRUE, TRUE, FALSE, : INTEGER() can only be applied to a 'integer', not a 'NULL' Got expected error from try(lm.fit(etit[1:6, c("age", "sibsp", "parch")], c(TRUE, TRUE, FALSE, TRUE, FALSE, FALSE))) > # linmod.default, factor response > expect.err(try(linmod(etit[1:6,c("age","sibsp","parch")], factor(c("a", + "a", "b", "a", "b", "b")))), "'y' is not numeric or logical") Error in check.linmod.y(x, y) : 'y' is not numeric or logical Got expected error from try(linmod(etit[1:6, c("age", "sibsp", "parch")], factor(c("a", "a", "b", "a", "b", "b")))) > # linmod.default, string response > expect.err(try(linmod(etit[1:6,c("age","sibsp","parch")], c("a", + "a", "b", "a", "b", "b"))), "'y' is not numeric or logical") Error in check.linmod.y(x, y) : 'y' is not numeric or logical Got expected error from try(linmod(etit[1:6, c("age", "sibsp", "parch")], c("a", "a", "b", "a", "b", "b"))) > # lm.fit, string and factor responses (lousy error messages from lm.fit) > expect.err(try(lm.fit(etit[1:6,c("age","sibsp","parch")], factor(c("a", + "a", "b", "a", "b", "b")))), "INTEGER() can only be applied to a 'integer', not a 'NULL'") Error in lm.fit(etit[1:6, c("age", "sibsp", "parch")], factor(c("a", "a", : INTEGER() can only be applied to a 'integer', not a 'NULL' Got expected error from try(lm.fit(etit[1:6, c("age", "sibsp", "parch")], factor(c("a", "a", "b", "a", "b", "b")))) > expect.err(try(lm.fit(etit[1:6,c("age","sibsp","parch")], c("a", + "a", "b", "a", "b", "b"))), "INTEGER() can only be applied to a 'integer', not a 'NULL'") Error in lm.fit(etit[1:6, c("age", "sibsp", "parch")], c("a", "a", "b", : INTEGER() can only be applied to a 'integer', not a 'NULL' Got expected error from try(lm.fit(etit[1:6, c("age", "sibsp", "parch")], c("a", "a", "b", "a", "b", "b"))) > > options(warn=2) # treat warnings as errors > expect.err(try(lm(pclass~., data=etit)), "using type = \"numeric\" with a factor response will be ignored") Error in model.response(mf, "numeric") : (converted from warning) using type = "numeric" with a factor response will be ignored Got expected error from try(lm(pclass ~ ., data = etit)) > expect.err(try(linmod(pclass~., data=etit)), "'y' is not numeric or logical") Error in check.linmod.y(x, y) : 'y' is not numeric or logical Got expected error from try(linmod(pclass ~ ., data = etit)) > > options(warn=1) # print warnings as they occur > lm10 <- lm(pclass~., data=etit) # will give warnings Warning in model.response(mf, "numeric") : using type = "numeric" with a factor response will be ignored Warning in Ops.factor(y, z$residuals) : '-' not meaningful for factors > options(warn=2) # treat warnings as errors > linmod10.form <- linmod(as.numeric(pclass)~., data=etit) > stopifnot(coef(linmod10.form) == coef(lm10)) > stopifnot(names(coef(linmod10.form)) == names(coef(lm10))) > # check.lm(linmod10.form, lm10) # fails because lm10 fitted is all NA > > expect.err(try(linmod(pclass~., data=etit)), "'y' is not numeric or logical") Error in check.linmod.y(x, y) : 'y' is not numeric or logical Got expected error from try(linmod(pclass ~ ., data = etit)) > expect.err(try(linmod(etit[,-1], etit[,1])), "non-numeric column in 'x'") Error in check.linmod.x(x) : non-numeric column in 'x' Got expected error from try(linmod(etit[, -1], etit[, 1])) > expect.err(try(linmod(1:10, paste(1:10))), "'y' is not numeric or logical") Error in check.linmod.y(x, y) : 'y' is not numeric or logical Got expected error from try(linmod(1:10, paste(1:10))) > > linmod10a.form <- linmod(survived~pclass, data=etit) > lm10a <- lm(survived~pclass, data=etit) > check.lm(linmod10a.form, lm10a, newdata=etit[3:5,]) check linmod10a.form vs lm10a > > expect.err(try(linmod(etit[,"pclass"], etit[,"age"])), "non-numeric column in 'x'") Error in check.linmod.x(x) : non-numeric column in 'x' Got expected error from try(linmod(etit[, "pclass"], etit[, "age"])) > > expect.err(try(linmod(paste(1:10), 1:10)), "non-numeric column in 'x'") Error in check.linmod.x(x) : non-numeric column in 'x' Got expected error from try(linmod(paste(1:10), 1:10)) > > lm11 <- lm(as.numeric(pclass)~., data=etit) > linmod11.form <- linmod(as.numeric(pclass)~., data=etit) > check.lm(linmod11.form, lm11, newdata=etit[3:5,]) check linmod11.form vs lm11 > > # logical data (not numeric) > bool.data <- data.frame(x=rep(c(TRUE, FALSE, TRUE), length.out=10), + y=rep(c(TRUE, FALSE, FALSE), length.out=10)) > lm12 <- lm(y~x, data=bool.data) > linmod12.form <- linmod(y~x, data=bool.data) > check.lm(linmod12.form, lm12, newdata=bool.data[3:5,1], + check.newdata=FALSE) # needed because predict.lm gives invalid type (list) for variable 'x' check linmod12.form vs lm12 > linmod12.xy <- linmod(bool.data$x, bool.data$y) > # hack: delete mismatching names so check.lm() doesn't fail > names(lm12$coefficients) <- NULL # were "(Intercept)" "xTRUE" > names(linmod12.xy$coefficients) <- NULL # were "(Intercept)" "V1" > check.lm(linmod12.xy, lm12, newdata=bool.data[3:5,1], + check.newdata=FALSE, # needed because predict.lm gives invalid 'envir' argument of type 'logical' + check.casenames=FALSE) check linmod12.xy vs lm12 > > cat0("==check use of functions in arguments to linmod\n") ==check use of functions in arguments to linmod > > identfunc <- function(x) x > lm10 <- lm( sqrt(survived) ~ I(age^2) + as.numeric(sex), data=identfunc(etit)) > linmod10 <- linmod(sqrt(survived) ~ I(age^2) + as.numeric(sex), data=identfunc(etit)) > print(summary(lm10)) Call: lm(formula = sqrt(survived) ~ I(age^2) + as.numeric(sex), data = identfunc(etit)) Residuals: Min 1Q Median 3Q Max -0.6959 -0.2665 -0.2302 0.3427 0.8261 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 1.101e+00 4.223e-01 2.608 0.0198 * I(age^2) -5.389e-05 1.190e-04 -0.453 0.6571 as.numeric(sex) -3.881e-01 2.508e-01 -1.547 0.1426 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 0.4855 on 15 degrees of freedom Multiple R-squared: 0.1736, Adjusted R-squared: 0.06346 F-statistic: 1.576 on 2 and 15 DF, p-value: 0.2392 > print(summary(linmod10)) Call: linmod.formula(formula = sqrt(survived) ~ I(age^2) + as.numeric(sex), data = identfunc(etit)) Estimate StdErr t.value p.value (Intercept) 1.101499e+00 0.4223245953 2.6081808 0.01977424 I(age^2) -5.389047e-05 0.0001189838 -0.4529226 0.65708686 as.numeric(sex) -3.880912e-01 0.2507927081 -1.5474582 0.14258876 > check.lm(linmod10, lm10, newdata=etit[3:5,]) check linmod10 vs lm10 > set.seed(2020) > plotmo(lm10, pt.col="green", do.par=2) plotmo grid: age sex 32.5 male > set.seed(2020) > plotmo(linmod10, pt.col="green", do.par=0) plotmo grid: age sex 32.5 male > par(org.par) > > cat0("==data.frame with strings\n") ==data.frame with strings > > df.with.string <- + data.frame(1:5, + c(1,2,-1,4,5), + c("a", "b", "a", "a", "b"), + stringsAsFactors=FALSE) > colnames(df.with.string) <- c("num1", "num2", "string") > > linmod30.form <- linmod(num1~num2, df.with.string) > lm30 <- lm(num1~num2, df.with.string) > check.lm(linmod30.form, lm30, check.newdata=FALSE) check linmod30.form vs lm30 > > linmod31.form <- linmod(num1~., df.with.string) > lm31 <- lm(num1~., df.with.string) > check.lm(linmod31.form, lm31, check.newdata=FALSE) check linmod31.form vs lm31 > > expect.err(try(linmod(string~., df.with.string)), "'y' is not numeric or logical") Error in check.linmod.y(x, y) : 'y' is not numeric or logical Got expected error from try(linmod(string ~ ., df.with.string)) > > vec <- c(1,2,3,4,3) > expect.err(try(linmod(df.with.string, vec)), "non-numeric column in 'x'") Error in check.linmod.x(x) : non-numeric column in 'x' Got expected error from try(linmod(df.with.string, vec)) > expect.err(try(linmod(etit$pclass, etit$survived)), "non-numeric column in 'x'") Error in check.linmod.x(x) : non-numeric column in 'x' Got expected error from try(linmod(etit$pclass, etit$survived)) > > cat0("==x is singular\n") ==x is singular > > set.seed(1) > x2 <- matrix(rnorm(6), nrow=2) > y2 <- c(1,2) > expect.err(try(linmod(y2~x2)), "'x' is singular (it has 4 columns but its rank is 2)") Error in do.linmod.fit(x, y) : 'x' is singular (it has 4 columns but its rank is 2) colnames(x): (Intercept) x21 x22 x23 Got expected error from try(linmod(y2 ~ x2)) > > x3 <- matrix(1:10, ncol=2) > y3 <- c(1,2,9,4,5) > expect.err(try(linmod(y3~x3)), "'x' is singular (it has 3 columns but its rank is 2)") Error in do.linmod.fit(x, y) : 'x' is singular (it has 3 columns but its rank is 2) colnames(x): (Intercept) x31 x32 Got expected error from try(linmod(y3 ~ x3)) > > expect.err(try(linmod(trees[1,1:2], trees[1,3])), "'x' is singular (it has 3 columns but its rank is 1)") Error in do.linmod.fit(x, y) : 'x' is singular (it has 3 columns but its rank is 1) colnames(x): (Intercept) Girth Height Got expected error from try(linmod(trees[1, 1:2], trees[1, 3])) > > x2a <- matrix(1:6, nrow=3) > y2a <- c(1,2,3) > expect.err(try(linmod(y2a~x2a)), "'x' is singular (it has 3 columns but its rank is 2)") Error in do.linmod.fit(x, y) : 'x' is singular (it has 3 columns but its rank is 2) colnames(x): (Intercept) x2a1 x2a2 Got expected error from try(linmod(y2a ~ x2a)) > > cat0("==perfect fit (residuals are zero)\n") ==perfect fit (residuals are zero) > > set.seed(1) > x2b <- matrix(rnorm(6), nrow=3) > y2b <- c(1,2,3) > data.x2b <- data.frame(x2b, y2b) > colnames(data.x2b) <- c("x1", "x2", "y") > linmod.x2b <- linmod(y~., data=data.x2b) > print(summary(linmod.x2b)) # will have "Residual degrees-of-freedom is zero" comment Call: linmod.formula(formula = y ~ ., data = data.x2b) Estimate StdErr t.value p.value (Intercept) 2.28088400 Inf 0 0 x1 -0.05211945 Inf 0 0 x2 -0.82338760 Inf 0 0 > lm.x2b <- lm(y~., data=data.x2b) > print(summary(lm.x2b)) # will have "ALL 3 residuals are 0" comment Call: lm(formula = y ~ ., data = data.x2b) Residuals: ALL 3 residuals are 0: no residual degrees of freedom! Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 2.28088 NaN NaN NaN x1 -0.05212 NaN NaN NaN x2 -0.82339 NaN NaN NaN Residual standard error: NaN on 0 degrees of freedom Multiple R-squared: 1, Adjusted R-squared: NaN F-statistic: NaN on 2 and 0 DF, p-value: NA > check.lm(linmod.x2b, lm.x2b, newdata=data.x2b[1:2,]+1, check.sigma=FALSE) check linmod.x2b vs lm.x2b > > x2c <- 1:10 > y2c <- 11:20 > data.x2c <- data.frame(x2c, y2c) > colnames(data.x2c) <- c("x", "y") > linmod.x2c <- linmod(y~., data=data.x2c) > print(summary(linmod.x2c)) Call: linmod.formula(formula = y ~ ., data = data.x2c) Estimate StdErr t.value p.value (Intercept) 10 0 Inf 0 x 1 0 Inf 0 > lm.x2c <- lm(y~., data=data.x2c) > options(warn=1) # print warnings as they occur > print(summary(lm.x2c)) # will have "essentially perfect fit: summary may be unreliable" comment Warning in summary.lm(lm.x2c) : essentially perfect fit: summary may be unreliable Call: lm(formula = y ~ ., data = data.x2c) Residuals: Min 1Q Median 3Q Max -3.635e-15 -3.541e-16 3.225e-16 9.411e-16 1.721e-15 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 1.000e+01 1.100e-15 9.088e+15 <2e-16 *** x 1.000e+00 1.773e-16 5.639e+15 <2e-16 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 1.611e-15 on 8 degrees of freedom Multiple R-squared: 1, Adjusted R-squared: 1 F-statistic: 3.18e+31 on 1 and 8 DF, p-value: < 2.2e-16 > options(warn=2) # treat warnings as errors > check.lm(linmod.x2c, lm.x2c, newdata=data.x2c[1:2,]+1, check.sigma=FALSE) check linmod.x2c vs lm.x2c > > par(mfrow=c(2,2)) # all plots on same page so can compare > plot(linmod.x2b, main="linmod.x2b\nall residuals are zero") > plot(lm.x2b, which=1, main="lm.x2b") > plot(linmod.x2c, main="linmod.x2c") > plot(lm.x2c, which=1, main="lm.x2c") > par(org.par) > > cat0("==nrow(x) does not match length(y)\n") ==nrow(x) does not match length(y) > > x4 <- matrix(1:10, ncol=2) > y4 <- c(1,2,9,4) > expect.err(try(linmod(x4, y4)), "nrow(x) is 5 but length(y) is 4") Error in check.linmod.y(x, y) : nrow(x) is 5 but length(y) is 4 Got expected error from try(linmod(x4, y4)) > > x5 <- matrix(1:10, ncol=2) > y5 <- c(1,2,9,4,5,9) > expect.err(try(linmod(x5, y5)), "nrow(x) is 5 but length(y) is 6") Error in check.linmod.y(x, y) : nrow(x) is 5 but length(y) is 6 Got expected error from try(linmod(x5, y5)) > > cat0("==y has multiple columns\n") ==y has multiple columns > > vec <- c(1,2,3,4,3) > y2 <- cbind(c(1,2,3,4,9), vec^2) > expect.err(try(linmod(vec, y2)), "nrow(x) is 5 but length(y) is 10") Error in check.linmod.y(x, y) : nrow(x) is 5 but length(y) is 10 Got expected error from try(linmod(vec, y2)) > expect.err(try(linmod(y2~vec)), "nrow(x) is 5 but length(y) is 10") Error in check.linmod.y(x, y) : nrow(x) is 5 but length(y) is 10 Got expected error from try(linmod(y2 ~ vec)) > > cat0("==NA in x\n") ==NA in x > > x <- tr[,1:2] > y <- tr[,3] > x[2,2] <- NA > expect.err(try(linmod(x, y)), "NA in 'x'") Error in check.linmod.x(x) : NA in 'x' Got expected error from try(linmod(x, y)) > > x <- tr[,1:2] > y <- tr[,3] > y[9] <- NA > expect.err(try(linmod(x, y)), "NA in 'y'") Error in check.linmod.y(x, y) : NA in 'y' Got expected error from try(linmod(x, y)) > > # Following added Sep 2020 (prior to this, predict.linmod gave an incorrect error message) > cat0("==test formulas that use functions on rhs variables, like Volume~sqrt(Girth)\n") ==test formulas that use functions on rhs variables, like Volume~sqrt(Girth) > > linmod.sqrt1 <- linmod(Volume~sqrt(as.numeric(Girth)), data=tr) > cat0("==print(summary(linmod.sqrt1))\n") ==print(summary(linmod.sqrt1)) > print(summary(linmod.sqrt1)) Call: linmod.formula(formula = Volume ~ sqrt(as.numeric(Girth)), data = tr) Estimate StdErr t.value p.value (Intercept) -103.40058 7.706018 -13.41816 5.733634e-14 sqrt(as.numeric(Girth)) 36.94188 2.117135 17.44900 6.396229e-17 > lm.sqrt1 <- lm(Volume~sqrt(as.numeric(Girth)), data=tr) > check.lm(linmod.sqrt1, lm.sqrt1) check linmod.sqrt1 vs lm.sqrt1 > stopifnot(almost.equal(predict(linmod.sqrt1, newdata=data.frame(Girth=10, Height=80)), + predict(lm.sqrt1, newdata=data.frame(Girth=10, Height=80)))) > stopifnot(almost.equal(predict(linmod.sqrt1, newdata=as.matrix(tr[1:3,])), + predict(lm.sqrt1, newdata=tr[1:3,]))) > par(mfrow=c(2,2)) # all plots on same page so can compare > plotmo(linmod.sqrt1, do.par=FALSE) > plotmo(lm.sqrt1, do.par=FALSE) > par(org.par) > > linmod.sqrt2 <- linmod(Volume~sqrt(Girth)+Height+Girth, data=tr) > cat0("==print(summary(linmod.sqrt2))\n") ==print(summary(linmod.sqrt2)) > print(summary(linmod.sqrt2)) Call: linmod.formula(formula = Volume ~ sqrt(Girth) + Height + Girth, data = tr) Estimate StdErr t.value p.value (Intercept) 132.4266671 33.03008713 4.009274 4.318421e-04 sqrt(Girth) -106.5505058 18.19173301 -5.857084 3.085730e-06 Height 0.4030722 0.08863082 4.547765 1.026574e-04 Girth 19.0489443 2.45495604 7.759383 2.410443e-08 > lm.sqrt2 <- lm(Volume~sqrt(Girth)+Height+Girth, data=tr) > check.lm(linmod.sqrt2, lm.sqrt2) check linmod.sqrt2 vs lm.sqrt2 > stopifnot(almost.equal(predict(linmod.sqrt2, newdata=data.frame(Girth=10, Height=80)), + predict(lm.sqrt2, newdata=data.frame(Girth=10, Height=80)))) > stopifnot(almost.equal(predict(linmod.sqrt2, newdata=as.matrix(tr[1:3,])), + predict(lm.sqrt2, newdata=tr[1:3,]))) > par(mfrow=c(2,2)) # all plots on same page so can compare > plotmo(linmod.sqrt2, do.par=FALSE) plotmo grid: Girth Height 12.9 76 > plotmo(lm.sqrt2, do.par=FALSE) plotmo grid: Girth Height 12.9 76 > par(org.par) > > lm.sqrt.as.numeric <- lm(survived~sqrt(age)+as.numeric(pclass), data=etit) > linmod.sqrt.as.numeric <- linmod(survived~sqrt(age)+as.numeric(pclass), data=etit) > check.lm(linmod.sqrt.as.numeric, lm.sqrt.as.numeric, newdata=etit[3:5,]) check linmod.sqrt.as.numeric vs lm.sqrt.as.numeric > expect.err(try(predict(linmod.sqrt.as.numeric, newdata=data.frame(age=30))), # pclass missing + "object 'pclass' not found") Error in eval(predvars, data, env) : object 'pclass' not found Got expected error from try(predict(linmod.sqrt.as.numeric, newdata = data.frame(age = 30))) > par(mfrow=c(2,2)) # all plots on same page so can compare > plotmo(linmod.sqrt.as.numeric, do.par=FALSE) plotmo grid: age pclass 32.5 3rd > plotmo(lm.sqrt.as.numeric, do.par=FALSE) plotmo grid: age pclass 32.5 3rd > par(org.par) > > y.age <- etit[,"age"] > x.pclass <- etit[,"pclass"] > x.sex <- etit[,"sex"] > linmod.y.age.sex.pclass <- linmod(y.age ~ as.numeric(x.pclass) + x.sex) > lm.y.age.sex.pclass <- lm( y.age ~ as.numeric(x.pclass) + x.sex) > stopifnot(identical(linmod.y.age.sex.pclass$coef, lm.y.age.sex.pclass$coef)) > options(warn=1) # print warnings as they occur to test stop() in linmod.R::process.newdata.formula > # TODO following says variable 'as.numeric(x.pclass)' may be missing > # it should say variable 'x.pclass' may be missing > expect.err(try(predict(linmod.y.age.sex.pclass, newdata=etit[3:5,1,drop=FALSE])), + "newdata has 3 rows but model.frame returned 18 rows (variable 'as.numeric(x.pclass)' may be missing from newdata)") Warning: 'newdata' had 3 rows but variables found have 18 rows Error in process.newdata.formula(object, newdata) : newdata has 3 rows but model.frame returned 18 rows (variable 'as.numeric(x.pclass)' may be missing from newdata) Got expected error from try(predict(linmod.y.age.sex.pclass, newdata = etit[3:5, 1, drop = FALSE])) > options(warn=2) # back to treating warnings as errors > > cat0("==misc tests with different kinds of data\n") ==misc tests with different kinds of data > > data3 <- data.frame(s=c("a", "b", "a", "c", "a"), num=c(1,5,1,9,2), y=c(1,3,2,5,3), stringsAsFactors=F) > stopifnot(sapply(data3, class) == c("character", "numeric", "numeric")) > a40 <- linmod(y~., data=data3) > print(summary(a40)) Call: linmod.formula(formula = y ~ ., data = data3) Estimate StdErr t.value p.value (Intercept) -1.390219e-15 1.2247449 -1.135109e-15 1.0000000 sb -4.500000e+00 3.2787193 -1.372487e+00 0.4008582 sc -8.500000e+00 6.6895441 -1.270640e+00 0.4244770 num 1.500000e+00 0.8660254 1.732051e+00 0.3333333 > stopifnot(almost.equal(a40$coefficients, c(0, -4.5, -8.5, 1.5), max=0.001)) > stopifnot(almost.equal(predict(a40, newdata=data3[2:3,]), + c(3.0, 1.5), max=0.001)) > > data4 <- data.frame(s=c("a", "b", "a", "c", "a"), num=c(1,5,1,9,2), y=c(1,3,2,5,3), stringsAsFactors=T) > stopifnot(sapply(data4, class) == c("factor", "numeric", "numeric")) > expect.err(try(linmod(data4[,1:2], data4[,3])), "non-numeric column in 'x'") Error in check.linmod.x(x) : non-numeric column in 'x' Got expected error from try(linmod(data4[, 1:2], data4[, 3])) > > # following gives no error (and matches lm) even though col 1 of data3 is character not factor > a41 <- linmod(y~., data=data4) > print(summary(a41)) Call: linmod.formula(formula = y ~ ., data = data4) Estimate StdErr t.value p.value (Intercept) -1.390219e-15 1.2247449 -1.135109e-15 1.0000000 sb -4.500000e+00 3.2787193 -1.372487e+00 0.4008582 sc -8.500000e+00 6.6895441 -1.270640e+00 0.4244770 num 1.500000e+00 0.8660254 1.732051e+00 0.3333333 > stopifnot(almost.equal(predict(a41, newdata=data3[2:3,]), + c(3.0, 1.5), max=0.001)) > > data5 <- data.frame(s=c("a", "b", "c", "a", "a"), num=c(1,9,4,2,6), y=c(1,2,3,5,3), stringsAsFactors=F) > stopifnot(almost.equal(predict(a41, newdata=data5[1:3,1:2]), + c(1.5, 9.0, -2.5), max=0.001)) > > data6 <- data.frame(s=c("a", "b", "c", "a9", "a"), + num=c(1,9,4,2,6), + num2=c(1,9,4,2,7), + y=c(1,2,3,5,3), stringsAsFactors=T) > expect.err(try(predict(a41, newdata=data6[1:3,1])), "object 's' not found") Error in eval(predvars, data, env) : object 's' not found Got expected error from try(predict(a41, newdata = data6[1:3, 1])) > expect.err(try(predict(a41, newdata=data6[1:3,c(1,1)])), "object 'num' not found") Error in eval(predvars, data, env) : object 'num' not found Got expected error from try(predict(a41, newdata = data6[1:3, c(1, 1)])) > > expect.err(try(predict(a41, newdata=data.frame(s=1, num=2, y=3))), "variable 's' is not a factor") Error in model.frame.default(terms, newdata, na.action = na.pass, xlev = object$xlevels) : (converted from warning) variable 's' is not a factor Got expected error from try(predict(a41, newdata = data.frame(s = 1, num = 2, y = 3))) > > expect.err(try(predict(a41, newdata=1:9)), + "object 's' not found") Error in eval(predvars, data, env) : object 's' not found Got expected error from try(predict(a41, newdata = 1:9)) > > expect.err(try(predict(a41, newdata=data.frame())), "'newdata' is empty") Error in predict.linmod(a41, newdata = data.frame()) : 'newdata' is empty Got expected error from try(predict(a41, newdata = data.frame())) > > # perfect fit (residuals are all zero) > linmod.data6 <- linmod(y~s+num, data=data6) > print(summary(linmod.data6)) Call: linmod.formula(formula = y ~ s + num, data = data6) Estimate StdErr t.value p.value (Intercept) 0.6 Inf 0 0 sa9 3.6 Inf 0 0 sb -2.2 Inf 0 0 sc 0.8 Inf 0 0 num 0.4 Inf 0 0 > lm.data6 <- lm(y~s+num, data=data6) > print(summary(lm.data6)) Call: lm(formula = y ~ s + num, data = data6) Residuals: ALL 5 residuals are 0: no residual degrees of freedom! Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 0.6 NaN NaN NaN sa9 3.6 NaN NaN NaN sb -2.2 NaN NaN NaN sc 0.8 NaN NaN NaN num 0.4 NaN NaN NaN Residual standard error: NaN on 0 degrees of freedom Multiple R-squared: 1, Adjusted R-squared: NaN F-statistic: NaN on 4 and 0 DF, p-value: NA > check.lm(linmod.data6, lm.data6, newdata=data6[2,,drop=FALSE], check.sigma=FALSE) check linmod.data6 vs lm.data6 > > expect.err(try(linmod(y~., data=data6)), "'x' is singular (it has 6 columns but its rank is 5)") Error in do.linmod.fit(x, y) : 'x' is singular (it has 6 columns but its rank is 5) colnames(x): (Intercept) sa9 sb sc num num2 Got expected error from try(linmod(y ~ ., data = data6)) > > tr.na <- trees > tr.na[9,3] <- NA > expect.err(try(linmod(Volume~.,data=tr.na)), "NA in 'y'") Error in check.linmod.y(x, y) : NA in 'y' Got expected error from try(linmod(Volume ~ ., data = tr.na)) > expect.err(try(linmod(tr.na[,1:2], tr.na[,3])), "NA in 'y'") Error in check.linmod.y(x, y) : NA in 'y' Got expected error from try(linmod(tr.na[, 1:2], tr.na[, 3])) > > tr.na <- trees > tr.na[10,1] <- NA > expect.err(try(linmod(Volume~.,data=tr.na)), "NA in 'x'") Error in check.linmod.x(x) : NA in 'x' Got expected error from try(linmod(Volume ~ ., data = tr.na)) > expect.err(try(linmod(tr.na[,1:2], tr.na[,3])), "NA in 'x'") Error in check.linmod.x(x) : NA in 'x' Got expected error from try(linmod(tr.na[, 1:2], tr.na[, 3])) > > a42 <- linmod(trees[,1:2], trees[, 3]) > newdata1 <- data.frame(Girth=20) > expect.err(try(predict(a42, newdata=newdata1)), "ncol(newdata) is 1 but should be 2") Error in predict.linmod(a42, newdata = newdata1) : ncol(newdata) is 1 but should be 2 Got expected error from try(predict(a42, newdata = newdata1)) > newdata3 <- data.frame(Girth=20, extra1=21, extra2=22) > expect.err(try(predict(a42, newdata=newdata3)), "ncol(newdata) is 3 but should be 2") Error in predict.linmod(a42, newdata = newdata3) : ncol(newdata) is 3 but should be 2 Got expected error from try(predict(a42, newdata = newdata3)) > expect.err(try(predict(a42, newdata=data.frame())), "'newdata' is empty") Error in predict.linmod(a42, newdata = data.frame()) : 'newdata' is empty Got expected error from try(predict(a42, newdata = data.frame())) > newdata.with.NA <- data.frame(Girth=20, Height=NA) > expect.err(try(predict(a42, newdata=newdata.with.NA)), "NA in 'newdata'") Error in predict.linmod(a42, newdata = newdata.with.NA) : NA in 'newdata' Got expected error from try(predict(a42, newdata = newdata.with.NA)) > > a43 <- linmod(Volume~.,data=trees) > expect.err(try(predict(a43, newdata=newdata.with.NA)), "NA in 'newdata'") Error in process.newdata.formula(object, newdata) : NA in 'newdata' Got expected error from try(predict(a43, newdata = newdata.with.NA)) > lm43 <- lm(Volume~.,data=trees) > # message from predict.lm could be better > expect.err(try(predict(lm43, newdata=newdata.with.NA)), + "variable 'Height' was fitted with type \"numeric\" but type \"logical\" was supplied") Error : variable 'Height' was fitted with type "numeric" but type "logical" was supplied Got expected error from try(predict(lm43, newdata = newdata.with.NA)) > > y6 <- 1:5 > x6 <- data.frame() > options(warn=1) # print warnings as they occur > expect.err(try(linmod(x6, y6)), "'x' is empty") Warning in cbind(`(Intercept)` = 1, xmat) : number of rows of result is not a multiple of vector length (arg 1) Error in check.linmod.x(x) : 'x' is empty Got expected error from try(linmod(x6, y6)) > options(warn=2) # treat warnings as errors > > y7 <- data.frame() > x7 <- 1:5 > expect.err(try(linmod(x7, y7)), "'y' is empty") Error in check.linmod.y(x, y) : 'y' is empty Got expected error from try(linmod(x7, y7)) > > # duplicated column names > data7 <- matrix(1:25, ncol=5) > colnames(data7) <- c("y", "x1", "x1", "x3", "x4") > expect.err(try(linmod(data7[,-1], data7[,1])), "column name \"x1\" in 'x' is duplicated") Error in check.linmod.x(x) : column name "x1" in 'x' is duplicated Got expected error from try(linmod(data7[, -1], data7[, 1])) > > colnames(data7) <- c("y", "x1", "x2", "x2", "x4") > expect.err(try(linmod(data7[,-1], data7[,1])), "column name \"x2\" in 'x' is duplicated") Error in check.linmod.x(x) : column name "x2" in 'x' is duplicated Got expected error from try(linmod(data7[, -1], data7[, 1])) > > colnames(data7) <- c("y", "x1", "x2", "x2", "x2") > expect.err(try(linmod(data7[,-1], data7[,1])), "column name \"x2\" in 'x' is duplicated") Error in check.linmod.x(x) : column name "x2" in 'x' is duplicated Got expected error from try(linmod(data7[, -1], data7[, 1])) > > # column name V2 will be created but it clashes with the existing column name > colnames(data7) <- c("y", "V2", "", "V3", "V4") > expect.err(try(linmod(data7[,-1], data7[,1])), "column name \"V2\" in 'x' is duplicated") Error in check.linmod.x(x) : column name "V2" in 'x' is duplicated Got expected error from try(linmod(data7[, -1], data7[, 1])) > > # missing column names > trees1 <- trees > colnames(trees1) <- NULL > cat0("a52\n") a52 > a52 <- linmod(trees1[,1:2], trees1[,3]) > print(summary(a52)) Call: linmod.default(x = trees1[, 1:2], y = trees1[, 3]) Estimate StdErr t.value p.value (Intercept) -57.9876589 8.6382259 -6.712913 2.749507e-07 V1 4.7081605 0.2642646 17.816084 8.223304e-17 V2 0.3392512 0.1301512 2.606594 1.449097e-02 > > trees1 <- trees > colnames(trees1) <- c("", "Height", "Volume") # was Girth Height Volume > cat0("linmod.form.Volume.trees1\n") linmod.form.Volume.trees1 > linmod.form.Volume.trees1 <- linmod(trees1[,1:2], trees1[,3]) > print(summary(linmod.form.Volume.trees1)) Call: linmod.default(x = trees1[, 1:2], y = trees1[, 3]) Estimate StdErr t.value p.value (Intercept) -57.9876589 8.6382259 -6.712913 2.749507e-07 V1 4.7081605 0.2642646 17.816084 8.223304e-17 Height 0.3392512 0.1301512 2.606594 1.449097e-02 > cat0("linmod.form.Volume.trees1.formula\n") linmod.form.Volume.trees1.formula > expect.err(try(linmod(Volume~., data=trees1)), "attempt to use zero-length variable name") Error in terms.formula(formula, data = data) : attempt to use zero-length variable name Got expected error from try(linmod(Volume ~ ., data = trees1)) > > # very long names to test formatting in summary.linmod > trees1 <- trees > colnames(trees1) <- c("Girth.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name", + "Height.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name", + "Volume.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name") > cat0("a55\n") a55 > a55 <- linmod(Volume.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name~ + Girth.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name+ + Height.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name, + data=trees1) > print(summary(a55)) Call: linmod.formula(formula = Volume.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name ~ Girth.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name + Height.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name, data = trees1) Estimate (Intercept) -57.9876589 Girth.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name 4.7081605 Height.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name 0.3392512 StdErr (Intercept) 8.6382259 Girth.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name 0.2642646 Height.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name 0.1301512 t.value (Intercept) -6.712913 Girth.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name 17.816084 Height.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name 2.606594 p.value (Intercept) 2.749507e-07 Girth.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name 8.223304e-17 Height.a.very.long.name.in.fact.an.exceptionally.exceptionally.exceptionally.long.name 1.449097e-02 > > # intercept-only model > intonly.form <- linmod(Volume~1, data=trees) > print(summary(intonly.form)) Call: linmod.formula(formula = Volume ~ 1, data = trees) Estimate StdErr t.value p.value (Intercept) 30.17097 2.952324 10.21939 2.753323e-11 > stopifnot(length(coef(intonly.form)) == 1) > try(plotmo(intonly.form)) # Error in plotmo(intonly.form) : x is empty Error in plotmo(intonly.form) : x is empty > plotres(intonly.form) > expect.err(try(plotmo(intonly.form)), "x is empty") Error in plotmo(intonly.form) : x is empty Got expected error from try(plotmo(intonly.form)) > expect.err(try(linmod(rep(1, length.out=nrow(trees)), trees$Volume)), + "'x' is singular (it has 2 columns but its rank is 1)") Error in do.linmod.fit(x, y) : 'x' is singular (it has 2 columns but its rank is 1) colnames(x): (Intercept) V1 Got expected error from try(linmod(rep(1, length.out = nrow(trees)), trees$Volume)) > > # various tests for bad args > expect.err(try(linmod(trees[,1:2])), "no 'y' argument") Error in as.matrix(y) : no 'y' argument Got expected error from try(linmod(trees[, 1:2])) > > # test stop.if.dot.arg.used > expect.err(try(linmod(Volume~., data=trees, nonesuch=99)), + "unused argument (nonesuch = 99)") Error in stop.if.dot.arg.used(...) : unused argument (nonesuch = 99) Got expected error from try(linmod(Volume ~ ., data = trees, nonesuch = 99)) > expect.err(try(linmod(trees[,1:2], trees[,3], nonesuch=linmod)), + "unused argument (nonesuch = function (...)") Error in stop.if.dot.arg.used(...) : unused argument (nonesuch = function (...) UseMethod("linmod")) Got expected error from try(linmod(trees[, 1:2], trees[, 3], nonesuch = linmod)) > expect.err(try(summary(linmod(trees[,1:2], trees[,3]), nonesuch=linmod)), + "unused argument (nonesuch = function (...)") Error in stop.if.dot.arg.used(...) : unused argument (nonesuch = function (...) UseMethod("linmod")) Got expected error from try(summary(linmod(trees[, 1:2], trees[, 3]), nonesuch = linmod)) > expect.err(try(print(linmod(trees[,1:2], trees[,3]), nonesuch=linmod)), + "unused argument (nonesuch = function (...)") Error in stop.if.dot.arg.used(...) : unused argument (nonesuch = function (...) UseMethod("linmod")) Got expected error from try(print(linmod(trees[, 1:2], trees[, 3]), nonesuch = linmod)) > expect.err(try(predict(linmod.form.Volume.tr, nonesuch=99)), + "unused argument (nonesuch = 99)") Error in stop.if.dot.arg.used(...) : unused argument (nonesuch = 99) Got expected error from try(predict(linmod.form.Volume.tr, nonesuch = 99)) > > # check partial matching on type argument > stopifnot(identical(predict(linmod.form.Volume.tr, type="r"), predict(linmod.form.Volume.tr))) > stopifnot(identical(predict(linmod.form.Volume.tr, type="resp"), predict(linmod.form.Volume.tr))) > expect.err(try(predict(linmod.form.Volume.tr, type="nonesuch")), "'arg' should be \"response\"") Error in match.arg(type, "response") : 'arg' should be "response" Got expected error from try(predict(linmod.form.Volume.tr, type = "nonesuch")) > > # test additional method functions (see linmod.methods.R) > > check.lm(linmod.form.Volume.tr, lm.Volume.tr, newdata=trees[3,1:2]) check linmod.form.Volume.tr vs lm.Volume.tr > stopifnot(almost.equal(coef(linmod.form.Volume.tr), coef(lm.Volume.tr))) > stopifnot(identical(names(coef(linmod.form.Volume.tr)), names(coef(lm.Volume.tr)))) > stopifnot(almost.equal(fitted(linmod.form.Volume.tr), fitted(lm.Volume.tr))) > stopifnot(identical(names(fitted(linmod.form.Volume.tr)), names(fitted(lm.Volume.tr)))) > stopifnot(identical(na.action(linmod.form.Volume.tr), na.action(lm.Volume.tr))) > stopifnot(almost.equal(residuals(linmod.form.Volume.tr), residuals(lm.Volume.tr))) > stopifnot(identical(names(residuals(linmod.form.Volume.tr)), names(residuals(lm.Volume.tr)))) > stopifnot(identical(names(case.names(linmod.form.Volume.tr)), names(case.names(lm.Volume.tr)))) > stopifnot(identical(variable.names(linmod.form.Volume.tr), variable.names(lm.Volume.tr))) > stopifnot(identical(nobs(linmod.form.Volume.tr), nobs(lm.Volume.tr))) > stopifnot(identical(weights(linmod.form.Volume.tr), weights(lm.Volume.tr))) > stopifnot(almost.equal(df.residual(linmod.form.Volume.tr), df.residual(lm.Volume.tr))) > stopifnot(identical(names(df.residual(linmod.form.Volume.tr)), names(df.residual(lm.Volume.tr)))) > stopifnot(almost.equal(deviance(linmod.form.Volume.tr), deviance(lm.Volume.tr))) > stopifnot(identical(names(deviance(linmod.form.Volume.tr)), names(deviance(lm.Volume.tr)))) > stopifnot(identical(weights(linmod.form.Volume.tr), weights(lm.Volume.tr))) > stopifnot(identical(model.frame(linmod.form.Volume.tr), model.frame(lm.Volume.tr))) > stopifnot(identical(model.matrix(linmod.form.Volume.tr), model.matrix(lm.Volume.tr))) > stopifnot(identical(model.matrix(linmod.form.Volume.tr, data=tr[1:2,]), + model.matrix(lm.Volume.tr, data=tr[1:2,]))) > stopifnot(almost.equal(logLik(linmod.form.Volume.tr), logLik(lm.Volume.tr))) > expect.err(try(logLik(linmod.form.Volume.tr, REML=TRUE)), "!REML is not TRUE") Error in logLik.linmod(linmod.form.Volume.tr, REML = TRUE) : !REML is not TRUE Got expected error from try(logLik(linmod.form.Volume.tr, REML = TRUE)) > library(sandwich) # for estfun.lm > stopifnot(almost.equal(estfun(linmod.form.Volume.tr), estfun(lm.Volume.tr))) > > linmod.form.Volume.tr.update <- update(linmod.form.Volume.tr, formula.=Volume~Height) > lm.Volume.tr.update <- update(lm.Volume.tr, formula.=Volume~Height) > check.lm(linmod.form.Volume.tr.update, lm.Volume.tr.update) check linmod.form.Volume.tr.update vs lm.Volume.tr.update > > check.lm(linmod.xy.Volume.tr, lm.Volume.tr, newdata=trees[3,1:2]) check linmod.xy.Volume.tr vs lm.Volume.tr > stopifnot(almost.equal(coef(linmod.xy.Volume.tr), coef(lm.Volume.tr))) > stopifnot(identical(names(coef(linmod.xy.Volume.tr)), names(coef(lm.Volume.tr)))) > stopifnot(almost.equal(fitted(linmod.xy.Volume.tr), fitted(lm.Volume.tr))) > stopifnot(identical(names(fitted(linmod.xy.Volume.tr)), names(fitted(lm.Volume.tr)))) > stopifnot(identical(na.action(linmod.xy.Volume.tr), na.action(lm.Volume.tr))) > stopifnot(almost.equal(residuals(linmod.xy.Volume.tr), residuals(lm.Volume.tr))) > stopifnot(identical(names(residuals(linmod.xy.Volume.tr)), names(residuals(lm.Volume.tr)))) > stopifnot(identical(case.names(linmod.xy.Volume.tr), case.names(lm.Volume.tr))) > stopifnot(identical(variable.names(linmod.xy.Volume.tr), variable.names(lm.Volume.tr))) > stopifnot(identical(nobs(linmod.xy.Volume.tr), nobs(lm.Volume.tr))) > stopifnot(identical(weights(linmod.xy.Volume.tr), weights(lm.Volume.tr))) > stopifnot(almost.equal(df.residual(linmod.xy.Volume.tr), df.residual(lm.Volume.tr))) > stopifnot(identical(names(df.residual(linmod.xy.Volume.tr)), names(df.residual(lm.Volume.tr)))) > stopifnot(almost.equal(deviance(linmod.xy.Volume.tr), deviance(lm.Volume.tr))) > stopifnot(identical(names(deviance(linmod.xy.Volume.tr)), names(deviance(lm.Volume.tr)))) > stopifnot(identical(weights(linmod.xy.Volume.tr), weights(lm.Volume.tr))) > expect.err(try(model.frame(linmod.xy.Volume.tr)), "model.frame cannot be used on linmod models built without a formula") Error in model.frame.linmod(linmod.xy.Volume.tr) : model.frame cannot be used on linmod models built without a formula Got expected error from try(model.frame(linmod.xy.Volume.tr)) > expect.err(try(model.matrix(linmod.xy.Volume.tr)), + "model.frame cannot be used on linmod models built without a formula") Error in model.frame.linmod(object) : model.frame cannot be used on linmod models built without a formula Got expected error from try(model.matrix(linmod.xy.Volume.tr)) > stopifnot(almost.equal(logLik(linmod.xy.Volume.tr), logLik(lm.Volume.tr))) > > par(mfrow=c(2,2)) > plot(linmod.form.Volume.tr) > plot(lm.Volume.tr, which=1, main="lm.Volume.tr") > plot(linmod.xy.Volume.tr) > plot(linmod.form.Volume.tr, xlim=c(0,80), ylim=c(-10,10), pch=20, main="linmod.form.Volume.tr: test plot args") > par(org.par) > > cat0("==test one predictor model\n") ==test one predictor model > > linmod.onepred.form <- linmod(Volume~Girth, data=tr) # one predictor > lm.onepred.form <- lm(Volume~Girth, data=tr) > check.lm(linmod.onepred.form, lm.onepred.form, newdata=trees[3,1:2]) check linmod.onepred.form vs lm.onepred.form > linmod.onepred.xy <- linmod(tr[,1,drop=FALSE], tr[,3]) # one predictor > print(summary(linmod.onepred.xy)) Call: linmod.default(x = tr[, 1, drop = FALSE], y = tr[, 3]) Estimate StdErr t.value p.value (Intercept) -36.943459 3.365145 -10.97827 7.621449e-12 Girth 5.065856 0.247377 20.47829 8.644334e-19 > check.lm(linmod.onepred.xy, lm.onepred.form, newdata=trees[3,1,drop=FALSE]) check linmod.onepred.xy vs lm.onepred.form > > par(mfrow=c(2,2)) > plot(linmod.onepred.form) > plot(lm.onepred.form, which=1, main="lm.onepred.form") > plot(linmod.onepred.xy) > par(org.par) > plotres(linmod.onepred.form) > plotmo(linmod.onepred.form, pt.col=2) > > cat0("==test no intercept model\n") ==test no intercept model > # no intercept models are only supported with the formula interface (not x,y interface) > > linmod.noint <- linmod(Volume~.-1, data=trees) # no intercept > print(summary(linmod.noint)) Call: linmod.formula(formula = Volume ~ . - 1, data = trees) Estimate StdErr t.value p.value Girth 5.0440083 0.4118733 12.246506 5.519859e-13 Height -0.4773192 0.0734721 -6.496605 4.118004e-07 > lm.noint <- lm(Volume~.-1, data=trees) # no intercept > check.lm(linmod.noint, lm.noint) check linmod.noint vs lm.noint > linmod.noint.keep <- linmod(Volume~.-1, data=trees, keep=TRUE) > print(summary(linmod.noint.keep)) Call: linmod.formula(formula = Volume ~ . - 1, data = trees, keep = TRUE) Estimate StdErr t.value p.value Girth 5.0440083 0.4118733 12.246506 5.519859e-13 Height -0.4773192 0.0734721 -6.496605 4.118004e-07 > > check.lm(linmod.noint, lm.noint) check linmod.noint vs lm.noint > stopifnot(class(linmod.noint.keep$data) == class(linmod.form.Volume.trees.keep$data)) > stopifnot(all(dim(linmod.noint.keep$data) == dim(linmod.form.Volume.trees.keep$data))) > stopifnot(all(linmod.noint.keep$data == linmod.form.Volume.trees.keep$data)) > stopifnot(class(linmod.noint.keep$y) == class(linmod.form.Volume.trees.keep$y)) > stopifnot(all(dim(linmod.noint.keep$data) == dim(linmod.form.Volume.trees.keep$data))) > stopifnot(all(linmod.noint.keep$data == linmod.form.Volume.trees.keep$data)) > > # check method functions in no-intercept model > stopifnot(almost.equal(coef(linmod.noint), coef(lm.noint))) > stopifnot(identical(names(coef(linmod.noint)), names(coef(lm.noint)))) > stopifnot(almost.equal(fitted(linmod.noint), fitted(lm.noint))) > stopifnot(identical(names(fitted(linmod.noint)), names(fitted(lm.noint)))) > stopifnot(identical(na.action(linmod.noint), na.action(lm.noint))) > stopifnot(almost.equal(residuals(linmod.noint), residuals(lm.noint))) > stopifnot(identical(names(residuals(linmod.noint)), names(residuals(lm.noint)))) > stopifnot(identical(case.names(linmod.noint), case.names(lm.noint))) > stopifnot(identical(variable.names(linmod.noint), variable.names(lm.noint))) > stopifnot(identical(nobs(linmod.noint), nobs(lm.noint))) > stopifnot(identical(weights(linmod.noint), weights(lm.noint))) > stopifnot(almost.equal(df.residual(linmod.noint), df.residual(lm.noint))) > stopifnot(identical(names(df.residual(linmod.noint)), names(df.residual(lm.noint)))) > stopifnot(almost.equal(deviance(linmod.noint), deviance(lm.noint))) > stopifnot(identical(names(deviance(linmod.noint)), names(deviance(lm.noint)))) > stopifnot(identical(weights(linmod.noint), weights(lm.noint))) > stopifnot(identical(model.frame(linmod.noint), model.frame(lm.noint))) > stopifnot(identical(model.matrix(linmod.noint), model.matrix(lm.noint))) > stopifnot(identical(model.matrix(linmod.noint, data=tr[1:2,]), + model.matrix(lm.noint, data=tr[1:2,]))) > stopifnot(almost.equal(logLik(linmod.noint), logLik(lm.noint))) > stopifnot(almost.equal(estfun(linmod.noint), estfun(lm.noint))) > > # check error messages with bad newdata in no-intercept model > expect.err(try(predict(linmod.noint, newdata=NA)), + "object 'Girth' not found") Error in eval(predvars, data, env) : object 'Girth' not found Got expected error from try(predict(linmod.noint, newdata = NA)) > expect.err(try(predict(linmod.noint, newdata=data.frame(Height=c(1,NA), Girth=c(3,4)))), + "NA in 'newdata'") Error in process.newdata.formula(object, newdata) : NA in 'newdata' Got expected error from try(predict(linmod.noint, newdata = data.frame(Height = c(1, NA), Girth = c(3, 4)))) > expect.err(try(predict(linmod.noint, newdata=trees[0,])), "'newdata' is empty") Error in predict.linmod(linmod.noint, newdata = trees[0, ]) : 'newdata' is empty Got expected error from try(predict(linmod.noint, newdata = trees[0, ])) > expect.err(try(predict(linmod.noint, newdata=trees[3:5,"Height"])), "object 'Girth' not found") Error in eval(predvars, data, env) : object 'Girth' not found Got expected error from try(predict(linmod.noint, newdata = trees[3:5, "Height"])) > # check that extra fields in predict newdata are ok with (formula) models without intercept > stopifnot(almost.equal(predict(linmod.noint, newdata=data.frame(Girth=10, Height=80, extra=99)), + predict(lm.noint, newdata=data.frame(Girth=10, Height=80, extra=99)))) > > par(mfrow=c(2,2)) > plot(linmod.noint) > plot(lm.noint, which=1, main="lm.noint") > par(org.par) > > plotres(linmod.noint) > plotmo(linmod.noint) plotmo grid: Girth Height 12.9 76 > > cat0("==test one predictor no intercept model\n") ==test one predictor no intercept model > # no intercept models are only supported with the formula interface (not x,y interface) > > linmod.onepred.noint <- linmod(Volume~Girth-1, data=trees) # one predictor, no intercept > print(summary(linmod.onepred.noint)) Call: linmod.formula(formula = Volume ~ Girth - 1, data = trees) Estimate StdErr t.value p.value Girth 2.420943 0.1253311 19.31637 1.7813e-18 > lm.onepred.noint <- lm(Volume~Girth-1, data=trees) # one predictor, no intercept > check.lm(linmod.onepred.noint, lm.onepred.noint) check linmod.onepred.noint vs lm.onepred.noint > linmod.onepred.noint.keep <- linmod(Volume~.-1, data=trees, keep=TRUE) > print(summary(linmod.onepred.noint.keep)) Call: linmod.formula(formula = Volume ~ . - 1, data = trees, keep = TRUE) Estimate StdErr t.value p.value Girth 5.0440083 0.4118733 12.246506 5.519859e-13 Height -0.4773192 0.0734721 -6.496605 4.118004e-07 > > check.lm(linmod.onepred.noint, lm.onepred.noint) check linmod.onepred.noint vs lm.onepred.noint > stopifnot(class(linmod.onepred.noint.keep$data) == class(linmod.form.Volume.trees.keep$data)) > stopifnot(all(dim(linmod.onepred.noint.keep$data) == dim(linmod.form.Volume.trees.keep$data))) > stopifnot(all(linmod.onepred.noint.keep$data == linmod.form.Volume.trees.keep$data)) > stopifnot(class(linmod.onepred.noint.keep$y) == class(linmod.form.Volume.trees.keep$y)) > stopifnot(all(dim(linmod.onepred.noint.keep$data) == dim(linmod.form.Volume.trees.keep$data))) > stopifnot(all(linmod.onepred.noint.keep$data == linmod.form.Volume.trees.keep$data)) > > # check method functions in one predictor no-intercept model > stopifnot(almost.equal(coef(linmod.onepred.noint), coef(lm.onepred.noint))) > stopifnot(identical(names(coef(linmod.onepred.noint)), names(coef(lm.onepred.noint)))) > stopifnot(almost.equal(fitted(linmod.onepred.noint), fitted(lm.onepred.noint))) > stopifnot(identical(names(fitted(linmod.onepred.noint)), names(fitted(lm.onepred.noint)))) > stopifnot(identical(na.action(linmod.onepred.noint), na.action(lm.onepred.noint))) > stopifnot(almost.equal(residuals(linmod.onepred.noint), residuals(lm.onepred.noint))) > stopifnot(identical(names(residuals(linmod.onepred.noint)), names(residuals(lm.onepred.noint)))) > stopifnot(identical(case.names(linmod.onepred.noint), case.names(lm.onepred.noint))) > stopifnot(identical(variable.names(linmod.onepred.noint), variable.names(lm.onepred.noint))) > stopifnot(identical(nobs(linmod.onepred.noint), nobs(lm.onepred.noint))) > stopifnot(identical(weights(linmod.onepred.noint), weights(lm.onepred.noint))) > stopifnot(almost.equal(df.residual(linmod.onepred.noint), df.residual(lm.onepred.noint))) > stopifnot(identical(names(df.residual(linmod.onepred.noint)), names(df.residual(lm.onepred.noint)))) > stopifnot(almost.equal(deviance(linmod.onepred.noint), deviance(lm.onepred.noint))) > stopifnot(identical(names(deviance(linmod.onepred.noint)), names(deviance(lm.onepred.noint)))) > stopifnot(identical(weights(linmod.onepred.noint), weights(lm.onepred.noint))) > stopifnot(identical(model.frame(linmod.onepred.noint), model.frame(lm.onepred.noint))) > stopifnot(identical(model.matrix(linmod.onepred.noint), model.matrix(lm.onepred.noint))) > stopifnot(identical(model.matrix(linmod.onepred.noint, data=tr[1:2,]), + model.matrix(lm.onepred.noint, data=tr[1:2,]))) > stopifnot(almost.equal(logLik(linmod.onepred.noint), logLik(lm.onepred.noint))) > stopifnot(almost.equal(estfun(linmod.onepred.noint), estfun(lm.onepred.noint))) > > # check error messages with bad newdata in one predictor no-intercept model > expect.err(try(predict(linmod.onepred.noint, newdata=99)), "object 'Girth' not found") Error in eval(predvars, data, env) : object 'Girth' not found Got expected error from try(predict(linmod.onepred.noint, newdata = 99)) > expect.err(try(predict(linmod.onepred.noint, newdata=data.frame(Girth=NA))), "NA in 'newdata'") Error in process.newdata.formula(object, newdata) : NA in 'newdata' Got expected error from try(predict(linmod.onepred.noint, newdata = data.frame(Girth = NA))) > expect.err(try(predict(linmod.onepred.noint, newdata=trees[0,1])), "'newdata' is empty") Error in predict.linmod(linmod.onepred.noint, newdata = trees[0, 1]) : 'newdata' is empty Got expected error from try(predict(linmod.onepred.noint, newdata = trees[0, 1])) > expect.err(try(predict(linmod.onepred.noint, newdata=trees[3:5,"Height"])), "object 'Girth' not found") Error in eval(predvars, data, env) : object 'Girth' not found Got expected error from try(predict(linmod.onepred.noint, newdata = trees[3:5, "Height"])) > # check that extra fields in predict newdata are ok with (formula) models without intercept > stopifnot(almost.equal(predict(linmod.onepred.noint, newdata=data.frame(Girth=10, extra=99)), + predict(lm.onepred.noint, newdata=data.frame(Girth=10, extra=99)))) > > par(mfrow=c(2,2)) > plot(linmod.onepred.noint) > plot(lm.onepred.noint, which=1, main="lm.onepred.noint") > par(org.par) > > plotres(linmod.onepred.noint) > plotmo(linmod.onepred.noint) > > expect.err(try(linmod(Volume~nonesuch, data=trees)), "object 'nonesuch' not found") Error in eval(predvars, data, env) : object 'nonesuch' not found Got expected error from try(linmod(Volume ~ nonesuch, data = trees)) > expect.err(try(linmod(Volume~0, data=trees)), "'x' is empty") # no predictor Error in check.linmod.x(x) : 'x' is empty Got expected error from try(linmod(Volume ~ 0, data = trees)) > expect.err(try(linmod(Volume~-1, data=trees)), "'x' is empty") # no predictor, no intercept Error in check.linmod.x(x) : 'x' is empty Got expected error from try(linmod(Volume ~ -1, data = trees)) > > cat0("==check model with many variables\n") ==check model with many variables > > set.seed(2018) > p <- 300 # number of variables > n <- floor(1.1 * p) > bigdat <- as.data.frame(matrix(rnorm(n * (p+1)), ncol=p+1)) > colnames(bigdat) <- c("y", paste0("var", 1:p)) > lm.bigdat <- lm(y~., data=bigdat) > linmod.bigdat <- linmod(y~., data=bigdat) > check.lm(linmod.form.Volume.tr, lm.Volume.tr) check linmod.form.Volume.tr vs lm.Volume.tr > print(linmod.bigdat) Call: linmod.formula(formula = y ~ ., data = bigdat) (Intercept) var1 var2 var3 var4 -0.0074874141 -0.0156168166 -0.0323375299 -0.0680410620 -0.1784176655 var5 var6 var7 var8 var9 0.0970839766 -0.2420079781 0.0068052116 0.0605142551 0.1563114625 var10 var11 var12 var13 var14 -0.0705547201 0.0661388031 0.0753290388 -0.0595687675 -0.1972523829 var15 var16 var17 var18 var19 -0.0928371617 0.1400015667 0.0349750202 0.0990295749 -0.0806465990 var20 var21 var22 var23 var24 -0.0005353688 -0.1384821496 -0.0405121324 -0.0181462061 -0.2133498970 var25 var26 var27 var28 var29 -0.0186244683 -0.2593737746 -0.0589964475 -0.0537252842 -0.0594401821 var30 var31 var32 var33 var34 0.0934989343 0.0244371962 0.1403544230 0.2619465745 0.0159354057 var35 var36 var37 var38 var39 -0.0210109954 -0.0328618036 -0.1371912460 -0.0649163643 0.0595217563 var40 var41 var42 var43 var44 -0.0682175594 -0.1103821881 -0.0508841621 -0.1392364303 -0.0103981103 var45 var46 var47 var48 var49 -0.1196682294 -0.1534327142 -0.0754141872 0.1426175022 0.0011406008 var50 var51 var52 var53 var54 0.0379811394 0.0320275730 -0.0532598495 -0.1410085314 0.1519143039 var55 var56 var57 var58 var59 -0.0228233810 0.3170130760 -0.1044797851 -0.0035954154 0.1479556565 var60 var61 var62 var63 var64 0.0122428193 -0.0253431378 -0.0180440355 -0.1794590898 0.0131447015 var65 var66 var67 var68 var69 -0.1720319639 0.1526605311 0.0771868987 -0.2418787630 0.0447156252 var70 var71 var72 var73 var74 -0.1105368627 0.0567936200 0.0424605198 -0.0881098654 0.0092876782 var75 var76 var77 var78 var79 -0.0716540798 -0.1255361536 -0.0071680571 -0.1208344391 -0.0735928839 var80 var81 var82 var83 var84 0.2324224976 -0.1849522151 0.0694052039 0.1390729406 -0.0617270270 var85 var86 var87 var88 var89 0.0850926211 0.1221016487 0.0233354163 0.0075718550 -0.0032554103 var90 var91 var92 var93 var94 0.1209443561 0.2292860177 0.1347583831 0.0781827877 -0.1541547464 var95 var96 var97 var98 var99 0.1337171223 -0.1163422961 -0.0966724692 -0.2182129213 -0.1204830968 var100 var101 var102 var103 var104 -0.0619465323 -0.1113710701 0.0594579753 0.0955361014 -0.0519687498 var105 var106 var107 var108 var109 -0.0346599073 0.2181197633 0.0332996851 -0.0969131172 0.1736014017 var110 var111 var112 var113 var114 -0.1714974837 -0.0056002152 0.1393566962 -0.0972988693 0.0475762687 var115 var116 var117 var118 var119 0.2364360899 -0.0985131354 -0.0894394214 -0.2355018204 0.0025381197 var120 var121 var122 var123 var124 -0.1427340796 -0.0565016310 -0.0455466677 0.1579742783 0.1290270638 var125 var126 var127 var128 var129 0.0735269010 -0.0074354274 -0.0202350963 0.0921409434 0.0578351619 var130 var131 var132 var133 var134 0.0457446540 -0.0497481279 -0.0716169797 -0.0834890066 0.0078486400 var135 var136 var137 var138 var139 0.0569885547 -0.0880888941 0.0931535379 0.0029921816 0.0215558011 var140 var141 var142 var143 var144 0.0379439385 0.1288009147 -0.0627699322 0.1471235930 0.0418985129 var145 var146 var147 var148 var149 0.1581333558 0.2109672906 -0.1305882685 0.1715603371 -0.0674028658 var150 var151 var152 var153 var154 -0.1809329622 -0.0618254790 -0.0644645613 -0.0185217288 0.0963509748 var155 var156 var157 var158 var159 0.0669555139 0.1341679917 0.0014091507 0.1912096659 0.1049270995 var160 var161 var162 var163 var164 0.1407325985 -0.0149350788 -0.1567496204 0.0881458138 -0.0429862791 var165 var166 var167 var168 var169 0.0080105136 -0.0374778798 0.1385838635 -0.0734288141 -0.1266495195 var170 var171 var172 var173 var174 0.0071467393 -0.0255859731 0.1516581037 -0.2106472762 -0.0308347530 var175 var176 var177 var178 var179 0.0076295054 0.1793572809 0.1064141211 0.0906223259 0.0435110825 var180 var181 var182 var183 var184 -0.1264325305 -0.0968032660 0.1430811907 0.0307419406 -0.0319429988 var185 var186 var187 var188 var189 0.0461719964 -0.2385322379 0.0850810205 0.3949689631 0.1245166753 var190 var191 var192 var193 var194 0.1720563316 0.2144640136 0.0501975420 0.1174708714 -0.1943912402 var195 var196 var197 var198 var199 0.0202300723 0.0210580247 0.0726236855 0.1064539412 -0.0767767634 var200 var201 var202 var203 var204 -0.0624521254 0.0028300645 -0.1715330103 0.2115665862 0.0338181429 var205 var206 var207 var208 var209 0.0167958834 -0.0590878112 -0.1653100651 -0.0740487318 -0.0043391023 var210 var211 var212 var213 var214 0.3393487726 0.2223498489 0.0213281741 0.2230110595 -0.1228075434 var215 var216 var217 var218 var219 -0.0104634410 0.0326754989 -0.4439139348 -0.1087432871 -0.0107897918 var220 var221 var222 var223 var224 -0.0296175151 0.1091241015 0.0909297736 -0.3485310127 0.0832890933 var225 var226 var227 var228 var229 -0.0042697108 0.0593458113 -0.0182956931 0.0572344159 -0.1231669279 var230 var231 var232 var233 var234 0.0492497234 -0.2862525037 0.1834105207 0.2081280243 0.1641204059 var235 var236 var237 var238 var239 0.2472694582 0.0683823801 0.1891842675 -0.0489319878 0.1490499844 var240 var241 var242 var243 var244 -0.0095798604 0.0721964545 -0.0126839937 -0.2221525719 -0.0829084901 var245 var246 var247 var248 var249 -0.0318090335 -0.0425994225 0.0033944363 0.0984076551 -0.2148911884 var250 var251 var252 var253 var254 -0.1875432344 -0.1735721485 0.2886948591 0.1467087046 -0.0834815473 var255 var256 var257 var258 var259 -0.0635576566 -0.0346030600 -0.1224921370 -0.2423169128 -0.0021922047 var260 var261 var262 var263 var264 -0.0818789537 -0.0707600938 -0.3301726263 -0.2602526557 -0.1427837485 var265 var266 var267 var268 var269 -0.1315034492 0.1292166855 0.0265412839 0.1111883441 0.1302021867 var270 var271 var272 var273 var274 -0.0923837589 -0.0680064479 -0.1776069310 -0.0374118346 0.0877037245 var275 var276 var277 var278 var279 -0.0016240717 0.1670149940 0.1542172653 -0.0108006893 0.1334885400 var280 var281 var282 var283 var284 0.1637485211 0.0649039066 -0.0277897733 0.1978208690 0.0984930229 var285 var286 var287 var288 var289 -0.1113854013 0.0770616839 -0.0634971052 0.1652137421 -0.0984475187 var290 var291 var292 var293 var294 0.1166070472 -0.0682754836 0.1016526112 -0.2976518291 -0.1119627963 var295 var296 var297 var298 var299 0.2734232937 -0.1054927068 -0.2151298321 0.0208265210 0.0882009038 var300 0.1604547308 > print(summary(linmod.bigdat)) Call: linmod.formula(formula = y ~ ., data = bigdat) Estimate StdErr t.value p.value (Intercept) -0.0074874141 0.1800205 -0.041592015 0.9671090 var1 -0.0156168166 0.2371393 -0.065855031 0.9479451 var2 -0.0323375299 0.2074053 -0.155914683 0.8771805 var3 -0.0680410620 0.2135121 -0.318675467 0.7522565 var4 -0.1784176655 0.2765676 -0.645114193 0.5239245 var5 0.0970839766 0.2705479 0.358842112 0.7223126 var6 -0.2420079781 0.2227204 -1.086599878 0.2861632 var7 0.0068052116 0.2638035 0.025796522 0.9795963 var8 0.0605142551 0.2672763 0.226410883 0.8224702 var9 0.1563114625 0.2173700 0.719103064 0.4778324 var10 -0.0705547201 0.2298045 -0.307020683 0.7610215 var11 0.0661388031 0.2511706 0.263322181 0.7941642 var12 0.0753290388 0.2012531 0.374300073 0.7109041 var13 -0.0595687675 0.3550150 -0.167792238 0.8679114 var14 -0.1972523829 0.2246975 -0.877857612 0.3872362 var15 -0.0928371617 0.2113127 -0.439335409 0.6636749 var16 0.1400015667 0.2435983 0.574723062 0.5699107 var17 0.0349750202 0.1917603 0.182389223 0.8565463 var18 0.0990295749 0.2216047 0.446874974 0.6582850 var19 -0.0806465990 0.1909595 -0.422323087 0.6759040 var20 -0.0005353688 0.2338494 -0.002289374 0.9981890 var21 -0.1384821496 0.2015467 -0.687097048 0.4974799 var22 -0.0405121324 0.2477545 -0.163517220 0.8712455 var23 -0.0181462061 0.2375000 -0.076405072 0.9396215 var24 -0.2133498970 0.2363631 -0.902636318 0.3741555 var25 -0.0186244683 0.2254941 -0.082594047 0.9347418 var26 -0.2593737746 0.2564927 -1.011232508 0.3202685 var27 -0.0589964475 0.2340174 -0.252102832 0.8027398 var28 -0.0537252842 0.2245610 -0.239245826 0.8125978 var29 -0.0594401821 0.2027951 -0.293104596 0.7715294 var30 0.0934989343 0.2367895 0.394860933 0.6958348 var31 0.0244371962 0.3424643 0.071356924 0.9436035 var32 0.1403544230 0.2135245 0.657322481 0.5161571 var33 0.2619465745 0.2640503 0.992032890 0.3293872 var34 0.0159354057 0.2044152 0.077956052 0.9383984 var35 -0.0210109954 0.2844938 -0.073853956 0.9416337 var36 -0.0328618036 0.2399793 -0.136936018 0.8920276 var37 -0.1371912460 0.2537454 -0.540664966 0.5928674 var38 -0.0649163643 0.1799295 -0.360787712 0.7208731 var39 0.0595217563 0.2022310 0.294325542 0.7706057 var40 -0.0682175594 0.2554638 -0.267034184 0.7913327 var41 -0.1103821881 0.2331126 -0.473514393 0.6393915 var42 -0.0508841621 0.2752612 -0.184857767 0.8546273 var43 -0.1392364303 0.2495550 -0.557938843 0.5811682 var44 -0.0103981103 0.2209398 -0.047063086 0.9627856 var45 -0.1196682294 0.3048932 -0.392492323 0.6975645 var46 -0.1534327142 0.2572114 -0.596523861 0.5554538 var47 -0.0754141872 0.2600154 -0.290037393 0.7738514 var48 0.1426175022 0.2254117 0.632697751 0.5318886 var49 0.0011406008 0.2120596 0.005378679 0.9957453 var50 0.0379811394 0.2310918 0.164355174 0.8705918 var51 0.0320275730 0.2767792 0.115715247 0.9086758 var52 -0.0532598495 0.2458433 -0.216641439 0.8300046 var53 -0.1410085314 0.1977205 -0.713171114 0.4814399 var54 0.1519143039 0.2314816 0.656269545 0.5168246 var55 -0.0228233810 0.2350910 -0.097083173 0.9233282 var56 0.3170130760 0.3614265 0.877116184 0.3876321 var57 -0.1044797851 0.2183847 -0.478420881 0.6359379 var58 -0.0035954154 0.2751337 -0.013067882 0.9896631 var59 0.1479556565 0.2123298 0.696820184 0.4914637 var60 0.0122428193 0.2293630 0.053377487 0.9577972 var61 -0.0253431378 0.2313604 -0.109539665 0.9135290 var62 -0.0180440355 0.1981508 -0.091062144 0.9280693 var63 -0.1794590898 0.1901054 -0.943998047 0.3529695 var64 0.0131447015 0.2083418 0.063092011 0.9501261 var65 -0.1720319639 0.2428857 -0.708283494 0.4844239 var66 0.1526605311 0.2147799 0.710776774 0.4829003 var67 0.0771868987 0.3130362 0.246575008 0.8069742 var68 -0.2418787630 0.2493599 -0.969998540 0.3400684 var69 0.0447156252 0.2115566 0.211364798 0.8340810 var70 -0.1105368627 0.1705161 -0.648248782 0.5219242 var71 0.0567936200 0.2117084 0.268263375 0.7903957 var72 0.0424605198 0.2223151 0.190992539 0.8498623 var73 -0.0881098654 0.2502169 -0.352133982 0.7272839 var74 0.0092876782 0.1725946 0.053812095 0.9574539 var75 -0.0716540798 0.2042502 -0.350815262 0.7282627 var76 -0.1255361536 0.2032681 -0.617588945 0.5416660 var77 -0.0071680571 0.2245031 -0.031928539 0.9747478 var78 -0.1208344391 0.2171811 -0.556376521 0.5822217 var79 -0.0735928839 0.2758883 -0.266748816 0.7915503 var80 0.2324224976 0.2178554 1.066865690 0.2948340 var81 -0.1849522151 0.2494518 -0.741434562 0.4643923 var82 0.0694052039 0.2244402 0.309236945 0.7593522 var83 0.1390729406 0.2408728 0.577370810 0.5681449 var84 -0.0617270270 0.2172721 -0.284100080 0.7783524 var85 0.0850926211 0.2263187 0.375985799 0.7096640 var86 0.1221016487 0.2563207 0.476362843 0.6373855 var87 0.0233354163 0.1872097 0.124648512 0.9016619 var88 0.0075718550 0.1673231 0.045252884 0.9642159 var89 -0.0032554103 0.1788632 -0.018200555 0.9856035 var90 0.1209443561 0.2560722 0.472305640 0.6402436 var91 0.2292860177 0.1858306 1.233844321 0.2271674 var92 0.1347583831 0.2565987 0.525171749 0.6034562 var93 0.0781827877 0.2780298 0.281202951 0.7805515 var94 -0.1541547464 0.2788393 -0.552844434 0.5846067 var95 0.1337171223 0.2598042 0.514684249 0.6106743 var96 -0.1163422961 0.2154543 -0.539986000 0.5933295 var97 -0.0966724692 0.1949970 -0.495763812 0.6237974 var98 -0.2182129213 0.2123535 -1.027592541 0.3126367 var99 -0.1204830968 0.2005145 -0.600869627 0.5525946 var100 -0.0619465323 0.1976115 -0.313476390 0.7561624 var101 -0.1113710701 0.2468408 -0.451185779 0.6552116 var102 0.0594579753 0.2864292 0.207583470 0.8370051 var103 0.0955361014 0.2438856 0.391725115 0.6981251 var104 -0.0519687498 0.1991270 -0.260982906 0.7959502 var105 -0.0346599073 0.2657151 -0.130440121 0.8971189 var106 0.2181197633 0.2335975 0.933741705 0.3581471 var107 0.0332996851 0.2262542 0.147178175 0.8840098 var108 -0.0969131172 0.2404953 -0.402973070 0.6899235 var109 0.1736014017 0.2382727 0.728582793 0.4720999 var110 -0.1714974837 0.2789115 -0.614881303 0.5434281 var111 -0.0056002152 0.2405138 -0.023284378 0.9815829 var112 0.1393566962 0.2713318 0.513602510 0.6114211 var113 -0.0972988693 0.2237430 -0.434868813 0.6668767 var114 0.0475762687 0.2010286 0.236664132 0.8145811 var115 0.2364360899 0.1812356 1.304578743 0.2022950 var116 -0.0985131354 0.1918563 -0.513473612 0.6115102 var117 -0.0894394214 0.2173996 -0.411405563 0.6837999 var118 -0.2355018204 0.2043250 -1.152584287 0.2584937 var119 0.0025381197 0.2468950 0.010280159 0.9918682 var120 -0.1427340796 0.2098195 -0.680270750 0.5017283 var121 -0.0565016310 0.2247369 -0.251412320 0.8032684 var122 -0.0455466677 0.2003293 -0.227358982 0.8217399 var123 0.1579742783 0.2883202 0.547912675 0.5879449 var124 0.1290270638 0.2496442 0.516843926 0.6091846 var125 0.0735269010 0.2161412 0.340180001 0.7361728 var126 -0.0074354274 0.2214263 -0.033579687 0.9734424 var127 -0.0202350963 0.2301697 -0.087913801 0.9305495 var128 0.0921409434 0.1946116 0.473460579 0.6394294 var129 0.0578351619 0.1972534 0.293202402 0.7714554 var130 0.0457446540 0.1811477 0.252526816 0.8024152 var131 -0.0497481279 0.2395549 -0.207669049 0.8369389 var132 -0.0716169797 0.2264069 -0.316319726 0.7540255 var133 -0.0834890066 0.2330487 -0.358247063 0.7227531 var134 0.0078486400 0.2177636 0.036042020 0.9714958 var135 0.0569885547 0.2341690 0.243365105 0.8094359 var136 -0.0880888941 0.2153686 -0.409014568 0.6855340 var137 0.0931535379 0.2469843 0.377163735 0.7087980 var138 0.0029921816 0.2751486 0.010874785 0.9913978 var139 0.0215558011 0.2147867 0.100359093 0.9207499 var140 0.0379439385 0.2406773 0.157654833 0.8758214 var141 0.1288009147 0.2085225 0.617683396 0.5416046 var142 -0.0627699322 0.2098144 -0.299168892 0.7669448 var143 0.1471235930 0.2412491 0.609841087 0.5467163 var144 0.0418985129 0.2434882 0.172076181 0.8645729 var145 0.1581333558 0.2214480 0.714088092 0.4808812 var146 0.2109672906 0.2233900 0.944389874 0.3527727 var147 -0.1305882685 0.2529765 -0.516207076 0.6096237 var148 0.1715603371 0.2701917 0.634957851 0.5304342 var149 -0.0674028658 0.2036219 -0.331019746 0.7430096 var150 -0.1809329622 0.2498705 -0.724106996 0.4748015 var151 -0.0618254790 0.2176185 -0.284100247 0.7783522 var152 -0.0644645613 0.2754214 -0.234057917 0.8165845 var153 -0.0185217288 0.2208211 -0.083876614 0.9337309 var154 0.0963509748 0.2313142 0.416537290 0.6800839 var155 0.0669555139 0.1933443 0.346302031 0.7316158 var156 0.1341679917 0.2524602 0.531442178 0.5991599 var157 0.0014091507 0.2640273 0.005337141 0.9957781 var158 0.1912096659 0.1695380 1.127827842 0.2686376 var159 0.1049270995 0.2414864 0.434505156 0.6671377 var160 0.1407325985 0.2455352 0.573166587 0.5709501 var161 -0.0149350788 0.2301044 -0.064905660 0.9486945 var162 -0.1567496204 0.2009329 -0.780109241 0.4416476 var163 0.0881458138 0.1865732 0.472446196 0.6401445 var164 -0.0429862791 0.1842946 -0.233247688 0.8172076 var165 0.0080105136 0.2145006 0.037344952 0.9704659 var166 -0.0374778798 0.2318411 -0.161653296 0.8726999 var167 0.1385838635 0.2867304 0.483324640 0.6324945 var168 -0.0734288141 0.3050426 -0.240716561 0.8114685 var169 -0.1266495195 0.2501795 -0.506234633 0.6165190 var170 0.0071467393 0.2711878 0.026353468 0.9791559 var171 -0.0255859731 0.1960230 -0.130525331 0.8970520 var172 0.1516581037 0.2794876 0.542629017 0.5915315 var173 -0.2106472762 0.2586949 -0.814269164 0.4221271 var174 -0.0308347530 0.1917615 -0.160797399 0.8733679 var175 0.0076295054 0.3046328 0.025044924 0.9801907 var176 0.1793572809 0.2037214 0.880404570 0.3858783 var177 0.1064141211 0.2557243 0.416128313 0.6803797 var178 0.0906223259 0.1983712 0.456832105 0.6511953 var179 0.0435110825 0.2579405 0.168686498 0.8672143 var180 -0.1264325305 0.2161180 -0.585016152 0.5630615 var181 -0.0968032660 0.2302398 -0.420445421 0.6772593 var182 0.1430811907 0.2453891 0.583078722 0.5643475 var183 0.0307419406 0.2604510 0.118033506 0.9068549 var184 -0.0319429988 0.2463878 -0.129645214 0.8977422 var185 0.0461719964 0.2008406 0.229893732 0.8197882 var186 -0.2385322379 0.2385500 -0.999925395 0.3256175 var187 0.0850810205 0.2238337 0.380108258 0.7066348 var188 0.3949689631 0.2554732 1.546028733 0.1329419 var189 0.1245166753 0.2747638 0.453177206 0.6537938 var190 0.1720563316 0.1879732 0.915323611 0.3675705 var191 0.2144640136 0.2413709 0.888524686 0.3815695 var192 0.0501975420 0.2506340 0.200282260 0.8426578 var193 0.1174708714 0.1746616 0.672562616 0.5065496 var194 -0.1943912402 0.3087673 -0.629571991 0.5339036 var195 0.0202300723 0.1915222 0.105627803 0.9166049 var196 0.0210580247 0.2176811 0.096737972 0.9235999 var197 0.0726236855 0.2177147 0.333572658 0.7411020 var198 0.1064539412 0.2261034 0.470819639 0.6412918 var199 -0.0767767634 0.2594113 -0.295965345 0.7693656 var200 -0.0624521254 0.2431441 -0.256852333 0.7991064 var201 0.0028300645 0.2063768 0.013713095 0.9891528 var202 -0.1715330103 0.2434880 -0.704482359 0.4867518 var203 0.2115665862 0.2486851 0.850740856 0.4018833 var204 0.0338181429 0.2280774 0.148274859 0.8831521 var205 0.0167958834 0.2489778 0.067459374 0.9466790 var206 -0.0590878112 0.1959422 -0.301557386 0.7651414 var207 -0.1653100651 0.2678547 -0.617163149 0.5419429 var208 -0.0740487318 0.2976417 -0.248784829 0.8052807 var209 -0.0043391023 0.2286282 -0.018978862 0.9849879 var210 0.3393487726 0.2358674 1.438726974 0.1609341 var211 0.2223498489 0.2661974 0.835281675 0.4103882 var212 0.0213281741 0.2315918 0.092093805 0.9272568 var213 0.2230110595 0.2581936 0.863735666 0.3948210 var214 -0.1228075434 0.2065047 -0.594696099 0.5566586 var215 -0.0104634410 0.2454306 -0.042632989 0.9662863 var216 0.0326754989 0.1978876 0.165121515 0.8699940 var217 -0.4439139348 0.3244134 -1.368358977 0.1817084 var218 -0.1087432871 0.2499652 -0.435033655 0.6667585 var219 -0.0107897918 0.2111081 -0.051110265 0.9595881 var220 -0.0296175151 0.2005449 -0.147685200 0.8836133 var221 0.1091241015 0.2479581 0.440090806 0.6631341 var222 0.0909297736 0.2382558 0.381647734 0.7055049 var223 -0.3485310127 0.2994113 -1.164054343 0.2538897 var224 0.0832890933 0.2243884 0.371182680 0.7131995 var225 -0.0042697108 0.3003295 -0.014216755 0.9887544 var226 0.0593458113 0.2310813 0.256817880 0.7991327 var227 -0.0182956931 0.1938017 -0.094404189 0.9254374 var228 0.0572344159 0.2343684 0.244207074 0.8087900 var229 -0.1231669279 0.2605563 -0.472707582 0.6399602 var230 0.0492497234 0.2111087 0.233290802 0.8171745 var231 -0.2862525037 0.1914503 -1.495179287 0.1456712 var232 0.1834105207 0.1939787 0.945519089 0.3522060 var233 0.2081280243 0.1632040 1.275263095 0.2123381 var234 0.1641204059 0.2272942 0.722061495 0.4760391 var235 0.2472694582 0.1902445 1.299745561 0.2039253 var236 0.0683823801 0.2231440 0.306449594 0.7614518 var237 0.1891842675 0.2214505 0.854295987 0.3999433 var238 -0.0489319878 0.2340164 -0.209096383 0.8358349 var239 0.1490499844 0.2429465 0.613509393 0.5443221 var240 -0.0095798604 0.2533123 -0.037818383 0.9700916 var241 0.0721964545 0.1969929 0.366492592 0.7166580 var242 -0.0126839937 0.2087745 -0.060754522 0.9519715 var243 -0.2221525719 0.1983111 -1.120222514 0.2718109 var244 -0.0829084901 0.2055738 -0.403302790 0.6896837 var245 -0.0318090335 0.2292748 -0.138737596 0.8906165 var246 -0.0425994225 0.2283779 -0.186530377 0.8533276 var247 0.0033944363 0.2129927 0.015936864 0.9873939 var248 0.0984076551 0.2343675 0.419886173 0.6776632 var249 -0.2148911884 0.2120962 -1.013177766 0.3193544 var250 -0.1875432344 0.2503294 -0.749185930 0.4597794 var251 -0.1735721485 0.2906428 -0.597200849 0.5550079 var252 0.2886948591 0.2512542 1.149015262 0.2599386 var253 0.1467087046 0.2485217 0.590325564 0.5595449 var254 -0.0834815473 0.2384597 -0.350086644 0.7288036 var255 -0.0635576566 0.2733631 -0.232502667 0.8177807 var256 -0.0346030600 0.3391339 -0.102033634 0.9194322 var257 -0.1224921370 0.1991311 -0.615133252 0.5432640 var258 -0.2423169128 0.2163175 -1.120191176 0.2718240 var259 -0.0021922047 0.2169919 -0.010102701 0.9920085 var260 -0.0818789537 0.2213754 -0.369864799 0.7141707 var261 -0.0707600938 0.2111357 -0.335140308 0.7399315 var262 -0.3301726263 0.2521985 -1.309177801 0.2007530 var263 -0.2602526557 0.2351244 -1.106872336 0.2774464 var264 -0.1427837485 0.2547866 -0.560405290 0.5795071 var265 -0.1315034492 0.2038109 -0.645222811 0.5238552 var266 0.1292166855 0.1857550 0.695629819 0.4921980 var267 0.0265412839 0.2291648 0.115817440 0.9085955 var268 0.1111883441 0.2630197 0.422737718 0.6756049 var269 0.1302021867 0.2400981 0.542287436 0.5917637 var270 -0.0923837589 0.2552903 -0.361877334 0.7200673 var271 -0.0680064479 0.2072222 -0.328181232 0.7451325 var272 -0.1776069310 0.2287416 -0.776452095 0.4437692 var273 -0.0374118346 0.2277425 -0.164272515 0.8706562 var274 0.0877037245 0.2180473 0.402223481 0.6904689 var275 -0.0016240717 0.2913139 -0.005574988 0.9955900 var276 0.1670149940 0.2327284 0.717639018 0.4787213 var277 0.1542172653 0.2293724 0.672344500 0.5066864 var278 -0.0108006893 0.2634879 -0.040991220 0.9675838 var279 0.1334885400 0.2086489 0.639775940 0.5273407 var280 0.1637485211 0.2134740 0.767065523 0.4492427 var281 0.0649039066 0.1972117 0.329107849 0.7444393 var282 -0.0277897733 0.2630854 -0.105630223 0.9166030 var283 0.1978208690 0.1913322 1.033913324 0.3097222 var284 0.0984930229 0.2972660 0.331329592 0.7427780 var285 -0.1113854013 0.2238975 -0.497483952 0.6225990 var286 0.0770616839 0.2067096 0.372801690 0.7120070 var287 -0.0634971052 0.2337652 -0.271627762 0.7878326 var288 0.1652137421 0.2168261 0.761964380 0.4522341 var289 -0.0984475187 0.2827889 -0.348130788 0.7302565 var290 0.1166070472 0.1940659 0.600863259 0.5525988 var291 -0.0682754836 0.2270118 -0.300757444 0.7657452 var292 0.1016526112 0.2081493 0.488363972 0.6289646 var293 -0.2976518291 0.2175924 -1.367932916 0.1818403 var294 -0.1119627963 0.2411543 -0.464278710 0.6459147 var295 0.2734232937 0.2291048 1.193442092 0.2423685 var296 -0.1054927068 0.2409970 -0.437734561 0.6648217 var297 -0.2151298321 0.3031934 -0.709546479 0.4836518 var298 0.0208265210 0.2160796 0.096383564 0.9238789 var299 0.0882009038 0.2477594 0.355994206 0.7244217 var300 0.1604547308 0.2218983 0.723100206 0.4754104 > expect.err(try(predict(linmod.bigdat, newdata=bigdat[,1:(p-3)])), "object 'var297' not found") Error in eval(predvars, data, env) : object 'var297' not found Got expected error from try(predict(linmod.bigdat, newdata = bigdat[, 1:(p - 3)])) > plot(linmod.bigdat) > # plotmo(linmod.bigdat) # works, but commented out because slow(ish) > # plotres(linmod.bigdat) # ditto > > cat0("==check use of matrix as data in linmod.form\n") ==check use of matrix as data in linmod.form > # linmod.form allows a matrix, lm doesn't TODO is this inconsistency what we want? > tr.mat <- as.matrix(tr) > cat0("class(tr.mat)=", class(tr.mat), "\n") # class(tr.mat)=matrix class(tr.mat)=matrixarray > expect.err(try(lm(Volume~., data=tr.mat)), "'data' must be a data.frame, not a matrix or an array") Error in model.frame.default(formula = Volume ~ ., data = tr.mat, drop.unused.levels = TRUE) : 'data' must be a data.frame, not a matrix or an array Got expected error from try(lm(Volume ~ ., data = tr.mat)) > linmod.form.Volume.mat.tr <- linmod(Volume~., data=tr.mat) > check.lm(linmod.form.Volume.mat.tr, linmod.form.Volume.tr) check linmod.form.Volume.mat.tr vs linmod.form.Volume.tr > cat0("==print(summary(linmod.form.Volume.mat.tr))\n") ==print(summary(linmod.form.Volume.mat.tr)) > print(summary(linmod.form.Volume.mat.tr)) Call: linmod.formula(formula = Volume ~ ., data = tr.mat) Estimate StdErr t.value p.value (Intercept) -57.9876589 8.6382259 -6.712913 2.749507e-07 Girth 4.7081605 0.2642646 17.816084 8.223304e-17 Height 0.3392512 0.1301512 2.606594 1.449097e-02 > plotres(linmod.form.Volume.mat.tr) > > tr.mat.no.colnames <- as.matrix(tr) > colnames(tr.mat.no.colnames) <- NULL > expect.err(try(linmod(Volume~., data=tr.mat.no.colnames)), "object 'Volume' not found") Error in eval(predvars, data, env) : object 'Volume' not found Got expected error from try(linmod(Volume ~ ., data = tr.mat.no.colnames)) > linmod.form.Volume.mat.tr.no.colnames <- linmod(V3~., data=tr.mat.no.colnames) > check.lm(linmod.form.Volume.mat.tr.no.colnames, linmod.form.Volume.tr, + check.coef.names=FALSE, check.newdata=FALSE) # no check.newdata else object 'V1' not found check linmod.form.Volume.mat.tr.no.colnames vs linmod.form.Volume.tr > > # Check what happens when we change the original data used to build the model. > # Use plotres as an example function that must figure out residuals from predict(). > > pr <- function(model, main=deparse(substitute(model))) + { + plotres(model, which=3, main=main) # which=3 for just the residuals plot + } > cat0("==linmod.formula: change data used to build the model\n") ==linmod.formula: change data used to build the model > > trees1 <- trees > linmod.trees1 <- linmod(Volume~., data=trees1) > # delete the saved residuals and fitted.values so plotres has to use the saved > # call etc. to get the x and y used to build the model, and rely on predict() > linmod.trees1$residuals <- NULL > linmod.trees1$fitted.values <- NULL > par(mfrow=c(3,3)) > pr(linmod.trees1) > trees1 <- trees[, 3:1] # change column order in original data > pr(linmod.trees1, "change col order") > trees1 <- trees[1:3, ] # change number of rows in original data > pr(linmod.trees1, "change nbr rows") # TODO wrong residuals! (lm has the same issue) > cat("call$data now refers to the changed data:\n") # lm has the same problem if called with model=FALSE call$data now refers to the changed data: > print(eval(linmod.trees1$call$data)) Girth Height Volume 1 8.3 70 10.3 2 8.6 65 10.3 3 8.8 63 10.2 > cat("model.frame now returns the changed data:\n") model.frame now returns the changed data: > print(model.frame(linmod.trees1)) Volume Girth Height 1 10.3 8.3 70 2 10.3 8.6 65 3 10.2 8.8 63 > trees1 <- trees[nrow(tr):1, ] # change row order (but keep same nbr of rows) > pr(linmod.trees1, "change row order") > colnames(trees1) <- c("x1", "x2", "x3") # change column names in original data > expect.err(try(pr(linmod.trees1, + "change colnames")), "cannot get the original model predictors") Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: object 'Volume' not found (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(pr(linmod.trees1, "change colnames")) > trees1 <- "garbage" > expect.err(try(pr(linmod.trees1, + "trees1=\"garbage\"")), "cannot get the original model predictors") Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: object 'Volume' not found (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(pr(linmod.trees1, "trees1=\"garbage\"")) > trees1 <- 1:1000 > expect.err(try(pr(linmod.trees1, + "trees1=1:1000")), "cannot get the original model predictors") Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: object 'Volume' not found (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(pr(linmod.trees1, "trees1=1:1000")) > trees1 <- NULL # original data no longer available > expect.err(try(pr(linmod.trees1, + "trees1=NULL")), "cannot get the original model predictors") Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: object 'Volume' not found (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(pr(linmod.trees1, "trees1=NULL")) > remove(trees1) > expect.err(try(pr(linmod.trees1, + "remove(trees1)")), "cannot get the original model predictors") Error in eval(expr, envir, enclos) : object 'trees1' not found Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: object 'Volume' not found (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(pr(linmod.trees1, "remove(trees1)")) > > # similar to above, but don't delete the saved residuals and fitted.values > trees1 <- trees > linmod2.trees1 <- linmod(Volume~., data=trees1) > trees1 <- trees[1:3, ] # change number of rows in original data > expect.err(try(plotmo(linmod2.trees1)), "plotmo_y returned the wrong length (got 3 but expected 31)") Error : plotmo_y returned the wrong length (got 3 but expected 31) Got expected error from try(plotmo(linmod2.trees1)) > > par(org.par) > > cat0("==linmod.formula(keep=TRUE): change data used to build the model\n") ==linmod.formula(keep=TRUE): change data used to build the model > par(mfrow=c(3,3)) > trees1 <- trees > linmod.trees1.keep <- linmod(Volume~., data=trees1, keep=TRUE) > # delete the saved residuals and fitted.values so plotres has to use the saved > # call etc. to get the x and y used to build the model, and rely on predict() > linmod.trees1.keep$residuals <- NULL > linmod.trees1.keep$fitted.values <- NULL > pr(linmod.trees1.keep) > trees1 <- trees[, 3:1] # change column order in original data > pr(linmod.trees1.keep, "change col order") > trees1 <- trees[1:3, ] # change number of rows in original data > pr(linmod.trees1.keep, "change nbr rows") > trees1 <- trees[nrow(tr):1, ] # change row order (but keep same nbr of rows) > pr(linmod.trees1.keep, "change row order") > colnames(trees1) <- c("x1", "x2", "x3") # change column names in original data > pr(linmod.trees1.keep, "change colnames") > trees1 <- NULL # original data no longer available > pr(linmod.trees1.keep, "trees1=NULL") > remove(trees1) > pr(linmod.trees1.keep, "remove(trees1)") > par(org.par) > > cat0("==linmod.default: change data used to build the model\n") ==linmod.default: change data used to build the model > trees1 <- trees > x1 <- trees1[,1:2] > y1 <- trees1[,3] > linmod.xy <- linmod(x1, y1) > # delete the saved residuals and fitted.values so plotres has to use the saved > # call etc. to get the x1 and y1 used to build the model, and rely on predict() > linmod.xy$residuals <- NULL > linmod.xy$fitted.values <- NULL > par(mfrow=c(3,3)) > pr(linmod.xy) > x1 <- trees1[,2:1] # change column order in original x1 > pr(linmod.xy, "change col order") > x1 <- trees1[1:3, 1:2] # change number of rows in original x1 > expect.err(try(pr(linmod.xy, "change nbr rows")), + "plotmo_y returned the wrong length (got 31 but expected 3)") # TODO different behaviour to linmod.trees1 Error : plotmo_y returned the wrong length (got 31 but expected 3) Got expected error from try(pr(linmod.xy, "change nbr rows")) > cat("call$x1 now refers to the changed x1:\n") # lm has the same problem if called with model=FALSE call$x1 now refers to the changed x1: > print(eval(linmod.xy$call$x1)) NULL > x1 <- trees1[nrow(tr):1, 1:2] # change row order (but keep same nbr of rows) > pr(linmod.xy, "change row order") > x1 <- trees1[,1:2] > colnames(x1) <- c("x1", "x2") # change column names in original x1 > pr(linmod.xy, "change colnames") > x1 <- "garbage" > expect.err(try(pr(linmod.xy, "x1=\"garbage\"")), "cannot get the original model predictors") Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: no formula in getCall(object) (3) getCall(object)$x: garbage Error : cannot get the original model predictors Got expected error from try(pr(linmod.xy, "x1=\"garbage\"")) > x1 <- 1:1000 > expect.err(try(pr(linmod.xy, "x1=1:1000")), "ncol(newdata) is 1 but should be 2") stats::predict(linmod.object, data.frame[3,1], type="response") Error in predict.linmod(structure(list(coefficients = c(`(Intercept)` = -57.987658918381, : ncol(newdata) is 1 but should be 2 Got expected error from try(pr(linmod.xy, "x1=1:1000")) > x1 <- NULL # original x1 no longer available > expect.err(try(pr(linmod.xy, "x1=NULL")), "cannot get the original model predictors") Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: no formula in getCall(object) (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(pr(linmod.xy, "x1=NULL")) > remove(x1) > expect.err(try(pr(linmod.xy, "remove(x1)")), "cannot get the original model predictors") Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: no formula in getCall(object) (3) getCall(object)$x: object 'x1' not found Error : cannot get the original model predictors Got expected error from try(pr(linmod.xy, "remove(x1)")) > > # similar to above, but don't delete the saved residuals and fitted.values > trees1 <- trees > x1 <- trees1[,1:2] > y1 <- trees1[,3] > linmod.xy <- linmod(x1, y1) > x1 <- trees1[1:3, 1:2] # change number of rows in original x1 > expect.err(try(plotmo(linmod2.x1)), "object 'linmod2.x1' not found") # TODO error message misleading? Error : object 'linmod2.x1' not found Got expected error from try(plotmo(linmod2.x1)) > > par(org.par) > > cat0("==linmod.default(keep=TRUE): change data used to build the model\n") ==linmod.default(keep=TRUE): change data used to build the model > par(mfrow=c(3,3)) > trees1 <- trees > x1 <- trees1[,1:2] > linmod.xy <- linmod(x1, y1, keep=TRUE) > # delete the saved residuals and fitted.values so plotres has to use the saved > # call etc. to get the x1 and y1 used to build the model, and rely on predict() > linmod.xy$residuals <- NULL > linmod.xy$fitted.values <- NULL > pr(linmod.xy.keep) > x1 <- trees1[, 2:1] # change column order in original x1 > pr(linmod.xy.keep, "change col order") > x1 <- trees1[1:3, 1:2] # change number of rows in original x1 > pr(linmod.xy.keep, "change nbr rows") > x1 <- trees1[nrow(tr):1, 1:2] # change row order (but keep same nbr of rows) > pr(linmod.xy.keep, "change row order") > x1 <- trees1[,1:2] > colnames(x1) <- c("x1", "x2") # change column names in original x1 > pr(linmod.xy.keep, "change colnames") > x1 <- NULL # original x1 no longer available > pr(linmod.xy.keep, "x1=NULL") > remove(x1) > pr(linmod.xy.keep, "remove(x1)") > par(org.par) > > cat("==test processing a model created in a function with local data\n") ==test processing a model created in a function with local data > > # pr <- function(model, main=deparse(substitute(model))) > # { > # plotmo(model, degree1=1, degree2=0, pt.col=2, do.par=FALSE, main=main) > # } > pr <- function(model, main=deparse(substitute(model))) + { + plotres(model, which=3, main=main) # which=3 for just the residuals plot + } > lm.form.func <- function(keep=FALSE) + { + local.tr <- trees[1:20,] + lm(Volume~., data=local.tr, model=keep) + } > linmod.form.func <- function(keep=FALSE) + { + local.tr <- trees[1:20,] + model <- linmod(Volume~., data=local.tr, keep=keep) + # delete the saved residuals and fitted.values so plotres has to use the saved + # call etc. to get the x and y used to build the model, and rely on predict() + model$residuals <- NULL + model$fitted.values <- NULL + model + } > linmod.xy.func <- function(keep) + { + xx <- trees[1:20,1:2] + yy <- trees[1:20,3] + model <- linmod(xx, yy, keep=keep) + # delete the saved residuals and fitted.values so plotres has to use the saved + # call etc. to get the x and y used to build the model, and rely on predict() + model$residuals <- NULL + model$fitted.values <- NULL + model + } > par(mfrow=c(3,2)) > > lm.form <- lm.form.func(keep=FALSE) > pr(lm.form) > > lm.form.keep <- lm.form.func(keep=TRUE) > pr(lm.form.keep) > > linmod.form <- linmod.form.func(keep=FALSE) > pr(linmod.form) > > linmod.form.keep <- linmod.form.func(keep=TRUE) > pr(linmod.form.keep) > > linmod.xy <- linmod.xy.func(keep=FALSE) > expect.err(try(pr(linmod.xy)), "cannot get the original model predictors") Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: no formula in getCall(object) (3) getCall(object)$x: object 'xx' not found Error : cannot get the original model predictors Got expected error from try(pr(linmod.xy)) > > linmod.xy.keep <- linmod.xy.func(keep=TRUE) > pr(linmod.xy.keep) > > par(org.par) > > # test xlevels (predict with newdata using a string to represent a factor) > data(iris) > linmod.Sepal.Length <- linmod(Sepal.Length~Species,data=iris) > lm.Sepal.Length <- lm(Sepal.Length~Species,data=iris) > predict.linmod <- predict(linmod.Sepal.Length, newdata=data.frame(Species="setosa")) > predict.lm <- predict(lm.Sepal.Length, newdata=data.frame(Species="setosa")) > stopifnot(all.equal(predict.linmod, predict.lm)) > > source("test.epilog.R") plotmo/inst/slowtests/test.center.bat0000755000176200001440000000154515124635472017557 0ustar liggesusers@rem test.center.bat: test plotmo's center and ndiscrete args @rem Stephen Milborrow, Berea Apr 2011 @echo test.center.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.center.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.center.Rout: @echo. @tail test.center.Rout @echo test.center.R @exit /B 1 :good1 mks.diff test.center.Rout test.center.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.center.save.ps @exit /B 1 :good2 @rem test.center.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.center.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.center.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/test.plotmo.x.bat0000755000176200001440000000152215124635472020052 0ustar liggesusers@rem test.plotmo.x.bat: test plotmo_x and related functions @echo test.plotmo.x.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.plotmo.x.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.plotmo.x.Rout: @echo. @tail test.plotmo.x.Rout @echo test.plotmo.x.R @exit /B 1 :good1 mks.diff test.plotmo.x.Rout test.plotmo.x.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.plotmo.x.save.ps @exit /B 1 :good2 @rem test.plotmo.x.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.plotmo.x.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.plotmo.x.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/test.plotmo.x.Rout.save0000644000176200001440000007232614563614021021172 0ustar liggesusers> # test.plotmo.x.R: test plotmo_x and related functions > > source("test.prolog.R") > library(plotmo) Loading required package: Formula Loading required package: plotrix > library(earth) > options(warn=1) # print warnings as they occur > data(ozone1) > data(etitanic) > get.tit <- function() + { + tit <- etitanic + pclass <- as.character(tit$pclass) + # change the order of the factors so not alphabetical + pclass[pclass == "1st"] <- "first" + pclass[pclass == "2nd"] <- "class2" + pclass[pclass == "3rd"] <- "classthird" + tit$pclass <- factor(pclass, levels=c("class2", "classthird", "first")) + # log age is so we have a continuous predictor even when model is age~. + set.seed(2015) + tit$logage <- log(tit$age) + rnorm(nrow(tit)) + tit$parch <- NULL + # by=12 gives us a small fast model with an additive and a interaction term + tit <- tit[seq(1, nrow(etitanic), by=12), ] + } > X <- X1 <- X2 <- Y <- DF <- NULL > get.data <- function() + { + X <<- matrix(c(1,2,3,4,5,6,7,8,9, + 2,3,3,5,6,7,8,9,9), ncol=2) + colnames(X) <- c("xx1", "xx2") + X1 <<- X[,1] + X2 <<- X[,2] + Y <<- c(1,2,7,4,5,6,6,6,6) + DF <<- data.frame(Y=Y, X1=X1, X2=X2) + } > stopifnot1 <- function(x, y){ + xname <- deparse(substitute(x)) + yname <- deparse(substitute(y)) + if(!all(x == y)) + stop(sprint("%s == %s failed\n", xname, yname, call.=FALSE)) + printf("%s == %s passed\n", xname, yname) + } > printf("====== standard earth.formula model with a data frame\n") ====== standard earth.formula model with a data frame > > get.data() > earth.form.df.dot <- earth(Y~., data=DF) > plotmo(earth.form.df.dot, caption="test basic use of DF") plotmo grid: X1 X2 5 6 > printf("-- test basic use of DF\n") -- test basic use of DF > rv <- plotmo(earth.form.df.dot, trace=100) plotmo trace 100: plotmo(object=earth.form.df.dot, trace=100) --get.model.env for object with class earth object call is earth(formula=Y~., data=DF) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.form.df.dot' > stopifnot1(rv, X) rv == X passed > > printf("-- test use same DF even when other variables change\n") -- test use same DF even when other variables change > get.data() > earth.form.df.dot <- earth(Y~., data=DF) > X1 <- "rubbish" > rv <- plotmo(earth.form.df.dot, trace=100) plotmo trace 100: plotmo(object=earth.form.df.dot, trace=100) --get.model.env for object with class earth object call is earth(formula=Y~., data=DF) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.form.df.dot' > stopifnot1(rv, X) rv == X passed > > printf("-- test detect that DF is now trashed\n") -- test detect that DF is now trashed > get.data() > earth.form.df.dot <- earth(Y~., data=DF) > DF <- "rubbish" > X1 <- "rubbish" # DF is corrupt and will treated as NULL by plotmo, so make sure plotmo doesn't find the global X1 > # invalid 'envir' argument of type 'character' > expect.err(try(plotmo(earth.form.df.dot, trace=100)), "cannot get the original model predictors") plotmo trace 100: plotmo(object=earth.form.df.dot, trace=100) --get.model.env for object with class earth object call is earth(formula=Y~., data=DF) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.form.df.dot' Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: variable lengths differ (found for 'X1') (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(plotmo(earth.form.df.dot, trace = 100)) > > # Removed this test because this no longer fails, because we get the formula using formula(object) > # printf("-- DF is NULL so will get '.' in formula and no 'data' argument\n") > # get.data() > # earth.form.df.dot <- earth(Y~., data=DF) > # DF <- NULL > # # '.' in formula and no 'data' argument > # expect.err(try(plotmo(earth.form.df.dot, trace=100)), "cannot get the original model predictors") > > printf("-- DF is NULL so will pick up X1 with same values from global environment\n") -- DF is NULL so will pick up X1 with same values from global environment > get.data() > earth.form.df <- earth(Y~X1+X2, data=DF) > DF <- NULL > rv <- plotmo(earth.form.df, trace=100) plotmo trace 100: plotmo(object=earth.form.df, trace=100) --get.model.env for object with class earth object call is earth(formula=Y~X1+X2, data=DF) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.form.df' > stopifnot1(rv, X) rv == X passed > > printf("-- DF is NULL so will will pick up trashed X1 from global environment\n") -- DF is NULL so will will pick up trashed X1 from global environment > earth.form.df <- earth(Y~X1+X2, data=DF) > DF <- NULL > X1 <- "rubbish" > # variable lengths differ (found for 'X1') > expect.err(try(plotmo(earth.form.df, trace=100)), "cannot get the original model predictors") plotmo trace 100: plotmo(object=earth.form.df, trace=100) --get.model.env for object with class earth object call is earth(formula=Y~X1+X2, data=DF) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.form.df' Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: variable lengths differ (found for 'X1') (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(plotmo(earth.form.df, trace = 100)) > > printf("-- DF has only one column, so will pick up X1 from it and X2 from global environment\n") -- DF has only one column, so will pick up X1 from it and X2 from global environment > get.data() > earth.form.df <- earth(Y~X1+X2, data=DF) > DF <- data.frame(Y=Y, X1=X1) > DF[1,2] <- 99 > X2[1] <- 98 > rv <- plotmo(earth.form.df, trace=100) plotmo trace 100: plotmo(object=earth.form.df, trace=100) --get.model.env for object with class earth object call is earth(formula=Y~X1+X2, data=DF) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.form.df' > stopifnot1(rv[1,1], 99) rv[1, 1] == 99 passed > stopifnot1(rv[1,2], 98) rv[1, 2] == 98 passed > > printf("-- sanity check, make sure we are back to normal\n") -- sanity check, make sure we are back to normal > get.data() > earth.form.df <- earth(Y~X1+X2, data=DF) > rv <- plotmo(earth.form.df, trace=100) plotmo trace 100: plotmo(object=earth.form.df, trace=100) --get.model.env for object with class earth object call is earth(formula=Y~X1+X2, data=DF) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.form.df' > stopifnot1(rv, X) rv == X passed > > printf("-- change the data frame, make sure we pick up the changed value\n") -- change the data frame, make sure we pick up the changed value > get.data() > earth.form.df <- earth(Y~X1+X2, data=DF) > DF[1,2] <- 99 > rv <- plotmo(earth.form.df, trace=100) plotmo trace 100: plotmo(object=earth.form.df, trace=100) --get.model.env for object with class earth object call is earth(formula=Y~X1+X2, data=DF) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.form.df' > stopifnot1(rv[1,1], 99) rv[1, 1] == 99 passed > > printf("-- change order of columns in the data frame, should be ok\n") -- change order of columns in the data frame, should be ok > get.data() > earth.form.df <- earth(Y~X1+X2, data=DF) > DF <- data.frame(X2=X2, X1=X1) > rv <- plotmo(earth.form.df, trace=100) plotmo trace 100: plotmo(object=earth.form.df, trace=100) --get.model.env for object with class earth object call is earth(formula=Y~X1+X2, data=DF) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.form.df' > stopifnot1(rv, X) rv == X passed > > printf("======= standard earth.formula model with a data frame and keepxy\n") ======= standard earth.formula model with a data frame and keepxy > > get.data() > earth.form.df.keepxy <- earth(Y~., data=DF, keepxy=TRUE) > printf("-- test basic use of DF\n") -- test basic use of DF > rv <- plotmo(earth.form.df.keepxy, trace=100) plotmo trace 100: plotmo(object=earth.form.df.keepxy, trace=100) --get.model.env for object with class earth object call is earth(formula=Y~., data=DF, keepxy=TRUE) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.form.df.keepxy' > stopifnot1(rv, X) rv == X passed > > printf("-- test use same DF even when other variables change\n") -- test use same DF even when other variables change > earth.form.df.keepxy <- earth(Y~., data=DF, keepxy=TRUE) > X1 <- "rubbish" > rv <- plotmo(earth.form.df.keepxy, trace=100) plotmo trace 100: plotmo(object=earth.form.df.keepxy, trace=100) --get.model.env for object with class earth object call is earth(formula=Y~., data=DF, keepxy=TRUE) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.form.df.keepxy' > stopifnot1(rv, X) rv == X passed > > printf("-- DF is now trashed but it doesn't matter because keepxy=T\n") -- DF is now trashed but it doesn't matter because keepxy=T > DF <- "rubbish" > rv <- plotmo(earth.form.df.keepxy, trace=100) plotmo trace 100: plotmo(object=earth.form.df.keepxy, trace=100) --get.model.env for object with class earth object call is earth(formula=Y~., data=DF, keepxy=TRUE) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.form.df.keepxy' > stopifnot1(rv, X) rv == X passed > > printf("-- DF is NULL but it doesn't matter because keepxy=T\n") -- DF is NULL but it doesn't matter because keepxy=T > get.data() > earth.form.df.keepxy <- earth(Y~., data=DF, keepxy=TRUE) > DF <- NULL > rv <- plotmo(earth.form.df.keepxy, trace=100) plotmo trace 100: plotmo(object=earth.form.df.keepxy, trace=100) --get.model.env for object with class earth object call is earth(formula=Y~., data=DF, keepxy=TRUE) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.form.df.keepxy' > stopifnot1(rv, X) rv == X passed > > printf("-- DF and X1 are NULL but it doesn't matter because keepxy=T\n") -- DF and X1 are NULL but it doesn't matter because keepxy=T > DF <- NULL > X1 <- "rubbish" > rv <- plotmo(earth.form.df.keepxy, trace=100) plotmo trace 100: plotmo(object=earth.form.df.keepxy, trace=100) --get.model.env for object with class earth object call is earth(formula=Y~., data=DF, keepxy=TRUE) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.form.df.keepxy' > stopifnot1(rv, X) rv == X passed > > printf("-- sanity check, make sure we are back to normal\n") -- sanity check, make sure we are back to normal > get.data() > earth.form.df.keepxy <- earth(Y~., data=DF, keepxy=TRUE) > rv <- plotmo(earth.form.df.keepxy, trace=100) plotmo trace 100: plotmo(object=earth.form.df.keepxy, trace=100) --get.model.env for object with class earth object call is earth(formula=Y~., data=DF, keepxy=TRUE) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.form.df.keepxy' > stopifnot1(rv, X) rv == X passed > > printf("-- change the data frame, but it doesn't matter because keepxy=T\n") -- change the data frame, but it doesn't matter because keepxy=T > get.data() > earth.form.df.keepxy <- earth(Y~., data=DF, keepxy=TRUE) > DF[1,2] <- 99 > rv <- plotmo(earth.form.df.keepxy, trace=100) plotmo trace 100: plotmo(object=earth.form.df.keepxy, trace=100) --get.model.env for object with class earth object call is earth(formula=Y~., data=DF, keepxy=TRUE) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.form.df.keepxy' > stopifnot1(rv, X) rv == X passed > > printf("-- change order of columns in the data frame, should be ok\n") -- change order of columns in the data frame, should be ok > get.data() > earth.form.df.keepxy <- earth(Y~., data=DF, keepxy=TRUE) > DF <- data.frame(X2=X2, X1=X1) > rv <- plotmo(earth.form.df.keepxy, trace=100) plotmo trace 100: plotmo(object=earth.form.df.keepxy, trace=100) --get.model.env for object with class earth object call is earth(formula=Y~., data=DF, keepxy=TRUE) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.form.df.keepxy' > stopifnot1(rv, X) rv == X passed > > printf("======= standard lm model with a data frame but with model=FALSE\n") ======= standard lm model with a data frame but with model=FALSE > > get.data() > lm.form.df.model.false.with.dot <- lm(Y~., data=DF, model=FALSE) > printf("-- test basic use of DF\n") -- test basic use of DF > rv <- plotmo(lm.form.df.model.false.with.dot, trace=100) plotmo trace 100: plotmo(object=lm.form.df.model.false.with.dot, trace=100) --get.model.env for object with class lm object call is lm(formula=Y~., data=DF, model=FALSE) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'lm.form.df.model.false.with.dot' > stopifnot1(rv, X) rv == X passed > > printf("-- test use same DF even when other variables change\n") -- test use same DF even when other variables change > get.data() > lm.form.df.model.false.with.dot <- lm(Y~., data=DF, model=FALSE) > X1 <- "rubbish" > rv <- plotmo(lm.form.df.model.false.with.dot, trace=100) plotmo trace 100: plotmo(object=lm.form.df.model.false.with.dot, trace=100) --get.model.env for object with class lm object call is lm(formula=Y~., data=DF, model=FALSE) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'lm.form.df.model.false.with.dot' > stopifnot1(rv, X) rv == X passed > > printf("-- test detect that DF is now trashed\n") -- test detect that DF is now trashed > DF <- "rubbish" > # invalid 'envir' argument of type 'character' > expect.err(try(plotmo(lm.form.df.model.false.with.dot, trace=100)), "cannot get the original model predictors") plotmo trace 100: plotmo(object=lm.form.df.model.false.with.dot, trace=100) --get.model.env for object with class lm object call is lm(formula=Y~., data=DF, model=FALSE) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'lm.form.df.model.false.with.dot' Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: variable lengths differ (found for 'X1') (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(plotmo(lm.form.df.model.false.with.dot, trace = 100)) > > printf("-- DF is NULL so will pick up X1 with same values from global environment\n") -- DF is NULL so will pick up X1 with same values from global environment > get.data() > lm.form.df.model.false <- lm(Y~X1+X2, data=DF, model=FALSE) > DF <- NULL > rv <- plotmo(earth.form.df, trace=100) plotmo trace 100: plotmo(object=earth.form.df, trace=100) --get.model.env for object with class earth object call is earth(formula=Y~X1+X2, data=DF) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.form.df' > stopifnot1(rv, X) rv == X passed > > printf("-- DF is NULL so will will pick up trashed X1 from global environment\n") -- DF is NULL so will will pick up trashed X1 from global environment > get.data() > lm.form.df.model.false <- lm(Y~X1+X2, data=DF, model=FALSE) > DF <- NULL > X1 <- "rubbish" > # variable lengths differ (found for 'X1') > expect.err(try(plotmo(lm.form.df.model.false, trace=100)), "cannot get the original model predictors") plotmo trace 100: plotmo(object=lm.form.df.model.false, trace=100) --get.model.env for object with class lm object call is lm(formula=Y~X1+X2, data=DF, model=FALSE) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'lm.form.df.model.false' Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: variable lengths differ (found for 'X1') (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(plotmo(lm.form.df.model.false, trace = 100)) > > printf("-- sanity check, make sure we are back to normal\n") -- sanity check, make sure we are back to normal > get.data() > lm.form.df.model.false <- lm(Y~X1+X2, data=DF, model=FALSE) > rv <- plotmo(lm.form.df.model.false, trace=100) plotmo trace 100: plotmo(object=lm.form.df.model.false, trace=100) --get.model.env for object with class lm object call is lm(formula=Y~X1+X2, data=DF, model=FALSE) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'lm.form.df.model.false' > stopifnot1(rv, X) rv == X passed > > printf("-- change the data frame, make sure we pick up the changed value\n") -- change the data frame, make sure we pick up the changed value > get.data() > lm.form.df.model.false <- lm(Y~X1+X2, data=DF, model=FALSE) > DF[1,2] <- 99 > rv <- plotmo(lm.form.df.model.false, trace=100) plotmo trace 100: plotmo(object=lm.form.df.model.false, trace=100) --get.model.env for object with class lm object call is lm(formula=Y~X1+X2, data=DF, model=FALSE) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'lm.form.df.model.false' > stopifnot1(rv[1,1], 99) rv[1, 1] == 99 passed > > printf("-- change order of columns in the data frame, should be ok\n") -- change order of columns in the data frame, should be ok > get.data() > lm.form.df.model.false <- lm(Y~X1+X2, data=DF, model=FALSE) > DF <- data.frame(X2=X2, X1=X1) > rv <- plotmo(lm.form.df.model.false, trace=100) plotmo trace 100: plotmo(object=lm.form.df.model.false, trace=100) --get.model.env for object with class lm object call is lm(formula=Y~X1+X2, data=DF, model=FALSE) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'lm.form.df.model.false' > stopifnot1(rv, X) rv == X passed > > printf("======= standard lm with a data frame and model=TRUE (the default)\n") ======= standard lm with a data frame and model=TRUE (the default) > > get.data() > lm.form.df.with.dot <- lm(Y~., data=DF) > printf("-- test basic use of DF\n") -- test basic use of DF > rv <- plotmo(lm.form.df.with.dot, trace=100) plotmo trace 100: plotmo(object=lm.form.df.with.dot, trace=100) --get.model.env for object with class lm object call is lm(formula=Y~., data=DF) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'lm.form.df.with.dot' > stopifnot1(rv, X) rv == X passed > > printf("-- test use same DF even when other variables change\n") -- test use same DF even when other variables change > get.data() > lm.form.df.with.dot <- lm(Y~., data=DF) > X1 <- "rubbish" > rv <- plotmo(lm.form.df.with.dot, trace=100) plotmo trace 100: plotmo(object=lm.form.df.with.dot, trace=100) --get.model.env for object with class lm object call is lm(formula=Y~., data=DF) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'lm.form.df.with.dot' > stopifnot1(rv, X) rv == X passed > > printf("-- DF is now trashed but it doesn't matter because keepxy=T\n") -- DF is now trashed but it doesn't matter because keepxy=T > DF <- "rubbish" > rv <- plotmo(lm.form.df.with.dot, trace=100) plotmo trace 100: plotmo(object=lm.form.df.with.dot, trace=100) --get.model.env for object with class lm object call is lm(formula=Y~., data=DF) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'lm.form.df.with.dot' > stopifnot1(rv, X) rv == X passed > > printf("-- DF is NULL but it doesn't matter because keepxy=T\n") -- DF is NULL but it doesn't matter because keepxy=T > get.data() > lm.form.df.with.dot <- lm(Y~., data=DF) > DF <- NULL > rv <- plotmo(lm.form.df.with.dot, trace=100) plotmo trace 100: plotmo(object=lm.form.df.with.dot, trace=100) --get.model.env for object with class lm object call is lm(formula=Y~., data=DF) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'lm.form.df.with.dot' > stopifnot1(rv, X) rv == X passed > > printf("-- DF and X1 are NULL but it doesn't matter because keepxy=T\n") -- DF and X1 are NULL but it doesn't matter because keepxy=T > DF <- NULL > X1 <- "rubbish" > rv <- plotmo(lm.form.df.with.dot, trace=100) plotmo trace 100: plotmo(object=lm.form.df.with.dot, trace=100) --get.model.env for object with class lm object call is lm(formula=Y~., data=DF) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'lm.form.df.with.dot' > stopifnot1(rv, X) rv == X passed > > printf("-- sanity check, make sure we are back to normal\n") -- sanity check, make sure we are back to normal > get.data() > lm.form.df.with.dot <- lm(Y~., data=DF) > rv <- plotmo(lm.form.df.with.dot, trace=100) plotmo trace 100: plotmo(object=lm.form.df.with.dot, trace=100) --get.model.env for object with class lm object call is lm(formula=Y~., data=DF) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'lm.form.df.with.dot' > stopifnot1(rv, X) rv == X passed > > printf("-- change the data frame, but it doesn't matter because keepxy=T\n") -- change the data frame, but it doesn't matter because keepxy=T > get.data() > lm.form.df.with.dot <- lm(Y~., data=DF) > DF[1,2] <- 99 > rv <- plotmo(lm.form.df.with.dot, trace=100) plotmo trace 100: plotmo(object=lm.form.df.with.dot, trace=100) --get.model.env for object with class lm object call is lm(formula=Y~., data=DF) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'lm.form.df.with.dot' > stopifnot1(rv, X) rv == X passed > > printf("-- change order of columns in the data frame, should be ok\n") -- change order of columns in the data frame, should be ok > get.data() > lm.form.df.with.dot <- lm(Y~., data=DF) > DF <- data.frame(X2=X2, X1=X1) > rv <- plotmo(lm.form.df.with.dot, trace=100) plotmo trace 100: plotmo(object=lm.form.df.with.dot, trace=100) --get.model.env for object with class lm object call is lm(formula=Y~., data=DF) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'lm.form.df.with.dot' > stopifnot1(rv, X) rv == X passed > > printf("======= standard lm with a data frame and model=FALSE but x=TRUE\n") ======= standard lm with a data frame and model=FALSE but x=TRUE > > get.data() > lm.form.df.model.false.x.true <- lm(Y~., data=DF, model=FALSE, x=TRUE) > printf("-- test basic use of DF\n") -- test basic use of DF > rv <- plotmo(lm.form.df.model.false.x.true, trace=100) plotmo trace 100: plotmo(object=lm.form.df.model.false.x.true, trace=100) --get.model.env for object with class lm object call is lm(formula=Y~., data=DF, model=FALSE, x=TRUE) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'lm.form.df.model.false.x.true' > stopifnot1(rv, X) rv == X passed > > printf("-- test DF not available (shouldn't matter)\n") -- test DF not available (shouldn't matter) > DF <- "rubbish" > rv <- plotmo(lm.form.df.model.false.x.true, trace=100) plotmo trace 100: plotmo(object=lm.form.df.model.false.x.true, trace=100) --get.model.env for object with class lm object call is lm(formula=Y~., data=DF, model=FALSE, x=TRUE) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'lm.form.df.model.false.x.true' > stopifnot1(rv, X) rv == X passed > > printf("-- test $x trashed causes failure\n") -- test $x trashed causes failure > get.data() > lm.form.df.model.false.x.true <- lm(Y~., data=DF, model=FALSE, x=TRUE) > DF <- "rubbish" > X2 <- "rubbish1" > lm.form.df.model.false.x.true[["x"]] <- "nonesuch" > expect.err(try(plotmo(lm.form.df.model.false.x.true, trace=100)), "cannot get the original model predictors") plotmo trace 100: plotmo(object=lm.form.df.model.false.x.true, trace=100) --get.model.env for object with class lm object call is lm(formula=Y~., data=DF, model=FALSE, x=TRUE) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'lm.form.df.model.false.x.true' Warning: object$x may be corrupt Looked unsuccessfully for the original predictors in the following places: (1) object$x: nonesuch (2) model.frame: variable lengths differ (found for 'X2') (3) getCall(object)$x: less than three rows Error : cannot get the original model predictors Got expected error from try(plotmo(lm.form.df.model.false.x.true, trace = 100)) > > printf("-- test ok with $x trashed but DF ok\n") # although with trace!=100 will get downstream failures in predict.lm, that's ok -- test ok with $x trashed but DF ok > get.data() > lm.form.df.model.false.x.true[["x"]] <- "nonesuch" > # Warning: object$x may be corrupt > rv <- plotmo(lm.form.df.model.false.x.true, trace=100) plotmo trace 100: plotmo(object=lm.form.df.model.false.x.true, trace=100) --get.model.env for object with class lm object call is lm(formula=Y~., data=DF, model=FALSE, x=TRUE) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'lm.form.df.model.false.x.true' Warning: object$x may be corrupt > stopifnot1(rv, X) rv == X passed > > printf("-- test \"warning: object$x may be corrupt\", same as above but set options(warn=2)\n") -- test "warning: object$x may be corrupt", same as above but set options(warn=2) > options(warn=2) > get.data() > lm.form.df.model.false.x.true[["x"]] <- "nonesuch" > # Warning: object$x may be corrupt > expect.err(try(plotmo(lm.form.df.model.false.x.true, trace=100)), "x may be corrupt") plotmo trace 100: plotmo(object=lm.form.df.model.false.x.true, trace=100) --get.model.env for object with class lm object call is lm(formula=Y~., data=DF, model=FALSE, x=TRUE) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'lm.form.df.model.false.x.true' Error : (converted from warning) object$x may be corrupt Got expected error from try(plotmo(lm.form.df.model.false.x.true, trace = 100)) > options(warn=1) > stopifnot1(rv, X) rv == X passed > > printf("====== strings in the data.frame\n") ====== strings in the data.frame > > tit1 <- get.tit() > > tit1$char.pclass <- as.character(tit1$pclass) > > earth.survived.vs.pclass <- earth(survived~pclass, data=tit1, linpreds=TRUE) > x.earth.survived.vs.pclass <- plotmo(earth.survived.vs.pclass, trace=100, linpreds=TRUE) plotmo trace 100: plotmo(object=earth.survived.vs.pclass, trace=100, linpreds=TRUE) --get.model.env for object with class earth object call is earth(formula=survived~pclass, data=tit1, linpreds=TRUE) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.survived.vs.pclass' > stopifnot(is.factor(x.earth.survived.vs.pclass[[1]])) > > earth.survived.vs.char.pclass <- earth(survived~char.pclass, data=tit1) > x.earth.survived.vs.char.pclass <- plotmo(earth.survived.vs.char.pclass, trace=100) plotmo trace 100: plotmo(object=earth.survived.vs.char.pclass, trace=100) --get.model.env for object with class earth object call is earth(formula=survived~char.pclass, data=tit1) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'earth.survived.vs.char.pclass' > stopifnot(is.factor(x.earth.survived.vs.char.pclass[[1]])) > > stopifnot(x.earth.survived.vs.pclass == x.earth.survived.vs.char.pclass) > > lm.survived.vs.pclass <- earth(survived~pclass, data=tit1, linpreds=TRUE) > x.lm.survived.vs.pclass <- plotmo(lm.survived.vs.pclass, trace=100, linpreds=TRUE) plotmo trace 100: plotmo(object=lm.survived.vs.pclass, trace=100, linpreds=TRUE) --get.model.env for object with class earth object call is earth(formula=survived~pclass, data=tit1, linpreds=TRUE) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'lm.survived.vs.pclass' > stopifnot(is.factor(x.lm.survived.vs.pclass[[1]])) > > lm.survived.vs.char.pclass <- earth(survived~char.pclass, data=tit1) > x.lm.survived.vs.char.pclass <- plotmo(lm.survived.vs.char.pclass, trace=100) plotmo trace 100: plotmo(object=lm.survived.vs.char.pclass, trace=100) --get.model.env for object with class earth object call is earth(formula=survived~char.pclass, data=tit1) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'lm.survived.vs.char.pclass' > stopifnot(is.factor(x.lm.survived.vs.char.pclass[[1]])) > > stopifnot(x.lm.survived.vs.pclass == x.lm.survived.vs.char.pclass) > > stopifnot(x.lm.survived.vs.pclass == x.earth.survived.vs.pclass) > > printf("-- test.plotmo.x done\n") -- test.plotmo.x done > > source("test.epilog.R") plotmo/inst/slowtests/test.plotmo.args.R0000644000176200001440000001131513737415772020177 0ustar liggesusers# test.plotmo.args..R: test dot and other argument handling in plotmo source("test.prolog.R") library(earth) data(ozone1) options(warn=1) # print warnings as they occur options(warn=2) # treat warnings as errors lm.mod <- lm(O3~wind, data=ozone1) expect.err(try(plotmo(lm.mod, se=2, leve=.95)), "plotmo's 'se' argument is deprecated, please use 'level' instead") expect.err(try(plotmo(lm.mod, se=T)), "plotmo's 'se' argument is deprecated, please use 'level=.95' instead") expect.err(try(plotmo(lm.mod, se=.8)), "plotmo's 'se' argument is deprecated, please use 'level=.95' instead") expect.err(try(plotmo(lm.mod, level=2)), "level=2 is out of range, try level=.95") oz2 <- ozone1[1:40,] set.seed(2015) a <- earth(O3~temp+wind, dat=oz2, deg=2, nk=21, ncr=3, nfo=3, varmod.me="lm") expect.err(try(plotmo(a, lw=2, trace=1, thresh=.9, SHOWCALL=TRUE)), "predict.earth ignored argument 'lw'") options(warn=1) # test col.response and friends plotmo(a, col.response=2, pch.response=c(1, 2, 20), type2="co", SHOWCALL=TRUE) # pch.response tests back compat plotmo(a, pt.col=c(1,2,3), pt.pch=c(1, 2, 20), type2="im", SHOWCALL=TRUE) plotmo(a, pt.col=c(1,2,3), pt.pch=paste(1:nrow(oz2)), pt.cex=.8, type2="im", do.par=2, SHOWCALL=TRUE) plotmo(a, pt.col=c(1,2,3), pt.pch=paste(1:nrow(oz2)), pt.cex=.8, type2="co", degree1=0, do.par=F) par(org.par) plotmo(a, col=2, SHOWCALL=TRUE) # will cause red response points plotmo(a, pt.col=4, col=3, persp.col="pink", SHOWCALL=TRUE) # col now goes to lines # test cex and nrug and smooth plotmo(a, cex=.8, SHOWCALL=TRUE, nrug=-1, rug.col=2, rug.lwd=1, smooth.col=3, bty="n", col.lab="darkorange", xlab="an x label", cex.lab=1.2) # esoteric, but they work plotmo(a, SHOWCALL=TRUE, density.col=2, density.lty=2, smooth.col=3, smooth.f=.3, col="lightblue") plotmo(a, cex=1.2, SHOWCALL=TRUE, nrug="density") # test caption, grid, interval options plotmo(a, caption.col=3, caption.font=2, grid.col="pink", level=.8, SHOWCALL=TRUE) plotmo(a, caption.col=2, caption.font=2, caption.cex=.8, grid.col=TRUE, bty="n", level=.8, level.shade="lightblue", level.shade2="red", grid.lty=3, grid.lwd=4, grid.nx=NA, SHOWCALL=TRUE) # test overall plot args handled by par() and graphics args outside do.par par(mfrow=c(2,2), mar = c(3,3,3,1), mgp = c(1.5,.5,0), oma=c(0,0,4,0)) par(col.main="#456789") old.mar <- par("mar") old.mfcol <- par("mfcol") cat("before par: cex=", par("cex"), " col.main=", par("col.main"), " col.axis=", par("col.axis"), " mar=", par("mar"), " mfcol=", par("mfcol"), "\n", sep="") plotmo(a, mfcol=c(2,3), cex.main=1.4, oma=c(5,5,5,5), SHOWCALL=TRUE) plotmo(a, caption="no cex") plotmo(a, cex=1, caption="cex=1, plot should be identical to previous page") plotmo(a, cex=1.2, caption="cex=1.2") plotmo(a, do.par=FALSE, degree2=0, degree1=1, main="do.par=FALSE no cex", caption="a test graphics args with do.par=FALSE") plotmo(a, do.par=FALSE, degree2=0, degree1=1, cex=1, main="do.par=FALSE cex=1") plotmo(a, do.par=FALSE, degree2=0, degree1=1, cex=.8, main="do.par=FALSE cex=.8") plotmo(a, do.par=FALSE, degree2=0, degree1=1, cex=1.1, xlab="xlab", col.main=2, col.axis="blue", col.lab=3, font.lab=2, main="do.par=FALSE cex=1.1, col.main=2\ncol.axis=\"blue\", col.lab=3, font.lab=2") plotmo(a, do.par=FALSE, degree1=1, degree2=1, persp.ticktype="d", main="do.par=FALSE persp.ticktype=\"d\"") # all of these should have been restored cat("after par: cex=", par("cex"), " col.main=", par("col.main"), " col.axis=", par("col.axis"), " mar=", par("mar"), " mfcol=", par("mfcol"), "\n", sep="") stopifnot(par("col.main") == "#456789") stopifnot(par("mar") == old.mar) stopifnot(par("mfcol") == old.mfcol) par(col.main=1) # test aliasing of col with other args, and back compat of col.degree1 vs degree1.col data(etitanic) a20 <- earth(pclass ~ ., data=etitanic, degree=2) plotmo(a20, nresponse=1, col=2, col.degree1=3, persp.col="pink", SHOWCALL=1, degree1=1:2, degree2=1:2) plotmo(a20, nresponse=1, lty=2, persp.lty=1, SHOWCALL=1, degree1=1:2, degree2=1:2) # test "prednames." with a long predictor name data(trees) trees.with.long.predname <- trees trees.with.long.predname$a_quite_long_variable_name <- trees.with.long.predname$Girth trees.with.long.predname$Girth <- NULL mod <- earth(Volume~.,data=trees.with.long.predname) par(mfrow=c(3,2), mar = c(3,3,3,1), mgp = c(1.5,.5,0), oma=c(0,0,4,0)) plotmo(mod, do.par=FALSE) plotmo(mod, do.par=FALSE, prednames.abbreviate=FALSE) expect.err(try(plotmo(mod, do.par=FALSE, prednames.abbreviate=c(1,2))), "the prednames.abbreviate argument is not FALSE, TRUE, 0, or 1") plotmo(mod, do.par=FALSE, prednames.minlength=3) source("test.epilog.R") plotmo/inst/slowtests/test.non.earth.Rout.save0000644000176200001440000021234315126312366021304 0ustar liggesusers> # test.non.earth.R: test plotmo on non-earth models > # Stephen Milborrow, Basley KwaZulu-Natal Mar 2011 > > source("test.prolog.R") > library(plotmo) Loading required package: Formula Loading required package: plotrix > library(earth) > data(ozone1) > data(etitanic) > dopar <- function(nrows, ncols, caption = "") + { + cat(" ", caption, "\n") + par(mfrow=c(nrows, ncols)) + par(oma = c(0, 0, 3, 0)) + par(mar = c(3, 3, 1.7, 0.5)) + par(mgp = c(1.6, 0.6, 0)) + par(cex = 0.7) + } > caption <- "test lm(log(doy) ~ vh+wind+humidity+temp+log(ibh), data=ozone1)" > dopar(4,5,caption) test lm(log(doy) ~ vh+wind+humidity+temp+log(ibh), data=ozone1) > a <- lm(log(doy) ~ vh + wind + humidity + temp + log(ibh), data=ozone1) > set.seed(2020) > plotmo(a, do.par=FALSE, caption=caption, ylim=NA, col.response=3, pt.pch=20, smooth.col="indianred", + trace=2) plotmo trace 2: plotmo(object=a, smooth.col="indianred", do.par=FALSE, ylim=NA, caption=caption, trace=2, col.response=3, pt.pch=20) --get.model.env for object with class lm object call is lm(formula=log(doy)~vh+wind+humidity+temp+log(ibh), data=ozone1) using the environment saved in $terms of the lm model: R_GlobalEnv --plotmo_prolog for lm object 'a' --plotmo_x for lm object get.object.x: object$x is NULL (and it has no colnames) object call is lm(formula=log(doy)~vh+wind+humidity+temp+log(ibh), data=ozone1) get.x.from.model.frame: formula(object) is log(doy) ~ vh + wind + humidity + temp + log(ibh) naked formula is log(doy) ~ vh + wind + humidity + temp + ibh formula is valid, now looking for data for the model.frame object$model is usable and has column names log(doy) vh wind humidity temp log(ibh) object$model cannot be used because it has non-naked column names "log(doy)" "log(ibh)" object$data is NULL (and it has no colnames) argument 2 of the call is 'data' eval(call$data, R_GlobalEnv) call$data is usable and has column names O3 vh wind humidity temp ibh dpg ibt vis doy na.action(object) is "na.fail" stats::model.frame(log(doy) ~ vh + wind + humidity + tem..., data=call$data, na.action="na.fail") x=model.frame[,-1] is usable and has column names vh wind humidity temp ibh plotmo_x returned[330,5]: vh wind humidity temp ibh 1 5710 4 28 40 2693 2 5700 3 37 45 590 3 5760 3 51 54 1450 ... 5720 4 69 35 1568 330 5550 4 85 39 5000 ----Metadata: plotmo_predict with nresponse=NULL and newdata=NULL calling predict.lm with NULL newdata stats::predict(lm.object, NULL, type="response") predict returned[330,1] with no column names: 1 4.869230 2 4.711557 3 5.135810 ... 4.906652 330 5.044131 predict after processing with nresponse=NULL is [330,1] with no column names: 1 4.869230 2 4.711557 3 5.135810 ... 4.906652 330 5.044131 ----Metadata: plotmo_fitted with nresponse=NULL stats::fitted(object=lm.object) fitted(object) returned[330,1] with no column names: 1 4.869230 2 4.711557 3 5.135810 ... 4.906652 330 5.044131 fitted(object) after processing with nresponse=NULL is [330,1] with no column names: 1 4.869230 2 4.711557 3 5.135810 ... 4.906652 330 5.044131 ----Metadata: plotmo_y with nresponse=NULL --plotmo_y with nresponse=NULL for lm object get.object.y: object$y is NULL (and it has no colnames) object call is lm(formula=log(doy)~vh+wind+humidity+temp+log(ibh), data=ozone1) get.y.from.model.frame: formula(object) is log(doy) ~ vh + wind + humidity + temp + log(ibh) formula is valid, now looking for data for the model.frame object$model is usable and has column names log(doy) vh wind humidity temp log(ibh) object$model cannot be used because it has non-naked column names "log(doy)" "log(ibh)" object$data is NULL (and it has no colnames) argument 2 of the call is 'data' eval(call$data, R_GlobalEnv) call$data is usable and has column names O3 vh wind humidity temp ibh dpg ibt vis doy na.action(object) is "na.fail" stats::model.frame(log(doy) ~ vh + wind + humidity + tem..., data=call$data, na.action="na.fail") y=model.frame[,1] is usable and has column name log(doy) plotmo_y returned[330,1]: log(doy) 1 3.496508 2 3.526361 3 3.555348 ... 3.583519 330 5.966147 plotmo_y after processing with nresponse=NULL is [330,1]: log(doy) 1 3.496508 2 3.526361 3 3.555348 ... 3.583519 330 5.966147 converted nresponse=NA to nresponse=1 nresponse=1 (was NA) ncol(fitted) 1 ncol(predict) 1 ncol(y) 1 ----Metadata: plotmo_y with nresponse=1 --plotmo_y with nresponse=1 for lm object get.object.y: object$y is NULL (and it has no colnames) object call is lm(formula=log(doy)~vh+wind+humidity+temp+log(ibh), data=ozone1) get.y.from.model.frame: formula(object) is log(doy) ~ vh + wind + humidity + temp + log(ibh) formula is valid, now looking for data for the model.frame object$model is usable and has column names log(doy) vh wind humidity temp log(ibh) object$model cannot be used because it has non-naked column names "log(doy)" "log(ibh)" object$data is NULL (and it has no colnames) argument 2 of the call is 'data' eval(call$data, R_GlobalEnv) call$data is usable and has column names O3 vh wind humidity temp ibh dpg ibt vis doy na.action(object) is "na.fail" stats::model.frame(log(doy) ~ vh + wind + humidity + tem..., data=call$data, na.action="na.fail") y=model.frame[,1] is usable and has column name log(doy) got model response from model.frame(log(doy) ~ vh + wind + humidity + tem..., data=call$data, na.action="na.fail") plotmo_y returned[330,1]: log(doy) 1 3.496508 2 3.526361 3 3.555348 ... 3.583519 330 5.966147 plotmo_y after processing with nresponse=1 is [330,1]: log(doy) 1 3.496508 2 3.526361 3 3.555348 ... 3.583519 330 5.966147 got response name "log(doy)" from yfull resp.levs is NULL ----Metadata: done number of x values: vh 53 wind 11 humidity 65 temp 63 ibh 196 ----plotmo_singles for lm object singles: 1 vh, 2 wind, 3 humidity, 4 temp, 5 ibh ----plotmo_pairs for lm object formula(object) returned log(doy) ~ vh + wind + humidity + temp + log(ibh) formula.vars "vh" "wind" "humidity" "temp" "log(ibh)" term.labels "vh" "wind" "humidity" "temp" "log(ibh)" plotmo_pairs_from_term_labels term.labels: "vh" "wind" "humidity" "temp" "log(ibh)" "vh" "wind" "humidity" "temp" "log(ibh)" pred.names: "vh" "wind" "humidity" "temp" "ibh" considering vh considering wind considering humidity considering temp considering log(ibh) considering vh considering wind considering humidity considering temp considering log(ibh) no pairs ----Figuring out ylim ylim c(NA, NA) clip TRUE --plot.degree1(draw.plot=TRUE) plotmo grid: vh wind humidity temp ibh 5760 5 64 62 2112.5 degree1 plot1 (pmethod "plotmo") variable vh newdata[50,5]: vh wind humidity temp ibh 1 5320.000 5 64 62 2112.5 2 5332.857 5 64 62 2112.5 3 5345.714 5 64 62 2112.5 ... 5358.571 5 64 62 2112.5 50 5950.000 5 64 62 2112.5 stats::predict(lm.object, data.frame[50,5], type="response") predict returned[50,1] with no column names: 1 4.684507 2 4.700786 3 4.717064 ... 4.733343 50 5.482156 predict after processing with nresponse=1 is [50,1]: predict 1 4.684507 2 4.700786 3 4.717064 ... 4.733343 50 5.482156 graphics::plot.default(x=c(5320,5333,534...), y=c(4.685,4.701,4...), type="n", main="1 vh", xlab="", ylab="", xaxt="s", yaxt="s", xlim=c(5320,5951), ylim=NULL) Reducing trace level for subsequent degree1 plots degree1 plot2 (pmethod "plotmo") variable wind degree1 plot3 (pmethod "plotmo") variable humidity degree1 plot4 (pmethod "plotmo") variable temp degree1 plot5 (pmethod "plotmo") variable ibh > termplot(a) > par(org.par) > > caption <- "test lm(log(doy) ~ vh+wind+humidity+I(wind*humidity)+temp+log(ibh), data=ozone1)" > dopar(4,5,caption) test lm(log(doy) ~ vh+wind+humidity+I(wind*humidity)+temp+log(ibh), data=ozone1) > a <- lm(log(doy) ~ vh + wind + humidity + temp + log(ibh), data=ozone1) > set.seed(2020) > plotmo(a, do.par=FALSE, caption=caption, ylim=NA, col.resp=3, pt.pch=20, clip=FALSE, smooth.col="indianred") plotmo grid: vh wind humidity temp ibh 5760 5 64 62 2112.5 > termplot(a) > par(org.par) > > caption <- "test lm(doy ~ (vh+wind+humidity)^2, data=ozone1)" > dopar(4,3,caption) test lm(doy ~ (vh+wind+humidity)^2, data=ozone1) > a <- lm(doy ~ (vh+wind+humidity)^2, data=ozone1) > plotmo(a, do.par=FALSE, caption=caption, ylim=NULL) plotmo grid: vh wind humidity 5760 5 64 > # termplot(a) # termplot fails with Error in `[.data.frame`(mf, , i): undefined columns selected > par(org.par) > > caption <- "test lm(doy^2 ~ vh+wind+humidity+I(wind*humidity)+temp+log(ibh), data=ozone1)" > dopar(4,3,caption) test lm(doy^2 ~ vh+wind+humidity+I(wind*humidity)+temp+log(ibh), data=ozone1) > a <- lm(doy^2 ~ vh+wind+humidity+I(wind*humidity)+temp+log(ibh), data=ozone1) > plotmo(a, do.par=FALSE, caption=caption, ylim=NULL) plotmo grid: vh wind humidity temp ibh 5760 5 64 62 2112.5 > termplot(a) # termplot draws a funky second wind plot > par(org.par) > > caption <- "test lm with data=ozone versus attach(ozone)" > dopar(4,3,caption) test lm with data=ozone versus attach(ozone) > a <- lm(log(doy) ~ I(vh*wind) + wind + I(humidity*temp) + log(ibh), data=ozone1) > plotmo(a, do.par=FALSE, caption=caption, degree1=c(1,2,4,5)) plotmo grid: vh wind humidity temp ibh 5760 5 64 62 2112.5 > attach(ozone1) > a <- lm(log(doy) ~ I(vh*wind) + wind + I(humidity*temp) + log(ibh)) > plotmo(a, do.par=FALSE, degree1=c(1,2,4,5)) plotmo grid: vh wind humidity temp ibh 5760 5 64 62 2112.5 > detach(ozone1) > par(org.par) > > # commented out because "$" in names is not yet supported > # a <- lm(log(ozone1$doy) ~ I(ozone1$vh*ozone1$wind) + log(ozone1$ibh)) > # plotmo(a) > > set.seed(1) > caption <- "test lm and glm a900..a902: damage~temp family=binomial data=orings" > dopar(2,3,caption) test lm and glm a900..a902: damage~temp family=binomial data=orings > library(faraway) > data(orings) > a900 <- lm(I(damage/6) ~ temp, data=orings) > plotmo(a900, do.par=FALSE, caption=caption, col.response=2, nrug=-1, + main="lm(damage/6~temp)", smooth.col="indianred", trace=0) > response <- cbind(orings$damage, 6-orings$damage) > a901 <- glm(response ~ temp, family="binomial", data=orings) > set.seed(2020) > plotmo(a901, do.par=FALSE, col.response=2, nrug=-1, + main="glm(response~temp)", smooth.col="indianred", trace=2) plotmo trace 2: plotmo(object=a901, smooth.col="indianred", nrug=-1, do.par=FALSE, trace=2, col.response=2, main="glm(response~temp)") --get.model.env for object with class glm object call is glm(formula=response~temp, family="binomial", data=orings) using the environment saved in $terms of the glm model: R_GlobalEnv --plotmo_prolog for glm object 'a901' --plotmo_x for glm object get.object.x: object$x is NULL (and it has no colnames) object call is glm(formula=response~temp, family="binomial", data=orings) get.x.from.model.frame: formula(object) is response ~ temp naked formula is the same formula is valid, now looking for data for the model.frame object$model is usable and has column names response temp x=model.frame[,-1] is usable and has column name temp plotmo_x returned[23,1]: temp 1 53 2 57 3 58 ... 63 23 81 ----Metadata: plotmo_predict with nresponse=NULL and newdata=NULL plotmo_predict with NULL newdata (nrows=3), using plotmo_x to get the data --plotmo_x for glm object get.object.x: object$x is NULL (and it has no colnames) object call is glm(formula=response~temp, family="binomial", data=orings) get.x.from.model.frame: formula(object) is response ~ temp naked formula is the same formula is valid, now looking for data for the model.frame object$model is usable and has column names response temp x=model.frame[,-1] is usable and has column name temp plotmo_x returned[23,1]: temp 1 53 2 57 3 58 ... 63 23 81 will use the above data instead of newdata=NULL for predict.glm stats::predict(glm.object, data.frame[3,1], type="response") predict returned[3,1] with no column names: 1 0.5504788 2 0.3402166 3 0.2934757 predict after processing with nresponse=NULL is [3,1] with no column names: 1 0.5504788 2 0.3402166 3 0.2934757 ----Metadata: plotmo_fitted with nresponse=NULL stats::fitted(object=glm.object) fitted(object) returned[23,1] with no column names: 1 0.550478817 2 0.340216592 3 0.293475686 ... 0.123496147 23 0.002866088 fitted(object) after processing with nresponse=NULL is [23,1] with no column names: 1 0.550478817 2 0.340216592 3 0.293475686 ... 0.123496147 23 0.002866088 ----Metadata: plotmo_y with nresponse=NULL --plotmo_y with nresponse=NULL for glm object get.object.y: object$y is usable but without colnames so we will keep on searching object call is glm(formula=response~temp, family="binomial", data=orings) get.y.from.model.frame: formula(object) is response ~ temp formula is valid, now looking for data for the model.frame object$model is usable and has column names response temp y=model.frame[,1] is usable and has column name response the variable on the left side of the formula is a matrix or data.frame plotmo often cannot process such variables the number of dimensions of each variable in y is 2 and y is [23,1] with colname response, and values c(5, 1, 1, 1, 0, 0, 0, 0, 0, ... replacing y with y[[1]] y colnames were "response" and now "response[,1]" "response[,2]" plotmo_y returned[23,2]: response[,1] response[,2] 1 5 1 2 1 5 3 1 5 ... 1 5 23 0 6 plotmo_y after processing with nresponse=NULL is [23,2]: response[,1] response[,2] 1 5 1 2 1 5 3 1 5 ... 1 5 23 0 6 converted nresponse=NA to nresponse=1 nresponse=1 (was NA) ncol(fitted) 1 ncol(predict) 1 ncol(y) 2 ----Metadata: plotmo_y with nresponse=1 --plotmo_y with nresponse=1 for glm object get.object.y: object$y is usable but without colnames so we will keep on searching object call is glm(formula=response~temp, family="binomial", data=orings) get.y.from.model.frame: formula(object) is response ~ temp formula is valid, now looking for data for the model.frame object$model is usable and has column names response temp y=model.frame[,1] is usable and has column name response the variable on the left side of the formula is a matrix or data.frame plotmo often cannot process such variables the number of dimensions of each variable in y is 2 and y is [23,1] with colname response, and values c(5, 1, 1, 1, 0, 0, 0, 0, 0, ... replacing y with y[[1]] y colnames were "response" and now "response[,1]" "response[,2]" got model response from object$model yfrac[23,1] with colname response[,1], and values 0.8333, 0.1667, 0.1667, 0.166... created column "response.yfrac" from two column binomial response plotmo_y returned[23,1]: response.yfrac 1 0.8333333 2 0.1666667 3 0.1666667 ... 0.1666667 23 0.0000000 plotmo_y after processing with nresponse=1 is [23,1]: response.yfrac 1 0.8333333 2 0.1666667 3 0.1666667 ... 0.1666667 23 0.0000000 got response name "response[,1]" from yfull resp.levs is NULL ----Metadata: done number of x values: temp 16 ----plotmo_singles for glm object singles: 1 temp ----plotmo_pairs for glm object formula(object) returned response ~ temp formula.vars "temp" term.labels "temp" plotmo_pairs_from_term_labels term.labels: "temp" "temp" pred.names: "temp" considering temp considering temp no pairs ----Figuring out ylim ylim c(-0.1, 1.1) clip TRUE --plot.degree1(draw.plot=TRUE) degree1 plot1 (pmethod "plotmo") variable temp newdata[50,1]: temp 1 53.00000 2 53.57143 3 54.14286 ... 54.71429 50 81.00000 stats::predict(glm.object, data.frame[50,1], type="response") predict returned[50,1] with no column names: 1 0.550478817 2 0.519750569 3 0.488872165 ... 0.458078452 50 0.002866088 predict after processing with nresponse=1 is [50,1]: predict 1 0.550478817 2 0.519750569 3 0.488872165 ... 0.458078452 50 0.002866088 graphics::plot.default(x=c(53,53.57,54.1...), y=c(0.5505,0.5198...), type="n", main="glm(response~temp)", xlab="", ylab="", xaxt="s", yaxt="s", xlim=c(53,81.01), ylim=c(-0.1,1.1)) > a902 <- glm(cbind(damage, 6-damage)~temp, family="binomial", data=orings) > set.seed(2020) > plotmo(a902, do.par=FALSE, col.response=2, nrug=TRUE, + main="glm(cbind(damage,6-damage)~temp)", trace=0) > termplot(a902, main="termplot") > plotmo(a902, type="link", main="type=\"link\"", do.par=F) > set.seed(2020) > plotmo(a902, type="response", main="type=\"response\"", col.response=2, do.par=F) > par(org.par) > > set.seed(1) > caption <- "test glm(lot2~log(u),data=clotting,family=Gamma)" > dopar(2,2,caption) test glm(lot2~log(u),data=clotting,family=Gamma) > u = c(5,10,15,20,30,40,60,80,100) > lota = c(118,58,42,35,27,25,21,19,18) > clotting <- data.frame(u = u, lota = lota) > a <- glm(lota ~ log(u), data=clotting, family=Gamma) > set.seed(2020) > plotmo(a, do.par=FALSE, caption=caption, col.response=3, clip=FALSE, nrug=-1) > termplot(a) > plotmo(a, type="link", caption=paste("type=\"link\"", caption)) > par(org.par) > > if(length(grep("package:gam", search()))) + detach("package:gam") > library(mgcv) Loading required package: nlme This is mgcv 1.9-4. For overview type '?mgcv'. > set.seed(1) > caption <- "test plot.gam, with mgcv::gam(y ~ s(x) + s(x,z)) with response and func (and extra image plot)" > dopar(3,2,caption) test plot.gam, with mgcv::gam(y ~ s(x) + s(x,z)) with response and func (and extra image plot) > par(mar = c(3, 5, 1.7, 0.5)) # more space for left and bottom axis > test1 <- function(x,sx=0.3,sz=0.4) + (pi**sx*sz)*(1.2*exp(-(x[,1]-0.2)^2/sx^2-(x[,2]-0.3)^2/sz^2)+ + 0.8*exp(-(x[,1]-0.7)^2/sx^2-(x[,2]-0.8)^2/sz^2)) > n <- 100 > set.seed(1) > x <- runif(n); > z1 <- runif(n); > y <- test1(cbind(x,z1)) + rnorm(n) * 0.1 > a <- gam(y ~ s(x) + s(x,z1)) > set.seed(2020) > plotmo(a, do.par=FALSE, type2="contour", caption=caption, + col.response=3, smooth.col="indianred", + func=test1, func.col="indianred", func.lwd=5, func.lty=2, smooth.lwd=3) plotmo grid: x z1 0.4878107 0.5185988 > > plotmo(a, do.par=FALSE, degree1=F, degree2=1, type2="image", ylim=NA) > plot(a, select=1) > plot(a, select=2) > plot(a, select=3) > n<-400 > sig<-2 > set.seed(1) > x0 <- runif(n, 0, 1) > x1 <- runif(n, 0, 1) > x2 <- runif(n, 0, 1) > x3 <- runif(n, 0, 1) > f0 <- function(x) 2 * sin(pi * x) > f1 <- function(x) exp(2 * x) > f2 <- function(x) 0.2*x^11*(10*(1-x))^6+10*(10*x)^3*(1-x)^10 > f <- f0(x0) + f1(x1) + f2(x2) > e <- rnorm(n, 0, sig) > y <- f + e > test.func <- function(x) f0(x[,1]) + f1(x[,2]) + f2(x[,3]) > library(mgcv) > caption <- "test mgcv::gam(y~s(x0,x1,k=12)+s(x2)+s(x3,k=20,fx=20)) (and extra persp plot)" > dopar(3,3,caption) test mgcv::gam(y~s(x0,x1,k=12)+s(x2)+s(x3,k=20,fx=20)) (and extra persp plot) > a <- gam(y~s(x0,x1,k=12)+s(x2)+s(x3,k=20,fx=20)) > plot(a, select=2) > plot(a, select=3) > plot(a, select=1) > plotmo(a, do.par=FALSE, type2="contour", caption=caption, xlab=NULL, main="", func=test.func, ngrid2=10, contour.drawlabels=FALSE) plotmo grid: x0 x1 x2 x3 0.474141 0.5151294 0.4460308 0.479208 > plotmo(a, do.par=FALSE, degree1=F, degree2=1, persp.the=-35) > par(org.par) > > set.seed(1) > caption <- "test plot.gam, with mgcv::gam(doy~s(wind)+s(humidity,wind)+s(vh)+temp,data=ozone1)" > dopar(3,3,caption) test plot.gam, with mgcv::gam(doy~s(wind)+s(humidity,wind)+s(vh)+temp,data=ozone1) > a <- gam(doy ~ s(wind) + s(humidity,wind) + s(vh) + temp, data=ozone1) > plotmo(a, do.par=FALSE, caption=caption, type2="contour", degree1=c("wind","vh"), swapxy=T, xlab=NULL, main="", clip=FALSE) plotmo grid: temp wind humidity vh 62 5 64 5760 > plot(a, select=1) > plot(a, select=3) > plot(a, select=2) > plot(a, select=4) > par(org.par) > > detach("package:mgcv") > library(gam) Loading required package: splines Loading required package: foreach Loaded gam 1.22-7 > caption <- "test gam:gam(Ozone^(1/3)~lo(Solar.R)+lo(Wind, Temp),data=airquality)" > set.seed(1) > dopar(3,2,caption) test gam:gam(Ozone^(1/3)~lo(Solar.R)+lo(Wind, Temp),data=airquality) > data(airquality) > airquality <- na.omit(airquality) # plotmo doesn't know how to deal with NAs yet > a <- gam(Ozone^(1/3) ~ lo(Solar.R) + lo(Wind, Temp), data = airquality) > set.seed(2020) > plotmo(a, do.par=FALSE, caption=caption, ylim=NA, col.response=3) plotmo grid: Solar.R Wind Temp 207 9.7 79 > # termplot gives fishy looking wind plot, plotmo looks ok > # termplot(a) #TODO this fails with R2.5: dim(data) <- dim: attempt to set an attribute on NULL > detach("package:gam") > par(org.par) > > library(mda) Loading required package: class Loaded mda 0.5-5 > caption <- "test mars and earth (expect not a close match)" > dopar(6,3,caption) test mars and earth (expect not a close match) > a <- mars( ozone1[, -1], ozone1[,1], degree=2) > b <- earth(ozone1[, -1], ozone1[,1], degree=2) > # this also tests trace=2 on a non formula model > plotmo(a, do.par=FALSE, caption=caption, trace=2) plotmo trace 2: plotmo(object=a, do.par=FALSE, caption=caption, trace=2) --get.model.env for object with class mars object call is mars(x=ozone1[, -1], y=ozone1[, 1], degree=2) assuming the environment of the mars model is that of plotmo's caller: R_GlobalEnv --plotmo_prolog for mars object 'a' --plotmo_x for mars object get.object.x: ignoring object$x for this mars object object call is mars(x=ozone1[, -1], y=ozone1[, 1], degree=2) get.x.from.model.frame: terms(object) did not return the terms, will look for the formula elsewhere no formula in getCall(object) get.data.from.object.call.field: eval(getCall(object)$x, R_GlobalEnv) getCall(object)$x is usable and has column names vh wind humidity temp ibh dpg ibt vis doy plotmo_x returned[330,9]: vh wind humidity temp ibh dpg ibt vis doy 1 5710 4 28 40 2693 -25 87 250 33 2 5700 3 37 45 590 -24 128 100 34 3 5760 3 51 54 1450 25 139 60 35 ... 5720 4 69 35 1568 15 121 60 36 330 5550 4 85 39 5000 8 44 100 390 ----Metadata: plotmo_predict with nresponse=NULL and newdata=NULL plotmo_predict with NULL newdata (nrows=3), using plotmo_x to get the data --plotmo_x for mars object get.object.x: ignoring object$x for this mars object object call is mars(x=ozone1[, -1], y=ozone1[, 1], degree=2) get.x.from.model.frame: terms(object) did not return the terms, will look for the formula elsewhere no formula in getCall(object) get.data.from.object.call.field: eval(getCall(object)$x, R_GlobalEnv) getCall(object)$x is usable and has column names vh wind humidity temp ibh dpg ibt vis doy plotmo_x returned[330,9]: vh wind humidity temp ibh dpg ibt vis doy 1 5710 4 28 40 2693 -25 87 250 33 2 5700 3 37 45 590 -24 128 100 34 3 5760 3 51 54 1450 25 139 60 35 ... 5720 4 69 35 1568 15 121 60 36 330 5550 4 85 39 5000 8 44 100 390 will use the above data instead of newdata=NULL for predict.mars stats::predict(mars.object, data.frame[3,9], type="response") predict returned[3,1] with no column names: 1 3.333568 2 1.865073 3 7.044289 predict after processing with nresponse=NULL is [3,1] with no column names: 1 3.333568 2 1.865073 3 7.044289 ----Metadata: plotmo_fitted with nresponse=NULL stats::fitted(object=mars.object) fitted(object) returned[330,1] with no column names: 1 3.333568 2 1.865073 3 7.044289 ... 6.925382 330 1.885331 fitted(object) after processing with nresponse=NULL is [330,1] with no column names: 1 3.333568 2 1.865073 3 7.044289 ... 6.925382 330 1.885331 ----Metadata: plotmo_y with nresponse=NULL --plotmo_y with nresponse=NULL for mars object get.object.y: object$y is NULL (and it has no colnames) object call is mars(x=ozone1[, -1], y=ozone1[, 1], degree=2) get.y.from.model.frame: terms(object) did not return the terms, will look for the formula elsewhere no formula in getCall(object) get.data.from.object.call.field: eval(getCall(object)$y, R_GlobalEnv) getCall(object)$y is usable but without colnames so we will keep on searching names(call) is "" "x" "y" "degree" the name of argument 2 is "y" so we will not process it with argn object$y is NULL call$y is usable but without colnames but we will use it anyway plotmo_y returned[330,1] with no column names: 1 3 2 5 3 5 ... 6 330 1 plotmo_y after processing with nresponse=NULL is [330,1] with no column names: 1 3 2 5 3 5 ... 6 330 1 converted nresponse=NA to nresponse=1 nresponse=1 (was NA) ncol(fitted) 1 ncol(predict) 1 ncol(y) 1 ----Metadata: plotmo_y with nresponse=1 --plotmo_y with nresponse=1 for mars object get.object.y: object$y is NULL (and it has no colnames) object call is mars(x=ozone1[, -1], y=ozone1[, 1], degree=2) get.y.from.model.frame: terms(object) did not return the terms, will look for the formula elsewhere no formula in getCall(object) get.data.from.object.call.field: eval(getCall(object)$y, R_GlobalEnv) getCall(object)$y is usable but without colnames so we will keep on searching names(call) is "" "x" "y" "degree" the name of argument 2 is "y" so we will not process it with argn object$y is NULL call$y is usable but without colnames but we will use it anyway got model response from getCall(object)$y plotmo_y returned[330,1] with no column names: 1 3 2 5 3 5 ... 6 330 1 plotmo_y after processing with nresponse=1 is [330,1]: plotmo_y 1 3 2 5 3 5 ... 6 330 1 response name is NULL resp.levs is NULL ----Metadata: done number of x values: vh 53 wind 11 humidity 65 temp 63 ibh 196 dpg 128 ibt 193... ----plotmo_singles for mars object singles: 1 vh, 2 wind, 3 humidity, 4 temp, 5 ibh, 6 dpg, 7 ibt, 8 vis, 9 doy ----plotmo_pairs for mars object Error in attr(x, "formula") %||% { : invalid formula formula(object) failed for mars object in plotmo.pairs.default Error in x$terms %||% attr(x, "terms") %||% stop("no terms component nor attribute") : no terms component nor attribute terms(object) failed for mars object in plotmo.pairs.default no pairs ----Figuring out ylim --get.ylim.by.dummy.plots --plot.degree1(draw.plot=FALSE) degree1 plot1 (pmethod "plotmo") variable vh newdata[50,9]: vh wind humidity temp ibh dpg ibt vis doy 1 5320.000 5 64 62 2112.5 24 167.5 120 205.5 2 5332.857 5 64 62 2112.5 24 167.5 120 205.5 3 5345.714 5 64 62 2112.5 24 167.5 120 205.5 ... 5358.571 5 64 62 2112.5 24 167.5 120 205.5 50 5950.000 5 64 62 2112.5 24 167.5 120 205.5 stats::predict(mars.object, data.frame[50,9], type="response") predict returned[50,1] with no column names: 1 8.123619 2 8.303007 3 8.482395 ... 8.661783 50 16.216014 predict after processing with nresponse=1 is [50,1]: predict 1 8.123619 2 8.303007 3 8.482395 ... 8.661783 50 16.216014 Reducing trace level for subsequent degree1 plots degree1 plot2 (pmethod "plotmo") variable wind degree1 plot3 (pmethod "plotmo") variable humidity degree1 plot4 (pmethod "plotmo") variable temp degree1 plot5 (pmethod "plotmo") variable ibh degree1 plot6 (pmethod "plotmo") variable dpg degree1 plot7 (pmethod "plotmo") variable ibt degree1 plot8 (pmethod "plotmo") variable vis degree1 plot9 (pmethod "plotmo") variable doy --done get.ylim.by.dummy.plots ylim c(6.671, 20.41) clip TRUE --plot.degree1(draw.plot=TRUE) plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 graphics::plot.default(x=c(5320,5333,534...), y=c(8.124,8.303,8...), type="n", main="1 vh", xlab="", ylab="", xaxt="s", yaxt="s", xlim=c(5320,5950), ylim=c(6.671,20.42)) > plotmo(b, do.par=FALSE) plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > par(org.par) > > caption <- "test mars and mars.to.earth(mars) (expect no degree2 for mars)" > dopar(6,3,caption) test mars and mars.to.earth(mars) (expect no degree2 for mars) > a <- mars(ozone1[, -1], ozone1[,1], degree=2) > b <- mars.to.earth(a) Converted mars(x=ozone1[,-1], y=ozone1[,1], degree=2) to earth(x=ozone1[,-1], y=ozone1[,1], degree=2) > plotmo(a, do.par=FALSE, caption=caption, ylim=NA) plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > plotmo(b, do.par=FALSE, ylim=NA) plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > par(org.par) > > # check fix for bug reported by Martin Maechler: > # form <- Volume ~ .; a <- earth(form, data = trees); plotmo(a) fails > > dopar(4,4, "test f <- O3 ~ .; a <- earth(f, data=ozone1)") test f <- O3 ~ .; a <- earth(f, data=ozone1) > fa <- log(O3) ~ . > a <- earth(fa, data=ozone1, degree=2) > print(summary(a)) Call: earth(formula=fa, data=ozone1, degree=2) coefficients (Intercept) 2.79412331 h(47-humidity) -0.01328663 h(52-temp) -0.01753702 h(temp-52) 0.02311792 h(1105-ibh) -0.00030601 h(13-dpg) -0.00523433 h(dpg-13) -0.00788042 h(194-ibt) -0.00459263 h(200-vis) 0.00195292 h(96-doy) -0.01324138 h(doy-96) -0.00278616 h(wind-7) * h(200-vis) -0.00153720 h(43-humidity) * h(52-temp) 0.00187488 h(humidity-67) * h(ibh-1105) -0.00000914 Selected 14 of 21 terms, and 8 of 9 predictors Termination condition: Reached nk 21 Importance: temp, ibt, doy, humidity, ibh, dpg, vis, wind, vh-unused Number of terms at each degree of interaction: 1 10 3 GCV 0.1058972 RSS 28.2111 GRSq 0.8114829 RSq 0.8468883 > plot(a, do.par=FALSE) > set.seed(2020) > plotmo(a, do.par=FALSE, degree1=2:3, degree2=c(1,2), col.response = "pink", smooth.col="indianred") plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > a <- lm(log(doy) ~ I(vh*wind) + I(humidity*temp) + log(ibh), data=ozone1) > plotmo(a, do.par=FALSE, degree1=1:2) plotmo grid: vh wind humidity temp ibh 5760 5 64 62 2112.5 > fa <- log(doy) ~ I(vh*wind) + I(humidity*temp) + log(ibh) > a <- lm(fa, data=ozone1) > plotmo(a, do.par=FALSE, degree1=1:2) plotmo grid: vh wind humidity temp ibh 5760 5 64 62 2112.5 > par(org.par) > > # test inverse.func and func > > caption <- "test inverse.func=exp" > a <- lm(log(Volume) ~ Girth + Height + I(Girth*Height), data=trees) > my.func <- function(x) -60 + 5 * x[,1] + x[,2] / 3 > set.seed(2020) > plotmo(a, caption=caption, inverse.func = exp, col.response = "pink", func=my.func, func.col="gray", ngrid1=1000, type2="p", smooth.col="indianred") plotmo grid: Girth Height 12.9 76 > par(org.par) > > # se testing > > caption = "level=.95, lm(doy~., data=ozone1) versus termplot" > dopar(6,3,caption) level=.95, lm(doy~., data=ozone1) versus termplot > a <- lm(doy~., data=ozone1) > plotmo(a, level=.95, do.par=FALSE, caption=caption) plotmo grid: O3 vh wind humidity temp ibh dpg ibt vis 10 5760 5 64 62 2112.5 24 167.5 120 > termplot(a, se=2) > par(org.par) > > caption <- "test different se options, level=.95, lm(log(doy)~vh+wind+log(humidity),data=ozone1)" > dopar(4,3,caption) test different se options, level=.95, lm(log(doy)~vh+wind+log(humidity),data=ozone1) > a <- lm(log(doy) ~ vh + wind + log(humidity), data=ozone1) > plotmo(a, do.par=FALSE, caption=caption, ylim=NA, level=.95) plotmo grid: vh wind humidity 5760 5 64 > plotmo(a, do.par=FALSE, caption=caption, ylim=NA, level=.95, level.shade="pink", level.shade2=3) plotmo grid: vh wind humidity 5760 5 64 > plotmo(a, do.par=FALSE, caption=caption, ylim=NA, level=.95, level.shade=3) plotmo grid: vh wind humidity 5760 5 64 > plotmo(a, do.par=FALSE, caption=caption, ylim=NULL, level=.95, level.shade=3) plotmo grid: vh wind humidity 5760 5 64 > par(org.par) > > caption <- "test level=.95, lm(log(doy)~vh+wind+log(humidity),data=ozone1)" > dopar(2,3,caption) test level=.95, lm(log(doy)~vh+wind+log(humidity),data=ozone1) > a <- lm(log(doy) ~ vh + wind + log(humidity), data=ozone1) > plotmo(a, do.par=FALSE, caption=caption, ylim=NA, level=.95) plotmo grid: vh wind humidity 5760 5 64 > termplot(a, se=2) > par(org.par) > > caption <- "test level=.95 and inverse.func, lm(log(doy)~vh+wind+log(humidity),data=ozone1)" > dopar(3,3,caption) test level=.95 and inverse.func, lm(log(doy)~vh+wind+log(humidity),data=ozone1) > a <- lm(log(doy) ~ vh + wind + log(humidity), data=ozone1) > plotmo(a, do.par=FALSE, caption=caption, ylim=NA, level=.95) plotmo grid: vh wind humidity 5760 5 64 > plotmo(a, do.par=FALSE, caption=caption, ylim=NULL, level=.95, inverse.func=exp) plotmo grid: vh wind humidity 5760 5 64 > termplot(a, se=2) > par(org.par) > > caption <- "test level=.95, glm(lot2~log(u),data=clotting,family=Gamma)" > set.seed(1) > dopar(2,2,caption) test level=.95, glm(lot2~log(u),data=clotting,family=Gamma) > u = c(5,10,15,20,30,40,60,80,100) > lota = c(118,58,42,35,27,25,21,19,18) > clotting <- data.frame(u = u, lota = lota) > a <- glm(lota ~ log(u), data=clotting, family=Gamma) > set.seed(2020) > plotmo(a, do.par=FALSE, caption=caption, col.response=4, pt.pch=7, clip=FALSE, nrug=-1, level=.95, smooth.col="indianred") Warning: the level argument may not work correctly on glm objects built with weights > termplot(a, se=2) > par(org.par) > > if(length(grep("package:gam", search()))) + detach("package:gam") > library(mgcv) This is mgcv 1.9-4. For overview type '?mgcv'. > set.seed(1) > caption <- "test level=.95, plot.gam, with mgcv::gam(y ~ s(x) + s(x,z1)) with response and func (and extra image plot)" > dopar(3,2,caption) test level=.95, plot.gam, with mgcv::gam(y ~ s(x) + s(x,z1)) with response and func (and extra image plot) > par(mar = c(3, 5, 1.7, 0.5)) # more space for left and bottom axis > test1 <- function(x,sx=0.3,sz=0.4) + (pi**sx*sz)*(1.2*exp(-(x[,1]-0.2)^2/sx^2-(x[,2]-0.3)^2/sz^2)+ + 0.8*exp(-(x[,1]-0.7)^2/sx^2-(x[,2]-0.8)^2/sz^2)) > n <- 100 > set.seed(1) > x <- runif(n); > z1 <- runif(n); > y <- test1(cbind(x,z1)) + rnorm(n) * 0.1 > a <- gam(y ~ s(x) + s(x,z1)) > set.seed(2020) > plotmo(a, do.par=FALSE, type2="contour", caption=caption, col.response=3, func=test1, func.col="magenta", level=.95) plotmo grid: x z1 0.4878107 0.5185988 > plotmo(a, do.par=FALSE, degree1=F, degree2=1, type2="image", image.col=topo.colors(10), + ylim=NA, level=.95, main="topo.colors") > plot(a, select=1) > plot(a, select=2) > plot(a, select=3) > par(org.par) > > # TODO Following commented out because it causes: > # Error: gam objects in the "gam" package do not support confidence intervals on new data > # detach("package:mgcv") > # library(gam) > # set.seed(1) > # caption <- "test level=.95, gam:gam(Ozone^(1/3)~lo(Solar.R)+lo(Wind, Temp),data=airquality)" > # dopar(3,2,caption) > # data(airquality) > # airquality <- na.omit(airquality) # plotmo doesn't know how to deal with NAs yet > # a <- gam(Ozone^(1/3) ~ lo(Solar.R) + lo(Wind, Temp), data = airquality) > # set.seed(2020) > # plotmo(a, do.par=FALSE, caption=caption, ylim=NA, col.response=3, level=.95) > # # termplot(a) #TODO this fails with R2.5: dim(data) <- dim: attempt to set an attribute on NULL > # detach("package:gam") > # par(org.par) > > # test factors by changing wind to a factor > > ozone2 <- ozone1 > ozone2[,"wind"] <- factor(ozone2[,"wind"], labels=c( + "wind0", "wind2", "wind3", "wind4", "wind5", "wind6", + "wind7", "wind8", "wind9", "wind10", "wind11")) > > # commented out because factors are not yet supported by plotmo.earth > # caption <- "test wind=factor, earth(O3 ~ ., data=ozone2)" > # a <- earth(doy ~ ., data=ozone2) > # set.seed(1) > # dopar(4,3,caption) > # set.seed(2020) > # plotmo(a, col.response="gray", level=.95, nrug=-1, do.par=FALSE, caption=caption) > # termplot(a) > # par(org.par) > > caption <- "test wind=factor, lm(doy ~ vh + wind + I(humidity*temp) + log(ibh), data=ozone2)" > a <- lm(doy ~ vh + wind + I(humidity*temp) + log(ibh), data=ozone2) > set.seed(1) > dopar(4,3,caption) test wind=factor, lm(doy ~ vh + wind + I(humidity*temp) + log(ibh), data=ozone2) > plotmo(a, col.response="gray", level=.95, nrug=-1, do.par=FALSE, caption=caption, smooth.col="indianred") plotmo grid: vh wind humidity temp ibh 5760 wind5 64 62 2112.5 > termplot(a, se=2) > par(org.par) > > caption <- "test level options" > dopar(2,2,caption) test level options > plotmo(a, do.par=FALSE, degree1=2, degree2=FALSE, level=.95, level.shade=0, caption=caption) plotmo grid: vh wind humidity temp ibh 5760 wind5 64 62 2112.5 > plotmo(a, do.par=FALSE, degree1=2, degree2=FALSE, level=.95, level.shade="orange") plotmo grid: vh wind humidity temp ibh 5760 wind5 64 62 2112.5 > plotmo(a, do.par=FALSE, degree1=2, degree2=FALSE, level=.95, level.shade2=0) plotmo grid: vh wind humidity temp ibh 5760 wind5 64 62 2112.5 > par(org.par) > > caption <- "test wind=factor, glm(y ~ i + j, family=poisson())" > y <- c(18,17,15,20,10,20,25,13,12) > i <- gl(3,1,9) > j <- gl(3,3) > a <- glm(y ~ i + j, family=poisson()) > set.seed(1) > dopar(2,2,caption) test wind=factor, glm(y ~ i + j, family=poisson()) > plotmo(a, do.par=F, level=.95, nrug=1, caption=caption) Warning: the level argument may not work correctly on glm objects built with weights Warning: the level argument may not work correctly on glm objects built with weights plotmo grid: i j 1 1 > termplot(a, se=1, rug=T) > par(org.par) > > if(length(grep("package:gam", search()))) + detach("package:gam") > caption <- "test wind=factor, gam(doy ~ vh + wind + s(humidity) + s(vh) + temp, data=ozone2)" > library(mgcv) > a <- gam(doy ~ vh + wind + s(humidity) + s(vh) + temp, data=ozone2) > plotmo(a, level=.95, caption=caption) plotmo grid: vh wind temp humidity 5760 wind5 62 64 > caption <- "test wind=factor, clip=TRUE, gam(doy ~ vh + wind + s(humidity) + s(vh) + temp, data=ozone2)" > plotmo(a, level=.95, caption=caption, clip=FALSE) plotmo grid: vh wind temp humidity 5760 wind5 62 64 > # termplot doesn't work here so code commented out > # dopar(3,3,caption) > # plotmo(a, do.par=FALSE) > # termplot(a) > par(org.par) > > # test lda and qda, and also col.response, pt.pch, and jitter > library(MASS) > etitanic2 <- etitanic > etitanic2$pclass <- as.numeric(etitanic$pclass) > etitanic2$sex <- as.numeric(etitanic$sex) > etitanic2$sibsp <- NULL > etitanic2$parch <- NULL > lda.model <- lda(survived ~ ., data=etitanic2) > set.seed(7) > plotmo(lda.model, caption="lda", clip=F, + col.response=as.numeric(etitanic2$survived)+2, type="posterior", nresponse=1, smooth.col="indianred", + all2=TRUE, type2="image") plotmo grid: pclass sex age 2 2 28 > set.seed(8) > plotmo(lda.model, caption="lda with no jitter", clip=F, + col.response=as.numeric(etitanic2$survived)+2, type="posterior", nresponse=1, + all2=TRUE, type2="image", jitter=0) plotmo grid: pclass sex age 2 2 28 > qda.model <- qda(survived ~ ., data=etitanic2) > set.seed(9) > plotmo(qda.model, caption="qda", clip=F, + col.response=as.numeric(etitanic2$survived)+2, type="post", nresponse=2, smooth.col="indianred", + all2=TRUE, type2="image", jitter.resp=.6, pch.resp=20) plotmo grid: pclass sex age 2 2 28 > > # test plotmo.y from the 2nd argument of the model function (non-formula interface) > lcush <- data.frame(Type=as.numeric(Cushings$Type), log(Cushings[,1:2]))[1:21,] > a <- qda(lcush[,2:3], lcush[,1]) > set.seed(2020) > plotmo(a, type="class", all2=TRUE, + caption= "plotmo.y from 2nd argument of call (qda)", + type2="contour", ngrid2=100, contour.nlevels=2, contour.drawlabels=FALSE, + col.response=as.numeric(lcush$Type)+1, + pt.pch=as.character(lcush$Type)) plotmo grid: Tetrahydrocortisone Pregnanetriol 2.04122 0.1823216 > par(org.par) > > # # example from MASS (works, but removed because unnecessary test) > # predplot <- function(object, main="", len = 100, ...) > # { > # plot(Cushings[,1], Cushings[,2], log="xy", type="n", > # xlab = "Tetrahydrocortisone", ylab = "Pregnanetriol", main = main) > # for(il in 1:4) { > # set <- Cushings$Type==levels(Cushings$Type)[il] > # text(Cushings[set, 1], Cushings[set, 2], > # labels=as.character(Cushings$Type[set]), col = 2 + il) } > # xp <- seq(0.6, 4.0, length=len) > # yp <- seq(-3.25, 2.45, length=len) > # cushT <- expand.grid(Tetrahydrocortisone = xp, > # Pregnanetriol = yp) > # Z <- predict(object, cushT, ...); zp <- as.numeric(Z$class) > # zp <- Z$post[,3] - pmax(Z$post[,2], Z$post[,1]) > # contour(exp(xp), exp(yp), matrix(zp, len), > # add = TRUE, levels = 0, labex = 0) > # zp <- Z$post[,1] - pmax(Z$post[,2], Z$post[,3]) > # contour(exp(xp), exp(yp), matrix(zp, len), > # add = TRUE, levels = 0, labex = 0) > # invisible() > # } > # par(mfrow=c(2,2)) > # cush <- log(as.matrix(Cushings[, -3])) > # tp <- Cushings$Type[1:21, drop = TRUE] > # set.seed(203) > # cush.data <- data.frame(tp, cush[1:21,]) > # a <- qda(tp~., data=cush.data) > # predplot(a, "QDA example from MASS") > # set.seed(2020) > # plotmo(a, type="class", all2=TRUE, type2="contour", degree1=NA, do.par=FALSE, > # col.response=as.numeric(cush.data$tp)+1) > # set.seed(2020) > # plotmo(a, type="class", all2=TRUE, type2="contour", degree1=NA, do.par=FALSE, > # col.response=as.numeric(cush.data$tp)+1, drawlabels=F, nlevels=2) > # set.seed(2020) > # plotmo(a, type="class", all2=TRUE, type2="contour", degree1=NA, do.par=FALSE, > # col.response=as.numeric(cush.data$tp)+1, drawlabels=F, nlevels=2, ngrid2=100) > # par(org.par) > > library(rpart) Attaching package: 'rpart' The following object is masked from 'package:faraway': solder > data(kyphosis) > # kyphosis data, earth model > a <- earth(Kyphosis ~ ., data=kyphosis, degree=2, glm=list(family=binomial)) > cat("summary(a): (Kyphosis)\n") summary(a): (Kyphosis) > print(summary(a)) Call: earth(formula=Kyphosis~., data=kyphosis, glm=list(family=binomial), degree=2) GLM coefficients present (Intercept) 12.4739052 h(97-Age) -0.1563678 h(6-Number) -3.8334755 h(Start-6) -0.3798750 h(Age-42) * h(Number-3) -0.0197570 h(114-Age) * h(Start-6) 0.0089521 h(Number-3) * h(Start-6) -0.3545004 GLM (family binomial, link logit): nulldev df dev df devratio AIC iters converged 83.2345 80 36.4652 74 0.562 50.47 8 1 Earth selected 7 of 19 terms, and 3 of 3 predictors Termination condition: Reached nk 21 Importance: Start, Age, Number Number of terms at each degree of interaction: 1 3 3 Earth GCV 0.1359306 RSS 7.090206 GRSq 0.2004084 RSq 0.4721446 > par(mfrow=c(3, 3)) > par(mar=c(3, 3, 2, .5)) # small margins to pack figs in > set.seed(9) # for jitter > set.seed(2020) > plotmo(a, do.par=F, type2="image", + col.response=ifelse(kyphosis$Kyphosis=="present", "red", "lightblue"), + clip=F) plotmo grid: Age Number Start 87 4 13 > plotmo(a, do.par=F, clip=F, degree1=0) > par(org.par) > > # kyphosis data, rpart models (also test ngrid2) > fit1 <- rpart(Kyphosis ~ ., data=kyphosis) > plotres(fit1, SHOWCALL=TRUE) > par(mfrow=c(3, 3)) > par(mar=c(.5, 0.5, 2, .5), mgp = c(1.6, 0.6, 0)) # b l t r small margins to pack figs in > library(rpart.plot) > prp(fit1, main="rpart kyphosis\nno prior") > plotmo(fit1, degree1=NA, do.par=F, main="", persp.theta=220, nresponse=2) > par(mar=c(4, 4, 2, .5)) > set.seed(2020) > plotmo(fit1, nresp=2, degree1=FALSE, do.par=F, main="", type2="image", # test default type="prob" + col.response=ifelse(kyphosis$Kyphosis=="present", "red", "lightblue"), + pt.pch=ifelse(kyphosis$Kyphosis=="present", "p", "a"), + image.col=gray(10:4/10), ngrid2=30) > par(mar=c(.5, 0.5, 2, .5)) # b l t r small margins to pack figs in > plotmo(fit1, type="class", degree1=NA, do.par=F, main="type=\"class\"") > # with type="prob" and response has two columns, > # nresponse should automatically default to column 2 > plotmo(fit1, type="prob", degree1=0, do.par=F, main="type=\"prob\"", + clip=F, ngrid2=50, persp.border=NA, trace=1) stats::predict(rpart.object, data.frame[3,3], type="prob") stats::fitted(object=rpart.object) fitted() was unsuccessful, will use predict() instead set nresponse=2 nresponse=2 but for plotmo_y using nresponse=1 because ncol(y) == 1 got model response from model.frame(Kyphosis ~ Age + Number + Start, data=call$data, na.action="na.pass") > set.seed(2020) > plotmo(fit1, type="prob", nresp=2, degree1=NA, do.par=F, main="", type2="image", + col.response=ifelse(kyphosis$Kyphosis=="present", "red", "lightblue"), + pt.pch=20, image.col=gray(10:4/10), ngrid2=5) > # better rpart model with prior > fit2 <- rpart(Kyphosis ~ ., data=kyphosis, parms=list(prior=c(.65,.35))) > prp(fit2, main="rpart kyphosis\nwith prior, better model") > plotmo(fit2, type="v", degree1=NA, do.par=F, main="", persp.theta=220, ngrid2=10) > par(mar=c(4, 4, 2, .5)) > set.seed(2020) > plotmo(fit2, type="v", degree1=NA, do.par=F, main="", type2="image", + col.response=ifelse(kyphosis$Kyphosis=="present", "red", "lightblue"), + pt.pch=20, image.col=gray(10:4/10), ngrid2=100) > par(org.par) > > plotmo(fit1, type="prob", nresponse=1, persp.border=NA, persp.col="pink", all1=TRUE, all2=TRUE, + caption="plotmo rpart fit1, all1=TRUE, all2=TRUE") plotmo grid: Age Number Start 87 4 13 > expect.err(try(plotmo(fit1, type="none.such1"))) Error : predict.rpart does not support type="none.such1" Got expected error from try(plotmo(fit1, type = "none.such1")) > > # rpart model with ozone data > data(ozone1) > par(mfrow=c(4,4)) > par(mar=c(.5, 0.5, 2, .5), cex=.6, mgp = c(1.6, 0.6, 0)) # b l t r small margins to pack figs in > a1 <- rpart(O3~temp+humidity, data=ozone1) > prp(a1, main="rpart model with ozone data\n(temp and humidity only)\n") > plotmo(a1, do.par=F, degree1=0, main="rpart", persp.ticktype="detail", persp.nticks=2) > expect.err(try(plotmo(a1, type="class"))) Error : predict.rpart does not support type="class" (for "anova" rpart objects) Got expected error from try(plotmo(a1, type = "class")) > # compare to a linear and earth model > a3 <- lm(O3~temp+humidity, data=ozone1) > plotmo(a3, do.par=F, clip=F, main="lm", degree1=0, all2=TRUE, persp.ticktype="detail", persp.nticks=2) > expect.err(try(plotmo(a3, type="none.such2"))) stats::predict(lm.object, NULL, type="none.such2") Error in match.arg(type) : 'arg' should be one of "response", "terms" Got expected error from try(plotmo(a3, type = "none.such2")) > a <- earth(O3~temp+humidity, data=ozone1, degree=2) > plotmo(a, do.par=F, clip=F, main="earth", degree1=NA, persp.ticktype="detail", persp.nticks=2) > expect.err(try(plotmo(a, type="none.such3"))) stats::predict(earth.object, NULL, type="none.such3") Error : type="none.such3" is not allowed Choose one of: "link" "response" "earth" "class" "terms" Got expected error from try(plotmo(a, type = "none.such3")) > expect.err(try(plotmo(a, type=c("abc", "def")))) Error : 'type' has more than one element type = c("abc" "def") Got expected error from try(plotmo(a, type = c("abc", "def"))) > par(org.par) > > # detailed rpart model > par(mfrow=c(3,3)) > a1 <- rpart(O3~., data=ozone1) > prp(a1, cex=.9, main="rpart model with full ozone data") > plotmo(a1, type="vector", do.par=F, degree1=NA, persp.ticktype="detail", + persp.nticks=3, degree2=2:3) > par(org.par) > > plotmo(a1, persp.border=NA, all1=TRUE, all2=TRUE, + caption="plotmo rpart a1, all1=TRUE, all2=TRUE") plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > > library(tree) > tree1 <- tree(O3~., data=ozone1) > plotmo(tree1) plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > plotres(tree1) > > # rpart data with NAs > > rpart.airquality <- rpart(Ozone~., data=airquality) # airquality has NAs in response and variables > plotmo <- plotmo(rpart.airquality, trace=0, SHOWCALL=TRUE) plotmo grid: Solar.R Wind Temp Month Day 207 9.7 79 7 16 > print(rpart.rules(rpart.airquality)) Ozone 12 when Temp < 83 & Wind >= 7.2 & Solar.R < 80 21 when Temp < 78 & Wind >= 7.2 & Solar.R >= 80 35 when Temp is 78 to 83 & Wind >= 7.2 & Solar.R >= 80 49 when Temp >= 83 & Wind >= 10.6 61 when Temp < 83 & Wind < 7.2 75 when Temp is 83 to 89 & Wind < 10.6 93 when Temp >= 89 & Wind < 10.6 > > airquality.nonaOzone <- subset(airquality, !is.na(Ozone)) # no NAs in response but NAs in variables > rpart.nonaOzone <- rpart(Ozone~., data=airquality.nonaOzone) > print(rpart.rules(rpart.nonaOzone)) Ozone 12 when Temp < 83 & Wind >= 7.2 & Solar.R < 80 21 when Temp < 78 & Wind >= 7.2 & Solar.R >= 80 35 when Temp is 78 to 83 & Wind >= 7.2 & Solar.R >= 80 49 when Temp >= 83 & Wind >= 10.6 61 when Temp < 83 & Wind < 7.2 75 when Temp is 83 to 89 & Wind < 10.6 93 when Temp >= 89 & Wind < 10.6 > plotmo.nonaOzone <- plotmo(rpart.nonaOzone, trace=0, SHOWCALL=TRUE) plotmo grid: Solar.R Wind Temp Month Day 207 9.7 79 7 16 > airquality.nonaOzone$Ozone <- NULL > stopifnot(identical(plotmo.nonaOzone, airquality.nonaOzone)) > > # test xflip and yflip > > par(mfrow=c(4, 4)) > par(mgp = c(1.6, 0.6, 0)) > par(mar=c(4, 4, 2, .5)) > > flip.test1 <- rpart(Kyphosis ~ ., data=kyphosis) > set.seed(2020) > plotmo(flip.test1, type="prob", nresp=2, degree1=NA, do.par=F, main="", type2="image", + col.response=ifelse(kyphosis$Kyphosis=="present", "red", "lightblue"), + pt.pch=20, image.col=gray(10:4/10)) > set.seed(2020) > plotmo(flip.test1, type="prob", nresp=2, degree1=NA, do.par=F, main="xflip", type2="image", + col.response=ifelse(kyphosis$Kyphosis=="present", "red", "lightblue"), + pt.pch=20, image.col=gray(10:4/10), + xflip=T) > set.seed(2020) > plotmo(flip.test1, type="prob", nresp=2, degree1=NA, do.par=F, main="yflip", type2="image", + col.response=ifelse(kyphosis$Kyphosis=="present", "red", "lightblue"), + pt.pch=20, image.col=gray(10:4/10), + yflip=T) > set.seed(2020) > plotmo(flip.test1, type="prob", nresp=2, degree1=NA, do.par=F, main="xflip and yflip", type2="image", + col.response=ifelse(kyphosis$Kyphosis=="present", "red", "lightblue"), + pt.pch=20, image.col=gray(10:4/10), + xflip=T, yflip=T) > > flip.test2 <- earth(O3~., data=ozone1, degree=2) > plotmo(flip.test2, degree1=NA, degree2=2, do.par=F, main="", type2="cont") > plotmo(flip.test2, degree1=NA, degree2=2, do.par=F, main="xflip", type2="cont", + xflip=T) > plotmo(flip.test2, degree1=NA, degree2=2, do.par=F, main="yflip", type2="cont", + yflip=T) > plotmo(flip.test2, degree1=NA, degree2=2, do.par=F, main="xflip and yflip", type2="cont", + xflip=T, yflip=T) > > cat("Expect warnings: ignoring xflip=TRUE for persp plot\n") Expect warnings: ignoring xflip=TRUE for persp plot > plotmo(flip.test2, degree1=NA, degree2=2, do.par=F, main="xflip and yflip", type2="persp", + xflip=T, yflip=T) Warning: ignoring xflip=TRUE for persp plot Warning: ignoring yflip=TRUE for persp plot > > library(randomForest) randomForest 4.7-1.2 Type rfNews() to see new features/changes/bug fixes. > data(etitanic) > etit <- etitanic[1:300,] > > cat("=== rf.regression ===\n") === rf.regression === > set.seed(2016) > # Expect Warning: The response has five or fewer unique values. Are you sure you want to do regression? > rf.regression <- randomForest(survived~., data=etit, ntree=100, importance = FALSE) Warning in randomForest.default(m, y, ...) : The response has five or fewer unique values. Are you sure you want to do regression? > plotmo(rf.regression, trace=1) stats::predict(randomForest.formula.object, data.frame[3,5], type="response") stats::fitted(object=randomForest.formula.object) fitted() was unsuccessful, will use predict() instead got model response from model.frame(survived ~ pclass + sex + age + sibsp..., data=call$data, na.action="na.fail") randomForest built with importance=FALSE, ranking variables on IncNodePurity plotmo grid: pclass sex age sibsp parch 1st male 38 0 0 > > cat("=== rf.regression.importance ===\n") === rf.regression.importance === > set.seed(2016) > # Expect Warning: The response has five or fewer unique values. Are you sure you want to do regression? > rf.regression.importance <- randomForest(survived~., data=etit, ntree=100, importance = TRUE) Warning in randomForest.default(m, y, ...) : The response has five or fewer unique values. Are you sure you want to do regression? > plotmo(rf.regression.importance, trace=1) stats::predict(randomForest.formula.object, data.frame[3,5], type="response") stats::fitted(object=randomForest.formula.object) fitted() was unsuccessful, will use predict() instead got model response from model.frame(survived ~ pclass + sex + age + sibsp..., data=call$data, na.action="na.fail") randomForest built with importance=TRUE, ranking variables on %IncMSE plotmo grid: pclass sex age sibsp parch 1st male 38 0 0 > > etit <- etitanic[1:300,] > etit$survived <- factor(ifelse(etit$survived == 1, "survived", "died"), + levels = c("survived", "died")) > cat("=== rf.classification ===\n") === rf.classification === > set.seed(2016) > rf.classification <- randomForest(survived~., data=etit, ntree=100, importance = FALSE) > plotmo(rf.classification, trace=1, type="prob", nresponse="surv", SHOWCALL=TRUE) stats::predict(randomForest.formula.object, data.frame[3,5], type="prob") stats::fitted(object=randomForest.formula.object) fitted() was unsuccessful, will use predict() instead got model response from model.frame(survived ~ pclass + sex + age + sibsp..., data=call$data, na.action="na.fail") randomForest built with importance=FALSE, ranking variables on MeanDecreaseGini plotmo grid: pclass sex age sibsp parch 1st male 38 0 0 > plotmo(rf.classification, trace=1, type="prob", nresponse="died", degree2=0, SHOWCALL=TRUE) stats::predict(randomForest.formula.object, data.frame[3,5], type="prob") stats::fitted(object=randomForest.formula.object) fitted() was unsuccessful, will use predict() instead nresponse=2 but for plotmo_y using nresponse=1 because ncol(y) == 1 got model response from model.frame(survived ~ pclass + sex + age + sibsp..., data=call$data, na.action="na.fail") randomForest built with importance=FALSE, ranking variables on MeanDecreaseGini plotmo grid: pclass sex age sibsp parch 1st male 38 0 0 > > cat("=== rf.classification.importance ===\n") === rf.classification.importance === > set.seed(2016) > rf.classification.importance <- randomForest(survived~., data=etit, ntree=100, importance = TRUE) > plotmo(rf.classification.importance, trace=1, type="prob", nresponse="surv", SHOWCALL=TRUE) stats::predict(randomForest.formula.object, data.frame[3,5], type="prob") stats::fitted(object=randomForest.formula.object) fitted() was unsuccessful, will use predict() instead got model response from model.frame(survived ~ pclass + sex + age + sibsp..., data=call$data, na.action="na.fail") randomForest built with importance=TRUE, ranking variables on MeanDecreaseAccuracy plotmo grid: pclass sex age sibsp parch 1st male 38 0 0 > > cat("=== plotres randomForest ===\n") === plotres randomForest === > plotres(rf.regression) > plotres(rf.regression.importance) > # TODO residuals are in range 0 to 1 > plotres(rf.classification, type="prob", nresponse="surv") > plotres(rf.classification.importance, type="prob", nresponse="surv") > > #--- fda ------------------------------------------------------------------------------ > > par(org.par) > par(mfrow=c(4,5)) > par(mar = c(3, 2, 3, .1)) # b, l, t, r > par(mgp = c(1.5, .5, 0)) > fda.earth <- fda(Species~., data=iris, keep.fitted=TRUE, method=earth, keepxy=TRUE) > fda.polyreg <- fda(Species~., data=iris, keep.fitted=TRUE, keepxy=TRUE) > fda.bruto <- fda(Species~., data=iris, keep.fitted=TRUE, method=bruto) > > # 'fda.polyreg$fit' does not have a 'call' field or 'x' and 'y' fields > expect.err(try(plotmo(fda.polyreg$fit, type="variates", nresponse=1, clip=F, do.par=F))) Error : 'fda.polyreg$fit' does not have a 'call' field or 'x' and 'y' fields Got expected error from try(plotmo(fda.polyreg$fit, type = "variates", nresponse = 1, clip = F, do.par = F)) > > plot(1, main="plotmo with fda", xaxt="n", yaxt="n", xlab="", ylab="", + type="n", bty="n", cex.main=1.2, xpd=NA) > > plotmo(fda.earth, type="variates", nresponse=1, clip=F, do.par=F) plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 5.8 3 4.35 1.3 > > plot(1, main="plotmo with fda.earth$fit", xaxt="n", yaxt="n", xlab="", ylab="", + type="n", bty="n", cex.main=1.2, xpd=NA) > > plotmo(fda.earth$fit, nresponse=1, clip=F, do.par=F) plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 5.8 3 4.35 1.3 > > plot(1, main="", xaxt="n", yaxt="n", xlab="", ylab="", + type="n", bty="n", cex.main=1.5, xpd=NA) > > plot(fda.earth) > plotmo(fda.earth, clip=F, do.par=F) # default type is class plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 5.8 3 4.35 1.3 > > plot(fda.polyreg) > plotmo(fda.polyreg, type="variates", nresponse=1, clip=F, do.par=F, degree1=c(1,3,4)) plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 5.8 3 4.35 1.3 > plot(1, main="", xaxt="n", yaxt="n", xlab="", ylab="", + type="n", bty="n", cex.main=1.5, xpd=NA) > > par(mfrow=c(3,3)) > par(mar = c(3, 2, 3, .1)) # b, l, t, r > par(mgp = c(1.5, .5, 0)) > plot(fda.bruto) > plotmo(fda.bruto, type="variates", nresponse=1, do.par=F) plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 5.8 3 4.35 1.3 > par(org.par) > > # neural net package > # for speed we use artificial data because neuralnet is very slow on say trees > library(neuralnet) > n <- 20 > set.seed(3) > x1 <- runif(n, min=-1, max=1) > x2 <- runif(n, min=-1, max=1) # x2 is noise > y <- x1^2 > data <- data.frame(y=y, x1=x1, x2=x2) > colnames(data) <- c("y","x1", "x2") > set.seed(3) > nn <- neuralnet(y~x1+x2, data=data, hidden=3, rep=3) > print(head(plotmo:::predict.nn(nn, rep="best", trace=TRUE))) predict.nn: rep = "best" is rep = 2 [,1] [1,] 0.46903930 [2,] 0.36653551 [3,] 0.02542870 [4,] 0.10970959 [5,] 0.06457524 [6,] 0.04182985 > set.seed(2020) > plotmo(nn, trace=1, col.response=2, all2=TRUE, SHOWCALL=TRUE) stats::predict(nn.object, data.frame[3,2], trace=TRUE) predict.nn: rep = "mean" will take the mean of 3 reps stats::fitted(object=nn.object) fitted() was unsuccessful, will use predict() instead assuming "y" in the model.frame is the response, because terms(object) did not return the terms assuming "y" in the model.frame is the response, because terms(object) did not return the terms got model response from model.frame(y ~ x1 + x2, data=object$data, na.action="na.fail") plotmo grid: x1 x2 0.09128479 -0.2904531 > # trace=0 below to test hushing of message "assuming "y" in the model.frame is the response, because object$terms is NULL" > set.seed(2020) > plotmo(nn, trace=0, col.response=2, predict.rep="best", SHOWCALL=TRUE) plotmo grid: x1 x2 0.09128479 -0.2904531 > plotres(nn, trace=0, info=TRUE, SHOWCALL=TRUE) > plotres(nn, trace=1, info=TRUE, predict.rep="best", SHOWCALL=TRUE) stats::residuals(object=nn.object, type="response") residuals() was unsuccessful, will use predict() instead stats::predict(nn.object, data.frame[3,2], trace=TRUE, rep="best") predict.nn: rep = "best" is rep = 2 stats::fitted(object=nn.object) fitted() was unsuccessful, will use predict() instead assuming "y" in the model.frame is the response, because terms(object) did not return the terms assuming "y" in the model.frame is the response, because terms(object) did not return the terms got model response from model.frame(y ~ x1 + x2, data=object$data, na.action="na.fail") assuming "y" in the model.frame is the response, because terms(object) did not return the terms training rsq 0.99 > > library(nnet) Attaching package: 'nnet' The following object is masked from 'package:mgcv': multinom > data(iris3) > set.seed(301) > samp <- c(sample(1:50,25), sample(51:100,25), sample(101:150,25)) > ird <- data.frame(rbind(iris3[,,1], iris3[,,2], iris3[,,3]), + species=factor(c(rep("seto",50), rep("vers", 50), rep("virg", 50)))) > ir.nn2 <- nnet(species ~ ., data = ird, subset = samp, size = 2, rang = 0.1, + decay = 5e-4, maxit = 20) # weights: 19 initial value 82.506969 iter 10 value 21.754594 iter 20 value 8.896424 final value 8.896424 stopped after 20 iterations > plotmo(ir.nn2, nresponse=1, type="class", all2=T, degree2=2:6) plotmo grid: Sepal.L. Sepal.W. Petal.L. Petal.W. 5.8 3 4.4 1.3 > plotmo(ir.nn2, nresponse=2, clip=F, all2=T, degree2=1:5) plotmo grid: Sepal.L. Sepal.W. Petal.L. Petal.W. 5.8 3 4.4 1.3 > plotres(ir.nn2, nresponse=2) > > library(biglm) Loading required package: DBI > data(trees) > ff <- log(Volume)~log(Girth)+log(Height) > chunk1 <- trees[1:20,] > chunk2 <- trees[20:31,] > biglm <- biglm(ff,chunk1) > biglm <- update(biglm, chunk2) > plotmo(biglm, pt.col=2, SHOWCALL=TRUE) plotmo grid: Girth Height 11.25 75 > plotres(biglm, SHOWCALL=TRUE) Warning: plotting 20 cases but the model was built with 32 cases > > library(adabag) Loading required package: caret Loading required package: ggplot2 Attaching package: 'ggplot2' The following object is masked from 'package:randomForest': margin Loading required package: lattice Attaching package: 'lattice' The following object is masked from 'package:faraway': melanoma Loading required package: doParallel Loading required package: iterators Loading required package: parallel > data(iris) > set.seed(2015) > # mfinal=3 for speed during testing > mod.boosting <- boosting(Species~., data=iris, mfinal=3) > mod.bagging <- bagging(Species~., data=iris, mfinal=3) > dopar(4, 4, caption="adabag package") adabag package > plotmo(mod.boosting, nresponse=1, ylim=c(0,1), do.par=FALSE) # default type="prob" plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 5.8 3 4.35 1.3 > plotmo(mod.boosting, type="class", do.par=FALSE) plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 5.8 3 4.35 1.3 > plotmo(mod.bagging, nresponse=1, ylim=c(0,1), do.par=FALSE) plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 5.8 3 4.35 1.3 > plotmo(mod.bagging, nresponse=1, type="votes", do.par=FALSE) plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 5.8 3 4.35 1.3 > par(org.par) > > library(e1071) Attaching package: 'e1071' The following object is masked from 'package:ggplot2': element > data(iris) > x.iris <- subset(iris, select=-Species) > y.iris <- iris$Species > set.seed(2016) > svm.xy <- svm(x.iris, y.iris, probability=FALSE) > par(mfrow = c(3, 3), mar = c(3, 3, 3, 1), mgp = c(1.5, 0.5, 0)) > expect.err(try(plotmo(svm.xy, prob=TRUE, nresponse="vers", do.par=TRUE, all2=TRUE))) # probability=FALSE in call to svm stats::predict(svm.object, data.frame[3,4], prob=TRUE) Error in predict.svm(structure(list(call = svm.default(x = x.iris, y = y.iris, : (converted from warning) SVM has not been trained using `probability = TRUE`, probabilities not available for predictions. Got expected error from try(plotmo(svm.xy, prob = TRUE, nresponse = "vers", do.par = TRUE, all2 = TRUE)) > plotmo(svm.xy, decision=TRUE, + nresponse="vers", do.par=FALSE, all2=TRUE, degree1=2:3, degree2=6) plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 5.8 3 4.35 1.3 > svm.xy <- svm(x.iris, y.iris, probability=TRUE) > plotmo(svm.xy, prob=TRUE, + nresponse="vers", do.par=FALSE, all2=TRUE, degree1=2:3, degree2=6) plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 5.8 3 4.35 1.3 > set.seed(2016) > svm.form <- svm(Species ~ ., data=iris, probability=T) > plotmo(svm.form, predict.p=TRUE, + nresponse="vers", do.par=FALSE, all2=TRUE, degree1=2:3, degree2=6) plotmo grid: Sepal.Length Sepal.Width Petal.Length Petal.Width 5.8 3 4.35 1.3 > expect.err(try(plotmo(svm.form, decision.values=TRUE, probab=TRUE))) # not both Error : predict.svm: specify either 'decision.values' or 'probability' (not both) Got expected error from try(plotmo(svm.form, decision.values = TRUE, probab = TRUE)) > plotres(svm.form, predict.prob=TRUE, nresponse="vers", info=TRUE) Cannot get training rsq (nresponse is 2 but the number of columns is only 1) > plotres(svm.form, jitter=5, info=TRUE) > par(org.par) > > source("test.epilog.R") plotmo/inst/slowtests/makeclean.bat0000755000176200001440000000075514273324334017237 0ustar liggesusers@rem makeclean.bat: clean up R package slowtests directory @rem make sure we are in the right directory @cd ..\..\.. @if %errorlevel% NEQ 0 goto err @cd plotmo\inst\slowtests @if %errorlevel% NEQ 0 goto err rm -rf Debug Release .vs rm -f ../../src/earth_res.rc ../Makedeps rm -f *.dll *.lib *.pdb *.map *.ilk rm -f *.ps *.pdf *.Rout *.exe *.out @goto done :err @echo ==== ERROR ==== @exit /B %errorlevel% :done @exit /B 0 plotmo/inst/slowtests/test.caret.Rout.save0000644000176200001440000003615214563614021020505 0ustar liggesusers> # test.caret.R: test plotmo on caret models > # > # TODO This is a minimal set of tests. > > source("test.prolog.R") > library(plotmo) Loading required package: Formula Loading required package: plotrix > library(earth) > library(caret) Loading required package: ggplot2 Loading required package: lattice > data(ozone1) > data(etitanic) > dopar <- function(nrows, ncols, caption = "") + { + cat(" ", caption, "\n") + par(mfrow=c(nrows, ncols)) + par(oma = c(0, 0, 3, 0)) + par(mar = c(3, 3, 1.7, 0.5)) + par(mgp = c(1.6, 0.6, 0)) + par(cex = 0.7) + } > set.seed(2010) > caret.earth.mod <- train(O3~., data=ozone1, method="earth", + tuneGrid=data.frame(degree=2, nprune=10)) > # SHOWCALL is just a testing thing, so we can see who created the plot on the plot itself > plotmo(caret.earth.mod, trace=1, SHOWCALL=TRUE) plotmo.prolog(object$finalModel) succeeded (caret model) stats::predict(train.object, data.frame[3,9], type="raw") stats::fitted(object=train.object) got model response from model.frame(O3 ~ vh + wind + humidity + temp + ib..., data=call$data, na.action="na.fail") plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > plotmo(caret.earth.mod$finalModel, trace=1, SHOWCALL=TRUE) stats::predict(earth.object, NULL, type="response") stats::fitted(object=earth.object) got model response from object$y plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > plotres(caret.earth.mod, trace=1, SHOWCALL=TRUE) plotmo.prolog(object$finalModel) succeeded (caret model) residuals() was unsuccessful, will use predict() instead stats::predict(train.object, data.frame[3,9], type="raw") stats::fitted(object=train.object) got model response from model.frame(O3 ~ vh + wind + humidity + temp + ib..., data=call$data, na.action="na.fail") training rsq 0.81 > # plotres(caret.earth.mod$finalModel, trace=1, SHOWCALL=TRUE) > > set.seed(2015) > bag <- bagEarth(O3~., data=ozone1, degree=2, B=3) > print(bag$fit) $Resample1 Selected 13 of 19 terms, and 7 of 9 predictors Termination condition: Reached nk 21 Importance: temp, humidity, ibt, doy, vis, dpg, wind, vh-unused, ... Number of terms at each degree of interaction: 1 4 8 GCV 10.06481 RSS 2726.679 GRSq 0.8269797 RSq 0.8570949 $Resample2 Selected 15 of 21 terms, and 7 of 9 predictors Termination condition: Reached nk 21 Importance: temp, ibh, humidity, doy, vh, dpg, wind, ibt-unused, ... Number of terms at each degree of interaction: 1 6 8 GCV 14.07142 RSS 3685.688 GRSq 0.7976107 RSq 0.8383817 $Resample3 Selected 16 of 21 terms, and 8 of 9 predictors Termination condition: Reached nk 21 Importance: temp, ibt, humidity, doy, vis, dpg, vh, ibh, wind-unused Number of terms at each degree of interaction: 1 7 8 GCV 12.3789 RSS 3187.464 GRSq 0.8064265 RSq 0.8480394 > # pairs are plotted correctly (I think) > plotmo(bag, type="response", trace=1, SHOWCALL=TRUE) stats::predict(bagEarth.object, data.frame[3,9], type="response") stats::fitted(object=bagEarth.object) fitted() was unsuccessful, will use predict() instead assuming "O3" in the model.frame is the response, because terms(object) did not return the terms assuming "O3" in the model.frame is the response, because terms(object) did not return the terms got model response from model.frame(O3 ~ ., data=call$data, na.action="na.fail") plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > plotres(bag, type="response", trace=1, SHOWCALL=TRUE) stats::residuals(object=bagEarth.object, type="response") residuals() was unsuccessful, will use predict() instead stats::predict(bagEarth.object, data.frame[3,9], type="response") stats::fitted(object=bagEarth.object) fitted() was unsuccessful, will use predict() instead assuming "O3" in the model.frame is the response, because terms(object) did not return the terms assuming "O3" in the model.frame is the response, because terms(object) did not return the terms got model response from model.frame(O3 ~ ., data=call$data, na.action="na.fail") assuming "O3" in the model.frame is the response, because terms(object) did not return the terms training rsq 0.83 > > set.seed(2015) > a.bag1 <- bagEarth(trees[,-3], trees[,3], degree=2, B = 3) > plotmo(a.bag1, trace=1, SHOWCALL=TRUE, all2=TRUE, caption="bagEarth, trees") stats::predict(bagEarth.object, data.frame[3,2], type="response") stats::fitted(object=bagEarth.object) fitted() was unsuccessful, will use predict() instead got model response from getCall(object)$y plotmo grid: Girth Height 12.9 76 > plotres(a.bag1, trace=1, SHOWCALL=TRUE) stats::residuals(object=bagEarth.object, type="response") residuals() was unsuccessful, will use predict() instead stats::predict(bagEarth.object, data.frame[3,2], type="response") stats::fitted(object=bagEarth.object) fitted() was unsuccessful, will use predict() instead got model response from getCall(object)$y training rsq 0.98 > > # trace=1 to display "Fixed rank deficient bx by removing 1 term" messages > set.seed(2015) > a.bag3 <- bagEarth(survived~., data=etitanic, degree=2, B=3, trace=1) x[1046,7] with colnames pclass1st pclass2nd pclass3rd sexmale age sibsp parch y[1046,1] with colname subY, and values 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,... weights: no weights (because all weights equal) Forward pass term 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 Reached nk 21 After forward pass GRSq 0.435 RSq 0.472 Prune backward penalty 3 nprune null: selected 10 of 15 terms, and 6 of 7 preds After pruning pass GRSq 0.444 RSq 0.468 x[1046,7] with colnames pclass1st pclass2nd pclass3rd sexmale age sibsp parch y[1046,1] with colname subY, and values 0, 0, 1, 1, 1, 0, 0, 0, 1, 1,... weights: no weights (because all weights equal) Forward pass term 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 Reached nk 21 After forward pass GRSq 0.385 RSq 0.434 Prune backward penalty 3 nprune null: selected 12 of 18 terms, and 6 of 7 preds After pruning pass GRSq 0.402 RSq 0.433 x[1046,7] with colnames pclass1st pclass2nd pclass3rd sexmale age sibsp parch y[1046,1] with colname subY, and values 1, 1, 0, 1, 1, 1, 0, 1, 0, 0,... weights: no weights (because all weights equal) Forward pass term 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 Reached nk 21 After forward pass GRSq 0.451 RSq 0.487 Prune backward penalty 3 nprune null: selected 13 of 15 terms, and 6 of 7 preds After pruning pass GRSq 0.456 RSq 0.487 > plotmo(a.bag3, clip=F, caption="bagEarth, etitanic", trace=1, SHOWCALL=TRUE) stats::predict(bagEarth.object, data.frame[3,7], type="response") stats::fitted(object=bagEarth.object) fitted() was unsuccessful, will use predict() instead assuming "survived" in the model.frame is the response, because terms(object) did not return the terms assuming "survived" in the model.frame is the response, because terms(object) did not return the terms got model response from model.frame(survived ~ ., data=call$data, na.action="na.fail") plotmo grid: pclass1st pclass2nd pclass3rd sexmale age sibsp parch 0 0 0 1 28 0 0 > plotres(a.bag3, clip=F, trace=1, SHOWCALL=TRUE) stats::residuals(object=bagEarth.object, type="response") residuals() was unsuccessful, will use predict() instead stats::predict(bagEarth.object, data.frame[3,7], type="response", clip=FALSE) stats::fitted(object=bagEarth.object) fitted() was unsuccessful, will use predict() instead assuming "survived" in the model.frame is the response, because terms(object) did not return the terms assuming "survived" in the model.frame is the response, because terms(object) did not return the terms got model response from model.frame(survived ~ ., data=call$data, na.action="na.fail") assuming "survived" in the model.frame is the response, because terms(object) did not return the terms training rsq 0.44 > > # following based on example by Max Kuhn on stackoverflow > etit <- etitanic > etit$survived <- factor(ifelse(etit$survived == 1, "yes", "no"), + levels = c("yes", "no")) > set.seed(2015) > caret.earth.mod2 <- train(survived ~ ., + data = etit, + method = "earth", + tuneGrid = data.frame(degree = 2, nprune = 9), + trControl = trainControl(method = "none", + classProbs = TRUE)) > # Following gives expected warning (because factors in caret-earth model) > # Warning: Cannot determine which variables to plot (use all1=TRUE?) > plotmo(caret.earth.mod2, trace=1, SHOWCALL=TRUE) plotmo.prolog(object$finalModel) succeeded (caret model) stats::predict(train.object, data.frame[3,5], type="raw") stats::fitted(object=train.object) got model response from model.frame(survived ~ pclass + sex + age + sibsp..., data=call$data, na.action="na.fail") Warning: Cannot determine which variables to plot (use all1=TRUE?) ncol(x) 5 < nrow(modvars) 6 colnames(x)=c(pclass,sex,age,sibsp,parch) rownames(modvars)=c(pclass2nd,pclass3rd,sexmale,age,sibsp,parch) plotmo grid: pclass sex age sibsp parch 3rd male 28 0 0 > # changed Sep 2020: following with all2=2 generates the same plot as above (because with warning, above defaults to all2=TRUE) > plotmo(caret.earth.mod2, trace=1, all2=TRUE, SHOWCALL=TRUE, caption="caret.earth.mod2: all2=2") plotmo.prolog(object$finalModel) succeeded (caret model) stats::predict(train.object, data.frame[3,5], type="raw") stats::fitted(object=train.object) got model response from model.frame(survived ~ pclass + sex + age + sibsp..., data=call$data, na.action="na.fail") Warning: Cannot determine which variables to plot (use all1=TRUE?) ncol(x) 5 < nrow(modvars) 6 colnames(x)=c(pclass,sex,age,sibsp,parch) rownames(modvars)=c(pclass2nd,pclass3rd,sexmale,age,sibsp,parch) plotmo grid: pclass sex age sibsp parch 3rd male 28 0 0 > plotres(caret.earth.mod2, trace=1, SHOWCALL=TRUE) plotmo.prolog(object$finalModel) succeeded (caret model) residuals() was unsuccessful, will use predict() instead stats::predict(train.object, data.frame[3,5], type="raw") stats::fitted(object=train.object) got model response from model.frame(survived ~ pclass + sex + age + sibsp..., data=call$data, na.action="na.fail") training rsq 0.21 > > # Sep 2020: test with a logical variable (check that get.earth.vars.for.plotmo strips "sexTRUE" to "sex") > # following should be exactly the same model as caret.earth.mod2 except for the variable naming for sex > etit.bool <- etitanic > etit.bool$survived <- factor(ifelse(etit.bool$survived == 1, "yes", "no"), + levels = c("yes", "no")) > etit.bool$sex <- etit.bool$sex == "male" # to bool > set.seed(2015) # same random seed as above (may not be necessary) > caret.earth.boolfac <- train(survived ~ ., + data = etit.bool, + method = "earth", + tuneGrid = data.frame(degree = 2, nprune = 9), + trControl = trainControl(method = "none", + classProbs = TRUE)) > print(summary(caret.earth.boolfac)) Call: earth(x=matrix[1046,6], y=factor.object, keepxy=TRUE, glm=list(family=function.object, maxit=100), degree=2, nprune=9) GLM coefficients no (Intercept) -2.9135260 pclass3rd 5.0300560 sexTRUE 3.1856245 h(age-32) 0.0375715 pclass2nd * sexTRUE 1.7680945 pclass3rd * sexTRUE -1.2226954 pclass3rd * h(4-sibsp) -0.6186527 sexTRUE * h(16-age) -0.2418140 GLM (family binomial, link logit): nulldev df dev df devratio AIC iters converged 1414.62 1045 892.794 1038 0.369 908.8 5 1 Earth selected 8 of 17 terms, and 5 of 6 predictors (nprune=9) Termination condition: Reached nk 21 Importance: sexTRUE, pclass3rd, pclass2nd, age, sibsp, parch-unused Number of terms at each degree of interaction: 1 3 4 Earth GCV 0.1404529 RSS 141.7629 GRSq 0.4197106 RSq 0.4389834 > > plotmo(caret.earth.boolfac, trace=0, SHOWCALL=TRUE) # Warning: Cannot determine which variables to plot (use all1=TRUE?) Warning: Cannot determine which variables to plot (use all1=TRUE?) ncol(x) 5 < nrow(modvars) 6 colnames(x)=c(pclass,sex,age,sibsp,parch) rownames(modvars)=c(pclass2nd,pclass3rd,sexTRUE,age,sibsp,parch) plotmo grid: pclass sex age sibsp parch 3rd TRUE 28 0 0 > # changed Sep 2020: following with all1=TRUE, all2=TRUE generates the same plot as above > plotmo(caret.earth.boolfac, trace=0, all1=TRUE, all2=TRUE, SHOWCALL=TRUE, caption="caret.earth.mod2: all1=T, all2=T") plotmo grid: pclass sex age sibsp parch 3rd TRUE 28 0 0 > > data(ozone1) > set.seed(2020) > a <- train(O3 ~ ., data = ozone1, method = "earth", + tuneGrid = data.frame(degree = 2, nprune = 14)) > plotmo(a, trace=1, SHOWCALL=TRUE) plotmo.prolog(object$finalModel) succeeded (caret model) stats::predict(train.object, data.frame[3,9], type="raw") stats::fitted(object=train.object) got model response from model.frame(O3 ~ vh + wind + humidity + temp + ib..., data=call$data, na.action="na.fail") plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > plotres(a, trace=1, SHOWCALL=TRUE) plotmo.prolog(object$finalModel) succeeded (caret model) residuals() was unsuccessful, will use predict() instead stats::predict(train.object, data.frame[3,9], type="raw") stats::fitted(object=train.object) got model response from model.frame(O3 ~ vh + wind + humidity + temp + ib..., data=call$data, na.action="na.fail") training rsq 0.83 > > cat("=== method=\"svmRadial\" (S4 model wrapped in an S3 model) ===\n") === method="svmRadial" (S4 model wrapped in an S3 model) === > data(trees) > set.seed(2019) > library(kernlab) Attaching package: 'kernlab' The following object is masked from 'package:ggplot2': alpha > mod <- train(Girth~., data=trees, method="svmRadial", + trControl=trainControl(method="cv", number=2), + tuneLength=2, preProcess = c("center", "scale")) > plotres(mod, info=TRUE) > set.seed(2020) > plotmo(mod, pt.col=2, all2=TRUE, pmethod="partdep") calculating partdep for Height calculating partdep for Volume calculating partdep for Height:Volume 01234567890 > > source("test.epilog.R") plotmo/inst/slowtests/test.glmnetUtils.Rout.save0000644000176200001440000002615214563614021021715 0ustar liggesusers> # test.glmnet.R: glmnetUtils tests for plotmo and plotres > > source("test.prolog.R") > library(earth) Loading required package: Formula Loading required package: plotmo Loading required package: plotrix > library(glmnetUtils) > data(ozone1) > data(etitanic) > get.tit <- function() # abbreviated titanic data + { + tit <- etitanic + pclass <- as.character(tit$pclass) + # change the order of the factors so not alphabetical + pclass[pclass == "1st"] <- "first" + pclass[pclass == "2nd"] <- "class2" + pclass[pclass == "3rd"] <- "classthird" + tit$pclass <- factor(pclass, levels=c("class2", "classthird", "first")) + # log age is so we have a continuous predictor even when model is age~. + set.seed(2015) + tit$logage <- log(tit$age) + rnorm(nrow(tit)) + tit$parch <- NULL + # by=12 gives us a small fast model with an additive and a interaction term + tit <- tit[seq(1, nrow(etitanic), by=12), ] + } > plotmores <- function(object, ..., trace=0, SHOWCALL=TRUE, title.extra="", ncol=2) { + old.par <- par(no.readonly=TRUE) + on.exit(par(old.par)) + par(mfrow=c(2,ncol)) + caption <- paste(deparse(substitute(object)), collapse=" ") + call <- match.call(expand.dots=TRUE) + call <- strip.space(paste(deparse(substitute(call)), collapse=" ")) + call <- gsub(",", ", ", call) + call <- paste(title.extra, call, sep="") + printf("%s\n", call) + # plotmo on glmnet mods is boring but we test it anyway + plotres(object, trace=trace, SHOWCALL=SHOWCALL, do.par=FALSE, which=c(1,3), ...) + title(paste("\n", call), outer=TRUE) + plotmo(object, trace=trace, SHOWCALL=SHOWCALL, do.par=FALSE, ...) + } > tit <- get.tit() > set.seed(2015) > xmat <- as.matrix(tit[,c(2,5,6)]) > agedata <- data.frame(tit[,4], xmat) > colnames(agedata) <- c("age", "survived", "sibsp", "logage") > set.seed(2015) > mod.glmnet.xmat <- glmnet(xmat, tit[,4]) # tit[,4] is age > plotres(mod.glmnet.xmat) > plotmo(mod.glmnet.xmat) plotmo grid: survived sibsp logage 0 0 3.06991 > plotmores(mod.glmnet.xmat, predict.s=2.5) plotmores(object=mod.glmnet.xmat, predict.s=2.5) plotmo grid: survived sibsp logage 0 0 3.06991 > > mod.glmnet.agedata <- glmnet(age~., data=agedata) > expect.err(try(plotres(mod.glmnet.agedata)), "for this plot, glmnet.formula must be called with use.model.frame=TRUE") Error : for this plot, glmnet.formula must be called with use.model.frame=TRUE Got expected error from try(plotres(mod.glmnet.agedata)) > mod.glmnet.agedata <- glmnet(age~., data=agedata, use.model.frame=TRUE) > plotmores(mod.glmnet.agedata, predict.s=2.5) plotmores(object=mod.glmnet.agedata, predict.s=2.5) plotmo grid: survived sibsp logage 0 0 3.06991 > > set.seed(2015) > mod.cv.glmnet.xmat <- cv.glmnet(xmat, tit[,4], nfolds=3) > > cat("==Test plotmo trace=1 and lambda.min\n") ==Test plotmo trace=1 and lambda.min > plotmores(mod.cv.glmnet.xmat, predict.s="lambda.min", trace=1, ncol=3) plotmores(object=mod.cv.glmnet.xmat, predict.s="lambda.min", trace=1, ncol=3) stats::residuals(object=cv.glmnet.object, type="response") residuals() was unsuccessful, will use predict() instead stats::predict(cv.glmnet.object, matrix[3,3], type="response", s="lambda.min") stats::fitted(object=cv.glmnet.object) fitted() was unsuccessful, will use predict() instead got model response from getCall(object)$y graphics::plot(cv.glmnet.object) training rsq 0.29 stats::predict(cv.glmnet.object, matrix[3,3], type="response", s="lambda.min") stats::fitted(object=cv.glmnet.object) fitted() was unsuccessful, will use predict() instead got model response from getCall(object)$y plotmo grid: survived sibsp logage 0 0 3.06991 > > set.seed(2015) > mod.cv.glmnet.agedata <- cv.glmnet(age~., data=agedata) > expect.err(try(plotres(mod.cv.glmnet.agedata)), "for this plot, cv.glmnet.formula must be called with use.model.frame=TRUE") Error : for this plot, cv.glmnet.formula must be called with use.model.frame=TRUE Got expected error from try(plotres(mod.cv.glmnet.agedata)) > set.seed(2015) > mod.cv.glmnet.agedata <- cv.glmnet(age~., data=agedata, use.model.frame=TRUE) > cat("==Test lambda.min\n") ==Test lambda.min > plotmores(mod.cv.glmnet.agedata, predict.s="lambda.min", trace=1, ncol=3) plotmores(object=mod.cv.glmnet.agedata, predict.s="lambda.min", trace=1, ncol=3) stats::residuals(object=cv.glmnet.formula.object, type="response") residuals() was unsuccessful, will use predict() instead stats::predict(cv.glmnet.formula.object, data.frame[3,3], type="response", s="lambda.min") stats::fitted(object=cv.glmnet.formula.object) fitted() was unsuccessful, will use predict() instead got model response from model.frame(age ~ survived + sibsp + logage, data=call$data, na.action="na.omit") graphics::plot(cv.glmnet.formula.object) training rsq 0.33 stats::predict(cv.glmnet.formula.object, data.frame[3,3], type="response", s="lambda.min") stats::fitted(object=cv.glmnet.formula.object) fitted() was unsuccessful, will use predict() instead got model response from model.frame(age ~ survived + sibsp + logage, data=call$data, na.action="na.omit") plotmo grid: survived sibsp logage 0 0 3.06991 > > printf("======== binomial model\n") ======== binomial model > > set.seed(2016) > n <- 50 > p <- 4 > xx <- matrix(rnorm(n*p), n, p) > colnames(xx) <- paste("x", 1:ncol(xx), sep="") > yy <- ifelse(xx[,1] + xx[,2] + rnorm(n) > .5, TRUE, FALSE) > print(cov(xx, yy)) [,1] x1 0.19664644 x2 0.19303946 x3 0.11937700 x4 0.03037754 > yy <- factor(yy) > dataxy <- data.frame(yy, xx) > binomial.mod <- glmnet(xx, yy, family="binomial") > plotmores(binomial.mod, ncol=3) plotmores(object=binomial.mod, ncol=3) plotmo grid: x1 x2 x3 x4 -0.2965405 -0.03311923 0.2416254 0.01017809 > binomial.mod.form <- glmnet(yy~., data=dataxy, family="binomial", use.model.frame=TRUE) > plotmores(binomial.mod.form, ncol=3) plotmores(object=binomial.mod.form, ncol=3) plotmo grid: x1 x2 x3 x4 -0.2965405 -0.03311923 0.2416254 0.01017809 > par(org.par) > > printf("======== glmnet family=\"mgaussian\"\n") ======== glmnet family="mgaussian" > set.seed(2015) > p <- 10 > n <- 30 > xx <- cbind((1:n)/n, matrix(rnorm(n*(p-1)),n,p-1)) > colnames(xx) <- paste0("x", 1:p) > # ymultresp <- cbind(rowSums(xx[,1:5]^3), rowSums(xx[,5:p]^3), 1:n) > set.seed(1) > ymultresp <- cbind(xx[,1]+.001*rnorm(n), rowSums(xx[,2:5]^3), rnorm(n)) > glmnet.mgaussian <- glmnet(xx, ymultresp, family="mgaussian") > plotres(glmnet.mgaussian, nresponse=1, SHOWCALL=TRUE, which=c(1:3), do.par=2, info=1) > # manually calculate the residuals > plot(x=predict(glmnet.mgaussian, newx=xx, s=0)[,1,1], + y=ymultresp[,1] - predict(glmnet.mgaussian, newx=xx, s=0)[,1,1], + pch=20, xlab="Fitted", ylab="Residuals", + main="Manually calculated residuals, nresponse=1, s=0") > abline(h=0, col="gray") > par(org.par) > > # # TODO is glmnet mgaussian supported with a formula interface? > # dataxy <- data.frame(ymultresp, xx) > # colnames(dataxy) <- c("y1", "y2", "y3", "x1", "x2", "x3", "x4", "x5", "x5", "x6", "x7", "x8", "x9", "x10") > # glmnet.mgaussian.form <- glmnet(xx, ymultresp, family="mgaussian") > # plotres(glmnet.mgaussian.form, nresponse=1, SHOWCALL=TRUE, which=c(1:3), do.par=2, info=1) > > par(mfrow=c(2,3), mar=c(3,3,3,.5), oma=c(0,0,3,0), mgp=c(1.5,0.4,0), tcl=-0.3) > > data(trees) > set.seed(2015) > # variable with a long name > x50 <- cbind(trees[,1:2], Girth12345678901234567890=rnorm(nrow(trees))) > mod.with.long.name <- glmnet(data.matrix(x50),data.matrix(trees$Volume)) > plotmores(mod.with.long.name, ncol=3) plotmores(object=mod.with.long.name, ncol=3) plotmo grid: Girth Height Girth12345678901234567890 12.9 76 0.004544606 > data.x50 <- data.frame(trees$Volume, x50) > colnames(data.x50) <- c("Volume", "Girth", "Height", "Girth12345678901234567890") > mod.with.long.name.form <- glmnet(Volume~., data=data.x50, use.model.frame=TRUE) > plotmores(mod.with.long.name.form, ncol=3) plotmores(object=mod.with.long.name.form, ncol=3) plotmo grid: Girth Height Girth12345678901234567890 12.9 76 0.004544606 > par(org.par) > > #-- make sure that we can work with all families > > set.seed(2016) > par(mfrow=c(3,3), mar=c(3,3,3,1)) > n <- 100 > p <- 4 > xx <- matrix(rnorm(n*p), n, p) > g2 <- sample(1:2, n, replace=TRUE) > data.xg2 <- data.frame(g2, xx) > for(family in c("gaussian","binomial","poisson")) { + title.extra <- paste(family, ": ") + mod <- glmnet(xx,g2,family=family) + plotmores(mod, xvar="lambda", ncol=3, title.extra=title.extra) + title.extra <- paste("formula", family, ": ") + mod.form <- glmnet(g2~., data.xg2, family=family, use.model.frame=TRUE) + plotmores(mod.form, xvar="lambda", ncol=3, title.extra=title.extra) + } gaussian : plotmores(object=mod, xvar="lambda", title.extra=title.extra, ncol=3) plotmo grid: x1 x2 x3 x4 -0.2662071 0.1805768 0.03613807 0.2422419 formula gaussian : plotmores(object=mod.form, xvar="lambda", title.extra=title.extra, ncol=3) plotmo grid: X1 X2 X3 X4 -0.2662071 0.1805768 0.03613807 0.2422419 binomial : plotmores(object=mod, xvar="lambda", title.extra=title.extra, ncol=3) plotmo grid: x1 x2 x3 x4 -0.2662071 0.1805768 0.03613807 0.2422419 formula binomial : plotmores(object=mod.form, xvar="lambda", title.extra=title.extra, ncol=3) plotmo grid: X1 X2 X3 X4 -0.2662071 0.1805768 0.03613807 0.2422419 poisson : plotmores(object=mod, xvar="lambda", title.extra=title.extra, ncol=3) plotmo grid: x1 x2 x3 x4 -0.2662071 0.1805768 0.03613807 0.2422419 formula poisson : plotmores(object=mod.form, xvar="lambda", title.extra=title.extra, ncol=3) plotmo grid: X1 X2 X3 X4 -0.2662071 0.1805768 0.03613807 0.2422419 > par(org.par) > # cox > library(plotmo) > n <- 100 > p <- 20 > nzc <- trunc(p/10) > set.seed(2016) > beta <- rnorm(nzc) > x7 <- matrix(rnorm(n*p), n, p) > beta <- rnorm(nzc) > fx <- x7[,seq(nzc)] %*% beta/3 > hx <- exp(fx) > ty <- rexp(n, hx) > tcens <- rbinom(n=n, prob=.3, size=1)# censoring indicator > yy <- cbind(time=ty, status=1-tcens) # yy=Surv(ty,1-tcens) with library(survival) > glmnet.cox <- glmnet(x=x7, y=yy, family="cox") > plotmores(glmnet.cox, ncol=3, degree1=1:4) plotmores(object=glmnet.cox, degree1=1:4, ncol=3) plotmo grid: x1 x2 x3 x4 x5 x6 -0.2662071 0.1805768 0.1144668 0.2262892 0.1050429 -0.02858422 x7 x8 x9 x10 x11 x12 x13 -0.0799275 0.08172409 -0.107284 0.2036831 0.08643651 -0.0435986 0.1664937 x14 x15 x16 x17 x18 x19 x20 -0.003946797 -0.1313896 0.1714765 0.2209166 -0.2018331 -0.1230542 -0.04088624 > par(org.par) > # TODO formula interface not tested for cox models > > source("test.epilog.R") plotmo/inst/slowtests/make.README.R0000644000176200001440000000041013725307662016612 0ustar liggesusers# create README.html from README.md # the paths below assume that this file is in the plotmo/inst/slowtests directory library(rpart.plot) library(rmarkdown) rmarkdown::render("../../README.md", output_dir="../../.#") if(!interactive()) q(runLast=FALSE) plotmo/inst/slowtests/make.README.figs.R0000644000176200001440000000310413725307662017544 0ustar liggesusers# make.README.figs.R: Build the figures used by plotmo README.md # The paths below assume that this file is in the plotmo/inst/slowtests directory # Swindon May 2018 library(plotmo) library(earth) # for the ozone1 data data(ozone1) library(randomForest) oz <- ozone1[, c("O3", "humidity", "temp")] # small set for illustration set.seed(2018) rf.mod <- randomForest(O3 ~ ., data=oz) # png("../../inst/README-figures/plotmo-randomForest.png", width=460, height=500) # plotmo(rf.mod, cex.caption=1.5, font.caption=2, oma=c(0,0,5,0), # persp.ticktype="detailed", persp.nticks=2) # dev.off() # png("../../inst/README-figures/plotres-randomForest.png", width=460, height=530) # set.seed(2018) # plotres(rf.mod, cex=1.1, cex.caption=1.5, font.caption=2, oma=c(1,0,3,0)) # dev.off() # png("../../inst/README-figures/plotres-glmnet-gbm.png", width=700, height=400) # par(mfrow=c(1,2), oma=c(1,0,0,0)) # library(glmnet) # set.seed(2016) # x <- matrix(rnorm(100 * 10), 100, 10) # y <- x[,1] + x[,2] + 3 * rnorm(100) # y depends only on x[,1] and x[,2] # mod <- glmnet(x, y) # plotres(mod, which=1, predict.s=0.25, cex=1.2, pt.cex=.8) # title("glmnet model\n\n\n") # library(gbm) # library(earth); data(ozone1) # get the ozone data # set.seed(2017) # oz <- ozone1[sample.int(n=nrow(ozone1)),] # randomize row order for train.fraction # gbm.mod <- gbm(O3~., data=oz, distribution="gaussian", interaction.depth=2, # shrinkage=.01, train.fraction=.8, cv.folds=10, n.trees=3000) # plotres(gbm.mod, which=1) # title("gbm model\n\n", xpd=NA) # dev.off() plotmo/inst/slowtests/test.unusual.vars.bat0000755000176200001440000000173315124635472020744 0ustar liggesusers@rem test.unusual.vars.bat: test unusual variable names and formulas @rem this file was first created for plotmo 3.6.0 (Sep 2020) @echo test.unusual.vars.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.unusual.vars.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.unusual.vars.Rout: @echo. @tail test.unusual.vars.Rout @echo test.unusual.vars.R @exit /B 1 :good1 mks.diff test.unusual.vars.Rout test.unusual.vars.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.unusual.vars.save.ps @exit /B 1 :good2 @rem test.unusual.vars.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.unusual.vars.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.unusual.vars.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/test.plotres.Rout.save0000644000176200001440000003563315124637434021111 0ustar liggesusers> # test.plotres.R > > source("test.prolog.R") > library(earth) Loading required package: Formula Loading required package: plotmo Loading required package: plotrix > data(ozone1) > data(etitanic) > example(plotres) plotrs> # we use lm in this example, but plotres is more useful for models plotrs> # that don't have a function like plot.lm for plotting residuals plotrs> plotrs> lm.model <- lm(Volume~., data=trees) plotrs> plotres(lm.model) > > # basic tests of plotmo on abbreviated titanic data > > get.tit <- function() + { + tit <- etitanic + pclass <- as.character(tit$pclass) + # change the order of the factors so not alphabetical + pclass[pclass == "1st"] <- "first" + pclass[pclass == "2nd"] <- "class2" + pclass[pclass == "3rd"] <- "classthird" + tit$pclass <- factor(pclass, levels=c("class2", "classthird", "first")) + # log age is so we have a continuous predictor even when model is age~. + set.seed(2015) + tit$logage <- log(tit$age) + rnorm(nrow(tit)) + tit$parch <- NULL + # by=12 gives us a small fast model with an additive and a interaction term + tit <- tit[seq(1, nrow(etitanic), by=12), ] + } > > tit <- get.tit() > > plotlm1 <- function(object) + { + old.par <- par(no.readonly=TRUE) + on.exit(par(old.par)) + par(mfrow=c(2,2), oma=c(0,0,3,0), mar=c(4, 3, 3, 1.5), + mgp=c(1.5, 0.4, 0), tcl=-.3, font.main=1, cex.main=1) + plot(object, sub.caption="standard call to plot.lm") + } > plotlm.using.plotres <- function(object) + { + old.par <- par(no.readonly=TRUE) + on.exit(par(old.par)) + par(mfrow=c(2,2), oma=c(0,0,3,0), mar=c(4, 3, 3, 1.5), + mgp=c(1.5, 0.4, 0), tcl=-.3, font.main=1, cex.main=1) + # residuals vs fitted + plotres(object, pch=1, which=3, + caption=paste(deparse(object$call), collapse=" ")) + # QQ plot + plotres(object, pch=1, which=4, standardize=TRUE) + # scale-location plot + plotres(object, pch=1, which=6, standardize=TRUE) + # leverage plot + plotres(object, pch=1, which=3, versus=4, standardize=TRUE) + } > lm.mod <- lm(Volume~., data=trees) > plotlm1(lm.mod) > plotlm.using.plotres(lm.mod) > > # various arguments > > plotres(lm.mod, SHOWCALL=TRUE) > plotres(lm.mod, level=.95, id.n=-3, SHOWCALL=TRUE) > lm.tit <- lm(survived~., data=tit) > col <- ifelse(tit$survived, "green", "red") > pch <- ifelse(tit$sex == "male", 20, 6) > plotres(lm.tit, level=.95, col=col, pch=pch, + level.shade="gray", level.shade2="lightgray", SHOWCALL=TRUE) > plotres(lm.tit, col.resp=3, cum.col=2, cum.cex=1.2, grid.col=5, qq.col=1, qq.cex=.3, SHOWCALL=TRUE) > plotres(lm.tit, pt.col="pink", smooth.col=0, SHOWCALL=TRUE) > plotres(lm.tit, smooth.col=3, smooth.lwd=1.2, smooth.lty=2, smooth.f=.2, + label.col=4, label.cex=.9, label.font=2, SHOWCALL=TRUE) > foo <- function() + { + afoo <- earth(O3~., data=ozone1, deg=2) + old.par <- par(no.readonly=TRUE) + on.exit(par(old.par)) + par(mfrow=c(2,2), oma=c(0,0,3,0), mar=c(4, 3, 3, 1.5), + mgp=c(1.5, 0.4, 0), tcl=-.3, font.main=1, cex.main=1) + # test xlim ylim etc. on qq and cum plots + plotres(afoo, which=2, trace=0, xlim=c(0,20), ylim=c(-.2,1.1), grid.col="pink", info=TRUE) + plotres(afoo, which=2, trace=0, + grid.col="pink", info=TRUE, cum.col=2, cum.cex=1.4) + plotres(afoo, which=4) + plotres(afoo, which=4, trace=0, xlim=c(-7,7), ylim=c(-20, 20), + qq.col=2, qq.cex=.5, label.col=1, qqline.col="orange", qqline.lty=1) + # check xlim and ylim apply only to resids plots if multiple plots + plotres(afoo, which=c(2:5), trace=0, xlim=c(-1,5), ylim=c(-8, 8), + qq.col=2, qq.cex=.5, label.col=1, qqline.col="orange", smooth.col=3, smooth.lwd=2) + } > foo() > > # test id.n and npoints > set.seed(1066) > a20 <- earth(Volume~., data=trees, ncr=3, nfo=3, varmod.method="lm", keepxy=TRUE) > par(mfrow=c(2,2), oma=c(0,0,3,0), mar=c(4, 3, 3, 1.5), mgp=c(1.5, 0.4, 0), tcl=-.3, cex=1) > plot(a20, which=3, standardize=TRUE, smooth.col=0, id.n=-1, main="a20-00, smooth.col=0, id.n=-1", + caption="test id.n and npoints") > plot(a20, which=3, standardize=TRUE, smooth.col=0, id.n=10, main="a20-01, smooth.col=0, id.n=10") > # this tests cex with do.par=FALSE > plot(a20, which=3, standardize=TRUE, smooth.col=0, npoints=10, cex=.8, main="a20-02, smooth.col=0, npoints=10, cex=.8") > # TODO labels are hosed in the following > plot(a20, which=3, standardize=TRUE, smooth.col=0, npoints=5, id.n=10, main="a20-03, labels hosed\nsmooth.col=0, npoints=10, id.n=10") > > # test leverages and handling of unity leverages > lm.mod <- lm(Volume~., data=trees) > par(mfrow=c(2,2), oma=c(0,0,3,0), mar=c(4, 3, 3, 1.5), mgp=c(1.5, 0.4, 0), tcl=-.3, cex=1) > a20$leverages[31] <- 1 # fake a unity leverage > plot(a20, which=3, versus=4, standardize=TRUE, main="resids vs leverage\nunity leverage", + caption="leverage plots") > plotres(a20, which=3, standardize=TRUE, main="resids vs fitted\nunity leverage") > plotres(lm.mod, which=3, versus=4, standardize=TRUE, main="lever plot for lm.mod") > plotres(lm.mod, which=3, versus=4, standardize=TRUE, main="cook args", + cook.levels=c(.5, .8, 1), cook.col="blue", cook.lty=2) > > plot(a20, which=3, versus=4, standardize=TRUE, info=TRUE, main="resids vs leverage\nunity leverage", + caption="leverage plots with info=TRUE") > plotres(a20, which=3, standardize=TRUE, info=TRUE, main="resids vs fitted\nunity leverage") > plotres(lm.mod, which=3, versus=4, standardize=TRUE, info=TRUE, main="lever plot for lm.mod") > plotres(lm.mod, which=3, versus=4, standardize=TRUE, info=TRUE, main="cook args", + cook.levels=c(.5, .8, 1), cook.col="blue", cook.lty=2) > > # back compat tests > par(mfrow=c(2,2), oma=c(0,0,3,0), mar=c(4, 3, 3, 1.5), mgp=c(1.5, 0.4, 0), tcl=-.3) > plotres(a20, which=3, col.smooth=4, smooth.lwd=2, smooth.lty=2, + main="a20-04 col.smooth=4, smooth.lwd=2, smooth.lty=2", + caption="back compat tests with plot.earth") > plotres(a20, which=4, qq.col=3, + qqline.col="lightblue", qqline.lty=2, main="a20-05 qq.col=3") > plotres(a20, which=4, qqline.col=0, main="a20-06 qqline.col=0") > # set.seed(1066) > # mod.earth.tit <- earth(tit[,-3], tit[,3], degree=2, nfold=3, ncross=3, varmod.method="earth", keepxy=TRUE) > plot(0,0) > plot(a20, which=1, col.grid="pink", col.rsq=3, lty.rsq=1, main="a20-07 col.grid=\"pink\", col.rsq=3, lty.rsq=1") > > # TODO following not working? > plot(a20, which=3, col.cv=4, col.grid="pink", main="a20-08 col.cv=4, col.grid=\"pink\"") > > plot(a20, which=3, col.points="orange", cex.points=1.5, main="a20-09 col.points=\"orange\", cex.points=1.5") > plot(a20, which=3, col.residuals="orange", smooth.f=.2, col.line=3, main="a20-10 col.residuals=\"orange\", smooth.f=.2, col.line=3") > > # test graphics args outside do.par > par(col.main="#456789") > cat("before par: cex=", par("cex"), " col.main=", par("col.main"), " col.axis=", par("col.axis"), "\n", sep="") before par: cex=0.83 col.main=#456789 col.axis=black > plot(a20, which=c(2,3), caption="a20 which=c(2,3) (i.e. do.par=TRUE) no cex") > plot(a20, which=c(2,3), cex=1, caption="a20 which=c(2,3) (i.e. do.par=TRUE) cex=1, plot should be identical to previous page") > plot(a20, which=c(2,3), cex=1.2, caption="a20 which=c(2,3) (i.e. do.par=TRUE) cex=1.2") > plot(a20, which=3, main="no cex", caption="a20 test graphics args with do.par=FALSE") > plot(a20, which=3, cex=1, main="cex=1") > plot(a20, which=3, cex=.8, main="cex=.8") > plot(a20, which=3, cex=1.1, col.main=2, col.axis="blue", col.lab=3, font.lab=2, + main="cex=1.1, col.main=2, col.axis=\"blue\", col.lab=3, font.lab=2") > # all of these should have been restored > cat("after par: cex=", par("cex"), " col.main=", par("col.main"), " col.axis=", par("col.axis"), "\n", sep="") after par: cex=0.83 col.main=#456789 col.axis=black > stopifnot(par("col.main") == "#456789") > par(col.main=1) > > survived <- as.numeric(tit$survived) # 0 or 1 > sex <- as.numeric(tit$sex) # 1 or 2 > pclass <- as.numeric(tit$pclass) # 1,2, or 3 > age <- tit$age # .2 to 80 > > printf("======== basic operation, compare to plot.lm etc.\n") ======== basic operation, compare to plot.lm etc. > par(mfrow=c(2,2), mar=c(3,3,3,1), mgp=c(1.5,0.5,0), oma=c(0,0,2.5,0)) > lm <- lm(survived~sex+pclass+age) > plot(lm, which=5, pch=20) > plot(0, 0) > plot(lm, which=1, pch=20) > plot(lm, which=2, pch=20) > plotres(lm, standardize=1, cook.levels=c(.1,.2,.3), SHOWCALL=TRUE) > elm <- earth(survived~sex+pclass+age, linpreds=TRUE, thresh=0, penalty=-1) > plotres(elm, col=survived+2, SHOWCALL=TRUE) > set.seed(2015) > elm.glm <- earth(survived~sex+pclass+age, linpreds=TRUE, thresh=0, penalty=-1, + glm=list(family=binomial), + ncr=3, nfold=3, varmod.method="lm") > plotres(elm.glm, col=survived+2, SHOWCALL=TRUE) > > printf("======== check type arg with earth\n") ======== check type arg with earth > par(mfrow=c(2,2), mar=c(3,3,3,1), mgp=c(1.5,0.5,0), oma=c(0,0,2.5,0)) > # following two are equivalent > # TODO $$ following look wrong (the plots have changed from plotmo/earth pre Sep 2020) > plotres(elm.glm, col=survived+2, standardize=TRUE, + which=3, do.par=FALSE, main="standardize=TRUE") > mtext("elm.glm with various type options", outer=TRUE, font=2, line=1, cex=1) > plotres(elm.glm, col=survived+2, type="standardize", + which=3, do.par=FALSE, main="type=\"standardize\"\nequivalent to standardize=TRUE") > # TODO double standardization, should not be allowed > plotres(elm.glm, col=survived+2, standardize=TRUE, type="standardize", + which=3, do.par=FALSE, + main="standard=TRUE, type=\"deviance\"\ndouble standardization") > plotres(elm.glm, col=survived+2, type="deviance", + which=3, do.par=FALSE, main="type=\"deviance\"") > > printf("======== multiple response earth models\n") ======== multiple response earth models > par(mfrow=c(2,2), mar=c(3,3,3,1), mgp=c(1.5,0.5,0), oma=c(0,0,2.5,0)) > set.seed(2015) > emulti0 <- earth(cbind(Volume, Volume + 100 + 5 * rnorm(nrow(trees)))~., data=trees) > set.seed(2015) > plot(emulti0, nresponse=2, which=3, do.par=FALSE, main="emulti0 nresponse=2") > set.seed(2015) > rnorm1 <- rnorm(nrow(trees)) > emulti <- earth(cbind(Volume, Volume + 100 + 5 * rnorm1)~., data=trees) > plot(emulti, nresponse=2, + which=3, do.par=FALSE, main="emulti nresponse=2") > mtext("multiple response earth models", outer=TRUE, font=2, line=1, cex=1) > plot(emulti, nresponse=2, FORCEPREDICT=TRUE, + which=3, do.par=FALSE, main="emulti, nresponse=2\nFORCEPREDICT=TRUE") > > printf("======== earth model with a factor response\n") ======== earth model with a factor response > epclass <- earth(pclass~., data=tit) > par(mfrow=c(2,2), mar=c(3,3,3,1), mgp=c(1.5,0.5,0), oma=c(0,0,2.5,0)) > set.seed(2015) > plot(epclass, nresponse="first", trace=1, + which=3, do.par=FALSE, main="pclass response, nresponse=\"first\"") stats::residuals(object=earth.object, type="response") stats::fitted(object=earth.object) got model response from model.frame(pclass ~ survived + sex + age + sibsp..., data=call$data, na.action="na.fail") training rsq 0.23 > mtext("earth model with a factor response", outer=TRUE, font=2, line=1, cex=1) > plot(epclass, nresponse="first", trace=1, FORCEPREDICT=TRUE, + which=3, do.par=FALSE, + main="pclass response, nresponse=\"first\"\nFORCEPREDICT=TRUE") stats::predict(earth.object, NULL, type="response") stats::fitted(object=earth.object) got model response from model.frame(pclass ~ survived + sex + age + sibsp..., data=call$data, na.action="na.fail") training rsq 0.23 > > printf("======== glm\n") ======== glm > glm <- glm(survived~sex+pclass+age, family=binomial) > par(mfrow=c(2,2), mar=c(3,3,3,1), mgp=c(1.5,0.5,0), oma=c(0,0,2.5,0)) > plot(glm, which=1, pch=20, main="plot.lm") > mtext("glm model with plot.lm and plotres", outer=TRUE, font=2, line=1, cex=1) > plotres(glm, which=3, main="plotres glm survived") > # with plotres we can also plot pearson etc. residuals > plotres(glm, which=3, type="pearson", main="plotres glm survived\ntype=\"pearson\"") > > printf("======== rpart\n") ======== rpart > library(rpart) > par(mfrow=c(2,2), mar=c(3,3,3,1), mgp=c(1.5,0.5,0), oma=c(0,0,2.5,0)) > rpart <- rpart(survived~sex+pclass+age) > plotres(rpart, SHOWCALL=TRUE) > plotres(rpart, SHOWCALL=TRUE, FORCEPREDICT=TRUE) # identical > # TODO following fails in plotmo.predict.rpart (which is called to get the fitted values) > # plotres(rpart, type="pearson") > plotres(rpart, jitter=3, w1.extra=100, w1.under=TRUE, w1.branch.type=5, + col=survived+2, smooth.col=NA, label.col=1, SHOWCALL=TRUE) > > fit <- rpart(Kyphosis ~ Age + Number + Start, data = kyphosis) > plotres(fit, nresponse=1, SHOWCALL=TRUE, jitter=5) > plotres(fit, nresponse=2, SHOWCALL=TRUE, jitter=TRUE) > > printf("======== versus=\"b:\"\n") ======== versus="b:" > > library(gam) Loading required package: splines Loading required package: foreach Loaded gam 1.22-7 > gam.package.loaded <- "package:gam" %in% search() > mgcv.package.loaded <- "package:mgcv" %in% search() > if(mgcv.package.loaded && gam.package.loaded) { + # prevent downstream confusing error messages + stop0("both 'gam' and 'mgcv' are loaded") + } > library(earth) > data(ozone1) > data(ozone1) > oz <- ozone1[, c("O3", "humidity", "temp", "ibt")] > gam.mod <- gam(O3^(1/3) ~ lo(humidity)+lo(ibt,temp), data=oz) > plotmo(gam.mod, SHOWCALL=TRUE) plotmo grid: humidity ibt temp 64 167.5 62 > plotres(gam.mod, SHOWCALL=TRUE) > plotres(gam.mod, versus="b:", SHOWCALL=TRUE) > plotres(gam.mod, versus="b:ib", info=TRUE, SHOWCALL=TRUE) > > gam.linear.humidity.only <- gam(O3^(1/3) ~ humidity, data=oz) > plotres(gam.linear.humidity.only, versus="b:", SHOWCALL=TRUE) > > library(mda) Loading required package: class Loaded mda 0.5-5 > mars <- mars(ozone1[,2:3], ozone1[,1], degree=2) > mars.to.earth <- mars.to.earth(mars) Converted mars(x=ozone1[,2:3], y=ozone1[,1], degree=2) to earth(x=ozone1[,2:3], y=ozone1[,1], degree=2) > plotres(mars, versus="b:", caption="mars model, versus=\"b:\"", SHOWCALL=TRUE) > plotres(mars.to.earth, versus="b:", caption="earth model, versus=\"b:\", should be same as previous page", SHOWCALL=TRUE) > plotres(mars, versus="b:1", caption="mars model, versus=\"b:1\"", SHOWCALL=TRUE) > > # lars is tested in plotmo3.R > # gbm is tested in plotmo3.R > # TODO fda is not tested > > source("test.epilog.R") plotmo/inst/slowtests/test.plotres.bat0000755000176200001440000000145715124635472017771 0ustar liggesusers@rem test.plotres.bat: test plotres @echo test.plotres.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.plotres.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.plotres.Rout: @echo. @tail test.plotres.Rout @echo test.plotres.R @exit /B 1 :good1 mks.diff test.plotres.Rout test.plotres.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.plotres.save.ps @exit /B 1 :good2 @rem test.plotres.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.plotres.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.plotres.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/linmod.R0000644000176200001440000002555313727275573016251 0ustar liggesusers# linmod.R: Example S3 linear model. # # See www.milbo.org/doc/modguide.pdf. # This software may be freely used. linmod <- function(...) UseMethod("linmod") linmod.default <- function(x = stop("no 'x' argument"), y = stop("no 'y' argument"), keep = FALSE, ...) { stop.if.dot.arg.used(...) xmat <- as.matrix(x) # use name "(Intercept)" here so coef names match linmod.formula x <- cbind("(Intercept)" = 1, xmat) fit <- linmod.fit(x, y) fit$call <- match.call() if(keep) { fit$x <- xmat # save y as a one-column matrix, so can use colname to save response name colname <- deparse(substitute(y))[1] colname <- gsub(" ", "", substr(colname, 1, 100)) # strip spaces, truncate fit$y <- as.matrix(y, ncol = 1) colnames(fit$y) <- colname } fit } linmod.formula <- function(formula = stop("no 'formula' argument"), data = parent.frame(), keep = FALSE, ...) { stop.if.dot.arg.used(...) if(is.matrix(data)) # allow data to be a matrix data <- as.data.frame(data) # will create colnames V1 V2 V3 if necessary # note that na.action=na.pass because we will catch NAs later # in linmod.fit, for uniformity with linmod.default mf <- model.frame(formula = formula, data = data, na.action = na.pass) terms <- attr(mf, "terms") x <- model.matrix(terms, mf) y <- model.response(mf) fit <- linmod.fit(x, y) fit$call <- match.call() fit$terms <- terms fit$xlevels <- .getXlevels(terms, mf) # for use by predict.linmod if(keep) fit$data <- data fit } linmod.fit <- function(x = stop("no 'x' argument"), y = stop("no 'y' argument"), ...) { # internal function, not for the casual user # if model has an intercept, the first col of x must be intercept (all 1s) stop.if.dot.arg.used(...) x <- check.linmod.x(x) y <- check.linmod.y(x, y) fit <- do.linmod.fit(x, y) class(fit) <- "linmod" fit } check.linmod.x <- function(x) { if(!is.matrix(x)) stop("'x' is not a matrix or could not be converted to a matrix") if(NROW(x) == 0 || NCOL(x) == 0) stop("'x' is empty") if(anyNA(x)) stop("NA in 'x'") # checking just the first column of x suffices because all columns # of a matrix have the same type # we allow is.logical because qr etc. treat logical vars as numeric if(!is.numeric(x[,1]) && !is.logical(x[,1])) stop("non-numeric column in 'x'") # ensure all columns in x are named (needed for names in vcov etc.) # use the same naming convention as lm (prefix for unnamed cols is "V") missing.colnames <- if(is.null(colnames(x))) 1:NCOL(x) else nchar(colnames(x)) == 0 colnames(x)[missing.colnames] <- c("(Intercept)", paste("V", seq_len(NCOL(x) - 1), sep = ""))[missing.colnames] duplicated <- which(duplicated(colnames(x))) if(length(duplicated)) stop("column name \"", colnames(x)[duplicated[1]], "\" in 'x' is duplicated") x } check.linmod.y <- function(x, y) { # as.vector(as.matrix(y)) is necessary when y is a data.frame # (because as.vector alone on a data.frame returns a data.frame) y <- as.vector(as.matrix(y)) if(length(y) == 0) stop("'y' is empty") if(anyNA(y)) stop("NA in 'y'") if(!is.numeric(y) && !is.logical(y)) stop("'y' is not numeric or logical") if(length(y) != nrow(x)) stop("nrow(x) is ", nrow(x), " but length(y) is ", length(y)) y } do.linmod.fit <- function(x, y) { # workhorse function for fitting linear models # essential processing and sanity checks on x and y are already completed # x is a numeric matrix, y is a numeric vector qx <- qr(x) # QR-decomposition of x if(qx$rank < ncol(x)) stop("'x' is singular (it has ", ncol(x), " columns but its rank is ", qx$rank, ")\n colnames(x): ", paste0(colnames(x), collapse=' ')) coef <- solve.qr(qx, y) # compute (x'x)^(-1) x'y stopifnot(!anyNA(coef)) # NA impossible after rank check above df.residual <- max(0, nrow(x) - ncol(x)) # degrees of freedom sigma2 <- sum((y - x %*% coef)^2) / df.residual # variance of residuals vcov <- sigma2 * chol2inv(qx$qr) # covar mat is sigma^2 * (x'x)^(-1) fitted.values <- qr.fitted(qx, y) colnames(vcov) <- rownames(vcov) <- colnames(x) names(fitted.values) <- rownames(x) colnames(coef) <- colnames(y) # returned fields match lm's fields list(coefficients = coef, residuals = y - fitted.values, rank = qx$rank, fitted.values = fitted.values, vcov = vcov, sigma = sqrt(sigma2), df.residual = df.residual) } predict.linmod <- function(object = stop("no 'object' argument"), newdata = NULL, type = "response", ...) { stopifnot(inherits(object, "linmod")) stop.if.dot.arg.used(...) match.arg(type, "response") # the type argument is not yet supported if(is.null(newdata)) yhat <- fitted(object) else { if(NROW(newdata) == 0) stop("'newdata' is empty") # preempt obscure message later x <- if(is.null(object$terms)) # model built with linmod.default? process.newdata(object, newdata) else # model built with linmod.formula process.newdata.formula(object, newdata) # The following tests suffice to catch all illegal input. However # they aren't ideal in that they don't always direct you to the root # cause of the problem (i.e. the error messages aren't always optimal). nvar <- length(object$coefficients) - 1 # nbr vars, -1 for intercept if(ncol(x) - 1 != nvar) stop("ncol(newdata) is ", ncol(x) - 1, " but should be ", nvar) if(anyNA(x)) stop("NA in 'newdata'") if(!is.numeric(x[,1]) && !is.logical(x[,1])) stop("non-numeric column in 'newdata' (after processing)") yhat <- as.vector(do.predict.linmod(object, x)) names(yhat) <- rownames(x) } yhat } process.newdata <- function(object, newdata) { # process newdata for models built with linmod.default x <- if(is.vector(newdata)) # allow newdata to be a vector matrix(newdata, ncol = length(object$coefficients) - 1) else as.matrix(newdata) # allow newdata to be a data.frame cbind(1, x) # return data with an intercept column } process.newdata.formula <- function(object, newdata) { # process newdata for models built with linmod.formula newdata <- as.data.frame(newdata) # allows newdata to be a matrix terms <- object$terms dataClasses <- attr(terms, "dataClasses") iresp <- attr(terms, "response") terms <- delete.response(terms) # na.action=na.pass because we will catch NAs after (for clearer error msg) # xlevels is needed to convert strings to factor levels, for example: # a <- linmod(Sepal.Length~Species,data=iris) # predict(a,newdata=data.frame(Species="setosa")) mf <- model.frame(terms, newdata, na.action = na.pass, xlev = object$xlevels) if(anyNA(mf)) stop("NA in 'newdata'") if(NROW(mf) != NROW(newdata)) { # Get here when model.frame() issues # Warning: 'newdata' had M rows but variables found have N rows # Must stop, else the call to model.matrix() below would silently return bad data. # If a variable is missing, print its name to help the user. # TODO This will erroneously identify "sqrt(x)" as a missing var in the # formula "y ~ sqrt(x)" (because the var is wrapped in a func call). varnames <- names(dataClasses) varnames <- varnames[-iresp] missing <- which(!(varnames %in% colnames(newdata))) missing.msg <- "" if(length(missing)) missing.msg <- paste0(" (variable '", varnames[missing[1]], "' may be missing from newdata)") stop("newdata has ", NROW(newdata), " rows but model.frame returned ", NROW(mf), " rows", missing.msg) } .checkMFClasses(dataClasses, mf) # check types in newdata match original data model.matrix(terms, mf) } do.predict.linmod <- function(object, x) { # workhorse function for linear model predictions # processing by model.matrix etc. and sanity checks on x already completed # x is a numeric matrix (if model has intercept, first col of x is all 1s) x %*% coef(object) } summary.linmod <- function(object = stop("no 'object' argument"), ...) { stop.if.dot.arg.used(...) se <- sqrt(diag(object$vcov)) t.value <- coef(object) / se p.value <- if(object$df.residual == 0) # avoid warning from pt() rep_len(0, length.out=length(t.value)) else 2 * pt(-abs(t.value), df = object$df.residual) coefficients <- cbind(Estimate = coef(object), StdErr = se, t.value = t.value, p.value = p.value) retval <- list(call = object$call, coefficients = coefficients) class(retval) <- "summary.linmod" retval } print.linmod <- function(x = stop("no 'x' argument"), ...) { stop.if.dot.arg.used(...) print.model.call(x) print(x$coefficients) invisible(x) } print.summary.linmod <- function(x = stop("no 'x' argument"), ...) { stop.if.dot.arg.used(...) print.model.call(x) print(x$coefficients) invisible(x) } print.model.call <- function(x) { cat("Call: ") # print.lm has a newline here, but a space is more compact # use paste0 to convert vector of strings to single string if necessary cat(strwrap(paste0(deparse(x$call, control = NULL, nlines = 5), sep = " ", collapse = " "), exdent = 6), sep = "\n") cat("\n") } # stop.if.dot.arg.used will cause an error message if any args are passed to it. # We use it to test if any dots arg of the calling function was used, for # functions that must have a dots arg (to match the generic method) but don't # actually use the dots. This helps the user catch mistyped or illegal args. # R version 3.3-0 or higher has a function chkDots which could be used instead. stop.if.dot.arg.used <- function() { NULL } plotmo/inst/slowtests/test.plotmo3.bat0000755000176200001440000000151615124635472017672 0ustar liggesusers@rem test.plotmo3.bat: extra tests for plotmo version 3 and higher @echo test.plotmo3.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.plotmo3.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.plotmo3.Rout: @echo. @tail test.plotmo3.Rout @echo test.plotmo3.R @exit /B 1 :good1 mks.diff test.plotmo3.Rout test.plotmo3.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.plotmo3.save.ps @exit /B 1 :good2 @rem test.plotmo3.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.plotmo3.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.plotmo3.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/test.linmod.bat0000755000176200001440000000147015124635472017556 0ustar liggesusers@rem test.linmod.bat: test example S3 model in linmod.R @echo test.linmod.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.linmod.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.linmod.Rout: @echo. @tail test.linmod.Rout @echo test.linmod.R @exit /B 1 :good1 mks.diff test.linmod.Rout test.linmod.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.linmod.save.ps @exit /B 1 :good2 @rem test.linmod.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.linmod.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.linmod.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/test.caret.R0000644000176200001440000001041513737416673017031 0ustar liggesusers# test.caret.R: test plotmo on caret models # # TODO This is a minimal set of tests. source("test.prolog.R") library(plotmo) library(earth) library(caret) data(ozone1) data(etitanic) dopar <- function(nrows, ncols, caption = "") { cat(" ", caption, "\n") par(mfrow=c(nrows, ncols)) par(oma = c(0, 0, 3, 0)) par(mar = c(3, 3, 1.7, 0.5)) par(mgp = c(1.6, 0.6, 0)) par(cex = 0.7) } set.seed(2010) caret.earth.mod <- train(O3~., data=ozone1, method="earth", tuneGrid=data.frame(degree=2, nprune=10)) # SHOWCALL is just a testing thing, so we can see who created the plot on the plot itself plotmo(caret.earth.mod, trace=1, SHOWCALL=TRUE) plotmo(caret.earth.mod$finalModel, trace=1, SHOWCALL=TRUE) plotres(caret.earth.mod, trace=1, SHOWCALL=TRUE) # plotres(caret.earth.mod$finalModel, trace=1, SHOWCALL=TRUE) set.seed(2015) bag <- bagEarth(O3~., data=ozone1, degree=2, B=3) print(bag$fit) # pairs are plotted correctly (I think) plotmo(bag, type="response", trace=1, SHOWCALL=TRUE) plotres(bag, type="response", trace=1, SHOWCALL=TRUE) set.seed(2015) a.bag1 <- bagEarth(trees[,-3], trees[,3], degree=2, B = 3) plotmo(a.bag1, trace=1, SHOWCALL=TRUE, all2=TRUE, caption="bagEarth, trees") plotres(a.bag1, trace=1, SHOWCALL=TRUE) # trace=1 to display "Fixed rank deficient bx by removing 1 term" messages set.seed(2015) a.bag3 <- bagEarth(survived~., data=etitanic, degree=2, B=3, trace=1) plotmo(a.bag3, clip=F, caption="bagEarth, etitanic", trace=1, SHOWCALL=TRUE) plotres(a.bag3, clip=F, trace=1, SHOWCALL=TRUE) # following based on example by Max Kuhn on stackoverflow etit <- etitanic etit$survived <- factor(ifelse(etit$survived == 1, "yes", "no"), levels = c("yes", "no")) set.seed(2015) caret.earth.mod2 <- train(survived ~ ., data = etit, method = "earth", tuneGrid = data.frame(degree = 2, nprune = 9), trControl = trainControl(method = "none", classProbs = TRUE)) # Following gives expected warning (because factors in caret-earth model) # Warning: Cannot determine which variables to plot (use all1=TRUE?) plotmo(caret.earth.mod2, trace=1, SHOWCALL=TRUE) # changed Sep 2020: following with all2=2 generates the same plot as above (because with warning, above defaults to all2=TRUE) plotmo(caret.earth.mod2, trace=1, all2=TRUE, SHOWCALL=TRUE, caption="caret.earth.mod2: all2=2") plotres(caret.earth.mod2, trace=1, SHOWCALL=TRUE) # Sep 2020: test with a logical variable (check that get.earth.vars.for.plotmo strips "sexTRUE" to "sex") # following should be exactly the same model as caret.earth.mod2 except for the variable naming for sex etit.bool <- etitanic etit.bool$survived <- factor(ifelse(etit.bool$survived == 1, "yes", "no"), levels = c("yes", "no")) etit.bool$sex <- etit.bool$sex == "male" # to bool set.seed(2015) # same random seed as above (may not be necessary) caret.earth.boolfac <- train(survived ~ ., data = etit.bool, method = "earth", tuneGrid = data.frame(degree = 2, nprune = 9), trControl = trainControl(method = "none", classProbs = TRUE)) print(summary(caret.earth.boolfac)) plotmo(caret.earth.boolfac, trace=0, SHOWCALL=TRUE) # Warning: Cannot determine which variables to plot (use all1=TRUE?) # changed Sep 2020: following with all1=TRUE, all2=TRUE generates the same plot as above plotmo(caret.earth.boolfac, trace=0, all1=TRUE, all2=TRUE, SHOWCALL=TRUE, caption="caret.earth.mod2: all1=T, all2=T") data(ozone1) set.seed(2020) a <- train(O3 ~ ., data = ozone1, method = "earth", tuneGrid = data.frame(degree = 2, nprune = 14)) plotmo(a, trace=1, SHOWCALL=TRUE) plotres(a, trace=1, SHOWCALL=TRUE) cat("=== method=\"svmRadial\" (S4 model wrapped in an S3 model) ===\n") data(trees) set.seed(2019) library(kernlab) mod <- train(Girth~., data=trees, method="svmRadial", trControl=trainControl(method="cv", number=2), tuneLength=2, preProcess = c("center", "scale")) plotres(mod, info=TRUE) set.seed(2020) plotmo(mod, pt.col=2, all2=TRUE, pmethod="partdep") source("test.epilog.R") plotmo/inst/slowtests/test.mlr.R0000644000176200001440000003721514015545377016526 0ustar liggesusers# test.mlr.R: test the "mlr" package with plotmo and plotres # # TODO mlr is in maintenance mode, add mlr3 support to plotmo? # TODO generally, plotres residuals for WrappedModel prob models aren't right source("test.prolog.R") library(mlr) library(plotmo) library(rpart.plot) library(earth) # TODO following function is temporary until mlr package is updated train.with.call <- function(learner, task, subset=NULL, weights=NULL) { retval <- train(learner, task, subset, weights) retval$call <- match.call() retval } cat("==simple one variable regression model with earth ===============================\n") data(trees) trees1 <- trees[,c("Volume", "Girth")] task <- makeRegrTask(data=trees1, target="Volume") lrn <- makeLearner("regr.earth", degree=2) regr.earth.with.call = train.with.call(lrn, task) regr.earth = train(lrn, task) earth <- earth(Volume~., data=trees1, degree=2) # SHOWCALL is just a testing thing, so we can see who created the plot on the plot itself plotres(regr.earth.with.call, SHOWCALL=TRUE) plotres(regr.earth$learner.model, SHOWCALL=TRUE) plotres(earth, SHOWCALL=TRUE) plotmo(regr.earth.with.call, trace=1, SHOWCALL=TRUE) plotmo(regr.earth$learner.model, trace=1, SHOWCALL=TRUE) plotmo(earth, trace=1, SHOWCALL=TRUE) # compare partial dependence plots from mlr and plotmo packages set.seed(2018) plotmo(earth, pmethod="partdep", SHOWCALL=TRUE, col=2, pt.col="darkgray", grid.col="lightgray") set.seed(2018) pd <- generatePartialDependenceData(regr.earth, task, "Girth", n=c(50, NA)) print(plotPartialDependence(pd, data = getTaskData(task))) cat("==test error handling if original data is messed up===========================\n") par(mfrow=c(4,2), mar=c(1.5,2.5,4,1), oma=c(0,0,0,0)) colnames(trees1) <- c("nonesuch", "Volume") plotmo(regr.earth$learner.model, do.par=0, degree1=1, degree2=0, main='colnames(trees1) <- c("nonesuch", "Volume")') plotmo(regr.earth.with.call, do.par=0, degree1=1, degree2=0) par(org.par) expect.err(try(plotmo(earth, degree1=1, degree2=0)), "cannot get the original model predictors") cat("==regression model with randomForest (binary response)============================\n") library(randomForest) library(earth) # for etitanic data data(etitanic) set.seed(2018) # use a logical subset (since we test for numeric subset elsewhere) # use a small subset so we can see easily if subset is applied or ignored in plots train.subset <- rnorm(nrow(etitanic)) > 1 # 166 cases ((16% of 1046 cases)) printf("sum(train.subset) %g (%.0f%% of %g cases)\n", sum(train.subset), 100 * sum(train.subset) / nrow(etitanic), nrow(etitanic)) task.regr.rf <- makeRegrTask(data=etitanic, target="survived") lrn.regr.rf = makeLearner("regr.randomForest") set.seed(2018) regr.rf.with.call = train.with.call(lrn.regr.rf, task.regr.rf, subset=train.subset) set.seed(2018) rf <- randomForest(survived~., data=etitanic, subset=train.subset) # sanity check that the models are identical stopifnot(identical(predict(regr.rf.with.call$learner.model), predict(rf))) plotres(regr.rf.with.call, info=TRUE, SHOWCALL=TRUE) # plotres(regr.rf$learner.model, info=TRUE, SHOWCALL=TRUE) # Error: no formula in getCall(object) plotres(rf, info=TRUE, SHOWCALL=TRUE) set.seed(2018) # for repeatable jitter in points (specified with pt.col) plotmo(regr.rf.with.call, pt.col=2, SHOWCALL=TRUE) # plotmo(regr.rf$learner.model, trace=1, SHOWCALL=TRUE) # Error: no formula in getCall(object) set.seed(2018) plotmo(rf, pt.col=2, SHOWCALL=TRUE) # compare partial dependence plots set.seed(2018) plotmo(regr.rf.with.call, degree1="age", degree2=0, pmethod="partdep", grid.col="gray", col=2, pt.col="darkgray", SHOWCALL=TRUE) # function from randomForest package set.seed(2018) partialPlot(rf, pred.data=etitanic[train.subset,], x.var="age", n.pt=50, ylim=c(0, 1)) grid() # function from mlr package set.seed(2018) pd <- generatePartialDependenceData(regr.rf.with.call, task.regr.rf, "age", n=c(50, NA)) print(plotPartialDependence(pd, data = getTaskData(task.regr.rf))) plotmo(regr.rf.with.call, degree1="pclass", degree2=0, pmethod="partdep", SHOWCALL=TRUE) set.seed(2018) # function from randomForest package set.seed(2018) partialPlot(rf, pred.data=etitanic[train.subset,], x.var="pclass", n.pt=50, ylim=c(0, 1)) grid() # TODO following fails pd <- generatePartialDependenceData(regr.rf.with.call, task.regr.rf, "pclass", n=c(50, NA)) try(print(plotPartialDependence(pd, data = getTaskData(task.regr.rf)))) # Error: Discrete value supplied to continuous scale cat("==classification model with randomForest (binary response)======================\n") set.seed(2018) library(earth) # for etitanic data data(etitanic) etit <- etitanic etit$survived <- factor(etit$survived, labels=c("notsurvived", "survived")) task.classif.rf <- makeClassifTask(data=etit, target="survived") lrn.classif.rf <- makeLearner("classif.randomForest", predict.type="prob") set.seed(2018) classif.rf.with.call <- train.with.call(lrn.classif.rf, task.classif.rf, , subset=train.subset) set.seed(2018) rf <- randomForest(survived~., data=etit, method="class", subset=train.subset) # sanity check that the models are identical stopifnot(identical(predict(classif.rf.with.call$learner.model), predict(rf))) # TODO following causes Error: classif.earth: Setting parameter glm without available description object # lrn <- makeLearner("classif.earth", degree=2, glm=list(family=binomial)) # TODO residuals on WrappedModel don't match direct call to rf model set.seed(2018) # for repeatable jitter plotres(classif.rf.with.call, nresponse="prob.survived", SHOWCALL=TRUE, jitter=2) set.seed(2018) plotres(classif.rf.with.call$learner.model, type="prob", SHOWCALL=TRUE, jitter=2) set.seed(2018) plotres(rf, type="prob", SHOWCALL=TRUE, jitter=2) options(warn=2) # treat warnings as errors expect.err(try(plotmo(classif.rf.with.call)), "Defaulting to nresponse=1, see above messages") options(warn=1) set.seed(2018) # for repeatable jitter plotmo(classif.rf.with.call, SHOWCALL=TRUE, nresponse="prob.survived", pt.col=2, trace=2) set.seed(2018) plotmo(classif.rf.with.call$learner.model, SHOWCALL=TRUE, type="prob", pt.col=2) set.seed(2018) # note that in the following, get.y.shift.scale (in plotmo code) rescales the plotted y to 0..1 plotmo(rf, SHOWCALL=TRUE, type="prob", pt.col="gray") set.seed(2018) # in following graph, note that get.y.shift.scale doesn't rescale the plotted y because ylim=c(0,2) plotmo(rf, SHOWCALL=TRUE, type="prob", ylim=c(0,2), pt.col="gray") # compare partial dependence plots set.seed(2018) plotmo(rf, type="prob", degree1="pclass", degree2=0, pmethod="partdep", pt.col=2, SHOWCALL=TRUE) set.seed(2018) plotmo(rf, degree1="pclass", degree2=0, pmethod="partdep", pt.col=2, SHOWCALL=TRUE) set.seed(2018) # TODO following fails pd <- generatePartialDependenceData(classif.rf.with.call, task.classif.rf, "pclass", n=c(50, NA)) try(print(plotPartialDependence(pd, data = getTaskData(task.classif.rf)))) # Error: Discrete value supplied to continuous scale plotmo(rf, type="prob", nresponse="notsurvived", degree1="age", degree2=0, pmethod="partdep", ylim=c(.3,.75), nrug=TRUE, grid.col="gray") # looks plausible set.seed(2018) pd <- generatePartialDependenceData(classif.rf.with.call, task.classif.rf, "age", n=c(50, NA)) print(plotPartialDependence(pd, data = getTaskData(task.classif.rf))) cat("==examples from plotmo-notes.pdf ===============================================\n") #-- Regression model with mlr ------------------------------------------- library(mlr) library(plotmo) lrn <- makeLearner("regr.svm") fit1.with.call <- train.with.call(lrn, bh.task) fit1 <- train(lrn, bh.task) # generate partial dependence plots for all variables # we use "apartdep" and not "partdep" to save testing time plotmo(fit1.with.call, pmethod="apartdep") plotmo(fit1$learner.model, pmethod="apartdep") # generate partial dependence plot for just "lstat" set.seed(2018) # so slight jitter on pt.col points in plotmo doesn't change across test runs plotmo(fit1.with.call, degree1="lstat", # what predictor to plot degree2=0, # no interaction plots pmethod="partdep", # generate partial dependence plot pt.col=2, grid.col="gray", # optional bells and whistles nrug=TRUE) # rug ticks along the bottom set.seed(2018) # so slight jitter on pt.col points in plotmo doesn't change across test runs plotmo(fit1$learner.model, degree1="lstat", # what predictor to plot degree2=0, # no interaction plots pmethod="partdep", # generate partial dependence plot pt.col=2, grid.col="gray", # optional bells and whistles nrug=TRUE) # rug ticks along the bottom # compare to the function provided by the mlr package set.seed(2018) pd <- generatePartialDependenceData(fit1, bh.task, "lstat", n=c(50, NA)) print(plotPartialDependence(pd, data = getTaskData(bh.task))) # # TODO following fails: Error: Discrete value supplied to continuous scale # pd <- generatePartialDependenceData(fit1, bh.task, "chas", n=c(50, NA)) # plotPartialDependence(pd, data = getTaskData(bh.task)) #-- Classification model with mlr --------------------------------------- lrn.classif.rpart <- makeLearner("classif.rpart", predict.type = "prob", minsplit = 10) fit2.with.call <- train.with.call(lrn.classif.rpart, iris.task) fit2 <- train(lrn.classif.rpart, iris.task) # generate partial dependence plots for all variables # TODO plotmo can plot the response for only one class at a time plotmo(fit2.with.call, nresponse="prob.virginica", # what response to plot # type="prob", # type gets passed to predict.rpart pmethod="apartdep") # generate partial dependence plot plotmo(fit2$learner.model, nresponse="virginica", # what response to plot type="prob", # type gets passed to predict.rpart pmethod="apartdep") # generate partial dependence plot # generate partial dependence plot for just "Petal.Length" plotmo(fit2.with.call, degree1="Petal.Length", # what predictor to plot degree2=0, # no interaction plots nresponse="prob.virginica", # what response to plot # type="prob", # type gets passed to predict.rpart pmethod="apartdep") # generate partial dependence plot plotmo(fit2$learner.model, degree1="Petal.Length", # what predictor to plot degree2=0, # no interaction plots nresponse="virginica", # what response to plot type="prob", # type gets passed to predict.rpart pmethod="apartdep") # generate partial dependence plot # compare to the function provided by the mlr package set.seed(2018) pd <- generatePartialDependenceData(fit2, iris.task, "Petal.Length", n=c(50, NA)) print(plotPartialDependence(pd, data = getTaskData(iris.task))) cat("==lda example from mlr documentation, and plotmo error handling =================\n") set.seed(2018) data(iris) task.lda <- makeClassifTask(data=iris, target="Species") lrn.lda <- makeLearner("classif.lda") n <- nrow(iris) train.set <- sample(n, size=2/3*n) test.set <- setdiff(1:n, train.set) classif.lda.with.call <- train.with.call(lrn.lda, task.lda, subset=train.set) classif.lda <- train(lrn.lda, task.lda, subset=train.set) iris1 <- iris[train.set, ] library(MASS) lda <- lda(Species~., data=iris1) # expect.err(try(plotres(classif.lda.with.call)), "plotres does not (yet) support type=\"class\" for \"lda\" objects") expect.err(try(plotres(classif.lda$learner.model)), "plotres does not (yet) support type=\"class\" for \"lda\" objects") options(warn=2) # treat warnings as errors # expect.err(try(plotres(classif.lda.with.call, type="response")), "predict.lda returned multiple columns (see above) but nresponse is not specified") expect.err(try(plotres(classif.lda$learner.model, type="response")), "Defaulting to nresponse=1, see above messages") options(warn=1) expect.err(try(plotres(classif.lda.with.call, type="response", nresponse="nonesuch")), "nresponse=\"nonesuch\" is not allowed") expect.err(try(plotres(classif.lda$learner.model, type="response", nresponse="nonesuch")), "nresponse=\"nonesuch\" is not allowed") expect.err(try(plotres(classif.lda.with.call, type="response", nresponse=0)), "nresponse=0 but it should be at least 1") expect.err(try(plotres(classif.lda$learner.model, type="response", nresponse=0)), "nresponse=0 but it should be at least 1") expect.err(try(plotres(classif.lda.with.call, type="response", nresponse=99)), "nresponse is 99 but the number of columns is only 1") expect.err(try(plotres(classif.lda$learner.model, type="response", nresponse=99)), "nresponse is 99 but the number of columns is only 2") expect.err(try(plotmo(classif.lda)), "getCall(classif.lda) failed") expect.err(try(plotres(classif.lda)), "getCall(classif.lda) failed") # TODO residuals don't match plotres(classif.lda.with.call, SHOWCALL=TRUE, type="response") plotres(classif.lda$learner.model, SHOWCALL=TRUE, type="response", nresponse="LD2") plotres(lda, SHOWCALL=TRUE, type="response", nresponse="LD2") plotmo(classif.lda.with.call, SHOWCALL=TRUE) plotmo(classif.lda$learner.model, SHOWCALL=TRUE) plotmo(lda, SHOWCALL=TRUE) # # TODO plotPartialDependence and plotmo graphs below don't match # pd <- generatePartialDependenceData(classif.lda, task.lda, "Petal.Width", n=c(50, NA)) # TODO generates warnings # print(plotPartialDependence(pd, data = getTaskData(task.lda))) plotmo(classif.lda.with.call, degree1="Petal.Width", degree2=0, pmethod="partdep", do.par=FALSE) plotmo(classif.lda.with.call, SHOWCALL=TRUE, all2=TRUE, type="response") plotmo(classif.lda$learner.model, SHOWCALL=TRUE, all2=TRUE, type="class") plotmo(lda, SHOWCALL=TRUE, all2=TRUE, type="class") plotmo(classif.lda$learner.model, SHOWCALL=TRUE, all2=TRUE, type="response", nresponse="LD1") plotmo(lda, SHOWCALL=TRUE, all2=TRUE, type="response", nresponse="LD1") cat("==test recursive call to plotmo_prolog for learner.model===============\n") set.seed(2018) n <- 100 data <- data.frame( x1 = rnorm(n), x2 = rnorm(n), x3 = rnorm(n), x4 = rnorm(n), x5 = rnorm(n), x6 = rnorm(n), x7 = rnorm(n), x8 = rnorm(n), x9 = rnorm(n)) data$y <- sin(data$x3) + sin(data$x4) + 2 * cos(data$x5) set.seed(2018) library(gbm) # reference model gbm = gbm(y~., data=data, n.trees=300) plotmo(gbm, trace=-1, SHOWCALL=TRUE) set.seed(2018) task <- makeRegrTask(data=data, target="y") lrn <- makeLearner("regr.gbm", n.trees=300, keep.data=TRUE) regr.gbm = train.with.call(lrn, task) plotmo(regr.gbm, trace=-1, SHOWCALL=TRUE) set.seed(2018) lrn <- makeLearner("regr.gbm", n.trees=300) regr.gbm.nokeepdata = train.with.call(lrn, task) # expect message: use keep.data=TRUE in the call to gbm (cannot determine the variable importances) plotmo(regr.gbm.nokeepdata, trace=1, SHOWCALL=TRUE) plotres(regr.gbm, SHOWCALL=TRUE) cat("==example from makeClassificationViaRegressionWrapper help page ===============\n") # this tests that plotmo.prolog can access the learner.model at object$learner.model$next.model$learner.model set.seed(2018) lrn = makeLearner("regr.rpart") lrn = makeClassificationViaRegressionWrapper(lrn) ClassificationViaRegression = train.with.call(lrn, sonar.task, subset = 1:140) plotmo(ClassificationViaRegression, SHOWCALL=TRUE) source("test.epilog.R") plotmo/inst/slowtests/test.parsnip.bat0000755000176200001440000000221415124635472017745 0ustar liggesusers@rem test.parsnip.bat @rem Stephen Milborrow Sep 2020 Petaluma @echo test.parsnip.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.parsnip.R @if %errorlevel% equ 0 goto good1 @echo R returned errorlevel %errorlevel%, see test.parsnip.Rout: @echo. @tail test.parsnip.Rout @echo test.parsnip.R @exit /B 1 :good1 @rem second egrep gets rid of random messages issued by library(tidymodels) @rem could perhaps use suppressPackageStartupMessages() instead @egrep -v "Fit time:| Use | Dig | Learn | Search |^\* " test.parsnip.Rout >test.parsnip.Rout2 mv test.parsnip.Rout2 test.parsnip.Rout mks.diff test.parsnip.Rout test.parsnip.Rout.save @if %errorlevel% equ 0 goto good2 @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.parsnip.save.ps @exit /B 1 :good2 @rem test.parsnip.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.parsnip.save.ps @if %errorlevel% equ 0 goto good3 @echo === Files are different === @exit /B 1 :good3 @rm -f test.parsnip.Rout test.parsnip.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/test.printcall.R0000644000176200001440000000751113725307664017722 0ustar liggesusers# test.printcall.R # # TODO we don't test use of printcall in a namespace source("test.prolog.R") options(warnPartialMatchArgs=FALSE) library(plotmo) for(all in c(FALSE, TRUE)) { for(EVAL in c(FALSE, TRUE)) { printf("=== Test printcall with all=%s EVAL=%s ===\n", all, EVAL) foo30 <- function() { plotmo:::printcall(all=all) } foo30() foo32 <- function(...) { plotmo:::printcall(all=all); plotmo:::printdots(..., EVAL=EVAL) } foo32() foo32(a=31) foo34 <- function(aa=1, ...) { plotmo:::printcall(all=all); plotmo:::printdots(..., EVAL=EVAL) } foo34() foo34(a=31) # argname a will be expanded to aa foo34(a=31, x=1:10, y=NULL) foo34(a=31, y=NULL) foo34(x=stopifnot(TRUE), y=NULL) foo36 <- function(aa=NULL, ...) { plotmo:::printcall(all=all); plotmo:::printdots(..., EVAL=EVAL) } foo36() foo36(a=NULL) foo36(a=1) foo36(a=1:3) foo36(a=1:3, x=NULL) # check formatting of various argument types # note that we correctly don't call stopifnot(FALSE) (which would call stop) foo38 <- function(aa=1:3, bb=4:6, cc=print.default, dd=stopifnot(FALSE), ee=function(m=1) cat(m), ff=7, ...) { plotmo:::printcall(all=all); plotmo:::printdots(..., EVAL=EVAL) } foo38(x=matrix(ncol=1, nrow=3)) list1 <- list(aa=1:3, bb=4:6, cc=print.default, dd=stopifnot(TRUE), ee=function(m=1) cat(m), ff=7) cat("list1 ", plotmo:::list.as.char(list1), "\n", sep="") list2 <- list(lmmod=lm(Volume~Girth, data=trees), boolean=c(TRUE, FALSE, TRUE, TRUE, FALSE, TRUE), env=parent.frame(), chars=c("a", "b", "c", "a", "b", "c"), trees=trees, l=list(x=1, y="2", z=foo38)) cat("list2 ", plotmo:::list.as.char(list2), "\n", sep="") # test unnamed arguments foo40 <- function(aa, ...) { plotmo:::printcall(all=all); plotmo:::printdots(..., EVAL=EVAL) } foo40() foo40(aa=b, c) foo40(b, c) # test printcall when called in an S3 method foo.s3 <- function(a=NULL, ...) { UseMethod("foo.s3") } foo.s3.list <- function(a=NULL, ...) { cat("in foo.s3.list: "); plotmo:::printcall(all=all) plotmo:::printdots(..., EVAL=EVAL) } foo.s3.default <- function(a=NULL, ...) { cat("in foo.s3.default: "); plotmo:::printcall(all=all) plotmo:::printdots(..., EVAL=EVAL) } foo.s3(a=list(m=1, n=2)) foo.s3(a=NULL) foo.s3(a=list(m=1, n=2, o=3, p=4, q=5, r=6, s=7, t=8, u=9), b=30) # test formatting with long argument list foo46 <- function(mmmmmmmmmmm=1000, nnnnnnnnnnn=2000, ooooooooooo=3000, ppppppppppp=4000, qqqqqqqqqqq=5000, rrrrrrrrrrr=6000, sssssssssss=7000, ttttttttttt=8000, uuuuuuuuuuu=9000, vvvvvvvvvvv=1000, wwwwwwwwwww=2000, xxxxxxxxxxx=3000, ...) { plotmo:::printcall(all=all); plotmo:::printdots(..., EVAL=EVAL) } foo46(a=30) # test call.as.char foo47 <- function(aa=1, ...) { s <- plotmo:::call.as.char(all=all); cat(s, "\n", sep="") } foo47(b=30) # create a variable named foo48 in foo48 foo48 <- function(aa=1, ...) { foo48 <- 99; s <- plotmo:::call.as.char(all=all); cat(s, "\n", sep="") } foo48(b=30) # Note that the following doesn't do what you might expect. # The calling function is print(), not foo50() as you may expecty. foo50 <- function(...) { print(plotmo:::call.as.char(all=all)) } foo50(a=1) } } source("test.epilog.R") plotmo/inst/slowtests/test.dots.bat0000755000176200001440000000143515124635472017246 0ustar liggesusers@rem test.dots.R: test handling of dots arguments @echo test.dots.bat @"C:\PROGRA~1\R\R-4.5.2\bin\x64\R.exe" CMD BATCH --quiet --vanilla test.dots.R @if %errorlevel% equ 0 goto good1: @echo R returned errorlevel %errorlevel%, see test.dots.Rout: @echo. @tail test.dots.Rout @echo test.dots.R @exit /B 1 :good1 mks.diff test.dots.Rout test.dots.Rout.save @if %errorlevel% equ 0 goto good2: @echo === Files are different === @diffps -s Rplots.ps ..\..\.#\test-reference\test.dots.save.ps @exit /B 1 :good2 @rem test.dots.save.ps is too big to be included in the release @rem so it is stored elsewhere diffps Rplots.ps ..\..\.#\test-reference\test.dots.save.ps @if %errorlevel% equ 0 goto good3: @echo === Files are different === @exit /B 1 :good3 @rm -f test.dots.Rout @rm -f Rplots.ps @exit /B 0 plotmo/inst/slowtests/test.c50.R0000644000176200001440000000412613725307662016316 0ustar liggesusers# test.c50.R: c50 tests for plotmo and plotres source("test.prolog.R") library(C50) library(rpart.plot) # for ptitanic, want data with NAs for testing library(plotmo) library(earth) # for etitanic data(etitanic) get.tit <- function() # abbreviated titanic data { tit <- etitanic pclass <- as.character(tit$pclass) # change the order of the factors so not alphabetical pclass[pclass == "1st"] <- "first" pclass[pclass == "2nd"] <- "class2" pclass[pclass == "3rd"] <- "classthird" tit$pclass <- factor(pclass, levels=c("class2", "classthird", "first")) # log age is so we have a continuous predictor even when model is age~. set.seed(2015) tit$logage <- log(tit$age) + rnorm(nrow(tit)) tit$parch <- NULL # by=12 gives us a small fast model with an additive and a interaction term tit <- tit[seq(1, nrow(etitanic), by=12), ] } tit <- get.tit() c50.tree.xy <- C5.0(x=tit[,-1], y=tit[,1]) # predict pclass plotmo(c50.tree.xy, type="prob", nresponse="first", pmethod="apartdep") plotmo(c50.tree.xy, type="class") # TODO following gives error: type should be either 'class', 'confidence' or 'prob' # try(plotmo(c50.tree.xy, type="confidence")) plotres(c50.tree.xy, type="prob", nresponse="first") c50.tree.form <- C5.0(pclass~., data=tit) # predict pclass plotmo(c50.tree.form, type="prob", nresponse="first") plotmo(c50.tree.form, type="class") # TODO following gives error: type should be either 'class', 'confidence' or 'prob' # try(plotmo(c50.tree.form, type="confidence")) plotres(c50.tree.form, type="prob", nresponse="first") tit$survived <- factor(ifelse(tit$survived == 1, "yes", "no"), levels = c("yes", "no")) c50.tree.survived <- C5.0(survived~., data=tit, trials=5) # predict survived plotmo(c50.tree.survived, type="prob", nresponse="yes") plotmo(c50.tree.survived, type="class") # TODO following gives error: type should be either 'class', 'confidence' or 'prob' # try(plotmo(c50.tree.survived, type="confidence")) plotres(c50.tree.survived, type="prob", nresponse="yes") source("test.epilog.R") plotmo/inst/slowtests/test.plotmo.Rout.save0000644000176200001440000034530015124637066020727 0ustar liggesusers> # test.plotmo.R: regression tests for plotmo > # Stephen Milborrow, Petaluma Jan 2007 > > print(R.version.string) [1] "R version 4.5.2 (2025-10-31 ucrt)" > > source("test.prolog.R") > library(earth) Loading required package: Formula Loading required package: plotmo Loading required package: plotrix > options(warn=1) # print warnings as they occur > data(etitanic) > make.space.for.caption <- function(caption="CAPTION") + { + oma <- par("oma") + needed <- 3 + # adjust for newlines in caption + newlines <- grep("\n", caption) + if(length(newlines) > 0) + needed <- needed + .5 * newlines # .5 seems enough although 1 in theory + if(!is.null(caption) && any(nchar(caption)) && oma[3] <= needed) { + oma[3] <- needed + par(oma=oma) + } + } > dopar <- function(nrows, ncols, caption = "") + { + cat(" ", caption, "\n") + make.space.for.caption(caption) + par(mfrow=c(nrows, ncols)) + par(mar = c(3, 3, 1.7, 0.5)) + par(mgp = c(1.6, 0.6, 0)) + par(cex = 0.7) + } > example(plotmo) plotmo> if (require(rpart)) { plotmo+ data(kyphosis) plotmo+ rpart.model <- rpart(Kyphosis~., data=kyphosis) plotmo+ # pass type="prob" to plotmo's internal calls to predict.rpart, and plotmo+ # select the column named "present" from the matrix returned by predict.rpart plotmo+ plotmo(rpart.model, type="prob", nresponse="present") plotmo+ } Loading required package: rpart plotmo grid: Age Number Start 87 4 13 plotmo> if (require(earth)) { plotmo+ data(ozone1) plotmo+ earth.model <- earth(O3 ~ ., data=ozone1, degree=2) plotmo+ plotmo(earth.model) plotmo+ # plotmo(earth.model, pmethod="partdep") # partial dependence plots plotmo+ } plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > caption <- "basic earth test of plotmo" > a <- earth(O3 ~ ., data=ozone1, degree=2) > plotmo(a, degree1=2, degree2=4, caption=caption, trace=-1) > > caption <- "test 5 x 5 layout" > dopar(1,1,caption) test 5 x 5 layout > a <- earth(O3 ~ ., data=ozone1, nk=51, pmethod="n", degree=2) > plotmo(a, caption=caption, trace=1) stats::predict(earth.object, NULL, type="response") stats::fitted(object=earth.object) got model response from model.frame(O3 ~ vh + wind + humidity + temp + ib..., data=call$data, na.action="na.fail") plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > > caption <- "test 4 x 4 layout with ylab" > dopar(1,1,caption) test 4 x 4 layout with ylab > a <- earth(O3 ~ ., data=ozone1, nk=30, pmethod="n", degree=2) > plotmo(a, caption=caption, trace=2) plotmo trace 2: plotmo(object=a, caption=caption, trace=2) --get.model.env for object with class earth object call is earth(formula=O3~., data=ozone1, pmethod="n", degree=2, nk=30) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'a' --plotmo_x for earth object get.object.x: object$x is NULL (and it has no colnames) object call is earth(formula=O3~., data=ozone1, pmethod="n", degree=2, nk=30) get.x.from.model.frame: formula(object) is O3 ~ vh + wind + humidity + temp + ibh + dpg + ibt + vis ... naked formula is the same formula is valid, now looking for data for the model.frame object$model is NULL (and it has no colnames) object$data is NULL (and it has no colnames) argument 2 of the call is 'data' eval(call$data, R_GlobalEnv) call$data is usable and has column names O3 vh wind humidity temp ibh dpg ibt vis doy na.action(object) is "na.fail" stats::model.frame(O3 ~ vh + wind + humidity + temp + ib..., data=call$data, na.action="na.fail") x=model.frame[,-1] is usable and has column names vh wind humidity temp ibh dpg ibt vis doy plotmo_x returned[330,9]: vh wind humidity temp ibh dpg ibt vis doy 1 5710 4 28 40 2693 -25 87 250 33 2 5700 3 37 45 590 -24 128 100 34 3 5760 3 51 54 1450 25 139 60 35 ... 5720 4 69 35 1568 15 121 60 36 330 5550 4 85 39 5000 8 44 100 390 ----Metadata: plotmo_predict with nresponse=NULL and newdata=NULL calling predict.earth with NULL newdata stats::predict(earth.object, NULL, type="response") predict returned[330,1]: O3 1 1.240608 2 3.596894 3 7.464276 ... 5.282731 330 3.228830 predict after processing with nresponse=NULL is [330,1]: O3 1 1.240608 2 3.596894 3 7.464276 ... 5.282731 330 3.228830 ----Metadata: plotmo_fitted with nresponse=NULL stats::fitted(object=earth.object) fitted(object) returned[330,1]: O3 1 1.240608 2 3.596894 3 7.464276 ... 5.282731 330 3.228830 fitted(object) after processing with nresponse=NULL is [330,1]: O3 1 1.240608 2 3.596894 3 7.464276 ... 5.282731 330 3.228830 ----Metadata: plotmo_y with nresponse=NULL --plotmo_y with nresponse=NULL for earth object get.object.y: object$y is NULL (and it has no colnames) object call is earth(formula=O3~., data=ozone1, pmethod="n", degree=2, nk=30) get.y.from.model.frame: formula(object) is O3 ~ vh + wind + humidity + temp + ibh + dpg + ibt + vis ... formula is valid, now looking for data for the model.frame object$model is NULL (and it has no colnames) object$data is NULL (and it has no colnames) argument 2 of the call is 'data' eval(call$data, R_GlobalEnv) call$data is usable and has column names O3 vh wind humidity temp ibh dpg ibt vis doy na.action(object) is "na.fail" stats::model.frame(O3 ~ vh + wind + humidity + temp + ib..., data=call$data, na.action="na.fail") y=model.frame[,1] is usable and has column name O3 plotmo_y returned[330,1]: O3 1 3 2 5 3 5 ... 6 330 1 plotmo_y after processing with nresponse=NULL is [330,1]: O3 1 3 2 5 3 5 ... 6 330 1 converted nresponse=NA to nresponse=1 nresponse=1 (was NA) ncol(fitted) 1 ncol(predict) 1 ncol(y) 1 ----Metadata: plotmo_y with nresponse=1 --plotmo_y with nresponse=1 for earth object get.object.y: object$y is NULL (and it has no colnames) object call is earth(formula=O3~., data=ozone1, pmethod="n", degree=2, nk=30) get.y.from.model.frame: formula(object) is O3 ~ vh + wind + humidity + temp + ibh + dpg + ibt + vis ... formula is valid, now looking for data for the model.frame object$model is NULL (and it has no colnames) object$data is NULL (and it has no colnames) argument 2 of the call is 'data' eval(call$data, R_GlobalEnv) call$data is usable and has column names O3 vh wind humidity temp ibh dpg ibt vis doy na.action(object) is "na.fail" stats::model.frame(O3 ~ vh + wind + humidity + temp + ib..., data=call$data, na.action="na.fail") y=model.frame[,1] is usable and has column name O3 got model response from model.frame(O3 ~ vh + wind + humidity + temp + ib..., data=call$data, na.action="na.fail") plotmo_y returned[330,1]: O3 1 3 2 5 3 5 ... 6 330 1 plotmo_y after processing with nresponse=1 is [330,1]: O3 1 3 2 5 3 5 ... 6 330 1 got response name "O3" from yhat resp.levs is NULL ----Metadata: done number of x values: vh 53 wind 11 humidity 65 temp 63 ibh 196 dpg 128 ibt 193... ----plotmo_singles for earth object singles: 4 temp, 5 ibh, 7 ibt, 8 vis, 9 doy ----plotmo_pairs for earth object pairs: [,1] [,2] [1,] "1 vh" "4 temp" [2,] "1 vh" "9 doy" [3,] "2 wind" "8 vis" [4,] "3 humidity" "4 temp" [5,] "4 temp" "5 ibh" [6,] "4 temp" "6 dpg" [7,] "4 temp" "9 doy" [8,] "5 ibh" "6 dpg" [9,] "7 ibt" "8 vis" graphics::par(mfrow=c(4,4), mgp=c(1.5,0.4,0), tcl=-0.3, font.main=2, mar=c(3,2,1.2,0.8), oma=c(0,0,3,0), cex.main=1.1, cex.lab=1, cex.axis=1, cex=0.66) ----Figuring out ylim --get.ylim.by.dummy.plots --plot.degree1(draw.plot=FALSE) degree1 plot1 (pmethod "plotmo") variable temp newdata[50,9]: vh wind humidity temp ibh dpg ibt vis doy 1 5760 5 64 25.00000 2112.5 24 167.5 120 205.5 2 5760 5 64 26.38776 2112.5 24 167.5 120 205.5 3 5760 5 64 27.77551 2112.5 24 167.5 120 205.5 ... 5760 5 64 29.16327 2112.5 24 167.5 120 205.5 50 5760 5 64 93.00000 2112.5 24 167.5 120 205.5 stats::predict(earth.object, data.frame[50,9], type="response") predict returned[50,1]: O3 1 8.724965 2 8.813294 3 8.901624 ... 8.989953 50 18.716007 predict after processing with nresponse=1 is [50,1]: O3 1 8.724965 2 8.813294 3 8.901624 ... 8.989953 50 18.716007 Reducing trace level for subsequent degree1 plots degree1 plot2 (pmethod "plotmo") variable ibh degree1 plot3 (pmethod "plotmo") variable ibt degree1 plot4 (pmethod "plotmo") variable vis degree1 plot5 (pmethod "plotmo") variable doy --plot.degree2(draw.plot=FALSE) degree2 plot1 (pmethod "plotmo") variables vh:temp newdata[400,9]: vh wind humidity temp ibh dpg ibt vis doy 1 5320.000 5 64 25 2112.5 24 167.5 120 205.5 2 5353.158 5 64 25 2112.5 24 167.5 120 205.5 3 5386.316 5 64 25 2112.5 24 167.5 120 205.5 ... 5419.474 5 64 25 2112.5 24 167.5 120 205.5 400 5950.000 5 64 93 2112.5 24 167.5 120 205.5 stats::predict(earth.object, data.frame[400,9], type="response") predict returned[400,1]: O3 1 10.41649 2 10.28902 3 10.16155 ... 10.03408 400 27.17075 predict after processing with nresponse=1 is [400,1]: O3 1 10.41649 2 10.28902 3 10.16155 ... 10.03408 400 27.17075 Reducing trace level for subsequent degree2 plots degree2 plot2 (pmethod "plotmo") variables vh:doy degree2 plot3 (pmethod "plotmo") variables wind:vis degree2 plot4 (pmethod "plotmo") variables humidity:temp degree2 plot5 (pmethod "plotmo") variables temp:ibh degree2 plot6 (pmethod "plotmo") variables temp:dpg degree2 plot7 (pmethod "plotmo") variables temp:doy degree2 plot8 (pmethod "plotmo") variables ibh:dpg degree2 plot9 (pmethod "plotmo") variables ibt:vis --done get.ylim.by.dummy.plots ylim c(-33.06, 31.48) clip TRUE --plot.degree1(draw.plot=TRUE) plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 graphics::plot.default(x=c(25,26.39,27.7...), y=c(8.725,8.813,8...), type="n", main="1 temp", xlab="", ylab="", xaxt="s", yaxt="s", xlim=c(25,93), ylim=c(-33.06,31.48)) --plot.degree2(draw.plot=TRUE) persp(vh:temp) theta -35 persp(vh:doy) theta -35 persp(wind:vis) theta 145 persp(humidity:temp) theta -35 persp(temp:ibh) theta 235 persp(temp:dpg) theta 235 persp(temp:doy) theta 235 persp(ibh:dpg) theta 235 persp(ibt:vis) theta 235 > > caption <- "test 3 x 3 layout" > dopar(1,1,caption) test 3 x 3 layout > a <- earth(O3 ~ ., data=ozone1, nk=16, pmethod="n", degree=2) > plotmo(a, caption=caption, trace=3) plotmo trace 3: plotmo(object=a, caption=caption, trace=3) --get.model.env for object with class earth object call is earth(formula=O3~., data=ozone1, pmethod="n", degree=2, nk=16) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'a' --plotmo_x for earth object get.object.x: object$x is NULL (and it has no colnames) object call is earth(formula=O3~., data=ozone1, pmethod="n", degree=2, nk=16) get.x.from.model.frame: formula(object) is O3 ~ vh + wind + humidity + temp + ibh + dpg + ibt + vis ... naked formula is the same formula is valid, now looking for data for the model.frame object$model is NULL (and it has no colnames) object$data is NULL (and it has no colnames) argument 2 of the call is 'data' eval(call$data, R_GlobalEnv) call$data is usable and has column names O3 vh wind humidity temp ibh dpg ibt vis doy na.action(object) is "na.fail" model.env is R_GlobalEnv data[330,10]: O3 vh wind humidity temp ibh dpg ibt vis doy 1 3 5710 4 28 40 2693 -25 87 250 33 2 5 5700 3 37 45 590 -24 128 100 34 3 5 5760 3 51 54 1450 25 139 60 35 ... 6 5720 4 69 35 1568 15 121 60 36 330 1 5550 4 85 39 5000 8 44 100 390 stats::model.frame(O3 ~ vh + wind + humidity + temp + ib..., data=call$data, na.action="na.fail") model.frame returned[330,10]: O3 vh wind humidity temp ibh dpg ibt vis doy 1 3 5710 4 28 40 2693 -25 87 250 33 2 5 5700 3 37 45 590 -24 128 100 34 3 5 5760 3 51 54 1450 25 139 60 35 ... 6 5720 4 69 35 1568 15 121 60 36 330 1 5550 4 85 39 5000 8 44 100 390 x=model.frame[,-1] is usable and has column names vh wind humidity temp ibh dpg ibt vis doy plotmo_x returned[330,9]: vh wind humidity temp ibh dpg ibt vis doy 1 5710 4 28 40 2693 -25 87 250 33 2 5700 3 37 45 590 -24 128 100 34 3 5760 3 51 54 1450 25 139 60 35 ... 5720 4 69 35 1568 15 121 60 36 330 5550 4 85 39 5000 8 44 100 390 ----Metadata: plotmo_predict with nresponse=NULL and newdata=NULL calling predict.earth with NULL newdata stats::predict(earth.object, NULL, type="response") predict returned[330,1]: O3 1 1.255037 2 4.164931 3 7.585888 ... 4.443360 330 1.685101 predict after processing with nresponse=NULL is [330,1]: O3 1 1.255037 2 4.164931 3 7.585888 ... 4.443360 330 1.685101 ----Metadata: plotmo_fitted with nresponse=NULL stats::fitted(object=earth.object) fitted(object) returned[330,1]: O3 1 1.255037 2 4.164931 3 7.585888 ... 4.443360 330 1.685101 fitted(object) after processing with nresponse=NULL is [330,1]: O3 1 1.255037 2 4.164931 3 7.585888 ... 4.443360 330 1.685101 ----Metadata: plotmo_y with nresponse=NULL --plotmo_y with nresponse=NULL for earth object get.object.y: object$y is NULL (and it has no colnames) object call is earth(formula=O3~., data=ozone1, pmethod="n", degree=2, nk=16) get.y.from.model.frame: formula(object) is O3 ~ vh + wind + humidity + temp + ibh + dpg + ibt + vis ... formula is valid, now looking for data for the model.frame object$model is NULL (and it has no colnames) object$data is NULL (and it has no colnames) argument 2 of the call is 'data' eval(call$data, R_GlobalEnv) call$data is usable and has column names O3 vh wind humidity temp ibh dpg ibt vis doy na.action(object) is "na.fail" model.env is R_GlobalEnv data[330,10]: O3 vh wind humidity temp ibh dpg ibt vis doy 1 3 5710 4 28 40 2693 -25 87 250 33 2 5 5700 3 37 45 590 -24 128 100 34 3 5 5760 3 51 54 1450 25 139 60 35 ... 6 5720 4 69 35 1568 15 121 60 36 330 1 5550 4 85 39 5000 8 44 100 390 stats::model.frame(O3 ~ vh + wind + humidity + temp + ib..., data=call$data, na.action="na.fail") model.frame returned[330,10]: O3 vh wind humidity temp ibh dpg ibt vis doy 1 3 5710 4 28 40 2693 -25 87 250 33 2 5 5700 3 37 45 590 -24 128 100 34 3 5 5760 3 51 54 1450 25 139 60 35 ... 6 5720 4 69 35 1568 15 121 60 36 330 1 5550 4 85 39 5000 8 44 100 390 y=model.frame[,1] is usable and has column name O3 plotmo_y returned[330,1]: O3 1 3 2 5 3 5 ... 6 330 1 plotmo_y after processing with nresponse=NULL is [330,1]: O3 1 3 2 5 3 5 ... 6 330 1 converted nresponse=NA to nresponse=1 nresponse=1 (was NA) ncol(fitted) 1 ncol(predict) 1 ncol(y) 1 ----Metadata: plotmo_y with nresponse=1 --plotmo_y with nresponse=1 for earth object get.object.y: object$y is NULL (and it has no colnames) object call is earth(formula=O3~., data=ozone1, pmethod="n", degree=2, nk=16) get.y.from.model.frame: formula(object) is O3 ~ vh + wind + humidity + temp + ibh + dpg + ibt + vis ... formula is valid, now looking for data for the model.frame object$model is NULL (and it has no colnames) object$data is NULL (and it has no colnames) argument 2 of the call is 'data' eval(call$data, R_GlobalEnv) call$data is usable and has column names O3 vh wind humidity temp ibh dpg ibt vis doy na.action(object) is "na.fail" model.env is R_GlobalEnv data[330,10]: O3 vh wind humidity temp ibh dpg ibt vis doy 1 3 5710 4 28 40 2693 -25 87 250 33 2 5 5700 3 37 45 590 -24 128 100 34 3 5 5760 3 51 54 1450 25 139 60 35 ... 6 5720 4 69 35 1568 15 121 60 36 330 1 5550 4 85 39 5000 8 44 100 390 stats::model.frame(O3 ~ vh + wind + humidity + temp + ib..., data=call$data, na.action="na.fail") model.frame returned[330,10]: O3 vh wind humidity temp ibh dpg ibt vis doy 1 3 5710 4 28 40 2693 -25 87 250 33 2 5 5700 3 37 45 590 -24 128 100 34 3 5 5760 3 51 54 1450 25 139 60 35 ... 6 5720 4 69 35 1568 15 121 60 36 330 1 5550 4 85 39 5000 8 44 100 390 y=model.frame[,1] is usable and has column name O3 got model response from model.frame(O3 ~ vh + wind + humidity + temp + ib..., data=call$data, na.action="na.fail") plotmo_y returned[330,1]: O3 1 3 2 5 3 5 ... 6 330 1 plotmo_y after processing with nresponse=1 is [330,1]: O3 1 3 2 5 3 5 ... 6 330 1 got response name "O3" from yhat resp.levs is NULL ----Metadata: done number of x values: vh 53 wind 11 humidity 65 temp 63 ibh 196 dpg 128 ibt 193... ----plotmo_singles for earth object singles: 4 temp, 5 ibh, 8 vis, 9 doy ----plotmo_pairs for earth object pairs: [,1] [,2] [1,] "2 wind" "8 vis" [2,] "3 humidity" "4 temp" [3,] "4 temp" "6 dpg" do.par invoked call.dots TRACE do.par called call.dots(par, DROP="*", KEEP="PREFIX,PAR.ARGS", TRACE=if(trace>=2)trace-1e...), SCALAR=TRUE, def.mfrow=c(nrows,nrows), def.mgp=mgp, def.tcl=-0.3, def.font.main=def.font.main, def.mar=mar, def.oma=def.oma, def.cex.main=def.cex.main, def.cex.lab=cex.lab, def.cex.axis=cex.lab, force.cex=cex) PREFIX par. DROP .* KEEP >STANDARDPREFIXES|^force\.|^def\.|^drop\. >PREFIX|^par\. >CALLARGS|^def\.mfrow$|^def\.mgp$|^def\.tcl$|^def\.font\.main$|^def\.mar$|^def\.oma$|^def\.cex\.main$|^def\.cex\.lab$|^def\.cex\.axis$|^force\.cex$ >EXPLICIT >PAR_ARGS|^adj$|^ann$|^ask$|^bg$|^bty$|^cex$|^cex\.axis$|^cex\.lab$|^cex\.main$|^cex\.sub$|^col\.axis$|^col\.lab$|^col\.main$|^col\.sub$|^crt$|^err$|^family$|^fg$|^fig$|^fin$|^font$|^font\.axis$|^font\.lab$|^font\.main$|^font\.sub$|^lab$|^las$|^lend$|^lheight$|^ljoin$|^lmitre$|^lty$|^mai$|^mar$|^mex$|^mfcol$|^mfg$|^mfrow$|^mgp$|^mkh$|^new$|^oma$|^omd$|^omi$|^pch$|^pin$|^plt$|^ps$|^pty$|^srt$|^tck$|^tcl$|^usr$|^xaxp$|^xaxs$|^xaxt$|^xlog$|^xpd$|^yaxp$|^yaxs$|^yaxt$|^ylbias$|^ylog$ input dotnames def.mfrow def.mgp def.tcl def.font.main def.mar def.oma def.cex.main def.cex.lab def.cex.axis force.cex after DROP and KEEP def.mfrow def.mgp def.tcl def.font.main def.mar def.oma def.cex.main def.cex.lab def.cex.axis force.cex return dotnames mfrow mgp tcl font.main mar oma cex.main cex.lab cex.axis cex graphics::par(mfrow=c(3,3), mgp=c(1.5,0.4,0), tcl=-0.3, font.main=2, mar=c(3,2,1.2,0.8), oma=c(0,0,3,0), cex.main=1.2, cex.lab=1, cex.axis=1, cex=0.66) ----Figuring out ylim --get.ylim.by.dummy.plots --plot.degree1(draw.plot=FALSE) degree1 plot1 (pmethod "plotmo") variable temp newdata[50,9]: vh wind humidity temp ibh dpg ibt vis doy 1 5760 5 64 25.00000 2112.5 24 167.5 120 205.5 2 5760 5 64 26.38776 2112.5 24 167.5 120 205.5 3 5760 5 64 27.77551 2112.5 24 167.5 120 205.5 ... 5760 5 64 29.16327 2112.5 24 167.5 120 205.5 50 5760 5 64 93.00000 2112.5 24 167.5 120 205.5 stats::predict(earth.object, data.frame[50,9], type="response") predict returned[50,1]: O3 1 5.311674 2 5.527233 3 5.742791 ... 5.958350 50 29.012915 predict after processing with nresponse=1 is [50,1]: O3 1 5.311674 2 5.527233 3 5.742791 ... 5.958350 50 29.012915 degree1 plot2 (pmethod "plotmo") variable ibh newdata[50,9]: vh wind humidity temp ibh dpg ibt vis doy 1 5760 5 64 62 111.0000 24 167.5 120 205.5 2 5760 5 64 62 210.7755 24 167.5 120 205.5 3 5760 5 64 62 310.5510 24 167.5 120 205.5 ... 5760 5 64 62 410.3265 24 167.5 120 205.5 50 5760 5 64 62 5000.0000 24 167.5 120 205.5 stats::predict(earth.object, data.frame[50,9], type="response") predict returned[50,1]: O3 1 10.870828 2 11.135522 3 11.400215 ... 11.664908 50 9.845279 predict after processing with nresponse=1 is [50,1]: O3 1 10.870828 2 11.135522 3 11.400215 ... 11.664908 50 9.845279 degree1 plot3 (pmethod "plotmo") variable vis newdata[50,9]: vh wind humidity temp ibh dpg ibt vis doy 1 5760 5 64 62 2112.5 24 167.5 0.000000 205.5 2 5760 5 64 62 2112.5 24 167.5 7.142857 205.5 3 5760 5 64 62 2112.5 24 167.5 14.285714 205.5 ... 5760 5 64 62 2112.5 24 167.5 21.428571 205.5 50 5760 5 64 62 2112.5 24 167.5 350.000000 205.5 stats::predict(earth.object, data.frame[50,9], type="response") predict returned[50,1]: O3 1 14.86257 2 14.72553 3 14.58850 ... 14.45147 50 11.88484 predict after processing with nresponse=1 is [50,1]: O3 1 14.86257 2 14.72553 3 14.58850 ... 14.45147 50 11.88484 degree1 plot4 (pmethod "plotmo") variable doy newdata[50,9]: vh wind humidity temp ibh dpg ibt vis doy 1 5760 5 64 62 2112.5 24 167.5 120 33.00000 2 5760 5 64 62 2112.5 24 167.5 120 40.28571 3 5760 5 64 62 2112.5 24 167.5 120 47.57143 ... 5760 5 64 62 2112.5 24 167.5 120 54.85714 50 5760 5 64 62 2112.5 24 167.5 120 390.00000 stats::predict(earth.object, data.frame[50,9], type="response") predict returned[50,1]: O3 1 7.968080 2 8.746490 3 9.524900 ... 10.303310 50 8.957033 predict after processing with nresponse=1 is [50,1]: O3 1 7.968080 2 8.746490 3 9.524900 ... 10.303310 50 8.957033 --plot.degree2(draw.plot=FALSE) degree2 plot1 (pmethod "plotmo") variables wind:vis newdata[400,9]: vh wind humidity temp ibh dpg ibt vis doy 1 5760 0.0000000 64 62 2112.5 24 167.5 0 205.5 2 5760 0.5789474 64 62 2112.5 24 167.5 0 205.5 3 5760 1.1578947 64 62 2112.5 24 167.5 0 205.5 ... 5760 1.7368421 64 62 2112.5 24 167.5 0 205.5 400 5760 11.0000000 64 62 2112.5 24 167.5 350 205.5 stats::predict(earth.object, data.frame[400,9], type="response") predict returned[400,1]: O3 1 16.19942 2 16.04463 3 15.88983 ... 15.73504 400 11.88484 predict after processing with nresponse=1 is [400,1]: O3 1 16.19942 2 16.04463 3 15.88983 ... 15.73504 400 11.88484 degree2 plot2 (pmethod "plotmo") variables humidity:temp newdata[400,9]: vh wind humidity temp ibh dpg ibt vis doy 1 5760 5 19.00000 25 2112.5 24 167.5 120 205.5 2 5760 5 22.89474 25 2112.5 24 167.5 120 205.5 3 5760 5 26.78947 25 2112.5 24 167.5 120 205.5 ... 5760 5 30.68421 25 2112.5 24 167.5 120 205.5 400 5760 5 93.00000 93 2112.5 24 167.5 120 205.5 stats::predict(earth.object, data.frame[400,9], type="response") predict returned[400,1]: O3 1 5.311674 2 5.311674 3 5.311674 ... 5.311674 400 32.296021 predict after processing with nresponse=1 is [400,1]: O3 1 5.311674 2 5.311674 3 5.311674 ... 5.311674 400 32.296021 degree2 plot3 (pmethod "plotmo") variables temp:dpg newdata[400,9]: vh wind humidity temp ibh dpg ibt vis doy 1 5760 5 64 25.00000 2112.5 -69 167.5 120 205.5 2 5760 5 64 28.57895 2112.5 -69 167.5 120 205.5 3 5760 5 64 32.15789 2112.5 -69 167.5 120 205.5 ... 5760 5 64 35.73684 2112.5 -69 167.5 120 205.5 400 5760 5 64 93.00000 2112.5 107 167.5 120 205.5 stats::predict(earth.object, data.frame[400,9], type="response") predict returned[400,1]: O3 1 5.311674 2 5.867588 3 6.423503 ... 6.979417 400 -6.671880 predict after processing with nresponse=1 is [400,1]: O3 1 5.311674 2 5.867588 3 6.423503 ... 6.979417 400 -6.671880 --done get.ylim.by.dummy.plots ylim c(-6.672, 40.23) clip TRUE --plot.degree1(draw.plot=TRUE) plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 draw.degree1 invoked call.dots TRACE draw.degree1 called call.plot(plot.default, PREFIX="degree1.", TRACE=if(isingle==1&&trace...), force.x=xframe[,ipred], force.y=yhat, force.type="n", force.main=main, force.xlab=xlab, force.ylab=ylab, force.xlim=xlim, force.ylim=ylim, def.xaxt=if(xaxis.is.levs)"n"...), def.yaxt=if(yaxis.is.levs)"n"...)) PREFIX degree1. DROP .* KEEP >STANDARDPREFIXES|^force\.|^def\.|^drop\. >PREFIX|^degree1\. >CALLARGS|^force\.x$|^force\.y$|^force\.type$|^force\.main$|^force\.xlab$|^force\.ylab$|^force\.xlim$|^force\.ylim$|^def\.xaxt$|^def\.yaxt$ >EXPLICIT >PLOT_ARGS|^add$|^adj$|^bty$|^cex$|^cex\.axis$|^cex\.lab$|^cex\.main$|^cex\.sub$|^col$|^col\.axis$|^col\.lab$|^col\.main$|^col\.sub$|^crt$|^family$|^font$|^font$|^font\.axis$|^font\.lab$|^font\.main$|^font\.sub$|^lend$|^ljoin$|^lmitre$|^lty$|^lwd$|^main$|^pch$|^srt$|^xaxp$|^xaxs$|^xaxt$|^xlab$|^xlim$|^xlog$|^xpd$|^yaxp$|^yaxs$|^yaxt$|^ylab$|^ylim$|^ylog$ input dotnames force.x force.y force.type force.main force.xlab force.ylab force.xlim force.ylim def.xaxt def.yaxt after DROP and KEEP force.x force.y force.type force.main force.xlab force.ylab force.xlim force.ylim def.xaxt def.yaxt return dotnames x y type main xlab ylab xaxt yaxt xlim ylim graphics::plot.default(x=c(25,26.39,27.7...), y=c(5.312,5.527,5...), type="n", main="1 temp", xlab="", ylab="", xaxt="s", yaxt="s", xlim=c(25,93), ylim=c(-6.67,40.23)) --plot.degree2(draw.plot=TRUE) persp(wind:vis) theta 145 TRACE plot.persp called deprefix(persp, FNAME="persp", KEEP="PREFIX,PLOT.ARGS", FORMALS=persp.def.formals, TRACE=if(ipair==1&&trace>=...), force.x=x1grid, force.y=x2grid, force.z=yhat, force.xlim=range(x1grid), force.ylim=range(x2grid), force.zlim=if(is.null(ylim))yli...), force.xlab=xlab, force.ylab=ylab, force.theta=theta, force.phi=30, force.d=1, force.main=main2, def.cex.lab=cex.lab, def.cex.axis=cex.lab, def.zlab=zlab, def.ticktype="simple", def.nticks=def.nticks, def.cex=cex1, force.col="lightblue", def.border=NULL, def.shade=0.5) PREFIX persp. DROP NULL KEEP >STANDARDPREFIXES|^force\.|^def\.|^drop\. >PREFIX|^persp\. >CALLARGS|^force\.x$|^force\.y$|^force\.z$|^force\.xlim$|^force\.ylim$|^force\.zlim$|^force\.xlab$|^force\.ylab$|^force\.theta$|^force\.phi$|^force\.d$|^force\.main$|^def\.cex\.lab$|^def\.cex\.axis$|^def\.zlab$|^def\.ticktype$|^def\.nticks$|^def\.cex$|^force\.col$|^def\.border$|^def\.shade$ >EXPLICIT >PLOT_ARGS|^add$|^adj$|^bty$|^cex$|^cex\.axis$|^cex\.lab$|^cex\.main$|^cex\.sub$|^col$|^col\.axis$|^col\.lab$|^col\.main$|^col\.sub$|^crt$|^family$|^font$|^font$|^font\.axis$|^font\.lab$|^font\.main$|^font\.sub$|^lend$|^ljoin$|^lmitre$|^lty$|^lwd$|^main$|^pch$|^srt$|^xaxp$|^xaxs$|^xaxt$|^xlab$|^xlim$|^xlog$|^xpd$|^yaxp$|^yaxs$|^yaxt$|^ylab$|^ylim$|^ylog$ input dotnames force.x force.y force.z force.xlim force.ylim force.zlim force.xlab force.ylab force.theta force.phi force.d force.main def.cex.lab def.cex.axis def.zlab def.ticktype def.nticks def.cex force.col def.border def.shade after DROP and KEEP force.x force.y force.z force.xlim force.ylim force.zlim force.xlab force.ylab force.theta force.phi force.d force.main def.cex.lab def.cex.axis def.zlab def.ticktype def.nticks def.cex force.col def.shade return dotnames x y main xlab ylab cex.lab cex.axis zlab ticktype nticks cex shade z xlim ylim zlim theta phi d col persp(humidity:temp) theta -35 persp(temp:dpg) theta 235 > > caption <- "test 2 x 2 layout" > dopar(1,1,caption) test 2 x 2 layout > a <- earth(O3 ~ ., data=ozone1, nk=9, pmethod="n", degree=2) > plotmo(a, caption=caption) plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > > caption <- "test 1 x 1 layout" > dopar(1,1,caption) test 1 x 1 layout > a <- earth(O3 ~ ., data=ozone1, nk=4, pmethod="n", degree=2) > plotmo(a, caption=caption) plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > > caption <- "test plotmo basic params" > a <- earth(O3 ~ ., data=ozone1, degree=2) > dopar(3,2,caption) test plotmo basic params > plotmo(a, do.par=FALSE, degree1=1, nrug=-1, degree2=F, caption=caption, + main="test main", xlab="test xlab", ylab="test ylab") plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > plotmo(a, do.par=FALSE, degree1=F, degree2=4, grid.func=mean, persp.col="white", ngrid2=10, persp.phi=40) > set.seed(2016) > plotmo(a, do.par=FALSE, degree1=1, degree1.lty=2, degree1.lwd=4, degree1.col=2, nrug=TRUE, degree2=F, main="nrug=300") plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > plotmo(a, do.par=FALSE, degree1=1, nrug=-1, degree2=F, main="nrug=TRUE") plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > set.seed(2016) > plotmo(a, do.par=FALSE, degree1=1, nrug=10, ngrid1=50, degree2=F, main="ngrid1=50 nrug=10") plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > plotmo(a, do.par=FALSE, degree1=NA, degree2=1, persp.phi=60) # graph args > > caption <- "test plotmo xlim and ylim" > a <- earth(O3 ~ ., data=ozone1, degree=2) > dopar(5,3,caption) test plotmo xlim and ylim > plotmo(a, do.par=FALSE, degree1=2:3, degree2=4, caption=caption, xlab="ylim=default") plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > plotmo(a, do.par=FALSE, degree1=2:3, degree2=4, ylim=NA, xlab="ylim=NA") plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > plotmo(a, do.par=FALSE, degree1=2:3, degree2=4, ylim=c(0,20), xlab="ylim=c(0,20)") plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > plotmo(a, do.par=FALSE, degree1=2:3, degree2=4, xlim=c(190,250), xlab="xlim=c(190,250)") plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > plotmo(a, do.par=FALSE, degree1=2:3, degree2=4, xlim=c(190,250), ylim=c(11,18), xlab="xlim=c(190,250), ylim=c(11,18)") plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > > # check various types of predictors with grid.func and ndiscrete > > varied.type.data <- data.frame( + y = 1:13, + num = c(1, 3, 2, 3, 4, 5, 6, 4, 5, 6.5, 3, 6, 5), # 7 unique values (but one is non integral) + int = c(1L, 1L, 3L, 3L, 4L, 4L, 3L, 5L, 3L, 6L, 7L, 8L, 10L), # 8 unique values + bool = c(F, F, F, F, F, T, T, T, T, T, T, T, T), + date = as.Date( + c("2018-08-01", "2018-08-02", "2018-08-03", + "2018-08-04", "2018-08-05", "2018-08-06", + "2018-08-07", "2018-08-08", "2018-08-08", + "2018-08-08", "2018-08-10", "2018-08-11", "2018-08-11")), + ord = ordered(c("ord3", "ord3", "ord3", + "ord1", "ord2", "ord3", + "ord1", "ord2", "ord3", + "ord1", "ord1", "ord1", "ord1"), + levels=c("ord1", "ord3", "ord2")), + fac = as.factor(c("fac1", "fac1", "fac1", + "fac2", "fac2", "fac2", + "fac3", "fac3", "fac3", + "fac1", "fac2", "fac3", "fac3")), + str = c("str1", "str1", "str1", # will be treated like a factor + "str2", "str2", "str2", + "str3", "str3", "str3", + "str3", "str3", "str3", "str3")) > > varied.type.lm <- lm(y ~ ., data = varied.type.data) > print(summary(varied.type.lm)) Call: lm(formula = y ~ ., data = varied.type.data) Residuals: 1 2 3 4 5 6 7 9.619e-02 1.673e-01 -2.635e-01 1.297e-02 -1.297e-02 -6.592e-17 -1.029e-01 8 9 10 11 12 13 1.297e-02 5.898e-17 -8.674e-17 5.204e-17 5.772e-02 3.220e-02 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -7192.3724 6018.6749 -1.195 0.3546 num 0.2618 0.1919 1.364 0.3057 int 0.6437 0.2279 2.824 0.1058 boolTRUE -1.7185 0.5305 -3.240 0.0835 . date 0.4053 0.3392 1.195 0.3547 ord.L -0.2014 0.1726 -1.167 0.3637 ord.Q -1.5481 0.4045 -3.827 0.0620 . facfac2 0.4621 1.1289 0.409 0.7219 facfac3 -0.4299 0.5784 -0.743 0.5348 strstr2 1.3480 0.8570 1.573 0.2564 strstr3 5.0732 1.2534 4.048 0.0560 . --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 0.2471 on 2 degrees of freedom Multiple R-squared: 0.9993, Adjusted R-squared: 0.996 F-statistic: 297.9 on 10 and 2 DF, p-value: 0.003351 > set.seed(2018) > plotres(varied.type.lm, info=TRUE) > plotmo(varied.type.lm, pmethod="apartdep", all2=TRUE, ticktype="d", col.response="red", caption="varied.type.lm\npmethod=\"apartdep\" default grid func") calculating apartdep for num calculating apartdep for int calculating apartdep for bool calculating apartdep for date calculating apartdep for ord calculating apartdep for fac calculating apartdep for str calculating apartdep for num:int 01234567890 calculating apartdep for num:bool 01234567890 calculating apartdep for num:date 01234567890 calculating apartdep for num:ord 01234567890 calculating apartdep for num:fac 01234567890 calculating apartdep for num:str 01234567890 calculating apartdep for int:bool 01234567890 calculating apartdep for int:date 01234567890 calculating apartdep for int:ord 01234567890 calculating apartdep for int:fac 01234567890 calculating apartdep for int:str 01234567890 calculating apartdep for bool:date 0123456790 calculating apartdep for bool:ord 0123456790 calculating apartdep for bool:fac 0123456790 calculating apartdep for bool:str 0123456790 calculating apartdep for date:ord 01234567890 calculating apartdep for date:fac 01234567890 calculating apartdep for date:str 01234567890 calculating apartdep for ord:fac 01234567890 calculating apartdep for ord:str 01234567890 calculating apartdep for fac:str 01234567890 > plotmo(varied.type.lm, all2=TRUE, ticktype="d", col.response="red", caption="varied.type.lm\ndefault grid func") plotmo grid: num int bool date ord fac str 4 4 TRUE 2018-08-07 ord1 fac3 str3 > plotmo(varied.type.lm, all2=TRUE, ndiscre=1, caption="varied.type.lm\nndiscrete=1") plotmo grid: num int bool date ord fac str 4 4 TRUE 2018-08-07 ord1 fac3 str3 > plotmo(varied.type.lm, all2=TRUE, ndiscr=2, caption="varied.type.lm\nndiscrete=2") plotmo grid: num int bool date ord fac str 4 4 TRUE 2018-08-07 ord1 fac3 str3 > plotmo(varied.type.lm, all2=TRUE, ndis=100, caption="varied.type.lm\nndiscrete=100") plotmo grid: num int bool date ord fac str 4 4 TRUE 2018-08-07 ord1 fac3 str3 > cat("grid.func=median:\n") grid.func=median: > plotmo(varied.type.lm, all2=TRUE, grid.func=median, caption="varied.type.lm\ngrid.func=median") Warning: grid.func failed for ord, so will use the most common value of ord Warning: grid.func failed for fac, so will use the most common value of fac Warning: grid.func failed for str, so will use the most common value of str Warning: grid.func failed for ord, so will use the most common value of ord Warning: grid.func failed for fac, so will use the most common value of fac Warning: grid.func failed for str, so will use the most common value of str plotmo grid: num int bool date ord fac str 4 4 TRUE 2018-08-07 ord1 fac3 str3 > cat("grid.func=quantile:\n") grid.func=quantile: > plotmo(varied.type.lm, all2=TRUE, grid.func=function(x, ...) quantile(x, 0.5), caption="varied.type.lm\ngrid.func=function(x, ...) quantile(x, 0.5)") Warning: grid.func failed for date, so will use the default grid.func for date Warning: grid.func failed for ord, so will use the most common value of ord Warning: grid.func failed for fac, so will use the most common value of fac Warning: grid.func failed for str, so will use the most common value of str Warning: grid.func failed for date, so will use the default grid.func for date Warning: grid.func failed for ord, so will use the most common value of ord Warning: grid.func failed for fac, so will use the most common value of fac Warning: grid.func failed for str, so will use the most common value of str plotmo grid: num int bool date ord fac str 4 4 TRUE 2018-08-07 ord1 fac3 str3 > cat("grid.func=mean:\n") grid.func=mean: > plotmo(varied.type.lm, all2=TRUE, grid.func=mean, caption="varied.type.lm\ngrid.func=mean") Warning in mean.default(x, na.rm = TRUE) : argument is not numeric or logical: returning NA Warning: grid.func returned NA for ord, so will use the default grid.func for ord Warning in mean.default(x, na.rm = TRUE) : argument is not numeric or logical: returning NA Warning: grid.func returned NA for fac, so will use the default grid.func for fac Warning in mean.default(x, na.rm = TRUE) : argument is not numeric or logical: returning NA Warning: grid.func returned NA for str, so will use the default grid.func for str Warning in mean.default(x, na.rm = TRUE) : argument is not numeric or logical: returning NA Warning: grid.func returned NA for ord, so will use the default grid.func for ord Warning in mean.default(x, na.rm = TRUE) : argument is not numeric or logical: returning NA Warning: grid.func returned NA for fac, so will use the default grid.func for fac Warning in mean.default(x, na.rm = TRUE) : argument is not numeric or logical: returning NA Warning: grid.func returned NA for str, so will use the default grid.func for str plotmo grid: num int bool date ord fac str 4.115385 4 TRUE 2018-08-06 ord1 fac3 str3 > > varied.type.earth <- earth(y ~ ., data = varied.type.data, thresh=0, penalty=-1, trace=1) x[13,10] with colnames num int boolTRUE date ord.L ord.Q facfac2 facfac3 strstr2... y[13,1] with colname y, and values 1, 2, 3, 4, 5, 6, 7, 8, 9, 10... Forward pass term 1, 2, 4, 6, 8, 10, 12, 14, 16, 18 Reached maximum RSq 1.0000 at 19 terms, 13 terms used (RSq 1.0000) After forward pass GRSq 1.000 RSq 1.000 Prune backward penalty -1 nprune null: selected 13 of 13 terms, and 9 of 10 preds After pruning pass GRSq 1 RSq 1 > print(summary(varied.type.earth)) Call: earth(formula=y~., data=varied.type.data, trace=1, thresh=0, penalty=-1) coefficients (Intercept) 9.5964912 boolTRUE -2.0473684 ord.L 0.4986964 ord.Q 0.0859470 facfac2 -4.4157895 facfac3 -3.1526316 strstr2 3.2526316 h(4-num) 1.4105263 h(num-4) -0.3157895 h(4-int) 2.1157895 h(int-4) 0.3421053 h(17749-date) -3.8210526 h(date-17749) 1.4368421 Selected 13 of 13 terms, and 9 of 10 predictors Termination condition: Reached maximum RSq 1.0000 at 13 terms Importance: date, facfac2, facfac3, int, strstr2, boolTRUE, num, ord.L, ... Number of terms at each degree of interaction: 1 12 (additive model) GCV 0 RSS 0 GRSq 1 RSq 1 > set.seed(2018) > plotres(varied.type.earth, info=TRUE) Warning in cor(rank(x), rank(y)) : the standard deviation is zero Warning: draw.density.along.the.bottom: cannot determine density > plotmo(varied.type.earth, all1=TRUE, all2=TRUE, persp.ticktype="d", col.response="red") plotmo grid: num int bool date ord fac str 4 4 TRUE 2018-08-07 ord1 fac3 str3 > > # term.plot calls predict.earth with an se parameter, even with termplot(se=FALSE) > > caption <- "basic earth test against termplot" > dopar(4,4,caption) basic earth test against termplot > make.space.for.caption("test caption1") > a <- earth(O3 ~ ., data=ozone1, degree=2) > plotmo(a, do.par=FALSE, ylim=NA, caption=caption, degree2=FALSE) plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > cat("Ignore warning: predict.earth ignored argument \"se.fit\"\n") Ignore warning: predict.earth ignored argument "se.fit" > termplot(a) Warning: predict.earth ignored argument 'se.fit' > > caption <- "test change order of earth predictors and cex" > dopar(4,4,caption) test change order of earth predictors and cex > # minspan=1 to force two degree2 graphs for the test (wasn't necessary in old versions of earth) > a <- earth(doy ~ humidity + temp + wind, data=ozone1, degree=2, minspan=1) > plotmo(a, do.par=FALSE, ylim=NA, caption=caption, degree2=c(1,2), cex=1.2) plotmo grid: humidity temp wind 64 62 5 > termplot(a) Warning: predict.earth ignored argument 'se.fit' > > caption <- "test all1=TRUE" > a <- earth(doy ~ humidity + temp + wind, data=ozone1, degree=2) > plotmo(a, caption=caption, all1=TRUE, persp.ticktype="d", persp.nticks=2) plotmo grid: humidity temp wind 64 62 5 > caption <- "test all2=TRUE" > print(summary(a)) Call: earth(formula=doy~humidity+temp+wind, data=ozone1, degree=2) coefficients (Intercept) 150.868918 h(humidity-28) 1.614397 h(49-temp) -6.984397 h(3-wind) 50.527668 h(28-humidity) * h(temp-53) 8.123127 h(28-humidity) * h(53-temp) 1.520105 h(28-humidity) * h(temp-45) 5.390040 h(28-humidity) * h(temp-50) -12.953206 h(41-humidity) * h(wind-3) -0.996454 Selected 9 of 18 terms, and 3 of 3 predictors Termination condition: Reached nk 21 Importance: wind, temp, humidity Number of terms at each degree of interaction: 1 3 5 GCV 8954.829 RSS 2590958 GRSq 0.1805267 RSq 0.2771303 > plotmo(a, caption=caption, all2=TRUE) plotmo grid: humidity temp wind 64 62 5 > > oz <- ozone1[150:200,c("O3","temp","humidity","ibh")] > a.glob <- earth(O3~temp+humidity, data=oz, degree=2) > ad.glob <- earth(oz[,2:3], oz[,1], degree=2) > func1 <- function() + { + caption <- "test environments and finding the correct data" + dopar(4,4,caption) + set.seed(2016) + + plotmo(a.glob, do.par=FALSE, main="a.glob oz", + degree1=1, all2=1, degree2=1, type2="im", + col.response=3, pt.pch=20, trace=2) + mtext(caption, outer=TRUE, font=2, line=1.5, cex=1) + plotmo(ad.glob, do.par=FALSE, main="ad.glob oz", + degree1=1, all2=1, degree2=1, type2="im", + col.response=3, pch.response=20, trace=2) # pch.response test backcompat + + a <- earth(O3~temp+humidity, data=oz, degree=2) + plotmo(a, do.par=FALSE, main="a oz", + degree1=1, all2=1, degree2=1, type2="im", + col.response=3, pt.pch=20) + + ad <- earth(oz[,2:3], oz[,1], degree=2) + plotmo(ad, do.par=FALSE, main="ad oz", + degree1=1, all2=1, degree2=1, type2="im", + col.response=3, pt.pch=20) + + oz.org <- oz + oz10 <- 10 * oz # multiply by 10 so we can see by the axis labels if right data is being used + oz <- oz10 # oz is now local to this function, but multiplied by 10 + a.oz10 <- earth(O3~temp+humidity, data=oz, degree=2) + a.oz10.keep <- earth(O3~temp+humidity, data=oz, degree=2, keepxy=TRUE) + plotmo(a.oz10, do.par=FALSE, main="a oz10", + degree1=1, all2=1, degree2=1, type2="im", + col.response=3, pt.pch=20) + + ad.oz10 <- earth(oz[,2:3], oz[,1], degree=2) + ad.oz10.keep <- earth(oz[,2:3], oz[,1], degree=2, keepxy=TRUE) + plotmo(ad.oz10, do.par=FALSE, main="ad oz10", + degree1=1, all2=1, degree2=1, type2="im", + col.response=3, pt.pch=20) + + func2 <- function() { + a.func <- earth(O3 ~ temp + humidity, data=oz10, degree=2) + plotmo(a.func, do.par=FALSE, main="a.func oz10", + degree1=1, all2=1, degree2=1, type2="im", + col.response=3, pt.pch=20) + + ad.func <- earth(oz10[,2:3], oz10[,1], degree=2) + plotmo(ad.func, do.par=FALSE, main="ad.func oz10", + degree1=1, all2=1, degree2=1, type2="im", + col.response=3, pt.pch=20) + + caption <- "test environments and finding the correct data, continued" + dopar(4,4,caption) + + oz <- .1 * oz.org + a.func <- earth(O3~temp+ humidity , data=oz, degree=2) + plotmo(a.func, do.par=FALSE, main="a.func oz.1", + degree1=1, all2=1, degree2=1, type2="im", + col.response=3, pt.pch=20) + + ad.func <- earth(oz[,2:3], oz[,1], degree=2) + plotmo(ad.func, do.par=FALSE, main="ad.func oz.1", + degree1=1, all2=1, degree2=1, type2="im", + col.response=3, pt.pch=20) + + plotmo(a.oz10.keep, do.par=FALSE, main="func1:a.oz10.keep", + degree1=1, all2=1, degree2=1, type2="im", + col.response=3, pt.pch=20) + + plotmo(ad.oz10.keep, do.par=FALSE, main="func1:ad.oz10.keep", + degree1=1, all2=1, degree2=1, type2="im", + col.response=3, pt.pch=20) + + cat("Expect error msg: formal argument \"do.par\" matched by multiple actual arguments\n") + expect.err(try(plotmo(a.oz10, do.par=FALSE, main="func1:a.oz10", + degree1=1, all2=1, degree2=1, type2="im", + col.response=3, pt.pch=20, do.par=FALSE))) + } + func2() + + y <- 3:11 + x1 <- c(1,3,2,4,5,6,6,6,6) + x2 <- c(2,3,4,5,6,7,8,9,10) + frame <- data.frame(y=y, x1=x1, x2=x2) + foo <- function() + { + lm.18.out <- lm(y~x1+x2, model=FALSE) + x1[2] <- 18 + y[3] <- 19 + frame <- data.frame(y=y, x1=x1, x2=x2) + list(lm.18.out = lm.18.out, + lm.18 = lm(y~x1+x2), + lm.18.keep = lm(y~x1+x2, x=TRUE, y=TRUE), + lm.18.frame = lm(y~x1+x2, data=frame)) + } + temp <- foo() + lm.18.out <- temp$lm.18.out + lm.18 <- temp$lm.18 + lm.18.keep <- temp$lm.18.keep + lm.18.frame <- temp$lm.18.frame + + # following should all use the x1 and y inside foo + + cat("==lm.18.out\n") + plotmo(lm.18.out, main="lm.18.out", + do.par=FALSE, degree1=1, clip=FALSE, ylim=c(0,20), + col.response=2, pt.pch=20) + + cat("==lm.18\n") + plotmo(lm.18, main="lm.18", + do.par=FALSE, degree1=1, clip=FALSE, ylim=c(0,20), + col.response=2, pt.pch=20) + + cat("==lm.18.keep\n") + plotmo(lm.18.keep, main="lm.18.keep", trace=2, + do.par=FALSE, degree1=1, clip=FALSE, ylim=c(0,20), + col.response=2, pt.pch=20) + + cat("==lm.18.frame\n") + plotmo(lm.18.frame, main="lm.18.frame", + do.par=FALSE, degree1=1, clip=FALSE, ylim=c(0,20), + col.response=2, pt.pch=20) + } > func1() test environments and finding the correct data plotmo trace 2: plotmo(object=a.glob, type2="im", degree1=1, degree2=1, all2=1, do.par=FALSE, trace=2, main="a.glob oz", col.response=3, pt.pch=20) --get.model.env for object with class earth object call is earth(formula=O3~temp+humidity, data=oz, degree=2) using the environment saved in $terms of the earth model: R_GlobalEnv --plotmo_prolog for earth object 'a.glob' --plotmo_x for earth object get.object.x: object$x is NULL (and it has no colnames) object call is earth(formula=O3~temp+humidity, data=oz, degree=2) get.x.from.model.frame: formula(object) is O3 ~ temp + humidity naked formula is the same formula is valid, now looking for data for the model.frame object$model is NULL (and it has no colnames) object$data is NULL (and it has no colnames) argument 2 of the call is 'data' eval(call$data, R_GlobalEnv) call$data is usable and has column names O3 temp humidity ibh na.action(object) is "na.fail" stats::model.frame(O3 ~ temp + humidity, data=call$data, na.action="na.fail") x=model.frame[,-1] is usable and has column names temp humidity plotmo_x returned[51,2]: temp humidity 150 48 81 151 59 63 152 67 58 ... 66 68 200 79 65 ----Metadata: plotmo_predict with nresponse=NULL and newdata=NULL calling predict.earth with NULL newdata stats::predict(earth.object, NULL, type="response") predict returned[51,1]: O3 1 7.990058 2 11.446254 3 13.959851 ... 13.645652 51 18.207402 predict after processing with nresponse=NULL is [51,1]: O3 1 7.990058 2 11.446254 3 13.959851 ... 13.645652 51 18.207402 ----Metadata: plotmo_fitted with nresponse=NULL stats::fitted(object=earth.object) fitted(object) returned[51,1]: O3 1 7.990058 2 11.446254 3 13.959851 ... 13.645652 51 18.207402 fitted(object) after processing with nresponse=NULL is [51,1]: O3 1 7.990058 2 11.446254 3 13.959851 ... 13.645652 51 18.207402 ----Metadata: plotmo_y with nresponse=NULL --plotmo_y with nresponse=NULL for earth object get.object.y: object$y is NULL (and it has no colnames) object call is earth(formula=O3~temp+humidity, data=oz, degree=2) get.y.from.model.frame: formula(object) is O3 ~ temp + humidity formula is valid, now looking for data for the model.frame object$model is NULL (and it has no colnames) object$data is NULL (and it has no colnames) argument 2 of the call is 'data' eval(call$data, R_GlobalEnv) call$data is usable and has column names O3 temp humidity ibh na.action(object) is "na.fail" stats::model.frame(O3 ~ temp + humidity, data=call$data, na.action="na.fail") y=model.frame[,1] is usable and has column name O3 plotmo_y returned[51,1]: O3 150 2 151 12 152 22 ... 17 200 14 plotmo_y after processing with nresponse=NULL is [51,1]: O3 150 2 151 12 152 22 ... 17 200 14 converted nresponse=NA to nresponse=1 nresponse=1 (was NA) ncol(fitted) 1 ncol(predict) 1 ncol(y) 1 ----Metadata: plotmo_y with nresponse=1 --plotmo_y with nresponse=1 for earth object get.object.y: object$y is NULL (and it has no colnames) object call is earth(formula=O3~temp+humidity, data=oz, degree=2) get.y.from.model.frame: formula(object) is O3 ~ temp + humidity formula is valid, now looking for data for the model.frame object$model is NULL (and it has no colnames) object$data is NULL (and it has no colnames) argument 2 of the call is 'data' eval(call$data, R_GlobalEnv) call$data is usable and has column names O3 temp humidity ibh na.action(object) is "na.fail" stats::model.frame(O3 ~ temp + humidity, data=call$data, na.action="na.fail") y=model.frame[,1] is usable and has column name O3 got model response from model.frame(O3 ~ temp + humidity, data=call$data, na.action="na.fail") plotmo_y returned[51,1]: O3 150 2 151 12 152 22 ... 17 200 14 plotmo_y after processing with nresponse=1 is [51,1]: O3 150 2 151 12 152 22 ... 17 200 14 got response name "O3" from yhat resp.levs is NULL ----Metadata: done number of x values: temp 27 humidity 27 ----plotmo_singles for earth object singles: 1 temp ----plotmo_pairs for earth object pairs: [,1] [,2] [1,] "1 temp" "2 humidity" ----Figuring out ylim --get.ylim.by.dummy.plots --plot.degree1(draw.plot=FALSE) degree1 plot1 (pmethod "plotmo") variable temp newdata[50,2]: temp humidity 1 48.00000 68 2 48.91837 68 3 49.83673 68 ... 50.75510 68 50 93.00000 68 stats::predict(earth.object, data.frame[50,2], type="response") predict returned[50,1]: O3 1 7.990058 2 8.278609 3 8.567159 ... 8.855710 50 29.834221 predict after processing with nresponse=1 is [50,1]: O3 1 7.990058 2 8.278609 3 8.567159 ... 8.855710 50 29.834221 --plot.degree2(draw.plot=FALSE) degree2 plot1 (pmethod "plotmo") variables temp:humidity newdata[400,2]: temp humidity 1 48.00000 33 2 50.36842 33 3 52.73684 33 ... 55.10526 33 400 93.00000 90 stats::predict(earth.object, data.frame[400,2], type="response") predict returned[400,1]: O3 1 7.990058 2 8.734215 3 9.478372 ... 10.222529 400 33.851866 predict after processing with nresponse=1 is [400,1]: O3 1 7.990058 2 8.734215 3 9.478372 ... 10.222529 400 33.851866 --done get.ylim.by.dummy.plots ylim c(1.936, 33.94) clip TRUE --plot.degree1(draw.plot=TRUE) plotmo grid: temp humidity 80 68 graphics::plot.default(x=c(48,48.92,49.8...), y=c(7.99,8.279,8...), type="n", main="a.glob oz", xlab="", ylab="", xaxt="s", yaxt="s", xlim=c(47.98,93.08), ylim=c(1.94,33.94)) --plot.degree2(draw.plot=TRUE) plotmo trace 2: plotmo(object=ad.glob, type2="im", degree1=1, degree2=1, all2=1, do.par=FALSE, trace=2, main="ad.glob oz", col.response=3, pch.response=20) --get.model.env for object with class earth object call is earth(x=oz[, 2:3], y=oz[, 1], degree=2) assuming the environment of the earth model is that of plotmo's caller: env(caption) --plotmo_prolog for earth object 'ad.glob' --plotmo_x for earth object get.object.x: object$x is NULL (and it has no colnames) object call is earth(x=oz[, 2:3], y=oz[, 1], degree=2) get.x.from.model.frame: terms(object) did not return the terms, will look for the formula elsewhere no formula in getCall(object) get.data.from.object.call.field: eval(getCall(object)$x, env(caption)) getCall(object)$x is usable and has column names temp humidity plotmo_x returned[51,2]: temp humidity 150 48 81 151 59 63 152 67 58 ... 66 68 200 79 65 ----Metadata: plotmo_predict with nresponse=NULL and newdata=NULL calling predict.earth with NULL newdata stats::predict(earth.object, NULL, type="response") predict returned[51,1]: oz[, 1] 1 7.990058 2 11.446254 3 13.959851 ... 13.645652 51 18.207402 predict after processing with nresponse=NULL is [51,1]: oz[, 1] 1 7.990058 2 11.446254 3 13.959851 ... 13.645652 51 18.207402 ----Metadata: plotmo_fitted with nresponse=NULL stats::fitted(object=earth.object) fitted(object) returned[51,1]: oz[, 1] 1 7.990058 2 11.446254 3 13.959851 ... 13.645652 51 18.207402 fitted(object) after processing with nresponse=NULL is [51,1]: oz[, 1] 1 7.990058 2 11.446254 3 13.959851 ... 13.645652 51 18.207402 ----Metadata: plotmo_y with nresponse=NULL --plotmo_y with nresponse=NULL for earth object get.object.y: object$y is NULL (and it has no colnames) object call is earth(x=oz[, 2:3], y=oz[, 1], degree=2) get.y.from.model.frame: terms(object) did not return the terms, will look for the formula elsewhere no formula in getCall(object) get.data.from.object.call.field: eval(getCall(object)$y, env(caption)) getCall(object)$y is usable but without colnames so we will keep on searching names(call) is "" "x" "y" "degree" the name of argument 2 is "y" so we will not process it with argn object$y is NULL call$y is usable but without colnames but we will use it anyway colname was NULL now "y" plotmo_y returned[51,1]: y 1 2 2 12 3 22 ... 17 51 14 plotmo_y after processing with nresponse=NULL is [51,1]: y 1 2 2 12 3 22 ... 17 51 14 converted nresponse=NA to nresponse=1 nresponse=1 (was NA) ncol(fitted) 1 ncol(predict) 1 ncol(y) 1 ----Metadata: plotmo_y with nresponse=1 --plotmo_y with nresponse=1 for earth object get.object.y: object$y is NULL (and it has no colnames) object call is earth(x=oz[, 2:3], y=oz[, 1], degree=2) get.y.from.model.frame: terms(object) did not return the terms, will look for the formula elsewhere no formula in getCall(object) get.data.from.object.call.field: eval(getCall(object)$y, env(caption)) getCall(object)$y is usable but without colnames so we will keep on searching names(call) is "" "x" "y" "degree" the name of argument 2 is "y" so we will not process it with argn object$y is NULL call$y is usable but without colnames but we will use it anyway got model response from getCall(object)$y colname was NULL now "y" plotmo_y returned[51,1]: y 1 2 2 12 3 22 ... 17 51 14 plotmo_y after processing with nresponse=1 is [51,1]: y 1 2 2 12 3 22 ... 17 51 14 got response name "oz[, 1]" from yhat resp.levs is NULL ----Metadata: done number of x values: temp 27 humidity 27 ----plotmo_singles for earth object singles: 1 temp ----plotmo_pairs for earth object pairs: [,1] [,2] [1,] "1 temp" "2 humidity" ----Figuring out ylim --get.ylim.by.dummy.plots --plot.degree1(draw.plot=FALSE) degree1 plot1 (pmethod "plotmo") variable temp newdata[50,2]: temp humidity 1 48.00000 68 2 48.91837 68 3 49.83673 68 ... 50.75510 68 50 93.00000 68 stats::predict(earth.object, data.frame[50,2], type="response") predict returned[50,1]: oz[, 1] 1 7.990058 2 8.278609 3 8.567159 ... 8.855710 50 29.834221 predict after processing with nresponse=1 is [50,1]: oz[, 1] 1 7.990058 2 8.278609 3 8.567159 ... 8.855710 50 29.834221 --plot.degree2(draw.plot=FALSE) degree2 plot1 (pmethod "plotmo") variables temp:humidity newdata[400,2]: temp humidity 1 48.00000 33 2 50.36842 33 3 52.73684 33 ... 55.10526 33 400 93.00000 90 stats::predict(earth.object, data.frame[400,2], type="response") predict returned[400,1]: oz[, 1] 1 7.990058 2 8.734215 3 9.478372 ... 10.222529 400 33.851866 predict after processing with nresponse=1 is [400,1]: oz[, 1] 1 7.990058 2 8.734215 3 9.478372 ... 10.222529 400 33.851866 --done get.ylim.by.dummy.plots ylim c(1.931, 34) clip TRUE --plot.degree1(draw.plot=TRUE) plotmo grid: temp humidity 80 68 graphics::plot.default(x=c(48,48.92,49.8...), y=c(7.99,8.279,8...), type="n", main="ad.glob oz", xlab="", ylab="", xaxt="s", yaxt="s", xlim=c(48,93), ylim=c(1.93,34)) --plot.degree2(draw.plot=TRUE) plotmo grid: temp humidity 80 68 plotmo grid: temp humidity 80 68 plotmo grid: temp humidity 800 680 plotmo grid: temp humidity 800 680 plotmo grid: temp humidity 800 680 plotmo grid: temp humidity 800 680 test environments and finding the correct data, continued plotmo grid: temp humidity 8 6.8 plotmo grid: temp humidity 8 6.8 plotmo grid: temp humidity 800 680 plotmo grid: temp humidity 800 680 Expect error msg: formal argument "do.par" matched by multiple actual arguments Error in plotmo(a.oz10, do.par = FALSE, main = "func1:a.oz10", degree1 = 1, : formal argument "do.par" matched by multiple actual arguments Got expected error from try(plotmo(a.oz10, do.par = FALSE, main = "func1:a.oz10", degree1 = 1, all2 = 1, degree2 = 1, type2 = "im", col.response = 3, pt.pch = 20, do.par = FALSE)) ==lm.18.out plotmo grid: x1 x2 6 6 ==lm.18 plotmo grid: x1 x2 6 6 ==lm.18.keep plotmo trace 2: plotmo(object=lm.18.keep, degree1=1, do.par=FALSE, clip=FALSE, ylim=c(0,20), trace=2, main="lm.18.keep", col.response=2, pt.pch=20) --get.model.env for object with class lm object call is lm(formula=y~x1+x2, x=TRUE, y=TRUE) using the environment saved in $terms of the lm model: env(frame, lm.18.out, x1, y) --plotmo_prolog for lm object 'lm.18.keep' --plotmo_x for lm object get.object.x: object$x is usable and has column names (Intercept) x1 x2 dropped "(Intercept)" column from x plotmo_x returned[9,2]: x1 x2 1 1 2 2 18 3 3 2 4 ... 4 5 9 6 10 ----Metadata: plotmo_predict with nresponse=NULL and newdata=NULL calling predict.lm with NULL newdata stats::predict(lm.object, NULL, type="response") predict returned[9,1] with no column names: 1 8.098674 2 3.323243 3 8.792796 ... 8.674176 9 10.564707 predict after processing with nresponse=NULL is [9,1] with no column names: 1 8.098674 2 3.323243 3 8.792796 ... 8.674176 9 10.564707 ----Metadata: plotmo_fitted with nresponse=NULL stats::fitted(object=lm.object) fitted(object) returned[9,1] with no column names: 1 8.098674 2 3.323243 3 8.792796 ... 8.674176 9 10.564707 fitted(object) after processing with nresponse=NULL is [9,1] with no column names: 1 8.098674 2 3.323243 3 8.792796 ... 8.674176 9 10.564707 ----Metadata: plotmo_y with nresponse=NULL --plotmo_y with nresponse=NULL for lm object get.object.y: object$y is usable but without colnames so we will keep on searching object call is lm(formula=y~x1+x2, x=TRUE, y=TRUE) get.y.from.model.frame: formula(object) is y ~ x1 + x2 formula is valid, now looking for data for the model.frame object$model is usable and has column names y x1 x2 y=model.frame[,1] is usable and has column name y plotmo_y returned[9,1]: y 1 3 2 4 3 19 ... 6 9 11 plotmo_y after processing with nresponse=NULL is [9,1]: y 1 3 2 4 3 19 ... 6 9 11 converted nresponse=NA to nresponse=1 nresponse=1 (was NA) ncol(fitted) 1 ncol(predict) 1 ncol(y) 1 ----Metadata: plotmo_y with nresponse=1 --plotmo_y with nresponse=1 for lm object get.object.y: object$y is usable but without colnames so we will keep on searching object call is lm(formula=y~x1+x2, x=TRUE, y=TRUE) get.y.from.model.frame: formula(object) is y ~ x1 + x2 formula is valid, now looking for data for the model.frame object$model is usable and has column names y x1 x2 y=model.frame[,1] is usable and has column name y got model response from object$model plotmo_y returned[9,1]: y 1 3 2 4 3 19 ... 6 9 11 plotmo_y after processing with nresponse=1 is [9,1]: y 1 3 2 4 3 19 ... 6 9 11 got response name "y" from yfull resp.levs is NULL ----Metadata: done number of x values: x1 6 x2 9 ----plotmo_singles for lm object singles: 1 x1 ----plotmo_pairs for lm object formula(object) returned y ~ x1 + x2 formula.vars "x1" "x2" term.labels "x1" "x2" plotmo_pairs_from_term_labels term.labels: "x1" "x2" "x1" "x2" pred.names: "x1" "x2" considering x1 considering x2 considering x1 considering x2 no pairs ----Figuring out ylim ylim c(0, 20) clip FALSE --plot.degree1(draw.plot=TRUE) plotmo grid: x1 x2 6 6 degree1 plot1 (pmethod "plotmo") variable x1 newdata[50,2]: x1 x2 1 1.000000 6 2 1.346939 6 3 1.693878 6 ... 2.040816 6 50 18.000000 6 stats::predict(lm.object, data.frame[50,2], type="response") predict returned[50,1] with no column names: 1 10.107826 2 10.000117 3 9.892409 ... 9.784700 50 4.830107 predict after processing with nresponse=1 is [50,1]: predict 1 10.107826 2 10.000117 3 9.892409 ... 9.784700 50 4.830107 graphics::plot.default(x=c(1,1.347,1.694...), y=c(10.11,10,9.89...), type="n", main="lm.18.keep", xlab="", ylab="", xaxt="s", yaxt="s", xlim=c(1,18.04), ylim=c(0,20)) ==lm.18.frame plotmo grid: x1 x2 6 6 > > caption <- "test earth formula versus x,y model" > # dopar(4,4,caption) > # mtext(caption, outer=TRUE, font=2, line=1.5, cex=1) > a <- earth(O3 ~ ., data=ozone1, degree=2) > plotmo(a, caption="test earth formula versus xy model (formula)") plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > a <- earth(ozone1[, -1], ozone1[,1], degree=2) > plotmo(a, caption="test earth formula versus xy model (xy)") plotmo grid: vh wind humidity temp ibh dpg ibt vis doy 5760 5 64 62 2112.5 24 167.5 120 205.5 > > # single predictor > caption <- "test earth(O3~wind, data=ozone1, degree=2), single predictor" > dopar(2,2,caption) test earth(O3~wind, data=ozone1, degree=2), single predictor > a <- earth(O3~wind, data=ozone1, degree=2) > plotmo(a) > > caption = "se=2, earth(doy~humidity+temp+wind, data=ozone1) versus termplot (expect no se lines)" > dopar(3,3,caption) se=2, earth(doy~humidity+temp+wind, data=ozone1) versus termplot (expect no se lines) > mtext(caption, outer=TRUE, font=2, line=1.5, cex=1) > # minspan=1 to force two degree2 graphs for the test (wasn't necessary in old versions of earth) > a <- earth(doy~humidity + temp + wind, data=ozone1, degree=2, minspan=1) > cat("Ignore warning: predict.earth ignored argument \"se\"\n") Ignore warning: predict.earth ignored argument "se" > termplot(a) Warning: predict.earth ignored argument 'se.fit' > plotmo(a, do.par=FALSE, ylim=NA, degree2=c(1:2), clip=FALSE, caption=caption) plotmo grid: humidity temp wind 64 62 5 > > # test fix to bug reported by Joe Retzer, FIXED Dec 7, 2007 > N <- 650 > set.seed(2007) > q_4 <- runif(N, -1, 1) > q_2102 <- runif(N, -1, 1) > q_2104 <- runif(N, -1, 1) > q_3105 <- runif(N, -1, 1) > q_3106 <- runif(N, -1, 1) > q_4104 <- runif(N, -1, 1) > q_6101 <- runif(N, -1, 1) > q_6103 <- runif(N, -1, 1) > q_7104 <- runif(N, -1, 1) > q_3109 <- runif(N, -1, 1) > q_4103 <- runif(N, -1, 1) > q_2111 <- runif(N, -1, 1) > q_3107 <- runif(N, -1, 1) > q_3101 <- runif(N, -1, 1) > q_3104 <- runif(N, -1, 1) > q_7107 <- runif(N, -1, 1) > depIndex <- sin(1.0 * q_4 + rnorm(650, sd=.8)) + sin(1.8 * q_2102 + rnorm(650, sd=.8)) + sin(1.3 * q_2104 + rnorm(650, sd=.8)) + sin(1.4 * q_3105 + rnorm(650, sd=.8)) + + sin(1.5 * q_3106 + rnorm(650, sd=.8)) + sin(1.6 * q_4104 + rnorm(650, sd=.8)) + sin(1.8 * q_6101 + rnorm(650, sd=.8)) + sin(1.8 * q_6103 + rnorm(650, sd=.8)) + + sin(1.9 * q_7104 + rnorm(650, sd=.8)) + sin(2.0 * q_3109 + rnorm(650, sd=.8)) > > regDatCWD <- as.data.frame(cbind(depIndex, q_4, q_2102, q_2104, q_3105, q_3106, q_4104, q_6101, q_6103, q_7104, q_3109, q_4103, q_2111, q_3107, q_3101, q_3104, q_7107)) > cat("--plotmo(earthobj5)--\n") --plotmo(earthobj5)-- > earthobj5 <- earth(depIndex ~ q_4+q_2102+q_2104+q_3105+q_3106+q_4104+q_6101+q_6103+q_7104+q_3109+q_4103+q_2111+q_3107+q_3101+q_3104+q_7107, data=regDatCWD) > print(summary(earthobj5, digits = 2)) Call: earth(formula=depIndex~q_4+q_2102+q_2104+q_3105+q_3106+q_4104+q_...), data=regDatCWD) coefficients (Intercept) 1.79 h(0.782075-q_4) -0.97 h(q_4-0.782075) -5.36 h(q_2102- -0.664223) 1.19 h(q_2104- -0.954733) 0.85 h(0.83147-q_3105) -0.77 h(0.492009-q_3106) -0.93 h(q_4104- -0.671276) 1.02 h(0.483685-q_6101) -1.10 h(0.914724-q_6103) -1.12 h(0.545206-q_7104) -1.19 h(-0.157173-q_3109) -0.96 h(q_3109- -0.157173) 1.03 Selected 13 of 21 terms, and 10 of 16 predictors Termination condition: RSq changed by less than 0.001 at 21 terms Importance: q_6103, q_4104, q_2102, q_7104, q_3109, q_6101, q_2104, q_4, ... Number of terms at each degree of interaction: 1 12 (additive model) GCV 2.5 RSS 1509 GRSq 0.53 RSq 0.57 > plotmo(earthobj5) plotmo grid: q_4 q_2102 q_2104 q_3105 q_3106 q_4104 0.05726625 0.01725001 0.004659335 -0.01826179 -0.00913319 0.01401429 q_6101 q_6103 q_7104 q_3109 q_4103 q_2111 -0.04790454 0.03681165 0.01827148 -0.09899272 -0.0623349 0.01007481 q_3107 q_3101 q_3104 q_7107 -0.02481171 -0.07733527 -0.003053319 0.02821214 > > # long predictor names > > a.rather.long.in.fact.very.long.name.q_4 <- q_4 > a.rather.long.in.fact.very.long.name.q_2102 <- q_2102 > a.rather.long.in.fact.very.long.name.q_2104 <- q_2104 > a.rather.long.in.fact.very.long.name.q_3105 <- q_3105 > a.rather.long.in.fact.very.long.name.q_3106 <- q_3106 > a.rather.long.in.fact.very.long.name.q_4104 <- q_4104 > a.rather.long.in.fact.very.long.name.q_6101 <- q_6101 > a.rather.long.in.fact.very.long.name.q_6103 <- q_6103 > a.rather.long.in.fact.very.long.name.q_7104 <- q_7104 > a.rather.long.in.fact.very.long.name.q_3109 <- q_3109 > a.rather.long.in.fact.very.long.name.q_4103 <- q_4103 > a.rather.long.in.fact.very.long.name.q_2111 <- q_2111 > a.rather.long.in.fact.very.long.name.q_3107 <- q_3107 > a.rather.long.in.fact.very.long.name.q_3101 <- q_3101 > a.rather.long.in.fact.very.long.name.q_3104 <- q_3104 > a.rather.long.in.fact.very.long.name.q_7107 <- q_7107 > a.rather.long.in.fact.very.long.name.for.the.response <- depIndex > a.rather.long.in.fact.very.long.name.for.the.dataframe <- + as.data.frame(cbind( + a.rather.long.in.fact.very.long.name.for.the.response, + a.rather.long.in.fact.very.long.name.q_4, + a.rather.long.in.fact.very.long.name.q_2102, + a.rather.long.in.fact.very.long.name.q_2104, + a.rather.long.in.fact.very.long.name.q_3105, + a.rather.long.in.fact.very.long.name.q_3106, + a.rather.long.in.fact.very.long.name.q_4104, + a.rather.long.in.fact.very.long.name.q_6101, + a.rather.long.in.fact.very.long.name.q_6103, + a.rather.long.in.fact.very.long.name.q_7104, + a.rather.long.in.fact.very.long.name.q_3109, + a.rather.long.in.fact.very.long.name.q_4103, + a.rather.long.in.fact.very.long.name.q_2111, + a.rather.long.in.fact.very.long.name.q_3107, + a.rather.long.in.fact.very.long.name.q_3101, + a.rather.long.in.fact.very.long.name.q_3104, + a.rather.long.in.fact.very.long.name.q_7107)) > > cat("--a.rather.long.in.fact.very.long.name.for.the...A--\n") --a.rather.long.in.fact.very.long.name.for.the...A-- > a.rather.long.in.fact.very.long.name.for.the.modelA <- + earth(a.rather.long.in.fact.very.long.name.for.the.response ~ + a.rather.long.in.fact.very.long.name.q_4 + + a.rather.long.in.fact.very.long.name.q_2102 + + a.rather.long.in.fact.very.long.name.q_2104 + + a.rather.long.in.fact.very.long.name.q_3105 + + a.rather.long.in.fact.very.long.name.q_3106 + + a.rather.long.in.fact.very.long.name.q_4104 + + a.rather.long.in.fact.very.long.name.q_6101 + + a.rather.long.in.fact.very.long.name.q_6103 + + a.rather.long.in.fact.very.long.name.q_7104 + + a.rather.long.in.fact.very.long.name.q_3109 + + a.rather.long.in.fact.very.long.name.q_4103 + + a.rather.long.in.fact.very.long.name.q_2111 + + a.rather.long.in.fact.very.long.name.q_3107 + + a.rather.long.in.fact.very.long.name.q_3101 + + a.rather.long.in.fact.very.long.name.q_3104 + + a.rather.long.in.fact.very.long.name.q_7107, + data = a.rather.long.in.fact.very.long.name.for.the.dataframe) > print(summary(a.rather.long.in.fact.very.long.name.for.the.modelA, digits = 2)) Call: earth(formula=a.rather.long.in.fact.very.long.name.for.the.respo...), data=a.rather.long.in.fact.very.long.name.for.the.da...) coefficients (Intercept) 1.79 h(0.782075-a.rather.long.in.fact.very.long.name.q_4) -0.97 h(a.rather.long.in.fact.very.long.name.q_4-0.782075) -5.36 h(a.rather.long.in.fact.very.long.name.q_2102- -0.664223) 1.19 h(a.rather.long.in.fact.very.long.name.q_2104- -0.954733) 0.85 h(0.83147-a.rather.long.in.fact.very.long.name.q_3105) -0.77 h(0.492009-a.rather.long.in.fact.very.long.name.q_3106) -0.93 h(a.rather.long.in.fact.very.long.name.q_4104- -0.671276) 1.02 h(0.483685-a.rather.long.in.fact.very.long.name.q_6101) -1.10 h(0.914724-a.rather.long.in.fact.very.long.name.q_6103) -1.12 h(0.545206-a.rather.long.in.fact.very.long.name.q_7104) -1.19 h(-0.157173-a.rather.long.in.fact.very.long.name.q_3109) -0.96 h(a.rather.long.in.fact.very.long.name.q_3109- -0.157173) 1.03 Selected 13 of 21 terms, and 10 of 16 predictors Termination condition: RSq changed by less than 0.001 at 21 terms Importance: a.rather.long.in.fact.very.long.name.q_6103, ... Number of terms at each degree of interaction: 1 12 (additive model) GCV 2.5 RSS 1509 GRSq 0.53 RSq 0.57 > plot(a.rather.long.in.fact.very.long.name.for.the.modelA) > plotmo(a.rather.long.in.fact.very.long.name.for.the.modelA) plotmo grid: a.rather.long.in.fact.very.long.name.q_4 0.05726625 a.rather.long.in.fact.very.long.name.q_2102 0.01725001 a.rather.long.in.fact.very.long.name.q_2104 0.004659335 a.rather.long.in.fact.very.long.name.q_3105 -0.01826179 a.rather.long.in.fact.very.long.name.q_3106 -0.00913319 a.rather.long.in.fact.very.long.name.q_4104 0.01401429 a.rather.long.in.fact.very.long.name.q_6101 -0.04790454 a.rather.long.in.fact.very.long.name.q_6103 0.03681165 a.rather.long.in.fact.very.long.name.q_7104 0.01827148 a.rather.long.in.fact.very.long.name.q_3109 -0.09899272 a.rather.long.in.fact.very.long.name.q_4103 -0.0623349 a.rather.long.in.fact.very.long.name.q_2111 0.01007481 a.rather.long.in.fact.very.long.name.q_3107 -0.02481171 a.rather.long.in.fact.very.long.name.q_3101 -0.07733527 a.rather.long.in.fact.very.long.name.q_3104 -0.003053319 a.rather.long.in.fact.very.long.name.q_7107 0.02821214 > > cat("--a.rather.long.in.fact.very.long.name.for.the...C--\n") --a.rather.long.in.fact.very.long.name.for.the...C-- > a.rather.long.in.fact.very.long.name.for.the.modelC <- + earth(x = a.rather.long.in.fact.very.long.name.for.the.dataframe[,-1], + y = a.rather.long.in.fact.very.long.name.for.the.response, + degree = 3) > print(summary(a.rather.long.in.fact.very.long.name.for.the.modelC, digits = 2)) Call: earth(x=a.rather.long.in.fact.very.long.name.for.the.dataf...), y=a.rather.long.in.fact.very.long.name.for.the.re..., degree=3) coefficients (Intercept) 1.72 h(0.782075-a.rather.long.in.fact.very.long.name.q_4) -1.02 h(a.rather.long.in.fact.very.long.name.q_4-0.782075) -10.33 h(a.rather.long.in.fact.very.long.name.q_2102- -0.664223) 1.27 h(a.rather.long.in.fact.very.long.name.q_2104- -0.954733) 0.82 h(0.83147-a.rather.long.in.fact.very.long.name.q_3105) -1.00 h(0.492009-a.rather.long.in.fact.very.long.name.q_3106) -0.90 h(a.rather.long.in.fact.very.long.name.q_4104- -0.671276) 1.01 h(0.483685-a.rather.long.in.fact.very.long.name.q_6101) -1.09 h(0.914724-a.rather.long.in.fact.very.long.name.q_6103) -1.18 h(0.545206-a.rather.long.in.fact.very.long.name.q_7104) -1.62 h(-0.157173-a.rather.long.in.fact.very.long.name.q_3109) -1.81 h(a.rather.long.in.fact.very.long.name.q_3109- -0.157173) 1.15 h(-0.664223-a.rather.long.in.fact.very.long.name.q_2102) * h(a.rather.long.in.fact.very.long.name.q_3106- -0.148502) 3.71 h(0.83147-a.rather.long.in.fact.very.long.name.q_3105) * h(a.rather.long.in.fact.very.long.name.q_7107- -0.748278) 0.31 h(0.914724-a.rather.long.in.fact.very.long.name.q_6103) * h(-0.713314-a.rather.long.in.fact.very.long.name.q_3107) 2.90 h(0.545206-a.rather.long.in.fact.very.long.name.q_7104) * h(a.rather.long.in.fact.very.long.name.q_2111- -0.544753) 0.61 h(-0.157173-a.rather.long.in.fact.very.long.name.q_3109) * h(0.700096-a.rather.long.in.fact.very.long.name.q_2111) 1.33 h(a.rather.long.in.fact.very.long.name.q_4-0.82106) * h(0.545206-a.rather.long.in.fact.very.long.name.q_7104) * h(a.rather.long.in.fact.very.long.name.q_2111- -0.544753) 15.97 Selected 19 of 33 terms, and 13 of 16 predictors Termination condition: Reached nk 33 Importance: a.rather.long.in.fact.very.long.name.q_6103, ... Number of terms at each degree of interaction: 1 12 5 1 GCV 2.4 RSS 1374 GRSq 0.54 RSq 0.6 > plot(a.rather.long.in.fact.very.long.name.for.the.modelC) > plotmo(a.rather.long.in.fact.very.long.name.for.the.modelC) plotmo grid: a.rather.long.in.fact.very.long.name.q_4 0.05726625 a.rather.long.in.fact.very.long.name.q_2102 0.01725001 a.rather.long.in.fact.very.long.name.q_2104 0.004659335 a.rather.long.in.fact.very.long.name.q_3105 -0.01826179 a.rather.long.in.fact.very.long.name.q_3106 -0.00913319 a.rather.long.in.fact.very.long.name.q_4104 0.01401429 a.rather.long.in.fact.very.long.name.q_6101 -0.04790454 a.rather.long.in.fact.very.long.name.q_6103 0.03681165 a.rather.long.in.fact.very.long.name.q_7104 0.01827148 a.rather.long.in.fact.very.long.name.q_3109 -0.09899272 a.rather.long.in.fact.very.long.name.q_4103 -0.0623349 a.rather.long.in.fact.very.long.name.q_2111 0.01007481 a.rather.long.in.fact.very.long.name.q_3107 -0.02481171 a.rather.long.in.fact.very.long.name.q_3101 -0.07733527 a.rather.long.in.fact.very.long.name.q_3104 -0.003053319 a.rather.long.in.fact.very.long.name.q_7107 0.02821214 > > a <- earth(survived ~ pclass+sex+age, data=etitanic, degree=2) > print(summary(a)) Call: earth(formula=survived~pclass+sex+age, data=etitanic, degree=2) coefficients (Intercept) 0.92939850 pclass3rd -0.45571429 pclass2nd * sexmale -0.27354805 pclass3rd * sexmale 0.18991361 sexmale * h(age-16) 0.05497748 sexmale * h(age-25) -0.01885057 sexmale * h(age-2) -0.04217428 Selected 7 of 14 terms, and 4 of 4 predictors Termination condition: Reached nk 21 Importance: sexmale, pclass3rd, pclass2nd, age Number of terms at each degree of interaction: 1 1 5 GCV 0.1442766 RSS 146.3318 GRSq 0.4039126 RSq 0.4209023 > plotmo(a, caption="plotmo with facs: pclass+sex+age") plotmo grid: pclass sex age 3rd male 28 > plotmo(a, caption="plotmo with facs: pclass+sex+age, all1=T, grid.col=\"gray\"", all1=T, grid.col="gray") plotmo grid: pclass sex age 3rd male 28 > plotmo(a, caption="plotmo with facs: pclass+sex+age, all2=T, col.grid=\"green\"", all2=T, col.grid="green") plotmo grid: pclass sex age 3rd male 28 > plotmo(a, caption="plotmo with facs: pclass+sex+age, all1=T, all2=T, grid=2", all1=T, all2=T, grid.col=2) plotmo grid: pclass sex age 3rd male 28 > plotmo(a, clip=FALSE, degree2=FALSE, caption="plotmo (no degree2) with facs: pclass+sex+age") plotmo grid: pclass sex age 3rd male 28 > plotmo(a, clip=FALSE, grid.levels=list(pclass="2n", sex="ma"), + caption="plotmo with grid.levels: pclass+sex+age") plotmo grid: pclass sex age 2nd male 28 > # in above tests, all degree2 terms use facs > # now build a model with some degree2 term that use facs, some that don't > a <- earth(survived ~ pclass+age+sibsp, data=etitanic, degree=2) > print(summary(a)) Call: earth(formula=survived~pclass+age+sibsp, data=etitanic, degree=2) coefficients (Intercept) 1.20590993 pclass2nd -0.27484540 pclass3rd -0.45765086 h(age-5) -0.03561187 h(age-18) 0.03022469 h(18-age) * h(sibsp-2) -0.04797511 h(18-age) * h(sibsp-3) 0.04721023 Selected 7 of 17 terms, and 4 of 4 predictors Termination condition: Reached nk 21 Importance: pclass3rd, age, pclass2nd, sibsp Number of terms at each degree of interaction: 1 4 2 GCV 0.2040487 RSS 206.9554 GRSq 0.1569604 RSq 0.1809888 > plotmo(a, caption="plotmo with mixed fac and non-fac degree2 terms", persp.border=NA) plotmo grid: pclass age sibsp 3rd 28 0 > plotmo(a, caption="plotmo with mixed fac and non-fac degree2 terms and grid.levels", + grid.levels=list(pclass="2n", age=20), # test partial matching of grid levels, and numeric preds + persp.ticktype="d", persp.nticks=2) plotmo grid: pclass age sibsp 2nd 20 0 > > # check detection of illegal grid.levels argument > expect.err(try(plotmo(a, grid.levels=list(pcla="1", pclass="2"))), 'illegal grid.levels argument ("pcla" and "pclass" both match "pclass")') Error : illegal grid.levels argument ("pcla" and "pclass" both match "pclass") Got expected error from try(plotmo(a, grid.levels = list(pcla = "1", pclass = "2"))) > expect.err(try(plotmo(a, grid.levels=list(pclass="1", pcla="2"))), 'illegal grid.levels argument ("pclass" and "pcla" both match "pclass")') Error : illegal grid.levels argument ("pclass" and "pcla" both match "pclass") Got expected error from try(plotmo(a, grid.levels = list(pclass = "1", pcla = "2"))) > expect.err(try(plotmo(a, grid.levels=list(pcla="nonesuch"))), 'illegal level "nonesuch" for "pclass" in grid.levels (allowed levels are "1st" "2nd" "3rd")') Error : illegal level "nonesuch" for "pclass" in grid.levels (allowed levels are "1st" "2nd" "3rd") Got expected error from try(plotmo(a, grid.levels = list(pcla = "nonesuch"))) > expect.err(try(plotmo(a, grid.levels=list(pcla="1sx"))), 'illegal level "1sx" for "pclass" in grid.levels (allowed levels are "1st" "2nd" "3rd")') Error : illegal level "1sx" for "pclass" in grid.levels (allowed levels are "1st" "2nd" "3rd") Got expected error from try(plotmo(a, grid.levels = list(pcla = "1sx"))) > expect.err(try(plotmo(a, grid.levels=list(pcla=1))), 'illegal level for "pclass" in grid.levels (specify factor levels with a string)') Error : illegal level for "pclass" in grid.levels (specify factor levels with a string) Got expected error from try(plotmo(a, grid.levels = list(pcla = 1))) > expect.err(try(plotmo(a, grid.levels=list(pcla=c("ab", "cd")))), "length(pclass) in grid.levels is not 1") Error : length(pclass) in grid.levels is not 1 Got expected error from try(plotmo(a, grid.levels = list(pcla = c("ab", "cd")))) > expect.err(try(plotmo(a, grid.levels=list(pcla=NA))), 'pclass in grid.levels is NA') Error : pclass in grid.levels is NA Got expected error from try(plotmo(a, grid.levels = list(pcla = NA))) > expect.err(try(plotmo(a, grid.levels=list(pcla=Inf))), 'pclass in grid.levels is infinite') Error : pclass in grid.levels is infinite Got expected error from try(plotmo(a, grid.levels = list(pcla = Inf))) > expect.err(try(plotmo(a, grid.levels=list(pcla=9))), 'illegal level for "pclass" in grid.levels (specify factor levels with a string)') Error : illegal level for "pclass" in grid.levels (specify factor levels with a string) Got expected error from try(plotmo(a, grid.levels = list(pcla = 9))) > options(warn=2) > expect.err(try(plotmo(a, grid.levels=list(age="ab"))), 'grid.levels returned class \"character\" for age, so will use the default grid.func for age') Error : (converted from warning) grid.levels returned class "character" for age, so will use the default grid.func for age Got expected error from try(plotmo(a, grid.levels = list(age = "ab"))) > options(warn=1) > expect.err(try(plotmo(a, grid.levels=list(age=NA))), 'age in grid.levels is NA') Error : age in grid.levels is NA Got expected error from try(plotmo(a, grid.levels = list(age = NA))) > expect.err(try(plotmo(a, grid.levels=list(age=Inf))), 'age in grid.levels is infinite') Error : age in grid.levels is infinite Got expected error from try(plotmo(a, grid.levels = list(age = Inf))) > expect.err(try(plotmo(a, grid.lev=list(age=list(1,2)))), 'length(age) in grid.levels is not 1') Error : length(age) in grid.levels is not 1 Got expected error from try(plotmo(a, grid.lev = list(age = list(1, 2)))) > > # more-or-less repeat above, but with glm models > a <- earth(survived ~ pclass+age+sibsp, data=etitanic, degree=2, glm=list(family=binomial)) > print(summary(a)) Call: earth(formula=survived~pclass+age+sibsp, data=etitanic, glm=list(family=binomial), degree=2) GLM coefficients survived (Intercept) 3.4306891 pclass2nd -1.2012524 pclass3rd -2.0973424 h(age-5) -0.1769427 h(age-18) 0.1502007 h(18-age) * h(sibsp-2) -0.2887477 h(18-age) * h(sibsp-3) 0.2820357 GLM (family binomial, link logit): nulldev df dev df devratio AIC iters converged 1414.62 1045 1212.21 1039 0.143 1226 5 1 Earth selected 7 of 17 terms, and 4 of 4 predictors Termination condition: Reached nk 21 Importance: pclass3rd, age, pclass2nd, sibsp Number of terms at each degree of interaction: 1 4 2 Earth GCV 0.2040487 RSS 206.9554 GRSq 0.1569604 RSq 0.1809888 > plotmo(a, ylim=c(0, 1), caption="plotmo glm with mixed fac and non-fac degree2 terms") plotmo grid: pclass age sibsp 3rd 28 0 > plotmo(a, ylim=c(0, 1), caption="plotmo glm with mixed fac and non-fac degree2 terms and grid.levels", + grid.levels=list(pcl="2nd")) # test partial matching of variable name in grid levels plotmo grid: pclass age sibsp 2nd 28 0 > plotmo(a, type="earth", ylim=c(0, 1), caption="type=\"earth\" plotmo glm with mixed fac and non-fac degree2 terms") plotmo grid: pclass age sibsp 3rd 28 0 > plotmo(a, type="link", ylim=c(0, 1), clip=FALSE, caption="type=\"link\" plotmo glm with mixed fac and non-fac degree2 terms") plotmo grid: pclass age sibsp 3rd 28 0 > plotmo(a, type="class", ylim=c(0, 1), caption="type=\"class\" plotmo glm with mixed fac and non-fac degree2 terms") plotmo grid: pclass age sibsp 3rd 28 0 > plotmo(a, ylim=c(0, 1), caption="default type (\"response\")\nplotmo glm with mixed fac and non-fac degree2 terms") plotmo grid: pclass age sibsp 3rd 28 0 > # now with different type2s > set.seed(2016) > plotmo(a, do.par=FALSE, type2="persp", persp.theta=-20, degree1=FALSE, grid.levels=list(pclass="2nd")) > mtext("different type2s", outer=TRUE, font=2, line=1.5, cex=1) > plotmo(a, do.par=FALSE, type2="contour", degree1=FALSE, grid.levels=list(pclass="2nd")) > plotmo(a, do.par=FALSE, type2="image", degree1=FALSE, grid.levels=list(pclass="2nd"), + col.response=as.numeric(etitanic$survived)+2, pt.pch=20) > plotmo(a, do.par=FALSE, type="earth", type2="image", degree1=FALSE, + grid.levels=list(pclass="2")) > > # grid.levels with partdep > > set.seed(2018) > x1 <- (1:11) + runif(11) > x2 <- (1:11) + runif(11) > x3 <- as.integer((1:11) + runif(11)) > x4 <- runif(11) > .5 # logical > y <- x1 - x2 + x3 + x4 > data <- data.frame(y=y, x1=x1, x2=x2, x3=x3, x4=x4) > lm.x1.x2.x3 <- lm(y ~ x1 + x2 + x3 + x4 + x1*x2 + x1*x3, data=data) > cat("summary(lm.x1.x2.x3):\n") summary(lm.x1.x2.x3): > print(summary(lm.x1.x2.x3)) Warning in summary.lm(lm.x1.x2.x3) : essentially perfect fit: summary may be unreliable Call: lm(formula = y ~ x1 + x2 + x3 + x4 + x1 * x2 + x1 * x3, data = data) Residuals: 1 2 3 4 5 6 7 4.445e-17 -2.215e-16 9.227e-18 2.871e-16 2.251e-16 -9.376e-17 -5.566e-16 8 9 10 11 1.746e-17 2.252e-16 3.073e-16 -2.440e-16 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 2.142e-15 1.549e-15 1.383e+00 0.239 x1 1.000e+00 6.608e-16 1.513e+15 <2e-16 *** x2 -1.000e+00 1.816e-15 -5.507e+14 <2e-16 *** x3 1.000e+00 1.818e-15 5.502e+14 <2e-16 *** x4TRUE 1.000e+00 3.109e-16 3.216e+15 <2e-16 *** x1:x2 3.625e-16 2.328e-16 1.557e+00 0.195 x1:x3 -3.314e-16 2.274e-16 -1.458e+00 0.219 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 4.207e-16 on 4 degrees of freedom Multiple R-squared: 1, Adjusted R-squared: 1 F-statistic: 1.326e+32 on 6 and 4 DF, p-value: < 2.2e-16 > par(mfrow = c(5, 6), mar = c(2, 3, 2, 1), mgp = c(1.5, 0.5, 0), cex = 0.6, oma=c(0,0,8,0)) > plotmo(lm.x1.x2.x3, do.par=0, ylim=c(0,16), pt.col=2, + caption="row1 default\nrow2 grid.levels=list(x3=15)\nrow3 partdep\nrow4 partdetp grid.levels=list(x3=15)") plotmo grid: x1 x2 x3 x4 6.301049 6.270736 6 TRUE > plotmo(lm.x1.x2.x3, do.par=0, ylim=c(0,16), pt.col=2, grid.levels=list(x3=15)) plotmo grid: x1 x2 x3 x4 6.301049 6.270736 15 TRUE > plotmo(lm.x1.x2.x3, do.par=0, ylim=c(0,16), pt.col=2, pmethod="partdep") calculating partdep for x1 calculating partdep for x2 calculating partdep for x3 calculating partdep for x4 calculating partdep for x1:x2 01234567890 calculating partdep for x1:x3 01234567890 > plotmo(lm.x1.x2.x3, do.par=0, ylim=c(0,16), pt.col=2, pmethod="partdep", grid.levels=list(x3=15)) calculating partdep for x1 calculating partdep for x2 calculating partdep for x3 calculating partdep for x4 calculating partdep for x1:x2 01234567890 calculating partdep for x1:x3 01234567890 > > # check auto type convert in grid.levels > plotmo(lm.x1.x2.x3, degree1="x1", degree2=0, main="x1 (x2=5L))", ylim=c(0,16), do.par=0, pmethod="partdep", grid.levels=list(x2=15L)) # integer to numeric calculating partdep for x1 > plotmo(lm.x1.x2.x3, degree1="x1", degree2=0, main="x1 (x3=5))", ylim=c(0,16), do.par=0, pmethod="partdep", grid.levels=list(x3=15)) # numeric to integer calculating partdep for x1 > plotmo(lm.x1.x2.x3, degree1="x1", degree2=0, main="x1 (x4=1))", ylim=c(0,16), do.par=0, pmethod="partdep", grid.levels=list(x4=1)) # numeric to logical calculating partdep for x1 > expect.err(try(plotmo(lm.x1.x2.x3, degree1="x1", degree2=0, main="x1 (x4=1))", ylim=c(0,16), do.par=0, pmethod="partdep", grid.levels=list(x4="x"))), "expected a logical value in grid.levels for x4") # char to logical Error : expected a logical value in grid.levels for x4 Got expected error from try(plotmo(lm.x1.x2.x3, degree1 = "x1", degree2 = 0, main = "x1 (x4=1))", ylim = c(0, 16), do.par = 0, pmethod = "partdep", grid.levels = list(x4 = "x"))) > expect.err(try(plotmo(lm.x1.x2.x3, degree1="x2", do.par=0, pmethod="partdep", grid.levels=list(x1="1"))), "the class \"character\" of \"x1\" in grid.levels does not match its class \"numeric\" in the input data") Warning: grid.levels returned class "character" for x1, so will use the default grid.func for x1 Error : the class "character" of "x1" in grid.levels does not match its class "numeric" in the input data Got expected error from try(plotmo(lm.x1.x2.x3, degree1 = "x2", do.par = 0, pmethod = "partdep", grid.levels = list(x1 = "1"))) > par(org.par) > > # test vector main > > a20 <- earth(O3 ~ humidity + temp + doy, data=ozone1, degree=2, glm=list(family=Gamma)) > > dopar(2, 2) > plotmo(a20, nrug=-1) plotmo grid: humidity temp doy 64 62 205.5 > > set.seed(2016) > plotmo(a20, nrug=10, caption="Test plotmo with a vector main (and npoints=200)", + main=c("Humidity", "Temperature", "Day of year", "Humidity: Temperature", "Temperature: Day of Year"), + col.response="darkgray", pt.pch=".", cex.response=3, npoints=200) # cex.response tests back compat plotmo grid: humidity temp doy 64 62 205.5 > > cat("Expect warning below (missing double titles)\n") Expect warning below (missing double titles) > plotmo(a20, nrug=-1, caption="Test plotmo with a vector main (and plain smooth)", + main=c("Humidity", "Temperature", "Day of year", "Humidity: Temperature", "Temp: Doy"), + smooth.col="indianred") plotmo grid: humidity temp doy 64 62 205.5 > > cat("Expect warning below (missing single titles)\n") Expect warning below (missing single titles) > plotmo(a20, nrug=-1, caption="Test plotmo with a vector main (and smooth args)", + main=c("Humidity", "Temperature"), + smooth.col="indianred", smooth.lwd=2, smooth.lty=2, smooth.f=.1, + col.response="gray", npoints=500) plotmo grid: humidity temp doy 64 62 205.5 > > plotmo(a20, nrug=-1, caption="Test plotmo with pt.pch=paste(1:nrow(ozone1))", + type2="im", + col.response=2, pt.cex=.8, pt.pch=paste(1:nrow(ozone1)), npoints=100) plotmo grid: humidity temp doy 64 62 205.5 > > aflip <- earth(O3~vh + wind + humidity + temp, data=ozone1, degree=2) > > # test all1 and all2, with and without degree1 and degree2 > plotmo(aflip, all2=T, caption="all2=T", npoints=TRUE) plotmo grid: vh wind humidity temp 5760 5 64 62 > plotmo(aflip, all2=T, degree2=c(4, 2), caption="all2=T, degree2=c(4, 2)") plotmo grid: vh wind humidity temp 5760 5 64 62 > plotmo(aflip, all1=T, caption="all1=T") plotmo grid: vh wind humidity temp 5760 5 64 62 > plotmo(aflip, all1=T, degree1=c(3,1), degree2=NA, caption="all1=T, degree1=c(3,1), degree2=NA") plotmo grid: vh wind humidity temp 5760 5 64 62 > > options(warn=2) > expect.err(try(plotmo(aflip, no.such.arg=9)), "(converted from warning) predict.earth ignored argument 'no.such.arg'") stats::predict(earth.object, NULL, type="response", no.such.arg=9) Error : (converted from warning) predict.earth ignored argument 'no.such.arg' Got expected error from try(plotmo(aflip, no.such.arg = 9)) > expect.err(try(plotmo(aflip, ycolumn=1)), "(converted from warning) predict.earth ignored argument 'ycolumn'") stats::predict(earth.object, NULL, type="response", ycolumn=1) Error : (converted from warning) predict.earth ignored argument 'ycolumn' Got expected error from try(plotmo(aflip, ycolumn = 1)) > expect.err(try(plotmo(aflip, title="abc")), "(converted from warning) predict.earth ignored argument 'title'") stats::predict(earth.object, NULL, type="response", title="abc") Error : (converted from warning) predict.earth ignored argument 'title' Got expected error from try(plotmo(aflip, title = "abc")) > expect.err(try(plotmo(aflip, persp.ticktype="d", persp.ntick=3, tic=3, tick=9)), "(converted from warning) predict.earth ignored argument 'tic'") stats::predict(earth.object, NULL, type="response", tic=3, tick=9) Error : (converted from warning) predict.earth ignored argument 'tic' Got expected error from try(plotmo(aflip, persp.ticktype = "d", persp.ntick = 3, tic = 3, tick = 9)) > expect.err(try(plotmo(aflip, persp.ticktype="d", ntick=3, tic=3)), "(converted from warning) predict.earth ignored argument 'ntick'") stats::predict(earth.object, NULL, type="response", ntick=3, tic=3) Error : (converted from warning) predict.earth ignored argument 'ntick' Got expected error from try(plotmo(aflip, persp.ticktype = "d", ntick = 3, tic = 3)) > options(warn=1) > # expect.err(try(plotmo(aflip, adj1=8, adj2=9))) # Error : plotmo: illegal argument "adj1" > # expect.err(try(plotmo(aflip, yc=8, x2=9))) # "ycolumn" is no longer legal, use "nresponse" instead > # expect.err(try(plotmo(aflip, persp.ticktype="d", ntick=3, ti=3))) # Error : "title" is illegal, use "caption" instead ("ti" taken to mean "title") > # expect.err(try(plotmo(aflip, persp.ticktype="d", ntick=3, title=3))) # Error : "title" is illegal, use "caption" instead > # expect.err(try(plotmo(aflip, persp.ticktype="d", ntick=3, tit=3, titl=7))) # Error : "title" is illegal, use "caption" instead ("tit" taken to mean "title") > # expect.err(try(plotmo(aflip, zlab="abc"))) # "zlab" is illegal, use "ylab" instead > # expect.err(try(plotmo(aflip, z="abc"))) # "zlab" is illegal, use "ylab" instead ("z" taken to mean "zlab") > expect.err(try(plotmo(aflip, degree1=c(4,1))), "'degree1' is out of range, allowed values are 1 to 2") Error : 'degree1' is out of range, allowed values are 1 to 2 Got expected error from try(plotmo(aflip, degree1 = c(4, 1))) > # expect.err(try(plotmo(aflip, none.such=TRUE))) # illegal argument "all1" > # expect.err(try(plotmo(aflip, ntick=3, type2="im"))) # the ntick argument is illegal for type2="image" > # expect.err(try(plotmo(aflip, breaks=3, type2="persp"))) # the breaks argument is illegal for type2="persp" > # expect.err(try(plotmo(aflip, breaks=99, type2="cont"))) # the breaks argument is illegal for type2="contour" > > # Test error handling when accessing the original data > > lm.bad <- lm.fit(as.matrix(ozone1[,-1]), as.matrix(ozone1[,1])) > expect.err(try(plotmo(lm.bad)), "'lm.bad' is a plain list, not an S3 model") Error : 'lm.bad' is a plain list, not an S3 model Got expected error from try(plotmo(lm.bad)) > expect.err(try(plotmo(99)), "'99' is not an S3 model") Error : '99' is not an S3 model Got expected error from try(plotmo(99)) > > x <- matrix(c(1,3,2,4,5,6,7,8,9,10, + 2,3,4,5,6,7,8,9,8,9), ncol=2) > > colnames(x) <- c("c1", "c2") > x1 <- x[,1] > x2 <- x[,2] > y <- 3:12 > df <- data.frame(y=y, x1=x1, x2=x2) > foo1 <- function() + { + a.foo1 <- lm(y~x1+x2, model=FALSE) + x1 <- NULL + expect.err(try(plotmo(a.foo1)), "cannot get the original model predictors") + } > foo1() Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: invalid type (NULL) for variable 'x1' (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(plotmo(a.foo1)) > foo2 <- function() + { + a.foo2 <- lm(y~x1+x2, data=df, model=FALSE) + df <- 99 # note that df <- NULL here will not cause an error msg + y <- 99 # also needed else model.frame in plotmo will find the global y + expect.err(try(plotmo(a.foo2)), "cannot get the original model predictors") + } > foo2() Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: variable lengths differ (found for 'x1') (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(plotmo(a.foo2)) > foo3 <- function() + { + a.foo3 <- lm(y~x) # lm() builds an lm model for which predict doesn't work + expect.err(try(plotmo(a.foo3)), "predict returned the wrong length (got 10 but expected 50)") + } > foo3() Warning: the variable on the right side of the formula is a matrix or data.frame plotmo often cannot process such variables Warning: 'newdata' had 50 rows but variables found have 10 rows Error : predict returned the wrong length (got 10 but expected 50) Got expected error from try(plotmo(a.foo3)) > foo3a <- function() + { + a.foo3a <- lm(y~x) # lm() builds an lm model for which predict doesn't work + # this tests "ngrid1 <- ngrid1 + 1" in plotmo.R + expect.err(try(plotmo(a.foo3a, ngrid1=nrow(x))), "predict returned the wrong length (got 10 but expected 11)") + } > foo3a() Warning: the variable on the right side of the formula is a matrix or data.frame plotmo often cannot process such variables Warning: 'newdata' had 11 rows but variables found have 10 rows Error : predict returned the wrong length (got 10 but expected 11) Got expected error from try(plotmo(a.foo3a, ngrid1 = nrow(x))) > foo4 <- function() + { + a.foo4 <- lm(y~x[,1]+x[,2]) # builds an lm model for which predict doesn't work + # causes 'newdata' had 8 rows but variables found have 10 rows + expect.err(try(plotmo(a.foo4)), "predict returned the wrong length (got 10 but expected 50)") + } > foo4() Warning: Cannot determine which variables to plot in degree2 plots (use all2=TRUE?) Confused by variable name "x[, 1]" Warning: 'newdata' had 50 rows but variables found have 10 rows Error : predict returned the wrong length (got 10 but expected 50) Got expected error from try(plotmo(a.foo4)) > foo5 <- function() + { + a.foo5 <- lm(y~x1+x2, model=FALSE) + x1 <- c(1,2,3) + # causes Error in model.frame.default: variable lengths differ (found for 'x1') + expect.err(try(plotmo(a.foo5)), "cannot get the original model predictors") + } > foo5() Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: variable lengths differ (found for 'x1') (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(plotmo(a.foo5)) > foo6 <- function() + { + a.foo6 <- lm(y~x1+x2, model=FALSE) + y[1] <- NA + # Error in na.fail.default: missing values in object + expect.err(try(plotmo(a.foo6, col.response=3)), "cannot get the original model predictors") + } > foo6() Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: missing values in object (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(plotmo(a.foo6, col.response = 3)) > foo7 <- function() + { + a.foo7 <- lm(y~x1+x2, model=FALSE) + y[1] <- Inf + options <- options("warn") + on.exit(options(warn=options$warn)) + options(warn=2) + expect.err(try(plotmo(a.foo7, col.response=3)), "non-finite values returned by plotmo_y") + } > foo7() Error : (converted from warning) non-finite values returned by plotmo_y Got expected error from try(plotmo(a.foo7, col.response = 3)) > options(warn=1) > foo8 <- function() + { + i <- 1 + a.foo8 <- lm(y~x[,i]+x[,2]) + options <- options("warn") + on.exit(options(warn=options$warn)) + options(warn=2) + expect.err(try(plotmo(a.foo8)), "Cannot determine which variables to plot in degree2 plots (use all2=TRUE?)") + options(warn=options$warn) + expect.err(try(plotmo(a.foo8)), "predict returned the wrong length (got 10 but expected 50)") + } > foo8() Error : (converted from warning) Cannot determine which variables to plot in degree2 plots (use all2=TRUE?) Confused by variable name "x[, i]" Got expected error from try(plotmo(a.foo8)) Warning: Cannot determine which variables to plot in degree2 plots (use all2=TRUE?) Confused by variable name "x[, i]" Warning: 'newdata' had 50 rows but variables found have 10 rows Error : predict returned the wrong length (got 10 but expected 50) Got expected error from try(plotmo(a.foo8)) > options(warn=1) > foo9 <- function() + { + my.list <- list(j=2) + a.foo9 <- lm(y~x[,1]+x[,my.list$j]) + expect.err(try(plotmo(a.foo9)), "cannot get the original model predictors") + } > foo9() Warning: "$" in the formula is not supported by plotmo, will try to get the data elsewhere formula: x[, 1] + x[, my.list$j] Looked unsuccessfully for the original predictors in the following places: (1) object$x: NULL (2) model.frame: formula(object): "$" in formula is not allowed (3) getCall(object)$x: NULL Error : cannot get the original model predictors Got expected error from try(plotmo(a.foo9)) > foo9a <- function() + { + df <- data.frame(y=y, x1=x[,1], x2=x[,2]) + a.foo9a <- lm(y~x1+x2, data=df) + par(mfrow = c(2, 2), oma=c(0,0,4,0)) + set.seed(2018) + plotmo(a.foo9a, col.resp=2, do.par=FALSE, + caption="top two plots should be identical to bottom two plots") + x2 <- rep(99, length(x2)) + a.foo9b <- lm(y~x1+x2, data=df) + x2 <- rep(199, length(x2)) + plotmo(a.foo9b, col.resp=2, do.par=FALSE) + } > foo9a() plotmo grid: x1 x2 5.5 6.5 plotmo grid: x1 x2 5.5 6.5 > par(org.par) > > foo20.func <- function() + { + par(mfrow = c(2, 2), oma=c(0,0,4,0)) + foo20 <- lm(y~x1+x2) + set.seed(2018) + plotmo(foo20, degree1=1:2, col.resp=2, do.par=FALSE, + caption="top two plots should be identical to bottom two plots\nbecause we use saved lm$model") + x1 <- 99 + plotmo(foo20, degree1=1:2, col.resp=2, do.par=FALSE) + } > foo20.func() plotmo grid: x1 x2 5.5 6.5 plotmo grid: x1 x2 5.5 6.5 > par(org.par) > > set.seed(1235) > tit <- etitanic > tit <- tit[c(30:80,330:380,630:680), ] > a <- earth(survived~., data=tit, glm=list(family=binomial), degree=2) > plotmo(a, grid.levels=list(sex="ma"), + caption="smooth: survived, sex=\"m\" jitter=1", + smooth.col="indianred", smooth.lwd=2, + col.response=as.numeric(tit$survived)+2, pt.pch=".", type2="im", + pt.cex=3, jitter=1) # big jitter plotmo grid: pclass sex age sibsp parch 1st male 29 0 0 > set.seed(1238) > a <- earth(pclass~., data=tit) > plotmo(a, type="class", nresponse=1, + grid.levels=list(sex="ma"), + caption="smooth: pclass, sex=\"m\"", SHOWCALL=TRUE, + smooth.col="indianred", smooth.lwd=2, + col.response=as.numeric(tit$pclass)+1, type2="im", + pt.pch=".", pt.cex=3) plotmo grid: survived sex age sibsp parch 0 male 29 0 0 > plotmo(a, type="class", nresponse=1, + grid.levels=list(sex="ma"), + caption="smooth: pclass, sex=\"m\" jitter=.3", SHOWCALL=TRUE, + smooth.col="indianred", smooth.lwd=2, + col.response=as.numeric(tit$pclass)+1, type2="im", + pt.pch="x", jit=.3) # small jitter plotmo grid: survived sex age sibsp parch 0 male 29 0 0 > plotmo(a, nresponse=1, + type="class", grid.levels=list(sex="ma"), + caption="smooth: pclass, sex=\"m\"", SHOWCALL=TRUE, + smooth.col="indianred", smooth.lwd=2, + col.response=as.numeric(tit$pclass)+1, type2="im", + pt.pch=paste(1:nrow(tit))) plotmo grid: survived sex age sibsp parch 0 male 29 0 0 > > # test the extend argument > > plotmo(a, nresponse=1, pt.col=2, degree2=0, SHOWCALL=TRUE, + caption="test extend: extend=0 (reference plot)") plotmo grid: survived sex age sibsp parch 0 male 29 0 0 > plotmo(a, nresponse=1, extend=.5, pt.col=2, SHOWCALL=TRUE, + caption="test extend: extend=.5") plotmo grid: survived sex age sibsp parch 0 male 29 0 0 > plotmo(a, nresponse=1, degree1=0, extend=.2, pt.col=2, SHOWCALL=TRUE) # nothing to plot Warning: plotmo: nothing to plot > > a <- earth(survived~pclass+age, data=etitanic, degree=2) > # expect warning: extend=.5 not degree2 plots > plotmo(a, extend=.5, pt.col=2, SHOWCALL=TRUE, + caption="test extend: extend=.5") Warning: extend=0.5: will not plot degree2 plots (extend is not yet implemented for degree2 plots) plotmo grid: pclass age 3rd 28 > > # intercept only models > > dopar(2, 2, caption = "intercept-only models") intercept-only models > set.seed(1) > x <- 1:10 > y <- runif(length(x)) > earth.intercept.only <- earth(x, y) > plotmo(earth.intercept.only, do.par=FALSE, main="earth intercept-only model") > plotmo(earth.intercept.only, do.par=FALSE, col.response=1, pt.pch=20) > # TODO following draws a plot but it shouldn't (very minor bug because int-only model with a bad degree1 spec) > plotmo(earth.intercept.only, do.par=FALSE, degree1=3) # expect warning: 'degree1' specified but no degree1 plots Warning: 'degree1' specified but no degree1 plots (maybe use all1=TRUE?) > plotmo(earth.intercept.only, do.par=FALSE, degree1=0) # expect warning: plotmo: nothing to plot Warning: plotmo: nothing to plot > library(rpart) > rpart.intercept.only <- rpart(y~x) > plotmo(rpart.intercept.only, do.par=FALSE, main="rpart.plot intercept-only model") > plotmo(rpart.intercept.only, do.par=FALSE, degree1=0) Warning: plotmo: nothing to plot > par(org.par) > > # nrug argument > > par(mfrow=c(3,3), mar=c(3,3,3,1), mgp=c(1.5, 0.5, 0)) > mod.nrug <- earth(survived~age, data=etitanic) > set.seed(2016) > plotmo(mod.nrug, do.par=0, nrug=-1, main="nrug=-1") > plotmo(mod.nrug, do.par=0, nrug=TRUE, main="nrug=TRUE") > plotmo(mod.nrug, do.par=0, nrug=10, rug.col=2, main="nrug=10, rug.col=2") > plotmo(mod.nrug, do.par=0, nrug=5, rug.col=2, rug.lwd=2, main="nrug=5, rug.col=2, rug.lwd=2") > plotmo(mod.nrug, do.par=0, nrug="density", main="nrug=\"density\"") > plotmo(mod.nrug, do.par=0, nrug="density", density.col=2, density.lwd=2, main="nrug=\"density\"\ndensity.col=2, density.lwd=2") > plotmo(mod.nrug, do.par=0, nrug="density", density.adj=.2, density.col=1, main="nrug=\"density\"\ndensity.adj=.2, density.col=1") > par(org.par) > > # a <- earth(ozone1[,3]~ozone1[,1]+ozone1[,2]+ozone1[,4]+ozone1[,5]+ozone1[,6], data=ozone1) > # # TODO fails: actual.nrows=330 expected.nrows=50 fitted.nrows=330 > # plotmo(a) > > # # TODO following fails in plotmo with > # # Error : get.earth.x from model.matrix.earth from predict.earth: x has 2 columns, expected 4 to match: 1 2 3 Girth > # a <- earth(Volume~poly(Height, degree=3)+Girth, data=trees, subset=4:23, linpreds=TRUE) > # plotmo(a, trace=-1, do.par=FALSE, caption="all three rows should be the same") > > source("test.epilog.R") plotmo/inst/README-figures/0000755000176200001440000000000014334575431015151 5ustar liggesusersplotmo/inst/README-figures/plotmo-randomForest.png0000644000176200001440000004724613276542471021651 0ustar liggesusers‰PNG  IHDRÌô?Š IDATxœíÝkwgº>ø»fíÏ1k^H¬ÿöxw¯Nït) ¡€dæqƘ 0AÂÀÆœ °AJ0 ‘æ”N)„¤sj;;Ý»»W÷x¼g!½˜5_¤æÅ-=~\'K*Ù×o±©T’JRéò­»žªRTU%°ÇÿVï˜Í²6BÈØ! `#„,€²6BÈØ! `#„,€²6BÈØ! `#„,€²6BÈØ! `#„,€²6BÈØ! `#„,€²6BÈØ! `#„,€²6BÈØ! `#„,€²6BÈØ! `#„,€²F²1¯"óƲÚYÒ¡é›Céz,d…r/ ºË®}ã,Þ@Ûec^í«ã׃WZKFï*H²Z颸#3¦MDÜ3Ö¢tHñ'¦oNø±Š9L:¤û)Hy¢=>i®†ÿ¬^imùz¢¢Ä@þ6„ì Ù˜7÷ ¦Ô¼LÔCD”ðçŠþ²y¢UUSA"¢Ä˜£¾yuÆïŒd<ìª÷2Qú|d‚ÈhÉ- >ëjqµ뙋môé~èÆ¯Ôl Ñέ¿ŸÅ§cxg1CŸû†•X|‰ ×¢Œ& ìYš™ßƒ•Ý({ !5ß/£›s·éÄôY }Ù,ž¥è×kõ‚‚)ƒä‰Ú?ù¬ |:fºÕ+Õ¿eCÖêÓ1ºMÿ‡Øž??!+É­H†_#}á'Ç‚ß<£¯õÌïÿÌ È ´!Lɦ Ι÷Õ~¥ î«©_g.ƒq>ªîºÅëÕä°œ%&én’©ºº¿’ÏzÆ‹•‹Á`©kƒõ§cõ¡ëÖzf+ÖŸN·Çx"¨ªŠ¡Ô/žªª6þ†´|`ƒ/¸Ù/LÃBÎðVƒŸ‡Á”nA43Ïxd˵~£×kVCËK5ó9ŒØêÍ)ÿ³¶¨ïKþ“kýé¿&!k=sáe0ûtŒÞë—yØð%q7yˆˆ&¦2º›²/'‰ˆëf]ÅÍ/ :ZåÍ|%}èæ3Ë#Ñf’Þ6ëO'k‹LQ05ó35šò²’üwH¿ù˜·LçVA[F˜'¿Vu£ëï€Á­ß¹J•þ,ºÊ¿á¾¸îM(~QÅŸµ+ŸÎRWx\,\ù#)L>’>tÖñéä"Ö͘D¬-ëKãCÈÊÄ7Ïo8R27Ä2Wå¾ÐÙgÉéï¤Ír5[}Ò3Sûå ·ü0›üÐ$æk θ•Ò!~ÅüDURú³ä>q)òò›÷YËxq’{ýR„8é³¶ütJúЭfæ?JFâ¾">tÈ™ ¦,þŠû3dŽ©°Ý0û˜nƒÕwÌ$6lù2ÚÈm¼pEôd m¿6̨™·åDsÕ¨'könX=‹É}K]`8\ɤ)mþžTç³6î]›ÜÙêÓ±úÐu¯ÔzfK–ŸNÁ)]`•¬–/®_Ý<Ñ̌΢/>c–`ªV£í}ñ™[¹KÄÌq…Çõc$M–«Œg™±ØDžh&ÿVk>„·‘/>}¯É—YQ¨Íü5ìœÏÚêÓ±þÐ5¯´‚5ÄêÓI%LîED¢d®êŸÙCQUµÞËPÜ “¸Ö²1¯{ª¿ú»êßÛ`j6¾¶Ê¡’…9‚w±ŸH>«×öïôùÈĬlZæZȨcM da®àA_õJÙtÈŸ°ÜhÔ°¸W`:ª Ð.°*Y!dl„°BÀFY!dl„°BÀFY!dl„°BÀFY!dÍðI¤ÌÏ–˜yÅ[ìyû,¥Cúgšž&ßšyëqþFhlÒyj­V¬]ö@ÈJ‡ì9é¶1_\Õž7ÛðÖÜ©ìJyý >µX&êIøÍ ¬]vAÈê‰3–!ÙÆBnÍM‡ÄeM)ê …¼ùYÓ1¯þ^\CäO“GQBélÌëOQŸ{,éÎÕ)¨aVr…Çóç)wÍk&š˜Êèg’×.>1o~+Wq«±˜뤀5â‰fŠ;eýxÎé3)›Í9Ù4ªæfõOõ«ªš êE&<ÑŒª¶’6æ]áñTøL~ñž€'÷eI%p¶{(Nöå¤Éi»åµ+ìÊÆ¼îE3ªª¦‚÷t¡àj,f˜q·¹ !«ç‹}’O ÅÅõAQsæfå“!¹›<š³§fŸ%'r3æN®jÆÕðPb,Í_œ\ ŠÀý€`Á•[ZyEœ>ÙmÁÕ87CK@»rÏaY‡r7YÒù”ÍLM c¡0îx¢™bÏÄ5q+Š¢pç¬ø¸Ìý¨2oLÌA…BVÚ.Yxë$TOfÊz#§ìÀÀ¤ñÏ¿¹ k¬tÈ™(íl輩,§øûåâØ¼11Y‡l660)¿×j&:éÇJknºþL»ílš«%àÉMµðݹV˜˜Èý¬"Âk$_ÄŽ›”ÒzXòHE¾›ÜpëÍLÑÌ7Š{-`Æîò­1²lªšÝ}4ê1¿;÷Çü¹âŒÛ¶X“gÀ«“>™ éŸÿ¦¥½´v¹Âã© ßÁ™(éDæžæ©6EqG&JõYOµ’ ÎüÕ f¢ ¦,ïµ’ß Ó°ÆÖO*Hš.¨ªªªÿf™À¾xjLq+iR0¥b3KÝec^wd‚(˜*v;Æ5GQUµü;+J@¨dµ´€5lb±Æ7ºÀ‹…fîþ‘\FÚ%¨heÇ 5g½J]@)UÍ’‘Ü6Ûþ©6ì.Ž…5§àè‚&7‘k^s~#¶»‰0 k,8ŽuȺ›(ù,+ïhš[‰ k,8N¡ _Ù˜×=ÕŸ;_:¤ 4í5¢(m@U´:a…š³^ª³ªa•…*ªÁê„5ªÈzuÂbl„°BÀFY+î(ˆ°BÀ¨¤˜EÈØ! `¬*㩲6BÈPI[! ` Zû^#dl„ÐÒ—±ew ¬O¤0‡Øq8„,‘mÀD»ÀÆC #dŠR^[! s­gʰÙt(wÖútî$öJ(mÓ‚TÖX(YI [FUɦCMUUUUmóâ,öàtXcÁ9Jmà,öÐX°Æ‚•œR³PÈNDÜ¡´»©9g±gà SDЧCŠ?AÁ”'œÅj ÒÕ k,­*k‚õƒTôòh¬²P-ö% ÖXUkM³~œBí‚üFÚü6ÚlÌ;½¹VÍ«|)ªk,8ŒuÈfc“Ñ o£ÅXp>¬±à8Ö!›™¢@‹‹ˆÈÇXp>¬±à8Ö!ën¢ä³üjê‹R[[Òþe(ÖX(VÍ6~Z‡¬+<HºÅ¯.Wx4@ö/@™°Æ‚ãÔbã@Ij°:a…*®•.˜ujùW! `#„,€²6BÈÀÜRãÍžY!dl„°BÀFY˜Cj¿³BÀFY!dl„€¹¢.G_CÈØ! `#„,€²6*²ù³Ø 8Í28ÖX˜IQq¡.ç²Ù鳨çd¢“~¬´àXXcaVþs[¯e°Ù鳨ç¸Z{ Xcaš(]ùn½£P»`bú,öDDÙgIœ`œ k,‘Qs ^9[¨I‘)þ„Ý£àËP=­NXcç<î Ôòóµ^*ZÕä6VY¨ûkììVûxÏkñ¤ÅŽ.Èo;ÈÆ¼Ó›ÄÖ…ª,(@`«8éøá;º u CaÀù°Æ‚ã;ºÀW[Ǽ±¬åìu†5Ç:dÝM4½­Ö¥¶¶¤ýËP.¬±à8Ö!ë ’nñ«Ë Ä€saÇ©Îf\ ˆ*ªÁê„5vö©ãgZÙèÇsò_M„,€²6BÈØ! `#„,€²6BÈØ! `#„,€²6BÈ@csò>µ„°BÀFY!dl„°BÀFÖ!›åN÷™?™=β ކ5§¨J6hʨ*ŸÍgYÇÃëXü§¯ÞKQS¥¶ ÜM4•±eIì€5Ö)8^ùOßœÊÙB!;q‡Òî¦æüõÌ5¹m^&€òau$¯|Õ"gg_©[ÄîhéâOP0¥Æ)¤ 4eÆÃ.Ý£8{·6h,•®NXcÇð ç0ÓÅÕR?ºšÖ PÑÂÉp°ÊBµØ÷Á[2(ÿ¡Èóèïbö uOØ‚Ëðo•<´æO€Ãau b"²¡?¯BC¸=Œ‰ÇÂ;k5îæ²B•v6æm£Qƒ¦ÖÌGq@ųFE«Öغ*þg~ñ¥¿P•ǯ"ëe(4ºÀ $Ï£€F5¶Þª[oÊùÕ Åluþ8á Ì5X°ÆÚD?` òMëåm«¥Ê*Y€RT·ÞÔ„—æÁ°!d :DäU+g­´!–*Â`Ʀ Þ K¨dÀv'`£$,!dÀ&öå`%,!dl…°BJÓˆ£Áê! `#„,”€å ˜½FµZ{Y!d¡X(UÊ€°BJ†¶,@ñ²Pô ʃµÊ=@ÈÚe6vÒ—±³æ¥Ø !k‹ªXÀÉÐM²€£*~üý˜;ðAW¢PÈêN±ŒÓ+¤ù«îÀ0*©•aQ¤8ð¥aµ‰ã>èÆa²ÙØÀd4£NËD'ýsk¥UŒXϯ$G…Ѭþe‡5¶úx…‘×á’¾`²™) ´È'°wµ<ö.sðÚ£1[·ªž_†_Éš­”x‚傯ÈQ?æøk7±æ~)ê½tÎU¨]0‘|–•®fŸ%'ì\Çk’á­š´•ïbö€e‡‘á ­ÉúÊøWÂY9;WרÚ@ž–¡Ð·.Rü yB0¥Æ}ºG™u¿@KzEJq§u+õ]ªî2˜=šõ³¿ U\*z¨¹ºÆÚoT1 |‰*yåúe6}6­X¶†¬õ],ª¼›Ìæ§j¬ ö}±gëk„l1¬ß¥ŠN .×A¿–æs*oåæ_îš;–ÚÇ(ûKÅw¬Ö£Ùaޝ±H̺°îÉê†Ã(ʬcߊhÑ»TìÙ=Ll¦(¸`†­ÞòÞý£•µì噋k¬}ÊUQèMÌÆ¼m4:vYÍÔ0F1¿gm}-†.O‘Taǰ¤-ãAʾ{%SÑSÏ®5¶ŠÊX+æà»Të7ªÐèWx4û‚ón ÃfkV|‚,¶OýG˜më,òSÇL¦T‹ïÌÖL}BVóéVþyc] r¿H[[Õ(d•‡O $e|ePÌÖ†í![äîš­Xøàj9k7{C¶¤ÏŸ4@5îbï.ä&@ TRâKj·†Üã  Q dœÅì÷;~×7(„,€ã˜íóŠœmDY©õ)ÑÀ~YÇÑ­šóÔo¹ Y§kR‘§(TB ‘ˆÓ-óUD°óÕÿ1`Èl·WýA‘Àɬ+ÙtÈËòþë©„pB{p°^c-òÔšgórA¥Šj¤CMþ@[Çr+1€saç(µ'ën¢©LþŠ’Wå…¨šXcy‘P“ÎV…Bv"â¥ÝMÍùë™)jrç¯à 8N½×XE§àüøÍnEüýL‡‚‚)5N!e )3v釡z*]ê·Æšãƒ/à$I³•õêTU ! UTƒÕÉŽ§(ø˜8bòleýÑc@“ÚÖ¹ ! 0­ìmbP0ƒ˜†¬„ªÃnµ6BÈØ! `#„,€²6BÈØ! `#„,€²6BÈØ! `#„,€²6ªÚQ¸œvÞ$kXc¡6jqFž7Á‹DŽ\*.’Týmqø:|ñþ€hØ! `#ü°*Y!dl„°‘!›y•o,KDDéÐÌëu’yÅ8a‘¦ß©PÚ!K¥_€º/’äßñAUçm©â )–PVêþF9D:¤(Š2ÚÃïKeoKµWÈôXb¢¹¿Jë’]kf:ä§~ñš+zÀj¯¨®ðh ÷7J£`–PbWȦCŠ2Ö*þþO¾ä®Ffj¦'´’ $(áWÅŸ˜ˆ¸¹ÅRßE""w“'Øš{\óšyyêýFy•±VUUÕQjËwãêþF9„/ž{c*_ª¿BúâjþËVùºdÓš™¡¨Â´aEu…Çs¿î{š&+_B™]¾ÆZŇN®yÍÉgY"J%䢼V¦ß¿TÐÍŒ‡]u_$"rÍkNŒå¶*d_N6ÏsÄRåžÖ5¯9¿u_¤úK‡4Û>*|[ª¿BJKXùºdÏš™›äŸß¹§¨ð«¼¢¦Cù¬NŸP ¥ª_Æ ú¹Æò]¦ü{‘ïK×ê'Kà„EÊD=š…¨÷R‰%›ê¾HŽ0½VK›Gªð¶To…KX•¬þš™‰zÄ*U…¬þŠ*ÞÀª¯ùØ­ÀFØÀFY!dl„°BÀFY!dl„°BÀFY!dl„°BÀFY!dl„°BÀFY!dl„°BÀFY!dl„°Ñl ÙlÌ«(J(m4ÙËVáÒ!ýLO“oÍÆ¼º±Rêüà`³2dÓ!Å™°ùI|qUU㾂·¦C¥-K©ó€£Í¾M‡Âz–d›¢(Š(iÓ!qYSŠzC!o~ÖtÌ«¿WœÙÜM¡1y)%”ÎÆ¼þ%ü¹Ç’îìeuå°<,+=ôtý]Ü‚‰ªS¶@¹f_Èy¢5õ˜Þ>Aža"rÞúgùÄdÓ¨š›Õ?Õ¯ªj*¨»W6Ö™ðD3ªÚJÚtw…ÇSA" ¦ÔñxOÀCS"J%ˆšç¹tO(Ïvec^w„¢UUSÁ‰ˆ{: .˜˜aÆÝ æf_Èúâãa}zÉ<¹æ5~,O ÅE¹Yƒ­>"r7yˆ&_JÕaöYr"7£¯5hõh®–€‡ciʾœÌ=žeÏAzd~èÄX>. .Xn†–€vq ¶f_ÈÖ“»É¼~¦é”ÍLM䢱°‰ˆ[Q…[ ÅÇe®LvÍk¦\õ u­¦Ì”õ&+NÙIò4¹‹{HO4£ …jôi¹8ξœ¤âŸ ª!+ןé±›Ì ¸ZšH>Ësw®,'&rMÃq`F\òØ3¾›Üp€º@ȹÂýAþY>F–MU³»F=æwçnª?—¥Ü¶µÊ=i~Wx<ä~;2L_È’§yªMQÜ‘ Ot´ø{@Õ)ªªÖ{æ”tHñ'‚)ó¶ÕyO4SB$€mPÉÖN6æU‚‚)û•,€PÉØ! `#„,€²6BÈØèßê½³Ÿ¢(òU ç˜S²Õ¤ÉS¦ªª˜._&.À€vA9ªÏØÓ%î+ß*ß·~¯l„ 0+N‹¼¯¯ÉKÃwD… 0+¡]0­’<-òѸÚ5œ_žŽÀ˜5æb» øû&ìž3“—†åéM¯¾QLgÀ°¥PÞ’@}Íò->L+) pÏ™‹š)=]Sý¥ÔG ¡ÍžvAuì—ñìâ¹EÑ'¬ÀÅl †~@#j¼5«ã*ÏšòbšïåÛÔ^Ë Ð(=º fÅ)?Ñ'?ÿヷ~÷ÇÕëÅô?=ú¬à3Šå«é»74eì¥Þ}š1M¯¾1õ×_ì{!ÌÉŸ,ÀÜá”J¶¾?ö‰è“ŸÿQƽEY÷a7=øxHäl¡ÂpšZoøªÁ–ý2‰öƒ·~wäúg\½2®j«ÕH^æÁelþ*†(8•lÝ‹S»‰2VæÛÔ~©wŸÜ1Øsæâ¥Þ}DÔÞwœ§Ü8}”,ÇÌV¼QN?ìSå•ßa÷o~Wy Š„­/ôjÌ–vA-ìWHô ʸ£¾Œ-Þo½ó©zˆòöÐR¨®ê‡l£Ä«7dÍnåb¶¼$ºÔ»ïÄ­‡Ü"`í}Çÿ9þ#ç¬C plRåvEÕüѧ4pÍ,\»A\þî‹ûf³é۲Ű¥0Ë>J€š±qt:óØ©dØ+Ð0Èü«œ~ã2V?]³‹PÞTÈÞ!\³©üqÿæwrõºp톉«ë>ìNß½aqwMÇ á ŸPžíŒÀßFÇf®uC¶lfe,§mÿµ»;6q1ëØwƆ(¯F!ëÀ¯_Ùã ŠÁmYÍÄ·Ùº†ˆú¯Ýå)œ³ÔÈQ…À°Vý•·}9JíÛ–±Ç+ô¼gõ"Š ]&ÇWý¸zu8vA}C$ÐÑ).ðÖï ‹Ù#×?;±}½8RÌW¯ÿÓ£ÏÜ¿ù]…O}dëšk?ýˆv¼ýŠ˜xþÑsÊçl´{·˜îÌ?TÅÓnC¿€²Õ!döe+»!ËÛ¾ wI°ÞÆ8^‰ˆËXÿæí©;×ßi ðÄÆ’ž³"[?ÎÀ>u> WÍrDQ”Ò?Ñ^ßÛ¢˜ tt~ð–i}*äb<À@-káäíG‡·¬}ËÙJDþÍÛ áwo-h¸œ•‹ÖÆZr›Ô9dkßÀý(ýÓ^ßÛÅÌÙúA‡¸<öÉHæ_ÿ(²c¾{ãäíG†7‰„ýì_ÿ/­ÿÍÿaýP ‘³ƒÕù/À>v» øŸ‡uùú-lÿô·žØ¾þôgOÆ>SäÀ5£*{òö#NÀe쎷_¹òí¯W¾ýÕìü›·ÿ0–ÔLäœ-øì5&’m CUÔžƒN¤X›(Ùë{ûÂWß½HÞS6ŸØ¾Þâ.B1»~qÎÞ²úð–ÕòtNX"Úµè5QÆnî:Tʲׂ T Yû6ˆ†l1¸ŒÕO7,f5û}±Î‹W‰èÔ½/9gl]sêÞ—šy &ì;­üü}‘Ël+ñ¡àW?@œrúæ¨ïðéÏžô­_®ÏVÃm_µ¯|áÐÆ•"[m\)w œ_Ãå§¼OÑ sœƒ*Y™Ý­ƒ²;²ï¾¸ÏG3гÅÛÜu(uçzÙw·CåÁ ‚]![áo›Zܵ˜AÓ+›¿Æ>ûdä?¼ËÓ9^Ï?zÎÿˆhñ:í4.fif»kÑkDTj[ƒm_š Y¶>ÀœâÐJ–ª÷U7kÈjŠY ¯"a­ÝH3w%Ð'lCÀ€pnÈ ¶q/’w8j¹c ÙäÕ·~9‰x-³c¶ô GqUQƒ Y€Ùì”)¢VÖ·~ùÒm†ó/Z»‘÷×jˆ2+@5@ÈR­95 ÙÎ ?ýó?ùOi;p„KWÙÒmÿýý7úGæœ-&a¹+ìÿøÓ;çŠ åA°8Dƒ~¦Œ£ñŸ¼ó¸˜ýh_[ì={‚ò-³2ö?¼ûí÷ añºÍöí”§\Ø·3þý_ÅUMÚV‚Àœ5N¶ ’‚CQ”“wœíý7Ë^[ì#¢__¤-Nãä² ! @Ò.¨:]Ñø¯/Ò|™£¶Šâßÿµ¼Öb§/T¬¢CÖ1H± IDATºu —±Ü1°![†Ek7¾xPÔ 0aÿÇŸœÇl€vohD ²U)âÞó·]Ѹfâk‹}_ßWͶ}Y+¾![äN_Ø  Ù~JðÚ[Kó,†ÝØÎ ŹWPrÚO®gyÀC(¨+Y™ušÞ¼êãôÏúé†el XŒâJݹÎU­­»$Ôzl–„,I?¢ÍÒöãôÏ¢˜Õ“·}ÙĬ!+—ãõíkø¿|Á!<€òÌž%iSX{߉ÛWÎSû^…¼ªŸ(²•“ºs]«ìÍ–Öüü=¢ A5jÈ*yò”ö¾üïÆé#†÷⦌µîh¶}™1` ÙêÅÎ}øþ¹ßWű¸8mõñ*¼ÙÒúfKkÁ…²=dmÚ¼þ•^ÿJ‘¶í}'Ä òe}Cöúø¿ÄE’Xìô¥Zðª(c÷üi1C¸f4d„F­dŽÜO}Iù¨ÕÏÀMÓàCß[×Çÿeö˜ÕjËÊ;×r=›ü¿ÿ?³™ï ŸZ³soåO ÎTIÈfcÞ|ée‰ˆ(šyÝŠ¢¹¡™èõ¯4lXìVº< Uk©^<¸#úâ$4BàÿüßçH „lú|¤9Å{¤š#çÓDé2šáëmöÅl™D»Ýû›ÈÐe³Ùäýk ¶eEß`ñºÍš#rÉ=Å…2`Ö« d}q5žÛÍßÝä!¢ìËIO ÅED¾ÖàÄT¦˧!—±¢c`†;š†¬EÂGBC_ѯ/Ò}Ñœýö‹{|–ÄÅí‚7–,{cÉ2‹œ­ÐU£'›¹§ú9o›ç¹ˆˆS×/ ¨ÁÞJfÆeìvïoŠy¨Ö:Z?èàœåböë{£¼íë¿¿ÿFsy€Á‹wîüí%]|ò§_ž?¥|Ôš=ÊX€Y¯ÒM‡e¬U”´“/¹I™š \+¡z‡‰2ìÆZ¸qúÈÙ/ÒúÞ’'Êe¬Ü–eìÐã|òDŽZÊç,³8ÅÁbÞX²L¼sG¥¾ÆZU‘°®yÍÉgY"J%a¹˜í¼pUNØbŠY ÎYfÖ+Ø·ü Vˆh鯶¥Û¸¤Åe,¶zè5^ÈZ³DtþÑ7Ÿ}|ž¤¨Õ8Ü|ðòÍ ¹c¸ÈQkÖ5³1r€G +hN3¾híÆ‡W?*þé Õ.dK:æ!÷ ˆHß1`†eìùGÚÓ®ÿ°çT0wHSÁÍœ°e-þt[V¸=}úƒÈÙ9>x 5X%{ýÔ‘ë§Žœ¾ÿ'ä„ŬŒãU$¬(f/tîäËÛ ŽÈeÑ–¢O ¢Í¿ŸGù,•±åy{Åš??«üq ^j4„«$¢Œeg<í]—Ûýÿôý¯Ä¹ŒÕ“sÖ°€=xùæàîm|™vy{èrw‘.cùrôé‘eïðeÎÙª$lcACÀCÖˆWÖ·aÅÙ/Ò»¾vå»_5‚žÕïžøuÏš¥ÂûÅÄÁÝÛ49Ë kXÀ$',qÂ.äú/’¦1€¹¦¦í‚JNEÓ·a…¸À [öb îÞ6¸{Û¶ƒG·<úäFS‚ËnËj¶ «â¸K7¶ê˜דÕô ˆ¨wÝ2qRBŽW‘°\ÌêËX":ÿðëû±sbú†ð~.]E¼Š› æ,Ytf#ËÞY»+RÄ+€¹¨aÚñïÿZðª\ÀòFnô¬~W?®€ˆ¸i Oᄵx}[ör7::“#xЦQ OØÅÍ/’wæT[ Y3 YÃN‚\ÆRþ¸"^53‹2V¶tã6qùë{75·n;xôæàq³EºÜßÝMÑp$èè䉑eïèÛkwE¾¸mYæˆvAþP['ùŸK -x5ñãß?þíÀZß‘rÂr1«¿KÏš¥FnÈÁºtã6‹HÕ k¦ºR`VªuÈÊÛ¾ò§§ÉÅk…lXÆVKW4!ÚŽN1` ÀZ}*YÎVq~ QÌŠ^—±DœÿûèÓïÏêv«5h¬YªŸhFÞöÅmÙ—± Y õéÉÊÙÚúAÇõS‡+¬dÏv´÷|üIÏš¥‹YîÈ›¿¸-«c OØ®hb8ä˯Ì_ø÷¿«d`ލO%Ëçt±ÀŬ¼ÉK&³g;Ú9aåä2VÓ–Õ»9xœ÷tØ¸ï ø'òTã•ù _™¿ÐzáGløâbÖìVM¯@¾)WÀæ–‹ÙâŸ÷æàñâ·ƒ™Å®¡ÅÍß?N??ÌVuYîßY³×O¾~êð±›ÉЂWÍæábVSÀ²‚ÝXîp+ áÞÅA1\ÌG‚Ñ``O—ü ¯Ì_øÅ•¨Å³˜?;vú˜Cœ2NV.fÝœ®-ÊXC=rþìçáî¯â‚Øyw㾃|AŽ×Àž®ä¥a³vACeù²kvî-þ.Nƒ­^Öê²<–‹·€‰ªVŽW¾zl›ñ~S‘e .|õ]犅šbÖ0aŒÜ8ÛѾtã6Ž×îh‚ˆú6¬:#âuþʵDÄU­¾€µÏë &Ÿ ´Ôæé 6ê\Ér¼F†ò!»- r–ãõØÍσóÏÅlAç?üàƒÃ§ˆèlG»¾cðõ½›ÝÒ˜îh‚s–ãuÍÎ0=¼ã[9jüò‹ò_[¹ÞZ¾úç'jÿ¼`‡znøâŸ™"a…cÛǶŽÝüüØÍÏyŠY¯àÂW߉ÒU$¬ÞÙŽö+ßy¶oà ŽW¶fg¸.ÁÊe, &ŸýüäÑ[ËWÿôÕCy0º AÕ'd yíî \1;¯D$_fÜ+§X$¬påÛ_‡òÛ²†"Á¡HðÖ÷øªœ³²ù+×&/ ËS{ºÊ!+í°Ho-_MDœ³~6ÖÞw¢½ïDÙŠ´ ²Õ¹] §­Ô4xOë±mïY?wf-V.c¯|ûë®E¯‘ˆWû˜‹‹ÓöÛ/î‰ÓÖŠ2–YtfEÎ"ÚEýÇÉš7 Þ;¶í½ŽÓø_dÙž®/cõ>8|J¿ë-éöÖ÷^‰VlIÊÅÕ{õ}ûÅ=ñ\-£¿Nñ?1ñÆég“äý’Ëxj¨1û*ÙtHkUã¾ü‚ˆ<ÑÌxØeu·|ÓཎÓŠyšÎ ÝHk³ÝX3kv†^ñ†¯ªûúÞ(',½þn ý×7Ïä2V¯ïê­Ó;·R>gå¨jœÏžÍej°5Õ?ͨaW:¤´ÅZt1+7 Öïí!¢Ï>Òžn–‹Ùb†ÊšÙµèµÍ]}Dtgø´¦]`Ö“5d1Z¶ò£ÊrË—Û^kêË'òïç/úÛßR~Ð[µcÕ¯1І,@1ìhdc/[U5õ䯿œôZ\Däk¥‰ˆ;_i~ð®ßÛà ˗Gú:õ]L¯€qÇ@”±"aK¥ßöÅþþãw[À^$ï¼HÞ¸óXÞ¹V.c{¯ÞâSÚ¼þnKñccW‡öŠ%¼¨;BÖû4“šçqñêŽz‚)UÕ·UUÕW¯ú÷ .PÁ„-¯'Û{õVïÕ[ú¶,ÇëÀÇDÄ9[äq ÌÊØ¾«·þöã·¿Ÿ¿èQü#ý½VíØƒþ,€cÕhÃ×äË,e¦&ˆˆTU-øKSSÌŽôuÖ¶ìØä''ÉS>9y(–ú‘·tYÓ4°-Ë…­¨Iõ8^õW5w)¯˜V‡ö>¾v©Ô{@Õ"d]óš'’ϲD”KxšÜ%Þãu×Àÿë\‘k†Z”±œ°DÄ9«)c7wõý0¦{[¤ä¥á[ùyŠ\Ì~q%:üå·ý›WÉ3ˆ«gvnÕ? 8®Y+3+fÉä iöAC H5'ë‹§Æ·!òD3q³ÁÜ¥Õløâx-éÙDÂQØ?¿ì¥¸-ËÛ»nýå¶þáß ËXNXÍÄþÍ«:/^%¢ ûvÊÓ9pÏ?|ND=k–ðĶךäa[2cðûù‹4Ó¹˜]µcªZg²/d]áñés øâª×ÎÁ©ª)ˆ8^ßËŸöóm–‹Yýæ/ÈED"a«‹»† Û{õÖ™[EÂùm×ÊEw‹„e ×l8³s+ÏÌñ*{m±ÿש¶×šˆÈ°Œ%"MgvKOÿíó<Æ€;³¨.œ¦þ;#h¼×Ñ)–¯^éïÖÏfÖ+6쟿|[pù¶àáÓ¥.†Ü––·‡Š¼;7 ä„í¼xõ»‡÷9gå„íY³„Ï#ùë‹Ôk‹ý¯-ö> •}³¥•rmééßÒÓÏPÃ8™³BVUU}éªgÑ@ýNØ"Ÿ—÷ûÒOÿñË/8a—·‡8a—·‡ô­Õ3;·FŸþе2÷[¾k墮•‹"C#š[¸fƒèzm±ÿ´Q÷–½ÙÒjv†8³BÖ¦˜½ÒßmXÛk$~øïÄÿ]L¶øm_ý×"^õ{ S¾˜åz–s–ËØ‚{zçÖ»î>æcq½ÙÒzûü€¸µöÅ,úÅs\ÈZ³¯›»úøw`õ8g‹/c =¼»õ—ÿ§˜9¹Œ%"þ¯¯r1{aßÎ ûvž¼ó˜ˆ¾{xŸt ˃J–™PÌ8OCÖ𘇲ÏG.pæŠx5œËX¾|ç?5·–Ú–å„Ýú‡ÿÅelÿµ»ò ÃåŽHX}ú{Aƒã•öd~ØìÊ÷w›>Rîp«™Á°˜åÅ¿L¨§œãK&'¯oóv¾¾s½øGè½2zfW[yŬ&a-hÖ³'gîžÀWo^Å9+êÙí‡N^?uØlÛ—Ü áý|?çœÃqíÁ·y»HX¾ª©F ;Áwþ³÷JQ‡ÇÖ´eͶ}1‹bVYöå$Ƣ݃Ég‡gîž@D<åËO/‘¨gù¯/RÜ78½s«¦ŒmYʳüoÏ™èž3Ñû±sżð !ÁJâÄJ–òŬ²ä^AÙ8p9g­ËX‘¶†eìº=Ý.Ø{â°´‡ÂÒMí_ß½Áñ:<öBÌÓÕºØìîò©höœ18 í†ð~D!€C8·’-ƒEkÖ–ýaìsþ'OÜs&:°c“fN.fŸÜˆ·lý€ÿqÝ*D–½³nOnس\Æ‘\Ìž9~–ˆ–nj_ºiÆ!Æ»Z·÷oï=NDý›¦«àþM«6íë%¢ÅM‹Ú%¬Y1 Å«ÈÜö%˜u ËØÞ+£On&ôÓ…;ç¯|û_|YœœwÎ?°cÓ‰Û o2$VvX·‡Â×wµgÕÕø×ßäœ +,lºÔ1»#†8CÛTbÇ€J鯒”°üß]‹^×d+³Ü4àªVŸ°\Ì6 Ü¿}%óÏ¿ËSøÌ]šV¶tS{Wëâá±\ÆÊ7qΊ„Ý´¯÷îÅ3úJ–›cw÷À0ÙÐ?E Tõ¯dËvgøôáÓ'n=ÔÙ*xGQÃÑ®E¯üõŸÍJB.`Ež¸ýðÙ­Oô³É½‚u{º5 KD-'o?ÒïÆÅ,ÿ£|£@ÜÚÞ{üÿú¯?[¼M1{©7rêþ—âêîaœ  ¾,d¹c âõÄ­\öSÆ–qÃç,G­¾3+¸ûŠ8J,',ir–÷P "ÿ–÷ùŸÙ’üÇëoÞ½xF\Ý´¯÷ER»iN$ì©û_^îïºÜßERI[Ü+€*sn»€¥ï\çŽ$þíZôºáS¸ôÍ—¾9ôøÍôà±A.]IJX™Åa±ˆÈýÛWoY­™¨Ÿ"ãbÖb"º{ñÌÝ‹gvŸ&¢M}›:û8R…CVöÅo÷Åoßå)ÂÐ4¨=GT²¬¤B‰ãµ˜9/¿øe÷â76wÒL×”±…ŸÑ(aÙ›-­. ÉÞ%ÁýÛWô3Þ²zKw?ž;!ŠÙ¶ýGDÇ@&Ò–7‰Î,Ç«ŒsV_Ï@}9¥’µˆWUU/õíãË—úö]êÛ·fgX?›¦˜e,]~ñË¡SüÏ¢˜å2vèñ7‰c57é6tüœE£@&³"a­q1«¯g9jå„Ý}jøî…ÜÖ¾g‰7ÐÑIDÉ‘ D´dýV"º|¨K_ɧ­œ°2ŽÚîX­U€ZrPÈžòKfXÀʸ˜åA¢ŒÕX»;7ªôÃ¥ojÚÝ«ÞÅl÷ªw‰hÕŽÜ¡^VíèˆÝoÖ.(ˆ‹ÙbjØÔíO/=7{çŸÝ✕í>5|ùP—XZý߃¾øíÓ¡-ݱÜ@ÎY²üõ ‡h(SÚÌb[UU-Ž’eËX"Š>ýá‹Ë»ÌêËXMš‘;|áÁ¥!qt±KBæŸ×ï›@D[ºûGÏWGϸòÝ_ˆhÏ/Oe¬ r–S•ˆ.ê’–/œm‘ïu:´å£ÔOCáé¡lݱG-ºvsP%[\Ìš•±Ü4àËkwG4Ŭµ¼lÁœ¥|¼¾×±ˆ>¹øNk€s–[™þ=°'ˆ·‡ ³œ³»þˆ4 +<ÿ,w.Ûˇº¶<Æ—o3\ZNX"ú(õÓ^ÿÛDÔKpàòNÃeTµP™žaÂý¾6Òó?nÂZø(õÓù½;ä)ü6"gªÅÑ?õ¿REÑ äzx5f¯ç÷îÐwcE%»cþ+r¯àç§yØ–¾+6‰ªÖ¬†=ùþÍîü0–”;³ÉKÃ[ºû9^yÉÏïÝ!¶wijØ£mïÉ›¿’#¸'›ùçßyù~úXÞö5pw¬SkWtútdÑå·zqËv-|MÔ¹œÅ=]ãÀK%MÂÉë €“9wtAÁbŠ[g>{Ò»~¹&g5Õ™Þµÿ¾c~n RÁ%áxÝÔ™;ùÉ÷7èsöäûNßÿªoà 9òD߀‰ÖhˆPÛµð†¾Ž~Î9[°¤å„%"ÎY"’£V“°œ¶{ýoËo£Ü¢E”͡Š( ‹Y¾pæ³'b¢ÈYŽ­%¶>¿˺!»cþ+‹›¾MÞ%¢·–­â‚¦’=h9ÿèyÏê%"aÙÝ §åœå„%"9d‰èæà± ‘÷óÛâÎã`9Ô9r¨3|þRøü¥cÛǶˆˆ/¸týÀ¥ë\·Êm\yhãJ¹Ö/·{˜|¦µ™÷N‡ò_QEQ¼¢­£ŸuÞ­ÖÓä&"rÍk¦Üÿ'’ϲD”Kän«¹!+÷ ÌhrVNØÓ÷¿Ò€ÌkXÎY¯luèÃÕ¡)Ÿ°š»ì_³ôè$Ý£|Âê™s–ã•§ð¯<‘s–£VÄ+³š.-_àœ5ŠWNPBºZd?`Ž«gȺ£¤[QEñS*î#"_<Õq+ŠâŸŒŽ†õ قŬžÅxQÆ&~üÛáÓDÄÅ,I9kQÃÞ¸=4ð~ÿÀûýÞóëgÐO\»3ü(þ1å£vÿš¥ò­"aù¿Ë·—o ÊMX{±ž=òDÎÙ³{¶ÏX†|I+âUà)µ"UMšÙØËVUÍDó=œìËIO %×=Ÿ˜ÊMªw%ë çÎþϵdÉç ãKD¥±ÔÝ>Í™k˜°\ÌŠxå‰úœ=ðž?24ùÂüÈaúœÕÓç¬<€W“³ììžírԞݳýÀÈ }뀈m\Éo·I@p…Ã>Í$}÷ܬŸ0—9ô(\ÅÓ³¢-ûüþ-þwðò̓—oò‘ d¢Œe\Ìò¿Àž.þgøŒ}V<^'¬áM¢˜e"gEËŽÞH>¹™Ðß]?€—s6Ö³'Ö³§;vÇrQ¾¤å„%"ÎY9j9aEÖúéé»çýt€9«QGáȹ`XØêw¬âíø¢!´ÌœÊUIDAT« ÙàüßóÈ|M¶&/ ËŬHØîUïŠ2Vøt ŸoÉ íîX;óÈa_\q[–ˆDàÊ +oÑòmÁ'7<®ÀläƒÈVGwqÂÊÎv´Ÿº÷¥HÛRV€lÌ{~ÞxÜGDé2Д»,.ý¸³˜w«-†fD—æD,fG³4 [$¹†åC#Šœýt 7xV_ÃF†F49»vgXô¶÷åÚ}¼= ÉÙãíÞƒ‹KZ‹„½øÕŸö­ø£&g»c׆Â;Îv´ës–¶¢¿¯¾xjLq+"O4wN€z„l6›uežÅÜáªU:¸f'¼¢| ËÇÍÚùÇWõ£ ¸Œ¥ün¦r1ØÓ%FÂjˆ3‡ÑÊ÷wñ…/?½b½´¯Á£gÇ{EÂjp+º*Û³z‰&g9a‰ˆs–ò»~q+x=0rãlG»¸cY ë Oï›ë‹«j|ÆÍú)PóvA:¤øÁh”¨%^qÌÊGDÔ³â@‚šÃ‘¾QÀ—y~ÃŽ¾Û½êÝã·¾8ºu­HXöå§Wô ÙhwîT²Á£gø‚>d¯Ÿ>rôF’ XÍÝEÎ&G.ˆœ +ã¨Õ¬ü^a7-€«e%›yÝŠf2ÑóϪ°d¹ضƒÇwoÓ]›eñ˜âÔÙ2³„-iiE¼Š«šœÝÞwÂ0aI:w £“ëY³„µÈP$,@íÕê[—yÝÉ@µ·†È»~jŠÙ›ƒÇx/U};p÷qÿ¦U\ÌÊe,Ûëûâ“ï÷-_°qßAyú½‹ƒ"g5 [°˜vwì9½ÔÑä,IõìõÓGˆhß…+;wV²¼IMLÑ',™„lÁdÀ>µ•™šÃ(‰²±P廉¡šÑ7qÂѹ‡_s°ž|ÃÉ÷7 Ü}²ï•}®Ѿ W¸h8a‰HìW¶¹ë·df k9ìUŸž¬'š $ý‘æÔôN¥ÓŒâik¸¯*g«¬Ó*2:GÀÅ'ßóe³bÖ°Q`XÌ‘&^ÍŠYŽWA.fEÂʼçßÜuèÎð)Ê—´ú„­g›Å2úÝæ¢ïŒ 4eÔTsòe˸š¢±tá»3k/&ìÈ7ý›Vqª_Žœ¿9In¿jZ±šb–/ÓŠýòÓ+† k(q¼·?qçb猀ŬaÂÑÙÏSœ°†%-Õ»€Í>K&_âèD5¯dÓ¡Åã>J‡¼/›š“ÔS½&­¾Œå=©F¾™Þý¨ã]EòU!¢hÏyh(c…}Ëð…5¡½|áaü#Ü=ºu-_X÷a7_xðñ>gE1›8ÞKDý‰;<} ¸Y_Ïš;ñÀ{~͹a4»fÔ«€ å6iæ?h€9¯Æ•¬¯§i@ ¥ÉïŸJRsÒ]è¨xÙ˜—÷ûÇØ3;žÇŠ8°š„ÕæŬE® í kæèÖµ|¸,‘°|ùRoÄp~.`EÂj\ìÜu±sWï•›fÇ‘ç"*VóCÚ+æUBél6KégÔ4åV¼±,¹›&Ëÿ™0›ÔúØ®ð¸Ú:¦x½‰‰õ«ýSîù—1rOõsj¤ÈJ{<=NXyŠaÂ¥+ûöaü#yÊšÐ^Q´2‘°ƒÉg>*øœ°š‰¢iÀñÚ{å&qÎÊQ+'¬¬nýl,9A [Û³´/ÇùèÀmIq$€¹­ˆI%h¢¹Ÿ½å뉚—<Ù—“AS¤ƒ!ZOO³ {þÑó¨îÈUfeìðØ·_ŽHXCr1{©7r©7²oøò¾áËÁÍú™9g9^\ÎYÄ-û/•ÈÆ¼¹ß®ðhÔC411•¿ÍWG„ÃÕ%d}ñéC¦CîÈDbÀ¤$ÍLM$¨• ´LÓ©­§ÇYýWfQÃF{öD{ö„ŽŸ ?' XN[9a‹)fM1Ë—åxåé†9;Ü|òÎã3»¶é–sÖ9#´\áñÜo "Wx<õPÂ/ý&q…G£„R žˆáýkSª§lÌëê·¹›<Áy¹'®yÍüûsòe–|.y;Ïä±y8×È7† +N‰:~NLäœÕ×³Ö ËXùt‡[ºñ…ÛC§,‡÷äÇüßÛWÉõ,Ç®Fhe³Y—Ë•Ûyo‚(jUã>ÎÔ¤;âW¹³»§CîH"8/nz&L€¹¢NûYJÇÌãkî©~ƒ1³é2Æßâü=¨¨ãé‰a³f‡­â½§ä%¢øÑý¼¯é]­‹ôeØ(8h9ÿðyÏš%"aÙí¡S¢’e»v÷'îp«yÎYçÄ+Ñôç䟞ôQ6æm#ƒ?•s[*ÙéÃ9¥CŠ2šQ ç‹g^zÅO$Nh[ÔñôÄ1 ô9Ë kx/¹i ÑÕºèÂWßu®X(ÎOÃZ49Ë KD†9«g˜°”¯gÍúÖiWx<ózcæü_Ot -–õ…]|6¡Ð³,!edõ>[­2Öš?ÕL6æÕŸçTœ FTHÏOcANسŸ§âG÷ÎVÌö.C"a mé>t±k7_¾Øµûb×îƒ#7ŽÜ8¼y•~f}ÂÖe—–+<H&)8™ë£»æ(™æá Wå°?³J½¿´9¹zv”ÚŒûeѳúVt DÚvœ¾HD#}ûäœå2–/ë‹Ù;繘5LX¹˜•Û²gH{°£]Ô³œ¹ú„­ë'•yÝùÝ ³1oš#‘Q®[¿pºúŸAÚFDã©P(M¾ª¤¬|ìÃ.8®g+éÛ'Ï#',6 ȼ†å¦_~ÿÐI¾ðé©ÃÚ»Ü8¼y•a‹À ÇÐJ‡ÚhTÍ<ózcîñ°+<ð¶QFU®ÕõDй~A&lrç&¥ÇUÄ®ªªYVŸ°¬ãôEÞÌ¥IX=>©­E— gÍ~‘°|yP:I㜕ô^{pIr;Üù'-.n´Å²Ü4˜z†ZE¨o%Û2ª†]DÙ—I·Â#ö«üëSÞ¦ïœþì õ­_.ç¬>s5¸˜åËmŽò…ž5K {œ°|9g58s5 [çNN6æmKúUÕGér>Žû¸†µŒ‡]áx¸ðC@}+Y—‹ãTlÝ*os–5ýgIJX fel犅<]$,_m&Ö(f;Ú;Úår• Xëe³W6Ks¹J|0-_<¿ç+<>:/ƒ hõ.—jBSÌêV.f¹'Ëç5ˆvwh‚R$,_–svôìqQÌ&¬\ÌŠ¶¬Å®z³Ùt¨ÍOýjÜ'}•‡Ä@Ñê¿á«äbÖ¢†›¼ô§AdrÂêq1Ë[º g“û NýþÓ~³1KXGœD6w4X"Ê!Èä†z`@UÌ•Õ׌¢€•q1ñ*NÓ­/N9a ‰bVŸ°E‚ –éí˜w§BÓ»pÌšÜÊ2W6|i†F‘E{pÝ2Í9 ‰èbç.yð–>a#ˈ¦(l5ûP±ÝqÓEã±L8J!€mæD%«©ùòÁuË gæéšst“TÌšÕ°Ü4àòù åe(úOZfŠˆ{£|–ëóîT »ÉØfN„¬a´©ªªÉÙƒë–\·ìÌ«=Á,º‘e ôÙJå¢0=–àÓ }Þ á(…6™[C¸ýH9^ùBïºå¢iÀ…mW4ND‘e {Õ¡å‹‹;•tÞpšYXÉfc^±mÈbc‘Ü4°(`/vîºØ¹«+ç„%¢®h<²lÆ  ¶¢cl§Cb‰³/'›ç¹\óš'’ϲD”KxÄAËÀéf]%›¹#žhî²2šQîtHáqõºÙ¹¤Õ$lïºåg<9óàIïºå"[Íè¶ ;Èúâýc¹R»¤óî€ÓÌ®J6ó4eRÁܵB‹Ä{×-×?XïºåƒÉgÑþ&QÌ&lUÀæÏ²Sóî@½Ì¦M‡ÜSý3#¨àÆ"ÃÝÀ(Ÿ°Dd–³¤KXGœƒ fö´ ²±M$”%¼”-zc‘Ü4ñj†3×açà‡š=•ìô‘¿SA>¿B‘‹äb–ö` EžA³Ã‘Ðp$¤‹„3³§’5à+vcç¬E ËÉ[ý \0Û¡ËgO0ÌYÄÅ[ÍêJ¶f[ÀH—°(` x³§'[¹Üî ñ_2JXG¢*Y-¹¤•,”E­Ü¥-]ˆW(BÖ€œªØÀ•@»À X¨Ê4c(` *%6Â.!dl„°BÀFY!dl„°BÀFY!dl„°BÀFY!dl„°BÀFY!dlôÿr6Èü~Òƒ¡IEND®B`‚plotmo/inst/README-figures/plotres-glmnet-gbm.png0000644000176200001440000002607213276123320021373 0ustar liggesusers‰PNG  IHDR¼{âC¡PLTE:fÿ::::ÿffff¶fÿÍÍ:ÍfÕ::::f:ÿ:::::f:::ff:f¶::Û:Í:Í::Íf:Õf:Õ:çÛff:fffÿf:f::f:ff:fffffÛf¶¶f¶ÿfÍfÍ:fÍffÕfÕfîÿttttttt¥t¼t¥Ó«•••Á«Öttt¥¼¼é::::fff:f¶¶¶ÿÕÕ:Û¶ÛÛÛÿÞî÷Û÷ÿ••«••«••Á•Áë¥tt¥t¥t¥¥Óÿ©©©«««••««•«Öÿ¶f¶f:¶fÿ¶:¶¶¶f¶Û¶Ûÿ¶Þ¶ÿ¶¶ÿÿ¼t¼éÿ¾¾¾Á•Á••ÁëÿÍ6fÍ7Í]Í€¶Ó¥tÓÿÿÕ6fÕ]fÕ]Õ¢ÛÖ«ÖÿÿÛ:ÛÿÛÛÛÛÛÛç:Ûÿ¶ÛÿÛÛÿÿÞ6Þ6:Þ6fÞ]:ÞÁÿç]ç]:ç]fçáÿé¼éÿÿëÁ•ëÿÿîîî:÷îfùî€î¢:îÿ¶îÿÿñ:ôñ:÷ñüôôô:ñô¶ÿ÷:î÷:ñ÷¢:÷Ûÿ÷ÿÿùfîùÿÿüñüÿÿÿÿ:ÿfÿ:ÿ::ÿ:fÿ:ÿfÿf:ÿf¶ÿŒÿŒ:ÿŒfÿ:ÿ¶ÿÛÿ ÿ :ÿ fÿ ÿ´ÿ´¶ÿ¶fÿ¶ôÿ¶ÿÿÁfÿÈ:ÿÈÛÿÓ¥ÿÖ«ÿÚfÿÚÿÿÛÿÛ¶ÿÛ÷ÿÛÿÿáÿé¼ÿëÁÿëëÿíÿíÿÿîfÿ÷ÿÿ¶ÿÿÓÿÿÖÿÿÛÿÿéÿÿëÿÿùÿÿüÿÿÿϪT IDATxœí‹ƒ$GYÀ{o9u]`H€E…½È›•(ž‚½ 1¢Y„¨<ÌAaaÈ+ X…ÉEÁH B9A‰CÂs$‘ ‘ú[¬¯ªú]ÕU=]U]5ýý¸Ð³;5U=3¿ýúëêꪄ H¤$}ï‚, Ê‹D Ê‹D Ê‹D Ê‹DK¸òÎwŽèÊŒvµ•?jU#QË;JPÞ!ž¼‹½äØk©s Ú4ùúÓÁ8¡–.ö޽:I˜~ôgö ºÙ€—‹ñg·yEÉ3™¼¼<Ê[ƒ~¦m?‘ÂApò2%¶•Ê›rì€=Ál±ÛEyóbâÙ "ÊÓZ”ïû£”×.³-úyŒ“TÞc³­dw¾³¶Oeܦš?šQ³ùÇž¦ Åb³­µ}ÂˆŠ²ò(oJztãG3úñ”]±Ë‚“w Átž¥ ìZì¼ÌÊãG"ÎÒŸryóbìõôÃÝÍ*ÊÊ£¼‚ìè–JÇ.˱,yáCyéÕ$//†òêÉJìh‡©â± JÄq, NÞJÚ ‘—}t ™¼Š@yÙß5ÏyGü/==v¥%Â?–'oå„M"¯8hñâ„-/¦<Èñû~{A ’W|‚$–cYpòÒO§ØU&“—Ù[z`cAµüÑO/W,ò diƒZÞpeáÉ L“B bÙ ›ZÞpeÁÉKo"B'âŠôèVè*k7ØcYpòò^š¾÷bõY£[xò"ÎY•£Ê;DVäè†ò"Ñ‚ò"Ñ‚ò"Ñ‚ò"Ñ‚ò"Ñ‚ò"Ñ‚ò"Ñ‚ò"Ñ‚ò"Ñ‚ò"Ñ‚ò"Ѷ¼‹=åà‘ùNa‘)Ž2"(/-‘È;ÛbÌι8I6¦ *ýô-vŸö|'Y»˜>Eᇼ,ÌŽànì 6Èv¿÷o ÷·òéÒ"=ï1â‘8äeLAÞ]&2ýÉJÿe iÚ€éàˆE^üOå=gŸÌOì3yéž³ÛˆÏ=H‹ôº¿ˆWâ—z¹Í"¯ZÞ´HÏ{Œx$y§`hEÞJÚéyD"/ëMXÛ/É SÀÁÍÙ|b¢´HÏ{Œx$tyÅ|£&Ø-¥ —ðùrhÖU&Šô½Ëˆ?–A@y‘hAy‘hAy‘hAy‘hAyããÞõõõƒlCÈýÒõnÏ&“OÑÍ]¶)þ0«kñ‚gÓÇß|Ä<Þ|ø -î~3_ºðŸ~ !ßþÝ ŸóÁê¦ Êàê»~0Ý0‰5òÎ'÷’»î äÎ{Ùb#ã[LWB®Þ|6™?ë…äêG‘×<›|둾&”üÆ/¼…|àgÈw_÷Òú¦Ê%"ØÂæ•뿦‹¼3*îüÖûŸ¾~¯yøo±ÈûàüijɃO8"ó? ÿ,î¸ Tàoÿþ[ê›ZA”7JXÈM7Ú´AÈ;§éÁb#‡¥ ‹_ÿíd‘÷Á'ü¦Ï´Bƒì7~ñƒäÛ¿÷úò¦Våûµ¾Ÿoôò²´áÖûg·ÞaWläE™¼W?‘å¼óÛ¤éƒçAØßøùŸz=ùÒs˜®åM­¨ yÙEót6î)½8fwe²Š{•‹¾yñhœ´ Y{½ØÀ•æ}é^Çî磶ºjò^—ª ò>øC/$ßzÄËžå3ôÖB®ÇÈ;UyŽÙ”Æ`%ÄŒÉÊä+&åeÒG£VªÕ^_¨FìÎ4ô)ï_¹›oôòRæ¢Á@Þ«7'ÂYµvþ“¾å%úÒ¾rÞÑÚ%ŠÈ;¿à •ù#6,W^&­hvÞ“veģũVƒÉj¯/lD‰N»÷ûŽ äŠ 1Ih¢p×gÈ”¦¾‹ÛÓœBW™ˆ¼ÐÛà/mÂw_÷K¼›¡¸©á3m˜TЂǾñFCVÑâÔ¥•´!/#±5̃oíõÙæù SYÝ«°x×ú:$»bcy§“ 5:x©ÆéFJ±Ÿ÷[›ìL¦¾ð×áð /¤9oý¼*yáXœŠ)†ÞÖB\± ¯h¼]Íyó2⌔l}k¯O«ÙÚe:‡x‘Œþ"/{TË-k‘—þ¢*o-r²ßšç½êÈ{¤Ø+$H|Ê[Îy™m£ê¤"¥2ì¼®¾êR-gͪ3C™ó>EÈ[Û+$H|Ê 7õðl2=p×õy¢ì*ËˈGPÝâ"㼬öúô#ž6´<ÿsD‚$;{èçñr^Ir™—Ñõó³y?o›»×j¯Ï7lž RÞò73I6­Ô:±R‹c^–>èA^Änäm÷3z•× R“v-•±Õ”gP^”w¥å]o]+¦ :P^  ¼(ïJËëLº´‹òæ ¼P^ã2žÁ´åEyËõ,¹7^Ay­7åL|ÉÛñ*à¡•k‰n±óAµøHK?¡¼lÉÛíå‡vöÂ%AÊë2mè14 ¼–ž¼­ëîÊë”Þåõ}Gy Ayù2rÅ{ Q^”׎¿ËtØg~‡‰¼˜6Øo¼51È+ÖÇÏ,4`™ôÎåü押D–ô¢¼öoM òò H#¤˜èÁ.ÚÈ+•×%(¯!QÈËîbwÃ-Ͷëg·ï7ä¼(¯îU–oMÏòšô@&|6~of~pw¸S¥Ÿ0mоÊRã­ñ(¯¶‡\õ:¦,·ÖéMnò½Byµ¯²ÔxkœËÛNTi î.f7Ã'Ö™m%Û£ÈÒ†WåÓ[”ŽE³g‘䆨Qz—,{0-f^(oîÊê"0kÚ“÷nŽîœ°Ž¤95‰A^˜çBÆâ¢Y^EÏEùé(Pš«åͱ¦l¡J†Á‡?‚ªmŸ°Á· ±(¼®2uš5J6Æ>v0‚žCºß³Gó%IÉì±ô©c¿’>°ù ¶Å»£ Søõn½1ÎPåµomZ±ƒ: ¤]eí"o¿9/¼4¢ª.N탼çñéZ¦ÌÒì)xKÐ;CeÑvÊd¦Ï*œ¼‚m¹~g5sØ*ödSÎ òn‹_@^*ã /µäMŸJ“Û,ò‚Ö0 ÊË›w?ܶï9ÁÊKÿ‰È›Ê+"oúD^H²œWX<-\¦ª¼Nãm¡m44dÚ°sü·¡›dí©»Eyé./ â/; °Njübͦ<øœ×¸¬%Oí( Q^fs¼·ÁŸ¹¤wyýßÔá ÏžaPhÀý¼ž’…Bƒ^[«7“¼]y}‹ËÚ\Üv7laÔte· –”è 3mX‚ÁÈÛƒ¹„ ‰„5I·Á’(/ãUGµ4W†á\íøÑ´v‰g òzTwÂHÛå«FÎî ‹Ûƒ‰¼Û—Pº<ÌÐ^fóÏ×Ïè!owu'æ”[&°”¹r‡AÉ«þ`FÉ\+߆õLwGìîÝ•a`¼[ê%+5ÆYAyÛŸ£ilAœåÚ#oï—‡ù…+öÉŸóÈ«½2̃oñ⚤±•“×P\+¢JÛ'°æ)ßžä•uôö./[«i†sryuW†i¸º©±“W£®_Ë{@ÿ›ÝÎWŸF^íK€È+ìœÿîbäU^ã¦ÕXWY^eõ®•-ïÂâ¶;Øc”—1ß9~ãCi¾›ìÂú+Ãb8é€r^YØõgmºþš’6`Ú a‰+Ã’ÆVG^‰º^­Mw£çãw‰+Ã’ÆVEÞê}ˆžãmaGzn0À´ÁYc+"o±Þ¾´å ¼þ[ y a·Wq å /mXòÖf4t#oViïæ’ ä­_¥èY^ð`›÷~ñž0ÈxY‡n~—»ØŠnÞ+öëùn½1—òÖçÕr"/¯³ßd!'Hy=¶/æ^¡.°NÛ(½SˆiY¿nvQ8“WÞáOÞúŒ†.ä…*¬¼›uÄ3bÂ6¸e˜ßô ׄìÌ®¨’üÖxøá©ûõ>ÞbcœØ#/¤»á˜K•·ß´!Õ_P#¢ ŒÉ›Že ÎòdüÄêÚ¥ázcNsÞÚŒ†¶å N]”Wsõ¿ÿ˜†Ý÷ð\`œæYä…Ëm»PR<¸¢y­WS‘7 )_)¯Çö%ðœ—|ÅÅ|¬By‹9o1òB†Q×Po,fy“àÌ%(¯ ÖÛ@·SÑ¥À‚*ËÒÞžêf9ïÚ£{ÏySèYšÉ®$o ºÊX?¯ÉȆ¾{ìWSw2ñ®‰(¯#úîçµ_M*/¤ºaº¦¼Û÷ÙXŒò²T7Pw×óà”×&ïÄBEîRÞžÓ¸‘úKÅ–àY:(Ý\œ]-öx…mGœ¥©æãl ȶ»AÈ[Ëúžhºp¤[¸ÌÆgèm8s«È+JzŒ¼b=½®ÕäïnïòzOzÓö×òV<ãæx;Ý2yY\'s¦óûâù-ð…>3ÐÅ«Å>Ó†Úr8å Ý]×ûß)ÑÔWÜû’W ÷nºnYÚÀŽÆTçñÉï‹g·À?&Bÿ¾tµ8æœw¼»äeÔü⩉¼\®D^>¼ æÙ&ù}ñ¢„˜Bÿ¾tµ8by'‡Ýëp{yÙw¯ZP%Dye9/—wʆêä÷ÅÿÜŸ¤S¨óß—®G+/ »‡¤§éóÌq-ïÎÚ¥pî¢ZP%Ä´AÚÛÀ\„œw›¯›Äî‹g·ÀÿQ:…:ÿ}éjq¬òB,8 <ìÇjÀÄ/UƒÊ«ÄìøBÉHåeDZÃàÝ ³·ÁkÚð2Y)FwÀÞûy-V#ƅ﮿]TuŠJÞ¶Ä(o>ùmð¸ÞE˜i_{Âæ1o@y›ÉÜõ¸êû²8–n­‚k?ÍòúLzQÞF„»ô‰òŠû7ÚÉ\ÚpÅ~ö^U^UûUòE¶¥E oê.q¶ê»Mª, ¯Z!^ÚXøòÜEy¡£—_…:ÖF^—èå=f'ÙÈ1ðÁ ya$Ãóù4ÿéJðù ñ¼ÿWŒy7¼¼EwQ^ƒ”—%F»Ù >XA\*?Ž…Úl%x¾B|VPŒyP4º¼%wQ^ƒÃK`XÂt;ÄÀ+¤—yž­G,Ùæ³1ŠÆ—·ì.ÊkÐ`€òòÈ›bàƒDä~¿LÞi>7 )^ JÞŠ»Ã”w|Ö#‘Ý.m0À´ç¼é >XAä¼Ç^›NóÑø)G|…ø¬`:æAÞXÐòVݤ¼žØŸ« •×£½fiƒ“ÆB–·æî0å½à€ÆÞnòöŸóZ"yÅp†âK†(/=¸®íO[¦ AÉk‘¸ä-¿`ò¶mÐóõa¯o8yewü ¼ ¢¼Í¯²Ôx#²™E)oËÞ™¼¡M÷´4‘È+gˆò¶ímð.¯WJM‡*¯ü6áAÊÛ²·Ëë1oð»rV‘å­¢¼m{¼wô¢¼Sé RÞ¶ Jäu™6ôH¸òÊŠ¢¼ ¢¼UüÊ«šÃtòÂl…é´ bÚPÅà;™³?ßIW4\¾¢vwòòÙ ÇJ{Q^ ò‡³jˆ2á%ÔwÉÈ‹òæ˜DÞÝÙÖnçlVMS़Kæ¼þŽæ«6Àtdt¬qö)ƒjšœ¤¼mDy«xëmh\,e¸òbÎ+ÁjÎ ›®9¯:á%(¯Qƒé'X°åÕ ä6æ ÚjB^¥Êˆ äõš7ÄŸ6L³q?²õŽ«i¼1€¼ž“Þøå•,ž²L5Ñ»€¼’¤Ó†ÖÔW®17rwmï¿d-;mƒ(o³®²ò§\_¹¦‹¼’?…é¿«LvÆæ’UHàòZ™úÊ5ºjš¯äO!DP^¸Ìyë+×t”·ú§"AÊ‹iƒ1slåwå•k4Õ4f¼’?…Ayýa1çmÕ`Ræt­ö§"ŽF•µi0“×Ï}%Ò†Íi±¶šø»ˆ‹Qe§JéXí´X*¯Ï¤wäUCc‡üÖå (¯ „­ir–›6‘Ó4U£s·¶ˆS8þûKß½zA•¢¼©½(¯˜×¥ùFŠ.òÖq Çò¶Š¼~Žè+‘6ŒŽ¿‡~²£Boo-?kªFxë‹8‰ëÁèå,BÚ Ê[Á¨ŸÂBaHd=J4Ê«i¢¾ˆSØ?ak{PQ^!¦ „¼ÓÒåáÒ¶±ýÙZm§ qÔUV?Þ4œçÛP^ƒ§1¤ Â0F«È« ¼±à:òj×&%y=ÓW!mcz· ¿¨ågêjV¢› pœóê×&\ÞrèuÉjÈk€Z^ãwÂVB¿ö0)ߎÂÔ´ÁªjV&ðº¾<¬_{˜ ¼UôgSÏìryxU2^÷—‡µk“Ê€ÎêCO ïì܃ñ¶¾X¯8¾Ó†Í2é¯{“w¥úìË»Ä,‘JyÝØë~äOMW±±–6Œݧ¬¨fµÜ §«ŒÔÒÀTßÒº§õ[¢ÿÉ¥Û|ÛÃ]“¢]ƒjyMõíAÞM ͯè=çmõe£¼† 6.ía9wèZÛfêmë´åµL8ò6ÙkÖŒY®ž6VEß9o»ïå5l°"¯lHd³5¶Ó†Ö) }ç¼(o3Ëõ6˜ÈËPj´´¼ü,K"ë²6ÐóEŠ–ÕO^ʈÍÛ ð´DÚP¡£bék •ä•9íGëy¢=”W‹jÆœÆ[ÉËaªÉÏø¥a´`ª&q†Ó‰ö´Õ´ý¦c÷¡+/ƒíõϽþßeÝ+l?WIåÍžjPAÅÌËÌZRð—ôã-ÃåD{újVQ^òeÐö¡+/'äY—Ϙ£ jyIy¸H¡ÇåD{újâ“÷¤Q !½áÔÛ—Ü@ü y5Èå]"oX–ø‡DÉD{ÚjZ¸¾äÕ*ª†¾§ëŸGÈU—AÒ`#m0hPB%opÉJÈ[ŸhOWM@ò¶TT }Oßyù;é?¾Vä¥iÃñw«û!ä͞ôÁ!ÉkK×2𞮺‚ïõPow{é Ûìü#u/ÊÛ‹¼íë´#¯m_KÀ›zàůx#ûÁFäå+¶ì*«ž±¹d5Ò†qË´Á¿¼.­À›zèJèp ֺʨ¼-»ÊRy}Ø»ò²‰ Ûœ°y”×i°-a_—ò‚*† NJObÚ a¾Ãn.kÑUæK^?Ö Â˜ƒòq ï_s{y=ÅÛG—‡[7è/odÚàZ^_‰Bë¶”'Ú•a¤™všIã³6Y yÛž°¹•·oö#oi¢=*/ ųÇj,É‹iƒ éCcŒåíK]硎wœi–²RyÙÓ(o{—ou&o/ÙB†kywÖ.½"ïù굇“æ§-² i;S+-OÙ¼ˆ #yû°/˸{ÉFñ´åí.ïtWgcj\¾u©U+oßêºÈyOìO7ÚÞIAÊy¦ ¤Q¶8jº1ò:‘·wuéûZ\ûØÞô¦Où{o$ä¾Ó§¯éR!?Ekµö0£zQÞF²Û/‹ƒÑ›–ou oÿa—ÀûºjK×^Cæñ'7’ù_^÷õ·ÞØ¡ÂÅ©}úO=ÆßD^§ÄŸ6ˆKækRX—7uá}-Þ!_û'õ74òÂøÅòÐOtÚЩ•×µ½ñ˛ݻfxÛrŸ¨ZÞ@Ôeoì¦7òÈ m¸~è”7”¨ß ¯“ `ÚÐÌ|‡Y;’\¦ùZšŸRýاWþ¾æ,Ëv]È›®–“}3C'…¼åÕ1Ò_`3¸Ô’ñØ÷¡•GÞ3†•³gÏšµìòG®àËåíœ6TOª“»¨ä-…^—¬@Ú`†y5§K噽'Ӵጱ¾àïY¯Ãýmïcº‚¼OØ8ê%¼PÞ®°é(ÙË¿ˆ“YÎkn/ÇŸ¿°Ã‹k¡ÃØé*ã˜ÜIQͲ ¦ ­i¾Â¦ã´x‰°7{¶­½Þb°£0§iªl0÷åmOã6=§K¯aŸf¡K¡½½×»U¦\FF-ïD_Æ«™6t‹¼™¼{-ØË9›Ñ©š:ÜI ¼fOËiºÂf@ÕÞIIÞŽöfœ-Ò½ºåUž±‘õÖ{5ø´¡s5{Éä8°·ÈÙ íkHŸý"l¿ð9ò…³gÿ«û.éfè5“·í÷‡òv­&“·pÚæØÞ U™Uä¯HÈW>G7‹Ï~õ›Ÿƒÿï¾l@™É¨²š¼Y)ë¬hÚйšÜ^þÊŠ¼ì5$÷7!‹ÿø_B¨¹ /<ìˆùü¼µ>…¢¼îìEyTì=¬ÙŒ¾)t7¿@“…{hîðͳÿÚÝÝt~Þ%"o.ïzk{1m°PMÑÞ„Òµ2'4{alÿÁ?H¬¤ ËÌÏËÉò†õær²—¶*Ý¡Ë[´—$‡DboXúÂ;¼ç«|¿@ƒïW,œ±4¨¢¨ ³ÄÓ5%{ëi/ ,øÂ;üæB® 'n÷|ÑKƒ*JñÓ•½(o•¼Wfo@ú²± Ÿ…r®2j:ÛjXÝ®!çÍòþL{1m°TMnï¡ÂÞ€‚¯íð6ÚfW*—:aË\¯Õ‚òZª¦ ¯*ö†c¯ey¡‹ î¬2šŸWzEQ'‰¦ döŠÌ¡vÖNêà@^¸!ÛèLuèM˺°åm&µ÷0­b"¹e- {­§ »¬£W}k`sƒ\ÞÌjã½Ã´Á^5ÂÞ쩽!èk[ÞùNrüHÜ ¸LƒÌÂ<$›îÊk¯š¢¼j{CÐ7 !‘Œ‰óÄÓÜ^qû¤öö¯oŸòJo˜pn/Ê«…Ù›ÝÃ&:dô¬opò‚½Å'ÌìÅ´Áj5`o>éHƒ½Tßý O^R–×Ì^”×n5§K3æ4ÙÛgø QÞÊçd9sÀ´Á„ӥ鞚ííMßå­Ùkw'{’w2ÉßVò’Ó¥¹Ê €Ô¾–ýèZoc½uì 8m˜¤DyË#Ìxm'›>å>ô TÞ¶ö†#ïD‚x*.y«ö&ÔÞ°ôíU^õä"õÌÁÚŽ:Iê¦JˆLÞjì¥ßÁÉæ(á»ë!Pyë’5{mÈ;ÿI£k±É[³—èìõìoò®³PV}¡ñ0vÈ’#a‹D'ï2öúô7ùÞÇ? Û[>ôɛϜù˜‡ ä•èÛd¯CyËžvi(>y—³—ùëCà„|þCŸ$ä{ÿØç?LþïïÿÙvýµ™7 Ó ª¯z5–6´J– °J"”WboÒØg–sæŒs…ò½ü'B¾öwÔ`b_Þúüo­>Òº¾ÝwÉPÞå2ƒFb”WÌ›^ª×T_À©ÀôÞòaBn†ÜáûiC}æM£®²ü¡aðµ%Ùò ­QÊ+ ¾'é·ÐæóqƒoÓ{³m{—‹¼ÅtÂ,ø.­Z*ªCg3"•·n/9IýmûI±ï0¼Ã›?Á¸å£6ëj3o¶Èy`”Å™ ²´¡[×ÁÄ*¯Ä^r’´ ¾96†wøµ¿ýšö~þÃ"¯¼ÁãÐËvuÓw“8Ih ˆV^¹½¤uð-p&cù:Ø;üÞÇ¡ÃÜ|æŒõÀ[hH¶|«Â^Ý(õº½ê‘[Úµ‹Ö ñÊ+9mc÷ÛøÏi÷Ò~Ç6´‘7OOI]_Ňس­"–WžøÙŤNœ‘£(äÀœR¥Ý©Üy¤•Ô€ãyͨ.ߪ¾Öý•¡Ù±¼æË·¶B’ç«)/ôE‡¯§b[^™¾é*Ä“‰÷ $b}Õññ£qÓ̤ˢ^¾µÃ9èm */ÐàX^Ö—>{l§j ÈΖ集_ç+ž×IxìbowvþQÚ+kåò­@«œ·Nž;D ®syé¸ô:l䫾Ëúr}= œÅ)j}ãêW-7X ýjÕÚÚZ+š6ì¬]zÑû"»TS@.¯,õÍõå{S8áSð¶Éèé[ÒYƒ9å]b°ÎjÊËf¤ß(­<êF^iðÍ’_qêáIà$K—F4}ÙO$ ÛÛÊiö9 >m°_R^iðÍõ<Å`¨}´Ë‚ïnÓbíVÔÑ2 'í/´÷ªÈk¢oÚƒ&¹2e¨vvÞ“iÚ;;ÆÍûhññô•6¬¯›N~Ùå#r}–¢Ð·æï¤ä°e¡²Åë'‰‡s6WãÏÅ»¼ë\Ûõм€ÌÞº¿@©+3)Òmû¾Âf!çeˆ¿îevÈ뙵OòZRC'¯<ø¹¿¤x)ÿ]"ÇtWH^Š¿©µUœÊ[»ßÊuä%j}Á_©Àí…%…Ó5»ƒ”·KõZ¦ *k.å­ú÷ /è«òW€KÔûµ»Rš,n»¶wÝAîœLîmñÊ%q,/ц_òj¬¸ÛPÜ.YM#yICø5ó·†Lh…Ý ™ÞA7‹Ûî¥ÛŧïoßXK*©ô+_:mHÛð–>˜Y+XÁÈËhÐW“@,Eáä;»ƒÜE#ð]w[n¨Žƒ~^"`DZ¾m¬8Íyk÷[ù“·1{ \`ë ôÞõBî¼"°H!œâ-þlI( LIDATÉV…ßÎiC¥ÁœÕê*«Ðì/qƒáòð§àxr뿬¼Dáïòò.m­`¥å%Ì_-Æax‡wÞ Á—°GV*Õ5XÀIÎ[lÎJþÀ­ízvé^ÞÒå}ïòZVf—‡o‡´wú2ûTÇÚ ,àZ^ÒÑ_n­N‘!ÈKÌý%ÅH¼”ÉìòðmÐáÐKWY÷pfÖhÁßiÃ'eM D^b’@H8YEûŠÞoÀô"/Wmà‰¼­zÀŒYõœ·ÌéÓK)\ fsUëÞå•a7m(´­M ÜX+–¼œ®72(yI!×užÁ Q^ { V ÷½é„,®½†¾Ý¯¿õF;Ÿ[ÓG*ù]×€Ù*âv»S|hKáYÞÖ•š´k©Œ­¦ᅫjûvj0ùÈ5å;"Ý¥Š|Æ*f™‚ß)N³?üv ¼Ö›"7½™j ù7Ø1ŠÁ´ ?É)GÛ^æçmë0Êk½)2ïôÛ¥¾Â’…o¦Ûð[ëÓ=+ŒòZo ²¾„l—ú Kª]2•±s—‚£‰ö Â0Êk½)š.¼í}×7YC¾ÂR¢ùv‹JÊï‡oÒ6˜iý›Þ%Êk½)èj€rß›J·¢¾Â’r— f®WŸÑÛ`äHFy­7å˜ê K»$·ÖÓú—$Fy­7å™fy…­N¬ô± J%£¼«(¯ÀË=lþé5ò"@yQÞhéý›YÕå[÷ôþÍ QÞùNá2‘šÙ¹º[I¢[hrZšŸ]Aº šqbR_zO(/˜2Ö/Š>ÕÊ2?±Ofçì7–¿}ccí߀‡ÕX[ƒòú—.rê£êhí]Xâ×Ä*mc³óž¤©eqªùo¤P^ÿòÂ%"šÚrZÁ 1ªHy§.Õ¥ l˜Ð‚/Êë_^XßÊ–¼‹=íÕ³­5M[ãmmÎ ÙIpÑå 0òŽ’be£¼¼Ì|§É]QOScP„îO£¼i5Áå½6îþˆÍGdû37ËyÍzÌtj¶nÌ>mOÞ Ó¯Èø«´]að;h ê z γ Ü5ËQ´iT³¸(°®²ŒàÝ~ͱÕÏËC¦F;ZH—óöóê«é‹àÝ~‘ÞÞàwéàÝ~‘ÞÞàwéàÝ~$8PÞ°Ñö݈q¢œº8ëÝ)—’få´•ŠÚúD9ýNNù°>ƒ,€ò~Œ¿¶"Ê©‹³Q|åRÒÂ|´Ÿ®R1âO[_:2P»“bx ÁAyƒF{½R Éå”Åù(¾r)Ya^N[©ñ§­O”3ÛÉZMÚ7òv¤ˆ'Ê5 ʥ䅡œQ¥µŠÔåÌv’Y£ sB“·i YÃsóÂE´Âä±£½þ-ĉr ÅAÊr)ya&¹A¥ðe˜ÔåLêcÃM*,€òÙèèÑ®ÝÈkP)ñgP_>2P»“¦¡<'Xy{Izƹv1·1{Îaá0tÎÅI²1…1ó§o¥§«¬¸(;†÷¥ìê³Ä™QÎ[’·¡5¥¯¯0ºJ¿“It™På]ìÑ\tüþrg[eyY˜;˜mmгã 8*Íwh‘ñ±(Ó"ý½;hÇè‰q¢\Cq° \J^8M/+Njëåô;)2“,ª¼¢[rÞXY|Ž1yw™Èô?&+‡’iÚ° éƒI?/ ˆ³ÞÏÛXi:âOW_ZN¿“Ò±õó¦‚2iéì/oZ•N_©¼ô<r"R#(/K¿§àîfG주ÔËmyÕò¦Ez{ˆB•·)m`¿«È[IÒ"ý½Ä=¡Ê›ž°¥g`Å禬7am¿$/ý+¾ÁЧEú{#ˆ{“—åøå®2ž¶gÏh:ûÚÝRÚpÉVÂ3 ÞU&Šôýv—„&¯”©ÉMqÈà]Þ)=ôÌ=‚ ‘Ðåe]…è®ø5ùE«†i+h*¶ælAƒ—±¿TÙZÞôFÓËùå³s_½Ád£tÎ=Xœº˜Ö¦ìÐ6zZzotÔœ÷$ÖÁÃ~‚Sæ}þòŸâ¥Da³I’]€òj °y÷6 GÇØ† 'HÇӌذÇRäeOñRbãgLæH²Ê; àÒãSŽŠ‘—ÏŽ ý6ŒØ•JXŒ“ëÊD>±_–÷Ü"J6ý€òv§Ø¶\Þ+ö™¼pÏÃZªëŒßT———~ÚÏå ”w@p/QEÞÅPK²S3eä½ {ZÐOO<Ê; DÒzŒéaôsQ^‘ú–²\YÎ ÿÇ/6ðåEÃ-„aNã$yÜeyŸ–¨…D@è*újòбao‚´åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åE¢åÿü5…ã:© IEND®B`‚plotmo/inst/README-figures/plotres-randomForest.png0000644000176200001440000002376213304026714022011 0ustar liggesusers‰PNG  IHDRÌvÙvPLTE:f:::f:fff¶::::f::::f:::ff:f:f¶::¶:Ûff:fff:f::f:ff:ff:fffff¶ffÛf¶Ûf¶ÿ::::ff:fÛ¶Û¶ÛÛÛÿ¶¶f¶f:¶ff¶:¶f¶¶f¶¶Û¶Û¶ÿ¶¶ÿÿÓÓÓÛÛ:ÛfÛÛ¶fÛÛÛÛ¶ÛÛÿÛÿ¶ÛÿÛÛÿÿÿÿ:ÿfÿ:ÿ:fÿ:ÿfÿf:ÿffÿf¶ÿ:ÿÛÿ¶fÿ¶ÿÿÛÿÛÛÿÛÿÿÿ¶ÿÿÛÿÿÿlÝY] IDATxœí {ä¶u†¹+£u¬ÆÍŒ½¶Û\$;Mce·‰µÄj7R.nj{<ñˆÿÿ§7’ ˆs bÏ÷쎆$xçàF¬jR1ª–Ž)žfA"˜‰`$‚YfA"˜‰`$‚YfA"˜))ÌÓeUUÏnÅ÷=ûz=!¬cõüºötS ©[9£õ6鼆Çш‰ ÍGêŽé”æ^fqµi¿O ¦ éPmÇű,^¦ä-Ó)!̃Ì"ögËÿ[–Y›ñ¡9`ä’ é¼ãèÇÄq<ÌÓeZÓL“å°Ì—½Jn{rþ“n[Ü>.XfW¿`'¼²S_Н¼PäN—Ï~½cߨ1;­Ãl\´á1Pâ* PÛKC<ò›ÆQ‰Š¦ ­9<*CçöÝÄDÜX| ûÑ…+L––kõE옥”,*ŸßɲîâAeA›a‚ë±É)QÓU -“Zýð¶M–nšì&G-&M4÷Z ìPƒÙÆDÝ™|˜R6¹•汩ÂXbxޱŒÂê´§›Æä¸1=¿c¾ÇçwÌã†_ç6uwN”‘ÜmSgŠŒS.ÚðXÎó£´Ra=­1Ûã(‚ã¦õs#Ž]LÚhÊкÃV]Ldfˆ¿!eòͳ6Rk¨+à¸Õ p×2õ2ä7Ul] “‡ÇÌÎ… ïÐXаåŒ ¯ ÞÇÆÏ LìbÒF³å£äw?’ë.€dš¯˜Õ¾Ø¤ŠJÅ‚)›.ÕV%>L•ï u®…©JÂM¦=ޏ•l%n“6š­Ëî˜íb¢ýP¾½§qš©ÔFˆsžùGžï&÷fZ&S³L ³CrÍ f`õ˜¨hÊÐÚCfg™m$Vk™M³ß6û]ŬÌ|ÁF4€L{i‡Ù«3ù9Uó²S÷ÑÝ.$Ž]LÚhÊкÃVZÙ!<âí«©šwÐi˜w–i³Zòеfí0;Í9£5«º›¦Céˆã^¶ÂmLÚhÊкÃNmLšvùfÅ­Ùº?Tv¨ðÁ•&ó™»‹× ¤ÓÞÏ´ÃÔû™òÜ^õš ²—I£³‹IMZwØO½,–˜, SF4zcÚ埑ì)õàì 3` ô¼‹4n“¸”}ƒažw¾‘}$O7+~jBšY³ Ì‚D0 Á,H³ Ì‚D0 Á,H³ Ì‚D0 Á,H³ Ì‚D0 Á,H1`+ßÕt§·õÓdžÓÓôÄ_L€’ËJ’NŸfŸ—Õ¤äüÑà Q*“4'ÒǽæÐæ/DQ`zO«8]nB`6Wi—5†ééf[Ÿß³þ¶šøÚRÄ3I[—Û:ÑÝN"YÇ„yzçåóß³ÿwr±#ÿ&1øR9{êtõË[“Eš¾ó’¯ºÛò¿bÕûTÞä‚ÉóNÍD塈+ǪuÙ†9·DŽÿ÷ÿiGW|Îå†O‡¾¿ú\$]F¶É¤ýõéêO<â ϰ«{‘záÿSáïAæß?íÂgÅ*f/x*þ¿}Ç~¸ü›L9K$KÈùý;qxÿnó…øwuyýtsÍóˆ¥Uyaô,S-݈Ï6̹¥Ê!# &ûËbÅ®u§xdoFýKqîD¤¨M½tÌNÈücŸÁÉ‹h™,Úü??’9ÎõÙíé]9­_¹ùìÓ&ºŒ=K¥˜*¼UÞd}˜Wj)kãò2ñ¼E<µµ‘†öˆ/ ”gEÒÍ$ù潈¸tR7©×Bû²É¿A}äTj˜ÇÍ^[ÓÆcûciþãëÃl©a˜]Õ…9·T¤Œ4¨£/ŸßµgEÒÛöD[Ì>ˆˆa6þ²‚©ŠÙ¦Õöá‡wbFø~«ÜìŸñ2DN*#dAóâV¶µ½˜åAK7â³ sn‰Ðnk¤A1ÇÆ2EÒedë¶tºú\D¼ƒ)Sß…vßäßB0åjV“7^:£’3ˆ÷j•‡"ÂŽßú Ë½Ôà“K— ˜µÖjÜ]|!жî§áA½ÞU?Ü]Ÿw¼!#“Þ6€Ú®É^®òNÚÔ ÿòd“ËÀ$e"‚YfAò…Y­Qá¹±F€œ1ËkLóÄ«(IX+‚éëƒ`æ¢0ùâû#ë*üAõ dþó^¾y…‹u26üšy^î%5ð1æù§bÿ’^Èòq¸>ô·¿ýâWê„Ìÿ#ßþŸ"u¸æ×þ08χò>&Ãäx¨Ÿë!LÈÇoïêßþgµùã:!óŸo;c^b–¯ÍóæÀGËä¡þ«òx˜«bêY¹Hûä[À¼«Ï¿Ú«aß&ÿÏ?5¯®ÅµÚ<ÏÂýÁ»Qa¶!ûÀ”O%ÚÇ0eÂ”Ã¦ÝØ£(fê?~ñSµ ¢ÌÿÏnÏ?5¯±,å×jó<Óq;ðfS̶!{ÀäÉ<²J¼l˜*y]*ÅîC,‹ú–É72¯p=ýÛƒÚ‘¨¾î6ŒÓ¯Dmµ!{Àé;¿ÿEÙ0Ël¦sÚ5‘CöçŒdÓœ-¦|t¹ÞψLéx0]*8¿:S<…kv®)¦ÝGq05i#€eÂuŠHå«)`löX=û÷ËnŸÆ¢aš>–¶Ì v¿:“´]£wž¥Ö ³olˆü‹YVò<}rWÞ5|Ì y¤…˦j´«YôÓrä>ÃÛ«5˧#ÍF{a0›Mš6{b˜Sƒ£±ÙFÆ¢‘Ô0'Ú¢5l‚ÙêØ›®™f4Œ½° &ä#mÇ0M¨á ~C`Ê?i,3®]’ezúH“/ÇÁôò‘&7Ëì`®‰f60U –`NP.0«A°QD0½|Ä…ÙæÁœ <`vYF0'hñ~f5Ç3R‚‰ûˆc™¼Õ“ßLÍÁ´Éz~Ø€%˜´$L5K0ciA˜ÖÞÁœ Å`VöÞÁœ ¥`j™D0ci!˜zÌXZfÿ 4ÁŒ%¸ž.Ÿýz7˜<¦9™€`Æ’;®OŸˆmÝÌ9ˆcaç…dÓ\†ªþ”óüþŸlÎ Ó’9yÀ,CUÊ‚©,ÓLåX˜àÜûHùÃ,CUÊ‚ÉWÔD«3my“L`ji0í>F¯8¼T@i_†Z&ÌnIŸ<.¦&}ýX‘0Mc`Úg8gXŸI0-zÞ,˜ÀúÌU͵ôjÅÚÓ g˜ÀúÌÂ`°0"+˜ÀúÌU•³^ƒÚŸ 0¡lÉ&°>³0˜@lLðЇ÷‘š<6[ÌAlä¹%·)!˜¸PË„o”»e®‡æL0±,ÉæšLs.˜%‚KóÀ4§:Ã>æÍ_xI0ci˜Ž…—3–f œ·ù ˜D0U–o¹k˜–%°‚9A©a¶y fz1=è»åY}øÁôYM0cÉSc»<›/˜ÐŠØÁœ fó¼ öá8û ˜Ät¿C>&¸<ôA0§°Ì]”:³Î÷E0c)ek^ëù ˜“Ä”›fc˜§·ÇjÌŒö 8oˆ`Æ’=¦bªˆÚ3˜ÏA¼z1¡«"˜3 iÍv3¹NЅ­Â„¯Ì r[fýÙ-éªûpìíç"˜±äQg>Ýð¦m»O{©0í Ä1Ù)YkÖ|r”#L}lX ^¯æùý/†ýÌÀU`øbwøÊb0âõÚazùÀaŸèæS舛>²–»5 øpÀxËfo Ë¾@¼^;LÙâiÛ<#V¹¶¡€¯dÑší¿òhÝ0YË®êYf 5K˜½®Ëj3ìN›>²–û؈U`Îm(à+³Âì t±ïÇçwÂìµ ‚W¹»ÃWæoÍê?VÖŽ/f¯eü6xk˜9Â4† Ùçùã7[¯¦‡`u&/ŽÆkBk  ÉRÃyv0L{âs„é1;¦^?ÌÞ@»ÝÓ$ÁL¯øƒ>ÛPÀW2UÌ)– $=G˜SêõÜRg® ¦W1»žælôÖ¬×1ð‚9AˆeÚKY×n# î)kR¹v˜ãëL°‚ÉÒ2½ê̵Ãßš_#LLåÀ¬÷[f™ÌÁÌOØØ¬½Ba¯sÏ&/yX¥‰@Æ×¼¹5 o³b˜«¡·Ÿ‰ì÷C0Ó+nk¶‚iÌôŠÚšÅ6oÊ&Ò0( æÀ2å£[݇f½&˜¸Ê©×™æ†‰îÄE0Ó )f.·~–YõÏ÷E0ÓËf]ž}J0W h¨?ýtóÌ ߉‹`¦6¸AEeœï‹`¦—w<«ÀÛªeÓ¾uî'3Yãyº„fÖ°eÎ÷•;L`ëÔOn²Å“7][‡æÐbûÊ&°uê'7ÙâÉÔnaà» ¬ªÍó}åغ÷“™@˜Mqã» lõ0í[7à~2“¦ç*°ÕÃÔÔ_Ÿ¹r˜½<¿U`Õêa‚ë3× Ó×*°ªwdQî0áõ™EÁ´ûèÃtïøœ;Lx}f½š9í±`öŽlÊ&¼>“`”;Lx}&Á({˜†*ð _Åé±±>ÁL¯H0kýÈ*‚™^Á¬ æ’ŠÓç•3½âÀÔ.ÌåD0½©0½Þ_B0Ó+ Lý2Á\NPæ:hF€é÷2šõÃÌ蘃­<–Ø?$LÓaVk°N¿‡Ó–Gðšeö\—i™ƒ™$YÊAà|›ëž¯‰Z9Li™ËAà|³ŸÿEÂ'ò§éa™öGðo$ÌÌizÕ™¶Gðo"ÌÜ´Ó»&o L~Fšf¶ê/pس.¦é£ÉusO®òaæ[ÚN‡Y¿A0Î*Û–­GœðU`EÁîÃaJåÙ´õ4¨ÁU`ƒ ÖÖ Ø!g¨J}fHÓsÐΫÌü_+L`‡LÙÑô·Lû A90í;ä Ê¦ß@;XgwË[1LÛ9¸ª¼†l'¶f«º$˜­ßæM•×°Ð4˜–ÝòV Yl «’ÃB™Xç$˜¶=¹Ö [l‹+ŸnÊ4˜í·Nk…‰-¶uHvO0ãiü Aë€`æ¢ñƒ­ƒBa®QÎT  Ö¨p˜¾®.¦;ˆD#cÐÀË{ÊËIoìze0Çx'˜Ì‘—ƒ]ÌÕÀ$e-‚YfA"˜)汪®Á‹bEº°¹{º©ø °ƒz¯]‚îtغ‚x~çÂ)Ü£J"Gø"꽪e0¤˜ç÷nÛ¡’áÅËFéÂêî°áÃ-ˆƒã†GqP˦jµ7„S2ˆGøâÕ⽪e0|L~¯oíמ>á»H »ÃwÀ`¢ž>þ—-v™NG$\òðˆÙžˆã(Ÿþ “ÙN½V¼. wÌêàÀJÜÁ–eââø¾Ý  §ÜÛay›DAív‰³§Ëg0©.ƒA'óÁdE„+£›Kvìg‰Ã¬ÿñPÐ <äôÈÓJÆÔþâ üxÂqaâ6~v³§·Î"/‡|LÜQR;‹r§\E:@É8‚—9¶hÞ†{ŽZÌâµ/¿ÒögðK«£õr@@<ˆƒ+—Ýb–‰[Ö‘Û-è»Ë`0ø¹º&{ù“ÅûxÇ£öéš8ƒp ÷¸ÇM¯vwM°Rx¾® )wÌ‚D0 Á,H³ Ì‚´ÌóGKÜ6©Ú‰ÔB‡­˜÷·:1ÆxoQ²d˜ý„—¡^šNïŠcÛȳ>¢W?-ó馺¸çåó»cóŒs#žFHÎ"!Oï¼ì’ñÙ­¤´¿ÖSÇn«·^^«A9éíêOÒËÓ'w“#²”eò!NžÞýµü”3—ˆÌd±ð‡w—×ÌèÔSY9Œ*Fß´Ô®îßæîÚÑcqîK•òø+]‹Ád‰K°¶òó„>Ê[,îÏĘéA%ƒ'NÔ™ÛZOÝéêóm-¾Ü2¥·«{•rüY§—…)Ñ<'`i›þÛ\Bü%ï)˜2&3<õÐKžna²KÊ›äŽ>MñÖ’0YQËJ&ùyàÏÖYi2^Gfb¢˜•ÉhŠYXO(fÏ»kyZy»ú\¥|ÔÓ×¾–éšì.îyû@kñ'ëlãžwÕ!ÑRÉh@ZêDèÙ®ÙÑ[Ü*oWÒËj@Å‹uMBµÖ®É à p½ƒ¤4"˜‰`$‚YfA"˜‰`$‚YfA"˜‰`$‚YfA"˜‰`$‚YfA"˜‰`$‚YfA"˜‰`$‚YfAJ3p8Àötõú£}¦7¾ÑëÒ Ku³º)W¨’À \n @ýÕe3$ÕûMÿ¥‚²\.Í8lÛ¥ð2Á|]Õ[/«f!•🠶±ä굞Zb]Ç[1žÐ2ýW€«­7Û¥ð¼Äâ+àî…eªÕòÂ‚ØÆ’wªšòWœjv#¡dufÈ p¾£ß £9T–©`ÊpqÖ£¦“wªW3t8_},@©Cf»ä?o˜þ©®™…>ýN³âo¤(¤*fƒV€³Ô}øá]Ý.…ïÃT«å…ÿ±%ïT«О·š¿q”®ä¿œK4éšÃæëÝû×6€¸ÿ|åŸjîš]ÿiFó7ŠhР Ì‚ôf¿sZJ4@»w/é…éé.'yƹy‹x3Ö´ž¤ÌT× í!¬'©s Æ2›†¬'©s(1v£Õ™©â3ZO}üó÷ìãkã<ÁĽXšËëÌ)¿­ÿþ}ÿ<ÁLå-¡N_±?O3ÎÌTÞŠåéÛúLŬ[çì´=¿ ò6¯Oõ¡‰`eÌÈ/©ß|W¿ãÓ­co§Ûü’*²ìã+ã<ÁLåmyÃ4,ÓE)™¦Òz,;•Ó-_˜ë°ìTLÛ`F¨eư„F¦R¨(˜–hù?K4` L¥PY0ªFµfcXB#S)TL$:KwM ‘©Z?ÌÊ^WÖ*’Kì‘©Z=LféßšM4` L¥Ðêaº¢âm™‰,¡‘©Z?L»ªÁà¸Sî–n­& tAc³±¼Å–G" ˜3e׺ab-ÀÅ0çšf³j˜öXT¨²ÌXÞâÊëŸÌ™´f˜>IÖ s^*yÀjüSwH±ßal[Ì¡²…‰{ã,s˜î¦-äÈÃ_|Å¿ÃjaŸRù´ms‚_«…i±L»3DZ¯¿L…ö©Ç„‘ƒÀ• ³_<­¦_k»RÌ,3dZÇ0ËœÂlU€Ff~˜Ë-x\ÌYâq!ËLå-‚B'Î^gö´6˜afiq°˜cïíéÏÚ?´û¾-—TÓ,ÝñX!Ll²!îÑ/|ó¸É`YMxãb…0qÉðYšŽ›ó®RÛ*2˜|ÿS±¬fÉ *ÂûÈk„i×Ë|úøö°iLñ¼»¸ÿ9ûóÑ¢–Ùÿ•4œçnp(Ì ÷ÛnÓÞÓå³ÛÓ‹E—¢Ž*ò€YY¾é—ãuˆe~ò…Ú“9È[:õXzG`n˜XÞ›1÷ÇêÌêâµåµ£o5Q=³ô¿ÿÌ0°.ñ:³]z:þ®QÔšJø}ý@‰zÒÎ&¸½¥‹Ýº¶ŠÖì”boéAgÌíÑYµÐ5¸Ôé¯ ÷ô–DãÍÒâiV˜•O@@ý§Î†Ô+°ÌI,…9²K©Ÿ•AŒœVÚèüþ»<,sbËr ˜#{Q`X¾Y½eª„Œ¾á0ã÷k<¶‘ƒÎI¡o” æ¤"ÖæsVËL'ëº/‡0×ÒýÌÉ?ò$0+ã«y<&Ì@°Ì RH²“n–¦>¶(ö”RÅGeXLzK#$øÃò  é,Ó[f»CXenfY§6­U:Þßz–9åvaŠ1DŠÂÔ§99üŽªö«û¤_z°.¦3:veP̦†Ù›æäðguc·=¯C’ÖPm¥²ÞÅ â{ù,0£<»À`ÓœPXàSã£éç#5fe;ë¹z¸§ÇG?ç¥ â<‡B-™æpk“Þ°gl4y{\mˆ½ôøØG™õ AœÆ^gÂÓœBîm–«ƒ{"676•&HÛ}5-Ûšõ|xžAkéXSTÜph“®Û°ÖìþšÏ¤óIÑžõÃ0ñCÞwwV^ÑÃÓ«›>Rl(1b©á¼xó6Y¦Ñl©ô³öf«=­¢uÞ£ª “4= ÄÚí¬¶ ̈spP˜HM‚ßß>¿¬ÒǃÆE¾‡¤#°ãÅŸnªm°·Š9Ÿ íš 5‰¯eöN ïÙ^4" Ýx™° ÌYXâ0}ךhµ®‰FOkâa «TÓV§çBú *fAéhͬ5Ѻ&-Ç ‹i™ÈPÑX-f™3±tõ3}ך FbµñYÓ›gÊÆV°C$„¤3Úçb‰[fÀZ½):”íJLw[5FÖrFû<Õ¥¼v¼ÖD§Ùœ½‘  ñ^c(¼5Â2ÎhŸ‘eœÖlwJ3=s¡_ÛZ:êh€;}k6ÝŒöQ:`"[êc8ÇQg«¦Õ<:[:aãA~ù…¸J5£}V–®±YpK]³T÷05(Ú® –$ò g~ŒlRyj"Ì ¾ƒï†c[ê"ýÃ*5@X<ì£}úOóí Þá*ÕŒöyYº-ØR×–éê«Q@êÃΈTÃS.¯þÙåp}FûœmyCìy2„›FsbÇÂôˉ€ür8ŒÝ2gq§—»5û = º¬<ô9‘¨XËXg»6šeóÇÜÛ01˜§KÞ¾ÛÍhïÚ®Ú±ov áuA˜_ÇÈUgÆ,fåhï¼,˜¬Æ<¿÷éM`1; ÏnX°¹AŠÝÕO3¶f—@‰Á”o2~­þ)´fnÉò 8þS“eXº`Õ!›µ:[¢‘éó¼!Y;aB†‰¦Ð0ºa·%$B…Ô™17ž¿ÛÝ: sX„V6ƒ´Ÿ±<þŒ&8<}b€7è>½Pf'©1A_öÓîüC\hóGÜw¼K~¦Ÿ¿þÅ65ƒQó€°îçYß[Åòæ9<’HI`êæÕ}z'ÒeyöÅx˜Æ<Äi/$ã!–ÒÀœäg¤åM*fu~!¡}ÐcFÍ.c÷všwDâa—>Q!aÈ–‹•²sÀÔŸèÞà åÒšÕç!N{!á‚,g¶Ì^ÇcöT£ýL}b÷BBïþg–+€9¹U0ô6{¢ËDæ!zÅ3 –!0§¼¦8 au¦9QÛ›\ÛϦ˜£Z#¢L!7 Ùt¿–5Ë:f²×ûä@œ»á#@ýyˆ0Ë…‹Ø.&ðq§ÀVAeýju9vö]hÖ!u&2Ñï6<ŠK³LÖš ™0Ò2ƒ §- œIDAToÍBó#—^®fRÌðŠÄÏm »øî±yˆø3…‘QI£d0Á{>-–7ð:ܡ£àX¼¶”š¦sÊå%à6B'×&ûÑq·\¬’k%0£Üª ›!Sá——Ñ:`þã‹ù¡ðyˆVoÔ´˜ÃhŽ)ÜP˜ aÚ¼ÿR?ýõñëú›ÇÇÇoã’FyÄïÝ2`Võ7ßÕß|{ü¶þû÷ìðÿFD%²†¹q;Íh—ÇÇïXËéoüK6†™LkÉ5Û A°·óW<Ê_×9f>0g(¹bÀT翈?,¾§¯'Å)ª²Y§/¹"ÀTßOœ%ûù±ˆfTÊæ3yɯ˜ý_^°:á+4å3}É5fžKMÙÀœ¡äš3{–ùÀœ¡äŠÿ°%3¾ÙÀœAS`Úh3dç"˜^Þ¯™åÁLåme3aÖ…¹š¹ÁLY ‘ezú‹¦ ,s¦wNÇWv0Ê3Î3½s:æ@æדTo˜«-{:ZfÊwN§‘/Ìõ–=|ãœþÓ‰ä s½eO'jÍ*­·ìéD0­¶ìé4fB_6K|D­ÙÌù]ëI*ÁêÜËÒz’:æºÊžNÞqî¯Ô\OR½[³«-{:Q¨ÑjËžN!qÆ—¢fšzÿbv­eO§h0s­e¨dWá–YOÞÓ Lñï@u¦®9a&(ʦ.²Ì¼Euf*o ˆ`†xkÖþù{9];3ÌobÝá™/…9~›Õ’!)‚èíøÝé‘%ÁôRº¢,̳àxb(óÙ—¢U~0Óe`¶ë¿aqËŽf~0ëdEÙt˜íºÃïøGF à¥r„™ª(›³Ywøµ¬ rS†0“eÔÏ„ü¥Óíªêò7Uõþñ3ä‘Y´„‰¤}â5KQ65ÈØµŸž÷l¨“ !Œ¼F0ý#èdB3õÙP'B ˜©Ï†:!­E³ Ì‚D0 ÒT˜{p^±ðX5/^³y}º©ª àM]³ßq/|·›ª½5XŸ,¯¥Â²Á/T{ M„ùÔ{Õ®óŽeùù½ÛvQ yÍêõ°‘/ª°y“×ìw8-ã38-gœB²Á/T †&Âóîé“/ØÍOW–ÌW× ¯‡­Ý›ºyc‰…ýM”“íÞeâú²Á/T$ š&Â<þàÒZÔ¨›óé}{Kñ ®^Õ;umÞÄ5ÀÛC ¿©:eœ5ƒ‡'±lð Š‚®©uæ?êœP4v¯| è¯︿Núm½g+¦Â´‡ê“²­Yà­g°˜íR1ô*^¿ x“¯fïˆÏ£µWÍã–âtŸ¾ã!"W6ô›¡6BÞÞ¡4µ˜e‘G,j‘4V;ð*]Û½ÉSö;Êß~ºÍ, [ aÙàª_™¡kü`|º&¯{þ”nk÷¦®Ùï(Ï¦ëšØoi=?­k„ ç³&4(H³ Ì‚D0 Á,H³ -SlåÆºø¯?z8Ômƒa¶Î\¼‡ŒS¨MA÷öÇ+5KüéêþÊþRúZ¦Š?û{ºZ7ÌËæ~#ÿÛ/ŸŠ€yzçeõÖËêâá(~¸v°>˜W¿¼å0¼OÏôü÷,Q?¹a1àÇ*†ºg:òÂ?íªÍÓMuqÏ-Sdé@µX1{!KeœûëÓÛw§Ë¼—b‘çCv¬Ìeÿù?ž4ÉOýt¹#ó$/0â2wy/2Àï‘%ª%-SÁˆoù0r¢' Å¢ÿÙ§ßÊ¡Sž¬Sóûd?Øg·˜usAžá™ð¥È€ø0Ñ[9ÀlK¬æéÇ6˜_>¶ªŠÙ§ßI;d§ŽÍ ¦‚ÈpNË€ `²b‰5}xÁ³[#Ìzÿ¬)fu˜›ú¨,“7~ö¼JeÉ ÎýhXæ½È€ÿAL«4…ùzwÁþµ  g?Z%L^Uøcæë]õÃÝu×5ùÙ%ÞóÖ·çæƒyÞi îêbZÖ Á,H³ Ì‚D0 Á,H³ Ì‚D0 Á,H³ Ì‚D0 Á,H³ Ì‚D0 Á,H³ Ì‚D0 Á,H³ Ì‚D0 Á,H³ Ì‚D0 Á,H³ Ì‚D0 Á,H³ ý?6ì-­¾¡IEND®B`‚plotmo/README.md0000644000176200001440000001072213725236714013057 0ustar liggesusers[![version](https://www.r-pkg.org/badges/version/plotmo)](https://cran.r-project.org/package=plotmo) [![downloads](https://cranlogs.r-pkg.org/badges/plotmo)](https://cran.r-project.org/package=plotmo) ## The plotmo package: Plotting model surfaces After building a regression or classification model, it's often useful to plot the model response as the predictors vary. These model surface plots are helpful for visualizing "black box" models. The [plotmo]( https://CRAN.R-project.org/package=plotmo) package makes it easy to generate model surfaces for a wide variety of [R]( https://www.r-project.org) models, including [rpart]( https://CRAN.R-project.org/package=rpart), [gbm]( https://CRAN.R-project.org/package=gbm), [earth]( https://CRAN.R-project.org/package=earth), and many others. ## An example model surface Let's generate a [randomForest]( https://CRAN.R-project.org/package=randomForest) model from the well-known ozone dataset. (We use a random forest for this example, but any model could be used.) ```r library(earth) # for the ozone1 data data(ozone1) oz <- ozone1[, c("O3", "humidity", "temp")] # simple dataset for illustration library(randomForest) mod <- randomForest(O3 ~ ., data=oz) ``` We now have a model, but what does it tell us about the relationship between ozone pollution (O3) and humidity and temperature? We can visualize this relationship with `plotmo`: ```r library(plotmo) plotmo(mod) ``` ![](inst/README-figures/plotmo-randomForest.png) From the plots, we see that ozone increases with humidity and temperature, although humidity doesn't have much effect at low temperatures. ## Some details The top two plots in the above figure are generated by plotting the predicted response as a variable changes. Variables that don't appear in a plot are held fixed at their median values. Plotmo automatically creates a separate plot for each variable in the model. The lower interaction plot shows the predicted response as two variables are changed (once again with other variables if any held at their median values). Plotmo draws just one interaction plot for this model, since there are only two variables. ## Partial dependence plots We can generate `partial dependence` plots by specifying `pmethod="partdep"` when invoking `plotmo`. In partial dependence plots, the effect of the background variables is averaged (instead of simply holding the background variables at their medians). Partial dependence plots can be very slow, but they do incorporate more information about the distribution of the response. ## Plotting model residuals The `plotres` function is also included in the `plotmo` package. This function shows residuals and other useful information about the model, if available. Using the above model as an example: ```r plotres(mod) ``` which gives ![](inst/README-figures/plotres-randomForest.png) Note the "<" shape in the residuals plot in the lower left. This suggests that we should transform the response before building the model, maybe by taking the square or cube-root. Cases 53, 237, and 258 have the largest residuals and perhaps should be investigated. This kind of information is not obvious without plotting the residuals ## Miscellaneous More details and examples may be found in the package vignettes: - [Plotting regression surfaces with `plotmo`](http://www.milbo.org/doc/plotmo-notes.pdf) - [Plotting model residuals with `plotres`](http://www.milbo.org/doc/plotres-notes.pdf) The package also provides a few utility functions such as `plot_glmnet` and `plot_gbm`. These functions enhance similar functions in the [glmnet](https://CRAN.R-project.org/package=glmnet) and [gbm](https://CRAN.R-project.org/package=gbm) packages. Some examples: ![](inst/README-figures/plotres-glmnet-gbm.png) ## Which models work with plotmo? Any model that conforms to standard S3 model guidelines will work with `plotmo`. Plotmo knows how to deal with logistic, classification, and multiple response models. It knows how to handle different `type` arguments to `predict` functions. Package authors may want to look at [Guidelines for S3 Regression Models](http://www.milbo.org/doc/modguide.pdf). If `plotmo` or `plotres` doesn't work with your model, contact the `plotmo` package maintainer. Often a minor tweak to the model code is all that is needed. [Stephen Milborrow]( http://www.milbo.users.sonic.net/index.html) plotmo/man/0000755000176200001440000000000014334575431012350 5ustar liggesusersplotmo/man/plotres.Rd0000644000176200001440000003311415126334232014321 0ustar liggesusers\name{plotres} \alias{plotres} \concept{residual plot} \title{Plot the residuals of a regression model} \description{ Plot the residuals of a regression model. Please see the \href{../doc/plotres-notes.pdf}{plotres vignette} (also available \href{http://www.milbo.org/doc/plotres-notes.pdf}{here}). } \usage{ plotres(object = stop("no 'object' argument"), which = 1:4, info = FALSE, versus = 1, standardize = FALSE, delever = FALSE, level = 0, id.n = 3, labels.id = NULL, smooth.col = 2, grid.col = 0, jitter = 0, do.par = NULL, caption = NULL, trace = 0, npoints = 3000, center = TRUE, type = NULL, nresponse = NA, object.name = quote.deparse(substitute(object)), ...) } \arguments{ \item{object}{ The model object. } \item{which}{ Which plots do draw. Default is \code{1:4}. \code{1} Model plot. What gets plotted here depends on the model class. For example, for \code{earth} models this is a model selection plot. Nothing will be displayed for some models. For details, please see the \href{../doc/plotres-notes.pdf}{plotres vignette}. \code{2} Cumulative distribution of abs residuals \code{3} Residuals vs fitted \code{4} QQ plot \code{5} Abs residuals vs fitted \code{6} Sqrt abs residuals vs fitted \code{7} Abs residuals vs log fitted \code{8} Cube root of the squared residuals vs log fitted \code{9} Log abs residuals vs log fitted \cr \cr } \item{info}{ Default is \code{FALSE}. Use \code{TRUE} to print extra information as follows: % For more information, please % see the section \emph{\dQuote{The info argument of plot.earth}} % in the \code{earth} package vignette % \emph{\dQuote{Variance models in earth}}. i) Display the distribution of the residuals along the bottom of the plot. ii) Display the training R-Squared. iii) Display the Spearman Rank Correlation of the absolute residuals with the fitted values. Actually, correlation is measured against the absolute values of whatever is on the horizontal axis --- by default this is the fitted response, but may be something else if the \code{versus} argument is used. iv) In the Cumulative Distribution plot (\code{which=2}), display additional information on the quantiles. v) Only for \code{which=5} or \code{9}. Regress the absolute residuals against the fitted values and display the regression slope. Robust linear regression is used via \code{\link[MASS]{rlm}} in the MASS package. vi) Add various annotations to the other plots. \cr \cr } \item{versus}{ What do we plot the residuals against? One of: \code{1} Default. Plot the residuals versus the fitted values (or the log values when \code{which=7} to \code{9}). \code{2} Residuals versus observation number, after observations have been sorted on the fitted value. Same as \code{versus=1}, except that the residuals are spaced uniformly along the horizontal axis. \code{3} Residuals versus the response. \code{4} Residuals versus the hat leverages. \code{"b:"} Residuals versus the basis functions. Currently only supported for \code{earth}, \code{mda::mars}, and \code{gam::gam} models. A optional \code{\link{regex}} can follow the \code{"b:"} to specify a subset of the terms, e.g. \code{versus="b:wind"} will plot terms with \code{"wind"} in their name. Else a character vector specifying which predictors to plot against. \cr Example 1: \code{versus=""} plots against all predictors (since the regex \code{versus=""} matches anything). \cr Example 2: \code{versus=c("wind", "vis")} plots predictors with \code{wind} or \code{vis} in their name. \cr Example 3: \code{versus=c("wind|vis")} equivalent to the above. \cr Note: These are \code{\link{regex}}s. Thus \code{versus="wind"} will match all variables that have \code{"wind"} in their names. Use \code{"^wind$"} to match only the variable named \code{"wind"}. \cr \cr } \item{standardize}{ Default is \code{FALSE}. Use \code{TRUE} to standardize the residuals. Only supported for some models, an error message will be issued otherwise. \cr Each residual is divided by by \code{se_i * sqrt(1 - h_ii)}, where \code{se_i} is the standard error of prediction and \code{h_ii} is the leverage (the diagonal entry of the hat matrix). When the variance assumptions hold (for your type of model), the standardized residuals are homoscedastic with unity variance. \cr The leverages are obtained using \code{\link{hatvalues}}. (For \code{earth} models the leverages are for the linear regression of the response on the basis matrix \code{bx}.) A standardized residual with a leverage of 1 is plotted as a star on the axis. \cr This argument applies to all plots where the residuals are used (including the cumulative distribution and QQ plots, and to annotations displayed by the \code{info} argument). } \item{delever}{ Default is \code{FALSE}. Use \code{TRUE} to \dQuote{de-lever} the residuals. Only supported for some models, an error message will be issued otherwise. \cr Each residual is divided by \code{sqrt(1 - h_ii)}. See the \code{standardize} argument for details. } \item{level}{ Draw estimated confidence or prediction interval bands at the given \code{level}, if the model supports them. \cr Default is \code{0}, bands not plotted. Else a fraction, for example \code{level=0.90}. Example:\preformatted{ mod <- lm(log(Volume)~log(Girth), data=trees) plotres(mod, level=.90)} You can modify the color of the bands with \code{level.shade} and \code{level.shade2}. \cr See also \dQuote{\emph{Prediction intervals}} in the \href{../doc/plotmo-notes.pdf}{plotmo vignette} (but note that \code{plotmo} needs prediction intervals on \emph{new} data, whereas \code{plotres} requires only that the model supports prediction intervals on the training data). } \item{id.n}{ The largest \code{id.n} residuals will be labeled in the plot. Default is \code{3}. Special values \code{TRUE} and \code{-1} or mean all.\cr If \code{id.n} is negative (but not \code{-1}) the \code{id.n} most positive and most negative residuals will be labeled in the plot.\cr A current implementation restriction is that \code{id.n} is ignored when there are more than ten thousand cases. } \item{labels.id}{ Residual labels. Only used if \code{id.n > 0}. Default is the case names, or the case numbers if the cases are unnamed. } \item{smooth.col}{ Color of the smooth line through the residual points. Default is \code{2}, red. Use \code{smooth.col=0} for no smooth line. \cr You can adjust the amount of smoothing with \code{smooth.f}. This gets passed as \code{f} to \code{\link[stats]{lowess}}. The default is \code{2/3}. Lower values make the line more wiggly. } \item{grid.col}{ Default is \code{0}, no grid. Else add a background \code{\link[graphics]{grid}} of the specified color to the degree1 plots. The special value \code{grid.col=TRUE} is treated as \code{"lightgray"}. } % \item{cum.grid}{ % Grid type in the Cumulative Distribution plot. One of: % % \code{"none"} No grid. % % \code{"grid"} Add grid showing the 25\%, 50\%, 90\%, and 95\% % quantiles. % % \code{"percentages"} (default) Add grid and percentage labels. % If \code{info=TRUE} also display quantiles on the right. % \cr % \cr % } \item{jitter}{ Default is \code{0}, no jitter. Passed as \code{factor} to \code{\link[base]{jitter}} to jitter the plotted points horizontally and vertically. Useful for discrete variables and responses, where the residual points tend to be overlaid. } \item{do.par}{One of \code{NULL}, \code{FALSE}, \code{TRUE}, or \code{2}, as follows: \code{do.par=NULL} (default). Same as \code{do.par=FALSE} if the number of plots is one; else the same as \code{TRUE}. \code{do.par=FALSE}. Use the current \code{\link[graphics]{par}} settings. You can pass additional graphics parameters in the ``\code{...}'' argument. \code{do.par=TRUE}. Start a new page and call \code{\link[graphics]{par}} as appropriate to display multiple plots on the same page. This automatically sets parameters like \code{mfrow} and \code{mar}. You can pass additional graphics parameters in the ``\code{...}'' argument. % This sets the \emph{overall} look of the display; modify % \emph{specific} plots by using prefixed arguments as described in the % documentation for the \dots argument below. \code{do.par=2}. Like \code{do.par=TRUE} but don't restore the \code{\link[graphics]{par}} settings to their original state when \code{plotres} exits, so you can add something to the plot. \cr \cr } \item{caption}{ Overall caption. By default create the caption automatically. Use \code{caption=""} for no caption. (Use \code{main} to set the title of an individual plot.) } \item{trace}{ Default is \code{0}. \cr \code{trace=1} (or \code{TRUE}) for a summary trace (shows how \code{\link[stats]{predict}} and friends are invoked for the model). \cr \code{trace=2} for detailed tracing. \cr } \item{npoints}{ Number of points to be plotted. A sample of \code{npoints} is taken; the sample includes the biggest twenty or so residuals. \cr The default is 3000 (not all, to avoid overplotting on large models). Use \code{npoints=TRUE} or \code{-1} for all points. } \item{center}{ Default is TRUE, meaning center the horizontal axis in the residuals plot, so asymmetry in the residual distribution is more obvious. } \item{type}{ Type parameter passed first to \code{\link{residuals}} and if that fails to \code{\link{predict}}. For allowed values see the \code{residuals} and \code{predict} methods for your \code{object} (such as \code{\link[rpart]{residuals.rpart}} or \code{\link[earth]{predict.earth}}). By default, \code{plotres} tries to automatically select a suitable value for the model in question (usually \code{"response"}), but this will not always be correct. Use \code{trace=1} to see the \code{type} argument passed to \code{residuals} and \code{predict}. } \item{nresponse}{ Which column to use when \code{residuals} or \code{predict} returns multiple columns. This can be a column index or column name (which may be abbreviated, partial matching is used). } \item{object.name}{ The name of the \code{object} for error and trace messages. Used internally by \code{plot.earth}. \cr \cr } \item{\dots}{ Dot arguments are passed to the plot functions. Dot argument names, whether prefixed or not, should be specified in full and not abbreviated. \dQuote{Prefixed} arguments are passed directly to the associated function. For example the prefixed argument \code{pt.col="pink"} passes \code{col="pink"} to \code{points()}, overriding the global \code{col} setting. The prefixes recognized by \code{plotres} are:\tabular{ll}{ \code{residuals.} \tab passed to \code{\link[stats]{residuals}} \cr \code{predict.} \tab passed to \code{\link[stats]{predict}} (\code{predict} is called if the call to \code{residuals} fails) \cr \code{w1.} \tab sent to the model-dependent plot for \code{which=1} e.g. \code{w1.col=2} \cr \code{pt.} \tab modify the displayed points e.g. \code{pt.col=as.numeric(survived)+2} or \code{pt.cex=.8}. \cr \code{smooth.} \tab modify the smooth line e.g. \code{smooth.col=0} or \code{smooth.f=.5}. \cr \code{level.} \tab modify the interval bands, e.g. \code{level.shade="gray"} or \code{level.shade2="lightblue"} \cr \code{legend.} \tab modify the displayed \code{\link[graphics]{legend}} e.g. \code{legend.cex=.9} \cr \code{cum.} \tab modify the Cumulative Distribution plot (arguments for \code{\link[stats]{plot.stepfun}}) \cr \code{qq.} \tab modify the QQ plot, e.g. \code{qq.pch=1} \cr \code{qqline} \tab modify the \code{\link{qqline}} in the QQ plot, e.g. \code{qqline.col=0} \cr \code{label.} \tab modify the point labels, e.g. \code{label.cex=.9} or \code{label.font=2} \cr \code{cook.} \tab modify the Cook's Distance annotations. This affects only the leverage plot (\code{versus=3}) for \code{lm} models with \code{standardize=TRUE}. e.g. \code{cook.levels=c(.5, .8, 1)} or \code{cook.col=2}. \cr \code{caption.} \tab modify the overall caption (see the \code{caption} argument) e.g. \code{caption.col=2}. \cr \code{par.} \tab arguments for \code{\link[graphics]{par}} (only necessary if a \code{par} argument name clashes with a \code{plotres} argument) } The \code{cex} argument is relative, so specifying \code{cex=1} is the same as not specifying \code{cex}. For backwards compatibility, some dot arguments are supported but not explicitly documented. } } \value{ If the \code{which=1} plot was plotted, the return value of that plot (model dependent). Else if the \code{which=3} plot was plotted, return \code{list(x,y)} where \code{x} and \code{y} are the coordinates of the points in that plot (but without jittering even if the \code{jitter} argument was used). Else return \code{NULL}. } \note{ This function is designed primarily for displaying standard \code{response - fitted} residuals for models with a single continuous response, although it will work for a few other models. In general this function won't work on models that don't save the call and data with the model in a standard way. It uses the same underlying mechanism to access the model data as \code{\link{plotmo}}. For further discussion please see \dQuote{\emph{Accessing the model data}} in the \href{../doc/plotmo-notes.pdf}{plotmo vignette} (also available \href{http://www.milbo.org/doc/plotmo-notes.pdf}{here}). Package authors may want to look at \href{../doc/modguide.pdf}{Guidelines for S3 Regression Models} (also available \href{http://www.milbo.org/doc/modguide.pdf}{here}). } \seealso{ Please see the \href{../doc/plotres-notes.pdf}{plotres vignette} (also available \href{http://www.milbo.org/doc/plotres-notes.pdf}{here}). \code{\link[stats]{plot.lm}} \code{\link[earth]{plot.earth}} } \examples{ # we use lm in this example, but plotres is more useful for models # that don't have a function like plot.lm for plotting residuals lm.model <- lm(Volume~., data=trees) plotres(lm.model) } \keyword{partial dependence} \keyword{regression} plotmo/man/plot_gbm.Rd0000644000176200001440000001075713011421421014430 0ustar liggesusers\name{plot_gbm} \alias{plot_gbm} \title{Plot a gbm model} \description{ Plot a \code{\link[gbm]{gbm}} model showing the training and other error curves. } \usage{ plot_gbm(object=stop("no 'object' argument"), smooth = c(0, 0, 0, 1), col = c(1, 2, 3, 4), ylim = "auto", legend.x = NULL, legend.y = NULL, legend.cex = .8, grid.col = NA, n.trees = NA, col.n.trees ="darkgray", ...) } \arguments{ \item{object}{ The \code{gbm} model. } \item{smooth}{ Four-element vector specifying if smoothing should be applied to the train, test, CV, and OOB curves respectively. When smoothing is specified, a smoothed curve is plotted and the minimum is calculated from the smoothed curve.\cr The default is c(0, 0, 0, 1) meaning apply smoothing only to the OOB curve (same as \code{\link[gbm]{gbm.perf}}).\cr Note that \code{smooth=1} (which gets recyled to \code{c(1,1,1,1)}) will smooth all the curves. } \item{col }{ Four-element vector specifying the colors for the train, test, CV, and OOB curves respectively.\cr The default is \code{c(1, 2, 3, 4)}.\cr Use a color of \code{0} to remove the corresponding curve, e.g. \code{col=c(1,2,3,0)} to not display the OOB curve.\cr If \code{col=0} (which gets recycled to \code{c(0,0,0,0)}) nothing will be plotted, but \code{plot_gbm} will return the number-of-trees at the minima as usual (as described in the Value section below). } \item{ylim }{ The default \code{ylim="auto"} shows more detail around the minima.\cr Use \code{ylim=NULL} for the full vertical range of the curves.\cr Else specify \code{ylim} as usual. } \item{legend.x }{ The x position of the legend. The default positions the legend automatically.\cr Use \code{legend.x=NA} for no legend.\cr See the \code{x} and \code{y} arguments of \code{\link[grDevices]{xy.coords}} for other options, for example \code{legend.x="topright"}. } \item{legend.y }{ The y position of the legend. } \item{legend.cex }{ The legend \code{cex} (the default is \code{0.8}). } \item{grid.col}{ Default \code{NA}. Color of the optional grid, for example \code{grid.col=1}. } \item{n.trees}{ For use by \code{\link{plotres}}.\cr The x position of the gray vertical line indicating the \code{n.trees} passed by \code{plotres} to \code{predict.gbm} to calculate the residuals. Plotres defaults to all trees. } \item{col.n.trees }{ For use by \code{\link{plotres}}.\cr Color of the vertical line showing the \code{n.trees} argument. Default is \code{"darkgray"}. } \item{\dots}{ Dot arguments are passed internally to \code{\link[graphics]{plot.default}}. } } \value{ This function returns a four-element vector specifying the number of trees at the train, test, CV, and OOB minima respectively. The minima are calculated after smoothing as specified by this function's \code{smooth} argument. By default, only the OOB curve is smoothed. The smoothing algorithm for the OOB curve differs slightly from \code{\link[gbm]{gbm.perf}}, so can give a slightly different number of trees. } \note{ \bold{The OOB curve} The OOB curve is artificially rescaled to force it into the plot. See Chapter 7 in the \href{../doc/plotres-notes.pdf}{plotres vignette}. % The OOB minimum is determined after smoothing the curve, % but the unsmoothed curve is displayed. % Whereas the minima for the test and cross-validation curves are % determined without smoothing. % This calculation of minima is compatible with \code{gbm.perf}. \bold{Interaction with \code{plotres}} When invoking this function via \code{\link{plotres}}, prefix any argument of \code{plotres} with \code{w1.} to tell \code{plotres} to pass the argument to this function. For example give \code{w1.ylim=c(0,10)} to \code{plotres} (plain \code{ylim=c(0,10)} in this context gets passed to the residual plots). \bold{Acknowledgments} This function is derived from code in the \code{\link[gbm]{gbm}} package authored by Greg Ridgeway and others. } \seealso{ Chapter 7 in \href{../doc/plotres-notes.pdf}{plotres vignette} discusses this function. } \examples{ if (require(gbm)) { n <- 100 # toy model for quick demo x1 <- 3 * runif(n) x2 <- 3 * runif(n) x3 <- sample(1:4, n, replace=TRUE) y <- x1 + x2 + x3 + rnorm(n, 0, .3) data <- data.frame(y=y, x1=x1, x2=x2, x3=x3) mod <- gbm(y~., data=data, distribution="gaussian", n.trees=300, shrinkage=.1, interaction.depth=3, train.fraction=.8, verbose=FALSE) plot_gbm(mod) # plotres(mod) # plot residuals # plotmo(mod) # plot regression surfaces } } plotmo/man/plotmo.Rd0000644000176200001440000004576113725545113014163 0ustar liggesusers\name{plotmo} \alias{plotmo} \concept{partial dependence plot} \title{Plot a model's response over a range of predictor values (the model surface)} \description{ Plot model surfaces for a wide variety of models. This function plots the model's response when varying one or two predictors while holding the other predictors constant (a poor man's partial-dependence plot). It can also generate partial-dependence plots (by specifying \code{pmethod="partdep"}). Please see the \href{../doc/plotmo-notes.pdf}{plotmo vignette} (also available \href{http://www.milbo.org/doc/plotmo-notes.pdf}{here}). } \usage{ plotmo(object=stop("no 'object' argument"), type=NULL, nresponse=NA, pmethod="plotmo", pt.col=0, jitter=.5, smooth.col=0, level=0, func=NULL, inverse.func=NULL, nrug=0, grid.col=0, type2="persp", degree1=TRUE, all1=FALSE, degree2=TRUE, all2=FALSE, do.par=TRUE, clip=TRUE, ylim=NULL, caption=NULL, trace=0, grid.func=NULL, grid.levels=NULL, extend=0, ngrid1=50, ngrid2=20, ndiscrete=5, npoints=3000, center=FALSE, xflip=FALSE, yflip=FALSE, swapxy=FALSE, int.only.ok=TRUE, ...) } \arguments{ \item{object}{ The model object. } \item{type}{ Type parameter passed to \code{\link{predict}}. For allowed values see the \code{predict} method for your \code{object} (such as \code{\link[earth]{predict.earth}}). By default, \code{plotmo} tries to automatically select a suitable value for the model in question (usually \code{"response"}) but this will not always be correct. Use \code{trace=1} to see the \code{type} argument passed to \code{predict}. } \item{nresponse}{ Which column to use when \code{predict} returns multiple columns. This can be a column index, or a column name if the \code{predict} method for the model returns column names. The column name may be abbreviated, partial matching is used. } \item{pmethod}{ Plotting method. One of: \code{"plotmo"} (default) Classic plotmo plots i.e. the background variables are fixed at their medians (or first level for factors). \code{"partdep"} Partial dependence plots, i.e. at each point the effect of the background variables is averaged. \code{"apartdep"} Approximate partial dependence plots. Faster than \code{"partdep"} especially for big datasets. Like \code{"partdep"} but the background variables are averaged over a subset of \code{ngrid1} cases (default 50), rather than all cases in the training data. The subset is created by selecting rows at equally spaced intervals from the training data after sorting the data on the response values (ties are randomly broken). % If \code{ngrid1} is greater then the number of cases than all cases % are used, and \code{"apartdep"} is identical to \code{"partdep"}. The same background subset of \code{ngrid1} cases is used for both degree1 and degree2 plots. } \item{pt.col}{ The color of response points (or response sites in degree2 plots). This refers to the response \code{y} in the data used to build the model. Note that the displayed points are jittered by default (see the \code{jitter} argument). \cr Default is \code{0}, display no response points. \cr This can be a vector, like all such arguments -- for example \code{pt.col = as.numeric(survived)+2} to color points by their survival class. \cr You can modify the plotted points with \code{pt.pch}, \code{pt.cex}, etc. (these get passed via \code{plotmo}'s ``\code{...}'' argument). For example, \code{pt.cex = weights} to size points by their weight. To label the points, set \code{pt.pch} to a character vector. } \item{jitter}{ Applies only if \code{pt.col} is specified.\cr The default is \code{jitter=.5}, automatically apply some jitter to the points. Points are jittered horizontally and vertically.\cr Use \code{jitter=0} to disable this automatic jittering. Otherwise something like \code{jitter=1}, but the optimum value is data dependent. } \item{smooth.col}{ Color of smooth line through the response points. (The points themselves will not be plotted unless \code{pt.col} is specified.) Default is \code{0}, no smooth line. \cr Example:\preformatted{ mod <- lm(Volume~Height, data=trees) plotmo(mod, pt.color=1, smooth.col=2)} You can adjust the amount of smoothing with \code{smooth.f}. This gets passed as \code{f} to \code{\link[stats]{lowess}}. The default is \code{.5}. Lower values make the line more wiggly. } \item{level}{ Draw estimated confidence or prediction interval bands at the given \code{level}, if the predict method for the model supports them.\cr Default is \code{0}, bands not plotted. Else a fraction, for example \code{level=.95}. See \dQuote{\emph{Prediction intervals}} in the \code{plotmo} vignette. Example:\preformatted{ mod <- lm(log(Volume)~log(Girth), data=trees) plotmo(mod, level=.95)} You can modify the color of the bands with \code{level.shade} and \code{level.shade2}. } \item{func}{ Superimpose \code{func(x)} on the plot. Example:\preformatted{ mod <- lm(Volume~Girth, data=trees) estimated.volume <- function(x) .17 * x$Girth^2 plotmo(mod, pt.col=2, func=estimated.volume)} The \code{func} is called for each plot with a single argument which is a dataframe with columns in the same order as the predictors in the \code{formula} or \code{x} used to build the model. Use \code{trace=2} to see the column names and first few rows of this dataframe. } \item{inverse.func}{ A function applied to the response before plotting. Useful to transform a transformed response back to the original scale. Example:\preformatted{ mod <- lm(log(Volume)~., data=trees) plotmo(mod, inverse.func=exp) # exp() is inverse of log() } } \item{nrug}{ Number of ticks in the \code{\link[graphics]{rug}} along the bottom of the plot \cr Default is \code{0}, no rug. \cr Use \code{nrug=TRUE} for all the points. \cr Else specify the number of quantiles e.g. use \code{nrug=10} for ticks at the 0, 10, 20, ..., 100 percentiles. \cr Modify the rug ticks with \code{rug.col}, \code{rug.lwd}, etc. \cr The special value \code{nrug="density"} means plot the density of the points along the bottom. Modify the \code{\link[stats]{density}} plot with \code{density.adjust} (default is \code{.5}), \code{density.col}, \code{density.lty}, etc. } \item{grid.col}{ Default is \code{0}, no grid. Else add a background \code{\link[graphics]{grid}} of the specified color to the degree1 plots. The special value \code{grid.col=TRUE} is treated as \code{"lightgray"}. } \item{type2}{ Degree2 plot type. One of \code{"\link[graphics]{persp}"} (default), \code{"\link[graphics]{image}"}, or \code{"\link[graphics]{contour}"}. You can pass arguments to these functions if necessary by using \code{persp.}, \code{image.}, or \code{contour.} as a prefix. Examples:\preformatted{ plotmo(mod, persp.ticktype="detailed", persp.nticks=3) plotmo(mod, type2="image") plotmo(mod, type2="image", image.col=heat.colors(12)) plotmo(mod, type2="contour", contour.col=2, contour.labcex=.4) } } \item{degree1}{ An index vector specifying which subset of degree1 (main effect) plots to include (after selecting the relevant predictors as described in \dQuote{\emph{Which variables are plotted?}} in the \code{plotmo} vignette). \cr Default is \code{TRUE}, meaning all (the \code{TRUE} gets recycled). To plot only the third plot use \code{degree1=3}. For no degree1 plots use \code{degree1=0}. \cr \cr Note that \code{degree1} indexes plots on the page, not columns of \code{x}. Probably the easiest way to use this argument (and \code{degree2}) is to first use the default (and possibly \code{all1=TRUE}) to plot all figures. This shows how the figures are numbered. Then replot using \code{degree1} to select the figures you want, for example \code{degree1=c(1,3,4)}. \cr \cr Can also be a character vector specifying which variables to plot. Examples:\cr \code{degree1="wind"}\cr \code{degree1=c("wind", "vis")}. \cr \cr Variables names are matched with \code{\link[base]{grep}}. Thus \code{"wind"} will match all variables with \code{"wind"} anywhere in their name. Use \code{"^wind$"} to match only the variable named \code{"wind"}. } \item{all1}{ Default is \code{FALSE}. Use \code{TRUE} to plot all predictors, not just those usually selected by \code{plotmo}. \cr The \code{all1} argument increases the number of plots; the \code{degree1} argument reduces the number of plots. } \item{degree2}{ An index vector specifying which subset of degree2 (interaction) plots to include. \cr Default is \code{TRUE} meaning all (after selecting the relevant interaction terms as described in \dQuote{\emph{Which variables are plotted?}} in the \code{plotmo} vignette). \cr \cr Can also be a character vector specifying which variables to plot (\code{\link[base]{grep}} is used for matching). Examples: \cr \code{degree2="wind"} plots all degree2 plots for the \code{wind} variable. \cr \code{degree2=c("wind", "vis")} plots just the \code{wind:vis} plot. } \item{all2}{ Default is \code{FALSE}. Use \code{TRUE} to plot all pairs of predictors, not just those usually selected by \code{plotmo}. } \item{do.par}{One of \code{NULL}, \code{FALSE}, \code{TRUE}, or \code{2}, as follows: \code{do.par=NULL}. Same as \code{do.par=FALSE} if the number of plots is one; else the same as \code{TRUE}. \code{do.par=FALSE}. Use the current \code{\link[graphics]{par}} settings. You can pass additional graphics parameters in the ``\code{...}'' argument. \code{do.par=TRUE} (default). Start a new page and call \code{\link[graphics]{par}} as appropriate to display multiple plots on the same page. This automatically sets parameters like \code{mfrow} and \code{mar}. You can pass additional graphics parameters in the ``\code{...}'' argument. % This sets the \emph{overall} look of the display; modify % \emph{specific} plots by using prefixed arguments as described in the % documentation for the \dots argument below. \code{do.par=2}. Like \code{do.par=TRUE} but don't restore the \code{\link[graphics]{par}} settings to their original state when \code{plotmo} exits, so you can add something to the plot. \cr } \item{clip}{ The default is \code{clip=TRUE}, meaning ignore very outlying predictions when determining the automatic \code{ylim}. This keeps \code{ylim} fairly compact while still covering all or nearly all the data, even if there are a few crazy predicted values. See \dQuote{\emph{The \code{ylim} and \code{clip} arguments}} in the \code{plotmo} vignette. \cr Use \code{clip=FALSE} for no clipping. } \item{ylim}{Three possibilities: \cr \code{ylim=NULL} (default). Automatically determine a \code{ylim} to use across all graphs. \cr \code{ylim=NA}. Each graph has its own \code{ylim}. \cr \code{ylim=c(ymin,ymax)}. Use the specified limits across all graphs. \cr } \item{caption}{ Overall caption. By default create the caption automatically. Use \code{caption=""} for no caption. (Use \code{main} to set the title of individual plots, can be a vector.) } \item{trace}{ Default is \code{0}. \cr \code{trace=1} (or \code{TRUE}) for a summary trace (shows how \code{\link[stats]{predict}} is invoked for the current object). \cr \code{trace=2} for detailed tracing. \cr \code{trace=-1} inhibits the messages usually issued by \code{plotmo}, like the \code{plotmo grid:}, \code{calculating partdep}, and \code{nothing to plot} messages. Error and warning messages will be printed as usual. \cr \cr } \item{grid.func}{ Function applied to columns of the \code{x} matrix to pin the values of variables not on the axis of the current plot (the ``background'' variables).\cr The default is a function which for numeric variables returns the median and for logical and factors variables returns the value occurring most often in the training data.\cr Examples:\preformatted{ plotmo(mod, grid.func=mean) grid.func <- function(x, ...) quantile(x)[2] # 25\% quantile plotmo(mod, grid.func=grid.func)} This argument is not related to the \code{grid.col} argument.\cr This argument can be overridden for specific variables---see \code{grid.levels} below. } \item{grid.levels}{ Default is \code{NULL}. Else a list of variables and their fixed value to be used when the variable is not on the axis. Supersedes \code{grid.func} for variables in the list. Names and values can be abbreviated, partial matching is used. Example:\preformatted{ plotmo(mod, grid.levels=list(sex="m", age=21)) } } \item{extend}{ Amount to extend the horizontal axis in each plot. The default is \code{0}, do not extend (i.e. use the range of the variable in the training data). Else something like \code{extend=.5}, which will extend both the lower and upper \code{xlim} of each plot by 50\%.\cr This argument is useful if you want to see how the model performs on data that is beyond the training data; for example, you want to see how a time-series model performs on future data.\cr This argument is currently implemented only for degree1 plots. Factors and discrete variables (see the \code{ndiscrete} argument) are not extended. } \item{ngrid1}{ Number of equally spaced x values in each degree1 plot. Default is \code{50}. Also used as the number of background cases for \code{pmethod="apartdep"}. } \item{ngrid2}{ Grid size for degree2 plots (\code{ngrid2 x ngrid2} points are plotted). Default is \code{20}. \cr The default will sometimes be too small for \code{contour} and \code{image} plots. \cr With large \code{ngrid2} values, \code{persp} plots look better with \code{persp.border=NA}. } \item{npoints}{ Number of response points to be plotted (a sample of \code{npoints} points is plotted). Applies only if \code{pt.col} is specified. \cr The default is 3000 (not all, to avoid overplotting on large models). Use \code{npoints=TRUE} or \code{-1} for all points. } \item{ndiscrete}{ Default \code{5} (a somewhat arbitrary value). Variables with no more than \code{ndiscrete} unique values are plotted as quantized in plots (a staircase rather than a curve).\cr Factors are always considered discrete. Variables with non-integer values are always considered non-discrete.\cr Use \code{ndiscrete=0} if you want to plot the response for a variable with just a few integer values as a line or a curve, rather than a staircase.\cr } \item{int.only.ok}{ Plot the model even if it is an intercept-only model (no predictors are used in the model). Do this by plotting a single degree1 plot for the first predictor. \cr The default is \code{TRUE}. Use \code{int.only.ok=FALSE} to instead issue an error message for intercept-only models. } \item{center}{ Center the plotted response. Default is \code{FALSE}. } \item{xflip}{ Default \code{FALSE}. Use \code{TRUE} to flip the direction of the \code{x} axis. This argument (and \code{yflip} and \code{swapxy}) is useful when comparing to a plot from another source and you want the axes to be the same. (Note that \code{xflip} and \code{yflip} cannot be used on the \code{persp} plots, a limitation of the \code{persp} function.) } \item{yflip}{ Default \code{FALSE}. Use \code{TRUE} to flip the direction of the y axis of the degree2 graphs. } \item{swapxy}{ Default \code{FALSE}. Use \code{TRUE} to swap the x and y axes on the degree2 graphs. \cr \cr } \item{\dots}{ Dot arguments are passed to the predict and plot functions. Dot argument names, whether prefixed or not, should be specified in full and not abbreviated. \cr \cr \dQuote{Prefixed} arguments are passed directly to the associated function. For example the prefixed argument \code{persp.col="pink"} passes \code{col="pink"} to \code{persp()}, overriding the global \code{col} setting. To send an argument to \code{predict} whose name may alias with \code{plotmo}'s arguments, use \code{predict.} as a prefix. Example:\preformatted{ plotmo(mod, s=1) # error: arg matches multiple formal args plotmo(mod, predict.s=1) # ok now: s=1 will be passed to predict() } The prefixes recognized by \code{plotmo} are:\tabular{ll}{ \cr \code{predict.} \tab passed to the \code{\link[stats]{predict}} method for the model \cr \code{degree1.} \tab modifies degree1 plots e.g. \code{degree1.col=3, degree1.lwd=2} \cr \code{persp.} \tab arguments passed to \code{\link[graphics]{persp}} \cr \code{contour.} \tab arguments passed to \code{\link[graphics]{contour}} \cr \code{image.} \tab arguments passed to \code{\link[graphics]{image}} \cr \code{pt.} \tab see the \code{pt.col} argument (arguments passed to \code{\link[graphics]{points}} and \code{\link[graphics]{text}}) \cr \code{smooth.} \tab see the \code{smooth.col} argument (arguments passed to \code{\link[graphics]{lines}} and \code{\link[stats]{lowess}}) \cr \code{level.} \tab see the \code{level} argument (\code{level.shade}, \code{level.shade2}, and arguments for \code{\link[graphics]{polygon}}) \cr \code{func.} \tab see the \code{func} argument (arguments passed to \code{\link[graphics]{lines}}) \cr \code{rug.} \tab see the \code{nrug} argument (\code{rug.jitter}, and arguments passed to \code{\link[graphics]{rug}}) \cr \code{density.} \tab see the \code{nrug} argument (\code{density.adjust}, and arguments passed to \code{\link[graphics]{lines}}) \cr \code{grid.} \tab see the \code{grid.col} argument (arguments passed to \code{\link[graphics]{grid}}) \cr \code{caption.} \tab see the \code{caption} argument (arguments passed to \code{\link[graphics]{mtext}}) \cr \code{par.} \tab arguments passed to \code{\link[graphics]{par}} (only necessary if a \code{par} argument name clashes with a \code{plotmo} argument) \cr \code{prednames.} \tab Use \code{prednames.abbreviate=FALSE} for full predictor names in graph axes. \cr } The \code{cex} argument is relative, so specifying \code{cex=1} is the same as not specifying \code{cex}. For backwards compatibility, some dot arguments are supported but not explicitly documented. For example, the old argument \code{col.response} is no longer in \code{plotmo}'s formal argument list, but is still accepted and treated like the new argument \code{pt.col}. } } \note{ In general this function won't work on models that don't save the call and data with the model in a standard way. For further discussion please see \dQuote{\emph{Accessing the model data}} in the \href{../doc/plotmo-notes.pdf}{plotmo vignette}. Package authors may want to look at \href{../doc/modguide.pdf}{Guidelines for S3 Regression Models} (also available \href{http://www.milbo.org/doc/modguide.pdf}{here}). By default, \code{plotmo} tries to use sensible model-dependent defaults when calling \code{predict}. Use \code{trace=1} to see the arguments passed to \code{predict}. You can change the defaults by using \code{plotmo}'s \code{type} argument, and by using dot arguments prefixed with \code{predict.} (see the description of ``\code{...}'' above). } \seealso{ Please see the \href{../doc/plotmo-notes.pdf}{plotmo vignette} (also available \href{http://www.milbo.org/doc/plotmo-notes.pdf}{here}). } \examples{ if (require(rpart)) { data(kyphosis) rpart.model <- rpart(Kyphosis~., data=kyphosis) # pass type="prob" to plotmo's internal calls to predict.rpart, and # select the column named "present" from the matrix returned by predict.rpart plotmo(rpart.model, type="prob", nresponse="present") } if (require(earth)) { data(ozone1) earth.model <- earth(O3 ~ ., data=ozone1, degree=2) plotmo(earth.model) # plotmo(earth.model, pmethod="partdep") # partial dependence plots } } \keyword{partial dependence} \keyword{regression} plotmo/man/plotmo.misc.Rd0000644000176200001440000000614114566103176015105 0ustar liggesusers\name{plotmo.misc} \alias{check.index} \alias{plotmo.convert.na.nresponse} \alias{plotmo.pairs.default} \alias{plotmo.pairs} \alias{plotmo.pint} \alias{plotmo.predict} \alias{plotmo.prolog} \alias{plotmo.residtype} \alias{plotmo.singles.default} \alias{plotmo.singles} \alias{plotmo.type} \alias{plotmo.x} \alias{plotmo.y.default} \alias{plotmo.y} \alias{plotmo_cum} \alias{plotmo_fitted} \alias{plotmo_nresponse} \alias{plotmo_predict} \alias{plotmo_prolog} \alias{plotmo_resplevs} \alias{plotmo_response} \alias{plotmo_rinfo} \alias{plotmo_rsq} \alias{plotmo_standardizescale} \alias{plotmo_type} \alias{plotmo_y} \title{Ignore} \description{ Miscellaneous functions exported for internal use by \code{earth} and other packages. You can ignore these. } \usage{ # for earth plotmo_fitted(object, trace, nresponse, type, ...) plotmo_cum(rinfo, info, nfigs=1, add=FALSE, cum.col1, grid.col, jitter=0, cum.grid="percentages", ...) plotmo_nresponse(y, object, nresponse, trace, fname, type="response") plotmo_rinfo(object, type=NULL, residtype=type, nresponse=1, standardize=FALSE, delever=FALSE, trace=0, leverage.msg="returned as NA", expected.levs=NULL, labels.id=NULL, ...) plotmo_predict(object, newdata, nresponse, type, expected.levs, trace, inverse.func=NULL, ...) plotmo_prolog(object, object.name, trace, ...) plotmo_resplevs(object, plotmo_fitted, yfull, trace) plotmo_rsq(object, newdata, trace=0, nresponse=NA, type=NULL, ...) plotmo_standardizescale(object) plotmo_type(object, trace, fname="plotmo", type, ...) plotmo_y(object, nresponse=NULL, trace=0, expected.len=NULL, resp.levs=NULL, convert.glm.response=!is.null(nresponse)) \method{plotmo.pairs}{default}(object, x, nresponse, trace, all2, ...) \method{plotmo.singles}{default}(object, x, nresponse, trace, all1, ...) \method{plotmo.y}{default}(object, trace, naked, expected.len, ...) # plotmo methods plotmo.convert.na.nresponse(object, nresponse, yhat, type="response", ...) plotmo.pairs(object, x, nresponse, trace, all2, ...) plotmo.pint(object, newdata, type, level, trace, ...) plotmo.predict(object, newdata, type, ..., TRACE) plotmo.prolog(object, object.name, trace, ...) plotmo.residtype(object, ..., TRACE) plotmo.singles(object, x, nresponse, trace, all1, ...) plotmo.type(object, ..., TRACE) plotmo.x(object, trace, ...) plotmo.y(object, trace, naked, expected.len, nresponse=1, ...) } \arguments{ \item{\dots}{-} \item{add}{-} \item{all1}{-} \item{all2}{-} \item{convert.glm.response}{-} \item{cum.col1}{-} \item{cum.grid}{-} \item{delever}{-} \item{expected.len}{-} \item{expected.levs}{-} \item{fname}{-} \item{grid.col}{-} \item{info}{-} \item{inverse.func}{-} \item{jitter}{-} \item{labels.id}{-} \item{level}{-} \item{leverage.msg}{-} \item{naked}{-} \item{newdata}{-} \item{nfigs}{-} \item{nresponse}{-} \item{object.name}{-} \item{object}{-} \item{plotmo_fitted}{-} \item{residtype}{-} \item{resp.levs}{-} \item{rinfo}{-} \item{standardize}{-} \item{TRACE}{-} \item{trace}{-} \item{type}{-} \item{x}{-} \item{yfull}{-} \item{yhat}{-} \item{y}{-} } plotmo/man/plot_glmnet.Rd0000644000176200001440000000636314563612627015176 0ustar liggesusers\name{plot_glmnet} \alias{plot_glmnet} \title{Plot a glmnet model} \description{ Plot the coefficient paths of a \code{\link[glmnet]{glmnet}} model. An enhanced version of \code{\link[glmnet]{plot.glmnet}}. } \usage{ plot_glmnet(x = stop("no 'x' argument"), xvar = c("rlambda", "lambda", "norm", "dev"), label = 10, nresponse = NA, grid.col = NA, s = NA, ...) } \arguments{ \item{x}{ The \code{glmnet} model. } \item{xvar}{ What gets plotted along the x axis. One of:\cr \bold{\code{"rlambda"}} (default) decreasing log lambda (lambda is the glmnet penalty)\cr \bold{\code{"lambda"}} log lambda\cr \bold{\code{"norm"}} L1-norm of the coefficients\cr \bold{\code{"dev"}} percent deviance explained\cr\cr The default \code{xvar} differs from \code{plot.glmnet} to allow \code{s} to be plotted when this function is invoked by \code{\link{plotres}}. } \item{label}{ Default \code{10}. Number of variable names displayed on the right of the plot. One of:\cr \bold{\code{FALSE}} display no variables\cr \bold{\code{TRUE}} display all variables\cr \bold{\code{integer}} (default) number of variables to display (default is 10)\cr } \item{nresponse}{ Which response to plot for multiple response models. } \item{grid.col}{ Default \code{NA}. Color of the optional grid, for example \code{grid.col="lightgray"}. } \item{s}{ For use by \code{\link{plotres}}. The x position of the gray vertical line indicating the lambda \code{s} passed by \code{plotres} to \code{predict.glmnet} to calculate the residuals. Plotres defaults to \code{s=0}. } \item{\dots}{ Dot arguments are passed internally to \code{\link[graphics]{matplot}}. Use \code{col} to change the color of curves; for example \code{col=1:4}. The six default colors are intended to be distinguishable yet harmonious (to my eye at least), with adjacent colors as different as easily possible. } } \note{ \bold{Limitations} For multiple response models use the \code{nresponse} argument to specify which response should be plotted. (Currently each response must be plotted one by one.) The \code{type.coef} argument of \code{\link[glmnet]{plot.glmnet}} is currently not supported. Currently \code{xvar="norm"} is not supported for multiple response models (you will get an error message). \bold{Interaction with \code{plotres}} When invoking this function via \code{\link{plotres}}, prefix any argument of \code{plotres} with \code{w1.} to tell \code{plotres} to pass the argument to this function. For example give \code{w1.col=1:4} to \code{plotres} (plain \code{col=1:4} in this context gets passed to the residual plots). \bold{Acknowledgments} This function is based on \code{\link[glmnet]{plot.glmnet}} in the \code{\link[glmnet]{glmnet}} package authored by Jerome Friedman, Trevor Hastie, and Rob Tibshirani. This function incorporates the function \code{spread.labs} from the orphaned package \code{TeachingDemos} written by Greg Snow. } \seealso{ Chapter 6 in \href{../doc/plotres-notes.pdf}{plotres vignette} discusses this function. } \examples{ if (require(glmnet)) { x <- matrix(rnorm(100 * 10), 100, 10) # n=100 p=10 y <- x[,1] + x[,2] + 2 * rnorm(100) # y depends only on x[,1] and x[,2] mod <- glmnet(x, y) plot_glmnet(mod) # plotres(mod) # plot the residuals } } plotmo/DESCRIPTION0000644000176200001440000000201215130145251013262 0ustar liggesusersPackage: plotmo Version: 3.7.0 Title: Plot a Model's Residuals, Response, and Partial Dependence Plots Authors@R: person(given = "Stephen", family = "Milborrow", role = c("aut", "cre"), email = "milbo@sonic.net") Maintainer: Stephen Milborrow Depends: R (>= 3.4.0), Formula (>= 1.2-3), plotrix Description: Plot model surfaces for a wide variety of models using partial dependence plots and other techniques. Also plot model residuals and other information on the model. Suggests: C50 (>= 0.1.0-24), earth (>= 5.1.2), gbm (>= 2.1.1), glmnet (>= 2.0.5), glmnetUtils (>= 1.0.3), MASS (>= 7.3-51), mlr (>= 2.12.1), neuralnet (>= 1.33), partykit (>= 1.2-2), pre (>= 0.5.0), rpart (>= 4.1-15), rpart.plot (>= 3.0.8) License: GPL-3 URL: http://www.milbo.users.sonic.net NeedsCompilation: no Packaged: 2026-01-04 01:38:29 UTC; milbo Author: Stephen Milborrow [aut, cre] Repository: CRAN Date/Publication: 2026-01-09 09:30:17 UTC