xts/0000755000176200001440000000000014703523232011071 5ustar liggesusersxts/tests/0000755000176200001440000000000014702522224012232 5ustar liggesusersxts/tests/tinytest.R0000644000176200001440000000067214702522224014245 0ustar liggesusers# run package unit tests if (requireNamespace("tinytest", quietly = TRUE)) { suppressPackageStartupMessages(library("xts")) use_color <- as.logical(Sys.getenv("_PKG_TINYTEST_COLOR_", FALSE)) verbosity <- as.integer(Sys.getenv("_PKG_TINYTEST_VERBOSE_", 1)) cat("tinytest colored output:", use_color, "\ntinytest verbosity:", verbosity, "\n") tinytest::test_package("xts", color = use_color, verbose = verbosity) } xts/MD50000644000176200001440000002426214703523232011407 0ustar liggesusers896fa2f025ba7e4bbfd4a5d9bf3b3110 *DESCRIPTION 8d109e152836d68726ca4ad3a9fcd5ee *NAMESPACE bf55c9d4b0ab774609f105bb5373ac72 *NEWS.md 13a4d087d20c9296a93a4e7daf48d8be *R/Date.R 9a9e41ee0a003e798ccabff5e10c3b04 *R/Math.xts.R 111bccff1a4d380bff44b14bdff23fa3 *R/OHLC.R c2ef20cbcbf35a1d1c98d0c50589fe81 *R/Ops.xts.R 187fce032fe9c8b0f2d1617b3a8819e1 *R/POSIX.R d79b3d7e48a62b93c930de0a71b59c69 *R/adj.time.R 5e30116de2ec1a593ed9b21f50f0c58d *R/align.time.R 719a384387f0229a76a1e28883bdfa62 *R/all.equal.R 69e7d41b342c8b5b5831142207f9e77c *R/as.environment.xts.R 3854d55602258e5e5e2f9c4c165edd33 *R/as.numeric.R 85a4d6658ac4ed00d47939447b14c35b *R/axTicksByTime.R 61c4324133b2263fa9e5a95a898df871 *R/bind.R 1a1014c478e9498604867f18a522cf15 *R/coredata.xts.R a62e13734091171a8cc697f8d63fb941 *R/data.frame.R a175decdc727e56ac811c35cb96dcbbe *R/dimnames.R edc446ca16acada8f0015add2151f68b *R/endpoints.R 2f0b31a5bcd2df6ff3ea4baa7a16b77d *R/first.R acdda8c521fe61c300fe9866b500db4f *R/index.R 15cef7a8e3232ea1b8515331ca0285af *R/irts.R 6d3b847230363a674d11959938e1be79 *R/isOrdered.R a55d1464f2877692bffd8dc284052483 *R/lag.xts.R 5b7c1546bcc98af59701cd0a8d210f5b *R/last.R 2b6ac08a19465c8f082b8bda4b543c28 *R/list.R 1b0f3343529429f934b16a714fd1a131 *R/matrix.R 2503ee75bc5ceaeaaba573a8e90058aa *R/merge.R 371654b7ba3f1d48e9c39eea77f4f58f *R/modify.args.R 4d30e9f7f637e4872d0392c0436fb0c4 *R/na.R 365a50fcf07717f387a618fc4edebb7f *R/nperiods.R f7016e97f94c2bfb2c7ce34877e7f4d5 *R/origin.fix.R a33c7b4d2606bfde5b3f260f78a1bb02 *R/parse8601.R f311a96152cc09db7c8e09652e8ee23c *R/period.R ad50f4ef7687e36f7d329ec16a19cbb9 *R/period.apply.R 0832d8b88027394fb093521164aca44c *R/periodicity.R c99642a0afe07d468aebec835db3402a *R/plot.R adb99ee829ce42523e56ce58c6db8036 *R/print.R 587766097ce7edf9ab923b1b0f4a90c3 *R/reclass.R 1517c9051358464b9b0450b4be931c17 *R/rollapply.xts.R 9665fa327a6762098c18cd4c7bfa2c8f *R/split.R 015c507263eb0e0e3382b16f60836bb3 *R/start.R e80dd17312e93580379a96b81b4b5510 *R/startOfYear.R 8ac7f617f8cc6c11f0e974169d8f42c5 *R/str.R 39d15e2bed04e0d6d698597374d556a0 *R/tclass.R 4fefc28a68ff070d4e3aa3f294949002 *R/tformat.R dd86b3fdd667b41841f55544f728e64e *R/timeBasedRange.R 4c5e863153e9dc9a8423a0f7814c1de5 *R/timeBasedSeq.R b2cdfd460e70f9e7e4a810d08cf01a8f *R/timeDate.R 85be96f160431b64f0ef2efe647df272 *R/timeSeries.R fbbd08e88d7a152f313bc679972ecc17 *R/toperiod.R b2c1bbf5daa17fad7960ce6b73cf12a7 *R/ts.R 7d7da34e53c6a87bb4764990ef5238d3 *R/tzone.R d53f58770c0c597019f4f12959e35a54 *R/utils.R 3cb664b4811affcee63d885fdb4719a6 *R/xts-package.R 03dcb034252a8d451a764f7d44f9e8da *R/xts.R 5d9bb181816baae33ef3df318a051f65 *R/xts.methods.R bfcb5771a061dfd6d6c168be0fd4ef66 *R/yearmon.R 6ed20824a80602ace874fbc43b859902 *R/zoo.R ac12dbb14b106eed16be76bba725f338 *R/zzz.R 8610078036551f864b330b180a87e2a4 *README.md 2a51be2906d8327018de52b80df9bbd4 *build/vignette.rds e25f1e32e3b80ef3ff29d103a2c841c9 *data/sample_matrix.rda d273075b03c4d62b61a42ba4217bf49e *inst/api_example/DESCRIPTION 55d4cc70531955e6a4fd244e7d84c6c1 *inst/api_example/NAMESPACE 6497fbcaf2b3a892cb3dd0776a233dc6 *inst/api_example/R/checkOrder.R df23f6d544fca7b695962d1f4421bb99 *inst/api_example/README 09118e96879feba050a17474ceff8a8d *inst/api_example/man/checkOrder.Rd e24ef2161cbc80e1297fe776762ba86d *inst/api_example/man/linkXTS-package.Rd c0648d7cd58a619e37191ce4f80c6e9f *inst/api_example/src/checkOrder.c aaa8de0969962f40c9e2d069e115430c *inst/benchmarks/benchmark.subset.R e45027a27ff403b51af95ea2f1945d95 *inst/doc/xts-faq.R 71177aa2e5c7c8cf3cc3f91b5e635cfe *inst/doc/xts-faq.Rnw ce79634b8ede1e57d4a3799edeab7c30 *inst/doc/xts-faq.pdf 3d81a4a65b40e6b1cd3cec726449d49d *inst/doc/xts.R ff730516ee7c76aaabb6b97bbb326b53 *inst/doc/xts.Rnw e6cb9343ecb1b7604bdfb9695170d975 *inst/doc/xts.pdf d415cb5e7772a846f462beaeaeb4aebf *inst/include/xts.h 086af5ee3a7aca5dfcaac1096ac4246d *inst/include/xtsAPI.h fb8b821627015068f6c24f22e183728a *inst/include/xts_stubs.c ca0456713e0804be8a3c74c37fabd9bd *inst/tinytest/runit.rowSums-rowMeans.R dce145c15320daf4a6b65e76a9fa5e18 *inst/tinytest/test-Ops.R e4406914c419f5e370c6481be56b6bb0 *inst/tinytest/test-align.time.R cb990770472c5bd58bea7ef19624d0d6 *inst/tinytest/test-all.equal.R 9a23ca91be43cb533e70b3ee7125d338 *inst/tinytest/test-binsearch.R 33e1cab561e827bcfc9c7d7668bac885 *inst/tinytest/test-coredata.R 84b4bb6b7855a074d3233a239abc6fc3 *inst/tinytest/test-data.frame.R 5867588c1558b0940d1906fc9ff20097 *inst/tinytest/test-diff.R ddade7a38f6c21542bdfd50ea2e26915 *inst/tinytest/test-dimnames.R 48a0394f33c87625f436c3af133c07ae *inst/tinytest/test-endpoints.R e8eb1428568d8bb2ae6e8b37ffb4ed92 *inst/tinytest/test-first-last.R 53d7177c598db078cb35dd52bbed43fb *inst/tinytest/test-index.R ef46414a4700a955d3b6dd23ef044245 *inst/tinytest/test-irts.R d1ea8d93f0a9f8ed68d6065262b81f22 *inst/tinytest/test-isordered.R cf9bfd641615dcb427934adf47859b43 *inst/tinytest/test-lag.R c95214b252e3204228dd12776b1f8a2c *inst/tinytest/test-matrix.R 5319df2f5cc00d328d464f58e27e4bbd *inst/tinytest/test-merge.R 6d05dc15e012ad76ca468fc08b65c65d *inst/tinytest/test-na.fill.R c34cbb79cf898c3e4e18cdb993824bd5 *inst/tinytest/test-na.locf.R 57ce6a9082199275ff24c3ab15df05d7 *inst/tinytest/test-na.omit.R 189e95e4940e6ea9fe9464e55f98923b *inst/tinytest/test-parseISO8601.R ba463b3d1841f34648b1f8e33a91974b *inst/tinytest/test-period.apply.R 939ea7f949fdeae74619591faea3f1f2 *inst/tinytest/test-periodicity.R 70a787661c83533b3f915c36a6e44be4 *inst/tinytest/test-plot.R 082f8b19f7b4e1ce38ca455a1b1d4e05 *inst/tinytest/test-print.R f1a83dc9f2eaeee878bd7138b2759088 *inst/tinytest/test-reclass.R b6b66b3cfa0727eaf1def392611bd5d5 *inst/tinytest/test-split.R 270a4ad5c57f259f69244a2f90e40bee *inst/tinytest/test-subset-time-of-day.R 8d7543cb5014325353472f6fdbe4ff2e *inst/tinytest/test-subset.R 917eed127e060a2028d5c653da03f0a2 *inst/tinytest/test-tclass.R 2406e4f31af0d8b18720b19e33a356a9 *inst/tinytest/test-tformat.R 0b700524e0885b162f0536f8c892df63 *inst/tinytest/test-timeBasedSeq.R db8f51cd33ed4db2c324a95704e5316d *inst/tinytest/test-timeSeries.R 5ef6c25f551d5b7dee43d2ec7182bce7 *inst/tinytest/test-to.period.R 0ef61cea7a0d5818d57a84be6557d253 *inst/tinytest/test-ts.R 71a0014e95a45208e500ae88ccdd2809 *inst/tinytest/test-tzone.R 866a2d8b6ec3fa41316727f3366597d1 *inst/tinytest/test-xts.R 3f2a81d0c93d39369ad40fde049b5c57 *inst/tinytest/test-xts.methods.R c55d666140103d930dcd40754a28dd3c *inst/tinytest/test-zoo.R 0fca212ba456c3993191f3b18cd41b4a *man/CLASS.Rd 9bd5f4a6241f497f60a2a8e07e9eaa48 *man/addEventLines.Rd 7c16ff70f9e563555085a6447517fc4d *man/addLegend.Rd a2a5d513493e88e4db004ab9860e5188 *man/addPanel.Rd 15e5bfc37bba693bcdf55416cf37d8b9 *man/addPolygon.Rd 4554dd68ce6833f01b23a5d4c4aec4b5 *man/addSeries.Rd 211b22b5c985f96dc7248b2a20ed654c *man/align.time.Rd 9f1e893b1c0d1a43ffce5236ce725359 *man/apply.monthly.Rd 754a2b311c832d96a4519e261f51bc47 *man/as.environment.xts.Rd ec5ca7a5f1fe83bee2e5219c7a9f251e *man/as.xts.Rd 01cd14a3e920251beb58aa9876ab21bb *man/axTicksByTime.Rd aaf5dd3389385a04c16a1698208b17a8 *man/coredata.xts.Rd 8a803fcd5b39753706b655e43db0defd *man/diff.xts.Rd f260f3946100bbed3ee52ec37fdbeed1 *man/dimnames.xts.Rd a1b3867b33361972d4927d1dff0d5f1e *man/endpoints.Rd a1260ca32c2ec63d4eda7044284f4fbb *man/first.Rd 9001160596bf7fb42b2954de8d1ac4e4 *man/firstof.Rd c013c792539377623137797077ce516f *man/index.xts.Rd ca4105116cc570760f1332167078b495 *man/isOrdered.Rd 3d7690ea93f681bde0b44de136388227 *man/make.index.unique.Rd 96f15c80498132cebadd903eb041fb9d *man/merge.xts.Rd b9efca06212de054c15037af26f31e57 *man/na.locf.xts.Rd cacfffc5e4946902fc0e3659f415844b *man/ndays.Rd 4fc896dab44c718a075e897a4df3280d *man/parseISO8601.Rd 58288fa74051abebbb9f20d946727f65 *man/period.apply.Rd 7201acae67a0cefc4b613f65ead0ed10 *man/period_math.Rd 71875c7f7b461b1b28a9272de416bcd4 *man/periodicity.Rd dceb0782ff76a34641720c2a2d6182fc *man/plot.xts.Rd becbb33ddcbc405d82ce9a1d8a3ed838 *man/print.xts.Rd f8298a87d8208fbc2f405affc28d80e6 *man/rbind.xts.Rd e4e1421d9f034eb2253b5d54e30ff653 *man/reclass.Rd 03bfabb3754364845f6b6d262d5fbd83 *man/sample.data.Rd 11a2562aa4804cce38362f5fd77ca7e3 *man/split.xts.Rd 7bc9167cd9971127480369f517be7ccd *man/subset.xts.Rd f551c16ce8192173d38359c689f6f5e0 *man/tclass.Rd 5e5a59e254e1c7a4656f92cb6b793d33 *man/tformat.Rd 5b158dfbd2d354c73eb8f623983c7d16 *man/timeBased.Rd 20bcba1ebebadffa3d7b34b1ed59b87b *man/timeBasedSeq.Rd 626c294bd8cf5bf889e0438f4862b838 *man/to.period.Rd 14868cc17a2908eacc75935aedfd8213 *man/tzone.Rd 2bfdc0f8e2ebb0b54d17d01bce764000 *man/window.xts.Rd 2929e244a621384bbc08a79fe3b11621 *man/xts-internals.Rd bd9168fb6aee9477153d3954ac8f007d *man/xts-package.Rd cd8ba60d194ecedf2d8c862f27dbcd3e *man/xts.Rd afc7f16f7f8aac67c7e2067d41fcba2d *man/xtsAPI.Rd 6f32697828e85b03121a85f26c04bb3e *man/xtsAttributes.Rd 3f03da795dd26373156bddc78d41e95d *src/Makevars 3f03da795dd26373156bddc78d41e95d *src/Makevars.win 6b0374aa67a0cb5dd38f879e708132b4 *src/add_class.c f485a4c5521e77204579b020f825bccc *src/any.c 352b7b0f1c8c49702baf9945fd20ff5f *src/attr.c d1eb6437796db5e54605264b1f3548cc *src/binsearch.c c91fe2075d20c8cf572452b7a69d4f5c *src/coredata.c c9aa1258d5793b5bde6e98974b9700b1 *src/dimnames.c 4d148e934a4f7b8c13d06f356f79e246 *src/endpoints.c 56be552537e6dfb9e4cd32adf66d2522 *src/extract_col.c f76f72c7348fe190d1b22376df918d9a *src/init.c 5a1131c5c4cda826587411b399762e94 *src/isOrdered.c 6406378662cae4ddb780b572e3c207f5 *src/isXts.c 76eef6c210f46da6f0f43f388096b1a7 *src/lag.c b1c669347285967a1dd0b282ef0ed09c *src/merge.c 100daa62d01821334ed99b3d5a0667b2 *src/na.c da1b6df2c0b5b64c331335cf525dc143 *src/period_apply.c 98c3542c73b9d2e3bcb0874c93c199c8 *src/period_arithmetic.c 9d155812d858824aed442e88555e4e27 *src/period_quantile.c 1d7cd5483505427cfd2e6776e14d571f *src/rbind.c 7a60c01780f630c072175e7134ef08d9 *src/rollfun.c b6339594a3cf5d8dde13a6f9f771187c *src/runSum.c e0c8a91a3f89dc44f3d3033a3c7c8335 *src/startofyear.c 8b82aa3c1336652137236dfbdce1123c *src/subset.c 215a490e1edcdbf627eea9fe03f5359b *src/subset.old.c 0139eb8441e8dffcfc001dc33b1986e4 *src/toperiod.c 8b6df2194602bcec234c8840a3121e3e *src/totalcols.c 4c2811f9dd0f501b9105838cd78c2652 *src/tryXts.c ddcf2148cb8071a63182c5721e80b404 *src/unique.time.c 74a087b663e6fb7a2eaec9ec333120b6 *src/xts.c 72514cfd44456eea7b95ba4701c92887 *tests/tinytest.R 71177aa2e5c7c8cf3cc3f91b5e635cfe *vignettes/xts-faq.Rnw ff730516ee7c76aaabb6b97bbb326b53 *vignettes/xts.Rnw xts/R/0000755000176200001440000000000014703504524011275 5ustar liggesusersxts/R/tzone.R0000644000176200001440000001542214702273721012564 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' @rdname tzone indexTZ <- function(x, ...) { .Deprecated("tzone", "xts") tzone(x, ...) } #' Get or Replace the Timezone of an xts Object's Index #' #' Generic functions to get or replace the timezone of an xts object's index. #' #' Internally, an xts object's index is a *numeric* value corresponding to #' seconds since the epoch in the UTC timezone. When an xts object is created, #' all time index values are converted internally to [`POSIXct()`] #' (which is also in seconds since the UNIX epoch), using the underlying OS #' conventions and the \env{TZ} environment variable. The `xts()` function #' manages timezone information as transparently as possible. #' #' The `tzone<-` function *does not* change the internal index values #' (i.e. the index will remain the same time in the UTC timezone). #' #' @param x An xts object. #' @param value A valid timezone value (see [`OlsonNames()`]). #' @param \dots Arguments passed to other methods. #' #' @return A one element named vector containing the timezone of the object's #' index. #' #' @note Both `indexTZ()` and `indexTZ<-` are deprecated in favor of #' `tzone()` and `tzone<-`, respectively. #' #' Problems may arise when an object that had been created under one timezone #' are used in a session using another timezone. This isn't usually a issue, #' but when it is a warning is given upon printing or subsetting. This warning #' may be suppressed by setting `options(xts_check_TZ = FALSE)`. #' #' @author Jeffrey A. Ryan #' #' @seealso [`index()`][xts::index.xts] has more information on the xts index, [`tformat()`] #' describes how the index values are formatted when printed, and [`tclass()`] #' provides details how \pkg{xts} handles the class of the index. #' #' @keywords ts utilities #' @examples #' #' # Date indexes always have a "UTC" timezone #' x <- xts(1, Sys.Date()) #' tzone(x) #' str(x) #' print(x) #' #' # The default 'tzone' is blank -- your machine's local timezone, #' # determined by the 'TZ' environment variable. #' x <- xts(1, Sys.time()) #' tzone(x) #' str(x) #' #' # now set 'tzone' to different values #' tzone(x) <- "UTC" #' str(x) #' #' tzone(x) <- "America/Chicago" #' str(x) #' #' y <- timeBasedSeq('2010-01-01/2010-01-03 12:00/H') #' y <- xts(seq_along(y), y, tzone = "America/New_York") #' #' # Changing the tzone does not change the internal index values, but it #' # does change how the index is printed! #' head(y) #' head(.index(y)) #' tzone(y) <- "Europe/London" #' head(y) # the index prints with hours, but #' head(.index(y)) # the internal index is not changed! #' tzone <- function(x, ...) { UseMethod("tzone") } #' @rdname tzone `indexTZ<-` <- function(x, value) { .Deprecated("tzone<-", "xts") `tzone<-`(x, value) } #' @rdname tzone `tzone<-` <- function(x, value) { UseMethod("tzone<-") } `tzone<-.xts` <- function(x, value) { if (is.null(value)) { value <- "" } tzone <- as.character(value) attr(attr(x, "index"), "tzone") <- tzone # Remove tz attrs (object created before 0.10-3) attr(x, ".indexTZ") <- NULL attr(x, "tzone") <- NULL x } tzone.default <- function(x, ...) { attr(x, "tzone") } `tzone<-.default` <- function(x, value) { if (!is.null(value)) { value <- as.character(value) } attr(x, "tzone") <- value x } tzone.xts <- function(x, ...) { tzone <- attr(attr(x, "index"), "tzone") # For xts objects created pre-0.10.3 if (is.null(tzone)) { # no tzone on the index sq_tzone <- sQuote("tzone") sq_both <- paste(sq_tzone, "or", sQuote(".indexTZ")) warn_msg <- paste0("index does not have a ", sq_tzone, " attribute") tzone <- attr(x, "tzone") if (is.null(tzone)) { # no tzone on the xts object, look for .indexTZ tzone <- attr(x, ".indexTZ") } if (is.null(tzone)) { # no .indexTZ on the xts object tzone <- "" warn_msg <- paste0(warn_msg, "\n and xts object does not have a ", sq_both, " attribute\n", " returning ", dQuote(tzone)) warning(warn_msg) return(tzone) } sym <- deparse(substitute(x)) warning(warn_msg, "\n use ", sym, " <- xts:::.update_index_attributes(", sym, ") to update the object") } return(tzone) } isClassWithoutTZ <- function(tclass, object = NULL) { .classesWithoutTZ <- c("chron","dates","times","Date","yearmon","yearqtr") has_no_tz <- FALSE if (is.null(object)) { has_no_tz <- any(tclass %in% .classesWithoutTZ) } else { has_no_tz <- inherits(object, .classesWithoutTZ) } return(has_no_tz) } isUTC <- function(tz = NULL) { if (is.null(tz)) { tz <- Sys.timezone() } switch(tz, "UTC" = , "GMT" = , "Etc/UTC" = , "Etc/GMT" = , "GMT-0" = , "GMT+0" = , "GMT0" = TRUE, FALSE) } check.TZ <- function(x, ...) { check <- getOption("xts_check_TZ") if (!is.null(check) && !check) { return() } x_tz <- tzone(x) x_tclass <- tclass(x) if (isClassWithoutTZ(x_tclass)) { # warn if tzone is not UTC or GMT (GMT is not technically correct, since # it *is* a timezone, but it should work for all practical purposes) if (!isUTC(x_tz)) { warning(paste0("object index class (", paste(x_tclass, collapse = ", "), ") does not support timezones.\nExpected 'UTC' timezone, but tzone is ", sQuote(x_tz)), call. = FALSE) } else { return() } } x_tz_str <- as.character(x_tz) sys_tz <- Sys.getenv("TZ") if (!is.null(x_tz) && x_tz_str != "" && !identical(sys_tz, x_tz_str)) { msg <- paste0("object timezone ('", x_tz, "') is different ", "from system timezone ('", sys_tz, "')") if (is.null(check)) { # xts_check_TZ is NULL by default # set to TRUE after messaging user how to disable the warning msg <- paste0(msg, "\n NOTE: set 'options(xts_check_TZ = FALSE)' ", "to disable this warning\n", " This note is displayed once per session") options(xts_check_TZ = TRUE) } warning(msg, call. = FALSE) } } xts/R/OHLC.R0000644000176200001440000000724714654242576012172 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # functions from quantmod to check for OHLC style/columns # NOT TO BE EXPORTED # `OHLCV` <- function (x) { if (is.OHLCV(x)) return(x[, has.OHLCV(x, 1)]) NULL } `is.OHLCV` <- function(x) { all(has.Op(x),has.Hi(x),has.Lo(x),has.Cl(x),has.Vo(x)) } `has.OHLCV` <- function(x,which=FALSE) { if(which) { c(has.Op(x,1),has.Hi(x,1),has.Lo(x,1),has.Cl(x,1),has.Vo(x,1)) } else { c(has.Op(x),has.Hi(x),has.Lo(x),has.Cl(x),has.Vo(x)) } } `OHLC` <- function (x) { if (is.OHLC(x)) return(x[, has.OHLC(x, 1)]) NULL } `is.OHLC` <- function(x) { all(has.Op(x),has.Hi(x),has.Lo(x),has.Cl(x)) } `has.OHLC` <- function(x,which=FALSE) { if(which) { c(has.Op(x,1),has.Hi(x,1),has.Lo(x,1),has.Cl(x,1)) } else { c(has.Op(x),has.Hi(x),has.Lo(x),has.Cl(x)) } } `HLC` <- function (x) { if (is.HLC(x)) return(x[, has.HLC(x, 1)]) NULL } `is.HLC` <- function(x) { all(has.Hi(x),has.Lo(x),has.Cl(x)) } `has.HLC` <- function(x,which=FALSE) { if(which) { c(has.Hi(x,1),has.Lo(x,1),has.Cl(x,1)) } else { c(has.Hi(x),has.Lo(x),has.Cl(x)) } } `Op` <- function(x) { if(has.Op(x)) return(x[,grep('Open',colnames(x),ignore.case=TRUE)]) NULL } `has.Op` <- function(x,which=FALSE) { loc <- grep('Open',colnames(x),ignore.case=TRUE) if(!identical(loc,integer(0))) return(ifelse(which,loc,TRUE)) ifelse(which,loc,FALSE) } `Hi` <- function(x) { if(has.Hi(x)) return(x[,grep('High',colnames(x),ignore.case=TRUE)]) NULL } `has.Hi` <- function(x,which=FALSE) { loc <- grep('High',colnames(x),ignore.case=TRUE) if(!identical(loc,integer(0))) return(ifelse(which,loc,TRUE)) ifelse(which,loc,FALSE) } `Lo` <- function(x) { if(has.Lo(x)) return(x[,grep('Low',colnames(x),ignore.case=TRUE)]) NULL } `has.Lo` <- function(x,which=FALSE) { loc <- grep('Low',colnames(x),ignore.case=TRUE) if(!identical(loc,integer(0))) return(ifelse(which,loc,TRUE)) ifelse(which,loc,FALSE) } `Cl` <- function(x) { if(has.Cl(x)) return(x[,grep('Close',colnames(x),ignore.case=TRUE)]) NULL } `has.Cl` <- function(x,which=FALSE) { loc <- grep('Close',colnames(x),ignore.case=TRUE) if(!identical(loc,integer(0))) return(ifelse(which,loc,TRUE)) ifelse(which,loc,FALSE) } `Vo` <- function(x) { #vo <- grep('Volume',colnames(x)) #if(!identical(vo,integer(0))) if(has.Vo(x)) return(x[,grep('Volume',colnames(x),ignore.case=TRUE)]) NULL } `has.Vo` <- function(x,which=FALSE) { loc <- grep('Volume',colnames(x),ignore.case=TRUE) if(!identical(loc,integer(0))) return(ifelse(which,loc,TRUE)) ifelse(which,loc,FALSE) } `Ad` <- function(x) { if(has.Ad(x)) return(x[,grep('Adjusted',colnames(x),ignore.case=TRUE)]) NULL } `has.Ad` <- function(x,which=FALSE) { loc <- grep('Adjusted',colnames(x),ignore.case=TRUE) if(!identical(loc,integer(0))) return(ifelse(which,loc,TRUE)) ifelse(which,loc,FALSE) } xts/R/plot.R0000644000176200001440000017210514702260001012370 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2009-2015 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Ross Bennett and Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . current.xts_chob <- function() invisible(get(".xts_chob",.plotxtsEnv)) # Current design # # There is a main plot object that contains the plot title (and optional # timespan), the x-axis labels and tick marks, and a list of 'panel' objects. # The main plot object contains the objects/functions below. # # * Env: an environment holds all the plot information. # * add_main_header(): add the main plot header # * add_main_xaxis(): add the x-axis labels and ticks to the main plot. # * new_panel(): create a new panel and add it to the plot. # * get_xcoords(): get the x-coordinate values for the plot. # * get_panel(): get a specific panel. # * get_last_action_panel(): get the panel that had the last rendered action. # * new_environment: create a new environment with 'Env' as its parent. # Functions that aren't intended to be called externally: # # * update_panels(): re-calculate the x-axis and y-axis values. # * render_panels(): render all the plot panels. # * x_grid_lines(): plot the x-axis grid lines. # * create_ylim(): create y-axis max/min, handling when max(x) == min(x). # The panel object is composed of the following fields: # # * id: the numeric index of the panel in the plot's list of panels. # * asp: the x/y aspect ratio for the panel (relative vertical size). # * ylim: the ylim of the panel when it was created. # * ylim_render: the ylim of the panel to use when rendering. # * use_fixed_ylim: do not update the panel ylim based on all panels data # * header: the panel title. # * actions: a list of expressions used to render the panel. # * add_action(): a function to add an action to the list. # # The panel has the 'yaxis_expr' expression for rendering the y-axis min/max # values, labels, and grid lines/ticks. It also contains the x-axis grid # expression because we need the y-axis min/max values to know where to draw # the x-axis grid lines on the panel. # Other notes # # Environments created by new_environment() (e.g. the 'lenv') are children of # Env, so expressions evaluated in 'lenv' will look in Env for anything not # found in 'lenv'. # # Visual representation of plot structure # # ____________________________________________________________________________ # / \ # | plot object / window | # | | # | ______________________________________________________________________ | # | / \ | # | | panel #1 | | # | | __________________________________________________________________ | | # | | / \ | | # | | | header frame | | | # | | \__________________________________________________________________/ | | # | | __________________________________________________________________ | | # | | / \ | | # | | | series frame | | | # | | | | | | # | | | | | | # | | | | | | # | | | | | | # | | | | | | # | | | | | | # | | | | | | # | | | | | | # | | | | | | # | | | | | | # | | | | | | # | | | | | | # | | | | | | # | | | | | | # | | | | | | # | | \__________________________________________________________________/ | | # | \______________________________________________________________________/ | # | | # | ______________________________________________________________________ | # | / \ | # | | panel #2 | | # | | __________________________________________________________________ | | # | | / \ | | # | | | header frame | | | # | | \__________________________________________________________________/ | | # | | __________________________________________________________________ | | # | | / \ | | # | | | series frame | | | # | | | | | | # | | | | | | # | | | | | | # | | | | | | # | | \__________________________________________________________________/ | | # | \______________________________________________________________________/ | # | | # \____________________________________________________________________________/ # # Currently not necessary, but potentially very useful: # http://www.fromthebottomoftheheap.net/2011/07/23/passing-non-graphical-parameters-to-graphical-functions-using/ chart.lines <- function(x, type="l", lty=1, lwd=2, lend=1, col=NULL, up.col=NULL, dn.col=NULL, legend.loc=NULL, log=FALSE, ...){ xx <- current.xts_chob() switch(type, h={ # use up.col and dn.col if specified if (!is.null(up.col) && !is.null(dn.col)){ colors <- ifelse(x[,1] < 0, dn.col, up.col) } else { colors <- if (is.null(col)) 1 else col } if (length(colors) < nrow(x[,1])) colors <- colors[1] # x-coordinates for this column xcoords <- xx$get_xcoords(x[,1]) lines(xcoords,x[,1],lwd=2,col=colors,lend=lend,lty=1,type="h",...) }, p=, l=, b=, c=, o=, s=, S=, n={ if(is.null(col)) col <- xx$Env$theme$col # ensure pars have ncol(x) elements lty <- rep(lty, length.out = NCOL(x)) lwd <- rep(lwd, length.out = NCOL(x)) col <- rep(col, length.out = NCOL(x)) for(i in NCOL(x):1) { # x-coordinates for this column xcoords <- xx$get_xcoords(x[,i]) xi <- x[,i] if (isTRUE(log)) xi <- log(xi) lines(xcoords, xi, type=type, lend=lend, col=col[i], lty=lty[i], lwd=lwd[i], ...) } }, { # default case warning(paste(type, "not recognized. Type must be one of 'p', 'l', 'b, 'c', 'o', 'h', 's', 'S', 'n'. plot.xts supports the same types as plot.default, see ?plot for valid arguments for type")) } ) if(!is.null(legend.loc)){ lc <- legend.coords(legend.loc, xx$Env$xlim, range(x, na.rm=TRUE)) legend(x=lc$x, y=lc$y, legend=colnames(x), xjust=lc$xjust, yjust=lc$yjust, fill=col[1:NCOL(x)], bty="n") } } add.par.from.dots <- function(call., ...) { stopifnot(is.call(call.)) # from graphics:::.Pars parnames <- c("xlog","ylog","adj","ann","ask","bg","bty","cex","cex.axis", "cex.lab","cex.main","cex.sub","cin","col","col.axis","col.lab", "col.main","col.sub","cra","crt","csi","cxy","din","err", "family", "fg","fig","fin","font","font.axis","font.lab", "font.main","font.sub","lab","las","lend","lheight","ljoin", "lmitre","lty","lwd","mai","mar","mex","mfcol","mfg","mfrow", "mgp","mkh","new","oma","omd","omi","page","pch","pin","plt", "ps","pty","smo","srt","tck","tcl","usr","xaxp","xaxs","xaxt", "xpd","yaxp","yaxs","yaxt","ylbias") dots <- list(...) argnames <- names(dots) pm <- match(argnames, parnames, nomatch = 0L) call.list <- as.list(call.) # only pass the args from dots ('...') that are in parnames as.call(c(call.list, dots[pm > 0L])) } isNullOrFalse <- function(x) { is.null(x) || identical(x, FALSE) } # Main plot.xts method. # author: Ross Bennett (adapted from Jeffrey Ryan's chart_Series) #' Plotting xts Objects #' #' Plotting for xts objects. #' #' Possible values for arguments `major.ticks`, `minor.ticks`, and #' `grid.ticks.on` include \sQuote{auto}, \sQuote{minute}, \sQuote{hours}, #' \sQuote{days}, \sQuote{weeks}, \sQuote{months}, \sQuote{quarters}, and #' \sQuote{years}. The default is \sQuote{auto}, which attempts to determine #' sensible locations from the periodicity and locations of observations. The #' other values are based on the possible values for the `ticks.on` #' argument of [`axTicksByTime()`]. #' #' @param x A xts object. #' @param y Not used, always `NULL`. #' @param \dots Any passthrough arguments for `lines()` and `points()`. #' @param subset An ISO8601-style subset string. #' @param panels Character vector of expressions to plot as panels. #' @param multi.panel Either `TRUE`, `FALSE`, or an integer less than or equal #' to the number of columns in the data set. When `TRUE`, each column of the #' data is plotted in a separate panel. When an integer 'n', the data will be #' plotted in groups of 'n' columns per panel and each group will be plotted #' in a separate panel. #' @param col Color palette to use. #' @param up.col Color for positive bars when `type = "h"`. #' @param dn.col Color for negative bars when `type = "h"`. #' @param bg Background color of plotting area, same as in [`par()`]. #' @param type The type of plot to be drawn, same as in [`plot()`]. #' @param lty Set the line type, same as in [`par()`]. #' @param lwd Set the line width, same as in [`par()`]. #' @param lend Set the line end style, same as in [`par()`]. #' @param main Main plot title. #' @param main.timespan Should the timespan of the series be shown in the top #' right corner of the plot? #' @param observation.based When `TRUE`, all the observations are equally spaced #' along the x-axis. When `FALSE` (the default) the observations on the x-axis #' are spaced based on the time index of the data. #' @param log Should the y-axis be in log scale? Default `FALSE`. #' @param ylim The range of the y axis. #' @param yaxis.same Should 'ylim' be the same for every panel? Default `TRUE`. #' @param yaxis.left Add y-axis labels to the left side of the plot? #' @param yaxis.right Add y-axis labels to the right side of the plot? #' @param yaxis.ticks Desired number of y-axis grid lines. The actual number of #' grid lines is determined by the `n` argument to [`pretty()`]. #' @param major.ticks Period specifying locations for major tick marks and labels #' on the x-axis. See Details for possible values. #' @param minor.ticks Period specifying locations for minor tick marks on the #' x-axis. When `NULL`, minor ticks are not drawn. See details for possible #' values. #' @param grid.ticks.on Period specifying locations for vertical grid lines. #' See details for possible values. #' @param grid.ticks.lwd Line width of the grid. #' @param grid.ticks.lty Line type of the grid. #' @param grid.col Color of the grid. #' @param labels.col Color of the axis labels. #' @param format.labels Label format to draw lower frequency x-axis ticks and #' labels passed to [`axTicksByTime()`] #' @param grid2 Color for secondary x-axis grid. #' @param legend.loc Places a legend into one of nine locations on the chart: #' bottomright, bottom, bottomleft, left, topleft, top, topright, right, or #' center. Default `NULL` does not draw a legend. #' @param on Panel number to draw on. A new panel will be drawn if `on = NA`. #' The default, `on = 0`, will add to the active panel. The active panel is #' defined as the panel on which the most recent action was performed. Note #' that only the first element of `on` is checked for the default behavior to #' add to the last active panel. #' @param extend.xaxis When `TRUE`, extend the x-axis before and/or after the #' plot's existing time index range, so all of of the time index values of #' the new series are included in the plot. Default `FALSE`. #' #' @author Ross Bennett #' #' @seealso [`addSeries()`], [`addPanel()`] #' #' @references based on [`chart_Series()`][quantmod::quantmod] in \pkg{quantmod} #' written by Jeffrey A. Ryan #' #' @examples #' #' \dontrun{ #' data(sample_matrix) #' sample.xts <- as.xts(sample_matrix) #' #' # plot the Close #' plot(sample.xts[,"Close"]) #' #' # plot a subset of the data #' plot(sample.xts[,"Close"], subset = "2007-04-01/2007-06-31") #' #' # function to compute simple returns #' simple.ret <- function(x, col.name){ #' x[,col.name] / lag(x[,col.name]) - 1 #' } #' #' # plot the close and add a panel with the simple returns #' plot(sample.xts[,"Close"]) #' R <- simple.ret(sample.xts, "Close") #' lines(R, type = "h", on = NA) #' #' # add the 50 period simple moving average to panel 1 of the plot #' library(TTR) #' lines(SMA(sample.xts[,"Close"], n = 50), on = 1, col = "blue") #' #' # add month end points to the chart #' points(sample.xts[endpoints(sample.xts[,"Close"], on = "months"), "Close"], #' col = "red", pch = 17, on = 1) #' #' # add legend to panel 1 #' addLegend("topright", on = 1, #' legend.names = c("Close", "SMA(50)"), #' lty = c(1, 1), lwd = c(2, 1), #' col = c("black", "blue", "red")) #' } #' plot.xts <- function(x, y=NULL, ..., subset="", panels=NULL, multi.panel=FALSE, col=1:8, up.col=NULL, dn.col=NULL, bg="#FFFFFF", type="l", lty=1, lwd=2, lend=1, main=deparse(substitute(x)), main.timespan=TRUE, observation.based=FALSE, log=FALSE, ylim=NULL, yaxis.same=TRUE, yaxis.left=TRUE, yaxis.right=TRUE, yaxis.ticks=5, major.ticks="auto", minor.ticks=NULL, grid.ticks.on="auto", grid.ticks.lwd=1, grid.ticks.lty=1, grid.col="darkgray", labels.col="#333333", format.labels=TRUE, grid2="#F5F5F5", legend.loc=NULL, extend.xaxis=FALSE){ # check for colorset or col argument if(hasArg("colorset")) { col <- eval.parent(plot.call$colorset) } # ensure pars have ncol(x) elements col <- rep(col, length.out = NCOL(x)) lty <- rep(lty, length.out = NCOL(x)) lwd <- rep(lwd, length.out = NCOL(x)) # Small multiples with multiple pages behavior occurs when multi.panel is # an integer. (i.e. multi.panel=2 means to iterate over the data in a step # size of 2 and plot 2 panels on each page # Make recursive calls and return if(is.numeric(multi.panel)){ multi.panel <- min(NCOL(x), multi.panel) idx <- seq.int(1L, NCOL(x), 1L) chunks <- split(idx, ceiling(seq_along(idx)/multi.panel)) if(!is.null(panels) && nchar(panels) > 0){ # we will plot the panels, but not plot the data by column multi.panel <- FALSE } else { # we will plot the data by column, but not the panels multi.panel <- TRUE panels <- NULL # set the ylim based on the data passed into the x argument if(yaxis.same) ylim <- range(x[subset], na.rm=TRUE) } for(i in 1:length(chunks)){ tmp <- chunks[[i]] p <- plot.xts(x=x[,tmp], y=y, ...=..., subset=subset, panels=panels, multi.panel=multi.panel, col=col[tmp], up.col=up.col, dn.col=dn.col, bg=bg, type=type, lty=lty[tmp], lwd=lwd[tmp], lend=lend, main=main, observation.based=observation.based, log=log, ylim=ylim, yaxis.same=yaxis.same, yaxis.left=yaxis.left, yaxis.right=yaxis.right, yaxis.ticks=yaxis.ticks, major.ticks=major.ticks, minor.ticks=minor.ticks, grid.ticks.on=grid.ticks.on, grid.ticks.lwd=grid.ticks.lwd, grid.ticks.lty=grid.ticks.lty, grid.col=grid.col, labels.col=labels.col, format.labels=format.labels, grid2=grid2, legend.loc=legend.loc, extend.xaxis=extend.xaxis) if(i < length(chunks)) print(p) } # NOTE: return here so we don't draw another chart return(p) } cs <- new.replot_xts() # major.ticks shouldn't be null so we'll set major.ticks here if it is null if(is.null(major.ticks)) { xs <- x[subset] mt <- c(years=nyears(xs), months=nmonths(xs), days=ndays(xs)) major.ticks <- names(mt)[rev(which(mt < 30))[1]] } # add theme and charting parameters to Env plot.call <- match.call(expand.dots=TRUE) cs$Env$theme <- list(up.col = up.col, dn.col = dn.col, col = col, rylab = yaxis.right, lylab = yaxis.left, bg = bg, grid = grid.col, grid2 = grid2, labels = labels.col, # String rotation in degrees. See comment about 'crt'. Only supported by text() srt = if (hasArg("srt")) eval.parent(plot.call$srt) else 0, # Rotation of axis labels: # 0: parallel to the axis (default), # 1: horizontal, # 2: perpendicular to the axis, # 3: vertical las = if (hasArg("las")) eval.parent(plot.call$las) else 0, # magnification for axis annotation relative to current 'cex' value cex.axis = if (hasArg("cex.axis")) eval.parent(plot.call$cex.axis) else 0.9) # /theme # multiplier to magnify plotting text and symbols cs$Env$cex <- if (hasArg("cex")) eval.parent(plot.call$cex) else 0.6 # lines of margin to the 4 sides of the plot: c(bottom, left, top, right) cs$Env$mar <- if (hasArg("mar")) eval.parent(plot.call$mar) else c(3,2,0,2) cs$Env$format.labels <- format.labels cs$Env$yaxis.ticks <- yaxis.ticks cs$Env$major.ticks <- if (isTRUE(major.ticks)) "auto" else major.ticks cs$Env$minor.ticks <- if (isTRUE(minor.ticks)) "auto" else minor.ticks cs$Env$grid.ticks.on <- if (isTRUE(grid.ticks.on)) "auto" else grid.ticks.on cs$Env$grid.ticks.lwd <- grid.ticks.lwd cs$Env$grid.ticks.lty <- grid.ticks.lty cs$Env$type <- type cs$Env$lty <- lty cs$Env$lwd <- lwd cs$Env$lend <- lend cs$Env$legend.loc <- legend.loc cs$Env$extend.xaxis <- extend.xaxis cs$Env$observation.based <- observation.based cs$Env$log <- isTRUE(log) # Do some checks on x if(is.character(x)) stop("'x' must be a time-series object") # Raw returns data passed into function cs$Env$xdata <- x cs$Env$xsubset <- subset cs$Env$column_names <- colnames(x) cs$Env$nobs <- NROW(cs$Env$xdata) cs$Env$main <- main cs$Env$main.timespan <- main.timespan cs$Env$ylab <- if (hasArg("ylab")) eval.parent(plot.call$ylab) else "" xdata_ylim <- cs$create_ylim(cs$Env$xdata[subset,]) if(isTRUE(multi.panel)){ n_cols <- NCOL(cs$Env$xdata) asp <- ifelse(n_cols > 1, n_cols, 3) if (hasArg("yaxis.same") && hasArg("ylim") && !is.null(ylim)) { warning("only 'ylim' or 'yaxis.same' should be provided; using 'ylim'") } for(i in seq_len(n_cols)) { # create a local environment for each panel lenv <- cs$new_environment() lenv$xdata <- cs$Env$xdata[subset,i] lenv$type <- cs$Env$type if (is.null(ylim)) { if (yaxis.same) { lenv$ylim <- xdata_ylim # set panel ylim using all columns lenv$use_fixed_ylim <- FALSE # update panel ylim when rendering } else { panel_ylim <- cs$create_ylim(lenv$xdata) lenv$ylim <- panel_ylim # set panel ylim using this column lenv$use_fixed_ylim <- TRUE # do NOT update panel ylim when rendering } } else { lenv$ylim <- ylim # use the ylim argument value lenv$use_fixed_ylim <- TRUE # do NOT update panel ylim when rendering } # allow color and line attributes for each panel in a multi.panel plot lenv$lty <- cs$Env$lty[i] lenv$lwd <- cs$Env$lwd[i] lenv$col <- cs$Env$theme$col[i] lenv$log <- isTRUE(log) exp <- quote(chart.lines(xdata[xsubset], type=type, lty=lty, lwd=lwd, lend=lend, col=col, log=log, up.col=theme$up.col, dn.col=theme$dn.col, legend.loc=legend.loc)) exp <- as.expression(add.par.from.dots(exp, ...)) # create the panels this_panel <- cs$new_panel(lenv$ylim, asp = asp, envir = lenv, header = cs$Env$column_names[i], draw_left_yaxis = yaxis.left, draw_right_yaxis = yaxis.right, use_fixed_ylim = lenv$use_fixed_ylim, use_log_yaxis = log) # plot data this_panel$add_action(exp, env = lenv) } } else { if(type == "h" && NCOL(x) > 1) warning("only the univariate series will be plotted") if (is.null(ylim)) { yrange <- xdata_ylim # set ylim using all columns use_fixed_ylim <- FALSE # update panel ylim when rendering } else { yrange <- ylim # use the ylim argument value use_fixed_ylim <- TRUE # do NOT update panel ylim when rendering } # create the chart's main panel main_panel <- cs$new_panel(ylim = yrange, asp = 3, envir = cs$Env, header = "", use_fixed_ylim = use_fixed_ylim, draw_left_yaxis = yaxis.left, draw_right_yaxis = yaxis.right, use_log_yaxis = log) exp <- quote(chart.lines(xdata[xsubset], type=type, lty=lty, lwd=lwd, lend=lend, col=theme$col, log=log, up.col=theme$up.col, dn.col=theme$dn.col, legend.loc=legend.loc)) exp <- as.expression(add.par.from.dots(exp, ...)) main_panel$add_action(exp) assign(".xts_chob", cs, .plotxtsEnv) } # Plot the panels or default to a simple line chart if(!is.null(panels) && nchar(panels) > 0) { panels <- parse(text=panels, srcfile=NULL) for( p in 1:length(panels)) { if(length(panels[p][[1]][-1]) > 0) { cs <- eval(panels[p]) } else { cs <- eval(panels[p]) } } } assign(".xts_chob", cs, .plotxtsEnv) cs } # apply a function to the xdata in the xts chob and add a panel with the result #' Add a panel to an existing xts plot #' #' Apply a function to the data of an existing xts plot object and plot the #' result on an existing or new panel. `FUN` should have arguments `x` or `R` #' for the data of the existing xts plot object to be passed to. All other #' additional arguments for `FUN` are passed through \dots. #' #' @param FUN An xts object to plot. #' @param main Main title for a new panel if drawn. #' @param on Panel number to draw on. A new panel will be drawn if `on = NA`. #' @param type The type of plot to be drawn, same as in [`plot()`]. #' @param col Color palette to use, set by default to rational choices. #' @param lty Set the line type, same as in [`par()`]. #' @param lwd Set the line width, same as in [`par()`]. #' @param pch The type of plot to be drawn, same as in [`par()`]. #' @param \dots Additional named arguments passed through to `FUN` and any #' other graphical passthrough parameters. #' #' @seealso [`plot.xts()`], [`addSeries()`] #' #' @author Ross Bennett #' #' @examples #' #' library(xts) #' data(sample_matrix) #' sample.xts <- as.xts(sample_matrix) #' #' calcReturns <- function(price, method = c("discrete", "log")){ #' px <- try.xts(price) #' method <- match.arg(method)[1L] #' returns <- switch(method, #' simple = , #' discrete = px / lag(px) - 1, #' compound = , #' log = diff(log(px))) #' reclass(returns, px) #' } #' #' # plot the Close #' plot(sample.xts[,"Close"]) #' # calculate returns #' addPanel(calcReturns, method = "discrete", type = "h") #' # Add simple moving average to panel 1 #' addPanel(rollmean, k = 20, on = 1) #' addPanel(rollmean, k = 40, col = "blue", on = 1) #' addPanel <- function(FUN, main="", on=NA, type="l", col=NULL, lty=1, lwd=1, pch=1, ...){ # get the chob and the raw data (i.e. xdata) chob <- current.xts_chob() # xdata will be passed as first argument to FUN xdata <- chob$Env$xdata fun <- match.fun(FUN) .formals <- formals(fun) if("..." %in% names(.formals)) { # Just call do.call if FUN has '...' x <- try(do.call(fun, c(list(xdata), list(...)), quote=TRUE), silent=TRUE) } else { # Otherwise, ensure we only pass relevant args to FUN .formals <- modify.args(formals=.formals, arglist=list(...)) .formals[[1]] <- quote(xdata) x <- try(do.call(fun, .formals), silent=TRUE) } if(inherits(x, "try-error")) { message(paste("FUN function failed with message", x)) return(NULL) } addSeriesCall <- quote(addSeries(x = x, main = main, on = on, type = type, col = col, lty = lty, lwd = lwd, pch = pch)) addSeriesCall <- add.par.from.dots(addSeriesCall, ...) eval(addSeriesCall) } # Add a time series to an existing xts plot # author: Ross Bennett #' Add a time series to an existing xts plot #' #' Add a time series to an existing xts plot #' #' @param x An xts object to add to the plot. #' @param main Main title for a new panel if drawn. #' @param on Panel number to draw on. A new panel will be drawn if `on = NA`. #' @param type The type of plot to be drawn, same as in [`plot()`]. #' @param col Color palette to use, set by default to rational choices. #' @param lty Set the line type, same as in [`par()`]. #' @param lwd Set the line width, same as in [`par()`]. #' @param pch The type of plot to be drawn, same as in [`par()`]. #' @param \dots Any other passthrough graphical parameters. #' #' @author Ross Bennett #' addSeries <- function(x, main="", on=NA, type="l", col=NULL, lty=1, lwd=1, pch=1, ...){ plot_object <- current.xts_chob() lenv <- plot_object$new_environment() lenv$plot_lines <- function(x, ta, on, type, col, lty, lwd, pch, ...){ xdata <- x$Env$xdata xsubset <- x$Env$xsubset xDataSubset <- xdata[xsubset] # we can add points that are not necessarily at the points # on the main series, but need to ensure the new series only # has index values within the xdata subset if(xsubset == "") { subset.range <- xsubset } else { fmt <- "%Y-%m-%d %H:%M:%OS6" subset.range <- paste(format(start(xDataSubset), fmt), format(end(xDataSubset), fmt), sep = "/") } xds <- .xts(, .index(xDataSubset), tzone=tzone(xdata)) ta.y <- merge(ta, xds)[subset.range] if (!isTRUE(x$Env$extend.xaxis)) { xi <- .index(ta.y) xc <- .index(xds) xsubset <- which(xi >= xc[1] & xi <= xc[length(xc)]) ta.y <- ta.y[xsubset] } chart.lines(ta.y, type=type, col=col, lty=lty, lwd=lwd, pch=pch, ...) } # get tag/value from dots expargs <- substitute(alist(ta=x, on=on, type=type, col=col, lty=lty, lwd=lwd, pch=pch, ...)) # capture values from caller, so we don't need to copy objects to lenv, # since this gives us evaluated versions of all the object values expargs <- lapply(expargs[-1L], eval, parent.frame()) exp <- as.call(c(quote(plot_lines), x = quote(current.xts_chob()), expargs)) xdata <- plot_object$Env$xdata xsubset <- plot_object$Env$xsubset lenv$xdata <- merge(x,xdata,retside=c(TRUE,FALSE)) if(hasArg("ylim")) { ylim <- eval.parent(substitute(alist(...))$ylim) } else { ylim <- range(lenv$xdata[xsubset], na.rm=TRUE) if(all(ylim == 0)) ylim <- c(-1, 1) } lenv$ylim <- ylim if(is.na(on[1])){ # add series to a new panel use_log <- isTRUE(eval.parent(substitute(alist(...))$log)) this_panel <- plot_object$new_panel(lenv$ylim, asp = 1, envir = lenv, header = main, use_log_yaxis = use_log) # plot data this_panel$add_action(exp, env = lenv) } else { for(i in on) { plot_object$add_panel_action(i, exp, lenv) } } plot_object } # Add time series of lines to an existing xts plot # author: Ross Bennett #' @param pch the plotting character to use, same as in 'par' #' @rdname plot.xts lines.xts <- function(x, ..., main="", on=0, col=NULL, type="l", lty=1, lwd=1, pch=1){ if(!is.na(on[1])) if(on[1] == 0) on[1] <- current.xts_chob()$get_last_action_panel()$id addSeries(x, ...=..., main=main, on=on, type=type, col=col, lty=lty, lwd=lwd, pch=pch) } # Add time series of points to an existing xts plot # author: Ross Bennett #' @param pch the plotting character to use, same as in 'par' #' @rdname plot.xts points.xts <- function(x, ..., main="", on=0, col=NULL, pch=1){ if(!is.na(on[1])) if(on[1] == 0) on[1] <- current.xts_chob()$get_last_action_panel()$id addSeries(x, ...=..., main=main, on=on, type="p", col=col, pch=pch) } # Add vertical lines to an existing xts plot # author: Ross Bennett #' Add vertical lines to an existing xts plot #' #' Add vertical lines and labels to an existing xts plot. #' #' @param events An xts object of events and their associated labels. It is #' ensured that the first column of `events` is the event description/label. #' @param main Main title for a new panel, if drawn. #' @param on Panel number to draw on. A new panel will be drawn if `on = NA`. #' The default, `on = 0`, will add to the active panel. The active panel is #' defined as the panel on which the most recent action was performed. Note #' that only the first element of `on` is checked for the default behavior to #' add to the last active panel. #' @param lty Set the line type, same as in [`par()`]. #' @param lwd Set the line width, same as in [`par()`]. #' @param col Color palette to use, set by default to rational choices. #' @param \dots Any other passthrough parameters to [`text()`] to control how #' the event labels are drawn. #' #' @author Ross Bennett #' #' @examples #' #' \dontrun{ #' library(xts) #' data(sample_matrix) #' sample.xts <- as.xts(sample_matrix) #' events <- xts(letters[1:3], #' as.Date(c("2007-01-12", "2007-04-22", "2007-06-13"))) #' plot(sample.xts[,4]) #' addEventLines(events, srt = 90, pos = 2) #' } #' addEventLines <- function(events, main="", on=0, lty=1, lwd=1, col=1, ...){ events <- try.xts(events) plot_object <- current.xts_chob() if(!is.na(on[1])) if(on[1] == 0) on[1] <- plot_object$get_last_action_panel()$id if(nrow(events) > 1){ if(length(lty) == 1) lty <- rep(lty, nrow(events)) if(length(lwd) == 1) lwd <- rep(lwd, nrow(events)) if(length(col) == 1) col <- rep(col, nrow(events)) } lenv <- plot_object$new_environment() lenv$plot_event_lines <- function(x, events, on, lty, lwd, col, ...){ xdata <- x$Env$xdata xsubset <- x$Env$xsubset panel <- x$get_active_panel() if (panel$use_log_yaxis) { ypos <- log(exp(panel$ylim_render[2]) * 0.995) } else { ypos <- panel$ylim_render[2] * 0.995 } # we can add points that are not necessarily at the points on the main series subset.range <- paste(format(start(xdata[xsubset]), "%Y%m%d %H:%M:%OS6"), format(end(xdata[xsubset]), "%Y%m%d %H:%M:%OS6"), sep = "/") ta.adj <- merge(n=.xts(1:NROW(xdata[xsubset]), .index(xdata[xsubset]), tzone=tzone(xdata)), .xts(rep(1, NROW(events)),# use numeric for the merge .index(events)))[subset.range] # should we not merge and only add events that are in index(xdata)? ta.y <- ta.adj[,-1] # the merge should result in NAs for any object that is not in events event.ind <- which(!is.na(ta.y)) abline(v=x$get_xcoords()[event.ind], col=col, lty=lty, lwd=lwd) text(x=x$get_xcoords()[event.ind], y=ypos, labels=as.character(events[,1]), col=x$Env$theme$labels, ...) } # get tag/value from dots expargs <- substitute(alist(events=events, on=on, lty=lty, lwd=lwd, col=col, ...)) # capture values from caller, so we don't need to copy objects to lenv, # since this gives us evaluated versions of all the object values expargs <- lapply(expargs[-1L], eval, parent.frame()) exp <- as.call(c(quote(plot_event_lines), x = quote(current.xts_chob()), expargs)) if(is.na(on[1])){ xdata <- plot_object$Env$xdata xsubset <- plot_object$Env$xsubset lenv$xdata <- xdata ylim <- range(xdata[xsubset], na.rm=TRUE) lenv$ylim <- ylim # add series to a new panel this_panel <- plot_object$new_panel(lenv$ylim, asp = 1, envir = lenv, header = main) # plot data this_panel$add_action(exp, env = lenv) } else { for(i in on) { plot_object$add_panel_action(i, exp, lenv) } } plot_object } # Add legend to an existing xts plot # author: Ross Bennett #' Add Legend #' #' Add a legend to an existing panel. #' #' @param legend.loc One of nine locations: bottomright, bottom, bottomleft, #' left, topleft, top, topright, right, or center. #' @param legend.names Character vector of names for the legend. When `NULL`, #' the column names of the current plot object are used. #' @param col Fill colors for the legend. When `NULL`, the colorset of the #' current plot object data is used. #' @param ncol Number of columns for the legend. #' @param on Panel number to draw on. A new panel will be drawn if `on = NA`. #' The default, `on = 0`, will add to the active panel. The active panel is #' defined as the panel on which the most recent action was performed. Note #' that only the first element of `on` is checked for the default behavior to #' add to the last active panel. #' @param \dots Any other passthrough parameters to [`legend()`]. #' #' @author Ross Bennett #' addLegend <- function(legend.loc="topright", legend.names=NULL, col=NULL, ncol=1, on=0, ...){ plot_object <- current.xts_chob() if(!is.na(on[1])) if(on[1] == 0) on[1] <- plot_object$get_last_action_panel()$id lenv <- plot_object$new_environment() lenv$plot_legend <- function(x, legend.loc, legend.names, col, ncol, on, bty, text.col, ...){ if(is.na(on[1])){ yrange <- c(0, 1) } else { panel <- x$get_active_panel() yrange <- panel$ylim_render } # this just gets the data of the main plot # TODO: get the data of panels[on] if(is.null(ncol)){ ncol <- NCOL(x$Env$xdata) } if(is.null(col)){ col <- x$Env$theme$col[1:NCOL(x$Env$xdata)] } if(is.null(legend.names)){ legend.names <- x$Env$column_names } if(missing(bty)){ bty <- "n" } if(missing(text.col)){ text.col <- x$Env$theme$labels } lc <- legend.coords(legend.loc, x$Env$xlim, yrange) legend(x=lc$x, y=lc$y, legend=legend.names, xjust=lc$xjust, yjust=lc$yjust, ncol=ncol, col=col, bty=bty, text.col=text.col, ...) } # get tag/value from dots expargs <- substitute(alist(legend.loc=legend.loc, legend.names=legend.names, col=col, ncol=ncol, on=on, ...)) # capture values from caller, so we don't need to copy objects to lenv, # since this gives us evaluated versions of all the object values expargs <- lapply(expargs[-1L], eval, parent.frame()) exp <- as.call(c(quote(plot_legend), x = quote(current.xts_chob()), expargs)) # if on[1] is NA, then add a new frame for the legend if(is.na(on[1])){ # add legend to a new panel this_panel <- plot_object$new_panel(ylim = c(0, 1), asp = 0.8, envir = lenv, header = "") # legend data this_panel$add_action(exp, env = lenv) } else { for(i in on) { plot_object$add_panel_action(i, exp, lenv) } } plot_object } # Determine legend coordinates based on legend location, # range of x values and range of y values legend.coords <- function(legend.loc, xrange, yrange) { switch(legend.loc, topleft = list(xjust = 0, yjust = 1, x = xrange[1], y = yrange[2]), left = list(xjust = 0, yjust = 0.5, x = xrange[1], y = sum(yrange) / 2), bottomleft = list(xjust = 0, yjust = 0, x = xrange[1], y = yrange[1]), top = list(xjust = 0.5, yjust = 1, x = (xrange[1] + xrange[2]) / 2, y = yrange[2]), center = list(xjust = 0.5, yjust = 0.5, x = (xrange[1] + xrange[2]) / 2, y = sum(yrange) / 2), bottom = list(xjust = 0.5, yjust = 0, x = (xrange[1] + xrange[2]) / 2, y = yrange[1]), topright = list(xjust = 1, yjust = 1, x = xrange[2], y = yrange[2]), right = list(xjust = 1, yjust = 0.5, x = xrange[2], y = sum(yrange) / 2), bottomright = list(xjust = 1, yjust = 0, x = xrange[2], y = yrange[1]) ) } # Add a polygon to an existing xts plot # author: Ross Bennett #' Add a polygon to an existing xts plot #' #' Draw a polygon on an existing xts plot by specifying a time series of y #' coordinates. The xts index is used for the x coordinates and the first two #' columns are the upper and lower y coordinates, respectively. #' #' @param x An xts object to plot. Must contain 2 columns for the upper and #' the lower y coordinates for the polygon. The first column is interpreted #' as upper y coordinates and the second column as the lower y coordinates. #' @param y `NULL`, not used. #' @param main Main title for a new panel, if drawn. #' @param on Panel number to draw on. A new panel will be drawn if `on = NA`. #' @param col Color palette to use, set by default to rational choices. #' @param \dots Any other passthrough parameters to [`par()`]. #' #' @author Ross Bennett #' #' @references Based on code by Dirk Eddelbuettel from #' #' #' @examples #' #' \dontrun{ #' library(xts) #' data(sample_matrix) #' x <- as.xts(sample_matrix)[,1] #' ix <- index(x["2007-02"]) #' shade <- xts(matrix(rep(range(x), each = length(ix)), ncol = 2), ix) #' #' plot(x) #' #' # set on = -1 to draw the shaded region *behind* the main series #' addPolygon(shade, on = -1, col = "lightgrey") #' } #' addPolygon <- function(x, y=NULL, main="", on=NA, col=NULL, ...){ # add polygon to xts plot based on http://dirk.eddelbuettel.com/blog/2011/01/16/ # some simple checks x <- try.xts(x) if(!is.null(y)) stop("y is not null") if(ncol(x) > 2) warning("more than 2 columns detected in x, only the first 2 will be used") plot_object <- current.xts_chob() lenv <- plot_object$new_environment() lenv$plot_lines <- function(x, ta, on, col, ...){ xdata <- x$Env$xdata xsubset <- x$Env$xsubset xDataSubset <- xdata[xsubset] if(is.null(col)) col <- x$Env$theme$col # we can add points that are not necessarily at the points # on the main series, but need to ensure the new series only # has index values within the xdata subset if(xsubset == "") { subset.range <- xsubset } else { fmt <- "%Y-%m-%d %H:%M:%OS6" subset.range <- paste(format(start(xDataSubset), fmt), format(end(xDataSubset), fmt), sep = "/") } xds <- .xts(, .index(xDataSubset), tzone=tzone(xdata)) ta.y <- merge(ta, xds)[subset.range] # NAs in the coordinates break the polygon which is not the behavior we want ta.y <- na.omit(ta.y) # x coordinates n <- seq_len(NROW(ta.y)) xx <- x$get_xcoords(ta.y)[c(1, n, rev(n))] # y coordinates upper and lower # assume first column is upper and second column is lower y coords for # initial prototype yu <- as.vector(coredata(ta.y[,1])) yl <- as.vector(coredata(ta.y[,2])) polygon(x=xx, y=c(yl[1], yu, rev(yl)), border=NA, col=col, ...) } # get tag/value from dots expargs <- substitute(alist(ta=x, col=col, on=on, ...)) # capture values from caller, so we don't need to copy objects to lenv, # since this gives us evaluated versions of all the object values expargs <- lapply(expargs[-1L], eval, parent.frame()) exp <- as.call(c(quote(plot_lines), x = quote(current.xts_chob()), expargs)) xdata <- plot_object$Env$xdata xsubset <- plot_object$Env$xsubset lenv$xdata <- merge(x,xdata,retside=c(TRUE,FALSE)) if(hasArg("ylim")) { ylim <- eval.parent(substitute(alist(...))$ylim) } else { ylim <- range(lenv$xdata[xsubset], na.rm=TRUE) if(all(ylim == 0)) ylim <- c(-1, 1) } lenv$ylim <- ylim if(is.na(on[1])){ # add series to a new panel this_panel <- plot_object$new_panel(ylim = lenv$ylim, asp = 1, envir = lenv, header = main) # plot data this_panel$add_action(exp, env = lenv) } else { for(i in on) { plot_object$add_panel_action(i, exp, lenv) } } plot_object }# polygon # Based on quantmod/R/replot.R new.replot_xts <- function(panel=1,asp=1,xlim=c(1,10),ylim=list(structure(c(1,10),fixed=FALSE))) { # global variables # 'Env' is mainly the environment for the plot window, but some elements are for panels/frames Env <- new.env() Env$active_panel_i <- panel Env$asp <- 1 Env$xlim <- xlim # vector: c(min, max) (same for every panel) Env$last_action_panel_id <- 1 # getters get_ylim <- function() { update_panels(); get_active_panel()[["ylim_render"]] } get_xlim <- function() { update_panels(); Env$xlim } get_active_panel <- function() { get_panel(Env$active_panel_i) } get_last_action_panel <- function() { get_panel(Env$last_action_panel_id) } get_panel <- function(n) { if (n == 0) { get_last_action_panel() } else if (n > 0) { Env$panels[[n]] } else { stop("'n' must be a positive integer") } } add_panel_action <- function(id, expr, env, clip = TRUE, where = c("last", "first", "background"), ...) { if (id < 0) { where <- "first" } else { where <- match.arg(where) } this_panel <- get_panel(abs(id)) this_panel$add_action(expr, env, clip, where, ...) } create_ylim <- function(x, const_y_mult = 0.2) { # Create y-axis limits from 'x'. Jitter the max/min limits by # 'const_y_mult' if the max/min values are the same. lim <- range(x, na.rm = TRUE) if(isTRUE(all.equal(lim[1L], lim[2L]))) { # if max and min are the same if(lim[1L] == 0) { lim <- c(-1, 1) } else { adj <- sign(lim[1L]) * const_y_mult lim <- lim[1L] * c(1 - adj, 1 + adj) } } return(lim) } # loop over panels and then actions render_panels <- function() { update_panels() # all panel header/series asp pairs all_asp <- lapply(Env$panels, function(p) p[["asp"]]) all_asp <- do.call(c, all_asp) # panel header asp is always 5% of the total asp panel_header_asp <- 0.05 * sum(all_asp) # update panel header asp values header_loc <- seq(1, length(all_asp), by = 2) all_asp[header_loc] <- panel_header_asp # main header asp is always 4% of the grand total asp main_title_asp <- 0.04 * sum(all_asp) all_asp <- c(main_title_asp, all_asp) n_asp <- length(all_asp) # render main plot header and x-axis plot.window(Env$xlim, c(0, 1)) clip(par("usr")[1], par("usr")[2], 0, 1) eval(Env$main_header_expr, Env) # header eval(Env$main_xaxis_expr, Env) # x-axis # render each panel for (panel_n in seq_along(Env$panels)) { panel <- Env$panels[[panel_n]] # set the current active panel for the entire plot Env$active_panel_i <- panel_n is_header <- TRUE # header is always the first action for (action in panel$actions) { if (is_header) { is_header <- FALSE asp <- panel_header_asp asp_n <- 2 * panel_n ylim <- c(0, 1) } else { asp <- panel$asp["series"] asp_n <- 2 * panel_n + 1 ylim <- panel$ylim_render } # scaled ylim ylim_scale <- all_asp / asp * abs(diff(ylim)) ymin_adj <- sum(ylim_scale[-seq_len(asp_n)]) ymax_adj <- sum(ylim_scale[-(asp_n:n_asp)]) scaled_ylim <- c(ylim[1] - ymin_adj, ylim[2] + ymax_adj) plot.window(Env$xlim, scaled_ylim) if (attr(action, "clip")) { clip(par("usr")[1], par("usr")[2], ylim[1], ylim[2]) } action_env <- attr(action, "env") eval(action, action_env) } } } get_xcoords <- function(xts_object = NULL, at_posix = FALSE) { # unique index for all series (always POSIXct) xcoords <- Env$xycoords$x if (!is.null(xts_object)) { # get the x-coordinates for the observations in xts_object temp_xts <- .xts(seq_along(xcoords), xcoords, tzone = tzone(xts_object)) xcoords <- merge(temp_xts, xts_object, fill = na.locf, # for duplicate index values join = "right", retside = c(TRUE, FALSE)) if (!isTRUE(Env$extend.xaxis)) { xc <- Env$xycoords$x xi <- .index(xcoords) xsubset <- which(xi >= xc[1] & xi <= xc[length(xc)]) xcoords <- xcoords[xsubset] } if(Env$observation.based && !at_posix) { result <- drop(coredata(xcoords)) } else { result <- .index(xcoords) } } else { if(Env$observation.based && !at_posix) { result <- seq_along(xcoords) } else { result <- xcoords } } return(result) } # main plot header Env$main_header_expr <- expression({ local({ text(x = xlim[1], y = 1.0, labels = main, adj = c(0, 1), cex = 1.1, col = theme$labels, font = 2) if (main.timespan) { text(x = xlim[2], y = 1.0, labels = paste(start(xdata[xsubset]), end(xdata[xsubset]), sep = " / "), adj = c(1, 1), cex = 1, col = theme$labels, font = NULL) } }, new.env(TRUE, Env)) }) # main plot x-axis Env$main_xaxis_expr <- expression({ local({ # add observation level ticks on x-axis if < 400 obs. if (NROW(xdata[xsubset]) < 400) { axis(1, at = get_xcoords(), labels = FALSE, las = theme$las, lwd.ticks = NULL, mgp = NULL, tcl = 0.3, cex.axis = theme$cex.axis, col = theme$labels, col.axis = theme$grid2) } # and major and/or minor x-axis ticks and labels xcoords <- get_xcoords() x_index <- get_xcoords(at_posix = TRUE) x_data <- .xts(, x_index, tzone = tzone(xdata))[xsubset] use_major <- !isNullOrFalse(major.ticks) use_minor <- !isNullOrFalse(minor.ticks) types <- c("major", "minor")[c(use_major, use_minor)] for (type in types) { if (type== "major") { axt <- axTicksByTime(x_data, ticks.on = major.ticks, format.labels = format.labels) labels <- names(axt) lwd.ticks <- 1.5 } else { axt <- axTicksByTime(x_data, ticks.on = minor.ticks, format.labels = format.labels) labels <- FALSE lwd.ticks <- 0.75 } axis(1, at = xcoords[axt], labels = labels, las = theme$las, lwd.ticks = lwd.ticks, mgp = c(3,1.5,0), tcl = -0.4, cex.axis = theme$cex.axis, col = theme$labels, col.axis = theme$labels) } }, new.env(TRUE, Env)) }) # panel functionality Env$panels <- list() new_panel <- function(ylim, asp, envir, header, ..., use_fixed_ylim = FALSE, draw_left_yaxis = NULL, draw_right_yaxis = NULL, use_log_yaxis = FALSE, title_timespan = FALSE) { panel <- new.env(TRUE, envir) panel$id <- length(Env$panels) + 1 panel$asp <- c(header = 0.25, series = asp) panel$ylim <- ylim panel$ylim_render <- ylim panel$use_fixed_ylim <- isTRUE(use_fixed_ylim) panel$draw_left_yaxis <- ifelse(is.null(draw_left_yaxis), Env$theme$lylab, draw_left_yaxis) panel$draw_right_yaxis <- ifelse(is.null(draw_right_yaxis), Env$theme$rylab, draw_right_yaxis) panel$use_log_yaxis <- isTRUE(use_log_yaxis) panel$header <- header ### actions panel$actions <- list() panel$add_action <- function(expr, env = Env, clip = TRUE, where = c("last", "first", "background"), ...) { if (!is.expression(expr)) { expr <- as.expression(expr) } action <- structure(expr, clip = clip, env = env, ...) panel$actions <- switch(match.arg(where), last = { # after all the existing actions append(panel$actions, list(action)) }, first = { # after the header and grid lines append(panel$actions, list(action), after = 3) }, background = { # after the header (which must be the 1st panel action) append(panel$actions, list(action), after = 1) }) Env$last_action_panel_id <<- panel$id } ### header # NOTE: this must be the 1st action for a panel header_expr <- expression({ text(x = xlim[1], y = 0.3, labels = header, adj = c(0, 0), pos = 4, offset = 0, cex = 0.9, col = theme$labels, font = NULL) }) panel$add_action(header_expr, env = panel) ### y-axis yaxis_expr <- expression({ if (use_fixed_ylim) { # use the ylim argument yl <- ylim } else { # use the updated ylim based on all panel data yl <- ylim_render } # y-axis grid line labels and locations if (use_log_yaxis) { ylim_series <- exp(ylim_render) # labels are based on the raw series values grid_lbl <- pretty(ylim_series, Env$yaxis.ticks) grid_lbl <- grid_lbl[grid_lbl >= ylim_series[1] & grid_lbl <= ylim_series[2]] # locations are based on the log series values grid_loc <- log(grid_lbl) } else { grid_loc <- pretty(yl, Env$yaxis.ticks) grid_loc <- grid_loc[grid_loc >= yl[1] & grid_loc <= yl[2]] grid_lbl <- grid_loc } # draw y-axis grid lines segments(x0 = xlim[1], y0 = grid_loc, x1 = xlim[2], y1 = grid_loc, col = theme$grid, lwd = grid.ticks.lwd, lty = grid.ticks.lty) # draw left y-axis grid labels if (draw_left_yaxis) { text(x = xlim[1], y = grid_loc, labels = format(grid_lbl, justify = "right"), col = theme$labels, srt = theme$srt, offset = 0.5, pos = 2, cex = theme$cex.axis, xpd = TRUE) } # draw right y-axis grid labels if (draw_right_yaxis) { text(x = xlim[2], y = grid_loc, labels = format(grid_lbl, justify = "right"), col = theme$labels, srt = theme$srt, offset = 0.5, pos = 4, cex = theme$cex.axis, xpd = TRUE) } # draw y-axis label title(ylab = ylab[1], mgp = c(1, 1, 0)) }) panel$add_action(yaxis_expr, env = panel) # x-axis grid xaxis_action <- expression(x_grid_lines(xdata, grid.ticks.on, par("usr")[3:4])) panel$add_action(xaxis_action, env = panel) # append the new panel to the panel list Env$panels <- append(Env$panels, list(panel)) return(panel) } update_panels <- function(headers=TRUE) { # Recalculate each panel's 'ylim_render' value based on the # 'xdata' of every action in the panel for (panel_n in seq_along(Env$panels)) { panel <- get_panel(panel_n) if (!panel$use_fixed_ylim) { # set 'ylim_render' to +/-Inf when ylim is NOT fixed, so # it will be updated to include all the panel's data panel$ylim_render <- c(Inf, -Inf) # calculate a new ylim based on all the panel's data for (action in panel$actions) { action_env <- attr(action, "env") action_data <- action_env$xdata if (!is.null(action_data)) { # some actions (e.g. addLegend) do not have 'xdata' dat.range <- create_ylim(action_data[Env$xsubset]) # calculate new ylim based on the combination of the panel's # original ylim and the action's 'xdata' ylim new_ylim <- c(min(panel$ylim[1], dat.range, na.rm = TRUE), max(panel$ylim[2], dat.range, na.rm = TRUE)) # set to new ylim values panel$ylim_render <- new_ylim } } } if (panel$use_log_yaxis) { panel$ylim_render <- log(panel$ylim_render) } } update_xaxis <- function(panel, x_axis) { # Create x-axis values using index values from data from all panels for (action in panel$actions) { action_env <- attr(action, "env") action_data <- action_env$xdata if (!is.null(action_data)) { # some actions (e.g. addLegend) do not have 'xdata' action_xaxis <- .index(action_data[Env$xsubset]) new_xaxis <- sort(unique(c(x_axis, action_xaxis))) if (isTRUE(Env$extend.xaxis)) { result <- new_xaxis } else { xaxis_rng <- range(x_axis, na.rm = TRUE) result <- new_xaxis[new_xaxis >= xaxis_rng[1L] & new_xaxis <= xaxis_rng[2L]] } } } return(result) } x_axis <- .index(Env$xdata[Env$xsubset]) for (panel in Env$panels) { x_axis <- update_xaxis(panel, x_axis) } # Create x/y coordinates using the combined x-axis index Env$xycoords <- xy.coords(x_axis, seq_along(x_axis)) if (Env$observation.based) { Env$xlim <- c(1, length(get_xcoords())) } else { Env$xlim <- range(get_xcoords(), na.rm = TRUE) } } # return replot_env <- new.env() class(replot_env) <- c("replot_xts","environment") replot_env$Env <- Env replot_env$new_panel <- new_panel replot_env$get_xcoords <- get_xcoords replot_env$update_panels <- update_panels replot_env$render_panels <- render_panels replot_env$get_panel <- get_panel replot_env$add_panel_action <- add_panel_action replot_env$get_xlim <- get_xlim replot_env$get_ylim <- get_ylim replot_env$create_ylim <- create_ylim replot_env$get_active_panel <- get_active_panel replot_env$get_last_action_panel <- get_last_action_panel replot_env$new_environment <- function() { new.env(TRUE, Env) } # function to plot the x-axis grid lines replot_env$Env$x_grid_lines <- function(x, ticks.on, ylim) { if (isNullOrFalse(ticks.on)) { invisible() } else { if (isTRUE(ticks.on)) ticks.on <- "auto" xcoords <- get_xcoords() x_index <- get_xcoords(at_posix = TRUE) atbt <- axTicksByTime(.xts(, x_index, tzone = tzone(x)), ticks.on = ticks.on) segments(xcoords[atbt], ylim[1L], xcoords[atbt], ylim[2L], col = Env$theme$grid, lwd = Env$grid.ticks.lwd, lty = Env$grid.ticks.lty) } } return(replot_env) } str.replot_xts <- function(object, ...) { print(str(unclass(object))) } print.replot_xts <- function(x, ...) plot(x,...) plot.replot_xts <- function(x, ...) { # must set the background color before calling plot.new obg <- par(bg = x$Env$theme$bg) plot.new() assign(".xts_chob",x,.plotxtsEnv) # only reasonable way to fix X11/quartz issue ocex <- par(cex = if(.Device == "X11") x$Env$cex else x$Env$cex * 1.5) omar <- par(mar = x$Env$mar) oxpd <- par(xpd = FALSE) usr <- par("usr") # reset par on.exit(par(xpd = oxpd$xpd, cex = ocex$cex, mar = omar$mar, bg = obg$bg)) x$render_panels() do.call("clip", as.list(usr)) # reset clipping region invisible(x$Env$actions) } xts/R/isOrdered.R0000644000176200001440000000405514654242576013357 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' Check If A Vector Is Ordered #' #' Check if a vector is strictly increasing, strictly decreasing, not #' decreasing, or not increasing. #' #' Designed for internal use with \pkg{xts}, this provides highly optimized #' tests for ordering. #' #' @param x A numeric vector. #' @param increasing Test for increasing (`TRUE`) or decreasing (`FALSE`) values? #' @param strictly When `TRUE`, vectors with duplicate values are *not* #' considered ordered. #' #' @return A logical scalar indicating whether or not `x` is ordered. #' #' @author Jeffrey A. Ryan #' #' @seealso [`is.unsorted()`] #' #' @keywords misc #' @examples #' #' # strictly increasing #' isOrdered(1:10, increasing=TRUE) #' isOrdered(1:10, increasing=FALSE) #' isOrdered(c(1,1:10), increasing=TRUE) #' isOrdered(c(1,1:10), increasing=TRUE, strictly=FALSE) #' #' # decreasing #' isOrdered(10:1, increasing=TRUE) #' isOrdered(10:1, increasing=FALSE) #' `isOrdered` <- function(x, increasing=TRUE, strictly=TRUE) { # x must be of type double or integer. Checked in the C code. if(is.character(x)) stop('character ordering unsupported') if(!is.numeric(x)) x = as.numeric(x) .Call(C_do_is_ordered, x = x, increasing = as.logical(increasing), strictly = as.logical(strictly)) } xts/R/all.equal.R0000644000176200001440000000307314634167654013315 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2019 Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . all.equal.xts <- function(target, current, ..., check.attributes = TRUE) { if (isTRUE(check.attributes)) { # Remove potential index attributes on the objects attrNames <- c(".indexCLASS", ".indexTZ", "tclass", "tzone") for (aname in attrNames) { attr(target, aname) <- NULL attr(current, aname) <- NULL } # Order the object attributes a <- attributes(target) attributes(target) <- a[sort(names(a))] a <- attributes(current) attributes(current) <- a[sort(names(a))] # Order the index attributes a <- attributes(.index(target)) attributes(.index(target)) <- a[sort(names(a))] a <- attributes(.index(current)) attributes(.index(current)) <- a[sort(names(a))] } NextMethod("all.equal") } xts/R/timeSeries.R0000644000176200001440000000561214654242576013550 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # functions to handle timeSeries <--> xts conversions `re.timeSeries` <- function(x,...) { if(!requireNamespace('timeSeries', quietly=TRUE)) { timeSeries <- function(...) message("package 'timeSeries' is required") } else { timeSeries <- timeSeries::timeSeries } # strip all non-'core' attributes so they're not attached to the Data slot x.attr <- attributes(x) xx <- structure(x,dimnames=x.attr$dimnames,index=x.attr$index) original.attr <- attributes(x)[!names(attributes(x)) %in% c("dim","dimnames","index","class")] for(i in names(original.attr)) { attr(xx,i) <- NULL } timeSeries(coredata(xx),charvec=as.POSIXct(format(index(x)),tz="GMT"),format=x.attr$format, zone=x.attr$FinCenter,FinCenter=x.attr$FinCenter, recordIDs=x.attr$recordIDs,title=x.attr$title, documentation=x.attr$documentation,...) } #' @rdname as.xts `as.xts.timeSeries` <- function(x,dateFormat="POSIXct",FinCenter,recordIDs,title,documentation,..., .RECLASS=FALSE) { if(missing(FinCenter)) FinCenter <- x@FinCenter if(missing(recordIDs)) recordIDs <- x@recordIDs if(missing(title)) title <- x@title if(missing(documentation)) documentation <- x@documentation indexBy <- structure(x@positions, class=c("POSIXct","POSIXt"), tzone=FinCenter) order.by <- do.call(paste('as',dateFormat,sep='.'),list(as.character(indexBy))) if(.RECLASS) { xts(as.matrix(x@.Data), order.by=order.by, format=x@format, FinCenter=FinCenter, recordIDs=recordIDs, title=title, documentation=documentation, .CLASS='timeSeries', .CLASSnames=c('FinCenter','recordIDs','title','documentation','format'), .RECLASS=TRUE, ...) } else { xts(as.matrix(x@.Data), order.by=order.by, ...) } } as.timeSeries.xts <- function(x, ...) { if(!requireNamespace('timeSeries', quietly=TRUE)) { timeSeries <- function(...) message("package 'timeSeries' is required") } else { timeSeries <- timeSeries::timeSeries } timeSeries(data=coredata(x), charvec=as.character(index(x)), ...) } xts/R/Ops.xts.R0000644000176200001440000000614114654242576013013 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . `Ops.xts` <- function(e1, e2) { # determine and output class # use 'e1' first because e2 is missing for unary +/-/! if(inherits(e1, "xts")) { # e1 could be a derived class; use its class for output # NOTE: we want the output to be an xts object even if e2 is a derived # class, because Ops.xts() might not create an appropriate derived class # object out_class <- class(e1) } else { # if 'e1' isn't xts, then e2 must be xts or a derived class, otherwise # this method wouldn't have been called out_class <- class(e2) } e <- if (missing(e2)) { .Class <- "matrix" NextMethod(.Generic) } else if (any(nchar(.Method) == 0)) { .Class <- "matrix" NextMethod(.Generic) } else { if( NROW(e1)==NROW(e2) && identical(.index(e1),.index(e2)) ) { .Class <- "matrix" NextMethod(.Generic) } else { tmp.e1 <- merge.xts(e1, e2, all=FALSE, retclass=FALSE, retside=c(TRUE,FALSE), check.names=FALSE) e2 <- merge.xts(e2, e1, all=FALSE, retclass=FALSE, retside=c(TRUE,FALSE), check.names=FALSE) e1 <- tmp.e1 .Class <- "matrix" NextMethod(.Generic) } } # These return an object the same class as input(s); others return a logical object if(.Generic %in% c("+","-","*","/","^","%%","%/%")) { e <- .Call(C_add_class, e, out_class) } if(length(e)==0) { if(is.xts(e1)) { idx <- .index(e1) } else { idx <- .index(e2) } idx[] <- idx[0] attr(e,'index') <- idx } dn <- dimnames(e) if(!is.null(dn[[1L]])) { if(is.null(dn[[2L]])) { attr(e, "dimnames") <- NULL } else { dimnames(e) <- list(NULL, dn[[2L]]) } } if(is.null(attr(e,'index'))) { if(is.xts(e1)) { e <- .xts(e, .index(e1), tclass(e1), tzone(e1), tformat = tformat(e1)) } else if(is.xts(e2)) { e <- .xts(e, .index(e2), tclass(e2), tzone(e2), tformat = tformat(e2)) } else { # neither have class = ('xts', 'zoo'), because they were overwritten # by the result of merge(..., retclass = FALSE). But they still have # an 'index' attribute. ix <- .index(e1) if (is.null(ix)) { ix <- .index(e2) } e <- .xts(e, ix, tclass(ix), tzone(ix), tformat = tformat(ix)) } if(is.null(dim(e1)) && is.null(dim(e2))) dim(e) <- NULL } attr(e, "names") <- NULL e } xts/R/data.frame.R0000644000176200001440000000450614654242576013442 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # functions to handle data.frame <--> xts conversions `re.data.frame` <- function(x,...) { data.frame(x,...) } #' @rdname as.xts `as.xts.data.frame` <- function(x, order.by, dateFormat = "POSIXct", frequency = NULL, ..., .RECLASS = FALSE) { # Should allow 'order.by' to be a vector of dates or a scaler # representing the column number to use. if(missing(order.by)) { order_by_ <- try({ coerce.rownames <- paste("as", dateFormat, sep = ".") do.call(coerce.rownames, list(rownames(x))) }, silent = TRUE) if(inherits(order_by_, "try-error")) { # parsing row names failed, so look for a time-based column time.based.col <- vapply(x, is.timeBased, logical(1)) if(any(time.based.col)) { # use the first time-based column which.col <- which.max(time.based.col) order_by_ <- x[[which.col]] x <- x[, -which.col, drop = FALSE] } else { stop("could not convert row names to a date-time and could not find a time-based column") } } } else { order_by_ <- order.by } if(.RECLASS) { xx <- xts(x, order.by=order_by_, frequency=frequency, .CLASS='data.frame', ...) } else { xx <- xts(x, order.by=order_by_, frequency=frequency, ...) } xx } `as.data.frame.xts` <- function(x,row.names=NULL,optional=FALSE,...) { if(missing(row.names)) row.names <- as.character(index(x)) as.data.frame(coredata(x),row.names,optional,...) } xts/R/print.R0000644000176200001440000001142314702273202012550 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' Print An xts Time-Series Object #' #' Method for printing an extensible time-series object. #' #' @param x An xts object. #' @param fmt Passed to [`coredata()`][zoo::coredata] to format the time index. #' @param \dots Arguments passed to other methods. #' @param show.rows The number of first and last rows to print if the number of #' rows is truncated (default 10, or `getOption("xts.print.show.rows")`). #' @param max.rows The output will contain at most `max.rows` rows before being #' truncated (default 100, or `getOption("xts.print.max.rows")`). #' #' @return Returns `x` invisibly. #' #' @author Joshua M. Ulrich #' #' @keywords print #' @examples #' #' data(sample_matrix) #' sample.xts <- as.xts(sample_matrix) #' #' # output is truncated and shows first and last 10 observations #' print(sample.xts) #' #' # show the first and last 5 observations #' print(sample.xts, show.rows = 5) #' print.xts <- function(x, fmt, ..., show.rows = 10, max.rows = 100) { check.TZ(x) nr <- NROW(x) nc <- NCOL(x) dots <- list(...) if (missing(max.rows)) { # the user didn't specify a value; use the global option value if it's # set; if it's not set, use the default value max.rows <- getOption("xts.print.max.rows", max.rows) } # 'max' in print.default() takes precedence over 'show.rows' if (hasArg("max")) { # 'max' is the number of *elements* (not rows) to print if (nr < 1) { show.rows <- 0 } else { # convert 'max' to 'show.rows' if (!is.null(dots$max)) { show.rows <- trunc(dots$max / nc) } } } else if (missing(show.rows)) { # the user didn't specify a value; use the global option value if it's # set; if it's not set, use the default value show.rows <- getOption("xts.print.show.rows", show.rows) } if (missing(fmt)) { fmt <- tformat(x) } if (is.null(fmt)) { fmt <- TRUE } if (!hasArg("quote")) { dots$quote <- FALSE } if (!hasArg("right")) { dots$right <- TRUE } if (nr > max.rows && nr > 2 * show.rows) { # 'show.rows' can't be more than 2*nrow(x) or observations will be printed # twice, once before the "..." and once after. seq.row <- seq_len(show.rows) seq.col <- seq_len(nc) seq.n <- (nr - show.rows + 1):nr # format all the index values that will be printed, # so every row will have the same number of characters index <- format(index(x)[c(seq.row, seq.n)]) # combine the index values with the '...' separator index <- c(index[seq.row], "...", index[-c(seq.row, tail(seq.row, 1))]) # as.matrix() to ensure we have dims # unclass() avoids as.matrix() method dispatch m <- as.matrix(unclass(x)) # convert to data.frame to format each column individually m <- data.frame(m[c(seq.row, seq.n), seq.col, drop = FALSE]) m[] <- lapply(m, format) m <- as.matrix(m) # insert blank row between top and bottom rows y <- rbind(utils::head(m, show.rows), rep("", nc), utils::tail(m, show.rows)) rownames(y) <- format(index, justify = "right") colnames(y) <- colnames(m[, seq.col, drop = FALSE]) } else { y <- coredata(x, fmt) } if (length(y) == 0) { if (!is.null(dim(x))) { p <- structure(vector(storage.mode(y)), dim = dim(x), dimnames = list(format(index(x)), colnames(x))) print(p) } else { cat('Data:\n') print(vector(storage.mode(y))) cat('\n') cat('Index:\n') index <- index(x) if (length(index) == 0) { print(index) } else { print(str(index)) } } } else { # ensure 'y' has dims and row names if (is.null(dim(y))) { y_names <- as.character(index(x)) y <- matrix(y, nrow = length(y), dimnames = list(y_names, NULL)) } # Create column names as column indexes. if (is.null(colnames(y))) { colnames(y) <- paste0("[,", seq_len(ncol(y)), "]") } do.call("print", c(list(y), dots)) } invisible(x) } xts/R/period.apply.R0000644000176200001440000002070114654242576014041 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . .mean_by_column_message <- function(caller) { if (getOption("xts.message.period.apply.mean", TRUE)) { message("NOTE: `", caller, "(..., FUN = mean)` operates by column, unlike other math\n ", "functions (e.g. median, sum, var, sd). Please use `FUN = colMeans` instead,\n ", "and use `FUN = function(x) mean(x)` to take the mean of all columns. Set\n ", "`options(xts.message.period.apply.mean = FALSE)` to suppress this message.") } # changing this behavior will break code in the following dependencies: # # ATAforecasting/R/ATA_Find_Multi_Freq.R # bidask/R/utils.R # dsa/R/HelperFunctions.R # {.tomonth} # RavenR/inst/doc/Introduction_to_RavenR.R # RavenR/inst/doc/Introduction_to_RavenR.Rmd # RavenR/R/rvn_apply_wyearly.R # RavenR/R/rvn_monthly_vbias.R # rts/man/apply.monthly.Rd # rts/man/period.apply.Rd # RWDataPlyr/R/xts_helperFunctions.R } #' Apply Function Over Specified Interval #' #' Apply a specified function to data over intervals specified by `INDEX`. The #' intervals are defined as the observations from `INDEX[k]+1` to `INDEX[k+1]`, #' for `k = 1:(length(INDEX)-1)`. #' #' Similar to the rest of the apply family, `period.apply()` calculates the #' specified function's value over a subset of data. The primary difference is #' that `period.apply()` applies the function to non-overlapping intervals of a #' vector or matrix. #' #' Useful for applying functions over an entire data object by any #' non-overlapping intervals. For example, when `INDEX` is the result of a #' call to `endpoints()`. #' #' `period.apply()` checks that `INDEX` is sorted, unique, starts with 0, and #' ends with `nrow(x)`. All those conditions are true of vectors returned by #' `endpoints()`. #' #' @param x The data that `FUN` will be applied to. #' @param INDEX A numeric vector of index breakpoint locations. The vector #' should begin with 0 and end with `nrow(x)`. #' @param FUN A function to apply to each interval in `x`. #' @param \dots Additional arguments for `FUN`. #' #' @return An object with `length(INDEX) - 1` observations, assuming `INDEX` #' starts with 0 and ends with `nrow(x)`. #' #' @note When `FUN = mean` the results will contain one column for every #' column in the input, which is different from other math functions (e.g. #' `median`, `sum`, `prod`, `sd`, etc.). #' #' `FUN = mean` works by column because the default method `stats::mean` #' previously worked by column for matrices and data.frames. R Core changed the #' behavior of `mean` to always return one column in order to be consistent #' with the other math functions. This broke some \pkg{xts} dependencies and #' `mean.xts()` was created to maintain the original behavior. #' #' Using `FUN = mean` will print a message that describes this inconsistency. #' To avoid the message and confusion, use `FUN = colMeans` to calculate means #' by column and use `FUN = function(x) mean` to calculate one mean for all the #' data. Set `options(xts.message.period.apply.mean = FALSE)` to suppress this #' message. #' #' @author Jeffrey A. Ryan, Joshua M. Ulrich #' #' @seealso [`endpoints()`] [`apply.monthly()`] #' #' @keywords utilities #' @examples #' #' zoo.data <- zoo(rnorm(31)+10,as.Date(13514:13744,origin="1970-01-01")) #' ep <- endpoints(zoo.data,'weeks') #' period.apply(zoo.data, INDEX=ep, FUN=function(x) colMeans(x)) #' period.apply(zoo.data, INDEX=ep, FUN=colMeans) #same #' #' period.apply(letters,c(0,5,7,26), paste0) #' `period.apply` <- function(x, INDEX, FUN, ...) { if (deparse(substitute(FUN))[1] == "mean") { .mean_by_column_message("period.apply") } x <- try.xts(x, error = FALSE) FUN <- match.fun(FUN) if(!isOrdered(INDEX)) { # isOrdered returns FALSE if there are duplicates INDEX <- sort(unique(INDEX)) } if(INDEX[1] != 0) { INDEX <- c(0, INDEX) } if(last(INDEX) != NROW(x)) { INDEX <- c(INDEX, NROW(x)) } xx <- sapply(1:(length(INDEX) - 1), function(y) { FUN(x[(INDEX[y] + 1):INDEX[y + 1]], ...) }) if(is.vector(xx)) xx <- t(xx) xx <- t(xx) if(is.null(colnames(xx)) && NCOL(x)==NCOL(xx)) colnames(xx) <- colnames(x) reclass(xx, x[INDEX]) } #' @rdname apply.monthly `apply.daily` <- function(x,FUN, ...) { if (deparse(substitute(FUN))[1] == "mean") { .mean_by_column_message("apply.daily") } ep <- endpoints(x,'days') period.apply(x,ep,FUN, ...) } #' @rdname apply.monthly `apply.weekly` <- function(x,FUN, ...) { if (deparse(substitute(FUN))[1] == "mean") { .mean_by_column_message("apply.weekly") } ep <- endpoints(x,'weeks') period.apply(x,ep,FUN, ...) } #' Apply Function over Calendar Periods #' #' Apply a specified function to each distinct period in a given time series #' object. #' #' Simple mechanism to apply a function to non-overlapping time periods, e.g. #' weekly, monthly, etc. Different from rolling functions in that this will #' subset the data based on the specified time period (implicit in the call), #' and return a vector of values for each period in the original data. #' #' Essentially a wrapper to the \pkg{xts} functions `endpoints()` and #' `period.apply()`, mainly as a convenience. #' #' @param x A time-series object coercible to xts. #' @param FUN A function to apply to each period. #' @param \dots Additional arguments to `FUN`. #' #' @return A vector of results produced by `FUN`, corresponding to the #' appropriate periods. #' #' @note When `FUN = mean` the results will contain one column for every #' column in the input, which is different from other math functions (e.g. #' `median`, `sum`, `prod`, `sd`, etc.). #' #' `FUN = mean` works by column because the default method `stats::mean` #' previously worked by column for matrices and data.frames. R Core changed the #' behavior of `mean` to always return one column in order to be consistent #' with the other math functions. This broke some \pkg{xts} dependencies and #' `mean.xts()` was created to maintain the original behavior. #' #' Using `FUN = mean` will print a message that describes this inconsistency. #' To avoid the message and confusion, use `FUN = colMeans` to calculate means #' by column and use `FUN = function(x) mean` to calculate one mean for all the #' data. Set `options(xts.message.period.apply.mean = FALSE)` to suppress this #' message. #' #' @author Jeffrey A. Ryan #' #' @seealso [`endpoints()`], [`period.apply()`], [`to.monthly()`] #' #' @keywords utilities #' @examples #' #' xts.ts <- xts(rnorm(231),as.Date(13514:13744,origin="1970-01-01")) #' #' start(xts.ts) #' end(xts.ts) #' #' apply.monthly(xts.ts,colMeans) #' apply.monthly(xts.ts,function(x) var(x)) #' `apply.monthly` <- function(x,FUN, ...) { if (deparse(substitute(FUN))[1] == "mean") { .mean_by_column_message("apply.monthly") } ep <- endpoints(x,'months') period.apply(x,ep,FUN, ...) } #' @rdname apply.monthly `apply.quarterly` <- function(x,FUN, ...) { if (deparse(substitute(FUN))[1] == "mean") { .mean_by_column_message("apply.quarterly") } ep <- endpoints(x,'quarters') period.apply(x,ep,FUN, ...) } #' @rdname apply.monthly `apply.yearly` <- function(x,FUN, ...) { if (deparse(substitute(FUN))[1] == "mean") { .mean_by_column_message("apply.yearly") } ep <- endpoints(x,'years') period.apply(x,ep,FUN, ...) } period_apply <- function(x, INDEX, FUN, ...) { fun <- substitute(FUN) e <- new.env() if (INDEX[1] != 0) { INDEX <- c(0, INDEX) } if (INDEX[length(INDEX)] != NROW(x)) { INDEX <- c(INDEX, NROW(x)) } pl <- .Call(C_xts_period_apply, x, INDEX, fun, e) .xts(do.call(rbind, pl), .index(x)[INDEX], tclass = tclass(x), tzone = tzone(x)) } xts/R/index.R0000644000176200001440000003260314654242576012546 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' Get and Replace the Class of an xts Index #' #' Functions to get and replace an xts object's index values and it's #' components. #' #' An xts object's index is stored internally as the number of seconds since #' UNIX epoch in the UTC timezone. The `.index()` and `.index<-` functions get #' and replace the internal numeric value of the index, respectively. These #' functions are primarily for internal use, but are exported because they may #' be useful for users. #' #' The replacement method also updates the [`tclass()`] and [`tzone()`] of the #' index to match the class and timezone of the new index, respectively. The #' `index()` method converts the internal numeric index to the class specified #' by the 'tclass' attribute and with the timezone specified by the 'tzone' #' attribute before returning the index values to the user. #' #' The `.indexXXX()` functions below extract time components from the internal #' time index. They return values like the values of [POSIXlt] components. #' #' \describe{ #' \item{`.indexsec`}{0 - 61: seconds of the minute (local time)} #' \item{`.indexmin`}{0 - 59: minutes of the hour (local time)} #' \item{`.indexhour`}{0 - 23: hours of the day (local time)} #' \item{`.indexDate`}{date as seconds since the epoch (UTC *not local time*} #' \item{`.indexday`}{date as seconds since the epoch (UTC *not local time*} #' \item{`.indexwday`}{0 - 6: day of the week (Sunday - Saturday, local time)} #' \item{`.indexmday`}{1 - 31: day of the month (local time)} #' \item{`.indexweek`}{weeks since the epoch (UTC *not local time*} #' \item{`.indexmon`}{0 - 11: month of the year (local time)} #' \item{`.indexyear`}{years since 1900 (local time)} #' \item{`.indexyday`}{0 - 365: day of the year (local time, 365 only in leap years)} #' \item{`.indexisdst`}{1, 0, -1: Daylight Saving Time flag. Positive if #' Daylight Saving Time is in effect, zero if not, negative if unknown.} #' } #' #' Changes in timezone, index class, and index format internal structure, by #' \pkg{xts} version: #' #' \describe{ #' \item{Version 0.12.0:}{The `.indexTZ`, `.indexCLASS` and `.indexFORMAT` #' attributes are no longer stored on xts objects, only on the index itself. #' \cr\cr #' The `indexTZ()`, `indexClass()`, and `indexFormat()` functions (and #' their respective replacement methods) are deprecated in favor of their #' respective `tzone()`, `tclass()`, and `tformat()` versions. The previous #' versions throw a warning that they're deprecated, but they will continue #' to work. They will never be removed or throw an error. Ever. #' \cr\cr #' The new versions are careful to look for the old attributes on the xts #' object, in case they're ever called on an xts object that was created prior #' to the attributes being added to the index itself. #' \cr\cr #' You can set `options(xts.warn.index.missing.tzone = TRUE)` and #' `options(xts.warn.index.missing.tclass = TRUE)` to identify xts objects #' that do not have a 'tzone' or 'tclass' attribute on the index, even if #' there is a 'tzone' or 'tclass' attribute on the xts object itself. The #' warnings will be thrown when the object is printed. #' Use `x <- as.xts(x)` to update these objects to the new structure.} #' #' \item{Version 0.9.8:}{The index timezone is now set to "UTC" for time classes #' that do not have any intra-day component (e.g. days, months, quarters). #' Previously the timezone was blank, which meant "local time" as determined by #' \R and the OS.} #' #' \item{Version 0.9.2:}{There are new get/set methods for the timezone, index #' class, and index format attributes: `tzone()` and, `tzone<-`, `tclass()` #' and `tclass<-`, and `tformat()` and `tformat<-`. These new functions are #' aliases to their `indexTZ()`, `indexClass()`, and `indexFormat()` #' counterparts.} #' #' \item{Version 0.7.5:}{The timezone, index class, and index format were added #' as attributes to the index itself, as 'tzone', 'tclass', and 'tformat', #' respectively. This is in order to remove those three attributes from the xts #' object, so they're only on the index itself. #' \cr\cr #' The `indexTZ()`, `indexClass()`, and `indexFormat()` functions (and their #' respective replacement methods) will continue to work as in prior \pkg{xts} #' versions. The attributes on the index take priority over their respective #' counterparts that may be on the xts object.} #' #' \item{Versions 0.6.4 and prior:}{Objects track their timezone and index class #' in their '.indexTZ' and '.indexCLASS' attributes, respectively.} #' } #' #' @param x An xts object. #' @param value A new time index value. #' @param \dots Arguments passed to other methods. #' #' @author Jeffrey A. Ryan #' #' @seealso [`tformat()`] describes how the index values are formatted when #' printed, [`tclass()`] documents how \pkg{xts} handles the index class, and #' [`tzone()`] has more information about index timezone settings. #' #' @keywords ts utilities #' @examples #' #' x <- timeBasedSeq('2010-01-01/2010-01-01 12:00/H') #' x <- xts(seq_along(x), x) #' #' # the index values, converted to 'tclass' (POSIXct in this case) #' index(x) #' class(index(x)) # POSIXct #' tclass(x) # POSIXct #' #' # the internal numeric index #' .index(x) #' # add 1 hour (3600 seconds) to the numeric index #' .index(x) <- index(x) + 3600 #' index(x) #' #' y <- timeBasedSeq('2010-01-01/2010-01-02 12:00') #' y <- xts(seq_along(y), y) #' #' # Select all observations in the first 6 and last 3 minutes of the #' # 8th and 15th hours on each day #' y[.indexhour(y) %in% c(8, 15) & .indexmin(y) %in% c(0:5, 57:59)] #' #' i <- 0:60000 #' focal_date <- as.numeric(as.POSIXct("2018-02-01", tz = "UTC")) #' y <- .xts(i, c(focal_date + i * 15), tz = "UTC", dimnames = list(NULL, "value")) #' #' # Select all observations for the first minute of each hour #' y[.indexmin(y) == 0] #' #' # Select all observations on Monday #' mon <- y[.indexwday(y) == 1] #' head(mon) #' tail(mon) #' unique(weekdays(index(mon))) # check #' #' # Disjoint time of day selections #' #' # Select all observations between 08:30 and 08:59:59.9999 or between 12:00 and 12:14:59.99999: #' y[.indexhour(y) == 8 & .indexmin(y) >= 30 | .indexhour(y) == 12 & .indexmin(x) %in% 0:14] #' #' ### Compound selections #' #' # Select all observations for Wednesdays or Fridays between 9am and 4pm (exclusive of 4pm): #' y[.indexwday(y) %in% c(3, 5) & (.indexhour(y) %in% c(9:15))] #' #' # Select all observations on Monday between 8:59:45 and 09:04:30: #' #' y[.indexwday(y) == 1 & (.indexhour(y) == 8 & .indexmin(y) == 59 & .indexsec(y) >= 45 | #' .indexhour(y) == 9 & #' (.indexmin(y) < 4 | .indexmin(y) == 4 & .indexsec(y) <= 30))] #' #' i <- 0:30000 #' u <- .xts(i, c(focal_date + i * 1800), tz = "UTC", dimnames = list(NULL, "value")) #' #' # Select all observations for January or February: #' u[.indexmon(u) %in% c(0, 1)] #' #' # Select all data for the 28th to 31st of each month, excluding any Fridays: #' u[.indexmday(u) %in% 28:31 & .indexwday(u) != 5] #' #' # Subset by week since origin #' unique(.indexweek(u)) #' origin <- xts(1, as.POSIXct("1970-01-01")) #' unique(.indexweek(origin)) #' #' # Select all observations in weeks 2515 to 2517. #' u2 <- u[.indexweek(u) %in% 2515:2517] #' head(u2); tail(u2) #' #' # Select all observations after 12pm for day 50 and 51 in each year #' u[.indexyday(u) %in% 50:51 & .indexhour(u) >= 12] #' index.xts <- function(x, ...) { value <- tclass(x) if(is.null(value) || !nzchar(value[1L])) { warning("index does not have a ", sQuote("tclass"), " attribute\n", " returning c(\"POSIXct\", \"POSIXt\")") ix <- .index(x) attr(ix, "tclass") <- attr(ix, "class") <- c("POSIXct", "POSIXt") return(ix) } # if tclass is Date, POSIXct time is set to 00:00:00 GMT. Convert here # to avoid ugly and hard to debug TZ conversion. What will this break? if(value[[1]] == "Date") #return( as.Date(.index(x)/86400) ) return( structure(.index(x) %/% 86400, class="Date")) #x.index <- structure(.index(x), class=c("POSIXct","POSIXt")) x.index <- .POSIXct(.index(x), tz=attr(.index(x), "tzone")) if(!is.list(value)) value <- as.list(value) switch(value[[1]], multitime = as.Date(as.character(x.index)), POSIXt = { # get specific ct/lt value do.call(paste('as',value[[2]],sep='.'),list(x.index)) }, POSIXct = as.POSIXct(x.index), POSIXlt = as.POSIXlt(x.index), timeDate = { if(!requireNamespace("timeDate", quietly=TRUE)) stop("package:",dQuote("timeDate"),"cannot be loaded.") timeDate::as.timeDate(x.index) }, chron = , dates = { if(!requireNamespace("chron", quietly=TRUE)) stop("package:",dQuote("chron"),"cannot be loaded.") chron::as.chron(format(x.index)) }, #Date = as.Date(as.character(x.index)), # handled above yearmon = as.yearmon(x.index), yearqtr = as.yearqtr(x.index), stop(paste('unsupported',sQuote('tclass'),'indexing type:',value[[1]])) ) } #' @rdname index.xts `index<-.xts` <- function(x, value) { if(length(index(x)) != length(value)) stop('length of index vectors does not match') if( !timeBased(value) ) stop(paste('unsupported',sQuote('index'), 'index type of class',sQuote(class(value)))) # copy original index attributes ixattr <- attributes(attr(x, 'index')) # set index to the numeric value of the desired index class if(inherits(value,"Date")) attr(x, 'index') <- structure(unclass(value)*86400, tclass="Date", tzone="UTC") else attr(x, 'index') <- as.numeric(as.POSIXct(value)) # ensure new index is sorted if(!isOrdered(.index(x), strictly=FALSE)) stop("new index needs to be sorted") # set tclass attribute to the end-user specified class attr(attr(x, 'index'), 'tclass') <- class(value) # set tzone attribute if(isClassWithoutTZ(object = value)) { attr(attr(x, 'index'), 'tzone') <- 'UTC' } else { if (is.null(attr(value, 'tzone'))) { # ensure index has tzone attribute if value does not attr(attr(x, 'index'), 'tzone') <- ixattr[["tzone"]] } else { attr(attr(x, 'index'), 'tzone') <- attr(value, 'tzone') } } return(x) } #' @rdname index.xts `time<-.xts` <- `index<-.xts` #' @rdname index.xts time.xts <- index.xts #' @rdname index.xts `.index` <- function(x, ...) { if(is.list(attr(x, "index"))) { attr(x, 'index')[[1]] } else attr(x, "index") } #' @rdname index.xts `.index<-` <- function(x, value) { if(timeBased(value)) { if(inherits(value, 'Date')) { attr(x, 'index') <- as.numeric(value) } else { attr(x, 'index') <- as.numeric(as.POSIXct(value)) } } else if(is.numeric(value)) { attr(value, 'tclass') <- tclass(x) attr(value, 'tzone') <- tzone(x) attr(x, 'index') <- value } else stop(".index is used for low level operations - data must be numeric or timeBased") return(x) } #' @rdname index.xts `.indexsec` <- function(x) { as.POSIXlt(.POSIXct(.index(x), tz=tzone(x)))$sec } #' @rdname index.xts `.indexmin` <- function(x) { as.POSIXlt(.POSIXct(.index(x), tz=tzone(x)))$min } #' @rdname index.xts `.indexhour` <- function(x) { as.POSIXlt(.POSIXct(.index(x), tz=tzone(x)))$hour } #' @rdname index.xts `.indexmday` <- function(x) { as.POSIXlt(.POSIXct(.index(x), tz=tzone(x)))$mday } #' @rdname index.xts `.indexmon` <- function(x) { as.POSIXlt(.POSIXct(.index(x), tz=tzone(x)))$mon } #' @rdname index.xts `.indexyear` <- function(x) { as.POSIXlt(.POSIXct(.index(x), tz=tzone(x)))$year } #' @rdname index.xts `.indexwday` <- function(x) { as.POSIXlt(.POSIXct(.index(x), tz=tzone(x)))$wday } #' @rdname index.xts `.indexbday` <- function(x) { # is business day T/F as.POSIXlt(.POSIXct(.index(x), tz=tzone(x)))$wday %% 6 > 0 } #' @rdname index.xts `.indexyday` <- function(x) { as.POSIXlt(.POSIXct(.index(x), tz=tzone(x)))$yday } #' @rdname index.xts `.indexisdst` <- function(x) { as.POSIXlt(.POSIXct(.index(x), tz=tzone(x)))$isdst } #' @rdname index.xts `.indexDate` <- function(x) { .index(x) %/% 86400L } #' @rdname index.xts `.indexday` <- .indexDate #' @rdname index.xts `.indexweek` <- function(x) { (.index(x) + (3 * 86400)) %/% 86400 %/% 7 } #' @rdname index.xts `.indexyweek` <- function(x) { ((.index(x) + (3 * 86400)) %/% 86400 %/% 7) - ((startOfYear() * 86400 + (3 * 86400)) %/% 86400 %/% 7)[.indexyear(x) + 1] } #' @rdname index.xts `convertIndex` <- function(x,value) { tclass(x) <- value x } .update_index_attributes <- function(x) { suppressWarnings({ tclass(x) <- tclass(x) tzone(x) <- tzone(x) }) return(x) } xts/R/toperiod.R0000644000176200001440000003043214654242576013262 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' Convert time series data to an OHLC series #' #' Convert an OHLC or univariate object to a specified periodicity lower than #' the given data object. For example, convert a daily series to a monthly #' series, or a monthly series to a yearly one, or a one minute series to an #' hourly series. #' #' The result will contain the open and close for the given period, as well as #' the maximum and minimum over the new period, reflected in the new high and #' low, respectively. Aggregate volume will also be calculated if applicable. #' #' An easy and reliable way to convert one periodicity of data into any new #' periodicity. It is important to note that all dates will be aligned to the #' *end* of each period by default - with the exception of `to.monthly()` and #' `to.quarterly()`, which use the \pkg{zoo} package's [yearmon][zoo::zoo] and #' [yearqtr][zoo::zoo] classes, respectively. #' #' Valid period character strings include: `"seconds"`, `"minutes"`, `"hours"`, #' `"days"`, `"weeks"`, `"months"`, `"quarters"`, and `"years"`. These are #' calculated internally via [`endpoints()`]. See that function's help page for #' further details. #' #' To adjust the final indexing style, it is possible to set `indexAt` to one #' of the following: \sQuote{yearmon}, \sQuote{yearqtr}, \sQuote{firstof}, #' \sQuote{lastof}, \sQuote{startof}, or \sQuote{endof}. The final index will #' then be `yearmon`, `yearqtr`, the first time of the period, the last time #' of the period, the starting time in the data for that period, or the ending #' time in the data for that period, respectively. #' #' It is also possible to pass a single time series, such as a univariate #' exchange rate, and return an OHLC object of lower frequency - e.g. the #' weekly OHLC of the daily series. #' #' Setting `drop.time = TRUE` (the default) will convert a series that includes #' a time component into one with just a date index, since the time component #' is often of little value in lower frequency series. #' #' @param x A univariate or OHLC type time-series object. #' @param period Period to convert to. See details. #' @param indexAt Convert final index to new class or date. See details. #' @param drop.time Remove time component of POSIX datestamp (if any)? #' @param k Number of sub periods to aggregate on (only for minutes and #' seconds). #' @param name Override column names? #' @param OHLC Should an OHLC object be returned? (only `OHLC = TRUE` #' currently supported) #' @param \dots Additional arguments. #' #' @return An object of the original type, with new periodicity. #' #' @note In order for this function to work properly on OHLC data, it is #' necessary that the Open, High, Low and Close columns be names as such; #' including the first letter capitalized and the full spelling found. #' Internally a call is made to reorder the data into the correct column order, #' and then a verification step to make sure that this ordering and naming has #' succeeded. All other data formats must be aggregated with functions such as #' `aggregate()` and `period.apply()`. #' #' This method should work on almost all time-series-like objects. Including #' \sQuote{timeSeries}, \sQuote{zoo}, \sQuote{ts}, and \sQuote{irts}. It is #' even likely to work well for other data structures - including #' \sQuote{data.frames} and \sQuote{matrix} objects. #' #' Internally a call to `as.xts()` converts the original `x` into the #' universal xts format, and then re-converts back to the original type. #' #' A special note with respect to \sQuote{ts} objects. As these are strictly #' regular they may include `NA` values. These are removed before aggregation, #' though replaced before returning the result. This inevitably leads to many #' additional `NA` values in the result. Consider using an xts object or #' converting to xts using `as.xts()`. #' #' @author Jeffrey A. Ryan #' #' @keywords utilities #' @aliases to_period #' @examples #' #' data(sample_matrix) #' #' samplexts <- as.xts(sample_matrix) #' #' to.monthly(samplexts) #' to.monthly(sample_matrix) #' #' str(to.monthly(samplexts)) #' str(to.monthly(sample_matrix)) #' to.period <- to_period <- function(x, period='months', k=1, indexAt=NULL, name=NULL, OHLC=TRUE, ...) { if(missing(name)) name <- deparse(substitute(x)) xo <- x x <- try.xts(x) if(NROW(x)==0 || NCOL(x)==0) stop(sQuote("x")," contains no data") if(any(is.na(x))) { x <- na.omit(x) warning("missing values removed from data") } if(is.character(period)) { ep <- endpoints(x, period, k) } else { if(!is.numeric(period)) { stop("'period' must be a character or a vector of endpoint locations") } if(!missing("k")) { warning("'k' is ignored when using custom 'period' locations") } if(!is.null(indexAt)) { warning("'indexAt' is ignored when using custom 'period' locations") indexAt <- NULL } ep <- as.integer(period) # ensure 'ep' starts with 0 and ends with nrow(x) if(ep[1] != 0) { ep <- c(0L, ep) } if (ep[length(ep)] != NROW(x)) { ep <- c(ep, NROW(x)) } } if(!OHLC) { xx <- x[ep, ] } else { if(!is.null(indexAt)) { index_at <- switch(indexAt, "startof" = TRUE, # start time of period "endof" = FALSE, # end time of period FALSE ) } else index_at <- FALSE # make suitable name vector cnames <- c("Open", "High", "Low", "Close") if (has.Vo(x)) cnames <- c(cnames, "Volume") if (has.Ad(x) && is.OHLC(x)) cnames <- c(cnames, "Adjusted") cnames <- paste(name,cnames,sep=".") if(is.null(name)) cnames <- NULL xx <- .Call(C_toPeriod, x, ep, has.Vo(x), has.Vo(x,which=TRUE), has.Ad(x) && is.OHLC(x), index_at, cnames) } if(!is.null(indexAt)) { if(indexAt=="yearmon" || indexAt=="yearqtr") tclass(xx) <- indexAt if(indexAt=="firstof") { ix <- as.POSIXlt(c(.index(xx)), tz=tzone(xx)) if(period %in% c("years","months","quarters","days")) index(xx) <- firstof(ix$year + 1900, ix$mon + 1) else index(xx) <- firstof(ix$year + 1900, ix$mon + 1, ix$mday, ix$hour, ix$min, ix$sec) } if(indexAt=="lastof") { ix <- as.POSIXlt(c(.index(xx)), tz=tzone(xx)) if(period %in% c("years","months","quarters","days")) index(xx) <- as.Date(lastof(ix$year + 1900, ix$mon + 1)) else index(xx) <- lastof(ix$year + 1900, ix$mon + 1, ix$mday, ix$hour, ix$min, ix$sec) } } reclass(xx,xo) } #' @rdname to.period `to.minutes` <- function(x,k,name,...) { if(missing(name)) name <- deparse(substitute(x)) if(missing(k)) k <- 1 to.period(x,'minutes',k=k,name=name,...) } #' @rdname to.period `to.minutes3` <- function(x,name,...) { if(missing(name)) name <- deparse(substitute(x)) to.period(x,'minutes',k=3,name=name,...) } #' @rdname to.period `to.minutes5` <- function(x,name,...) { if(missing(name)) name <- deparse(substitute(x)) to.period(x,'minutes',k=5,name=name,...) } #' @rdname to.period `to.minutes10` <- function(x,name,...) { if(missing(name)) name <- deparse(substitute(x)) to.period(x,'minutes',k=10,name=name,...) } #' @rdname to.period `to.minutes15` <- function(x,name,...) { if(missing(name)) name <- deparse(substitute(x)) to.period(x,'minutes',k=15,name=name,...) } #' @rdname to.period `to.minutes30` <- function(x,name,...) { if(missing(name)) name <- deparse(substitute(x)) to.period(x,'minutes',k=30,name=name,...) } #' @rdname to.period `to.hourly` <- function(x,name,...) { if(missing(name)) name <- deparse(substitute(x)) to.period(x,'hours',name=name,...) } #' @rdname to.period `to.daily` <- function(x,drop.time=TRUE,name,...) { if(missing(name)) name <- deparse(substitute(x)) x <- to.period(x,'days',name=name,...) if(drop.time) x <- .drop.time(x) return(x) } #' @rdname to.period `to.weekly` <- function(x,drop.time=TRUE,name,...) { if(missing(name)) name <- deparse(substitute(x)) x <- to.period(x,'weeks',name=name,...) if(drop.time) x <- .drop.time(x) return(x) } #' @rdname to.period `to.monthly` <- function(x,indexAt='yearmon',drop.time=TRUE,name,...) { if(missing(name)) name <- deparse(substitute(x)) x <- to.period(x,'months',indexAt=indexAt,name=name,...) if(drop.time) x <- .drop.time(x) return(x) } #' @rdname to.period `to.quarterly` <- function(x,indexAt='yearqtr',drop.time=TRUE,name,...) { if(missing(name)) name <- deparse(substitute(x)) x <- to.period(x,'quarters',indexAt=indexAt,name=name,...) if(drop.time) x <- .drop.time(x) return(x) } #' @rdname to.period `to.yearly` <- function(x,drop.time=TRUE,name,...) { if(missing(name)) name <- deparse(substitute(x)) x <- to.period(x,'years',name=name,...) if(drop.time) x <- .drop.time(x) return(x) } `.drop.time` <- function(x) { # function to remove HHMMSS portion of time index xts.in <- is.xts(x) # is the input xts? if(!xts.in) # if not, try to convert to xts x <- try.xts(x, error=FALSE) if(is.xts(x)) { # if x is xts, drop HHMMSS from index if(any(tclass(x)=='POSIXt')) { # convert index to Date index(x) <- as.Date(as.POSIXlt(index(x))) tclass(x) <- "Date" # set tclass to Date } if(isClassWithoutTZ(tclass(x))) { tzone(x) <- "UTC" # set tzone to UTC } # force conversion, even if we didn't set tclass to Date # because indexAt yearmon/yearqtr won't drop time from index index(x) <- index(x) if(xts.in) x # if input already was xts else reclass(x) # if input wasn't xts, but could be converted } else x # if input wasn't xts, and couldn't be converted } `by.period` <- function(x, FUN, on=Cl, period="days", k=1, fill=na.locf, ...) { # aggregate 'x' to a higher periodicity, apply 'FUN' to the 'on' columns # of the aggregate, then merge the aggregate results with 'x' and fill NAs # with na.locf. E.g. you can apply a 5-day SMA of volume to tick data. x <- try.xts(x, error = FALSE) FUN <- match.fun(FUN) on <- match.fun(on) # Allow function or name agg <- to.period(x, period, k, ...) res <- FUN(on(agg), ...) full <- merge(.xts(NULL,index(x)),res) full <- fill(full) # Allow function or value return(full) } `to.frequency` <- function(x, by, k=1, name=NULL, OHLC=TRUE, ...) { # similar to to.period, but aggregates on something other than time. # E.g. aggregate by volume, where a "period" is 10% of the 5-day volume SMA. # Most code pulled from to.period if(missing(name)) name <- deparse(substitute(x)) xo <- x x <- try.xts(x) if(any(is.na(x))) { x <- na.omit(x) warning("missing values removed from data") } # make suitable name vector cnames <- c("Open", "High", "Low", "Close") if (has.Vo(x)) cnames <- c(cnames, "Volume") if (has.Ad(x) && is.OHLC(x)) cnames <- c(cnames, "Adjusted") cnames <- paste(name,cnames,sep=".") if(is.null(name)) cnames <- NULL # start to.frequency-specific code if (missing(by)) by <- rep(1L, nrow(x)) byVec <- cumsum(by) bins <- byVec %/% k # ep contents must have the same format as output generated by endpoints(): # first element must be zero and last must be nrow(x) ep <- c(0L, which(diff(bins) != 0)) if (ep[length(ep)] != nrow(bins)) ep <- c(ep, nrow(bins)) # end to.frequency-specific code xx <- .Call(C_toPeriod, x, ep, has.Vo(x), has.Vo(x,which=TRUE), has.Ad(x) && is.OHLC(x), FALSE, cnames) reclass(xx,xo) } xts/R/timeDate.R0000644000176200001440000000156414654242576013175 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' @rdname as.xts as.xts.timeDate <- function(x, ...) { xts(x=NULL, order.by=x) } xts/R/str.R0000644000176200001440000000625714671414605012246 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . `str.xts` <- function(object, ..., ncols = 5) { is.data.empty <- is.null(dim(object)) || sum(dim(object)) == 0 is.zero.index <- (length(.index(object)) == 0) nr <- NROW(object) nc <- ifelse(is.data.empty, 0, NCOL(object)) # "zero-length" xts # * index length == 0, but tclass and tzone are set # * NROW == 0 # * NCOL > 0 and may have column names # examples: # str(.xts(1, 1)["1900"]) # str(.xts(cbind(a = 1, b = 2), 1)["1900"]) is.zero.length <- (is.zero.index && nr == 0 && !is.data.empty) # "zero-width" xts # * index length > 0 # * NROW == 0 # * NCOL == 0 # example: # str(.xts(, 1:5)) is.zero.width <- (!is.zero.index && is.data.empty) # "empty" xts # * index length == 0, but tclass and tzone are set # * NROW == 0 # * NCOL == 0 # example: # str(.xts(, numeric(0))) # str(.xts(matrix()[0,0], numeric(0))) is.empty <- (is.zero.index && is.data.empty) if (is.empty) { header <- "An empty xts object" } else if (is.zero.length) { header <- "A zero-length xts object" } else { # zero-width and regular xts objects if (is.zero.width) { header <- "A zero-width xts object on" } else { header <- "An xts object on" } time.range <- sub("/", " / ", .makeISO8601(object), fixed = TRUE) header <- paste(header, time.range, "containing:") } cat(header, "\n") # Data cat(sprintf(" Data: %s [%d, %d]\n", storage.mode(object), nr, nc)) # Column names cnames <- colnames(object) if (!is.null(cnames)) { if (nc > ncols) { more <- nc - ncols cname.str <- sprintf("%s ... with %d more %s", paste(cnames[seq_len(ncols)], collapse = ", "), more, ifelse(more > 1, "columns", "column")) } else { cname.str <- paste(colnames(object), collapse = ", ") } cat(sprintf(" Columns: %s\n", cname.str)) } # Index cat(sprintf(" Index: %s [%d] (TZ: \"%s\")\n", paste(tclass(object), collapse = ","), length(.index(object)), tzone(object))) if (!is.null(CLASS(object))) { cat(sprintf(" Original class: '%s'\n", CLASS(object))) } xts.attr <- xtsAttributes(object) if (!is.null(xts.attr)) { cat(" xts Attributes:\n") str(xts.attr, ..., comp.str = " $ ", no.list = TRUE) } invisible(NULL) } xts/R/start.R0000644000176200001440000000171314654242576012572 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . `start.xts` <- function(x, ...) { index(x[1,]) } `end.xts` <- function(x, ...) { if(length(x)==0) { index(x[length(.index(x)),]) } else index(x[NROW(x),]) } xts/R/origin.fix.R0000644000176200001440000000360414654242576013512 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # fixes for R new/broken as.Date, as.POSIXlt and as.POSIXct # hopefully to be removed when remedied in R # taken directly from 'base', with origin set to '1970-01-01' (1970-01-01) `as.Date.numeric` <- function(x, origin='1970-01-01', ...) { as.Date(origin,...) + x } `as.POSIXct.numeric` <- function(x, tz="", origin='1970-01-01', ...) { structure(x, class=c("POSIXct", "POSIXt")) } `as.POSIXlt.numeric` <- function(x, tz="", origin='1970-01-01', ...) { as.POSIXlt(as.POSIXct(origin,tz="UTC",...) + x, tz=tz) } as.POSIXct.Date <- function(x, ...) { as.POSIXct(as.character(x)) } as.Date.POSIXct <- function(x, ...) { as.Date(strftime(x)) } as.POSIXlt.Date <- function(x, ...) { as.POSIXlt(as.POSIXct.Date(x)) } as.POSIXct.dates <- function(x, ...) { # need to implement our own method to correctly handle TZ structure(as.POSIXct(as.POSIXlt(x, tz="GMT"), tz="GMT"),class=c("POSIXct","POSIXt")) } as.chron.POSIXct <- function(x, ...) { if(!requireNamespace('chron', quietly=TRUE)) as.chron <- function(...) message("package 'chron' required") structure(as.chron(as.POSIXlt(as.character(x)))) } xts/R/list.R0000644000176200001440000000213214654242576012404 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . as.list.xts <- function(x, ...) { if( NCOL(x) == 1 ) return(structure(list(x),.Names=colnames(x))) cindex <- cnames <- colnames(x) if(is.null(cnames)) { cindex <- 1:NCOL(x) cnames <- paste("x",cindex,sep=".") } names(cindex) <- cnames lapply(cindex, function(f) x[,f], ...) } xts/R/dimnames.R0000644000176200001440000000412014654242576013225 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # dimnames will return the actual dimnames of the xts object # dimnames<-.xts will force the rownames to always be NULL #' Dimnames of an xts Object #' #' Get or set dimnames of an xts object. #' #' For efficienty, xts objects do not have rownames (unlike zoo objects). #' Attempts to set rownames on an xts object will silently set them to `NULL`. #' This is done for internal compatibility reasons, as well as to provide #' consistency in performance regardless of object use. #' #' @param x An xts object. #' @param value A two element list. See Details. #' #' @return A list or character string containing coerced row names and/or #' actual column names. #' #' Attempts to set rownames on xts objects via rownames or dimnames will #' silently fail. #' #' @note Unlike zoo, all xts objects have dimensions. xts objects cannot be #' plain vectors. #' #' @author Jeffrey A. Ryan #' #' @seealso [`xts()`] #' #' @keywords misc #' @examples #' #' x <- xts(1:10, Sys.Date()+1:10) #' dimnames(x) #' rownames(x) #' rownames(x) <- 1:10 #' rownames(x) #' str(x) #' `dimnames.xts` <- function(x) { #list(NULL, colnames(unclass(x))) .Call(C_dimnames_zoo,x); #list(as.character(index(x)), colnames(unclass(x))) } #' @rdname dimnames.xts `dimnames<-.xts` <- function(x, value) { .Call(C_xts_set_dimnames, x, value) } xts/R/irts.R0000644000176200001440000000301714654242576012415 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # methods for tseries::irts `re.irts` <- function(x,...) { if(!requireNamespace('tseries', quietly=TRUE)) { irts <- function(...) message("package 'tseries' is required for re.irts") } else { irts <- tseries::irts } tclass(x) <- "POSIXct" xx <- coredata(x) # rownames(xx) <- attr(x,'irts.rownames') irts(index(x),xx) } #' @rdname as.xts `as.xts.irts` <- function(x,order.by,frequency=NULL,...,.RECLASS=FALSE) { if(.RECLASS) { xx <- xts(x=x$value, order.by=x$time, frequency=frequency, .CLASS='irts', # irts.rownames=rownames(x$value), ...) } else { xx <- xts(x=x$value, order.by=x$time, frequency=frequency, ...) } xx } xts/R/nperiods.R0000644000176200001440000000445414654242576013265 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' @rdname ndays `nseconds` <- function(x) { length(endpoints(x,on='seconds'))-1 } #' @rdname ndays `nminutes` <- function(x) { length(endpoints(x,on='minutes'))-1 } #' @rdname ndays `nhours` <- function(x) { length(endpoints(x,on='hours'))-1 } #' Number of Periods in Data #' #' Calculate the number of specified periods in a given time series like data #' object. #' #' Essentially a wrapper to `endpoints()` with the appropriate period #' specified. The result is the number of endpoints found. #' #' As a compromise between simplicity and accuracy, the results will always #' round up to the nearest complete period. Subtract 1 from the result to #' get the completed periods. #' #' For finer grain detail one should call the higher frequency functions. #' #' An alternative summary can be found with `periodicity(x)` and #' `unclass(periodicity(x))`. #' #' @param x A time-based object. #' #' @return The number of respective periods in `x`. #' #' @author Jeffrey A. Ryan #' #' @seealso [`endpoints()`] #' #' @keywords utilities #' @examples #' #' \dontrun{ #' getSymbols("QQQQ") #' #' ndays(QQQQ) #' nweeks(QQQQ) #' } #' `ndays` <- function(x) { length(endpoints(x,on='days'))-1 } #' @rdname ndays `nweeks` <- function(x) { length(endpoints(x,on='weeks'))-1 } #' @rdname ndays `nmonths` <- function(x) { length(endpoints(x,on='months'))-1 } #' @rdname ndays `nquarters` <- function(x) { length(endpoints(x,on='quarters'))-1 } #' @rdname ndays `nyears` <- function(x) { length(endpoints(x,on='years'))-1 } xts/R/matrix.R0000644000176200001440000000474514654242576012751 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # functions for matrix <--> xts conversions `as.matrix.xts` <- function(x, ...) { # This function follows the pattern of as.matrix.zoo() cd <- coredata(x) y <- as.matrix(cd, ...) if (length(cd) == 0) { dim(y) <- c(0, 0) } # colnames if (length(y) > 0) { cnx <- colnames(x) if (length(cnx) > 0) { colnames(y) <- cnx } else { cn <- deparse(substitute(x), width.cutoff = 100, nlines = 1) if (NCOL(x) == 1) { colnames(y) <- cn } else { colnames(y) <- paste(cn, 1:ncol(x), sep = ".") } } } else if (nrow(y) != length(.index(x))) { dim(y) <- c(length(.index(x)), 0) } # rownames if (!is.null(y) && nrow(y) > 0 && is.null(rownames(y))) { rownames(y) <- as.character(index(x)) } y } `re.matrix` <- function(x,...) { as.matrix(x,...) } #' @rdname as.xts `as.xts.matrix` <- function(x,order.by,dateFormat="POSIXct",frequency=NULL,...,.RECLASS=FALSE) { # Should allow 'order.by' to be a vector of dates or a scaler # representing the column number to use. if(missing(order.by)) { # The 'index' of zoo objects is set to 'rownames' when converted with 'as.matrix', # but it is of class 'Date', not 'POSIXct'... - jmu if(is.null(rownames(x))) stop("order.by must be either 'rownames()' or otherwise specified") else # added '...' args to allow for tz specification order.by <- do.call(paste('as',dateFormat,sep='.'),list(rownames(x))) } if(.RECLASS) { xx <- xts(x, order.by=order.by, frequency=frequency, .CLASS='matrix', ...) } else { xx <- xts(x, order.by=order.by, frequency=frequency, ...) } xx } xts/R/last.R0000644000176200001440000001171014654242576012376 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' @rdname first `last` <- function(x,...) { UseMethod("last") } #' @rdname first `last.default` <- function(x,n=1,keep=FALSE,...) { if(length(x) == 0) return(x) if(is.character(n)) { xx <- try.xts(x, error=FALSE) if(is.xts(xx)) { xx <- last.xts(x, n=n, keep=keep, ...) return(reclass(xx)) } } if(is.null(dim(x))) { if(n > 0) { sub <- seq.int(to = length(x), length.out = min(n, length(x))) xx <- x[sub] if(keep) xx <- structure(xx,keep=x[1:(NROW(x)+(-n))]) xx } else if(n < 0) { sub <- seq_len(max(length(x) + n, 0L)) xx <- x[sub] if(keep) xx <- structure(xx,keep=x[((NROW(x)-(-n)+1):NROW(x))]) xx } else { xx <- x[0] if(keep) xx <- structure(xx,keep=x[0]) xx } } else { if(n > 0) { sub <- seq.int(to = NROW(x), length.out = min(n, NROW(x))) xx <- x[sub,,drop=FALSE] if(keep) xx <- structure(xx,keep=x[1:(NROW(x)+(-n)),]) xx } else if(n < 0) { sub <- seq_len(max(NROW(x) + n, 0L)) xx <- x[sub,,drop=FALSE] if(keep) xx <- structure(xx,keep=x[((NROW(x)-(-n)+1):NROW(x)),]) xx } else { xx <- x[0,,drop=FALSE] if(keep) xx <- structure(xx,keep=x[0,]) xx } } } #' @rdname first `last.xts` <- function(x,n=1,keep=FALSE,...) { if(length(x) == 0) return(x) if(is.character(n)) { # n period set np <- strsplit(n," ",fixed=TRUE)[[1]] if(length(np) > 2 || length(np) < 1) stop(paste("incorrectly specified",sQuote("n"),sep=" ")) # series periodicity sp <- periodicity(x) sp.units <- sp[["units"]] # requested periodicity$units rpu <- np[length(np)] rpf <- ifelse(length(np) > 1, as.numeric(np[1]), 1) if(rpu == sp.units) { n <- rpf } else { # if singular - add an s to make it work if(substr(rpu,length(strsplit(rpu,'')[[1]]),length(strsplit(rpu,'')[[1]])) != 's') rpu <- paste(rpu,'s',sep='') u.list <- list(secs=4,seconds=4,mins=3,minutes=3,hours=2,days=1, weeks=1,months=1,quarters=1,years=1) dt.options <- c('seconds','secs','minutes','mins','hours','days', 'weeks','months','quarters','years') if(!rpu %in% dt.options) stop(paste("n must be numeric or use",paste(dt.options,collapse=','))) dt <- dt.options[pmatch(rpu,dt.options)] if(u.list[[dt]] > u.list[[sp.units]]) { # req is for higher freq data period e.g. 100 mins of daily data stop(paste("At present, without some sort of magic, it isn't possible", "to resolve",rpu,"from",sp$scale,"data")) } ep <- endpoints(x,dt) if(rpf > length(ep)-1) { rpf <- length(ep)-1 warning("requested length is greater than original") } if(rpf > 0) { n <- ep[length(ep)-rpf]+1 if(is.null(dim(x))) { xx <- x[n:NROW(x)] } else { xx <- x[n:NROW(x),,drop=FALSE] } if(keep) xx <- structure(xx,keep=x[1:(ep[length(ep)+(-rpf)])]) return(xx) } else if(rpf < 0) { n <- ep[length(ep)+rpf] if(is.null(dim(x))) { xx <- x[1:n] } else { xx <- x[1:n,,drop=FALSE] } if(keep) xx <- structure(xx,keep=x[(ep[length(ep)-(-rpf)]+1):NROW(x)]) return(xx) } else { if(is.null(dim(x))) { xx <- x[0] } else { xx <- x[0,,drop=FALSE] } if(keep) xx <- structure(xx,keep=x[0]) return(xx) } } } if(length(n) != 1) stop("n must be of length 1") if(n > 0) { n <- min(n, NROW(x)) if(is.null(dim(x))) { xx <- x[(NROW(x)-n+1):NROW(x)] } else { xx <- x[(NROW(x)-n+1):NROW(x),,drop=FALSE] } if(keep) xx <- structure(xx,keep=x[1:(NROW(x)+(-n))]) xx } else if(n < 0) { if(abs(n) >= NROW(x)) return(x[0]) if(is.null(dim(x))) { xx <- x[1:(NROW(x)+n)] } else { xx <- x[1:(NROW(x)+n),,drop=FALSE] } if(keep) xx <- structure(xx,keep=x[((NROW(x)-(-n)+1):NROW(x))]) xx } else { if(is.null(dim(x))) { xx <- x[0] } else { xx <- x[0,,drop=FALSE] } if(keep) xx <- structure(xx,keep=x[0]) xx } } xts/R/zoo.R0000644000176200001440000000331414654242576012243 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # functions to handle zoo <--> xts conversions `re.zoo` <- function(x,...) { xx <- coredata(x) xx <- zoo(xx, order.by=index(x), ...) if(length(dimnames(x)[[2]]) < 2) { dimnames(xx) <- NULL dim(xx) <- NULL attr(xx,'names') <- as.character(index(x)) } xx } #' @rdname as.xts `as.xts.zoo` <- function(x,order.by=index(x),frequency=NULL,...,.RECLASS=FALSE) { if(.RECLASS) { xx <- xts(coredata(x), # Cannot use 'zoo()' on objects of class 'zoo' - jmu order.by=order.by, frequency=frequency, .CLASS='zoo', ...) } else { xx <- xts(coredata(x), # Cannot use 'zoo()' on objects of class 'zoo' - jmu order.by=order.by, frequency=frequency, ...) } xx } `as.zoo.xts` <- function(x,...) { cd <- coredata(x); if( length(cd)==0 ) cd <- NULL zoo(cd, order.by=index(x), ...) } xts/R/timeBasedRange.R0000644000176200001440000000216514654242576014311 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' @rdname timeBasedSeq `timeBasedRange` <- function(x, ...) { # convert unquoted time range to if (!is.character(x)) x <- deparse(match.call()$x) # determine start and end points tblist <- timeBasedSeq(x,NULL) # if(!is.null(tblist$length.out)) # return(tblist$from) c(as.numeric(tblist$from), as.numeric(tblist$to)) } xts/R/coredata.xts.R0000644000176200001440000001517514654242576014043 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' Extract/Replace Core Data of an xts Object #' #' Mechanism to extract and replace the core data of an xts object. #' #' Extract coredata of an xts object - removing all attributes except #' `dim` and `dimnames` and returning a matrix object with rownames #' converted from the index of the xts object. #' #' The rownames of the result use the format specified by `tformat(x)` when #' `fmt = TRUE`. When `fmt` is a character string to be passed to `format()`. #' See [`strptime()`] for valid format strings. Setting `fmt = FALSE` will #' return the row names by simply coercing the index class to a character #' string in the default manner. #' #' `xcoredata()` is the complement to `coredata()`. It returns all of the #' attributes normally removed by `coredata()`. Its purpose, along with the #' the replacement function `xcoredata<-` is primarily for developers using #' \pkg{xts}' [`try.xts()`] and [`reclass()`] functionality inside functions #' so the functions can take any time series class as an input and return the #' same time series class. #' #' @param x An xts object. #' @param fmt Should the rownames be formated using `tformat()`? Alternatively #' a date/time string to be passed to `format()`. See details. #' @param value Non-core attributes to assign. #' @param \dots Unused. #' #' @return Returns either a matrix object for coredata, or a list of named #' attributes. #' #' The replacement functions are called for their side-effects. #' #' @author Jeffrey A. Ryan #' #' @seealso [`coredata()`][zoo::zoo], [`xtsAttributes()`] #' #' @keywords utilities #' @examples #' #' data(sample_matrix) #' x <- as.xts(sample_matrix, myattr=100) #' coredata(x) #' xcoredata(x) #' coredata.xts <- function(x, fmt=FALSE, ...) { x.attr <- attributes(x) if(is.character(fmt)) { tformat(x) <- fmt fmt <- TRUE } if(length(x) > 0 && fmt) { if(!is.null(tformat(x))) { x.attr$dimnames <- list(format(index(x), format=tformat(x)), dimnames(x)[[2]]) tformat(x) <- NULL # remove before printing } else { x.attr$dimnames <- list(format(index(x)),dimnames(x)[[2]]) } #attributes not to be kept original.attr <- x.attr[!names(x.attr) %in% c('dim','dimnames')] if(is.null(dim(x))) { xx <- structure(coredata(x), names=x.attr$dimnames[[1]]) } else { xx <- structure(coredata(x), dim=dim(x), dimnames=x.attr$dimnames) } for(i in names(original.attr)) { attr(xx,i) <- NULL } return(xx) } if(length(x) == 0) { xx <- NextMethod(x) attr(xx, ".indexCLASS") <- NULL attr(xx, "tclass") <- NULL # Remove tz attrs (object created before 0.10-3) attr(xx, ".indexTZ") <- NULL attr(xx, "tzone") <- NULL return(xx) } else return(.Call(C_coredata_xts, x)) } `xcoredata.default` <- function(x,...) { x.attr <- attributes(x) original.attr <- x.attr[!names(x.attr) %in% c('dim','dimnames')] original.attr } #' @rdname coredata.xts `xcoredata` <- function(x,...) { UseMethod('xcoredata') } #' @rdname coredata.xts `xcoredata<-` <- function(x,value) { UseMethod('xcoredata<-') } `xcoredata<-.default` <- function(x,value) { if(is.null(value)) { return(coredata(x)) } else { for(att in names(value)) { if(!att %in% c('dim','dimnames')) attr(x,att) <- value[[att]] } return(x) } } #' Extract and Replace xts Attributes #' #' Extract and replace non-core xts attributes. #' #' This function allows users to assign custom attributes to the xts objects, #' without altering core xts attributes (i.e. tclass, tzone, and tformat). #' #' [`attributes()`] returns all attributes, including core attributes of the #' xts class. #' #' @param x An xts object. #' @param user Should user-defined attributes be returned? The default of #' `NULL` returns all xts attributes. #' @param value A list of new `name = value` attributes. #' #' @return A named list of user-defined attributes. #' #' @author Jeffrey A. Ryan #' #' @seealso [`attributes()`] #' #' @keywords utilities #' @examples #' #' x <- xts(matrix(1:(9*6),nc=6), #' order.by=as.Date(13000,origin="1970-01-01")+1:9, #' a1='my attribute') #' #' xtsAttributes(x) #' xtsAttributes(x) <- list(a2=2020) #' #' xtsAttributes(x) #' xtsAttributes(x) <- list(a1=NULL) #' xtsAttributes(x) #' `xtsAttributes` <- function(x, user=NULL) { # get all additional attributes not standard to xts object #stopifnot(is.xts(x)) rm.attr <- c('dim','dimnames','index','class','names') x.attr <- attributes(x) if(is.null(user)) { # Both xts and user attributes rm.attr <- c(rm.attr,'.CLASS','.CLASSnames','.ROWNAMES', '.indexCLASS', '.indexFORMAT', '.indexTZ', 'tzone', 'tclass') xa <- x.attr[!names(x.attr) %in% rm.attr] } else if(user) { # Only user attributes rm.attr <- c(rm.attr,'.CLASS','.CLASSnames','.ROWNAMES', '.indexCLASS', '.indexFORMAT','.indexTZ','tzone','tclass', x.attr$.CLASSnames) xa <- x.attr[!names(x.attr) %in% rm.attr] } else { # Only xts attributes xa <- x.attr[names(x.attr) %in% x.attr$.CLASSnames] } if(length(xa) == 0) return(NULL) xa } #' @rdname xtsAttributes `xtsAttributes<-` <- function(x,value) { UseMethod('xtsAttributes<-') } `xtsAttributes<-.xts` <- function(x,value) { if(is.null(value)) { for(nm in names(xtsAttributes(x))) { attr(x,nm) <- NULL } } else for(nv in names(value)) { if(!nv %in% c('dim','dimnames','index','class','.CLASS','.ROWNAMES','.CLASSnames')) attr(x,nv) <- value[[nv]] } # Remove tz attrs (object created before 0.10-3) attr(x, ".indexTZ") <- NULL attr(x, "tzone") <- NULL # Remove index class attrs (object created before 0.10-3) attr(x, ".indexCLASS") <- NULL attr(x, "tclass") <- NULL # Remove index format attr (object created before 0.10-3) attr(x, ".indexFORMAT") <- NULL x } xts/R/parse8601.R0000644000176200001440000002131214654242576013063 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # This function corresponds to the ISO 8601 standard # for specifying dates and times as described in # the ISO 8601:2004e standard. # # See: # http://en.wikipedia.org/wiki/ISO_8601 # http://www.iso.org/iso/support/faqs/faqs_widely_used_standards/widely_used_standards_other/date_and_time_format.htm # # This implementation is currently restricted # to interval based parsing, with basic or # extended formats, and duration strings. # Currently the duration must be in basic format # e.g. PnnYnnMnnDTnnHnnMnnS # # The return value is a list of start and # end times, in POSIXt space. # # Copyright 2009. Jeffrey A. Ryan. All rights reserved. # This is licensed under the GPL version 2 or later # #' Create an ISO8601 string from a time series object #' #' This function uses the `start()` and `end()` of a time series object to #' create an ISO8601 string that spans the time range of the object. #' #' This is not exported an therefore not part of the official xts API. #' #' @param x A time series object with `start()` and `end()` methods. #' #' @return A character vector of length one describing the ISO-style format #' for the range of a given time series object. #' #' @noRd #' @examples #' #' data(sample_matrix) #' x <- as.xts(sample_matrix) #' .makeISO8601(x) #' .makeISO8601 <- function(x) { paste(start(x), end(x), sep = "/") } #' Internal ISO 8601:2004(e) Time Parser #' #' This function replicates most of the ISO standard for parsing times and #' time-based ranges in a universally accepted way. The best documentation is #' the official ISO page as well as the Wikipedia entry for ISO 8601:2004. #' #' The basic idea is to create the endpoints of a range, given a string #' representation. These endpoints are aligned in POSIXct time to the zero #' second of the day at the beginning, and the 59.9999th second of the 59th #' minute of the 23rd hour of the final day. #' #' For dates prior to the epoch (1970-01-01) the ending time is aligned to the #' 59.0000 second. This is due to a bug/feature in the \R implementation of #' `as.POSIXct()` and `mktime0()` at the C-source level. This limits the #' precision of ranges prior to 1970 to 1 minute granularity with the current #' \pkg{xts} workaround. #' #' Recurring times over multiple days may be specified using the "T" notation. #' See the examples for details. #' #' @param x A character string conforming to the ISO 8601:2004(e) rules. #' @param start Lower constraint on range. #' @param end Upper constraint of range #' @param tz Timezone (tzone) to use internally. #' #' @return A two element list with an entry named \sQuote{first.time} and #' one named \sQuote{last.time}. #' #' @note There is no checking done to test for a properly constructed ISO #' format string. This must be correctly entered by the user. #' #' When using durations, it is important to note that the time of the duration #' specified is not necessarily the same as the realized periods that may be #' returned when applied to an irregular time series. This is not a bug, it is #' a standards and implementation gotcha. #' #' @author Jeffrey A. Ryan #' #' @references \cr #' #' #' @aliases ISO8601 parseISO8601 #' @rdname parseISO8601 #' #' @keywords utilities #' @examples #' #' # the start and end of 2000 #' .parseISO8601('2000') #' #' # the start of 2000 and end of 2001 #' .parseISO8601('2000/2001') #' #' # May 1, 2000 to Dec 31, 2001 #' .parseISO8601('2000-05/2001') #' #' # May 1, 2000 to end of Feb 2001 #' .parseISO8601('2000-05/2001-02') #' #' # Jan 1, 2000 to Feb 29, 2000; note the truncated time on the LHS #' .parseISO8601('2000-01/02') #' #' # 8:30 to 15:00 (used in xts subsetting to extract recurring times) #' .parseISO8601('T08:30/T15:00') #' .parseISO8601 <- function(x, start, end, tz="") { # x: character vector of length 1 in ISO8601:2004(e) format # start: optional earliest time # end: optional latest time # tz: optional tzone to create with as_numeric <- function(.x) { # simple helper function if(gsub(" ","",.x)=="") NULL else as.numeric(.x) } x <- gsub("NOW",format(Sys.time(),"%Y%m%dT%H%M%S"),x) x <- gsub("TODAY",format(Sys.Date(),"%Y%m%d"),x) if(identical(grep("/|(--)|(::)", x), integer(0))) { x <- paste(x,x,sep="/") } intervals <- unlist(strsplit(x, "/|(--)|(::)")) # e.g. "/2009": "" "xxx" end of defined, needs context # e.g. "2009/": "xxx" start of defined, needs context # check for duration specification DURATION <- "" if(length(intervals)==2L) { if(substr(intervals[1],0,1)=="P") { # duration on LHS DURATION <- intervals[1] DURATION_LHS <- TRUE intervals[1] <- "" } if(substr(intervals[2],0,1)=="P") { # duration on RHS DURATION <- intervals[2] DURATION_LHS <- FALSE intervals <- intervals[1] } # leave alone if no duration } parse.side <- function(x, startof) { if( is.na(x) || !nzchar(x)) return(c(NULL)) basic <- gsub(":|-", "", x, perl=TRUE) #, extended=TRUE) date.time <- unlist(strsplit(basic, " |T")) # dates date <- date.time[1] if(!missing(startof) && nchar(basic)==2L) { startof <- gsub(":|-", "", startof, perl=TRUE) #, extended=TRUE) if(nchar(startof) - nchar(date) >= 4) { # FIXME 200901/2009 needs to work, fix is ex-post now # pad to last place of startof # with startof values sstartof <- substr(startof,0,nchar(startof)-nchar(date)) date <- paste(sstartof,date,sep="") } } date <- sprintf("%-8s", date) YYYY <- substr(date,0,4) MM <- substr(date,5,6) DD <- substr(date,7,8) # times time <- date.time[2] if( !is.na(time)) { time <- sprintf("%-6s", time) H <- substr(time,0,2) M <- substr(time,3,4) S <- substr(time,5,10000L) } else H<-M<-S<-"" # return as list c(as.list(c( year=as_numeric(YYYY), month=as_numeric(MM), day=as_numeric(DD), hour=as_numeric(H), min=as_numeric(M), sec=as_numeric(S) ) ),tz=tz) } s <- e <- NA if(nzchar(intervals[1])) # LHS s <- as.POSIXlt(do.call(firstof, parse.side(intervals[1]))) if(length(intervals) == 2L) { # RHS e <- as.POSIXlt(do.call(lastof, parse.side(intervals[2],intervals[1]))) if(is.na(e)) e <- as.POSIXlt(do.call(lastof, parse.side(intervals[2]))) } if(is.na(s) && is.na(e) && !nzchar(DURATION) && intervals[1L] != "") { warning("cannot determine first and last time from ", x) return(list(first.time=NA_real_,last.time=NA_real_)) } if(!missing(start)) { start <- as.numeric(start) #s <- as.POSIXlt(structure(max(start, as.numeric(s), na.rm=TRUE), # class=c("POSIXct","POSIXt"),tz=tz)) s <- as.POSIXlt(.POSIXct(max(start, as.numeric(s), na.rm=TRUE),tz=tz)) } if(!missing(end)) { end <- as.numeric(end) #e <- as.POSIXlt(structure(min(end, as.numeric(e), na.rm=TRUE), # class=c("POSIXct","POSIXt"),tz=tz)) e <- as.POSIXlt(.POSIXct(min(end, as.numeric(e), na.rm=TRUE),tz=tz)) } if(nzchar(DURATION)) { parse_duration <- function(P) { # TODO: # strip leading P from string # convert second M (min) to 'm' IFF following a T # remove/ignore T # convert extended format (PYYYYMMDD) to basic format (PnnYnnMnnD) P <- gsub("P","",P) P <- gsub("T(.*)M","\\1m",P) n <- unlist(strsplit(P, "[[:alpha:]]")) d <- unlist(strsplit(gsub("[[:digit:]]", "", P),"")) dur.vec <- list(as.numeric(n),unname(c(Y=6,M=5,D=4,H=3,m=2,S=1)[d])) init.vec <- rep(0, 9) init.vec[dur.vec[[2]]] <- dur.vec[[1]] init.vec } if(DURATION_LHS) { s <- as.POSIXct(structure(as.list(mapply(`-`,e,parse_duration(DURATION))), class=c("POSIXlt","POSIXt"), tzone=attr(e,"tzone"))) } else { e <- as.POSIXct(structure(as.list(mapply(`+`,s,parse_duration(DURATION))), class=c("POSIXlt","POSIXt"), tzone=attr(e,"tzone"))) } } list(first.time=as.POSIXct(s),last.time=as.POSIXct(e)) } xts/R/zzz.R0000644000176200001440000000753614654242576012303 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # internal package environment for use with lines.xts # Do we still need this env? .xtsEnv <- new.env() # Environment for our xts chart objects (xts_chob) .plotxtsEnv <- new.env() register_s3_method <- function(pkg, generic, class, fun = NULL) { stopifnot(is.character(pkg), length(pkg) == 1L) stopifnot(is.character(generic), length(generic) == 1L) stopifnot(is.character(class), length(class) == 1L) if (is.null(fun)) { fun <- get(paste0(generic, ".", class), envir = parent.frame()) } else { stopifnot(is.function(fun)) } if (isNamespaceLoaded(pkg)) { registerS3method(generic, class, fun, envir = asNamespace(pkg)) } # Always register hook in case package is later unloaded & reloaded setHook( packageEvent(pkg, "onLoad"), function(...) { registerS3method(generic, class, fun, envir = asNamespace(pkg)) } ) } .onAttach <- function(libname, pkgname) { warn_dplyr_lag <- getOption("xts.warn_dplyr_breaks_lag", TRUE) dplyr_will_mask_lag <- conflictRules("dplyr") if (is.null(dplyr_will_mask_lag)) { dplyr_will_mask_lag <- TRUE } else { dplyr_will_mask_lag <- all(dplyr_will_mask_lag$exclude != "lag") } if (warn_dplyr_lag && dplyr_will_mask_lag) { ugly_message <- " ######################### Warning from 'xts' package ########################## # # # The dplyr lag() function breaks how base R's lag() function is supposed to # # work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or # # source() into this session won't work correctly. # # # # Use stats::lag() to make sure you're not using dplyr::lag(), or you can add # # conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop # # dplyr from breaking base R's lag() function. # # # # Code in packages is not affected. It's protected by R's namespace mechanism # # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning. # # # ###############################################################################" if ("package:dplyr" %in% search()) { packageStartupMessage(ugly_message) } else { setHook(packageEvent("dplyr", "attach"), function(...) packageStartupMessage(ugly_message)) } } } .onLoad <- function(libname, pkgname) { if (getRversion() < "3.6.0") { register_s3_method("timeSeries", "as.timeSeries", "xts") if (utils::packageVersion("zoo") < "1.8.5") { # xts:::as.zoo.xts was copied to zoo:::as.zoo.xts in zoo 1.8-5 register_s3_method("zoo", "as.zoo", "xts") } } invisible() } .onUnload <- function(libpath) { library.dynam.unload("xts", libpath) } if(getRversion() < "2.11.0") { .POSIXct <- function(xx, tz = NULL) structure(xx, class = c("POSIXct", "POSIXt"), tzone = tz) } xts/R/xts-package.R0000644000176200001440000001430514654242576013645 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' Sample Data Matrix For xts Example and Unit Testing #' #' Simulated 180 observations on 4 variables. #' #' @usage data(sample_matrix) #' #' @format \preformatted{The format is: #' num [1:180, 1:4] 50.0 50.2 50.4 50.4 50.2 ... #' - attr(*, "dimnames")=List of 2 #' ..$ : chr [1:180] "2007-01-02" "2007-01-03" "2007-01-04" "2007-01-05" ... #' ..$ : chr [1:4] "Open" "High" "Low" "Close" } #' #' @rdname sample.data #' @keywords datasets #' @examples #' #' data(sample_matrix) #' "sample_matrix" #' Internal Documentation #' #' This help file is to help in development of xts, as well as provide some #' clarity and insight into its purpose and implementation. #' #' Last modified: 2008-08-06 by Jeffrey A. Ryan Version: 0.5-0 and above #' #' The \pkg{xts} package xts designed as a drop-in replacement for the very #' popular \pkg{zoo} package. Most all functionality of zoo has been extended #' or carries into the xts package. #' #' Notable changes in direction include the use of time-based indexing, at #' first explicitely, now implicitely. #' #' An xts object consists of data in the form of a matrix, an index - #' ordered and increasing, either numeric or integer, and additional attributes #' for use internally, or for end-user purposes. #' #' The current implementation enforces two major rules on the object. One is #' that the index must be coercible to numeric, by way of `as.POSIXct`. #' There are defined types that meet this criteria. See `timeBased` for #' details. #' #' The second requirement is that the object cannot have rownames. The #' motivation from this comes in part from the work Matthew Doyle has done in #' his data.table class, in the package of the same name. Rownames in must be #' character vectors, and as such are inefficient in both storage and #' conversion. By eliminating the rownames, and providing a numeric index of #' internal type `REAL` or `INTEGER`, it is possible to maintain a #' connection to standard date and time classes via the POSIXct functions, #' while at at the same time maximizing efficiencies in data handling. #' #' User level functions `index`, as well as conversion to other classes #' proceeds as if there were rownames. The code for `index` automatically #' converts time to numeric in both extraction and replacement functionality. #' This provides a level of abstraction to facilitate internal, and external #' package use and inter-operability. #' #' There is also new work on providing a C-level API to some of the xts #' functionality to facilitate external package developers to utilize the fast #' utility routines such as subsetting and merges, without having to call only #' from . Obviously this places far more burden on the developer to not only #' understand the internal xts implementation, but also to understand all of #' what is documented for R-internals (and much that isn't). At present the #' functions and macros available can be found in the \sQuote{xts.h} file in #' the src directory. #' #' There is no current documentation for this API. The adventure starts here. #' Future documentation is planned, not implemented. #' #' @name xts-internals #' @author Jeffrey A. Ryan #' @keywords utilities NULL #' xts: extensible time-series #' #' Extensible time series class and methods, extending and behaving like zoo. #' #' Easily convert one of \R's many time-series (and non-time-series) classes to a #' true time-based object which inherits all of zoo's methods, while allowing #' for new time-based tools where appropriate. #' #' Additionally, one may use \pkg{xts} to create new objects which can contain #' arbitrary attributes named during creation as name=value pairs. #' #' @name xts-package #' @author Jeffrey A. Ryan and Joshua M. Ulrich #' #' Maintainer: Joshua M. Ulrich #' @seealso [`xts()`], [`as.xts()`], [`reclass()`], [`zoo()`][zoo::zoo] #' @keywords package "_PACKAGE" #' xts C API Documentation #' #' This help file is to help in development of xts, as well as provide some #' clarity and insight into its purpose and implementation. #' #' By Jeffrey A. Ryan, Dirk Eddelbuettel, and Joshua M. Ulrich Last modified: #' 2018-05-02 Version: 0.10-3 and above #' #' At present the \pkg{xts} API has publicly available interfaces to the #' following functions (as defined in `xtsAPI.h`): #' #' \preformatted{Callable from other R packages: #' SEXP xtsIsOrdered(SEXP x, SEXP increasing, SEXP strictly) #' SEXP xtsNaCheck(SEXP x, SEXP check) #' SEXP xtsTry(SEXP x) #' SEXP xtsRbind(SEXP x, SEXP y, SEXP dup) #' SEXP xtsCoredata(SEXP x) #' SEXP xtsLag(SEXP x, SEXP k, SEXP pad) #' #' Internal use functions: #' SEXP isXts(SEXP x) #' void copy_xtsAttributes(SEXP x, SEXP y) #' void copy_xtsCoreAttributes(SEXP x, SEXP y) #' #' Internal use macros: #' xts_ATTRIB(x) #' xts_COREATTRIB(x) #' GET_xtsIndex(x) #' SET_xtsIndex(x,value) #' GET_xtsIndexFormat(x) #' SET_xtsIndexFormat(x,value) #' GET_xtsCLASS(x) #' SET_xtsCLASS(x,value) #' #' Internal use SYMBOLS: #' xts_IndexSymbol #' xts_ClassSymbol #' xts_IndexFormatSymbol #' #' Callable from R: #' SEXP mergeXts(SEXP args) #' SEXP rbindXts(SEXP args) #' SEXP tryXts(SEXP x) #' } #' #' @name xtsAPI #' @author Jeffrey A. Ryan #' @keywords utilities #' @examples #' #' \dontrun{ #' # some example code to look at #' #' file.show(system.file('api_example/README', package="xts")) #' file.show(system.file('api_example/src/checkOrder.c', package="xts")) #' } #' NULL xts/R/periodicity.R0000644000176200001440000001307314654242576013763 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . time_frequency <- function(x) { x <- gsub(":|/|-| ", "", x) nc <- nchar(x) if(nc < 4) stop("unrecognizable time.scale") if(nc == 4) res <- 2678400 * 12 #"yearly" if(nc > 4) res <- 2678400 #"monthly" if(nc > 6) res <- 86400 #"daily" if(nc > 8) res <- 3600 #"hourly" if(nc > 10) res <- 60 #"minute" if(nc > 12) res <- 1 #"seconds" return(res) } #' Approximate Series Periodicity #' #' Estimate the periodicity of a time-series-like object by calculating the #' median time between observations in days. #' #' A simple wrapper to quickly estimate the periodicity of a given data. #' Returning an object of type `periodicity`. #' #' This calculates the median time difference between observations as a #' difftime object, the numerical difference, the units of measurement, and the #' derived scale of the data as a string. #' #' The time index currently must be of either a 'Date' or 'POSIXct' class, or #' or coercible to one of them. #' #' The 'scale' component of the result is an estimate of the periodicity of the #' data in common terms - e.g. 7 day daily data is best described as 'weekly', #' and would be returned as such. #' #' @param x A time-series-like object. #' @param \dots Unused. #' #' @return A 'periodicity' object with the following elements: #' * the `difftime` object, #' * frequency: the median time difference between observations #' * start: the first observation #' * end: the last observation #' * units: one of secs, mins, hours, or days #' * scale: one of seconds, minute, hourly, daily, weekly, monthly, quarterly, or yearly #' * label: one of second, minute, hour, day, week, month, quarter, year #' #' Possible `scale` values are: \sQuote{minute}, \sQuote{hourly}, \sQuote{daily}, #' \sQuote{weekly}, \sQuote{monthly}, \sQuote{quarterly}, and \sQuote{yearly}. #' #' @note This function only attempts to be a *good estimate* for the underlying #' periodicity. If the series is too short, or has highly irregular periodicity, #' the return values will not be accurate. That said, it is quite robust and #' used internally within \pkg{xts}. #' #' @author Jeffrey A. Ryan #' #' @seealso [`difftime()`] #' #' @keywords utilities #' @examples #' #' zoo.ts <- zoo(rnorm(231),as.Date(13514:13744,origin="1970-01-01")) #' periodicity(zoo.ts) #' periodicity <- function(x, ...) { if( timeBased(x) ) { if( anyNA(x) ) { warning("removing NA in 'x' to calculate periodicity") x <- x[!is.na(x)] } x <- try.xts(x, error = "cannot convert 'x' to xts") } if (!is.xts(x)) { x <- try.xts(x, error = "cannot convert 'x' to xts") } n <- length(.index(x)) if( n < 2 ) { res <- list(difftime = structure(0, units='secs', class='difftime'), frequency = 0, start = NA, end = NA, units = 'secs', scale = 'seconds', label = 'second') res <- structure(res, class='periodicity') if( n == 0 ) { warning("can not calculate periodicity of empty object") } else { warning("can not calculate periodicity of 1 observation") res$start <- start(x) res$end <- end(x) } return(res) } p <- median(diff( .index(x) )) # Date and POSIXct if(p < 60) { units <- "secs" scale <- "seconds" label <- "second" } else if(p < 3600) { units <- "mins" scale <- "minute" label <- "minute" p <- p/60L } else if(p < 86400) { # < 1 day units <- "hours" scale <- "hourly" label <- "hour" } else if(p == 86400) { units <- "days" scale <- "daily" label <- "day" } else if(p <= 604800) { # 86400 * 7 units <- "days" scale <- "weekly" label <- "week" } else if(p <= 2678400) { # 86400 * 31 units <- "days" scale <- "monthly" label <- "month" } else if(p <= 7948800) { # 86400 * 92 units <- "days" scale <- "quarterly" label <- "quarter" } else { # years units <- "days" scale <- "yearly" label <- "year" } structure(list(difftime = as.difftime(p, units = units), frequency = p, start = start(x), end = end(x), units = units, scale = scale, label = label), class = 'periodicity') } `print.periodicity` <- function (x, ...) { x.freq <- ifelse(x$scale %in% c("minute", "seconds"), x$frequency, "") if (x.freq == "") { cap.scale <- paste(toupper(substring(x$scale, 1, 1)), substring(x$scale, 2), sep = "") cat(paste(cap.scale, "periodicity from", x$start, "to", x$end, "\n", sep = " ")) } else { cat(paste(x.freq, x$scale, "periodicity from", x$start, "to", x$end, "\n", sep = " ")) } } xts/R/rollapply.xts.R0000644000176200001440000001360514654242576014273 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . rollapply.xts <- function(data, width, FUN, ..., by=1, by.column=TRUE, fill=if(na.pad) NA, na.pad=TRUE, partial=TRUE, align=c("right","center","left")) { if (!missing(na.pad)) { warning("na.pad argument is deprecated") } if (!missing(partial)) { warning("partial argument is not currently supported") } data <- try.xts(data) # jmu: is this necessary? # Code taken/adapted from rollapply.zoo from the 'zoo' package # xts doesn't currently have these functions # if(by.column && by == 1 && ascending && length(list(...)) < 1) # switch(deparse(substitute(FUN)), # mean = return(rollmean(data, width, na.pad = na.pad, align = align)), # max = return(rollmax(data, width, na.pad = na.pad, align = align)), # median = return(rollmedian(data, width, na.pad = na.pad, align = align))) nr <- NROW(data) nc <- NCOL(data) width <- as.integer(width)[1] stopifnot( width > 0, width <= nr ) ## process alignment align <- match.arg(align) n1 <- switch(align, "left" = { width - 1}, "center" = { floor(width/2) }, "right" = { 0 }) idx <- index(data) tt <- index(data)[seq((width-n1), (nr-n1), by)] #tt <- idx[seq((width-n1), (nr-n1), 1)] ## evaluate FUN only on coredata(data) #data <- coredata(data) FUN <- match.fun(FUN) ind <- as.matrix(seq.int(width,nr,by)) #e <- embedi(nr, width, by, ascending) if( nc==1 ) { #xx <- apply(e, 1, function(i) FUN(data[i,],...)) #xx <- sapply(1:NROW(e), function(i) FUN(data[e[i,],],...)) ##xx <- sapply(ind, function(i) FUN(data[(i-width+1):i,],...)) xx <- sapply(ind, function(i) FUN(.subset_xts(data,(i-width+1):i),...)) if(!is.null(dim(xx))) xx <- t(xx) res <- xts(xx, tt, if (by == 1) attr(data, "frequency")) } else if( by.column ) { res <- xts( sapply( 1:NCOL(data), function(j) #apply(e, 1, function(i) FUN(data[i,j],...)) ), #apply(ind, 1, function(i) FUN(data[(i-width+1):i,j],...)) ), apply(ind, 1, function(i) FUN(.subset_xts(data,(i-width+1):i,j),...)) ), tt, if (by == 1) attr(data, "frequency") ) } else { #xx <- apply(e, 1, function(i) FUN(data[i,],...)) ##xx <- apply(ind, 1, function(i) FUN(data[(i-width+1):i,],...)) xx <- apply(ind, 1, function(i) FUN(.subset_xts(data,(i-width+1):i),...)) if(!is.null(dim(xx))) xx <- t(xx) res <- xts(xx, tt, if (by == 1) attr(data, "frequency")) } ix <- index(data) %in% index(res) tmp <- merge(res, xts(,idx, attr(data, "frequency"))) if(is.null(colnames(res))) { # remove dimnames (xts objects don't have rownames) dimnames(tmp) <- NULL } res <- na.fill(tmp, fill, ix) if( by.column && !is.null(dim(data)) ) { colnames(res) <- colnames(data) } return(res) } rollsum.xts <- function (x, k, fill=if(na.pad) NA, na.pad=TRUE, align=c("right", "center", "left"), ...) { ## FIXME: align and fill are not respected! # from rollapply.xts; is this necessary? x <- try.xts(x) # from rollmean.zoo if (!missing(na.pad)) warning("na.pad is deprecated. Use fill.") # process alignment align <- match.arg(align) #n1 <- switch(align, # "left" = { k - 1 }, # "center" = { floor(k/2) }, # "right" = { 0 }) #ix <- index(x)[seq((k-n1), (nrow(x)-n1), 1)] res <- .Call(C_roll_sum, x, k) res } rollmean.xts <- function (x, k, fill=if(na.pad) NA, na.pad=TRUE, align=c("right", "center", "left"), ...) { rollsum.xts(x=x, k=k, fill=fill, align=align, ...) / k } rollmax.xts <- function (x, k, fill=if(na.pad) NA, na.pad=TRUE, align=c("right", "center", "left"), ...) { ## FIXME: align and fill are not respected! # from rollapply.xts; is this necessary? x <- try.xts(x) # from rollmean.zoo if (!missing(na.pad)) warning("na.pad is deprecated. Use fill.") # process alignment align <- match.arg(align) #n1 <- switch(align, # "left" = { k - 1 }, # "center" = { floor(k/2) }, # "right" = { 0 }) #ix <- index(x)[seq((k-n1), (nrow(x)-n1), 1)] res <- .Call(C_roll_max, x, k) res } rollmin.xts <- function (x, k, fill=if(na.pad) NA, na.pad=TRUE, align=c("right", "center", "left"), ...) { ## FIXME: align and fill are not respected! # from rollapply.xts; is this necessary? x <- try.xts(x) # from rollmean.zoo if (!missing(na.pad)) warning("na.pad is deprecated. Use fill.") # process alignment align <- match.arg(align) #n1 <- switch(align, # "left" = { k - 1 }, # "center" = { floor(k/2) }, # "right" = { 0 }) #ix <- index(x)[seq((k-n1), (nrow(x)-n1), 1)] res <- .Call(C_roll_min, x, k) res } rollcov.xts <- function (x, y, k, fill=if(na.pad) NA, na.pad=TRUE, align=c("right", "center", "left"), sample=TRUE, ...) { ## FIXME: align and fill are not respected! # from rollapply.xts; is this necessary? x <- try.xts(x) y <- try.xts(y) # from rollmean.zoo if (!missing(na.pad)) warning("na.pad is deprecated. Use fill.") # process alignment align <- match.arg(align) #n1 <- switch(align, # "left" = { k - 1 }, # "center" = { floor(k/2) }, # "right" = { 0 }) #ix <- index(x)[seq((k-n1), (nrow(x)-n1), 1)] res <- .Call(C_roll_cov, x, y, k, sample) res } xts/R/timeBasedSeq.R0000644000176200001440000001543514654242576014011 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' Create a Sequence or Range of Times #' #' A function to create a vector of time-based objects suitable for indexing an #' xts object, given a string conforming to the ISO-8601 time and date standard #' for range-based specification. The resulting series can be of any class #' supported by xts, including POSIXct, Date, chron, timeDate, yearmon, and #' yearqtr. #' #' `timeBasedRange()` creates a one or two element numeric vector representing #' the start and end number of seconds since epoch (1970-01-01). For internal #' use. #' #' `timeBasedSeq()` creates sequences of time-based observations using strings #' formatted according to the ISO-8601 specification. The general format is #' *from/to/by* or *from::to::by*, where *to* and *by* are optional when the #' 'length.out' argument is specified. #' #' The *from* and *to* elements of the string must be left-specified with #' respect to the standard *CCYYMMDD HHMMSS* form. All dates/times specified #' will be set to either the earliest point (from) or the latest (to), to the #' given the level of specificity. For example, \sQuote{1999} in the *from* #' field would set the start to the beginning of 1999. \sQuote{1999} in the #' *to* field would set the end to the end of 1999. #' #' The amount of resolution in the result is determined by the resolution of #' the *from* and *to* component, unless the optional *by* component is #' specified. #' #' For example, `timeBasedSeq("1999/2008")` returns a vector of Dates for #' January 1st of each year. `timeBasedSeq("199501/1996")` returns a yearmon #' vector of 24 months in 1995 and 1996. And `timeBasedSeq("19950101/1996")` #' creates a Date vector for all the days in those two years. #' #' The optional *by* field (the third delimited element to the string), will #' the resolution heuristic described above and will use the specified *by* #' resolution. The possible values for *by* are: 'Y' (years), 'm' (months), #' 'd' (days), 'H' (hours), 'M' (minutes), 'S' (seconds). Sub-second #' resolutions are not supported. #' #' @param x An ISO-8601 time-date range string. #' @param retclass The return class desired. #' @param length.out Passed to `seq()` internally. #' @param \dots Unused. #' #' @return `timeBasedSeq()` returns a vector of time-based observations. #' `timeBasedRange()` returns a one or two element numeric vector representing #' the start and end number of seconds since epoch (1970-01-01). #' #' When `retclass = NULL`, the result of `timeBasedSeq()` is a named list #' containing elements "from", "to", "by" and "length.out". #' #' @author Jeffrey A. Ryan #' #' @seealso [`timeBased()`], [`xts()`] #' #' @references International Organization for Standardization: ISO 8601 #' #' #' @keywords utilities #' @examples #' #' timeBasedSeq('1999/2008') #' timeBasedSeq('199901/2008') #' timeBasedSeq('199901/2008/d') #' timeBasedSeq('20080101 0830',length=100) # 100 minutes #' timeBasedSeq('20080101 083000',length=100) # 100 seconds #' `timeBasedSeq` <- function(x, retclass=NULL, length.out=NULL) { if(!is.character(x)) # allows for unquoted numerical expressions to work x <- deparse(match.call()$x) x <- gsub('::','/',x, perl=TRUE) # replace all '::' range ops with '/' x <- gsub('[-:]','',x, perl=TRUE) # strip all remaining '-' and ':' seps x <- gsub('[ ]','',x, perl=TRUE) # strip all remaining white space x <- unlist(strsplit(x,"/")) from <- x[1] to <- x[2] BY <- x[3] # need to test for user specified length.out, currently just overriding if(from == "") from <- NA if(!is.na(from)) { year <- as.numeric(substr(from,1,4)) month <- as.numeric(substr(from,5,6)) day <- as.numeric(substr(from,7,8)) hour <- as.numeric(substr(from,9,10)) mins <- as.numeric(substr(from,11,12)) secs <- as.numeric(substr(from,13,14)) time.args.from <- as.list(unlist(sapply(c(year,month,day,hour,mins,secs), function(x) if(!is.na(x)) x) )) from <- do.call('firstof',time.args.from) } else time.args.from <- list() # only calculate if to is specified if(!is.na(to)) { year <- as.numeric(substr(to,1,4)) month <- as.numeric(substr(to,5,6)) day <- as.numeric(substr(to,7,8)) hour <- as.numeric(substr(to,9,10)) mins <- as.numeric(substr(to,11,12)) secs <- as.numeric(substr(to,13,14)) time.args.to <- as.list(unlist(sapply(c(year,month,day,hour,mins,secs), function(x) if(!is.na(x)) x) )) to <- do.call('lastof',time.args.to) } else time.args.to <- list() max.resolution <- max(length(time.args.from), length(time.args.to)) # if neither is set if(max.resolution == 0) max.resolution <- 1 resolution <- c('year','month','DSTday','hour','mins','secs')[max.resolution] if(!is.na(BY)) resolution <- names(match.arg(BY, list(year ='Y', month ='m', day ='d', hour ='H', mins ='M', secs ='S'))) convert.to <- 'Date' if(max.resolution == 2 || resolution == 'month' ) convert.to <- 'yearmon' if(max.resolution > 3 || resolution %in% c("hour","mins","secs")) convert.to <- 'POSIXct' if(is.na(to) && missing(length.out)) length.out <- 1L if(((!missing(retclass) && is.null(retclass)) || any(is.na(to),is.na(from)))) { # return the calculated values only return(list(from=from,to=to,by=resolution,length.out=length.out)) } if(is.null(length.out)) { SEQ <- seq(from,to,by=resolution) } else { SEQ <- seq(from, by=resolution, length.out=length.out) } if(!is.null(retclass)) convert.to <- retclass if(convert.to == 'POSIXct') { structure(SEQ, class=c('POSIXct','POSIXt')) # need to force the TZ to be used } else do.call(paste('as',convert.to,sep='.'), list(SEQ)) } xts/R/period.R0000644000176200001440000001114714654242576012721 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' Check if Class is Time-Based #' #' Used to verify that the object is one of the known time-based classes in R. #' Current time-based objects supported are `Date`, `POSIXct`, `chron`, #' `yearmon`, `yearqtr`, and `timeDate`. #' #' @param x Object to test. #' #' @return A logical scalar. #' #' @author Jeffrey A. Ryan #' #' @rdname timeBased #' @keywords utilities #' @examples #' #' timeBased(Sys.time()) #' timeBased(Sys.Date()) #' #' timeBased(200701) #' `is.timeBased` <- function(x) { time.classes <- c("Date", "POSIXt", "chron", "dates", "times", "timeDate", "yearmon", "yearqtr", "xtime") inherits(x, time.classes) } #' @rdname timeBased `timeBased` <- `is.timeBased` #' Optimized Calculations By Period #' #' Calculate a sum, product, minimum, or maximum for each non-overlapping #' period specified by `INDEX`. #' #' These functions are similar to calling `period.apply()` with the same #' endpoints and function. There may be slight differences in the results due #' to numerical accuracy. #' #' For xts-coercible objects, an appropriate `INDEX` can be created by a call #' to `endpoints()`. #' #' @param x A univariate data object. #' @param INDEX A numeric vector of endpoints for each period. #' #' @return An xts or zoo object containing the sum, product, minimum, or #' maximum for each endpoint in `INDEX`. #' #' @author Jeffrey A. Ryan #' #' @seealso [`endpoints()`], [`period.apply()`] #' #' @keywords utilities #' @rdname period_math #' @examples #' #' x <- c(1, 1, 4, 2, 2, 6, 7, 8, -1, 20) #' i <- c(0, 3, 5, 8, 10) #' #' period.sum(x, i) #' period.prod(x, i) #' period.min(x, i) #' period.max(x, i) #' #' data(sample_matrix) #' y <- sample_matrix[, 1] #' ep <- endpoints(sample_matrix) #' #' period.sum(y, ep) #' period.sum(as.xts(y), ep) #' #' period.prod(y, ep) #' period.prod(as.xts(y), ep) #' #' period.min(y, ep) #' period.min(as.xts(y), ep) #' #' period.max(y, ep) #' period.max(as.xts(y), ep) #' `period.sum` <- function(x,INDEX) { if(NCOL(x) > 1) stop("single column data only") if(min(INDEX) < 0 || max(INDEX) > NROW(x)) stop("INDEX must be >= 0 and <= nrow(x)") ep <- as.integer(INDEX) if(ep[1L] != 0L) ep <- c(0L,ep) if(ep[length(ep)] != NROW(x)) ep <- c(ep,NROW(x)) xx <- as.double(x) xa <- .Call(C_xts_period_sum, xx, ep) if(timeBased(index(x))) { tz <- xts(xa, index(x)[ep[-1]]) } else { tz <- zoo(xa, index(x)[ep[-1]]) } tz } #' @rdname period_math `period.prod` <- function(x,INDEX) { if(NCOL(x) > 1) stop("single column data only") if(min(INDEX) < 0 || max(INDEX) > NROW(x)) stop("INDEX must be >= 0 and <= nrow(x)") ep <- as.integer(INDEX) if(ep[1] != 0L) ep <- c(0L,ep) if(ep[length(ep)] != NROW(x)) ep <- c(ep,NROW(x)) xx <- as.double(x) xa <- .Call(C_xts_period_prod, xx, ep) if(timeBased(index(x))) { tz <- xts(xa, index(x)[ep[-1]]) } else { tz <- zoo(xa, index(x)[ep[-1]]) } tz } #' @rdname period_math `period.max` <- function(x,INDEX) { if(NCOL(x) > 1) stop("single column data only") if(min(INDEX) < 0 || max(INDEX) > NROW(x)) stop("INDEX must be >= 0 and <= nrow(x)") ep <- as.integer(INDEX) if(ep[1] != 0L) ep <- c(0L,ep) if(ep[length(ep)] != NROW(x)) ep <- c(ep,NROW(x)) xx <- as.double(x) xa <- .Call(C_xts_period_max, xx, ep) if(timeBased(index(x))) { tz <- xts(xa, index(x)[ep[-1]]) } else { tz <- zoo(xa, index(x)[ep[-1]]) } tz } #' @rdname period_math `period.min` <- function(x,INDEX) { if(NCOL(x) > 1) stop("single column data only") if(min(INDEX) < 0 || max(INDEX) > NROW(x)) stop("INDEX must be >= 0 and <= nrow(x)") ep <- as.integer(INDEX) if(ep[1] != 0L) ep <- c(0L,ep) if(ep[length(ep)] != NROW(x)) ep <- c(ep,NROW(x)) xx <- as.double(x) xa <- .Call(C_xts_period_min, xx, ep) if(timeBased(index(x))) { tz <- xts(xa, index(x)[ep[-1]]) } else { tz <- zoo(xa, index(x)[ep[-1]]) } tz } xts/R/as.environment.xts.R0000644000176200001440000000342414654242576015221 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' Coerce an xts Object to an Environment by Column #' #' Method to automatically convert an xts object to an environment containing #' vectors representing each column of the original xts object. The name of #' each object in the resulting environment corresponds to the name of the #' column of the xts object. #' #' @param x An xts object. #' #' @return An environment containing `ncol(x)` vectors extracted by #' column from `x`. #' #' @note Environments do not preserve (or have knowledge) of column order and #' cannot be subset by an integer index. #' #' @author Jeffrey A. Ryan #' #' @keywords manip #' @examples #' #' x <- xts(1:10, Sys.Date()+1:10) #' colnames(x) <- "X" #' y <- xts(1:10, Sys.Date()+1:10) #' colnames(x) <- "Y" #' xy <- cbind(x,y) #' colnames(xy) #' e <- as.environment(xy) # currently using xts-style positive k #' ls(xy) #' ls.str(xy) #' as.environment.xts <- function(x) { e <- new.env() lapply(1:NCOL(x), function(.) assign(colnames(x)[.], x[,.],envir=e)) e } xts/R/yearmon.R0000644000176200001440000000170714654242576013112 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' @rdname as.xts as.xts.yearmon <- function(x, ...) { xts(x=NULL, order.by=x) } #' @rdname as.xts as.xts.yearqtr <- function(x, ...) { xts(x=NULL, order.by=x) } xts/R/axTicksByTime.R0000644000176200001440000001114714654242576014157 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' Compute x-Axis Tickmark Locations by Time #' #' Compute x-axis tickmarks like [`axTicks()`] in base but with respect to #' time. This function is written for internal use, and documented for those #' wishing to use it for customized plots. #' #' The default `ticks.on = "auto"` uses heuristics to compute sensible tick #' locations. Use a combination of `ticks.on` and `k` to create tick locations #' at specific intervals. For example, `ticks.on = "days"` and `k = 7` will #' create tick marks every 7 days. #' #' When `format.labels` is a character string the possible values are the same #' as those listed in the Details section of [`strptime()`]. #' #' @param x An object indexed by time or a vector of times/dates. #' @param ticks.on Time unit for tick locations. #' @param k Frequency of tick locations. #' @param labels Should a labeled vector be returned? #' @param format.labels Either a logical value specifying whether labels should #' be formatted, or a character string specifying the format to use. #' @param ends Should the ends be adjusted? #' @param gt Lower bound on number of tick locations. #' @param lt Upper bound on number of tick locations. #' #' @return A numeric vector of index element locations where tick marks should #' be drawn. These are *locations* (e.g. 1, 2, 3, ...), *not* the #' index timestamps. #' #' If possible, the result will be named using formatted values from the index #' timestamps. The names will be used for the tick mark labels. #' #' @author Jeffrey A. Ryan #' #' @seealso [`endpoints()`] #' @keywords utilities #' @examples #' #' data(sample_matrix) #' axTicksByTime(as.xts(sample_matrix),'auto') #' axTicksByTime(as.xts(sample_matrix),'weeks') #' axTicksByTime(as.xts(sample_matrix),'months',7) #' axTicksByTime <- function(x, ticks.on = "auto", k = 1, labels = TRUE, format.labels = TRUE, ends = TRUE, gt = 2, lt = 30) { # if a vector of times/dates, convert to dummy xts object if (timeBased(x)) { x <- xts(rep(1, length(x)), x) } ticks.on <- ticks.on[1L] # special-case for "secs" and "mins" if (ticks.on == "secs" || ticks.on == "mins") { ticks.on <- substr(ticks.on, 1L, 3L) } tick.opts <- c("years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds") ticks.on <- match.arg(ticks.on, c("auto", tick.opts)) if (ticks.on == "auto") { tick.k.opts <- c(10, 5, 2, 1, 3, 6, 1, 1, 1, 4, 2, 1, 30, 15, 1, 1) tick.opts <- rep(tick.opts, c(4, 1, 2, 1, 1, 3, 3, 1)) is <- structure(rep(0, length(tick.opts)), .Names = tick.opts) for (i in 1:length(tick.opts)) { ep <- endpoints(x, tick.opts[i], tick.k.opts[i]) is[i] <- length(ep) - 1 if (is[i] > lt) { break } } loc <- rev(which(is > gt & is < lt))[1L] cl <- tick.opts[loc] ck <- tick.k.opts[loc] } else { cl <- ticks.on[1L] ck <- k } if (is.null(cl) || is.na(cl) || is.na(ck)) { ep <- c(0, NROW(x)) } else { ep <- endpoints(x, cl, ck) } if (ends) { ep <- ep + c(rep(1, length(ep) - 1), 0) } if (labels) { if (is.logical(format.labels) || is.character(format.labels)) { # format by platform... unix <- (.Platform$OS.type == "unix") # ...and level of time detail fmt <- switch(periodicity(x)$scale, weekly = , daily = if (unix) "%b %d%n%Y" else "%b %d %Y", minute = , hourly = if (unix) "%b %d%n%H:%M" else "%b %d %H:%M", seconds = if (unix) "%b %d%n%H:%M:%S" else "%b %d %H:%M:%S", if (unix) "%n%b%n%Y" else "%b %Y") # special case yearqtr index if (inherits(index(x), "yearqtr")) { fmt <- "%Y-Q%q" } if (is.character(format.labels)) { fmt <- format.labels } names(ep) <- format(index(x)[ep], fmt) } else { names(ep) <- as.character(index(x)[ep]) } } ep } xts/R/reclass.R0000644000176200001440000001676014703317760013072 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' @rdname reclass #' @aliases use.xts try.xts <- function(x, ..., error=TRUE) { if(is.xts(x)) { #attr(x,'.RECLASS') <- FALSE return(x) } xx <- try(as.xts(x,..., .RECLASS=TRUE),silent=TRUE) if(inherits(xx,'try-error')) { if(is.character(error)) { stop(error) } else if(is.function(error)) { return(error(x, ...)) } else if(error) { stop(gsub('\n','',xx)) } else { return(x) } } else { # made positive: now test if needs to be reclassed structure(xx, .RECLASS=TRUE) } } use.xts <- try.xts #' Convert Objects to xts and Back to Original Class #' #' Functions to convert objects of arbitrary classes to xts and then back to #' the original class, without losing any attributes of the original class. #' #' A simple and reliable way to convert many different objects into a uniform #' format for use within \R. #' #' `try.xts()` and `reclass()` are functions that enable external developers #' access to the reclassing tools within \pkg{xts} to help speed development of #' time-aware functions, as well as provide a more robust and seemless end-user #' experience, regardless of the end-user's choice of data-classes. #' #' `try.xts()` calls `as.xts()` internally. See [`as.xts()`] for available xts #' methods and arguments for each coercible class. Since it calls `as.xts()`, #' you can add custom attributes as `name = value` pairs in the same way. But #' these custom attributes will not be copied back to the original object when #' `reclass()` is called. #' #' The `error` argument can be a logical value indicating whether an error #' should be thrown (or fail silently), a character string allowing for custom #' error error messages, or a function of the form `f(x, ...)` that will be #' called if the conversion fails. #' #' `reclass()` converts an object created by `try.xts()` back to its original #' class with all the original attributes intact (unless they were changed #' after the object was converted to xts). The `match.to` argument allows you #' copy the index attributes ([`tclass`], [`tformat`], and [`tzone`]) and #' [`xtsAttributes()`] from another xts object to the result. `match.to` must #' be an xts object with an index value for every observation in `x`. #' #' `Reclass()` is designed for top-level use, where it is desirable to have #' the object returned from an arbitrary function in the same class as the #' object passed in. Most functions in \R are not designed to return objects #' matching the original object's class. It attempts to handle conversion and #' reconversion transparently but it requires the original object must be #' coercible to xts, the result of the function must have the same number of #' rows as the input, and the object to be converted/reclassed must be the #' first argument to the function being wrapped. Note that this function #' hasn't been tested for robustness. #' #' See the accompanying vignette for more details on the above usage. #' #' @param x Data object to convert. See details for supported types. #' @param match.to An xts object whose attributes will be copied to the result. #' @param error Error handling option. See Details. #' @param \dots Additional parameters or attributes. #' #' @return `try.xts()` returns an xts object when conversion is successful. #' The `error` argument controls the function's behavior when conversion fails. #' #' `Reclass()` and `reclass()` return the object as its original class, as #' specified by the 'CLASS' attribute. #' #' @author Jeffrey A. Ryan #' #' @seealso [`as.xts()`] #' #' @keywords utilities #' @examples #' #' a <- 1:10 #' #' # fails silently, the result is still an integer vector #' try.xts(a, error = FALSE) #' #' # control the result with a function #' try.xts(a, error = function(x, ...) { "I'm afraid I can't do that." }) #' #' z <- zoo(1:10, timeBasedSeq("2020-01-01/2020-01-10")) #' x <- try.xts(z) # zoo to xts #' str(x) #' str(reclass(x)) # reclass back to zoo #' `reclass` <- function(x, match.to, error=FALSE, ...) { if(!missing(match.to) && is.xts(match.to)) { if(NROW(x) != length(.index(match.to))) if(error) { stop('incompatible match.to attibutes') } else return(x) if(!is.xts(x)) { x <- .xts(coredata(x), .index(match.to), tclass = tclass(match.to), tzone = tzone(match.to), tformat = tformat(match.to)) } attr(x, ".CLASS") <- CLASS(match.to) xtsAttributes(x) <- xtsAttributes(match.to) tclass(x) <- tclass(match.to) tformat(x) <- tformat(match.to) tzone(x) <- tzone(match.to) } oldCLASS <- CLASS(x) # should this be is.null(oldCLASS)? if(length(oldCLASS) > 0 && !inherits(oldClass,'xts')) { if(!is.null(dim(x))) { if(!is.null(attr(x,'.ROWNAMES'))) { # rownames<- (i.e. dimnames<-.xts) will not set row names # force them directly attr(x, "dimnames")[[1]] <- attr(x,'.ROWNAMES')[1:NROW(x)] } } attr(x,'.ROWNAMES') <- NULL #if(is.null(attr(x,'.RECLASS')) || attr(x,'.RECLASS')) {#should it be reclassed? if(isTRUE(attr(x,'.RECLASS'))) {#should it be reclassed? #attr(x,'.RECLASS') <- NULL do.call(paste('re',oldCLASS,sep='.'),list(x)) } else { #attr(x,'.RECLASS') <- NULL x } } else { #attr(x,'.RECLASS') <- NULL x } } #' @rdname reclass #' @aliases use.reclass Reclass <- function(x) { xx <- match.call() xxObj <- eval.parent(parse(text=all.vars(xx)[1]), 1) inObj <- try.xts(xxObj, error=FALSE) xx <- eval(match.call()[[-1]]) reclass(xx, inObj) } use.reclass <- Reclass #' Extract and Set .CLASS Attribute #' #' Extraction and replacement functions to access the xts '.CLASS' attribute. #' The '.CLASS' attribute is used by `reclass()` to transform an xts object #' back to its original class. #' #' This is meant for use in conjunction with `try.xts()` and `reclass()` and is #' is not intended for daily use. While it's possible to interactively coerce #' objects to other classes than originally derived from, it's likely to cause #' unexpected behavior. It is best to use the usual `as.xts()` and other #' classes' `as` methods. #' #' @param x An xts object. #' @param value The new value to assign to the '.CLASS' attribute. #' #' @return Called for its side-effect of changing the '.CLASS' attribute. #' #' @author Jeffrey A. Ryan #' #' @seealso [`as.xts()`], [`reclass()`] #' #' @keywords utilities `CLASS` <- function(x) { cl <- attr(x,'.CLASS') if(!is.null(cl)) { attr(cl, 'class') <- 'CLASS' return(cl) } return(NULL) } `print.CLASS` <- function(x,...) { cat(paste("previous class:",x),"\n") } #' @rdname CLASS `CLASS<-` <- function(x,value) { UseMethod("CLASS<-") } `CLASS<-.xts` <- function(x,value) { attr(x,".CLASS") <- value x } xts/R/POSIX.R0000644000176200001440000000156014654242576012337 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' @rdname as.xts as.xts.POSIXt <- function(x, ...) { xts(NULL, order.by=x) } xts/R/adj.time.R0000644000176200001440000000255614654242576013136 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' @rdname align.time adj.time <- function(x, ...) { tr <- match.call(expand.dots=FALSE)$... if(length(tr) < 1) return(x) oClass <- class(x) x <- as.POSIXlt(x) ntime <- as.environment(unclass(x)) lapply(tr, function(T) { assign(all.vars(T), with(x, eval(T)), envir=ntime) }) x <- structure(list( sec=ntime$sec, min=ntime$min, hour=ntime$hour, mday=ntime$mday, month=ntime$mon, year=ntime$year, wday=ntime$wday, yday=ntime$yday,isdst=ntime$isdst), tzone=attr(x,"tzone"), class=c("POSIXlt","POSIXt")) do.call(paste('as',oClass[1],sep='.'), list(x)) } xts/R/endpoints.R0000644000176200001440000001532414654242576013443 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' Locate Endpoints by Time #' #' Extract index locations for an xts object that correspond to the *last* #' observation in each period specified by `on` and `k`. #' #' `endpoints()` returns a numeric vector that always begins with zero and ends #' with the number of observations in `x`. #' #' Periods are always based on the distance from the UNIX epoch (midnight #' 1970-01-01 UTC), *not the first observation in `x`*. See the examples. #' #' Valid values for the `on` argument are: \dQuote{us} (microseconds), #' \dQuote{microseconds}, \dQuote{ms} (milliseconds), \dQuote{milliseconds}, #' \dQuote{secs} (seconds), \dQuote{seconds}, \dQuote{mins} (minutes), #' \dQuote{minutes}, \dQuote{hours}, \dQuote{days}, \dQuote{weeks}, #' \dQuote{months}, \dQuote{quarters}, and \dQuote{years}. #' #' @param x An xts object. #' @param on A character string specifying the period. #' @param k The number of periods each endpoint should cover. #' #' @return A numeric vector of beginning with 0 and ending with the number of #' of observations in `x`. #' #' @author Jeffrey A. Ryan #' @keywords utilities #' @examples #' #' data(sample_matrix) #' #' endpoints(sample_matrix) #' endpoints(sample_matrix, "weeks") #' #' ### example of how periods are based on the UNIX epoch, #' ### *not* the first observation of the data series #' x <- xts(1:38, yearmon(seq(2018 - 1/12, 2021, 1/12))) #' # endpoints for the end of every other year #' ep <- endpoints(x, "years", k = 2) #' # Dec-2017 is the end of the *first* year in the data. But when you start from #' # Jan-1970 and use every second year end as your endpoints, the endpoints are #' # always December of every odd year. #' x[ep, ] #' endpoints <- function(x,on='months',k=1) { if(k < 1) { stop("'k' must be > 0") } if(timeBased(x)) { NR <- length(x) x <- xts(, order.by=x) } else NR <- NROW(x) addlast <- TRUE # remove automatic NR last value if(!is.xts(x)) x <- try.xts(x, error='must be either xts-coercible or timeBased') # special-case "secs" and "mins" for back-compatibility if(on == "secs" || on == "mins") on <- substr(on, 1L, 3L) on <- match.arg(on, c("years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds", "microseconds", "ms", "us")) # posixltindex is costly in memory (9x length of time) # make sure we really need it if(on %in% c('years','quarters','months','weeks','days')) posixltindex <- as.POSIXlt(.POSIXct(.index(x)),tz=tzone(x)) include_last <- function(x, k) { len <- length(x) i <- seq(1L ,len, k) if(i[length(i)] != len) { i <- c(i, len) } ep[i] } switch(on, "years" = { as.integer(c(0, which(diff(posixltindex$year %/% k + 1) != 0), NR)) }, "quarters" = { ixyear <- posixltindex$year * 100L + 190000L ixqtr <- ixyear + posixltindex$mon %/% 3L + 1L ep <- c(0L, which(diff(ixqtr) != 0L), NR) if(k > 1) { ep <- include_last(ep, k) } ep }, "months" = { ixmon <- posixltindex$year * 100L + 190000L + posixltindex$mon ep <- .Call(C_endpoints, ixmon, 1L, 1L, addlast) if(k > 1) { ep <- include_last(ep, k) } ep }, "weeks" = { .Call(C_endpoints, .index(x)+3L*86400L, 604800L, k, addlast) }, "days" = { ixyday <- posixltindex$year * 1000L + 1900000L + posixltindex$yday .Call(C_endpoints, ixyday, 1L, k, addlast) }, # non-date slicing should be indifferent to TZ and DST, so use math instead "hours" = { .Call(C_endpoints, .index(x), 3600L, k, addlast) }, "minutes" = { .Call(C_endpoints, .index(x), 60L, k, addlast) }, "seconds" = { .Call(C_endpoints, .index(x), 1L, k, addlast) }, "ms" = , "milliseconds" = { sec2ms <- .index(x) * 1e3 .Call(C_endpoints, sec2ms, 1L, k, addlast) }, "us" = , "microseconds" = { sec2us <- .index(x) * 1e6 .Call(C_endpoints, sec2us, 1L, k, addlast) } ) } `startof` <- function(x,by='months', k=1) { ep <- endpoints(x,on=by, k=k) (ep+1)[-length(ep)] } `endof` <- function(x,by='months', k=1) { endpoints(x,on=by, k=k)[-1] } #' Create a POSIXct Object #' #' Easily create of time stamps corresponding to the first or last observation #' in a specified time period. #' #' This is a wrapper to [`ISOdatetime()`] with defaults corresponding to the #' first or last possible time in a given period. #' #' @param year,month,day Numeric values to specify a day. #' @param hour,min,sec Numeric vaues to specify time within a day. #' @param tz Timezone used for conversion. #' #' @return An POSIXct object. #' #' @author Jeffrey A. Ryan #' #' @seealso [`ISOdatetime()`] #' #' @keywords utilities #' @examples #' #' firstof(2000) #' firstof(2005,01,01) #' #' lastof(2007) #' lastof(2007,10) #' `firstof` <- function(year=1970,month=1,day=1,hour=0,min=0,sec=0,tz="") { ISOdatetime(year,month,day,hour,min,sec,tz) } #' @param subsec Number of sub-seconds. #' @rdname firstof lastof <- function (year = 1970, month = 12, day = 31, hour = 23, min = 59, sec = 59, subsec=.99999, tz = "") { if(!missing(sec) && sec %% 1 != 0) subsec <- 0 sec <- ifelse(year < 1970, sec, sec+subsec) # <1970 asPOSIXct bug workaround #sec <- sec + subsec mon.lengths <- c(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) if (missing(day)) { day <- ifelse(month %in% 2, ifelse(((year%%4 %in% 0 & !year%%100 %in% 0) | (year%%400 %in% 0)), 29, 28), mon.lengths[month]) } # strptime has an issue (bug?) which returns NA when passed # 1969-12-31-23-59-59; pass 58.9 secs instead. sysTZ <- Sys.getenv("TZ") if (length(c(year, month, day, hour, min, sec)) == 6 && all(c(year, month, day, hour, min, sec) == c(1969, 12, 31, 23, 59, 59)) && (sysTZ == "" || isUTC(sysTZ))) sec <- sec-1 ISOdatetime(year, month, day, hour, min, sec, tz) } xts/R/xts.R0000644000176200001440000004315214702273113012237 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # xts() index attribute precedence should be: # 1. .index* value (e.g. .indexTZ) # backward compatibility # 2. t* value (e.g. tzone) # current function to override index attribute # 3. attribute on order.by # overridden by either 2 above # # Do we always have to override the value of an existing tzone on the index # because the default value is Sys.getenv("TZ")? # # .xts() index attribute precedence is similar. But we cannot override tclass # because it's a formal argument with a specific default. Historically .xts() # has always set the tclass to POSIXct by default, whether or not the 'index' # argument already had a tclass attribute. #' Create or Test For An xts Time-Series Object #' #' Constructor function for creating an extensible time-series object. #' #' `xts()` is used to create an xts object from raw data inputs. The xts class #' inherits from and extends the zoo class, which means most zoo functions can #' be used on xts objects. #' #' The `xts()` constructor is the preferred way to create xts objects. It #' performs several checks to ensure it returns a well-formed xts object. The #' `.xts()` constructor is mainly for internal use. It is more efficient then #' the regular `xts()` constructor because it doesn't perform as many validity #' checks. Use it with caution. #' #' Similar to zoo objects, xts objects must have an ordered index. While zoo #' indexes cannot contain duplicate values, xts objects have optionally #' supported duplicate index elements since version 0.5-0. The xts class has #' one additional requirement: the index must be a time-based class. Currently #' supported classes include: \sQuote{Date}, \sQuote{POSIXct}, \sQuote{timeDate}, #' as well as \sQuote{yearmon} and \sQuote{yearqtr} where the index values #' remain unique. #' #' The uniqueness requirement was relaxed in version 0.5-0, but is still #' enforced by default. Setting `unique = FALSE` skips the uniqueness check and #' only ensures that the index is ordered via the `isOrdered()` function. #' #' As of version 0.10-0, xts no longer allows missing values in the index. This #' is because many xts functions expect all index values to be finite. The most #' important of these is `merge.xts()`, which is used ubiquitously. Missing #' values in the index are usually the result of a date-time conversion error #' (e.g. incorrect format, non-existent time due to daylight saving time, etc.). #' Because of how non-finite numbers are represented, a missing timestamp will #' always be at the end of the index (except if it is `-Inf`, which will be #' first). #' #' Another difference from \pkg{zoo} is that xts object may carry additional #' attributes that may be desired in individual time-series handling. This #' includes the ability to augment the objects data with meta-data otherwise #' not cleanly attachable to a standard zoo object. These attributes may be #' assigned and extracted via [`xtsAttributes()`] and [`xtsAttributes<-`], #' respectively. #' #' Examples of usage from finance may include the addition of data for keeping #' track of sources, last-update times, financial instrument descriptions or #' details, etc. #' #' The idea behind \pkg{xts} is to offer the user the ability to utilize a #' standard zoo object, while providing an mechanism to customize the object's #' meta-data, as well as create custom methods to handle the object in a manner #' required by the user. #' #' Many xts-specific methods have been written to better handle the unique #' aspects of xts. These include, subsetting (`[`), `merge()`, `cbind()`, #' `rbind()`, `c()`, math and logical operations, `lag()`, `diff()`, #' `coredata()`, `head()`, and `tail()`. There are also xts-specific methods #' for converting to/from R's different time-series classes. #' #' Subsetting via `[` methods offers the ability to specify dates by range, if #' they are enclosed in quotes. The style borrows from python by creating #' ranges separated by a double colon \dQuote{"::"} or \dQuote{"/"}. Each side #' of the range may be left blank, which would then default to the start and #' end of the data, respectively. To specify a subset of times, it is only #' required that the time specified be in standard ISO format, with some form #' of separation between the elements. The time must be *left-filled*, that is #' to specify a full year one needs only to provide the year, a month requires #' the full year and the integer of the month requested - e.g. '1999-01'. This #' format would extend all the way down to seconds - e.g. '1999-01-01 08:35:23'. #' Leading zeros are not necessary. See the examples for more detail. #' #' Users may also extend the xts class to new classes to allow for method #' overloading. #' #' Additional benefits derive from the use of [`as.xts()`] and [`reclass()`], #' which allow for lossless two-way conversion between common R time-series #' classes and the xts object structure. See those functions for more detail. #' #' @param x An object containing the underlying data. #' @param order.by A corresponding vector of dates/times of a known time-based #' class. See Details. #' @param index A corresponding *numeric* vector specified as seconds since #' the UNIX epoch (1970-01-01 00:00:00.000). #' @param frequency Numeric value indicating the frequency of `order.by`. See #' details. #' @param unique Can the index only include unique timestamps? Ignored when #' `check = FALSE`. #' @param check Must the index be ordered? The index cannot contain duplicates #' when `check = TRUE` and `unique = TRUE`. #' @param tclass Time class to use for the index. See [`tclass()`]. #' @param tzone Time zone of the index (ignored for indices without a time #' component, e.g. Date, yearmon, yearqtr). See [`tzone()`]. #' @param \dots Additional attributes to be added. See details. #' #' @return An S3 object of class xts. #' #' @author Jeffrey A. Ryan and Joshua M. Ulrich #' #' @seealso [`as.xts()`], [`index()`][xts::index.xts], [`tclass()`], [`tformat()`], [`tzone()`], #' [`xtsAttributes()`] #' #' @references \pkg{zoo} #' #' @keywords utilities #' @examples #' #' data(sample_matrix) #' sample.xts <- as.xts(sample_matrix, descr='my new xts object') #' #' class(sample.xts) #' str(sample.xts) #' #' head(sample.xts) # attribute 'descr' hidden from view #' attr(sample.xts,'descr') #' #' sample.xts['2007'] # all of 2007 #' sample.xts['2007-03/'] # March 2007 to the end of the data set #' sample.xts['2007-03/2007'] # March 2007 to the end of 2007 #' sample.xts['/'] # the whole data set #' sample.xts['/2007'] # the beginning of the data through 2007 #' sample.xts['2007-01-03'] # just the 3rd of January 2007 #' `xts` <- function(x=NULL, order.by=index(x), frequency=NULL, unique=TRUE, tzone=Sys.getenv("TZ"), ...) { if(is.null(x) && missing(order.by)) return(.xts(NULL, integer())) if(!timeBased(order.by)) stop("order.by requires an appropriate time-based object") #if(NROW(x) != length(order.by)) if(NROW(x) > 0 && NROW(x) != length(order.by)) stop("NROW(x) must match length(order.by)") order.by_ <- order.by # make local copy and don't change order.by if(inherits(order.by, 'Date')) { # convert to GMT POSIXct if specified order.by_ <- .POSIXct(unclass(order.by) * 86400, tz = "UTC") } if(!isOrdered(order.by_, strictly = !unique)) { indx <- order(order.by_) if(!is.null(x)) { if(NCOL(x) > 1 || is.matrix(x) || is.data.frame(x)) { x <- x[indx,,drop=FALSE] } else x <- x[indx] } order.by_ <- order.by_[indx] } if(is.null(x)) { x <- numeric(0) } else if (is.list(x)) { # list or data.frame if (is.data.frame(x)) { x <- as.matrix(x) } else { stop("cannot convert lists to xts objects") } } else if (NROW(x) > 0) { x <- as.matrix(x) } # else 'x' is a zero-length vector. Do not *add* dims via as.matrix(). # It's okay if 'x' already has dims. if(inherits(order.by, "dates")) { fmt <- "%m/%d/%y" if(inherits(order.by, "chron")) { fmt <- paste0("(", fmt, " %H:%M:%S)") } order.by_ <- strptime(as.character(order.by_), fmt) # POSIXlt } index <- as.numeric(as.POSIXct(order.by_)) if(any(!is.finite(index))) stop("'order.by' cannot contain 'NA', 'NaN', or 'Inf'") # process index attributes ctor.call <- match.call(expand.dots = TRUE) tformat. <- attr(order.by, "tformat") if(hasArg(".indexFORMAT")) { warning(sQuote(".indexFORMAT"), " is deprecated, use tformat instead.") tformat. <- eval.parent(ctor.call$.indexFORMAT) } else if(hasArg("tformat")) { tformat. <- eval.parent(ctor.call$tformat) } tclass. <- attr(order.by, "tclass") if(hasArg(".indexCLASS")) { warning(sQuote(".indexCLASS"), " is deprecated, use tclass instead.") tclass. <- eval.parent(ctor.call$.indexCLASS) } else if(hasArg("tclass")) { tclass. <- eval.parent(ctor.call$tclass) } else if(is.null(tclass.)) { tclass. <- class(order.by) if(inherits(order.by, "POSIXt")) { #tclass. <- tclass.[tclass. != "POSIXt"] } } tzone. <- tzone # default Sys.getenv("TZ") if(hasArg(".indexTZ")) { warning(sQuote(".indexTZ"), " is deprecated, use tzone instead.") tzone. <- eval.parent(ctor.call$.indexTZ) } else if(hasArg("tzone")) { tzone. <- eval.parent(ctor.call$tzone) } else { # no tzone argument if(inherits(order.by, "timeDate")) { tzone. <- order.by@FinCenter } else if(!is.null(attr(order.by, "tzone"))) { tzone. <- attr(order.by, "tzone") } } if(isClassWithoutTZ(object = order.by)) { if((hasArg(".indexTZ") || hasArg("tzone")) && !isUTC(tzone.)) { warning(paste(sQuote('tzone'),"setting ignored for ", paste(class(order.by), collapse=", "), " indexes")) } tzone. <- "UTC" # change anything in isUTC() to UTC } # xts' tzone must only contain one element (POSIXlt tzone has 3) tzone. <- tzone.[1L] x <- structure(.Data = x, index = structure(index, tzone = tzone., tclass = tclass., tformat = tformat.), class=c('xts','zoo'), ...) # remove any index attributes that came through '...' index.attr <- c(".indexFORMAT", "tformat", ".indexCLASS", "tclass", ".indexTZ", "tzone") for(iattr in index.attr) { attr(x, iattr) <- NULL } if(!is.null(attributes(x)$dimnames[[1]])) # this is very slow if user adds rownames, but maybe that is deserved :) dimnames(x) <- dimnames(x) # removes row.names x } #' @rdname xts `.xts` <- function(x=NULL, index, tclass=c("POSIXct","POSIXt"), tzone=Sys.getenv("TZ"), check=TRUE, unique=FALSE, ...) { if(check) { if( !isOrdered(index, increasing=TRUE, strictly=unique) ) stop('index is not in ',ifelse(unique, 'strictly', ''),' increasing order') } index_out <- index if(!is.numeric(index) && timeBased(index)) index_out <- as.numeric(as.POSIXct(index)) if(!is.null(x) && NROW(x) != length(index)) stop("index length must match number of observations") if(any(!is.finite(index_out))) stop("'index' cannot contain 'NA', 'NaN', or 'Inf'") if(!is.null(x)) { if(!is.matrix(x)) x <- as.matrix(x) } else if(length(x) == 0 && !is.null(x)) { x <- vector(storage.mode(x)) } else x <- numeric(0) # process index attributes ctor.call <- match.call(expand.dots = TRUE) tformat. <- attr(index, "tformat") if(hasArg(".indexFORMAT")) { warning(sQuote(".indexFORMAT"), " is deprecated, use tformat instead.") tformat. <- eval.parent(ctor.call$.indexFORMAT) } else if(hasArg("tformat")) { tformat. <- eval.parent(ctor.call$tformat) } tclass. <- tclass # default POSIXct if(hasArg(".indexCLASS")) { warning(sQuote(".indexCLASS"), " is deprecated, use tclass instead.") tclass. <- eval.parent(ctor.call$.indexCLASS) } else if(hasArg("tclass")) { tclass. <- eval.parent(ctor.call$tclass) } else { # no tclass argument tclass. <- attr(index, "tclass") if(is.null(tclass.) && timeBased(index)) { tclass. <- class(index) } else { if(!identical(tclass., c("POSIXct", "POSIXt"))) { # index argument has 'tclass' attribute but it will be ignored # FIXME: # This warning causes errors in dependencies (e.g. portfolioBacktest, # when the warning is thrown from PerformanceAnalytics). Reinstate this # warning after fixing downstream packages. # warning("the index tclass attribute is ", index.class, # " but will be changed to (POSIXct, POSIXt)") tclass. <- tclass # default POSIXct } } } tzone. <- tzone # default Sys.getenv("TZ") if(hasArg(".indexTZ")) { warning(sQuote(".indexTZ"), " is deprecated, use tzone instead.") tzone. <- eval.parent(ctor.call$.indexTZ) } else if(hasArg("tzone")) { tzone. <- eval.parent(ctor.call$tzone) } else { # no tzone argument if(inherits(index, "timeDate")) { tzone. <- index@FinCenter } else if(!is.null(attr(index, "tzone"))) { tzone. <- attr(index, "tzone") } } if(isClassWithoutTZ(object = index)) { if((hasArg(".indexTZ") || hasArg("tzone")) && !isUTC(tzone.)) { warning(paste(sQuote('tzone'),"setting ignored for ", paste(class(index), collapse=", "), " indexes")) } tzone. <- "UTC" # change anything in isUTC() to UTC } # xts' tzone must only contain one element (POSIXlt tzone has 3) tzone <- tzone[1L] xx <- .Call(C_add_xtsCoreAttributes, x, index_out, tzone., tclass., c('xts','zoo'), tformat.) # remove any index attributes that came through '...' # and set any user attributes (and/or dim, dimnames, etc) dots.names <- eval(substitute(alist(...))) if(length(dots.names) > 0L) { dot.attrs <- list(...) drop.attr <- c(".indexFORMAT", "tformat", ".indexCLASS", ".indexTZ") dot.attrs[drop.attr] <- NULL attributes(xx) <- c(attributes(xx), dot.attrs) } # ensure there are no rownames (they may have come though dimnames) rn <- dimnames(xx)[[1]] if(!is.null(rn)) { attr(xx, '.ROWNAMES') <- rn dimnames(xx)[1] <- list(NULL) } xx } #' @rdname xts `is.xts` <- function(x) { inherits(x,'xts') && is.numeric(.index(x)) && !is.null(tclass(x)) } #' Convert Objects To and From xts #' #' Conversion S3 methods to coerce data objects of arbitrary classes to xts #' and back, without losing any attributes of the original format. #' #' A simple and reliable way to convert many different objects into a uniform #' format for use within \R. #' #' `as.xts()` can convert objects of the following classes into an xts object: #' object: [timeSeries][timeSeries::timeSeries], [ts], [matrix], [data.frame], #' and [zoo][zoo::zoo]. `xtsible()` safely checks whether an object can be converted to #' an xts object. #' #' Additional `name = value` pairs may be passed to the function to be added to #' the new object. A special [`print.xts()`] method ensures the attributes are #' hidden from view, but will be available via \R's standard `attr()` function, #' as well as the [`xtsAttributes()`] function. #' #' When `.RECLASS = TRUE`, the returned xts object internally preserves all #' relevant attribute/slot data from the input `x`. This allows for temporary #' conversion to xts in order to use zoo and xts compatible methods. See #' [`reclass()`] for details. #' #' @param x Data object to convert. See details for supported types. #' @param dateFormat What class should the dates be converted to? #' @param FinCenter,recordIDs,title,documentation See [timeSeries][timeSeries::timeSeries] help. #' @param order.by,frequency See [zoo][zoo::zoo] help. #' @param \dots Additional parameters or attributes. #' @param .RECLASS Should the conversion be reversible via [`reclass()`]? #' #' @return An S3 object of class xts. #' #' @author Jeffrey A. Ryan #' #' @seealso [`xts()`], [`reclass()`], [`zoo()`][zoo::zoo] #' #' @keywords utilities #' @examples #' #' \dontrun{ #' # timeSeries #' library(timeSeries) #' x <- timeSeries(1:10, 1:10) #' #' str(as.xts(x)) #' str(reclass(as.xts(x))) #' str(try.xts(x)) #' str(reclass(try.xts(x))) #' } #' `as.xts` <- function(x,...) { UseMethod('as.xts') } #' @rdname as.xts xtsible <- function(x) { if(inherits(try(as.xts(x),silent=TRUE),'try-error')) { FALSE } else TRUE } `re.xts` <- function(x,...) { # simply return the object return(x) } `as.xts.xts` <- function(x,...,.RECLASS=FALSE) { # Cannot use 'zoo()' on objects of class 'zoo' or '.CLASS' (etc.?) # Is the equivalent of a 'coredata.xts' needed? - jmu #yy <- coredata(x) #attr(yy, ".CLASS") <- NULL # using new coredata.xts method - jar if(length(x) == 0 && (!is.null(index(x)) && length(index(x))==0)) return(x) if(.RECLASS) { xx <- xts(coredata(x), order.by=index(x), .CLASS='xts', ...) } else { xx <- xts(coredata(x), order.by=index(x), ...) } xx } xts/R/startOfYear.R0000644000176200001440000000201614654242576013675 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . `startOfYear` <- function(from=1900, to=2200, origin=1970) { .Call(C_do_startofyear, from = as.integer(from), to = as.integer(to), origin = as.integer(origin)) } xts/R/utils.R0000644000176200001440000000202614654242576012573 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . naCheck <- function(x, n=0) { if(is.null(dim(x)[2])) { NAs <- .Call(C_naCheck, x, TRUE) } else NAs <- .Call(C_naCheck, rowSums(x), TRUE) ret <- list() ret$NAs <- NAs ret$nonNA <- (1+NAs):NROW(x) ret$beg <- n+NAs invisible(ret) } xts/R/first.R0000644000176200001440000001565614654242576012577 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' Return First or Last n Elements of A Data Object #' #' Generic functions to return the first or last elements or rows of a vector #' or two-dimensional data object. #' #' A more advanced subsetting is available for zoo objects with indexes #' inheriting from POSIXt or Date classes. #' #' Quickly and easily extract the first or last `n` observations of an object. #' When `n` is a number, these functions are similar to [`head()`] and #' [`tail()`], but only return the *first* or *last* observation by default. #' #' `n` can be a character string if `x` is an xts object or coerceable to xts. #' It must be of the form \sQuote{n period}, where 'n' is a numeric value #' (1 if not provided) describing the number of periods to return. Valid #' periods are: secs, seconds, mins, minutes, hours, days, weeks, months, #' quarters, and years. #' #' The 'period' portion can be any frequency greater than or equal to the #' frequency of the object's time index. For example, `first(x, "2 months")` #' will return the first 2 months of data even if `x` is hourly frequency. #' Attempts to set 'period' to a frequency less than the object's frequency #' will throw an error. #' #' `n` may be positive or negative, whether it's a number or character string. #' When `n` is positive, the functions return the obvious result. For example, #' `first(x, "1 month")` returns the first month's data. When `n` is negative, #' all data *except* first month's is returned. #' #' Requesting more data than is in `x` will throw a warning and simply return #' `x`. #' #' @param x An object. #' @param n Number of observations to return. #' @param keep Should removed values be kept as an attribute on the result? #' @param \dots Arguments passed to other methods. #' #' @return A subset of elements/rows of the original data. #' #' @author Jeffrey A. Ryan #' #' @keywords utilities #' @examples #' #' first(1:100) #' last(1:100) #' #' data(LakeHuron) #' first(LakeHuron,10) #' last(LakeHuron) #' #' x <- xts(1:100, Sys.Date()+1:100) #' first(x, 10) #' first(x, '1 day') #' first(x, '4 days') #' first(x, 'month') #' last(x, '2 months') #' last(x, '6 weeks') #' `first` <- function(x,...) { UseMethod("first") } #' @rdname first `first.default` <- function(x,n=1,keep=FALSE,...) { if(length(x) == 0) return(x) if(is.character(n)) { xx <- try.xts(x, error=FALSE) if(is.xts(xx)) { xx <- first.xts(x, n=n, keep=keep, ...) return(reclass(xx)) } } if(is.null(dim(x))) { if(n > 0) { sub <- seq_len(min(n, length(x))) xx <- x[sub] if(keep) xx <- structure(xx,keep=x[(-(-n)+1):NROW(x)]) xx } else if(n < 0) { sub <- seq.int(to = length(x), length.out = max(length(x)-(-n), 0L)) xx <- x[sub] if(keep) xx <- structure(xx,keep=x[1:(-n)]) xx } else { xx <- x[0] if(keep) xx <- structure(xx,keep=x[0]) xx } } else { if(n > 0) { sub <- seq_len(min(n, NROW(x))) xx <- x[sub,,drop=FALSE] if(keep) xx <- structure(xx,keep=x[(-(-n)+1):NROW(x),]) xx } else if(n < 0) { sub <- seq.int(to = NROW(x), length.out = max(NROW(x)-(-n), 0L)) xx <- x[sub,,drop=FALSE] if(keep) xx <- structure(xx,keep=x[1:(-n),]) xx } else { xx <- x[0,,drop=FALSE] if(keep) xx <- structure(xx,keep=x[0,]) xx } } } #' @rdname first `first.xts` <- function(x,n=1,keep=FALSE,...) { if(length(x) == 0) return(x) if(is.character(n)) { # n period set np <- strsplit(n," ",fixed=TRUE)[[1]] if(length(np) > 2 || length(np) < 1) stop(paste("incorrectly specified",sQuote("n"),sep=" ")) # series periodicity sp <- periodicity(x) # requested periodicity$units sp.units <- sp[["units"]] rpu <- np[length(np)] rpf <- ifelse(length(np) > 1, as.numeric(np[1]), 1) if(rpu == sp.units) { n <- rpf } else { # if singular - add an s to make it work if(substr(rpu,length(strsplit(rpu,'')[[1]]),length(strsplit(rpu,'')[[1]])) != 's') rpu <- paste(rpu,'s',sep='') u.list <- list(secs=4,seconds=4,mins=3,minutes=3,hours=2,days=1, weeks=1,months=1,quarters=1,years=1) dt.options <- c('seconds','secs','minutes','mins','hours','days', 'weeks','months','quarters','years') if(!rpu %in% dt.options) stop(paste("n must be numeric or use",paste(dt.options,collapse=','))) dt <- dt.options[pmatch(rpu,dt.options)] if(u.list[[dt]] > u.list[[sp.units]]) { # req is for higher freq data period e.g. 100 mins of daily data stop(paste("At present, without some sort of magic, it isn't possible", "to resolve",rpu,"from",sp$scale,"data")) } ep <- endpoints(x,dt) if(rpf > length(ep)-1) { rpf <- length(ep)-1 warning("requested length is greater than original") } if(rpf > 0) { n <- ep[rpf+1] if(is.null(dim(x))) { xx <- x[1:n] } else { xx <- x[1:n,,drop=FALSE] } if(keep) xx <- structure(xx,keep=x[(ep[-(-rpf)+1]+1):NROW(x)]) return(xx) } else if(rpf < 0) { n <- ep[-rpf+1]+1 if(is.null(dim(x))) { xx <- x[n:NROW(x)] } else { xx <- x[n:NROW(x),,drop=FALSE] } if(keep) xx <- structure(xx,keep=x[1:(ep[-rpf+1])]) return(xx) } else { if(is.null(dim(x))) { xx <- x[0] } else { xx <- x[0,,drop=FALSE] } if(keep) xx <- structure(xx,keep=x[0]) return(xx) } } } if(length(n) != 1) stop("n must be of length 1") if(n > 0) { n <- min(n, NROW(x)) if(is.null(dim(x))) { xx <- x[1:n] } else { xx <- x[1:n,,drop=FALSE] } if(keep) xx <- structure(xx,keep=x[(-(-n)+1):NROW(x)]) xx } else if(n < 0) { if(abs(n) >= NROW(x)) return(x[0]) if(is.null(dim(x))) { xx <- x[(-n+1):NROW(x)] } else { xx <- x[(-n+1):NROW(x),,drop=FALSE] } if(keep) xx <- structure(xx,keep=x[1:(-n)]) xx } else { if(is.null(dim(x))) { xx <- x[0] } else { xx <- x[0,,drop=FALSE] } if(keep) xx <- structure(xx,keep=x[0]) xx } } xts/R/na.R0000644000176200001440000001121214654242576012026 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . na.omit.xts <- function(object, ...) { xx <- .Call(C_na_omit_xts, object) if(length(xx)==0) return(structure(xts(,),.Dim=c(0,NCOL(object)))) naa <- attr(xx,'na.action') if(length(naa) == 0) return(xx) naa.index <- .index(object)[naa] ROWNAMES <- attr(object,'.ROWNAMES') if(!is.null(ROWNAMES)) { naa.rownames <- ROWNAMES[naa] } else naa.rownames <- NULL attr(xx,'na.action') <- structure(naa, index=naa.index, .ROWNAMES=naa.rownames) return(xx) } na.exclude.xts <- function(object, ...) { xx <- .Call(C_na_omit_xts, object) naa <- attr(xx,'na.action') if(length(naa) == 0) return(xx) naa.index <- .index(object)[naa] ROWNAMES <- attr(object,'.ROWNAMES') if(!is.null(ROWNAMES)) { naa.rownames <- ROWNAMES[naa] } else naa.rownames <- NULL attr(xx,'na.action') <- structure(naa, class="exclude", index=naa.index, .ROWNAMES=naa.rownames) return(xx) } na.restore <- function(object, ...) { UseMethod("na.restore") } na.restore.xts <- function(object, ...) { if(is.null(na.action(object))) return(object) structure(merge(structure(object,na.action=NULL), .xts(,attr(na.action(object),"index"))), .Dimnames=list(NULL, colnames(object))) } na.replace <- function(x) { .Deprecated("na.restore") if(is.null(xtsAttributes(x)$na.action)) return(x) # Create 'NA' xts object tmp <- xts(matrix(rep(NA,NCOL(x)*NROW(x)), ncol=NCOL(x)), attr(xtsAttributes(x)$na.action, 'index')) # Ensure xts 'NA' object has *all* the same attributes # as the object 'x'; this is necessary for rbind to # work correctly CLASS(tmp) <- CLASS(x) xtsAttributes(tmp) <- xtsAttributes(x) attr(x,'na.action') <- attr(tmp,'na.action') <- NULL colnames(tmp) <- colnames(x) rbind(x,tmp) } #' Last Observation Carried Forward #' #' \pkg{xts} method replace `NA` with most recent non-NA #' #' This is the \pkg{xts} method for the S3 generic `na.locf()`. The primary #' difference to note is that after the `NA` fill action is carried out, the #' default it to leave trailing or leading `NA`'s in place. This is different #' than \pkg{zoo} behavior. #' #' @param object An xts object. #' @param na.rm Logical indicating whether leading/trailing `NA` should be #' removed. The default is `FALSE` unlike the zoo method. #' @param fromLast Logical indicating whether observations should be carried #' backward rather than forward. Default is `FALSE`. #' @param maxgap Consecutive runs of observations more than 'maxgap' will #' remain `NA`. See [`na.locf()`][zoo::zoo] for details. #' @param \dots Unused. #' #' @return An object where each `NA` in `object` is replaced by the most recent #' non-NA prior to it. See [`na.locf()`][zoo::zoo] for details. #' #' @author Jeffrey A. Ryan #' #' @seealso [`na.locf()`][zoo::zoo] #' #' @keywords misc #' @examples #' #' x <- xts(1:10, Sys.Date()+1:10) #' x[c(1,2,5,9,10)] <- NA #' #' x #' na.locf(x) #' na.locf(x, fromLast=TRUE) #' na.locf(x, na.rm=TRUE, fromLast=TRUE) #' na.locf.xts <- function(object, na.rm=FALSE, fromLast=FALSE, maxgap=Inf, ...) { maxgap <- min(maxgap, NROW(object)) if(length(object) == 0) return(object) if(hasArg("x") || hasArg("xout")) return(NextMethod(.Generic)) x <- .Call(C_na_locf, object, fromLast, maxgap, Inf) if(na.rm) { return(structure(na.omit(x),na.action=NULL)) } else x } na.fill.xts <- function(object, fill, ix, ...) { if (length(fill) == 1 && missing(ix)) { # na.fill0() may change the storage type of 'object' # make sure 'fill' argument is same type as 'object' fill. <- fill storage.mode(fill.) <- storage.mode(object) return(na.fill0(object, fill.)) } else { NextMethod(.Generic) } } xts/R/ts.R0000644000176200001440000000713714654242576012071 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # methods for handling ts <--> xts `re.ts` <- function(x,...) { # major issue with quick reclass. Basically fails on data < 1970... #tsp.attr <- attr(x,'.tsp') #freq.attr <- attr(x,'.frequency') #xtsAttributes(x) <- NULL #ts(coredata(x), start=tsp.attr[1],frequency=freq.attr) dim <- attr(x, 'dim') if(!is.null(dim) && dim[2]==1) { attr(x,'dim') <- attr(x, 'dimnames') <- NULL } as.ts(x) } #' @rdname as.xts `as.xts.ts` <- function(x,dateFormat,...,.RECLASS=FALSE) { x.mat <- structure(as.matrix(x),dimnames=dimnames(x)) colnames(x.mat) <- colnames(x) # quick hueristic - if numeric index is larger than one # full day of seconds (60*60*24) than use POSIXct, otherwise # assume we are counting my days, not seconds, and use Date -jar # # I am sure this can be improved upon, but for now it is effective # in most circumstances. Will break if frequency or time is from 1 # not _break_ but be less useful # a bigger question is _should_ it throw an error if it can't guess, # or should the user simply beware. if(missing(dateFormat)) { if(frequency(x) == 1) { # assume yearly series: Date yr <- tsp(x)[1] %/% 1 mo <- tsp(x)[1] %% 1 if(mo %% (1/12) != 0 || yr > 3000) { # something finer than year.month is specified - can't reliable convert dateFormat <- ifelse(max(time(x)) > 86400,'POSIXct','Date') order.by <- do.call(paste('as',dateFormat,sep='.'), list(as.numeric(time(x)),origin='1970-01-01',...)) } else { mo <- ifelse(length(mo) < 1, 1,floor(mo * 12)+1) from <- as.Date(firstof(yr,mo),origin='1970-01-01') order.by <- seq.Date(from,length.out=length(time(x)),by='year') } } else if(frequency(x) == 4) { # quarterly series: yearqtr order.by <- as.yearqtr(time(x)) } else if(frequency(x) == 12) { # monthly series: yearmon order.by <- as.yearmon(time(x)) } else stop('could not convert index to appropriate type') } else { order.by <- do.call(paste('as',dateFormat,sep='.'), list(as.numeric(time(x)),...)) } if(.RECLASS) { xx <- xts(x.mat, order.by=order.by, frequency=frequency(x), .CLASS='ts', .CLASSnames=c('frequency'), .tsp=tsp(x), # .frequency=frequency(x), ...) } else { xx <- xts(x.mat, order.by=order.by, frequency=frequency(x), ...) } attr(xx, 'tsp') <- NULL xx } `as.ts.xts` <- function(x,...) { #if(attr(x,'.CLASS')=='ts') return(re.ts(x,...)) TSP <- attr(x, '.tsp') attr(x, '.tsp') <- NULL x <- ts(coredata(x), frequency=frequency(x), ...) if(!is.null(dim(x)) && dim(x)[2]==1) dim(x) <- NULL if(!is.null(TSP)) tsp(x) <- TSP x } xts/R/xts.methods.R0000644000176200001440000005116214654242576013720 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # window.xts contributed by Corwin Joy # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . .subsetTimeOfDay <- function(x, fromTimeString, toTimeString) { validateTimestring <- function(time) { h <- "(?:[01]?\\d|2[0-3])" hm <- paste0(h, "(?::?[0-5]\\d)") hms <- paste0(hm, "(?::?[0-5]\\d)") hmsS <- paste0(hms, "(?:\\.\\d{1,9})?") pattern <- paste(h, hm, hms, hmsS, sep = ")$|^(") pattern <- paste0("^(", pattern, "$)") if (!grepl(pattern, time)) { # FIXME: this isn't necessarily true... # colons aren't required, and neither are all of the components stop("Supply time-of-day subsetting in the format of T%H:%M:%OS/T%H:%M:%OS", call. = FALSE) } } validateTimestring(fromTimeString) validateTimestring(toTimeString) getTimeComponents <- function(time) { # split on decimal point time. <- strsplit(time, ".", fixed = TRUE)[[1]] hms <- time.[1L] # ensure hms string has even nchar nocolon <- gsub(":", "", hms, fixed = TRUE) if (nchar(nocolon) %% 2 > 0) { # odd nchar means leading zero is omitted from hours # all other components require zero padding hms <- paste0("0", hms) } # add colons hms <- gsub("(.{2}):?", ":\\1", hms, perl = TRUE) # remove first character (a colon) hms <- substr(hms, 2, nchar(hms)) # extract components comp <- strsplit(hms, ":", fixed = TRUE)[[1]] complist <- list(hour = comp[1L], min = comp[2L], sec = comp[3L], subsec = time.[2L]) # remove all missing components complist <- complist[!vapply(complist, is.na, logical(1))] # convert to numeric complist <- lapply(complist, as.numeric) # add timezone and return c(tz = "UTC", complist) } # first second in period (no subseconds) from <- do.call(firstof, getTimeComponents(fromTimeString)[-5L]) secBegin <- as.numeric(from) %% 86400L # last second in period to <- do.call(lastof, getTimeComponents(toTimeString)) secEnd <- as.numeric(to) %% 86400L # do subsetting tz <- tzone(x) secOfDay <- as.POSIXlt(index(x), tz = tz) secOfDay <- secOfDay$hour * 60 * 60 + secOfDay$min * 60 + secOfDay$sec if (secBegin <= secEnd) { i <- secOfDay >= secBegin & secOfDay <= secEnd } else { i <- secOfDay >= secBegin | secOfDay <= secEnd } which(i) } .subset_xts <- function(x, i, j, ...) { if(missing(i)) { i <- 1:NROW(x) } if(missing(j)) { j <- 1:NCOL(x) } .Call(C__do_subset_xts, x, i, j, FALSE) } #' Extract Subsets of xts Objects #' #' Details on efficient subsetting of xts objects for maximum performance #' and compatibility. #' #' One of the primary motivations and key points of differentiation of xts is #' the ability to subset rows by specifying ISO-8601 compatible range strings. #' This allows for natural range-based time queries without requiring prior #' knowledge of the underlying class used for the time index. #' #' When `i` is a character string, it is processed as an ISO-8601 formatted #' datetime or time range using [`.parseISO8601()`]. A single datetime is #' parsed from left to to right, according to the following specification: #' #' CCYYMMDD HH:MM:SS.ss+ #' #' A time range can be specified by two datetimes separated by a forward slash #' or double-colon. For example: #' #' CCYYMMDD HH:MM:SS.ss+/CCYYMMDD HH:MM:SS.ss #' #' The ISO8601 time range subsetting uses a custom binary search algorithm to #' efficiently find the beginning and end of the time range. `i` can also be a #' vector of ISO8601 time ranges, which enables subsetting by multiple #' non-contiguous time ranges in one subset call. #' #' The above parsing, both for single datetimes and time ranges, will be done #' on each element when `i` is a character *vector*. This is very inefficient, #' especially for long vectors. In this case, it's recommened to use `I(i)` so #' the xts subset function can process the vector more efficiently. Another #' alternative is to convert `i` to POSIXct before passing it to the subset #' function. See the examples for an illustration of using `I(i)`. #' #' The xts index is stored as POSIXct internally, regardless of the value of #' its `tclass` attribute. So the fastest time-based subsetting is always when #' `i` is a POSIXct vector. #' #' @param x An xts object. #' @param i The rows to extract. Can be a numeric vector, time-based vector, or #' an ISO-8601 style range string (see details). #' @param j The columns to extract, either a numeric vector of column locations #' or a character vector of column names. #' @param drop Should dimension be dropped, if possible? See notes section. #' @param which.i Logical value that determines whether a subset xts object is #' returned (the default), or the locations of the matching rows (when #' `which.i = TRUE`). #' @param \dots Additional arguments (currently unused). #' #' @return An xts object containing the subset of `x`. When `which.i = TRUE`, #' the corresponding integer locations of the matching rows is returned. #' #' @note By design, xts objects always have two dimensions. They cannot be #' vectors like zoo objects. Therefore `drop = FALSE` by default in order to #' preserve the xts object's dimensions. This is different from both matrix and #' zoo, which use `drop = TRUE` by default. Explicitly setting `drop = TRUE` #' may be needed when performing certain matrix operations. #' #' @author Jeffrey A. Ryan #' #' @seealso [`xts()`], [`.parseISO8601()`], [`.index()`] #' #' @references ISO 8601: Date elements and interchange formats - Information #' interchange - Representation of dates and time #' #' @rdname subset.xts #' #' @aliases [.xts subset.xts .subset.xts .subset_xts #' @keywords utilities #' @examples #' #' x <- xts(1:3, Sys.Date()+1:3) #' xx <- cbind(x,x) #' #' # drop = FALSE for xts, differs from zoo and matrix #' z <- as.zoo(xx) #' z/z[,1] #' #' m <- as.matrix(xx) #' m/m[,1] #' #' # this will fail with non-conformable arrays (both retain dim) #' tryCatch( #' xx/x[,1], #' error = function(e) print("need to set drop = TRUE") #' ) #' #' # correct way #' xx/xx[,1,drop = TRUE] #' #' # or less efficiently #' xx/drop(xx[,1]) #' # likewise #' xx/coredata(xx)[,1] #' #' #' x <- xts(1:1000, as.Date("2000-01-01")+1:1000) #' y <- xts(1:1000, as.POSIXct(format(as.Date("2000-01-01")+1:1000))) #' #' x.subset <- index(x)[1:20] #' x[x.subset] # by original index type #' system.time(x[x.subset]) #' x[as.character(x.subset)] # by character string. Beware! #' system.time(x[as.character(x.subset)]) # slow! #' system.time(x[I(as.character(x.subset))]) # wrapped with I(), faster! #' #' x['200001'] # January 2000 #' x['1999/2000'] # All of 2000 (note there is no need to use the exact start) #' x['1999/200001'] # January 2000 #' #' x['2000/200005'] # 2000-01 to 2000-05 #' x['2000/2000-04-01'] # through April 01, 2000 #' y['2000/2000-04-01'] # through April 01, 2000 (using POSIXct series) #' #' #' ### Time of day subsetting #' #' i <- 0:60000 #' focal_date <- as.numeric(as.POSIXct("2018-02-01", tz = "UTC")) #' x <- .xts(i, c(focal_date + i * 15), tz = "UTC", dimnames = list(NULL, "value")) #' #' # Select all observations between 9am and 15:59:59.99999: #' w1 <- x["T09/T15"] # or x["T9/T15"] #' head(w1) #' #' # timestring is of the form THH:MM:SS.ss/THH:MM:SS.ss #' #' # Select all observations between 13:00:00 and 13:59:59.9999 in two ways: #' y1 <- x["T13/T13"] #' head(y1) #' #' x[.indexhour(x) == 13] #' #' # Select all observations between 9:30am and 30 seconds, and 4.10pm: #' x["T09:30:30/T16:10"] #' #' # It is possible to subset time of day overnight. #' # e.g. This is useful for subsetting FX time series which trade 24 hours on week days #' #' # Select all observations between 23:50 and 00:15 the following day, in the xts time zone #' z <- x["T23:50/T00:14"] #' z["2018-02-10 12:00/"] # check the last day #' #' #' # Select all observations between 7pm and 8.30am the following day: #' z2 <- x["T19:00/T08:29:59"] #' head(z2); tail(z2) #' `[.xts` <- function(x, i, j, drop = FALSE, which.i=FALSE,...) { USE_EXTRACT <- FALSE # initialize to FALSE dimx <- dim(x) if(is.null(dimx)) { nr <- length(x) if(nr==0 && !which.i) { idx <- index(x) if(length(idx) == 0) { # this is an empty xts object (zero-length index and no columns) # return it unchanged to match [.zoo return(x) } else { return(xts(rep(NA, length(idx)), idx)[i]) } } nr <- length(.index(x)) nc <- 1L } else { nr <- dimx[1L] nc <- dimx[2L] } if(!missing(i)) { # test for negative subscripting in i if (is.numeric(i)) { # warn and convert if 'i' is not integer-like i_int <- as.integer(i) i_eps <- abs(i) - abs(i_int) if (isTRUE(any(i_eps > sqrt(.Machine$double.eps)))) { warning("converting 'i' to integer because it appears to contain fractions") i <- i_int } #if(any(i < 0)) { if(.Call(C_any_negative, i)) { if(!all(i <= 0)) stop('only zeros may be mixed with negative subscripts') i <- (1:nr)[i] } # check boundary; length check avoids Warning from max(), and # any_negative ensures no NA (as of r608) #if(max(i) > nr) if(length(i) > 0 && max(i) > nr) stop('subscript out of bounds') #i <- i[-which(i == 0)] } else if (timeBased(i) || (inherits(i, "AsIs") && is.character(i)) ) { # Fast binary search on set of dates i <- window_idx(x, index. = i) } else if(is.logical(i)) { i <- which(i) #(1:NROW(x))[rep(i,length.out=NROW(x))] } else if (is.character(i)) { time.of.day.pattern <- "(^/T)|(^T.*?/T)|(^T.*/$)" if (length(i) == 1 && !identical(integer(), grep(time.of.day.pattern, i[1]))) { # time of day subsetting ii <- gsub("T", "", i, fixed = TRUE) ii <- strsplit(ii, "/", fixed = TRUE)[[1L]] if (length(ii) == 1) { # i is right open ended (T.*/) ii <- c(ii, "23:59:59.999999999") } else if (nchar(ii[1L]) == 0) { # i is left open ended (/T) ii[1L] <- "00:00:00.000000000" } # else i is bounded on both sides (T.*/T.*) i <- .subsetTimeOfDay(x, ii[1L], ii[2L]) } else { # enables subsetting by date style strings # must be able to process - and then allow for operations??? i.tmp <- NULL tz <- as.character(tzone(x)) for(ii in i) { adjusted.times <- .parseISO8601(ii, .index(x)[1], .index(x)[nr], tz=tz) if(length(adjusted.times) > 1) { i.tmp <- c(i.tmp, index_bsearch(.index(x), adjusted.times$first.time, adjusted.times$last.time)) } } i <- i.tmp } i_len <- length(i) if(i_len == 1L) # IFF we are using ISO8601 subsetting USE_EXTRACT <- TRUE } if(!isOrdered(i,strictly=FALSE)) { i <- sort(i) } # subset is picky, 0's in the 'i' position cause failures zero.index <- binsearch(0L, i, FALSE) if(!is.na(zero.index)) { # at least one 0; binsearch returns location of last 0 i <- i[-(1L:zero.index)] } if(length(i) <= 0 && USE_EXTRACT) USE_EXTRACT <- FALSE if(which.i) return(i) } # if(!missing(i)) { end if (missing(j)) { if(missing(i)) i <- seq_len(nr) if(length(x)==0) { cdata <- rep(NA, length(i)) storage.mode(cdata) <- storage.mode(x) x.tmp <- .xts(cdata, .index(x)[i], tclass(x), tzone(x), dimnames = list(NULL, colnames(x))) return(x.tmp) } else { if(USE_EXTRACT) { return(.Call(C_extract_col, x, as.integer(1:nc), drop, as.integer(i[1]), as.integer(i[length(i)]))) } else { return(.Call(C__do_subset_xts, x, as.integer(i), as.integer(1:nc), drop)) } } } else # test for negative subscripting in j if (is.numeric(j)) { # warn and convert if 'j' is not integer-like j_int <- as.integer(j) j_eps <- abs(j) - abs(j_int) if (isTRUE(any(j_eps > sqrt(.Machine$double.eps)))) { warning("converting 'j' to integer because it appears to contain fractions") j <- j_int } if(min(j,na.rm=TRUE) < 0) { if(max(j,na.rm=TRUE) > 0) stop('only zeros may be mixed with negative subscripts') j <- (1:nc)[j] } if(max(j,na.rm=TRUE) > nc) stop('subscript out of bounds') } else if(is.logical(j)) { if(length(j) == 1) { j <- (1:nc)[rep(j, nc)] } else if (length(j) > nc) { stop("(subscript) logical subscript too long") } else j <- (1:nc)[j] } else if(is.character(j)) { j <- match(j, colnames(x), nomatch=0L) # ensure all j are in colnames(x) if(any(j==0)) stop("subscript out of bounds") } j0 <- which(!as.logical(j)) if(length(j0)) j <- j[-j0] if(length(j) == 0 || (length(j)==1 && (is.na(j) || j==0))) { if(missing(i)) i <- seq_len(nr) output <- .xts(coredata(x)[i,j,drop=FALSE], .index(x)[i], tclass(x), tzone(x), class = class(x)) xtsAttributes(output) <- xtsAttributes(x) return(output) } if(missing(i)) return(.Call(C_extract_col, x, as.integer(j), drop, 1, nr)) if(USE_EXTRACT) { return(.Call(C_extract_col, x, as.integer(j), drop, as.integer(i[1]), as.integer(i[length(i)]))) } else return(.Call(C__do_subset_xts, x, as.integer(i), as.integer(j), drop)) } `.subset.xts` <- `[.xts` # Replacement method for xts objects # # Adapted from [.xts code, making use of NextGeneric as # replacement function in R already preserves all attributes # and index value is left untouched `[<-.xts` <- #`xtsreplacement` <- function(x, i, j, value) { if (!missing(i)) { i <- x[i, which.i=TRUE] } .Class <- "matrix" NextMethod(.Generic) } # Convert a character or time type to POSIXct for use by subsetting and window # We make this an explicit function so that subset and window will convert dates consistently. .toPOSIXct <- function(i, tz) { if(inherits(i, "POSIXct")) { dts <- i } else if(is.character(i)) { dts <- as.POSIXct(as.character(i),tz=tz) # Need as.character because i could be AsIs from I(dates) } else if (timeBased(i)) { if(inherits(i, "Date")) { dts <- as.POSIXct(as.character(i),tz=tz) } else { # force all other time classes to be POSIXct dts <- as.POSIXct(i,tz=tz) } } else { stop("invalid time / time based class") } dts } # find the rows of index. where the date is in [start, end]. # use binary search. # convention is that NA start or end returns empty index_bsearch <- function(index., start, end) { if(!is.null(start) && is.na(start)) return(NULL) if(!is.null(end) && is.na(end)) return(NULL) if(is.null(start)) { si <- 1 } else { si <- binsearch(start, index., TRUE) } if(is.null(end)) { ei <- length(index.) } else { ei <- binsearch(end, index., FALSE) } if(is.na(si) || is.na(ei) || si > ei) return(NULL) firstlast <- seq.int(si, ei) firstlast } # window function for xts series # return indexes in x matching dates window_idx <- function(x, index. = NULL, start = NULL, end = NULL) { if(is.null(index.)) { usr_idx <- FALSE index. <- .index(x) } else { # Translate the user index to the xts index usr_idx <- TRUE idx <- .index(x) index. <- .toPOSIXct(index., tzone(x)) index. <- unclass(index.) index. <- index.[!is.na(index.)] if(is.unsorted(index.)) { # index. must be sorted for index_bsearch # N.B!! This forces the returned values to be in ascending time order, regardless of the ordering in index, as is done in subset.xts. index. <- sort(index.) } # Fast search on index., faster than binsearch if index. is sorted (see findInterval) base_idx <- findInterval(index., idx) base_idx <- pmax(base_idx, 1L) # Only include indexes where we have an exact match in the xts series match <- idx[base_idx] == index. base_idx <- base_idx[match] index. <- index.[match] index. <- .POSIXct(index., tz = tzone(x)) if(length(base_idx) < 1) return(x[NULL,]) } if(!is.null(start)) { start <- .toPOSIXct(start, tzone(x)) } if(!is.null(end)) { end <- .toPOSIXct(end, tzone(x)) } firstlast <- index_bsearch(index., start, end) if(usr_idx && !is.null(firstlast)) { # Translate from user .index to xts index # We get back upper bound of index as per findInterval tmp <- base_idx[firstlast] res <- .Call(C_fill_window_dups_rev, tmp, .index(x)) firstlast <- rev(res) } firstlast } # window function for xts series, use binary search to be faster than base zoo function # index. defaults to the xts time index. If you use something else, it must conform to the standard for order.by in the xts constructor. # that is, index. must be time based, #' Extract Time Windows from xts Objects #' #' Method for extracting time windows from xts objects. #' #' The xts `window()` method provides an efficient way to subset an xts object #' between a start and end date using a binary search algorithm. Specifically, #' it converts `start` and `end` to POSIXct and then does a binary search of #' the index to quickly return a subset of `x` between `start` and `end`. #' #' Both `start` and `end` may be any class that is convertible to POSIXct, such #' as a character string in the format \sQuote{yyyy-mm-dd}. When `start = NULL` #' the returned subset will begin at the first value of `index.`. When #' `end = NULL` the returned subset will end with the last value of `index.`. #' Otherwise the subset will contain all timestamps where `index.` is between #' `start` and `end`, inclusive. #' #' When `index.` is specified, [`findInterval()`] is used to quickly retrieve #' large sets of sorted timestamps. For the best performance, `index.` must be #' a *sorted* POSIXct vector or a numeric vector of seconds since the epoch. #' `index.` is typically a subset of the timestamps in `x`. #' #' @param x An xts object. #' @param index. A user defined time index (default `.index(x)`). #' @param start A start time coercible to POSIXct. #' @param end An end time coercible to POSIXct. #' @param \dots Unused. #' #' @return The subset of `x` that matches the time window. #' #' @author Corwin Joy #' #' @seealso [`subset.xts()`], [`findInterval()`], [`xts()`] #' #' @keywords ts #' @examples #' #' ## xts example #' x.date <- as.Date(paste(2003, rep(1:4, 4:1), seq(1,19,2), sep = "-")) #' x <- xts(matrix(rnorm(20), ncol = 2), x.date) #' x #' #' window(x, start = "2003-02-01", end = "2003-03-01") #' window(x, start = as.Date("2003-02-01"), end = as.Date("2003-03-01")) #' window(x, index. = x.date[1:6], start = as.Date("2003-02-01")) #' window(x, index. = x.date[c(4, 8, 10)]) #' #' ## Assign to subset #' window(x, index. = x.date[c(4, 8, 10)]) <- matrix(1:6, ncol = 2) #' x #' window.xts <- function(x, index. = NULL, start = NULL, end = NULL, ...) { # scalar NA values are treated as NULL if (isTRUE(is.na(start))) start <- NULL if (isTRUE(is.na(end))) end <- NULL if(is.null(start) && is.null(end) && is.null(index.)) return(x) # dispatch to window.zoo() for yearmon and yearqtr if(any(tclass(x) %in% c("yearmon", "yearqtr"))) { return(NextMethod(.Generic)) } firstlast <- window_idx(x, index., start, end) # firstlast may be NULL .Call(C__do_subset_xts, x, as.integer(firstlast), seq.int(1, ncol(x)), drop = FALSE) } # Declare binsearch to call the routine in binsearch.c binsearch <- function(key, vec, start=TRUE) { # Convert to double if both are not integer if (storage.mode(key) != storage.mode(vec)) { storage.mode(key) <- storage.mode(vec) <- "double" } .Call(C_binsearch, key, vec, start) } xts/R/tformat.R0000644000176200001440000000620614702273713013102 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' Get or Replace the Format of an xts Object's Index #' #' Generic functions to get or replace the format that determines how an xts #' object's index is printed. #' #' Valid values for the `value` argument are the same as specified in the #' *Details* section of [`strptime()`]. #' #' An xts object's `tformat` is `NULL` by default, so the index will be #' be formatted according to its [`tclass()`] (e.g. Date, POSIXct, timeDate, #' yearmon, etc.). #' #' The `tformat` only changes how the index is *printed* and how the row names #' are formatted when xts objects are converted to other classes (e.g. matrix #' or data.frame). It does not affect the internal index in any way. #' #' @param x An xts object. #' @param value New index format string (see [`strptime()`] details for valid #' values). #' @param \dots Arguments passed to other methods. #' #' @return A vector containing the format for the object's index. #' #' @note Both `indexFormat()` and `indexFormat<-` are deprecated in #' favor of `tformat()` and `tformat<-`, respectively. #' #' @author Jeffrey A. Ryan #' #' @seealso [`index()`][xts::index.xts] has more information on the xts index, [`tclass()`] #' details how \pkg{xts} handles the class of the index, [`tzone()`] has more #' information about the index timezone settings. #' #' @keywords ts utilities #' @examples #' #' x <- timeBasedSeq('2010-01-01/2010-01-02 12:00') #' x <- xts(seq_along(x), x) #' #' # set a custom index format #' head(x) #' tformat(x) <- "%Y-%b-%d %H:%M:%OS3" #' head(x) #' `tformat` <- function(x, ...) { UseMethod('tformat') } #' @rdname tformat `tformat<-` <- function(x, value) { UseMethod('tformat<-') } `tformat.default` <- function(x, ...) { attr(x, 'tformat') } `tormat<-.default` <- function(x, value) { attr(x, '.tformat') <- value x } `tformat.xts` <- function(x, ...) { ix <- .index(x) attr(ix, 'tformat') } `tformat<-.xts` <- function(x, value) { if(!is.character(value) && !is.null(value)) stop('must provide valid POSIX formatting string') # Remove format attrs (object created before 0.10-3) attr(x, ".indexFORMAT") <- NULL attr(attr(x, 'index'), 'tformat') <- value x } #' @rdname tformat `indexFormat` <- function(x) { .Deprecated("tformat", "xts") tformat(x) } #' @rdname tformat `indexFormat<-` <- function(x, value) { .Deprecated("tformat<-", "xts") `tformat<-`(x, value) } xts/R/bind.R0000644000176200001440000000542014654242576012350 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' @rdname rbind.xts `c.xts` <- function(...) { .External(C_rbindXts, dup=FALSE, ...) } #' Concatenate Two or More xts Objects by Row #' #' Concatenate or bind by row two or more xts objects along a time-based index. #' All objects must have the same number of columns and be xts objects or #' coercible to xts. #' #' Duplicate index values are supported. When one or more input has the same #' index value, the duplicated index values in the result are in the same order #' the objects are passed to `rbind()`. See examples. #' #' `c()` is an alias for `rbind()` for xts objects. #' #' See [`merge.xts()`] for traditional merge operations. #' #' @param \dots Objects to bind by row. #' @param deparse.level Not implemented. #' #' @return An xts object with one row per row for each object concatenated. #' #' @note `rbind()` is a '.Primitive' function in \R, which means method dispatch #' occurs at the C-level, and may not be consistent with normal S3 method #' dispatch (see [`rbind()`] for details). Call `rbind.xts()` directly to #' avoid potential dispatch ambiguity. #' #' @author Jeffrey A. Ryan #' #' @seealso [`merge.xts()`] [`rbind()`] #' #' @keywords utilities #' @examples #' #' x <- xts(1:10, Sys.Date()+1:10) #' str(x) #' #' merge(x,x) #' rbind(x,x) #' rbind(x[1:5],x[6:10]) #' #' c(x,x) #' #' # this also works on non-unique index values #' x <- xts(rep(1,5), Sys.Date()+c(1,2,2,2,3)) #' y <- xts(rep(2,3), Sys.Date()+c(1,2,3)) #' #' # overlapping indexes are appended #' rbind(x,y) #' rbind(y,x) #' rbind.xts <- function(..., deparse.level=1) { .External(C_rbindXts, dup=FALSE, ...) } `.rbind.xts` <- function(..., deparse.level=1) { dots <- list(...) if(length(dots) < 2) return(dots[[1]]) x <- dots[[1]] dots <- dots[-1] while( length(dots) > 0 ) { y <- dots[[1]] if( length(dots) > 0) dots <- dots[-1] if(!is.null(colnames(y)) && colnames(x) != colnames(y)) warning('column names differ') x <- .Call(C_do_rbind_xts,x,y,FALSE) } return(x) } xts/R/lag.xts.R0000644000176200001440000001141214702273514013000 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' @rdname diff.xts lag.xts <- function(x, k=1, na.pad=TRUE, ...) { zooCompat <- getOption('xts.compat.zoo.lag') if(is.logical(zooCompat) && zooCompat) { k <- -k if(missing(na.pad)) na.pad <- FALSE } if(length(k) > 1) { if(is.null(names(k))) names(k) <- paste("lag",k,sep="") return(do.call("merge.xts", lapply(k, lag.xts, x=x, na.pad=na.pad,...))) } .Call(C_lag_xts, x, k, na.pad) } lagts.xts <- function(x, k=1, na.pad=TRUE, ...) { # NOTE: not exported if(length(k) > 1) { if(is.null(names(k))) names(k) <- paste("lag",k,sep="") return(do.call("merge.xts", lapply(k, lag.xts, x=x, na.pad=na.pad,...))) } .Call(C_lag_xts, x, k, na.pad) } #' Lags and Differences of xts Objects #' #' Methods for computing lags and differences on xts objects. This provides #' similar functionality as the \pkg{zoo} counterparts, but with some different #' defaults. #' #' The primary motivation for these methods was to take advantage of a faster #' C-level implementation. Another motivation was to make `lag()` behave using #' standard sign for `k`. Both [zoo's lag() method][zoo::lag.zoo] and [`lag.default()`] require a #' *negative* value for `k` in order to shift a series backward. So `k = 1`, #' shifts the series *forward* one observation. This is especially confusing #' because `k = 1` is the default for those functions. When `x` is an xts #' object, `lag(x, 1)` returns an object where the value at time 't' is the #' value at time 't-1' in the original object. #' #' Another difference is that `na.pad = TRUE` by default, to better reflect the #' transformation visually and for functions the require positional alignment #' of data. #' #' Set `options(xts.compat.zoo.lag = TRUE)` to use make `lag.xts()` consistent #' with `lag.zoo()` by reversing the sign of `k` and setting `na.pad = FALSE`. #' #' @param x An xts object. #' @param k Number of periods to shift. #' @param lag Period to difference over. #' @param differences Order of differencing. #' @param arithmetic Should arithmetic or geometric differencing be used? #' @param log Should (geometric) log differences be returned? #' @param na.pad Should `NA` be added so the result has the same number of #' observations as `x`? #' @param \dots Additional arguments. #' #' @return An xts object with the desired lag and/or differencing. #' #' @author Jeffrey A. Ryan #' #' @references #' #' @keywords manip chron #' @examples #' #' x <- xts(1:10, Sys.Date()+1:10) #' lag(x) # currently using xts-style positive k #' #' lag(x, k=2) #' #' lag(x, k=-1, na.pad=FALSE) # matches lag.zoo(x, k=1) #' #' diff(x) #' diff(x, lag=1) #' diff(x, diff=2) #' diff(diff(x)) #' diff.xts <- function(x, lag=1, differences=1, arithmetic=TRUE, log=FALSE, na.pad=TRUE, ...) { if(!is.integer(lag) && any(is.na(as.integer(lag)))) stop("'lag' must be integer") differences <- as.integer(differences[1L]) if(is.na(differences)) stop("'differences' must be integer") if(is.logical(x)) { x <- .xts(matrix(as.integer(x), ncol=NCOL(x)), .index(x), tclass(x), dimnames=dimnames(x)) } if(lag < 1 || differences < 1) stop("'diff.xts' defined only for positive lag and differences arguments") zooCompat <- getOption('xts.compat.zoo.lag') if(is.logical(zooCompat) && zooCompat) { # this has to negated to satisfy the test in lag.xts... oh my lag <- -lag if(missing(na.pad)) na.pad <- FALSE } if(differences > 1) { if(arithmetic && !log) { #log is FALSE or missing x <- x - lag.xts(x, k=lag, na.pad=na.pad) } else { if(log) { x <- log(x/lag.xts(x, k=lag, na.pad=na.pad)) } else x <- x/lag.xts(x, k=lag, na.pad=na.pad) } diff(x, lag, differences=differences-1, arithmetic=arithmetic, log=log, na.pad=na.pad, ...) } else { if(arithmetic && !log) { x - lag.xts(x, k=lag, na.pad=na.pad) } else { if(log) { log(x/lag.xts(x, k=lag, na.pad=na.pad)) } else x/lag.xts(x, k=lag, na.pad=na.pad) } } } xts/R/as.numeric.R0000644000176200001440000001106214654242576013477 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . as.numeric.xts <- function(x, drop=TRUE, ...) { if(drop) return(as.numeric(coredata(x))) .xts(matrix(as.numeric(coredata(x)),ncol=NCOL(x)), .index(x)) } as.xts.numeric <- function(x,order.by,dateFormat="POSIXct",frequency=NULL,...) { # jmu if(missing(order.by)) { if(is.null(names(x))) stop("order.by must be either 'names()' or otherwise specified") else # added '...' args to allow for tz specification order.by <- do.call(paste('as',dateFormat,sep='.'),list(names(x))) } xx <- xts(x, order.by=order.by, frequency=frequency, .CLASS='numeric', ...) return(xx) } re.numeric <- function(x,...) { if( !is.null(dim(x))) return(as.matrix(x)) # jmu y <- as.numeric(x,...) names(y) <- index(x) return(y) } as.integer.xts <- function(x, drop=TRUE, ...) { if(drop) return(as.integer(coredata(x))) .xts(matrix(as.integer(coredata(x)),ncol=NCOL(x)), .index(x)) } as.xts.integer <- function(x,order.by,dateFormat="POSIXct",frequency=NULL,...) { # jmu if(missing(order.by)) { if(is.null(names(x))) stop("order.by must be either 'names()' or otherwise specified") else # added '...' args to allow for tz specification order.by <- do.call(paste('as',dateFormat,sep='.'),list(names(x))) } xx <- xts(x, order.by=order.by, frequency=frequency, .CLASS='integer', ...) return(xx) } re.integer <- function(x,...) { if( !is.null(dim(x))) return(as.matrix(x)) # jmu y <- as.integer(x,...) names(y) <- index(x) return(y) } as.double.xts <- function(x, drop=TRUE, ...) { if(drop) return(as.double(coredata(x))) .xts(matrix(as.double(coredata(x)),ncol=NCOL(x)), .index(x)) } as.xts.double <- function(x,order.by,dateFormat="POSIXct",frequency=NULL,...) { # jmu if(missing(order.by)) { if(is.null(names(x))) stop("order.by must be either 'names()' or otherwise specified") else # added '...' args to allow for tz specification order.by <- do.call(paste('as',dateFormat,sep='.'),list(names(x))) } xx <- xts(x, order.by=order.by, frequency=frequency, .CLASS='double', ...) return(xx) } re.double <- function(x,...) { if( !is.null(dim(x))) return(as.matrix(x)) # jmu y <- as.double(x,...) names(y) <- index(x) return(y) } as.complex.xts <- function(x, drop=TRUE, ...) { if(drop) return(as.complex(coredata(x))) .xts(matrix(as.complex(coredata(x)),ncol=NCOL(x)), .index(x)) } as.xts.complex <- function(x,order.by,dateFormat="POSIXct",frequency=NULL,...) { # jmu if(missing(order.by)) { if(is.null(names(x))) stop("order.by must be either 'names()' or otherwise specified") else # added '...' args to allow for tz specification order.by <- do.call(paste('as',dateFormat,sep='.'),list(names(x))) } xx <- xts(x, order.by=order.by, frequency=frequency, .CLASS='complex', ...) return(xx) } re.complex <- function(x,...) { if( !is.null(dim(x))) return(as.matrix(x)) # jmu y <- as.complex(x,...) names(y) <- index(x) return(y) } as.logical.xts <- function(x, drop=TRUE, ...) { if(drop) return(as.logical(coredata(x))) .xts(matrix(as.logical(coredata(x)),ncol=NCOL(x)), .index(x)) } as.xts.logical <- function(x,order.by,dateFormat="POSIXct",frequency=NULL,...) { # jmu if(missing(order.by)) { if(is.null(names(x))) stop("order.by must be either 'names()' or otherwise specified") else # added '...' args to allow for tz specification order.by <- do.call(paste('as',dateFormat,sep='.'),list(names(x))) } xx <- xts(x, order.by=order.by, frequency=frequency, .CLASS='logical', ...) return(xx) } re.logical <- function(x,...) { if( !is.null(dim(x))) return(as.matrix(x)) # jmu y <- as.logical(x,...) names(y) <- index(x) return(y) } xts/R/align.time.R0000644000176200001440000001163214654242576013465 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' Align seconds, minutes, and hours to beginning of next period. #' #' Change timestamps to the start of the next period, specified in multiples of #' seconds. #' #' This function is an S3 generic. The result is to round up to the next period #' determined by 'n modulo x'. #' #' @param x Object containing timestamps to align. #' @param n Number of seconds to adjust by. #' @param \dots Additional arguments. See details. #' #' @return A new object with the same class as `x`. #' #' @author Jeffrey A. Ryan with input from Brian Peterson #' #' @seealso [`to.period()`] #' #' @keywords chron manip ts misc #' @examples #' #' x <- Sys.time() + 1:1000 #' #' # every 10 seconds #' align.time(x, 10) #' #' # align to next whole minute #' align.time(x, 60) #' #' # align to next whole 10 min interval #' align.time(x, 10 * 60) #' align.time <- function(x, ...) { UseMethod("align.time") } #' @rdname align.time align.time.xts <- function(x, n=60, ...) { if(n <= 0) stop("'n' must be positive") .xts(x, .index(x) + (n-.index(x) %% n), tzone=tzone(x), tclass=tclass(x)) } align.time.POSIXct <- function(x, n=60, ...) { if(n <= 0) stop("'n' must be positive") structure(unclass(x) + (n - unclass(x) %% n),class=c("POSIXct","POSIXt")) } align.time.POSIXlt <- function(x, n=60, ...) { if(n <= 0) stop("'n' must be positive") as.POSIXlt(align.time(as.POSIXct(x),n=n,...)) } #' @rdname align.time shift.time <- function(x, n=60, ...) { UseMethod("shift.time") } shift.time.xts <- function(x, n=60, ...) { .xts(x, .index(x) + n, tzone=tzone(x), tclass=tclass(x)) } #' @rdname make.index.unique is.index.unique <- function(x) { UseMethod("is.time.unique") } #' @rdname make.index.unique is.time.unique <- is.index.unique is.time.unique.xts <- function(x) { isOrdered(.index(x), strictly=TRUE) } is.time.unique.zoo <- function(x) { isOrdered(index(x), strictly=TRUE) } #' Force Time Values To Be Unique #' #' A generic function to force sorted time vectors to be unique. Useful for #' high-frequency time-series where original time-stamps may have identical #' values. For the case of xts objects, the default `eps` is set to ten #' microseconds. In practice this advances each subsequent identical time by #' `eps` over the previous (possibly also advanced) value. #' #' The returned time-series object will have new time-stamps so that #' `isOrdered(.index(x))` evaluates to `TRUE`. #' #' @param x An xts object, or POSIXct vector. #' @param eps A value to add to force uniqueness. #' @param drop Should duplicates be dropped instead of adjusted by `eps`? #' @param fromLast When `drop = TRUE`, `fromLast` controls which duplicated #' times are dropped. When `fromLast = FALSE`, the earliest observation with #' an identical timestamp is kept and subsequent observations are dropped. #' @param \dots Unused. #' #' @return A modified version of `x` with unique timestamps. #' #' @note Incoming values must be pre-sorted, and no check is done to make sure #' that this is the case. \sQuote{integer} index value will be coerced to #' \sQuote{double} when `drop = FALSE`. #' #' @author Jeffrey A. Ryan #' #' @seealso [`align.time()`] #' #' @rdname make.index.unique #' @keywords ts #' @examples #' #' ds <- options(digits.secs=6) # so we can see the change #' #' x <- xts(1:10, as.POSIXct("2011-01-21") + c(1,1,1,2:8)/1e3) #' x #' make.index.unique(x) #' #' options(ds) #' make.index.unique <- function(x, eps=0.000001, drop=FALSE, fromLast=FALSE, ...) { UseMethod("make.index.unique") } #' @rdname make.index.unique make.time.unique <- make.index.unique make.index.unique.xts <- function(x, eps=0.000001, drop=FALSE, fromLast=FALSE, ...) { if( !drop) { .Call(C_make_index_unique, x, eps) } else { x[.Call(C_non_duplicates, .index(x), fromLast)] } } make.index.unique.numeric <- function(x, eps=0.000001, drop=FALSE, fromLast=FALSE, ...) { if( !drop) { .Call(C_make_unique, x, eps) } else { x[.Call(C_non_duplicates, x, fromLast)] } } make.index.unique.POSIXct <- function(x, eps=0.000001, drop=FALSE, fromLast=FALSE, ...) { if( !drop) { .Call(C_make_unique, x, eps) } else { x[.Call(C_non_duplicates, x, fromLast)] } } xts/R/Date.R0000644000176200001440000000156414654242576012316 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' @rdname as.xts `as.xts.Date` <- function(x,...) { xts(x=NULL,order.by=x,...) } xts/R/modify.args.R0000644000176200001440000000377214654242576013666 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2009-2015 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Ross Bennett and Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . modify.args <- function(formals, arglist, ..., dots=FALSE) { # modify.args function from quantstrat # avoid evaluating '...' to make things faster dots.names <- eval(substitute(alist(...))) if(missing(arglist)) arglist <- NULL arglist <- c(arglist, dots.names) # see 'S Programming' p. 67 for this matching # nothing to do if arglist is empty; return formals as a list if(!length(arglist)) return(as.list(formals)) argnames <- names(arglist) if(!is.list(arglist) && !is.null(argnames) && !any(argnames == "")) stop("'arglist' must be a *named* list, with no names == \"\"") .formals <- formals onames <- names(.formals) pm <- pmatch(argnames, onames, nomatch = 0L) #if(any(pm == 0L)) # message(paste("some arguments stored for", fun, "do not match")) names(arglist[pm > 0L]) <- onames[pm] .formals[pm] <- arglist[pm > 0L] # include all elements from arglist if function formals contain '...' if(dots && !is.null(.formals$...)) { dotnames <- names(arglist[pm == 0L]) .formals[dotnames] <- arglist[dotnames] #.formals$... <- NULL # should we assume we matched them all? } # return a list (not a pairlist) as.list(.formals) } xts/R/tclass.R0000644000176200001440000001342214702273705012716 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' Get or Replace the Class of an xts Object's Index #' #' Generic functions to get or replace the class of an xts object's index. #' #' Internally, an xts object's index is a *numeric* value corresponding to #' seconds since the epoch in the UTC timezone. The index class is stored as #' the `tclass` attribute on the internal index. This is used to convert #' the internal index values to the desired class when the `index` #' function is called. #' #' The `tclass` function retrieves the class of the internal index, and #' the `tclass<-` function sets it. The specified value for #' `tclass<-` must be one of the following character strings: #' `"Date"`, `"POSIXct"`, `"chron"`, `"yearmon"`, #' `"yearqtr"`, or `"timeDate"`. #' #' @param x An xts object. #' @param value The new index class (see Details for valid values). #' @param \dots Arguments passed to other methods. #' #' @return A vector containing the class of the object's index. #' #' @note Both `indexClass` and `indexClass<-` are deprecated in favor #' of `tclass` and `tclass<-`, respectively. #' #' Replacing the `tclass` can *potentially change* the values of the internal #' index. For example, changing the 'tclass' from POSIXct to Date will #' truncate the POSIXct value and convert the timezone to UTC (since the Date #' class doesn't have a timezone). See the examples. #' #' @author Jeffrey A. Ryan #' #' @seealso [`index()`][xts::index.xts] has more information on the xts index, [`tformat()`] #' details how the index values are formatted when printed, and [`tzone()`] #' has more information about the index timezone settings. #' #' The following help pages describe the characteristics of the valid index #' classes: [`POSIXct()`], [`Date()`], [chron()][chron::chron], #' [`yearmon()`][zoo::zoo], [`yearqtr()`][zoo::zoo], #' [`timeDate()`][timeDate::timeDate] #' #' @keywords ts utilities #' @examples #' #' x <- timeBasedSeq('2010-01-01/2010-01-02 12:00') #' x <- xts(seq_along(x), x) #' #' y <- timeBasedSeq('2010-01-01/2010-01-03 12:00/H') #' y <- xts(seq_along(y), y, tzone = "America/New_York") #' #' # Changing the tclass *changes* the internal index values #' head(y) # the index has times #' head(.index(y)) #' tclass(y) <- "Date" #' head(y) # the index prints as a Date #' head(.index(y)) # the internal index is truncated #' tclass <- function(x, ...) { UseMethod('tclass') } #' @rdname tclass tclass.default <- function(x, ...) { attr(x, "tclass") } #' @rdname tclass tclass.xts <- function(x, ...) { tclass <- attr(attr(x, "index"), "tclass") # For xts objects created pre-0.10.3 if (is.null(tclass)) { # no tclass on the index sq_tclass <- sQuote("tclass") sq_both <- paste(sq_tclass, "or", sQuote(".indexCLASS")) warn_msg <- paste0("index does not have a ", sq_tclass, " attribute") tclass <- attr(x, "tclass") if (is.null(tclass)) { # no tclass on the xts object, look for .indexCLASS tclass <- attr(x, ".indexCLASS") } if (is.null(tclass)) { # no .indexCLASS on the xts object tc <- c("POSIXct", "POSIXt") warn_msg <- paste0(warn_msg, "\n and xts object does not have a ", sq_both, " attribute\n", " returning ", dQuote(tc)) warning(warn_msg) return(tc) } sym <- deparse(substitute(x)) warning(warn_msg, "\n use ", sym, " <- xts:::.update_index_attributes(", sym, ") to update the object") } return(tclass) } #' @rdname tclass `tclass<-` <- function(x,value) { UseMethod('tclass<-') } #' @rdname tclass `tclass<-.default` <- function(x, value) { if (!is.null(value)) { value <- as.character(value) } attr(x, "tclass") <- value x } #' @rdname tclass indexClass <- function(x) { .Deprecated("tclass", "xts") tclass(x) } #' @rdname tclass `indexClass<-` <- function(x, value) { .Deprecated("tclass<-", "xts") `tclass<-`(x, value) } #' @rdname tclass `tclass<-.xts` <- function(x, value) { if(!is.character(value) && length(value) != 1) stop('improperly specified value for tclass') # remove 'POSIXt' from value, to prevent tclass(x) <- 'POSIXt' value <- value[!value %in% "POSIXt"] if(length(value)==0L) stop(paste('unsupported',sQuote('tclass'),'indexing type: POSIXt')) if(!value[1] %in% c('dates','chron','POSIXlt','POSIXct','Date','timeDate','yearmon','yearqtr','xtime') ) stop(paste('unsupported',sQuote('tclass'),'indexing type:',as.character(value[[1]]))) # Add 'POSIXt' virtual class if(value %in% c('POSIXlt','POSIXct')) value <- c(value,'POSIXt') # all index related meta-data will be stored in the index # as attributes if(isClassWithoutTZ(value)) { attr(attr(x,'index'), 'tzone') <- 'UTC' } attr(attr(x,'index'), 'tclass') <- value x_has_tz <- !isClassWithoutTZ(x) if(x_has_tz && isClassWithoutTZ(value)) { # update index values to midnight UTC (this also changes the tzone) index(x) <- index(x) } # Remove class attrs (object created before 0.10-3) attr(x, ".indexCLASS") <- NULL attr(x, "tclass") <- NULL x } xts/R/split.R0000644000176200001440000000632614702273624012565 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' Divide into Groups by Time #' #' Creates a list of xts objects split along time periods. #' #' A quick way to break up a large xts object by standard time periods; e.g. #' 'months', 'quarters', etc. #' #' [`endpoints()`] is used to find the start and end of each period (or #' k-periods). See that function for valid arguments. #' #' The inputs are passed to [`split.zoo()`][zoo::split.zoo] when `f` is not a character vector. #' #' @param x An xts object. #' @param f A character vector describing the period to split by. #' @param drop Ignored by `split.xts()`. #' @param k Number of periods to aggregate into each split. See details. #' @param \dots Further arguments passed to other methods. #' #' @return A list of xts objects. #' #' @note [`aggregate.zoo()`][zoo::aggregate.zoo] is more flexible, though not #' as fast for xts objects. #' #' @author Jeffrey A. Ryan #' #' @seealso [`endpoints()`], [`split.zoo()`][zoo::split.zoo], #' [`aggregate.zoo()`][zoo::aggregate.zoo] #' #' @keywords utilities #' @examples #' #' data(sample_matrix) #' x <- as.xts(sample_matrix) #' #' #' split(x) #' split(x, f="weeks") #' split(x, f="weeks", k=4) #' split.xts <- function(x, f="months", drop=FALSE, k=1, ...) { if(is.character(f) && length(f) == 1L) { ep <- endpoints(x, on=f, k=k) sp <- (ep + 1)[-length(ep)] ep <- ep[-1] out <- lapply(seq_along(ep), function(X) x[sp[X]:ep[X]]) if(f == "secs" || f == "mins") { f <- substr(f, 1L, 3L) } f <- match.arg(f, c("years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds", "microseconds", "ms", "us")) obs.for.names <- index(x)[sp] outnames <- switch(f, "years" = format(obs.for.names, "%Y"), "quarters" = as.character(as.yearqtr(as.POSIXlt(obs.for.names))), "months" = format(obs.for.names, "%b %Y"), "weeks" = format(obs.for.names, "%Y-%m-%d"), "days" = format(obs.for.names, "%Y-%m-%d"), "hours" = format(obs.for.names, "%Y-%m-%d %H:00:00"), "minutes" = format(obs.for.names, "%Y-%m-%d %H:%M:00"), "seconds" = format(obs.for.names, "%Y-%m-%d %H:%M:%S"), "milliseconds" = , "ms" = format(obs.for.names, "%Y-%m-%d %H:%M:%OS3"), "microseconds" = , "us" = format(obs.for.names, "%Y-%m-%d %H:%M:%OS6")) setNames(out, outnames) } else NextMethod("split") } xts/R/merge.R0000644000176200001440000002003514702273432012517 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #' Merge xts Objects #' #' Perform merge operations on xts objects by time index. #' #' This xts method is compatible with [zoo's merge() method][zoo::merge.zoo] but implemented almost #' entirely in C-level code for efficiency. #' #' The function can perform all common database join operations along the time #' index by setting 'join' to one of the values below. Note that 'left' and #' 'right' are only implemented for two objects. #' #' * outer: full outer (all rows in all objects) #' * inner: only rows with common indexes in all objects #' * left: all rows in the first object, and rows from the second object that #' have the same index as the first object #' * right: all rows in the second object, and rows from the first object that #' have the same index as the second object #' #' The above join types can also be accomplished by setting 'all' to one of the #' values below. #' #' * outer: `all = TRUE` or `all = c(TRUE, TRUE)` #' * inner: `all = FALSE` or `all = c(FALSE, FALSE)` #' * left: `all = c(TRUE, FALSE)` #' * right: `all = c(FALSE, TRUE)` #' #' The result will have the timezone of the leftmost argument if available. Use #' the 'tzone' argument to override the default behavior. #' #' When `retclass = NULL` the joined objects will be split and reassigned #' silently back to the original environment they are called from. This is for #' backward compatibility with zoo, but unused by xts. When `retclass = FALSE` #' the object will be stripped of its class attribute. This is for internal use. #' #' See the examples in order to join using an 'all' argument that is the same #' arguments to join, like you can do with `merge.zoo()`. #' #' @param \dots One or more xts objects, or objects coercible to class xts. #' @param all A logical vector indicating merge type. #' @param fill Values to be used for missing elements. #' @param suffixes Suffix to be added to merged column names. #' @param join Type of database join. One of 'outer', 'inner', 'left', or 'right'. #' @param retside Which side of the merged object should be returned (2-case only)? #' @param retclass Either a logical value indicating whether the result should #' have a 'class' attribute, or the name of the desired class for the result. #' @param tzone Time zone to use for the merged result. #' @param drop Not currently used. #' @param check.names Use [`make.names()`] to ensure column names are vaild \R #' object names? #' #' @return A new xts object containing the appropriate elements of the #' objects passed in to be merged. #' #' @note This is a highly optimized merge, specifically designed for ordered #' data. The only supported merging is based on the underlying time index. #' #' @author Jeffrey A. Ryan #' #' @references Merge Join Discussion: #' #' #' @keywords manip utilities #' @examples #' #' (x <- xts(4:10, Sys.Date()+4:10)) #' (y <- xts(1:6, Sys.Date()+1:6)) #' #' merge(x,y) #' merge(x,y, join='inner') #' merge(x,y, join='left') #' merge(x,y, join='right') #' #' merge.zoo(zoo(x),zoo(y),zoo(x), all=c(TRUE, FALSE, TRUE)) #' merge(merge(x,x),y,join='left')[,c(1,3,2)] #' #' # zero-width objects (only index values) can be used #' xi <- xts( , index(x)) #' merge(y, xi) #' merge.xts <- function(..., all=TRUE, fill=NA, suffixes=NULL, join="outer", retside=TRUE, retclass="xts", tzone=NULL, drop=NULL, check.names=NULL) { if(is.null(check.names)) { check.names <- TRUE } if(is.logical(retclass) && !retclass) { setclass=FALSE } else setclass <- TRUE fill.fun <- NULL if(is.function(fill)) { fill.fun <- fill fill <- NA } # as.list(substitute(list(...))) # this is how zoo handles colnames - jar mc <- match.call(expand.dots=FALSE) dots <- mc$... if(is.null(suffixes)) { syms <- names(dots) if(is.null(syms)) { # Based on makeNames() in merge.zoo() syms <- substitute(alist(...))[-1L] nm <- names(syms) fixup <- if (is.null(nm)) seq_along(syms) else !nzchar(nm) dep <- sapply(syms[fixup], function(x) deparse(x, nlines = 1L)) if(is.null(nm)) { nm <- dep } else if(any(fixup)) { nm[fixup] <- dep } syms <- nm } else { have.symnames <- nzchar(syms) if(any(!have.symnames)) { syms[!have.symnames] <- as.character(dots[!have.symnames]) } } } else if(length(suffixes) != length(dots)) { warning("length of suffixes and does not match number of merged objects") syms <- as.character(dots) # should we ignore suffixes here? #suffixes <- NULL } else { syms <- as.character(suffixes) } .times <- .External(C_number_of_cols, ...) # moved call to make.names inside of mergeXts/do_merge_xts symnames <- rep(syms, .times) suffixes <- rep(suffixes, .times) if(length(dots) == 1) { # this is for compat with zoo; one object AND a name if(!is.null(names(dots))) { x <- list(...)[[1]] if(is.null(colnames(x))) colnames(x) <- symnames return(x) } } if( !missing(join) ) { # join logic applied to index: # inspired by: http://blogs.msdn.com/craigfr/archive/2006/08/03/687584.aspx # # (full) outer - all cases, equivelant to all=c(TRUE,TRUE) # left - all x, && y's that match x # right - all ,y && x's that match y # inner - only x and y where index(x)==index(y) all <- switch(pmatch(join,c("outer","left","right","inner")), c(TRUE, TRUE ), # outer c(TRUE, FALSE), # left c(FALSE, TRUE ), # right c(FALSE, FALSE) # inner ) if( length(dots) > 2 ) { all <- all[1] warning("'join' only applicable to two object merges") } } if( length(all) != 2 ) { if( length(all) > 2 ) warning("'all' must be of length two") all <- rep(all[1], 2) } if( length(dots) > 2 ) retside <- TRUE if( length(retside) != 2 ) retside <- rep(retside[1], 2) x <- .External(C_mergeXts, all=all[1:2], fill=fill, setclass=setclass, symnames=symnames, suffixes=suffixes, retside=retside, env=new.env(), tzone=tzone, check.names=check.names, ...) if(!is.logical(retclass) && retclass != 'xts') { asFun <- paste("as", retclass, sep=".") if(!exists(asFun)) { warning(paste("could not locate",asFun,"returning 'xts' object instead")) return(x) } xx <- try(do.call(asFun, list(x))) if(!inherits(xx,'try-error')) { return(xx) } } if(!is.null(fill.fun)) { fill.fun(x) } else return(x) } #' @rdname merge.xts cbind.xts <- function(..., all=TRUE, fill=NA, suffixes=NULL) { merge.xts(..., all=all, fill=fill, suffixes=suffixes) } .merge.xts.scalar <- function(x, length.out, ...) { if( length.out == 0) return(vector(storage.mode(x), 0)) if( length(x) == 1 ) return(matrix(rep(x, length.out=length.out))) if( NROW(x) == length.out ) return(x) stop("improper length of one or more arguments to merge.xts") } xts/R/Math.xts.R0000644000176200001440000000340014654242576013136 0ustar liggesusers# # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # This code adapted from Ops.zoo.R cumsum.xts <- function(x) { if( NCOL(x) == 1 ) { x[] <- cumsum(coredata(x)) } else x[] <- apply(coredata(x), 2, function(y) cumsum(y)) x } cumprod.xts <- function(x) { if( NCOL(x) == 1 ) { x[] <- cumprod(coredata(x)) } else x[] <- apply(coredata(x), 2, function(y) cumprod(y)) x } cummin.xts <- function(x) { if( NCOL(x) == 1 ) { x[] <- cummin(coredata(x)) } else x[] <- apply(coredata(x), 2, function(y) cummin(y)) x } cummax.xts <- function(x) { if( NCOL(x) == 1 ) { x[] <- cummax(coredata(x)) } else x[] <- apply(coredata(x), 2, function(y) cummax(y)) x } mean.xts <- function(x,...) { if(is.vector(x) ||is.null(ncol(x)) || ncol(x)==1){ x<-as.numeric(x) mean(x,...) } else apply(x,2,mean.xts,...) } sd.xts <- function(x,na.rm=FALSE) { if(is.vector(x) || is.null(ncol(x)) || ncol(x)==1){ x<-as.numeric(x) sd(x,na.rm=na.rm) } else apply(x,2,sd,na.rm=na.rm) } xts/vignettes/0000755000176200001440000000000014703504525013105 5ustar liggesusersxts/vignettes/xts.Rnw0000644000176200001440000010065414634167654014434 0ustar liggesusers%\VignetteIndexEntry{xts: Extensible Time Series} \documentclass{article} \usepackage{hyperref} \hypersetup{colorlinks,% citecolor=black,% linkcolor=blue,% urlcolor=blue,% } \title{\bf xts: Extensible Time Series } \author{Jeffrey A. Ryan \and Joshua M. Ulrich} \date{May 18, 2008} \begin{document} \maketitle \tableofcontents \section{Introduction} The statistical language {\tt R}~\cite{R} offers the time-series analyst a variety of mechanisms to both store and manage time-indexed data. Native {\tt R} classes potentially suitable for time-series data include {\tt data.frame}, {\tt matrix}, {\tt vector}, and {\tt ts} objects. Additional time-series tools have been subsequently introduced in contributed packages to handle some of the domain-specific shortcomings of the native {\tt R} classes. These include {\tt irts} from the {\tt tseries} package\cite{tseries}, {\tt timeSeries} from the {\tt Rmetrics} bundle\cite{rmetrics}, and {\tt zoo}~\cite{zoo} from their respective packages. Each of these contributed classes provides unique solution to many of the issues related to working with time-series in R. While it seems a bit paradoxical with all the current options available, what {\tt R} really needed was one more time-series class. Why? Users of R have had many choices over the years for managing time-series data. This variety has meant that developers have had to pick and choose the classes they would support, or impose the necessary conversions upon the end-user. With the sheer magnitude of software packages available from CRAN, it has become a challenge for users and developers to select a time-series class that will manage the needs of the individual user, as well as remain compatible with the broadest audience. What may be sufficient for one use --- say a quick correlation matrix may be too limiting when more information needs to be incorporated in a complex calculation. This is especially true for functions that rely on time-based indexes to be manipulated or checked. The previous solution to managing different data needs often involved a series of {\tt as} calls, to coerce objects from one type to another. While this may be sufficient for many cases, it is less flexible than allowing the users to simply use the object they are accustomed to, or quite possibly require. Additionally, all current coercion methods fail to maintain the original object's data in its entirety. Converting from a {\tt timeSeries} class to {\tt zoo} would cause attributes such as {\em FinCenter}, {\em format}, and {\em recordIDs} to be lost. Converting back to a {\tt timeSeries} would then add new values different than the original. For many calculations that do not modify the data, this is most likely an acceptable side effect. For functions that convert data --- such as {\tt xts}'s {\tt to.period} --- it limits the value of the function, as the returned object is missing much of what may have been a factor in the original class consideration. One of the most important additions the new {\tt xts} class makes to the R user's workflow doesn't use {\tt xts} at all, at least not explicitly. By converting data to {\tt xts} inside a function, the function developer is guaranteed to have to only manage a single class of objects. It becomes unecessary to write specific methods to handle different data. While many functions do have methods to accommodate different classes, most do not. Before {\tt xts}, the {\tt chartSeries} function in the {\tt quantmod} package\cite{quantmod} was only able to handle {\tt zoo} objects well. Work had been done to allow for {\tt timeSeries} objects to be used as well, but many issues were still being worked out. With {\tt xts} now used internally, it is possible to use \emph{any} of R's time-series classes. Simultaneously saving development time and reducing the learning/using curve for the end user. The function now simply handles whatever time-series object it receives exactly as the user expects --- without complaint. More details, as well as examples of incorporating {\tt xts} into functions will be covered later in this document. While it may seem that {\tt xts} is primarily a tool to help make existing R code more user-friendly, the opportunity to add exciting (to software people) new functionality could not be passed up. To this end, {\tt xts} offers the user the ability to add custom attributes to any object --- during its construction or at any time thereafter. Additionally, by requiring that the index attribute be derived from one of R's existing time-based classes, {\tt xts} methods can make assumptions, while subsetting by time or date, that allow for much cleaner and accurate data manipulation. The remainder of this introduction will examine what an {\tt xts} object consists of and its basic usage, explain how developing with {\tt xts} can save package development time, and finally will demonstrate how to extend the class - informally and formally. \pagebreak \section{The structure of {\tt xts}} To understand a bit more of \emph{what an xts object can do}, it may be beneficial to know \emph{what an xts object is}. This section is intended to provide a quick overview of the basics of the class, as well as what features make it unique. \subsection{It's a {\tt zoo} in here} At the core of an {\tt xts} object is a {\tt zoo} object from the package of the same name. Simplified, this class contains an array of values comprising your data (often in matrix form) and an index attribute to provide information about the data's ordering. Most of the details surrounding zoo objects apply equally to xts. As it would be redundent to simply retell the excellent introductory zoo vignette, the reader is advised to read, absorb, and re-read that documentation to best understand the power of this class. The authors of the {\tt xts} package recognize that {\tt zoo}'s strength comes from its simplicity of use, as well as its overall flexibility. What motivated the {\tt xts} extension was a desire to have even more flexibility, while imposing reasonable constraints to make this class into a true time-based one. \subsection{{\tt xts} modifications} Objects of class {\tt xts} differ from objects of class {\tt zoo} in three key ways: the use of formal time-based classes for indexing, internal xts properties, and perhaps most uniquely --- user-added attributes. \subsubsection*{True time-based indexes} To allow for functions that make use of {\tt xts} objects as a general time-series object - it was necessary to impose a simple rule on the class. The index of each {\tt xts} object \emph{must} be of a known and supported time or date class. At present this includes any one of the following - Date, POSIXct, chron, yearmon, yearqtr, or timeDate. The relative merits of each are left to the judgement of the user, though the first three are expected to be sufficient for most applications. \subsubsection*{Internal attributes: .CLASS, .ROWNAMES, etc.} In order for one major feature of the {\tt xts} class to be possible - the conversion and re-conversion of classes to and from {\tt xts} - certain elements must be preserved within the converted object. These are for internal use, and as such require little further explanation in an introductory document. Interested readers are invited to examine the source as well as read the developer documentation. \subsubsection*{xtsAttributes} This is what makes the xts class an \emph{extensible} time-series class. Arbitrary attributes may be assigned and removed from the object without causing issues with the data's display or otherwise. Additionally this is where \emph{other} class specific attributes (e.g. \emph{FinCenter} from {\tt timeSeries}) are stored during conversion to an xts object so they may be restored with {\tt reclass}. \pagebreak \section{Using the {\tt xts} package} Just what is required to start using {\tt xts}? Nothing more than a simple conversion of your current time-series data with {\tt as.xts}, or the creation of a new object with the {\tt xts} constructor. \subsection{Creating data objects: {\tt as.xts} and {\tt xts}} There are two equally valid mechanisms to create an {\tt xts} object - coerce a supported time-series class to {\tt xts} with a call to {\tt as.xts} or create a new object from scratch with {\tt xts}. \subsubsection*{Converting your \emph{existing} time-series data: {\tt as.xts}} If you are already comfortable using a particular time-series class in {\tt R}, you can still access the functionality of {\tt xts} by converting your current objects. Presently it is possible to convert all the major time-series like classes in {\tt R} to {\tt xts}. This list includes objects of class: matrix, data.frame, ts, zoo, irts, and timeSeries. The new object will maintain all the necessary information needed to {\tt reclass} this object back to its original class if that is desired. Most classes after re-conversion will be identical to similar modifications on the original object, even after sub-setting or other changes while an {\tt xts} object. <>= require(xts) data(sample_matrix) class(sample_matrix) str(sample_matrix) matrix_xts <- as.xts(sample_matrix,dateFormat='Date') str(matrix_xts) df_xts <- as.xts(as.data.frame(sample_matrix), important='very important info!') str(df_xts) @ A few comments about the above. {\tt as.xts} takes different arguments, depending on the original object to be converted. Some classes do not contain enough information to infer a time-date class. If that is the case, POSIXct is used by default. This is the case with both matrix and data.frame objects. In the preceding examples we first requested that the new date format be of type 'Date'. The second example was left to the default {\tt xts} method with a custom attribute added. \subsubsection*{Creating new data: the {\tt xts} constructor} Data objects can also be constructed directly from raw data with the {\tt xts} constructor function, in essentially the same way a {\tt zoo} object is created with the exception that at present there is no equivelant {\tt zooreg} class. <>= xts(1:10, Sys.Date()+1:10) @ \subsection{{\tt xts} methods} There is a full complement of standard methods to make use of the features present in {\tt xts} objects. The generic methods currently extended to {\tt xts} include ``{\tt [}'', {\tt cbind}, {\tt rbind}, {\tt c}, {\tt str}, {\tt Ops}, {\tt print}, {\tt na.omit}, {\tt time}, {\tt index}, {\tt plot} and {\tt coredata}. In addition, most methods that can accept zoo or matrix objects will simply work as expected. A quick tour of some of the methods leveraged by {\tt xts} will be presented here, including subsetting via ``{\tt [}'', indexing objects with {\tt tclass} and {\tt convertIndex}, and a quick look at plotting {\tt xts} objects with the {\tt plot} function. \subsubsection*{Subsetting} The most noticable difference in the behavior of \texttt{xts} objects will be apparent in the use of the ``{\tt [}'' operator. Using special notation, one can use date-like strings to extract data based on the time-index. Using increasing levels of time-detail, it is possible to subset the object by year, week, days - or even seconds. The {\em i} (row) argument to the subset operator ``{\tt [}'', in addition to accepting numeric values for indexing, can also be a character string, a time-based object, or a vector of either. The format must left-specified with respect to the standard ISO:8601 time format --- {\em ``CCYY-MM-DD HH:MM:SS''}~\cite{ISO}. This means that for one to extract a particular month, it is necesssary to fully specify the year as well. To identify a particular hour, say all observations in the eighth hour on January 1, 2007, one would likewise need to include the full year, month and day - e.g. ``2007-01-01 08''. It is also possible to explicitly request a range of times via this index-based subsetting, using the ISO-recommended ``/'' as the range seperater. The basic form is {\em ``from/to''}, where both {\em from} and {\em to} are optional. If either side is missing, it is interpretted as a request to retrieve data from the beginning, or through the end of the data object. Another benefit to this method is that exact starting and ending times need not match the underlying data - the nearest available observation will be returned that is within the requested time period. The following example shows how to extract the entire month of March 2007 - without having to manually identify the index positions or match the underlying index type. The results have been abbreviated to save space. <>= matrix_xts['2007-03'] @ <>= head(matrix_xts['2007-03'],5) cat('...\n') @ Now extract all the data from the beginning through January 7, 2007. <>= matrix_xts['/2007-01-07'] @ <>= matrix_xts['/2007-01-07'] @ Additional xts tools providing subsetting are the {\tt first} and {\tt last} functions. In the spirit of head and tail from the {\em utils} recommended package, they allow for string based subsetting, without forcing the user to conform to the specifics of the time index, similar in usage to the {\em by} arguments of {\tt aggregate.zoo} and {\tt seq.POSIXt}. Here is the first 1 week of the data <>= first(matrix_xts,'1 week') @ <>= head(first(matrix_xts,'1 week')) @ ...and here is the first 3 days of the last week of the data. <>= first(last(matrix_xts,'1 week'),'3 days') @ \subsubsection*{Indexing} While the subsetting ability of the above makes exactly {\em which} time-based class you choose for your index a bit less relevant, it is none-the-less a factor that is beneficial to have control over. To that end, {\tt xts} provides facilities for indexing based on any of the current time-based classes. These include {\tt Date}, {\tt POSIXct}, {\tt chron}, {\tt yearmon}, {\tt yearqtr}, and {\tt timeDate}. The index itself may be accessed via the zoo generics extended to xts --- {\tt index} and the replacement function {\tt index<-}. It is also possible to directly query and set the index class of an {\tt xts} object by using the respective functions {\tt tclass} and {\tt tclass<-}. Temporary conversion, resulting in a new object with the requested index class, can be accomplished via the {\tt convertIndex} function. <>= tclass(matrix_xts) tclass(convertIndex(matrix_xts,'POSIXct')) @ \pagebreak \subsubsection*{Plotting} \SweaveOpts{height=5,width=10} %\setkeys{Gin}{width=0.8\textwidth} The use of time-based indexes within {\tt xts} allows for assumptions to be made regarding the x-axis of plots. The {\tt plot} method makes use of the {\tt xts} function {\tt axTicksByTime}, which heuristically identifies suitable tickmark locations for printing given a time-based object. When {\tt axTickByTime} is called with its {\tt ticks.on} argument set to ``auto'', the result is a vector of suitably chosen tickmark locations. One can also specify the specific points to use by passing a character string to the argument indicating which time period to create tickmarks on. <>= axTicksByTime(matrix_xts, ticks.on='months') @ A simple example of the plotting functionality offered by this labelling can be seen here: \begin{center} <>= plot(matrix_xts[,1],major.ticks='months',minor.ticks=FALSE,main=NULL,col=3) @ \end{center} \subsection{Restoring the original class - {\tt reclass} \& {\tt Reclass}} By now you may be interested in some of the xts functionality presented, and wondering how to incorporate it into a current workflow --- but not yet ready to commit to using it exclusively. If it is desirable to only use the subsetting tools for instance, a quick conversion to xts via {\tt as.xts} will allow full access to the above subsetting tools. When it is then necessary to continue your analysis using the original class, it is as simple as calling the function {\tt reclass} to return the object to its original class. \subsubsection*{(Re)converting classes manually: {\tt reclass}} <>= # using xts-style subsetting doesn't work on non-xts objects sample_matrix['2007-06'] # convert to xts to use time-based subsetting str(as.xts(sample_matrix)['2007-06']) # reclass to get to original class back str(reclass(as.xts(sample_matrix)['2007-06'])) @ This differs dramatically from the standard {\tt as.*****} conversion though. Internally, key attributes of your original data object are preserved and adjusted to assure that the process introduces no changes other than those requested. Think of it as a smart {\tt as}. Behind the scenes, {\tt reclass} has enormous value in functions that convert all incoming data to {\tt xts} for simplified processing. Often it is necessary to return an object back to the user in the class he is expecting --- following the principal of least surprise. It is in these circumstances where {\tt reclass} can turn hours of tedious development into mere minutes per function. More details on the details of using this functionality for developers will be covered in section \ref{developer}, \textbf{Developing with xts}. A user friendly interface of this \emph{reclass} functionality, though implicit, is available in the {\tt Reclass} function. It's purpose is to make it easy to preserve an object's attributes after calling a function that is not programmed to be aware of your particular class. \pagebreak \subsubsection*{Letting xts handle the details: {\tt Reclass}} If the function you require does not make use of {\tt reclass} internally, it may still be possible to let xts convert and reconvert your time-based object for you. The caveat here is that the object returned: \begin{quote} \begin{itemize} \item must be of the same length as the first argument to the function. \item intended to be coerced back to the class of the first argument \end{itemize} \end{quote} Simply wrapping the function that meets these criteria in {\tt Reclass} will result in an attempt to coerce the returned output of the function <>= z <- zoo(1:10,Sys.Date()+1:10) # filter converts to a ts object - and loses the zoo class (zf <- filter(z, 0.2)) class(zf) # using Reclass, the zoo class is preserved (zf <- Reclass(filter(z, 0.2))) class(zf) @ The {\tt Reclass} function is still a bit experimental, and will certainly improve in time, but for now provides at least an alternative option to maintain your object's class and attributes when the function you require can't on its own. \subsection{Additional time-based tools} In addition to the core {\tt xts} tools covered above, there are more functions that are included in xts to make the process of dealing with time-series data easier. Some of these have been moved from the package {\tt quantmod} to {\tt xts} to make it easier to use them within other applications. \subsubsection*{Calculate periodicity} The {\tt periodicity} function provides a quick summary as to the underlying periodicity of most time-series like objects. Primarily a wrapper to {\tt difftime} it provides a quick and concise summary of your data. <>= periodicity(matrix_xts) @ \subsubsection*{Find endpoints by time} Another common issue with time-series data is identifying the endpoints with respect to time. Often it is necessary to break data into hourly or monthly intervals to calculate some statistic. A simple call to {\tt endpoints} offers a quick vector of values suitable for subsetting a dataset by. Note that the first element it zero, which is used to delineate the \emph{end}. <>= endpoints(matrix_xts,on='months') endpoints(matrix_xts,on='weeks') @ \subsubsection*{Change periodicity} One of the most ubiquitous type of data in finance is OHLC data (Open-High-Low-Close). Often is is necessary to change the periodicity of this data to something coarser - e.g. take daily data and aggregate to weekly or monthly. With {\tt to.period} and related wrapper functions it is a simple proposition. <>= to.period(matrix_xts,'months') periodicity(to.period(matrix_xts,'months')) # changing the index to something more appropriate to.monthly(matrix_xts) @ The {\tt to.monthly} wrapper automatically requests that the returned object have an index/rownames using the {\tt yearmon} class. With the {\tt indexAt} argument it is possible to align most series returned to the end of the period, the beginning of the period, or the first or last observation of the period --- even converting to something like {\tt yearmon} is supported. The online documentation provides more details as to additional arguments. \subsubsection*{Periodically apply a function} Often it is desirable to be able to calculate a particular statistic, or evaluate a function, over a set of non-overlapping time periods. With the {\tt period.apply} family of functions it is quite simple. The following examples illustrate a simple application of the {\tt max} function to our example data. <>= # the general function, internally calls sapply period.apply(matrix_xts[,4],INDEX=endpoints(matrix_xts),FUN=max) @ <>= # same result as above, just a monthly interface apply.monthly(matrix_xts[,4],FUN=max) @ <>= # using one of the optimized functions - about 4x faster period.max(matrix_xts[,4], endpoints(matrix_xts)) @ In addition to {\tt apply.monthly}, there are wrappers to other common time frames including: {\tt apply.daily}, {\tt apply.weekly}, {\tt apply.quarterly}, and {\tt apply.yearly}. Current optimized functions include {\tt period.max}, {\tt period.min}, {\tt period.sum}, and {\tt period.prod}. \pagebreak \section{Developing with {\tt xts}} \label{developer} While the tools available to the xts \emph{user} are quite useful, possibly greater utility comes from using xts internally as a \emph{developer}. Bypassing traditional S3/S4 method dispatch and custom if-else constructs to handle different time-based classes, {\tt xts} not only makes it easy to handle all supported classes in one consistent manner, it also allows the whole process to be invisible to the function user. \subsection{One function for all classes: {\tt try.xts}} With the proliferation of data classes in R, it can be tedious, if not entirely impractical, to manage interfaces to all classes. Not only does trying to handle every possible class present non-trivial design issues, the developer is also forced to learn and understand the nuances of up to eight or more classes. For each of these classes it is then ncessary to write and manage corresponding methods for each case. At best, this reduces the time available to devote to core function functionality --- at worst is a prime opportunity to introduce errors that inevitibly come from this massive increase in code. The solution to this issue is to use one class internally within your package, or more generally your entire workflow. This can be accomplished in one of two ways: force your users to adopt the convention you do, or allow for multiple object classes by relying on internal code to convert to one consistent type. Using the second approach offers the most end-user flexibility, as class conversions are no longer required simply to make use of package functionality. The user's own workflow need not be interrupted with unproductive and potentially error-prone conversions and reconversions. Using the functionality of {\tt try.xts} and {\tt reclass} offered by the xts package allows the developer an opportunity to cleanly, and reliably, manage data with the least amount of code, and the least number of artificial end-user restrictions. An example from the xts package illustrates just how simple this can be. <>= period.apply @ Some explanation of the above code is needed. The {\tt try.xts} function takes three arguments, the first is the object that the developer is trying to convert, the second \ldots is any additional arguments to the {\tt as.xts} constructor that is called internally (ignore this for the most part --- though it should be noted that this is an R dots argument \ldots), and the third is a what the result of an error should be. Of the three, {\tt error} is probably the most useful from a design standpoint. Some functions may not be able to deal with data that isn't time-based. Simple numerical vectors might not contain enough information to be of any use. The \emph{error} argument lets the developer decide if the function should be halted at this point, or continue onward. If a logical value, the result is handled by R's standard error mechanism during the try-catch block of code internal to {\tt try.xts}. If error is a character string, it is returned to the standard output as the message. This allows for diagnostic messages to be fine tuned to your particular application. The result of this call, if successful (or if {\tt error=FALSE}) is an object that may be of class {\tt xts}. If your function can handle either numeric data or time-based input, you can branch code here for cases you expect. If your code has been written to be more general at this point, you can simply continue with your calculations, the originally converted object will contain the information that will be required to reclass it at the end. A note of importance here: if you are planning on returning an object that is of the original class, it is important to not modify the originally coverted object - in this case that would be the {\tt x} result of the {\tt try.xts} call. You will notice that the function's result is assigned to {\tt xx} so as not to impact the original converted function. If this is not possible, it is recommended to copy the object first to preserve an untouched copy for use in the {\tt reclass} function. Which leads to the second part of the process of developing with xts. \subsection{Returning the original class: {\tt reclass}} The {\tt reclass} function takes the object you are expecting to return to your user (the result of all your calculations) and optionally an {\tt xts} object that was the result of the original {\tt try.xts} call. It is important to stress that the {\tt match.to} object \emph{must be an untouched object} returned from the {\tt try.xts} call. The only exception here is when the resultant data has changed dimension --- as is the case in the {\tt period.apply} example. As reclass will try and convert the first argument to the orginal class of the second (the original class passed to the function), it must have the same general row dimension of the original. A final note on using {\tt reclass}. If the {\tt match.to} argument is left off, the conversion will only be attempted if the object is of class {\tt xts} and has a {\tt CLASS} attribute that is not {\tt NULL}, else the object is simply returned. Essentially if the object meant to be reconverted is already of in the form needed by the individual reclass methods, generally nothing more needs to be done by the developer. In many cases your function does not need to return an object that is expected to be used in the same context as the original. This would be the case for functions that summarize an object, or perform some statistical analysis. For functions that do not need the {\tt reclass} functionality, a simple use of {\tt try.xts} at the beginning of the function is all that is needed to make use of this single-interface tool within {\tt xts}. Further examples can be found in the {\tt xts} functions {\tt periodicity} and {\tt endpoints} (no use of reclass), and {\tt to.period} (returns an object of the original's class). The package {\tt quantmod} also utilizes the {\tt try.xts} functionality in its {\tt chartSeries} function --- allowing financial charts for all time-based classes. Forthcoming developer documentation will examine the functions highlighted above, as well go into more detail on exceptional cases and requirements. \pagebreak \section{Customizing and Extending xts} As \emph{extensible} is in the name of the package, it is only logical that it can be extended. The two obvious mechanisms to make {\tt xts} match the individual needs of a diverse user base is the introduction of custom attributes, and the idea of subclassing the entire {\tt xts} class. \subsection{{\tt xtsAttributes}} What makes an R attribute an {\tt xtsAttribute}? Beyond the sematics, xtsAttributes are designed to persist once attached to an object, as well as not get in the way of other object functionality. All xtsAttributes are indeed R attributes, though the same can not be said of the reverse --- all R attributes are \emph{not} xtsAttributes! Attaching arbitrary attributes to most (all?) classes other than {\tt xts} will cause the attribute to be displayed during most calls that print the object. While this isn't necessarily devestating, it is often time unsightly, and sometimes even confusing to the end user (this may depend on the quality your users). xts offers the developer and end-user the opportunity to attach attributes with a few different mechanisms - and all will be suppressed from normal view, unless specifically called upon. What makes an xtsAttribute special is that it is principally a mechanism to store and view meta-data, that is, attributes that would be seen with a call to R's {\tt attributes}. <>= str(attributes(matrix_xts)) str(xtsAttributes(matrix_xts)) # attach some attributes xtsAttributes(matrix_xts) <- list(myattr="my meta comment") attr(matrix_xts, 'another.item') <- "one more thing..." str(attributes(matrix_xts)) str(xtsAttributes(matrix_xts)) @ In general - the only attributes that should be handled directly by the user (\emph{without} the assistance of xts functions) are ones returned by {\tt xtsAttributes}. The additional attributes seen in the {\tt attributes} example are for internal R and xts use, and if you expect unbroken code, should be left alone. \subsection{Subclassing {\tt xts}} Subclassing xts is as simple as extending any other S3 class in R. Simply include the full class of the xts system in your new class. <>= xtssubclass <- structure(matrix_xts, class=c('xts2','xts','zoo')) class(xtssubclass) @ This will allow the user to override methods of xts and zoo, while still allowing for backward compatibility with all the tools of xts and zoo, much the way {\tt xts} benefits from extending {\tt zoo}. \section{Conclusion} The {\tt xts} package offers both R developers and R users an extensive set of time-aware tools for use in time-based applications. By extending the {\tt zoo} class, xts leverages an excellent infrastructure tool into a true time-based class. This simple requirement for time-based indexing allows for code to make assumptions about the object's purpose, and facilitates a great number of useful utilities --- such as time-based subsetting. Additionally, by embedding knowledge of the currently used time-based classes available in R, xts can offer the developer and end-user a single interface mechanism to make internal class decisions user-driven. This affords developers an opportunity to design applications for there intended purposes, while freeing up time previously used to manage the data structures. Future development of xts will focus on integrating xts into more external packages, as well as additional useful additions to the time-based utilities currently available within the package. An effort to provide external disk and memory based data access will also be examined for potential inclusion or extension. \begin{thebibliography}{99} \bibitem{zoo} Achim Zeileis and Gabor Grothendieck (2005): \emph{ zoo: S3 Infrastructure for Regular and Irregular Time Series.} Journal of Statistical Software, 14(6), 1-27. URL http://www.jstatsoft.org/v14/i06/ \bibitem{tseries} Adrian Trapletti and Kurt Hornik (2007): \emph{tseries: Time Series Analysis and Computational Finance.} R package version 0.10-11. \bibitem{rmetrics} Diethelm Wuertz, many others and see the SOURCE file (2007): \emph{Rmetrics: Rmetrics - Financial Engineering and Computational Finance.} R package version 260.72. http://www.rmetrics.org \bibitem{ISO} International Organization for Standardization (2004): \emph{ISO 8601: Data elements and interchage formats --- Information interchange --- Representation of dates and time} URL http://www.iso.org \bibitem{R} R Development Core Team: \emph{R: A Language and Environment for Statistical Computing}, R Foundation for Statistical Computing, Vienna, Austria. ISBN 3-900051-07-0, URL http://www.R-project.org \bibitem{quantmod} Jeffrey A. Ryan (2008): \emph{quantmod: Quantitative Financial Modelling Framework.} R package version 0.3-5. URL http://www.quantmod.com URL http://r-forge.r-project.org/projects/quantmod \end{thebibliography} \end{document} xts/vignettes/xts-faq.Rnw0000644000176200001440000003005414634167654015175 0ustar liggesusers%\documentclass[article,nojss]{jss} %\DeclareGraphicsExtensions{.pdf,.eps} %%\newcommand{\mysection}[2]{\subsubsection[#2]{\textbf{#1}}} %\let\mysection=\subsubsection %\renewcommand{\jsssubsubsec}[2][default]{\vskip \preSskip% % \pdfbookmark[3]{#1}{Subsubsection.\thesubsubsection.#1}% % \refstepcounter{subsubsection}% % {\large \textbf{\textit{#2}}} \nopagebreak % \vskip \postSskip \nopagebreak} %% -*- encoding: utf-8 -*- %\VignetteIndexEntry{xts FAQ} %\VignetteDepends{zoo} \documentclass{article} % \usepackage{Rd} \usepackage{Sweave} \usepackage{hyperref} \hypersetup{colorlinks,% citecolor=black,% linkcolor=blue,% urlcolor=blue,% } %%\encoding{UTF-8} %%\usepackage[UTF-8]{inputenc} % \newcommand{\q}[1]{\section*{#1}\addcontentsline{toc}{subsection}{#1}} \author{xts Deveopment Team% \footnote{Contact author: Joshua M. Ulrich \email{josh.m.ulrich@gmail.com}} \footnote{Thanks to Alberto Giannetti and Michael R. Weylandt for their many contributions.} } \title{\bf xts FAQ} %\Keywords{irregular time series, time index, daily data, weekly data, returns} %\Abstract{ % This is a collection of frequently asked questions (FAQ) about the % \pkg{xts} package together with their answers. %} \begin{document} \SweaveOpts{concordance=TRUE, engine=R, eps=FALSE} %\SweaveOpts{engine=R, eps=FALSE} <>= library("xts") Sys.setenv(TZ="GMT") @ \makeatletter \makeatother \maketitle \tableofcontents \q{What is \pkg{xts}?} % \pkg{xts} is an \pkg{R} package offering a number of functionalities to work on time-indexed data. \pkg{xts} extends \pkg{\pkg{zoo}}, another popular package for time-series analysis. % should point to the zoo FAQ here (or at some early point) \q{Why should I use \pkg{xts} rather than \pkg{zoo} or another time-series package?} % The main benefit of \pkg{xts} is its seamless compatibility with other packages using different time-series classes (\pkg{timeSeries}, \pkg{zoo}, ...). In addition, \pkg{xts} allows the user to add custom attributes to any object. See the main \pkg{xts} vignette for more information. \q{How do I install \pkg{xts}?} % \pkg{xts} depends on \pkg{zoo} and suggests some other packages. You should be able to install \pkg{xts} and all the other required components by simply calling \code{install.packages('pkg')} from the \pkg{R} prompt. \q{I have multiple .csv time-series files that I need to load in a single \pkg{xts} object. What is the most efficient way to import the files?} % If the files have the same format, load them with \code{read.zoo} and then call \code{rbind} to join the series together; finally, call \code{as.xts} on the result. Using a combination of \code{lapply} and \code{do.call} can accomplish this with very little code: <>= filenames <- c("a.csv", "b.csv", "c.csv") sample.xts <- as.xts(do.call("rbind", lapply(filenames, read.zoo))) @ \q{Why is \pkg{xts} implemented as a matrix rather than a data frame?} % \pkg{xts} uses a matrix rather than data.frame because: \begin{enumerate} \item \pkg{xts} is a subclass of \pkg{zoo}, and that's how \pkg{zoo} objects are structured; and \item matrix objects have much better performance than data.frames. \end{enumerate} \q{How can I simplify the syntax when referring to \pkg{xts} object column names?} % \code{with} allows you to use the colmn names while avoiding the full square brackets syntax. For example: <>= lm(sample.xts[, "Res"] ~ sample.xts[, "ThisVar"] + sample.xts[, "ThatVar"]) @ can be converted to <>= with(sample.xts, lm(Res ~ ThisVar + ThatVar)) @ \q{How can I replace the zeros in an \pkg{xts} object with the last non-zero value in the series?} % Convert the zeros to \code{NA} and then use \code{na.locf}: <<>>= sample.xts <- xts(c(1:3, 0, 0, 0), as.POSIXct("1970-01-01")+0:5) sample.xts[sample.xts==0] <- NA cbind(orig=sample.xts, locf=na.locf(sample.xts)) @ \q{How do I create an \pkg{xts} index with millisecond precision?} % Milliseconds in \pkg{xts} indexes are stored as decimal values. This example builds an index spaced by 100 milliseconds, starting at the current system time: <<>>= data(sample_matrix) sample.xts <- xts(1:10, seq(as.POSIXct("1970-01-01"), by=0.1, length=10)) @ \q{I have a millisecond-resolution index, but the milliseconds aren't displayed. What went wrong?} % Set the \code{digits.secs} option to some sub-second precision. Continuing from the previous example, if you are interested in milliseconds: <<>>= options(digits.secs=3) head(sample.xts) @ \q{I set \code{digits.sec=3}, but \pkg{R} doesn't show the values correctly.} % Sub-second values are stored with approximately microsecond precision. Setting the precision to only 3 decimal hides the full index value in microseconds and might be tricky to interpret depending how the machine rounds the millisecond (3rd) digit. Set the \code{digits.secs} option to a value higher than 3 or convert the date-time to numeric and use \code{print}'s \code{digits} argument, or \code{sprintf} to display the full value. For example: <<>>= dt <- as.POSIXct("2012-03-20 09:02:50.001") print(as.numeric(dt), digits=20) sprintf("%20.10f", dt) @ \q{I am using \code{apply} to run a custom function on my \pkg{xts} object. Why does the returned matrix have different dimensions than the original one?} % When working on rows, \code{apply} returns a transposed version of the original matrix. Simply call \code{t} on the returned matrix to restore the original dimensions: <>= sample.xts.2 <- xts(t(apply(sample.xts, 1, myfun)), index(sample.xts)) @ \q{I have an \pkg{xts} object with varying numbers of observations per day (e.g., one day might contain 10 observations, while another day contains 20 observations). How can I apply a function to all observations for each day?} % You can use \code{apply.daily}, or \code{period.apply} more generally: <<>>= sample.xts <- xts(1:50, seq(as.POSIXct("1970-01-01"), as.POSIXct("1970-01-03")-1, length=50)) apply.daily(sample.xts, colMeans) period.apply(sample.xts, endpoints(sample.xts, "days"), colMeans) period.apply(sample.xts, endpoints(sample.xts, "hours", 6), colMeans) @ \q{How can I process daily data for a specific time subset?} % First use time-of-day subsetting to extract the time range you want to work on (note the leading \code{"T"} and leading zeros are required for each time in the range: \code{"T06:00"}), then use \code{apply.daily} to apply your function to the subset: <>= apply.daily(sample.xts['T06:00/T17:00',], colMeans) @ \q{How can I analyze my irregular data in regular blocks, adding observations for each regular block if one doesn't exist in the origianl time-series object?} % Use \code{align.time} to round-up the indexes to the periods you are interested in, then call \code{period.apply} to apply your function. Finally, merge the result with an empty xts object that contains all the regular index values you want: <<>>= sample.xts <- xts(1:6, as.POSIXct(c("2009-09-22 07:43:30", "2009-10-01 03:50:30", "2009-10-01 08:45:00", "2009-10-01 09:48:15", "2009-11-11 10:30:30", "2009-11-11 11:12:45"))) # align index into regular (e.g. 3-hour) blocks aligned.xts <- align.time(sample.xts, n=60*60*3) # apply your function to each block count <- period.apply(aligned.xts, endpoints(aligned.xts, "hours", 3), length) # create an empty xts object with the desired regular index empty.xts <- xts(, seq(start(aligned.xts), end(aligned.xts), by="3 hours")) # merge the counts with the empty object head(out1 <- merge(empty.xts, count)) # or fill with zeros head(out2 <- merge(empty.xts, count, fill=0)) @ \q{Why do I get a \pkg{zoo} object when I call \code{transform} on my \pkg{xts} object?} % There's no \pkg{xts} method for \code{transform}, so the \pkg{zoo} method is dispatched. The \pkg{zoo} method explicitly creates a new \pkg{zoo} object. To convert the transformed object back to an \pkg{xts} object wrap the \code{transform} call in \code{as.xts}: <>= sample.xts <- as.xts(transform(sample.xts, ABC=1)) @ You might also have to reset the index timezone: <>= tzone(sample.xts) <- Sys.getenv("TZ") @ \q{Why can't I use the \code{\&} operator in \pkg{xts} objects when querying dates?} % \code{"2011-09-21"} is not a logical vector and cannot be coerced to a logical vector. See \code{?"\&"} for details. \pkg{xts}' ISO-8601 style subsetting is nice, but there's nothing we can do to change the behavior of \code{.Primitive("\&")}. You can do something like this though: <>= sample.xts[sample.xts$Symbol == "AAPL" & index(sample.xts) == as.POSIXct("2011-09-21"),] @ or: <>= sample.xts[sample.xts$Symbol == "AAPL"]['2011-09-21'] @ \q{How do I subset an \pkg{xts} object to only include weekdays (excluding Saturday and Sundays)?} % Use \code{.indexwday} to only include Mon-Fri days: <<>>= data(sample_matrix) sample.xts <- as.xts(sample_matrix) wday.xts <- sample.xts[.indexwday(sample.xts) %in% 1:5] head(wday.xts) @ \q{I need to quickly convert a data.frame that contains the time-stamps in one of the columns. Using \code{as.xts(Data)} returns an error. How do I build my \pkg{xts} object?} % The \code{as.xts} function assumes the date-time index is contained in the \code{rownames} of the object to be converted. If this is not the case, you need to use the \code{xts} constructor, which requires two arguments: a vector or a matrix carrying data and a vector of type \code{Date}, \code{POSIXct}, \code{chron}, \ldots, supplying the time index information. If you are certain the time-stamps are in a specific column, you can use: <<>>= Data <- data.frame(timestamp=as.Date("1970-01-01"), obs=21) sample.xts <- xts(Data[,-1], order.by=Data[,1]) @ If you aren't certain, you need to explicitly reference the column name that contains the time-stamps: <<>>= Data <- data.frame(obs=21, timestamp=as.Date("1970-01-01")) sample.xts <- xts(Data[,!grepl("timestamp",colnames(Data))], order.by=Data$timestamp) @ \q{I have two time-series with different frequency. I want to combine the data into a single \pkg{xts} object, but the times are not exactly aligned. I want to have one row in the result for each ten minute period, with the time index showing the beginning of the time period.} % \code{align.time} creates evenly spaced time-series from a set of indexes, \code{merge} ensure two time-series are combined in a single \pkg{xts} object with all original columns and indexes preserved. The new object has one entry for each timestamp from both series and missing values are replaced with \code{NA}. <>= x1 <- align.time(xts(Data1$obs, Data1$timestamp), n=600) x2 <- align.time(xts(Data2$obs, Data2$timestamp), n=600) merge(x1, x2) @ \q{Why do I get a warning when running the code below?} <<>>= data(sample_matrix) sample.xts <- as.xts(sample_matrix) sample.xts["2007-01"]$Close <- sample.xts["2007-01"]$Close + 1 #Warning message: #In NextMethod(.Generic) : # number of items to replace is not a multiple of replacement length @ % This code creates two calls to the subset-replacement function \code{xts:::`[<-.xts`}. The first call replaces the value of \code{Close} in a temporary copy of the first row of the object on the left-hand-side of the assignment, which works fine. The second call tries to replace the first \emph{element} of the object on the left-hand-side of the assignment with the modified temporary copy of the first row. This is the problem. For the command to work, there needs to be a comma in the first subset call on the left-hand-side: <>= sample.xts["2007-01",]$Close <- sample.xts["2007-01"]$Close + 1 @ This isn't encouraged, because the code isn't clear. Simply remember to subset by column first, then row, if you insist on making two calls to the subset-replacement function. A cleaner and faster solution is below. It's only one function call and it avoids the \code{\$} function (which is marginally slower on xts objects). <>= sample.xts["2007-01","Close"] <- sample.xts["2007-01","Close"] + 1 @ %%% What is the fastest way to subset an xts object? \end{document} xts/data/0000755000176200001440000000000014703504524012005 5ustar liggesusersxts/data/sample_matrix.rda0000644000176200001440000001204114522244665015346 0ustar liggesusers‹…˜y8UëÛÇM™24Sš‹H…=¡¤»’µVQ4BŠ¢L% ÒtŠTTN"Ê¡‰TÆ’(S¦’ÊB ‹”÷î÷žÎº®žß{½°özöÚkÝë¹?ûó|×^mhΑ6—Çÿ¢øRLÿ ’­¬‡‹»³ƒ­‹Ýî]Nûð9ü{Ì¥¿ªýÔ€™t¤yÑÝñÀðßU닊£YR¢œæÌ#yQ`F}[Öã Œ˜Q¯÷ ‡Í]8 ×~fáQ+ñoeÀð¾”­Øq˜¹‚[Îf¸¯vâÜéÀÌSÒýèýëÚÿ9±îÕç¼€™pz·j»0w08kN 0雡 èoWt§›Ýꤪ$['í¢=ÀHx&q˜‰é­±k®£ÛŸýÖ$ïóÚS¹%XÇ­ÃRíY*×Ó·v$0V÷s·\fÑ´"çÂ×À,ÿèîum飻c®u@V˜õUù1Î.ÀìlÕº&îŒÇ² J!Àìï_bpX ¿ KõŸ/æœ7³¥;˜ƒŠžf h`BKNœ9ÌìÅaºrÀ2÷³§oWÿF`6š¬¿”ŒóˆK7%l€±7n?þE‡ÑÑ/–­ÆýMÇUß``lUÖ ?Ãóš×;µöá}:îß0ÕK˜•²etöÍ:ót<ç‰cøêMöwÚÇÌÓÞNÀ̘eæ¨þ˜1G÷ûª™ýeÚËÆ@÷ð¯nÚôûžÁqó€n3«p þ ô‡Î«Æ¡@¿ž’þ·øH o;· »áü¸[´ýà}ß zè|ˆ·òm:jÒ ¹°¹@?7­:L‰]ÌqªR´:ó^¥xã ST¿úÌ[ôÕ6?äÆíÚ´ßÎÈ h¨ˆÔ°Ú´F¡(é ôT3óRa¼îlËŽ&se W”–‰;´­ûΠ‘©@{m9öýd2Ðû^ÍËvÁ­Gù|É …@ŸÈ5oñŒúrsBlV>ÐÉR-— €Ž“á ù`½/쮤´à4×Qè´Ú= -7°~ãÏæîx½:çý‘;ô®Ÿ0ÂsóI ß× ùtm[޲ÌQ|?rLÚ¯¸mÒ];]èON ž§°î¯rÛ´%MR¶æ¨ÐïÖù‡éÐ?b–+ÏY̬ÏɯŠ£öµÆ*Oè΢›.¾3®éx­ét·å õ  [挲:OhE¹¹+Îg®ŽÂ0~ÏïÉë¬ôú„îú.ÔP¸tºñ}íò8ÏY±W.ãýÝÕ’ÕýT ô…ÅN5š@?꫞ò ç=PHc ~,ÐÁIé÷Mð:Ûßìb‚»qž/œ42êÛG«s@KL80z@ ¨2ÆÐ  ¨’ÈÆÓI½@U,·ü’Ôû¸sr]9@•ëo¯Ø‡ÛV­]·€Êïì² ð<‘RªJÛ€j}¤ùPA¨/Åg¬Kêõ0úPß3ô>lŽzL0=Ý5ha“´ªp>P=v¡‡vkU!»dÏL“”±Ò&ÀPܯÓÜmX?óëúƒî GÕJ®GÞ“cjDñ<Ó½Mܳ™©9Âë׬ŸeŽ…Øâ¸5®Gi+úf\:¯4‘Âõ:èåæµr5ª¸ôOØ€×7Ü{¢éá!`ôeÄç¤àõe Õ„±X½ã{C ëg ¾ÒêZ[ô¤§ï—zœŸ]E‹l™Aôž¬è«b`<÷Ïs;ºåúúYÀ±+/–ÃóøŠ^׿l̙ʩR¬Ÿ÷ßÚªdLÌØe³µâÖáÛÇšT`ÎO Z´õ³k•°`´0ÞJÆ’opÿf±Ì^*¦dÔÖÏBõ#qÝÙ/qsÑFÖÏõ;ïÿ)Ëú™·æËq›Àh\Ø›0ðý0$Õ€þßä題ó¶wµ¼¡)ëç®æåÙšèá.1ëÎéèÏžP¾~úâMÒ|ÅY艜ü׳³l.}\kÓ1èòs1{s Y?W¾=2jR3ާ…GQ£ñ8ë•ü~úpô›NG‹ÿßÏzÓã>êäÍPÊ/°.Ãлȕ@[\(kNúµÿ Ñw ý=réw@äYý<îTÖÆ”YÕ@GØ{-[RtBÁÇÛ(ÖÏÉWòÜý„€~&¦9ïÐE^1y6@g§·\¸tÓKƒÙ/Ðí53ÄßLC?‡vŽÉBžÚõb}²J€nøq«³sÉû3{“²ÑÏ£í% ç ž‰:ƒ9@ïukZú¹bœÂFônÕ¡³¸ÞüN0ßçáRSŸ+¬Ÿ{Ü\s¤RpžÝ2í§·’~Ηši3Ö‚õsœ÷“™‹qýȶµöåbý\µó‰ýÙU¬ŸOož‹ëÕƒú–{á²~ŽŒšØÝéÂúÙYO>·fñ¿~¦Åxw-*X?W?sMHDOÕ\¤ä €ê¬¤tÇ‘õs½ª¦¬j%Pe¦zÆŠèa•ÞÔ\GES7oj`“Õì§´cñrgÿlµEAèq»åg¼bý,’{múdôÔÿ¨àè½n+ŸU#qß<úõãùàS;ÕY?×mea®Ãú9çddº—*P©9eaOÐÓùFëuŸ•õ<ùdc6PÙ½Ïþø¹¤}uvçY?GŸÞxôzÜâìÃèÅ'çÊò]Þ³~N,ÿt¶}žXX#mç}èåZ÷~úw¢Âãxe jšT×yâ}¶FÕr;5X?USSÄãÑçÉrzÞXWT³êòL R2C¢7õ¬:Áæ+ž÷mƳ‚«ÇðsZ·æâü5R?&¦àý=àrª¹ˆÖltêbóó´Òù“þˆAŸ-¯T^¹RN_Æï¨#®ÿ}ã‚÷ OCSv%¦]ºù›„¯R+™Ÿ‡TÂF¾&ó³þßW&TÖCØT¿Æ½cÓý|€ážÞ¾½" ýQ)öjûôiF†A†z÷¤iÓ!\F†|šƒ¾»w¦©p0’s*=÷~Æuá„ýŸ²’˜W6wL¼5ë:bÉYy¤ï„GsË­,áEÅø}ªMïã³ùùq¼x\GÔE‡£ºhŒ¤>?p=Ãκâøü×1/»p>•ßûty1™Ÿ×_c*£M’‚nÞgóóÑ?]ïU£7ÏøÉK³õÙzfÏ·_{üŠbô÷‘§ß’¿þû%A›w §ö§$àxàªKŽ˜ç÷&<®¸ìÒÞt ˜µ“Ï!ôëñ9-+GÿÎöZ¶©”ÍÏ›ÂÏ~:„ëÀ*ÎÇa}`Œo´?ÊÅç zq™{"®‹‹%Ó];à¼nÉ.:‚uOi6qtÏdó³Â—Ór“ß`ÿ¾ÜyŸúó_Lc\#ú¤NbwýMôÍ¥’Ó¾8f5Ö+Ný²ìñ†§øý½sjè?ûÑ–²Eñ9%Qzû"îTôíòÏkÃ@ÇöË\ËgóóÙØ)Æ ø¾Æu™Éè»ä%QQ[ÑÑmúOÐë{Õ]FUà÷w©ÛÖ}ŽèÕÙÙ¢qR@«(D™n4z²á»L™p6?3ÇÀ|«™Ÿ·]¹°oÖm6?{æÅÔ:Ô»7ñd-^O×+Ëà™Ÿ“)Nœ…ãÆ‰~ZËÉü\*¶(ú¤êê\z>?”D+‰¾º¢º(IýÿfX¥þ;~¾Ñ÷ìƒþô±Ý‚CÞëþè1!àS"o›|†ÍÏSl/1}ôç?¸¯RÖbnžÙ­d³ÍÏuµ¥zè«ÇÒiõ"@ß°Ê«û‹ÏK ,•}&mþ4ƈÍÏqo25kûÙüœÔW­³«莯¤e+›Ÿmm-üÓØül=ꥑ=^Wëú¢È=@ I…oz„ÛîÅ&鲘_3uWµœªð˜ô³A@ooþëX4z$§j•ÜU ò‚Ôeós‰·÷–&!6?7vd>¸YTKý“ã"‡17‡w[lÀ÷»4Æho Dÿ|Uæ·¹Õ²q«z­g×-‰fÌë•ñgÏtâys­$,„Ùü\ë®i§¾ËÓЕÂ÷ŸÞò_‡þ…Ücµ4P1íBÏ€º$±¥læÖŠ*hÚ Tïn9wv…°ó|ÌJózî°~þ±ïíºSü^· äîF.†öÿŹ Áæç™Gš·; ªÂbÛÑÆCjkÏÆà’ŸíÈŸ>«Wx¢ûKﺧ[Ãä¼¢®M$ýü+?ÿòó¯ü<)rüè÷Ks•Ø(̃’ß“g\Äë ;ܸxç5rŸí¸zv6Ð}¡\—ì!óóÜ’çßà:¢iè2&Û¹½–¯O“ùù—ŸM‚jÚ¿¢ß5ÜÊç0¬Ÿ-¤g>ŒÁy۰䪴;›Ÿ=Öåjm¸Íægß«­sŒ·ógN¿"›ŸÏۿؤˆëOðƒ¾Y?ovRÜÉæg»¶žï+Æ¡—Kn¨LòÆlŸ‘ƒ4ëgó î"[ØüÌÈ­q—XÌÊ¢”·v*8¯>Q:ú‡q½Ì›ªõëW©ò¹Ò6‹ôs_@òÍ*ìo˪ûãjÑ;]~qQÁY˜'ëÆÕ¬Ü†ÏõÙš¼=꬟åç̃ò".˜ÛÔ†5¢7Ü4ˇ±å…%¥ÈIn]óÉÏèǬwƒ¢¢èkÓER¯Ðë÷гõ/.%ý¬áíЄõ󬃺NÆ/Èü¼7cdU³z¸ °Ü¢h·­Wt—¦í§øÔWKœÍÏ·ö˜zýÌ ‚Þ®ßÀæçœFËû=4ëç_ù¹á”Q‰!æåºãáOÌAoºŒKEïÖÔ•çÌÓIVÓƒÑËÏ&U{Ô¡‡mÓÛ̈üü¯Ÿ{/û«½ðaó³zÜ𵙸.u­Ý¦l=“õs—yo)ÞçûM‘Tr4éç@3Î ©·l~~¸^ÏZRè»+·Db.-R6,;ºôó¯üüËψKÛmû?ýL‹xé,(´eý\±¥¥ÑÏs¢Ty± ¨ŽÞ €z~ÖË>¹ ¨WAO?y²~þ'?ÿëç60#Eô/1Œë´ð.÷Gƒ¸ž+d˜V‰5|Ôì6ˆ“~î¼ïù7z´írƺ뭬ŸË­|§5LÆ\ßèZ~Í„õóyÑna=áþºÝèóÄ%ÃËÜѯ÷;m £ÿ3šwòÿ^Íæçßýü+?ÿòó­¨Ðï c3=¸y¬Ÿï[­sÕ`ý\)ܦ"Äúùù©ñ—爰~þ•ŸÃg¸ê4Þ$óóssõŠG»qþR­µày—÷5XÕÀÝV}²û·©Eí\~þVýŸß±…„’~þˆýÛ!’xˆ«‹ƒ¾ûÏq£þ9öçûÒ--¹ZÚsµ8Ä—á#|bD@Œè#ºÄˆÞï#ÚZĈ61BÔ¬MÔ¬MÔ¬MÔ¬MÔ¬MÔ¬MÔ¬MÔÌ!jæ5sˆš9DÍ¢fQ3‡¨™CÔÌ!jæ5s‰š¹¿ÕÌÁAb„CŒp‰1Â'FĈ1¢KŒèý>ò;-‚A ‡ …CÐÂ!há´pZ8-‚A ‡ …CÐÂ!há´pZ8-‚A —è;—è;—è;—è;—è;—è;—è;—è;—è;—è;—è;—è;—è;—è;—è;—è;—è;—è;—è;—è;—è;—è;—è;—è;—è;—è;—è;÷¿ôýwKp Kp KðZx-<‚A  …GÐÂ#há´ðZx-<‚A  …GÐÂ#há´ðZx-<‚A  …GÐÂ#há´ðZx-<‚A  …GÐÂ'Øàlð 6ø|‚ >ÁŸ`ƒO°Á'Øàlð 6ø|‚ >ÁŸ`ƒO°Á'Øàlð 6ø|‚ >ÁŸ`ƒO°Á'Øàlð 6ø|‚ þaãw“Z-‚A‹€ E@Ð" h´Z-‚A‹€ E@Ð" h´Z-‚A‹€ E@Ð" h´Z-‚A‹€ Eð¿´ü|^ûç±U^ÓNÛÿy-jì¶÷Ÿ—#–:»y8à‹?ÿþSƒ0[ë#xts/src/0000755000176200001440000000000014703504525011664 5ustar liggesusersxts/src/isOrdered.c0000644000176200001440000000757414634167654014000 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ #include #include #include SEXP do_is_ordered (SEXP x, SEXP increasing, SEXP strictly) { int i; int nx = LENGTH(x) - 1; double *real_x; int *int_x; /* If length is 0 then it is ordered */ if (nx < 0) return ScalarLogical(1); if(TYPEOF(x) == REALSXP) { /* Check for increasing order, strict or non-strict */ real_x = REAL(x); if(LOGICAL(increasing)[ 0 ] == 1) { /* INCREASING */ if(LOGICAL(strictly)[ 0 ] == 1) { /* STRICTLY INCREASING ( > 0 ) */ for(i = 0; i < nx; i++) { if( real_x[i+1] <= real_x[i] ) { return ScalarLogical(0); } } } else { /* NOT-STRICTLY ( 0 || > 0 ) */ for(i = 0; i < nx; i++) { if( real_x[i+1] < real_x[i] ) { return ScalarLogical(0); } } } /* Check for decreasing order, strict or non-strict */ } else { if(LOGICAL(strictly)[ 0 ] == 1) { /* STRICTLY DECREASING ( < 0 ) */ for(i = 0; i < nx; i++) { if( real_x[i+1] >= real_x[i] ) { return ScalarLogical(0); } } } else { /* NOT-STRICTLY ( 0 || < 0 ) */ for(i = 0; i < nx; i++) { if( real_x[i+1] > real_x[i] ) { return ScalarLogical(0); } } } } } else if(TYPEOF(x) == INTSXP) { /* Check for increasing order, strict or non-strict */ int_x = INTEGER(x); if(LOGICAL(increasing)[ 0 ] == 1) { /* INCREASING */ /* Not increasing order if first element is NA. We know x has at least 1 element. */ if( int_x[0] == NA_INTEGER ) return ScalarLogical(0); if(LOGICAL(strictly)[ 0 ] == 1) { /* STRICTLY INCREASING ( > 0 ) */ for(i = 0; i < nx; i++) { if( int_x[i+1] <= int_x[i] ) { if (i == (nx-1) && int_x[i+1] == NA_INTEGER) { continue; /* OK if NA is last element */ } return ScalarLogical(0); } } } else { /* NOT-STRICTLY ( 0 || > 0 ) */ for(i = 0; i < nx; i++) { if( int_x[i+1] < int_x[i] ) { if (i == (nx-1) && int_x[i+1] == NA_INTEGER) { continue; /* OK if NA is last element */ } return ScalarLogical(0); } } } /* Check for decreasing order, strict or non-strict */ } else { /* DECREASING */ /* Not decreasing order if last element is NA */ if( int_x[nx] == NA_INTEGER ) return ScalarLogical(0); if(LOGICAL(strictly)[ 0 ] == 1) { /* STRICTLY DECREASING ( < 0 ) */ for(i = 0; i < nx; i++) { if( int_x[i+1] >= int_x[i] ) { if (i == 0 && int_x[i] == NA_INTEGER) { continue; /* OK if NA is first element */ } return ScalarLogical(0); } } } else { /* NOT-STRICTLY ( 0 || < 0 ) */ for(i = 0; i < nx; i++) { if( int_x[i+1] > int_x[i] ) { if (i == 0 && int_x[i] == NA_INTEGER) { continue; /* OK if NA is first element */ } return ScalarLogical(0); } } } } } else { error("'x' must be of type double or integer"); } return ScalarLogical(1); /* default to true */ } xts/src/lag.c0000644000176200001440000001565514634167654012622 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ #include #include #include #include "xts.h" SEXP lagXts(SEXP x, SEXP k, SEXP pad) { SEXP result; int nrs, ncs; int i, j, ij, iijj, K, NApad; int mode; int P=0; /*PROTECT counter*/ int *int_result=NULL, *int_x=NULL; int *lgl_result=NULL, *lgl_x=NULL; double *real_result=NULL, *real_x=NULL; int *int_oindex=NULL, *int_nindex=NULL; double *real_oindex=NULL, *real_nindex=NULL; nrs = nrows(x); ncs = ncols(x); K = INTEGER(k)[ 0 ]; K = (K > nrs) ? nrs : K; mode = TYPEOF(x); NApad = INTEGER(pad)[ 0 ]; if(NApad) { PROTECT(result = allocVector(TYPEOF(x), nrs*ncs)); P++; } else { if(K > 0) { PROTECT(result = allocVector(TYPEOF(x), (nrs-K)*ncs)); P++; } else { PROTECT(result = allocVector(TYPEOF(x), (nrs+K)*ncs)); P++; } } switch( TYPEOF(x) ) { case LGLSXP: lgl_x = LOGICAL(x); lgl_result = LOGICAL(result); break; case INTSXP: int_x = INTEGER(x); int_result = INTEGER(result); break; case REALSXP: real_x = REAL(x); real_result = REAL(result); break; case CPLXSXP: case STRSXP: case VECSXP: case RAWSXP: break; default: error("unsupported type"); break; } for(i = 0; i < nrs; i++) { /* need to figue out how many duplicate values we have, in order to know how far to go back. probably best accomplished with some sort of look-ahead approach, though this may be messy if k is negative... something like: while( i+tmp+K < nrs && xindex[i] == xindex[i+tmp_K] ) tmp_K++; */ for(j = 0; j < ncs; j++) { ij = i + j * nrs; if(i < K || (K < 0 && i > (nrs+K-1)) ) { /* Pad NA values at beginning */ if(NApad) { switch ( mode ) { case LGLSXP: lgl_result[ ij ] = NA_INTEGER; break; case INTSXP: int_result[ ij ] = NA_INTEGER; break; case REALSXP: real_result[ ij ] = NA_REAL; break; case CPLXSXP: COMPLEX(result)[ij].r = NA_REAL; COMPLEX(result)[ij].i = NA_REAL; break; case STRSXP: SET_STRING_ELT(result, ij, NA_STRING); break; case VECSXP: SET_VECTOR_ELT(result, ij, R_NilValue); break; case RAWSXP: RAW(result)[ij] = (Rbyte) 0; break; default: error("matrix subscripting not handled for this type"); break; } /* NA insertion */ } /* NApad */ } else { iijj = i - K + j * nrs; /* move back K positions to get data */ if(!NApad && K > 0) ij = i - K + j * (nrs - K); /* if not padding, start at the correct spot */ if(!NApad && K < 0) ij = i + j * (nrs + K); /* if not padding, start at the correct spot */ switch ( mode ) { case LGLSXP: lgl_result[ ij ] = lgl_x[ iijj ]; break; case INTSXP: int_result[ ij ] = int_x[ iijj ]; break; case REALSXP: real_result[ ij ] = real_x[ iijj ]; break; case CPLXSXP: COMPLEX(result)[ij] = COMPLEX(x)[iijj]; break; case STRSXP: SET_STRING_ELT(result, ij, STRING_ELT(x, iijj)); break; case VECSXP: SET_VECTOR_ELT(result, ij, VECTOR_ELT(x, iijj)); break; case RAWSXP: RAW(result)[ij] = RAW(x)[iijj]; break; default: error("matrix subscripting not handled for this type"); break; } } } /* j-loop */ } /* i-loop */ setAttrib(result, R_ClassSymbol, getAttrib(x, R_ClassSymbol)); if(!NApad) { /* No NA padding */ SEXP oindex, nindex, dims; int nRows = (K > 0) ? nrs-K : nrs+K; int incr = (K > 0) ? K : 0; PROTECT(oindex = getAttrib(x, xts_IndexSymbol)); PROTECT(nindex = allocVector(TYPEOF(oindex), nRows)); switch(TYPEOF(oindex)) { case REALSXP: real_oindex = REAL(oindex); real_oindex = real_oindex + incr; real_nindex = REAL(nindex); for( i = 0; i < nRows; real_nindex++, real_oindex++, i++) *real_nindex = *real_oindex; break; case INTSXP: int_oindex = INTEGER(oindex); int_oindex = int_oindex + incr; int_nindex = INTEGER(nindex); for( i = 0; i < nRows; int_nindex++, int_oindex++, i++) *int_nindex = *int_oindex; break; default: break; } setAttrib(result, xts_IndexSymbol, nindex); PROTECT(dims = allocVector(INTSXP, 2)); INTEGER(dims)[0] = nRows; INTEGER(dims)[1] = ncs; setAttrib(result, R_DimSymbol, dims); setAttrib(result, R_DimNamesSymbol, getAttrib(x, R_DimNamesSymbol)); UNPROTECT(3); } else { /* NA pad */ setAttrib(result, xts_IndexSymbol, getAttrib(x, xts_IndexSymbol)); setAttrib(result, R_DimSymbol, getAttrib(x, R_DimSymbol)); setAttrib(result, R_DimNamesSymbol, getAttrib(x, R_DimNamesSymbol)); } setAttrib(result, xts_ClassSymbol, getAttrib(x, xts_ClassSymbol)); UNPROTECT(P); return result; } SEXP lag_xts (SEXP x, SEXP _k, SEXP _pad) { /* this will eventually revert to NOT changing R default behaviors for now it uses the 'standard' convention adopted by xts */ int k = asInteger(_k); /* ensure args are correct types; error if conversion fails */ if(k == NA_INTEGER) error("'k' must be integer"); if(asLogical(_pad) == NA_LOGICAL) error("'na.pad' must be logical"); k = k * -1; /* change zoo default negative handling */ return zoo_lag (x, ScalarInteger(k), _pad); } SEXP lagts_xts (SEXP x, SEXP _k, SEXP _pad) { /* this will use positive values of lag for carrying forward observations i.e. y = lagts(x, 1) is y(t) = x(t-1) */ int k = asInteger(_k)*-1; /* change zoo default negative handling */ /* ensure args are correct types; error if conversion fails */ if(k == NA_INTEGER) error("'k' must be integer"); if(asLogical(_pad) == NA_LOGICAL) error("'na.pad' must be logical"); return zoo_lag (x, ScalarInteger(k), _pad); } xts/src/rbind.c0000644000176200001440000004516414634167654013153 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ #include #include #include #include "xts.h" SEXP rbind_append(SEXP, SEXP); //SEXP do_rbind_xts (SEXP x, SEXP y, SEXP env) {{{ SEXP do_rbind_xts (SEXP x, SEXP y, SEXP dup) { int nrx, ncx, nry, ncy, truelen, len; int no_duplicate = LOGICAL(dup)[0]; int i, j, ij, ij_x, ij_y, xp=1, yp=1, add_y=0; int P=0; // PROTECT counter int mode; SEXP result, xindex, yindex, newindex; int *int_result=NULL, *int_x=NULL, *int_y=NULL; int *int_newindex=NULL, *int_xindex=NULL, *int_yindex=NULL; double *real_result=NULL, *real_x=NULL, *real_y=NULL; double *real_newindex=NULL, *real_xindex=NULL, *real_yindex=NULL; nrx = nrows(x); ncx = ncols(x); nry = nrows(y); ncy = ncols(y); truelen = len = nrx + nry; if( isNull(x) || isNull(y) ) { /* Handle NULL values by returning non-null object */ if(!isNull(x)) return x; return y; } if( !Rf_asInteger(isXts(x)) ) { PROTECT( x = tryXts(x) ); P++; } if( !Rf_asInteger(isXts(y)) ) { PROTECT( y = tryXts(y) ); P++; } /* need to convert different types of x and y if needed */ if( TYPEOF(x) != TYPEOF(y) ) { warning("mismatched types: converting objects to numeric"); // FIXME not working!!!???? PROTECT(x = coerceVector(x, REALSXP)); P++; PROTECT(y = coerceVector(y, REALSXP)); P++; } mode = TYPEOF(x); if(ncx != ncy) error("data must have same number of columns to bind by row"); PROTECT(xindex = getAttrib(x, xts_IndexSymbol)); P++; PROTECT(yindex = getAttrib(y, xts_IndexSymbol)); P++; if( TYPEOF(xindex) != TYPEOF(yindex) ) { PROTECT(xindex = coerceVector(xindex, REALSXP)); P++; PROTECT(yindex = coerceVector(yindex, REALSXP)); P++; } #ifdef RBIND_APPEND if(TYPEOF(xindex)==REALSXP) { if(REAL(xindex)[length(xindex)-1] < REAL(yindex)[0]) { UNPROTECT(P); return rbind_append(x,y); } } else if(TYPEOF(xindex)==INTSXP) { if(INTEGER(xindex)[length(xindex)-1] < INTEGER(yindex)[0]) { UNPROTECT(P); return rbind_append(x,y); } } #endif if(nrx != length(xindex) || nry != length(yindex)) error("zero-length vectors with non-zero-length index are not allowed"); PROTECT(newindex = allocVector(TYPEOF(xindex), len)); P++; PROTECT(result = allocVector(TYPEOF(x), len * ncx)); P++; switch( TYPEOF(x) ) { case INTSXP: int_x = INTEGER(x); int_y = INTEGER(y); int_result = INTEGER(result); break; case REALSXP: real_x = REAL(x); real_y = REAL(y); real_result = REAL(result); break; default: break; } /* if( TYPEOF(xindex) == REALSXP ) { if(REAL(xindex)[nrx-1] < REAL(yindex)[0]) { memcpy(REAL(newindex), REAL(xindex), sizeof(double) * nrx); memcpy(REAL(newindex)+nrx, REAL(yindex), sizeof(double) * nry); switch(TYPEOF(x)) { case INTSXP: memcpy(INTEGER(result), INTEGER(x), sizeof(int) * (nrx*ncx)); memcpy(INTEGER(result)+(nrx*ncx), INTEGER(y), sizeof(int) * (nry*ncy)); break; case REALSXP: memcpy(REAL(result), REAL(x), sizeof(double) * (nrx*ncx)); memcpy(REAL(result)+(nrx*ncx), REAL(y), sizeof(double) * (nry*ncy)); break; default: break; } UNPROTECT(P); return(result); } } else { } */ /* The main body of code to follow branches based on the type of index, removing the need to test at each position. */ if( TYPEOF(xindex) == REALSXP ) { real_newindex = REAL(newindex); real_xindex = REAL(xindex); real_yindex = REAL(yindex); for( i = 0; i < len; i++ ) { if( i >= truelen ) { break; } else if( xp > nrx ) { real_newindex[ i ] = real_yindex[ yp-1 ]; for(j = 0; j < ncx; j++) { ij = i + j * len; ij_y = (yp-1) + j * nry; switch( mode ) { case LGLSXP: LOGICAL(result)[ ij ] = LOGICAL(y)[ ij_y ]; break; case INTSXP: int_result[ ij ] = int_y[ ij_y ]; break; case REALSXP: real_result[ ij ] = real_y[ ij_y ]; break; case CPLXSXP: COMPLEX(result)[ ij ] = COMPLEX(y)[ ij_y ]; break; case STRSXP: SET_STRING_ELT(result, ij, STRING_ELT(y, ij_y)); break; default: break; } } yp++; } else if( yp > nry ) { real_newindex[ i ] = real_xindex[ xp-1 ]; for(j = 0; j < ncx; j++) { ij = i + j * len; ij_x = (xp-1) + j * nrx; switch( mode ) { case LGLSXP: LOGICAL(result)[ ij ] = LOGICAL(x)[ ij_x ]; break; case INTSXP: int_result[ ij ] = int_x[ ij_x ]; break; case REALSXP: real_result[ ij ] = real_x[ ij_x ]; break; case CPLXSXP: COMPLEX(result)[ ij ] = COMPLEX(x)[ ij_x ]; break; case STRSXP: SET_STRING_ELT(result, ij, STRING_ELT(x, ij_x)); break; default: break; } } xp++; } else if( real_xindex[ xp-1 ] == real_yindex[ yp-1 ] ) { if( xp < nrx && real_xindex[ xp-1 ] < real_xindex[ xp ] ) add_y = 1; /* add y values only if next xindex is new */ if(no_duplicate) { add_y = 0; truelen--; } real_newindex[ i ] = real_xindex[ xp-1 ]; if(add_y) real_newindex[ i+ 1 ] = real_yindex[ yp-1 ]; for(j = 0; j < ncx; j++) { ij = i + j * len; ij_x = (xp-1) + j * nrx; ij_y = (yp-1) + j * nry; switch( mode ) { case LGLSXP: LOGICAL(result)[ ij ] = LOGICAL(x)[ ij_x ]; if(add_y) LOGICAL(result)[ ij+1 ] = LOGICAL(y)[ ij_y ]; break; case INTSXP: int_result[ ij ] = int_x[ ij_x ]; if(add_y) int_result[ ij+1 ] = int_y[ ij_y ]; break; case REALSXP: real_result[ ij ] = real_x[ ij_x ]; if(add_y) real_result[ ij+1 ] = real_y[ ij_y ]; break; case CPLXSXP: COMPLEX(result)[ ij ] = COMPLEX(x)[ ij_x ]; if(add_y) COMPLEX(result)[ ij+1 ] = COMPLEX(y)[ ij_y ]; break; case STRSXP: SET_STRING_ELT(result, ij, STRING_ELT(x, ij_x)); if(add_y) SET_STRING_ELT(result, ij+1, STRING_ELT(y, ij_y)); break; default: break; } } xp++; if(no_duplicate || add_y) { yp++; if(!no_duplicate) i++; // need to increase i as we now have filled in 2 values add_y = 0; } } else if( real_xindex[ xp-1 ] < real_yindex[ yp-1 ] ) { real_newindex[ i ] = real_xindex[ xp-1 ]; for(j = 0; j < ncx; j++) { ij = i + j * len; ij_x = (xp-1) + j * nrx; switch( mode ) { case LGLSXP: LOGICAL(result)[ ij ] = LOGICAL(x)[ ij_x ]; break; case INTSXP: int_result[ ij ] = int_x[ ij_x ]; break; case REALSXP: real_result[ ij ] = real_x[ ij_x ]; break; case CPLXSXP: COMPLEX(result)[ ij ] = COMPLEX(x)[ ij_x ]; break; case STRSXP: SET_STRING_ELT(result, ij, STRING_ELT(x, ij_x)); break; default: break; } } xp++; } else if( real_xindex[ xp-1 ] > real_yindex[ yp-1 ] ) { real_newindex[ i ] = real_yindex[ yp-1 ]; for(j = 0; j < ncx; j++) { ij = i + j * len; ij_y = (yp-1) + j * nry; switch( mode ) { case LGLSXP: LOGICAL(result)[ ij ] = LOGICAL(y)[ ij_y ]; break; case INTSXP: int_result[ ij ] = int_y[ ij_y ]; break; case REALSXP: real_result[ ij ] = real_y[ ij_y ]; break; case CPLXSXP: COMPLEX(result)[ ij ] = COMPLEX(y)[ ij_y ]; break; case STRSXP: SET_STRING_ELT(result, ij, STRING_ELT(y, ij_y)); break; default: break; } } yp++; } } } else if( TYPEOF(xindex) == INTSXP ) { int_newindex = INTEGER(newindex); int_xindex = INTEGER(xindex); int_yindex = INTEGER(yindex); for(i = 0; i < len; i++) { /*Rprintf("xp:%i, yp:%i, i:%i\n",xp,yp,i);*/ if( i >= truelen ) { break; } else if( xp > nrx ) { int_newindex[ i ] = int_yindex[ yp-1 ]; for(j = 0; j < ncx; j++) { ij = i + j * len; ij_y = (yp-1) + j * nry; switch( mode ) { case LGLSXP: LOGICAL(result)[ ij ] = LOGICAL(y)[ ij_y ]; break; case INTSXP: int_result[ ij ] = int_y[ ij_y ]; break; case REALSXP: real_result[ ij ] = real_y[ ij_y ]; break; case CPLXSXP: COMPLEX(result)[ ij ] = COMPLEX(y)[ ij_y ]; break; case STRSXP: SET_STRING_ELT(result, ij, STRING_ELT(y, ij_y)); break; default: break; } } yp++; } else if( yp > nry ) { int_newindex[ i ] = int_xindex[ xp-1 ]; for(j = 0; j < ncx; j++) { ij = i + j * len; ij_x = (xp-1) + j * nrx; switch( mode ) { case LGLSXP: LOGICAL(result)[ ij ] = LOGICAL(x)[ ij_x ]; break; case INTSXP: int_result[ ij ] = int_x[ ij_x ]; break; case REALSXP: real_result[ ij ] = real_x[ ij_x ]; break; case CPLXSXP: COMPLEX(result)[ ij ] = COMPLEX(x)[ ij_x ]; break; case STRSXP: SET_STRING_ELT(result, ij, STRING_ELT(x, ij_x)); break; default: break; } } xp++; } else if( int_xindex[ xp-1 ] == int_yindex[ yp-1 ] ) { if( xp < nrx && int_xindex[ xp-1 ] < int_xindex[ xp ] ) add_y = 1; if(no_duplicate) { add_y = 0; truelen--; } int_newindex[ i ] = int_xindex[ xp-1 ]; if(add_y) int_newindex[ i+1 ] = int_yindex[ yp-1 ]; for(j = 0; j < ncx; j++) { ij = i + j * len; ij_x = (xp-1) + j * nrx; ij_y = (yp-1) + j * nry; switch( mode ) { case LGLSXP: LOGICAL(result)[ ij ] = LOGICAL(x)[ ij_x ]; if(add_y) LOGICAL(result)[ ij+1 ] = LOGICAL(y)[ ij_y ]; break; case INTSXP: int_result[ ij ] = int_x[ ij_x ]; if(add_y) int_result[ ij+1 ] = int_y[ ij_y ]; break; case REALSXP: real_result[ ij ] = real_x[ ij_x ]; if(add_y) real_result[ ij+1 ] = real_y[ ij_y ]; break; case CPLXSXP: COMPLEX(result)[ ij ] = COMPLEX(x)[ ij_x ]; if(add_y) COMPLEX(result)[ ij+1 ] = COMPLEX(y)[ ij_y ]; break; case STRSXP: SET_STRING_ELT(result, ij, STRING_ELT(x, ij_x)); if(add_y) SET_STRING_ELT(result, ij+1, STRING_ELT(y, ij_y)); break; default: break; } } xp++; if(no_duplicate || add_y) { yp++; if(!no_duplicate) i++; // need to increase i as we now have filled in 2 values add_y = 0; } } else if( int_xindex[ xp-1 ] < int_yindex[ yp-1 ] ) { int_newindex[ i ] = int_xindex[ xp-1 ]; for(j = 0; j < ncx; j++) { ij = i + j * len; ij_x = (xp-1) + j * nrx; switch( mode ) { case LGLSXP: LOGICAL(result)[ ij ] = LOGICAL(x)[ ij_x ]; break; case INTSXP: int_result[ ij ] = int_x[ ij_x ]; break; case REALSXP: real_result[ ij ] = real_x[ ij_x ]; break; case CPLXSXP: COMPLEX(result)[ ij ] = COMPLEX(x)[ ij_x ]; break; case STRSXP: SET_STRING_ELT(result, ij, STRING_ELT(x, ij_x)); break; default: break; } } xp++; } else if( int_xindex[ xp-1 ] > int_yindex[ yp-1 ] ) { int_newindex[ i ] = int_yindex[ yp-1 ]; for(j = 0; j < ncx; j++) { ij = i + j * len; ij_y = (yp-1) + j * nry; switch( mode ) { case LGLSXP: LOGICAL(result)[ ij ] = LOGICAL(y)[ ij_y ]; break; case INTSXP: int_result[ ij ] = int_y[ ij_y ]; break; case REALSXP: real_result[ ij ] = real_y[ ij_y ]; break; case CPLXSXP: COMPLEX(result)[ ij ] = COMPLEX(y)[ ij_y ]; break; case STRSXP: SET_STRING_ELT(result, ij, STRING_ELT(y, ij_y)); break; default: break; } } yp++; }} } if(truelen != len) { PROTECT(result = lengthgets(result, truelen * ncx)); P++; /* reset length */ } setAttrib(result, R_ClassSymbol, getAttrib(x, R_ClassSymbol)); SEXP dim; PROTECT(dim = allocVector(INTSXP, 2)); INTEGER(dim)[0] = truelen; INTEGER(dim)[1] = ncx; UNPROTECT(1); setAttrib(result, R_DimSymbol, dim); setAttrib(result, R_DimNamesSymbol, getAttrib(x, R_DimNamesSymbol)); if(truelen != len) { PROTECT(newindex = lengthgets(newindex, truelen)); P++; } copyMostAttrib(xindex, newindex); setAttrib(result, xts_IndexSymbol, newindex); setAttrib(result, xts_ClassSymbol, getAttrib(x, xts_ClassSymbol)); copy_xtsAttributes(x, result); UNPROTECT(P); return result; } //}}} // SEXP rbindXts ( .External("rbindXts", ...) ) {{{ SEXP rbindXts (SEXP args) { SEXP _x; SEXP dup; int P=0; PROTECT_INDEX ipx; args = CDR(args); // 'rbindXts' call name PROTECT(dup = CAR(args)); P++; args = CDR(args); PROTECT(_x = CAR(args)); P++; args = CDR(args); if(args == R_NilValue) { UNPROTECT(P); return(_x); } PROTECT_WITH_INDEX(_x = do_rbind_xts(_x, CAR(args), dup), &ipx); P++; args = CDR(args); while(args != R_NilValue) { REPROTECT(_x = do_rbind_xts(_x, CAR(args), dup), ipx); args = CDR(args); } if(P > 0) UNPROTECT(P); return _x; } //}}} SEXP rbind_append (SEXP x, SEXP y) { /* Provide fast row binding of xts objects if the left-hand object (binding target) has a last index value less than the right-hand object (object to bind). This is an optimization to allow for real-time updating of objects without having to do much more than a memcpy of the two in coordinated fashion */ /*Rprintf("rbind_append called\n");*/ SEXP result; int nrs_x, nrs_y, ncs_x, ncs_y, nr; int i; ncs_x = ncols(x); ncs_y = ncols(y); nrs_x = nrows(x); nrs_y = nrows(y); if(ncs_x != ncs_y) error("objects must have the same number of columns"); /* FIXME */ PROTECT(result = allocVector(TYPEOF(x), (nrs_x + nrs_y) * ncs_x)); nr = nrs_x + nrs_y; switch(TYPEOF(x)) { case REALSXP: for(i=0; i< ncs_x; i++) { memcpy(&(REAL(result)[i*nr]), &(REAL(x)[i*nrs_x]), nrs_x*sizeof(double)); memcpy(&(REAL(result)[i*nr + nrs_x]), &(REAL(y)[i*nrs_y]), nrs_y*sizeof(double)); } break; case INTSXP: for(i=0; i< ncs_x; i++) { memcpy(&(INTEGER(result)[i*nr]), &(INTEGER(x)[i*nrs_x]), nrs_x*sizeof(int)); memcpy(&(INTEGER(result)[i*nr + nrs_x]), &(INTEGER(y)[i*nrs_y]), nrs_y*sizeof(int)); } break; case LGLSXP: for(i=0; i< ncs_x; i++) { memcpy(&(LOGICAL(result)[i*nr]), &(LOGICAL(x)[i*nrs_x]), nrs_x*sizeof(int)); memcpy(&(LOGICAL(result)[i*nr + nrs_x]), &(LOGICAL(y)[i*nrs_y]), nrs_y*sizeof(int)); } break; case CPLXSXP: for(i=0; i< ncs_x; i++) { memcpy(&(COMPLEX(result)[i*nr]), &(COMPLEX(x)[i*nrs_x]), nrs_x*sizeof(Rcomplex)); memcpy(&(COMPLEX(result)[i*nr + nrs_x]), &(COMPLEX(y)[i*nrs_y]), nrs_y*sizeof(Rcomplex)); } break; case RAWSXP: for(i=0; i< ncs_x; i++) { memcpy(&(RAW(result)[i*nr]), &(RAW(x)[i*nrs_x]), nrs_x*sizeof(Rbyte)); memcpy(&(RAW(result)[i*nr + nrs_x]), &(RAW(y)[i*nrs_y]), nrs_y*sizeof(Rbyte)); } break; case STRSXP: /* this requires an explicit loop like rbind.c and needs to be left with rbind.c */ break; default: error("unsupported type"); } copyAttributes(x, result); SEXP index, xindex, yindex; xindex = getAttrib(x, xts_IndexSymbol); yindex = getAttrib(y, xts_IndexSymbol); int INDEXTYPE = TYPEOF(xindex); if(INDEXTYPE != NILSXP) { PROTECT(index = allocVector(INDEXTYPE, nr)); if(INDEXTYPE==REALSXP) { memcpy(REAL(index), REAL(xindex), nrs_x * sizeof(double)); memcpy(&(REAL(index)[nrs_x]), REAL(yindex), nrs_y * sizeof(double)); } else if(INDEXTYPE==INTSXP) { memcpy(INTEGER(index), INTEGER(xindex), nrs_x * sizeof(int)); memcpy(&(INTEGER(index)[nrs_x]), INTEGER(yindex), nrs_y * sizeof(int)); } copyMostAttrib(xindex, index); setAttrib(result, xts_IndexSymbol, index); UNPROTECT(1); } SEXP dim; PROTECT(dim = allocVector(INTSXP, 2)); INTEGER(dim)[0] = nr; INTEGER(dim)[1] = ncs_x; /* should be the same */ setAttrib(result, R_DimSymbol, dim); UNPROTECT(1); setAttrib(result, R_DimNamesSymbol, getAttrib(x, R_DimNamesSymbol)); /* SEXP dimnames, currentnames, newnames; PROTECT(dimnames = allocVector(VECSXP, 2)); PROTECT(newnames = allocVector(STRSXP, length(j))); currentnames = getAttrib(x, R_DimNamesSymbol); if(!isNull(currentnames)) { SET_VECTOR_ELT(dimnames, 0, R_NilValue); for(i=0; i. */ #include #include #include #include "xts.h" SEXP isXts(SEXP x) { int i; SEXP attr, index; index = getAttrib(x, xts_IndexSymbol); PROTECT( attr = coerceVector(getAttrib(x, R_ClassSymbol),STRSXP) ); if(length(attr) <= 1) { UNPROTECT(1); return Rf_ScalarInteger(0); } for(i = 0; i < length(attr); i++) { if(STRING_ELT(attr, i) == mkChar("xts")) { /* check for index attribute */ if(TYPEOF(index)==REALSXP || TYPEOF(index)==INTSXP) { UNPROTECT(1); return Rf_ScalarInteger(1); } else { UNPROTECT(1); return Rf_ScalarInteger(0); } } } UNPROTECT(1); return Rf_ScalarInteger(FALSE); } /* test function and example */ SEXP test_isXts(SEXP x) { if(Rf_asInteger(isXts(x))) { Rprintf("TRUE\n"); } else { Rprintf("FALSE\n"); } return R_NilValue; } xts/src/unique.time.c0000644000176200001440000000747514634167654014323 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ #include #include "xts.h" /* for coredata_xts */ SEXP make_unique (SEXP index_, SEXP eps_) { int P = 0, i; int len = length(index_); double eps = asReal(eps_); if (TYPEOF(index_) == INTSXP) { PROTECT(index_ = coerceVector(index_, REALSXP)); P++; } SEXP newindex_ = PROTECT(allocVector(REALSXP, len)); P++; copyAttributes(index_, newindex_); double *newindex_real = REAL(newindex_); memcpy(REAL(newindex_), REAL(index_), len * sizeof(double)); double last_index = newindex_real[0]; int warn_once = 1; for(i=1; i. */ #include #include #include "xts.h" /* http://en.wikipedia.org/wiki/Kahan_summation_algorithm * sum += x, and updates the accumulated error "c" */ void kahan_sum(long double x, long double * c, long double * sum) { /* Author: Ivan Popivanov */ long double y = x - *c; long double t = *sum + y; *c = ( t - *sum ) - y; *sum = t; } SEXP roll_sum (SEXP x, SEXP n) { /* Author: Joshua Ulrich, with contributions from Ivan Popivanov */ int i, P=0, nrs; nrs = nrows(x); /* Get values from pointers */ int int_n = asInteger(n); /* Initalize result R object */ SEXP result; PROTECT(result = allocVector(TYPEOF(x), length(x))); P++; int *int_result=NULL, *int_x=NULL; int int_sum = 0; double *real_result=NULL, *real_x=NULL; /* check for non-leading NAs and get first non-NA location */ SEXP first; PROTECT(first = naCheck(x, ScalarLogical(TRUE))); P++; int int_first = asInteger(first); if(int_n + int_first > nrs) error("not enough non-NA values"); long double sum = 0.0; long double comp = 0.0; switch(TYPEOF(x)) { case REALSXP: real_result = REAL(result); real_x = REAL(x); //int_result = int_x = NULL; /* set leading NAs, find initial sum value */ for(i=0; i= int_first) kahan_sum(real_x[i], &comp, &sum); } real_result[ int_n + int_first - 1 ] = (double)sum; /* loop over all other values */ for(i=int_n+int_first; i= int_first) int_sum += int_x[i]; } int_result[ int_n + int_first -1 ] = int_sum; /* loop over all other values */ for(i=int_n+int_first; i nrs) error("not enough non-NA values"); /* The branch by type allows for fewer type checks/branching * within the algorithm, providing a _much_ faster mechanism */ switch(TYPEOF(x)) { /* need to implement other types (checking)? */ case REALSXP: real_result = REAL(result); real_x = REAL(x); real_min = real_x[0]; loc = 0; for(i=0; i= int_n-1) { /* find the min over the entire window */ real_min = real_x[i]; for(j=0; j= int_n - 1) { /* find the min over the entire window */ int_min = int_x[i]; for(j=0; j nrs) error("not enough non-NA values"); /* The branch by type allows for fewer type checks/branching * within the algorithm, providing a _much_ faster mechanism */ switch(TYPEOF(x)) { /* need to implement other types (checking)? */ case REALSXP: real_result = REAL(result); real_x = REAL(x); real_max = real_x[0]; loc = 0; for(i=0; i real_max) { real_max = real_x[i]; /* set min value */ loc = 0; /* set min location in window */ } loc++; continue; } else { /* if the min leaves the window */ if(loc >= int_n-1) { /* find the min over the entire window */ real_max = real_x[i]; for(j=0; j real_max) { real_max = real_x[i-j]; loc = j; } } } else { /* if the new value is the new min */ if(real_x[i] > real_max) { real_max = real_x[i]; loc = 0; } } } /* set result, increment location */ real_result[i] = real_max; loc++; } break; case INTSXP: int_result = INTEGER(result); int_x = INTEGER(x); int_min = int_x[0]; loc = 0; for(i=0; i int_min) { int_min = int_x[i]; /* set min value */ loc = 0; /* set min location in window */ } loc++; continue; } else { /* if the min leaves the window */ if(loc >= int_n - 1) { /* find the min over the entire window */ int_min = int_x[i]; for(j=0; j int_min) { int_min = int_x[i-j]; loc = j; } } } else { /* if the new value is the new min */ if(int_x[i] > int_min) { int_min = int_x[i]; loc = 0; } } } /* set result, increment location */ int_result[i] = int_min; loc++; } break; /* case STRSXP: fail! case LGLSXP: convert to int?? case CPLXSXP: */ default: error("unsupported data type"); } copyMostAttrib(x, result); /* still need to set dims and dimnames */ setAttrib(result, R_DimSymbol, getAttrib(x, R_DimSymbol)); setAttrib(result, R_DimNamesSymbol, getAttrib(x, R_DimNamesSymbol)); UNPROTECT(P); return result; } SEXP roll_cov (SEXP x, SEXP y, SEXP n, SEXP samp) { /* Author: Joshua Ulrich */ int i, P=0; /* ensure x and y have same length in R functions, since it's * easier to throw user-informative errors */ int nrx = nrows(x); int nry = nrows(y); if(nrx != nry) error("nrx != nry, blame the R function writer"); /* Coerce to REALSXP to ensure roll_sum returns REALSXP */ PROTECT(x = coerceVector(x, REALSXP)); P++; PROTECT(y = coerceVector(y, REALSXP)); P++; /* Get values from function arguments */ double *real_x = REAL(PROTECT(coerceVector(x, REALSXP))); P++; double *real_y = REAL(PROTECT(coerceVector(y, REALSXP))); P++; int int_n = asInteger(n); int int_samp = asLogical(samp); /* Initalize result R object */ SEXP result; PROTECT(result = allocVector(REALSXP, nrx)); P++; double *real_result = REAL(result); /* rolling sums for mean calculation */ SEXP sum_x, sum_y, xy, sum_xy; PROTECT(sum_x = roll_sum(x, n)); P++; PROTECT(sum_y = roll_sum(y, n)); P++; double *real_sum_x = REAL(sum_x); double *real_sum_y = REAL(sum_y); /* rolling sum of x * y */ PROTECT(xy = allocVector(REALSXP, nrx)); P++; double *real_xy = REAL(xy); for(i=nrx; i--;) { real_xy[i] = real_x[i] * real_y[i]; } PROTECT(sum_xy = roll_sum(xy, n)); P++; double *real_sum_xy = REAL(sum_xy); /* check for non-leading NAs and get first non-NA location */ SEXP first; PROTECT(first = naCheck(sum_xy, ScalarLogical(TRUE))); P++; int int_first = asInteger(first); if(int_n + int_first > nrx) error("not enough non-NA values"); /* set leading NAs */ for(i=0; i. */ #include #include #include #include SEXP endpoints (SEXP _x, SEXP _on, SEXP _k, SEXP _addlast /* TRUE */) { /* efficient implementation of: c(0,which(diff(_x%/%on%/%k+1) != 0),NROW(_x)) */ int *int_index = NULL; double *real_index = NULL; int i=1,j=1, nr, P=0; int int_tmp[2]; int64_t int64_tmp[2]; /* shouldn't force to INTSXP, as this now excludes microsecond and millisecond calculations FIXME */ int on = INTEGER(coerceVector(_on,INTSXP))[0]; int k = INTEGER(coerceVector(_k,INTSXP))[0]; nr = nrows(_x); /* ensure k > 0 (bug #4920) */ if(k <= 0) error("'k' must be > 0"); /* endpoints objects. max nr+2 ( c(0,ep,nr) ) */ SEXP _ep = PROTECT(allocVector(INTSXP,nr+2)); P++; int *ep = INTEGER(_ep); /*switch(TYPEOF(getAttrib(_x, install("index")))) {*/ switch(TYPEOF(_x)) { case INTSXP: /* start i at second elem */ /*int_index = INTEGER(getAttrib(_x, install("index")));*/ int_index = INTEGER(_x); ep[0] = 0; /* special handling if index values < 1970-01-01 00:00:00 UTC */ if(int_index[0] < 0) { int_tmp[1] = (int_index[0] + 1) / on / k; for(i=1,j=1; i. */ #include #include SEXP any_negative (SEXP i_) { int i; int len = length(i_); int *int_i=NULL; double *real_i=NULL; if(TYPEOF(i_)==INTSXP) { int_i = INTEGER(i_); for(i=0; i= 0) continue; return ScalarLogical(1); } } else if(TYPEOF(i_)==REALSXP) { real_i = REAL(i_); for(i=0; i= 0) continue; return ScalarLogical(1); } } return ScalarLogical(0); } xts/src/merge.c0000644000176200001440000011161614702522134013130 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ #include #include #include #include "xts.h" SEXP xts_merge_make_colnames (SEXP colnames, SEXP suffixes, SEXP check_names, SEXP env) { int p = 0; SEXP newcolnames = colnames; // add suffixes if (R_NilValue != suffixes) { SEXP args = PROTECT(allocList(3)); p++; SEXP vals = args; SETCAR(vals, newcolnames); vals = CDR(vals); SETCAR(vals, suffixes); vals = CDR(vals); SETCAR(vals, mkString("")); SET_TAG(vals, install("sep")); SEXP expr = PROTECT(LCONS(install("paste"), args)); p++; PROTECT(newcolnames = eval(expr, env)); p++; } // check that names are 'valid R names' if (LOGICAL(check_names)[0]) { SEXP args = PROTECT(allocList(2)); p++; SEXP vals = args; SETCAR(vals, newcolnames); vals = CDR(vals); SETCAR(vals, ScalarLogical(1)); SET_TAG(vals, install("unique")); SEXP expr = PROTECT(LCONS(install("make.names"), args)); p++; PROTECT(newcolnames = eval(expr, env)); p++; } UNPROTECT(p); return(newcolnames); } SEXP xts_merge_make_dimnames (SEXP _x, SEXP _y, int ncol_x, int ncol_y, SEXP _orig_colnames, SEXP _suffixes, SEXP _check_names, SEXP _env) { int p = 0; int ncols = ncol_x + ncol_y; SEXP colnames = PROTECT(allocVector(STRSXP, ncols)); p++; SEXP dimnames_x = PROTECT(getAttrib(_x, R_DimNamesSymbol)); p++; SEXP dimnames_y = PROTECT(getAttrib(_y, R_DimNamesSymbol)); p++; // do 'x' and/or 'y' have column names? SEXP colnames_x = R_NilValue; SEXP colnames_y = R_NilValue; if (!isNull(dimnames_x) && !isNull(VECTOR_ELT(dimnames_x, 1))) { colnames_x = VECTOR_ELT(dimnames_x, 1); } if (!isNull(dimnames_y) && !isNull(VECTOR_ELT(dimnames_y, 1))) { colnames_y = VECTOR_ELT(dimnames_y, 1); } // time to combine the two for (int i = 0; i < ncols; i++) { if (i < ncol_x) { // copy column names from 'x' if (R_NilValue != colnames_x) { SET_STRING_ELT(colnames, i, STRING_ELT(colnames_x, i)); } else { SET_STRING_ELT(colnames, i, STRING_ELT(_orig_colnames, i)); } } else { // copy column names from 'y' if (R_NilValue != colnames_y) { SET_STRING_ELT(colnames, i, STRING_ELT(colnames_y, i - ncol_x)); } else { SET_STRING_ELT(colnames, i, STRING_ELT(_orig_colnames, i)); } } } colnames = PROTECT(xts_merge_make_colnames(colnames, _suffixes, _check_names, _env)); p++; SEXP dimnames = PROTECT(allocVector(VECSXP, 2)); p++; SET_VECTOR_ELT(dimnames, 0, R_NilValue); SET_VECTOR_ELT(dimnames, 1, colnames); UNPROTECT(p); return(dimnames); } /* * These macros allow _XTS_DO_MERGE_ to handle character xts objects as well * as all the other storage types. */ #define _XTS_SET_EQ_(_DES_, _DES_I_, _SRC_, _SRC_I_) \ _DES_[_DES_I_] = _SRC_[_SRC_I_] #define _XTS_SET_FN_(_DES_, _DES_I_, _SRC_, _SRC_I_) \ SET_STRING_ELT(_DES_, _DES_I_, STRING_ELT(_SRC_, _SRC_I_)) /* * This is the core merge algorithm. It is implemented as a macro so it can be * called inside a switch() statement for each coredata storage type. Moving * the switch() statement outside the main loop improves performance by ~10%. * * This macro does (and should) not use any variables that aren't arguments or * defined within its scope. This isn't enforceable by the compiler, so all the * local variables have an underscore prefix and suffix to avoid referencing a * value outside of the macro's scope. */ #define _XTS_DO_MERGE_(_RESULT_, _X_, _Y_, _FILL_, _R_JOIN_, _L_JOIN_, \ _INDEX_, _X_INDEX_, _Y_INDEX_, _NROWS_, _X_NR_, _Y_NR_, _X_NC_, _Y_NC_) \ int _xp_ = 1; \ int _yp_ = 1; \ int _i_, _j_, _ij_in_, _ij_out_; \ \ for (_i_ = 0; _i_ < _NROWS_; _i_++) { \ /* If we are past the last row in x, assign NA to merged data \ and copy the y column values to the second side of result \ */ \ if (_xp_ > _X_NR_) { \ /* past the last row of x */ \ if (_R_JOIN_) { \ _INDEX_[_i_] = _Y_INDEX_[_yp_-1]; \ /* we are out of x-values, so fill merged result with NAs */ \ for (_j_ = 0; _j_ < _X_NC_; _j_++) { /* x-values */ \ _ij_out_ = _i_ + _j_ * _NROWS_; \ _XTS_SET_ELT_(_RESULT_, _ij_out_, _FILL_, 0); \ } \ for (_j_ = 0; _j_ < _Y_NC_; _j_++) { /* y-values */ \ _ij_out_ = _i_ + (_j_+_X_NC_) * _NROWS_; \ _ij_in_ = (_yp_-1) + _j_ * _Y_NR_; \ _XTS_SET_ELT_(_RESULT_, _ij_out_, _Y_, _ij_in_); \ } \ } else { \ _i_--; /* if all=FALSE, we must decrement i for each non-match */ \ } \ _yp_++; \ } else if (_yp_ > _Y_NR_) { \ /* past the last row of y */ \ if (_L_JOIN_) { \ _INDEX_[_i_] = _X_INDEX_[_xp_-1]; \ \ for (_j_ = 0; _j_ < _X_NC_; _j_++) { /* x-values */ \ _ij_out_ = _i_ + _j_ * _NROWS_; \ _ij_in_ = (_xp_-1) + _j_ * _X_NR_; \ _XTS_SET_ELT_(_RESULT_, _ij_out_, _X_, _ij_in_); \ } \ \ /* we are out of y-values, so fill merged result with NAs */ \ for (_j_ = 0; _j_ < _Y_NC_; _j_++) { /* y-values */ \ _ij_out_ = _i_ + (_j_+_X_NC_) * _NROWS_; \ _XTS_SET_ELT_(_RESULT_, _ij_out_, _FILL_, 0); \ } \ } else { \ _i_--; /* if all=FALSE, we must decrement i for each non-match */ \ } \ _xp_++; \ } else if (_X_INDEX_[_xp_-1] == _Y_INDEX_[_yp_-1]) { \ /* matching index values copy all column values from x and y to results */ \ _INDEX_[_i_] = _X_INDEX_[_xp_-1]; \ \ for (_j_ = 0; _j_ < _X_NC_; _j_++) { /* x-values */ \ _ij_out_ = _i_ + _j_ * _NROWS_; \ _ij_in_ = (_xp_-1) + _j_ * _X_NR_; \ _XTS_SET_ELT_(_RESULT_, _ij_out_, _X_, _ij_in_); \ } \ for (_j_ = 0; _j_ < _Y_NC_; _j_++) { /* y-values */ \ _ij_out_ = _i_ + (_j_+_X_NC_) * _NROWS_; \ _ij_in_ = (_yp_-1) + _j_ * _Y_NR_; \ _XTS_SET_ELT_(_RESULT_, _ij_out_, _Y_, _ij_in_); \ } \ _xp_++; \ _yp_++; \ } else if (_X_INDEX_[_xp_-1] < _Y_INDEX_[_yp_-1]) { \ if (_L_JOIN_) { \ _INDEX_[_i_] = _X_INDEX_[_xp_-1]; \ \ for (_j_ = 0; _j_ < _X_NC_; _j_++) { /* x-values */ \ _ij_out_ = _i_ + _j_ * _NROWS_; \ _ij_in_ = (_xp_-1) + _j_ * _X_NR_; \ _XTS_SET_ELT_(_RESULT_, _ij_out_, _X_, _ij_in_); \ } \ for (_j_ = 0; _j_ < _Y_NC_; _j_++) { /* y-values */ \ _ij_out_ = _i_ + (_j_+_X_NC_) * _NROWS_; \ _XTS_SET_ELT_(_RESULT_, _ij_out_, _FILL_, 0); \ } \ } else { \ _i_--; \ } \ _xp_++; \ } else if (_X_INDEX_[_xp_-1] > _Y_INDEX_[_yp_-1]) { \ if (_R_JOIN_) { \ _INDEX_[_i_] = _Y_INDEX_[_yp_-1]; \ \ for (_j_ = 0; _j_ < _X_NC_; _j_++) { /* x-values */ \ _ij_out_ = _i_ + _j_ * _NROWS_; \ _XTS_SET_ELT_(_RESULT_, _ij_out_, _FILL_, 0); \ } \ for (_j_ = 0; _j_ < _Y_NC_; _j_++) { /* y-values */ \ _ij_out_ = _i_ + (_j_+_X_NC_) * _NROWS_; \ _ij_in_ = (_yp_-1) + _j_ * _Y_NR_; \ _XTS_SET_ELT_(_RESULT_, _ij_out_, _Y_, _ij_in_); \ } \ } else { \ _i_--; \ } \ _yp_++; \ } \ } \ /* This is a merge_join algorithm used to allow two xts objects to be merged as one along a common index efficiently and fast The code is branched for REAL and INTEGER indexed values which allows for efficient memory usage and minimal testing/coercion Copyright Jeffrey A. Ryan 2008 */ /* do_merge_xts {{{ */ SEXP do_merge_xts (SEXP x, SEXP y, SEXP all, SEXP fill, SEXP retclass, SEXP colnames, SEXP suffixes, SEXP retside, SEXP check_names, SEXP env, SEXP coerce) { int nrx, ncx, nry, ncy, len; int left_join, right_join; int p = 0; SEXP xindex, yindex, index, result, attr; int *int_index=NULL, *int_xindex=NULL, *int_yindex=NULL; double *real_index=NULL, *real_xindex=NULL, *real_yindex=NULL; /* Check whether the objects are NULL and treat NULL objects as * zero-width with an index that matches the non-null object */ if (isNull(x) || isNull(y)) { if (!isNull(x)) { return(x); } else { return(y); } } PROTECT(xindex = getAttrib(x, xts_IndexSymbol)); p++; /* convert to xts object if needed */ if (!asInteger(isXts(y))) { SEXP args = PROTECT(allocList(3)); p++; SEXP vals = args; SETCAR(vals, y); vals = CDR(vals); SET_TAG(vals, install("length.out")); SETCAR(vals, ScalarInteger(length(xindex))); vals = CDR(vals); SET_TAG(vals, install("error")); SETCAR(vals, install(".merge.xts.scalar")); SEXP expr = PROTECT(LCONS(install("try.xts"), args)); p++; PROTECT(y = eval(expr, env)); p++; } if (asInteger(isXts(y))) { PROTECT(yindex = getAttrib(y, xts_IndexSymbol)); p++; } else { PROTECT(yindex = getAttrib(x, xts_IndexSymbol)); p++; } if (TYPEOF(retside) != LGLSXP) { error("retside must be a logical value of TRUE or FALSE"); } /* determine number of rows and columns to use for the inputs */ int return_x_data = LOGICAL(retside)[0]; int is_xobs_zero = LENGTH(x) == 0; int is_xdim_null = isNull(getAttrib(x, R_DimSymbol)); nrx = nrows(x); ncx = ncols(x); if (return_x_data) { if (is_xdim_null) { if (is_xobs_zero) { nrx = LENGTH(xindex); ncx = 0; PROTECT(x = coerceVector(x, TYPEOF(y))); p++; } } else { if (is_xobs_zero) { nrx = LENGTH(xindex); ncx = INTEGER(getAttrib(x, R_DimSymbol))[1]; PROTECT(x = coerceVector(x, TYPEOF(y))); p++; } } } else { nrx = LENGTH(xindex); ncx = 0; } int return_y_data = LOGICAL(retside)[1]; int is_yobs_zero = LENGTH(y) == 0; int is_ydim_null = isNull(getAttrib(y, R_DimSymbol)); nry = nrows(y); ncy = ncols(y); if (return_y_data) { if (is_ydim_null) { if (is_yobs_zero) { nry = LENGTH(yindex); ncy = 0; PROTECT(y = coerceVector(y, TYPEOF(x))); p++; } } else { if (is_yobs_zero) { nry = LENGTH(yindex); ncy = INTEGER(getAttrib(y, R_DimSymbol))[1]; PROTECT(y = coerceVector(y, TYPEOF(x))); p++; } } } else { nry = LENGTH(yindex); ncy = 0; } /* do the inputs have any data to merge? */ len = nrx + nry; if (len < 1 && ncx < 1 && ncy < 1) { /* return empty xts object if there are no rows or columns */ PROTECT(result = allocVector(TYPEOF(x), 0)); p++; PROTECT(index = allocVector(TYPEOF(xindex), 0)); p++; setAttrib(index, xts_IndexTzoneSymbol, getAttrib(xindex, xts_IndexTzoneSymbol)); setAttrib(index, xts_IndexTclassSymbol, getAttrib(xindex, xts_IndexTclassSymbol)); setAttrib(index, xts_IndexTformatSymbol, getAttrib(xindex, xts_IndexTformatSymbol)); setAttrib(result, xts_IndexSymbol, index); if (LOGICAL(retclass)[0]) { setAttrib(result, R_ClassSymbol, getAttrib(x, R_ClassSymbol)); } setAttrib(result, xts_ClassSymbol, getAttrib(x, xts_ClassSymbol)); UNPROTECT(p); return result; } /* Ensure both indexes are REAL if they are not the same type. */ if (TYPEOF(xindex) != TYPEOF(yindex)) { PROTECT(xindex = coerceVector(xindex, REALSXP)); p++; PROTECT(yindex = coerceVector(yindex, REALSXP)); p++; } int index_type = TYPEOF(xindex); if (TYPEOF(all) != LGLSXP) { error("all must be a logical value of TRUE or FALSE"); } left_join = INTEGER(all)[0]; right_join = INTEGER(all)[1]; /* determine num_rows of final merged xts object this seems to only cost 1/1000 of a sec per 1e6 observations. Acceptable 'waste' given that now we can properly allocate space for our results We also check the index type and use the appropriate macros */ int i = 0, xp = 1, yp = 1; /* x and y positions in index */ if (index_type == REALSXP) { real_xindex = REAL(xindex); real_yindex = REAL(yindex); /* Check for illegal values before looping. Due to ordered index, * -Inf must be first, while NA, Inf, and NaN must be last. */ int bad_x_index = nrx > 0 && (!R_FINITE(real_xindex[0]) || !R_FINITE(real_xindex[nrx-1])); int bad_y_index = nry > 0 && (!R_FINITE(real_yindex[0]) || !R_FINITE(real_yindex[nry-1])); if (bad_x_index || bad_y_index) { error("'index' cannot contain 'NA', 'NaN', or '+/-Inf'"); } while ((xp + yp) <= (len + 1)) { if (xp > nrx) { yp++; if (right_join) i++; } else if (yp > nry) { xp++; if (left_join) i++; } else { double xi = real_xindex[xp-1]; double yi = real_yindex[yp-1]; if (xi == yi) { /* INNER JOIN -- only result if all = FALSE */ yp++; xp++; i++; } else if (xi < yi) { /* LEFT JOIN */ xp++; if (left_join) i++; } else if (xi > yi) { /* RIGHT JOIN */ yp++; if (right_join) i++; } else { error("Invalid index element comparison (should never happen)"); } } } } else if (index_type == INTSXP) { int_xindex = INTEGER(xindex); int_yindex = INTEGER(yindex); /* Check for NA before looping; logical ops on NA may yield surprising * results. Note that the NA_integer_ will appear in the last value of * the index because of sorting at the R level, even though NA_INTEGER * equals INT_MIN at the C level. */ int bad_x_index = nrx > 0 && int_xindex[nrx-1] == NA_INTEGER; int bad_y_index = nry > 0 && int_yindex[nry-1] == NA_INTEGER; if (bad_x_index || bad_y_index) { error("'index' cannot contain 'NA'"); } while ((xp + yp) <= (len + 1)) { if (xp > nrx) { yp++; if (right_join) i++; } else if (yp > nry) { xp++; if (left_join) i++; } else { int xi = int_xindex[xp-1]; int yi = int_yindex[yp-1]; if (xi == yi) { /* INNER JOIN -- only result if all = FALSE */ yp++; xp++; i++; } else if (xi < yi) { /* LEFT JOIN */ xp++; if (left_join) i++; } else if (xi > yi) { /* RIGHT JOIN */ yp++; if (right_join) i++; } else { error("Invalid index element comparison (should never happen)"); } } } } else { error("'index' must be either double or integer"); } if (i == 0) { /* return a zero-length xts object if no rows match, consistent w/zoo */ PROTECT(result = allocMatrix(TYPEOF(x), 0, ncx + ncy)); p++; PROTECT(index = allocVector(TYPEOF(xindex), 0)); p++; /* set tclass, tzone, and tformat from x-index */ setAttrib(index, xts_IndexTzoneSymbol, getAttrib(xindex, xts_IndexTzoneSymbol)); setAttrib(index, xts_IndexTclassSymbol, getAttrib(xindex, xts_IndexTclassSymbol)); setAttrib(index, xts_IndexTformatSymbol, getAttrib(xindex, xts_IndexTformatSymbol)); SET_xtsIndex(result, index); /* dimnames */ if (!isNull(colnames)) { /* only set DimNamesSymbol if passed colnames is not NULL */ SEXP dimnames = PROTECT(xts_merge_make_dimnames(x, y, ncx, ncy, colnames, suffixes, check_names, env)); p++; setAttrib(result, R_DimNamesSymbol, dimnames); } if (LOGICAL(retclass)[0]) { setAttrib(result, R_ClassSymbol, getAttrib(x, R_ClassSymbol)); } UNPROTECT(p); return result; } int num_rows = i; xp = 1; yp = 1; PROTECT(index = allocVector(TYPEOF(xindex), num_rows)); p++; /* coercion/matching of TYPE for x and y needs to be checked, either here or in the calling R code. I suspect here is more useful if other function can call the C code as well. If objects are not the same type, convert to REALSXP. */ if (asInteger(coerce) || TYPEOF(x) != TYPEOF(y)) { PROTECT(x = coerceVector(x, REALSXP)); p++; PROTECT(y = coerceVector(y, REALSXP)); p++; } PROTECT(result = allocVector(TYPEOF(x), (ncx + ncy) * num_rows)); p++; /* Ensure fill is the correct length and type */ if (length(fill) < 1) { PROTECT(fill = ScalarLogical(NA_LOGICAL)); p++; } if (TYPEOF(fill) != TYPEOF(x)) { PROTECT(fill = coerceVector(fill, TYPEOF(x))); p++; } /* There are two type of supported index types, each branched from here */ if (index_type == REALSXP) { real_index = REAL(index); switch (TYPEOF(x)) { case LGLSXP: { int *lgl_r = LOGICAL(result); int *lgl_x = LOGICAL(x); int *lgl_y = LOGICAL(y); int *lgl_fill = LOGICAL(fill); #define _XTS_SET_ELT_ _XTS_SET_EQ_ _XTS_DO_MERGE_(lgl_r, lgl_x, lgl_y, lgl_fill, right_join, left_join, real_index, real_xindex, real_yindex, num_rows, nrx, nry, ncx, ncy); #undef _XTS_SET_ELT_ } break; case INTSXP: { int *int_r = INTEGER(result); int *int_x = INTEGER(x); int *int_y = INTEGER(y); int *int_fill = INTEGER(fill); #define _XTS_SET_ELT_ _XTS_SET_EQ_ _XTS_DO_MERGE_(int_r, int_x, int_y, int_fill, right_join, left_join, real_index, real_xindex, real_yindex, num_rows, nrx, nry, ncx, ncy); #undef _XTS_SET_ELT_ } break; case REALSXP: { double *real_r = REAL(result); double *real_x = REAL(x); double *real_y = REAL(y); double *real_fill = REAL(fill); #define _XTS_SET_ELT_ _XTS_SET_EQ_ _XTS_DO_MERGE_(real_r, real_x, real_y, real_fill, right_join, left_join, real_index, real_xindex, real_yindex, num_rows, nrx, nry, ncx, ncy); #undef _XTS_SET_ELT_ } break; case CPLXSXP: { Rcomplex *cplx_r = COMPLEX(result); Rcomplex *cplx_x = COMPLEX(x); Rcomplex *cplx_y = COMPLEX(y); Rcomplex *cplx_fill = COMPLEX(fill); #define _XTS_SET_ELT_ _XTS_SET_EQ_ _XTS_DO_MERGE_(cplx_r, cplx_x, cplx_y, cplx_fill, right_join, left_join, real_index, real_xindex, real_yindex, num_rows, nrx, nry, ncx, ncy); #undef _XTS_SET_ELT_ } break; case STRSXP: { #define _XTS_SET_ELT_ _XTS_SET_FN_ _XTS_DO_MERGE_(result, x, y, fill, right_join, left_join, real_index, real_xindex, real_yindex, num_rows, nrx, nry, ncx, ncy); #undef _XTS_SET_ELT_ } break; default: error("unsupported data type"); break; } } else if (index_type == INTSXP) { int_index = INTEGER(index); switch (TYPEOF(x)) { case LGLSXP: { int *lgl_r = LOGICAL(result); int *lgl_x = LOGICAL(x); int *lgl_y = LOGICAL(y); int *lgl_fill = LOGICAL(fill); #define _XTS_SET_ELT_ _XTS_SET_EQ_ _XTS_DO_MERGE_(lgl_r, lgl_x, lgl_y, lgl_fill, right_join, left_join, int_index, int_xindex, int_yindex, num_rows, nrx, nry, ncx, ncy); #undef _XTS_SET_ELT_ } break; case INTSXP: { int *int_r = INTEGER(result); int *int_x = INTEGER(x); int *int_y = INTEGER(y); int *int_fill = INTEGER(fill); #define _XTS_SET_ELT_ _XTS_SET_EQ_ _XTS_DO_MERGE_(int_r, int_x, int_y, int_fill, right_join, left_join, int_index, int_xindex, int_yindex, num_rows, nrx, nry, ncx, ncy); #undef _XTS_SET_ELT_ } break; case REALSXP: { double *real_r = REAL(result); double *real_x = REAL(x); double *real_y = REAL(y); double *real_fill = REAL(fill); #define _XTS_SET_ELT_ _XTS_SET_EQ_ _XTS_DO_MERGE_(real_r, real_x, real_y, real_fill, right_join, left_join, int_index, int_xindex, int_yindex, num_rows, nrx, nry, ncx, ncy); #undef _XTS_SET_ELT_ } break; case CPLXSXP: { Rcomplex *cplx_r = COMPLEX(result); Rcomplex *cplx_x = COMPLEX(x); Rcomplex *cplx_y = COMPLEX(y); Rcomplex *cplx_fill = COMPLEX(fill); #define _XTS_SET_ELT_ _XTS_SET_EQ_ _XTS_DO_MERGE_(cplx_r, cplx_x, cplx_y, cplx_fill, right_join, left_join, int_index, int_xindex, int_yindex, num_rows, nrx, nry, ncx, ncy); #undef _XTS_SET_ELT_ } break; case STRSXP: { #define _XTS_SET_ELT_ _XTS_SET_FN_ _XTS_DO_MERGE_(result, x, y, fill, right_join, left_join, int_index, int_xindex, int_yindex, num_rows, nrx, nry, ncx, ncy); #undef _XTS_SET_ELT_ } break; default: error("unsupported data type"); break; } } else { error("'index' must be either double or integer"); } /* following logic to allow for dimensionless xts objects (unsupported) to be used in Ops.xts calls This maps to how zoo behaves */ if (return_x_data && !return_y_data && is_xdim_null) { setAttrib(result, R_DimSymbol, R_NilValue); } else if (return_y_data && !return_x_data && is_ydim_null) { setAttrib(result, R_DimSymbol, R_NilValue); } else /* set Dim and DimNames if there is at least 1 column */ if ((ncx + ncy) > 0) { /* DIM */ PROTECT(attr = allocVector(INTSXP, 2)); INTEGER(attr)[0] = num_rows; INTEGER(attr)[1] = ncx + ncy; setAttrib(result, R_DimSymbol, attr); UNPROTECT(1); /* DIMNAMES */ if (!isNull(colnames)) { /* only set DimNamesSymbol if passed colnames is not NULL */ SEXP dimnames = PROTECT(xts_merge_make_dimnames(x, y, ncx, ncy, colnames, suffixes, check_names, env)); p++; setAttrib(result, R_DimNamesSymbol, dimnames); } } else { /* only used for zero-width results! xts always has dimension */ setAttrib(result, R_DimSymbol, R_NilValue); } setAttrib(result, xts_IndexSymbol, index); if (LOGICAL(retclass)[0]) { setAttrib(result, R_ClassSymbol, getAttrib(x, R_ClassSymbol)); } setAttrib(result, xts_ClassSymbol, getAttrib(x, xts_ClassSymbol)); copy_xtsAttributes(x, result); UNPROTECT(p); return result; } //}}} //SEXP mergeXts (SEXP all, SEXP fill, SEXP retclass, SEXP colnames, SEXP retside, SEXP env, SEXP args) /* called via .External("mergeXts", ...) */ SEXP mergeXts (SEXP args) // mergeXts {{{ { SEXP _x, _y, xtmp, result, _INDEX; /* colnames should be renamed as suffixes, as colnames need to be added at the C level */ SEXP all, fill, retc, retclass, symnames, suffixes, rets, retside, env, tzone, check_names; int nr, nc, ncs=0; int index_len; int i, n=0, P=0; SEXP argstart; args = CDR(args); all = CAR(args); args = CDR(args); fill = CAR(args); args = CDR(args); retclass = CAR(args); args = CDR(args); symnames = CAR(args); args = CDR(args); suffixes = CAR(args); args = CDR(args); retside = CAR(args); args = CDR(args); env = CAR(args); args = CDR(args); tzone = CAR(args); args = CDR(args); check_names = CAR(args); args = CDR(args); /* args should now correspond to the ... objects we are looking to merge */ argstart = args; // use this to rewind list... n = 0; int type_of; SEXP coerce = PROTECT(ScalarInteger(0)); P++; if (args != R_NilValue) { type_of = TYPEOF(CAR(args)); } /* number of columns in the output */ while (args != R_NilValue) { ncs += xts_ncols(CAR(args)); if (length(CAR(args)) > 0) { /* need to convert all objects if one non-zero-width needs to be converted */ if (TYPEOF(CAR(args)) != type_of) { INTEGER(coerce)[0] = 1; } } args = CDR(args); n++; } /* build an index to be used in all subsequent calls */ args = argstart; _x = CAR(args); args = CDR(args); int leading_non_xts = 0; while (!asInteger(isXts(_x))) { if (args == R_NilValue) { error("no xts object to merge"); } leading_non_xts = 1; /*warning("leading non-xts objects may have been dropped");*/ _x = CAR(args); args = CDR(args); } /* test for NULLs that may be present from cbind dispatch */ if (!leading_non_xts) { /* leading non-xts in 2 case scenario was igoring non-xts value */ if (n < 3 && (args == R_NilValue || (isNull(CAR(args)) && length(args) == 1))) { /* no y arg or y==NULL */ UNPROTECT(P); return(_x); } } if (args != R_NilValue) { _y = CAR(args); args = CDR(args); } else { PROTECT(_y = duplicate(_x)); P++; } if (n > 2 || leading_non_xts) { /* generalized n-case optimization currently if n>2 this is faster and more memory efficient than recursively building a merged object, object by object. */ PROTECT(retc = allocVector(LGLSXP, 1)); P++; LOGICAL(retc)[0] = 1; /* return class == TRUE */ PROTECT(rets = allocVector(LGLSXP, 2)); P++; LOGICAL(rets)[0] = 0; /* don't return left */ LOGICAL(rets)[1] = 0; /* don't return right */ if (isNull(_y)) { PROTECT(_y = duplicate(_x)); P++; } /* REPROTECT _INDEX in while loop */ PROTECT_INDEX idx; PROTECT_WITH_INDEX(_INDEX = do_merge_xts(_x, _y, all, fill, retc, R_NilValue, R_NilValue, rets, check_names, env, coerce), &idx); P++; /* merge all objects into one zero-width common index */ while (args != R_NilValue) { if (!isNull(CAR(args))) { REPROTECT(_INDEX = do_merge_xts(_INDEX, CAR(args), all, fill, retc, R_NilValue, R_NilValue, rets, check_names, env, coerce), idx); } args = CDR(args); } index_len = length(GET_xtsIndex(_INDEX)); args = argstart; // reset args int ii, jj, iijj, jj_result; PROTECT(result = allocVector(TYPEOF(_INDEX), index_len * ncs)); P++; SEXP ColNames, NewColNames; PROTECT(NewColNames = allocVector(STRSXP, ncs)); P++; ncs = 0; /* REPROTECT xtmp inside for loop */ PROTECT_INDEX idxtmp, cnmtmp; PROTECT_WITH_INDEX(xtmp = NULL, &idxtmp); P++; PROTECT_WITH_INDEX(ColNames = NULL, &cnmtmp); P++; /* merge each object with index */ for (i = 0, nc = 0; args != R_NilValue; i = i+nc, args = CDR(args)) { /* i is object current being merged/copied * nc is offset in current object */ if (isNull(CAR(args))) { i = i-nc; continue; // if NULL is passed, skip to the next object. } REPROTECT(xtmp = do_merge_xts(_INDEX, CAR(args), all, fill, retclass, R_NilValue, R_NilValue, retside, check_names, env, coerce), idxtmp); nr = nrows(xtmp); nc = xts_ncols(xtmp); ncs += nc; /* Use colnames from merged object, if it has them. Otherwise, use * use deparsed names */ REPROTECT(ColNames = getAttrib(CAR(args),R_DimNamesSymbol), cnmtmp); SEXP colnames = R_NilValue; if (R_NilValue != ColNames) { colnames = VECTOR_ELT(ColNames, 1); } if (R_NilValue == colnames) { for (jj = 0; jj < nc; jj++) { SET_STRING_ELT(NewColNames, i+jj, STRING_ELT(symnames,i+jj)); } } else { for (jj = 0; jj < nc; jj++) { SET_STRING_ELT(NewColNames, i+jj, STRING_ELT(colnames, jj)); } } /* by type, insert merged data into result object */ switch(TYPEOF(xtmp)) { case LGLSXP: { int *xtmp_ = LOGICAL(xtmp); int *result_ = LOGICAL(result); for (jj = 0; jj < nc; jj++) { for (ii = 0; ii < nr; ii++) { iijj = ii + jj * nr; jj_result = ii + (i+jj) * nr; result_[jj_result] = xtmp_[iijj]; } } } break; case INTSXP: { int *xtmp_ = INTEGER(xtmp); int *result_ = INTEGER(result); for (jj = 0; jj < nc; jj++) { for (ii = 0; ii < nr; ii++) { iijj = ii + jj * nr; jj_result = ii + (i+jj) * nr; result_[jj_result] = xtmp_[iijj]; } } } break; case REALSXP: { double *xtmp_ = REAL(xtmp); double *result_ = REAL(result); for (jj = 0; jj < nc; jj++) { for (ii = 0; ii < nr; ii++) { iijj = ii + jj * nr; jj_result = ii + (i+jj) * nr; result_[jj_result] = xtmp_[iijj]; } } } break; case CPLXSXP: { Rcomplex *xtmp_ = COMPLEX(xtmp); Rcomplex *result_ = COMPLEX(result); for (jj = 0; jj < nc; jj++) { for (ii = 0; ii < nr; ii++) { iijj = ii + jj * nr; jj_result = ii + (i+jj) * nr; result_[jj_result] = xtmp_[iijj]; } } } break; case STRSXP: { for (jj = 0; jj < nc; jj++) { for (ii = 0; ii < nr; ii++) { iijj = ii + jj * nr; jj_result = ii + (i+jj) * nr; SET_STRING_ELT(result, jj_result, STRING_ELT(xtmp, iijj)); } } } break; default: error("unsupported data type"); break; } } if (ncs > 0) { SEXP dim; PROTECT(dim = allocVector(INTSXP, 2)); P++; INTEGER(dim)[0] = index_len; INTEGER(dim)[1] = ncs; setAttrib(result, R_DimSymbol, dim); PROTECT(NewColNames = xts_merge_make_colnames(NewColNames, suffixes, check_names, env)); P++; SEXP dimnames = PROTECT(allocVector(VECSXP, 2)); P++; SET_VECTOR_ELT(dimnames, 0, R_NilValue); SET_VECTOR_ELT(dimnames, 1, NewColNames); setAttrib(result, R_DimNamesSymbol, dimnames); } SET_xtsIndex(result, GET_xtsIndex(_INDEX)); copy_xtsCoreAttributes(_INDEX, result); copy_xtsAttributes(_INDEX, result); } else { /* 2-case optimization --- simply call main routine */ /* likely bug in handling of merge(1, xts) case */ PROTECT(result = do_merge_xts(_x, _y, all, fill, retclass, symnames, suffixes, retside, check_names, env, coerce)); P++; } SEXP index_tmp = getAttrib(result, xts_IndexSymbol); PROTECT(index_tmp); P++; if (isNull(tzone)) { setAttrib(index_tmp, xts_IndexTzoneSymbol, getAttrib(getAttrib(_x,xts_IndexSymbol), xts_IndexTzoneSymbol)); } else { setAttrib(index_tmp, xts_IndexTzoneSymbol, tzone); } copyMostAttrib(getAttrib(_x,xts_IndexSymbol), index_tmp); setAttrib(result, xts_IndexSymbol, index_tmp); UNPROTECT(P); return(result); } //}}} end of mergeXts xts/src/subset.c0000644000176200001440000003433014634167654013353 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ #include #include #include "xts.h" static SEXP xts_ExtractSubset(SEXP x, SEXP result, SEXP indx) //, SEXP call) { /* ExtractSubset is currently copied/inspired by subset.c from GNU-R This is slated to be reimplemented using the previous method in xts to get the correct dimnames */ int i, ii, n, nx, mode; SEXP tmp, tmp2; mode = TYPEOF(x); n = LENGTH(indx); nx = length(x); tmp = result; /*if (x == R_NilValue)*/ if (isNull(x)) return x; for (i = 0; i < n; i++) { ii = INTEGER(indx)[i]; if (ii != NA_INTEGER) ii--; switch (mode) { case LGLSXP: if (0 <= ii && ii < nx && ii != NA_LOGICAL) LOGICAL(result)[i] = LOGICAL(x)[ii]; else LOGICAL(result)[i] = NA_LOGICAL; break; case INTSXP: if (0 <= ii && ii < nx && ii != NA_INTEGER) INTEGER(result)[i] = INTEGER(x)[ii]; else INTEGER(result)[i] = NA_INTEGER; break; case REALSXP: if (0 <= ii && ii < nx && ii != NA_INTEGER) REAL(result)[i] = REAL(x)[ii]; else REAL(result)[i] = NA_REAL; break; case CPLXSXP: if (0 <= ii && ii < nx && ii != NA_INTEGER) { COMPLEX(result)[i] = COMPLEX(x)[ii]; } else { COMPLEX(result)[i].r = NA_REAL; COMPLEX(result)[i].i = NA_REAL; } break; case STRSXP: if (0 <= ii && ii < nx && ii != NA_INTEGER) SET_STRING_ELT(result, i, STRING_ELT(x, ii)); else SET_STRING_ELT(result, i, NA_STRING); break; case VECSXP: case EXPRSXP: if (0 <= ii && ii < nx && ii != NA_INTEGER) SET_VECTOR_ELT(result, i, VECTOR_ELT(x, ii)); else SET_VECTOR_ELT(result, i, R_NilValue); break; case LISTSXP: /* cannot happen: pairlists are coerced to lists */ case LANGSXP: if (0 <= ii && ii < nx && ii != NA_INTEGER) { tmp2 = nthcdr(x, ii); SETCAR(tmp, CAR(tmp2)); SET_TAG(tmp, TAG(tmp2)); } else SETCAR(tmp, R_NilValue); tmp = CDR(tmp); break; case RAWSXP: if (0 <= ii && ii < nx && ii != NA_INTEGER) RAW(result)[i] = RAW(x)[ii]; else RAW(result)[i] = (Rbyte) 0; break; default: error("error in subset\n"); break; } } return result; } SEXP _do_subset_xts (SEXP x, SEXP sr, SEXP sc, SEXP drop) { SEXP result; int i, j, nr, nc, nrs, ncs; int P=0; SEXP Dim = getAttrib(x, R_DimSymbol); nrs = nrows(x);ncs = ncols(x); nr = length(sr); nc = length(sc); SEXP oindex, nindex; oindex = getAttrib(x, xts_IndexSymbol); PROTECT(nindex = allocVector(TYPEOF(oindex), nr)); P++; PROTECT(result = allocVector(TYPEOF(x), nr*nc)); P++; j = 0; double *real_nindex=NULL, *real_oindex, *real_result=NULL, *real_x=NULL; int *int_nindex=NULL, *int_oindex, *int_result=NULL, *int_x=NULL; int *int_sr=NULL, *int_sc=NULL; int_sr = INTEGER(sr); int_sc = INTEGER(sc); copyAttributes(x, result); if(TYPEOF(x)==LGLSXP) { int_x = LOGICAL(x); int_result = LOGICAL(result); if(TYPEOF(nindex)==INTSXP) { int_nindex = INTEGER(nindex); int_oindex = INTEGER(oindex); for(i=0; i nrs || int_sc[j] > ncs) error("'i' or 'j' out of range"); int_nindex[i] = int_oindex[int_sr[i]-1]; if(int_sc[j] == NA_INTEGER) int_result[i+j*nr] = NA_INTEGER; else int_result[i+j*nr] = int_x[int_sr[i]-1 + ((int_sc[j]-1) * nrs)]; } } else if(TYPEOF(nindex)==REALSXP) { real_nindex = REAL(nindex); real_oindex = REAL(oindex); for(i=0; i nrs || int_sc[j] > ncs) error("'i' or 'j' out of range"); real_nindex[i] = real_oindex[int_sr[i]-1]; if(int_sc[j] == NA_INTEGER) int_result[i+j*nr] = NA_INTEGER; else int_result[i+j*nr] = int_x[int_sr[i]-1 + ((int_sc[j]-1) * nrs)]; } } copyAttributes(oindex, nindex); setAttrib(result, xts_IndexSymbol, nindex); for(j=1; j nrs || int_sc[j] > ncs) error("'i' or 'j' out of range"); int_nindex[i] = int_oindex[int_sr[i]-1]; if(int_sc[j] == NA_INTEGER) int_result[i+j*nr] = NA_INTEGER; else int_result[i+j*nr] = int_x[int_sr[i]-1 + ((int_sc[j]-1) * nrs)]; } } else if(TYPEOF(nindex)==REALSXP) { real_nindex = REAL(nindex); real_oindex = REAL(oindex); for(i=0; i nrs || int_sc[j] > ncs) error("'i' or 'j' out of range"); real_nindex[i] = real_oindex[int_sr[i]-1]; if(int_sc[j] == NA_INTEGER) int_result[i+j*nr] = NA_INTEGER; else int_result[i+j*nr] = int_x[int_sr[i]-1 + ((int_sc[j]-1) * nrs)]; } } copyAttributes(oindex, nindex); setAttrib(result, xts_IndexSymbol, nindex); /* loop through remaining columns */ for(j=1; j nrs || int_sc[j] > ncs) error("'i' or 'j' out of range"); int_nindex[i] = int_oindex[int_sr[i]-1]; if(int_sc[j] == NA_INTEGER) real_result[i+j*nr] = NA_REAL; else real_result[i+j*nr] = real_x[int_sr[i]-1 + ((int_sc[j]-1) * nrs)]; } } else if(TYPEOF(nindex)==REALSXP) { real_nindex = REAL(nindex); real_oindex = REAL(oindex); for(i=0; i nrs || int_sc[j] > ncs) error("'i' or 'j' out of range"); real_nindex[i] = real_oindex[int_sr[i]-1]; if(int_sc[j] == NA_INTEGER) real_result[i+j*nr] = NA_REAL; else real_result[i+j*nr] = real_x[int_sr[i]-1 + ((int_sc[j]-1) * nrs)]; } } copyAttributes(oindex, nindex); setAttrib(result, xts_IndexSymbol, nindex); for(j=1; j nrs || int_sc[j] > ncs) error("'i' or 'j' out of range"); int_nindex[i] = int_oindex[int_sr[i]-1]; if(int_sc[j] == NA_INTEGER) { COMPLEX(result)[i+j*nr].r = NA_REAL; COMPLEX(result)[i+j*nr].i = NA_REAL; } else COMPLEX(result)[i+j*nr] = COMPLEX(x)[int_sr[i]-1 + ((int_sc[j]-1) * nrs)]; } } else if(TYPEOF(nindex)==REALSXP) { real_nindex = REAL(nindex); real_oindex = REAL(oindex); for(i=0; i nrs || int_sc[j] > ncs) error("'i' or 'j' out of range"); real_nindex[i] = real_oindex[int_sr[i]-1]; if(int_sc[j] == NA_INTEGER) { COMPLEX(result)[i+j*nr].r = NA_REAL; COMPLEX(result)[i+j*nr].i = NA_REAL; } else COMPLEX(result)[i+j*nr] = COMPLEX(x)[int_sr[i]-1 + ((int_sc[j]-1) * nrs)]; } } copyAttributes(oindex, nindex); setAttrib(result, xts_IndexSymbol, nindex); for(j=1; j nrs || int_sc[j] > ncs) error("'i' or 'j' out of range"); int_nindex[i] = int_oindex[int_sr[i]-1]; if(int_sc[j] == NA_INTEGER) SET_STRING_ELT(result, i+j*nr, NA_STRING); else SET_STRING_ELT(result, i+j*nr, STRING_ELT(x, int_sr[i]-1 + ((int_sc[j]-1) * nrs))); } } else if(TYPEOF(nindex)==REALSXP) { real_nindex = REAL(nindex); real_oindex = REAL(oindex); for(i=0; i nrs || int_sc[j] > ncs) error("'i' or 'j' out of range"); real_nindex[i] = real_oindex[int_sr[i]-1]; if(int_sc[j] == NA_INTEGER) SET_STRING_ELT(result, i+j*nr, NA_STRING); else SET_STRING_ELT(result, i+j*nr, STRING_ELT(x, int_sr[i]-1 + ((int_sc[j]-1) * nrs))); } } copyAttributes(oindex, nindex); setAttrib(result, xts_IndexSymbol, nindex); for(j=1; j nrs || int_sc[j] > ncs) error("'i' or 'j' out of range"); int_nindex[i] = int_oindex[int_sr[i]-1]; if(int_sc[j] == NA_INTEGER) RAW(result)[i+j*nr] = 0; else RAW(result)[i+j*nr] = RAW(x)[int_sr[i]-1 + ((int_sc[j]-1) * nrs)]; } } else if(TYPEOF(nindex)==REALSXP) { real_nindex = REAL(nindex); real_oindex = REAL(oindex); for(i=0; i nrs || int_sc[j] > ncs) error("'i' or 'j' out of range"); real_nindex[i] = real_oindex[int_sr[i]-1]; if(int_sc[j] == NA_INTEGER) RAW(result)[i+j*nr] = 0; else RAW(result)[i+j*nr] = RAW(x)[int_sr[i]-1 + ((int_sc[j]-1) * nrs)]; } } copyAttributes(oindex, nindex); setAttrib(result, xts_IndexSymbol, nindex); for(j=1; j= 0 && nc >= 0) { SEXP dim; PROTECT(dim = allocVector(INTSXP,2));P++; INTEGER(dim)[0] = nr; INTEGER(dim)[1] = nc; setAttrib(result, R_DimSymbol, dim); if (nr >= 0 && nc >= 0) { SEXP dimnames, dimnamesnames, newdimnames; dimnames = getAttrib(x, R_DimNamesSymbol); dimnamesnames = getAttrib(dimnames, R_NamesSymbol); if (!isNull(dimnames)) { PROTECT(newdimnames = allocVector(VECSXP, 2)); if (TYPEOF(dimnames) == VECSXP) { SET_VECTOR_ELT(newdimnames, 0, xts_ExtractSubset(VECTOR_ELT(dimnames, 0), allocVector(STRSXP, nr), sr)); SET_VECTOR_ELT(newdimnames, 1, xts_ExtractSubset(VECTOR_ELT(dimnames, 1), allocVector(STRSXP, nc), sc)); } else { SET_VECTOR_ELT(newdimnames, 0, xts_ExtractSubset(CAR(dimnames), allocVector(STRSXP, nr), sr)); SET_VECTOR_ELT(newdimnames, 1, xts_ExtractSubset(CADR(dimnames), allocVector(STRSXP, nc), sc)); } setAttrib(newdimnames, R_NamesSymbol, dimnamesnames); setAttrib(result, R_DimNamesSymbol, newdimnames); UNPROTECT(1); } } } setAttrib(result, R_ClassSymbol, getAttrib(x, R_ClassSymbol)); if(nc == 1 && LOGICAL(drop)[0]) setAttrib(result, R_DimSymbol, R_NilValue); UNPROTECT(P); return result; } xts/src/binsearch.c0000644000176200001440000001352514634167654014007 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ #include #include #include /* Binary search range to find interval written by Corwin Joy, with * contributions by Joshua Ulrich */ struct keyvec { double *dvec; double dkey; int *ivec; int ikey; }; /* Predicate function definition and functions to determine which of the * two groups contains the value being searched for. Note that they're all * 'static inline' to hopefully help with the compiler optimizations. */ typedef int (*bound_comparer)(const struct keyvec, const int); static inline int cmp_dbl_upper(const struct keyvec kv, const int i) { const double cv = kv.dvec[i]; const double ck = kv.dkey; return cv > ck; } static inline int cmp_dbl_lower(const struct keyvec kv, const int i) { const double cv = kv.dvec[i]; const double ck = kv.dkey; return cv >= ck; } static inline int cmp_int_upper(const struct keyvec kv, const int i) { const int cv = kv.ivec[i]; const int ck = kv.ikey; return cv > ck; } static inline int cmp_int_lower(const struct keyvec kv, const int i) { const int cv = kv.ivec[i]; const int ck = kv.ikey; return cv >= ck; } /* Binary search function */ SEXP binsearch(SEXP key, SEXP vec, SEXP start) { if (!isLogical(start)) { error("start must be specified as true or false"); } if (length(vec) < 1 || length(key) < 1) { return ScalarInteger(NA_INTEGER); } int use_start = LOGICAL(start)[0]; bound_comparer cmp_func = NULL; struct keyvec data; switch (TYPEOF(vec)) { case REALSXP: data.dkey = REAL(key)[0]; data.dvec = REAL(vec); cmp_func = (use_start) ? cmp_dbl_lower : cmp_dbl_upper; if (!R_finite(data.dkey)) { return ScalarInteger(NA_INTEGER); } break; case INTSXP: data.ikey = INTEGER(key)[0]; data.ivec = INTEGER(vec); cmp_func = (use_start) ? cmp_int_lower : cmp_int_upper; if (NA_INTEGER == data.ikey) { return ScalarInteger(NA_INTEGER); } break; default: error("unsupported type"); } int mid; int lo = 0; int hi = length(vec) - 1; while (lo < hi) { mid = lo + (hi - lo) / 2; if (cmp_func(data, mid)) { hi = mid; } else { lo = mid + 1; } } /* 'lo' contains the smallest index where cmp_func() is true, but we need * to handle edge cases where 'lo' is at the max/min end of the vector. */ if (use_start) { /* cmp_func() := vector[index] >= key when start == true, and we need * to return the smallest index subject to vector[index] >= key. */ if (!cmp_func(data, length(vec)-1)) { /* entire vector < key */ return ScalarInteger(NA_INTEGER); } } else { /* cmp_func() := vector[index] > key when start == false, and we need * to return the largest index subject to vector[index] <= key. */ if (cmp_func(data, lo)) { /* previous index value must satisfy vector[index] <= key, unless * current index value is zero. */ lo--; if (lo < 0) { /* entire vector > key */ return ScalarInteger(NA_INTEGER); } } } /* Convert from 0-based index to 1-based index */ lo++; return ScalarInteger(lo); } SEXP fill_window_dups_rev(SEXP _x, SEXP _index) { /* Translate user index (_x) to xts index (_index). '_x' contains the * upper bound of the location of the user index in the xts index. * This is necessary to handle duplicate dates in the xts index. */ int n_x = length(_x); int *x = INTEGER(_x); if (length(_index) < 1) { return allocVector(INTSXP, 0); } PROTECT_INDEX px; SEXP _out; PROTECT_WITH_INDEX(_out = allocVector(INTSXP, length(_index)), &px); int *out = INTEGER(_out); int i, xi, j, k = 0, n_out = length(_out); switch (TYPEOF(_index)) { case REALSXP: { double *index = REAL(_index); /* Loop over locations in _x in reverse order */ for (i = n_x; i > 0; i--) { xi = x[i-1]; j = xi; do { /* Check if we need to lengthen output due to duplicates */ if (k == n_out) { REPROTECT(_out = xlengthgets(_out, k+2*(i+1)), px); out = INTEGER(_out); n_out = length(_out); } out[k++] = j--; } while (j > 0 && index[xi-1] == index[j-1]); } } break; case INTSXP: { int *index = INTEGER(_index); /* Loop over locations in _x in reverse order */ for (i = n_x; i > 0; i--) { xi = x[i-1]; j = xi; do { /* Check if we need to lengthen output due to duplicates */ if (k == n_out) { REPROTECT(_out = xlengthgets(_out, k+2*(i+1)), px); out = INTEGER(_out); n_out = length(_out); } out[k++] = j--; } while (j > 0 && index[xi-1] == index[j-1]); } } break; default: error("unsupported index type"); } /* truncate so length(_out) = k * NB: output is in reverse order! */ REPROTECT(_out = xlengthgets(_out, k), px); UNPROTECT(1); return _out; } xts/src/subset.old.c0000644000176200001440000002171614634166720014125 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ /* Base code borrowed from R's main/src/subset.c to see how to create a function to subset an xts object in it's entirety All modification are by Jeffrey A. Ryan 2008 */ #include #include #include #include "xts.h" // xtsExtractSubset {{{ static SEXP xtsExtractSubset(SEXP x, SEXP result, SEXP indx) //, SEXP call) { int i, ii, n, nx, mode; SEXP tmp, tmp2; mode = TYPEOF(x); n = LENGTH(indx); nx = length(x); tmp = result; if (x == R_NilValue) return x; for (i = 0; i < n; i++) { ii = INTEGER(indx)[i]; if (ii != NA_INTEGER) ii--; switch (mode) { case LGLSXP: if (0 <= ii && ii < nx && ii != NA_LOGICAL) LOGICAL(result)[i] = LOGICAL(x)[ii]; else LOGICAL(result)[i] = NA_LOGICAL; break; case INTSXP: if (0 <= ii && ii < nx && ii != NA_INTEGER) INTEGER(result)[i] = INTEGER(x)[ii]; else INTEGER(result)[i] = NA_INTEGER; break; case REALSXP: if (0 <= ii && ii < nx && ii != NA_INTEGER) REAL(result)[i] = REAL(x)[ii]; else REAL(result)[i] = NA_REAL; break; case CPLXSXP: if (0 <= ii && ii < nx && ii != NA_INTEGER) { COMPLEX(result)[i] = COMPLEX(x)[ii]; } else { COMPLEX(result)[i].r = NA_REAL; COMPLEX(result)[i].i = NA_REAL; } break; case STRSXP: if (0 <= ii && ii < nx && ii != NA_INTEGER) SET_STRING_ELT(result, i, STRING_ELT(x, ii)); else SET_STRING_ELT(result, i, NA_STRING); break; case VECSXP: case EXPRSXP: if (0 <= ii && ii < nx && ii != NA_INTEGER) SET_VECTOR_ELT(result, i, VECTOR_ELT(x, ii)); else SET_VECTOR_ELT(result, i, R_NilValue); break; case LISTSXP: /* cannot happen: pairlists are coerced to lists */ case LANGSXP: if (0 <= ii && ii < nx && ii != NA_INTEGER) { tmp2 = nthcdr(x, ii); SETCAR(tmp, CAR(tmp2)); SET_TAG(tmp, TAG(tmp2)); } else SETCAR(tmp, R_NilValue); tmp = CDR(tmp); break; case RAWSXP: if (0 <= ii && ii < nx && ii != NA_INTEGER) RAW(result)[i] = RAW(x)[ii]; else RAW(result)[i] = (Rbyte) 0; break; default: error("error in subset\n"); // errorcall(call, R_MSG_ob_nonsub, type2char(mode)); break; } } return result; } //}}} SEXP do_subset_xts(SEXP x, SEXP sr, SEXP sc, SEXP drop) //SEXP s, SEXP call, int drop) { SEXP attr, result, dim; int nr, nc, nrs, ncs; int i, j, ii, jj, ij, iijj; int mode; int *int_x=NULL, *int_result=NULL, *int_newindex=NULL, *int_index=NULL; double *real_x=NULL, *real_result=NULL, *real_newindex=NULL, *real_index=NULL; nr = nrows(x); nc = ncols(x); if( length(x)==0 ) return x; dim = getAttrib(x, R_DimSymbol); nrs = LENGTH(sr); ncs = LENGTH(sc); int *int_sr=NULL, *int_sc=NULL; int_sr = INTEGER(sr); int_sc = INTEGER(sc); mode = TYPEOF(x); result = allocVector(mode, nrs*ncs); PROTECT(result); if( mode==INTSXP ) { int_x = INTEGER(x); int_result = INTEGER(result); } else if( mode==REALSXP ) { real_x = REAL(x); real_result = REAL(result); } /* code to handle index of xts object efficiently */ SEXP index, newindex; int indx; index = getAttrib(x, xts_IndexSymbol); PROTECT(index); if(TYPEOF(index) == INTSXP) { newindex = allocVector(INTSXP, LENGTH(sr)); PROTECT(newindex); int_newindex = INTEGER(newindex); int_index = INTEGER(index); for(indx = 0; indx < nrs; indx++) { int_newindex[indx] = int_index[ (int_sr[indx])-1]; } copyAttributes(index, newindex); setAttrib(result, xts_IndexSymbol, newindex); UNPROTECT(1); } if(TYPEOF(index) == REALSXP) { newindex = allocVector(REALSXP, LENGTH(sr)); PROTECT(newindex); real_newindex = REAL(newindex); real_index = REAL(index); for(indx = 0; indx < nrs; indx++) { real_newindex[indx] = real_index[ (int_sr[indx])-1 ]; } copyAttributes(index, newindex); setAttrib(result, xts_IndexSymbol, newindex); UNPROTECT(1); } for (i = 0; i < nrs; i++) { ii = int_sr[i]; if (ii != NA_INTEGER) { if (ii < 1 || ii > nr) error("i is out of range\n"); ii--; } /* Begin column loop */ for (j = 0; j < ncs; j++) { //jj = INTEGER(sc)[j]; jj = int_sc[j]; if (jj != NA_INTEGER) { if (jj < 1 || jj > nc) error("j is out of range\n"); jj--; } ij = i + j * nrs; if (ii == NA_INTEGER || jj == NA_INTEGER) { switch ( mode ) { case REALSXP: real_result[ij] = NA_REAL; break; case LGLSXP: case INTSXP: int_result[ij] = NA_INTEGER; break; case CPLXSXP: COMPLEX(result)[ij].r = NA_REAL; COMPLEX(result)[ij].i = NA_REAL; break; case STRSXP: SET_STRING_ELT(result, ij, NA_STRING); break; case VECSXP: SET_VECTOR_ELT(result, ij, R_NilValue); break; case RAWSXP: RAW(result)[ij] = (Rbyte) 0; break; default: error("xts subscripting not handled for this type"); break; } } else { iijj = ii + jj * nr; switch ( mode ) { case REALSXP: real_result[ij] = real_x[iijj]; break; case LGLSXP: LOGICAL(result)[ij] = LOGICAL(x)[iijj]; break; case INTSXP: int_result[ij] = int_x[iijj]; break; case CPLXSXP: COMPLEX(result)[ij] = COMPLEX(x)[iijj]; break; case STRSXP: SET_STRING_ELT(result, ij, STRING_ELT(x, iijj)); break; case VECSXP: SET_VECTOR_ELT(result, ij, VECTOR_ELT(x, iijj)); break; case RAWSXP: RAW(result)[ij] = RAW(x)[iijj]; break; default: error("matrix subscripting not handled for this type"); break; } } } /* end of column loop */ } /* end of row loop */ if(nrs >= 0 && ncs >= 0 && !isNull(dim)) { PROTECT(attr = allocVector(INTSXP, 2)); INTEGER(attr)[0] = nrs; INTEGER(attr)[1] = ncs; setAttrib(result, R_DimSymbol, attr); UNPROTECT(1); } /* The matrix elements have been transferred. Now we need to */ /* transfer the attributes. Most importantly, we need to subset */ /* the dimnames of the returned value. */ if (nrs >= 0 && ncs >= 0 && !isNull(dim)) { SEXP dimnames, dimnamesnames, newdimnames; dimnames = getAttrib(x, R_DimNamesSymbol); dimnamesnames = getAttrib(dimnames, R_NamesSymbol); if (!isNull(dimnames)) { PROTECT(newdimnames = allocVector(VECSXP, 2)); if (TYPEOF(dimnames) == VECSXP) { SET_VECTOR_ELT(newdimnames, 0, xtsExtractSubset(VECTOR_ELT(dimnames, 0), allocVector(STRSXP, nrs), sr)); SET_VECTOR_ELT(newdimnames, 1, xtsExtractSubset(VECTOR_ELT(dimnames, 1), allocVector(STRSXP, ncs), sc)); } else { SET_VECTOR_ELT(newdimnames, 0, xtsExtractSubset(CAR(dimnames), allocVector(STRSXP, nrs), sr)); SET_VECTOR_ELT(newdimnames, 1, xtsExtractSubset(CADR(dimnames), allocVector(STRSXP, ncs), sc)); } setAttrib(newdimnames, R_NamesSymbol, dimnamesnames); setAttrib(result, R_DimNamesSymbol, newdimnames); UNPROTECT(1); } } copyAttributes(x, result); if(ncs == 1 && LOGICAL(drop)[0]) setAttrib(result, R_DimSymbol, R_NilValue); UNPROTECT(2); return result; } xts/src/toperiod.c0000644000176200001440000002026514634166720013666 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ /* Possible solution to allow for a generalized single function might be to pass in a vector of available 'actions': {0=first, 1=max, 2=min, 3=last, 4=sum} This would lead to OHLC to have: 0,1,2,3 [,4[,3]] The current algorithm is in 3 stages per endpoint interation: Stage 1: Calculate first (0) of each column, this is the Op and set Hi and Lo to this value Stage 2: Cycle through all x[j] where j is ep[i]:ep[i+1] and i is 1:NROW(ep) Keep running min, max, and summation (Lo, Hi, "Volume") Stage 3: Get last value for close. Repeat for next endpoint */ #include #include /*#include */ #include "xts.h" #ifndef MAX #define MAX(a,b) (a > b ? a : b) #endif #ifndef MIN #define MIN(a,b) (a < b ? a : b) #endif SEXP toPeriod(SEXP x, SEXP endpoints, SEXP hasVolume, SEXP whichVolume, SEXP hasAdjusted, SEXP first, SEXP colnames) { SEXP result, ohlc, xindex, newindex, dimnames; int i, j=0, nrx, ncx, ncr, n, P=0; nrx = nrows(x); ncx = ncols(x); n = nrows(endpoints) - 1; ncr = 4; /* OHLC */ int mode = TYPEOF(x); int Hi, Lo, Cl, Vo; if(ncx >= 4) { /* needs OHLC or bust, clearly not the best solution since we can't just skip over columns */ Hi=1; Lo=2; Cl=3; } else { Hi=Lo=Cl=0; } if(INTEGER(hasVolume)[0]) ncr++; /* Volume */ if(INTEGER(hasAdjusted)[0]) ncr++; /* Adjusted (Yahoo) */ /* handle index values in xts */ PROTECT(xindex = getAttrib(x, xts_IndexSymbol)); P++; int index_mode = TYPEOF(xindex); PROTECT(newindex = allocVector(index_mode, n)); P++; PROTECT(result = allocVector(mode, n * ncr )); P++; PROTECT(ohlc = allocVector(mode, 6)); P++; int _FIRST = (INTEGER(first)[0]); int *ohlc_int = NULL, *result_int = NULL, *x_int = NULL; double *ohlc_real = NULL, *result_real = NULL, *x_real = NULL; switch(mode) { case INTSXP: ohlc_int = INTEGER(ohlc); result_int = INTEGER(result); x_int = INTEGER(x); break; case REALSXP: ohlc_real = REAL(ohlc); result_real = REAL(result); x_real = REAL(x); break; default: error("unsupported type"); } int *_endpoints = INTEGER(endpoints); int _hasAdjusted = INTEGER(hasAdjusted)[0]; int _hasVolume = INTEGER(hasVolume)[0]; /* volume column number */ Vo = _hasVolume ? asInteger(whichVolume)-1 : 0; for(i = 0; i < n; i++) { j = _endpoints[i]; if(_FIRST) { switch(index_mode) { case INTSXP: INTEGER(newindex)[i] = INTEGER(xindex)[j]; break; case REALSXP: REAL(newindex)[i] = REAL(xindex)[j]; break; } } /* set the Open, and initialize High, Low and Volume */ switch(mode) { case INTSXP: ohlc_int[0] = x_int[j]; /* Op */ ohlc_int[1] = x_int[j + Hi*nrx]; /* Hi */ ohlc_int[2] = x_int[j + Lo*nrx]; /* Lo */ if(_hasVolume) ohlc_int[4] = (int)0; /* Vo */ break; case REALSXP: ohlc_real[0] = x_real[j]; /* Op */ ohlc_real[1] = x_real[j + Hi*nrx]; /* Hi */ ohlc_real[2] = x_real[j + Lo*nrx]; /* Lo */ if(_hasVolume) ohlc_real[4] = (double)0; /* Vo */ break; } // set the High, Low, and Volume switch(mode) { case INTSXP: for( ; j < _endpoints[i+1]; j++) { ohlc_int[1] = MAX(ohlc_int[1], x_int[j + Hi*nrx]); /* HI */ ohlc_int[2] = MIN(ohlc_int[2], x_int[j + Lo*nrx]); /* LO */ if(_hasVolume) ohlc_int[4] = ohlc_int[4] + x_int[j + Vo*nrx]; /* VO */ } break; case REALSXP: for( ; j < _endpoints[i+1]; j++) { ohlc_real[1] = MAX(ohlc_real[1], x_real[j + Hi*nrx]); /* HI */ ohlc_real[2] = MIN(ohlc_real[2], x_real[j + Lo*nrx]); /* LO */ if(_hasVolume) { ohlc_real[4] = ohlc_real[4] + x_real[j + Vo*nrx]; /* VO */ } } break; } /* set the Close and Adjusted columns */ /* Rprintf("i,j: %i,%i\t",i,j); */ j--; switch(mode) { case INTSXP: ohlc_int[3] = x_int[j + Cl*nrx]; if(_hasAdjusted) ohlc_int[5] = x_int[j + 5*nrx]; break; case REALSXP: ohlc_real[3] = x_real[j + Cl*nrx]; if(_hasAdjusted) ohlc_real[5] = x_real[j + 5*nrx]; break; } if(!_FIRST) { /* index at last position */ switch(index_mode) { case INTSXP: INTEGER(newindex)[i] = INTEGER(xindex)[j]; break; case REALSXP: REAL(newindex)[i] = REAL(xindex)[j]; break; } } /* switch(mode) { case INTSXP: INTEGER(result)[i] = ohlc_int[0]; INTEGER(result)[i+1*n] = ohlc_int[1]; INTEGER(result)[i+2*n] = ohlc_int[2]; INTEGER(result)[i+3*n] = ohlc_int[3]; if(_hasVolume) INTEGER(result)[i+4*n] = ohlc_int[4]; if(_hasAdjusted) INTEGER(result)[i+5*n] = ohlc_int[5]; break; case REALSXP: REAL(result)[i] = REAL(ohlc)[0]; REAL(result)[i+1*n] = REAL(ohlc)[1]; REAL(result)[i+2*n] = REAL(ohlc)[2]; REAL(result)[i+3*n] = REAL(ohlc)[3]; if(_hasVolume) REAL(result)[i+4*n] = REAL(ohlc)[4]; if(_hasAdjusted) REAL(result)[i+5*n] = REAL(ohlc)[5]; break; } */ switch(mode) { case INTSXP: result_int[i] = ohlc_int[0]; result_int[i+1*n] = ohlc_int[1]; result_int[i+2*n] = ohlc_int[2]; result_int[i+3*n] = ohlc_int[3]; if(_hasVolume) result_int[i+4*n] = ohlc_int[4]; if(_hasAdjusted) result_int[i+5*n] = ohlc_int[5]; break; case REALSXP: result_real[i] = ohlc_real[0]; result_real[i+1*n] = ohlc_real[1]; result_real[i+2*n] = ohlc_real[2]; result_real[i+3*n] = ohlc_real[3]; if(_hasVolume) result_real[i+4*n] = ohlc_real[4]; if(_hasAdjusted) result_real[i+5*n] = ohlc_real[5]; break; } /* Rprintf("i,j: %i,%i\n",i,j); */ } SEXP dim; dim = PROTECT(allocVector(INTSXP, 2)); P++; INTEGER(dim)[0] = n; INTEGER(dim)[1] = ncr; setAttrib(result, R_DimSymbol, dim); PROTECT(dimnames = allocVector(VECSXP, 2)); P++; SET_VECTOR_ELT(dimnames, 0, R_NilValue); /* no rownames ever! */ if(!isNull(colnames)) { SET_VECTOR_ELT(dimnames, 1, colnames); } else { SEXP newcolnames; PROTECT(newcolnames = allocVector(STRSXP, ncr));P++; SET_STRING_ELT(newcolnames, 0, mkChar("Open")); SET_STRING_ELT(newcolnames, 1, mkChar("High")); SET_STRING_ELT(newcolnames, 2, mkChar("Low")); SET_STRING_ELT(newcolnames, 3, mkChar("Close")); if(INTEGER(hasVolume)[0]) SET_STRING_ELT(newcolnames, 4, mkChar("Volume")); if(INTEGER(hasAdjusted)[0]) SET_STRING_ELT(newcolnames, 5, mkChar("Adjusted")); SET_VECTOR_ELT(dimnames, 1, newcolnames); } setAttrib(result, R_DimNamesSymbol, dimnames); copyMostAttrib(xindex, newindex); setAttrib(result, xts_IndexSymbol, newindex); copy_xtsAttributes(x, result); copy_xtsCoreAttributes(x, result); UNPROTECT(P); return result; } xts/src/init.c0000644000176200001440000001457414634167654013021 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 - 2013 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich and Dirk Eddelbuettel # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ #include "xts.h" #include #include #include static const R_CallMethodDef callMethods[] = { {"add_class", (DL_FUNC) &add_class, 2}, {"coredata_xts", (DL_FUNC) &coredata_xts, 1}, {"do_xtsAttributes", (DL_FUNC) &do_xtsAttributes, 1}, {"add_xtsCoreAttributes", (DL_FUNC) &add_xtsCoreAttributes, 6}, {"lag_xts", (DL_FUNC) &lag_xts, 3}, {"lagXts", (DL_FUNC) &lagXts, 3}, {"do_is_ordered", (DL_FUNC) &do_is_ordered, 3}, {"isXts", (DL_FUNC) &isXts, 1}, {"tryXts", (DL_FUNC) &tryXts, 1}, {"na_locf", (DL_FUNC) &na_locf, 4}, {"na_omit_xts", (DL_FUNC) &na_omit_xts, 1}, {"do_rbind_xts", (DL_FUNC) &do_rbind_xts, 3}, {"_do_subset_xts", (DL_FUNC) &_do_subset_xts, 4}, {"do_merge_xts", (DL_FUNC) &do_merge_xts, 11}, {"naCheck", (DL_FUNC) &naCheck, 2}, {"make_index_unique", (DL_FUNC) &make_index_unique, 2}, {"make_unique", (DL_FUNC) &make_unique, 2}, {"any_negative", (DL_FUNC) &any_negative, 1}, {"extract_col", (DL_FUNC) &extract_col, 5}, {"binsearch", (DL_FUNC) &binsearch, 3}, {"fill_window_dups_rev", (DL_FUNC) &fill_window_dups_rev, 2}, {"non_duplicates", (DL_FUNC) &non_duplicates, 2}, {"roll_min", (DL_FUNC) &roll_min, 2}, {"roll_max", (DL_FUNC) &roll_max, 2}, {"roll_sum", (DL_FUNC) &roll_sum, 2}, {"roll_cov", (DL_FUNC) &roll_cov, 4}, {"toPeriod", (DL_FUNC) &toPeriod, 7}, {"xts_period_apply", (DL_FUNC) &xts_period_apply, 4}, {"xts_period_min", (DL_FUNC) &xts_period_min, 2}, {"xts_period_max", (DL_FUNC) &xts_period_max, 2}, {"xts_period_sum", (DL_FUNC) &xts_period_sum, 2}, {"xts_period_prod", (DL_FUNC) &xts_period_prod, 2}, {"endpoints", (DL_FUNC) &endpoints, 4}, {"dimnames_zoo", (DL_FUNC) &dimnames_zoo, 1}, {"xts_set_dimnames", (DL_FUNC) &xts_set_dimnames, 2}, {"do_startofyear", (DL_FUNC) &do_startofyear, 3}, {NULL, NULL, 0} }; static const R_ExternalMethodDef externalMethods[] = { {"number_of_cols", (DL_FUNC) &number_of_cols, -1}, {"mergeXts", (DL_FUNC) &mergeXts, -1}, {"rbindXts", (DL_FUNC) &rbindXts, -1}, {NULL, NULL, 0} }; /* define globals */ SEXP xts_IndexSymbol; SEXP xts_ClassSymbol; SEXP xts_IndexTformatSymbol; SEXP xts_IndexTclassSymbol; SEXP xts_IndexTzoneSymbol; /* define imports from zoo */ SEXP (*zoo_lag)(SEXP,SEXP,SEXP); SEXP (*zoo_coredata)(SEXP,SEXP); /* * Taken from R/src/main/names.c * "Set up a set of globals so that a symbol table search can be * avoided when matching something like dim or dimnames." * * This also prevents flags from rchk's maacheck (Multiple-Allocating- * Arguments) tool for calls like: * setAttrib(result, xts_IndexSymbol, getAttrib(x, xts_IndexSymbol)); */ static void SymbolShortcuts(void) { xts_IndexSymbol = install("index"); xts_ClassSymbol = install(".CLASS"); xts_IndexTformatSymbol = install("tformat"); xts_IndexTclassSymbol = install("tclass"); xts_IndexTzoneSymbol = install("tzone"); } void R_init_xts(DllInfo *info) { SymbolShortcuts(); R_registerRoutines(info, NULL, callMethods, NULL, externalMethods); R_useDynamicSymbols(info, FALSE); R_forceSymbols(info, TRUE); /* used by external packages linking to internal xts code from C */ R_RegisterCCallable("xts","do_is_ordered",(DL_FUNC) &do_is_ordered); R_RegisterCCallable("xts","coredata_xts", (DL_FUNC) &coredata_xts); R_RegisterCCallable("xts","isXts", (DL_FUNC) &isXts); R_RegisterCCallable("xts","tryXts", (DL_FUNC) &tryXts); R_RegisterCCallable("xts","do_rbind_xts", (DL_FUNC) &do_rbind_xts); R_RegisterCCallable("xts","naCheck", (DL_FUNC) &naCheck); R_RegisterCCallable("xts","lagXts", (DL_FUNC) &lagXts); R_RegisterCCallable("xts","make_index_unique", (DL_FUNC) &make_index_unique); R_RegisterCCallable("xts","make_unique", (DL_FUNC) &make_unique); R_RegisterCCallable("xts","endpoints", (DL_FUNC) &endpoints); R_RegisterCCallable("xts","do_merge_xts", (DL_FUNC) &do_merge_xts); R_RegisterCCallable("xts","na_omit_xts", (DL_FUNC) &na_omit_xts); R_RegisterCCallable("xts","na_locf", (DL_FUNC) &na_locf); R_RegisterCCallable("xts","xts_period_min", (DL_FUNC) &xts_period_min); R_RegisterCCallable("xts","xts_period_max", (DL_FUNC) &xts_period_max); R_RegisterCCallable("xts","xts_period_sum", (DL_FUNC) &xts_period_sum); R_RegisterCCallable("xts","xts_period_prod", (DL_FUNC) &xts_period_prod); R_RegisterCCallable("xts","xts_set_dimnames", (DL_FUNC) &xts_set_dimnames); /* used by xts (functions moved from xts to zoo) */ zoo_lag = (SEXP(*)(SEXP,SEXP,SEXP)) R_GetCCallable("zoo","zoo_lag"); zoo_coredata = (SEXP(*)(SEXP,SEXP)) R_GetCCallable("zoo","zoo_coredata"); } xts/src/attr.c0000644000176200001440000001233414636572747013025 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ #include #include #include #include "xts.h" SEXP do_xtsAttributes(SEXP x) { SEXP a, values, names; int i=0, P=0; a = ATTRIB(x); if(length(a) <= 0) return R_NilValue; PROTECT(a); P++; /* all attributes */ PROTECT(values = allocVector(VECSXP, length(a))); P++; PROTECT(names = allocVector(STRSXP, length(a))); P++; /* CAR gets the first element of the dotted pair list CDR gets the rest of the dotted pair list TAG gets the symbol/name of the first element of dotted pair list */ for( /* a=ATTRIB(a) */; a != R_NilValue; a = CDR(a) ) { if(TAG(a) != xts_IndexSymbol && TAG(a) != xts_ClassSymbol && TAG(a) != R_ClassSymbol && TAG(a) != R_DimSymbol && TAG(a) != R_DimNamesSymbol && TAG(a) != R_NamesSymbol) { SET_VECTOR_ELT(values, i, CAR(a)); SET_STRING_ELT(names, i, PRINTNAME(TAG(a))); i++; } } if(i == 0) { UNPROTECT(P); return R_NilValue; } /* truncate list back to i-size */ PROTECT(values = lengthgets(values, i)); P++; PROTECT(names = lengthgets(names, i)); P++; setAttrib(values, R_NamesSymbol, names); UNPROTECT(P); return values; } SEXP do_xtsCoreAttributes(SEXP x) { SEXP a, values, names; int i=0, P=0; a = ATTRIB(x); if(length(a) <= 0) return R_NilValue; PROTECT(a); P++; /* all attributes */ PROTECT(values = allocVector(VECSXP, length(a))); P++; PROTECT(names = allocVector(STRSXP, length(a))); P++; /* CAR gets the first element of the dotted pair list CDR gets the rest of the dotted pair list TAG gets the symbol/name of the first element of dotted pair list */ for( /* a=ATTRIB(a) */; a != R_NilValue; a = CDR(a) ) { if(TAG(a) == xts_ClassSymbol || TAG(a) == R_ClassSymbol) { SET_VECTOR_ELT(values, i, CAR(a)); SET_STRING_ELT(names, i, PRINTNAME(TAG(a))); i++; } } if(i == 0) { UNPROTECT(P); return R_NilValue; } /* truncate list back to i-size */ PROTECT(values = lengthgets(values, i)); P++; PROTECT(names = lengthgets(names, i)); P++; setAttrib(values, R_NamesSymbol, names); UNPROTECT(P); return values; } void copyAttributes(SEXP x, SEXP y) { /* similar to copyMostAttr except that we add index to the list of attributes to exclude */ SEXP attr; int P=0; attr = ATTRIB(x); /* this returns a LISTSXP */ if(length(attr) > 0 || y != R_NilValue) { PROTECT(attr); P++; for( ; attr != R_NilValue; attr = CDR(attr) ) { if( (TAG(attr) != xts_IndexSymbol) && (TAG(attr) != R_DimSymbol) && (TAG(attr) != R_DimNamesSymbol) && (TAG(attr) != R_NamesSymbol) ) { setAttrib(y, TAG(attr), CAR(attr)); } } UNPROTECT(P); } } void copy_xtsAttributes(SEXP x, SEXP y) { SEXP attr; int P=0; attr = PROTECT(do_xtsAttributes(x)); P++; attr = PROTECT(coerceVector(attr, LISTSXP)); P++; if(length(attr) > 0 || y != R_NilValue) { for( ; attr != R_NilValue; attr = CDR(attr) ) { setAttrib(y, TAG(attr), CAR(attr)); } } UNPROTECT(P); } void copy_xtsCoreAttributes(SEXP x, SEXP y) { SEXP attr; int P=0; attr = PROTECT(do_xtsCoreAttributes(x)); P++; attr = PROTECT(coerceVector(attr, LISTSXP)); P++; if(length(attr) > 0 || y != R_NilValue) { for( ; attr != R_NilValue; attr = CDR(attr) ) { setAttrib(y, TAG(attr), CAR(attr)); } } UNPROTECT(P); } SEXP ca (SEXP x, SEXP y) { /* an example of internal copying of user-defined xts attributes this will be used inside of do_xts_subset and do_xts_merge This particular usage is bad, as y is modified without copying resulting in all y and reference to y within R envir being altered the 'y' should only be the new value that is to be returned */ copy_xtsAttributes(x,y); return R_NilValue; } SEXP add_xtsCoreAttributes(SEXP _x, SEXP _index, SEXP _tzone, SEXP _tclass, SEXP _class, SEXP _tformat) { int P=0; if(MAYBE_SHARED(_index)) { PROTECT(_index = duplicate(_index)); P++; } /* add tzone and tclass to index */ setAttrib(_index, xts_IndexTclassSymbol, _tclass); setAttrib(_index, xts_IndexTzoneSymbol, _tzone); setAttrib(_index, xts_IndexTformatSymbol, _tformat); if(MAYBE_SHARED(_x)) { PROTECT(_x = duplicate(_x)); P++; //_x = duplicate(_x); } setAttrib(_x, xts_IndexSymbol, _index); /* index */ setAttrib(_x, R_ClassSymbol, _class); /* class */ UNPROTECT(P); return(_x); } xts/src/Makevars0000644000176200001440000000004114636572747013373 0ustar liggesusersPKG_CPPFLAGS = -I../inst/include xts/src/startofyear.c0000644000176200001440000000465714634167654014422 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ #include #include SEXP do_startofyear (SEXP _from, SEXP _to, SEXP _origin) { // do_startofyear {{{ int i, P = 0; int from = INTEGER(_from)[0]; int to = INTEGER(_to)[0]; int origin = INTEGER(_origin)[0]; // _fromto is a vector of length (from:to) SEXP _fromto = PROTECT(allocVector(INTSXP, to-from+1)); P++; int *fromto = INTEGER(_fromto); int nyear[1] = { (to - from + 1) }; int leap[nyear[0]]; // generate sequence of dates to work with fromto[0] = from; for(i=1; i < nyear[0]; i++) { fromto[i] = fromto[i-1] + 1; } for(i = 0; i < nyear[0]; i++) { leap[ i ] = ( (fromto[ i ] % 4 == 0 && fromto[ i ] % 100 != 0) || fromto[ i ] % 400 == 0) ? 1 : 0; } for(i=0; i < nyear[0]; i++) { if(leap[i] == 1) { // a leapyear (366 days) fromto[i] = 366; } else { // a non-leapyear (365 days) fromto[i] = 365; } } /* fromto now has proper number of days per year now calculate the cumulative sum back from origin (negative) and from origin (positive) */ int days_before_origin = origin - from; //int days_after_origin = nyear[0] - days_before_origin - 1; //why is this here? int tmp=0; for(i = days_before_origin; i < nyear[0]; i++) { tmp += fromto[i]; fromto[i] = tmp; } tmp = 0; for(i = days_before_origin-1; i >= 0; i--) { tmp -= fromto[i]; fromto[i] = tmp; } /* now insert a 0 at the origin, by going backwards */ for(i = nyear[0] - 1; i > days_before_origin; i--) fromto[ i ] = fromto[ i-1 ]; fromto[ days_before_origin ] = 0; UNPROTECT(P); return _fromto; } //}}} xts/src/period_quantile.c0000644000176200001440000000440114634167654015226 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan (FORTRAN implementation) # Copyright (C) 2018 Joshua M. Ulrich (C implementation) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ #include SEXP xts_period_max(SEXP _data, SEXP _index) { if (ncols(_data) > 1) { error("single column data only"); } if (!isInteger(_index)) { error("index must be integer"); } if (!isReal(_data)) { error("data must be double"); } int i, j; int n = length(_index) - 1; SEXP _result = PROTECT(allocVector(REALSXP, n)); double *result = REAL(_result); int *index = INTEGER(_index); double *data = REAL(_data); int k = 0; for (i = 0; i < n; i++) { int idx0 = index[i]; int idx1 = index[i + 1]; double max = data[idx0]; for (j = idx0+1; j < idx1; j++) { if (data[j] > max) { max = data[j]; } } result[k++] = max; } UNPROTECT(1); return _result; } SEXP xts_period_min(SEXP _data, SEXP _index) { if (ncols(_data) > 1) { error("single column data only"); } if (!isInteger(_index)) { error("index must be integer"); } if (!isReal(_data)) { error("data must be double"); } int i, j; int n = length(_index) - 1; SEXP _result = PROTECT(allocVector(REALSXP, n)); double *result = REAL(_result); int *index = INTEGER(_index); double *data = REAL(_data); int k = 0; for (i = 0; i < n; i++) { int idx0 = index[i]; int idx1 = index[i + 1]; double min = data[idx0]; for (j = idx0+1; j < idx1; j++) { if (data[j] < min) { min = data[j]; } } result[k++] = min; } UNPROTECT(1); return _result; } xts/src/extract_col.c0000644000176200001440000001370514634167654014360 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ #include #include #include "xts.h" /* provide fast memcpy extraction by column major orientation for matrix objects. Should be as fast as extracting list elements or data.frame columns in R. ( update: it is much faster actually -jar ) One key difference is that we are also reattaching the index attribute to allow for the object to remain a zoo/xts object */ SEXP extract_col (SEXP x, SEXP j, SEXP drop, SEXP first_, SEXP last_) { SEXP result, index, new_index; int nrs, nrsx, i, ii, jj, first, last; /* ensure 'j' is integer with length > 0 */ if(length(j) == 0) { error("'j' cannot have zero length"); } if(asInteger(j) == 0) { error("'j' cannot equal 0"); } nrsx = nrows(x); first = asInteger(first_)-1; last = asInteger(last_)-1; /* nrs = offset_end - offset_start - 1; */ nrs = last - first + 1; PROTECT(result = allocVector(TYPEOF(x), nrs * length(j))); switch(TYPEOF(x)) { case REALSXP: for(i=0; i. */ #include #include #include #include "xts.h" /* Internal use only * called by: firstNonNA, naCheck, na_locf */ static int firstNonNACol (SEXP x, int col) { int i=0, nr; int *int_x=NULL; double *real_x=NULL; nr = nrows(x); if(col > ncols(x)-1 || col < 0L) error("column out of range"); switch(TYPEOF(x)) { case LGLSXP: int_x = LOGICAL(x); for(i=0+col*nr; i<(nr+col*nr); i++) { if(int_x[i]!=NA_LOGICAL) { break; } } break; case INTSXP: int_x = INTEGER(x); for(i=0+col*nr; i<(nr+col*nr); i++) { if(int_x[i]!=NA_INTEGER) { break; } } break; case REALSXP: real_x = REAL(x); for(i=0+col*nr; i<(nr+col*nr); i++) { if(!ISNA(real_x[i]) && !ISNAN(real_x[i])) { break; } } break; case STRSXP: for(i=0+col*nr; i<(nr+col*nr); i++) { if(STRING_ELT(x, i)!=NA_STRING) { break; } } break; default: error("unsupported type"); break; } return(i); } /* Should be internal use only (static), but is in xts.h */ int firstNonNA (SEXP x) { return firstNonNACol(x, 0); } SEXP naCheck (SEXP x, SEXP check) { /* Check for non-leading NA values, throw error if found */ SEXP first; int _first; _first = firstNonNA(x); PROTECT(first = allocVector(INTSXP, 1)); INTEGER(first)[0] = _first; if(LOGICAL(check)[0]) { /* check for NAs in rest of data */ int i, nr; int *int_x = NULL; double *real_x = NULL; nr = nrows(x); switch(TYPEOF(x)) { case LGLSXP: int_x = LOGICAL(x); for(i=_first; i (int)maxgap) { /* check that we don't have excessive trailing gap */ for(ii = i-1; ii > i-gap-1; ii--) { int_result[ii] = NA_LOGICAL; } } } } else { /* nr-2 is first position to fill fromLast=TRUE */ for(j=0; j < nc; j++) { int_result[nr-1+j*nr] = int_x[nr-1+j*nr]; gap = 0; for(i=nr-2 + j*nr; i>=0+j*nr; i--) { int_result[i] = int_x[i]; if(int_result[i] == NA_LOGICAL && gap < maxgap) { int_result[i] = int_result[i+1]; gap++; } } } } break; case INTSXP: int_x = INTEGER(x); int_result = INTEGER(result); if(!LOGICAL(fromLast)[0]) { for(j=0; j < nc; j++) { /* copy leading NAs */ _first = firstNonNACol(x, j); if (_first == nr + j*nr) _first--; for(i=0+j*nr; i < (_first+1); i++) { int_result[i] = int_x[i]; } /* result[_first] now has first value fromLast=FALSE */ gap = 0; for(i=_first+1; i gap) int_result[i] = int_result[i-1]; gap++; } else { if((int)gap > (int)maxgap) { for(ii = i-1; ii > i-gap-1; ii--) { int_result[ii] = NA_INTEGER; } } gap=0; } } if((int)gap > (int)maxgap) { /* check that we don't have excessive trailing gap */ for(ii = i-1; ii > i-gap-1; ii--) { int_result[ii] = NA_INTEGER; } } } } else { /* nr-2 is first position to fill fromLast=TRUE */ for(j=0; j < nc; j++) { int_result[nr-1+j*nr] = int_x[nr-1+j*nr]; gap = 0; for(i=nr-2 + j*nr; i>=0+j*nr; i--) { int_result[i] = int_x[i]; if(int_result[i] == NA_INTEGER) { if(limit > gap) int_result[i] = int_result[i+1]; gap++; } else { if((int)gap > (int)maxgap) { for(ii = i+1; ii < i+gap+1; ii++) { int_result[ii] = NA_INTEGER; } } gap=0; } } if((int)gap > (int)maxgap) { /* check that we don't have leading trailing gap */ for(ii = i+1; ii < i+gap+1; ii++) { int_result[ii] = NA_INTEGER; } } } } break; case REALSXP: real_x = REAL(x); real_result = REAL(result); if(!LOGICAL(fromLast)[0]) { /* fromLast=FALSE */ for(j=0; j < nc; j++) { /* copy leading NAs */ _first = firstNonNACol(x, j); if (_first == nr + j*nr) _first--; for(i=0+j*nr; i < (_first+1); i++) { real_result[i] = real_x[i]; } /* result[_first] now has first value fromLast=FALSE */ gap = 0; for(i=_first+1; i gap) real_result[i] = real_result[i-1]; gap++; } else { if((int)gap > (int)maxgap) { for(ii = i-1; ii > i-gap-1; ii--) { real_result[ii] = NA_REAL; } } gap=0; } } if((int)gap > (int)maxgap) { /* check that we don't have excessive trailing gap */ for(ii = i-1; ii > i-gap-1; ii--) { real_result[ii] = NA_REAL; } } } } else { /* fromLast=TRUE */ for(j=0; j < nc; j++) { real_result[nr-1+j*nr] = real_x[nr-1+j*nr]; gap = 0; for(i=nr-2 + j*nr; i>=0+j*nr; i--) { real_result[i] = real_x[i]; if(ISNA(real_result[i]) || ISNAN(real_result[i])) { if(limit > gap) real_result[i] = real_result[i+1]; gap++; } else { if((int)gap > (int)maxgap) { for(ii = i+1; ii < i+gap+1; ii++) { real_result[ii] = NA_REAL; } } gap=0; } } if((int)gap > (int)maxgap) { /* check that we don't have leading trailing gap */ for(ii = i+1; ii < i+gap+1; ii++) { real_result[ii] = NA_REAL; } } } } break; case STRSXP: if(!LOGICAL(fromLast)[0]) { /* fromLast=FALSE */ for(j=0; j < nc; j++) { /* copy leading NAs */ _first = firstNonNACol(x, j); if (_first == nr + j*nr) _first--; for(i=0+j*nr; i < (_first+1); i++) { SET_STRING_ELT(result, i, STRING_ELT(x, i)); } /* result[_first] now has first value fromLast=FALSE */ gap = 0; for(i=_first+1; i gap) SET_STRING_ELT(result, i, STRING_ELT(result, i-1)); gap++; } else { if((int)gap > (int)maxgap) { for(ii = i-1; ii > i-gap-1; ii--) { SET_STRING_ELT(result, ii, NA_STRING); } } gap=0; } } if((int)gap > (int)maxgap) { /* check that we don't have excessive trailing gap */ for(ii = i-1; ii > i-gap-1; ii--) { SET_STRING_ELT(result, ii, NA_STRING); } } } } else { /* fromLast=TRUE */ for(j=0; j < nc; j++) { SET_STRING_ELT(result, nr-1+j*nr, STRING_ELT(x, nr-1+j*nr)); gap = 0; for(i=nr-2 + j*nr; i>=0+j*nr; i--) { SET_STRING_ELT(result, i, STRING_ELT(x, i)); if(STRING_ELT(result, i) == NA_STRING) { if(limit > gap) SET_STRING_ELT(result, i, STRING_ELT(result, i+1)); gap++; } else { if((int)gap > (int)maxgap) { for(ii = i+1; ii < i+gap+1; ii++) { SET_STRING_ELT(result, ii, NA_STRING); } } gap=0; } } if((int)gap > (int)maxgap) { /* check that we don't have leading trailing gap */ for(ii = i+1; ii < i+gap+1; ii++) { SET_STRING_ELT(result, ii, NA_STRING); } } } } break; default: error("unsupported type"); break; } if(Rf_asInteger(isXts(x))) { setAttrib(result, R_DimSymbol, getAttrib(x, R_DimSymbol)); setAttrib(result, R_DimNamesSymbol, getAttrib(x, R_DimNamesSymbol)); setAttrib(result, xts_IndexSymbol, getAttrib(x, xts_IndexSymbol)); copy_xtsCoreAttributes(x, result); copy_xtsAttributes(x, result); } UNPROTECT(P); return(result); } SEXP na_omit_xts (SEXP x) { SEXP na_index, not_na_index, col_index, result; int i, j, ij, nr, nc; int not_NA, NA; nr = nrows(x); nc = ncols(x); not_NA = nr; int *int_x=NULL, *int_na_index=NULL, *int_not_na_index=NULL; double *real_x=NULL; switch(TYPEOF(x)) { case LGLSXP: for(i=0; i. */ #include SEXP xts_period_prod(SEXP _data, SEXP _index) { if (ncols(_data) > 1) { error("single column data only"); } if (!isInteger(_index)) { error("index must be integer"); } if (!isReal(_data)) { error("data must be double"); } int i, j; int n = length(_index) - 1; SEXP _result = PROTECT(allocVector(REALSXP, n)); double *result = REAL(_result); int *index = INTEGER(_index); double *data = REAL(_data); int k = 0; for (i = 0; i < n; i++) { int idx0 = index[i]; int idx1 = index[i + 1]; double prod = data[idx0]; for (j = idx0+1; j < idx1; j++) { prod *= data[j]; } result[k++] = prod; } UNPROTECT(1); return _result; } SEXP xts_period_sum(SEXP _data, SEXP _index) { if (ncols(_data) > 1) { error("single column data only"); } if (!isInteger(_index)) { error("index must be integer"); } if (!isReal(_data)) { error("data must be double"); } int i, j; int n = length(_index) - 1; SEXP _result = PROTECT(allocVector(REALSXP, n)); double *result = REAL(_result); int *index = INTEGER(_index); double *data = REAL(_data); int k = 0; for (i = 0; i < n; i++) { int idx0 = index[i]; int idx1 = index[i + 1]; double sum = data[idx0]; for (j = idx0+1; j < idx1; j++) { sum += data[j]; } result[k++] = sum; } UNPROTECT(1); return _result; } xts/src/add_class.c0000644000176200001440000000175314634167023013754 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ #include #include #include SEXP add_class (SEXP x, SEXP class) { if(MAYBE_SHARED(x)) x = duplicate(x); setAttrib(x, R_ClassSymbol, class); return(x); } xts/src/totalcols.c0000644000176200001440000000304114636572747014052 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ #include #include #include #include "xts.h" int xts_ncols (SEXP _x) { int ncols_x = 0; // use dims if possible if (isNull(getAttrib(_x, R_DimSymbol))) { // no dims, so we want: // * ncols_x == 0 for zero-length vectors, and // * ncols_x == 1 for anything else that doesn't have dims ncols_x = LENGTH(_x) > 0; } else { // use dims ncols_x = INTEGER(getAttrib(_x, R_DimSymbol))[1]; } return ncols_x; } SEXP number_of_cols (SEXP args) { int i = 0; args = CDR(args); // calling function name SEXP tcols = PROTECT(allocVector(INTSXP, length(args))); for(;args != R_NilValue; i++, args = CDR(args)) { INTEGER(tcols)[i] = xts_ncols(CAR(args)); } UNPROTECT(1); return tcols; } xts/src/period_apply.c0000644000176200001440000000477314634167654014545 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan (FORTRAN implementation) # Copyright (C) 2018 Joshua M. Ulrich (C implementation) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ #include #include "xts.h" SEXP xts_period_apply(SEXP _data, SEXP _index, SEXP _function, SEXP _env) { int i; R_xlen_t n = xlength(_index); SEXP _result = PROTECT(allocVector(VECSXP, n)); SEXP _j = PROTECT(allocVector(INTSXP, ncols(_data))); SEXP _drop = PROTECT(ScalarLogical(0)); for (i = 0; i < ncols(_data); i++) INTEGER(_j)[i] = i + 1; SEXP _idx0 = PROTECT(ScalarInteger(0)); SEXP _idx1 = PROTECT(ScalarInteger(0)); int *idx0 = INTEGER(_idx0); int *idx1 = INTEGER(_idx1); /* reprotect the subset object */ SEXP _xsubset; PROTECT_INDEX px; PROTECT_WITH_INDEX(_xsubset = R_NilValue, &px); /* subset object name */ SEXP _subsym = install("_.*crazy*._.*name*._"); defineVar(_subsym, _xsubset, _env); /* function call on subset */ SEXP _subcall = PROTECT(lang3(_function, _subsym, R_DotsSymbol)); int N = n - 1; switch(TYPEOF(_index)) { case REALSXP: ; double *d_index = REAL(_index); for (i = 0; i < N; i++) { idx0[0] = d_index[i] + 1; idx1[0] = d_index[i + 1]; REPROTECT(_xsubset = extract_col(_data, _j, _drop, _idx0, _idx1), px); defineVar(_subsym, _xsubset, _env); SET_VECTOR_ELT(_result, i, eval(_subcall, _env)); } break; case INTSXP: ; int *i_index = INTEGER(_index); for (i = 0; i < N; i++) { idx0[0] = i_index[i] + 1; idx1[0] = i_index[i + 1]; REPROTECT(_xsubset = extract_col(_data, _j, _drop, _idx0, _idx1), px); defineVar(_subsym, _xsubset, _env); SET_VECTOR_ELT(_result, i, eval(_subcall, _env)); } break; default: error("unsupported index type"); } UNPROTECT(7); return _result; } xts/src/runSum.c0000644000176200001440000001071614634167654013341 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ /***********************************************************************/ /* xts, copyright (C) Jeffrey A. Ryan, 2008 */ // // experimental code to provide rollapply functionality to standard // functions. Essentially a .Call port of Josh's run*** functions // from TTR. Though it should be obvious these are a lot more complex. // // runSum, runMin, runMax, runMedian, runMean, runSD // /***********************************************************************/ #include #include #include "xts.h" /* SEXP do_runsum (SEXP x, SEXP n, SEXP result) { } SEXP do_run (SEXP x, SEXP n, (*void)FUN) { SEXP result; int P=0; int i, nrs; int *int_n=NULL; if(TYPEOF(n) != INTSXP) { // assure that 'n' is an integer PROTECT(n = coerceVector(n, INTSXP)); P++; } int_n = INTEGER(n); // get the first element (everything from R is a vector) int *int_result=NULL, *int_x=NULL; int int_sum = 0; double *real_result=NULL, *real_x=NULL; double real_sum = 0.0; PROTECT(result = allocVector(TYPEOF(x), length(x))); P++; int _firstNonNA = firstNonNA(x); } */ SEXP runSum (SEXP x, SEXP n) { SEXP result; int P=0; int i, nrs; int *int_n=NULL; if(TYPEOF(n) != INTSXP) { // assure that 'n' is an integer PROTECT(n = coerceVector(n, INTSXP)); P++; } int_n = INTEGER(n); // get the first element (everything from R is a vector) int *int_result=NULL, *int_x=NULL; int int_sum = 0; double *real_result=NULL, *real_x=NULL; double real_sum = 0.0; PROTECT(result = allocVector(TYPEOF(x), length(x))); P++; int _firstNonNA = firstNonNA(x); switch(TYPEOF(x)) { /* still need to implement other types, and checking // The branch by type allows for fewer type checks/branching // within the algorithm, providing a _much_ faster mechanism // to calculate the sum // // This part of the code should probably be a function // call to a function pointer passed in to the top-level // call... maybe??? // This should make it easier to extend the framework // and _more_ importantly allow for user-level C // functions (via R) to be used ad hoc */ case REALSXP: real_result = REAL(result); real_x = REAL(x); int_result = int_x = NULL; for(i = 0; i < (*int_n)+_firstNonNA; i++) { real_result[i] = NA_REAL; if(i >= _firstNonNA) real_sum = real_sum + real_x[i]; } real_result[ (*int_n) + _firstNonNA - 1 ] = real_sum; nrs = nrows(x); for(i = (*int_n)+_firstNonNA; i < nrs; i++) { if(ISNA(real_x[i]) || ISNAN(real_x[i])) error("Series contains non-leading NAs"); real_result[i] = real_result[i-1] + real_x[i] - real_x[i-(*int_n)]; } break; case INTSXP: int_result = INTEGER(result); int_x = INTEGER(x); real_result = real_x = NULL; for(i = 0; i < (*int_n)+_firstNonNA; i++) { // (*int_n) is faster that INTEGER(n)[1], a constant would be equal int_result[i] = NA_INTEGER; if(i >= _firstNonNA) int_sum = int_sum + int_x[i]; } int_result[ (*int_n) + _firstNonNA -1 ] = int_sum; nrs = nrows(x); for(i = (*int_n)+_firstNonNA; i < nrs; i++) { if(int_x[i]==NA_INTEGER) error("Series contains non-leading NAs"); int_result[i] = int_result[i-1] + int_x[i] - int_x[i-(*int_n)]; } break; /* case STRSXP: fail! case LGLSXP: convert to int?? case CPLXSXP: */ } setAttrib(result, R_DimSymbol, getAttrib(x, R_DimSymbol)); setAttrib(result, R_ClassSymbol, getAttrib(x, R_ClassSymbol)); setAttrib(result, xts_IndexSymbol, getAttrib(x, xts_IndexSymbol)); UNPROTECT(P); return result; } xts/src/dimnames.c0000644000176200001440000000243414634167654013643 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2010 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ #include #include SEXP dimnames_zoo (SEXP x) { return(getAttrib(x, R_DimNamesSymbol)); } SEXP xts_set_dimnames (SEXP x, SEXP value) { if (R_NilValue == value) { setAttrib(x, R_DimNamesSymbol, R_NilValue); } else { if (TYPEOF(value) != VECSXP || length(value) != 2) { error("invalid 'dimnames' given for xts"); } /* xts objects never have row names */ SET_VECTOR_ELT(value, 0, R_NilValue); setAttrib(x, R_DimNamesSymbol, value); } return x; } xts/src/xts.c0000644000176200001440000000326714636561324012663 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ #include "xts.h" // //SEXP xts_new (SEXP _data, SEXP _index, SEXP _tclass, SEXP _tzone, SEXP _tformat) //{ // PROTECT(result = allocVector(TYPEOF(x), 0)); p++; // PROTECT(index = allocVector(TYPEOF(xindex), 0)); p++; // setAttrib(index, xts_IndexTzoneSymbol, getAttrib(xindex, xts_IndexTzoneSymbol)); // setAttrib(index, xts_IndexTclassSymbol, getAttrib(xindex, xts_IndexTclassSymbol)); // setAttrib(index, xts_IndexTformatSymbol, getAttrib(xindex, xts_IndexTformatSymbol)); // setAttrib(result, xts_IndexSymbol, index); // // if (LOGICAL(retclass)[0]) { // setAttrib(result, R_ClassSymbol, getAttrib(x, R_ClassSymbol)); // } // setAttrib(result, xts_ClassSymbol, getAttrib(x, xts_ClassSymbol)); // //} // //SEXP xts_set_typeof(SEXP _x, SEXPTYPE _typeof) //{ // SEXP _result = PROTECT(allocVector(_typeof, xlength(_x))); // xts_set_index(_result, xts_get_index(_x)); // //} xts/src/coredata.c0000644000176200001440000000535014634166720013621 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ #include #include #include "xts.h" SEXP coredata (SEXP x, SEXP copyAttr) { /* copyAttr is a LGLSXP flag to indicate whether all attributes are to be left intact. This provides compatability with xts, by stripping all attributes if desired, without the overhead or adding then removing */ SEXP result; int i, j, ncs, nrs; int P=0; PROTECT(result = allocVector(TYPEOF(x), length(x))); P++; switch( TYPEOF(x)) { case REALSXP: memcpy(REAL(result), REAL(x), length(result) * sizeof(double)); break; case INTSXP: memcpy(INTEGER(result), INTEGER(x), length(result) * sizeof(int)); break; case LGLSXP: memcpy(LOGICAL(result), LOGICAL(x), length(result) * sizeof(int)); break; case CPLXSXP: memcpy(COMPLEX(result), COMPLEX(x), length(result) * sizeof(Rcomplex)); break; case STRSXP: ncs = ncols(x); nrs = nrows(x); for(j=0; j< ncs; j++) for(i=0; i< nrs; i++) SET_STRING_ELT(result, i+j*nrs, STRING_ELT(x, i+j*nrs)); break; case RAWSXP: memcpy(RAW(result), RAW(x), length(result) * sizeof(unsigned char)); break; default: error("currently unsupported data type"); break; } if( !isNull(getAttrib(x, R_DimSymbol))) { setAttrib(result, R_DimSymbol, getAttrib(x, R_DimSymbol)); if( !isNull(getAttrib(x, R_DimNamesSymbol)) ) { setAttrib(result, R_DimNamesSymbol, getAttrib(x,R_DimNamesSymbol)); } } else { setAttrib(result, R_NamesSymbol, getAttrib(x, R_NamesSymbol)); } if( asLogical(copyAttr)) { copyMostAttrib(x,result); setAttrib(result, R_ClassSymbol, getAttrib(x, install("oclass"))); } setAttrib(result, xts_IndexSymbol, R_NilValue); setAttrib(result, install("oclass"), R_NilValue); setAttrib(result, install("frequency"), R_NilValue); UNPROTECT(P); return result; } SEXP coredata_xts(SEXP x) { return zoo_coredata(x, ScalarLogical(0)); } xts/src/tryXts.c0000644000176200001440000000263314703317772013357 0ustar liggesusers/* # xts: eXtensible time-series # # Copyright (C) 2008 Jeffrey A. Ryan jeff.a.ryan @ gmail.com # # Contributions from Joshua M. Ulrich # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ #include #include #include "xts.h" SEXP tryXts (SEXP x) { if( !Rf_asInteger(isXts(x)) ) { int P = 0; SEXP expr, result, env, str_xts; PROTECT(str_xts = mkString("xts")); P++; PROTECT(env = R_FindNamespace(str_xts)); P++; PROTECT(expr = lang2(install("try.xts"), x)); P++; PROTECT(result = eval(expr, env)); P++; if( !Rf_asInteger(isXts(result)) ) { UNPROTECT(P); error("rbind.xts requires xtsible data"); } UNPROTECT(P); return result; } return x; } /* SEXP try_xts (SEXP x) { SEXP y; PROTECT(y = tryXts(x)); UNPROTECT(1); return y; } */ xts/NAMESPACE0000644000176200001440000001356714654242576012342 0ustar liggesusers# load symbol table useDynLib(xts, .registration = TRUE, .fixes = "C_") # non-base package imports importFrom(stats, lag, time, sd, median, na.omit, na.action, na.pass, start, end, window, setNames, ts, as.ts, frequency, tsp, 'tsp<-') importFrom(methods, hasArg) importFrom(grDevices, xy.coords) importFrom(graphics, abline, clip, legend, lines, par, plot, plot.new, plot.window, polygon, segments, text) importFrom(utils, str, tail) # xts exports export(.parseISO8601) export(firstof, lastof) export(is.timeBased, timeBased, timeBasedRange, timeBasedSeq) export(.indexsec, .indexmin, .indexhour, .indexday, .indexDate, .indexmon, .indexmday, .indexwday, .indexyday, .indexisdst, .indexyear, .indexweek) export(isOrdered) export(.subset.xts) export(.subset_xts) # user visible core xts functions export(xts, .xts) export(as.xts) export(is.xts) export(endpoints) export(align.time) export(shift.time) export(adj.time) export(make.index.unique) export(make.time.unique) export(is.time.unique) export(is.index.unique) export(dimnames.xts) export('dimnames<-.xts') export(xcoredata) export('xcoredata<-') export(.index) export('.index<-') export(xtsible) export(as.environment.xts) export(use.xts, try.xts) export(Reclass, use.reclass) export(reclass) export(CLASS) export('CLASS<-') export(indexFormat) export('indexFormat<-') export(tformat) export('tformat<-') export(indexClass) export('indexClass<-') export(tclass) export('tclass<-') export(indexTZ) export('indexTZ<-') export(tzone) export('tzone<-') export(convertIndex) export(nseconds, nminutes, nhours, ndays, nweeks, nmonths, nquarters, nyears) export(to_period) # testing export(to.period, to.minutes, to.minutes3, to.minutes5, to.minutes10, to.minutes15, to.minutes30, to.hourly, to.daily, to.weekly, to.monthly, to.quarterly, to.yearly) export(xtsAttributes) export('xtsAttributes<-') export(periodicity) export(period.apply, period.max, period.min, period.sum, period.prod) export(first, last) export(apply.daily, apply.weekly, apply.monthly, apply.quarterly, apply.yearly) export(rbind.xts, cbind.xts, c.xts) export(split.xts) export(axTicksByTime) export(plot.xts) export(addLegend) export(addEventLines) export(addSeries) export(addPanel) export(addPolygon) S3method(plot,xts) S3method(lines,xts) S3method(points,xts) S3method(print, replot_xts) S3method(plot, replot_xts) S3method(str, replot_xts) export(lag.xts) export(diff.xts) export(merge.xts) S3method(all.equal, xts) S3method(split, xts) S3method(lag,xts) S3method(diff,xts) S3method(first,default) S3method(last,default) S3method(first,xts) S3method(last,xts) S3method(print,periodicity) S3method(align.time, xts) S3method(align.time, POSIXct) S3method(align.time, POSIXlt) S3method(shift.time, xts) S3method(make.index.unique, xts) S3method(make.index.unique, numeric) S3method(make.index.unique, POSIXct) S3method(is.time.unique, xts) S3method(is.time.unique, zoo) # xts methods importFrom(zoo,coredata) importFrom(zoo, index) importFrom(zoo,'index<-') importFrom(zoo,'time<-') importFrom(zoo, na.locf) importFrom(zoo, as.zoo) importFrom(zoo, rollapply) importFrom(zoo, na.approx) importFrom(zoo, na.fill) importFrom(zoo, na.fill0) importFrom(zoo, as.yearmon) importFrom(zoo, as.yearqtr) importFrom(zoo, is.regular) importFrom(zoo, zoo) importFrom(zoo, MATCH) S3method(coredata,xts) S3method(xcoredata,default) S3method('xcoredata<-',default) S3method(as.xts,xts) S3method('[',xts) S3method('[<-',xts) S3method(str,xts) S3method(start, xts) S3method(end, xts) S3method(na.omit,xts) S3method(na.locf,xts) S3method(na.fill,xts) S3method(print,xts) S3method(print,CLASS) S3method('CLASS<-',xts) S3method(window,xts) S3method(dimnames, xts) S3method('dimnames<-', xts) S3method(tclass, default) S3method('tclass<-', default) S3method(tclass,xts) S3method('tclass<-',xts) S3method(tformat,default) S3method(tformat,xts) S3method('tformat<-',xts) S3method(tzone, default) S3method('tzone<-', default) S3method(tzone,xts) S3method('tzone<-',xts) S3method('index',xts) S3method('index<-',xts) S3method('time<-',xts) S3method('xtsAttributes<-',xts) S3method(merge,xts) S3method(rbind,xts) S3method(cbind,xts) S3method(c,xts) S3method(Ops,xts) S3method(as.numeric,xts) S3method(as.xts,numeric) S3method(as.double,xts) S3method(as.xts,double) S3method(as.integer,xts) S3method(as.xts,integer) S3method(as.complex,xts) S3method(as.xts,complex) S3method(as.logical,xts) S3method(as.xts,logical) S3method(cumsum, xts) S3method(cumprod, xts) S3method(cummin, xts) S3method(cummax, xts) S3method(rollapply, xts) # list specific methods S3method(as.list,xts) # ts specific methods S3method(as.xts, ts) S3method(as.ts, xts) # zoo specific methods S3method(as.xts,zoo) if (getRversion() >= "3.6.0" && utils::packageVersion("zoo") < "1.8.5") { # xts:::as.zoo.xts was copied to zoo:::as.zoo.xts in zoo 1.8-5 S3method(zoo::as.zoo, xts) } # data.frame specific methods S3method(as.xts,data.frame) S3method(as.data.frame, xts) # matrix specific methods S3method(as.xts,matrix) S3method(as.matrix,xts) # environment specific methods S3method(as.environment,xts) # timeSeries (package:timeSeries) specific methods if (getRversion() >= "3.6.0") { S3method(timeSeries::as.timeSeries, xts) } S3method(as.xts,timeSeries) # irts (package:tseries) specific methods S3method(as.xts,irts) # Date specific methods S3method(as.xts,Date) # POSIX specific methods S3method(as.xts,POSIXt) # yearmon/yearqtr specific methods S3method(as.xts,yearmon) S3method(as.xts,yearqtr) # timeDate specific methods S3method(as.xts,timeDate) ## currently unexported functions that _may_ be exported at some point xts/NEWS.md0000644000176200001440000013477114702260001012173 0ustar liggesusers# xts 0.14.x (202x-xx-xx) * `plot.xts()` now renders all panels when 'x' has more than 8 columns and `multi.panel = TRUE`. Columns 9 and later didn't render because the default of `plot.xts()` is 'col = 1:8'. Thanks to Ethan Smith for the report and patch. ([#423](https://github.com/joshuaulrich/xts/issues/423)) ([#424](https://github.com/joshuaulrich/xts/issues/424)) * `plot.xts()` no longer errors when 'ylim' is constant and negative. Thanks to Ethan Smith for the report. ([#422](https://github.com/joshuaulrich/xts/issues/422)) * Do not use `SET_TYPEOF()` in C because it is not part of the public R API. * `merge.xts()` no longer converts 'x' or 'y' from double to integer in the C code when they are not used in the result. This avoids an unnecessary and confusing warning. Thanks to Jeff Ryan for the report. # xts 0.14.0 (2024-06-05) * `addEventLines()` and `addLegend()` now draw on multiple panels when `on` is a vector. Thanks to Ethan Smith for the report. ([#420](https://github.com/joshuaulrich/xts/issues/420)) * Replace `SET_TYPEOF()` in merge.c because it will error when it tries to convert a REAL to an INTEGER. Thanks to Kurt Hornik for the report! ([#419](https://github.com/joshuaulrich/xts/issues/419)) * Fix crash when 'j' is not an integer and in [0, 1) (e.g. `j = 0.1`). Also throw a warning when 'j' is not an integer. ([#413](https://github.com/joshuaulrich/xts/issues/413)) ([#415](https://github.com/joshuaulrich/xts/issues/415)) * Fix plot header when `layout()` is used to draw multiple plots on a single device. Thanks to Dirk Eddelbuettel for the report and testing! ([#412](https://github.com/joshuaulrich/xts/issues/412)) * Fix plot legend location when the y-axis is log scale. ([#407](https://github.com/joshuaulrich/xts/issues/407)) # xts 0.13.2 (2024-01-21) * Print a message when `period.apply()` is called with `FUN = mean` because it calculates the mean for each column, not all the data in the subset like it does for all other functions. The message says to use `FUN = colMeans` for current behavior and `FUN = function(x) mean(x)` to calculate the mean for all the data. This information is also included in the help files. The option `xts.message.period.apply.mean = FALSE` suppresses the message. ([#124](https://github.com/joshuaulrich/xts/issues/124)) * Fix error when `print.xts()` is called 'quote' or 'right' arguments. ([#401](https://github.com/joshuaulrich/xts/issues/401)) * Fix `addPolygon()` so it renders when `observation.based = TRUE`. ([#403](https://github.com/joshuaulrich/xts/issues/403)) * Print trailing zeros for index value with fractional seconds, so every index value has the same number of characters. ([#404](https://github.com/joshuaulrich/xts/issues/404)) * Add ability to log scale the y-axis in `plot.xts()`. ([#103](https://github.com/joshuaulrich/xts/issues/103)) * Actually change the underlying index values when 'tclass' is changed from a class with a timezone (e.g. POSIXct) to one without a timezone (e.g. Date). Add a warning when this happens, with a global option to always suppress the warning. ([#311](https://github.com/joshuaulrich/xts/issues/311)). * Significantly refactor the internals of `plot.xts()`. ([#408](https://github.com/joshuaulrich/xts/issues/408)) # xts 0.13.1 (2023-04-16) * Ignore attribute order in `all.equal()`. Attribute order shouldn't matter. That can be checked with `identical()`. * Only call `tzone()` and `tclass()` once in `check.TZ()`. Calling these functions multiple times throws multiple warnings for xts objects created before the tclass and tzone were attached to the index instead of the xts object. ([#306](https://github.com/joshuaulrich/xts/issues/306)) * Add instructions to update old objects. Old xts objects do not have tclass and tzone attributes on the index. Add a function to update the object attributes and add a note to the warning to show how to use it. ([#306](https://github.com/joshuaulrich/xts/issues/306)) * Return 'POSIXct' if object has no 'tclass'. An empty string is not a valid 'tclass', so it can cause an error. * Add notes on `plot.xts()` nomenclature and structure. Also add ASCII art to illustrate definitions and layout. ([#103](https://github.com/joshuaulrich/xts/issues/103)) * Remove 'tis' support. The implementation was not even a bare minimum, and it's not clear it even worked correctly. ([#398](https://github.com/joshuaulrich/xts/issues/398)) * Register missing S3 methods and update signatures. With R-devel (83995-ish), `R CMD check` notes these S3 methods are not registered. It also notes that the signatures for `as.POSIXct.tis()` and `str.replot_xts()` do not match the respective generics. It also thinks `time.frequency()` is a S3 method because `time()` is a generic. The function isn't exported, so renaming won't break any external code. Thanks to Kurt Hornik for the report. ([#398](https://github.com/joshuaulrich/xts/issues/398)) * Format each column individually before printing. The top/bottom rows could have a different number of decimal places and there are often multiple variying spaces between columns. For example: close volume ma bsi 2022-01-03 09:31:00 476.470 803961.000 NA 54191.000 2022-01-03 09:32:00 476.700 179476.000 NA 53444.791 2022-01-03 09:33:00 476.540 197919.000 NA -16334.994 ... 2023-03-16 14:52:00 394.6000 46728.0000 392.8636 28319.4691 2023-03-16 14:53:00 394.6500 64648.0000 392.8755 15137.6857 2023-03-16 14:54:00 394.6500 69900.0000 392.8873 -1167.9368 There are 4 spaces between the index and the 'close' column, 2 between 'close' and 'volume', 4 between 'volume' and 'ma', and 2 between 'ma' and 'bsi'. There should be a consistent number of spaces between the columns. Most other classes of objects print with 1 space between the columns. The top rows have 3 decimals and the bottom rows have 4. These should also be the same. ([#321](https://github.com/joshuaulrich/xts/issues/321)) * Only convert printed index values to character. Converting the entire index to character is time-consuming for xts objects with many observations. It can take more than a second to print an xts object with 1mm observations. * Make column names based on number of columns. The original code was a lot more complicated because it tried to account for truncating the number of printed columns. That functionality was removed because of how complicated it was. So now we can simply create printed column names from the number of columns. ([#395](https://github.com/joshuaulrich/xts/issues/395)) * Fix `xts()` for zero-row data.frame. The `xts()` constructor would create an object with a list for coredata when 'x' is a data.frame with no rows. It needs to convert 'x' to a matrix and throw an error if 'x' is a list. ([#394](https://github.com/joshuaulrich/xts/issues/394)) * Reduce instances when `dplyr::lag()` warning is shown. The warning was shown whenever it detected dplyr is installed, even if the user wasn't actively using dplyr. That caused an excessive amount of noise when other packages attached xts (e.g. quantmod). Thanks to Duncan Murdoch for the report and suggested fix! ([#393](https://github.com/joshuaulrich/xts/issues/393)) * Keep colname when only one non-time-based column. The subset `x[, -which.col]` would return a vector when the data frame has a time-based column and only one additional column. Do not drop dimensions, so 'x' will still be a data.frame in this case. ([#391](https://github.com/joshuaulrich/xts/issues/391)) * Treat NA the same as NULL for start or end values. NULL represents an undefined index value. NA represents an unknown or missing index value. xts does not allow NA as index values. Subsetting an xts or zoo object by NA returns a zero-length object. So a NA (unknown) index value is essentially the same as an undefined index value. ([#345](https://github.com/joshuaulrich/xts/issues/345), [#383](https://github.com/joshuaulrich/xts/pull/383)) * Warn and remove NA when `periodicity()` called on date-time with NA. Otherwise the uninformative error below will be thrown. ([#289](https://github.com/joshuaulrich/xts/issues/289)) Error in try.xts(x, error = "'x' needs to be timeBased or xtsible") : 'x' needs to be timeBased or xtsible * Account for TZ when making names for `split.xts()`. `as.yearmon.POSIXct()` always sets `tz = "GMT"` when calling `as.POSIXlt()`, regardless of the xts' index tzone. That can cause the `as.yearmon()` results to be different days for GMT and the index's timezone. Use `format.POSIXct()` for "months" because it checks for a 'tzone' attribute before converting to POSIXlt and calling `format.POSIXlt()`. The conversion to POSIXlt is important because it checks and uses the 'tzone' attribute before considering the 'tz' argument. So it effectively ignores the `tz = "GMT"` setting in `as.yearmon()`. This is also the reason for calling `as.POSIXlt()` before calling `as.yearqtr()`. ([#392](https://github.com/joshuaulrich/xts/issues/392)) # xts 0.13.0 (2023-02-21) ## New Features * Added a xts method for `na.fill()` to significantly increase performance when 'fill' is a scalar. ([#259](https://github.com/joshuaulrich/xts/issues/259)) * `as.xts()` will look for a time-based column in a data.frame if it cannot create an index from the row names. ([#381](https://github.com/joshuaulrich/xts/issues/381)) * Change `print()` xts method to only show the first and last 'show.rows' rows if number of rows is > 'max.rows'. ([#321](https://github.com/joshuaulrich/xts/issues/321)) * Made `str()` output more descriptive for xts objects. It now differentiates between xts objects that are empty, zero-width, or zero-length, and defines each type of object. It also adds column names to the output. ([#168](https://github.com/joshuaulrich/xts/issues/168), [#378](https://github.com/joshuaulrich/xts/issues/378)) * Add startup warning that `dplyr::lag()` breaks method dispatch, which means calls to `lag(my_xts)` won't work any more. * Added open-ended time of day subsetting ranges. This allows users to subset by time of day from the start/end of the day without providing the start/end times (00:00:00.000/23:59:59.999). For example: x["/T1800"] # between the start of the day and 5pm x["T0500/"] # between 5am and the end of the day Thanks to Chris Katsulis for the suggestion! ([#243](https://github.com/joshuaulrich/xts/issues/243)) * Updated `to.period()` to accept custom 'endpoints' via the 'period' argument. Now you can aggregate on something other than the times that 'endpoints()' supports. Thanks to Ethan B. Smith for the suggestion! ([#302](https://github.com/joshuaulrich/xts/issues/302)) ## Fixes * Fixed typo and expand `period.apply()` documentation. ([#205](https://github.com/joshuaulrich/xts/issues/205)) The original description has: * "the data from INDEX[k] to INDEX[k+1]" But that's not consistent with the code. It should be: * "the data from INDEX[k]+1 to INDEX[k+1]" * Calls to `merge.xts()` on zero-width objects now match `merge.zoo()`. Previously, `merge.xts()` would return empty xts objects if called on two or more zero-width xts objects. `merge.zoo()` would return a zero-width object with the correct index. ([#227](https://github.com/joshuaulrich/xts/issues/227), [#379](https://github.com/joshuaulrich/xts/issues/379)) * Fixed `Ops.xts()` so it always returned an object with the same class as the first (left-hand side) argument. It previously returned an xts object even if the first argument was a subclass of xts. ([#49](https://github.com/joshuaulrich/xts/issues/49)) ## Other * Migrated unit tests from RUnit to tinytest. Thanks Mark van der Loo! * Updated the `endpoints()` documentation to make it clearer that the result is based on the UNIX epoch (midnight 1970, UTC). Thanks to GitHub user Eluvias for the suggestion! ([#299](https://github.com/joshuaulrich/xts/issues/299)) * Fixed `reclass()` to ensure it always adds index attributes from the 'match.to' argument. It was not copying `tclass`, `tzone`, or `tformat` from 'match.to' to the result object. ([#43](https://github.com/joshuaulrich/xts/issues/43)) * Removed an unnecessary check in `na.locf()` (which is not user-facing). Thanks to GitHub user @cgiachalis for the suggestion! ([#307](https://github.com/joshuaulrich/xts/issues/307)) * Updated C entry points so they're not able to accidentally be found via dynamic lookup (i.e. `.Call("foo", ...)`). This makes each call to the C code a few microseconds faster, which is nice. ([#260](https://github.com/joshuaulrich/xts/issues/260)) * Made `merge.xts()` results consistent with `merge.zoo()` for zero-length xts objects with columns. The result of `merge.xts()` did not include the columns of any objects that had one or more columns, but zero rows. A join should include all the columns of the joined objects, regardless of the number of rows in the object. This is consistent with `merge.zoo()`. Thanks to Ethan B. Smith for the report and testing! ([#222](https://github.com/joshuaulrich/xts/issues/222)) # xts 0.12.2 (2022-10-16) * `Ops.xts()` no longer changes column names (via `make.names()`) when the two objects do not have identical indexes. This makes it consistent with `Ops.zoo()`. ([#114](https://github.com/joshuaulrich/xts/issues/114)) * Subsetting a zero-length xts object now returns an object with the same storage type as the input. It previously always returned a 'logical' xts object. ([#376](https://github.com/joshuaulrich/xts/issues/376)) * `tclass()` and `tzone()` now return the correct values for zero-length xts objects, instead of the defaults in the `.xts()` constructor. Thanks to Andre Mikulec for the report and suggested patch! ([#255](https://github.com/joshuaulrich/xts/issues/255)) * `first()` and `last()` now return a zero-length xts object when `n = 0`. They previously returned the entire object. This is consistent with the default `head()` and `tail()` functions, and data.table's `first()` and `last()` functions. Thanks to Ethan B. Smith for the report and patch! ([#350](https://github.com/joshuaulrich/xts/issues/350)) * `plot.xts()` now has a `yaxis.ticks` argument to control the number of y-axis grid lines, instead of always drawing 5 grid lines. Thanks to Fredrik Wartenberg for the feature request and patch! ([#374](https://github.com/joshuaulrich/xts/issues/374)) * Subsetting a zero-width xts now returns an object with the same class, tclass, tzone, and xtsAttributes as the input. Thanks to @shikokuchuo for the report! ([#359](https://github.com/joshuaulrich/xts/issues/359)) * `endpoints()` now always returns last observation. Thanks to GitHub user Eluvias for the report. ([#300](https://github.com/joshuaulrich/xts/issues/300)) * Ensure `endpoints()` errors for every 'on' value when `k < 1`. It was not throwing an error for `k < 1` for `on` of "years", "quarters", or "months". Thanks to Eluvias for the report. ([#301](https://github.com/joshuaulrich/xts/issues/301)) * Fix `window()` for yearmon and yearqtr indexes. In xts < 0.11-0, `window.zoo()` was dispatched when `window()` was called on a xts object because there was no `window.xts()` method. `window.zoo()` supports additional types of values for the `start` argument, and possibly other features. So this fixes a breaking change in xts >= 0.11-0. Thanks to @annaymj for the report. ([#312](https://github.com/joshuaulrich/xts/issues/312)) * Clarify whether `axTicksByTime()` returns index timestamps or locations (e.g. 1, 2, 3). Thanks to @ggrothendieck for the suggestion and feedback. ([#354](https://github.com/joshuaulrich/xts/issues/354)) * Fix merge on complex types when 'fill' is needed. `merge()` would throw an error because it treated 'fill' as double instead of complex. Thanks to @ggrothendieck for the report. ([#346](https://github.com/joshuaulrich/xts/issues/346)) * Add a message to tell the user how to disable 'xts_check_TZ' warning. Thanks to Jerzy Pawlowski for the nudge. ([#113](https://github.com/joshuaulrich/xts/issues/113)) * Update `rbind()` to handle xts objects without dim attribute. `rbind()` threw an obscure error if one of the xts objects does not have a dim attribute. We can handle this case even though all xts objects should always have a dim attribute. ([#361](https://github.com/joshuaulrich/xts/issues/361)) * `split.xts()` now always return a named list, which makes it consistent with `split.zoo()`. Thanks to Gabor Grothendieck for the report. ([#357](https://github.com/joshuaulrich/xts/issues/357)) * xts objects with a zero-length POSIXct index now return a zero-length POSIXct vector instead of a zero-length integer vector. Thanks to Jasper Schelfhout for the report and PR! ([#363](https://github.com/joshuaulrich/xts/issues/363), [#364](https://github.com/joshuaulrich/xts/pull/364)) * Add suffixes to output of `merge.xts()`. The suffixes are consistent with `merge.default()` and not `merge.zoo()`, because `merge.zoo()` automatically uses "." as a separator between column names, but the default method doesn't. Thanks to Pierre Lamarche for the nudge. Better late than never? ([#38](https://github.com/joshuaulrich/xts/issues/38), [#371](https://github.com/joshuaulrich/xts/issues/371)) ## Changes to plotting functionality * You can now omit the data time range from the upper-right portion of a plot by setting `main.timespan = FALSE`. ([#247](https://github.com/joshuaulrich/xts/issues/247)) * Fix `addEventLines()` when plotted objects have a 'yearmon' index. The ISO-8601 range string was not created correctly. Thanks to @paessens for the report. ([#353](https://github.com/joshuaulrich/xts/issues/353)) * Make 'ylim' robust against numerical precision issues by replacing `==` with `all.equal()`. Thanks to @bollard for the report, PR, and a ton of help debugging intermediate solutions! ([#368](https://github.com/joshuaulrich/xts/issues/368)) * Series added to a panel now extend the panel's y-axis. Previously the y-axis limits were based on the first series' values and not updated when new series were added. So values of the new series did not appear on the plot if they were outside of the original series' min/max. Thanks to Vitalie Spinu for the report and help debugging and testing! ([#360](https://github.com/joshuaulrich/xts/issues/360)) * All series added to any panel of a plot now update the x-axis of all panels. So the entire plot's x-axis will include every series' time index values within the original plot's time range. This behavior is consistent with `chart_Series()`. Thanks to Vitalie Spinu for the report and help debugging and testing! ([#360](https://github.com/joshuaulrich/xts/issues/360), [#216](https://github.com/joshuaulrich/xts/issues/216)) * All y-values are now plotted for series that have duplicate index values, but different data values. Thanks to Vitalie Spinu for the report and help debugging and testing! ([#360](https://github.com/joshuaulrich/xts/issues/360)) * Adding a series can now extend the x-axis before/after the plot's existing time index range, so all of the new series' time index values are included in the plot. This is FALSE by default to maintain backward compatibility. Thanks to Vitalie Spinu for the report and help debugging and testing! ([#360](https://github.com/joshuaulrich/xts/issues/360)) # xts 0.12.1 (2020-09-09) * Various function could change the tclass of xts objects. This would happen in calls to reclass(), period.apply(), and for logical operations on POSIXct indexes. Thanks to Tom Andrews for the report and testing, and to Panagiotis Cheilaris for contributing test cases. ([#322](https://github.com/joshuaulrich/xts/issues/322), [#323](https://github.com/joshuaulrich/xts/pull/323)) * plot.xts() now supports y-axis labels via 'ylab'. Thanks to Jasen Mackie for the suggestion and PR. ([#333](https://github.com/joshuaulrich/xts/issues/333), [#334](https://github.com/joshuaulrich/xts/pull/334)) * The API header has been updated to fix the signatures of do_merge_xts() and is_xts, which did not return a SEXP as required of functions callable by .Call(). Thanks to Tomas Kalibera for the report ([#317](https://github.com/joshuaulrich/xts/issues/317)), and Dirk Eddelbuettel for the PR ([#337](https://github.com/joshuaulrich/xts/pull/337)). This is a breaking change, but is required to avoid the potential for a segfault. * Michael Chirico added an internal isUTC() function to recognize many UTC- equivalent time zones. ([#319](https://github.com/joshuaulrich/xts/issues/319)) * first() now operates correctly on non-xts objects when 'n = -1'. Previously it would always return the last two values. Thanks to GitHub user vxg20 for the report. ([#325](https://github.com/joshuaulrich/xts/issues/325)) * The .xts() constructor would create an xts object with row names if 'x' had row names. This shouldn't happen, because xts objects do not have or support row names. ([#298](https://github.com/joshuaulrich/xts/issues/298)) * Claymore Marshall added many examples of time-of-day subsetting to ?subset.xts. He also fixed a bug in time-of-day subsetting where subsetting by hour only returned wrong results. ([#304](https://github.com/joshuaulrich/xts/issues/304), [#326](https://github.com/joshuaulrich/xts/issues/326), [#328](https://github.com/joshuaulrich/xts/pull/328)) # xts 0.12-0 (2020-01-19) * All the index-attributes have been removed from the xts object and are now only attached to the index itself. We took great care to maintain backward compatibility, and throw warnings when deprecated functions are called and when index-attributes are found on the xts object. But there still may be some breaking changes lurking in edge cases. ([#245](https://github.com/joshuaulrich/xts/issues/245)) * @SamoPP found one edge case where an error was thrown when index() was called on an xts object with an index that had no tclass attribute. ([#297](https://github.com/joshuaulrich/xts/issues/297)) * ...which led Joshua to find that the index setting functions did not always copy index attributes. ([#305](https://github.com/joshuaulrich/xts/issues/305)) * Several binary operations (e.g. +, -, !=, <, etc.) on variations of uncommon xts objects with other xts, matrix, or vector objects, could result in malformed xts objects. Some examples of the types of uncommon xts objects: no dim attribute, zero-width, zero-length. ([#295](https://github.com/joshuaulrich/xts/issues/295)) * Calling as.matrix() on an xts object without a dim attribute no longer throws an error. ([#294](https://github.com/joshuaulrich/xts/issues/294)) * merge.xts() now honors check.names = FALSE. ([#293](https://github.com/joshuaulrich/xts/issues/293)) * The possible values for major.ticks, minor.ticks, and grid.ticks.on in the Details section of ?plot.xts have been corrected. Thanks to Harvey Smith (@harvey131) for the report and patch. ([#291](https://github.com/joshuaulrich/xts/issues/291)) * as.zoo.xts() is now only registered for zoo versions prior to 1.8-5. Methods to convert an object to another class should reside in the package that implements the target class. Thanks to Kurt Hornik for the report. ([#287](https://github.com/joshuaulrich/xts/issues/287)) * .parseISO8601() no longer has a potential length-1 logical error. Thanks to Kurt Hornik for the report. ([#280](https://github.com/joshuaulrich/xts/issues/280)) * endpoints() now honors k > 0 when on = "quarters". Thanks to @alkment for the report. ([#279](https://github.com/joshuaulrich/xts/issues/279)) * Performance for the period.XYZ() functions (sum, prod, min, max) is much faster. Thanks to Chris Katsulis for the report, and Harvey Smith (@harvey131) for several examples. ([#278](https://github.com/joshuaulrich/xts/issues/278)) * merge.xts() now creates shorter column names when passed unnamed objects. This is now consistent with zoo. ([#248](https://github.com/joshuaulrich/xts/issues/248)) * Time-of-day performance is ~200x faster, thanks to StackOverflow user3226167 ([#193](https://github.com/joshuaulrich/xts/issues/193)). # xts 0.11-2 (2018-11-05) * The to.period() family of functions now use the index timezone when converting intraday index values to daily values (or lower frequency). Thanks to Garrett See and Gabor Grothendieck for the reports. ([#53](https://github.com/joshuaulrich/xts/issues/53), [#277](https://github.com/joshuaulrich/xts/issues/277)) * Make column names for merge() results with unnamed objects shorter and more like zoo. This also makes na.fill() much faster. NOTE: This may break existing code for integer unnamed objects. ([#248](https://github.com/joshuaulrich/xts/issues/248) [#259](https://github.com/joshuaulrich/xts/issues/259)) * Fix subset when 'index(x)' and 'i' contain duplicates. Thanks to Stack Overflow user [scs](https://stackoverflow.com/users/4024268/scs) for the report, and Philippe Verspeelt for debugging. ([#275](https://github.com/joshuaulrich/xts/issues/275)) * Fix if-statement in xts constructor that may use a logical with length > 1. Thanks to @HughParsonage for the report and PR. ([#270](https://github.com/joshuaulrich/xts/issues/270), [#272](https://github.com/joshuaulrich/xts/pull/272)) * Register shift.time.xts() method. Thanks to Philippe Verspeelt for the report and PR. ([#268](https://github.com/joshuaulrich/xts/issues/268), [#273](https://github.com/joshuaulrich/xts/pull/273)) * Conditionally register S3 methods for as.timeSeries.xts() and as.fts.xts() when their respective packages are available (as requested by CRAN). Note that this means these two functions are no longer exported. This may break some existing code that calls the methods directly, though 'best practice' is to let method dispatch determine which method to invoke. # xts 0.11-1 (2018-09-12) * Fix regression in .xts() that caused 'tclass' argument/attribute to be incorrectly set to POSIXct regardless of user-provided value. Thanks to @Eluvias for the report and Tom Andrews for the PR. ([#249](https://github.com/joshuaulrich/xts/issues/249), [#250](https://github.com/joshuaulrich/xts/pull/250)) * Fix performance regression when xts object is subset by a date-time vector. Thanks to Tom Andrews for the report, and the PR to fix the bug in my patch. ([#251](https://github.com/joshuaulrich/xts/issues/251), [#263](https://github.com/joshuaulrich/xts/issues/263), [#264](https://github.com/joshuaulrich/xts/pull/264)) * Restore behavior from 0.10-2 so subsetting an empty xts object by a date- time vector returns an empty xts object instead of throwing an error. Thanks to @alkment for the report. ([#252](https://github.com/joshuaulrich/xts/issues/252)) * Add ability for merge.xts() to handle multiple character or complex xts objects. Thanks to Ken Williams for the report. ([#44](https://github.com/joshuaulrich/xts/issues/44)) * Add ability to use "quarters" to specify tick/grid mark locations on plots. This ran but produced an incorrect result in 0.10-2 and threw an error in 0.11-0. Thanks to Marc Weibel for the report. ([#256](https://github.com/joshuaulrich/xts/issues/256)) * Fix illegal read reported by valgrind. Thanks to Tom Andrews for the report and PR. ([#236](https://github.com/joshuaulrich/xts/issues/236), [#261](https://github.com/joshuaulrich/xts/pull/261)) # xts 0.11-0 (2018-07-16) * Fix make.index.unique() to always return a unique and sorted index. Thanks to Chris Katsulis for the report and example. ([#241](https://github.com/joshuaulrich/xts/issues/241)) * Add window.xts() method and completely refactor the internal binary search function it depends on. Thanks to Corwin Joy for the PR, tests, review, and patience. ([#100](https://github.com/joshuaulrich/xts/pull/100), [#240](https://github.com/joshuaulrich/xts/pull/240)) * Better axis tick mark locations for plots. Thanks to Dirk Eddelbuettel for the report. Also incorporate axTicksByTime2() into axTicksByTime() to reduce code duplication from the migration of quantmod::chart_Series() to xts::plot.xts(). ([#246](https://github.com/joshuaulrich/xts/issues/246), [#74](https://github.com/joshuaulrich/xts/issues/74)) * Add details to plot.xts() parameters that are periodicity, now that RStudio has argument completion. Thanks to Evelyn Mitchell for the PR. ([#154](https://github.com/joshuaulrich/xts/issues/154)) * periodicity() now warns instead of errors if the xts object contains less than 2 observations. ([#230](https://github.com/joshuaulrich/xts/issues/230)) * first() and last() now keep dims when they would otherwise be dropped by a regular row subset. This is consistent with head() and tail(). Thanks to Davis Vaughan for the report. ([#226](https://github.com/joshuaulrich/xts/issues/226)) * Fix subset when ISO8601 string is outside the valid range, so it returns no data instead of all rows. ([#96](https://github.com/joshuaulrich/xts/issues/96)) * Avoid partial name matches from parse.side() (inside .parseISO8601()) results that are passed to firstof() and lastof(). Thanks to @gp2x for the report and the patch. ([#231](https://github.com/joshuaulrich/xts/issues/231)) * na.locf.xts() now loops over columns of multivariate objects in C code, instead of in R. This should improve speed and memory performance. Thanks to Chris Katsulis and Tom Andrews for their reports and patches. ([#232](https://github.com/joshuaulrich/xts/issues/232), [#233](https://github.com/joshuaulrich/xts/issues/233), [#234](https://github.com/joshuaulrich/xts/issues/234), [#235](https://github.com/joshuaulrich/xts/pull/235), [#237](https://github.com/joshuaulrich/xts/pull/237)) * Change plot.xts() default 'pch = 0' (rectangles) to 'pch = 1' (circles) so it looks more like base and zoo plots. ([#203](https://github.com/joshuaulrich/xts/issues/203)) # xts 0.10-2 (2018-03-15) * na.locf.xts() and na.omit.xts() now support character xts objects. Thanks to Ken Williams and Samo Pahor for the reports. ([#42](https://github.com/joshuaulrich/xts/issues/42)) * na.locf.xts() now honors 'x' and 'xout' arguments by dispatching to the next method. Thanks to Morten Grum for the report. ([#215](https://github.com/joshuaulrich/xts/issues/215)) * coredata.xts() now functions the same as coredata.zoo() on zero-length objects, and only removes xts-related attributes. Thanks to Vincent Guyader for the report. ([#223](https://github.com/joshuaulrich/xts/issues/223)) * plot.xts() no longer ignores 'col.up' and 'col.dn' when 'type="h"' ([#224](https://github.com/joshuaulrich/xts/issues/224)). Thanks to Charlie Friedemann for the report. This was inadvertently broken as part of the fix for [#210](https://github.com/joshuaulrich/xts/issues/210). # xts 0.10-1 (2017-12-20) * 'ylim' values passed to 'addSeries' and 'addPolygon' via '...' are now captured and honored ([#220](https://github.com/joshuaulrich/xts/issues/220)). * 'addPolygon' now checks for ylim of zeros, as 'addSeries' does ([#164](https://github.com/joshuaulrich/xts/issues/164)). * The 'base::as.Date.numeric' method is no longer over-ridden. The exported, but not registered, method in zoo should prevent any change in behavior. * Series added to an existing plot are now given the same index values as the main panel ([#216](https://github.com/joshuaulrich/xts/issues/216)). There still may be some weird behavior if the new data does not have observations within the timespan of the main panel data, but no observations on the same timestamps. * Existing 'par' values are now captured and reset before returning from plotting functions ([#217](https://github.com/joshuaulrich/xts/issues/217)). * User-defined 'col' values are now honored when 'type="h"' ([#210](https://github.com/joshuaulrich/xts/issues/210)). * Values passed to plotting functions are now copied from the calling environment. This enables plotting arguments to be objects passed through multiple layers of function calls. * indexFormat is now generic, consistent with indexFormat<- ([#188](https://github.com/joshuaulrich/xts/issues/188)). * Calling as.matrix() on a zero-width xts object now behaves consistently with zoo, and no longer throws an error ([#130](https://github.com/joshuaulrich/xts/issues/130)). * Fix weird result in merge.xts() when 'fill' argument is NULL or a zero- length vector ([#261](https://github.com/joshuaulrich/xts/issues/261)). * Fixed bug in endpoints() due to sub-second representation error via using integer division (%/%) with non- integer arguments ([#202](https://github.com/joshuaulrich/xts/issues/202)). * endpoints() gained sub-second accuracy on Windows ([#202](https://github.com/joshuaulrich/xts/issues/202)). * plot.xts() no longer errors when called on an object containing a constant value. It chooses ylim values +/-20% from the series value ([#156](https://github.com/joshuaulrich/xts/issues/156)). * plot.xts() now places y-axis labels in the same location on the plot, regardless of data periodicity ([#85](https://github.com/joshuaulrich/xts/issues/85)). * rbind.xts() now throws an error if passed an xts object with different number of observations in the index and data (e.g., zero-width) ([#98](https://github.com/joshuaulrich/xts/issues/98)). # xts 0.10-0 (2017-07-07) Major changes include: * A new plot.xts() that is incompatible with earlier versions of plot.xts(). * Moved development from R-Forge to GitHub. * New xts FAQ. Other, less disruptive changes include: * merge.xts() now throws an error if the index contains non-finite values ([#174](https://github.com/joshuaulrich/xts/issues/174)). * Constructors xts() and .xts() now ensure order.by and index arguments do not contain non-finite values. Many xts functions, most notably merge.xts(), expect all index values to be finite. Missing index values usually indicate an error, and always occurred at the end of the index ([#173](https://github.com/joshuaulrich/xts/issues/173), ([#194](https://github.com/joshuaulrich/xts/issues/194), ([#199](https://github.com/joshuaulrich/xts/issues/199)). * Fixed bug in endpoints() when called on sparse data that have the same month and day, but different years ([#169](https://github.com/joshuaulrich/xts/issues/169)). * Fixed bug in [.xts did not do the same checks on logical xts objects as it does for all other data types ([#163](https://github.com/joshuaulrich/xts/issues/163)). * Fixed bug that caused split.xts() to error if 'f' is a character vector with more than 1 element ([#134](https://github.com/joshuaulrich/xts/issues/134)). * Fixed bug that crashed R if 'k' argument to lag.xts() was not an integer and would be NA when coerced to integer ([#152](https://github.com/joshuaulrich/xts/issues/152)). * period.apply() now checks to ensure the object's index is unique and sorted, and sets INDEX <- sort(unique(INDEX)) if it is not. It also ensures INDEX starts with 0 and ends with NROW(x) ([#171](https://github.com/joshuaulrich/xts/issues/171)). * All references to the 'its' package have been removed, since it is now archived on CRAN at the request of its maintainer. * Fixed bug that crashed R when merge.xts() was called on an empty xts object and more than one non-xts object ([#157](https://github.com/joshuaulrich/xts/issues/157)). * Fixed bug that did not set the index's tzone attribute to UTC when index<-.xts or indexClass<- were called and 'value' did not have a tzone attribute ([#148](https://github.com/joshuaulrich/xts/issues/148)). * Fixed a bug in endpoints() that caused incorrect results if the index was less than the epoch ([#144](https://github.com/joshuaulrich/xts/issues/144)). * Fixed a bug that caused diff.xts() on a logical xts object to return an object with a POSIXct index. * index.xts() works even if the package containing the class for the index is not attached (it needs to be loaded, however). * [.xts now returns NA if a one-column xts object is subsect by NA, instead of throwing an uninformative error ([#97](https://github.com/joshuaulrich/xts/issues/97)). * Fixed bugs that would crash R when [.xts was called a certain way and 'j' contained NA values ([#97](https://github.com/joshuaulrich/xts/issues/97), [#181](https://github.com/joshuaulrich/xts/issues/181)). * Fixed a bug in endpoints() where 1 second would be subtracted for any date in the year 1969. The subtraction is only supposed to occur on 1969-12-31 23:59:59.9... to work around behavior in strptime(). * timeBasedSeq() now honors hour/min/sec 'BY' values ([#91](https://github.com/joshuaulrich/xts/issues/91)). * [.xts now throws an error if 'j' is character and not one of the column names. This is consistent with [.zoo and [.matrix ([#48](https://github.com/joshuaulrich/xts/issues/48)). * timeBasedSeq() now works correctly when resolution is "days" the sequence includes a daylight saving time change ([#67](https://github.com/joshuaulrich/xts/issues/67)). * Explicitly set indexTZ="UTC" for all index classes that do not have a TZ ([#66](https://github.com/joshuaulrich/xts/issues/66)). indexTZ="GMT" is also allowed. * Fixed as.xts() when called on an 'mts' object ([#64](https://github.com/joshuaulrich/xts/issues/64)). * Moved development from R-Forge to GitHub. * Fixed bug in to.period() that errored when name=NULL ([#2](https://github.com/joshuaulrich/xts/issues/2)). * Fixed bug in `.index*` functions that did not account for timezones ([#3](https://github.com/joshuaulrich/xts/issues/3)). * Fixed bug that allowed index<-.xts to produce an unsorted index ([#4](https://github.com/joshuaulrich/xts/issues/4)). * Fixed bug so subsetting a zero-width xts object with a zero-length 'i' vector no longer returns an object with column names ([#5](https://github.com/joshuaulrich/xts/issues/5)). * Updated [.xts to handle 'i' containing multiple zeros (e.g. subsetting by a "logical" column of an integer xts object). * endpoints() now errors if k < 0. # xts 0.9-7 (2014-01-02) * Fixed bug that caused logical operators on xts objects to drop the 'tzone' attribute ([#10](https://github.com/joshuaulrich/xts/issues/10)). * Fixed bug that ignored 'which.i' argument to [.xts on zero-width xts objects ([#12](https://github.com/joshuaulrich/xts/issues/12)). * Fixed bug where xts() does not sort 'order.by' if x is missing ([#13](https://github.com/joshuaulrich/xts/issues/13)). * Fixed bug where setting dimnames to NULL would break as.xts() ([#14](https://github.com/joshuaulrich/xts/issues/14)). * Added checks to period.sum/prod/min/max to ensure INDEX is in [0,nrow(x)]. * Fixed missing argument to na_locf() in the C/C++ xtsAPI (Dirk Eddelbuettel). # xts 0.9-5 (2013-06-24) * Increased zoo dependency version to 1.7-10 for changes in C code. * Fixed several minor issues in the C/C++ xtsAPI (Dirk Eddelbuettel). # xts 0.9-4 (2013-06-09) * Fixed bug where the index was missing the 'tzone' attribute. * Fixed to.period() bug when 'indexAt' is "firstof" or "lastof". (bug [#15](https://github.com/joshuaulrich/xts/issues/15), patch [#35](https://github.com/joshuaulrich/xts/issues/35), thanks to Garrett See) * Fixed subsetting bug on zero-width xts objects that returned NA data and an NA index ([#16](https://github.com/joshuaulrich/xts/issues/16)). * xts' merge() method now has 'drop' and 'check.names' arguments to match the zoo merge() method. * 'index<-' now correctly handles UTC Date objects when resetting index values. '.index<-' behaved correctly. * xts' rollapply() method now handles the 'fill' argument. * Added several functions to the C/C++ API: - make_index_unique - make_unique - endpoints - do_merge_xts - na_omit_xts - na_locf * Fixed xts' rollapply() method when input has one column, but function output has more than one column. # xts 0.9-3 (2013-01-20) * No user-visible changes. # xts 0.9-2 (2013-01-18) * Added C/C++ xtsAPI (Dirk Eddelbuettel) * Added tzone() and tclass() functions as aliases to indexTZ() and indexClass(), respectively. Eventually will Deprecate/Defunct the former. # xts 0.9-1 (2012-12-29) * xts() now ignores timezone arguments when order.by is Date class, with a warning. # xts 0.8-8 (2012-11-06) * Modified str() output to make use of proper ISO-8601 range formating * Fixed bug in reclass() when 'tzone' of object is different than system TZ. * Fixed bug in xts() that dropped dims when 'x' is a 1-column matrix or data.frame. * [.xts no longer warns if 'i' is zero-length. * to.period() now checks that 'x' is not zero-length/width. * Fixed edge case in Ops.xts where two objects with no common index create an invalid 'xts' object with no index. * to.monthly() and to.quarterly() now default to drop.time=TRUE. * Internal .drop.time() now changes the index class to Date. This affects the to.period() family of functions. * Restore Date index/tclass conversion to POSIXct with a UTC timezone via integer division instead of double-precision division. # xts 0.8-6 (2012-03-25) * Revert Date index/tclass conversion to POSIXct with a UTC timezone to previous behavior as in 0.8-2. # xts 0.8-5 (2012-03-24) * A Date index/tclass is now internally converted to POSIXct with a UTC timezone ensure proper conversion regardless of user TZ settings. * tclass is now an argument to .xts() * Fix endpoints() properly handles millisecond time stamps (and microsecond on not Windows). * Subsetting zero-width xts objects now behaves like zoo, with NA values returned for valid row requests. # xts 0.8-2 (2011-08-09) * Fixed bug in lag() and diff() for character coredata. * Fixed subsetting bug that returned a contiguous chunk of data even when a non-contiguous 'i' was provided. * Fixed bug that ignored FinCenter/TZ for timeDate index * period.apply() now only sets colnames if the number of columns in the input and output are equal. * Fixed periodicity() when scale = "yearly" * Fixed [.xts when row-subsetting via a POSIXct vector, which returned an object full of NA. * Added '...' to axis() call inside of plot.xts() to allow for 'cex.axis' and 'cex.lab' to be passed in. * Fixed axes=FALSE issue in plot.xts(). * Dependency now on 1.7-0 or better of zoo (R-forge at present) This build now links to C code moved from xts to zoo. At present this is only for zoo_lag (used in lag and lagts) * Added 'drop' and 'fromLast' arguments to make.index.unique(). * Added adj.time() and shift.time() * Fixed na.locf() bug that would fill trailing NA larger than 'maxgap' observations ([#22](https://github.com/joshuaulrich/xts/issues/22)) * Updated indexFormat() documentation and add an example # xts 0.8-0 (2011-02-22) * Fix print formatting ([#27](https://github.com/joshuaulrich/xts/issues/27)) * Fix bug related to na.locf() and zero-width objects ([#28](https://github.com/joshuaulrich/xts/issues/28)) * Add .RECLASS = FALSE after '...' for as.xts.*() methods. This makes all as.xts.*() methods one-way (i.e. not reclass-able). Objects converted to xts via try.xts() can still be converted back to their original class via relcass(). * Fix bug that caused colnames to be dropped if object is subset by time that is not in the index. # xts 0.7-5 (2010-08-21) * try.xts and reclass now are more efficient on xts objects, no longer appending a .RECLASS attribute. This penalty (copying) is shifted to classes that are internally converted to xts. # xts 0.7-4 (2010-08-04) * internal attributes of index are now maintaining timezone (tzone), time class (tclass) information. * `[.xts` method is now using new C code. This may revert back as character-based objects are not supported. Changed for future code refactoring into zoo, as well as performance gains on integer, double and logical values. Also added in checks for NAs. drop=TRUE now works correctly in all known applications. * (cbind)merge.xts and rbind.xts now copy index attributes to handle internal changes to index characteristics (in C code) * indexTZ.Rd updated to provide information regarding internal changes. Also indexTZ<- is now exported to facilitate timezone changing of xts objects. # xts 0.7-1 (2010-05-08) * subsecond ISO8601 subsetting on dates before 1970 (epoch) is disabled. This is due to a bug in the R implementation of POSIX handling of fractional seconds pre-1970. 10 microsecond granularity is still functional for all other times. Thanks to Andreas Noack Jensen for the early bug report. * new 'tzone' arg in xts constructor and 'tz' in .parseISO8601 allows for future support of non-system TZ dependent indexing * internal index attribute (numeric) now can have attributes set (tzone is currently the only one used in xts). These should remain during all xts operations. Still experimental. * naCheck has been exposed at the C level for use in packages "LinkingTo: xts". See ?xtsAPI for more details. # xts 0.7-0 (2010-01-26) * A new NEWS file. * print.xts now passes ... * endpoints speedup and bug fix (thanks Ismail Onur Filiz) * na.omit bug on logical and NaN fixes (thanks Fabrizio Pollastri and Koert Kuipers) * fromLast=FALSE for na.locf.xts. Matching to zoo. (thanks to Sandor Benczik) * LGLSXP support in leadingNA (R fun naCheck) * fixed logical and NA 'j' subsetting. Thanks Koert Kuipers. * as.xts and as.timeSeries fixes for timeSeries changes * merge and subset now support dimensionless xts (non-standard). merge segfault fixed when merging all 3 or more zero-width xts objects and only zero-width objects. Thanks to Koert Kuipers for the report. * added which.i to [.xts to return i values found via ISO8601 subset string * new lines.xts and plot.xts, similar to methods in zoo * lastof now has sec to 10 microsecond precision, and subsec arg to append to secs. * xts() further consistency in NROW/index check * align.time error checks for positive n= values (thanks Brian Peterson) * toPeriod updates in C, almost exported. ~600-1200x faster * new lag_xts in C. Increased speed and index flexibility. * endpoints 'days' bug fix * .makeISO8601 function to create ISO8601 compliant string from xts objects xts/inst/0000755000176200001440000000000014703504524012051 5ustar liggesusersxts/inst/include/0000755000176200001440000000000014636572747013515 5ustar liggesusersxts/inst/include/xts.h0000644000176200001440000000746614636572747014521 0ustar liggesusers/* Header file for using internal C-level facilities provided by xts. This is not 100% designed for end users, so any user comments and bug reports are very welcomed. Copyright Jeffrey A. Ryan 2008 This source is distributed with the same license as the full xts software, GPL (>= 2). */ #include #include #include #ifndef _XTS #define _XTS #ifdef __cplusplus extern "C" { #endif /* INTERNAL SYMBOLS */ extern SEXP xts_IndexSymbol; extern SEXP xts_ClassSymbol; extern SEXP xts_IndexTformatSymbol; extern SEXP xts_IndexTclassSymbol; extern SEXP xts_IndexTzoneSymbol; /* DATA TOOLS */ #define xts_ATTRIB(x) coerceVector(do_xtsAttributes(x),LISTSXP) #define xts_COREATTRIB(x) coerceVector(do_xtsCoreAttributes(x),LISTSXP) // attr(x, 'index') or .index(x) #define GET_xtsIndex(x) getAttrib(x, xts_IndexSymbol) #define SET_xtsIndex(x,value) setAttrib(x, xts_IndexSymbol, value) // attr(x, '.indexFORMAT') or indexFormat(x) #define GET_xtsIndexFormat(x) getAttrib(x, xts_IndexFormatSymbol) #define SET_xtsIndexFormat(x,value) setAttrib(x, xts_IndexFormatSymbol, value) // attr(x, '.CLASS') or CLASS(x) #define GET_xtsCLASS(x) getAttrib(x, xts_ClassSymbol) #define SET_xtsCLASS(x,value) setAttrib(x, xts_ClassSymbol, value) /* IMPORTS FROM zoo */ extern SEXP(*zoo_lag)(SEXP,SEXP,SEXP); extern SEXP(*zoo_coredata)(SEXP,SEXP); /* FUNCTIONS */ SEXP do_xtsAttributes(SEXP x); // xtsAttributes i.e. user-added attributes SEXP add_xtsCoreAttributes(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); SEXP do_xtsCoreAttributes(SEXP x); /* xtsCoreAttributes xts-specific attributes CLASS, .indexFORMAT, tclass, & class */ SEXP coredata(SEXP x, SEXP copyAttr); SEXP coredata_xts(SEXP x); SEXP add_class(SEXP x, SEXP klass); SEXP lagXts(SEXP x, SEXP k, SEXP pad); SEXP lag_xts(SEXP x, SEXP k, SEXP pad); SEXP do_is_ordered(SEXP x, SEXP increasing, SEXP strictly); SEXP mergeXts(SEXP args); SEXP do_rbind_xts(SEXP x, SEXP y, SEXP dup); SEXP rbindXts(SEXP args); SEXP do_subset_xts(SEXP x, SEXP sr, SEXP sc, SEXP drop); SEXP _do_subset_xts(SEXP x, SEXP sr, SEXP sc, SEXP drop); SEXP number_of_cols(SEXP args); SEXP naCheck(SEXP x, SEXP check); SEXP make_index_unique(SEXP x, SEXP eps); SEXP make_unique(SEXP X, SEXP eps); SEXP endpoints(SEXP _x, SEXP _on, SEXP _k, SEXP _addlast); SEXP do_merge_xts(SEXP x, SEXP y, SEXP all, SEXP fill, SEXP retclass, SEXP colnames, SEXP suffixes, SEXP retside, SEXP check_names, SEXP env, SEXP coerce); SEXP na_omit_xts(SEXP x); SEXP na_locf(SEXP x, SEXP fromlast, SEXP maxgap, SEXP limit); SEXP tryXts(SEXP x); SEXP binsearch(SEXP, SEXP, SEXP); SEXP any_negative(SEXP); SEXP fill_window_dups_rev(SEXP data, SEXP index); SEXP non_duplicates(SEXP data, SEXP from_last); SEXP toPeriod(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); SEXP xts_period_apply(SEXP data, SEXP index, SEXP function, SEXP env); SEXP xts_period_min(SEXP data, SEXP index); SEXP xts_period_max(SEXP data, SEXP index); SEXP xts_period_sum(SEXP data, SEXP index); SEXP xts_period_prod(SEXP data, SEXP index); SEXP roll_min(SEXP x, SEXP n); SEXP roll_max(SEXP x, SEXP n); SEXP roll_sum(SEXP x, SEXP n); SEXP roll_cov(SEXP x, SEXP n, SEXP sample, SEXP); SEXP dimnames_zoo(SEXP x); SEXP xts_set_dimnames(SEXP x, SEXP value); void copyAttributes(SEXP x, SEXP y); // internal only void copy_xtsAttributes(SEXP x, SEXP y); // internal only void copy_xtsCoreAttributes(SEXP x, SEXP y);// internal only SEXP isXts(SEXP x); // is.xts analogue int firstNonNA(SEXP x); SEXP extract_col (SEXP x, SEXP j, SEXP drop, SEXP first_, SEXP last_); SEXP do_startofyear(SEXP from, SEXP to, SEXP origin); int xts_ncols(SEXP x); #endif /* _XTS */ #ifdef __cplusplus } #endif xts/inst/include/xts_stubs.c0000644000176200001440000000011414634166522015677 0ustar liggesusers #warning("This header is deprecated. Please include 'xtsAPI.h' instead.") xts/inst/include/xtsAPI.h0000644000176200001440000000732014634167654015033 0ustar liggesusers/* Header file for using internal C-level facilities provided by xts. This is not 100% designed for end users, so any user comments and bug reports are very welcomed. Copyright 2008 - 2014 Jeffrey A. Ryan Copyright 2014 Dirk Eddelbuettel This source is distributed with the same license as the full xts software, GPL (>= 2). */ #ifndef _XTS_API_H #define _XTS_API_H #include // also includes R.h, Rinternals.h, Rdefines.h #include #include #ifdef HAVE_VISIBILITY_ATTRIBUTE # define attribute_hidden __attribute__ ((visibility ("hidden"))) #else # define attribute_hidden #endif #ifdef __cplusplus extern "C" { #endif /* To aid those looking for answers on interfacing compiled code from another package. This is simply constructing a function pointer for use. static RETURNTYPE(*fun)(ARG1,ARG2) = NULL where ARGS are the types accepted, comma seperated fun = ( RETURNTYPE(*)(ARG1,ARG2)) R_GetCCallable("PACKAGENAME", "FUNCTIONNAME") */ SEXP attribute_hidden xtsIs(SEXP x) { static SEXP(*fun)(SEXP) = (SEXP(*)(SEXP)) R_GetCCallable("xts","isXts"); return fun(x); } SEXP attribute_hidden xtsIsOrdered(SEXP x, SEXP increasing, SEXP strictly) { static SEXP(*fun)(SEXP,SEXP,SEXP) = (SEXP(*)(SEXP,SEXP,SEXP)) R_GetCCallable("xts","do_is_ordered"); return fun(x, increasing, strictly); } SEXP attribute_hidden xtsNaCheck(SEXP x, SEXP check) { static SEXP(*fun)(SEXP,SEXP) = (SEXP(*)(SEXP,SEXP)) R_GetCCallable("xts","naCheck"); return fun(x, check); } SEXP attribute_hidden xtsTry(SEXP x) { static SEXP(*fun)(SEXP) = (SEXP(*)(SEXP)) R_GetCCallable("xts","tryXts"); return fun(x); } SEXP attribute_hidden xtsRbind(SEXP x, SEXP y, SEXP dup) { static SEXP(*fun)(SEXP, SEXP, SEXP) = (SEXP(*)(SEXP,SEXP,SEXP)) R_GetCCallable("xts","do_rbind_xts"); return fun(x, y, dup); } SEXP attribute_hidden xtsCoredata(SEXP x) { static SEXP(*fun)(SEXP) = (SEXP(*)(SEXP)) R_GetCCallable("xts","coredata_xts"); return fun(x); } SEXP attribute_hidden xtsLag(SEXP x, SEXP k, SEXP pad) { static SEXP(*fun)(SEXP,SEXP,SEXP) = (SEXP(*)(SEXP,SEXP,SEXP)) R_GetCCallable("xts","lagXts"); return fun(x, k, pad); } SEXP attribute_hidden xtsMakeIndexUnique(SEXP x, SEXP eps) { static SEXP(*fun)(SEXP,SEXP) = (SEXP(*)(SEXP,SEXP)) R_GetCCallable("xts","make_index_unique"); return fun(x, eps); } SEXP attribute_hidden xtsMakeUnique(SEXP x, SEXP eps) { static SEXP(*fun)(SEXP,SEXP) = (SEXP(*)(SEXP,SEXP)) R_GetCCallable("xts","make_unique"); return fun(x, eps); } SEXP attribute_hidden xtsEndpoints(SEXP x, SEXP on, SEXP k, SEXP addlast) { static SEXP(*fun)(SEXP,SEXP,SEXP,SEXP) = (SEXP(*)(SEXP,SEXP,SEXP,SEXP)) R_GetCCallable("xts","endpoints"); return fun(x, on, k, addlast); } SEXP attribute_hidden xtsMerge(SEXP x, SEXP y, SEXP all, SEXP fill, SEXP retclass, SEXP colnames, SEXP suffixes, SEXP retside, SEXP check_names, SEXP env, SEXP coerce) { static SEXP(*fun)(SEXP,SEXP,SEXP,SEXP,SEXP,SEXP,SEXP,SEXP,SEXP,SEXP,SEXP) = (SEXP(*)(SEXP,SEXP,SEXP,SEXP,SEXP,SEXP,SEXP,SEXP,SEXP,SEXP,SEXP)) R_GetCCallable("xts","do_merge_xts"); return fun(x, y, all, fill, retclass, colnames, suffixes, retside, check_names, env, coerce); } SEXP attribute_hidden xtsNaOmit(SEXP x) { static SEXP(*fun)(SEXP) = (SEXP(*)(SEXP)) R_GetCCallable("xts","na_omit_xts"); return fun(x); } SEXP attribute_hidden xtsNaLocf(SEXP x, SEXP fromLast, SEXP maxgap, SEXP limit) { static SEXP(*fun)(SEXP,SEXP,SEXP,SEXP) = (SEXP(*)(SEXP,SEXP,SEXP,SEXP)) R_GetCCallable("xts","na_locf"); return fun(x, fromLast, maxgap, limit); } #ifdef __cplusplus } #endif #endif /* !_XTS_API_H */ xts/inst/doc/0000755000176200001440000000000014703504524012616 5ustar liggesusersxts/inst/doc/xts.pdf0000644000176200001440000123454114703504524014141 0ustar liggesusers%PDF-1.5 %ÐÔÅØ 89 0 obj << /Length 1818 /Filter /FlateDecode >> stream xÚÝY[“Ó6~çWä©ufˆÐÝRß(fÚÎ,ËåÁ›h7.‰½õX~}Ï‘'v²L;´ðdYVŽÎí;·ÐÙ͌Ξ? 'ž?_>xôLØË gJÎ.¯gÌ b¸™i¦ˆ°ùìr5{“}ìÚŸæ ™ÛìéÇÎUmyµqó…Ð4»,·qõÊ5¥kço/_>z&éŒ1b•âž$%|¶à†c½—î*Dãîà§\g >óìânÎMVTs8lEö²n×sØî‹ðùWŽ¿Þ4å?¬ñ¶™Î‰  .Dä2\ðkß#yf†§Ô›1I„ÔžÁ9QhHN¤ÕÆ“ºš –¼sA³Î‹šÑf ªÏA ¥%Vs´(0¢³H„Í–«ìÐàY×ÔÈH¶ê—] ÔÁ`ŠÙ›×Ôäð‹ô=e(ó@ùrú7"k»ÈöM|­¯£¤â€9Fa‚©YG²0䆱îyBÓœKÍÄRšÎlkf¶*¼rY  ·S6…ýž4žŸÕø2 …ÉÇ1@¤¾nËê&€³[»„EÀv\æG]QTíÎÜKŒ+ïæZfÅÍ‘ûs&Džé{â6g݉눶O÷ØVEW„U}êÓÙŸn‰9"r¸$°.Z’ö4!÷ƒ\EµJ‘²DèütðäŠØÝѯî5ú,N9•iøTÛÿP]·ŽX=¨Uò›èyÅçg/0'zÑË/\ÛÕÍàæO®Bf°wSVÅ&l/7EsØ"å§ŠjÙÎ çNK>`ã‡) ´wù‹=¥Snâ1õÏý~ª[_˜Ðó^-Á…ÅQ ‘Q»±¼[­JÌ;]vå¾fn1gÙ®ŠÖ­â§àÃõæÈ‰µeÿsgô ã_˜< $µ’“‡ Éã÷#½ÛÔ·CùPvëd‘G‰Ü爳E;,òØ}³…€žAL$‡tñ{傯û*»G×uk¿Í!–\:uÈœh:ƒ]sGÎ}ð~aùW û÷0ÿù,ÀŒ!Ö)‘Ñêùê^Ñ(©?Ž`x"ÔŸ&\Uý%g¾7Ô§÷G*çI}[~Pƒµ…_øVv5ìO]˧+UÆìý ±C¯·eD¯"ì>ýq×5åUß¹ÏZ'‡jŒ‰ÿÀ»¿šáíYÄXM(Ÿ$5æUåS†wt´ì±îsM$»o eÕAú5Îé—¦(Fñe 5¡VWËMß&'B±xÙtøBqb@ Ä©ÝÀî ~bÂâÄ„NL&& SÃlø¹‡Hø}ÛA»Òvåä¤,ÛÕM›¤£Œi‰TC»p‘¸ÆÉ.x3‘bÍdãm`¢Æ1—kÚðÖíxjž6ÌÌüfý®íâKx¼ŸCkUÀ™.޳<Ñëðܺ%ÖSk_‚¢e ѹC£¨Êvë/ྜÂg€H µƒ×K‹¬À7–5.ð[àé&nÏnQV+÷ÑůØ‚siE³ß@×ï‘™”vyeÔg´»ŸJÅŠ \r™uU“󙱘] õªG¨¬íË®ðóI|ó.<ÿƒ¾a#´°¸*ÑmWIǰ”(=/ñuSl]BÅ ß×S¡‡ˆ}'¼- äL5Ì1Ïм‡Æd 2KòÜ|c†È=#ÆÀfR2 š-ê‹Ï`Á|?um’îÁêbpë5‚dÓ/Iý dWß·ÿ LûdÃÙáÐ ´¶Rh«£`Ì‚q DPó|7xè«S×£q‰œÌj¢l˜£Nɦ‡ìbëÀß–)âJD>îªGO;I$Dòw§ñ¬¡"RìÌ:#Nf4–ÈhxáHìÒ7sGâ4Är@1œ™ÂÊû›Ìž ®#HsJ(›¨± r…·x×Ìõ1pýæ.Yàá[ˆGÊUØÑY_•5Â×¶Þô±…/ˆmÜ…‡¿¹ »׆EéñÛö»+·HasSt‡S lÒ> Ùºy7´o¾]ßÍ<â¡Ã“*iyjôÀýŸgcÓ<½|ð7ÙÃ\ endstream endobj 107 0 obj << /Length 3351 /Filter /FlateDecode >> stream xÚZIså¶¾ûWè6T•D“¸R¶“I9U‰«ÆJù`û‘„ ùÌe$å×§7€|ÇÊåakbit½à%WWÉÕß¿I¤üþî›o?ªòªŽë"+®î®R]Åeš]yg*¿ºk¯~~yr½¾Íê:r3—“µ§‰«†‹{?t6£i‡ë¬Š^\c:î|vó“wÒ5?ÑœUÔ\ߦÑ2Ž×id±Úã·2ÙpžÝЇ•`àËu^DÆuæ¾³7×·*)¢ç'3_ÿ~÷o?æjs–ÛTǵÖP¦qËY>1áš˸Jj`Œvø æuÔ[ÛÚ–ëϸ¸™¸1ô–+§a”ÚìNöv²£³BÓtfšâë[%ÀAüúõ/Üú7ù‰¸üÄÅ“~¬ï‘õO†øòŠû¿ºå-_œ¬Áá§Á5¸äÜA)sÜC,ÇÊ+õšQ(!€EÌ£ë…|{$ìhñz ÜÓlà`E‘DwONÆà^òÈíÌÛ¤Î'#£'käZqûÉåÎg¼¿[œi-ï·ÎpjÜøÄ—Œáž–+óÀåÙ>sËô2,l¡é† ?NEöh/ÉÊ"ÐûÊ5ºìaédŽi9ó~†qF™ËÔŽNâNçu¡¬N¼' Jp/“_¹I2?\“°‡Kš¼¨'Ñ"óô»ilßÞ.p%(W äJÔ*])¦'‹×Õ“yìݼ´öb«o%O)ÐäánŒå¥{ÏF˜‰—úH R ÈÝãpâÚŸ¾û× W°$ÀÊ=lªŒl3œ¬Ÿ ¾ P:Û?ú Q±²¦0š®W'êXbpÅË 9m;ÛÌÜ62|)ÛŠ%AÆHu¢¶­°4Ãúq© >È7ÈN?v$}뾸vA‹œnõ†[;¹™à [ÏO¶ç£6Ö\‡8ù¥¡C®ÔÏ…¥®ÿ€U­•Ç3£‘àQ. xa}9°ŒÍÂg&Q ”fUùÒN"Ó›ó¸X®û©²ô7“HA÷‰5à*n–¾,LªŠEÿÞLdÙp¹¾µ/v: bŠUà±"UpgÜ;äµU‰&[¹Zü ýºÔÝ‘Uytí7,¨G•8ê¾ #%®.ìд„QÙ1#’´f6\óZ ”€mV¦r}° C÷·ˆÛG"óuÙò¡Ê5ü­¡ª¸ª+ï;˜éÀ»€y³$÷$pïÝ„š5ðÌÍ ÐÕXY ø û-Y\ Çz!b;{7ƒ]4a è8" ‘ÈKåÝ7" ÃÚ…Zå*Nõ5µRÕúC§ tÉ®II:­ÆLäÆÑ)Ì 9­ eg'©Áœ¹}ñxV¡àö<0‰¼—gV^Uz„«Ä$0ý »³Û½iãQžÉç¹bÖæÄZî£4lü°Ò4 `[ÕÊ'/YØ¡0l–9ÏYš Ž#óhF‹·¤Ñwxž¶u(Ü¤Í y7‡¦Lú&à¯"žÖÞi 4V ;ÙYü{ |óÌc¤@HcXþg2&Ú»@84ŒTËÈþ|˜¸K4 ¾q²¢›ÑB6 gžYàˆpúXô𪟓µòr5s ]iVÇIÔ ëgÖÈ·j–q¡V5k®H)ô¶ŒA5<õ‡á`Æ,‰•zšKˆ³6†d‹v>ƒµº_fÐÛL«X%åIFGø¤¨PäúrOª {úèúl?Ûñ`gZÇ90](oæ*ã²lâŽNˆè•®ó€ fäZ½Hunb¼Î1XƒŸ@'@ÞÛÿzt1:‡X%\ dQ­ð‚n˜f”J×,(åNPÞ;¤Ôò³˜Ã°¯ÎâªÜEGïÉNÐÿö¦LgvVÛ–Á³·ÏÜþp·°(ßZ&žÀôa*qÑ9Bè<úx])ŠF¦»Œõdw_spiø J§Q;p®œÜë§µ\AÕF\Ó™7 ÐéËÓ0ÉŒcsÞÉ÷t,›Æžg 4‚_{èýZâJƒw¬áxGµÞ:/ØôÇÐÇ!’Œ1$aMM¨­†­ a[ÑÈÒ'ÈâË|h¯ó¸¨‚¤8š'Mâ4ËV‘ŽÏ YC{$YI¬«[X7ëä ä¡zܨASr½ÉñL%¾îiRøV¤ë¸ç#^gÁ™ŠÍ8Z£y{vTÓ„a'ô'7Mâ1Cº?÷t¹ì3_SqéŸïìÁ.hOQ´ÞJ@c¸x0Íì}HŽuôѬæ‰\LÆuö6Q>z”¹Qüè¯ùš?Qº¦à( KŽ–¡Â2ž!N!Ä7!Flö´û1à@2ê"){GÂ*°ÅÎTÑn ë™_kØ­ù‰·ºpL;~ð‚f¬Êå™ÅÆÏèd àƒeÒ„´Fÿaæ4doOR'q]êw’¦AŒÌÌ n4 =5Äf­”°Ï¾œ;׸=!…n‚Nuôý+6îBôç9´êl¨Vïè÷­[–dz xF3Ô(d4Ü>¡T +}¸ ”^é¸õ6Á1 fÑãbF‘-KŠˆ°;p¹Ó•0‚"ΰ›ùđψžâoÿØY®ˆ•–ÊMX~¸Î?Î<$ЉÉùhÙd¬°M&Êç‘ü^Z.„§ dºáÎ7Ê_‚Cß’ÝH³³‰†²ŒœÁ¤Ù6ÖHÓ ãŸ \frØžîw…4³Ð‚ NÞBBL{ÄÞ·§V>uxƒ6ÍKìÇMh–tdr™EßÛL8 E©â2×ÿ‡=*7N.'i¦½üi¦kžÌ8Õç)à|«w» 2nü|ò hŽœ¬¬,Á5/.ùôÇbúùthÁ Ì‚o»Ë.þŠôáQÆ‹}Çï¬ !¿Õ €™à€xá:àx®c¥«?wüÁKHª€"»`ÜoÃv轡ú »3ŸýÒ-WV[Ç ØT» »åh^I. D¾„ÖØ|ƃS ïW¿ýÏ][‰õ¼»³lÖ]“\ÐX&Ní”’†,ñÈ%Ybzˆv6¡åCðØæ/­$WT—jg¢¦™Ò«YÂú² Ö‹³HØW“/Hq9ù‘YÎÙdMçïš.¾ôÁB–•œkްb°MÄû”g0$ Ÿë> €Vê&#γ„Ui ±J´Ûô¯Çò˜®±ç¡ÀŒ)vT/Ÿ·0hWUz™ßVUxéÀˆ£*¢ŸÝ ¶tàìØa™H•€ ³µàl³X]<Èœ,sƒp~^‰_Z k´íÒà—G‰DÊ6(rƈ¾]&IhLtxÇM~ò> V,eû¹*˜Õ*u!ùC¥·Ð­p“ØÄÕЙµ›‡2z +¼x!¸ð™ñuÀɓ–Ò}ñžöØpiiå„SùÏx OçMè,D"ðÛ˜¬åðÁŒòÊ>£#ÊðO~‰,ÁI²³q”d̪œŸ,¡×k0¶Tè…bŠZZäCéúf×ì¶ÜéÞØ—–Ùûj¶zˆ²ãWY7d¥!VÚ¥MøæM ºÙ¾m2V©3Òo¢'Ñ‚¸½Ír²žm_‘çî\ž»óõaøö͵ùøá9M4@ýûTd+g&žñ<º“]'KY‡“~C·iBùd»³ßßgÿf -ûâZÉaE8­5uîÍmå Œòîôü6¢Ù Œ· ÿ 8䤣ïáà V`¯¢ø$LÐÜ»ðü+ÆKJœàö¥q>ùW‚¬ç‰'Ù·T endstream endobj 113 0 obj << /Length 395 /Filter /FlateDecode >> stream xÚ…’ÁnÜ †ïû± ìk¤¦Rξ59›]ÓØ°2¤»}û‚‡DݨROž>fþ0E'DÑ÷-߇ápÿÈêI/™DÃ5mGTÊ0.Ð0¡x˜MU³ŽáͬںÉl9m°?B9Î6@źŠu8n>§xz£õ ‹]€ÌU¯Ö•–—YG(kW½ O÷‚ÿ¥‡µI‡ì’Ú]É5€nEw¤í›Æ¿Vµø§KãÑ»`ÜD©B‰¢ÕMCzQf'œÒ¤aÊA2’ð½òªƒ!|údîr¬’‡ó’Vðì³ë P“ù•3³ø³u'.6Îÿ2Ç8éÔ½IÕ0£v0%èŠ) “ rÖcÎÞ*!pÒùEL]Ì·Œˆ¶ÿbþ¼x·t‰+íºÛä]Ù—ø™òÖéeù > stream xÚYKsܸ¾ûWÌm9U† A“›’ݤœÊ®S±ª6Uq I\sH$%Ù¿>ýÉÑ–/C ñêntÝIvw»d÷÷7‰|ÿrýæOËÕNé8Ó&Ý]ßîT–Å…)w&/â4Ëw×õî¿Qº?(•$Ñõ½Û2c¢aôS5NžºEÔßîÿwýØ*?ÛJ§qR”pmò<<++vÇøhRƒ“aÖ!Uq©Jž{½/³¨‡Íõ1š:8=ªFÛÕL³ðɓ覹qê‰hͬèÕ!*-`ï4pòtoq]‘E¶ã/òFþ潊Ü>WQ%s*섉u¿!ƒR*N’cØþ-r¢£™7»OËè‹p¼?¤Eä–N¹Î}L2]5¶eòHg€B²2.S*Rñ1—«øÔõ¸ÝÓ†”i›L]™Ši2%! ¡ß€È[wS±.MØ0Þt–‚ 4°MzÌ£ÁUcÓwØ1Q 6Ý]W»š) ÍxðÄùcS;°Lÿ<5|bjë‘àücãžXJe±R…èÂ0Gpׇ,Ë¢‘Ì2ÓÑšj`âÅ Þ#˜Qk‡á-÷­L|¢³Ú–·˜©¬>hÝ:‹–>ðøÉ~¢ù<ÖÈœ©k>O.–K1;¾1ò‚.¬¯ ®+t¦4Þ?‘Ñ¡"x]±^gòX':(ÿkßomž¦ñ1›'5ïwïÀ6\­,ã,OSð- ^s…Ò€Ú”¬* þ\‘;! µˆ°!>>[Û‡Ž50ý]ÿNÀƒ™ÃL>7ûØ-·Gë¡c6NÉS°Âì…"~à¶¿õý‰["b=X1ºô'riçYƒ=91À¢ˆMZž`ÃàFëèCszhtdWƒie` p³B³“&8 jÜ6PÐ=éëýŒÇ#óäÇ=ˆbÛ ÕEFcUzðÍÐtw<ç ®ë'Ͻڎ¤G4½5t|Lò¤¿ׄMTÂÖ’Á¢Gß<3í¶÷'˜¦¸Çp S켤v2ÓŽ°êfÏ@'Gò™“óÜÓ2PÐ^Œzý4òÔõ³(ùÇ\Ùúƒ°¨j€«_ûa”[þ²C£v ØV– “÷ýÔÕ¤&$|í }{Y¼X‰,°ínºÏ“m¹“@¾àìÊTtEësFø>!„õS[sW`ž;ÞÕÀ’c”déñMˆŽ40mdHÂq–ÎDî¹¢ëÄe³n=8TOÇÔ—{/»Ìo°ÿØÜun¢¡Òr܇w´Íw…öK—]?6â9]Xσ8QÛ›¡÷7ÔÉ«ñî€sÂ5ž¹fF«é$’°ql°ˆ'i­‚ñÖ±‹ú É€Ö¸5ùwغ8Fb¨õL'w‚Åâ”Ð"§„,Àá)±A¢ÆûÞËŒeÛÀ¥´<Æåké SRÌ™Á%è²€N@ä‹Ðæ]ÕßuÍWb«dí½dÁq¢óïC£‚¬ œ¹üià !sÝjNkÄû““J 6c˜KÐVu3:!USDÓ€¤ CG–pŠ=K©5V„¡4.²ìüª58ê[ŽÅ +ËÝssÓ´álÈ 1 ÑYô»ÄgÌýÆæ‘4:’‰fÉ7.LIl’W. bãq¹T÷ p90vÁ¾dQœ!$”ƒÂ§vCƒöç9¦!ßä!0toE*Îø€âXÄNb XP Ö™&$•MÓmñÑÉR éIÓÊ4¸¶yŽH·úÎÞ„)tàÂmÃþ60‘¸„ï*£A*ù- ù’ËeÑf€¢@ò¢±9¹dc|!:ê»LŽÒ­T(K(ô^ÞÛF*4§ 'ŠGQM¹"„Ù¬>ò,Î’”HŠ÷çAçgà[µ¨±é9g>3²8Rê;Æj‘‡xÌráö?(¡8>å fÅÞʆƒæø œM9€ÆããCؾp‡œ™³’áϘ%PÀp}©SR¨SfËW¹9ÀEôç¢8· #9(§A˜ÈTJ2À”ÑÒËb.(|ÇÛ˜P¬QEÁ¦ïüظApüÃØ½}¶ÌõÄyÄœ¾Sìcý˜¤Fèƒó[×lÆÙ’ô ÁšÓ•jјó¸> stream xÚmRËRã0¼ç+tC>Xèa½ŽìÖf«¸âp0¶¢›’!Ï8’S¤’‹g$õ´{¦‡¢ ¢èÿŠ–ø§]Ý®…F–XÅj_‚he’šp!Q; G¼÷é­ªµ8½¹œ ]ênbÉ}üØv7ø/¦P"ÀÃÞGGªº ß͘aðÉOc·ÝN_ˆ–¸‡2W=·÷·kÙüǵ"Êj~”u¤Ï°³¸" g ªßv±ðƪ®ž‹\ ˜A5cÄÊÒkhz(`w)ÿò™ÜLÀ ~¢’:²!W´K„äËO×~üëÆtU^cˆ6fA¾†iWèÄïF. äwîÁ:.ù$'ÜžÚ‰¬ˆ.' žáT1ðÅ ¹‘á3øq“Ÿûiœ}ùš?.Dð&‡3A SçãI »qŽ þÚs>½Tµ”øÝõ)_ÄŸ9ÛÖžÎ5vù\LEàŽwe*à·vé5¸lîåL, mÜѯÓÒ£ZS"^ËF@EÆÈ3Ì¿võmÖÌK endstream endobj 131 0 obj << /Length 1897 /Filter /FlateDecode >> stream xÚ•XYsÜD~ϯX¶¨B Öd.¤ÂQ༨”¬õÙ•Œ¤c~=ÝÓ-­d+vò⣧ϯY..rñã#ɿߟ?zü,V  %zq¾Y(cDšd‹$N…6ñâ|½x˜U¨””Á«ÖU—«Ð$IÐmíêïóð<?Ïc‘DÀÛ?{ßµL3¡S¡¤î‰®ŠreTðv•¨ ¸d¦&]ä"Ot‚ô¡ÒZ¤‘^„Z‰LeôîÅ¡íV¡ŽUp½-xåZúmì¿ר5íºeÐvEÄoéfF¢T¬…ÒæŽ}ؘ¥=Í·«0RiðKÝm½sý¾n,ËÞ­ VÂí¯v|YÖÕJ§Á»•ÎÛ´¶ ìMR°~•ÈcA½¿çIpƒÄõ¡¡]yh[áQGÛÛ°µ³-¬‹® Õµë¶s&ƒ0-ãÞœ¢óV%L: Õ:¨½±G)ÔØ¢CCü®Wš5¨ì5Ÿ_¬Â8 þ±eÇ癈3¶8!^ßÐ3ÂÚXq“‹,R„*Rf= ø»íšCÙÕ`†É‚œìưÌgàÿ¬Ç¾Pˆ~gÞ6ŸiÜ;VhM¢½5í)óMÇ|}<¥šsñT|œ éSTë9n:†e~¿Ý!¤®PQÍ€eJ´ç[‹¸Œ²8(hn<×Ú uŠÝî†ÈÞ­ LÅέi»·%’¦]»oé¬ãw>ò=÷j&^:JDª¢û×RÄGš1N¼ø—˜Ñ)äLÙ $iIJ¾…£öpuä5M‡%Á@µ™¦ ”»¢å%4“%(‰ -ù1|=~}ê{à×{D$|>œ‡‘HÒK>‘7{$޲ Þ‹ñ(Û0‰É§fÓÔ{J·¶lŠ®DHpþ} rdKú§ÔÊ>ëôªy"¤1 U,²\áT£~ðÇ6œt™êXýˆO6Ö$™A’}ïÚîXãÇ##t>8pŠy}:gm*R?èQ‰G e7«çXu„Õ î9 ñ¢ØA×7´)ëýÀZ\ì,‘¸ï"!ý\A+såaW4D15y0 aéf³*n64áßg,‰!•òQ½gý±û̲à~ed$dt Oà~‚» в´”]w 8ܪ;T_ƒnèZÆ\öÅ"5ÉGÔúO”PÀ½×Çí–Ae̸¥‚Ó– ×£"Ô nWÐ{Òü–Á¿5¶å‡X>Mb‡, 5à\‚{®Cmë(´p…å¯ü, ÊÑ! ¤ò^ƒ“}A¹ìóöÓ¸åνE#™»Geé³80ÚˆØd÷¼‰À2)«óeR ™ZE£HCgr Ö.”÷½‡n¹;¬ Óñ$|²a(¢§ÈK‚‹ºÆ½÷€¥ñGlšboýAt-ßüWS0øÜ5à ÷]?¤i:2:üïoT]IlªÀÈHª·2Ó®…×>f_8Bþúb$êŽ|0[Šæ†¶®‚Z°ç¡ +k×~´…Ë٠ȩƥZ0ÓJr¡Ž­¤ÛÒøœM†?¸(|ßK;š§Áe]O߸K‰L;®<¸t¢ìxBÏ‚^ÄtïÃ<ø¹n»ÑcÛÒ³bÓÙ†K ©z˰pš5­;&:ðÍØñ8ž_ø`[:vkÎSW|笠‚ñÜù¢Š‡{‚ÈÚý%MTú´DVWülkiqt¿>:ðÄë+$–®¨â™ÔzÍݱ6Õ|_¶/P<‚]Òìíyë|5AV³¥²ReŸ2(÷OZtiÙõ;Ÿ™ gþ»,ï¿Ë¾§‘ü ö—Œ%H„5ç&Æ,EʶÀ£7€v IüÀ3–É;xÖÞÝMŒ±¦¯ÕßÄgI%c‰»(XMSÜ,g –³–Â'ÅT÷´ø ÔU'|ªÃž8½V§*“'´QÀå4b cÙÿ =¬¢é*Ý !æüÒmÑ‘Ê_²¨åÚ°}U²]¢ÞO^:LȘ+,þjϵóâs¢8å lÒ†¬é]¬¡7‡R…R/oŸ€lsç0ºss|>`Û}zôn\þze«žñOîrÛ¯_Ö×}ôÏvukç¢*pt> stream xÚ­X_oÜÈ ϧØœŒz'óO#ɤ×^›¢@ ÄEsyµ³»ºìJ>iÛ÷éK)íÊ‘w/«‡âòGråj·’«¿¿’üüËõ«7?¥fUˆÂi·ºÞ®”1"sùÊ¥™Ð&]]oV“·ÍÅ:ÕirzZ´7¿ø*àÚ&-oj)³µTk©éýÍ9Ù]¨dm$‘ª¶ eÝÔÍîêâÓõ?WJ ›«µR¢HùÈ¿–¡¼ºXkYɦnž¾ý¨ryIKû)~-çþ؆cÓ_Ïû[ß\’žÿ¨w{þò_í¯~<´½_ó®Ùø{¢ÒÌ&ÿ~ÿáݪpŸá¤È'Zþ,Syýß+:æõkxUK"'ï½ ¡«o†à{ðÊ™ ræwÄÿq×ÇÛ¶ eø€jßÑÆë/¾{xÄïͶýÈ~²ßüd²³ ^§¢ÈÌj­á$•ñý^¬­vÉÖßá"ƒ :}s¡óUFJyw‘%íè=ì=}7ò¤Eæ/øt•:xYNŠ l“tfÙ tÈ× šT8mF¶P~ŽRYMý³4Æw¬ëÐ톨/èÕÃÅZ 1ã×ѱ`§äÍ®â6*í› Ä ÊP1Š­Ö£a:i»zW7å·ÁÌÔ%õH-±‘_ølöºà7âbÉ"ùÐ=}Vʾ.ꉰa9MË‚Y&È,ˆ8(|Ó»ýÅÚätÍݱ 5*or•â ßѲäúè×›2x¢F5@9'UònK´°/1×ýHÙËÞƒ_ ä"§ŸÓ/ÅùÐû ì§)8,y õÆoËáàÐTæÉõ>’¦Éø¤ÃR: W6¹«Ã~ƒŒ^m6wõ=m• Ö•bÛ•GþúìÊúxjI½¤/lMrÛùÊSH«_oy¸yÇÁ;ƒ¶ëmtþ×Á÷!Úl1€ðvKÈ>ÞgñpŘ^Há{ÝQÉFÞh·üqô ‡ë’òßPúïÁ>›+ðjü´GÎW› ™ås+Ë1ߘ¤Ül0·H9}v08ÔË Ãµ óñ>sÃþÏ£ÿ±¶¤JEƒ  ÀQ¹â+#gg‘©œþîC7T¡í–@WY)\fa‘ “秇å«)Å*Qª²¡Eyè[ZMP÷ÇóbÜaSCô†Ã½m;ðg\u%^ù3ñ‰Ùx@[v‘N@¾óž%øääÆ\—`S5¿ÃÉ=kãT²š aÅå€Xø„œt$ü«ËC4Æ)ŽJXô”ܰºCˆ-Gxq˜p ¡ Çgf*%¿µí² :Ÿ®q†ó(7Â<+ ¥èk<œç¦ø°3JHõ(lý}åožÖØ„žqú©”K,À‡'Ö¨ì4-=mj*0‡’¿\°\"Ïí™åß-ÕZ+Ü)™¹*¸â<|µµ"Í î8|˜šBl€Ô•³ ýC/™pû¡?ãöØ=R:M¢™è—Šš»5ož{UKm×J®•ãþp±Ûš¸2æÒÏråÌežå*˜Ë.•æ‘KKæJŸ“¥s¹g¹4seÏræÊŸå²ÌU<Ë•rÓ«$ß•[Ÿ6ƒØâ¯ŒÐÌ•s@»S8áçL”Ö¢8e'W -Q¿Ø¶‘:5P¨w6VFÆ4±ºÀŠ‚íp8Ðô²Pýާ†hX]‘«‡–ySvz;«S=ñQ“;Ü„uè=‘£dÛ3a 1@J/ùw–êüKýÝ£\°€¨…yu5Ì ê1``NÅf'wŽš.— ­§ªRÔå‚ÇèÝÔÐ)-è턲Ӵ²$ʼntR¥ûC¤Tß2è)“ƒ¡È.Õ8©òìÅBÞßö¿_ÈmW7á)¤/Ó”¢=ÖK‚ŒNš  h9< å^,¥Æ¿~¿U·‡vÑ7Pe‹‰©#j&š«L8gçèRAÍÝ×B­ù fãDjqÄ’ØI×܆Y«’cÛ#R B©¯QKî`pûÓ(¡Â‡Ö¿ª´ô†­>Çi-ÒÎ݈¬ÞÌš»Ñ»¾ô~ N(Î.m÷™gî‹ü=OGUà™`¥¬(ì#½&—&ÐŽê甈»)OytåI7Øš=,6£VX}£¡†âvª›ä’ʳ!¾œU’ñT¬ƒ—ãüáQ<ú7­n[y²Í’~¸é}Óû—º¤Å°«°‘>ÁØ q¦pE 3ôhα<‡,œãGžŸþŠ­ér{ÜË5{6¥|ñ]x÷D";-²yCÆÁðV@vÏGÒ8_c Rtþ xÀä™ 70í´cßùÝ¿4{¦ÂóíÁKf C 'Å8Ý™'¦»Ìˆâ‹O£‘6Ó8°Å›þ@^­A”20÷¤ÐÍÉ‚x³Ïß®_ý™S endstream endobj 146 0 obj << /Length 2249 /Filter /FlateDecode >> stream xÚµXK“¤¸¾Ï¯¨›©ˆI˜ƒ#ìY¯ÇnïaÚ‡Ý ]¥êÂKA¨~ü{çK ª¡Ç¯ð )•Je¦2¿L‘n6éæïRùþþîÝÍ÷¹ÚTIe•ÝÜ6™ÖIaËÍ‹Dé|s·ßü}>ßnššîaûåïuìH7qV&º,˜÷îè¶±ª²èÔº~jvõ}+ ûæ—Tk7¸nG”4j:^™üÞ{ø”‘;Ö[ø<5ýÀäþÀçç:8_ei¢ò ô ó_¦qEIÐ0/çéA~n£¿»0“ÏMÛ^Í“úñ±=Q ±Té›X©2)Û³¤Ê-ËeýKG€ÆðUËÊ/©JWŒ°&©ªÜë÷óŠy¢Ôl$Hɶ±¶6êYß¡žú!ÙÆFÑ_G¼):n”å]S·¬ ¸9mÁ¸©é»÷hèÙ‰~»º»2a_#³Ãm1 Z4¿nÅI qœ8od¿pʈ[$|¦tÕ6r/ÓPï&ž€ØšG÷õèö<ì;þ’»hМ\Üt{÷‚¶åÚÛ†kM·\½Ì[÷´ë];аC c了iß“’é¥z i¤£†ö™]VDý86÷hkëx™­—R2õ4Q9EîÑA¯ÌõJΪ‡÷¼ôLS÷ë{^ÝS¿Êá11âñ‹&s'G£>n×wû1!K2såmL@0s‘%IZY?ÍJ€YˆÀb °<z<û†k•êáá|š³)ä“ÊßW•“sHɉçáɼod@VT‰¶ÿY €MF9Éúí÷ Æt¨[Õ;Thç=~aò‰ÕÙ¥ßÈ.°ohvœêO[Àˆº=;ÁˆÃÂÄ#£Ü©$e€^·c¿€H1ƒ¯îPþ±Æ p"ˆ3GÄE«¤Î¬Z^R*7´>œ»É“ €àë¸#ˆ¬Œ*˜tªÙ vOd?a6¬´î0Å zbÒ–žAoÜÌ!ÛÐéôõ'ŒSÝíëa¡ºÀåŸ>ÿø¡´)D—²ŽnK­€ ×lWÂ9KˤHu éÇ?ýßÞÆß}ÇþüôéÃí-ևϟ .WŠ‚V‰-‹‹›K#Ì5á ¬ÿ!V ª'Ww£èô:c pœ™,ÑÕÕ}!Òê2çø„ï‚Š0©ùUJæ¹­žŸ´Á˜¯w:"tT%#,rÁ·s;7Žc=¼^q8·-‘,Œæà™Ž”°<ñP%ÚŒkÇøÕ¶àŒü|·Å:‡LÔìfé«™èØŸ1b¬=T½Æ2ŒzÙ20ç25ŠüÎë,úºæáH¹" [Óý‡šÓœ]èÀ’F*M ò UÔPÎíž§-V=pÝs3 CGUÑɺ¨Kíy/€(Èh蘔<îÔË¥2¤Ëšâû:((1× —<`@CñÄic>!SZbØ¯Ô Ÿ}R©¸ìå‚^¾–\[©o\ü0XÛf×LN@Ü?ERÍ<ö݃ãWaCé-'=C#ÌÓÑ—]BUA>Êžµâ6Î(FOY`qý/Jq5 WâÊä ŠÕžnˆè¢UÚ@.‚è‡É jûè–ÊE¸™ã&®‚–P%V® ¡ ÷‘[¿†-œ¼0!j†m©}º™ú7P 0Ä,eŠ„&€¹ôgܰö`È×çAŸªù<ÖÊ!J%eZzF‰ÁkÌ…ŽwQ"bQ3(Ñ3 Ö¬"¡GÌáº%ø„û9°æ\“˜elönv}OÍ8Ò=s0”:©´]éÜfüÃŽ°À  Ýá›Þبt² ˜‰>½»s«,°ºbîÕ·D<%ãqpFBÞí+IG;Gñw@J·‰~.RÛÖ´üà4*›k‰åZ¼üâÃÑüâÃÉàâÕK;?R´¸hNMQÓ]= $Îæ]ÔÞàÈK#ðíV>6e°Ò¶ÜK¸1®èôØ Ïxdާ*:z~\Ãà ÒkÑK§*&u{U%®«8ÅE©·õ —ö&DcB_æ|W–¼ÓŸ'¦ù'=ß,wéH?ùÂL ®\öÈ#—n¹T0ÍתFº¤a"ÛE„ñö•«=±FÏ@N5‹j®Ü—”Ú;Ÿ¤vçv’â%fyüЖ?Ý 6Þßî©©—xðÏI¿³ð;ÇÇzçàêêOKD2é· ä9€®—¿½L£¼™l¾êФ*æêñ›©¯*n"ôŠ m›š[З•'^,2bhK ¨˜ñÇGt‘²ÊDŸ°™‹ufªèÏ=D®ÊM>¶ýèäßB™(7_E(L]z#O“2³Ð`À#3 ³Üš|a΋˜‹|-2fÙjf·iìå"­P© ¤¥PEæ,æ¼ú¦l½ˆÒ ØM‚™I+U-³ õÖú›²ÍÌ®+”]è@ZY.²•©Ôb¤Vè@m×Þl³ì|ÙlÑÌà´Ió4\ÖT…̶ð²)Xt’$k-…@L3ñØF]0bȤg¾ü—ágÄZI5XÎû$~¼LW¬è3ø"Nz9þå„Bþß GÖ²uÇÿsÎÞ̱" ZÀ\ýoiË"«úo“ö"ˆ²0±R‰U,É“e…ŸÐ%OƒT€5f~3ø³0±”Æ\ Bš‚² —ƒ5]º*Û¢PveCB0SÖdAR†_%Öµì%±4ä+B‚™Wë@¶ù`²ÅŒaüÁ,Ë2ø "‹2õMÙ‹b™™IŸå$ñ.«¬ÌÃ"j~ñ¯å,þ„æ_UIYJ –;þp÷k$ endstream endobj 152 0 obj << /Length 1954 /Filter /FlateDecode >> stream xÚ½ÙŽÛ6ð=_aä¥21¼DJ@Q Wš- ¤@h$(d™¶ÕÈ–#É»ë|}gHêòr>¤O"‡£áÜéb» ‹_^PÿýáúÅë7B/2’)®×›‚h•.T¢ Éâz½x}¿äi´^—]Yòj ®¢»%‹ºÖ­»zsÕ•ß›ÿ¸)×åa‹ $jO«ÖtݰÏãÿÝ™åÇë__¿IÄ„ Î$¬50iØ”MÛ9´·<#"Mz¬ü°báé@©ÊÄ$a‰®; ”µ%ËXJ]ð—E tˆÎ’EÌɯ  ˆx,›²ÃµŠjÐÎÆ-w&_;äÏ.º¼¬ÜjÓÔ{ô §Ìƒ2Ê{ÆN] :°ÏHª=4¦¨÷{sXß1/–`ŸOK`'ßšWU o<{ƪÊìÖ3U7N^¦3p=—·ígÅDD«¼uwð‰‘|ÄÊnWŸ:w $‹á/¯1À_Xd·C/Âã¢>ú~þiàkidŠò²hÝq½±Ó€i¤”QWîýª­Ü‡R³¨-÷e•7ýûžZÐÿ«öß°i@9B§½ÒWç€]˜ ©ܳٞÀ*¨h ¤ìؾpXÅ •ƒÃæÛmc¶ygÈ—º\¡9Yöx@ i¢”¼0¤ùL~÷ÇÕ_¡€H8áëÉçB!{wPîè­±‘,DT¢-„ô¦ãÖn˜ûÜ¢#óÉíêûú_d´Î»Ü MÀt ‘€qÏÿwË8LbsÚÐ}žy÷÷]±×¾rTPÉÀ` /Ó7{Âù Kæèß"·÷‰ ÖOžM d!Ë€±µÌ µ€JYêpßÁKb®¸ŒÞ–Ûh†É,ú­†ðäŒÒèǪn³ˆN‰Ê)Õ1e1åN€„*2PŠNcºßIà&¡’MÏr ¢Úb@ç‚zB€ä,M§Ç“3‘!m¥¥-'¤v¦¦€ÉŽ+ÉFd!8 õ(ídD×Ð¥ž&;ªÚ…Ì¥=aL"ºSÀdÇã}§ ŸÑV´GƘ“ÿs¨\l´%¸Q2Ý2¹É‡”õ<íãœW¤ &w>°¥l l [ç˜ØÎíe`Û ï6¶ööY í³€¼ÌÂfòdPá4€·ôéd·!˜OˆSçÿŸ‚L'é³ÉxŸZççöëå(&8©ú IJż÷Uh7)f@r­ù°cBÒdz†Èüá€ÚjD—ì”ÅcÓãù™‹°Çhë#m.€fJ;E)K&È6f^Ï|¢g¸ <2Í„»é ;ì™î‡.ò”Bçë£öÏ]YÙÈ¡}±y¿ ùª¬ 9Åut“?ò•kâ±@ߨøtûü“ݵÍÜå @aÝUç@_ÄeB=ôÒ·»²Ø…ZVÐ|´¸ï&áÒ¢¸õM·DP6Ï‹gd©>²„†YÞÕ¶/D§³@lbí£ÚïÿÜAî>+۳â2mëS™Û,»n ;Z©"‡èó!üp¨&ýÅýŸž¦Œ6yÑõ÷w»Ü_P¶!Z¹~ö`l?[Úù “aíÓp>7ˆí-WM]ùüi‡-‹Ñ¸NmÈ““{®—)äeŒSÝó+˜^bÆ1Úh¨€¤ÐÜ©jœù¬§iPú\éö©·”½gÛ]ouX‚`=ì€bŸ=|Ó³mÜ¢85±s’ 2L­óîâS²÷)ƒ3It½3è*xPŠê´¡,EÒ¡ÿ Úð+S[A=RHzÚLÛž»5ÝBA¶Ï&TìšúâG&ճɜMÞ샄,?ò?úÜ5Ï#Ó„½É‹iúÁ^ÎrÅ–€B• 1N-±TZã±Ë®5z•dàzWƒF‡•D¶õN8º)sîz‚_ü»‡Ûm!†›ÒN¤°3w›À­¬ŠžŠ ÿô~×ùÁéå* ü\('Dð)D*5ç“UcŽU^˜~u§ýCGHåÐ<ŒNmoý6~Ò´~PäøžÅ,g_uN.}BIªÚÚAŽ>u·åÊ2YåÒºlL…ÆB?ŸLsö¼Y Ìù_vþßÁÎ}±ÐÚ›;IËSÉ,{"áe„¦ƒ·×à*P"þ1…ÏA‚)’jy™Ý]Éå:‰N­Mz¸´¼â¢1ÃFWöY†7¨m$”D=¼ uCµ¼´ XÉ'žÇR¢S5'4ôýØ‚ŽÆ³÷Ä~;o¼´¶Lõ•«iA÷\¤„Ñ‹¸=œ*ß®hm_c Ùz Ûƒ¹uû©Òí ¾2¹#g~5ܤílØj=x Xá°˜§iTäþŠ1â"¾Þ«²ÝùȽ(Ö.ø¸º¯L!ˆŸ„@7¦é®ˆX¥UÙå›cpîÉ2’àÃË´÷s³ØôýÃ>Ì>ÐËÓ9÷죣òêËÀÕô‰K{±bƒ˜³w˜ðÔ¥9yõÙCɬZΧ›YæyÖtóЄÃ!´¡Ÿãr</q+ý¶³Ú^Ò/S…ʈ€tc¤B…´³Ù?_¿øtbÁô endstream endobj 158 0 obj << /Length 1737 /Filter /FlateDecode >> stream xÚ½ËnÜ6ðî¯Ð©•#Š)H‹é+uÑC´–ö*ÖÃ¥Øû÷áÚ]Wn{*t 9ÍûÅ4ºÒèû³Ô¯¯/Ï^\YT±Jf2º¼‰¸LÉ2’…b™(¢Ëmô1þ¹¦©éoÏ?]¾{q!Ô~%¼d¢T„y¹3çIžñlÝFÆÃ ¦¦3ɵ¶fKç¦ßšGc é¡™vMOä q,Ž„=¯€#ÿ8ÙxÅTVݶÃyVÆžöÍ9‡‘öÚÚ¹»Ÿš¡·^ªÖëó~ñ²wzk ªV1™ç°á¬*$1Í­·hŽDi<¡Ê¸yLôcciZãz–³ ÈV¹³ÍІéË =þ°¢b–³<©3Ónpo‰M§ïPeã¹;ã‹1­³æS\þ«q¹ÊÎÍÜ×h¾j‰HK–fܡŽ~¼lê;ûz þ_!/«ÔâßÍyRp?ìšõÙᔊwf;55¸vO fkzĘš«Tä.Œjçó„ÇͤÁå׸mÑ£JÐSñ]§Ç;BmÑ~*®u€Ý@˜8·{¡N¹ÏÑ9^äñmóŽǣˆ5-ÇqŽXRñgSOÌQç9«–òÄß™5“f%“‚/íLù¼% ÕÅ’ˆYÅc´Š‚{Ì2Ú5ÁÕ'ì”`|‰± ÝÆ‚§O8å9SbAÔãíÜyoukü³ ׫4Kõ< °rp±H—ˆŒ’,S,…òqbÑØ¹E"à;§ ¬š–/èH0&¦4ž1Äqµ3øýãO>ƒEçd!Êi)|`Šf2þ©7þíÔ­<ƒ{ªusã™ÒSማ5è+‹˜`ƒ!K@´®”¯ËÜîýP¬(Öà i YÁc ñQדÁÈ·ylq?pl`{KàÀ…  Sè1„@1nÐTâ…|Á;JGŒhŒpŠu¯èØŠfÀ@k==™‡´zæc°zÒOà”y[~ É“§Uä*-Ò”ÔÓØ<þUkCH!b_Y™žT1Á ÅCÌ~½Â¹`Y¶¤O7ôÓήœ Uüg: +_«•ÐZdv’™yI¸ï0æP‘4»â"ï³4UÈã síoøÉMÿ ÇÕ›<~u?>ûÏþé XÓ_¾›û¿ÿ†1ó@ñ´¸s@U*mD\TR¥NŠ2æíª˜“%¢dÒÂV¤§ls¨2{¶LWªRPmú 㻌mÓÝ·.ú¡v<êp(©AÐçFéú¯/ñíN·Í„ñ»'02!ÌèJ<üsÈZ$äF€¶Úm»Ðse…~¡yc­|˜ÐQvÀâDYæµ°>“4ò$iP—+K¢€›?nø§M§?#sù²š,J±COþßreÓ5ý"ÖÅ«÷¿¾Ù€Ànú—?þöþý¦Ú—"$ÔÙ›Ë3ìŒiÄaH,¡qUQ¦DTwgžÁ<êfÆ4:ìÜEøÃ^¼íxôÝpö |á* ÔOŽfd‘²ã!9Ë Æ¹÷›`Š.Ã0Ú9]…º ›kvsKÅY·ÌãºÕx´–po%uÌ/Ks–¥Ë 0øÉ†~"ä@!“µFÌÍ ­Ç´Nó)“’I¥ü€ï굋s÷æÃö˜ÃL1Þé%äa®ÆCC-¢ÚN”;æV×»†ÎcRZÊ–Êͦrš‘KÚÝM?ƒ˜í†L©ûíZ~=8aáõ<‰¶(£|û‚µéëa¼wSâ0R#Cèn.WÓRÏã¸LB ^ãÔ‹‚%‡AHÒîzö¨ýà7ΘÆ …n÷k=yi²C×9™D¾Àf?7/.¬æ±nggc?´Â Tæñóé[ô@Y’¦0> /ExtGState << >>/ColorSpace << /sRGB 163 0 R >>>> /Length 3078 /Filter /FlateDecode >> stream xœ½šI¯·…÷÷Wôòi!Šó°´ ;€H$ à űB[ˆ-Aþ}jêÛ§„öp_€,,é˜_÷%Ù,Éô½ÞÒöaûùöêÓ_ÿôåöý§[ 1Æ ÿüôýÇ[Üâ6r$½•.ýòÃöãí/ÛÏ[naå­Å0ÆÖû ©oyP #Û>Þ¾|w¾=†LÏâŸüöWßdªÆ»·Ä¿¸Åûª[é¡§­Tz‚°Ÿ¶'zp¼ŒéeÌÛ«MEYâ‹í݇Û×ï¸Zö“_½½øÉ·_ý™þïhÛ¿oß~G ûÇ-m¯é¿·$¿úæF­éc+3̹ýD­ZÜ•û¶½ý¬\UÍÜZ\CÊg±(,¡Í³Xwjt=\×P×Y, ‹GXí,Å#…ïŪ°¸†ÙÏbQX[iÒ=Œ€HJä¾*PB‡fªtÀ:J%Æí&P‚fªtÀ:J%‘ š©Ò5è(•aÂxP‰Åe†fªt@ :J¥h®„ñ ŠÎÍTé€"t”JÌР™*˜Y¦ôPé€*Œ•˜<ýŸ€H(R t”J´0a<¨tÀ :J%™¢uœeÒ&~D:`…Þ‰@*!ãÁ¤zh‘pö<;ʤJ¨‘èaD"@ÑZÎñ`Ò%Lh¦JP↎R‰Eë8ǃIÔ¡™*00wšD ¥ ™*P1štÀÄ jŠÖÍT逊YÔ¤f¨0T"@Ñ:¡™*Ð0—štÀ š©ŠVȧ&Ð0£štÀ š©ŠVȪ&ÐC„ñ Ò+4h¦J E+$V“è¡D:`ab5‰E+$V“èaFD"@Ñ ‰Õ¤J ‘!A3U"@Ñ ‰Õ¤jˆÐL•˜XM"@Ñ ‰Õ¤h5 ÍT选Õ$­å&@kJh¦JLL¬& hÐL•h˜XM:`bb5‰À Õ%4S¥&V“ &Œ•P´Vh¦J4L¬&@»h¦J(Z!±štåA*°x›t"¨±`b5éÚºuD"@[.Ø+™t@ÁÄjÒ´Â,ˆD€¢«IÐ ³ ÒwM& h…ÄjÒ´ÂLˆtÀÀ½“IjÂÄjÒ5th¦JLL¬& hmçx0逆»(“˜˜XM"@Ѻ`<¨t@Ãm”ILL¬& h-ÐL•h˜XM:€V˜0T"@Ñ Û(“è˜XM:`ɑƉÀ*¸2逎‰Õ¤VXÐL•4ŠVH¬&@yp ŠVØF™t@ÁÄjÒ#ä€H(ZaeÒ«IÐ š©’0±št­0+"0qeŠVH¬&@+Ì€HLL¬& h…ÄjÒ ·Q&01±šD S„ñ Ò ·Q&°0±šD€¢µA3U: cb5逅‰Õ$­°2逎‰Õ¤h… ãA%­°2逎‰Õ$=ÊYç˜t@ÁÄjÒ«I(ZaeÒ«I w©ŠV<ŒT逊‰Õ¤HšD€¢«ITL¬&0qeŠVH¬&ÐðhÒ¤&n£L"Ð2&V“hx>iÒ«I(Z!±št@Ãm”I,L¬&]¾øíSóÄ#ð~æ~u†^ 'R…/è¸>'àz'Àõb€ëé €ë.àï#~æ}¨ÛÒø€…³^eçãÛ§×/HmOï?n1¿øn{÷š þ™ßyÏâÊâEÄa nÉï?œ¨´"†Z|ó‚öÙÛÓßbz |–KÁõÌjdê Zûß«ñôæý/üûü´ã¥lñÌŸ/Tù½ðôÅ?ûyÞ.§g„JÓÊHø޼ׯðŸÇ>B¥X£|õÌj4¶³Öňü×ÇǪÑÚàé3«Ñ©4]V£ÄªÁ3eþ•1qÚ›%'®¬ù›” û:ìÍ_ó@Gâ÷nd§Õ'þùGÝÈ+×ñ>˘†™7 žV€P D.â)Ý Ó8{G9ˆ8ç2ÕB°­ú¿Oh²‘IQ’(wxD>ÜÅ‘‡×£ó¡÷Òømñч ­Ã¢V»=ø¶˜Tág6úxúy­¶§ŸÙl{ú²Ýÿ¯ÿÙA¯È€¼2³±üÊÆòkCÕ—^¤#.móz“’]¤á¥=mMw»8ÃC;±Ô«1YÿÚíbL¦†Ñ_»]„É´jâ,is¿¹s©^máüdz‹-ì˜6~•^]Éyòô´ÛÅ•L•« ëÕ”Lµ‘R½Š’{ç©a·I'Á]³ÛÅ–…a»YÂ^\¢å" ˆ)‰–{#¹ëâ¸5’Û:´dl¶M¥Ñ6geúJIÞ¯w>¤»h¹â‘yíÊ}f7:¸-Qx½À‘kçϺ×7x‚¡¿·5²ºMû1!²ù<µ\._°¢õ®E®I;Ööm²;“çõ&E¦ÝåöëÅ ®ÿ’úè= î,Ïë|ši)³äy½‘g±ßÓKÌëózÇíTí½Ò—œ¸íÇ…†L_XÛ«Xgé3}Å´DËuÖSµÜ>`S¾çq÷@ý~Õ E ÇÍJ ò=Ž‹¼„”çm®×õå~¿&7c?nðºE‹ëŸ§Æì‡çÏά|óôóœ:üÌÂgÝDkæÈ«r7î‡_ÏãQ¢Æüx1“…×mu^Á¢ÅmÏãh¯šë\ùžæ¥çž×<”[áxÛã\^#íQcœÃt©n‰‰‡É~¸à¬‹”«ËsÖ86S;Ó´”¤?4«å\y¹³6ws–þQ‡:­ªß× é§öŸùÏü™¥>f7ç8ø³ì‡ÙœæQ®92Ó÷ªÅ;æÏÞ¸?Ì*αh|›3œÖÔx0#˜‡aæúšïËaQºh <K}Ÿf\ki¿™¸)GíólOÓÒµheã-ïWG6Ñ÷(òûjÀòâRú×NIÍfò},'š–Ô_ÝÔ4dØì‡—Êa•äýê•&¯]xµF9¬ª–‹šuA¹>(‡>¯«îÿ&íS[Sú_ÊÕÅÌ4í5y¿š–¬e|™GÉß[âÍ,I.—ö›ÉZêgk Ö2™›¿Èa&í3;1vûa&rXIÿšYÈa+ñcÞ UH|™˜[çaµ NR3ú2=¦õU_/§ÉÓÊ~¸z9ËÑÓ~˜x2-¯&÷ŸäóäÅ«ÖW×=iØ|e‡\Iý¤ýðÛ2mMd¾7?¿Ï”ßWûŒÇ³ô¯¹e<-vé5ÇÍŸO¶Š’iQÞ§ÖOËKË¥ã™_R®IM¦Õý°µx5 x!oÖ¥/=Ûe¨†½¹È¢Pÿ)[I4Úa?Kþ,v´ÏS–¼JòiªŒò»zlÏ™L¨+húrÚ@=’§yTâÎàÇÒ´bÇíÔ½2+ØáúŒšTl©=³¶WÚçVüeí½KšIëYgO·ÿ£àpI endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 812 /Length 2127 /Filter /FlateDecode >> stream xÚÅZ]oÛÈ}ׯ˜·Æ;š;ß dãf ‹,lhëøA–¹‰ºŽèÊT›Í¯ï¹¤E‘")ɲ„GÎÜ9÷Ü3— %œ0JxAŠDd¿„v(ŒÐõV˜„AXcEá pÞŒ´>F´A£Ò‹„&:‰ä%e¢@kRÁîl,îʈû(È',FrÞ¬äFq‹´°:ÁªÅØÉaX "ï1<Ê„#%߇ DÀ£ÂÈk”¨÷À ]µAx´”H½%ÔEPÂh£E @†ü ÝÛ0 à! _ ö‚VÁ8CÖ ed‚”IX•ÀŸõ% œ.Å„ÒÀãFÑ G4:¸¤´ˆìúcç`$!2ÌCbÑ?¡}@ Ð=Z#@»‹hK ®)E#R¾ØSQx z¨¼†k3Þ(!˜ðŒnLÌPäôòpŽ=Ü x;BîËX³UÄÄGV„†±dQÃmRäÐR*HƒO YP) Ϻ3~bŠ­Õ#Œ,œ†¹à¸á`•  à5×ÀJ`»Lka±„ãqHˆ AMQ:A6‘@+17jðÈ”¢ˆVs‹Ü êŽC€à 8&Ç@¬ ºŠäSô£7oÄøRŒίr1>¯³i1Ëç’ÎÄ?Ž^}2Áã_ø¤”úÀ—9_ ¾,ø’óåŽ/K¾Lë§³úéülpÝäŠ/_ø’ñ哲ŠËÇö°ƒ-ë­Nåð¿5k¾Õ]{P-ok`ƒþ—ÿTCZž4o¾×ƒçÍêYÍߪfíg~¦º5 mÇfV1«‰›ô…jˆ™'¦ àoõØk÷>7¡ýþPC+Aþ^ß~ÞMé Ú»¶46¼î½k·štôtË—Õ§m?^wDQVË-.Oj w‡HÕÿ”/î²EéºÿeüaüîšÊ¦cZˆk¤#2»MAdš´ŒÈ¶œòÒ%‡voÅöƒÿqa'#qæJi2F+}ÜŠB… eêm@Bà|Z$wH«QOý0º©Àq±€‰¤ÓÛ$Jë•D:¼‹>Att”Ê&¡ mk"x²[ÃcN@ y©’Æ™X$ÚËwRbNÌ…ù­AŬ·de2»¡œ@µ&A€ ÃÄ(M2-S؃•DÈD@áOÉ€h$¥ÝXìñEkèàwyNA¬^Ÿ$Ñö5Åž€ ¡D~·ÑŽqA’ÝI‰=…h±Ò*`0^†Lçdwc9Ášb°áXlÈFE¬)šßAJ]îÂÃáq' ³Åbc×VaßcX¬–Ù"<ØÞ~Hò«G’4C»`÷pwÔðh,8iÉ`ÍÕ!€'¿5<þ%0”  í :ž¼„9EÀ!¬q¼Übƒ‹ý*™ÎŠL^ƒ…lù–“Qóö €‰¼ÆŽì‡1Ùb–=“ %=¿p¶¼¼B XC<~i+£a$‹¯Y±˜MÅ(‡!k$<‹6»‘|Ïó&ˆÆ9þïÿø§(Uçù[„“Ê‹ùòþþf°©)›zuÊØ§­3<±ô^mYyÞºvÛ÷È)J¿ÞcƒMú)±J$óôÛ‘Hnõ[‹äW¿H«„Å‘ªfÇ¿.òéeJ‘¸œ¿ã«ì[±yºßÈhH…Í”†¿u”Óðg“åÅù‡… ‘Oð^kº]MkX)Œ/'óâk~·¡þ¼³—<¡©émÓ^~J/âL‡w¢çðÞpŒôq;Ø—®†Èê‹ß{o´Ý>‰{#-•Þèý[C2lNã¡Æ»‹ó´_c^|ÚÓ2Ã8q١ȶV þ(™:KEK¿¸áï„juƒ-@SŸäëèP•è®Jô¡*Ñ/›Ê-÷_,C]ÇÒŽµ¿üÛmwÈ¿¯±ã•'Õýë Mô/Ó]SPòknvü™Û®nøã÷jݼL‘¦ó:?‚ï8V:‘‹Ïˆ\ìY^b’1˜ýkd¢: )úÌ6É Æ¡ÌZßaÖÚg1Û8VXsÌc… ^òÿ{p|÷N˜hÊ·bŽÏàYty¬øpùqóDaÝþ1o·]ÍÖ„ÙJƒal„k£Èñ'ˆÓ0:uèq´?Yí¶O[jPÒhý‚³Ú0AÇØß\ì’å!ëÝ"›pö{>)2ñêüµVHß8qü¿±Î`.¿|v5+îñäBü¼˜<|A¢&>.‹‡eqV:u·œf ~jË×AOcå\uÆÃÿ‰tŠ endstream endobj 166 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 170 0 obj << /Length 1716 /Filter /FlateDecode >> stream xÚÅXYsÛ6~÷¯Ð¤¡:B?t&GtÚ&“ú¡SÇÓ¡(HbL‘*Æö¿ï.¤I›nÒéåa¹X‹Ýo8\ìáâÛ“Ð/ÎOž}#ù"gy“Åùv ÁÒ$[$2e\ÈÅùfq¼eøNÁoT¶ÍRðà#þ(m«f·\‰Le]£ } Š‚®¨ëÛeœ-/Ï¿‡cÄø˜$ga–€î­Ü^0 ®zÉU”1‘¥$ÿÕr%¹ ¾ ¡3NÉãàÆš•±·µ¢Ó­²ÖOË`Ó*ÓÐ)I8V'˳^§3ŠHÆyÞ XÚîºÕWDYÜùMÛ¬@Ï\P¥u·õsÁâ4"b¹L&÷0ÅáX«ß…ÕÕÍÅŒ~™`I’|¶z< ÓU˜Ìl$–„ñgot9ãºU$B–òl±âp“È{ä"º¤»üô|fÓÐ gsîL},‘mKÌÁˆ=£3Þ§¶:¨Õº`µyàf´uè,§F¶q\{#…V‡]Ã#¾çŒÅ ‹#ù?X5šõ@¥±QŸ7÷,Gð#³¶~Òë¶ #ú~6fƒ1’•¯Ø¢jÀ¦.~QÈbPubÙW…-Ζ+æ9„V·îÃîB„§DÅ—xØ¿lëîИ3’ysTÍ)©ù]µÛû•?´×žzY·àûǾn6ê6‰doßüüú—ÒžºÑzxT¢¿Ï=£Sž<všlü%kŸ©&`Ý);k««]Õµ7%¢Ì/’Áº(¯> SŽG,l0í§ûÓÙ?‹ØÇP 儉è¿mö7A+ÿ-ÐÊà-hÿ¹¸•ÜŠtdÚ˜ÅX!dž=ßW`ÑXFÁ¦z ¡´û ƒ.3µ´æ@‰]ù/š¤<ŒÂÞ”üHCh³˜?¶ýÚ‚:^ûu®> JûÙŠ:’ͼúiÿ&DÒR)„Éþ¸¢Xƒj·ž €l5Ñ£›ºÀ º)!ÁNdMÄ.ÛQ¬cT!ÓùFÓ#¯uaÏîp-4¾½‘x÷íÉâ Æ~š^åp§>©ñé#jœ_)z…ƒ¦Ã3üºÂj‚Ô#y!„¤{—|ÒÍ$“â^—ônÇ>ðÚêJ5×3ÀWÕâmQ*b9ËÃèÌMÚÇ“W䤸ÁK‰EOö<“› yè:*þRľoðŠa†++ë¦dP ¯ïŒ… Ï4!‘ë0»WuáAȬ”àsÑÃí^$&ÄL¯Õ»?«,ÐÞמ!."È O q„¤áàä*³;ÝÏ`Láx(®|ËÄs*ÃÈ…´s;•7'Ä)|.ŽB¸{|ïî£.ç©+éɤmrßP4‘Ø-ÈOC'ú¢ò‡Tå—7­g@ÙAÓyp5E[‡8¢M1ûaZ=–q±ã¸kâ°-9BûQ•]]hšuî`ÓhŠ’„e)þ) Þ ´_M¤¾>?ù>äc endstream endobj 175 0 obj << /Length 1609 /Filter /FlateDecode >> stream xÚ­XKsÛ6¾çWhÒC¨©ÅàKÌ´i§I'žjß’` ²Ñð¡Pç×w_ I…nÒN6Åb±» %«›U²úíI"ß_®ž<•ëUW….VW‡•JÓ¸,¶«"/cæ««ýêMô‡õÞµ7ëMºM£O~àÁíz£"ÓîkËs+ƒ½õÆÕËõ»«ßA|:Ÿqžoápü§ÝÕf˜1-'Œ›À¹QÛ8Ý–Ìÿú'$¹•ÑáÔî¼ëZ&߯õ6êN<é-ê÷a­¢“ë…}ß­7Àbfi;σƼǭÂu,“»Ã‚ Z%q¦FúGMH«¸ÈòÀçZ<ÁÛ¾5u}¿7]À!JEnÔîY…Á»ºF™«Î“8)Rp„Š«¼`i×lü/«èH“nÜu-$ßñ·¶ŽRv)ò‘ìíe¢È«`ÍÒº8¶á®±›k3XÙÔ6yýewž ‡N8e_¼ÞdºŒ® jhR"¶ºvæá@ƒÎH³èÖRÈÒ4rýmXãà‰ÎÍñ\Œ´gboý©oížÐ7ýüûüU¡¦¡*â-¹HZÔz žÉ8 /BtÔþ4 ýiBÑ)):0m´®Xm ¦‘QmÛËlf8c{›¤YOabú›Sc!2e$Šð”?\…øL陡ÖnW\eÿÁ΀âvÁ§htì÷‘8ÙÉ=ëwÌËf‡;ßÏ7¡ä;ÄQ=œ…ytNfŽ û‘Aì f;¹—®9Öx•¶Et×›ãQ²W’Ô,sÀLÐ µœàhá&„õKCME”]zgxü²)ò*Î u}5ÙeQòÑÇwxõIjo‡S-fê øÓj~u\+^iÙgÆ{ÛÅUÁÉ“`̼žwEòÇ“ŸaÂ:º‹Í¬&ÚÃuÖ ¤DÒé'¸”:>óç‡L;ðY÷6ÉõB%—÷Cü«ñ ð§¾G*–„HüŽ?WCÅq†Éì#$©WÐ`ü™ ¹»Æ A §¢¥<ÔÝ`ƒ´–•eEÚ´GÔB>¦Öf¢#­\ðJk4/˜x†”3^¹F¹´½³\IÏ¿ô¦“~äN¥—X_[õ¢§_õöÃɶ»û;³æ1d™9ûõn´. 2ö@²)q: „Yf˜uœ, m#:,À¢Ä¡ø6º?õÃÓoFµ`ð4PBAÝåV_œ#hbu³#ÜkÛ„{÷ïP%GáÒ?ìÛ mT²QEÎø@*§$˜oÏæ+æ:™¯¸æsÊÀ„B[$ÙÜbO¦ªŠÑ#£bmeD’ïØ„(=. O¿°Pgg檧FUÔ¨Ê#ð Ûÿ_|”ž. •A ?;L:¬ó:„奸z‚†µJƆuR S-m˜’Æ”H†)×ÔÀÂÀ~:J¡q¡Bpv}!ìížRß`Çr·q-Uj<£9öÝC/È-óºã/Ë^]26¢Ø[B• iÔ{fÔÜ£ wé–Ÿ _t?â%*彫¬,ÜÝÚö±šLä‡ÇuÁäÕ|;Ó> u]˜Ý9‰›F€M±bUu@do·¢xŠ·S)€äÏkˆ¹qïPƒñ,óÙÀæØ@%­—ЖÈÓN û5+ Þ³Lž‘ü’Í0ØuýÄUÚe#Æñµ³pcªX—iàñÜ¡r"yòî! Pnk'Kˆæ‚úÈ^T2aÐt4Ê©GïPt&y~.SBÀVZÇ¥:«¨,+ËâÔrÖ'n´‰‚ß"ú„"“{2y¿Ò‹gì,XFÔãKdgÙ@}°ì­©¹'âCåh'p žƒ—öÆ^‚ûál/v"]#v“x× ¤ÛÉëŽåudÛെ½¸¯ïšiÜt ïxð™›Å,‰P?¼T>œLë›n¿Ônçð€×,àIÇYª¿§¢˜Â ü”ú»±{¨—zþˆg—N›õL~{à[ÞÈ͇ð8ið;ÄdŠã±v;C›¿ùVª€7QY@A‚Q„:¦gL/¯žü ž°|Š endstream endobj 181 0 obj << /Length 1730 /Filter /FlateDecode >> stream xÚÍ]Û6콿"Àæ‹«OËzØ€®[W Ýnì¡-_¢$Þ%öÍvz½ýú‘"•89_Q @±'QMñ›”Ål3³_ž ^¼~öü•U3ŸûB³ëõLj»¢œÖåJÛÙõjö6{Yí–‡]5„ùB—:»ƒEe¡«Û¬êe=Ìx˜¿¿þõù+íFüÄl!Ë\—Ž8]oY="R"·@!ˆæ9G¦S ‘{kíúÐ,‡ºm@c³»®«2ûP¯BO˜ “ýs¨—xrKØþ°ßWÝ“ôD3´´¶€C³ Ýî¡n6Dj‹°@¡f‹RæÖHÐN‚<I-4dðŠÒfíšÖ}Û õ>,zP4 ˆ]}‹þàf¾°EöwX} ÷Ù] 2×;fYÑrßUw,WÇœÛ){™¡“ÕVõzL˜×ؼ÷3!h•ÕÚåÂ%m9*.¬­MJë3köjVt¼l›eÝž|›h XæÊeí¡£Ýªªœµñ1å!¦HŒÀ>ÊŽ£æ°b_ s ùø×Ç¡„œ° ðQ¢œ½÷S­{Á &[w힎”n!äB(ÚcØ0.„£b¡_¦..³¹sl¼Wu´ dShV”PmÝ` 1"LvC)ižpVJ.¶Ä‹¦…àq ÀØû}Ì‹Rfuß¡ïëaKÐEÊhn:ª{^W¡AGõšÓ¿‹ùô$8£àHÕ®À°çñÒ…žCu Y`LmWÂÜÖWëîŒØš©P\›° }cÆwüø¦ Õ-¤Aü†$j‰t‹!%³Ý|!³"h;ZÑFH¹Ý=œÉÌ1Á|B÷an!év¨¢%ÁµuÙrTaÛ·û ÕP÷C½Äì•&{Áèz· ÇowM§¬6¹÷>e"ì 6~Vä…´‰²}'´]O¼+˜RÒAJÆ|V%¤¹4çþù0'ß iTLJ\YõÆ îûC=T7¨îÖ‰¼?Üôabœà¾¢}xÚÜ  sð3ØÅ@ŠÿÞÌgØVC‚Š˜®glØ…=F#˜k*¸0X°füºö;*7÷[*C[:©¹Hú°"Lô"Ö™°«›@^‚áØ£Ì¸1EnäØž6WN%š©Ú +óÂË©vô1°®† ì»¶ùž˜â¬Y[°À±q~;q¤ŽBC°Û~‚‘–¹vö³ù2ÉÚÖ2P(>*qöŽÝ! R& ¤&)•¥òBºžåç[%Þ3¹V ðü)’Ï5Er~‘®u†‰ËÏè®/·U³ù‚i•óòªAÊó|’z x’Ôᦆâ:´‡žN*q2‹D(Ÿz,@56£†`,tMÕ,™9U*‘]½~óòì3Àa`_1ëfñºÞlSåðMÍî/wm0Ú ÞzaíµtÔVG븽–Ü^a¥JæŒø-(„c»^̼xŒ}º€»s™Þ¥ÌØ=:ΧŪëã4›.0+åPœ• Õq^†ãnFSDs'pǦ *ñžg}Xï#p›>nùºñT!”Oò˜sÙ·! µL‰>´9Í’Óm[—ÇfÁS²†1  ™Ó|ïh¾LzñôÜÕ†óîÆ#øqÐætžÓú¿œlK ˜ÔS]é¨Âãš:UPá-§þGIxZ^Ô¨DÔ ¿ºÃtÀº2BbV‘î#ä›öþaÌ..y.·ê┞  %Œ> í]yÜ‚%¡hi õOP؇ǷHàà* WÊýD¶s~=1Wʘã›i®aŒT̤—Bž˜;'¼œŠmb®Ï$/emf$9cHòík’ä°õÎxñ´äŸIÄ ‰îŒ9<9Kyb^ 튘CŒ‚ÍÓÌíIr$6Ö©ã™^`?#æà9é|‘˜ÃWBòb$9£Ì2÷Fªs0±1#æ…ƒçé¦øÔ«r;Ëy:>‹¥ÎÅidýªÉøTBBˆæ¥UçÓÛoxñ£·7h:0îñó[Ë‹ç7PŸ¼ó¹æý†–%ö·Øx0Ác‡C4<ÑÃÇókF=*Ö‚¶cZ(ÓPf»[ÌDäœjéžtMÞ±ÏÿQÿÍ]>-àýQºÔðy™ÇŸü|ýì?Éõð¹ endstream endobj 189 0 obj << /Length 1453 /Filter /FlateDecode >> stream xÚíXKÛ6¾çWèEÖ ")R m³mƒ4éÁE $AÁµi[©,9¢´Ùô×wÈ!eÉÖ&zíeù~Ùùf4^²Ø/ÈâÇ'$Œß­Ÿ<½|Q¤…dr±Þ-hNÒœ/¤P)ãb±Þ.Þ&GݵåßMßœL½\ &’ã’&çýŸÊý!ìŸ7_5Ÿæd¿¯k–ï×/«L¥D²ÅŠÒ´AÛK40BÔr•Ñ¢HI /Tî—¹[*Ź\®¸TY’©’œ¸SÅ2wʘa§‚LÁoÍÝ8cY6€Ó”3ž±§´ „žÁ•"ÿE·sà9•Œœ_–øò¼,³ørX*+ÈøóÓ5¸“ϲ°ôàœ«œžÁsqàœü\Æ—¾ùL(Àa) R¨®RAU!#¸J¨ž}ùËþ: N>Ëø®ÀÊFààâ,KE þô–«]AU4GUëƒA¡ §XQõ2]“›º;TŸgð„H3RDÑO­>–+–'œÏ)Otß5Àðr£+¸ï·Zó±7¶³¸êºs33º¾­ÍW# L>˜M‡½÷îOÈ %R™O}èr¢—”õÖ<Eû|^@Ç3 s¯k:œ és íÀ^˜¬–tr·O&CdÊ£ÁÙe‚¸Ò'TKŸz¬ô1èš`IzrÛ£u˜UŸZª¥.ÐÆ£³Þ=ßy 0«cˆŒûÒ;HhËã©2ža š¹Ö`ªÁ}AwžìšªÂOˆ÷ƒ‚c´»ì”YÜ)«ª·]ëÃã.iÜF%a zb.¹ çïNq”dД Åÿ¨fü¬bpæÀp„mÂG¡)'|j`Ó·è”Áç–­îtL»â"?`ÅBô-6)ßààk¦›ì—î‹`Z—Ñn="¤[–ugÚ3T@¯â’Õâ‘âIê jL“wD£]±M~{“½¿ùùõ/þx¤SŠ, E † zsûÛëgàH7Ÿû*ó”‘|Ú&:ðx<~žëÓV„B-ÄwB_)¡¦ sÖ 8ƒðqšR/^‹ó : .¾ ž­8Ä9óâr®“Eq1 CÛ*r âJ=Ž.tl5A> stream xÚ”Os›0Åïþ:ÂLP´+­þôØNÓiϾer`‚œ05àb<©ûé»lŠÓLO€xúiõÞJJ< %¾¬Ôøü¸^ÝÞ‘A‹V¬7%*–œDMb]ˆûäþÒ‡õ7‘9/v"Æ¿¨”ËdÒŒRÒ:ŸB¢©Ÿ¤–䘡å ¡—‡p]®'t –Ór“iu–kìåv"·ÊéL7A’·,wî:ÝžéÆIgË¡/æö޽¹x FcD†L?¾ÖifÀ$yQ”]Ùô_”tÍ0}…µRkäú‰ùn·=ʪ©»çíqa1ëdpþ¤¾a®fîslã¸àéå¥eTÊö'±ÝC¼|ÿl^õCEMU5c­]YÅ!~`ÌÔ”M›W‘Iˆ˜”õãöP”õÓ‡… 9n)GÓ y¹¸n?ÂËnþ†·éÌœ—¿/{ƒÒ™ð/Li?yÛÅv8ƒ‹ÙhØáºX £–ÆÎ =Ƽ}G¡r0];”hjú§CÛÆ:å;nEå“fÇ1•¿b1|niIýøÚcûahÈ&.ÔÜ‚3ë–s‚ µu³¥vmS\kN˜Ät¾R…g÷‚ÏŸ—útÏMDŸ×«ßdûV! endstream endobj 198 0 obj << /Length 2238 /Filter /FlateDecode >> stream xÚÙŽÜÆñ]_1ÖK8À’fó¦a)HÈ@´FX†Àöì´Å!ivsù÷ÔÅcF\9VWWW×]ÕîîwáBùþpûêÛw©Ú©$ˆ“,ÚÝw*Žƒ<+vYšQœînëÝ/^²÷• CïGý°•§›®7íýÞ³Ü{4î´ÿõöïÀ(½`”¨ Êàâðä,Åù® Ê v€Æ"?RA¡ &ý×É4xÇ…çN”žëö~”{]cy]í£Â{ا™W™¦º›é;!ß+ï2{‚ŸoO“Õí TŒ£bq´zØ1Š‚,™hªA8þ>' œ;ŽÍ ,’ÐëAÎÂë¬5wÍ3ïߺrÀš‰i|¼tÏñ’”©XÚ8Ô OªÂ;tgm<Ý™¡Ñ²é«E€i÷`¸¤­šFW²Wmiž'A’«I«Z? K÷)lËqñìÊ`ï'`ãžûÊ.²¸¡ª3HÀˆñ·Ö4°sÑ4c6gíNY«†ªôjcûÊP“cªV¶£u¨…ž9úº±Z6ºÖºa< !pñ'8ŠA¸Ú| ãXºEÓ:&pæ¬ý»ÊêšD /½ph@5moÄtñÚ ØB}=¬UDe4Ñ´ÃL‰¼®%ßt®>£,ä\X!Е døNz ®eÀ޽„„ù€a¨Ð†q¦Hp\Ú™uË]+\Àbi¨(¾TÜëf;avŸ«¶Õwžˆœsí&¨éÐa–ל°<žºFÀ~`7´¨:f~GI­yaèÚƒ™£×t+®Ç±= zg z»å:Ìâ@ü–íx‡êÐEyPSI µ(õ~"Óä)qÇ–U7°ÖlwÀPTPU±ßÉ ùúUAžÏõÄ ÏÁKeO(}Uq1Õ=,¤ZRöÓ5樇ŠÅBTwäo]¹Š! V^!ûç¬U²1Ûœ.ÒµéF‹´¸WXSÀ" ¹¬˜ACànØÚœû¡“**q,8Á°©î5ãØ±PœŽÕÂrEǶ„(AžÃ.R&Éå]ïQ¨(+%‹ª¹) O\‚½©ÜñwÊ„¡waÎ rz]©…BL»ƒ¶s" ¢…¼qƒy0XßèvmÍ}+¥|C`cíˆ%ÄËH"¸PXjI ,·>‰ƒx¨j–÷%µñwÐ5cà] ­¶5ãÆ¶Öƒu²VÓU¡GÒUËF‡ :Ñ_8Sê1ß‘xÚÜŸÈí¼¤,€ï¹£ÖW¤‹«ü´,¼wû™(…vÀKO¼âû”ÈjW)Ä#×°þ)Ò¶Œi¹^€¦Xåže[„|°ýn„$›j‰@¸µÀ=mÍ= £tiA—œô¬4AÐ(^Í7S½ŒCJ/,ìî†×îDš4èz”ø§Á&¤>PD#MþÅHà ·k*ó<“#œE!ê'Ô«¶Zù/GiÕÌGT”ÞÇ0Ê‚±Áñ÷Åê Àx‰ÚÐ6Ó÷ɘnjJƒÛ ¦”ŒE1ih Þ×Ãf‡¦%ä§énÓê˜)h’œ‡¶œ.ÃÖ17V Èlε© `³Ô±îˆ0_qï-ù*Ê<Û5£7’æ¥Ó•€¡ŒŸÀ5Q†]‰îÃÑÜLˆøzzƒmœªÜôLN^õ™Ÿ÷iêA„ßløV2c9‚åÔEè^C3çKp¹0Æ•”;3?Òî𦧴Cø‘&¿ BQPJWA@žÕÕ7Æž°~!ÆiOÀ‘¿&|Ñ–ci‡ã™ãCyßíýLe\y¾[´ÀÁûÿÕ0XÕ]?}'9c?!¢¥ÍQ‹"a(Óc‡Ý1QdMâF#JMûGÂ>SÅmœé›Í8íÀL߿郻èz¼¸c= ÆŽ+e*öºvi¤Sœ\EﺫÆ+å ;îr“#©¬!›®F>$¤Ô•öôrZü,³2u·ÇNÏx8“©ÐUƒÌRPáDÇ#¹½:î°Î J·µO2Zaê'sgæjUĽ¸b~çÍ”PÉzÆÝ\Æ þ¦fŸò«–ƆÄkºöïFÜ á­7P$ÃÊÂÌÃóG"CF:Oó¼¢TG€bÈ®–7§Ò¼Ô_èj˜_QDg£A£9þ„†Ðp)[^\%jŽ¡‡±×jš€‚Ÿ ÌyŠ‹y0ÆÞM¤ôœ'hlû¥T»¥–ÂwY¤§º)…¨¶lD>•xø­‚o¢â ܘø ‰&¿ð×ÿŽÉNɆ‘ Žùò]§T ¶ì‡÷$ ¨œÿhë-f%<¯ã‰4¡Øü#^’ä‰}µˆ<«ÄOþdUE?´£ÞêºÅKÁ" O¯©8ÝžE_µüÝîè¸Ãµ$ƒœÓŽã»7Œ÷aÚ4¦ÂÎ-™ {ËH–Êó¡éÿ£ë!1#xÂ4}X»qÊsI±|©ƒ7ø Y ÜØbÂs1Õê»Yï5·jpø—ArY?_U#\Á, /Ь¯ä©Úú©:÷ŒëIE2= y4_<Ê5¿iF¸­rZæšßF+uú4µ!DS]Ò—CPÌý·åÕ7=ŒËËÿàXø„Ÿþƒû 4*˜Bz=˜® ~sZ_…yxyh>ñìÇ0 ŸnN¼¿½ÿñí¿oÿîç÷ADjËùÿ!dóüêYu\Ø×º¯«´#ôœ;ëŒ!àdŽ¿_Ô¯|æûïùûú aûšî&ñV·e—57@ÊOwÏŸ0ûÛOg|“(tÞñzmŸ×³.þ'‘û¿[j>±<öùËE'Åx©ŒÇ¬€˜ðÍ?>¼}Ét ø%×3þ©¦¼SþYYfóA¿2î7Æþ4ÔTŽ!ȉ“M™nÃp‰ˆ/å°4ä;dåä÷QÉôKëe_±ÞZZâ#ŽN¼oÄPᕨóßר%)°-w~œ©Š˜½Ê.޼½}õ?6€z endstream endobj 202 0 obj << /Length 2347 /Filter /FlateDecode >> stream xÚYYÜÆ~ׯ˜¼Xd‡æ},,v" 6pyzÉžÆrÌC;ƒ ÿ=u5¯åJz™î®¾ªª«¾ªâ8›ÃÆÙüò‘öç»ß¿ ýMj§‘mîö7íÈq7QÛžnîòÍ'ëí»¿¿þ×vz¡õÃŽÛìw'tœ<w{÷ÍÎsìÔ6;×µÓPŽøM9sb±çÃð¬Rµ¶ãYtô_^ñ’wÞÿ†Óœ2Ó¡õ_:víÂçx~ûnëZ0uóܹß(BÄÄËe~G«Îçn¸â¡î-I¦«Cw|"[hɺVØÙ÷°·Êº¢®pÃõ[$}óÏw$Á§áŠO×{ÞôWV"Ýp+S“¸ûþ^n¶mû+âÓ_xÅ¢µ?묫âd™ëuíÜ¥É .—/3óµM‹WZ°Xõe‰Ý¬Æ§ªÔI·ãþQåß}'6ò·÷¿6¤W¯X³ÃÔ×å„Ë7MEæó_–¾Ñ¸‹œ$ïwùôdÁ'¾_lŽ¿Áx¸v:«s}˧9—p9p Šr•d{çÇÕ]ºú\4uuÒU'AØ¥Û³Êôí¥kiß÷oüxŠ1pG¹ õ±>éíÎ÷=K_Î¥ªºê=¶¾Õe…zØî¼Äª·ðó„žÕDÏeX´ÜVZç:··» ¬»ãvü1W3äó¼ØŽ¢d$†ºæjÿ+ìûÐu=³nß³»ò]úƒjEÿ‰g‡ž7×Zwl4²:–j=(·tí Ò&wü i;0г5(! ­ÿ€·™Õ-ÖäšÕSÖgÒŒn‡5Wx¬¢:Ȱæ6«+Qm [º›5¢;‚ÀµZ0›*ç>èØ"nbÓàe8©èЫ ò¼@­©ÇFø4¢ ^†á4Þ¶öb‰y Õ>÷`¡ ì¶]Ó#HÉ%¤8ìæÙ"ÇŽÜ`Ὺ,5 ꃙKÝ€å•i„-‡ªn4»#Iî»Öžnòåa°sªñ]±wVMgö{‘YV÷‡£Ü$³-ÐJ¹Í_Žªê¸ZqN±‡8N°gZUqû›¼îÌÄÄ ™2}Ìa$ËOð¨ÜÜ¢‡ëš|q7–dq£Û¾"9:s·"nÔ#"Q†ï¤ 0S›¶d™î{§&Ư’ýïfÅž"×v#ߨ ß÷Ôš<èÆYEÂéç¦~Ph |£ ø±±×·zß—Üß7õ‰ùQLÈu æÃý¶µ²ÏÖbk,àÎu"ÛIܹˆ ž^’ hÔâ0¶N }øÊ°^$*ã0-½®æu¹F¯DÊc‚MuJVÑ"­h«—(¦ »â¤wªe¨õRëcq:—z Ì= Á¬Ô¼1ˆ®5Ó³"—5˜Ã,¤Îy‡ @S€€ÁQ•– x:8âpWðÂs»£ô"¶Â`Ò¨¿ Ýõš©L|ÄÕàû§Nj½Ýó¤â¦¬üÜ8ø¼ AÿeOOW&à¤Á„ I-ÃÔ‚á— ˜"É H|xI˜›°©&ç‘`vO:CÎá¼¢=1)ïŠØˆN06î2ÕexÕ‘I%'DûƒihKØNrN„œW¯ βŸÏ9"¨ÊÐG‰Ë v½A:—sl7"j£²NË ˆ} ì 2åqt™lkt×7©F}±%ÐÞA©0ªûîÜ3Q 3‰옷…$¸­: «E‘®VȈ£”Ï=ʘc&tòBAPm»"“YésvÍíhõ0Àä©’~׳H“µW¼«î›5tÂ\d}©$Ú`E–‹®ö|”AЀ¼!Œûhزoa“ˆÄ¢„üImŸe cÂcÖ<57ö!;‰fqêÕ›Ÿ~ýøzÅp Œ,⢃~0𢀳ÉH²IfYIcˆñ¶`ø™‹>èÝRÆVh©@Ya>HìØR¶ucwC;J≱©GÆŽ_Ѥñåh4ɾñR%F î낌ϵdË$ø0c1/ùñÊXê(°7\T½Õ¹Gp  tkBÓ‚'ƻ֕b–ªñ)`ùQ7zfòh$­±íÉÉVF¬ê¬#ÿ€£Rhÿô†”Ñ2]J¯¦WMÑuºâÐMnâ%—â‰S[ t%IKž¥·²K{+q$ý‰@ž¼.m1U¸ ñi„ñL*‚ó_r]p/t\Ê€èmbƒ<ÁŠCaòu'™T98Dyæ ¸ï%-Ê’G´+–ô r~2Ï=@.´¦i: ‘eô4úϾh´¤µœ¸ø¦ÔçAÑñ$eÑcEìC”?M?¡§T(`/X‚Øz’'j×3™D{¼E€÷¡’ñÍp“j4w°J¯(nÒ™S9‚9|I–ø’ø’ E×ëÄi² Ø1È#R Ö!‡2¤²a;N²/:ªæ–³aèœjÊ ób}æ²R&²zi0´j"ÚÊkïðt,²¹•P=ôrC#]@ï‘ýó8މzì=S»Pܺc |YÓØN½Ô,ÂOÚÝgNÛO’oúâ© 8›Qñß[¨dÈlP22zìâ‹LÊ£Az.AÄQºÌKé5F¨Ùò¸AŒt-–&MåáÁäZ¬£øuÒõ´Ë Û \Ö´æú6¤mfI[›Ã¹ëa¤ôÍMe†fXžZkºü¬b‚ ”œv˜Æs 3‚*Ã4áàGu%×›áPwr]„([;úD3^L˜Ô'(FrB™„'2¨;øã ÈR¹Î¼ ã'©$Õ.íý ñ³\À¤zvúçhhnr7,Ú›¿oe{Q`·ò”Ih{£™¸\ÿjç˯vRU{®cÍ%ùíX˜¸|”Zå‚܃á#ù‹ö.é#ytƦÛΗMŠ@þ$;8ìá,81;üwV ÌúPÆù®ÈgT7ž­y}÷âÿ ×¹Ö endstream endobj 206 0 obj << /Length 2042 /Filter /FlateDecode >> stream xÚXK“ã¶¾ï¯Ð-TÕˆ!ð•Û&e§6µåCv|rrÀD›™=3þõîF7øÐpv÷"âÑhôó놢Ãåþý!âï??üýÇ$=ÄqX$‰8<ž±”a–æ‡4ÉB!“Ãcuø%P¡8žâX$Á†®î.Ǔ̒À^ ú¡¾ÔnhV6zÿqüÿã€}¶f/"ʬ€ÛãÁ8R¢”Ù¡‹T¤Hxò”§8ežý#ÜG\åŠVDa ×|“§,Â4šéÎSWÚºï@ä(¬þí(²ÀŒ$J© ùÛ’÷ûÁ‚Ù`àö¥ó4îägZRßíîsœ@.&nµ-¯!0z+³JC‘È=;WµÖ/ÚÙ'í4¢ I<K*Ðãnmêl?• lUì¼KÅ[+ôO¿:áF8Q„y±Ês ¡¦ ,ÏCßÒhß¹ ‹#ÞwšŠÂ<ͶN;e¢p0áø÷†3ŽÌKin”î8½šIœáû|5ÝF(P6Qa¦’½HD7çÎÍB•¶šFWí¸M0 ®º»Î`Ⱥ5”{,&¡Hé, £.”zäQÝ-[;y™G8ö¦¸™¡î«Pßn þ¶2ùF1ó¢Û[cB Ó˜–RÌhêí¹vðËà~À ìIþÀ3pªrŠ ÐUªa´|f¸L` ¶ c×ówIi_NµÇsÐoƒŠ„­a0£¢ñ™0YÕ'9†?izs BT4'iVl}©@Ø| ™jK´-:z"Íbðøbƒ{Ñtk6:°Ù/¦3 &ƒ¡GvÏ4¡¡ 5ÃÞlS5ëDH«°Pw¨ù|ÉÆwºã¤ë­¡‘‹C`8X®v°R8Ë¿£¬¦PVgìÄTqðéL—ìÇ+À­òû0.–³ ÛÀAö.c@‡Æœy¥må"Y¶ª) cVd[ël"ýuuIQ©"ð ! Žž|¡Ç‰¶Ö´7ë"¦õ™¾ä#`°­~°Pû¸ÃM¦^v›Õ‰s©¾Ym£<ž-Ô±$‰ð½ÃX%ašÌgþõùã—/{0!¡ö%iºµh<ÔO“5>5çpÍ ¶Lq(“Óúùóç½¢°Ï¥ïø™f4÷èÀVõ}Py'¹yõæJ’UŒm?Œ#QÍýœq®[•†Þ!KîgíO¡’ 5s)€"é —1H\Tád0.Ô²1\påÅSºŒ®^i£ÂmvÌòÊlÎýÐÒRgLåy|çfÆšOoßHL£š9š—GÎŽè¬\IP‘òË +8IÝ#€·Ñû¸BvJ¹~¸%Æ-k^,m¹T_Ó.•ᔸvȉÏdŸ¦Zî&?¥ñrÚ5;añG.óv}®¹ÜSÛê¡þ“]ël‡…êèP“óæÁWxÚäwÓ@Ñ+cß2ƒÑ“e´ué룥^Çz|?D~<æÄ[Åb-(N¹õ†Æ~]¸!„ð„û9DñúÒ,¾fêZ—ª àÕ*M×9¸24žF ¼á$â$T¹Ø‚ÒW;äd®ÎK…´3HA¨ð‹¾ ôÙ­“(åXOøéè<[¿åÁÉíöômùuM3§#_æ†ÄÜøÑ^0ï.9Õô°‚@Ñ¥Yàã¹ñÝ)bÔžãàÕš%âujbž-] e24*ªHvBlÀBfBß94+1ìq°Ô˜œû K3<% ØÅW£,/¾!lÑ›Ûë!T -„Ü> ê²¶{ïüãa¡ÅVbG¼<é|³éª[_w»2Bû  }¸{4bWÞ¡ß %vq€Wò–Ç·ÙÞ–ûB@g¥Éü@ìCÒk/ŠP.”x9ûH;W¡›²>KÄ ˆ¢yHýŸœÅž"Žü?Sþy¨îþ/¸éSÿ·#T}Ùmˆó0*fhù}Òm÷‚†8›ÃT7#"™LƒÉÖ ïH³ýÐÊT¸ÍWA£PùûøånpïQüÚ½¨ËSP~fQ^õ`¿€‹Ìþ?}@wq²‚Hmz*cqàéQŒç¹¡×MWÖ¾HðÛ{° sÝ"ÐBà€—Õéɽ­æ»SèP³WYÒMe±×²oÝå˜Ão»^'h*ççŠ&epïÙ=1PugH ¸X*N¯õåÚ¸c¨¥WBÂêýnCöôËû†«®æšýLR³=.=­Ö$kßæUÆêºábÎ.™ÿP™ÍÎm:©c£æ÷©Œ7Ywþûù§)<1SüÏ/‚7¤$áã|CõÃㇿͲæù endstream endobj 210 0 obj << /Length 1891 /Filter /FlateDecode >> stream xÚ½XÝÛ6Ï_áú D¾[±¢¨ÏàÚ"ÍõEÐÁ÷ЭŵÙÊ’O¤²ÙüõáŒdÉÑöòt/&9Î óE9Ú6ÑæûgßÜ>ûâ»Tnd"T’Å›ÛûTJäY±ÉÒ\Ä*ÝÜÖ›_ƒtJEÁ«Áºîd>˜ö° U–U[ã$¾}ït[›v'ƒQÞ;»ûíöÇ/¾Sù¦eg(>Ú„±…,HðKæI“LEžfÀêY4J¶æ®Ñ+â’Ld*YÝ…‰Ê0Æ"pGM„¶:i"u÷D™¶ÎÕ~Á»4 ªƒ¾j¦ãˆ}”صÍ#Íšî`öU3*¨«äq_±î»]ç·yf±På0ešÎ®UëZìÂ2N‚[oO©‡Ö<àOG„îïL7X"œ4XœǪ5öÄ4Ç̧êäf¨R5ƒ*ŽK! 5bµîž8iYŒ<§Êypެd´Ñ€§ß™züõâ¤y!ù‚nµ®Á:UætUAEK8ìì­&Â`uO³» ŽÈ€é†Ï{ÅžÐâA×Ãma¬‡½3]»Ô±÷!J´Ê¹ÞÜ N[t«T®,M–N1µF•"q* ì@ŽÜ7•õ¦Qè+F'šŒ2ýêPOþsYŠ(ÊG¯H°¤lCÖùÌ eRˆ8Á‘JM!™9Ÿ3«Hdq1SürÄ2tÍŠO„²ªàôü7Å·,§ÀÂx“àÉ–Èox9 ÷TØ]A"QBåùªI›“'åÈüõ.Ì¡ü|£}b Q$è·BÕìÑ?ÞÕªôò1M\È1eB‚ì…¿ÇðGPÌzôh‘µ¶æÐêšÈ˜[H=û ƒ¨5ÖÑN×îù@uäx} ‘ò¼GPb~×ÞJwÃÁª}Âë¦á3Lm;G„ƒv«áŠ^HÇb–²˜ ¯ýH_îp–ž˜/†8"Ü­Ï£ª1¾ø<î @Y*d¼D“PÁ a>9ÃÈoyØpbÐ/¼®ßð>» ZÇ‘@ÁÇn8qžqjÁ-¬¯ÛHòu'„ ì–MMû>qç2z=¯6°ó6Š3Úª<à±·‡K½àý)¥“e ›ß ZIêBÄY:ö9zö3 JȈX.Å1_E5ÞWùθ¾êGL/–âÚ×Ou4{¥Üïk%úRQeLH­æk\*%ñÿ챚xLÃ<*bY,;¾Ð±ŠÈ;8™UŽXI$ßQ®Ñ¢6öÜTšH­™<ôL= XmwÒÈÎf°¦vÍØ}×ÞöÒª:jf³–UÓ„;/ìa¼ð¾#n¿¨5—>:•¾çÎ[à‡KñðT§‡þ¢Åb ú¾†¯Í2I–cx… bó6R ØqÅYŒd,¤{Ó)ï{bðè Òmçº3ÙÞõnh'=KG—ÒÍ/©åCyÍÚã|©Šü“&–Á½~ umÈ~=Ư_lH ù¼Ç$p-Š(‰ülJ\Øá|î!Ø4óß÷þ•;mן*>òÎ臛EDpî m£-;׿cÆ=Ú›`Ò°çpªÇè`ìÚ§ýF/%Óù AAçðõÈ7¤ÚI½·(>ò`t,0¡¬Á‘w0‰÷æÌ¦¡¢}nÁè²îißÁóÐ÷ù¤dða‚°Á,EW¹*¬+Waö¥j4xŒeÒ¢K$åŒå½Ü K½øVû”G. ÔO:÷ä{Õ­eó›çví=•Ã7ÛôÂ[FíU•Nc—rd—åüõ—•ð!Uâ3I¤¹$Ư 8Æà+×ûf2iÀ¼"áÉÕ›÷ÿcjû>󱕋$‰¯ýÓ …b›Æ1ñN|,/ý9í×\gð…ô‚¦e ¿Êño4•E„“„¥EOIÂÏ@ûb4"™ŒˆG#Ô2i„೬û§_^¿^ÓpÍ·?ö¤lLØÆíÏgÝnyþTúqþº,ÆÕ«¦³zKÑ;3hyxhé÷Äi>ÁÒ§ €cFÈ\ÿ#*Éšù*ý‹Õ5§â éâ!±`p`Xüý†l݇®Õ[ Š/˜À¹}µ]GñIaþé².í_•[Á+[à5~¼ÍðšÌÂh ¡<ú|ò¡ë¶k©ÂÁ: ëe¢Ì¾l@ ¥Ë'åÊ\0§àqŸlÃß&«ý‘àÃwÃØYk»ÂŸ%Ì?ÌÈv¸ÅÂ|âû'{«tòl(þËíé‘Ôb%e¬»ÓI·n;^û Å£Û/Xâº}Ín_–êðXΞ¯àCðŒ¥±õ]aœ>­HÃ/Íô“…}|ÿ-:ߨ7¤9|¸CÚp`Ê<ivõÿÈÿ£ºfŸR]“|V]AóÓ–Ëõô÷áõ7O&E–àÿ¥(Æ¿d¹8òíí³?tDH endstream endobj 215 0 obj << /Length 1935 /Filter /FlateDecode >> stream xÚÕXYoäÆ~ß_1˜“h:¼!6`obÇÁ"´òÓÚ0zÈ ³<&lr%í¯w]äJë§~twu±ºú«³ÇÝÜoÜÍo\¿»{ó×ï£`“©,öãÍÝaã©Ê²dG‰òƒhsWl>8Úî"?rвntmìvç»YæÜ¼+mÏ;íGûËÝ¿6|¹ÙyžÊ" ”ˆ¸ááß?½{G¬îë|ù±ÃIè|ðnÂ_˜võŸ“i®dþÏòþ8Îßµ[ÏWo«Öš+:dw©S6…yÜî‚8 Ç#›¡æÉæÝx©+çzÊKÌ_Ül}…̯lÏW ™Õ‹Hí˜K÷}÷³¹¾f®úÏmc®€ä}½îúÓÝÛ«œñ…å•¶v]ÚßuÿEàèó%p“ÎÍõØÛÑ&ŸÛöjÍì"´~B=AªfR¯ê'Ö½6½–½¶®MÓ¿&R7m4*{Sßð÷g‰€§Üv2ëes¯”"™Ù,4 ?Ûì|8ÆKù˜oø3ËðÂU¿…”û¡ ŒEZ­ðø+l!ØøÑó¨s—R_ ,Tà]Ìî—©Ä‹–wü±mC×¹7ét… ÏÙ1 ÎåIÛTO<Ó‚+lxŽÙtÏ3{l‡ª`{HO‰cxqÔMQ™‚¹Š²3y?JÜoíéÙƒ5»¾ª, —È =ÅzáìvJ“P$ž‡²eú‚XùY4òñ‘àl-˜[79­C29ÒÁcxrš¼/Û†ˆyt'ƒ„«3ýÐ5tU`Ë]zšø*ü.ZÌ<]ê'*K²‘›“ØDKlîð>¡—8º(JTmzñÙr–÷­1 Ïʆ9ŠKM½*‘;­_S3ŠUú#«yÔõ©Õé Ÿrh»éX?uzӉЉsË÷òýH‘·¼8@b D¹fÒ´Wx|BØÛæñ®˜:àsLèà}×~ÄQ@qyK\Å(tòe˜ïY/*sèù]Ý•`oX]L$‰JSQÄ‹Ñù~ØcvàÄ *'ó=×Wq’Î|cêÝȵóR¤Í$Tă.CæÇ™SZ&hYÛ²Æ8&#áZ˾yìMSð÷Hn$FqAÙˆÙÞL’*„$ô%oo½/ÁžÆ½¼ ³–ë8 ÜÃPUb)m@lŬÂ:ÖG7°O2£Ø¿YØ¿ãUcxB"ÕJIqW« Àf‡½èy÷o»©Ì 9„¹Y–ëyMöœ¯ósžŠÝy쇑Jâɾ_­(DÿlM ¿Aˆ?ÅíõŠˆÃ%L~¸áE*NÓÿ£м¼¤Fò»…Ì{H¤A¦ÒÌ_ºä73kJSÁÞ¦µö÷5¼Y÷åí{/¬<{îÆžøXøæòîŽÁiå ãgºªZÌc¼¤Á •P&µ<¶Ÿ(çu]Y4#GI}"à ÇGìž–AÆ€iƒ¹¢À½ÔùŒó–J|{, À±¬D¦í/ÕÛ½\Ï)ÑAĵƒz¯süè㪬»bLÑõI÷徬Ê~쀌¥ž¿×œ<¢s¦à»;meyƒSI8V‘h¬áóá^‡ ¤ÉQıÜТ~©º?ËnëÜË”ëN‘#%¦œ„½$¾C×Öc3òJ…vcå†éE€,O[Äé˜=t³ Œ}.)ÐP$hhN²0`Ö+—ë:o[Lß¶lÉ.`×OÏ®ºÖL@ÒòƒìõÊõ,I¦&â$ž°ÅíÑwÁC¤Àtˆ’ç t-9lÞ2µ0ìêU+ådg‹Ãä–ù1P¦- m[²&YÓËÙ&ôemħ!}¸Þó~…cÝ£æ'NÙvG\s3'¨O¨ƒ‘ÄïµÅN9õéT•¹¦jkÆÎwOÌ:«Öôå*òëªè 뺓€y‚sÿF©ïZ®Hå&¼ôkðÎZ¢OxSx@Ü!”ÁçQ½ÎiVU†Û>Þ-›C§§rŠ´ìŒ/¥MlE¬ðtƒaÂ'Ü‘H¸œ.WÞã¶ä¾Ô§~ý¼GêI-$’Y|èßQ:ª½ÛÒƒÆ#cZœàyÈA]p§Eçlg‚"î.§SéŽ0Öú£ø˜ÏO¡>‘‰×š$-Ž>x’Œ*؈bç¿Ðá~%🆎ݾ•.938^"ÇK`"Õ=›,alSç¾3ZN L†šÚe "Þà4š¢ÛBÇ&óÅ•£üìúñÚ-ì"¡jÉtK3B÷=ì!âú’jÎýôGÍZõøÅMh6ÓÀÁV,¥·eŠU"‚ŽÛP6—WiÁá‚ô [ ž§˜^D¯} `œäC׉ƒT"n U‰ë¬ú‹޼’þ±Ë.Ÿ¶`1]VzOž˜qóŠãí5ܵÃ$Â1ûñ&×{˜\æ;9 ÍŽÈ;i H ìaÖ#<¿Ë:_mÖkÃÔMikþ†üÄÍüy.‰^xty)¾xp^Zrw"¡v»¢“¼Û`¾Òô€<o»Â¾tc ›é_UxºÆ*MbÈ^ð.…ZGÚûî‚éwo~^¥}• endstream endobj 219 0 obj << /Length 1709 /Filter /FlateDecode >> stream xÚWKsÛ8 ¾÷WøHÍD²(Q¯ÜÒGºév·³±»;³iªM;l$Ê¥$;é¯_€ œÈU¶½Ø$’ >àζ³pööEèþ_._Ì/ãlVE¥³åfÆã8ÈÒ|–&YÅÉl¹žÝ°R{~TÖìv0ÈXcº^«Îƒá®Ä¬kHc-[µÕ$+w»Jy>g«²SnIºi ©v·ÒH’)GuR¯åš$»ÞàU9kZÙžy~Fìp«*·ac¤Ä“•ÞzŸ—ïà->çA‘8{{ØÇ`•ª%ŽÛ¹WMßV´Ò·x“ÕiH£.u¹•Nvëë²+iÔv¦_u½‘m`oä"(„_{éåp2*y¾ÈÐ{ž «fWKÃÖlHá¾kipPUE£McŸ½êÝJ£é_Ñ~¹5àLxõx¿s`C³º,÷4¾5ØŸ²X—xm²]¹Âóï¼$eàt¹à+áü¸(Ø—h#ÎPŠ›ÊõZ!²Ã!àÔM_×ÜÖ4[ÏÚ@ã) PèÎNU°I¶S˜®zcœ-ˆàÆ­Ú[“UU~Áà@ñAu·à;&$³ôôç'YÈ.œšüÆ1D5éÚéÎ4¸g¯ÖîdëNû\œ­U{ç Ñë‘É)™\K@Âڲᩂ „åj%Û–ÆÏÖŸRµÛhãAÒDÞ—µÒÃA6•PìR¥sþQ¥;EéUÕ·ªÑ¤?¨Ë{Êðum|Ï/Ž1‹4BZÕ8‚ø‰HõZn yõŠ :ÒÉ —@Àå3?âAÎsÚwÃ?6Ìnü‚áÍ^!š·ª£ˆý+!ÙUKô¯¼-Éö%87 ¬×–f¤CØ®| “0 Ãþù¹{‘xb[eA`…5ì{ã%à sÎ$a‹»ÒƒòrÈ~œHZCçÛ¼ŠxL)ÆÐ_“&ülûª4󜞃+'E?¬/-]áh!rLsÊÏÀËY:˜ý®é]<æ¡eü_t@m§Vè”aqÑl:tÏJ#‘S‹ˆqŽJÑKgŽ&è‚Qdp ý€xðãõ{âË[jÝî|>?Á×nmá’ 1Ûùž‹¹ Óùl8;EÿðžÈ}=k£°ô±¥— fÊ]%»N‘ˆÜÉ9û½ÇÌEÑoÑꎤ.²g# Ì 0ùàÊ®µ>‡HC1@ ÇÖ¨9ó¡U­óV1?q…k’³WM½ë»ràÈ8ÉØ¥Ò¥^Ù蘄fñ`Ô59Ý’Wv$/Rm1­ýÆãL0aÀC4çÔ÷"8vr¾ Ó›xÒù¯•„´ªj,ö9ûÇ–5iºïg˜|9–Ê¡ôgÐ `!oIÕ¾…-Ög”XÆÁâÃÇk´øÕšã [ÎAû§P)$kô耡–Q«öÜ%aÎHé1Oõùræãß‚£ÉŒ½Ñ[ U‹‰ñ¨©°Ú„#(œâ˜ýGxaFOaLÄ0’å¤92ümã0R°+“ÉgÜ#1÷~%åÄ$êW®ÅF9VõT°f[jõÝÊHbëŽHc¶°E»¤ØÃ†î#2~Ôxųð¦d¤óÖÕâv/9ËÓôý #k&ù+9)[²’Ð]a'„>v¹‡=%¼ñYÝRÊ$Öðº4?…àU« 4oÈ݉íÕÃæG}"÷UƒVjªøwÇórbfH~¨ü²%Ñ‘#l:Aañ±>9Úùì òªm¦@D lIzŠz2‰:Æ&¤ÉkÛOOô«¸øÊR ‚‹¾–H ²¬§Ðä" òBcÿßÉ;á/bïm=ÕÛÞÂOpHý²>m4JBêq`ãPÕ†n6JèOzD{¸ÍÐÂ%­ûB8ñny|dY¬…iLYšamwVÁav¥„c6“=–ØÖ—¹³þVRëÒM.zèTI¾»{døÕâ埄oì!´-Ü3?<ûÿš{íc‡êCÃòUÚbÅ þ%H'£áí„nOŠŒ]ôý`ÛM3—ÏùsùÌc¸09FÀ·¾Ô]m¬5C!öŠ:q/±à†O)²žýÑ`ƒ´–0…mÕðNƒk’bœj—25jµ<4ænŠ‘(!ùÓŠ×<~$TXQ¸·;Ž}Q±Ÿ4¶X¤ð5z‚>ÒJjú€[«¦&›ÝÍ#À§òÙø,ã¾NŒC6Ed©¥z52góo ÜS)¦[`Ƙr‘ÐNb‘pwG|¤õfùâ?MM*Þ endstream endobj 238 0 obj << /Length1 739 /Length2 18638 /Length3 0 /Length 19171 /Filter /FlateDecode >> stream xÚlºsp¦ÍÖ/ÛvîØöĶLœ;¶mÛ¶ms‰9q2±m'ß³÷>ï{jŸúêúg±×o¡ºº».  {;5O  #󀪄ˆ4 333€™‘ Ž‚BÔ häbio'fäüКTV+33 @ÔÞÁÓÉÒÜÂ@mBóo!@ÃÆÈÔÒÖÒ  aocïfibàsssrsvetr`üÇI¸Xf–6@€¨¢’¶´‚$€ZRA ´:Ù”\m,Mr–&@;g ÀÌÞ `ó`bogjù/LÎŒÿ`çtrù˜™“½-@^\MXBQA .ʤ& 0²3ÈIýãnçâüãk ‰±å¿²£¸ü/ecô¿”ñÿRÿ«uòøÅÇÂ0µ4qÍ-íà˜þU7i;3{çĦ®ÿ£úó?øÔÿÔ` 4ûÇÚÕÆFÁÈ µ·upu:äíMNv{S€¸‡ ÐÎôŸ$¤]ŒþÉóœŒl-m<ÿÝþÅÌ…íÌÿ)$ ;#3ûä–Ζ@S%K—ÊofdóOÙþ-×þ§Wÿ úŸ%þ ø§Ç¦öv6žÿ'ê?‰ý;&“˜¶˜’°ÝÿŽÄ¿Õâv&ö¦–væU—ªkädú¿‚«•Œ,ÿ3Oæÿ»Ü¿y–ÿË˹8Yzt™ÿ50Ìÿúþ‡Òû¿V""öÞ ,¬\6V '7;€‡Å÷¿àš¸:9í\þÝ‚rùþߣzMàÖ–íMxC¬ÒÛÂ*ýÄ‹çª éæf Õé–Y@W¦û®uQ-‡-L .ñîÔð Ügùw.¶¥ïZIâG“S1$zËx/¥dUæ~u[oÊ…¯úW¸¶& ב·.™ëkAJ´SìÙygu2Žåü¨’,1†](Vì$iô¨Ð²t¾€{tµ(s¡EWÆ‚/»k`áÁ;׸E•áÚwæßƒET“B‰Ž“N(<Ú×ÁŸ¨Ü]¢aü)2lô"9NwAœ‰T_¦2)ß‚ù7x|‡É‡Ð’µÇHW‹tìY»“x ôq#Áœm޲cºzÔ¢ÍéNš!-§¼$P„²†Ã',Ð'o´0vØ *`„´™ gû=€_ߺѲ HãH8oV˜ÖU2ÁÁZ4.u3Šê?ï\_RÒßµïCÿlëo ªh¿™¯Í>èzò~âE#?@”1‡ˆì!wp ‡Kìz!KPv»ÓÃòÊ99)f‡Tlêh…2B(ñûöt" Åš%fêyá±Û€m6Õh@6Ș%<]ñÉЛ)ß)KDMã$¥òà2¿@ˆڷ†9ÙõÁò8[ìO:¥É’¹s0_é¿¶ŬÅêĸH•ÑémI¸ƒ¼Ä|^äR’6ì®lþ;üG#ÜgÆÞè±gÙjF:f‘]‹pþhýJ›w޳@á÷GÝl¿=Úu/ói ì²’%|¹R›S.­x¬ä)©G«1 L:2¯òH{La ÷Î!,EU½p¼Ü*/0AQ§sØT¥´ŸyäèºÏþ›P^”=õÆÖækùvóK&i¿z;ÚÅVî’Gu‰ñû~Ü^™Â!¬ƳR&V‰É_yFÃ<¾æê=A3n„õ{äî‘2îtš¦‚d¼Ë ­ÐPÅÊÐ0EŸSÉöDܯŽ<Ÿtž ËdÂëA˜ÛÀè"7Ôö¿g¦SLjE•¡ØšÇGÞÃ“Ü ,áyßuo±£T+Þ|=¨_y@¯^î˜IÑóz?"A1`ïû ïòN œ@ÿ¡L¦XQ+ñŒCØlóîAÇ–`H1Ž/°Äy2LâÌñ"cŽ“|Ã…½ìÙÍ JŠ2C¥‰¤&;ÂÄ'F€ÿîü;¤T°±\1¾à;»å3.j‘Ý>„Ë‘“¯`¹l¾Ç°›iÆEíÕBÊ2!ƒÎ+ã4ùI¶$Ñ®i5Wȯœ=‹²ïsü<“d=Y\×r÷GŸÛU>I&zxc‘ÿcqàO‚ˆ¿t™wWÍty_þ†‰ý?Bļ9¹14®ÁÁ{[·ó|eCÂtÌæd.?âhaCgFwFgÉvëóU[ñÊÊøðõ ©@+í¤ŸªGl=WTÙ{.Ðu–‹ðž$Ù£%º5.o)Œ"ûÑ“R•!ë†âvø80 ¨5Vª‹™S’Ýäu@9.ÊÈíäG2T/o¾²„›z%3Çðøa¶Õå–ÎܲðnøÔ(“à¾Åùä3†Ð«1ìãòÛ©èα$’^Ù=mÕ¥N=—½ð×Þ‡56%¸VH'xXÇ‹n•|ø>Ê×3)1¼nDGÓºYÔº­h‡ÕÁ¤ÃÛ¤Ü6CR¤ãžÞWV´×Éð~GçÛVÿE¨ ù[r¿•6Ûr˜Ý5çAÛ W½b“h¦ÒwÁƒ-Ëý‡dø¬R¢‚Hªû[Ò<¬ ÉÄ0åÂî`+H۴鎞ü¸½Mô‡$SÐÉkzüËÇíì ü˜wï¤"œÓ}È`~X¬nñÜ4,{_6–õ…®äšÝ.¬\±¢´Çšj“($‚ºrz–Ãn;ÈÔÿ¬åŠA‰^I±![n™}P‡à¤õ6d c1öùšI76ï9Ð/Ãnjß-e•aöz±¸%¶X_Jx‹[OªÃñ{áÉ=Ótÿ©ÆGà/¯Gg\ùùâL}!‚Ö7P>‚#n×#åx1 á’A÷ºkÛî:ö¿íúEàŒÆzÚZÍ1µ=þ<Íd¨û¤¸Å²z¤ž áX3YÍ;$^¬ çUfpåæFMô«üãHYMªd#>oJÙ¬VgG’­^¥º¼ˆEnÕEÿ=*Â÷ó^ìOÈšp{úd~´ðªxø§Åï¡}(7^¾'¦Xœx@@¢ÄŠì–„Lð5€¸¥â÷È*/Ÿ¡Ô"+žÃí!ç’øé(þÈÐï#¿bn«¸ÖK §hsƒ0-ÓØ÷%pýↈò!% qÎ+Ä<Ô }çäúÕè ئÊSØÅèÈÀ:âw‘O)B¡±õd¸÷ª]qÑ €œ’:YËbT£U:el‰iGæ6ÕU"º'¿“)«H  ²ßNäZ]HVúžÄìjÓÓug—¼i*‡¯Ç£oœÞÕFåeΰ:Ç5j‚nK.œ²Åïë¼i£E¹U¾`ÒwçÍ÷“–ž÷¹Àµ×vµ¤;ki+ ^0nÑÄt ·|³ `„ØÅчRæCÊX!2GR _ÿ6ua½²ïŠN¿>0E¥¤|²}AX,ÅLm½q# &g,_%Ä¿·|è'0ˆ¯3(xîéšUU^jSÏ;•bT»f*–0<çr0öàŽ·ñÍOjÕÒ' »ir‚ÃÕëˆ&ùϙǧh±Èͪ{aW½RÇCðØWÒ†Æ$©éèQ šãGhõŽEÿû[Õl¶<+4œ÷a˽³V(Ô QÏÉü`²«˜ÏÚŽKJtÔÀQ„@HÏc`¯„û9ÎQ¿ÂÌçëbŽŒ)‘|£Ÿk‚¤ú5ºÖƒ^B»§R °šŸê½`Ó(¡¼áçi"ÂZ•ÌveKzdÉÓj³é(6ÅÁ+¡fžl8sÚDå|¯ø%‘»«Nº*‰ v°ÇåÄÐ¥Ô"IfõG‘a¾É\P8'…ØRü`{Ú††ãã{ü:ú Î Ù…A¤˜ÞUCp¸Ë²#ÕØd+?Á9ïkúu¨“v:¬ ¹q¼I:ÃZ×ôhBÈÕ[ô\âàUØ?FS›3Û£ ì‹æÓòn7»´_T}"vƒž°…ß±“$jÄŒ‰m½ðAÜH™öGÇ:­žkëíYúŒ<%æ‰TÕÒ8ºíRX€6œñÈö3ÎÃí}0ªGŒÔ80^àR:u@ÙåNY^œ×5e—ÇPÛ6Ûë üp™qüçß{<Èy¤§}D`›dŒŸ°àÓý±T÷™¸huHþ¨´Ú4Œà4úa¼¸ \ îÚ 9cK<šÅ$÷”x­+SpŽ”®6IëÛÍß_<›Dñ/3M¡¯:êô¢8×ðï  åŽñ1Ý묷$U%C2ÃŒàÇ0ÃɲÀWk¨¼õ­wÓÎ5 žÍ¦èÎ,Í-…R‰—«†­pd”Cï' ¬§H3K̬ã¥ñDZð‡ ÷(cÝÿ¾ øÿÐ<ý¦žsÇ©’&Ω!ç¦éø5؉év‹z¥…m½1ó†D…Ò>³‘¹/Ò#»RoÙô‰r½}ct¿þNÌij×ï]û"úÜd6\æH@qr,¼ɆÜê‚ U !¹É)s«qÞ=™¾ÒãÁ…y‡£eÌÄKñþ1ÍlÅ8.IT“Oæ»3«ˆMɈ4o"é¿m1u÷âQ²˜6+ï²K*$ÌÄrŸ‚þsë÷fC=ÇqËóFâ>ê³¼^¾ àöK —\&ÔÔfM+yÅ/¸R=¨e@úWLlä6‡„ >jJ““ØæîxÞ¬Ú!§èßËHX #²¿²™ãèʤc®þ¬Ê<Ðu߈ˆšáYùÖõŠSt#ܹd“¥ä#r¹, O•;+‰Ö6$q-гÆçÍZÖ˜G<âÚM’ŸLêw»WÐOÊF©c³Pûk”P=¥Ù°ÍT ؽÊö§*гÏý1äOÿ¨å£Õ×auA…g:vŸ»mRl E‰ÚEß„Vçó’Ü5}Âï0PµEYÌÏÈš¿µW?;¡Üè8 ¾¼µHTè, L D±Ô¤ÖßÕHOšá^w®w­ø?¥£¹†™‰TøF_× ñàk3IÙÚnÛå„+n>ëøYôPM8“±D”jS5í¬áúî=JYG9Ôóá-AÍè3FÞwt¨vÑ~"¼,|Cžñj‚¢KÑ.¸ÊxSí{ëæ‚ëí FÖjG^u=g´3$û¨*)©–c¿¹ Þ;6Gj?²VPù9ÙC$µnÁCÅÚÛàšaÀ¸`²`tà©,'šB5,‰áÜ2äCáŠÐ,¼Þ}DLÒvÄ(9=&%— Á_‘F%Ë «Õ×x¡[ mŒ±²LÚ.ÓHôáÖ^—zÁ…ä”ÜÞþN߇%F á¾g9¼¦O¢¼=½n׳O‡íõlÞÁ—&O#ç-XEb$ÕÝjb~ :SäHÍO{WC°ï”¡0S°ï#õ5ÃÀ_E²I`–óˆk±»â9û×ìP:&YDÎÇnU~>"gceõmF§ó&v?-¡5G¶èżõ)y§ò…$l8CmŒø{d(3iv÷dÇÇñÿê”ðeo8»jcqÜb“†€–ÅmªöfÜ¿½"c³ù—v„"Z„-+ÂÓ‚'Ûu%ÿT»ðÛC6çJNZ¼l²;˜äjá¨Wcqel†ÃÚÞDŒ¦8H·Xê£Æ;Ö€Bò…¹ž`Ywð‹£KÝR ¸d$:ù¸>íÒ_ÀUŸÒZì³’' ÷çˤPßχÛqæAY]svÓ£Ô•ïÂzBBÍø³îŠÌžðܼ#¤H ž|ÈjìM¯œ¼œºDJSj.š*¦ó ?Žâ– D¬l+¸ÖpµÓKè´nF=Hš¸»{"™0Û«ª4²sy‰ZÛVòœô‹ Áñ÷Ô/Ë?{3.lœE"üšnŒÜqx©û¿Ì z)o½ã4~æWe½u6«úÆQ“øXÃćàcÔ(—µ†½ é<¿U+Ù/Åøî1ÊÜÞ· ¹ê(û¶*4“('ƒÒ(QhÊû€ûÓ˜äØcfwŸ²ªDÇ9gH.J¬['_óª~9°S”þÂ5QãËŽ<ø2]© ìÆ±îÜÓ;`Êö{¬×³a¢i5Â5šPž½ÎÍû˜¨x½ÓŽpµøQ„èys}ÌC¡s™£:ÉrÁ €>Ñ“¿ñà ;Öºtóêž„ \ýs”x…%ïüÊþÖþ( ¹Åóœš÷nÖÚ—h%|u!k‚(bÃ'ÐÖœ""é¤Õ¸ 7õ„ð'éj\•=}\#—‡¿¶½(´îæÑÙÕAoÕ¥þlÁIR Ÿ†%®{¬¡|ß›žé¯ØÞɈ üLšb*º'É_3ýózD BˆPa’#^)mlû·ªV]Í®”èZ][D³ûì½ÙE±/@xy&RtôR¯ª”àkÂÐãÉ[~N1”—É¢*< :bŠ2‘±|.ßôÓ¦†àòêøø• º8m£ï9´>6!àêæ,{íðɧJCk;´Áöþ'½`M*bÄ!--Ó=éýðlwJè3ÏÁëÝ_S£;ÒûÈN¿åEþqšèG ÷Çߎ5÷Œ&Ó&rܾÛð’Qþ£4׆@e¢öõ°‡ä½;¬Ï>·ÞŽ[,Õ§„Óß\ž]7ïÍ ßÒi/9Àäû?/lq880¸HÃÐ2 %?¦Òײ߮·ö¯””ÃÖ£iáË]~Ö\爻sfdV7ãeÌEø†"Ó–ŒX¿x£$íÇ_À|Jš®ÒÓÎ)”3æ¾*{ˆ¯…þ^õ¥Þ‹êiþÓ]_½GÊy8ÖQ¹Õ‹b쉔곃í!'W @Ÿ‹þðLàžŸ¸¼hCÊøU@¨eÿýKoÑÞ=6ºæh”ð’I1;²ªC݆ÕyYX­‘Û>—™ÎޤBÿ½Òèêö «\çxоõ$Š–Vr¿›p,e¦!‘Bx81ïóÜ]‹ßPû ªå¿É0Râhl±çs­8µ?[–×k®X®vˆ(<+!{Ûb ú£p'ˆ” ¤únõáæmu7S^R—s؆ØrÄÏ `gõb•”˜5Z…Ò¯Ž€°±¦Þ†æ™ ÜZZ?ݵâp’Sç!ØT»E‹ m“˜P¼¯qrÚO²ê;+‘³éL<¨YNo ”S靈~ðÉ뾸ü4UvP âëôÝü¤HÊ,gz²O6#à8xaÃÀ=N‡5󂨜Hª%}ñl#çTÍâ¾±í±,ðH¼hÍÕà$HïAnÒÈpÓF%,EqlÈ7¸ÞÔÀ~<º Œ¢ßï,Ðz,ð”CWšcLiáscÿa»¿á”æÜÌý¤ðÚ.·gógzEzÆCâ9¯°W£P?ÇNôZÒ³÷º@-Ûa¹u#Ö¢ÞŸ YÅÜžÔ™H{N:Ê|¹ÝlW Æ/úÈ1ÌòXû&ÿŸ%‚ˆ÷šº®}ç°%€Á¸‰.BîðøX-ØOóÃ9±”t»^Ã@Ó¸ÚÎSâ=(wÛÎ×xG»äí–¾Mu|‘ÛŠ~IòMá{M?#_¶^B×€žº2e4Zñ‚=‹¦e b¥Í‚×Zµã`zûúAMnk¢"žGÁwÛYóï1Cr~Ü}áY›Ð:-g¸j·£Ú~XËÀi6BS3]îòÞ2;€üýS©™.À¨ ˆâ'·p.}} qÉGµÅ vçp¿Óç*ðO©Ô"@¸à&›cÞŠ}RcF•ZÔI0ÑØïRçü$­ßÞˆœ‰1íñêòìïPŸ¬vSØ›Š§×ÓÖ™Òå²Ñåz]› e¥ºÐptA¼/ÔäÔÀï3Nç ³ÀrGHîú@X aFcù?Öi3ÆæúE€,¶çc"p+aª»(×çOÏ®„ö±¿á÷ ­.eA"—vO·Ñ¢È''j`¤ñ2•𑴰˜a¼ƒ÷õ<‹tO_Ím–¦—ݺž6çGGUž¥D(½f^vfez¨ºÌ*ÁáÑÂèŸâk¯"…•†4ërÈÐ;öÑd-”‰a}àÙ`Z§ò£„û7Fû\!¨€ˆZîmú›ô@F˜h,¹/ÈϹFþìo—ªšßÉnyµÊRvêùø›ØâÊT˜rñ.OMØÈáá §D UãëÄç˜J—ó§¢iðÀ",r³fTÏ›~8æªV6û½âš×ãi"g8ž¨ƒˆLÓ)ï’)¤H-ðÞ5~Å‚h] ï‰N]êd®4`J1ÉÇÇÙßäÈÚªHñŸsp¢ö­îûzŸœ¨˜äÁîmݹœçí™;®z€?hèþÈÜm ¿ú“\6ŸÎÙU ÿÜŒÜÀiÖœç!P©M‹±J$¹}Ëx“†\H=K£'.ä>Cग़ИÀq³sNð œxóÚvaÞ©uŠ\§;IT/BÕ‹¼™,èm¿«B» u‹šçYkWWÔj|§#·Â«Þì‹Å•ÙZ0N $dä†Zô¿„Œb™c<ÕWéƒ>Ñ]À‹ˆ3eÃà…·û®b Öf‡ñ¥4‚²·$àV-ËÌêíŽ~úfÿsôÄôg†~1ÁeW ÂS+î´dp…ÙÎ Ùñø®×tØ+æ çHÄ8]Á3È9àAMLEl_÷¨9sa^h!|‹Im“æ#e”)–ÅÙŠ¤(®“cV+’ÄPcîÔïæü4IuHÚòéH3M¥G=;P«ÜS Ú¥ÃG ø¥‘‘Ù²tJ]`õ¬]lXŒªh—ó`ä±6¹‘^Z®1Ò7»úó›ÉÄ3‹)º¼¨%qI콬YȘŒ¹'ÚÁ²¾“—´L¢w©·à x¬ Ë(5ºÝ ñI(°U^0*£r4þ^DÙç(¶§Á~ «–±ýÑ* G,ËïÊ,„Áe`Ü?7Û-ë»3+>p½&À·ØVL#á–ÉZ˜ Vy|qMêT µƒô®$*ú®*Sñú£YEÚD¹ŒltÆ•ArtÐò ³¹àìÎŽ5X¹a}†±î¡pc±'Vïù÷¾©Hôæ‚`M]$­É„zë—HðÒ3JäЫÆгn—¼sÆ+PÕ !cnjêàÇm;j—:›4¤uè>¸n[WùíÔ”æÎZÓt¯éqU`NÛ,•<¨D3³òæ8˜PuêW­èqgãoÊ’7á‰åu¿=¾ ÷’Ÿ²ñÑNÈt½†Å_£+ú1Ýc?¬ž&âqXŽ".µm%£¼ Rð;¢HebÎTƒ«\¤±ƒ7t<Ð?I]d@Cý2äAÉÒ{6ü Ô¶Ü)o·wvþ›w)R÷˜–ø e/óƒ$µ°¦`@_—Ú0jw”€ÉR§JåtéWœŠ«ÂZ~”)¢Pº'‹óÖU)LƒÏùPC‰]ìUšwêuçöÈt: A°g%µ>šžIĜۓ Ú/)ÛVáZâ³v«PI·ñ5ûÀ É̤bN¿PäÜÌ…¤?OnN¸g£»p#³K–¦ôµÃí[lfdb‰xŸä.ì4µ™4=É.×iW/P•æ´õ5gI…îu 2Ô6(Nµ>Õð ­ŠŒ¦RŒÓËè§™gõVû¨î4vIØðÆùfTœ >v‘Ó¾psq®2®jHjã€`Œ¥qƒ…ÏÔ³Øup_¨¹k¹,E»R’æbZ”Þ³ÙH 7ÄŽd§äO5È4,b­ásû¦È)FÉò¬ÐìÕ¹¡®ÍÃýQøN–:ƒ4uðÖç¶æhO10ä½¶jOe{…•NÈB-XÜÄ挙ü¡Ø«ZÃù—etCKSžÿÚ¨õÖì 8 Ð=Iã»7;ª2*Z¡²õ§ðØ Ç6ÛZý( 2A¿üÒ’J?U[¤´ýJŸ´LÖ}µ§È·,CLI•fÑ›×ÍÒhçªs¹Lò‚ø…Ï@çÑëØy‰nnax •܃l[ØÛ“­^ág4%ƒñ£ÈÊû~SùØVꎅt1ðµ>ïºR>µÎ~N­7'ï¬fsD~õlÏúNÚŠ9ÄüO—K—Ù*Ûr›‰Ô¸2vPÎõpj0õyøÒŸZ/'P[¹™?¹*HYê¶E<Åšh]$ž‚¾×a<']£µ,þ»YáQæJ8ˆÙE~«’RÖ­¿S¦ â=Ø+$BYÑ—\CÏ&ÎZ‹ïì­†´ øŽÚ§\»ô™ä¥ Cžñµã=9^AúG#}@‡ó-°AeÐ`cÆ D÷²˜ñé·ø´Ó_-½Ù¿9°÷Æ[ÅT‘Ã9kN••Ð*C¼»8„u‹;Ž£VÆ%'¢ËÈoEAjØtÙöTߺŪÑ9:Bü(³*ê¢ wŽTt{¸hº}©oŠNæà‹K.åtÓÙ“Þ½#î[Nâ‡sÓ¬^e¤h –½Dþж„—ÂÚ.&K}÷¿ý“­fuÏÀ{Åh¾<*hû§ð):µ4Ù€ÞŽ¨Rd´‚Ûš„ º·¸¦»q£%ús½wˆ"‡›2MíNvU7Gý_8W‰q2äOÖ»‡4°Èf¦ðéÀ24ʸg]ööjç&>t‡†Äô ˜à=†+…‡þ"÷±HcE_é¨Dd ‰Ÿ*»/žÏéÇŸ4‚5_KáN½Ò£ù"/¸ë×Òˆ‘0¢þiH Q“œÓ½Ä{ò™€¯éEqת e·²lç+³”@ìtµaÍŽ¡ÈÌuü¯¨>íØnLEÉ0„ ,jÓÝp»7 ~þ,ÂÞ˜žiñµÚð\2ÉÃsE©ÎO/îý±°W÷2?@+WkH‚õèT=q·ˆk%¶Bûb8¶ÓFZ±+Cšò[Aw;¼éD_|¢SfÒ]•xñõpnøìQ¯öDEuæEBÄŠ5—é2²Åx†¨í“²îÊIÀã~\ Y=­X™ÏiÕ"]N¨ŠA¦Ö@ÍÔ(²Ü­³y,œ6K« "Q”ž¾GJ?{âЛ²…ü™Uá.4_ÚÂ&™=…q§³UUÌÖ¿Öfس;N×àSëÚ@•‚–åxžYÊ yÐë? Y{)±+eH>S–Ÿà“Ümn7ʺ|{yHš{×*c¢’ ¶óB1;õ×DüïÇȽi*ZfH2•Ä)¨íûï7œ]i-]K;Ä&2‡üÄ]”~ÒàÚÈžCX[£Þ«Æ… IîO½dqópþn¥—#å(¸5 ‚„¸qóo “mƒ5_Q#q-l¼S¿ì¢Ï—KÄÛX`+¦%˜˜ËyÙÂÒQöa¯Së.(1&4Áì‡à3Xü™§µëHTCÁd‡û£l“˜6ÜQÐSumK'ÿgƒÄ+ß>Õévs†ìvã)-¼«Áò§»’î*€«µ‘³< È×Û+¾MÄå¸#EwÝèŠð“žc~¯í/Lq/~ lhªéÿ‡9ÓÉ•R«Yމªžo×Ö<ËП­ÏÃécÐuÞΧÂËçâ6¯døã Bz?{ËïiêsC%êlØœþƒmÃ.V”ôAÝæTâÛ»Ú¦,ú¦¶òPèÿ¾YêO­0[DÁ"ÝQÜÍ{Æ1ÌN9•GŒ RÊ-;jþyýDºÙ¡fÈÑ¥PNN’=ŒCDé¿»>4ú=Âë÷±<Ú6^ÔÉÃ×Ãù.ì ôNXö¹à²,a@Q6«S:ùA£³øÂ„õ°7á,àê ]å CrVˆ®®d{Ä-úhçÙž^磼‘ÏnàâE‰U(®úCLæê¦\ü3Ê_g“G”œ‡eG²!Šî-)¥mÜyÏZza[À´tKM‡ÎOƒ«ª+ G©¨Š¶Êîl÷ùΈÿù·i®Ú—%³Mˆï¬†šUÔømºÞE*D¯A9¼ænæCÌ!œö ¬aVäî24XU ÅoÕã­›¨P¢¤éº«ßoì³³8.èQîKÃM—™ç€åyÛÔðh3q™ßÚ!]Më”å˜S~¥ôïD*”¸g-P{*0v.È.rfY§º…RJçi)‘ÁðÔx]BÅ3/æ5Ú’›PŽ»Åó¶lŒ:OmÐÖrbánž lqžèù“¸ºJfÞƒ†²¼C¥5xÀ âÈ#Ñš¢×nί·UüO8ލ:ÿý§ÃÇÀØïêÅIÖ®³o)rOè¸4°Ûz¸vÌ7ñÄ4 °¨X®ñVÉÑeId[¢#2¿™5§àÛUSеg̱@d×ëfÜÀtújÀ‡¥~?aÖÌèœåAO§c‹¦Ý`Ös8AqrÓ6eI‹ù,ïä›!™8°õfö&æ‹s ýXÛ6%à‚? <¿Wž(í ŠrHFPªêõÓ¯"Lì¢AQ1y5÷ê—±«dbfÔ®À¢îÑðÏb7 tŒßßÈ@„~Êï›!˽*S°–õ^Xiû(Œ†ÁÔËγ—Û s.k×ÏܯERþÐÎ#*â]Á§ÔË©ù]M9Ú!+WŽDL |Y²±Kð­ªÔ½éH+]F¤û—faõàÑ„Œ-rvGöH÷ õr>¶¹¡æç§[ŸÛÉg^ð`¾I…5cŒ»†l<ÿnî|ë!3Ðÿ‘r{Ï$2ƒºÁîû<Á’KÐbö¿žõ¤@¬›@ õÂêWòˆIJý£®{d"ò‚Ëaå×@žj©Ùà‹ZNS÷Ân ¾‘g²½mG½¾!‘ÁS7Ee°iO)2¿%þCãƒÝþl¡²új‘¤À—lB1±„Ê(y/š‰53j,þ·ñè§5f[í°JÞ“I¸ >5¢vò_ ëòX{¦xiâ…{Wâ™$g(ŸÊ*˜”®ÐˆAžIÏ®››m];z. ؼٛÑ*Òèd:Tˆ¾¦´ß_ÈÆH[ÍåÇÓ²…HT`£ÁÂzó¿Ì4~ E¡¨½ØZM½7–Iæ°*±ÌQïsæý,¡^—§öx?gxÿ¾¿·è$R’&Ž´¯ÞÒD ú‰hJ¯9ê f}]_‹÷€U”˜(ÊÉ]@å{ôc¤kV½šë‚©ªuÓ©UîÛAÈ vJ@ÿb¤ %óœ[|§Ž+¥…¤šf¹ûâËs !£å.`¹qæ’,±X¤{«O¢ü£Ùßc‚à”ÛcŽiÍÏÜÆe¾‘DS¯Ã–u’ÎvIkÆzîJPÙuΞãÏ{¡›Ó ü6 DYÂCgÑ…fÖZ=Þ¢¯8¦›¸ÔjÙc‹ËXÜ^ð*~ÞÐÚœ¨‡Òp`Ì+Φ+Èî“SBàÖÁÐGñ À§ž­º•jƒÍ¿œeñ}ׄq…‘u_þ©8A°Ê;6Ï>XÑÙ@æ †v|ÄvjZ¬LÎLç=T’[©>í…U •kl2]ãMS¼âðÕž8¶Ù?Ejó¯,¸Boégp³sšâ‹‚#;T3Ò²¿¶ßà 5ÏdmJhÔ6²#P?@ÙTþ¸Šcèi]þ+T&\'äüˆ.6"õʵТ–/¬†¦…Z¦$/â¾åÜ`â=Âd{ÎK8ÿoYÅçg-‹³¶ÌÐ/WXîŽ5»„Í‘òDL–|ÎS“pΓªä{1ƒ`HXž2kéêY ®ùžY‚0¾ÝIݧRNºªŽGDýªè¯üTÞWr¤÷œ<ÉÏÇGQºêãߨzl„ç¸9fMã{ƒ%<’+šÑÈ£iN1*÷QƒØv“zt‰ÈWßxu¿8]Í¹Ðø\ -7NÖL,f5¸ºë,Kà–žFV&H•êï²bž—yà˜…¶bä Gý„õ W®=§W¢ ©f4Éìú$ääï47CãÌfþ•Ï«V/nÁïà›Nn¢²9'€²Õ≭'à®?Mî·vŸ‰Z×8u‰bÀYéí§Ý%²¥·ÒZTÂ0»;Ý㪄üÏE®%w~òªˆ¥ ý$ƒv5 Rhõ¯öžßÑ ²sU²0?ï{Ñ*®õrÀï“•yü)=ÕŒû,޾,Ê‹èrÙ4 &XÛéÙÔ‰—]T?´KÑ$5ݧÉfž¥ ø[¿fC-PôÝjÅ0«ô¨6¹÷·xåiLÅe.K¸’Ï;ÏÕ˜ƒíêR`aü ÏBtÿ_' ØõÚh ®aýîT¹Oùb îcÔYP¨1ŒV?oꋚX(˜Í£­XbB©UÖŠS’†óÅýÀÎâ5vaÂqoÈG}ÀýÒ4¢Ø`¢ß؃ÜC·Šæ±høÒB–îöæC ,–!*&–R/äZ*Š7QÙ3*Œè4X®ÜÂN¦8v»?;ÌÚùÆšÓ :}°@¼ë\LÙžñ/ÓÍ‘ë!:’TTÊO?0!ñüûÁE’PØ`ƒ#„D& ‘F’ctzˆ¾T*!§Z Žì@¼ïb¢óšòåÇ!ÏïÓ£±£^HAÝ8]DQw ßJµ>#»•^F›>Ê<>è{;mºòT¹Bïšœú#J#ö ââIÓ(º ¯Æ¯IÖ=4]Á^,)…ÙŠ˜z9Bzt×µäÉÛIÅ뇒™ò_‡”è52ä%ú(iÊèŽx5Œšw=æÏsãò‹.E*0Hzôäí&S ±²Å¬· YpÊúÅ5Éq9|ÆXJäKWߘ(•b(ëEÝõ ÒÝÐçð—{°ûh4Z_ºqTgVdŒÖy°7.’´Š°ÉíìÄyÄçðaYÖ›ösGÑkœI6*Æ©øOŽ*\Ü£vÇu¾©†`GohL©Š6]Ò°JWãþÏZý5¶jd±Òý_ûž)ïÛ+pæFvø†`‹{âGàº4Ü‹|CßF™Q¨xÜèU¡¶ËŒÿÜà3/ü*ÉÈò¸øÏÿ®f‘½7ä1ΡvÓœ°r×·†÷ÎÃ+?ÌÔXÙ©ô²l2Ö`˃gÓÕŸlI—+éM÷Hö&ŒüM0&§€Ä Êx¹›mÔÍ÷²u [j¯vjÊÊèVïÄð™EöçŽík[Ýoö¶x ^ÑÅU!±l)nÖJº §@ãËQÓÒm7u—£C&a­¿Wã!bsáÒ&kýï —¢…À›GGsæ9Æ}ÕÒÕŸœ Ï/C¤¿ž’y¤~ùEòFŽ›h„ü,Þþ> æ]aȺ:²?vÁºþòÝ—äÏ Å’“øfÓÒ]„øjÊQަȥ°¥™}l[×HG„A¥çëy}ŽÛâW–Ü-Jº tÕ{£Èß+Žp“Øa4h G Æ3åøøš¼lFÚ±ÅÖÆýkÐtûÏì%p6†3±W%äŸ×œz¦5Ù¢jðžc>HËh ø¾íÄ ?=üFhà3%T UÁ3kk¬àÝóàÊv}BÇx­UtNP3äËÇŠÀÂ>pö=bO~âñO,¯0?$™U¾|×`Ži0]ÑTúk5}ý¥WßMÛ†ú# Mä³ Ú\9{–K ¸¨„÷©Cˆ„ÌA»Œ¸…¡-&UDãî©w3)Û2О˜!öÅñšd…͋׻«4 kmE Ndæ!}þ“6},ùÖš7Æ=§.Uôܬ´4P~wáÞ½®i•²ïâÅoåhvøgq5/ä™ <:ÜÅ×8À¤å{ì…tòúô«Z`BMÿOVÌÖ/¡fKƒ!ªEújŸ2ZvX2®LlÍ¿ßÎzî$K?Ž´ä×(ß’¾àùž÷¬'íã*œ%0>—ܺ²>#Ü„Úä7©¶É⿦Rî¢ìNBASjžÃ,ò¿‚ª2y‚'D2i !”H!Ü×{ãÓÔ¹ïŽ,’7š6c©Ë3J‹LkÕzE€€ý”¨¨”ϲÿoÌÕ4/VàÑ®àì~ìý½¨0@ÄbºBgl6`s6ó”ðÓD`;O=³¦ŠÙXQÀœ˜ùÎ×3¬3 ì–i5¸&GÛQræÀzWbÜ“í,P„‹IÈ„`ðO,uùÐ7Õ>ôTj{ s®ÒسMß%Ù"Ø<À÷°ow\@Ö/“ó~ùüÂÞì–ÿ¸o ÿ&áhè ·Ï’!1[(å-Ò¿*m^ÞÙ²×Ùš\ñãËðê­ž‰R¨ù‹ AÃâÚ/|ל¡e*r™éâ²:¯`Kÿ8¶5GaKt¢¤`¥Ž§Ï@æµ>ç)+õ¼Ÿ‹l&×>F ‹áÖÀùË YÆ-1u(΀ú#“Ò_ß¡^xꜚR” ¶$DÊŒl¸ñÍÒ÷/†ûÞ› Ãáˆ×ç×ÊmƒéòvàKÈÞO%orGí 0̉•½\T2"à³gÛ§£ÊÏP$BÒ;mFšHg`ò½¤Cäè«WÀepÛ 8,{ȵ}Ø‘íÇ:'š•jüü†ÌHŠ}U¾{QÀƒÝeHå—Bh¯O\;[}ëÜŒ ´hû:QÊãù5ËA—î0]ei±Ñm¶³nEĬø…1ëû¢-žÁ´A¾ÁêÒ}Ù‚àûœ£éþAÙ&©!? &OO8«,IÐÔEªWœ endstream endobj 240 0 obj << /Length1 727 /Length2 23167 /Length3 0 /Length 23754 /Filter /FlateDecode >> stream xÚl»cpfÝ-ÛvžØ¶mÛÎÛ¶;N:îtlÛ¶m§“tlë{Ï9÷œ[·ê«ýgjÕs¬QµöÚU›‚DÒÑÁMÝÛ ÈÂÀÂÈÌ P“Õfaff03²ÁQPˆ¹MܬÄMÜ€¼- 9@ è`a°23³ÀQļ]¬-­ÜÔf4ÿ4íLÌ­í­]šŽvŽÖfV~aWwFwAÆ©7+ ÀÂÚSRÖ‘Q”PK)j¤€@;€²»©µ@ÞÚ èà ¤X8ºìþãÌÌ­ÿ…É•ñß<€.nÿ³pq´(H¨‹H*)ª$ĘÔÅ&æyé–;¸¹òþS 43õú×tô·ÿYv&ÿ³Lÿgý/ëâõ‹Ž…`nmæ0ZZ;À1ý‹7 GçÂæîNÿMýÈõ|ê8¤˜-þ©v·³S4±¨ÅíÜÝ€.Gs ‹@ÔÑÎ áåt0šÿ·ÚÄÞÚÎûÿ·þÿTȸ™üLjƒå? 2ÿ'dí*ií4W¶vû‡r »¨úw\ øŸýùW£ÿ¬þ§àŸ}5wt°óþ? ÿæßí˜ÄÅĤ%´éþ'ƒ§%ÌÍ­,jnÿ0jâbþ¿À¿ÓÊ&ÖÿÑСüWS–ÿë+˜¸¹X{ô˜ÿ%æ=ÿµ þo•¨¨£—/++€…ÀÂÅÆàaãñÿàš¹»¸ÜþMû?³ü×ÿ·œ€@/ ÜúŠ£_˜MzKDy€Dá\$ÝÜŒ±Ý èêtϵªõ•¹ÑŸK¼;u¼Ø Ö2U¯^Ío³—pdQË[GW@÷JzS¬…&+ªüþêÇÈãûâž¶tr–ƒT:'!³!àÍ"u"ÔÊR9 fž—Éõ'cµ=’øê]—2xJ¥"@ÚOz·5VæÝê¼õâÒ…zÔß—´u% c]96¤Cû`Ímê·UI­p‹ÆÌX óËm›ž×Àjwð n!y,Û€ZÁ¥ÎÀáãæ…Pú¹m_lµäô¯5è‰K4&xŽ0ƒx¡<žà+7”áË^~•"¿ŒüéôµÙDze²A8Ç®¬À혥¿¬×/& £ vŽŸŠ‡TúS’Óˆ9Zr-úG0;QýeHÔ?—‡§9Œ}}©…& Á‰  ȶ;nn˜×‰àe,¬œx÷Ä•¸Àlñ¢+,D~øÇ15Á$ä"tpà:rš Ün#n;%WqB­;”»‹÷X’z*ͦÁ„‚ÛY-d³¶/y!ŒxK</¾=—kœuàLN!µõUë±AÈ¢Y1õÒäES†!‹óJs„Òzc›ÆË”é’ÿv·¯=¯g¨ºÎkj¿Ì‰[ÕïìZXôRx‘¸´=ÅͧáwäŽ~ÜRœî2\p§cAÙj(3V€íµýT „™°wdDRF¬r‹±ëvN…°¹tê߃Ë0Åh¶´Äµë›^¡XÞPV{ßk·—ÜßöðÈþĵ/“Ù&×s\<â®õLþüí¦‹Ks1¶Ç/ªJÍaât äû3—ÏsZ|ú(¤‘õäXÚÉsZm«m2 ±ºÃi<ÙÔ‘5ÌßN&ÚÞ zúL.ySÜr™Ñ»*Fc6S2>sZ%†ª{:Ý2ûgJ«7öjòÕ»…7Çê÷mwÌ c–N§‹’9=UjXOž\’‘Ø–Š•§4íÏ¿ÈéôTùâ§xé}(ò`¿×l¿v€±ïXÁ$bõ†A yÝÃ* ŽY#/uTF‹t‹Ñ pbƒ¬÷eƒWrRQ«f¥¬Úðлrh¥>z.ŠC}¾Ä'h­ô5nËRân^ºZ3ÕÏ‚îr1Ó ú"n$)jÁ¶¡÷·dläÒ[&Ôf˜ý0írZ¥D¹ì%ÎY#KV´Î\´¹A¬nn uµlà?³Ø~£V‘Vý±•1ó1Ðd†ÿL:«²Håø\@˜kc@Y]N´vo Á¹³pKiS˜ýP½0!¾Ì¶%dÿJ¯öã*ר%L{\˜»³óJsãÊï;ºþ(±zðé!O £ue̬Tþ»ð šC± mam¿†½L»«¥ê±Š/í•1{0¯“óÃ|´Z˜ÙÇýë1Uk¼v6q…¶áã7Þ]»$ŽÃ=e¢öÀ}ÍíÅÙV2:1 GoP1|ÛKd¢í›¦Îáõ͸g[»p‹Ð;N ²èß³Î#\ê{žfÆùkO?ï‚êú‰ %Ò˜­$7LŬ°H°îC!Tåc?ȇUfM»ÐL;í |àaÚŸ©# ²‰½ë 6fù&vý`¬sØ•èÕü«3;¤@îöŸåZ»îÁ춤ê³5ŽŠrÈ®¾Ögp&Ùñ—Ñ€åÂl2ÑXð‹>Ò>48¬í°O¶“ñg!@?–ñR%!Ö¥Ä5\V¿rê ÑÛué}•j7ýéi6ŽfU‡VHa‘¾7ƒûLi0/A!¤¹¬Æ™^þÞuÚâ|E¿f¦±·rSÎ#™Ô`¬Ë“ȵHíÉ·Ò_ºTÑו¹o…ÛÍ“Óïëðv£@óÚ¶-¿ê× B>5ð§ßµbåRØ´ËFZ«‘Ä "$(‡NЮ='µ& öî¿™ÝÙÝXQÜ„@aD„·\÷\|‡‘ú63‘Êâ‘] «<5uƒ"i3 Rê­aK­H?#©ÅÉ[ÐÖ‹¦  ”%j¤!º‚D‹ Q/CHâ@¯¬‡Je\­j)+(ĪùlÿÊDñÈKjZ+cë¡\KQúaE¢L`Dìëx3±ß5þ;·ð`ÄÆê˘)G¸ôÅzï:My+!µùþD3ºf²ÀÞ¦Pþ¥3â>:woåƒã@⤇TŒÏ-Ñê—;£?m©É¯h*6"óxmÄï8¢l5 Ô¡<œ ¦KÚ'œK)ÍhY”ý1CãaFÉ:Å_ù¸ uJäqñÝrŽÀR|Í=«´Ê6AûÒ«¡Þ Ö¹aWWõ *fmFl^\TH µ;ÏlK¼ ÷ÀnbÂ'‰¯3xª©L1ïò»˜= M®÷<œáµZ¤‡Ì>×^œ¸Ñˆjã™]”-f¹I³ó^ühTCúKYC¨ÉÃÝoiu+s‡Ü.•7 v²´ôAâ±6Í`+·¥å¥j°wYßLë`‚B'v«y2EºÃ´Ï ¿ŸyÃ'“ø3#WM÷˜ÑEW·Eï™™bZ0½Ê2ÜðD-²Q\³{{(­k]Ïæµd.éè8ÛëS–ÖÙ­háð‚ö‹çˆ?•?/žŸéÔlÓÓ5$±„:WX²d›š¾nYëdNæjÿ:U瘟¡$Û{UæÂTŸG"ÑÊÇ«Á³“¢T±o‰p‰¸Z¸ç ׎q™©Ê{ÕáV.áÒÔš»%el\® ¡CÞPvÃï‹=ªåpU‹]>´½ßóBá[tÒ°ˆEfÛCË~ìh(ì*NêHh€ßàª{Ê8>m4Vb¯bæRp=™ßš¿ŒÎü†a¨ÊE=MWsÔ\E2§)®ÔËCãÊßnVíÙý•@jÚžËÂ|òÞ¹»MÐf{C&Íìøü‰|™ñ’çm/¶ä˜ÉQ_/cÈëÅ»[Ë-ê9-î&KªÓ@Q÷>ñýc^tÍQh“câ¹vS˜-oÎS`úg²¾l¼44!\3ŽCÞ7•”SbÌêz)9€‹ÔM°Ü"1ɯR(E>*< Œ)®Õ“´w cô—D¤ªFšËõÜl‰ !J;½®²ü™ƒÏ¯løèß’Âl¡;„•}3 zJHJˆ*µÁŠeãh Ä þ£’t\Ýß–ù!Q»XŽh¦\`J ’éÓ59WŒÂ ‹æ-V»FøâF9ph(}w2¹õǪ̈s $f%&-žf)£ª¸¡T¡Ÿý6S a¶[QÌF»¾ön¾©Uýð »É)fvO<ö%ϲMv™ÒA_ L°.šÂÖ¶\ˆÝÙÅ\XÁøK^ˆ…¡?æ}ý` ÄÚ¥Év“o=âeÒ2;+X·ò%wøPÅ]©q ) D¶†°smŠ÷$KNNlx¯ºä½2R}¬$Õr}n©¢̾D•ã¹=¬=(@ÅK?LŽ«é?ˆux$ý%T=ùâ|È+é@4(À*wx?~þ0à­l]d}ˆ•Ý®Vû«s¾{ŒÄÜ¿xÛ”p !¦q‡‚yǡۨ÷cšñÁ×Ë=NWšøLd»#:-æ’¶M.Äœ VáU™y*uèmŠ7aP¸ ò˜O7‡ÉDzãNÝ…8t/gÏzÁšqôñ"ip…ÊCêói©ÙÃ|ËeLÿVù-ŠF…áuOÁP”Ò%ª.þ¸kàšP8ƒ µ`ÿÂg¸ÂqÉ‹*ííõÍî2¡Pc`B+€Yª1)´9.™µ´îgÇ>!3vôr‘Cí|®òE†ÎK™¤Ó~Tpè7mt™a!NÄc3¢QÜBùÅÍ7HZ;êR²õ8F»¹Ü®ãÒmö¹*J,/×ΘÇ.Ðe¬‡ÅŒË a—}yêúñXA 8­|ü…ˆp}xxÉZåòí8n°e­Em.p•Së8†H²é…‚3‚[Nµ ¶½Ýcñ HÄåžöʦox2ÏàòÃåXdz† ]λ¢Saãºip9{1š1¥×ÏQ??ÀŒ‰2iÐؘË…" S±8«!ÚýJ.Ú9ÜtÑëúˆê¹÷qK'Éåk[-‘“Gªt—¬WËK®çèÌŸY¦ahZÓŽ /,,ó­Š: Qܰ©S¢V­ŠZê#?çqF™F½Ô/’©¥FAâ$¡‘$ÿ´µccKà˂șóêYå˜òÂ×Y ¯…Ú/ì ²ú}_‘Í­Žtƒ%‘>÷·;"U´&ͧ!p}Šéiu¢û?ëJÆþ|¦#®òia¯;Ló“·ma/{&àT“´3 ‹c rÅžyNs¾pÁ×ÒAø0+Å΄ÄqxV‘G—<‧&¨°)(B«)ÆòP,„‹¤‚ T>»‡rÉúQ’ÍÔÙé´07û¡j­w¨iUWZÌý¡áÉ}é[¦›ÇÌèVg¬\-ˆîH¼SÁ–F’ãØãòøY¬a…PíÁªƒñÝS”¿s/UØÜ|pÚ5Ab‡/ÓõÍ•ò}®%³W ¥XNð‰ú ͵M¬efØœÿ.0Ë¥j+2Ëù»¨üù//œ=¼+aöò¦÷§VûûSÉì”òØ ÁQKAn²Ù¤r*]Ö<µ%Åw¸èd¼g{Ä>A•É[YÙ¾Ú|oá€k'ðŸ XÔŽ)Ú̈òã…õÌ®wRX7¤%¡ò~M-C<§HllëÐwë4¤(GB `YÙtõcd×[^¨ýVTB ôº*ì“Pƒ1Jb}?F[SÍŸìŽ 14rÈÃB*Þ¼çvÄ›Mz »ì6 uüäÅ¢>TksЬeËçhànŽÂ4•~hî^L>õkF˜ú š3ll¡‡Ÿ×û»0h~²±&c³Fº6Éþ~Ý3»íR_­à&YPŠòªPÍáò‘asÊàæC7»+~½R¶I7 ¹·ùxF²Þ²˜Æ¹òvëŸ+rK)Kó‘#S|¯x>>ª´1tªD–šÆ\øù„Àôdö¦Øöˆû¶Ž€R:,´ÃÁôhj;™6áÉxû:øLúsä$ûJÀ[–‡=Í8ªfEKƒ^óc¿©¨Ûëáó¸xTö…#Ý›°ÍVxFUÑîB _Q¤ù¦FˆŸJ­÷j&c¨4¦xTð =K,+Ö©¿°iL á'±Ä/N$w˜- ¦‚Aˆ{‘—J©š=›±`¿†+¥™û˜ú_òæwW ½ k¬‘ÙYM¼•,ª4¿°°¢³ì´–äý²cr<ö/73vLÃtå1Íð)ÒÈx߀ÀÖaÅæY•¼ë£¾—(FÐb¨dÇYЫB¬ñ6„äη ËÆ‰ƒ”?òšÐéPª;hª«§ æ:"ëËŠÏ£ʉ$N¯‹Í_,4N{w¾?ßxÞÜÁ)éjR¬”y Ë2ž¶†Ž{pqH®TúœäY,÷\>ЄÎõT>º¼æyvášY<·D5<ˆïòœƒùt…þà—á`™7%ÚŸ3z3æÕM‘¹¾¦ÈJ×ß?EA0“Scˆ:6à0© ù9á gæX›€ì·¾E:[TÞ.©) XÊîìbtÀ›RTï›ÙD&íbMˆkËl¤Ëp˜ñ‹éU’&æJÎy—^x7/gëéè]’ BO¨yʃlœþ^º]h ^ôÚµDùJòN#ò°†Y<7TÛð›l’#}‹«ÿ²§ç–'¬Kó±ôýú+Uö×(lv„ ?s:è¤m–¹"}› [*»’¹•¦÷+ÖHT"ujä@|?-Ÿ÷A;§R cx¼®_)ÍŸuøýµœuÐçºMf’W¬ ƒ„Áð¦(ZLû?QÎÑàÃÉ«xËÒJ’ Ü'mxVË™]çòûãP ¡ªŽC¬('äšÏ†ý®¼Yû¡J, $5P»q«fåÁI^ú7Ââ C·÷ô”¼¡P7†+ÌÔÁ/fÊl2-":„É¢êS=i÷úÅÂt ÐÕža(“´w7>¾~皉Èôx|8¼‘ˆÄ>—¨E>™Á¢«hº°†ÓŒ ®« åh0Kåý °Ùža ÖÕX]ªz)ˆÇŠÂU6‰èÕbs­–=Àvr¾¸î½®z$‰Åñ}Ì–¤ ÖÏ ç½ CâÓ‰?®ÁxGå¨Û`K)ú ¢œ‰;9Ön)À™ý¯C …Æ¥Q#cÂVêUЋÓ-Æ·0 Xd%PÌø×ø§>è çÝÁ€¶¯P CÑEšâ n“x xËAí‚®÷Üvé«JÛ¤Ÿ‘,<×)0,ªoঅ‡q³eCãöÉí:å29àI›<•³Ðco!+‰ÓZV¥ñfQâh`îïâý…ƒ|\‚©û/(|N0T¸ÆÇ:ÃNý A%$ïO7 îjÃzx?‚l[£Ó‰ìAhÕ:ùmûèmSŒ§ñƒŒ9(ç6Øâš¹b€#Ð ›§¿:22é‘óÌeUn¹¯°Æ—jG]&7øBª7ø+QÛJÊ#³KûVF­R’\Z¥É¾)ÜnBà뱎BŸêüž õŸÛaý‡fg&¡¨(”«0Š+õ_D’&óBý"X§ß¥S´ÆéÌ]"§ » 2][:JY¼k4UæÌ‚ˆÃ5‡j4¼‘&a ö×Uƒ¯â³üx¦Lb N@/W·¦&çv*H´•«£9í?ÏφÈuÈÍÉÜb‰ù¸ºìX]‡§À•¯Â«ñ Ê(—í¤^x}PɵÜJDiÊŠ¡xÐûœS—Õ Ü÷Õoîd½Ê–PË ¸l°zøiéz9Ê‹Õ&ÌÌØ¼4Opý&{˜´Ÿ‡€pÒŠª*Œ',ƒH4Q¿COf©ÐM¶ÝTüÛå‰Qv)µ~3ðª0ÿ+d á@̬>ê­UÄžúŸ3àoýÝÐ "•–x!ˉ’_zC½cîgæ-È.RÑß5wî/ÓX«7C$j‡f¾àFDjÒE´l!n7”¶zØþFà —gœvòªGÆô¬FÍ02¢&7?Í0e´¼¡Ó*ÇjTžø© ØÇÒOJs8ÁEý×@‚LýP³ †‚ªC.,. Ü)EÔØ|Y²ç¥_¨ÒMu/ÈÖ˜'2ä®Èn Å‹ZX½Ñ†pùRŠ[~‡Ã“XÚ—èêöbôà:¢[\vZdá ý f®`tþ½ØATy>ñ¾>Ñ(£ @O /x:˶(Ý'Q8ÑàÝÓãÏ€š¦ ¦=`ÄÆüxñMÊ’ÆjÔ¶‰ûÉ¿âî?ŠPz£‘ü‹©Ku{$¥’ŽÌ–¬‰á̈‰ às~ TËÙž¢Å›0½‚®©ólÞ5îà©’¿õTVì_ëÌñ­É,ºoþEÉÞbν½ˆI팟wøÇÑá¤=ò—}“[ ŠôuUì);džR™™Í'nØã!¸kŽ÷Ô(­Ã%.í [Èü¡\É6•¾àö2áyaæ+mýçÒŽ€-§0ödê¡°b‡Gî‹h’÷©µ$µÚGjP¤Z“ð tJñ ¡×›q`»±ª”PA!@¢Ûoi\’B Q¬…§Î ½2¹|¾GzÕ ºà0°°rsù3>*é ’ø?ÿŒd„IC¾.¶ßŽ Ù°°;¬û¦‘lt¶ü +k“3ÜÍx>ŠÌ›äÉd²a&mk6 |½thl¯2Y7¨Çg¨áD-Þ ºu?©d»<¢6Áª»d꺨Âl–jºívÃôá9xF¡‘¼ŽHÑøÁ7åÃn)'…aÛĘ̂‹-ë !†òNu“þЀ)m2 \~xqf¼‘á‹Æ`ÜæéE.ˆ¬Ëv,1i²K'¯­Ô-©ç‚VY5ÓF³êÓ€¡z# É›x4i¹‡êý”{;~,F’©Ÿ€w'óÒ;û‚LV“ì>Õ-ë_£~ßùc,‘ZûO„½þœ €$+G`¿_¨ž ¾¬ŒãûT‚•jî#–¹†3#ü5‡¢ y2–ºRÆ$Ÿc{¥Äÿ < \û0/û}Ö<9Íÿ3ÉÎZ„ø@ð !–òæf`À¶ö–\«ÝxYl‰ÀY½5½Aö·qmãwUñ¹$]Ì+æÁ²`²žï/.ž¿ÕF]…•CÄcÌlÏæ—¬·ß}[2L ,a”Ÿ~Û§°Ó$D© ‰­?²º<Â\äÍÎ--V’<:‰Ý7i”är•ÒÀ×ÔãÄ\°Æõ-þ´ŽéB¸qònÊ ï€Ë ñŒú_SMgOúv{n»HÍM³~ÒÆ=5Ï¿–‚f®–t×iÃ'Ã}¿ê¨Ã*s8{Ërýzq~ µ¸{ÉVÈ!÷NbnÕ¯)ƒr§ÏÌå~ØLÉyw!ôÇ(¥õϹp `{T¨YÿEaÊܰ6\L –Pwþöz…­§ÊÓïúK -”? /xÉO «5ß;¾Ðu‚A-­;ƒ\*à‚f'³9iÒ"þkTäÚw€ÂP›µºÚûKCU ¥0éÀê7åwwn™Ù=ó¼UËІiÖ›0ùÊÀ‚öŽx\{”sü¸Õ¤á‡Ãã‹ÄØ|2–]¢‡#˦è^QŸYÀЖúýdò[§AN7­|3&å/…ú@I‚”aoîÂ>d🆘:”MhL6ì½ûžMó)<ôR¼´ÇË ì¿‚çÎ~®³­ì·¹uØÔ=ñH‚”ò»&±Ã$tCEžM:]1¿?XScï0‡×Ç Œyg¤@ÇYptR,äÿõöGž2z׈+-D?·%xu®ó«)–{ï;kÝ‚Á“¼ò¡ˆë‡°ßljÀmibÇ0‘¬ÔMsåø6ŠpÛf]3gÝÒkì(/ ¡B³šÈª..JŠntö^ s>%^Oá…¹æÒ6DÀÞIÈÕ.½á¢Ïû‚²šbщª•ïj¥¤'’½xׯŽã¯ÂPM”³ Mø[×2}ÕÖFöZÍÌà0ìÙ’¡›tqžËM‰b&ê‰Âá”Øøëkàuœ0oö™ë¦*4¿†ßðˆëI¶ -/®.¶Õ>R—ËÎyµ1þïø½Ç6¾'nâÃ’¥¥á™Nhú êþ‡Š‚ã”ÚWdž–‰ÌxÄqº+À¹©µ÷ñøà±YÐy‚rž,ˆÉ‰´1¶uí~:øúx`$Iàuà ɾH2k¸%²ÛÕWÛ)"ˆ/@6CÁØs·Šøp}ýÔǨUbQg.†X míLƒb5mÜÚÄkt( Z¼ Þ®ôgòý‹›Íwøk˱^MIÁ{†éúûÞ–¼.¸_ÓJB$]VÎéÒôëü»o­Íy}žqÂGÙ2Hœ:޻὆¿eçÝB\wd"¦@*Ó¼Òž«… ùóçÙê¹Éªøeœ|¶ýŒ?ãMÖ:™ nýÕ!ÓiÑgÉ5xZ¼FG"s»§R¾@|L¯£Öä–LÍA"|ÔM†¾ØÉ’Ïï†;I¼êDEA3»4MzÊŸ2Õœ1ÆÓ‡åíØîŠ’ORLò*Ò(V‰”—•éÀõ"úî_úlÆy3‘c*·X4rxn7­34Ç"3BÍÇïN#™„ãÑêæ•À¤9…˜ßýiéR.tÃX£±›œÝ':ožm%ßtð™SÛ¹èvß´9#]Ü52<Ú ò8 #"“Ö#í{cAÁËÛÖb¥ºjø¾kö?[ýŸ²²õ á²$òŽ\—æSY ¨úòÚ)aÐð6¥å'Â@ž2’ÎH¤7ûÈWou‰w-å¨ˆÎšŽ™N«u0_\kN¥H#>°]DÊ#ˆ¦ÏwµÜ2èP¶+ î«BöH¨Šù¤tò©!%x¼œƒÆó—ikÕOJ¿b\æ|–BÖ±¸Î–€¦Už¬Â÷Û¶ZÍÜçXÜœˆ±LDo(Š·èòô[ÆÀÈúÁû&õ î=J¦¡|Otð¨«ÛGWžÿ8v:4|iÛR|PÀ±Ýž™ê ûcS€Ê•FCœ†£f»õyš¸¨ž¹x㽋¢þ-Lnö¼‰pìqã°7ŽÖèrÿƒBù<…Ž™ ͬ ú…ý¹xm@‰¥åÁ¡²ôë$³ç¼¹¯ã=»“ý]Ï©êU“NÇç@üƒ¼¢~‡îË“vctWåÓúŸ—Ë É0 ¹gœ¡6û–NÙ>­Z-ŒˆÐùr·-xVÝ›:Cª§7(ÆC˜×ž‘]:9ìÅXÇVUíO=™V8èàbÂ5ù*´䨯kÏyYeàÂóÅMlRÙSwºÛó÷݈¤Ìd}€©¯ÕPÿøûåò·•gÅá% ±´• H*&ùõÎ|°€+á£m"ɹó,ßǰf Óµ¿œß% ÷G9…UÔŒ`ÏOŠwÉh9°g Þ¯üãMd•€½xK½Yað qÉ¡DÙfïaHænçN%›1ÈniÆ„‡>C-ô¢÷|ΠȺ9UaVì'¶´ðtÎ&Hdˆ4éÉKŸËe–åÜAy­¡„£OrïNÇ^á0xöÆ ŠÚJ&Îh¿ØÂ{-ZS ] öÛ“ûȨ Æ%/­BÚ­ð^£›Tš[žVË sJ@Œ=&@zO‡h®ÛV6ßÃÑãøÃewbÿí(íýª·§ÉØš¥³' ¸²?!=†½Ö²¸A €Â £pîyËÐ*ïŸÀç\ú‰É³õ=Ý«Ìê'âEGÑ^ÍŠ³¦”¼‡’;¨¥n6¢ ýY·!™+û™%/ѵà|³¦P…H'WÕE±{]#žè\Ѷ¢9¼êkm³2!’zNÇ–9 £Rÿ4TÕH»8d|·9ÏùŠbuÚ*¹õw‡Q@é5‚î‹Ú)6#¿A-ºPÿ(¶“—Ž@=.ìÒ ˜ö‚ýñ¹« ;œp„ûÎpu‰ùK°á:ʱżpŸ_Úˆ~ì¯ÃGœÓÀO{ÊÔ‰Æ8TÉS»tqôâ±ñ¥1#Ï…¾Ž¡^Ù+¯®Îþ­l¼bºú yî$6zeò¾·%F+ ‚Tg£’™„h& ? ]ª±„™h°'1ÌnZK0\ek9-«µ|Áw#‚1÷M*~›¸ÕÜÌY¬Ÿr{ßt|À¿n»SÁôF&]#ûIó¹pÍ$|JÈ9:y¸í™Æ›a…¸©uš†\µSÔ±0ž²ñ’K¥áDy¬íï<Ÿ¸ÝË,y™Þè5Ø g eAñc&»áýÝàŒ.Óî/Ó.’»3UÌ¥Òt~n#\õK@ABm|kRâ;ÖÑ6ÅVý2ƒ€ëhÝé¸ÉÛ·4¦ªh“¼ƒ6ÓUã¾É@ -¤„ñe IšÞdd‚jšÊ¨¯Ù Tòu˜ws+ÒÈr$÷¢aý­ SüM8îS³šÍtš,NÀ"í‚Ña³Oc5yù­2òÅ1¨&úy¬çaï¹Ôø¶¬Twj¬Iù•×+>nþ¦–}.»èßèð¥ÁMÚ½+½àPUk9ŠÏýkP^_›Ç;§ÔüáUëT!hàrTþªoÿ©Í[ д¯`ÿÖ䌴}¯"cdvÆ æÃVù³ý€-_jÀú!´¸i&ÉrENO‡MYêhÙŒòÒ!Pny±õ³Wvà 8‡×‚¦2‰‚6äÁ60™L{|e7=¨"øh]ÂvkËà¹G¡Úù8x ‘JûÄÿÎþla.N£é>¼‰nã  y´æ°äUÌÀ‹_™!˜+¶7C»dûóñ÷×NßÏï/¿¥?i dzt'˜²×ÞŸSúŸá~+9B³  ç|†S/z6äcÉÇS‘‘¡­üíL\ö‘lÈdçö˜V>øŠå&ScþöG˜cÀ|\Aôïì›[&vâV…ø]‰X™G@d¸*×® ™?ƒõ1ë¨XàŠø3D)Õu^Å à ÓY‰ó,׿ŽT×6eS,“ ¹T»Mànß®,Vé;!nf™F(%…!™¬DRE70Ýäzs–äeÄ`b(7ú5Ý(7!Ö÷×eÄSf0U’Á5‹Y)×N)ÍfhhÝ·Ö Iã|êÍÒ™ó,\¶C= ¬Š|zÐêÔ[O`×EØYÿÑŒ•©T•ÓàÓ¥å1ñËËÖqÞãÝ{¸Š¥/*[ök8+ !3•i >êOÒÿ È‚æx m–Y‹þH*$¤Ùá›>åúP=fÐÓBV¹Ÿy 74erVš9þ=Ro‡ê@‰¹k q&™ñ('­ ÑPY_£Ï„ë¶MÓöð‰=xØeÄ‘=Ÿ´Z}$ýbƒˆeZŠß¾(kå‡Ä”¯9tmùî0¢Žµp®¢z®BI߯MtUZýWðˆ3&×>ãJûJlùáÖÿÌk=sóa¸‚‚–¼ô*v?o‡îšý¹O ŽF5–\Ƙ|S3êþ’›™z¯„À¸€° <Ë¢Ws•hd@ÈI*Îl7Ï,ºùÖ«Ý= †º¸îò~ègA~°š‹€v«ê4˜Ù>0.³‡É~îŽ}¹‘0Ñé^©F÷etŠÉѺJ¤S£qó¼|›>ÒxóeÙ/xÙCuÖc¢š¨ú.ZÎè!òKï—èMmà çÍà|ˆœM"£0·æeû}ôYoÚ4¢y.¦›Î&Vˆ†øü‚R°“#0aÒwÉD2DnÂ<Õψ`ïXuv€mkžá o l€T©½#Þ3l`__B^ª·µž!²JÏùžóUßk=ÄÅY‹ýð|Ñ YðдN„+EÏÀBÇÎ~n£­YÿÒiÏ$‘™‰"eúËB ÆÅШųUö[Åîƒj §¿?)–ßô^iÀJpúlå²j¥çjÝfx¾¼Â¶ä0îtßn§ê¸Væ/—d#7£`Ç Ñœ…€6‰ü\_”mqNm´Ô/º ¿²iïž®Š¢7õ¦³ñL×yÉF ¨ã¡î@±Ì3cëN~ñ‰üN{´°]‹~"Ð{Eô_óU(­ìIÓnw=Ó𠈔Š:”ïÆ$1C•ü›Î3ó¸a}"RGɧÔ~|ÕW[¨­ì‡ƒ ýaÈœâdàµ8Ábü‡ôù‚6S¦)zÃf¹›;¬©mä™ò2uÉö^æMm#^Á÷Ϙý€RÉS)’` Ìή¡lz—cý'lE3®i”¬ú¶ÏJ²kÏŽF˜¨¢—èUâ8O96·S/wuÙLK´ð–0>€’ ’ãÖº„‹,EYVbcrJ.xD1+|Zñ1Ž ‚R°Ílù G¼¬`7²(ÂV¢É,ÓBDå‡7ži˜¦è}¯Òé´ì áŒÎþ? ˜g§-]j ¡qäkCA>÷,ÊÝ{ªKÃçI©ÆÉ]àÇ!“ Ú ŒZ#u>7ÿpV.öHtCŸwþFóªEÖU37ðD4°2vça,²‹RÈD;Ý£°²^]ž$RºiËîCb8VÞ±}çõcÔV)ÖÌÆbb–¸m Œˆn¢ÖªF‰PìÐÚ|êVäÚO:5n‘›RûË fõãûú›|nš¥)$>¯Qõ‘] *xëšñ*õ:‰­¢AètÆË‚ ŒWý²ÈAjÉCfòŠ­âÿý®i¾(š!8 ZÞ.ÞŠÛb½´Q>÷U³ýÞš®G `²A« þXûC¶CË\LâÜhÐ7KDñ_ýs§”KòáðQ-³b!Kc$Ž»"6•€.ú)1e´A?$^³xnžK–ƒ}(m#ð8Í•jz—´jžþ™%¶ …³8Ü uÚá’¯¨¼R­s;öƒÙ†q\Ѝê7=˜Ó¯“â#C½$±T¯´'$›ò-MO?aDTµi˜€0tF¯XÍs¸j’°ð¸“ý6}â£ë|ÍA9_MC¢ÛA¿i%ñ2‘Œ­E™áŽN›×…Öç¨Úr]Ù´‰ú­^¦|?œ0zÖ\¦‹ÿê¼^×›î½ÎšœÂ|hîìã""j<õ©âwÉ\¶‹,ÖËAÖÙ&öڃÔ8\VÏGÕ×â?þäÎm¤Ó ±ù£}³V$Èî¿Õ4¨œÕ„<1Ýc*¸mP¡!°פ ùØøƒQù£E€gKÉ/Ü©7/&Be5øÌ&mÅ_ºdí¯ŒCÈhIøÿýá庋D¸†ÀÑ–lÔt‘Ee6ß©E\£zÂ%•ž¿¹ð3oü!|EìÆ%7|é…ÔÓcúC%^0T;õ´Ë¦iN$‘éô`É|ÉÏ·CJ*ÊžwEèÑG‡—¿`QÅ•]˜-ʦ”˜´¾>9T1¨÷÷ïsª55ØM´3á¬oïd^ÅÌ_€iÛ6E5w n"lïÃO§~jÔÆê2تê¾4WÝõxYo) è§ü¬2Ìgüòé‚)ªpx‰wÌáªÛ‚5õÙ9eÖ­K ²9é/šOì5Õû¼Æž“f&þe—˜Z¥²’Ú»6?„¦[LxAÉpÂõUµZÓ`ñ&[ŸfLj ÂrkÑk\O삜Çf¶.ÿ9ùGï*ßÀàëN 3Óèâ£Â ƒðt<ß*ξà¨Ñ µ:¢d*TÕ9jx ÅEvjmªjƒ¯?ï7€,§ÀÐûÃ%áYаžÂ=ʤºó{‹º®³o7F`TŠ@m¥–ÜÝ~˲Weƒ=‡…<£êë‘ô'9U(ä—µ^ò0f³ÃJìáêÈ*WIÉ[Ók'wM ÷š˜Œ4ñ Ÿ5‰Š ›¢-Z™r_[PÄXCw]ãL„†þËõk'§iSÏãùp\Ž’>ˆì.Õqßc Ó!M]í›Ìh×ÁñQƒ\oÁóвùAETˆÔ˜øTô,þÎD=8Ô}2Ë8'Xçä-“úkÈö|ž¯"ZFá %pxˆMºñ‘YŠ%ƼÂ'eôñÖ¡qP=é?ºTbgIÒ.ÃÄÃX uÛÄ#ök9ÉúîÊAádæÃ1ü^‘çÀ¹¨vœý|qþ¶è€NâþÀÁ)?Ky–Zô¯¾H1xiB½™÷ÒRâ)ç‚*Ùx?¼¬ú½Z+M õÉG o§âëïL•uäùFï”0û5Þ`õtÑš[ÁÏ7úô4äþ\p[NXÁv ü=#çÕƒ$Ç0.ÉÓkÌo Œ¼r=~ïZï [',ì–yX-ðR'ºü9ŒbõÅ­_ÜLn2W§Mþ”@ƒ±ÏKV·6@ˆ ëÜPkp=ªV ôVh¯zˆ÷™ÛV'#Ýs  Ý%ÍnÐã³ò;~t›Ï¹\EíkÙ7Ûýsjò5“ÁÝ•pãƒcöDã;ÃvÄå -.Sõ[‹Œ¶*ù­©BBjų¶¯r˜%¨ã÷ÜÈyjxp7«_L½PÙ…ATôÞFˆ‘B6Ï(pÙBŽz ŸqÛê.71_Øþ椳Ižõ›SŽÓîV(W—"M|f»1î¥^YtJµÂF„J›J1–Hf5Ûð Ë [¥Æ¥Á¨Ÿþñ·‘ªPm5"BTOÈúþ™íÒD‹ª¤„)²9K ¼7Â$*„6,õÃà2”r?QûïW$ÞwÓÚ!¹Àm÷ô!Öc|—[î“Z¢VçÏèÙú'O¹/;X¦É ÃþJ›á ºmþÕ”wôúÜ®®á3Jf(YöŸÆ4žægueÉâ".¦÷æ×QOóEutx"Ë…s#ib3IMú˜^xÈ‘Œ~¶©˜"*³Û&hB"ÿD†ç•·5DùuñÏY@Ê­ÝŽåä­.<¨…‡Û¿Èü´ðZN%j+™áŒ{{“½ýw4ŸtJΩ>{À?PAx  ÒC±ní=»tÛý™¡5ñ–ì8Ê áî¬mï87êsqö ÊçÂ?‡ì0n´_XåfP®ëYÏÉ_ˆtþhn:Ýv*¬Ú„WØ…ŽÝc"¦²oû£Zé.+0¯r/àšêYØÖ¥_’^!¶“Î9ã,iv^í¶ ¹l‚°—’©gª© re/J·Y:&3º¿©Wþà‘è@ ~‚Þ’Ü mdÁY9ÌÞ/Ò“Z!lZ4~rLŽ0ûÙ©*=C(xèÃ2sùl6 ±óÁªóÀ\ŸórüÜÌ/el¼e·iñj‰àŽ¥ŽÌ½™æ$"GB,ëK´^j‡»ç½ÊU43úðÅÄæY$L6K)(C¸çÈ]Ùjcê!#˜Ö3x>™ÝRd¸CñÒÊlˆ}¸É./¯ØëÐÿü¨ê‰Ñç/ãQ*ÏŸ;ä ÖnáÍ¥¬!E ‚„ BÂo·Øƒ"p ²¨ –¤j!¦þ–(4;À–ÿµEÔ¨•n¥-ì€{ä°ÛýÅeFª²’·öÞh[‘ >_Œë„2½¶˜ˆÊ ôÏÑ/nÿCàÞCˆ f‹UmÃ8‡£%Ŷ4z…\ªãÐl0¦îÏÞO Ñt»mh©½™µzg<ÕH'î‰g··îaʨìT^¿k[#ÒW“«:ó!ŠWÁ_¿Ù™#ÅW\ןû™àS+šAw©™¿¤>v¢«‹˜T²ZÜámþ¾ á äc#®&­ö/^u•/p[l%Vy¾[BSM±L—Õ+ãÛæå Í7|Ÿ¹çFÕ72Ñéßjw,1 V ‡Õ1Œ‡ÁG.¯Ùœ`Ò̯µ-aà*³ßJDï­ñ1RËÕÑØÁVgÍæ4;AŒh4h€VûªöçHÛŽZû15Çp2êu4'=+m”µßÃq,Å»Wk0þel7ò2±™Jܧ»t¾^¹Ìáê›;pAMB†)qbš{•¶ W‹ëúQê$ö2×?}u)y¾:Æ'y†Ï¸vÐYQ‡{Ê•ÅÏ«²•"äG•)æ®>î-ZK’; ¬@ROC ±Ù&V¹-h€}££€Å·e‚òT¿WÙÏKCý‰Ð±òϹW.JÔ"…z³p£Ò^ñÄò:ñ¸nðÓ$\[Ÿº ÎÄ­¹}§vùIYÕbF XÕ¬õ³1ÜBD@M¨ÿ÷'Ãl¤°T3“ncYTû´ª×|Ò8ê¡ÉA¤¼¿!ò€€m~· A‡ã÷†¦÷úo”^/sÒcÃû+×ÄpóÓÉ¢f¶Œx–ï¦ø¤†1µ‰)Yr÷ üª£•žMÿB:ú–¬8‘¼Y#ómJN­ÎšJ×l`&Åß÷´–8Òà¬Z¶8|ÉÉ«XÀé´JSMV²Â’²:â1ƒìŠE“ŽL_#Dz€ìÓç@Ö7Ôѳov%Æ£XýcØ®LÌGÍýh$æ!ìÿâãÞŸ¢Î~­B£h*V®À9~}üíO Ôz¶}¿DXi =™«Y(öº û×TT‚bÞÞØÞ¬÷Û¢?§Ý¶Å 8Ý‹îu.|ºëzѺÐE}ù€‚etrÃ$Ôäú‰c» Y­A>û,²è-DÏ=ü7P!(ýŒ$Êí1#RZ›…D³¡µjO|T±âÒ]á\0C¿ª—B@"}´•ʳøUßјٚ!פYÛ?Å.થ”à ÅF¨uYWà n#„8ù#,‘ñzú0'±NåÖ±ðp1: Þ)N9=€D¡ß„ì¹1ƒ¦o¡”ªI´ö5dŸ ;c– ¶A#™ÚB_W«viþ¡Ãkü÷OÈpS§„Â.3ªE7"Ñœ¹Ÿ;ÇÌÊ&Ê&ă’L Vh~_C>ÑM“&ú«—Y£à%ŒV™”Ó9Ë,Y™Ãæê /ùðþ|µ pé2„dv"Øe*&ÕÍ]·x8VGø)|(¬¹7¶Ë=(qÃ0¥õrmÆs2p ¦ Áe—+Ð@ns®Ž‡}#¼Ýh_ðÉöqóŽ/úáPÿµ‹¼d¤7(î“[¡ñà•øñM”ß.lcIû~¸“p&îÒ1^=z"ÿÑCzÇÌþÛÃm!WÆôižÂüTÖ{xéÂ6Œ<21zõ¿#ŽC?·8%h¤TX´¨…|18Ê¥˜Fº´z2$"Ê 0O"ˆv®ÛàÑ~ÕM—JèíSÝ59L^:öa]üóÚ~ûë*+wíÔbxãÎÕ ªŸR¨[=2!%à7êëdMŸÎ{¾{SáÚaì~ñÊ_ž’¥þ€<=Uƒ—Ášc`Š»1›¹é×^Õ$º".Dí娭-.·ËÛ ð¿©‡Ý³¤IïZG1²¥6¸ÅýB9KKŸ“ÂØî–õ'„˜x(ï…(à"`\ºì1ü‹Ü¡4Ø8È?¨ÏÛN2·¯‡éoU'p?:æDɃ¸ÂÝs# þlUÄÄ‘÷‰Üi Ü ƒ¢A¬ðæïV5TF¤9l»÷Ò,Nø.»èK;²Ô©( „–ÓQwj(´Zxr0–/º+ñü°È­} ðIhe²}Uup7{œƒ„nÙ;eMîŒ}ÌÀ‡´+àX/80²ŠÒ ±Ú”}GG2ü¦d¸\Ë{vŠšVpE™øà§Œ%2çÕpøÐî[_DÊüD‚ÄœX™lbFY~ç³}Â7Hõ-ä$®¾¦ßÑi$Òc«Þ5:8ÔeÝ¿ô#žƒÐ§0fòY,?Ð1…->Ѳ €àBPT¢û,áÐP ,ýpûÿ²£ ›…+J…œJNÖmQIÑçìdî÷rê1_TìÅæ8@¨å™|ª%’ÛYî tR͸PÎ.übãu× ¡aê¼ê¼}'>q$¯®[z÷‚1SKAœ‡WžŠ*ƒÇC5O^Cúa àu)§FH.“}Ô¤Íl@¢’HVìeKî-os¨JC//0£nÇEöï[<-ý‹#d7¿¬{âVD\ ¢ƒÒ\kwâæŽŸ°wõ¾0l£p¬egÈ@¾µÒAyæ÷W.%”uÎg âÞFÕUÄQ“IÁ¥ôsÈ ˜×jÞ¸<Èû<†f¹„9S41x Ée²3FY=EÆ™7÷Ä“=v$Hû›¸0_²kW;úŒõ>ËýíÆå2—å 4ý_Ÿ±-’{ã‰Än!m‡oÿÍF¢y,躪ZÞ‘8~ÊLÐS¤²Ûü8Þ¾ôXU¸b‚o5‹ô&*:œ²)tD…L£x¾¬Þ¿O¢ú¯r~¿OhBnöÊ[ê‰tgHŠÇ¸°ÿ“ãùDæ yýÒãíÐáù 4`5ŽºQøê÷OÔ—3ÿZ¶Ž8x I€Í匚¡¬9ý ŒÓì6ñš‚n|Õ¹YŸ/a(d8µA°’ì:Sæþš;×Í5bbˆÎFxaè ­¸Q`m2Í[|â¯ÐÇB†£ÂC6}òýN;¨=Â걩U rŸt×,wZË-Ï‘ö1hvðè•,P†J-ˆ[q&³×Ì@{Ù¬ñŽ%†Ë~nöu]°F·OçÐ}fë#ð‚B Ï&’Jpžê%Ì­rek¿û1%à€tS<x`ÇY÷[ÚÞf¯=ói‘E6sùRiÕ¢ëLâ¸<æ%eÈ}Ç%¨G’êÁ2HB•yzÛôq"8PìÌåþ|æž ¶©÷»Á(5›‘·K‡§£ånS̰Ý`”e—7•U$Çß$Ö6^‚]ìÒˆ%Îÿly6ï;ÝdßÃM=æÂº÷`9by‡ anðÄ“äHÎð­^й,Ñ8{V#½Âô/Òrc Ö 8•N2,D *ªb; …Þ‘{¨¼eÎgÂXܨÝÄ´þ–‹¤:M„2šL:+~º$øãC`Ìý劊Ÿ0ÆÛ´⟠W=ÚÐ^M¤dïh^tBqñâhz’9#^4õi¬ýÂ? ³¯>’źr é¥íT|#hë©´ŠöÀ_€âÔÈÄP—Íõæ3,b`¤P°Ø‰&oQ¤2;[Ò¥us;[Þ*æ" „96·<³>h7©F©§¸=0ãXÂLWuâc ¡ wh¡Jn.>Å©Cë|`pÍ>÷í{uÊu~~œ7>æ}¢ç¡ú½ú‰8‡…À Âo85ðœ•áôqqÿe ÇAïJ1ãOÚ”ÃÒèU–ªÁ­ÜK69ƒézÉuôX¥ é"˜„q p›ìH¸©meËIã•ûò¸øü-:"â*ŸýhS8ÚƒŒ¹B3÷Ÿ?âåG²¯[½‹PM+=& 0lŒº5Í(Æq"I ýÊ,DÓ•íMMR@YéÂÙkŸ÷²ë«÷[ Ë9!Ù?^ð”B0Шç†ï~/×®×¹ìjBgÄEöÆNå‘®îHûñÓeÐ i'ÒXuþh¦|×~x¦Ýó2Ôq´œÐ –¡¯AóFÙØgo ¼ÿ„GÛŠ”?1\Må×/|¯n¥È²âGÇÞ ½Ž®d®Ÿd¹ú°äL M¢—±20²x~R¥d²2žÑj¿‘IÃüŸ[ú~¼ªY6ÍÚY±ÍîµóÕâRiüÁϯÓU:4dVÖ‚ü]Uå¨UUë•qã*ÚiÉq&*5ó—e|4DX–güà†ò š§§-‡™ÂÍ"5ÀF᯶óæ«3 ѦZ 4ŠJÖ¹j€øÆÊ %|8é5©åOa4ú9Ð˨â=/›ÆXoí†Õi ƒ—³òÕ¨VÑÄç±^uêz#[wzÉÈVg?‚N ²¼…–iÊ;; *aho4½ô}6•ÚÔ¬\ä=Â$ƒ5£f¯MH{2D¿Š´`s0þ×kÛîØˆtsUðw3.³á‚æ·Ý™G%©®Ó-|«Å´Ù:¼­PëçIÅjSyMƒ)«¨7Sú“° ´úÉàáú+’øÃñ_¥_](䀲iBés9ú‡å‘ÿ–¡ -ñÅÞ/OU4ÿÅ.Ý=6ó C©ÿdh]µ{Iê‘Ç˰ÅëÿôÒgÐÐ’ùŽÔqï3dÝùž1(õøk£ ð¥À€ðBFlŒõK¨mÒ}wV Q}àÙ*Wx'àç$ñOÔ9ÌQ¤ S—rf¥\éA‹’öýË oëÖl–ž)áä"ÕRcDÍ-Un²!óDåt”#Ý[M]cŸ%¦çÞÏ,qºðˆ´:£WbŒÔ7f=Ÿ»úv_K­Gñȸ÷^;[§²ZCæF[ÿ‹KÿÃýAl)ùý ´ÎtÍ¢ø "×(&†…|W›'s®ýÔ¥vê)¯TŒñt@hÃù$匋{Øi=ÉÐæî!_c?ʵaŸùÝZKÙ$ðùèVI…¼m°©^Û¸ëéb‰¯ƒ·1æ¾€Æßž@¦V¥»“fŠäùª1«Ùï×ÁãÐät|Ò±0Ì¡PIz eBBÖ©lF vkÕ—þ—,Q§±!êmf2U9¹ÁŒ¡,Šé˜ò ÞêÄðš6{e½Æ<þ âY®‹†‰ØL1FîY)q®6†ÓŒûÓó/3%éÛ"em¬u &îG[B§„ùÀئÔgLŸÐO„“âgN©1Lfà0œ/¦ê ¢„*©¨kø…Pé~ÇîöJGQhׯ^{³Ö쮿é!Jó žÈÈ+½z ¡ ‘ê¼og¸V)ÀœÖæâ¹š490pó—wð§£*`1Ny€o4{IÀ³mËDþŽ`%Ñ^R5Ñg0۞׸X6i!›\Kë¢æA]@ã‚mdzÞÆO ƒ÷úͨ­_f=ß(.1©)$a·ÐêæSÇz]ë´»Ãð3ŸJ>4e˜Sf9Λg¶}ÞKuצ¹äÁX;‚AÀ¤ax¤=Á¿¹<4ZG0‡¶*–æP»”¿³šMp’ÏêAfÊ¡ìpriöz•=(O7 ;œveXÿ€cH™œÁåä¶PÉqïë#GC^ÈisÊV~?œ=.”h>e÷Š4{V‹B¸D‰PñÐg,+ñí"ñf‹ã~ÑæŽ¡ÿ@#ÖÍ¡oq#' PQau•2eø"κd>.öp,¶†p}£ZáO.>²2Æ*ýÁTÆ›ºÒ÷è¨[í<ÑWÃËÄöÑ—y©÷Kk½ïlÿ‰QscîJ<¡ãDZ ˆE`NÓ@(}éi¼$–HYåÿLåX¾¬V$ßfž:ƒ±ð˜4,!íX èù`õouzkמvyßKV SË•7Z”xUdiRÔÒ^?´’…ÅXØ$‰z|¢ôùíÜ– ä‚ú*`ÐwàZ¬šo¤¥0¡žÿHƒgptoã=Äï·Î¬Úb’2`y„ בÆÀ—¶ùÄõ6 kòg&g§¶ ¹R±}9#´ÀYüpH5÷læ…J¨ôÙ4únªËp±úxuˆQ[‹*ªo™ÁÈãÂF¤aÿ䊬.‘\¶Wö`&KŒCÌBªÈ¯\‘ܽÜ*-/œó —ØeËÂ,ÁhPþ9:Ó·éiÒHé=àÈ8‚ÎmRÌp4ÿæ¦QÜEdßã)×ê˜ySØv‡OH›£îiZ‚ªa6°®‚¯[,Ø Ëa˜ÏUêò&?#©ÐwÅ]<¹5T-M`Ñ3µœj¿7ìËJ’øJ—'â ozË‘Áø¹Ð ²˜pÍÂVñ-••hмö¼ûêlºÝPjC¼è+ÿ°”¶¬X¿.ÄFÕÍa.˜ ®ˆ¼ÈÞi{„©â€oE‡…Vx³Ãõá RÐ>ú‡Çw1~4€ØHZa’ÚÓjœ Ñ= ¸š˜ÕÙ©îj„!iôÑù[áT_aL ‡ë!aK^C8óv5ˆÿ 7ýJH>¿¯XoÿuÒ³‡PQf™pý¹À2y4ž© k€ÈþXˆÓ=.ðÊ,¨^¢ Z¥™à!»ž^TÓ+ýó¬‚ïd…ýÖÌÖÞïaô2Eœœ˜Pf>ÚÛ¢QžDmIsë¥_rJàú@B¶öž$¯£F æ‹°Ô©vý<ɶ:= öÜõ½C AÁÜêf»èÔ”Yv“JðÈyFxÖªDEû™1ÑÑzîdðLç9.çÅ-W¼ŸÃB&Ó©{Ä|ϱ«Kâê÷û¸ðoÄu0a2a ~2½ÛVa"ÌMŒ/ÛÔˆú»·ôÔZìÔMÙhÞÞôA‹Ç‰rƒM'½›iëq6´B0+ÓÙØDGÕùJ(åMQÁ_PjTÈ‘w›D3@t ­"q3ÂÕ< ï¢ÆÄuÚ¦êñAñͯY&}×/h õ}Pß¼Q£KŠß¦Ù“†C:©/·Z@5üýЕ^¨âº{Jœ?\ñUKyŠ5±®¦l¦}CËvEžè;‘̉KnŠYLÇÑx/äO¢¬Ò´™Tà—öx†øÑhVÉ™z€/÷=»­:žÓ†­N $JÈ—MVQŸg“l«×ãˆå^ÐL‚)J»´æ_H(2–_Ñ¢µVÖ ,§žj@Ò¢ÂB\Z ¢+KÎF( Û?„Ãf‚-\º“+މî3MawĽôbq„v´óšv±]îWÍ:{ŽÃd–™ô5dªƒ}.åÇ_·ºžÙDc5m°é¬åªi*™ñÊYùѨ`Åe+8ê>HCnÊ%‘&ѽUSh"‘Ý5¡ €;“I9frT)ÿ6LFÙ‹]î=¦·v¯›†À À(aÛí9Ûè&³wËMR;–‚(ÿÌ÷VÚöþ]=u`È[[ÒÉE}3ˆ}  yrÃ…µÒG‰úžò¶bzhá4–0|þƒ ½ˆÈi* 5sbÛÍRë(ºW¼=‰«¢f’Ì.€à¡54¯!ºYä Ïâ¼xö" Ý0îÃ}j£ä‡`·&:#¦LIæÚ$ùH4ˆÁé’ö>ñyì¥ÚnX²·,\k±¤šµ| Ii†4c†äƒgZ´å']HMë{´”w$·ÞÐxu{g r–’j‘·õÈwºßoi gh–ÇÓŽnãʽä¬ä endstream endobj 242 0 obj << /Length1 727 /Length2 15782 /Length3 0 /Length 16350 /Filter /FlateDecode >> stream xÚm¹ct&ÌÒ5;™ØÉ\±‰m{bóŠmÛ¶5±mÛÖĶí÷>ç¼çy¿g­oõŸêªÝ«ví®µºÉˆÄlmœTÜíL˜è˜è¹ÊbBêLÌŒŒFz822a's['.€š‰1@ÙÄÀÄ øÂG¶µsw07:(¨þí¨Z›[›;Tm­l]Ì€Ggzg>ú)›˜œ€&Ss+€°¼‚†¤œ8€R\î7@ÜÄÆÄÁÀ  àlhen172±q4¡˜Ú:¬þ³ÙÚ›ÿ‹“#ý¿ ظ˜88ýCÌÔÁÖ +ª"(&/§fPØd$þ9nãäÈõÚÄÈÐí_ÕÑœþDz2øËð¬ÿ‰:¸ýÇ¢‡cb›9 MÌÌmàþ¥›¤©-€í?ncg»ÿ†þ!äø?å?RŒMLÿA;[YÉX›(…m­íœL²¶Æ&6![+c€¨›“‰±‰ñÑÖæVîÿ¿øÿ‹t2øGA³düËÜQÌÜÍÄXÁÜéÉM ¬þ‘êß~5“ÿÜÏ¿ýçô?©ÿÜ«±­•ûÿMøO1ÿNÇ ®þ[R]ŽæÚàßaQ#[cs3€²Ó?Š8ÿãßaóÿôЩü·§Lÿo/kàä`îÐb¤ÿW“0þký×Òù(!![7O:ff €‰“ÀÉüËûÑ5rvp0±qú·ìÿÔòßý¿ÛÉÄÄÍÄnmÙÖˆ;È"µ9¤ÌG´p¶’fvZÿ7Í2èÊT÷µŠù ÐXïà÷N7Ï`Æßwçb[ò®‰Ø Öáhb2Š(Lg÷¥ˆ¤Ü̧zóM1ÿµ.L÷ BÇÚHâ:üÖ)ýïZ€õ$kfÎYµ”} /Š8S”~i{$òVÜêƒ8•j†æ‚ÉMò,0¸àÊÿew ,4/páš GXPæowª™·÷`ÐŽy¶ÎDc 2bÁ¢ÑÞ–5UÌW! ú¶-³³¶‘ §Jþ‹(en5üró¾µ 'O3H—úö4²x^—ï”TCU3ç$^[†Ëuw™dKÚ-Ÿõ"Ýq4T©ÝÈÔ„ŠØ¼:™]|L_+Õ<_×>ÇMŽ-Flôãuîñ­ã·Å*«¡‚R.^{‰Y’q«Úƒ“•úŽðZDÍ;Ñ[$rÊk4f1pµaÚ„®ä´ð¹LY²&¢ª®Ú¤W'*0®ÃÄPuÄKèààx‹nêÁs†*]u¯  xÚÒk­¨ÂÐŽÆ+34佫…ïìŸ\(þ&àýcS¹è´.#Ͷ‹ûQ`ý™ºhA°+DE0R€õ@œ‡Ìzš>¯Ó:Î&—0ð+‘›:§<ÊYqou®:4¢G:P‡ŠÛ=ÿš¼Ó:æ3k™Ä¼N¿ÉÅHæu„v.G˜×·e4þ¡8$Ôýëwð>”ÌnúMªð^åŽ'GVjª,h6£QoX˜e76ûþæ"óMC„l3&Ë!©K-³5èߦ*‡å›<¸w¹þwx CŽãbHeî€8y‚ëÀd’=—‡N`¡[X‹¢ì,¶HxߥËßè¸H,$ôz3Nü,!Ddú¬J仂/qÍe¹ üT.#–SŠªxìþ?8Å0'ëÖ.TZ-ËIJÆ^øÜVå%VÚÿÎ{øCö»Òñ£»ö´ûêÜj1ôëò—ò$gŸmŽÎÞÜ“ån7ÃÇó£ÚËgP… ÿ:›éHáJÝîíÖ¾pÔ¹bÔ•L*Z¾?ÒUdSÃ/‹|CMMÜöcÍû¢’‚´ÅøB}7iî>žÁRS;ì´Õ\·‹²õÉ9¸€ {fnùaÂJIbÙitKh=—OELsè{¦Äô‘#Àˆ‘î$YÚGjAFƒ[<’Y¿ªVú~é܃°.4oq¬ ÿi8÷š'LÕŽOàVÙý£<ÊØ™>÷“g†UVH¥³¤©h&YÃdZ1»žÚ˜V:X}u?«—wr­ýr;»ìï.í]ìÞÖž:ZVYRéÁaѦÿ«ç”àlH(,JÝ£C76ÛÔ¢‹aco‰<ËFŠA_Â/jõ&6xJ¦D‡ù+„ÃAÛ¿áW"²B#0Dç˜1&bã’Õß¿µTè;þ%4‹¼ˆÚF3Ü|Q㡈j@Ð’_yYf3ÁÚé®Å¨Ød)»8.}Ùå ybišdÉ µQv$D#w”Îhd¶Eoß G'[qůjºm½¼ÃÛ=±‰$cЛ9M‰H¬&ò‚_Ò·:4ÔÙÎû Åé \¿5ú1tÕß±f~öÚºTjŸ?“®/y¹n¸{ƒœ“d2}šWìœK¾s~M3“’#‡?žû^gû‡1æÌ…¾[4w8Êu󜜩®Ðè4+ÙxÙdzûu$qëí-`7½ á™ÆL*Záüر<Í+ò‹qFA¸5Ò»Æ&yÛ*I`Æ£_Þ ø,$Y™ f Œò7.M~Wã}B+Ñ?­\»¬Oi—š Ph=Ü󇢿Hj‹%vå´…“ Ž© =è/vòÛn&¬±0ÛÚpêÑ¡BŸnCÀ¥˜.6­[Ié(0^?KFá诠)«Ê&„¼Òx.6„<‰ÿJKÃÌeH<Þ,©šQ_AøârRØžá{Wºþ=t )Và«…`Yžc÷lê]{³nåéæ2Ôu@s«ÜðY °\ŠU–§.LÕì«¥µÁ<ÂxõDÊ<ޝǦ^ùeÇ’#~‡Éwþ¹·Vÿ’Lá<‘ŽðýTä™ ì+ö®ÎŠXiÁI„÷H*ä\îõIA5–':þƒ’«sA\æv| ·®àã<-Ûv¿Ebô’,ÿ¦¢˜‡C±MÁ&Tû £¾%dhúD ÃS ›bÚ$ê¸Ò­&S—ä'nR‹nÍ—Qxsþ®tv Ï«ñï¿Gµîðný eÀwë3Ä{²\7p…ÄkݰK'øÖDïPǪ¤VVh)1s„ÛÞwñþÙ«zSï ®Ä”9Ó³’a˜á”)oõ­€÷´èyŠóõp1d¼½ï¦Wˆ±°3ØpSÀݨ¤"ÈFËáŒ0ËÐk¤V÷þ9ª2Ør×L7­q¬O¬ÙmƒÉZÀ㞈\qy)š—çÃÓFëé‹ý×°0rÀQÚõ qËT2þJiPÉÆO-]<”ÁÁž´Ó…c’²eo•CE6Abë` —¶«™5³µ° íT£]Ÿ`kmW§uóL¹å¬À±‚≅SQž#þΰwhùs@}ÉŽÓ§ì½1ÝË<òâ×>½ÕÕÙT‡¾[ióÙg"sùÇŽJ\Õó~su—¸êW”x2ú;èZiÛj$8ëOYu÷VæëšïЀWoŽˆÐlð{ˆ#ˆ¼òöŒ‰9¦ËqKkgé¦",§~L¶hÖ}X?TE¿Ò/ƒ•ß4¤’Dk?iBÎ*\]ÿ|;>Ê  úÿúKÊ÷gdÙ~×àO˜È÷zŠú”z5ƒ¤_f¥ïûÉ•Nå_¼éyÀVT'Z”ÜÄâ"9½Y ¶ŒÁe†BnÛªU’‡ìç>éÍëÙö'±†8¸ÅY̬º ß(å~G%þþ S áµ$OÔ‘>!>^×5Ôü¾/lªù‘*€ÏØX ¦+«!à¸ZŽI‰¶Ú„”¹d%¿íxDy“‘z˜ IB²š|"³qmð‡{Qê…a4¥æùÌá¤p-|øi|“熀N¸Š>Мo;Ïù¸TWÿ‹ ¾dãΓ}Ìõ:àvôO#u]ïbzÂòÁz&pú˜‹ŒZm¬f&n5ô?/@ë5†{î{ _1‡tu÷e9øg[O•’|º´ô·z'.–Ty‹òAîâ±q¹}ôì*¤ù[5oFD—CòƒÒ»·Ó0#ýñm] ˆ’Ð=W`§5gæ:]>2Õ>¥&c6bÏÈn"®Üýä5\Bß"´º×¾¦QjÌ M$–¢á…ƒ}Pö‚OÓ‹¬{§/Õ$|*ëD¾Q'Yè³.b¬$Ã*êî 0xà®UŠ›öÎ勨#¢»°Ç“$OFn<ìëùðƒ²UЬëóqfìEУ10\þÞƒòã”+=ç]' ¤ƒ" k[©bÔ”¦ô]7¡E£8& ÑÍÌC×JœÛg£:5©HsMËZÚeþh ½Á©G‘ë–Œ}bÇi¥Á;—þª~6m3QMÕÕzêÑD˜ó“$Y§×¡J1çúƹNî›+Lû“®bÛ,ƒæWC½ÄÊ4qÅð$qƒŽÕsÑ‘|ã:Ó=©‚çD…ý¼cûE†éó)®æ±¾ÂüöËÏCG·á¬Z…Ú)9GúgxÛŠÆ!Ë9¼Â'mÞϘ~®`áHriLâÛŽÙî–Œ?cžAá¹(CBvG0’]þˆÕÞ¦“m!2}£á4h^vÅ_ ÊpÒƒûîÖ”mB6VJì\/µ•ºm»&íùHÓð­µqr?•I ½ÞƘnaY¿ê­¿C>8¤‰)›’j?K9þÆ·ùkGå˜Íþ†*³µß%¥$”.;èoW4Š4Þâe®Ðx~"„€¯d ÑÝwîÿ;(Rƒ˜ h†(Mrî3õ× { m'²Ä¤å¤#ÙË%‰7c+9@|6Ǧ]’ˆáξvœõìOK>ÄÓ   ¹‰±ë215@)™Ü¸&µ ‚Ñ¥¤œÚd‚†Õ›5œÃóÞ™È5g*|i«}3#=ÕXýœô›™Är6´wåo–"q7üVXÈPùn« Y<7IÄ*vÈF¹OÙïCH2Ô—ƒ=›u¨D£…"ÁCjgw~ ™·å16£§@S…´RŒÔó—­û“?œ’ÖZ6pÚÍöÇÑJ’ÍÀÓºÝг•0fõÈÎîûhÀa‘ÿÒÀ­+ËMg4Ý©GnO°ÿ:ÅòÜ€MŒ,i®á$7<5½xÕßüG¸K±}´Öº—JÅÊSá[i³Û6ú€™Ãk"w¶Üæç'v-Ñz½¡GÉ3Þr«–ë…\¶€½÷1Ý›µÎ:,çj•PorløßLg,AÑk©”'—¼"˜Õ?Q3u+Eþ-7w%y_ yŸIË7…7Ô |ý¬hñݨ¨‚HÂ5=˜Wcy< ¹*ä–È„G˞³¡ù¨;àz^›*¢c~Õ<4­öSêë~fq‚Ö´üA™EÔ·Þ=ÏÁs°€ÔÐüpTbk5ãô¼³qÓÌÅ›½rVŽ·á×MLÅY".OÉŒ ¹ƒÒSŸçà\}LêÑç‚ý‹–¦T•”éÑßÈa÷gG—« H3é—L\ÕâΠûë1Gs}°qá*%˜”KE³¾¹žöeѲg‹(Ô‡æg¶ä³d·Uq‡óþ#žÈqµ a¦6|Œ ¶Î)]r|~Dl¬u?¼»öY 0hàÄ(Ͱ'Z2Û66ýׇNd3?WlÃ(Þ?¶åÁ_]õ()W¡5æ¸Ök$½éæ+?VAÃ¥‹É†K$L-Ê|´Ö‹§Š<«!óËĉY§xº»Ž&vq×®°ù+ 4~ÞaH²ø´ÛÙÌ·,üŒV,×&Ä¿T'áL˶Ëû©\«¯9­;ªY·Zt  ÂùÍéðŒÃûk(V•?zóO†RÁ»6¦uZ?ª?ŸVNLøXrF§âš¥8›^„˜Ã 0×Ï$Ø÷@‘U:A,™Lu±¡Ò'££„ŽÕÔ”vÌîQM%G§¹×¸u ‡—J>é¨Rþý ~x§^H]Á›F‚âófKˆa‚‹©ï1^7'‚üÏý //W“¯é˜!t8fN^šà†EžMZ‰Óéb›BTèÚÛ!Û ·ÇŽD¼DçõJÒJÝ©´ÃCj€,‡‹ ™*nÅ×Û™FWü†x¦‡ U ®“ûSÉÍ ¦M÷RG`âvA«)þ);¤Bq„—I¦58?¬t;ÅbG ¤²>''ݹø®²TRüÁÕÚFέÛÙ[‘ œBI>€öƒ½-™mÕ«ñèª]XûÏxì—í#Ûn#x!o€~c¤&›î×*~…ФHó.:®FÔÅdA¾¨oYï|b³‘žˆç+c˜%üµ}·FEŒ|È –‘ISÿ©Û¢Cx1-™ìm[ómðí©9ºöÚ5x¹fÃ0Éw¶“|ôÂh³9‰€Ë¼ÇšKðÝžTêO§¼ŠãX|*ˆ6¹SµoJÝ':8? ^j¨œÑ tòš£ 'ëwñ}›îË8E„’ÙŒw~颿 »aˆÿR€³€Xz éí‚ÕÛ'K®ÝU 2¬±|¬ùeëç(SéÝÐ6Ç…••Yî§ã#ù‡1×:5ñû£€Œœœü_ŠI’ýõçj®Ñí½ÊnJ)š}蘜˜™;ß¡ëÑ5š‘¦ÈËÃò¬Foaëú‡k7ÄEë%#dü[܇]¯>HYÈíù3<}ì—?m3àŒCGyW}ŒÝáD7ú× v™>„„ õžòãbj¸ºtý¸y{óÔï^CjO1¨ÒÞl-ÑñH8ZÓƒ‡ðY¨b_3õu9y¼!7Yº==†ÎM¾É‘XWžàÉ"ÔÃsBâ:Nyc­eqûQ`ƒÐé+Ps¶`ŒrHWÓI¥ ÷·‰;>ÅSÛÆ‚ë3$(2^8–Tµ}d¿f2_—CtYᩇ=ÊÒ™º¶hº—ÒLìÆîžS6{ªš¢Ie‰Ié7Ô×_—ù\è‰2œÌìþrd+! Jü¹ÃFÓ hÏÕ©õºåo'_¾¦KCÜ]ÈÎ:øõ`tœ"àÏc¬‘ÿÁÍÙ|ëô}Q_•ÍॸÂà˜¦#žƒßZ1O% }šñYyÍ‘¼Æ<†GÂÙ',¨ÎÝ.i‚¤[‘º/‡>¾c;üòZJªÝ[¦½'LH9@}½ÇEu÷ æeg‰0°ƒÅÂJ-°¶H̳×±º\ûštíACiM&L$AΕø­™QœÿÈꯊ Aàœ3,ÅR{5£b(ø)™#ícFÞóub&RÃD*[2èÛÜ1,ýxìÑLö‹{Ù'AÊšêL¢ÎÎT8^!X²¾."3¹cT£ö$yþû=Mv0ÙIÕ'¸µbÏ’ÝÍêËéÇ‘ÆíJkvZ’¼ÒèXaŽKÄOGØóöàÈ£ìHæ‹• ß”F­ÉS8ÚÉÝô!¯‰Jù»Jc!…dî=ƒvL›M.UJ®æè\î ŸL½ËÍ­ìû.‚ãåøòyaý”bo«žžÿ÷Œ‹²Mî`©-Z«¦‡;°†Cˆÿ³vüȲc“#[T¸íM|<Ê”ˆ*íªßÕšõ[€¼[›g@™KókZš?ÛR'%ߣ«’-cÊ<×ãkJð==o(Áq“™ï#T`¬ hz¿"Ó:”ѵûùdfé AéÁÞQ*C-öÊ­õ=]¢õ&?·p­3Ø Ôå;Pëh%”´duÆ4!9¦©<wDòìˆÿ ªä˜–ÒCÙóýß²/ÌuO¹Å8›dýšõ£ß—úxí’’×@þ[]ØT¦7ïU…íxúó™l5Btèðÿ~ÁA œÑM±mâ%ʼnµ×Ìÿxü}…YÛûüxÜ&Æ›k‹)EÞ„²Be çÂéÆ>¸ ßY9I"?]MÚðÍo÷öó½UoÂoF59¨I_B, ¡ð–‚)Ä­¶îTù])íit-: ­"(ù´|Œ*zÍ`ýj O ¾å—žÇÚ­p;B?þãÑ•fòÇØ’2 ݽ™Ç3Rõ‘Ä1¿Êš¥Ú¸LÁ€õ¨«¬œLÙd?(ôU‘âÏR4GØ[U²dªFW¶Ø.='/Ï$§¸Ðß@:dT¶0ÄY’ôäù~¡œ«9|0C¶i,|¥v»ê¿„Ì(YÎKQ;œ[‚*Ú›ɸ»–VÖ\a­Òy—+º¾6aF=Th@×ÂE:8ôЇmƒ72_ëzYBÙÓWs舤àÅ2V·‚<_ÑhÈÑ<ªŒ»Ç™0CêLûÅ»PÝ„ok´$N§@3±gÈ«Š˜Y~¬­0Ì6÷P-7"ÇÐrËËx-/ÜàW‡ˆfª&ÙÏ{Yðã>6tfìXEÅÖ¯‚æÔ²hƒt“?0ëeÌZÁrèŸæ÷A]è#¶ÆÇVBv3Dz·Òþô²aèérw³”ð+ &Ü”L*C(.[õð²Иp•r©»yµp°E§„6*uªþ€U¶a#øHLößgÞú}ÖbÜ÷h=» §MÈžTòŒ}4¸Ò}û3šÅ¸W£)‹@R–«xêÖÈuçuM‹ÿì7—¨Ç(ó?¥£—Œ‰p¥€_W²Zç(:ôznµAâ6¸$üTPßÀIôù¥xa_µÍŸXoú¸ gøÐmºã1%YÁAu™äwOÝŒŸGžW—„Ì'“|Ü8Is*¢P÷´F~óùð›\®·ïÕ»Õ=&øˆfÀ<²B†ëcqЛìÜêþçᑨÓùTÌ}u±,ßv½Q‰´òJ?¶võŽk>!ÀUšºóå'uXI†\ÃðØ*z’û#º5‰áºÇIbr‘¼…´E“ˆ! IWF¦ï[ÂËÒ ¹ó»7è¹Ç˜ï®Ÿð¬°ŽiJ÷‰Yr¸ ÙY °U— } ‘7Œø×.|!°»8B*b‹šM 9A21°ÐÃ1ï=¤CÃuü,‘ù’ooë.»)yœx,.ç@a«˜ÕÛ¶ÛÎ,˜À4—ö“þ9öùÒ7¢ã>@»z•­A‰Œm‚ò#&¹kÔ¼ò‡ÓÒ%ëÓþ¾…íÉÈq²6¡¤õÄkÛÒn’ÑÜ\+|@M”¡­Š–9m/K±UׯPO‘Xd–mG{r} Ã3Ê{°¥êšŸN¿®¦¤ùN]!Š[>•SSÇiû8@º+w–*6‚ŽÅw 5êö4àÀIsŸ =léÚ̈[Ö‡ú´Bû¾ ¨MÇ:΋Ðê ¤%ðD(:¨‘\ægÕÁíËÖ¥¥ ^XAuàÈ35Δm;oˆ¼8é€sS4lÒJKôªƒ™àÞÍ^ˆ>l—¼àÐÝY4œ2ø=ò,¶wrfšêÞ;¹Ûö‡Á"rŽä*V!½’Äð|„M€Ê;ùÞ³æºÿ—†Lƒ•zú Q'©N<(ц¤ÿ`H~úBíßÜ6[„W'ãÁ̦,©m¨`733VH ™öia&yåf¨‚=Žç°íß›8P8;](\Ÿy£Ü¯ ¥RÒEBÇú7³“O.¢¿É+QI7»' ¨àöàF8/ŠËøçá…›H—£‡ùäH LcëJÞ >gCb,xpæ“Ë’Mêå6ãÁ¡_»`@,t"ÓW¤«q䙉 ‹-.>T­”;¢QÛB<èaF]ªÔÒ¸4Ñþ¼wi6*¯‰éßoTCØ/®M‹å%÷yýu™¢Lãš²?3 1ô´Ï&!a¨›TbË2€ÕGÕô¦`YòuÌ-ìÎÅ]Ó#XÉžDÉËRÖü‹úÉúwYýn+ÒF8Ó³óУm‡Ñ±¾»Œ¾Ë{?Åå²=(Ñe<šÛàUñ»ÈÞ{1ÞqÎúõ6çÅ(LpGXoJvçõ)Ç_dUÍìY Bª Ã%q c9X·ÙÊ@ó{ é‰(Ö(Z Ó ¾_4¸C?¿ìÌô×¢Ék.öub S4µümn'Ýþt ´µ^¹†ô^çùÜÕbŒ0]¾ Ä\´üKW´öNjç±Xš+7#ü.I¡—ëíØYt¾ßY±ýmØ’P…ü WaDÓˆÒh†Î°lõëEÊ ;ñ†%(¬n=Ë‚ýç‚•ßGw`3ÝdoE'tIlÄÛtÚ÷øJ Ë †´m–n~Ç»AÝ¡Ï⌦¼~5Œ©~\~”^"^§XÂÃs’Z¦bÒs3!š`”Hiræ2û¯²ÉJ0f/tÊE·ú©6J‚É¿±çbÊåc#ïÈÖ÷ú@qvø†v,°§-~åÛéâhºu![% 5ªþóU|¾BðŽ¾øzw ‡Š·Õ¼£Æ]n·þhš½|‰ÏÚBÝè{ü…"= ‘úá¯PŸú­ø}”dBá%£æwUÙÄ#°_Œ¹êXãö\Ÿ3»s¯³3ºX±Ÿôµ¡§£š‚“27”‹K‚÷› ý|ümåøæëAÉ4 ÆO™|Ûê>ÂUì]}“"‡nÃÁˆ-âa÷“¨ O_þ[¦$¢ Ù—½5èÁ<ÓDé·pÜ=¹Z&¥ºûu¤{»)W€5&:¹˜ èýGÑê•Ç-ªO³¢™ÚxD£ŠBžS]enÞ²Q r.Ñ×=â/þâå’XŒä󼟆‰õ­§²t‘­MýD (Š-G"2töWwØ}š¢O´#\º*9V¢}0¶x¾ä8y ˜{Y±™µ¾[‚Ú¡?eÑdꌚpÔrd•Ç ø8ë7ü,Sx‰²Ìð¹t?æ-Yÿ––¨w²t#¶¶³R›!²ÃYÝI·=>×jŸ@-×ÂYÀþíÌ• ¤â;Œ•<ˆúçäKäÄÝ.tÃÔiqgÇrîòåÄ U¯®/À2ɦýLãÏ©4v蘄[n‹6j!)±§S:œÞ½¥…C¶Ö[ÖÜü©Ò€V¹ÿªu;ʇÚPW›t¸ðv2¦îÎPA“Ûˆ27ÖçQ¿J®u$—ÿ¾2ûåÀ»fÂL^ëÀ¼†l!ù¬ÙNÅ—Pï@^ˆr»ÑÉgÜ$Úç2åþ8º‚œ³³…pSIÚËM{U//`¢—?)ùß_g9#šÚÔfØÝKâ ª›ñ¹{ˆŒÁi=©ÍLý1cñ°/ÏwðRpPúÖ,½Ž9½­/þ/vWé˜}U¢óQ¤‰»?EÂæx…°ª†u|ðufï»Qþ@7_h¿\Ô‡8!4S’„z[œS%ç˜ Ôf¯´vZÒXkàsPÌkáÔèðÁ¿ß[ô\]gÆ.jƒk`éÜùÁ”Ó5w5úÚ4Õv÷(-î§¾š)~·$ýˆEXäO5{zgsr)Ú™g$×DèØÍ5µ¿—é+@ xv—uòÎÊ;çþmøØà;1¤¹{xxåèmÄÇô;ŸY(øf~«T5çÜ“+0åôqJKy¤epoUcgÂ2XHËI2ä­V5Ïçµ8$¬CƒWˆ9 èIZ¡Z꿦5Ò‹ü‚(É’A+=ŸbÉB,ÝÇÕD ?Ø^Z^¦Y>)m;æ–½B)É×CG‘¸½‹ÿ®Wùãi‰ÝÅ1¼Ö$Èu´ó´ vúœx4 îñP¿ý³Ãð´…œ‰Yÿ¶·M¬³wlÆRw&¹æNç6k‚×›¾Y»vq›}½BglJ Ñú!ìåøç#³i™fSø´•ܦو!LYÃJ‘!¦;/+¯ÕâPcðþàæ à·"ù£OðÊóÍk·)Ûð<í)ÈAs ?äž*)J1 ï»Æ‡×( êh{Åá–—­#,¸`í‡OCÉ{Ä@v°”ƒäÅ ŽhÞ6ë¶Š *i÷¤Îlú›2ëC»n6E*KƳN^nS®íåõ1¢¹2šN4»Ô^!%ˆmÒx»i_.Ëm»ÙM9VqdB•.è¼Åç;y +¥â~)¡ ãcF¼T}Y ’½Êë,åÍÛÃ¥â¡=»ß:ü w; ´Ê¢ôT6õé« ¬Ç@u¬W¶·†B­+¼žjC6¯s ´0à7H ïrâÎ…Ò²Æv冴›lMAO7~~޳וÏöX¸ÙIý£ãÙÐ ?¹ei‹Å­‘„”wÍ”cbwyØÏàsPfä>öû@äÚQ@OZƇž½S51GJI3T÷¨TN{Ë£ÌαáL@jfZ¼r"XÊi«iXŒ)Äé`ÀØÞV‡Ô§ÎÞ lÈ Í@õFÍ08äXf‘f߸V,wáVnW8G×O¹ <%Ñ÷¬39¥"Üd !pK¼96¹sÅŸsš}ŸoN„RÈiáÊ©‡Êµ¤£!Àïÿó»RöV¶I¡`Zùþ[•šå*˜ù„J«žÌG(êÿ±–ú³Òx†…ïýb:iô@à ®Ã¬Šü×r#–h IZî‰Yìæ<Ôƒ›ú­ƒO²ê$<ø8mÎÊPŠâzj³Î»þ •%€ZÃbÜ4KüNöŽÈ3ÍàÈ­dÔ~!, ²íæ¥În­òù¯§öÓÍWH‚)↲%®Õû‡[]¦PÓ¤¢‚­`ï*Ò_fT&" <é€ÔèªN­¬þzÃ{N4¡ã|{òœVÌD µ,.xÒ1—@UÉlÃâÂ|¦iæÚlÇ`Ê¿hmåW³I+·¦ÚÜ=äzBÓ2ž‡è÷ž-Ì™á?ÜØG‰<4C¥?rç%›ßYFâ|X#.šÜ5 m´œx2ä¤ÅM§Eÿ’!…§öK¼EdX@m¿ÀªxÉ,e¡O«‹¯ŽÕZGmµf2Ä2Q1}F}~"‡¾Þ`G }ïýƒíŸ 9 D•ªP4†{[«î5¦t Ó;ÈÃʧÃb½\ÎÆ°œÌáGbXëˆøÙÒ7‰åËY %ä$ÖÁÀP/x%j¨ôã ºˆì DÉ‘µKè&ž8YêÒp 0üd_ØÞ)z.Ú Mvi†õSðf×'·yFddµ9¤Mù·iqÉ虋KÆp•K$fEݡ·i}ÄÝÉé”…–cÓɬwŸüKš;tŠâóøŽ‡üÏ‚`^qsòˆ¤s¢³þéÆr“W±ÍÞÜÝ ¿¦‚ŒË¾¬U&“îV–ç¶¾ªÑ‹¦ÃN7ƒÊíõ,½GåµEÔ‰º…ͪnºwŠýZ¼ &Ô‹ˆ•>÷:ß2Ž鉿6~»£–vi`ÒøNÆ”ôt€¶¥êtxrZ­ëZ4ÁÔZ¢³ûs)yAGsÑF°oG5oËËÞZ–βŠ*ð°mº½£7fµ—x¤Ñ(£ eû•¶O»Fø*.¯7q·Ôd ¨Î®§ʳ1xVå/s Þ¦µ=”ç:?—J²Þ@c{«ÿ¸¢:§!ìi‚ÖT'9B%&açöŠª-zH£þhˆÞ¿PÃ9uéäøÜß*Ô9›á3[ìçS]ï UÀ*n/Tž.É·#ƒù¶¸ŠMj×lkº,ãFFè·å¦ø¥º~”ð•pâ\áÉÊì|ùniQ‡B¨Ç…Íš0õE¬Áô5ÏÓUÆ(ò!>L m‚Μ `˜¨É]s„ugÇM‹„t%P{/PõC¨c©2¡ô«'ëËÔÐÃJMð¯š-”ßyk›rV³šþ%;¤óø\¯#:Wdæ_êLÆß5×=¡…Ó™ïm’í—XÙÖPûuÔÅNK3TÉÔÖbûósjÈ©¥¯Q=…iqGwƒÀÌífwq· -ÍFÉc2,ïºQÞêƒxtpA^i‡ècÉ*áŽM¨ŒÑHg¥w¶&z»~Q›v P«l{ÊO.hUÀÎڛ׫ ùaÊÜ ~¾<·žÎ0é½DéÕÝXÁ Ë¢ó¼%Lgb³µ®´Z8Šî„{™¶<*­Ò©Û»\éÏßѲy’¤Ê’“D &Œ£¹^$Ûpü'9 k?ÝûSdºôaµ Eåo—\µÍíK5 ÝŸ-Oµ:Z÷Ì’ ã~Ô"ÍÜ Û° 1R¥öŒé½!Áƒ <ðaz¾zE€I/e¡ê߃]=©uUú{i;ÖL@ž†ÀCžÏf̲.xRkÉÍAÅW2 BZ,F>àYjJU/¶Ÿsá\ãÒ8±ƒ¹!w/?ªVFÈØÔÑ Rk#¦C» Çï§ü±"©}×À€š¤| œûpæy[wbgT O½ïÙJa®œþ8Cûãä·KÉK jÒŒf}Cq¯y ÔE «wQh+zÉ`dÑLñèÕSUÒwØŸD2®ã/mCÏ‹ ÃêÊîx>®þèiž¢U=6¸ÞÜD<Œk¯Ÿö³ßr|õ85`O[ÉJµHJ’CFQmÓ—·BOÎׂ6Wd‰uÓšU7ÈŸ¥¸$”leFâ‚éÑ@ÁÝ?ÿ‘®±Žiå<,‚Ù¿·×Æí¿RDKhŸ‚ -Tñ¦€S,QÓ÷¨MM1¸³síW1e¼‰{‚Ì®ž p%Lè?€¥»ŽHÊWÂ@.º»s)FÖS3˜ ˜Kò]éo5’%›IÙc‹y&•zñS¶&çÝ'¤ÛÏíïSÍïæ,¢çÙ˜£-úœ6ÇíM¾ª8]ÖØ°×8uVójM›Ô»8V©«˜1@áÀ± .Ƕ¹¤Úz‡ÂWt‰óL‡ýn‡ŒTäÈ#{j1xÿÍÉ¡žø.ÎE1\0˜Â¯ÑcËëúÈn'=Ed§€í7ð|f6¼bÏÖr³ç&A=Wóéä0dãþF Q¼@›ѹˆ·Ÿ‘síEbØyÎÑ©>CoO|¸oò•)%IâÖàÞ’³®‹¤ù›5È™´ðo½Â’ RÆunRøžTãã·ø€o$P™\h/æ4¯\9˜Oò°¦¥ø»V[X|GýÒÝ ¤ ŒU¾c6rDD3ÐÑŨ^ƒxyÈ%tŠø"seb9å(œÛëðòF•§n²¿QCÔÑ_½2œÀÿ´ŒÛ~ÂÆrÊÜq‚Úö˜lEô8ÇÑü¯C¶€i¨«˜§a¢*ýºùíôŽÞÙêHK|…¤;I¯À0ý]Ñî‚U"`´[IÚÊÛŽ ¼Ä)µ ,ý±室™ÜÍr¸ƒÓcôÈÉFÊÀ©±¶po‚¤>CQ„5÷ÍêŽ×‘ëù~ä'Th¡Ö¨‹­ª¹º“£{Þf¯þ#^BIÞ”Ð_jâW­VßoÞ㵈MJ‰:¢Ë ·/;aÖJ4¾b¡é&»‰(ëÒÙä:͌ԵÖÁÒîY†y°F‹oRf,ž |£VºóÏ™æyÕ%âl’FÿYÜ„ÿ,Jž%§ÚZŠ‚8M¨ºG2*È×è”…ðv©>½õ÷çP0¼AæÔQœ¢Í‰éõ(xÈ˹3·müAøŸ øçå+„É\â’A;9´ZÒÁ`A,M¸ëš.[ÑKåX¸v«&19Á*l{ì.Žñ2¨„úZ\ºõ+;8@'þaÒl-Ô—§umõ°XÉ˰GÀ| „³Qi#±î_éC×K¸Žä*.Œãí¯åÀÛnÏ"«ÇYÇiÑӤQÛ¹ddõž¦–Dnhšútçœ}*®Ãó"O2¯`%â+ ÿíÔð'ˆ2SxÂapÂ,üÈæ˜êŽºø6dKÔçØaÆ¡_„º¡ÁìzTÃ=G‘M’îÀ ÛŸÃ3,ÇÐ) Ë(Ù™z3`û 2)vpŠÁU½D`¡ JÞŸñ}•¢Öõfz1²ŠòuYË)›ƒ%_£>m6ê£Öé žrÎ1}œ–Q\öäÅã†üÈ0ä2=Ý¡Ê!gE«á˜íÚLÒ›í¿¨‘ ¡²ã(óO"ýòrí‹üxz33ó™šÆ,S~ÙñE‘R…ÿHËp™ ‚†ÖÔrZV™Š‘I­UZëÏë4ÞSFá[kìÙ•{Îûk}3Óß ó·Ym *¹ÐÖ=(‰+óYz—ßzWGCÑè8f7Ãk_Ä.ïÙGsºC}]öÕ89 bôÆ&ÏhøÓ6׃üûêŸQðD+½´–þN Ô@+aE¿»öÁlÁ®ð$:çj\/S:µYcKâf}Jxè ³â³9ÃÐS„€â´Kþ­äº´UªE}×H¾¹SUÅr0w Óu!?m–mÓ­(óÁöþfg·±üe.åX-:‚§ƒ0Ù`?Êéc¹³Û }à’E‘õ"TÌ?œÑTâJA•<90XHH¾hÎy TÓ½‡µ¨äí|²:¹P={ý·R.%Ø©Û˜Ž°‡dÂ#)®jÍúq +kD)¡|úøyÛ}eö“ð!G)¡‘\†,©×•ðÄsïJëžBØôõtÝÅVÚbÛc ° */Í^JD*»¬“¼¤ÌD&öMf›8s [KMÚõ0pâÎj€=h¶ °L'+¼ÅÀ½ØÕ±R¹¾¼Õ¡­ðf(ˆq­Áú„ Y^ÐyÄÞH ,Ïjy`Û—6×§¡q}wô§!¢ý|GÉÎŽæ’†6ÚC§Ë—œVÔ5 úª.mP'—)e`^~{·§µ.¬q)–=_1 ”>Bp#à(FñOývIø@Ú^„¶iÎhÞóƒ|æø®q:nÂ4B ¡ª@bm?»÷r—àáÝ…æØf<ä}àèŠ[Ñãß@b]ñšf özš¾§{8¿FªZúÚ«ƒpÁdkJcž“¦RàDò7BÍÍØ· Õrk&ôìFîGÏý>yÝžÿáÆv`t/¹tò±cדmôMnºŒœØ+M«ô#¨Ï÷Ã3O‘ì›q€ÜR@4b7ërW‡›£GåË@¡o]Þ˜ÓjÓ”ÔóÖQÏÖB3•Ü"ÿÒZBç‹ÀÃæ¥×®Æ×,Yꙑ„;¼ú³:‡ùï›c‰JwtuÎr¶V‡P ÃfD…#ÂÜÌ(Ù*¼A—=Ö|Xh°Mvåï6sp†¿¡É”‰hó kÐÐYyš/ßYzLèL)t^âK!¸ÜÌ¢4ú/n!6¶æ’Š­ø˜¼·Ö‚A S˜°æ‚<‚"V¡aêf\ÁèPNG—ÿµ­¯ŸˆEÂp„ðëùÚÞ ?~ˆYÈ%oPêëšY÷LjÂxÑ?Ôë`…ï¹ÀénK5Þ ŒYáÈ'¿~h°® „FÊ;JTxó Í#v,Lø<ËâŠ}Øb¥›-‘þ_øE¿’ yX Y]…­mÎln¾FõU|Ö³ªI8¹ ¬V¼s½JÏ%ìrH+-p¢¿ÊgVGTh$Isã.ýŠn7ÿ 5> ßœ¼0²Ô5ͨÙ<¾G†RÓ%a¥ ¼\ñ‰¢k†;)QÈ7’KòïŘ“mÞ†% GZX‘ä9ãÕ.{­›šxú0õÕ+™l!ùvÃ’hÈA®íz€¬¦èCøx½†—*ÓÌÍ_¡ûja‚°AuÀÙ3p˜Î+ý¼:õÇ59ÓôçpÜC8ÿp4 þLbûì}…è·?l°×ëTaQNl¿»Ž9£§‰Ü”}ÔLÖãêuqÚ…³n‚°3¿Kþ£:Z,ñŽBï\’nîüÊøgLMïk?·œÆaLì7Ý©Ùúë¶p¨®±g°æhiRsG-W@j/~à%•cÄó}á 0w"ºŒgÏdÖ§x•P.ÆU28’Íl«Ô/*ô÷hšT›ç Âá¼oŒ!_h¹ ŽäÀt•‰¨ñLÒòØ Ì{*®5tê$ô9óòyÆê•‘m¶ä<3ö‹fÄû–^·x_“¯&úëx ‘'[»ˆ6­bd/á¤*9BÖ´kã“$Šk7ÃÄNsš(˜Q(™9ç ÊéQ5•bˆ\ˆ2œÿÒÛÂ𥳈ñŶ¡²¬ùÂhnÀIP Ëç‹÷­ß[©i~÷S’ çû13kÀv:šúÜQŠŒG/èSÝd b}ç&žõÔEpÏŠÕêSÂBÂæZ2õkƒ3äÓí4¬¾eÎõjØ-~hg5Œâ:ºYt8:aCÐ…‡¤rã8z…mŽDv$%T}“EÅæ7$d_ÛÜÌ:@ü6Š$ÌN‡iùSMåîÖ â01ï59cD!1Ë@’Üèµ>6JaG¨„ièñ@Kò˜eðñþ¹¶t§G~Hö-®ƒíÄWu5è¿ÈâY…³-ÝIÇs.Q¢4-ħ™ÐL^˜c„ú'´.Ó·¹ú¶ 3_¿>Yuݯ ÂL¬$ØÒCa¹o%ð†:9ÿ“½Ó·M•߇ÊlE7Cx>÷ý„±K_ÃÁd[›¥R¨ii63ïn÷+£ f©N—ÀÞáŽ{*—£sü5$oHûHýÓæjCuçâl¹EaO8¨§X—Çòúãk{…TÙvÆ*-?•œ×â§>«#±Éì„=V»ªú˜Ñ»!‚lÔ¼ý«/ºˆ¦vi©4Pú^0‚R´óöWSlwRØ^õ»3Ý$ü·ö}Jéðã9÷G¢ü>aÇ]@…á Ë6_±•î‘ñ×±B®­Áçïù(F«Š‡ ölI¶‡K¾ òóÉ=uì99ª>m¶"²ˆƒU@4nŸ©»i‹BŽŠi+<ú6⯩(U—X_Äoºôç¨F&C—L¸»Ý^×þ‡ÝIUÜ=ÝЙšwu‘N`q›7>ïÆôþ|ª¥à§`JÑY¶G¬\+«_ú¬¡‹ =søÞçl¼ÄÇc·.uÈxßËSíØ{oíEŒ ‹cÓÏ^žSDz½Ý1sR,÷÷JµF3ÀÞ£ñ`­²6LHF±3al•é^ßÎFÊ´%ùŒø€Í¢Þ÷wÄ3lG…]CÇr¢ëh¢ƒŽÍf—"Ð} ¯øØ ›ÿ*‰åô endstream endobj 244 0 obj << /Length1 727 /Length2 14782 /Length3 0 /Length 15352 /Filter /FlateDecode >> stream xÚm¹StníÒ-ÛæÌÛ¶mÛ¶mÛ¶ÍÛ¶5cgÆv²¿µÖ^ÿnÿi§›B¯V½úSc<ƒ”PÌÞÎEÅÓÁ”‘–‘Ž  ,&¤ÁÈÂÂ` c†!%v25t±´·1t1娛š”MŒL&FR€°½ƒ§“¥¹… €Â˜òßA€š¡‰¥­¥@ÍÞÆÞÍÒØÀãææ&àæìJçäÊG÷O‘²©)ÀÅÂ`fic –WД”PˆË©ÄMíL m ®F6–ÆKcS;gSJ€™½Àæ?ÀØÞÎÄò_œœéþMÀÎÍÔÉåbfNö¶YQA1y9€¨0½Š0ÀÐÎ #ñO¹‹3×?hSc#MGpùËÆð,£ÿ±þ'ëäñ‹†‘`biì025·´ƒ¡ÿ—n’vfö¶ÿ„M\þ›ú‡ó?üÿhH 015ûíjc#ghk  ¶·upu1uÈÚ›˜:Ù„ìmL¢.¦v&¦&ÿEÚZÚxþÿâÿ/BÒÅð=íÌÿQá?!Kg1KSK—$73´ùGªÇÕMÿs>ÿjôŸêZþ9W{;ÏÿÛðŸaþÝŽ^EHY\S‹úÖàßiQ;c{K;s€²Ë?Š:™üOàßiCËÿìЩüw§ŒÿÏ—5tq²ôh3ÐýkIþõü×Òý(!!{oZ&F-3#€‘• ÀÉÈêû¿è»:9™Ú¹ü[öfù¯ÿïu25õ05†ÙXµ7æ±Jo «ô-ž¯§žŸ5P¥^e^›é½ÑF¶¶0Ñ?ºÂ¹WÁ)p‡ÃŸ 4âݻܕ¼o!2Œ7…;™šŽ!ŒÐ]Åy-%®2÷«Û~W,|û¡w ¦†mk,vyç’¹¹¤@5Í’÷·NʱœYœ1Æ ¢si'a}éÑNœR—%KëÎô€ºiÞ"´èÚˆÿu$¼ xî†[ߢ¨2Ðá(\«ààѰãï¦j[ 1»OCþcö(G¬l¾c!õ:F˜ÊpCŽÒ| Ón‡,Dù…Z•píÎÝqÐrU³”Äó £LÜ4(¹8ê#»WðFì…ØC­¬ØÎ¶j7,“¾Ö"?m!<¦Ù#µ4’ †(¦f²Ïw‹NžµÒøœ¢Nç}—¤íê¶=Xzë# ½¶¯??Ìw-ÇbJᎾèHÚI9ЗFx×i—’kà8@ÈÉz§E_â}Ó·pÉ×*‰ˆîSaD“(¹bæb}û šR¡[ž‘·v˜a¡‡]ÑqAÜ,Œ_(G¾Ã›„Ê7rbº?;%oâ© "ÑËÞµˆÑ0à.gèµ=} ©_Íôt*VBÑÑ óÛ™ùªLë -‚-?Á²y³ŸöíÁô —©ÄœÔ²Z#Ë«©€@\z8 ^E3„A]hG¨ï8  ÏB؈0}R ´£ŽÅ:«’ö]!‚¥tõoË®äÎ0 c®}”„—0 ¾£Œ—Š²Æ‚/zf¤ø‰ÿÎff›£Ï±ÞÚ|S…Vá±ðûÚî(}é&–BpNZºK൞´±g>Œ´ÄäÄØ™ô¡˜‹9FN×µ†u–s°æ1ªDÆõ­)ždJ½eÝi†à0±Jë‹Á„…à„nÔ÷QMEÑíîÆÅ9hÐQËÇK—jñ%ÊŽF°Ï&Šb³Cn2 ¡‡ MV9OªK¦‡tQx#õ…Ì]*ññ¹d"ÍcѼÑÜmz²K’¬À&Èhâ¥o\_¢jL®‘Ø¿ :Äü".ý Vÿ ž¢Uè¥Ân7Í][øRxÔ=GsÆj–ä“ÿÕbòÞÅUêR6ú;¿Zk¸qM›{¤ Ýb­ý”ùú]­e9:ÂgjGÑCè]­ç3äÿ¹öÆ¥ãò¥Î ']!{é¤Ö>;eÇBÙ‹¡ `­]0¶B==¤Ç¶WF×çHÂ_²µaðÆP)ß)•çÐgç^Ú¢iZ$§¹—,Ì.à!C¸íu‹š/T;èÐyfâ{Ýh²T#ëíLö§”£y p¦ŸmŠÛ ™rITíõ›O„ÇöúòBñÑ[W1,µM,wÅ;Çœ„¹æU'xö&Â¥‰îü¾ƒ_”jŽ¡PJ09–:eëAqòHdQ\焪Ö(/YŸÛ ‘^ó–’ƒ±ºÍæ“<†­)«;|W(´qU}v8eÌq$¤µ’ùfð¸HÌÌ[YTY\{™zw¡‚Aà„ú}”¯¥ñ\5/Ñ?ÆHm×*Ÿi^ìžù¨²ÆÎ +"ô;’ö›@‰Øäðejpk”2é¬ÂN§~׳ SѬEÕ˜€ÿ1sÆÛÛ™/«n1r<×Ù‡¤Ó-Ütçiy€±¤BEv/³GÞ¼×8 C:“PƒL‡PÚAQi'Õ"•J=XyŸ&¿:Wb âêwð©? ¥ò]™"yŸ±¯bÊÙGó¨‚l°)y}qG-}ƒWìÎK”}¨¿(iMÄ"W<õ+ŽÄ"ØŸ{<¢3gQ%ì,4Ê9ÙÕ1ùD™XT åéù´ÍGéÈ:O2†MbÇtNvÅç zÕrÕíAÑ0$Î.Zö,†ªyb ÖÔb1ƒHÖüCûˆcàD%wjs­ýS¬‚Sü8°òÐÛ¸¶±¼' ŽÖuv­û“’¼çB4Vä9tðgµæùÑ]iµ¢&¡ ê Êv¡_?w…b€0H}kï¹­ØI˜x‚o‰/"Ü•oý¢ ßa†º@Mìâonïn3—s˜üÄ–_÷U«Š,ê:.Î +Ž}o¬±ûÑä2ŒTê†XÅqwÉñËr35àÚav½ 3Z™Óg“%A…þ¨ÓJ—™~œ!)ù_’<¡z™DŒÂm¤·Æsà”Üh·IòTq üb¸>ùNP§â[šd8pk¸¬ Q¤jYzzÿUHãRÿñŒ¡y‰ á*UqE¾®¤eùe•Mé™Ç-efå:ÏQÆóÞ‡ÈÒr®<›!ÖÆ&Ê—ª¾Ð™§‘ŽQxZŸ3ïvjñ™Òè²¼¡°ŸÒKÌ›qÃRõið½5áö¨è¿õ§Òrï—WG*¨Z~$^µ'Möséò8¶XàQ‚'0©L‘(ž©£í‡ºHYfh\ÈdÂ.×T(«ur›õš±aµë¯7”¢Ò…F¼í¡Û]ÐüpY´‰³—‡U| Å{ëÈøL[ˆ?’ ó ÅÝâfÁÁgH &=ª;hÒ«µ5%5â•ÈÇߊN²—e@ÍBÔ^€¤)w6ÕYSŒ€Ù¾™ª~)ƒ?òWö2øò¼rèyZùä <ºÓq75þ¶tÅÙŽ«”¢Þ¥Sud@Ž-/Sq¤Ç‡á4ÐI½)ž¤kVߘç=‹í~8¯ßa$ Ò¬ú“l+ž7Eû¼0#|œˆôJAní“}Üó ^k›kùx†D¶ÐaÒQœ×Cù þÓ¿%I/ëÇBöå³]¿ôÛþêgOmŠÅÕE¦‡ÇÔ¶GŒ"ôÑ ¯©e‡ÔƒsJÎGd¥ÖBù½[™çÅBÖ[¤¶ "T†¶Âš} ’¥RŽA±R:ïŸïíX¶Ç5sbÔ¢…›«5«ùÆÊÓTÃÁ¹Œ°]Æjˆë k8LÑâªoËú4D>ÂZeJëðÏDûÂÃå@H'-†[qán-Ý,ëÕÏÖ¯Ž? gðQo"e„îãV{ÜFX7”)bù3ì{ ®Ûïý“ç$4._ Pj›Ñ³-€á®ÂÜ÷„yBÆ#œ}šý4Oz±yPSS{°L¥'¼™nG:’¨{“.][Þ]«s’)7þÙ¯ÑN›Wi¬p4JéZÀ©½ÅaÿÝèvt¡;PKÐVfŒ}BI:r׎YåtOd€ŠZëŽQªéÇËÀs§Ù1 4å#"~ú×Ì õAþ—¥OÓœ¾—!güf]ºû%Ô!p±ÅñÛ7kvtÞò¨»Ã±YÝn0kÈËðÛ%¯«ÒÚž@ü®B[£é€‚¿ ‹ÌXhmë¨"ëÒfŽÖé=o£-‡ð·™¹Ä¦tЭÚp•ʦ9[{Cfeô¶iÙkÚ‚]ròý*Ú,t¡L„ÈŽ{z¸ìõjÐ/à"£µn Ù#ì}e+®©Ãeàªw˜âüW§ŽZêÙÞ‡ñÖ[O º– #J!R20kò§¼{N&üb:!V-¾ÒGf”ñÝô6øçºh…Ü4¥Ÿµ{Tû$c~›+z$wö»ÑÖ¶'¼¼Í´ÕÛæb€JµžAN¬ø~à»™¶{–в?ƒ˜¶@+(1‚Hëj†™c¼—¹YâX°+ƒ­òTø ï^TÉËSã ƒÕøIÒÖ< ‘T–#Þ-ºTG×Ú†ÜÛ‚)_ìó€Àr(æðIìzvј™d§f+sPH/Êe{È"ä[…<}\üjÂKå \ì1ÆBê‡ï|„§N´ç/Pš²=ÒP`dX%O_¶r§]ŒèóøÓ‹2à_ÇÌL9áêºÁ澯#.4Àº„ ¢‡ '·o[\رdê·%Ëî¥Ô\pG‹½4KmM4òÏ׬?ÿÉCˆ*a!Ò)®µÀö5Å¿úÆ~ž÷ªEÌ÷dr,ˆî£î+g»ÕX‡ïÙìÉ1`zŠq þ›ºì$“‰ñtm”:qz¸e¾~¤_7ŒTÉà8ì¸/qSëì‚=ß!–ï©Û…ÛÇå;Þñ@×4ïS׳öžäH—àªÑœqA¢0¤F—á ¥Ús½ÎX;Ü€nXŽÇ Âë}Š]˜—O—á ¢6 "ÎÃ#2ÆD)µ3fÙ9Ïuè~;ªÖEv=¿(| cÞ»¾r*f"2lDÚ‡¼u° Y±íDD†Öñúkø4œé0ÞD õ nÄ€’÷̲LC×áT¢¥V¿~ÀWЕ)Á.Î@!ÕœêERd|½PAä eºÑ[•dÃi:Ö_Ö24å×àÈriGMãGÃBk!ùøBsÓz+!js`wØwíŽ*äþÔ¢–Üœ!3%oÕ¢3„ÁÈ;Ö—tov¿’é¾%P6ã.æzg'"½· \Ž$n3×ÊoiâŒ'8~¾}Ö–ö~E‘ ¹X`ÍV,— .Ô/©ÈPf’Qp~ £žN Î6Bü»ëŒ5Ö¢7äó‡ëç?jyïÄ“Ó¥ÃØËß%AÕ6íÊ"ox”µ¬—I¼ªä ¤óÛ>G/¦U UV‹<܃Vv¬Æ UÊá[>ûÞ[½E´câ@Ø…¦Ÿ‘kÓð¼¢1½W—ع-¦c ù´éwŒÇñrļèõ´ÿؘDòw¦3lmHf©^àPñ ûIÃá)^çu±/ìx»Ý|§í>¥”rièøg´zº½{£Ó÷úÚ©ïä ×(åoÏÎUZôHµÇ@nÀ^féóöSÙ˜-ßT¢0ØWiýÉMC9Ö@V–Ö¢e> êCjŠy„ƒ3 î㜂È•ì+IW‚þ'…®#+ÜÈX{„ô, n ï]ê<¢ùz'Bƒ|’lçK<ÇÂÇ39å5àÛ-äÔ¸nèë”ÏË¡<«Ô²¡o±¤¹$ØØ_jä“™eŽq[Ÿ­ Ê"Qð·ŸrEÊÖ:Ót2ÊšA3/a§—(þ}fdT‚*Ñꬌær[`m+pIhLF!mß>{XÍ´Qý‰œ‰õ‘=ªõüƒÓÜúN˜!h0¿÷R§’öªRõ÷v¼Ó'aŽãÉ“G„B;h'§ùoX¸ p””Ô™¥:H_mét®Ë_ÛíÑ|y˜˜Q^\Uþx³8P•6nІ¥²:@.rNP”_·Ÿ(Îs(Ñb‚1šuQMÐçŸ“Ž‘Ýö¨ŸK¸¼ƒthÌ á  üj2ÚÁÕAÖÉSwã4¨ ŒB­Å2\c`ãD¢¥hèc'ý+¶½Þq¸—ôÅ¿ãµRþ˜ wíðw²¹Áe©.Q‹¼@Lx8­]4Gz"ÙvóH#î I =|ÝÃ=pV^„w»ó’J®®ÉV+ÇP@Ï[*tyÍ}|" ÑTˆ1Kج÷ÖG]Âç ÝãÍîå#l3O¸œý4íüúÈ ÙßÁ–ËpgHù‹­¢†2‡Ò\ж‹?äâdÈéÝ4NdŽðeí8¨{2y »m÷ úب,T½4$Ê<¢=INy´q=##-‚Tu:Jð5âº|IIÓ‡ÂöÒòóœùz¤Î©#iW‘ Ò—+AŽ$µì/Þ‡º5²¬fÊí×ú[èFëgOYRsùÿ\žJÉ‹]Ž<çHÛáÃjðع8è3ðÌŠ±›Åó÷2{•’½§(4}#<Ä•`q×±‰N iÞ>d­ §F2ñ ºñ]K¤ÄqúÇNÓ¯eíëðj’±ƒ=ñT,ÿ3EÅA‚êC(Ý(!¬<’E–Òa[‰ƒƒ™ì¾Ý5LPe¦zÖû)ØàŽXMñÑ”Æm¿¥ ³HnÚÅÝH¨¿b—ÁDxÆð˼¹mÈ÷ŒS}‘zÝ#xÀÏØröy7ƒ¥–å+‰Æ¹”½†Î´&uöß@µXøõž8¥Õ¶ªj:idÕ¥„¦=3Âã]‘·›~º¹ RÔõ²0¡äzGÚÆ?1ÿ&¯4†<ÅýÁ4Ö]™/Þè6ñyˆS“êàS¯xøK6ˆ“‘šöèeéãïÏØ‚¯›ùì,« ƱwãÛBÚC;ö‰\ÔSy\_9Ö€åΕ>é7ê(f˜âen„ÊDÞb™*‘6GᎧqcë®7Î:M9 ÅS-Ò(J$mÆÂ5 ˜§Hšµ¡Î„6©Î‰w÷MÞM3¾c•Ü¿«µÉx¨ÄÇŒ‘xÉmº¶ŽÏø¼j áð ?w)áÃè–ÈdS[Í › ³Ô+úÅ´ãž=¥­Ù£ÄLºÁ¸¨æ[ìyî׊½"¸ÁhrŸhÚÎŸÖ t–(z ~öh«EGq:¾ª©ZG çTaÃ:3Ö‹ø’íKÇz8GµÎü5"û£ä€öCà‹|ŠýWln³†¼­hò>®±ß…‘<ó5™£ /cç#âÞè¨Cþña;ÃŒVî²—>MDð¤Tö5Me$øYÜT’JœÙé[Ö• Ü4ïÞf™ˆ¦æÄå©‘RZ%oYs¤Õ‰£ e Ç·*ƒ/¡ÑµÃÁÓÅîâ^^šŒ%¬°òÏo?ó>µR ¶2t«z»aÂMIHà?…ƒS)ÃLjt(±Ü’äÔã$ÒÒ›’rËî(yÃ?õZNñÎ ð¼NœP4àh›âþDpv7­@ –·¬óa°Xl“,ŸXAÓRk$(u4óyËôÖó¦G@¦ïsVî8|Bñªï0ìïû‹½³šŒJmÚe²høÓv4YKà›kµ_²€ýK0Ô"3Nö'ÚLß6[ô߃PoHYËBì¤é­.æ0QM™%‡¹ó,†sÉ\¹Ým÷"q´A¢¦n3¦äÏu€ø€kõ}™«œäT,9<>Œ*yPZ oæŸ@ÃX+ájçØJ®Õ«»Æ¦+¡êÌ_dd³]¡¿9"G:ÁÚ_69¾”±À›ÖË{‰èØhk[ò`°=ª¹Ò«ÛD¾¡.¢Å£¡°oÓܶÀ·ÿáÇåon@ÌD%ɱÿ5„\oaVÔ ÚëàÑ6ð;Òüìd¡Éú´'ÐTVÚw¾bfÍ=zÀóÿ³Ÿä<èØ‹ÍW*ÒÐrÞCL7ò„,‰Æñ¥ †§ÝŠºbQð›f¬%ÊÒÇóËå<³9³ÑuÔ‘Ü&±·0dþZÎU¾YÌðÄ ¦páõ£©~áÝ>é%ž¾xYw£Î¹tL}ŠÊµæ«šÜ%a{QÛR4…îÞëQß’|ÕEZ‡õž¼5igVä¶2wT1ÛÁDúCÔf`€¥“¯@«ËM9hæ«êU:¡Üܱ^µ’\üÜ™.ìÚ8(m[L²'>ÈÎEƒê''ך&àøk½ŽØåŽ’t½A@Žþ¸Eµ]y½Ò¶÷Ú&iK÷»\EˆH4Aí‘´1r²­†£{9#4GµE¶´ÒeôOo?->ò­â•$&ã­håÅ(æ;/Îé!®¥C¾:5†Uò«›ý%›6wW+<:2Ž?õx§Jx¦ÒƒlÃGÔ["Ut€)btAp –ûÇ\U|¥Uw$•®é6…úשO=ªcœ†ž¾ tõð„h·Ç ­XãO ¤‚kZ­­M"õê}‚+^¦é Ê ºu}S\ÚÛ›_Ÿ4‹ÓE®Õ¤TÎÄq£ÙvÝ ø»bRÃyÒq„ƺñª§[¨KkÏ£Kð3)Ï…ü˜ß# ½‹a¡$Ëz(:1ï'Rìæ&gÓïEÊY¤zû8÷ÛGÓã¯í¦¬MkÕæ¢qê­~Gý®7ƒ @‹ÑŸjs…ÉqЧ„NR©º«Bå&‡<®Lîï#HCÖ.ÉëE@áOCUú1©`q»k»MsÛY?W];ÅVad•Om^°ï–IâÇу#y×Ê®RQöï6Gyó²BÇhÆ2yн]±xº÷›jøpº\¦\½RrR ô™ëÄïl£Üã†}üH)f¶ðÊ"Äñü£Qïs O ¾)Ìp‹cf×hžÚ¨Ažª ØiuÐ Š“ÿüz±þJÐne ß^Õ …¹ÔÎ↫÷…Ç(:KDC“,¢ªfíï©'—ö^’Xò!‹Ì_ü×­ìÍÃe•ý,+Ï îÐ}q7tó~¨R¢ço¥$'è"Ö¸ÞdgìÈ'Ñ__õ¢´GÛwºvšéï}º1÷K§˜»¥÷ùî!\îÎÒ|Ž Z;¾2M¡=çå#ë8ìö–QWË®L À ‹ ÑüÃdEoZv˺ú‘9Ƈê™Åû ß! G;1JäƒÃ&,¿°eSi2“°E ~¼grˆŠØæ:ƒc@40¾¶9Ucqã‰ÎÎŽŸÅ)@ùªÎH cÐþJª sÖ úNÓï¥ =C1 NŒŽå:K3xWSœ€z>3lq‹ßRAª(`¢ø½(˜™ÈT ØÃ¾g,â!ÚL_°Zø-%C¡;1Q¢•øŸlë5y~20)|ƒ=Óðš†ØåÙ(tˆl߉vx§)jÌ!È–#™¤ØfÖ[’3 ä>uÞ¶¤g%$–Bn‡öKëõP–fˆ¼Å+„b¾ÁªýÂÄ‚—î©5²PR IÂíÄHÂJ·mIV¼ ’ºBÙt{á¡Å!5èG‹&öˆ{œ.ÇCa E C†Ìæ„Q¬J(ïk½ùöç Z…A¾üÔSžsêχþ[ÙÍ€ä¥Ëj†KuaYÂ[¬.‘Sx¼rÏo§ºäti†Ÿ\ÂÊ•ùŸ9±»Øm’_Hµ$­èg[9Y…ÝÄïý%ÇævEÕ‰æ$Ìg¬¬·¶f’*½ï¿À¾_ŸØ]ÝøµîtŸr ‚ÐR 3£Ò°‚î<æ¸#BuP6N5&•Ùñ\±«åO€ÓXì!²éìZÃù*}ü•ü,€;¼©ò«u–U>°}Z³–GR ¸cYÏ'îqd£.Žyye/Øý¬‹j¶DBbˆÇþ¹ë¢E%à|ccèÇ«ÇXºryá"æe_;±Šþï¿pøÏêБ¦ýq›úcF›VÍtƒY=o¬‹Ÿ@â ‹o åÇñABM –ô¶[lG?}©³“1\³à;¡áa*œ$ WJ>’¨Ü>A¶bäè­Î«®¡yNžA4¡Jb­ç›!}jóÞ×*¤ÀñÐÍ·,Þä®oI Uf¾“p“™þþÅÍŠc‰Ÿ,ÃYŠÌ¡¾•£ÂCŠƒd'\¨[áÁù?$tîo!ñl*rqPŸ¨î,bDáó:¦:èØ¢6¯-)r9] '$­¤"$ð-èž,Ó3ä~\¨6ÆÿT$t¤ÛZ㸰v)+c$|¶z³^69ŽMüD:¥VàyЄXÖÓ­ê|ù¡›üß PüÆÎ„s¤×kH ùƒhÞš0hÖ¼™Z›Ï‡ý­OqÖô‰‰X6ùV¶.äÀÚD4}$«3ÂbY´ŠN=àNÇ…ìÁ’ÎEЪ{%i„Lö[ÏØW¬¿K¨¿³C[¡`‡ÆÞFiâJƒeŠÑQü¸ºY¶«ƒà4Bùºpú ,Õ¾9Jþ½Ê{ÜðSú7Ç!ÃãÃk”D_DŠ«FÁ‚Ýò»@&šRò¦îº_i ¹i·’ëõ»¸ ‹¼W0Q“£W7´È¯ƒ‰ã>q5pÀ½å© $YÞï(8n±ÄÄ;÷kcÒŒ‰‡ïçwÑê8ÅDù¦ôÕýyÌ{âîÂO?Ÿ¼8ö̵GÉo©WËi78—ŒX}´ÆÏ=U8J Î)(¦é¤%eØ‚Yóä:z¿ú³Ó¿2À΢iª(_z¢Äú– uäõé´Z ¤l†ñ­0´/à?§ÿư€TBiŠ•ë-øÎ4‡É>]{úáÄöZÖY‘*ôno‚vÞ}<¾T>Цx8;çêË9Û3¶jæîÀ£ ˜¢„l &Td½ðŠýW0:î÷¯4¥:Öý¸À ò0šR©Vݲ Å¥£RÕ¨\·¦É)­Ýqlð9[e¹k4‹å`ØOâ/ Î-Ù÷Y_xK:ùÕG¾áÿM$¯§òâªk¿h…âÒø§½y­9:¹ëÛ,_Ñž·Qnñ³ F&Ú±äÛ!0TGÃbº>R¾â>`Ò2u×€#ÿH?½è±"°â׉ê8C²·ºä(_è9 KQÔåEa´˜vb}ôEÄçËÖíÞdœê÷}2Ìk6­Ý䋈Ԭ)Îo¦Ìþr×N˜Jd¿é·a+6ÁÚ,¶&bH žG¯×@“°¹øÇí÷²)…~{¿|¶Eõ½„Þ-ºÅŠÌ(-Ûþ ä¢Ô̰?’ê/Q’Hw•‡ t6JMŽÉˆ8bf¸Þ<Ú,…wÀ:ÁòôÄdy–Ýt—‘V;óEn4½ï9E€~+fϱ~<-âmìY°·Zý’ÿfïS–ëý.jŒ×Z»ú'ü§÷Q1 ڤךÉ ”>öH 1.OIJ±Ü70±°âf^ ó<ÀCx$Ó\Éî…^Þß„· ö6WAP ÌK*¥vÈcs1^¸¼È€òß4nRñ<Ÿìc€çÞoí¡õ¹s»0fV&ú9ÛÉŸÞV@é˜tô±az}EU©%¢ÑK$Dª'X0¥©ÙD%)¶6×IÜ*¯¾‘¯|~¦î%ÅàQç%³±b“d©NŒ¬b73Þ*Ún< —roN¢ÖƒÏ©uK†Ç>ƒÌžH¦ßÈ å—˜Ž½ÿÇ|ái£e²O'PúÜ $ãÃ_®*"7béd]é†yJ4­ |$ØB£\¬ö€ƒ÷ò—àoœ=êD0½Q>P¢–ÝÌI±ïÕШPJ C±ÛÎá¯p”u]ÁW¾þU{´÷ÿgúx³lfîgû“ÉL‚æì­O å°ð‘mžâd£"Aâ ð~YJS!ÅåP.TÈpž¿*‡?øaú<À³cl8¨éhŒºó‘º­’³P9ÒÙƒmÞ1)Í½ŽšW¤‘7‹S6š¯ð±Äck<‚Æè´þwÆmn Ë´éÏÊ$ãNÕ…¨ >L~«ùY‡)˜Býr‹Íˆ5UYlØ@…XžQ$Ö„ÊJ6'x)T‹NŽùü«Ü\(*D öú"‹Rtu©Äbüí2ÐOƒ)H ´äN-O= ùÄ…•‰ÿäý¶¶]¾L Mô³ë.ìVª²_3@ͳ¿òw*”*Û¼Qí^FPƒ$ Jj>ÓÜ-DÚ·W3â<°Öǘ‹Z·ßvÛ%H#ã{„ÅŽÒ#2"Ç,ÿâÀù°"Œ³*q¨#7§lQ&~9ûÖíšÆËý„\©%#Hä&àyÙÔQc?´MÌe·%¿~Œ€ó„Zd™RV8°+sbP_² o2Eš%Mú‰—¾Ñ"í¨Ißú\@\² û—#ŠûópÓ;WË^Ôq/Liˈ¯¬…´P·ä³€T~ü!=&qqò>¯`ßš®*®H¤Ò›£Ë&©—ç¡$" ¥fC@VCbÆ»±§[®Ä€èyŸÚÜc±`yƒïL¨ÀÚ(¸è ÐÏãäýËh±Ïf>?¹¾9T ¯ ¹\w‚-¥ô'ào™6Et† §zÞ*G' ”á¼êq±}¤tô0»á“:Y› c­ ÎSlÏq@$™´ê­@xÆG YÛúÈ«·jšýô}à @)q*ÁÜ×Y¹H ·\*{ÓÈëÅfcM§ÿ#'/ hQ±ó8q¾DBw×ÿƒ›&pw^  $õ´öüé<}™-øÏ+¦ñ—Vm©hY€XN×0»p„âw…~?•NЯ ®zZ馟ž˜NîH=LWŸ—,?1+œ+ Pwrô£Ã¬¯iRGÕêž‚RAOÅê…Ù÷@u|ðáÏq³G_5_tAv-®­°–ÏwO'¹(ë ðÅm‹M<Åš(uaÉáRùêÓB³ouÈf!Ú×Ó'àmMpµ½Ðøe§xyJSUÞGó¸}¡vOo“êGF;P¾n·÷´ÉÄq÷¥«LÂ<ÀnšHi‰Ü¨ß7Ñ_¦gê‡b Aj“¤ÝRw²D¬€Â93M¼.aæ:-òˆý€ ïù¢#ð6-ãÍOe¿5:Ú å5ùFÎ?QYýZí+.|ëµË’Ï©•$±ÈžMUI9šr˱ó¯žÃIéè}Ù±üa¶Ð¶í]9À‰Ì[,þ·¡˜t¿r‚æôhß²ó±( ¾rYEÝýÖðt…K‚ÀÎ÷¹Þ¦Ï±&®Ä xs­X Ô$EúAÕ`ã]Å£ ¢Ø¬dâ‘SMŒçøŽ/ˆ“é)ÒæS½­gr¡ÚD08°ß9AJFî›+„ß÷e>“¬T™;1T­!¡$k²úÙV8I“DÔ5oJšsnY¦ŠÜÞ³CÞ@ϭŧz–ðG”hï<â\¯ßÁ¥­QòØíF31!tGpŒÖºƒ'­L÷Æ^trT t,nJèÔ¤Úý‡÷ £‘ßXÂÀÔÁó™ßs† ÑàÓ«Y޾F)¼_.LÌûðpY×4Ûb§£ÐÁÌMÚtÉm:È> RYÅa»¢¦UvÊÆ>–` „pƲä¯î¡Ø/XÛjíp™ÚÈe!æÝm†êÑE§ŠlC‡›.MŒÅz… €9YºÅ؃¯¢8àKBY'1–äÞËê¸Æ"l¥ kÝðOè®í-5æ¡ ÚC/'3Nk½^Ë‹3ßÁG®Áñ»l«ÊZÏ4ý¸MžZäƒÑC™ïF±Y`æu¡éïÒ‡jž/ÒÏ,f"m«?ÖUC«ñêí&iMÌâO½ÀPÁf?˜%&[ÌUŽ—‚Š ׊ð¥žWé‡dýjÎáÇYº ÄLiõxp™šw“\<–ª™OgkæÙ]/˜•μ\Õˆâ QÏÔêÉ¢F_«p(ÂiD F‘Ø,ÄÃ$!´àz·=Î×ÕŽ_Ë0Ìž-ø¥`“nÇ ×uf5½ÖÎ.M²sÌ?v¿-m1šuxMoP“Þ6%'iÙ¡3‘Í6i É5£«yO¤eäVÒ†ìÌ '¶Çm „ zÌ-“îj?†`.Rç@å!Æ~eªOаJ¯´±€p`K+3é4@éUìI`d>›1\$Üõ¤íO:åà|¾ˆ»|F4xºXFªKnË(†ÙNOìø° †a4³•2I©¸~G©·7Ì· ê·â‰a4¯ä™_æ(V0\Á¨7'ûf†›*K¯œI¹®,D{¾MÊWv¾x΢Zkúº·Eæpª}ÖÛüú>Í—yµóµÆX;š¼.š”¹ñï®Ü°¤ôxš[%—­‰}7žŽ[ˆQ_ß;ŸpÍ=á[µ[»0i*‡I5èpÇ3rau—2LY¢dÌ¿ûºÆo(†ßFôgL›9È¡!w×§&\2'€ÿŽÐ jþS›0½4vÕÆGyÜÀ°ª5ø;€½º1·¡À۲ט/Î}AÿÉ}È„?î7Ñzg ’ƒ„CëæàÔúsÕÚDŠÍ 3yŽÙgÉHˆ¿ip»\¤XOð=—™'C;“Kôihηí{Ù!JÊju¼½kh>òñ‹Ÿ½Fu;ÃX}VsïÇ(ŧÚb¾}Ð 3}ùk¥x­œ’¸¼PæÍ'Û‘J[{ë…; ™ ¶$«x¤†®;rŒnõ«H¤nÑùåRµm%P)ŽÞ zëzõ ;4@æB„Ûb]Ìbì/Kwˆ•Ý+ 7£$ɼŸ'0‹-•X˜=_Hi¦ùùæ¿®ÿS¼å“I졆âê³È„¡´™âõRiþtñ ìïœ5NE¾T‡·U£“«–ÿRtcçm½ >u!„ŠêtC»/—¾¹«VªYU•LbZ$–e°óU ¨L¿à¯ËŽâ‡|CÅEžË'©ükªE/›½­¶— Û¯¹è•¼.ëºÍñFBuh}]L.ì8žªóHIß ÆNõ2)‹Jbõ½3'­¯ï%'oŸ2 )š'_“’žQA¹ßvîÉñhóaÌOTŸØó˜’©…к<΂KÝ*ìJÙRÀL¶5YÒËQlvÙ¥Í˪"͵HÊO”÷*cÆš¾öë©”ƒÔ÷¨ðÖ)A/YÍ>ûÛ–‡3k ¾LY€¯s\ø®)7åcŽê5‚d§/» æ)…|`WT=ÀXhОÅÈPÙB5dp òb&ND2ºpñÑÛv-½FO»pïRŠsš.祸nØ5dŸÊËà.Y>@"cy£çaÚUµ6D!í¤°ð“á¼ñÆÃûå´î˜³¾qÿ¾Mø"D& Ïuv9QÊ×!©pú¶¶S,\Ͷ†}þ5\ïDnó`Vuþgd¯²ú–ü6v¿#[-GPjUšR4&%påN üüÎm’—‚l»÷#/1E…iÆ™K®LˆEKNlÈ)N™QWÙö÷óÙ61 ª¦…å¾^†Ügƒ %œv5]'4X£þU´ÀáOÓÚ_IZù0d/‹bbq4a]®õæzÎÂ\ãÜ:»Œ¸ïÁö¡Ÿ£Lçãct?¯‹½ÔhU„f ê„/ }¢+ „|ùZÄ?#«ÊžºùB”ó×>fD£Ì>Cb 2Þ5‡­ˆDÙ—å‹)¬¬˜áeŽÃaÎ^ÍÜGƒLò àŽå„í§wü³ÁQþS™ºQ,,õ‘@Zi|ÑGÛ[u4j‡<´ö“k·É–äêr 44hú ÿ(­àÉÝqâÅSû<§ßgéB‘nˆeèÀðúŠŠLA³ÁÇBõHÈ®ÿy+ÐS¶žò :fꕎ‘ÝÓ“|Z|)Ó¯WòN}…i†”.ÜopˆPÞ ímþ àöa¯ÔýE6Û\ˆE¤® ó5N¡7üš‚9LPA²‚&?W²øÁë4˜œOäV¡1È*|æÒæçð¬ÔrÜþ›"/ ™ì`šš+õÖñúAãÙìÇtaüþkÏÔ?È$þ›®RÑÎ`·yWµO²¸ƒ¾zeæR¿m÷âÁt¥ö–‡ÑÑðŽlõËæˆEüj×!{Òâkè (DÀÑv²u VBO~"ÐfدdVŠQí̘"Ÿ×Q0­/¦RŠ|µô~ÀML…Ý‹šë0ðî•ר eëÀ½‡;WIYðØ9¾ÔhzR<~á6KÚ&¯ÜJ=õûõÌ…Œ•V‹ux»ó?¸µp+úà“°mˆÁ`•~£ŽÈ_è6„§^Ñü³te†rÏ:1Û™guöŒË¢µÇÆÁëÇã;ÊU&ÖUƒ0rc4óX1À*‘*×áÏ>*‡[úU\ñB'ÉriªjB§Q?š i(^çÅÉŽ ÏAEN.nQß19ò23/aÁýÎ8WP´P ì‘ú׊…¯@PÜ9Ê50‚q+ß½OŒìˆ¹'-ts èÆ IB•¦Jt¤2ã¦Cw)w?:baC²Šò\¨W©Æ¤c&„dKêM„«·MØÝ9ºZuæaiOŠr$Û ûMIpq£3àù Ô0Ÿ°5¤kw@[žj€=.ñAYDèoêî®­fà5ÐãSØH³Þö–ã’è Ì*KP‰ˆúò`WLAúk à¤oÕåלoFÄÚ ÁöÜtNË l‡ÐóíþÞz˜Qrÿùœý‘ FÀhѺ5_¥ÖFJ±Éªz®ØÌ,LŽŸµbï¹vr<A¬è[‰׎¨÷Æ|˜aVŒöá þˆ!mÎ:’+©ù2ÇHYF ai± ÓÙNû[FM:#Zš]µå¤p ¿Øª„ý/¦Ïú‡ùþ È*',XýÞ9 ÉBž©°¯Ò›b%qöÍ©ÁL7Ãe•kïáá˜)wCŶå+úËF¸×N`¶°LzV¿oÒFY*\¾âxÊYe[2­†àC†ýÇUÐËÄ¥'Œþw€©àEì ³ôÖ4Ô¨~£x”Š6,Õ`YS¼/jN×5¢Â]£MI§å²!”rêá×ûê÷ù9=<ýÒ䇥íÇþÃNõ¾Ü2V6iäb{wÛ•WQÓƒ(o­˜â™vÌöÚA¦­Iãæàª%lGùfô#“ú¬ÙGWá+ï`°á}ÔÀ¥Zj‰ŠQ;·?—qQ¿9ÞäM°î™ÅrúxFZ…1é3Gb0Âå™§Ð/ä#HÏìFøÜÃá—²*»N»0v¼ækx= ¼Q(x%Až9.Ó¤;("Ð ‡Ñ¤U<õS"ÁTÙ_ÁΫœªîuŸ>Ù¨>’¼„NHmçá S˜&õ`ùßj]Ñs¯D ‹éìÎü[Øhƒþúk Ùnµý³¹²7¶w^ÿwKBäUôV‘ÎT6ZZ3É)˜aõÊ›RZ: öù- vMûO° vr0·©ÖöéJ¥“n~9{†«ÄÌP ç6©æßwþK7/þª%œÆþ$dn…†*'©V»úìéJÞìýÏò XDv£R>Ðá ;±Õø3ªÛôa f:@yÙ4Fã@ÅsQàÍlRÚÂø†áUåJ1ï}Ô“§*HañeíÂxÉ)Yv¼Ó’Ãd$'BÚàQ]Û†¢ºRëTÔ@| ßò|ŸØ¼äÄÄG[ÃZ쇢Èn 4K!½ª÷ÄâÁóÅÓþÀE`3 %¤C$òä ~9Ïáü½p !ÚMAf¡÷P2v²tš~—¿¾„ô©ð3¨Ñt3ØKkAô„"ŽQÈ~ŠH5VÑɺEg¼ u9°–ÐOØ@ˆB0nðqÀ‰–J˜uœ‚XÖüÃÀßöjì%‰nH®Þù-s d• €Í»w ‰¬½‹õ‹1˜ªvÍï,dûâ%÷DáfšÈh© zîV(‚F™žì$¶*8ª_ÒDðV¤¤7Ö™A½v¤b:‹èæ*•eÉ Ó²K>KT„oÖ3‰$È}ˆêRœÖcïò>ï>u(4ž•©{WäMÖùRE]~ÆPQß¹q”k"’åCe³Ož}vû~÷WÏ‚kÖÙù¦Ò1 ¿€}MjáüÅ(Þùƒ0Kv¤è"ïŠóÍ?GG↗4âbW9­CYþø}qÁ dÐcm..SXL Ö 9hwÔrÂþ Èolš(ZÞ =d½\¾‡˜l˜{·9"8#À¿=;^-,„[ÒU[TFÛ©‚ïLü>B¢=®&ùç½Þ„(JH ºÛÄ{[,¯E/î³ÆKXk%ˆ#ÿì – endstream endobj 246 0 obj << /Length1 727 /Length2 11566 /Length3 0 /Length 12139 /Filter /FlateDecode >> stream xÚmueP]ݲ-îîwwwwwgww÷àîîÜ]‚»šàïÜsnݪWëO÷è1«GÙ5‰¤ƒ½«º—#……‘™ &)ªÍÂÅÊ `fdC  sš¸‚ìÅM\¼- 9@ è`a°23³ PĽœA–V®j3š@€¦­‰9Èä Ðt°up™YøÝÝÝ…Ý]ÜÝÿR®V@€ÈSRÖ‘Q”PK)j¤€ö@g[€²›©-È 2Ú»iÎÛ'3{sп4¹0þ#ÀÞèìúW˜…³ƒ@AB]DRIQ !Ƥ.0±7ÈKÿ=nïêÂû— 43õü×tô×ÿF¶&ÿLÿý·êìù`2s˜-AöLÿòMÆÞÂÀùoØÜÍñ?¥¿‚\þêPÿõ`´øËv³µU4±¨ÅìÝ\Îs ³=@ÔÁÖ áé ´7šÿ‡mb²õúÿòÿ‡!ãjò×{Ë¿2ÿ¹H‚<æÊ ׿–[˜Øþµê\ øïûùW£ŸþÛ ð÷^Íìm½þ§áßaþiÇ$*¥¥¥¨B÷ß5ø§,aoæ`²·¨¹þuÔÄÙü¿À?eeпwè?Rþ³S–ÿÍL\Až=fÆ- ó¿¾ÿDÿËuðôa`ea0°±pX8Y¸<,Ü~ÿG®™›³3ÐÞõÛÿÎòŸüŸu=fë+f|¡Öé­á•þÅsUÐts3Æt+,à«Ó½—zè a+s£ƒó/7ê_ <ˆfƒL~žíÊÜ´š|"ý˜Š%‰4XùòTJVeé_·ý¢RøÜix¥‰og¦uuíš¹±¬L;Åž÷»NÖ©\]Š%Ö¸¢sm'amñÎ^ŠÆ€ #K÷ ¸OW‹6gVta*ô´·Qòé’ßȪ¨2Èñ B·`ÿΤç÷&k(ؘý›‰Ð¡-W´^#±;»¢ÿ‚ݳÐÅÙÙ”Óþ+;}F'ô^CëÛÂ#òÍíêDhê4À ÉÄ\à`"Ȇ ±º' q&aòŸo’…^?\H¹ý_m*x‹>ÒšÀ^´‡—­baîâ^®ŠyQž>ôWòµ¿÷Â=á_DK Þ#šÕé¤ëT¡d °;§'LZКMì°=äm=´é*'½R­¤-— t9>.é¯Ë4Ô¯«Aáu!øXD¨žÔ?Ò´ó×Û%£µ4hïF] ýŸåû‚–ëwb„T—thœ² Â~„K¬|QÅ9",€kÆ D•f¦>r›ˆU­~$n}¢ÒÙ¾ÚgåÎGXf5újrKW.-G¥þæ„Wçs£…EÎp~ªÏÜÛò^‘MpðãèªÅ1Z—2§äX ›~>íl½…Uhs»º^PÞýâ±ð0¬9EV#Jõ$LQT½¹…»Á´1LÁûò læ ^¼|¸UµåP‘nÄEI¼:b—6‰_ˆ½¾Æ-–ß ¼¯¾]ÛQ JŠ›WÕêÛ–ì(¾©vÚì)o+QvI@‚;Á ®¦e.¯»ï2PPë}ª}x÷¦éX´|°$ I /ãýÆonú¡Ü!Žwjlîù³«¸ÎÁ$b¬ìFüa䜑½uÀ¡?Z¯ž4±[I¿lëßWòréCïXà8`˜rA()H¦O×å\0ŠõØ|7èÍ.íÝ(9Ìt‡»° ÐÍÌÏ-û™B^S]&'Ü¥=ß1ù sU8_¦ƒ÷B–mÌ_ùûó2g3Hn2cŽÄ¸ã#²”Ñ›—w BS¡ÏI¢ÛHç;vÐT.Ö•£âHb†õ¤…%Pî¹Ôœ9qÙÂ'´ÇrЉœÈï®>ÙSDÎaýyf@ÝY|[Ì7wò‹ ÖTªlÍðc|Á*½)¥GU/2ØyP1nq”Ú”Z€#óZA]†ÆŸÉ5‘†€§"“% ,‚3 ª½üÁ—w˜ù¨»IIBF-™iåÊ|’Ùø½Íl'ˆ/KjÉVTmX»õŽpñØnu 똟oE!@SÂé³Ä̲7·žTI»A€FkìàµDí^Ð7Ââæ|âô­ºÔ=dZ€²2Ög¢ÌĵÜ{˜¬ö0ò‘ÝÈá¨Õ2šE‹ö순Ä4 æYÊ^†ûôx’6qÊs'Db†LØÄÛ* &E¡Ÿ•`:*bÉcɈÅ(1´B¬h>dOhËk 2·,>^ÍUüŒwæ²w*ë×@ëâÆ¦DõâCþ¯*Äa !_r2ý]–š›í'ï1.jUæHê# CH÷¯ÇwDW^H îÐJ—Æ&НâgSR˜xM}Až}íûª8á“A‹‘{§!EvW˜Ÿcgm0÷i\Ò8 å\çB‚§wA³„=PÃ*ôý\ºø¹ÐB™`P–æºL¾ .üJ™3Ÿ¡R}ÔÅÚgeÏb.º=i:îWÒÏ CN_£Î?müª|ÌSe"&2ïÚʯÊ~Ûàò4ä3Eض¼]kñ·Üìí¸¹iL‘d^$&?šfÒ¶6àýƒl„2µV °½@~ò;_‹D¼Œ˜Ž¯ÏÞ¤÷¬îlqŠGäeè-ä½-=®„@ß]z¬+ÃêyÑ<ÝžPÑ?r"ÑŠq|N´ò;Ô¸$Ä%îøáXŠ1è™Ô:G¯F (ßKÕ몕‚? ’ò¦ ¾Ød|]VÞÙ…ÙÔfÇ_¿Ýs7 g&(½Ê)n sãÔre}n²þhÚ'BGáÓ¾ìe^^3á륔æç] ~”@Ðp9(Î%6¥ÑeÇdÙ{”áqo„Æõé×µO•/_ð2…O«93ã sø¯¶¼•÷Šûäïnoøøöv; wö,¯ü*¿)$‹Ô2÷áèÖPîŽr˜ŸÃ-gs¸ÎÃy þLge£{pT {„˜ü÷Ë€§_Ÿ=‰/švB}CæÔ»Ùbßób¿²]ãŠû¹Cæ§)½Jí#À«Çê%ù|Îîœ<‰ˆ¾‡’RP%¿˜qòzJ2tbPùßý¢†‰È£;•·¦¸È2nvÜíà %\Œ½ ×£º|±€-X]e-§U7…|}Ô~«þÍqå´§žÒáMu¸}˜øƒÅýºÖÕÛ8R汤ǪztnàEOƒ\ÿ®fkx`ÏyÐíû-\ulH¤4t ÅÜŸÙWowUÉ‹·ú÷ߣžOÅV”>q… õ§›H?ï·Iç˜Û1ü^·é2ÜFÓÁÚZ·­5XÒ8ïFsñœƒÐqy¼ z-ùëÑËRQ•ÉÇ–Ç#A쑽æQy”¢€.‘7Ibzùç£Ù+7Ú*/,õNð@õÉòå˜Ê)\3ëÝT(2óê(žçL›.¿þßB;A‰€“ŸÃtpz»¾ä@ç‹¶e£ûj¨eud¤4= ¢†Áò»?7ëÛ¤ÎÖù*AÓÒ™ÂFvœžêzÞ•æ7«æì2Rª IE®4£ù"¬fÚûà‚á­¸I'´kCüOéñÙ¥4¶Åu ªÅÖxÌ›éøYÒ:è¸ M? Cè÷êÕÛ:ù$:Üa‰D.-A _Øü–$ÖèÉÞΕL,kGVEþO¤,8ìOh¯_Z©7c¬o OC Í“°¡4%UH³+õ¬B²›P|>Y–äá*¦ol¬ñø®Y(¯(*ÓR…¶¸°¼+tKh½<¯EBÛ E¤Üéá— ·­Ê›ŸCÛ¹½Aļ`‘íGcE26†«Êê9ÜIÖ·ZîûO¯«“Íð¹É««W!ÚNõ)“Ÿ-^¥f,?0¥5š¤_ÃA|µ ÉvÐ0œË.ò(ð_u [J¥EqËn3NDDÑ;œßñ*‹vе:e£’òiêàóTwé×¼Üi‰ŠŽ2«¶è®ãx'pYËõœ‹ûÂTÏnSKµº×•µûÇ{˜o·tX~¤ÉOòäi>Ì\ñȨ8¯K}ÕÖ±‘‹ïó^76”«÷mÙÜ’&»ºáq=*ÏÃg-0‰áª2,—¡AÜaÀLâËĵö¶º ¯_aÂdÒð8º÷©Á‘3‘¨EÂLÑnÒðz±•/Cßcº£4Öw¨……oÍ…Üm&‰ géun©Üéª3ê^¤BÍJ²:gÃìŠî8Tʆõ[ú›A‚œF¼£ÆTŽcg• ¢!ǰһ‚•ü_ÊXðµ°¸ò¾Þ~?’C¤Ï¼+ݹøŠ¶£ö$dšÆ×—zž8¿Éç ‘J¯Üöë4Æý³DÀÚßç1XkÆãVÒ{•®:®‰ø£å[ ²ÄûAôMs§¡pýOA¬‰é5S¯ùcÝÀs `0ÞÄT¨^‡”´h>Æøàâ2â-T“'X :ˆ-M¯ï¹öµ²g¶çcÔ…Å^‘\<‡°“x–+Òˆ÷Ôañô0£ƒ¼±1¯`$-ÛÞ0IŽ5ØXd嫘vÏÏΞ™ó Xóh}<¾Å}7[ ŒTx¥>戙—4žÀDÅæÄNxž{Va£@Èœ”Âíæcðâ{­)´¦ª-8±•÷p½Wì~PZJ*™¿¥‚ð´}Ê®(}PUØ‚-l{&là›ã‚äà ÒÝùŒ^…G[ €…$V¥Êúe‰`¨O>ùµSBM—b‚´–ø~‹×Ú$)Ìd øç}&ÿüpöèƒH½æ¿²þ…‚Î3ö2·À Ũ: Ç*1y¹´.†ÊH¬öüh.m:Mªèüž4-·-õzVƒ!lxÓµúrÚ«ÐÃ^–4ž~¯Ö%9ˆßYkÄ™íçbFÆí9-4²ÉŽÇm?»ÍØe3²8¾r©4hl wwßÁ´.k¸˜ú1zÒía箸 ^VKš_Á+õgY¿KЩlò(yý‡ÀçË©¡•”“¦ˆóaØ)62©QÅ*Ò¢^Ð cS}9Ñ=9ú¡î¶É0Èsoh õDp –ÈÍ\5­²ì춆Èüˆ®óøî0Ìl4K᤽§ñö>Yéfá‚'U—Ýæ…û§ÉòGø3î@‡†P‹Ý0GµN`ñB5ãÈœ~OÆáˆÄ)S¼G JàHW××"<§Åû"XQ™Î¬©Ë©S!KMö¥g…ïk´ý‘N–AzT©2¦¦ÊywŽIê´ ÃãïüåpDÉžgbkZÒÈœ={žLVÅž8Œ>“”¢ØpbëXäM ¤ 3GNTŠäÏ>oîfª¡¼ž=®kÝáÔíõtÝÂ#°. 2‹oõ´’ª–ƒ'ú´.^ŸA™.5Í=…Û(Ü´˜ýÚ¼*HÒ.R ñ`i—£ì‚ôI«jom—>§”[iÚž‘Uï®u4±öv0qÑX¨h%0‘L›[k¿ªRÞé ThkG{Må)¸©}À1§˜?é †änáL‹õpÞ,xs°\m§DSñÜïŠavýi7ý%ñ3Açºþ±³Ý1¹e‡zLh{³ ;ãSFc_=â’«çÒéöÇpüuM ŽLtê65NƒIEhmÛ‹ÉÎàzbBª¯“lqŠ­2è&~Ça“-‚õ1Ó/¨ ‡Â@ñ4ß´aºÒ¯kÓËý?±æeõÂJSõÿôoÖúhuîe®ŒþÁ¥É”ÇR7 ›j°ÌÄM­£V'*¶¾ ç!÷ ¥t¸ßÔБÆ<í~$1£s_lDšªÚ-¯ˆ!Ɔë lÉVµ«^$,4Gùü>¿:[5§æ¼~˜yÉiاq9<·1Þݦ\gÅjAàdOÒ8‡ñ¹n»€pÚ'ò<óZÌâQÕ[Q­þØþæüF’ãêd·±µ‡ç¡}©ûØÇòbù)BlQ'QÍDDlx‡­ •>GÔÙ6âÒÕávìè; Ï/J»RþÕœÀ¥'1ºuusÂ"%Ô {ò €aÈ”Z¶gH;íV›„~•=£\E4 Ò<WcSÝéÎ}O£—ÙK¿`TóËΆÃÚ^™ð$$*þÕGªiô –5É¡ Œ‹àÔÉpƒzáêöØ¡æ'ë²[Üó`ªeÊdsºä©mº8–¥¹ÝZŽÃA ~ÇÇ7÷{NÉe‹¾å`EÖ¹·r*e;XÞ…ïèÕ9_GÅBk…Þ >ßЊׯ6ɯŸ× 7Ô‘cð ‰3b}™bFOe×9‰—šÃÂb-Ò,jæ9í=ŒèÖLÓMƒo­ßQ@[ÓxÞŒç^îZ;¾ß¤¬KèÒ‚ÅÝÝCaG&¦nø6ú² ð(Å öŽX¸ì6¨šK´ž?ƒ‡^ˆà5xiÀZ®/uÄÚ^ ‡k­0ÃXV.)Ò¹n|TÚâ ðψcÛƒç¹k ®E†Ýó 2uh5Ø¿ áQMÙ‰eú5Ñ »ù Œ¢i¼“Ôk„ˆPö9a¤¼°NÚË“ ×L1ue¨/4¼ÁÉ{ˆ³Ë„ŸäýéN„TžXR±¸5Ï‹YB69°Ææç§˜ÛÂÐ*×}ˆÍ —R³†°\gtkû* ZÝnk>Õ4Û¢Éj>ã.Ë“ø³IÅîyô~݇äàt°œ# ƒïõ4¤Z.n,.ý|Gª"7›¬ÓFÇd ¦9-pÞëeh7¿qZ{ÿ;z΂{!néÃI±M¢ÉëØZÎ…ýol½ö*vã©éM€S|•oÐâ3Ì›Rì4o`'ìif­@ý3#[upËìò ýzÆipÆ‚KJ}€Õ«ýc¢e„ä[ŸQJÉí.;JZ½bJ+/øÑ3$çïfŸŒöy¥–»yÊ+…ì.>´8Å⪸Bq•ÍwÒÓdèÑu?—š¥Ãs[•'•(~ñ2ÓîÆä‚®²:®nT¿ìFö!oÌCƒ{Q±~&BÃpØøë”Y÷GÊÏ¥I¬¸•dÝ?½Ô"DÆ­.S‰DoøJ2=¯øâT9_­øçüÕ”ñê ‡õˆe ¬ŒZ0òR;Okð+ºì=%Wù¯,®{ð¸ø" bÃ[4ZlÚ‰À'ª?Êjd_˜ÝåoW]”d&dºV éL‹²èÅúxžö8½|Þ÷…=Ççˆl¨ìó^V « /_BN”òRyÓgFð[¯›Ä5~iˆfœËë#Pöì«3X‚Ä+UyöÙBøQØj`ˆ›í‹f¿oY²[˜ó¶ŠÆu{Øs­®~-\_]™—vip6l[w•¢R\e÷P+¨ÈnPKØ(5¼°Ô<Ë»~sô¼o‚’¢õÉpµ>W„P*cVñ߱贔û¼ˆ/“4›Ë+Ä˵ºµ6 ܉•ßQj>`¶V_]G„ôö,‘’WŒ¸°µÁ(¡¡Mz'ª]|w•Ÿ#(4·É-qX_ò¿°+¢§rYÿ&ðgƒÉ-P\®JóeWÐ˰AH µLÆ:Þ"}$)÷ŠhMYrm sj({†U*¾Á ´Т‚Ù!­E5ý= ð~r;/-&5¦ØodKLä8(…@Œkp>sÃú·Ð‡hËØjÜÁÜrg]´¬Hp©íœ [y bÏn-UaИ›`­˜_þ$#ðA1è§ïä“HÍØ <;.:hÍ"ùkð 3¹Ìi-' aæx³}†˜R¡tœãzYëõˆF‘£Ê[“‘ÄzzQ.“|%–‹*dÄa’]«Ú}”.7úT‹¸çA trá7 ²G|Íyˆ­=­ÃÙ>+“a¿cÆ„ î}Ou6ÅËý7BKÒûd.*J²‚“¦„•ôÊKן†'hÉ䯡ÒÿïCŸKº÷ÚH·i¬<öÊ1Ã&k2¢çº/Gcy ç°FIß WK­•YqäÙÙ1Fá¥-â=†I9Ë )uÉDÖ™vÞ‘Ba@ôO²ÙO,š Ýy«˜E0˜žRê¢ ?“LÕKýVÓûs±¿¯¼º¼OÏ¿gßð¡€ráúíÎ$T¦OçŠ3åý¶œÙ¿§Ç™HR ÑùGŸ?joì‹DÙ÷®桜ϔ´ø;#owey$A!ˆž–X)‚JÛaqº“ÖO?G¡4îÕÖg¦@§3þ Q ÊÓ¯XžÅ‘Å^'Å;f¥×ØÐ¢z2èÆÌ3§¹­@. G¦ePYX&‹Ð3‰W´V!Þ²ÎHX ¯/ôñ`ä‡5w«I±ÍC™‡á«› /Œ“±rIÄŒ©5ÝÄEÕ™1n:ø*ûÀÒ`ú­Ô­Ü}•ûÍÀ: dñœ’ÐT)Î?¥e$°«d§ ;Ç Xâ Uñ$ì@©¦‚")aj1&àÇ¢]Ÿl“t5ŠÙl\T‡Åôò™]1xÝæÇ_åšüÂÎTaµ:$,g¤j‚«* „ .ùÃü:'9 rRÜ*VÓræØ ´Q¹8[ZÃý•6ZüDѺϹ‡w";­ÉñËa³p…µ[8̶{…Ô²#„Õ¿Ä»!k-j…;Ààéµô«Lޤ~«•ü‰BnùÅåæ]¬¾œBÖ Ù÷*ÑsÇ™SD}jòîèFþ¯_p É„ƒVcžã‰žù?7(e&b)ì×!æ+ml£?ÿûeÖªHüjì9uÐzÚõ|¸QKgäU“Ö6ªTµû‡…¤ECœ]U‚4»r7½âæß.‹,|¤½sïg픸ÛÕÍ)¥Z)FNE>ô±Þ"<˜ßÉÅs:+»Ãq‹âl,T…Ç mMà Zæ6±ØB(W¦2F¹¹…µ½h½`퀆6ϤònÛoÛÎì@rÂQ#Wnþ!K#IqÄ­ùPP„h ú¹¶É¤Þ Iøå|¦¸$>.  âáHŠ9Ä‹à?¦¥>Nܺ2Dõø­C¤U ‹‚VjНõ‘»£•eúõÌtCY7•–Rˆäúì8üwrþ%f_a™Ý0ªž>)ö)¿ªŽÊÓ›IŒÙ~±(bø´U {W3Eíš¾îlÞÅ j¬žd‘_—öýÉ«f¨IiS¢Ë½â] ®)Òy/û\tt ƒ4†ÆiðÓ–Rª¦¾+©ôdOsˆ+[Þ;ÃGö±m&óÑ÷ÀɆqs0‘¯ôà Î)í±Âp6‹>•G±˜šXÒº÷Óú¸( xÔVûf×êÊ„­ô}Ÿ2?(Öb¼LÇ«»-–í̺þ(7³!ûÂ\tˆÃâìX1϶㶹*¥j žÁæ‰*4ºê èq=¦#Ež ýø¾uÇóªI…ýìõB {‹È¦KÜi¯ÉÖE“8e‰ÉÓË1 (òDE‡3[ý%·™ÈÝj²=±Y !¼ÜMÙÍ“›“O$<Áx'åØD¨o.è²€®M#¿h¨æ‚Ä%”ÿd‘É¥¯U5‰Ö¡Ô¥­jOŸš…ß„ï+Q=ÔC§ï!ëåG§×ø“!“ä§,ãÆ1«ÛB%x±™±”÷®Âó5áR ¹V¦HXÇü—‰<¨,D*‚äKŸGFÉF“ƒCñÃo¬I©P©ãU Ê·°N𥸠£¨D¹è6‹" íPƒøúˆÀž$D§»ë°àe‘AWÊúM£n•,Ï0ãL@vÎáduÕ’…¨ráâ’Dñ¤¶ÎæÎæ“ Ðô“Þ*¸0=–r‰FI_Ðfá_†ëmö’xÍõAbÏŸ9áÅKµv•ùK¶ð"•FãA|r•Á¬GPåüN\«çð“8¶tæ}a™ øÇøŸËÌÚÓgB¸qí½.·Ö£;0ILkz•G\ú>o fÚ’¥<¨¹ò•–¯Dþ]‚à²îÛ‚`Ô­ApGpÏ«¬û†ÁÄ/Ì2%ÂÆz¢uGº¦{¥èØkÃ+f¢¬«X1¹½UaæáU(fÆ)gPö;!ڦ;6L°”öQR5TÍŽSÏÎàí釭S”v›yS¬0Þ„>Õø3B¨ì8s Ù.p ZÑÑaõÁ3F!ËTίù/%Ï²Æ ‰ŸðÑßð<pe$½ •äM_~vέj.„Vê¼RMÜÔcždä#ÏòxôKBjG]€ž-oÏa;.ûrž„û7]7ÍðÓo7~±›ÊP'ÆÙŠÖCuý$`Ö¨î[çAÒÏŸ1ù,QP'ò<£ƒ×•zWQ§:"Ȧ¶âCKåT­~©ÍÂù.ªå”Jy¢™û›Ô0´yl曑}:úkŸç9F§’{°L‰£ Ø/"Áº÷¤/¹äi{<€®=€taú´Ÿ mO•$#×ro-jĤÚNä§Õãë>Þýv °{Mxrçq©OQÎ-,ßq­jx«ŒSüóÌ£À‹ zÝ=ÒФ¨ŸNGF×hC¾òèÒt€êþMfhBx‹7ÆÏRŽþ¡åÚmæÉîûÕ¨öSI¶ò%‚•É@šÄL0µ `:ÚTµ ã'[ƒê;7 7"~¥³˜‚…X‚¯wT´Ð÷˜î&ô“ a}ó•w•¤ódÑ/²'Žp#—~*c`äÅêë·ZÜQÏŸà±W"ª¼‘Š4Øåá[?ŒU…°•<Ñ6>1hgÉqY²ŸŠm¿£Šþ…ÇE//åûø ¢×ùmkþjE$>&1§¸D¯ø×2c¥ƒcù˜gèDfq0dÉö–Fòç-ê´BÊ×¶)… G†‚]*ªõ½*†|¢± ç)çMC{¤)ÜÐ"Ù>4ÚR’KÃÀMúœ³o+•(#¶â‘!ýI•&s(­ÙM!tI^­t& Ú¹pÚž)éb‹ª5(5žT\„ûêœb°wpÎ{(^¯C¾vé{;MÑXÊ*2t]ÑÎxÓ8˜#„ÑHêsGOaàuƒª3ÊjÜ\Õ€0¦‚!km úë6ž÷¯u—×P»(i?1bݰ¤)ØÁ]+_á{žÇ¨q¸XÜûåÊÔ˜*êVe²U*ÄZÕ ;©öc)J@eÓ‚;#¦~ÌUÁ@Ó¥PmFîƒ ôb‘VLè\«ö"Oë³p cú‡3?Ç ,%žQ[3QãoÒ‰ZS’­ô"å„"zbÍǨ‹c–!ÁE»FÊÛïÝr3²¡à¬äˆ?¿îDûGá©®à´S¨Fî¿!š#:à]ãÖIGwT|j΢mÞ¯6F•ºX Dˆåð3?Øó kÀ­¼zyÙÌV×mH÷Ù ¯,J?µã´Ï{=Ç«y¿­¾ ê!íμY½Ã…K™UºAågŠ?ôa˜ôéÒ/^0Ýæð2ª5¢…ëü@TÃÀï?ùP±ŸHK•¯J®^GÆ:?ÔY¶á;1WvxPa/4b}m? žz/— éåv«ŽúRùWæYhœ†“G0ÛíÔÁë!öäIcvæs’t¾Ûö«_—ì ­d‹ï¨ 4¼Mg{D©jóM}»ï«q5l²èN#lG£¤ã(rñ·‘¯ÈØž†ÄÛ½#ƒE—Ú‘h±î:$ê¹ ëm»Áq†È†>pÞ?½òD ¯ˆ‡ÝMŸ7b¦ÑØSjD".LÂN—ãÙ„RUPPWë_2è\Y ~PM¡'pØï®Å¯'Å%‹€’P,È›o˜“Ÿô2Mì–c…·ÚéÁ…¾Wrf›3}犊¡ü9ðâ5T2w|§ÒkDî›ðJ¦¹Ð e¿Älž“7 Ð å¿^Úåµñì$Á®×ž!½Hÿ …ýª'ªÑó³t¼Ùø>N1! •”‰ˆñ +-ð6÷†!V\=å5"Ú3ZêËt.®Ébj$¾ gI½¯l763¹Êv ÆlY;WSÙî}Æ] ²f^þˆv¡}Ÿ~†cÔPŽüÝw 1fBçï¹ââN|¸0’¦rêJCäÃR4?÷‰Ón Iø&Z¾µöŽ 1|ÐØŒÛý"<É ‚d!ᘠdª¸nl²†°…IÍ8²«“®#ÛkiêHŸÍCs1è¢{§B"‰à/âM²Â…0з/l$Mà}aÍÓîüeT¯Ðè”,ïOä]Oíµ9¾•yÉŽÙûì7oþ˜öžœÂe{õ¼9½ÌÛ$ëu&P}ª~‰±.¡þ¹ÌQ—`íZB¬g|ýf*d‹«¡„cÝ1RølQ°Û×Lj1¿£äðaSÉxk(Jä`䥞F öõ»uQf“=þ@ëÖÿÄ¢ÝßüÆÑëóÚ‹Në ö:÷uÆ&'±ájÂûÉ¢Éb9’ö¥õ^H¦6„ƒÊÇnðõÇ«öoŠhšÙŠ!I¾&_ýWè€æ¯C½ MôqÂìp¬Qñe‰ÔnDéý|ï6óL¯ö‚‡º-h~óѰv…¢–€—kOYÈYtxô÷ÜíyFÃTÕ†…ÂR½Áîß(äq‹Àòy#”0åéT–µ0€Ë;1ÆÜ›•¾a\Mv+ñd"9¹¿òÚN‡Où›yûÖ^Ka¶j¢ŠçŸ… ¤wg½Ó¥ö 3svk®ü¾z‡'.(ä”Ò?3ˆÊ £«ÕX¹¬ú2ÃàKTvêfp,ÛV„AïŠ÷Ь:xÈá,ß5d?†’h»ßBžTp‡ÑÐÀ¿Ýß9 ƒØC!äV³ÂX­„—¸—ÆP½3=¿p2Uúc [`¥»é0!4WöÈü‰ãHT&n˜Ã­€ÐË ™øÉëµË Õ¹ R›*"§:4éËI’ÛzDÂ96¥ýécjÓ\!¡ßdL"©;„/Ÿk³ó>‚âÙi­¤ñÊûUs$€býãœÁ©¾¿Å¶íG昗ùy¼j>â$É«‰eûâk÷ku‚îŽ}K½ú :œã§z(+›šXcÉß+Û#Iz¢X7ØÎö{0}Þì?Œâƒ ¶"Á°Ž<8åÆÑÚMˉîn áÔÌåZÿÔÙÀbR‰Ì+ÃÇýÈ8æ’Ýò-S£æ×’3h½_\Ç$æBõMÿŠåj±ôDWôDyznO‰Mó€øòsü2ÒÏôè¹8ÅœITF­ðþ3ÇQb¼¬Ð;Õ–ÄT´Š^C)g;e2‚ÕÃBk—ùÙͺÍ!ØàÅOÇ?€½$Xåç‰ÉΓŠ?¼…£%½"¢Z¾üœ‚Vfœ|äjÈ5QWýW; Ë£½E\)…St‹úÏPŸ{c^-ýgÔ$Dà©bºöÑk–’/=Æ{ÔÂ’­;CltÌke#Â$7~­”¡fUpì Ç,n¯ó>@aÛÁšt±Ÿ6Øâ¥P²v_Ü'­¡"/nÄ/Ï¢š8¹#ãò *Zü>LÄ=C¼L¦ã=˼ˆýãâ¢Õ¥$Ľü…ÌØ ÖÛ‘Kÿ‡é)Ê W)—¾¯~ú$S0æoUEj°ü˜TAxF½$¯Æý¤X‰AÔZ­p‚;½mEŒ¯!1¯Ñ¯ã>Ûü÷ â|ô 0¶óhNôqpSÖè+µ<‘nCèíÛæ±E÷ÌŒ6 5隤+ÖX ŠY?õÁUÃÇW¨ùovùŒPBlSÌ’auƒõ(|®µµœôs·¨ýÄ3¾2çR鬋CPhÅhÜ:vQƒL<9‰¥ùç6™ªý‘CÚQ¶ƒ¶¹e°ÏäA×_Ia} CÀ»ã5S/TÀ/ €‘u–žÍŠ&Ƽ›Ý©›Ð„qÊ|Óù}$Ãw׿®¿‡ ‡§æàçxk72•G¾WöQÛ mȬØÀŠ=ÊnÚ«¢£¡øò‘‡EJRä®ÅpI<È Ú8¹—0³ûÕš2z‚…?-õCÜ'nwZa1@áY4ÊÇšz:{›")U‘Æà]m¶'‹Æèå—ve°ï.Î÷\[Þ£qÃIZp·D9´:šöåXâK¶žúÜÎyÍCvé·Ã±~°áÈ—d&f.¾‚Éá£ïÜÑ¿ä\«a{+!΂žþ©Ê+/ß‘GÙ°òQ©üÜ?ä%YßpW}4ˆÓ° tÈJO>Yî²Bã&*ñ”b×­^8'o“û¥£MÀç/;”ÓÇÖÏ%Á›¶ZÒ”¡wS&|V1YŠ[,’ékÙJG2¾Ö|­8AœÐ.†ÞI ÏH™.¹#ÀæÄÔbR£"HSm’µËYF$…”ô~/}½2?ä/“÷s47ß¹¿^‹ãjgR{xÀI²Ëžºß;6¹tgûþËÉ0 |{9¯^ f*é8 ëÃú‡Ïu"œ4Pã½QRò¬ý·®…¹÷uÓLîšl¶à®i@ »„> Û»{:¨0\ - ÿ/Ý”=Þž¿ÃÉð”—?Pr7VsWÓŒê÷­r©\õ„õ[[t…·ì>ã«Eä±-ÈkùÎ@D¬ãàÿŠ]é endstream endobj 248 0 obj << /Length1 721 /Length2 24828 /Length3 0 /Length 25399 /Filter /FlateDecode >> stream xÚlxSfݲmÙ]6¿²mÛ¶mÛ¶mÛ¶mw©Ëê²mÝï}÷¹q"n¬—ÄȘ#Ç̇¹’”PÌÞÎEÅÓÁ”‘–‘Ž  ,¦$ËÈÀÀ` c†!%v25t±´·1t1娛š”MŒL&FR€°½ƒ§“¥¹… €Â˜òßA€š¡‰¥­¥@ÍÞÆÞÍÒØÀãææ&àæìJçäÊG÷O‘²©)ÀÅÂ`fic –WД”PˆË©ÄMíL m ®F6–ÆKcS;gSJ€™½Àæ?ÀØÞÎÄò_œœéþMÀÎÍÔÉåbfNö¶YQA1y9€¨0½Š0ÀÐÎ #ñO¹‹3×?hSc'ÛuGpùËÆð,£ÿ±þ'ëäñ‹†‘`biì025·´ƒ¡ÿ—n’vfö¶ÿ„M\þ›ú‡ó?üÿhH 015ûíjc#ghk  ¶·upu1uÈÚ›˜:Ù”ìm íþ‹2´µ´ñüÿâþ/BÒÅðíÌÿQŽá?!Kg1KSK—¤63´ùG¢ÇÕMÿs/²¦&–®¶ÿ©7ýGnÔÄÞÎÆóÿùOÿ>^MKYDDšúàßiQ;c{K;s€²Ë?Z:™üOàßiCËÿLÏÉüwšŒÿÏ—5tq²ôh3Ðýk<þõý×Òý(!!{oZFN-3#€‘…• ÀÉÌîû¿è»:9™Ú¹ü[ðzù¯ÿïA25õ05†YÿcoÌb•ÞVé'Zü» œú÷œ*õFàÕÙ¾m$Ë ýÃ+ì{ìw8¼ù@#Þ½Ë]ÉûV"ÃxS¸ãé™ÂÝ?د¥ÄUæ~uÛoz×`jX¶Ær`7‘w.™ëA T3,ÙyçuRŽå¼HâŒ1]ƒàˆ; kKv┺äÈYZßp¦©k[„]ñ¿î¯ƒ„ïÁÝbé[U:†kÞ›3êïÙõ;/ºgIY‹Qa…Gr–DÜ#¦”[’Î’l,«s-ͳ’9ÄÜÚùõö=iª@!ÚF>b.x­ ^i[)ÅE‚Tqé#VçıR5M”B„€)Ä+<×óÈië ?ТŸ\à+ß· mÇl€«Bÿ1òzué»ÅÄŽ)å;™üî¾@#§#P»+ü9ßÜ{q&¥üDìq&Ü-`àþ<ÝS]é hIE×£c8è‹&5­ä&/NOr?úËÛÚö$ Ôvb3Ci5•oªâu~&÷Ò\Ü´fìÆ~Å“?®­$d¼€ŠäO$ƒÈYÕÁÉÒ†tÝ—ª]A@¼÷öúðsäé\ ­ÛqÈY¾ê:‹NiášD’PÒ§‘͘Ayì )Óк;Lêäæf(S!Wóî´ÓëöŽb»î€øWýrLçD[Ïu¸eäψÉ_¥p$gÄ‘nZ/;ÚKüç©M"_Šwu”#•Õo•ç¹£Ëä¶JVÍ^G™œ/yÏz*zÄi+ž=”¦ V–a^r:·%Áê)~¨èö7ø{½ Y›vy¢›Ï$|V“2.qƨÏã»B6[‰E7oÅ‘¢(ƒÞ|×ßzSL/|6:¶ù®ŽoÎû-©þ-s‚6Z—‚üƒÞjëM³~æ8„›ÿžl8ä n¡×08Pv_üE†ÆxÛŒs¿¹pµçühcä \txÔ‘ÄÔì0šã(ºÚwåˆ-ûÈ ·/SÑÚŠ4IÁ #ÿA»p2sj’Š«A)Æ›4êVÍ,¶®Å7+„wåoNcú_"QFf#+b&ÞÁ䑹|‡HÝóÜÆPøµ¼\ÛB ™5y*IûÙ,T/ÿØýäme ¹°îJ0Ï éòÑ0¸yìÄ!œm}UIÑ„ ~5K§z)nÉG *3œ; °‘;éLARoP6ªÃfŸ%QU§59XX1ç†k¸q¢Ýææê-SKV4IñÔko+S[Í¯ó½øžKOò$qw¾Vðu~^aŸ{qƒü &rÓbƒ‰ÚV®Ípw/¾Òé¡n/÷iïgH?jn|õTö`âǯ=bµY¤,Zgž¼pÖ?FÔ6#‹1Ëy}ųÆÌž$¢¼há1h¢F½¿Š¾Z3s¯©¢»XI~5Hžã)QòÆ+X³« þàe<ôK @å¿XR&”`ûx”Á°¹Íé„„ÅýpGV=³t††‡‹‹&µ#ªI)' rh¢8umþ'¥ Ò¶¸¢¿£‘Œ7žß+B+"ö%XS›¢Ÿõ1%¬å ÿHîp=¡´÷ÁUw½Æ_PžYô’ ¢` 3Øã>¼ïhº@QÄ ¢Å+/h{Œr“…ùrãÇT/ù©áÍú\¿v‹‡Ê±¦€ÁV¿‰rdÛ¼ó ÇàöüÕ´^ƒì®Áöô4 _wƒKR_Ùé·8õ®?¨ä-ÂÈfj1'|Ž´M“ýêýî‡õ ¿f©YXLаlâèê µÏ_ÕÁEކpŽ™4i®Š´cÞL{ý朤e§RΡ„Ð‘ªùs}-%ÿ¨,V‰6Uœ9.‚é-̈NšÜÄ%ÑY¿7FýÎ% ™íH€€–,¶AÝLJndׇŒ,¿»h¾¸•ÿÛ+#ÔU}ÿˆ›¢¦üÑ©g:#ÅÛ`Ëê+2h~J׌W:Yb Uè GM½ÇØúˆ“ÃÙæÔ²Áࣻg¥HeZ¾P“Y÷Mî’õ[¤dÏ$Â[œi¨ÅBþ¥eŒƒÃ;F]i½|-éäjõ¯ÅV̪‰4ý€ýýöD•MËÕÁ[•áǵíÆ{êÉf·bu㮑+û òTêìR^&ñ`!˜ý']„Ž:‚âØÃÜ#‰ž­¸£ü@Ç—4ÐFpÉ P«fŽG¢Ëƒz?s¼Še€ÍѨ~OàJµæ0©û#p¼yñ8.é}¿ï–MÚ©óêð`!ˆŽ&…‹DµòõÔ’J/=bŽU@ˆä£,ØÄ­fºDýg– 1˜R,H“¬µˆ=î”êdÿ<Áª›xÊØÒ²¹s¯i ÐËzGÌ$PÌ:uGÒ€ãtÀ÷é‚#¬× k)FQé÷H)}(ö“ú@×t"þ»í¤³—ôk9‹—C(¶½Âæm‘Rœµ¯g}&¼ÎVbÙš+¾Êë¹d™?q¬=N«Øß•´Žé'À°4Þ¤–cîvÅQúfŸÐg2¬P&³…Ù€*º¿=ð™í£doqCzîÖ½vãÚæ†uWÍÆžuÐU“É®·€^â\Nžl>öðwøhü–+¥w6¡ô\ìk|²ýZ‰ÊplvCƒ75Ä„³œ'tN²Eò4MÐ^k…ÿÆ0o5tfB¿£þÀ+n$@‚rwÂþ9ÙÃ(¡²­­°U\4,#w4úYB<`-¶â×f¸ vÂ>ÊwC‹YÓJÖ0®·JŒI=Ï9yfIõ‘7öo W€@ŘOˤÃr IÄ´|ÕÜÖu{õ0Chð—æÞ]µTè†C¨E¤Qyd`6Ÿ©žMÌQÙÙ°;JMɨ5Á‘·Ãò•¿Ìx© `ß!šon˜ÞãGá‡U™6ÍðË(‘•¹–[3âwóö¹•ƒR|úBÉð ´è“ïû«Ù#Á¢Ûgõ'?n |Ͱ*/1ó¤B{µdùvhbfW,IÃnbxïÒCdÐfni¨&w~ʪ¡@+>1Kºý%uƒmLšk*Ϻ¥€‡—6vÓí›6¦"ÖËU5µg¨M¹7ªIƒz›®im]]Ü'U'Š«âRuƒ!PÜÃ\}#'Ô¨h°ÆxÂü„çE]qùÛVÀCì±Ð,&¹§Äë·Qr­É±èâ§¢vrè…l¹FYœY¢¼s5´Ïo°F: ²F®'vÆ+G+’ù&‚‹øÇÓ›šp:š@.D4!¯vz«Š}e“º}NÜÈÆã4XððÓ'\Øú™N“½fO+8Ç«Ù`µ†l”rù02üßÛ‘M!XZ´u–ežèkÄv¤!|ìóƒâuE,ÏÍSFª_õ£ÔZa`Û®ƒmt´ÙmÆÝ?"/®žÊmëé‰úA‘v}šþ˜sð™o~RÝõ²ÅKjZs±.×¶û¿ 9ÏJÏžøUs"Že-ß!:gŠP¢ÖGf¢jì¤.^ª;炱8 tаüKZVÎ5pඃ¡8׌ü€COV2=ÁOÝF×Uù¯‹–”ö wÉ"8¥ôÖȯo›}ÃHp¥9/F²rjqœ€™É#¾¨Á§Ï3åÝ KM>÷îpòJ)©}ú/!ìÏòÀ3›Jæç5–Å/xÄH 7û·4ŠdMïˆ.q‘áš!DZÍjÔËCVäæ¦Ž TBjZ¼ÚW|%˜ÜÌÚ%R0½S˜Ek"­ët¸¥Àñp°ñ˘ï)I‘ÃDPëÃB´ÄjÆ£ž‰²œ«¸jˆ‹õh¡‹¾=w”‰ZçºIÄ7!Ûø4^qbçáx=÷½5™3·YÌÊŒòP®+Pc:´r“1Gêǃêò6Ë÷Ö@±åñ^Ö²£)³§–6ZƒIÃy[øLƒ8’$Ôp!íÔ­S &ð7Ö§~ýJZ-&ƒ Q„à“ d_3#KÄPUÕ¸3ȵ¼ žhUþPè˜s¿æyD‚ ¦ê}=ƒ?8­:ö¨š¾a–¼G@ÛËŽ "öº½!à7ñuzóün2*`Ón¦hÉHí÷Á24ÒúÖüMœcÈÙWôä($ùwR/ËYSÇ2+gT(\XæíF¨öò;î!£Øwf ~Qòyù/‹NüýIzãÇUp^Y'i 'sºö«éGÉùk«* µþ!Õ‡ämeñµ^v̧Үv€ÜH²êqäÌqÁ„‰„Â,|×Ö//2W zi$—ž¨´ÇØøé½ô`²yÄùÒ£·lq<Ûð4¾Pû*ªÚtóT« Eí+ÕåiÌ1ªçšÿÜZC• ˆ8ÊRÕ;Ñóhiʾ‡ÀÇÎl%t’¯áÙ h1í‡L?Dþ“ঠè¸Ð)yÓËmfz[Ÿè…Ä•Ëdm%º4„Î^‚SSs‰=È,Š,ÀæJ]“PÂ/U-.¾ÔÔ ªØ¨IëVu¤%K4Ü:T[DVB«øçø< =áŒ~ä³Ð$üZ_#Ü(þ‘5YŒ¨ÊåÜï›.'n•—JÉvFÁŽ òÊúeøËöIî·¿~ŸuiGz˜€¤Ýˆè­¯ãñ,ÐUÕª®›\ì=A ‰ÚǕ߿¶=“:Ä„a"Ü F“ÍÛH.´/_lð&Ðñý˜¸­à—FssChp5º$3ÍôX­ôFwýpýûEl½z¼‚ sMžrÚBÛqezïtô^—Sšš k•?£/¨`H#H¨’{ÿV‘á]ŒÃ{u éý6ìmhHÄâˆSL¹(ëQŸ/³ÞX?ö8¿™S Ú–Ö­î%B‚[_Ë¿-ž’êüJã–ÜvÏx)·ŒŠù`y‡ÿûÍ­ÈlŠK-æÝÄ++­6þ<Ø,0“»#sCÕ§Rgûú¶r¢Äïµï ‡Ñ%­¶$•£,¡ƒ(hiµ À©'c&LóGœä îkÑ?3BÐÓÀÇ|Š]!!Âé·“I¡+•EýºY¹Ë*×zôÕãÒŽ$ÛÝ4\ÿJ¿(±T?óÓÞ´Gí°^éÕC½dw’ƒJƒ¨—c¿‡ÓK𝆠·;ß1?¯$!ñYIøeÀµ"d}ì&Ђ8x‘iëѪ™v’ÀFZ5–MQ ŒÓÀÎYèÁ+™lNå„3~a9‘¦A‘…јqGÉ–Î:D”5gn¶n½åñ9‚~ptÛá™10tÛÆI·Ù¶¡zwïò´CW×1¡}Bi8,I 72\Üž-©ËŠù@-¦@Év:øðõ¨Ç7WH] ‹(äÖÜ"§±¦ƒåŹ€ª÷%éò,é(©•«ZPÂi–òöõ9«„ÉçaŸþ¾VTA÷Ò-ÉÜ÷/x™/Ïÿ“{¨Èµ™¿†ï8 õ­ª¤uO‡™ôa&°ê™¤³iWˆß¿è²]üYÇžßµ ”hc<ºË"nð|ågßëšîãQäý–ñ>ej¨¶Ü]Ð4†BûàW…zÄ0«HÖÌýTCf öc:¦Z7«$Aì[Úߢl,ŠíÁ*G8'Nnzì'ö”r” Z¦³Ãâ7ûWðåÞêcZ™ Èb8S´$ $7)EfXòàãºhËw™:m:ëfïyii«rI”ŠÓæ @4nzõ¥Æe•üW% 'nÇ"+Aº¢¹…ØXÇ Ì\ÛWÜ1Ó‘k¿‰Ty¯$U7?ý³o/²5ÈhP²[Ø  'Π¬€MjàCþ8²ÙálW°fscuÕ%„ìDž{*´R@é(MÊé³sëA³u¥]´yHY«Ùôݱ¦`B¡Ë%o5Â/hV¦é¶îåîî˘,˜…'qš\¹£Ìð›ÙͯpßqÃ=e¤%ýÝôÆÇ8qdÙ½D$eTRY%ÅUÊÉ‚ŽÿI‹”„Ì •@d¦|b."˜àS–¶Ž_X诞Ø|xý×c)4ÄÛ¼=»ä›;´³ôOì§/0EPCjOsDoIÏâ´­…MtÿÃþ”®‚âJ¸c;ƒYUÕïE¿Ö­xß Ÿõ_ÆaæPø”¶µ8Á›W:hÐñ0Õ›ÊÁ _iÏ~%ëÉÛÛöÆ!–{\—y‹1O‰v¿!dó¨Ñ¾7eÁîÑûOcI6rüufU'G³[èAVh[ùõŠà½­8žÐø‚zÕ©Zy0‘>’F«Àø©Ðt‡HmO¼Kó­vpR‚ÉÊ™NCµ6ÿãÕS[›Ã›š.]Ò:¶ïø¬Î˜ÿyÌW†Ùí'ÛKó ¦Çæ@Í/,Â0Ó5Á({Y‘2Vc€t&‘hs++9c¢ uô‰”üNÓ »«94ü&1¾6vjs_aƒO¤Üo#¤$½_òº¢$+ð‚ÑH\—oúÛ›2©müù˜#W鬚⠆èË•ßøÕ4_©#6¨ˆ0±ûhÐ8æ]ôÙw4š1)=0>®kIo1~l£þYî&}òÇÉ꾘bdJ^Ê[øa%3D´lÚh›e¿0é)o*…HK«BªÖß!1¼,”+ê/(æW ˆ¡i†}lŠŠ¯*å–¦U(­º÷ Uƒ 5c­¬¥{у0Ö4J^–4ýp`°’a:–kx!ŠÐGÿÁþæÖBPo$tî*}w¯çt‚ "·š”]W}–kPÔÁõ`ö«Jؾéø¸bF»6Ó>œö½‰Âºb`Ji—¹}~!B+¤ûEwþmË0csf¤@@Gëù¶QÒáeqpD|yĶñ 9ÿdÖÈ9 ™j5õžÌ#Î'P´Ñ.Ý8c:R»_DåEhõgs`~<*ßWøïiÝ«>ÛqKœï<ˆt÷¦N$Á]È4Ë=çóÖ즎pºsnÂtÝLÖT¥jâ—Wª6Ú†æñ[ŒoX,F`õ§f¸17!á^ù.àI'’U+ð{7rˆÉßBxYÂðw#¹_êÿÞ¬ô)-Ö|¡Iaz ÷ºLPÐúééËXǩĶ X«»v }- .™›ª>ï‹)†"B!ƒ°„n“ÄS‡ ^ÞÇ>-i¬úØ<Ôë”`:=~è €†x¬ñ#¿žõ>¹áÝxt羃Ê/…æýaîÛ¾· i§ú•ZÆ)/©@kz)ËŒ†CR¸¥½»ÿû‡ë@W.þ#w‡xNZË,}3üB[ ê‰°ÚâZºT,"RŠÞ.zÿþX°R¢âu›3hãK8UÏq‘Ãøéü׃”úÔ—Î#WJ„¸´RUÐcØT;8§ëˆ£YãȽr_ÂäªçDÎØgPÉ9]ÒìڒF‚ÛŸŽ_­WûÃqÚ…Cz À-ñå“‘•©P©P²Z#"sÉšh9Úš:¬YÅ4'ªë»ÞjO0kþÞ¤9øÉ­éêh¬|ýØñ×6áòüöèÏYmœÂ¸zrÁ ´ùfFÇ K"d*R•‹¨ŒÕbcêrÆ–,ÛwìQ@.Û `Ý$¥ u;ïT¹>÷ÞYú2èN¾kõ¿lz‰¦E`M Ê­ /Õ‚žÅ `”QÂ5° =Þ pùç©cÌSíÁv[tFNi¹jriÛ:° )å«G;Lu›œí æÚÇ2( ?|\ÖunË-‘òVøù³A[Q™û7zÆTg…!‹Èãø&aâgjbm”°,qÛ"'ìšA¯Ïdù”}!OÝö0ÙáÜÇ~úãè+"C~ÙùëèF†/Ñ4Ö-²UKŽOÀÞ!¸ŠÚ]YÅ› <ëF~zÝtB¯ÁS‰CîoÖ)òÁBþ™kúD”8%Ys î÷€ï‘Å¥ÙÎÅcº?Sl-ÀºL ˆéZ`¨-¬NM…@ñÃy÷–=c>pÿÃì«$§«°ÀèîöfN°jµïüãÕ÷„ÛH€Фõ'"µ¸YVÇm‰Fw‡ZÈ÷iÓ©>%>ºå‰®-¦Ê²b)›Ë9"ù÷î1#v± ¥/UØÈÁ÷lÛã§ðojmÒDAD‘2rƒYö+-+PcÍÝm©J27­Ë›Y]kJƒãØßõ²ë¹WÝ`B3%{«o£u8pPMòaÁ œ(kž—6N§81C! ŸOƒêHoÓTîáó¼2£Sñ.—à–¦Uq ùb/¬+¦'i•n·‰q:TXØ`cÇŸàP÷[øD—’–Ùg6Æê€¬£S\WÛDž¼Ú‡(Qö¹ÂIÉÊ/«IœM™×_ À™ŒÏñA„D¶Ou1õøœBÞ®N§ ‘Cô û93”¾ Ó/LŽ'ôüt°cyaWÞ@ú[a\A8r;²ÒâTlôË]ïŒ÷·Û[?*ÁÊu»Ä>SÓ­óËí{Vޝ‘è/s9ìáò;Ñ @N&iûîºÂ¹Q ŒçJÐ7þ=—¹ž`tJ+ýÕ{9£ê,(ÏŽ%à(/‹Ê! ®·¨ÛJïEMž?P‰ÆêÚ†„µÊ£ñ \ÀïFÒž£„ýEMŠK#LL¾rü,ÊÙ94Q{~îu¿ÔQ‰ÈËUb>EnˆðªŠU;‰ (‡:wé>é«  c\i¿¦d “¡…ÔqWD’-UÌ1Ü=Ú-o™{r­š¡½L„²“W¡ªÚ°~ÏÜàv¹ëÉÁìóR®6RVëV›í¹Õ\© Ï­­’È>KÜPÁY}l©~+K]­¸zó£¶§M}Ò €\„Ž8)ß²ŠxêµõšŽB^Šï1 át­¤Ú‚Çò¨¼XFNIÉŒW_Lø©{¨Š]ÇS{ óx‣«$Fü¥½ßGVdB*Xµâ´½ »Hö)µ•”÷à€èÙ|+t0& °âTÛ¬wÏådŸü¥ø I hÀ<Ÿ- ÊgI("»wŠ´œ:AiuØîÓŒ±ÈŸ»qyGÙ¥¼B!¯b¯FÖÏh‚ tP4ùQ¨¿äÎ&DîÒá—ªÈ¶š ¥ }ì”Åv“×;6÷’¾ºàvüsÝXñæXóxvÕÍÊâ÷Š6l³ˆ*¤ªÜS®£ ™œŒ¾«'{A ¡³k§Þ ´øûí.ƒ7´øÉã˜@ 5mpò lHLÔS´3t¯Tæóà1RÛ¯Óc(ú-3 ›éGƒÛX+ÌнtoóA ò38$ƒù†Ë)¥c ›ã˜kQ&ÈÉèyõ3þ..NK.ô/Âá%XèݦÝn¾h§dRI£ÛJM¢ç÷«À%àSB³@¾U_s<ØWbO°hd)‡ú\^yuÌ´‚êLjýnP:³ÃÝ„´ºjˆ¹²¨éÍ¿Dí#íxY“V ã ­/­‰kågmµ6>bdý­Sw¤ðÉ0Bbõ¡ÌLœ"à í®u—¹²jéÐgòè]ÛëµU£DyèÐOƒ^¯úõù1·Žm³‰Ï»°g´èu$ ¬{ð3ŒXqq´1Âf¨c2’ü!ýLco³1ƒáÊÄlbôx’Ï{¶Ë¯›z‘=³Þ#Ip•æ.Ä"Ž…kHÕ—¦®Y÷íi'&zYa²–ϳ!2r@ {6Àɳ<Moør¢.T6ãqÏ…=0ºº)yò—ØmngàY¢01õ,æÖ]&î±|½‚ჼwÍø´’G;le-ÏÝœM¸›ä¼ä¬ê0ó^2ìE=PiRâ¢Ô/JKŒ™.˜{ëöC~IwÈ’¦ÌŸBªÔñã·[KP3™úÎùÄì•6- ª¾¶¢É…3áÓ‘o–kŽJ¤PóÈ—àøhÖ ¤·¤/6ŸR ?‡¸š “uîw‡0IÛœé%£§¶Ž© ´5ÑË]®¨ëìíÑ¿K%by ºî6ü+ÜOjMà¬J#=ºæUc†ŠíÅX¸ï ¶YûNZlR*,=¬œ%l<û¤ׂ[’™ÕÀN G™¡®6Pƒ@túA¹š¶iˆÂ 2o«2 €=v/%R£ÓÈ…8]Ľ™lÕGSø…êçi/ 3H“??¢êñ7y¯VxÅl6@ªBL(—Qöpqòó€5ñª;̨իÊlÌ]}'(΀?Á²ÓçÉH–.Ó'žù[öÞõȶX„*.éºGñ“x’:‹1úºo‚®4Ž©Àˆ½ÙL=ƒégx½ñØèZGƒvɼ­\{w¤7ú1¦‰yÜñy¿Æ3óCµ GÃbh¥,`ºSsÓ ¼í5ÇžF{úáMqm@jƒX9«`®ºQ JÒOq–Ý,pú[Bß·»6¡‚_ˆ‡%Y›:ð(©a÷²º*E~t ]&AÌBÇ­RÝ µ£ì9ß;L³t_7ÄíݰL!©€ÏgͤQ¯ø²qÑçžÁÁû»ZB°«µª*¥~k ¼xó¶‚GØï!=uZm íÂwÛ½o®5ª:÷6‹†îczW†WÔ§ÏÿÅØ‚ÒY;ûE¦±ÕB+¿3ІRÊYÉÒZÓÃÙtãÍ·úýÒû{ä~F¾!rÕVhã9|I$…Wþ\Å}{±ÇI)k-gùü™b„£u»’Wˆ™Kþ`0 F©‘˜@g¯‹Êrv¦®’ç—Mž'Ž2ÉwJðFèû„‚*jyÈÒ—7ÓÝ6:dÂ0 bóðž¹D≴–×µU`HÅúåbŽBsn‚AÌ3Èè³Ú£¸Å~ÓL£ƒýb-PKnÀ’Dv§à0^´¬„[ÉéAâ½øÀBD~~L!:ð#jT„⣒hñëI™GªÃ“³P1ZV€,ªÎ·ï[È‘: [âbTIÅzP™]·dyZ .¯JH{Æ«ÚÂWVÁÔ:U 'x­°&Ut¹›_ÑXé£Ôׄð,ÈCÞÕ‰¶C 9´{ç»w. úà”çó•GR*Ò‘>£-׉æ ½)_s2v*côösÀ©ÑDÐ46¦ñ»t£‹?ª º`ÈçȳÂ6µ=npüUù^qus‡[G+¬¼5çFæëWI#È< Ü}§ÿµE‚‚%ÛÑû¹Q3B7ß NÚÅBm·Ã„{»4L/1¬ûAàm=\Øòó–Ë­‘èÃS>œM´Õ&ò‚í4= ©Äâߪ?ùè¡&µ¯¢ º”ȪKùNÌ›K߉dGcH .¡4­¿Š<ŸÔè}ke#Ö:^¿JíiaÉpÒârÈSPþš´««ÊH2N—繇q²Éía_ðN¬ËL£[&Σ•h?»˜_Ÿ-Eª3¸â­}‹õã\¥`—u|ÃŒ(º¢ÈÅ m%µWzÚÔPHOµŸ… Ép•PóÒf˜“Câi5ðž´MÜû »mÞïH¨c†_®c¬J.àÏ(Ÿ>ÇY&žê¸÷:ÏGÙ¥[I…<ëò¨ÚÀŸ¥Ú}ØqÙà¢}i¬} eèm¨ ­Ue¼;m$È2$õ¬«qlXq²• ô^ȸjAþÕ—p;Á5í¤ê+heý‹4¤´½ªØ1ÛwGêëuËÅüÆ(,Së˧¤•×·)`v”Jå®@ýÓÑÉŽ)L ªzfÀ°ÞwPÆú“P)­½¥ªR|íÔñzÍœCþ ¬¿õZ¬ØÚ5ú:©{Úr1{ÛPk¯^…þ_6,Í8ã¶·À×J;z¾Œ»©çïËEÜ Äe(4"CUÜ̧7o^;[<éìaÄðþ=BN| $ëæ ãûy%D2Œ‚¹¶šôùé¬ý0¢Ì; E.P©PÙǯRX=ÊrÏ›µø¾ ò—@š nT…V²®GØ!j¤i~EÛÇCKžþ¯fX£ÝÕ«ÿΈ5¢P˜WMªG™ÛŽôáó9Žò ’S @ÿºb\FÁ EAè…KJhœÕ-u¦Az_B·Ð£YþŒcs uŒ{̉¦z!°PÔeWÖW’×ßLÁq×QD Æˆn•†¾x¤~ Œ-æ¦ýLÞšŸ’òûoòaFmî1ÇœWŠ«pÙ‚°°à®óäA+ Dzv&Šp;õ—›3?I-4iRjtÐŒzi±¯×~±pØDTxÓäNnPDŒñ?x_ _t•}1M±Æƒ''¾ K?¦«½à¬!~ÃÌõvÏR6>Çàr&Щ›Áaœ„iÆùHQ3ŠkTÒE¬Öøàô*ÊÒe“Ñ*³°)pÎÙf[þß´Ëß#õDÑý…9²ðèpfãe­Bò´›†_ƒ€®åÉÙðéÀ|+$”øÉî¾§Ȱ‘–÷iͽ7\@|ëàÑr,ã—Ç"¼F_Âó£)·Û›ÈŽÝ"?-Õèv“´Ȥaž°DœYÌœâñ¯Þ¯Ìט¸kkÚÚ*£Ò6·Ò‚ú­P&¦ÝBºÓ\+Oñ_ÒÕ8±½¡V‘Š=þ½e¼ h‘qö74yN·[–årB‘²"`"]¥.óõÚW¥hŸ‹`ëoÁ7‡K>=ÃH@º8вbÙsaªýRµW+ -Ôøü­á&Ò^/ãC}á}Ú1OÓ#dnBézL.uM}ƒ".PöFv¼ ÏádyOi(&ÉÙ ‹ikNŸ†ø}íXÎ 3};ÍÛ ÿpeâ§ÏàCšc—Ë=Šyáq—ãÀ»ý$j|«¡<úÚ²¾¾»H?¢çZDZ–®æÛQ¨À÷©“–ôÁÚ ÀÁLl×({ß8%g.îJŠ´"¾¦æÝÊë(ŒnÑaë˜ñY>Uy|.µ'D‰>S¨ýµ§ò<ÏÂÍšRðQˆ lTŒ¸pt‰4mïðCµÙ.?îUþûo|I*±ü¨ IrÇí`x’ò´¥§d¡l˜_[šôªŠÔ:ŸGt¿‘8ƒ ˜ˆ­ˆyWgç?öØÕ`<µ÷<ÅÔ“=j`|ßᄱ‚îÂŒ¸P’Ë~  ,[Š5Ø_ZË›;?öêU—Ʊx˜O/v+FÜÁ’„idë ׆•ªmþðnœ-Í+±n¨ÑMêÅø¹l@õs÷9žoÑÔi4…s­^TÑ §zƾð¥Pè¥o¸¢FZëHC5@ÒÒbVì¹¹aÆW÷ïn(Ýú$ q« J¸„ßRàEç8%DÒ/yã÷¹ —à.÷RG,oæøEÒ̶‚à-€½øP$)U˜¸LEµY]Ì 8Xî~aL%ýŽš¶ü¨wª¬[ Ÿ< ˆ5©Î­Jõ¨k¤yõÑÖÇ™ÚÝ*åí-Lõ¼F?Ï Jk |nÐJ„¨Œ›»~4yÏ~#g4Dpy«(àÝÈÅ.¥É!ˆè™s"·_¨ÖµD‰{tbãÁvbú§KÓä43#ÿ²¸{ˆfc1)‚6lüQ›¼òãCÄÄ=Ôú9> Ÿ)ðĶU‘©•!ÿžÅì ,‹:)^¹ÍŸµh'†ý×òØW \áD§)ˆx´0ˆhü‡2áz˜phçkpþô22í@ÍE3cGÂ2¢@Ûg±óîê§Xé[šñ¨~æ+ëK[‚u‚¥¦'£ßÿùó´AÛmâLN~DÞ%š}¶>^sHâÜvÎ?ö—ô"pAzóí&|¾sypÚ{jÐâk™þA­=Y]C ®â NdßEÅ Þ{ÜÞoÜ=ðá(¦ ø‘{?~ èeÓŸ(õÐ {|ü)TpF3°ÂÉͤÃÌ™eÉ!Š›ìƒWÔ%°ÔH1ˆˆFA¸…­•+)Ò È ¥ÆÖ”} Ž*Êüv·ãd‡Nö:LZdÕÕ=¬—|ØïqÖHÐÓÊ—KCêV©øweaÏÙ^ˆ[Çe ­éü”íQ[âU]/{À8FJD8±øÁd¹âø×¾SYX‡ä]ãŸD d8ï}ö­ÉÜä‰cmÃ5õY.Umsü=‰¡N½‘ªqBåDvŽÇŸ0‡H(Ñ^x§*~dšmX¹r&ßNkÎܤڰÀe]‰³f“(Ǹ“7Lÿ…©‡žÃz]*ô¼ZmwæfšH‚È¢Ÿ¶4sSŒx¹=aä(ÿò¾Ý€xÃÀCiú©«È…+Z˜ÇGÎþl@]­{êl™ƒ4âj%mU¹˜~aâ|RïùìYÝü½X±…Išaˆð‰–8.‘M¸žîXÒµYà„½vâ¯þöÎw4à 6ƒm° ‡‚K•w'æ—º‰ip2Ù§‰.Ã5‰Úðj'’UÙ´aêû%¬¥æ»T*üª ¶—]¨Nˆ/]'¾Qq®°þŠe œŽ÷e›ÚGFÒ7üúœî5æÜÐðç—‡–‡böÉqž½fÔS®¾(©u ÖHü§ûHJÞɦ7º»õ‹©Úʘ²æ×IzäѰ\fÒéßÓ‰ŒVÚK&o,¬Gñ…ˆ””akÖ2 ÎÚH&…] Zиp«¶&.C¬ätD²”*hÜÏ9ËܕѭF”&OFµ¸¦+†w™å÷DHÁsE@àPøyñDºXêüƒ§cñÁŠªq6ž?5²7îiÄ·ÂÁ¹›€j™¢;†å7¾V€Öœh¯ ‚µ¥j£©3QŠEÀ¦#-&Æ ?fl0k…°q¢÷tQœœd,ãŒw_BÆa†¡=ÓJ5 @”to¢†tK&šüÙîÑA%¡}\Õyî!ͦECÿ2±¢Z×»OѬµYÃIü9ªs~ÃAÙ”–Å„|°¨Ûv×TMï‚Ë8×*ÖÖÏØßÍ¿›11MÇ|ô5³ù³ÈŠø9B¥°ëA…!o¯*ØnÃ0Ö]< ]j€ù$G ‡¥W="@î¨xæá7Ï%½õ¸Û¹0 {;cá ‘o—ƒ\kLºòɪ c9óJš¥QAîþ. „çH³ (FdLÑcñW$0±–˜O„Áß(~S¸®Â,ç¶a–fGÙ;±>ú¾Œ·j*²a1r-_i׿àÓ¬žÖ:dÃÉ”Þüþ´æF|o ª“ƒ9µ/¹·²¡ò†Âìó½±úé›K\ËßTfq*1ˆš®|¨8Ͷã>5÷“,œÚ[ìéÈÞWŸûK#*tAÊLþãâ¹"9ö‡GhÃñõ<Ý^/„tîœ#ê~°mÛ«‡RE›íí9nÊ&ô˜pëîd0#ãÄ)Ž•g‰C=¦>3;nƒ¬§ß{=L û€ ' É¥§†‹ðo;¬q~Ù¡p{NõŸ  = Œ¬›óîq}ÜN/—áò¨TWç½Õ|àywÉÔf`1zÒF`g¢@6ŸG`Ԋ׶×"t¾]ÑQ4«z·˜oç\Ôä‚8 -ýqÔ%‰ª^EõÆVÕá½V¢s®ÛnâFS‚°©¼¶”ù³õà¡ÝoÈXÓüx`š"±â³ªš¶c¦›G»J’ª…L¢íÜåå“wǧ®é7¦ŸÊû;_$Ÿy†oÿ'“"lÝmŒ¾lVawЕËλ >Ê*®^)#ú!—ï¬H c_Jü5&s*B@߬@˜øYÉß„³×‚¿¾OÁ¼ek°©й%¸îÓºMìí¯,Œº^A5éˆt›xmsb]Ëýÿ%XØJ²XÖ‘äuiîÔVyº:ÿ%è0–fþõ 2û/P·'ø§ÿé/Î H\¯'œèoÉ%¸Ž>Q°³à¯€C¥HYdÞwßÂ@eã°L/H.Hô'­lÝJ±wˆsw ¡¦©B–´'kµ*5tñ+Ôñ0´^ù+a¬-;Þ„þïAœ‚Ò^õ—ÜzÆ—$Wºm혃ƒ"c…8ë¨ì-1‡‡[´Ã·™Z¬½T_< .Aë})óÄNƒ5ÁÓÀ¡!Gî£:#‚ýÓQȤx*ôàœvбM¦”méqªý!˜ø¼u‘p„~>;§Üâæçü6C"¡ü½±DŒŽ ëÛj(4…iVIöЉJ{ú‘k‹1´|¼¯Q r‹lÕ9Ý¿àDCG{·Z ‰ÄdrÃÿ­ë1ÝÓ(6â™7ÚæG9ÍœÏä…A÷!@@ÔÚ^×­X 01_ç?ÛÇî˜Æê$ –' vôJÖ>Ê"o(—žÔ³z|}þmE”ñZäþT)zú®9‘ÜxX Àô?‹§ì³)R¹-íÕ(¥ëʈtOÙVKÂnxífž¦RVÝ(ä‚O4ùÔnZÇRº#,ïàêYÉBëý¬U܈@‚£_ÑsÕ† ³—ôU˜6e¯»âè `Bs—¼6ÉxùãY¥}FjŽŒsYhÏO“@&$G[…õš¯SQu†”ÑkÜxücŒjFü.)ÀnÉMrÞ*%êf[ðôêà40€da ’A7çŸ(·=HtB!ó„‹EЍkïúñ.ÌYÓê4ïå‚×>Ä &ÿINZ#ý£tYèD´ ÁŠ΄ÞXz³\'Û=JÌýa#y6ó¹¶ÔS¥^V‹üþ”óõ:]ͯÔû¥Âœ_Lö¨™Îàmã†U)¹Â=c«U[<ÁWÜûøý"ŠT‰E:‘ãG¨¢>ÆÞ×IíHK¾©üذ[xHCV†ÜIÔ›"5e¼º·ÑÐUÏ©,­tuE´œò/WTG²«ñôœ$MrÖýtò‚ÌÔ3›¢·e¹Ï‚L(çïh!\gQi½"7vÇâŠhHZp¼*ceÞú1;ÏB©!ÍD5›—]™á-€µUá)nJ¶,þƒ“IXÒœ¸åÔÍò(ÉBEZc—Ïl¦E‰ì±iÓÄÎÄν+°çrÈä¼ç0sbðtP PL]è].ÈDg|.E™íÚcµÈéÈpŒÄ__<^ÈG™¼\b¨7½0¾”$gé(áû´âR¤l˜Ä¥ÆAú¾á/Ðgט¦~½Rˈx èÆÂ½’ÆFe¡ÜÈ"ù:ž*åT¯<»Žã}D{>¥çÚ£…y@yö,clÎlîœ~CÏÎ&ŽmÎÊSxÒ-ædGê ìô]]r‚‚ó ˜•[”8‰ú}§š|CrK'â¶4lG{îj]æÈ&e>à6ÝD£ÎN)8)oâ—$Qèió1Ø…eèÁL¨ÎË—ŒÈã]Læk=²¹ó”ûèÒêþéüí·è´ü‚BIœìƒ%p™Fmæ^=5?ŒÔó‘ ó$ÕÜXõö‡€yMzÈ-Ü k‚¢‘7&Hè‚-Mz*võ­T 8U¡Â-àzͧërêºÐa1¨\†ATŸužÖôzåŠé;w˜¬îOîœX¶|µd%. Ìæ¼l­JqT $uAÞéÁ°Ü4#U·ñ‘ClØâ!„³%|£ZqK¡¸~_è÷a]ª¤ƒâêßc/1ÒŒ\ÄÄÈ1HIÒODg8È[ƒ[…ðÊñþÎŽn“Ùâ¸K‡°Çô&ÙŒÆA%Ê{‰Ì=sã`õ•±·vIƒÉ·k¢ ÆÐ¾ç ª´“® \ºä\ª-£´ûçœa ¹^Vê##âÇЛC€g—[”úVAÊÂüóá0]ZçQ¢ÂïR j¤K)Å^Še–ué7èõ‰XÌ|6ªUìÇl¬QD>{ëÀeýH^j*áX@ –šx%lÚ“÷ î‰ÌXއÇÓtôwV´ãq&,ÿÔýÊŠù7I9V,œw eEóìrúg_ØÉ ä¤Ç4G¸ê»’L"SSÝ<…!Ù‡Ù$½r¦ÍÞü¿ì äF)PžÙ˜ɹö`&¿Ó8›º7j•‡§mèˆñ2ü©‰€ÿ»»~ðìÝž&fú•ð“p0Á±¥n®Š^/²Ö;ˆM £&9éñžH˜êµªéoùªþ¨º{îê;¹Ê“ÜdªO`X§^Ì`79ºéÑÎÎÊŽ‹Bg+È saú©ù¯ã#/šµqìx»J*1³8ï0éõ²ã7´KÇÉ(PÒ$‰íØbÇiD¯ Ó¬;•* Í«>ô²3…ßÂ0íË#AD¿CÞ|q’ÛZt@Ögü ó̼ÁR¡z3ã›]ªÏYƒ×Ì6¥šìaþ z¤ƒ2E õ…ôí¦ûx_øYËoDå>Þ~<ÓMkTûBBø¡í½ÞíœÈ^q/XoΩ} ²¨ˆŒl#EÛ50´ãÞûŒcj6/™?»³IgC{aÕŽQ3³Q˜¾'žk Fº/8cžO‡ÁÉg5rJ “¾Î6gõ(4ó¸]F1™ðÖ~òÀ¹ázlTm‡ã —yò!›¾¦¡¶–}¾·aÀ›Ê™ñDsÁ<™¼ƒwÍ ž«ºÍd_ã!:Á"¡§qÎÇ·ÍØPmôóÅÇMWŽÝ2íüÌ-îÃŒMû€:¶…pÕ9Ãþ)! aßw,L ‰5ôovÚ4!ÒT•ݾ‘ÄŽ^ÃW2ÏÖÝ_þo?ÔnoàyÝù(¶Ÿk is¬ÐòFéÛZÎ)ÍA0’åÞ¿l¨±ð EÆ™Óé—+ÏÇt+i༭—+x€ÒÍÞiœXs)”¾é)ÙÑÑéЯ}kü é_ºöÑÙ-}ß$Þ„˜Ž·~¡aßF¿¢‡€ª3"„ ?K?ÿ¬·1Q]·»—ÔjÉb¿éømÜ1cýºyØs¨þ2‰Òÿꕜ†,—˜24K[e¨OV؃o·öNºÅßEËÔä§Ú¸n3ä´ãJÊ?ͼµZ·ŠîänKøº>ÃUž²—ÕtéÅÔ£Û×^Ö‰f>й[Œ6öj81++¿™\ݯ~§g¶ðD4å×Ešž± Š^!Löƒð7IQ¨¤g”Þ6z»o[TÑŸ‡i÷©"Ï`raذL²VêYºcÒ•ʨ?h|3¶nTu6~j€ó£ ·*`x_W›¹÷¾VlޤF€YÅÔs$à4Âxö܈ÛRDèXƒ]çsÓ›ýï܈a¾wsÍJ`º„–ÆÈ%>`ænH«Ç*6гFcjx>_(dîÝ^Ó"XÛ•taµRƒFŒ­ïØòýÚÇצ´5J+] 4•d&Êá!‹Ã\vúñüØeøù˜8èðdrÓG04µ…»ÏÊQQ…3\J˜<Èã_uƒ@¡œÂ> ¯ zÔ¼l§yñB)³í—üÌfÚ[Û_ þ-áªþA§5ê`Œ´Â6vÄ=‡ê%yƒ]ƒt ÀúxGYc‡^E³C›%ç×—ñF·‡W„mœ&Þ.¹c;yœQaöO”‹¥‹tqW\'ášâÎ.¥«Ø´ó¥˜öŒãÉ5t‹hx •¤»Ý½ˆß7=iµæz nšýó^ƒÅm¾ù®c¹äÅ:¿| Ô’ fl=©ÕB¸‡}¬R² ܺ†((ÿ~pôxÊÈùÚ_gfú:ü“^óä_ˆÃ´“{hgwõÁ§\+÷òYÀ6XÂF©_a"R ¬HÚß´C ú¹cœK7– I«s° ·¦C= X÷\4{*Ë·¿‰ÛÛN&wO\÷ÏØ\Ü^VkÙ¡çY{Ā쫴,œ¾˜0¡2 ¬Gwh¡Ä}¿(½¹š¼ XWHöÇ»hz,€¾È&ÿÖP²´‚;"0^½ŽŠ6Ð ‹Ûoö½„q-bv„†ù.ÃÄ8#©FÃõׯÔ&ÈÁÉ[ë¹7]üZ¨{|²CG€ÚƒcUI1mugb-X誠k­Ð|ã=¾éš|净œý`DZ_ÏÎ9t·vôåàekàŽ_PF4¢î?Ôúe_oŽëó‹1ÔȾ>OUßf›c˜¶¶F-©2fáÀ ¡{}§ SËjIþxÀlU¹[Xþ~l°bòr~]3mÌH‹½8ËU%ˆðÂõÒ<Ó#¸5á+©:o…ü&}º+QŒŸtÎÂ+["xc)n2*ÒoËÉ{BØÿg"ó¬ŒÔ *«{kŽìå?8vHîćžù üœ'™€a\ Ò÷a@ËÝPöÐCB’Ä<žSĪ×V.y‡ƒ+‹Ãd·LÌÈòêgŒ«ês°<öË`60Új!ö—™C„%f™«ísœébõõSôu xõ5 Í]ž–PÍ熡–Gb¬lÇ®iú‘åÝ‚Íz¼× &ÒV¶ÒÒ½¨²RÀÉL€¿Ïåþá¿+£¯pôæV‹4kæäµ&ï®HC;ª·*Dþ„F5f¿pz–E»»Á¤Ž$%7²­ VµsžWd˜—YqpÅ#N·MS®È©‡½É“*ÌGŒê‹Z’vg°„âáuKœä?vƨ5@;ÑCÓßÌê~ÜÜ’»¯¶Ø/}1ǾEÄÄ=u&E0ÃCPù»§ÌVµŠ¼çK½1t]•Þ «s»gAŠÃ3ó§Ø89»´À³ëK½-ÕüçXÇeúbrîU—Lq3ÏEìÉDò)úyÅ%íº¼“‹ª¸³—WíªâM3F§á×LOÁMoÙ`'ÉNÛƒ™®dQßù÷  öЫžÍ%=cbÊàšQ~þ~zge·Ç~ÜÕÂÊm­˜=rÄÎ1¹Gºï„6i2›DÁT&@œM/.ÀK?5µcЉRŸ÷&à4T&0×+Ò¼¸/£UIdÎ ¼bNq)cPFY"±©G‘‹,ýÂMÇ“;­ºŒ* ©aó"~ÕÛ™FέË5¸¦Èôk°0@è´Æ™ÁU(àˆI„û½ÛbfrJT¾+{µ.À±Í\=˜¸VÝQEE@üÃi‹áyj ?CÏ‹óafÑ>鄸å¢Õâ¸Æ’ Œ$Ç` duŒ7ßí‰Ê÷Ïø­èy%jÖ›©|·Â/Þk×XDt·? 2ÁœôÞ¤ÿNÝ™|F+á3W§C… ³+­¨÷‚7þ¼`Ôá‰È¶^/àZS޹SAÝýT2Œx ÷D?cÞI=Å+Å´;†"üP´~Z¦Û?ˆšC…‡ÞòÚI ‹c`•ñ÷²2¨×ªÀƒÚ”oIoã,AÝÇs£ã#VYIƒðâÏš™ª\-9؈‚¯¡Š¬ßèÔèØÅMvÔ”¸XÉ\ã=è¶X”IŒ ­à›·µ!•Ö±J?pÎ!¤× TvìÅ r„Ía ”õðþh–ª·±Hȳ«Þ7Æ¿`)èÝÿe¨¶Ì4ù×8Ýù ¼¿¶žüZ)öVh¡6ó,û®OX̲÷JêÑX>RÓâ/^Ú5Kš‡Çq®Î-ð†qT‰u€2$\*ût½n†}ãÞ^-O³07ú-¼ÏK™®Ss ]fÙ_4‰áù›\þðÀÐwÂb5˜~h¬ÀnX®¥òxG#ÌX—»‰VD%ŸJ—`ö[ ÒdaûÊL li<¢õcÜZ‰Ç¼¨âûÜå^´½hñBÄcÕþrñ%oG¸–‡ŠõÚóÐìœM-N+f‚°çÓÁd±w]w%àц†EË-â`?ÏZÝ4«UIU=Œ=¬FÜ(í^(Ϧô^&-@`‚õ¨—#ÉÕ»z–PÎ ²œËÞ0}er_Ô.€ÕWô8sE`µÄ¨_Ì‹qQ·AõÍW# WT>n#­ª³+Ï c=Ñ3²Õ˜n  ªd‹Š>5Œë®Ý<\åv’^ü©(kç¥óãÝFÈèµÏr(‹p>ÄÂ*–ˆ„Ñ·w”³¯ âH •ÞùDu­×EǨ›aüÖ531¤ ËC¶;·Ä½˜Ã«ód»ÿÕIA¯(·Œ+Õ Ë¨•إƼÏEbû®Ñ?OÔã'] ô¸lwOÓ²‹)~ã$Ø€Åum=®ÿ@ÌhVˆ4*¯)“³øxúWûpŸ è³óh9a!@‘¿ƒŽœT°FkcåfY—¯ù½Îûcn§<×Yë­*Hë¤Ô«¼{Dµ¥êRéÄúm_*+H#ý§uDÑVËsÃxnÛÀåÌ9¦æÀ½*1–b~Ú¾Ú;t ÇzþÀŒÏáÊëÀÀ>Aîlœñ‚Hrü ‹:¤ã#DªÍ¥rÙ:H×m½¾ìÝçIzwÖ-«s vƒL4¸êUD“|DßÐhebkj’F‘¦$,1 Dè§Øe³€ïÈðÜ ½«û.¦¿Ó¤Hˆ]š ^÷`W‡cl{\8LcÒ×qÓ«é›8Òš–Æâ >²¿ˆÆ9¥ýÐÌ®¼[^+†$³ÖâÞxþž™)Q#•Ó-4ë+3ÑŒGOÏ¥°¼$6œxÄáLk4AÉèyÜié%c¨’Æ*ÔëÉ¥ë¢ ‰çݦ1„xá>Q|¾@$Eæ.M'Ùqh‡§ê ¯Þ ÄÂYÝh\â1Ät¬®†Y1¬‹ µ.ظ6mqt³§¶’"-¡.AðT°U¸íµ:À#Jk+töÕº¯zZfÍû³¸|ß‚}"¿µ§°÷ã‰>J‹Õ°C9ëÝh‰"Í)ˆ9-’õö W½¸ïÆí>:æ»utÕ9L¨Çñ¢Ô³MVóœv/0SÒñì¯wâçPc»ÁýBmý…«ìQŽHÞš"j¢‚Tç°/0ÈÃÚÞPý£vŸòÐö>0Ý6ÓÜÇlÓAùÿfT¡Yy0¼u<­ ›{ú¼wU¬í”îþ»âÅñïÂ)¿¦‹Ÿw»íÉ+¹4€tµ7X£ÑhváÄVH¤UfµÜ‹ç.õVœïäîS Q²,$µy}V|M±Xøaî+À çà–¿´³1u€¾'w¥š PaÆr¾ ²¹ã×;w,!Ê\ÄŠ æF¡Ì2ÿ!°f¹°–Uˆ<û²ü”~Õ,Â:E¦±]q¹q§$Æø„­õõÞ€y–Y ˆ 'µ/2 rG¡¬v6ûÆ¥£ëÃ"§œ;àâî^èÉ«ƒõœ« ò‰Vò)Àk }´àI(dƒÊ¾Ûæ@ítô¥ÞÝ̦6ê5»ìk5]X±Næÿ¹Ôz¹q¦´Œ0©Ÿ)ÊÒÞ:[oHüûÏÖ„Vƒ@è€á©Xl‘¤´µrŒõ¦Õ•1o>Ki3gš `ãX`)DÒç¬nò„Qg²ò08­””FŽˆ¸ ˜ôb¶Í¨ÊËNÝjmìÍzŠÎÌ‹Ý]}Ø™¡ô á.¿ |Õg1☠ʓt‰Á:«€wŽoÐÝd5¸ƒ8·=l^t«îê ÊßafØsúsC–Ì)‹?ï…-=ç£<þÊ÷›­"üÌï«õéÈù³SÐ$ÝV#&ËH6ÄÖ\&¡aòåÌþ3hº w¼Œ!fö~lÞÆEšLn`¹¶.>¬ÒÔæZ.ù#¨Àróˆ›NÓ@áS’aˆŸÍÈ}Øòeº`óí‚æR„5`5@–~ÂĦww'$F9¢í%nT87pÁ«ÀHÑQ’²|%j§.ßýqG‡ãªJÂé¶cTÁB¼«[®0Q èvc‡/kFÝŽU¤'ß!QÜ…Ãê©2}©\¸G´.ÑÞi3[;½% ~ψk•ï)§ü-"¬Nˆ#꤉#¤x2çaRÖzz(Ší%+ÅžŸÅè¢#R½oè¯&L‡L·èŠ¡EL•¹€Ð–,Kt¢™ k_Žß-{ »aNSm³Ò øÓv/¯˜:õEƒHåòºØz5UmUÜ—A[ôH= ] —Emxž æ MDEÿº`ONSi¼Z¦žö^ê®ÒÌ«Xñ¡œŒhq#òvÌøY˜Å¡pVLÈŽË5¾d{!ÈÞ 6¶^ãûéPeŠØÊwi劅\4˜Ý8òoSòdá†Þ¦Ýe³BÅÿÝÒÜS©¤ÙYËÂäše0š“3ÎKíŸ A½ˆY;CtÇU/`“Jâ§g›*—L°ô¸-2ñâN¸õm‡ßL¢-žÚ[¬ažs H†ð´œ[˜zZ¯šé'#¸qëï"•ŽMÓ ²»-d 7èh`W«—@Ør´f/—éàz0”2S›yë¥:º$Ã&QˆY¥µ^¬Y…\v£JÙÏœ©Øpç˜CÂm‡‚4˜ñwêþ„jÕ4+­Kăäú¯Ê9"[‚§Üh &ãÇF›ñm$|žÕW˜Ë¿Ae Ö~ý>Ÿ–—Ò´~i V*„´b™×l‰k{P¸*úåÕBŽR™%ä#Q3í±è« ’y¶ñ€÷=ÖÍäoˆ®P.ð· £üÓCEê-Ãi ‘QØ£,K­… g×éüõ$,âè‹ò²`”Ý©Je«à8®¾Ö¿ nÜ,Ix€VXšÏÐRjX=…X¢!sÊ)r_{(¾Gq¹³.8¨µRŒt¢Y!óôÄlr7“BÒ0kqÚY©°BϰC–ò@·Ÿ‰ÿYÉžXS¾/mßDöŠsEyG'ÿ’›Ci!d×bÒÌÁs^¯³]-Õcû—357µŸ7¢Õߟžº´sŠàôµï2Åö¥ëdÞåžd‡Yãÿß¹ÕM,zoë®)SåCÝ»"sÒ; }”ØÞ[¾Å â5´_Vsù:ñ»‡"ñ*Ã8y‹{ùS¼¹LY6úežE¿´=Qå‡ rŒ½å¹/¤ l±Sœq‡Àf­äÊæôÖÕå€%K„*‰¾"=§î¥7§È¹O^FÍÅÊÔÇéiDy÷Õ¶v ämjƵ…6- Á_‰š*«Ë’ Fâu‰9îã$\D…î­Ûñ%I²Z÷MÔniΆM^2Øòî#¯8iùf GY@¦-˜³ w¹ØÜÇã¶Â.¨‹üi\ B'×éVð|4µ0Œ_ž‰{¥¯ì|‹sÒàkô)öŽB‡¬=¥M{Q¿ã»wéD¥×öÉ:iXGsˆ{ï ŸP0E.‹oWRn½|ƒÊ Þd0äË¹Š²¨~ÀDÃþV­y¹¥U¢)Éé<Ë~¹ '@[™o©Z·Õ›ÓŒ-Á6N$í¦e]ñ9ŽÏ²¤Ã§.XCr@þ¢M í. Q™.p¦žP tÂI-Í7àU$ã#”‚ZíKéZ-)¿, Úvˆp–¾ŽÚ,ÁÅS¨ÂN>„yõ\¼‰1ÊTDEŸõMÛSðeEç©®ÖcnÒ¥K0OnQÍuÉFbìv ý¨Ô‘jšShøG#éæR¾ý­2‡a'Ÿ£z@ol±'Y6¥qIþŠÊØhN/SclZ)·=òç?3+c¤Êe™òêè#ž„âó–4$Al° óôŠ}^‰ÍÜÇ(°ö0í­õ9r‡j²,} $[î£æZä°-¦W y¨gàm.m‹Flr´Ö™X#H§x´‚l°8˜'9ÀCb‚¯ØÞ‰ àfÀŠIÙ\âùÅö½yhŽìX endstream endobj 250 0 obj << /Length1 721 /Length2 13325 /Length3 0 /Length 13898 /Filter /FlateDecode >> stream xÚmwcpnÝÖelÛy’œØ¶qbÛ¶mÛ¶mÛ6OlÛæIúýîí{»º«kWíš³Ö˜c{“‰ÙÙ:+{Ø›0Ò2Ò1p”Äe™ tÌ0¤¤ÂŽ&Îv¶"Î&\5c€’‰=€‘ ð„† lgïáhafî  0¢üW jm`lacáPµ³¶sµ02𸺺 ¸:¹Ð9ºðÑý3¤dbp67˜ZX›„åä5$d(~˪~›Øš8Xä] ­-ŒÒF&¶N&”S;G€õ¿€‘­±Åÿpr¢û[WG爙:ÚÙdD•Åäd•¢ÂôÊÂ[c€´ø?ã¶ÎN\ÿ MŒmþg;€ó#kƒÿF†ÿþÛutÿwDÃÈ0¶0rš˜YØÂÐÿn¶¦v¶—]ìÿÓú‡Ó?üÿhH 061ýíbm-k`c ¶³±wq6qÈØ›8Úíl lÿƒ2°±°öøÿâþ7BÂÙàmÍþQŽáß% '1 wcy ç¤65°þG¢ÕÕLþ}/2&Æ.6ÿž7ùGnÔØÎÖÚãùÏÿ:^]NAYNšú¿øW[ÔÖÈÎØÂÖ  äü–ŽÆÿ-ü«-o`ño÷ü‡ÌÜ`ü?¹Œ³£…;@‹îìÁð?Ï"ÿƒ²s÷¢eä`Ð231Yþyq²0ùü_t\Mlÿ%ø?»ü'ÿ—‘LLÜMŒ`ÖW쌸ƒ-ÓZC+|E‹æ+Á©çgõU¨WWgzoµ-†ÍõŽ®q”qòÝàðç y÷®v%Zˆ âLàN¦¦£‰ÂuVpÞJH*Í|k·? ÞÂuoÀT±mŒdÁn#î36Ö婦Y²r/j%Êx‘3Fë—w€#íį->Ùþ¦Ô!GÉÔü†39 ®Aš7)¼1äÛ_ ËÚƒ»%ÅÖ3/¬°? Óxd¥hçÜ]ê ½“x°étû´*ðRh‡ÇGs×Xâ> ñ©û¡:ºÉ>â›6²×è;Ðêw©I¼EZ‰¹²ZvÓNwJÄ 9þ¶ qOÕ˜ g{ø[!ÃANX8å¶ ®O)¥gêÜV ?>Q5Ý“€®O8ó9ãËóEà«f¨ü|§WEºEÊÓbpÅæœ(\»ì;‘µ‰©_?é2[ËòsohüÒ›hVÝ£‡®ÇHìDž¸oOüÀM(öý ‘z<س÷;ºUÀÚ1Fm˜®(yXkcÝ$•ˆÚƒ¯‡÷&Ëb{Ap±WMsúxrÅš!©æ’D ¦²¹ÍåÂ}îh ù¦&®÷µÌ²ïæá{Îùö³ÒÈ'”Ð¥Í`xEï÷gVäZ¨k¢i»&åy‹!µÙÛ©V:5ó{$j÷Ò¼<Þ%„Ò"NÚŽ’Ӟ׊2È"I•È2Ñ;—Ú¾7ãq$gGv€äÎj¢H雌 ý¯Û %îß™ neÿÎjá*ì;B¾snatåÕtƆ©ŽDÖ‹þ)’—Ej=‚†€;©Uøý4#ŠŸ{¤ØVª\žŸ wRdß¼cEK#æÀØ·°åžz}EMG€§sß7‡ä·$‡_iŠeÒ§üyÊò%íÆ â+\OÄþÓž–¦;,•."µe^lÄoXoµâ݉vlƒâN³X¸ "“ý~4—-_£I(Ãã‘ÀàIË­oKV)ˆ—×0æ­‚lvª4f¶'Co24|aÒ_?Yï8Ž¡¨®J^…Áq¶øW¦¬Éû{e^5Öy¦œÁFx%×þ3Ž–Iú“h¿EŽa6óeýûòò.É×”ïu†ñ€¸Á¯A£LGg9*|êVoÈ[5±Ým=ñ%ÚH4Ìx캓à–ÈÎ:ÑÀ^÷g®šäæ/•™$ÐÄÙË‚ãÖ2+rFöÍ/2 é/òêÜÊ ÿúeºÎ1"ÐøÀÂÓö×—RÞ#„3Ò[>Þõ[òÔïkÿ©éîö¿”Zª[çwË™¯¯:¸­’4i–¥~°·`ÜQ—ª§HxZÅÏ™Zz½ªŒ‹Î'6ŸR¼Å+ðßd¦Ær­)»k°ºHZL*VÊðÔ´j€õ.Ø}>ýâ9ŽõOÛ1€Ò…A’,ëñarK;¢ll,ï}2žßŸÈô2L~z›srºxõ”@0MójAú°lÑåòÄñ2³{”"úë§¡¾í$¿¥þ0âl/;ž˜ÈaŠê!‰ï^xW Ƨ¹$¨?©”Ù)eB¸å¦NÅÞ4%Xt{µ>ç74Ž·~jÅë Ùø“CÒD¢ìq·&ì{a©" wãå|¹yZ¡øw¨8RÃüeðeUüP+ŸŽJ´¦‰ª° c1›f#7¯0ƒµq$ð•õÓ*$'Š!—Ù]ˆy¬ ÓejV²“_º·=÷5ï ™ûÇ[=²_Èý³ÃÆïh>f%0œöP„;`!Ê3¯ì8ģȟ´‹"R|÷Û%à›èš¡˜¨Õƒ;t³W}ž$ÚCZ²T¶¾õ¥jÒž›4—6ýyÙ$™NÿE'ÛžCìÅøø=Ü&œû›–éWö#jz7烼©±tÕ°€ìGú€·HY÷xVŸÅ ¢òŒ’×%&©Áò¶ÝÄ¥e*¹név_`žK\__°©4ßÊëDKKE䀙4ãWç;“]\«“e -XH²‡ßÆgñuˆ0«G×\Ç£\€¨)yŽQ8>êÁ® wÍùÁ¡í²ÚçÆ æ-1:‘éÜ©‡Tà¯Ä“ —qþi›¬z¼9HY]ø]_¨t:b!AûeÔnúúB÷Ý­·ÙSù”Î?õ7+_цcµNQr15K³ÀÄÚßdzï©*b¼ ¦£ì6-M %8 ,º$•”i§ Îð=Ç®†oŠðtp¬çm¶ ï3ëÂX+iõÅFÜnlUc‰2O,*¬ƒ|?QHšd¸£J‰pjގ̺–DR¬…0(=$™©ü›€À¡Ò½àÑO„|¼Ž`£/äÇöB²f-šª…Fk"šMé"ñKÚ+×z‘ƒÞºnd;­Î2JUÌ6ÞÂÖ…}X›†RiŸÓ‚¾$¿dÈ“™ãrëñM)‡xù÷Ð÷";ÍžIÏ:´ß/—Zô(þøò_V!œò˜øcŠÜÐ@XêŒ!ˆÁ]×Ò#¬tù7(Ô‡&wÊþÊ%\ TzìcT›1¨­u>¾Ûp†Vqg÷§Yz³æî+‡¯ýF9:`w¤íT*¶®ërûÅäv¥¼´ã£?²Ç§_jUqƒ'&dûUvn°*òD#e3ëCi¥T)ÖµgèÁ´Ã÷8qËÎ¶Žµ˜ê³´”råàñS° YÚGÞáŸñ¬6d bÖh†Š ·%A ÏUù륥Ù"u…š›ð÷õ‰!µX˧ҾfkûÌÎ;úzöñ*µ· &ÙÛó@i”¼ÈøFß}n…Ëâå½í‘â4ÏñÊjÖ|¯PLg ’-×PXÅÔÖÅîRÚW˜ËãZ\ˆ@ÿºDSd-È™ñà“äËê8 `žÀ7”€·t<"îôÅžÐJÄÛ×<©©0|¹CܾA¶$+èºõ¿ÅYH¨Æ-B­6ðç›dÛC¹wHì]³[¬~„õF…ëùyÀûÙ¢Kë‡t˜B±§Dsòf²F2VŽü÷jÄs’{þ‚Ú-ikPã.Ÿ¹§8%c)JOdi;õO«¿ h°VÔå|øjF=ºžÝc¾O$¾~æN© “V]GJ¤´½2á lO/:ÉIwáécÖDן’øFö|@<S‚Ìî×hmv'öJ„XC™\”Ž:0›ÝÿâC¢j·Næ&îÿbaTèm1Œî8Gן„>Ì¥SxìÙ[Ò_'SûmˆÈªóå[ê--Äþöë–‰¶"·Kó„ÒéœÌ:‡]=ùYHïÑŸïTa%Ù Ç3ç‹Ý§ñwœ“‹ÜÞd”Àæ°€‰üÀqy2›4éÕÓ ÌN~ßò8Á´CP˜a"ðβ›ò‹dg­'eÌög°%õ½Š‹µ@™¥dÑ6ùD‰u»×ØßËú*3êÅŠO A“0žDÞ2tApu6Å1陚í]Šm铸¿°õ¨gu%*šwò•…æZKnþÆBØîi6–VÄyihyxtÜdÔ£þKÎû}ï¢ƯÈ0žßc%gy~©w° N/ ÕA Ë*pÜeÎ Œ·ùqÙ]ÇGȃÀ ¿Ýþúè8•öíO~êà,ìÆ:õ§â‡þ”Þ;Ga·ób¸Š—afô4±UËi• g¼Ùót3Ç\ÄO/Ý&Ýv÷“Bͧd Ø£«^Fÿ™~PÏoèÉúºb+FæaFÆïŠÒ &¶NHÊÀžW næ()˜,Ua”mœcÕlv¶ƒ o¦±(ܬrRºC_Àð×B–Î>Ózg›¨:—lÇü0{H,*’ÅËìS­Ð«ÁÀ2ô¬€ån³ñ˜\LOØ]ë¿¢%3ÚÚžY^óÙOËE)W„oâ¨f0з‹r&ë‡Á;=põwmHe±‰ö” ²Uœµ>;ùãË.«çÈ #â•„”*6¯âm-¢Î@¼vÚÑ/…°¤Y ú ³yÞ¸€iÂõ]$ļcžᎮ*d÷X–}÷æãô™„Y"èNÒ"Tβ·¿ãtÿ;qv´Ú´¿^"ïOË:=2A xƒœÂáaél}LÏÞtYÒæ•HÐqÑ㥿8ênLv¦÷1ž÷Plb§ç©ûøÖ®¸’KÔ©W¦1µÅkÜ]/š=Ñ<íW+“ØOÿãÑ1€ ~JrJô’o2ôÝ´Ó5ÓåóÝÎAÖCÄ‚Ç6Ó8Ä®Ä/j¸à6jêÉXzÜ£Ç6ÔêâhÔÞÇ] ÌíØ“ñiÛ!¾)ÀÖ•ý`eú,) å[Ó¤’v+±H¨©"ìãÄnðñæ­°OD[¼×>[oBx²ßÖË3SÍÚ*ý€å Ž” jƒpe¿À}Y•V:¾j‚Ð ütJ$iÜÑýÕéƒv[S€îP%\â艽¶#æ0gí!$IýÞŸ/²ZȳÉ穱/†xº²OŇêq$‡Ò‹šœ7—§Iï÷È-÷–c©X3å¨Ã/_žJ÷È¢cBÇRè}9}Zö¸Sœ%+ÎÀàL7ŸÈa8†ÇÙØEf9ê±ð¾¡Ú@)’5æÓwFËòÉ’´ïi²p[!âEk¦{G»JVvHêØî£  õ2’ÜB¸ *72{1f-ˆ¿‘§Ö§wX qÇFáìÙ«Ú)ãàbïè5ù?×dý¶<%÷ 4;²é©‹½ûz¹¬Ìý@Y¿DŽ´7O>ù–f x½¯’ ß‚âWþ9„¤ÿ.õÀÒ*pH8h¹]U¸+NaöJší#V‡+E é"¿½l¡Ón#0ö&ZÇ gr€?m#¬:³‘e8°!&ø£Á?6Aô˜g”ìË•‹ÞƵå5q3+¨§Hšì–Þs U›¢ ‡ ¹¿z!hyækøúXuÕ§x§‡UÑNµáw<þ ”9×›ýÿXÊ7VÌgòˆG\X0{PxE“ˆêSÛ¯' |C¯ ÊC(92Ë –±\m?ÜgLÿW{6¯¸‰Ã.gKÃþ1ø”çiÜ;šÁ´84ömš»¸TÇÛù¹R|¤M[D'ÜÔö¢Ï¥–Ôšq|®4–e8OÖØi5=ÞýXL9…pÈy¨ßutËT¸  ¥ß\WÑ›9ùñÖx¬ú¿ð#—öî@|)‚z/Pá6‰,÷KÌprxÚË…ê¹Ã ;mÇðÔ™ŠÈ®f}Û˦)п×6^ÄOÔ“÷CYGE ç9}o˜Ùᄪj.ÃדG¨ñ­„Þâ`4Û LÎØŠâa&ω°9H—K½Y¯žX)Fç>´T~i?Uo OÒÖ°íÏ ¬iÐ÷éÊÐv=9øƒà&<á¡ôØ[ºÊkø=ºgñD]ƒ|®ç¯i ŸÙ®j¬`.k¥ýõ½oóÕÚOÓ;œ•ÙäŸ3A}kЙ;‡Pñ7þŒ<‰ !W=€ü ‚½¬#w|•d,`©p€¦Ävá9᪋éïôÎrĉwûZy(RBò~ÅëÒÚ u>£DÃíC R€n†‰çÑÈ1®÷þlS@@á3@Ì1šr9Ñ6È‘r„$(*^¸ƒŠÔ"ƒ*zp½ .óÄ6ÿäN;´áä{Þz·®eÌÈûäsj¦Ë£ßF7S·m¯Ðls>£œÙ eçΚCféB·x×缞@Ê ¿~© 5óå8åZYú¢ÿ&J—h•ð+ÝÍéV¤³Z;¯ è&œÙ0µ=¸'Ô¼¼lrÂŒÇ~l,­é‚­~$/š¶Ýv4ë¯çõ»o@Ôw¶ú¬¢´ ûD‰KÛKLE\’?½ºN¹î¿ã‡# ÑñÏuäÇAŒ¼¤»ŽÇ@Û_rb_æFt0¨ äÄŠíÆ#ä}ãö 1­Í’\Ž"ÞßU–$Ç;C&’³^vô®8'ÉÈp 9|†¼—#(tšàîK‹&¥§•05¡%ôïxÚÇ´NB5³YUË“žÌÓÝõ ÄÜ‚ÖQCž Á uÚ_«ÁåDµÞµk=:+ŽFßÜÁe/ú@µù'Û/—¥øÊxèŸÑx.J»uƒS8$O›‹_·nKЉHåy2TVÒTM“þ}î~E`BËÒ>4üÕ æ2+öNÜ4$_N¢ÈiÎÌ\­?á1h•e[ðµ‘:Ä­]zJâÅT >:’•¶*)@y¥I§©•R#˜ÞUÆV˜@f-ø`:!C˜?f䤠²¡B¬$˜Ëcøs?†²àÓNÙ?“JþjìQ""CîýXQij”Þ‡æÔ.fÂy’jü$'eæ´ÇœÌpq‚óz•™x¿†sJ[™(WÙÊÏ©Uš%É.ÑbÙŠó,)–W"s¹‘„7úßéû»å²hñ&ø[TôøÌcô!~•ÔD/»‚“_Âb»L¸Ä`ÓV ‹¸eCa6eeÝJÑ%ÁXß#œŸi¹às‹LöÉlÕä¾sÑÅĸ¿ÂüÜäqSãûÑÄû̺EgO?.µ1iô-“„àUã—9iŠŒlØ;•Q_|Ñ»Â××–’³~¶áàB¸5ç@g¾æ‰CO©£øh‘†yfŒÅƒ€ð;i|‰£¤"EÙªZ¡*ªÆcêmø3Ή(=˜¸Õ0×s1<ÚPrF~]‚0"v’BÅz—2ˆsáâ t6€öeáOR>ÈÊþÚ˜W»ç¼‹¢§Ç…—Ã\•…Êg…3ç•ÚÁ;DíÑôŸsIÆ>s¬€HÐë‚´Zo&D³/Š}õ|º·5‰jÑBC§g¬ ƒõëäÊÜžÉ&0ÑÈkKÕœú{”öFËÊ&F;t°¯`VžÛˆ™_w6w¼:Šå…œê±¸?ñ1)3¸{/ºè¬Êw±Ô#¤ã`¦¨» 1+A.»ßʵ¸¼êBK#ÁWïÁB~îPÛ5ˆai2I—ͪ ÑçæÇ’šåE¦‚ˆôcך±rö#ÞÉà^wÅ_P‹ÑÊ--8(–ÈGT-M9])ÊÕ ˆb9׿ *Püz9÷J¥Q4(¢Î9f žö" /Lº»ïе)ìÆ¡.—@ub%Vx* ÷èÚüò/-NÂB€Cp©ñÔÔ¾ ;" 2+­°XA¢çñ䘷ªU ùíy®TÂ|$òö-MËg٤嵪-UÃ"8&dUwòÁu’‘gÊP -m`.?„Ý€¤èÛ¾× mÏô;È5¡|ýÕ“Xµd;ep`‡,Y7±ë麚½ƒñ1ÿœÌÕjÖÃeê2Z‘ø// z®ôùø%ì‚ÑÛËݹ7R» swO'¡v´d8R)‚…–$\¼”äuk|޵ÍÖÄ4„5ú¥Zœ¨À«¤ûÓ˜"ʲi•¦&ÒÄ 8°­¡ˆ‹©°A²­¢ŠˆL0t©vÑ•°×®ñVtÐÉ™¶°nÏ·­Ê*ªµòƒ¶zìÿrMè\32Zñ°°TïòŒòbßi ŽrI@^7Ô‘ÉʃÛ*¡&…‘µeYîª ­á_ÁÒƒt;—!m2áï,>ü6µë…å]~=Øó"סcÉaÊr¿Ñª<¹µ2kIxá ¨R_^µÏÝ©žÝ¥WJu~øãÒ¦0È|QÄïE" ´ ]RщqŒÓDçò ÷dŒÏEð<ǧݠuÅ Ö‚’¿¡bn ƒû5„9)ËÇ£Rræ¸É M{Ð ëÅÕÄìE¢Qm0£^DeÍ3ºYl&v6áJ™ð•q‹Én$çÆoƒ¿£Ë”K.LÜ-k`‹¶´í!¿qg¬äÚߌ o3V7‹§»CAøgBx7Ê´Žqf¾Åuyn7/ôJ“ðàåž5°óPQvÑ…^³6HBÖ>#8Q”¶€ææ—|S‰õêðxf—&zsIò ï‰ÉÃ&kõ6ÃÖ¹k[¦Â>¹åéþbF8¶5ÙMýC³Ýui:êWÚ´è•k¿ À6VE†ŠÌ,ðêZ¼y&ø7³8¶2v¤‰{½ÊY1LkèB‹ÀŒüÿ‚æºïΞ¿Ù®F€ž`’uqð^`òžáHUÃPŽ—#S^Fj.§|ñ~ý“íÉ––Jnö¦Kém|Z×{J„n¤Æ=,´{Ç€g~Ï]òÉ2?É’3„4 ˽/Ùmp¾„Ta4œeS¼OÇÃËíB¢¿o”†‚ÁÙ"éÑ)¼…Bùgª³T†î×T‡¢ÊAîmU¤1GeµÓ/ M!lÆòÜ»¸,$mÓA‡ õt#é6›Õ8ˇ†~—ÔËwÊóóšôU1yS ª/ÍQ:yÕéß¹éÿ÷ÿ¹°uþÝíÜwçûÄUâývë˪¼¥¿ù;]YÖWÂ…¢XÁƒ&k—I`Ï%5ê2Œ%vÔ©ƒ.¼¬ÏÈVú˜pqu'µµ¶2ø•UR)ï´oΔ,èØ1±0ƒ¶²¯åz£$ T%–¥7£?ÊK“® (rþZÎKÁ¼b8nÈ¡F©^:–à\Rôs‹!<%F¢NšÚDcºàëçš±ñ9éáQµ«x3í7ÔÓS^Ÿ~/°Çw‡¼>ôÃlˆVGÛð=x—îzÑ—í—Å^‘Ãq0…œzÖäá—Ÿ›†ýóe ôíÂÎïR¡žˆÐl ™:µ—Ü:šœðѳ‡j‘Ü6 İ‚&”Ó‡ ñüSÕ™ºH0`¤E ¼ilÝ`::ü¶ÍVÃDïR¨Æxø+ÆßÕS!’Î;-£bŒ¡Î7L¨‚›N9l«xͶeuÏÒ 7D0À£à¼Sqš çukHmŒ¡ï—Cá›éÑ@ÃP3ßúwZžK†Tü^‹ÞØÂ˜‹³ÛpǨ…«ÎÃdËL£ ÃÀReE·5—Å?Ç;¨Ý6n:væ1;Fàí~cðì@Å–Ú1§Ùƒp&%fãpžCúO¡ÔöÑé½pª(…uø–NEìzåÓ†xËPú5Þî—D—–x×®?l{e¡–ŠqŽ£¯¡Â¢C\N0oFaG|óú›KL•°k†|sUUËÃz°ÜbéÕ-;1…¿EØþÊ@Fȶ5Ž2Áü›¸±Çñ6«ðW®7é, £4>TáKn7‰Õ"ýr,tœQÉyúó=ŽUÄ6ïÇ$cõMœ ,ë!F$y²YË–ü?[¼_d²· |e]˜æï{ùòòZº‚>—N[á®îºc÷o«?kG!‰[´1·K&Çiô±v(£(TΜÃíÎ,ŠÍY ¬¯ŸDžte¨æñjŸØÃñ¡$Àég/ªÒ ·vzm÷OkAI{«vì'jRûf¡‰µ# 6r[µ™Ò7udú¢úýÎÝz<8‘JªË_\2Œõ3kÂ~¾©ó Û…˜äŤ-­Õ‚Mñ¶¹PêèEm ƒ• Ӝ͠NJlkúI»é b :õ»[6Ûút§2©ÎŸîÓ‚ Q®'` ¦+³ÞJïâùàX\q¿ñ|¢P² Oó?ÆÝßóìõ`ÓUúvRøKKqÆøùoŠJþæ4X¢Ícb¹ù‰ßé«·kÇ_uÈ«Bìlcͫʭ‚[@:¬‰ìIƒ‚”¯<ß»1³†ÖÔî"jŸ´Î¡¡§•“u½€0èX+DNÏšßÃǦ‚ º0Ç|$=‚~*ã^±÷¦SfLžNŠïZ¢µWF£‚÷QŒ)–»×^ó7rè¯jŸdÐ¥Êrþ<‚僙Õ~ÅÓš¥–Ë€å(¶Æ°ÕyªÑ‘¶ÿõm‹|'숀\œ™ánÆ®o(2´’R^àïN&kì‡ú^ÙÆXõfe8ôȸ*tÖêC0%»ªÞ0ãË~ä•A«fÐÑŽÛSºvÊ|IKªA%ÒzEuµ%²3*‹µ‰õG@zy´‰Ò£S3#Oܘ›-üÇYÜΤ¨ÿ°Ä¦«s`†vl7âë ¨–YHeZr´þʼ¥ŒÆø5Ó'Hm †K)Û±pêÝ- –E¬ûöF•ñ=Ãd“+ Ú4˜ÐÍ̧äk?5K¾^‡™·ÒûÎ3õ]Úþáì8 ¥Ô‚€0í£îK ˘¿Öþ^í0æ> 'ú,ØzGqªÀdD Ù5àÉt€±lš–ò›X35+;æ6ÕÎ9™Eêƒ åÒ/:^]JøLï~Œ KåÓÙpph/jµ]®ÿE8%1WÇlÞWS=€¬‘Âo5ì,zòZ¨ÞܵùL`© –o›gæáù[¼M8,"W8µÂN/¿®+áåJ6ÖÒ¹H3Xu«J&”ZF9Ч¬ãHÜ­ë;»lVú28©ÃŒ&²æ'eªÏ·c1¸[£l¡¥Ô²žf ;Óö $µKùiZä66Dô<üøI¿”êÀoJÍË5s'ǬË3Ælá>?öBØuÃu¸‡d¯Ÿ®«6ªH.TwÆu « ŠGfhl¡­õ—³©áy9©Ä…›öÝŒ´r°À÷Ößn"ÎÄÇÈ«öµˆ²:ü?O%YçdŸ5 œGUG$þ7µQ;M¸ÆF‚3'µ‘Û©Õn”]xÙ¨ª¸zrÀ÷êfá¹›ob*/ZiÈô()nÊ`»Ÿ±îƒâ»“ÃãOÔ­Þ›Bnc~&$LJ×}nü—:C‰ñs×i§J︤Wæ¥I-pUƒÒ¢%‚SJ«r¢üÌŽw†Mˤ´¼.† {¡<¹ygÄ—'T÷^”Š3¥"0ƒé¿ íÁôž1Þ_«^ÿ`ž_m#ÝÑ*G}bØŸ0oÌBäî.…/1;¹ã{zt_F¨¤þå”Ï  îøB€-åÓ3öȈêOK„_•›gÃpžmјýÂWN¢°1…}5Ù²A’\Á—D;2ê¿Ù²b/ÛDj®îðn2ºLü…c–ñc‘ÎõØ‰× †5 ÃÞÁÄlÇw‚àZ¥ Ž?ë §”£;›9oÞzüq¡%smÍÎÀª”Þ_ž¯²´ÊŠ5«=¯ScãK`º/z¡ÉHSâ#”†ØF!TV³º›5²–O'âf¢ÎIʨ‚D y0…{Ñ»5CÕÁƒªîZÓœº5øÞ‡n¢vÈvív—Av`¸Èø<,ÿð ÍÕF‰—AJcU:Y gaÜ×b)¸|(y›G]™Ñ [l·W]rkW7áŽð;-pìaÖ\Ž©¾kYC5¹ëÆ#§>kœâ½|®Äd!‰œqf¾P†Ãˆ–€rˆi¡-y ­0žDm©ôi¨R„ªÊgøB`ÂX‡P}rѲ½ð0ÚÞú\ŒG€,r±H´4WÀäájαҒçŒßáûa˜ð ØdR”ÁŸRÞkäòs©”†ëàú‘ãš >í ,‘mÕY—ñÅy¸4€‘á8hQàEo™†—ø°mOw-¸=“wäê\—û7Sðæ‘µ<˜6Iïf¤W™Œ~=4v~Ǧ+èÉæ¤b[èër]M‘³`Áý¼ÝCg%/i>¶GøÓÔ¥»a\ÇZ˜›¡’žó×—fzF&:æ#|ìD_‘2ºôK^’AÐIÐ×øÊ¯[þË.ËÈ·ü1Z”õ“!WIJtj"RNÒ "ƒÓ}M§µ¡î54*ï'!ˆó,iZ䨬"þþGI»–»è}ŽEâYDLCI ¨Ô¥M)~úH_ûÝ.8£Ê¬OŽ-«¿jËž®*›@8\à8 1ÈC“~”îvhrEÊLi8‡ý=®­”Ž»§þ42ÇÏÊÆ"×ÅgÄN€µ„ˆqÏTN±¥øŠ w€¦`Zg΄ 8Æ„äì† ‹|AS¯”©àoÝ[\J¥øÚÅÈò~ ÄðqÛ$8! ˜!Œkä ø¬H‰ÐÂÅñÍAÜÚfh—[2k¤†`µ¿É%×0Ťm• ÜeõU½­ûϦ?Ãî¿þÀ»tÜñYcÛ¨OTm¼ \q*x4qL‚Û£‘6 {ɾµ®ëùÄÍ&Þίƭ w{*ùâñyªðôêîÂY6üIj2X+  Njuä;ÿrò»Ûàlº¹ óz­(žmŽdFxîÉ‚yª‡ßg(Zì´•cÙÚýníÛÑÙ=B·Ñ_¾ #Oî¿[f€µW‹´(­ß&ê$1-[lÖÏï[¦pq—Þ•p±t³’íÿX‹€4 *Jm'l”Þßs·Œ.ò!j­ŽÏ»TLŠåEŠFW@ùÕÌ+×£_/Û–£×.~3§ó 5¸³ Ìûõ¹Q€ŽO÷H†jôÒ÷ ¼))iö+WT2…›Tá3lzE§Í?Œ‰£Cx¢ãä$@õÇm—øÞm4& âG¯x¸ô˜»šªÑƒÉñ© >Y}Ÿ;5j\ Ì)w˜Œ:V¨£/aË‹š¸¿+‹gð»ªà×èx§I¶‚:³èD©IF¼­ ÛJÐÃÞ­ù÷óÀö÷¥wÒŸ‹dkèÇˬOWK±Üi;IUW•o!š³à->Õ5.ö—?Îíg{ÀØAt³Ìv†ç@Ÿ‰!,bU ~ÍjÓª9Ü{üÑ.ø äí|Z‰Ö9©vÎÍs¨·³.,Lix›BN‘3Íšš2xáë¬B9¦Ê•M™úδν<‚“M]rdp•´JÂM¸N»é3ž’‘ÿé„#§×éÿ0qkÏIi°Ï?ß½í—Re3%Z5 ªƒ°h£1‰|EVJG¶V ÃØó#¥5 êÝCÉå-²SÈ¡ø¼—3ó9íÐE>÷–ÐO!,ÛÆÃèÀŸ’«>‹u|ñèz¡­¦ÀÙ\¤j-ŸËªª‡'eGx¡`* šy  3²ÏÆŸ!F¯\á<ßvyû¿Rù=LþQçÅQ´ùÇ®AT*: Mç"êä¨Àš@6Ä .”öž¢È1Âã½Ý3ëB]L .UÑùõ†çÎî&xÆASö:m¨K€¿¢ï4Ú`Ƙÿ$S1á#>Ý52]”!ɬᕼ[`€2ý$ZgÜK@#Ó¶æ}ûëM½å2j×ÞðĘVBåçJf«'œéY¸þ Äj‰)¿ ÿ¸:)±3m_ÿ¥µ£òn6sÜc ;+/IÞßkßä™»:Rí»V‹*»÷9ßa:5¤Ûuà UL[eHmïr*ÖöUÿæÕvüY’ò™7dÏ“4§Ýaå‘q¨«ËíúçÍŸ}ÃÕÒ8ô©ôÛðwï,X’³0F®Ž¸toïŠ_u9ä–‘¤Ð ´{ÐþxØòóõU}“k#çTð~ï)a/ªÓ]‚_L’-ðº!²§0Äè­\Ü(ÈLƒhÚâöÄP²ÁØkÇÓ5€­Î¡Ø;ÙG%¹øúG ¬6ŸF ³údèVL“[´)q&*ƒo•BSº•ƒlÚL” Hü­†…øKvy§ ª\Þ@Bjī̱µ ïK:î³ÜR©‰ö³ RâúÊð7÷¨uÔ0Eö4À7˜¯„Ä£¼n”>u¾Ã>pdÿ±½\fS*Ú÷£–ÊxI}ŒÙ€ìÌ¡.ùu%f°ƒFM‹õ‹q… *ú誩›•4Px²øþI+žíMcn#yÞ'9 î˜æŠúæŸy±¶ûPQ]Ü G€gZ PD¢CH’¬±c4ÁywÔʹƘ{ª„±/|Êp€~’ºÝÂõìb¡¤€*f±ÇëüLì14c>êu$a×+çmÛ+ÑóEÞ@H蟲E¾,À_ÐHåÀüuƒF*Á×C6©|AN埡ÀpÙ“:—iÕÆê“B,¯EîpþÒ±‘%úÔ £òŒ(ëQ¢¶$½ëÒ8”/‰dxìÚV¤º¡C {Ó%’Åj8Yç×ÜÅ&y| ;œrwsÙ3þ®²”ýäV|~ï¥z™Øò{}ÛUpÓó´@*1ƹÙ|¸µ4Ëž– ÕøO¹^¤=‘#€~\À·¸Å.à/a€½ûdÚ5;M¤mš—Ö8%OZ`~d–àHy­Âù×·N=}¯wcw5ýÀeêü± e`þ;pŠRk¥4­(Ô.MÐ5ܯ4Ì÷Ä>ߦOZP»inßÅ¢/–¿oxj Ë,L6õtÅŒD¦Â»%™ø\#‡–ƒY‡¦$gcp]Í k9˜LéŽà„ã‰ð4üX¢ ²‘Äe±z°½'œš«úc°¸‹ÅÕ.´›éw£º=Ñÿ œ4å– endstream endobj 252 0 obj << /Length1 737 /Length2 30291 /Length3 0 /Length 30894 /Filter /FlateDecode >> stream xÚlwpfÝÒnlÛycÛ¶mÛ¶1±'¶9±mÛ¶=±Üïœsÿó×­ºµ«v5×ê~º÷ګɈÄì]U½͘è˜è¹*â*ªLŒŒŒFz22g3#W+{Q#W3n€†™)@ÅÌÀÄ `fdd‚!ˆ88z9[YXº(M¨þ-¨Û™ZÙY9ÔlÜ­L,¼îîî‚î.nôÎnüôÿ8©˜™\-ÍæV¶fE-)y ¥„¼@ÂÌÞÌÙÈ èflkeµ21³w1£˜;8lÿÃLìM­þ“ ý¿°w7svý'0sg;€œ˜ª¸‚¼*@L„AU`do •üÇÝÞÕ…ûk3×eG pý/ekô_Êø¿ÔµÎžÿ¡èa˜˜¦V&®c3 +{†á&eoî`ÿØÔÍñTÿäòO|Ê0¤˜š™ÿcífk+odg q°sts5sÈ9˜š9Ûþ…½‡³Õ¿$*¶Föÿdò?.FvV¶^ÿ_§ÿk!åjô(BöÿÀHÇEÏÊþ±•‹¸•§™©¢•ë?Ø»:»™ýG¬aöŸ:É™™Z¹Ùýg ³ðù§Â¦ö¶^ÿw×Òú÷ž Âb*R2â4ÿmˆ«ÅìML­ì-*®ÿ`kälú_Á¿ÕŠFVÿé&ãÿ.÷ožéy9#Wg+O€#ý¿Ú…ñ_ÏÿPzÿk%,ìàéCÇÄΠcùçÅÄÂÉàdáôûÂ5qsv6³wýwþÉåø7–™™§™ ÌúŠƒ OˆuZKX¹¿XÑ\8ÍÜŒ¡Í ðêtϲե©ÁÑν*N¾þl 1ßÞå®Ô}3±QœÜÉäT Q„Þ Îk I……Íö»RÁ[}„þ5˜:¶‰<ØMäkÆÆz"õkVîßi§R>d ¦òŽ~p¤øµÅG{ *= ”Lío8³šj¤9ËÐÂkc×ýuðüà=¸2lËÂò@Ç£pí‚ú+k-Åy¦.IÌÖŠN¿È£½Y÷ÿ ] §¨× ½é1b˜ vAØ#ŸQ»}îÜ ™eWY§MAŸ ®Íñ5 jür«“¹ƒ- âÊ趨¤…kçóÂwl>Û]2aåt×MSù öBP{°MÓ¼@ûS8Y‘³0è±³¶6éD¸r–w GB†Á1‹ }FXû8K„ųƒ®Îf¶ƒ ‰1+–̦ØA!6¡¤Uöƒ¿ªæ `d ~tkÈ’ ð4å©‘žçG#UÉ|÷ õ´ÍM/lòÒþüŠ¡$¡5UÂÛ¼Æ^â?Ðñ=Ƀ“gð'Bú–ï\¿;Nî¾»_¦„ ÀúVæ.”Lm­³CFîL”O”Ë‘+Š@¸çÀ¸0Îõ°^n<¬k3˜-¼k¹6yr[+—Â[EQt1ØóY e 2ÞàîÁ-‘GŠŸûäFÈq ²†ùjŸå_ð’§ú±³‚\±Î%Åfã­ ŠÁ;¥½:µzs~’Ã<›ç_«k²¡•ã ìÊ4ïV_½˜l{›Ôá¼L»!2_I\G!HÞp~Ħ:ÃÏ£þ¤ifuìèêåuœÅ…+'pÚÊ7>c%ïwûˆ.K>Ý7ú€åOöïÔ‰í}i–Eú+¬téú†îC”tÔ_ùÊ«Ty‹Ü@¡gì@È=¯¿ÔÁÝ|Å p;{l㸘“…D…†®‚vR|뢠åDƆx›ÏÇ+½ÏJ®œQx—Iû$?²]÷£cXJ-¸8âÙ.NLŒ¸b¸¡°çFô·žäò¹C//Émfí¦Ïaež.'À‹»{gÜÐ;ø6sLxë >žÜ}5‹ø‹³(µ<ôä„÷d‚Žr¸ËTÚQ´Ð¥óà°)´´æWí§yèLØfC±30z<×À;¥ëâ-?ø‚_ÂÆ;Á†´¥ð½/`h}1ÝCÕQM gë†\­&”OHlO"Rò³GK‚îo?XÞh£´eçUÅu£Þæ¢ùcõT+×*†D[i…sãe(â¶–CÏhØe0í¸XÙİ_y÷§ixN-Ö¹UEQ`g ¢ ùŽWß%ZRd“¥0RÂðÙ‹-µE ^ìø˜¤ ŒR/ ×éÀÂÞ—|t1ÚnÔ„`XH#Ûª¾\ØË(Ð/bËòuª¯,j³ò6…¦Ù¬5ó: »õÀ~…œ hw½°ê*­$ (~Qûi±ËZ…JÉkΫˆMõ×ÍO2!øÚU”Åž`ù ë¤K9øúHÈIÇÂ#ƒÝjiØi‘ 6QΜÃŽ([ûÂ@»Yó¡ðYë,ÃvL eßÖÁ¼{‰Øš™WŸN ’¥1|V ÚO uÁwg‹òF'Óìã=AÊÌÝÔ7BÊð~Ê>‡©(.½UE£ê9‘Ê`¦Öbä nhù6Q\íHó`öÀ±Ø©o梢,}³ˆ^¼‚´fõ)yÂbfv‡AÔic4³hJÇZÕNEí•ùPWš^¯ _#› gË,£ç“ÛÅP0ò'~&9EE‡“Ï9äúѺ÷ÇHîÎVNaŒS_!Õb‡´=²üd¹ÁXbÑäŒÖ¹„ͯÆ3ë'Þ1'2í°ÂØ™€ãà·w™G/§oËêÀF™ÂôMSr_OÐûn&¿‚êßÅa~‘îû½È‰ØB¤,ˆjßR°Sè«DëÜ'÷u½Zë%‚¸W(îVK»ã®¬-]Ò_ô×§Sù»LWûBgŠò€Â@ÝWå9Ʊ÷[ÖÝ!´¤ÞðCÆã¡V3ͦ/Ð ßMö™Vð×PMª¿|Xé,n AC2#m&®`üÞ_dbÝCv(´n´•ò§5…0$ï`;‡™šY{-¤H›¥&®ü£Ã9hüµ«J Mé #7"¨B¨¯çHGáæ rÆsÍËY–Ú¾°ìöŽe|Dá™æ¼˜¹“ãA~ªÜŸö3ÈLåø‚ßݤ1 ‘Ú¼’zÄ>ŽàlSÅøáj•>Lf›°}06žu¬‚VozüI/þ ñˆÛ/`¶7š¤!.ª§Å‘­ÌÀâ’Ô›ŒÚ¬JïT¤2ÁÝkAòœ›_EpäŸ Á§Sêèàm·ýéÒ”±è/¬ˆ¾¿†$yt@lM: •˜×TÌíV²d0Öùƒê6EvÚj¼¸y5ñ¾‰=:“|iÚ@"T—‘ì´Ü5aÏOcÄiÕÐ `€—Yl¡·ª<Ë4I÷zïNÓËî"²ÎÐ.µ×ÄÈe^"Œ$ô2{`ç"NHmT&–Ñ©T†ß¿# ‚¨¬úT‘ïH}sÞsÒþIŠGÞ‰w34 ž«¼Üm!‘rì8¿ôÍ€@ G¬ÂEuÁ>˜ Ou&¦¯Á®ØY¦Ÿùwù›î2Îp?:¶\ÝüÍ5¿€ZU/j•¬‰Úˈàg9ç+4 ¤Ë4w¼µ€I–RÖÜj>Æûkh†kÁ[yðÁðê*¾é ùOvM5…x óþß³ÒG£ôu Ñþu°›Ð[B4nì>Èï«Y4ÉÜSkeõb›ptÒ¥¨¶?ÜLè©5 *0v½6ƒWiòôæëÄ3€{­¡yÃWÚD9žšXÇÌôÅ—ÝÓÔví>8;¸•Žˆ®ºë.+9^r”ììf8í=³WŠ E•zX~?úky`eÿ{öãZTe÷1äD‘FG­lÈœÙÌÕ%ÁèÞ`N tóö>¶2G¨Í$Hê-0Ͼ-)†¨…/Ö|g‹—wpG»&‚D×Ó_°Îd”h¢ƒðÞ $¢ÙÛƒ²›w׃ÒfˆûÌq(< rõ…—¬°éÈù·Ô\_é¯ Ý&ùËÙl-éð©¿ØÃj Âxžž¹`Å…îÝ›´ê .s"]=­öÃÚþöÏvÅ•Sø÷È––HXåÞ›Ï)´{×xO£š1ò6k,VçÔ9ªeEÝÈñ[­úï=郪U0yÅ£6vâûÉPüa¬µÆ'Ñ?ÇÀ†Åd ´­üÝâʘ5ò“5{Üâ#Õg½yÿ¦àuA!U×­¨x‡ˆ» | ÈÞÜL:ŸF¿ø¡Jù.¤z‰Í_…y2&÷¨èºnH~eiQfÑ…%-6–ñÿrxp bÉs)äK¿+Þ\;étC6,æå‚øqNvh^OÅfà•]ÜþØGŸXDq\Ïý‹j ¤qû0ïk´}x¶£gÓ]Í®Š"‘ªWxR¹¹©[‹{O{ÌLaŸ¤¦i䢾šA/(}é•™úúéF¬ŒŽWæ¡b5!Zªp¯‚ ß ‹†CÌ@o)þ¨($6ú^¼÷ôÇ%©Èa,ÇÂò—ø·OŸbB*Ü ÝÙÄ+–Í `4Ü¢¸Š-U¢ÈyÊK¤b-3È—ĵ¬CúFïÎBvΈ;¶·{ä\¹mó­)Žcž)ÚÔõh}Û šK­…&f$AE¡S«pÖ€p¡—C,£Ùá,Äyƒx@°ˆ–Ä_OÐÒxh ÚCg0©ô)O"k¨.eT±`Rcf ´È4„ÂBGßœo/û¾lŒezV{Êb’ÅF/³a?Mn)ÑmÔíý¶è|JzAŽ©söNá‹sUj#ÿ¾¢YÙè˜HŠ{Y`‡"%"öïÜpK†JÖB§H 0…øyY¸¨˜÷‘åÚLž˜ù£>iË·EmfŸ6u—¾5,‡V‚m$nv—Ú8µ÷¢Î!~º¼I9oG..K¦ˆh—Ðê¸{lÓ?½úš¨Ïio‡YufŽÊ­c~”} öåOödIþBZâqúîuÇó§î™¿Y×òe¥©$³ÓÉhNí%(ž\5=ïh„Írj,lß²‹~?±ëx3û½|† °švÆÓn“lÌmùÉKÙ4]BFÇ æùnªœ#cÍæ>FäYk•ÅõfÚ¯ÏXŒ` _m¯_>cÖb>õ›ªÃ(Ɔª¿™MaFÈUcí]@ÿÜM©ÚUÍ}5z;tlklh³¸I¡›¥.¤Íke¾…°ç·v‚)b[áµ8FŽ Ú7‚2]Ÿ+ÄG¾Ôêö’1=¥(ʱ븿¦x[/#3¯´4šC𞀵ÉþL=&Ï¡…Ÿåõ¥a²vÚáûFº%E=oÄ,¥òXþI9òEÞh^iùÝÅGÝ"–L¤É?ÊA¤|XR N,<¾Émj)t–Ρ xšJ‰o]Boþ%ó»j¥Ø ‡.XD«úb0wÇõ<ÜÿØ% k\ƒœë¯zeEjkd«Ñ!‘î|ó°ÂF´ÉÉ;Š&Ñ9¢%¹mNõ+ ÉyàÕ»©ÕδŽ'¾\•-ã}Ü!úpÌd)()l<êµ§’™o‰äËIJÏÔ¯jSNùòÕ‡bäôµïo›œÕ¼ª7D¤—\["Óï<ㇿE‹·›%•Ã7Ø1)Ô×ו“…ê5¶Äzá K°¸²ÞòÍ`EÆÒ]V•ÞœW¥¹ûz2èãŠsüÚyº1öZ ä¡Ù4aSØÖXîeVýÛiÁ§ÆhGVpºŽmÕL3]¬üÌþÊ´ôï&˜íÁSKk!Ïô@î¸aµ1 â”ÁõRÛwÅsADº7XWJî¬ ’"F±D`³„§·ë ù ‡uô¨l“Ø$uÄìBBšQYäÞ!¯2½µ¼Œà`׈Ó#÷¾ÓÏfü>û¯¼Ôèõ-r.úü©Àš²ŠARbÛBÆçÌI^:¤†=I7Ý^;´·ŽmöúçSy{3û]Ëõ6~™x·Ýò¼`Ä8Íéëûr˜¼å’v4Øåœ)ޱ?I‚¼,æ«Î¶ë5¿ãÌ»§ Ç›ôÛP» üñé1 á‚°Ñ»Åþ1Ó®¿³ê˜0söó+†ýÉ~è–& .Íwñ°`:*õ™¸R•E¬äÍ{„~æ9ŠÊyªW]ÃvMã$–IWT;rxýÌNÑÕVÅסÆß’&sg>¯$ìk(8¦bĤb¶Â2Ø©´A¹þæN U/œA¸°«Ço΂êh:ØvÏ/ àâ) f­lÏÿýÁ+ÞFuðXx,UqÇ«gÈEÓ!,¹1ÅYhò©<~o7QóÆîOâª7h)öœèRÇ\÷/6× Ôk¢Ï1-­À硟ì½-ή²ýPö‡¿bú*é0ö[xѬP  ®L$ÍCÌÝÅf¹š…†/„©SšB­/ùÔ= WÉÛȰ;¹¤Õ"à4e­­ÂðPÝ ãÝÿ\¹W0pч‹ ¨PÔǪ '1|³ôz† lÅȇü˜À|òÌidbs â^a)p+H•·+Ü dk „⣃êÏ ñ³!«óp%ý,Ú²Ûœ«¸Þëþ‘N ’’ xÔ˜w´¼GˆŒ‘0›çf@(’ †)8‘ü†+7Öï’VË\¤´´#½ccH³Rú„8k„ý²ÖÁ$uFz\™×¢YkÞå”(t„?êø)¶Àó  ãaÎèν¦¥Ñøn½³ŠlQ¼Ž”4×€÷U_¹ŸA4O˜µ ðŠ©oûÈà’w/|T¶äK%>{¥›èži€øl(í#Ìã“èŹü¼Ô4¥¿‡š:dNA4»b³àyç¸Úâ03×äÛ8~>ÕÅ<’(#ž H¼\q½]Šè¶h0gßmœNpåtìcýÆg;“Ü}°#‰F9ùÍ5ÉWàŒhZLãvË%;ÊY7¤6‘Sˆ¿©Åœ3_ä¡ÇdiÕÞñ¥Õ›çËÒmjdÞ Å8¡ùï=[‡ç˜u*AunÌ"¬Ë n=yt8P CÌ]à–.|µôåþô“ØZNJòý°3ë5bùHåµg6!ÿîTÃÙÖ#L»ZƒNQ»:V 3_ûu„Eª L\„80„óÕKq?¨4ÎhJýÜäX0‹"!8VarÇä@ønscavìÅõÎlEîFÓ³éÝ¿Qp]ÀØ'N¸”¥?Ç›ÉK ³q»›ÉëHFqÿâZá^Ieµo’çu,~t«Ó0Æê]Ýè¹”bVQ»SØï"§j¾^©­s‹º œmé³À[¥¬û¼+vQe…ðB cäMé á ZZæºRºüe4 L-_!¤Áý§ÇHøØ÷XxÅDL€rJÿÖr™êöâEf XW2 •Ïår}GJÀ `¿­ìñÅ ÷/½U KÌaèRÞm^بXÔÖ ”ï¯*Î;nÇÌÒ­×C60¡õ‰·ÏŠŒpPexýj÷øSÞI—ý‘Q®TN)Ô¹ú¢§WW"§2ÜåErS{íIK¯MÒ0íèm­ÀLjIþ*qY¼,Ô; h„í‹4=ùìš3h %x6D°!ždºÉ)0#ú£=÷Ï¿DÝD6€yv±ÈžÃ}Ï£íÍ&>6 X¤úâ%í5¯nj`"®y×U©ß‘¦ºyçM%³2w\®Øå~JO%++áÏqE&ªCÚ²q†ÐýÌpôòíZU$aì8#½u…¸;. G>$óh)O>»ÙéǠγ/mMPé{$5’űiÈUª¨ýÍô* ?°)9W&•Hì‹ÞKD3Kx(rdƒÒê¼j¤R¸Œd·½ƒ¶¹ÀRD71—%üÆ/½ÆÐåÛ>ß¾T‚[«5bîß\ãOãfÚp2ÿL Çþ“­+Ìå² ¸e:x#Ö69º{¯%jPo»ÛÇòñ ùÛ®‰Ï1@‚\¾ßr¹GY‹ÀQƒý.ø=ÏC&šè/ÛLFáýR«—‡áx‚)U]?ÛlÖ+ÁJ8ˆAr/âÕ­?Þì÷þ@Ä §ŠÊÇ0娓wÁë†å¼€ ú¡¥µ]s±q¸JuG3~Ü K`p@¿›Mg#õnLÞ¿Ê»¬¿ÔMü¸k×@,¤êõ…`FÏþ^\¦ˆ d¶þÔÇ;›†Ü´`O)¢¡ËŒšÂZ ú¼Ï‡¢WO™‹×ý¾ä¾‘ ±Ü%¡¸uçñNÈdÀrž+„bõU¤÷˵Ҡ'&ÉÓ´á(œÇkØ"HWúú°£øáôÖõß'|CÈ»Œ­’®aÛ>B.ÿÍüÞæ3ÍO|öoºì.ãØf—tÕ§µµzÃŒ[\'a{·&éNÒ‘ÄW3½P‹è‡HŠvy’¯ƒööÔŸþòèF!Žv)œÝ³j 1¥§(©oÊTU¼ÞõôДz\=_¼F v !w¼­D¹âêDh#Ƕ{K9 ’Íû³cGj ¦_c d/õ˜—æ©h6`eõÑ‘ÝÄyÉ'{H¢@î…ÂðÛd÷Ë­!}äžÎGœ’Xm¾úÒdŒ˜å±"½áÐãW…²›vƒm£ÝÖÔJêF°XÛ69M48ÚMüSP¤ ƒ/:—6"‘§ƒök-l8F &ýXîË¢hž& Y Pv'’öì•Ãm[ç°AË‘D"&«Ž:Ýyµ ¬Î8„¸Wõv:PWÈ·©Y:9Çé¦ÁR~«yÌëAëb‘)Qêv¼¨ÌYaïÏw¿¤¾Á4þt<è^Þ+Ï Ø×¥†è´,ëdÁQm™ª¦S*G˜›0|›¨´ë0cžQ,/ÞE駸£yaÍU#_Û—ÿÖ칇DÓAGÇßQŠê²ï€€ñ½'é.É"CüÜò  øºéN‰ ÜŽ¿>“2¬¨!Áºx͇2uÅc˜’‹Æb!Å.†-}ÝV©qºëAÞ ÂžÃ‚Ï!݃”ƒÌ'.áEì¶¥5ƒh‚bþŽ‚"}i·}ö<œ ÇFc•›•GKJt³Ü·ÔÀ¥`iDú/æªSïaœ-i0å¿N \mn*’þ±³ëM¿´klm ¢b³°”&CÇ €©5n:¡ã(“l0Î=\-«Á¾™¼‘¡kJìŸÚGˆSûØ¿Kó Œ¦ ‘Šj".{y<íFµµ€èº®Ö]Ÿó!ˆrcK‡¼Ø%øL‰Ï` ¦Çü’©¦dÞ†ˆ9ŸU´Q5?:íUÒt…Ü”ÆÝª.O[¹‰ü¢ùr=9ƒjqgtþ¡‹áÄ>5²(lŠÙþ¾³}z4ÿuʤ/í$ˆ ; ø÷Fÿ;zÝ/üFƒ,|óÐwNf{ǃ°gµvm5Ü¿_Û@V‹‹‘,΀©?àÒuÓÐO“º3Á°äTÓ AÂ0ƒ(¡<2šïèy¢gaô.¸? "b{*µƒÍqÛ¥õUCñA7\¯ çY‹ ‡$¯V  øWVýq¦#>¸I‘8±)!’‚È #Ž}:~ÎI„´Qk‘&›hCjXä#šž÷Ö×–´¦FÀ‘ÇýmÄjmŽ' J×Qa4E×¹º;ðŽX…€+b±­ü—‹þ†ø¢L“ß&ÉùnÎ:ªÂGdžÉXŸ1Yà‘\[.Äáb¶ðS‰.®ôˆ`Ì„¼å„!>Çßæ›…‡.Ê<-üy¯gámÜ÷C‚I“ï#~e¼Xœ{ÉRMÝC{…$+—x†Ý %†>ŸX@Zy|¾åYç|"U³=ÛJvÈå3i‘öÁ!ÊyXØ+®« â·G\sšÂKƒàmz3FŽÔ¼´öMÍQ5¼..÷t¾¬MÔjµ…ºŽ+±û¨@ª²0>=pÍi¤MvM<Ú @=¾¥VÔñ—ûUèíp#×,Ÿ§F2a™yî^[Tm\QÖF¤­ªóD{,Ó‡£6lK†”ÈÇÉ“~Ü\vœ,eÖTcºÔ(x4*.¿æ0y&XÄ>C"Smʧ»Mi8ÎXEt › i1ƒôäoøJïÃæ8e³à#VmY ÕfF¡'x‚på’†¨úViŸ|C}Ê®æ¢üù'/*îÙ«nŠ6ùAÆ¿–ÞhãnhÿÅ{¯B.ló¡-CIñõißãÄ&¿€ÿV•Ò‚Ñ 'ãŸE¤C¶"K-l‰BkÞ6£ß±dÍÝÓ΃ª¼lX¾k@¥c=†FèŸ[’-³ªŸZ˜5Æ{—ø2…Hû¿1~¦m«— –óÂ!­ÔF-¶}.³&Ï %ì%r š– ALá¼h౦‰ P©z„[5r6Ëçq¯£xS-!–º}Í«iÒÞtÃrÉQN^Wƒõ²ä­ß§KÔ•*†T4† úåö”ƒÝ޶Зhµ³ãÐè•dÌi¤Æ¸LBD^-ÄëZd­‘d ì”ó¯x$lù@vÀH—#ötü¬Ñ›µ`cXùIØÑæÑ<šîª´šw5 ïkÄm¢`1f¦)ËòsE ÊŽWY×òxxãÒ3¼{:gñÁÇûæÃ¶”»áß -ÅìêâúKEܸëß`<ô×]|å…@þ@Ádc™õ•˜=Ç+¨ùEå„p'öD+–ŽÞ{{ÚÁAn•¿Ù»ìýZÕÓi ]IÐòÿ3(Ï4,wú†ÖEN¤³ È•Þ%ZÍ|Î2¤cÛnÂé’½|\f’ÏèøÏf«<}Zë$ü b( È!Í9Ú%íê×TˆtÜàÛ0ç?VÍÇý»R„‡¶hmI+:±_óà€2Þ ¦Á³ŽQ8I<æ5sò6œÑqªvrkžÍè,Ó%B/#î›U'©º¢g ‚Sñäé“nWËD›ÅV¦µC}X· ‡ƒ×ô€dLïq7%–ÝØx–JKXÀavü†“bBeÃÉž’aÈwál sd€fïÃJÛ|<|ý¦¶±Û×DŠ‘A 2æÓPµA±¸7Inñ€ÂLqÈ`“qšVáþ"¦lŒÒô®+çÍäÙꃮ€re–àØá…á{pc”2ÿšýz—ÿÁ'铸mÓÎDŽe £KÄÓy;Ix¾ úC^"+õ|[—Š1ô˜¦9Ú#PC9VmköÅDAÒ 51@°Ú[0Q(e£¿ª¨š ™hý á¢D äYÞ©Qaˆë%ï&(ësÕ°F»°œÒT=N*yÅæ’l¡¨(ZóoH÷Me]S=î©»ßo9luIêZ”nbSZOqopÙ8¥0aQ|qŒ!ò” ]Æ×ï¸ö.½T¬:ñ4®ß ~´\ž—”5Ø,œ¨I¤$äņ®|òW”Nã`„¬á%£5\˜¸ã«wÎ)5¨[¦­Qü¤2èzy°<ÚG¼ð\•\–¤$‘±LþIjh†Ÿ?Ýì¡¿+V&=Küì|é¦ÿòPd©}»ùd“ò5H xä*ÌO¼×kmVl_Kq•"CéëQž(r¨'ý‡Å}cnHãÚ^#MùûáÏ’2í<Ùªð Æë«Ãò‰ÄB¥Ê N‘?´¥3v^ˆýyÃÀÓ#óƒÿåŠÅ ýOâw UÛje|$’Œ^PdLˆ9+ðõWëFZN©NûN™™YY¯Y)Ç·é´°Íj¬dEnŠF|·‘.±åfÕ ~÷‹þCÊH¨¢¾å ÉjhßÒõ]^åÃmM% þ“EÁ—è§M‡~Ýò‡ˆJÖùNò]¬¯¾éß¼pŠp«N›ð±§ãY-à¸è`´R"j&לb×èï9™`ŽDB4ÖÁh$ûY:^*ÊÄ’ÄÉGŽ•ðv’õ¾¥ö¬d¯æÒÓf^9—&õ‹ÍaKwúE× ÿ“/îd+o~³‰éE{¡•N‘²ª\Ñk:!æBß{ƒ~0÷êe(ãø.(F¸ÃTæX¢Ïò÷1èønŸjpCã«ccÿ> ‹Qq¨òÆÕ¯éé$Um0~¬ªËC"0–×™ÿˆûS!\פ“ø8`´«-@4x«Ýÿj¬‰ÓWvÚ(3° &ž‚]ð^á»›@Sð¦pµ_³Ëºò0Ú¥Méßõz¼7ÂJ,FãCËÚB¿9ºõYžc4»‹€Ÿ~®ŠÏ{5† Ë)YÊ æ= u®¢B£â&•*n5ؽbö&QÏÎ0ÿ fýx%rËgä¦m:…kkúîY&ßÊl/ãKJ¡rzû½Èø}4é²Võ§®êðì³\#Ö'7ÓJJÕ‡b3ihCB•ÄšP<1tOg™ 4HDßµô‹`=*Uz²»q”ZÂÚ¹ÛùbªW¢ó¬#æ2”Èj ©†´xÇht…ÁS¿%´Gû¯•p4êæ©öݨɲƧZç}0µ¨Íæ¼ÒfÇž5#­ûTÏ+äÁ9·KŠÉ9¶}¸§G†¨ö° sÉ»[eyõÉ™øÚM‚WÁ*ßO&{ÕhþáC®üÜ” ‡Òž‚ˆ£—=fÀX¥æ¤4“²§vˆ›”µjƒÍ¶Ã¡rÔBÓ8[ˆµÁº)Dw7Œ"¶Z±ô‰–ù!&¦¶‘:zúvT7Þ-“$¦àNy=VnÇ%Ã2„XјàòMþl }ÑÊq“9 ¸§ žÝˆô·£b¸fb¤õç„ãôØ”B(?L(i‘ÞvºÚø“è"1 ôŒ‚æ@f£RTSØúwˆsc½Ç¹žŸ¹Tî1„ˆ?>yó«—l§ ôï‡ ë'cµ5}††*Z È:æ°.§ò“÷J®¹-÷¨-ÝG9ë›p•ejÂÈ7£N9§„kQ>óD¡…¯{ f‘MÿÒ»¯B›=øý¤«Ë@â!ž~39ÙBÌ\2Š8kuœÞÇu™l7¥òË 0°ˆ9ïGPº¢Æš|UŠiÎåñ,9ÞûÖЉhQ'VÒ0Ø9ÝËóTü!»3k,ùÑh­;NfóN÷­í6ÝÒx+Rù(D«ŸÍȸ Íãúzaƒ#Ê™ü>¤*7ˆ¹_¾0J÷4{d§- Ã(n~´&zÿ»`ŒAåV0ó…4zÏâìW£˜îOƸŽã0-54Õ¬ãÓ£,F…ØS­6 ‚ÆÊjçÖ„û-ùj\¡CÏEä»Tµ4q§åœ#+#,ÿ*íšA®iŸ ˆ¦áÂå­’V^¡h^õÀ‡ö¾îº!5aR[Ú6ª{dTm#ŸŒŸ¤Sja”p¿š\À"3éƒEÃq‹d-%NÀLsÇwĹó]n "ßKq¯aƒO€dªió'€“‹îñ'ç§1¨½·>0ièhZ¿!ÈÁòþ§á6j¶á×An ¡+R0û €Nƒ¡!³wØ7;}50 uç W¨ÑŠcšf+A,ãH¯rVKE[ 8EÈ„Q‡ùRð 21 >éŽèñ‹Hchѵ0¿R;¢ —efñbÇ Ç ò˜Åû¿Í‰+à«ò¬n|Ú>™ýy¡–ïv¹”i7=¹;*™†âÛ›Jäæ[+Zo pwí2¼àæðò'š:L«ZH8Nv#ùÞ¾ ýã™=?Ãö!»Yv|;‹Vžšœì‘r·e¶½­`Ö«ôµ‚äì‰ÕÛK sufú~Îd}-×ô šµPÎ÷ÄÙK·b ¿: ši’YÖ"C’…{ó‹‹üjÊ€N˜ÌŠ|—^ S¤zà<Ħ|ev=T.Ë¿½S /ÁðT®e(âb”ò¥SUÄ×ÑÜYÏUŸ/}Žú8 }ÞÅœ?ûµ(z´JYÖÀPX!Æ5ü–q'5Ûü'E¡²r˜…+F…¿Ìø4øèŽŽ›éá½hú,ËUða™R¿­å°Æ=½KnsTžÒæç`áùn‰š™.÷­ +ê7Š }æDÛ?4|Ú~€Qïøw1ºNjHìÚ2K÷ÌêªMÄV2P­íOu¸Ð³Ê/‹&'fÒîÅúKY¥{úæ¹NM´9‡Ä•™u)Deué÷ÿõ ^ GÙŒY&Ÿ|˲¾ÜU|rFçbEä½ ;p唸½ÝÙ[t8cuÿNã1ò¿È½‡ª?l|àwPW;Ý¡HŸt(¹‘_X°¯¾¤Ï»j<Îi8Ù£)äŠ~ÐÂQ™ò¾ÃêDÕwT""xQËÃs’Û©:?¨åÙf2¾6H•ÿÏ á–zºÎXnƤˆHòÒ(«Ù®ä±+`®¨ãt8Ë£îj‰øíoYʦ Ü«ê_çáø ·b×ÊzíôƒøNŒƒ”æÓ+ÝyíµŸõJ›ŠëÀêi¤Ì<%ÚFžO‚3? W*`O@Ü|¢é ¥º7FŸ¶?)£qã¯ùRG¬³˜ ‰…PrFmÏz‘ 9–þÄ™õáØ½LyÉÓÓÒœœ5Ž,,g‹>¨©#—#³Ù•ãÍü5Ï©& qlQ³½S´ˆ>ƒ"ìRG"eÖÀ¹A½K÷ë2ã@vÁ·¯øÂ°l¥6M rµë·ÞéÏ¡©pôÖ‚@U•)‰zkZjÐKÚÀe¥c@1»LyŒ©1ž×¡äÖOáÔ»íØØ€4}Jz ¥ÿ±Æ¡ÂÐìüF<2ç€)…ôžªDþßÑi =„·9>/~}öÌÂ7GïzË4Z]²}Ö?ôвû¿kV‚ÑÁÜË•$@³°ÞÌâͬ°*詞Ìx8CJÉîÁ{ª÷­º8ì@6ûÞ§1ý šð@W"'î,U\]V-=LÒ‘¿ÞÜÀ… Ö )Åáçh£',]ãÈŠÕ‚±œŠØÖ\Ÿ p£G¹Ý·¢V‚04Qö–h¥¿euXˆ&nŽ Ás×ÓºÝd©mórUG ¥é†ÿ¨)Þ%4XàÑ݈D™Ò>¦Æ™ë©ê,t×XÞ ¢FdßL‘ˆ¡uü7L­EÄm¦Õ¾·úc¼{ªÔé-!P ïv~.צj¼Ôðù·K‘‹LìøèjñÕNÆ~.÷wÆ·pÉsi6ðÝJ9ï½>1_nËçcj·>2æÆá0T~ÅWã¥àI‹ì]}ž…[:·-'·C#ˆ^åaˆ¸RÎÆsOùš«ñÕN´›Tp¢Ñdé¢gi}ÅÓ“­OÀeM<åÈZB¾ÚøoÒJâ7þ’6lܹ(ó~ˆm¾xÉ9ÌFÔ Z6Â[uºZu‹x"å4ò|Ý4ÝFÖýTœ³zTwªßÖ—ºšZ=„©É8ñܹǖXåËó'âØ_RÁtYj€V2ÖÝ¥¬ŸZ•Ž×µ"¥ên;‡p°¤ûVÜ1ûˆ,(öôªýR4wàu´ªJ,W¦–Pÿbé-¯ 0² ?Ø–U+·2Ï?ò Ü"ê~ù\ÚéŠè71M4­Û+”!—m†É”bñÚß5…Ñ’‡Ž£T[ ¬JÝÖÖJá³ô4ï” N®£{ xÉ¿Çm¯l¨p3¤h(§š¼ ž¸@·Ò¢n_üÓoÖÓsÐé3éRAá‚ÞzV›…«3Æpø vUeç.¯o‘Ð{ÅR „h¶—]TTÈ£ëw@¦æp>s:8ñQs<ŠÛÍ‚—Ü©!¨Ä÷§`wàÆp/Ú>·S±‚ø•.OÌ¿ˆ°Ið0 x2Vûd¿ÍÈìW…`txØòºÐÊUð³ßlÛŸà‘͆×5¨ÍÂBG’”ú܈=¿Ì@(‡ ÒJÐ ²¢NH/1sÙp3ˆ×k© f#Á™ &ôh= ·H …Š2)ÜJ,µª„¢X ›?éžzí j^žz*ÌÜgíä +Z|¶I'Ùëf°ŠL(H_“ŽÂ_m;€Îmr‹Œ+ڑܶb´ÿ* ²ÐÃHÂ!ÀËFe\XªH;æSh®›ÛôÅ©…è“éúC\eçöl~½¶ô‘¸ðLzÙ±­AŽ¡¦<ää :˜¸”mˆ·1 Õünz[ç­˜ÊÝA~Ñû4éÖL:P Óéß•™­Æsú™3„bEÒ#7Øj§w‹9£¯„¬{­¡ 몾͚À]µJÍQªØð¬[(ÖK·öóÞ¶hÓ׺”¨MÌ*v²Uõkbl‘—š(ÖÖkTìpÜØWÍ_°zœ6Dóµ£%@]8Ù!¤Ä±+â;MâaQÃ_,ûóÆ1s¹ƒÿIH¯Æ®Q¸W1pãÔä¶_¢QBû´`» ówηWËSš@õ‰íÒl·ëÔa“6Cæ/Õ¬z[#6íߊ 5Ìc=#Ä_éÔUðñ¾°»iÁMs¯~rOCUS6rb”€£…[ûçÍnaÏ¿Ñ<핟´ žˆó?Û"|$¯‘¼H¾É/E£Œj'¡ ¬Ú Y:)ˆæIF÷*Íqú\NêÆÝÒxã¦Ó\§ùÄ+PB½–òÜàu¿î¦1Ûr P›PŒ¿Õ_DT}Y8˜À{Ø,4ÚÓüm¯×ºËºj±±ÃákÖÅ=ÒÉgïWñ-öÇJ¦!ó¦ –mû/M7ÙnWõðÖñ¹2„‘í«ZÇ,×@ä°ŠÐÛñ•Ã\cLì^½Á`†HÙ®êzîÅ… /K´EFˆ0wØ·r÷ö Ó# ê{b*H~{¥­ë®~ÅŠÙï’ˆ%+™ÀvAÅ 5 ž~ ÍòHV9ƒµAeçüSIåÍZ»¨¼:ïP6õÃè]gL‹ xéo¥ÆÕ<(ÒÝ~_ñ-(×?ÅLP M÷™@ŽÜlmTßz€Ç3!ýÝ=ùfb¢Ù1µ1þálQ_¶Ý^Ñ_¨BöÕ‚P§Ð×.(=MÙÛ²\[:ùä-LPslø)1¤ø2:q—š‹'™Ü9â˜2Š\vU„ܰKl0L°¢­ûO‘kŒVÿ:9ÓJÅ-ÄÏ!+[v3Yi#O9ŒO¾Xß"®ºuj*mVκõ¬Î#!…ÈÖxؽ˙å—œ=ÄØÌZ˜fµýAñ"ÕêSæ µ‹å‚d!õYoÖç˜ÖB\^Ê—ÉèÒ?Nða}ÿúøÇÐÿ†Ynû¼þ÷g_y ^°ÿÕâîÃõ,ÿæŸ0T²5à'´HÜÆ£Ä‘óvð”y&pô?ƒÃŠÙ`¥›‡˜ºA÷QŠþØôÎ2á—g³O§ŒKýG‰ û×ß}1Ü“’£ÅzOn³w“=­ž7Ö`åNÿ²5~eŽ¥ò#s…øš:Ù. HûÞ'µŸÛŸXüi¹Ã;§—¯hþð|WÉh—@èÀë믲Š0!·•åëBnK…â ×õÉ[Wåép½ Ú¿±:ö­3óIÅQüÛOÁºQ; üu –rÐá^ í*o‰„Ûþ yLÚ=@Ôˆ¬Ôz"*Kçt}5Þu@ó „¸¸ñVÖúÏáN¿ɦ'Æö@¼hºŽ;”âë‹!&×ïåíQCm9¼s©»"za‚è«Ks…¬Z: ¦Œ¬üë’ôÙ˜ÕSØ4bîÄ‹î÷†D ℌAÎ ·§šØèilsXYŸ½˜z÷…U¨ª¨Ñ›·‚4M©ÇgPS)aö›žã ã†ÚþÇTx[¹A[Ó¶ÕßÅAíšö]}ƒ|Ëƒì² oðR“ÌMÞ z—.T{6k³pj úGb12¹VÚ„î½–=95D¶¶'-ã‰Î—g¸òz ¹•õp0®?d-G¦š;œª‡Þë±J©Cþ5ñ¯¬0Ç+é 3]yn=/4mï‡ý#mkÅŠE6Gé>š‚ÿÊÐ>!pÙ'¾/<5iÝm… 7vҥΟå÷*­½î«žEy„~øañ\2ÂŒjLDd²D †íÄÂâ’NïÖwx\=ã¦o¾–tøås!Htí=7nÕª7{m&EÊôé¢jMcárµ•(ˆì;š2Z>ªçF•›3­G‚ùÒ¡‹jÌ颈߿`Dv£d=uñ’ 8É=’~SleH<½ý ·ÿ˜ÿÑÍ_¹Æeé|ˆ[r[&ëcƒq˜ÆÉÝšw+:myò–,E´™4Fâ°¤ÎjŽœZȺSF®Z ¹„÷Ø{åo {i9›‘7=ëtÝ ¤50šØèÙ7OêÄH‰- ‰ýê˜ßC×ÝRú~Åb‚7æ;s=bž°Ô†º¬wë©É9Cm‰‹~ï—«g æ³½«&XQý…ë%<ØÚ˜é§ôG”·Õt„¾-ÿñÜ‚QÈ×гY¥šï™+µ?:œ4î Ó)VÃ5pÞ¿{qh¿ALEX§ºßEì9©1Àø)-;¤ë¦…nó¦çfÊ΂Åݸ]Nn\[KûýĤƽcfZZÎÄÕ¸°yáŠe·E߫݊zæQ{ „ŸBaœà>½ùâ©À.°(²åßÂ&;ù·Ä¨oÿFxIþ ƒ0/ zûü£Õ!rL6Ág^^å|LZ•_Ý“Æ}¦N¼ü"Ywš^\Žns4°_v³^²=iØ”fy`銓To”ÈtøkæÍݥɟ·£)4*.î8¦ºQñlƒ5aµÓM) E7"÷pqä ÔOEF¦w,_ˆò' Ÿ’Ÿ bÝm¡7ïÚêô8ù’€Üc‘:²fÐ}ó­Ò»¢?¯jø[ S{ˆë®ܦ8¦9s©‚Qô ¡¶p ÛëC(h¶iàÉeÄ!ŸïNA…Ð@öCè—|ÇxÌ%ÓùmM¼‰qRמþ„•ïVõ £v* ÓôAVN¦õòi÷@̯U€ÝÞ[1¼ìç쪨üÉú¡Dh˜mÜÎr¡öð’v¡|“!ÐN4äÿ"–Ør7ÊÑx®æðm¥m¦†éÏgR|ÌÙñ¶Û?¶ði¥ßK "|ºFã¼NÖŽ–r½œÛH¢î0‰ª-¯µpNèÖ½ÚTŸÙ_íØÂwŒ„QŒVZ¬¹¤(HCXƒÈ àšb.樮7-¶Œ5MÑGz~xü]YëÐŽ#;«G† þ¸ÖÜ»µÚ§<ÕP6 $Ѓ²GX7v±&qd:ÁýGãŒùl'jâï7@MlÔü S3ŸÄb¥þ÷¥>n¿±Ñ Í“tBh‘pwdX6«\­œÆsn-€±ÊÝ)²‡‚¶·VOüOž„§Ü h¤£ûŸŠ\D ݬsG)»“Ä¥ò1Â^>9þHq/àŽââ F~S¦®H'U,È’|ôVüÖ‡Å]‹¡4yf gb߯a„ÜÚÍÆŠ€4¼RóGaˆ$Éù˲åÿ9K#¢bTÊýì Ã$ù•vú‡»ï}K×|Nç1-GÖ•ÐTFâ"mãÖ§/Ù¶öÐH¸žŸ‘¼-jGŠt½ï‰È »Fý1£±)=ƒ¬N0Ú•è5WpI§8Àt®5ij{ßIµ2çÑ‹1IÏ'/Æ$=R;„íW I¤k;YfîFŠYa“:ÕË’t/ñÂ×óèŽ ê\"½Ú·…™¿Ä‚½w·£n=¶h/^Ðqš)y©Úv.XkîÓ1¸y…ºHémB>ÄöÂVCg’M-»§ÔXö.Åyñ*{Ëfå™ÄU1 .ÆÛÞA23|ÔirZ„–yÕêÁ¾"Eÿ:ÜôñL Ý.Åž‡ªµo Ý“÷õE‚'±J =œ#þ.*¼²ð³ófùX Ž)‚ƒÒ–Yéò}Àù6ÒÜ'g–¯Úöû£2ì7B†1ƒ]óûœ½ú·Ö%6Ê€ ÉÚS¡ WÌk‡tov¦½êU'ÆÏf¼)¹-ýúæ×á&“À)»‹ÐÁ ýqÝaòð˜qð…pâl"_ãŸlj¦’êaƒ—åÕ3¦®Ü$p:+êc-ÀteL>³õ5µÝ\Ï!š¯ŒŠ©¨ñ×u%YF6ôµšIVîƒ^”Sn“AÝŠ@À®©¯Y±¢®'J‰¦¶²é¸©Zº¦J(<Ôbáº"Ù/m…®-:µÄî Ý·ÚÆkS1ËÎ Ìjü2)Þ º÷ŸÍ•ÚgµH¿ÿû7È+S.m­õ}3é…€¾î}•Èå×´ Õô{ø»ý±ªöâÈ;«"M(”0Ÿß"—¨$äš{¼Ÿp¬uüt)(í\¾”žÿÆ“/è#;µPv¦k¡Æê{Á̧†onƒ1”Ô®=„j—&‘zÝÄ”ÃØ’£Ç@nrP£ÝsÎe8ö±Mo~ž©DŒT»•t[nšokOð|C›»`+–¬nTÙ˜¸äAótã´#ük t´ìð+y¿v±ÆM{ð¥ñdÔMåîµ[Z!´s°†jàÄüúÞž~åËsU-ÉžäPÞ¦4}o¾i gŽRK4§SȽ:êää=ƒØÒO”Ýý×ݼ}¯ }jš!ꇩHL_î•Ó»I~ë8ð.&ø+û=ÜØï~¢Vφő½?yúErüÁY'¾ZÒ§3Õèv@öPyÝô+àØ+.ä¤ç~0T‡ %ᙬ}tŒüeaµêb,[îÇ5¯Ø¿q^€ÌñPpÞ–6%Ý®¤><’¥ø¦]D¼­¬*ÏW9'?xs¡dáh¤ü%¿A+“‚”^!Û…ÌA“Ù"¿@ª«g%*Pn¢â8KØ\&íËé=ŽmuˆÇ[.Ø¿ŠUâî5¡]kFGìij¥¡ Àíø‰æž@~NÜ&€^… ÚÐÎ" GÊëèBátäsŠ…’Í®îÇú=SEðív^Úœ?;J[¢uzÕ%ôF­ƒOæ*u‚Ì=ò‹(Ç Ê.)XïL“¼,”«{4‰MðÀâ× Ë|¬¶¨"ÿpd`ƒ-d¶µÇ¯Å‰ûs8¸ºNhZÍp̲ôÅ\ r âk.ꩽãÿ·¼1º„æ~ê“(,ŽÊªUøÆR$Æ4BzâpS&’Ñ«ZÜjσ®æ¨g’ÿD´^ë–Ù"¯ïˆ¢úJËcˆ/­ˆ&¾wÃ_Äe×%"2$ÉfåzµÄßd¿›™·é+aLÿåys  ÄâÎ=pPÓE.æ½i˜VäDY_‡ýÔẊ‹÷æÕ‹x \ˆè*&–=×H§ÑQ P’I—3vñá¯KÇÔ…È[Ï=«m¿« «U‹Q *Acѵ“ÔótM<ü‘2Sa9gÍ»˜?íC3¦Mu`ï/¨8ýœùWº‰¶È¿µÝØl6”ZTkÿ$¿\: óÌ5—ò¤°Kî,À¾ŒHTQxÆö|úErüÁY'¾ZÒ§3Ô0AŸ22¢þ×UZen˨=Rİ̸ûWÅÐG)lßÜJåç3+ä¦8Øjt“Ÿ¤Ö;ƒsiÊÊØ‹ÑÅEÄùÅHݘ8ņ„ÿò¹¨sÏoÝþ}φÙáÞ0s\r5©P(-DGís§ÖœŽ—ËÙŠ¨¡cÏì,ê‹-Þ%u/E’݇NÃhãWåp™ó>Nð«žW9#'ÚïŸß€ÉàõJ¼[Ë£`ž©áÁ ÌÞko;Y”„ ñ€¾¼LÌdÓu5…·lý=¾ø¡”¡§`M&¢R|Ë^ο´á"ÓÍ´Âðw^'›Ã°Ò…³±¶dQÙOÜü=Š«J+ŒævÙ© ~–Ø‘“ÕRK';¸™a¼ Û2i^4ër8i.¸–!àV %S,OB³è¾bûênŽ5*=+¾Ìa|ÐPM|ùœŒÔÅÉ^»oî6f¢”_B5g 9UË+@ø3bW#äçÙ½²È|lù†ñÕWbý?õ¥±7+»Žüžäš‚3PŠDf­„Nt‚ÝlÙ4ÃÊ0/8& 5bH¯ºÀ4Å–Ð 5Z—ްjM«a͵”£ÖÓöïƒ`öÜç]ØÊ¸ÕÜÍ?1P%òáq‘ÛŸVEÁtÞzCÔàþã²jº†q·'¾BeJ)쬞¯^¦†!GÇA26RhüŽ|Ì7˜§AÞævƒŸô©ÄÔGK¶&z?"\`Ž>go¦ü y¶8ß“7‘Ý•sfyLNqƒÓéÒY»Cí|®ñŠ4dýÑ ÀÚ3$VBG}ÅO¾<îÕ³ ŠØT^eµ»Êðq¤øÆBþ^™c@ÜP"XðRq,„þ‹Æê>ãOÅEzxo00šR;À9 :yö5úÛ€Ë&üéëÀ¤ë÷-Üõî Ó¿vÂH*(6”WŒ@Œàb‘þ”;yà`I"PR쬈ÖÂz $ÑE-²ùoÔ Œï¬$øÂŠÞÐÑ\q)êÐ/rÞÎR£MÓ¥ÇlÈ2y3[RBH4ºmôUí2ñðP|‚¡û¼4°†€ÿm’[¨$ ü¥OÇY¬uÿ5²*µVgÈÑIK‡ üwáÏÍov©>_‰2~¶©ïïÒE-d…8Dé2]S)êò—ák=H3xa±(wÉõt©D=0}#NàMc`9“]9%|pÔ›Ën8” æÂê!÷H-¥&,Ì…YY !2¿¬ Ä#b@®ÿP¯n?¢L—H­M™ö¤B(1б >ï87!]J¿*¥!ï-^€Û,œåÔÀ¡?'TçÝ;¸Çý^¼d@D“̱˛³Ó:Œ×LPeíà§Ç̃µ½Hè)ÈoÞåŸZ ,ïô6ô4¦ŠÆ âŽÜz[áüH^x#V©H ¶BBCÜw^é#ôÛÓüïwÔR’¨ŸM Ñõ’‘?ýsÁGŠúG´;P‰p…¨$¢«•[ìÊ^ÆÞ »ØÖ°òÇòÿÿà,3tK<èvo­tôå> ¼T,l‹N;Ø’p¶ÚéáEò9Ñõ }à‚t‹¼íÒë×ínž”j£Oq…••ŠGëf_Æ*™Bªƒ®Li!&í~â o˜_æ y©ÃÈP£Q÷ñÓ£¢ŸjcWä34îíZ‚õ¼Yꇽ-MsR£—=)Â$&úƒ@Ÿ¯™ÛKõh*ÉÀ†ƒºbsÍ3’vaŒÄæ_A¶àay‹óev"±´w{FÞ+¥c´›SÙZŒeÀæeÁ)ô¿4 0–]ÕJöF­1QÍ³è ƒ;íy^–ƒJ ¶ÇÞ´l'ÇlǪoÚ¬jÉÛ#}mý2õL—^5~§ìe`,×kî+¡jk&ÏÃnpw®ðòÛÕ»ÌÏgЧói…¯ãP˜-¬ùIAöÉRÜß“Y qõB˜@,²ÙiªwÂiÍÈðöGwÏÑìBÇœÓ Ûo©„§¸$ž+Õ´¸uEx¼R¸©§ìÙdÐ’œáÍ3€6¶!àƒ ®6iG³ŽF* oôV?¿% é/»$z8BèBà€ƒÏ…éäÂú«>‰ÚLneñÈÇ¿Aä¸m—Ôfn|³—ö…‡2qU"G ƒ£ öÊÉ=äÐl;¥Ãb¢…¹²W'©Ø*bTuï¹-ƒ7ëeLz­È2Ew¬?èÕ~äûªÌáϲ#g±Aô”™ö9*‘áªhÏÛ:ß7›©ï‘kÑQ.’Œ‡ª ÷H":<»%.fˀ͢ޱŸ1óÝH×ÕYY+;S¶Pu¦8æY ³!ƒIóBkíYµHéѲïyà‘ ê®Ë–»ø ›êÀV k~(…«zžÉoåj²hÂ\rcŸ-<`cµcFÁa çÍÚõÿLûoŽRšáä¿õòjׇF^f¯)aÑûTÒ˜ÎV9Bmû.XÐzöý'˜+*u~Ù‚Q;¹Ôé\{Ú>ý—!¿Ñô3€Z°!1T>öÖ\â°.¹‡r>E„¯ ç €{Rô Žª¢9é#=Ï‚æqÕæ8ÆL:Ò4¡°Nà>êŒÏiØÄÕRÞyvδ©ã]Ìcµ£‹ÿ7}ÙŒ*3‚]„t´u‹×‹ë'bÁ¸›õ¿jÇ~{ÐyÁ xC"Œp=üFÌ}\ƒé<ˆ§±òÏIL£¶òû‚Ž­´¬S¯M‡…eÀC oÕ¨Dºh 0Þ…bfèá­ýzZ:ë,“­s5öS/µ•¡i†+YÀãw\&%Å’èí­ªw"‰sÀLi-ûŠkc —³ÁÓœ]­‘¬"I€V¢–‘։ƭQÊ?Xw‡Ä-B8ëƒëÉÙr(óÒf¬®Aë8µÒô?cF\elôßãåˆvš÷ …Ü[²*â e4Uj6ËcÄ#í¦~¹ “Òþr‹è4H"ÏI7 € w]5-ÔÉ+¤P~I÷®)Û;°"lc^‹6Ủ]Í\®Œ¼Uµ@ðy—=&¾ç6uÓfLºwðÀò)ôfˆÖ»ú~‡,œ¥ˆ 5ÚµOãæ—þ "8–#;•šNoyáRÚAØ ¨ë•º¶lîtȯ4íW=Ö8 ¿“ú5 ½kN¢Èœc gNƹE™nðQ<|ŒyâKZ2˜Ïô÷Áùòš"i¤òòÅ©Ò+Юb0SÖ3ÛÂ…–Rÿ-Nñµ|qÛxšW(+›%Û¸T¥vÏ̶sQ2d$”`‘8&×Aé~#s·Jo$¯ÔHÖ–¡¬®Z $X$XL&H²Ì¦….“©àîr6à U&‡I‚f5¦3,$¨Çæe áDWɯî¥Ke’†|#f0S›ù¼Îô,>/Gî!æÆåÆÙ£‚½w.†ž{ÔX%Š?¿"k¯#ëfÌ©<¨ÀvÀû_S÷2Péy {Mþ¥12lK˜œÜJ*ÀÕ»™nä uäžI%ëùî>´ÿ6öÝÅýéÆ<…›$— ÿÞµ©/í#©GÕIÕì=Ëu‹û"÷½|^ ß%%×`e¢•2 .0Û{ b}× D½A’1(nZâMÝAFÓ½Y Mê:m¥Þ24[øeóò¼vn¢´2åÐ(šN׿ܡ2$§ÈJ~f©¯|Õ!‘\örP«¦ EÞ)¤@¼ówÌ3_ͲðB#+FÕaQÐé)³zŒŸ»¸ À­$Ž•ƒÍ_™ãÆkFçðêôGdšÎ3‘§‹Ì!ªá¸`„ 6ø¤díJzä9톉"ê¥ÏAãñ‡p+¥M©cÛµ‹]’… 6¦RPx¬ðÃU 7&­¼ÍWüö¸²,€ÊæIüŒŒ;j.´“'¤ nä4¶»O´éˆm÷œÕÄÉt:ù·Ø©¤ͧŒÁ(ÃÐf!›š!l©#ûv}NAkk!f¢žÂy c1ùh»¢ªõêO¹Ò/kÙ9·þ籌q·ÍÜßM+–P\§};äƒKG+ÿÅõ ?`\Œ ¿ÞA¬ •·wo ®ßÛ¬'¥öök“§ô¢¾û²Û ‰å—ån°( Eë16ì|xLãÅÜ$@:ü±ÂΚIÓó×_S“ð­°ˆ¤† p '–©2+jXãÿÌ÷’Êù½¥O_EeEX«Eþt½7©ð2/HH™â¾wš½Bb¤×u> ÙWÕ†,|ˆøêí¼>É.1lð‚ýÙ¯\5ûgÔDy!zØäË+ÄBFë“{B0»IÊÈ>õM ¨¥ªÒ/¶GEziŠüh6¤=j,;ÊvŠ¢@kI›î^ŽaÙˆ;0«¦µ‰ÚÈ6¶¨›û£‚ãNß—ÇåЈegGÆôå+ÈFJÚ5ÚÀO‘Í_lËžp°.3‚UsÀm¼Tµ1ös4e©‚Š£\÷Ï[Íå {YJù¸xÙö øPÅð3õª«ž¹Ïo±O¯6ÿîDŸ4ŠP¡^†‡Þ5Û]][EâÅeÔ#Tñïm<¦Ö'|J…s’î´€ww¯@‘±s§ÂSÊ/³­uõ¸b׎¶Ò$ljœæ ¨¦–ŠNp¼~é#®£st<2ÏsDlÞ6Õ½4jN†”yö•ÅýUñ‚IHà0ê µ…¡cxW*>[4 ÌMõ¬#M¹™â³1~gwãw`#»Ñ{^&úE)Ê‘a¦Dê»wÝÒÌX’µANA+Lj è„_ Õ^0Q?‹uA‚P8H^“º•3àHÐΣBèƒ8‹É”¿CÿsË‘l¦óH¹2}öJ4ZÁÊ­ ÿjUÕpÿÁ/±ó‘ïÞ€*òØèXDXƒ ªº˜â VÝ’d¨# ;ÏEÑ-Ê‹ Õ6­W‰È±Íæš&¦2 04S–y³nìMYÑåbáïÅ+~¿I hd»‚÷äÄ9&:JW’P+>¿ ßx.§åVô›ÍPj'–›sâõXÅ{Æÿ$Eï[é¶‹šòB—cC.9OøpÞTKfª¹éYNb«Ú0·3y•.^ÅÄÅu9E¥+¹Mè›!«p¼£½Y~ñ¼~’•³ÊV³²™ ,ò UÀõkÉ ³w&¢y ÕuƒÒô35©ËO£¬ÏGàlü)ÄèéÛ !@ÃüD±Z‰ þ*ÎGQ2ìÔU%:É ÿV_݉\PQÒ …]ówµ{òý10í‹Â;‡ù-z÷Ž[Hám²Ö’NÔ »® … ?Fw£šˆ=¯†ìdD‘ÉE(Cg6ÿzD$QLI>Ðʉ;´Š|¹ ¶ØŒ^ÅrÝñ2È,„(TÖ¸ŽZé3îrV©#±¾?¤¯™ß ØOBì?™,ÕÁ—ú~}ŠëE¨ä<*\O­Z¦ 3ˆmY;‡‘T°¤Õ¿X~鋃]þ:6“_ºÉ.T؃T¿þ«"fE^aëùŒ(Ê’å-þ´ki„­Â:E ‡aW×=f«424ºz…p*†’»à{N–³|î±ìÚíCŸ«u'®¨8¥Ø¼.q•º|† »–Ô?ñ„n€ü–ÐÇèf£À2,"O¼¨u¦FòW=8M™º(ô¯jµ=ŸÓ¸WתAj`¨˜†7e…’…zók v9YFåÿι֜ˆžVàb=ñ%ß®çûÀ| ê„'á<Ôù—kJòvc³AÀ%^ Œ ÑK¸ÿtÊíí*°Áá6x«ýýú¦áÞÓÓBÉêM¢,´’²V†¤¤òH(’Ÿä]í•mfü¹(>f%ëš³ð7!9…›Ýµxy¼²Uý+Ôu£Å ú¦PæÔÍ:$5·ËÂÐâî=S`0ïÎŽãd1X|ä‰ Û&u‚'yÕ¦œ0/0EdÓ—m'ZªÈY ³PGÀ-€rÔ˜ mÓ;V3Þ#~¡<îvYºáòˆ£Âs€oy|Él7(íD3™UjnÞü8­8«[ã"\ÂQ;#L´ìa°èÄ W¤ 3%"Å9ÎËÚ@Íóà$\Ïõ@*¶£œðSºp19«n‚tÈ­Û=7+èýpMÜñz‚<é¤ë¸9FE*¢^b·'„p5ž…Û «f¼A€b¶vaf`›5T‰×âæUÕ¤{‹Âgzþ‹t+‘ÏðÂw’P)@¨£Œ¿"õRÄÿºÔD€oùE™/è®4ŽàOMwuÝ0K4±!NnKS‡-ý¤K+Üs5ó‘Îz¦JC€tüÏs žsQIê?í%.ç?б‰5{pàöÓ\äÞXŒ4ÕeäöCŽ.jmÿ}ˆ˜™°M£FŽ¢Y&4çµo(â"°s–WÀ»À3z~]ïÖŒdÓàu"Ý'S™IÃMíKàfœ¹ïhl UHé‡Àd ªç¿‹•féÙÎ?mÎ÷‡VÝñ&±-×ÁŠß6h—j~­ì©Óð‡w½¾Yí÷IvŽæk.Œ§^ubÚ†Ó9³Þ¬Œók-äiÖÕªF‚G¸½m¥z\B‹F[uýÊn .K2 ݯ`ûx žO¢hG% «ãQÄýC\W>²½´ÜýÆÓÉðÆ½¥Z9Œ¡Þž+SyPî©4çGDi[‚É'?í÷u ƒ”G°ˆàBé(çUL€˜D¸ØÃœ9ZsùÇØ‘çÖ»8Æ‹Ÿ-à‰ÄU£ÏšòöhÖ­GÍsŸŠÇmzv¦Q„!Ð¥Ó0–Æ›ÒÒ“@½Zwò©”†Y3ðÒ<‹ 8O¤˜ˆá‘^äNyN:·Ö;*z¼u­qû9£ÉÇí’"óöóÿIRBe.…'eI´_¬Æâ»Ùñ p¾,g¸Å‹ÀNUñzlur›>Y¤ÑÛ´i˜eùÊ×eÊ×µöUb,Éžo!ØUÉ–…L¸ÍÑ!ãæ% ^P$““vg9ãº):„×t cÐ× ÊöAû²Nlþ|¡4iì0{nžoÖQb˜ÞÊjL²<…[,×z³Ç…ã,RHÅ•¨DñâªaÊ"оt{D9Z¼ÿžL¦ã_ikb¤íTûBåµÐ>=KxËŽ*jAðÖšz›è%&£Ý2ЗŸv´&ƒˆÇXRE‡=ˆTM k'I^]á¬<È=¥çxÀƒžUÂRó#\ؽd•°x|Wñ½)è:Àe9ãa»»øIÈh­w¤ýð£‹>d9³ˆÇJá©×ãGË‹òxU¦N¢g«sY±†þbgh³«.TaÊßUêƒ;‘WS‡âsÊ€²ÀGÐêXË/PÀ%8—°Ü/”Û©± ÏDH³#S«åüè£ ó©[¹Y]·ô›Ëlm›º„Æú÷â†½ŽØ|cpò@CâVÕöÓë,ƒáìWHÁ«Ð¢Ë*3r…oúþÖAß»·„¥ÐÌp²D–À2e|u(÷SŽ1ÏàéM@IUUZвÿ¼UÕo7]!-€{“TZLÊÍNfƯ[¾±<ØUˆ›ÐMÌ0ÍXíí¢¡B-îÙkÆù-m7J¬í¾ _?µ WBrÐzÙáÒ’„³qM4´‰Ä®…¹¨«¤Ï­’¾xh“åbDÁó•£;•»éÖÛ0ÂÆê<Šôò@žÄ‚¤HnÔÒ t )³›Õ%–µj¿B÷„½®Š%!AQ¼²ÓØ•ø¹ÃÝ<ÿܲA†’ÒFT"EŽƒT•ÿ›ö*ìçâ𡪓—¥¸_ÊѪp z‰ˆ©N‡óß‹“ˆ Èé‚ÁÊk.s>…+²ÃøDœ|txj$\Å/AãL [Ò]ý‡ÜIºŒ~D:ˆ!‡ÕSüg—¢V™ÇétTŠ(u*Gù›~WU’™táþ´ÝQš¬¹ÁÉCZ¤ º,ÌwÃjÄ_„ä.v7Äy‘~ ]Œ¥Â¡lÉûÇŸ×ÈüY¡®Ý§#çÁä—7@zªàÂmp‡2+¹‡­¶q¶Y¤ü©÷ú;¯'Ò3çöÉ5^_ª¥â”ñ»Ãq]á‰$¢ýÑ»$ X~˜Å*JÖÉB3eÏœ™%©¶;Li‡?}3 VXh\Ê>jK§"Ä/ØQÑ„¿Ô ÙfàéLÅ÷}vïd ¤*ŽSŽ ‰–ŒÂ_O.ïã½ôÒfÞfÓGbLÎ!ô†ü¸Ý®æ…ÁÑ ›$‘žƒRù¨Ô EÙ@Füc¤5¶Àb·Š Ýüµj½IÂF­tRôýˆJßàÖ@°Ÿ^^#ïjÚè²}VĉßIpvI8¼„I2ABy'»4íi…úxl®úh;æTtjz©8΂܆iîzói\{½ŠÔ®@ç”æã9e >‘î}ËvXôÎáOs´¢8°Ô¡-I=ñ·Õ­} tQð¬ˆ÷-Ja*+DZŽú¶åBHÿ²¿É|}ã¸â§þlòV¦ªó?ñíHcêý˜fëÚM_ úáÅáiµ…I“ãr <]E=ñS²°¤tئ„ÖâWˆáúyžÜ|ÃsÄÎ¥îxÚtŒƒ3@|‡éÉk•ãÝ£z æjêÔ{EÝ?|¯à褹³î FÝ+O™”ñÆí¶‡Â€,M‘ôù"䳜o%®_·—/L@xîÒ·^£¦êŽÑ¡@ÿîñj@Q†Š¡Ž'+Ý+‚‡ûÞÝL: ª¾íÒôü9Ì<ϧM¡H@åÄ;UjÏ-ùVù‹¨HUÁ±fkò!|l¤“oô/«/d< )ö“Œ{H‡FÈ….³ ](¿cÁÎÀ5 ¼dIoø÷ÏsóCz÷—´­½&Çcñ1Û±¦‰ñó,`ó½^•\¦ÍNtov5$÷,•­¿ïšj¼€ý-µñ™©>J—{pt`ÓeóUÑ[­#qƒC|µD[ω´@eº(+ÅK6/l–w¢2_¾C³þ½_mŸ†b'ý‹Pp4›j³®ª¯$l Å­:5ß"ií3jð;íFöÒòX^`ä±»]Cy!±DoŒ¤•Þ8co4¨¢ð^4• 2ÈßÔÌt‚ð* ÙlŸR<¿Âu¨îêá…—s(š+?Û.Å7F¦ç[u0˜éŸ°,¨ÓI¿Ã‰GZÇMàÈ;"nÎNêÉúsB„L± â†ݯ˨ØíFÆñ±Y"öÒirŸ£¶Uî=ÉóIFÝtN'Ižp&ŒùÌa-¦÷Í—=—nͰßЬ…ïHkpë4,äÕm›˜¸¯çho¡ Óá|ÛK' Gͯ/}†%#g[+…ô-¶”ÌR£†yÞô ‹Ùˆ­ƒS{Ãä\þ·ÿ°žpJCå^|IܬN¶¥ãŸf„㦳'Lß·Š ÀhÈ•i1öè”~Ÿšê©Î!õÏp —&ÙKyTÊŸ‚e~s’Ç/ê:Tщ:Íê÷4]ÓïöËâëÐ%h4qÊ–v)ö<©Ó›@÷æ1EN‘M0^m5ùXݬ‘/´%€àÃ÷}$ª”£}1*ÕcàöÄmC’˜€ƒ z•¾ÙÂJ]ã—)Ϙ…S"¡=0@ÚŒ·È(ÇöÇý•Ç4 ß[–p~Àr“B£+?W£QÁÃ!¨]7fü´&÷gp ØR°ü¿ WÏ}!¶pñð³57AH³ýý|níV×Qkß}eˆ¯Km&ºeæÃ¦`›8 kð5Ò| /âˆÍgPò”ŒÒ[øßkóÜ-7ä€hêzDÁÙ ÷¼8úN“m×Ý8òKÛˆéä}iµ¨ew‰À›×é2|Ý]ùiœ‚ËGdéž”¹‹sUÜŸUÏÒŸ“ÒÑëVÇå-Ê&ktP›s¡©!Öry‚É> ×òýYæj>ô•Á‡\OIÅÜÑù+yý¦b|M™aòO¯ ™³°Êdá¯~{¤h)áå‚üÚ) MÚ$à øÇ,¿kUÁ€_¬¨A÷ªñ§šÆÊÿu---…›à'2›Â+´4Ý7q?oiоuˆ`Esú¶»Ö8ÕQœ"¾™ÙÚZìŒ'5Lc0Y:"ÜWBjщUþ×ÜC÷ãy*¶ jÀËýÎ7Å<@}eÈ6j·F–˜µ^>ˆ>ËwÊ<=·1¥`<ƒþc×7™€ûÓ2³Jƒž"üÁ¼0‹5Éuˆ6Y_YL5|Çÿ†ï‘åxø¨â–TÄmvÐÜReSÅï–ßn|Vê‚û3­ ÔÂ^(@Œ}¼'øj­ÚÖºUˆÂçÑ—« ^S ¢[» É#-Qt¹ÞH‘$KužÍ­~°•ñ‡ó¡|»âåàñt€üžgà“çèøHOs$r¡ƒ29ë‚«·£@÷ˆËéƒ&%ü>T)˜€îeÎ~öº”‡²Èй‘«•Ä šÁ¸ð@U¹UôŸïÜ÷>SÙç—¯/fÖ`8TåfžÛµŠ°±k7~Ã`eü»EmüÑ:g¯³ôR]p÷[nv°ìК…à•EGàÆœc šy뉊Ô@ûi+Ú„©Þ'oÐV';îä·Gý!F™ÿáGj¿ðÅ— ŠñÓEæèÿcq”÷¹‚‹p6õÊ= ëØà +H§;I®•Ø™æ>Tíîîä€ 4}=Ò—Œf‹m_ücÐ<Ð:A«ORÍíÓòÕá|º…çŠÐï:Íš&R¹Q_¨®¶ŽÌ¢ùöƒ±ŽAnƒØ` ó]Èôæ\#º=Œ™¶ÀÆÎmiòÇ“Q•pIµ=ÙXûz¡¾{ñlÀê[eI×9¹:Zof8°DÑôðu»¸:x€¶Æ†nðîé:ð¿¿O Š(á‚«s}¿Tqab?ÞÒ€\ŠÒˆšÆG#ñ¸ÐbŠ'>§œvU6Íq™~£NÂeå7ˆ¨:óÎyËIf¢”îAY83Í»>ß* ¾ôW%èøú­·TïŠ »Î“þ.Ý %éƒ| }©§§+ ÇgMBFÅ&rgЂìûOÃwdRå1Ò™#½R¯;²P@8ë¿Ý˜ÂõfŠÒAËKw”ÚPNa b…HÞ¢nM‡€õOžÕ=‡{.öÅûA—V®O}ã™bhUìƒ'ØÌprd’Hï)ÌOƒ–8mS›îm-ÿaöØ$Öj‹¢ è+Iu÷åZÑÈ?说öŒI¨sQwÑ2ÏQrÖ]¿¼á=ÎÔ‰™‹'Œ{Î )ÂÄœ„ÕÀj†aNŠd$7z·”Žwæâ£nPpbѬ2½Ä»ú)@˜Ïár+W•ƒŒö+ÌI²îÖK‹ü²Ý£]jÓ®ý‹-ŒØÕ{fcÉP|iË áÍó_]’—*‹ =Ð$kõE«Ê|sS´Ð;q‘Æ@x) 3Kõƒ£äðä|r®üæRÔ£TÝE”þÉõŸÀ'ueИ¤£v1|Oþ=WÉ ¶3MZâ'Äù?0ÜB¹¥=¬·0k×õ×)•£±_øã1u >Çyau?—Ycâ¸g¡tk”€æ‡GmÆ@+W]•<ä‰@.~Ö¸É#wá/˜™£aw“iòL½i»u†…ç Ýælߨrôß¡çY<ŽäáyÁÀ K‚*…¿ 1 ŽV_.!–òA»aâ4!CQ&ˆ·¸½¤®i‘‡¼ñu6¼¹aÒŽk‚ñaÀ{æ`Uw·+l¼Œ†÷B°Â{D'Š1°X­È*ŠD´µÖsVÃkqþRóœkøJ™«,ÕAÀªÈÛ±TXÔ[Î“Ò °•›èuÿF0¹Âei9&qH}ìŠÒq¯dZþ4-p «®Žßõ¼Z ›ø¡žu´|iBª8?ªÏ‰ò˜ õòù~¡Å¡AÃÐb8vrôÃv¤øj3ÅÖ-º:ÚÞÇo‚]ïÔî?öz'’âÅgk ÁË*¥sè®==( ¸ùhÐï4‹2‡*1&) 7ä«‹±) {cù++Á(£Nïê˜sN:Àp©”á/„hâ&ÄŠÝ‚Æáù›å [<þcShkmh?°¢h]–ºþµ¤öŒ 9cŸ†Ó‡¥“îð«ër&De³Ù¶nßæ+-¹Dn€?¡ë/ï4Úè…Ðn~w2ãPf‰ ’G%‘¹8¿]«HŒ¾>xSX.FF/˜'ƒ§,„¹ ’nøbX)í0Ÿ„aü¤›V-°6ú?Uu´ž-¦²ÿØ2kí^€_vB¾ÿßæ’TµñPrYâ[OÿWÚ a5‰Äî‹¥ù'ò ÄG Bí¶º(®ò(¨|4/QôŒ,²ñ¼‡?™f^gÆzsÂ¥\¤©ä£ðL¥Ê‡Dt[¦*,ï WõÄ r˜ü4åæÅš§~¯ƒ¶Ÿ1îÂÃ"´œp9æÛû„‡äŒÛ£ƒULcÊíÅñ?×ù$`C«>¾ÌÍYÂM­Aõ˜!®H»(³dE>W m5ED*s6T"÷¯#…§”ÈÁ™8mÒÞô͉3 Z£ÙŒ¯åÛ3rI ί–òâg൪ ¹7·\UT‘“û†o]«b•j=G·ÊÔ¹EA…ýOâAÂã(©£ÂßSb(v3—ˆ1.,Ð}·Öo;þï.ù¡Ý‘Ì oãÎûdëY¯áT‹:£4:ÉK#€U¨ÃP=ÿýŸÛ´ß¯døò±+Žî|õ±Õ EšŠÎtY?;á¹Õ ÑMÞí·@Ì3°öĦÂ%šðù^ÐþÓbûŸNìæÃü,]8ä}áŠâaƈ¨ªé)Hw -òš’ÛüÅ^„üÍEºâÞfsJÌc±Ó—ö†œE4ÞNOšHgS9f€D{´ê'Õ”1L8 ¸¶,¹"ŠòDìTr•ºŸ*\v …µKHy•g¥e€¥¹,×`xô¯“l¶#‰EÖXÕÌýÊâBç 7rˆ‹9Z&@1üsÞT¸Jg°ð±µ@{Ø»á‰So-äûû÷ï.Ñ4[B23`ª þv$l©ô7Â,Í¢mKíZµ`yûª‰t¦qp à|™h¦‹^uË–æ-ÜÎVÙê]RƒǙõÞ K[oéd_Ø]WOŠo¹DÁ>FzÃ7¾’K´›ÿ;•4¿ëL±\¡îŠJæÐ]Ëð2èly Só[(­'*Ï¡ëÈß_j¦E0N÷¡&w,8î@éÆÔ˜ ‡ –'6—M}ûI!-S’ª¯Â1ì<ªÊ"¸luݤ%:-hã°'Íþÿ ]D™RD5‘‘ÇR#ûZsê³l}óIìÞ®„}êµ~÷xü2ص4 ãF Ò\i)³Û‡³EI!Lt_á² OŒEK­‘a"ÀUøb+†0(¯…÷,ëZ€wBî‘+ÇZC"¼©À)<}Õ¥XZ· (kQ´5s”ÚFÇîK¯ãdc–¸ûû'_ßýR¹»È¾å½) ‡‚øRßMÿ Ð%” Ug…n¸ÀÂz‚øe*ˬM.!çùœKr÷ïç€v,Xtn~oG‹vVÌÞ“zX\Rw,Ä%X¯ôDKÍ;dé?D_ªò;>äªa!AžœßÚjõÝ%\¢‡ UÄ;š, R¨)/Q ¶ï>u»©¡OÈä'cÏÁ±´ïà'•æÓµâšdëü·<qk Ö´1ëÉ!&«Ø„ºzÄ™6ƒ4ïHi4Jà ™¿ž§šÌñ¸mÔÔÛ6aë™Ï­ ó›Yc׸“Ýa(°ˆIñäø@Àø¡›û§qõCÜ:CŽë½¾b$¶ðk–ùOýo½!*’EË¡7IŒcó!†ni`$þ¥³/%4ã…WÌÑÂŒ›|*'u¿N ç‚—À Uðjÿ³ƒµ]­íïPt‡—-j¡6ÐrÅbšf)(U—µÍA‹IX8îW˜JôæoFj)pmj¯e;£:]„rÙLó='ûxœ%²'žî+³eªW ¼ÆrPëU(C¥Ë–£Išk— ›§uÕ}Îõjµ@/;±ù3âÄÿm‡K÷U©j™ÙVSu¦¼(úùBªvÌ@°‡nV‚Ô 7R–ô N•£~0ö'û;HñöÿaÇWZVívéLŠ ”¹kŸùúØ,ïKñ59†ÑL;Í7|Þ£çÌV® j Ù<Ö¨\šŸ´:ZFô³\þúøKÇ;Î.éª~!“g@!ðH»Š‹Ìs@1ÙŠ\ãfîñËMµåße= ÏÌRî iŽh~9i]Õ$¼ØÎ8WéyŸ1M²eZjDQ„^HÚÒýô|­»kžndV»~9ç;ãšú)¶{|"þS`k:ï±Ñò(é!k¦Àšz¨ië•ø6ùU|–¡5¡r0ë:Ö`wÓâ„ÏЄJÀ2Š8Ä“)û¦Âk=(u;¼.±û\yŸi„H‡”Ž]N˜¶ùô ¯³¨©ïUpX窣å‘¢]àS®ðJÎÙBv]Ž›r‘Ͻâ°2ëÒÔ4ë¶K ?¨.”á7U¤FK¢°:²mxWûü²|•HT.̯Ñ„()¿m@ÞÚ2™³4Â×çÿíù ’}ú3èÿ*·iWÒÓ‹ÞU±ø°k’8çfNuFftÒå–äz¯4ë§Á§B[£Œ²\g–Ø€„âeÎjÞ²!FŠÕŽõx'à ÓxžÜA‹]öá"Š‹ô¸–êkû‡Î;§¸ïŒmøo3-…\†¯b€]äL#4".Þã#(um».’ILŠÜt5óù³/lT!ÃiÀov¶• ¾¬ˆþ|¤•ƒ´@"§ ,tX`“=ÐåÈ êW6nˆ×O É{ª¶¾×58É]Žö"äáO²ã½6ê{{ £Æw„Ó×gê hb®æÞ-ª'‡¥³1:áPÌ»¡š¥Aûiñ  ½ÏKoŒšÚô¶2°ÔŠŒ@É•«]\y?Þ²#Æ&tïCDÂ8ÿ‡3¹ËaöÁ†Û7¤JI²\¦[’ :cúZÔƒªÝYçÄ 7±gÖÍ—ìðÉ(²cWZ|ÀÉ]`U¸ø|ùA7Ò¦”¶*\fµ5’¢ÿ›q>ˆB8>Ö·“bçN«ú8ªýàp†R½,‰¨"]X÷áW³®PøÎ²ë#pÁ“¢&Q0j1¶$O5œ¹Õf§)ª¶å/Ae­™¶e¹ °µ{€†OÃÞþÒ÷a4ãº@§O–­2à=Øð™Ë›ÓqŽž[ÝûuïA• Û/É(¦ró'ì'?Þ°2­Êœ«wZÚˆ÷Ù¿ÂQð!'æÿ¬-‰Õsð]G€´¶4Fõêî ŸÅ!B¼i>Wl–cÇÚ÷h8Ô²­ÙÓ„îž*ÔKé&?ÇDɉÈ.ÅTY¶«â[H‡Ñ-§µ´¿Ñbó~’«È@ÕŽT ¬ “†¯`Ur¶Ð.>¬õ ä^ë|?ÁܱIEŸ-GFÐ.?wyæL›_¹Ó£ƒ ç°Bß“Ã3ÔŽÿ·R¢¬ê~êrá¶™ ¿*Øi2*ÐiÈbr#êì&7-_è.íøP.ÂÓy4OƒËy«,è÷¿ÄÞ£—v$ИÜ/¦šôâ1ªˆ•#yÆÜXF[!!(bvçù¡—Ö6dë fSÞï>y¶9ïÓAI¨tìtÑѩ ÖöJ,9J‰ðp+ sš› Éþnd`½}™ºßpESgl‚XymíàláÒRêÁë¨Ó…âFû%> stream xÚl»c”.Ͳ-Ü^m›OÛ¶m¬¶mÛ¶mÛ¶Õ¶m»W›ß{ö¾gŸ{îøFý ÌÊŒ˜U#cT)¡˜­³²‡½ #-#@ILY’‘À@Ç MJ*ìhbàlag+bàlÂP31(™Ø™L ŒÐ¤a;{G 3sg…忌Ukc  G€ªµ«…‘9€ÇÕÕUÀÕÉ…Îх”LLÎæ&S k€ðoy I9q…¸œ @ÜÄÖÄÑÀ ïbhma±02±u2¡˜Ú9¬ÿ­Œìl-þ+&'º`ëjâèüO`¦Žv6YQeA±ßrÊQazea€­1@FâŸÛm¸þA›9[üWv4çÿHÖÿ‘ ÿ#ýÇëèþo‰š‘`laä 041³°…¦ÿ/Þ$mMílÿ6»Øÿ·ëŸ€œþ‰@ñ‡”cÓÐ.ÖÖr6& a;{gG€¬±‰£-@ÒÙàŸÌþf`caíñÿ ü?ˆÃmÍþ¡Ž–‘…Žåßv '1 wcy ç75°þ‡¨ÙÕLþ½:²&Æ.6ÿÄäVþYWc;[kÿ3ï?ÉükVz9uYqQêÿ”Á¿Ü¢¶Fvƶf%ç5p4þá_ny‹×€á†û—Îø?º¬³£…;@‹î¿Š„á¿®ÿ–tþ%$dçîEËÉ  efb0²0²8™™|þW´F.ŽŽ&¶ÎÿbýŸTþ[ÿW5™˜¸›A¯¯Øq[¦µ†VøŠÍU‚SÏÍè«P¯0¯N÷Þj!Y ›ë]c?(cç»ÁâÍòî]íJ>´Ä™ÀžLNE†ë¬`¿–WšùÖn¿+¼5„ëÞ€©bÙÉÝFÜ;gl¬ÊSM±då^ÔJ9”ñ"‰3Fë—w€#îį->ÚŠSê#gj~ÚP× Î™‡Þò¿î¯ƒ„åíÁÞ’bé™VØ…iÜklÂ^ »0w5Aœ˜ÑÇlßDr[e1ñ7gz-¬IíË’ž9ÿ9x9>B=ä†_©†“Û1}¼óœ"}á_™ Ñ@M "äÚNÃ5LXPºQûöð©—Xõ‹´6{ÞïŽùMÈJ%ðúY/µ}k ÂÕ71J"’/àB‡GÚWÎgª6½Žû~èߟ@‡t¿Q¢ŸZÙCZMM=<¢WŠŠ+T©$Õ"ò«Žp6S]W÷#È¥ áñ`¸4à.1$ô&Þ«¥™rÔlðÑd½Xì¯;rZ6ì±å5aü«Ø3§ö¼ê­G°) ;é òÅÜž+âÅ$"AëR–ñjï ì,Í5¹ž_h=¼(å€yáò°aV8¹8žX_ý9º%¹|Ë€’Õ¶« ›ƒ€ú„ßÅÜŒ‘ƒ0ubh=H'¹ÈXÇ2á„1p ¿°ÏvU޽Áe"„!¥RTþrV#ZxAìCd&IÔ¡§¤’ÃÈLñí ‹·ã9ûì;ËÍ=ñAv$b|Q¸¡ýRšbÀ•vi¿VP?_×’õÍÁúU±î¼odh@wôÝ\JíšP­‡‚¥ü…X&<‘ôQ?ȘǛè1NPŒ×¸A I‚zˆŒ¤õÁæ¶Š ènpüDOŒüúä^Ñpýx؇’|÷7‰…ÄÔé˜íî®±§Ñž€µ·P8}ˆpÞwÏždIü˜wGûÝã¡7!Y'‹¨&zF^Ýo~~*Z9ÔçO.ö­KÔsÆÐ–2Gì¶ü(P£pT-Ïgv04ìÈo׳Šä.qÀViCçzŠ×>˶`y]¥–ÎÁ,µ»ÏŠ—1ÇCÉX¨ßn°Ë7§`ÌMTNß1ð(ÖÐÒûùÇeê:•X¼Q6Î:ö§-½ K4˜çWÈWZÝlÊíÉ8á3&FÕ%Ð<‹ÎýÛYXwãÖr£è{öxŒÁFóQôš”¤(Ʀ<®ÍÇX ŠXn:‡ð¡EYŠð%Z¯s‡$TX ž8B|¯"NÓEÊX¤zûç91DŠïÂc»|]3ugk´ÚÂú%è„W²É¶a8M³o-°{Ì“6 ¾‡÷] gIáöÎs#Š1#³k¤á›ÕL‘ …¨Rä ÏÂW!ú¾ÝöìC)k8#³@ÇÚõéæ:mö)¥”JBÆ>#î¨Ïe,Io2õ›ìw;ø¬˜);Ǽ e¬ÒKèb ©T«‰¥7PŸØM„]˜Ðk õ7I-%`“ jÖÁŒòýžä=Y×€ J¼‡µàÜ)Y$¹Å¥Áø ‡²x6•E5ìs;–“™léè*h<"iž°±„Û!x桘>=Kµì:ýÏ<‰P˲ZJ¢ÑöD­´”ç-·v„siå·:ãp’*ÁÏÓÖÇK'Þ˨l"ú<ç€b™Yª9Ö ÂeOK!œj}Uµ„OÕÙ$>þ€¸26˜¿| ,9öU?5tLJ’ Uõ{¡È®ˆ]Ÿ˜Ä…V=îܾl²3.xàö³ðJ[áºå÷®C5Å›Æ/á¸{Š4òg=/{ìº.íÓ%~@$©7U•´RåkˆöÀ¤´}P5ºýëc®IŽXÖCœ˜môÐ%½Ÿñ4,ýXˆu/“Ã,5'%ˆÎ0CØ¡…µuÛFQ6^~ù11_@ðŠ}ÓU„AÞf3zä­d}öæø£Ù¢›çX9Ø0Ƀ‰(š@? ,;+1ÃÝSMGÓ̤esíè̯‡“ȫČ|ŠHÔ? )²–HZíU/6I oƒÆ;0Ú!7Þ;^Ó?èÕÙãZ¤Z3lÉÐëüõÖÊÛÕ•¬ðùy‰CÐÆSÞØãtÎI8w¼ZÏ.öÅ °þRä+gî\ÀL¶0Å!0ï!#¹GâLªÂjnJ“Œj·‚_Jc£íNêùsÃ1¾'¦åaƹÞ=P¦E6š#²ÓëvuDØtª U¼qª7 ‡ÉþEQ¿#¹­bM+ü«mf'¿c ›s†ûwýʳ ³ ÕŠð¾6!5\û6Ðc.yïî¬ ";-mr=²¼ÀhöŠæ²U$LWšåM|È¢­í…§4A·ë4 š¿Rw"´¨·wù5:¼ ‘T´‰²å¶øi$mMýÇÏŒR€¸‚ dˆDW¤ÔZ?Îûê Ì€oŒ"m: /HÏ÷B¥qÿ&xKO|Ù™µ·e¢(QïùŠÙã˜å¬I¾)äW· ?ÛêfHÛNÜ¡}Ø k†ÝV³Q4c0\}À—lgñK_Jê(EÏÏN1†Ë.ÞïñEtFÝ[&`à@.³Ö®Õ謪z̲h]où‹”>˜0#,œiX–£›Aݺñ¢ùp¬¡uÜeü¬=ã;…>ö×oPñÄ]ÿ9#únó;蟛”™&Pãy‚=VåÜû’>R1’Îâzí+™4cÛê ðš{Ëe«ÝLÖyðä ¼dVrló¬[*¯VÑ×âµfÛ+;ÎhÑaOíï;»E^]EþÓæ[‰#e U»–ù ü}Iû%Žñ³Ô}»jv^ôc.`=£yò.ZüÛ¾¬}ñ€?£¢èÃGR[BÝ èÙ>®žV¯¸EÞSFS1aObXÍ<Ÿ›‚‘Sª.©‚ãâò­¿f€£tZâ{Òñ%€×n¨˜åyUºüöµ ¸`Òý;m‘šóFø”ï Mð*òr TÙ7ÈÊoàŠXK»#ß’ŸTÛÒˆ ø¼‡4‰+ÃJ`“|z°è—IÍÐZ£)°](®þrù›}OÞ\(˜]þÑ`B okóð£fu<œ¼Ø‰ìT”ÅÃÔóZ¤<>3@AêÄ´R³ /$ž‰*¶DÿLóñ]g¡øæA˜Eâ9/ówºÉŠèüÊûÕÍž&׊cÑþBWÌÐ*уíw»°¼@7hä–‘Lí2™Ã«Îz<’v®H‡åò×zbZ…uþß}Ã<án³¨fHIÊ| ÷CF[R§u0jA¸yoƒ¨[¯Æ„ôþ“±Z3A`cßw  P„,™äýÁ°TΈ¢ÚA†´Â™ÕZÅð¿3¹m†è[rž,|Ö€Êê¿H^±ëgð³^ómgzË×H©ùµ¼S•¤¿m‘ˆ5‘ˆž–åŠQvdršu™‘úŽ—ãáY¾°ç¬l Í™výú5¾î½ÛÞêo‘˜k]‰þ\-›Ÿ¯í;…ʌվnô PEY«Ù¿¹¯O«åìMiÉ–›êÏ`9i`ƼèP*Yt^ÄïÙ^åà?¤Ž«v½L›/Âat‡g&t< %+yqCˆËyÎ\~X"Þ·ºÅÃ)+I´—wÝö´ÜÆó_/Äëøã×6P$òî6‡\õ<ó¨9›ºÂÜnÓ~‡ñLk;Ô Á”Ÿ¾ŠöÖü áãX}ÌZY´”ýÆ>¢œ†Ãž“—‹à½Æ(gW«¿ 8z‘ˆg”ŸKMŸÙB]13W*þ°·°ÏZîïcö‹¯¢s*~J5#¾ó‹ä–=ìÚ8ö_ÿéI²ÃG.Í÷þ¥(gækÖOGßÚßÝî4ü6Ó;h Ae¡ƒ¢ÂoÍè ßÀŒ"îÞω£–Þý¶wn“ÖÞH§Šˆy7ãLFñù¤ê;ðÚcBcLl™\1¨XóJMR¹FŽÇ_‹§ý´„É®J÷'’÷-¼Ý¸è¨÷U—0 ý3…‚'Î2J6rf’ƒbÉ?ßçëÔ6¥m3òw–5°ôU_Ç_y¼Ï{tQ”ƒd)%goµ_Y*×}\û9kö7Ÿi`~¡',ñðô©¶ZŽãôÉá,†Cÿž\‹od0Âa^‡O¢Ià )H‡ÊĪDÙj5V¥¨Ìu›¦$œ£±§¯k¤­¹ ]·æˆÓ‚xÓ\Z8Üô# SìÆ¥aWJø…×&ÍuàÛ+¾ƒ(a4à©®w:tÕþÑ[^ ÁÐà H ºfÈÔ ž µûù¥üp pæÄ,ha) 1ùbFð »@…%E0–꽎«”)öÊ…j ëãÍ-Íü†ž¬Ï{!¶b$f”)¼®ˆ“|ø3ºNLáv ñä·­,‡½ÑìE%þ `:ÙøÐ¾‚t:|”(Y¢F4¯xóûÞB9Ô‡ªÃ"ä{ËùMb"ïé\$þ¦.T,°Ÿ–¬wnD—wPsL UûmIúvëh>ÿû9dçø…øíOž²q3v"y;ácÊ®<‚°¸æÏqAÈåÞÚ•Ž¶$‡Á‹”™Q©ûI7æi?*¬æÏ Õ[Ñ¡rÕ°©£;Ãóß0)/ôšòM~kǪ¼Xzõb›“EQ¦)’õñ„¦_Z¹¹®m‘ª(sT’¹(­$yÑ¢cÒñ”Õ‡••âÌ¿¶ :†óÁĬ¾€%MÔD ¶í¿È,vßušgL¼wLÝ'Ø} NÁ9?ÐQiï©76œ‡’pm˜šs+"X$S¡p²ÂO Æ fÖ—¾@Ÿ0Ip³ik(R„JR“3­-‹l:.0§|§üûªÐ”|ž`~K¢cŸ @o<ŠÙíý%á“Ϊußr䯹Å&™ã£9é*n×^åšù Ä*30&Lþ Þ^’Ý›9«}áøk;ÝØ¢þƒa‚)SÒ#~c‹]…\W+Ò’_¦„ŒóÔ=Í % èL·üVï‘þË‚kKÆã2¶mxJHéÞûTÝ)*bèüp)C•fŒY††w)u#QäÓ¡¬>¶5îµ=u|ï¶A2·<ÛZææd-^¸Îá_1Ži—w딀£š°Ò ·…¿ Q :û¡¯Ü¡+µt}®R ð@§¥ÖñÔ?ú¥Rn¯¤·§ÇÖ%ƒœôvwGªèSuǶõLRSŒH,Nü2%ºK8¢ï”#K¹±Óµg©ÆAx ŠÞ¹“t²ÕAk&qõð Êc&§sjÉbɧ“úéõ=¿*C£íÑrû þ0øCí8@fôñUñæ~lÜñrè>$+½kqªO¯‡ïSc0ãK’sÆS*Ûòo{n»›Ð$=o®õäç/* ãv=‚dY²+B]Ð rC <„pÓUlÂ1P0/ÛŠyL7²ÔxÜÆlõah¢ ^Ñ_§ð‰xÂϵ̛ €^÷ê*,þÍèî ÃZòGqC[Õ ¢gvÒW0mA W5qò¼lxy}V¼c@• ä;§@’›‡§òà¯k™…WM?Ò)šÍ϶]¯-L4b3yvÍ/\+£cÚ:g0(’²tš–¤;Ú¥ 9o%ˆ°}Zy>týÃAꡇJþIýwç{¹éï^0ýš©ÖK})rpƒ(ýÂàµ7mrâ)vÀâ€jÈë¬m¶¦Ú™3©t+\¡­3Y¾ ñOaÜ|U¯ÌmP®:Ð!²@+º€gìH^î| ÂiíË ”Bdñ²ë’²"¾ƒÖ-–¢¾þÂvßvžÓ9òÜVôO+vçÎ"ÒÐYŒeÛ{Ímá'‰t‡Q¶Û¨|7Ápzœ5ìD„ÈFËoâSåž µiýÂpöx¾ ½·kjy}’³p¼}(ž·5€Š">Z_`^îÕ*‹Ã¨ÃGÌåLd-Ùg²zBUTÞàwKöΪ<]—3{w‚è,¥êz §z¬™ûë²O¢T:j5šTÓÓ=ziö>¹Quû;PèX5P/Çÿ£jË0SßÑœ=åµ§ÔtƒTfZËÍÿÓ”ïEQõG ;œ«—86Ì ›Ü {¦‹Ž/úqFש[ò8Åø8 Ø·2<Ö»Ñ7‡ÃÂ*õLñŒ±;º°Á ÇÝk‘o˜žs§¡§üæù.Npq†¯®Ù?Í!¡sf9 gµ˜4ëƒP¦‹Ná@ÞOÑN‰˜Ø4¨H AuûÝ!ú›uÁhÜZv®»Åž¤\õõ—B– Ù;JsÏÛ,dDó‡ów+®TEª‰Å ×÷£½?Ý #P7ä–Ѩ™?ïmÏ Mò~¯/¨ƒå®vDh"ÿwkšnh”Y…LlØRc«òs*C|â%í° ÑsÅ–нµ`NÏê °ÿû>„Í…nKÁG¨s ›Ä–Ï^=øÍ¢Gìë=»Ì—x4 ëïvèà&;—ª§÷ˆV_çÁ ù÷'ÍʹyqÉÆí-qQú¶K[ë¾o¹Zð+ú®Øõñ¤_§ ×k;4Óé(ux~[±Âõꔑæ:Z>†ŠÏ92l8Ø®†† õOQ« ´žüø‹Ä;‘y›Ï˜uBýrð]§Äš!U¢ˆÆ¿@ ÔæÌÞJk/À Dío¦SØñïOVŽFÖÕ•:e*áRW„'PC{§ Æ>­­ËÀH>Û *è)™‚ëI»šSYÀ:LÚ“‚½„Í8G¼þnñ™)Ž•—ÐSŸ*9Ú`±dÛÖýZ»Gܬš­ÆQî|R:\¾åé‡h®Ä­Z¦¯:{„vÇàTZ_ë06ûÈ!¬îþ<;eT{ @¥×œ×¡[ÿòŽ.ÔŠe[ݼÞÃíúXŸÄÕ ®i»è—™oAFþäA+»´Lp,Šî+’<y™?35²­{ ]¬Ÿ0ôG|WyeNœ P„˜Hr¿ÆXჹ• À÷)º’hfÇ9Ä-!Îɲ­ŽËÿÉjFüŠÜ…c± f¹¡þ²t uÈú+?Ñì…îtÎ5ÌŒm*œHVh¬ÄOQ¥÷ÆÜ}{±>ì´—¨eÎýëíó`äÒÇ6€JL—¥þóW#tç°íR®õâ À}¥ºÙ6Èš‡g43b~rN‹.xN*£°ž/Õº{ùÂ{ÆßÖ]àø6ßv÷£€¢&¢jø‡SÔ}Ùî-ÑôVxxçÖÏtŸ<“· ;5iGe±ÃYP‡sRºÅɆ×_úµÞÜYî·År©Hé¡Sý»¹©6Ùª"$»ðÿ´¹äñèù,¯\&VFLQ,k·¼pî¬ËÊqcKÇï™<¸Bq˜°»›þSpZ%•YFCÊgÀ>Ñ8÷8.Î:GTš:N "+â|uõ‘%„ñÈ)ܶåí‹÷ÌÀtá&Bv=bÍ2âY"×eµÃ¢5¶£ù ñoúÂë¹ÅV¾ ‚î®4à#5'dÎ7Sñ·Ignæcü»¼…0Ù¢6« ¤•jd¦Rqè2Oujö[cE<¡¢¬ ¨ç«xçá­dØ¡xÞ…ál苘ʉs÷ï[©"éÌ ô ¤ÇK2µ.¯n4´û3ò\òvjÀÂö:·(¾aY«2Ä‘xý¦ØZ‚WÕtÊ»#¤aÁ|Ún=ºIøï¬= š‹¨áàúÑ\Ãj¾WxS¨ÌŒ‚ñl•÷tüˆÑ<ÕGè ·É"o‹õO¢ÿî ˜I†‚ÏDÈXD3…Â|:Žˆ‹àná)i¸›cU*IU¼R'ñ9ÓšðX{¾¾Ú;ë‰!«˜¦@'ÐRå ÝÛDó wãÅ” %‡Ûæ‹‘nUçf]‘·›]-]Xó““èǼ ]3}sÁ™ÊÚg£qËÜ <}%!4§#càÑ˘6ªˆ«üˆR¶ó&«#–´ Twî@¡è_s| KY™³¢€=¹ˆ a¤!È9;+=Ãýŵô¤Ù†aAìF¬¤ÖWس:ô!q¥uúÇSô CÃQ‚®X†ö&%ud¶-¯pÎ7z_&6Ò³»ôÞl÷z¬2‘aÔõqm/ˆe›Ý[ö®žR‘¯‡^"9 xx³sdY¶ä»ÏäBÓá,Dâ—ô–\£Í]?BkßÌ w‹/ØÍ\–Äü4~ŽøAçSßÒEeL” $§öïŠ35/RÞ…Xó’J nˆ >ïZ:,ÖÌe’yÛÞóîÅND â—hɆ&þP-™è‹jZ»„-MIu1A@! jÉžÔï+^ (a4»ò¡‘g7ŽðR‚è7±fWHÀdðrù¸M/Ì$2̤²éjS;ιá^½(B¥wGX{÷æ@uøR¬R;Œb¸}!F…”É Bp!+çˆo¸ZUÔñÂ-òÝmà żx¾2¶µ¬¡rñýß™‰zY»íÇ9†¯?Jôcä)ë â˜ÊáþÍŽƒqö#a O-t3³Î=©…_Úé3ËGñ§k‡k¢+ó×w½%`,²å[ÝÞArC«ÄHÍMX ~¤§ÔE%ŽÛ¨\-ké²p…ËVÖ|œ-'¢?ÀÝds¿#⸇ÄR°z©…èxñF…aLw˜Ö>\Õ퀿ÉÚl]XNßáVçD´aK@·ŽBÐñãÛG×°x®alÑÓð‰Øfm[±/úÁ•õ1_ûyVb ¸'2xѰ¦Œ'xíC ”F‘$•dÁ¨“êí¾“¢Žfz1·:·þ9CBi ?ð7±&PTÄá­ŠþTƇJ/à/sæÞbeF˜ .9ÝÊçêb=r?V&uÙ²\ï˹÷ÖÃÿìú•Êñ.TÁ§­[ŠH"—´œö ¬1’2˜½™¦éQc°Ù·œÕäq(вn<£m»÷ BÎ5NæÒlx÷«ä›ÅLÏëØ#äRë¦AÓÉÐTùvœôu™ê÷~UI.ù=]Èp\¡7®ºxŠeEÁÛeùNT$(ÈG¨h­—øk+üœ¢{]†«ÝïýÞbð 1Å)½ôjVXåšžBât{¸ÅDõ(ûSÀ?žÐoH&P­ #æâ`Òü¸pµí²!Œƒ¾ñ©ŒñPÅÍéÅcÆ1“ C îtrÖÔ‘Lb‡çRï)ºþå dõ °£Ú†²áæÒ> ïv{rƒ˜šj´Ú[«ªj˜ZdŸÇU ä\5®å9Ñ:z`#¥„ªµrÍþrøÛÆ„òoä7Õ ijJ2¾\Õ½ºþB(¿CØnØ‚Í.ìâce²e,†Ò.i0úf½Bò¨Áoynñpñ¯òâÚŸ¦fTóBÕ%²"’dár”mFOÕFT ûƺr†´G #ÝTx\M‘ÑõÐSÉsþ-R£¤%ÐÔ%·’!HQ„ÒmêiÑåYxÛñt®wj&ña 0^Ÿ$9Õ-ï±Ë̬&Jί҄ßh°B-êÔl鄨Ÿ.©¾îï„e_Ž.+h`.Í›7¢XÓÆ/ºkÀ[šUÐÅ}¡ù³2×§bW_³ÇDàë§30Ãï²ÚjÂ[,#áòeƒkËÐgbc¢“”†ÇLZܨ˜û®ÝþhËÑ¢ÐÛÁÌpSÛTMe¨¾èì“€ «ÙŒ Üù A»ˆ¶¬Ií½Àù¼È3­±sŇ`Ë ¸Ìr†ì3—q°ï[uË‹µÙÇ…¨f˜¯ý½›¬ÑYKEÉÅnëõ8 JΊ4ŒN•ÌFÁ…þšÎ牦܇ýÑF­WYÌcî|Y.ÐË®Ã~ö¶kIUÜíKN;”;ÍfóÉwîi·á³—9,IüaS?{Þo<>`=RÎê‘äΆÈëi‰`0®Òw²â³ôIÓt`/#„q%½àHïv¾µx *ÝËý”`X6à Þ*2øÑŸôô–&iÝ÷ ……^ÈáptèFÉ´©ä<]ìÀ&<Ò÷.ÐĶ#¬ï¿ã,·ä¿Ñ¾$—ÙÀyо$@#«¦qÐ`ÖšBÈŸ'öš8F*–ŠÒ2FbZótÌy³¼:¡?Hrî@ï8Ý@ÓÄRï@èG»ð7éä£ ¹WxjJñWI‡³Œ\,Zå²DÎ0¢hIê'Ǩ>¬þU§}<Ìÿ~±5EÉ_2˜™y]~íd t=^}•pç)Cc˜ý1â!ñèÙõ³+IfB<2Âõ™™¯Çv#ZÚڥ܇™œ@ûçÅÞe1|ºn#vñ"’œüÙ—O+¸#ŸÊY÷£ò UL¼cž€‰'zΜVi7u8Pm:d½~¤Ô+ÞðÄMO©ä·ÆÌùR âÎ~m¦‘ˆ:òª§5F¤½öQŸˆéTïÛMÆÁó‘°vNb´ÿ0Ìܧ“c\貦[‹ýlþ¨ÍÄe®zÕ°cû¦ÈáîuþÌj¹;´#÷tîaYBÍÏ–ŒÏg+!ìw™¿™bèOhÊRôC9{%<ÆQAN} Z±vòÞ—›Z?Ò¦ñwµß7…æ3r;ÙÀM«¬|)׿Xqk×£™’ñVp0wÐhéc<f}ù æÝ|Š x€Í\th–œNµÙ¿­™ÁÎK\_í@U gcMDàǸà93r¶u¢cÛÌPa;ŠÀLa­‚IsŠÖXq#öcÙ|€t·ÄÞ±v^ 1î Lu ØR‹a¸Hdò°¤qîúÅ7‚É;÷“9šÔøÊÚuAŒÏ°gÏêÊ_»T2¿–¿•÷NsrW#·!ƒlÂMªC3BU@ÊtN|P@1-)ÿqáGW-úªâM{ß¼v‰‡ÈèFŠS@w‘]óW9éI“E:í.dud±ot}HdêhblPp׿I}”eNf¸ôÝä7’[æÁMj ÊKDØ‚Vm«!jÃü¿ªÆœ@S2´ÜÍéwÛö~7¢¶¹œÜæOîb4,Om€üÐêh¨7E×àvûq6#í üŠéoЗšð> ª jǼü ¾UyËÝ?LŒzlxRÕ¥D¶%`#›NóPYâÃ̼À¬¦ìª“6w̳3nÓ;ˆ^eõás-|ßKûѵèóåpVå¢ÞbõñÞx~xí·%,Ò=†hfC!„khýª±šZí:Û`s®er§w ƒI^8zÝàÈVb´0p"­^â®ûÍ@ ùb#!gtg·ú¡¨4•Zª]±Œ:¾^öCx?Cìµ×-Ë}3ÍÞx2TH¼ø …-¨8ÔÔ^5zþØ ehÉŒ î‘O”y¯æ²˜¼qV<ÜÍÙ¦CF¸†˜Ø%ì+ù¶eÏýM4²·‰”Wò—¨Ÿ;2÷d³¤à,ØÃnpÝ„ñݵi"·D™ì¿ä†!@I³úæT¿á¥/?ù{¸ÑÂïg$ÿô™ƒ‘EW¤OÁ>@{BÍN!¥âmë^àF¸1îüPÿQÍÅ™;e¦k mS˜é¢/ÀÀÒH!þ¥§‡`<@íáp?ÙËáj®çÞJZ,q§ÁÀÙ®tø6l_¤äåSå¶•CïâñEÑõ6ßOº)œŠ]0H×õ‚Çå2]…ôY"ñr¯ü­T„e˜ lµ¦ü‚DG+Òô:YwÅ!³CÂN> ~Ø C-q•Žùš·ÜAñ›æ‘!/f¤¿TÍ3¬üTCCS½±Þô }ŽY!§ ­\A\AÒ5ÒÞ¥¿¤ïfJ“G÷X-mY¯ta‡šl÷·áŸ–âȃL„`–ð·½’,=F¹êʳü:Ë8LŒäØÒ\¡I3Br¡åõ9°<öTƺTª„Ðhù2¦ýß{wáŒÓã¦k,RRÁÇÂ]°Í'¤Â­"¾â, 7YA‚=éÀ=Á7C=ÿ1^8ËÊz3b=^•\Bؾm?ŠÐ‹»ó æ(â‹Öîãö¼•3v~‡ã°\Ðy™8 ’F4w‹¬p‚ïUNÝßµ¸zmÒ(c>»Å tomxbj ŽpÍöÔwmÒ¬tù'amM™^Atùó™¶MŸ-ÛµP(,¯"º³GøGÈûcr VT\ Ï,"xU$ý”M€«&`¼©—ûè'”³É™\ z;å¤ç7#s—˜X)²É‘~Ë‹¼Ã ÐPý¬‚Û¢ê‰vxÛØ¼¹V»3ŽyöŸÛßÎS~à‰|jÃéa+tU³-Óž°¤:ÙZ<ÔO]58õ5Âê>q[´#Ån˜fóG*Åkßg:ž‰ÎÈòn`¼½³ü”äogÚäAÏ 5μ¿½2ñå¢ýíɆzîÑ·Š8íDˆ¹NkÕ)]úþ·ã]¼ùD{Œî1«F¯Ï³tçÞˆí*ÌÝ=X¥OVpo‹ÆAdG"óSêžNÔ]=°ÐÂxdüDs sOúUÏ 4½¬µ$M?CÃDAãp97®#ÝøyÚ@ŸsnUÒ¾»gvç†Ò£•C­ÊÌu>”T¼ŽÞà°"ÒyÍ <¸ê§wMOú#œø¸£¨Jr‹ló¼K¶ûþG naAÍÜMµ¸;[&`L·@JvoYµ³^`lKÊÑ?½æ…÷¶[^C©wxF°µ9Bìï²!ŠÕ]Í<ú–:Õs0º zÚœû³ÞCáüh9{`_ÅÞr‘eæš´-àÓsøÉ|¤Jþ!©N7–"ÐêYl ñçj¸¡kØf ÅtÚT¯Oó¼‚ë¹÷ô‹Ó —„\‰ÊˆÊ÷I(ð¥Ë ?:Œ¢Œ7Nnø†úÄì6¬— ö~¶1àÙNŸ×”’è>wKV='%‹°>‡íüߟ¹¬1ÑØžùN»‰ã4l"2ûâmWmº›aaVØÙ E,C»é,މ†È_j«B3jMaVx\g·®$²û !ÿÐøP±ê-Eñ-Þ0È‹È"ûÞRØï•¥íÝöåMŸ@íh}ÖqÉW°º¿ W°Õ/é˜ú{B‰}$$ {iÿ‡mA”nÒƒ¹s?|(_㑉:®)PÑ#ÉÊU„½yÙæÝd+WaG.*‘<‰®Þù¬Ë1‹Ø~ru&ÌëâM•àd¯Ôè$ä¸y+4¼søu@˜l/7fGzÁƒ`çÄ!w]&¥HÊ6áh‹…G(%Ál°a{³ýî=kE]DC]Pú(c3ÙÇå\'†Òèøè¾$ÅuÁÙÓ^èÓz(˜#§ãvd/D¾¦ à{8fäHw„Šo/Užø<ÌbÀvÿ<`.§ÍÈñ`]²çFÇ6Õ]7gG#ãM–tL—`ÄC¼ÒPvšÿÞðꧨ?Ií€ggâk¢&R“©M#F>m©F@>LÒRIÚ¬ø&ÈóÔú=ÝE!„Ç®ËÑà­Ñ®×λ²m!‘‚ú¼^Þ±ÊB «îóÑ{Q žž³u¨ “ĶÕ-ÿ¥ îz®14X­Ýˆs®1Ï–DòÑÇ]•xy)Ô.ÅÊx£ÙjfJ+"YEš÷ÕíË%äþ3R¹%0rfÖGÈìúsÜn0ÚÑ‹6ôž:mñ!Ñã¾G•1`=õlˆ(S‘¬^Þ&oê%›ŽckSLr¯‹e–®>8 Díc“]9˜—I“K}²¶ë¹láÇ]x¬FܵÑ"H¾EŒ¿—°’Áâ0žEO}bAwIÅ{dMZ(9-Bê’$Ë¡¢Ü2ø&€ÎZ(ôÉëâ—î¬/ =+÷ÔŒLØÇŸÂ¿pkM¹f#õŸøý‚‘©—hï b+²áåþP'rÎu™Èg¾3÷KôÑ>ìÍv|+Þ©‰E.z§IÌ0'1®æ7éD!XoVÛj0Š»µ7nA⯢pû+N©ÃLÜaؘ«`Yx!¿nèdIlÏx‚£¾w爥ò2ÅH«ÌvFJ¨Ì÷X5ª÷°Rì˜aQ Q7éþBfë|»Ü 9|ìWˆôŵ;}·ýÜS·Ç—· º×Ê}óvôòµY ~ÕûjÒÓé±ÞWä¯ÀÍ-m¤C'ø¶ðiWæ*ðÿºI‡õ'–³½žtt }öJ¤ Ñfk5 ¹Î¤=µ\D“Í®Ø7m;mqx5ÒKNв®áT…ªí<‹°!õk A1ÜxŒo}ùæÄštüj;C\ݶ=[ÑÞfáSÝ‘/9òE˜Sê®Úš‘½M|¹l£M r"‡Ëý¿O s¡Ó¦J7¼mÀﻟYù- ˃£Ì"bP¥¦å|‡RS-O®,™è#Òíê;õk Mú3 ‚ÑÇ"SrZÀ)ƒB×Ë™¹žÙ§=¨¸\©9ß ms q­ ™ ­óË7ê a5üï±vfï†Í™Z2U‰}7Nú“6G*£gŠÿv÷ü»÷þ[oÅê(çÀïÛ_qú Œ›$VI#郟6°˜ƒs'¢ñe“tºo±³7–QFD·ø›¶ÅóM‡ëcoÄŽC%þmàÃß!nI]'B«¸Aû² •)å5é¬Ù“rmÝv{*±„pÌį;#N†oiÅ?Ø ³²ße5ˆåq& |kã‰dÑÜ_¤E$S8‰ìþmö¤Í^q²ÏËìÂ"îç\˜9ôæìÐ¥fø 㚤ºï¶FqË<2eŸvš¿ÖÀr41i}ÚeEÓ4#v¬ÁphØ4ñA÷_mõ ŸU1¾#ic¢µ7µ,¨x¨Üý˜æ åA$Ö7 w[õwͽҿ2fù¹£…ùœ7/šÁl>•Hs%ùý‘cWÉÌ;VîÅ$ xì¯bÕe»³Þ”å¯H&G„ ˆŽñ–Ðív³~¼úS¤;'fî”D Y0?Ù±o‘}ZMSf(µ ÿ¦sG|*×!ÿ‡ÄÂãWÊ/ ™ƒ™5íí fŠZcúRÞ¯ŠÀ¾¤è÷]5å,•–URTŒJ¦]-§a¤–ñiÖúc $$ëÌØe˨g0"í]ß?dA«¦ï*ÅÑ¿6)M²VYn˜WÔ´ð[Î?¸Êçœ -çSºî• &ÿSƪx½ZmD¢äݹ§aù‹{‡5Âð’ˆó„ïÄô;[§t{chh &\%íðÄøö™¶?Âö{>^\ÍùÔ?—XK+`S‚ V÷X»Àöóz¸]‰{ÑhtõHF`È»×TÍ«šëÑÆ)p#e+‹[:¡Æ\ôUÁ’`šjKd=ßG‘<D­ì—ãcE|R´ØdÔO“Gu‘ÊA{ƒza¨è§H4E1£Jp¯ƒ1âb °ÎY°+äý&K´s'¼ÈÙëæ›¿ v‚)‹:»ÀÑ_ûøø7gÚí!ëÓC<_»Q*05SÄJ ?®!°S´hO+D¥Fø.í܆KXZs*¢õRò8¼ÄOÓú£°n¯¡‹ Ýé[ÊÃñgÇÉÝJ?{„:ŠÀëò+t:¢º ÖÉU|9)ì +é ð¦tŸ[M|R•ž²Z1,“§Á}>vÀ¿á3m¶±ë L,ꃴ¡ù&æ"X’ƒtƒ¯7 @²‹sA³*– Ç·Ð5Õ¿Dðú§…™ˆ3ÜÝÀ¿j§Aƽ&.;¨dˆW; ‡šöÏÞGóv‚·qHÀÓNÁ¡9ƘoÑÅÿ†#Š:øÊ±ˆ±´¬»†¨£«<}$ º%:`ÇxÓŒ˜_þoÚû„¿]œÞ˜T ò¦¯»–؃àÿjlÿ¢ËÞ”ö¹‡ÚPìGSçŠÏ+ÓªUæ™ù½i¼èáŸ? MÁ§|¿À¦ÁívQf ’>³®ÛêÉÐÊ´;d!ýQJÅ £ ÛaA\ƒ40áNqS\[ÓÛ›Œjÿ§È¢Í©ŠŽÀpþ-?^¬OË8ü"†‰5„¦nAô8NÕðTÞ#çϦÓÉæ±ø;±"Y€Ðx¬¥žBpÕÓ`:¼xÿÓêA+Òÿ}l”ºâï«–¢è¼NÉõ¥´ 'a/Éó˜LØzy0áÓµ”œ- ¤ùD¦_a¢»ƒŸ ‘fBu àã­€pø¾{ý¢P4ÀU&8ÝMc)ÙOAÒ𠽕ª²dÄ‹Ûå.ó&×&ߣᄑ<œæ›«¾EYØ_©dO®Ø@ÂÇPæ$T£N†;˜äwfûÆöúEu¥ŠB:<Ø›âgÂHW§ Ím"Ó¢CþG‚w¤Û1»l2’þÇô,mmU hÁžå¤GŠ÷ž½!€\q Ê™’ÌÖ¹LR7Mr•K„ì]ÿa—±U1ÉÓ×nñƒm'ïwRßi6ö€©€µ¢Tóâ|ª¶R]ú…&æ7‚ân¹ *ÃÞÔü2Ö½ p‚‚bÞS,þigex0õ«À—±#Ï€”âͨ‡’‡PÞªYµ»ó 3^æ[¶ä}:«Gt­!–­#ZÚâ ꀫ ¿[“êµ1vU¡ÅÖ6É2u)ïÛnÓ)åÖñÒ$ø¥ðX¢øýr0‰Úå@Õ`pZ(â »p­Nït„fQvUÃPDF/Ý ûEiÕnÖÇžQ0îÓýÉMZ0‚ä·^XŸ,l=C†ÕXqüÚ¸‹‰·»bŒ?é_O9YŒ7`Âí‰ðz>Œà¡&Ð?!–:\ϾҾF$ôàû]Mšªq•úÝÂ?Æë2©YwUÞ-û^D|~4 ï%p'½rš M²»pÓ@ÔÝÉ5÷2“ e…R³"=Þ!Tˆ"ErÆ|ú¾à¥÷–ÚP@Æ¡ *ÆŽ§;M˜í3ÿõ¡Ù¨>dEÓjEW•ÉJÓSB•8W-2Za¬ªÍL­SO>Í5‡}4¾ÝawÎÀt[M•IŽtFáˆñÿÚkdQD†¥HK!œôŸ-ME¶Ü!smzY—Ò¬…dØzùÏy¢™S³³&!éZÃßdgs;¤fÇ%Vt-4é.õ_ßAÛ4.SD–‘©°ë¤µX¯–²Ç—(ÈÖzê—|ÉûýÕf{KH)qÙfTƒÇ[Åõ7N×vBpß43E6 ߤÒf+…„F$­‰ÈY”: .\$ÀÛ;¯›“/®Àa + ’8ö2ú|úWáLMc޹®ñë\EL<Œúx—ÀªÔ¼6­c‰Àz«¾ˆ“tÝž)y´çfÁ±éþ¾2 ¾¾•“h÷hãS >Uå[jνx"䬗¾¯Yu¿‡ü—‰]‹NÖ$Ûšú¶pú¥Ÿ¼é:1[;ŸAN{õ6Œ1][™–ê1=Ý9Új âÆ¥f·äáGàâïUoe4¥K "„. ·¡Ê¢×4yÂò{°n¹täþaMê -È•Œ[O*YŒ±ÅÜÞC ¿ø¢i˨ùt,ësf˜2¥† ÁvIÂËòâÇIf -È$pFêËqoc«ö†²º°Ý»q-‘-­]»4|ðk+Uz•âæ:! œH‘æèeˆbæ¶Ëu,ô]š“a°½XÆ1 ê÷¥±S†B”F³ŽMXcåýªkޕ·ì".]¿XLDkÒÈG«1]‚ÚuIQ—á8±ƒÆ€ê@˜ùÄ|XÀ[ÌöÓ¨¬/q8£œ3Ý妺æ~fë/­zM.àCÜÿv1Y·M, $·Lš wo3„†Ô´™^ÈÒÔÕåPHfϲ;Ÿ­ ÊXÔ}¿&i·&hTÜwÈ"½I‚_ŸˆPÊ¡¤âر¸(1M‰´“åÓÂæâá¾'-ßù?ž¶ˆ[ü_1 Îº ÚÀÈ8TÔ_>ŒQhÊ»àz(PØ ±H”‹¹ ŸAS†سm7¡DªVꥴ"—†ŠÛH`ƒÖ=´®”Z‘»øÁöá³82 mÒn¶Á·J ®¬Ù+N±®-§$ohëáM=²L”Œ »É#2= ‘mÛK¦ìjR’vº€…åÐÊ/TÌP‚ÑÇPJÄf“ÿ]i@£û]ȯõ¶Šš¾¬²ö à< ¿")ìd×-ƒ…æIÝ AnùÉÆ|ˆ5A³ú”Óña–¹!òò\¦ö:*ã=3µk²áXÎ e2€±²|{iI¼Û”³ ˜58õ¸¼t÷|}›3À#E T¡ß_Ãpùì¡W(AÄdIÚt\¡{U5)†x'iK1nu'Ña÷„,•º þ>; rðê[:°“ »¨´ ¶È$þ|Ù§$„v˜³{½ïF©Dÿg­þéíãÓ‚$A´G9`SÕ 4A“xT‘>·ÕœmÓ™ÚŽK?¢N:€ÁIp¾°šÑÒà5/ŸÎÆÐiä¼¹q´WnšÃsŒ¸'šåxlô˜ë'W’&Îû,´#%rk`ÿ¥©÷ãù£µÇʽ8¡ÿeùëP6žµØÉ¼³yî!EdÙ®ñ[ äüRÄo€úö:l6úsȧÏëõ…D)öƒïܽóôXhGv¡¼XñIS«F$H[“ B(¦ä$·£°]‡Cª—mkìJ¡Í‡ŠÙ³ èwe S#°ðù)ßMx Þv•¤+E T¡ß_Ãpùì¡W)µ€ Ñ2# lS™VDNÏÄ œJ›1$ª2’hôJ £t<Ûe×â"ÌsÅÃ>‰dÛcn7T¸ßAGòŒ λ•ìõ.>2Ã4äøZD ˜dçM]»£õu‰ÖNð ~ã`[ÖjæNTÝÜÏÓC¸±¥X„†Žÿ;‰ªôÃ4¹…‡‡K˜<c½x<Í¥±³™v »& ‰)Ùüôùíÿaî˜db²ª.„â^šXBøòåo ×dEÊš¹Ãk´!Aó;väbåÄôì`¿¦'—ýê#ÔöaG?d8²‡V@WðåVÊ{«‹~×¼¶ü”SlÚÜø>²'¨ ífK£µœ—oD¬ê± Ê12Ѐè~Ò*gœ=Aì¡'Ý.”—>˜´OXSJÜÒ¼ò±ú)Ñ…QDçpJ @›u9̱¾L--a—õ"ï·+}¥6S‡mt€…@JqdïãÆt{ìHAÝ:8a…ì½f?Gœ“(áEï²D¾KÜÿ”Ë–§¬–Ýà|P?d~Šÿ_åûÔø{ù5Ô–÷u;Wm ‰ á^‚zóåfO`fùm]Ú@Žþ¨Zž6pZh€ûÊ~ø^Œl•ñF“´~îX¹…Ý-²{ÿÄ…K]ãp®U8Acc‡=‚]yÛŸ<ò’\6ëjc£kÿ%pžay!‚V#º’hA’WË&±àKõKÀ…ùŒTÞìúoÓãÖ°’CuЍ¾]–¶–¦¸º8pñÄÉG“(¾AKé2†6TËIp¦sk“mÔ£f”SQŠ‹/œz&O“'Ííz޲*Ü=¼éˆ s˜ „àeZ‰Ôï‘PšôÛƒ‘ø §'ÿ·ÓÝø|Õæñï»S!„·¼HÊP³Ïüåý¼› D¡V¯£Žç½üÔã÷”“”‡Ñ©¸ÍõÐî³Låy‰tz»íê ÙO}é”1"Õ0ÖÞžs—¹8Þ õrY)*Áx­Ò ©®¹á>ÛÞ¨µó‘˜íä‘î·ÌGHù‡È\Ô5w"Á¤€¾Î#­¿Ø­ææ¬š[àœæM_v2«Dš!Û‡„'×?ý"jÄü*œÑmKZxØøs¼ʤ˜U÷>\Ð O›}åsfÝÿ­Á·Ã@ <­OóD‹z}‹¸r¡ÐÞËo‰}ÙË:Ôêða`¹*ã áɈ^qëàm*ÓRzÂcëZ7Y) AUsþ»ÁfëXPˆ£íЪU5äQÚ-MüÁ"bJ‚‹VJþ6¡¾ìñv€¿=#îä‹*'–¨¥ò¡úðÖ3Ò4UÚãŸ0öÙU9OëÇ•É8­b´M?É‚Âà|° ÑXê¼æKþ ¶ 7⧦‚Ì[Qü,##þG÷e'F¡ÈÁ Ͳy7Shÿ¬² 옯â÷KjL¥u¿È·^ƒk$íÀJÝg÷D:_ñÛ Fí>û(q–Mñ¡àeÉq,©;ç˜Cýroû’\žwd ÛR„U¢êE>öBØdhÍ÷uNê§õ°–¦%0!$r5ìGèP,ƒ8U bÞÚë5Ò=»26“£Ç­-ß¼öw ‹œ$p—ýJgó9zñ9:µ´&@$ ÉM%„åªù3Œbºø'£9!Œj¢øØbFV|mÓ+ß—ø¥„à9ó@–Äù:=G1^~ÏRw}G¦f.¯¤ú±m̺í]ßà)@¿ýÜ2Ø´{„¸QH/Û}c¿¨kèÈ%–”ô¼óª³¦<ª4‘ªìÐv]Ge·•\AFV­þ+ÞeÊÅC„Á2ßyú‡³“2øn)`&W{¥7Û\C}Īå]„²¾þâý‘¾ü ®²Múf„&jüë®'ƒR|ö”{î;¥›©Övw÷â.Æ®‘·ú6,§^x^¢‰?§žÖ™`J'ÇR >œAªã““ªßÆöÕÐã#JµÖ6ˆÿ¬ê†HÚüx¯pœïlgyöë_6÷\òЬè@Šå?ÉH~@s±Iƒaˆk)VbÊ®ê¼×[ W9õÞX‹ 3u\Š ó\í1kS‹SUšL|þæÖÓ¹£ôC³€A`í‹ÆÍFº>ÐÔfÅMUœÙø!×#*õ’6¹›$`Ï£ë8ÔˆÜx†âñð8Kçs? ÿ=nH :Ð=ÙÑVˆE%…¯Ûª§®Ðœ€Ñÿœ-nŒ}!ˆì½pÏHŽeÞ÷œv£bê¿ÉIlÃéÈæ»Ú?=¯éþ¹ÓeŽV55¼I¸%I[(Ë›ZÌ&t' -šáŽ‹ç6æÅài¼|6¶1ôÇ”VP,ÓÀíMÞ2À®kDþe“1‹i2t(Á)}I2Û:¿µ‘£Ñ¡Š¶˜ÖŒ?x*×çþ¼b4§öŽ7F£Ó:ËUiÎM&ùê†\S3ÝPˆ³ù}tNŸñÚ#3°N"^¬Bû,µS:fˆV ä´¸ ®ÆÈ æÓµO'çæë"ƒ§È^µ>:BÐç#Ý¢ý¢Néx¤PN"·M,bQjËûÞƒÄ l_Ë’õ`“û%t&pf*­3¡W»(Þ5ß@ÐŽI‚–!ÐÛSD?‡wn¯ œb`õÀBé§Kh,øwP…)83°ÙQ8к/€¿ÖP%ƒ̲öˆj½Þ1Ó5<ÖxU dø ¢ù¢7ÀzI5(OfÁD(‡ Deqù"0SŸ,cE貄 ½Ü}1b]ìÌrîLHµIÐ2kp‘l÷›“ˆ!Í«ÅóÞñ¦Ïx…º!QÉíë—6u! *—] تûî&q Ü/U5‰:6?'þoç4—‰¹?ººëÂ2ðå-‹á_ç'Ãqµ_|´ù×E.·Ó Ä*d… á»,ä…d¢…vÔK+õ r…õðgt~jwbÐérÕcR 8`³ ˆN~F…º€ª®¦h’æLÐÂÑoˆÚ$CŽ3qiÑÉÿÿ¦êJ7F çÚú3@b&”¥¼K £žQö•R}g™7€Š„ZYdç›ïkèfK³Ÿð²^§‘×Ö›°µ*÷Rå=gÂÁª5”Ú„¢WÆA¯“fÛ‰ðïkœ›3=He|&7b!Z§±ÂÉÑZÔ¬®%„H·–5K…Åçég¯±y]õRÕß›âÂ,è2RW„DüƒIƒSÖ Ï^硺« Vñs¤mƒûÝÔï¥øÂ.ú·.²PD…ã1ù1Y]zúÕšñˆ^2 å³Ä@ÊK §b=@V§œüp«,³‚ˆoÚÊ#Âû "Ú±þ[vžVý}go£JŠ3¥¢öˆSMõ– scpñ`´aDðÈýRuäõª×ï©_®Ý17ÒPÚ[ è™tCÅÓßwŠ™iîÊ>tºF¶§?Ü6­gMnФâ@¢Ûé(âºq¿^ÿʶdÀ Q €xh!á©ã3vÆ9!7„O}/y裮§ñ¤–Èœý ƒœ qàÕÿXY~:ëEÌ ÷³õ hª>U_…±[X7ÃF)d\´éü æ¨Ð°¤2ô3«££zñ'áõT[H”4¹w·$‰ôLÑž°¤`’Ô¢Ÿ†wˆå6’ *r–oýðÝHDJÉ(”9äÚþ‘qºÛ™„.ãE Juœ UñΦ(¿ºXq2¼3§'1#‰~üùüt8©ãe§Õ~!hˆ"öÝ”µÈíïOhUÏ–·½6d¨¤F³dOi±mñqÀ£@ÐÞaé‘Jä^7,ˆrè†ÐÔ}•Ãb%)¬§Ä‚ºMÐZ„Òjªø…Z°(ñg“lZµ‹b[κ6º‹L%¹´Ø°3çHüh—"Ï;ë|¯tïJï×·_”`†ƒ€éÞ×3:¿×ûuaú®oë!Ÿ­ºP|C´Ç~Akä‹—‘ rj¦Èž jý»°ï3§qC½(£s;»‰ K³Fƺê§Ç³›ˆÒd7Údu¦Ç¸°ÏìD€Áéò`9ÌÙ]’ ¼ò½BUVF¡Õù‚ó}­ìPÖâÃä ÔKl”­‡:ŽgÑJÙþ‰Éä°8‰–B”C» ùQ»6g*{™­„Œ£¤o¹B ÏG¥Ç>ÑÊD°8ši¸˜µ]ò/jj¿Fšò“Oÿ³]>SÓ»ÂÆpÆ(Ü'X£>„!>–‰ªBC€öêSa´K´™ÅÆwé*Ë  ¦/&’ÕŠrœ¾[‘r±£ÞQ‚ |€¯ÖJ¶´Œ-ñanî·Ð?ú:“XX¯D®¤¦±ýD–ŠB¥0ÓC‘H¯ªi½êB¹}„f/JŠnkÚÑýÍq:Y]nõm×b-4üÙ;‚(žd _†DÒä®Eì© Œl) Œò[ÎìD‰Ù¥à·×h}úx®'ÁÚT#ŽÎ^Ê‚ "Õ‰±-ÙŠiéé¬/Ó r»ä‘RZ^òQ«moJÚyÊ*²„äï%`ÊP~äl§†¬#ÒQ¶ÕÏCèeòù#¤¾n­Cs­§ÚX¹ª¤þâ¬3¼ƒÓ…Õ,}ÕvW¦k†]?Vl\ yY¦¥0Åmƒ%œ9Bé@œ¼.Áî%½BF@ ë¹<)K7-ÁÕ§Ð7h¿zôA¹× ï†j¦yÿJº{ž•.B¬Æ¥+þçn,Á‚ö Äb™hùZ˜M3Z;¬x"ÑÙIEFx ˜¦C~÷Ik“@Øï·Y\:˜’y¶ÙÔS¦ª4à.O2TÁxêô¯ÍUÝ[^¼¶ îñ¯3p“6ɾ‘r'ÏZÇ*„rÛo)H¢)Y±¹Ýû 9RiT„¶•_±4ÇZq(¶(ê®æô¡Î›É0ÏAHÚ… :l÷ËúXº +¯´Y'ĪÖâoûJ¸až]>–§øN‘@ð¤±ázOñßUö9d…v¯’®¡(œ]€·âM»êÊ n^ªi@ tfËÅXÈøaÞWbl$š•™¼]X³wóéÐÎÈà !. °ßað€C‘U8=äÙ†_#ëÙÕÄÐÞp¾gW˜Xº)ŠGÎLöl£'ÊüŒþ7‹]]|ô3cEÀâÞµ‹.?gå´ôÂ\ÿ²˜ôĈxÞæ/WήôènƒÑ$1qÂCq~ûŸ~¿À€ËdT'$%+§~CÌA# ¡¤Pƽg¾™ƒµ=™<22í½Fæ©üaKx†þeÌmé$,ÈAªäfç€J„¼Èí ü7"ì£\«P†ö‚½¿šfÂú[Ö ¿Ø 5¼ƒÂ÷âË„G˜WoÜ\ 4ôKšpeí[ã«â`õ–º]+s»–Aošo6É]@cA=y+3%§Á]ùƇ …zžÝ&ÑX¡ÅÁ<%‡ ïî Õq”«8Ð *“_¼¾ûB5hžœ4òlMêÿÑ"!üu l÷ÇŸê„YÚB"cÞ@½ÄŽóì-BoZ2ãxbD6§Q Y ³xêH€ø6¥¬[2tàQè"ÚûôC •6êBxPEÞ‰9Xbà=>“®z´>§©¢W'Wý®),>1¡CÞõéû™)Dgųިk¢«Î`ñŸæ-Õmvª‡’CòT~-´‘^°e»d"qY‘?Ÿø¯ƒañ í¾ÒÓ~EA7e÷í³Bu¤0(*awèE®À¦åF!BÎ6ñýxä¤9õns=‰ œñÊvM4lêh–SŸàÈ¥?¬¢ùîÊaQÒnX'…LnžFö7p}‚Vª=--|«Oï[(‹m•«sHëõWŽž6ù2—VäGºx™Ï‘¹±èyÏÄ°Þ 7Zó•àК–òÁWQ!J6Œ §òÐ×xŬ™#]J<Ñq± ì´]·Œé"™!9Ÿ[ª>`t¸‚@L÷ÞCͧ 3bèO">àÝþ÷“Ѥ ÏE&[ìãŠÈ¹Ø¹¤ .í ÃäÙò)vVœd,`Sq ÈÈãsà¤:e|hbµ˜É,(üô/j§UñÅ-è Bœ‰¾^”ÑrôB¼;œ3¦²bƒÓµÑ|ŸP^Yw*ìØ <Cc=Ý9U3ù`ËWâ„ßbùH—ï²l(Ë¥xÕÙøáFRáx`‚wOoFÖÉ¿•6t”JO¸E…Y¼½@Ö+º¨Ï]CÓy¼³ ~Ä6ØÊT+ç;MŸËm˜¨ˆsŸ áx]¨Û “¶f@è´‚ËõÇ,t?^$öZ‘;ö ¹ÉpŠŽl¸ìH;žŸ¿¨urÌÙ~sñ]5œ»4†l¾t¨#m&¡—y®°mìPÔíoRD`íZßf"á99žÛ¯M7ÎNb<ãúf”¹tÿ{¹ÚÒ\”ÉsJQÐïÙk§§ÒB~ZÓ '‡½ƒ/F@ïÿ êòzxJÓàYFÐLú ·¬ÿljæ)uQTÝW’i俦šJSØ{P\âý¨"fS$w’6·à`ö•qîÞô”Œh †Ë(ãÖ£Ë)7—ÛTü²cRVû{ð¸«]| ?a¾„ÃeaŸ«¶É/µ0N2{V½ÂkÌÒ^—iŶMÿ>“+«¾ Õ\9s |(ð=ŸFZDmáþ¼py¨€˜"m=˜ D7¥zñ¹3ÏøŠ¬`)÷+0ÆH ú„òå-ÁHñ?u‘y»³ñÑÍž¾ · x… ¬5Êbë“&á\äâa`⻈a}ê±ÈáUß׳ÁøEœ™Äb±A•3¬¹dÓÅ liŒwmš]2óÛ-)‡Ù"­–Š>Ëßž†t6Vd¬u“+‡-ò‹z©Õp#õ ÁºÖ¡)kG¢ï¤õì£\à€‚ë9N3Ôo}`Ó.%$¶Ö‚¤ Ó‘Õ®P:Ôá¼§­Ý%請ŒWEqôœ$>19,wT¥ë²ÑÿSGÆ­S´*?Ðd#ü‘½œL§ÆÃ¼éÿ3ËÝl<¨qï¼69| ¥¥\»»ÑÑK+^Ìjô·ŸÑÅd<ƒÝk!"yjý ±H_ ÊÝ2ø8F¼D§†rà=Ÿý’"Ü_ò,s~c„ wñW©¦öxS½ïMÄ›µ“ZÑ _uæ.U¨ ücFP²J /™2¿X!E&U~hsÚ üƒs ¶¬˜OJ[!Á4¸O{ùÚz0ðˆµ¥$AcèÕÞ¯…S²–úÄ& •ÆCâÇß–H+nëp«jv•~a±“9ù¢†­è¼€ÊuäÏsjÉ„n†hBeY­§V’dþ¯P´ Ð.=ù”Ò“9Ý¿ ÉiEÁÕh©;<'U ŸÜ·;•ÙtQ˜Ïú çÿ~g”áawF‹±WY൪\·&,ÖeÊe‚f’,=æ\~ì5-¾÷ý ó‡ Þ¼N³"¶ aeâèÜÕl‹¯–;¬,»ð] M"êêÈFDVþÎFOìYQ>±s«p CPl$/⺲¾¼pÅ-ípRi²x‹ï²7ÙrNÿ0|{ª‰¹¦`£ÑGèCRý³»œ¶W;@–oý1u„E¬·uy–߈í(cFŽùÎokxÐòLض"ÑUG8&IÒåÿê­ANÜ'i8BáÄE?;äðÑPõÌC­‡Ü\nÐF£ÀH,5¿2“&dòl›”ÈÆÀ2®oryŧznZB¦Îjkå*ðÆU/oãDÛýc0žÜi)6xÞçÖs'Âíf¼bŸÑbÇ•/° Ž6©½³ùÙR§‡;ü).žý\»BóÂažäš‚6æSax²t‡‚#»@Жª IŒšû¼/»{?I•^¯©tìã"üËß¹6/Ê㜽+¥qÍþX­ÿÚXð‡ìGÅÌ?¾ õ_W€Ç éÊ%ó`˜A8ø(‘ݶg±§t¦NûjA¬ S‹ü󱯯I®†`?wƼèù QÁ8‚Ÿ¡:ÄäÒ7E\FCÖ…@y#Ž€k½Ü&Ž-!RrÛ\ðHJ&ŠTg$-!pò<úVçc£¸ÅqÝb›nS,wÕ'ć×I‘1È/x÷½NA|‚°ÞÉ“ž¯ÜƒÇÛ‹‘EƒÞP5º/V ¥fRi° GhùñA¼Î#¶–3«…'šBå‚çC…ú«SQà)º‰·mäB·RóÅÌr_Ì üª½B†k?Sq’.q`&­¢E¯#¢³›Ìû¦'ëÙFÎò‚ÒN²Û$çÕ ¤Óî#‘ÜŸä–»ÌÂÊŽO^T•¢Áêüf®h;ýÐ-×Û%øƒ¯Áš 9ñ»Š²\”ä‘‚ÝØIš.ôVk?¶ô#rµÉ–ô*µILù$p…ûe—ΎÜR„z•i8d,Dzô-C ú×.µ37±ïÄO#R”VÐd)ÿ%ÝÔ³Ž´+¯!Ç®æê¨°SŒ×)ö8à {  ‡tXTÁË÷ìAæR›V~”ž_Ï~W¡øR±@G­cßý­¿O rƒ= ¯®u?ÛÈÛszÝ /Y.&‹@ÿÅ…yÔCÑ.²JÖÁA4­à¾u[zµñõ¶±!ÕìÆªCÊI¡Ž˜õ R6°ËRÌbX¢&»øC—hwÏl‘Ì—6˜ÈzRdYc‹ø€'íÞ0W_ï}æÓRèŸNæ>f1ùƒü3çHÔ­h]xÐÍ4ƒ™Ao4·TAÉ© õ…탴áM ³¶,Vù½ªÜç'¯¬h÷Óøè§Ô-æ¼âε|´"®Ó”'(lŠŽÈñ9È¡Ýûì¯iʩՄûÂqóÏÿ¸8G È)ô,@èÜ*l©?Åõ2pYÚX¹¦Úiy·%í`™Ú|£>žŠš•€Òº£þ¬§òrr]ãm2}ö&p&bûKóÖ$×^Þ>EA‚;ÓLMbçÕì*ÏÈ~µ£»À¬:´˜ÿèöîT½/H%@B6§7RVÆxGQsl^pÅâ“d¿6€ë=¤„¢B2¼ž>t,QɪðjÁím@Úy£cc™ÄE$[Ì7Ÿ¾øÖœeŠUýÎÞýÖ©bR› ¿´å°ChÁÃhÌæ¤Þ3±„¢IñgÅé7n°ææÞ7tˆ°Ø/Ðw]æP½m2_ße©_éühÎ×nÆœQäl!ZµÆ¸RÇf«Ç¨Øš¸—¸¢®øÌ"Õt¯³vwüõ•æ/’·$ùõà„žˆ@^F>Þáï£æ‘zN(¿ðJ".h¿¡tàûa²‡|’VÅB«+¬zÎ!±Eða¼*²èÿÝË’ ·#ŠÍ,¶kôAÜ6iì…r<®‘û˜h#¶ÅkÕQ,Ýö‰š³1ÅT‘µ—Í}½±£H“º³k|[þ_qA¬l%X=N }­%qV™]¢ÈªITýZ\2ň¨æ઴2%ߪnvµÆUvLiÔ“¿7 ˜,@ù„¾Zä¶jüvЛЀècõ{³Ê- œØ9¨3Ÿ ”O÷XûÿˆfÄÎc€R $5eYrêÎù‚CÊ s½ßt¢wmŠŸŸ)”d 5,OsV‡«éKó ˜P݇2æµöF¤jïM»•÷¢:qÜpj ûB?páJˆ1Ë`ÝîjâµÌòrhpÎ@æƒVz Q(Ú®=Õϸ¥ Ö! »tû@cØvŠõ2gïÑ‚IÔ0JÄÞ|¾ð; [M ~+†ý4]ïuŽÒGtD¨•¿l]H©¯Éø,ÂíÛÕ²É0'7€—x°óÕôçHÇL™—¬v9ù'§˜€<'(KšÂö–Kà³™|ŽHw0懮½ŸP¼Ý\XFØç øû¿'ÉÔ-Ó.iŒüýŽëÛ¼y'ç=:l èþd.­ÆŽyjPiÎFÑq¾"*W‘”àƒqöàþUZµ^µ[£²17=ˆß´¨¾Wë¹ × \qÝJ·™QÍ4¶Ñë¦gh£›7¦çX§L#ôü°Ÿæ„+¯PTƒxuð¢šVBD›Ð 6ãÓ±p÷á6sà¯Çœ¾4;Ê.+»•Œm.Gw$Ù,iG”^%KaH•…³zŠyã¤õH¡<øÃïN„m±Õ7þ+ø±­ F(æ¡£q xõ™â†D)y P‰û3ÄO¡z´f؃¦×ö §(a4Єm·Ÿªizj`¤^±ãÃÈÞjÀ÷ °;Ñֈąö$u¯”¹S©;ÒGdQ[qI)æôÝÅM=exíéƒñD쎿èIävü‰"ÂÒkU/˜öé0#\¸V³)üî½ ÿ éBíäJ|ø“G”šK0a%²K*P±rA³ÛF¼PY=ï+’¤.§Ïl!Ý(ŸŽ%r¦,r,¸î±…ÑáM!™éþ䶘Î3ÜÈìYrîìêNžÁ˜IYæ,èuÊÿ/„D½(äü•í[vDp‹®u­}õ’vXêPàÛY‘p.&~7šI9 ¡5••YµŽ\hažPÙC ííÔh’„×B$ýÍ*‰T#,2)—J&,]Ø–ßKõ=3/YùˆÙ'5LVtô±QŃQø‘ÚoÑÛ«'ÕOÄ>]ë¡»ÊÙhó§¤El¢vjH¨Æ“™\¡ñð‹;úfjÖÚwDˆlø qƒ©>¡û¢Ð—ûòýká—B/n%ã›þ㨬ìƒ6u$x`<5¼Óc€àã5¶?Ït{¨ Ì8‚¾leæ%VEsf3¹åVÎá*ÚÝ«;î :¨éŸ¤Ü¤*hBÑlm1¸ ¡=^Þ܉)P^œƒ¾ÐKèµxMeŒî3ðmòe#Y˜>R°¬- &•â%ÿ™*EÞ §íð²5ý¥OéWØ"p5ÕhF‹§ b¾Ûÿ–±nWL@f;1i˜\÷ºö(!ÁÜf&ÒÉj‚õ+ÙCÊD•Wêh—¬h¬“%{ö ]Ѝ#”|$ˆÁqö§ãÇV+Gû¶ ˜2ïÇÙd×4£ÂÄ"®V~«ž0–·5…p÷!V”I°!™’6Mj–fâ £Ñìy:¤ë›k™¢”NšÏ"Ög}†hûùN^VŠ—uá €Å²Õ5⇳˜ß1úLÆïÜ=þMo•oÈÊ€€­lèø·!)¯‚¢QÚ1Q=Çèxw‡Åj7·ëSQý%åתãlÀAUï¶¾æ×ÿ„/™Ì3O±&M5ŒÀ¢Ù"·Ë¹«q†ÌЂ!0Œ>æÕŠæ*¥ “ÓæõzÇiáÿ/ëP¸ pYü¯:TaI“"y£!­uƒ›úÅÔéyú@\‹»‘[VX½Æ{h¶ÌëùæÔ“²]óM(€–Ê‚D÷ÛÂ[ Cø”йüÛNÿéñ‹]EÍâ£ç‹Ê°M\e^=«ÎnŸŒÝmf¬ a/U ȳøýƒðdÚŠåªò¡ð²«M@GLF×Ü:®„½¶²«¾o$Y2°'´Kùýß%íkQÆOÿ{Ä©mÌܼà©PBýÇ aR(Û"(Ô>K5æSÝIsU¸îÌ¿¦{ÎWé‰]-e„_Üþ C åTè¢"U½TÖKÌ@e ==ØÑ\ºƒMå7,™‘´Hvð«BĪmîäýd©„pœäXCÑ¿ÍÖ\ëßÅ8þ‰3sA}ô¿ßbmâ+¬QðúYxG«É³h«áÁurªws…ŸÃ1šQK¢Úåè,ieš+ÓZâÿûVGC?Ù½{ºØ˜§Ò’ûK£ ‹ÒãRÃg¢TÖ¸P‡ÚØæC¬ôªSM¢¸Ù,Ÿv+7û¶˜â’ØýÈi+¶PƒïnËáPKø²]x)s·¨6|ßê—Þ›×Þ–¯èN0ÆŠÃüd+VeE(Û QkÜ͈§1•²Ü|äÏÿºHÈ»A¨ÂWBQ§ 7¸¿Ä~…ÀdÊül,è8]ý6»‘\9wYM®6mžÔff!ØÁHÖ\5 ár>þ@™:%ÐÁëNŒÏH^|‡‹[bï)3¾®¬ ­6Å$í•+BßÏîý‘¿q]œ¢ZhÑDɔߨÎÊ !ûüÚi&³)JVÚâÉõ‹Àü"ôIœSãxp'‚B7ª¢úƒ Ó9ÙÄäÞu«÷ÿØ»ö+,–ýÏNG¥<þkòêÙNï†ûR¥‘%{ë e†Ð¦iX uÅ÷PÑÃåÄÔ§½Ž¦Ï#.–B:ýY›†ñ¶YÚ[ç¿è’7ôV´9›oÊ׸ñA¥9ÿôíU«çV¦{&äó¨ÛÒ­ÿÒ"K‡å!A&râ°›‰"àŠ–‹[X¥nÁ`«ÖÀ•–X±±Ýp—)º?Lµ?7<òr0)Êj…ùѵò£½ÚßþmcO©Aë¬>ˆéš‡äö-ÒðrZÏ¥ªæ­¥*MùIʘÈÛ'ÍPèØ»ÿ󿮘&¿–9m{}ОK‰¡‡ùWá—¹ë¿,aò:èà¿6zMX÷”Ux‚Ô)üÓÑãƒ-JQé±mÂBP¨Ê þX&æÑà(ëc»_ÛÕn¿¾dW.Ÿ÷pK D9$í¾r©nù…°91š·sÐõ@nQAþÜhÇ®÷ýƒy g"· ÞÂB”JO®ä¯õÿFñ ~MO'û§Øy„ék¢‹on'~¿×3‹ª¶7¤bô9ïs3iã¦AY¸­B"Á±ˆ *ôŠk_{_¡f^CH0Uvbéû! \q¹0È{Q½®Á'í8R´Ý\ ÷Åz#²‘KD‘ÙxYãYtùm³›aµd˜ÜPž Ó—y‚xÀ9‡~‹†ïèàk RZ©V¿{`bqc™³þd´ùf6ÎPpû1gÖ:’¹9²› endstream endobj 256 0 obj << /Length1 725 /Length2 38224 /Length3 0 /Length 38785 /Filter /FlateDecode >> stream xÚlºcpnÍÖ.­ØvîØ¶mÛ¶m;+É VlÛ¶mÛ¶íóì½Ï»O½_}5ÿŒ¨qõÕ£Æìž³I Åìí\T<Lié¸Êb**Œ :fhRRa'SCK{;CS.€º© @ÙÔÀÈ`b``„&Û;x:Yš[¸(Œ)ÿ­¨ÙšXÚZ:ÔìmìÝ,-ÌO×^¬€Ç•ðÈHê>ã=â„ñÇ0#Uò&O—fÉVüqó<“ô‡~ë |¬e™|Ûo…-G²Ãï×vÃ&R «Z~û™Ã^€©!úSÄ!ÛH¼˜ Íe,¦é‰òú¦Q³ª§Så¸:ì¿f-g:2¨˜°>©Ä‰M_8û›9Œ‡€edÚ¸ÜE»±ƒòEYݶ=VßóûuÄÌVÍ5KzŽS‚#¿‚­Â†ÉZÔÌ •âÂàkc¯PvMsÄ‹ñ©*xóÅ‹«LWWVW£±í¼BX6§/`f’K BáÞ5 _¥«!ô ‰½µK¡V'4–Dj窺ÌÓrríλxŒN–)÷¨_~]”[84ØîùˆšvUæÎ} %¡\e^Àb› Bëöá/oØAUä_žÃb“PÃ=™)-X|2i–~±­I[«}¶öì‹öÇPn2øû…YÆ› Ùô{ó\u$ny! ¤G[ØmÖ©˜'e›0<üU|ã4ëVH :4ž"¥ü¶A¢,pòÚLºpk„E+Í´ wßÂ]ÀÓÊølÂtû"ëpXD¹éBÿÝÎîÈ€Š¯­Q5Zñß‹áÌŠ©Uxô¿´ 0©öÚdl€ây,òÌéDµ©ßFÊC‡mü¢FÒ ‡j8ˆ;÷ÐyáP$ù¥§¸hƒúޱ;ÑnR^ÂÉv ÔG•<7ígo¬{–ÎBÎyh¶½Wç¿@QL|îÄ^û¿fgHñÇê1¯ê‚õ¥U5lðf½>=V#\´+ën›/¢ýXICj½õl‹ˆ®wIÄÒà}º›$K? &pÝ"vœÆÆ÷«ÐªDÚŠïÉÕt—ÛÌ­â<—%çPË6לŽÝ/0è•´~÷s6mCñ¡Éà®ÓÜÄ3¦Ï¹…HðéwH`Üö¢Sûº7L• V+㼃ÿpM†Ü&©W­G ¤çÌéÂÎÿHdž§ˆL«v9"Ìå倯Mpor-L®>YÀ;Ù‘y>:„ry¤0àâWÂi|°Ùl}"G.›{v>Æ@°c^pPðúìM5°²ÀÞËÚ|+”œ _íÕÓwëKêâÙöGg[¨¾E²-¶e›,€§þW¯Æ[?ÐZþÅ›«Tk-¼«¸¥f¡ÚÅŠ¿};™¡*iïY|Üé²S•oQn~)S—M¨IMáb†à ]I/gÜP-q°à¨²'îÇœZ­êX®`vÄz"Óýå¸óA¼™0pÄLjÏ#ÑÔy7‡‡u¦—ÀÒû+°Ë#æseCâ¾µÄ_Ž’º&^¤N™{òÓÒþªyb«]ô„ØSºù”/5-f¤SÊÙ‰+Ž N TÐL”ž0Œùׄ0,è1ÉðŸbF¬A²›E³˜$?y‚¹èQ.@Ú÷ñøöä3xv†Št zŸËŸÚvi]ü)-¹Quy¢¨]d·"på0ˆ‘0"0­ž‹:7“uë$ü’ËúpÜÆ5JÆ Õ÷Õ`ú†0¾|y'—V¥Ì†•C€©„˜‹&æûK©¼/‹[ ¾8T­2¨Iw¾ÔÆfùÍëoŽY¥Ç«.âÊtÆX„¬™©©ÚËø ê*bÇ}Ámk†˜#dH.ççÁ=T-¯+Ï”ˆòÎül‘[ <|! ¶ŠÍŠur—¯q˜;Þ?ùx…H@>¬ù/@*¹ŽTÝ0g#çnÞ¨‚«nŽû¿ü;`ó§Â}C9í|tù9—d£†AÉF=¶rÙÚ•Ú§'ÊÀ:¤q/ÀOb?1t>.nÖÍÉ8Âs¤/^ÓDŽÅb“¶Ÿ­-¿­‚§ )VwœuMþ¤s<Ý篤µ2¿#C‚ÑzT?GqþÑ,Ì!?×bòÞÖÉ6CðÓŸ;GU[©<,…ÔGÜ~âR (®×éR†¸wmEglÇÕ¡¥Ô*Ÿy'#P±.ì>9 ¨d~ì—Ô.„¦XqUº.~t2œúòTÌPÒ rÚý Ih>FËQgù––ÍÅ=D12A6û—¥Yd,Vá4ßñ[D ÝÛ $)=!–˜@“«·y‘ x‘æ‹*¸öb¡$~z¹dÁ­å§2‰E¿º¸Ù²ò„| {®pܹv ²ýŒÓŸJ‘iãNïÉäg±ý™ª¤à0ûaî^Vާª[÷õÑÝ{ÙUÊ ‡à–ü Û6µ»ŒŠ«· ƒ/>d©>:@ùðÀéñ¶«Á'•yµsZÞ:~à´J]J@˜Ñ6Þ¤ð÷[U6ÒÛyõŠeZdeôﺳÜ0ÅV¸-§¿q ÿî“ß·ècgm#åbU‡é™­Í£_O2•±.ÐHE“xŠ€v=öƆ(ñ3VÇämê¾,c‘˜=)aû€ç‘Š»ÍdzéÔ€MD,/¡Džv]Q›cIcbƒ ï\„ÙQcYº/ª>±Ãâú0ì›ôÕû³À‚õõú—.¿ËÞ¬¸j÷i é2f×dW¿ ä'¿35´<…9æDKFÛæVàjkûtŸ>ráëZ·@#(ëúEžÇOq€Á¥ëítœ´ÞcX¼¼‡‹AÇ‹ý5vñŠèV¡"¬9GÂܰuXa& ºK÷CWEÉxÑÿ —Ý*¦Œ³ɵèà-=ReЛiåÚ¯1›ézÀ˜¢å¡¤@k'쀨nè›þùq®lâ9z;3쟪|™£ŠN \=Œiq–ÌÒäζö£ÖåFÕ B,2Mýk(ìYü\Ñè÷LÀB£x«)‰•rü1ôŠŒ¬}rgÜãjÞÞIs†G3\½5pOœCÄ<±î‡/<ÄÜ…“ t¦´~S݆·w¾S„þœî•)Ò{=)oøeµ{bN´&C´…{8ÿj\b¼=g[cI£Ù‹NѼÃG`$~l´‡¹x’±4;ƒì'?Ú:ŠŸ ¹«Ý(º€FÙDmÑÆõøˆpÛy¬Ø’ogæúp */*ŠDƒ_*Že&&fOF–Gf¨öÌVC%…¡šðL1¯ø8áÖQd5V8ÛM|Däº \W‚HBuû‰T$MK¨±¢äËÁùàu*D¶unX\0x4Z²…^³íÄBä9S™xkÜ™(¶ô›Š ;wÝI´ ¬–2(°4šQiØáf¿2À è,NHò‘u‹¾í¥tS[MÆ—ä‚:H ~üaA==½*Â|9O•ÃW‹£Ÿíð²Où¨ý¨W«>3Gc yý`è¸Ýk\ÍzËQë+¼¦ë;x—¹Ô6Ïæ¾Ý=¤ Y=>‡úöÊAô]×>t,^ô(ÏŸ˜Æ©K"Æ@R¹³#ü4g{`¸µ³ÜVÍy32,H3¢ÊzÑ)h€º¤þ„ð^œæ)·î@\oäÿ2 /ò0^^ \º]SPÕA€ä°äP‡ÄNþsõ !ÃZh~ñ NFLSy5ïdµõ>÷ЋøÃÎŽ£ÙðÝWhÌÒ̪ÜP¤’ެ‚[" ÅLüV­À37YdýÆ2ŽSiêr…x·ÇêH [fÝCD™…¨–Ôë&¿ùLxS^jwgnVãóÚ/q=<W(¤Ÿ^æv¥wF¿!X*ýB^"-,Pi‡[%<ÛbÞýiÚ¾ð¤<|",lûܬ&c„ŒhîÇ8ªÎ_w}ª™ÔdUŸšÓSê#)ÝÔòÈÖ¨J O‡{+w´ä½ÖL J^]+ÑKþèÁìI€AX%Þ“Ëüú¸Î¹RÂã­"5~Æý˜òFÚXth£«ŽRŠþ¨*)Öp“l}aÈ&Fš¬äÜSØuAj°o&ùR‹¥3€ö3íhŠ4ÿË<ßv8‡ŠDì]§yÚÆPIÊ´Þõön^a[¾Ô”µ¨f;£TnÇsIyŠ—¦ Ø_ýÉë9áè¦ á÷Œ°vÐÜߢê“ÚŠ)_bм'RŒÍÓ|°|)úkàLc› ßä áÚ z'Ú×»‚˜4ß”˜óSÒe:ŠþS“íPü:BÛWŒ&½A­lg,@îØ¯…¿¨VZNVÐn"NXîIÆb)Ñ&?¤7%Ú®¨ utÙ3^Ìwd;Ó)%à JG)¿k1rùrrïïR2&¥)È“¬GrsÍܽr!ô”žˆû—gÈ^,ÃÜvÆÉ @)d-&â·MG'æ¥.Å×ý©?cA”M6JÅMÓGÅÒ !µEF-²´Í7÷ö3Y—”ã+rŸ4©¾ñL¢Àsï&T‘ :ZÀžÆÑú4÷BamXèC©ow“G u}1QÂVd¸BR”£ÓÒ©Eg¡ùÏä‰zEó˜+M‹êG˜Òè©Nç…ΕùòŽÙö›×¤A.GÆÎ ·Q+^Ö é»|æ=ì=KÛ)ùàãúþ‚–RcXÎV¢Üxú% ïš­i ŽÛÀ߃QÄ̸wã²Yä|0’ÞéɃY9 JøGôõˆÛÅ®*`þ…_JFgÛ ’†÷˜*>¦ À¤Åg!9£f4˜ê¶¸RKH¬¥Ñ+{–š#á§™Ú0îʼî@R±›,q &¤‰ù`ä=mí)ÌLVž¿T 7£uÁ Ç›!J |À*W¸U×d†i‚Çî¡lˆÅ"ê$SÐCHu<;Tš¢VÜ#–‹Ÿi4jŸL®å/Á[ßÖe¸3P  H_©bŽr®é£QwÏý§“E†L¼üÞ'ºF•QˆÇÄêûÈ®;‚Fîðè¡5»E‘3»”m2üI;{Ô†ÊÎ<¢tf‡ =U?2ÃñƒˆÙ÷#eTNë1XŸ•rzü ©þt³$Ùáã¢Ö¼“ò[eУ1çŸÂþxv—Ô3E¨Š¢µ=@2~byPÞ­}V÷$ ¤fô*®û9]{¥it>3wfY1/D~h‹\bQUËgÓ¨­c¹ .ЈTH=åß«ay­^ˆÐö?ªÞrÕ¸[kÌC7žGè¬í #üîà¡hôa#-?œ.xSÛJ›ûô_ÜdQfLß±‚ÃwIšGd5© †ð–âjÛ¥!ôõlôª»×åÎqPNxQIömôÖä/Íû5o¾å!¾q‹‡<C9PLDfh{ÿáÊôÞ€W]¦ î?ÖÅÊÓ-Ãir[‘{í¯ªPoMg˜È+Ö->_Æåu=Ìô`ޢ̼HíÂbùØÿ0Ýûëw–é‚ÍÝ-7š4ôª½ܹ®TBË©·úódxÒšˆ¬%m²h¸û³…5•«5–/Ræm€Nm@N‚¨ θEíÛÎ<¶)Ú ¿™h¦Ñ@51ÁötÈ,²ö»³zâ7+kÃ’/£Ætp*KÅ! K[æ×•<»»¤r‡y\·Ë•~cžKocq³>nFóœo|a·<´Ø‡xó±×¯3¦ éÁÕð‰G·ïƈ¬,²Mú/ØlÊ+µ?OnßfhœÛƹ…c\¢·qQ¶cSBÀpnöc~§È3ЩúoÇ®|7 ‹û¹I©}]_jZ$O‡ÑϪ‡ËŸ¬ûÍ«•df?Ô î¬#•MñÛ ãß3.eû(h£x#}ýxŠPþÊ™(µýNpmÂôÀE ©0/?KÉ$-_ç±¢é£;$×ÒåÒt*ùm¹¥Ã.£‘6=’íaóÎÓjL5Ü/¨ «Tì|"s+œ¿¾ÝŠ$Aë(œ*†ÿ!¸W0`W°¿íB²š1ÇÛÍÝBX5 œ10J¢kéÈÛKÓW… ùê—‡ õmÆëÒžÖtõ:=¢ºøU‡2Å1—‚ÞEšÈX”¿ê3˜¯¸INbdrný™àe¡´Ô2Ðþ<¦_ÜZëñÂsð€tD—?£p3ΰ0cé5ýãà£SCa/LÄMà²ÖART[Z]ºýNå(B©j¼U!†õ¼åV6¤o2£>%2ë®]ý 9ÿßýÀ\EÕ&ýpzø2ùžŒD|5¾ üä"B»¨i¡µ³1¬X©n°ƒ þë¥{AúÁ]EFà÷‘dÒ·%ËÎ¥ÔLp[‹ ™…Êн§³++EʢЩæa:“Û¶6aªû8¨5ÑhÊû‹£ŽÂíç…†«NG¯w¾¸“âU>Îñm+`I„Y#ºê* ©ùW4©·(9¯T{ÔØEŒi/4Ý`rF—Ø2Š›ÛŽ¯GCâ|–xs"»ÐeŠÙFéÓ: 9ETÓôà¯ÒÀ¾1ª¥õ/׎"Ñ>äUì㋟4…N?™ž˜\d×m¥ÖÒl i [Ê+c’pÂù~üéggÖ"¨}ÑÞî»5ädt¿òµÌFÐ.N®‘›¢½8„„O{¹.^Ã˽ØFña &ÝYöW¯"EYD®¡ BìWóëÄ¥±-:Ú?4Ú¬«÷5ˆ’úŠ5Ös@Kà2Ã3ã§°¶oÓØÒ®ªE/VŠæE+*)]Û‰ëo€µŸ q£»GÔˆô<¥8x¥n·ãA—zýÀ—$s)~ÓÔ9üFꊕśÏõñ‰¨>zÓ*Ê·ÿY CßQÏEGRq j’ø6ø†µæß.ëEä˜å´2ßìxð@»’§gX‡‹t»`z> ÁuŒš OÇŽI†k™‡O‡d}N íê,¤”Že(ùuZÅÊÿ¾Âd¿Þ‰¢i‡OÙOÉxFj·Ý Ùÿk|·(ʤ­U<Y¥’©V°Z£j`SìnÂßiþ~Af‘y±'Ì—·6²¥,,IPCUY¬‹ebÕ»y–Æã†åRí(A‚Þ;´:Úýgl̇t™¨â˜Ð¶ÕCH=ìm,á2QyôœëtgQëŠúG†o¾¿T¦’q#¾¸hÕ½¿^§ ¬ë‡ðúIÄ%0»>W£¹€¡zב;”wð6–eh­ü³KÙœ¶gœÓÀ¤ÇÖiDgØdß~?|FH= ˆ*)»c­Õ x\o/û™Ž[+Ý\ñ/aý™¦en†t. ó·TÁðãa%+i>“©êM€”%ʘ6J¢TÐÐÃ| Z Ü9ãLè‚€H¦ÑkÀ¶h#RÆ–5ç1åVVz¬Lïê_–‰"ûË›ß쉛vsÊü³â“K¸J$‚å¶Ög¼¾|„ö̳”âReZ¶“ÞʵA:|¿ ˜ë·Ó¶hð€¢>Ÿ¥°Õ²}6r{QºóŸd¸K2°Gï¬öÑ ßL‡œјөâö·çê応ìÊ2Å‚ep>+pß“ñOøU!Ì‹-É´žé+ pRq’/Q©P¬Þ“XÌ÷¹«rÏœœa[Cà»çÝ 2­([± µ.hc…e>ÀdŸá-j‰9´¬ÓUš@Î@!=ûŸ8˜‡ÜÂ24ñ¹¬À±'j£;oØSÉÌÖÍ;Ø€OÒL`£å„ˆNQ§®Õ¹qoúsK0ÞÐ.›vëÄ@ÝQ°ß*av±¿Þfç$èFæ£*»zAºX‘a$&ç¹êT›"Ù‚~¼w¿âevál×6ä‰IU.__KÉ?* €•¡õÁ%»ðC>¿éê\ t3ÍIÒ_ׇ<‘`¢pDÒwádxJu>‘Hwf¨ÚMû°~îæœþzåsÇÑz¯¬ãn“ ´T°dx«R9üÁBÛ¬ß{¿]%¼ƒ” ’'Öê œYªbùx°=칾Ɉ]Ô ƒ&ƒuÖA#A“~ìJúpß ¦Q‹,;å|ß„­jF«ˆÒ2›•ºú„¡‚ Þd ¯á½ý ,?–敉£chyÓœB \Ó¦‹©j‘Â\F»ù‚×ÙUýUy^Qd6a¡¡ëb3ÿj&¤\›¥Nd†n£É2S™ç5Šez¤ÂÄÉ}ÿWÓéìd9)¬<˜¦°ß:['ÜGk5Ú]Í¢sŸ~\6}@¯SBûøIá“D(å.öC&Ä‹Q<õzE]Aú–d€nRmÂ÷zcp¦š¦²$ñlâè· ôÜô+©£Ý4¾EJæÏ¬·Ên˪ŒÁ]™€ë»ÛgݦÜÚ©m½œd`³ú6èo†]×®éœÉ¢[x³¹šÑ²f<l}œÅŽƒ€nÂYèÂ4a(*&Ô§™3!˜˜† èÔ\ª¨L(áµ–W°…’ ’~éío¥—/4.CØB0Èî{¼¢?Eö!g]°éæÃjÍ5Ü­— _Ŭ m©Ç@‹-_=Ô}Ò³ï06Ðn™1 ‡Œc›€ÿ6,«ë`yÿõ%¯aÐ_p}ú¢Eí{G¼DïžuÁšänº[ßñ»½¶aâEÄ„4ŽÆïì,ãÃîÜo ¤ÌÞç%Ù¥ÆÊÓÊ“Ueª %Ã_ûQRBKn«Õ(râ¬al"»-­S¿ëÉG´$íºd2{ám)‚üe‘[ܤð5ΑÙ#Äó`–3`è×{¹˜mÔò¨as!Æ’³ ­¨N‡³h´@z?‘KV\§ŽÂÿø°äXQZäÁ•[‘ixMÌg.!+†±õSÃè¹jp°Žýö¡ð-†4™ž_ðù4NNKyœfãM“~&*·Î<ÁÂvC<[ÊZ]cîÞh†ª&ž@NžÓÙ³^6r:S˶®|Ý©4Û8ð X¾œ“:mІø¼ó»x¢0´Pê˜s*ð^} bàà8.ôi笶ÍK´xÅÙÏÐcÿætQÚ²}ÉÛ)e=x’_…›#cù˜ WÇl‡•gKìíïxÙOñ vúq%ãT¼<6û"Ä"ÆEçN[é'¹»lÁx—t­4Wž5° ^ëžf¤’U[E“©I'þMª7ªû¢¤«VB¯¦û…eÕ廉íÌ¿®?ÔR¦8A¯jšÄ”cAНqDüí5³öÃ,ìèyBí÷]ÙO vÃóÙ"2<—ï_Žùe”¿ÝÕÛ ã©ñTüD HÜÛçŸß+ý¸RÝàaÏê2¿e°wõ‚i›¯HŽmWPŽðÓ€3þÎ8¥ø<”ó`Isö4ìÓT1õK›Œ üá=®ô_°¤ÃGe¶ÄûB*Æai˜_Q³®»:¤°zç€ûì]‡—óð2mÍ\!„QÌAnBj"ÂU˜Ód ¡NjÉC@ gµçÃÆ‹XË.môþ>CÄ«–ÿîDÜÌïêêðÉKs&lm –ò·2UojFÏflM‚3ØEŒ,!Ë“ƒœ‡ž§Gª×=œgŸos³J1õÎD­5v»ñ:˜E¼½†|n]$о…ÞëÄ¡Œ=†ñ¹½’ã×⫼ǙV­Æ©mTegTŒÐŒ¾ ÐzXŸ)§]qÒøë‘ÐâS”Ö9»JÖ›eE1Xìþ£%"[#@7Ùo@Ä[mO-gÍ+ˆ Ždâß,lœ&W£`\Ûˆ²¥GÇŠG‰n×Xñî—U‘¶QÕÌ}Ï…²FŽaëãùƒ28Øž¢Ì¾H¤ÂÖ+7ìV·ä›øôOU–sP§µ³Éó …ø“rX÷À"Šæ)í…sžìbûF^×y”0Ì5r3ÁXМ«m¼¢\ã<ˆÍuwi{Ç¡âH¿‘Nñܯf,!ÿŒS–0åõÌq9ƒáØ»+WÂâ‚pÓùùüÖäk‰MN6.LFœ YFƒeš¨Ö –Þ^è13Ì€ÍPgf°æ%„öå£YQ¾' DŒZ2}ÅÎí‹òÚÎ[f~¹‡žÔ#Õm:7|ÚKÓ5â/ó«ÖÏ6C®v?jò½%w[—9RX¶¶n¹O]x,ãë|,ÔõpKô¤Kaùg`+«».€ (¢ë‚íCÿï±Ï)úì~_#÷Zh(™‹H˜†±èœÀì|“1ÿÚ•ø¸n ÷íÐDRIK†/†ó´);­IÌô—>PaásÐ8,´T'µX¯SƒÁÙø‘ü³ëöÛTOúF ¹§–+nû+ !2ÊËU…ëoMm™¶C—y}Œ˜P€çÏ­}yµÐì³”¿Í„ã;W«{E]~2I |Èxt½ÉõR‚ˆE ÔT,²Y1˜Æ©‘4i·Ÿå•%®Õ@ö_„ëÅ>IÙÚP´E‹´˜-×`»bæÛÊÑs¸¥u|»îŒñ P<ÿ»Ò Û¹Á–²ø¤0~bÞqŠ+>dÎ÷aH5tö~ðF- ôøvãþL.Œ088¶pdgÄf´…7JTÕÈ€_ÈY¡ÍD¡ì.ÒkO‚AÜYž•ém¡¹¬èxU¼À ;;g9!‚MÍß™r䔿›"rtÏ&šù믡*ò™Q£—êG­bË.÷˜ME¡ Š7»4Æï 1D’ïÌ{Î&Dµn½~¥Å´wÂ9$ tqݺÓdW³ÇNrc–±- }ôCõ ¯×žzHiS¯%ÈŽÝbtׄš¦õw©PóЇezqÀ³U‹ÞÝ!p ê/ê ù¾küI0âŸß¢Ð'É #ŸÛ;à¯yDNLÁg:`ˆ¢NÓ[– ÉÀù%ήDTlëÐùË.Ø r«¤Ùj”9§UãmŒ†é…$‹ºµcc%M~”!‡.§—ã– ¸ão†/€û-7ÏŽ±þ&•ÐW)IU¨ ÏB°†è#³È±áÁs6Fs¾uêÝ ¤´Íµ¯_ÉÂÐpÈæµ"çke “·°÷,3ß¹úÏ“tURnÌ…Ëø%ÿ>'S}ÎyÈ ÙmÕì‹Î‡Œ({ßµ,¡hD$ä"R E(„Õ7¬ó/÷ŠO†>†@³w%ì»ùKGD;;²cÖê÷kÏ'kèèIÄG:GÞd³oóÇF³Þ¤©…n¼4â¾<<0ûOºP¬3ºsY‘³'U÷5ÊÍÌ¡41(0¥C8àœ“?PA´JHø ˜Fˆu,ðt;ÌÝä³¾™»Ð±1ßlA×Á°œVœÿû#Lž“uŠ‹´\d‡ÐGàL]ˆãmŒ–9]ÿCžŒ"”É}œ/°vïæ`–NVð¬Ö¨­ÅLPæ²à æ.ƒõº«ñ„í §>µ2Ë–ÓD‚]Ó—_Y4ÏÃÔp ï ;l<•ƒQmTÔ1>;@×!È9(P{¸›rô¤‚‘‡U5[º¶¸Ù‘9,ï—ù×HÐH…tæX:„CÎ8UZ©zaqÓ~ÁÌÑüR’<‚¸²Yí^IXÈèw£—¡l[kñÃ…=” ìüqÇSù`Í\]|¡¬ñeöð–ÒÎÊP{'*BÃyh‡YÂzM–»z'r°Œ¡X® Lrédš¤¾6ÈÙB©«÷vá ¾k7׊-A_ë†'a[¾°D9‚m2ÊŽf‘ÞzX*yd f~w.år7«›åÃ<öXy_3öŒ n|We—Œ,LQ›…äšoÿ–û›È[tŠÞ/ñ=¶S{ íxÖ®QÔqÉp-O£,Nø—0»)Ï&™'¨I>½Ë¡ft<ƒü*H*DÜ×U·M|ÑO29x#= ÷Léh>–F”ÎæXòƒô»ˆ$©ÕY¾Éõß¡‹¶£›,DB@n&6nÕž SÔ¹f=…Þþè³jÑß¼ö¯ìRϺ‘Î铬¥ª6P. S8I|.týõÄŸ£P‡Žog6„œ˜AÅá­GÇ’››’±®ÙòFµ[°èÃ[¨&‚Ñ¡Õuk~1^ZÉ¿—K&û­‚Šl:È‚)˜²u>2/~K빪çî,†’%žó³Ï;/3d0ØK¾›—›­V½Ëxü.À–kÌLhf_@M¥›sCý™Qmÿ¸¢¦^@;3afù8X?cðˆ|"RIU‘qwáH>‘˜öôÏ_¨©üü “áEâô'…æ \¬4,2ìÖQ=îtR—IÄsìàšÌLÅ%ÚÎ^–™tóN³)öò´–ì}K?wÖñKÀ^Y_=åëzÜ”ãPb{Àà3¼©Kò;«|;9@2ÇãÓph‰¸—›ìŠÑÁŸb„eøò9NÉ ‰Š¯ô–ßЕxßÉB’ÉS¡QØriœÇII“×i³w§ŠHi Ä´SøžŠI€c" ~~·S¥-6ÙŒQXsþ94Ã9Vg9ÂGÛ>VP¥q¢æS—ÊÎ.jù±G©ÖtëÅ×ízDàEÀþÕ/ìÈü¢¼ýâÑKéQï¸ÿ¤øŸß'+®l…×ê^Ô?§|h¥r¾×‘å û_½z&½AhÀ|³‘‚Mya¤¤!;vy7æZNï–®ªëwGZ†¹²PŽ™A$6þÙX!Þ»e?’2&x–Õ3Ç‚ÛCµ³ã¢T”3×{…o-ióqòÝp6§¥Ä©mõŒ8Âg0¶½b ú‹K¤Ë!Æ®Q_3>XÄ!`ƒf±öÁ +íPCü»Æq ´QˆBÛšWËQÉÆnìW<9#ŠQJBÆK&“þn'eTÂ’R¯ïpÂŒAw9ƒ}üvL¢‘8†½‡O¢çëwrЧ‡8ÇD¸ùùÔ\]–(¡‡dúc>0îF܈.•v¸”JKÇp|Ý<üËyÚ²&GÏÁÅn]>U÷æ0º»ø )p{a"¼ö»–Žm`2“!>=®?7Ðû„q(B„é¹®@åºÇK»Îsð£ºöª /ytÈM/<›Â¬§×Ü*<¯[ól95Ý’Yu–Å€Í8èNúêÚÖ¹~ËtœÞÿ½ œrÎV5µhtǶÖJÜÅ`#Çξë’Å«Ú}Ìô5ÛÈÓVXTpWì(HÍLSçÈ×~W·}VE‘v¤);ƒ !30üQjq]—ñ’c|d$F#˜™I¢'*ƒ¨b†CÌ&cûë. ™Ukýù0íítœ†íÞÄ>§ñÇŠ'_ÉéAëƒ0Ãׂ}‘ZHM[û ö¡þåÊAꬑ¤G án­êY8&}°ËФbf׌)îÂxŸ‘£¥w°~?Ð5dïkDzÝ1X$ÓÖ) ½ß„v÷à ©…§Wá$¹à+¤«Ù„W¹àøý§¨~¬ +a&üÞX­=Åê(’Ì“†¦03”§§¯Ï„¢ÄÝ>Ë=½µFdañÁþsâÁ¬¼VL8G‚áâP‘íî²âYzí0ÖJäå…èæg°r^eõÎ\îÇ»¿3£gж eî;&òÍÇÃ:g†Üp>6)¥ìŸ¶ å²`w ÿÇýÞ0¬N‡év³ö"bÓä† ZÝw¢N3L|­Âoõ¡^±€Ê:–˜8Ï–Â!wœÈbæLÁ ‡¾J‘pe&»½P£g;>½CvQ¾Ð<ÏPÊ ÊrY?|†áé2FI~z” LúÆ(i?ø+g¾¯ØK¦²3ÜÒ¯ß=²É}¨ûÛÙ/a »Y‘œ˜ëÆã@þ¥oLæ£j<±€òê$Ís˜/öz“<Äv²º“°$:¸A @l‡ÅA —4ó/ìCœÞ°s¾…2Ë­ŽúáÕÅ´·¬'®<Ùž‘ýíëõ7+Ÿ²S6ÙÆ­Wœu’ µ¶I|ÄÆÛ^u´~xEŒá`ÝýÁ¦ÖÄâ #¥†J½}MâïÂ>©:X„©õ^’¦nJ§YxÜ’_ Ýwâh‚@T©FYe•"WI†½gÚ+|h†«‹^¦§2Ÿ 5'G"8=^’8Æ ÇŠ0•^”‹Ï ‰n‘lrþ‚¬vâ¯>:µaWÇÍÑÌ-éµ hŠ¡;KË¢,ãXÑ”=Eú\ožÉ6Î*A;Š]ñà¾.†E»î²,á+B‹)2.]±EFþ>”¾C«mƒž™­Ú¡Í9ÖçzI‹*î…Ÿ NûYÒ¤ì]‘_ÈUò„jTmFUA!¨ý •É€fÐ!ªDMCH¡<ö]}cñKð{_ø i(ÚŒ xÙ1­ØõÒ®(µãyûÐ;hïásÞ%8ƒûCKšëùì¡+/›x’YŒœˆ]ÍÁòóu~í|¶¥ß{Q/ºŽ#}þžgu˜$Ôá%2°s õêyè ~’@æYøJA%ÒŠ/J¾ª ß9ë<Ôn‡º} Z½ą̊ ,xÖI«wÝÖã'¬{péÌy‹Ö•#ÅÕ4cí˜ÑÁQ3SÊ€âéH²v+½zªïd\ÙqÕ²óB7£bÊMèÝ|Rø×Û”ö·!éPߢ)c/½ûý`5=¤¼ŽzýIÁΘƒîê³Á]Ö7üu™3Þ,ëKrÖúƒº)“‡ãyÀ£!Ûçl>3~ÉŽUÛ•O(@Ä&¡˜wÒ/kBtäˆHP)áIQ#ÈEP1ú§ÖŽñ„hZ¼=cåý[ʬ@hœøJ†jÒ™»#†$=Îph)ò¡9¹ƒ@ç DL !´ozëØ_@å;ÒÙ¾]˜ïͼÅ>’ËDÏž=ñwþ3‘HÜ·Ù¨J°é­+ŒkÄû!±{Í…Pæm|âJûcˆSƒžëô¦ùíRãú\Ða¹Ò°³Å¾TŽ¿¨CåŒÔõJƲÇêžF)ˆÎF¡B=oÁêéfÏjî9¢`¼ Þ? "5a;# GRÛ<“í¶ˆ¯º$k¯e·WbŸ¹u9Z!$ÙF$pÒ.O3Ååìž³™Ûˆ×‹÷Be@ò‘`â×ä0xp4ZÇÛˆÜDÀ‹ùÕnþÐÛ'}dý‰§W$ºÒϦ8îò[óFÎéD0š×ÌØÌÁ_¹|hÁp °¸ïÂbþœSaÐüc¯†J¿&ë}_vÔ\.¨ï´gÓ0qùŠm2D¡öŸX(¸’s¦\MáÕ½fÚ›î›I[spf7£6™á0æ’@X­Ä²ÑÖ—lç E:7Q"¹A2Šæ€úš}è$[Á{#Ø©5FJó+n­Ûb~øPx¼sv°yÃî~Ö|°àÝ4#Ïèßwk¾™ç2uø#B(#án ÉaYx¹™œ/ö¶úN¥Ï¹Ys“3¾þbv~¶@ðXòcó5ʇÞ&S”f0è ¢k~·ÐÃòªŒ/í¼¤gC‡¦ÝD÷ò5Ôܲ> õ±Y¹¡×Ñ“PÙ¤qîîΧ­.$¥Ða?ÿãŸbÚõÿ\ÐJ”¸Ýorn=+$óz:\Œ¢Djd5ƒPÑs:õ…ÓU0)Þ:>Rö«Sîþ^kbûÂp.!T¡êcÅzÕÕ™„èõ¶eÐßcÒ_vàî¤çшšŒí-eGb¹”ÀôÒ3 Ûi²Å+¶íøt9±LòÿÍ-N.ËÊdf€S[cþ»Íþ0ê®gÛ6¶>ÉÈùi󉯶ý*Aí„ôçvgÛˆªhæ¬Ó,¼eŸšðæ£ùKËKÔÿÒ&´mixÅȇ+ùò¾‰\ÅÛ‡{!OÏtŸ˜V³OÅ0" ±ÌixP#õ_÷°f¥•0YŒn¡;G¥ÐLêýH£§$>?“$¸k7§UqEIeôøþÀl[°Á¿ÿZ þMÁ2šs„³¼ÿ9=úbïû¨ 9tá>ÇÀ…í‰d9ðTÜ"ãB%²HIDç€8w»ß;€žÿ½âhþqìA;·8wEx_>j]i+B.¢rXîS::QÕÿ1ÑÞ‘žŸÝIU×A%²Qslú`´¢j&U²Ü<ðŽ áTfz*-8©e/{•ÉzŠ©‰r ôT’0“`Žˆ ™(Ò%æH`§„€çn~¢ì‰ ©Ä$½~”h4–ûØFȫ䣳-U¸{4GŒŒ‹ûÛ¶…U†p!ÄÔŠ™:±ÛW+xeȺl¢ÄþŒ2Œ-[%"DïØ†Ðg7¢%¥½‡ô†A'‰ßÙSCQ¤6„Æi®Ü\«èzUr—¯ÝrbÅS/Šè1÷»GÖwm¶XÓRëëÁ–-²^© DmoÍ”€aޫ鶠x_µ› OOÁvi3»í0~9]—óãg!w¯ÕDáé}TeD{J›•à=úÝ9e–ÈǦhµF‚Ðà/þiù@Í¡»85ƒ•“UØ%ô•ÐÀÑRnßãªX?iÞ¨È §:¾›÷éSÀYt'1ø—h:GFPÊ} k«4 cæ3¸@~\›ÅL‹åÇþ€«!ë¤Êж´Ç`ãvi×Â~×…›ñ68m_Ñ$ŒácMVë©u°úH)Ák³cwNm¢µý5³5F¶‚‡S¿~¤Ê™.量Cå#twËœ_øfÈËügó?&UIUìæ$柆QëæhD'Ž\3“ Ù¶‹†¨ËÓø…-b>Í<+FüNÏXÁ›—*Klƒ¼¾úÌW©ÍÔéý×Ð;¾Ù“òϹ(Ë­ï^"ûãç|¶ú¾nxMgpR”·àz ÅZ/¢|L|ȳ䆸›qC—‡™&*j38Cy3RŠ&¥ }µÑñÜô¯„ê‘친ׂ6_3±ö0*ïvK‚ÏkT­\|ïíRË„‘>&8è^û¥öæé+Å÷t]-=*¦ÐÍÔÔ“ˆÀÙI\{¾b,Ѩéð£PAUUmmGÐE)ÍMÕ?¿Ñ¹¹ìoTï}§ãwã®Rä^ö/9¢ìõÁ; '_ŒïaaÄ ãD\ÊŒ4÷$Ol©bR—ô +vE_”ìmÊDèïME‚(ÜpBMfð º'µ:¬zåšõ H'Ž¡16j1‡›ÞûXƒãGØHVÌ?æe\ÍÌ  )Co¼’ÔŸ²z‹¼­ÁP~AÙ¹_§Tï^™Ÿ{ζùe‡á8ÿ=’\Í ©ÖЈzZ]¨7Έ̰¸=;ƒ]êow«Úë…úk»Û3ÓaáhÜ®ò±8À,ö}>nÍ«n"æ$¦Ÿ1sçûû‰& ¨oÖpuøCùåú\$¨‹»õ Ž@ÌíM+ ¦”Fã#QŸMIqä@þÓ¥²öCq‹®ýy`Q²°©<؃ƒ OÜ(«Óé}îæãŽz,ìŸÁzÂv;ŠZ/õL˜Ÿ:$ƒÊYF&ÄÓè½üyRéúö$wá[Û?̶ó’Ro ÃZ @/A“î j+(”¹êAÀBŒa´Ø¾ÒÀ›,1nV¹ÎÝ™‘ˆ>ÅjMì.fè\ZǶöýe¢!$¾`VÑ7ù~!*:Ý—ù§· hJÉ"“|ó\†õ{¼¨Y  üÒy­§¸¿„&‹1sM¨¡ )žqÏG‚³næ)¥íÖ ÇO/@¢ÞÎ \í<‰n +¿ ­&_(B›ê¬ÿP¹ó·&ßK×rÕ GnmˆÎéEË&e4Žås繇³õ©Æ›«õ÷du­­-ì±bœ(^rî'v<½=ÂŽšIZë°aˆ Žþg+‚sd%Êå–¡±•`2k¹é=|‹g [µ.Äþˆ1Ý,FûPÝ@î;Í–ì÷Mö½Î?L"ï©ì˜™G*r› gÌvv:4Ó?ÊŽŸo¼y»ÁËË·~‡cŠ^q‡ã,«¡Gµì=9þ½ èg˜ÛkFƒ4•t#ÅÏ¿Uã$Š9žtgQ³xGtdÄ[´ë_ a½„þè–«/áCϤf¯ ZܾG¢ïPeaq©Ñ&ËP|—–E ÃÅDé E?|kñ¬NM¬âÖªlåKùkLìËÚ?zJï½[|€Ø‚Ý û^H‡ÞÈ÷g C®Æh·Ö½˜Xð ™ãpÃñÀ5—$§¨ªI9n˜Í(ÂasW…¿(¬âã)4ÐÒ¹ä·ÚðõúÏÛDa¢tH þ:§¸ŒOÛâq•¿£æz#5¾zXÈ ú2+Á_B}À¥ö!Ùõ‚ÿljG„TÀ9~™=p¹öZ׳îÔAnKÚ*‚Kˆ |5ÆL4žòÿPmN[¢(JlÛ¶mÛ¶m۶ݽ۶mÛ¶mÛæœ™yº?Q+"+s#¿ï›·[+]ûsT(ûɺ›¯©æ‰<8&¿_>ëµî­Ú¦èI€ªµzl£¼”±¬Ð +×>8ØVHqçu7ÀæVÉ B¸yŸÔÇÅiÍá¼ò{½— ³IE£‹Å ŽZ6’NDöÑÒè9`¸ƒ™A4«@)ÚyîSdelOü%¸¨HHàƒ¶Éž•}˜wܰ¯ÿawör^<ÂålmÞÔ ql0¦ú;Óîx´U“­9ƒ¦<°¯rÝ·°Áùq¢ë«ÄBC`í¼2„7_ŸÝ¯²JMùŠs”ƒxb)Z€6ª°„/ÑÅÔ™àX+Œq)XœqÂŽ ó,U:ÍÎï-ŽbŽûRò-UD”7îè7§ËAÎ-Ypdq|_,šG=nèÓãO ûŠ®ãþ µÿäÞ2OXe±¹–Âlp½vdvlPžÎ_5· ©tû!Bº"(F×ô´×FctG¦úŽ\‰ØûmýN8bA*æcq½ô-MoŒ„Š¢ÇX˜Õ¶n+8­” 7O[%?(ú ‹YváØÂF‹”ßä˜ÝXë¿3\Ž+E¡ÆkáõHêû,„ßoQ^;ù†Ù5ß°ê@ßDóš;á”O_‰½ÐªtE IÜÏ8Åiun7CuvsËåÈ›iÅËpÔâÅ,øðìlûøžæn\¥.2%©w‡X·ú_ËUÁÿç˜êv)4Î^÷Û‚·+§Ã`p,)'˜ûÛ: L¬/äPïÝAÁÞAµôÔ(q—â_ &µ1€Úiް3 Ö1ßy¹ÊÈ>Hê…kÔxdV(êhÇ0Ͳ² OluÒ’¨MïÆº3ÈkêB3n¢á(0„ò õÆj<9f?úׂÅ[l}ºþYÃò ëWûD“ÄKÛ:Oï:šªSõ;"S-CrF·î'+)½Qå¯v/h1² yP)ž"mÚpB£¢A]: ¡Çz{•ª bˆ“µôvòúzûOÎY•ØÔ"sf=GƒÇÚ^#jI’úîÄßá¿L9œ~¯ßlw0™ôìœð4xEÓ¼½öØ*|‰×É_|.·w†Î2½ÜÍ:Í"ÖÄ[9“‰Õ–søI¶íåg¸çô£¯Ûgø—RÇï3ÚzÏ%Ìš›¾A,êåY '¤æ‘Â;ëäÀ1 Ïë5X¹Ã~éíˆFB'ôؼzG4ߺKNõvø ó$ÉlMK„q P¶n{"…ïŸM:5S -{¨‡,‚o)ŒðñÒÒŪ¨ü¢€Ã×±O·Ášg1pœ·µ>cqu„yj¢LÄGÐáH ûÃÀÂÆXâ~2Žá=PGîë„?°1Mj€B(”¨C t‰?»9Y¼ÖâòŒ c2.¨ˆLŠÊ"ïw/Í 6#¿âžãÊôËA9t!޲ÑÙ$™j&Hí Ù?$¹éÌÖÐ|Tå ëš–"ˆ lâ¾\ NZ'þ±õ¶ ŸlîŠÿzãx±4wl2¸\h²W‡áé¹D:=Ö髲ŒÜÉ,ÄÔãZ*Ϭ͘,b¥ˆm8æJ/6¤”2Û"å }Ÿ@èÛp)åG=¡•ZÇæøÓ/-=s[¾†_Ý#%di†D¿ôm 7e‚r²|˜š’¬º5xg:&’å«BÌò»®µšòËH¸¾ÉLKÀ5g*Aí‘­Ou?y Ê5öw¸ç…&/кAÿfVLýŸÕWPØÊÐ@E<Ô‰Žï4 gÄò¸×·&®gÈj‚{³ÏAžbáñOºUrDìÔ"÷›­Ã $ÝqK‡"©®TIeÔ 6§%ñ«}8xËž²eG`M'¡¶kGåcq¥è÷$26íQ÷Ð%³ C6 ²w€hòóô:ÚÃt¹GdÒé‹ù¿(VäÃ.’ùí[Ðú'KbÌëgžõ8vêýÕ¬­ŠZ9÷]ç¹rS\–‰îª0Ì7ìU‰þÈU`Ê¿ÍìtoŠåJýdʈv/:ÞG-GvDaRÔ÷H0·4ÇE%>9˜ðf!²Ó•mTâµþMBMdÛT/ ,Ä`²Ïi[XÆ7ºugož2°åÿ¥)¬Âõ  Ê9—·ŽAï néhmݘDäË5aÎòà`]+þbGú.fßÖ‡ÏQË |Ê­©D2¢‰ ) 48¤ØÈAš¶›·¢N‘¡HÆ÷5Ê%_ù0¶?Ûs9jÌC¹Fm’½F^t~2«Âw¯¶K”æ­`fFÒÙíjºTo=¶ÀÜô‚2»žÌªnJÌOÃ;%®: …Œ‡Žw.xmè˜t\òÕî§ß:Dc‘^,Ÿž¦z<‰ÝyË«µÐ9{€uDº¬õ~ÇRæÖë®fjèõ ²h=µ¿ôŽQ=¾dVƒQ@šy ®KRI» 'K%_Eá+u¯ÔAƲT3NLÀîÓŽ·KYÅV–ðÈ:ˆ¿.þ¼ã%)g#ìþ#kV†f;Îÿnp„gM%Yzà`¤‹0²ïûê3£|éýZe”Wœ˜N.3pŠ@¼l½¶˜¶­ápÒÉÇ×Ó^ ènVåê˜ ÷” ª9yÑ 5³ß­š0ü%V©3½3bˆ‚³ž©ŽªJø‘¥!¯zä´³ÒpÅá¥c·ÖÞ€¿jV‚— —âˆj yíÅ^æ_¦kÍÆ‡ýÛ–‚Ú· à‹HdÕÏ¢ckÔë$t'a˜K9ÇÒµ%›6=‹eò0Jq9ËQèG getV¸ LE3û´Ëg°¿|©¾Ùñ«ÞÄq¹+çæmÛp WáfJc²PûÖ:CÍìÓˆÕ¶‘ßÇ^(ø±íŒCä{ "%‡£Š´ˆlDZ7‘9 ºòïFS:ÝAð‚ù‰WT¼ìuÖXŒ+áá}êb.*µáÝ8ZEbÓå©{–áK¨#6ãYžs׊çC)Ÿ,ùpçÌ-ó„œò –W‘EÕ‡_b„ êðò¤ŽÂÝöÍÅoåõ± 9/`„É|þ“ôU ó4$µÿ¿sfÃ-¤’’6W¸úg¹ýyEÕCh‘§Ìþäï<ôñ‚œ±µœQ@þåÓÂG#N²¤<ÒžM@üY•LnÍFfi[@JGÙ»Û»¥üiôÖ~†²ÅïÇÑW÷À5¸Æ¶âø\+‘ri ´‡¢ Ñ·EaÏ ï³ßí#aây³¼$°Zç”:bá–¥ŠFwl¦=2æün:å(°Æ#[1vÝFE‘0eÆÁØ0Í6÷/>¾Æ±!–Ÿ/–2®xB 4¨±À °¸V‘•a‰í~AŽ¢ ÁOúÛBêAm9@ „7å]¸måÕ¼Cå??e¨¬ð —_ú"8\†„&ùFâÃNíú˜YÏ Æ†$g,HëàÝ}ÝÚViŽÚ±˜c7fCÕòÏ?È—º˜>ÒZš¸Öqàvp«å&€Ë³t¯PÀ•jÇ[ÎŽÔ¸@ÎgÊXªÞ)Ñr±ŠG,…- é\Ê×áÉb—Rc2Ó@2î&AâRî‹læBâ°‹®3¥ø%YŽ‚ÅÈáPâ3û}tŸQ‚®u'ÃH`ª êo‘us²ã©Ñ[°ªa:/¼ÿMT6Û~V©û`±?Ê6¡Ÿ²BÖ2ÍÍ’D1¡1t£ì³ÃÝ?;nZ߷Й¸ª.n~<®éö-†\“L,ÌÞgXŸÍAÄc)­än ;l[I`<®Ûj EÞÅõÍ—SÀ E¶U7Ë¿ J.̹‰C’Cå½YRÆcùx”B±¹Í*p÷’µ­4!Χ$~\zøŠŒ§4¬FUî$UQîö+uúG^wd#8„Úçɶ;¥'Â¥ß}³õZ1Îf‰Äõ>%–[Î`¶Sö‘l¢DÐhúŸ° \…²æŽ’öº ’§qÂ^(uÚ@ TPÛä°“ý£ê±4àå–ÔBÔÀ˜i–X©L¼;lQ¨œ†Õ.¨Ì2R9t£Dh*ëÜÒ¤P #!?ÝZƬO"ú€5{½à:<ׯÏÚxŸ™¢ÊD½„MW~s`³Úø§zSƯéT«€EŒË¤¬^(Æãû ¸_ÂýcÈqÓ' =”8ƒíWm mí¿2:l~¯5¯#W¦MÄÂø±^møDÑ ¹¢}dò¢9’êE»´ª¯öí§@G Lt§ [jjî·TÄèr(™ˆvs¾®1õY–£þê´hI޾•  »ÔI¦îW¦ äX¦{ê‹ ŒaE9†¸}*õee<ðø dôµ ¬fk …iöQÑ;µÉ«º*$£Q7³t!ÉÇä—€ÇïKE=¤Z0W΄öý5(-~£¹Ew°ÎvdWp¿Ü' ^ªw?×$ºI‚6lѽ«]@°)AÛ!e†ŸÂb8†¡»o† 0‰¸0iöØš ÿ…éß…ÆÃ“h;;Ýoí‰X~% Žþµ,/”ÊòZ}ì¾1Ž+9Ÿ€Köku\ðüdÙ\`¤‹‹…·®¯X)ä̇*Šžôl™Ýf¿'Ρ`ÌæðÍž®†Õ^ƒ±\#M˜ÝÈ€<¾u Ù<›l %F*áÄÿa ­$·W»¨?éÀùškpü!k*NùnŒsMm{ï~Š·O'ÞéԲݨÉy$'b´LoÅ3!9ÄTèpdo2"xFdcÁ¯©ª^Ürw>š[Á>zaK¡{‰û®k–Œ^J˜i_’ìZ¢Î^¬$A>+¯vB/vߣõ1mŽ»Ê>q—=²«ÇU„á¾›B†$åwÎh>a… Ü 6^³’¹w Œâ±ÛÈ=òØ:±{ËK‰xó?~zºYQ+œe}Êá¦o6_“a­H%ht…öƒ ç‘„‘ó§‚Bë5_J†Èø ¾·<Áòš¥{ä”ðˆ™–Æ`ÖÚq×Râpʹ߸ÜÊp(êKˆÔ«Ú%#¾Â)´¸¸5¿s§DR­²Ì9¦ûãG«xìÊúÈÌ‹ß=é#”ÝFæ ñ¼Ê±aK±9çJ7?‘¨WQÂ… +Š1þ÷Ú-~_]¸™ïõS;FAxÙªQ£fJËíT¥h‚}½¥F%(BÁ®„–ùˆV“jWVïõL걃È6¬4µû-É €_‘nòcɇûî2ù\°ZÿWÝãjz=ZdŒ^¾Óÿ¡gÑЂ£²Š©O{¸˜MQ"–j`\¹C5tŽ­½'ddŸÖ¾] iw3c„a…ÈîTwÔ³¯„jsHØÌÛͲaÐ"6IŒÀ·=¦qÅN«ëóÄ¢ËÛ*F€ÏÓ§uñï†A5+¾4}FÁB„UýC>íʨ?«u( ×ü´ª§G;ÞaõË LœÃ‡ b–ó¼&ÔŸ€¢ÀN­ž<ä©Êã¿iXç±ÅMý$¬ñÆ °—[ì¾È_µ c(H;JŒÓ²¿PÙ_«G­uá(Dé°^¨)Ú&[ó«ès1c5n‹æª°P,Ζ¯ÅÖ}Ør©½€z?*êÁoÒD³Ô±xµ{¨‡.Vfá/ ‘úOG³.ãi ç®¶V¡´üh£Å˜m$øô^OÆlc NaF]¯y]ÊJŸî>1ùtuÔœOÉî»§œˆ‚Î9û¦ÈêÁym²U6R=bܨ7!êQ†OÜ“²G áŽÇ´ùc6Ò³n&DsÕáàK7¤„ÐäOVÇÒT“BJ…§à¡„[ç# wöì~ £³(ÔÛ>vGjµíH_σyH·nTAIÆêƒ± Ë?XlxÌ÷Ð&HWõ«Žd Î" \³f6”;(ØæB¥±û¢«ìË3žºë÷†¤`@Š¥f t'˜i,«?š~ƒÍçëð«å/ëß ^0ƒZÕ†+ž!ŒrDs#Õj&Ò)ÌVX$Ê ô‚ª ¨*œ@Àk"ª®0ð”’yxœï 8‹9«úñVNsâr UfB™ˆ^8 z©Å?µ?v^7®Ç¤.Í9hMÀ{It¹[xü@3mŸ’dÒ(œh@2¹¹¸5vSÙHwj‹ùxKÞKU6¼×HŸ¤±¼Œ*1.¶Ï>»ÙcAGmbÃušAæI Ú܇$ÔËÛξóX–Öÿßœ²£À­÷·˜Šîÿw<Ö•=$µÙö k½kŒ?¼w TÁä¤ÕÛØø(°0è6ÝQ w™W¾ÂoìW8\<“ªp„ô<ìé1ñˆ å¾ýÄàÕÿü8v „µ-e¨­7$U³„ -t–€8h ×}âñùoPÉ;À¡·R~~¿1õ#.Úý€õz(Ú_]C )Э© Ê0|É>0x‡2aê )öKI)pÍ•5Bae#y<:I‚$³UÒÙKj’¢¬º;ðQ=¶ê1<Ò‰êh€00Ì!l<Ä€AÎ=Yš†ÔLÿ2AlYƒ>$#UœDÌpÐ^÷qã“Á'øÓ;H­ï>°=±í}ñ^õñô©Pó°ÂUÛì2~W”.:i~EÒ”è"&•l<Ûʹǥ>‡g³Z3½?ÈM´çšêBЈ/$“Œcy²Ÿ…Q’DG6×M€C%÷vÓDÖïÃÏÚ‰Ú\†±¨~=Pµ¿óÐÏse6‹¤Ïä8õ8‰t£ô¦¤Ü²:Š?ð.; `Gó”`}ŸtC˜ºªR»TÐBGÁÝ74 ]9Áš bY\ËÊG¸ÝÁKÖΆå&ÊŠ€ˆ x,¹ãC§- qô1Å R~YMÕGÄáuò`®+ÖﲌyY¸~½QÕf–ð©Ñ¬E&ýÉAMÖŽøŽöZÚ?ÙÌ¡Q8“°¢Ë# !ÆÐùó öÎÉÅ/!ëBˆôcY7×Oaê{€÷*±”ê“‘LÓH P°” ÃðÒÅ Hm¦ ÇëÐ8 ‹ÿæùêž^ôà’Ÿjël²‰M,°ÉjÁy×íAÄ£ êÒK¹´xBl8¸p2gÓ:…Éä…¾MŒJõp­¯v,8}µè9šÍȳ3¸;ï÷áêÀߺ㠗 z1²2é\ó[àz—ã‰?·¯LÊf ¸‚Û‹²äY:2W¯–ûHhÉQ?~ÊÆ¡ènÁ)\kªmŠCiÓÆêÝ ÜŠK§™ Šü'h×%sÈÍJƒì3h3JÄ*†Êø1¼}«L{þà«™½äN*”TƒoÚÖ>c‰E½„³)1+ðNä3à¼#ÛÔt½é~Ùx¸.#'RlŸï£`±m }ä :àÖÆ –ßb +³tµáöºž„9éíïÕЦëNìꙤ[ÂFè') ”¨d’weeb%‚y¤ŽM‡©õ9%ؘYBº±°ÁÜ›s 3ßò$ §4*ùi †Ä§“™êž36”~‚¡Å%çifõG!YMP«rÄ÷;‡ÖÎ‚ŠªWž„ å˜r`N¸ó'ÑÆ'ƒ¢ÄŒpÙz$ÙWó»pÓ°øÌV¸¢ãíg/¸ÝôYÞáj¢¨—³=¶7ŽxÕú&ÖIy þaßýû]^Ö›¿„kÔ‚Å#×j‹Ëûm}‚Úl”l*§÷®7ó:fÊ Ax£M\NûîM¨àôfÚÖc8eL_3ƒ*À4œë Yz 4– ›fÛ[TKýb5™·²hZ_H·ÂXPŒ1ç'vH)¢HP((P'úhM’Agšü— ÀË?Úx­N˜—€P«=Iääb ŒË³2õ¸¶اËÞšvØ0Ì\ꀹ‡g¦oÓ0›Îp镇I½fÞ1z|=r!#;H* ÏÝϤ,àðüu1?›~Œ= M’a–"owW9刳Œ…™ *ÕææxÕ¤Ü.#ïßC‡›¯%åôŸê—Æ&sÚChuHHF.Ëâ/8‚ú*–rØñ‚?¾sÅ’H}!óúÝ·ö ÓG:ž &ëmÐݾ‘:FYn>òžòKÅn‚ó6ÿãèŒy»ú)yù§_ˆS%ªÚåúN‰6šäªj1ÜTÃÉP@s¸´ûê> @|}E(>pßЊ ~ξg_žôÐyñß9-âBí$17H  z2©'}f/0G3ÒœºGÐpøa Íõåg¨‰ÔBWMTIžõ‡Ñ(¤³ ¨MáÀqŒï²ƒ«qÃ\yÜPtÎjŸ'ËOlo=šAÖ$Uy8ôŒßhHNtÿÛN:þ¦¥½£à3ô‘ËÍ0ÛÓ>Þr ó¬Qo÷ÚSÔ¤!âe×ò× ÙHõn)¡OM1JyÚÏÑ‘ _7"ÝY-„®×æúXÇAX– ¹]$ÞYõƒB•§àÀŠêÐj¤Xß´)š¸ÚWz‰ %“8HLëTûóÖú`ŒTgrelóÈýQ¾þìòK7JP'M欼kmýò#îïÕ6øêäÂÙÊAyíþ¢ éõÛlv.ÙÜ8ëžÉWæKæt/I £ìA§¨b9ÙòZ\>y=˜Cé¨jæð&ÈNÃX‡îƒI‘Æ¢J¦&_r•„)œ­Â½‰vÑ¿¹±Gêrª¯ÊÃl»¯ð79ðßž¹†=Ô¡Qù6—µ"ÍT;ÞÜÆÓêiö*K>Á²E-fÜCuò¹@) ZÌžuW;9Ù-4qhdÄ”Ëþ9 2£ZÏ,QK†™çÒþâÝ *[åà"`Î]4r>KzkòÉ6ÔI‰¹%†»ŸRøßDLAÏ{¸EíòM6çCUž"Ç”ÆgÌsl2¸í×&á¾ }ú–>Fê´—šÈÀŸ±sÀ—h+¤“Ç3BûŰ~‰ÎbÒEœ„oA·‡}–V݇›’„¡«2¢pS×Ôׇô÷Zd¯MkIõ­©Ûg7ÛÁÙÔÈFswPh¼\+£Ø<vÞEYžV4Z·ø+-Æ‚RO¸W%y@'Pl>ôEÜ–Èi#p·G~¾íªÌÝ=¸ƒ/o“ÁXáûв³A¹±iÍ7À„è’jpuñG’a|QµüB>}ô‡»oC¬h¼>.1bÃ}o½ÐâHM}˜œÉäÄз¦¿h•Ze"£X¾æ‘>æz‰ "Wb¹åÔ6ÔžP¦c`Ù‹Æë¤ZôZ'Q?RÌ&Ånç´pÈÄp¶T¸ 4ÛFtŒùõ«b<;ÒèXaØ ͵¼3/àD½qËrÕ³fº!ÐÜb&öR>*Ï }+Ä¡‡8Õ¸eÎ:ø"#ë)ó6¢1sÌ9<ÔL=—Ô&vz›‰iǯz×¢Ñ[Ì Ú8¨Ê_= P#;`Å×GäHǬë¼nFÓ]ósõ‡”óW¡ü$`íÂÞF@žZ® ÎÎ7]$ÿ|$Ú,j¿bú?žbÇÒï¨-¦SòÕ†»““kD]´ë±+‹Õ’)ÇךÙÝO†Ó0^sâ‰É©F‹Ðì}¤¯ÖÍÜêôs–=úQªKmIZQº[úÇí—rìÚèB€UCN—2«pOí9GsÖã¦å„d^eeAŮ̻”8šB”‘W Y3—¿  ·üûíªo(0TvÎã´QFþÐÐXb”R?çËq¹ÈRK¯‘>ÕeeSÓsç./¤#zö» n×Gþ ®s£3œ5LL¡üñ"¾…AÀ1žCÙ?šƒÒÂß*ª|L6‚HçÏyéL*?bO§È>›Oæð™sùÞ¤ÝÞªyZcz‹ùžT˜›#ÜÒ üÃ_§ºË «#‰@£s«É+IÓé4i•‚UPt½„H–SÒ¿Ç[H°YHVQ ÈžØÝ®=w´nó>O4”žjýðônœms~‹Žþw–lÜšD»ca¬ßÍœy Åú¨àr1…Ùi.§¼‡+]Š•Ð&Ø4Azpðf¾>ÇŽãç5à™fìéÊÊ|”íªÖCñËûžŸÄ`'t§* ) þ„Kù_ Íàa"#÷ƒ(>äÐÚÐ$ˆ7ìo"¹é¢Sà­ÊJWøóq$Q6;ÛÞêÄM .Ñ Å1 «ß§P7°ˆNk”$#¨Ë\AæPë_ƒ¦CD„lq§+-ñ ‚o8®HÕçYãy†¬$oHî†8§+úÇ’±Á Žžx剪ˆ{ƒÛÝ–oQ)H‹š*½'¸Ù’à2­¬cyÍœc•ˆ.úÇTœªÊ°iᆽŕ,˜cð4õ"ñO´k²$]ÎOnÓ\#B YD}„Êå/+}*¯)ä$£Ô­˜ÇQÆ^—–ØC׃»›èìƒã}Ä»¬`€ ¼„KÇf±€PG'ø²(êHý®-xÅ{xˆ/s^Æý@XP Gó~”ؘ#F›¦}»,>ã.Qçšúżéç(l9ÚÛ’ƒ‹ãn n¿û×Ü’()#îUÍò¼a—<âÓ¦¿ø·†à/%_ë>«B Þ{‡–abh Ñ 7ĤÛ.xê•êÇ´ÂQ/g³*m/fW°ÎOÎ; îÿ¶ÄZ¡›>±ûr×c"o5Õºæ! Xc̞ɻ²p`HÀ.A§ˆq­‘:†ÂMˆhtaã‚7Dg…€uhËèɲsõ¡ßÄÀÙ‚ ž,Š4©G©OÇ  ºÃ)¹Ì ÁIÜÇ­ëSÆü€jb}ëæ·Ž¼R¥_7éœúe#07?MƒÊaÁ­t*yq@‰k(„½—¢™Eà›\ÀýSBܨ8qz„ËÇ=žâŠ%:2!îzdÙó¼u¶½}âøTZÀ‚I¬À rláÖqkæê%º _Ý_#šE`H§(zx„«ˆ0lù!+è®á¼t6C.bÒ²mþ—ëJàOöŽþ(ÝË:ìç™;‡·Ç|ÛÊÈ9$pX§roás»–/Î[Zž° 6¹Oª­gm¸l2‹;ҙРÏtÈu!®*‰ëԆ˻²î}š§Àðlî@ŸUq|€ŽÖÈÖ,ÉêH>û(á†'Lv]Ø2”žŠC$‘g=#],‰ ±FWºY¯ÂP\4PÀåja·æÉnQݲ-V×+1Ëâe-ø>JÅê©Ú'õͦAHˆEæ ‡rïƒlá'œ"¨éw•áAJSëÊ~ƒJ9èÐnN¢áŠCü§½9¦ùÏ'”¬B«Í›&Ôojw¸&Ô?î(øK&Y~š_¨7!Dù;¨•m”Ò‡(‹à'ÍÑmz®epæ4å¤4ÏœèMˆžVH¤Þ+U^OŽIá>‡Ì9æÐâcÀ±7‡¹9mÀ(†Øh“F•v¶µ‘O;(ÑoÅÅùPAí25µ¤µtHIz…³ÝbßiÍòROqÉ«&°ðhÖ€×"ùVY§ú…#9GšÈ¾cA:ÁèõÀ±Ž05@ä;ßÏL€‚RáÝwãXC;ªd¸ÏÙ°OML÷æ¥ä=ƒ½Ö  Œk…^%Ùé»ùÇsGˆXšíîélU÷y¤§Aš>4ÊŒ”šÍçÙÏ0ýŽû–aÕ1ô˜ž;´›÷&Í£·ž‘щ¥ ¦I¿d 0‡ª2±(}þÞì0`µû‹õ^ä!@Š|H¢Í©hFí öæ…Ùý²KÀM²µ6†žãóàUQÖå˜þû÷Ýú"š­—B·ÉàÈѥʮŽpíîí¼i½Ý.Hz ’E"ÿ Ý*(¤V§ØŒ¶V‰~´buV“¡gÁá²x”`‹Æ5 ?=äH{\þå©tùÅå®Àà}úŠMZ‡Øc€uãËmlQ@ƒé¼O`PG€R¬…ÑeS+kûÈ ¶ñ»n³p¥¨ Ÿx%8^ò­üsRã}q÷æSáp_ Ë5¥xÒèÕi`lÂ]3%ö¶bsiدd`¼7š/™ezk×ûäqŸ*Ã~0@À>ÅùøJ1ò+‘¹w ÛH†³ƒgHì—˜·:ô¤€3Êzت‹Ò U‘V1^Œþý|NÞëœë(‹Óé÷Í XóИ[¾ù7Wúvâ&—ž&aÔªàÚ“:˜“²_Â>žv.$ºý ³]¤ jö=`}æ-*Juà,‰ŠùWoc]æËs )Ÿ² ™8ÛÌ F˜ì?w¶Ãá!9Õª®0ÜᯔLò“á%œjð ]ῤÝOûÿƒ3›œ›düì²sBöKÇ7ßMî³}%Q$ªÇÅx+‚­ã>Ûjù›Âºxñ^O|ú0ÇãÁ­Ãüd'Ó.Œ}ç"Eí.¼ö@Iài{ÑÓ£üJƒ1ý7Î%?»^XY0´úû~®¦EÂt9­_?½ˆÕcˆÄدΨD¡µKŽN= e‡ÀŸÐOf“¹|ÀÐÛ,¤ô064~T„ˆ¾âÖãàáh¨“Ciy€Úª ò=XŽJÞ3%ìá‘è#a^0 1Ñó°ˆ=ô™Wüô…7ø|hµ`¨$‚-m}T’~زÁ3¯\–‚N-¯D·‚9"šÂná½Äðýê)ÑQØ¥ ¢UX‘Ñn¬` °FH¡`¯‰eîq/Ÿ>¤{6[~–$²Åï„¿H½q53°ÔÉì¸i¶ z¥ã æ™ÇtýÂ"fY)·Bï-¶ H(?šUרý•ÁKÃè’ƒuMskO~6ØoW¨Äè°EWÙZÛƒli«a”lÄ–:ã *•ùäš•h“70-#ЏÁsüÏ««C?:Wf‘‚QSGÉ̶‘ó‡’GOŸúþÑMeóãcã²Ë‡´3s,©Æ‡K-»Ö‡Õõ‚aç*Žöh­&`(¨«RšÓ‘Kßùádö“ôw Í*o@†{wÊýŒ7Q U¡QŒ0t§SÛHbo[ƒúÍ ‰C¯­Ø ;ãÕ ŠO #ïäñ6â^&!×”‡’µ½Ó /Õ¿ÜV«Ö~϶ ¨eLÙ¸î(óF@îôádò{™…ø=¸4š5.§ŠJ" ̳’?p.’ÂâUú<ÄfM¿a=¿IÖáÝ2> SÖ7J³ÑÇ«½Ž+>d¹äVˆ+Ô£sJБØKΩ=i/ü…š~Žz™òÈ•Ç<ø` cSæ³ð–¬kŸN«¥ý>IûÓÁ¢åW¦NU3d\„Ònù,]„PI·ÇƒàÛVSG¼“õ²:Òø'Ñ11sáÒÀüÚ™(ì,o8#ãQ!ÈÕ޹Œ“ãkfõ RÊ%»pMŒ/Ý eF=ìL¿ð§O Átï§…Y¢á)ûž…`6î H[µè~9sô+ÕL¹µ­åQÝHçÅfP­/K¸k®%î‹öÌÓ0ÂQžæ ûô^™üѤ|ñWe—cvçå9Öïêt§ø+[ÁÈdòZéŽîÍ®2³´HVvµñ…Oj\™ëæîÆý84DGg·ìÅŒY.-CÁ¬¬´'Ÿ6và–d柔ˆLi‹]8–¢Êe\ùÃ4.¯SXÁŒ‰óÐ "ÌðFqûÙѧ ZsŸ-håùM!ã¾qc“guHÃcÃðÇdqZÍT.Ì‹_l^5Éì¢ZÁøKå -r!àT6þé—f®R»ê§òbQGyƒ74Û#±“E` üj‡Œõ‹îYÄZlJþÉûÚ¾ç­áZØH¿ö>æ¿àDÝtƒ«s´‘{ýƩθj=è‡!çŸ9>VH=sÿ†æœšÐÜ„Ë-µÉÅׯrÎ¥'_lWËÒ±ýwÅÚsAœ{£Å÷‹B ðŠXûÃ*Æ:žèí¸9D–÷‡ß Sбý¯Õw°Éˆ3&½ÜÍ2•d½¾Ô«LEókW¨ ži/°H;` ¼)nß ó+¥ \eØĶ(r6 `뼯ÙQþ]”ðÃ’?)d‡¢ŒÇgàÜÔꊬ!×0f‹ †¡´»Æ[HͬíI*CNZ]¸ÜS4È€®Ðõ.ÛÉèï´LÑ—¡Œøô§þjçèЫ›ÐxþQŒ±»†ÐËc7úk6–QŠhÀýž>XDÈ®¾_”¥òïÆixkYì( žX\ÉÖ™—„fÒµ;ÞÐÔ}‹"?éf¦Púßà.ƒ{ì84tpõºåü¡Ä»3éæÀ9É  $\­Ëí:i¸{³˜ëÌGI?LÉÄLsõ5xt=QW—ìDåÎÚ"—ìyS™Úº €ò•lE{Úç¢$ºMkiθ«ê?¿†óx¢³ ¾W\Ž(çKs⮞ÛÔÑß‘]…̨ñ5n¬Ð¯Â­ft³ú²Ë_âT7SœòoB¿nZ”ëCœCÿÞß¿#šÐÔ¯a¡IıH"ª3†ÕKÖóëu\3íØûAÿq;­)m@Oo·\LH­Pêe†àKÉܰØŸíl§MWÍrx](Øz´Áiò–~±Z õûPÞ1¸€±¹ÀU$ ^øŽj9ÃgF6±QѨ•nmÔÑî2k¬AŒ¢™++õfùŽud‰§ dTäfø[rn”Íå¿ß ð‡ EwgÀ¶î ¥¶=`q¿èÁäæSRá«ÑÄa¨ÂNüViñ‰Þe2á°òÉpÌK)ÝãÔŸM rÐé”÷,[fí_ƒZø™ üàmƒêþÎîºOv|É´Q«ëÕÀ`XPÎå|®ŽG (Œpˆ’ý9½iäçŽWżšû  }Q™];2SÓ€7˲{ RC;•ÃF}„Ý^&‚Z‰ÏÁÆ:­)±ìG¢€:Öa§Êu“’[œÇá-GÁŸ/à5«dHê/Çæ¸Aìû¢æÆ£´›,Ç:¥˜8Êj÷Ååĉ· 1WÃ{[ßÄ@zZÙ9ætîyNÒ¸“…Mž {ý‘ÜLÙ–v¥§XVÖJ§ÌÄï/»Ýª½8BÎ|ö§zˆ~ê .ÿö‹n|—, ¡lC9ÆÄßÌåœ`A=‘A~D€V+¬Ke­Ó³¸cÇ*°å§²ƒÐVÕ_^¨â>šü0×VYæRrÅYgÛCÃÓjÝÅÑ­°>‘5Œ’R¹/ggodž5 JÀôvö„N›T?Éʨo2'©Ýâ±ÄÁ7tÆ,ÜHèS«™Ž×׿§íR¬–ä⨄½{-›†ÙMØê*W•¾±¾Ø#+Dq+oˆÈ<=hÌõm',Ê/´ç‰|Cs£xʆ4ÕðKvŠ·~%.u?ƒ$[w}Š™Ù“ dÃ1T5ÿ-š…ôë?²–ž‰Tàõ`ýÝj†Š7ŸN{q­šÎ±WT‡ªþ–àû¦ê °·íeß/¤kû„±dm”+ê»,}Êø úâ+Hÿª³G+Dµj¯ YÈáÍXüc×ÿ!³ã¾F€¾YYsMt1Ê«î„#`†3% å++t” oÞ(Eè,­7é¥0PŒÀuº¢ø\À·"o·yúˆiöÕ»k¬Ä?{jR_û¬`·µK×µ¯7d¶v>È»drGúÉ3F;^×Iÿ‡&¼rÃò¨ì}w;S¦è¯ÚŒò½[ºÞ ¾J&ÏÅ[Îý¹¾ð÷mùìèÀ‡7ô©Å§bbüº#¦Š«µ¯#-Ô<‚j2={@Hš‰¬ìö…Eé¿H›Íš°MøI{7y¦±Ë‰,Ë!7rF²·@Áßz7 VìJ7:VÊoûýÈu• ÷#ô„™AL0{øJÏåì„ÞèEÓ'¦Ú¤Ÿ Þj­š–°_ú}U€uÈÍjdlD|œGòÖZi-óü7½ÎF->ƒGOÁ<¼ÈÖmOþºç©)" Ã,Î+XÑ'MŠWµ?xsç©öÓy”]”ïé¸ Ì•§h;re›iÍ1ÌLÙÓœT¨Ü]zo”‰Þ±qEË©nvz¯Ø¨™ëŒ3 ,%õ¯ Ög ·)÷Fz ®2( BÝáµôô)–¡ûEÄýµ^x§ Î»i: ç“øú&õâ|\`iÜÚ¯¹vJù>ÕèæÇ^P„xaD‡‘†Ÿ™¯a¹Þ\š¸ç`}mxò &©I?;„;*JèÈHùú©‘±T­!Jæ;>Ñ•™¢F…të—g_á[žÏÿ$™Ð©æÜ”ýà†æ6(¥ê­ÜX¼@wÝlT‚\®(3(-O/õ°Œ…¼‰33‰Q®×‹ÓÅiÖM¿F•<¦Ý±&¬íо#:ýÿ€é*`#>29ÊËüœÙ]*wúq1$CZ#Ú&KsE<™–Ïsø Ô”"¼²ËwÁz.S€nB¤b{Õ=¼ÆÊ ÚBh{™ïd+îkï'¨Ÿê Þo9‹Áq7ÛHJŠgH´ZYôXÞÊtŽ­y,¸·—²¦67Âí 1­'YO,LÒ,R 7µÒfü6Ò²»€¯¯ñDË曦î™û}ú~C@D]^‚ÍŒu«×Ș]+ò5\D"á£a p€¬2[›%ŒLQ4˜]ÇU¦œ.˜Ò—1Ò(@+±~ç ùet£k >î» éK”ÜkýuãQž*àŒÿß ê°”Þ©3çc½‹²ÈYa<Ê]Äaæõ74ÚQUìb] ó!²ô§3ÃãQ¹}5C6³m8ÆG„­ô&ï ¯úàõA&RD8|4Z’„“ï‘ÃG ‡ÝÙ>\-Ÿ÷÷*~NOáyT–ŽÀ\é»cÖ+ÇÇ.å†Y-z¨.›‹Ú´ñ¤åo©Ü›Áî&$¸ÿ¹!3¥.ý}rcç$žò.·šÇjÁ’S”Ó¡éìpc'šnœœ„PBS‰B¨È6.–M•Y`åàv8?Ùâ\ú&Áô=ÿ®a“KË Ôë_ЏghŽ”©ÔŠ‹m¶§‡ÁËÁqÞé:£±§@+̘„Ô`@Oþ¹3¦(ò¤°±ßuqlt¸Ó6ú©iózS\o]˜Ø\RÅ^0ÐI¹ŸøÃ<€oiVŠJw1‚ô¹b ‘‡-à¨o&^B¯ïr6þ”þ·$ ê¨=‘yB‘„ò£Ê“´¡[s@¾Š,=$(6ºú‡|Ãm¿~>¿¸û êAçÙ:Ùãžf|ÉFäiœœ£¾vÃA ‰•V–„P{=ÛnÂT÷¥3{êÖàê ¡¯DõÛV"ëVß`´=s^Œ˜MÄd¼lóŽ…=Á­ÒÄ^·ü£½½kßTùÚš„†€ê³“£jS—$®mo€õD /Nädµºâ¸íÊ®Ó!o› Š«cKºñÜWê©‚pÇü¸ºJ²AfÿëFù¾kð²<ó«Tj¸3ànŠY¼š®ÎéÄT• úrŒŒ à”€{iV£È*ŽJ(˜çK­±ªvu°âØF?!-cwÝÌë¼PÏ[‘1xÇ ÆáCƒC£`¶C?1kÐþG&|=$Eéƒz|›­Ž¯Ä? éz°óè—‚šRçÕ“”KA‘æ& ÜâtÝÖ˜†~Ö{ÒùS êY·ˆ¿ø‘w’ð·n°«YS 5÷¡=вm¦ˆâòƒ_ý-sP7>9Ù´ÅØIóæuXí‰òwfbëw±¡Fæ®Û*†pk“ _Wœžõ·ø‘ªa¡ãe`³œ€l("£™V°½$ý=M¶Ú†Ø½ºáâo©Œ„:(«rñÓý—’Òâ É(çe"Xiˤ—Û#BHŸ^f·¬xtêì¹ d+É¥Ü&®ÞYlAŠ3…c9Ú&jKÕ°ÃG$óÅ{ö=R˜‹¾v¯P ¶?ÞfäÚ.ä,°MpÏ^鎄5xmÔÄ(o3ü3:qà:%¦C SJ¢e‚ðƒ€Å™Ô¯Hì>½‘ÿ¢Ëû“¹àôNÈ~ànÆÇwAŸ'Žggo¦çº«È%£tqƒ½&—µŽ8Þ"»æfÈ >Mó¼/p¦šOÔ sQo¤D¼4HAÒÍ£ò(¬ÕJ«6€AôIÞU‘½e=OÝXt/NØ ÌvÑž—¯Ú⯿²ÚÜÍúñ+D´}RNU0Ê74_ upuý×ǃž®Žâf>L7 úCå¬þFƒsh‘gÞRÙXÙ(*Yêñm„»l…®âGÑ‘„¿eCËü§WU=“À¢i¹éY)—ó/†v ŠÐ}Ý:CM"Ôvìד ýÇ>ïÁÛÄŸ“x$f.Š?-»òL¶¯5òVÖÉÐÐBÀÛŸ Ñ@ø“¿óRá' Úë‡Ðï¼å|½úréh~¦CÞ«ZàÊ•º§„C€àèFJqÖ±»@-¬êâäÒS*LC-KÙ9¢·Ž!K® –Ë¿¬Âgl}µFŽ3Ë7²}p” 8Ë/ÂòçWªÇ3^=#ÑÆ(AÈDïü…Éêýîï éKkd“£ðhëg*¡/*Ú00”ZZ÷G²µú?5’1.ˆ%ÁŽUœ‚rØÑ‘3òêíM³ä/ûáþŒ|ƒUßÇÿa›jiBrd Ý8F«¾~Už²»Ty"?Z¯I¶ Ò! Š«"ÆÀ“äˆérUb§§ß| ÅREÈ#pÜk"­Ê}¢çؽ-Ñ®²')¤:ã "ÄÙùéaþã¹M¡û0zºõ®êÖy /+ʺ'n 9iÚ~É’Ör ÿ`|±H±Å¡ ×Š’óÙ¨è!USüÄ5нaµ`4xê”B¹!¹‰r‡#*tY\þÛ Sëj°þ2QºàSÕ;!"”Ìx?FNÑp«N,}üFê“5+¦ñf£K'fé &0ªî&"ÎÂíiV6î ÃÝѼàÄB’™˜=ûéËM&{˜ã/&¸KRóÎü6áðÔ>‡Q»S´-&_SIHÀ‡”Hí2¾<>^ú~Ü â}gz3zÆÑR%Õ-8j JnËÿ$rIµP0ãß›p^ ÿ¾ Ty¨óV˜fJ4#ÃÑ•ùš¦+Aˆ?é’ Špk"`²{›*IZFW£Ô}{&+&üy\8¨å’N*Ág*{çm¦K))xž.káF#´—Ž a(õå‹ù¾†+HQÐÍ^ØcùàÄ_xÇþùêÇTÔh'˜Êê,¬*¯I)úè°D Ámá^ °›Ø9ÿŸþçwÌ?"ZÛŶ>]ñk“FÑg*Ýx/îms­ VSv(œÕÚ̯µ,¾R¬EÈc¿XY™ÚíˆEÍðõúRÄš'âÎ)]¶X®¿÷«q¿úüÍã}¿ŒOÖ‘mØÕ@@ö×`Ê<ÈòÅw+†5xÄ‚K®¯´Ï£}Ò ÁªSF1q_>òS hw²Mk„ÏMŒ–ßeGÄ ³ø`]€T}\¡(ˆyIí%çTrHÆüY"(¡¿+u|î¬ñ’£´ìÖWÁËrª OX´‰Òç{±í‰¬q˜îõãìàäGî\ Ò@?må|Øahã1ì…EêYpo´®íUsQ‹ÅŽÜ#¡m£À6+ôÿVåüž[ÕRi0 ½µ!¦I[ü€~°4žÃ+£±±1²ç݉F ÃÐ\0A?n›óž÷&h]˜eãø¨ Zmëçïðb…f—Í%ÁUŒ&äŸL—œÝÞ Š4 ¬× ú…CÉÐqæh,bíàXÃ" EÍ3?CQºÉŸ1æ‘,À§>r’ÁGÌ™Iߺmò\ÞØö‡ÈêÚšÆnMO¿™o–I¹»Áèq+ž?%1ꈺP*wn%ùÛ\ô39$®ÃÙ¬uvÏÎh•ék3I†nlÏ™ÃN—q-Š¿n[V7†K;óO|øEl »6¥622ž³KA€òäbºG‚ ð⽕ú‹Väj<±¯ì%_i¼¹0ñ‘…FŒa¨øœ­Ễzé÷ÄxÉZÒ…x0ÇóyõØ+S…Dø>tÛ„¤LR8.\à6<˜£-}غÒoŒáäfØõŒ#wÚ­E‚6Ž‚žž2òý4J·à~´‡[!Çþ%l–õ"ñ +Fý'6¶uû1|¶9Ñ;1úˆ¤y8¿»Ø"‘bÏ#‚áBÝŒpìD0ƒ‰R;íâoÍoùR'—DEœhŽR•bÖaÌ1;_,H_0Z¬ŠŠZòÊ {v×#ÎüÍÒèÎ.Qó+B‰|WËŽ>ëõÖF-¸ ¤²“¬ “‰TJê³èAcf„ÊyG¦ úÃ.‡rµ,q¡Âaq¥¯(Ò9Ù„ã.}7O(á}_öî¶à©?훯ð®y°KЍâ}‡;¬CŽ’à¾°çÕÞe¨Î/mÐ=üÌ(sO£‰¸}×AÙÄë¤ !S¼ÿ(o‡IˆSI^?œßMðAb‚ªP ßÔ%à@)•‘•õL£mñè±2-=.>KÈ&KnÈ\¥q×ú$—ƒ Iœ 5Pï÷b‹c8›a3fÏk Á3|< –nOwh©Ý-ì>v‘Í×– Cý`9²‡÷¶Ïa?4íâ)äâŽÓ´\‡÷W‰¿6²ú*¨® 3h­ÒÖK²[”t ‰…=ÀŸþ>a‚oStä5k¡aëÓ~§)¬ð€yzžúp·dºÁ®%¿aT^% å Á¦EU)ºüϱÝŸfS_¡Þ|Àlö™³ÒAþNOçP[AÇŸ~žÕ¬¯oU³v3½Xú,™0¡2ø»GöÐ|Po üãÜwº9<<,)ŠkÒ<‹˜Ø›Ü–W|¨i&X‡Óñl7}IQB¥.þÓfjÓôCדðíÙ%žœk¶^0«ûÖH$¬sÍ{½‡U׫õ/g:zÈA‚à Ë!HÐs¾!Œ{:`š(€%!f¦êuâ s´¦Î0Š9h©¼J¯°f1I¡ô4HB‹”äó6h"ˆ“Ê <7šÖ~Y&S–kàZ"úÔb‰ØÀ˜aݧ1KÓT0v6¦Ý"ž¸áËß«,㢺̎©ÌŠUžï·ÖH7íû¦wÓH˜Ðº%l1ço«¬Ò Ï šN5ÊBŽ/µoqí]oÆÌ7Ît”<ゾ7]T…˯È;°Ý–Œê=T4‘ö"Ī:dGÎKœ/\Щ„·Z°ç§¦+Þd'.¯6 ¦¦ö]lùò„ºŽè§Õh7D…Sdx]Šz<‰Lý|¯­ÞåÁŒÛh…Ζúß°3L¸—ÇJ#VOÖ°4äúS ×®Ïô•\UŸé8V ×è­¼ó:Véþ]õ…NF"˜m=ŲÓhûÅ–è±¢êÅû«£FÊ ò¬õÅø§~ð] •æÒ±wy))¨ŒÎáš`æ<óÉ{ʶ¹'( KDR¾ækrÈJ9Éšê°ºêu͸vÁ]üÇÌÀŠÜí®GwÊwÝþÉj²a2´Pü#Öõ®±­œ’“õó8£ÑìFX1uáb.°^Ç€ÿTT튪Z¹…LÌ»ØðtRñ>Uúñ3Gö­Œ½%©_ÃVÔ£†Ìü=Uúû,~jV„¹Í•UTìz+–ÑIݰV á-¯>µïtO6ðhžRþ{Öä» Ì'äm´t4 ¤Wk‰§9„ÁÿFü {Ù39$ H!¿Ø³¡X±±V{힬3A,Kf4ÆoÛvfì Æð €b°°P¹4ÿ¸4“3üN:ñûP#Ó+,R[¹¤5YÝdž«Øq†9¬EàÐòñQE„}¡Œ5& ÀoXåƒÍèÌP¨Þï¥ bÇ”ÒéÉa¼n~Êë›10ùÏîärÎâO ÇLÆ~óu¥¤Š>Ô©ŠP«ð+z¾£«jT§×ùУº3e¢o¨þ ç‹ÙOŒé)¹:?­­yŽà÷@E”Óz`Ý|ö´´‡—›ºaËúBÖ°.Ô݇äñ´þ£œÛU8“L©öÈ*>L&‹‰¡Uäâ÷_êJ³6ÊQ‰£Ù‚| gaxŠK@1 š=?èǬ5¬G9Á~Ÿ”K“ž²SíújþÛö*çÁÀNMÒlÕ WÒçÑœzF`K¾íǘãÄW+—j˜Áø#ÔÓ|dâ_ nÈGò´0„‡ëw×\S„!rÒT{:»‘"´ÍX-7ÚRA©5ÙÊ—elìX&ø‚¿hŠP‡flÏ|áïË2j endstream endobj 258 0 obj << /Length1 725 /Length2 25237 /Length3 0 /Length 25770 /Filter /FlateDecode >> stream xÚlºcnͲ-ܶí~Ú¶mÛ¶mÛ¶µÚ¶m­îÕ¶m¬¶õ½{ï»Ïsã‹ù'+sTÔÈ‘9cVÅ,2"q{WU/G3&:&zFn€Š¸ª*3##€‘ž†ŒLÄÙÌÈÕÊÁ^ÔÈÕŒ af P1s01þ0ÁD½œ­,,]”&TÿvÔmL­ì¬œê¶îV&–^wwwAw7zg7~ú&©˜™\-ÍæV¶fE-)y ¥„¼@ÂÌÞÌÙÈ èflkeµ21³w1£˜;8lÿ3˜8Ø›Zý‹“ ý¿ Ø»›9»þCÌÜÙÁ '¦*$® ¯ aPÙ›d%ÿ™nïêÂýÚÌÄÕõ_ÙÑ\ÿDz5úËø¬ÿ‰:{þÇ¢‡ab˜Z™¸ŒÍ,¬ìaþ¥›”½¹€ý?nS7Çÿ†þ!äò?å?RLÍÌÿA»ÙÚÊÙ™(EìÝ\Íœr¦fÎö€iïálõç¿P#;+[¯ÿ_ðÿAH¹ý#†½Å?ò1þÇeå"nåifªhåúÞ®Înfÿqk˜ý§6rf¦Vnvÿ™nö&ÿTÕÔÁÞÖëÿ¬øO*ÿ^AEKSNU›æšàßa1{S+{ €Šë?z9›þãßaE#«ÿtйü·£Lÿw,gäêlå Ða¤ÿW‹0þëù¯¥÷Qž>tÌŒÌ:vF +€“™ËïÑ5qsv6³wý·èÿäòßñ¿›ÉÌÌÓÌf}ÅÁ„'Ô:£-¼Ò_¬x® œfnÆPf… xuºïFÙjÄÒÔàèç^§À6ȘoïjW꾕Ø(Á îäÏT,Q¤Þ Îk)I•…Ýö»Rá[c¤þ_0ul;y°›¨;׬õ`Eê)Öœ_uÒNå|ÈL±†]ƒàH;‰k‹öTz(ÙÚßpf4µHs–aE^÷×A" BöànȰ ,‹*ƒ"´ ºOkÐoñXB_ÝštÈÁSiah¯*Ë[= ªStN;«¹·•e‘r¯Ç&4®ÔÝmGa?1*EôÉ x`,þjÄ3« ‹3ŒÎíÖrš¶vÍqÓ'tS¤;Å-)ŽjXqcG ¢;¨õÈ:ÌÎÉ\Á9Ùsæß¿¸ßŒçýТrpk-Ú›æìì,Dfj:˽IDTOÝ‘s~€òÄp/ç ú„wR‘ëÏ4¹‹‰¥úÈFçœÎnBLî7Fµ·3Ü?;Aëv»zðHÆM¾zÐ'HwôšXtÿ¬\²^N™O›ß¿ôRYx– ÛTƒ›:ˆÆ†Ý~¾âË,cîGÔc˜m[à§n?Ø¿GQ½(:òi“£UÁ' ªE¯öGEIÛ £.õÖ\T²µœ©®|O–¿Žaa,ûöqUrwÆ“)º‹‚<÷¨øÊm<èf¡aVþiä£Ì§Ãq¶Œ0r‰K΂f-Íäº úœ¢%xm¯Í¹òkm£q³g*)ÍŒm.B’B°(d—jÕfPø—ÊÈíõÑДù,4¥nq*b¤O”ßwå7ƒ¹|¬¬¨ VÙÒª•hæA¼Ôö(¨(ãÙ€[Ú@ÁÉ`ôܵw/Ù+ÆCxW´¥uÔáÈàýõx I"/WCþdAðn«leð4§^góè|¦.Äd9os”/ðˆ@¾¥Œ¹M£k=úÁPUóÁ—Äà©rv–¯(ÿ«î^Ÿè‹æa>›·êYôMéfbwx×òÎýÀ•_4gŸ7l_GÙ²c¢lô=Ñï÷¸àŒTb¾»öÅx4< êCgq¹ ÕË;)Wà©7µÁó~ƽ~ß+v&²\~à.bnåa›Üµ’:äŸP[ð}p´)jäd0ðb5ˆ¹ŠØ®,¦FÜ^ï²¼b±Á¾Ð7‡ÑÎ¼Øø+M토£¸ZJì{y¢Wá/DÞ®•(tI%ÒÝ,5« ‰jÙðž¼ SÆŒU`“ 7F¿¯+l®†‡À‡S<íÊF©ÄËõGéð•Ôº¼íºøËcÐGŠûðÙ—¯u‡ö >.3X98ïÊÌH4e‡› ƒ~¥ÐC)ò®¿OB?QŽ“ÉómïžJTèõ8bâ]4Â1‰fðÏó ÕDñ‘“” uD¬'‡„Kà`ÊŽ~D6‚‡«¡ià·Ãbž]Hë¬Ú`YÞ.&FöÉ{Oú£»ñÁƒ‡KøõÏFûq`pàñaùÆ jâ_ |šÒÍÕ…Ÿâ© ™â¿ ‘MîÇ…e|×7÷K}ô%¨Ca.O[þÀ»%ê…ú¯¬ãâ_œuÔ¾&“9u89L}Á$¶¾\Þ/èLÊ]±($.HòïNƒôx4¾L#3Þ˜º"¿NÒ–/Ø”€¨öŸÓmW6y®8›æ¤‚Gw6rä'Ìîáý4óbáxô~Ÿ ªEq.ωqt¸XŠ݇r  p33/EýH­yÖ†“çÐýºÆ&¬pÄ*IƒWî¨eàsòÌLi²P6·ryÜö=SïVûj(>ÕÜgjô[¾ÜW3÷q½±àFJ$• %Å P–ŠO¶2ñ°Mòã a'öOFæ;µo÷[Ûfû(¥Ve¬yœ¸È>™UãnxaR÷ª&æÄõ¬Ïó)ßõŠÅ݆>\AþZaÍý“Kã–éF7 ¼‰Ô†/ÑÁ ?µq\Ç)>]úa¡H ÞZ¨4 „z´»ˆ‚^ †Å1²6‚âÂæ@m« ýˆfÅÞ¯S&oó¥» =£áì(?^¹"Po‚‚&5àéã ‰ÐqÙÁò5MkŸÿª¾§CsÚå41“¹jSˆm4Û¶ød‘WY8‚Ó$Ž„G0…äd6a7|ì°Y'_5Œ3=œêØYXn•–N&ŸÑ߯%0¬ƒ'y¤M!r‘$EKOE²ùãZq= EÓÂú\¯ …jÝÈ7þ‹~+ ¡¼u¤“ƒ€™-ƒjˆ”Mê°»¥¦ý€.ýG?‘,zÌQÖ"Üô§ýùñØæoq\KY•|æ©Ä]Í´‡í”2Öô=¤\½±…&- Ønd/_KÖÂ/²\MÜ2Iá.ïVMþ·fÜ‘±^Uƒ·4:°—¤ÑœŽñN^fI“Ž}qŽÊ©©1U‹–eç>%JQºÊq³ÆÉuPþ³¡…÷t·"j#@Ø6ÖÕrþÚÃx¦aj0š_Û«el·*×éÎ$…`ä(«WÇÄo¬`UQâN\+X3ÐvÈä:4‰W° 1"Åœ|œ«ë!º5âSÝ=í5*£N„>Øðò¥^â:C)wÖ”Ƥ·¾¦ÆxÑá®~mö‚(^t¸ÇÖbÇ >"7g¡âùœ*‰ªN#o>HÅ–pM¬öáÞŸ¦aÒðAÓ'6¡ÆãÄJV‹Ô[äØaðOx±«(™’†¬Øa¸{«º(ºØ¾•¢xâ:ßg— ·|»ÚΪAg(¤6ç¬ÁƒÏŠä‚™þ¾¢7R 1á¾DšQ–ÖÑ"@9ZlÃ&ò(Ù²ê6tÒùr}[ÓGïupβÊUàÈ7‘‘ʶ±}¿óÇÔh’œØ°‘hDnäƒq¤º?'ì1€ã3)ÐFñV®~Î@Y|‚ÎJiµGÆqÐÖÒÒ/éØf É¥… ËÀ>¨¬h¯“æù‰É·, Ò,'ñí¢è€ê]f“É.†ǰîÕïk»MuDmö{$lÊ핬ÒÒ¯¥1f­]ž'æòí‡Ôü^¹fü0ÿ#vrÛ¬«KŽj|Ù¯Y¨e¯‘↠S „ØFP¤3ÔiÝÖÐÃQæh£˜A®jà1H&T-C8gkÉ:]5§m3›nT£i“}ͺ=øn\U Ì+¸+:k²È¬ú¹:,4KŠVvÙbšBÈÇ)–"߇ U€.Btò,&‹sêl˜áðáêº6~=Ú²jk{ Ìnƒ|ÛkÌ«É!Ä* Vå ÅŠ\ì¨ 0`Ñ_;•:uþ4d‘‘lé3ûåß%ne$ã=–ï4&,Éá4J{ñYÇúÜÆF%ÏBúZ";F¹–Ì,r¾.Ýjˆ 𹓥&+et.DøÐ’P­J—¢ÍS?¬ß?ílb8‰&!z ³À0+TØÎ8‹‡F0*Î HWú 5·G†Çåw*®qø×^«%F5d¿²ÂóçïÔFÚ E!Ïr +È`]”– ±ºð·äôÎT_ÿÀ5?kóü'Ÿ HÌu[ý8÷)$]à¨Â/„ ³y‚°ô™Øßéþ8—é“ãÒbå`ÖÆ¥Û>¿Õ&&gp~_﹦LáÏ, ‚ŒÈÙEmg@¦.dš~ãœÌœÈîÉݵý?Å^˜¿M_® ·tyh¾o.X$Þho×ú;õÌ>c„]Ÿ¸.±Z&½«¦ºö=CD¢íR £âÀLˆ2XP:‹i|ý†—Yœ¾Ù÷V—x…qœËÒè‘ÏšS㦰ŠH:÷P T_Gï)^¹–ƒçå œœâåä¹ÒV®©7DûðG”P³À@†Í/í¦1ØÄ3ÅC6eJõAT,•°æëñUq=«¹eÏÑh1´êë¶Ÿk܉úr>:8c䩯Ï3VC‹Lr¼‡‹a95…tBAÈ·¹»ÿ¥ áJâÂ$ê°ÎÞúÇopâŒ%-ª2ïv–c9µ“Fè’Ê‘ Ý)tÿ^&ŒQA5Ù@J aÑAb°Ôöšë˜PÓ*~;H¶·z%[²OñØ]£ÙÕbQr‰1¢qöÌ`j(ü«žPvÍ%÷ÍUŽ{˜ttA%ÌݳW"´¯ùj^z˜¸à=˜ýÐa’íŨò1lóÞòKÖGø/^B’_Âå8T…˨Z‡ºN[©€NlU>ÿ‚dïŸæž¬ $^ÞÀ ±Óó•Cy%©AŽŸ‹&±úsÍã#Źp†=¹Ž‘N;A‘AêÏ”=ô&ShÈdÞˆ˜dÙŠŸÇWÑšÉS˜ŒâÜ™TõéÐ(c•âÑœ£N‰QAç=hœšñ# ¸æõN—¥/S|ªíN~’¼‡¨»>G hÀ^îøJAÛ"0‰)ëÓ!³o¶}­ ö-7™! Kÿ™£#VP•ñ 6û^WôV™å@˜Í÷3Ló&ž›Ù;E3„%  ñ”»ÃÆØP,"Õÿçë´™Žò!I"–)kwý­ï†€ÛhTš“Sll€{„$iòsi†…Vƒ OlýZX÷P¯ $ÀqbRõ‡‹ø10¼ ðÜ7ç&/¡"JxΦl*šl ¤B(šŠ‡L¾ZZ¬‡[ª[L6.ù)RM<Ÿºr Já¹è®òœ<_Ö ¤:RÑjÆ›©¿ûîIÝଠ-¯d‰*ú€d!C!1¦ôm®x -glòl‘Ù`òYV˜S#,_ÆxòÅ(Þ$ÚÚJÎÄâ¶¶jù¶‘¦¤o¦ÎÓ¡·âlòÍZþlTWp²«»º…œã»H´šgØg;@h¿¯>p_b-J»‹QÉ–óê¡d¤‰·¹|°Ü\¡#w”»ÂjÙ”£ç6ÿdzØÉ{Z •iN7œ/eBRlÚµàf Ð$˜ƒ²ôU&Üë}„9Ôë;S’f0)öÖtyMÁàú}V+f‹Bó™!ÐÁ •©£p|¤7ý]H¦Ø´‚ÅmF€&ÌÇÜíñA>oy ?«¼ôÖ1ê 'l—:ê ª¨WÆ‘&"È…»¯Fo†ôe¼a™I2@µ¼ºÖ&!gÈŒXðÒÞrýJ±¥0ó£Ë­ÿE_k—š!b £Â4ªß:·é¸Bî¬B™ oUÔ—ô†ÊI5ë¶‹n·ó-«ö­/cÑJ³AŽNùñ¹7çN±pðªXtáì鸂9}å Û×êÂñ”Ù¡¡Ô ×àg«žŒnó;TïŠÁ¶U€ÍÈð«ÖëOO[9KÙ…H¬±ÇUÀoÎøˆ1øÛ~L'¯_Ól•Ýé¼öÇþ©8Os–.¢€5V¼ÿdvX‹’”çê·eÝÁÓ *«ºÕ"e ÷ßHÐ*¥)"í ÆùPÜ´ƒO‰××͉g¡bÂ#^oµ3‘+Æ€“NËpÉ!)Úð«ÇÃû—Â…ÐF½ƒžÁÆY ÝÇO—!Š’Iβ?~ ¹ÒSiQ=‘Ÿ !TÅA(%w2,ªÁ+]‹Ý|lrWÊHŒd L]øW®ëô˜†¾õI°VÚZ‡P¿ßå-–m!ilùKÂS’zºïœ~É]æô—ø0|‹îg(ÓGN)Ûz"·WpöL«›Ê{-!°v¨°ñ0Ÿs)Ö ƒT«jFÈÕNG©ÍÀÇQ«Q¤ &Ö`uÏJ¦CRîF,é9±œRkî}{ øú/ÿôìç›;=ÈÁá¿xɹúð—F lxb[ˆm*Zûà2¢‚_üÊB#ƒ¤C­ÍùlÔ‘¬m…!»%¨É÷²#3c’»ÎÄ'O¶o²ž×\W?< çAZšÊ»ûŒ#£ÞzqQœ¥DÄÅ/±Fìhí ZŸß\Ø܆¾ÚÏVÇ·íOÀ¼°ýßõs5ŠîWPú<ײbŸÛ„U\Lu9tBj—ä|ƒ« ‡ÕŠ4i?Þ¯ÿ:ÌcS̆T׋&/H.“àëòJbáž³ŒÇµ®âÌdTœpø>µ™Æ°nŠ¿bç*¦ËÙÚ•3ËçŽW›‘ž‚ ‹Ðê(´?dNC1Õö´ÙñûÒðj•««ñâ“«'” =‹ù9ô¨¬Õx\ÑHþÃ]Ó¹ÛpàCáБ¤J¯¦4;`óõg­§#ÉÖŽe~~N±Ö Pr6í²Õ‰ø?eÈ[AV“UÙØ÷õî‘ÖöÆfhÿnžg ,Ix¨ðxÅÑJ~5ëÇ=˜tïö²k⧙ׄ0÷ºqL-sÇ\lü~ËW]Ï÷Íœ$¹ÙòD´¤H ÕVbýŽ …5+¢<Ÿ\ZwÚP=Ca£¦øøR(IˆÒú»%¬²ìq£Á ±yè;'³=;¤&‘ŠGràZ<ðÓ+Cl-õkëã3è)&Ù‚çà 6ùœfñf¥l 6‚'¥t¹™u8^-]*dP´5;ÖYûíÇ`P‚‰úü£Ê{ º2úûðªq \Û6Ð'á%ãCc¢ñuNÙÈK wfó÷¸òÖØÈá›2 ue#ЪÇïŽî{Þ\ó¶9Az¶?.Š;²s7&ØòåÛ`èYN âQ¨PÍËáðå)ƒöóÅU2_ )Äï@“H‡4ªÍ[SFºpb/ùÑ)÷¼¯!+7¼UÈ®UåÛ»eëozïA^ŸbS]Ö&Ì̶‡ UàRªŒ%î]ggr=jÔ¢0,.Þ¡û5—£A ²ké‚;O³@TU©¹Üöoh¾Ë™QÿLö 0ǵîÝ·ÀR‰K ^°ét¬¶¤ Ú—ÈÜÄ[éâ‚j$6œöc‹'MÞë”eÛ}³øÐ+$ö´áå}g¼˜¿=?Õ†yßÞš!€AMCaR¦ Úâ]¢ %³ SÝžÁ¿Ò‡êÇàèY±rr-M ìR+VöG- ëáÈelxà¤"ë’@ß&¥c€Bvj-xÃñFþžÌË÷7ùj5×ÏC*¯ílÍü€ÃÐA½hqó-*¹° ²DZ—’ãJW|6 ðW^ªž·˜ÝÔa1Ì?ŠÒy'’´1—G®®n£ûnŸ“xò1Gê½Ð1º‡ÀͯÉ?ã.éG=ãÁYñ×Å׳¦†ƒÑg˜%!œé æÔ·åHùdH4ô* ˽5SÖùˆ^ísˆÆh¼å Ú ô‘T2ë%-js¦Mu-§"Ú•“‚¾/ÛEúŠñm<š®¸Ñ2çV…{SAgxe>,ûî\(Ûô:»ÚJòO7–-îHÑ«Ýå¸Èd\!)#F0lçÔÜ}>¡`;á6̈7í­6¸>92žžz¡˜+–ÙëŽc…üe«]¶„ñ`i~˜Ú žqŽÁè¿úÆ¡wœ ²zÚTyÙgD©»*•—ØÍ³6nçàμëÿn,Fq÷‡õ†6>†ßµ†æy6!ËŸ [ÁgËXhÀð·‰#SÙÿ¥¸a€ÓS<{ÏõŠº!Ç·ô4?'ôÌö!5^J…¾dc.eÿÊåžîg=&ßúdŠ·ƒývìsj­.bm>ä^õvÃúN‡|\Èð1Om!3ÅY~¿´“F¦Ï-ñ™fó@TárÔbðYsŠ\ч³gÌ4sñΦü½Ø<^ùމç« v0´%$“>¬ˆ|i§ÚÅï˜ÛdЦ*¥þ"“–Œó݈8ea.9ØC’ºçõ;cLY–ô— Mgî¦îIÜL™óïÚOz„陟™ƒ%ÿǪ(V ŠªJÕùû¸rÖŠÊÆ¼tÈ>0!&çl½—6¼_â&{eäüpj§ÊFÁäÏd2§HºŽe<€Æ@€HÝÏlŸw<Ž’"XóD¤Ãì$9<Éw4žÚœBT"NHÒ BÍaùOá··/NôC$X.!."-µ}äv]šn V²bÄ44aÅ.R­œa±Oýy0S  æx¦lÁöæ8TKyÀ§úîßy á@g¤pÁ±l#J‚5¤ž²4ú„Ÿä@hidL%dÐ{ù¶²*’lÓc°ÞÂÈKrÿi.έ ¹ ­²tçâŽ&_FyçºC¦¬²ÎÂèHí „™)ozõä•Á\B;¨±6¾x1k49l±jUˆ*ÍÛÀp ||-œPh†XHКWNx|ÀÀÅ®@•â·¬2R(pÞþû‚éAk¦giÓ;ˆ†#üÔ=ï+¾k¥wÊWq· ²i (o„žt5ÝŒ}ÑÀ9†Ë[˜Ÿ¿ùŒà+CˆÀ- ½G¸Ú?ít5gž H9Uú¿/l#ŸúÉZð øÏk[Jd!÷ ÞP'$¿[³É—t¥_R¯\ŒçÛp$CHO£5‡CÄy߬á%oOVjã’ÔÍW({¯@•Æ œ÷ûè:LïÖ¾ö‚_ò¢Ÿ27mÉS1)PœqÛÑ’¼v_ú‚Û²PE ,«È~…'}ݱƒRŽ"Ú›&³±sNLzV .pÕ"_¾ÂgÆ'Ì'h§ò·^‚´?ïõÐ% O6S>,Ì'³<øXkEgtËañS¸âLQ(Ílð,ØîÒH¦ØÎF\w_ëoÑåe¼Ñ?“†xN:S¦Q™Ø_»õ.´†+«}FÛÚQ»¸¾CôB ƒeñä@4 â¯Úí…œÐ>€Õl+‡k­–·Ñ_sÐO{Üdü?ßQRCLh½Nèù†!6æG¦–0ÏÜÖŠ£¬2‚£²)©GÓA‡ö®UsœO½õŠ¢d[ËQ ‚¶ÌVˆHå¨3®NØ÷Ì´K´}¬+ÃÇä~FúuܨÊsŠ .?Š®ø%üi]ª5¦”¢— ‘þg«c&(ïA2dwoèÒ÷/$ ¢Åo-»cîFyö:4gŽÆi˼P¬Ø!€·ˆ4†U,zâH‘‘xae‡MõQ|0K]WQñG *,ß&ZÒ³áµèJ;©ø‹5Çøø†úKý„ ;!ûN{‘w1éV㉩š>pÀ€`|ÃOæÆl¥Ÿ]§; µ%âK‘Û 9Õ§"é‡U`!K.l k‡Œ„,¥¡û>)UM°šU›fõ²šiÏF)âð0³"ÚDý ,ò*å]¨ŸxªŠÐ÷oš!¾ý50ZÐÌh\Wfk‡1ŒW5 3¢÷–'$&øQî˜3‰è˾œ¯sŸ•Í~Ú²m~až;‰M®ÎE¿X#ß@l;²JHÝsZ;ùÐ çÍm `2Ë’ãjuè®jŠ!#=;l$2€x9¾êfŸŸ][hF!l³BÙ„‰ja„A y¬k¹qA4CÅÔ"–ñÿycQÛÇ*Ò@– Ћ(S‹>-B·£ÞK¨_Í©H«¶W`¾²².Äü¸ŠÖYfÖ2F·‡‹F¯QžÞ‹T@tzX&FP‹~œpþ5hA2 Jœí—™ny(”‹90Ô5]ÒÜh—s>å;R8½ )íM¼,Šyi9¦&~q%„@Ö++I:7¿?6[{»ÚÙ¢}*]å•Û8‘ô)r˸‰8f”~´m$1&å¡F’Sƒ&£vÙ—õ³ãÏwq—~'òº öšÞdhV—ŸÖ]õVõíf!íŠçpXæN>ûƒcËqWkȹ³©&[Ά©ÒyVr›n­‰ù9éÄý5»Ñ—“—Ý-lçJÞó¹q9_ß^~­Oûà‘Lû­ˆò@{€>ÑãdÉuáâ®B© à`Åçõb†¤ì”ØŽu“5J“vRó+ÞÛ[ÈÕ)öyÄæa'Ì.ß Û²”ËéFJ<ÿkûwO‚–§Vê'ÕÕVP•xz|MçBjù!iòu®34‘þ+ÓŽíí¥˜ê1Íïõ!Ú¾ Ë{]=f!ƒ$ÎëéÀ0£˜Qø,nÙ¥O‹’D“ž¾ß¢Së‹â]>SÙQ+Ö²nþκ³Û›~AݰšO)"îëõY5T¡]ñp ½,uód`¿g@W1§ðòõnzë¨&è8 µ),ŠèzVõž©E “®>:•Æaê͵wÊ—>¹Oò ±TÚ‘~ò¸ÝbK8½€á´aŸ„¹š”æßé( M)‰T½¬¸Ì¢Æf§K/꺲*Ý-–¬í˃¾J½~4D!Lè®þsréDm#äWþE»a:zm»“ØvÉ^ÝH_=Ïèi¦.½~Á–g{<´›fõë?ºó-Ó—š¾¤Áè$œq&¼8ÞNŸÃ¿úãüµR+šk”â³éI”@ucw6!µZSOÊ{S“Åfl]kË…ÙÐ-Ó-¢’£› ÇÇ}@1fhª0hNhÔX$ÑKØ~ëÍô„‰A…°Àÿ#9ÎÈê­ØYú‹3÷Ѿ Bº¼…„ãvÚjÀZÕ‘ÔêŠcVE ä¸tB®ÉzÓÖÛâÿ.ŽÎ°BdTº‹™³}¢,%’$ª³z€‚lý2q’[3·F¬áä7OV‚ä…ŽZ1H¿¿HÁA»gÖ»@Ù<?Ð]gD<槃%Ûß+Ãå5glQäèüÕ(뉿…*Ó:Ϩó¸$˳¼9h#ºàÀ@ظÏààÁt‘,¶‘ó £ú×ÙlHKN©6Iô¡L§æ ëKú€¢±ØÚØÌÌšQ@qG±sTcaáȸ™Ë×p•«ë[0ÈÀÒ\JÑØ@JÞó~&× /oä&x@³&KÅ3¼ïÁtZH?!VOqRÙ|ºØŒQ 1½é¥Wûæ¡Ç!ü7½â5ªñúbıE§™s+…¸!Ì úÂÛî{0IKp<îy¦Wå{×VÑ­Pç<¥ö÷þÀß+Ë0(BèGò~XaÓþ§£¿Â–†ˆaSƒ.KCò@oþ t¥.í_M*ÐÜ&Òfa VÐ@gOœ*ºå?8·N<»jÛ8W*Üøíß•¡oGéî¶¼m±æ^®b3û@=Ò¹·Ê>t_Ïø©SŸñ([ºÄ{. ~±o ’/’&ß'„? Õ¹Q“åL(N5gn‘ôöà|¾‰‰Ödy]6>T‰ ¶¨†-yðœÌ0|µó&;ãál]ç/C{ЈE²OS寭È*yÞ›$ÃÓã-À¬^~4;uZõã ‹I½ùÓÍ1çxŠahѳÏÈ÷äõ¾qЉO£©G»§cÄ|+U:AS¥yêô²u†Íéë‰\:n9ÿÁ!^…Hý‡&ëÓk·ãõÑbJÒŠ …OÆ_iãœg®Q§»¾yjÞŠ¬öùˆÍ*Ì‘ƒ àŠ«„¨ÖÇ‚9}„ü·4 7€N"¸Ó5ëkþ§wJ\†çªh/®µˆMX¶éuOv¡•´†»MèxÍÀÕCuÒkíùújï¬7F–OÁ”îÍ(Tžúñv§Ë8%®?ØWEÅ$UfŸŽê>ÉÅÊìR3ï—˜.b7Õ.Cë®tib_U´Ræw¬]~LwÞUX½9­¦NÔÏDæ|ö°žÿã2Æâ6Æü`l¸Å#<´úËÓœáÕ­Òǹ¥§ò6úµ‡QÔÑÚ)NŠÚ› ã:W/&è€Ü$È¢<ôòÒm8dsÙüV÷OÄ\„èR<Œµ„$ ½£.v _wgãn8¼IB'g¾ø„2ÛP?ÐÚî_Ø3l™Yá¼ÒˆJìCrè5·~@Å÷êey壘ÔUˆEõ J-ÒfsâaüŸ?yÈ2 tP Zm_¹»î Í„jVTÑFŸŸâD8À¥¤ì4g ÀÞÌ[OC¹ŸmŠaq ÞÁ3†°ò¹Û.~kѷdz±P—›YŒ˜×gÅW¥~í¾[ÆZ‚.5HAÝvòceW¥å0¢bgúq!ès‡vmp+µÛ‚<ßÙí—¢¨ VqÖ…:¨K “DmãÓ²É&t1± ªËŠLìyYß{f,êÑ5T‡þavÄ‚rY¿Àp&?Š7uMŸ´FÓ½éW Ô?ãõ¼kìU'ë‘ÚŠyVf;üEì ú\·‹?ë8ò»¶!ÝxJÅjEŽ{¯P@&Ñôï­Ì>ÊÂ¥PÆv¤MÉ–Æ+¶Üº,¿’µ`üC¼…| eG‹ ¾Œ-Ä®ÊÐN³š3´„Fâ†ý -3”ßËâoœš3úF³¥Îa%Ú³ð@é`“p‹qGÏ.œȧwÆD³/­Â»Ú¼‡ ¯´l~ OË#‚­Û¦<#H«â•ðdréwZÛ¥ÇËéì­ ò]ºÖm¢²ÛÞ•Ã^@&‡¾ûeBÓ®–h¦IyÛ$Κ[û¼ªý[º¶Ç[ 㟄ä!-p®z±?Vl|íxµ@@ fõ‹QðBn1½‚Ÿ^RG‚©Ïæn‘§¨Ë+ ·ˆ1’ñdl/Å q…p`‹úxUÆêâÖÝ"†!OTÍðwÒ-|È™vÄpJµéõOQ‹¬(ÇC–V'¥hKÇ #P¥¿ó;Vò±Ç""EgëÕ}.qÉÿ¢1—2ÇZéd„„öfë˜,? Ú"zÊK*Ùêž|ÁßÖöì–|ft&× QDûasÿ¸™÷ï6®9à žé½ËK4óU’0Ø*¼?Α¶)9D-Ÿð…$‡«É,Rúd±@Ê»·8v–R:,Ï,ÈÇ™ ?Ñpqš*›ΦVqbqÆ8(ñRsü=Û€ê²Òr#G$ µ„DiýÁ§µžî…”ëN³q´Õ€6Ì#ìDQ~¥*mrùsÍ A¹=Õèö­H?´8L{%aÓ:}Õ÷¼OO%++áÈqM.ªð1ÆK"ï‘ €Ú[‚»õ/®]…榾æ9…‰â¤àÍf.heQyìEbÉ&ß_š6Óe$ýã4Ó–ÕZ3- âí +®Š-PÖ÷bìÎ{òuž³:\õ–ì̡ܖ›¤b¦Ëúâg+oM‰1$g½cÝ5XÔùœ]jS}ëæ–Îÿk†×e{|ÚgȤÌmv#9*Üô½ÆKyæNãFÛÝ£u-™C²I2ΚgæéH^}·ÖPšƒøf‰ðáMj9Í]riþÈH ó¶›µk;κššÒáÚºÜ :ƒþ+ÿ ø¯Îþëܰ~xsMÛé`R?é®f 7M’•×Q³J]™Ù:Éôs2ë2ÈîKÞÉLПðÅhq™Ú¿_U}Œ¿·¨¨Ûç¯5%ÈíÉa ³—H ™éA˜rо »LG½‹ÏÃÕ³>z2z+°ŸªVØH Ǿ=0N2 +,x`VP¥†FÆ+&QyÕÜšk2£áœàè!›øØêÒýeÒéß1`ÝL¤ i6¬ {«O°¼‹'$]ø4èVi÷ÂkEì^Æu¤ Ieü`ÚT $ް^§+=ð%B7ª?ºU“H=+h Óï†ånƒCÊ–FÆÏ×9pgÓYåu7ƒ #è¡2Êd죥kMRÚÏ“L8U4¬(P-é°¿|ï=iø-ª£(3¼­#•—Û‡»ž' Š;ZzÏZƒº‹ª>…+^¯<ØÇ¾ÿáµ€Ãs«‰\_Kan$ïÔî’—†[¹´FC^zÝËç4hD¼è¾“ (=Ýá¿ÓöáDÿü,EÏHŽP·ý H&Ã7†ìm¢õ—õë33gë&[(<óòEœ1xûÄ¡  "C:t„té;­7î*DHŠ¢oÓ/ÍîÂ8ÞËb> d»°4'£Â%¦ò¡Žl«ßIy‡…2€ÏY;nyRÆ´4᱕û<3¢Z\¼‹•“‰Ëˆ6ÄS̵5m  §< ! QÔ5HD¡Ü²^¤4µÀyŠ>ØZRFrM{EÀµŒVt1¡ m^oü^”-Æî—dêu4g*¦ðcël†ˆu?R&x¨’~Z~,÷|}œil"öoÊk¡ái#ÌËFû‰ £Þm`ÁÅr(ÛͲç—T¾œñUÍ]mz „!]Ù'5ÏÉ59øãÌÙäQfk¸\Ù©NvÃÀ?/󜩣³ƒŽ¬H4üLп Õ?úŒL-¯TÌ‹˜‹#œ¡¡qýh™õœvho-—_vÿ™Ö¨»*»Š¹÷êñŠ6¤·söud'”-ø7ØÃä. õ±Þ„„^ŒH¬J8IfÅ^Z °ú¼î§<ÙRHœ}E¹O£å™Y1Œ càªB!†r£ý£±†÷=­UÈÙ\ÉÃ7!:n=ߟ|b¢»º§ÐÞTÚ´4ƒlhÀz›¼f¬ŽY8º¨ÍKÒ«ÞqdÂx1[ Úûêl3#é û!ôK½c<æ’éþ¶ïr…üòNùI£àÊÿ #Ï4üRRŸîô­•'”ßé™p§û£—²b€ûbú7Û‚”(q#.‘Æ …š|Ø.@{[‡Þ®×¼–¤ÅÓhF(Ý‘ˆÁöWÆV)3b2ZD,ŽØ¥m&²3€â5¨E‚G”x4Cý áɶ%-0vóJÐÖB$ù^àU„Á˿ʆdIt åz!&’„ØÉL3O¼ +x‘“þåjwYν 3·c•Òû“æ½GÊ:éÚ[oÂÛóý÷d‚ûxCŸúF¢U¹šåè&ËÚÖ,Z¥µáN‘…ˆk3‹M†«Œ|t·ðG à\C$£0ãö}{ÌiR–ÛבϽ/©D£a×ï´ ’ f™KoZe«;*yÎ’ÌRïBgÒœQ&Õ$:Žc¢Ublð‘HIÈ]£[Êeì¹úI´B’óo6Œ-xdcÑ«µ®ô|ÅÔðÉ_3N¤YíQXþ«[,œŠÅ`ìDº@/|ÿ—Ïé‚›´üòí6½l“,~J# C‹6ßJ)&œÁ!0ùlFÇ%ÉE—ehOñÀ ŒZ:Ž„9aÝÿÞúbŠûý-:J£è¯éœ]@®ò½Û3ê=é éÉšó/7uyDgɦN<Ø™oRør¶¯ãb|®Ûl±3îõéUƒÆMîãìøßwù·”ï66K߯;ÚÂ2”¡‹:–J+ºùèíc{cûð£©N$¼ž–>g±ûáÜò¯Ø…¤ âO {øÇA¡yÑ•甪ŸJìXþÄþ±· Éäµ®à᯽eÈE'þ1ÀÐøø]„tysÜ„èõãšÃ¼Pщ®°Ž5ü„|ÐnXÅë-§h%2"pSRô~ˆ¬ËÛ¿“nÄv~4f•³ððŒÓÚ(9ÌÏÊp¼}œô‡M¾Öx¯Á£ŒDè…óh©‚sëœÑ¨XÚqÈuxZŠþhƒä`}OÜÕïÅõ«$,ðå¶¥€ñÝá—ógy/‚ÁÂùbëèEmX%ìœÎ-T“±Ašz¦vÜ["é\ž¸·ûWùJcã ÙÎ!o]•>$qˆÜ]ª»Aa¬”ùg$*(çYâ´í"¬Mx«†§q¡FÁÚH–g¥´&¿‚b8÷àDP F<|^aÍá…†8°ÖxÏ.g¥ÖnG uüý ¶´Èâ)‘gçÐK…µ’§Ïè?§(9Ôà߆_ÐGƒ­7>w‘cÛ–½U#ªæ¤'ø ƒµ25Ó Eêz;’Åôß žÛ람K'ÐÅ%y&[áqNô­ìqóU2:o]£ÛHé»:ǺtNs^Cþ¾Ú·9×Cª¶ÁªaìêÞjÝ¢õ«oÍUèWì§h¦­F5f_<]-Ä^ñ/$œ×éxéÍÉ9UÜy^âg` ÂÛý{ŒöM ±c^ãCô€ éH"¿ï`€$í É!¾d8=mwB÷²iJ+tS xC 9,qõ@Wc$ކíÁL]å®#“':Æ3Á¾;[10/›6,öêï“j9¼I<·3f0šH ü ¢S±«ƒ"‚H¦ê×þ£ÜÚÒýʳÕü^ŸA"xã) ŸŒ·U TSyEÞÆx˜cš‡ƒBd&¹;ÌÁl”aGÖwzž2ÂŽ÷ŽÎÔ[R*tE`§B¥Ës©sèoáßÚ¥hL*[Ô}UßêM9x Hð'ñI϶B‹¤_Ûuî]¢0@‡Õp1õùq4ÕjxÓÈËnà$œ&~÷~ï²Ã½‰÷‡½¿s9'ƪ,FqôG;…5‘“zJ%©( ÛP‚êHÍÒ5ék/ȉAǧóÓ^ZsWfãùÉc®é»˜ETGp½XÚXB äÔÃï‘ÿ,‰IW'!R7Æq†×hºjËv`œŒœ( ·*4>€/®º8ì}„âükç‚sntmIø`ûçty—YÜ›¾²nZ(°*“æä ˆGàv'ÖõûÛç¿[ ¬ dQ¯æIÌ‹êjáà ­;½Û?â;­¤& âï5Äó.—$W¸½‹g+YI×5+jß6ˆ2yr¢Q<Õ-zÊv¸RñiVši¬9(*ê~L<ÿ×´Žú»2=q«5»ÊœÿfÒkónût6µYkÝéVd÷óž ÒLÀ{ÌNøñ¿ÿe7ù¹ãÂe7•™{µãMê—¨Å_U›9±VÁ#ö‚÷O'qÄžÛêØŠÏ' 7öÐôxjza¤ÿk¼}Ü2ù3ÆÞç¡ïÒü\Ý2r.£,¢Äú¨5wƒµFA­çÈiñËS=eTR1wúiU2i(­‚Qô˱çÀ“¾ï;–ÐÃǶ¬+­fD¶~|§cI­„9h„o_iFgåA6„Aç#’ZÞºÒÄW¹k¸¡6Ž—¥ˆátaÿѳO$-EŽå?^]èÓh1µ–Ñ&¨Ò¼3‡iñ9ï‡ç€s‹Ú8÷‡ÂLc®Cr¤–'>=C["‹”B—´XÌòŒ‚¿RôÓB²éy-·Âe9ਖC«¹ß›,I‹ [ØŠ-ïò·[*\à ”6¥Ú«‚10ûˆ\ è ׄ’’ƒ+D 8<(/ÒÊih4Ztƒ¦Ñó‚°PiÙó Ú’K˜Ϩþá,§ýÙRv,×è™1l´sòëuÛ!'ö¬Ö$A`¡ˆ“cE'|?)wœ&‰k b4–) ÷µ·ÁÇÇaaŠl¹1 =7Š”Æõ¼hû`tÛ"±B\<#$ÛGG­´'®ïÂbí‚©GŒb4gcGù~*`•CÚ;ðRäÝ{]$—€"’|±]VÑd ]/—;Kœ¢³PßNÏè°ßÇ¿}©ž-¶6 9da6= ©ÍsÚÚ•ž‘ñ×¢PXDN´°¡úɹ?«Õ´9ÁÝi¢mšÖ¸®*§î“÷(vŸ¿»V¡'7 _²=?GEöjýÙìT]5K3HºÓÑ5zóV¦)÷ø n)ça0g7cï¿Ê U>úõû.*íòÙ<К …Ôb¯ó™{XÈW§ Ȥ/€~‡“UOqðc31,'‘”},ŠöeboŽì8$V¯ºž-B\çÎ*õnþô 4ÐôtiÎŒôìªí¹‡í[‘á©Kö–¶•Ýü•§Ü›X‚€†©äµG©$ÚŽ;ä%m¼ÁÏEÞÁ\~D’éµÊ ¼ðíÒþ5gtÖUWoæIpcS%¡4Øw‘@‘ÑJ¨§Î5ŽM\ÄÁf–!̲–‚;þL®Y‰á¨Â¡ˆ?äƒôÐ|ùÉ%Sîw,vö‰Óm®~„È“ùuµ›)‰7Xâ+K›2‹.,i‰±Œïü÷tzÆ•<¨ eöµ«Ò©ÂëÁC§àlqpãsKJMKUó†+ ÉÆÔ ×ñÜ5o9ã4Zä‹#ÕÊåà}\–t{ñ’ª”-óS v€pˆï±æ›€nÔ—:{ý[ßàÀ¡®pIžù¯îÞ´2Á1Ì´”ŸÜÑkI˜·…Ë*s˜r £&Ú£ññö;aÌkÆâpv8 0„¿‚l&­1Ü•vj“%¹ åMŸí]Iȧ÷côD) ºëŽ[È™Uu½"t±Èjö¼‹ ßÀ`FŽIßÈÖÖ2‹БáR«àÅŠo_IW(Öî?-žø…>n–†dä1_¿¸¶± Ð×@ƒ¿  0¢°}Np(OS¾d’ªn¸ÁßdÜ¥3À×åîŸñ¤¹;K-ØfrU×+è²EúqÛ oyÙ É¡ÄÔ¡BZ‹; 0¢BöSÄ:Í.‚vƒÈGºÚ陀¨$0䑳ˆß4fJØYÞL©‡ÃÂõ€v “ŠG¿­ëš8¡~pT©gÝEÎ> ·Æ ¥j÷64 öñŠ“¦ë‡àb®Ä­ [9.Ôieg¬<ôÊ&›!ï.’ÐÓÄ%$"y»±nL ô‚Þ/9å´¹ ³¯óIÁØxèñ ˆ"ªÿ¿ô# ÜÞãh…é/•R sNÚüXQè@¿%…§ô›=—%dÑ©z³Çw»mõ¥ iíîëÂÂ)s-s#ŽÆ›n¶Ð/l*ý)a#}ßò‰»Žé˜Kæjûªÿû†ïoÁ™Òa::–vë°ó[çôªœâêÝ­Û4 O~`’°h„à„½Þu–°Àéwära³rávU.æ†ï8ò¡Ó*ꛨ“ñz¹¨µŠ"qÊîWèA¤ Noþ;7Á⇠êUnâ…f}­ Ó„Î3 \úžµ{ÉzlÝÈfÍb…©- ‰üÀÓ2)ö¯Ý*™,Á ¿,ž[}‰œƒ‚â‹\Ÿ¤…ƒß­©Dï뎞’ÔHG;è"ã•v2ÄF`œHú;@•#˜K±h94¼k¾>ŸŸµ»ƒûÔç¶ ÁìÔcK01æṼÏËx±ÂÅ)5¹¸ ÊBYCc«ž½åU²—ÔÇ4Ö¹+D¿#’ÇÃ<µEÝ-NÙΤq6C6 ‹åQ=¢ðÊüh阸Áv«Õ,ՃƥZÞ1àLNZ*yrìa+%õ)Y[Õ¨ Ý¡:Ñî&¼Dè ks£ ïÈ—pþ`ñ`+ŸE}D¹|ô3¿åîè`S9ŽÐ,)Y"X0w);.x\Q1<¹v1§ü£¢ËÖn5€.ˆ¹úv"×þÈi¾-›‘öÔÍ<’€òÚ‘LÕµbS Z°ßÈʯㅲžª®Þ>Ù¸›Û¡<¥²–V2ÅÆB©8 ENtUt%ZÍ(ºž‡¬œN"@Y_Cݶaù”ƹëÃ4wŽ&¸¼€„Lžùjÿ°4™B·5üÍ »/¥=˜(\ÿÙÞìt3å-mÒ¸ÜÛæo ‘‹ŒúqEÂ5o“ˆj‰pµáç':u ½•Œõs<}¼@ >ëjTÄ€bæWR0ý¹j"ж¥F¯ö«U mqy,«}Ï–[?cöìå†j*2XG@3L'k¥Ï8&¡]ãø[‹¿:0<ñY¹ÅÁš|DGçâìD†Ù´®=Íõ"¾‡ ‚ÿ)y–Æc|ˆV2/½; ÈÃÙÓ±‡]ÐQ ïÓzÌtí¯]n4Ýéžx\‹&=–Û‡×ï²z¦§óĪçÁ¥‚Ob¢hü!²þôžu0YŒ©&ý*¨ð>eEµfÊ1D 7&@Qð£nÏI¥G\\ÁÓX´š%AµÀG‹ÞªÿÑ{›Ïò>sÌ(j&m)¯ Ä:”ÁóqROî`ô>Ì`OœÅ:>³Ci­& «¶4þ7âЫ5ï,(ŸŒ£……tzã¼ “¬»žçZòØmX‰ïÀ£Ð¨+ aãDZÕ ':g@cíRÌÓÒ×uÞEÂP‘ä—íûzU6ÎGŒ¡|¶™i²=Ϋե8¹Ëûö Í+)èéL9ÁŠ&<Õø ²íåÑr®³·D‡ÇnXA<¸O{Ûq·tÞ_ï|„K†#©d©¢Ä†zµýâð3¢¤¡µÃWwm" 3!ÂJl»:ɲ/ŸŽ©}Ö}‰ÿɹT‰¯'§c0UÔ‹è±|´,ú»dçÌ)ÐC=šìÐBë3Ì!mêßgIöqdð> ‡± àQÒj YÍ!§zBo¶p¹¼Ç¹5&ÄÀnñmª<ϸ¼w$È>†é`¯ìâž)ø¢ó*ãç%rÛ~cÞ¸]1ú2¨›‚þ†ó^9qVmZýÂHà-vÂŒ×cfH)ÖÚ?Ñ—vÎvní*Æm€62Îòø²òŽÔn|ÄçðaYÖ›ösGÑkœI=†°åô%Åî:ß^"•.އ¹vÈuµ )Ó–l˜2†åóÀw¥ÒWê¨)w—{Ø$.¦§Ðøê,>AQ£Ï_Ð:«âÅùÅ7Fö¶¯"ÖËaÕVȤͰL$Ûà;;•ï Œ‘­ƒÌm¹xIpëŲZlæåG^×Õîœ1 ¹· ÏIªÚ@}Ãtm۟У”f€ÒwäEÛ¦ª‘ät1ä‡ORžJþNßÁé°7l 5Ô°b z„$íYb¨0÷9 ±ÃÚ‹Þfšž[ßýÔ¦Ý *ßóÏSP%|Í ïçy’ßÊOx‡$«OŽQKœ.Þ±eØÊU¬ˆ'š¾fÓR¹žlN¯d¶vØ›Mw%X;6\ÛQúQDiuÝj£Irgüwgs›'qÏ:•Êè e9ìÚ:FgÑaì Läœy9ja={¹Å¢· À‹aÚš& O˜íÒGÌ'(7°žÛSR‚uÐ>rŸ€ÿŸ¼6Únõ¤.&ƒu|xM”Ÿ÷OªyŠé’¼v·FÙn¼-¹ó'h‰_“qm§¼É(¤O€ê¥ñÐ6n:Õ#ÜXÆ0Œ0±oé`×zBƒoÄòÂ\°Aû.û)«}|ž•º>·w'«;ÆF,nº)p¢px|Á´öé‚þ‹ØLb ý·.^Î,ulRøÐ`«œuŠÊ+ÛÂ]oãÃoVFÓG¾„ˆpe6¯ê–È®w™óSwéÄáÿø™l™ } þRÂ`"Ìʯ´w:ñ")ƒ±Æ( iÝzlk9˰@%U³-À|ó\Ø–Á­‘ØÕ„ Ëè¡xF´¡(a¾±ì®åÕáöËl@º’(K0Úmb¾)¶^m}Â|n¦ýï‡;ÔÈ7÷•°ÖÖ[þ¯ÎÎÝ¡óÞ½KÔ»ˆ·'{G)»Dš%Ö>—qŒãÄj[€Oà°ì)RƯ:CKîûPÓKlU£tRÄ«yüí5Šb¬²Ž9Gñb „úú g„e¯Ñ°c ÞúÐb®HØ/ðx° œ­è%´yh?”6Z·JÐDt~­,â×ÁÕCT1ž‡ ïÑ÷Q7ƒ¿ $aœn&^­›[]¬šQžpúŸÅ— “¬q¤Æ¥ìbJ×ç> ¸˜a ¡ƒ±ÑTÈ\ñŠà¾µV Xêâ0Ú×}š •4—µŽ8ÞÝŸ7ªîŠ7¸cm£ô©ªQ’Ne°ñ¶–òãþKÔïhÌ[<, Vˆ¶mð;1ÃàRQ|ëqq{Äâ2FYï‚)'cëÝ CYf Ä‚eÐ ‹õÓ¹[—ƒyûnŽ/€ésâsždŸ³X#+Ö@ŠÊçKçã5ˆ‰ò§¢¯‰¥@Û½/¦Ìâp7Ø[à¬_7öû+Žm#W(TyÉššA"»«:'Ñö€XÓÀ™Yÿ©sÔM6Ê+ Í­ˆ êûë·Dàè®C´:ܬ£á›77ÌHEÛ|Ÿ}¨B¶ÀS“t(=?ôB2¢¯uúï)ÎKߺ¢vÅ$y“9WàP—vº©•ìO„ZWøB¹Qa³$ðÁ‹íÞþ“%«ÆVãŸSá"%œš„kO,étàÈ8Ÿ Pè?T)IËÆÆcÜXA4Ö<ôm¬»¶~ù¾ó&-œ»¢`ýIŽJµ‘|,1¡§å¼_lD~É¢^šËxuA Çg0|ÎmËa“LÍK¾é›e'91óÎì+‰pÊÁÙG¶ºS ¤:2be¯0ŽöµW|*ñK¸Ï˜«´áÁ à‘º´^¬E‘-•M©Ž‡Ð­›ö\°y°Ž‡·ò–NPeÁe…e° üʳÓOÞ“é^‚H!þYáñÈÔyÑjçÍ*þVLê¦Êòû ?UµÔ°´tЦv‚ _ç€YzÁm0––hW;eeßwèŸí]Ý#à÷ñàÉÑ«-Î7á÷6ž©G@?¸¶”PФox…”'˜Íö ù³TüˆÁ_ÔŽÅB GµÿœºˆlFcçDG3;Òµ“­]KQ9˜Ú“šÒ¤Iø²O¤rË•–¡š~€ ,\ÎUhê’lÀÓ”B‘žZÄ~'ÛQÉú6ÀCÌ UÉF›,³“³æô€Ešê™;‹çŒèLw†Ý׸[)rñ±tÅ."ȶþÁê/ZlŠx'|‡ð¸Ât¡ú/êh^ˆZïQú›ïÄ%h'n/sÏç|i…B» ¯käÂá¨ïÙ¥ÝËb´‘Kì_C²lÖd<——„ ×lÐA{Ÿ^„60(K×´–t`1Ó³ºLMû å ¼²ÿòCbŠ­Ô½HÝX?~(xæ o)¿©ß#,oFÒÓ¦5ž c嘀0=ZkèÊaª.tzÂÙ®ºd»(–Zþ@ø‘Ķ5•o]£$猨(%v÷ T†ÞF}¤Ì+^_•¾áC•TÝ´ /«×¶º)ø¦€Z pW&'ö:!rÖÑÍ( –wvµ™š­àž_IL:Ÿ™¦÷C qCùb üÿYû§”Bn¡Í”8¡jíèMúÿÃ=0°C.’¿ºY<ãI†eÀ¾z!Ó=ì7}ùA%GwÛ–-’í)pªdSZa².0ɪ®ÙEÙô“²Lž (ûG¾lÊGÄ„L±ðK×®¿ ŒOxË…îMì2rwÝóšŸ©é ‰Ò×j5ŸÏÁ†bÃÁ71ÅÛ!Èø” •c/ ˆzƦIx6}ÛàEdzËfÄÅWÜÒP“uâ0°zšn'Ç9 2ê>ͦÖ9»ÙÞ°³¹ Gbý_¶0¶NIʤZ]³PºpÚáU`ß:dhAè˜7\ õÌ•·ÔØTQ`#<¬%¦0Ükæ+ǵ6=`º€7ÛŠÏ2k×´WÚÓÏ'Ô=¿õ.‘HÅò¾Ý·3N#˜HN«+ëò„ŠŽãq¶êÏ$°30™5XõMìÖò(ãä+Gº›×úþJf£Bà#ê>Ë¥<%,`ÒÊñ9E±r§_µØ¶à“¤Å™vª…DjѳŸñœî¤—@œÜÚgV¤€W| He߬¸Ô5ì¦$nMŘSíòYÑŠZi‰±c=­'xí××ûæµ`iBü=c>àcÝòJW¨yõu âz—F“úÝ@èþ, ?QîÃBw››ûñ3k×(xгܼ7¯¡½&<Ò‹:œi†r²èß#ïÀ¸Ôë+Õ©ölO€„ï}ÞC¡9ºCšˆñê¶Œ±Ú6fï{te¯MÕ6=xsCw‘yM½'Œö^6p+?HD2«³Þ„©èÎtŸ·k t“¢ŠiäʱöUjô” zнòÏÕçó,º¤‡­±:¥­O\„ÿ'Ù¸ÇÙ<í n˜ý¿›zÞDPÛô°U×¼ÏD-iøò ã gßÝÕW Pí¤Ï eðŠù€fhŸùϘçóÔárË´£ê"»ÒÔÜw[®×{UŠÏ,Ï£³”6jC“ƒU–À§ö2Ùþ¾Ùli `Ù€ Æ샲ÑWFÜ|:bh*qŸùþÕŠ1¿òé5€Êe±ÿ&߃kzùê¤ÍÝ™}´â¶fy›+VeÌj ÚÖÖªS:—Òù0t¡ÄÙXîXö‰àC’Y³#S>6:¼Êò]™eÏn TӘذ-¡»Ì.ʾw,ñNÅy4SIÐß8]6Â!¾ŽØu2ÑÒ‹?Ä&¢ùZ˜laLÆaß®‚]§«ï·Òš8¸.œ\² XXýMåmÈ8H†ÉQnR褨<¶ü¸ <‹| ܸ®¯ û]‘T.”]›À©kQÜN¶Ÿ>Kú€„Ås7ƒ…ŒÂCôQÌxò]|TäÆN©h¢µX}:§ÌaV¸ßùKt¡z-IðÍD«ÃŸŠ¼‘‘±ˆzU*óš26Opœƒß—ø®fØŠ¨ûÌEºIÏ…ý®˜+ôa„I¿Yð;”ýó§0|ÃðUÆ{n-qÑ \ÐcRçàgÑÒmFòrj"KÛøO©]Ï]8oC¹Ì‘IwˆÑY…–Æß+ +!l1òæA»\\3_4é<ì‡ ³°ï-@N  ß·ÛCKì3QÀ ý)ó—A=ùh{a Ý̬þÍ̸ss—x¿${%1S™¿`ÚÐJrôû$®ÿžYÀ,x§ë¡0ç1g—•ÿ … ÐV|1ÎòEÙÕËѬz+Š—€µz±Ype©,ˆ—rIÈ Ê$ _”Š1<íð~Ïþá‹P *1¨;âwií.µij9z*é7,sZÝx>gŽehWg;¼Šú¬õ•°4·’ÄTõצÛh1Ó¿EüfMu-¦Q¹í!\ž;_} Gñt-T5mƒ2k T\æ¸Ù 6ÉhšþŒZaåM {íñ‡tÖÆòŸêxbŒŽ„ªP4Ê*Чeðõ>†'I7”.½˜œ?ØšìIèo‘=jÍ@j.Ah.,WIªý`^]K"QPƒŠé„Y[÷H®¬g;š<À|ê‘Q»~ÈÊŠ2–ÇÀä¸Øï™–×º‰qŸ¨x$bfò îÞ KmWT8Vzof¡> ½>«?›Ú2ƒÀBKý‹±ðâ§´ãi»`q[CýtóÎS"Dá–m'`jþÉòÞK¢â59Êýrz©ßNÉ&m¢]Q¡À·ü9T¦îçÒ*~>FAm4©Óâ¡KT‹Æ *jäU±>ÓÎIžZÊ­¾CL‚ò³ëXì•Ç<úŒI¶cKïÔ~Þ ’Û,Òç­uÿèšÏÀ2º™“U Þ#*E>*_8磩}ñq§oØ ¸¤†yìiùàæ¹óM{ ª…YÉùRÔÿ¶Xÿj º¯Ûî_òችÍu çá´ÚIäÙ„!gxæ¸t0àDýöÑt CÈü΀Y8' nïu©ÚþUò8 qšße)`½® øNóñ’×bSðt–½ XJf©}Ã¥ou˚ㆼoŃ;ÿK¢ rŒu˜_O°Ë;œ2Ðt2Ú*×OÐ(áÜb@aúéš¶;˜ ']ÐyOgfÇWC"Â1·¿gú™…KZ8™º¢Û}½nuÕîšekxö?470)„‚œ˜2ò"•O·¼,G ¿8‰}:2Ë+ žšH¶áNâfI÷° V"¤]À6wˆàÔñCú¥T\gKÊ_¤ž´¬Î´ç×Çèa¢ñ‚Ì?ýž Cø›¯-Ã0¬ú{ìmú÷C¾ÆP°|]¡+^Ñ‚>Æ&/ 4é,ýÙݲˆ\Tê£m‹¦ŸÏ²ÚŠ1˜ÂeŒ2 â1¼'U¶–ä^bsþÝÉ­4žÑ,Ëø0¡•÷›áà¥GN'®$DÃ^Ü(6@¡@{ôÞ°¢. ˆp”D¿‰Üt]ͤޘÄà)Sœ¯Fœ=`—¦•n®è!HC"©Áß6LqH±x®å^'5îa¦‹™þ4þ¢8°n)é^A›Ü™V²þpÆzSpmÁ“Opоx:%ìÀ;¦Â*¿xQ¬…(!{šíÜ BÉ‹¥3!Óüž»n3ˆº/:.Ï$رµ°Þÿo ˜œ0~`¢¡éɶM6¸ê"êÛâ¥vÅIFx÷¥ÚгØç.¸{YÕ´@tMº5âIbÍ+ZÄøì$Á¹ÿÉ4Cv¥ð(JÏ~x›Èùh1^äPh‡à‡løx9IúÊðšBsÅbATÁkÁ¤ô…`[ô§ù=ú"Ñ—\ÖÉÞM¶±hîðcŸ×ê£TÔ¨ta£äRt]?"Eå-m ¸‘¬çbš%…E1…:io‡‰ Ô±|ÇŽâK?[¸»I½é0‰ØÓ(rØ1Y:©‚ow#hO!ÚÅÉUŠë¢¯G¥˜%4EЮlGæ ˜ö?ÉŽ(21××<;š~eµè8½&Rá÷ò{ÁáÁ™6†R”+ºA¦w›¤Éë‚NT1õ{…Ê7>€•µ‘ ×Ð&QåºâŸ¥X*y$èa¹ /Â]¹,ÈN)ä]ÁÅšÿôNcŸÇÜÄf»¨pù©ú}vA9Ö‚]—öSA)Z³Õ_‚ò‘¬ŸœÙ^ϲî×¶ªâêpr“÷GSFƒ×@ y|õ]õK°)Že[ÑÌýÜÌA-D ò‡po(ñoƒÙ¶jÆDf‹œE­t:JÕMÊõ¨$¡¦wÄhg¦'rú:ŸàÕX,¹–•CòfYÀ»ÿ^³ÒQz;Èž“ QGaî  ð€ùQì’ÍÿJ‡îûiþ´a{'rCîQn-ˆ‚\Mû&c“í|‰ ȵ#|ÒÎ/ç–5gø×pўŞ°‹HЊ£zhÀÅM¿òŸËKh¦mvÍ÷ÜØ1 ÇI’[ÁÛyžƒüæÍñšáþè8,ûÐÒdªÁ¿KäTVùŠc ìùð<‘ßB@|‰tT7eÃðy4šœÂ€ÑöÓæv@Ç,*‹kóÕùÁ6`‘Ï%Gw˜Å¿|¹ÄŠÔŨàhô=rÔ?` ÚlqïM¹t*äÑæÐÐ# ¦AF[hµ+ÓÚÇ ¦3²± ±“ci^¤ŒÚÙçjÏS±eÅåæ á«m ë Z‰zxøp8U´ýß<³ŽhÒ9Ïg“¸éO¥Ÿd ’Œ¢p_[¹ |»; ¬”«ÇxŽ<ž³tÚD‡F¿µÈ£fC ûZ=tàÂ\Kø·ü·Ö£@@áÎ4^ê@£æe?Ë ÏUV†[r–UýÿãÜ»À€Œû‰6Ò][D2-=zå¤Vúb^+ÄÒDzПìLE•ø,ëTð^ƒ´cþð—õ²>ÀŸ €.¶–†W[* íe»ïç‹^Àâoˆœ¡¹)®·?¶ª`'Úº×}7é´-Þyz&õ/=|$ơ⠭£·ó:`q¡}GŽk)ÌWï|òçD)#ØÞd®bD6 I£÷jŽ6$>ôºUu+—§ålþâ%Ua*ÔëúËÊÁ>2[êTxÁão O&Ó~z…"]àÆ]Þ¯Ä'Ü—š¾µüm‰æe’>ásd݃U÷ˆ[³”$ 5™W‚fô÷fÿ9;Ë£åâ'÷ìÏkg÷/tϲYÏ6­l\EйÏоó¦žèmÐ:³Ö²¼**ׇüÉ1 £™Ú SJ§áj_I­’ºEºÚ{œ|Ït0’ÑÊ^DÌÜ EÍ`‰g­¹ßXä´ji^׋ÈÂ=™ÃÅjìÍJBqz´hõ5GŽ«Ï¤tƒ4`ýUÌÞö³ÞðvË1ûb6X5‚oòÁ,‘íÖÕx}ïöP›¯'ÒõW,R±mÆ8H[—Ÿ} úÒAXÆSœdßc®í(ßûãïñGòÎ'Ý@oØ)­û¯9àÆé÷Äb¥’ªö‡î5 ·¸/¨Hêßàø‡7Òžá|¾]¹ë×~çµò¢©+Óu(õ ‹‚¸>S½§~Ê•³ñ•ÝÓ‘j—µ{3âp»( }Ô3=¯*ú„Ód&i THʉ{ +êÊ_dþôv Ëù# Í¿(¹Áé=Š?XB¦mŒ,ÔŒŒö-Ïza-÷—s–ÉpŸ§ž 7ös…ó9ùQŒ&ny0jX‚Z|É^ÆI€”“­rÑà}mÙõW>÷ÅôÆ:)É6÷«JKµ€“ÂuÖ¨TšFž¢|æµç³‡ÕeתÁ Ÿý-€ô½Ä“‰+ˆÿk&•ÅZ:O6ª%­®ê›{°÷Ú^rüÊËh7ª×´r»ƒP€ýëë"ý~ɀ◠£Ð|\4^*G²©¦H~n,ÈÝ¥´Ÿ”ƒíŠQùCC—KÆ÷vØGS •ŽV&”Iz±Ý¤ @è 4šSÐ¥kd{òaõj·4~wH<)¥“M6Çvž¹iʕެ*ûÂÏ…¹[˜ÉÅ’³Ü uîxKëØ£lmŽ+,Y¨é ê\LÎ=¶‰Ãµ¨oóKï1Q&rÎ(ŠŸ®PÊù®f耭ٺJ¹î ìcµÙüÆ%¬F=A:yæ+^ûKiÍ0°]‹y®ˆ€ªÕ·µé‘,(v^uF§j`:°7ЃW6Š×·ôžrWçÁ]+ÀùîâwOææªÖðž®§ä/0§ ¯Ž*]š¯ù.<Ĭ®ÿtX¢Û²A©¥) * øbøÆúæ§ŒJv9ÖKG…†r.fåQdàoˆn¨U-FKγ>ÄT´ø­å/-oC6{É"[-ÆZ=1`õÇÌÞÆpeê‡= [H ÛŸ(ñÈܾ¨5º¾œqŸUôc{™Ca˜g¦#.\®lZm¶n!œë/ƒ—…2Ü9Fo`:úh—ãjÃ?Œg— ŽŽ§Fœ±öÇÜt´òóIlØäì(æã6Â¥o8p¥9¥M¹™¹àÞÚíOZÓõ¥î\’"Ì.çzÞ˜L–´N®í)4S.k&%cûrÅañ6cÎ-ò2Évδ³±Š¡h_76BäðÒzØÿ3)qCÈÙØ<Û:ŸÂ¶ÀÙ`*±•Ñ:£}ïÃw¯ÌX&áÝ>Þ¼t’àr(ŠËEè YŠö§Ž¾ñTXãëæhx³²D¦Äô›Ì9ƒ©§°ßNkõiRÔ¹‰ý}mûow4`e–”ùz'=ÍA> ðV˜™…›„{"#u2vCI}’úŠßáV—ÇP˜ô.Æ\¹O ~8”ŽØÕy¢ÚðXÞ~(-ýƹÛM€Ñå&·_ÀLdúH«¬ãÎ Œ$÷U ìgëÏãGy¢Êá°¶z]Ôõbð´­êj|d¡ö}þ“Vç÷ObÍéúrÒ²t ú†­Á? Ý?ý Dã5lŸÍ†)´ŒÉÕ( öŒ. )ÀêJ#ÈïØ/\õ•- 7\¡Î³<ãh|î!Ö;çò}ö– 8•v·æIZ|ãyuIÝù˲„ûuL¼vžëÛé‡]Äœ×à¸]œrjâM\Û?Ö“,œb¶ÿPx^ÿü_±ÈŽ@ÑÄ󭫆w•-ÌÝ, {ܲíZ&nvTaËóÏÇ{·ŠHlÎì² “_•~~°_„8zuÑ|uíA–P¬3ÔÍ;ZHèÇi^ÎII|àçžÍDå9O endstream endobj 260 0 obj << /Length1 725 /Length2 22213 /Length3 0 /Length 22724 /Filter /FlateDecode >> stream xÚlºcp¦ÍÖ6Ûv®Ø¶Í‰m_±ms¢‰mkb;™`bÛ¶ÍïÞ{?¨ç­¯Î?K]}ô±VwWŸÝ$’ö®j^Ž@Ff^€ª¤š ;;3€™‘ Ž‚BÌhìjå`/nì ähͪ@G +€•™™Ž æàèåleaé  6¥ù· aklfegå Ðp°up·2µð»»» »»¸1:» 2þÓH¸ZæV¶@€˜¢’¶Œ‚€ZJA ´:Û”ÜLl­LrV¦@{ ÀÜÁ`û`ê`ofõ/L.Œÿ`ïtvý˜¹³ƒ@^BMDRQA !Ƥ&0¶7ÈIÿÓÜÞÕ…÷Ÿh ©«ë¿FGpýÉÖø$“ÿ‘þÇëìù‰Ž…`feê 0ZXÙÃ1ý‹7{sçÌfnŽÿíúË?øÔÿpH0šÿífk«`lP‹9Ø9º¹òf@g{À¿¸÷p¶úÇòß¡ÆvV¶^ÿ¿Áÿ!ãjü"öÿÐÇü“•‹¤•'ÐLÉÊõ¾]Ý€ÿ1kÿ“y ™•›Ýšÿá䟬š9ØÛzýWÿ åßý1Éhk(HjÐýOüÛ-aoê`feoPuý‡Ocg³ÿ1üÛ­dlõŸ úo,ÿ]Q–ÿÕå]­<ºÌŒÿ*æ}ÿ-éÿo”¨¨ƒ§ 7€“ÀÂÆÊ àfcöû?pMÝœö®ÿ&ýŸ±ü·þïb=¦p«K¦|¡Öi-áþE3•t3SFêtK, Ë“=׺¨V,Í .ñîÔðò=§ƒLv.¶eîšIãGã1$‘úKx/%d•þ¿7ß” ^ë# ® 4píL ®£n]3ÖVƒ•h'سrÏ~Ë:•  J±Ä•wôC¢lýZ™°—¢Ñ§BËÔùBîÑÕ ÌX†^™½ì®‚Eä‡ì \SàZV9Dèäï=w WcÞ°…¾ürkÐ¥„L¦‡£¿¨(köœ'ªJÒ=n¯âÝ@V‘Cɾþ«y¡án‹<ÿU!Îd@aÈgq¥ L¯r,(J3>­·[ɪ»oØØ6ÇOíÿ«—$Û.iI5wPÍÄŽó'ÿg­>Eð”Â’›3köí“÷ÕdÖ#* ¿Æ¢5°aÆÎÎBlªº½Ì›LLíØÝQ 5+÷ œ/šw1«ß't°†Ò`ªžÄ]B"¹ßGîgÖñô:ÔØn}Tk+S>ÙÝ“¬^§«ŸtìÄþ‹gc¼l[·©Eç÷Ò9ûù„ùÄ¡ùÝs7…—Q1ê—M¤™ƒxLØÍÇ áyPÜÝŸpeXÀM ÂäÍ{û·šg%GJŒJÄxdõŸË½QQ²vƒè ÝÕgM'jK_ce/Ã8X‹¾=<¼íqJî#â`O]ª¾òk÷zØãõÔYˆ xΖÆ.b“àE3`ÙKÒyΈ@ƃ“”a„/íu¸—rWÖê×»&R€3*HÔTÂ…!Û4Ë6ý¢¹ªn.&̧a©}ôŠ’‘# }Jaü¾*¾˜ÌbäÄ…ÅpJ)ÞÑ­,ÀÓo ãd¶«­mC•o©®Šg`Z²¿~‘ES߸ö^Ý'q~è'i¤`­Å….Ðçpz\6zæný@Ê“ÃOô“¶Vgv ¼aSñïÝ4§#í.`/!£ð¬)Ö;¸W‘)ƒþ¤ç©v¾ Lúà ÛÊÀâ&bº¢¡65~‘ƒ_&÷Unqù½Ÿ‰!Ù-kt ú)ðu]Ë0Âx«Ó_Àt8?)Ù+u ñuÕ£>M¯,_GF_e…T,åyUl{¾âÂ2‡Š6Rv—L¶NÂiõÕØäP<€bDâëe)p<60Ž©Ô½¼ • Ö>ÅÓ\tu8x¢pþ ¾£C7rГ&ØkÑ–3ûîj0Á•êfþYq%:à‘dˆ}ÞûO~ë"Ý…c›qÖuá=B– †K*׌ ‹`‰vBXêð«æ¢(K‚›ÌK-Ÿ6ß”]èsDvÆ à²d®Ìum‚^ŽðÑãzB´ö Ècd{¯¿<{¥Ív±ô€à_._ŸCÒ“©ÂÊr‚û2AŽ‘ûäE†Œäó×¢謅_Æñx5g;'<éêÝ[ È)þF;©Ksr$ÈÛ ™©( Œ–}»Òb‘þØéŠ;˜V×b„)[õ~V‰¯?ˆx¢úó³`4!§ìk¾¯š\Ï(NСôÞ«…{;I@!¯~GuªÖV®.Ú¯± &ׂ0÷)ÿ¹]%ºLó†"ǵ=ÏO[Kà2°˜7³äm'¯ˆ¹ÀÓœ+ßpªÂnt‹*&M -N¤’×b1íVúð X¹So™×‹ïØäëz~ÂÜFiÀ"ƒëÿBã‚©ÕWœM­‡{ûÄ¡ß5}!ÉÐÝ6ò ÊZXëövÍ€há­»v^íuPƒ6©ûÃH——Š"8uF •¶=sÒ™’º¤þ).þÒ‚»¾ Qõ¤zÁ¾g”QQ÷$~ƒ¥uj"c_´K&g¹Öªá-öÝúrÏçä‹¥­’ öfšâr‡wHûÇ5"=þ&O²NÀ1ŠëÔ®XÆMȼ[:§› ûŽéZB2ÔURBØßºÞ%ÑgpC“ßÏäàL‘ ÜdäOŠ^°(Vdj¸äý¥P€à ¯Ë*bÔbHq‰ƒ;cÐ{x·oÎÓÒ32D“ ¬ÿmŸóˆ‡½w†%㣘‡X³*âHÉÁï9GÆ<ŸýY˜|‘{~ÈfÎß1vw åzØÝeÂ~¯ª©¾¢ûŒT]›N:ÕTç? ñh=/£ ùTùE"÷;à‘4FüyŽÑ­Ò§~ý°ö®]:òˆ-熿JðŒo»æÏÔA|ÀÞ=`±Þk©äÕÌ~I3ÃÙ½ÕÄʹñg“È$Ç”\nk³$ZÍduçd¸Õ2ï½érNÝÞ±sÅ“ÓýÕ®Ç ëßœ€MF‡&b¾{ñð6ñ;S×;Ô¶Ü?laMTÞ¤øKÕm#¡Kv¯î/K C÷²_ÉKWèÝäR(@²’WSxrj±â‡Ïâ¹=IJcð¤ ïv™eK¶„@nž1(Ì—- iñ'¾|S?«fëÊ pW€áëøÉ íw fPÄHnØ„‡Å;ÍDåe\@6¥PÚ¾¦’ûö%ÞáüÉàk¬x‰à´xó;­;˜Å"B3<Ú¢`Í÷üÙ­ËÏB?9†œŸ@¿Ç!³ý¢iï#rüpˆÁÌ—2Î Œyáäf\ÃÜ1?éŠB¦f^xÆkIíØ 59-|àiÕèâÕã¯0ôðÏP‘‚Ù]ITz¯ÎPÚ;gà$Q„jE1æR‘}LÖè¶Ç»ü§|øOˆV;›ÙgÃÕXÉIï(ªb0–[Ô3K&lKææÖÊ;ÁÅû0" ÄÁjóبgdíQ®A²N‹Q8ÐLõôz* |FçåĆlÓWa˜ËYñüƒþ7çáZòL5JæØ]Ã4„¥¯—¬¢¦Wj؆ˆOõœc”v!£¿±pØñM÷(&Œþç·Ù-noÔr¾ œNÒo†´w— $ZŒ¼sØ|ý9m·¿ÝîU;|Ô­æÝÐÒÂQð3‰Žg¨Ïëî ½,Pú–ðý"õ‡$é—±&ߨBâ9žm!ÙØÜ õÆ Û[Y㔄uâü‘Æ76b?RË{LȽh­,Úp¸ƒS;55£EKEBÍ‚)Æð0ïŸ{uÕ7•@&¯ŒŠ¡6ž@÷z|QÔÎ ’88ÇFÍØ—¤"}÷PÔ ð+%•bQ›^eyG2‘`U½‰¸•ó *—Œ[½Ó²¾â Ùƒ5k§=›k@ÉJ\Ž+)Î5%«¿N3ßcW q£_~ÅBuAö‹èJ£~´nVÿÐ3Œißá-í&|§9Ñn(ôOˆ쉚g„w÷goÃö»ñ1¬ò”Ò"º*«9<äü™k—~eØÈJÃÌÁiž¸;­ì4g ‡Ò èéÈ\ê§,£ÝÏe󵩯‹†™5\=77F¥=AÆyã‚Ó3hA_»)0?pŒpšT 3 Aw¯/†©MIO‘?Ç^Óù#>•¤sŒ©õ`A#LVÁ 6H®ù"+—°J{,ÖdäÓ¯°&zÌýºHžÐå+P½ø”úaÏD»Ø¯ÉyÅÁ#ÉOÓóœ;D®^–_ãT… ¶‚XÆ–ÒUÎ?s“¬ò(ŽÁþDw +2áñƒPjùvA^å{Îø3L#„%jzÌWeŠ7UQñ©¨/‡iŠO‘J6Àû¶‰¥ñ™­Iÿi>’ħ‡‹5øf‹C¿ðœôdéØ¿e}ùÍ;lþ×VMgZ,BNܶ¸¹3ªÁÐK¡é¸€"ÍQ»ðQ¤ŽÀëÂÌñ¶Í°aAvûñÙ¸—{®r!ØNòÇÿY"±å¥v$½FãaI¡ÞÃÐS §uZ&5:A÷¯¶C¢¿âx"ï;Ìõâ·&mRÚ¯–—“ÏÓdRŒ«ZÓ—™¦ Á•fÇ!ßh¶¾µÖ}\ …~Ð-Ýçç;-L½A?•Ñ3(Ò>ùù~y›h3vg å {ä)0,¬™õ¨!PX8Y¿Mˆ¯€9Ü t;F&.*;büÏdÄ£–/¡‘ÚnŽP°Ö7D6|}(“¦/º«­iY¾¸å6S’¢‡³Ð¬­ÏĽ›ÖÁ™\õîTH/ûñr„™œqÞÖ×ÔwŠ)¯{ږЯZ<ËL‡ƒð…¢ÜIOJ/DÔ3Ódh©O>ñþàêºOÌŒö F¸ŠëR°Û»ûÂBµhÉiD¬ûÌ1 Ê|UŸ ´ðQ\bíë[þaFñµÉB"­-#w‰'wTnÛ=„:œ²$œ„YÖ>ÙŸƒ¶â¾ßÎ6±AÒÁ—I r;{zµ»Ã¡3†,ŽÕ_Œ.ÏR/±ËEÆÄ+.ŠV,Ý^1jê¬jB-þ$ËØÝNÇ9ÂÌàiļE‘œÂUµ6nqÉÃ;Þ©CÐAþHk«©óÊÑ0uàþé_iÐ, œ¦Í?îËK@Ùð<´ÈsȤDæð‹_[ìd"QÔ(eé)M4Õßzе:KZÕ'%„+ ÍŠF×®MƒN¾¶'OyF‹«œyê¬#£³­—V¡MÙø8â1Õ ;é,˜ch—!… ÝüÀ7ýýóÐ\ÝÉÓºá;‡¬>‰LÍëfEÌOo›@üŸW`Ðý†´ÛG€ï˜[ò&3Hœ×ìýÌ„RÅãßgMî#¥th3ÔzB$5k0˜¯+%þ§È+›ßÓÚD0¼´¼ÒýÑ:kAÎ…or™’µ Ê[ïd x ²¥’ÙM8øì úÉ=žI6ŽïmáÜ+|A|³vˆžÛg”òp‰Qgvµ…«oIã®&¦Œ­fú—òBÎ*Rñ@ l?ß]D~˜‹¹_â¿Ö³£aÕþF·Pmñ}Î h² ׃B“½™:ž7‡Ã“÷—^é¸MžvD ì؈bØ®¿+Æ¢¼‡dùrÁó}¤Ôãš`¿ºRŽÕëú]Û)a“çqo ÓÛúÝ«©Nß²Í}‚¨R–ÒžÖÈG5¶À’FÓç‰óX2 zA‚ö±A_Cc‚Ââö#ïAÒ`;›&Fk‰~rͲ…‚¯ ðT_~yì«ã¬Í}6¤e®çØršKΛ÷IïɪïïzÑwM¦zm‰IUÕ p‚té¨ûZ©W`ëE€®í¨?qÉ+–²ÚìJ}ÒïutÕØQBpcúd`ް×OBO8—DÙÂ81¡”öRþèÑSL”Ø<‘Õš½£††jÜ1L¼ŸšÉ¾9=w&Få]ç*RÔDÔk}úUËã´D(£‰#P‹Ð  ·O‚Фô–~„™“—]qèÏþ{Z˜2.ñ œ"® f|àž ¾D{áÖ&Äö>µ×9°>n^8t: )LTeçŨY[lw‹¿„P*EKØwø³ÖØ"ŠÄ;ªa ^9,3¾Ò7‹Æ+°òX=œÈ’ÌXrwÒ¹Ðâ3ý©] p”¶-­M¦0ì[ÎðñYÙY*ƒûe´Ö›j`¯F•I¶½tò•›cw5"#¢&,¥\½ï ¶h† ^m!U½ôWÓ–-= ‡Xŧ½áܨóëú¼BâþñÑÝ$_Æ¥²!;oŽ}/{Ÿ;XÒ åj °7”KG7ìÂ%FršãÝoé%ÑOæzã”eTZ«æÁl-ªâº¹r‘â+|(%3'[˜;f_¥¬IõÇ`9ÿîá'Ô­ã·P3[tÍzátìh¨4´øÎ™cî-ñóàÿ;+ù´@W~l˜<ùcÌ'¤£è:åñ1M˜Dœb«w“]Øß›ÿå„ïÐxÕÙWÙµÉxW†låo£ÀÚ“«/‚"±¸[YTbî乂‘ÅóÚåŒòˆlhàíXX¤aXw"rYìÈD©üv¢‚i‹û>V1‘¼\Z${ ¿Rb Ú~ƒó ·D#±Y¬ï…I6žª®‹L]`™ö²S¥ú7Ïd3.¢Í ¨ÕŒQÌ ·PJê[À}*1<ÞEû±ƒ{q¦&›¯fÚX€« uà;l )5˱b[(õE¿î*Ó#ˆaIß[™~?µgußÄb‡ä”GSÎSò!ÌJbà-B™¼;ïŸwë²['O á!ʲàO;G’Ș <Ôw[v³¸­Oº4l†,TahÆX“RézØë/cb+n@1ÝFf~³'FB"‹"7&«x[áFk<ÖøMl Œ í“s.y@@¾h¶ïP}¤F[ÿ{溈j4®ø¤dxaX6Dˆ°5u`©ØiýÕeÝôƒ¶–Ki8ççC *í,ñI ì¯öySUuÏŽÙëyA†ØŒ~bÉI.N9EªG—Ò°£¸Íuq| ÞVaB‚˜@àŠ¹¾²ü }õeQBûÍ/ÕÙKyà%à×çgÜ“xØÜÏÆÇ_çñ :_¯îŽ!BÁs*ÝQ™ ä•/0iä8 ³s=õ(?:UÆ_v5~l§qc¬ƒIÇk3Ó+Pµzxeö>FÃ~Bø4T¯QÍï ÆDQQ#YªoÊ'µêxmÊYða$ ¾nŸþõçÿí²]ó»…îõ%/Hž5è —G]aKO0Á}^Š&L´ŠXƒ œ`Áw²]±åKì쮬„9„JøýûÛ(H|µŸ´åÙ€BcfÄ\3§Fe¹íIÀQFO³?«a{Tnße ~ Òa¤”¬ijÅ áGw@ÁCŒ%¶®‘."¤.WØNFƒ´Ê•+kÜö"œÛvjE¦­ U}4|j|´ØåÓgmùÊ¥9¹á%úz/]bµªCçR_K¤¿`Yc:wÐ!Ll;N.ÎÆ‡ÈŸqTfè0K:úªêw´L”6 ^´ús–Œš:•nÏšW÷$•ÿRÂüp°Ò¸Px™¤!€·Wg(Çù'Ù#¿p¶‰Ã Á ðÞµçy6CFË@Ö™Í"œïµâÄþtin·…b™Ú‘@<é}˜X®ð8?Ƥ+9m#D™®¿kC•X€¹ˆpFGb_`Q…LßW3Í-P¿ZŠL0”î¦7¥¨Ki¤Üç¶íŠÞ-¤ ÐòÄ´_Û¹äa°J+{(—ÝÅžH¼ê¹(1îÉí4õ ¬®9½a‚Qâˆ*ù~¥I[Hƒâö¶Îï·:G±ZLBÆ¢ÓÿÝèÔ••Qö«Ëu·Dc9QÛ¡MÁtìºúãØ$mZñ÷Ï!üˆ‚•}HÖ}YC§^+òåà^V LŠáU„ÙÉ:¦]Š "3tƒ–Ї)xÁÞ®AzÃö'¤„¼g'üh7×X@ªéö^4K3Uö¥I 쎹–cóÛ*;gëÌKjÿØýÁºÈ›Èð"S(­µIRÎ#ÞvX¡ø´6̤’zºÉõÀi/dîèÈ!eðo®öÃÓIlÌ"Ç/_vX8fLA…z̈ë¬^¨gašqmÓmKþž˜E8¶ÅÏ>ö—yÜ_Ðwi¬‰!{ér%Ô ãÝÛÛ¢·À‹ í3rræO9¹5,žyîlÞiÇ‚ÇLrðñÞ/‘¨´b×jG!à–ǼïÆîÊŠâ*ò—4pÜÏRœ„ׂkúO%(QàúÀ÷[—«Ûqò¤e.“[Êÿ=h® ·%"ÍR¬ ©ËJ9 ö»–_xk5´¿Xx _£åútº¦ƒ  fÚb {! ›P0‚+×¶y•êèM—ÙHL%…¤¦Â¹úÃOΤÿ2$x’ì¯8[Þ~hmí?‚sÖBåÛËË?¥XSG,JU¢òzEÖú¾0ÀN®ÁÁâ“[M´œm OXšNûœ—#œ(mÆÜEÐ×íb¢çøÏkKÞÆÂ#ht…D%…ìPÁ‚ŸXdoò‚~ãü4{dSè°g­YÓÕ¶Œw¯ŸŸº²{£"ã@eÃ݉½åÛ`Õ|ÒY`(ÄÖÄ€¼ís]¸5]®¬Ÿ“£VNïö¬…Mb=ÁÏ,XqÂ}à-£|%¯Ý2y,²²oJ¦éqUGÁý³K^šF•¡ˆ 2æS‰â}«õðvó†Þ,`(Å>VKN­tjÊ?‰z±9I f%*pXÇØ|rbb¹#²#T‹)“Á6–*ý -H)¼4ò$‹··çª¿ÉÔöƒÓ©án% îtÇWpÍVÉ’µ¿«•Ýdƒ°ÚRe¨Gÿµ2<ì›ÜN[Z¡à?h"O<ô¯;I>$íüe‘ýЖºªe°Áém³Šh?öb„)bÎ|–Ò©›"˜¹NOò’DXt wé c­%€¦lœñ{53Í´7ÌŽ±K‹noÉ„ny®“Ón©&4Ž,ò*£ò„ ›[*‹ŸÉ´Ð8 >‡ôE¡ÞÂX(WѾ䤲 `†‡äú“]ŠRxS}ê¬xKp;ä ¥óx ´™1 ÊËúˆÝ/f„J”Ž›l²ï–fÒá³å:ñ VWö™\–‘:U˜.Ö÷2½×˜öSR1 ¾üÕ¹Ç@>=×í¥öÃ*üD†ÌðØÃn¡ ¼Ø’s¤Ã.=86á/äjÓoÉGhÒžŸÙ¿2c1¬ü¿© —ÚB ÍÁœô^Šcz ^ÃYú‡‘ô© ‰<|:ÆáUÈÚ™cMНá;[•B½Î9W1˪˜ö,«¦o!ƒ<°È\„ÿ5ûHæýžÀ^ æmIÚt ú/6ÀøÀROüòSáåk‡3 "Å<^Aܾví6V¡Åã:µ±—ž¡üùªxû¾G¬œØÃXg~Ç7Šì]öu|(e5ªÔ‹ÜØ›L{"˜(°óœõ0F:fš“ ì™Ï¦xr5/መ{–iñ'øhtŸ´ôûôkýdloèÖ_ h7Ó5Ç3¶é±È‚Ädª¢ÓÃ…ªArÝÃi[ Ò¿–{ϼýåå¼cxgY¹„KŒòi|^ü¦Ã­r×x"—šûiàhk¦:¼ Ic%I·Ê\²(T_ùÎí8¡æÃøüH ¥?nKng3Ïj—ê¸×‘è¾®VuÅ…c?üôîX™ª SªºÀãù‰}±öF´â eçO¸<•&º`Nت˜)=ŽÓh•B ÅÒäÅʼn';fT„ÔÖ¡päÄ9 è“ÉÁT‹ò©¬ªÀÀ>)ŒÞ/ýùre" ¨ýJ«2HÚ Of@'jñz[öž/-çƒÀÝhŸ]T%ï3uén¿ñ9`véÑ_-ÊSB¡ Ì̦BÞÂðδéa޾6àåz/ãÊÕXj²ÚAä%>djamß7¨¬êPNTÄ{çld4†!%~·dòÄTâ#<Ê–ôsÏVúÕ'8à¡~ŽÉf55‰bÑÛ­ò¯uëÄÐÓ8kÜ<)¯e›Ìaðc¼ u¸& $F¥#yEs¾ÕZÜ+Àíúïëü šgÙ²¾\—*á)ž1s#–é~Ö¹é"å1ØË1ƒùÉKcµùà}³ÑzˆˆŸ6Ê|@ìñã¸ãÑÇÊåF;+”Y÷ ¸lþþ¿òmÐ*l¢§n¬#Z2¥ i ™X¥mŽY㯺.NÔTÂÒ­PÒµ/½Ô¯¨²ñË FõÍ#„ÒãÂplκ쿒Oºª¿UL’X韤jÒ݇ڬdI˜:Rߟé»ùÎHH)qkû½WÖ _£‚~Í®îï–ÚÄg$ZÞœ-‚ÀçÛ¼cQl+ÖŒìzü³ 'Ñ6À@V¤8=µ7á'Ù£SfAM…È ¢1Èšóÿuå$AÍ åÀy÷ÎÚ=ÔˆÄT•ŸòsM‹¼k~ñgÆ)ÂL üÎÀá%‘{QŒ*™¿i´¶J|ytX¯k:ø­6´»À¦·Œ}w­½º©MoTÜkÍ­ÀÍ®jÒÊzbþY‰þŠß‚÷Šeö]˜äÉ™bY•quÛÌ~†®äîc–̨¦®–Q8dv¸òè½ÇsMÓÀ#Ké¢|<¹\ûÛ\þUäP½Œäà<ÈåOrgÇ^“=h÷€F 1…•4îYÞ†L- x{#žVüo1K¼4ÉrF­¢W{œöFUøÉJñ8™»Ì9-¶‘¬¹,Bõ8Cc²ßœmfëPÂ':#"“œÝ4‡V½Ílëp×ÈûL£ð šp-¼eÀþ8bÖr-a$3g´ðï© ÐFCºª›Âsz¡_?fNO™}L¡Z½u3Ö—BŽßšH˜.AY5(ÓzË0 ¤üÎcGÔA:± $áAÆ .íŠh;<’Ùˆ+0Yj²¥ɳþkç  1¡ÑÒ¯,=¢l¡€ëè·¼­é ZõPÖÓZÓÏiöÁÖb‘};¶Ç7¡ÑaÇ}fÙ}–áq¯‡Ä¸þ ŸÛìWçÕ&QuB´ñQw«ÀÓÉꕃ|F†²­‹ˆ\hñ ö#€y]Ür‘Ñ«:¡Üé»Z™Ìl;«vµõõ/â”uñ Ñòb2îw¶&ˆÛ§@ßÓH ý^G‚“¯¾®³÷©é0†<ãdÿ.°0xÊ•zž¯¦ö…\ËY•ñšÞÀzèŒÐ®½­¿ƃ·03ì‡4ÒUñîÅ+…©`#FYåw}õÌÈé}*¥!¨zS#³Ji5µ€…dL°¯úSšmsô:«#®«h÷îo>•â‹Y½ÙvÂѪÕ|^r|½M”àZô4xæÆÙ ¥æµˆÃ¯Ûå)3ž-;ò=Ja@Å#cyG¼ƒÿZP Æ*ÊÎÚ|Ùó QתüæÀ\íÇœ8$XO [3þ±d¤W:Á‚㔽Áƒú)΃1’â¾{PV] rl¤nõžpÙ–8i¥2‹yn3µÍóî¾d ¹ÜùHѶOÏÞf³DæŽ'¸¬¨J°[^àç5YWèP¡¦†Å¥É*í¡§ûÉú†¦YœÆŸfbgm#Û×|»™Ë£5HØ3}]i¦î°˜Ñç|S®øSç G¡CÓ5M Fa’“0Í…4„Ôõ²t1%0 ;àv·Àa¿°Sd¶OÈ·öÔ~ Œ¬E'oÍ*RŒD’×ã´8ôçklž¤•œò—Ň·Á%e8ÜΡ±üàíf¹š3hhÁ¹é ~n|ah4­1à ¬âáµ”áïp”—ôwåFcb܆/2JwÅ JÍMyw,R!\ÛRþNÑèwÙ{°ûÇù/š+ð<ôvQ§µug‰–a—î.ú;«Í‹•y¢ýláFVcÚVw¹yç—áõcûõ–(Bí¿nwL°5üE™jþŸIXµu?„>T3ÁMUó~fò‡‘FUî5ÓpYÙ± ?9¦†RE/^±3°!mBÅnò¯ëÚoÍôy…òÍÈl”¨Ú.¡„"ì8Ôä¦÷²H1®/ì5ˆ¹PSê ‰ÂxH؈ˆU»XÒmÎÆÂ²}}¿ß÷évÂÚ Åj=cZíÏ‹r×ô¿%€Óc1ÇÏ3vØ sÓVØ÷XÚ& $Á{ãu°¿G£šžÂ­Ùqë1)~ÒUªî9AV…]ƒ„žˆ ët=³ë)/% ëb+D·^Kè‘S£IàWìÞ‡¹~Zª¹ Yb§ÏÅøàšÖÐŽ¬2IHʳo‘±ÄdeÔ”ÚG}ä ¾é½‚ZI?†QMZåÆd8)Úýˆà­LByÄ“GUd¼Ó¸.ð¶»4¯¿ŠD Qi@\iõ9;†ĵÎG|213*IøAg@°b´)”¯=¢ú />zˆªŽ°P渹<žäG§*÷ñÒó=Z(7AóÅÁ£—¸àˆ”ÕAÚø G*[Ñ‹ $AauÙ· éèzPH•fÁê8Üæ$ƒrJ‹®–¾3oY•ùe1Á{[yyŠ¡·¿•.³ÎrjéꦼB¤qì8»úÄì—hÆEF»É?ÎÓ«²;v†=½‡q[1ùk8)Û.Rð”w6@6$²lÃÊ]˜`µž¢êî–Ÿ‚ÓÆf§wñà Â/tˆ÷ž9Âß³º&d‘¼hdÕ§Ûnv¡ÈûIJ‘ßqzá°øù-ããF1úwåŒÜÎm£.×à6æ;âíyQˆÁ@à÷}W\klçsåq.Iõ<É$êëÉ=JŽãdŒ¤ÜT²"F¼õ0ðª‰hÇ/r µ*”›ºeÿ¿õ>%2x€ól;d žê «çŽ øÓBµã}VHÖÍ©³§ÄæÀ ­03Ø‚Jâ°Q´Ržfà_r:˹+m;¬ª†ô­jÕ¶„Õ×T†÷ç³Û¥{ ë¦y‰ØVÍx?ǯ¶4·gAÕ€×{m  ½o}¹A›-d^Üô··¯¸̰Á}­{àÆ¿+^.æ(ŠíJ.= ½ÕWSÜ\ÖŽ©LÙ”†ã›Rà­[V‚%4ù#ÕþDqSMÚ)lÌ#*r'Ü™ô -½ÛHši–X×s˜ªã>ÛïeÛÍÿÈ¥-/6ZVb”ÜÍœ…ðÂý 2³³ÞòÛ)J"¥˜Ô2›ÒÔw“Vqs!ßÇkÔzñÝùV)Ñ 6GG b3t ¯S,uÊ^°¤uâ¢Í duuºc2‚_ŠÏRÑR`gŧ¢àÀdL%,ãÏeÚmE‚uÐùÝ<‡hÉ·£Ì±Ó£—†–úr@Ϩ÷gúM’mýA2naWº?„d"i›‡ìH¯ § N*’§„‚¥d÷Å™_Ë;Õ/ù¶‹Af›JOÿývƒgÒdÝé£(\œóoÙx-@%y<ÝÚ§>%µeÖÐÃ¥rë§Ïhwuk†¥™OµMg ‡‘Ëo2u;í"xúØç= }ÔR”®Ð]W›¼Ð.¶ÊpëžÍ·–¾¶µ õe²ð¶|Њ‡¦¼F̯Áêþ °î¶}ñAIÜ¿€ù”2[¡§]¢öå/pÀ:3EÆÛ#ù¿¿¡êFQþï;ƒ´©mO'ŸÛRä§t²7ÈäÊ;FÄb»ÞÛ”ÕÆ!½MJ2F\‡]¦ mòÎfC>p ÷v,½™.ÇŸîŠpLF:‡øn½yÎnï*á9Ä&[h9U*<òtô…¾r[Õ?ÙpOC‡.|‹ÎFÙ u6åâ¹’ž›ð1ïUC©„ÙukÙK¦ŽîF|Ö·.Ä„-/~Éä2Ü :ÕºÈË é8l‹Òæ-ÜRÂ7m&áÆk\&À†p7ã ÛŠù»ºÆdÕüš qRÈGKA!NépÁ9J‰Ýw¦4yáOøuZµ·Òvìô!òµya¿óŸÀã×½‡‚ñ3 Èa0÷ÊÍ‹Ëäíó4ǶQVZ"m8ðì—úŠa`*6l'í·¸Zb.Büú›sÿÜ©.€")ˆÑÙîê‘Ê~}ëuRz¨dTeáÔv~O€nµ‰±Pcµ%̧Àtx×G _laÞÍ¥>clÔÙ–b,ÚÝÐÜÙÕàÏÓ/ÿåÄ/u;&BœTwsáe¯D¥¬Dýåý4>×GFLŸÓ:ì"ëØÝUƒs*|éÝž<.Ÿ£ì,Eïá<§a!Pyh.(§!úóFІ1Ý#ÌÝZ¹7Àí2öôÃÏ¢—&Œvt}5HrÎ";”ð§ó×áÖ,­©\T¨‰ˆÙ„Ÿß2ag$¸Ñ¾ÔS¿O0 ì±3¾±ŠpG°ß e2Ê“=_FÏzt`û)|o[";äxÓýƒvƘӬz,joF+údÂÈa-¼²»ˆšZÖn®¯G¯Íô~-uîʦŲ¿šÐ•n?T˜¥Öi6çPÇ!ÏÅF¥nÏRÌÔŸýÐ[¤uSƒ~ i‰Ê4wK:Ë­Ì *ÝsåDª6ž¢žÑ‚®›ÞÀíúà&Al1¿ŽeÐG¸)‹ÀþšW`£$éÆÏÆ2¼èãÖj_J^ô!<±º®ÖpÀ·å^­#Õ”)%ð3bd %OË®k…ó(¥¤;íü‹$致̴~cFàÎåÈ?E]3ÇË"»â­"ƒG·^‚sÂá s°Åi¢Nbë¸båózw;KÕ†ÛµKV_¹=Gë/:teãÁ~×ê>Ü1¾ zJ|@iš[÷>'{Ï-Õƒ…ßqæ3.ŒËg¿ä9:{ea‡*¼Ð×:OÀxÞ.ø56 go XœÑìïÌ#ešz÷ ‚.z`ß S‹xÖ¢¥ÆÇÞ#«Í\‡díRµu²»2v²K88’ý+¿¡[Á‡ïL8ÍÏšpS©74,;›ÍPè‰6r¦}V}sføÄnÈ‘àAë‡?¿EÉÉV…P"í¿cõ ÕÏ.©?¶[ñC±ÿ ä¤×ùQ›ŽO¬¸ú’)â_žã—ô[—ZQê<1Tá§ýÁÏ©ëC/]âé\ݪklG€B·á­­D§ cŸ`·FŽ–_){èÕûå|dÕfÒè2”ĆÊúyD~„ˇšAº<q´ª ß‚NF?„]£-ÍxéÂ?ÅkÌì2†9e…3ÕØ¢Pî$wb"þ©ÛÝ“¦µò¸ƒ°”RÙt—Ì¼Ý ­#5Öiͽ¦~ª :·Õ×ö}éâ2¦K¶%¨´‰%¨ÝCô¡×»$fWøYvsy÷ìÜÞ}Žmf¬ádÅ—@“Øäï(VýU}kž®“î¾J¥ °H³èSK¹c9P‚ƺLÌ/8ói.:ÜF¥¤¯ ÛH <–BA¼Ü•z3®D7‰ü‹ZÜÿÛ«»óÍÇˤr)*Æ‚ÉúS²öó¶Ä`÷"à„ ŒÛzô#ùZX5oxFÖ³pxÍe«ô¤Å-ZdÚžY!êk¢/‹~Íé¿ñ‘ŽW©)!å÷ÈQË«Xé‹^žnÞzÞ½l#}ØuLЇqv;yƒÇT½òS#mV ÌæpúôU5Ì¢bOJ;1òj‚yØ(|òu5 $˜nÅΚ¦™A¿•VáPY¼÷¢t`oΩ 7ù¤‰Xš›M‚ÕšïeƒQG>}qt~ !“ Z#üd‡ %ÓÕ: _œ0l=]Û°qÚ Ä$T¯ƒæ Á U[ù8y¹ØŽ &Ÿ‘ÌQÜŽØÏ!ú’&ð­p>±ÈáþM”ʜв”U¿•ã?ÿ ; ¢TϰZ}ÐàŽ·Q55¡Ñ£iqÏœI„ÛLžÍ\æòNæìT¾Ôy™ÿg{ÏmÚ‹¾©8‚Õ]â-4–úMô®£aCa~"*,„Fĵ6?²³åõÑÜþô72eJÂ)0NuÒSCíîf´„SÔûɲ½muß3ÞEýLÅU¦,ùtü0J nvj–ƒ±®p;k%RÍ1#*¸ AóhlUÃ_RîdkÑ!ΔÓïx¾Ê¿3l5I‹ìà»ìTmXB0ãþ+ý~q 0(!\»û£G_ÄžÕí5¼Þh蹪ÙÙgÃ$=wW\¤JÃÍtæ×[^mˆœ#Zç¡A ï¡^z£pWwZ¤eѱ H¿ÞRHj“An —ím Ñ‚˜Zjœ—è`k×fì28ý4:’40j£qƒ|z%vïÃH÷ÓÊ]ä…`º:¯¯œêSœ®iØ4ºø}û–)&†ƒü,ESðîµJä,>z̳´G÷Š~@jã›ÄqyìéNE#¹ÿ.©ÇÜ-€ü Y·±!U@¢¬c÷–lÙêF/Pµz³dd;wÁ&£ãÿIÔ'ýÿ}Ê“œ:b…ûˆt]š©#(â°f*"NJ1kÚSHTÕ®æá|µ(–8_IJIÛ¿Æaiõès™”«ñ§·. sx–•xc_Ý>f¸”B·ã=~çàz=tvNÊþõ‹yUùW åêÓ_æKO>œl<‘M5mx¿XÊõI—£‘@ë>WÊë盤õ˜I«xøW“ÙÏÖN¡9YBìø@N” f—ëŒ@½-Î’‘âˆzÝ–ûí_y`çXÎgøø%‰BöµaÔÛ¯¨éŸ¦™0ƒk¼Ÿ×ª.‡›žEr“YAS'A½Ø$#&ûûõ°'uxò¤Å»*ÉóêÜ–‹xë±QÌO%¾f Çã^‚Їd¿¸í­ær3±èÌ–É!]íâ·Gê ç ùN®ùC­ìô{å'£Ü‹~?#²úíMÔò†Y—Ù=Ç#’ù´vWKaƒ°jËÅ|¸gÃèG|¡ã6%?ó¦¤ÿyƒÑžk`§D®ÞÙ#Þ±z*%†·šD\ˆt)ãw…¦ýa‘ݵuéÄmE¿ÃcÌ^¯ÿoîiÑ^…1›ìýÆœï6{…¤sŠª£[‡={ŽI”zeÿwOe5^…AèêV48W:†ªÔn³£¿=—¬Rá±¼âg‡’ø¼›ƒÙüÄ-rÛ‰Ø :ÉÝI3~ÑNß9 Ÿ¯Á‰;ºˆg }j²ì0aÝOqʶSd†r…~nÞø/:þkmÑ#²¸MÖPY}®PÛlS˜GhçíâñLõ[|S?WG`ë§¾,"¾’r‰õŠÍ^“GÌ’M%ìnû‡[9+„Ž(†ø[·N¬»Al渌[œËÿÔ„ñœàª§C%árŒ‰OÍqòßOd:Z'”&:µ¾Ë·ø‹ålÈÆvܯ&öOdþ}´7ïykáȉ¥R.@)«n;@>F•¸Ì±ì‚`3騸HÞ€Lð]¯ºhr¸Du§Øççy®›=×ì }ÜMµ lêéIf6êC‰9š¿R$-)b³/âÂ(|qiµæ;ló©ƒhÇ¢ºÒ8’¥5ø®¯H ˆšdÓÅ{>“??Å)гµ rËD àcrSÁ,™’H0û(’šºÕ4ñG•3Ó­ ”,¯do?»ÿƒ*× ¸©}¦ýǬHà'{z™ëø.sÊW…·uK:1S4 Û)—¿ˆ˜ÞŽ ÃSÔ´# o\S C,È¡I¡÷u\ë–cê@ò^Lº¾i/¬eÛ±“R¤Yn¯˜<…¬„E:`ü?ßL–hBáÎÑÿqoâ¹±$q +·œÚ~ +<Ê™*$°)U®HØõë’á=–=2ï£ûp&q(ó¤JÐp:Faó°ÔžœF ’sU¬Ã)h.›@>^î‰z~ükøÃ(‡Øß›É¿oeŒc±¢©²„ ÑGÄSéyf€3ûµlq ¯K”™5 ¡nÀ’c¸Yì3ò,ì#O5r;¾YHl6•Ieêß÷*³¬!íšL£h”ÜV>ÙˆD·¸¡¶}|û—mϸ|…Èß×G;0p‡äðgÒåý6`%y×3fmÞ,Ô"sËâ9·>eð›ú<ùç£Ñ9î~îÑ/ûòø_'\’#¦1eÝøÂN*T¦b ‘d—‚/sªRa¯¦šj\#‰öAw’LG·ÐÞ}{'±óP´•v[„±w«ûÍyÜø [ ѱØ@Ž ªŒ¹ÈUÙÒ—ž$MKúT”ÄþèMâ²ÜŽïøZý@Ô4õ×TÖèºNñKÌ7!â>d¤Qe«€fÙúV£‡¾ ìx>EeÜ:â3|Uœ,U¸òO˜ÀŠ| LÎu²€%7F{sÕÂí÷<¾YÒxxlÖœ¾ãKoçFðËY÷ßä9L =äˆÐ…ãE"G•ú›t죶IÍ’•þd= U ƒO+—Ýûè.„ü*šôþ%ªÿÅZm,÷ëˆbÕ°k}™qZêÒÒ}èaÙª7òZq»7gš¶b­Ô¹&×!æ— ™þ$°‡­qBŒ¹Ž©s—ä¥)¯Å .K/o&7M½ÜG÷3$š7 œ¼ÀPYšL®ñçþlAA¸NâkáØÄoöÈâEØšá1‚‰þn¡dUÉP|=Eÿà[ÙZwêbÙÊ@åh³ñ}ÓŒŸG”Y×§¡ªŸùA\œ,ìºâëôY$_C½_鑃˜²€ÜU«Jh„Mh1FGY—Jœ½šÍ‹·PTIû9¼¥K –ªa/‹ŸaÕ2tB™S,ÆÁ¾×ÑÕâËDtÆ–4õ]o%(®ðÅFK2Ö¯âs¦-þé(8}+wyÉ,Rh|±Ä¾AQÊØ¯X fž~Ìý„ –qÂ?flj&¾ä4=%ƭ㋸Dˆ{6~ñ‰õÜakÄq«EƒÒô.*ÍÒÁßþªÑ7ÂÉNaÎ0wÚ u†yvîÑ»‡iµbµ+bŒÞåís*Û¿É×|žš÷S£o´†OO¿ÍR ,2Uw;“~¿*®ì³¡}x%ò¢Y öëOE£ê²1²Õ²]0á°ç\À–•‚ç­8Dì¾ù  Ëµß‚ŸM h¼‰ž6¡ZÕx  1@‡e;Ô@‰Ì[`,ÑÒ$2ÿ[œT éðª¹nŒ.ôúõÑM± è,Ä9f Ü;f¥AÙïÄú4€Ôþ1é^ ýÇY~¦%k¿¼>dumŽ©ôË˽àÓn¯Å¢+ô={[p=ÛY D„<΋b‰Ûynùc²Î4‡³)of8±[:<]¬á[¢’£è!xV¯MŠO— "u^¶—îÿu¨ªu¢£Å­¾×¬›g JÔ^Ó¼q,í0)ôž·½6ìÕ°·„GSpJh›áñíg4]²Æ?B룉³y]y‹;¦è,2ÕFðæBYõRSÀÈD|bL'÷žÈÕ…²Ñ”ö€¶qDôW©DLÕ>££gƒ«ûåbyj‡‚'*‡xüÞ×÷®b„¬©/½~8VêÚ¬»Ê¤º¾Íj%¿ÅZ;¶z¼IGùQOÈ1œ€sAÚ­ÌÄPEË®Š:½ü4zð÷=ê©îm ù´3{g‘ÀAÁDaNOôÚ0óð  ™ÆQtþxy¡$ñŽWxõ”d Iê™{NqµÒ #[vD$M´‘Ÿ$ÃRE¡5‰)•F_»K 2ÇTbmÙAÛ¤Ø3a(ºí²4JÕÌ]r¹Hž±„Þ3§DSËû'ÜŽê—^[›yÍRΡ&¿WëoŽOÓÛ}MGn,·@‹Å’¤2-¿©¼r7ÄV„Î ¬ÁšB[ãg“k}&aW zu .?øY g‚¼Ï°rv†¨8.½54½ƒ›àÔ=F8¡hñÇãÚ7Ž|Ûê”:[õ0dÀ¡Ù-»©çY:W$pŒQ\çsl*W›ªÚß]¡«¶t”¯ä1ÛÝ0K³ãÎõå°ºUÐÆÑ¥Ðůn²½rk9& JÂOïeÁÔÍI9(!àLß{ o)^»îCV£ØƒrÛ×¼ßtX%¢èä“õõ½vŸJQCô]þ)2†/7ÆTrXøLM0Ÿo«âÕ¼+QÍ é¶O ”Þ{s•òT-:z+¨ûAl´Ó: û— «wè¢2&¶f?C:+µ-Sñö\ÀCl¶6LñR®‹ª6áëQ=þ~×/$Aó% ¶}³û6ßø•¹m#{CEg¸4Šd)ÑËòTF©ž^îÉò^kâŒÎ5Ý@ý3 |Üœ#HÓ#k»ÓãÊTÙô³ë ÏÓZõ¢G7O–·dXûH,¥¶ÝÚE ØzѾ.ößOa\ËeBE•È·_É{”ÝFÓ€öH,³Qaú¼¾«f#KJ€?©O¯fu—«CJ~×—¾½`‚Âh—åë‹18mœmMîå“Fwî‘-éo¬£ Š3ö%èX‡²‘Ot h¯IËW~ÇR …‘U„jMªŠ¸rŒ)襎©‚b do¾¹ÛŸéýfµÄpªgŽ´Šš¢.; hÒSÔ¤.äÜ#«ƒoºü3UƒFœTL2=oek Ï?uÖÿ–Ey¤ÚíVÎAþ¼5¶ÜuGrq)áŠÞíhÉiÁ\òI!—TÎ]T·l5 ²ãÁZö³K}#b‘ȳ?(ðyDz’Í»*/¨]&~,Þù5ÿ5®ÃÑ~¦¹¶UDÙ ‹Ì`ÕN $N1bùvÊ h‡ ÕËkhÿÙ!44hú°[S•S-þì$— !J*#ô){ÚªÈcMíêzÈ"1OTP3Þ‡Ø OccAÔ%«Œ(΂# %T L$|A”"eä AnÃÒ¥Ïñ“®œ[~™ÌÖøåêø ëZªta±ƒ(‘|Cù@l`_#<ûËär¸ À˜Ci °&[‹C¼®88Aþ?ñ¿Ü¾¿aR,8â$ùÚ’‡0Gª²ÕZrsq2 ¿ñ“½?ˆµš5öm³m4à5}êŠz®]ƒ`mNˤr|àP¦5?¹5XJØÂ…ð– šßp¡H¿\ð4ž¢EÐY‡ˆ“ ½é99Íå­ vbùÜ{¦[U—òŒ#ŽI]¬xãçfÔ(73§ ¥³nÙ‡ùÕFeÅ»:l x‡×5ÞÎ`ßæýÈ@És&”«ª”$…½æ»»…qc·«ßWà[²'¯T-³•“¦¿‹2­úÔaœÈµ¦½dÇoÅžš†>)Çy£€ë¿åö£CòG—ŠÎÑQ@n/k'CÖ¢7µõƒjq2zj“hωÍÈürÞ Ýù.à¡JÔú(IIù¶ìt4ËE,«ªHÎÿÄïºyÄLªFêMüƒ9þdµ<1œäd¸ ,¡ðÕ ŠP¢‚òYÂ*ß1R$ºé $Ìg 15ûÄÌD%ŸÅ6ßJ Ì”d³×5~}¶6’k§”Û Âq©dï¾Y¾¢}ébºæLÀÜæ7ßG5ÌçÉÓ~®°¡ îÍß%â½~`ÉÆR¢«ßò|5D!J Ô]äÆm÷®ÚÛ«—üÁxƒ-ž†y+• ?Q´WnóÛ’Y†A‚¯šïŒÒ:êvzÑv]d¢õ/_Zçeã~9µ…ɼЖàäÁ;¾ Â¥ PgÅtâVåIðÖúÓcT}ÔãjûÆURqt}r]Ðò}‡±Nj&zĨ=ìË—¯.À^¾épÞ™'z9÷˜—3úOu(múyƒ­é(Å…rõÁE%$öè¹ÿ~cª’na´ÎtáÕ@ʘšcË åó®÷±Ahµæ49yÇ46B–`Ñòò%ïCÖö ‘Rä`j¥×.2ûäˆG¢j¾‡û\¸$}mÝÊ'‘ôúçê½K#Åiئdu ¿œ(]Z1ÈûE£¬òšáázÑ5ÛÈ=ñ© È–x 8¶ýû#€öo1ÍKÝ Ë7‹«óÆŽ‹¨×!7VJ»Ï{d÷ã_zf™È¦¬ßçɵ¤! ºL¿Ì£m7QŠÚ•‚šz­œíh­+ôRvêpeÌ“*ùeÍ\ ¦¸Œ¸Â+½o/2þü ¤Üh½7¹æ¬åaÛ‰}Ùdçî=ù#¼¶1dÂýê:¶ž„aC‡íÁ3kânæR‹Þúl©òGâÇ¥’ÖJ祉yë=“¨Žó\×Ý•!ÉxUqBÖð©g¡¾·6”v¿3Óë’5ÁâÈBT)Òg¢S™D­ £IT1=Ùé +e„ ˜?cCÚ]æŠ[AÿJŸo$~x{[T¼þ:/7´üQÀµhZ[J8gáL3ãñkŠy7«ËÇâ…QNZG¯œ! ŒŠ¯ý΄å'v•„Ÿ¥n¡[‚2Ú$«Ÿ±ÉP2Qú!†åKSqþ眹Xƒc¤žmˆèÜUÇ„ÈFþ†Ó|ùÒjÅD)´ËFYݤ jqx§c¡¢7´!¹HO‚9÷_Vë°Ÿ=ØlHF@Ï‚q67ÅPôt±rx+pvYîÜ›JâáÇ—¸dy‰ø9&K ÍɳÀT›Ìw¨+ju|xÛeí3ÃÐmPj]7šÉ´“Ž`R$*“[Âw“ðòŹv´¬Ž;ø×õ´ùE« 9ki’Yâ8xÎndœ2‚ ¯3ú¼,'óÙö³¤•ÇH„+h¿îG¹¹ û—tQŠ‹®´‰ñ9´ Œõ!Åá¹£G³ °ü¶4dpΉp¨äåøi—°Ô”Ez÷¢:¹bq1’Èj´Öñgƒ—jnêå lQÊ·ÿ·Kãú°Ð—š²¾ Fb(ДУóœërôqƒæDÚj¾ÈÝ/Ðj±‡ø8ÉùóT)hÅ>ý¶óMg„bD>E± Ö\‘s|S9ÇÝ{å ¼!€£JŸ¦´„ØNrÕÂö÷«ñøyÛô5?´9ÄÐQ§¤åI¹ì`^ütq¥$8†R0%ʬ!Õ݈q¯ÚÎÉ÷7v¸ÇN{ œÃ7w”ÖgÝfT•·¥Ð ×8#Á²8 «g¨™x ~x½³G«a ±'qŠÞ@Û%¤†Ùº%IxF}ÿ-¬(äOm35‡YøbÁT­€G´"fG2‡"eÌL¾,°èžÊíNÌ_ÒQ|­Úrð˜K#sï³h·¢ ô÷ê=Ðî'‰íúIV7Aô4ýMxJ¤¸A50Î º’ ­†„@DÚ%k,ùÇÅ£k±&‹2Ú†¾S;EJ¨Øþш endstream endobj 262 0 obj << /Length 866 /Filter /FlateDecode >> stream xÚ}UMo£0½ó+¼‡Jí! ᫊"R»­Újµ×œ.RIý÷ë73´»«ªÐóøÍøÍÃØWßžf¶vnÝjõèNÃelܬü¾=WWÕÐ\®?ÿp®uí4{ºSãÐ<¹³º.7Õ¦ïÎ7ž¼é›×Kë&Öç¤Â½týë¨ëg÷kæš]g´Ö³æ0;]ŽnœÍL#å¹;¿zê,å§ÔgSŠ ütã©ú;ený¼¬û¶hìÌEœšOr÷]ߎ¢Pí 70¡j»æ,#z7ï’ŸÞNgwØôû!X.ÕüÑOžÎãé½ æ÷cëÆ®Qן ô„§Ëñøê Fé`µR­ÛûºÞ—ÛƒSó/º~g>¿ ilXc3´îtÜ6nÜö/.Xj½R˺^®oÿ›3§ìöwí¹ºö¯PGù*X$›¦D F á@ä¡F@k} ó8®9ù@FJ•uFFž#`R0J¬Rq ƒeFÅ)kjBS` F¢5§Ô(Z#¥.9€”ºB€kxŒö§>óÅÔwó{;ŠE^ kC¸X£q– pD¸‚ zA‹etÌñ 8alSÎM3Ž?çÜØrNë‚×%NÉñ¸b¯QÓDœ‹¸a á”8š>ûÁÃõ#h0\?Ið`\~ŒéKWcª³þ‹?qêcà…ð.\„´X‡7ÑŒÑO*»eäµñÖzlÃë,d mYÄõ³ã50ymÈ‹,aŒúYʘ8÷ ™xAë’f_²‚14g%cx”UŒ©>õob쉬f 9ë±nÎúcðsÖO{(gý1ôä¬?¡\ÖŸ ÷œõ§Ägý ñYg Í9ëLñsÖQ.ëŒ(—uú±Øg‹^¬øŒ­ø‹ÏÄŸ±–Ÿ±/­øŒu­ø ?­øLñ½[ñú­ø V|FïV|†oV|¦úâ3ô[ñ: ñëâ3ø…ø ~!>CO!>S®øŒÞ ñ™øâ3ñ3>ËY„^ ñ½â?öa!þSMþW,Õäÿ¤ :â?8¯ÇŠãq„G“Ì湪–ŠN$Õ¸dÞï‚æ2Žþš ›ˆÎ}œø]ïÞ/«ãpD=tËM-F÷uðÖ¼æµ endstream endobj 263 0 obj << /Length 867 /Filter /FlateDecode >> stream xÚ}UMkã0½ûWh…öF²ã¯²CÛ–¦,{Ml¥hìà$°ý÷«73nw—ÒƒÍÓèÍèͳ,]}{\OlÛoÝ$ºÕêÉúËиIù}s ®®ª¾¹\w¾w®uí8{ºSC߬ÝY]—«jÕíÏ7ž¼êš×KëFÖç¤Â½ì» ÖQ×ÏîçÄ5ÛßFk=i“Óåè†ÉÙL4Rž÷çWOý‚¥ü”úlJQn8íûîN™[?ïË®-û;S§¦£ÜݾkQ¨¶Ð˜Pµûæ,#z7ï’×o§³;¬º]Ìçjúä'OçáôÞÓ‡¡uþ{Qן ô„õåx|u£t°X¨Öí|]ïËýæàÔô‹®ß™ÏoG§BÖØô­;76Ý‹ æZ/Ô¼®ëÚÿæLÄ)ÛÝÈ]z®®ý+ÔQ¾æÉ&¤€)ˆH8ù@h€ÐÚcÈ<Žkd>€‘Re€‘ƒ‘瘌«T\Ãã`^QqJÆ’šÐX‚Q£hÍ)5ŠÖH©K ¥®à£ý±Ï|6öÝüÚ b‘‡ÂÚ.fÀh\‡e®`‚žÇbs¼N[à”sSàŒãÄÏ9·¶‡Óºàu‰Sr¼®ØkÔ4ç"nXCA8%ަľFðÄpý ×O<—cúÒÕǘê,ÿâœúßx!¼ g!íÖaÀM4cô“Ên€Gym¼µÆð: C[1FýlÆx L^ò"K£~–2&NÆýCC&^к䅙Á—¬` ÍYÉecªOý›{"«CgÎúc¬›³þüœõÓÊY =9ëO(—õ'è=gý)ñYB|Ö™BsÎ:S|ãœuF”Ë:#Êe†~,öÙ¢+>£G+>ÇÀâ3qÄg¬eÅgìK+>c]+>ÃO+>G|FïV|†~+>C§ŸÑ»Ÿá›Ÿ©¾ø ýV|†ÎB|ƺ…ø ~!>ƒ_ˆÏÐSˆÏ”+>£÷B|&¾øLüŒOÂr¡—BüG/…ø}XˆÿT“ÿK5ù?)¨ŽøNÅkÅð¡âxáÁÑ$s„y®ªå„¢ G5.™÷» ¹ ƒ¿&è&¢s'þ¾sï—Õ±?"‹ºåÆ‹£‡:øÜZç endstream endobj 264 0 obj << /Length 867 /Filter /FlateDecode >> stream xÚ}UMkã0½ûWh…öF²ã¯²CÛ–¦,{Ml¥hìà$°ý÷«73nw—ÒƒÍÓèÍèͳ,]}{\OlÛoÝ$ºÕêÉúËиIù}s ®®ª¾¹\w¾w®uí8{ºSC߬ÝY]—«jÕíÏ7ž¼êš×KëFÖç¤Â½ì» ÖQ×ÏîçÄ5Ûß&ÔzÒ&§ËÑ “³™h¤<ïϯžúKù)õÙ”¢?ÜpÚ÷Ý2·ZkXvmÙÐØ)˜Š85åîö];ˆBµ…ÞÀ„ªÝ7gÑ»9x‡¼~;ÝaÕíú`>WÓ'?y:o¤÷&˜> ­öÝ‹ºþL '¬/Ç㫃¥ƒÅBµnçëz_î7§¦_týÎ|~;:ÒØ°Æ¦oÝé¸iܰé^\0×z¡æu½\×þ7g"NÙîFîÒsuí_¡ŽòE07H6!L‰@Œ@ÂÈBŒ€Öû@æq\s óŒ”*댌ÆTgùäÔÿÆÀ á]8 i/°n¢£ŸTv<ÊÈkã­õØ0†×YÈÚ²ˆ1êg3ÆK`òÚYÂõ³”1q2î2ñ‚Ö%/Ì ¾dchÎJÆð(«S}êßÄØYÍ:sÖcÝœõÇà笟öPÎúcèÉYB¹¬?Aï9ëO‰Ïúâ³ÎšsÖ™âç¬3¢\ÖQ.ë4ôc±Ï½Xñ=Zñ9Ÿ‰#>c-+>c_ZñëZñ~Zñ™8â3z·â3ô[ñ:­øŒÞ­ø ߬øLõÅgè·â3tâ3Ö-Ägð ñüB|†žB|¦\ñ½â3ñÅgâg|2–³½â?z)ÄìÃBü§šü¯XªÉÿIAuÄp*^+†ÇãŽ&™#ÌsU-'H8ªqɼßÍeü5A7û8ñ÷{¿¬ŽýYôÐ-7^´=ÔÁ!Uç endstream endobj 265 0 obj << /Length 868 /Filter /FlateDecode >> stream xÚ}UMkã0½ûWh…öF²ã¯²CÛ–¦,{Ml¥hìà$°ý÷«73nw—ÒƒÍÓèÍèͳ,]}{\OlÛoÝ$ºÕêÉúËиIù}s ®®ª¾¹\w¾w®uí8{ºSC߬ÝY]—«jÕíÏ7ž¼êš×KëFÖç¤Â½ì» ÖQ×ÏîçÄ5Ûßf6Ó“æ09]Žn˜œÍD#åy~õÔ/XÊO©Ï¦øá†Ó¾ïÕZûÀ²kËþ€ÆNÁTÄ©é(w·ïÚAª-ô&Tí¾9ˈÞÍÁ;„äõÛéì«n×ó¹š>ùÉÓyx#½7Áôahݰï^Ôõg=a}9_Ä(,ªu;_×ûr¿985ý¢ëwæóÛѩƆ56}ëNÇMã†M÷â‚¹Ö 5¯ëEàºö¿9qÊv7r—ž«kÿ u”/‚¹A² )`JbD>`´öØ2ãš™$`¤TY'`ä`ä9&£Ä*×ð8˜W`TœR±¤&4–`Ô(ZsJ¢5Rê’H©+¸†Çhì3Ÿ}7¿6ƒXäÅ¡°6„‹0×a™G„+˜ gıXFǯ€Æ8åÜ8ã8ñsέ-Çá´.x]â”/€+ö5MĹˆÖPN‰£é±¯<1\?‚Ãõ“Æåǘ¾tõ1¦:Ë¿ø#§þ7^ïÂYH{upÍý¤²àQF^o­Ç†1¼ÎBÆÐ–EŒQ?›1^“׆¼ÈƨŸ¥Œ‰“qÿЉ´.yafð%+CsV2†GYŘêSÿ&ÆžÈjÆÐ™³þëæ¬??gý´‡rÖCOÎúÊeý zÏYJ|ÖŸŸu¦Ðœ³Îß8gå²ÎˆrY§¡‹}¶èÅŠÏèÑŠÏ1°øLñkYñûÒŠÏX׊ÏðÓŠÏÄŸÑ»Ÿ¡ßŠÏÐiÅgônÅgøfÅgª/>C¿Ÿ¡³Ÿ±n!>ƒ_ˆÏàâ3ôâ3åŠÏ轟‰/>?ã“°œEè¥ÿÑK!þcâ?ÕäÅRMþO ª#þƒSñZ1|¨8Gxp4Éaž«j9¡èDÂQKæý.h.Ã௠º‰èÜlj¿ïÜûeuìÈ¢‡n¹ñ¢Åè¡þðç( endstream endobj 266 0 obj << /Length 868 /Filter /FlateDecode >> stream xÚ}UÁn£0½óÞC¥öƆ¦Š"RÛVmµÚkN7RI¤í߯ß̤Ý]U=€žÇoÆoƾøöð4qݰö“äZ«GNcë'Õ÷Õ>º¸¨‡ö´óýñÎûÎwçÙÃz‡öÉÕeu[ßöÛãU ßöíë©ógÖç¤Ò¿lû ÖQ—ÏþçÄ·ëß&í¤ÝM§½'G3ÑHyÞ_õ – Sê³)E~øñ°úe®µÖ!°ì»jØ¡±C4qjz–»ÙöÝ( Õz#«nÛeDïvBòÓÛáèw·ýfˆæs5} “‡ãøFz¯¢éýØùqÛ¿¨ËÏÂÓi¿õ£t´X¨ÎoBÝàËÝjçÕô‹®ß™Ïo{¯bÖØ?ìW­Wý‹æZ/Ô¼i‘ï»ÿæLÂ)ëÍ™» \Ý„W¬“bÍ ’MLS!"q Ø# uÀ!`NØÈÀÈ©²ÎÀ(À( LF…Uj®p4¯Á¨9¥cIMh ,ÁhP´á”E¤4ÒÔp€Ñþ¹Ïbvî»ýµÅ¢ …µ!\Î€Ñ¸Ž« 8!\Ã=#ŽÃ2:åx œ1vÀ9çæÀ–ãÄ/8·v‡Óºäu‰Sq¼®ÙkÔ4 ç"nXCI8'ަľ&ðÄpý ×Ï2<WcúÒõǘê,ÿâŸ9Í¿1ðbxÏbÚ ¬Ã€›iÆè'—Ý,ym‚µÆðÚÆŒ¡Í&ŒQßÎ/ÉkC^ØŒ1êÛœ1q,÷ V¼ uÉ 3ƒ/¶d Ͷb l͘êSÿ&Åž° cè,XŠu ÖŸ‚_°~ÚCëO¡§`ýå²þ ½¬?'>ëψÏ:sh.XgŽo\°Î„rYgB¹¬ÓÐÅ>;ôâÄgôèÄçX|&ŽøŒµœøŒ}éÄg¬ëÄgøéÄgâˆÏè݉ÏÐïÄgètâ3zwâ3|sâ3ÕŸ¡ß‰ÏÐYŠÏX·ŸÁ/ÅgðKñzJñ™rÅgô^ŠÏÄŸ‰oùd ,gz)ÅôRŠÿ؇¥øO5ù_qT“ÿ“’êˆÿàÔ¼V jާ M2G˜çêFN(:‘pTã’y¿ ÚÓ8†k‚n":÷qâo{ÿ~Yí‡=²è¡[î|ÑbtßD&çU endstream endobj 267 0 obj << /Length 866 /Filter /FlateDecode >> stream xÚ}UMo£0½ó+¼‡Jí! ᫊"R»­šjµ×œ.RIý÷ë73´»«ªÐóøÍøÍÃØWß¶3ÛÏnÝjõèNÃelܬü¾;WWÕÐ\®?ÿp®uí4{ºSãÐlÝY]—›jÓwçOÞôÍë¥uësRá^ºþƒ‚uÔõ“û5sÍx0ZëYs˜.G7ÎÎf¦‘òÔ_=õ –òSê³)E~ºñÔ ý2·~ÞÖ}[4v æ"NÍ'¹û®oGQ¨ž¡70¡j»æ,#z7ï’·o§³;lúý,—jþè'OçñôÞóû±uc׿¨ëÏzÂör<¾:ˆQ:X­Tëö¾®÷åÇîàÔü‹®ß™OoG§BÖØ ­;wwý‹ –Z¯Ô²®WëÛÿæLÄ)Ïû‰»ö\]ûW¨£|, ’MHS"#p òÐ# µÇ>y×È| #¥Ê:##Ï0)%V©¸†ÇÁ²£â” Œ55¡)°£FÑšSj­‘R—@J]!À5£w+>Ã7+>S}ñú­ø …øŒu ñüB|¿Ÿ¡§Ÿ)W|Fï…øL|ñ™øŸ „å,B/…ø^ ñû°ÿ©&ÿ+–jòRPñœŠ×ŠáCÅñ8ƒ£Iæó\UË E'Žj\2ïwAsGMÐMDç>Nü®wï—Õq8"‹ºå¦‹£û:ø‰9ç endstream endobj 268 0 obj << /Length 866 /Filter /FlateDecode >> stream xÚ}UMo£0½ó+¼‡Jí! ᫊"R»­šjµ×œ.RIý÷ë73´»«ªÐóøÍøÍÃØWß¶3ÛÏnÝjõèNÃelܬü¾;WWÕÐ\®?ÿp®uí4{ºSãÐlÝY]—›jÓwçOÞôÍë¥uësRá^ºþƒ‚uÔõ“û5sÍx0¡Ö³æ0;]ŽnœÍL#å©;¿zê,å§ÔgSŠ ütã©ú;enµÖ>°îÛr8 ±S0qj>ÉÝw};ŠBõ ½ UÛ5gÑ»9x‡¼};ÝaÓï‡`¹TóG?y:o¤÷&˜ß­»þE]&ж—ãñÕAŒÒÁj¥Z·÷u½/?v§æ_týÎ|z;:ÒØ°ÆfhÝé¸kܸë_\°Ôz¥–u½ \ßþ7g"NyÞOܵçêÚ¿Bå«`ilB ˜„‘„­=öÌã¸æ@æ )UÖ 9yŽ€IÁ(±JÅ5<–§T`¬© M55ŠÖœR£h”ºäRê ®á1ÚŸúÌSßÍïÝ(yq(¬ ábŒÆuX&Àá &èq,–Ñ1Ç+à„±N97Î8Nüœsk`Ëq8­ ^—8%Ç àŠ½FMq.â†5„Sâhú@ìkO × Ápý$Áƒqù1¦/]}Œ©Îú/þÄ©ÿ»pÒ^`ÜD3F?©ìx”‘ׯ[ë±a ¯³1´ecÔÏŒ×Àäµ!/²„1êg)câdÜ?4dâ­K^˜|É ÆÐœ•ŒáQV1¦úÔ¿‰±'²š1tæ¬?ƺ9ëÁÏY?í¡œõÇГ³þ„rY‚ÞsÖŸŸõ'Äg)4ç¬3Å7ÎYgD¹¬3¢\ÖièÇbŸ-z±â3z´âs ,>G|ÆZV|ƾ´â3Öµâ3ü´â3qÄgônÅgè·â3tZñ½[ñ¾Yñ™ê‹ÏÐoÅgè,Äg¬[ˆÏàâ3ø…ø =…øL¹â3z/Ägâ‹ÏÄÏød ,gz)ÄôRˆÿ؇…øO5ù_±T“ÿ“‚êˆÿàT¼V *ŽÇM2G˜çªZN(:‘pTã’y¿ šË8úk‚n":÷qâw½{¿¬ŽÃYôÐ-7]´Ý×ÁÎ%ç# endstream endobj 269 0 obj << /Length 866 /Filter /FlateDecode >> stream xÚ}UMo£0½ó+¼‡Jí! ᫊"R»­šjµ×œn¤" ‡þûõ›™´»«ªÐóøÍøÍÃØWß¶3ÛöÏnÝjõèÆþ<4nV~ß‚««ªoÎG×M?œk]{™ïÔÃÐ7[7©ërSmºÃtãÉ›®y=·îÂúœT¸—C÷AÁ:êúÉýš¹fœŒÖzÖgãùä†Ùdf)O‡éÕS¿`)?¥>›RTà§ÆCßÝ)sëç}`ݵeDcc0qj~‘»?tí Õ3ô&Tí¡™dDïæèBòömœÜqÓíû`¹TóG?9NÃé½ æ÷Cë†C÷¢®?è Ûóéôê Fé`µR­ÛûºÞ—»£Só/º~g>½œ ilXcÓ·n<í7ìº,µ^©e]¯×µÿÍ™ˆSž÷îÚsuí_¡ŽòU°4H6!L‰@Œ@ÂÈBŒ€Öû@æq\s óŒ”*댌C¿Ÿ¡³Ÿ±n!>ƒ_ˆÏàâ3ôâ3åŠÏ轟‰/>?ã“°œEè¥ÿÑK!þcâ?ÕäÅRMþO ª#þƒSñZ1|¨8Gxp4Éaž«j9¡èDÂQKæý.hÎÃ௠º‰èÜljèÜûeuêOÈ¢‡n¹ËE‹Ñ}üMçA endstream endobj 270 0 obj << /Length 866 /Filter /FlateDecode >> stream xÚ}UMo£0½ó+¼‡Jí! ᫊"R»­šjµ×œ.R!‡þûõ›™´»«ªÐóøÍøÍÃØWß¶3ÛÏnÝjõèNÃylܬü¾;WWÕМ®Ÿ~8׺ö2{ºSãÐlݤ®ËMµé»éÆ“7}óznÝ…õ9©p/]ÿAÁ:êúÉýš¹fêŒÖzÖf§óѳÉÌ4RžºéÕS¿`)?¥>›RTà§OÝÐß)sëç}`Ý·åp@c§`.âÔü"wßõí( Õ3ô&Tm×L2¢wsð!yûvšÜaÓï‡`¹TóG?yšÆ7Ò{ÌïÇÖ]ÿ¢®?è Ûóñøê Fé`µR­ÛûºÞ—»ƒSó/º~g>½ ilXc3´îtÜ5nÜõ/.Xj½R˺^®oÿ›3§<ï/ܵçêÚ¿Bå«`ilB ˜„‘„­=öÌã¸æ@æ )UÖ 9yŽ€IÁ(±JÅ5<–§T`¬© M55ŠÖœR£h”ºäRê ®á1Ú¿ô™/.}7¿w£XäÅ¡°6„‹0×a™G„+˜ ıXFǯ€Æ8åÜ8ã8ñsέ-Çá´.x]â”/€+ö5MĹˆÖPN‰£é±¯<1\?‚Ãõ“Æåǘ¾tõ1¦:ë¿øNýo ¼Þ…‹öë0à&š1úIe7À£Œ¼6ÞZ cx…Œ¡-‹£~¶`¼&¯ y‘%ŒQ?K'ãþ¡!/h]òÂ,àKV0†æ¬d ²Š1Õ§þMŒ=‘ÕŒ¡3gý1ÖÍY ~Îúiå¬?†žœõ'”Ëúôž³þ”ø¬?!>ëL¡9g)¾qÎ:#Êeå²NC?ûlÑ‹ŸÑ£Ÿc`ñ™8â3Ö²â3ö¥Ÿ±®Ÿá§Ÿ‰#>£w+>C¿Ÿ¡ÓŠÏèÝŠÏðÍŠÏT_|†~+>Cg!>cÝB|¿ŸÁ/Ägè)ÄgÊŸÑ{!>_|&~Æ'a9‹ÐK!þ£—BüÇ>,ĪÉÿŠ¥šüŸTGü§âµbøPq<Žðàh’9Â> stream xÚ}UMo£0½ó+¼‡Jí! ᫊"R»­šjµ×œn¤"Bý÷ë73´»«ªÐóøÍøÍÃØWß¶3ÛöÏnÝjõèÎýehܬü¾;WWUß\Ž®8׺vš=ß©‡¡o¶nT×å¦Út‡ñÆ“7]óziÝÄúœT¸—C÷AÁ:êúÉýš¹fÖzÖgçËÉ ³ÑÌ4Ržã«§~ÁR~J}6¥¨ÀO7œ}w§Ì­Ÿ÷u×–ýƒ¹ˆSóIîþеƒ(TÏИPµ‡f”½›£wÉÛ·ó莛nßË¥š?úÉó8¼‘Þ›`~?´n8t/êú3ž°½œN¯b”V+Õº½¯ë}ù±;:5ÿ¢ëwæÓÛɩƆ56}ëΧ]ã†]÷â‚¥Ö+µ¬ëUàºö¿9qÊó~â®=W×þê(_KƒdRÀ”Ä$ˆ| 4Àhí±dÇ52HÀH©²NÀÈÁÈsL F‰U*®áq°¬À¨8¥cMMh ¬Á¨Q´æ”Ek¤Ô%RWp ÑþÔg¾˜ún~ï±È‹Cam `4®Ã2ŽW0A/ˆc±ŒŽ9^'Œ-pʹ)pÆqâçœ[[ŽÃi]ðºÄ)9^Wì5jšˆs7¬¡ œGÓb_#xb¸~ †ë' ŒË1}éêcLuÖñ'Nýo ¼Þ…‹öë0à&š1úIe7À£Œ¼6ÞZ cx…Œ¡-‹£~¶`¼&¯ y‘%ŒQ?K'ãþ¡!/h]òÂ,àKV0†æ¬d ²Š1Õ§þMŒ=‘ÕŒ¡3gý1ÖÍY ~Îúiå¬?†žœõ'”Ëúôž³þ”ø¬?!>ëL¡9g)¾qÎ:#Êeå²NC?ûlÑ‹ŸÑ£Ÿc`ñ™8â3Ö²â3ö¥Ÿ±®Ÿá§Ÿ‰#>£w+>C¿Ÿ¡ÓŠÏèÝŠÏðÍŠÏT_|†~+>Cg!>cÝB|¿ŸÁ/Ägè)ÄgÊŸÑ{!>_|&~Æ'a9‹ÐK!þ£—BüÇ>,ĪÉÿŠ¥šüŸTGü§âµbøPq<Žðàh’9Â> stream xÚí[[o9²~ׯèÇ]D¼ß€Áq'ÞÉÝžÄIYnÛÚÈ’G—lf~ýÖ…’غ8-'y9Pl²H¿úªŠ”[ÊëJVÊ›*øp•’ðéRet‚gY™`*£*«"4ûÊzK•× >CŒ¯TPU ª£‚®’‚)|¬ UÁÂt!@„°WáƒV¾2 ¥=L³+#¡;‚¼ÕðAÌáj¨óº£¢EM`dĹNƒº%lA9ýIâhN0ir8t§ýÉTZFìr•¦É’®´Ö±£` ­¶¤J1ði©,Œ±ûJ;3¨J{O€ º–²ÒQœø?¼tÔ)¤Ž •‘4ÈBÐР™Á½j¥Yhqði”®œƒOPÃÊX ŠÁnŒ³¨*Àä­¬Ð>Ú oXE+¬¶°PXáde¥Â]¥$˜ ­hèŒÿ­²Ø¢¡‚èØTÐØ£t»)¨€V0a€ XSƒòÖ:Ø ¶X@·µ¸*'%¶à. „m€%´‘•W+ *Þw´Ñ•` ˜¦ÕÆV!Y¬¸*ZPU‰—0¡Jø£Á #š7 Ö î '°ÈÑ u µ„Æ„-)… iÀ˜fÑj0¬x9$›òh‡ô‹7€ª €W 7¸3Ñb 84íP]€Ê:dµF¦Àø¤l„õRVÂn1KÈ]ƒ¤D¦;G&%]€©‘¸€Wìüö[Gœþu[Wâh<šuÄÉü|Fب:âEïûtGô¦5ÊTâi=üRÏý^G<õǃÑù­¬Þtþõ¯ÎGqüèJ_@«ÇÖOÅ2‹<ár¼x7=M«îÃÁåe=©GýzZ}¬¬7ƒÑ| ˆ?çãY=¬/g°w+.Ƴa=ÄÕ¤÷¥½þ|V‹þ`ÒŸß\ë¯b6^Ôâ¦×ŸŒGâ|Rƒ éõûõh&.°Ät0ÝÑxvQ_Š ¬-úõÅ`8ì-¯ç£«Þd~3ìÍgb|5ÕŸE¿‡óMo{ýúîwxX}xqÇ•8{ÿ×Ýž¤ëB€͇Ã;d ÉzŸºè#­„C0±n “‘~û ¬q*yu„ÌŽ¹¼LaQOD~@n™Å$ -?PÔ¤XFœ½<ÿOÝçeŽoòkÙ÷j2îŸÔ30šxuxLª¿Îª¥vÌ‚W½«º#¦`…)DSZ§#ÞÔÓñ|‚&ÇNMÏÁ½ƒñ×ê#Ê€sƒóêO°LÈÐ,÷pÖBª`N@]Ö–¤þ‚àÏ£Ï@Âñ䢞ÐÔò“x*ŽÅ£ŠPØáGëcSŒŽ©«!4Øàºƒ©”])È=$N*ñd|:®ÀXÿ˜ÂÈÁxÔµÿDD #BÚjÍŽ¦ììØnðvFnÐÂR„ø.;º ;BÊÙÇŽ_ZƒÕ”ý†+m†ÔÝuN÷D¶Äqä…+ÝÙ¨6‘Mí~Ù(Û#Û”ý²Û„!cul) g½®Êü¨ˆVpºÁü{›!m˜!†{›!îa†¸ dþn¼¬årõœ‘]¶–xp«¦ä’í²4v1£VKÛ°½Á•¹×ƒüÓ,Z.âŽH©ç,p¢tû¹dH ˜4qvØÆ„l$N#"Ì¡rÉ£Yžëe;×CÀå9i~.Y¦ÑKÚ•³}OÉópÉ«”¥ z©[ ô$ñC£E‘}>bºÎŒ‹–Ø„rä’ qæÑ9Ì+O,J«vŸW0íNøÑ ,G%¸sXNÎ¥£—0p[K¸¸/›ÑÚ¥a¹Îæ+efÕ+pØL%²¹IÆ$¤I4'®ìÅÍpKZû×ûW¹ç©ÛZ Ú\::×pÒ2 ó¨¡ Äuîýž2ÏI%¯R–Ng‹Õ#Ü5…d fèΘPõÙ‘1 %HU(~‹ï28ò”§H Ó/\S-…"‘bKˆ¸Ž‡'8HÌ]e(ÚðâJELFY*ƒÔt Y¡Áun/qsŽŽQ45&’\ÓàÕNa¼ ÑÜšQ¡v/éÖB- æXŽ,äYÆB*ÆD%Y¯ìe̸Î%hÑÁR”Ù³äÈÅeäTT”NÑi0§(‰8±­È¬ Ñ•R(X…Ž“(MV“Ä ¸‘¡y$êŠ1»Ù…HÔxh ŽÁTGRÉžN¬Öåe•‚`ò—ž’M޼Å^¸u.{qZK±kNJü’¤èËH`%~æD#–’ÜoáÌ‹/4Ñá@/r ÷1>\ÏÒ‘.àL8†Ë¨Ü²Ä¿|9È Ó-ÕËv®¯(ë  ~#rÉ2^í)ñ¯fûž’çá’W)KKî–[ŸL¾·K‰Û{bq¤¥ÊRÆÑAHjžD+§ûyF›çæÛ>!Gs³•JJ·|àÒ%<}”pÛK°¸—'¶@5Õ¨kˆ ª!“á v§<¥}la#å±…<Ë, 摸T/{qC\£È‚ó‡ŠËh(X¥“D nQ– àé¤D-:ωÄä#‰¥k1ÀâÑÖqî†øeKàSÚƒE¢’d'Š9\OtÀO$·Ôké©l®réгöÎúTçvÖ»ìå‰m(êñ5z]†Gåv¿j‰l’)åYm t†Hãñ=¼½ŒÕ?­½@vXOû“Áíl<áïPùõ±Ã÷‡¯¾ý¿“£ƒc ž„®aïjZY–9 /¿(H  ½Óñz«ðÍš)¾¥cõnŸÖƒ«ëüˆ+aß•`žãYo8è?] kh†“Y}óìÞgy a’ëÞ¿¦ý‡¨Å•ˆ‘˜Š™øúOÖähõ‰åîßÜÛ£GOŸáÞÎvï ßO|`¾§Šß'›tß½É;{(‰CñX‰cñL</ÄKñJ¼'âTü!Þ‰ž8}ÑÇ#(onzâи—ƒ/ð1žO™kqý×íu=ˆ>‹¡¸ FƒQ-Æb å­¸Å?Nà+x\› â¶ž Æb˜N_×Ùõ¤®Åì¿c1_ÄÅWñ—ø[ü]OÆ À­Üð³³?ŽÏ^0àz7à&îI»Ÿ ø1€Œ÷Dïp˜öFÌ €waüŸŒq†—q¤×Ù Ñ´€³‰ŸÞ¿Óƒ“'ï?0~ÖîÂOÅ~ŽÞ¨þ™ø1]?$hPÛFÈ$¼‹h7²û tðäÝ»¯¡ ã.„– SàÒ*þL„“óžg6Õ€#1Ù¾¬ßg¯o?œþ{}óüŽÐSÍÖyüæqµ×ÆN‹}Ê6›4²éFËÈõ„^Åü·ø}K{ 1ìL¼Öœí|Òë®g•r½ç|>Ö³-1ÔõÍEoz-ê¯ýaïi‡ÿ+onuؽÃâŸàÐõ_ eϾ8’äâ…ל~ZõäÓ!*Ù>¦î•ÄÎ^¾>}ùŒY w³À! èG²JVŒ©Áx|Ü—ñëdø7þMŽl²…ÁÀ@×äk“¼€ùk·W’9x|rüûrrz‡[x €Ð›Ñãß öv‹©¥_¬òyÓÎ(›ïdþÊÿ9ï ®3³¯&uh·Ép|³ži>¿9O\Z‘ýv8Ÿã™Û\™pÓ-x=]ÀZýñ¤¾‹ân¯´÷âìù“×Á¢§wœA“[Ä9÷Yso†ï:‚®vîžæ£ÚKñ:›ö}㘶¬.w…£¥qVAgg¬YäϦ î +n¯DúððÙû׈ù^„/|e/ ¶éEpÇm€ŽKеÖß—c8Ãl;!Ÿ­å–Þcòô3ºxã…ŽV/].ÇìÖžx1{“•Y×ܲ8ù´ðͶ)hÝ+˜'îuä8yöüô³b÷^ê+,^žÓÏeÅ›ìn|´72 À@ûnny¯üzüþí‹£·¼ågn|õ0oYÓ7w?sË›çF¿%Aîø5–òw„•Jë¥*è05 3Ôå 2fAñ%‹¼Â.Q™Xx^qÚJì¥gµÙ¹²›d2«‘²ä Hk&8¹9‘ŸÜ€‘ü‰Üµò’ÝŒýsኋƒ\åÝ7O­¯·œ[Q¢Pñ¢J®ð½*…ÌO¾ñu¨ ú·àÖ ²®u¢*¥]¦>µ²²IeÚÆ×!óIúÓ&í78¸ú¹àæ·? ?¡ßZÒ›GƒÉt†ÅŸŒvijÞâIàwƒ‹Ùõ”~ûIÂË_âo&©åtüÇhÈåGƒ;ÕÜø"gMM«ÖÕDO.´Ô+-m£¥Ù_ËÍo?Öµ4ëZâ v¥¥ –©–v-7¿cX×Òm`™vbéÚhéö×róž¿®eX×ÒÅ]¼4­xé÷×r󆾮å¦ûøXê6Z†{ðr㹦¥ÛðZªBKßFËx‹o\ëÖµÜðcva©[i™ö×r󪲮¥ÛÃ⪅–Aî¯åæá~]Ëð ,]¡¥i£¥Zhù?õ;b endstream endobj 272 0 obj << /Length 866 /Filter /FlateDecode >> stream xÚ}UMo£0½ó+¼‡Jí! ᫊"R»­šjµ×œn¤"Bý÷ë73´»«ªÐóøÍøÍÃØWß¶3ÛöÏnÝjõèÎýehܬü¾;WWUß\Ž®8׺vš=ß©‡¡o¶nT×å¦Út‡ñÆ“7]óziÝÄúœT¸—C÷AÁ:êúÉýš¹fM¨õ¬9ÎΗ“f£™i¤<ÆWOý‚¥ü”úlJQŸn8úîN™[­µ¬»¶ìhìÌEœšOr÷‡®D¡z†ÞÀ„ª=4£ŒèݽCHÞ¾GwÜtû>X.ÕüÑOžÇáôÞóû¡uá{Qן ô„íåtzu£t°Z©Öí}]ïËÝÑ©ù]¿3ŸÞNN…46¬±é[w>í7ìº,µ^©e]¯×µÿÍ™ˆSž÷wí¹ºö¯PGù*X$›¦D F á@ä¡F@k} ó8®9ù@FJ•uFFž#`R0J¬Rq ƒeFÅ)kjBS` F¢5§Ô(Z#¥.9€”ºB€kxŒö§>óÅÔwó{7ˆE^ kC¸X£q– pD¸‚ zA‹etÌñ 8alSÎM3Ž?çÜØrNë‚×%NÉñ¸b¯QÓDœ‹¸a á”8š>ûÁÃõ#h0\?Ið`\~ŒéKWcª³þ‹?qêcà…ð.\„´X‡7ÑŒÑO*»eäµñÖzlÃë,d mYÄõ³ã50ymÈ‹,aŒúYʘ8÷ ™xAë’f_²‚14g%cx”UŒ©>õob쉬f 9ë±nÎúcðsÖO{(gý1ôä¬?¡\ÖŸ ÷œõ§Ägý ñYg Í9ëLñsÖQ.ëŒ(—uú±Øg‹^¬øŒ­ø‹ÏÄŸ±–Ÿ±/­øŒu­ø ?­øLñ½[ñú­ø V|FïV|†oV|¦úâ3ô[ñ: ñëâ3ø…ø ~!>CO!>S®øŒÞ ñ™øâ3ñ3>ËY„^ ñ½â?öa!þSMþW,Õäÿ¤ :â?8¯ÇŠãq„G“Ì湪–ŠN$Õ¸dÞï‚æ2 þš ›ˆÎ}œø‡Î½_V§þ„,zè–›.ZŒîëàÍçP endstream endobj 274 0 obj << /Length 867 /Filter /FlateDecode >> stream xÚ}UMo£0½ó+¼‡Jí! ᫊"R»­šjµ×œn¤"Bý÷ë73´»«ªÐóøÍøÍÃØWß¶3ÛöÏnÝjõèÎýehܬü¾;WWUß\Ž®8׺vš=ß©‡¡o¶nT×å¦Út‡ñÆ“7]óziÝÄúœT¸—C÷AÁ:êúÉýš¹fÍb¡gÍqv¾œÜ0ÍL#åé0¾zê,å§ÔgSŠ ütÃùÐwwÊÜj­}`ݵeDcç`.âÔ|’»?tí Õ3ô&Tí¡eDïæèBòöí<ºã¦Û÷Ár©æ~ò<o¤÷&˜ß­Ý‹ºþL 'l/§Ó«ƒ¥ƒÕJµnïëz_~ìŽNÍ¿èúùôvr*¤±aMߺói׸a×½¸`©õJ-ëz¸®ýoÎDœò¼Ÿ¸kÏÕµ…:ÊWÁÒ Ù„0%1 " 0Z{ì™ÇqÍÌ0Rª¬0r0ò“‚Qb•Škx,+0*N©ÀXSšk0j­9¥FÑ)uɤÔ\Ãc´?õ™/¦¾›ß»A,òâPXÂÅë°L€#ÂLÐ âX,£cŽWÀ c œrn œqœø9çÖÀ–ãpZ¼.qJŽÀ{š&â\Ä k(§ÄÑôØ×ž®AƒáúI‚ãòcL_ºúSõ_ü‰Sÿ/„wá"¤½À: ¸‰fŒ~RÙ ð(#¯·ÖcÃ^g!chË"ƨŸ-¯ÉkC^d cÔÏRÆÄɸhÈÄ Z—¼0 ø’Œ¡9+ã¬bLõ©cOd5cèÌYŒusÖƒŸ³~ÚC9ë¡'gý å²þ½ç¬?%>ëOˆÏ:ShÎYgŠoœ³ÎˆrYgD¹¬ÓÐÅ>[ôbÅgôhÅçX|&ŽøŒµ¬øŒ}iÅg¬kÅgøiÅgâˆÏèÝŠÏÐoÅgè´â3z·â3|³â3ÕŸ¡ßŠÏÐYˆÏX·ŸÁ/Ägð ñz ñ™rÅgô^ˆÏÄŸ‰ŸñÉ@XÎ"ôRˆÿè¥ÿ± ñŸjò¿b©&ÿ'ÕÿÁ©x­>T#<8šdŽ0ÏUµœPt"á¨Æ%ó~4—að×ÝDtîãÄ?tîý²:õ'dÑC·ÜtÑbt_Ó}çn endstream endobj 275 0 obj << /Length 719 /Filter /FlateDecode >> stream xÚ}TMo£0½ó+¼‡JíÆ6„˜*ŠÄ§”öUS­öš‚ÓEj9ôß¯ß IV«ªÐcüfüæÙÌÍçŸÔÝ›õƒ{)^ìØ†ÊúÙÏ}ïÝÜä]u:Úvz´¶¶õyu|ÏCWíì$n³m¾m›éΑ·mõqªí™õ5)µïM{¥`qûjûS5•”Ò¯ŽþxêíàO£ò%r^›éÃq¿£ ·&¾\Tâ—Ʀk„ºw(Ú:ëŽèmô³>±8+>4m=Ì"Å${J‹º©¦ù‹ÞÕÑ™„äÝç8Ùã¶=tÞz-/nqœ†OR|ç-ž†ÚMû.n¿Tè»SßX¨ÒÛlDm®°óæq´bñ]ãêëgo…¦oÅ*«®¶c¿¯ì°oß­·–r#Öe¹ñl[ÿ·¶âŒ·ÃL @ b÷’ÒaomB‡ÍÒ½´Ô$`$Šá@B)»@ápºâ@á)ê¥ÌpØ2 d¤ë¬ ŠÎŠª?ûaÖ.e„­¥âŒ8äúò¤Îs`ÚWg+`î#)SÎ%~Æü8§NTâ°ÒŒ¡YEð,Ê ¯(îÒ6À*†3FÓª¼r44ëP#®Y§†fÍžhhÓ°CkE8ã8å²+ûj®"7Gö9ç¢~PpúCŠ+ªRî2CËÇ#`øp¿Ëœ1q îE—Œ‡£üˆEÈ5’=„ŸF]=7úz&`ÿq•p&b¡Ã°§|Ç _/ôcØS‰½MrõÎ¤× fÈ/öÝðù%Ðm ÆðȰw öŠù\Ô‰CÞúbÖ“ ÿxö5cÖ fÌw(¥:¤§ÐKœŸz‰gßqf1iXgù·á3NpÆ óéìÓy/hHS>Wø›ÎúÁÏ#ÊÍÁ/—«ù¯¡¿ÿ5fÒerT§apC… Œ‡¦µ—ÙÖw=²è¡¡xÍøz*½¿î¡Œ² endstream endobj 276 0 obj << /Length 719 /Filter /FlateDecode >> stream xÚ}TMo£0½ó+¼‡JíÆ6„˜*ŠÄ§”öUS­öš‚ÓEj9ôß¯ß IV«ªÐcüfüæÙÌÍçŸÔÝ›õƒ{)^ìØ†ÊúÙÏ}ïÝÜä]u:Úvz´¶¶õyu|ÏCWíì$n³m¾m›éΑ·mõqªí™õ5)µïM{¥`qûjûS5NJJéWG<õvð§Qù9¯Íôá¸ßÑ„[_® *ñËcÓµBÝ;‚ muGô6z‹YŸXœš¶f‘â ’=¥EÝTÓüEïêèLBòîsœìqÛ:o½‹·8NÃ')¾óOCm‡¦}·_*tŒÝ©ï?,Ôém6¢¶WØyó¸?Z±ø®ñ õõ³·BÓ·b•UWÛ±ßWvØ·ïÖ[K¹ë²Üx¶­ÿ[[qÆÛa¦ ±{Ié°·6¡Ãfé^Zj0Ep‰€F ¡‡] p8]q põRf8ì2ÒuVEgEÕŸý0k—2ÂÖRqFr} yRç90í«³0÷‘”À)ç?c~ œS'*qXiÆÐ¬"xå„Wwi`CŠ£iU^9šu¨׬SC³fO4´iØ¡µ"œqœrÙ}5× ‘€£ û‚œsQ?(8ý!ÅÕ)w™¡ÇåŠã0|¸ßeΘ8÷¢€KÆÃÑ?þGĉ"äÉÂO£®ž}= °ÿ¸J8±¿ÐaØS¾c†¯ú1ì©ÄÞ&¹zgÒë3äûnøüè6cxdØ»{Å|® êÄ!ï }1ëIÐ<{„š1ë P3æ;”RÒSè%N‰O½Ä³ï8³˜4, гüÛð'8ã„ùtöé¼4¤)Ÿ+üMgýàçåæà—ŒËÕü×Ð_‚ÿ3é29ªÓ0¸¡Bƒ‹†ÆCÓÚËlë»YôÐP> endobj 273 0 obj << /Type /ObjStm /N 41 /First 340 /Length 1317 /Filter /FlateDecode >> stream xÚ˜ÛnÛF†ïù{µH´3{à.pì0`)n“"ŠL8lÉ•è íÓw†\ÒKr%ǹñ’Ã9|óÏ’ B /ÀZ¹J)Ê #¥ð^Xkh¹ÕœŽVž×< µ¤G9¤ËØ (ÂRND- åD‡Â å$GM~Z{¡ÉÏÈ\ ùS=°¹Šürúƒäç¤Ê‹’ÉÏóEK‡D.Òç‹тÐ2†¨ØÇщödv Ðê\0Ye†N ôµ…Ê4t@õÑSµ§´åK9‘èHG¡#fI4ì§©5:¡Q€G:Èó ½¢ï²·o³éü߇BL׫*›Î¿Uõ)!›¾_l ¾"¦³ÏžÍ¿ü>;žÏ ®8*¶ËMùP­7§é\‘½Ül«Ãï‹Ð6›~\„ɦ”7Õ÷-)àß«åú¦\Ý’Å4–ùúÓª$cA amz÷î”'Ÿ¯Ï¯J­”†”¦‡)Ÿ0•üLýrÌë/³££S¼:™SĤ}còY§¦aâÓ¼óý‡ÙÉé1aÎæiL£†˜ÊG”|ÒAꟴcÈËÅm±Í¦‡ëGB¢®/›‚Žø†®ÃOË›­øËÖgt‹Ûf k8ǰ6#ýú+%@¹&‡6Íj ¬¡¶õÍÚìˆ_«ád“Ã…Z^…µ©Âjž«¡vÕ §Q“tXÝs¹Ú`zÔA_gCLä¸x¬îʧ©7ˆ[€÷‡°á¤¤ ,«»BØp›6I×Jxr\nŠü¨Ž·K m¨q½Pƒq¤Gš¼‹ÔÉÈó⟊_ãHÕEÊ=¸ZÆyttë´ <778075919B4602C6060860E73C64DA5B>] /Length 736 /Filter /FlateDecode >> stream xÚ%ÔKlŒaÆñs¾Î˜–Ö´TKï÷Ž^µÚÒ¥7—Ò»j]z³‘ˆ…JDwXˆ-ÂFDR'©ÄÂmaeg!Ö‰…D¤ ¼ÿcóËùž÷›wÞoæ™ù‰D¢2=+LaÎÙÆ¤A?ÙV¦4ˆÁY>SÖÁ YSÒa”l S¬‡1²\¦ 'È63eÁÆ€ÅÉ6q™„l²$Y—«VFÆjä°³•“ùËüÍ9•¥ÈØ9òƒóDÖ@æoé]@ÖHæ§*„"²2?n1”µ’ù•B”CTBTC ÔB ¶CÔC4B4ÃhVØ mÐ]*’ô¯¬vq Y˜çr7Ó8gaŽãòåY7ø-Àk£=°ºU˾ó^VÁW@Jîg_ÝG W%ïµg}¼ͱÓLž„CpŽÁJy©¯… V©Œy6ãìrØÊ«7 “*uoü¾ã0Ū—›#:šQi}é·ðøÑivébZ€Y•î¾:ó*G¾piÞâE•¾w~É[š·Ý??ÏTãÙ|ŠTŠ|¢èF7,¡rþ±g´Ýè†ym3U–V}®ÙFÎÌo˼˜9*˾ê}¦Åæ-ÞÂ}œÊ¼˜ù*W§ý>ï.5êh…*7¦|ÁËJÿ¬DåæÏh§QB«T¹õÔ3Ši”ÐjTî§<£Fÿ¬NåÑ%Ïê9?g£Ö¬²Zë ´Ó¼ m*ÏžQL£Ž6´Éz€ïÍè‹Ñ!ë…>自bTŨŠQ. Uy÷í†Þ§cª‹+> «®üöiDõÓ9ŸF5Jù4¦ÑÒšOã=yåÓ„¦Uüÿº'5ík¬ñ¢OS»}ǧûö^4öãzàgGà××ÀÚÃÀŸIÑx”Ä_2.²ÊåÉ@ó÷@ÕÛ@êr þ°9éPEP %P þoæ_P UP 5P )7=Û·_“ý(¡1 endstream endobj startxref 341377 %%EOF xts/inst/doc/xts-faq.pdf0000644000176200001440000110421514703504523014677 0ustar liggesusers%PDF-1.5 %ÐÔÅØ 88 0 obj << /Length 549 >> stream concordance:xts-faq.tex:xts-faq.Rnw:1 47 1 1 5 34 1 1 2 1 0 1 1 3 0 1 2 13 1 1 2 4 0 2 2 4 0 1 2 4 1 1 2 1 0 2 1 12 0 1 2 4 1 1 2 1 0 1 1 3 0 1 2 5 1 1 2 1 0 1 1 12 0 1 2 8 1 1 2 1 0 1 1 5 0 1 1 6 0 1 2 6 1 1 2 4 0 1 2 5 1 1 3 2 0 1 1 7 0 1 1 7 0 1 1 14 0 1 2 5 1 1 2 4 0 1 2 7 1 1 4 3 0 1 2 1 0 1 2 1 0 1 2 1 0 1 2 12 0 1 2 13 0 1 2 7 1 1 2 4 0 1 2 1 1 1 2 4 0 1 2 9 1 1 2 4 0 2 2 4 0 1 2 4 1 1 2 1 0 3 1 12 0 1 2 10 1 1 2 1 0 1 1 3 0 1 2 1 1 1 2 1 0 1 2 4 0 1 2 10 1 1 2 1 0 2 1 3 0 1 2 1 1 1 2 1 0 2 1 6 0 1 5 10 1 1 2 4 0 1 2 5 1 1 2 4 0 1 2 3 1 endstream endobj 110 0 obj << /Length 2677 /Filter /FlateDecode >> stream xÚíZK“ÛÆ¾ï¯À)SâófJâ8±¥ÈU.—¥uù ù€gIX @á¡ÝÕ¯O÷ôIP«µeºp†óž~~݃(XQðì":Sþëòâ«§2 ¸f‚Ç*¸¼„L‰ QK£4¸\¯ÂÛ®],e…O\Dá7 …?-~½üþ«§* 8gi œ¼1S†Ci˜1f:[$á·öÝBèÐÖ»­­°ÖQûåÂðÐf niQ-ÍRq\“sÅ’XŠIéWüËB‰ðµˆÔìÒ”ñHÂ4Ó\ÒŒó®¾Z,q÷†6åñ¬èPD¯#u²4‰[†+ J”pqfb¿ó/› -eX´4ÉÈÉ$ ÇŽS íxñÓ…¹d‘–دËVc‹eE_ŠÓ8[àtÐ଼xv¼>ñ$G㨠–1g‘ÀL'„wÄFMnê¾\ÑÿçTô­a¯N™NÅ=ìM˜LGö6Y·qkv›¬šY4–Œëd˜ð¾)5a=·2—QÃÀÚ¯šUõd‹b‹÷±KÐ%w3Û¶¥¾]–ã½ß,â8ÌÖ/ŠÿÇŒÑgÃͤŠ9óŸOxƒçUáª>àHQµ]V–s\‘Lîê#•N™ô‹b}‚b™„)•²9•Èp“!ßᥖ-Öû²+v¥oayûkEÖ.AÛ@XÚÂÕZê{IU:ùMœútT{N½•µ+ßUSYÖÙŠúŠŠZ2*Ú¢Z—s-Ò˜q߫҉5ýHœ„¿ÁaÝYóI*ù˜ÞÏÀdyH¢Ì€%ßÖ­÷%.šä:Eãœ"ôÞ`=›X*wIè(¶;çÈêÆô Ê\Rº?ÍZ`Äxz&3f|Þ+íùö1æh[ڭ烓. oæ—Q±Íº¦¸¥úÞ¼+2ïÓ«¬óµë&Û¢ÁM¸zœ^2bJ§°Åùp5oŒ[$Tq}w$ÑíQ.óä¹ÙØŠzšA[®mãÔ¼Â?ëQ²g4“ w˜û¹'Ž5Óæ^¯òºì·þä°UƒGÿ4"§@ÔÆîÊ,·G4}o›º\ààògèÅUÊçÒ~B¯›¢Ûl&5k½™©êj‰‡¡öw ˜™•½?åp´q^ëÇ×CD©Cy%ÄìØŽ~$äÍ:û*ÛÂÚCLBµ²·‡äÓ]”eÑÚ¼®´D–5uµžˆX} §þ0i9 ýü9½ïH¥Ò©JÁ•Œj·*ÖE×2àýßåŒþ%‚i5ÑOh]”¡'¡œõC_Ì)sÄŒG¬(º²­“3wÞÍÔœŒæk4o­·ÕuÞ•w ãIkó¤Î©³®NÕY °‹[*{Å3¼?¢¢‘WÙn—>¥+z·dô¼›ÂšM_ùM°aŽ:Þ·]½¥ÿ×}•“ÀAC¹%5ŸóiœuÀ-L:ãÓ€–Jñ N„­œèбU î n»¾©ñ~‡p1Mù!ù¦¸o qtèfUú–¶™`xhÄëC|S¡gh'Y€C_7Å1Ž®²’zëÊ…è˶D“6f  “áC÷`¨Éªø¿Ù4Ž˜4û„…ßá,’ã¤zpLì$ ,ÕJ}.µMÎ18Œ'à°Ó^òôä£AUš;¥Ãò9ä7¨>‹äRÅ’{Ÿa4ÓɼÎáºÛ2½@7‡-E•—ýÊÒŸ‡·íZju€ì‡9:cÓË Ðü…èÄÚ›”Åâ(0zÙWÃ’ˆ€€A0äKžà·óÁ‚âÆ?å`͉ ¨·}A.°«èó™Â.|ýÀõ¡g.Ïî×q¯E“Y´Û¡ÏÒÜÎktˆ]¶ÝµÔˆG9wë*×ûiçœ8eš[rÆáÏgBk1¾)kh Šï·px”¼¹dH¢dŒn)Lmǧ³*¶iêÆí¬¦€òÄm^õÅðʽEÎF܉`‘ú½Yd§9”õA‘Ò0ÁgÂJ•=.bK‡wq™¿Ú7L!6øj'Q:6^7Ìt•ß-ŒûeØïFpCBÑ-î7ÉkŠ*‹j8ÆÆWPb­ ]ü ßxþ)rF¬ÎÒ_ÅsôGtª"Ê·bÅc@"IKÕ¬±Ô a#µØÛÌe¶¨»,֕˶ªD8É¡#(³+×4üè­Z¥Âf/Š)¡R"g‡ýÜOcÛ¾t‡ÒCT£éÕhÀЮ¥#ç ¨¾ øž2þzŒÚ ‚ì«'´÷¶×=ô™}z_©@ï®Çá”;ð'Y±t5Ž1 ‹=ïF¾½vþ ¤‚P)RYñÅ©|‚­ø„Ø JPÖ Ìœb·¦¯ªºÜÌ=ïü_ŸV*Itð¥A'ÝAÏÓr(¿»¼x{Áý,AÀ¢’€›˜E"È·¯~‚ô¼ƒ0Á¹£ø/E¸]//~¢O b–jMf x¤d Ð0ð§Ã§|ôÅŸ|ñ§ñBf†Ï÷þ >\‚õÈ\t†I£¾ÛÔÍ_܉ðûºÝ`w> stream xÚXKs䶾ﯘÒÅœŠ&>ÀØW¥*›(G[±+µöâp4´8ä˜=|ÈoO7ºÁLj»’}؈Æ×_Íps¿ 7ÿüòß¿ß~øúc–md$t”¨Íía#ÃÇ›Ä(‘Féæv¿ùüt´ýv§“4(·2è¶¿Üþûë°rþb &`Ö½ñÜóª ëF„JúEßÑ£7™È•àŠ]j„Réf§¤0Ò\XÓél©LEÅÞXÙmw‘Î[¯XU±ÈâÈ/ý~͘™6~ÅÙæ[e‚‡mö¾ ËÍÏ¡ÖE[Ö÷ølKÓ5®¶;œpt·ÝÁÿEKkš-: uÞ—Mm«²/ vµoèï¾×´¼MÍ¿–§bWÖûâ¹ØÓÌÞöV¬œNGZh­_Å~qÀÎŒH °xÒ8¡¥Ås_ÔûnÍf"Fƒ¿7îLÍZØ"‘$ãÂk‰ÖpMÄhgx7 šóPY?37¡àâä¡dñwò""ƒ¶zéÊN¬aj‡àކ*‘ÉÈ#v«eð‚ M‚îØ ÕžÆ7ø'†®XE±T‰H2ýŒ•*ÁÒZ>-˜ï†MpNM}D/ŒÇ"2£ žb ÞÏ Y0û —›ŒõbÂÃ6‘çïV®/ä<ËèÛ#Þ\ËÉ–5». "$È ökÐd¡ˆuöeJðÌZܦìyÐöT?åÍélûò®„´A̼ÐôSÙi„¨Á±t‡Ž9t¥#ºØÐй´Åᾤ<.\âö4é"J±”a*$$%JL~ŽhT2È+Ûuþáç0W"‘( º1hý‡ñº.ÅB3¥Ðkc@^&}o2FódT:B€R…DapS“Ûv¿/‘Ö¶K3gêÍ[TÉè“­ªƒùÄAéŽ`iÖòTƒCܘ£8t}sboú¾-ï†ÞµoÖh™J—Wak`†ð ×÷k‘÷î„QðCÁŒBNÀæ×Ç”R‰d¥b]žSOtðXÞ×E߳݃ËMÜ iyϲ†É“ÅÈ®s•TFd0GdÅ'úWƒyúDvß̈ nÝõÞu²ïÌT´þ|Í•Ø)ÎÞUt ˜ÑÚ¾8S¹Ã"²Ó&Åêµ`-"¥Þƒ`#âi¡­÷d´î!“EtÍ©à͘ax™ö€¸Üà¿[ ØŒ¯ÆL¼†ö®b‹¦æ"ìK)a2aÞæ¸YðÎ:‹¡¸\0 îBõþèu ‡mñÛP¶¾þ#Rèj&/wœ8îÊÓ¹âqÆ‘÷sÔ÷tÄ5ŸV@0x©ÉPÎÞ2Ž>*®¯VìÆ ÞÆàœî׬HˆÂDxoZAöZ‰qÉ;†øÐ"•ø(¾¾´H ~Qÿí¢02½¸œ3Ø=÷«©.sø†êÈê‘Ýê0xÄ”öÕÇCÕ—çŠgDÞ=R¹Zjø klE1Ê .P74QW±š©»§‘/ÙÖ¡-\Ьպ扰lÄoKž©!남`ÖM¤â! épøÛc( ŸšŽE ‘ä%ÀBÂsO/ËzÍ½Šº8„$D¸ÃtÓö”@ ÐƒŽ—#š¦äÀ}Iæ0³Ý (—1gœœÅg³éqKô0[Cç³ÃëE¥¿“þWbük„_·Á/ȺS++)ˆBoRíma÷â÷¦YWYº ¿CM;ä#U-v’&cµw%Ñ…u ÒqÒ›.ö`üצdãœQ÷$Ñg…ÜajìÞiE¤°ohƒ ú8 ¨øšæ>ã°”£·¶ëÜ ¥*‰ÇªÝ8=“ùbB;È4§tðV}°ÀòÆ 5ieíŠ4ýæµìÒ—ÚËlô§²g¤Õ·ü±>ÄK[™Ðjd¼}#¦ó_ôhi,$(èE“–ÛšÛ +@UvG¯pJnXÈpÛ²<ÙÜW,Wr*»û⯞Ô2EÀË4ãŽÿo «`»¬ŠÚžð‚ññ[¸ß s¬W‰ìꚦ®îO9<ÁúÇ+OàntxΙ wÛðßò„܆ævt(ö{à¥ÀÕ þ4úÊ?ú„Âíý¿wùØ9ÆÀpåú·ŽŠNßbÌD„SkŒU¹8!ïAž ‡Ç ^GÛXziËgšòM%λ¦r¾?PNšX¤K><´ƒ5•¾SÞÍôîÐ8!Î{ˆScÛ còGî…óÞ`•ÛÁ‘'oüeW(èÙØ“b±æR¶©)óGT{¹×J^Ë–Ÿ}ÆN*Mâx3’µ>;e\^艋:L¿±ÏôüÄe^Š–¿÷áÍ*è9;}[?e:ZP¾¶f"L/>àäM5œjR75 Ë“«­^âd_ø’3iŽ|T$¦¼˜wíQ¨ót=ÓîCMy^¡S8äҀçcYñ‚ M¹§èÍß? ®ãQ÷Ûàð… ñßÿàÜÇ!˜z6ŽW„íŽ}F¹ëà£këZþJàµ(-ų+* ÒU'¬!S-útMÕèêû¢»ú…Öüï²`‹n¡ÿh[¿ð/ë ¡(ÂoÜZ_fL·¼¬P m òÓ0m«Åÿ¸ýð,Ìl endstream endobj 135 0 obj << /Length 1225 /Filter /FlateDecode >> stream xÚ¥Wmã4þ¾¿"º/$ºÏ/‰“T'‰q -+ä&ÞmPšìÅî¾ðßÎLì¦Ín«kAjk{ìg<Ï<ãÒà6 Á·Ô·_/.Þ¼YPBr,nF)‰ dÎI–dÁ¢ ®ÂRµQ,„—QÌóP»AÙµÏÂûE½Õ•Û.º^|ÿæ£|O/ b#ž:_DqÊÓð¡¶«?hJZß5šcNáÐpq‡Âtžnü982v]a¤–øÃfâÒIéóCÓ‡¶2äçŸ>¼ÿ½´ˆyÅŠŒÆ”Áç.zMgé6އ¤a¤HYs…]°ÅæszííóÆ9_QS.ë¶Bº¾¾O4y«Ñ›sïÕi–>˶)$$ÍÅDË}„Ã;.ŽÇ…û¶í¼áGgðÃ(ê\ a‚Ó¢zè8œy8÷p>ËOÁ¹‡ çí0–fÃ…lõœ…Oþ'>=ˆ?•'‘/ªZ$Ò$Ë^+ë©ä2‘‘eŸbBAx>2!D¤~tZÀîq°®›¦6*Nå̸ëuY›ºk1XÌ$#2ͧDöÃN²•£ò A¸ËØê…ÑS¶’$•éÄfíUª’ÒÐØ®*" “U`óZ5Nx¥ràhC€á .\¡À¹µúqH6·v¹©›ÊO ¥x0Þ¹ ÷ºC¨‡•Øm‡Ë’Ót"K¤ñ'Ç® s ÉuÏ»˜ú8g¬êmÝÞº‘²náHùå¦ïõPüŒy2V¯=k×k=;ý P)«vìòçZa™êëÇ“Yð'³Ûò¯ÑQò‚z3a_¿|ù4§d;ht{kWsFOybørŒ (Á+…t Š¥%Ê5{{mºfck°¥kÝôp·°}’K¸{ë„î)0›ÑAøðy 1Ø~f}ÚÖf u…6<¡5ºÂxˋ𷕲ÛTCy‹¿[Ißµ·'<>h€24îe-)IؘLU}[[CÀòCI)+ŠqmwgkôÆ »s­éÖ~yšÍ=†“™!â=1À”#žà»Š†oqèž1ÓØl\hƒÒ›¾[Uq_wãÄú1véTHH§|‹C ú”©o\*<áÝÆgNï3¦ÞÊVÃm/åÚ¿ª' ¦ž‘<ÎOC¸{÷¢OÀÃsñ"ä¹Òªšu@«é,%4a¾¦û?W—ìÚWòíôiµ”’]-?«ŠANŽUüL ÿouþ y`r.0ñÀô\`êã?µgÙ© "çA,¡Ôg£˜ ¾Y\ü kGfò endstream endobj 139 0 obj << /Length 1711 /Filter /FlateDecode >> stream xÚÝXKoÜ6¾çW, Ñ¢Ǩ‡Ñ´@¦I¢Em -’ä½R³+m)mìý÷áPZÉa‡žê‹øšáÌpæ›oÍWÛ_ýü„ûï7Ož½(Š•H˜JR¹º¹[ Îq¼Jsɲ$[ÝT«7Ñ«u¬Ò,êͰ~wó˳‚«¹ŒÒ,OA¡;[5ÛfèYo6Ï^^gLej<}IšokMÊùByÎt:iÿ#¤Rh¦gt “Gf‹¨oAïÓÁ›_wk%¢{š µÁA}X§"*wGÓÓÆ¦³Öl†Ýi]ȈÑ}*[¬HeŠ×Å"r½Š¥`¹ÈéÚëãm Nwm…j$¨Õú¬VF¥54è‡Îè¾j¿}8Øn-óè¡Ù—ƒÛÝò¾ÙØn®ö¶5}ÓµlkpóÚ CÓniÓû4;…æC`b!X¡S²tÀåIÔµî)úT ´/w4©›Ê™CR ƒ»ãÎï6mehަÎÑq‡¾3˽šÒùà¶¶5º:ÐôvÃÄ‹¶ÙàÞ{oÚh,¨E cÁµaá•öÏn¤§­("‹jÑ{š0ؗiý‚íŽdäâT³Û5Säaá-×\Ù >RÊtx†Dø gyJÑyÊ(°T—HH¯”³4›²¹; øŒ¤»sŽÇ*“ŒCM,ü/ñåõ9íhZC¨¥Dê²¥UE ¥)øˆù°–Ydì@‹S}TŽñÐì½F÷ °ìDŽ{ƒïå6èyaçØ‡B ‹”I™~lÓïeÊD¢ÇSOû€&¥²e0š•¸˜4•v ÆR]ú0¦Ëd² #Ä$p£d’ËQUïl¿ ] C9a›‹”R`aØ•Ü-Phaàë FÓ³a>%Iôb+zØ4åþ°3W#>Ê9iÉ„,K|Ð uT ôý.¦oٲ߻~õçfÀl¾\Ș«Xr:Á‹+.¯4gœ‹ —èBóÚ]PKÙ³ÖåhßàB…ËâÒážç¹ä£ºG¡åE•ò¦¿ïHN(%¥JD†Æ€f^ÀŸÌt(txý39G¿‘œ Tsw1Ú5|Á ì‘As‹Ð Ñ¢‹PK-J²<‘SMrù=~TBT¨•æŠåz*~h Ñõ‰bJæóDCµöØú{h¾9â‹¿õîØnLð }U´Çžx ¶^© @Îyÿ0–ÙÒ™°"I&¼º}uåË6KV(†¿¡¯B‚gBF¯ë5t¯f»˜ZvOSW8¨?Ú›%Π/ÚæÆu‰âÐv¶jÞr¥Œ…‡a\„š§,FS”/bD¿ÄʼndQq³H š-ŒšÖ5E\oÍºçž ¤ûumZªÜ{ěξ§Ž ßÀ^ŸE÷ýeßR®$Á)±à'°¡Põ¤½ô8c˶§®¸‘›¤í›Ñ”îî*uj–\†EÝÁ’Ž®›ýaçQlSx}l},ò| !¨b799ãH ú‚(ܘg[üI®Ö8BERŸðÁ¥{ñ0†:KÚ;ÜeøLâJ2a),!°âáà|܃ žÔâÍ ƒZJ'¾P€vaˆs kƒ¥œ`$ù—+Yëü\Éë˜1Ö,©&²šhí)³=¹´Æ­-8:(¹E®‚ F;˜](ÒÝöÆ’ÜàJÏDÉÓee¼ä}È>ŸÜÃeؖᯆB`59vI€S$7°9”DLÓú€û>¶È+½¯±‘íÌ4|Ô˶J”<_Šw w·ô´‚=¿%xæ2Ü&ýmøÎPTi®£—ŠÞ{EˆE8ÀýTýn¥ áØÔ”u„S¥ãéÇNÒö]ç)¡* w×#Ós˜ü÷—£'Ç|ñ†‰ŸÖóþàüaUÙ1MgLËùoCWÊ!ŒÌ™Ì§T=ûè*ö)¤LS ËûÞ{´PÑÖ´ÆB¨NaT¹Ÿ† ,àP¾Ì{ó'Isâ% ÈŠŒÇ\Äži]†¨Ö·4:Cæ†Ò 2Sॕ“ŽGTÙ™v;ÔÏ5ŸcÉ'Üì)<Á KÛt»_MIÙäÅš%€!K w ”ÉU÷´=¿|²\ÐR])~7+ø}$Þc¡B†O²r’ÕÊêX"÷²*ÿIÌ–,v–9ÐöÅáå¡*Ù0>‰.ªòÔ_Ì€ý³ô¿ŽYÝm?Rñô3Á›þUõ˜üphh¹û€eæþ_0ÉBâ§›'ÿiÆË endstream endobj 144 0 obj << /Length 1586 /Filter /FlateDecode >> stream xÚXëoÛ6ÿÞ¿Âð>Tî,–½ÑlØ€uë€=€yÀ€6‰±µ(’+ÉMÜ¿~w<Ò‘%s ´Ññxï;þÈ„ÏÖ3>ûù·ßW/^¿MãYÊÒHF³ÕõLÊ%A8‹Éâ ž­ÊÙ{ïýR\..W¿Î|ÛAš!X†´-Ò˜û\À¿…ÊÐãaÊL-„—2Sð{ãÆ^Yˆ,3Ê RZ&gáYÊq¦â,嘉DYft¢M+K•)nÂŽ˜ Ë”ÿãYr} ;dŠGV99Or¡ ;`*Љ©‚3•ãŒ'&lÅ™3àç)CÌajë®í‰ŸwšˆNÜU.IÂôÙ:/0ø ±m€_5–³qúX˜l"jD,€¹‹šGçS¡ÐH¥œ ”G,Áv,ÑIC^°©]ÀàÆBrÞnë=£±{ìÄWaÀ¤Tǘ€RJ‘.’koG×»¦*l®œ¸É…iœlú‚Ë“®¥L„)yúŽÎÚ(Hœƒ>¿ÝÂðÔšÝý{g&÷UqËÄ%ùrÊU‰¥N‚êüz…8Á§,F1Kãô|ƒËË%Å^´õo:ozìÐ^ø’CÂQølÈ $ذEØÀOÞäõþ³¦Í[Ü]u^ïê¼#9B¤Ì‚ÀÑöUá^±€7=ŽO”zyé”i¤­$ÅÔB׺O‹Hx96ÏD’Úᇠmhõà äI 'áݯº†oÊá€kb”î›—méûÊàJ7ôҦlh]µ®ò¦C¡ðü¦ÄP]¥-À¶W 2øWÏ"¤¿¿'O W‡Nçuµn˜ñùØŸ‡NÔ@œ”^×îšÒßmiE¨ $Yê{ ÔpÛ£]é¡tâé®j QZ¹`…”1…ìAwº LÁfÕ,i ,B«Èëz …R˜O¸°·è´dtܧ@"ŠX%Ç€kâOH>€®H°…:¼­`ªA2QÞ&[wæöY*Ï®ˆ¾«†õÑÐWßnwmÁÐl:à!6ÝÙË-U´T©¼j¬0–äàtâup˜lÄ4Ó2BµO ¼!ê™4en¼Økaw´o¼=‡}Ñô!ÖÐÑú ô‰¢¡È" 5yÏþüã¯wÿò ü1—œ§>ǧ‹ïÞ‰<Î|ÅÍ—Sé} ç%ŒC4AQð‡7+<„8iš5ÉÞXð.åO €…4 ’ ­†çº°ï¸æíyjÝ æ‰(!‚9‚­û?åÅ÷[7<ÁdÁö¹Uƒ#ŒÔ¡ã¸Àªj¶f$¯ü ´qcv銛þ—Æ—.]Cï?Ú00â®8j»Íµ¹ˆø+|uóWêQVÑdVtðÐÇÞ:d>Ü̸r tolüx¯B ÏdPx v}²?Œ~”¤ _7å¶…Š‚ù~ZbŽ…ì]k•}РõZ7ëas^+‹NçøHD½Üf‰¨°?"Ú+¤ï*ˆj°0HƒD©{záL€›‘§C1þF'ÖÉW›`¯?š>y7œd”:”í©MèÕþbn{ƒÚAP¾ó‡Þ¢+z9älZÛ»ª<*‰6Ï.WK[§màÑ·»A—Âø6É•j9 `œÃéÍËá>M>š€'È $ýæíöÇáŽð/„Ê9>yX¦NÓ© ËHMpîýþÃTöô¯ÔK¾NOŠ/Ô³3„JSz×Ô¸úÇSÕ:œ©jD’ÓQ¢ß¥Îù%#³t^Ñi}ÁÇ#tø;ÎɳErÅT"!›”%‰}w‡G?­^ü¨;n´ endstream endobj 149 0 obj << /Length 1636 /Filter /FlateDecode >> stream xÚ­X{oÛ6ÿ¿ŸÂÖV*Ž/Qd°®h‹vÍСâa.‹µÚR&ÉMÜO¿#O’%—IÓm@‘"ï}÷»“éìbFg?Ü£ÝóÙâÞ·/M:3Ä(®f‹÷3N%1ÜÌ”æ$•él‘ÏÞEËj[¶ó³Å³˜Áy¢,1I‚çœRÃçó8áIDÍ1¥ÇtÎ":¹‚7ÌSÓÛÉ?$£w"Kn'S7é%³¯#Kh ¼ofL!wî.‚#9rùe5,ÚÍcÉT”Wø1O£*$”+Âû{ÕùJ{R”¦D¤é]4Õ$áb\4‰òŽPTE‹¹@¸×¨=Ê9TàGç1[·xæb ½¶ÍñdÄ_œgÞÙºûó¬ ØÁ%Tb*¾¢Ê—Èç&tÎÖШš¢ÚU]‚\!öI6É`'Wó»dpB‰Øßô˜âùe€-7DkÖ_ζH0ˆÞgÇ=ŽðÑ•˜%!à ïxgÕ÷ÑM¶¹\[ÏÛᅢŸD‘Є6¹ÍžÂ• —ÑÓgÏ38ñÿ!ŸƒO¥œJÿͧÊÍß+es!£líŠÚ¬2÷“§‹@…wjÛØv”΋¹½Æã¶ØØOUiopÇX!5qG먦V‚C¼aèžÎ7§»†@/²åGwùhñûÑÞø»57eV>ôVP×gÜcÛX\ ©vØoÒ´ÒâAH$ƒ„dCKª\òRăÚCà°ß§ÝA×ÑŒ@5¡ëp˜”h  êÔ­þÞÚzW”Xa z@±´Ü2‰Î·-žµýÈá6àêÕ@uåc‚k.ÜèXyg»߃³òÂìð¹ù¬ƒè;Eï&èÆF©I­ÞB„"AÞÖŦh‹ ,7`4i)†à@¬¥”SCK›òÜšÊõz´¶ëâÀs`+ï;oÕöb2mH -âv\ç—n"p»oNw›ój—?ÆçÑÓ§o_áú‚ºÓ)îQ°§ƒñöÍéɯÀ|Ùz Ô]tž=Ç WuÐ8ú™uö®g/ǵÌew@…„p>@ÜÞ²;¹awçvœä9| ר}ÇèÀñUå:ÆdƒìÊ@l¦+8\ga4g€–͵6ÁÏ!ÇÚH¯J?p›¢\®·¹ÅÍ•SÐúó!‡ˆds€ý]ƒ‡.-ìuÜ}H+è^ÔtèßµDÇ Ë@©è4k·uŽð B²J£Ómé {úT¼í³Æ 矛ØBä™úñ™~•g»ÐÀ–ÀØÖ¶«ÜÞ ~p£Wˆè§ªŒ_º²¯ |‘ûfׄ 8DOÒ`¦COÌöõ÷çÆwîèðÛûkæ¹=ÏÃéDä<3b#<ŒêpïÀ0\Èè~QÞï~~8NÎnQ~e³Ü1éeŽfªØºP›~4xséæ ®@Ü+7NB/&z]AÝp¨ˆèùºÂd§wä¿\¤1…ï~ð€I ¾Kõð‚±´ßÁ‡¹I¨dã3¼þUy‹á:îG‘„/$gZGgÂ8Þ*u¼‡±G*ü§˜MàË« ŋŽ€Ë£ý endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 870 /Length 2937 /Filter /FlateDecode >> stream xÚÝko¹ñ»~ûéâûѦw¸Kž8$)úHT–G¼òIëØ¾_ßáJ^.E.—¶¤4(`/ÅÕp8/g†»¢ˆ ‰8E †,¢”#JµðÏcQ‘ˆj¤¸BÔ ­‚ûÚÊcˆJIƒï%Œg`á‘•q‚p¨¸…y`¤±p_3ˆÃ ­Ö#Áà++PxÜW€„…V*$Xf’þ(ô6 p0•’Ò øSF[¤€KéH1¤¹JBkRÀ%"”…:š c ´Z F d§5´¤ C놺ÂŽ€IÊÐi¤û ð̸äრðpÏÐâ„È?†ÃYÎ cAÌœ óÀÎåÄC¹ÐprE€@ȵàÈÜ10 B’jA% #NEÌÍ SS!œ`R9Uz¡ Q§Ca€9 Sat “PI©c¦LÀÕõ$wìQ§]áÔäZí l£oÇ:Œ–ÊápóI­ìÈá2Î|#]þ¬£Ê ³”î0ÙF¤ˆ3(ÎÜ'0ƒªAçÀu‚®¨âD¨UNºÍH–Á¥û¢å€^É—(²@™TéFÄ} ÷¥Õ 7‘½I‡Êr ØÝ-«`J“FÐÎè)èGº 0Jë>‡ˆÖDCÈ´³ ÆIµvœÜ5ˆ)¸«££gÏÐø5ÿyõf…Æ/зÓUUÏ«zƒÉwèûïGß¾ãZÁ¿~Gyî.+w©Ü¥v—yØÝ|aÜ̧õbUýÓãßÝ壻LZïˆ ®]4øºwný4îòCf.–›ë®‹tÓÞn8»v—¥»ÌºPgÝÎu;nž!ïþö:dïc;nÝ…ªCITÝï~k©[uo¯"$~èªh¾FÄ—-ÀÓ¯u 2˜ºj§›ºË§¶{ÑÂçÔÃcõüÜ’}Óh±}IÕ’W·t,ÛË#¬GÄä³z=}ެà2´"/ç«ö^[!nZ„GRÒ‡ö»e Î,¿€áª?–FihÙÞ™DЋȺ'Ñjô0i™õ¬´fÊswùO;dÚ‚â.èÃÏÞB T½ ïþ»y«¯…i¨«*tÓt——°·‰«ÐÔd÷šEnIÈb‡:è·{˜ðÄ\&DÛÝ$B8‰”ã•ë×Éíqó$òV“Ðb÷ó]9JUì(§iòÎÒ«kOì‹–À»Ú´€UÈêmdÌCUb÷KÄK|XÿýËàQ~ تÁu+–*ò|{ \,ú¨ZóÂò ó[ï¼@a¿…B^¥—b•%Ž"ì›vOâÑËp‘בV|$ú´É{øÏa\pM gû½;oÎ(̱bžih“ÐG>XžõY‹ä¶Tw—á^² 7€y¸ÎªÈ‡_…¬LÃá‹pdN¸ö€ˆmr†ž†Œl¾¥N°4¨ƒ']¨óWItòpNâuúðo"f!ê=/unßÅaØÍP ´©¿²JŒÄ &˜ìOîÂÜåßÁ…ïþÉ;º„º…ÀíЦûCØý]ØýCØýcØ}vïéŠÅ®ÔMKÇžÊ\¼Ô¾^¥}“7ô³ØË¬o l¶×OoÒ;÷:á?êvxcy8gtÀ"üÆçþ=QÊ×n-“v‰^…‚ê³Ö-ãý‘ï4ŽGrÅÀÓtÈ/Æw.#z™ Þ ™ú€ý®CrÝÞ«Ò9LY’’Û¼faø¾N÷¸ÏY¢®Põm»›ÒL¨G&«³‹píL¢:Í*”WÖ£³C·ý/á~÷Ò»Œû¨Â\ä<ÔgLׇ4¥{aêçÐÎr¾J§À³ti⑾Ü[np´·ìiuíeh.3ÉÛ^ òÔ]ȱÄô$â.Ò…ªd{$QÀh >vTnA½4r—¤²ƒ›ÏäÝ"Þ¹zJÁÇX'Ò%øy˜̨8ëÙøQKWa¼< 7µMšÈEZEƒ5®žs‰ ,¼Jä|{…Ò\<ÀuÐf=(`qTOÚ]X•è`‰Pö"óµç‚ux$á—ÝÞr»ü"9YÖrT±åì¹ëoò'›=gù=+íkW(´*ø^D? C¥uÞå÷9´ýúA'Ë8{¬\òÇC³Ë·˜(긫‚ÓÇžè*®xô”?ÛÝD)íßþ/ªºž¯ÈálWî‹dΰ].e%ÌMÞÑíäû ¦¤€0à|ÏÃE¶LSO†rÎX·¯ŽçêŽ*ö¶h¿µÜEz=K?ËTliÓð¼à<\Š%¡YY>ÜS"úŸp’›²Ü1mü”DOâ9é;4‹ëg>³¬2ç¹X@nåôlë´)Λ÷Îë÷Ú< ôP§£Ý˺ëôƒW‰e¿jÅýäÀ§jrÕ´Á'AR'º¹‡µâéÏâŒ\ >È\^¬¹SbF¾dÕâ&\Ð9¹ >aw]$ÞÁj–Qã2´†xó|k4"è¿\ÔïŸ=ßÜ]ÍÑø—ÉÅ|4~¾{ãQJähüj¾Y]¯§óMóZGsë¯óÙbòÓê½u0Š2¤-{?k‹(c[¸«j¨Þº7]ܬ–lºmضáÛFl¹mÔ¶ÙRkͶÙbqï´l[ºkÙ®å»VìZ¹kÕ®Õ»v‹îý(à¿!v4~}}^7ý¿,ªO£ñO«õl¾nø$ïÇ?ÏÆÏßÒ¦ã$3­Ñ[IvoCII0ˆIÊ11ú’]p?¢·0ŽK7ؽ¾ÓÒ!4f,O;Lac:âà3%ótðÐA¶šz:(Å\Ð!ŽO‡°÷*ÚŽa-y*ä ¨Ðå¥!ŒÆB HC€¥±[—-Zbalž}:¤ÄTvä¡8–|@/ætpŠ™ðdp‹ Þ€ j1kÉŽ¦±RjÙ=ÉwTB¸•˜ë!„c-Í!'𦼸„}k, äþ”ƒ—Ò›ø0lùDNàP9ãX‰!œaÂô!'ð¨<¹2Õ0‚‰Øéè œ*W®9÷„÷‡$r¯ÊÀ‹æ aF@¼³m¯ù†ƒ džÇmxü†ÇSÆს…ÀŒIÁEÀbUÂM¯§èJ¼+Ö¬ÒB÷à5øh]ØXúѺ0Ð…)w)X—¾j-Ë€¹!ú‹ÂEâ~ž‚&¥Ÿ[%‡¯ !"]öX]^®‹.l+_Í0S´ Xh¥íwB]IÂÎ,‚í/¯¨Ã$[·x´u‹X·HY¬U˜]¼Mt;Àÿi…ù… endstream endobj 154 0 obj << /Length 1976 /Filter /FlateDecode >> stream xÚ­XYÛ6~ϯp*#¶ÊK¢4 Ú¦GúÐè-, ­L¯ÕÚ’+Ñ{üûÎpH^¥IŠ>$‡£ápÎf‹›[|÷„ùñ«Ë'Ÿ}›ëEç©H—Ûg,–*]¤™ˆµÒ‹ËÍâM$ÓkÆ×L-׉H¢„ÅJ°|É£tBV"U|`–RHÇ|uùœ»æ<ΓäLv2°k©€]OÃJÎäH¶J€9ÿWÙYÏÎd‚ìÃa +õÒš!×|Xe{¯ÞùÀž«Ì©2& «Œ©D {\¢M$Êä ®ÐðGIçJÒQ¯á#%£Ú˜ ÍlCãß§ª\Jýµ@‚ŠJØÔKÉ¢[¤›ÖcAÛØ.loÛâ`ˆdwíù綨êζ3ýýuœKAJÙê`Ö-GàSLEU£† HÛÒe¸IÙìO@>,×<ªaÒÅËuÊXôkWÕ7d pÈØ"Ï!8Þ[tñ½íÞ²„½‚›ÀÈç ˜Ë˜ÃÌÓšµ»ÁZæ`U¦ýE¼uí©Å«ÊTGEc vk›4ïEß7hÉ;bØ4Äðš–×§j¿!Ê­önÀ&7P h£‚6 þœÊBÆ" <Í5˜…GšÒ¾$f9NÒµH³X)g<§.ÉQg -\ùÌ|3"%è(z¶í©.mÕ 94˜¥ëNƒ6Ò)¹©›Âš5FÑ«zcîi§ò¬%ÚÅF.q‹×5‘Î/ÁoÍ]]àÁÕ“&YoÒf{¦Ú/Iý¼çø@éi c)Æ#`YdhQbhbè:Ýo—¸ÓZ³Á@UyôzKlvWu4£QDucÃVUtfSžCd€œæDtJdü&hpêÌðíŒ]´wg"hbžÇiÖ{lßÙöTÚ¦u*dÑÝo4ÙÑi­ Ò’!– ; (ÙÙïÐú ¦ho j$Ûî9È‘Ë nÝ"›Á#iF·G‡Â¶Õ=‘Ê¢m0åÝ BÉ‹(ê 1"³AdNžºSëáè÷Øb’Kè}€@­03&ÃÜà:0­fä$0ëíþóO¿¼þ"ê<{Ò8eꃕ»RcFŸ4æC©[‘[Ëâ\§S·@4r(@nHà -¨©§ãqï«2Ÿ8¡\…YÈU7Ý‚m}Ev­ÒÞ•¾ÌÅ:òôÁ‹‹¢õBJH‹Âå³ÒÓCú¶0á'VŠø¢óÎ+«·Lªr®Åb³8Ôx+)Q MJÀ¢t•&8ÏCÑ#K¢$Xá%}Am÷•‹3œ}¾ÆQ¹È£vˆ-•wº¿€:‰1ƒÄ žk†ŒÃø¶œ i®»‚‡t®½?³q{㪮;‘NN¢Q{³Zó« ³Ý˜6¾~xátåÑ›¿ºÜ$ZÂýyÎ[d(ï-)Ðúõ§Ö¶¢‘=…¯HÈ„ )æþ¸¯ÊÊ"²@zk¶d•†¶Éß(ÔùÈK 1ä‚©ç,Âù U ‚).jæŒH‘ô?º˜|æ}æoŒþ©Ë½¿ÿrÓšãÞIï½Xù°Õ`—cü]­æŽ|¦MtˆøÖ‡ÊÓ^è»0Q•¢•*Í#€on½¢XÂ;» \J›¶B€„»Êîh¶Áä•Èo‰¸Å¶¡ò°Ì9–&'á4'¶ „é…7p)CæóºªÍ€ê(<Ê 3Qh@¹7ó0Œ'±úý0L‰|‡aÚè Ÿ=ÓÈÞ+ÑßJeë$^ŠÔis_”.±Ôîb_ÝÔ^蜑R´svòFÕ„`ýÐ=íÞ†I*.O½šø!´ùÓÞÎ!ù-5WЫ(QøŽVÖÔ49¥OÖÐúˆ€¢Ê!÷¨@ã8œÃî|‹Þ-©ð¾õpÝ·˜v;RØÃýè¥áívMçÝTø`¨‰ï½¥±?'Õ᜔”d#%㙞̦øÙy"v"Û$ÖOÙè˜BF†pOí< ëîX”à y–;@ضÚnVà ¢ÎXZã}pt2Ýj³8áý»æ`Ú›9]%¼ŠS¸Lݰ;uPÓ;× Fúyˆ,u,³³òë5—BøFLNsíQ=P\kGÆI˜É1D•*ÎÞ‹cSx‰q$ï„Sñq§í÷4iÚ ‚£Øõ°#¥ë^EgU\ÈèÉ`Z–˜yJñðz‚û'`ðÔµÁ pMÕ®èüŽ+U0ñظ} %eÒ‹½qå«L d{N8à ¸õ¼½T¸U×yŒ‡õ;ÁJr2^ºá÷.gZ‰³äL xGô‘þã—s.b±Jú"Ïug'À²é¢ø~yÏÇ:űnøÜÃ68jœü)tìÕÐÛ¹ktøÏAèu~³~‘2ö¨QOÁÁ½øðƒÅÙÁâãžÞØeª; |u’ĶêßvX'ÆAhú "n°|¸ÿ.hM£ e;WDZ?œêLí ¨eã*åÆ/¯©nî”s÷òÀk\6ý7]¡?à±7„÷ÞÄNÃÿ<ƒÀ‘öæB0üïÿ£»¸zúõ¾Á'öØùÂûŒwdÿ§é£G$<5¡`­ñ/î{–ž|ñÍå“n,lâ endstream endobj 159 0 obj << /Length 1159 /Filter /FlateDecode >> stream xÚ¥VKÛ6¾ï¯0¶"£+†/½A¶è)Ð^j ‡Í•eÚV#Q QÎÆÿ¾3J¶¼N.½ˆäèãp8óÍ ùb·à‹7<Œ¿¬nÞ=.+R™.VÛ…àœ).Ò\²Lg‹Õfñý´Œ™D?ü]ö¶¶;ZµÆ-Eäʹ_>­~…±¬H’ùž–&š¯ÃfØÃžnó‰'œ}0ÖôusAïêYÆ6EöЮ èèIÜmi¬Ó:š½ynÊÊàBGuøi»&e¸Ä¡êçÆœkÓãÖÖØ€nŒÝé`Þ»•¹ Œ•`¬ÈÉØÕ’EU`…Ì¢ ˜é¨êM9˜ðXÊp!7®\o éTå¼Ü XÉyore -kàã­ä<BÇ\ÜÞ=½¡BâAïãk`€ò Á3ì4ˆ+džlF3Òó®£tá´oš[u‡ºóÝŸˆÑÁUyÀcB>Ñ5+  y¥¥jLÙ#kÀsÕ`ù‘ä=$[‹á Zû ±£Ñ±ÐˆåÏÔZûm¢ÅʳË+}ïhUoéÿÑóë„ÖÕž0÷A@[~öÏ”Í. BÃõÑ”d|z`QʱËb‡õ¹”E?mà(xÎ\Ë=Ê‹ŒGÛÒ ÞS0wà ß§ýÊÇ/-Fo6S¶&‰Ž>oÁ:ëýïg&è ÖÐj,´< *ë!På¼G¤«1a6áT¼ö뎨¤f\NÏ€7WȘÃËG€¹%øÂ›µ IjÝJ²Bås'µe¿«-˜¤‚äšÐGvŒÂªðåâ|j‡Ÿ‘ìÿçì­OÃÛ§ï$-æ,%íú> stream xÚl¸cpfíÖ-ÛF'¹cÛ¶mÛºcÛf'éØvǶmÛfÇéä<{ï³ßó½U_­?ãª9æ¸f­Zs‘K8]ռ͙陘xª"ZÌllL&V8rrQgscWk ˜±«9@ÓÜ  jî`f°011ÑD½œ­-­\T¦Ôÿ4ìŒÍ¬í­vîÖ¦V>www!w7g7†©š›\­ÌÖvæQE%miI•¤‚:@ÒhîllPr3±³6ÈY›š]Ì©λÿ8S ™õ¿8¹0ü›ÐÝÜÙõbÎöyq5a E5€¸(£š(Àh“úç8ÐÕ…ç´¹©‰ç¿º£¸þegü?–ÉÿXÿ“uöüÅÇÌ 0³6u˜˜[Záÿ¥›4ÐÂÀñŸ°™›ãSÿrù‡€ê ©fæÿ ÝììŒíÍT¢öŽn®æÎy3sg @ÄÁÎ îéj437û/ÚØÞÚÎëÿÿÒ®Æÿè! ´üGA¦ÿ„¬]$¬=ÍÍ”¬]ÿ‘ÜÂØî©þ×4ÿÏýü«ÐNÿS ðϽš9í¼þoÁšùw9FMU1iÚÿƒ§Å¦fÖ@K€ªë?Š;›ýOàßi%cëÿÌЩüw¦ÌÿÏ—7vu¶öè21ükH˜þõü×Òÿ(Ozf.=+3€™ƒÀÍÌî÷¿èšº9;›]ÿ-û?½ü×ÿ÷8™›{š›Â­¯8˜ò†Úüj ¯ð/𫄤›1R§]a]î¹ÕEµ²23<ºÆ{PÃË÷@ ˜ 2á߻ڕ~h&1N0G8™œŠ%ŽÔ_Á{-!­´ô¯Ý~W.xûip¡koªquïš±±¬D3Å–•{Q+ãTÆ*ÉkTÞщ²“¸¶ø(I­O‰–©ó…`~@[ƒ2gVxc"øº¿‘²‡pKŽkhUXäx¡“ðǸëb“%”Ödøi,xlÇí„S¯•%p,¢¦YË ÷ÁEaÌU’§µnÊ똉¬8_£¡Û±;^¦n‘’´~l’ŸÆ£O{|…lÀ;ÔÙÉŒëh­rÇ1ëm)ô×ùÁ2s¤‘F¶ÎÍÒDñù®wÉ&ÆÍ·Z’½LÒá²ïš¼]ÕºÏh{ eÐúwó›õ¾ùXB%ÂÉ3E÷19öÊäÇMÔ•ô*$êOƒSªÂ¿’½Sw?oÔ’=ú'ÃIÚ'Ðr$,%z÷ëµeˆ¶¼¢î€Øáa‡1ø`îVH¦/Ô#ó_"eëÙqGÌ ŸÒ· ´FQ˜eLï:¤XWÓŒº^¾´¯zH‰Ëa˜‡Æym,Ì•f µV!ÖŸ™ÄüYOûF•i$œ52[¢Êªh@À\»¹`^ÅÓEÁ]é‡i]\î¹ `Ï”B9…H°}S¡t£ëƒ$:*“÷Ý Bdô ïÊ„n~ƒöçÌ2ab¯š|G³ˆ~¾£}гÇA.x¥§øKþÎbå˜e̶ÝÚxS‡Uã³òÿ»Ý)TòÒE"ƒä’¼xŸÈn;açÀs9`M Ìe%ñ[dE¹üôÎ0­}ò3¹Bg·!# %ð$¼û¬xå3N;òâܹùYÞÆ-:ÀÔžå7„¿ŽGzn€Wªdt'®Yž§&éWéæ•ÔÅ*ͱõëƒÜª;ógò ­…»€îV˜Â;$”//QUõƒLÛM‚´Ad”’ÔŒ@òCå£2céVr 4”£éJ?—ÐdrgÁ³Aä/X ‘ýHLw6ð 4¤îÕd?[õlt7à[?=U8û2¸º±ÎþF(ò¯´"ÇÒ.˜ ØÆ™ÞÌø+˜GŒrEm²©ÁÔ]*O¬8TÑ,þû4NöŽVt”¶UdösÏŽM—þÖºU,ì ñ´ó˜xœÛ㎽|¿ŒMÎH„SWM©x•‡ï_µÒ[…Tê·÷–ŸuÜÑKø>©¨/ãžiâM˜>ë“"€oËKŠãå—8Žª¸½Jῦô˰ݿ @ؑǮ%Ëe¥!¶ãõ_0â Ö&¢å2Ãd¨(þbµ<"é“"0W\©2Ô©NY m¾äÒ›(’RÛòn\£…g‘ôwûö¡~J‚½ P 5HºÊ’9Þ™yó ÿåãnpxñQõ2t›A¶é÷Ð zؘg‡èr¦às+e4ìCÍmw©»X{É|ˆ­yüˆBòŠ2o,ºªg´ ›æK=ìDcáT‹/ž ;Ô4ùyG]Néó¸¡$9V#2³åÙÊ‹JÞ@nÃÄ7/ýP¢Ë†ušüŒ$õ| “ToHR+ö±Åée*ùÁ¡*agÇè‚=ÑGÒº†“) nRz~?Áë™iÿøSî•3Ä}&·zÓëÄÖY-ñ9‰„ú¦F²ášfdM9®§s•˜Ñ›'NcÆoâ+Óð8Fa: Ð@FÍ|3U¾åɇÕù ^}Ζ_§8}œ KçR%(`'2Íó™Æ Äâ~— ¢ìrÛ8o?\§‘þ5ç0(r „ <É‚‘´ ´ÐäöÏ:¿«õnV2»ü(‹öܕ㰽tÔá?¤w+}µ¦îÕH·UIÿ nŸFCŽˆêÍNÞ‰~P¾zÓ+TïA×:³[êÍ<¹÷èÆii-óÀÂýÙýM{ /…˜³gðý-–ÏFP§7°#ÅH&çZ(CA{›rÐy›c-¬g¿&¨0žòúSóé1†8s–—Y‚Î!é Š=Î+ç™V3K’×T¹.d 内üá·½ò-Ô6ø›lá®ÔIJ”µ~½̨kœ4¾Þ·–¡ãG!4ãÝ-¾Ž•ç]5ù‹ŸµE® ]?\®¿f§Þ^_|‚­ÞS ˜ll,Z“k™p¬¤gîÌ N(6Æi´£›¢žD6ª)$X9ì»KNN3J‘ƒÛH‹Ò ^5©ý2ìÅVóÈqørû&B”2rOœiÓê)ò%pšØ®])F§-‹œQr5ÈvR˜Xç:Ù¼{ Ä/º™"û…/rYË•B"†S?¾Îôußhß÷‰Æ®k¯•ràáßÑ4ìéÅsX$àSf°)7¥S÷Y"¦j¹{&Þ­—­Ü›«§åüš }p·(õ_· þ‚[ŽÜ-o«—„K÷œe÷ Òù4 ðžÛè×Ìš7¿ª{˜C*d˜X&*{â‹ 5ñ¬= Êþ×§o°@Ù>ªƒŠ¥8h¼IÄ, 7ñÐûflÔZ%t«0ù®|‡^ÜOs#ë7ì¾ÒKH0¦ovˆÖoÜÑ=ûQJ–‚@·HÀ•¦Ý„G_D‘×71ïX…Öc½¼GÈóHUª¶ÿFè?OâQ¸ZlEÑ ^bX¥)˸yÎÀVHu¾0ºDšŸR1釔ín¿3‘ ž±îÃ`kªŽA¢›øÕçzù‡Øçm[ÅTîÃi²Ÿ$ƒÈ.!jK│zýöKö-,¨l• ­,Ìï§L´£Ùr™:Ýq=Mä’§ô‚p€îId&±Ô˜’tœ´‚BÜû&Ÿ%G@"Iѹ5GI Àúóº—ºÿd tnJõŒÌ,2æƒëö›¶©·ô(<“TÄc§IU*|Tl‘)<¤ˆÌÓ³x[™°®ï‚†•÷ªá‰F«ÇÚ@®[îf…Úü¢þ(Öd&¬mε̌^{ŠïØ1Ü^ÖÖ–ª ,.Kvéž—?§ß³é` ÕaÊ­Teé89ÒI¹ žåBσdØ=Ãÿ)ؽå'NÜ_ºëjã%`á³ô(¼¿›žpný%šäîîZü`ðØï´\ã¾?½/&UU„'‹®(õ{&Qáñß¼Q•ÙÚÃ""@E¡½5JÚKï$ll"M&±eK¹L¸³)”PKnT©ÕRÇS”jaµ%~4ùЛâétb·W¡w—ÊÔ!É[õÚ‡gjÉ¿߉>Ú · ¬,gýËKü 'CUvkYB}!Š ‚T-7 _—•ãhòz ÂÛÀÃ21 ‡$3idÊ«U‹Â(ÍAž…/ìê…fqÄÃû®Ht±ÏçïCOˆJ÷ÙUsëåÉzˆ­”dNg¯žôºˆ)ò¸Øzþø«ÈoO®A)ô rÏöoÎiö÷O™}¶þõò?0ì+#ê=é`‘š;r§U°HÉ[ zk0O½@ªm:aõ¨h…ùÔõµ]!uÅ|›†<Hˆ-:¸ˆL òo‘ )P­CÍóJ¢,ÖŠ‚M”fPØ=7ÁÍROÈX!Vyü ñ5>Ð×aÝ,­úiETÙuYó­pkxô[°U9–èÖßXɧ†^7ˆ{Ѐ¸ï×ÔÖ!·¾Õã#b^Ï<ñ¶üê ”²p,Eõ@ÈßÑ(d Ô¹JtŠÃx·WÍ̂Úȹc@Zª÷{«jñâOØè©S¦v0ó7¬˜ræ©'šn@!%éª#Ö[0YŒP8»lÕ‚O¿CSQ±ñŠTÆ k0ã,ÅQìØmƒÆRä*E×µYƃùça1Ú ïDÒÆS(Zˆ*­Ø˜j žÀ9þÞ» œ”úý‹€™âP¾6‡¡ö?¥‡sÝó¸Öƒ¦ ð Ë„kúLµ;>º|RXµé®Ì™ËL-5AøñœéÁó«×TÜþKb/»ž²±¹ðοn§š‰›©–ÖW4/;ßOœŒ‡ú±LMÆÛ*$N–;"³£˜Hê L~ùP'·Œ>i!­$uùAH΢&7#cCkw¦SíT­•Ì´—Þw6Øu–ºó÷›«‰+˜ÆµzPX$Ö‚w¯©}þ?ÂXÀÈ¡Óú%m‰ö5&-ìî|žM²“B®fj,Iµò€ F¨‘ðh¬ÎWjŽ™œåm¾x±uóíËOql7Ÿ¸¡d-ã¦oÜhÓ,ç…ºŽ—©üšNyÕáÞàöàï=ocÙÝø;õ"Ð2x%|Ä5Ù½•“zô Ö1ïžT®-’È)%Eø²»k²™n(ߪ”]ÔÆ†yV2„ñòa4¶— Gn‡2ö")»“®{ðO:®£ïE¯š…;ñ”lÁ'ˆÞË¿Æ}‡ûd‡[ˆ«&Üú|!‘kˆ[íj$[ž¿ÿ‚Þº‚ZiÇßÒ )öEÍ ¸NYP‘›å—Õ*Pž]ÕáïJ÷¶è*;«áq¬U…›š°Œ-íÈ«ÜåHƒ)Q-äÀ&'¨Ö•r„œøRüXµ„Û¤Én¡Š*?祪1¢1<þ¶6³'OúÇ-Í->ñ½­Ïâ´ƒz@1}zp‚YÓ­Ìeñ¤ÇzÂd–Wq¹¢°KloáÇk׊‹‹yl‰:(Ë¢ŒjdwþëÝž ªjàŽ¡gD°ù== ³Q÷NçsL®P3|¬ÀT£õš’ÏҠйZŽŽt~î0ª‡«ûªŸR2@£›³ÎT«žp×aw5«Ý —qÒA®mb˜ª‚ž=ä€ Å^Ãn}Ñùžý_ª››IBÞ™ïd7b–ÑY|Žò§Å!R‚kµ1¯ñ¾­¿‘€V¬g”9«˜F°‡¹ ºû q.^K\ÀÐØß$bÃqà¶á&FèÂXKîJ¯|Ô6&ø -Ù°ù’+AI®j«C?ó:?¼cøk­¶«Ð΀{9„ÌÝŒ$tÄqìd4y¦ºÐ=_à†`S ”šãMC8¼ô!KaÎ7ôz{×áuËŸq,äìX8+ðxó§ÞÕb³|ÎýôôÍí“Òd˜G!UGÝ >èò `í ™<­%xÊ)Ò§ÉéC}éçþ0Ø©,µ(Ž4R£$7¡Xò³ Ûßp!qz @憘ealþ_eíë]Ør*º‹œËŒWDŽº³Zµj 1¹-Á+Ÿgpá.þZm©õ2†nÈpæòÓs”sÖ9F <‚›Ôbf/«Åé~Ëm¡Ï€ ú¿†Žø)xxV•©Ð9—ú qáS”ÔG-¼Û+Þï“p,K@:EÇ:*ÛíVÍÑêm“'){8ã´R”]×o¤‹Ú¡ã×WgT ë£h§q“DüAœ´·|€ ©PrX tÜvÕ¹ׯ°˜E½¿Ä÷Á;×o4ÒÖÉ2¥áЮ"Û}îòæmÞsÖ휱ӬÞ{rìD'ž:ç(¥loß ­ÂøÈêdÁvPNb[qä~õä9^f;Ñʃpx²È5žM- Ó­º«+WQDJ×U<>R›þ* WjXÁ×kGË­WßQÕžlõ6 |H>iÕ=ºcÖ¶0®”À¾uDW•ñDZ¤"ˆÕÒØ÷¢á¥Z¦cüû…—ß 1µˆlâRr\DâN™¤GAA†15Pžäh–7WÿvºsKt—ƒCc–¢óyQ÷"Ã<…—ë’²ò q ·f” Șw§zµû¾–%ÝŸ¨]ÿ¾ø…-±2›³Xy$¸75Žë­$*ë’]gŸ4 Ž^Eçþæ¨Kny¬SÐóRÉË£L0¦D²CHŒRÌW~‰ŒYr‹÷o㻈oÔv/ðký{¸™ÁcXŠ™w ÉkUµÒ³Ç€Óg˜ÑÍf1 3 ¢„ÇËÂR5Žƒ(œl‘šh— 7bû ›‰×gPæÀ"n÷°rÉ'£ß\\ZBiéMaêÝÙ;¶ ¤J³`}n[É œÂ¤þ™A;žY„¿à’ßû³tqÑ)0|•lMËT"[_ì%¼³¶h¯ož<±µ3BžbãaŒOpj &à•W]–š­jÕ œvóæ‘ÀîfíÞ=Œ»Rtnd§ý2uüW•D#\ö"P×TJ¡ÇYu-îOvœ÷&B1D„(b*NÒWh)³n¡Œ±8Ä €Ëˆ êÙ˜F×"ô¡Å•úŸÒkÉ’[èÇŽ:jÒØë­²øŒë‘&Y.á¬ÿf Ìî¾ø™ƒ:Q·¸Üme(~þ„3I݈þ`š“ð°ºa¿;‰pX×ð"xLöÃ僻ë„ùFÐNÒŠ ýNÔòD(7ÄÃ(%zrõ‹û9¹ÊlÇ„W?…%ýZWŽ'ÏKöK•™Z ·6ú ÃäI4L!E“-2ç/…žo¾³ UZý ƒ;[ûK—VÂ2Þõ€:ñë®´¦+_ÛS Ê2ëöVa%À…\)Ãn…¤ŒQz$ÌváFH¦(%ÜćOhF÷ܶèh^²<7ŒcV+ÊÅøC¯#šK¥³:®iCcÙàZ‘8ìî: oaùÍU{ ^‚É„Êo ÌÌYæmôNž»ºùàŒ Ûª8D©ª$A…ËVÓk¨˜´?09ã¹è ¯ ë°çíêÄeϯeÐäé„LÚñ*• /ɰ/D"ÙDz.F'{©j–KØ–ùµ1;Zœ¯,\ç‰úIæ );´û l ã=RvÌSÇá©b<ùc(BÔð·ÃJ˜šÎÙ¹ €É°ïáÿJË›¯7¼Ê‰Š°ú[’$V÷K×,»ßq百ò¯•*)C zÞÚif7³I®•Ìxz˜&]y+¿ ¬fÈ&# Öv÷OÐp#ËGrœr–ö«¿sýhÄ•”ï¾5ý‹Ó¶úGpú=|ëz;°Pôý%SðÆwá«+zh:òüüÓÈîSßUk7ždØ:Ïx[u8LÆÑ÷ ßpÎQo¯±ÎÁ•zIÔó‚u_ˆv/üy4gÙ»”õ2rm>zöÆ,ND?ªx¯Mx!7~®¥vÂäe]ßœL[ÚŠïñgø™Ô·Z‚±¿=é‚—'"&ŒšÐiX—ËX° ²TÏoÑ3¤íOLŽ“Tš:ðþïÅv7ýæcÞµè%£ßgôñÑJ”7߸ïô$êÇ™Âo“‹ÇÛzŽl Ouƒ×Ÿjå…Ï‹_6ùÙ`¹~iPÖV6ìŠÒL9OŸOcAÁ ª,ÒwÏ ¡¡©J6ªÑÉ&éúñ5]K­¦&k©j6Ör·ñV‚¢H†XÊ«M††ÀìÂ&ü"¨±x8©8 ±’Š0\Œ(ãJ»¸5ñW?ïà–Ȧë tƽØwd+T›²˜£ÊB6¿ D‹}ý)§Ûí¼Z€ŸäQïìO[Û’H€=ñ6ÎqŒ/FdOžÙrÞØÛ¬GËÆ} yZ¾oú{ÊØÒÆíœ|8}· òp$ŠÎ‘•z…8#“.¸eq;ß'Á8 øž’ŸŒõo"ñÞ¦?Dp­±ÿ$„Ò*Ît×Ô¡m€éÃݼDb/3¢Ù¶¤bzo‚þN—±àFËom=;H6½_RgÑŠÕ)d×ó ¶ÕÓba˜Ÿ4ú±•&b<šŸSµAIEvôØÓ–Ь9@õŒb&'SŽkM®Ó”¼Lù„ 9œEm‡üWL{4âX,¦¯\2§QfÍ BMÏŒÈäͼ|£­R¯LŸo±²eö‰ÝÇ™ãÃl|øL¯uì|»a£ ):¬þ³½•1U>8s°—Ï(&`Û¡GNn –h‡Qíä^–Ònzuÿ¹¸÷jd"> bEBP':"äOöçJU³›Úž3a!kJ²ÃñãU ûï•sãŠv§ +<Ÿ&ó‘ê¡v)©T‚YÁ±> Ñî»CE®s}¯3p˜ÜG?%2‚»:âÝm ôÌkèþL*è ×Dêm2ŘÏsºÑî]éþ)?º±¦Ê… RŒwñ" fLëöã×Fê7Ÿ ¯Úd %’ìÑ:-S_:¹c**øÓÛ NºcÆñ!A¿§vM,RׯC×µÍrÀí@Wäƒ[·‘°ÞmÄ!±ei…ïÍG:ù1ã2’/CŠÁÍIåP£ƒéh} b H¨wªð‹¡ÂPvõ*}¹æ· êÃÔ¶#›¤ô7¸U<U¿'"N xÒðÐÅ{›ì¬,‚O$‡¾¥CªRoAyX>??¹õîõC³3—bÿ•_/ÁÏZIŽk4p“.ZȽPò5×ù4„j\þK}Óx~¿£NÀ;ÄhèvJÿd{K8ÏÌÍ?é)W‚ù¢f‰ÚX´ã’”©2(o>²<,ucÏZñ£ÉùSG·Ÿá޽ä0ÃÀâ‰^$c·]¼àÀ.$³Ü6¨à G˜ /½ÕRi°¸Í‚i‚m›dˆˆZ|3o ^]³²ä_äã'DqVÂóÍ4¤ä>áÏ*)©dôh*í¦%Q‹‰0Á|9Ê5"ɽá&Îôú #5À¼ Ý—Ùœïa€Nu=y¥‘ãt#þ–Hì¤Ñ¼$%Ï ÿßÿ å$¬,È­;F˜ÄÊQƒ¦èæÏ"½¹ÊAÁÖS𤢼‹Íá ”N7ÙñÕjá ”˜/ &‰¸} ¸T1åè{µi‘87’:N‚Hôbs-çÔ¡*ìóBôÝ S* ¥ ‚»ûU÷‹ŒðÂášRDÅ«¡nŠØ›»N²×’{ÊG’{À(±c³ê½co(eNCi× ]²!¿tDdyŠåWnÌ)s|µ)æ[y è dJBïÁûŒåÈѶè*Á^ñ…fXì:~I!ª¿ˆ"î…Y–`Þ ÄñÉÓƒàñRkb…Ò;g7'"WÍÐÚ´ªlÜëçËÃ:e“Ù¤;H›ú“Æ»R¦ÊÏÅà×Õ ëƒ•7›ó¥ì¾{R-Huh£óH@ÕŽ¸òT`m·%NØö/iŸ~ä×Û R¼uÄ›ª]ƒö±ƒTœ&o´!c™9h¢V‚â·/ÊXù"Ñ4P9·ŒDÁLäôl bTgŒ ,»d]SPk’SdÁp‰K7ú\A§æá.ámv¿ñM?ɺ¥!wÊæ5®^FæK¾ßî;ÙØðÑ^ ²ÌdÙóNÃL jßzs>»ò ˜{–PXqÓbÒÒ3çƒnhòÝâ¨m»n¼³lbj2>š Ó*e5»:ø‰9Z¸ÎpÄèú¸¸[_9öÄ_Ë"¤Ç )x›M*ÙïkÞœKH¯X‘àÆ"_>£4wÑxv9¨Û¶Üý’ˆŽ ›‹ÆÈ£<—L'÷^ ËÅ /ø.•Üû)qKõ¯üAÉCÊèU黼W¹\þ©­!  w)Ù¸–T*œ/¼=F昺;LQ‚&~–%-óá@Ö."ò££šr~3>ùÛµ£ÉpróWK¬)^ñ­n«4_¥ {pv"kàv„Ýí%À×€»]‹"¿{õ¶NdÄX÷@m1°ù’ˆ}<×.vØÍX=h½ð/ÕXºÞ¦”ÜD(È÷&d=:•z{}‹Ÿ·­Ùr&=3ùBi4.œÞ)Ìç€ò4¬…8kô*¡8Ù ¹OÙO“·îs _ä^£{K¥ÑÇQÙîâž²ÅPë„­+òÁ\M‰-_T+§Ìû4ò˰¢ú¤pòHN!¹NT²øÌðø/¢me¤ÒVĨ㢶ÁLùBHd¹)>Wî>ïß pMÐNå2J•QvÐ:ȶì+ŽWa >äÉšÖq»˜ÆäÙѧwír‰aí~®…Ip˜tß—N¸K+SÂL¶Ú÷xñ2µ L·–euUñÒ_£i¸‰–Õç®Göà5ùѪÇ/¦`›ƒL÷ÄåT{.·10f‰Þó”üÌKýXQèÖ›´Ùê„:{§œJ _.Ó5™;6-qkAzÛç¯Z½øŠ+@îµXÇ Ø"Œ¢* ÏWâÄ¿ðÍ Æ1´Rº Y¢q{ˆø“¦Îb6Ίq®—•]7cÿú¤†ÿíÙÔ~³T…5KSù€hã,£'žZ†äI;Àß)£Kè|VÆ×ØµŽ™bûMýýîJ#B$bk\£ý¨cR[Þ/¿S%Z:–ËY´à¡»•Wþ²heÞa…ÝS1q±¡‰ËÄe@ð\¡4G›fܤ’s©0æ•´1“ØF±´mªq!»Ê&Rk¦ØlR:íÄ¿½4¿ŒÆà ‰‘¥lKiožüŒ4O¬µeïX$ØÆö?7gÎÕZ×ñ§ üNlÈ#ü èï¼™^D׸íâe?áÙñêEaþY‹êèÆx}säzumI•"ÞÓípåßbe²NºËT9,÷>îòéï &N|û¤ ì’›Á4ÀÈKJFõ/הʠÞÎ/'gêrYIëÍ"ƒV67Ûȼa® ·i»y#øÈÍͲT­²¶!4o:á=×Vàp…Ø…sOø .¦ê¸“~¨gá›L¦fÆÕA“"oó €{û¥¡þiGpƒ‡Ÿ|"$4ó'âé¯rKn_P{“ºÛb@_rŠƒ¸N¥$‘m0 î´ý«èx©uÉÝlù§P¤µÜœ$€IuÏ6ÆAúuÆ"_á!pèK«‚£ˆ<wÌL‘|‹1Šþ¦?ôEy‘Hty¼e¨Þˆq`FR¹÷Ø:?¦ë3'@^öêC¨†APá­Ä7¿Ry—ûžç¾È±¥¦[<$|‡@Y- ⌅!ôÏëÑ5ºõ•`W‡¿Á¬™àŽß3OØIJ™¼Šae+G}|^°¤mVfšw§8®‹€Åæ†Æ~®çÃWo„ý´?íAMÊØûü§’XÔË ´›@=Þ·W5—éRn@Ñmßç=Õt¦ŸóHGÇ29|Lù‹ZÏõ΢u†úD˜‡ýHb§dU¸f¯J¡ ®¥;ß´ó«÷|¢M§fLÔü¶NßþŠû”[*Áˆ ‹åïç”Ë~Ʊ»ÔƒF4'ïyÒ€e Z-‹\Í`Ì]ÑûBÓ™[Ÿ©sõ{|†œo•ï 3©¤G14 <Ép¾‡GwÝuçˆÕ*Ê0€íGQüd1X“žt®/çêm¢kƒÆ'¤•·1T­zH‡B’ì{‘~vÍ4Ôºù5D¸!‘‚ò€gE6‹z°R¢›õìýÃ<  a·´ƒ&Rx<éáç¤üs÷}Qƒ5ëvÞg›£ÍDúKêµqŒ¦‡ah­þ…Wá’ÙÅEËHÒlw”XÓp©9¢­¶æ´œ E0—<ü¯×û}$PEºaì É6ŽÔvÑ{çH(W¢9ØÚIÂÓÛ¼µÙ[z_ÂklÞ ´O15ia°r¢K®œ/äúû{”‹7¸vÍOÃ7ÁWC¿DíVßÍÍg­…+8J®eWïô{Ç%Ï}¬ÇG¹Ó;0Ʋ‹µ­»-yzY¢DE  ÜHLË›CAÿHŒ»‹A«E!$ßÌFˆùµfm T¯íŠ^ôÝ >,œRL)††ý›(ö›{I#¡JyjðÓ7Ÿû¼äüIP=;òäDfr÷IMÈ‹§Êä‹b¡¤î%üH Rb®<¸½Úßc{ÂÞÔ1˜×š)GêfÁÜFëëëÄ|{ï$`Ý.¡H ¶ê”XjÁK\Ûo¢zx40[^:ºû>7Sœ,?5¯n®ÁzGì@;Ìf›à« B\i&ë§Lò˜ïÆ×ãŸÖÁºò –Z‡«ù&7Âg¬àSXõQ+ª*æeö€.Y= R/+ÓNáÅe†_B9e+äªko‘—Û;+ «°K†w9µ+·A=x¨ç>wô}_À‰ú[Ö/<6nL4xRLIDkOJV'‡r¸rÚ .¿-4&ìÑ#ÈÌòGÜøeM€D]K¶±³¥‰ ®¯³=Ög¿Ëvu= ô:¹p3ÖÃøèP61Û8róbÔ„z/AäE*!¯Õ7ˆ /**÷©Ž< QØÆp H¨NAbôkìø_¿¤qÃv¼ÜÄÒ—/û6\”“š(VxJ_+›Ïœ­Þ~.yð—Ò#Œûº ¨ßµƒHŒ•O–*pëø¡¢ü¼x´eÑé’È Šà"ÝÍ{]@gêð°Et`C¨ÂÜ ¥ü”’xCë¨+f¼ ñ½§ÿ G;¾–´™7š×Ç èTÅ!­t2f])^t*`¡«cû½Fòä"ÄÑ7žæD!û‰ñsÜèÒÂ4KqmbZ¥^nhµm‚ñ¼1~ä÷óÂlþ¾í¥>*äì÷µxxŽê¡C‘ðª9ù­½Q£s$œ+:^:Ñ4§òUD¾cxÊ•€ðŸ•¶VÂîÓ—ØsÆÖb {™Iôý ¸¬Ôè3K-ÌýÎ,o²/ø¤JÌ’„ÃÀIÏþŽÅÊ»[‰p|8ŸVÚfã~>™ó8³¬^‘0¯zù…Œ]°È+ ²ãÍØ #¹´1Õqk`KôÛ¾ïî,”²LkÉà~È*>1ûñ0Í/»ï¥·þæ  ôE p¸FaÒì‹È µ% ‹_˜ ïx‹û\F=ùŸ½ h™9¨kØŒ¯2¾Å)T=Y´š¢œ‹M½„øYCsp%¶«¡Á£¶I\ûüN2ß?Üë(=šN>iuUÃˆÇø(9 ½ŸG®3•+™“·©–F"®y2>¹¸!PgÒË0±fZÌž6z¾§Ã/iÝAE¢"ì‘iGš"Õöå±5ÃRÍG?oòO¨ÉäŽ)¯%Ç¥ãÓ†Ðñ$rð»Í˜Øùº“Æ¿\BW¤åYkáÛʨ@+õø`õð,ÀÍwÚ Å˜çÅÊhá~”7!gž?Âþ)!` œºÑÇÒØ{Â"Ù¥“™ƒ@´¾+ ¼^H1ªOx°ß¼‰ í¤©Àì—Ú„#ï·ÑâDŒÙ_P8–ƒTòÊ€]No;¸/ÃèéÒ:Û’–!8‰šîÂ&A'^#³¢ÒÌ5[ † ¬ñ™ïw²XßÞÇÚ(ÇM°(3Î_KÈeòa³’ÊÆ(—;ZÛÇ©e±RŒŸGrF#hÕ=ÍÝ4?·‚ï?t„X£±_îA»´èܹÏ(@×3PHõ®®5LG¤ ~5=îÛËÐ×DRô¬bm.!/úxx‹ÐÀN1mñ3hCdH=è­†"-P‹É¹b…ƒ·êÞ4¿›˜ O´ª:¦ì6jbó%ÕÙ¯…Ã,zèOËm‘©äS‰P{ž+Ïçbëñ9‘g°Ê w\°F•'yÎüKäË‹Ör½ô~e«•´"Ëpxt·š‰â™FbiM…oPÒÂð.¤ê€¾1¾4 dBþ8 ÁçÉš~\ã¸TÅÁŽéñß±òØEˆC‹áÔˆš¶¥UœUÐm°Øÿ´Äíƒ*nÀ/°~n|•Å Åú.B™@jÛÕôäZ[¤~Nh:Ѱ:z@™%÷TÙS‰.¸ó)2çGA´Ç@V„?S Ôô™{ýÙ«Ù"³Ü纎—\NEæÍá8û×j‘þÿ„µý¸LV† óTæž©*%¼R­ú#Rº§±FÔÆ•…ú1”Dc«~öËã§·Õ HAµùÁ*ûaÔ‹<õ“U»´J.YUtåe ÒÄ{®q¡ú—ÛìÌmÎ^'~ i6¨Š>\ö~Y¬ºÖ£.íï‹°‹{z£}ûSlº?(}E¶%¥IÔÞ­’„âÞΪ15XÚç“Ë9¦0]¨×úÞ«¿múR ª4)–ÓTò VËñ[Fª”œ7|)€XXa+R³4.d’=âòG“ž$Ð>,QÃÇüý¾<ˆôž—W‹xî¡/î+¿ÍuÈT ~ƒwA¯qBeúwz³äW ¥è*Ì_ŸîëâÕ›eŠcJ®‡|’}èR¢LôÉ7Â"Ê 9Fý¨ÑﮤJÇLá0…¸ W-A'l²P$Ø7¢/è:úÓ·#Ø»bÔ(í £ÙÓ{È¢uCöE¾:ÎY´\ý´¹:Yö‡º®[ã]¡5(s~{«ÁGÌ£õ¹À§áô=“ FØ¡q~˜“'ZÝ8Í|Ü+UßìrŸu–'lÂÆË´Õ‰þ‚|è‰÷XÁE]ºG TÛÉ"o :Ž5+Õ¢[Æâ¦9ÅFbIxFk”SËeóEâC¬öÉ!| ôÙm»‘–åÝBc¯\®†ÈEm®¥ÀTq6C7Œ£šLúOM?¦èAQà\7F˜?aöȼæ¥,±©‡!Q*†ßbE m##XÅ4EXcfÛoW¶É ‰ƒqwøJBéé®ó}*XΚdùF0a+/É\ÄÈSJ\8’ å—l3Mö¦Ó\Ô.¦þ…åLèü¨¶uG+ƒ9E“»5OïÝ9òß^^Ö-ÉÉÞR^ ‹€/ûUgó¦Hì{˜g9xè9xY«$®ó2í‚~ÕaëA3D¹UbgVh÷:ãgÛ*æ0<ÕþEÖ3‹Ù.Ùhy&lˆj,lÁU"tjnÐðdudä\÷¤³‘0éá&ÙyZÕ±øË*ÿ‚ŠN¼ÍéuËÉ¢@9ðIë´èÐ!Eœº.k`thß»Óyíè|…Taþ‰go•°§¶Xãëϲ«Önr®ãèÓá­¯ù¹öq€¾¬º­D’³0ÈVmû~}¬´ÎH~¡Ÿ«*~DÜ÷’f`‹t‰Ÿ`ó`&JÑt‰zUϤV¡×òe¿Ä¥ÿM±;c¨°µ&`¼0nó"C?jÎÒTyÓ¯Ì؆ Š“O{Ô ®ØìÆúëQ;œJÌ- ×ÿ¡åœçíÁE?æÂêÞ’êãâ2³8+˜2š/éôï”ÒÂF³‹á=‘Dƒ˜›ß°;#TšØºnI)S£þLÏF¤Ã¶Û*_'#*»³¿Á±&%I‹Ü~–© ¯ìuú‹4-þVàYyšþŸC‚ío]š:) éFIy¨e¬ׂOÈ/Hì¡ÙÕBÁÛÎWª1åPý¥ò„ÜÙy±^_æ’´%xó"ºœ¼fƒlÑpÏ’;“ÕC˜þí8Jh—´¨¦©ä×òmÛ|«¶§ä»¦<«>·oèk[Ë3‹u¡=mûrUšè|‡š#IûªdD/—f[U4IúW}"¨ÒØŠ””–Éâ-ï²aW.Œ›€ÊdÂêd§ £à¥Íj(€.¹ á2!B†ö'ÊŽð”g|wÉNšE†%OEX ,X`JPÌ(¹š²Ð ­{¥Û“ D=…_öj¶MFͽö_fŒ;8ae(z_*Èße룜>´6Ú¬Õ-pè¦oO›¸¶ g¾¯“*ã8Š‚¦NÌ6å3Ès¯nXˆ“ë jãô´Æ•î*‹éSFCuÛÍ@nÜs £ð|Í6}¸J Fææ^üØó]ð^¡ÙÀü†%Ó¸ÅÅH.”÷#ƒ%ãžà0Ùæ‰ø°;¢ix~!'awm"£ŠÇ)ôìC¹ñ%öÙ"}R¤8éZó1ÉÛjÓ—ÄYàš¶B)ødðÀ_ªšl»>kÌ×g¢š°ÅòSÉÃWFÀ‚¾}²óSdk¢ÝeÆ%žD{0:€Ú¡Yoq{˜ÿ‡µÖ¯Æ™Ößmˆ;Ó<‚·gR1fžä’p·i œ.‰Û>Ü¡4Äð0­€ä²ª“^<ø~ži!Ç‚h…Ï&ŽÝß»ióM$œõWqµ°^“ê}T2}‰”LD†j{ügó¿ó¶inRbÈFË¢ÔïÚ÷|Š£ÙŠNþ¿UÒ:À¦&äÿÄ즭ìS‘-³(–}qhèT·ÔRŠ1 7f6ÔKc¹°1XHUˆPqOu?|7ORˆ‚Óù÷-JOqÕœQ0®E­P’,Ûor×¢€Y²¿*]ïGÓ®±%yFwÎ@û£HO3óßR'TìŒ6ÿ¼“UQÊ ¾þ%KsfK½ˆb ~o,áz¶† 6pbÖó¹Ô̈ysõ‚M:6P'8£Þí@ýJ¢Š{ §gô6TdmW¦Q¹h;9ÁãÞ§ðú£é ÖZkÑß„ó—;$',ùwëÙB v#»á°)ïÝßqb'pL ÀòxàC\›ÉÞéñôl¿hØ aæ‚qÞE¼™±“¯=œH„uŠÍ,ø5‹ðÒB+¹©Á íE!A؇Œ7 j¶ò®ioDå!ŠGV:Ólס>Ò4ñýÜnbÇU²í‹_á–f­»NjŸOÎÈUië #šB(uÆ®ŒÎö¹¸P ‚ y7Ô!ÂjÞ«"UfLCKîJÖã:Fãk(U¹&/lø†,Ƀã>¯öá õuI‘BGX¼Œ‹è›9)¬ŸÉ #ÞêòÜ °Gñ1 ¶_¸¯,0Ð9«îR˜õƒ¼PůAdgé>¼úu›Üf]a¬íGƈvPƒE!?;§ƒé´M¿Å ,[dI[ JÚ¾ Íxä—¡yAyò¬!ý=†"~3¹í`DÃìj¸!¶Eýˆ$ªÎˬ¢ SÒÚ»Y[¨+­U÷ç–M-ðŸš$vøÅ÷«Ê|³¿ù÷óõQÈñ& IåIÂ…@eÂCÿéíZy0ÿï÷¸ïTËk_*Lœ” >è-ó0KØÎ˜ûÕNvÍ¿¡þ·ÎÏ8LÝÖåf81}Üĵ¡’P“‚9p&ÏõˆËÀ-lëž 4¶‚?Ȧ!pÔ)å<­È&­æ# ,çél™Q%¼ZDöåq  ò¤Ô5s‰†ýH¾7mõÙ#‡Ã;Ðyø¯#¦ÆÍ‘Ê(ÚñaÃñÜÝ6çR7qÕjÁy¡´çÀ0‹È]µ;4‚_s6¬=¿oÈP¦I_Áô*&Î6Õõfb¤Ò•ª»º8×S5­å”€ucÐH²¶EÄÉÝáÒhQª{ÎØ“ ЊoÑ.ùÒHK/¬Û.õÿbnu$%Ä…xcnª¬-þë燘»õO>(2Xå>³cŒ·`ØP|9FªlºŒ,ÕBUÄ8~Š6 ¦©Zß9ËY(ë#Œ“ìÎO¨BÐ:CtdúsHR_ˆ'sEsL&#W‰¯·WÄÌß:½_¬*Ðä‹_æôp]ƒòTð¢—!ÚZÌmÉ’Ù^û¿¿¬QÒ¢#4ØÎY&ð\¡z¬Ž¸eêÃXÓñ‘k"”†‰%#ïi!­2m]J8]þê;¹ü„«¦Úb W§»+,„oó«@ÙúüelÁ;ìu ÿ‹ˆÂ…Õ²ƒoÉINÔ…yPÙ¯€µ}ßV2$~‚¶:›«MJ\*úó%wŒ¸“ቸ·U¢òÊæñƒ…`½Ò=úÜF…nö,,¹å,\©†B¼î2º¢k7й¹{?îî¨<úš3‚~ÃfÑT(N—=qõ¼À¹vÚµ´TD‡=É…Hd¢þ˯!øZúéÔå#1ØË¼5tÿÉÜ,Œ« :k(X>F£š¤yÞ{š(=˺jíÛRLV‡>Õ »ó1BÂTªØ´©^³:cû‚bÔqg°7k43ÄšÄÔÀ D“\I0ÅMq¢L.¾=â6Bh=ÙâÒ ò£EíŽ|¿º´è9øJ5–"ï.¡§¨ëäpy µÌ•sÓÊÄq :ð^™ ¶{™åÝhÕ'¿h`¼~Ø—°×²kžN8t‘"¨~Æ·´ ØÚ,ù±SÿbßAô±˜ìLF*ù)ÄÅ~v8˜¬Á›£™N¹%í÷ì˜å÷—–ñçþÁq‰Wþ£ƒ©¹é*D”Ù®ÈCCø‹C”óœ›Hˆ+žSjfJ3›ôD(Ã!¨àUõO&ÖDò]õ "V;w=–áÍ@É_²©³Ô1uL³|Ï_ÃïžèI…¡,‘Áœzó-U½¨•²þ¨Vÿ3o½È#î7j|7r¶¸„fT†¥å;ýw‰J,·óÏ©þ.ok\36l0Ã4è7íF¼«ìϣƹr—D]ûZö×-iFµÌiú0<€ç¡Ë¡_þŒã'Ák欞èì’RDM«.>êýSoù¼A‡½­È¤l²åçÎL_On1&MbGɺÔý½}½ÚŽ-´gH ?E¨B'f%Â}bê=_÷Û Ý½Q”?|û¬$Š´”qRI×çȆ3oî™ÀžK™†+B{»(99¯:~O¸ÞÐñ€Ö’!‘Ó„Ž©7·<Š—ƒ”ŒoBö„s÷ÿ™føv–çØ¬-üŸÃG´ßØ´û’±:×ÝÀÃy$^JXÇüÞD†¡ï¯ï$kïœ~ÑøAÉÝAß6çŠò7æFF7ÖY,(ô%+a_Þ‘OýÔfÉØr_S4ZáÿË`ÉùžÀ)›û·}Ö¢_'[i¤L¼ˆÉÒÞs  ^c‹zªÚ÷8Ç™+:¶ì¢/Ÿ9NA²ç—›1ÍVðGÈÛž4aíÞ£lŸ(iÓÕÎéïö˜ "²Mhá$r;EYœ*¥i×÷+=žû‹O¥j‰æ¹uÛm1ì:Îð»2ÍàIË‹½m|$„D™sæñð*]L‰~ái ˜‡“àŠ:½B)F£œÃWI¶%lÔ¿ÿUªÏØžWa§§ºÆÊ°på’ÖßC(ïZß^“sytñΘép©à*(q™ jˆõõÁ¦‡|/ hsºÓ'ëš0¢ÚŒþZ’Ón¿+8?Ì-ج>1m§k8üDף߾:гDÅià ž0]˜Úö±sݺh‘ÁÏ¡#M¸FÄÏY=ÿ0Þoîǯ±9e Þ㔈u°ø‹Æ<…3ÏnVʪDéàßý¬qôþ•w‚ìX rU‹ß¨#Sè#¸9D)>Ž6~dÍ€”{f! 6>âÃc ñ¬ßZØ”ÒòðìÕT|Eà$ÄN c6–”™öヾ;‰ñ\Aƒé‡½)¿Ð¥U5ïj»Â#ÐÙ‹9ÝÎ;z —àÁü, >îXß6dõ9ž«xƒ5¡ Wƒ’9Êhì{˜5É^ÐS\ͬeÕ•:+ÿ°8QÙ®£`ÿ ÑoÖ;AÊÊIƒÓ?I²G\Ç8ÊÓß+ ¶b2 ÕLuTòFTmÆdáÆ|}<–#³Cò$ݓ̴ü¹:Šª²¨É2ÛWëmû&]®²ëêX¶ò›, W@:F¬rÞ߸YýNñ-“î$KgÎCEÚüÛµù¶ƒ _Ö !ìY>9 ‹I²ï luyÕ]¾nÑüj™èÄøL#~ öþí ††60›ï­öÑJ†‰WœÓs}ïfß,£¢ ÀßàÜnDëLÉŒaÓç4)ö¶[wçq½ñ»4o¿Ÿ*ž`¹r2³P£J…¦Õ18\%Y ÍŒ)ÿwâ)ê̱v+6ób¥ªŒõD)&¤! “XÐ\¦m«HР| þZ77˱¶Gåõ¸€ãÌ"½ùÅ4þ°ü;€.Ø.K¥Á§Î}&´ ñ?Ü‚p'¡ÜTwÙ\[‘~¾9k‹l>ê8ó‡Žèä„S"„KÓ1«†˜n•ây &L‰ÍËú2oNUr=¢ ­”­¦{æKÛ>1ÓÁ—xN™(?ï;Š7¯kìjÀY$_eÕ7žÅ¿RÕ€g‘2EÔc3²;x•Vž™¾’bê‰ý ìæ2Ž|shЈ&ÑÆ¿ãÈNk²ù9ì U¶8¹kD÷)yÉWŸÓøËÕf_­l¯RÒ^Dh¤Š•2T1&i XSUº;k$YŒ‡=Ê~úä€3ž[V1ŽO8:Zç cË J~¶CjÊì`Û‚ |}±ÇÊ芿ô*dY¨ÝÊdJˆ}{âwɇ‹•\O†È¾¶Ã˜/òS/ˆ†˜"¾dJcÂíÆ¼Ç¥²ˆ.;Äѯ:å%„,8À­ùË‚³ß¦ 8Gß{³l©^K”C!sÏ-ó£oD»ÈAŒ€m§» /”Ò§sÉ7àà06wž´iÛ="#$tK‚ü”‘Š“' £°2vé1I|Z& |˜˜«7{„`‘6± *þÓkl«)"â×SÇÞôxFEJ= ¼/Üe‡7æ¢%ÃZ•ÊÆdšoŒ©úJ¤4ðq5ÐÔ›ÙLN +ïc$Q~LXÄ$ãñÏÝ‚1 #yŠ›šqÅȘ°_³Åk;T^cŠä\eR޾›œiÞFÐ1˜ÆZ—™9ÊîPŽÑÈù[ªnÊ “ÖøÎ¡'îòÆy5ajä’^p-Ðq¹´µœàÛ|ºæ3BþjŒ´Y—>:)' ú=b¾A KÛ³?myÂÜ»§Í¤ª—ÛV[ø`+¾¦¾¯Û endstream endobj 182 0 obj << /Length1 727 /Length2 10367 /Length3 0 /Length 10935 /Filter /FlateDecode >> stream xÚmycp¥ÿ²ul“dOlÛ¶mï$;¶mkbMlk&æÄž˜Ûö;çî9·nÕ[Ï—îÕÝÕ«Wwý¾<_%ì]Õ½, ,ŒÌ¼5IQm.Vn3#…˜3ÐÄä`/nâ ähÍj@G +€•™™ æàèå ²´rP›Ñü4mMÌAv g€¦ƒ­ƒ;ÈÌ Àïîî.ìîâÆèì&Èø·H ¸Z [ @LIYGFQ @-¥¨ÚMlÊn¦¶ 3€<È hï¤X88lÿíÌìÍAÿâäÂø{w ³ë_bÎv uI%Eu€„“ºÀÄÞ /ý·ÜÞÕ…÷o6ÐÌÔó_ÓÑ\ÿkÙšü×2ý¯õߨ³ç¿-F€9ÈÌ` ´Ù#0ýK7{ ç¿as7Çÿ„þrùË@ýWC€9Ðâo¶›­­¢‰@-æ`çèæ t(8˜í¢¶æ OW ½9Ðü?Ù&v [¯ÿoþÿdȸšüÕCÄÞò¯‚Ìÿ†@.’ O ¹2Èõ¯ä&¶¥ú×þ{?ÿjôïê¿­÷jî`oëõ? ÿóO;&iM]ºÿžÁ?a {3s½%@Íõ¯¢&Îæÿþ +›€þ}Cÿ¡òŸ›°ü¯¯`âê òè13þëH˜ÿõýÇ2øß,QQOV6 '€…“… ÀÃÂí÷èš¹9;í]ÿ‘ýï,ÿñÿ9' Ðh†°²è`ÆjÞ^á/Q4S M73e¬A·È¾4Ù}©‡´27Ú;'¸Q'È÷@"š2øs¶%sÓBj’D:Ÿˆýi°HðTBVié_»ñ¢RðÜix¥‰og¦uuíš¹º¬L;ÁžwR+ëT&€.Åk\ÞÞ¶™¸üûÎ^ŠÆ€ #K÷ ¸CWƒ6cVxa*ô´½‘òé’ßȪ°"Èq/B7çΤçd5”ÎlØþÍDhß–+Ú ¯Ä]щÎîŠÙ èâl‹lÊiOÌN‚ѽ]Ÿïú6÷ˆ|s»4š: ðC21x' QBü MfÔÏsÂmAÔl YùÉ…¯´WÀ~©÷²Ïªëº`ºÝŠ8ô«t{¦Ç謀\¥s}(‰Ì{‹ÑÝÇv<:uS >ÁWÝH¯ôµÜJ§º¥û£°&%Ý ‘A ·D‰èX9±ÒÞ'TaWTA‰œdC…XÝ£¹8“0ùÏ7É‚ˆ¯qRnÿW›ò>Þ´F°íÁ«X˜»¸—«"^”§}ãߋߵ›»áð/¢%úïÍjtÒµªP²ûØí“£&-hM&vØò¶ÚtcÞ ©VÒ–óPº—ô×e{ê×U ðÚ|,"TOêñ4íï+?%£µæ4hï÷†\ ýúŸå{‚ê6c„Tçuhœê³óÃÆÃ%?À¨âæÀ5cú¢J²ûS¹Í÷Ä*—>’Ö?Qél_í³rg#,³|5¹¥+æ¢RO8áUúÄùÜha‘3œŸê¾?n¯{/ʦ8øqtÔà­H™Sr,…M>··ÞÂ*üp»ºžSÞ"ð˜{Ôœ½Ž"«÷?ÓS ¥z¦(¬Z[Ç]…‚`Z¤Îà}I sú/^>Ü*Ï~äP‘®ÆEI¼:b—4Š_ˆ½¾Æý.»x_z»¶£”7©¬Ñ·-ÞT|Sm·ÙVÞP¢ì€w‚#üŠº”–¹°â¾Å@A­óI¬òáÝž¤cÑòÁ’0$5&„¼Œ÷F¼¹é…r‡8Ü ¨¶¹cäoÈ®ä:“ˆÝ³²ûå#çŒì­ýÑzÕ÷ð¤‰ÝJJ°¡_ÁË¥½iã€aÊ¡¤ ™>Y›sÁ(ÖeÓlÐ=XÒºZ¼Ÿéw+` ¡›ù=·ìO axuU©œp‡"ôlÛØƒÎUÁl©Þ Y¶1ÅÉçdÎZ.ÜXÆÌWã¶È"Do^Þ¾rM…'‰N#fí ‰.\¬+GÅ_IÖc– @¹Gäsæ¤WŸÐ.Ë~'r"¿»ºo¶˜"Âp+ÏS}êÎâb¾¹c‚X‰K²y4ƒñùK÷¦”•ÝÈ`çAE¸EQjjŽÌËùµ…§cË"õO…&ó"X„g@U{ù=‚w˜Ù6¨»1I”/ŒZ2“Ê7”ß¿NÇo¯e;AÌ«}³¢úµUç‰íV«Á°‚ùùVÁñ8Öù2Òb–”Y#àæÖ•*i×Ðhí¿–È·ÝJpøRÔô$}½6u™ ¬Œõ™$3z-÷&+†=ˆ|`÷ëìËÕšE‹öžì/9‰É¯˜g)Ûî“pàÉÚ$)ÏíI92a£o{¨4˜~V‚騈ÅÅ¿,†H bE¿Cv•ƒÖ½–!sKããÕ\ÅÏxq§.»ç( ¹vûZ¯0%"ª­îÛð«„ÍÍ…Pädú)ºÌ75ÙÝc\Ô¨ÌÎÕE~1!ݹÙ]|q h¸C+\öc)ˆ÷Ä?Î&¤0ñ{‚<{~î4¨â„µýŽ|0Ø>Aè+´»Âü>ûsÿ˜Æ%£PÆu.$x|”1ýe´ jP…¾—ËA?Z(ìÊÒ\—É·À…_!sæ30Eªº©Xó¬ìYÄ¥@·-MÇýJú™aÈÃékÔ~úƒ_•y¢TÄDæ][ÙáuTÙoÃ\ž†|ªÛ–W c9þ–›ý'nnS$™×דñÆ©´õUxÿ ¡L­¥9¨zl/Ÿü&q!ƒˆ—ÓáõÙ›ôΞÕ}¢-NÑ/ù@™9z yoK+!PBƒK—uE˜Bm/š§{ß*úGN$ZŽÏ‘Ö÷65. q‰;~8–"Œ@:d&µö¡«_”ï%ꎵUJÁŸùÉy“†Š 6Y_—Åwva6u„úéý‘ׄ{îxA’ÌD¥W9"ÅõAnœ®¬Ï5Öñ¦ "t>íËnæ…e¾nJi~Þ¥ðèG Ô —½ÂÁ\S]vüG–íG÷h\Ÿ^ýQ‹ðTù²9Ï÷4Œô`ô….u”†k}܉jes.ð]6ó:Ŷݪ>˜¬l)­j—¦óѹ\ûùksÛ9üþ¬C¨ùþÊB“%RQIá^E”ŽC2ݰ* 4s\X˜|üðÁ’O˜é›(|´!ëyEžìEN“dÔgð#û ÖsÈòÃîL-Mò?MVJù'_PJSì5¡[;È>­æÌŒ7Ìá»-lÅx‹ïå÷ßšÝÞúðñíí6ëïìYÊ_ùUN($ Õ2wàè–Qîr˜ŸÃ-§s¸ÎÃy N'³²Q%ö˜>ÂH¿ðƒÂ0ŒÍA' ½›©UÆcqĤ²†FC·’ÊgŽªacý#~ðô+ÓGñeA“N¨oÈœz7ëìÛ~ìW¶Ë\q6Éüôñ#¥—H£}8àcuâX½$ŸÏÙ¿!¢o£¤äWÊÿÎ8z=þ2tbPùßû¢†‰È£;–·¦¸È2nrÜjã ýò;ö2\SŒêòÅ6i‰µDœ^TÝò!ôQû­ê„%ãÊi[=¥Í›jc?iœÅýºÆÕÛ8R汸˪ö‘ƒzh¦ïEOƒ\ÿ®z}°o۹߭ù®*6$R:†bfŽO„ìÆ«»³²øÅ[½ùdÈó©Èê‘2Â'®´òtéçý6æ³y;Ì‚¿Èë6YŠÛ`Ú?E›èOë¶¾ KçÝ`.ž³:"WN¯%c=t™¨B*ª2VìØòx ˆýk»iH¥0 CäMA’„ÞŸCþÁÃù`ºÅÊ¶Ò K½D0€üîôfÅ`ƒÔ9Âú»JФtf¾ð‡‘g†§ºžw…ùÍR†„9»Œ”*hLñ+WšÑl!V3í}pþàzÜǘÚµ!þ§t¢øô|Ûï ªß­ñ˜7)ÒñÓ¤µ>Ðqš~†Ð1ïUK·µòÉt¸ƒI\Z‚¾°ß[’Y£ÇºÛ»T2±¬Yù?=²à°<¡½vµRo†YßÚž<šÆ`CiŠ+‘¦?êX…d× øò}²,ÉÃULߨXãñ]³P^QT'¥ lqayGéæÑºy"^ …6ê I¹ÓÃó/ëo[•×0>6r»‚HxÁ" ÊØ.)«ç@p'[ßj¹ï<½F,5Áç~[Zº ÑvªKûlñ*1cÇ”Öh”~ ñÕ(|³ó€€á\p‘Gw Ö)hñ I €îïH 9ЕZðèšpj!’Æ…ô_Ô. =ùºGFÉ_ËúÆÃ$ÙÚ‘. Yý[-k˜Ýãú/¦¡Q¼?Ò¾›¾=ð¾`çm­b—­¼+ä82öžUƒÇƒb5\ë"Ç“| ÉG»â•o?0qBŽEÃéðŸ%ﵤ=<êì÷§NZ<£ ]öqÌ¿B_ì 0îPRC"ÑYŽªÇWg¦‚1Þ§ïI÷¶ˆu¨qß(m«DmååÓ_Ù¤X[À„ ˆÞ¢”ÎØ³hš×p –Z­ølT†6Œ±û>µ×ÓÆmS°²„ˆÒC>J¤EqKo3ŽDDÑÛœßñ* 7‹´Úe£’¿ÓÔ¯WÝ¢_ör§%*<Ȭ\§»Žãù2ŠËZ®å\Ô¦ xv›˜¯Ñ½®¨Ù9ÜÆ|»Í Ãò#ýö$Ož–QÞîÃÌ…ŒŠó:ßóXeaùû}ÖëÆF€réþG6w„¤É–nx\—ÊóàY@ LR¸ª ËeCèc·G0“ä2iùg[í¨×n˜0Y¹4<Žî}jpäTäj¡0S´›t9¼^lÅKþ@sLg”ÒÊ&µ°ð­ €û‡IR½ÃYz­[*wºêT»º©P“’¬ÎÙ »¢;•²aݺþãZ §ï1•ãðYE½hÈ!¬ô–`?A™ ¾–Wñýgól"}fÿ…ÜpÉæ1Ú¦Ú“ij_OêyÒ08üŸ3D*½RðÝã÷Ïú¯Öþ>ÁZS·’ÞKtmÐqH$- 1XÈï{Ñ4Míb_„ëþbN.›zÍêžý1lô&¦Bu:¤¤í@ð0Æ‹ˈ·PMž` $è ¶4½žçš×2È:œé®!{Ereðœ/í|À³\‘„¸§6 ˆ§‡)äÕEˆY…D#iÙŸõcäXý …V¾Ši÷üì칑9 Àü˜GëÃÙðm(î»é|a¤¢À+õaG̼ä¾ðD&*6'ö/ç¹gå6 _˜“S¸Ý| ^|÷²5…–Uu£G×ó®·k‚Ý÷JJH%¿¯« 9V‰¡ÈËù1T@R•çGSIãqry§`sò(¶Ü†Ô[èY5†°QàMÇÒËq·þ^{%XòH:ø½Z‡d?~{g¶Ÿˆ·ë¸ÀÈ&;÷çÙmÆ›‘Åá•K…AC=¹ëˆû&¦uiýÅÄøÐQ§‡»âxiA,é÷r^©ÓýA§N°±} äõ)¡Á±¡•”“¦ˆó~Ø162©QùÒo'¼ ÆÆº2¢{rô}Ý “>`çöÀ:ê‘`_,‘›¹jZEéÙm5‘ù]{øÖ Ìt4KÁ˜½§ñÆYÉZÁœ'U‡ÝÚ…û§ÉòGø3n_›†P‹Ý G•N`Ñ\ã¯ý®Œý_ÇLñ-(¿::ˆ ñœ~ߊʴgM\N!˜ Yj²Ï?+4/ÓöF:YéQ¥Ê˜šz(çÝ9¶'«Ó‚öc¼¿/„#Jv=“XÓ’FæäëÙód²*vÅaô˜¤Ɔ“XÇ"¯i e˜9r¢R|ûìñæn¢ÈëÚæºÖL Ð~PO×-8ë ³H¨£•Tµì?Ò§uñú êËt©njï*Ø(Gá¦ÅìÕæUA’v‘bˆK3¸b¤O^z¼P{ûqésÜFy±ž¦íùP9*ðîZK‹@ao…ŠV ÙÆÔ·¶¾|2þÅP•òN¡\[;šÄk"·PqÏMíŽ9ÅüI_0$wgR¬‹ófΛ›åj#%‚œŠç~K óK;ÑéOÓ]‰?‰:×uˆí?¿µlR m¬•cag|Êhì¨G\ru]:ÝŽÆ_Wg|Å‘‰NÝ Æ©7)­ùñ"òu³œžä ñ[œb«Lº‰ßaXÄX‹`]Ìäˇêܾ0P<Í7m®„xyr¡7ÐãÖ¬¬^XIªþiïZV[àvÖ—Å¡q PÊLY,UQÓÇ ©Ë,@ÜÔŠ1ji´|#1A8¹G(¥í«{ÑÀùM5iÌÓÖ'a23:÷Åj¤©ªÝ¢bl¸n_ߺleë êEâ\S”ÏÉ>øÕÙüù5çõCÀÔKNýËþ¹ñÖå +V '{²Æ9DˆÏõ §2!Ï3¯ßY<ªz‹ªU Îo_s\ìV×·ñ<4°/u{X@,DH,j%ªøƒˆH ï°ƒcB¡ÒgˆÚüréjs;tôç¥],'6'téJŠnC]ú…9j‘j=vÀ0dJ-Ý6¤t«ÉB  ¿ÊžR®$i‚« ±©nvæ¾§ÑËl§_0ªùegÃam,Žz~!*Úí!Õ4J€eMv¨ûŠExìd¸Ê@=wu{èPý‡uÁ­~ƹ?ÕŽ2e¬)]òØ6]KƒÒÜn9Ça¯¿í#Áý†SòFÙ¢g!X‘uæ­ŒJÙÖŸw®}´*‡øqHl.´Fè=ÿó ­håjüúy¹`U9¿€$#Ö—)) ¦~èXv…“d¾I1,,Ö"Í¢z–ÓÞÈnåÁ4Ý4øÖúí´n1‰wáÍ€pîæ®±óà;!eG—,êì;01u3À·ñЗ­‡w@)b°wÄÂe·AÕ\§õüü8˜øBô¯ÁKÖr}©#öãz°Æ 3Œeñ’"ëÆwOåG\>þY"IìÏàY®ÀšükѽA÷<¨LZ v4oÌC½{a‘~&Bý`ØÈë„YçGÊŸù1¬¸Åoº§ÝÔ"DÆ­.IDoøJ2]¯øâT9ÄVü3þjÊxu†ƒz$²VÆ-y©mÇÕøåöž’KüW×Ýx\|‘„±á­š-6í$àÕ©²Z¢ »üí’‹’̨LÇRƒia½XÏÓ6§—ÏûްçÈ ‘ •}ÞËâža%äåKÈ‘R^*oúÔ/üÖëFq] ÑŒsy}Ê®uK€äÑa±2Ï>[Ÿ" [ qtíço³“[Ö¾ìVæ¼ £"†Ý.ö\««“ƒ¹ë«Ëó’ Îú ëŽTJ«ì.jÙ Bj ¥ú–êÇ"Yc×GÏË‘FX!)ZŸ WësE¥RfÿM‹vKùáÏ‹øRI³™¼ü·\«[kÓÀ­˜XùM¥¦=æAkõ¥DHoÏb)yEÀ/¶g0JhhDûÞß¾¨]4»ŠÊϋۊä;¬, ù_ØÒS¸üO8Æ`Gr Ô#—«Ô|Ù4Æ2¬C-“±Ž·Hÿ•œû‰ ÅN´¬,¹Ü—91Œ=Å* •H_oPRhQÁþŽÙ&­E5ÙPðN?¶ñ /-&5¦Èï׺˜ÈaP ¡Wÿl0æªõ‰Ð‡hËðRÜÞÌB{m´¬Hp‰mœ [Y b×øj§–ª0hÌÿ‡`˜ß÷1FàƒbÐß±'‘êá)Œü°ænÕ)¶y(³0|µÓáq2V.I˜15¦k¸¨:SÆ{ÄÒ¸,õ¦ %neîKÜoþÐIH ‹ç”ÄÆ t¶ø -#íx\%;•HØÁb_¨ò— aJ5I P½Œá !? èúhãkGƒ˜ÍêEUXL7ŸÙƒ×}à÷ø«œ}“]ìLVQ«ý/eŒýTp•ù”$ŧ̯3’c 'Å "5-gŽ­@•‹³ùeÜÝ´¡¢'ŠÖvÈm¼#ÙIMŽ]‡µ‚EÖNá0ÛÎR˶Vübïú¬å¨E×b™IýV+ù#…ܲ‹&ÊÌ»xô66£r ¡ûÁÔ#ì‹êxXÕ\F(ØR{¾éN{ÒòöîÆ‹Q»nƒÐnöúš˜„ݳâä?w(` ôå²úÉš+EϧVCŽõ©aÈ;£ø‰ p È„ƒ—cžã‰žù?W)eFcY÷â´Pw¶I9¥ÀÏ~‡Œ6tóû(hþM¸’{ °šd¶KãkÅ Æ'+#ŽÚu-œšFñ÷m4‡GäZæbPBHJ’šhüPÒ´cö´àø-d8…ouˆ¿¦^úÛN‘áI 7ç7Ó¦X=†¡Æ"¤¿}! ²=Âß}†ÔôQ^È5Ûßüªìù/¥~û$`ª8”ÿ§Ãàj‡ZC(.þPõ…?ê¯ÔË3·S)EcÚÞ *2ÆZ<Ú‰ ç1–Ù<~1DQü)$LÕ(·w pŠ•dæí¡?—+TÞdÄêW»¯žÐí‘J‘pW U棇;¶é°ð©|Û7Æ©®–¡÷ÀOQr²!´HûÏ8ÍOš#»Dc¡ï½zîÅ~ù#Ë'ªÈâöˆFKo¥ ÔIA)tTù¾#OçsbÔ¤õ2Ù€0}üô"åôÔGêÄäßx Qgü?;÷@!Ü<’9ØÑŠš'c3¦e«ˆ(°†}d¦òª<Ñ3ÎG­ôÜ =Á5ÌÄ6Ò<ýÜNMíúRQ”ïÅ–²÷Ž0Ú°Ü¿lf‘ñôfiBüíUÎÁ( jižïí ¨dù™Ë+  j±ß~€:à;+‚5TEbJ?aÉ›3ŽÒqS›#]ûÉÞFà÷`'ï1ôÇÔŽõ°Vr$m•]@÷ªXÈœ­Üùþú†™Åuä-ð೬dȶj¹™šâŠý2 sõü:s©ÅgÎÆ¤3Ï´ÅZm³¹›E£°˜5¬1ƒŠ¨¸ô®4„ŠIYôp©õ9ŠOxŽ“ª™þD—MØ•:¿(÷ö[‘½èz­*ÔÈáÙI-éá;°%#(ô!ϪÇíCàæ\+>ç„kg%c\rfx˜¥Yòž>o&BB…™ÔÙäåWĵgïXÑ®¿™Dš²<©ÌZÑ´Æ^[‰O•ˆV}®åG5 B$‡óÛk9oL\Á1ƒ+hÛ :YK£ T¬OeRâÛ³?ytŠG±Éo,hÒ}xñÂ) Ô*âá¨ÒôchT}†˜ÜWë%!X:Œ›'®Ì·H*à~qÏ.hj/X`¦…ÿ÷/! Ą븘cz´UÎõV<ÇÎi¡p*l¯ä.´ô&†{ýM;€ø#'û•Éy‹—“¡Ð0ŒÅÇ[ÃR½ rl €ÿ[œ±n5؃M#<Þ•À»³°à*Ò­‘D&îÈÅÞÑeqzæxÖUHbHHØ&Îl±x-b¿é·WT°¸“5áb—¿C²AÖä¹67äÈçïh௠Ã5—¼in¥¤1¿MœÈ’4¯ãfíçÑvtÝ!!ˆQ ‘Î$ÍÜW=Z LÑ8e¤•éu‰Œo£ u>`˜25–5%4öiRöÙ#\—põ‚¡7×Ôkè+ÙW¸;EusPÑ÷ÔH–æ~‘kHèÉPn¸ßbq™‚ÌÊνµ!„ïøpºv(Bÿ£-a‚ÔðÔ¿À~®ydÂ5¼ékr3¢ À¦4_#aÑiiØÒ.=Öܖ6&Ÿ*ýžèû­Ã¢'ˆahÓ!“w ¹ xÝ Í6žI9u¬YPÅR¾Ó¡©]:rkV³*c”BjBáüôb‹±ÎÒþ¼UöH » ¥÷ks¯·ÔKè/Ê…My)l·:'E¬¯cƒLÍbûŽ^MZ½g£@1¿%¬á×vuæ ž}(¤a.À~àØî*âSe¨™µ³-¸š~ÉwP§lu'(Kr·ÿíEŒ'¨¶â C¨•3‰J'ZI!i˜-~ÀŒÙ3C8¤À·’!žRÑÓVò&Õö¨à[ˆÇ±œ±þ¤ LJª¦ Bñ;ª”ÄCúM¿õžÅ7f¸¯½[N_«YbßmCÓ‡É5Û•eŽcÇÐË7¹¸J!Þ“®qc»þ|3lC&ÁÌoj2örI¿iÙ W¬»ÔSëw¶tžº¨®Òýw'ÝVIó¯…hW„þ¶®\8…¸Îô²0ý5ò¯w¬Ñ$¬æ«áh»ž‡¢ŒÖeãqy» t‚¾6vA³ñ9¬Q¥™=§¶Ñ~&*Jv·6Nâó>÷lmŸgµIðäèü—ß5¤z.||2šº€éé?rQ¡ŒÝ‹xö{>J4qèQÙ Hç2Ýq_ÑoàÌ4„Á”aðªog^¿²0Ü{ £ŸY5~oé !;ó:ŽÅ±<#Fð«–X1>ÖÓjò½üIù<5­{fº†í1‹Ü`à´Èì šs¶}ÿn-"îWBâGUÈUEŠ îJ ã H£”"l ÀÃUrË[X†¨—G©EM^ÿ÷ç ×&¨p8:ï¡Í]£–íð.ìýù3°%†ê¤<þr™aRöã½ ¬‹NÄ I‰ à´*K¦/8]€'Æ›´\Ñ|K§Ï÷Ín7ŠO£öL%ò«¾9U¹^ÅØÃŽ€§d®V«‰¾C7úÏÂ"kõ•¨ò{AfȆÈ]>ä§÷©Ù2_©gž(WãÙÀÜI¦)iÕÑ×Þ¤õÊ ³3ñ¸¤žåDÂ.+ŸK¾÷˜" ¶1ªsÏ æÿ4a¡‘ãðSˆ¦^±®€tarŽŠanCß \¼›bÖs…Ñ<å(úQ›nŒŸW`MecÖÃ>¼.ræ‰ÕÛÂQm$Í³Îæ<„Å®ÔWq#ïöæì‹´sef¥ö RE«Úá6^RãÚ¶HMSVÈmõükóq¥?zÈŸpÑ¿DJ$\bÀ =3»é­Â‹mb顇°¹ŒL{Üs¼¬I²P†Ê÷‚pšrxæœY7_N­ÀyÝb3¦ÛËÌ®î ¸Y±•4R›Éf6 ûG÷R ó­¦M—!¤]É>6p"Û¬ŽrqËnÚÈÔ\ç=:cc[b“Ç>iOw%¢kµ6tùÎ÷PCg9¿¤÷ö%Lm#ße^/©cépˆóòBÊ•m¦%N1³Ídõ­RþVË=OÔÚŸªŠN¹ÉˆËãìÔXÁ³€8ÀŸ þ‚-R Äúµ†Y#HT5Xi—ׇ)Âg L€ 0ì?|‰[æŽ%ž±BÌÜLôȘ ô½ÜW¹ãó’Z*rîTœž'<.X÷6Hà/3ã0¡.°DèoàÐk4†Iî1­öŸä,sKïTB]Öp”m’\ ç£z DRÌëÎà¼öGÂÓWnÍÔ°örY#ãWcH£1KªSñ¼«lë°mÆÏ¨ l•ôáÞxåKiäÄ-ð¾ˆ1$9˜éˆš5Ú`7ôÑv¼Ù„¸ýjG.Wvž½±¶´“xäi˜ÝÍwÒë¶ùÚeÝŠ•³¢óîÑVuDß 4;_ªÀÞÙE¯a£§ÐU§ºf§Ã¿2~bÛ‘•úpëC †vˆÕLØmX mt¡óFl›-w_òè€åJ?e>h ‚ìÖîNÖöÿí‡.HòQ•CªeY›Š ïéñÙöªïrsû>åw:—ûh¦tó^ gF-cEjž˜ÀçÔ˜dcV‹¢fLR`ü¥%<€|臋À£U(œ‰°y::9ëvÜHvç 9^]˜Š¡ ^ÿ9I*×7?ã0k:e¢”ÞVåNCYNj€äp[nf?wÖˆ ×ë´YîÁ=ô`QÞ'„K'¾Ä¦ŒÓ;Û|t…øgö²0¦5=¥;zÉàN]q¬]3ˆzL†9Šõ™KD+¥G}MtóЇŸ°³áeÉ÷þˆ'~ÿd 2 endstream endobj 184 0 obj << /Length1 724 /Length2 13063 /Length3 0 /Length 13635 /Filter /FlateDecode >> stream xÚmyct&ÝÖmluŒNòĶm§cÛæÓ±mÛ¶mvlÛN:¶:Éíóž{Îw¿1î¨? sמk®5FUí"#··sRqw0e¢c¢gä(‹+ 3122éYàÈÈD€¦†N–öv¢†N¦ÜuS€²©€‰ÀÌÈÈG±wpZš[8(©þ Ôl M,m-5{{Kc ¯‹‹‹ ËOgz 3?ýßEʦ¦' S€™¥)@D^ASJN@)!§ 0µ3Úœl,²–Ʀv?M©fö@€Í¿€±½‰å¿8ý¤ÿ‡€‹)Ðé/13 ½-à‡˜Š¸¼œ @L„AE`hg•ü»ÜÎé'÷_´©1Ðè_ÕÑœþkÙþ×2ú¯õß,Ðíß=ÀÄÒØ `djniÇð/ݤìÌììÿ›8;ü'õ—ÐÏ¿ü”5¤˜˜šýE;ÛØÈÚš(EìmœL€ö&¦@;€’½­¡@ØÞÆä?PC[K÷ÿ/øÿ"¤œ ÿŠ!dgþW>Ƈ,Š[º™š(X:ýÕÛÌÐæ¯NÿÄÕMÿÝœÿ¹¿é_Iþ6ÕÄÞÎÆýÿnø·’¶cÐÒRW”•¡ùï ü“³3¶7±´3(;ý•ÓhòßÀ?iCËШüg Lÿãÿ0tZº´éÿ5!ŒÿºþcéþJXØÞÍ“Ž™‘@ÇÂÄ`bcáp±0yÿ/ºÆÎ@ ©Ó?šÿ­å?þ?³djêfj ·¶loÌd•ÚRî#V8[I3;m J³Ìº2Õs­ýÍrÐÂDÿð÷N7ÏÆßˆo÷bGê®™Ø0Öáxb2Š(Lw÷¥˜¤ÂܧfëM1ÿµ>Lï B ÇÖXâ:üÖ)}}-@z’53çw´c)ß7 ¦(ƒ²Ž~H”í¸Õ…; *] Ô ­OÓ}šj”Y‹à‚+#—½5°Ð¼À]„k2}‹‚r‡ÃP­üúK+°õ%Š^íš\&ã—`daó[ûŸ€®=ÙúOfn!ØOFX4ï´+~Š­Ñ#̱×Λça‹Nèx—}jéu)RÓ¨ß.Î<·ïÍb-·¥BL?/TÜŠVÊ/)p§J0òh¼C¾C©”jüŒXZÓx\ùz4æ-&ˆ{ÖÚvã™<ñLí";ÉÄ0~œÅy:Jr>ê_+?eÜÚj*¢_ÿs­ä‘e%÷ÄèÚä¼ýK«n óרÐ}¢uq Ì_ðŸú)9óâ×ÍÒîµ(W7z•”õ‡¸U'2¤×p½×aBøt•Ͼ¶:‘S #ƒòQPë”Øè´b«?؇´I²úÞJü/ÊbÀÚ Ò&Qâô<9²0.–7w‰jàqñóü‰Þ¼GæP<¹¿ Áà â,³»Ü®s¶*î|ÜÃ"I8 ÍLþŠŸÜþ‚‡m&¯Ë”‚›¾¼M°éÝ?«¡±•Ù«²Ê€¹*39ˆîflOÔˆ’Ê2þ%iaÂ’™md@¬¢¯Õv!wêȼjýÔQGKâr…0ãOnÚr WÄBbC—¤Àÿ´:ZŸùu1¢Ë±µ5è{«yÞ™ƒÞJKCq‚-µY]}d4ôÆhVúòOLw¨´5¤lŸýjsœÙx·ö@{§½: z¸'&S‘«4d… í¯¥ûë4_½ñU Ê`ÙBÕ$ÔòB°Õh||žšŸ@6y¥çtª™_ÙïJ¶4Ã)Yè Ð??ܛɺW«;ÖH[/ºÆÎýEñét†èáRª—奬)BSÅñ{vÜX¤ ú¯ßí·”œE–¥:|=-J«—'ô×iEkÎMrH²°䇂=‚®âj2%¹²ãñom*2xïЛ֔pq¾y °v_†yè[Úh¸€ŸU‚÷·)”$ ¶­h˜PsãBb’&+Æ•¥šU^vñ”d¾±8œüB¿”uXÁ™‚cηùqTo½±Ç-ªÔIé¢h:Úä]á°pþPµïÆ Mv ƒð`j¼S&Šmã8iÙÅÁ’‰%´É•Ê ûîåt-Ölƒåý;¯©0&Ð<·[“s¨2«ÐÍø;ËeYåQ’@ù·ïÝל‡µÏ²Få§Ùt.iV˜ÜÞ¦¾ãê q¯îDKäÇoEøÁqSé ³»';^¶ð`ÌPa„˜Ô@Z •RZ–úÞtÄ‚F¥=n3roƒb=nœáh„­¼ qMA§sµ‹(~ìK &Ž5h~!çGËø]Ný¨Ï3¿œ€0œú>RÂL,Îî Pe“­àBLD¡{’w”èÌŽ {sjT ~ØV­gåyÊ…:½m Âmç„ÉðI*‡®5º¬Â)¹Db;aËàzºüÞ¢°°ùx?O¥´QŒK¯>q8é“”M²¤·ˆ$­0G3=ÎÑþYuéàÕ‡jÓ=ìýÐbšÜ¿|¾+ Ê?i„·^Œ“Jž‚NM’š–K‚OWÒ·s?ˆ%ÊzÄ!Ïð¶l¿æ1xOvUo,ñj–o=›9‘¦2»x³¾µbBî=€‹1›a¤B:;­Ë†â ÒkZ©ŽPsP¶]b/2| ´&×-½~3½ç²ÏfÄ9ɬ ÀÙ­¤·p‡‹!—ÕÕš£b¿:“ÑÅ(؛Х J(–ŽØˆ>=n¹§ò9ž«þDC2rJ¼æûÌûžrgH¾Yíå’uÏæN»hü¯5 `"kmƒ>$²­é>”Òë?‚>ì$oªó¬²Ó O»s`Ì«y÷¢@ê]qܪǖaçw? H†7è"ý²þZ\k£yŒeЕ֔”á"=²)8gj•ªBH<ÂÊܾóü5_éHé¼À×@3¡ÊÆI´ÿ=®³›¾²mí«}àT °ßñt !oó$÷%ýÞ’ŠþÆ×ѧˆv×9RïódãáèÎ0Xä–/GÐs¾ËMˆ.´V”Û³DS ¬ÍßTvÀ)³aÛeL®¶Ó³ÑÍKä·'x‹9x=û²3‰LP³½®hÈÿEÏÄ/5Z£9¾xìÆÇ"Ìà,Û¥mY¹gõ^úõrdߟ>oHxuzàùn„ö<ˆ7C2Å„ns’7“áæàlÆ1†)Æ r¾§½­R·I2Cï¶ÀrL4ìa[ÐŒXA¼pooÙwIVòa¢jd¤ØQÒ–´^„mìÛÄ©ZzšÓv³Q~£§?K ²±K•ƒP>™ky›¡Ù‡CAfGoXìTF€Û`×x½¶­¥“ WÙÎrV«kÇÊÕ+䣹©3³Ûáa40{œ¶J3u¾-×Ï×>Üñ¼>¾XÙññt·mÍš‚UV:Œ¹\nÀ‹óÇ¡êH?–Åòèâ*›JBw'ë¶D|ýa|]¾æãÉ3üà:ªÜ#ÖÌD’HÒâ‚…VQ”+œ;|³û0–Rð#ÔíPv¦Ñ‚p dj¿‡V}µÝ¤Ýï [—B®¢èj+†×b‡ UÐåY#ª4À„m¦ãx\Å-€=i™÷òfEÿ©­ºjÁÎÂŽûi÷BÓ‚–›%xhć”èŸÞQÕ×È9øEÀ0&”E˜öÙœÅÒÄÒδBzׯ ¢Îœl›º6^Jy(ãÉáEP·`KØøPÞµ‚8]uJÏ|;‡ž^¡0»–6ã;؅ň—œ`–Y Ê|Åvõ!‰åìU;#šc&›²)¦ ųö§ªVвüJ; UDâo HûØ€`·\q|Iz¬5—ZÀ Æî0Ó †Þªô«š›¶ aÿ|å(¾Szý”µgè9 ÃZøAâ:õ(¡ðÚ4‹wlQËc”è†[~}°|Ù&2¦›QÅô”4ªÈry-Môfª¥ÇÀçXzS£ìëòĦ¯á¼z«¥ÀæËòœõfùt½øfÌb¿ÄPž tŽz,:ÆSQÌ•*I-ïæö/_÷D‹Ú­ébrìüå%ö6ÇR ß9 nVÉè>ªEÓb_P(Þ^n˜(§þ¤ Ú"o>ú~KŠ ˆ¤³(äá¦sû+qgAÉ/Tñ²QµØ™$QŸrâj›â>-w„‡îfÞn>šDP*rXøš´fA¼Úbpz®Ühj‰?Ý5B°8øÍƒ–áò¡”ç¦e"³…~|Ä„ùÔY\…u™Q]SäyI/@ðáDµX ç&&¶ ŸXÿæfn6‘.i}ë[HS ý#S6j±¨²>)r•êòœ’<µŒ_¤¾'œlÕæÖ.Ëe-vÊè<*3ÏÌ$óGûycäÅi'L€—îûmQ\σ*,:Ôš”Û µ7¼ä8¡ÏiméÆùL®º`«ç«$ÿ0!!ŸìÙ@$ô7˜&²ÀåOð=¡\¨¹˜ó¯›ØUa˜tH6 >™íïhÝZU.¼†¹,˜3ãlîNÐŽ;œ?êÌÍv“0hâDLIÂÑËqZþp q¦s50ÙPÜÞ‰¹ådUx“>fÍ0úÚ/ÎÙ>YcÖ§.a  'Ö>ÀêÀìS¢ûËÉŸ¹G—AüNÔ{>5ùð휽0 Î-L2ó[>MW6 RIE¹mÑS‹,(ûêSþà P‹&nˆ„5qÎÖonVgÇ H¨9›PüÖß:@=pÛšíªJ!ø‰„3÷w5d΋͊%o¯¼¿ÈíÑ¿¢˜1$TvÛÊ–°×ý!3•õ srЦòý±àíŸAòãB:­ùkùݸ«2êÆn¨Ô\/îË諦&ŒÅá Fo¦˜]&Šè?»gcædk£/{® {Üù"zn`ÊIºD¹phcQkÐ"üÐÈÉm$¶ù†›S6C+Áu¯Ú2‚³S)˜ã"¶Mž,ÞxáD yp—ü¸ôç^ð.»/¹ ‘y½Œ˜Ökl%§ÝØVƒµ×BãŠÄ…nÀ€îèýS!ŽW´:[§¡5óÄhf26ìwÌ3^B’œWÞ1ñE¢&¢Ï5*OC©mI&c¹?4¶ûÍžÚÛ|ˆŸébì%í£‰Ž×÷fšwÍøN.ßåæ”ƒ£¨=8âkÏ” µY€Ãî‘0H̸’òß°_åàV}L>@ 7ÁI¾®Âo³÷±c±“™ík)Ô|ùèxïýßçbÇ“EìÔ5õ¨Ç‹˜HË]Kèׄ ¼¤Õƒ²*pàæÑÿœ%ä<”Oïºl—–ñè˜d«{Zs_iªƒÐN($c*¨q¾°…ƒYÛ•Ãïê º tâ©Ým-"Ó)Íùêµ.³°ÌF”™Ãµjå>*ßB y§)df^.Äk‡»rR‹»6é)#t5ÔZØõ 'y—~êåî]mÄBÀ0^]E`A·bT’]+@<Ûò‰µ/ìRxeýXþ˜ÄXY^ Lp„vs­ܨLÖ!û,prÇ‚;Iæ^þ–d FŠÉçŠNôÞU3÷«ñ>µ^z£Š;,)|ÚRÏ¡Yb càå  Ó}PûmS+3\bµI™úî‡.Ýïwð’Î .¡zHk+þ7cÜ,ŽÁ…Uç<˜…(§zÃ2w=ö<Ÿ¥®¼á$×IY0î ­ñ=‡ˆh•âí‹#"Wiг¾DÚ:ÝâZ@³"F.Z;_¦š»¸ÜÆ’NZ¹“^•’J«([¼³±eÕHx—¤ù Éym½:¡§ý~Öø^×XnNáþxŒXÞqUÉIµÑ ‡×ÔL@Î9ˆ‘8”.?<‘WoÿOJŒ|±™èš'uVuûð§2äè)s}4éÛº¼° ùx” *3â˜ôÜ+‡ ÷[:ñÖ5ü(ÆÒ‡ñcìdµ`TÏViÂÃÒîDy4ã‹.Ͷº¬Î¿í;zÑ8#±~ê¯^Ú³Œ”l‰vcâ];´6š:——ÂöIc&®KÏ·…ñžél½°òC#a:ß)Ôè’ùÔs xµ…—G»€è&r×–*êz>pøÚ?°ØJ•´ èŒÕý%-ËDõ¥5{ôŒ;DþÅç–ì:‘¸ñ˜ ¬ÄÃVß=®ø ÎÆÕ7T´ó46{j¾gŠ“@øÖ“~ƒÿ½R Õ¼®Íœø|ÄqÜ¢wß°FÍqnW¹JÎ8ÕâK‘Á’žÁ t|ðô.¡ZãEuF}—>(Õžh[w#dç3ÎæãÁ@B¶.Cg‡sGîGm%;Ú0•ž6ô´gpÁ=NBÑD™Ü £ÁK6ºÑnq¾EºëeǦ¾ëƒmE0úeuwÝ<œ'Ã44‡Õx¤›9ä“ÌŒ½€MѺMîhGëxÕ›s… Óˆ´ì«éópCÉ5Qì÷T°»KòŒÀ© Þ$-”<ªyçÎ0ú ¿¡u§ 7%ðÀeÀ/X4§<‹hèa!XVƒ›ˆŽÍ/¨@%,wzÉÁG‹ÀÌ)…U0ý™nÿèCÓGBé™r:ö½ºÌàsyÉÙj[ÇãS&±·+Z­MR!ƒˆˆái©Œú„‚Š÷¯iß~Љ oµïÊ„XÆs¡A>á‡,l‹OsiþÞõJ/ ˜Á¾Žª±üéU‡,jKv1GbB*Æ7:QÑ)Ãôýê$ö–Îû©p%°ùIõHàÙ‡7AÄ“<näZS ßÔ#4qO”#„`3*m]½¿fyׂ˜væ¾(e›7øéz?Š6È€*Û‚›æ§ Îúe›ˆ¶…´ÕTë¦ …Ak»F0È;ãö›€U»ôGpêË*!®ƒÎ®ÛkþîO˜&P¶Š;Ã×pkЏ Ô´àA¿¡ýå5êPK¿ ŒúÑÜJÅ-IV¹ì¹œQ—!W^dHÏ%ÄhOz&²ù’B²O~îðOÌ;l0ñß2‘hh]‘ð˜]çé—¶ˆe¶>=TíêxŠƒ™»«¯£cð«1iøÆÖ¸û² »]ˆ=É)uT“VÉC¾… ¤“ÊxM"q×Y•_,)þñ'­¯fNK<ÀFr)X÷:“Ò¾R[‘wÂŒ›w]{E±¡õiÍà¶'°/y†ê¹åù§%+ ƒ1yÿ¢©tdñævT†O¢½F¾7¥>$ŸìX(<2Õ›$#Õ›»ªäK^,TÖ1]¾AšÔ)Š|WùM sãÊîìþz*ø\²¾Ø ü0Û¡ˆI°(b9À4.ôgÜèú{v¶3«QLsÀ‚ER•øè®8"ÑêYùi9“×LˆÙ-ÍÁþüN­KŒTJzgófYöÅGgmkçDI_}l›¥@š ¤bÕ§S-[=N ž?}3­öX»òTÂ5¶¬g’wÿ°½gÎ2&ÏÆ7Gß1¬³Y„Aj—Cã*9·õßngšÙeˆuïÂvٌư$^÷ó?=?•Æ+UöÉuÎi¯]‚NŒk¾°OøÝЩd¾_´5r6žKÿV`·D (›n©fgGÁÆÂÖK.í{j«D4=‹G{žoÜY¨4ÑðÓd¦`GÅP<ÌñuvÓŠVÂLÐ91wG¾Öc”ŸÆÃtÁåŽöL˜L18ÐÛuÉ3JbS®ë—FŠæ’¹%I“< Í[Ø=¨A’B™s$c]NzîØit!Q’‰p”& ìGð±Hó}&»uÃ*î7¬;ƒ!£>Œ\u8· ÷ÏÉ&®'Kx‚…®`0ÅRø @Ÿ ƒêW&âôàŒ±øj#̘!Ù«ÍUnÆ-)áÅíÐûOÌGX°~³ ¦Ó=爯¸€¤Žd뀩4Ìâð$<évײg¤M)eÚM ¹0‘:׳Æm¥slÎ7æØ£œÊÐ&¶_ßåë4Ÿˆ@È&¯èÐãÆpT_àÅ…ŒXÅYƒb2i]‘ ‚Zû;–ŒóÍ8q™^땃Ž{ΦÅf¹WÖé$9 É÷»-A¡¹F–æ=:‘›D,a)Cµô â·‚»UÎÈCuì{e†4†‹•£Ÿ^‹‹Ï ¶Žùî–#ÈRyÑBЕ êg[Ó>ÛÁf^Övb×:)ÛKà©®kÅÏkl}>ƒÕ!u‚vK×9í™ø™‹ËÛV’ðmÇ—;)ÁFÁœzKÆo³óDÆE!ø7ʶÑZµ“ 6jÖdŠÂ-Æ–:¸"V[ò]ÚŠI#Ôe¨‡P!e 6%º¦}´›‘Ú.ýÌY«÷ƒ£¸‚S,|Gl!×5‡ûP {¼¡sà s°÷NF»í|)m|’ØŒãh!{òeŠ#‹ˆæ€û”ÆsAÝ_F†‰€"$€Ñµ5¨]„d °µ™Äüg‚‡õZaîî½Dq˜¨¾E'©ß1Sh¢= %4oÒ€’‹Mà´%o<÷ѹ•û9^¼‡ª¼dÊèÞ.ñƒ"MDψ|ßàŒ¹«ÎC…Ť¼}çžB©j{ƒè§åu!kl•“B°¸yò²BQŸÇÅw–Iixô0£m¶ÞSƽ‹}µ[)W¨{ͪïY"4¨wk˜“¾ëÊÊJ¢&t|ß!ù–a½TG"7GnÍ·å bL0€|«þ»!eæÒïc¾BñIrÜ…æÌ+¹!U¸Â@Έ¤Å¾Ã߼뺃 á+hÃY^(ç_{…+³@¿8Á³8a.R:”ótÕ)øñþô ¬‚1"Ëqä£pˆàüiöÇVŠÒ­ X&;Òdà›Öªw¨·YÔjk2Í%˜Ø¥¾Ôv®fÍÁR;Q£t¥t1¬Nª7¿%k[“Ž“òÓ™¢Ç6·ÒB¶ÎÀ#bÅITðDÈ» FuÝ4g#ÓÑÓåÅ€~N"„» Yô@ È{O ª‡}ãŠ3Ó/ø"¶k+±¨TÛr:/œÙsñÛNW¬Ö î~ÍÂ[ˆ¨ãbH+; ßJI6¥X £m8¤Pì(˜ÅÄ‚üs[Q@pe,*ˆxêzÌR3¨Pû\Žeæ|–_M™vÜÌîK“Ž¿¼qè}l» ¯©`²~1ÃÅÔ–ý÷ÉáŸkºU[k ^¶ô ;´‚@k‚¾?—¯ç}FÕ4FÍk§¥?Z6s ›µR?Nõt½Ækm‰fOëaõ—Ú4|…uú.° ¯´¹ÛR̦ åŸR}=œšuv~KhÅaIߌw‘œ.4)»!0º‚0éÅp_¾Gò4Q஢î…vu¤‹(Æž¼9kr%OIÁ>hAŠÙ¡ç~ÈËO4‘ ¿:ãv"rüìâìÎeÈA=qU6ªå•Ûã’v“n“çÓ0âKõ\±¯æ˜2ý3Âs²¢±LâˆHL D€j °køn¸±èFÜZ Mf§ÅïÒÂ'ßZд~a„ Nmï 5‚Àô!¦Î,Ï‚?ùf}bm“Ù›~ù«h$6¯?FãùOŒ£bóFËèÜ€v)ã„)QÏñ!uöãÓ²¹Ghh˽áö5´dÚâRèxGÞž´Ê¾Us±8y¢D;pJvœ…Qëúè­wÿúù•㽃sMçêèŽnÂãhà]GþsUª·a¿§ä›vÜ~7Ëw6z › ¶+E:ë€(Bc<æhà£Ùê Î¥ôŽ'èûí#ýоõ&9÷Mù¡$ä!6caЈ€B¹«¹ÙÃw…Á¡·Ç ³Þ¡–kŠ ª«Äfv£?v´b†_Ö)§ŒU™i›qlõÒåpøãØP ¹Èbè xæUíö„ŧ@D¤C„î6'J»೺¤"„wûÒÆ¿ÍŽÙn§M¬pלqÉë¾ gÛNqʦRÔS€üeP³:§ß‚/¿Î˜gâAˆŠòˆéRCðuÓ›„³æ„<e¶FHÊr(QÇ‹‹¬°/6¤„[»¯ UÚ¨RôÀö1óÖìÉq³ ÿsxšc÷©Ù4ÄÐöŒLÉ'0Ñà+Ùh(QÕ™]æç;©I`è­þÌÃvmßTçøYDú>Ò÷?¿¤KÍ…8J0Óæà–\ zµJ`6r |Æ`A„îá·”ŠÄAÖFб̦¨×{í|ðÄè—rˆ;Æ2‰TŸøõª?å•?Znî#ò¼B݃Ñrâ¼&Ñú2|Ak1Á“ŠÌ×ßã P PTÏ‘í)¿8s4©^7ˆ¾æw÷i¹5C{´ßÇ|§!2]Úö‚ÅB]‘6fu·¨šIO^r oliºuQiæ"  2‰Ì1ÿITù´ š–_ uŒ“^WeG!…ÏC²_í©¸@ÌB& ¸û>;|ü#Кð{§Å]nಖè¸ :ž~b‹pè«î®`/Ô¹\JS.> ‘ÐùïàgkÔ¾£Õ¹L=Ç%¡I´²ìQtJ Ôn+¹þuúåØÑ¤|%¯˜‡ä*z~ðµT}3ƒµJ=ÚÂEßa)AÊ`¨sáEŠu¡'­ùu 9Ë€û´ÍÀè©ËÐÚ¼ªÀUÁ‚ÒnþñšÓ€M¨ê—ZGQÚž¯­oÎncd·Äܦê£ Gò«_—5’±nÞœå’`°Z`dA¢{²EeúÕm3ëoÔ‚y¸R‰çwêBm,R‚ÒöÒXBCÛ]F›a©RlÒ˜CàçRˆ›÷æï>C‰\X—ÓåN´‡þ÷)­ƒ¾ÜEäúúÀû·to_Ú Â“DÕD°´Óvó°8SˆÓÙ¿vÍ£pb„ÀDŒ¢‹/ÛÊûF%?jå²`s? é°³zSÆ©¯ÞÊÔL;êʈw}‹žD=ØÍ²ö$áõeIŠ«šÆP{ö¦¶ûvî×P­{–È­åfðnœ`BYKV¾–¿¦.DX:,>c|£¯|É~‡vÝ‘( RóQá ™!&þA 2º‰ñuÀ »-È–A±MäMx2´­>‚Á¶gá>† ‚ê“/Ü”äû›ìÍ6±wvT§X¥¾‹˜Ãh Z.U¨h­´àëþ'ÖK¥™UTØÂÇœû5ùÊÍ|_Ký¾È$ä_ÖÂîžYG +ôs‹I •£Äâ.™áJÞ³§×ͼ²ßQ ”w6$u•nZt ©ìÚ´™€ïR Ö˜)Ø-ÓSæv:=6ÔñC”èGºÍKA–!ƒˆ{'6Ò>?­À°øei+Bê‰Ü ê¸´ë§³tœi9x«à×ZcçÂÍ.L|IµÀ×aÊnÈWΆ™ÔŽL¹¯¨ ¦‹øk\Rœ:pø†/èìµ±pž‘RvcØ„çÙîЦôæáµ0R;ßY¶Ô§ÁÃ.ƒ"U+‘%79a_+u_jÿ(ÒmW °bM†Ë‘Ö,%ÝÅj~{É̯˜’Xr°Í…³)€÷O[€¨cóÈ"Š¡h0ÍèCƒþŒ$†BP¬Að/\–ïƒà!¹4éË{iÜpÇœg™Kœ9ÇÜOH}`½Gà‹/ kÐ3×®-0û¬(›æ#y12Ä™\0צÚêB? ûŠ“ðÞbôà£HpÂdYøÆécû·oé'Iz¶™1öƒÑ_pñ>ÏÐî )ä ¸èYS÷}# 7 Zs}*üŠm÷3îLâXKH±·ÈpziKØrg›N.Wha´8jmÑ:±.û¥bÄ|t,P4ã…ñîy0wبõu1æ—ØGhçÉÜÜnQŸ+– ôÜ<3µ˜P°·`æSv¤ãê7‘‘öX}wŠIL3Ö-ò–‚åEÎ'äɺ}ÏþV윎uv ;+ßì~#ÝsCùGe7M^!p*_^RªÔï8„0idŒü|¼ƒÃJ´sµþÙIëè[Kç~ ÞZTœá6›*N*[¹ß²S{êbÅ9QÎ&ÌZ¬t;©SL}BçO‡ß¨O¤¿IÐm+î=ÔsaQ2FñhÙ:E¶O9ò‹‰ ß¶GKãÖ7¯\áJ‡Ä¦>ü:¼ä¾»ÖÃè^Ú».—Þ4vÏRQÆ8jyÝ{Îô«Ü´o“ß4¶;ž.+àq1ìïÝA=•sFÀä›—Í& ôÂTAß¶òÊèíš\kJ®Çëä~IZ׫ßàñ9D™ll6B‘[¯lw…É‘ô7_É[Ýf4Þÿ\JG#ÖxUw¨£¾ë]mä‘«‚&«·)Š1yì«¡¯$hz!´ÉA O [.gß ‚ìI½:a† Úî‘uºCí Ö8G®¤b‰®ƒÝæô®Eʼò¡À¥QÉ&7ü„l÷ÿö”0†¤ ŒÈ8BÕikW“ʰ¨.Ï&aˆŠ¡wÃJ'ß]œHûɯT;õQ…žvk@¶ËÆ!ÂÆ.ìF­xT›0=úÑKEàW#èÀ¸šWS€ñzý„‡€ÿ]YÕco?›L†ÕÝÓxóá'+ü}™Cêí¬Ùà‡>¨¯* Œ±Â$óïiô[_ÉåÐÙã5ÄêÈbí7A}îÈø‡Ê Ë…óÊÀK!–X°1:üZh‡»A$lØâ÷U)•N–âs®/|,A-vü Á6¾eƒ,R‡µ =y¼·¹Ü:"—½Üðå)x°ë̦@¥ÌÔKk1Œ¡¬˜Ð´1×Kï¥å ÁXÝl¡.ë9ôZ,J¢Ò3Œ6®N—‡²îzýìNÛý- C!Aç;Fâ€ü¾ÚÐ~³wµ­k `6 ¾ß|þiPmÎIÉÚÛ½6IŒËIJœ°³?„‚Êg× „b :ÿ.•ò튯«ÔµJZÒC-xTÄHÍfäœñ]6IüR&ÆÚAL6-H;WKõDÏh4ÎŽße7ÞPų¦º;r|؇mÚpÈ«»‡||™ûÊ!ž¯ýŽ“¢ÁF’V…‚¤ða["FÔ­g Ÿýd¢a•Wyd¢nÄKôõŸ[,½yãXÆ[ÔO&VùVÔ"a¡®‹g•,yÞ0ö&ie`ê]–Ø(²ž`¤yzÓ\¸4åÔK¢ó`+Ó‰ré‚ìVˆ úvé6¢°¤˜›³Ž€‚Ý­déÞCÓòa~AÿÏŸªUÌ «i䜿擣z¸² x€o7=Ö`«¹Æ·÷*{)!¤hŽ¡crB>·õ£ZQü ë¾2(öf ·Û5ÛùÊõ½ Ò.@sø¦­— Ø©®Ÿþ~‹Xa„§üûÛ¨û*bÍu”’c84õ·ßŒ.‘×MÃùOühúÅð ÊpÍ ü‰`¿Ñ–ÚÃc7x-ƒßwÖm™I«âÿØö™Š¥kÁÿ*ºpr!;¢ Ž3ØoÅwä[s€"©ÓÜ»ií2C2~S|®O’4°8P?ò2Ü]t“¥Ð4iÉ2‰O“ÚžR+õ…®üW–ý(yYáäRôhæíaŸ‚S%@Ó‡žý¸(£:3À‘Ùs*ô=ÜbH—¥¤±~Õ*O2[«ÃÀÉ5ü9m“êªê킺àO+3˜m¾åS,«½Uü3ù‰‡”ÁªGk÷eÞR 'Œí ²ñ×õ,ܪ‰+Ž‘w?TÙÍ B˜¼÷ü‘Þ!³2‚ 3*:Ï0)²ùùKÚ¬XöR} í)VýרèN†béwÁ˜xVºßr˜Ž‡7ÚzP#í3æÀ¸>Ç— •_ûž3 Q¿£Èjd[ø‰W^%:½ÄŸÎÖ®;çzÓÔT'n\š‰"Äu«³Zä¡QÄ ‹¹aëøÛŒµ'°-²‰RhLŒé”÷ÉzŠ¥Ç1²Q‹¢ËïÃ1PݲW/G¥èƒ:Tða-3F8Ô¬žf±Ëï· Ï'?ä‹% ì}T³¨Å®ù»ö#Cx=™Kês'ý¨sä]);{ž•-—ß2ÄÖie9¼³÷<9cÏ^ ¿—ñŒÓýàÐñì¿£u7Ó b9lªJ7ц V8xˆu“¾Z£)µŽiÞ«qm¨©]ã’eü?™Åá6±òGÙå0ØøŠ‚‡ÝŽ¢ù­DõnÙÌ}øÓxᨠÁ1Ð7`¾©u~JF]÷©Gؤ®WœÄ!gôõ ÷%ß­íP¼aãÊTÛŠý ð5ù;ón|-w0U¸Ùv^Ÿ‰•òÌÈÈ"Ëæ¾íË)ÿ&VÓyÝp~¥¿«yÊg|dd¹,Tò#ênG„瘣…ºšm]Ï*‰“}V»+'(÷Óÿ85˜ñ²¯Ù™_v3²ê|ª<Þrd/H‡g[ÊC6Êâ(.¡øÙ*žŒy¬~ØçÇE¥^lAèn'Ýðû©Ô K"ÿ^ÉüeUAIYóšUZëþÆz· ‡Ïl,lßµäÖ uð0,N±á„1ðg«íjpó‘+y ã3EBªZxtèÆA ”A°Ÿ¦Ã‹ôÑ›ŠûFó @Mƒ¼aö­AtÐPÊ¥jüÔp{ø%›1k¾chÅi- ˜s]!Üó'?y+pGyRoÞ~¶;} {Ò÷È­òôK6sXðêûVñ}Cæ/V|¢'%>Áû£Æš·L,G,À§ã—dd™Hó5㚎¶R¹=`®nÈ_­™¹=UWü#žI‘X-£zÛnªhH=@¿#ƒ† ÷·,/ÃtŒ?ÏžTPGN:/Gø+Ç~º”Y{áèo+M¦8±Âå93löÑës˜dákŽpéÛ‚d¸ÎÈèd¸ú@5O¯쪵·ÎåµeÝåeV¡‘\W|_ž)? ^µ UÙ#ԞƉ²M.0$Жœ!¦ÅÿÁ¤w–d â»)l1cÇ÷ CôÅ”, 0ò5TAг•ü>ˆ1eÙ+FrFµìgüY5EJ\`&cÃøt«\Mæ¡cdIƒWÐ ÓY­Îã|îÐfØMÿþ»rQM6ÕbK·Ý‡¨,}s Ü /•Q› Ym”tèë;lÓÇ\ºÉ8~µÖZ/|®¦2L UûuDÈ·ÀáŠØ—òì ë D¸ZÍÍïÚr >¡q%yÿËrI' PÓ¢…~‰íB*·M;uQ~NJ‹A˜Ã§ÂŸ‘ÂÄ ø ^5‘•V¾ú¬TU:¹Ç\vCgü#lÏì•L—þ8É5†X EÕº?Ò­5™«Ë®eûõª°ËHXc'æIϪÝHúûŒ"(¾.«N¿vè™§;"çÓâL÷¸ëRMCP¹ËŒ™sÏG›³Î÷—ª{ànÖ[ÉÈU«ÕdiZBPX¦åB\q\÷«Öñw]-§D–»8}3\ÇÂFìyqwÁ’Ü:Ö½BTq(ËÍPù6EJ#ºŒYòUØ|ÞõF²Ô0§\~¼š6 µ’êØí¥ð¯×v-†KcðE¿Z $ìƒuýyZg˜*˰v†‚ýô NOÕ>žˆe0¬x¥º Q!ý¤‚ $•³Ý¹ñET¬YÃWà-Ç‚×jHÎ8,Œ¥u’[­w¦I±FjèŠÓ‘©üôù0ø×)Ø?k(ùdôü4ek}ŽÏi‚ì±¾ yvñÆ >MÛõouP¯9,f/'Pìqˆä<¦ù¸ƒ$– Ie6¡q‹y H¶¼ %[÷¬ÉAE²‹álê/³‰U7ÈXQIJ§N1‚[ kÚ  GØµÑØBkñç¿ïL†\jç®~襫æ¹p#^·ï˜ÏýcTG¨Ê³ý1ØFä)!Ú‹ú"ÛUîE &’óä+SŸÒÏå§Y­´_àˆT24º2ÃD4  E3šõŠ…õ˜Ô0ÔGÔäZ㤿š¨UÒ˜9Ò&®Ùæ Ú­.ú$¥:©À½ŸYƒˆRrbL-8š”4ã‘åO#öÑlB+`§õÍŽ<¤âz´MszV=»âN‡{'ôz ùúÒÇÃ:î9¯“×ËÏ8–è¤lK}rFåâz)Cæ¿7H IŸ±zp~ÛvŸ{þ-‹¦Rdw¸ÂÙŸ‡dÊ×éÅ\†³ìh¤  ÁK–ätùÞRNÛ±Ùí›lÄÃZ-¨u(w_ŠüÜÀ”ˆžEŸô¡ó«|gAÐáÙûvr-óšjœÔdßÂÝD.*-(.¶®Äiz-¨ azo b"4ÒÆJ›/¨ *mÚË5^-Éã…!4Fó[Ì Síø¤Ø<ójeâP¬Ýaa Y„ `iÑ?HÚ‹? t«™ /¬[*óÁ¸f Bu! 0Ò’gÍ.…®3É>A­‰ &hPêטbºïX¸P3]ÌXß{5#‘sbÆÆ :q¿ÄQ»QRÿffšìåtfÓé¿U±eÊÔ·i:ÿIª5¾Ÿ\šŸ;5–vwY”#Kñéœä?RþÏMÕ;î2Ęm†ú˜´NPb'´~x`¦}á\ÜÍÀGéRpÍ_+;ž‰¸oÝa€à¸¯]O¿1(QšG¬´zjõó5­üâ? ;Ô¼¥‚†,e£Ex‰à G½!a›D6_M‚˜N4A&eFfˆ*…R\p²‰çJ ¼ªÔø¥Ø²V·åZÈ™| Y'ÁO:\NMË?¡rÚµKE9ó‡YW‰ºò‹ÁÜr„É­¢(<^j7@öµnzw S@œÛ·²ŠÒñ¬j|ñCÜ{ÿ\²’ó„A(SÞbY} 5¨Þb–ù‚,Ü:d˜–JÜtÈlvžñ£‡¥ÚÛe‘ú?§ÓAZ endstream endobj 186 0 obj << /Length1 724 /Length2 10162 /Length3 0 /Length 10716 /Filter /FlateDecode >> stream xÚmxeP]Ͷ-NpwÛ¸;www‚oÜÙ¸wîÁàîîîÁÝ-ðr¾óιu_½Z¦Œîsô\Õ]MI*é`R÷t²2²2±ðÔ$UEY98X,Lìð””bÎ@c•ƒ½¸1È ÐšÔ€ŽV6 +<%@ÌÁÑÓÙÊ 1¥ý'д56³²³rh:Ø:¸Y™ZøÝÜÜ„Ý\\™œ]™þR K ÀÜÊSRÖ‘Q”ÐH)j¤€ö@gc[€²«‰­•)@ÞÊh落;8lÿíLìͬþÅÉ…éön@gÐ_bæÎv uI%Eu€„³ºÀØÞ /ýw¸=È…÷/hêlò¯ê ÿZ¶ÆÿµLþký7ëìño‹ ž•`fe ˜-¬ìá™ÿ¥›Œ½¹àë¿Ãf®ŽÿIý%äò—€æ¯†´3 ù_´«­­¢±@#æ`çè :Ì€ÎöU;c{€¨ƒ­Ù ÆvV¶žÿ_ðÿEÈ€ŒÿŠ!boñW>–‡¬\$­<€fÊV ¿z›ÛþÕ韸ðß›ó?óÿJòwSÍìm=ÿï‚+ùg9f M%e1úÿöÀ?i {S3+{ €诜ÆÎfÿ ü“V6¶úwý‡Ê Àú?¾‚1ÈÙÊ ÇÂô¯aù×÷ëÛÿ DE<¼YyØŒì¬_¬_9<¬¾ÿ‹®©«³3ÐôækùÿO/@SøÕ%S¾`ëÔ¦Ð2?‰‚™rhú™)# ú%VðåÉ®+=4«K3à ü[uü䲞N6ŠaÚD9ÉX¨¼ˆuÁ!Š…õÞ;¡ENìÒÀõäõÙæ¸â¤‡R.^ÄŠëâËì-¼£hVw:ógaP‹BÒËP.pæ¤f¶Ouâä£5ñ®fê%Ÿ5 rܘ–3ŠîGŠO•ê²G­úðø÷8^[T‡#lÖ•õA{‰Z}IØù\gðplÛ`[jnõ–Ä8¨(WW‚Í´†V,b?hŠ.ÿ÷j9–(ªm=é‹1Fj«KÑòw›™:tô#x4 Þ"<·j)h ö$é°×&H·-¡˜.­p†ÇJt{cËþl¸}IÀlæ¤V³’‚¼-ŽWcwÓ³/£¤Í’¢à›ø5xóŠ…$¡@PØ}k*ïÆÍ4Oµ*f<ò´;$óæOϳ{F‹¾|ƒºüpôû³ZÕÒäZy:Âg)Ñë³91VJ¾ÔX$ æ;7ª*œåWÙÁÃv¼’ü Ì·tªQ†Œ"¶Éõ{_?¿3QjKL©hˆ+‰“>fÉÙ!hóïÙÉšÖB G“Á7S»3†¶«PaoAHÕSOIOÁEšt+ò6Z0 Q{–Ï9Ò¡Ý_þž‰½Ó'_¿sµ‹±yŠy\Ã9¨é. CrËBŽ;toÕLáï„ëW2 $u§çNâ¡†Æ þ®‰®™Òï84nŽõIA¡'Ÿ-ûÒ²`8Íò ¢ùëc[«n¸ ‰®aÌå×{¨ÆgÞ÷7h§Y¼™™¢q1é«&&9Ÿd±þ’ê[á¥ñó'ÒY+OÜúÉŸ„,KZ®4™üàTð ¯d6Àªñ|æþúî«_¸7r-Ói »D½H; mMÜðwz"Ç®¿q½Ã°©‘»àᤸûqìòzQ6ÔyÌä8IŸÄ.æ(zƒ$Sü±ç22…ú Þá0}E,ªÌ›¬Õ©âI¢½ë×(0)^¡lÔÈ‹wç¡Cḛ°T?ͪ3J;OÀT¬{(ŠÚÓu§ßRý(Ÿ³ï¯¤#ÀâÌ‚õ°ÈOTÇNxj…™žW¡F™ŸÛÛV,¬Â8VD³‚ à¾ÛõAv…§Îs.²EÄàØ}`Mƒ'8iŸ@½"!@ƒ35E® óR$×/òPKÞ4ü,12g³5Ÿ’œ5ÆPDR:²ÆcuÜU)þê>1HvlÃ[ÀðÔâÅ[À€Ñø‚Þ9>7ÝfRñëWòbH,Ô%Qî¢1ˆlºÇR‰å$óÁ-ÆÓÓ˜êÙ—›Uã¢bk g—¡è³``KöåC¸E“0q瘙ԛô[äNì*ii üõ6ße‘Ù¼¥óá©°ôþ€-Âõy ÛøÖwÌQßdèÕ£á³Å¬W; V§mý•ñ'ŸJä-D$èa Þäž# ?‘˜+tm,\y`"rð«÷WûŽøÑ}—¢6ýŒ¹+“wŸXýv®Š—³7Æ4’ä³Ým˜S M¹³/žéÆ%™ìQnÈiú±°‰(r©Á÷;ŒyGðkϪJù§ø"§tKÉÐ8 Ô´¨î̲1Æ Þ QuˆóH‘_ØÑ0lí¼K‡`…~>³í1aÍÕ>Ç huŒ}W÷Yíò1m¸lšJ9Y%‹àEEJzóûÏ×ìu×|¾Ÿ`’>Ùf?ª0„&Ïê¢r› ÁÅà~ØX¸Ñjc{T„ÃQñ”öuféèD†lÜSf»lA“0QFCnò¶ÿdqO.‘-#8‚·T=v§udÞ§ÌÑ Äâ£&ôÅÝEõã;IÀGFuo·‹KqæE£0³,$Ü7Ï6 ¨8ìw›Uj¹]5ÈÍŽ¢¼rC$;_H¬éÈ‚’G1†Ï|ÐY±Töè¦÷œ$w“†“ÄÃη+„dÁÌgdE}?@’_4‰ºôšÉ$hI¬¿íñs™ÌmFuäÎÐGß|dšl2?gǨ\—œ.i<ÁSæßûÞºyÙßݺÒ÷Äga+ZGb¦aŸ·—ô1žü3AÍ×O,g‡óæ÷NÃožo€»¢œR¥-z¥mpQQ™ÓÒ¶žµûVLˆ¾ËÎýÀÌœíô¸>Ó>ó¡‘Ö,Ûêùc\¬Ìn‡DbßÝLÐŽF@"‚0 «$:ÐFsèKÃæòœºœ6]™ek#8Ìùß&Xšá7·pàçao‘2-$Qu¨aɵ;V’6«~¦þ>¹è'5ÑNb`¾Ã_Õu òf9rñ”¼H5FðI|QÄõ¢^c¡fïÀÝéÜ~§?3˜=Ÿ¨ä'ž@…¸Ø?ÈjQÃò}ÕŽI2šÛ¤1¤È$kÇlv=¼Ê߯üµ8±{`Û0ÏuªÉ ÷}ÊÊý[qÿŒµ.ì T¶.*£o‹| D‚þ¢v]Áï«.‚8¾¼)á$SØûxˆç#’6i,ŠÊ½©ñ4maïN0‚ÞQ;ÆÝšÑ&óÔU€3áF¼l]‡˜ùäi‹³·o±ùéì`´¿÷§y…<º!å@ˆt;aÃ[Špn½  ÂÙù­¢Ì}kš^e Gj¨°Œý€Äµ‡€ÓáÛ€}=ÕZC[hóäWÌ{(߈wŸi±ëôZbD¨Ùk¥§êèÛØ®læ ÕK´KõÅaÁ6õ¥Áo Þüg+5…C¡œ›h¡ž‰öåRiè›§é­ÛZš±À¨‚=eFP¾XnSbÍŠz๥ã™ýòo4ãÊÙå­å) SÇñVÑ' mª›t“#P÷N‘f…C ‘…”Žþ$Œl!³H³ÞÀ´›fiÊ6hË•]Bª:i ¿ø"ÝóеmâÆ©n‰¤z¦à´ÄჶҔ ÖJ/ÿöƒêº)/Ý0ï¥ÕU!t†Ásx¨:ï>ì‘h£õb:¶}'è¹lLéˆÉú¤wŒÝoÉÉ. Û»5´) ¿”ess¬¹“ûÓ§B¡¥F=¶yÉ_Çïþš†g¼êGHJ@t”-ÁHÑ'åGÇ´çG6yÂb&Öê~l6X+Oš¦û3áÛ€C͆’hs ¹êo ÜâÐŒ{³B=äƒþ@§ÄðjDZA/(ÿ‰‘½wˆ°þןA*¾f²¬ ¶¶àls)œF'ç¸ÏC7½.ÅI·À½§Ò5˜§Ý=gã&—‚ªñFGø8 qÆ6ª¼±Ã» Æ©€¤¢ƒyÕW¸mc:‰}§«Œ’m¯U(»‹ÜéjÔ„GÖ>ÝcY[öM×i§‰±¹>$pÀœj¡ p¡Xð… ¸T²j¾råZ1ü^8ù&³ÞÜäqqµ£Ýw:p]¸Æ@ðYMy1fɱU ¥½#&wFÙ}–þ½×L3—Ž º:wÇ]Î5Ôw9еÏëÔÖ ’hps@zž9sŽýσ¨ËŸx“xïsRoœ $(¨W»¯tm¹“èZTñ1^·X«<Ÿ¥Y^|Ãñl—ºMñÈ3”pš£~` ZØ^Ö+qÍ}¬(ô“¿É\Ek+ãWí¬¿¡F4hÙe8w°¥séñkûV܇ÌvX•QMÉÛïÕÀËÙíLÝ>Ï [. ¸?9‹JuÃ-å]F³× Ïž/ãv)ä褙i~ñ'Ý2`ÜꬢS<T –©F6> Üq^Óï[Å«hPótx'ý°Êd"j1}8ÄJSç pòai ÍC¢ün3 év΀¾øîî˜Ð©@­´@£$Ç뫷ĵƒÐÊ-ïx*å¤Ê‚†(=òpÄÏ_|yçç1G~t³Y—Äk’æ,€ñ5hŸàh±b°"HŠIyâì dÔÁ¨Å)¡°,ÁåÞÁZ_´“¢‚è£.[8[ÜgP5¬63“‘!ìûö¤+q©ÀÜ—> '§!Á²²OZî^•B‚H¾LãAÅ¿6F³oXÕ÷>C{…S%­"oiÆ®õí‘/œ[ùüå@–~HUÂ9\>ÿp×]PÜCS ó#3ЖC«ê7õ…©ï[,ž’L~QæeN X½¢yåÁ@2sG†l\ÞgfêŸØÈm$‡`Žs)"ƒ‹'µÕ˜½/þŒÅ}Ø"Î{ÂüŽý†²…UH íö…>FÕRü8ý[ʱ|À¶ˆÜ³2·[ÌLõÍçÖø@ÉŒ]0q"²ªŸÃJîéZ%³´]ß¶}V˜JþÆ“¡ÍFOòS3ïŠi³}ÿ¯†¹Ï)Ø»¸­G©š®ì‡ÕnAá‰Q®ï/‘;RUÄôJZÎ|¦•åþŸÕ[G©ÙOZVòõ5Ïç`Ö}(…“)öîË0evaIuߺhf0àTYhPõü±²¾Í$*P$ÿ*ˆ1#ŽÖö°%JÝr%Èaæ[žš·íï&KG½–¦µ~Í2µáüíÿþMÃwì@¢³žŸŸ U¼Jrbë*[ù{Å“»Ùà‚¡ôÃw ³ÔЊÆÖ/þг:|–—1uu¡RPoÅÀ¦Gt’þæ´zêÃ{¤¬/Tуþ¿/ŠLÞã*à!Vˆ±Áh‚+eIf¸x×z‡Ç×á?æ˜D†½$ÍÜlyvsöM½Í²p„Õ•1„.¤Bȇ9*¦#k,/-·RÃÚ0i¾§%ˆŸ!g²õ”h/[&&¤‰Põ{?)Y$ñKŽ5_Uƪ¦¹Û‚á´ö­É^¨»·îîÃ¥Û¯ÀR²²'ÉR ke7â7Þ,nšlü/7Û®‰ÔÙ öºrÔ˜Ká¤n˜ §=¼—ZÖgEgŽW<Þ%4÷iÇD챉æ™F 0„BoØG4l`ä) žd©%KÞ*,Zü–ò„Ì%p1@ÎSvHߨ³çBá ê9 ´>ήKµÌ¶Jy¾Pã¹:Û)ªóøÒáPw`õ¥q8¾ëfUäýïC«Sz0$N™Â„µ6Z×ÄÿJ%Ø]Ã, M-å¾-V¹lÝB×qm ÈoJ€C*ØÞlúÁ†C%{4ûT,nA„OD¦ åüµD¢Xî&+¡Ä€ŸåmV¡‚]!”Úu«æåäl|´eweÛmÇ =WlæèÌ –ùÇzÙ/ý^‰Ç.A¾¨kÓfØMÆkOÆ!ÿ ]·ïŽKûæ´¼ÚEÃë´m"࿽‰ ˆñÁ𷌰Ö-K›“(’oå>ts ]!bi@æß¬ËR`Q¿nË6VéòG5<½ëÒÿ@ásG0>ͨ Òx]quKñ®/:›(VÛâvÈXRÈRj‹‡xoo`§&ß\TØ:4¾d@ï}sÝ%"£F™¨,¬ßåô‡Äâm¹=>M¦˜p '41®‚S”"¾Œà­=.U s@óºßøw\K6ï/…N㎄ó'UùËŽÎ+Lë‹ ƒníÈ»¾ yx˜9òÜüÉçoþ&?Ätô…-¥%´@yB_òªß)fqì(Çz¬„ûÚByJ¼ø~ñ€øføí×¶‰+×6¦}Ê’¯tñî û±Œ}8X/)‰?§ß¼J¤k3¾ÇX ¹ƒlÝ :Ÿ™=Ô|fø¬þÛ³Ëdù±¤ŸDú†,&€ú¶ÑV¶s·û¤Î\9éÔ´QÔq¾BãjÓ æËQÞ•¼¢; g´…ZzãOWt A$BF5Α±xÿ•œ<ínÊŠçGÊó*dóðYW@¥•= ‘;cp«,ª¥w  Sý‹'áa1¥zz“›Ñ•‡¿:.¹â,”>ièv—]öù¯sÚWHùñ/<)ý\_Þçó8ö®úu¬ÙÑý¤sy¿vgJ~¹§!»cBY¡·šÕz1G®§â«A†žõ•¢6ˆ-q»qRÜvEãq Úç 3ÊA!úÜÚ1xò4jŽSåR:n?<}»¯|þm¤°•¡åªˆðǘu:EÖæIò×½3ZJn8³šºàO]ƒx@ºwެ0… w^Þ¡åCÈEyÙÂï'&fÑÅ?X:¨¾ÇÏj3áo¥Ð­O}ŸUöúJðôÒ8Û•ÊÇ»£É#VÏØ:E¡ùi[¼U<Ò­ôòd•r[„½7ôŽçWˆ:Fz!ë UÔuõ‘ÕþìóBX¯N×”;é,SûAlœ·Û_Ê!Ø$ŽSf‚7Mf½u|16|ÂKçƒÇÅô|m¢`’’øŒ³±Û&î¹_ŒŸuˆ·»ãFŒQÔ†7ç,JÞYb!z°-ê©'£[ÖS@Ô¹—ŸÒ“7l3Hâ¨<˜èj•½ÿ‡·³OמּÁùó\B–oÑu™§T·qdšÂQoÇ•¸|_´l—ÊšH«Myu.Vœ(€û†:Bÿ14]: ª—KZàÑ1 >’ÀúüEþê~Ï‹ôó'y«_XÚîRÌ43á >8„…©¶YðØíjW¶ ÌX¢ÃÁÐ$¨‘7@uq"¥½‰C(Ò¯h>ûNÁyX•”—BEæ»ôÔSuÝ ¥8ßu/°/V’Qû˜Ü$wíJœg˜öç+úôKÏTõÞg ›Þö¯÷óïeÏ$’I&¢û…X¾¬@)q°r{ G}Mé‘'ï¤2Jؼ†ÜKöfÍ7¶ù…‚ ’>b—Äõ`w 9~K”øi»TY§‰¦b¨DÀ¯c®³É4#ú“Uß@¥Yl£Í½ãûä•M½·+5‚¬gû'Ÿ=_D »6;Jo\ߎZH^`|.Qs͹a|ºóH‰ÿ3±‘LRJ>Ÿ_F8ggÜœ y< lÿ¥CE`„¡·2Û2Ü]`³Ä¾YΉm£hÕLû:ÐDW ™Ôî…[«kv@9ŒÈ©>ëÅT‚RÐŒæVg>Iò×Zmi¬!¡~YIܘÈðñãdÛÔȉ˜]XÓ/®åÊWqC‹8U†©Âó¢õ?„&¿åPË‚_gX n¡ ð^† vö•c½çXTW7V1šX¶òŠh?Š«Š$kLý V9 G5OŸ²_4”h¢ žÝ,ÍeWÚ¼ëò©×Æ‚[­Ü‡~ß³ž„{ÖAë¦x©·<[+ÊQû¥¬•_,,º}o„+º¸sJMïX>,›6P5¾‘eéùK¼9€¸€•}(46xQ¢þêSH>-+"— ótëeš$Îñ+`ÁXm ©ÝLG »µ'mD>k«„M¾‹UÆXvûòm˜Ú%Âçþô¬PNèü _6miix”ᦕ$,ÀKí¨Y¶Iù)ëúМÖ,VCšÂ¹6Nnì%8dRCZÙ]÷²Êþ#ëÍ¢&âÖÚ,•Mym9Þ”æi¼›{°§Ëq"I=Ô$Rtb¶Y)Fß—³²ð‹W>A¹{¹E߇S‘bk÷âšu¹Ü»›àkã¯ßw3Œ'S§#&ü[µ^¾#¼w‚…”H‡æ%4ù«Bï£"—Ïö.&±.`h¶J4£nëóY$ åû£¶§›†Á©h‡Ñ¬¯@v÷°¯Îün"ûýk¹·†9ðk5çcJ{® †ù׆›.ÎÇîiWÝ-îÀU8 êÑðtœCý*ñ± ía=‚úd¸=„5%W²áþ ÃE×-2¦Šp7<ô'¯Ë²b‚7æ&øåv°•âÞ]•BÖ'µiØ‘­ñ`Êc8‡È¨}¦LSu(^GúR<ª6K·Â›t8ÌÚyh™á¤M­zƽ®m?hâ’*é’ù7¤sP­¿ßg˜äa=%r<­Dçó¶J§XƒSzF= <ä:»âÝ8†M¸å$ÇI“ñ4Åþ¼ÒÎ/úkrÛÑŸX¢Ò”[æ3Å‹†ëå.#³‹:ü„ºhJh‘ä¾ @09ÓdŠ·ÝjН~—ãû´ì¼i%™sdíYnæXÔG¬æ*0™P¹zˆ—Å?œ)i¿´"&æËÆéº:ð3g2ú¾2b¦Âñ|¡Ô”+ƒFÏ—õ?wë:B `űa O¬ M‘GÙu3!”Ô„Dã*IOg!ÏeÀ;ºª|«¶È«6åÉÉ[^ùQP—Ñ%S¡ vÅð¬\Ï3²ð‘¥÷#×»ÿ&Ȩ—a|jîÿSÖ8€®Þ}înüÌMß.½àCbYSÛ¦sž †$á˜<9œÈô{ªêÝi8âkF«OË@^‘6íS%Ød—|ÏÍ:n¢V[v-­Ô ;“ãz¦ò²D¸œ¶ýf ¥kRWvD´gN:],MMf«Ÿd#çdW00ûÞ¸ò”¹v‘žn¶î})‘F±sñþã¡ ·®™v´iƯßÑö¾‚;™i|™of|¡ÎB‚!%^Åoà …ŸQ0¦iŠœrãH³5ÛlÚ‡š,†pðºêˆ,4Ük3Le(,¤Ñ‹ÅÁ„+.ײ`Ç.Ö±U-‹´Ô"þ£€è.xÜmõAÓÕìî4U¡Èúž6“¸€DêQùõµN©˜¦&E´4±q“ꄵäø/D*ˆ™>€Ú@­þY=b f‘„E“O tJiiAeœµCxõ¨öX¸M%Íié°#uËâ»û‘ìÞ¤StqߎþXFs••ìȰÂ2«Uú‹H‚¡…#äMíÍ4T÷ýìÒ|‚9))’\Gé—e^á…ho-†-T]õmñ21<'œ;}ifú”µfù×—bqÿÐl‘eñ²Ül¨EöÙßNv àx=Ì$ e†¥¤ã2˜ôÐ6)%oƒuýÙªÈÇsj–¬dlÍÂSÙø[×"qËã¡O³Ï8‡f¿¥ ¬s.¾rŸpôÍI4òY²žx1Q$×ÁF9¤÷ü -+¹E=Ô´È~[Ål^2L'Ê‹„ýãOª‹ˆa´1ec&°ñ=³À«"}óô‰°7 F®îî‘×’ñæä.ªbõçíöK4-´s‘#ü–"5ÏzÑšüMáÄ˜Ž©èðOª\ç=¦aܬTƒ£¶µˆí‘%©ëÂÍÿéûÂì endstream endobj 188 0 obj << /Length1 721 /Length2 10244 /Length3 0 /Length 10811 /Filter /FlateDecode >> stream xÚmxePœÍÖ-îî‡ÀàîîÜd†àî$¸în‚‚»…àÜnÎ{î9·¾¯nõŸ-kW¯½zWu?=µâ¦íí âr²q´ä4U9ø88lÜhôôÒ. 70"cáè¬Z g'€‹ƒƒ uövÛÚ¹˜¬˜ÿ t-¬ÁN`€.Ôê¶²ˆxxxHx¸º³¹¸‹±ý-Ònv € Øþ n ¨&`’WÓȃ  G€º»¥#Ø  ¶A\Ą ÀñßÀ ±ÿ‹“+Û?  ·¿Äl\ NUYmI¹jÚYivmi€Ä ¢ð·âæ*ô ²rqúWw¬·ÿZŽÿµ,ÿký7ëâõo‹ “` ¶rX‚lÁ4ö馱øþ¶vwþOê/!׿üL5dXƒlþ¢ÝÕ,œ@&i¨“³»È  µ¹@šP' ÈPN`Gïÿ/îÿ"Ý,þê ±ý«Ç¿C`W9°ÈZìöWj Ç¿ý×ýû\TAÖ`w§׃þêñ÷D­¡Gïÿ»åß6þÙ]I_QFG‹å¿ðOZbµClZnµ´p±þoàŸ´ºøßÓó2ÿ™&çÿóU-Ü\À^#¶Ç¿Ö,“ÿ‡’’‚zù¹89@n.'?§ @‡ÇÿеrwqAÜþüo/ÿñÿ$È d…¶¼µ³Oo‰(-šª@d™š0×aYà„]ï>3ÂØY›íœ]j“å{bPN[ŠnÿV¼l¦±Haìý‹¥Ž2Y »ÿJ[aPóëQ£à¡>ÊôA—ÔÉJ á,úÂ-se9DýýOv¥¢¸òœ±æeßqÖ?/Í^Cä™Mñ² _1@[,Õ8Svá…§–â÷›Ëp‘ù¡gô¤fv…åÁÎ;‘—¶¯Üèz¿-!=~*Ý?ëÚª¤ Q®¢aƒ‰9*„<ÓdäK^–§çFWÚ2Øh]S’ÒÔßhISò”y¢¼¤UlX9Y±:ü(”—£vúƒó A.bËçkS¿"•Å0ý³uýÁލdʉÏÑýW.fö{’È’BµE"ÁݨSÑZ|½‰CèšVûà€Tܱ†=®Q=?O€Ø”°"D¦)ëúöû=Ó~ ÿö[$Õ&àv iWÇ¸ê™øÉ8x\Ë+¡ä\=øÉxé^ó7ÝŸöð°,ñi–eÀkRv¿(wòPùjÇ(~9’®º'Ø›9JÉÀ6Á²æˆp4Q@@[Ýum•Ñ><ÿØZ|‘ì8™9•ìÛt·ÀlÏHËŸ®ƒ j僞_q62:gŸs"Y5™ŒÁ$rÖ]¾´©°‹;·c8ë8’˜VÆaü:Y3J>¿t›`x|ìlÙ…ÛpG†ƒ;Gjµ¦w1Þf;X"ñl’=ÜëJ‹èBe\8ß“p+¨âz¤Ÿ¯§ð µÈ_ZÄÝŸ©8ifQ6—ŒÛšâJ{Žïl‰hé£uÒSå„5¦ëËX þ¿T4jÛHí6¶5ðü$ûûåeБßÍž÷Q¡}à{üi0¯Í—™?h½0ü‹i©Áµ<åÑï¡ þ†¹&ƒ™xO _"âØ÷þ wbÐ*õ¬ƒª[´Ì€vÔÙŸr{ÕÖ1h=¥xÑ/âfgѪÌoºø¥†Àb.w¬0XdÏm1[hÖ±ÓãŠu×Á;ÝV¹¿ˆ ÀŠÌ{×z5g~AnÎ’'S0Óˆ¬C½™… ÓÇ6þØ ¨V:±jEEsÞdÁíH£ÙÇ¢ÑùgO»ºéY;¯¢~£¡ª•ý˧6¼d@3…¿¤­¢†ìKiŒç-WÜ@Ýô'­ŸSEYüI 0 ‚Öée?"zdéµÂb|r?•¨‹V!ÛŸ–fË5ó‰‡âìç÷AÐ1ÃΞØ(Qæò¹Ъøà ‰À×ðöã.Ëâ7õ)±Ú«S¬”«šZÇ–߆‚ÛH“¶ºîaè¸Ü¿z½}/CtO/‡£IMÜAfL<±FGt­DL˜†û¹?ÂEG_×öéS8‰fÒ‡­[&¡|Á"¯·Ù1]¹ÐÞOÔŽfþ½<ĺ9D””¯s[Ük:—/øˆdçÊŠK®Ä`VÌ‚KGñd)/(J£F:ýÓðË›$ìAÅp2>ó;PÊtd§²ò˜†Œ©11ZY†^P¿Ô‡ÕA3Ïn½ä!Ó)&a*˜ x”i(.4ºZ˜û”MñffŸo>‘/ìP ¶rq½h^×٨ثqó™ŽI×è™Ã`—!Ìaιº6œ )} :nz¢¨tp½Ä)“¾•& ð©õvn̹_m,šC ¥ÜNƒìªo; ©”EÔöž±T%ÿêþÜå|%h/iÇ_wlVym1¡³râ9E2/sà’­.—üò†ÚcNLœnÝ$ùä øH‚‰-5ÜÊl»gëï†jœäÃ…j\RJSd ¾þùð›$dR¼}¼¸ýS1nàÀoàÑy—s9PØzúåŽv­ r_°ø‘H?Éà²Bƒcrˆ0Q¦Ò¨BÞ¹s×_ ®ÙÀ]`Bäeû&2,íõGœ-võž°¶ÛÀ“s/O¬Nõ! ¸åäsÊR¾’/ {Ü L¤ê¯æÄ!ÇU<˜TAÍÀ<ˆNÀ >ôÏöhëwÙ¨éó¤+Yî‘¡³;…é2—`‚JOÒXåM¡.ts“ÛRŒŸ{vÈê½ô}½väøËÇÞ‡´m›æ]º5ÞÓ…û¿eÂÖÁ§Û£©â „…,š»}÷¡ ¼"R½•! 5ßZÀ¢?Œv±ÜÀð…R7|ïZS³Éè±{½Ø»µ­Ã%É$MÒÚת › M4”L|eæhôu¼+f}Œp¾e¸¨ûŽ›»ÀeW´gùï'†äF¢zŽêêå9—í4à[œ\ðtcÉöiJ×Ä/(s³“D!g€@CaÄÏÜùð³ßu+d¾0šàUŠXÌcèûì¹×Wvêä'nÛR>ÅÍ䯨®,ye‘ÅHtiºÇé•S?˜aÉ©ˆ­ß.÷Hq)„KR®Ä‡üÑXý»ÃØ¿®8dƒˆôöig‘5$݉.#Ìn|RÀO+f…U~:‚xò¥q=0m€v`«WRék—cÂ/´Í¹â£¦æ6D2×ÐÜÒ¯GÂ2ù§Ñ]?¼%ýe2g˜ýí^-f¶]£×A¼Í«Xþ/­oq”Ҕß»ÑÚhÓÓ¼lÝ/q/$nå ÌX{Y‘^ÍZÿÙd™w#§C­ßhfýÕb´©Sß¼SªíNe·‘¾ùjæM¸¤G/ ÙáQI}hR µI³©šæƒxš±Ì°RÁìôÚ#å& ‚#íQæœÄŒ¡Ø÷èµ¥o$Y“.Õî”kÆ ¯ün<@¯Ù«!°Ùá³Ì©xg'•Êkþ»®˜sÒ#ßU‰q[’ó=×€%:ì·W™ðRùöÚ®ä8c^—’ý~¤—>ŒŠ@~3Ëž©ÉNTÿInH›’×Iˆfð¶H8é¿ç»xÁC><·I Ý¢î€Oä&s‚$Ìn‚Ö´‘× 0C„O ùÒËJ×^ â4†~ÒCh/‡žƒ'Ï_ày}6¢ð<Úˆó.uÐë LvèG_ß{p‹cï4Ý\a²4]Ò¡ù9©xt-‹px¸yb½Xã-K#_Ž¥?/â¾€ñ·5½þÀâçO=Uã>‚fr`†I?IžŸÞ°výoçNã…aN¶ç&’fZLH¾Ø/ãAÉZJêšÕ6˜óí÷y /‹‹B Öw­Æ¯t¶Û­­ÇŠq‰pF}ÊÍâÅ] MÉMy•F¡Õ[¢5“N$;O…÷Ãs«ö±«ZY¦©ˆ[Hüs°aL˜m]h7!¥{3vÛ²òû$I‘§¹jý ,åⲌRàô±/°_ð¦ì3tûëÓ.¨Q |0êÙ¬wæ•ôAñ9Å,?*j¬½+¿ô¸‰1ÛujÝBH;W¤éŠÉ?íÝ+×~ þò9o·¢Ó_Hlu›=q„Pl«æ`D&,¾ä3ÙJ"^IË~ÍO²ËPQDŠèÎ* c]‘é¦ uI7g`—òÉ=BÜü: ùŠ)ÃrØ@I;:Zv4³[¢"µ|c&¦CbcÈ{MLhE=M³š:O÷ÉaÂ×wgZ ‘âï’‘Ój¼8|%Ç™\ói«CúŽÇê 6<93¯æ–Ñuƒµ~¥¾‰h®*¹šwÀ}[¡ÇO.ëÓmâ[âZy¹Ê°F¥à]ãJšnE-*ˆëœ²×”ûÊýÙ#»1áDJVdÚŒ¡,.d×gkV‚%F!¡WØ‘èõ+t‰ýëå“ð¡a íGgý•Œ‹6­0ƒªô%šuu$Ñ÷ûÛT5IV±¨ÝCåºoßîo¹ˆ1v¨îÖ‚UÅ(>äž¶}¯ÌeÒ·f⾟$"<¾Û&üu¶=aÿø,À <ö£ûàÑK#5ïB!Î|#*"&~ ®6¶¨C«ûûv»³Ó¡£Òž™Å…Bõ_>ŽW¤ 2%ö¥ÍD“°…Ú8Xª½LE€Þ¾íf.žˆÀË„¾ ZÀÔR»¢D¦Ä—ìQò}¬¢SuæW©ø¸ŠV=‹ û[<ßʼnŸšz–*]f¬Å&Œg9¨ }櫾äòDi¸îY‚ьݤÒ(äÓ:7£<ü‹·c›JOFÜe'-.¥ÿpµ,â'‹Û‚6¥ƒÞÇøÊ¤ä×VñEÃàVof:ewÆw@⩊Ñ9¼¬UÔnbqåÇBœ[êëÓšk·ñ»—Z¬ Ð[Чh±û+ ¾á .³X´!ŸÙÏéb˜½ÃM:4ÈÒDuð6ivÙ _å> Z=“G¾­‡éô‰×î4¶à9R>Z²ñ¨Å1’‡‹¨/ÔÅÁ.+¯%†yóÖ(vұ舂?¦³/‹¶ñ€fzãêË(m¬ªþ^YÜIš€âëú¥%‰+ÏX‘QÐñ9:]阽ÜäúL7ð¢ g|N@b¦ %%¶,©ŸŸð¬£@úèªßâêš7½›™ö^&/L4%O*éð:£WxXê×}fì™NõÉ‹Cž« ËÌÑ´‘ŒÿyqI~eÁsù™ñddô!¯…˜ã•óiRN¢a8\ÛD}k³ÓdçD89Îì8©Õä¦u—¼MißþÞÆE¨-îÛm-„%+Å,äÄÁÙÓfnäIêct2‘îòÌí©Ê#rJ5Íé~ëx©°Ýùö[3MpFAZRº~N+ªdAñ!yG&ެqŠ w&[º´–®?~C9µ¢²™vUÈJ¸ÈÕ¢xkü¦DzÊkí©Üå2i0Ëî;gÆ‚Õ5 ¶¶) IKž§ŒÕ…­öØ_÷"{»Ú¹ƒé .ˆDKQ™Î1´ÑC™‡¥yª—PlÈz5Æl–^ 5[û•º3Ÿñ8þÔvóðá>ö'|ª|1é*:zödIùŽÌìœâ5e˲ãïË ~Ž/н Þ'^aÎ.{•Æ(­!ܵ®„‘¡í}ÞÙW×5¶·š;°k39¥‡aVx·åOûüÝ·è‡ã(ã‘`[ÏŒ¾í§¥#¤B,q¯&}ö ¢ K¨QC Whß³eúüû“&Š€æÄg'n¦°Û§ƒÒÝ-W’ƒ>'ué`â2Ýš,Þ\ô¤82Ò–ü­%vµ7aä:^M4ÃÆ¡›ýëÉKä=Ÿ›H¡–²ÊšwkˆU„C¦h—?Q¿^Š(,w•qÊç8É/¾> Ù¢ª((EV^=r[Œ¥¾«s Ë©‹1 ì¶Ž‰cê¦U×,¢þàMé˜ûƒõ!«<"¾úÚ"™TPm`Þî¨FP½U(‰œ†ÉÖDAQ&*,Ê„=nµQïæz{/•Q«³ÉÇG"æÄ˜¿Î±Å$–/b‹EóÜÒ¶æ¦CG§“.ÐJ¨‘®c{[ì@Ô£ªùºÏ/Ÿž€¾º˜—[ü•Ñêg³ºì»è”ãžçVõ©ðËme®rC›ëzR¸=OÌ5ÊS†óø*Àó‡rí-ÝW Ty“Š(ñå­ÆÆH9‹{"VÆWÓv5BÕùX ùP:mn¬«øì³Aw}b nÖïe¹fH§qF?idj*]öž˜=MÝò¦%‡µÿDD4™ˆÝÀMÅ)Koãç¶Ù ~|“ã9(|[Ï>½‹vìp>öÃj .ûÿtÚõÕ»®°ƒEµ\¦¾JòmY‚{4¶jåZxŒ×!ªÍˆÿæa:ñj¤þM¡YŠç4-çíÒ‰{xþÌ-gÛò3¶³åƒÊÏDZ\£a˜FÐÉCîðB»7Ï{- sÊR+`M; tšéB¦ŠÛ°{Kë±SV­jøò$‘T˜ˆ77h¶.`ʯ#xz$Š{Ô;¥ÿ2ò¹=H ’Æ“ruP+tÂîø´ú!}ö»nŸ»!Ê£~Y¢_çðŸW=­Êi¥‚Ä£ts‰FM攡üµö åË݇դa£'Îê^ú.¶Ë(,¤8‹Ë®ïßÛÀJÔìiOw¬ßD6·JÞý~M*^ß^u1úôõm4£Z5y&3ðœ;¬Q¸×PÄM?k±–óéC6ï uøSðé"hcx5˜úæ¤Pó¼èÓe¥‡´w»o†F:YÕxQwnd,#§uÇXYÄŽ^õJ”©;LE@ÉŠÑrÍÿ¹ÊAù‘ ïøwËÀAþ7ÐàL?eé-×òk÷²#8ßy94ÉØÔ/³ƒ&ŒÅkF(|Ûi}lÝJ,lB–ñIÆüÐH¯Ñï¬áabÒðØZÉŒ±š¹J0IÀþLÃÀR¯ ¹÷ÅIÚN8Fy‘·^b}?í}Ä;œ*2á9B^NÀIA´´p?6žhÌRçÎO9"(õÇÀ”‡ 4À¿ÿu:ª4j²¾ÎC8»ÆÙÈ…µ²4.ÒDýSÇž³ÎI£I~ÿ’°ŒŠîþ[<ëT){ɧœ Hõ¦ÛI†PÏ´e.Œw3*»‚SÌD4ð üÇsÖÍ©(x¾¹ïßmûcáѧBŽ(ÌéT,#}÷qîOdÛbþyÚ0Œw¸åG˜Ö/±¬âí²ÅAP9‹ºr1bMÎٞÒå{¢ÁßA1HiÚpY“šïšóÜŸS€ë«o¤˜YÔˆäª(fS¸…2¹îu#ÅÁý©ËC×s¬·eËk”qž\þQé‹÷V[-9»ínaûAhÃs`]VÏ¡\Cúkž[ÿTcq›Ô5‡°# Ù­øA i€-’q’«@ШƬ¿í×Kê+I-æ`[ AŸªcÚÐÕòk²Å››TEÆf—Z9&›„i#Rïµ.ŒÛ=yò‘ ;’GuY6ýæ%TCµý½€l Š£äÑÊÒ]åheÊ) NÞQ­Ð¡£XGMR0E‹sôˆ¤žóôPÓãè7÷ªÐªØµå¨•- rñ™ñ|Wú2K@·µ`z$µï¤†Òrn±C@½¤—ÇGVÄÁêýÈJ%î?éÞ$°(J\rÏóÈk«ç0âÊ¿ºC‘1‚>\£cû_´èŒ”­viž´&`%Üë¶]áÝÆ&YêAgJ’¼¡:¿/çVŽ‹ù¾I„ ‘½u›ù÷aÓøÙ´ŽT&ݽa Øpavoúr17 sÙÆÇÇoåqƒ¬†1é‘Õl~¨Ü˜;cWRɰÉÓÕÈ´RÈ“å$ìEAZ^0AsÓ[¹OdÜCô;Q®“™Ù-êG¶¶¾G/ë™ø×ÇO@ž°Éó)Ò‹ Îoû È1ñ‰‹UŒ:[›B–ÏÒ³6¿Æ}ø×¡1¿_ ÑÎ&õ”\O¿^Uɨ 5MÈ»÷¥²lð;bÞñýàîÖ3d¸³¢ˆ»¡DÊŽÙ£; &Îå%Ãͤùu  ]ßøÂ ‘T æb±Bí?œÄX=€iÁ¶%}çðçþd„§}?]×{¯Æ#4*I‰PMF¸±À@˜O¦wäºI˜èÈ´ª3òÈÜ+=†®÷µ‚‰±¤Å@oœõ4¾I9ÄÃ7@–n¦ú{’6²6Mº© H'ÆY>ýõÅ‹‡ƒ©Äf:ëé7o -„³Ö•UÏoH¤ƒ®bÑU¢×5z3¨Ÿ¿žqm#a¬Ç>¨þP“K¼¦Šc‘*½SíVQ!ˆ*ý¯·TŠú‚ )ÝX¦ªôM¢5<±-DÒD«r\bù’'T{ID‚Uá càß÷ž Ö¢6X?s·þh¥×HGyçXÀÆtÔó*TèëÏY¬„Ò&Àú,܃ßTœ¥m¡³ËK½ŠAü!àBíU_¯ê#÷äg×»Ôûï}+ßöSWØ'#}í±\(wõ.‡6¶Õã}g84—×–ñëÇ‚ÿ×ß±ìÕÐã[âZ⛞Ak]4õøÈ‰‹X!ŒÎÍýÍ’\L´þçñ=­l"vÙ‹ÆÀˆè&&½jÌO êKãE]%³_iÛ¥w‡ æ+ƒ'O4ËÍÒ#ãEçÆÎë"Z·ñb+ÉÂŽ^ËPç¥ñYmÃÄz2ɪ¦;·M[ «Ñ¦N6î©HËSPÑõªn¸}Ê^EµØ±v 3uƒ¤"N‹"QMJ—VÉRèýiCÔ5ÇwŽºÖ4k|ô„q¶q¹kj-ñ˜ïg#³T8m wõŽÙràƒŒüÛ#„öû€x…I”¯ßÍmÈÊíg0÷$pÌ(ÙÚ"<“ÌÒÊv™Š ©Æ‡JÍ7Öïü1 *cSt4\•tžeKßëL¶hlÏ"ÎŽ&Ÿ˜PÈÙjÏßÖ7Ø £;dÐH‡˜—ß- C‹ð c²ê÷ øSWv\Këð!Ø?ó ¯ì;Oû§ß€ÐßZ*÷¤Ú4_¯œaL«¶Š,åMG±’ñØ}zõ'wDú,MEtÃ;2þt…àtÐl¦hÀö²½›¹!Ý]ì´Íå:h‡Ý°pRí\È1ÊéZ¢'0gîuZ#*¾gÔ¼ ™ôçâ=›û.„=‚zZ-€æôÝÿ9û“ª†Ò/r&Y‡uœÕeJ”ÀÒÜiõPŽp!©B 6 ½L$ÜíC½nWÕ”ßhnL”^Y¤ÇvgéçÏõ”šUø¬W 8xÛ^ûR‘lö¥‘Õ²Ýþ >'e„)ñF¦´—‡'.¬.e PF8Ç Óš2f²ìÔ ‚…šÛ E¼ƒ!f¶ŠL䢴Õî»ðÚ¸ÏA§×ÔœsÐMªi€¡gFn ×4š¬ ÛuF}çªDÓ6²±Ë•‘=|Pÿ«ÜeìégM’)TíBƒãob+ª2’hTôJäÏd÷¦ë«[©F–¼Ù¯–nqe¿1›Øq笵¡<úÆ U‡è;}r”­¡Éùcu0?ª`º~ˆ_ë6p;Yöë ÌöS[¸>pEY¢CÀ¶¬úXÚ¸ÓÓÚ~îüwýϾ.ˆmöØ"B>]†¿M¥ò¡ÁAäÃÜ+Éöóè/iIïÐfSøJÏ7æÓŠXâÖÒÁ>ý¯#™Mm*·f&õŠ‘œâ…†¦2Í-8&‘V¤´ü çEÒIůòÆÆY\%NŽ… ;mîÐQ]– ÌÀ[í1A·» r0gáìE:!Ûx IUõãjDce #öZ!f™!ßgîFà€j)Ý­¯8D¥Š¥6™÷Âß5Ñ Ê–ÜǾHà~ÕÞWýÎÅŠo~¼†¼o·4Ú6O¶6Œ.Y­ïakš»üQÔ64¼£h¶c|<@€H™™p¢çWGFGBqo† ¡h ­iíôñó0‚7¦ý¶à}iUðø7âl_¥o¡ý9o)iñ×fÎH‚¼äÒxvЄ¼Øˆ¥yä*ª±©>üAKÁcñFŠÖ&ï!Šh“KüN˜õÈã³z0F?“˜dâ›ùÙéϺƗÑyÍJ³òà?ÉÖø¤)e5Aar÷ꡎ—.³ê+Éq©yb“˜@Ï(/%’ó­:‡K%·~N+(ïfAu|x°U—SŒÝ¶øOog³4 ×éB¾”±Ã¤ð&Ñò7,Ó­iiaÕ¼‹ƒ/3Æá(`ùTIæ>w…uCÆm.U)é5KwÞrÉ·ù.ØGêr8AjvN~ß";|‘½¯'îë°M´TK ¼Ì‰»Hühåx6ô­ÌY«² Ÿ­ú2¾óœ¾ ïs*»µT®‰iãE±ÞþäÒö§Gÿ4—…ÆãG`÷)W@kF­ò>WÇZù´îlt¼YÝŠæõÕîå{3…ìù^7J(kª qð>‚”Ÿ.†ÆÀNb3ŽõÑ+*O~û­§ÑÌHú­ÿ:†’¡)2Íõ)`•®%«åVÛ~ª%´‘yQÃNš³ÜÆ‹õ­²5iÒ͈fÑ-HI‡yùìUù:÷|郷2SNW4pŒ¯Áa%8» }=%`öuƒžÎŠDè¬ÏÞ@NBÅ‘nõjMÆoƒˆŸ¥\aóX"ñÀ‹‡Xûú®’Ô4ÅŸ¤ ûAx:e|pijñNxMÂa8î^m+Oœ…ïá€x±¾žK”–Ú.ƒÒKP–Þ}¸ñòÄõ‚ÕÃ.º¾DS¢Ýk·SçÍ>4N·é¤›k‘¨[áEïò63üÒHbMüá7}]PõùÄìräݤ:²ÞGv½)Ëb™“ vi¼P7†žFãUæÙ¼†È—·ŒøŠÌ-$GºÚ¹k({ ÑQW·bΕ1&NcŠßéŒi*‚‹±3ゥöËêåÁ®ó{˜¦Àìfôw-ùÚ}v‹g§“¨RdÖV£Ž¶E‘…‰³—ˆœÕ†6i¾îi¡…d¿ïâ'Ðó#Zº,6´.³*?wìÝ~§³6د-鸪«¼0wÑ>=~®ƒ<©f‰b½Îxõ¥½·™–tb5QÒÓKˆÑÏýæOî2Åëæ ‰pYÅ\°‹ $Ò«êÚÂÆvZ¼ Þ„Ä®mò×/Wˆ|0Iù=1¡œ+t\Ø=Uh´–Ø5Hoê…ÈZ'f2·¥º¿,Ö‚î ¨EmLÐ íóº]>D$~îâ´jÛ C~“º_RÙ?Ž'òòce€Ñu×ð-/*†ë†~*LöâKµ«Ì<½hæùƒWøò­Tþ._€Ì]cêñO¢Üp©'ÙÆ]¨(¡ô¼™ÁÙîñý•y6Í1ƒ+}:¦ysæò5’Ú£g!SmßhÌ“r‹=Ôt=•s6SD;þ´²Òÿô"¤ÔS,šq.ŒqÌ)_õ3\Ém½yHŽ3ÂípD̨æF*9Füg¼†G ïâÓj¥^å‚Dówº!w½¦¬ƒ@ÓÅK¤Év¼Åiÿúï-¦òõpç FcœTg'%ižºúƒí_Ö‚H¼×óÞk½s¤/ÀkáŸ%’ÊZ ƒ L’à2Q)9?4ÐnuÕíúÁ²`5ïÓ[Qn‡bX[5ô;ò9Áü2ÿêøiÐ1:ÙÉ Ã|Ý·h‹PBCç6m\áéQRåü‘„ÆÿKl§l¥™‡¬ó,8ü<æH™.V%‰‡­WâûJûبٗiïKQ†ÅsUÊ@p°ÙïÞO)Ø}RÞý¾9» {‚#»1}íÝä¯÷¤‚Ê¿‡*EoÖîÉËþÄÎ2]:ÒÖUzÒùŒX³Š Di$-ã¶ãnÇ÷‰ƒL»&ÍóaàˆÌÍ—}G¥W{8b1ÖŠñzj/¤:!Õv³LîŽG¸ù³œZ²Û Xhsʵ‡í—6ÒäooŠqWzx&J‘iÃå€õ O†ßÁf’)øfµ.¢òxkîÊÝmAÁAðkÅIC‘óSÉvŠAÔépÈ@lWãÜ:,.é)Óz{OX¶¯sÇôO¾ï§ËGƳà£É>é-­†&!úö ÐãL!.,ÉÝðÒ4½šáÑóºø±uoW<švŽu’Úq]vϾ“«=ø5Ö¦¡ƒR_éqòâ¼óõû›ýù4/s:Ü„QˆOxmr ‡§—›•ÔAˆ™(…ßDâ|€ ö„ìG±kéÓ×<î-SY€&Zùº¶~ͯ1ç'„ U‘wþ&J.Õ9°.&Ïψ7Â*²v2mðs&jï³­æ§œê½z¿0­é {q&J|}íêå%לF-NMFæ `›+”;S,ŒŒB®§.rê)¹4›ÍL¯ÔdÅôCî;ZÞšÝÐgÎÂ@n²ú¹u-·Ò2 y– þ.)@}½†RÚÚSyМœAüxö¹¡#äîîM8>×¶ÚwÜÕåt,²ÏQá'²(On†”;«1>öºÁCŠèžêú V ëöã¡ãNuó‹ûŸ?LûªcíØÕà¨Éí¸|w‰xfüøé_‰ÅíØ«ülÁ|Øæu5¦£\ Ù =R“oÆÕä(ñ ÷,¼éMðWņ랎…™Ã‰kf¨êƒñrH„G8ìboA3@Í>ö3²ÅÎįeµ¾w(Ÿ‡,XîÌã–þÐ 6.¢E>M?fD; ŽW¢®À*ÒMŽ›wöó“_÷¤7ËÕ`lø¢Þëe-×’­“ ‡ßnXqA…¸‹ô¦‘¸ôúÂmå=ÃíEnåöGrÇnêÜ? ¯r=H#—ïê¨åêü¹îIH²ŠWrÄJIqG#k* 4N.ê:ÔŸì0Ù? (­t¶¢²Ô]­õü"È?9Ã? ´Œ&¶„ ˆ_þÙ½hFçìô_?Œb´4ã}XGF½g‹¥2ÃK˜ßA._‹ÝkD÷³Q=ˆHÇr®•ƒ¬¨±nm«¾uºäÛÃ0Žûò}‚'" ¥¢…¨Æ¸W È͇Ð~JmIÆZ'ǤN­s3ÚB„Ò‹ôA=¿pOˆ­ÐÇv;w¦U¾oDˆwlSÕ'À`]%GAeåç%C¨+|0”?t"™>ÒçæÅUN r´Òæ©£l˲k'Ê—váÀë‰/Ó±õîHü$pR¥—‡‚Ÿ6*nï„=%ËëÌÿ~É¢y$Fvs¯›§Pmî¯Õ‡ë)#µ—Ðv.Yhö3ËTb£x7®Õ„Ú¸lg´µ·ÏûBª^ ×O{𤋻$ú¨ùª4ôÜpAÕ0˜+ÜÀdâH$ò‡^=3˜=U;ù2ˆN‚˜aoôR…ÅÑu\ÉÅa‰PŒc»l–J¿q»®Ì&Í´_a'ø«Ó®§FAô‚Xí@^Ì#f,Þý{]âôñ½@¨³Iá(JóÐÊÚŒ®À‰òÒ‡›‰¦¯åEï¹Æ€Bͽç|…0s»Ÿ"pg>µÚ严ÿ$¤å"ä¦X@‰OþÑQÒ0’48;{W½Öh€ÎáíSßèÉSXo»•<&Ã-d’\íÞ¿K®H1ÄÐ…µÔ”'²®ç–áDÁžP„LNÎè)ÈRôSXúâ• Ì7ñÜÑ£Ù à·ü|þŽ”,r.Ey6‹¾ˆüÄ4ZïŽKÐKôä© (d—@jsz~Ò¸P nÅm;÷Ék¸ÙôŒqÀß8ø45¡Æˆ¿G¤èÙcÞv¼¿–Lóã$Èå9€¾à³lÉÛ•ëLh,oÆÛ‰í*†u=‚´ÚCdçŠøkl P0çK±ÇnŸ7k»ÒGù÷ËtãOi.ŽÓÞkKácÌL‡„º¶-¢åÝ>ÆŒËi"§[>P’ú|ç8lôÍ1>(§¡4ºÔšJþ?2T ‚—K57«K3îzk\€Þðg‚=]ÉXÊ@¬BÐ¥À¯çê3ÝÐc¼¾RžCS ßËF!º€çg7*¶¨¿}5Üaû £sÒk†Qn¬ÿ\þÚ0 endstream endobj 190 0 obj << /Length1 721 /Length2 27577 /Length3 0 /Length 28113 /Filter /FlateDecode >> stream xÚl»ctnͶ-œdÅvVüdŶm¬Ø¶mÛ¶mÛ¶mÛ¶ù½{ï»Ïm綯Í?£ZõÑkTÍš(bkGE7[#zjz:€‚ˆ¼€Ž†š˜XÐÞHÏÑÌÆZHÏш bdP0²Ð3èè衉‚6¶nöf&¦Ž2ò+Ê–z†fVföeKg3S—³³3Ÿ³ƒ½Í?A FFGS#€±™¥@PFVM\Z@&*­5²6²×³È:é[š$Í Œ¬ŒÈÆ6öËÿ46Ö†fÿÂä@óoÖÎFöŽÿ3¶·±H +ò‹ÈH+„izÖ†I±­8þñ62°·úWvTÇÿ‘,õþGÒÿé¬ö®ÿ‘h éé†fŽ}#3khÚñ&nml`ùÚÐÉö¿¦9üƒ@ö‡äC#ã¼,-¥õ¬Œd‚6V¶NŽFö)C#{k€¼•žõ½ô¬Ì,Ýþýþ‡¸£Þ?<ð[›üÃÝTf"f®F†²fŽÿPm¬gùEÿÖ«ýg\¤Œ Íœ¬þoôÿŒ¨¡µ¥ÛÿéòŸ4þÝ!­ª¢ ²:?åÿÀ¿ÍÂÖ6†fÖ&ǸԳ7üſͲzfÿ©žÿ‚ùo5èÿo[JÏÑÞÌ AGó¯ò û×õ_Iëÿz ظzP3Ð1¨èôÌÌLvF6¯ÿ×ÀÉÞÞÈÚñß„ÿ“ËÛÿ.$##W#èµeÎ@ó”æà2oá‚Ùr0ÊÙi]%Êezà•©î $³ASCÃ+¬{E¬\XÜ?}îÝËñû¦?z1F°Ç“‘¡ZËX¯E„å&ÞÕ[ïryou¡ÚנʘVÒ 7awŽiëkþ²“LÙçÕv%ÜH¢ô‘º¥í}`ˆÛ±« Ö¢äZ¤Èéêß°Fû”Uˆ³¦Aù×ú¼¯{k !¹»°7Ę:¦ùe~¶‡!jÌd­ì;‹mÔ·bD AÔÈ`n =Ö¨CÛáãõÂ>ô `¶0á;cè,Z”˜’ÔWEß40 ÛÀ… m=ì"&ä}¢tô¼‡ÔF ãbáíÓ³BqAöÃjkí5Ÿ¾x¦#uÀ)çûþfÀ/$Ä®|i±<²š“",2Øš¦ëÐÕ}E.ãy6 ÝúyÙecL„»£š¡(øNZ%BSÏtóÑùÐ~…Â+ί‚¨Ï—1'(á²0äÈ d,VA\´ ¥Ÿ2œÝDˆç:§fnïžÑ<]®º‰cý<´ÉÖw J«»WPGÔÂ?§5€Ý,#‡Ì¬Ž>œg˃ÀÀÂîA÷4ýôyss´« Ô„Ký…(NsNw-y¨Áw}i kn"Œ Ò/Ž™üùq°Ç}v*ÈWüd¾1;¿Ù ƒêôÎëìÄ~M¨ÉÈ}×lŸÃš†}oår,ØëááH,FYÕtµÑ®MÄç™À#ø¸Ž0нG~½ë«1¾ár—GMîÏ‚Ö:²Æ°ï¨ ¥“½žš=0"~À®Îr,:5Åû€õ€Ye´P 0»ÝÅL&É5¬÷HŒ½$P]½ØŠj £|óx ?êÍ÷á™4ˆÁ}ÂN€ú‚XÞw¶}ß\´ ßò/WÃ!3޹ùÕˆnÂVµ ÞLFd‰òÝÜ3Xm £—§Kºz|r³¨ú Q‚0 <­%C"Û[dZ[jR£ÙwOìˆ0å‹YÂJã÷™èƒKÝëª6_!e„³@yréñkÙQd@\³®8Ü&³»Pçg×ó\€wF¶k8¯#™)Üñ[ ÿ,kæ$ÉL†T=|Ú!ÿ¾{ ÝŒ+0aM~¾GPt8\÷]¿H/g­ÿ’Òdˆå£áÚöïÊ ½+Ÿ•7o;®o q_#+ÞêžÁ…Z&Ø>!x«]¸v•GœÐZªÄ\ÔX¶ðgÿeë€46á{Æ“êÏäü¹àÏ®4PÝ{°Sÿ‡Î+Û€HÆt‘hS;aH‹L6sêiE,®?)‹óÒÆ ŠrKœó§™“íNák2034“ܧþAÜ#.] ½AÕ(*‰k˜@ibq¾†·Ý9YŸòKvî0ÞâY>“•©‡2vW…{½ËB²Á5òhñ­Ã…˜jP±z›wà×ùv¿<C®>® 7û’ýFrV‹Ý‘ô€l¶Eø¦Eé;ǯ'#Ç2ÝŠJŽöhžgvjÌßGn=@cž/N{rÑÍž¤àU™:oÇN“Ï«=£êÊù#Ñ›vsîv Ä ,TL¿32ÿY‡¬KWö†L I &çâæåôO Åæ¦ð2Þ—v)ê ¸€6vɳa ËŠ¥ÂÔ@yŠ”ô¸:ƒÒuâÏVê2$V OEÒæ‚´ð€Í^]rjZøÚÉ´/žn·^Y„èù5Ö O3Xqã3ÀÖo 3møü”91C÷¯hNg¿Ûg?]íc®LQXLI{â+D¯¾°xÊ^Ÿ–åÏ.ƒ¡Êù€ dÂÇl*®¬ñD`;iÆAe7³×á-»¨®eýÍâ‰Üf9niSβ²PEa(•äþ= :Ïæo–‡EåÑÖ«™³™Œ„&~Y ]_ó:­ÚâQ§i9V“Êi¬ãðZHRhúÎ^Ïšæ¯3k®‡Æ‡&ÄäÍ™¿õËK“w¿3s1'ׄN¨*$Qý“!æøäËfLö0ÑŸþàîË8AgL©rG‘cµ Ê‹ºíx˜'×#êB£h«žT6}ûÄÓ¦sÉÝÆŠù)ÛqÑôH…çæƒ½ ÎŽ@YÜâ~Q½ºùÔ¦$cÆ<`ŠRéf2S¸1up}Zš6#éM¡}ƒ ËOÀuÀ~Ž›áPD$]RýÈø›Û˜®çŒþ9%oN‘uxíLËòl8žÏ^ËâÆt»ïô¨öVÕnn„R|"ÀçJg“ÞnEeyÀ£+ÕØÖ^!—¦ZÔfów0ÄwE Òª A8i$Ì(žÂ«§ 9{Š/tÑLrZÞT7UÖvÿ€Á%GØæY(³ìåszµ±m]ëÑ+ì¨9.ò4Ù)ܺ=¸*y•޲êza#—wG2˜êG ÉQÍf€ˆ×NjôJ~n?²ŠÛnW"ÓvL8ÓŽ¥œ3¥~ý¾"ÌA/:º ƒ~~ã_?îüÓ_°¾óã†;•ê„3ûåó]–Õúˆ`}½SH·fyUÄý÷ÈN¡F4‡,ç÷J‚§ ›ùÁùùÐþŸVYœN³¤Üì‹€¿VDc暺,H©~¶D¸¨9L¼Ûž×·€ÙxZ´;…»qZ®h…¥¬‘rPßRŠs™ÑøNŽmûe ˆû÷à¾lp¢áÉe¤uªŒ¬ æ‚ï’±ÖtÜq"B¹ño¿†EdOë!…”?,ÈvÄOsNÈÝá3VgÆGl>7€]Â8G ásvn%Þ¡­Y¢Ÿ}AdOøþÐËÜ©±äZIš…%\Ó½I/p? eÞ׹ιW«Û+‘C„ƒ½!é > {e€+ñWɾ*v_~K±æ19ñ$òÛDn_¼CV)4ÜòšøÈ4L8µ„mb‹’(P ÚqÞij·$e<é;±Ø€3H#|¦ï”*OÖ¢1¥Üä§ùá¿¡Ç4£¢ÄºI,B¤>¹ €xv ¶ï%TJÝ\Ìj •²À~-æ·RýCTó|ËxÅÃõ~ÒÊœhm¥¿’@Ó;ÌÃ^ß±Ö´´CÕP¸È°M"ܽ1¨—=ÜñB='·¯Ó.¦r’S~ZZÜö lE°i¨´ œÿ@Ï×Ëóà‹ãHÁhÉz~w‰°¿"gÙ3ì¥?v<9ÈÄÕS‘Ǭye»ûß² ¹9c­¨²úO §”²Û“\…ÉwNÅüS¸Ýµ{¬÷?£ßªÞ9M折¤›dÛ Ð,!¤œÆEGA¨ßQŠUäÒõ}Ï8µ¸@ÛõSD³Áu0jŠ‘ÎM;Aó%Î,±©ö?®l¶RS¬þ”Æ_ª :QZ£Õ§¤ ¡ˆÝU\‡ê¶çâ5ž$N§E‹?ƒj’ wø”¸DJÊ4ÇÜ2#Z^Õ#?jåO¦fh-ËÓ‰¹qùÞ®"4gœ †_BÎf ÿú(4Lmb¢„dðêN„ghxDq䄟a[*+¡?Kÿœx|SÜ"[*V@Ø‹/x h©5áV.ؽ¯šE Ü^ËU§PöÕ1SVJ82¯ÌZl~ é8™B>¦¶•â¢DÊíT 5¯²°{ ÃŽ©ìu7-ä„´cÉÉØ,—:åqgeOA%)â=í|CCC'ºLpŽØ¬Å2œkY錇ÿŒË›­‹zìÛ$í…ày(Æì‰“Cju+ùP½p7F"9›BO@á|¢[d·n1®)z/Ñãj¹5ÛfÄ¡ »»'ìÛGG…cdkîVxÔeݾv™Šw±Ì:|®‰ê†\÷l'åg¡u+ˆ £èø·çhÕzÞñ¶“,ßК­y·ðT zåŒÓ=K¨ ¶‡íCÜf|n‚ýñ¯ÆðºÌÕ_kÇs201·îS©üýýJèv㟔qCºY7¡N´eÌíYD,·…¸ß¸b 3Ј_q¿˜®Ù{{ŠÛýxí$ùxÁN[˜Þ}Kfmîž]JuéGqleäHO?”ܦÜú§¸¯`Ýuy”~ÇoýÈÂw®ŒeÕÊv0úxl„%6‘Ð|´:S;iBøY5ø6e†Ä-¨4‹°îX|3…¨…m»å¹BŽ€eÞ=;ÄBã’¶‚)ß.Ô;NÅ^U/¯ìa¢Ï’èªmGYùAz0pª°ÿ]ê[>œ%nê‡Q¥¿÷¡œ®ï§*";Þì«ßŸ/¢M™œ(G]óÂ:貕­o&g*FÅ·ƒ˜š:ø2kbÕ–;~š¨›²œ‚Žþ¦w6ƽ@”w×¾hƒÂW“Ò G@Ÿß®d6}rÉY2Ù`4#’¾$'CQ—%­ì-uÚ5û°{Þ÷5MpiºÍß“&GNÀd’É+„w=½r¿jW ÄmD«n6üè9ÑøvT“TvJü 1\e/ymënð}íAt¹el¹oùˆ[]¥ªD!,ô8…NÆî™Ž[ŠBaüïçÒÖõÝj«ýcÅ‘ïóÜ𠣪b­'[›%}‹šî ÛØ{ž"¥XËÞk¬ÇÞý\ô¡ÑèàÃ,8HÌ|ÐYýbxÎoÂYÕxxúQŸM˜nß{¨¬4­MRs¦.A¯U7AñÚɀƢo‘ Ø"¦w`jæé·žÞ8ï¤A*7³<:ÓÊö@PŽý&“B%_ß`—^ï¿M.cŽØV§¹ØAð;^jš=Ѫ.bÖý»Úމkî>Ô=ÕƒÁ?“a@H‘$=íY&øŽÐ4÷ï͹Yþzw.N ·TPÖxZ$+ãÆ=º:¿'žÀÎõùÚxR‚þµù ”u¸öÏÃ\¤ÕiÃz#…§¯éDÐKÕvñc¦»P‚›hY•Ù@Á]BFá`iP‹{¢Q·â²•C„Úø.ã:̃‡2 Ƕñtô~ÏI­v9Eoxmo¦,«jŒ6(çÈF羚Å*DG%.°››.í¶ýô‹¥Ëß•Â8iÏUºØÔ‘Õtïø}J¾à7 ºÍct%½üZáúÔ†‰'bÚ „Ee× Z‹7ÙÛŽ K%£ùºe{Ѥ×"P´QÔì6ãy…-€pLbÁ^—嫇ßÉ-ÎŒ«‡írëÆœÀì骻fJ•TÂ|šÏ-c`g¯:—ËIŸný¡žÆ3}­~L‘SQœèù|$aée8ÄÍÛ/γîS…‘b$V7OL¨óUÛeXQÆ#wM©æ¹Ã_«MƒaÍÁ‘„#ç\´PÃc±¾1Ñu"l°áRÕÛÛƒ¬P0\¥ÎêÊØtoä‰uÈwÎÒÎ4±~ßÓóâ`ÿá|ãÛ:A'ôöâ7G žÜØAdj¦êÞØá_¶Ö¶­@B[xºûkAví¿*Fß@#†]Ãw§ü&â®»œj5ý~vädìß¿ÕIn† §…sveí)‚pHšöÁÛ÷˜ep„  SrÆÒÏï߯;ÞLâJè |`yì¢íûˆ¡ŠlGÜ Ö¸4©¬žÔÓE‰ž»”v¦ôÑ¥G nÿ;[þRó~¡ "ïש#_Á1¦—Ö7©0@N„œ´°(•™Ëû&Ìaüêƒcn¨­,(Ò_}°¥Çî(ÏHqw²)EØP¡¸¶¬iÉþnü\$þD„†ÊJoçKxþtS€ ¢¤y9Á&vA ”hbMÍÄÊQ·‘Ï«ŸøYØvÞ'RR %ý¨uÈ-Ñ­·ÉK’Ð3Sjùkmey%,ÞÂ}ukYµš9òÝ&Û‚Õ,Tfnó˜³) ƒ/àÖà2“6È;>_Or ‚žnš1áNö°ºOÌ´õž_ÚkͱLÑêêʰ\eèPN@e>V`ÙL^ÒU1GLK2[]Dy3GÆd¼ÐÙ¹]œù–ÏY‰Ôh]#޳+õNYÒ~‘žÔ:è&§º-ÅŠ½ˆ‹e™¼LRLf‘o#õ”¢ä‹ºƒ”FÉÁÞ©X¦ÚÅÊfËD÷h~&½NŠY §Áœ5c_å„»©óÍêÈDíÖ…©çN³²Yû¥×¼ä1nóã¹îŠúГŸ9ƒî„Ónuxñ§——>aÝ—*gj-¿S*‰J·;9·„y§§!z|ß *­ñëvçyîL mouxýkù.òKÎ ÒÉœÑÜÒò4@"6ÈÃHÙFíWqû´òæF‚zl•ß~d‘U‚+Šð¼‰A<=Ͳ.\}æØ;Þ6A^ôK5³Óú¯í‘f/glX½ôúbc·œqíB÷ñÀ~.Կш–7v2Ò¶ç\Ûz\éxзš~Öw¼ CϯlºA]Ož­aqôïUp‰þ3x$ –hý&£d°A€"ûtCÑ_‹1ÊCN&áÒǺžy* è#êQlÒÂè˜üšÈŽC$ûÖÍØ>^#»”S>Õ*,G„ôJ}oo¿Ò ÈBü~.\†Ûó© • ÝsÀ–Ú½;ióR¨pÎÒ„Çd¢[醷Un ¢‘)Nˆí7¼ ¶[µèß1ÙWZ>C–µÃFÂÓ­S/W×1_;ºeÛêqäT.ØYT¹þ0äå!Usz:“^G¢ý¤X?Êyü¹5í?ñ:r03AËCgõâ×0?²2 &$¶dæ "ï”cêoŸ’ãOdGò¶½Ëãs‚ðú%ÿ{W-GÐg€e ·“rú8C‰ýQ€eÀáZF£â ßJ2 BŸí`h¬s”7ßxcWQu^¯…ºyïi‘B·Þ÷h,VÅl-Y#0ìE ‚Ÿ3îi<Ñ5)ò—ó27ª)ŸÂ¯ rj=Ú\²‘²µÄíšËÏœ®“ÏÝx¦³žÙ*ÆeOšqr± Wì k÷0г»–g¯T½,Rù¯î»¦QšÂÏ /âíÍûHÎvà6Xü×¼`xš_jÝ=ãò5b7ù>òrI˜l­“ e&ò<<¾ö ä"&ÎV¼ì̤>g'•È™._ê5ÀÏV4¦BvÄ\þ²±ãr(JY‚Bœ7žNذ˜lÔ¶¿™¸íÓP+‘aÌ©…2¶à ˜ç³ãY÷F¤šÃr§Q*Â>ÔWÞ¬Žxð´_¾ìÃL”7üíÒ‹¾/AQñ ÍMk´<©.K@Û[ªD¡‹UÔ +ò€¬GLôÎ9-uK“€1`îk¤ë‚KÃÝ|µÞGBbM§âʪeÈR/ ô§JohîVÑ}MsüxîSÍÀ0:õ”v„Ö5eÚg¿~újÄPC>3ûmQñŸù^ŠšO˜ŽuÁí~(\-æ©xC?ü&o@ÐßKøUþÉïiTw¾ °/‘zùŠÄ¨Ö$!Ѹ³µ‹Ø™Ã¼,ám$̯Ù¡}pöÈ–—c.¿±É ŠêL/mÃÏ¥ãÐø\ìØQבÝÅOþ¸¬Ä;:%•…ÌšŽ¤Þ°‘S!ï¿XuÇå)d<_U‘ê¾}Û~cÉEŸ•Ί-\$Ú¥º"íÜ?yÚJÿáÏ©ïÊÎxù|š¼èòzÈ £dBÝoéà‰h6T³Ûå=E€2þt‚éBÙ£lmFq¢DþeäÏ=•:ü¶”^àvâi´ ‹ôݹ1¼#ÂÞû’’ý±IlóeZh9P›ö®cùê6ÔÖaØGg¡÷ÎÅB\bV§\Ë‹Àau¨‘p¢Ñ„Sº:´d6¿ÓÅÈ$¯âþ8²YŒµÑ:Öf9Î^ÒCz©àúÅLëþ£íòæLâïï7Jèþ)ߡç™ÐÏ3&ZT1=ù&žOu¨9Ь¬÷ÏÔ0ñ‰l2OÍçM¿4*tª‘öQØØá8 ö3G•ç¸ÓÚaùÊ:ÕqÜFfE„ ¿27h;`úßùw¨õ¤Ex†G>™D„5¾œÜ²q4–})üÁ`}C«¤ H꽦šÕQKòdŸR®¢A0¯Éº•ö2©éõ¶8©”Lðƒ-£z4«\¿_u$˜èˉÏ*½Ú ÆÐë#ížëKOà !‰RÁ´(’´gWC6~gC6¬w­M9§¿‡ódGìÇ™.­P)Á øqgWk6pÛA"¯{Ï™6K”¼3>•ØL3ÊbºPõt›Þ*Þ.ЫME}Ö‹6&ßQa'NÈ Gr0K´°œ/q7²¤–Eét§ÖZâ!–µXt¼0ðÍ…qÿmÅŽ §še¡ïÛ`}«²µcЕé)ù7¼4Ž£ <[®ûS’–®ÿö$Š ÊùÄò-Õ·úË«ÜïÎ|aÕÎ<Ç?W¢ÕŽÝ/}ã×ÜêÆvÖ4ˆ.B `äîÂéc\ ¹Iù:’ó¹4é&îÐt+޹– Æ!C]1LYaþ#ñ/I*dÚôÄy¬.˵5e¨«8f;Ö{â"öùëBþ»AOk¯ÍRKÌÕ'¤T01¿¡‹’bêgù™ž”ú1Jܹ1sȬ|§D¤°ÂÚýGcÁ¢–¬U±*úµùGçì¥mC}`±ü]5QJ•èêáÃ38'7lù”pÇñ«ÒÂI ˆÒmÚ»·òÝF»·tz7þ½È|7‡Ÿ?¹³yþ· Ò"^,Ǹv¦OÏXX\ñÆ~Å'…áC‘ÖÑÓÅ {aû²ÔŽyž‚9Íñ5«Ê&öìVú/BÜô†]S‹;`¼nÉ· {_:ø<ª«®M›íÍFöëŒ`ÝUF¯`q»Tef.{M‰ižp~ý!÷ mÀDõS˜Îg|Å7ÄJ¥¼æ™ˆ‡ŽŠµéq$˜ôr¸nñÈbæõʪvv%îV2JZ/p$wÖ •e“ô¾½žØ=+«¼B€îÀ|n’¾§ZkÔ±CꋦÝWv@&§…`sI°t½â³Zwj¸ƒÒ- p‹}HVr{ø‚z¾šA¡1?Ø”tóSºÀ•Ÿ§§óìäâ¸= ÙN‰¸m:jd/bV¿cû÷¸ê*kS¬Ìrë}Õ ¬Lß]Dá×›mrV4qa|sp°)ÊâGÛGqΕ0cARÒØ2Ã=åGQÜÔË&É£×:=m9‡?‰ÿK—òc.!šrBwó~Èy›Þù9dîï†tq9bÔÕvÐï{y ¼¡ÆP¸¢›$h¤¸*¿ó³Ùs©Î€¬ TòjÙt/“B]¢’8²éxtú’òù±?°@ÃÇ¥y˜ •ŠNš¦f×lÿ~ŽÝéaÁIä熓VÞ]ý™²&›a[pF¨È·`üRåŠ\ „AϹ·æOdäÎþíQd®——Æ`ó·íšÂ6Œ“0w ªÄ0ÀS"âñ#ü¨:<_‰zÊŠ’ë4:uÔ9ž]zJ‘31áP xc#Yã¦O9Ú¬è¯\ªZ9‡ÿ–¡@Yo{Íê…1kõ­äªûâù~*]Âí[×· »Å¹±¾S†Q)Šf4nŸ¢Öš#F¬<‘FÆDh²ÈØÎ3jÌÎœßøôîØ+|_O¥trmðA9e<óg2“ì í7 ¶NUÎQå–Ñ5xrÀ*vöÀÚ¬ «ì`)`ÔYª!þ:ùJ{ëzáp'“Ze†j‰JJEm¿Î¤ãW•?|&³ƒ¥££1mo"Që?73ÎVÙR´wª¹¹€cqAéŠ{´bgµ?lWúoÃR2ÞªÕt"„×° Ђ3¬Jq;íþ~ p·^ç!7ÃåÇ9²Æš“¢¢¤}l©š²† PŸ½Žâ<‚èÚ¡ CŠPMœzÔ;,Æ›ñ¶CœÚ±×î$“ñŽ+söð«.¶!w·FÙj­ GÙÞñ-«7#½´i;6Èìëÿ¥*)é—0õúnÁx›KdcWc50˜¨a¯ûq›Âgàûì¢ÈÏL¢« y¦OÞÃ;LL^“÷7³2å#aÕ8ñ½e,Ìè?m˜ô²<¥écÈ´Z×s;ùÀ C~ža&±µaX R¡îÜä§V±º¼9½Î…^¹3ÀYñw¡­URÕ8o†™Q‰ÉtP±)YèÈ,o«#4íöÚ¯Âï/›ø;°d-~cÝv5­³4íÔ‹«?×Ñc•“Ëæo†íê-ß©¢S…»fxš7 Sâ‰éì"†‡Z@ë*L— ¯†ñaL}ò¼±˜’yöc÷®ÅVaøR‘1Î(à“NL°15¾K½Î;èÇuè –Ia Iù‹Ýeþô¯Pxò—qfìd{{¹(k_3—Ü}F“ sRß÷…×~°:úiÖý†YµíÎéâ\xeÞtÜØö#ANZzꯗ0ðDÆFˆYa6rÎV 22mtÁ²POÜÅHÕ}i'°@§b§&¿Ë í¥·åSrÔáÀ¯ÑB‡/õ•k‡¦Äú×ÈJÔÆöÜõù½G!d !};Æ}ë˜wl‡Muò|P Ååy¸2=ê/ã-7,ô_` ¼PˆêޤwAÏ€ül„GÚ÷ê¨ Æ¨Œ ûÎ)gI±ßŽ? ø1;„>NÁXÍÚ3!S•N ÊF0’óÎ —à˜@9RÆÅ-Äó­×£ BÞòÏJ‘9N o &ëIñCÂÉ)öÃö9BÅèûh³ÆiÕÌÜ¢ûnë#¢ÉBxöâûkÚÈ™;Âçã¥RÚ\U?˜!gñ¹¨’V“ÝjÁ! áþÞx`kUŸQ§©š¸ÚÍž·¬j‡¿Ågž Ž¡îËýj¬¤Þ è%øúô§v4žoÉD¿\i‘˜e÷¢#¦vcrAÊÛ¸Ì4ÓŠßÒ;¸7êÔh¯–º:¨>¼û§KT®"µÕÍuRŠBPþª†<pÔ³4Â|mAÀx¢ðDõïãPyw7/žŒm] ˆÉo.yê×ÈdNA‡4ùس¢ÚäÞ¤S=ç,¬KÑŽ¤SQºr“Ð6@åÑ\¤¥(Ô;-­HPô[Å@½…¢°T#ŽïÈA63À :h/®r¡õÍ,ôýEO§œ*ž´Vb™dËöùÐò‚ügÁÚªvÁ¯W€´B¼ô..rž»õ_9B/ù]¶¼5r¶ñ,8Ôf@õ~¤>|YôX÷•ûu3›‘nžÊú5Tôa"KÖ˜'×+‡r¸³äwg·»Ññ¶ëaœ&¹‚†¾™‘8Ÿjøuì3},¹+ÞŠ ­x”.(ú´í%¡Eó7£Èÿ4‘Z­E¨6çstk-b3-µã"Ý3¹w_tnsâók{ò“«ŠÌ€ÁsºAïTBÊ?ŸÓ0~ ³9ØãŸÍÓ Hw³Ñ|/XýÅ8yÙëz­rCfñ—¶ÀÚ„†1z'.[:¢‚†ƒedi^¸:‹Üõó•Æe<³xÐrÉž^׺޼ã$¡ô¶˜v’MÓçLÝúÚ®ÞÆÃ:Q¯A":ÒV ƒQŶÆo¨Ü˜ß®–Ý*éÆ-,<˜QBuÓâÑûb˜ü._^"OÚ1âHáEÕU ‡€Í ½;™“®y(i¶«´¥‡ïeÕ‡¹LŒŸÙO…Fã²þú.\ýŽ%ƒ-Ñ"'® …÷èœ$‹õlHÓTø'þ/:ûÁÐk|*º. „ÐFy©ø‘ õ'Úäó‹ D²ê¬9^.‡_7ì…ì½xKLJi„à>þ´i™snå´Á:VêÙZ¥×1WÙÌn®ÖˆùËÎl–fÐ_7Ë%ŒÂ$ ôó]YbËèo/âcÕäbŸäQî\‰c›Íû£ü!`ŠZ( %’û>í_†üààvC!:$Ó{ÐìŒÁ¢[R7¾À€îÞñÝ!øH[*%vµOdVöóÖÔ¨ ÁuIÚ™¯”úàCgò±ù¬ãv(Sˆu0gZ‚ŽløztL -Œ‚rýI¬@Ì#½«1̈Å+éÓûCHçÝÎz²ìÞµ‹6A™Ö ó"äÍHÁ­7((u–F½)Oºz5”\Z{f%NY¿Ø£ÉYäÖ¼æL0¬TAØ-C( M~z×¾CÃÅ‹·6¤IÝnÛüõ.µUÕÚÐ}jAö3›|ÔMr¾â-‘%²3ý¸Ï;`ë>è¬0¢Äae°B²åµ–zãdÝGÂ8ò-6[?° Cü’«¬7;áÇ¥ „ˆBÏ>œÔäÇB°aŽ ½’U?¢ ŽƒCÿ"³q9ã@âs.&.w";Í"ˆÁFo?ØŠt“\&@­‚(Ën©jùpÈäMÐð{ænÉQšoì-{mÉ,)·ù¹‡î©àÿ-¦AÁ`–i…l°±_ºLìÞøîËõC•F%Oj}#’ÚËr:_góö„3¯¼ôÑpzQ'÷Û£Ou>úÓ&PVÔå$–<eFÌEm챨2*öÿì+ ‡šÊÛPÏ Ìb*eQ‰ëD¶(ÄϾ-';º&‹Šx¡ÚÖc¢¢Çk5Ím€{ó_hc¸Èö2ª?ôy‹¨„úÚ$| "£x˜Àñ"Îp»× ݉•»» TëJ­m>õâ¸ZÔýXš™rªJt]0èØ °FÁNnÑKÞœ\B…v‹"ú•wÒ9²d@Ws•Þ[†«<5&È?41òOâ&²ÀŽ®—¶«ý$èÓ…IæŒ99Ž…Z`F@Õþ|&=類§lRØwLÉ„ÉF’uz" …˜ýzj¢™žqìJÎÿørð‰Y5ïŰÁ¦òX—¦&ˆZ²9"záý®û ÖyrOž ˜·®ÿšÕFºRšà€qt^Bò‰Ô»À@ŽóŒTIýÀò„I.Sücñ5>¬³t]º 1J°)ír?:¼»6¯¯Bw ¼–ýX†èú±«gÏNs´©ºñ¶Ìã²@FîÐTòëlª»˜mTž}Ë@ÿIÖÊOظþo^#Ql¶2p-÷&=!Ô&ã*E;½Ð’ÅñΑ ÇQM:x¹õ 97.Ï ˜iF𑲧Iú™/W‡£!‹¯M'(.x å ].W­Ä‘Zö*ä^Ì<â¼C°&q¯eè›!*t…d,Àf5OÝtБ°@:†õPÓ\ѽœxÙj¥lùTlü ÒKœ‘ižY˜º®Xˆ¬X©uod_ïxÅGeÓEôÀoGMC»0;µ*eô¡)CYl»·¯¿_À4ZÁ‹zÕÝmY‹÷}@Õ; VŰ}e—‚?&.’æáö‹7ú«µù¢Cª6C@1ØÖpB L/Wæ€ÐE£3ÿ6‘,’;^ þøÕ²ÁÍî]'zdR½µ+³Øu¶Î)èì=¹`™ìq` ïÿi2w{xó•có{WÚ,7«b½ Ÿý®¢7”LŸü»õvÞ‹\™’Þ.v{™?<ÎÆTƒ!]­èâÒËéèKÊ„{Ø2²íròÀå=À\¢/-?'.{‡ŒœxæB"-¯Í9ÄÕXµƒp}Ë|³Î‰#íÖ˜CâTÓM²Ðn½¨ˆpåúW3\ÐIPDd&6y2jþÙ´¡ÁðrÈzܬýrg*È~ue+îÙ¢ü‘E=p'Èþø|¯Özöj÷=,ˆèœ4†ÒàÐù€m‡q5œ¼’é¢Át'4îÔ´3ñúSdH›œyªfϘ¼ß¤úµI ³Ò.óˆ n>RF2úô|ºÝ.¼¥ÜšŸ©AŽ™]ö›œ–¯mܹ·R쯲X2¾ã‰†¼I ¤¢ÏÔåÙŽ€þRQW]Û‚¦ë=5gT×ng¼ðÂØZsÜúv›ô˜$‰±_ყӼ'ò#­oã"Ž•ÜYܰÀw‚ì<»|VÎŽ>ñò‘¶HG᣺"8­Úf™Ëyfó2î/±aC‘fC$ü9î/ÂSÓ¢ J3›ëqYjOT2·¶x§²bUî3·l:3쇵¤Æfëµô"(Y2âsM3d$]é+ÀìZ¡¿œBµ9¾NÖIŠV¿¸·$§åfF]=¹÷©^jÏüØÞ:‹E{/)¼Ögõ¶üï¿E¾*3òX“‹áॠ“ÂXíâ>3A_e ä#¡®¿Ü’·â>žTB;¸›A¬^œ0š´Õ³0%åpþmîn”ḃ^ÙøÍœáÐôã ];È,TÚ~=®ëv%*þ#Z†ít‚Ë3m”A§à£G+Xå%‘‡+ÜAP ?ì›J醯Ã8Œ¦››¿Ëö„cKjWëØéí&,IY’('¸ *­¹’(ÿÖÆ%6{ײ̧ö4ÚuœA¾¢äp&Ƴk`ç~îCÑÌH&J7›zI|²øÉøî£tå¢Þ‹@Å‹œ{ôôÏ>\¯á?¹Ú&²Þf­[¡Ka1Þÿ— &´¿óÔ+n e6 ÄV )4‘ó[£ãJ-ÐŒ‚  ìp‰m\¸-6D^•A¿”B"—Â×"dÛ‡±•ˆ}¾I>„aÂÆ¨ D˜üR1&¶ìâ×LFúj¬° …ªë¾Ú'39ÉFcÄ4VËóô/|²‚‡Ûe¿{µÝ¾T°°s2’…»µá^ÄÒ2ePnü33ïi¤Ûª °ÿò÷~;ëP¼Í>Ìþ.Ž †[K‘'ÑíoJI]ùÀºOÙ¼ÙÃ+aSr¯¢äz ½ÍBà+ÄH7Ž5S: uspb&KY8UÛ5+q¡c:WÃ<ü5½Nè35:åuÉüÉÃÔˆÒ3Κ1ܧI» ;bm&¹¼ÞGló'kåk…íór£Š´*Ùrûƒ²¹ËÜ=µƒ"J!Ÿ?Ò?#Äêö‘¢rÔß[¢Û¹zQfl ?µjkñ²á\ÛòÄí“7· É9ÜcK!¥W€dü¬Ù¨$·õXå6‘MoÆì½ÙP®Sä¾ÝJž¯‹˜ º‚Z·¾€f:uŠäD íé :ÇóÚ4%= iÜg•²Xšr_e ynlvãpvÔDÙ¬T˜rª`KPŒ3‹€ÝD&Ä4†QsR¶–v’¨m•ÑÝn3õ•Ï ˆ¶ÒôÛ«ÇçtEþy”Â..ˆNovQóÓ¤S€]öGe2 H¡!ëB³¬Ä^ Ž¿b›Ç=’ñ=L@|ïm¯ú#{59Ä⦠CSÏAµÂÄ€ëU…‹b%ÕqGýÕ;:Þ€0ÖíZ à±ÂAæñ½×»¡u, 磺›½Å#É($OyaêD?H»].Ú¼æÜ¼Óœú¤ Þþ^?CŽ¿^9…>|µ>à»áÎ{é‹|ñ* <7ê&8sïÁÈ“jȺ«hO#TÆSón fæ¶]aŸ@1oo¦uLS(¥ýyÀüµ:½Þ' Õ[xë¦i‚ 9,ÏÞ e¢æ÷\<^Aùªþ°nís^KG ä$@~UË!”×NñëœÝ—×üBÞã&Ïpç¨ÐÛd6`m½0(+¹¸(&„ððÌIøÆø „ëÉ ?zž6Ê(E×Õ*­ëhe„l"õ÷-FŒÇ†–#æègå¬ÇËèå Ø™/>Þ%zăŠ7Å—•`-à•á%ÓÚ"ŸÍ‘%9Özµ»-…ÇìÆÑ VmóÑ|b˜ëC Ä»ó>Óôð°MFÜÒÎý÷’˜•fwä¦ö³ËöÏaWäB‹Ø¸•U¦jmÖ„oí¼C“=Ò$^O|]_’5ôig·^áæm […Ú÷Ù¬²WGr¥(6íun7Ÿ¢Y¥cÄ÷¬ÃßÖx|To¦°ò_†SP@kMûÀ3”`½I…¬Š#8‡†K’LQn|Ú;§¦…Ÿæ,…r³_ ®Á+W¼„þâorzÞø¯4Â1M!ÁâÒ"›<8º¥ »¬é´#èøžù΀h¡»¢ƒ×+[M˜Ç.Î,N+iŸ‘â—fFáŠ.6‹º~Béw…œgäÞ£š„{<ÉÿDÏ k€_ dE}DÔG"]N ¨ûhôÌ[Ø„üMFTú Ày´sjÞ?wÙòe—÷¬³ÖL°kÚ–@½p{Üÿko¤=!˜ aÀ²ú2ÕÞ¶€ñ2}ã-TrÕ WÔöI£Ã¡iG8À`6¿ä\¢ØWüh BÃ<Û½JOTár`õÄR‰üé6ÍźSv¾Ã¿±O˜RcýˆÓ!!TÖû0ºFÍÁÄ)º1P¡ÞvPÀM†¿Èö`˜é·ïðÛù›3øgÙ¡V?B–„ùTâp‚V¼Ë>ð?mL²<ÉŸÕŠ£¢=-×_ _’ü㪧+ùȦR;TD|ÎíÆK $,µúc–E½¬Ð ×”u|þï¶ÝH óOÇa¢A¼ª†ä)׳ߨTV&$MÖÓlÔ6H‚;”«·Éc9ÿ‰[‡h㔡ø¬bŸé9U­³CÙŒ³®Îï*çÞŸ f¨À°·kì?„CW–Y’ÓÞ2¦Wì6àj©u*å„ó½6k$9#L¼ÇÉwfÆ«8+$=Ç¿ß[ø<|¡,—ÃAøxGÄÒ¡XOgÐhQ…àÜR±n۸ǣ¦àܾw=X¢Î œ«¦:ïÉ9T‹¬¢=Yçv†VÄ ùÏÙË>ý¶Ä†ù!˜È)Cº^{’f‚Œ†‹Ì“NãZ!š A¼<äËjô’$5ÞÈÃ8ùÖ K=Ôþ¦¼FFÛKr€P»8‚©r8k\òmqLN£âºâsØw¸Ô-~¥‚O+IíýäVnç”ϧ kꊵí+´]ðJ(&¼Mï»ííÞq?þrš]yÅÇPè–Š ó[i4ðºs`ŒéûÇ^—ƆVD³ÝƒQp7"¼¯Eüï£ =E6+»dX9tÓ/Qr‹.üžÂÑ$åE ÊÁ<öG 1”€á%iÜÖ§Îñ³Ì v×çX™±“½)')l=úíù]®È•¹Aéþ.%hL§5ÛÝM²O¶#¾° °ŠwmSI¢rˆÉÊíÆ4½1r‡±ãH"¢óœ<â–U]¾gáMƒ)2¢›ÆãUޱ`+;d¥|IÄûÏþ…º*bg1³’(V£ÿm¶LÏy vBbrEøÔŸEQ›”¢Í8&v`}1Š®Tuz¾*©ÀÝô€«®ê Iu_?Û];ß)¢ÂêòKyMÅκ‘årx·¯ R\a%:ÚÛ^²wÁ¾¦ÄnèÏ­\+ü¥xŸ»KÀÀO%iÂj`§–.јè°y~Q‰ˆ•ä­ñh8ðQÀÏ ˆ?$Q¼LCï0<ÿóƧÐt7¼š³Is²>!¾ËyYòNœÉÚ¢…TCã3Aùeüü€&íåÏË cœ pTƒ"æàF‹î¼V¶Û§  Ž!Àj9+}.²$ñ˜ éüw¸FFš¯XQÙA5'bjZØÛhŽ·ÓÆ8ll¤ÅÆIË7sPfúÎ7-&r'qÿRà=`xˆ Îë·áÒÕü_bIú¾D›±O«ÚVJ«-©IáF·ænêÑm=ÓÓy/xLâ%9Û¨IŽ¡Cš½þ‰™˜1NS4âù_‘ÒŽþjàEkn¶=­å_©ÕjĦÈ; ?‹íÍÂÅð±¤ãt‘ʘ«Ê*fˆÑÍ»UȰ²z«±pkzüŽ"»¨úÌ_†9"®2å¼>’°²é‘ðöœ^ªåü–Æ>Å:4x ~JÏŸ¹µ…7I@¦àJÉèPO}=°0,4’3¡ý|ù±SSªGrÆ¢4Tƒbõ5 zéEc‘£VfG+ÁÄÓ*@'U%˜Ž{­I»¿Ù•æ E} •][Æ*×;®ë1xÒp¥º(Oò«ÞÙ€‹ÉjÒ‡ ™Á_¾{Ô-² œÂ©¶Y*9—$Ã/µ±a ž¥¬– -ª™/¤\¯nœ‚ضÄCxfœ^­{ÍÑóø÷íŠî‘I¬É³H›wPxoxô$p·oM™—0˜OẆü|·þôgAò á‡Ã`FÂùX|¼£jìŠÐ* ›×£Z°¸~Q]EÃ,D}Å,šF’ó9eTÿõKW‡ÊŽü¾!)#—߯:3’¥Ž­Ü8R¹¡/ (²›Æ¡MÀjA*«/ÖiMJ³'2%&} ìBz™v¾Úû–ñË&§L…ü7?PþÑ:†¿‚ó˜ÃT—üO8~¶Á¬Y]c2Û”À½ûÎ&—ͦ¡… ¾­·ÿeUéÚ䕸¡-0¯.q ]ø\·×T€¶iñè‰-ÁAƒ²¢ï÷üòÐhä¤ùNd§X—ý¿¿áè—=Ô/'§ÓïpºÌ:øÕBñûhyf:ÀzЙ©oÿDа³èÖ NCÈwÞ•&/Ch z>°€òš*™qK|0D+¶˜„¼ðïq~é±]õBÀ Ää‘Si ËhE±¦ i Á‘Ö0«…K)ó‡cøñbÑWæ?†V ]Äéöž©¯ð é.é•¡Qç]€gOHÔ"²k.ñf £¢˜ãGßä32 ì…'? ð¨µâ¤sîâïõqo†Â¤•óž2›ç UÂI$äÖn×Áê³GÅŸbì0ôÂÓ·¶{üiäKX8/Î2Ÿ¾LqJê­’8]MÒ {»ô46{8µP ÎäŽC_xUF¼åö'"äè—ÇŒˆ;@A¦M´úĬ‰5cçê„fL†ˆl)ÂÑža¥j3â ;µˆ2%c§£êkÅÑ’‚¥{é3ѰòzÑ ­žî$~ŸA®÷ávIJH °d. Ž õv™ÀìóXðÞ»‘–*ŠÐï[÷_–Õ œ@ˆíð”qa•Ý›Œzék“x³?Ê©~w ÊÇìŸ;; d€\ýÖÔ!Œƒ+°nAiZœ#OªúϹ§Þ½&ÚÅŠø¾Ì Å´÷,–ÄB§ß]w„”gkªÈäÒÝòçí»=ï¹6ÒÄ>§híV b´„ª£ýS_K]>l;_ktðPL޵$§ý¹wy&B2¼ö%÷òçw<«3ÃY`ËRº¿Fveûà©ü™©-3³ñõ|@jn~í›à½É÷I~Æ r—f×A\”7LSî(0í¬H\ótèHï=Dc&[„¦”ò÷Ö/p»¬iZõž´Ah´‹D8ÏŸ–å ™1;†Æsýwš$ ¾jÕ‹éçh'wSý  4´…Þhñë£h¼ÿJ=IyŸ5Ó¢{ncDµ:©qÊ֬絣’-ª-Ê>ùÕêWû@ïYäsºY ùDs`RVF9ÖºÎØ]Ï{ ¯~:r¨ ~¨RïÌc0jã—€ƒ:7…VXnƒbùëWƒÿ$÷V—|§ÀkïU¬Nük}.ªð˼ÁfбÀ@΂j_Îiª3 ñx‡ISÓ˜îw~{Rt–@x@J+˜Ã÷P¨`Z؈PˆÙPú(M}^uAÉq&ƒV}­·±ò!GÑg!vUX¯óM¨Ü6 62aDò´6o駉dze;̾Ä[ˆó4Œ[4ù-–i÷3wÏH¨m@¸?<Î& \É æôŸ ’ÿ¾@_·Bò–¸ÒÉ;Õýßo»šZâg¨c²¸„nLwÓáis°'+¯=œøŸþÄÆŒÙk†\€÷ÔÆ:!ÁÍK3NiI]-Þâ6çåIR¤ºÀíâs ¼? KÎî •Nø&íõQ?¼¡í ¯^áXÉZàp‘óHœ™  ÀjŽ©p[´ÎÍv Ã|¯>ZWÙ/O8—ì«—6³Ò)­…£ÿœ¢ °þÿ-êÒඤrç½–Ÿ˜­Ñí&^–î!3Íc´J•s¿½¢d]Ò°—‘æ8Ñ/ÕŠþ¼ÀDלj7Ól€ü¾ƒ¶-ÌÀ ’€{fbÿ!còBâx/íGHªë†;L[Ñi[ՓݹȿÁ–—Z¡bÍÝ¡›©FŒ¨åëEÖMˆ¨p¹“_º|ü!Xùê»D¡Ë~È0ó"êY‰²•»V;Z,¦-1&¶òÉUë¢0Ój ëÏ£^„(±±\‰î=¹S²äÁœzØdzðC± O-;Ôj@1ð#鮆†H®’Â6}ýQU|ÐâˆÖQŽ‚Y¢’]Jö¸z+ãì #¬•?Žr!†îĪjAP“røövŒ”]=?àGÇ&Ž‘éC™/+”àLèˆfÍ¿TÒe£M¥@ÆÅý‘ôá z¸ž^TÓ³z+¬ŠVGJÙqÓg•üí‹Ä ,Žw(ŠÂ$­ÈsîxêprXHG‘";y› ÅŠþÑìÑZjäA/‹öB ‹f1 «³ìFAý–dx9{Åsl}[æË-w _—)ÍW@iòÚ+^|92)\Q¥NR[¬…ž³.†¦yèO_’š±àVS†K»lÝM–Û_¤–ØÏŠÔb©VZUi(SmÔúôÛÌ¿ànˆïÝj M<”ÝŸÿxƒ1#Lù±4¸ò–ºm‚éΆ&ŸSÓK¿XÔgQIˆ¾ò¶`([â ˆK׿ '¦—áÃå“?Wš¡ÅM;Ö ¶êD Âz¥]óR]V§/V]ýjÂyÙŽcX„ Ï9u¢ËstŽÄŽbvéò¬ú«Ûµ ŸR“²Ï#¤E‹8ažk…4‡´J\`=t²ÿ#±“#TyðØCw¯ ª8Òû1šRîíðõôXõ{åœQ«Ë­Ö·6k™!ëã>W-Â7rOërKÎÁ/ùy5² ’>éÚ§6[<áx$Ãkª›¯ê˜,%8úa"˜Õcì‰ò4¦×¸™„@"'OWÓ4}úB¶ ¨ˆ(öŽêæé¡^κTy"?³OJYìÄ4N\À fûè†Þw(ï†Â1:Ã"¾`C¡hþjÐ*– Ÿ¸Jµþ¿5ÐJnlrQ"zù’×í<i¨:½9a¯!sœ‚ÂÑtñlm×´‚ÀýÆt¤ñ¹K3T‚ÖºÓ»=5MæµhprÀqøËTÂzâË{Ï ª™/ÿ±g?·c)ür-55øîRlÛ G›E²n7ÍFÇL4=&ÿؾpa( ÏOŠt·a_Dx“-úºÄ©Ñ9ÿ".”ž!é9 ›†EŒŒ‹øDZÊeÒë¶HCÝò¢C‘z³r*Wû¸õi;üä¥ICª,:ëxHÓŠ ßíQÿáÊ!Vû’ÅT{$¼F°–•OõúÕwàÖ³þµì…w§ád±ïṂa•D™˜R ¶Oózçñм"ûP+ô-ÿŽ9ÌA ³óª µ”Ù'¿  ð/q¤ôó¼Zã*¾ãz¦ÊwãÐ+ãæÁä=•qÆf±í˜ö4VužÆJ3°îÏ_™§Ôç9ÉmÓ ’ÊyJ÷¹ªÕÙS@Ò=[Žë|ì’iGi¹§ë~éœt>x¢i’FÞ>"ªæ–µ–@R7Û‘w0á j— ¶·ö»Ú¨ŠÕ,ßí,…[+Âäpˆ&h2™'P3tý{€Ü tä@ðН8ϧëj·eäVÐ…óšm›g™ vž­¿Öæ‚>vU¦£@rùE¿É”¢”2VÁé`ö±ßƒôhÕÏÉHL_ۢʧ&7†¶d´î ð’*DþþcÌíê{<¶²Úœ7ÎfIKK@ßÜmRt‹Ô²$ýYTÜFÎ>½ÅòTžÅ>Ü´ë½÷­°Æ§lÍêÿ:²V+ê`hcÔ;m­‹e¯Ü˜i}cü'sv@ó¢”S€z†¾¼eÒ*­‚ºFøz˜Ïí*"aÿïv}7³7i°±åÀµêpT%ÒÚN ``Åpd ](}¬01á祘$¥ã]2=”â¤ùtX¡3P’M¦¹ge,Ç;2tNV…ë>˜;êÏP»¹´Yi°Ýö&£‘ò¯g}¼`…ÿ†º’ ýSDŸˆB@Náí©¿;d¦pc¬Ð‰z|¸:ëSíufµ÷ŠÉò»2þoŒ}IÕ8"Ã/Ç“<’~!h¤¸•5÷ð+ÏïÓ£±£^HAÝ8]DW:gÙjø+ïMÑøg&¦ÔQ„`L,8Íû’•7=‘‚uá}˜™Zü–ƒz×µ1y¥°»†r““ -_ BŸé hâI5ñæÂñ@šh»aT:ƒîƒ2xÉû_è$\Î(&9`wÓu•f"i8Ù§ˆñwñÁ1{@é|¸ò°ÿ,ºiÇày²p‡V^éq¨àqýÅÑwÛ v8Ä3ÿ){9ŠÐ}¸¹f‡K×3ÜÕ´P"Â**•§¸>Ã9 ¡Ý«Î?¾r™-™xÅÁò§³—›]@ 9a¸+GðúÝéìEƒÙ  >¤3 jÞ'ïà–‡`?"g2 SñÖ7›©FèÕºù]”M‚ÄEˆ·ñ²ù/"‚!¾+™sQ’†–móï"ÌA^Äaœ9$Ý ;u’ã…BS‹kºBíU½_ê¸ršË íæ™gƒ<!óIz“\èößø>zò ß)sð7ž†ÔCßçÄå#«)k{pØXÂ*C,±ö[V‘óÄ.Fíxâ~è¹.UÀuy,žÞË:ëñ¹.Æ~Ä#-Óh~ƒQAº5©äÉÞÊfˆ›Œ.QLO£ÅðxV+lWÒÇu^ ¡™f,a¿É4=ue7Ζ6Z ¶ñ N?ÃQåð`oA€tT=¦È.LUÚC¤ú0¾ÙÁá¿ë~0 Ù¡YÆ0\(݆Øé"“ÓãWÅÊm¬Ì§ 4="hsCrÿVvñïr“ÍY7û‘_&-NÛèXÀ˫Р]«ôæ-y;€ÉÀyP¤u¿[Lc〠5¦vàÎW: èL@ŸU¾²R•gâ ep×à•©Yúµõb–¸‰ùt K“¡C Zs bö<€Ÿ¢q]õyü³¢ªN{†”å© O6!õÆh%=5—%O„LmÝ"Á*PÃd»á´Å§t2¦¸Ù1îåÿxìhAZXWwt LA›‘öޝ):,"{ñGìE¬‚˜;)ðwªªø‘4è [Â6 9d©)®¶„”Ìü3Œ“`å2þû‰y‰e³ ÓtU™·£ì”B T¢Yì½>ÚMD†A8¼G;ôöÚÉyŒ•è°¨/N0òÆfžNEõ^ WNä[ñ½ØÜ/¿:ÏÁôwì êsáè/Ú¥ýì³T­NfR3#ê• A6ƒÊÖ?;ÀºõP§®Û'±~SñÁ‹Œƒ@dng ×ùâ5&9VPÈÀ ƒ¡ ª¸í~<’ĨYêF0u‹WX¥ø‰¥ö:©xÒq¨¯YOEjqØUÏLoý*+hn’%OæšôÞ½W®ÜpÁÀšÖŽ» Dê¿Zh– ÄpÉâñˆa;` TðC뉆{nÞS‚+MêÞ`3'Äåo…ßm½2€ ­x`òÉÐÛí~¦Î"?L¼Ýk GæLÐàD¨ÎÇ€•áÁ-óðÐæÞ{´O+'ˆ¤v¾ßèÖ\›q XwäüfO¦}¡Ôü¸¶+FëŽÃ¨º?ºÇ²nJPˈêà[úUz­ÿo¥éâ;¦8ÈR0Ýcbñ­¶ˆ¿·<Î:Á-'3•}ÄÂ:‚Iæ÷ð]¶ŒÿجI©¹Ò0¹þs)«Õ|›™Îifï'<ìÞþ&g­þ|1Oøv©SìÿæÞÂ/Þ9µfƒµd– ¹ïù®Üßãß­E cÿ¿8•*LPU#´Óž±j—&¤móÉ¢#ëzß=qÜ€(fø„çTR­f`ÎsYŽ÷])Slû¹= ]ã¯úRñM`O~™C(‰1âÂCñbð.]¡zqèIÖvyÖ®3Í«+nàF¥†eÅIÜ qø£µÇʽ8¡ÿeùëP6–"»Îb6sFa¢þ #l» ñ犔ÂëóäL$£÷J'Fê`åŸÖ3óÞÅ“Ñê±-’™Ñw¡µá9ê>ãoÿdŸu0œf](hŸ;™|íÖJÊo$@Ûçô7STÿyQ¿oRhÝ{Aß‹¦j­¿rXÛ@+0§•±M7´È1òв0ÿWžyãXD킘+%›¸Ã1]ûžJbÅ×Aqz)2«$w¨ØÁ°]â"gï‡~í jÅ‘bi#À=ºÝHƒ(GuBö…B 5%Yd…KgΡ&íw=p/IŒÌæ Þ’‡ @–ó›;J,39gä$Ï?dÜ:¯é¬*nÀ•ÍÓ¾™#Á¡oü.÷cë|ö•P„ªt¹èEš¿£r—ÌÔÎ6܉Ý0 æÜœž¥õÅí^)'nÕ8GJ¯3ãûÉ­ÃÄ\Û¯7 æ`ÙÒj\‘íf…ú@ Ð84ÈKX‰>Á;« ,Žý+:#½ƒ#†ëHžjèÕŒNšÁ?Õæ1Í(î ôïÚ&D¹². Wo[xš<¨6àLk…Ä ôº.ö;Ý[T½i|Ók*匳ÒÏÐÑ#{?Ð 32ÔG©õ’Ñ«£VõŒ­Ó+îr“´úÛhþÊ‹§H¦”DÔÎI|!;ÿ¿æµq<ñ޲ŠÅmmáF¨ _5êŠ÷ŒV÷vøÇ%¯íþÉ“¢Ü”Wö­ègŽiRã$'Òóàã+rTÜ5¢ìE@04†Oyî|¡¡‚oMKz¾FÁ>“ã#cŇœyû×JnŠîë›®¦J))~UÜØRRÁ¿V}§õ%BèéÕbÉ E@L[”g`k?fáóú(Õ ›mz·ŠY7É£‚f±2?Œ…$ÑfÎï5¦kI«ÏF7ѼφZ<áÂî‡ãx?°kùPð»…ìUe񱂮û¶^a:Ÿ„Œ\ [Íe†¸„j™¸ÁÜHÓHH… Ëw>ÍZa(Ú…U‹Å'y¨ïšýÂùUjÇü‘ý¿‡j7õžþ=ÅÆ$Yœ/ŽßÚŸ•T-^FI£ݾ¯‚ü&ÁC5>¬Ê”HK”‹ `»fýbgõ×k´—js`­è:x~•䯿þefúäŠ< Üœ÷ååR#»i±µ šÂýºHæP˜aÄlú.;RYž»›V›*3iAxÏh¶¡¢qAò‹5<Ѝtf»\œº t Jª@ûFc ɼ!žÿ‘Ñ‚8ýajä:28›Nuý©ü'çËŸôÒ²f[Üñæéac _”Š1<íð~Ïþá‹P ÑSij<¨jK¥ŽwK8‰=ž‹Ï+]ˆQO Ç4OŸÂˆf•þŸC}­ ÓŒ@kTOó\ª=9G¨¤×+tÁšž]¯í”ñx ÊT/83Œ5[Tö¢Š[“DÂûÀ“õü#‰“¶5Gò¤”2„†6HYc=h $´*ÆdiŽV÷¤º+ó,"¦òª®`—ôj®|ã:ENe Ï´ N³k8ÏÚ•r‚¶¤‡‹‰ÏÓO][+¢ù'ê9(£ 6M/p¡åšªP¬?N‘µÄ¦–=KŒþè×;É?,A–¦1¦ˆÂçíc më¥ËзRXKtÙÿD;Á†B)Òp«°³ðÄk]ÂŒhÝ¿Š»¤­ ú¦–8±£Ò%3ü«Àµt7éÂÛzÏŽ*Jˆ1¨Ö| O‹‰Æ•ÖCØÉy”ü±òqM˜Ä"Î*·^¬÷‹ÉÍÆn¸áà 7‚¬÷@b¨£¦öÚfj`âš›Ø &Ï—l &nO–'Zs6ýšQ¾ÿºžYk$q=zø Lœ–›þ׈Á¶íÊE4-PT·æŒ?¿Ï4)¨ˆ149HˆÌ;ÎAJO>×·g¶š €Z‰þ–UÞ`ß°± tºÏœ\X¨ÀJ¥}Rò˜õÔEJŸ¬ÝXá†4¡ˆÝÀzæn*î¾msVÞ~¥¾‹O‘‹"öf€LÚ‰ž– <ž9D´<»éPìÊ'1~þ³P£ €3…žyÖ1ªuJíhê <¥àY$ ôÀ¶íC›ÈÕqhÐõã÷ ‚\ä{åU¤·F‰b·}¿95¸w¦¨->±Ô7i™J@G@É£ÝÌí~Å ‹Øâªò§¡­þ¶Ò­["[«ßƒýžå÷á°.ÂOîý‰m™÷T鲜d÷ÝÔ”®rž4þÁÒ¦“VYuYÉ+Ôõ«ÿó@o °;î‰~º9ß9¢6Ä_eéÈ>/·w»Óð ^á†=§àPJD…;ÂŽ#/÷³]9ÔÄt%Qå{†É`@L6úq™‘§ @Ô±'€v ÂÀ›˜ŸCÔꫲhžåÞ•{Ê(&mzC‚‘N xO'Ø¢yM¥Ìåhûdšñhœ…ʉË~'Fû-²·a"'ÁóÁ‹†Õ0£\Nðj‚ÝõX<‚:à‘}”s´aIc Sˆõ⯬œÆYƒŒA(^˜è€YZ|8YX—¢uù9cKüîœé‘Që¦æ[–“Û@µX’.­WC²Ï,’Ó$l/ì >^XûAô,Kk† ¾n`¢ÀrA8þ”L¦}rËF:y‹V®n7ΚQ1E¸Ð6B7[ H)™ú0˜€^^XÆÏA1XCâm(h ôO¡WŽ „ñ94IN“ªaºßîÕTæo=ŒžmÐÞ8L‘ÌÕúB›ìpò~z¢È jSqƒ£ªŽíäàddøúþ§„$7Û‚µªî>–ÿú¡Ac­ÞëtC›`ø—ð†Œ ×Hs¼Ô£ó÷ÝLµ «“Ê'¡h¤CÄú¿†æìÁ„ÂŒÙ>ó ú:iPÓê¡£ §clÓÕž²!j€Ãˆ³VÛ:*¤ÕûÞzt ùóÓ1×›Ü#ô«¥zÞ~ð8ðÑÌDSû·û™5AÒÌ<[×{ñ|tÚL‡ …H‰øá ˜GÞ« ÐD#ü†íÒû’ÐcŸU·Kd³+ÍNÍå ÛÃÒ'ŠG´b÷`€@°3ê> å”êÞÏä!‰©¿[x´ª¤J^›Ïp@]€)ŽST…À>F+Fê3Ñ:Z£¡¤üß1̹ïŒöb^@å™eÉYF&PŸã&iOäØœ¾AýðhcÞh;Ë¢›0TãªÌξ¬[mñVÝLgÔU‘"à—ï2Z•òε Ïö×PFÌÁO^ Ùþ?î­Íšp¢¦Î,ŽwÎ!F´<­~BýïÚºUr&/õ„Dêšg6zwü¢"ðÞé-yê)F‘E“_áùG$BÍËÌøÀ6HÚ&l”©Œí›£ öí 3çÂÖÅ‚ØiñUÈ7Iñ^Ú}§>å%Â|PÒ ¾ð|çÕ¸OµZªÈ"s†üÐ\‡±-²ª¿P:ºg}ÊPá^^Êr@Œ®ϸÐN«:Q¬Íç²Ã(j/Þ0À•¥g9§Ì¯£[Yé~wл¼ ’?e[å /á c"Ž(¾è¦%qÇFo×I§äe^“Ö©”|åÎf"û²Õ\Ö9ew AXB£3@Û`Š|£Šˆ–<æS ¸j¸1uȯàoõD(£Ê×ÔÛd›Ë¼þ<˜ù…¡Q'VÿïuÂM;gCÁS$‘f*±"Ù³ õO-k%NÃ>ùy§Á¦_µä½^:“¦€šßyO‹é~içx½«&™#îÒj"Õþýõ Ÿ3êX}'YvÙº ¢b²=c—i´þɬÐç´›gð ´]¸{ÖDÇ9n@[ë¾Ó&·`U c@Ûå‰ 9 ­~ iVò×åcÃ(ýɽß`\3zæ=jI#KQk”"‚%!T‹F-É„^|ˆŠxA–;ª£0‹ƒâ2¶shÏÞ•TfG\Ê»Ã7Q :ýŸ­äæîÝ9Òò£p¿Co4­Xoštç¤_ºò6|V6…Îðø6G-³®ç.ýÇ÷Ìòùë)í y‰ z±cÉ1#á,óþz!v­±Ä`<Û"~ƹú71¸5gêCä …7SÞ…òÂLDÝÌ>©A#ó¥rCRlz`Œå˜¶!{waIo1÷`£.ä¿mU}{9UÜ:hzŠ(£ƒe/h(’ÂOB{×qYZš2Ó~¢N®“ô9Ý4²’ÔŒ¯ÉÍh!=Þlø5Ó-ñ={„×l ·sÞÃEt7À(N~e–£ˆBÂs»)ÙÔVÏeŸ%¬l#¤«4Ø-VÓåûý_Gâ)‹…Í£¡Xÿˆnžà‚âÊ vu¥Ã !bÌUD›Ùyd汄…j/¾" G£+-UÌ.›´ü¸Šk¡¼›Ï§«Û¼Ö{;l*•øê~ûÏÃf^¤Ð Fp^·€ q¾HÔ¯T§EY}R&dº—oÅ/ËûfÇ:éõ㲆Á®Ý :g'#²aªŒx^t´‘Œ{[vÉìò²ñd ýf'!ü¹v!jÑ& ÇEb8`¬r×ù*Ž˜žùðù¯RAÐbX—~‡í\Î!¶/—*Yè,¼)¬Hý„Ãû/Wú¦ñ{ÚËpÙ=Å¸Þ ýŠãrfŠû÷Ž£ =~ÂäÄ{fÒ½½>tíŠÉêCïæz?k_f8§o¨@Ãùñ˜iêrD>ƒ@uäØÍlJœR„©çÈÀ$-HºV¦ëE,HðÌŠྣ„d,‡lc¯°Û©ó ‘áº[t§c:ªV_LYr”Dì òkÜGEìÔç¼i¦^·ôC{­oý˜uÕW+¨À†) ñ•œ |_ì&±N-oiŽ!…bÛ·ý=…_@h®jZe8±–ú‘öAæ%ñ Öa³ÂÛLbt·÷ oSŽ(º†yꃰ÷¬®ðKkNµZÁ¨O;ÿòu¢?üK.òïð™é.›\Ÿ{ùÒ\$ɬUû(GrÕO{+ñPÀǶ¦.–ñ÷¡]+˜^´½[WbÁÑÅV« F¸ð$QJD7 F0nTÖÑúªÇÙì`¸Ÿ†aÇøŸjw4§ Ô«:ÿ×BUŽ|B¸J‡H]탊ٰÀj)TLrÒ‰”­›~&kcÜÍXk…HÞ {/àBEXZú\…f Ñ¡G1bùxžBj7Áª—4Õ©ê3+²ô@ÞòB¡/p‚:éˆ;TP‘BDø,<ˆ± B›k®d}Žï÷.z,Å+±Yþdê˜. E¿‡÷•‰cãe¶âF äÎMÍŒb×Eï¡°“좀Á+ŃîûŽ^‘‚ëºíZ¦æXjE?t}«‘«ÑÖœ’EJ[×P\Ê“­6;ÆYBÃyf#QÃ(­ 㜶¯ƒ7 ¢º¾†;Ç`ì•%’tÆIT+ÐW´º I;˜7X1Bû|Yb`tˆ\àh)Tì‰ÜŸ§Ï#ƒ4cˆb÷f ØÜ6£âûñÖ—](wÖj¼Þ¡Áý)`’%ôŸÚ2ѵYXw}¢ÅÉå>;’Ükw¨«X:4s,Œ¼]#ÅÝ–+»?ô„®†Ÿ½+½—Ü´ˆÛ[2T°Žke_ƒ‚ŠoMÓ!JWM‡Ù΀¸aÕgÄb.QøÓãþT%Ž*îæfÃéE1ô‚g{5æA䇻´ºßÚð³»~B@E j\ÌY%ÛöÔãWzMpk=}%öÙU¨dD’0êœuÁáJ=|×BMÏ¿ò&GLädï»à€¦ª>œ,Ê*¢¤¥v;6ãtµk ÿü pê}j]òÂOÆk=½Pÿ–¤™b0;üe©ìýê vª2|Ëæ~(~äÀ‡e±bºÅqsX£Ä)2ÖÎÆÕ'‚FŧOžÓýÌPŒkÿW>ŠçæFªù‚ Yb¼¸gÇÇœ´&ˆ4!²/fo÷1‡8-ñµ¦|ÔÄ6AN!þ%lr¾Fäqê—Ðîç"„D,î³Faœ€`÷­Êª—1Ñ:yeª™i®àÒs&}e¤@;¦5É7f“X%°-õ.‰¤.L¿Õ¶Úä.ØÂÇP¯}Öq: ’h,ÓF󳉯럷¿—0iÓÃíZÕì{ŸWÚåSÓ©Kly yÅËôºg/fÔdûÀeéÛ'ñ·+Æ¶ï žªÁ6íÒäø HÙè`5Þx×ÔÄmZ^Â,uz âMøN€UìEÙèüqj&²(êµþ”¢ûA0k!wë+äŽc»Î€GÕÞ+Ç,;x`VEÖg‰y[Eç!Á"š£YuÕƒ(Æ1ª V,j¶_Ë >ž%^ݯ×Z]D¹¸=7´®DJÑiåL‘Ð_FäìK32ò‹,6eg˜àt5¡ö®u!ðµ÷ Ô2µÃÍ8Ć ñ~úW.ÜšìTbÁùzÑy8Ö™÷ê8pO›¢|¼ýYóN4®-wû t&UYc ‘ƒêûŠ®Rœƒ*µÉò3UÕái€°L¤D˜L¦¯¡zKJ´ìNÈký5äD¡5ôúOâç1XÈåÜ ¸•üúYHp{꣇S\î‹C9z­7]ð2pöT€W‹q :ŒZ,T„Ìç›Sž.ªYŽÆ[K°¯î >Ü ÓØä`7øXAé=Sx7»X·µxúœ¨+ÃôF4†¥|ÔݶúK¦q燬ӤÖ—ËÿëôF?úàÓ\JW2Å{†VΑ‘Šñ §§¾S JÕ·Óû/]FºˆýHr:=§Âœ¶“s˜3\¦„uÚc°³ÝxÚÈîUµ7¦žBè' G´63‹Ñø³œÐ›Äõtí¸ûq[x[µíÂÙÍ1ÏôÂVs¿Áܑ˪EÛ5 ]`—Šˆƒ4¦Èš¥cI×\Ôô¸{ÑÈ7Ç¡ÒíÈóß°?Mp¤bB¾ª‡åQ/ $l˜:ð^eXì´E:›ŠëÄ=Ó;è€_ù·P쟷Y 7ßi.è^K£±Å%ÕK ß­oJ³EÀÞ³Cf0)Üߊ(Ü& ¯ˆ_©Èl[‘"-vÿ5ßGÅí¥=}”ž–ã.ˆÌèóÛIDoe¸äâzPÿdº‘ ³_œ~¿aE½•8Öä’Ñ •8^U¼ÄåÔ>z‰¶:ön‘C×”Å<_•%C°ÇŒ $ìV£é_?¾Ò‘ÓÂØ»C^€‡ëÀÄ'­`i/?f“¸$5i¡¼†6÷éqþ)ts ǼG8áT)Εd' ž1,øwÌ"\UÏãÃó‰ÃžóÞ¥nqœÂA~)tm‘¬ÓI žu9ÉWÊ£L.6¦¬—+´:Ë< vܶ‹Õ¶6± ®5Sjãlž–qP¦ÍþQÉS9í8Ÿ b”¸ï‰ügåÜýfn¥§ÖAVë¤7§¹ƒ–ºû¹è¡€¡t÷?؂ķ¦“vŠŽâDZ)Íéh qÌAVÞZÛ†­*A>ZîÍ!”ÅLWm§§¾6Òe<5Éw»î‘çäÕu³NÒHü–“î.º¤9›RŠÝi¡^“Yûün™B¾¼s4kŽÛs $ ^š*äbêùfý²»k¸k+Ù·šå°E9ñ$esÆ=š:P¨ #ëÛÎ1üŒ›é¥si©B*XægO!5¨Çþº{ôƒað·f± ‰[Â7÷"íU­K¼º )7ÍõCçäžÚ4J[Ò‡ˆ9Z;€œ§3@ ¼ÜX endstream endobj 192 0 obj << /Length1 721 /Length2 20630 /Length3 0 /Length 21233 /Filter /FlateDecode >> stream xÚl·sp¯]-Ûv~±íœØ¶mÛ¶œØ¶}rbÛ¶m;÷™;së«úêù§{õêÚ«×îzª6‘˜½‹Š§ƒ)=#7@YLI–‰‘‘ÀHÏCF&ìdjèbio'bèbÊ P75(›:˜˜ÌŒŒL0da{O'Ks ¥1Õ¿A€š¡‰¥­¥@ÍÞÆÞÍÒØÀãææ&àæìJïäÊGÿO“²©)ÀÅÂ`fic –WД”PŠË©ÄMíL m ®F6–ÆKcS;gS*€™½Àæ? ÀØÞÎÄò_šœéÿ-ÀÎÍÔÉåafNö¶YQA1y9€¨0ƒŠ0ÀÐÎ #ñO»‹3÷?lSc'ÛMG pù_dcø¿ÈèÑÿªNÿ‰èa˜˜&–Æ.#SsK;†ù&igf`ÿlâêðßÒ?‚œÿÑ üÇC*€‰©Ù?lW9C[S¥°½­ƒ«‹©@ÖÞÄÔÉ dokh÷_–¡­¥çÿ/ïÿ2$] ÿñAÐÎüçÿY:‹Yz˜š(Xºücµ™¡Í?ýW7ýϽȚšXºÚþ§ßô?þ¹Q{;Ïÿ{ä?cüû@ IUA)šÿ-À¿Ë¢vÆö&–væe—¼4t2ùðﲂ¡å¶ç¿bþ»M¦ÿ—˺8Yz´éÿµŒÿúþéþ?–½‡7'€Ž…™ ÀÄÊÆàbáðýÿÈ5vur2µsù·áÿÌòßüß‹djêaj ³¶loü+Ä*­5¬ÂO´h¶œfvÚ@•f™ xeªûFÙrÐÂDÿð ç^'ß&Јw÷rGò¾…Ø0Þîxb2†(Bw組¤Òܯvë]±à­!BïL ÛÖXì&òÎ%c}-Hz’5+÷¼VʱŒYœ)Æ ¼£i;auáÑNœJ—%SëÎtŸ¦iÖ"´ðÚˆÿuo $_#»=P»#ü9ÏÜ{~2¹ìDìq2Ü- `àþ<ÑY]é hNÁÐcc<èŽ&3­øEQ”:’ä~´ÏÛÒú$ Ôzb3Ce5žgªâu~&÷ÒTÔ8jìÆqÅ“7¢­$d<‡Šlö¸“Èq}+<¢VÈIzíf>°‡Wdq·\b6$ѲÜú:VBÉ…rKP ÎsSÇk¿}IÑiý¬Ö’ÝDDÓ{8)+„kô5 ðž*ù0W o)PìUD=\Eà8IjŒ¢šÕM$ü“ÕÞñÄ>A¦@Ï9¸4MÌ÷0aºevø—´~‰¸²G9ÑÙǧˆÙd3X€&>¼)áIñˆº­­—MÏ—m£CôU\àOSØ~†u=‘1yG`« v7HáÑ?¾ºbêbZÙ«µc°DÅ)‚ÇösS¡j–ƒº‰Dj¶3q¥³‡d Z©MÓ,¢À Í1úõ»™r†ŠdãåU(ênÏ,«Wôæ‘æ+]²þü¨¨OZèûË`Õô¡{wÚ_›_[!–ŸXWH¡s‘q—N0/„i_ù6XÂÔšæ÷’8ï±p"vBòÈK+‘@yä]ùÑ—êÝ3(ñ¬ú¬ƒ±m„ò&òuþ‹‹“5sˆùœUãøÇž<äï¼CÇv8RÍ(æ"0eQ‚‡í÷ñ™›N`ÁpH”»š›ÐoŒõùëÇi/Ùë0IV&Á´™GÃÃ÷›’¤Á|¢ïŒ1Òzi9Ô*°»»„©¶Ö—RSáQ¨kMù§îI†'F>¯_3½[Ħ°l0.¥ÑÏ¡lým:ö­Îá°´ÍÔoøt~ö:9+VF/+†Ù¸\ÕQÊ?ë „—PÜ}Ùþ´_ ÷—ßÔi备™ÞyÕ®Ÿ.¤C@NR3n{TkÛº1:9¶È  R[[‹7ßo–†FK»0¹9L4XBs)Œ½óaS ƒwz‰bÆt›£( û AùL0J†Øg:iðþ|#ÑÅz¥¨ÚÆé•1A¶B ¿v¯.7ÎÑà¶ûR"ÄÜ%¢jéÒYÛ qùˆõ× æÓvr–´Mõø¯HÁ„ß(ãñ¹fdáûmmk-Áñl<ÐÆÔß²2£«¹àžH•,Ã!q}ÿÔ›‘«_c_iô»Ø54<-„9™È"xW1!Ô»EÏnÀ"™çp¬’û¶ÖŸÃºv{%«A°øÔÀ1®Òm¾3Vw‘ôçÀD(zsž¿ºPÕ/E*°?)÷Ì'¡+~,ƒ*|qxûÍChżÐA+Æ“~ÏNLöã²Sƒ/š÷{ûÓZ瞎—°¼^anª¨³t¡„¤\øhÓ)Ì…øú¾9.žÓYn¯¶ô—%V7ÈM¾É·éyvÏ“ŒûtkF}Hõ”ˆ—_T¬änoß֙ŀ‘ñ,ø=¨Ph±cµߨç·6Sξ‚_É0f3&(l½^¹ }ÓÎnhÆ‚¥ºÀî<—1¸Ùï“cÑùOEíß¡²e ` …ÂK5-à/vO¤»fò7©òUÆ3¾>Ó³¹i´HacE¼Û#¸×ëÈ'Ê'ôæO•:±ø-Râ¨7M˜_Bà ‡Ñ$§œVŇg+u‘á¢u~¬\YܼT¯21ò <£‘£¶–D‹ýÐõ3ù{â"HVï]w>¶WsÆ““(À;¦`džݶ‚—l¨ˆG¦dÎäERn;È}·ü´ 9H@)YúZŠÅ y¤Õ›Ó|mDÐT¸m¼ç4¿Sµg©ˆ­)¤o&¯×6¿jR4C] .t ìávüOk"" …³îDû|í6aÂVYÍ®IMu—Ì6òw Δ1“$ø¨Ÿ¼,îøOíÅëºðæ–²_ªuºE€é#„4q„_—‘¿ÃR5·sa_ãNä[ ¬FŽ/N`Ô%2ÅX¯yï$·BMcV‚l4–à_ÄBx nø9µ½_ú' ðãYÕËj±óÆÆW2î&iÞ>ÉdãHÇy.Ö"%N\‰y³w¿G#­wª$‚PÎ5,.yÀ¸‡´}L.¬SÕq˜È~’ñÝ¢(³FŒVé=\4µ]ÌêÈmG:ýÃ`Î# ¬„ça‡”1žZA“ûwÜ=8øD#Í l]HŠˆ+Ø3(¾Á7˜‚79'ÚsÀ>|ÚÓûŸ®óÚ]«ýH…§ð$è"R°Ü<‹Iëå'Ô„Ê >­SÆg+$Ç-‰EP}F÷TôzE ø{¨LG‡,º´_)á/É\i?sòžïSs‘:&йÓ@7Tå›n‡•†>ÁZš¯â6Ó;¤zô’Z> †¡¢SdX ¬0Q¼˜˜èW­qÓu/pᦘÆZ›»‚Eaä8O¡¶¨{Ôv/?;†ûëÃiÿ~«ÍAª 9ŽNºv;•ð±®Ðå3äîì7ʼnH úJhc¨yöÆûÕ@1÷[1Gpœ‰Õä2æ¥óR$mìxÒ£Ì@$ï$o×;œñGJ ”É?„õP·Ir®H›/¼ßcr@7¡½üyÏ–´±ÇÍ̯O„o¼Ù™bžˆ‘žÁò*¢èúˆ˜J“”˜éDüdL#Ç×üˆÆ%ž¸Ç,±lŒ›¢Ð²þ7ÛåV¶ä0Út@cÏåÁ^‚´ °*EëGÖ<Š„¡óóaââÇ«Ð&¾ÐhªºñžÁÚÆ½/Ûõø¢î`w>RüûÃUV1èNÒToôF–UV’ÍbO ,±³Ê¾‘•ˆVÕ ç]šBÇùmr­h¼mãhÉcßAiT¦+²Ó(:ý÷´³t²ïUàacP.›;ý+Ø›@Y–ü(q)/—^ÀiàûÃÐ8$5Vòœ?R˜pls1‰œáb†;Za±]Šoƒ—þ-0×tYAžð@VÚ@¸Ü©ú–EÇ8ëÅ‚zaáð>³~Rð³ Ö"–MwÁªæ•àïvÈÙä‡Ùí{ëè¡U÷FÖQ‹u0\PºW¢*°õy¸—næ²þNæoÈ•R§Œ:ߊç’µäÝý”zèG~¾dó°y<Ùú±!)ÿÈðoŸʘK%Õ1ª EI\”#_Lø‘lå£ÍšúŽk¦Ð¢Ñ¾•ŒèÙ§èó³äAg9×?i\†\Īmý«žžvÔ×üõ,e¨±Oö¹ °{Éö• œÔ,­9໲üK8x1‚Æ®õ›%ô°l?âA9FY/íI§Ùæ» žš\?Óûñ¢©ïáö³`ùm”â ÜQÏÄ4ÃÿyjJ»-$¸â 6Õ…œ^@'½Tíö¢Ý£ ¼kaˆ¿¼þŽi´Lä"þ­ÓzM ÇÛÅàè ±žÞjØ®¢Y¶JDSÔŠäÉØj;V°÷·»ê‡ PÕÕÚíµÝa=…8ï¾cd»kÝÊ(`ÝâïÔ6¹FN™Ô—ºÛg÷{xÿ;“çñu@E=ØDDX©D±k“rÈ…œ˜ ß¶îQ}îÄÊý¾&öÎãÀe§Ýá*µß„M ó» Hàït"ö‰ã© ˜7~»ÿçG>Ó!ÿÑ,%èîWßIUzšMFSÀ‘«=³‘„Ž3K—±oN){§½=ëãb˳ ãP…nر¡üéòxTç¼WBvÚ5[8'è‚¶3øé’eš[`yÄ`õÑs¾ÓE½+Z¬ ßü€Š•½ìªÅŸÒ©ŠGЋ²ž Á¿‡Û‹À%¡/ÉÄ›V]ŧ)Ý-S0ð´ÅÙÝ—¾Úç0=U^n2é(¹+Ò&>ÿ^KÛGÎu=“1 í>ŠQ1ý¨Gc7ú)˜%È¡\&ß^Å€À½SÈê”ÙvQU¨¦ßa’Ì- ¶áænÿë-f»ž€¤,[y<ìݤ“ÒLb¬c¨&ø ž›vHÈlSGßR¤Òk/aP¼šî,H—\Ã¥u¸÷)F ‹"Üv轊Ï^¾Èaý86ø|Pâô4F.ƒº{­CP†×ÒÛƒ—1¤ü¡Á3ûLæú™Ä\ânMÜrÿÚÐã'ç¨x^nm×'²M[MÂî âç)¡nj\à8O¢¥éK£LŸ`ë_óäËrÿ¹6ÿm‰<‰}ÖÉãl,G˜’7ýw4ß&ô\-nÈ¿[V’Rñiãy è[Ç%5“pL¡ü]wpš„§äuʵ͠èõ…Qµ½9'*ÆË²ý …¿ê†eþüÒÔ"a$Š·ZÚZ‰ÐÌŒ`ßµý—Ñ"¶ö¬ªh½”jm^3˜¹6¹‘þLJmƒÎ);s}'Îx_˜˜bÍȰ ú¢C¾˜3 ²Ž\ù<ËÿA€»„:†²f·‘N¦•’¢Ð›7˜ß+Æ®Êí<ã‚ø…ùD§r/b¯“À42±µ®7god°&@bÉúâ 'PÒ}ÔÔ¥cýmp(€ñÛšhn]2¥Yí6ÀÀÄG3LXk ;^M¯šˆ”ƒ˜Ã²Ô-ÁºOãÚ-Î(ÀcµF2V»c¨@ZWÏÒ#ð}û‹hšì€tòº?Tô¤mm¨ù댕:çèã•ó[%ÇÉc-„-¾-À™e”™^R[îŒÛcu‰‘ÔP-kƒaçªãHv:„D»i"+3A×§Ëp¥Næ—iKóü|–GTO¹«ßf]$ÇÓY,ðæ_!3¼€’>s¼#sãvV:1ÍdfÁähÐÀ‚*îÑË…«žÑÐgšÓ±åB-¾IÎhȱ6 Ôçøö‚R’UÛ[ì®J'íN(`Ç­ù§¸®Bl¬‹Mëâ²I9ĺÌÍûµ8°xSpšøÙS»ä©þeP^ÿ€ké÷^Òß‹¡ãÈPÊÍüf0D–ÖÈ2Nï}\Þ¢@ßËQåˆhs¼ý›÷–ceŠ‰Ý¬¹Á*ÝÅŠ…SÓuµ1ra8vSëÜ4nä]b¾‡¿éqFÇåâ]ñ9­¹¾Ú*]ø÷™¯kAÅ8n0öq&‰û:ò’3R¦’ã²9å"Z£ûS•L>>ß²E¹Ë!åÍ2×VN}Kt\½´U¯ŒÎ IŸG æ¯ÃsòÛ·-q{$0Dÿ‘'.þýLIFÝVmv£¾~TþVo4±íSmL—·«Ó)˜mùw•\‚þ/Vñ«c{ÆÂ®J$Þ(-kHÈê~I FüÙy©‹uU^#€õ¢*ödšZù]¼º·\i>ƒ,¾«ëvŽ·íoŽ×cô<™3TR@‘ÿŸødXw~ÀQ÷®ÌHGaÕJXy$<¥Rr¶-» OwÛA§ðòVç©øÆù•L¤–Aœe/á˜f\NqY{qà "\§ rv³XòµÛÙ}õ;xÕF| |žÒï?ÕĽ6ÉÙØtT¢$0PÈÐS䉹'Ž Ó@ÍõúUራ 1r²­†Ã»ÙC´‡5…¶t² æÁáÓ!9Ÿ(ð«: ©'C/q¶—/QL•èXž bŠ9ëÏÝ«.FWÛÑ®’aÄÛ ‰:бÝáÍ*?v¿ïÅDØuEOàô¿å6mvÚf—Á¤*ªe= ‹"@K_cz#}Ê¡ºZîD36t€ëu‘&úI²a3Ü {7ˆ?ûËÚ@Fíþ*Æ™¼)ÃÇí¡ůÚ¹Šg‘è Uz»eûÂÙr\óÇÑ ëeVâ;+Ü-ø°§y@ð†»Þ³w‹XãwŸëvÓŒüáöeÔec8>§E£4»’PѤΊ'ȳG=ð¤ºt>«,ªFSJpë$¥‹mó…Æˆ•@BŠq3lØ‘B‘͵p–P®/¿‡æ[¤:A±±âUŠ[p$å¥{Fjjv¿pŵ ïQ0Ä<‹îào%c^ƒ‚^`~ƒ(óU†„Éoú$è"(ꦆå~ÅéÃè;@ïÞûSúP} ËJqÇsIä,ÄGMH©Ó@¼þÊèÇh‹ÜˆN;Œ[¯(Ͷž!úõDZ ûD•D®ž¡OذÉYà-ד›âQõY­AÚ°eGÚ¹}Cû4ý¢!à\˜ÿ×–BnØ¿ô²ˆéj žÁZ*üAéTk2är%YD™üúöG•$Å }ŽÀF©_MD}Äâo9T$„&‚9ýaÓ¯ÆýÏâ¨ÊÓj‹ll‚ÇlWÐ ûñCwRí´ ë!ZĦD÷ƒ4W ìÌ 8´ö¾Ê…§‡ž¢Ò^ÊZˆä¬ 6P©¢(ùBhpÙ#Ð9<òØôªço‹¿Û  ÈÝn—GÕöv¼ÊüŠhkLD¿‡† ôô÷üJÓY7¢=zÒ…zW`Gú-ÕB£TÊ0RÒCļ¾Z6Ýéô†|œÍ0õÙE;¾·ÂdàP©ÎH¼÷À‰¡SÍÜFšbFC€ÒØÆ7Ÿì¬1ª?ל¼ÃÉHËÔ#ˤü©W‹HW‰0lDH)R¬&ݸøÅ½ŠU¢À/PrB[‰B9\¤·5KCã°·Ýž_¦R8F[É}& U£©:=½ÆõB½Ûo˜(†ð2«ZŒ{çpØwÈ¡ë4õ#³U3Šöê¿Cça¦@P³œT±$ÀñWº±K%kAh¦Žv¡ ~òd¬7¤Ñ¡äI_¼ü;\«ŸšBG¤ˆX#?²[ÓÁiƒˆúK—Òü1§éÑ/ÍœŒ€P«õbÒæcC(L=grÕ „ª9 ª²m¡=“å͆.㳥ͷôbҵǕZRàöØÒpŠxÓ?ÊýÄdy¹¡Ÿ€á^ÆB¼´>”ÅÞmŠšŒïYQ±oV°ŠpIé­R\ß6"ù†‘âIsb˜ª¯™*T¦_`±…õé}Mí=Ãb!ž}–y;¡ÀÏ(™ì?»™?oÍD=aeS‘¾¤Æ˜ã?/3­9¼óP0§{”ô4+‹âx° ÀM‹“ÿýëŠ 0žE•~"wøË/Ö¤z`ñ3ß-ÊFħ)Ôo«•,Î!’Ñ êñ®qƒ*v¯ýwü*R{.à"à#ÞÍF=DLÇâ*;·{ãÃÀðµéaH ?"6ö>?dÓñeøR(ª.[†D¬ÑarzʲÓ½âÀK|¼‹-•{ Ôšlû^ž™ãƒL_!þ‹§¬‹졊n§Ó]+—¢àC–L¿œ"ç@"~cÕ‘‰+Ó®ôú‘,O×ÈkŠ5ž' h/‚^-ÁÏmO2Ápße-b!e 8‹;»ìuÜÒc¶9<¦x} ŒûÉ{>Û)äÞ Îgp³ºðû4Û+‚ö*ºÇ*^ÎÚ z;Ö-ÁËš¿%—}™kɪ°†S@G¯1Bõ-šAh¨‚Nê2Hà'ìžôr0nÅ•ã“WËžz p±,{"{!àµH¯–¡â—‘-^JS¢F£‚Ë÷ÍùdwÈÉpË·ï瓬Þ)$RKþ´ÑÃÎ`u¯þL'²¨!º=7_x3g  ¡úg\ŒµÌVšjõ]OÇFƸö$æ0ÚZP e4-“‡¶1Òo˜=ÉÒÚÈ&¶ú …9ÚqApÓ?s¯j8y^0I `G¸_^‘fN¼ÇFS™Ç\î#ˆÑ ·é¾x¬ÿ0Ä,Œ­ÁÚ½€þ¹©ƒ•!Åï›ðŒnàÿ¼¦bÄXä-Ý$d†wä÷T^ÛÒÊÓpIÅJ·iœTA=º6r¸à© ¡Ä¼_»Ṅå­ÖlÎsºiƒÜ¢»õ¤öÖbt p8Øû³õÊsìv4­r—;”&%;cö|†¿íNyÖÏÄPæHõ¼Ä$ëéX“’ˆÆvˆ@zbUè$Ѳë(1Œõ»µ•„À¢`drýr„6#»Q÷¸í~ëAˆ‚ðl&V•˜ÜlÞRP`KÇ0nCqÁ (²/ÿ. ×aäÇ]CGyœî äå÷U&ô|Y3YAùOèÌ"8ÿëN'ÿÄí|M¥ÿ7öç—õr¥@[ªÒâÉíèhã×ÝH8mÁeÛëü!Jgo¡&ŽÀ€Î¸b£ hM`ú,Ï}'qÿÈl.>¼,È Vö…êS4D’Y“x­â§’òÚ //ò2×nØ%ˆ—5~ïÎ;|ra¸0Æ›HBs~R „AGóûÝñ¯›£f$I±íc·à¼ÇŠÁEq`éVr÷ºbHçëiýë!8 ?芄Snµ\"öŸN_é¥3`1++ÛéQE£ïd'ÆL“³ÊR™°ƒ=zl‘„â>¾3Æuÿ€ðQ‰±E&ãÈÓìꄤ&ºmΧ¦@Éî¾’ÉݾÏû$ˆ@ˆ}8ñߺ’ ÔÌVó}êì×l\bç?âÂy/Mª„ÌéWb¡’äñhéágÚE^jÕ¾pHí̓½x)vþEû‘` 6½Í‹Ú ù°oØ¢c ËÔ®ÁdJN“+óׂlyY7ëÅ©áÖð .i‚ö ƒe=b!½2ñ«\¶…§®÷vð°í Åe¹…rLʰýƒ…”8’P ª·É®†•¶o¾0ôñ>C{ *,;6 $5˱*ù·²Åá´7˜È¡ætyÌ´¶?b¹¼y¾|À©÷n!ÉÀYw/Ûßí¨ç§Û$޳R”< [î.ºã¾ØŠo*»Á;k´MžmÎHµaa(`üèYìk4L‘Ì"¿l?1,ßo ÓÝXÃðÕù¼©÷Ÿ»%:å‹ÇKÂ÷YÕ]9ú›Çó\Aꪭ¾ ŽY+[Âà+óÚ#¼WoFIqhp´K¸1I?<˜œýêMJê×he±)ޏžcÀbp¯µ‡ò»“'!V…`Æ£ªrÙf’ÁÇDz6B{Å¿ UÅhvøÿ*¥:AÕÂoõ¦kL%ðBÕoSåªó°¼µÔ ï[ë¥PÊÂÛ#¨ë È>„ƒF)è]‰8:o&y¢-°z|@{ÚTG—¦æ8ê&汜_'¤ðèh‰]°øomß iÛøáäF¥ÊOò›Å½&ŒP­ªÙ§âR?Ž^%¦Â#7…ÀÌþ´Þƒ„e;Tæ÷ÖI&ëˆïqXÁ¢4ç7;qÄ R¤è2{×C"Θ‹¾Œ×ë.¢Óߣèç> br¾ë$;O¡“ûèÁÈYÔ!Ýx)WR}² "ÖEÜÆTμà Ó5r‘ Æº‘”+¹ÙËŠÍp*Ã]²ÂÒÁ…ñømµš®NëàÇ34ÈôbÌßà2çñ¸&ÿîp4›%йýú£o¢0éòÙ*¨Ð#Šæm¡Þ ¦¿K“W‡Öóª@EÇæâ,Ѹ,ÜAHfâúkÕ)0­ˆu¢¾ÃhyY¡§måKúNmXè\]HxY ’n",\k"ûÖsfíšQ3Áfö Ti1ÁoqŒ.Uñq^Ž«;ªROmI+|C?QTØÆ#¡ÛÇ9¯%¿kl sZ qŒqJš ˜‚G¥M_íßC,q¾Ÿåù…Ïk•ËpÐdû,}ؼòùòb½ÂSNìꀟÝ6ð)j®?ár ^“+DNFÑiþ:’CKÞWºkkõ½h9çרM1˜òž—Üâ{QÝsC©+FD—A I;µq=°1ºü‡F¤‡$ td€§EÂjéb¸kTЖ¸³«¦°~‰[vtI7~(ì.¦Ú":?Oƒ€ÝÎcÞþ=}ñw;ol vXB=…n° ¥À]s¬bÜÀ{ÙKwÖ3!_9Pʯծ>nœ>èÍ+†©¯’C|"AÜ÷õ6¯äÕиï²k9åv&·›IÍ k»vŠåqDNvu]BÏó“·-qÆ*h.,ÐôÉü„i¼’ D×±÷§ðî.Ž.»s— úûƒM­1§tm»L{kù[(á¬ø¿6·Q•@ßZšŒ_FõiM)à´È׬[îIƒÚ=pdÏtÖÊXpØN…‚ þB/nø…žµ’ DÚ=-?¸ óc’$Ùyg¥ã¾{—A ÄqŽjˆö[ã¼(o ÙÏø:0 Æz¼‰CäÌ;°úÿ/•ú†r‹´Ê‰pë«Ê¥ð›¾£iJÃðö½’F=x6¥gÑF»’ Ï#ïL¾Yl×tá6¯Ç°*<]ÝÒo>â°1°†÷l<Àèƒòƒs 3"Ãåý-«£±j=ø¯l"Må…,c¯«ñaýÖÚâÕ é`ZO‘æ$9 žÆ¦4ÚÊýô¸ ̳2uû´ÚGJ¯W‚)°ÿý!cmÔß{Œ—]ÇÁ¡p9]&‰ÎèÑ<çv]i”afÑUø¢öÕd—± •”Ó˜SÀ¶¢ï›%|±ö@Ÿ÷…ÚPrè+Sïœ6h°uôír]ãÁ´×Ûú•²6¦= N ¿!ø¯Šù«F€‰/ÝUÝ«©v”Õ9Ó:I÷öÃ+ Ør½U– Ì/„1Æ—…d¨8Ø0ïNPXÊËê˜Ha~p¦÷’KR²×;xñ—©9dÝ¿j0øE*_ÇÓL–q½Ð@¦î°ˆ$ÁV·˜ølSê;#1œ )ÕÕ¨¤ñU$p\ ›Ç~G¡ $ @6åÝ9ªÏ©ÃÅ‘ÖÄ™÷©-ËÑ´[Ü™2h&zY™v\ÿŽg8^Ü™ò±˜—˜Áçàø:)’LÃ7®uf”Ë€H'ŠC_]¢á—t{Md‡ «p}˜z­ƒ r>+Z¹‹MÀÖAub>§uc­]Ö”-•ª’““# 䯉;.ºËþà4 xúe uÅÞQ¸‡œŠqýö>â´Ö>9a¢ R³zþ¯+£|ÏmäÔ10,=¥mzt+쯋9˜÷ùTÏ®2V£r“…­Â¢äÌŸ_úÁ4i»Fóc>6.@û¿"°PdÂõ¸MÎI62”=ýûõñpÜX‰$¢ÎŽv-ÂpX–lTàc®©°I¤vΣH¹(3"xÙDèRfCבxg³‘@Úa¶)ÅŠíÁOjTGâ`ÜrcðŠúø÷Ø7RË•ÆÖ%y´4‡ßȰDn›Ê¬©e2ý®áçìã=çÊ¿ŠÉØðJ¬²GfÙü"RtjÛ0!¢äÎðwH’²oÐ_ dAÓŒ’i)Ç;îˆ2çˆ;£f±´\´A0­®m  œˆÿm¢¦_¥Ÿu-õýé€h•éÎ÷2Ôwé„ÒE3 Çöгt6Ðêß¹ºóŽÐ³ú`£#ê¾ù%=>å~é‘Ââ.ãd6—llðúY(š·.0ÆÌÉø‰ª «>í¶rç>1Öy$bRÐ&OõM\¡œ ¿©=˜‡ß$Í:N¢CiæÖ³Úɱ×-‰9A9%Û¢Ó:¤~ÿѬéD®Lxæ’lA ’eß0i.#ÌLDÓUIølP³F 3Òßù×8¶.‘_OæÌc1. Tá[4oîÔéñY‰U4ÅñzC.– ¡»ÐÈ W¢OE§Ð7¦ µ·Ú.Ôî´§•³ÉD÷wjëýP25{”¡%6ÜWm6’BŠèíÌÈlPøÚr¡[‚œ–J×ÕÞ’XDWÅ1¿âÁk8ñ胢´Ò^ÜwšóÝ㮃å“S{©±UàÈàŽN(­6¯øv7STüCÖKÕs?ÝÂ9]vËÝ/ ÂGZš,!xUð*Ûþ‘uÕ®ÉF™ùß9¬7¾÷TÙ«Íøô­qù"Ž÷VP=­3ËžoùnÞ65öŒ:ý@!gt8¤›?Û£e,ô|w(`²“µvØr±ztËÕ«A€äç*Ä©†"Ú|À±´U•šwt¢ª\|@BOØ|Fèé!XsdR¡S×'gZQ>™Ú;(»É÷¸E·q˜ÝFrí9>øG'G/T¦¢BpÑ–ž²™v‡Ò˧¢½ÝÙ)ßìŸã£H‡3˜µ@áGÁâo¼…_2}k:¢=éZÉ J7Žë ÞDcÖínEÔ·åö^qëÝå=©©#Á÷÷.N•@£‰U‡/ïÁuVfÞ¦Ó¡¤úÏß¿ò”@YÍÜŒ<¼)ÉCFBÖFÉr¡µfEü= öQ€n­‹l§¹÷Ž€+^ í‘©Rpø>°™˜ ‹‘[ýJ„­"Òe9Š¡ê¦<‡Á¡÷ãñQ7„À_¤“õT!˜ïH‹.‰óþ0uû@“R‘£†&-º4B¢r»¹Ñ"¤·KŒtí@‹¾gϰnÆWBoÓr6üì8nàHŠÈ(6UE¶Fl1Š£eÿõÊ¥ò>0«=G‡¤Ô´”²°Ü7‹ô¦ϼþ|+Ùü®Ð«åUÕDÂnP„F'.ì¡§L‡D­¸ZE EÔ¹ÎÛ‰¬‹Gb(Pˆ·FnŒåò8¸Œ ˆÁpüqD2©é~?tÀÁÝXÿc5™ûx5 ­$Ô¹PI3ÒU’G†4…L\+#Eœýþ;z#œa Òzm_rQ«Uæ§ÛPJÿm“ÕN;-5ø&ö(Iã­Ò|S´Lï‹bh¹™!pýXÆž:Ђ¥J¾Ý •Ú¦n~$Ò;Ç5œ'@+Å !BV(ešÈþ^²=üC­6¬B‡!ù\EFÁþk¸>q¢ívœÈöÛ< ´á÷&6,ä¹¥?9Ù kÜbZÄøi‘ ¯Ãé&L x”¢}fžÿŒšDœ„L»y›IVl‹¢çè Å2*˺~ÔnµÀc¸½T›®…8ä"nðæ`—¤ÀIVDN$»Ÿ¾¿©ëÁè +ͬ]ßByM&X /ÔÄbŽ ™9P“NùÕ&¢wQâóð±+¥Bâãoâü˦°ÓÞH/rŸÂ5žã‘À†yK¼p쯴‹œ¦Nêë`²ÍÈ3<à—~=t¯ý ƒËNÃ:–»^¨ÄAëÞìÖ:8jäó‚Qã8µþ×ô‚'Œôœ}ëáNøßîã=lfåÚŸªB9|{î;ƒ¤Ò=UMz-˜ŽEªÌ<ª»]>HXÖÏ7Ž=®1?Ų‡SGˆzù[ž˜â¶wH†dì{ÕëÚÄ!›w{Ä2òÄç2²eQònÛÇUç“¿nÁ‚øCÒ¡4Ì´DU2¡ÅVu›#.íŠù7¹`%K2±~¬ƒÝ.ãŠü©6øØ™t6M«¹ÀðÓoó]ï¡E ¿-«TÛ6éÕbB ˆ\ûãï3èYŒ& ©võo1HwçžÕÚÄŒ…̽FÒÇÝΰQ:®Cˆ?jðÆ@Ÿ¹©Í\ú¶ ¸­øð¬2Ö "e]ßÛôÒ, ýû°²¢ß¢¥Þç+`I¦åÁñxÁ‘ÄM,'ªýr÷³Ì2z÷‘BÈeñK¿ ¨+»qh–½1±ZüT‹œí™ˆ¦Z›.ÝÁÍï%+9Ý­©ë‰ÅPÉŒ!®$ ÄÚNçk ¾†*gÅt•’‡­PãDµuZc=’Ø]ÈeZ%dsÆ,2^ w)̧“iÝJ–î T´ð}$°ì›æAIǾï’>[ÇÙs:ET¨)< Ùd`ìÇÖ$Á3¼.•2‡¹°¢•‘ªÈcM3gDO_©[‘Þý“ëŽKžUÌZñ(<ó™9÷òÿÐéÕµÐb*<7¤ì°°ëþÃ÷‚Y@}ÚÏT<=gy‡Å6q×<01Ž!ê3¯ ‚³é;–„\Û`±âå:#þ701}òÕìDÿ‚»ùm¢ý“ëúŠ—0óH37y¹¿ÑXyðå=C>c8¾Z%„½ý=Ž5[¥&tFÁ`¢Œ‡¡Ñ¥iÖÓFt—¿ð´íÏÌ–uó¢ó×0®dL+ X¥ êÙ˜–¥¥ÿs€¥CSÒØ ¡¦‡ºç#OŒA퉗®ç€3ÁÜQ^à½Ù©&Ô@¸„º(FD®GÈ ³yOxž¶ür‰Jð’‰(Šd˜nô.—ìG¼Š>Dˆ’^ˆˆw'4–;܆;òb]@‡ Hs³Q…n£MÀ©®ß”ÛýçJ^ÒÿƒP7HŽktt±ƒØj[l,l‹*°fΤk6,3`}ïõ•n9ò1Ÿ™O¬ <ä4{Òö‘³ Ÿ©Gƒ¦,¯ÌÎÍRœ~»’Pñ¤¸|íÇmá"%Œ3„š-š¤8®³Çöu¡˜m9¤Ü ó_ë›i‰Ëp>Ò-p§- Ê•ÅmªóLàpÚ‚›GÚ½ÔM6ˆè‡®ýŽ-dË ` 7?CZC{¼’Ì]£¢È=2¯ƒ‹ã#%{ødbÍ-vÕêD"éþµ‡ ÖíCf ŠåZ6Hß¹×ç€bŽÜŠŽô­uùŰE‚ºðöN½Øø(±Ùõiö’7å·?ð0Dÿû´¦Zÿ°Ó-w"yvÞ8ì‚eH ¶ülñžå^²GÃ)W-2Ñy¾°¸Ê¼Øf|ïy7‚Æéñ²îÉFͬ3o˜]€Ái j1?ƒpSkÙûZ–»l³…¤óU¯¥;Ô[×ÞóDt‰WP©ß׀ꇓéšfimnÌ †õø*x9y}éåu¬o8%‡À=:püý¤R:Ý´ùi¼^Çç}7ŠPj„gƒ0(ÐàN—q¥ÂÔ? !* ±îÒBµ Ñ(Ô‹6kç.ùÁ³ÝýIò+†óK"{CDm5×ñåðÒ½Ò¬> ÿ”Õ1—öU}y.šç˜..Æß“«d;´T·x-ÏÞQËé*ÜTÊÑóç‚ÈÜ’Ð…R8¦5¡ÒÜÂi•ROIœÚ¥Ç´Ujkã~ê±”"Ý4ÀÉÐ.9­±¿Å]îñ­†÷§‹‡o§ ±O›Øfÿ-HžœOš¿ƒÒÄnG§>t»/%¢VV@­,’)Lãìûcç&Q®ÉOý¯HSèïËöÊø‹ cíÓ2ä=áVA€¦nÈCcÆEiïSÙRê\÷[—[ƒ<ÍŠc¾7€>·7Âl)Ó “õf:øsvª¥dttlâ ©—¸PŽøž;±gy2½Büz‹ ÁŒ¾{Cx­(ûF¡LÅ,›H¡_ZÜã W)؇„ž‡íô­@«{õr8xؠŸ}ÃS «ú¦`ÀzRwÞ×Úä³ê ¨‚pËSìthò ”{Œ-‘±Î–’d6Âj£Ñ!ÎÑ’¹-)Oÿ•t꼇Ֆ„~îÃbÞ(^j÷-–dŽáÂjfƒ³Qƒèx5 ¹Ò=`÷Ðɉ—ºC"HäèBá?BÆY/éåÌŸëdžvoŸzxˆÇߢ¯MV0œñTò÷ÐxîŒt(–'!­¡»*ÉLšÝ$ÝV t¼ÐxîÜH{9¨îl~[n {Ècâ…7xnÛ5*[çl¤ÿoÔ ¸ÙZžm!¿^ÁÃä`=Úa¹ Q ,ys´ÏœšF¾¸ÍR`jœ(®nغ\ú’7֡׃öB^ºìKè#CmP‘ɧ°~ zGû Ø»2&Â̳6âÝ›•ž/UHpŸŽ3*d®È$ç‡Í{Œ ©¬©Ÿ´ÍRßOjPK`pÄ7yó”—<î–UD!%ÕÅ®TÄ&ü^_%¡[ÂNqÕç¼ÌVÆïÆP:OËûȬÏ£˜\ûïUè’ í´ÜÎk˜C˜¼ßÍ›§*FçDz852Þz™C³ïq$%£·¬ßPè{Ox[ŠCk£:à¼=Q8Ê<{ G> OI¸eVh½ÕrÚ'>¡y^¯d&9+¢­³[e™žzâF¢uÌ\5G–£¬G³)ß(×”ŠR?’ ³é³ÅCCxØ_HZªŒêÌbhéÙ2Âçö©c•BfCÚŒšûŽÐÝ3+¼$#ÄP×|”.œ(ÒFvi€=‚Ó žÔSPw¿Ð9¸ÏÁ–¤D3Àå3# :ØLkh«Ó?P->,v 2ËÙ5%@ù)¶?€¶œö U(Ìj0L“lðÐþåE¹…Ka6×Xd—ã{!s;ÖºóéI}Ûzå]Uæ6sŸ!VmZxRïw¹ŒÅ«ªMrr2úçºHe×ý[í|XcFªñ ¤¥³Q!ø{K†Õg'³a ø™Ñ¿Ì„v!lIV€¶‡¸¸•òxf*ëCP£k}Æôàm:ÜǸ¨S¾GJh$=*|)ŒœbÿÅ!ë“,O•óätøC0cô+C½DZ+ÌmªOÀõP€0Oź®u §à17nr—‹åëmLý½ä§pV憊ç•aVÒ¹´ˆ ]ϰ°R©Ù ;ZÔdð^…ÁôPyûïJ 8}6ȤÅKE[Sù'_ÀÌX'3WR¬¶Ðx…å¾Îu…_N0‹\(p/ è=à.ÿ£¡c ¢#Ë»lÒöj€À–IôFk©b@äXŽhæJ#e‰ö·Sõz‘wÎäèò'30})ªk¦ dbMû:Ý(±(TyÝLÑÂÎK"8Þ@ø>l/[ŠÍݦRFn0vŸ…©ê¯¡ìiÀ}ýŒé?©‘Ua¾N$k;߅ǰ·Ü>O ž\­Ô¢&F˜×V§ÖA002þ\ËÔO°\cð‘’wçÞÿ¼UÕz¿BWŸµ8®EA!Dc~ßÅ´È£agj©¼_âÇÞÌ1Mß¾¬…»¨Ìÿi)ò>íàïð’|5§øÒ”&Igºx¾®–õ„Ê•=ûJ?Ú+µ•t¦à“9ƕǥ„dôðla¯ÍT§™é{By”¶EÑ[°T§MJظ‡ô™}ò¤•Y*ƒ¼¶É©*©> zb|Ú)~8QU•{wÌz0‹öª—24 ©a1RÌ¡—N'ŸÔVW'ñ¦7 ;&Û¥£™\PùÊTs%SŸÆœ8!Ä1^zX_¯®ÏpÚÂk‚ä¹ÍÂUèæc²ü—èŠQ¤Ã x‡YöÑ8Kó8 ±=3EÍ­á|4±Köt³Eµ” ñêèðµ+vr)'£±…Ž“¸ÝMð y·ú¯—#óÀzÓÇxÕ½ý¥ÍI«zùé’@wþ»K»—é¸õ IxZŒ“í‰ì¾€ØºƒÛSð!Ñ‹Mm©óâ©MXp­rr¢.̓ۯW¡(%˜æ8]:Ï)©ÿžR"á=*Í~Dîx‡Xbó9š‹ˆA µBòlM3bÁá;Dö ÖWÜíãf¯˜«î_ݪ…MîƒR™©&iù¾=Cü«ÏK6g’Àš‘ršìÅŸ:µ™j(0kÔéwÓ¢O]Ov•Z³µÛC…è´Å#¼NÅa¬‹ Ø?{…Њ&Oô—'L§9{R3Ùš¾klÙh÷;p—ÑAô''2žLËE_+2ã"—Ë`nAE‡MTcð¡H8̺lrrü?þÊv–;W­iž†™…›Aƒ‚ 4s?7V ™no+'¨t&M“º¨­NqIè ×÷vÀÝî_¥ šUí¥þû‚r1ŸÔ¼ ÑC!?ÀeºÒú‰ØPI_Zd'2L÷Ûóth›í-Eh[MF¿è´rÐ)vþ’¦X ’"õ —þÙ1í3{‰¦dOÙÀŽˆÊw‘ãîR¥”jAð¶›f’¦:/¢—CÔÅ-ös ªõæ\1=6Ù¾!6øwön¡}–VŠËt¹GèÂÏ–:‹Afª]W¼¢«Qc¬;ÅëÄ rˆ…ä’]£U9ÿêŸ÷ÑÏ+Ã$¬ø¹S%»ÖÏzWw&XœDÖDy`Î9óê0©¾ =\>®ëZ1iìozž”=qìßïëÆPR×/<0‡ „v¬«V² -p½!ß,/F.}]p¢»§b˜f—„3u-H”æÞ+Ä‘»_Ç_ý–¼˜¢·ø&r@=ªr‘<Õ‡§fvû½·ä;pÙÕÈ &$Äü„ata0íæ<µ'ÊÃSÒÝ3-ŸsÞtBk§ù¾î\°vCÔ+†é;õü}¯vÆ^{}±ùæ Ã6ëï•¢N,ŸÏ¡ 5êGCÊÊB:‡J÷¼ÏEîŸq 0´éWÏŸá w’ÒöØa[ó~M\>/ ª&þ:L³­v¯÷ ¢Ï)sxŸ„¶\È yøå{Z½ŸÓ.ã0!mõ8Ûj¶³$Ô=3êé€bøÀ©ä¢*õš>ÏŒ™lúò5ûÔÈý£‰ç ‚Ãõ\˳ŠeÊ(oà©ÿ" 0Ê£)N#9‰ŸTm4fÇ%áèÉ1®wo’‰¦¼ÑPhßeÃ.ªì¯G®Ûñ…)ªEõ)åž¡û¥§ö¦ú´¼ÒüþpÛì5’ǬLô'ÝSoj€ÒBëCëÕÀÉF~@‰•ÜÛFYÍøè²É޵á UGÖtbæ¦VÉUrÝ °éÁ»A ¬¸vô'NÄêAÀ±°x½÷­Všm°5!¯3omœŒ§C±«¹Hì qSÌúKCiw!U0ïµ E¸‰´œ’v¡LvÁkÚý` Ãg±h‘wÄô5pÒÌý°NczÜ"wÔ©˜ãL¬XŒ©¶æËÀóî]´´}ï`Ô$ÜÃfÿ`'fÙZ2éò'ÓI¦HŒ§µ´¤3 û¸ÓzBÄ‚æDÁZ‚Püé~¡Î&oÅC “‚)‹MGOÚç(¤˜RÏÓð» ‡ Í µ‘‚‚…ãèŒEÁ‰ñ$pÞjò¬Tr2Ni}€²Y@ýU•4ö²–§ñfñסÒý×Û£Å(ªq0Ô”:)Ú°@ æGnõÈÆ!2ÓSõ8Õþ”ÌÝh9uÇùÕÉË£)0ŽŒùÌ”,Q*…ó“þ6óh8\S+½-‰\br/ÌPæ¨ÜÏ©%л$nGyÈ_êt`r®bVÚὑúÇ4/e­)y&È}6htpxz7†ìæ¸sÄ%ïÔ¬óLœF*ÜQå9b:«±Ôö•ó)ÚáGŽ ¼9V*¦^+ãU‚ '¸Çsr€œútT¹ÐaI¦ý¬kÍý µ{cïHw¸µ¤…ÞAíè!ÿQn2Et/›¬?U[ÿO„|Ø\ž„•]ûó` º&©ƒHE?ßDÍÿN1÷˜~ÛËMþQªcpštúxPŽ»®}v’ᨲZlðÒw—di^ÎY®{Œ~ðz1#î˜\‘¢\vÄ',-± Jû³“$9t:寚ªPõöÚÈ;2ü“ZßÖÓX!ò›NvþŸ®¾î'¶„hò(Ìó·+.|KrN·_rÒ¿E‰Ø:•¨ƒ3¤GÝsÖSÍ‘?~4=c®ØöW=:€& Qn·va°®*l³äÆÛûKtˆ~úØ÷NA!T¨¬®7ŽHÔ& &ÎLn[5âv éå(ãŽÕ¾m“>*ò•"ù\)?%Že42k}à[½wÈDfx$®Ú(€ÿaxk»u-°0R;\®ßïú§¿#ÔI›«ÑÜ÷e²TÈ['æynx„ä152ëp’x%®•y游+!%ÝñÇÒÚÆmÕv’o²p(Àm/¯ïTdåâÌÉf-€.¶1ÁO&åLñ C0Ž`–_-x2i¨Æÿ˜²ƒG..J*½s|ú ’Ýh‡)üCÚ”aáiˆÑö¹€ábLÛ .6ŒEÄh{ÜòœÈÌ*§z÷/<š)`Qc$äW”:ÆÄŒç™ùOÉøÑ~ endstream endobj 194 0 obj << /Length1 721 /Length2 13075 /Length3 0 /Length 13653 /Filter /FlateDecode >> stream xÚmxcpfÝÖml§c=aǶm;;OlÛ¶Ó±m›£cÛ¶“û~çÜsn}U·vÕ®‰1k9Öø±k“‹ÛÙ:«zØ›2Ñ1Ñ3rTĕ嘘Œô,pää"ަ†Î@;[QCgSn€†© @ÅÔÀÄ øÂG±³÷pš[8(©þU¨[šm€Žu;k;W ±€×ÕÕUÐÕÉ…ÞÑ…ŸþŸ!SS€³…)À hm QPÔ’’—PJÈ«$LmM ­Š.FÖ@c€,ÐØÔÖÉ” `fç°þw0¶³5þ''ú°u5utþ‡˜™£ @NLUH\A^ & *0´5ÈJþ3nëìÄýÚÔØÑæ¶£8ÿ7²6üodôßè¿]G÷GôpLL ±3ÀÈÔh Çð?ºIÙšÙØÿ]6q±ÿOëBNÿðPþ£!ÀÄÔì´‹µµ¼¡)€RÄÎÆÞÅÙÔ ggbêh P¶³1´ýÊÐhíñÿÅý_„”³á?:Ùšÿ£ã¿K@'q »©‰"Ðù©Í ­ÿ‘è_u Óß‹œ© ÐÅæßó¦ÿèñÏšØÙZ{üß#ÿYã_2¨jŠÊ(KÒü×ÿj‹ÙÛ™mÍ*Îÿhièhòß¿ڊ†À»ç?dþã&ÓÿËå îmFúÿ±ãÿ<ÿ‰tÿJXØÎÝ‹Ž‰“ @ÇÂÌ`býçÅÅÊìó¿è»8:šÚ:ÿKðvùOþ/#™šº›í.Ùó[¦µ„–ûŠÎV@ÒÌN¨Ñ,1.Oõ\k£‡,Lô.qïTqóÜfŒøv.¶¥îšI ãLŽ&&£‰Ãu—p_ŠI+Ì}k6ß”ò_ëÃõ® ÔqlŒå!®#n3ÖV©'Y³rÎj¤JùP%˜¢ Ê:ú!Q¶âWæl%¨t¢eþúB0Ý£©F™µ)¸2xÙ] Ë ÚA¸&ÇÑ·((°?Óºg£lãÚ^h§»‘º³ép{´(ñQj†ÇGóT[âÝ!ókú¡;ºÉߘ5pT8Ðt½iÈ¿DZ‰»²YvÑMvHÅ ;JIÝSµÆÃÙï>Ëå8ŒG¹-æA0œ Áè›9·V ‡UNv'`M½OyÆò~D:Äj©>ÞèW’oó6^°C8'ŠÔ,ºFÄŽe­cÔ»L×}ßÚ#›<†ô$šWuëcè3‘8ýLܵ'¹ã!ÿz‡J=hÙ‘È…mQ°µ…CÐ¥+KïרX7Ê$¢wèã¿È³Úžž­ÄUý¦=¾?»`ËPÄúæ’D¡²¾ÍíÂsêh ý¢!©ÿ±È²ëæá{Ê ýò³ÔÀ/œÐ©ÃhtÁà÷wZôR¸s¬q³:åq ›1½ÉÛ©F65ók8fûÜ¢,Þ-„ 'kGÅeŒÈgELR'¶LôΡ±ïɸÎÞ’ï'½±Z…*TÙç¡àÇøt›¡Âûœ:ò¨úwT‰TâÜñŸ‚ñòˆ`è..§3ÕO´‡$²5û&HŸæiô ëëîäVá·“Lh~î‘â© ¹~ü.`Ìn aT e=&³»c™^FÉ/3NNgÏžRHfi^Í(o–ÍzÜž¸^f3vÏ‘2ÄŸ~Zš›N‚ñšwÃÎöÒ±£‰‰œfèÒî—q%üJ™ Bã*™2¦DnÊÔB…×çQ«“q~ƒ£ø«ÇV|ÎÐ ßÙ¤õI¤ª7+"ÞI±g~­[0;Èy¿ˆúOpÙ†±ÄJ*ï:öM\Käã~E¾þæ‘rý ÿÜ ‹O·¿ä, ùa$‘KÞ$²ÆYzúÒsH/º,£ƒ§ )IŠÚ)m4¸ó^xpð˜ñN¾¤Ü&™Ö°Óq)/vñD5<=rXlO¼Ê–Uˆ]¿ÒJ˜¤Ó$ˈˆ=­øŽ±{H´ yU«ÕÌ_:iö”çBõ]» ˜_«›#?È…FB´ÚXÍ=ë¯ÆˆO‘¿…ju ¹±QoaÌàɹ Ä÷nH>'þ©ÕpN^§ö÷ Gê’çݞÈ&`¾S \7r(Ôœ¢3à³\ >q7 ©Ó,¶õdý ‚]¦<ßÛž:†§æƒ‹œ6 ߢ2àþªšWÈ4¥(’-üš”u,Ç DZz˜ò› Õ•+ò± Íh¡ù;ŠY'´Á€=ð ˜vWIzSjCeWÓƒŒxõICv7‡¬¼JW‰…fÈuœ#”©í‰êýÍÄs™*e·]£´ÿ,Š'­ƒ6ÑFîD·ýÊS:#…~()0úm±  ù¶’âBïïœû•Rd6þ‡­Ë–ÁÌOåæÓ¤.&dÑ0h)ò“_&®« gyŸ®Pƒdж¹SÕ”ðeÎ…ebQk±"Ý¡1$ŸØiiËò'Ià-4Žïª/È®IãݳO]áßHVJw3BR®¼nÕ>#ï´8‡Yœ@Ï>©gÁê ;¸.'¾¦Ðl³)‹Ó¶ ÷çOð 2¯éRŽs{c6Ÿ.gjœÚwEo4ÿFg 77¢»6±eª÷ ™˜ÒQ[ƒí͉‹ùüÓ7ï€ë–óî¨UæÅ³mœ8²Ã̧B&ôbÃOJYˆVwëŸM˜‘!FaÕ‘•{ÃsT{0«H;ÏŽi·töìnú””A+ÐZsÜ«ŒµRš?ÍžõtƒƒÜLCeDɹ4K=i­”s-¶J>€wÿ¶ƒ!×½¢˜’f+@aÔvað‰¬Q–ºWLžüR>õ ( ¥RTø˜X&2›r!ǶÞ}‹Ñ¥A´NÉŒ¼{ý«ÂR°hOlÃw£|Ú—&}j,žT€¸ýÜigéwwwÕXûâʳ±¿¦¼É¤hü‚ÂoÜû—$Nµqäª|ÍßðΓ™u©-ÒÉ’»=¹^G‰U¬¸l]iënu·zÙÀá ñ`L?ß$é![Šp€Ò ÃlpïÀÜûЛ•¶ pØŒ‹#7¥‚Ñ63,NñùÖ:Øn«Úœ7èêhN¾·Î_¢Ê›§ë1 “ìÎ_™¹ †uŽq¡’åI–q¸\7ôÈÈ«ÊG¯s’µ H ÄKŠI}(9«Ò3?žØ|“.¦Ðs¼uÀÀÏËîÈI€i¦¸Ø€ÛøxÌu“‰">c»'”É(¸[hš§©H­V[ÁJ™*Às RÚ£ù)ËI úÂö)³Œº6¬|<æ¿\º ¡òÎ,ç†ì€6¯!Dµç,6À Œ kXjÅ´¬@ªÂ‘ /ž“ŠÚö“?úkaÌέ5D¼Jò”ãRj²C•´ÿ+ÍŸÉM?Ì^ÿî//®î§`™£‚<‚à™‡³Ôå(hèUðO±–ÐÐ]/ÃÉ5[ÊþeÞ@(ACôTM"\·õïhˆx}]vQFݼ9FáõÏqËP.ˆó©Ì,d¿g±†gÒÇÊQç;ð” mw ÇíÖúh£)8MÄ‚Œ¹4A—¸Åþ¨§‡…º1h46rÄl;Ê!‘}­jX6G®‘ Ad'­Á™‡ˆòm—Yq'ÒÉKfÉÉáOfuîèo?\”/¾Yê—ʘÐióÞ7œB’Cù&_ÑZ4øy‘éäî¬ÏÙ1¼ÚWA6?µÐÛx 1=é$/9¹ÞÞÎgã—èåcê€ i™žá1rûp`DüÒ(–°te?³~3ŒT†HÚ£üçð "«£ !vö)©“R×¼FZÏ9£˜Î¶¥¿U¿¦*†ðjÈì^xp²"Ç5†„kCð7]²,Ä |š Ÿ„ÂŒò÷É¢ÆðH%ïéÓëÆ ^ÙYô<å³bs Pˆj=¢ÂASJ›Ñ¥ˆgF€•ò«Bœµ%ÙëLÞï²âdñòP5ža¸ß &g©0Â¥š\Læ&›"˜žJ/ÐSê«0Óû•Ú+ÄOUþÊY!T‡6Áˆíß=¿Š:ÔG0È´ûšeA\\¶²½l’8:\Ž0~óÍP¶k:nÉÌö;µ\·û¼ŠXÃCM7”ƒVYp º1+]Ù !®¨R¥C&ï™Â°`'ma »˜M´… ~žzUlQ^aи̇‹ç/AOGSùÊØÀ²Ç!‡'‰ŽßwJ›Ía „¿jÈ'™tQbfìãsgý@ WMçƒO»œê÷êÅËFpPp&é“Eœøvê $~-“¥¨é5tµlδxгàÈJDœ½D7›¯]GË‹d³ ÔÝ¥rÁC;®•š21ûÆž0d¥œ½´Ðlºî‹Ív¸ª5×Vã|9#ÍÇð'Ä *àÕÐ.,¢]&רðz।3ý¦<Jï°uÓ 7_XÕT¸ú^Y2îîºÁXK™PëKZ¢"6uV¤¬¦ÞH¶«ˆdÁwŽãü!S²¢Ü0<òCK‹À²¿_NÊ›8ë$tG!øÅç<œ¡3ý´÷5€…^»ñM{±¬Ý³ìÀ#i°ä˳ß~Dæ 3lVh ¶tϰ–f¥œÔ”¸a§µò ýq¹H†hcc«oPÁ†FeÆî’:K’šÓ¥ïx‘óíÍ6£ÚȱC¾×ÊÓÐÈëy¼tÒn…'^#^Â9bƒ” q.nøö«XSXjÒðej“†Ý/ù Qª½vèbW~aÿ–Ï©Ø:,ø½7WÝâã,)”¯ìKÃöÁ6†‡ZZÿBÉyÝxŸ¨h—_>㺒“Ö”2Ãì-cÓT"?牟^)G©O,l“èD›áb“Þ|È– N Là^¨ÑÝxž,êæt°CšUZùR­Ì²á3UŠ‹§a5Ά¿ÂP¡»qÃW±µÚõ£½AV’X1lû¤¥N õD›DtDµ‰ÄÀ:Ñ 46ìCxè9o>ö· ĺº?ø ÷c[ è4h¥³/B-‚ŽãèïøœÀ¢.[jÿpCÓù+$«a²«¸m¤ ‚¶^Ôök>?A2¦Ä €U¨gT½ê&(IFa5S̰ÉÜêÒPg»©6TüÐrµ'Ƨ®ªÂÖçÞ盚‹Š¡¸xz~ô²@÷=þòmbH*l—irrE;)bÎÙÔ/¤ýÕÍšmqsv4×— U¨£Ñ`á£Õâ6Ý2 ‡N¿·²íïìëüz'\\þ”®YS$û2‘+¿èMuù[\zwSï¹G×T‘?XÃ8[¿])ö)_‚£ðèŒeâ²§B#ݽ»wŠP.èÀŠ/-Ò<ËÀ~`Â뢧ì¢ÈBWDWÏ#ªé=—]6#ÎqVm ȱC ³)ºZ~Õ£„Ö°âóg~"û¢z¤7¾CèciÎpzf¡óUe¾AÞrßJÒlloå/3 9£q’ïë嬾¡œ=î?*“.¢)س̔Üã\n÷TÎ ´e¯Iÿ[Ìøy áÈõÆvg*í¯š«@cUº$‚ =t‹ýîMåAð¼æö$d:I'8X‰®îÅEð_ƒ øRŽ=ßÏ”}k°pö€óè9ce#Xä0áÐÊ„+j½}°[Ÿ{°¶MPÒòº5s>M [ì#-«Œ»Çc ‚,ñTz‰\§³vçÇØM:a±Â¨K…šŠ{bMÒnèèŠVãŽ! ÛÙ/”¢g®¿síÚdÊ©bíçf,  /:!y”! Ö¾Ó—'p·êl™ÊÞy•ÎÈÅ T’fÀ„5 è–*Oqò¼;“ê:>`…Bêáþû±Wqn7ŽGš~×¹}Gz oëžä7B´šE²E5kX†uñ¸»Jô§žEˆåw ÛÎe‡vÑëÓ ­4sDX-Ø>¿‘Á÷ǃ ÞÄ¿´˜d-ç9Dþ&-œ…pòIa4è†ß<àCíXbÊæÃÐZ‡DzëkÔUûÏà ³b/#:‹…Y¤<{ò6ÏmÆ •Ç”ÑèDehþ]aîªKV2`Œ#îAó’š"yl©»¿:øJGƒÚŽ l®!8u¬\'Á*}в(²’v‚×”­×9}9Iè°EL!þ†xÍ—£R ­‘-àÉ!½…DéèpZ)P1°ë)ìŒÌbÍg˜‰ÿ–Yï|däC=ñg—ëÀ+!V´v•C¶¯)u×W ´›ß³Î?ø¿ÇV84fyÞÒp©•–©Iâ=»–ùé5üÕ¯Ée2édJ¢!ËÀXm°áˆå½ÿáTWÄÜ¥ðЖĨ°4\ ø‹¢ Ìß[ñRËx¥”_GÇlS2ŒeŠÁ$mÀ¬ =ÐES M5”ˆ«´‘©[/þÑÓ`M½aú„R¯"¬¸¾½N’KF)y,ê¢e”fŸm¡KéZÅÈ´{\£S÷ôÐ.ÿꤣÒX4}ŽdÆöÇN’+ÊpÖürZºtC‘ÞÌ“¯Yý–£Íâ 艄]šíšóGðñŠÃš‰~(lJ¢ª`¾’¸&&=›šWz6¬÷ü+®ÛqÑ4"5DÛœ•p}Gïisð ëmC2ß´ˆK0Å~ó5wÊ/Ûµý¹K3n÷rÀ øe[|Hk" ^гbI5hÝ缎âvRŠû±ç¥:›b¥í÷0y¤ª3¹*„@F‹/ñ2VIœ/Š79ï“Ä0~))vLÀUM­!Rô­³„[æ>îÑ)ý/šœU6u‹ŽDì¾]’KþpNÀ®!S½ýóm÷¤/þnk›–F™=#Ø^Wk8·ÿ¨Z5iUÑNçOˆ¶6èeÎha†ý5߆@{t’Ìÿþ0ŠokÌ~‰SÁ-»9w\òÙX†‘RˆËC°:mP¿ä7¿‰f-TjW žŸák„—ÔöÚqå°äqÅvfƒï cMõr4óåü…õUŽqã>PfÓÈMœ“mðÃÚ¾›£“Š>˜ð4(¡ò äšuTN®$ P\öŸ^û.?!³% èÆê³ããïTnýu"Ø~âûâ gÜü0Þø= w’Dm¢L Uî4K2`_ö Uwe†¡ÈmL@ýí8ý7‘mÖ}F‚Â#lí(©û‰áàù˹ªPBŸác(Gkj1C aRº |·]¯}hïd`ò›h¸<ïpg·Ä-Æ ’´_ì[4CQšª;Å…9¶>ºR~R!È_6EÏ6_•B¹ö*dî!r©F¦×lAŽŽÊA;÷ö?ñý‘Í©QªÈ)¢©8â¤<ï¦WYnTúS»Ø ¼AA $^Uyº“ÝýÇ+/’>Ûðq«—PA›Vd‚ž'¤³Û/Šc=5M§‰8¤ pè ±LÅ̓VÿÖ=r™|†Y1îý¥Þl!o]bûEžG‘ƒ .0ÐX[µ¥”¶¶#µd;®Ö‹“J·>+z»«Œæ¹ñ„”Ñv~]h‰L5^X«E‚ယç.Þß§s‚s½×]ôÛÖîávSt€/ôaš»oÌé>²hS@nHA@.Ë£ÐR¸m#ƒ±OŽ·V³ÃÞ{Û9k@x‰*¹zü€„‘([Ö¯®A›2¯hMþÉ¢ÕsëƒòîoÄR8|²ýúӅסCŽÇ:…E'C¬¿Û<Ùë/XÝŒfÞ®„(Šå[÷­·Íµt¦Ããr÷ÏØ"K¤å”_ÎH)Ýì˜B7«Å EH˜ÄùªÞ'[©ÂJ"xZšLò ŽÕyüÎo"P#xi’¬¡M¹xXbJ?1IJñê /<.±ºà ºûÍú% ÑCÄ#©í}ú8„H¡‚!è&¨‡~þ2h„'X1¨±v¸]Èî"vãÙJ™¥ÉéÄ-â$ƒ¿‘¨!g~,á¸)†“ÍS:RUDg¬[AW¾s/(Ý*0+•1¬N0ëÅ^ò¢[Ðp¬c\ÎüPÌ9¶TV/² àïËq[!`‡‰%›úúé1n#¥âæSƒè ¿4Ü2I{÷å÷c|¥LhàÒ” ëÅ:†Uñi,~!9\hÉb8_ ßqÐëZ+¿Œ‹›ù'öõB‚DµòÃÛero[*å„=ˆ'…õJî%¤öÄ6`ÚUE‡ ã8Š-€:º/P¨‚µ‹¾uø¸¯F¬àës3Ož¡'›äp>Þéc>µ¬ÙÙ¾ɲÁŽ÷÷ ¨ãSp•™ät$/k¸µ„Œ\§*y^.½aì6.þ[Uã°u4|HПŸÀ‡&:þ³Šþä¢iQ ª‡‚Ýq€(û+^Y·%.“D f,¹;Föˆ”¨¥B®=ªZ²´Üަ†îèû»›Od¡Áp/Ye»§qIê×Aݸyõ#móµÊL®§bí gg I†V/×Þ ‹!Û¤êð–ŒûPÓVÕ£øT¥ö‰¨×ËHÉ›àG_×ýóîC ¾P#¶¨§;H‡z§äªÿPVwL4|£Ïý_²Úô,Ou®‰U¹ÚîEs¥µ”5_4&¢T•äÑ"Žò#Wtcl!$ÙÜðÌgv¸ÃÖU+NQ%®ßbˆùõ<„¶/gÐ0þÛ#–¢®CBR(ü´Ž5BmAêá¢öþVChõ·ƒõ¼+CK{ìw2üV€¤ ̇΋èÉl‡”Õ¥/J»ƒ$H#Tç£!ËS5¸ÝáùªÚé45q¢C½8“æ$ˆ–(M³Z™“† |ÃpdŽEu1}úIºŽ†FV”¸U’±Gd·ŽEwT†@M1T”'Ǿµx0ûoÖdíP'—•|’Y¯[öÑ‹3RÝÍØÀ8óFgÆë&¦òšý^uý8hæD» â¸4ʆ…4Ù‡ìÁ“^ÄáI7Ÿàå2ak¦Â/̱T>äöcŠd= û\<½-ªoðD²X«åúÔ“¨‰'#ÃZ™Ê°Vú(óìàGgaK½÷ëcl˜ìX£”WéÁ¡&¦Z­d£SÚ~@+°'÷ t>ï¥y9~»…raq­‡§«>M *º¤Ã¨G0€(Pªˆ¤pºÇð|­µYw1¹2óÒv‡ÓŠÁÛF+Æqž­i+.¼Í…6c‚Ä•áÁt´$%ª}u´Ú˽þ0©#!zÎbÎ¯Ž¨yÇŠwÓ0¢hóHôs¿Ë²9¬ uS+ªJF1ÿH¨øAØAþLJcä4BlÚ9 ë2öðNµù%äaÏ[pö[shàŒÖº|9ôéðuìÊÈ]ðBhê³zH”†=5:æô­íûÍLåÄy×ݶ|Ž«‰–mÚýîkšyîw;e§˜ögÍ•îOàNèCžaNŠh°'Ööju!òOlfùÏžÀ¿[ÈþqòK˜³&8µåÑc¡Ã2Þ>9ì4¸ñ-e¦« ¾tèŽ~8į§ÐáOdÔÖW™Fí×ãÀ|è2Œˆ6N¤E¬Ù¡O'‡ùˆY@©Lq±\:.œëÒñû$ámÀ„)Ÿ”ã\jÖ",1Ê>Êö,Èo ±Är!úþ÷"‰ §±8§ß´¬qI ..Eæ+UyÃéjîŸλµXÍÅèÓÊá¿ûq‹qaÚCôY·ÖZ«[?£æøLjIq-*ô„ñŽÿþá¡„éTŽÝ³ânð·BÞ4:nŽûJºÊmÉü¸Î+Ô#ˈgÆE¥y‹v¦ÔUyYº\NXõí„ï¹øà[ â×;иíîÕÚaZ¥{ðÝ·û‘ºd³®KJÖ´˜ð>#SÄ.|“EÕCÄ–áÙ Ð.'oÓÂÏ”ÍØÑ™‡? [Ú.¶ÀÌ™˜î~íTømê=âeæ¨ß 7Š(|ÊöÁûÄ뽑_“Ùe‰wä k‘@¯c¸½ÕúId¦xâ¤7 N=±’¨s+~ÒØÖð`ÞŸ:üåôºtoéZô©ÊA©'*ÈåýüÓ©›@,϶ˆÇÄ×he ÕZºÇ‹ô£ª(bôõCAܶ¿$OLÑ-q§Œ)ƒ…Ì 1Ф=ÍrÅÎážË¾Š@|‹·lòR_äùgdÁ›90Ù|Ív7×H¸]ËÖed ƽ¥KÈ7 pcŒë;’@Pí*‡KРFM^ ÿÄk|GýJr¨ „3L ¸›ŸŠÊóíýPÞ¬¤ßŸ£›_RwžÛhõÇÏ0#¡îM‡³k·õ}‘Z¢‹Of·Ÿ ±¦ÊÝ15b¸Ð ÀVñj!%M8ÏÙKIçqÚé;9ë,\êÚ»Ž?~(é+* •ûžHß"Xc@¿Õ;Õ¥:ƒï“«ífœ?³Ò“=ð€û¼>ô~އ·z~\,SߨðvëxÂ4Þïn~Òã§µÛWÛÀÞ¶ìGÁЃ61.ÞïɨIboÂkG–RJW¨ÝÜ9±ˆó Lfådç™ñ Q±r0\Ÿ$5Û²¬b6®‚Ù /u|•3Mùv¨ÂNu¤‡é5÷êèxƾµÞîÑù«°»zëÊÑáßXì2˜£Ö©Ý43Ô€/q‡;Ÿ¨¶¶wp¼ÐvqÃvÀ*¹#o£—ê5%Ž¿†:l`ûK¯Õ&5L:YSÏ ²œ”°.s¸ˆŠ8Þ1ÌR,û¶çiªÅ!iቺíÛ•HH¸´ãó¨utç‹Þ-ŇpÍ%+»Fäù‚´æ;‡èš(&´£Ö”ëÉõk‰ðýDDWB„M‘®€`çª4ÇŽ¿ûš8ÖZò£áQé\UÊ—Ü t¼8¤ÅIï©B(OÐ|_ˆŸàÔµY}§Ì$×…#UŒw›é[°–wN¯ÉÙÇBëJÃÞí½•J«ªL•…6wï—5óyS<âh],Wß[uRœi¤`Oº.s¢BZ:¡ë‰æq8³ªVù7ü»*ùW­9Xi*ÆrU¿»Ó³,髌+랆UHž»éí­IËð÷Û¦uÈ·5í ¥œMjT~Äz¥c“¤× þõ•2ÃÚ«gtõ»—/.Ò© yœ'œïSç â #LyÛÛ.6‡×ä^(÷·ª£!jÕÓ E¡Õ]G4ñ$¸8öìÓø|ÙeK¹x—Ÿï«à¼ž0eèÎx„‡Þ7pIOKOǼà¬Ü[”NV̶$ŠéÂæÕÒÙm™s/<Ðd_éô~”ÊJ,¢èí%6ðu8>J»eœOšàÄŠ0Ä šd‹ yÊZä=bL/¢Ù*Ž9Låùó*Ñc8"æ¬éôbCá[~LJî»4aÛ뮞´Â€@è„(l¯÷ŠJ¹¾ŠMÐí©q[É %¡ÆÆXã?y«˜X§ Öy.F³Ða}D\p'C¯þ#`LßHÛ·Îg(ìøƒ¤Ð¹¤¥È?ÐQ©ãå¤Ý¨#ˆ~§œõ¡Ü‚'y}ÓÅÓìÅTK:*¶S¨cˆÏBÕ°|F‹žÄÄî·ª¬j¢¯ÓW|ûŠô[?glì'Ã5QDR5œ¶šÓîéê`Øw‹'’’Ú^øS„Éá#4%|›pJ†WŒL]ÔîCJªàÏü6ÖKÀ6S”W†Î|øCìÚÎHi åWQ4‰{UgçéÑ’±ßÖÇI¦ÒíõFŽóVÖ°«0R*À¢¯R6g‡ÖüF â4¢v@eI$ôöEšnÀÅ(j6ÄêöÐô&bÖ©îý<(\éþK P‚Ï©Â;–Ä%ó”‚–5 WZRóîaÍ’ΣÇÉÂ^¸üвd8ájûåCkOºÿõ2µ8ét÷Ûr€#«Ì(+Ê–-¬_Ô=uY¸*šj GòµS64—¸ÑlÀ(`«~'ÚT4‚„~C×:¾íf2|¡×† _WîÇ3 ¾P¢T0ÿ5ð±_6îá ce,ÍèŸk6/€ßûúaÐŒë¶þ90M*pcv…³j).ÕU±1»¡Éðb7kŽÄbÏ׃í&f®É(^ÅšwM¢ïn²•˜)+ßõ#äÏô[ÏÙ“T ©×+êÎŽSªÏFn6Ëá/5ÐGÒæ•ˆ ÷‘]÷±ôÖEº‡ŸH)¥àGžû0핞m©$Ï9Ðô1q,X:mrz“qÌcšÄ­.ì½ë±5'ÄýyaLO™Ÿ×a› @ºH“ZTjL…ßc>;kÐÝëqþ€Ã“>E…Aeã¤ñ‰ƒ}K` Ì<* |ý*»4Ø æz>ÕÌwçô±Ií³X"a€æàaˆÏ©ì5ÔGK$ËО öóÔo€‹&L¶*À7myaRûã¡Æ¼~jôDgíö Ì´ð©ÏHŸ¦j”Û%r C#Âÿ…—3¦ endstream endobj 196 0 obj << /Length1 737 /Length2 33000 /Length3 0 /Length 33605 /Filter /FlateDecode >> stream xÚl¸pfß²>ÛvÞØ¶“‰molsbÛv2±1ÑĶ“‰mÛù~çœÿ=·nÕW»jW÷ÓÝku?«k﵉„ƒ½«š—#……‘™ *¡ªÆÂÌÌ `fdƒ£ u»Z9Ø‹»yš@3€*ÐÀ `eff£ˆ:8z9[YXº¨Miþ 4lͬ쬜¶îV¦–~wwwaw7Fg7AÆ‚T@€«%`ne ˆ**iK+H¨%Ô’@{ ³±-@ÉÍÄÖÊ ge ´wÒÌœ¶ÿQ¦öfVÿÊÉ…ñß Ø»]ÿIÌÜÙÁ /®&"¡¨ eRÛ›ä¤þ ·wuáýÇhêâú¯êè®ÿ•lÿ+™üWú¯ÕÙó?# ÀÌÊÔ`´°²‡cúoÒöæÎÿÀfnŽÿcú'!—òPÿÃ! À hþ·›­­‚±@-ê`çèæ tÈ;˜íÿâÞÃÙê_ˆª­±ý?•üOˆ±•­×ÿoÐÿóv5þ‡{‹hdàadçülå"aå 4S²rý‡{Wg7à`MàÖIhfåf÷Ÿ!€ÿðóÏ ›9ØÛzý¿Yÿ)ëßs2ÉJ(KÊiÓý·!þm·7u0³²·¨ºþí±³Ù›•Œ­þÓMæÿîß:ËÿêòÆ®ÎVž]fƵ ó¿žÿ‘ôÿ×ëÇONfÛ?/6nN7·ßÿI×ÔÍÙhïúïø§–ÿÑÿÝX@ 'Ðîﲃ)_ˆuzkXÅOñâÙJHºÙi#uºeЕ©îk]T«AK3ÃK¼;5¼™@‹mé»Rãx ÂÑÄd I„þ2ÞK)Y¥ÅÏÚÍ7åÂ׆ƒ+ \;SˆëÈ[×̵¿AJ´“ìÙygµ2Ne¨’,1Få}([ « ö’4úThY:_À=º”YËТ+¡—Ý¿`áÁ;׸†–EŽá:… —Ö¢ºÚJs,]RØùºû¸¸b›a”[qƒA"w—l»P"ËzLÃóPQE×üŠ[Bò„Š7¼Ð9‹²UüêQñ›ì•~‘;3îÏ?§55õ¨œ¢\§©ô·dæÅIá‚8…á|FìvyóÖd—\åœÖ…}ÆyÖÇV5Ñh +¬Žf 7°H«¢Û¢’篜O‹Þ\pl·)~¨d@¹®›)œsÛC¬›åÚ#ȉž„ÁŽž´µÉ$!T°½<3 ŒZ0ÃÛÇ[ %"-\§=öbˆx:[\8öR©$GE­Ø²šã|D8„D’W8÷ÎÔÌ!(˜ÎýVQ¥Îé*Ò"=O+†«R„î™éë¥Z^¸”e}•ƒÉ|"«jÄ7ùM{üš%¿`ºS4¡'ND ,ßxb;Žn¿þ“`]XÙ) èÑ­»×Ÿõ—â[‡>ýŒXY• ­›çâDR¡{³‚úìÁæ ÚY§ çgÙ‘ øLæ9AñFð#5ÓzùIž¬çÄÔȬ¨ç.)BZ>BÐQ¹ö-}»ÝEvYô¹ÿ3umXúàüªEßÜ5”a[`¼ÄyÏihü³Oœšî_ ²B“¿À Rz ҉Úýâ¯éà+^ˆßÑÔm;ÏÚ""&2x´•fì[ë(/::Èßr:VåtRætàŒÆ¿DÞ+‰üžãºÕÃVfÙÈÃÀq~djÌà ƒ;;l°ñ´'_ÀzqAi3c7u /ûx1Yò§gÚ ³C`=×”¿èýÑÝ—Y«X°$›ZÛC_^„xG6è —·\µMS&—J[§qnÅ~ŠÁ”c&'0«Ûs²S¦>Áò]ð>ø…)l¬bPGšÐû‰ÞÛ=TÝÌh¦~ÐÕj\åˆÄö("Õ¡ g¤ ìþúÓä!4B_~Z]R?âm.V0Ú@³|¥jD²‘^4;VŽ&ak9ø„[׎C¥™C ÿéwœNàÔjg¨ù U•X ~º0šXàpåM²5U.E+m)Œ ‰³ÄRG´°àÕÉIˆMÞÈ<.ýœx¥™úÃûB€!FÇ–øexSÍЗw öY|I¡^í…ÍP}FRÁ¦È,‡½ö}Nw>s»á„ȉȰN×3»žòr’°¡Ò'­Ÿ6§œU¨´‚Öœªød_ýÜ$1 ™¯]eyÜŽßÝ i__"Iy©Ã8DTˆÛ"mM;m2äfêécR8òaëŸ#p°nÖ `ÖºKðã97õpo^¢¶@³¡šãIÃÁQpŠtæ=Ãê!aûqŒ.8’à?Ù%büÑ)t»в³×õ%äвü €!j‡ o5±èùn”r¸ÉÕÃkzu4W;òc¸HNÚëY¡¨(&Kß$’go¡ í@Cj~Äq Ý~mú(Ý †òa vSñ™½Šúr3ÊË•ÑKd3ôL¹eôÜ@J»8Ú=VÁø÷x·˜ØPÊ)(—|FÀŸÝQ²ÛÓïåc8“´hõ¸Amfl?¹&^¶˜ y㿾ÛÏbӛȠ¶m»bç"Fèâ–4ì¡Qy ƒßGjÒ‡‰©*_¹1ȉ‚Æ£InÕLc€?§|H†è³+{îÙzFÈæº˜Ïíõ1øÍþàãîêZÏU¡Pçñ^=dfZäMöï‹u|˜ I£‹š¡g¶Â®í4Á.$F6KÑœd,4ë„-íûÒ4¼1B韢B& ÚzSë(O;‘’g…T cc`;‘€k ¿.Yï”Aýb^]PTß0ÀÖêÞTÊÈÖ9ÅIÔ¼Ê@;÷¡Iw”nAÝAlÑÁ gÈ‚ï󹨰B”Ô+㻑ǠºÕ1öŒ^È_ñ'MÁ‡éÕà Íu¿x~­%^RÃ4fÃ’2†}F"íYæS°öj"üÂí¤º>oaÔ¦Ól•ÀížSF'".¿!üÁ¥²ÍSµ;t°ã׌ WäI> #ÓB^óòKæênXñ\èÑd)Ôº¢Ñ5³!ÒdiåÐlÀ73vhÛ¸eÖLAq˜ƒTZB–ÉAwJBbg"OïŸqIÎaÏÀ#b'ÈÔðE)ÿØ\0>¾õ" u‡Cߎx¢+¤¡~| øtU1³€Â! ª£Az KLŸ÷ää:œŒ™"ë“Ó$+f=Ù[óÜñ´pÍ8ð³~ïµ·½žölu=ÆÖà¯öÃV¶èè¾sËëðe]æ“CpðÑG6ÔËèƒÖ¼$sjx/²‡Pÿ9Q)’’86ñUPžGùºƒxâR®­\®-˘ê4Óiu‹Aéw·Nªµ±lµÙgª ½§Cq‡jܳ²Ð]ÕyŒ?W# Ðû ªY©†Æ<ÖÖ2;>{¥Š …Ý™ í¡¼Ñ ÜI]Aæó}È`ú"†”&YRšX‰1FùÌ6Ip&.ÛÂ㸿ÈÊFŠ6€ßò#ù:Ëß…ˆ™ª|ƒ'½LJ†ºêÛºÕËyE(̲-%g¯>áH -.=ïžêÔàRÛ `Z¹oGÍ;5õìJÇæÃ&({ñÑ•Õ9m™UÙÃO¹“ýº-BÏzÍo!p¿(éN;Çý w³¾$ zÈýíëb½`pKn™d§˜m`g¹žét¬!çQ¹… KñÛËæ¶vA­øS,ænŒD¤ÄÙT¼I˜áU±äâ½Aap-å«_Z¡µÓ^¦h e#éÏgÑ ñ! Ð㛟÷Þš§"uOü’J;'­CR!ûNÑM¹Òçá¶g6Ãñ—gÛBMLÆhÛ̈[/#UŠqÏg¦1Þ〚ÌÔ§C¡Éh…Üææ’2£¿| Öq ïj"˜Eµ‡ÓS]Ê 0j¶)o»‡dUV»Ý[œ›cÁÅâ³IÖ¤S¤Ö÷̺Z¿Öç$°A*âξèDì¤oš\\&rZ$Þñ¯#.IôŠ;s è#{t'ƒÏ:ztRuèƒ'àlëÚÓsÙ*Ê¡žrªGÇ2iŽƒœ%ÀSF¹ª ,Æ÷ðÑØÅác¡ÎºÑþP:‰b=ˆ\Ý&ž>q´¢Í‚ëW¾tÍbâÉ¥Uw¤Ó¿'¦±3ZVÜe/göñ¯§ËQ?ÅÙ|gMµöÃ5×ö¡ðÿ:|Š1OXPÌlÜL†Û"Gíçý)Z3[=Yÿ`Z×bÕ0âTÕve,Ü 6|@ë6+Ü™ÁÆUÙ\V¡e ÕohH_¢®iåþóÉŠY(ZeBÜëˆËC5gs¡^¶¯Ž…›¯×@ʵ—à3wŒ¸ù¡b æÍ„„P-›s=Ð[]†§møfÃÒu•¯–*ó3O§U $ç×Ô6EÕÁ¸• ;«šu„G†áGÚh(loöÆWäafZ‡n.ä·Ì—îŽû’½”™ä†ä<4v³©Õ%T²ºwÆŽ^ =KñÛîÙ« ÌÑ÷5Y_AºÌ%°Éeh–e¼lÐ^^éÄn™ÖIþ}»fãw[^5êåXü p“¢¾jÓQ#Ècþg7šb¯ÑáPµ³0ä<"VP;á>C‹| Q}ïI:q•ã·Êëû扸ïÊ`Ìž¢ß£GžÓð’‘40 ÷柯 ß,Â3) |nBk³wÙÉ/'¸ßTîc' ÑÉTrÆ fÀ5{ƒe‹– ÌÜŽòÕ%õTlÎ{N÷¬J\Y¥/c@:e£®Š@èù¨ýêÞ~[ÜÃ:~ç«v-´¼Úy:2•2–Q¶q˜?ncL¬Æ"S¢fe¢qnes£¢[ÍÀ·â«Ó_+JuŸˆ{èf&P,½‰ ;Ž«&Ž¡oõ—Ô=Øñ¹óvEõ=Í—øÙaèê·”¾NµÎÇKÚ­²ö–/ŸÐÂ5šXOáo¥ŽW‘Þ¶,ƒ;)ïÜÇÛL2Æv%ìÑ ý(ç@Û+Ø’8–ÕèI¸‡dŸÇnf “ÕNóï_óɸ; OuÌPÊñæ‘à¬ýaÒÛqÄc `C¬pï¥yL¿½Ú‘WÄj¬ØÈKvZŠ0shž°;ùãë{«† `ºBžy^ï¶ÌŒïHï#Û8öR”k÷~ÁGîë;²”-Ìãùÿ¯y»Š þ0‡?CG¿½Swúù¹ãu¹|_WæîS|"¦ü\(Ö°Ä&£Â—¶Ô¥?Å:ÿ¬UCŽ7/ù'ý#ùÏï›6ñåçžpÇ6Fª”ð‰[¬^a»ÇpÛýú³™hlþÔ/ŸŸô?0Ùh=«46÷›äz¡\.Ô˜Hª%Œ£¾_Rºõ®8ðyæ’ÄÂÐjT“É®aUy,÷·4›¾±¤…|˜h}kÓPWïCȃÑC&Š„b"È£Qh;º(—A}ïë¬$ lÈ kÔ´l’‘LÚ_ǧ v§Kl3÷ØèÃ7˜xŒï!òÛ4’ùUT÷ŽŒ­25ð§Ñ4aÍ÷½;j¨ˆò0TLü-Ö<*QÒ.c{ŒÅE™¥`âÄù,]!½p²ÇŠ\Ÿƒ4ì 7Ûä¦Ü¢•á+óЀµ#¡h 7›®Cƒ²ó–#]BKëΣÄòŸLÂþ/õA^5\x~äA© ;€áý9ø;6]LàäI]}Oœ"Š K‘Pg¦nÛî-âTP¼eVp8ÂË"%Ô«žhSùÏé‰Z֯е¼° ýöõv«šï”â¿7ëä·¯«…kjˆÑí­!iyœ7kì¿Ã‹cæe6~íÏêð?LnÞÿØ éê—üâb¹t²&Ÿi$~·Œè=÷”NžkïBT+dÃø6[”¡Ýø¸çÍxÂ…ñÄœæà¯©q*29Éê#{'d4ú¿ +XêÒó¢<÷ˆí›ý:˜8#¡¡ ö‡÷ÂD’¯{Ì›¨N³V¿’ ÍéàfÕß.ýàéb“k‰úmL.–*ÐLn6÷íe¬ ñËð÷à򼂯^hô5ˆE°9‚ÅÀöAWø ýû¬ìË¥…ý£iÜeäÍ[Ç?!w ’“n‰€jè úi&^4~{Jñ‰Û§cÛŒAtæ¦Uó™\ ¾ªý¸ÍçüZK½ãD' ¸ûëÊò¹Tˆ”¨¸ô,þž‹ë…Ô Øh¾€RÑÕ†¸bïÂ=Év˸¿ ÷¦ "3™>nš|ÒÉ%%õšb¼M¡ûÈB!¢\Â5“jŒh8ô¼ ¼¦?wjëØÑycE§ãU>× E0;SŠ›”¾ïí_}ĘÐE Wõ6Ù7ñÓ÷ÍÙöm..”½trìJö~ÛìrDï7}„ºÄRœTO/3hÓ&¶`qÀÖ²ÎL“G±b1w-ʼn,Ys©Ýu÷]ÃÖ2ŠO À)W&”õ´^7¤­ïU©1-OÉv= (%PßêWBk [ð‡R`LÍhs? “¦½‰Ý˜âòÿ%Ó„tØôʉÈëÞ †€ :W¹Î¥ _‡×%Ó[*9¬Ï‰vb´tænÉ<ì…û ._ ¹x%»+°KÜK(W:«Ô*a½õ-{ºl{žŠô3æb­§WÂ6ÿ÷¡¦AýL)ß´J-‹±ÞK7yª´Ÿ‡9—z‹ÎÖ!´Y DCùazaŒÌ`GýÐG5>ÂÎâ­Žk^¼E33‡Áô2ÿ4ú¯E‘#M’ûq´ÖE¢˜“\V´p ÃJpº_—îâãðÖ©Uëˆë¹=)¦ý.”Õ>²þ»nÃò‡y §ÿÙé÷í«Ñ¥Ö¼ûV¢¸[]•:‘ÜgÀ»ñwÿ¼Më`]¾ûÁZìÛL’7Ê™°ÎïâP]öÔ#¾é`míŸêÓ˜M¸Þ ®¹™h|bž0z@¹Ø•é§™¼KLt±4˜ü¥üÌØž£â2†6ßN¸Ÿ 9³Ó»­Æ ¾¦´ò£i“]dƒ‡ À +sAK&®ªoOˆ®MŠÒçìûD®O5Äo4M ù´/×âs¤ó[2ËzRÓQZeäá0®ú£mä–A.y÷¤û´WÛÓ! ³Zej'BÙýõ-a¶/h™¦|8,£HO& A‘à~€ù)r+ȱJË%(6·Àùå^æžPðõÛ\â´]#ÅÂöbJ›þ¦ÇU¢ÁW™öB1šVÙ§Ãd\çÅ$1(øL¶úê9êÝÁ]î’Öwïä»ËîVtb%Ñíåä#ØýSâ—2Gê¦FIzR3”*>œ‘Szš wØåifÓ` aé¦KÆëþÉ@Œf ñ挽kwVÁ¼ücìCR0Q6PUØ`"¡ªvøõm FL9¹t?dS‹ˆÞ;Nâ,œ°ë®­ë¹{ï #Öd›]øÕ }3;øz²áPïZÎY©”™gï”íI©bYRÖ˜)…8ŠÿžA/Ï LÿïŇ²Š“‰É»Ô”MÕÝSx©‡ŸÒ¹äÝËA[¨,%Rž ‘µ¦ïV:I} Л©ô8¶ø·à¦ˆ“u8ZýyÝ—RËB=Ô``¡þÃ){©Éè\Ÿi²AWÑDt, º-õ§L‘P¶)…¿wòëž ÃGŸžÞ’ž1ýc2ª8ôq*ûáÇLú’÷Y¸q8¸L0 L€Mõ~š×: R¶µ`Ó>޽q[ݹ’äB~WOb¸š‡[ÂmÍháQ¤ò8˜š‹9›ó@*UØ–[NÓÀá^9B­ ¨çC“èkS {jŠzÙ>ï8£r{·y‰J`4gRHâñN8–âûìW!ª+HÀaCÄÜâÚ@⹪Jëþ«°Mê£eK&©ÄêlìF,ÎØ¢öØNÖçȃãA, %f(¥•§ƒ¯žN;‡¨CGðÒÎà ¾+[[ãŒaðÜ!e”àsAâƒ]EñfÇì¨j0[ÓχQqgO© ûÄ'½UµF^ƒÖâÞéšy“بrœzÁýÓ|5ù÷š,kà±õÁÑá×ÒvÆ €v@Ðã¬Ì,cú¯A«s t¢ª“ÈreÔûªDË£¹~\®•SÓoeŽŸ©hDijCA•õiž{.Éí¦í̧n¹ZáFãeT¾@¶¿vKQo’¥™×œ[Ñ‚“6*ú'Ãú¬hÆ„ø~Å·N2gÏ3¸xiZ5wylå8ºü¤0±ÕÞê—dæ@r¡ÿ)ƒË2—-­¢#Çg&ÇØ¥3 •j¾V˜`ÞB@ ’MHÜË-ŒÓ¿dÍ“pÕ%ç`q<¿Áöœ¶‹ áš+èÜËáV‚f¥K'“ˆi]@96™Fü9ut+áL«bË&ð‰¸™W¸Ý  éH‘¦Ú—1kBû¦Ž:Óq¦_;P5ÒàÎ+éf,1²xX×J­<7äWá8ýL•”žï~sG“nd4g'qçlM*»þ‚ަX¡?® Š’®ö¦åðWëp(ù×®í”[MF |HØMö´†hla]Æ/^fþ[n^‚¬ UùÂ¥Yàλ8­ôOßíìQž¡JR¤÷š]ºâŽNëuÈÆÜQéÇx'l㨬Í͘‘$~“•œ³sh›;§æîYr =ÔÏY?²½[ÈÎé|qî»bÛÎ^Ùxv |Y"FmBœúÆú““ÖZÀòû¡>ÓTík¢Ø4F°þŽ˜ü·=9«‹ÆåØ{ku¿‹&›)ˆ×@DNiÐoØv(¡ßëNC—íHÔÜ„ –€çN`¿§:J«þ"oD‘FÈh\a²åc§Žµxü¢mý&-.g©ÎöË=–3㘓ókУ<þ_4›Ú®¨ÌÃÝã' ‹G ùÀ&Q…¿Rº\Î1[Oæ&ÐQ©ÚkŽm—‘—íñ ÓKÄÌÀ¸Et“» cSk‰êý@Fþý8™¢}´×M"ä¢öj°cÐñn#hß„cÒI †e×FJnWèYÉ´£H—Çâ¬GÄp"RäÇK-õ Ü¡Ÿþô–Èš&mÕ·ùÓwEÄ3Ò¬˜v\y]ñU¸Œ Ϙ掗±«cOTl|úìML£¥ø1ËkÊÜÂke¿îø††W3B#UG.S%í5¯;Ÿ‚,C9,g¿U­ºÙ›(S·èÏ_\2êˆAóx‡ ýÄ+¶ñÜõVSèÙ¤!kª(XrXRj#»b¬KO£½ª&;w…%Ð_…1¤ùå¼’ç³Ö·“8]AÂpµ“8¬‚A™¾Hå¼³<_ÐPs$*B˨m÷ÜÊØe«S`¦ÖéjÈʸQ?ù©“óT}ëÚZY´2¡±HWãp¾s¡p*t¯Ä>¤Ôš{ý]ßþš+Tbúsñï€áÍ&ÞõÎç òoïfzF§p¢¬ÊTªà¥]4Ò<ÈÖ°® ú•‘r? ‚=`Åɶ­mhš'´!C"J—•¦˜ì7DXˆB¬..,)jÒ^SéI4|ä°Nn8lÛ£?Eºb7ö:§Û/1¢Á}vױܢ©T±•æ6Ž–VŽ ¨Çþû4Ëdn Ëg7ñÁÅkAÇn9¾¢yMkz}¿3ây»(h©Rüí$îÌß9S£n}Ê€ˆ^\q/‰ÜŸ‰²Í›½vUš½c¶¬U«üªeO ! ì03Lêkßç¶õЫñ‘J$ð©;PòtËÄ.×™ö»,#Þ¤·&ÝebnTÄ]ccclŠ…¶4–â§êùì‘BÀT¢ÄžDÐÆ@æÔõP·]¨˜‹·„¼ýÍܘÎ$ä®zUK£]¡Á\ö |j©=¢y |Ž_TVƒ÷ûa¡„9 ¡™ßït{Dæ ÐGŒP>/“×N½[ót*P³¦¬iËÇåñôBÍŒ¶;YÅ’T^—Er^jl7VŒ ÍAòºàœºdí9Ëû›¶`®P‘°ucá©–ÄÒãæ¨+h Ž›ÒLm¶1‚[û7‹ÖWJ­ñm‚ÓtÁá+'Ï"wájO ¯„Âi×Ä‘w`ã%ñÏØ¯³Æ ’ù  rŽ^ª°òòMgRür8±UA"šñð{LÞŠMX’µÝîa·:¦©ˆø¹m¿Lq]«JÐç|­.4é–0nÖ‹HŽò~—¿ÿú·v yØ4ÛŒ¡ßÌ{ƒ+¨>IHÛ%ÞV+uh³;;™ÜþYšSyÏ‘ïø«…ÓüåÞ¾Zljw‰Ô­ÓÁ2¬vmfBè~4/ªº«§#»f>²´7$•ÃÔE\rQ•²©˜Z'–m7#–Vn>;=oÃ>[' = òÊn ªßÒ ã²çßµ h ç—Õi8åÍh"±Ñ¨ˆ“Ç¡N.÷pÎ[qqu¥R†åå² ±áyXb3Ù<@t\r7ÑÉFçþ’›ºÌrZ¤#\`tuÊ¿h†„PM‘ƨª¤±§`Àq)#M-- ÜœŒX;‰võe4Ê ÝŒ‰¼\ÒdWÙDc/-[ñ!%Q¾;L\õrõ3ü–@<âìÍ úL¿mÓꪧd˜¶snM'éȨ¥#Û_äë/µîäõ{_Yrö¦À¶v%s|ÃY·-äE9š°çbV`úĿô˜µåŒABX¼MW?¤ÒšñT¹|` ¾áŸ.ªq#¡wݽ¼”ÕYóãÆ}3'ÞLvxãYÂ÷©·JRªDw ÞªdbKºX\5àÆG\UQú6°«žýl$÷ uèØÔ\Ó†„Ñæêã½ëÂüDá ÓžVe>ÉroÿÔUÕÑð;þr;»Ê)ˆLÁ—~ÚYÏ ÷ž“ûDÜÈwÛL»†ÄžU~Ö—ÂìªÜ¨Œf³ê'=Ù_c®ãÇÏNùˆ ¥FTþJZ9á¾i³ô®Éiœm-;“àk¦]›ÛD–|€ºW>FïRÕƒv;;à;bhšKužfO¦”³$ÅóÁÊ‘Ñ)¼ ’n'¤ÝŠ€ÙHbêH {tRÅGJScrˆbÞ`x˜3`Aw!ÉÍúcíÎH,8âÆÝG¼žN¶~Å`„àr ÞôB½¸à Ùè¾õ\Mÿåy„òŽN%¾êÃobJî-gÚM»H>åŒPÈÆ¸Ã*/üóK‘ܘð.’UHF2ØúÁÑ t›@G?£ÄnÖ„Ïý·ÔµP5=˜ì–ádwŸ¦ëï­ùœÜ0w\o÷ÈÙ Ûð´&”æ||B6‘ó³Ðg«fM_ï1 Nï:>¹›&“/ñÐ Ü ó÷_aÒ»ýÓžº¨uÝù“$ÈÆÜ3£ˆ|‰±O8uøÍäÊÆî^qŸ™ •-бM[i&^¡­nÎûh^d;!üM¬ ‡Œ©*‡Ô×D)¼¹{[ÊŸ¡m¼³D®f\H‚ȹâÊYÁÑnO‘†5D$ ¹ø†×– ¶e¡öÏÑŒà”Ùð®»Mû¿_~ÖªËÔ6Âõ¥`¦¤dÆkÎ''I€Êp0(:^‘¿H/5ØJ}ö¼Ë€†îMgFªŽeÅ»‰n›õX³öY>VQœB'1÷âwAÏã ¼¨(t9@ts&JÞ´_¾! úïƒ^àžö,ä„6¹6Eß…©6y*>r5ª :fÿjDÄ}íA¥Äox\gî_ÖChºGa®°Ñ¡XŸì…‹i‘ÝMÉß¹Û •ˆô²ÎëÆÉ{Þ¡f"H2^5.W'³æ‡+"i\xUÕd<ãs„EIPuGM_þXJÿá\YIáòÙ”xq`ù¡«é#WŠK…®ìe ¿Ù?~²û’è«WIÍæ:þʺh¡/¡F“”“œ ÏXD¥EÇ AȮβµ¡”69ÄEw%u ×UCÖ§ðá4PÌ!¥úÖ²âž/„[àöŽVÖúÖ9¼KIJ9µû^—˜ñi:Ë£+5ÖQ‡M0w¢ñ‚µùÒ6”Êá‰ÏüíÔúÃ1¡RGÛaeY¥‰¹¿Uñy‰9\q ¢¦`U¨YÀ ýCwÓsŒ ÷ï z+‹ÄЭ8"¼zºfÅ»C! Áv¤¦ üzÇ´­|Æ=Y†É¿8fz…áàñ7¸ðc­ûßKV™o0¼Å9¨«65´_L—ºl³¢‘e•ßÃÎK…ݦA°t<Á-줈_‹ïþò‘Å98æ—‡n_ôè˜Àü-Ë´±El¹3%¡ìígåmä #š\Œi\_ Óü)бxR›¦›é“ä*k~—(ÜbÆÃ³Üs½gé*dkUÙ¥D^˳}Êq¿0÷ûδúdQî|lZÃAxëÑ E³””"-ó`ŽÊg­«¿mp96|gÄI?ðçõ ýŽZrˆïze3î€?¾ÛÎ-˜ï¶ŠùnÐ0Q»]PÞkPÁÓ7•ƒP(Râ,¼[ë_$l‚~¢ÿ{#ˆ-pÕëÛËþ"x6Éà`ÞÍ /xÊÖ„¬•z73Íô-E­ c=8¹î÷­Q´ØNu Ô€ŸW¿M.ºþGgõÁ9'ùº4…9ãFpñe‡mø6™ºL*[4T°9' Äfpq¬/ˆíR¿êݪP6 ûÊeÀ1]øzöW*ªy½ØñéÏâ]éLHWF9²· öÛOo œu1¢VZÙp¢6,g í sTöVG ±È:﬌Ø. PYšû‰ S-áìíÜ`"Å+{ì2}•X¡=ùL˜ÖÈ‰Š¡£Ê66w w< OV—ñ”†­S ™ Æw®ÛBíÐ!•"RAZœw(¿ígÉ€âhëUÚ’­.RÖâLZƒÄ (sl rç¦,ð‚Δ¸Rž]’+§…ëpAÍê8Ñž FTØ?m5E°1veûA©Æ“eLžó$%±/ÏO Ö7ÑŠ¤>³„aÎÀ‘×<ÐÐîôìhÇøÜã4ŒÆ¢ׇˆàóA¼ By Õ>‡¢»±ik~œø¾—«š/îó]…êe=Tgðf–œuÏñY¹“¢!V…¤¼œô˜ˆ ôõÇ_,V„B·Ü#°—[ö­U(¢Ü”zhß ‘ÜÆß7ƒ•P¢5Ct_KÚÄÀ-õiàú»òíSnŠÛ´–$Κ{°Š­IÂÇvex[~-Õ6'…lžÚÁ¼@ç|J®ü¾-,ÕRO‰ƒÏdu;ÄvS ¨|Ôi[úŸ§‚Â{Í–òù‰íkûüDNU¡HéËEÅoÄ?—¦²–_š€ò“þøÊ“D.“£¸Lá||6¼CæEåëÚ1]þÖÜt‚ÀÓ}ÉѵH ¬tnvÍí©U½Ýær1¹òš\‰0¤šCbÐ$³+= –Òöa™'ûið‹žû.-Ô—¿5QFŽß®u–~âBRúLá ëlðˆ’󑆚ÛÜèƒnwB'/Pá‘’ñ}yžpxV庹¹´^Úƒº…H÷þå#nEïßbź ÈúÝIT„ã´ðXýCº#kò”©ŽC;J^CÐ< ;P0¥ºå%õÈÌeYm’¶BhÎ!áq Ð膱¸6:ëÐobS¸Gü6 ×ËF†?{ úíE¿àò6-Ùöõ–ƒMê땈ò½‘à yÖâÚUÑ5òÿuÊ4À®ö‹v¶øÜjíõÑç˜øsð£¤Zt-ôõ(çá hŸ½¡Qü±þå-`©ôXOï›háÒÇ\*d’mëY:®)“~ ÷““÷û=å›}ÁLHqÖ¤êsRoy ó+ Ѻŭ›á7¹‚óÒ¹*Ë‚ÕÙ‹|7šj÷¨¥2rº>ßÒ±èUâSz0-ù/Ϭ:MzéŒ|jÇvÝZý‘¢"V'Œèƒ¥ÆQëøŠ‹]æ‘©/gKqR›{¬Žûx`7Àyt¬ïn³ïò>@y¹†’yTZƨV}`¾c¾"ÂD—Ü·üÆ5†ªfl_hê ªºùæ(¤;ª;¸Õl: üu$¬@;SCŒa!RmÞ:ûð¾ÄKfèôS<}”lŒv,«—Äë%»_çëÇN\Ÿ’™Â„D_¢®µ»q>#œþ»ËHH©P3ba:åù sÿØT-¨um_åÏÐÞHÌ,q/pqÎÕRH¿#b‰IJ¼…–ì3çòçµklm7I†ï¾æ×Wœ”,­ˆ3{Ü:¥ôeŸ{¤ð%zæ•]ô¸2ÖvÑÌ~ ‚FÚJÚOƒpœºÈvÜ]Œê!0OP(Rº‘17óñ2âA¸5ÖPº{o øqÇLlø Úš)GôŒÜ³ð±xïÕ.È÷˜„CôhU‚ìð«w¼.ºOÃùy¦P}#éÒøpV;7pÓžÙ¼y‡ÙÛƒƒ}‚R²,±lh¾kdtúßc9‡(lLsHÏóÃâ>jåø0-ïG: [­ysE×'?Â%z^!uØœ„‹\Ä0D|ªÃ=´ƒ5¥…ù&^°ôÑ2}þ•à>jI°qÇ×ÅÛ°4OØNã3®à~ …ñäXR‹]<|Ëâ'øOlu/ãîükš“×ß3‹",>h™zv3XÿDøåÀÃÕýÏöëÛK¹ÇAÅrÓGd;ºÀë:5Í@±5Oת²ï‰y ¬—Œ»Žr\ð¸QÿG‡œ[t•ñÇê²-Zæ¼"çºíI&‰LB¨PÃAüWÇU‰bˆÉÉ­¢ØZG„à2hÙ…@ÕÇÕtLPx1wŽÍê ƒVåÙ@CŽ­Š|Ï5ÏhhVrY¡±ŸÜ£#i®ªo#ÛðSöå˜4=ñzÜ×,f"üPi×±)ºTä›Ï÷Q‰oO­]aŠå ŽžœN ÷o Nw|×å ð˜£úÛW}ÒàøçS ­CÑOOXOêÏ%уæí…]WwYZßù²D¿íS²kûëÊlMɾþ=º¿ ÃÞ6‰B§+3†¦îA›KEV§{M(…«uà%Üœ€ÍŠ’g° =îýR´Ôœ)š1Â1Wåõ’f¬‚#ótfb…ÕDš#g¼¸PtÍð4KÛöâ?téå‹é‘{!­é‘¨¹%iŒ’ÌÀÜQ6 `èúƒük d™€ 1pîT˜ðgmTâhpþ´ÇÂd×Û×]ÖÖùoç-ƒè¿'8ÚŸtg9™ã½ˆÙà"ËïÅ€-ÚJæ]ñb|Éœ)vˆÕ *œ§evàEE@ÆB7åp68sÂRïV!⌞nñ:_¬ð’.ŸÆw&a¾+ý—’ZLÄk8ËŸ¡$}ªülÙs^H[ /ƒ]p’™âÆÛšN(„µ@…9%ÕÚdÓ¡à>/&}ì>Æè¡ Hà ½üa\+Ϫ˜¸ÖéØkiy05ê ¦¢sT~ƒU°%­HAE’QÛ®PfVìˆø¶<ˆKþL’@Ó¯CZ–B²nÚ!×tÙs–TN1½K¸'Ô*ñÂHÓ£Ƈb¯x÷¬LGtà!ïE?µL*n Èdà@2—GÉ´tç ²>Ñ0`JóÒÆìlÎâÈ*¯ÕQë?µLQ5P£‰ÛSð£úƾò®åªm뾦ü!£ƒ\*û^©¤&즂j÷FaYÉ»“ШÅÿ{%'tdÿIxöXk<| $lƦÔù´‚Õ|mH ~j!ƒïyÖú.d‘So':U’!hƒLcÒpÁÓ³9Ì(‘£b,`4?Ç ¢ âß5炉FÑAà“'+c’àÂtó­È ¦b¬âè¦?&"î p\1ñ*”~*mþ|tƒb)ô«OkIiíe«d}‡ÂgŠ’'*_!a…Ùb‰°Dw‘Ye]­?UÝ®°ôÆyéþ»“uQ®\‰ç톻/Ú»Ð&r7šÀ’4^…Ñ®e9sÈQt¨IÖ¹™Ù"BµMFtµ†¸ýÛ‚çÞyE 0Wø(7ŽP]ÿ»·;8À fv@ì²ý $l´¤›{TèA£e[Õž¡#ìÅ „Œ’“,ûãzž›4¥XÞQÉ:zbÐpyfŽGha¡P’ù”J >aäa°.âbÃOQ7´öá>Àç ègÿQqqŽ’ý}z„0\§cëû²š«‹å¾à”ÒÝfÚë'" $DW‚´À‘yœ¹<ÃI¢È„¬ª?«Þß4ƶ뇷YÄV¥N™Ø0Þ©ŸE¤¯=™[kMUõ¾ ‡¤‘§†Í“\uÄHõu9M¡t–ÞÏù’š;!zwþ&ž5Ÿ¹w»ÏÂ]g«aÎÈIa}¾Uç‡BoœHã§‹¬ÆX[œJ²X“Ÿx’0kHåN&‰Ñ>›ûA»Å\mlfövÈv‰©­ŽRÛçÔ\®=l¦¯9aSfàYðæÍQ¬LsÑk®¯Ž9'P®«ÖY!ùCœ$z bÒ»¿€9€ž~e~mäÝO§ÒYN­ƒ«‘lů—-üjRÅp)¬‰Ý*oã3‡2¸LÙß`b‰v½é”ðu,œÁ±éq>JÉF:{‚ȸµ&l㾇n]RMš[|ˆâéa|ë`XVYmºmj>gC¨5‡ÈG=,Á^$"ëÏwö$äáëÙ‰L‡žVúÇÛ<0½@ùa2„:åŽ4lV•Wmèúvz¨u­Áسj™ø¯Äê¾Z|û2¿<&h[hMß Á7U~ß 4fG‘´v¢›1ÔÚðžbÀ_¨4 —RKâ`Þ$òžeðpþêg¢,wíÁ8d]¨ý Ë+\ƒ§óJWGoPÑOç~\›BY\JsÎELßê›u ÍØ%Ñ!NÖ$³†¯Ï²ç·—YUÝ›áŒ)àïNfP7wñÜÿÿ@é¿3FWÌxtfËb)a¦XÃÍ•‹FûŸ¾²þI|Òg!dòá[;ºrTo·õB,p%Ý;KÖeÓšègFò÷§÷\á$¶ ø™…)Ú„…˜÷Méo7ûõLÍý¼Iµ¥­÷Þ5Ýþ˜ˆò( v>ó¡âTœÀ(ÛFCsÅt8¼ì§j«ms™z‘,qº„ƒò(S¸©ÿ%ÙbèϤvË` e´×J~H~¬oEÓVýn¹…“’¾ce çÍxÏ‹VeQ¦óÔq¦·,Y€î@¾ñßZŠØr"ϲ™AöƒX˜ž/› ³ä~ïS©ˆåúÇ9ºs¹g':®-š–ÆbGF¼niÀAŒwIÙË.¤#†ÌõU¤¬d-Ûi°1fçv`©+%¹WurÏç#‹ÞfMßÝ×ÙQÆõq¢ñ ‚É=ݯ͇q ¹?ÝUQ©3ˆ"¡ýöÓ¬àkÊssž ÕÍlõ‚öõ$ È«³Í•¯i4ÿáDÓ’L»rÕäÙâªdbIÿƒq|Íy&º2QŠPÔLp×5’Þž9V{ÐR &ëíšæüñ¶d黫æX*µ]ýk;B‡rcÉXòhÚm jdî{öQ¬I¨í¨;&Ÿ4iÆ+XÐWÀfº ïrn(föí-c´ÀÕ&Wê£`NÐ^4l1|ÜæY¢ƒK‡?tbѯº‚3¼„ÓJì0­rkk#¶‰wWÓˆcèÓ |Ëlx[I ŠÆ°¿Ö^Wo²Ô,ÞöK’µØ3/FPú‰¬=ôa®WÒ —KyA‘05Ðx×3Ö•’9gÈ'CÐIéòõJÒ(þf-W„,érœµ«Î+kTL&·–Ëu¯Ïn™í¨”kxàTŸÒ ›ˆjH˜§ •±eà`µù*‹ƒùçqYÝÉ«²éA]ÄèüÊb†g_Süïžó‡¯Œ/Tx`»C{•^ð=¾òÀv«b8çÖì©ýßäMe·Xùqç ßPrS7 goà£IíDÌsð'O¨d‘¯Ö‘$ñ}€¹“˜UX®¬i{Ïý¾;er—2ÚŒ/—bG!3«ÇírŠxTÌh™û.¦¿µn¯š -ëïKÖGÆ),!–È'Ƈ*x_úKe¾m ÑX!f=0Ë2ç(ï¶Bd¼é¢ ßðöÉSmã `Èl]›9>b›µ?Ÿ‡9MBí¦-ÊÝFÛÀ ×&Ts°—pûûV­Ë 4ÎòÎ| ˜nõÚuÐJLêÊÜ=tÑq¸ ֮Х oeh3Šôþj_#‘,§ß.cÍF¾?‹ð¾ÑÊð¸ÐÁW,Ú¦#6ƒ>’ùêÊ©ÛEñá½fê°1Ü:ldš%‡Ú§=—‘bF§"’G<έâ:ÞÍá„á_ò¸ÈñÊ[¦)ï1\=0Q$&ŸfOÝ!ô‚˜"•2^K–=:;0ì.Öé…Þ«ÀÎ[OO Q¯FÎV6¤[ÓRð.°<7”ð WÀðŠ)úµOSÖF@R“y2ÕöõêX#±%ò7~È öЖ«üƒ2îŠpÒÔ&¬îdG´8rð°uòÉ’HÜû0íëCë1åžÙ¾ ­ä ­RJ/Ö,ÔtûOË©Q> ÖβüHè$Øu þgJÙÞ~- øT¶C:» •º…"Lx\ØÊבHwì˜Nœù‚!Ø—+ícTíõѾÏl}ÍÞ±,ü>'Œ<ß"”©ô´Ê²°”åÚwÔbZFüjí¯=IjUÊÔ Lz³;síùü,‘¯Î)^ñK¨2½¨­Lü­ÝbÕÑAü¢˜qñ‹ß}>ÝÆ‘•Õ)ú|7pá‹´/ë†TÓ`sHÚ¡Ï ÆšœÜý­ÞãÞ`#gkôŸ[=â¬éZÆÒØUSü¯¥ÇÞÆ·µ²ÕJú³Î®jÏÑâ"ÍþÑý7™l`˜€ 79ßШ_¬ jø´jV¬àÝ·ž@vÔQvûë¡ÜòGÀErSÈ'ívx`ðv2sUÇ·Vžjý„ïA)>}1ƒoª»ÏËH2Ý*¨³ZâÐyjµ‘V¹=X‡V¶äç‡L¡‘(»•Ô‹Ÿ¥,í*Ò.ïå`NCÕe–æÓÈ>™]pÖˆœ{0¶£¾k+¶ Q® ŒC)„?$Ua_wÁàriæú{:Ì×)æ?L+mÁÎ{ìiSz’˜ï«Û2e„ž1­a*öjãÎ+^ë»VÔÎötª#}æ/§ˆØÙW€R¡Z³ žw¹"ÃE’(žÎø`ñ­Æó Çx$'ÇÍÏ­ˆ¯!E‡÷ ØðÚ%iÐx®› µõ›Åþ”{6€×Èä ò#Û?Kˆ-ì^埊MÖ‘¬Yùw·Ÿ˜òO¥øìt:æåT«Ê¥k·lÌ£-…¦~™ÔíY @¾|Ù×çQxTøú…"œ×–dâÌï!žROA0tŠë±î0Tpb‰Qj]§!Ø6ö8à[Ì—Jj_XgÕÑ? O&w`¿Œ|xg’"wTÐ#±a¬ãœÞr¨‘Ö·‘0P™Çc¹…÷aèt1âT±Ó&>ÂZ´•à˜ 넉Û?}FÜ̃3¥hÚ¾óà)ÒõÍLš›\6=|†Œ~£»‹3h4°ØñÔ§ˆõŽm™ì[Ÿ‰8D¶[+âapt!õ?ïˆh 1éž²¤ÇÙβ:Z-`4Rï)\0߸wç Ïžªö‘6LÆRRœ60Zý²ZÞÄq¶c‘I‚XLéÉ+Duå¶éA”Ë¢Þ_kƒjfkÐép ä6—›úœ‚ã)sêãIåzøè`á¡àPÌ®ï·Ð#ñÛóŠànÉì¼Yþ2Nhý8þq¶ï«âÔ àÃÍàOdã»â1•œ²9²ÐR°Ǥ֑´ÕtâLεj]Ò¾r]Œ†ÉpOo]D„®ÂåÏPJ¸ç*ñ1R›l°PûÚV€Ä9°Åk‚˜ÿ¿ÇØN mí—Úì·_Óì-xÚŽè»MäPŠ ³Ð±ß®»øÏ¿{i4jèwvO•üºFɧ›»Qœ+Í&[ŸgþÎ`–ô‰Š YÛ’Ã2£…L£Rll‚Pëï>j«K` ærЃh`æÝešÓ`ûÕÇ"žïï*pÁÐÏÁúXNxÒs^3Wxà¿ÞXϹG'Í28§Ÿø}œâ3˜A¨PŽÃYtˆüë ]ªj´l.ª0ÊIë±;‹Q Ë{)­kÂBb›<=¿M›Áæjd,”/‹k±„yCDZ¦õHG:é›-Ž0æÎèœØ5iígO°[“ä™ÎŸG´³ù†Ô©2‘¾ÝÂÆôˆY¶ÿj9¢Qm‘#r»³Â —wûù{€Ó_Æ.¿fBc׋PQF2“,½¶Âk²D‘g±½kêí˜ ²ˆÔnGЧpƒ'‰Ká²ê–ó'SÃUFwo½¨j9²n"JîÚùF«JmŽÂ\:€î ÿÇ, q‚g¡HÃÆKX=¦™ÌxpñµwNEií6 oFöìñ—É,RÞ&£÷ë?à€ùÉt‹2ÆCMrô)þ6Žn5®)ÜS®Ì~4Ìà(=ß½†ü–ØsðX2²ÀÜRRÈ-üè}Á%‡÷îáÞ7sðb‡ÀÇ¡‡R„ ìB½r¶ÿæußN«à`¶Š¾ŒÍCëÚž¯ú;JQ½;—hMˆ»=e“äRCêNl±¬ñªƒŒ¤^`Ôñ1õçd¬¦?œIÀá8²8IÆ“Á¥[Á7Æ ·Çáaš­Ûò~Øs¸CèÝçãóQå2 Qhre²äY?y^¥Tv0¿¬,ë­7¢”˜ òK÷õà6×E g_€ò8ì–¨)áGß¹ ö!ƒI-;(¶¶6­«ž‹—,ÒÕ¸9-Hµ9×<韇Q žˆ ÕʦFef4{t˜»JªÑ$†ÉœÉåU ×’½£³õRYÅÑ-Óò®ÚÝQ×iËX€Ù‚¿ÛK6ˆ¢Úzñˆnææ^X¼Àâ;C”>—<ÙÑç¾ô$˾>޽øÁJ1> ›à*t‘1u/Çy¸òpò(©‹‡éµC ÀuÔÝšIUèÑ7©V8ŠKs _çf[õ@Üz>ÿ}ËÞ`‰¶T¶fðF°áOlݲÅEå:ÿÀäjÑBš nzÓ’IºiRý-rÌ‚3©*æ¯õ*´åè–“7¶$qöyC ¥6·†? ão¹¶VÑÒšžìnMå¯ëM’É·“T`è~ä‚ìµ/5dÝDíOœ;ïåÞ£58L£hOL†e¨DÕÃW]$I”‡?ÀšTÝqLYí<ƒÆþ=íƒOB‚;^$ØáGn¿]%¯¤¶»Kå pŽܧ Umã¥jÁ® údV· ]™ômóÁÈ®¹»(.ÏÓ.ç°Ù};• Ê$ãÞ›,IìΧ{+ßO­j˜TnŽÂ 3˜/4ùâ{Îò°êã@’Om”«íQÿa2¬*~xñ¯o}Å2%‰E1öËÜ›¨ÁZì£yÊîh-.Æ ï×…CG3‰çcüŠqÏWX^ù¦>‘&ôÁ|Ð56çßCž7ë¡Ô‰¥SF§á’Õ¦6TêQF–‹$EvKanQñ¸±¬Çß®%½J¦µœË* "¯æi ­ýž|›³úvæÍá,ÖÒý¡Â† Øfí¡Å—Õr4¬ì¬ >Îë¹9.¹I˜³2X,Òµ‰]÷.BUˆÓgRUà ¯†ÑÜ0áûŒ#9A·2Ds¢ýT%>Àm ¬§G!8¤Štn˜‹¹Ij0ê¥ðœÉWŽ^ ½ûëØ’²Š™4-DÚQÇ‚¬üÚuû—4¶+$)CQo ¸QFŸYñA)SÑ­É5;U ^j'†Hû$Z!HX·oÇ6o"8ºn¯oÌŒcEJò2àÛ×â#ÄéM&ã²’¥Úr¾sÍV:z55S;I?}œ6lI×l6ö‰¿¹WFv~Èv$5äáJd”ØP‰¬Ì9IG*¡qŒñNE·Ç &i穘ý#¸¢Ÿ¥Q/¤ýˆÒÌAÙÕ’Úq슜›šjÄJ›RGÂJæ­zmHnK­[Ï“}ê´8‰ÌËA¼x¦  <8¯zúfâ¹…ÎØ´ÓšCIàn ìQTéšíW;œ\Ì‚º„´!M%h\NzuóÎI|ex __ˆÄ  éLTÂ.dE|/}îi-PBÔ(ehYUÉV°)—Ôë©j®â’ºaÎq×ÕðL{{Hö\x¨¥ß׿†‚7œÈW³ErŠî)pÓ¦?‡’ÖZe‚@R*>6 Ï ž¿Õuÿpäšì,ÕìÒœÔTë¯ “Ô˜{%1BàŸkÆdÈàPí üÕzV¨Í2ó¬lGˆ‘œÑÇ=8_,y`ŠW¬Âàè˜{i|ëSÇÔgû&Cé0yr"ú†EþqNex?™™ûi[äêF%Ô©u;_ §¶¼86w_,_^!À¦ì¤÷Gë¦Äê’«ùZŒQÖÁÚ`#LË þÆúÔ~Q¢Ñ7¼[ÞZ`â[£‚ÆFöúùþou/ªˆÙ»ÜéR’[Ì[å^»Fÿ…Q |œ5b­£—ú5UºÚÀ¾Éâô ˜ïL7>øÝöùË@4<K_Jhñºµ²9mÍ ¨¼“Ø-Û¯¹RÃÁŠ m˜¦T!†@æ ªAÒèá}Ú5á±r#$çðD ç§jt)A’^ ©ÝEì qʼnPQß°Øb›:l_r,$óR†³q¦­ƒ¼-y¥8xázóûÙ!©·ð”:o7îV +8FžËïΊ-§ìÁðAuØ|û¯¯kízåT¶;÷=8ÑBüO»T¤hù=ÒZòkæ;óÉs:ß]²!¶¬Öw®7˲bì“ÏWr7³¡K¬Kp:Lé¢ wb‚¨¾?0FF¢qâ› (Ùò$÷gXê”Z -±¼òèý/Hï>–vu*l¾_ŸÛkMµÏñ/¹–A5ONý⮟Ô÷^Þ>ÔV˜¥å¬bKžÉu»PÍœÜÐzÑÜLÝû´¿¦n¶sÑ\ê’e†Ÿ'n—f_a”˜T”<$KVSºfð+ó ²\nZTÐ-Å´ô¥KgœÇ Ž©>R úcq»\•¼Žk•¢.bEË5n=é[Ùâ]ªÞäXÅŽšIhVˆo”—%°ùÍÚ/\£¼ {ì!pf2O”^¯ûÜ»h ÉGgÜT=Bí‹/‘4î¹eÜÍAtÁ¹?ö¥²§¦v[8áÚ´\fCuO£ ‚}e½gÁ#Ù \D•£¬[X3œ ef ×Òd¾#wS¿µþ‹jÌ€°ÆÙ½”’;̘Ú¯‹ægP±ƒ|ždœæÉ-õ'ÚnHÙ Kµnq]Ó½A-!Óy–æ[Å«ÅÕ }øß¦ç/ˆÕ[SÏú,ߨ¨9TÜTOWÔ¨«ÙÙþÉßzéÅÁ­Hj–ÄÑ0¥àÎ" =ÂsÊ…Ôzv4Öl,^È?°ñƒÁæ_oC†Gkúþûbãÿ¢ ‡ ÏZûö§A#Y+| ,Ð×+è7»«‘`l¡U2J«°mãÂpä0›§,D¾K"nJîêJ…ÀQùEèKÌ´}³±ó?M>w WᢠQÇ uS<ë‘ñ’ÙüàªN»R¬Ì˜æMñ¿¯~¸jô ¢Ü^j&¬5]gÈDgÐ)“Vø”'K9(#.ç$‹1­%†%…ÇT9ó™xã¯-$ÓÌï>ötèޤ‰ãº2ë$Z_xø<'Ê9Â=ÙгŽg£––åÔkV—КèJ<ª“½hRþ„Ÿ“Ö6ñ¯Ød¼Ž©Rƒó7Õ¿‡ÛVŸL Vo÷\E;ý©Z…Ä ë ISÐÿðé#l:‰A§¢’§ò9Yž.s®üÄKãpŠQ®zSfÚÚå<ùG’kÃ"˜zŠ›ƒ‹“mX…‚'%}ÜwÞ¯ª¯¿ÏMYãmŠj ôK­÷×€o,ÂøQ>ø½é$ 7›c=k·ì„ýÝäÎkªU¬À]!7@í÷à¹-`Mõ«¨M1ô…66âOV”+v"rðô u0ú¯E^¿¨[ÃëT¡f\Ç„=à÷@ôZ;ñçô-ŸGt«íÝ nˆaEÔQËŸq™ÈçÞÐ^}­ ì=ÌuAÕFÝõ—¡²‚+Pœ™Ô`9ƒÓg9+·Õ"ˆA„]ŒÓ€äûúœX¹Ó'Ù•êÄ(¡ ÙVµ?¹ã×=L QX„TßVø(!mùVâ§IÚ} 18ÉîíÍå~ tçë7^½J›ÃŠÐŽ2ýF{wY}ªù¿W(¸ºþ âZl°e–$ëHÂ:g#2Üžs 1|Y`ªV]]üT¶ºƒþ ìtpÐ&òžÌÄ¢{âþѲëjbž¿.¡e ï1·]QGÎZ€.˜n†à ŽЃ<5‘²âoÖnnõÆÃ'†ØA%±#fNKÙPÏÂ鮇*€!É\@ÐZ{AlÛ[Ú¥uºZÇ´õøøÜÛ¢î0<è| -6ÉÕ²$ ¸EŠ|roö?1WÝqËÛÿSYg'>øÚ ÆZ÷“Õ—•ÇNõÛÚù~ºý¶ýÏò‘ºY G‡Ö ‘xìÆ$ÜÍ—„·Ÿá¤ÜúÕÑHÄ×ñB X0M¯»*û!oF½^æÞ&¥Ï@*_õ‡†60›‚;Ø™‘¾ ¯Ò6%zùÃ…¸”_–í’œ¤çi’yÞJLgz=ƒ‘Fp!­[ã[xæ~œ²!@mCî•0øÜ6²XóÞ¢Í&´n7\‰Òº2¹ágèÙñ’–-aÿN,$`åËÔæPl_Û‚ Fî¨äÜìÿã\\q‹Ÿj¯¨éáŸdÃd¾c»eð å-Õøù$=dMºïFâQxg!§Tœ‹…í(ºm¼Öä@qaæ·¸Ÿ‚-¨Õ4bx¥]2+AÒYìYdxçô‡*ª ¶ò©·ÏtOW ‚Ñþ±'O[ÅFNÝ{“áÅ»ÐbomjP²^÷Âݵ~ö#’ì´éÞÚ_àtßY´lÛþôçð.A·J| ïs&oÜ­ðï|³ðIi|òÂK ß’Õ%IlÐQ*g%rn*­¿×ž‰ÔWiÁ €ÓíwRàïÞ<-ÓR6Ÿˆvë³²“U3>ŽÔ/®Ô–ÉÁ̃v`X¯ì- ”NK¬ôKž¬º..=ANßgÏš:Ç-þWŽqî¢|Uþ¬i­‚DÒ¶ìåÚåÔãõe¶Ê«Ý€—§áµ²Òo±” Æß»Í×\^ÄðÜhDgô ˆ‰éØ*¬=µB+«F^â7QHoÈ\¢N<“rÊ0Ü«RO°4àà’†?.G+¾!Ÿ‘'Uvú¹ÄÏQ&)Ê[4°™^Ò%M8@fîyùe{›:œ6Y©ñ¹¢Ü»WĆÌØÇZ}gÕDqòÒ>i” ‡ŠæPßwaôqm#Èu¯.}h¾vpL×#ÕÚG6ëM`–¯F‡Otz£;üKr å2b¯hÕàžºÿÎÆÝmlÃò³Ð‰³/³%¿¼ȶ§Á–Äw,ÁZR#âöûÔnHË«2X³¨…´6Dɶ¤l߬„)Ý>†¤lpâpÂÚèmP­ú©œô~ØOùm/@ÝaÇÚ%6qßÑc™ç åÆLT³{Ô#N;ÑNÑ:ZxuL¦ :{Bš.Ø[µ!fÁÎ=6!ü⦤aªGù [Jˆoß¾JT@€aFåªu˜È–ßþfdÝã2cÑ1/xžf6< м½ ³úß0_Œ“¶ñ:_k6­)qÚ:ŠŽ:-Ïô½hQl+ázôB9QmjÐòO\²xÕ=9vħý&H#ƒY±lL‰Ã·bÜ`0÷Ôl\3aIAœ©mO¿¹9||²+<&3fɘÕhoDµ4QnPåûæðÜÛúáûwŽ\ÄD6+X F-`fSɺ6²xåÖ±5„x$8lÓbqwÖ:˜™¢Ñ¬éð<·hO ¬Ÿ-y)2úw5£Âd×ÎéRœš•Î1µóÿR 4%`°xêÆÁÚnµÀ(‰€f.â²Êg¾›Ú·Å ë—è¬÷M£ñ·’Ød©)öòªßº×]¼ž­.çÏÄ0þ`˜]éÞ£ŠöŸšÐäœi7cWÈ€‘‰Œô—g¢¶WÎÚáw£¬Wö=[û´Íûؾǿ4pí¨jÿp«3½ù~Ìb,.".=M—¦5Ý)n¨Âw´2lëFÔÞòÓÎy:ר9\®ãþ«3àÖ†ý§?OlcÞøµá©yx2Y]¡å z•›\•h¾ÛHʇõ732Ôt»æZ9ƒž]N»Ï‹~áÖÐó~Áèû·Ûvƒ&m÷y¡n¥™˜Eëä‚(¤’Èþõœò5ÖDüQìSœr6ÿK{Ðk¸{yÿ¬Ó…Mqˆª)ÿƒhØe£#é‘Öì¼DôIA{ŠÓƒ¡ܺÈm:cÿ¼ÿ@š;9£‰áÛølÚÂÏ °ecÿßê$l:áÕ0ʱ6ìP¥ ¤+xTw,âJo_{9a ~“ô½Ì6‘vM«%šë‹~sÙæu™À³nhPË…ÀÑ(leÛwÐvA/Ç z³Léhd”TüÞ.Ãû³O{›dÙ5noª®„Oð”öôµNû’"€íƒ¤SZÎжbªHù[PsWñAªé7a-ÂQ0÷3_YsŠ!Îl¢Nô%ûC;v)oä6Gq{JÊ=«‘¦€2-èÆ11¼2‡^ÌO‡$ƒ—ï¸Thb´ÜY#MâVz},Ç3¥Þª6ñq¸ôã\ÏËf…Êþ‰"KË’Âã»vïZÁ•ÊÍiÄðÆÏˆˆæ”ôyàÚ†{ü®€"ß3í MGê1Έã4dz­;NA¤»Ý¾nH7¦˜C„k_‡¥´ñ:`ž¼ÙŽÉwÁ™©@O„û<äCP¥ØDJXƒŠÅvÁìË‘v•"Ú'‚™q‚26E0éˆLë#l>ÚKü$® k0®ù4€)Ðp¯p°êÛQ –÷á)}5¬¹Û3'o|#<ʤ͛†ð'Â̵¿täâ ^ AFÂGÙÁwÆN–Û†Åߨ¸Ž³‡u_W'…4C‡Ó†È¬b@…a1X*Ml¡µ7WFp÷Šô[ˆ.#zY#oH°B†›(%3 ¥"§ÑþTǵgX;ŽÂ¿¨‹´‚[@P3šñ¹”P ×›¶S’š›ÃÖgŠŸ"1B—'L³§ &¿”™ð;K]]I2ú«µ»Ò;l˜p~ü­ðqC˜Be,Æý›ÿ;=à³›âAÄÿÎM.Ñ?[·B8ÊZbÉþ±ŠHîPp í2²" èß&0_^j9šóeÅËQeÌßÐ:ÃÖÛg ª¢•!ri (ëaÑ6âxV–Ðë$hap»Ö_Þ‹ },O/æA¡=5xVkV1AÀ‚ ½ WÊ>dT0&5üÑayξ‹ÜRN½xŠõÿóÔÈ â5Æu”bÕúöÁr±ës(«Žr÷K÷­j®ÁŽr™Cwt )Z7nÊ,âõUØ)Ï=‚”ÿ¿ð– ½ü8å(Ø,“?=r儤È   o™½ëà›™µ ¸6Þ;EŒ¡4–“în8v¿\¼ð¼_gÛ› ÇÔÜê2þk¯Î–Óç×Gs'=M25ÍMËmC•Ê÷_Y }úgO¹¿ 9XͲ‚ƒ~Ëñ³-þÃñ)¦¯â3t-"!ëà‘Ïó£¦z âøÅ|Ê”™à‚,ôà釼º™¿}éÀ»×~H3ùy$/w\mß°9b-–†6­¦Ð»eÛ¨®VY™[QºÙ8å̾–Íw{× •–ÑŽOŒ\ãÓS&gí4s|=+ìì£gX]ŽÜ¿-YÙ†—þ¹í-\?²EÛ•a+LÇø”"lêFWÉú} †KÒgø÷¤@M8ò†ádˆà-„ŸA+Ž€nŽÖË…¿á;È©ƒâ!hÈ|ÔïZ¥ä™êèâ´‘Lë˜1ÕûEn1¦AY ïf×Ñï8·_)9·þeÂÍyÖajˆÞë|Ë¢äeá8pPZ"ètʘç³Bãóç}Dxàšï3óò\üÚ¼÷bD¨\L)¦rôNd££ ÅÄëg¸Ä¹EF—|5½«tU&ª+ðÉBKM¹û°²ìÝÂVYÁQd&Á¼o’Ѱ]?šµÈ×÷Aܼ­ÃgË€goÓãÄ÷ÄS(*‘NíÅŒxQnËT@­4¼YbŒí75Ö}Õ;­WÙ›½y\©]³pÙcÑÍEoˆp5ýÞÙä¢%*™¯Ã„“ÊT»ÇHØ4iM×MI–u]‹°¥l§~µn]ãw:7 G¿mŽí ¿µË™£v+—©Ivñªìó>ã¬<ŸÃBjGÀåÒ@޳>1J†¾›áäáÞ™›Ê¢hÚ-]ë³ËVTõ"œ&@G÷Á@LâÒw‡DäîgÓ+ÈðΡSÔ$WbÔO-GµÜè·”ù©8 ŠºÜ3´Ãޏî[3×·ÿ9œ€8*˜xVS&2†E(ùºMZf¡ÚÍZî»>@gcUŠ’«š#ÌP¢$¾Æ¨ìŒ*³³ÏL‚†/·V‰`5WÇ_h¬·aõ;ÔBÉoéäVžz³ÑL&ƒU'q$ MmÀø¨;r›cˆ¾_vÐî5îÇçí©[d¨q 7+8l©ž¬œk]ozžÆ0›…B dË(TÄäŠJú&ö¾ªC¹(O'ÂXÌhZ‹ÀA%׿ôraËÕ›ªÙ‡Õ âÅœøPسú ÚFqæ/õ鼉ÌL°õ ŒÚ”ÆÕ!Z¶-œðw1¡²Ý™‹ôÕãuìs&}ø_û¡Xº&ÍŒ: ÞÊ4“2åðš{GP¾²”µPI ³ÞÃ¥Ü!@ ¦£&ôh ïÝ(FÖ-^oôD½—ß¼¦õr&`ŸÈ2Í9/‘Ëaí†àøÀ” ! ‹\$óó Tm4ÿCë§\ L¹zýo P ˳IBd_9Ä'ß!¿ÆÎ¨æØ ÑÌ"šPúB3OO¾ÑFrxÃq?è†Vœã"èóv[ÃûjO _(ÛŒí¡›œf´•%$"PoTX²¾5ñk]¾>`ÿm=Š:¬©=îd$»=ðŽ„ï𛆈BBw%OïÊX·{ÉâÐÓ´¿æÀQþLœ*XF]:~a!ùÚ¸’³Ñ›ò)4Ì × ç¹3ÛdÔskögH Ø+xYxPh•"1[":µÐK¨­,XRy¶F‹šóðTúýòbfF„ŸLîÝJ]žÊÜ£*jx“î3Ÿ&JéÛneñ=ŠàÛWé3–ÂZN”¥Ç-©£¬Õ@ògeŹ4;“ÆÇß1þmI„ »aZï‘âã,l©×BW%²a•Âq†`vFüªç`¾v¢È{ZÆ×»ÔÂÉ«ˆ‹½HÀX—tDd[é[C@aöäF FÁÔC-OÞŽ!i…yÕßÉÛTºå×Ë=É~q2ǽÇÅ•ö_‡$£ Šk0õ;“A7:ƒŽ eì3bÂÞÈÉ´ôÖÇu›?ä¯Þ8Û:êݓܖó*€tðúåw辉sH ޳ýPÎdƒ¦áó¶[‘ðP>ˆN>ÛxßÂ7…<¿÷sÑ”sdµºˆI!†¹g6õï½Ù¯µ{WeÒ#2HBR—Y£ø´ÐAŸvU·‰ èZ¸I<²-Xâ/¶J”˜‡>õ‚=!S]c§®Ý ÙiN{aDêóþß²ð!sà |5“8ÙºJmw™cÌÜV0žùƒÛDªÎ\—wÞÞy­à”y‘Œ˜ïžN«“F¼€+'²s U"ã9Þ Þ­˜–a<éÒU8yÈë¨A˰µs tцOæ×™¡–Z^I•òB‡6XÔ«É';ÊQ‹ÐŽËIiqáPÉÉ£RÚj̨E¼ [ ë"H}»>zdO¾veQpŠo´Ø‚ke»çŽr¬"0óÿ¨ÍT"¨€ÖzlGj'f@1Ô :]ÄXc†DÆ¥ÜÖµÏK]ÆOD7©u÷£Lœ¥ºÜØ}ºê·+ÀìM o¦~uâÔt­7Ur¡xwv.öÁ÷¾‡H§ÑÙ|Ïz[‚²75œæÛ©Ñ 23ÁW‘¤¥mGt Æ%LS•Þtœë!ÛáÑö}ŸÔ §.†¬”ý+$Ù¯µþ§CUÍy• üQ|8¯ÂnJœ%£—µÒ1x¸Ë‰î†žåÀe~”ßÅ›&qQŒÓ3Ô”©Í¯2mŽEIµ…û`¨åŠVäÇ6tÙýïÿÍà—JïÆ®z׆ä2ƒÚ`˜®ÃÈ”“YK(«­h;(Jnl }„ÿ+§½ª+¥bÑ·fŸêƒO³q8¯çKr—4ßš3„ãt‡UÿB^³‡<%äY~X‡akcgñá¯K;bó4ˆËÚvª ä®Ö(~µQŸÖRæ'þJÄk-Ÿñ4$ ¾+óŠ]­¬„Væ…Ï%å«§†’Ëê8:ò€#®|BJ›v]ihA Jx§{'8?= åŽ^ ìù‚tL˜Në°·> æŸöE!NÜṵbG§A&QÆúnŽ_|›„µP m@^í“t—iüº¿êÕõšz‚â£)b¸ÇP¡¨®Sƒl*Èoè ëŠ4ÓYËÄ,ýô ×Ç gyº°‘)ÿa@ ¡E¸&ê”X}þTÕ ·"νö#ÏptG.ƒ Ÿÿ'/õH>•Œï h! Zy9ôÔÎNð¡›naÃŽ ð럜¸;¦ÙJƧø<;_¯6J úCW×[€†¢i§£·½Ìè(GÚ€ïƒKÅç y¢B¿sqØf d¡Ô@~bÏ †{Ùxódz6ÀîÉ:aécÔȼNl’„ ëÓØFeëÒ-%jó¬n1Œ„ÕBV‰ç¿7ƒ¨}°Ãùâšç¿ _PÐü&G4H:' Ðwf¾ÚwZ%tFxº¨ëá„áOg  ±;ÃŒë]åL”5’pÒ¨Š”»èÞÝ,yXýÝúê©÷¼?h2îöE(Oõù˜ªܶø0(dêÝð\ `¢q 0³f)D‹QÃܹ=”BëHpõ.x€ØÑB[s Ì™òmWŽy"ñ'¾uÓöfö ¸,¤öÜÌ£5q±,\ô7©ÈáPžÐ»ÔŸæ|Ý£×­B×\Á”¢óÔ´†ù˜nçraµ2ŒHR¹¾7{IkÞþQóëÕþ¹ôv|.›gu˜€j¥ÅøÍ›6«Äý`2pôwIÛvÛÅó¹IŠùnP%§í.<Ý»s"²ÑÀ:¤Q[«íõ0›au}œ2’¯K‘&—U†g£Ø…¦ ¾(¦ û”ý‚6(ÃÓÑåËv!þ­¤†,FûÍ)*9ÀA¢ÊÑÊúãÉŒ_%Ÿ\éðLåêyɈ.Yæ^Íü3Eĵ,òήUÌ$ÂuÔ€ºÿû¥˜¸ŸÕ#749µE œÕž Èi,Szs^ ÁqT;ìNêÙê<ýÐÄ„-žA .âþš¬ùI7§þ›MÙ}éD9qèýá|GŠƒ4ÑÉv°î-O®uF}¿ëÄ]™N8¡‰ï!²?? ¿áRƒ¬AÑyw¼ùºÉËÛUÛ© qKKà8ám!p»+ª`Ãó*‰À>M¶8ÑY¦O/ 1"ü×PǦh-5Âµê ´È¯k!ø]:K‚Þ0{ G‘ã0&oÇð›B´&cˆžûiŽ‚Yö‹6oF=†A÷n»êîfÒºl¹5ìI”¹þý2ãÒáZü÷m>–Þ2}ëÂéóÕlÑi8Í83œ]züb7«ÿâ}ÚŸbïºÐßkÀŒÕ?¯_h:)Ô¸ˆÍ"ƒ|î^zKŠKÃx@Ùµ¬ÎzÇs"_3Ê·ã€pc®fj'ª-.÷¶ß!4ó`“ý¥¤nÆe>Zž9Mü÷€ÚÉw ©ˆÈñTAhu§ÿÏžC¥¿¨ÝY˜}ÎfWoñ•B *Bm Ã]HÆUS.Ó^§¥Õ™»ºŠ×Gž¦ñèŒò†3”ë2Úb÷ç=­5G½ ©Lÿ9»íñ7£ËZršl‰¤*ýçâ<‘#'…ð¾·fCAq¬+Ä•'Êlʆ*F ŽV¾rÌ&õ+LȳžváWdwÛY—&~ó¼Ë3.îÙþ$QIãf ))ràšsËH3Ùf²À¬ß ”ÍÄ‹ƒŸ/KH±U÷N"І „_CDˆNÞ†g¶bš•¢8½çêTc.¯EÒYHÍ#ýÝQ_=ÚÑ€w~¦È<‹)ëüÝŠìT&p@pÚ%³N!ƒ-.ä;_*„ãÝ‹-´m%ßÿ'jçÉIôÁÔî–,4*X¢*xÈÈôH›%'Ó¼d¸= /; Ø*e¹ti`Œö–†Kz»'š¡# . _“xÛ:ë-ñ) <¢"•Ãjü>>+&¨>Õjw¦è\{o LüÅÓ>ùÙù¤Ò”ÓWϾ<;=ºÖéö–ÙæzÛ’}gÝ\B6² µÁ}ùwG¸¡Ú;wMP>ªb.­q>:qœ-Á%ÔmÙäPØ*ƒÁ™&bŒpAzbWWl;–¸š®$ ¸¢Ä^*ëîô¤9”ÄpÀŸZS¬àQÄEÐØ4 àME„f×Í:5àaÕ¡:âøN¸Vh_{R@ÝšŽây‹3ÚÝ*¹TÜcÑ%=¼mŠW#]®ìö BSÊèzôѹT>Ó?3.÷‘q;\ )Y<œâ-°jW_ýWSQ¬"zŽ¡ Š˜cŸdð¾«K­ƒgJô¼¸)Öû\•”ñâJölºs%%§-^սȩ¿ý°5Šûu™[¸ƒÝý¸cY£¦vÜ:×´‰^N9±}»˜d:${:!|‘—„BNq¢0 %&ôæu¿§ù¬¤’“uø·[bÝò1âVßã2ð€LêdYt þáPÝjÖRøÖúßW)à “âÀå‚Ü9GÃaŽóaœÓy/J,N7I¼`»}jIA¦h±Z{1ƒW!ð!0ÿcoG"´ ‹ää§4ˆ4Rp‡TœÍ3 §±gŠëåÃz0_iý·×w×-e™œEìH†4QÔF¡íS´Ö‘͉ý sP‡Ëh”Ÿï ï? \Ù*†‘)w—HE`Âæâªƒ!.¸sZ¸Ý¾Â—¤ô¸C“ÿíCyô„oÉ7Å’÷‚+ ³©IÛ×E™õ™˜æŒ_PL£ÒPên²l´Ž3Žô{óô*tS5 ßñ0–Ëd†pAé nÃþ‘øh®å‚SzUñ%ÊÇ©¡¬= ¡HUSÌ)öG\0Øø‰ôù—²ææ™€£ï;ó.òÞügi<ˆýÞ3ü‹äêbH€^êç6‚{Žl‚¯*ú¦÷ïIœñ;±ìaÍJE¦úMmd‚šÌy™ÇÝ ÚWþq•a¯NÁˆZ¤4Õ  ëªþDܱ½^WRÆ4œ&àÖ‹ež_÷*ÁžE¿["<±ÊŸbËÀÄMÌŸÕC2Ê!·0Ôh³˜Írù„‰Žî  ä¸xÐ-VØH•:¥Ÿ6ë5¬À{ÁÝÌ š0?Ís hxŬ4¤ÕÇœµîîËœ’Q—¸%ÐÉ¥n.ÅP·Ç‘m_]àh–¶”Ôè_L92•_<ªG+a˜Ù¥¼c,5“ìs#/I4Un^…z)…Y-Ëx¨½ëÝ_·³eþ·ëiµ\ÄÆY!RX©×‰òïXP·ãEØpcè-ÂaŸmHp’lïIÕ¸9ÍOù¦Ìù °8"¢ý©‹²»‡«OtB†¬%Å/ ÝÎïüçõ=ªUy›`hÖ¹%Cô´ÔÞXcÚ‡ÖènI8K2ÚX¡0£\vö½Ç´5_uBÛÄ–’C­n•ð¬ñ‹Y/Ç5 ð+•ÄøÊ缿Ôb•°¤¡Š-ÜõÈ–--2á—¥|ÛÜ‹«ºÜ2kò{wƒ³Åþǃ¢3@[ô§C@Aˆ†Ãù[²Æ¯žÎíëQU¸øÚ,hRÛý'ØŽüüןòìøÍ4ƒ.µ3­PÐ]Ä.¹!ƒV"¯Æê˜÷õǃ·|ZƒBÆÙ;ðdM@¢ÍQ¹ó’{‹aÀéËb]RTÿà.ÿ½;€Èw½ luYcòåÓˆk4 lQ±Ýª®¦Æ%Ó$œE‹&÷¨òšÖCõ n™z)G÷вm"ûÓ{DÝø©G¬N å3…¶ÅÓr “k ÄIkþ):‰³…!àçc©ý¿4-8F 6+¨Á÷‚YrYjüñ|zT‰ˆ=@µEì$èµMú"ÛÃïâ#ø´ ÙˆyO?hšÿr›„ÒW]¶°ÉD ½²U¹ð¢Ëÿ¡Þ €§ÌX2ÈaM§ÀÆ ï[~¥Åqé}u7Žñ²¶]Ó<=4¨§v?| ˆ­NÂɃÊO3|Rù¥¡L M²‹Ïœ&-ËG‘‘ýëû>7ì„ V­ÉÒe(¥zWþÇÕRêÀbøþð¸z0Šæ÷@* Aæ¯1D"œ-©E+ð%˜V> ¤ YWuV÷ù^DÒ9ÛÖ /hü’™À„#)Õñlņ̃›ãôä‹Áv'ÔJS×Jç?r™ýaø ËNoõ¶îÙìvuúò.UùK·k¤P/j,*$o‹8ý/ꓣѢ/tãwŽŸÜwÞ³‚^̹ ßæ^Þ§i HY¨HÕÏ•^n$¨Ü‘(0F“Ø£W¨Í6pŒDÛuÊÔó|¡êØR i¼[ŠÈýÂä.ÜðNõ&™Ü–«~ùÓ/5ÊŠÁWyÚ⪟öƒ,ƨS±Õ Z÷¹Š?ñd ˜°’~‹c]8Ô^sâ›vé\оï€HüÌ6´(“‡„hvDþLÏêd†uS‡;ÝM$Öo:_úêÔìgh:ÉQМQ‰4j€ýÍæÒ‰™,*#2+Ï Û!Luu%84ßB_ÉYNtÿáYƒ‰=)à8)n#ld0–Qeð¡ç§Îr¡Z>=‡;Ùñ3#¾&¤÷X{ ß!á*µ°JÝ( LûwH ²sp,‚rɱÑ|H²â¼í²ÕûÉò¤sTë‘î1t‹ý—U¸U‚ºÃâý¿g²Ì§­›Åã:ïOO‹zÉ;7†Ìµ¼ˆ MàU„6ˆK3ÛRêÎÒæNF1 rÄ”$ã… ,üßÎŽßÞDMãšëZ§»”S’ª¯½ËkMWnz5¨H°öÀ1ÏWµ¸ÀæhîÿeÛÎúÃÂÇ\§ùB©7ϳvÊês7 Ɖ4IG?ÔøyîR¦«C•öîBiÔFRÇø\é´ëe ®³S¹rULÝ ¾¡F²÷à|f€Ø> stream xÚmvePͲ5ÁÝƒËÆÝ!¸»»»ÛÆÝƒ;lÜ ÁÝ]Bpww‡àîöå¼çžsëV}õüYݽffõš~ª†‚DÂÁÞUÍËÑœ……‘™ *¡&ÍÂÌÌ `fdƒ§ u67vµv°3v5çhš›TÍ,¬Vffx €¨ƒ£—³µ¥•+€Ú”æŸ$@hlfmgí Ðp:¸[›ZøÜÝÝ…Ü]ÜÝÿ.R57¸Z™,¬æQE%miIµ¤‚:@ÒÜÞÜÙPr3Z›ä¬MÍí]ÌiÎà¿€©ƒ½™õ¿4¹0þ#ÀÞÝÜÙõ¯0 g;€¼¸š°„¢‚@\”IM`lo“ú»ÜÞÕ…ç/ÛÜÔÕú_ÝÑ\ÿ‹€ÆÿE&ÿEÿ­:{þ1³°Ì¬M]&æ–ÖöðLÿòMÚÞÂðíßi37Çÿ”þ rù«@ý×C€™¹Å_¶¨`lg u°sts5wÈ;˜™;Û¤]ÿvöš±5ÐëÿKüÆ¿éÂö–­c`agdfÿwÞÚEÂÚÓÜLÉÚõ¯áÆÀ¿Fý“×4ÿ÷íÈ››Y»Ùý{ó¿®ü½W3{ ×ÿœû·™Ne’’T”—¥ûïüS·7u0³¶·¨ºþuÔØÙ쿉ÊJÆÖÿž!óÿn÷OÌò¿±¼±«³µ'@—™ñ_CÂü¯ï?HÿY""ž> Ü6V ; €›Õïÿ¨5usv6·wýÇõ¿­ü'þgšÌÍ=ÍMáWLyClÒšÃÊüÅ ¦Ë¡è¦'ÔéY¾,MüºÔE³î·23Ü?Ç»QÃËó@$œ 4áß>Û’¾i"5Ž7G<!‰Ð_Ä{*"+·ô¯ÞxQþù\ap©kgªyyíš±º¤D;Ξ•{R-ãTÂ&ÉcTÚÞ…º Zž»³—¤Ñ§BÏÔù@4ߥ«B¶ Í¿0|ÚYÏ ÞF¼¤À5´Ê/ tÜ×¾Ö^C<ùâÆÖÑ}hÉ»qÅk›Å*ؘé½y"1o¼,³#Oñǵp÷ñ`sy±IéyÓ âîÊ{œâQpq*.T31˜„g#À$aVõBóÃËo Vj) hù°Ó+¦HÂÁ-ôôV+³qi¬ÎÓ=:D*–'äÆHHÖ]*`¡9±‚‚ø²÷½”Àˆv½Zd”ZÞEQIG×?`XŒùQ¬\U¦I ¦†d*SËÀà5Ø­Žån·¿"ð*14ìäÓÔH3@Ù{g¾R(q뉞–x`sŽKz’ØfãÖëCÑØ&¥eð ±Àà¤èE?™ÞvG=¡C%nžÏ2[úuaˆ8ENeŒM–Å„,NÓc•¿Ðo’A%I(Ñ]{ŒeC¥Ô4  á°CìÈÿJœÍELw(èfeÉÂE’:Ú·¬ ŽÞ f¦o“áÔ ÎÔó;¿Û~I³Îc:”9¥\ BétJ;FtVâUl2IÜ©«¨œÛÔRåù—¿í!ûÏG–‡gâü@äÈœh]ë3,u;ÃüNµ°Qž dz“>ü“JÍU÷@_ÁÄ‹•ŒÐ×sÍ.jöÒG2¹ˆDŠ;£`3>_F‰„¾ïqÒÍTw—²ºt_áŸ4l´šËYg&ž_k©!ÊEŸ2×n;[Ë#©±ï_õ‚ —ÉGêíñ¡ …é¹\©Pl(G9pYç1­~¨JišM…¤ÎÈñz9+rf•I6ê8{Á³g`6½(…©öKêÐeVÝë[Tu ÅszOë] ’®0Ä ×¡Õ/ÕÜÍ…g¹ÚiŒã²ù»/[m‚ƒM^Çp Úð%Z¸ÀKNO+é;“mãKݨ”n[¹C(ÆyzÂ6I‘©ÒëçF8!@p'^>ß cUˆ [¦i;óBò ›cLJH•¾¹ùL<Ųa>;O€öõÄ*ÑÀÇ„žÿ}0—“õYütñYÌ#¡zÓ•¼)xÝþ1‡WÔÌ—'ŽžfØïvYÇã¾ý?'V¾ÀÈPBJ|i¬_ºÛôe÷Ï,P7Z"‡›X–⬶s¯O“Ð/›l’:P( gäJí,®rê¢æßÒNeÁ„²Öp0å¨JJŸ¥¶qª 6Ò0lÞk¼I@ÈQ⬌_÷Ú>T5)öFŸé¡ÓQ—ÞeÌMÀ#ŒŠü£Ùöë…Š¿‡Ôðêñ×iŽüL{ U%/u1…l7"_ýn nñ™ý(araO±Éìš»_¼Ô¦o!´ö˜Ë`ßH™ÒúãÂ5^õ“ÈIÉÿ²-Çß /'yºVÓ|ÔÀ¯Ý™âwsà}ELr®&h 2ĸ>ƒ‰l˜Ÿ™+bGÂŒ¾ñHå¿›Ö™¹ˆïN‡rÄ5 UК ðé+Ì)SŸðƪ‚ÉÌ1B픡“èøß;eßrfòHâ¯AŠgèK*ožótºÞ’”uVR0¢È¼ ãÿaìÀl]ÞRÓ}DtKÀfËÂäØM™gó’¢Ùbлç‹Ðí–7vœÍg¦ÂÈ—ÄkÆß˜Ø›¨\QKæ»ìüÃúpà;”/Œá”àÏ¡´‹.|Þ6«õ9Çm+€h÷^¼ÿÚNni½êvæë– $‡Df5B—µRêtbbJT¡â^<žâð{µÆ╞°Ý 3v:íã@~D"pŽVͽebœ7´nÞ2Õ}¹¶˜ÓœwšÑ:u¡S,V‚,š(n/Œ‡&Ypýï"{¾4qlÚä›]ú8ã_»ÉÎ4î¼%§£NÎFißDQ[3Rt°‰¯D|îD:é±…zF •¥sË(¯žˆÝ ¦é?·  Îí ap¨B(\>RWV9pEìW*=¿‹êQûøíôT1Cn<W· ÷ððõ‘ú´È¼÷$ùöÀZU{¿»Uurâ…kiÎráÏïk×&s¹vó;š’ε”óiÁ¥©ô“zyN˜ÛÜ áûŸ2î.¢rAo–R6èBhÆ{þ…JǃƒBüo{tÒ‚A›yœ9™xñÆ K¢»äôSS… i C¬<šÁšsà3La?å狆V™ãõôøÜRQ—?6À`d†“eBs‰ TrxªágV“f6„4-–Íeðéq‚?V½¤9ÄâcBÜ4]E»º^:¼Rz Ñ?› Åx±0ò¤nÅÑÙ’WïQeÚÆ¾7ð,R­ðÿð C -ÏŽÔô,ù©øÞ]ýu}75óÅm%ìÒ1bݜ⤟“†nbêØÒYç%çæ’ô9Ë-‡ŽFqdœ½Ý/Ð}Ô‹|×øVóü«ç÷žžì¡?äš°Z }5e9†ïüF3.ûû'£lè›Råîs3ç‚Q[ñå•`à'Ê®e0"u ê>ª}§R'¼ˆ£jl]æŸ&Ú``ŽS:L*i€ëO+/1X‹«m ÎÊî}#žìõ¦ÛV…`’ MiФ§¾f…l¶H‰§÷’œæžV×Ì8U8ï«ßEY*þ6EñŠ‘ç8œgÆË‘´ Ó[ÂêΎϧ J« ÒÙ• JÜò5R†ÃïXQÂ!7’83¹4;¢f‰QCFakØneŠB\°'H!›U–|aý‡3 ݵÁ‡u}u³rÔÊ c]ž"p©†Ë(µ?ÀHÓèzV”ñ R¯?&m`*‚Hõüc Šm À6ò'Z&àµ~WÙæPÜ}ÁŒ $¤­´ixX’x·`ˆW*?Ç0¶e ÊD>J wŽw=Ÿðx© ýkê3¸š¢ø]Á¾qT"ûôLÅÛÁ]k9²*>þñýdzþËÁhî!SûV@¼Í$—ÍÊ ªeVtðÊ·óÒ”=”¼)ìí÷ï”sOßôï!èrçè <²âlNˆz”äP+?1oÔsj¢:=þ˜'èy’‰×Õ‘{2E¤U:æZ§)vÌéW‡wãÈa«Pbјñë'›b *írœõ{*bÑ%â‰çŽ,<ÑãZIÃÃÅuu5 Œ¹ùq&£ Y–Î ²¸£Ìõdr¡€Æ!Ù, l—‘ãrð{ìÎÌÙâÖFÊ/áçãÀáåê×ÈåÖÈ–[Á-frèQ¥HOq…Vp3ODØ2yKÃß0 U—Aù̱͡õ½•¯WŸ Ì -ÚZÇ¿WÃ`ývèøMi‚7´M¥$ø&M3ïV~º)²‡o"æ{¸?îuyŒm—i¦µGQÔ(a1ª4ðJƒ‚ùHNÃ…aÔ·‹~¬Þ„%€­8–Åš×¹jäŽÉ9UüZgºŽô徚,úÌ7Åçlš¡ô™òfÖéx1U+Aߪ«œøqQܼ/5> šÑÝDÉñDhŒM`%í`—7¹.O_ï^ÚHõbÆ|¯8¾°®+x†I(Qô?Tl¶s½×l€º+LªQÂp©š¹Î5ó•“œ¶~D¸Ý:9ÎQd÷|BÙ&vò´+Õ é©–¿TT«F$Æm(8ïKPYžEÂ8lÓVéåÄâ E¿¶õ¡ß A†Ç(ý¼VG m“×=‘F2ÔU"Þ§XÄa÷K[Î?äèµn÷îQ÷Ò¤€0…RaüzÔPFŸØÏ Dá}ÃãqõÏHßrË$…â‰Z›“•¢ áCx·?ï%•>˜ÁýJé”úñÏ]?¾{ÂGc@[NEå¯sì?¬&S$›îÛózaš£ $®…úí€FòÂPZžTx–¤šªà<²xöÉÃÙÑë©ÎSz›Aø&Òd Û4.Ç”ÀN­´{ÃShÈÓä.EeéF´Ãéy´ÕÒ$ –Ñl”cèÖpy°K>]·Û\‚oFD¯ŒÂ‹Euî;ß©8Ù¶ 7,Y¸"MÃÖuÅ[ vo¥WÕ‡Hê^£†„Vgù½MÃÝ'ÛZ¢W\9Sœ*¢–zp…™JžŸ($jà!XðCߥ CRà>0‰.Â`Í\‡Ÿ¦¿5ü(µР-(‡c*ä£Í[ɺ" %ŠO C¤Ùo(#· 0ñ[3œvd¯=™ðíh$™*› æM/é™Õ¯L¡˜C›ÁÁlÍEÕž_Þ,Iý¦‚:UvŸyÎv{êÒi¼Û‚µbÚj["x¸MT'Ær¬ã#MZ¿1¡U²ZÔ$‚Md*È îÂ|Iâ3ÝšSH1¦ZDcyq@Õ·1¹¥ú ÞP•'w÷‹D¹m ç‹ç¢¦¢C’³1»Ì;o¬†ºÂfLm¾tVY,öNP=+R÷ìèY–¬cQÔ®Œú®ñ¶€÷ÝXç˜2]؇Â9!;éñ cªbž›îWóñ?5µÝqЍ*Ü”Á—Ê䩤Â,4h¥_ØŸÑcãÚ„u•"ïÏíD”¨’ë'öAGË{Ëâ‹3çWÝvÉáò™<Ò<ƒK‡ r2ù$Ì!Y¸,ˆxmzD_dt>M(O>…ýEšVn³8æaEë¢c÷!1ÍZ!öN /-æÅéõ%S©ùVE'lðOhûlã¢ÉÇ—2Ò¤¿vˆŠÇº¤§H­âí3j0|g?XÁň5‹¾y~ÇP´Û¬ƒ¥ âi}8jJ8ŸVI‡”ÎJxˆ«¡á¡'õ¹É÷ѪS« åHr\ÍÎ<¹!DGqËæ× †ê +F÷Zt”ýèí×ZÏbÈ.\ËóûG¼z­]$:5Ñä×–7<»<³°˜¯ªò“~®i·qMOœ»™ƒÄ|kñ»oÛ;³m£  5Nb$Ùwjq£Äè´+Þ$8¹kG§è­)$ܳÁF²üjÖð¸‚A(7’Hn™VD¡ö8¯É?y=rë7á™(â3@¨be\džïöœ~hÁX³|Ü—fYAUŒÞñCgI J7ÃåÐ.¶çZ”¹p¹ôޔ逆ÌݱhFþ»Ì¥0«×½%W5ŒÓCŸûžz•Þõ/U²íz…›¿*9N&]\x:FãËÀpú¼8Ž&½‰GxR8ú ’®D ¶‘iHÛ{|HX°X¿Å•ӢífP +é6Žþ8¹ˆÚ´kð1¤¬d¯ï>¿жJï)¡MXÔVÂÃ1RiÇþÈÇjaÝf®ÌÏ0ñ A “é.%Ê9ússПB.Erâ•´ë`|\øµ«Åù¬{£„Ĩ°SCrV÷ÌÒfæØø§7ªpÌ"+N ÞØtæãUQqzé.ˆþJYuî °·/4)ª§¬‘ÝA2ødÏÓ] KšOþ±¾È)à _",^Ú5ça®ífdÊÀWBæ9 ýÛ£ØOâlé­_õrÉ#<ë)²Y\¥¥Ö¿•Ÿc²Žmw†‘ø^®ˆõ»D &„$ÓÑnBÂ`L=‹²9®ÏcZ&ƒ«V;x›VîIì?26 M‰À+‰÷J „º;ÍöZYÄö®ÈÚ}ÁŒ­¤œÃ¨nx/Ûξ„V„`=¿Éz:ò½h•cs^ò5†|"5I ™Z–„ÔÀ¿öq;î=hfGݶ±PZv /‹í>2uÎDzïp&k”ÞÒ?¿úŠÜ›hˆnŒ:Øv‰¹c0T|¸O>Š/!÷Þ…nj£ŠY¡˜<®t“cÞAÐÂʼJ§>e›G ÜÎ?±ÅáàÀM’£Ü‚"9XüÕóydK[žÿ´ÑkuN¥?-ñZ7å+AúsMûâ?«ÚP\d58nµ ØK Ò›á`f;ê‡Þ«ñDìKA ø\I¤ÔåâÌlÿD6, »pÌ)û6²$ÅQr‘4´äªv+0‰ÇÖ¿ÉJª$)7ƒ/‰ÒÙoë˜ uíq«âšnèIãÇÆ—cÞ¢Üêt`Íàé?^Çh«¿ø2¶åø®Ñ“µåc‚¾Uq©Àe¶¿l;ûN#öd‡¡±U¤'¢HhèÜ9Ol… ‚{‚ÆÎÎ[¤AøžýM\­Ý=OCµÂF´ÛôV A{(q=pÅyÇŸûк GW˶¦ê½)bªÁÂAR¨áui5{Ò’ƒÁ²hi;{ê â“*d/_k^^ö=žbËacÓƒ?@ê¶a ܰëÚñòkÕOøÑ}´%*AÛjIM¤sTýZõ­å—Ê7NW%U‰«…½ÍþH;Rq‰†PLÑPsáÕ»äиÖj#kŸ£÷öpó5%½ Ì £X3yÅ ±4*æ MQm¢ ¨ÿe¾Â÷cý¼(ºX?ße}"„ÔmøµL@ØÌ'u,5~+Ï]œ6wáut—Á1C¶]ƒGºz˜Ð•§ kƒ¤njHég52?ݶÆ,üƒT…¬~Þ!^†³ X*4 [ܽ†J”ˆ]¤f‚éPå°Íã¢ÎaóTFømÂ1§§kâ)Ÿ¢·;—ƒ¸àE$L‰ДA‡šºÏ9‹ y¯¿¾¡UN ðÂIþÅmý˜EóQÅ÷Û“«û¨rJÙÇÁ!ÝðŒWÊ\Ò–ƒPˆ•*CS±wˆÐY„*ö70]Aú rl òT¨¦|»Æ-^ðH7·}x—ŽO©Áaõþ8C”`iŽOÄ«­ P]ï5§}BâGŸOoO+Ïí"ãõs¸2×â~E½Üåå­:<Ò¢w/sqÙ[¡¼,C‘Olô,É2¢ä'ƒÇå`<5býa+KÍ#9!n‹yøÀs[LÎÁX˜<…º) v·d+ܧ§Ã« ¡jNÈ?ÇxGcª©7Ž–˜aE/¸ÀÍmÑÜ25w æÓs+¥“4åfHhìQ¼^«ñÁåOÁKÓœ’ ä§“ÈpCüúu( Ù랤hæ2ùÉ×ó±ñ-»•h’JòyÄ9ùŒf–¿*énª¸Zè]–4£'ã€Ë…F>Óbm¯š¨>­Ÿ_0/Ä.ú¶¾!Ÿ*..àɲ&ÜJª[oÏVïáÍxpø·>{ã¡}2KIá¿´ äÛ·ÆÄ¥G\åõÔ_ V¥ç<¸@Íå+Ñz áÂÞ`éÓ|Àë]Kåƒ¥Ùæ•³ ’-‘ʬø71íSµ«™a=*xåsÛËA"¼rTÞa«ïZÚqï·:äñ”.‘¶ú`÷,'öƒê¾çæÁ^•,ÒV@‡ñ¯Ð i6WW½ö³&ÜqÊ­ ST^åòBÏù¶U:5E%hÑmŸXðftÈ;ÖŠrv7|ò*FlÞí òBønUµêy¨Áé2¬ÈâúÁ”•¯™×Ë’Ê€­ýˆÏ$.msª} ƒ07VmÂy§¹¥½ ôKÆwÐPÝluðN[¦RnI™TH²,ki|Ê^ù TÙj25œ\ðb ›8֛ȡóßÐ(KP´Æ’Ì™®‹¼@ÎÙ(ò¢\ÕY~s†¸[Ôp$cG.‡]kèùRïH™B°'Щy©©S¥º39­ÙeÄ_Å™º¢Áw€4;=ƒg Ç½˜¢¦-t_õ0z=Ø « +Uw›éÔC©´‡ÞÉô.6®“ØZ÷ä0YK|'–âÇdÖ_CKA|âŒdž´#QšM/µ3/išüY„î]‰½&ìFe¸Åý#ýO?ú $¡PIâX~^ömñª¢Sý‰P!ÓÆ§ùÔ˜!Ø)ê¸ÿñ¥Úd•—y6Vä—?¥aÍÍ®i}{½Å,ÅO(þ‹| ÅUHÑ¢4ìSœ“®Ã™E(-®47#±v–Œ)X庇þÊzí\¿Ax…WácåéÕð¡öü`W¡àTÕæµ’ÙmXÍGF½PÆ(÷Bž%0qWuW ð êöÜðâí\¾O œvD¾ßÁUN–Þsì]Vo±÷¿óJ óÜ š LŽ… `½zMï¹Ø܃ÄÓìn¢aÖñJ±?%›}]ñÖ­*a¦†ô¡íä(§ [0›ïЪ)ã`S$ÞÖËdáî`2ßµã%=$ShŠOæÀâó}Ã"R%Ѷh³øÝœL)œu ÐõÌ›u̹ÉCé³A{µ»ŒØÀµ™õè½`—4WÍßÏ¿}–4 ÛâäóÆ÷µsÚ¿iÍÚg ãtÚ “|s[çES•˜¸´hÔ*9~W‘¢ÇJîÝgƒP¢Â¢iê T>R‹í´zó™ZëÆ¨63ɺY¥ú¤¸³_KÝè1ùß\ȽÝü§Ëä~`ÿ§µ¯^Oa¾‰N!5׃ô´ÅEh,Çþ«Ãæ_u¹ i°üu²»aÑXH,õŽ æj=z.ò%=Ù!Zz3¼nXb~åûÆ»·<ß"IHØÉ¥+ùð‘ RIÄå%I±Å.IÀkR ,4>½AÍ"7‡QK¹o`\‰íQãOØ A¼ ¾Êôôæ Š„Ú\Ù€.æ“l÷•¯«{ÏŸ¢¸_ #Ò=Z ãáé`Ò,”ç„ÐÁ™ÍèbØnßîã$=î^š°ŒÓ¯  ox¤¯•žîÑ9$7ÝÑãb=ƒÛf„–Àªa|ÁŠ×¨5,Û¡¼¼w±˜xÓ£T ü}× H’𭏧Žì^Ô|ùö }hеÎL‚—iT²t n)Ü`$QM˜`5T;7]{IˆÒS¢‘./ÖDZb•<åî^Øåly˜¶>Dɾ·y"Ÿ2’9ËÚ[ؼöÐ\$GÈ?F‡B7­µ–~åíÍxK °Læ2WÅÉ¥`xd|ª2xˆ2Ñ¥ÚÊxÄPøJšÄU‰» ³ÀóÖâä*+ר¨ŒW:LS”PëhN‹Zt5ª' Ò)¿jlº°ÕÕí ZÀ«¼³t6”C¨¸`4ºï½ãêZ*îÛò’MÐΛ¸ôÿ9-â÷K¦” q2!~!BŸ[üƒ‹Èç•]ßOÀgí16+šøË8 <¦¡äøgå[©:'zA‘ôaLåæ[Mvˆ$Bˆ ÎÁ—ðhg‹D‚8ø½ÇsÑÜÜ´s5ÖU 78–.šÖ€÷ü\Eô3úùÒ‘‚—’p¼|¢JbÄdÍ£=u˜:”SºC…•¹¦¹°Z\îx•ö½†R†©4µ&ˆ&Á£™ÆdŽzîc>ef@t²÷ÈD†È9· ¯M×µÃ_î³ï!üHޤ‚©gÄÊôâëÆ–f ~,ƒðîÝþ¡ã„Ãò„m˜kçÛXVÂID^™SOgJÁÚ YZƒö›hܪcöçu¸¹žxãü–%ÌøzbÃv¹íO½üm·‘ Ywúétw¯©í’Ì–¡\Ö##öJ=+øÇ§ámzìýŽåóÖ¥‘ieû{ÞŸlžÉ5⪨¬ÒR±¸ûNÜoÖFöàg6oçêc¨!`^kIpòÔ×ts”…Ì?›3ms±ÄG—¦£‹¨ÎeIü^3aØq,ø"¼ƒ9’ð ó !ÒT.îh°O„'˜5’rpâÉ+ çÜW„Ò®â_åB¼Y$Ó/–4•ä~üÈŒÞxAØ¿Àô£=.ˆQñ”yÙÅ øNI ‰ø<ý]sdråúpAÊ-Û“S™×l/Ê–Ëraƒ)!ÌH¥{KÀ×¥^Lzb‡p2†Óó™ˆS@__ÍoSnŠ…“ÕH¿¥énÃrÃrøs·ˆÄ~³é»ÿ­¹´)Ƀ 5@~¤Óí½$«,´ì1y³T®<ÓaûùÂ?T^µU âöÑ{½ð§nQ/–!óÇèsBf|Føï•/™â‰Í=š'˜€ub tƒ§ß—R›0ƒá{DÝ”m:í H¡‹§6˜h‹ú,Í)(ò"z†ÑHC?Ö>y>ëºÒ—çFW¯qOS^1a@N9ˆ_`ïÞñT£˜"5…ˆ˜ÃZn(½°t¡½…È$ãa¸`‚îZ¸˜H'ò[Pª}8åÅMÌ߆^( 9,Á™—¿µA¼å×-KÉˢɄšÞ¸²ù±L˪Ô2ŒF¬=E0»­¡Uûe_ù‰ðÓÍGs>†L’i#Q¿ˆ’£­p¦|BØfsb’ô¯1¥ PBgöý¤\à%Ö Q)¾Ü}€»7ÉýµˆT¸Çó·|zpãW'N†ðÀ”êòë v[© ñ”ÃÆ‡ßTØÊÙm•8¥ô¾K»¬y˜ò€£.ÎÓ¶£r³%†E¥4Qoé†mÿlŠWs=qx‚#ªÒϵœê¹ TzË…Œ¯›à˜_94Äû«æÄžAËTýURùûíÚîhÿ÷¥Äi ~£dѽ¤À:ýVB¥d–¢œ¬Tc£ã°j´¯†c5­‹¸ᦴ²sÚs9æn‹ecò¸dœÏ-„\•¡2„¸ÇÈÚCœtö+3Óü¤MššÎ(UÞRS`ßá:if•ä^EÁÀ¡ åÀ)®Å4±ˆk®AF¼Ì«@8 ‰åzpʯÑË…GèSΞ}¼;¸["{éÇMrfµ)Ü¡LCÂnžOèò·ås ï¹l¦ÚgÓcn’ãi™ý%Qþ VÂc¸ðÔlªEÙò  ë÷ ƒþh]æõ‰e´P ¬Jd¶§IÎ$«FØAçJ? T¯¨Û£êæCPˆWÕUÔgZ¡N†ö‡çyó›‡Äb83 èìûʤúi â{¬Ê¬^Ž`oÜ“½²ûo·ÓÄ ´”Ò4Æ-­¹ñ´P¾µ¡õ»õJjTÂ,:Œä ¥¿DñÂjP ¾µN”üjsè8uL—ú—¦[SWQÕ;ìµxèzw«@âf•í‘KéZç}ž+•‰’-92ºš¿ÒÊÔ¥ÁÍÇ/áa*ø:êÞNj˦¦0Í¥‚³ßD;èd×å×—¯†àr•ÂÆrŸuÝk3>‘ªX–38nóû¦_g"Ì?æD|ÞÃëMê†+(G¨`Ϲ§;ÅBˆV~ ßa.ø~ê\ßPXKµ¿°Ã7IOÌã®é«ûø•?Ðôd­LÄ}·®ÙUÎèÓshº{ˆ^­X8.}ZUò†ÑABjrý»Õ|*ÚoÓB¦;)îpӉϛ‡ÚL n– »»‘¥¨½ø›ØÁ·3 'ÎT]g5 ºÍ<¸|oÖB• ’ƒ]X£)Ã/ѵÊäcþÒÿu·0RçdJ/œ\FuÕÅÊ‘2“ µqÕrÔÄçѧ‚6„×oƒK);< Rgòׇ|F¯u~ôÜÑF§,ϲ…{”: ’||¯é¬›»Ã OtÕr­ð«cõZzyôoûñÄóŽ´Ä¢"ÄxiQ; ò½e&Í"EÝ)²—pWÒúF„¥°xìb7‰Õm;A¼“Ÿ2 9ÿÛäó¶ÄÚW)³<"«nbóþ!2a”Ë›º@…ñ­¸"œSâö{sÕ¸MÔ]§t‹Måï¤Kécö¯¹&,5.‹zYKGÊ+.j3#“OŠªÂ0yy·}#ÄâÇ}P^Qİ SbÁÖBkòLºk6éŽîÏܸ.—åæð1ªìPÃŒ ÖÙT¸¼Q—…Ͷ¼šõx4ÿÙøß–ºÝRi-Pï¾WÒ| Öy¤BÒMDzŸà/­\n-Hë×ðèÆ]xKyTÁɪ¥Ê¬/”DçQÞ— ˜Õ©½Üäñ>G¬zÅwø-pBbÛd 6írAŽäL·¡2žkødu±§ûeGv»!2Ä\zGÇ#kdÒÇ­…ßCxW*tÇ;wÛ£±Ot'y¼É!§òÚ?’> stream xÚl»c”(Ͷ-X¶mk—mÛ¶mÛ¶mÛ¶mÛ»lÛÕß9çûúöè‘V,Œ˜kÆÊˆÈÈLRBQ;[ge{ZzN%QeezvzzzZ&(RR!Gg ;[agN5c%{FFzz(R!;{G 3sg £?ÿV¨Z[ØX8¨ÚYÛ¹Z™p»ººò»:¹Ð:ºðÒþ¤dbBàlnB`jamB $'¯!!+F@!&«B fbkâh`M ïbhmaD madbëdò‡ÀÔΑÀú? #;[c‹ar¢ý7[WG瀙:ÚÙȈ( ˆÊÉ*ˆÑ) ØH‹ÿnëìÄù·‰‘³ó¿²£&pþÉÚà$Ãÿ‘þÇêèþ‰ŠÀØÂÈ™ÀÐÄÌŠî_¼IØšÚ°þGmìbÿ_Ó?€œþÁG@ñ‡ŒMLÿñv±¶–5°1! ²³±wq6q$±36q´%ø÷nŽÿhþëj`caíñÿëü<$œ þ!CÀÖìúèÿ£²pµp71–·pþ‡ogG“ÿ¨ÕLþ362&Æ.6ÿ 7ù‡“FÕØÎÖÚãÿôøO*ÿîNY]ZS]†êŠàßf[#;c [3%çø4p4þÅ¿Íòÿ© ÿbùoE0üß¶Œ³£…;=í¿J„þ_×%ÿë%(hçîEÃÈÀD@ÃÄÂAÀÀÄÁBÀÎÂàó¿à¹8:šØ:ÿ›ôrùoûßÅdbânbµ±jgÄl™ÖZá+R4_ J5?«¯BµÊ¸6Ó{«…h1ln¬wtõ Œ•ïƒ;`ȳwõWâ¡…È Îædj:š0\gë­„¸ÒÌ·vçC¡à½!\÷DÓÆHä6âÞ9cs#Pžrš9+÷¢VÒ¡ŒQŒ!Z¿¼sa7~}éÉVì9R¦æŒÉU ¼yHá!ßÛþPX~ÐÌ-)¦žyaE€ýQ˜"ïzÒ/®D)_#‘šÀÍTq[j ö:¼¢×ÕÝCrmè¦L4|ì5cuÿ[Fa­ˆuº7W_ψyg'_‹%S–'“·ŽG*‚FYþü;•¶Iï]SZõx4ÞfÜhé/ zßݪ‚ W‘ÂeãÁø©Ódž90È ñ )¶á‡„nc.¼‹–¶â‹Þ†‚€#å­Dt „J;åºË­éì›(Ã}[å^ž §yÿ ™ÝŸCQB@µ_ê'à¤g=¶˜e²Áðh;…šÔ˜µ}‚mî‘x¼æÇwÒ(ÈÓ¼1b¾ísy­o>ŸIÛ¾|˜ÝäÞ å·¶æ Dħ/ƒv+2LÌeô»k¶{ ïIuÔOÑꀤ+g„¨ éÇØêHð;ž·½­³eU•àȉǿ5Ò÷·ŸËÎâf»lÝç)û˜mº<Û5XÒ¬©qëþ6å4˜Ò Eøö5•7\w@-ÉoiÔÐBÂ_Á(ÉœCW=c¹heÆòµK{Ä!ýƒà*HT@¢{Å=!]¥£ñwêÄ7ƫ̴?ÓÓÆ×†ÌÆHL$»á_8UnnUÇ‹˜2ÇòM-é6mÕ—@Z]æ:Â…p @œ«Tˈ^µ‡Q¦àØ` gâH ž'Ì/ŠÜ¯­¬¢„ÓÖFõÜì›Q¾£”C¥d5øÜhUzøÕ*¥+üƒô¥_-lã ^¸íÄZÃ#è;ª£ð¥Ý•Þy›¡r{×\³]@piOjèHÚ º2ŒÊrlu©ÞÀ3—ž‹ãÁ®‡÷ÍÂG´hT~8Iò1°ò½”›uò@Uÿv=ÕŽ…SyÂ8b´iGw›½åP“ ”îÙXþF- ¾½‘ó”ZÁÊC¢´8…ì¤4“JY¼`å„à–KÆOÐ 9Õ¿ƒÁ,Wh|ê’O<Ô!Ÿe`gZqáÅ·ý°¹‡‡$BÞ€ý–À–‡cC¶ I‰BúéwÂ@š€ÆôrÌraÕþbÕVäk´0Bú­"²¢ûë“–v…ûí±þ¤Ð÷ýÑóµ7uà:‘!IjÒàºÑá·‚ u„Ê+ý× ¥±øÆÚiy]>ê°œ¡¼٬Ïç^”ÿ§xó+´¸Þm0ôGóŠƒü½S¾Y1åÂýS¥_So`;ÑŸg4b(¾¿ò ì×É ˜!—€Jííò÷MÈÓÝŽž>S‘+½‡†¥@%»xhˆFŠm>àb¼Z‹ù¡€¹_qâfl“ÞáeélúV7n™,zàƒ÷7¯]b½8YÄÞ/P\C‘oÝ/Òj¡šŸÌê±$5rÏp $´DÜŽy×)×.e÷mY)Éœ¼ åo=D,0ªów­»o¬”ŽQ;ñàêyþMFü5¼"\c58¯ÑNvÂÝ46ݦy4ô{®}$«yHaDÆêQ!~g|_מïïõà·_LáL˜C‡­·'ƒl/å_š,Þà€ÄFÌ ©ºËÜ«¢ëKŒÙ“KnwNTC–žk[1èBî¼VQ(ðïÇñæ1Öƒëôk3ÿá´"ù!Ì5úúHâÎK¢§’HY]œNa}:ô¦Df|\‹™   LÑŽý– å| 4< ì Y ¯ôDB•‘ƒ©Ç…d¢f™k±–”AÐpší +À ö™"+©Ã2xázgKm´uµ›sYÝ4a~“ê41ëßg˜å]“Cˆ ¥€™;•´†s Ñî­ß-¢;E$œu ù. §Ñ—ªgárqö›L(Û£`Wxð7©‘:êp@1”Š5]ÍÉl@.‡8S ¤t…=Üq<]”ÞÄxajUfïuGN%¥W;zÅ@#µ’vj‡Å`È!.ä~1ã?¢û§¸ áž³¢4]~*ì=!ýü±%βŽ0‰±E¯r¶º®¢DÌ ‘8‚¢]°Ê¥ÄMãBªŽÇ¹ç¤ÜYh°DêU¨¡s_† VïÌY±E'°q˃³ ÚgD}&ï€/Ä4ü¦)=×Þ þìLÝ#>ŠT¹¿Èÿ%/Á1 ¸ž+1çl·ŠQMpֲʹ³’»ƒðÊŠë²¥Ú¨™`áúàêSá¦9˜ÝäÏ"›qý„"‚¾–ÝP¶õQ^ìöÁŠä=Ì9r@;öñ¢Vò«^ˆÃœÊ&Üþàæ|4âø¶Lz2vbÃÄ¢pâ®èÈ»df‰£Ã9UXM6èñLÅúbóé£ÖLeù+ýÍÕæ'6vHœGc^^%WÅv¶Œ—fJÊÇ[‚§jCó"™Ps_œÐÛW9²bã謠8èïÚùH¬ºfÅS¸R75®¦A»}·XíF]æRI8¦~æNáv®ž“Y8lʤƒN[{=X.ÚÕZæCž|7ãf¥Ñþ‰$HûV| ]µ Ç‘ý.‘ïY¸EÁâ˜xûÓ ¶¹Xç9¹Ö=`<©Ò‡™J³5)|¿¯ˆä¹ú—™@ÎW?>±ÞF¡ç>¯(-“N é ]G 忆&êý![–È¿)eâR3Ýú•;–h—jæËAz~, ÔÆ½ ?Ø¢çúJ³äA†L+W(HXœOÚ[Îàsôåþù-ã>×ÞßúÜäšø®·/µ=±HIF÷ô›iùwBwqwü “÷l9¼îeiÒiCs³Go[«~ýØDœ5S„å’oÔϼý÷äåï0¯ˆ ižS,¼d´ua¯ü‹{(îáø¦»˜Ñh‰øÕgiâÜœ­cR7µ6rÞ”þ©iÊïZ˜é首'ºoM°³`&ÂÀw]rN/vÎã]_ F.º¤éèö"^¡÷QýMg´¢ »s Qd ˆëËÈðäOɲ÷×JtHÞ‰«œ3&듼zýÀk}u.v¶>øVêTÊ"ÈQÁt:Ms*è Ÿöçý1ÐÛôöK5kp’Ab™(¢ËDñ/ÔŸJãUœ¡âÏñ*ý¤Úþçé&6ý€ç"Æ |CxdTn Rô«PM±œ‹7S­„ú×]àYPËš‘Üâ‘’>”!`çŽ`¤¯´Q «¯\–K.½H´xÖêH«•œÞ}•̨^rCr±Ð–wY¼O¡óO$Í)hºt¢ô‡½Q¤&\äÅõåµ#™|ãm­]á-E±7„eî’VÈ‚Tº¯ðí› ¼]Oß6Q ”VJNiÉ$Ï €G¯?}wùœ#-43Û:VM¯c1^âAìT§æÇ\ã}Cˆ*aàÇ··þ ¾ù‡.»¨UÜÕ‘¯$f¨D /ïðf¿vk#GRïfŸ–¡:=z·?L >.|!ìÀ‡Ù~ ª=d¡?¬X^ÞTqÜ©TŽ(~ÑL‘es²VØ8«“¶O47Ž¢*ѰJ‚Z!­Tó¹…£ßIÎkÓGh ƒ•8‹<ÙаČª÷«/r6´TC@Ã]ñÃÜäÇ–r(¥n1¦ Ä"—ùRÀ±’šBKzãËðÎýߥaô¼Ç¶õƒ[öV¿Ñ¨ ÉmÅ·_ÀÅl;Ðzð9ª™¹5ó4§Èˆçgšš¼êò_ºª*.¼oÉ8ÝP˜gEÌq¹\Ñ'Üïqî'dz%Îmß ^›¡J2̱ECã$Ìr%q­Äœå7GrÅvíuj™=¿%¶ú<×õ æ"ÂÁÇ£rÒ˜uÜÞžÍC ±‡Þß"tL0®ÍXë1ïÏ£zó‘UµH ~¸ó½([¿é‰ôu«@:ç7TÃcÀ’£BârÔâÝéO`ád|´uÜ.nÊãXS¯°·{*ÒQÛPRº1t§ƒ&Puòtüì…QìÒ„/)%Î?àÕÜ’‚‹“1¯y0«A:¦ÕüpI^žŸ©#ÊÇl‚'ä ³‚&Çgƒ÷å2hüË·ê1L˜Œ©m"nlãh6è<ƒE™¢-â‚ÂWÛP{ã^“xŠòî!kLi¬QC¡š“…DªýÁnŠXZzsáYJ°[•z"Õ©vh·|³*Š`©º˜á÷´R«û?r¯-³vÅ™,÷ K¡`å$À ¡u’o=‘ñÜAûŽ`}®²Z¤Ñ®v8X™;Ü»0N¹Dù~üÌÚ:DMã­äQf«x“í,Àõ%%Rô\Ñ"@¾y×Ï(žåš@æè2Zμ2†f@8ʺ) ûÙ?^C«-Ó….°_x{–”b‡c~oœ1Ào¢ùR'H¥¢îq)Š-Ö^ʆð…1Aï‰ÁÈ-’L îü>ÿÒÐÉð@BVàĽi`Zôâ³·>ˆuÔÃOìpó{ú¤">õq½ű'd7ôå(ÇG|¹‹Aó^Z*ûž¨)ÒÃ}w¤úç%K5‘ùáL_§ið§ ˜ÛHûó”"6Íò[HžþëÎŽ^ QÀ\;*â’½©HåpÅÔìHEgM=þàQÒ׬d$‚åÎÂC8+FnÁan‚Šé*ɺ¥A:Û×çÝžã > 2Aÿ [Çú'-]¾z#’T´.Éú¬Ó,ÖzA±WØÂä} Ü¾½Àò/Iâuõ’õ§µö%ao–õt¨ôSÒÖ×®íBÐ’jd0öÇ>­k(‡ÄðR  ©¼¸‡PN7ãøÌê;D¾†spý±=pæt]E§Ú×÷¼wªšû›Bði©Eö~ÄÝÐ4yOõÇ88[hܼ F…ztPb&57*B÷jøOQõ6`±G5¨öO")ñ¸‡"²TI2~<ǵÜC^†nðlËùAÀÐx‡^gVÉD{„ãºàA‘Z~ õÇÙÖ¬¨ò7éí”Zë\®Ëî µÚNíÛ­†ñ¡ë‡ p’^:ý–‘§šòµ$ ï»s[rðÁ€±$"ÕY´wjjÇvC-§ƒ½7Ý oœ”`­…ˆÌ²¯‹º¿«Ó¹G#ˤ ™u‘ã­ÚüÔš÷Á¥‰eY)>ï®FÌæûˆV8Œ×yŸ‡q¸õü-ºßÿD¶TÈ@†æTÔ«òÓ¶»†v6eôÉšË_™…ki_™vœçCDRsT? uA!PÇ·XC;É/ô“'ðá¢XýaãÁš¶8Ouò&þržÀd£5ê@xúEbÌ •Χ£­½Œ•Ÿ¸9ú ÿ|Ü8Ö¢å<¬Ç‡¸MüÓ/#mKô’/@öëæL»=dcfˆ›âûo” cÚÕ~Y«ºWh„çùbÛ¢ú»¥JÏ0g3.t€CåÛãàþ”†™Ãƒ}g¦Ãkôx’Õ± â³x<ó§Á¥¿ bÀ©\Ù˜]©§SÎîZP~PLÔÙ`‘¬|rgÞ›S˜&y´P>5°=©¸ðàÚÑê+Ǩ-‡9býª¡5À_ 4×µ*ŠäN\QHnG¯ð0Ý_>È »¤þøÓýK¿²ô«%™óf t+“š\áCº¡¦aöÛ†fׂFùtMÍ^Åí^÷ÎŒôË&¨ Š"¨³agà?û]±ŒK‘E×ã”e!1,‘!ނĩ¿â'F @VwxfÌõ$nÑ’B‡Xj¿e‘c±—_æ•ýµw ©žf^?gbåÏPMüFÇpZçÖÏ#­S^QsÔ¥ƒGA·œSuê%„F’ 'ã鞯}[‡<N L¨Šê¨it€W'ÄKŠÆj  õºk¤ îl0SIJX¤G¤HGLvHÕ×+¤a&]Y)Gži[㈠sNB¦ý1¿ƒHöeÚíÈ-á ›ò‘yƒÐ"èÆ°ªˆµ_¯ ú„.N4Š•­()æIÞb¼¥½ ÛÊms}O·¶ñf¢>“GÜâ2`€Ùƒ"D9Øãø'ü|g“ôü•´y #«­¢PIRH±¶`¸túIµÀKLöL~­”œˆ¨Á¶ð‚³ŒéwAù’æmLüEàÁ¢Þ©¥ 6¦ûÏnò»ÈÒ–èrvó\ÔÎè°|BKª ?1ª•<Cžžë¯QcÖ DJ¼»ó†µâëtwîõ54‰8à'õ¿ìñ±Å{ƒéj)^6Ÿ€ÿ¬i˜E¤Ÿá>?ÊA•‰½æ³c¹(l³Ú¹~üËE¶³Ò!V3šÖ%Lßä¯Í^.²lÖžêy7§S†é ïéÑ´Þ8’œØ ¬!<|ÚòW÷·ÂÕµÁ”ÿ\‰ŸJE¦1aP,ÃäÚ6¸ïrZ‰ l¡‹ämß»:Ð/=<ÈÞÐdH©im<¬–ŠÛFõD 1mï%¡fJ­o¹´»êçKq •Tc™\áGƒ^“0òÌØ–sH r²äYÌX:õð‚¹rq¿ÐÅ`ÄøgFý:ÀoÑ;Ÿk°U‡âéú¿ Ýò˜Ùó°ß`B½`»ÊÊA«äöÎ.¬ñ_[ްa±!Ò'ÁŒ•ªnÒ/õȑ౲TγâGõÓQíSu8ï„S[U|„6µ-å'W Þ‰šÃ»¯lž·öBw5|Œ/^™ú0ÙäÙ‰Š˜=ÀûÆHÔ@ýàÑ 0ÍÖל‘û©MÒ•¨õ ¢‘¡úæ~ö7‹Jåª'~3 ¡Tv/Õuºl•d«ÿÁ¾ìˆzæ¤ Ônº¥ô]a—P›š›)Ž ÆR_{ì{g¸ì ØÑPëØ[A3­R·(:ÁÃÚ,Ð ƒõž÷>Tí.¤Ü©G›æ«ãº=gP}àfú-­I²áã¾Ì\5.ñ³×tJÃ[¥;UeUhƒ ª÷h-«FĸG8½ÁÀD:ü2S Ê:† Œd¨&;ní>¶¼Ïo–7ä-„¢7_ØùËÒà›£¸ê ª–`=ÖÇ÷=÷€tÇ|yrÒØ ã.`GwÔЦþ9¬qEhQPyÂöµ7ãP¶²‚×bÖT)ÕÄzÁÅ®%³Èw‡‰…Ý·fu- $WJ¯à»kÚi&=öÃÇ YvI:”›Á $0 8bŒ‡Ñ• ç© ö\iH \†:çèIŒÙ l/—`Òp‹&Q¾<ÿ&t‚¶s%Ƈ pš”~:aŒ|Zûaye9 g:šÊ(èìÞ1Eî6Ú¥›ÉD«ÛþÙ¾‚µ=òQÎ.!ä¯b;}wßýV‰dÃ+ù£µçºb+nìº-¶Ú !‚Úrâ Ÿ€þé}´ÂÌq@ åFFPÀŠ]Ó£°ª²”Ðܦ.}¸ÿ¸mÞq=7ý13³Ö»jmºw.Hþ+32LGÒTÞ¿"„Z_ÄÚ>S .Öë%º ´»œ4¸oøÓ,cï0&ŽHŒìº&/gh)yæ]ZÈÁ´ô¬U!X ÒËïÎ4©pǸ–©™²¶ÆBØH=ª„æ_Ú¹ïã~ð‚8ò0&09½¬Rª/׺£3gÉ’eFµ; ¾-ºnø27€² éÜÆ’åЫZÔœ8Kqž2¼Å£”y}•nʉÃÖòœRMëÉ ¼‘¦gª¿Q¥KuýÅO²:¸¨¾+Óî;«NÑG½›Är¢òƒî`©Af4Ÿ’Éoz¬z½8}wînƒ¶qoOpUž"7r=B–ÎËÉÚF©À¢½n•*).KÄU²ØÓ„*º[/Icè‹%áÖ¸™g·!}6†R4%‡,Û´¡ôóø&ãÄÊ´6×ZÝR™:vFŠKÃ.Nïï§`%Ö8²HC]Ã>ûÏãšt …*Ñ™©l_±ŒrZ¶ö–|âÅ©ámÐDÆQ;ÄæÛ±aœþ¹@µV´¸?äCAi?´ r1 ÒÚ~­yêXÍ)ªZâ5+$|º¶ýéWèF§¦32ûoðÅq˜¬¯†Ú)U{â<M\·ð­ùÑ^&ñ\Q‚,7Ù3˜)e&Í”º‹Ö­#(á&Ò——† \F‹yv˜2ú Ëªß|úèß ÒàጕÁ‡ zNë=ü4œ•Ü‹…rªD9 ¹žˆý+úfˆ—°4=Ò)Ý- Ù:¿Z.:X¼nu厀-b·$n½5/$’DÕ3@úAÈÍVÐ8@Û ©Kp¸S7€Ç¼蟴š1ŽØ6½^^=ð^e}ÃpØnšSNðVq–| OTDƒsI V46ëng|\ô‡Ÿ¬:ÿ”øß{°¶kÿ ïϲEe鯧,4<@²¥jmheÈ=pü?îqu$Oí`2Ízœ WèkÒçò"ÌL™‘oË1F—€íÝsväI5¶ÛžÏ!A!D )ð3#Mø¥ëzÃeÊÜ¡ áë„‹Ãå–ÛîГò©Ó&Geþ´¯ð<åÞ¶ê‹j{Ånl<ûUO«êAfDÞ¬Uª#ÑzY§Ñj&`d*IÄm .¾ý]z”Àˆà_ϱ%Ç7œÑ„zkt¿ž#É?P7&YöŠÚŠÈ½j‡JFé(’ÃÜRû]ñƒ¼ƒmå Š3‚%£éUd‚á?~ô®óù‘òŠÈi¬—ÞH–}!·E,ê)ø]CH¹NtEÝÚþ8Z«<Uì*«×¾³h“1DÌÊp£€&ŠiTü¸º%nÝÊÑ.º³£çâgKOTÔ ½éÑm ÄÙ•nS¾ò7€Éc”ЮÀy7¯Ô!C¾XúÕ8ÆæDÏÑÝ ¨Â¢¸8¤9P!ñòš$/+8Ë×;ðF®€ke4Ø3 ®ªÚ½?m×-¯±ùxMìbþ¿ºô‹‡ªr¦) Ýa•kmA¯¾YpÀ¼ç{/Ϻó·tÏ+Þ}<ª`lÇS ]ºAmƒB]õEñï Æ)waÐ5Û·Z“wÄ9Û7r&?`V6Þx—†@®·Í®Ÿ-‰Yóûí} t$× #ü.Á¶›¡€HqÚ±!l¿ÛBýŽPøPPËÓƒ ŸQæ8ZÝ–Ù2.Ú—é£á>Üæyˆa¡ä¡ê6𘗗ñ~J]óïzö¥oá ´CÄí?òQç]%J+/á(vï¡@½½J÷†O±ºü ˜dÁ´g\Rê¡ï¡ÄNaÓÍþCÐþ&-=òšg‡è&±Á¦ÊF Í?[Ѹû7=)¯ÀüÛðüÇ©å(𨭲ìw¥£×ôNCPß9r;¡hèMÄá Fð ‹(‡Ÿ&.¢Df7ZñÅÓ…¾ræÎíŒí‡Á}µ,yî… . ¤y!ô#ßu °½Îª·¬¤ ôAåM]ì F¶˜S:pRM\CίŸùTÈ>kõnéS¶§„.‹EEdN h½-&:~çÆô:J3á-k×/>+Wˆ’ʶ]«Ù¬ƒpK¢¢Îh´Íí™Æ½vò2Q*ÐÔÒW;9šµMŒäl”© ÆõÏðq•¹Êëx~p\qKÄÜ~ؘ3uá L‹³ ~wÀŠ•&å(ð[úíÁŠ}÷ú<¬–¤±¿‚€­OŒLÛ¶èLKÇAÝ™‰F;˜?;$¾2”ƒø+Ô#3a¼3gB*ÕÖÂ^Þ3ÁÃ9Êæv­¯P‘!'ò{ …‰’–Q† ebÛ ×Ñ©{UtŒDŒNÃZ Ö”FÎ{$šÚÝﵩ’Z~·E{¹QÙHl;Ù~è™å:‘l„â_ÝŽ·N ¤2 ®‡ÏÖ^rö šÿý-Có9ë®Uê˜ÂJŽB[ûZnsr‹^·ãYܧñàÜ©ÊoºÕp.}[›©nQ©:¡–D57––?Má}™kÛd¼›‰ÎØÚÒÆü¤²ÈâÚó*)QøZ òe 8ßø¯ù6Eȯ•×¾>\N+éG‘ÃÞÛ9rX7ŽMD›S«Õ74¡˜Ó²U‡'FÚÆÞ­SLž÷>£²:òM³™;Snøä8‰ãÝ ºFÆG‚\“GÌÚÓsŽ Z(J¿öèõV‚¾ÇTŒ´Lñ‘ÿê?‘6lD~È9£V-%ã! Û‡–Òf5¾®t_)ÓÁM›É‚òdœ¨¾ÙÛ±Ûš!(®GÜ~”ô W”ŸÍº&“Z·!ûíýįG;0ÂÞŠE0™ª zd@ßrR ž–›oÉðöÄqų6VV«ÆÍ×£øÐæ~¾XÌ©+7–™U^䤿ïídnÆBª©Ã/iCcÜn÷©èW.ÖIM9…k£7¦!þ;sdŒ;&AÏI|Ým– ¡p¯ö_UÏÏ$ª {A 1Ïv ­ó§Ê®øú[¤ªˆ8™œe›+jb¹vÇç;(>%2m65 FýØR;ØY ЊŒ¿t_‘'Ë(n°Üž¸Ƽ±‹8]ñ>öØ®¸œ¶Òª![¤³»¦ìä%Z†ª%,þ{òŒl jÞ\ú³—œkÞàALRõꎺ¤Šh¶ì1¨°$IlûãïÃÙí^Ç^ˆ_'zxš%Ôê+}p€¡S!ž{º@^ ¢=²¿V&uÙ2œ›KL.Ö_xúƒT®ðT²)úåqAÆ× ÑEï,{L4ŽƒÇ¬tñ™õeƒ–’`À5¬U%f[¸)îÁ~5Ò?ôm&âÛô×_£«Ç»X×¾4”—ªe’ ¡²63t(ãn:‰UY‰×S¾Rh §G:<ºr'ÚÉÅ·¿{£Ë°#Mp@¸Ú¾"óäÑ‹‡E™@iKvÆ? '²ÓVœö*~À³ñB}9Íö*–¡È:‰†ú÷M`óÉ=OÎE«5ÖЫfjÒšǘc£]ÍRÍhD”áð€x³gÑî¤\Ä+íx²Ðc·oT+BCãéJåÔ²ô…eËÙV)êó5ÇCË3ž\ý¾o?FHapÚ… U°u“ˆ-åDPÀ/›´k ‚hÚ¾!ÙDmf^¶ŸˆÖˆi]àÝn¢   ¦®pó³õ~¡-Ï:)±’Ý…«Œ÷jàڭߟK±U¢EÀ„FõqøuÜŠÙï(ö{×ʉu¢<ó@, bΓûÊgýVý³ö< ³IíJ¨Ф/™š4TB´5&8ã…qLoëâÜn%9ðupÍQCB¦Ô‹±:ýt”»8ò<×]T«¥h>µ]ç7Gˆ¥A9Àˆ ý&nY…ÞMpOœ&çL·0_SêRº&±Ó‰›RÒ ÷åÒ¸„ÍäÀøa¿_û‚Þþ…Ñ]æ‹ož¡Õ÷¿>Ÿvˆ†óäÙáDÉÑ`õr“«Ñ1ÿÙ‘Ž®Õ.Ne~ï£r¤Ãm:B=±KrGüÅpŠÐ"NJFÈ4b—£Kác51Z•°—ìÙ´ÎHÿød§¹¾Ë¶X‹»ÿÂÿqo,7G8f”¼ˆL†YQû*|Å}J%àŒ¦¿þ(xݼE×p£ùh~ÇHJx ‚²‡²Ì*q‡¨û$çZ­t^ì»ÜëÃOøuǺèÁ¿siß”ñÒ0¤f]äÙ)ZÚ(öNÂöØSܶÕì·˜iOASPùS­ÕîXH”2ÑÎ]Vgº)^ú 2¼P™9µì’õÿÉ-™—z­TY«$ù¿wô6v>AÞ á/@[™í·yd[KWáw—‰œš 8Œ"Sµ_víÅ]gü]ØT_iUº™'› ”W]«Ë(»å‘ÒƒeñËd1ê:M ¸Óùii÷[®¨¯§«˜ýÀrº °ZJzZ8ÓKg‘QïÛ;ï*eTí´•T÷2BrßêØê«Ö39Ú›I¸ŒÚš2½ƒhó2m›¾Zvµƒ<Ãî—ÐP(7Îk9™A2³HõÛLOR‰žìñÌ7å8 k+¥‘…¯‹Î…IW7`ò¨qÎ3D&äbÛéGwÕîHû—›GNujö=b¿LpRÖ°ª €ïfòù›jƒEÞ.Ù8ì¥Ï}äCãUþžœˆ…eÈڻϓGšïý š{^F4+a÷nÂ{ÕV3ëç„Ù‘‡2'†[žïQ¡gU4×’fá ÈeŸºÿý nêŠÁ˼ü,,¹@t=-vL :½2  Oµ}<ø{V¯{tE‡,m¥Ê|?k–Ñ×d¸ý³šµÿMqM~V„–ªk!Oç›H­e °ÓŸêpf Èè=ÑJñк_›a 2OpšÚ¡Ùc³1=ç7ŒîU*Z>¼UW¯†2hýÌlæÈ6š¬YÕ#º~MÎ2¦Ûú…çÉ ´T™~LII÷Hô8<ו‰Ti·ê…øR†¸ŽV®Ðƹ5ψ¯sƒmyÒEº )áÿÃ_2Ó6¥Þ_c•CúˆŽ¡ªVRŸpʬÇx;:À˜Â¨²$>‹8_fï˜w 7Έx’)hUÛ%d¹ Ž׎Ý-Ty˜?q5âAÒK›O&.%¥Á(ç8ö;sÖ¼Ô n2RëFÆ%Ï ­iå¹–©-ü¹k4Øz}.±þÊøÊ¿û~Läe,êïïX3z² ELCi¤!4Ðc–ìëÂQfAêZèSdUd@ÿªòÒo±N™Ðò‹có0ª*Èñ{­úTÜ¥ õœÓ H1ÚÃ~˜LbA,ôƃ!¦¯âðàÄ/îv—fýåNîÚë4ü{ Ín󈛖 ¢ãs"¤³Ðoú¤ÚÏ?‰ üfcŒ•å‡w“S᥂øÝkù–Žftf*ìerÂ("Qî2}¸òj&6«I_Ëÿ„ýÁ‰ôFú¤‚æ©ö ;qãPnÆW“Ö´‹LÏ|RH¾`é’0šP8±­³©³Tj'¦/؉m¹Ç[3㩈ø a¬²“!CDý(0í³‘Q©’²EŠDNÁ¯Õ–‰v› l·¢¿K>¦{“ß‹ÛåŽ`ÍŠÂß">µcýdwáNìü/ñmûò%àJÅ‹µ\hwjŽ‚<–pC¢ÁÇÛ/£N½~ÿ‹NÄ—çmä:¥ø1MlÐwPFoßXˆKÚusY'cŠoV&‰W³Í3apÌUµ@>=áš…ZZ â³Ï€úMGôÎ÷‰ëñ¬ò}îHšln–ÎÎIä>àqjû5ý0¤v°bÃÝ[Ñ<äõ¼±p‚Â7_É|îWjXO¿ðç^NÌuïxàyu-¹;¯:·hòø±i3ïÏ­«e|¶Ø¢Óa}øÜw5« \îX¯tP¾«B è:˜1igPß•ÜMÅL9>+Ì:]i¿¡ ˆÑ_É©l/4ý!f¿âBÔcpoä\Žß\ãg3"¥A‘#õ a<°ê,Q‰ù2kà^!„N—ò‰W‡t¹"”óvŸã<#’)Ø×ÕWõ0ÇÚFv®¦É“»ßŒ—u§†µOw¼HÈo=ïßr:ŠôÍbŽÒâ~÷ïêg¢’#tù¡ŒÉ:ÓjYñ×ÇžårñŽÌ"ÇuúM¬$Ñ~µËS¥§÷Í"~lËŒáfKˆy3.ôá‹4 'ÌÛM2áŽFZh5;-÷주ŽŸÛÇÆgë’#ªFBð×Qð“ëV~¿áBN¿-«µÕÙ,o­u¢X+¦F“+x3k~ŒUÔÛo8í=e`ÐꋪRšœö_R«px@µ±rZý·V×þð~ÑCPñ]$×ú‡NââTq cÎ\l\øÒ×L. ð9-­ÕÞòógS±hEZÌLè˜ÚööY'~¾Zø!Iv‘dÕ‚çìÖEcµHrFI…ÁG} ØcSöù˜.Þçª41 8æhäbgêí\|ÏñvönXbþ4Z›p±Ÿ®k®ž xtê3µdÊ.ûnìŒÚÏ´ÃäG˜Êù‘¶3Úr¶¼dèñUÙÊ Ñ)ŸÜ™ÉËh±r‰£#¿¢§¢ iö+´Æ%žÈFK±uÕ8͈‚ l¢ƒg~öpùvàN³h˜x R³Õ¸ÍCç“Þæ [½Kî®ô ïHïɦîU •Èæ…‰‡¥Ò®Ñγ#Œ| m,A±4å×:œ¯„;ÎÆé¢„CÒ*–ÈÆ¼›z‘êø‰³Jm÷wW€ê–ß¡‰ûÍñÀIa1oñ «Á¨Dþ¡r ?y°õ&w[Úœè=‰Q2u3hÞš€[mƒ†ríMõi˜€+°©A®Fð Ó#¬£ÁÎîQåKbõyÇw‚éÛ褴$›)äT jœ!¯ä¦÷„æ²°ù7ÏGXW~õ‚ÌP^Ìk#zºä> ÂR[¥’ Ö„µž|Õ]gÕlTQ‹d©¿ð¨Ú²ÁdGKÎzëž3ëèb«¦A¶ÅPKß·˜À¡Å³MC³ØÑ] ²ñÓâÌc±Iä¡´Ù¦X­µ•™fÀDý×òmI‚çdT—[£ïÝ…+éýIQ’Ä*™jçݼ\-®e¿âAâ¡N>©,j„í ý8)ü +c<&¢†cÔl¹5séhœúØYÅ ÖÖT³6Jç•Ãv^£8½æYå8iÑ)F‡HÙšxfe{´·ç>þ÷úÂ6ù«0¥®ú‘ÀÅ b ˥ÆPEe¼×Hkr'ÇOn‹£'ØÞžfP KU k·Í’¯ØÙCOµ×ôÃÏ[?!öÄk&­ñÊ ½Á" ŠŠzB­u¡‰¹2SÐѤ*=Õ=$›X;ð²Ž,e–ÑʼMƒ»ÕEQfP©êü ayX![4­´øÛ=»§šÉxFÏ \ª_R:äd<Ûl®ZÈo6­r Ç$y4‚¢Ñ»™gŸ¤msáš 'ªöj>që¼ZÒAûTÖ!®K¢7¸Ìßž^ JtØ>yòõ1µþ=ý( Ó7/„Äø+ˆo1ãujÊ娲®ÖÅySHIè¼N¾–×Úøã¯†>ôN#HCÇ&X‰@!Ýûb\A{;ù“{~ŽÍ/m-¬ò¯›âؽfOµ+§ãBë+‡T•zpŽ Ì`M‘îuªà6°ªŸ.úÿÓ×CÅcæ%ëzKp|`º`ÂŒ°Ú޼›€éu9J »h™|LJ©Îˆð»l¯mP¢ÀZt/ ”èËöÇÇiùŽ>vꎪª¤-wÚÝõ+ƒƒî“+Ï”kŠ=zŸHaÚÇä^Hu܈s§Téz?ŒÈ0Ò‹Ö‡àõ§j!ßÀd?õ"؉I ûü¬C%Û}ZÀÌ¢¼ÕÎ-xsv2 C2ù»L©dý8ÃŒÔwÐbùˆÒEÄ©7ŒÝIJ^½ý›FþéŒãƒB~a«gË3ÇìAG!ü„ö‹´otÿåÛ«qM½ðm$Ìb3R<_’M–ßÄ{ v @ãy%þÜeIb*†Ä¹ó™ÜN1n'|„m»¨1ÛWo[‰nŽ'Ò¤3ü_TnéªýðPùu›^]а‚é$PôkfkÓì±…Im®ÃÕfkò±<Ë +6(%Ù‹+•§Ò k±’d+ðÇÎ:íhPx7t1È=³ÌëoÕ¿Hè¬}º³(•"_3,f¨à ¾Çý¦3àÂ(?Ñ%Y ʇŒdìgš‡Êàx-Ð[Ï,•mUEÚšL•¨ÖZ™d3I‘g¨¦›€{2ØT1Lþ$¯¬ÉÄðfKÝ艩ìUöÒŒ}Ä2~XPëJ,)#›I–~Øk§Gdœsb‰ 5"!˜Ó¥¦ÚoÐ%ó[áÑñ¬ÿèT¡»jw=hf˜´}[GŒGAÉT~ú2^”?Ô Â°Y,ÑÁ’ŠžGÅâ#ŠŽxWµ„=EµˆÒaÒ³ä¤T*¸ÏÿûWÙŽD©UI²Þù²/n È„ù|V &úFÐÊA­')’ÏùpÏvõñ0b¹Kâü-ª‰B~0ù.¤¶BX $­uB¯"ÛïŒvÔëÝ9T`cëΙƨø,ƒ½$$”îªÛêI¡0Âí°SX[HFö¾'¶Õ—SÐýw¤r/Šä̬D‘‚߬qŽÅ iÙ–æÒÒîôO¬ÉVõéºe•±¢èA˜ój¬³Ç¡ã¼ ëhw&†+ Š]-ú‚Zò§ø×rJ±,€]^üÝGmÌSLÖ¥c÷Œg@ý5Í` ÎêIòUž§F?—ãnMÇS8µN™ºMäÆÝ`æÿá¾·¿=t(•CON~§„" "Cظ§Ìjâ:ÕI¸­ÕôßD›ó³{ûíÍkb§ñîoGâ©]íáØÓvãiŸCÐçü( 2&C1Y½Y$•Rÿšˆ¬ïþ¢¤ínü'#b*ýÙÏØ–o™_oGL›D{óMȑޜɡZtje)èçÖH¨¨Ù¿9 ¼$ƒó‰52‘~U¢:K¨¼çlÐ$WV,TƒW.ñ[^Yëè]nE4ªsï_=`ØÅ]3)c¸•Í8\•¾.†ù“Rª*sxƒD:ä÷¿Æ€bœ‹Ï`î ’ý™eP"âÑKÞ *#(`bZ&SʲÑAËohåtiqޱ>KŽÇ¶_Œ¸±›NR²“#¦†fÂ1ñf)&$«ëÏ%øÏ™ØÛG…É)gt¨P<_Ƀ4~ð_ø¼Ö1# Ü3Ø*©>91DÕkêÊÏò*øñŸ‚Ê4%™ÝLw^ضd‘@õ‰=ìÒNd³wG~Âfƒ’TT*gKÌ8ªŒ¯Lw—€âVø¬…¤”ì‡âYþµºtÇ\iß5®’@Iß34‡Ú«]–\!šãÅ.XIàúêÑpŠîBÁÒç x‰±§ñØmu›¼'Ë©¢Aêó¶@àg™C•Á\tÖÀ§xHG×záÌÐñléUbr‰—èF1µHåN¥E.8–¼¦»çõ$òê›m$®”i¡n±oÝxGÔÚÚ™<…@þù!†î+ë;¨°o|iE)ø›˜V:Ùd!x2uØÇ_÷ HÔ¹¦k_ê/Eµþ>¤X ÿT謣«“}ŒöPtï’gDsùqþý½gmÁ!Mº¬®“ Á#ÀÛÊf{ÔôqPÓ7^KÚTSòDÊùêº9ùÕ‘WÙý€ðÅôòI@³@ž±i0ÐÒ!c®ðúØh°!O$>WQ$•Ís!xº{†ˆGòÚ%·ŠªûXS4§V›ƒ0_€ÅaœŒl\Øw=ö¸ò/ÑÏ´äô‹á}éŒ/ßæ–ƒËP±ÌÇÍ„"ja’…}ij åÝå‘Ë, O«ø+Ùøæ;X£x»ít"€¯j–Ä^áM¹àÕÖ»‡UHN^n3F È£­(Ä_\çÿøj½%0cÐY‘âþÃÜp5*+¥ œŠÍI _Ö§-±Rm\dÚLØAÌ=3”Ý)rŽyÑóâÌ[L£jÅ`€ŸCMJ«ÿÎꦆƒSjÊ?«â§Xl‚Ð[ü}W+$µà»`î+ˆ`«L7¶¢hwh!’8V%RÆ kˆaïÔÒÉ^ÿtä!/PÁ>ßþ溈gÓ8/l¯ÅÝ—¯j‹VFn‘! C’çF.,mC@ßýFÙÖc(ÍšuŒoðVã‹ßrÄÔ@\ÝíöJ]–¹ããU¡“7€nBïU@@ Có!`ÏogáÀfî*_2¬—¾žä^yÙ³úÔÐ5¥ª%bÂXL¥æ GdQí˜9UÐ3‡côHM§Óázé¾wú÷Mîß5û ïp+wê‹3Ö7ܪE®B«”žìøASTJ²ò´¼ŽÐ]›m/­‹9™*m÷)Ÿõ#š¦91.mñ†åœ¼¯ÈîICÜq©•”z óám)ИÄÖÑ(iòÌŽãFœ±i•SʱÜÓ™&;JÑÌ£×ÕòïG‹ F¢ˆy˜²$¼&ʈÏè­€—8Žxx‰ŒdRÌ%‡yÇUdàZ%Ç“øñNcjùÙ·Ç뾦C&ºv¥½£§ìä²S™•(0JôIbíøžðìý,Ÿ ›ýÊtó²7ÊMë ƒf4þ-掯×ЩWWaµýK1^A×'ؘ„¹x0…¡þ¸’ÇM¬š}š¯1ØD~eüí\ÿ…'p¬ÒšH¦ÙA¾}½Ò¸óAªÊ}ñê9ö~K~c$/á@»³ZV†f!˜ºHóW8»Ù·;º Ç*’È?ÿœ˜3CÀt[™ÿ*НDˆ¾æÐ¾Ó–…z¢~ùwäÇ4~Bâµ8¥¢ctÖßW9ü"ôëÚò–ÀªÖP'ØÃRRZ©íÄ&“«<9Ó>"sæéd±Ü~¤ËÏ]ƒâ\×ôN>îø!Xq+-•»`UÈcWaw²ª'ªuea§´©.S\|BÒ°bKw'%WènÖcþßWå (¬”nü-¥¾‹½Š Gþƈ;>”·ÅQ²a3QŸc ÊG bꬤc.L»ê!wÈu/Ÿ#SæÞ!5͉ò´!“ZzªHF ÿ‹°,oG4ïÇ:œ"­·0ºn ß'yûFô Y/óí/”íoçØßWBñ¥ñÑšê¯Ö°8Û+þë¿”aZ¸TŽòKÛ¦YhxEü’¨žäì«,ñá·˜I[ZóÆ'à-”™”Ih?Å^{/Ý3˜Á$+ÞFÀN»ç#Z…«EdŽ%+¥ÚžyªQªn8%h„i;è—h&—ªYØû±»6¡“òžD„öµŒ°ç‘e{m«ŒÒ7œòò/·‚Ã`±y_™ùõÎP?‡uí¼¾VÈwò¦U—yÔ›‚ÿnÆÍ˜¡÷B•[5fâ1ðW˜FħÜ:x"N =’ä#Žq ¸_MÄ×–ì­wÚÐf¼Ɔk§BDÄFé`SÎ'ƒ`( äÎí$å‘ãXXt÷rË CÏùn—Õ1{AÏÑ5R7è,OKÓ#¾ËWÔ â‚zÞ_fýôhÇ4”˜SO8ìØÒcásƒ¯MãÁà,88CÒz˜ƒJ@}«i‰ SYsžƒÎ0à@(Íâ¨I]OµR¸ÚðôEâŠÝªkÛ@4¦ân—»ù•‰\&¾IÙœŽRi¡âØ{U™ø`…PÊ¥T < @üû ?³ä<[úÀÁðF&¾}…0Ô`Ààn¤0ŒFÖ<‚§à¸{&tE^¼ÐY_þÙZ—ï,ÿ> ~;=ã4É¿J'Æ€£è+gÅÒ„f¦±íjZˆ±å̬šJÛHrò /¬µs»2I(G®_Œú‰¿}¦¿–\©¦ÔßV_p¿û„Á:D·ôè¯!6‚›™S­Õ7~#Ê”6ƒSqÊh¯MÔp_gðS¬ÝoŠ.¬áÅ™åÕ µÜ¦ÊËøé?¾ä¤¡èN²óê”$ÜV`, žó?ª RXdL#{ž¡WúÖÜÏ[M„l·”LàäxG6ä#0Ðwú+7ë?¼.“\y&¼H€:}C ²àP6+/¦ P‹{üî![9­Mß‹Ê#,<2´ˆGÒ[òÌm}AVS#¿»>q~ µJ$Ø3Öp¿u8§‚Ð[“ú†µðD‹/tR© Dà_Z? 3é-èÊ U›R. Ï6èe!@D‚hÕ0"},q,8¤õ¦Ò"'»üåÈÅ•â êÿ É£·uêÏÉÜÒ—‹Pô{`ƳkM;N£Tl0…8H8m/±j5RÎ|Íû'[¢i¢ySÛ© #Ì% Ÿ#Á«%ºc4ìÖn¡-,Gü*àvé+’¾ ü‡Tsp/Huáî`½JêÌýŒxÉn€n¬(Ü{ þm‚ŽÊÝÑ,Y»Côúa\y:g-²3b—XänÕ)û%†ÚÃøtäl‚4 ™ŠHÓ CÃm`8§ $…ˆ¯<_øiÈ®©¤bãV)µ1öʬ宜ï/y¶k¦‹”;E¦9ˆÚÓž¤l•-aã;æÙ`ªópgÙ_?¬_#|DÒ¹Wù"o‹DFyž8 ËÄ» VaâÅJ~Õ>…CAÃus¨,ÂÕà kŸÖŸ)Õ/ÜŠK wGƒöüÄ‚©ö눈ŸŒª êº-@Ž¡– ’ZX™l@%zÞr,èx5ÉoN“üC6SV†ºÎ •\ô=_? ËÑœ^ÝNxª6ÇHÎrƒXÁSL±ŸØ}~‘|Õ#3³ˆÞÙrTõs[tO(ÆûКïb¨ÜØfÔBüÖ¸ÈxNÅMñ6ý[ÌCÕ›¦SÒ\ Ò»8ÿgð¤²E ÝzßöíѮǻP–’.ND ŸF 8™?ûÿ›zGŒÜS¦¿„¤Q¸?P÷ŸEØympim«IkV½÷Vý@•í NôG ‹Rç#¨7)I®+ŸH3ÂåÍkž% —fTŨ@ÚÒêÚÖû~zŠôédvz+w<ÒlõóUpTc ÏéãQÂR£M,åé12bߺÄs!NêFí>i‰=(]¥†äœY„ÆPu@4wCáÒúTè€ìÓ*Ei£«¬–ÈQ Õ>ådŒþÎw“Œ0º†ç‹êÜ7ˆ(õÏ/ÅtÕ¢¶úÀ·}µDnQ¯‡7€ÿŒ·Q…Y˜zÝs›-åOÙ»’ÅÖ<ôÙKí¨"è°_(§éÃ3ì9±°ZÆ(Š®BV,$d+HÍ!?ÿL$]Ñ_«Ò@· ±ÁPT³2Ác}Cñ÷61»í}±ÏƒEœ™ªl<—Ç<Ë¡’§Bu‡™x}]Wü؈jvÒ‘‰²T¨µ£/“~¿¦ŒoݯT—òx·†hŒ pðÆW\2Õ*„>=[d}œß†=bºe¯+øººßÛ/YÓ8 Ò-¦ðtú˜åï®/ú¼¬ï©Sc˜ÞEB¡íNÒÐ1%«ÖÁ’4àrKÈÁ"v<8±“õäN"·Â)¬ŸT>øÑ­¸=2,{t¸¸pxU„GÓË%°¾^ŒLLL!C–@ÚªË1›·@ ]Ö²Â?vk èkS53éH§d¶ WT‰”ó—¦ö–6&V§Å¥¿Ô¦W¹¿’~õpòVž±må³w8Ñú?’J¡7ŒŠ'yK·o'ûei|›Îú²ÒH)¢\Êv™*ïf¾òù7¤7œ…­9*×!ÄÝërÄÉ5póðÞZ$’uAp Ly¡ÁŽŽ‹ã0Á.²%odŒ.\„’£åЕ!s Vt* ƒmChŸ$–•šÓ˜š¸Ù¯çÑ ‡™ßÍz;ë;‡ÇÚ@“‘¤ÓôCgÈuhÌig¶È=°×éë( sNg$¿Œo|Þ¬SK± êŒ_1%H%,ùn¶eb»Ý:¯J}? 㹄GÖ£,æœk9€Ù ¹w”Qñ;^äéßÄt$–:YD’šÃ_ÉÈ‚æ%£.À€s¢}‚•î¡Zço¹¥š5‰ü[¤V±HvM5ÀŠ ×fWUÞ”¤™þ‚䟺NŠ€ÊÚ<](Q¦„?]õ.¥mË&¯LªKîç®{äØ_Õ:C†%_9­zS˜ÙV{/¾i/8Î3±À‡w½¥¤dôu—¶æM^ןÛGÀíž¶áçè¼…8'_Ú(ïÜß[%D }°ß£-֒ͳm¿©4 MÂ_…léÅ`an¿Z äör'âü+>BpÍ biˆ$úˆëeUù”0¦>Ly¼)˜*g+—á!0¨dôD7-WS’IÊ›Á™>2†¼,ÀU[ùà†ÎÛ £UšËɤ4u©¢!Èþœò3U·-Í‚rM]¼%iæ…z@“«–¡- ®[?T4”¥ ŒçykF5ÆhF„6†Vo—Ž&/"?fã·ãK`†q®¥Õ>×sÐøhθ×Gñ±Wã|“ŽO‚È69XÌgãY)`0N|µ£{þvô£à£_Ý@‘&`6X¼x$@áÛ¥fà8*n‚3SÎø†³*gLÉ1­ŠdóG]À÷#šsÿÌÁÀq,jÕ$ážÓMþÕCuðiòV)_‚YœY¼äÉÌæ Þ0[k~çóèÂJ܇±QlÊfgah5ͱPNW€—™ç¨ÝÚÒ³·2Gñ„ v¦K†B~¨ÓÄ…ÀgrޤP Y-”ûÜH‘pçñý¯ˆg*&(R®9A·Ç)õÂÚŸŒ ÆO~œvfWÔðÞ&¢U ÄXó×Q©xu¿íF‘3Yù²œôÜJ bõ< Q‚±ÔÒ#v£æŽ4–g ±V{ÊW g3Jû«¦£Ô—uVÁÿ¥1gj0àÝà”íuÜ÷(ô¶b ‘Z0âé›^FÏÞÏÏý„P†òÀÔËû!õlÆi£U+†F<åZ°Ôœ¡)¼ƒJ'WÅÏ ¡ÂÁ¿ø@°>xÓõ†=Ë.¬Å‹3–¶òV8+„\T9O'ƒ…GV€t¹“â‚„á¼YéýIW•üA´Ôß 2ƒäÑJ•+ ˆÀ¤Æÿ3ö  ñî°††…j'± $ĸ´ûãJîÉÄ^Šl³à6wÔTs_v(x\i/5Ûedˆ… 7ÁM fÞOd[µóÑTˆ¤èR  埶kL'ö¶Vmø Ö/\„e­ÙŽ1û Ñûa;Â<æ"+ûœºíŒKÕž °'MG1€œŠ® ç $tôýué¿„HHƒÿ£c¬?†?5Žiš*®¬?)5ωa»u€ƒÜáͳ¹zÓ Š¡fS(›©F† ¥3bIž”ë—ÁÆ’)}æ=Mƒ~ûÆA!ŒçÓ endstream endobj 202 0 obj << /Length1 725 /Length2 34708 /Length3 0 /Length 35174 /Filter /FlateDecode >> stream xÚl»cpnݶ5Û+^Á'+¶mÛ¶mÛ¶mÛ¶¹bÛ¶sß½÷·ÏwÏ­[óOgÖ[ï5G ['%w;czjz:€¢ˆ’=€Ž††„DÐÁXßÉÜÖFHßɘ jlP4¶Ð3èèèaH‚¶vîæ¦fNrCŠ*VúFæÖæ[+[sC3—‹‹ Ÿ‹£3ƒ3Í?IŠÆÆ'3c€‰¹•1@PVN]\F@.*£ 5¶1vзÈ9X™¤Ì m)&¶«ÿ(C[#óar¤ù7c§€™8ØZ¤…•øEde”‚´J‚}#€”Ø?é6NŽÿD:9ý«:*€ÓÿHVúÿ#üô?^·ÿH40ôô#sC'€±©¹ í¿x·1±°üÇläl÷_×?€ÿÁ ÿ‡C €‘±É?ÑÎVV2úÖÆrA[k;g'c€´­‘±ƒ à_Ü»:˜ÿcùo¨¾µ¹•ûÿoðÿ‰wÒÿ‡ ~Óè£ûÉÜQÄÜÍØHÎÜ龜ÿcV5þOo¤Ì­ÿ“nü'ÿtÕÈÖÆÊýÿ¬øO)ÿ^VDEZMŠŸò†àßnaC[#sS€¢Ó?|ê;ýáßn9}óÿLбüw¢ôÿW—Öwr0whÒÑükDèþuýWÒþ¿Q¶nžÔ tljF:=#+€‘ÍûÁ5tvp0¶qú7éÿÔò_ýßÃdlìfl³¶lkÈd‘ÚRî#\8WN97£§L¹L¼2Ýs£‰l>df¤{x…}¯„ç ‡;ëoÀ½{¹#~ßL¨k w<9E¦½ŒýZLTaêS³õ.ŸÿV¦s ¦‚em(v~甾¾ ÷gŠ)3ç¼F¾”Y”>J¯¬£i;nõï£(…6J†Æ7œñ>e5ÒœYpÁµïëÞHh^à.Ü –®YA¹¿Ýa¨F~ý•… ¦ºÜ<}—F®æ–ÐVé¶KÅWÌÐfÿýãDÚ¦+ÿò¡ÖSíÈDDø —ìæ¶¯4®ì-dÖâ§d%—rDìÖ7SE§wøáî¬Ë‹ÏŒªª™}„ŸÓ ™ö¶Ä‚0!L ì¡ç¨õGκ䒓”ýŸçûÆøª*ÊÜróã¹xÝMtÂÊȶˆÄ…k‡³‚wG,n«…4§ #™ –P° £\›8)ÁÓè±Ó¶6‰¸rÆw G|ÚÁ1Ó:X›X3Þx„¿7Æ3®ûQxìÍŽÌûÉd¢c‚æŒM1ƒžü̼ü‰+,ûçJ& `$´ÞÔ«Èb²ð”å)áng‡#UI\—t•Ôb5w,ÒÒþ¼Š¡DNþU%üÛÜÆ}.Õ¢踞¤AUÈÉSøc~³wöèŽã»ïî—)~h^°¾å¹ y#K:‹¬ ‘;C…c…räŠBŽ90vô3m,Û—W‹ÚtSZÛ ÎœÖÊÅÐV!Í¿è,yŒRùéop÷àfÈ#EÏ}Ò#¤¿ùt³h‡¹kŸe€ ^p’¦ú±2œ0ÏDy„gã,ò‹À;ŽšµÚsÞEÉ@D—ПFÛ§‹=õØ*/<ëÉáÌîý¨©¼’|L7JÁºZƒ`ˆñ¹S•ôHUùa¯ø{£ô¡ÔÍÙu6_qŽ]WäªðM“Ò2³e]þd¢Þë¹ËÊ%#S>ãà¢ÜÄ¡³îTúòïìÃþtïÅò¹] ŽŽ¦}áÑß#M~ŒÐÿIÙäêvÀ,ÝŠ?nY`üЭw’5ï%•m—Û)Õ°'=ü~íÐo&!·³¨ãu´=ìÓò›Ƨ=E¶ŽÀÉT_Æb˜™¬hh#6©~:UŒ«ÇN¸0l=Ó’BÅ„óJ#Jjþbû½ÏµÙ™KÏwØXF¡~€Ï[´³ß8¨X”Öþhßcö>¿_GÊjS_3§e;Å?ò)Ü*jœªCÍ:Q X)) ¼6ôfU7Eº˜˜®F0]¼ø¸Êrvfv6ßÎ/‚cqø¢f$¾d*ôã^òV¸F¿ ÒY»hSr@û­ÕšDéX]ŸuZA¦ÙuÑÅ4í îÓM1¸õ›ŠÛµIݦÚÔ±Ÿ®4˜Ã­ÜcPbUÉG`Ù1òåö 7¤Œî>"2=rÑ›•ÚŠÅ#•nîÛ–¼µÚoÝi˺h{ í"…·VX”m¸ ’C»·ÀQOì’ÿ”)Gy´…íÖŽa™†)vR¾IËÅ[Í3Aµn ªEå.P(hoä'̆ ««Å¤ µD\´PO¯tõ.Ú<ý(MÌ%ÎtÈ3ˆôBöšÿ¸ÛÙTò¶6¨A+I¸ɪœ^E@O n„M³Õ$e”,`‘eÍ$©L…(g¶ó HÒªüFÚ¹‡É…&.(;ÅAҵ݉r‘ðL±ùKyTÅuÓqööÀ<¹gîØ%à˜fßwuŠ däu'ò:ð57K‚7Þ€yUxh¯+©¬f…Ç7çñé¶æL§YUÛ’tåÃLìPç©c]Lx½K,’ŽàÕÓ,^ö©7‰ãò¶cè0>±_TÃ'ÔŽ\¼xO¦ú£½Ünjä¾,/>Z¾¹æpìzÙˆA« >ÀÞ¼ ̓&…³NÅwOŸ1o»`c‘ëØ±fžÑÚYüXÿ÷u3—™a‘Æ2à‰þ5¼­ °|PZ,M†žZ-õa+r É™ Ï4è_ S–*eÆPl?-:‰->U£JB³ jõŠéóÏcµ–^í½vÿ6ö’‹rÙùÅwÌa(¸õÓÆ÷´DUKë Á1=ºÐ¯ênù.?€,—Jµ½ÎŒÂaæ.±½&q*…SÃʾFR·%ä—BHÇn®¥¤"Ò±´}ßwskì®~“*‡Ò´TéNwa¯â&Ú¢¨‰í1–?Šò4ô‡H³²¡<¤ßfxž¡ v¨@¤á×tfî•$ÃfüêåoöH§ôG7™©Î¹ŸÙº£ævÞq`M±C 2Áóxq€b w/;•ð¼4ÞF˺‹g[ó½’ö¦ðËÆŽ‚<›§«•‚ÄÆk Ø›ZÙú„«ÜÊÍ^ BÅzq¨–BØ×,½0ÔaYõÕ·t?…ÏÒð·F¯¡YmŽlMð9TAQÙJß^1ùC\ùIWÒÛ‰5ü…i‘õ'àž>*×v]¡‡Ì÷³‰ýxÜÁ8Ñœ;’gìcKkš"ú†·Íà­êú«|bêÒ/C3;Tz3ðò£ã©wØHF.&ðéB½Î±P5ßn‚´J ç¨{¹oê1i5ô¸0·/ƒ©{Öw$³©»Ž.1WF»á†FDgŽÃ§ç¡´pÓg3ÅŸ£T̾eä©ú¼â‚ßñ”n0ñd}nvâq\­‡CüLD˜"g"…ÆO³L´´]¬>ƒÍ~ârÄúuSéÒãH™˜)Á‡c·ˆ°gBŒ±ÞVs¼EMÚÁúï@¶¶Ø&ÉE÷Û‹ôDiìF¼„÷m˜¬#üü{#C|hô¦Sx|OÂá‡Ã@Mˆ8ôá% ° c+åêán‚Œ†@=\£$ù‡®… ‹êa¥¨läÛÛIÏÉ 5á«;ÃÞû„}·«‚ñ±(2²ë÷¥ž ?Q©Õˆ²NmwoRúØXá÷éüò¾€ðv®#“óÆ!ÑÕs7²Å¬)înÞâß`=Š!þ¤ðs÷r¢CÐtç’Ôjy ˆ jÝD‚é'¨çˆ¥§k©¡þ„Šé§‡0h3NÊ1™âÄ [€ Ö]³Ú‡ÌDà»tdÍ–´p »î:ò'd‰ú¤Ù’¥•+×4\Ü}»bJÓ·µÔÊQïuÊÚvè>YþÏq?'CÏâEäz”Ãå ½"‚ýꇟ±Ô”kƒ_UR‡ºÐ]‘-¨Æ]'ý‹±Sû$wmWÌ®'‘rµ,+~®zDJDq Rx€%´ÇáÛÆ ß»è}Q’˜)º#<#m´“#&KOw®«fãQNW 64¨Ý˜i‰ £bGÛ |Š æÏ.u!{pÅ‚³ÈÏWy ã#ªÓIbª¾ž0eÖïCj‡~Ñn7Ö I6DïcùmÔJ¾ Š&__W:Ñ\“‡ž™F!5ŸÔ4¼Êûôüë'8™ÈeðÕ„ávÙŒˆ¹,Jï¹tî4å[ƒ ¹ "oë/†Ç̬íÂâG€ŽÞ­ú-j{WGoÉaH‘€ëv“ö ²XŒàíûæÙ%ŠpàlvOJÁ‰éÅT‚S¦§ãʼªì´¾-g7¬G;o¢ÁK±§f äHãÅ¢l]ÄVÔÙ™‡ZCû«©;ß ’ŽgO@8ÁÝ^J¥y ÐÀ.ož ?ý‡ø.j¯ùJËŸ:ö„îc¿¾u7㶬•QX¥?ÁÑvãYË»–õ|H6éY‰Ä¸b?\ý¸¾œÖÒÃj,‚[j=YâsN3ˉ- 8§mËC'ºAçhüñn.3ôÐ –úØÄ6&êƒEŸ‚­xÿÒ4@2"“†¼LGÆÀ¿Û^ñÆ/ H>°Õç(û8›¿ é•:“¤†ó?‹Ä[ â!У6iE(©÷#Зò žLBC<`“¤Ü–kꃃ4ÿýe¤L?20£ _/ÛŠ‹b„WE(äו†Q¢¿ß§æ"ðWø ûù,Õšíy@\‘T¼ñänY¥€©Ry¬S°’¶}O)Ö1UxÏG(ãYhB¯ÌÂ{\ªæýV +ˆÄ[Ó…z3’ýíQ &SƒÃMô4­7 çúò¤+mý'ñe™qåáÜŒÕ7ú…ÛA¶Cuã¹[†Ÿw/þLŸ¯^‡…Eï!,¶4OÌkûQfB›Õ$—¶-ß–($‘~ß›þ¯}©$.nG*AYõ‰ÊÍBΡõ²±ÍÅ•8_xÑk¶2ìÀ/œž 󸨆~ÅÏ5¡2sÈj¸Á¹¬¼‚&ASZç0¡Ýâ¨À• ŽlY0œ jüüÝá|q^–ï>»l+N(ÿ="þaiËþäwœ‡Ô|N\¦obáÖÌ)c©_v__E0)À;鎘g:pUMŠª@íǹ{z):Žûçxש¢?ªOúº"qbrܸúR_r‘Kûæ+[ÉÆ¥„BÝ’ïüÃs¡JœÐâïüPšz„¶\Ý· ðu7‘ßm­|4wGÏ«OÈc¬Âè€]%r‹•¯. L¡ú-Ã,EøãL<Šå J)#nYÓóiAËÝd¥ ~Эêe‘õ+QXdè(ß w·Û?ÝÀg±këWT‰<µøX?(víÄJ§"O¸ùŸæ #lº‚ ]ÊPà»ß+âôÕ®ñŒ–"Ìå‚®Õ¸ŽÈcæ3Iüa1´Nò:Y¹º2’Ö!ØŸc—[—T}ÍËm{ ±$8*ŒƒÑ6 ©J—ìak( äxx©6¨éúžt=ѳ`DÆj›0ès²û}:¹€o¸þ±÷/ÓŒ&!×€Ø —Çý£>Ö|dƒ-°È|“%'óÊÏ]ø±ßÍɫֲË|¬wY]ÌžK¶ì#¢Îà|š6ƒR‰CÍ£ )2yÉ_¸­&:àA Z1{:½F˜9Rk»ÁôÆ:Ø÷´DóÒ[eÙÕ{P`{ïæÔB·¯JI¼Í0‡h 13‹oœÝÆÑ²zÊ0’2Åá—0·zø­HµÁ©ú}·s… rhH-1EÙi¤vJŠ(„]i©‡“D‘õ`SÄoþ Ö/àÔ rjœ,‰•ilÈ.L®qFbÈ  zr-.¹u\œà—¿W|;õL~.¯‡míÉ;‘á77Ô$’ „«ñüÞ׸ŽÜü¨aEOtt(b–“ûmŒÂc˺(êÄ«ïòaÔ†Í˲Æ’VÌ­˜ N,æ§ T?ÙÖÂR%-'Ÿ°Îk¤‹Ž³õYׯԬ+([…âÞ 7ßë µ ð¡]ýÖ ¥ð@Òe&¹^Ñí3/:BëØ©ܼ’ùsV}¨æjŒä‡Š~©ŒÍÆ‹}<É$p­ÏcÓe”>èÍש9J;Ý9çs~3`øR™2¯ Òi!0;©×qÍvF¸<·°ûeí2^ ¢µº¢±"Ï·ÄðPw ª±- è;kú¾1DLxÞφÓÐhuzÓßL‹Læ:kK>(½@µ ÐøÞ£ÇV÷N&*ŸûˆWõ\ÅçÊ"·]H?™þ‰ÁøþЏbàÇ'­kÓy‚~Ù‰ƒe¸¼Ëùbfý ù¦a_á·ËÐß ú\­ ûuõölÇ¢|†4 tf7sýE{÷J‹íH–PwGnÔ@%üøb°AYLh—ö||ë =r m‹½DøýiL[ØTi/Qlåål†zÛ†` ǯíp7bÐÞ LÀÁÈ©Äzúω'Ò¤OÕøêðÇMù]Ê;¡Yt0å­mMèm‹R)œ+ϸ~níiF#•b5E»zº­F†eƒå'´bëùÙ‡Ì{éD—( ­o:‘4ZÒI}Œ¥Ê;ø¡†è´iÁîjÒ€Id_CV‡X…ºN5¥#hõ2H®²ub«²ovºŠã“ø_pÍŽÝ<¬Ô·3†ö×/<'†TlÏo`ð>¾R{΋̊B¨]b\ý™ß\›ÜVcÊëÄÚ@î4aaÕ驳 =IøÕ:rt™êSJ¹¤òÌï²2¶Òm9sѱ&2p>ÂX‚¥ðýƒcŸFk tRê9r0”Å~džö‚>æ›æõ;ågI”å†Â‹ÂæðÒ{àÍ_âÝèº ?iq\z!­ùîGÓžÂ<>ùò÷úIÞ*úº)wªdƒ¡YçÒ}X˜P—ÌÂc©T5¦Úœ'}ÌÜ>TœuÛfÐÒNKЄ‚‹B|}šµM2“!Ð$¥Æ1¨“O;œŠ<+Ö²—FØš\®y¤/ŽT_ãÎkn~PDÏ "©Ûï+0€z†&n ›ò{úÍ›¾’4¶åÂ'-¡ó\"‡CV»Q‰¨w•+#6(ûŽÚªœñØäsu+–õišZÁމòhßåZ<¹—ò›6`ɾ¶„.’®ï`tàD‘.LÄcå- ó¯-ÏGß¼­` UbM}¡Éû>Y†˜ì$Öt’Èp„Rô|‚†ŽMWý Húó{9ëAü¦þ Š?Ž`Å\5=@áÉ{h4ºÒG´$'Q“ÝfÅ;qÐÒ9ª©k¤/€® ÍKøw;]ûÆTKdÒô—§ô.KŒ]`Š£”–&Z1¬W1ué½r!¯ˆ ´ÃT>ëåx”µí¸w¬ Eüôåà¢Ñ…~ÖBÀAgÝ> †ÕÆüfäA€,=0ÕŽ\&Õ‹^%‰_LVck6 Ò(;Fh1÷t!êsá# Aê³bP©ŠFÉ/mt Uœå ©åUž/ƒTï‚WTHûÖ”q âG¯åGzÕ÷¢«½Ü)¤´P*ÝD|¢ÖA®oqtÔ×Çò·¡Š ð€.^}E‰ ¦s(—pBÈö’¾™ Ý%ãKŠi| ‘j¯{â8RÂO(®XúÈÕ¬»ædFaåv¶V»]úÌù 4æ#}‚–³`°t%ןYÒM·²ì™v噇a*Ãbssà›ãZ:Hé¯?§¿Pº²ŸÑûÜkv´ÕÄöjþn>ËÏŒ[žÃ­£HúŒ¢Õ©$Éu½sNþ´æ%¬UÕû¯øt ÄÀ_ éy¿RýÛ^BF¢ùúQfº jíf)_ö­4rHülÒt Ûe¥3ùjM¿2r¥ÌîR†›³r“]Å›³EºM¬¼Þ”Ñ È#áZÑ@_}ûÙ†[å¢Ë[AäÀ,Ü €Ã(¬öƒÚ½tÝÛàóÃ/þ"Yoùg±Ê߸ê- ïb;îsQ–3æR«´lä™ÌjÂYjV´Ÿ°®ÂÑ(mª)%<Â|Ñ †|À’i¾ãFÊ ­`‹k†Ä\fVÂ=žrF5°:XeßBê£V¾åO)Ö‚˜eŒ:8cB&ŒÀóÈæ/{`)fÚVRÖîa€B¶ÕYîz6ù¹?“ù|*tt\ ²±,[TÚý°`çPù«šŠò—Ê¥Z èX¹r1õ„¬»,õé–[B¸µŠ{˜nçP£íÖœºN¦Á£„54O¢`â÷6ƒäÏ¡PôZä´ Ýë@ŽPã”Rî/cuQ>.~œ£Â¥ ö`Ÿ[CìŒHÎÏøíb!òÜÎîôà ²ž 9¿ÚºŶȆÈîàRû¡z‘ß)KìRd¢}¡ù†Z°¦K&|2,î×ò¡lnÿ²àÂ4,KGód‰^ëŠ*ïVôPOíåÅ7»wX’Ýb°n·ÂQ¼Î°\ä­Ýç º,l¤AxfT:ƒ›©l›³He²vf,à6õ»bç´ˆÓU¶ä¿iýà Y9\’vœíö§M(L.ÙϘVZðÆ„ã=¯C*ˆGö)ó•³’¶E·Êþ¸È¿ÁXù{ÁÁü6ürê·Â\œûk²wr%ršI éZäGÒ¨ON¯O÷T®wE<)I¿L:°þ’ò¨”N°ÿî¿Òè|ºvòÜIÓ\‘'3“gZ¶cuã8Zb:V—…à9¬F³{NŽÃ=–]kÂ>»,8ž‚/ÓªëâàOêÁÍ^,ÝŽôà¤|¨­u­WœØ ÒË?ŠVcz#?šXþÀîI“µúÅ\×ÕwŒ 8T¦‘×îBØ™%|"Ö¥B©ibì½åñ3TSãFߌÚÐEsbÍ Ž¿ð'§,íï‚d…\8 Óo˜?ŽÉê¬'äS›zõC] à\ò’§¢2²kR Í,)7RQhZë–Ó`zMTcEæ`ábóV6Fp¸–lØ H܃mq2C[Ò‹›>w•Ó(1°ñ!Ø@´—ï¡âä‹Êp„§wñ+L6ØF‘;´¸ã ²ÌG‡¼ v?Á¸(­ÝñUŠJØZÌD~×{lëªâ³;(¿•’"Ìâ1Ýfpvt=޾úX®"Š~Pßø¼’¾–¯žH*¤¸ÚOÙ;˜°ÑDKæXx¼·ÛÑOj=•¹N<ÓËdgüHÈíTè24&D¾ÌðÆú–>ø“×ÛÊrÓq¡g±9ó­D¾åîóˆ ’™(p_ÞT$~ñÈêv⛳ø3Æ÷kS¼¿¨µ1ÄkDr8`7!©H|ø"Z°0 ¦¡öuF­Õ³Þ Êj¼l\±%^½ü®]ùMüêXˆpO›v÷ô¬9ôqê‘Pù~Œ3{6^¸…ä×l’zgx ÞÁÓ~Ų/3qþÈ·kúëhñ«~‰‰O„ãÀ´øÆÄD'S_¬¤sõqæ^X¼d³Œ!W†v#nKŒÐ†·fkxFf›£eN݉@ûj«ÉDØhé ÜGmÊ{•pì/yÇÖrÝøÎÅ{à ==õj#]SdÔVµûvàÝsŸ‚3I:ÒëRÞ¼È{žˆæõâ-ð.ha‘aiÎ!j6yÿƒ{ÊC-jÛßyx7ã *È„o^!Ar7ð ]@FSK'«…ó1_D^ëòR3é"[¨Z;!;ïN\Fò­\û{ÿÌ”2r‘ ÈVCî8ëÐ[ê’öÂvÕ$= ®/(>­j—¶V­ïòµûê´-SŒØ¿ãí6ï~í‹fûÄK®™4¹ï)4yDm[ï'Ü%`ñÄ›; ’Ò¸€…¿ƒ%ˆª—»¸&lÜÈÒ,ù9÷6) c»1óÁ̈’¶´²¬l. ²[ÀæùÓÊÔà®r§væ¥ËS®££l¨žš¤ç¿ )ípåŽõ¸Áj9AJzÉ—þÚ^ó¥?»ãL\Òãg}ûUgí4¼fšÍ@Âú(o]£|Ø¡¶¤á…ü}«ØCf>etFØÍ:ÀŸþ¬uõ!ømÈáVN£êhÐF¸Á+Q9í“s[äÍqì…îÝóÓ×=ßrØT&ýŒeÔðëðޤ_C^iºFŒügò¯sŸ€aþ0Ïù¯@3ÝsǪâűË}ÃM*‘Å .òm…ïŠ)I›Á*ÊØßhÌ™òÚ+{ã宫›µØæ?b”»³l˜ß¥¶J¾yj6µd1×J0õzœÀĶžgPì2ðy—áMË~‹’jösüõ ÝøU^°]¨Ú!žKQÛÀñ)Ccã%uМŠýóuú5¬ìµö[a±ó' ‹ª}fܾۆ‘¦DPÀ°ôñL&p UléæßjËÿ»¦/ìú˯Ûœ²˜)f ¾0|ï“€Ži¶ˆùÆB8*ÕºœÚ k¥~Kßñ 3Þý ñaÿ b=ö­Â›ª—øíU–©×•þÂ\ŽPvÑ&>Þ6RµÚn(ö™¬.èQ¦²L˜ÁÄÖ—›UA(®pÆ SH÷wžð½Qóçk =O†¶'›ðèoœãç¢îùW `í®í«¨· ’°Âÿ®°G¨>ŸûÛŒO6.™8]ð|&ŠÔ÷fZÒu»Èêj×Á𦋢æOã:™uÀŠÏn‰BþRÖ‡–Ô¼Ø;-؛ߣÞAÒåi£üÓ‹mÎÇS†*et–xŸÿÓYZ9oR‹š\ŒåeÒW¨C6¯®È·nャ=”cmv˜S„¿Z C5Õèo×P­šˆ¼*¦‚Ÿwl¡+‚¶dƳAZ¨+¨ÅQ €(EÓº·¨gâ`ÛßYŒÍðF7Pîߟ™½Nv“ó§/8uœý,ç¼Ø~@ˆ§7ÓXUfàU««Ã¨“c×6…ÈËÖ]ò`’M¤hº4F ’MÖóãLšqÈ’Ej´­ËjW‰»W Ƚ ù@4¾‰Õís‹çÇS@˘Ä×#}Š­*~$Ù²fÚÞ•xÿƮt†IĶ·üÞCý¤'Ñ6$Z Ó0”‡ÛóÅ»[ÅéM]@9ú¬%ûîX‹Yò5:æëéù›EP2L3R$™sïO‚ qkÞz³?»ê{“ø ñío@CJÛÁPS‹Yõî¡¡È`êàe¶@øŸ£ÒCD-@†ôwi]:(Ù¢åb¸àÏ‚}=–2X»O’×igC=--qäþPZúŒ6Ó]0ܶÓvå7‰ÔEßJ"F*gRb´H³z*P‘&‹W³DèM›”·c8K+àáù´t8]Gø‹ƒ6r~Ú\xÖ\ÓŠw6Ųacá=×¶S…VoïCOÚ sîu¶_¸Vš)–|(}©cšWk⤋>Æõ b1± ­iÂé9 áê ·¨bh¸î»Ÿ`Õ2Á'¼`)^Ý|ÿ?½Å)â3å &AžUg9y! ¡Dz‰™Cûóìó¥¯y<ñ9ºlÄXo²¶òÞctM­kDS.;·";à™olP  ¼Áo¡£;|¸Ž$§“†J5 ‹PPêö6èD¹äZjfÐ ÍTôáûPáÑ&ZÕÄ%PU¬ƒœi-ôµ ±Mj÷cúÛz:¨?ãSOw¬}h:Ù^P“³eÆø¸gú–ºžÍXå¾[W!uô‚˜ñ¹ùBò’¸·Ô”ªÄú¢bŸ$¡×âJõDŽ‘øµj7Ëâ™A"Ê ª˜ôÁLé¨rì;à„¿è;"ÎG q!°ÈûE¶ºû’ôR‹!*·²ƒyñ¦9|—?‡Á²y‘>’y¬^Fj„‘­N™8¢‡H¸ÿ8Í;)©{þù£¦Âxñìà×2IYä¡&MÂîëæ·rs$üIä‹âÿg/äxe T’ˆƒI»š:]€ú«‹´9çÌhähí-¼I¾¹å%„ŽIs€ø,Ò¡Í*@QÝ6pl :ª‚V¬Þ’í\ KºT ù ú ÜX ±Ÿ¬1Ó6)Àe%øRDZtýFýɽ‘2€F¾Hn€; kˆ½²í[Sùº[’h6ì–c¤g%YÆ3NÔÄìýO«1gbqKn0,ž=¦C¨k¼`\¬—§ƒ—ýŽ61´?µÀØN¿MjOîÍ'KýL¦qlÏCBñVvy‚èe%ü/„î?UV­/+³||{I öô? õpÎ×~t‹Ñ-žÒa‰ü Ë•IÒ}A@Ï_íÅlÊ(2Ÿ‡´ªˆ¬— ÇH7›G…]¡ÐK/÷›!ÅW;ÏWÊPîƒýþ÷»2R6Œ@y¦Ì€˜Ó£òx¢—›|÷BÉ,[Úß퀉m¦x1±?k5Ô]i)¦= ŠÕã"ã“-×^%ÁÐðKG­3«§E]Yx1Ï9ÆV¼• ÎbÒ‰:öf…½†Ä«gA°Ä9 -tÄ~2õ_ >eíÒ€ãɺ¹ÒRCHÓä=µý|ÀA«µ¤‹Þ£«2Œ÷‡.‘ù`ã —ª›ñÀ_lžˆÉv[Žo0UÜk®·Ì‚3=¢#gü ^Æ¢M«WQ8•œ†ÉÍȱ«X©6™Õ×cçvLóaÍCdg"ýui>2Þo,b ^£÷‰…Œ· àÊû$“µUIQ$7GìªÏ> !'/»„"bйqÖŠ±=“žþµgO·Î‡ÓPvÿ.û èùÊU_-!"¿ã‡ÑamàÐ/ ¨õûb.Ÿý¬øì‰W9+ìèXb3_Œöáæ9gyf` A»Ê §4<ýƒ·÷Ý•¶ÍÅYUvÛ‰e"°êhÞkSz…1äxŒ3Œ'gê͸Xe¢0íûçnL?¯œ‘̤H¼¦…S(aÊ'µÞüuEÊ|ÝÁÏ †ü2Ãà­vï‰!$>¥t”6a2YÏL>1H×â/: ™<œO9Ý=î-8Cq«³ØÝ~ôb•øŠRŒ.Éç‰ÅÎZ ÛÑlI¯ùòcQ‰¤¢ÜäÑ [,IÕ­9ãgº¥62®üŸ©~šs·˜Ùk‹HC¼Õ5vmž'¹˜ì²Ô6VF“]ByêÔeÚ|ÆW2GP'Q†ƒï°53ßÔî›C™üøü *¨$LÑ9çÍ©²ßÕñÁ!‹üt؇¾·­üM *û ¹í`D´€ §tf™¬oÿ¹´.MŠ)LFæª[%Ør–U)^ñå=úTí‘:uÅ-þª>ûÚ›Bäšk8[»%c.hüøf0 )ªŠÞz7ˆ:é¶Š6†° Î{§–@Ç¥H–‘_¹¶fL)ðVnŸ^ÀU¯­)¾Ç˜Aøb\ÃyŸQ ®/‘…œüsòÔZ éÊÆ| ÍE‚[Ÿëd‰˜”Š3Þ‘Ñq~%œ¬)““zëôð¶“{eÏ^§•Þ¬‡Ç$¿8½Äh —¸¨²]¼HËú¨yÖâÕÕôõ>Ÿ"—A{_DàEÃY;$@Ie …•ù'óZ’lãÅ-ùÔp‹ó‚ºÔý´0izÁЏã±2Þ¬UÝ×9á}²˜À°Ó¦åšÂ[ü0ÒÕËwx+F3¢É«€±›X9À½–Pìå£é´,·Lïj “@ƒ1JBD2åžñäÌsr3Úb€6¸9i¢ÊgóA^ºõyõS”\-§‚¨Ã­åÉËÍ\ˆN¼-µÔ6¶Þý¬¦6NCô(´¼{¥ñöŠ^öýZ³r'¦¿ ÝGä™`#¥é¶'v ÷wHœ&{í1ÙEz¡”K졇êî Æµqv®Ÿ_{±É€ÈMµÅÄ…Âb͹É'¶tzÞÎç%ñ‰R¾÷&Á -¸É^n¿ ¸]MíØÄ( ÛÀ³/ëxëÉÐóB©bÍæ8 ‰g\ù³5³nkß¿AÉ:´'b,C:%zÚDéÛ­Ñ%Ú;P×džXæy¢Ÿ‡ÓiűrÃlÈ®3£ž±ñ°úº*Ž^O÷ t®Oç–<¡o"»äbhqº"±âbãšwI<37ößÝWX9/4Ù§NT›rEx&©â“2õýkC*YCÇ·Ì‘ú'µÜRÌ*š¹ýø¹IºÐ¶£¸Û¹Ô"BékEÈ2‰çr¾ ZƒöùÅå–?šð_º0ÈôÒŠymÙ6z¥£81±é¥È¥LÌç£<¾†fØ\gIª`|ÞE›2;“lQ©mÍ÷CgtÐýŠÿ$çt®µ9}Ü¡ö‰clv#I‡EVå"Mïõ¸ Ñ!^aœƒ[£¬ÔÇê‘­8K/ï‹]ØnÖ5ç† 3¿£°u%§K¡“-si”>èž&å—Ö´A¼e㯾ˆ·U—žòßiìŒOB(6ÝxäN v¾4GÚË{ûÄ9ýš·ÿôçfLÚ¢pŠqŸ؇šRuË-ùÒXû;©ižÍ‰Ë–(&°Ÿ‰jÆ–Ù׉šeV,Ñí«X`ÆâñE·X Ž´CÑ>ðiø ¤+Æ.n ü⪔zoÙɦœò‰…¼jµ§çTȬ²°¨…QØ>ìV¯©ˆµº|%yÞgðúMšGÊp¹3×›º9”Dïü¾¢)æ8>.^°ÂÊ0î}5oI‹ÿØ_ï°h¹Û†’S§¼­¨>ÖêaäwfŸSyâáIÎóaÝd…{ȃÏè—KºÅ{¿)}¨R覚ߴˆíÈÈÄ+k?rÕѸ@ŒÖÆëD¤cÅ¿ã0< ã|žÕ”­žu™êb©à : 0éÈÅ_\ Ôµl5öº/z„_—[hÜbâßdÇ%0@ðÉAÑ42E|w$Êé4Õ‹]0H¢¿–8ò¥ôÒ›™È,îG–…¤Q[k¯¾ ™«§'À"–¬I Ë-¦*'åkšö½¡?2‘E0®ÀbO^³ý¶`óS&î´‘TE’ío›×ó¨ pÄÉSJ<ý–зë Ú‡˜ÉØ'3]us€‡Á1xËMþFå]¿|Ã?eF{½Š#Q/O¯í"“ƒ¬îaØK•ˆ›YÆÙZ@äå,ÂH =ô-$òþ†G1önÀ­³êR F2 –’(Ã2'Ѩ«Áœ¾€ùµÙ;üû‰•|“áçúiˆl‰Oh´!@}‰9P1ñ åàH÷%+‚Cüe®a…—aþ©ª1Å6¡fd‚=‘œù“H,ë|ÍfíQ•9·ï•÷ÿÞ=ÅiâퟌMóGë£ tV¬êÂ_Á‡v‹vÉÁ|£ÀzÛËè74×I7ñŒmÔ¼g3n†‘}Ë Ýo‰u€WM¨ƒl›Pxå`Ó<ÁÄCƒçjMþkB«(Ô ¿ ò´¿Wdº#…|ÑÀÝ PÊßÂþ×ï¤â‰+D?$gÙ|¥Ÿ~/A“ì:äµ³ ’6§Æß·q?4"> uòÖÞ=Ò}|Î!††•»¬!;>¥ ¼,md£’–º…·HÅY‡ªb„L׻ɂO¤] ñuM"èe?Þ·a@Lš¯uKˆÐ²¤ÖÎ4úîb*G™]Ó=£¥;ÚØ—“ËHO¹Vz‘6<‡ züFò%t%'CšŽâèÄ´ÜÆ±™œ~±r ¾þâ;ð§Rk†—ê§2È8ËÁ,PÉëQSÚR±» ¹z”»loå×7§P»KØéI¬W>©Ñ&æöNSE}ÍìëX '=T+Jû&ÃOÓ´±ˆ¹T(úQ³ÒȘw¹2"ãÛÁ=|G½¾šGW¢ç–:j"$„¨—ꓱ.:£ÓTÎÉðã¸}Ô-9í§bEKœ_¼”üóÉ@|5\æ~Ý¦Ë Ò:Ñžàµxz¯±dwIšý@­dÐ9"cÎ4‰åŒñ7OÕÙóØ“lÁ4/Ph!NFÜ\Ü}“?xÕ$ÙVBÅ¡pe7XÝrü¹ Ýp{]ó‡›=—ßRW>Ur"_Ì¢f¶÷&>M7nKãÝ®ƒpQ ÖNdTÄÜŸ†WëÏ,;Ezx°SÆ›¢’ÊÂt«®Õ)dˆpd@,Šâ0'ïÀ¨6í\̓nýMÏgÈß‘«R°_­YÀ¬´Tþ§`çãÂyëÕt¬²ÉãLÑáq7/¤9­½ÍˆRüBZD \ñ…ùìϰɴý ×£îŠðÈîùº+æˆ 1£$¨ò#Òë˜Ý *n²q*Éoߦ@1Iošš÷ùúa Òðºh•(dx6(ß¶Ï‚-mŒ¥ñN‚—â^É2c²Z4L–c-¦Eqz‰ÍkVq~ç¡biù¡rÙcB,¦½C¡¤“'ãÓ‚…Yú&óˆØó^þ0¤©†¶”2‹¹T{Íj ë÷ïÛÔ]ÒJÄÅÕQK.àd°XÎãŽ>ÍKqâíÚy²ßaÒôº*r#!;òPÀ °hEŽ:‹«\y²'Å`›9ó4—`^œ¡…Ÿ97ŸÑ¯óˆ@󖜖ÄÌ7¾x°#¾ôІGfXõ»ÿýÝ«RLZo`&ñ^°©>¥iz+MT‰Üûç3£7õHÖÒ<F / +#PÀÕØ'ÒÌ9D`òLâ-2éUSªd AéûåËôq±¬ãÏ_“3U8ŸÀÓ©ñر]‰fD•>Ê¢î¼C]Zk«Õ| ³=@'dâ_²qlB"&tꤴsN"Â!ÕKýô4ÈmGŽ(?U*¯bçìVNþZÂÌbûÆ÷Q¸Áôæ©Ø3¬%_òª9ÃQLgFF¿þubAÞgµP9ããðθÿyWVŒÍÌ9¡“§lû9ûQ"§œÔ|‡ ~N‹ó—MäË0nÛpŒšy³ ‚ÄL¸ØøŠ&= #M!ãLÆ9Ôô÷‰pþ­ÂH•7AowÐî;̺w"hÛ£ml&ŠŠ#]Â>ÃΦåú¼¯*¸fÇæTé»F¼ä{§ éIaéÍ©/««æš® TÆ!›F…Ã*AØJ*IySï ìSs`ÿâ ÑÃÔ@FàAâ»ï\ù=CÎn€–V+ØŒl]¦ws KCñ˜ ¨Ñnâþ´ŽTÖûr‰éèðÄÖlbN`‚F6Õi¨8bÙ‡ÔhÈCy¼¨S(K®ƒúó{8ƒ/‹Ç͸p¿Ç/*F.FRahÝaʇÝaCÇÆnÊ#6¸´‡ÞÐ" ¡ƒtRüRíİÊÕKPmÉ'ÃùÍàÄ}‰®ïœÃ©Å£M"µP3LL’kRÂUk,LG5"\òœð©v1ÿ‡ÿ¶6I„ÅÍŽZ˜Â_ 1íÞÜYË„­}¼å˜ˆ×·èî¹=–A¶rêÏrÒ×È:ùMLg·ý ›Q>Qn›ÅLÕ_Á'o!ß ¡Z«›et[8y=3°¹ãh;>öõO-x”¦ìTô…ƒnòèèQÕ4M/ùÅ`ŽJ;ç6Ûý êàÕÒÈs«ß3‰ ŽêÄ\ƪcÔY’ ðÁ%ó™0û¦ŒZj%5\À}a3ZÉ“éyàmšM1‘aœ‡%osË2û’EA5›P“Ì%ó·PÈ®9H˜§(Ã@CÎã|°wK¦zƒ$¶¡±‰Þ{—ß©•Ázp‹ƒ¨ÐšvÐÛo¢³o3£?\ÛM.NvEþ´™’ãiœÔ•Vq­*2žü½½w6E<_¯l6:W+¨Ó=œ"á-©M#™>‰XÖ‡k™¹sÌ1}!-o—}ˆÀÌ(À©²¦–ÏX•d\ÜÊ 0ÀŽÞSG_:‹ñmÍE08䋳óM€s¶º‡ÈKÃ2´Rû†Lö¦=3ü¨mã?Í´ø;H kiŽ…L Se2…s´Ë`•õ²™K¿¹lƒ¨õÔýøu}úë8*ö­¤øÝªKoñ°…Æocݶ ¬I {Þרøæþ,˜¼9L2Æ$N[‚eÞ6zß§ŒÙ¥EÆÏ÷µÉò[ôV÷ /2‘â›ûø×[OeÛÆ¿œ§…7à°Xh!F-Üþõ _×®>}gr¾¸ƒÔ¥Ã“†Vj&B[ºMG¬Vz–ðî èý0;™½U©Ú0›´å—»#æ}ÜÖrD½'±ÓfØÐñ‚š»·¯TœnAï Ž—¤Ó!¶óýá33ØZfMTjœBÚÈۻʭÚ78D¥I"Ÿ˜ y T—*ð×§ü_%:jeÞ.C8{J@®Ëcž,¥&R2¢q%jËé6šœ ¶K©äWÝŽã¶V«‘ì1º™VƒžèÊ,Ä7TMsv¤s[ý½ˆÈPˆÒŒqYÓ=(GpãØmMeHz ì2—Ëìæe¼„¯ÙöwTæ×] ÌQ‰XûŠZ]‰:$nm¥ ¹SöÀO5iª4äÙzÝ= 2ÜÖÐóÞÕ|ÖÂåáU‚F9%#Üþܳ­¾ô!nJ_«Ê~ø,uâý:-tñïAÖ7ØmßÌÞ™”Ç-_‘ž¸Œ£ƒv®½˜ËÏúÞÿ×#4Ÿ5ÉVf;ô‡Q'Gò)îX"Ù ³ÆØÆpš¹ûotªùÖö E=‰£ž <‰u¯’ËóylJ’h»?pëkùehê5#G'hæE•‰µóKnbÚAZì\³ - 5ó—÷¬W )(²t9 "Ý&}SW«ÿ$…-'²*ÚV£‰f¹€©¥ïÕÞì$ üA(ª›4j®@ÆMÂ'˜ï0?àq#X¾fâaþ•àuŽv…Œ×m®ø³ý’‹‹óž¸Dtë÷zÒ,jÞÜg©µèvó¹Ä|]ˆÈ?ß6³ÝL&²?ñs¶¢BÖŒÍdƒöÀÌ‚…éæäªiK›ZÐÎF\á(Jsà’?° ÖPx k^ªÜó;–›³ä”÷ÿŽÀ¤ÙÄ"I¨}Þ°Ël0Ž!ú:/®z+. 0Ȧ´Ê×›£äR $ã· ;£è¡·ÓaøÄ6Ȥ£ªÃYÝf«* ðdNéH‘±3iðËõƒ×õ^ÂKf¦JÙ ˆËÕïÖu#ÁÖÜ—ç¡TÀÿI®"¼ĺòíŒJå}}@Õ?¢fåBŽŠPšùø2B<¨‘ÌI(…ËBã> ñ¿êêug©”òþ嘮¢±<Ïû™à‹öÚ½+î™R*9˜(Ù ßn\ßI(»¢Î3¦ C;5³DÙa^VeéãÉ—f“AdÖ%ÞÑ#ÏÁ“Æš[ƒ¼|Iˆ»’ éeþ¸éúåòh<_-Ä/Üy,³±âÔZ”":à;éÑ\ÈÖòêM­j¹ /ÃsÑ:dçý‚Ip\P—+G‰mGqÚÕÏß“#_y*ö–Eoè}HzC‚“´×Weº»ü¸¸%TSžŽ¦æñ£ók©¬vÊâ×h{rvĸš©nÊ›LË2 æ$°¤iÏaˆڌ£á§öì·¦¼#Iz|û.ðƒq±ø¹<ò'xa ÞüP³5¦3LíUÞÐÜûä6–>L3ÊCDÀ‹·©ä Œªâ{ûäÔßi¹»2´¿k=1³CzQÄi”vûöf+°ŒÔReÄgÎæ Œ­£Ê³ÝÃÄùÝ:…òySêW_—3œª<{|x7¤aCžëó¤W-Ó6šËûPO…œ“ÐGKÆhÏ„s•}™ j£i0Í\<ÁFe‰@ˆi{jå_¡ „4ØŠnxÈ÷î¿/mLÍÔæ…f×oûIZu€@ Œ+riQ@ß>«+SšªûÇts2§Èiš‹P·2L_BàJ™¯ŒÞC±páÃÎÍš!y€pÙ;‘·ð;¤ýÚñ$'Ú† P“AÇtn(XAÏÕÉ8õ¶¿¤V‹…·Ò¢ù ï3ógycÈÿ>>4°ì®ÈÑ^]r\š˜ÈoˆóöºL7?-Ö/ùùªdÛ?ÂUn8ÅP:Uv½Xô½Ø×¢Çq,›0ˆ®,wqM6¤q/_-±Ÿpè¡jrŸ%@¸µ+NæR'æâO±ôþ&Ì ü2lÖ(ˆ|b_àw,tÎBåuK¯~·UP½!|¦ŽE¬*â|ýæ™B‡¢¨€ÿë^Ä–ä” žïH]@oõZÖ_iT’PIg3.›Àd[¶ÚùÍÜ-E‹¸ µkºFž%KæZé%ôÎhöÝæ¼iªî,BØ.1x*ÀôÏÿÃÕ;-‰ Ë¢ÍÕ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛî>³ï}šù…ŠÈˆ¬D•QÌn-+y=Ë¥¦™[«A<)ß²µ¡HˆÜ"f6 ô¹À½f¯¡ ³Ñ/k«‚b ¸‰*Ô¢Êßp“pèÎóËÙsß°:~y sœÐ^¾ˆ¶û«ç‘¿ç™DŸ¥ÑµŽÂNFóá‹øÅÍLN2˜´d]Ëo $ŸEŠ¥‘g”°õ¬åßoÓí4Œ;„80vîÉ¥çA†­*é Á1+<Ûÿß-^t$LýmÌ/Éw߇+~4A~º[! 3éÊJ9ôLÛïÄÒHæöBª»”ì`B  àgWzwÁ¶5¬éÁ¼…t÷ ¿iùŽDÏ’G+e¥-™ʬðá«h—M:­d-ns&fR÷>Ò4J‹}§ŠBÓ€1<árÍU 11ovôÒLÞÇ‘5Q†…¹¼tÛñŸ¬G×ÚåËŠïµ)†- ¢y°Jô`•k—dÈ%ÙD‡‘@ßäíNs‘ˆ^Åà×€·¡n@‰AP{ÂÄrN°àŸ*ýÚFgYØ¡`²Ôv3†·švåHC»Ž=dL}âF}þìÄ-òŽÒsÍ¢zÓóPÿs¯rZÌ[92!´{pxÜ$;”;8®'ov›õ‡1i¾Ö‡o+™®”(5Å?«8Nç*Q¤î@Ç¿@—v’ÈMÙ %”1ä…NÿþªŒV»7Ù;þ¬„/S±ÐLãS¦V<s]b;?{Þ¨7#Ô¦3îJCƒUªÉ„¸ *£Ã=Ey;É'Þ9X³îÆ´|\ÑgZ´Y†‰?o¯ðYâ{íeFÙØÑBž/ cBC‘m`¯FïLx;dDø`f`—m_Xa\¡øú¥ÕÌ`ðÄGŒ¤M9Duܼó€8Óy¯½ ¢IãL€CbI)ŠøÍ›}l)ÉoîOcŒóÒ¬-]ÌÜ\•"„O"V8•¬~ÿ'ÚÝįØþ]X;Œx¸ºÙ¿Ô:ÙC\Ó(€'åN¬ ‚Ú‰±»Б&(ìæ˜Ÿ|Fqljfê ð&Þfú¹ORŸ0«ÙŽ­¢/Lw+5‹ŽÝü\æ¶0¨_v0-S¹Ã€'$fâˆ<Ñ1fÞc’ò5d"ü Jdã,ˆµdÀ„€2‘.n>èk=¦Å…•éQN#$žŽhd*BXy¨ðùToJø¿Û î®4oqq‰p¡® å‹?‰ 2Ù%o¾À ’<–í(Ú(ÃK7>g¡âê¬)uŒ¨Ÿ¼c’HPŠ@ !G o\øÙ軑¯«¹Lí¿bÊ®~[û"+¿x=™Epãüû1 ÏÝàDEèÌ®[ªžÒ«"ˆâxc&{]þ’^ì%x´ÀXxO¤µÜþ3Fã+ŸBU^%™è˜“x¸Ûbù¥ÿØ“®Ä¶¶ú¦I<ŸYZå ºGìWvˆß#‘¤¢w7ùeÑÂ*ˆ¿Ð"^&•bÿçÜZqw·(BcÂ.|̨£+?Y¢ Á Éÿý•Ï×tÌ<)ýß¾u`»ÔGB‹…E þ%õ¤¼]pA´]ÅCCªÝßÎAsEá®UcõG£¥Yéæ‹Oe—¯4@Ç¢ŸÉÈóÃ8ÃQ.Lœ<Ó÷–6ÌYûÌì6Pƒ|ó‘Esï¡B»Ê|gPƒ¨-[–¦êÓI$L&®…Î{ƒîý7#-×6¢Ý>2Œùv®ÝþÖ³³5ç>Ók™€¦+D2QØ¥,CoJ-PÒ´¿)kLJê/)ó•g›Îþñ÷»Á’ÚŸÌspv†lOT˜f$s“„ÍÙGm¶+먿oDˆ@i¿§”rsÙ ˆ×ƒG¶CZ^(b–ëJ¾¿'æs²Yst¥øÖ6uÀWÕÛéŽ}é 8;Ÿ¦ÔÀ`ΩVä¾QݢÇhÆéR›”rðÑ ÈÀs.ï¥Uèa¯VÜÃY®Ðn*K½©ò-2Ù´-j¢žÂg¼|–Ff’O“)í03¡Ãâbt–°ªg‚+æåH*ÖpJÒNm„Ž;æ:"Ø¢`†ñzÒÒ_šW"}™‰±/Š*O' j]&ë=C( ³ƒ ƒÔ~/ÈÁzpÈûðôú5jIHÓEža½Ï€WâULà–Gr­1Ïçuþú7Š•&Î:n°Jr4.·½ß¿!Ÿ˜‡6…Í$Á{³ ÃEWÏm¾ºìÍáÜaäéç/Žd“zcž;w ]<9·6{ÛýÒñ²)zêö™ÄA`)9Q˜—»G|xVebF»ì°W&°9!&ß 'ü:ø‰ND*+Ùl-!¯^­Äš˜F“ñT ®ám4u­¥7" 3/o%lÑô¤bV úi‹1äK2›Gœ.{°­ç°> MªÙjŽUˆRU ÛHt¡ Ø'¸ÝèQ|X"W3W/PšE,•HÚ–&=qŽpnü(¨MgèóK'²ÙÅ^W;¥Áò~RÝ\mØÉÄ-¼„ZÂT'1_d¤?Ü­ÃC>É~/¤>]™84zLé¸&/gh)y¨e-!éIJuý¹O2.8å¸Ù‚Sç'Çíù MêÝ3ìÿßéuGÛ tÎËr.Þš{ºl\á!Íô!*÷qnÎb~:7¦1<›Ñ(†’p _ò¬J/å‚.ðû|Pî¯àU³*‡^Ï_•+š°EËÕü²/×fë㡚qoäïåÊßHì(X¶KQ­Í’\ Ž"±¥ú€i­’Ê,£!ås@W²zÁ¾BcšïÝŒ|%Þ-yÞÿ™UÒRB)¯ÈĦ&Å"‘=”ÇÉ÷ðÐ hD0%Cÿt)¨k3ïp…s¾ڨÚ¾^¾Âùï‚ß’›Ç9Øõä¾snZãÎcé˜ ,4ïTœÈë²W9.D˜˜rêÏ/ q†lõde}¦GƒÚü ß‰“È4ô£<ŸbÏ3Î)5zMi žLôU=èå7×ÿwáSDŽk!yfdýl~ík›ßte÷—`p.€ú†ËìµÁE´sD  õ9‡ÃeÅ6¥‚ŽÉãa àÜÜC­Œ Ÿ6ôbåh ÈEŽ)/F‹*Ï‘<‡h‚sK#pX¿õ*‘ŒDºªý¼S“³Û}OµÏâ(¡†‚yÐO‹kÁuJžõR]–8¥‘ ‹ͼ_ß³ößÄ9ã³Ó²¬¥úƒö€A—„ ³Ó@}íãc‚5U&hb#kàÑD² $SÆäKhÁ›…"iÒTíÊjÒª»K ù2ì*ºÍS¸7èžgzzk¦;ByÕi8sHÓÊØµîxV€<‘Içc.]íANúwb±%ñå#çÄ|=ÊRa&ÌA¬4·€ƒ7j{j¹M¢-5£àeÕÛãQ[HÞXþŽ–¸Jû=•Ž6‘Ë‘M—à4º‚,¹Ú5Â$YJÌ"«6ôá§ØÙ‘;‰k¢­4R÷Z:±v¼¯Ó¹×Ú,T7oÞÈoQ23Ý¢»mP†Á%¿Z‚€öÁ=4R"w/&‡ärù{Ù'­0MðÛšÛ[[œÓïPÙoÊ“&ü¤ÜßCÆe ¢«ˆèVü®çÚ±p*OhGô6íèh© ¾\ˆÂ,YòäVÚ’¶ÝTšÄX ûJc%MƒFZ†õ×2’cæè[ØüH²©‹œ¿ò²ôÓÞ!3-îÈùrxû§ Б-¿V¸¼‰4 n@!Çrb‹3ï$rsÊE¥ð+f§ø>õꎊz\•dh“-cÏsÛÕÞê´x~•&Äq¶¶mû>Ú»p_]ã–+hvFÌ¡4£³–¨Y–wK‘m– b1d´çøç±èZÌA‘× â5ŒÇæÖ°înîˆ/>`“ޝøy½‹×Àã·ß¾û|Αš™m³cf¢Äû™Y²1ï+—ž°[óÜWÌ!Šú:ضp™˜‹!‰=8H×MžMSÞå|¬ËÕš$lÑãÝi¼«±Oò»]nïñ·c˜2üZ_©"„-äžMhA¢5~—ã)Ï¥ñð"KåM°-NIÝæ§d+®j,0#Èe+ØoÃòÉP¨ø=½"81ßñ¦%ÍHGŒ%?¶"ÕlyµYèîfY©:|À‚ØèÌ&9)j[ÅØ§ã wºÉɘF’Zõ.Øë†”íÕñå‹`J"©êm¿*3\|DVjÝ€>÷MïuŒO½F -ôåêî aÊ‚ FÛ$Ûó©ó’ÃRç ogu´IòçÕ†™ sÃ-àTG9‹ß†»F¦$íc3ÕÙÖÈÚUíÃG" jÉ«p|B¿ükš›ú'ªd 7IY8üø dÑúlDÈ]R·Šbƒï²õKˆœ+"{Åq$åÆý’âì‚UÃ…ò”‹í]XeRz~Ò0Â; I<ŠðJ€bÑ®­/If9H7ù]$Ù‘ðÅLTºåâlõ¡»º=B+ïØ ¬²Øq_Þ˜.K44Ê6 û1=-1‘gÑ´ °©?[×xÄK£´v3¢YC¿-¾¨>°ÿ4#¢ƒ¾™¿ðô³ ;˜®T>µ™³Õâ〠n?éƒâl"«‘w½ÂHˆËãÕ"Ê$ý(× $-ÞªIÞd¹-Ls-© 3Èqõ}\œÇ@±ž†Nò®-†êÅøóµ ýÕˆ/ þt¯d£«QÔÉÙ„ïw›\ wQäáÈñön¢<ªêÈ?-Ë¡¦Îó³jq`ëGŽ?ðz>oÕ„ N:… ø;Ç%þ»Bb'x üÃNÞ#7„%–“v0õã™ExÿƒœýS[d—×GíDʽ9Is¤W3÷½Ô>§h±v|ÍZ„ íAÞÞ–l;ï]©%÷Žf-åu3™ÝAJd>åФÔ~ZUÖ¯Œ‰úµ»7Pë >î‰áçµˆÔæ¤òjèKŒ–ñžb®Q`š¸>•Íq‚0„¨­5•0ÈΊú-4jƒx÷¢þyØ^ûðÙÑ4 ÜyŸ™f›¢‡ÄvmÜP·À´4¼L1¿œÁÚ3óž± úÏ_^‹KÄ\#’ìY‚Á¼õ“oâ©Ë0-MËÎDÜK:›G)×Ë ˆÜÓPr5õ„?ÇÐàN^™§÷mw1úþŽÚžŽ&Sq)fAK‘ {„™ïNKœ›°6”\pîÁè+kú™c’=%±2~ôVÍ ‹Dð±²—~|›‚²máF]ŒÔß‚'ˆËIàðŽö¤þ(ydÜ0èJj#GIãÖDM÷+ÇÌÑþ‡/ê@j•t Sa<ÕÝT$ÛÕIS`¸a:á±³xa'|W÷B„Ò*ü+ -§‹¾¥³&Œ3(]4ã…ײ$`óÌÖã'«ÀŸ‚5ÝB_Ÿð¿— ƒ*ŸhXgÂ1ð›êLp¾9àZ‚«Í[[hVMÇE\Ñʼnø³IýEIíÑl4ÙÓ¥÷ß߆ԟ–´¦¬î¸§›¹ä|Åd2¯"‘  kv¦æçg%’û²¨„Úü©3§º´ì#õÓÌ(^ˆAìÈ%W,eô93˜zíö l)»k[i™‡ KḬ̀l¿I¿1¸°Õq‘çzÓÏû+Ò<üTùã»)Â.o¬ÛþœÓì›Î^vu©ù%ycZºMp(‚CÈãö   ëQ£*é¤3ØáŸ*  jUG–h‚¸ò1Ä«¿Ü¯úÎ KZ® ƒñ8Îc.Ê0ú±n@ÑJÞª€]õâ†Ôé€Ð˜úhZ½õmpU‚"åB^D Q&árK‡Î;š½B«))’iµnW‘©o>—»£Ï‹‚ªÓàœ)yâšGnyZa€a£Ÿl*l¬õê¨ÌA÷‹•ÓTûÆR§RŸ¯ä\‰zQ,”Ü×Û0.阸¬ìýŠv–‚æ·öÆ‘©ÿçÏÁ<𠉕pÜxmw1".îÚ·TŨ޽HÖÁezà©$PÜÍ ÙíÓæC"Xê«™lõ5p[ÐÄÀ°’{Š;/00övªo½‹äøfx Ê~™ÖdÃÌêõ¾ÌNËëxE±tˆªw¨ad^¥Dûþ)HQŒ„òñå—c‰»Z(iaᶆëÝø+!Øõ¿ÖO7)ƒ¶}úŽ÷;ùÜåm¬Àb1îcY“'EA; ѱ哺Vr……‘0³%|Öñ^Rc/ µ"ž÷ê¡=õû³øåq]Ÿ1éÂÛx˜šÈ{nÞ7™,6}%ÐHðÑŒe Ð{ã0EÙ8k<ȹµ4g•)6iÁïáÙû‰¤2Ò{½‰y××Bø»î1qðÖ=L¥Ëz]Za²ãp=ŸŸöJÔy“®—š®bh¡í/Î\¥mà ·‹YP…H¢—èZ?¶.‚_…£K %ˆ±ÂêPA^MÔ®†gÏUO·žÞrš¤U ‘ˆXaq Z÷Ç‘àÜøð@ÛÙo''ЏD]-wêyPwaðÅ·´+ü³Ë£Ov [´@˜˜;©s”KÔ¥ëøî‰‡qÞÝ|=‹öØmÅ•âgMõª·Æ«‹~lòxr±n¯O°Û9×Í‘éݬhð£s¡”ú½Œî–ð~ægǾÏÇ1‹Xœ cì"aQ!²ˆ„W4ÚQNÌ5ûÛÛ§5ÈÊ{ãÍ•$àa’ÁÊ™vºêË‘ž«6TÖ/y<8ä@˜34ÿ¼i«Ò]aðžO!é3ó£/þ,…œ~f¸„HîênÝ©i5‰gì=-åœô°ËÑQ›ãm®hÝõióý›4°™·›©ÞÜh†û²•lÔÿçšK#©à·åM„¥Êä2–´g—Ø›ª²ÿ£ ÄA8¾%â*ïAÿ÷.B(f‰Ù¥­³³´`3óå…7È\ÏÒ­ž{Š2'íÎ%YE†ëšgpT¨h÷ó)€‡â#-Pv@R<ÙêðÙ¹_2‘r•Áe£{Hrfœtÿz¢vÛT‰Ýõ]KŒO¸*HwbµõPióæc½rY_kb/iÄß „xÇM挾as¬×÷˜Ñœm:â ¿•y3ó¢öF¾³iãc²õ1¿ò) ç,#Lj½Æ6 gݪm]Ê7+¯¡<ª˜K²0{yêG«Bús ½ ‹ 'b6 ~›#õ ÔôšýlíÚ:¢óÔ_ÎÛ¸ [VÖ׃“ÕÚ¿»ìüùT4"?MñL\÷¶ôñKÒ Š£Ö¬Vô弇U5ÅÇ…Å!ÈL\ØrVBíÕ]§šã™^lu¡ÛÂi†ßi/Ü1à¿° ÞÔ˦ÓiMò- ¦Ø.±õ™£Èæ`¡ôõ—ì¦8\@í!œ¼Ó™¤(öB+Ã2dî1µ3$á Ù¨½ÃÙNvõyÀz£ 1ð\áO‡”¦¢`ž78ù Q%\Nýð–HÞ©Wˆ”¯Áý›4*!²a ߗ쬢¤ѱC‡ få¹h…°’ c«šÞ†o¥˜Ô/7,¶íLŸ¿s ¹’nI}–øM;W=6qv·qÊ”‚`±9Óo¾éwé9(´™4©ÀÐ!PR:Ï|Ä~¸(¹WÈà?¸q«ò[ˆl"©öÛŽWš/ô]Õ³´´Bùw'0À‹œ²|¹ŒÜÂÎþýÛi.ã\õL)*7âšÛ̓÷»_­-ç;W‰Ê0r<ªyÓ·K˜’¯N\†²ÕÿÛú?L ‰ï¡ öÔ„8ûc±ÐØ28‰fB[ϲåXs‡ÇûŽ›kßI¥âh–™¤êä é"‚ù4Z\HëHÐ Œ°íÕðCOŸ5‡¹‚þj "%$åÙS}h7™}Àtn¾w)Þn]ƒÅFü¾ðœ|énY ›ôz0rïmO†‰Ô™½Þ†óTÔ†lPÛ!‡º‹æˆpF5²"€Fˆ¨ƒåKÃ÷Éè>È=ùA h ü9¤¡¥ç?^÷QÞˆr?ðZÊ^Q®\¸ÀSÐ…QÄU"sq Z~ÙÂó=óÙµÎ(áE^mœph9ÃSÛ¥¨ÑJ¼IÄ”<·¹{ó†S2{Vtµèª@î3ïSËxÙÒT…]Z8êe^»Kh[IÏp¸õýÐ:ª§ï¹gv–Ì@¤WS…íe_è™oÚ¥û>4•Â3TÃ2§ãUíè0~F±®pÒÝ ”<‘ÎîfNÄÛp_+ô„Z£!ѳÍÌò7_Y:€ºW•Ü]Í–û›Ç£ÉŠ%j[Ìäl+ÅtSH–8KLžêÎÙòˆYø¾+4õ÷Ìy™³#.¬ ñœ6ÂÍ ~¹[iD OȳoÞ`yÁ±ÿšþΗ̫O|…¼q´Tj²–L„ÊV–N;ÆccÙBY¿ôƒ©!ãþÕ…|Í«ÒÄþñì Æ–œvBs;8-7låŠÐçמæÝ£ÝX Ähˆò«0ö7’>È•oV³ñ:)µ?BȯhuÒ—A+´AÁŒŒÄЋ`–s=ž$䈮¬Á MqÜþSE¨@CC<]ßá9ì°„â¯ù`²tÁÃÕ ^õ8´ªZœß‘™Ó¾×ð›ÛéíFˆ÷%ˆïfþQ\ÉmP×O“Ö§Ä£m¸vçŽÎv j‡?Ô*ƽ@Èei®ù”Cè4 :€G"yzT©fl\Ïöÿé`å$©˜’÷UÞgHXùNæ)Ïm¿ÖŸ7ˆ{à‡–sB×ÂBü A%Λ“ ƒöt Y|ömQîí¬_²aà+#æMd8‡¼à'BÆ…âW”2mP¸£Oz¶°Ã—"ÎÝc¼€\ã‡ýê¨$Ë/²y ªlŒöî%ØL¸êÍþø“3"/UÆàXH1œ‡K«X(Q«ÒD¡‘ø<°Ç“¿^&¢eD/4PV_T“Wâ¶©°A“‚æK»Gò$Œ¶›4,Ö†©>ìÝŠ §l{<§{¹2Õ¬ºìNë÷š&3^6ó(?¹‰m`Âà™Mð™%O×OKÃR÷sÿUü\ßç˜Æ°×—€l\ñ™Äïjs!çs‰W-ºSºé œÁæN~õ`ôù¨òžÎ/^EÍ©Íê‰ßA€µÔ«-ÔH2z̵»…øZt¹ÿ‹ïAðɱÖ-üON3A÷JíîÆ§ˆŠÍ˜6‹ +KVÌm3âáÛŽ¦ˆG-Å>z_?+ÚÎ)6ÙÛ ¼.cêÛ#¾ÊÄYÖ&jó6ö&c•˜€læ®ÐÊ«?h¼ð;¿2!löS×ǯ‰åj®sf²ÿ ’Tm¹fi=بš uë”ÉN·} Uk >eÈÄ9yNî/éV&èhꜲ2"`NÒma¤GWvP¶”k>ÄkâS¨ïYñ>U÷ôýé~–C½ Ÿu¨M«ñ-ómLžZÜ®xŸô5ÑÒñÖêªÛgàã†Þú½¦$ÎR4’ô4£Ã§Öˤçêf‘ÔÇt„)=„Üœ¹kÄÖZdMƒîÑAzÞwi¿Ϲë“ÇšÒ/bž¬vã¦ìµ”ÙŸÏýO(˜ÒÀ«ÍnN–é ÌR&ý™n¶",¬´ºÜ˜þï±ìו5÷-û§Ù3Z´I¼£2¹<Ÿuø×Óó‹;¦™ CchB­|ScwëzÖœ›•SÌ{ÆNE:Ü%]Ðæ×¹î›K£îÄÉ^†ŽŠdyRé‚=IFÙ¸d-ÿs‘e5 …—®/[”ÿ(~¸iNäÌ R·TµYqkj9ƃôG'Û×9šŽqáíÓáÚ¯‘?²zßc_òÒáhñPºŠüº@÷´¸ŸAYˆÎÝij&GÈÞŒéwÏßý •¬¡L,€Ë†R Ju‚6eÔÀãAþ©5Jœƒ•!ɹó~ø‰³r˜€Å˜¯àã’ÿ’™)agu:ÚrGõ¤»ÚÏ –,©…ˆwjv貚=Œè¹2v|þæ/ aÞ? ˜k„ñ@? ÷pÊE7@σ.-©o`«_¶˜‹4JXgáX'*A1>J$àC‹ÑX«*¶‘”D‚s¹Ê³ÌâÓc:/ ßâ~5ÜŽ× µ—R1TXR{é{kE–Û®ÕgÔüBZ'l‡51§"€Äƒbú„Šmƒ“ÂþÀ¥>“ù*HŽ!y%¢‘Ϲì´Ä¨[ð¸4hFÒ•ÿŠÕ“àBR¥ú- š0u¸èá8Cªå±‘¬V½ˆ×íNÛ¨ Ìœ{ÔGR¸<íðÄ[4ŒŽéYÏ© ‘ÁƒqÛlÔh¤®¿‰n³Á^‚ØæÝs¯æ5¸¶Ô4Ý Ý( |9QÍg%CRâ ?=ë):82 ”ž6ÞÏÝÖ#\µJ{ËÞ‰1=«>Šv§–ر(Ê‹˜õ&k»ßSISĹῚgÆ=("šUIò˜ü€ÖõøE§¹,çÆÂ~Pæ*á×­xT¸ãz”.Ö@NßlS Îo^—dHFžÁ4¹“íî¿Èê8ƒC @…÷ž2¸‡{63q8ÌŒk¦ÆcsÌ'çšR …ßi¯¾ëmÓ;|™¬y÷‡ß±ºp?ÛýÏ6¥#K]h YšRÄù£­„¯h6VæÀßNnv¢1é_æFsÞ‘–Ÿ9_ pù·ÜªºØlœÉzæ"ºwE/“X§Eðïzhþ¥Öüy—ºõôÏRõͤ‡Ì§B(µ¼ù–¶ióZeA0øÄËs Š3ÞëÄßþ,>ºÒUªÊÚÌ?_ø42…GOÒ¯Žˆuò¡.½æ€¨U¤¯§˜q`™^³未iã$Uü2vÊ¥©,fhž|dvÇ‚Tè¾Û“—{€,W¨.V¡NÔÚ0= B¼×}ÍR–õ_ ãÍþè¤/„ÃÒxØØóÚ½'*)ÜYÉ«(öˆ£„fŒá'IÕé²|ÌšBÎ3’þºþvÕV.RIŒus¬~¦¡}%.÷Õ(2\Z3á3ýÜ‹Ño<èúKµ4Ò¡½E®’>öÿäoÚûͨ¬‹½I!Yq”k\Ð9]£%ÃŒå÷œ×7ªRìm´ \‘‹æ­ž'ÃÆ'[Ð^€yX¸Ê.ISN§X¿®˜ÆŒê¤o*®¥p·ç¬¢˜ýB,¯†Â)T³`ôÚxYާ¨û'÷´ûÝZ˜v × Í«- Y,Ó[z©úåØorGÆÿŠˆ”8qdXÑö Bæ9¨”ë†Ë&‘ÿ˜¿áÈ›4PÚjîåE}SÉ…23ìËe6‚,¨ù½ÅG”[,…ÔB»ÿC‰ØJ/B§T±ùj“ Ú‹±>;ݘ ™ð•Îg]™ e}¸%ßž Ùvç.t¬ÓdÄÇ|Þ…ºE¯z(«6”Ž,â«eÏÛHp—–ÞoÓÛÏÎmœ·JùÛÔh÷P^þïå:ñlz¾¿IÇ•r»‡‰‡¿cÖÑ'\LŒA_ÛÌÚ” Á(YÁGÔ²blšJY2JM„øšx‡Goëˆé#öžŽªaÀ$(ú/ÉÊ:E8NUûAùDaßj>%ÜàÅH¿½Ë2þX¥6W:ÁˆÖ^œ³ŒŽ%u -ŠúÎU᧨˜p3˾g±†¥&Þ°'vº'Zºßp&Ÿ 10%ýÆJfÉ;3—òm4DïrÊСNòKfbº2gÖ¡c¤K¨K0üâ*9Öu¸€çÁ¿oéýn–ÒºX „-FV W\ïU•i~Q؈é/f KŒxu`½Ûƪc¦¸ææøã)|%…g'QmöìâùgäøÌømÝl° ík:ˆÖˆ™´ Õ÷ñÔPø?D%ªC!®r0ÔÌV¨Ø¿‚Ú™™D·Å$'z«SQP€JÍÖNû5rjGõ³Íîωr(4AsÕBŠzA!QüœÏe†%ÐþçJà†—Ñ¥J‘ËÑÕÖ¾>ì‰"ÖcFC.©I„ Ÿ!ƃÀ¬Úˆ{V¾È < .ýwÓ7)7 qƒ”hdVàuûùãª'ãÅÇ”%åGÓÅöêS4“¦i–ôA7lo1:ÆX!cŸÜê+]&k"ì‹cåúf”ïõÀ«+‰ï¬w•€kaFCç÷`S0º$©^rà0ñ—QQ¦u6‚öC_ôÔÉ@Ü“5\vDQ-ñ}JɸêÔ©±’ Ý@zÚuð‡— ƒÆÀµ&mgð†¯b—Û²‰FôMËàFòW{Ö]…ÿ/žQ«=\# pÛ$ P]­ÆËª"‹{€¡vŽY. ÔRuR+Ðd‘ +¹Ò˜:]ÅRxz´#{! }°´3¯À«ËÒ%„ÇvÎ!{V85»=QW\Ö“¢ÏRœs{±°O–èvî£ì’È=»£¥§V šÒ¼8%©áeöcèrª‰3Ìkµ×qË.“Ør¹[ÄÍÀì”3„¹åÉ‹šmž:*ü‰æïºì]ÉÂ; Oƒn«y1ì{…ûU¿—ª·Öãè÷—žün'â¥úKjùü‰‹NaÚL¼'ƒú‹4-¡*¯L!Ÿu_¾0DÃ_ûæ\ìf¦ªv—# Ún~ÖPYTt×çq†ÜEfûøZT FEq ÑVhGcl?í`^Ùb<_-“¸ÿ[çb•ؘAC ]I½ÊÁa ÀYxABÀëð³âÂ¥ì,*¨ÏdÉùZ¤üÅhÊnÊ'8ŵÙ?Ñ\^#Ä.yùÎÙˆ×}}Ô#ã+ínIã’6À»°jZì"&ÀZtýËåº!·®ÁØnÖÛ:¥˜[ÜxYoãu:w½&ˆ“ª¨UVÒ”Åω±ðO'pø“Ôj£¬PÙFÆØ'±*ÃÔ€:tÂ5Ó+DXh€0¶y©[du3€ìßH´lÒùä7Þˆu¤W¼7÷Mñº"¨eA¯d.å}ÐÔad ‘ÒQÊknR­/Ùͱö¬ÆiRJ݉,+gƒÆýß‚'V8j@pœúHq]<ä;<.9}¯æÃhOSvóä 0ήŒ|AƒÍðPÛ¿õã^)ÙMñë­ç*Mļõ\Gÿ">/œ–j &RÄ)ËçŠÛ³„z¤ô¢”Ä `mô±Íè'úž˜Q(ûÅjIÌc5Ï]&ŒÚ¯u‹Ää¦Ò-”ôAcªYKì}9kZ¬tœixo.7cŸè…ó3úïwûع°¾ åcC”ÔavÅ1sœè׎ëM\65GCTÌê f DåÕãuâœeã~ÆÛNÂ}Ÿn¸x–S¯ÑÚwH—€èêTió&£ÀÆÂ ÂÊìvh¶åhÀrúäà ž<°ÔÁ¹ÎJÀ÷×ÖòB8 Ö¸¤ËÛÈ>ĉÔü+œ0Â2=¾ñìÑÛîî3¤ÀEÛÀ±;óÙŒ?ÇLcÜÄ8¼ý,ø€Y¿éãU,FŠ/FuEbäÅÉ‚‹ª/;ã1v)>ðG1Ó¶ß æÎèá–ίñ×£bqïšÔ(³G”nÖÎ(õ®ÞtÿB[WwRu§ ¥ËŽˆ ‰}/Øfr¼¬'G¶ÇRŠ$ëz…€[a,¥G€KIŒüyÿñ£Áý#I]é*bã¡äˆ-:±]Þþ®ë3»¤SüÙ±'ØZÊ;¶TŽ(´éÉ|­‰OTÍ¢ ÓK"£ÙýìLØ« ®“ßz¢\€¬V*£Û…¶Íâ„ëB P<¨¸NüuÅä`çá»i³ NX]¦-Îu­µ‘O/»nJ‚…ð6|€gU& 8ùàø t„ÛéÆdŽC>øš3ñ‡ªû”&pgÄI8¹p²Ø(ÁzÍâœ4+33ìaÄLèv{ä&›ÎÑç”ÇÁTBK˜ó\é‘è±­¤²î¸uP™vãiu™ÝV^mÐT•-Í(dR–§’ªsý¶ÊMìPü"Tùz+ ƒ¼KÍVyüꇥ ƾ¢Ø1ÖïCÍ-â~Ô)1/œ«4tØšþÔ;cûfe ø˜yÝÂÃATà½Y ï· Ô~™š‘'ÀS©£1)›Á)×°"ÂrXÖ÷Bâ8ùôX™ÖMýiî&,›!e)g/,@æjèu4 4æ \zw¼Yå ¡“†±B1Qy -Û©;ÙDi«öeØmÜ:©> =G—ÃÇ«Í(Ý´§Šðu0O$-éðÔH¡¬ +©¦4†ª %:µ¼3 !Âs·{ÆhY&Ô´Bg¢BsìoØM7ŽYjÜaê5vÀø%õVc¼ŽXë,PJ‚]·mUhÁõµìx6Ãd¢PÏ„ ±Ç4ôÉè3ŒòÏTvÈ„|­½c_WѶZö«ŸNw!Ž'N°ÆÏk|½J¿?K¬ F:4°)™õXW&#äoª}ûÒÉò£ôË£Ðtë­_´-îÌ àÖ¨ßôÌOdfàù>˜EÔÇ]—÷Å?¥ÿ<ä˜iëÇ8Ò3ŠÑ æ—È Nä/¾†žÝ>‰¬´¨U# ö¦r¨J†);×xúnªNÑ¡_…Ò¾2yª+\ŽÜÞÿ͵4BlIf >6¥æïÇJ³ŠÔM'ªñ8ï‡4Kí«>F1ΑKÇ}Û1Ï¿ÄDÞFK¹èÚÚ§t1«kÑúnäõ‹>P)®¸·„LˆEÚÈØ°‹¸aK”!³*™+¹×Â8Þh«òàK}O€ŒåÙGa3úÅ®ôJÅ&´G¶Û¬I-“àâƒU_U®ó¤v n½¶i…sý«iZ H‰'Ýš9=A¨#C_‘¸9°´#JïáA¼·v¨Ô!”Ô¬} ãíæ @Õ*Ÿ‚$2˜4kL÷ž(ÀIùw“Nž…½ò<}ðtVÞñòƒʼnYPüté.À1õ/ˆ5û!óyÅ;h É‘]=‡%¬úaä߯8õ»Àj“*b5Á/êi“ÇÜÌÚe78hâV^1}¼ØŸÒ„ÆLý™ô·–›þ Ïr]Ï{Z_ßÿuÒ¿â˜i…d/R–Éøs*þÜ%Èý+¿Êí섌5Õà¼ç2hy5íÙ“¹/ˆ~ :ô-æåó§P…L4'Øp:@˰ ùð £êé±JáDD¦Ï´Í*>>ASuÄÕÇöbË3ÁÒrëìIHnC\88%µ¬À®Sy³2"³N‡ ÂÆûT†OÅ…7°ó-,¨‰¨ŒJ?¤§¦Ñ–x£  fXâ(§q÷YíKF¾= P p¯ù¸/"n8Íóh)ã Þ4pgÝ€æÀBë±ÅFhˆK¯J?P1[2¡ 7q³P\›+ÂJºtìd>ˆóÔøeb “n·­³Á;U#@NTð¥,ñ5 xã\ØHžâù¯¡7T®1IZHiN¶Œ«K À`ŒéØ#¼÷ Æ#!iÝ­àä&Ù Y<ëŠî…ïøçùš¼ªÆUc•êí.õÚ3ÆäG%7âGº7²‘CÁæÌNI»‡üÎ,²)¤Å\úH«…פ [VÍ>z׌Ïp$"«¨ÄšϰÒ:p‡‰RcÙÏCîBƒf1%Òzô«­—í?¸¯óc°ó–‰æ“Î:K£.B àŠW¤q Ošªª ±ƒŒßº²’#ÝQ~Õs!u:Þ£ŒvÖ+±2–6ÂT³ü‰ õædRÌmaA—Ü [Í´W·¦_°²Œ+žýD£ ½-zÕÌÂy~â'OÝ}|ksj#”T¥@A!)îí?ÛOÄ„^gQ‘Ênáueï*e+þe»!¯NùµÊ«­tJ~\BuuÖÎÏŸ-ëNŠ×½ñЇ(¸è ƒ ³GSËÖDu¢››:N/ý*…clp¸CÅãཷ5×ì®îîmÔ7×ãºÎÒHÛT³S+u¶Ã0—)Ú'*Ï)áŠýÀ[ïß3ƒ_¯‘´zODg©x*ìý~›‘†|Ô®á‰Q ³Hícj¿ùÜî`Nx—Ñ>ª-ÀÇ_ÙrÀ!#/^ÍÍAn;aK+z#º\•1ˆ Ö%8Äx R¢M¨_îù±;79NôPh'„¦Èí³GL{·@ÿœ¬tÚC­X·Á•¬ÇcðH?p»l¯W¬ô@§ÉK’ãàg;„/ƒpa*X/ü‰ÒÞJÒÔÊÌùH ù”Ý…ý÷¬¡?@°Ù ߯iL"oFJ$…?)/Ú=Ð.šˆ;ÆY¥Y·"†{FýNªÊ•帵°zIõÑ<§Uñ´²šU4”¸ÉnO©ñ›Ô÷=ª+bPËÕp@¿¢ å^>“²!áÃýDâå8¡_‚‚Ðâ@ ³g^Ðõ ‚½Ñ¹p±¯3vLB*ñ4çÜKgÓ:q ÊLcMÅÐ…NܬKù’Í™UñÌþh]âþmNÞÅÝSŽÁg¨1ò½Ím.”•Ü8µ3ªŒËHk©[ë˜þÖpVwš˜'j@/}UάY[©Íîèµì÷&3J«zÛ+@'¯F«íAFK’Ún±gâ£Éa Ì‹€e:|É{ãKWAXpeBØ»wÈ媭ãO/øÝ¢ÉgNÔ“{}&|aŒX\”_ÅàOí=Ë(S{Ó¤¬0í¿w6Ö ).=j %r3HÃ0þWñÅ9-XºWÙ÷{À¬Ž9+]Q.[UÛ:ÔoŠ•´´ªýh¬mB ‡åq¸‹WÖÙgÌ7ÙGýÏ5—ñx꿨UüÔGCLܨǬ‘´“Mñɰ_ÝÞä„Xwô9Oùò?@«, às0à H³7ÿ\Æ7š‘1I‘Ãf¼˜Õjoä˜]jý®¤fÁ¹„Þ48+ ¥²;Ø@ƒ;G¡3ú3Q İÁ-Å…?tß@£NÜc¤ ‰8<ýEí;+G†±u¼ÿÊép.ÌmA¦4 ¾pü#}ï‰ñÏè0ãndIEÃ%æ”–í/c䨕ï¿ëµ´_ÔP3:Zœ (Ôo‘y‰Uõ·þ©É TJòëóߤ¼ŒÐí{Ëö¿iƒÙc`вZí\[óÏÖ:ßÕ:9ho»¦ú~c8•XÉZ>ˆ˜kä vµõç<¡+·_Û¤”ÐLb´Ö¹š_(Âq`”Tøé±LÈX”×ãû Aî k5Îï–•õ.žìÑÉdß $v¹O8À?è–t µúþLe2ÙrûsAàé±4øBZ[æ^5iq2û5£‰f¿OøéòŒˆÕ¿RüŽtšé3¡”Æé\ê|Z…U=ÞyFC*Z03h¶7Øÿ6%ø=}ü6!cfs‡&˜C’ËûÝ¡bQBMÂ’NL_¶ò½¡·w.§@Sêÿ¿Y¦÷8ï«©DÒI‰€š“›Úç³öR4Ùí–è÷ßû¦zô|ˆhä[µ¯Pƒ)|#jŒÞËÏ2hÆ9ÓXôÓdT?Z)p­eÀÅtØ×';Ãá“Se•ÒÃŽ]–…—ÇW»Óºó#ìNrJ¥bâK¥~×Ç…ók o|QÈö; bò<ÿ Ë3í!t=]LIÄgÎââ¼ fßß¡ñ‹©d åÃð‘QÁÆ'±£ð´×¿uä³›ªËLwMÊï@’¡:iÃl^ŸÂúùiéîÑ÷BHq,O¢ú¥;É,&.–#ÝĽë5RP,`Ÿ½Ìä^ꫲ¢·Í]]4å^l¶t¢×­¡‡Üb42†ºãלtm{¯ok㲆¦x¥³îhì¬.™7d¸HG<ÑW¬`ï]ßïò|/Ÿˆþ[´0‘‘y„¾ã×5‘†54±•ÖäüZpâ,/.<a±•¤PÊ+Ž}ò¯µÁO‘`ÏÀ_uŸ_üµ1+*=Ñ+:5°‚œ§­:zÍq@Ãö.?¥Ñ.£Š[ñ>=º^W9–ÑÎñåNS5ÏäØÌ/*áTL·­P¨^¸ãQ?SÚ"´îké*Ê­ ®‚‡?N[lÏ™v†\±~£Õƒô…P3wòëAMå+2¶­Ê¯®¤]«9Y'ÄM= À:2Zƒ{êÓ¾ÑCJ>Z¥»x: f¤×¡$@ÄÉÇãP„SücÎz/ðGùƒ2F²ŽšvŒ†1«&ÔXyÎÅ&È(æO°øw¿¬×ï}ø·vÚþ½Ñénã› / ñ¢d¼¿êXš¬ÞæQΩ4pˆø5 ☓Òß3È^ŠMV>ûÕ–Ò‰PëäaU9,¯Wn ç.Ñ{%FˆÇ-(» ˜4dìJÏVU7CÄ òqè±-J¸‘ä> VW|æø~ÈÇ3ZílŽ&¬,nqÜž9¤]êïþkƒ¾/WY#v G6.JEÓpŒ(Ð*°Jô¨R¬ÐxiÃC1þ}™?UhŸ’…rIî½ý&Öºú&ƒzšÂúæÝ7è4õª3„²KÉݼ|(ŠQ‹æ¬çà…é¿|S„Gèpÿeòö`\—sq×*&b½fá¿s) é7üD 2, ~P®èPäýíêya 8 F:U†œ‚z¹jc0ëzµ¼Îö•ÝÈ¥`Ïû›âýFs=0LÙ p öûê@ãŸñPµÊ™Hü¯t 5‹Le[ê ˜™ÜªÓE–s¿œ˜G^ ªÓÑ ”TX_•6õé4“ì€YõdÇ…ÕÈ —Q–]dÙ—P6²«‚´âTžj—ó¼íÿ„[7ž»íyLº£[6Âõ]{ÊÓrìßdáãlÏwÙPø[€™„°ß€þx‚vösZ“ÞO¥öé†/—ñvU¾9s³C«+\—iàÃÀE±üHŽæ¦?\ùTq Ôá qÿlnâç²1myšx$OóDÉBÌɰzÏîHÓ‘•×:é‚ñ'p}èuÁ–‚?ÄDð…ÁÒÓx¤Ó^>ŒT­)T"?4’Ÿ{16e¦ßÀ-HÇkÔ\[þß›­2¢‰béc„ÈAW¦ô#½¹@· Á,-›«¹—b³ü¾pšä|@ü3&húÓ=cшäsÝŽC…nFês_Ùý©}_(¯Å))¶ "˜°¶I—¢°pŠ—('Xz¿ qYgßÂÍ“JÞÔ5I Nü£Æ sšÆË†Ìhλž–æ™G§"‚|¾Ù®V»¹»VäÆ5ïò7¿÷‰§Ôxé?ãµý×ñ ¸矚àúw„P/‰ßüõP†sG‰;!”ƒÃå<ìWÎQN§¹ÿëû;þ>{wÚªÞþæI'à7³FÉŸâbˆ®ÖÌ|"[=^Ïù¯0S²ˆHéÜ_š‰YëC`®ïT“<¡ÒˆÙÃ$èÙ’mÅ pj¹('~ÎÙNÜ9xì€X” tÁ"ÞÚfLY\0ý§ët’€e¬_G:É&ªoÔëÜŽÈ­?M¢tûÑ9­|„Ê4Ÿ- |¢KöC^õ—Ûó¯ž_Üõ#é_ÌiFâï¾€> stream xÚlzc.]Öe¹ê–mi›é© 8[ÖüûכѼ/jDNµyk@Ü­­¹ðLU{©±°Ê‰›ƒRVî¡?(w×rV¿wÈ`;%™ÞL=¡›¨hr¿·LdÖÉì&ÄÄ^}Dk+}>ñý³ã/Nwn‰˜©ƒWº8©¶ncóΟ• –‹)³©#³û—nJsOƒ"¤oëJp{‘èÐÛÏW<éE`¬Ï½HèRtÓ-s¼ä­»÷pBÊ^-2Ô ¸8ÕÈÕÞˆ)ÛA”¥îªórÖ¦S••ï‰Ò×LôeŸÎr®öXR·Qç.eÙ T0ŒòÉz^Š,8Zl'‹pC硘$¡Œ_,Åéœçø@“AIŠPWvZ+¹kõ›]S )¦¬sáJðäÁ;”«ÖýB¹ÊC·W‡Sf³¿(¼u “~ë{—@ù~—Ó›ÉEˈc–.} Xšƒ¦ßéÇJîäwÿE0$joPæ‘t)Oø´Ì[÷5ï¹RBÖ©d¡ÃWÒý6¨´7¼±ó9íÑo­rÇ~»ºÀœ9¾àŠÍЩ…€}ÃPÈìÒõ˜=eºA̺,÷å,é¹›Ñ@u¸‚œSíÇëuP5 _ºÉï6ÐR¢p·)yI{Ë]<úqN*´Ë1·ðûöîSÓ$+¸/øCÐébíG¬ƒÈ_>ï‚e|ñè ’,k?"ýB¹™Éá#K\Zô$ KÛ…ß¼3Hê‡.R`­+Õ¹ÒíGÂ#‚P&ojˆU!)ûÐAâ”ÀülwÕgì)ý’À9#ìÈê}˜7òL¢„v5d_£"Õ²ºMôúË UIcS\Ûú «±U¯÷ñÄåOÆq÷·æbŠ—%ð¹U8ûžwµ×&kL”МHj–;›È aOÓ®90‚áb2hÅ×í>®»rÙãÝŒëò÷uI²©Ahjg‰t(¥y9¥y3‰`‘þu°›Ð[xT.¬>Ø£ßÖåëM†¯¿ç÷t&qUÂFžíAÁcÚ7ÚÛq›ˆ)8=ª_¡júƒ¨Œ¥Åª›dnþì2e±ü)bÔ«|ï´/Š}Ǿ——en"%Ï¿9Ûî¿þØàBmäd¤ÂÓ•-B|Œ©Ê4aÞ:¸DÌZKqO{†-Œ¸±àZÝ&ÏÏmážgÖ“!åEŒÖûXÐ\nBo7æK´v!¶†x$÷p†ŸëÀa±ýëT,hsáoXxyL¿D­Wpœrë:Åœç\À›~W´¹vÜ+a®–wç¦JÓ4¸˜ þÈöø ò2ž%g[™Á®ÂJØ¿ùédÓ}«±ÆÉ§ÉEæHØ…0xÈòÖ®œ#ø›âvy~73¤-2—!à *wû…&Ø®Ñé ´s,õ o\Ö‚dÚÑÌÆ1 "t£ˆ£Ñ¯°E‰®U‘"H%¨À¼i·ÓÌí˜óÞ© A##`’›ìA Í|ÇAÓÁpˆ-­Ö)îI7JEÛlv«€Sÿ-ßYÇ žµ\‚KDüʹ,R©‘‚‡¤¶0†f-e1`¾Á©õ\ ¨6ÊŠÞäæó,f±EãkûuŸòì;°)«ÂÄ¢`î”W"ÍØ#!àG`“q1ÉÑ”‚ìõFOÛVBò›[ꛇ3"¨`t< b³";Rn²)ÛJS0í+¼“ðŽ\+t1Q½ &a3¸b5ªwÜòÒíKÆä©±Ì¤,¬lõ@ÁÏÑIpŸ¶sz—0Öº6µdÿó{u÷`Rª"ìY]&DÌÁ Ê:Ÿ*jŸò‡óSª¨•÷ L¹ÙΡXà™ƒ­“ͤ€6b5oN”º4è)áVíË [ð̲IÕy'Âà‘q4eƒôv/ßE“Ô@VÙ«y–æeˆá¸3ªãø’¯ÚøäãVÃdbÿø¨Àó@VÖ¼‡òLI$“è¼K#¸mž©(Ò$¸—ÞfÍ¢Ï<:Tñ®¼×VɲkUÏGù»²SJPŽÏØE³¾Ú[BMÓnÈ›~"=×^Mp~{¼3Ÿm›œyõ$„Ø|»‚ÖïòDª¸ÎÈÎxZk\Æø©Æë¾!Fþ#3ƒÑžüæ¢Ô$%{¦)Ã>çó(n£ Ñçô‰ ìC:5Úv78fzë²JÜò&/“EF sþÒ ‹1âì øÞùO‘Þ›³ÀªTÏfuOÝW–÷ðZÚYSkþðü<ÑЄ²(zÅÒÅf;`;¬)Ùˆ4£«7 àä¨P¿ßßC,×*6е}÷4lt˜4®O³âÓmßAhc•Ÿf×Ûuø$öø·T [, ¬¤~³Z›\œ¡›\«­ËÜ/* 6rô¼Æä !žøw´ZVöâ$h¼K‚ûó}‡AGA «³e‡d~tÔ»4=ë:È^ BrT˱‰òÉë±'÷4/$òt'[;ÃY'L+Š‘Š)»e ÕþíÍq;ªí­âbcÃøy1À;¿J4r²¯]H8ᬸÛ<¢Bá]/.&òk2J!]3»É›&=…ý›Ù@Ê>‹ÃQ€Ž/ Ï·0”íV5ÈÙø>„/ã¹*ªKO›³¹»‘ÀA&¯-SÊá¤é„9’`Å­Z ¾ÝÎ4”*Ù æèPûTPdˆÍ{ÍÔìD 2°ð•ñ¨áª0«zF¾_¬ƒìñÆà²%SΑs¤|%WaZ€Ü»;‹'> b,º^–6ÝQèÃ#W yé·Aé$ä&´b§ ú¦N!ªÒ8 b=<"¢M”RêåÝÍp¢®šc¥‰©tø,OûÚ€‰¾¢Š:¾9‹ š/?Òí·ÓpÊ씕çóð¬ßØÚ‡|_0 *ãóäâ©QjSÐX €8ŠvZ ùSóoĆ€ü ¥}KQ†¶×ýÏî¸Lßvf¾ç@Ïà˜|kTæÓ ô'¨dà3<”걚(7êóöWÖ·Þ8‹pœãë{³Åë+qÝœ„T£ÑXÊÊŽÏúuG\tµÝ 1i6›t|Bé¯dW1þAZdÜž8[Æúl¾a»î#CFÚߺH‹ŸTwùÉ\¹í-]Šƒuƒ¿§ùâ:¿øÅ†ØFg33W¦WRÖ‘ÌÑ¿¦aU2Õau& ‡{iÌo¼G/A Ú†-¹ÜÉRüÕYƉ6ÿ]†–Ò2TÃÑ](t ñ£ø˜fIÊ Þê´ý~$Ë ŸÑB¢”[çK±gŽ ÕE(Zû°‹‘?ùøa¦ìš¶Ûiåá/h1ÊójdjþFåãÏ6´RJ¸ oÖLiÞ²ŠN/Ú("-LÈ;wHA'±ÖíEuI—èÀêjþLKË Ü÷ú N'çWt@0¯†)Ôkž¡Cpïãyuó –anq÷Á}éád…x>Hg˜gAn´oÈ"÷¯ù‘÷ý˜‚”råZZÊÇ¢/5²«á ÌkM@ðuûÞÆµÀÚ{¤’F¼Ä¹«+CØy©¹œŠpEƒuvǵÕ}Tô£ 8³]¦C]Àò“3±òÜC¸ÚÝ!¤ù´Ú·ýKT}Ð:¶÷´eì9dÌŠ !T`€ÚÎ^>`´ë¹ðþøÖÜþ9•Cµã`Àñrx³.T•Ëi†¦OÚ¸/FCg—Ï¢Á· .àÀ¬†ŠÅ§Ÿ½Vjc´«ø’ØW v_ŒâñúÞsÅž’T­WG9FÞÖEpÌm¸°«4ܪȱ¤ößü™žÈX©z¥ó¸òg'å-•”N:‘ë‰[uf‘?˜p¡¬}†Ow´/b¼ÌÜø©7ÏSh¶Y¡#@—ß›[p!J'r{ *çÚRúvӈћá!!_?À(mg‡HX£ÎSíWw2|ÎÌ"ÄúfÕ¤6ä#üV6ô³¬”'Ki[Vˆ–Là„ûaœøCûtʈ¿˜®øÛ`¼NQ­X~Qž¶6»Xóq&µÕËå‡EÛ‡bÑW.R…0åÇ3¹ÚâZôŒJízíâ[© I HqCsž“aËvl/*€«5òÓÅæTªýöÌJ~8ØÅŠ0ÁËr¡Eµ,+ý;wB¨ë»Üx ~Y¹gÇK6u]U.Jú¬¡þµfåâ9Ú±ÂXýËwØ•„•ìƒ~ôÎl%å×QÑ”^(‚¡ŸzãôȽ½G¥§„ðäÆ'lÌÈñë·ªò©Y\˜kG-êcAáYˆ1´ƒÍŽ¿¼<$Ÿéšˆ¨ô^ÙUʘ,2C?§÷›)¥ÌX"Î)ä¬oÅ'ñ’¤ë¼9’O.=~þÙçú³…yvZÂ.aáMYO8UºÇÜbÙ¶j W±ª(6ñœ{»˜ ày¹GoÈñÒ¸·1dÞ-üÍ]ÿ°¨&6gicžt€w|ÿäíBê¬YÖ“Ä% 6EååáËZØRm“ÒkÆfÞ©P;"'~t墟Þ´Ïõk§x¨Ôçú ‘áo>¬ó%Ž2mˆa³Nù4g¦¯€T®îw)gz9V:œC`¦N®•c "?¥%^ˆ¸Pw1áŠN‰¬G[¾y1[jÃ<1ïWVoa©wÜŒ p a ëXÐÑç¯#G;áÅÛ>» ËÄ×'ûͺŽ_eŸ÷ŒŽ 8-q[x}3‘ÉÝñ Nj–ÖìpÝYþÅì¼èAi‹»é­õÉ}ÒÌš†Àd²€Ëûoë¡ ¬}5 ²™²25hŸ8s¸cÙö…IÊP0dåÃ%š†ª®Å0Hõ4¦+kåì¶¾âß“.jµßråä&9_Â{Æ·œäÙ:ø ‚JYâ'”5ÔYªÇ‡»À=[I0$Í Üg,T9G¯(ß*9N›~*ĕ¹§'ü¼£1ïnï;ØH@y”ê3"–Iák Y¶·°ñ7ký„"rN*´d’oŽ0$ÆèN&7UêwZ~®Ì쳓Cè‚Á´ëG$•÷[å˜xðwzJ|iN¶Š4—@FBp­JžD³ù@Ò7¹mßý[#uEÇ`»ym²Õ.aæz¹ë޼æÁ¡Hú9±•5(”G¿«£W,$yJnUHìvFìéÈL¬¼2oªÑÁ{æ`ÖKê…+—}åÍe…ê¸À+Zs‡IóÑ”ÑbŽªt-^Mð¥ÿÈ|»ƒ4˜Û`ž(áš—¸Öx’e;¦fál'Þ+-_æzéÂR„©OØVMå”B³ óY8K˜¯î¯¥ÖO–á­º8ýÈŽP÷(ý#ÿÕ[ƒöw?5«(&´lÑ[’”Ø33tª ƒ‹øÙ„Úf „Æö zéÓþú̳ðÅúÅÊDðÉ٤莅¡ì K¢œz\‚ë¨ã²ìšÔîlSÔSlÇ÷FãÂÄãb彑lË,&ç÷ÃóyX(”?nšžï~™è=±vä»§ÍÝᄨbßú$Dã@ºj#"f ”TâúŽù7îh5ÕyËbû ,D‡½ ñLÝcâ,Ö!'.Éjб$ìk4×aí•_lrÍ èôĵ“ÕAŽÃ æk>l³>1¬ÌuøP¹xŠí;qmãYâX#y/ŒuèÚ™W>¶àj?jg þàÝ3¢pL(âE¨çFù`c—AíQ=oᯌ.͸U®+ÝmØyÜûG€Û‚ÉLß'Tlº^í`:8Õ»A¸T†Ñ™4.ž_œûd éFŠo/Ž©x <š0Jêƒï™¾ˆ‹ ™ SB, œb$,–:wè·Ó˜.ÙT†¨“¨–GÖùØžzê´Žs‰mѯœãd ~žc sDx3ßBÏÝ(3B|ªhbÇ:‹Üx^‘Å“¬¥E¤ýÕŽç׿FÞn÷·ËI—‡flR‘YÔ¨ V.`¶c08{2s%æš È·]° ÊÖ£ ï ­›ì©G'˜šT‡ÖõDü(#ÛíÕªô6 9Å˳Ñÿ¨øœn§ ) ãhj0ÊK•;ÌTózË­¶U6é€h ›Kl·šË|¼îõÑ_‚+Ëå¿éÊ`í<Ô„¥Þí†ø$—Å_(ñP¾ÄN2U´±WÆÑ€ gü±`Wã>½šj>•h.ë®öÿeiHõÝð%ì­Ø÷sÔÅÏGžôDVü•<¢\niLIŽ ýl­¢ž.ÅÍÒqS_3+Ò·qµ5 p…ÇU³¯ †f,xÆ´=>p+á‹‚Xå#¥&ð°Üä›o rc/‘í¹°^ú®Ò0ìg‚#Íu$–ž# û›*Ã}ðE‰ñ]‡ÃÙüt(¥þ 5Ïh×-IåLt†~R—/Øï'j2â*h7}ÃÜA•G‚û ýIT”î!Éã3Œì„e ³ QĘý!…òhåä;ªFÏñå?Y½Ð\U(fM¨xjé`ݧö½>cjÍ2/(3ÎNV;ÒVày· ºï,)êfÀ䱋Âs¢Ó¬‚X‡s-IBYó†ºå’W%7?ŸÑVPù=j‰A]ž:|bÒ©W3mÎ⮄|C5òŒ¢>–ù×M„Ù&'%'¯¹10Ø$n‘Ws|‚™éPi‘mAÿê—¤(kÖ×/‡æ©£ßzìBViV ¿£ „­‚úònV¾ÞÝŠø)FuI3"‹šÍÛc;Ÿ!|d¸1&X„žÖ‘F¶è$"ù‰xn7×’|ÁÇŒõú²©Óù@ë|„öN1svÅ©ðç?E]¢ÈöZÒdÇ##¼ì<óUÓ5~×Dä¹Î}¶´yt¿%­„VìûLEñY >/ª¶c9\zÇ(¼Eá_gÞ$«A$‚MâœØÊ(Ë¿XÓ½_€’Ë<’à¡ûÙ€fÆxÕ¶3ý&©p§;ðM û3!4Ù«”%|vï/ˆWx¾pãì3ôTØ(T‹&€ËÐT¢'Ï&Úõ×RÄú|‰Ö§¨ZþŒm²{Žõë{R‡ÉÂù=T»‘òÒ™’öT]üÈ Ä2®ÊˆÇ‚øci^Ñ+“­ê¤aÿHV¡çµå c¥þK”é‰ù¼Ž¿ ‘ý¦y…?L¬ (©P‰’pnL™¢> ׬Hó‰ªú]r:¯õå.Vd㤜\ØZ'r/QGËHp¸{Š’u6)0è/ = o¿ÀQ!C•…ÆRšÑΕ|Þð#„&¥¢͈:ñf™Ð7×AÅöZx7lz7~|z#AuÀ”Žç V–­³P´6æ:µ÷‰ƒÁ¸?RŠ&‰Zeo…k-/DKªK¤ƒƒ2²Ã1!ïÖd’(e–¬dR^½ƒòÒ±Hµ èÝ*¨ò0ÑX¥ÓC²ú.ñxô’1½•!¿ã¾ãf†(/žÇ ,³å…c›CV¸5Õ|N”;þ»¨°ÆfØË#8W:·7%ö廸I(`éÌ›¬,a-Qæ€4fÝñ·¨Ñ,²Ú,½ü/|ªý‰Õè?µæ:I"°WwGŽ Ý _ílZof' ÷t5ÿUw’µ¨h+Ù¹b»€Ìž¤»KlÇà˜Ô^ä0‰ù¤úè6–¯+²„µe»JFŒ e3Ô¨Nš|³Þ"o ô9µèo^ûï=?“DåÊnvUÆD¹¹¿á$qI1œ’œ¢3l[[ºLÞ¦]b•Æ9hDp©’Gq±0Ÿâ\!9”wSˆ#ÄsñŸ³¶V«Þšqo³žr°eÊ]p ?žuÓœ<³© ?%Û½ÿŹrhžÆ–~Ðgæ‡ÏHÝœ¾©G¥úÒS3ÄËðûÍüÓý±—h’6cV-‚“M\þPËáú’ëø/…=åG kᶪÎc­±LoöÚ°¿Ò¤«iÇ8.8ÚÇÑM›”ûôNVvZ`µ„ ,DíqKûúöè|ßñ:\Ê“®é ç¶O©=öíà1ôí³pIÁ™'‡û)€½î¶¢ÕPI[Ü6¶a™ ·}O @Ú£²ÿØfYö¹"¥}bóLûtÞìQül*ëÿsPwd< ƒ¯nÉ´dϬ);ÉÈÕMÜJÒ¨<©T†SÛ-PY7.>.tFŠØ»ˆ~u&|î^Ý8®3CŠîM·$ùr¢|¬ýˆ|%8Gl…\‡E€Â¿ð;¢f¤§@RTT•'Ð)ÄYÚÚZ"/>¶Š•×ö6ýá­ðÙ~ç ¤õo ÈýY úãýšÐ²(§*»¾QïÜl§Ì/ßÝYN4©þT8SÕ›)K”qm”d!ÇÿÞfÅéìe8Ϙd%,Ý|©a0‘¦ãÊçºL»› ŸJ® ïÓ'»Wtx¡+G!¡ß³8¸É†å<_½“tðÇR³D<Û[…HkÖ"ÀÿE™©XÈ›iÝqš(Ðn#¬T…k}o©#ÆÈ Zÿ^¡€ åhe`…m_äµZt÷EÛ †"VÛ^úï­»Apˆ!xŠHBºl‹üƒ×Ég9®Í“Åè| ¤ 7'›#•%èd)ŸïíEäW¨ ¯b>²{n-‚ cØÜ»™ê߯½¥HU¿Í4yÊ÷®g˘y©n½®þdåF{¢ é0¾é®á¶ê3ó;'ôK¦ü‚Ÿ£s‚l±Kãí(0@I€ÙÝi6Ð%]9ª,ãå9Ûzë¾4&ã6åFÏ.qÖ´ÓÕ:P%ÎôHž¤äæ£,hIV'œ¹ž€TÂÞ’€…ûj‰¢!k°ËfÞ¢-ü$çr´Ê1»DnÚ©uEkË{憔%$–›ðôHq:ºõ†lÿõ4†°³â¯«VGö{ÒbÎeg H*e†_ÍÀ$™„ýK™‘¡uUÖX«q»ž-Û„~4dÅÁ|”ïPú§?” –jkµoj )ULt¬êˆÄ^‘,,ô`ZåËñç€üRhÑ6 g°žýR!éäönW"x^wãu;e‚š¹Û{oZæþÈçŒý(ï¿ò~‡¨úQµCW@®Ú$˜„)õ\rbHåæ9o…­ Ñ6&²wÚ µ}6¼ª^™ú(QÝjå´ `G¨mö-‡r¯R·‰úü6{~•Ønp÷ç~Õ2ÒInÒÛ€hB"–ö„Áñw$2¤N~ Û!PðS@Éf®a‹Ú³À&/¨öºŽ'q!+åšü¾UÔ2Ú$ ÄMP-\\¢"¦`L¥>ú™E_ÁX@zõöG1FÏÒØAÖ›Ë%ý¹Äzi¥”Ê«ý&;üš$Ó±¸z©ä^w%™~£Yæ“ÑèUÜ*Ì…·qg¡ø•xû‡$,Bg%#%XYÛ«Üä~5]TׄER\ÉFáo`JØÛ#HvÇ ×½lõ0’@›¬U›òËdrþaŒpWvB«Æc9±ÄF¨>(¿û§¹ÃÀO»é±ÂO3Ž~{'žþ¼ZV´`€‹¡¾[F©K\ljvï}¶Åña'1´¦º™=ûQSþS ìdQ€©¨î>×Òï½x ]Ç‘>('3ÕÒï‡B¥-Ò ÄQ·Ý1FälÍÎ>J"‘ɦ_ǬoOiRi|ñ&ù‹…ºßXIõ¶fhݤ{í÷CJTK´[<.€ ÃNqB2üÊÓ©ú#è8®ŸGûàÜ*Ú»L­aíôä(”†ãz{D£“]šI–÷gû¸Å¸ãç/T…69%J"e]W%µÔºE¨ƒ>*×Âþ|]Bõ&ã’ï†uÿø.j•ìkˆ9 ýYN~ûZ¼¯ ¤RœÉ&ÑÓ¯Ù®¬\ç!“÷œ£ÀnZí›cçðô:ZÙ)(`§M´Ñ' ˆë)WÐe!uð£„.´~Î@=‘ÔÊ ¬œô‚Ên Œ º÷H-´Hy-k\3}Î ˜‚²¦P¿ˆQ1 —þ[I´ïý7¾©ÿM•¬°'Õ[ lxI¿¸h ~—pq^ø¥8L:%noø–üP`JUœ§uuÖòv*'Ü#êcZ]Æ BñYEt™%©¢ý}o²À‚1>‚ã hX‰p;ø yçíÂFÝ\£±×tC:Ù4Â?+Ö§fR}Ä k2¡•ã«”÷ÍY¿¾¯"—Rí›0Wžå_Ãþò# ߘµÇå‰\9ìz'm=òœŸ¥;³&¼¤ùäVkoJü1-âHqØzËç™À•Ÿúï×õb2^X)G¨Œ¿^VÊÖ wY;´™‚ äÓK¢êëç0™6\çšõ*:~$ y}y\‘ïaìÃÐåZ Ð+H:EÐîJ}t˜Ò7k¤<}÷ÎAèX€W~Ô·ÜžÁ°µ_³µÍSþZùeË'ü"­¯ÕMD”àà²U%ÇnÍ/vH ©ä?:Hq«a…K€d¬ió†Ã‡•«7ñÑåiïNŒj¨ß¤¾Üº±70ɧ$-§jž¥]·ýèàÂÝÌAyîú  éñ vÆ Ðßµ‡ŠBÒ¤ 2AOêÏ9b <Í©³üJàOS«£ï7‹(#„³U)* –G¢­o¦Ç®@#¡‘ ¬×f …Ÿ×^gºI·ïëø¼ó¾{‚ꛓţ<+VÐéG׌/ÏíXNÉðÂôÝæe¢=çõÌç\—ÈYK{/¬vÞ†®õs¢Ìíî .J|ÌÂL¸ª$öXà®n‹€ç Ýa$ ™S\®ô£Èx¡åF YuÅ*õ²•ˆ@ ØÅX Ní’‡“—±õ`*HÂË¢”òP§¿5.<3‘ê×]@âP† b‰œH'.ý?›N½ê =LxÐ02Ç 1“¥—ãú¢qq µv\Y¬‰Tf÷kì夜D µÇLfÐjê¨#¹¥Gj&{IâóWèj~Ь5(ˆ…DíΠûÃó¾ÊÌ™• ÂI±ˆ$\ñÓW¼xU5FåùÝq¾gc@C¡ðåRÆÖØÿÒð+Ä~/ ¦ô½kßÖ…¢ž ¡°Y Ðb ¸#ä«0-Ÿ— jcÅ‘e"úˆ0¾Û–Ây×r_.—Bžn‹Xˆê!åÿ„ðøL¾®r£@yJh\Þ%‰â€EvÛ¼Ëi¢(E«d"yL)CZ–/T-G––¿ò±.KÛä?mmíúÕÛzˆ3“÷Ãß=±×ôŠVæÊ¼4Þþʸ#j5½C¬C+®á“ .¼áช©iÜõ°{FëùÍ£˜e–Bý`>\GúÈþÇiÔ4Rs¦!ë«&~_ÕÙ{xs†KX°B@(±Ép$G¸¿ßÆ…é|‡¬>‘ªE‚§°!Üç×C>î_h*µo°Ë¨ŸLuºü‰Ç¨4íˆM˜¯y¡p$„)ÍäÌXÌlŽèu¥Ò&eéÑ÷ʨË;Žlç|n"ëÇ[•s±Qç=‡ßć뺜Dªï¸J7¿ÉáÄtÃHèÆÒs;©0׫Ol¡ô"'¯€°T V?ˆÜ€€Ä™8‚_AÌr~+ö·ˆ'´,6ºúQ]÷iTõ€‰æ­œŒüæ«2ÌxN;SÏl¿çî&ͼz#–úŒ¥ÑdT!.]&“ tpŽoœ©Íø 0…±kŒsµVn~ªÆa»ñdÞ“¬]•ë½,9(ço9aíÎRÕ/»ŸW“ˆ°£GÎ*¥è•Äu7ݰëÙ 'ÌPœ´u^àZ5U¿÷CÛéÚ¸ÎéÿþÓ"‘ô£ÏiìqÎvÅð8ú1º…›]Ó›*ÀÍS+#Ö‘ë-ý+ÎzfjÇŸÂc”RŒ–íîG+·kÇ=ñcžù·À‰^c`÷9Ã$* „ÏÖõ¸¨²Çï†ß‘J>ÎùJu.ºl{Ð`O‹"¹é½ÓáA?M:ºÝI›iÇç«:ýÜ=e„c½Ü“¤ÉË…x©N}1uÂçpìÁ(eözÖ}®¡fìŒF)³ò볃°õ¦P‹kÁ!ditÈX;0lLüü©rº:xKàQ‚Î) }’õ9¸]@Æþj—´òÜt­y(¢¥³vySeÄps£Dã—Ã]cá=ö \ÓÀÞh°YT@Á~úçÏȪU£ }ã§^ôÔÓa‹æ:ülN/“MÒ¹SøÑ;2[Ußk¸~yjK°Á¡•40—ܦÆçÓé×c¾ ÑÁ:÷uDH•MvœŽfÈøÏÓuþªú‰üþ!_Š8“ dgò5Ô… ¿³íª“™b ‘‘ÃΓw0UMŠ,|v)v%ß$ÁÉÀh÷ëL7îGÖa3Z¯hsO´½àt;¶â½(ÙSIüöjTÄÍÍ6ü4ywh©‡ä`ñûñ_Å âiÛm›õ%ê€$‘t'5«BUª¬ædé= $YVDb[°/9mkÿð®¤B7)ƒ|ÌÙŒMw‡þkL :™Æp¸P ËF‚¡ÒG:a7ÝŒŒk(¾§âAbÊ«÷÷½5Î^Û§(°“)†jÊ×­]ˆÑòß3O{†#çÎéœV7øÃÄ þ~¥µi—í4]~—½9 `‹ÝŠõdLCVm”YY¬`ûJmV̯ó%™×¾@Èö‰æ¢šz(R¯ó¡'ˆ]rYèz;E+¾KÛ3N<ÇJe©”Æ›0K{±B1‡6OdvcÇ)³¹í3Ïbû¶#}UanX÷#ñ¨n¾TOX‚L ¦RÓ¦U)? 3! DkqSG[ÙÀ+àá€ó$3ñ±nï¹Ô²ûZp¦ËQ•ÐâÐ E¨¶ä ãžÖütáH˜qcTðš}*mAz¤®‚` ]¤÷Ûš–üã¹8|¡ÍéŽ'bQV'?LXD¨MÇlïÔò¥£Û¶vøcªvú³Ï¶¡e†ÊÓ±AÞ@Àu¢¨³$jnÂ×Ë3"Cj‘¶o…Cõ&Y¸Ö¸6Þa}B¨Pùmî0‰"w(iñŨV¦5_«>ºƒYwP=,ß—ó¤¼JBÒl7FRGšÜsªr¯"‚F^½”‚ok#û¸e*Ü.xAÚÉÜÔj!,ùä.•þ"º=.'üÛ× ïšç„6ˆÈ*†Çï9Ñw’êP6”öÃޏ“â‡<^o—ß|í¢ßÅÚô@é·ÌËúʺ ƒ»%Í…WÁëäõ7ç÷òz@ç2ÒX‚4€ˆâ~V›R–5ûI`üÒÈ·æøÕ%ƒööèGß‘Ï[Q¦êÃ:G!ä¨ö¸‰¼Ð]Bã=tؘÈ;륜q@ÂCöÚÜm,ä°Â:k ç±ûæIã[;Ãe‰¢%ž @™cæ”}#*$¬*’Æa®AA/eÖ(âõ~6‡q¥F˜|–ZÌVÞÐÀјÅqŠ@Ä»H¡™ñ6ûÛt|ÃßÿûzÉç%Fâæ²ÊCý˜dn{¢žñÛ]ˆ¿FzDÙÇáoôtëÂ×HË7ÑzC~r3¡Ö´ùB5JN{*ÊíˆZ܇Ë<“ùzü’ÜyrU¯V¨æ ×ô±Q³fLŽÖŒæ+×ò.=˜"J€0Øò˜<è½pžv…íµÓgË[Gymj‰mfã´ìç|’¢m>R¢|8*0„ †Âí“ xÖ5áG>ù9D[‘ï®þCäðÄ—æ”ræXünÜx>åYå[e·¾&,8ÛÑÚ\­§ª É€Wûíå¦à¢MnÖÚé–þÓ]8Jp)M¤™6ë šMÆKüѬšÜÞCz蔆‹-ÆÀœ» ‘3Ï«áûþR’f¡…^uG:¡`%¬uŽ\T¿P†Á#ù]ìót×BÆ“w$Z&,•¿ ¯Á %œ +óloˆg­bO·¹éxÅÏmøGìIó,Kà’S$uç5xìQ|“¹G#‡VOOwiüÖ¬'䲟cpí™hÓbîŒCºä#]1¶WO@ºjŸ…—ŠyØÚ6Û\lI6™Ð#Z vŸ{EƘ›RàQéãl5'¸Úu4ßÚµ;6F·f¡†U~9{S¾™®gµJHQ€^áû¨w³#J.-z‹¥Á– )“C€ }UÙÜÈ—±Í‡ÊˆÉ½º¤®Í¹6Ž‰ð²‚¿—R,¾¥™û X–[ÛžC¨h¸±;üæâ¹$tò|¶µUI‚ÃÚ°E[“£³ß<#~'…Ǽ 6'!á,PBNò¡¥„é aOx6ß•ƒÍÉs©û_€Ÿi*¥WR8`ÄJIš}•–éÌz<´Á“pØqGºg ÝÐ ¾¸ æÆHõw8º¼Â€jîÜ·ÆJ#%yÀSUÉy3RlêJâ+^ ªÈ {Ú[ #•y¥»Úh) ·ìU–&°ó}ƒôøY£qüÑŠ‰ <ÜáØ+Z/,Fwp˜©rÚ²‘/þ¹^;gö€MÞg]w7]à‰g…ÌuÞ jAšm,ó;¢J•u%ŒãÊì<]ž9„? \1dþ¢|¼&L¶Å=̳ö¸2…ÛƒìÞÙä+òâÉA6®ªa°¯Š$åt÷õ¾¾ÿ¯å¹˜^0YÕñíiA_H’WÈu|M–gN<ÞsciÍ*œ} ·Þ7™È‘™±‹VÎÇf*6¿Tà'u‡ÆgìÅ0/¯ìÅ»¼uAÕ_qTØå_ž:U!d ˆ’ðwºE§Â²ÎUl#T“ÒP:aÏ»4Ì.m©þNê{$¤P3‚…7QëSqþƒc¸ë'öþƒÑ*üÜå÷úX7Jú/¸Åèk¯Å†ÊhYÙ™U¿tGïkVÉ™ñ%§þ9mË­¡­óm-¬„¿raH¢ýºŽ ƒúðЙÌd©y~h‹ã4³‹ç>ËQû¶ãóÏïHFW¦|'Ôý€â_ý£ÿýõìö åõÜY7Û½Ãí’ˆ—öl_ÞQ‚ekôÙC œ˜Q$_ý†•˜/Šª×|ü¸t›ÓõíËtáú;ˆ1ŒU/æŒÏêÂãÒž1‚!ï³iÙÇ™z0DC\‚‹åÀp}Qj6=ÿº=_ Ìƒ^/—Úb¶Ô½4nŠ*ƒÁ|sÝ)+?©¿‚Á÷Zge”„ƒ/·,^!€¢z&β}r (¨GÕ ¨¨mVjšCT•†t;ƒ{=ä¾W¾÷1„˜…fŒˆÈ¿:[†ý[Q%‹þìá*[Ôv•´B,ÂL*ÙK ÿìl°!+!ÓÃ%0rÞ”_z} '¡?†ó¡K²Ï§jc^/•Àç‰W~x^²PGû‡Ù”ZKuÍþm”=qŒ7¹Š^/)xà \N•ûƒ0Ýø–Ï +ps$«Fù‚¿xM§±hÅKx r÷û Á ¸#̱=Õ©”rèü“Þ ®6¤¦l€œ±Er…pRƒý1CW׎réïh¤ÚVù‚¦_]Uöq¡¦¦ã cª%ª qù×—·ì.¡eá®NÁÇ2›iü,xý^ðâVÙ`ÃÐñ{PnÝ/ñé©«ÎÈÒîKP†°â¶Åíñ¡›80ÈW<šks°n+–ZäùËUÌ9ƒÀ?Š9fLŨç°BWó…2d©:UèÛqvP ÅÛ¬- Å»lÈíã1fÔšfÓ›¤ÉÉ¿ä$õfMFÒަᢹd06Qþ ýŽý˜qÛ-3•g£Fϲ¯Ü¨U4DHÎE!äá‘ÝçÈy¯Uå0å Ǩ÷†ô«ÈeÂJ˜Y/Ÿõžà°t¹½UTÇË |åÛ”2·Ú}&J*g Wv£[ê$=$;îk‹oÍé§ŠÆçÆžÎ]ÂõÀn€Õã™?$Ÿ™@©™i1Ò*­8=>"x”’jíº×x-™kA‚ýý¦.gdœdÒEžq€ËÌA™;öÖüÜ€ñ{7 Y l@Ò¦¬Xv:Z¯6Ó ˜¼0Çž¡÷:Öd–Xì‰|R®‹¡Yj”ºL­ éSÅúyÊ 8lòI |ND•Ñ1w¨<iY©ëÞ/'è©þNo™&ñ¼é ?PFÏ.ÊOÓË炪üƒHüoQ|ƒï·Ï€¯ÅÒµQÉðÒ;Ýüû,Mᢻ•-¿Š€P9‚Ô_iµâ¹DZ¡pÝ5\‡UÔX@êwCœnoÎÝ̼(¦‡…qQ*ö>dµÄ’¶¿ƒ”a³G+ ë„å<Üä2.ŸCb iC+~ñà– æx¥Öhã§x›FtZÃŽ$!®Ž¦ôë 4&“íMèèïŠ=ã²ÄZâj¹Ã륱ʟ·}Wùß ´¿aÁŠ~SE;žïµ%‹‹ß*§™ãì JÝüñueíŠî–@ª t¿pU­yÌä•§øÒ¹t²g Ym¢oŽ„Ú%*²Ýf½Òý¾x‡÷™*-C7Tºl“†¸ä¢ ûy÷ L\·E¢ßü“DQQÅ`0HêöɧN¦eÓµÀ쯌+ûÑ6QÞ¢´õxXb`»§¨þ°“<¨"s\6ëj:Û‹ú[¬Š5=0ªÏyú½Ÿº€¸›M jS š)1L&äæ;Ï÷„˜"ÖFÇÀᣅBÂÆrÖS rÖ¶-ËÆòfjJ²LêVïé˜X@VˆbS|ðœúVG“Ë iBgIÂéd*µ¹r!=:Ücš&©MÖî*s,Dghö&r^îKûN#VÚ¦”Ž$¬ ¤º“ÛÎc?Ø+íUº4—+ΟÊi“œÌíÄÚ¼L· YéÚùÏ=Ûµ’·÷Îiˆ'ýö‘Eã~—é>QÓéìd%)¬"˜¦öäT%ºÍplõAs@¥Ûk”5U29…b彨­[¥ ¨Ìæ6‰„hìs­8¢î`²@ûë U*æšÞe#7Å?UxùQ°d@ò+ÑBNoÏ™µotÓ~ÏÐúp\\—ê“ Kþ®%”¾†¸ }6h‚Õ³ÓÀ~'$Üûk?À2yô¥ük÷4`yÏRqé«N°>Šùx0é1r.SfeïË(ÍΈɷàŽÖο£f¬œOî@§ëjH†$ {Zà—„Z=m¼dSa#KLሶ·³›å%ˆÓhOtlWhߺFmKh}-nEX>‹Ñ{º5ÂâƒÅ¨P\Ø&-8Ç[š± èapœxQ%C¨0"×[-ê3=‘'ß~Ò6#›f×Ô7Ié‚#|Â1‚š…öå(—@£Xdb¼;yÓò^õôƒ#)ö†f¾BVÅgy‡…AQÿÝôùóKJ‚A¤S¿Ñ™ð儞Áн†·A¸ž${ž4Å)ñ5D’„VïØ².u£p›¯‹æe P[!}÷C¶¥!‚¢}ƒš<±ÄY F™›ÍD¸JÔ-Md" îÞ’Eü¢ÅÃ.ºº,ñB³(ÜÁ]W8Š3ÐØçÇ7¦íz¸*7CT—´(ìXVƒÔŸ9ègÈÃo¡^è)É0˜ßϹ 5%–$ß&²å—-Z¢Rü²ë­ÌTºwRªócŒ¿‘3‹OEb(Fœ¶^§ž±>j…nwg\7§þâ/U¢ª—kAy˜Ë ±.C-ºÑ{÷˜ßp³°ZêMa• ¼CèÉ^~>ÌRI¦õqþùKî' §½à¨)öEÆfÆ4Ó±Êt<#¤ôdâVÇXÏE÷ìBZz(yÀ½MóŸôyŠQ¢wJí†mÒç¿ ÂX•9SåUÁD A[ü?]ÛCw%€‚àtl'[Û騶Ó7¶mÛ¶Ù±mëÆ¼±­Ž=óΙ͛?P‹ZÔê«õ;.„“ßÜÐì×oSà…ÔIi°ÉvÝÓ-¶â\<œæÔ9G»³pÜ(0Ð[è4ÕY,®Û¹pRâ ¹;ñü£R&{ñØfÞ±õm$u¶674qŽÑ³!i‹ 4rœg†ë†•Ê+vOeÔ›(A“‘#ÜeÞæ …;\çKÄ´'\«qÆœæx'‹íȼ {%KL3¬ËÔqçÌ«WˆŽØú†U[sSéh­Ö ýãNå´Oš]uÁïn®@ÓsY’w¤z È,?Î;‚ŒçÌCjtPé±™$z' PrÓDژߩÕx‡—u½ÿ gí†`èm'"Ûõ;9윪˜ ˆ•‚®¹˜¯R@Mפ¸jmÝj§ÓåÉ~zd¤v&»óäÁ2\Q­ŸKÄ*…ïôu7l0yY‚Ž={zýà×XÁ§(]V•Hs÷¬&Á& kÔc0¡/CY©òÔOÐlÙÑÊÓ­n4ëkçñF¿@6 ‹ Ѩ"Ûêuòo'6EÁ¦Ûß&Xס0BÑ•Ìã ÏT¤4¯.\‡ÿ9ÿgùÉ·‡‘í_¥l݇é—‘PþT‡O¸ŸŠ³l}†¸”{çtºð·9Ô<žb¦$„> ¤2-0;+“êó‰ƒ"Ô•Òû7[·“AɃM,UîþÖF$>—<Ÿã -·`Â*¸§7·=ÅºŽˆì¥„¶ÄšÜ…¸ëJ4*ì Å(‡ƒL²4žaÍC¼N´$Å<¯¹ ±Âý©ˆH/‹­êû;RuÚÛPvϤÛÖ¾öè|PVpß…0A-ËW!¬43ÓÌ 4½CL {›× ø‡B›ÃpÁ`ê¼2üÖBNÝý"ßW~.-ðnn·7|;ˆÖcïá;7Ï`ñ9+þ["uÄ’¯]ÂyÕ9SPˆVìmá§:‡^¡^݆®HÊoíøÈZ˜Ñ v4STJ®ïQß6³Éi;L¯ÎaTwž3S#“¦ä_da­#ßó7ÁL_ÇËš¬@*ú>Uó¾àt.xÃÓÞ)ƨgC)’àI.ÑvNÖKm"¿¾@L†åzPOÜjs⺟,]ßPÍžXÂŒgý«éÙÃÃgŸ]¶`þnÚ³ñE:8HÅgþÔà*Ñ9¢@z{އ·°ü@{Ùí¼Ö¹(°šhxöÞŸäPIÒó)ìxJTð0pˆŠ}7Gšôº? ý¾áY«`h1fÀ£K©Ÿ8³ãM¥E"$šçßÈ^E&÷ºà6ø—ò¥]ð`Ä×>»n W¶ñ|LP#©¥ ×§¿ùÙÔ¬(Ä ÃQœ]yüfÅ]ý0¨„d d,#j-Îmb§9ïE5ûgÃõ!’¿ ïM_1²Ê™K˜®Ã’+q¤,cÙwгIfï?¯Äcäv|Y”Í ¹.ÌH9#]Ü~ý÷S—EÅ’i†Ý^X_Þú–„Ì”×ÇT~1ÌDCû–¬ñó=ëܵÊòvÞ3Èñp®ÅÙM­EñVq3Tr£ê™Ê»}ïè;ö¹¹z@“W儋Ųm·Þ¯Ü*Ì-@dìF{x¨Z–¨‰ª3ƒe2 Ê0’Q§i,]¸¨P]£L,!³ÐÒ»»HΌהCýll=è³l”/×M»U}5—Cª¸ê‘kÍu]f8îa€ƒÔ\Î¥N“mx!ïySYû/Š ¯Åµ×íÑ6D"v·–eΉ] ÷¦^¢n¦J¢š‚rMäÉé=Ü„†Ð’0ÐÍ›»Ö-˜ î¦ÑzLt±8fSøþ…1ú3†ð¯= … õîWÆ$ñUÕ›ëqb*OÐÍpËxúL3ÕÒaÐ×j4s®±‚>ï3Ìøà8vô9mT–ÇŽýÇ4Zßõ>÷І„žBz΃TŽ‚L'/D.%¯ª ZffD[¾ÇðÓÔúHšX•NfÈb~óäÕrgM‚Jáõr ÉsóT$jwì¬'²zÖ{|lÓmMeoE犙° ÀQŸ5ÖË ˆW'Ñ3¿N’&Åܳ‘KŸâs†ñ6k\¼‚æ6% ß˜ÜÁç,GP¢'úÇsÏ/4ÏÈtXMêÜÆm«-ýÞE$SìéüK³šcpé u¥‚Ó3Ó-Õ0…Ž/{Å[ýƒZ¯Œ[ÕhÐy©OÀVIJ@GTÝ#;<§WûB>¡”g ÕKEî ¬ç”ÃöŠ(òñ/!œLPÂ/OûÓ¿nÑ÷T½…ðøyVXoŒ}9Å'?ˆ¸çxÌ_Sç,îY‰vð`]ôØß úÏ’Úæ­U!éÄg¨Îê‰Nh† 낳َ§²’hß÷¡®ª¬NK½ŸÝÅôóªdPP›S,!U¼±tû“`Ì&‰Ö\5b Þ*ç×[öQé¯ÿ´‚[¶Ï LÁSûZ…ø¦¡€²e^gí¥†0°A.+ðF<áxID\aÛ„ÅwËVKfÀ%ÎŒ ¥£$¯¯§™@æìϾa W5Ãb¬®:¬oŒ’ÁüµÔ²–åü>4X…ª`îÏ¥ÜmFó|§Ü=¼Ch©œK°æ¨ŒnΟ¨£³a´€äæÀЏ÷ëîïˆþm©“´žaºšu1\ƒB9dQfâûaSJvÔæAIù¢Zy:Á¹¶ânÑ*î‘›D¿µ89 ©àW/Þ›Û‰-û†„ÔèÄ¡Ä ÝÄô=LðÚ‹ÃÚ—8Ú,c›™½fxT·^éÓúÿÍ ÜŸ½Cëý•(ȧ™äGù¼‡0½“4íj”>‘Úòâ*”“/kÔ…¤¨`ĈT þµšÏº–ŒÿâŠm%˜%¹é¶²Ê»hÞÄhPáÄÕÄ”‡çÊ#zün>–‰E Ï….ýøRÿ©3Ìs×e]±„?]ö*áim‡×}†þ˜i?~Î!‡La$°6Ý^í CO;¿üïò/“ª!šøLí)þ ”sÑ–xf_I¯d ^äpÈJ/â/xøüoª!Ìpøáµ4 d3¿—ú©è%³ÿq‡E˜Ô@v]›4³~z9NaF‰ACìîTgöžNÎQ†Îx¶ðÆ,I”3Éÿ[¤é|rïÚM執”×®7ä!‹C®¾õ®ä8©}ç£@œ6£Ò{¤2‹ò]ºžÇwr;}Y/JÕÌ>hNÆéá¢ö;Oçî\M *{ËÐéK¹…(tåÜ@´*á`ÛçúÍ–^>ÜôªïE/*÷)ÿ„lQOέcMº›?¬aˆZßdîßÜ'Qð¼5{Ë<ÿO®ŸþZ›±%ò¼ç­6€!:ý—}gâoµzK×¹Â22€þ²ó~ÎŒ0á»qz|wå©]†ê?Oh†þnzí9&bS˜Uµ7°½°mœŽ]X¾¾)Û±ôÚ*ƒ_PËBžAé¤(a*·Åöýä×DåÏcÞ2ã½±6,h ¬‹;.M'·ûì$º%—l™1]Ï⎩:0`X4·Š ,L±[ˆ}™l†Iì^Û̶éVîÒuT5û¯…©ÿ·æ<í±.EjE]F‘+_ôD†‹´X±þuÔy$ÐĽu€–;‚Ub §Ð@(‘¼î§òwUÑb´Ü/x¾RÜ|úîüÓfõ~U#öBH67ê‚b`ͧKÃzßþ©[=xuêÙ÷‘Ž4í‚H!ÿ:G]Á.²<˜(ô7]¶ñ©Y}¥hxyk.t—ÆZ€DYŠXQö\Ól5?Qˆ²Ö®À@î¢'s™{ÈKàqÒº6Ý›nË?ÔO íéjç[`“ò跣تŒcšù¸š¯ *º¡%Ÿjð«xI ¹Û ëí/Ók]S¹“ñì¤ñÒ×YßSÖGNËþôB½c)O× ›/]¼_帺r¸Ml—u½(빯†$ÌXgúZæ´ÿêרÿåØH gÒQ›1mFsDÔ'%ZbÌ&Áˈ3Üßé˜Ü;´óO è`û\{¨e¶ÛÌý¿D/Ê%ƒd“xIÌÃgõW3ÞOwí¿½´gz6݃èïñ€™r<Ùò`#.š¿ù²ã): 5Õ?×E˜û]î!oÛ=«>?r¯®RZG´•æÈlÔ­ëmö ”Mç€*X ÔM˶Bzz-Z„`»¿†¨cm–ø8.ö8DÌJ}yUîÄQÄS å93$Åý!¾K/8”„ÌúEèôè‰E°ÿ ©Ir!Ϊñd ®!ÈCtާ(@Y7&£J:傉ýtöø`yÛ¥h¶ýðª|yl9°$í,¬"i’9p`‚ÇöÃô‹]fO«ýuÖ+ÁQr4:¼7+¯àÄαWˈ}!5uþ'RýŽd O4s“ýáÚ!rµW™Ù¤¨Ü×Ug‘›­Á³^Ì鲪+¸`'„é‡09J™hŸúÕäªfá¹^<‚õpËBâòãyiXôŒw·žÄ¬vò,{:ûtGa»â–®ä{Kâ…™žr¾€rÙ{º¡|™9΋öµ½+5®õ/Qü±Â“¡c¿ódú°–+>€«Žš²^=™MßH[Q8\aÊ |úÃÃÚh6)ž(sé‹®ËÈ’Z§Ó®±çÑh`^—`G·¿÷ݺ3ùƒ”wº!x:þf†ºèæÔ\(ĊɈ‚«dÇ)Õ†œI)8¯ûï}ÛS`FûÑ/0¡¿ϲP ªéœ©ÿõwb`3f’~¯ÈïlÎ`ÕS…§7² ŽÄø£ RU‹rp´FZ¬.rä롱[ï]Öš»ã“Pîæâ'_‰:ùB:”÷sTïÕYŸÇ:º“Ï Üz±eOò"RðrÒº) 0Õú‰´É‰ÚHeY¨˜pæt¶¨"3žÊUÎÊ*’K––…,dccr”› ç"Ì2ŒÑŽ{¹d};Fmá(£Ø>¬‹RddЊò5£Ó_«ã®ÉÑ“Þô_…ñÿ¡]K›³(Òg…‡• 9¸õû⇽ ZƒÝ=†!ÌeÍ(—W†´ÿ÷„×bå³ ÃÝû9ßdþZ‚ºÐ×ý¼TH‘»“_§Fª:L+‰Î¥ØÖ…‡&Ζ™ôQ5Ïø£ìEüŽ3…@–)•(¿\ó‘­590‹ …qýjÄô¥E0 ±.YÚ¿=A\ÜòÊ}èj»žsN¿ÍÃ]ºÀ©‰/Õ=¶×ž_ú°ÈW^ø xº Ý×Ó)T9R%„W_  ¨Â{®x§é ø8ùk1ß¡Ìûæê7’ Be$Â׊nryX>3x ‚@ÓQx®>0öeÖmHH8|ã4Ûáë0bµJËš÷wº¬ç°e†ïŽ ]fý¢Ò‡¹çxòÔþ´aµ1ÛˆûziÔ²º¡iÖ¤ †|#aErÌ—vý/¦ R#Gc»dsJUD_ë×&X@¹åqÞYûGò½poºð}·mbþÄS‰sëbÖÝB܂ɴ†Ëf©¯!ývP¥˜fùYÂõìŽãàƒ‡Óë,Mññffn"­Ê\ʇëÝ Ç…éÈÔjPné»…~hOÈ¿ˆÍyEYe÷ôñ^Xêõ?´âI‚öîBØrr¥˜#ïì •PWæ‚¡?XuEF ‡ Hï~»2Ü 6Uât(Îñ±ÍP$h($FˆGf²¦WXøLïXÊô„œVå‡x±Óæºõ}®9ÀKÉ/kÜ£«ñžmÉ# Õ:àÏè̃¢INë/y½kú|Fœ&/k¼Rf9ìÙ}¶Uq®BNu”+±«3VOêhîî0ÿ˨H­Ó=…^k¹‘rËèMoâÇn_—ûÉïs2‘FÀš.×W7¦»{ôïž– ½÷ØÙiUcIk¡\gÂÆë“PŽ Û»›Oi%Át$bÍ ª…PùÍðÀÑüè×SÿÇÅAŠ0©ýa)õݧQ€·gÒ€”qq{·Ž'0ô É¯è G#>wU«ëdU"µ¾lRŒ&Í(/?}NZÙ6^Î: üBâ ÞMV8Vù;ºd׌t+8Û ³Œ@¾¤òŠQa:s¿¦”¼xÇdM[ç>8BÑù-@¢¨Öý=¼ÌÜŸœ¢ƒ!lB13ÀˆÔÅVŽEQ棨ô\õ ¹K?,¹C;톦Ѳ&2Ç3´Ø‰ÁÀ˜Þ D) ꣌¸’J{ÐÈ5‡¡À t?šCaÌ‹fm8#×Ïvµlœk¿!7Ù ¿=$b9²äwG†F®d%ÝûŽnW¸ó¹©¿áO%´]X}´ï­Æ7wE1—å¢ 9ylÌ ˜‰xXaÛ‘+ÒÚ üÎ"æÐp#c( l#¼Ü#áÖ*f±øS1/|7`9*$.+G6Z‡$ˆ³ò2â¢É!¦?Rž_ _®®˜`“âã·ÅÜZD*+ÚMdä›jp©Å6óÛtq.g³ïXÒLÖÀ?}¬Uu®¿ž¯ÕÁöA5•h!>q÷ewÿpFxž©•虂‹¦;ë&þ\™wþÔLggÛG¤ô<íÐ^³FîøËĵUó7#9p²Í‹Î8•ˆ°ÇúPÓ6UjL!²ØŸ:€ð^$ÓÔXQ‹™ÇÕ×Dž­›`Ôʷ«“òVsâò—â`§âgzÜE©€ÍöZ?*Šr;[á*H#ÌA˜Ud§Üù<™ÿ«ÁF̽`E˜?¯«@!¡kåµWèÒ0Z‰„UŒV ¾—™~‰_ð‰ ¯-1Õs F-°Ýreè‡r]x$Qœ½7l6J†¥:áYS=Êv®oyYÕluæJ¨¡ÐaÉ.¡2˜Nª%ÞWæ |,ëû„mñ(ºxh2oÊãRÌËÖ¡­Ú,ß^Î}HzÞ(• >ߎ"ø“Tÿö­Sd™B}#÷=ÁÄ„?¸!V.×±é„d‡Ë$D—é7bÿªã»s?ˆNRaãóM:oqL¦ã³’ó\9ktR©Kˆíø;S Ñu¢ùêN!ÖìME t2Ï*ænõûHýŠÀ™dJˆÉÎú`6^æyÕÚÄ–mø¯LbßPë]²‹u‚ä ·;…Ãn©Éwßzüeȧ²ãÃMÛ›oh’5EJ9”\f GÀåÓŒ÷êp4³¦“.ðR>îÜߤ–“ ;,YÒùûiß{u ñ¯‚}WWïR5(ƒ¿?÷Vcˆ‚üˆJÕÀ½À%‹¡¡1¢±¢”Úl.Šš'¥ÝÛ<ú=áñçtšäÜ,ýÊ'ºsC%üÈ_çÐù#§~ÊžOîzP£‘}5ÝçäQÕÕðýÜ)b%×tSÿ3;sð^N¶E¹êèAO:¸/²œ(òkïLû·®µj³D”m)!;‘6a®>ÿ…4¬ñ£L(zwÂŒØs@þpµ wcy›’õ*>æöëPc{7$ Çv÷£Ä/ßp$پߠ“è»ë!?ÓÅAˆ0¾¯Å3¡ ŒØ/®TG… š)|àînÁC÷D:Ú,ysçŸÌ‚ÊÍuX᳜ØZÇ=Û-Im9‰ JÅâö–*eË9¹Œ8 œ+Ep¹›¡ÇèÚ‚ñŸ´ íÞæ8(Âî¬þÒïÞû9Ö3Rb0qb̕䡫8JÎNÎÅuÙˆ2p˜VDª»gÉØk‡}×Ì$6ëC¼˜×Åê†NÊÊø]ÆŽÖ¡=s"Í.Hmû”±pE%¥{Ú­ˆ¨BNï¤xêTX¼µå_2=¨NG!Ð2 ñ»›4 ”œ§4êé§õ¼‚âcÌç—B =Ã$Ó}ÜÕõðŒAiA¸â´Ge¡‡¹ýqá7;%ƒÝ†Ûš]‘`nY¼áBÍ‹2ÄÜS~ÿ˜(;vÊ\7!÷Dt:: Ì) kŸ'¬ˆwa­Ô€~}ð¹ü`/Ô×'•o‘«` h¾#ºYbeg&I³aÜÕûYTêâ b[WCMHQµœõO9KËÔ“¼íuz¼¶Î “#«ÌëHçÉ\€¢=%(ê4Ùø4‚_‘¶ë˜ÙèCq6cˆÐ¥eï3aÌÄ?D\ŽÜ^z~ÿJ—>Im ?!ÕzÀ>:¸@‚î$cÆU3¼áÅúâ7òFwèEjÊ-Ü +ˆ±CWžÑ†è£eÍdõ3Ô#aóËro½_rPƤ߇ºáœ Í/ѱœnkŸpù! Ñc¢ª[ö†,¿ôJ-Ó+,ÿ"à*Ïãþ*¼±Í!ùÅ•¦ øtÚ§âÄßa k™ÞÈü·ùÓ2a󗻯O Ñìk/#àZ,í§ÔØŒ¿±>7£ ‘ãŽ-+\TVù&Á›9ÒÄž@qóÏ`ûáпg|ëhÉÝcÒŠ¸Œg×/OÃC¡'§ûÏyîvÁWÝ­¬FN?„$jÿZÇžš"w`O›ÖØ€äŸo—[HÑ,êÓ‘c ¶¯6Rj …qÝT¿Ûng$ctuœ–«-T®†”Èði¼{’‹ØK€ò'ªÛÛE×gÕ…¥Kukµ*wI‹‡SˆòŽìÉ%‡uù»=¸)©ÑëYØ3U¯è4<Ód!YÔZ‘ùñ$­HXÃÁëgKzi|-ëI9ö¤Ùu3´÷TRQhË©âôHgoDó\”UJ~ÏŸ o‰ºo;€ßÚèÙÉgÖZÌLÍ~È©ŠŠ$ÛG0æ·ÒÚZK¨ Y¶|úPJâ~V券9‚Ñá<¨DþÀße˜ò~ÅÍh™—‚çeöx8Á‰lL4¾Þ¸T µŒ‹ANfùó|Y½ÜRU#Gî©þ;_‰øÎï—ˆÖÔ£„!DXÚDíƒßJ·ÊðLòG#n+™ïTª^FRÏ=•¯sgÃï·aÚ•?Ž•S¬,méÞrgŒ‡ æâ¥Ûæ·'8ÝÿÒ1vœéA9·š‘øŒ=EkÀkÅNVk摳 y¦äÆ%È”‡š !Aªøvñ^aÇ‘.‰¢zÚ—+À1LXæ¨ÆßDè•RÀ@ð„ô,ƒ€ îÒø­‘UÁ±¹EJCáœpŒ·îGÙ•žcI’ìÚt[ÑHKªŒú1ך×Öƒª• qÄçiî§ZúnÃÄSí×”a9ýê~›æ{Y;q¿ìT/qá?:Š1!1:òóú§?ëjÞt,süMç›ÙF«ÒôW%i%'•ÿétÒ¸4'§Q‰Xs­E 8¢?A£¹‚¬ë(!Zrœ«åå=ú d{5,ØÔ°O™×v£ÿ«ƒ‰Jð°Pƒ£NuªÃa|¾‚úFáâM M»NM—ØñÿF2Yzâ1¸¯ˆµ”ä“¿è3Ä­†ÜHßßè.$W¢ʈþÙ ë’óRk_PàµG¸‰)½Œ¯X, øåŠóoþ¨~ý[8¤&c µKó¬+5%u’µÐ§µHKm|º½î`Úâ}0~ÒœŠFfzÖHÑ@öI#=3‡æ^UTÃÚÙ©òŠBx¿‘y,ŠS#ûÊòàÑ`ƒ1ôb!¦<ž.Åz›¸òEoB»éy§×0N¿hsÖÎqƼ`ŠJ©'Óf²U£Õ;6•VM 6×[ÿÂÝ¢¬[€7)(b¼Û•‹D/íàYºˆ‡!9EA&I‹`ùÙM-y`Bw¤}CûñOÇÈ ¹r-ÏeVŠÇ~ÏGh–C ЉD`SóîvŽÆ£°ÄÃ%Fí•Kêc ‡BW°Ç/ÒÐàF͵qQ.Q#…&“ŠÅ|®ŒÍÔxÌM;ˆ %Hö¤/¥Þ„àš@ZGÄ“ÑY ý0Tè6£]X ÀUðÌÛÙðü2˘æ+Ÿ°°!×ÊDçÒ¬cÞŠß³Ÿz1[ÃÈ“êX9s»¥¹æô3>8ËÚ²3”7}Í.90#ÒÐÛ™UE©.!)H”Ööù9ÝO® v~_k 'a¦Òæâ%:Vùö {ðxÚô utû¿Hy‰VkÕ$¼‚#l^tɜ 0XìnÆõ]GÅ•m† ·Ü„ gùc!Ÿ"íL¹d=abR~Yiák}Œ÷ƒåšríý>…3Ô§xUú4õõêýÍߊDÃÌ.ŠóihögõÊŽÊdµ\}è‹&À#]Á¶´!-³4 ‚ß©Xhìå —Ø`ðÉ))7ÌR9:&ÍTEÀ¯}Zñþãš§§±ö8Íw˜Wv'°ŒÕ‘!:U£ú¼]Õq*dâù2âh|-ˆ¬ZšÔ7™ât“Zœr¡ P#È`TqìóiÁ )ŸAó:¬®X´ë(™sâƒ[Î#Ý6ùÕí#v…ýìêÌ©2WÆP¶MQ³Èr?‘‡Í X¢ZPúsC–ží|ñ¨ükø?l5y endstream endobj 206 0 obj << /Length 868 /Filter /FlateDecode >> stream xÚ}UMkã0½ûWh…öF²ã¯²CÛ–¦,{Ml¥hìà$°ý÷«73nw—ÒƒÍÓèÍèͳ,]}{\OlÛoÝ$ºÕêÉúËиIù}s ®®ª¾¹\w¾w®uí8{ºSC߬ÝY]—«jÕíÏ7ž¼êš×KëFÖç¤Â½ì» ÖQ×ÏîçÄ5Ûßf6Ó“æ09]Žn˜œÍD#åy~õÔ/XÊO©Ï¦øá†Ó¾ïÕZûÀ²kËþ€ÆNÁTÄ©é(w·ïÚAª-ô&Tí¾9ˈÞÍÁ;„äõÛéì«n×ó¹š>ùÉÓyx#½7Áôahݰï^Ôõg=a}9_Ä(,ªu;_×ûr¿985ý¢ëwæóÛѩƆ56}ëNÇMã†M÷â‚¹Ö 5¯ëEàºö¿9qÊv7r—ž«kÿ u”/‚¹A² )`JbD>`´öØ2ãš™$`¤TY'`ä`ä9&£Ä*×ð8˜W`TœR±¤&4–`Ô(ZsJ¢5Rê’H©+¸†Çhì3Ÿ}7¿6ƒXäÅ¡°6„‹0×a™G„+˜ gıXFǯ€Æ8åÜ8ã8ñsέ-Çá´.x]â”/€+ö5MĹˆÖPN‰£é±¯<1\?‚Ãõ“Æåǘ¾tõ1¦:Ë¿ø#§þ7^ïÂYH{upÍý¤²àQF^o­Ç†1¼ÎBÆÐ–EŒQ?›1^“׆¼ÈƨŸ¥Œ‰“qÿЉ´.yafð%+CsV2†GYŘêSÿ&ÆžÈjÆÐ™³þëæ¬??gý´‡rÖCOÎúÊeý zÏYJ|ÖŸŸu¦Ðœ³Îß8gå²ÎˆrY§¡‹}¶èÅŠÏèÑŠÏ1°øLñkYñûÒŠÏX׊ÏðÓŠÏÄŸÑ»Ÿ¡ßŠÏÐiÅgônÅgøfÅgª/>C¿Ÿ¡³Ÿ±n!>ƒ_ˆÏàâ3ôâ3åŠÏ轟‰/>?ã“°œEè¥ÿÑK!þcâ?ÕäÅRMþO ª#þƒSñZ1|¨8Gxp4Éaž«j9¡èDÂQKæý.h.Ã௠º‰èÜlj¿ïÜûeuìÈ¢‡n¹ñ¢Åè¡þðç( endstream endobj 207 0 obj << /Length 868 /Filter /FlateDecode >> stream xÚ}UÁn£0½óÞC¥öƆ¦Š"RÛVmµÚkN7RI¤í߯ß̤Ý]U=€žÇoÆoƾøöð4qݰö“äZ«GNcë'Õ÷Õ>º¸¨‡ö´óýñÎûÎwçÙÃz‡öÉÕeu[ßöÛãU ßöíë©ógÖç¤Ò¿lû ÖQ—ÏþçÄ·ëß&í¤ÝM§½'G3ÑHyÞ_õ – Sê³)E~øñ°úe®µÖ!°ì»jØ¡±C4qjz–»ÙöÝ( Õz#«nÛeDïvBòÓÛáèw·ýfˆæs5} “‡ãøFz¯¢éýØùqÛ¿¨ËÏÂÓi¿õ£t´X¨ÎoBÝàËÝjçÕô‹®ß™Ïo{¯bÖØ?ìW­Wý‹æZ/Ô¼i‘ï»ÿæLÂ)ëÍ™» \Ý„W¬“bÍ ’MLS!"q Ø# uÀ!`NØÈÀÈ©²ÎÀ(À( LF…Uj®p4¯Á¨9¥cIMh ,ÁhP´á”E¤4ÒÔp€Ñþ¹Ïbvî»ýµÅ¢ …µ!\Î€Ñ¸Ž« 8!\Ã=#ŽÃ2:åx œ1vÀ9çæÀ–ãÄ/8·v‡Óºäu‰Sq¼®ÙkÔ4 ç"nXCI8'ަľ&ðÄpý ×Ï2<WcúÒõǘê,ÿâŸ9Í¿1ðbxÏbÚ ¬Ã€›iÆè'—Ý,ym‚µÆðÚÆŒ¡Í&ŒQßÎ/ÉkC^ØŒ1êÛœ1q,÷ V¼ uÉ 3ƒ/¶d Ͷb l͘êSÿ&Åž° cè,XŠu ÖŸ‚_°~ÚCëO¡§`ýå²þ ½¬?'>ëψÏ:sh.XgŽo\°Î„rYgB¹¬ÓÐÅ>;ôâÄgôèÄçX|&ŽøŒµœøŒ}éÄg¬ëÄgøéÄgâˆÏè݉ÏÐïÄgètâ3zwâ3|sâ3ÕŸ¡ß‰ÏÐYŠÏX·ŸÁ/ÅgðKñzJñ™rÅgô^ŠÏÄŸ‰oùd ,gz)ÅôRŠÿ؇¥øO5ù_qT“ÿ“’êˆÿàÔ¼V jާ M2G˜çêFN(:‘pTã’y¿ ÚÓ8†k‚n":÷qâo{ÿ~Yí‡=²è¡[î|ÑbtßD&çU endstream endobj 208 0 obj << /Length 866 /Filter /FlateDecode >> stream xÚ}UMo£0½ó+¼‡Jí! ᫊"R»­Újµ×œ.RIý÷ë73´»«ªÐóøÍøÍÃØWßžf¶vnÝjõèNÃelܬü¾=WWÕÐ\®?ÿp®uí4{ºSãÐ<¹³º.7Õ¦ïÎ7ž¼é›×Kë&Öç¤Â½týë¨ëg÷kæšqg´Ö³æ0;]ŽnœÍL#å¹;¿zê,å§ÔgSŠ ütã©ú;ený¼¬û¶hìÌEœšOr÷]ߎ¢Pí 70¡j»æ,#z7ï’ŸÞNgwØôû!X.ÕüÑOžÎãé½ æ÷cëÆ®Qן ô„§Ëñøê Fé`µR­ÛûºÞ—ÛƒSó/º~g>¿ ilXc3´îtÜ6nÜö/.Xj½R˺^®oÿ›3§ìöwí¹ºö¯PGù*X$›¦D F á@ä¡F@k} ó8®9ù@FJ•uFFž#`R0J¬Rq ƒeFÅ)kjBS` F¢5§Ô(Z#¥.9€”ºB€kxŒö§>óÅÔwó{;ŠE^ kC¸X£q– pD¸‚ zA‹etÌñ 8alSÎM3Ž?çÜØrNë‚×%NÉñ¸b¯QÓDœ‹¸a á”8š>ûÁÃõ#h0\?Ið`\~ŒéKWcª³þ‹?qêcà…ð.\„´X‡7ÑŒÑO*»eäµñÖzlÃë,d mYÄõ³ã50ymÈ‹,aŒúYʘ8÷ ™xAë’f_²‚14g%cx”UŒ©>õob쉬f 9ë±nÎúcðsÖO{(gý1ôä¬?¡\ÖŸ ÷œõ§Ägý ñYg Í9ëLñsÖQ.ëŒ(—uú±Øg‹^¬øŒ­ø‹ÏÄŸ±–Ÿ±/­øŒu­ø ?­øLñ½[ñú­ø V|FïV|†oV|¦úâ3ô[ñ: ñëâ3ø…ø ~!>CO!>S®øŒÞ ñ™øâ3ñ3>ËY„^ ñ½â?öa!þSMþW,Õäÿ¤ :â?8¯ÇŠãq„G“Ì湪–ŠN$Õ¸dÞï‚æ2Žþš ›ˆÎ}œø]ïÞ/«ãpD=tËM-F÷uð ªæâ endstream endobj 209 0 obj << /Length 867 /Filter /FlateDecode >> stream xÚ}UMo£0½ó+¼‡Jí! ᫊"R»­Újµ×œ.RIý÷ë73´»«ªÐóøÍøÍÃØWßžf¶vnÝjõèNÃelܬü¾=WWÕÐ\®?ÿp®uí4{ºSãÐ<¹³º.7Õ¦ïÎ7ž¼é›×Kë&Öç¤Â½týë¨ëg÷kæšqg =k³ÓåèÆÙÙÌ4Rž»ó«§~ÁR~J}6¥¨ÀO7žº¡¿SæVkíë¾-‡;s§æ“Ü}×·£(T;è L¨Ú®9ˈÞÍÁ;„ä§·ÓÙ6ý~–K5ô“§óøFzo‚ùýغ±ë_Ôõg=áér<¾:ˆQ:X­Tëö¾®÷åÇöàÔü‹®ß™ÏoG§BÖØ ­;··ý‹ –Z¯Ô²®WëÛÿæLÄ)»ýÄ]{®®ý+ÔQ¾ –É&¤€)ˆH8ù@h€ÐÚcÈ<Žkd>€‘Re€‘ƒ‘瘌«T\Ãã`YQqJÆššÐXƒQ£hÍ)5ŠÖH©K ¥®à£ý©Ï|1õÝüÞŽb‘‡ÂÚ.Àh\‡e®`‚^Çbs¼N[à”sSàŒãÄÏ9·¶‡Óºàu‰Sr¼®ØkÔ4ç"nXCA8%ަľFðÄpý ×O<—cúÒÕǘê¬ÿâOœúßx!¼ !íÖaÀM4cô“Ên€Gym¼µÆð: C[1FýlÁx L^ò"K£~–2&NÆýCC&^кä…YÀ—¬` ÍYÉecªOý›{"«CgÎúc¬›³þüœõÓÊY =9ëO(—õ'è=gý)ñYB|Ö™BsÎ:S|ãœuF”Ë:#Êe†~,öÙ¢+>£G+>ÇÀâ3qÄg¬eÅgìK+>c]+>ÃO+>G|FïV|†~+>C§ŸÑ»Ÿá›Ÿ©¾ø ýV|†ÎB|ƺ…ø ~!>ƒ_ˆÏÐSˆÏ”+>£÷B|&¾øLüŒOÂr¡—BüG/…ø}XˆÿT“ÿK5ù?)¨ŽøNÅkÅð¡âxáÁÑ$s„y®ªå„¢ G5.™÷» ¹Œ£¿&è&¢s'~×»÷Ëê8‘EÝrÓE‹Ñ}ü!Uç endstream endobj 210 0 obj << /Length 866 /Filter /FlateDecode >> stream xÚ}UÁn£0½óÞC¥öƆ¦Š"R»­šjµ×œn¤"’ú÷ë73iwWU çñ›ñ›‡±¯¾=¬'®žý$¹ÕêчóØúIõ}sˆ®®ê¡=ï}úá}ç»ËìñN=ŒC»ö'u]­êU¿;Ýòªo_Ï¿°>'•þe×P°Žº~ò¿&¾÷Új=i÷“ãùàÇÉÉL4Ržv§×@ý‚¥Â”úlJQŸ~<î†þN™[­u,û®öhìMEœš^änw}7ŠBõ ½‘‰U·kO2¢w»!yýv<ùýªßÑ|®¦aòxßHïM4½;?îúuý™À@XŸ‡W1JG‹…êü6Ô ¾üØì½š~Ñõ;óéíàULcÃÛ¡óÇæõã¦ñÑ\ë…š7Í"ò}÷ßœI8åy{á.W7áë¤XDsƒdSÀT¤dHB 6ÀhpØ€Ó†620rª¬30 0Š“ƒQa•škÍk0jN©ÁXRšK0m8¥AÑ)MŤ45\#`´鳘]únoF±(ˆCam—3`4®ã*N×0Aψ㰌N9^gŒpι9°å8ñ Îm€Çá´.y]âT/kö5M¹ˆÖPΉ£é±¯ <1\?Ãõ³ ÆÕǘ¾tý1¦:Ë¿øNóo ¼Þų˜öë0àfš1úÉe7À#K^›`mÀ†1¼¶1ch³ cÔ·3ÆK`òÚ6cŒú6gLËýCƒ/h]òÂÌà‹-C³­Ã#[3¦úÔ¿I±'lÃ: ÖŸbÝ‚õ§à¬ŸöPÁúSè)XF¹¬?CïëωÏú3â³Îš Ö™ã¬3¡\Ö™P.ë4ôc±Ï½8ñ=:ñ9Ÿ‰#>c-'>c_:ñë:ñ~:ñ™8â3zwâ3ô;ñ:øŒÞø ßœøLõÅgèwâ3t–â3Ö-ÅgðKñüR|†žR|¦\ñ½—â3ñÅgâ[>ËY„^Jñ½”â?öa)þSMþWÕäÿ¤¤:â?85¯•‡šãi‚G“Ì湺‘ŠN$Õ¸dÞï‚ö<Žáš ›ˆÎ}œø»Þ¿_V‡á€,zè–»\´Ý7Ñz}ç< endstream endobj 211 0 obj << /Length 866 /Filter /FlateDecode >> stream xÚ}UMo£0½ó+¼‡Jí! ᫊"R»­šjµ×œ.RIý÷ë73´»«ªÐóøÍøÍÃØWß¶3ÛÏnÝjõèNÃelܬü¾;WWÕÐ\®?ÿp®uí4{ºSãÐlÝY]—›jÓwçOÞôÍë¥uësRá^ºþƒ‚uÔõ“û5sÍx0ZëYs˜.G7ÎÎf¦‘òÔ_=õ –òSê³)E~ºñÔ ý2·~ÞÖ}[4v æ"NÍ'¹û®oGQ¨ž¡70¡j»æ,#z7ï’·o§³;lúý,—jþè'OçñôÞóû±uc׿¨ëÏzÂör<¾:ˆQ:X­Tëö¾®÷åÇîàÔü‹®ß™OoG§BÖØ ­;wwý‹ –Z¯Ô²®WëÛÿæLÄ)Ïû‰»ö\]ûW¨£|, ’MHS"#p òÐ# µÇ>y×È| #¥Ê:##Ï0)%V©¸†ÇÁ²£â” Œ55¡)°£FÑšSj­‘R—@J]!À5£w+>Ã7+>S}ñú­ø …øŒu ñüB|¿Ÿ¡§Ÿ)W|Fï…øL|ñ™øŸ „å,B/…ø^ ñû°ÿ©&ÿ+–jòRPñœŠ×ŠáCÅñ8ƒ£Iæó\UË E'Žj\2ïwAsGMÐMDç>Nü®wï—Õq8"‹ºå¦‹£û:ø‰9ç endstream endobj 212 0 obj << /Length 866 /Filter /FlateDecode >> stream xÚ}UMo£0½ó+¼‡Jí! ᫊"R»­šjµ×œ.RIý÷ë73´»«ªÐóøÍøÍÃØWß¶3ÛÏnÝjõèNÃelܬü¾;WWÕÐ\®?ÿp®uí4{ºSãÐlÝY]—›jÓwçOÞôÍë¥uësRá^ºþƒ‚uÔõ“û5sÍx0¡Ö³æ0;]ŽnœÍL#å©;¿zê,å§ÔgSŠ ütã©ú;enµÖ>°îÛr8 ±S0qj>ÉÝw};ŠBõ ½ UÛ5gÑ»9x‡¼};ÝaÓï‡`¹TóG?y:o¤÷&˜ß­»þE]&ж—ãñÕAŒÒÁj¥Z·÷u½/?v§æ_týÎ|z;:ÒØ°ÆfhÝé¸kܸë_\°Ôz¥–u½ \ßþ7g"NyÞOܵçêÚ¿Bå«`ilB ˜„‘„­=öÌã¸æ@æ )UÖ 9yŽ€IÁ(±JÅ5<–§T`¬© M55ŠÖœR£h”ºäRê ®á1ÚŸúÌSßÍïÝ(yq(¬ ábŒÆuX&Àá &èq,–Ñ1Ç+à„±N97Î8Nüœsk`Ëq8­ ^—8%Ç àŠ½FMq.â†5„Sâhú@ìkO × Ápý$Áƒqù1¦/]}Œ©Îú/þÄ©ÿ»pÒ^`ÜD3F?©ìx”‘ׯ[ë±a ¯³1´ecÔÏŒ×Àäµ!/²„1êg)câdÜ?4dâ­K^˜|É ÆÐœ•ŒáQV1¦úÔ¿‰±'²š1tæ¬?ƺ9ëÁÏY?í¡œõÇГ³þ„rY‚ÞsÖŸŸõ'Äg)4ç¬3Å7ÎYgD¹¬3¢\ÖièÇbŸ-z±â3z´âs ,>G|ÆZV|ƾ´â3Öµâ3ü´â3qÄgônÅgè·â3tZñ½[ñ¾Yñ™ê‹ÏÐoÅgè,Äg¬[ˆÏàâ3ø…ø =…øL¹â3z/Ägâ‹ÏÄÏød ,gz)ÄôRˆÿ؇…øO5ù_±T“ÿ“‚êˆÿàT¼V *ŽÇM2G˜çªZN(:‘pTã’y¿ šË8úk‚n":÷qâw½{¿¬ŽÃYôÐ-7]´Ý×ÁÎ%ç# endstream endobj 213 0 obj << /Length 866 /Filter /FlateDecode >> stream xÚ}UMo£0½ó+¼‡Jí! ᫊"R»­šjµ×œn¤" ‡þûõ›™´»«ªÐóøÍøÍÃØWß¶3ÛöÏnÝjõèÆþ<4nV~ß‚««ªoÎG×M?œk]{™ïÔÃÐ7[7©ërSmºÃtãÉ›®y=·îÂúœT¸—C÷AÁ:êúÉýš¹fœŒÖzÖgãùä†Ùdf)O‡éÕS¿`)?¥>›RTà§ÆCßÝ)sëç}`ݵeDcc0qj~‘»?tí Õ3ô&Tí¡™dDïæèBòömœÜqÓíû`¹TóG?9NÃé½ æ÷Cë†C÷¢®?è Ûóéôê Fé`µR­ÛûºÞ—»£Só/º~g>½œ ilXcÓ·n<í7ìº,µ^©e]¯×µÿÍ™ˆSž÷îÚsuí_¡ŽòU°4H6!L‰@Œ@ÂÈBŒ€Öû@æq\s óŒ”*댌C¿Ÿ¡³Ÿ±n!>ƒ_ˆÏàâ3ôâ3åŠÏ轟‰/>?ã“°œEè¥ÿÑK!þcâ?ÕäÅRMþO ª#þƒSñZ1|¨8Gxp4Éaž«j9¡èDÂQKæý.hÎÃ௠º‰èÜljèÜûeuêOÈ¢‡n¹ËE‹Ñ}üMçA endstream endobj 214 0 obj << /Length 866 /Filter /FlateDecode >> stream xÚ}UMo£0½ó+¼‡Jí! ᫊"R»­šjµ×œ.R!‡þûõ›™´»«ªÐóøÍøÍÃØWß¶3ÛÏnÝjõèNÃylܬü¾;WWÕМ®Ÿ~8׺ö2{ºSãÐlݤ®ËMµé»éÆ“7}óznÝ…õ9©p/]ÿAÁ:êúÉýš¹fêŒÖzÖf§óѳÉÌ4RžºéÕS¿`)?¥>›RTà§OÝÐß)sëç}`Ý·åp@c§`.âÔü"wßõí( Õ3ô&Tm×L2¢wsð!yûvšÜaÓï‡`¹TóG?yšÆ7Ò{ÌïÇÖ]ÿ¢®?è Ûóñøê Fé`µR­ÛûºÞ—»ƒSó/º~g>½ ilXc3´îtÜ5nÜõ/.Xj½R˺^®oÿ›3§<ï/ܵçêÚ¿Bå«`ilB ˜„‘„­=öÌã¸æ@æ )UÖ 9yŽ€IÁ(±JÅ5<–§T`¬© M55ŠÖœR£h”ºäRê ®á1Ú¿ô™/.}7¿w£XäÅ¡°6„‹0×a™G„+˜ ıXFǯ€Æ8åÜ8ã8ñsέ-Çá´.x]â”/€+ö5MĹˆÖPN‰£é±¯<1\?‚Ãõ“Æåǘ¾tõ1¦:ë¿øNýo ¼Þ…‹öë0à&š1úIe7À£Œ¼6ÞZ cx…Œ¡-‹£~¶`¼&¯ y‘%ŒQ?K'ãþ¡!/h]òÂ,àKV0†æ¬d ²Š1Õ§þMŒ=‘ÕŒ¡3gý1ÖÍY ~Îúiå¬?†žœõ'”Ëúôž³þ”ø¬?!>ëL¡9g)¾qÎ:#Êeå²NC?ûlÑ‹ŸÑ£Ÿc`ñ™8â3Ö²â3ö¥Ÿ±®Ÿá§Ÿ‰#>£w+>C¿Ÿ¡ÓŠÏèÝŠÏðÍŠÏT_|†~+>Cg!>cÝB|¿ŸÁ/Ägè)ÄgÊŸÑ{!>_|&~Æ'a9‹ÐK!þ£—BüÇ>,ĪÉÿŠ¥šüŸTGü§âµbøPq<Žðàh’9Â> stream xÚ}UÁn£0½óÞC¥öƆ¦Š"R»­Újµ×œn¤"Býûõ›™´»«ªÐóøÍøÍÃØßîg®žý,¹ÖêÁ‡ÓØúYõ}sˆ..ê¡=í}?ýð¾óÝyöx£îÇ¡}ô“º¬nëÛ~7]òmß¾ž:f}N*ýË®ÿ `uùäÍ|;MÚj=k÷³ãéàÇÙdf)O»é5P¿`©0¥>›RTà§»¡¿QæZk뾫†=;Fs§æg¹Û]ߢP=CodbÕíÚIFôn÷Á!$?¾'¿¿í·C´\ªùC˜õoRì Û0†Î‚õ§X·`ý)øë§=T°þz ÖŸQ.ëÏÐ{Áúsâ³þŒø¬3‡æ‚uæøÆëL(—u&”Ë: ýXì³C/N|FN|NÅgâˆÏXË‰ÏØ—N|ƺN|†ŸN|&ŽøŒÞø ýN|†N'>£w'>Ã7'>S}ñúø ¥øŒuKñüR|¿Ÿ¡§Ÿ)W|Fï¥øL|ñ™ø–OÂr¡—RüG/¥ø}XŠÿT“ÿG5ù?)©ŽøNÍk¥ð¡æxšàÁÑ$s„y®nä„¢ G5.™÷» =c¸&è&¢s'þ®÷ï—Õa8 ‹ºåÎ-FwMô±çi endstream endobj 216 0 obj << /Length 866 /Filter /FlateDecode >> stream xÚ}UMo£0½ó+¼‡Jí! ᫊"R»­šjµ×œn¤"Bý÷ë73´»«ªÐóøÍøÍÃØWß¶3ÛöÏnÝjõèÎýehܬü¾;WWUß\Ž®8׺vš=ß©‡¡o¶nT×å¦Út‡ñÆ“7]óziÝÄúœT¸—C÷AÁ:êúÉýš¹fÖzÖgçËÉ ³ÑÌ4Ržã«§~ÁR~J}6¥¨ÀO7œ}w§Ì­Ÿ÷u×–ýƒ¹ˆSóIîþеƒ(TÏИPµ‡f”½›£wÉÛ·ó莛nßË¥š?úÉó8¼‘Þ›`~?´n8t/êú3ž°½œN¯b”V+Õº½¯ë}ù±;:5ÿ¢ëwæÓÛɩƆ56}ëΧ]ã†]÷â‚¥Ö+µ¬ëUàºö¿9qÊó~â®=W×þê(_KƒdRÀ”Ä$ˆ| 4Àhí±dÇ52HÀH©²NÀÈÁÈsL F‰U*®áq°¬À¨8¥cMMh ¬Á¨Q´æ”Ek¤Ô%RWp ÑþÔg¾˜ún~ï±È‹Cam `4®Ã2ŽW0A/ˆc±ŒŽ9^'Œ-pʹ)pÆqâçœ[[ŽÃi]ðºÄ)9^Wì5jšˆs7¬¡ œGÓb_#xb¸~ †ë' ŒË1}éêcLuÖñ'Nýo ¼Þ…‹öë0à&š1úIe7À£Œ¼6ÞZ cx…Œ¡-‹£~¶`¼&¯ y‘%ŒQ?K'ãþ¡!/h]òÂ,àKV0†æ¬d ²Š1Õ§þMŒ=‘ÕŒ¡3gý1ÖÍY ~Îúiå¬?†žœõ'”Ëúôž³þ”ø¬?!>ëL¡9g)¾qÎ:#Êeå²NC?ûlÑ‹ŸÑ£Ÿc`ñ™8â3Ö²â3ö¥Ÿ±®Ÿá§Ÿ‰#>£w+>C¿Ÿ¡ÓŠÏèÝŠÏðÍŠÏT_|†~+>Cg!>cÝB|¿ŸÁ/Ägè)ÄgÊŸÑ{!>_|&~Æ'a9‹ÐK!þ£—BüÇ>,ĪÉÿŠ¥šüŸTGü§âµbøPq<Žðàh’9Â> stream xÚ}UMo£0½ó+¼‡Jí! ᫊"R»­šjµ×œn¤"Bý÷ë73´»«ªÐóøÍøÍÃØWß¶3ÛöÏnÝjõèÎýehܬü¾;WWUß\Ž®8׺vš=ß©‡¡o¶nT×å¦Út‡ñÆ“7]óziÝÄúœT¸—C÷AÁ:êúÉýš¹fÍb¡gÍqv¾œÜ0ÍL#åé0¾zê,å§ÔgSŠ ütÃùÐwwÊÜj­}`ݵeDcç`.âÔ|’»?tí Õ3ô&Tí¡eDïæèBòöí<ºã¦Û÷Ár©æ~ò<o¤÷&˜ß­Ý‹ºþL 'l/§Ó«ƒ¥ƒÕJµnïëz_~ìŽNÍ¿èúùôvr*¤±aMߺói׸a×½¸`©õJ-ëz¸®ýoÎDœò¼Ÿ¸kÏÕµ…:ÊWÁÒ Ù„0%1 " 0Z{ì™ÇqÍÌ0Rª¬0r0ò“‚Qb•Škx,+0*N©ÀXSšk0j­9¥FÑ)uɤÔ\Ãc´?õ™/¦¾›ß»A,òâPXÂÅë°L€#ÂLÐ âX,£cŽWÀ c œrn œqœø9çÖÀ–ãpZ¼.qJŽÀ{š&â\Ä k(§ÄÑôØ×ž®AƒáúI‚ãòcL_ºúSõ_ü‰Sÿ/„wá"¤½À: ¸‰fŒ~RÙ ð(#¯·ÖcÃ^g!chË"ƨŸ-¯ÉkC^d cÔÏRÆÄɸhÈÄ Z—¼0 ø’Œ¡9+ã¬bLõ©cOd5cèÌYŒusÖƒŸ³~ÚC9ë¡'gý å²þ½ç¬?%>ëOˆÏ:ShÎYgŠoœ³ÎˆrYgD¹¬ÓÐÅ>[ôbÅgôhÅçX|&ŽøŒµ¬øŒ}iÅg¬kÅgøiÅgâˆÏèÝŠÏÐoÅgè´â3z·â3|³â3ÕŸ¡ßŠÏÐYˆÏX·ŸÁ/Ägð ñz ñ™rÅgô^ˆÏÄŸ‰ŸñÉ@XÎ"ôRˆÿè¥ÿ± ñŸjò¿b©&ÿ'ÕÿÁ©x­>T#<8šdŽ0ÏUµœPt"á¨Æ%ó~4—að×ÝDtîãÄ?tîý²:õ'dÑC·ÜtÑbt_Ó}çn endstream endobj 218 0 obj << /Length 720 /Filter /FlateDecode >> stream xÚ}TMo£0½ó+¼‡JíÆ6„˜*ŠÄ§”öUS­öš‚ÓEj9ôß¯ß IV«ªÐcüfüæÙÌÍçŸÔÝ›õƒ{)^ìØ†ÊúÙÏ}ïÝÜä]u:Úvz´¶¶õyu|ÏCWíì$n³m¾m›éΑ·mõqªí™õ5)µïM{¥`qûjûS5e$¥_ýñÔÛÁŸFåKä¼6Ó‡ã~GnM|¹&¨Ä/;ŒM×>u/¥t¢­³îˆÞFo1닳âCÓÖÃ,R¼A²§´¨›jš¿è]IHÞ}Ž“=nÛCç­×bñâÇiø$ÅwÞâi¨íдïâöK…ޱ;õý‡…!½ÍFÔöà ;o÷G+ß5~¡¾~öVhúV¬²êj;öûÊûöÝzk)7b]–϶õk+Îx;ÌÔÔ v/)öÖ&tØ,ÝKK@F¢(.Ð$”â° §+.¢^Ê ‡] C à@FºÎ ¢è¬¨ú³fíÒàÒ¤âŒ8äúò¤Îs`ÚWg+`î#)SÎ%~Æü8§NTâ°ÒŒ¡YEð,Ê ¯(îÒ6À*†3FÓª¼r44ëP#®Y§†fÍžhhÓ°CkE8ã8å²+ûj®"7Gö9ç¢~PpúCŠ+ªRî2CËÇ#`øp¿Ëœ1q îE—Œ‡£üˆEÈ5’=„ŸF]=7úz&`ÿq•p&b¡Ã°§|Ç _/ôcØS‰½MrõÎ¤× fÈ/öÝðù%Ðm ÆðȰw öŠù\Ô‰CÞúbÖ“ ÿxö5cÖ fÌw(¥:¤§ÐKœŸz‰gßqf1iXgù·á3NpÆ óéìÓy/hHS>Wø›ÎúÁÏ#ÊÍÁ/—«ù¯¡¿ÿ5fÒerT§apC… Œ‡¦µ—ÙÖw=²è¡¡xÍøz*½¿m©ŒË endstream endobj 219 0 obj << /Length 720 /Filter /FlateDecode >> stream xÚ}TMo£0½ó+¼‡JíÆ6„˜*ŠÄ§”öUS­öš‚ÓEj9ôß¯ß IV«ªÐcüfüæÙÌÍçŸÔÝ›õƒ{)^ìØ†ÊúÙÏ}ïÝÜä]u:Úvz´¶¶õyu|ÏCWíì$n³m¾m›éΑ·mõqªí™õ5)µïM{¥`qûjûS5¥‘Ò¯ŽþxêíàO£ò%r^›éÃq¿£ ·&¾\Tâ—Ʀk„º—Rº@ÑÖYwDo£·˜õ‰ÅYñ¡iëa)Þ ÙSZÔM5Í_ô®ŽÎ$$ï>ÇÉ·í¡óÖk±xq‹ã4|’â;oñ4ÔvhÚwqû¥BÇØúþÃBÞf#j{p…7û£‹ï¿P_?{+4}+VYuµû}e‡}ûn½µ”±.ËgÛú¿µg¼fjj»—”{k:l–F #Q—hJqØ ‡Ó HQ/e†Ã.!Pp #]gQtVTýÙ³v)#l-g„À!×7À'užÓ¾:[sI œr.ñ3æ§À9u¢‡•f Í*‚gQNxEq—æ°V1ô¨˜1šVå•£¡Y‡qÍ:54köDC›†Z+ÂÇ)—]ÑØWs͹8:а/È9õƒ‚ãÐR\Qýr—z\®8Ç€û]按Sp/ ¸d8ýãDœ(B®‘ì!ü4êê¹Ñ׳0û«„30û †=å;føz¡ÞJìm’«w&½^0C~±ï†Ï/nS0†G†½K°WÌçš Nò¾Ð³žýdzG¨³ž5c¾C)Õ!=E€^â”øÔK<ûŽ3‹Iò 8ûÈ¿ Ÿq‚3N˜OgŸÎ{ACšò¹ÂßtÖ~Qn~ɸ\Í ý%ø¯1“.“£: ƒ*4¸hH`<4­½Ì¶¾ë‘E ÅóhÆ×Séý uŒÕ endstream endobj 220 0 obj << /Length 719 /Filter /FlateDecode >> stream xÚ}TMo£0½ó+¼‡JíÆ6„˜*ŠÄ§”öUS­öš‚ÓEj9ôß¯ß IV«ªÐcüfüæÙÌÍçŸÔÝ›õƒ{)^ìØ†ÊúÙÏ}ïÝÜä]u:Úvz´¶¶õyu|ÏCWíì$n³m¾m›éΑ·mõqªí™õ5)µïM{¥`qûjûS5NJJéWG<õvð§Qù9¯Íôá¸ßÑ„[_® *ñËcÓµBÝ;‚ muGô6z‹YŸXœš¶f‘â ’=¥EÝTÓüEïêèLBòîsœìqÛ:o½‹·8NÃ')¾óOCm‡¦}·_*tŒÝ©ï?,Ôém6¢¶WØyó¸?Z±ø®ñ õõ³·BÓ·b•UWÛ±ßWvØ·ïÖ[K¹ë²Üx¶­ÿ[[qÆÛa¦ ±{Ié°·6¡Ãfé^Zj0Ep‰€F ¡‡] p8]q põRf8ì2ÒuVEgEÕŸý0k—2ÂÖRqFr} yRç90í«³0÷‘”À)ç?c~ œS'*qXiÆÐ¬"xå„Wwi`CŠ£iU^9šu¨׬SC³fO4´iØ¡µ"œqœrÙ}5× ‘€£ û‚œsQ?(8ý!ÅÕ)w™¡ÇåŠã0|¸ßeΘ8÷¢€KÆÃÑ?þGĉ"äÉÂO£®ž}= °ÿ¸J8±¿ÐaØS¾c†¯ú1ì©ÄÞ&¹zgÒë3äûnøüè6cxdØ»{Å|® êÄ!ï }1ëIÐ<{„š1ë P3æ;”RÒSè%N‰O½Ä³ï8³˜4, гüÛð'8ã„ùtöé¼4¤)Ÿ+üMgýàçåæà—ŒËÕü×Ð_‚ÿ3é29ªÓ0¸¡Bƒ‹†ÆCÓÚËlë»YôÐP> stream xÚ}TMo£0½ó+¼‡JíÆ6„˜*ŠÄ§”öUS­öš‚ÓEj9ôß¯ß IV«ªÐcüfüæÙÌÍçŸÔÝ›õƒ{)^ìØ†ÊúÙÏ}ïÝÜä]u:Úvz´¶¶õyu|ÏCWíì$n³m¾m›éΑ·mõqªí™õ5)µïM{¥`qûjûS5MJJéWG<õvð§Qù9¯Íôá¸ßÑ„[_® *ñËcÓµBÝ;‚ muGô6z‹YŸXœš¶f‘â ’=¥EÝTÓüEïêèLBòîsœìqÛ:o½‹·8NÃ')¾óOCm‡¦}·_*tŒÝ©ï?,Ôém6¢¶WØyó¸?Z±ø®ñ õõ³·BÓ·b•UWÛ±ßWvØ·ïÖ[K¹ë²Üx¶­ÿ[[qÆÛa¦ ±{Ié°·6¡Ãfé^Zj0Ep‰€F ¡‡] p8]q põRf8ì2ÒuVEgEÕŸý0k—2ÂÖRqFr} yRç90í«³0÷‘”À)ç?c~ œS'*qXiÆÐ¬"xå„Wwi`CŠ£iU^9šu¨׬SC³fO4´iØ¡µ"œqœrÙ}5× ‘€£ û‚œsQ?(8ý!ÅÕ)w™¡ÇåŠã0|¸ßeΘ8÷¢€KÆÃÑ?þGĉ"äÉÂO£®ž}= °ÿ¸J8±¿ÐaØS¾c†¯ú1ì©ÄÞ&¹zgÒë3äûnøüè6cxdØ»{Å|® êÄ!ï }1ëIÐ<{„š1ë P3æ;”RÒSè%N‰O½Ä³ï8³˜4, гüÛð'8ã„ùtöé¼4¤)Ÿ+üMgýàçåæà—ŒËÕü×Ð_‚ÿ3é29ªÓ0¸¡Bƒ‹†ÆCÓÚËlë»YôÐP> endobj 151 0 obj << /Type /ObjStm /N 92 /First 837 /Length 4138 /Filter /FlateDecode >> stream xÚí\ksÛ6Öþî_ÁõîD îÀLggœøu“Ön.vR'PdÆÖV¶\INÓþú=)Q•œMgvÞLÎypn¤ÄxY”…4¾0¶V2â§-T, o ­Mác¡á_Ð…Q&Ua\„ÏP¸ˆ–åž´¾ðæ.‚ÅO[DãàÓ‘®=ìÄÒ…B• gb¡°“¾,” :²Ð¥†)¯ mÏ~I›xR˻䭅ÓÓõäoHüAâéE<É`SOùÐÁíN ó OJeÜÃyèWB ÷¼§15I ƒóVÔÜǤ« <¬ æ†ÛHÞnqi¾àÖyÌÍ9Üçñ1žE¶p[ˆ’`>‡Ê ïš–s  e³–O‡V4”ÜOÔ¸3z¼Fu¿µÿ#-œ˜Šö¿Âùp”C;ÎZ[¢qß#Ç€¸4²¤©Ð!’áó±”(áF›¬œ¼T!ç4ÆðŸhgâúàÉŸp`,¤]Ò¾ÔÊ&|kÈÔ ä*ñ83mE¬ ¹cÞ×\‹†W¥q®†)`Ègšœži ÜS ¹ÔV‡ûÔbp–x— TpWI!”úu¸Þæ¦I÷×¼6£gJjñŽšûù,*D=8 9e8Š1U¾DƒÎîhðŽ;¬^Ñíð«85x¿gØwÖ<Þ=­ÆW×éw¹GP|î‰g‹ád<:¸½šTLž.ª›7`ü{â<­ ,®‡3|*ÿx*ž‰SñZü"†âƒ‰Ñôæf(.E%>Šøw,à×Ü]W·b,þ-~q#nÅTLo+q'îðk‡IõqÁ½n$îªÙxz)~¿ÝWóÅxz é¢âÉ™˜‹…Xü>÷â“ø]|ˆ?ÅŸÕlºÏXAˆù÷…îÓ7ïÞž¼et½ }èê]éÝð5Ñ=Gâ%©ú¹­—ÚE¯wï~yyüèõê1 >«)MÒËj¨´üšz½›©ÀnÀø(?‹?Ûš]4|ýæùÉ‹'¬a¯_à÷ö¬¡qøÏ|] §ëõr»èõãù³Ã×§¨×IézON– ~Óí%þü Ó«¥U¦S¹BºÌÎÑ÷æ¿Þ ×ârxuUÍÚŠ…];?{òæÝ+úMR'ŬÅ;ôÜÕBl^îz`mýÄñƒøQœÀÑ¥€ÖÒ™£ÛâÐeÒŸ‚Ü5˜ñ2ž¥ Å6}/þhAw‹FOŸ½>ø‘ ê÷Züu @„?é° ò_¢#Šø'â9x0Ãô¶‰üˆÍ2þ‹Vø8þˆMïg_'Ì«›1 1¯>çùø3æˆëYUýu¦ˆ;EÔ³óß^=å³Qýgc“ùâ/‚¢Q_óláDÎZ9¸ÊðÎÁ]¦ÎOV€Ø)ðþtôò‡cL™§gŒÔa€Âù@Y EXØ9@=Š[™çc0ÐCðâgâLôg€ä¥š3ñ õ\¼CŸ¾Cšo/Á»Gãñb<¹¬Gø>̆£_«Y_곉u-ür:™ g¡W¿Ý'¢ú<š oÐê3[¿šUCà¿jó“j>§³¹ÃÑÜÞß|ÑÆWíˆQíw“û9y8Ãå‡ wæcÄ-¹Eí óÉp~Ýq‰ûÛKØs4U½c§¬õô‡ç'G˜ÏžõE´uà’׃ã‘4[ØF•"Ì¢­VØÍéߟ Zgr•‡øûC¿´y%eK/¼lôRJ= '‹!ÚenahZaµòÑ}®:­]T?zsr~|@ªoª CíæÞ<ÈÍ·MB‡”„Ž“‡£Ÿ·<ûK½¸ë¾ÃOÕ`1—¹¯ºïVÉ«•º6{ë¶©K•;¥®“ç/ø(7”ÊÍQ*úzökZñaëìF\<¤s¸¨›Új#´)­dŸÛ…ÞÚ¬ ô·£é%àÒ?~¬€þBî½òT°Œ ]bÙRh]ÇôæÈ²8¬§ŽÈK-²Òd­ÐM¡èÍÆ˜l+éÃÁ›ì ­€•#«$û¤˜NöÂÆKfXW@u-DFÊpÖQ¢±Bˆ)i¾„Òîò« ï²ú2¥Ð×)‰¾…4š¹Äî–‡ÑfI¥ˆ>%üHà*…¨¬b†ÜU—Ë‘ã/–³ü|±ÕÑé˜{SaT«~/¢[z2Úu*â/VlöþÂ.q üñp^Ñ/× ù¬V˜])WÜG‡¾Pä¶rò$ŸÕG«Ý°¾b˜¦ÖuŽåª]šU)ÃßÖû¥ôÛHÿžP3)ñ¢9p»…ªü{œ'2æq(l#äšÔƒïèÌñ%{¼•j^¸ÁWéhùOãK¨d¹¢ÀøøSןüÎŒ4:}Òõņ-TßõKNéÅžM¾Sž (H£ô~ê Ü/8}wÙ†I™ à"•8ߌMk²‹®`4®qO—ñ3ûøŽz6`qÀfn_Ïü>ýg˰Oÿ¡AG¦z¿šfE y5Âçmÿ@%9µgC€CÊçÙ šJ@ÄÊî ì[‹¸]ùíß\Ì\Šíy#·"àäV„¬üŠp€—_.îüH)ÄÖýÛým¿À Ð ]ѺR 5t…€]Tw-誺º‚ªº_X!§íÐÑ]¹Ýra¿EÚ°æúL¥zQq¥ÿ½€?}ú é3nr«u@ tJ¯©»Ÿ ÃÉôj‹ÆeY׃ËÃ(Ý «ê*eñz^ÕÄâô÷jø©z2…Âzv9¼A™—ÂÐó»êö€$+–?¢ùŽJÒá endstream endobj 234 0 obj << /Type /XRef /Index [0 235] /Size 235 /W [1 3 1] /Root 232 0 R /Info 233 0 R /ID [<84A07A738F097F99C3F83C084B4C40A6> <84A07A738F097F99C3F83C084B4C40A6>] /Length 593 /Filter /FlateDecode >> stream xÚ%“KoÏQ†gNÿêOÕ½.½ß[ZêÖ¢­R½)­¶´”¢¥‰ECHøB,ìì^+@ba%"«ÆÂŽ`#b-œglž¼3'¿3sfÞŸ™Ùßd–Ì­«ÂP§3tå Qr3¨Pcä¦Qk@)8Cn µÁ8¹ó¨u`=8KnU6BM ÊÁF@ICm›­‰ Ò°\$G¡´ l—ÉÑPª;À<9O;Á.p…L»A%¸NnUªÁ rèP n‘BÕz°LŽ!¦ÐHÈ`5HØš ¢N¶€VB&©“„m Áj€pØ :ÜlSl«ìûA8‚Cà08ºA8 Žã ô~pDÉèeÈ-Ý‹jÑ.ïP ¸JÔ½ˆB¢†hHW\v+˜®xŒè^´¡è9Ö>˜Snâ‹ðÚU0çVù-r—ø,žµÜþ\ã€*\¼äÖ¾7½ððUì‹*¹õþ‰g‹‹ªè6TØVLR±+V!l+Ì*Ì*,*,*Œ)Œ)ì(ì(L(L(¬'¬' §J·±ïQ¨Êíù‹PÕnï>…ªqûõ8T­{Õ×Puî£ÏBÕ»¿ùªÁS±/T£§b¨&Oï?†jöôów¨/ýªÕKV_‡jóBï#óÂ@wÆàŒ‘—ã3“…Œé·³+ó5 «‹O2–{2nóÅJYÆÝÎŒûq)FFRüœìRs V?güñû±U-xáÁ|ÁÓ~û$Mt endstream endobj startxref 296252 %%EOF xts/inst/doc/xts.Rnw0000644000176200001440000010065414634167654014146 0ustar liggesusers%\VignetteIndexEntry{xts: Extensible Time Series} \documentclass{article} \usepackage{hyperref} \hypersetup{colorlinks,% citecolor=black,% linkcolor=blue,% urlcolor=blue,% } \title{\bf xts: Extensible Time Series } \author{Jeffrey A. Ryan \and Joshua M. Ulrich} \date{May 18, 2008} \begin{document} \maketitle \tableofcontents \section{Introduction} The statistical language {\tt R}~\cite{R} offers the time-series analyst a variety of mechanisms to both store and manage time-indexed data. Native {\tt R} classes potentially suitable for time-series data include {\tt data.frame}, {\tt matrix}, {\tt vector}, and {\tt ts} objects. Additional time-series tools have been subsequently introduced in contributed packages to handle some of the domain-specific shortcomings of the native {\tt R} classes. These include {\tt irts} from the {\tt tseries} package\cite{tseries}, {\tt timeSeries} from the {\tt Rmetrics} bundle\cite{rmetrics}, and {\tt zoo}~\cite{zoo} from their respective packages. Each of these contributed classes provides unique solution to many of the issues related to working with time-series in R. While it seems a bit paradoxical with all the current options available, what {\tt R} really needed was one more time-series class. Why? Users of R have had many choices over the years for managing time-series data. This variety has meant that developers have had to pick and choose the classes they would support, or impose the necessary conversions upon the end-user. With the sheer magnitude of software packages available from CRAN, it has become a challenge for users and developers to select a time-series class that will manage the needs of the individual user, as well as remain compatible with the broadest audience. What may be sufficient for one use --- say a quick correlation matrix may be too limiting when more information needs to be incorporated in a complex calculation. This is especially true for functions that rely on time-based indexes to be manipulated or checked. The previous solution to managing different data needs often involved a series of {\tt as} calls, to coerce objects from one type to another. While this may be sufficient for many cases, it is less flexible than allowing the users to simply use the object they are accustomed to, or quite possibly require. Additionally, all current coercion methods fail to maintain the original object's data in its entirety. Converting from a {\tt timeSeries} class to {\tt zoo} would cause attributes such as {\em FinCenter}, {\em format}, and {\em recordIDs} to be lost. Converting back to a {\tt timeSeries} would then add new values different than the original. For many calculations that do not modify the data, this is most likely an acceptable side effect. For functions that convert data --- such as {\tt xts}'s {\tt to.period} --- it limits the value of the function, as the returned object is missing much of what may have been a factor in the original class consideration. One of the most important additions the new {\tt xts} class makes to the R user's workflow doesn't use {\tt xts} at all, at least not explicitly. By converting data to {\tt xts} inside a function, the function developer is guaranteed to have to only manage a single class of objects. It becomes unecessary to write specific methods to handle different data. While many functions do have methods to accommodate different classes, most do not. Before {\tt xts}, the {\tt chartSeries} function in the {\tt quantmod} package\cite{quantmod} was only able to handle {\tt zoo} objects well. Work had been done to allow for {\tt timeSeries} objects to be used as well, but many issues were still being worked out. With {\tt xts} now used internally, it is possible to use \emph{any} of R's time-series classes. Simultaneously saving development time and reducing the learning/using curve for the end user. The function now simply handles whatever time-series object it receives exactly as the user expects --- without complaint. More details, as well as examples of incorporating {\tt xts} into functions will be covered later in this document. While it may seem that {\tt xts} is primarily a tool to help make existing R code more user-friendly, the opportunity to add exciting (to software people) new functionality could not be passed up. To this end, {\tt xts} offers the user the ability to add custom attributes to any object --- during its construction or at any time thereafter. Additionally, by requiring that the index attribute be derived from one of R's existing time-based classes, {\tt xts} methods can make assumptions, while subsetting by time or date, that allow for much cleaner and accurate data manipulation. The remainder of this introduction will examine what an {\tt xts} object consists of and its basic usage, explain how developing with {\tt xts} can save package development time, and finally will demonstrate how to extend the class - informally and formally. \pagebreak \section{The structure of {\tt xts}} To understand a bit more of \emph{what an xts object can do}, it may be beneficial to know \emph{what an xts object is}. This section is intended to provide a quick overview of the basics of the class, as well as what features make it unique. \subsection{It's a {\tt zoo} in here} At the core of an {\tt xts} object is a {\tt zoo} object from the package of the same name. Simplified, this class contains an array of values comprising your data (often in matrix form) and an index attribute to provide information about the data's ordering. Most of the details surrounding zoo objects apply equally to xts. As it would be redundent to simply retell the excellent introductory zoo vignette, the reader is advised to read, absorb, and re-read that documentation to best understand the power of this class. The authors of the {\tt xts} package recognize that {\tt zoo}'s strength comes from its simplicity of use, as well as its overall flexibility. What motivated the {\tt xts} extension was a desire to have even more flexibility, while imposing reasonable constraints to make this class into a true time-based one. \subsection{{\tt xts} modifications} Objects of class {\tt xts} differ from objects of class {\tt zoo} in three key ways: the use of formal time-based classes for indexing, internal xts properties, and perhaps most uniquely --- user-added attributes. \subsubsection*{True time-based indexes} To allow for functions that make use of {\tt xts} objects as a general time-series object - it was necessary to impose a simple rule on the class. The index of each {\tt xts} object \emph{must} be of a known and supported time or date class. At present this includes any one of the following - Date, POSIXct, chron, yearmon, yearqtr, or timeDate. The relative merits of each are left to the judgement of the user, though the first three are expected to be sufficient for most applications. \subsubsection*{Internal attributes: .CLASS, .ROWNAMES, etc.} In order for one major feature of the {\tt xts} class to be possible - the conversion and re-conversion of classes to and from {\tt xts} - certain elements must be preserved within the converted object. These are for internal use, and as such require little further explanation in an introductory document. Interested readers are invited to examine the source as well as read the developer documentation. \subsubsection*{xtsAttributes} This is what makes the xts class an \emph{extensible} time-series class. Arbitrary attributes may be assigned and removed from the object without causing issues with the data's display or otherwise. Additionally this is where \emph{other} class specific attributes (e.g. \emph{FinCenter} from {\tt timeSeries}) are stored during conversion to an xts object so they may be restored with {\tt reclass}. \pagebreak \section{Using the {\tt xts} package} Just what is required to start using {\tt xts}? Nothing more than a simple conversion of your current time-series data with {\tt as.xts}, or the creation of a new object with the {\tt xts} constructor. \subsection{Creating data objects: {\tt as.xts} and {\tt xts}} There are two equally valid mechanisms to create an {\tt xts} object - coerce a supported time-series class to {\tt xts} with a call to {\tt as.xts} or create a new object from scratch with {\tt xts}. \subsubsection*{Converting your \emph{existing} time-series data: {\tt as.xts}} If you are already comfortable using a particular time-series class in {\tt R}, you can still access the functionality of {\tt xts} by converting your current objects. Presently it is possible to convert all the major time-series like classes in {\tt R} to {\tt xts}. This list includes objects of class: matrix, data.frame, ts, zoo, irts, and timeSeries. The new object will maintain all the necessary information needed to {\tt reclass} this object back to its original class if that is desired. Most classes after re-conversion will be identical to similar modifications on the original object, even after sub-setting or other changes while an {\tt xts} object. <>= require(xts) data(sample_matrix) class(sample_matrix) str(sample_matrix) matrix_xts <- as.xts(sample_matrix,dateFormat='Date') str(matrix_xts) df_xts <- as.xts(as.data.frame(sample_matrix), important='very important info!') str(df_xts) @ A few comments about the above. {\tt as.xts} takes different arguments, depending on the original object to be converted. Some classes do not contain enough information to infer a time-date class. If that is the case, POSIXct is used by default. This is the case with both matrix and data.frame objects. In the preceding examples we first requested that the new date format be of type 'Date'. The second example was left to the default {\tt xts} method with a custom attribute added. \subsubsection*{Creating new data: the {\tt xts} constructor} Data objects can also be constructed directly from raw data with the {\tt xts} constructor function, in essentially the same way a {\tt zoo} object is created with the exception that at present there is no equivelant {\tt zooreg} class. <>= xts(1:10, Sys.Date()+1:10) @ \subsection{{\tt xts} methods} There is a full complement of standard methods to make use of the features present in {\tt xts} objects. The generic methods currently extended to {\tt xts} include ``{\tt [}'', {\tt cbind}, {\tt rbind}, {\tt c}, {\tt str}, {\tt Ops}, {\tt print}, {\tt na.omit}, {\tt time}, {\tt index}, {\tt plot} and {\tt coredata}. In addition, most methods that can accept zoo or matrix objects will simply work as expected. A quick tour of some of the methods leveraged by {\tt xts} will be presented here, including subsetting via ``{\tt [}'', indexing objects with {\tt tclass} and {\tt convertIndex}, and a quick look at plotting {\tt xts} objects with the {\tt plot} function. \subsubsection*{Subsetting} The most noticable difference in the behavior of \texttt{xts} objects will be apparent in the use of the ``{\tt [}'' operator. Using special notation, one can use date-like strings to extract data based on the time-index. Using increasing levels of time-detail, it is possible to subset the object by year, week, days - or even seconds. The {\em i} (row) argument to the subset operator ``{\tt [}'', in addition to accepting numeric values for indexing, can also be a character string, a time-based object, or a vector of either. The format must left-specified with respect to the standard ISO:8601 time format --- {\em ``CCYY-MM-DD HH:MM:SS''}~\cite{ISO}. This means that for one to extract a particular month, it is necesssary to fully specify the year as well. To identify a particular hour, say all observations in the eighth hour on January 1, 2007, one would likewise need to include the full year, month and day - e.g. ``2007-01-01 08''. It is also possible to explicitly request a range of times via this index-based subsetting, using the ISO-recommended ``/'' as the range seperater. The basic form is {\em ``from/to''}, where both {\em from} and {\em to} are optional. If either side is missing, it is interpretted as a request to retrieve data from the beginning, or through the end of the data object. Another benefit to this method is that exact starting and ending times need not match the underlying data - the nearest available observation will be returned that is within the requested time period. The following example shows how to extract the entire month of March 2007 - without having to manually identify the index positions or match the underlying index type. The results have been abbreviated to save space. <>= matrix_xts['2007-03'] @ <>= head(matrix_xts['2007-03'],5) cat('...\n') @ Now extract all the data from the beginning through January 7, 2007. <>= matrix_xts['/2007-01-07'] @ <>= matrix_xts['/2007-01-07'] @ Additional xts tools providing subsetting are the {\tt first} and {\tt last} functions. In the spirit of head and tail from the {\em utils} recommended package, they allow for string based subsetting, without forcing the user to conform to the specifics of the time index, similar in usage to the {\em by} arguments of {\tt aggregate.zoo} and {\tt seq.POSIXt}. Here is the first 1 week of the data <>= first(matrix_xts,'1 week') @ <>= head(first(matrix_xts,'1 week')) @ ...and here is the first 3 days of the last week of the data. <>= first(last(matrix_xts,'1 week'),'3 days') @ \subsubsection*{Indexing} While the subsetting ability of the above makes exactly {\em which} time-based class you choose for your index a bit less relevant, it is none-the-less a factor that is beneficial to have control over. To that end, {\tt xts} provides facilities for indexing based on any of the current time-based classes. These include {\tt Date}, {\tt POSIXct}, {\tt chron}, {\tt yearmon}, {\tt yearqtr}, and {\tt timeDate}. The index itself may be accessed via the zoo generics extended to xts --- {\tt index} and the replacement function {\tt index<-}. It is also possible to directly query and set the index class of an {\tt xts} object by using the respective functions {\tt tclass} and {\tt tclass<-}. Temporary conversion, resulting in a new object with the requested index class, can be accomplished via the {\tt convertIndex} function. <>= tclass(matrix_xts) tclass(convertIndex(matrix_xts,'POSIXct')) @ \pagebreak \subsubsection*{Plotting} \SweaveOpts{height=5,width=10} %\setkeys{Gin}{width=0.8\textwidth} The use of time-based indexes within {\tt xts} allows for assumptions to be made regarding the x-axis of plots. The {\tt plot} method makes use of the {\tt xts} function {\tt axTicksByTime}, which heuristically identifies suitable tickmark locations for printing given a time-based object. When {\tt axTickByTime} is called with its {\tt ticks.on} argument set to ``auto'', the result is a vector of suitably chosen tickmark locations. One can also specify the specific points to use by passing a character string to the argument indicating which time period to create tickmarks on. <>= axTicksByTime(matrix_xts, ticks.on='months') @ A simple example of the plotting functionality offered by this labelling can be seen here: \begin{center} <>= plot(matrix_xts[,1],major.ticks='months',minor.ticks=FALSE,main=NULL,col=3) @ \end{center} \subsection{Restoring the original class - {\tt reclass} \& {\tt Reclass}} By now you may be interested in some of the xts functionality presented, and wondering how to incorporate it into a current workflow --- but not yet ready to commit to using it exclusively. If it is desirable to only use the subsetting tools for instance, a quick conversion to xts via {\tt as.xts} will allow full access to the above subsetting tools. When it is then necessary to continue your analysis using the original class, it is as simple as calling the function {\tt reclass} to return the object to its original class. \subsubsection*{(Re)converting classes manually: {\tt reclass}} <>= # using xts-style subsetting doesn't work on non-xts objects sample_matrix['2007-06'] # convert to xts to use time-based subsetting str(as.xts(sample_matrix)['2007-06']) # reclass to get to original class back str(reclass(as.xts(sample_matrix)['2007-06'])) @ This differs dramatically from the standard {\tt as.*****} conversion though. Internally, key attributes of your original data object are preserved and adjusted to assure that the process introduces no changes other than those requested. Think of it as a smart {\tt as}. Behind the scenes, {\tt reclass} has enormous value in functions that convert all incoming data to {\tt xts} for simplified processing. Often it is necessary to return an object back to the user in the class he is expecting --- following the principal of least surprise. It is in these circumstances where {\tt reclass} can turn hours of tedious development into mere minutes per function. More details on the details of using this functionality for developers will be covered in section \ref{developer}, \textbf{Developing with xts}. A user friendly interface of this \emph{reclass} functionality, though implicit, is available in the {\tt Reclass} function. It's purpose is to make it easy to preserve an object's attributes after calling a function that is not programmed to be aware of your particular class. \pagebreak \subsubsection*{Letting xts handle the details: {\tt Reclass}} If the function you require does not make use of {\tt reclass} internally, it may still be possible to let xts convert and reconvert your time-based object for you. The caveat here is that the object returned: \begin{quote} \begin{itemize} \item must be of the same length as the first argument to the function. \item intended to be coerced back to the class of the first argument \end{itemize} \end{quote} Simply wrapping the function that meets these criteria in {\tt Reclass} will result in an attempt to coerce the returned output of the function <>= z <- zoo(1:10,Sys.Date()+1:10) # filter converts to a ts object - and loses the zoo class (zf <- filter(z, 0.2)) class(zf) # using Reclass, the zoo class is preserved (zf <- Reclass(filter(z, 0.2))) class(zf) @ The {\tt Reclass} function is still a bit experimental, and will certainly improve in time, but for now provides at least an alternative option to maintain your object's class and attributes when the function you require can't on its own. \subsection{Additional time-based tools} In addition to the core {\tt xts} tools covered above, there are more functions that are included in xts to make the process of dealing with time-series data easier. Some of these have been moved from the package {\tt quantmod} to {\tt xts} to make it easier to use them within other applications. \subsubsection*{Calculate periodicity} The {\tt periodicity} function provides a quick summary as to the underlying periodicity of most time-series like objects. Primarily a wrapper to {\tt difftime} it provides a quick and concise summary of your data. <>= periodicity(matrix_xts) @ \subsubsection*{Find endpoints by time} Another common issue with time-series data is identifying the endpoints with respect to time. Often it is necessary to break data into hourly or monthly intervals to calculate some statistic. A simple call to {\tt endpoints} offers a quick vector of values suitable for subsetting a dataset by. Note that the first element it zero, which is used to delineate the \emph{end}. <>= endpoints(matrix_xts,on='months') endpoints(matrix_xts,on='weeks') @ \subsubsection*{Change periodicity} One of the most ubiquitous type of data in finance is OHLC data (Open-High-Low-Close). Often is is necessary to change the periodicity of this data to something coarser - e.g. take daily data and aggregate to weekly or monthly. With {\tt to.period} and related wrapper functions it is a simple proposition. <>= to.period(matrix_xts,'months') periodicity(to.period(matrix_xts,'months')) # changing the index to something more appropriate to.monthly(matrix_xts) @ The {\tt to.monthly} wrapper automatically requests that the returned object have an index/rownames using the {\tt yearmon} class. With the {\tt indexAt} argument it is possible to align most series returned to the end of the period, the beginning of the period, or the first or last observation of the period --- even converting to something like {\tt yearmon} is supported. The online documentation provides more details as to additional arguments. \subsubsection*{Periodically apply a function} Often it is desirable to be able to calculate a particular statistic, or evaluate a function, over a set of non-overlapping time periods. With the {\tt period.apply} family of functions it is quite simple. The following examples illustrate a simple application of the {\tt max} function to our example data. <>= # the general function, internally calls sapply period.apply(matrix_xts[,4],INDEX=endpoints(matrix_xts),FUN=max) @ <>= # same result as above, just a monthly interface apply.monthly(matrix_xts[,4],FUN=max) @ <>= # using one of the optimized functions - about 4x faster period.max(matrix_xts[,4], endpoints(matrix_xts)) @ In addition to {\tt apply.monthly}, there are wrappers to other common time frames including: {\tt apply.daily}, {\tt apply.weekly}, {\tt apply.quarterly}, and {\tt apply.yearly}. Current optimized functions include {\tt period.max}, {\tt period.min}, {\tt period.sum}, and {\tt period.prod}. \pagebreak \section{Developing with {\tt xts}} \label{developer} While the tools available to the xts \emph{user} are quite useful, possibly greater utility comes from using xts internally as a \emph{developer}. Bypassing traditional S3/S4 method dispatch and custom if-else constructs to handle different time-based classes, {\tt xts} not only makes it easy to handle all supported classes in one consistent manner, it also allows the whole process to be invisible to the function user. \subsection{One function for all classes: {\tt try.xts}} With the proliferation of data classes in R, it can be tedious, if not entirely impractical, to manage interfaces to all classes. Not only does trying to handle every possible class present non-trivial design issues, the developer is also forced to learn and understand the nuances of up to eight or more classes. For each of these classes it is then ncessary to write and manage corresponding methods for each case. At best, this reduces the time available to devote to core function functionality --- at worst is a prime opportunity to introduce errors that inevitibly come from this massive increase in code. The solution to this issue is to use one class internally within your package, or more generally your entire workflow. This can be accomplished in one of two ways: force your users to adopt the convention you do, or allow for multiple object classes by relying on internal code to convert to one consistent type. Using the second approach offers the most end-user flexibility, as class conversions are no longer required simply to make use of package functionality. The user's own workflow need not be interrupted with unproductive and potentially error-prone conversions and reconversions. Using the functionality of {\tt try.xts} and {\tt reclass} offered by the xts package allows the developer an opportunity to cleanly, and reliably, manage data with the least amount of code, and the least number of artificial end-user restrictions. An example from the xts package illustrates just how simple this can be. <>= period.apply @ Some explanation of the above code is needed. The {\tt try.xts} function takes three arguments, the first is the object that the developer is trying to convert, the second \ldots is any additional arguments to the {\tt as.xts} constructor that is called internally (ignore this for the most part --- though it should be noted that this is an R dots argument \ldots), and the third is a what the result of an error should be. Of the three, {\tt error} is probably the most useful from a design standpoint. Some functions may not be able to deal with data that isn't time-based. Simple numerical vectors might not contain enough information to be of any use. The \emph{error} argument lets the developer decide if the function should be halted at this point, or continue onward. If a logical value, the result is handled by R's standard error mechanism during the try-catch block of code internal to {\tt try.xts}. If error is a character string, it is returned to the standard output as the message. This allows for diagnostic messages to be fine tuned to your particular application. The result of this call, if successful (or if {\tt error=FALSE}) is an object that may be of class {\tt xts}. If your function can handle either numeric data or time-based input, you can branch code here for cases you expect. If your code has been written to be more general at this point, you can simply continue with your calculations, the originally converted object will contain the information that will be required to reclass it at the end. A note of importance here: if you are planning on returning an object that is of the original class, it is important to not modify the originally coverted object - in this case that would be the {\tt x} result of the {\tt try.xts} call. You will notice that the function's result is assigned to {\tt xx} so as not to impact the original converted function. If this is not possible, it is recommended to copy the object first to preserve an untouched copy for use in the {\tt reclass} function. Which leads to the second part of the process of developing with xts. \subsection{Returning the original class: {\tt reclass}} The {\tt reclass} function takes the object you are expecting to return to your user (the result of all your calculations) and optionally an {\tt xts} object that was the result of the original {\tt try.xts} call. It is important to stress that the {\tt match.to} object \emph{must be an untouched object} returned from the {\tt try.xts} call. The only exception here is when the resultant data has changed dimension --- as is the case in the {\tt period.apply} example. As reclass will try and convert the first argument to the orginal class of the second (the original class passed to the function), it must have the same general row dimension of the original. A final note on using {\tt reclass}. If the {\tt match.to} argument is left off, the conversion will only be attempted if the object is of class {\tt xts} and has a {\tt CLASS} attribute that is not {\tt NULL}, else the object is simply returned. Essentially if the object meant to be reconverted is already of in the form needed by the individual reclass methods, generally nothing more needs to be done by the developer. In many cases your function does not need to return an object that is expected to be used in the same context as the original. This would be the case for functions that summarize an object, or perform some statistical analysis. For functions that do not need the {\tt reclass} functionality, a simple use of {\tt try.xts} at the beginning of the function is all that is needed to make use of this single-interface tool within {\tt xts}. Further examples can be found in the {\tt xts} functions {\tt periodicity} and {\tt endpoints} (no use of reclass), and {\tt to.period} (returns an object of the original's class). The package {\tt quantmod} also utilizes the {\tt try.xts} functionality in its {\tt chartSeries} function --- allowing financial charts for all time-based classes. Forthcoming developer documentation will examine the functions highlighted above, as well go into more detail on exceptional cases and requirements. \pagebreak \section{Customizing and Extending xts} As \emph{extensible} is in the name of the package, it is only logical that it can be extended. The two obvious mechanisms to make {\tt xts} match the individual needs of a diverse user base is the introduction of custom attributes, and the idea of subclassing the entire {\tt xts} class. \subsection{{\tt xtsAttributes}} What makes an R attribute an {\tt xtsAttribute}? Beyond the sematics, xtsAttributes are designed to persist once attached to an object, as well as not get in the way of other object functionality. All xtsAttributes are indeed R attributes, though the same can not be said of the reverse --- all R attributes are \emph{not} xtsAttributes! Attaching arbitrary attributes to most (all?) classes other than {\tt xts} will cause the attribute to be displayed during most calls that print the object. While this isn't necessarily devestating, it is often time unsightly, and sometimes even confusing to the end user (this may depend on the quality your users). xts offers the developer and end-user the opportunity to attach attributes with a few different mechanisms - and all will be suppressed from normal view, unless specifically called upon. What makes an xtsAttribute special is that it is principally a mechanism to store and view meta-data, that is, attributes that would be seen with a call to R's {\tt attributes}. <>= str(attributes(matrix_xts)) str(xtsAttributes(matrix_xts)) # attach some attributes xtsAttributes(matrix_xts) <- list(myattr="my meta comment") attr(matrix_xts, 'another.item') <- "one more thing..." str(attributes(matrix_xts)) str(xtsAttributes(matrix_xts)) @ In general - the only attributes that should be handled directly by the user (\emph{without} the assistance of xts functions) are ones returned by {\tt xtsAttributes}. The additional attributes seen in the {\tt attributes} example are for internal R and xts use, and if you expect unbroken code, should be left alone. \subsection{Subclassing {\tt xts}} Subclassing xts is as simple as extending any other S3 class in R. Simply include the full class of the xts system in your new class. <>= xtssubclass <- structure(matrix_xts, class=c('xts2','xts','zoo')) class(xtssubclass) @ This will allow the user to override methods of xts and zoo, while still allowing for backward compatibility with all the tools of xts and zoo, much the way {\tt xts} benefits from extending {\tt zoo}. \section{Conclusion} The {\tt xts} package offers both R developers and R users an extensive set of time-aware tools for use in time-based applications. By extending the {\tt zoo} class, xts leverages an excellent infrastructure tool into a true time-based class. This simple requirement for time-based indexing allows for code to make assumptions about the object's purpose, and facilitates a great number of useful utilities --- such as time-based subsetting. Additionally, by embedding knowledge of the currently used time-based classes available in R, xts can offer the developer and end-user a single interface mechanism to make internal class decisions user-driven. This affords developers an opportunity to design applications for there intended purposes, while freeing up time previously used to manage the data structures. Future development of xts will focus on integrating xts into more external packages, as well as additional useful additions to the time-based utilities currently available within the package. An effort to provide external disk and memory based data access will also be examined for potential inclusion or extension. \begin{thebibliography}{99} \bibitem{zoo} Achim Zeileis and Gabor Grothendieck (2005): \emph{ zoo: S3 Infrastructure for Regular and Irregular Time Series.} Journal of Statistical Software, 14(6), 1-27. URL http://www.jstatsoft.org/v14/i06/ \bibitem{tseries} Adrian Trapletti and Kurt Hornik (2007): \emph{tseries: Time Series Analysis and Computational Finance.} R package version 0.10-11. \bibitem{rmetrics} Diethelm Wuertz, many others and see the SOURCE file (2007): \emph{Rmetrics: Rmetrics - Financial Engineering and Computational Finance.} R package version 260.72. http://www.rmetrics.org \bibitem{ISO} International Organization for Standardization (2004): \emph{ISO 8601: Data elements and interchage formats --- Information interchange --- Representation of dates and time} URL http://www.iso.org \bibitem{R} R Development Core Team: \emph{R: A Language and Environment for Statistical Computing}, R Foundation for Statistical Computing, Vienna, Austria. ISBN 3-900051-07-0, URL http://www.R-project.org \bibitem{quantmod} Jeffrey A. Ryan (2008): \emph{quantmod: Quantitative Financial Modelling Framework.} R package version 0.3-5. URL http://www.quantmod.com URL http://r-forge.r-project.org/projects/quantmod \end{thebibliography} \end{document} xts/inst/doc/xts-faq.R0000644000176200001440000001465214703504523014333 0ustar liggesusers### R code from vignette source 'xts-faq.Rnw' ################################################### ### code chunk number 1: preliminaries ################################################### library("xts") Sys.setenv(TZ="GMT") ################################################### ### code chunk number 2: xts-faq.Rnw:88-90 (eval = FALSE) ################################################### ## filenames <- c("a.csv", "b.csv", "c.csv") ## sample.xts <- as.xts(do.call("rbind", lapply(filenames, read.zoo))) ################################################### ### code chunk number 3: xts-faq.Rnw:106-107 (eval = FALSE) ################################################### ## lm(sample.xts[, "Res"] ~ sample.xts[, "ThisVar"] + sample.xts[, "ThatVar"]) ################################################### ### code chunk number 4: xts-faq.Rnw:110-111 (eval = FALSE) ################################################### ## with(sample.xts, lm(Res ~ ThisVar + ThatVar)) ################################################### ### code chunk number 5: xts-faq.Rnw:118-121 ################################################### sample.xts <- xts(c(1:3, 0, 0, 0), as.POSIXct("1970-01-01")+0:5) sample.xts[sample.xts==0] <- NA cbind(orig=sample.xts, locf=na.locf(sample.xts)) ################################################### ### code chunk number 6: xts-faq.Rnw:128-130 ################################################### data(sample_matrix) sample.xts <- xts(1:10, seq(as.POSIXct("1970-01-01"), by=0.1, length=10)) ################################################### ### code chunk number 7: xts-faq.Rnw:138-140 ################################################### options(digits.secs=3) head(sample.xts) ################################################### ### code chunk number 8: xts-faq.Rnw:151-154 ################################################### dt <- as.POSIXct("2012-03-20 09:02:50.001") print(as.numeric(dt), digits=20) sprintf("%20.10f", dt) ################################################### ### code chunk number 9: xts-faq.Rnw:163-164 (eval = FALSE) ################################################### ## sample.xts.2 <- xts(t(apply(sample.xts, 1, myfun)), index(sample.xts)) ################################################### ### code chunk number 10: xts-faq.Rnw:172-177 ################################################### sample.xts <- xts(1:50, seq(as.POSIXct("1970-01-01"), as.POSIXct("1970-01-03")-1, length=50)) apply.daily(sample.xts, colMeans) period.apply(sample.xts, endpoints(sample.xts, "days"), colMeans) period.apply(sample.xts, endpoints(sample.xts, "hours", 6), colMeans) ################################################### ### code chunk number 11: xts-faq.Rnw:185-186 (eval = FALSE) ################################################### ## apply.daily(sample.xts['T06:00/T17:00',], colMeans) ################################################### ### code chunk number 12: xts-faq.Rnw:196-209 ################################################### sample.xts <- xts(1:6, as.POSIXct(c("2009-09-22 07:43:30", "2009-10-01 03:50:30", "2009-10-01 08:45:00", "2009-10-01 09:48:15", "2009-11-11 10:30:30", "2009-11-11 11:12:45"))) # align index into regular (e.g. 3-hour) blocks aligned.xts <- align.time(sample.xts, n=60*60*3) # apply your function to each block count <- period.apply(aligned.xts, endpoints(aligned.xts, "hours", 3), length) # create an empty xts object with the desired regular index empty.xts <- xts(, seq(start(aligned.xts), end(aligned.xts), by="3 hours")) # merge the counts with the empty object head(out1 <- merge(empty.xts, count)) # or fill with zeros head(out2 <- merge(empty.xts, count, fill=0)) ################################################### ### code chunk number 13: xts-faq.Rnw:219-220 (eval = FALSE) ################################################### ## sample.xts <- as.xts(transform(sample.xts, ABC=1)) ################################################### ### code chunk number 14: xts-faq.Rnw:224-225 (eval = FALSE) ################################################### ## tzone(sample.xts) <- Sys.getenv("TZ") ################################################### ### code chunk number 15: xts-faq.Rnw:237-238 (eval = FALSE) ################################################### ## sample.xts[sample.xts$Symbol == "AAPL" & index(sample.xts) == as.POSIXct("2011-09-21"),] ################################################### ### code chunk number 16: xts-faq.Rnw:241-242 (eval = FALSE) ################################################### ## sample.xts[sample.xts$Symbol == "AAPL"]['2011-09-21'] ################################################### ### code chunk number 17: xts-faq.Rnw:249-253 ################################################### data(sample_matrix) sample.xts <- as.xts(sample_matrix) wday.xts <- sample.xts[.indexwday(sample.xts) %in% 1:5] head(wday.xts) ################################################### ### code chunk number 18: xts-faq.Rnw:266-268 ################################################### Data <- data.frame(timestamp=as.Date("1970-01-01"), obs=21) sample.xts <- xts(Data[,-1], order.by=Data[,1]) ################################################### ### code chunk number 19: xts-faq.Rnw:272-275 ################################################### Data <- data.frame(obs=21, timestamp=as.Date("1970-01-01")) sample.xts <- xts(Data[,!grepl("timestamp",colnames(Data))], order.by=Data$timestamp) ################################################### ### code chunk number 20: xts-faq.Rnw:288-291 (eval = FALSE) ################################################### ## x1 <- align.time(xts(Data1$obs, Data1$timestamp), n=600) ## x2 <- align.time(xts(Data2$obs, Data2$timestamp), n=600) ## merge(x1, x2) ################################################### ### code chunk number 21: xts-faq.Rnw:295-301 ################################################### data(sample_matrix) sample.xts <- as.xts(sample_matrix) sample.xts["2007-01"]$Close <- sample.xts["2007-01"]$Close + 1 #Warning message: #In NextMethod(.Generic) : # number of items to replace is not a multiple of replacement length ################################################### ### code chunk number 22: xts-faq.Rnw:314-315 (eval = FALSE) ################################################### ## sample.xts["2007-01",]$Close <- sample.xts["2007-01"]$Close + 1 ################################################### ### code chunk number 23: xts-faq.Rnw:323-324 (eval = FALSE) ################################################### ## sample.xts["2007-01","Close"] <- sample.xts["2007-01","Close"] + 1 xts/inst/doc/xts.R0000644000176200001440000001251214703504524013560 0ustar liggesusers### R code from vignette source 'xts.Rnw' ################################################### ### code chunk number 1: a ################################################### require(xts) data(sample_matrix) class(sample_matrix) str(sample_matrix) matrix_xts <- as.xts(sample_matrix,dateFormat='Date') str(matrix_xts) df_xts <- as.xts(as.data.frame(sample_matrix), important='very important info!') str(df_xts) ################################################### ### code chunk number 2: xtsconstructor ################################################### xts(1:10, Sys.Date()+1:10) ################################################### ### code chunk number 3: xtsmethods (eval = FALSE) ################################################### ## matrix_xts['2007-03'] ################################################### ### code chunk number 4: xtsmethods-hidden ################################################### head(matrix_xts['2007-03'],5) cat('...\n') ################################################### ### code chunk number 5: xtsmethods2 (eval = FALSE) ################################################### ## matrix_xts['/2007-01-07'] ################################################### ### code chunk number 6: xtsmethods2-hidden ################################################### matrix_xts['/2007-01-07'] ################################################### ### code chunk number 7: xtsfirstandlast (eval = FALSE) ################################################### ## first(matrix_xts,'1 week') ################################################### ### code chunk number 8: xtsfirstandlast-hidden ################################################### head(first(matrix_xts,'1 week')) ################################################### ### code chunk number 9: xtsfirstandlast2 ################################################### first(last(matrix_xts,'1 week'),'3 days') ################################################### ### code chunk number 10: tclass ################################################### tclass(matrix_xts) tclass(convertIndex(matrix_xts,'POSIXct')) ################################################### ### code chunk number 11: xtsaxTicksByTime ################################################### axTicksByTime(matrix_xts, ticks.on='months') ################################################### ### code chunk number 12: xtsplot ################################################### plot(matrix_xts[,1],major.ticks='months',minor.ticks=FALSE,main=NULL,col=3) ################################################### ### code chunk number 13: asxtsreclass ################################################### # using xts-style subsetting doesn't work on non-xts objects sample_matrix['2007-06'] # convert to xts to use time-based subsetting str(as.xts(sample_matrix)['2007-06']) # reclass to get to original class back str(reclass(as.xts(sample_matrix)['2007-06'])) ################################################### ### code chunk number 14: usereclass ################################################### z <- zoo(1:10,Sys.Date()+1:10) # filter converts to a ts object - and loses the zoo class (zf <- filter(z, 0.2)) class(zf) # using Reclass, the zoo class is preserved (zf <- Reclass(filter(z, 0.2))) class(zf) ################################################### ### code chunk number 15: periodicity ################################################### periodicity(matrix_xts) ################################################### ### code chunk number 16: endpoints ################################################### endpoints(matrix_xts,on='months') endpoints(matrix_xts,on='weeks') ################################################### ### code chunk number 17: toperiod ################################################### to.period(matrix_xts,'months') periodicity(to.period(matrix_xts,'months')) # changing the index to something more appropriate to.monthly(matrix_xts) ################################################### ### code chunk number 18: periodapply ################################################### # the general function, internally calls sapply period.apply(matrix_xts[,4],INDEX=endpoints(matrix_xts),FUN=max) ################################################### ### code chunk number 19: applymonthly ################################################### # same result as above, just a monthly interface apply.monthly(matrix_xts[,4],FUN=max) ################################################### ### code chunk number 20: periodsum ################################################### # using one of the optimized functions - about 4x faster period.max(matrix_xts[,4], endpoints(matrix_xts)) ################################################### ### code chunk number 21: devtryxts ################################################### period.apply ################################################### ### code chunk number 22: attributes ################################################### str(attributes(matrix_xts)) str(xtsAttributes(matrix_xts)) # attach some attributes xtsAttributes(matrix_xts) <- list(myattr="my meta comment") attr(matrix_xts, 'another.item') <- "one more thing..." str(attributes(matrix_xts)) str(xtsAttributes(matrix_xts)) ################################################### ### code chunk number 23: subclass ################################################### xtssubclass <- structure(matrix_xts, class=c('xts2','xts','zoo')) class(xtssubclass) xts/inst/doc/xts-faq.Rnw0000644000176200001440000003005414634167654014707 0ustar liggesusers%\documentclass[article,nojss]{jss} %\DeclareGraphicsExtensions{.pdf,.eps} %%\newcommand{\mysection}[2]{\subsubsection[#2]{\textbf{#1}}} %\let\mysection=\subsubsection %\renewcommand{\jsssubsubsec}[2][default]{\vskip \preSskip% % \pdfbookmark[3]{#1}{Subsubsection.\thesubsubsection.#1}% % \refstepcounter{subsubsection}% % {\large \textbf{\textit{#2}}} \nopagebreak % \vskip \postSskip \nopagebreak} %% -*- encoding: utf-8 -*- %\VignetteIndexEntry{xts FAQ} %\VignetteDepends{zoo} \documentclass{article} % \usepackage{Rd} \usepackage{Sweave} \usepackage{hyperref} \hypersetup{colorlinks,% citecolor=black,% linkcolor=blue,% urlcolor=blue,% } %%\encoding{UTF-8} %%\usepackage[UTF-8]{inputenc} % \newcommand{\q}[1]{\section*{#1}\addcontentsline{toc}{subsection}{#1}} \author{xts Deveopment Team% \footnote{Contact author: Joshua M. Ulrich \email{josh.m.ulrich@gmail.com}} \footnote{Thanks to Alberto Giannetti and Michael R. Weylandt for their many contributions.} } \title{\bf xts FAQ} %\Keywords{irregular time series, time index, daily data, weekly data, returns} %\Abstract{ % This is a collection of frequently asked questions (FAQ) about the % \pkg{xts} package together with their answers. %} \begin{document} \SweaveOpts{concordance=TRUE, engine=R, eps=FALSE} %\SweaveOpts{engine=R, eps=FALSE} <>= library("xts") Sys.setenv(TZ="GMT") @ \makeatletter \makeatother \maketitle \tableofcontents \q{What is \pkg{xts}?} % \pkg{xts} is an \pkg{R} package offering a number of functionalities to work on time-indexed data. \pkg{xts} extends \pkg{\pkg{zoo}}, another popular package for time-series analysis. % should point to the zoo FAQ here (or at some early point) \q{Why should I use \pkg{xts} rather than \pkg{zoo} or another time-series package?} % The main benefit of \pkg{xts} is its seamless compatibility with other packages using different time-series classes (\pkg{timeSeries}, \pkg{zoo}, ...). In addition, \pkg{xts} allows the user to add custom attributes to any object. See the main \pkg{xts} vignette for more information. \q{How do I install \pkg{xts}?} % \pkg{xts} depends on \pkg{zoo} and suggests some other packages. You should be able to install \pkg{xts} and all the other required components by simply calling \code{install.packages('pkg')} from the \pkg{R} prompt. \q{I have multiple .csv time-series files that I need to load in a single \pkg{xts} object. What is the most efficient way to import the files?} % If the files have the same format, load them with \code{read.zoo} and then call \code{rbind} to join the series together; finally, call \code{as.xts} on the result. Using a combination of \code{lapply} and \code{do.call} can accomplish this with very little code: <>= filenames <- c("a.csv", "b.csv", "c.csv") sample.xts <- as.xts(do.call("rbind", lapply(filenames, read.zoo))) @ \q{Why is \pkg{xts} implemented as a matrix rather than a data frame?} % \pkg{xts} uses a matrix rather than data.frame because: \begin{enumerate} \item \pkg{xts} is a subclass of \pkg{zoo}, and that's how \pkg{zoo} objects are structured; and \item matrix objects have much better performance than data.frames. \end{enumerate} \q{How can I simplify the syntax when referring to \pkg{xts} object column names?} % \code{with} allows you to use the colmn names while avoiding the full square brackets syntax. For example: <>= lm(sample.xts[, "Res"] ~ sample.xts[, "ThisVar"] + sample.xts[, "ThatVar"]) @ can be converted to <>= with(sample.xts, lm(Res ~ ThisVar + ThatVar)) @ \q{How can I replace the zeros in an \pkg{xts} object with the last non-zero value in the series?} % Convert the zeros to \code{NA} and then use \code{na.locf}: <<>>= sample.xts <- xts(c(1:3, 0, 0, 0), as.POSIXct("1970-01-01")+0:5) sample.xts[sample.xts==0] <- NA cbind(orig=sample.xts, locf=na.locf(sample.xts)) @ \q{How do I create an \pkg{xts} index with millisecond precision?} % Milliseconds in \pkg{xts} indexes are stored as decimal values. This example builds an index spaced by 100 milliseconds, starting at the current system time: <<>>= data(sample_matrix) sample.xts <- xts(1:10, seq(as.POSIXct("1970-01-01"), by=0.1, length=10)) @ \q{I have a millisecond-resolution index, but the milliseconds aren't displayed. What went wrong?} % Set the \code{digits.secs} option to some sub-second precision. Continuing from the previous example, if you are interested in milliseconds: <<>>= options(digits.secs=3) head(sample.xts) @ \q{I set \code{digits.sec=3}, but \pkg{R} doesn't show the values correctly.} % Sub-second values are stored with approximately microsecond precision. Setting the precision to only 3 decimal hides the full index value in microseconds and might be tricky to interpret depending how the machine rounds the millisecond (3rd) digit. Set the \code{digits.secs} option to a value higher than 3 or convert the date-time to numeric and use \code{print}'s \code{digits} argument, or \code{sprintf} to display the full value. For example: <<>>= dt <- as.POSIXct("2012-03-20 09:02:50.001") print(as.numeric(dt), digits=20) sprintf("%20.10f", dt) @ \q{I am using \code{apply} to run a custom function on my \pkg{xts} object. Why does the returned matrix have different dimensions than the original one?} % When working on rows, \code{apply} returns a transposed version of the original matrix. Simply call \code{t} on the returned matrix to restore the original dimensions: <>= sample.xts.2 <- xts(t(apply(sample.xts, 1, myfun)), index(sample.xts)) @ \q{I have an \pkg{xts} object with varying numbers of observations per day (e.g., one day might contain 10 observations, while another day contains 20 observations). How can I apply a function to all observations for each day?} % You can use \code{apply.daily}, or \code{period.apply} more generally: <<>>= sample.xts <- xts(1:50, seq(as.POSIXct("1970-01-01"), as.POSIXct("1970-01-03")-1, length=50)) apply.daily(sample.xts, colMeans) period.apply(sample.xts, endpoints(sample.xts, "days"), colMeans) period.apply(sample.xts, endpoints(sample.xts, "hours", 6), colMeans) @ \q{How can I process daily data for a specific time subset?} % First use time-of-day subsetting to extract the time range you want to work on (note the leading \code{"T"} and leading zeros are required for each time in the range: \code{"T06:00"}), then use \code{apply.daily} to apply your function to the subset: <>= apply.daily(sample.xts['T06:00/T17:00',], colMeans) @ \q{How can I analyze my irregular data in regular blocks, adding observations for each regular block if one doesn't exist in the origianl time-series object?} % Use \code{align.time} to round-up the indexes to the periods you are interested in, then call \code{period.apply} to apply your function. Finally, merge the result with an empty xts object that contains all the regular index values you want: <<>>= sample.xts <- xts(1:6, as.POSIXct(c("2009-09-22 07:43:30", "2009-10-01 03:50:30", "2009-10-01 08:45:00", "2009-10-01 09:48:15", "2009-11-11 10:30:30", "2009-11-11 11:12:45"))) # align index into regular (e.g. 3-hour) blocks aligned.xts <- align.time(sample.xts, n=60*60*3) # apply your function to each block count <- period.apply(aligned.xts, endpoints(aligned.xts, "hours", 3), length) # create an empty xts object with the desired regular index empty.xts <- xts(, seq(start(aligned.xts), end(aligned.xts), by="3 hours")) # merge the counts with the empty object head(out1 <- merge(empty.xts, count)) # or fill with zeros head(out2 <- merge(empty.xts, count, fill=0)) @ \q{Why do I get a \pkg{zoo} object when I call \code{transform} on my \pkg{xts} object?} % There's no \pkg{xts} method for \code{transform}, so the \pkg{zoo} method is dispatched. The \pkg{zoo} method explicitly creates a new \pkg{zoo} object. To convert the transformed object back to an \pkg{xts} object wrap the \code{transform} call in \code{as.xts}: <>= sample.xts <- as.xts(transform(sample.xts, ABC=1)) @ You might also have to reset the index timezone: <>= tzone(sample.xts) <- Sys.getenv("TZ") @ \q{Why can't I use the \code{\&} operator in \pkg{xts} objects when querying dates?} % \code{"2011-09-21"} is not a logical vector and cannot be coerced to a logical vector. See \code{?"\&"} for details. \pkg{xts}' ISO-8601 style subsetting is nice, but there's nothing we can do to change the behavior of \code{.Primitive("\&")}. You can do something like this though: <>= sample.xts[sample.xts$Symbol == "AAPL" & index(sample.xts) == as.POSIXct("2011-09-21"),] @ or: <>= sample.xts[sample.xts$Symbol == "AAPL"]['2011-09-21'] @ \q{How do I subset an \pkg{xts} object to only include weekdays (excluding Saturday and Sundays)?} % Use \code{.indexwday} to only include Mon-Fri days: <<>>= data(sample_matrix) sample.xts <- as.xts(sample_matrix) wday.xts <- sample.xts[.indexwday(sample.xts) %in% 1:5] head(wday.xts) @ \q{I need to quickly convert a data.frame that contains the time-stamps in one of the columns. Using \code{as.xts(Data)} returns an error. How do I build my \pkg{xts} object?} % The \code{as.xts} function assumes the date-time index is contained in the \code{rownames} of the object to be converted. If this is not the case, you need to use the \code{xts} constructor, which requires two arguments: a vector or a matrix carrying data and a vector of type \code{Date}, \code{POSIXct}, \code{chron}, \ldots, supplying the time index information. If you are certain the time-stamps are in a specific column, you can use: <<>>= Data <- data.frame(timestamp=as.Date("1970-01-01"), obs=21) sample.xts <- xts(Data[,-1], order.by=Data[,1]) @ If you aren't certain, you need to explicitly reference the column name that contains the time-stamps: <<>>= Data <- data.frame(obs=21, timestamp=as.Date("1970-01-01")) sample.xts <- xts(Data[,!grepl("timestamp",colnames(Data))], order.by=Data$timestamp) @ \q{I have two time-series with different frequency. I want to combine the data into a single \pkg{xts} object, but the times are not exactly aligned. I want to have one row in the result for each ten minute period, with the time index showing the beginning of the time period.} % \code{align.time} creates evenly spaced time-series from a set of indexes, \code{merge} ensure two time-series are combined in a single \pkg{xts} object with all original columns and indexes preserved. The new object has one entry for each timestamp from both series and missing values are replaced with \code{NA}. <>= x1 <- align.time(xts(Data1$obs, Data1$timestamp), n=600) x2 <- align.time(xts(Data2$obs, Data2$timestamp), n=600) merge(x1, x2) @ \q{Why do I get a warning when running the code below?} <<>>= data(sample_matrix) sample.xts <- as.xts(sample_matrix) sample.xts["2007-01"]$Close <- sample.xts["2007-01"]$Close + 1 #Warning message: #In NextMethod(.Generic) : # number of items to replace is not a multiple of replacement length @ % This code creates two calls to the subset-replacement function \code{xts:::`[<-.xts`}. The first call replaces the value of \code{Close} in a temporary copy of the first row of the object on the left-hand-side of the assignment, which works fine. The second call tries to replace the first \emph{element} of the object on the left-hand-side of the assignment with the modified temporary copy of the first row. This is the problem. For the command to work, there needs to be a comma in the first subset call on the left-hand-side: <>= sample.xts["2007-01",]$Close <- sample.xts["2007-01"]$Close + 1 @ This isn't encouraged, because the code isn't clear. Simply remember to subset by column first, then row, if you insist on making two calls to the subset-replacement function. A cleaner and faster solution is below. It's only one function call and it avoids the \code{\$} function (which is marginally slower on xts objects). <>= sample.xts["2007-01","Close"] <- sample.xts["2007-01","Close"] + 1 @ %%% What is the fastest way to subset an xts object? \end{document} xts/inst/tinytest/0000755000176200001440000000000014703320641013730 5ustar liggesusersxts/inst/tinytest/test-binsearch.R0000644000176200001440000000626014634167654017012 0ustar liggesusersna <- NA_integer_ # vector with even length, odd length # no/yes result (potential infinite loop) # https://www.topcoder.com/community/data-science/data-science-tutorials/binary-search/ info_msg <- "integer predicate no yes stops" ans <- 2L ivec <- 3:4 ikey <- ivec[ans] expect_identical(ans, xts:::binsearch(ikey, ivec, TRUE), paste(info_msg, TRUE)) expect_identical(ans, xts:::binsearch(ikey, ivec, FALSE), paste(info_msg, FALSE)) # small steps between vector elements (test that we actually stop) info_msg <- "test.double_with_small_delta_stops" ans <- 10L dvec <- 1 + (-10:10 / 1e8) dkey <- dvec[ans] expect_identical(ans, xts:::binsearch(dkey, dvec, TRUE)) expect_identical(ans, xts:::binsearch(dkey, dvec, FALSE)) info_msg <- "test.find_first_zero_even_length" ivec <- sort(c(0L, -3:5L)) dvec <- ivec * 1.0 expect_identical(4L, xts:::binsearch(0L, ivec, TRUE)) expect_identical(4L, xts:::binsearch(0.0, dvec, TRUE)) info_msg <- "test.find_last_zero_even_length" ivec <- sort(c(0L, -3:5L)) dvec <- ivec * 1.0 expect_identical(5L, xts:::binsearch(0L, ivec, FALSE)) expect_identical(5L, xts:::binsearch(0.0, dvec, FALSE)) info_msg <- "test.find_first_zero_odd_length" ivec <- sort(c(0L, -3:5L)) dvec <- ivec * 1.0 expect_identical(4L, xts:::binsearch(0L, ivec, TRUE)) expect_identical(4L, xts:::binsearch(0.0, dvec, TRUE)) info_msg <- "test.find_last_zero_odd_length" ivec <- sort(c(0L, -3:5L)) dvec <- ivec * 1.0 expect_identical(5L, xts:::binsearch(0L, ivec, FALSE)) expect_identical(5L, xts:::binsearch(0.0, dvec, FALSE)) # key is outside of vector info_msg <- "test.key_less_than_min" ivec <- 1:6 expect_identical(1L, xts:::binsearch(-9L, ivec, TRUE)) expect_identical(na, xts:::binsearch(-9L, ivec, FALSE)) dvec <- ivec * 1.0 expect_identical(1L, xts:::binsearch(-9, dvec, TRUE)) expect_identical(na, xts:::binsearch(-9, dvec, FALSE)) info_msg <- "test.key_greater_than_max" ivec <- 1:6 expect_identical(na, xts:::binsearch( 9L, ivec, TRUE)) expect_identical(6L, xts:::binsearch( 9L, ivec, FALSE)) dvec <- ivec * 1.0 expect_identical(na, xts:::binsearch( 9, dvec, TRUE)) expect_identical(6L, xts:::binsearch( 9, dvec, FALSE)) # key is NA info_msg <- "test.key_is_NA" ivec <- 1:6 ikey <- NA_integer_ expect_identical(na, xts:::binsearch(ikey, ivec, TRUE)) expect_identical(na, xts:::binsearch(ikey, ivec, FALSE)) dvec <- ivec * 1.0 dkey <- NA_real_ expect_identical(na, xts:::binsearch(dkey, dvec, TRUE)) expect_identical(na, xts:::binsearch(dkey, dvec, FALSE)) # key is zero-length info_msg <- "test.key_is_zero_length" # have empty key return NA ivec <- 1:6 ikey <- integer() expect_identical(na, xts:::binsearch(ikey, ivec, TRUE)) expect_identical(na, xts:::binsearch(ikey, ivec, FALSE)) dvec <- ivec * 1.0 dkey <- double() expect_identical(na, xts:::binsearch(dkey, dvec, TRUE)) expect_identical(na, xts:::binsearch(dkey, dvec, FALSE)) # vec is zero-length info_msg <- "test.vec_is_zero_length" # have empty vector return NA ivec <- integer() ikey <- 0L expect_identical(na, xts:::binsearch(ikey, ivec, TRUE)) expect_identical(na, xts:::binsearch(ikey, ivec, FALSE)) dvec <- double() dkey <- 0.0 expect_identical(na, xts:::binsearch(dkey, dvec, TRUE)) expect_identical(na, xts:::binsearch(dkey, dvec, FALSE)) xts/inst/tinytest/test-all.equal.R0000644000176200001440000000133514634167654016730 0ustar liggesusers# ensure xts objects with index attributes attached are equal to # xts objects with index attributes on the index only info_msg <- "test.attr_on_object_equal_to_attr_on_index" attrOnObj <- structure(1:3, index = structure(1:3, tzone = "UTC", tclass = "Date"), class = c("xts", "zoo"), dim = c(3L, 1L), .indexCLASS = "Date", .indexTZ = "UTC", tclass = "Date", tzone = "UTC", dimnames = list(NULL, "x")) attrOnIndex <- structure(1:3, index = structure(1:3, tzone = "UTC", tclass = "Date"), class = c("xts", "zoo"), dim = c(3L, 1L), dimnames = list(NULL, "x")) expect_equal(target = attrOnIndex, current = attrOnObj, info = info_msg) xts/inst/tinytest/runit.rowSums-rowMeans.R0000644000176200001440000000120214634167654020476 0ustar liggesusers test.rowSums_dispatch <- function() { x <- xts(cbind(1:3, 4:6), .Date(1:3)) y <- xts(base::rowSums(x), index(x)) checkEqualsNumeric(y, rowSums(x)) checkEquals(index(y), index(x)) d <- data.frame(x) v <- as.vector(y) checkEqualsNumeric(v, rowSums(d)) checkEquals(rownames(d), as.character(index(x))) } test.rowMeans_dispatch <- function() { x <- xts(cbind(1:3, 4:6), .Date(1:3)) y <- xts(base::rowMeans(x), index(x)) checkEqualsNumeric(y, rowMeans(x)) checkEquals(index(y), index(x)) d <- data.frame(x) v <- as.vector(y) checkEqualsNumeric(v, rowMeans(d)) checkEquals(rownames(d), as.character(index(x))) } xts/inst/tinytest/test-merge.R0000644000176200001440000002650114702522122016130 0ustar liggesuserszero_width_xts <- xts() info_msg <- "test.merge_empty_xts_with_2_scalars" m1 <- merge(zero_width_xts, 1, 1) m2 <- merge(merge(zero_width_xts, 1), 1) expect_identical(m1, zero_width_xts) expect_identical(m2, zero_width_xts) info_msg <- "test.merge_more_than_2_zero_width_objects" m1 <- merge(zero_width_xts, zero_width_xts, zero_width_xts) expect_identical(m1, zero_width_xts) ### Tests for NA in index. Construct xts object using structure() because ### xts constructors should not allow users to create objects with NA in ### the index indexHasNA_dbl <- structure(1:5, .Dim = c(5L, 1L), index = structure(c(1, 2, 3, 4, NA), tzone = "", tclass = c("POSIXct", "POSIXt")), .indexCLASS = c("POSIXct", "POSIXt"), .indexTZ = "", tclass = c("POSIXct", "POSIXt"), tzone = "", class = c("xts", "zoo")) indexHasNA_int <- structure(1:5, .Dim = c(5L, 1L), index = structure(c(1L, 2L, 3L, 4L, NA), tzone = "", tclass = c("POSIXct", "POSIXt")), .indexCLASS = c("POSIXct", "POSIXt"), .indexTZ = "", tclass = c("POSIXct", "POSIXt"), tzone = "", class = c("xts", "zoo")) info_msg <- "test.merge_index_contains_NA_integer" expect_error(merge(indexHasNA_int, indexHasNA_int), info = info_msg) info_msg <- "test.merge_index_contains_NA_double" expect_error(merge(indexHasNA_dbl, indexHasNA_dbl), info = info_msg) info_msg <- "test.merge_index_contains_NaN" x <- indexHasNA_dbl idx <- attr(x, "index") idx[length(idx)] <- NaN attr(x, "index") <- idx expect_error(merge(x, x), info = info_msg) info_msg <- "test.merge_index_contains_Inf" x <- indexHasNA_dbl idx <- attr(x, "index") idx[length(idx)] <- Inf attr(x, "index") <- idx expect_error(merge(x, x), info = info_msg) idx <- rev(idx) idx[1L] <- -Inf attr(x, "index") <- idx expect_error(merge(x, x), info = info_msg) ### /end Tests for NA in index ### zero-length fill argument info_msg <- "test.merge_fill_NULL" x1 <- .xts(1, 1) x2 <- .xts(2, 2) x <- merge(x1, x2, fill = NULL) out <- .xts(matrix(c(1, NA, NA, 2), 2), c(1,2)) colnames(out) <- c("x1", "x2") expect_identical(x, out, info = info_msg) info_msg <- "test.merge_fill_zero_length" x1 <- .xts(1, 1) x2 <- .xts(2, 2) x <- merge(x1, x2, fill = numeric()) out <- .xts(matrix(c(1, NA, NA, 2), 2), c(1,2)) colnames(out) <- c("x1", "x2") expect_identical(x, out, info = info_msg) info_msg <- "test.merge_with_zero_width_returns_original_type" M1 <- .xts(1:3, 1:3, dimnames = list(NULL, "m1")) types <- c("double", "integer", "logical", "character") for (type in types) { m1 <- M1 storage.mode(m1) <- type e1 <- .xts(,1:3) m2 <- merge(m1, e1) expect_identical(m1, m2, info = paste(info_msg, "- type =", type)) } info_msg <- "test.n_way_merge_on_all_types" D1 <- as.Date("2018-01-03")-2:0 M1 <- xts(1:3, D1, dimnames = list(NULL, "m")) M3 <- xts(cbind(1:3, 1:3, 1:3), D1, dimnames = list(NULL, c("m", "m.1", "m.2"))) types <- c("double", "integer", "logical", "character", "complex") for (type in types) { m1 <- M1 m3 <- M3 storage.mode(m1) <- storage.mode(m3) <- type m <- merge(m1, m1, m1) expect_identical(m, m3, info = paste(info_msg, "- type =", type)) } info_msg <- "test.shorter_colnames_for_unnamed_args" X <- .xts(rnorm(10, 10), 1:10) types <- c("double", "integer", "logical", "character", "complex") for (type in types) { x <- X storage.mode(x) <- type mx <- do.call(merge, list(x, x)) expect_true(all(nchar(colnames(mx)) < 200), info = paste(info_msg, "- type = ", type)) } info_msg <- "test.check_names_false" x <- .xts(1:3, 1:3, dimnames = list(NULL, "42")) y <- .xts(1:3, 1:3, dimnames = list(NULL, "21")) z <- merge(x, y) # leading "X" added expect_identical(colnames(z), c("X42", "X21"), info = info_msg) z <- merge(x, y, check.names = TRUE) # same expect_identical(colnames(z), c("X42", "X21"), info = info_msg) z <- merge(x, y, check.names = FALSE) # should have numeric column names expect_identical(colnames(z), c("42", "21"), info = info_msg) info_msg <- "test.merge_fills_complex_types" data. <- cbind(c(1:5*1i, NA, NA), c(NA, NA, 3:7*1i)) colnames(data.) <- c("x", "y") d21 <- data. d21[is.na(d21)] <- 21i x <- xts(1:5 * 1i, as.Date(1:5, origin = "1970-01-01")) y <- xts(3:7 * 1i, as.Date(3:7, origin = "1970-01-01")) z <- merge(x, y) expect_equivalent(coredata(z), data., info = paste(info_msg, "- default fill")) z <- merge(x, y, fill = 21i) expect_equivalent(coredata(z), d21, info = paste(info_msg, "- fill = 21i")) .index(x) <- as.integer(.index(x)) .index(y) <- as.integer(.index(y)) z <- merge(x, y) expect_equivalent(coredata(z), data., info = paste(info_msg, "- default fill, integer index")) z <- merge(x, y, fill = 21i) expect_equivalent(coredata(z), d21, info = paste(info_msg, "- fill = 21i, integer index")) info_msg <- "test.suffixes_appended" x <- xts(data.frame(x = 1), as.Date("2012-01-01")) y <- xts(data.frame(x = 2), as.Date("2012-01-01")) suffixes <- c("truex", "truey") out <- merge(x, y, suffixes = suffixes) expect_equal(paste0("x", suffixes), colnames(out), info = info_msg) info_msg <- "test.suffix_append_order" idx <- Sys.Date() - 1:10 x1 <- xts(cbind(alpha = 1:10, beta = 2:11), idx) x2 <- xts(cbind(alpha = 3:12, beta = 4:13), idx) x3 <- xts(cbind(alpha = 5:14, beta = 6:15), idx) suffixes <- LETTERS[1:3] mx <- merge(x1, x2, x3, suffixes = paste0('.', suffixes)) mz <- merge.zoo(x1, x2, x3, suffixes = suffixes) expect_equal(mx, as.xts(mz), info = info_msg) ### merging zero-width objects z1 <- structure(numeric(0), index = structure(1:10, class = "Date"), class = "zoo") x1 <- as.xts(z1) z2 <- structure(numeric(0), index = structure(5:14, class = "Date"), class = "zoo") x2 <- as.xts(z2) info_msg <- "merge.xts() on zero-width objects and all = TRUE matches merge.zoo()" z3 <- merge(z1, z2, all = TRUE) x3 <- merge(x1, x2, all = TRUE) # use expect_equivalent because xts index has tclass and tzone and zoo doesn't expect_equivalent(index(z3), index(x3), info = info_msg) info_msg <- "merge.xts() zero-width objects and all = FALSE matches merge.zoo()" z4 <- merge(z1, z2, all = FALSE) x4 <- merge(x1, x2, all = FALSE) # use expect_equivalent because xts index has tclass and tzone and zoo doesn't expect_equivalent(index(z4), index(x4), info = info_msg) info_msg <- "merge.xts() on zero-width objects and all = c(TRUE, FALSE) matches merge.zoo()" z5 <- merge(z1, z2, all = c(TRUE, FALSE)) x5 <- merge(x1, x2, all = c(TRUE, FALSE)) # use expect_equivalent because xts index has tclass and tzone and zoo doesn't expect_equivalent(index(z5), index(x5), info = info_msg) info_msg <- "merge.xts() on zero-width objects and all = c(FALSE, TRUE) matches merge.zoo()" z6 <- merge(z1, z2, all = c(FALSE, TRUE)) x6 <- merge(x1, x2, all = c(FALSE, TRUE)) # use expect_equivalent because xts index has tclass and tzone and zoo doesn't expect_equivalent(index(z6), index(x6), info = info_msg) ### merge.xts() matches merge.zoo() for various calls on zero-length objects with column names x <- xts(matrix(1:9, 3, 3), .Date(17167:17169), dimnames = list(NULL, c("a","b","c"))) z <- as.zoo(x) x0 <- xts(coredata(x), index(x)+5)[FALSE] z0 <- zoo(coredata(z), index(z)+5)[FALSE] xm1 <- merge(x, x0, all = c(TRUE, FALSE)) zm1 <- merge(z, z0, all = c(TRUE, FALSE)) expect_equivalent(coredata(xm1), coredata(zm1), info = "merge.xts(x, empty_named, all = c(TRUE, FALSE)) coredata matches merge.zoo()") expect_equivalent(index(xm1), index(zm1), info = "merge.xts(x, empty_named, all = c(TRUE, FALSE)) index matches merge.zoo()") xm2 <- merge(x0, x, all = c(FALSE, TRUE)) zm2 <- merge(z0, z, all = c(FALSE, TRUE)) expect_equivalent(coredata(xm2), coredata(zm2), info = "merge.xts(empty_named, x, all = c(FALSE, TRUE)) coredata matches merge.zoo()") expect_equivalent(index(xm2), index(zm2), info = "merge.xts(empty_named, x, all = c(FALSE, TRUE)) index matches merge.zoo()") xm3 <- merge(x, x0) zm3 <- merge(z, z0) expect_equivalent(coredata(xm3), coredata(zm3), info = "merge.xts(x, empty_named) coredata matches merge.zoo()") expect_equivalent(index(xm3), index(zm3), info = "merge.xts(x, empty_named) index matches merge.zoo()") xm4 <- merge(x0, x) zm4 <- merge(z0, z) expect_equivalent(coredata(xm4), coredata(zm4), info = "merge.xts(empty_named, x) coredata matches merge.zoo()") expect_equivalent(index(xm4), index(zm4), info = "merge.xts(empty_named, x) index matches merge.zoo()") # merge.zoo() returns an empty object in these cases, so we can't expect merge.xts() to match merge.zoo() #xm5 <- merge(x0, x0) #zm5 <- merge(z0, z0) #expect_equivalent(xm5, zm5, info = "merge.xts([empty_named 2x]) matches merge.zoo()") #xm6 <- merge(x0, x0, x0) #zm6 <- merge(z0, z0, z0) #expect_equivalent(xm6, zm6, info = "merge.xts([empty_named 3x]) matches merge.zoo()") xm5 <- merge(x0, x0) empty_with_dims_2x <- structure(integer(0), dim = c(0L, 6L), index = .index(x0), dimnames = list(NULL, c("a", "b", "c", "a.1", "b.1", "c.1")), class = c("xts", "zoo")) expect_identical(xm5, empty_with_dims_2x, info = "merge.xts([empty_xts_with_dims 2x]) has correct dims") # merge.zoo() returns an empty object in this case, so we can't expect merge.xts() to match merge.zoo() xm6 <- merge(x0, x0, x0) empty_with_dims_3x <- structure(integer(0), dim = c(0L, 9L), index = .index(x0), dimnames = list(NULL, c("a", "b", "c", "a.1", "b.1", "c.1", "a.2", "b.2", "c.2")), class = c("xts", "zoo")) expect_identical(xm6, empty_with_dims_3x, info = "merge.xts([empty_xts_with_dims 3x]) has correct dims") xm7 <- merge(x0, x, x0) zm7 <- merge(z0, z, z0) expect_equivalent(coredata(xm7), coredata(zm7), info = "merge.xts(empty_named, x_named, empty_named) coredata matches merge.zoo()") expect_equivalent(index(xm7), index(zm7), info = "merge.xts(empty_named, x_named, empty_named) index matches merge.zoo()") xz <- xts(integer(0), .Date(integer(0))) expect_identical(storage.mode(merge(xz, xz)), "integer", info = "merge.xts() on two empty objects should return an object with the same type") ### merging xts with plain vectors x <- xts(matrix(1:9, 3, 3), .Date(17167:17169), dimnames = list(NULL, c("a","b","c"))) z <- as.zoo(x) v <- seq_len(nrow(x)) x1 <- merge(x, v) z1 <- merge(z, v) expect_equivalent(coredata(x1), coredata(z1), info = "merge.xts(x_named, vector) coredata matches merge.zoo()") expect_equivalent(index(x1), index(z1), info = "merge.xts(x_named, vector) index matches merge.zoo()") x2 <- merge(x, x, v) z2 <- merge(z, z, v) expect_equivalent(coredata(x2), coredata(z2), info = "merge.xts(x_named_2x, vector) coredata matches merge.zoo()") expect_equivalent(index(x2), index(z2), info = "merge.xts(x_named_2x, vector) index matches merge.zoo()") x3 <- merge(x, v, x) z3 <- merge(z, v, z) expect_equivalent(coredata(x3), coredata(z3), info = "merge.xts(x_named, vector, x_named) coredata matches merge.zoo()") expect_equivalent(index(x3), index(z3), info = "merge.xts(x_named, vector, x_named) index matches merge.zoo()") # this was throwing a warning because 'dbl' was unnecessarily being converted to integer retside <- c(TRUE, FALSE) int <- xts(1:10, .Date(1:10)) dbl <- int + 1e20 expect_silent(merge(int, dbl, retside = retside), info = "merge.xts(xts_int, xts_dbl) doesn't warn when xts_dbl isn't returned") expect_silent(merge(dbl, int, retside = rev(retside)), info = "merge.xts(xts_dbl, xts_int) doesn't warn when xts_dbl isn't returned") xts/inst/tinytest/test-print.R0000644000176200001440000000422614634167654016210 0ustar liggesusersx <- xts(cbind(1:10, 1:10), .Date(1:10)) # NOTE: expected value is (2 + 2) to account for # (1) column header: " [,1] [,2]" # (2) message: "[ reached getOption("max.print") -- omitted 6 rows ]" print_output <- utils::capture.output(print(x, max = 4)) expect_true(length(print_output) == (2 + 2), info = "'max' argument is respected'") print_output <- utils::capture.output(print(x, max = 4, show.nrows = 10)) expect_true(length(print_output) == (2 + 2), info = "'max' takes precedence over 'show.nrows'") expect_silent(p <- print(drop(x[, 1])), info = "print.xts() does not error when object doesn't have dims") print_output <- utils::capture.output(print(drop(x[1:2, 1]))) expect_true(all(grepl("1970-01", print_output[-1])), info = "print.xts() output shows index when object doesn't have dims") # 'show.nrows' > 'trunc.rows' print_output <- utils::capture.output(print(x, show.nrows = 10, trunc.rows = 4)) expect_true(length(print_output)-1 == nrow(x), info = "print.xts() shows correct number of rows when show.nrows > trunc.rows") y <- xts(cbind(1:11, 1:11), .Date(1:11)) show_nrows <- floor(nrow(y) / 2) print_output <- utils::capture.output(print(y, show.nrows = show_nrows, trunc.rows = nrow(y)-2)) expect_true(length(print_output)-1 == 2*show_nrows+1, info = "print.xts() shows correct number of rows when show.nrows < trunc.rows / 2") show_nrows <- ceiling(nrow(y) / 2) print_output <- utils::capture.output(print(y, show.nrows = show_nrows, trunc.rows = nrow(y)-2)) expect_true(length(print_output)-1 == nrow(y), info = "print.xts() shows correct number of rows when show.nrows > trunc.rows / 2") print_output <- utils::capture.output(p <- print(x)) expect_identical(p, x, info = "returns input invisibly") z <- .xts(matrix(0, nrow = 200, ncol = 200), 1:200) expect_silent(print(z), info = "print more columns than width doesn't error") expect_silent(print(x, quote = TRUE), info = "print.xts() does not error when 'quote' argument is used") expect_silent(print(x, right = TRUE), info = "print.xts() does not error when 'right' argument is used") xts/inst/tinytest/test-parseISO8601.R0000644000176200001440000000746514634167654017070 0ustar liggesusers# Constants TZ <- "UTC" START_N <- 1424390400 START_T <- .POSIXct(START_N, "UTC") END_N <- 1425168000 END_T <- .POSIXct(1425168000, "UTC") ### Test basic functionality for dates (TODO: date-times) info_msg <- "test.all_dates" out <- list(first.time = START_T, last.time = END_T) y <- .parseISO8601("/", START_N, END_N, "UTC") expect_identical(y, out, info = info_msg) y <- .parseISO8601("::", START_N, END_N, "UTC") expect_identical(y, out, info = info_msg) info_msg <- "test.start_to_right_open" y <- .parseISO8601("2015-02-21/", START_N, END_N, "UTC") start_t <- as.POSIXct("2015-02-21", tz = "UTC") expect_identical(y, list(first.time = start_t, last.time = END_T), info = info_msg) info_msg <- "test.left_open_to_end" y <- .parseISO8601("/2015-02-21", START_N, END_N, "UTC") end_t <- as.POSIXct("2015-02-22", tz = "UTC") - 1e-5 expect_identical(y, list(first.time = START_T, last.time = end_t), info = info_msg) info_msg <- "test.left_open_to_end" y <- .parseISO8601("/2015-02-21", START_N, END_N, "UTC") end_t <- as.POSIXct("2015-02-22", tz = "UTC") - 1e-5 expect_identical(y, list(first.time = START_T, last.time = end_t), info = info_msg) info_msg <- "test.single_date" y <- .parseISO8601("2015-02-21", START_N, END_N, "UTC") start_t <- as.POSIXct("2015-02-21", tz = "UTC") end_t <- as.POSIXct("2015-02-22", tz = "UTC") - 1e-5 expect_identical(y, list(first.time = start_t, last.time = end_t), info = info_msg) ### Test expected failures ### These don't produce errors, but instead return values in UNKNOWN_TIME UNKNOWN_TIME <- list(first.time = NA_real_, last.time = NA_real_) info_msg <- "test.start_end_dates_do_not_exist" x <- "2014-02-30/2015-02-30" expect_warning(y <- .parseISO8601(x, START_N, END_N, "UTC"), pattern = "cannot determine first and last time") y <- suppressWarnings(.parseISO8601(x, START_N, END_N, "UTC")) expect_identical(y, UNKNOWN_TIME, info = info_msg) ### test.start_date_does_not_exist <- function() { ### DEACTIVATED("FAILS: returns everything") ### x <- "2015-02-30/2015-03-03" ### y <- .parseISO8601(x, START_N, END_N, "UTC") ### expect_identical(y, UNKNOWN_TIME, info = info_msg) ### } ### ### test.end_date_does_not_exist <- function() { ### DEACTIVATED("FAILS: returns everything") ### x <- "2015-02-25/2015-02-30" ### y <- .parseISO8601(x, START_N, END_N, "UTC") ### expect_identical(y, UNKNOWN_TIME, info = info_msg) ### } ### Fuzz tests info_msg <- "test.start_end_dates_are_garbage" x <- "0.21/8601.21" expect_warning(y <- .parseISO8601(x, START_N, END_N, "UTC"), pattern = "cannot determine first and last time") expect_identical(y, UNKNOWN_TIME, info = info_msg) info_msg <- "test.start_date_is_garbage" out <- list(first.time = START_T, last.time = as.POSIXct("2015-02-22", tz = "UTC") - 1e-5) x <- "garbage/2015-02-21" expect_warning(y <- .parseISO8601(x, START_N, END_N, "UTC"), pattern = "NAs introduced by coercion") expect_identical(y, out, info = info_msg) x <- "0.21/2015-02-21" y <- .parseISO8601(x, START_N, END_N, "UTC") expect_identical(y, out, info = info_msg) info_msg <- "test.end_date_is_garbage" out <- list(first.time = as.POSIXct("2015-02-25", tz = "UTC"), last.time = END_T) ### # ERRORS (uninformative) ### x <- "2015-02-25/garbage" ### y <- .parseISO8601(x, START_N, END_N, "UTC") ### expect_identical(y, UNKNOWN_TIME, info = info_msg) x <- "2015-02-25/8601.21" y <- .parseISO8601(x, START_N, END_N, "UTC") expect_identical(y, out, info = info_msg) info_msg <- "test.single_date_is_garbage" ### # ERRORS (uninformative) ### y <- .parseISO8601("garbage", START_N, END_N, "UTC") ### expect_identical(y, UNKNOWN_TIME, info = info_msg) expect_warning(y <- .parseISO8601("0.21", START_N, END_N, "UTC"), pattern = "cannot determine first and last time") expect_identical(y, UNKNOWN_TIME, info = info_msg) xts/inst/tinytest/test-periodicity.R0000644000176200001440000002041414634167654017375 0ustar liggesusersP <- structure( list(difftime = structure(0, units = "secs", class = "difftime"), frequency = 0, start = structure(.POSIXct(1, "UTC"), tclass = c("POSIXct", "POSIXt")), end = structure(.POSIXct(1, "UTC"), tclass = c("POSIXct", "POSIXt")), units = "secs", scale = "seconds", label = "second"), class = "periodicity") test_date <- as.Date("2022-10-15") info_msg <- "test.periodicity_on_one_observation_warns" x <- xts(1, .POSIXct(1, "UTC")) suppressWarnings(p <- periodicity(x)) expect_identical(p, P, info = info_msg) expect_warning(p <- periodicity(x), info = info_msg) info_msg <- "test.periodicity_on_zero_observations_warns" x <- xts(, .POSIXct(numeric(0), "UTC")) suppressWarnings(p <- periodicity(x)) P$start <- NA P$end <- NA expect_identical(p, P, info = info_msg) expect_warning(p <- periodicity(x)) check_periodicity_result <- function(p, units, scale, freq, msg) { info_msg <- paste0(msg, " - units: ", p$units, ", expected: ", units) expect_equivalent(p$units, units, info = info_msg) info_msg <- paste0(msg, " - scale: ", p$scale, ", expected: ", scale) expect_equivalent(p$scale, scale, info = info_msg) info_msg <- paste0(msg, " - frequency: ", p$frequency, ", expected: ", freq) expect_equivalent(p$frequency, freq, info = info_msg) info_msg <- paste0(msg, " - difftime: ", p$difftime, ", expected: ", freq) expect_equivalent(as.numeric(p$difftime), freq, info = info_msg) invisible(NULL) } ############################################################################### info_msg <- "test.periodicity_on_sub_second_data" set.seed(Sys.Date()) for (i in 1:100) { n <- sample(1000, 1) / 1000 #if (n >= eps) n <- 1 p <- periodicity(.xts(seq_len(100), n * seq_len(100))) check_periodicity_result(p, "secs", "seconds", n, info_msg) } # test periodicity between 0.95 and 1, which should round up to 1 #set.seed(Sys.Date()) #for (n in seq(0.9505, 0.99, 0.005)) { # p <- periodicity(.xts(seq_len(100), n * seq_len(100))) # check_periodicity_result(p, "secs", "seconds", n, info_msg) #} ############################################################################### info_msg <- "test.periodicity_on_second_data" i <- seq_len(100) for (n in 1:59) { p <- periodicity(.xts(i, i)) check_periodicity_result(p, "secs", "seconds", 1, info_msg) } ############################################################################### info_msg <- "test.periodicity_on_minute_data" i <- seq_len(100) * 60 for (n in 1:59) { p <- periodicity(.xts(i, n * i)) check_periodicity_result(p, "mins", "minute", n, info_msg) } ############################################################################### info_msg <- "test.periodicity_on_hourly_data" i <- seq_len(100) * 3600 for (n in 1:23) { p <- periodicity(.xts(i, n * i)) # NOTE: frequency is in seconds for hourly data (see #54) check_periodicity_result(p, "hours", "hourly", n * 3600, info_msg) } ############################################################################### info_msg <- "test.periodicity_on_daily_data" i <- seq_len(100) * 86400 # NOTE: frequency is in seconds for daily data (see #54) n <- 1 p <- periodicity(.xts(i, n * i)) check_periodicity_result(p, "days", "daily", n * 86400, info_msg) n <- 2 p <- periodicity(.xts(i, n * i)) check_periodicity_result(p, "days", "weekly", n * 86400, info_msg) n <- 3 p <- periodicity(.xts(i, n * i)) check_periodicity_result(p, "days", "weekly", n * 86400, info_msg) ############################################################################### info_msg <- "test.periodicity_on_weekly_data" i <- 7 * seq_len(100) * 86400 # NOTE: frequency is in seconds for weekly data (see #54) n <- 1 p <- periodicity(.xts(i, n * i)) check_periodicity_result(p, "days", "weekly", n * 86400 * 7, info_msg) n <- 2 p <- periodicity(.xts(i, n * i)) check_periodicity_result(p, "days", "monthly", n * 86400 * 7, info_msg) n <- 3 p <- periodicity(.xts(i, n * i)) check_periodicity_result(p, "days", "monthly", n * 86400 * 7, info_msg) ############################################################################### info_msg <- "test.periodicity_on_month_data" n <- 1 i <- seq(as.yearmon(test_date) - 12, by = n/12, length.out = 100) x <- xts(i, i) p <- periodicity(x) check_periodicity_result(p, "days", "monthly", 86400 * 31, info_msg) # monthly POSIXct index(x) <- as.POSIXct(i) p <- periodicity(x) check_periodicity_result(p, "days", "monthly", 86400 * 31, info_msg) n <- 2 i <- seq(as.yearmon(test_date) - 12, by = n/12, length.out = 100) x <- xts(i, i) p <- periodicity(x) check_periodicity_result(p, "days", "quarterly", 86400 * 61, info_msg) # monthly POSIXct index(x) <- as.POSIXct(i) p <- periodicity(x) check_periodicity_result(p, "days", "quarterly", 86400 * 61, info_msg) ############################################################################### info_msg <- "test.periodicity_on_quarter_data" n <- 1 i <- seq(as.yearqtr(test_date) - 24, by = n/4, length.out = 100) x <- xts(i, i) p <- periodicity(x) check_periodicity_result(p, "days", "quarterly", 86400 * 91, info_msg) # quarterly POSIXct index(x) <- as.POSIXct(i) p <- periodicity(x) check_periodicity_result(p, "days", "quarterly", 86400 * 91, info_msg) n <- 2 i <- seq(as.yearqtr(test_date) - 48, by = n/4, length.out = 100) p <- periodicity(xts(seq_len(100), i)) check_periodicity_result(p, "days", "yearly", 86400 * 183, info_msg) # quarterly POSIXct index(x) <- as.POSIXct(i) p <- periodicity(x) check_periodicity_result(p, "days", "yearly", 86400 * 183, info_msg) n <- 3 i <- seq(as.yearqtr(test_date) - 50, by = n/4, length.out = 100) p <- periodicity(xts(seq_len(100), i)) check_periodicity_result(p, "days", "yearly", 86400 * 274, info_msg) # quarterly POSIXct index(x) <- as.POSIXct(i) p <- periodicity(x) check_periodicity_result(p, "days", "yearly", 86400 * 274, info_msg) ############################################################################### ### These are the breakpoints in the code as-of 2022-10 ### Woe to the soul who breaks backward compatibility! info_msg <- "test.correct_units_for_edge_cases" test01 <- list(p = 59, units = "secs", scale = "seconds") test02 <- list(p = 60, units = "mins", scale = "minute") test03 <- list(p = 3600, units = "hours", scale = "hourly") test04 <- list(p = 86400 - 1, units = "hours", scale = "hourly") test05 <- list(p = 86400, units = "days", scale = "daily") test06 <- list(p = 604800 - 1, units = "days", scale = "weekly") test07 <- list(p = 2678400 - 1, units = "days", scale = "monthly") test08 <- list(p = 7948800 - 1, units = "days", scale = "quarterly") test09 <- list(p = 7948800, units = "days", scale = "quarterly") test10 <- list(p = 1 + 7948800, units = "days", scale = "yearly") result01 <- periodicity(.xts(, test01$p * seq_len(100))) result02 <- periodicity(.xts(, test02$p * seq_len(100))) result03 <- periodicity(.xts(, test03$p * seq_len(100))) result04 <- periodicity(.xts(, test04$p * seq_len(100))) result05 <- periodicity(.xts(, test05$p * seq_len(100))) result06 <- periodicity(.xts(, test06$p * seq_len(100))) result07 <- periodicity(.xts(, test07$p * seq_len(100))) result08 <- periodicity(.xts(, test08$p * seq_len(100))) result09 <- periodicity(.xts(, test09$p * seq_len(100))) result10 <- periodicity(.xts(, test10$p * seq_len(100))) expect_identical(test01$units, result01$units, info = do.call(paste, c(list(info_msg), test01))) expect_identical(test02$units, result02$units, info = do.call(paste, c(list(info_msg), test02))) expect_identical(test03$units, result03$units, info = do.call(paste, c(list(info_msg), test03))) expect_identical(test04$units, result04$units, info = do.call(paste, c(list(info_msg), test04))) expect_identical(test05$units, result05$units, info = do.call(paste, c(list(info_msg), test05))) expect_identical(test06$units, result06$units, info = do.call(paste, c(list(info_msg), test06))) expect_identical(test07$units, result07$units, info = do.call(paste, c(list(info_msg), test07))) expect_identical(test08$units, result08$units, info = do.call(paste, c(list(info_msg), test08))) expect_identical(test09$units, result09$units, info = do.call(paste, c(list(info_msg), test09))) expect_identical(test10$units, result10$units, info = do.call(paste, c(list(info_msg), test10))) info_msg <- "periodicity warns when 'x' is time-based and contains NA" x <- .Date(c(1:5, NA, 7:10)) expect_warning(periodicity(x), info = info_msg) xts/inst/tinytest/test-zoo.R0000644000176200001440000000372214634167654015663 0ustar liggesusers#sample.zoo <- #structure(c(43.46, 43.3, 43.95, 43.89, 44.01, 43.96, 44.71, 45.02, #45.35, 45.09), .Names = c("264", "263", "262", "261", "260", #"259", "258", "257", "256", "255"), index = structure(c(13516, #13517, 13518, 13521, 13522, 13523, 13524, 13525, 13529, 13530 #), class = "Date"), class = "zoo") # #sample.xts <- #structure(c(43.46, 43.3, 43.95, 43.89, 44.01, 43.96, 44.71, 45.02, #45.35, 45.09), index = structure(c(13516, 13517, 13518, 13521, #13522, 13523, 13524, 13525, 13529, 13530), class = "Date"), class = c("xts", #"zoo"), .CLASS = "zoo", .Dim = c(10L, 1L), .Dimnames = list(c("264", #"263", "262", "261", "260", "259", "258", "257", "256", "255" #), NULL), .ROWNAMES = c("264","263","262", "261", "260", "259", #"258", "257", "256", "255")) # data(sample_matrix) sample.zoo <- zoo(sample_matrix, as.Date(rownames(sample_matrix))) sample.xts <- as.xts(sample.zoo) info_msg <- "test.convert_zoo_to_xts" expect_identical(sample.xts, as.xts(sample.zoo), info = info_msg) info_msg <- "test.convert_zoo_to_xts_j1" expect_identical(sample.xts[,1], as.xts(sample.zoo)[,1], info = info_msg) info_msg <- "test.convert_zoo_to_xts_i1" expect_identical(sample.xts[1,], as.xts(sample.zoo)[1,], info = info_msg) info_msg <- "test.convert_zoo_to_xts_i1j1" expect_identical(sample.xts[1,1], as.xts(sample.zoo)[1,1], info = info_msg) # test.zoo_reclass <- function() { # DEACTIVATED("rownames are not kept yet in current xts-dev") # expect_identical(sample.zoo,reclass(try.xts(sample.zoo)), info = info_msg) # } # test.zoo_reclass_subset_reclass_j1 <- function() { # DEACTIVATED("rownames are not kept yet in current xts-dev") # expect_identical(sample.zoo[,1],reclass(try.xts(sample.zoo))[,1], info = info_msg) # } info_msg <- "test.zoo_reclass_subset_as.xts_j1" expect_identical(sample.zoo[,1], reclass(try.xts(sample.zoo)[,1]), info = info_msg) info_msg <- "test.zoo_reclass_subset_zoo_j1" expect_identical(sample.zoo[,1], reclass(try.xts(sample.zoo[,1])), info = info_msg) xts/inst/tinytest/test-na.locf.R0000644000176200001440000001202114634167654016364 0ustar liggesusersxdata <- .xts(c(1, NA, 3, 4, 5, 6), c(0, 4, 10, 19, 24, 29)) xdata2 <- merge(one = xdata, two = xdata) xindex <- .xts(rep(0, 5), c(5, 10, 20, 25, 28)) types <- c("double", "integer", "character", "logical") ### na.locf.xts() on a univariate xts object info_msg <- "test.nalocf" for (type in types) { xdat <- xdata storage.mode(xdat) <- type zdat <- as.zoo(xdat) x <- na.locf(xdat) z <- na.locf(zdat) #expect_identical(x, as.xts(z)) # FALSE (attribute order differs) expect_equal(x, as.xts(z), info = paste(info_msg, "-", type)) } info_msg <- "test.nalocf_leading_NA" for (type in types) { xdat <- xdata storage.mode(xdat) <- type zdat <- as.zoo(xdat) xdat[1] <- NA zdat[1] <- NA x <- na.locf(xdat, na.rm = TRUE) z <- na.locf(zdat, na.rm = TRUE) expect_equal(x, as.xts(z), info = paste(info_msg, "-", type)) x <- na.locf(xdat, na.rm = FALSE) z <- na.locf(zdat, na.rm = FALSE) expect_equal(x, as.xts(z), info = paste(info_msg, "-", type)) } info_msg <- "test.nalocf_fromLast" for (type in types) { xdat <- xdata storage.mode(xdat) <- type zdat <- as.zoo(xdat) x <- na.locf(xdat, fromLast = TRUE) z <- na.locf(zdat, fromLast = TRUE) expect_equal(x, as.xts(z), info = paste(info_msg, "-", type)) } info_msg <- "test.nalocf_x" for (type in types) { xdat <- xdata xidx <- xindex storage.mode(xdat) <- storage.mode(xidx) <- type zdat <- as.zoo(xdat) zidx <- as.zoo(xidx) xidx <- rbind(xidx, .xts(vector(type, 1), 30)) zidx <- as.zoo(xidx) x <- na.locf(xdat, x = index(xidx)) z <- na.locf(zdat, x = index(zidx)) expect_equal(x, as.xts(z), info = paste(info_msg, "-", type)) } info_msg <- "test.nalocf_xout" for (type in types) { xdat <- xdata xidx <- xindex storage.mode(xdat) <- storage.mode(xidx) <- type zdat <- as.zoo(xdat) zidx <- as.zoo(xidx) x <- na.locf(xdat, xout = index(xidx)) z <- na.locf(zdat, xout = index(zidx)) expect_equal(x, as.xts(z), info = paste(info_msg, "-", type)) } ### na.locf.xts() on a multivariate xts object info_msg <- "test.nalocf_by_column" for (type in types) { xdat <- xdata2 storage.mode(xdat) <- type zdat <- as.zoo(xdat) x <- na.locf(xdat) z <- na.locf(zdat) expect_equal(x, as.xts(z), info = paste(info_msg, "-", type)) } info_msg <- "test.nalocf_by_column_leading_NA" for (type in types) { xdat <- xdata2 storage.mode(xdat) <- type zdat <- as.zoo(xdat) xdat[1] <- NA zdat[1] <- NA if (FALSE) { ### bug w/zoo causes this to fail ### zoo:::na.locf.default() does not remove the first row x <- na.locf(xdat, na.rm = TRUE) z <- na.locf(zdat, na.rm = TRUE) expect_equal(x, as.xts(z), info = paste(info_msg, "-", type)) } x <- na.locf(xdat, na.rm = FALSE) z <- na.locf(zdat, na.rm = FALSE) expect_equal(x, as.xts(z), info = paste(info_msg, "-", type)) } info_msg <- "test.nalocf_by_column_fromLast" for (type in types) { xdat <- xdata2 storage.mode(xdat) <- type zdat <- as.zoo(xdat) x <- na.locf(xdat, fromLast = TRUE) z <- na.locf(zdat, fromLast = TRUE) expect_equal(x, as.xts(z), info = paste(info_msg, "-", type)) } info_msg <- "test.nalocf_by_column_x" for (type in types) { xdat <- xdata2 xidx <- xindex storage.mode(xdat) <- storage.mode(xidx) <- type zdat <- as.zoo(xdat) zidx <- as.zoo(xidx) xidx <- rbind(xidx, .xts(vector(type, 1), 30)) zidx <- as.zoo(xidx) x <- na.locf(xdat, x = index(xidx)) z <- na.locf(zdat, x = index(zidx)) expect_equal(x, as.xts(z), info = paste(info_msg, "-", type)) } info_msg <- "test.nalocf_by_column_xout" for (type in types) { xdat <- xdata2 xidx <- xindex storage.mode(xdat) <- storage.mode(xidx) <- type zdat <- as.zoo(xdat) zidx <- as.zoo(xidx) x <- na.locf(xdat, xout = index(xidx)) z <- na.locf(zdat, xout = index(zidx)) expect_equal(x, as.xts(z), info = paste(info_msg, "-", type)) } info_msg <- "test.nalocf_by_column_1NA" narow <- 1L for (type in types) { xdrow <- xdata2[narow,] xdat <- xdata2 * NA xdat[narow,] <- xdrow storage.mode(xdat) <- type zdat <- as.zoo(xdat) x <- na.locf(xdat) z <- na.locf(zdat) expect_equal(x, as.xts(z), info = paste(info_msg, "-", type)) } info_msg <- "test.nalocf_by_column_1NA_fromLast" narow <- nrow(xdata2) for (type in types) { xdrow <- xdata2[narow,] xdat <- xdata2 * NA xdat[narow,] <- xdrow storage.mode(xdat) <- type zdat <- as.zoo(xdat) x <- na.locf(xdat, fromLast = TRUE) z <- na.locf(zdat, fromLast = TRUE) expect_equal(x, as.xts(z), info = paste(info_msg, "-", type)) } info_msg <- "test.nalocf_first_column_all_NA" nacol <- 1L for (type in types) { xdat <- xdata2 xdat[,nacol] <- xdat[,nacol] * NA storage.mode(xdat) <- type zdat <- as.zoo(xdat) x <- na.locf(xdat) z <- na.locf(zdat) expect_equal(x, as.xts(z), info = paste(info_msg, "-", type)) } info_msg <- "test.nalocf_last_column_all_NA" nacol <- NCOL(xdata2) for (type in types) { xdat <- xdata2 xdat[,nacol] <- xdat[,nacol] * NA storage.mode(xdat) <- type zdat <- as.zoo(xdat) x <- na.locf(xdat) z <- na.locf(zdat) expect_equal(x, as.xts(z), info = paste(info_msg, "-", type)) } xts/inst/tinytest/test-xts.methods.R0000644000176200001440000002711114634167654017332 0ustar liggesusers# unit tests for the following 'xts' methods: # rbind # cbind # info_msg <- "test.rbind_zero_length_non_zero_length_POSIXct_errors" xpz <- xts( , as.POSIXct("2017-01-01")) xp1 <- xts(1, as.POSIXct("2017-01-02")) zpz <- as.zoo(xpz) zp1 <- as.zoo(xp1) zpe <- tryCatch(rbind(zpz, zp1), error = identity) xpe <- tryCatch(rbind(xpz, xp1), error = identity) expect_identical(zpe$message, xpe$message, info = info_msg) info_msg <- "test.rbind_zero_length_non_zero_length_Date_errors" xpz <- xts( , as.Date("2017-01-01")) xp1 <- xts(1, as.Date("2017-01-02")) zpz <- as.zoo(xpz) zp1 <- as.zoo(xp1) zpe <- tryCatch(rbind(zpz, zp1), error = identity) xpe <- tryCatch(rbind(xpz, xp1), error = identity) expect_identical(zpe$message, xpe$message, info = info_msg) info_msg <- "test.rbind_no_dim_does_not_error" d <- rep(0.1, 2) i <- rep(581910048, 2) xts_no_dim <- structure(d[1], class = c("xts", "zoo"), index = structure(i[1], tzone = "UTC", tclass = "Date")) xts_out <- structure(d, class = c("xts", "zoo"), .Dim = 2:1, index = structure(i, tzone = "UTC", tclass = "Date")) xts_rbind <- rbind(xts_no_dim, xts_no_dim) expect_identical(xts_out, xts_rbind, info = info_msg) # Test that as.Date.numeric() works at the top level (via zoo::as.Date()), # and for functions defined in the xts namespace even if xts::as.Date.numeric() # is not formally registered as an S3 method. info_msg <- "test.as.Date.numeric" # Define function that calls as.Date.numeric() ... f <- function(d) { as.Date(d) } # ... in xts' namespace environment(f) <- as.environment("package:xts") dd <- as.Date("2017-12-13") dn <- unclass(dd) expect_identical(dd, as.Date(dn), info = info_msg) # via zoo::as.Date() expect_identical(dd, f(dn), info = info_msg) # .subset.xts # window.xts # .toPOSIXct (indirectly) info_msg <- "test.window" # window function for xts series, use basic logic for testing & debugging # null start and end not supported window_dbg <- function(x, index. = index(x), start, end) { start <- xts:::.toPOSIXct(start, tzone(x)) end <- xts:::.toPOSIXct(end, tzone(x)) index. <- as.POSIXct(index., tz=tzone(x)) all.indexes <- .index(x) in.index <- all.indexes %in% as.numeric(index.) matches <- (in.index & all.indexes >= start & all.indexes <= end) x[matches,] } DAY = 24*3600 base <- as.POSIXct("2000-12-31") dts <- base + c(1:10, 12:15, 17:20)*DAY x <- xts(1:length(dts), dts) # Range over gap start <- base + 11*DAY end <- base + 16*DAY bin <- window(x, start = start, end = end) reg <- window_dbg(x, start = start, end = end) expect_identical(bin, reg, info = paste(info_msg, "- range over gap")) # Range over one day start <- base + 12*DAY end <- base + 12*DAY bin <- window(x, start = start, end = end) reg <- window_dbg(x, start = start, end = end) expect_identical(bin, reg, info = paste(info_msg, "- range over one day")) # Empty Range over one day start <- base + 11*DAY end <- base + 11*DAY bin <- window(x, start = start, end = end) reg <- window_dbg(x, start = start, end = end) expect_identical(bin, reg, info = paste(info_msg, "- empty Range over one day")) # Range containing all dates start <- base end <- base + 21*DAY bin <- window(x, start = start, end = end) reg <- window_dbg(x, start = start, end = end) expect_identical(bin, reg, info = paste(info_msg, "- range containing all dates")) # Range past end start <- base + 16*DAY end <- base + 30*DAY bin <- window(x, start = start, end = end) reg <- window_dbg(x, start = start, end = end) expect_identical(bin, reg, info = paste(info_msg, "- range past end")) # Range before begin start <- base end <- base + 3*DAY bin <- window(x, start = start, end = end) reg <- window_dbg(x, start = start, end = end) expect_identical(bin, reg, info = paste(info_msg, "- range before begin")) # Test just start, end = NULL start <- base + 13 * DAY end <- base + 30*DAY bin <- window(x, start = start) reg <- window_dbg(x, start = start, end = end) expect_identical(bin, reg, info = paste(info_msg, "- just start, end = NULL")) # Test just start, end = NULL, empty range start <- base + 25 * DAY end <- base + 30*DAY bin <- window(x, start = start) reg <- window_dbg(x, start = start, end = end) expect_identical(bin, reg, info = paste(info_msg, "- just start, end = NULL, empty range")) # Test just end, start = NULL end <- base + 13 * DAY start <- base bin <- window(x, end = end) reg <- window_dbg(x, start = start, end = end) expect_identical(bin, reg, info = paste(info_msg, "- just end, start = NULL")) # Test just end, start = NULL, empty range end <- base start <- base bin <- window(x, end = end) reg <- window_dbg(x, start = start, end = end) expect_identical(bin, reg, info = paste(info_msg, "- just end, start = NULL, empty range")) # Test end = NULL, start = NULL start <- base end <- base + 30*DAY bin <- window(x) reg <- window_dbg(x, start = start, end = end) expect_identical(bin, reg, info = paste(info_msg, "- end = NULL, start = NULL")) # Test just start, end = NA start <- base + 13 * DAY end <- base + 30*DAY bin <- window(x, start = start, end = NA) reg <- window_dbg(x, start = start, end = end) expect_identical(bin, reg, info = paste(info_msg, "- just start, end = NA")) # Test just start, end = NA, empty range start <- base + 25 * DAY end <- base + 30*DAY bin <- window(x, start = start, end = NA) reg <- window_dbg(x, start = start, end = end) expect_identical(bin, reg, info = paste(info_msg, "- just start, end = NA, empty range")) # Test just end, start = NA end <- base + 13 * DAY start <- base bin <- window(x, start = NA, end = end) reg <- window_dbg(x, start = start, end = end) expect_identical(bin, reg, info = paste(info_msg, "- just end, start = NA")) # Test just end, start = NA, empty range end <- base start <- base bin <- window(x, start = NA, end = end) reg <- window_dbg(x, start = start, end = end) expect_identical(bin, reg, info = paste(info_msg, "- just end, start = NA, empty range")) # Test end = NA, start = NA start <- base end <- base + 30*DAY bin <- window(x, start = NA, end = NA) reg <- window_dbg(x, start = start, end = end) expect_identical(bin, reg, info = paste(info_msg, "- end = NA, start = NA")) ####################################### # Test for index. parameter start <- base end <- base + 30*DAY idx = index(x)[c(2,4,6)] bin <- window(x, index. = idx) reg <- window_dbg(x, index. = idx, start = start, end = end) expect_identical(bin, reg, info = paste(info_msg, "- index. parameter provided")) # Test index. outside range of dates in xts series start <- base end <- base + 30*DAY idx = c(start, index(x)[c(2,4,6)], end) bin <- window(x, index. = idx) reg <- window_dbg(x, index. = idx, start = start, end = end) expect_identical(bin, reg, info = paste(info_msg, "- index. outside range of dates in xts series")) # Test NA in index start <- base end <- base + 30*DAY idx = c(start, index(x)[c(2,4,6)], end, NA) bin <- window(x, index. = idx) reg <- window_dbg(x, index. = idx, start = start, end = end) expect_identical(bin, reg, info = paste(info_msg, "- NA in index ")) # Next 3 adapted from window.zoo example # Test basic window.zoo example x.date <- as.Date(paste(2003, rep(1:4, 4:1), seq(1,19,2), sep = "-")) x <- xts(matrix(1:20, ncol = 2), x.date) bin <- window(x, start = as.Date("2003-02-01"), end = as.Date("2003-03-01")) reg <- window_dbg(x, start = as.Date("2003-02-01"), end = as.Date("2003-03-01")) expect_identical(bin, reg, info = paste(info_msg, "- basic window.zoo example")) # Test index + start bin <- window(x, index. = x.date[1:6], start = as.Date("2003-02-01")) reg <- window_dbg(x, index. = x.date[1:6], start = as.Date("2003-02-01"), end = as.Date("2004-01-01")) expect_identical(bin, reg, info = paste(info_msg, "- index + start")) # Test just index bin <- window(x, index. = x.date[c(4, 8, 10)]) reg <- window_dbg(x, index. = x.date[c(4, 8, 10)], start = as.Date("2003-01-01"), end = as.Date("2004-01-01")) expect_identical(bin, reg, info = paste(info_msg, "- just index")) # Test decreasing index bin <- window(x, index. = x.date[c(10, 8, 4)]) reg <- window_dbg(x, index. = x.date[c(10, 8, 4)], start = as.Date("2003-01-01"), end = as.Date("2004-01-01")) expect_identical(bin, reg, info = paste(info_msg, "- decreasing index")) # Test index parameter with repeated dates in xts series idx <- sort(rep(1:5, 5)) x <- xts(1:length(idx), as.Date("1999-12-31")+idx) bin <- window(x, index. = as.Date("1999-12-31")+c(1,3,5)) reg <- window_dbg(x, index. = as.Date("1999-12-31")+c(1,3,5), start = as.Date("2000-01-01"), end = as.Date("2000-01-05")) expect_identical(bin, reg, info = paste(info_msg, "- index parameter with repeated dates in xts series")) expect_true(nrow(bin) == 3*5, info = paste(info_msg, "- index parameter with repeated dates in xts series")) # Test performance difference DAY = 24*3600 base <- as.POSIXct("2000-12-31") dts <- base + c(1:10, 12:15, 17:20)*DAY x <- xts(1:length(dts), dts) start <- base + 14*DAY end <- base + 14*DAY #cat("\n") #print("performance:") #print("binary search") #print(system.time(replicate(1000, window(x, start = start, end = end)))) # Binary search is about 2x faster than regular #print("regular search") #print(system.time(replicate(1000, window_dbg(x, start = start, end = end)))) # test subset.xts for date subsetting by row info_msg <- "test.subset_i_datetime_or_character" base <- as.POSIXct("2000-12-31") dts <- base + c(1:10, 12:15, 17:20) * 24L * 3600L x <- xts(seq_along(dts), dts) # Note that "2001-01-11" is not in the series. Skipped by convention. d <- c("2001-01-10", "2001-01-11", "2001-01-12", "2001-01-13") for (type in c("double", "integer")) { storage.mode(.index(x)) <- type # Test scalar msg <- paste0(info_msg, " scalar, ", type, " index") bin <- window(x, start = d[1], end = d[1]) expect_identical(bin, x[d[1], ], info = paste("character", msg)) expect_identical(bin, x[I(d[1]), ], info = paste("as-is character", msg)) expect_identical(bin, x[as.POSIXct(d[1]), ], info = paste("POSIXct", msg)) expect_identical(bin, x[as.Date(d[1]), ], info = paste("Date", msg)) # Test vector msg <- paste0(info_msg, " vector, ", type, " index") bin <- window(x, start = d[1], end = d[length(d)]) expect_identical(bin, x[d, ], info = paste("character", msg)) expect_identical(bin, x[I(d), ], info = paste("as-is character", msg)) expect_identical(bin, x[as.POSIXct(d), ], info = paste("POSIXct", msg)) expect_identical(bin, x[as.Date(d), ], info = paste("Date", msg)) # Test character dates, and single column selection y <- xts(rep(2, length(dts)), dts) z <- xts(rep(3, length(dts)), dts) x2 <- cbind(y, x, z) sub <- x2[d, 2] # Note that "2001-01-11" is not in the series. Skipped by convention. bin <- window(x, start = d[1], end = d[length(d)]) expect_equal(nrow(sub), nrow(bin), info = paste(info_msg, "- character dates, and single column selection")) expect_true(all(sub == bin), info = paste(info_msg, "- character dates, and single column selection")) } info_msg <- "test.subset_i_ISO8601" x <- xts(1:1000, as.Date("2000-01-01")+1:1000) for (type in c("double", "integer")) { storage.mode(.index(x)) <- type # Test Date Ranges sub <- x['200001'] # January 2000 bin <- window(x, start = "2000-01-01", end = "2000-01-31") expect_identical(bin, sub, info = paste(info_msg, ", i = 2000-01")) # Test Date Ranges 2 sub <- x['1999/2000'] # All of 2000 (note there is no need to use the exact start) bin <- window(x, start = "2000-01-01", end = "2000-12-31") expect_identical(bin, sub, info = paste(info_msg, ", i = 1999/2000")) # Test Date Ranges 3 sub <- x['1999/200001'] # January 2000 bin <- window(x, start = "2000-01-01", end = "2000-01-31") expect_identical(bin, sub, info = paste(info_msg, ", i= 1999/2000-01")) } xts/inst/tinytest/test-irts.R0000644000176200001440000000210314634167654016025 0ustar liggesusershave_tseries <- suppressPackageStartupMessages({ # tseries imports quantmod. Silence this message when quantmod is loaded: # # Registered S3 method overwritten by 'quantmod': # method from # as.zoo.data.frame zoo # # So I don't get confused (again) about why xts' tests load quantmod requireNamespace("tseries", quietly = TRUE) }) if (have_tseries) { library(xts) data(sample_matrix) sample.irts <- tseries::irts(as.POSIXct(rownames(sample_matrix)),sample_matrix) sample.irts.xts <- as.xts(sample.irts) info_msg <- "test.convert_irts_to_xts <- function()" expect_identical(sample.irts.xts,as.xts(sample.irts), info = info_msg) info_msg <- "test.convert_irts_to_xts_j1" expect_identical(sample.irts.xts[,1],as.xts(sample.irts)[,1], info = info_msg) info_msg <- "test.convert_irts_to_xts_i1" expect_identical(sample.irts.xts[1,],as.xts(sample.irts)[1,], info = info_msg) info_msg <- "test.convert_irts_to_xts_i1j1" expect_identical(sample.irts.xts[1,1],as.xts(sample.irts)[1,1], info = info_msg) } # requireNamespace xts/inst/tinytest/test-ts.R0000644000176200001440000000635014634167654015502 0ustar liggesusersdata(sample_matrix) sample.ts1 <- ts(sample_matrix,start=as.numeric(as.Date(rownames(sample_matrix)[1]))) sample.xts.ts1 <- as.xts(sample.ts1) info_msg <- "test.convert_ts_to_xts" expect_identical(sample.xts.ts1, as.xts(sample.ts1), info = info_msg) info_msg <- "test.convert_ts_to_xts_j1" expect_identical(sample.xts.ts1[,1], as.xts(sample.ts1)[,1], info = info_msg) info_msg <- "test.convert_ts_to_xts_i1" expect_identical(sample.xts.ts1[1,], as.xts(sample.ts1)[1,], info = info_msg) info_msg <- "test.convert_ts_to_xts_i1j1" expect_identical(sample.xts.ts1[1,1], as.xts(sample.ts1)[1,1], info = info_msg) info_msg <- "test.ts_reclass" expect_identical(sample.ts1, reclass(try.xts(sample.ts1)), info = info_msg) info_msg <- "test.ts_reclass_subset_reclass_j1" expect_identical(sample.ts1[,1], reclass(try.xts(sample.ts1))[,1], info = info_msg) info_msg <- "test.ts_reclass_subset_as.xts_j1" expect_identical(sample.ts1[,1], reclass(try.xts(sample.ts1)[,1]), info = info_msg) info_msg <- "test.ts_reclass_subset_ts_j1" expect_identical(sample.ts1[,1], reclass(try.xts(sample.ts1[,1])), info = info_msg) # quarterly series sample.ts4 <- ts(sample_matrix,start=1960,frequency=4) sample.xts.ts4 <- as.xts(sample.ts4) info_msg <- "test.convert_ts4_to_xts" expect_identical(sample.xts.ts4, as.xts(sample.ts4), info = info_msg) info_msg <- "test.convert_ts4_to_xts_j1" expect_identical(sample.xts.ts4[,1], as.xts(sample.ts4)[,1], info = info_msg) info_msg <- "test.convert_ts4_to_xts_i1" expect_identical(sample.xts.ts4[1,], as.xts(sample.ts4)[1,], info = info_msg) info_msg <- "test.convert_ts4_to_xts_i1j1" expect_identical(sample.xts.ts4[1,1], as.xts(sample.ts4)[1,1], info = info_msg) info_msg <- "test.ts4_reclass" expect_identical(sample.ts4, reclass(try.xts(sample.ts4)), info = info_msg) info_msg <- "test.ts4_reclass_subset_reclass_j1" expect_identical(sample.ts4[,1], reclass(try.xts(sample.ts4))[,1], info = info_msg) info_msg <- "test.ts4_reclass_subset_as.xts_j1" expect_identical(sample.ts4[,1], reclass(try.xts(sample.ts4)[,1]), info = info_msg) info_msg <- "test.ts4_reclass_subset_ts_j1" expect_identical(sample.ts4[,1], reclass(try.xts(sample.ts4[,1])), info = info_msg) # monthly series sample.ts12 <- ts(sample_matrix,start=1990,frequency=12) sample.xts.ts12 <- as.xts(sample.ts12) info_msg <- "test.convert_ts12_to_xts" expect_identical(sample.xts.ts12, as.xts(sample.ts12), info = info_msg) info_msg <- "test.convert_ts12_to_xts_j1" expect_identical(sample.xts.ts12[,1], as.xts(sample.ts12)[,1], info = info_msg) info_msg <- "test.convert_ts12_to_xts_i1" expect_identical(sample.xts.ts12[1,], as.xts(sample.ts12)[1,], info = info_msg) info_msg <- "test.convert_ts12_to_xts_i1j1" expect_identical(sample.xts.ts12[1,1], as.xts(sample.ts12)[1,1], info = info_msg) info_msg <- "test.ts12_reclass" expect_identical(sample.ts12, reclass(try.xts(sample.ts12)), info = info_msg) info_msg <- "test.ts12_reclass_subset_reclass_j1" expect_identical(sample.ts12[,1], reclass(try.xts(sample.ts12))[,1], info = info_msg) info_msg <- "test.ts12_reclass_subset_as.xts_j1" expect_identical(sample.ts12[,1], reclass(try.xts(sample.ts12)[,1]), info = info_msg) info_msg <- "test.ts12_reclass_subset_ts_j1" expect_identical(sample.ts12[,1], reclass(try.xts(sample.ts12[,1])), info = info_msg) xts/inst/tinytest/test-plot.R0000644000176200001440000000320714634167654016030 0ustar liggesusers# Tests for plotting functions data(sample_matrix) x <- as.xts(sample_matrix, dateFormat = "Date") # axTicksByTime info_msg <- "test.format_xts_yearqtr" xq <- to.quarterly(x) xtbt <- axTicksByTime(xq) expect_identical(names(xtbt), c("2007-Q1", "2007-Q2"), info = info_msg) info_msg <- "test.format_zoo_yearqtr" xq <- to.quarterly(x) xtbt <- axTicksByTime(as.zoo(xq)) expect_identical(names(xtbt), c("2007-Q1", "2007-Q2"), info = info_msg) info_msg <- "test.axTicksByTime_ticks.on_quarter" tick_marks <- setNames(c(1, 4, 7, 10, 13, 16, 19, 22, 25, 25), c("\nJan\n2016", "\nApr\n2016", "\nJul\n2016", "\nOct\n2016", "\nJan\n2017", "\nApr\n2017", "\nJul\n2017", "\nOct\n2017", "\nJan\n2018", "\nJan\n2018")) if (.Platform$OS.type != "unix") { names(tick_marks) <- gsub("\n(.*)\n", "\\1 ", names(tick_marks)) } ym <- as.yearmon("2018-01") - 24:0 / 12 x <- xts(seq_along(ym), ym) xtbt <- axTicksByTime(x, ticks.on = "quarters") expect_identical(xtbt, tick_marks, info = info_msg) info_msg <- "test.xlim_set_before_rendering" target <- c(86400.0, 864000.0) p <- plot(xts(1:10, .Date(1:10))) expect_equivalent(target, p$get_xlim(), info = info_msg) info_msg <- "test.ylim_set_before_rendering" x <- rnorm(10) p <- plot(xts(x, .Date(1:10))) expect_equivalent(range(x), p$get_ylim(), info = info_msg) get_xcoords_respects_object_tzone <- function() { # random timezone tz <- sample(OlsonNames(), 1) dttm <- seq(as.POSIXct("2023-01-01 01:23:45"), , 1, 5) x <- xts(c(5, 1, 2, 4, 3), dttm, tzone = tz) print(p <- plot(x)) expect_identical(tz, tzone(p$get_xcoords(x)), info = paste("TZ =", tz)) } get_xcoords_respects_object_tzone() xts/inst/tinytest/test-first-last.R0000644000176200001440000002635614634167654017154 0ustar liggesusersdates <- c("2017-01-01", "2017-01-02", "2017-01-03", "2017-01-04") d1 <- data.frame(x = seq_along(dates), row.names = dates) d2 <- data.frame(d1, y = rev(seq_along(dates))) ### basic functionality on data.frame info_msg <- "test.first_xtsible_data.frame_pos_n" expect_identical(first(d1, 1), head(d1, 1), info = info_msg) expect_identical(first(d2, 1), head(d2, 1), info = info_msg) expect_identical(first(d1, "1 day"), head(d1, 1), info = info_msg) expect_identical(first(d2, "1 day"), head(d2, 1), info = info_msg) info_msg <- "test.first_xtsible_data.frame_neg_n" expect_identical(first(d1, -1), tail(d1, -1), info = info_msg) expect_identical(first(d2, -1), tail(d2, -1), info = info_msg) expect_identical(first(d1, "-1 day"), tail(d1, -1), info = info_msg) expect_identical(first(d2, "-1 day"), tail(d2, -1), info = info_msg) info_msg <- "test.first_xtsible_data.frame_zero_n" expect_identical(first(d1, 0), head(d1, 0), info = info_msg) expect_identical(first(d2, 0), head(d2, 0), info = info_msg) expect_identical(first(d1, "0 day"), head(d1, 0), info = info_msg) expect_identical(first(d2, "0 day"), head(d2, 0), info = info_msg) info_msg <- "test.last_xtsible_data.frame_pos_n" expect_identical(last(d1, 1), tail(d1, 1), info = info_msg) expect_identical(last(d2, 1), tail(d2, 1), info = info_msg) expect_identical(last(d1, "1 day"), tail(d1, 1), info = info_msg) expect_identical(last(d2, "1 day"), tail(d2, 1), info = info_msg) info_msg <- "test.last_xtsible_data.frame_neg_n" expect_identical(last(d1, -1), head(d1, -1), info = info_msg) expect_identical(last(d2, -1), head(d2, -1), info = info_msg) expect_identical(last(d1, "-1 day"), head(d1, -1), info = info_msg) expect_identical(last(d2, "-1 day"), head(d2, -1), info = info_msg) info_msg <- "test.last_xtsible_data.frame_zero_n" expect_identical(last(d1, 0), head(d1, 0), info = info_msg) expect_identical(last(d2, 0), head(d2, 0), info = info_msg) expect_identical(last(d1, "0 day"), head(d1, 0), info = info_msg) expect_identical(last(d2, "0 day"), head(d2, 0), info = info_msg) ### non-xtsible data.frames d1 <- data.frame(x = seq_along(dates), row.names = dates) d2 <- data.frame(d1, y = rev(seq_along(dates))) rownames(d1) <- rownames(d2) <- NULL info_msg <- "test.first_nonxtsible_data.frame_pos_n" expect_identical(first(d1, 1), head(d1, 1), info = info_msg) expect_identical(first(d2, 1), head(d2, 1), info = info_msg) info_msg <- "test.first_nonxtsible_data.frame_neg_n" rownames(d1) <- rownames(d2) <- NULL expect_identical(first(d1, -1), tail(d1, -1), info = info_msg) expect_identical(first(d2, -1), tail(d2, -1), info = info_msg) info_msg <- "test.first_nonxtsible_data.frame_zero_n" rownames(d1) <- rownames(d2) <- NULL expect_identical(first(d1, 0), tail(d1, 0), info = info_msg) expect_identical(first(d2, 0), tail(d2, 0), info = info_msg) info_msg <- "test.last_nonxtsible_data.frame_pos_n" rownames(d1) <- rownames(d2) <- NULL expect_identical(last(d1, 1), tail(d1, 1), info = info_msg) expect_identical(last(d2, 1), tail(d2, 1), info = info_msg) info_msg <- "test.last_nonxtsible_data.frame_neg_n" rownames(d1) <- rownames(d2) <- NULL expect_identical(last(d1, -1), head(d1, -1), info = info_msg) expect_identical(last(d2, -1), head(d2, -1), info = info_msg) info_msg <- "test.last_nonxtsible_data.frame_zero_n" rownames(d1) <- rownames(d2) <- NULL expect_identical(last(d1, 0), head(d1, 0), info = info_msg) expect_identical(last(d2, 0), head(d2, 0), info = info_msg) ### basic functionality on matrix d1 <- data.frame(x = seq_along(dates), row.names = dates) d2 <- data.frame(d1, y = rev(seq_along(dates))) m1 <- as.matrix(d1) m2 <- as.matrix(d2) info_msg <- "test.first_xtsible_matrix_pos_n" expect_identical(first(m1, 1), head(m1, 1), info = info_msg) expect_identical(first(m2, 1), head(m2, 1), info = info_msg) expect_identical(first(m1, "1 day"), head(m1, 1), info = info_msg) expect_identical(first(m2, "1 day"), head(m2, 1), info = info_msg) info_msg <- "test.first_xtsible_matrix_neg_n" expect_identical(first(m1, -1), tail(m1, -1, keepnums = FALSE), info = info_msg) expect_identical(first(m2, -1), tail(m2, -1, keepnums = FALSE), info = info_msg) expect_identical(first(m1, "-1 day"), tail(m1, -1, keepnums = FALSE), info = info_msg) expect_identical(first(m2, "-1 day"), tail(m2, -1, keepnums = FALSE), info = info_msg) info_msg <- "test.first_xtsible_matrix_zero_n" expect_identical(first(m1, 0), tail(m1, 0, keepnums = FALSE), info = info_msg) expect_identical(first(m2, 0), tail(m2, 0, keepnums = FALSE), info = info_msg) expect_identical(first(m1, "0 day"), tail(m1, 0, keepnums = FALSE), info = info_msg) expect_identical(first(m2, "0 day"), tail(m2, 0, keepnums = FALSE), info = info_msg) info_msg <- "test.last_xtsible_matrix_pos_n" expect_identical(last(m1, 1), tail(m1, 1, keepnums = FALSE), info = info_msg) expect_identical(last(m2, 1), tail(m2, 1, keepnums = FALSE), info = info_msg) expect_identical(last(m1, "1 day"), tail(m1, 1, keepnums = FALSE), info = info_msg) expect_identical(last(m2, "1 day"), tail(m2, 1, keepnums = FALSE), info = info_msg) info_msg <- "test.last_xtsible_matrix_neg_n" expect_identical(last(m1, -1), head(m1, -1), info = info_msg) expect_identical(last(m2, -1), head(m2, -1), info = info_msg) info_msg <- "test.last_xtsible_matrix_zero_n" expect_identical(last(m1, 0), head(m1, 0), info = info_msg) expect_identical(last(m2, 0), head(m2, 0), info = info_msg) info_msg <- "test.first_nonxtsible_matrix_pos_n" rownames(m1) <- rownames(m2) <- NULL expect_identical(first(m1, 1), head(m1, 1), info = info_msg) expect_identical(first(m2, 1), head(m2, 1), info = info_msg) info_msg <- "test.first_nonxtsible_matrix_neg_n" rownames(m1) <- rownames(m2) <- NULL expect_identical(first(m1, -1), tail(m1, -1, keepnums = FALSE), info = info_msg) expect_identical(first(m2, -1), tail(m2, -1, keepnums = FALSE), info = info_msg) info_msg <- "test.first_nonxtsible_matrix_zero_n" rownames(m1) <- rownames(m2) <- NULL expect_identical(first(m1, 0), tail(m1, 0, keepnums = FALSE), info = info_msg) expect_identical(first(m2, 0), tail(m2, 0, keepnums = FALSE), info = info_msg) info_msg <- "test.last_nonxtsible_matrix_pos_n" rownames(m1) <- rownames(m2) <- NULL expect_identical(last(m1, 1), tail(m1, 1, keepnums = FALSE), info = info_msg) expect_identical(last(m2, 1), tail(m2, 1, keepnums = FALSE), info = info_msg) info_msg <- "test.last_nonxtsible_matrix_neg_n" rownames(m1) <- rownames(m2) <- NULL expect_identical(last(m1, -1), head(m1, -1), info = info_msg) expect_identical(last(m2, -1), head(m2, -1), info = info_msg) info_msg <- "test.last_nonxtsible_matrix_zero_n" rownames(m1) <- rownames(m2) <- NULL expect_identical(last(m1, 0), head(m1, 0), info = info_msg) expect_identical(last(m2, 0), head(m2, 0), info = info_msg) ### basic functionality on vector d1 <- data.frame(x = seq_along(dates), row.names = dates) d2 <- data.frame(d1, y = rev(seq_along(dates))) info_msg <- "test.first_xtsible_vector" v1 <- setNames(d1$x, rownames(d1)) expect_identical(first(v1, 1), head(v1, 1), info = info_msg) expect_identical(first(v1,-1), tail(v1,-1), info = info_msg) expect_identical(first(v1, "1 day"), head(v1, 1), info = info_msg) expect_identical(first(v1,"-1 day"), tail(v1,-1), info = info_msg) expect_identical(first(v1, "2 days"), head(v1, 2), info = info_msg) expect_identical(first(v1,"-2 days"), tail(v1,-2), info = info_msg) d <- .Date(3) + 1:21 expect_identical(first(d, "1 week"), head(d, 7), info = info_msg) expect_identical(first(d,"-1 week"), tail(d,-7), info = info_msg) expect_identical(first(d, "2 weeks"), head(d, 14), info = info_msg) expect_identical(first(d,"-2 weeks"), tail(d,-14), info = info_msg) info_msg <- "test.last_xtsible_vector" v1 <- setNames(d1$x, rownames(d1)) expect_identical(last(v1, 1), tail(v1, 1), info = info_msg) expect_identical(last(v1,-1), head(v1,-1), info = info_msg) expect_identical(last(v1, "1 day"), tail(v1, 1), info = info_msg) expect_identical(last(v1,"-1 day"), head(v1,-1), info = info_msg) d <- .Date(3) + 1:21 expect_identical(last(d, "1 week"), tail(d, 7), info = info_msg) expect_identical(last(d,"-1 week"), head(d,-7), info = info_msg) expect_identical(last(d, "2 weeks"), tail(d, 14), info = info_msg) expect_identical(last(d,"-2 weeks"), head(d,-14), info = info_msg) info_msg <- "test.first_nonxtsible_vector" v1 <- d1$x expect_identical(first(v1, 1), head(v1, 1), info = info_msg) expect_identical(first(v1,-1), tail(v1,-1), info = info_msg) expect_identical(first(v1,0), tail(v1,0), info = info_msg) info_msg <- "test.last_nonxtsible_vector" v1 <- d1$x expect_identical(last(v1, 1), tail(v1, 1), info = info_msg) expect_identical(last(v1,-1), head(v1,-1), info = info_msg) expect_identical(last(v1,0), head(v1,0), info = info_msg) ### zero-length vectors info_msg <- "test.zero_length_vector" types <- c("logical", "integer", "numeric", "complex", "character", "raw") for (type in types) { v <- vector(type, 0) expect_identical(first(v, 1), v, info = paste(info_msg, type, "- first, n = 1")) expect_identical( last(v, 1), v, info = paste(info_msg, type, "- last, n = 1")) # negative 'n' expect_identical(first(v, -1), v, info = paste(info_msg, type, "- first, n = -1")) expect_identical( last(v, -1), v, info = paste(info_msg, type, "- last, n = -1")) #zero 'n' expect_identical(first(v, 0), v, info = paste(info_msg, type, "- first, n = 0")) expect_identical( last(v, 0), v, info = paste(info_msg, type, "- last, n = 0")) } ### zero-row matrix info_msg <- "test.zero_row_matrix" types <- c("logical", "integer", "numeric", "complex", "character", "raw") for (type in types) { m <- matrix(vector(type, 0), 0) expect_identical(first(m, 1), m, info = paste(info_msg, type, "- first, n = 1")) expect_identical( last(m, 1), m, info = paste(info_msg, type, "- last, n = 1")) # negative 'n' expect_identical(first(m, -1), m, info = paste(info_msg, type, "- first, n = -1")) expect_identical( last(m, -1), m, info = paste(info_msg, type, "- last, n = -1")) #zero 'n' expect_identical(first(m, 0), m, info = paste(info_msg, type, "- first, n = 0")) expect_identical( last(m, 0), m, info = paste(info_msg, type, "- last, n = 0")) } ### tests for zoo z1 <- zoo(seq_along(dates), as.Date(dates)) z2 <- merge(x = z1, y = rev(seq_along(dates))) info_msg <- "test.first_zoo_pos_n" expect_identical(first(z1, 1), head(z1, 1), info = info_msg) expect_identical(first(z2, 1), head(z2, 1), info = info_msg) expect_identical(first(z1, "1 day"), head(z1, 1), info = info_msg) expect_identical(first(z2, "1 day"), head(z2, 1), info = info_msg) info_msg <- "test.first_zoo_neg_n" expect_identical(first(z1, -1), tail(z1, -1), info = info_msg) expect_identical(first(z2, -1), tail(z2, -1), info = info_msg) expect_identical(first(z1, "-1 day"), tail(z1, -1), info = info_msg) expect_identical(first(z2, "-1 day"), tail(z2, -1), info = info_msg) info_msg <- "test.last_zoo_pos_n" expect_identical(last(z1, 1), tail(z1, 1), info = info_msg) expect_identical(last(z2, 1), tail(z2, 1), info = info_msg) expect_identical(last(z1, "1 day"), tail(z1, 1), info = info_msg) expect_identical(last(z2, "1 day"), tail(z2, 1), info = info_msg) info_msg <- "test.last_zoo_neg_n" expect_identical(last(z1, -1), head(z1, -1), info = info_msg) expect_identical(last(z2, -1), head(z2, -1), info = info_msg) expect_identical(last(z1, "-1 day"), head(z1, -1), info = info_msg) expect_identical(last(z2, "-1 day"), head(z2, -1), info = info_msg) xts/inst/tinytest/test-dimnames.R0000644000176200001440000000200514634167654016642 0ustar liggesusers### colnames(x) are not removed when 'x' and 'y' are shared and dimnames(y) <- NULL orig_names <- c("a", "b") x <- .xts(cbind(1:2, 1:2), 1:2, dimnames = list(NULL, orig_names)) y <- x dimnames(y) <- NULL expect_null(colnames(y), info = "dimnames(y) <- NULL removes dimnames from y") expect_identical(orig_names, colnames(x), info = "dimnames(y) <- NULL does not remove dimnames from x") ### colnames(x) are not changed when 'x' and 'y' are shared and dimnames(y) <- foo new_names <- c("c", "d") x <- .xts(cbind(1:2, 1:2), 1:2, dimnames = list(NULL, orig_names)) y <- x dimnames(y) <- list(NULL, new_names) expect_identical(new_names, colnames(y), info = "dimnames(y) <- list(NULL, new_names) set correctly on y") expect_identical(orig_names, colnames(x), info = "dimnames(y) <- list(NULL, new_names) does not change dimnames on x") new_names[1] <- "e" expect_identical(c("c", "d"), colnames(y), info = "colnames(y) not changed when new_names is changed") xts/inst/tinytest/test-period.apply.R0000644000176200001440000000754114634167654017465 0ustar liggesusers# period.apply() doesn't care what generates the INDEX, # but it does care that INDEX has the following characteristics: # 1) the first element is zero, # 2) the last element is nrow(x), # 3) there are no duplicate elements, # 4) the elements are sorted. # info_msg <- "test.duplicate_INDEX" x <- .xts(1:10, 1:10) ep <- c(0, 2, 4, 6, 8, 10) nodup <- period.apply(x, ep, sum) dup <- period.apply(x, c(ep, 10), sum) expect_identical(nodup, dup, info = info_msg) info_msg <- "test.duplicate_INDEX_vector" x <- 1:10 ep <- c(0, 2, 4, 6, 8, 10) nodup <- period.apply(x, ep, sum) dup <- period.apply(x, c(ep, 10), sum) expect_identical(nodup, dup, info = info_msg) info_msg <- "test.unsorted_INDEX" x <- .xts(1:10, 1:10) ep.s <- c(2, 4, 6, 8) ep.u <- sample(ep.s) s <- period.apply(x, c(0, ep.s, 10), sum) u <- period.apply(x, c(0, ep.u, 10), sum) expect_identical(s, u, info = info_msg) info_msg <- "test.unsorted_INDEX_vector" x <- 1:10 ep.s <- c(2, 4, 6, 8) ep.u <- sample(ep.s) s <- period.apply(x, c(0, ep.s, 10), sum) u <- period.apply(x, c(0, ep.u, 10), sum) expect_identical(s, u, info = info_msg) info_msg <- "test.INDEX_starts_with_zero" x <- .xts(1:10, 1:10) ep <- c(2, 4, 6, 8, 10) a <- period.apply(x, ep, sum) z <- period.apply(x, c(0, ep), sum) expect_identical(a, z, info = info_msg) info_msg <- "test.INDEX_starts_with_zero_vector" x <- 1:10 ep <- c(2, 4, 6, 8, 10) a <- period.apply(x, ep, sum) z <- period.apply(x, c(0, ep), sum) expect_identical(a, z, info = info_msg) info_msg <- "test.INDEX_ends_with_lengthX" x <- .xts(1:10, 1:10) ep <- c(0, 2, 4, 6, 8) a <- period.apply(x, ep, sum) z <- period.apply(x, c(ep, 10), sum) expect_identical(a, z, info = info_msg) info_msg <- "test.INDEX_ends_with_lengthX_vector" x <- 1:10 ep <- c(0, 2, 4, 6, 8) a <- period.apply(x, ep, sum) z <- period.apply(x, c(ep, 10), sum) expect_identical(a, z, info = info_msg) # check specific period.* functions data(sample_matrix) x <- as.xts(sample_matrix[,1], dateFormat = "Date") e <- endpoints(x, "months") info_msg <- "test.period.min_equals_apply.monthly" # min am <- apply.monthly(x, min) pm <- period.min(x, e) expect_equivalent(am, pm, info = info_msg) info_msg <- "test.period.max_equals_apply.monthly" # max am <- apply.monthly(x, max) pm <- period.max(x, e) expect_equivalent(am, pm, info = info_msg) info_msg <- "test.period.sum_equals_apply.monthly" # sum am <- apply.monthly(x, sum) pm <- period.sum(x, e) expect_equivalent(am, pm, info = info_msg) info_msg <- "test.period.prod_equals_apply.monthly" # prod am <- apply.monthly(x, prod) pm <- period.prod(x, e) expect_equivalent(am, pm, info = info_msg) # test that non-integer INDEX is converted to integer info_msg <- "test.period.min_converts_index_to_integer" storage.mode(e) <- "numeric" pm <- period.min(x, e) info_msg <- "test.period.max_converts_index_to_integer" storage.mode(e) <- "numeric" pm <- period.max(x, e) info_msg <- "test.period.sum_converts_index_to_integer" storage.mode(e) <- "numeric" pm <- period.sum(x, e) info_msg <- "test.period.prod_converts_index_to_integer" storage.mode(e) <- "numeric" pm <- period.prod(x, e) # test conversion from intraday to daily or lower frequency info_msg <- "test.intraday_to_daily" set.seed(21) i <- as.POSIXct("2013-02-05 01:01", tz = "America/Chicago") x <- xts(rnorm(10000), i - 10000:1 * 60) d <- to.daily(x) dateseq <- seq(as.Date("2013-01-29"), as.Date("2013-02-05"), "day") expect_equivalent(index(d), dateseq, info = info_msg) # message for FUN = mean expect_message(period.apply(x, e, mean), pattern = "period\\.apply\\(..., FUN = mean\\)") expect_message(apply.daily(x, mean), pattern = "apply\\.daily\\(..., FUN = mean\\)") expect_message(apply.monthly(x, mean), pattern = "apply\\.monthly\\(..., FUN = mean\\)") expect_message(apply.quarterly(x, mean), pattern = "apply\\.quarterly\\(..., FUN = mean\\)") expect_message(apply.yearly(x, mean), pattern = "apply\\.yearly\\(..., FUN = mean\\)") xts/inst/tinytest/test-timeSeries.R0000644000176200001440000001145014634167654017162 0ustar liggesusers## ## Unit Test for timeSeries class from Rmetrics timeSeries package ## ## if (requireNamespace("timeSeries", quietly = TRUE)) { data(sample_matrix) ############################################################################### ############################################################################### # # Multivariate timeSeries tests # ############################################################################### ############################################################################### ############################################################################### # create timeSeries object from sample_matrix sample.timeSeries <- timeSeries::timeSeries(sample_matrix,charvec=as.Date(rownames(sample_matrix))) ############################################################################### ############################################################################### # create corresponding 'xts' object sample.xts <- as.xts(sample.timeSeries) ############################################################################### ############################################################################### # test subsetting functionality of xts info_msg <- "test.convert_timeSeries_to_xts" expect_identical(sample.xts,as.xts(sample.timeSeries), info = info_msg) info_msg <- "test.convert_timeSeries_to_xts_j1" expect_identical(sample.xts[,1],as.xts(sample.timeSeries)[,1], info = info_msg) info_msg <- "test.convert_timeSeries_to_xts_i1" expect_identical(sample.xts[1,],as.xts(sample.timeSeries)[1,], info = info_msg) info_msg <- "test.convert_timeSeries_to_xts_i1j1" expect_identical(sample.xts[1,1],as.xts(sample.timeSeries)[1,1], info = info_msg) # end subsetting functionality ############################################################################### ############################################################################### # test 'reclass' info_msg <- "test.timeSeries_reclass" expect_identical(sample.timeSeries,reclass(try.xts(sample.timeSeries)), info = info_msg) info_msg <- "test.timeSeries_reclass_subset_reclass_j1" expect_identical(sample.timeSeries[,1],reclass(try.xts(sample.timeSeries))[,1], info = info_msg) info_msg <- "test.timeSeries_reclass_subset_as.xts_j1" spl <- sample.timeSeries[,1:2] respl <- reclass(try.xts(sample.timeSeries)[,1:2]) # timeSeries fails to maintain @positions correctly if one column is selected expect_identical(spl,respl, info = info_msg) #expect_identical(1,1, info = info_msg) info_msg <- "test.timeSeries_reclass_subset_timeSeries_j1" spl <- sample.timeSeries[,1:2] respl <- reclass(try.xts(sample.timeSeries[,1:2])) # timeSeries fails to maintain @positions correctly if one column is selected expect_identical(spl,respl, info = info_msg) # expect_identical(1,1, info = info_msg) # end 'reclass' ############################################################################### ############################################################################### ############################################################################### # # Univariate timeSeries tests # ############################################################################### ############################################################################### ############################################################################### # create timeSeries object from sample_matrix sample.timeSeries.univariate <- timeSeries::timeSeries(sample_matrix[,1],charvec=as.Date(rownames(sample_matrix))) ############################################################################### ############################################################################### # create corresponding 'xts' object sample.xts.univariate <- as.xts(sample.timeSeries.univariate) ############################################################################### ############################################################################### # test subsetting functionality of xts info_msg <- "test.convert_timeSeries.univariate_to_xts" expect_identical(sample.xts.univariate,as.xts(sample.timeSeries.univariate), info = info_msg) info_msg <- "test.convert_timeSeries.univariate_to_xts_j1" expect_identical(sample.xts.univariate[,1],as.xts(sample.timeSeries.univariate)[,1], info = info_msg) info_msg <- "test.convert_timeSeries.univariate_to_xts_i1" expect_identical(sample.xts.univariate[1,],as.xts(sample.timeSeries.univariate)[1,], info = info_msg) info_msg <- "test.convert_timeSeries.univariate_to_xts_i1j1" expect_identical(sample.xts.univariate[1,1],as.xts(sample.timeSeries.univariate)[1,1], info = info_msg) # end subsetting functionality ############################################################################### } # requireNamespace xts/inst/tinytest/test-endpoints.R0000644000176200001440000002406614634167654017063 0ustar liggesusers# index crosses the unix epoch info_msg <- "test.double_index_cross_epoch" x <- .xts(1:22, 1.0*(-10:11), tzone="UTC") ep <- endpoints(x, "seconds", 2) expect_identical(ep, 0:11*2L, info_msg) info_msg <- "test.integer_index_cross_epoch" x <- .xts(1:22, -10:11, tzone="UTC") ep <- endpoints(x, "seconds", 2) expect_identical(ep, 0:11*2L, info_msg) #{{{daily data data(sample_matrix) xDailyDblIdx <- as.xts(sample_matrix, dateFormat="Date") xDailyIntIdx <- xDailyDblIdx storage.mode(.index(xDailyIntIdx)) <- "integer" info_msg <- "test.days_double_index" ep <- endpoints(xDailyDblIdx, "days", 7) expect_identical(ep, c(0L, 1:26*7L-3L, nrow(xDailyDblIdx)), info_msg) info_msg <- "test.days_integer_index" ep <- endpoints(xDailyIntIdx, "days", 7) expect_identical(ep, c(0L, 1:26*7L-3L, nrow(xDailyIntIdx)), info_msg) info_msg <- "test.weeks_double_index" ep <- endpoints(xDailyDblIdx, "weeks", 1) expect_identical(ep, c(0L, 1:25*7L-1L, nrow(xDailyDblIdx)), info_msg) info_msg <- "test.weeks_integer_index" ep <- endpoints(xDailyIntIdx, "weeks", 1) expect_identical(ep, c(0L, 1:25*7L-1L, nrow(xDailyIntIdx)), info_msg) info_msg <- "test.months_double_index" ep <- endpoints(xDailyDblIdx, "months", 1) expect_identical(ep, c(0L, 30L, 58L, 89L, 119L, 150L, 180L), info_msg) info_msg <- "test.months_integer_index" ep <- endpoints(xDailyIntIdx, "months", 1) expect_identical(ep, c(0L, 30L, 58L, 89L, 119L, 150L, 180L), info_msg) info_msg <- "test.quarters_double_index" ep <- endpoints(xDailyDblIdx, "quarters", 1) expect_identical(ep, c(0L, 89L, 180L), info_msg) info_msg <- "test.quarters_integer_index" ep <- endpoints(xDailyIntIdx, "quarters", 1) expect_identical(ep, c(0L, 89L, 180L), info_msg) info_msg <- "test.years_double_index" d <- seq(as.Date("1970-01-01"), by="1 day", length.out=365*5) x <- xts(seq_along(d), d) ep <- endpoints(x, "years", 1) expect_identical(ep, c(0L, 365L, 730L, 1096L, 1461L, 1825L), info_msg) info_msg <- "test.years_integer_index" d <- seq(as.Date("1970-01-01"), by="1 day", length.out=365*5) x <- xts(seq_along(d), d) storage.mode(.index(x)) <- "integer" ep <- endpoints(x, "years", 1) expect_identical(ep, c(0L, 365L, 730L, 1096L, 1461L, 1825L), info_msg) #}}} #{{{second data n <- 86400L %/% 30L * 365L * 2L xSecIntIdx <- .xts(1L:n, seq(.POSIXct(0, tz="UTC"), by="30 sec", length.out=n), tzone="UTC") xSecDblIdx <- xSecIntIdx storage.mode(.index(xSecDblIdx)) <- "double" info_msg <- "test.seconds_double_index" ep <- endpoints(xSecDblIdx, "seconds", 3600) expect_identical(ep, seq(0L, nrow(xSecDblIdx), 120L), info_msg) info_msg <- "test.seconds_integer_index" ep <- endpoints(xSecIntIdx, "seconds", 3600) expect_identical(ep, seq(0L, nrow(xSecIntIdx), 120L), info_msg) info_msg <- "test.seconds_secs" x <- .xts(1:10, 1:10/6) ep1 <- endpoints(x, "seconds") ep2 <- endpoints(x, "secs") expect_identical(ep1, ep2, info_msg) info_msg <- "test.minutes_double_index" ep <- endpoints(xSecDblIdx, "minutes", 60) expect_identical(ep, seq(0L, nrow(xSecDblIdx), 120L), info_msg) info_msg <- "test.minutes_integer_index" ep <- endpoints(xSecIntIdx, "minutes", 60) expect_identical(ep, seq(0L, nrow(xSecIntIdx), 120L), info_msg) info_msg <- "test.minutes_mins" x <- .xts(1:10, 1:10*10) ep1 <- endpoints(x, "minutes") ep2 <- endpoints(x, "mins") expect_identical(ep1, ep2, info_msg) info_msg <- "test.hours_double_index" ep <- endpoints(xSecDblIdx, "hours", 1) expect_identical(ep, seq(0L, nrow(xSecDblIdx), 120L), info_msg) info_msg <- "test.hours_integer_index" ep <- endpoints(xSecIntIdx, "hours", 1) expect_identical(ep, seq(0L, nrow(xSecIntIdx), 120L), info_msg) info_msg <- "test.days_double_index" ep <- endpoints(xSecDblIdx, "days", 1) expect_identical(ep, seq(0L, by=2880L, length.out=length(ep)), info_msg) info_msg <- "test.days_integer_index" ep <- endpoints(xSecIntIdx, "days", 1) expect_identical(ep, seq(0L, by=2880L, length.out=length(ep)), info_msg) info_msg <- "test.weeks_double_index" ep <- endpoints(xSecDblIdx, "weeks", 1) ep2 <- c(0L, seq(11520L, nrow(xSecDblIdx)-1L, 20160L), nrow(xSecDblIdx)) expect_identical(ep, ep2, info_msg) info_msg <- "test.weeks_integer_index" ep <- endpoints(xSecIntIdx, "weeks", 1) ep2 <- c(0L, seq(11520L, nrow(xSecIntIdx)-1L, 20160L), nrow(xSecIntIdx)) expect_identical(ep, ep2, info_msg) info_msg <- "test.months_double_index" ep <- endpoints(xSecDblIdx, "months", 1) n <- 86400L * c(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) / 30 ep2 <- as.integer(cumsum(c(0L, n, n))) expect_identical(ep, ep2, info_msg) info_msg <- "test.months_integer_index" ep <- endpoints(xSecIntIdx, "months", 1) n <- 86400L * c(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) / 30 ep2 <- as.integer(cumsum(c(0L, n, n))) expect_identical(ep, ep2, info_msg) info_msg <- "test.quarters_double_index" ep <- endpoints(xSecDblIdx, "quarters", 1) n <- 86400L * c(90, 91, 92, 92) / 30 ep2 <- as.integer(cumsum(c(0L, n, n))) expect_identical(ep, ep2, info_msg) info_msg <- "test.quarters_integer_index" ep <- endpoints(xSecIntIdx, "quarters", 1) n <- 86400L * c(90, 91, 92, 92) / 30 ep2 <- as.integer(cumsum(c(0L, n, n))) expect_identical(ep, ep2, info_msg) info_msg <- "test.years_double_index" ep <- endpoints(xSecDblIdx, "years", 1) expect_identical(ep, c(0L, 1051200L, 2102400L), info_msg) info_msg <- "test.years_integer_index" ep <- endpoints(xSecIntIdx, "years", 1) expect_identical(ep, c(0L, 1051200L, 2102400L), info_msg) #}}} # sparse endpoints could be a problem with POSIXlt elements (#169) # TODO: sparse intraday endpoints info_msg <- "test.sparse_years" x <- xts(2:6, as.Date(sprintf("199%d-06-01", 2:6))) ep <- endpoints(x, "years") expect_identical(ep, 0:5, info_msg) info_msg <- "test.sparse_quarters" x <- xts(2:6, as.Date(sprintf("199%d-06-01", 2:6))) ep <- endpoints(x, "quarters") expect_identical(ep, 0:5, info_msg) info_msg <- "test.sparse_months" x <- xts(2:6, as.Date(sprintf("199%d-06-01", 2:6))) ep <- endpoints(x, "months") expect_identical(ep, 0:5, info_msg) info_msg <- "test.sparse_weeks" x <- xts(2:6, as.Date(sprintf("199%d-06-01", 2:6))) ep <- endpoints(x, "weeks") expect_identical(ep, 0:5, info_msg) info_msg <- "test.sparse_days" x <- xts(2:6, as.Date(sprintf("199%d-06-01", 2:6))) ep <- endpoints(x, "days") expect_identical(ep, 0:5, info_msg) # sub-second resolution on Windows info_msg <- "test.sub_second_resolution" x <- .xts(1:6, .POSIXct(0:5 / 10 + 0.01)) ep <- endpoints(x, "ms", 250) expect_identical(ep, c(0L, 3L, 5L, 6L), info_msg) # precision issues info_msg <- "test.sub_second_resolution_exact" x <- .xts(1:6, .POSIXct(0:5 / 10)) ep <- endpoints(x, "ms", 250) expect_identical(ep, c(0L, 3L, 5L, 6L), info_msg) info_msg <- "test.sub_second_resolution_representation" x <- .xts(1:10, .POSIXct(1.5e9 + 0:9 / 10)) ep <- endpoints(x, "ms", 200) expect_identical(ep, seq(0L, 10L, 2L), info_msg) # on = "quarters", k > 1 info_msg <- "test.multiple_quarters" x <- xts(1:48, as.yearmon("2015-01-01") + 0:47 / 12) expect_identical(endpoints(x, "quarters", 1), seq(0L, 48L, 3L), info_msg) expect_identical(endpoints(x, "quarters", 2), seq(0L, 48L, 6L), info_msg) expect_identical(endpoints(x, "quarters", 3), c(seq(0L, 48L, 9L), 48L), info_msg) expect_identical(endpoints(x, "quarters", 4), seq(0L, 48L,12L), info_msg) expect_identical(endpoints(x, "quarters", 5), c(seq(0L, 48L,15L), 48L), info_msg) expect_identical(endpoints(x, "quarters", 6), c(seq(0L, 48L,18L), 48L), info_msg) # end(x) always in endpoints(x) result info_msg <- "test.last_obs_always_in_output" N <- 341*12 xx <- xts(rnorm(N), seq(Sys.Date(), by = "day", length.out = N)) ep <- endpoints(xx, on = "quarters", k = 2) # OK expect_identical(end(xx), end(xx[ep,]), paste(info_msg, "quarters, k=2")) ep <- endpoints(xx, on = "quarters", k = 3) # NOPE expect_identical(end(xx), end(xx[ep,]), paste(info_msg, "quarters, k=3")) ep <- endpoints(xx, on = "quarters", k = 4) # NOPE expect_identical(end(xx), end(xx[ep,]), paste(info_msg, "quarters, k=4")) ep <- endpoints(xx, on = "quarters", k = 5) # NOPE expect_identical(end(xx), end(xx[ep,]), paste(info_msg, "quarters, k=5")) ep <- endpoints(xx, on = "months", k = 2) # NOPE expect_identical(end(xx), end(xx[ep,]), paste(info_msg, "months, k=2")) ep <- endpoints(xx, on = "months", k = 3) # OK expect_identical(end(xx), end(xx[ep,]), paste(info_msg, "months, k=3")) ep <- endpoints(xx, on = "months", k = 4) # NOPE expect_identical(end(xx), end(xx[ep,]), paste(info_msg, "months, k=4")) # For the "weeks" case works fine ep <- endpoints(xx, on = "weeks", k = 2) # OK expect_identical(end(xx), end(xx[ep,]), paste(info_msg, "weeks, k=2")) ep <- endpoints(xx, on = "weeks", k = 3) # OK expect_identical(end(xx), end(xx[ep,]), paste(info_msg, "weeks, k=3")) ep <- endpoints(xx, on = "weeks", k = 4) # OK expect_identical(end(xx), end(xx[ep,]), paste(info_msg, "weeks, k=4")) info_msg <- "test.k_less_than_1_errors" x <- xDailyIntIdx expect_error(endpoints(x, on = "years", k = 0), info = info_msg) expect_error(endpoints(x, on = "years", k = -1), info = info_msg) expect_error(endpoints(x, on = "quarters", k = 0), info = info_msg) expect_error(endpoints(x, on = "quarters", k = -1), info = info_msg) expect_error(endpoints(x, on = "months", k = 0), info = info_msg) expect_error(endpoints(x, on = "months", k = -1), info = info_msg) expect_error(endpoints(x, on = "weeks", k = 0), info = info_msg) expect_error(endpoints(x, on = "weeks", k = -1), info = info_msg) expect_error(endpoints(x, on = "days", k = 0), info = info_msg) expect_error(endpoints(x, on = "days", k = -1), info = info_msg) x <- xSecIntIdx expect_error(endpoints(x, on = "hours", k = 0), info = info_msg) expect_error(endpoints(x, on = "hours", k = -1), info = info_msg) expect_error(endpoints(x, on = "minutes", k = 0), info = info_msg) expect_error(endpoints(x, on = "minutes", k = -1), info = info_msg) expect_error(endpoints(x, on = "seconds", k = 0), info = info_msg) expect_error(endpoints(x, on = "seconds", k = -1), info = info_msg) x <- .xts(1:10, sort(1 + runif(10))) expect_error(endpoints(x, on = "ms", k = 0), info = info_msg) expect_error(endpoints(x, on = "ms", k = -1), info = info_msg) expect_error(endpoints(x, on = "us", k = 0), info = info_msg) expect_error(endpoints(x, on = "us", k = -1), info = info_msg) xts/inst/tinytest/test-tformat.R0000644000176200001440000000346714634167654016536 0ustar liggesusers# These tests check the 'tformat' attribute is attached to the expected # component of the xts object. The xts constructors should no longer add the # '.indexFORMAT' attribute to the xts object itself. Only the index should # have a 'tformat' attribute. Construct xts objects using structure() to # test behavior when functions encounter xts objects created before 0.10-3. x <- structure(1:5, .Dim = c(5L, 1L), index = structure(1:5, tzone = "", tclass = c("POSIXct", "POSIXt"), tformat = "%Y-%m-%d"), .indexCLASS = c("POSIXct", "POSIXt"), tclass = c("POSIXct", "POSIXt"), .indexTZ = "UTC", tzone = "UTC", .indexFORMAT = "%Y-%m-%d %H:%M:%S", class = c("xts", "zoo")) info_msg <- "test.get_tformat" expect_identical(tformat(x), "%Y-%m-%d", info = info_msg) info_msg <- "test.get_indexFORMAT_warns" expect_warning(indexFormat(x), info = info_msg) info_msg <- "test.set_indexFORMAT_warns" expect_warning(indexFormat(x) <- "GMT", info = info_msg) info_msg <- "test.set_tformat_drops_xts_indexFORMAT" y <- x tformat(y) <- "%Y-%m-%d %H:%M" expect_identical(NULL, attr(y, ".indexFORMAT"), info = info_msg) info_msg <- "test.set_tformat_changes_index_tformat" y <- x fmt <- "%Y-%m-%d %H:%M" tformat(y) <- fmt expect_identical(fmt, attr(attr(y, "index"), "tformat"), info = info_msg) info_msg <- "test.get_coredata_drops_xts_indexFORMAT" y <- coredata(x) expect_identical(NULL, attr(y, ".indexFORMAT"), info = info_msg) info_msg <- "test.get_xtsAttributes_excludes_indexFORMAT" y <- xtsAttributes(x) expect_identical(NULL, y$.indexFORMAT, info = info_msg) info_msg <- "test.set_xtsAttributes_removes_indexFORMAT" y <- x xtsAttributes(y) <- xtsAttributes(x) expect_identical(NULL, attr(y, ".indexFORMAT"), info = info_msg) xts/inst/tinytest/test-tclass.R0000644000176200001440000000575014634167654016350 0ustar liggesusers# These tests check the time class attribute is attached to the expected # component of the xts object. The xts constructors should no longer add # 'tclass' or '.indexClass' attributes to the xts object itself. Only the index # should have a 'tclass' attribute. Construct xts objects using structure() to # test behavior when functions encounter xts objects created before 0.10-3. x <- structure(1:5, .Dim = c(5L, 1L), index = structure(1:5, tzone = "", tclass = c("POSIXct", "POSIXt")), .indexCLASS = c("POSIXct", "POSIXt"), tclass = c("POSIXct", "POSIXt"), .indexTZ = "UTC", tzone = "UTC", class = c("xts", "zoo")) info_msg <- "tclass(x) gets tclass attribute from index, not the xts object" expect_identical(tclass(x), c("POSIXct", "POSIXt"), info = info_msg) info_msg <- "indexClass(x) warns" expect_warning(indexClass(x), info = info_msg) info_msg <- "indexClass(x) <- 'Date' warns" expect_warning(indexClass(x) <- "Date", info = info_msg) info_msg <- "tclass(x) <- 'POSIXct' removes tclass and .indexCLASS from xts object" y <- x tclass(y) <- "POSIXct" expect_identical(NULL, attr(y, "tclass"), info = info_msg) expect_identical(NULL, attr(y, ".indexCLASS"), info = info_msg) info_msg <- "tclass<- sets tclass attribute on index" y <- x tclass(y) <- "Date" expect_identical("Date", attr(attr(y, "index"), "tclass"), info = info_msg) info_msg <- "tclass<- removes .indexCLASS attribute from xts object" expect_identical("Date", attr(.index(y), "tclass"), info = info_msg) info_msg <- "coredata(x) removes tclass and .indexCLASS from xts object" y <- coredata(x) expect_identical(NULL, attr(y, "tclass"), info = info_msg) expect_identical(NULL, attr(y, ".indexCLASS"), info = info_msg) info_msg <- "xtsAttributes(x) does not include tclass or .indexCLASS" y <- xtsAttributes(x) expect_identical(NULL, y$tclass, info = info_msg) expect_identical(NULL, y$.indexCLASS, info = info_msg) info_msg <- "xtsAttributes(x) <- 'foo' removes tclass and .indexCLASS" y <- x xtsAttributes(y) <- xtsAttributes(x) expect_identical(NULL, attr(y, "tclass"), info = info_msg) expect_identical(NULL, attr(y, ".indexCLASS"), info = info_msg) info_msg <- "tclass(x) <- `foo` always creates a character tclass" x <- "hello" tclass(x) <- 1 expect_identical(storage.mode(attr(x, "tclass")), "character") info_msg <- "zero-width subset has the same tclass as the input" target <- "Imatclass" x <- .xts(1:10, 1:10, tclass = target) y <- x[,0] expect_equal(target, tclass(y)) info_msg <- "tclass() on object with no tclass/.indexCLASS returns POSIXct" x <- structure(1:5, .Dim = c(5L, 1L), index = 1:5, class = c("xts", "zoo")) expect_warning(xtc <- tclass(x), "index does not have a 'tclass' attribute") expect_identical(c("POSIXct", "POSIXt"), xtc) info_msg <- "tclass<-() updates index" x <- xts(1, .POSIXct(14400, tz = "Europe/Berlin")) tclass(x) <- "Date" expect_identical(as.numeric(.index(x)), 0, info = paste(info_msg, "values")) expect_identical(tzone(x), "UTC", info = paste(info_msg, "timezone")) xts/inst/tinytest/test-Ops.R0000644000176200001440000004116314634167654015616 0ustar liggesusersall.modes <- c("double", "integer", "logical", "character") ops.math <- c("+", "-", "*", "/", "^", "%%", "%/%") ops.relation <- c(">", ">=", "==", "!=", "<=", "<") ops.logic <- c("&", "|", ops.relation) all.ops <- c(ops.math, ops.logic) ops_numeric_tester <- function(e1, e2, mode, op) { storage.mode(e1) <- mode storage.mode(e2) <- mode eval(call(op, e1, e2)) } make_msg <- function(info, op, type) { sprintf("%s op: %s, type: %s", info, op, type) } ### {{{ 2-column objects info_msg <- "test.ops_xts2d_matrix2d_dimnames" X1 <- .xts(cbind(1:3, 4:6), 1:3, dimnames = list(NULL, c("x", "y"))) M1 <- as.matrix(X1) * 5 M2 <- M1 colnames(M2) <- rev(colnames(M2)) for (o in all.ops) { for (m in all.modes) { if ("character" == m && !(o %in% ops.relation)) next e <- ops_numeric_tester(X1, M1, m, o) E <- X1 E[] <- ops_numeric_tester(coredata(E), M1, m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) # order of arguments should only change column names e <- ops_numeric_tester(M2, X1, m, o) E <- X1 colnames(E) <- colnames(M2) E[] <- ops_numeric_tester(M2, coredata(E), m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) } } info_msg <- "test.ops_xts2d_matrix2d_only_colnames" X1 <- .xts(cbind(1:3, 4:6), 1:3, dimnames = list(NULL, c("x", "y"))) M1 <- coredata(X1) * 5 M2 <- M1 colnames(M2) <- rev(colnames(M2)) for (o in all.ops) { for (m in all.modes) { if ("character" == m && !(o %in% ops.relation)) next e <- ops_numeric_tester(X1, M1, m, o) E <- X1 E[] <- ops_numeric_tester(coredata(E), M1, m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) # order of arguments should only change column names e <- ops_numeric_tester(M2, X1, m, o) E <- X1 colnames(E) <- colnames(M2) E[] <- ops_numeric_tester(M2, coredata(E), m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) } } info_msg <- "test.ops_xts2d_matrix2d_only_rownames" X1 <- .xts(cbind(1:3, 4:6), 1:3) M1 <- coredata(X1) * 5 rownames(M1) <- format(.POSIXct(1:3)) M2 <- M1 colnames(M2) <- rev(colnames(M2)) for (o in all.ops) { for (m in all.modes) { if ("character" == m && !(o %in% ops.relation)) next e <- ops_numeric_tester(X1, M1, m, o) E <- X1 E[] <- ops_numeric_tester(coredata(E), M1, m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) # order of arguments should only change column names e <- ops_numeric_tester(M2, X1, m, o) E <- X1 colnames(E) <- colnames(M2) E[] <- ops_numeric_tester(M2, coredata(E), m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) } } info_msg <- "test.ops_xts2d_matrix2d_no_dimnames" X1 <- .xts(cbind(1:3, 1:3), 1:3) M1 <- coredata(X1) * 5 for (o in all.ops) { for (m in all.modes) { if ("character" == m && !(o %in% ops.relation)) next e <- ops_numeric_tester(X1, M1, m, o) E <- X1 E[] <- ops_numeric_tester(coredata(E), M1, m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) # order of arguments shouldn't matter e <- ops_numeric_tester(M1, X1, m, o) E <- X1 E[] <- ops_numeric_tester(M1, coredata(E), m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) } } ### }}} 2-column objects ### {{{ 1-column objects info_msg <- "test.ops_xts1d_matrix1d_dimnames" X1 <- .xts(1:3, 1:3, dimnames = list(NULL, "x")) M1 <- as.matrix(X1) * 5 M2 <- M1 colnames(M2) <- "y" for (o in all.ops) { for (m in all.modes) { if ("character" == m && !(o %in% ops.relation)) next e <- ops_numeric_tester(X1, M1, m, o) E <- X1 E[] <- ops_numeric_tester(coredata(E), M1, m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) # order of arguments should only change column names e <- ops_numeric_tester(M2, X1, m, o) E <- X1 E[] <- ops_numeric_tester(M2, coredata(E), m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" colnames(E) <- "y" expect_identical(e, E, info = make_msg(info_msg, o, m)) } } info_msg <- "test.ops_xts1d_matrix1d_only_colnames" X1 <- .xts(1:3, 1:3, dimnames = list(NULL, "x")) M1 <- coredata(X1) * 5 M2 <- M1 colnames(M2) <- "y" for (o in all.ops) { for (m in all.modes) { if ("character" == m && !(o %in% ops.relation)) next e <- ops_numeric_tester(X1, M1, m, o) E <- X1 E[] <- ops_numeric_tester(coredata(E), M1, m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) # order of arguments should only change column names e <- ops_numeric_tester(M2, X1, m, o) E <- X1 E[] <- ops_numeric_tester(M2, coredata(E), m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" colnames(E) <- "y" expect_identical(e, E, info = make_msg(info_msg, o, m)) } } info_msg <- "test.ops_xts1d_matrix1d_only_rownames" X1 <- .xts(1:3, 1:3) M1 <- coredata(X1) * 5 rownames(M1) <- format(.POSIXct(1:3)) for (o in all.ops) { for (m in all.modes) { if ("character" == m && !(o %in% ops.relation)) next e <- ops_numeric_tester(X1, M1, m, o) E <- X1 E[] <- ops_numeric_tester(coredata(E), M1, m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) # order of arguments shouldn't matter e <- ops_numeric_tester(M1, X1, m, o) E <- X1 E[] <- ops_numeric_tester(M1, coredata(E), m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) } } info_msg <- "test.ops_xts1d_matrix1d_no_dimnames" X1 <- .xts(1:3, 1:3) M1 <- coredata(X1) * 5 for (o in all.ops) { for (m in all.modes) { if ("character" == m && !(o %in% ops.relation)) next e <- ops_numeric_tester(X1, M1, m, o) E <- X1 E[] <- ops_numeric_tester(coredata(E), M1, m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) # order of arguments shouldn't matter e <- ops_numeric_tester(M1, X1, m, o) E <- X1 E[] <- ops_numeric_tester(M1, coredata(E), m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) } } info_msg <- "test.ops_xts1d_xts1d" X1 <- .xts(1:3, 1:3, dimnames = list(NULL, "x")) for (o in all.ops) { for (m in all.modes) { if ("character" == m && !(o %in% ops.relation)) next e <- ops_numeric_tester(X1, X1, m, o) E <- X1 E[] <- ops_numeric_tester(coredata(X1), coredata(X1), m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) } } info_msg <- "test.ops_xts1d_xts1d_different_index" X1 <- .xts(1:3, 1:3, dimnames = list(NULL, "x")) X2 <- .xts(2:4, 2:4, dimnames = list(NULL, "y")) for (o in all.ops) { for (m in all.modes) { if ("character" == m && !(o %in% ops.relation)) next e <- ops_numeric_tester(X1, X2, m, o) E <- X1[2:3,] E[] <- ops_numeric_tester(coredata(E), coredata(X2[1:2,]), m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) # order of arguments should only change column names e <- ops_numeric_tester(X2, X1, m, o) E <- X2[1:2,] E[] <- ops_numeric_tester(coredata(X1[2:3,]), coredata(E), m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) } } ### }}} 1-column objects ### {{{ xts with dim, vector info_msg <- "test.ops_xts2d_vector_no_names" X1 <- .xts(cbind(1:3, 4:6), 1:3, dimnames = list(NULL, c("x", "y"))) V1 <- as.vector(coredata(X1[,1L])) * 5 for (o in all.ops) { for (m in all.modes) { if ("character" == m && !(o %in% ops.relation)) next e <- ops_numeric_tester(X1, V1, m, o) E <- X1 E[] <- ops_numeric_tester(coredata(E), V1, m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) # order of arguments shouldn't matter e <- ops_numeric_tester(V1, X1, m, o) E <- X1 E[] <- ops_numeric_tester(V1, coredata(E), m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) } } info_msg <- "test.ops_xts2d_vector_names" X1 <- .xts(cbind(1:3, 4:6), 1:3, dimnames = list(NULL, c("x", "y"))) V1 <- setNames(as.vector(X1[,1L]), index(X1)) * 5 for (o in all.ops) { for (m in all.modes) { if ("character" == m && !(o %in% ops.relation)) next e <- ops_numeric_tester(X1, V1, m, o) E <- X1 E[] <- ops_numeric_tester(coredata(E), V1, m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) # order of arguments shouldn't matter e <- ops_numeric_tester(V1, X1, m, o) E <- X1 E[] <- ops_numeric_tester(V1, coredata(E), m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) } } info_msg <- "test.ops_xts1d_vector_no_names" X1 <- .xts(1:3, 1:3, dimnames = list(NULL, "x")) V1 <- as.vector(coredata(X1[,1L])) * 5 for (o in all.ops) { for (m in all.modes) { if ("character" == m && !(o %in% ops.relation)) next e <- ops_numeric_tester(X1, V1, m, o) E <- X1 E[] <- ops_numeric_tester(coredata(E), V1, m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) # order of arguments shouldn't matter e <- ops_numeric_tester(V1, X1, m, o) E <- X1 E[] <- ops_numeric_tester(V1, coredata(E), m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) } } info_msg <- "test.ops_xts1d_vector_names" X1 <- .xts(1:3, 1:3, dimnames = list(NULL, "x")) V1 <- setNames(as.vector(X1[,1L]), index(X1)) * 5 for (o in all.ops) { for (m in all.modes) { if ("character" == m && !(o %in% ops.relation)) next e <- ops_numeric_tester(X1, V1, m, o) E <- X1 E[] <- ops_numeric_tester(coredata(E), V1, m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) # order of arguments shouldn't matter e <- ops_numeric_tester(V1, X1, m, o) E <- X1 E[] <- ops_numeric_tester(V1, coredata(E), m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) } } ### }}} xts with dim, vector ### {{{ xts no dims, matrix/vector info_msg <- "test.ops_xts_no_dim_matrix1d" X1 <- .xts(1:3, 1:3, dimnames = list(NULL, "x")) Xv <- drop(X1) M1 <- coredata(X1) * 5 for (o in all.ops) { for (m in all.modes) { if ("character" == m && !(o %in% ops.relation)) next e <- ops_numeric_tester(Xv, M1, m, o) E <- X1 E[] <- ops_numeric_tester(coredata(Xv), M1, m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) # order of arguments shouldn't matter e <- ops_numeric_tester(M1, Xv, m, o) E <- X1 E[] <- ops_numeric_tester(M1, coredata(Xv), m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) } } info_msg <- "test.ops_xts_no_dim_matrix2d" X1 <- .xts(1:3, 1:3, dimnames = list(NULL, "x")) Xv <- drop(X1) X2 <- merge(x = Xv * 2, y = Xv * 5) M2 <- coredata(X2) for (o in all.ops) { for (m in all.modes) { if ("character" == m && !(o %in% ops.relation)) next e <- ops_numeric_tester(Xv, M2, m, o) E <- X2 E[] <- ops_numeric_tester(coredata(Xv), M2, m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" # results no identical because attributes change order expect_equal(e, E, info = make_msg(info_msg, o, m)) # order of arguments shouldn't matter e <- ops_numeric_tester(M2, Xv, m, o) E <- X2 E[] <- ops_numeric_tester(M2, coredata(Xv), m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" # results no identical because attributes change order expect_equal(e, E, info = make_msg(info_msg, o, m)) } } info_msg <- "test.ops_xts_no_dim_vector" X1 <- .xts(1:3, 1:3, dimnames = list(NULL, "x")) Xv <- drop(X1) V1 <- 4:6 for (o in all.ops) { for (m in all.modes) { if ("character" == m && !(o %in% ops.relation)) next e <- ops_numeric_tester(Xv, V1, m, o) E <- Xv E[] <- ops_numeric_tester(coredata(Xv), V1, m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) # order of arguments shouldn't matter e <- ops_numeric_tester(V1, Xv, m, o) E <- Xv E[] <- ops_numeric_tester(V1, coredata(Xv), m, o) if (o %in% ops.logic) storage.mode(E) <- "logical" expect_identical(e, E, info = make_msg(info_msg, o, m)) } } ### }}} xts vector, matrix/vector ### These tests check that the time class of a time series on which ### a relational operator is applied is not changed. ts1 <- xts(17, order.by = as.Date('2020-01-29')) info_msg <- "test.get_tclass_ts1" expect_identical(tclass(ts1), c("Date"), info = info_msg) info_msg <- "test.tclass_after_rel_op" expect_identical(tclass(ts1 < 0), c("Date"), info = paste(info_msg, "| <")) expect_identical(tclass(ts1 > 0), c("Date"), info = paste(info_msg, "| >")) expect_identical(tclass(ts1 <= 0), c("Date"), info = paste(info_msg, "| <=")) expect_identical(tclass(ts1 >= 0), c("Date"), info = paste(info_msg, "| >=")) expect_identical(tclass(ts1 == 0), c("Date"), info = paste(info_msg, "| ==")) expect_identical(tclass(ts1 != 0), c("Date"), info = paste(info_msg, "| !=")) tstz <- "Atlantic/Reykjavik" ts2 <- xts(17, order.by = as.POSIXct("2020-01-29", tz = tstz)) info_msg <- "test.get_tclass_POSIXct_ts2" expect_true("POSIXct" %in% tclass(ts2), info = info_msg) info_msg <- "test.tclass_POSIXct_after_rel_op" expect_true("POSIXct" %in% tclass(ts2 < 0), info = paste(info_msg, "| <")) expect_true("POSIXct" %in% tclass(ts2 > 0), info = paste(info_msg, "| >")) expect_true("POSIXct" %in% tclass(ts2 <= 0), info = paste(info_msg, "| <=")) expect_true("POSIXct" %in% tclass(ts2 >= 0), info = paste(info_msg, "| >=")) expect_true("POSIXct" %in% tclass(ts2 == 0), info = paste(info_msg, "| ==")) expect_true("POSIXct" %in% tclass(ts2 != 0), info = paste(info_msg, "| !=")) info_msg <- "test.get_tzone_ts2" expect_identical(tzone(ts2), tstz, info = info_msg) info_msg <- "test.tzone_after_rel_op" expect_identical(tzone(ts2 < 0), tstz, info = paste(info_msg, "| <")) expect_identical(tzone(ts2 > 0), tstz, info = paste(info_msg, "| >")) expect_identical(tzone(ts2 <= 0), tstz, info = paste(info_msg, "| <=")) expect_identical(tzone(ts2 >= 0), tstz, info = paste(info_msg, "| >=")) expect_identical(tzone(ts2 == 0), tstz, info = paste(info_msg, "| ==")) expect_identical(tzone(ts2 != 0), tstz, info = paste(info_msg, "| !=")) ### Ops.xts() doesn't change column names x <- .xts(1:3, 1:3, dimnames = list(NULL, c("-1"))) z <- as.zoo(x) expect_equal(names(x + x[-1,]), names(z + z[-1,]), "Ops.xts() doesn't change column names when merge() is called") expect_equal(names(x + x), names(z + z), "Ops.xts() doesn't change column names when indexes are equal") ### Ops.xts returns derived class st <- Sys.time() x1 <- xts(1, st) x2 <- xts(2, st) x3 <- xts(3, st) # regular xts object # derived class objects klass <- c("foo", "xts", "zoo") class(x1) <- klass class(x2) <- klass expect_identical(klass, class(x1 + x2), "Ops.xts('foo', 'foo') returns derived class") expect_identical(klass, class(x2 + x1), "Ops.xts('foo', 'foo') returns derived class") expect_identical(klass, class(x1 + x3), "Ops.xts('foo', 'xts') returns derived class") expect_identical(class(x3), class(x3 + x1), "Ops.xts('xts', 'foo') returns xts class") info_msg <- "test.Ops.xts_unary" xpos <- xts(1, .Date(1)) xneg <- xts(-1, .Date(1)) lt <- xts(TRUE, .Date(1)) lf <- xts(FALSE, .Date(1)) expect_identical(xpos, +xpos, info = paste(info_msg, "+ positive xts")) expect_identical(xneg, +xneg, info = paste(info_msg, "+ negative xts")) expect_identical(xneg, -xpos, info = paste(info_msg, "- positive xts")) expect_identical(xpos, -xneg, info = paste(info_msg, "- negative xts")) expect_identical(lf, !lt, info = paste(info_msg, "! TRUE")) expect_identical(lt, !lf, info = paste(info_msg, "! FALSE")) xts/inst/tinytest/test-isordered.R0000644000176200001440000000554614634167654017042 0ustar liggesusers# Tests for isOrdered() # Utility functions for tests {{{ check.isOrdered <- function(x, v = rep(TRUE, 4), msg = "") { xc <- paste(capture.output(dput(x)), collapse = " ") expect_identical(v[1], isOrdered(x, TRUE, TRUE), info = paste(msg, xc, v[1], "increasing, strictly")) expect_identical(v[2], isOrdered(x, TRUE, FALSE), info = paste(msg, xc, v[2], "increasing")) expect_identical(v[3], isOrdered(x, FALSE, FALSE), info = paste(msg, xc, v[3], "decreasing")) expect_identical(v[4], isOrdered(x, FALSE, TRUE), info = paste(msg, xc, v[4], "decreasing, strictly")) } # }}} TTTT <- rep(TRUE, 4) FFFF <- !TTTT TTFF <- c(TRUE, TRUE, FALSE, FALSE) FFTT <- !TTFF # Increasing {{{ info_msg <- "test.isOrdered_incr" check.isOrdered(1:3, TTFF, info_msg) check.isOrdered(-1:1, TTFF, info_msg) check.isOrdered(c(1, 2, 3), TTFF, info_msg) check.isOrdered(c(-1, 0, 1), TTFF, info_msg) ### NA, NaN, Inf # beg info_msg <- "test.isOrdered_incr_begNA" check.isOrdered(c(NA_integer_, 1L, 2L), FFFF, info_msg) check.isOrdered(c(NA_real_, 1, 2), TTFF, info_msg) check.isOrdered(c(NaN, 1, 2), TTFF, info_msg) check.isOrdered(c(Inf, 1, 2), FFFF, info_msg) check.isOrdered(c(-Inf, 1, 2), TTFF, info_msg) # mid info_msg <- "test.isOrdered_incr_midNA" check.isOrdered(c(1L, NA_integer_, 2L), FFFF, info_msg) check.isOrdered(c(1, NA_real_, 2), TTTT, info_msg) check.isOrdered(c(1, NaN, 2), TTTT, info_msg) check.isOrdered(c(1, Inf, 2), FFFF, info_msg) check.isOrdered(c(1, -Inf, 2), FFFF, info_msg) # end info_msg <- "test.isOrdered_incr_endNA" check.isOrdered(c(1L, 2L, NA_integer_), TTFF, info_msg) check.isOrdered(c(1, 2, NA_real_), TTFF, info_msg) check.isOrdered(c(1, 2, NaN), TTFF, info_msg) check.isOrdered(c(1, 2, Inf), TTFF, info_msg) check.isOrdered(c(1, 2, -Inf), FFFF, info_msg) ### # }}} # Decreasing {{{ info_msg <- "test.isOrdered_decr" check.isOrdered(1:-1, FFTT, info_msg) check.isOrdered(3:1, FFTT, info_msg) check.isOrdered(c(3, 2, 1), FFTT, info_msg) check.isOrdered(c(1, 0, -1), FFTT, info_msg) ### NA, NaN, Inf # beg info_msg <- "test.isOrdered_decr_begNA" check.isOrdered(c(NA_integer_, 2L, 1L), FFTT, info_msg) check.isOrdered(c(NA_real_, 2, 1), FFTT, info_msg) check.isOrdered(c(NaN, 2, 1), FFTT, info_msg) check.isOrdered(c(Inf, 2, 1), FFTT, info_msg) check.isOrdered(c(-Inf, 2, 1), FFFF, info_msg) # mid info_msg <- "test.isOrdered_decr_midNA" check.isOrdered(c(2L, NA_integer_, 1L), FFFF, info_msg) check.isOrdered(c(2, NA_real_, 1), TTTT, info_msg) check.isOrdered(c(2, NaN, 1), TTTT, info_msg) check.isOrdered(c(2, Inf, 1), FFFF, info_msg) check.isOrdered(c(2, -Inf, 1), FFFF, info_msg) # end info_msg <- "test.isOrdered_decr_endNA" check.isOrdered(c(2L, 1L, NA_integer_), FFFF, info_msg) check.isOrdered(c(2, 1, NA_real_), FFTT, info_msg) check.isOrdered(c(2, 1, NaN), FFTT, info_msg) check.isOrdered(c(2, 1, Inf), FFFF, info_msg) check.isOrdered(c(2, 1, -Inf), FFTT, info_msg) ### # }}} xts/inst/tinytest/test-tzone.R0000644000176200001440000000476114634167654016217 0ustar liggesusers# These tests check the timezone attribute is attached to the expected # component of the xts object. The xts constructors should no longer add # 'tzone' or '.indexTZ' attributes to the xts object itself. Only the index # should have a 'tzone' attribute. Construct xts objects using structure() to # test behavior when functions encounter xts objects created before 0.10-3. x <- structure(1:5, .Dim = c(5L, 1L), index = structure(1:5, tzone = "", tclass = c("POSIXct", "POSIXt")), .indexCLASS = c("POSIXct", "POSIXt"), tclass = c("POSIXct", "POSIXt"), .indexTZ = "UTC", tzone = "UTC", class = c("xts", "zoo")) info_msg <- "test.get_tzone" expect_identical(tzone(x), "", info = info_msg) info_msg <- "indexTZ(x) warns" expect_warning(indexTZ(x)) info_msg <- "indexTZ(x) <- warns" expect_warning(indexTZ(x) <- "GMT") info_msg <- "tzone(x) <- `foo` removes tzone and .indexTZ from xts object" y <- x tzone(y) <- "GMT" expect_identical(NULL, attr(y, "tzone"), info = info_msg) expect_identical(NULL, attr(y, ".indexTZ"), info = info_msg) info_msg <- "tzone(x) <- `foo` sets the tzone attribute on the index" y <- x tzone(y) <- "GMT" expect_identical("GMT", attr(attr(y, "index"), "tzone"), info = info_msg) expect_null(attr(y, ".indexTZ"), info = "tzone(x) <- `foo` removes .indexTZ attribute from xts object") info_msg <- "tzone(x) <- NULL sets the tzone attribute on the index to '' (empty string)" y <- x tzone(y) <- NULL expect_identical("", attr(attr(y, "index"), "tzone"), info = info_msg) info_msg <- "coredata(x) removes tzone and .indexTZ from xts object" y <- coredata(x) expect_identical(NULL, attr(y, "tzone"), info = info_msg) expect_identical(NULL, attr(y, ".indexTZ"), info = info_msg) info_msg <- "xtsAttributes(x) does not include tzone or .indexTZ" y <- xtsAttributes(x) expect_identical(NULL, y$tzone, info = info_msg) expect_identical(NULL, y$.indexTZ, info = info_msg) info_msg <- "xtsAttributes(x) <- 'foo' removes tzone and .indexTZ" y <- x xtsAttributes(y) <- xtsAttributes(x) expect_identical(NULL, attr(y, "tzone"), info = info_msg) expect_identical(NULL, attr(y, ".indexTZ"), info = info_msg) info_msg <- "tzone(x) <- `foo` always creates a character tzone" x <- "hello" tzone(x) <- 1 expect_identical(storage.mode(attr(x, "tzone")), "character", info = info_msg) info_msg <- "zero-width subset has the same tzone as the input" target <- "Ima/Tzone" x <- .xts(1:10, 1:10, tzone = target) y <- x[,0] expect_equal(target, tzone(y), info = info_msg) xts/inst/tinytest/test-to.period.R0000644000176200001440000000173314634167654016757 0ustar liggesusers# ensure first group is included in output info_msg <- "test.to.frequency_includes_first_group" data(sample_matrix) x <- as.xts(sample_matrix) x$Volume <- 1 tf <- xts:::to.frequency(x, x$Volume, 90, name=NULL) tp <- .Call(xts:::C_toPeriod, x, c(0L, 90L, 180L), TRUE, 5L, FALSE, FALSE, c("Open", "High", "Low", "Close", "Volume")) expect_identical(tf, tp, info = info_msg) info_msg <- "test.to.period_custom_endpoints" data(sample_matrix) x <- as.xts(sample_matrix) ep <- endpoints(x, "months", 1) y1 <- to.period(x, "months", 1) y2 <- to.period(x, ep) expect_identical(y1, y2, info = info_msg) # period must be character or numeric expect_error(to.period(x, TRUE), info = "period must be character or numeric") # 'k' and 'indexAt' are ignored expect_warning(to.period(x, ep, k = 2), info = "'k' is ignored when endpoints are provided") expect_warning(to.period(x, ep, indexAt = ""), info = "'indexAt' is ignored when endpoints are provided") xts/inst/tinytest/test-na.fill.R0000644000176200001440000000122514634167654016373 0ustar liggesusersinfo_msg <- "na.fill.xts() matches na.fill.zoo() when object has 1 column and 'fill' is scalar" x <- .xts(1:20, 1:20) is.na(x) <- sample(20, 10) z <- as.zoo(x) x_out <- coredata(na.fill(x, 0)) z_out <- coredata(na.fill(z, 0)) expect_equal(z_out, x_out, info = info_msg) info_msg <- "na.fill.xts() matches na.fill.zoo() when object has 2 columns and 'fill' is scalar" x <- .xts(cbind(1:10, 1:10), 1:10) is.na(x[,1]) <- sample(10, 5) is.na(x[,2]) <- sample(10, 5) z <- as.zoo(x) x_out <- coredata(na.fill(x, 0)) z_out <- coredata(na.fill(z, 0)) # z_out has dimnames (both NULL) for some reason dimnames(z_out) <- NULL expect_equal(z_out, x_out, info = info_msg) xts/inst/tinytest/test-xts.R0000644000176200001440000005020714634167654015672 0ustar liggesusers# Tests for xts constructors ### NA in order.by {{{ # .xts() expect_error(.xts(1:3, c(1L, 2L, NA)), info = ".xts() order.by ends with NA_integer_") expect_error(.xts(1:3, c(NA, 2L, 3L)), info = ".xts() order.by starts with NA_integer_") expect_error(.xts(1:3, c(1L, NA, 3L)), info = ".xts() order.by contains NA_integer_") expect_error(.xts(1:3, c(1, 2, NA)), info = ".xts() order.by ends with NA_real_") expect_error(.xts(1:3, c(NA, 2, 3)), info = ".xts() order.by starts with NA_real_") expect_error(.xts(1:3, c(1, NA, 3)), info = ".xts() order.by contains NA_real_") expect_error(.xts(1:3, c(1, 2, NaN)), info = ".xts() order.by ends with NaN") expect_error(.xts(1:3, c(NaN, 2, 3)), info = ".xts() order.by starts with NaN") expect_error(.xts(1:3, c(1, NaN, 3)), info = ".xts() order.by contains NaN") expect_error(.xts(1:3, c(1, 2, Inf)), info = ".xts() order.by ends with Inf") expect_error(.xts(1:3, c(-Inf, 2, 3)), info = ".xts() order.by starts with -Inf") # xts() expect_error(xts(1:3, as.Date(c(1L, 2L, NA), origin = "1970-01-01")), info = "xts() order.by ends with NA_integer_") expect_error(xts(1:3, as.Date(c(NA, 2L, 3L), origin = "1970-01-01")), info = "xts() order.by starts with NA_integer_") expect_error(xts(1:3, as.Date(c(1L, NA, 3L), origin = "1970-01-01")), info = "xts() order.by contains NA_integer_") expect_error(xts(1:3, .POSIXct(c(1, 2, NA))), info = "xts() order.by ends with NA_real_") expect_error(xts(1:3, .POSIXct(c(NA, 2, 3))), info = "xts() order.by starts with NA_real_") expect_error(xts(1:3, .POSIXct(c(1, NA, 3))), info = "xts() order.by contains NA_real_") expect_error(xts(1:3, .POSIXct(c(1, 2, NaN))), info = "xts() order.by ends with NaN") expect_error(xts(1:3, .POSIXct(c(NaN, 2, 3))), info = "xts() order.by starts with NaN") expect_error(xts(1:3, .POSIXct(c(1, NaN, 3))), info = "xts() order.by contains NaN") expect_error(xts(1:3, .POSIXct(c(1, 2, Inf))), info = "xts() order.by ends with Inf") expect_error(xts(1:3, .POSIXct(c(-Inf, 2, 3))), info = "xts() order.by starts with -Inf") ### }}} # Test that only first tzone element is stored for POSIXlt tz <- "America/Chicago" i <- as.POSIXlt("2018-01-01", tz = tz) y <- xts(1, i) expect_identical(tz, tzone(y), info = "xts() only uses the first element of tzone for POSIXlt order.by") ### constructors add tzone and tclass to the index by default x <- xts() expect_true(!is.null(attr(attr(x, "index"), "tclass")), info = "xts() with no args adds tclass to the index") expect_true(!is.null(attr(attr(x, "index"), "tzone")), info = "xts() with no args adds tzone to the index") x <- .xts(, .POSIXct(integer())) expect_true(!is.null(attr(attr(x, "index"), "tclass")), info = ".xts() with no args adds tclass to the index") expect_true(!is.null(attr(attr(x, "index"), "tzone")), info = ".xts() with no args adds tzone to the index") ### constructor defaults don't add index attributes to the xts object x <- xts(1, as.Date("2018-05-02")) expect_null(attr(x, "tclass"), info = "xts() doesn't add tclass to xts object") expect_null(attr(x, ".indexCLASS"), info = "xts() doesn't add .indexCLASS to xts object") y <- .xts(1, 1) expect_null(attr(y, "tclass"), info = ".xts() doesn't add .indexCLASS to xts object") expect_null(attr(y, ".indexCLASS"), info = ".xts() doesn't add .indexCLASS to xts object") x <- xts(1, as.Date("2018-05-02")) expect_null(attr(x, "tzone"), info = "xts() doesn't add tzone to xts object") expect_null(attr(x, ".indexTZ"), info = "xts() doesn't add .indexTZ to xts object") y <- .xts(1, 1) expect_null(attr(y, "tzone"), info = ".xts() doesn't add tzone to xts object") expect_null(attr(y, ".indexTZ"), info = ".xts() doesn't add .indexTZ to xts object") x <- xts(1, as.Date("2018-05-02")) expect_null(attr(x, "tformat"), info = "xts() doesn't add tformat to xts object") expect_null(attr(x, ".indexFORMAT"), info = "xts() doesn't add .indexFORMAT to xts object") y <- .xts(1, 1) expect_null(attr(y, "tformat"), info = ".xts() doesn't add tformat to xts object") expect_null(attr(y, ".indexFORMAT"), info = ".xts() doesn't add .indexFORMAT to xts object") ### constructor with index attributes specified doesn't add them to the xts object create_msg <- function(func, attrib) { paste0(func, "(..., ", attrib, " = 'foo' doesn't add ", attrib, " to the xts object") } suppressWarnings({ x <- xts(1, Sys.time(), .indexCLASS = "yearmon") y <- xts(1, Sys.time(), .indexFORMAT = "%Y") z <- xts(1, Sys.time(), .indexTZ = "UTC") }) expect_null(attr(x, ".indexCLASS"), info = create_msg("xts", ".indexCLASS")) expect_null(attr(y, ".indexFORMAT"), info = create_msg("xts", ".indexFORMAT")) expect_null(attr(z, ".indexTZ"), info = create_msg("xts", ".indexTZ")) suppressWarnings({ x <- .xts(1, Sys.time(), .indexCLASS = "yearmon") y <- .xts(1, Sys.time(), .indexFORMAT = "%Y") z <- .xts(1, Sys.time(), .indexTZ = "UTC") }) expect_null(attr(x, ".indexCLASS"), info = create_msg(".xts", ".indexCLASS")) expect_null(attr(y, ".indexFORMAT"), info = create_msg(".xts", ".indexFORMAT")) expect_null(attr(z, ".indexTZ"), info = create_msg(".xts", ".indexTZ")) x <- xts(1, Sys.time(), tclass = "Date") y <- xts(1, Sys.time(), tformat = "%Y-%m-%d %H:%M") z <- xts(1, Sys.time(), tzone = "UTC") expect_null(attr(x, "tclass"), info = create_msg("xts", "tclass")) expect_null(attr(y, "tformat"), info = create_msg("xts", "tformat")) expect_null(attr(z, "tzone"), info = create_msg("xts", "tzone")) x <- .xts(1, Sys.time(), tclass = "Date") y <- .xts(1, Sys.time(), tformat = "%Y-%m-%d %H:%M") z <- .xts(1, Sys.time(), tzone = "UTC") expect_null(attr(x, "tclass"), info = create_msg(".xts", "tclass")) expect_null(attr(y, "tformat"), info = create_msg(".xts", "tformat")) expect_null(attr(z, "tzone"), info = create_msg(".xts", "tzone")) # These error due to `missing("tclass")` instead of `!hasArg("tclass")` # missing() expects an argument symbol, not a character string. The error is # not caught in expect_warning() as of tinytest_1.3.1 suppressWarnings(xts(1, as.Date("2018-05-02"), .indexCLASS = "Date")) suppressWarnings(xts(1, as.Date("2018-05-02"), .indexFORMAT = "%Y")) suppressWarnings(.xts(1, 1, .indexCLASS = "Date")) suppressWarnings(.xts(1, 1, .indexFORMAT = "%Y")) ### warn if deprecated arguments passed to constructor deprecated_warns <- list(iclass = "'.indexCLASS' is deprecated.*use tclass instead", izone = "'.indexTZ' is deprecated.*use tzone instead", iformat = "'.indexFORMAT' is deprecated.*use tformat instead") expect_warning(x <- xts(1, as.Date("2018-05-02"), .indexCLASS = "Date"), pattern = deprecated_warns$iclass, info = "xts() warns when .indexCLASS argument is provided") expect_warning(x <- .xts(1, as.Date("2018-05-02"), .indexCLASS = "Date"), pattern = deprecated_warns$iclass, info = ".xts() warns when .indexCLASS argument is provided") expect_warning(x <- xts(1, as.Date("2018-05-02"), .indexTZ = "UTC"), pattern = deprecated_warns$izone, info = "xts() warns when .indexTZ argument is provided") expect_warning(x <- .xts(1, as.Date("2018-05-02"), .indexTZ = "UTC"), pattern = deprecated_warns$izone, info = ".xts() warns when .indexTZ argument is provided") expect_warning(x <- xts(1, as.Date("2018-05-02"), .indexFORMAT = "%Y"), pattern = deprecated_warns$iformat, info = "xts() warns when .indexFORMAT is provided") expect_warning(x <- .xts(1, as.Date("2018-05-02"), .indexFORMAT = "%Y"), pattern = deprecated_warns$iformat, info = ".xts() warns when .indexFORMAT is provided") ### constructors add tformat to the index when it's specified tf <- "%m/%d/%Y" x <- xts(1:3, .Date(1:3), tformat = tf) y <- .xts(1:3, .Date(1:3), tformat = tf) expect_identical(tf, attr(attr(x, "index"), "tformat"), info = "xts(..., tformat = 'foo') adds tformat to index") expect_identical(tf, attr(attr(y, "index"), "tformat"), info = ".xts(..., tformat = 'foo') adds tformat to index") ### dimnames come through '...' x <- xts(1:5, .Date(1:5), dimnames = list(NULL, "x")) y <- .xts(1:5, 1:5, dimnames = list(NULL, "x")) expect_equal(colnames(x), colnames(y), info = "xts() and .xts() apply dimnames passed via '...'") x <- xts(1:5, .Date(1:5), dimnames = list(1:5, "x")) y <- .xts(1:5, 1:5, dimnames = list(1:5, "x")) expect_null(rownames(x), info = "xts() doesn't set rownames when dimnames passed via '...'") expect_null(rownames(y), info = ".xts() doesn't set rownames when dimnames passed via '...'") m <- matrix(1, dimnames = list("a", "b")) x <- .xts(m, 1) expect_null(rownames(x), info = ".xts() on a matrix with rownames does not have rownames") # test..xts_ctor_warns_if_index_tclass_not_NULL_or_POSIXct <- function() { # DEACTIVATED("Warning causes errors in dependencies") # # idx <- 1:3 # x <- .xts(1:3, idx) # no error, NULL # idx <- .POSIXct(idx) # x <- .xts(1:3, idx) # no error, POSIXct # # idx <- structure(1:3, tclass = "Date", tzone = "UTC") # expect_warning(.xts(1:3, idx), msg = "tclass = Date") # idx <- structure(idx, tclass = "yearmon", tzone = "UTC") # expect_warning(.xts(1:3, idx), msg = "tclass = yearmon") # idx <- structure(idx, tclass = "timeDate", tzone = "UTC") # expect_warning(.xts(1:3, idx), msg = "tclass = timeDate") # } ### xts() index attribute precedence should be: ### 1. .index* value (e.g. .indexTZ) # backward compatibility ### 2. t* value (e.g. tzone) # current function to override index attribute ### 3. attribute on order.by # overridden by either 2 above target_index <- structure(Sys.time(), tzone = "UTC", tclass = "yearmon", tformat = "%Y-%m-%d") suppressWarnings({ x <- xts(1, target_index, .indexCLASS = "Date", tclass = "yearqtr") y <- xts(1, target_index, .indexFORMAT = "%Y-%b", tformat = "%Y-%m") z <- xts(1, target_index, .indexTZ = "Asia/Tokyo", tzone = "Europe/London") }) expect_identical(tclass(x), "Date", info = "xts() .indexCLASS takes precedence over tclass") expect_identical(tformat(y), "%Y-%b", info = "xts() .indexFORMAT takes precedence over tformat") expect_identical(tzone(z), "Asia/Tokyo", info = "xts() .indexTZ takes precedence over tzone") x <- xts(1, target_index, tclass = "yearqtr") y <- xts(1, target_index, tformat = "%Y-%m") z <- xts(1, target_index, tzone = "Europe/London") expect_identical(tclass(x), "yearqtr", info = "xts() tclass takes precedence over index tclass") expect_identical(tformat(y), "%Y-%m", info = "xts() tformat takes precedence over index tformat") expect_identical(tzone(z), "Europe/London", info = "xts() tzone takes precedence over index tzone") x <- xts(1, target_index) y <- xts(1, target_index) z <- xts(1, target_index) expect_identical(tclass(x), attr(target_index, "tclass"), info = "xts() uses index tclass") expect_identical(tformat(y), attr(target_index, "tformat"), info = "xts() uses index tformat") expect_identical(tzone(z), attr(target_index, "tzone"), info = "xts() uses index tzone") ### .xts() index attribute precedence is similar. But we cannot override tclass ### because it's a formal argument with a specific default. Historically .xts() ### has always set the tclass to POSIXct by default, whether or not the 'index' ### argument already had a tclass attribute. target_index <- structure(as.POSIXlt(Sys.time()), tzone = "UTC", tclass = "yearmon", tformat = "%Y-%m-%d") suppressWarnings({ x <- .xts(1, target_index, .indexCLASS = "Date", tclass = "yearqtr") y <- .xts(1, target_index, .indexFORMAT = "%Y-%b", tformat = "%Y-%m") z <- .xts(1, target_index, .indexTZ = "Asia/Tokyo", tzone = "Europe/London") }) expect_identical(tclass(x), "Date", info = ".xts() .indexCLASS takes precedence over tclass") expect_identical(tformat(y), "%Y-%b", info = ".xts() .indexFORMAT takes precedence over tformat") expect_identical(tzone(z), "Asia/Tokyo", info = ".xts() .indexTZ takes precedence over tzone") x <- .xts(1, target_index, tclass = "yearqtr") y <- .xts(1, target_index, tformat = "%Y-%m") z <- .xts(1, target_index, tzone = "Europe/London") expect_identical(tclass(x), "yearqtr", info = ".xts() tclass takes precedence over index tclass") expect_identical(tformat(y), "%Y-%m", info = ".xts() tformat takes precedence over index tformat") expect_identical(tzone(z), "Europe/London", info = ".xts() tzone takes precedence over index tzone") x <- .xts(1, target_index) y <- .xts(1, target_index) z <- .xts(1, target_index) # NOTE: as of 0.10-0, .xts() sets tclass on the index to "POSIXct" by default. # It does not keep the index argument's tclass if it has one. So overriding # the default with the index's tclass attribute is a breaking change. expect_identical(tclass(x), c("POSIXct", "POSIXt"), info = ".xts() *ignores* index tclass (unlike xts())") # tformat and tzone are handled the same as in xts() expect_identical(tformat(y), attr(target_index, "tformat"), info = ".xts() uses index tformat") expect_identical(tzone(z), attr(target_index, "tzone"), info = ".xts() uses index tzone") suppressWarnings({ x <- xts(1, Sys.Date(), tformat = "%Y", .indexCLASS = "Date", .indexTZ = "UTC", user = "attribute", hello = "world", dimnames = list(NULL, "x")) y <- .xts(1, 1, tformat = "%Y", .indexCLASS = "Date", .indexTZ = "UTC", user = "attribute", hello = "world", dimnames = list(NULL, "x")) }) info_msg <- "xts() adds user attributes" expect_null(attr(x, "tformat"), info = info_msg) expect_null(attr(x, "tclass"), info = info_msg) expect_null(attr(x, "tzone"), info = info_msg) expect_null(attr(x, ".indexCLASS"), info = info_msg) expect_null(attr(x, ".indexTZ"), info = info_msg) expect_identical("attribute", attr(x, "user"), info = info_msg) expect_identical("world", attr(x, "hello"), info = info_msg) expect_identical("x", colnames(x), info = info_msg) info_msg <- ".xts() adds user attributes" expect_null(attr(y, "tformat"), info = info_msg) expect_null(attr(y, "tclass"), info = info_msg) expect_null(attr(y, "tzone"), info = info_msg) expect_null(attr(y, ".indexCLASS"), info = info_msg) expect_null(attr(y, ".indexTZ"), info = info_msg) expect_identical("attribute", attr(y, "user"), info = info_msg) expect_identical("world", attr(y, "hello"), info = info_msg) expect_identical("x", colnames(y), info = info_msg) ### constructors should not warn for Date, yearmon, yearqtr, chron::chron, chron::dates ### and should set tzone to UTC for any UTC-equivalent tzone create_msg <- function(klass, tz, warns = TRUE) { warn_part <- if(warns) "warns" else "doesn't warn" sprintf("xts(1, %s(...), tzone = '%s') %s", klass, tz, warn_part) } create_msg. <- function(klass, tz, warns = TRUE) { paste0(".", create_msg(klass, tz, warns)) } ym <- as.yearmon(Sys.Date()) yq <- as.yearqtr(Sys.Date()) for(tz in c("UTC", "GMT", "Etc/UTC", "Etc/GMT", "GMT-0", "GMT+0", "GMT0")) { # xts() x <- y <- z <- NULL expect_silent(x <- xts(1, .Date(1), tzone = tz), info = create_msg("Date()", tz, FALSE)) expect_silent(y <- xts(1, ym, tzone = tz), info = create_msg("yearmon", tz, FALSE)) expect_silent(z <- xts(1, yq, tzone = tz), info = create_msg("yearqtr", tz, FALSE)) expect_identical(tzone(x), "UTC", info = "xts() UTC-equivalent tzone is set to UTC (Date)") expect_identical(tzone(y), "UTC", info = "xts() UTC-equivalent tzone is set to UTC (yearmon)") expect_identical(tzone(z), "UTC", info = "xts() UTC-equivalent tzone is set to UTC (yearqtr)") # .xts() x <- y <- z <- NULL expect_silent(x <- .xts(1, .Date(1), tzone = tz), info = create_msg.("Date", tz, FALSE)) expect_silent(y <- .xts(1, ym, tzone = tz), info = create_msg.("yearmon", tz, FALSE)) expect_silent(z <- .xts(1, yq, tzone = tz), info = create_msg.("yearqtr", tz, FALSE)) expect_identical(tzone(x), "UTC", info = ".xts() UTC-equivalent tzone is set to UTC (Date)") expect_identical(tzone(y), "UTC", info = ".xts() UTC-equivalent tzone is set to UTC (yearmon)") expect_identical(tzone(z), "UTC", info = ".xts() UTC-equivalent tzone is set to UTC (yearqtr)") if(requireNamespace("chron", quietly = TRUE)) { x <- y <- NULL expect_silent(x <- xts(1, chron::chron(1, 1), tzone = tz), info = create_msg("chron", tz, FALSE)) expect_silent(y <- xts(1, chron::dates(1), tzone = tz), info = create_msg("dates", tz, FALSE)) expect_identical(tzone(x), "UTC", info = "xts() UTC-equivalent tzone is set to UTC (chron)") expect_identical(tzone(y), "UTC", info = ".xts() UTC-equivalent tzone is set to UTC (dates)") x <- y <- NULL expect_silent(x <- .xts(1, chron::chron(1, 1), tzone = tz), info = create_msg.("chron", tz, FALSE)) expect_silent(y <- .xts(1, chron::dates(1), tzone = tz), info = create_msg.("dates", tz, FALSE)) expect_identical(tzone(x), "UTC", info = "xts() UTC-equivalent tzone is set to UTC (chron)") expect_identical(tzone(y), "UTC", info = ".xts() UTC-equivalent tzone is set to UTC (dates)") } } ### constructors warn and ignore non-UTC tzone for index/order.by classes without timezones tz <- "America/Chicago" warn_pattern <- "tzone.*setting ignored for.*indexes" # xts() x <- y <- z <- NULL expect_warning(x <- xts(1, .Date(1), tzone = tz), pattern = warn_pattern, info = create_msg("Date", tz, TRUE)) expect_warning(y <- xts(1, ym, tzone = tz), pattern = warn_pattern, info = create_msg("yearmon", tz, TRUE)) expect_warning(z <- xts(1, yq, tzone = tz), pattern = warn_pattern, info = create_msg("yearqtr", tz, TRUE)) expect_identical(tzone(x), "UTC", info = "xts() non-UTC tzone is set to UTC (Date)") expect_identical(tzone(y), "UTC", info = "xts() non-UTC tzone is set to UTC (yearmon)") expect_identical(tzone(z), "UTC", info = "xts() non-UTC tzone is set to UTC (yearqtr)") # .xts() x <- y <- z <- NULL expect_warning(x <- .xts(1, .Date(1), tzone = tz), pattern = warn_pattern, info = create_msg("yearqtr", tz, TRUE)) expect_warning(y <- .xts(1, ym, tzone = tz), pattern = warn_pattern, info = create_msg("Date", tz, TRUE)) expect_warning(z <- .xts(1, yq, tzone = tz), pattern = warn_pattern, info = create_msg("yearmon", tz, TRUE)) expect_identical(tzone(x), "UTC", info = ".xts() non-UTC tzone is set to UTC (Date)") expect_identical(tzone(y), "UTC", info = ".xts() non-UTC tzone is set to UTC (yearmon)") expect_identical(tzone(z), "UTC", info = ".xts() non-UTC tzone is set to UTC (yearqtr)") if(requireNamespace("chron", quietly = TRUE)) { x <- y <- NULL expect_warning(x <- xts(1, chron::chron(1, 1), tzone = tz), pattern = warn_pattern, info = create_msg("chron", tz, TRUE)) expect_warning(y <- xts(1, chron::dates(1), tzone = tz), pattern = warn_pattern, info = create_msg("dates", tz, TRUE)) expect_identical(tzone(x), "UTC", info = "xts() non-UTC tzone is set to UTC (chron)") expect_identical(tzone(y), "UTC", info = "xts() non-UTC tzone is set to UTC (dates)") x <- y <- NULL expect_warning(x <- .xts(1, chron::chron(1, 1), tzone = tz), pattern = warn_pattern, info = create_msg.("chron", tz, TRUE)) expect_warning(y <- .xts(1, chron::dates(1), tzone = tz), pattern = warn_pattern, info = create_msg.("dates", tz, TRUE)) expect_identical(tzone(x), "UTC", info = ".xts() non-UTC tzone is set to UTC (chron)") expect_identical(tzone(y), "UTC", info = ".xts() non-UTC tzone is set to UTC (dates)") } ### lists and zero-row data.frames msg <- "cannot convert lists to xts objects" expect_error(xts(list(1, 2), .Date(1:2)), msg, info = msg) #expect_error(.xts(list(1, 2), 1:2), msg, info = msg) zero_row_df <- data.frame(date = .Date(numeric(0)), x = numeric(0), y = numeric(0)) zero_row_xts <- xts(zero_row_df[, -1], zero_row_df[, 1]) expect_identical(names(zero_row_xts), names(zero_row_df)[-1], info = "xts() keeps names for zero-row data.frame") expect_equal(.Date(numeric(0)), index(zero_row_xts), info = "xts() has zero-length Date index for zero-row data.frame with Date column") zero_row_xts. <- .xts(zero_row_df[, -1], zero_row_df[, 1]) expect_identical(names(zero_row_xts.), names(zero_row_df)[-1], info = ".xts() keeps names for zero-row data.frame") expect_equal(.Date(numeric(0)), index(zero_row_xts.), info = ".xts() has zero-length Date index for zero-row data.frame with Date column") xts/inst/tinytest/test-timeBasedSeq.R0000644000176200001440000000572214634167654017424 0ustar liggesusers# timeBasedSeq tests # 1999 to 2008 by year, Date info_msg <- "test.tbs_1999_to_2008_by_year_Date" tbs <- timeBasedSeq('1999/2008') bench <- seq(as.Date("1999-01-01"),as.Date("2008-01-01"),by='year') expect_equivalent(tbs, bench, info = info_msg) # 1999 to 2008 by year, retclass='Date' info_msg <- "test.tbs_1999_to_2008_by_year_retclassDate" tbs <- timeBasedSeq('1999/2008', retclass='Date') bench <- seq(as.Date("1999-01-01"),as.Date("2008-01-01"),by='year') expect_equivalent(tbs, bench, info = info_msg) # 1999 to 2008 by year, retclass="POSIXct" info_msg <- "test.tbs_1999_to_2008_by_year" tbs <- timeBasedSeq('1999/2008',retclass='POSIXct') bench <- seq(as.POSIXct("1999-01-01"),as.POSIXct("2008-01-01"),by='year') expect_equivalent(tbs, bench, info = info_msg) # MONTHLY sequences # defaults to yearmon from the zoo package # NB: these differ by ~4.16e-5 on Solaris and rhub's windows-x86_64-devel info_msg <- "test.tbs_199901_to_200801_by_month" tbs <- timeBasedSeq('199901/200801') bench <- as.yearmon(seq(as.Date("1999-01-01"),as.Date("2008-01-01"),by='month')) expect_equivalent(tbs, bench, tolerance = 1e-4, info = info_msg) info_msg <- "test.tbs_199901_to_2008_by_month" tbs <- timeBasedSeq('199901/2008') bench <- as.yearmon(seq(as.Date("1999-01-01"),as.Date("2008-12-01"),by='month')) expect_equivalent(tbs, bench, tolerance = 1e-4, info = info_msg) info_msg <- "test.tbs_1999_to_200801_by_month" tbs <- timeBasedSeq('1999/200801') bench <- as.yearmon(seq(as.Date("1999-01-01"),as.Date("2008-01-01"),by='month')) expect_equivalent(tbs, bench, tolerance = 1e-4, info = info_msg) # retclass=Date info_msg <- "test.tbs_199901_to_200801_by_month_Date" tbs <- timeBasedSeq('199901/200801', retclass='Date') bench <- seq(as.Date("1999-01-01"),as.Date("2008-01-01"),by='month') expect_equivalent(tbs, bench, info = info_msg) info_msg <- "test.tbs_199901_to_2008_by_month_Date" tbs <- timeBasedSeq('199901/2008', retclass='Date') bench <- seq(as.Date("1999-01-01"),as.Date("2008-12-01"),by='month') expect_equivalent(tbs, bench, info = info_msg) info_msg <- "test.tbs_1999_to_200801_by_month_Date" tbs <- timeBasedSeq('1999/200801', retclass='Date') bench <- as.Date(seq(as.Date("1999-01-01"),as.Date("2008-01-01"),by='month')) expect_equivalent(tbs, bench, info = info_msg) # retclass=POSIXct info_msg <- "test.tbs_199901_to_200801_by_month_POSIXct" tbs <- timeBasedSeq('199901/200801', retclass='POSIXct') bench <- seq(as.POSIXct("1999-01-01"),as.POSIXct("2008-01-01"),by='month') expect_equivalent(tbs, bench, info = info_msg) info_msg <- "test.tbs_199901_to_2008_by_month_POSIXct" tbs <- timeBasedSeq('199901/2008', retclass='POSIXct') bench <- as.POSIXct(seq(as.POSIXct("1999-01-01"),as.POSIXct("2008-12-01"),by='month')) expect_equivalent(tbs, bench, info = info_msg) info_msg <- "test.tbs_1999_to_200801_by_month_POSIXct" tbs <- timeBasedSeq('1999/200801', retclass='POSIXct') bench <- seq(as.POSIXct("1999-01-01"),as.POSIXct("2008-01-01"),by='month') expect_equivalent(tbs, bench, info = info_msg) xts/inst/tinytest/test-split.R0000644000176200001440000000504214634167654016204 0ustar liggesusersnm_minutes <- c("1970-01-01 00:00:00", "1970-01-01 00:01:00") # 'f' is character, but length(f) > 1 info_msg <- "test.split_character_f_not_endpoints" x <- .xts(1:5, 1:5) f <- letters[1:nrow(x)] expect_identical(split(x,f), split(as.zoo(x),f), info = info_msg) info_msg <- "test.split_returns_named_list" qtr_2020 <- paste0("2020 Q", 1:4) qtr_2021 <- paste0("2021 Q", 1:4) info_msg <- "quarterly data split by year" x_q <- xts(1:8, as.yearqtr(c(qtr_2020, qtr_2021))) nm_q <- names(split(x_q, "years")) expect_identical(c("2020", "2021"), nm_q, info = info_msg) # names formatted as yearqtr info_msg <- "monthly data split by quarter" x_mo <- xts(1:12, as.yearmon(2020 + 0:11/12)) nm_mo <- names(split(x_mo, "quarters")) expect_identical(qtr_2020, nm_mo, info = info_msg) # names formatted as yearmon info_msg <- "daily data split by month" x_day <- xts(1:10, .Date(-5:4)) nm_day <- names(split(x_day, "months")) expect_identical(c("Dec 1969", "Jan 1970"), nm_day, info = info_msg) # names formatted as Date info_msg <- "hourly data split by day" x_hr <- .xts(1:10, -5:4 * 3600, tzone = "UTC") nm_hr <- names(split(x_hr, "days")) expect_identical(c("1969-12-31", "1970-01-01"), nm_hr, info = info_msg) info_msg <- "second data split by minute" x_sec <- .xts(1:120, 1:120 - 1, tzone = "UTC") nm_sec <- names(split(x_sec, "minutes")) expect_identical(nm_minutes, nm_sec, info = info_msg) if (.Machine$sizeof.pointer == 8) { # only run on 64-bit systems because this fails on 32-bit systems due to # precision issues # # ?.Machine says: # sizeof.pointer: the number of bytes in a C 'SEXP' type. Will be '4' on # 32-bit builds and '8' on 64-bit builds of R. info_msg <- "microsecond data split by milliseconds" t1 <- as.POSIXct(nm_minutes[1], tz = "UTC") us <- seq(1e-4, 2e-1, 1e-4) x_us <- xts(seq_along(us), t1 + us) nm_ms <- names(split(x_us, "milliseconds")) nm_target <- format(t1 + seq(0, 0.2, 0.001), "%Y-%m-%d %H:%M:%OS3") expect_identical(nm_target, nm_ms, info = info_msg) } # names correct when object TZ vs GMT are on different sides of split breaks (#392) info_msg <- "yearmon: object TZ and GMT are different days" x_tz <- .xts(1:3, c(1632481200, 1633042800, 1635724800), tzone = "Europe/Berlin") expect_identical(names(split(x_tz, "months")), paste(c("Sep", "Oct", "Nov"), "2021"), info = info_msg) info_msg <- "yearqtr: object TZ and GMT are different days" expect_identical(names(split(x_tz, "quarters")), c("2021 Q3", "2021 Q4"), info = info_msg) xts/inst/tinytest/test-align.time.R0000644000176200001440000000462214634167654017103 0ustar liggesusers# make.index.unique info_msg <- "make.index.unique() uses 1 microsecond epsilon by default" x <- .xts(1:5, rep(1e-6, 5)) y <- make.index.unique(x) expect_equivalent(target = cumsum(rep(1e-6, 5)), current = .index(y), info = info_msg) info_msg <- "make.index.unique() warns when index value will be overwritten" x <- .xts(1:5, c(rep(1e-6, 4), 3e-6)) expect_warning(make.index.unique(x, eps = 1e-6), pattern = "index value is unique but will be replaced", info = info_msg) info_msg <- "make.index.unique() returns unique and sorted index" expect_equivalent(target = cumsum(rep(1e-6, 5)), current = .index(y), info = info_msg) info_msg <- "test.make.index.unique_adds_eps_to_duplicates" epsilon <- c(1e-6, 1e-7, 1e-8) for (eps in epsilon) { x <- .xts(1:5, rep(eps, 5)) y <- make.index.unique(x, eps = eps) expect_equivalent(target = .index(y), current = cumsum(rep(eps, 5)), info = info_msg) } info_msg <- "test.make.index.unique_no_warn_if_unique_timestamps_unchanged" x <- .xts(1:10, c(rep(1e-6, 9), 1e-5)) y <- make.index.unique(x, eps = 1e-6) expect_equivalent(target = .index(y), current = cumsum(rep(1e-6, 10)), info = info_msg) # There should be a warning if the cumulative epsilon for a set of duplicate # index values is larger than the first unique index value that follows. # When this happens, we will overwrite that non-duplicate index value with # the prior index value + eps. info_msg <- "test.make.index.unique_warns_if_unique_timestamp_changes" x <- .xts(1:5, c(rep(0, 4), 2e-6)) expect_warning(make.index.unique(x, eps = 1e-6)) # There should be a warning if the cumulative epsilon for a set of duplicate # index values is larger than the first unique index value that follows. # When this happens, we will overwrite that non-duplicate index value with # the prior index value + eps. info_msg <- "test.make.index.unique_warns_ONCE_if_unique_timestamp_changes" x <- .xts(1:5, c(rep(0, 3), 2, 3) * 1e-6) count <- 0L expect_warning(make.index.unique(x, eps = 1e-6)) info_msg <- "test.make.index.unique_converts_date_index_to_POSIXct" # It doesn't make sense to add a small epsilon to a date index. The C code # converts the integer index to a double, but it keeps the same index class. # The index class should be converted to POSIXct. xts/inst/tinytest/test-matrix.R0000644000176200001440000000377514634167654016370 0ustar liggesusersdata(sample_matrix) sample.matrix <- sample_matrix sample.xts <- as.xts(sample.matrix) info_msg <- "test.convert_matrix_to_xts" expect_identical(sample.xts, as.xts(sample.matrix), info = info_msg) info_msg <- "test.convert_matrix_to_xts_j1" expect_identical(sample.xts[, 1], as.xts(sample.matrix)[, 1], info = info_msg) info_msg <- "test.convert_matrix_to_xts_i1" expect_identical(sample.xts[1,], as.xts(sample.matrix)[1,], info = info_msg) info_msg <- "test.convert_matrix_to_xts_i1j1" expect_identical(sample.xts[1, 1], as.xts(sample.matrix)[1, 1], info = info_msg) info_msg <- "test.matrix_reclass" expect_identical(sample.matrix, reclass(try.xts(sample.matrix)), info = info_msg) info_msg <- "test.matrix_reclass_subset_reclass_j1" expect_identical(sample.matrix[, 1], reclass(try.xts(sample.matrix))[, 1], info = info_msg) info_msg <- "test.matrix_reclass_subset_as.xts_j1" expect_identical(sample.matrix[, 1, drop = FALSE], reclass(try.xts(sample.matrix)[, 1]), info = info_msg) expect_identical(sample.matrix[, 1], reclass(try.xts(sample.matrix))[, 1], info = info_msg) info_msg <- "test.matrix_reclass_subset_matrix_j1" expect_identical(sample.matrix[, 1, drop = FALSE], reclass(try.xts(sample.matrix[, 1, drop = FALSE])), info = info_msg) ### zero-width to matrix info_msg <- "test.zero_width_xts_to_matrix" x <- .xts(,1) xm <- as.matrix(x) zm <- as.matrix(as.zoo(x)) expect_identical(xm, zm, info = info_msg) ### dim-less xts to matrix info_msg <- "test.dimless_xts_to_matrix" ix <- structure(1:3, tclass = c("POSIXct", "POSIXt"), tzone = "") x <- structure(1:3, index = ix, class = c("xts", "zoo")) m <- matrix(1:3, 3, 1, dimnames = list(format(.POSIXct(1:3)), "x")) expect_identical(as.matrix(x), m, info = info_msg) xts/inst/tinytest/test-data.frame.R0000644000176200001440000000714714634167654017063 0ustar liggesusersdata(sample_matrix) sample.data.frame <- data.frame(sample_matrix[1:15,]) sample.xts <- as.xts(sample.data.frame) info_msg <- "test.convert_data.frame_to_xts" expect_identical(sample.xts, as.xts(sample.data.frame), info_msg) info_msg <- "test.convert_data.frame_to_xts_j1" expect_identical(sample.xts[,1], as.xts(sample.data.frame)[,1], info_msg) info_msg <- "test.convert_data.frame_to_xts_i1" expect_identical(sample.xts[1,], as.xts(sample.data.frame)[1,], info_msg) info_msg <- "test.convert_data.frame_to_xts_i1j1" expect_identical(sample.xts[1,1], as.xts(sample.data.frame)[1,1], info_msg) info_msg <- "test.data.frame_reclass" expect_identical(sample.data.frame, reclass(try.xts(sample.data.frame)), info_msg) info_msg <- "test.data.frame_reclass_subset_reclass_j1" expect_identical(sample.data.frame[,1], reclass(try.xts(sample.data.frame))[,1], info_msg) # subsetting to 1 col converts to simple numeric - can't successfully handle info_msg <- "test.data.frame_reclass_subset_as.xts_j1" expect_identical(sample.data.frame[,1,drop=FALSE], reclass(try.xts(sample.data.frame)[,1]), info_msg) info_msg <- "test.data.frame_reclass_subset_data.frame_j1" # subsetting results in a vector, so can't be converted to xts expect_error(try.xts(sample.data.frame[,1]), info = info_msg) # check for as.xts.data.frame when order.by is specified info_msg <- "test.convert_data.frame_to_xts_order.by_POSIXlt" orderby = as.POSIXlt(rownames(sample.data.frame)) x <- as.xts(sample.data.frame, order.by = orderby) # tz = "" by default for as.POSIXlt.POSIXct y <- xts(coredata(sample.xts), as.POSIXlt(index(sample.xts))) expect_identical(y, x, info_msg) info_msg <- "test.convert_data.frame_to_xts_order.by_POSIXct" orderby = as.POSIXct(rownames(sample.data.frame)) x <- as.xts(sample.data.frame, order.by = orderby) expect_identical(sample.xts, x, info_msg) info_msg <- "test.convert_data.frame_to_xts_order.by_Date" # tz = "UTC" by default for as.Date.POSIXct (y), but # tz = "" by default for as.Date.character (orderby) orderby = as.Date(rownames(sample.data.frame)) x <- as.xts(sample.data.frame, order.by = orderby) y <- xts(coredata(sample.xts), as.Date(index(sample.xts), tz = "")) expect_identical(y, x, info_msg) ### data.frame with Date/POSIXct column df_date_col <- data.frame(Date = as.Date(rownames(sample.data.frame)), sample.data.frame, row.names = NULL) info_msg <- "convert data.frame to xts from Date column" x <- as.xts(df_date_col) y <- xts(coredata(sample.xts), as.Date(index(sample.xts), tz = "")) expect_equal(y, x, info = info_msg) info_msg <- "convert data.frame to xts from POSIXct column" dttm <- as.POSIXct(rownames(sample.data.frame), tz = "UTC") + runif(15)*10000 df_pxct_col <- data.frame(Timestamp = dttm, sample.data.frame, row.names = NULL) x <- as.xts(df_pxct_col) y <- xts(coredata(sample.xts), dttm) expect_equal(y, x, info = info_msg) info_msg <- "convert data.frame to xts errors when no rownames or column" df_no_col <- data.frame(sample.data.frame, row.names = NULL) expect_error(as.xts(df_no_col), pattern = "could not convert row names to a date-time and could not find a time-based column", info = info_msg) info_msg <- "keep column name for data.frame with one non-time-based column" x <- as.xts(df_date_col[, 1:2]) expect_identical(names(x), "Open", info = info_msg) xts/inst/tinytest/test-coredata.R0000644000176200001440000000350614634167654016636 0ustar liggesusersinfo_msg <- "test.coredata_vector" x <- xts(1, as.Date("2018-03-02")) z <- as.zoo(x) expect_identical(target = coredata(z), current = coredata(x), info = info_msg) info_msg <- "test.coredata_named_vector" x <- xts(c(hello = 1), as.Date("2018-03-02")) z <- as.zoo(x) expect_identical(coredata(z), coredata(x), info = info_msg) info_msg <- "test.coredata_matrix" x <- xts(cbind(1, 9), as.Date("2018-03-02")) z <- as.zoo(x) expect_identical(coredata(z), coredata(x), info = info_msg) info_msg <- "test.coredata_named_matrix" x <- xts(cbind(hello = 1, world = 9), as.Date("2018-03-02")) z <- as.zoo(x) expect_identical(coredata(z), coredata(x), info = info_msg) info_msg <- "test.coredata_data.frame" x <- xts(data.frame(hello = 1, world = 9), as.Date("2018-03-02")) z <- as.zoo(x) expect_identical(coredata(z), coredata(x), info = info_msg) info_msg <- "test.coredata_ts" x <- xts(ts(1), as.Date("2018-03-02")) z <- as.zoo(x) expect_identical(coredata(z), coredata(x), info = info_msg) # empty objects info_msg <- "test.coredata_empty" x <- xts(, as.Date("2018-03-02")) z <- as.zoo(x) expect_identical(coredata(z), coredata(x), info = info_msg) info_msg <- "test.coredata_empty_dim" x <- xts(cbind(1, 9), as.Date("2018-03-02")) z <- as.zoo(x) x0 <- x[0,] z0 <- z[0,] expect_identical(coredata(z0), coredata(x0), info = info_msg) info_msg <- "test.coredata_empty_dim_dimnames" x <- xts(cbind(hello = 1, world = 9), as.Date("2018-03-02")) z <- as.zoo(x) x0 <- x[0,] z0 <- z[0,] expect_identical(coredata(z0), coredata(x0), info = info_msg) xts/inst/tinytest/test-index.R0000644000176200001440000000323114634167654016156 0ustar liggesusersinfo_msg <- "test.get_index_does_not_error_if_index_has_no_attributes" x <- .xts(1:3, 1:3, tzone = "UTC") ix <- index(x) ix <- ix + 3 attr(x, "index") <- 4:6 # get index (test will fail if it errors) expect_warning(index(x), info = info_msg) info_msg <- "test.set_.index_copies_index_attributes" x <- .xts(1:3, 1:3, tzone = "UTC") ix <- index(x) ix <- ix + 3 .index(x) <- 4:6 expect_equal(index(x), ix, info = info_msg) info_msg <- "test.set_index_copies_index_attributes" x <- .xts(1:3, 1:3, tzone = "UTC") ix <- index(x) ix <- ix + 3 index(x) <- .POSIXct(4:6, "UTC") expect_equal(index(x), ix, info = info_msg) # x index must be numeric, because index<-.xts coerces RHS to numeric info_msg <- "test.set_index_restores_tzone_attribute" x <- .xts(1:3, 1:3+0, tzone = "") y <- x # Ops.POSIXt drops tzone attribute when tzone = "" index(y) <- index(y) + 0 expect_identical(x, y, info = info_msg) info_msg <- "test.get_index_zero_length_Date_returns_correct_index_type" xd <- xts(1, .Date(1)) zd <- as.zoo(xd) xd_index <- index(xd[0,]) expect_true(length(xd_index) == 0, info = paste(info_msg, "- length(index) == 0")) expect_equal(index(xd[0,]), index(zd[0,]), info = info_msg) expect_equal(index(xd[0,]), .Date(numeric()), info = info_msg) info_msg <- "test.get_index_zero_length_POSIXct_returns_correct_index_type" xp <- xts(1, .POSIXct(1), tzone = "UTC") zp <- as.zoo(xp) xp_index <- index(xp[0,]) zp_index <- index(zp[0,]) zl_index <- .POSIXct(numeric(), tz = "UTC") expect_true(length(xp_index) == 0, info = paste(info_msg, "- length(index) == 0")) expect_equal(tzone(xp_index), tzone(zp_index), info = info_msg) expect_inherits(xp_index, c("POSIXct", "POSIXt"), info = info_msg) xts/inst/tinytest/test-subset.R0000644000176200001440000003254714634167654016370 0ustar liggesusers### i = missing, j = NA, object has column names ### See #181 info_msg <- "test.i_missing_j_NA_has_colnames" iina <- .xts(matrix(NA_integer_, 5, 2), 1:5) idna <- .xts(matrix(NA_integer_, 5, 2), 1.0 * 1:5) dina <- .xts(matrix(NA_real_, 5, 2), 1:5) ddna <- .xts(matrix(NA_real_, 5, 2), 1.0 * 1:5) colnames(iina) <- colnames(idna) <- colnames(dina) <- colnames(ddna) <- rep(NA_character_, 2) # int data, int index ii <- .xts(matrix(1:10, 5, 2), 1:5) colnames(ii) <- c("a", "b") expect_identical(ii[, NA], iina, info = paste(info_msg, "int data, int index")) expect_identical(ii[, 1][, NA], iina[, 1], info = paste(info_msg, "int data, int index")) # int data, dbl index id <- .xts(matrix(1:10, 5, 2), 1.0 * 1:5) colnames(id) <- c("a", "b") expect_identical(id[, NA], idna, info = paste(info_msg, "int data, dbl index")) expect_identical(id[, 1][, NA], idna[, 1], info = paste(info_msg, "int data, dbl index")) # dbl data, int index di <- .xts(1.0 * matrix(1:10, 5, 2), 1:5) colnames(di) <- c("a", "b") expect_identical(di[, NA], dina, info = paste(info_msg, "dbl data, int index")) expect_identical(di[, 1][, NA], dina[, 1], info = paste(info_msg, "dbl data, int index")) # dbl data, dbl index dd <- .xts(1.0 * matrix(1:10, 5, 2), 1.0 * 1:5) colnames(dd) <- c("a", "b") expect_identical(dd[, NA], ddna, info = paste(info_msg, "dbl data, dbl index")) expect_identical(dd[, 1][, NA], ddna[, 1], info = paste(info_msg, "dbl data, dbl index")) ### i = missing, j = NA, object does not have column names ### See #97 info_msg <- "test.i_missing_j_NA_no_colnames" iina <- .xts(matrix(NA_integer_, 5, 2), 1:5) idna <- .xts(matrix(NA_integer_, 5, 2), 1.0 * 1:5) dina <- .xts(matrix(NA_real_, 5, 2), 1:5) ddna <- .xts(matrix(NA_real_, 5, 2), 1.0 * 1:5) # int data, int index ii <- .xts(matrix(1:10, 5, 2), 1:5) expect_identical(ii[, NA], iina, info = paste(info_msg, "int data, int index")) expect_identical(ii[, 1][, NA], iina[, 1], info = paste(info_msg, "int data, int index")) # int data, dbl index id <- .xts(matrix(1:10, 5, 2), 1.0 * 1:5) expect_identical(id[, NA], idna, info = paste(info_msg, "int data, dbl index")) expect_identical(id[, 1][, NA], idna[, 1], info = paste(info_msg, "int data, dbl index")) # dbl data, int index di <- .xts(1.0 * matrix(1:10, 5, 2), 1:5) expect_identical(di[, NA], dina, info = paste(info_msg, "dbl data, int index")) expect_identical(di[, 1][, NA], dina[, 1], info = paste(info_msg, "dbl data, int index")) # dbl data, dbl index dd <- .xts(1.0 * matrix(1:10, 5, 2), 1.0 * 1:5) expect_identical(dd[, NA], ddna, info = paste(info_msg, "dbl data, dbl index")) expect_identical(dd[, 1][, NA], ddna[, 1], info = paste(info_msg, "dbl data, dbl index")) ### i = integer, j = NA, object has column names ### See #97 info_msg <- "test.i_integer_j_NA_has_colnames" iina <- .xts(matrix(NA_integer_, 5, 2), 1:5) idna <- .xts(matrix(NA_integer_, 5, 2), 1.0 * 1:5) dina <- .xts(matrix(NA_real_, 5, 2), 1:5) ddna <- .xts(matrix(NA_real_, 5, 2), 1.0 * 1:5) colnames(iina) <- colnames(idna) <- colnames(dina) <- colnames(ddna) <- rep(NA_character_, 2) i <- 1:3 # int data, int index ii <- .xts(matrix(1:10, 5, 2), 1:5) colnames(ii) <- c("a", "b") expect_identical(ii[i, NA], iina[i,], info = paste(info_msg, "int data, int index")) expect_identical(ii[i, 1][, NA], iina[i, 1], info = paste(info_msg, "int data, int index")) # int data, dbl index id <- .xts(matrix(1:10, 5, 2), 1.0 * 1:5) colnames(id) <- c("a", "b") expect_identical(id[i, NA], idna[i,], info = paste(info_msg, "int data, dbl index")) expect_identical(id[i, 1][, NA], idna[i, 1], info = paste(info_msg, "int data, dbl index")) # dbl data, int index di <- .xts(1.0 * matrix(1:10, 5, 2), 1:5) colnames(di) <- c("a", "b") expect_identical(di[i, NA], dina[i,], info = paste(info_msg, "dbl data, int index")) expect_identical(di[i, 1][, NA], dina[i, 1], info = paste(info_msg, "dbl data, int index")) # dbl data, dbl index dd <- .xts(1.0 * matrix(1:10, 5, 2), 1.0 * 1:5) colnames(dd) <- c("a", "b") expect_identical(dd[i, NA], ddna[i,], info = paste(info_msg, "dbl data, dbl index")) expect_identical(dd[i, 1][, NA], ddna[i, 1], info = paste(info_msg, "dbl data, dbl index")) ### i = integer, j = NA, object does not have column names ### See #97 info_msg <- "test.i_integer_j_NA_no_colnames" iina <- .xts(matrix(NA_integer_, 5, 2), 1:5) idna <- .xts(matrix(NA_integer_, 5, 2), 1.0 * 1:5) dina <- .xts(matrix(NA_real_, 5, 2), 1:5) ddna <- .xts(matrix(NA_real_, 5, 2), 1.0 * 1:5) i <- 1:3 # int data, int index ii <- .xts(matrix(1:10, 5, 2), 1:5) expect_identical(ii[i, NA], iina[i,], info = paste(info_msg, "int data, int index")) expect_identical(ii[i, 1][, NA], iina[i, 1], info = paste(info_msg, "int data, int index")) # int data, dbl index id <- .xts(matrix(1:10, 5, 2), 1.0 * 1:5) expect_identical(id[i, NA], idna[i,], info = paste(info_msg, "int data, dbl index")) expect_identical(id[i, 1][, NA], idna[i, 1], info = paste(info_msg, "int data, dbl index")) # dbl data, int index di <- .xts(1.0 * matrix(1:10, 5, 2), 1:5) expect_identical(di[i, NA], dina[i,], info = paste(info_msg, "dbl data, int index")) expect_identical(di[i, 1][, NA], dina[i, 1], info = paste(info_msg, "dbl data, int index")) # dbl data, dbl index dd <- .xts(1.0 * matrix(1:10, 5, 2), 1.0 * 1:5) expect_identical(dd[i, NA], ddna[i,], info = paste(info_msg, "dbl data, dbl index")) expect_identical(dd[i, 1][, NA], ddna[i, 1], info = paste(info_msg, "dbl data, dbl index")) info_msg <- "test.i_0" x <- .xts(matrix(1:10, 5, 2), 1:5) z <- as.zoo(x) xz0 <- as.xts(z[0,]) expect_equal(x[0,], xz0, info = info_msg) ### Subset by non-numeric classes X <- xts(1:5, as.Date("2018-04-21") - 5:1) info_msg <- "test.i_character" x <- X for (r in c(1L, 3L, 5L)) { y <- x[r,] i <- as.character(index(y)) expect_identical(y, x[i, ], info = paste(info_msg, "i =", r)) } info_msg <- "test.i_asis_character" x <- X for (r in c(1L, 3L, 5L)) { y <- x[r,] i <- as.character(index(y)) expect_identical(y, x[I(i), ], info = paste(info_msg, "r =", r)) } info_msg <- "test.i_Date" x <- X for (r in c(1L, 3L, 5L)) { y <- x[r,] i <- index(y) expect_identical(y, x[i, ], info = paste(info_msg, "r =", r)) } info_msg <- "test.i_POSIXct" x <- X index(x) <- as.POSIXct(index(x), tz = "UTC") for (r in c(1L, 3L, 5L)) { y <- x[r,] i <- index(y) expect_identical(y, x[i, ], info = paste(info_msg, "r =", r)) } info_msg <- "test.i_POSIXlt" x <- X index(x) <- as.POSIXlt(index(x), tz = "UTC") for (r in c(1L, 3L, 5L)) { y <- x[r,] i <- index(y) expect_identical(y, x[i, ], info = paste(info_msg, "r =", r)) } ### invalid date/time info_msg <- "test.i_invalid_date_string" x <- xts(1:10, as.Date("2015-02-20")+0:9) expect_warning(y <- x["2012-02-30"], pattern = "cannot determine first and last time") expect_identical(y, x[NA,], info = info_msg) info_msg <- "test.i_only_range_separator_or_empty_string" x <- xts(1:10, as.Date("2015-02-20")+0:9) y <- x["/",] expect_identical(y, x, info = paste(info_msg, "sep = '/'")) y <- x["::",] expect_identical(y, x, info = paste(info_msg, "sep = '::'")) y <- x["",] expect_identical(y, x, info = paste(info_msg, "sep = ''")) info_msg <- "test.i_date_range_open_end" x <- xts(1:10, as.Date("2015-02-20")+0:9) y <- x["2015-02-23/",] expect_identical(y, x[4:10,], info = info_msg) info_msg <- "test.i_date_range_open_start" x <- xts(1:10, as.Date("2015-02-20")+0:9) y <- x["/2015-02-26",] expect_identical(y, x[1:7,], info = info_msg) ### subset empty xts info_msg <- "empty xts subset by datetime matches zoo" d0 <- as.Date(integer()) zl <- xts(, d0) empty <- as.xts(as.zoo(zl)[i,]) i <- Sys.Date() expect_identical(zl[i,], empty, info = paste(info_msg, "i = Date, [i,]")) expect_identical(zl[i], empty, info = paste(info_msg, "i = Date, [i]")) i <- Sys.time() expect_identical(zl[i,], empty, info = paste(info_msg, "i = POSIXct, [i,]")) expect_identical(zl[i], empty, info = paste(info_msg, "i = POSIXct, [i]")) info_msg <- "empty xts subset by 0 matches zoo" d0 <- as.Date(integer()) zl <- xts(, d0) empty <- as.xts(as.zoo(zl)[0,]) expect_identical(zl[0,], empty, info = paste(info_msg, "[i,]")) expect_identical(zl[0], empty, info = paste(info_msg, "[i]")) info_msg <- "empty xts subset by -1 matches zoo" d0 <- as.Date(integer()) zl <- xts(, d0) empty <- as.xts(as.zoo(zl)[i,]) expect_identical(zl[-1,], empty, info = paste(info_msg, "[-1,]")) expect_identical(zl[-1], empty, info = paste(info_msg, "[-1]")) info_msg <- "empty xts subset by NA matches zoo" d0 <- as.Date(integer()) zl <- xts(, d0) empty <- as.xts(as.zoo(zl)[i,]) expect_identical(zl[NA,], empty, info = paste(info_msg, "[NA,]")) expect_identical(zl[NA], empty, info = paste(info_msg, "[NA]")) info_msg <- "empty xts subset by NULL matches zoo" d0 <- as.Date(integer()) zl <- xts(, d0) empty <- as.xts(as.zoo(zl)[i,]) expect_identical(zl[NULL,], empty, info = paste(info_msg, "[NULL,]")) expect_identical(zl[NULL], empty, info = paste(info_msg, "[NULL]")) info_msg <- "test.duplicate_index_duplicate_i" dates <- structure(c(15770, 16257, 16282, 16291, 16296, 16296, 16298, 16301, 16432, 16452), class = "Date") x <- xts(c(1, 2, 2, 3, 3, 3, 3, 3, 4, 4), dates) dupdates <- structure(c(15770, 16257, 16282, 16291, 16296, 16296, 16296, 16296, 16298, 16301, 16432, 16452), class = "Date") y <- xts(c(1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4), dupdates) expect_identical(x[index(x),], y, info = info_msg) ### Test dispatch to zoo for yearmon, yearqtr tclass info_msg <- "test.window_yearmon_yearqtr_tclass_dispatches_to_zoo" i1 <- seq(as.yearmon(2007), by = 1/12, length.out = 36) x1 <- xts(1:36, i1) i2 <- seq(as.yearqtr(2007), by = 1/4, length.out = 36) x2 <- xts(1:36, i2) r1 <- x1["2015"] r2 <- x2["2015"] ########## results are empty objects ########## ### zoo supports numeric start for yearmon and yearqtr w1 <- window(x1, start = 2015.01) # to window.zoo() w2 <- window(x2, start = 2015.1) # to window.zoo() expect_equal(r1, w1, info = paste(info_msg, "window, yearmon, numeric start, empty range")) expect_equal(r2, w2, info = paste(info_msg, "window, yearqtr, numeric start, empty range")) w1 <- window(x1, start = "2015-01-01") # to window.xts() w2 <- window(x2, start = "2015Q1") # to window.zoo() expect_equal(r1, w1, info = paste(info_msg, "window, yearmon, character start, empty range")) expect_equal(r2, w2, info = paste(info_msg, "window, yearqtr, character start, empty range")) w1 <- window(x1, start = "2015-01-01", end = NA) # to window.xts() expect_equal(r1, w1, info = paste(info_msg, "window, yearmon, character start with end = NA, empty range")) ########## results are *not* empty objects ########## r1 <- x1["2011/"] r2 <- x2["2011/"] w1 <- window(x1, start = 2011.01) # to window.zoo() w2 <- window(x2, start = 2011.1) # to window.zoo() expect_equal(r1, w1, info = paste(info_msg, "window, yearmon, numeric start")) expect_equal(r2, w2, info = paste(info_msg, "window, yearqtr, numeric start")) w1 <- window(x1, start = "2011-01-01") # to window.xts() w2 <- window(x2, start = "2011Q1") # to window.zoo() expect_equal(r1, w1, info = paste(info_msg, "window, yearmon, character start")) expect_equal(r2, w2, info = paste(info_msg, "window, yearqtr, character start")) w1 <- window(x1, start = "2011-01-01", end = NA) # to window.xts() expect_equal(r1, w1, info = paste(info_msg, "window, yearmon, character start with end = NA")) info_msg <- "test.zero_width_subset_does_not_drop_class" target <- c("custom", "xts", "zoo") x <- .xts(1:10, 1:10, class = target) y <- x[,0] expect_equal(target, class(y), info = info_msg) info_msg <- "test.zero_width_subset_does_not_drop_user_attributes" x <- .xts(1:10, 1:10, my_attr = "hello") y <- x[,0] expect_equal("hello", attr(y, "my_attr"), info = info_msg) info_msg <- "test.zero_length_subset_xts_returns_same_tclass" x <- .xts(matrix(1)[0,], integer(0), "Date") expect_equal(tclass(x[0,]), "Date") x <- .xts(matrix(1)[0,], integer(0), "POSIXct", "America/Chicago") expect_equal(tclass(x[0,]), "POSIXct") expect_equal(tzone(x[0,]), "America/Chicago") info_msg <- "test.zero_length_subset_returns_same_storage_mode" tf <- c(TRUE, FALSE) # integer sm <- "integer" x <- .xts(matrix(integer(0), 0), integer(0)) expect_equal(storage.mode(x[0, ]), sm, info = paste(info_msg, ": x[0,]")) expect_equal(storage.mode(x[0, 0]), sm, info = paste(info_msg, ": x[0, 0")) expect_equal(storage.mode(x[0, FALSE]), sm, info = paste(info_msg, ": x[0, FALSE]")) x <- .xts(matrix(integer(0), 0, 2), integer(0)) expect_equal(storage.mode(x[0,]), sm, info = paste(info_msg, ": x[0,]")) expect_equal(storage.mode(x[0, 1]), sm, info = paste(info_msg, ": x[0, 1]")) expect_equal(storage.mode(x[0, tf]), sm, nfo = paste(info_msg, ": x[0, c(TRUE, FALSE)]")) # double sm <- "double" x <- .xts(matrix(numeric(0), 0), integer(0)) expect_equal(storage.mode(x[0, ]), sm, info = paste(info_msg, ": x[0,]")) expect_equal(storage.mode(x[0, 0]), sm, info = paste(info_msg, ": x[0, 0]")) expect_equal(storage.mode(x[0, FALSE]), sm, info = paste(info_msg, ": x[0, FALSE]")) x <- .xts(matrix(numeric(0), 0, 2), integer(0)) expect_equal(storage.mode(x[0,]), sm, info = paste(info_msg, ": x[0,]")) expect_equal(storage.mode(x[0, 1]), sm, info = paste(info_msg, ": x[0, 1]")) expect_equal(storage.mode(x[0, tf]), sm, info = paste(info_msg, ": x[0, c(TRUE, FALSE)]")) # non-integer subset x <- .xts(matrix(1:20, 10, 2), 1:10) # subset by non-integer-like 'i' warns expect_warning(x[-1.5, ]) expect_warning(x[ 0.5, ]) expect_warning(x[ 1.5, ]) # subset by non-integer-like 'j' warns expect_warning(x[, -1.5]) expect_warning(x[, 0.5]) expect_warning(x[, 1.5]) xts/inst/tinytest/test-lag.R0000644000176200001440000000245314634167654015617 0ustar liggesusersLAG <- function(x, k=1, na.pad=TRUE) { z <- lag(as.zoo(x), -k, na.pad) dimnames(z) <- NULL as.xts(z) } ### POSIXct index info_msg <- "test.lag_integer_POSIXt" x <- .xts(1:5, 1:5 + 0.0) expect_identical(lag(x), LAG(x), info = info_msg) info_msg <- "test.lag_numeric_POSIXt" x <- .xts(1:5 + 1.0, 1:5 + 0.0) expect_identical(lag(x), LAG(x), info = info_msg) info_msg <- "test.lag_logical_POSIXt" x <- .xts(1:5 > 2, 1:5 + 0.0) expect_identical(lag(x), LAG(x), info = info_msg) ### Date index info_msg <- "test.lag_integer_Date" x <- xts(1:5, as.Date("2016-01-01") - 5:1) expect_identical(lag(x), LAG(x), info = info_msg) info_msg <- "test.lag_numeric_Date" x <- xts(1:5 + 1.0, as.Date("2016-01-01") - 5:1) expect_identical(lag(x), LAG(x), info = info_msg) info_msg <- "test.lag_logical_Date" x <- xts(1:5 > 2, as.Date("2016-01-01") - 5:1) expect_identical(lag(x), LAG(x), info = info_msg) ### Type-check failure errors info_msg <- "test.lag_k_NA" x <- .xts(1:5, 1:5) expect_error(suppressWarnings(lag(x, "a")), # NA introduced by coercion "'k' must be integer", info = info_msg) info_msg <- "test.lag_k_zero_length" x <- .xts(1:5, 1:5) expect_error(suppressWarnings(lag(x, 1L, "a")), # NA introduced by coercion "'na.pad' must be logical", info = info_msg) xts/inst/tinytest/test-reclass.R0000644000176200001440000000372414703320641016472 0ustar liggesusers# ensure reclass() preserves index attributes from 'match.to' info_msg <- "test.reclass_preserves_match.to_tclass" x <- .xts(1:3, 1:3, tclass = "Date") y <- reclass(1:3, match.to = x) expect_identical(tclass(y), "Date", info = info_msg) info_msg <- "test.reclass_preserves_match.to_tzone" tz <- "Atlantic/Reykjavik" x <- .xts(1:3, 1:3, tzone = tz) y <- reclass(1:3, match.to = x) expect_identical(tzone(y), tz, info = info_msg) info_msg <- "test.reclass_preserves_match.to_tformat" tf <- "%m/%d/%Y %H:%M" x <- .xts(1:3, 1:3, tformat = tf) y <- reclass(1:3, match.to = x) expect_identical(tformat(y), tf, info = info_msg) info_msg <- "test.reclass_preserves_match.to_xtsAttributes" xts_attr <- list("hello" = "world") x <- .xts(1:3, 1:3) xtsAttributes(x) <- xts_attr z <- reclass(1:3, match.to = x) expect_equal(xts_attr, xtsAttributes(z), info = info_msg) # ensure reclass(xts_object, ...) preserves match.to attributes info_msg <- "test.reclass_xts_object_preserves_match.to_tclass" x <- y <- xts(1:3, .Date(1:3)) tclass(x) <- c("POSIXct", "POSIXt") z <- reclass(x, y) expect_identical(tclass(y), tclass(z), info = info_msg) info_msg <- "test.reclass_xts_object_preserves_match.to_tzone" x <- y <- xts(1:3, .Date(1:3)) tz <- "Atlantic/Reykjavik" tzone(x) <- tz z <- reclass(x, y) expect_identical("UTC", tzone(z), info = info_msg) info_msg <- "test.reclass_xts_object_preserves_match.to_tformat" tf <- "%m/%d/%Y" x <- y <- xts(1:3, .Date(1:3), tformat = tf) tformat(x) <- "%Y-%m-%d" z <- reclass(x, y) expect_identical(tf, tformat(z), info = info_msg) info_msg <- "test.reclass_xts_object_preserves_match.to_xtsAttributes" x <- y <- xts(1:3, .Date(1:3)) xts_attr <- list("hello" = "world") xtsAttributes(y) <- xts_attr z <- reclass(x, y) expect_equal(xts_attr, xtsAttributes(z), info = info_msg) # ensure calls to tryXts() C function work x <- xts(1:3, .Date(1:3)) z <- .Call(xts:::C_tryXts, as.zoo(x)) y <- try.xts(as.zoo(x)) expect_identical(y, z, info = "calls to C_tryXts() call try.xts()") xts/inst/tinytest/test-subset-time-of-day.R0000644000176200001440000001015414634167654020467 0ustar liggesusers# Time-of-day subset tests info_msg <- "test.time_of_day_start_equals_end" i <- 0:47 x <- .xts(i, i * 3600, tzone = "UTC") i1 <- .index(x[c(2L, 26L)]) expect_identical(.index(x["T01:00/T01:00"]), i1, info = info_msg) info_msg <- "test.time_of_day_when_DST_starts" # 2017-03-12: no 0200 tz <- "America/Chicago" tmseq <- seq(as.POSIXct("2017-03-11", tz), as.POSIXct("2017-03-14", tz), by = "1 hour") x <- xts(seq_along(tmseq), tmseq) i <- structure(c(1489215600, 1489219200, 1489222800, 1489302000, 1489305600, 1489384800, 1489388400, 1489392000), tzone = "America/Chicago", tclass = c("POSIXct", "POSIXt")) expect_identical(.index(x["T01:00:00/T03:00:00"]), i, info = info_msg) info_msg <- "test.time_of_day_when_DST_ends" # 2017-11-05: 0200 occurs twice tz <- "America/Chicago" tmseq <- seq(as.POSIXct("2017-11-04", tz), as.POSIXct("2017-11-07", tz), by = "1 hour") x <- xts(seq_along(tmseq), tmseq) i <- structure(c(1509775200, 1509778800, 1509782400, 1509861600, 1509865200, 1509868800, 1509872400, 1509951600, 1509955200, 1509958800), tzone = "America/Chicago", tclass = c("POSIXct", "POSIXt")) expect_identical(.index(x["T01:00:00/T03:00:00"]), i, info = info_msg) info_msg <- "test.time_of_day_by_hour_start_equals_end" i <- 0:94 x <- .xts(i, i * 1800, tzone = "UTC") i1 <- .index(x[c(3, 4, 51, 52)]) expect_identical(.index(x["T01/T01"]), i1, info = info_msg) expect_identical(.index(x["T1/T1"]), i1, info = info_msg) info_msg <- "test.time_of_day_by_minute" i <- 0:189 x <- .xts(i, i * 900, tzone = "UTC") i1 <- .index(x[c(5:8, 101:104)]) expect_identical(.index(x["T01:00/T01:45"]), i1, info = info_msg) expect_identical(.index(x["T01/T01:45"]), i1, info = info_msg) info_msg <- "test.time_of_day_check_time_string" i <- 0:10 x <- .xts(i, i * 1800, tzone = "UTC") # Should work with and without colon separator expect_identical(x["T0100/T0115"], x["T01:00/T01:15"], info = info_msg) info_msg <- "test.time_of_day_by_second" i <- 0:500 x <- .xts(c(i, i), c(i * 15, 86400 + i * 15), tzone = "UTC") i1 <- .index(x[c(474L, 475L, 476L, 477L, 478L, 479L, 480L, 481L, 482L, 483L, 484L, 485L, 975L, 976L, 977L, 978L, 979L, 980L, 981L, 982L, 983L, 984L, 985L, 986L)]) expect_identical(.index(x["T01:58:05/T02:01:09"]), i1, info = info_msg) # Can only omit 0 padding for hours. Only for convenience because it does # not conform to the ISO 8601 standard, which requires padding with zeros. expect_identical(.index(x["T1:58:05/T2:01:09"]), i1, info = info_msg) expect_identical(.index(x["T1:58:05.000/T2:01:09.000"]), i1, info = info_msg) info_msg <- "test.time_of_day_end_before_start" # Yes, this actually makes sense and is useful for financial markets # E.g. some futures markets open at 18:00 and close at 16:00 the next day i <- 0:47 x <- .xts(i, i * 3600, tzone = "UTC") i1 <- .index(x[-c(18L, 42L)]) expect_identical(.index(x["T18:00/T16:00"]), i1, info = info_msg) # TODO: Add tests for possible edge cases and/or errors # end time before start time # start time and/or end time missing "T" prefix info_msg <- "test.time_of_day_on_zero_width" # return relevant times and a column of NA; consistent with zoo i <- 0:47 tz <- "America/Chicago" x <- .xts(, i * 3600, tzone = tz) y <- x["T18:00/T20:00"] expect_identical(y, .xts(rep(NA, 6), c(0:2, 24:26)*3600, tzone = tz), info = info_msg) info_msg <- "test.time_of_day_zero_padding" i <- 0:189 x <- .xts(i, i * 900, tzone = "UTC") i1 <- .index(x[c(5:8, 101:104)]) expect_identical(.index(x["T01:00/T01:45"]), i1, info = info_msg) # we support un-padded hours, for convenience (it's not in the standard) expect_identical(.index(x["T1/T1:45"]), i1, info = info_msg) # minutes and seconds must be zero-padded expect_error(x["T01:5:5/T01:45"], info = info_msg) expect_error(x["T01:05:5/T01:45"], info = info_msg) info_msg <- "test.open_ended_time_of_day" ix <- seq(.POSIXct(0), .POSIXct(86400 * 5), by = "sec") ix <- ix + runif(length(ix)) x <- xts::xts(seq_along(ix), ix) expect_true(all(xts::.indexhour(x["T1800/"]) > 17), info = paste(info_msg, "right open")) expect_true(all(xts::.indexhour(x["/T0500"]) < 6), info = paste(info_msg, "left open")) xts/inst/tinytest/test-na.omit.R0000644000176200001440000000211214634167654016411 0ustar liggesusersxdata <- .xts(c(1, NA, 3, 4, 5, 6), c(0, 4, 10, 19, 24, 29)) xindex <- .xts(rep(0, 5), c(5, 10, 20, 25, 28)) types <- c("double", "integer", "character", "logical") info_msg <- "test.naomit" for (type in types) { xdat <- xdata xidx <- xindex storage.mode(xdat) <- storage.mode(xidx) <- type zdat <- as.zoo(xdat) zidx <- as.zoo(xidx) x <- na.omit(xdat) z <- na.omit(zdat) # na.omit.xts adds "index" attribute to the "na.action" attribute attr(attr(x, "na.action"), "index") <- NULL #expect_identical(x, as.xts(z)) # FALSE (attribute order differs) expect_equal(x, as.xts(z), info = paste(info_msg, "-", type)) } info_msg <- "test.naomit_by_column" for (type in types) { xdat <- xdata xidx <- xindex storage.mode(xdat) <- storage.mode(xidx) <- type zdat <- as.zoo(xdat) zidx <- as.zoo(xidx) x <- na.omit(merge(one = xdat, two = xdat)) z <- na.omit(merge(one = zdat, two = zdat)) # na.omit.xts adds "index" attribute to the "na.action" attribute attr(attr(x, "na.action"), "index") <- NULL expect_equal(x, as.xts(z), info = paste(info_msg, "-", type)) } xts/inst/tinytest/test-diff.R0000644000176200001440000000356014634167654015764 0ustar liggesusers# POSIXct index info_msg <- "test.diff_integer_POSIXt" x <- .xts(1:5, 1:5 + 0.0) dx <- xts(rbind(NA_integer_, diff(coredata(x))), index(x)) expect_identical(diff(x), dx, info_msg) info_msg <- "test.diff_numeric_POSIXt" x <- .xts(1:5 + 1.0, 1:5 + 0.0) dx <- xts(rbind(NA_real_, diff(coredata(x))), index(x)) expect_identical(diff(x), dx, info_msg) info_msg <- "test.diff_logical_POSIXt" x <- .xts(1:5 > 2, 1:5 + 0.0) dx <- xts(rbind(NA, diff(coredata(x))), index(x)) expect_identical(diff(x), dx, info_msg) # Date index info_msg <- "test.diff_integer_Date" x <- xts(1:5, as.Date("2016-01-01") - 5:1) dx <- xts(rbind(NA_integer_, diff(coredata(x))), index(x)) expect_identical(diff(x), dx, info_msg) info_msg <- "test.diff_numeric_Date" x <- xts(1:5 + 1.0, as.Date("2016-01-01") - 5:1) dx <- xts(rbind(NA_real_, diff(coredata(x))), index(x)) expect_identical(diff(x), dx, info_msg) info_msg <- "test.diff_logical_Date" x <- xts(1:5 > 2, as.Date("2016-01-01") - 5:1) dx <- xts(rbind(NA, diff(coredata(x))), index(x)) expect_identical(diff(x), dx, info_msg) # Type-check failure errors info_msg <- "diff.xts() 'differences' argument must be integer" x <- .xts(1:5, 1:5) # (ignore NA introduced by coercion) expect_error(suppressWarnings(diff(x, 1L, "a")), info = info_msg) info_msg <- "diff.xts() 'lag' argument must be integer" x <- .xts(1:5, 1:5) # (ignore NA introduced by coercion) expect_error(suppressWarnings(diff(x, "a", 1L)), info = info_msg) info_msg <- "diff.xts() differences argument must be > 0" expect_error(diff(.xts(1:5, 1:5), 1L, -1L), info = info_msg) info_msg <- "diff.xts() lag argument must be > 0" expect_error(diff(.xts(1:5, 1:5), -1L, 1L), info = info_msg) info_msg <- "test.diff_logical_preserves_colnames" cnames <- c("a", "b") x <- .xts(matrix(rnorm(10) > 0, 5), 1:5, dimnames = list(NULL, cnames)) y <- diff(x) expect_identical(colnames(y), cnames, info = info_msg) xts/inst/benchmarks/0000755000176200001440000000000014634167654014202 5ustar liggesusersxts/inst/benchmarks/benchmark.subset.R0000644000176200001440000000256714634167654017575 0ustar liggesusersstopifnot(require("xts")) stopifnot(require("microbenchmark")) # Benchmark [.xts using ISO8601 range on large objects N <- 2e7 s <- 86400*365.25 x <- .xts(1:N, 1.0*seq(s*20, s*40, length.out = N), tzone = "UTC") # warmup, in case there's any JIT for (i in 1:2) { x["1999/2001",] } profile <- FALSE if (profile) { # Use loop if profiling, so microbenchmark calls aren't included Rprof(line.profiling = TRUE) for(i in 1:10) { x[rng,] } Rprof(NULL) print(srp <- summaryRprof()) } else { cat("Subset using ISO-8601 range\n") microbenchmark(x["1990",], x["1990/",], x["/2009",], x["1990/1994",], x["1990/1999",], x["1990/2009",], times = 5) } cat("Subset using integer vector\n") i001 <- seq(1, N, 1) i005 <- seq(1, N, 5) i010 <- seq(1, N, 10) i050 <- seq(1, N, 50) i100 <- seq(1, N, 100) microbenchmark(x[i001,], x[i005,], x[i010,], x[i050,], x[i100,], times = 5) cat("Subset using logical vector\n") l001 <- l005 <- l010 <- l050 <- l100 <- logical(N) l001[i001] <- TRUE l005[i005] <- TRUE l010[i010] <- TRUE l050[i050] <- TRUE l100[i100] <- TRUE microbenchmark(x[l001,], x[l005,], x[l010,], x[l050,], x[l100,], times = 5) cat("Subset using date-time vector\n") t001 <- index(x)[i001] t005 <- index(x)[i005] t010 <- index(x)[i010] t050 <- index(x)[i050] t100 <- index(x)[i100] microbenchmark(x[t001,], x[t005,], x[t010,], x[t050,], x[t100,], times = 5) xts/inst/api_example/0000755000176200001440000000000014634166522014342 5ustar liggesusersxts/inst/api_example/README0000644000176200001440000000102514634166522015220 0ustar liggesusersThis directory contains a skeleton example of how to link to the C-API The basic requirements to use the exported xts C code is: (1) Add to your DESCRIPTION file: Depends: xts linkingTo: xts (2) In your .c files: #include "xtsAPI.h" This header file exports the functions that are public in xts. (3) Compile as you would with any other package: R CMD build api_example R CMD INSTALL linkXTS_1.0.tar.gz (4) Try it out! R> require(linkXTS) R> checkOrder(1:10) [1] TRUE R> checkOrder(c(1:10,1)) [1] FALSE xts/inst/api_example/R/0000755000176200001440000000000014522244665014544 5ustar liggesusersxts/inst/api_example/R/checkOrder.R0000644000176200001440000000015514522244665016741 0ustar liggesusers# R function to call your compiled code checkOrder <- function(x) { .Call('check_order', x, TRUE, TRUE) } xts/inst/api_example/src/0000755000176200001440000000000014634166522015131 5ustar liggesusersxts/inst/api_example/src/checkOrder.c0000644000176200001440000000125314634166522017347 0ustar liggesusers/* Example of using the C API from xts in new package code This is derived from examining the source of packages Matrix and lme4. */ #include #include #include #include /* required by R */ /* The following header file is from the include directory that is included with xts */ #include "xtsAPI.h" /* function declaration and macros */ SEXP check_order (SEXP x, SEXP incr, SEXP strict) { SEXP ret; PROTECT(ret = allocVector(LGLSXP, 1)); /* do_is_ordered is imported from the xts package. All that is needed here is to call it. */ ret = xtsIsOrdered(x, incr, strict); UNPROTECT(1); return ret; } xts/inst/api_example/NAMESPACE0000644000176200001440000000006514522244665015563 0ustar liggesusersimport("xts") useDynLib(linkXTS) export(checkOrder) xts/inst/api_example/man/0000755000176200001440000000000014634166522015115 5ustar liggesusersxts/inst/api_example/man/checkOrder.Rd0000644000176200001440000000214114634166522017453 0ustar liggesusers\name{checkOrder} \alias{checkOrder} %- Also NEED an '\alias' for EACH other topic documented here. \title{ ~~function to do ... ~~ } \description{ ~~ A concise (1-5 lines) description of what the function does. ~~ } \usage{ checkOrder(x) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ ~~Describe \code{x} here~~ } } \details{ ~~ If necessary, more details than the description above ~~ } \value{ ~Describe the value returned If it is a LIST, use \item{comp1 }{Description of 'comp1'} \item{comp2 }{Description of 'comp2'} ... } \references{ ~put references to the literature/web site here ~ } \author{ ~~who you are~~ } \note{ ~~further notes~~ ~Make other sections ~ } \seealso{ ~~objects to See Also as \code{\link{help}}, ~~~ } \examples{ ##---- Should be DIRECTLY executable !! ---- ##-- ==> Define data, use random, ##-- or do help(data=index) for the standard data sets. ## The function is currently defined as function(x) { .Call('xtsIs', x) } } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ misc } xts/inst/api_example/man/linkXTS-package.Rd0000644000176200001440000000204714634166522020334 0ustar liggesusers\name{linkXTS-package} \alias{linkXTS-package} \alias{linkXTS} \docType{package} \title{ What the package does (short line) ~~ package title ~~ } \description{ More about what it does (maybe more than one line) ~~ A concise (1-5 lines) description of the package ~~ } \details{ \tabular{ll}{ Package: \tab linkXTS\cr Type: \tab Package\cr Version: \tab 1.0\cr Date: \tab 2008-11-12\cr License: \tab What license is it under?\cr LazyLoad: \tab yes\cr } ~~ An overview of how to use the package, including the most important ~~ ~~ functions ~~ } \author{ Who wrote it Maintainer: Who to complain to ~~ The author and/or maintainer of the package ~~ } \references{ ~~ Literature or other references for background information ~~ ~~ Optionally other standard keywords, one per line, from file KEYWORDS in ~~ ~~ the R documentation directory ~~ } \keyword{ package } \seealso{ ~~ Optional links to other man pages, e.g. ~~ ~~ \code{\link[:-package]{}} ~~ } \examples{ #~~ simple examples of the most important functions ~~ } xts/inst/api_example/DESCRIPTION0000644000176200001440000000044314634166522016051 0ustar liggesusersPackage: linkXTS Type: Package Title: Tests the interface to xts.so Version: 1.0 Date: 2008-11-12 Depends: xts LinkingTo: xts Author: Jeffrey A. Ryan Maintainer: Jeffrey A. Ryan Description: Demonstrates LinkingTo C code in packages License: GPL (>= 2) LazyLoad: yes xts/README.md0000644000176200001440000001525114654242576012372 0ustar liggesusers### About xts is an [R](https://www.r-project.org) package that provides an extension of the [zoo](https://CRAN.R-project.org/package=zoo) class. zoo's strength comes from its simplicity of use (it's very similar to base R functions), and its overall flexibility (you can use *anything* as an index). The xts extension was motivated by the ability to improve performance by imposing reasonable constraints, while providing a truly time-based structure. ### xts for enterprise Available as part of the Tidelift Subscription. The maintainers of `xts` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/?utm_source=cran-xts&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) ### Supporting xts development If you are interested in supporting the ongoing development and maintenance of xts, please consider [becoming a sponsor](https://github.com/sponsors/joshuaulrich). ### Installation The current release is available on [CRAN](https://CRAN.R-project.org/package=xts), which you can install via: ```r install.packages("xts") ``` To install the development version, you need to clone the repository and build from source, or run one of: ```r # lightweight remotes::install_github("joshuaulrich/xts") # or devtools::install_github("joshuaulrich/xts") ``` You will need tools to compile C, C++, and Fortran code. See the relevant appendix in the [R Installation and Administration manual](https://cran.r-project.org/doc/manuals/r-release/R-admin.html) for your operating system: - [Windows](https://cran.r-project.org/doc/manuals/r-release/R-admin.html#The-Windows-toolset) - [MacOS](https://cran.r-project.org/doc/manuals/r-release/R-admin.html#macOS) (the [R for Mac OS X Developer's Page](https://mac.r-project.org/) might also be helpful) - [Unix-alike](https://cran.r-project.org/doc/manuals/r-release/R-admin.html#Essential-and-useful-other-programs-under-a-Unix_002dalike) ### Getting Started You can create xts objects using `xts()` and `as.xts()`. Note that `as.xts()` currently expects the date/times to be in the row names for matrix and data.frame objects, or in the names for vector. You can also use the `dateFormat` argument to control whether the names should be converted to `Date` or `POSIXct`. See `help(as.xts.methods)` for details. ```r n <- 10 series <- rnorm(n) # POSIXct (date/time) index datetimes <- seq(as.POSIXct("2017-03-27"), length.out = n, by = "days") library(xts) x <- xts(series, datetimes) ``` In addition to the usual ways you can subset matrix and zoo objects, you can also subset xts objects using character strings that adhere to the [ISO-8601 standard](https://en.wikipedia.org/wiki/ISO_8601), which is the internationally recognized and accepted way to represent dates and times. Using the data from the prior code block, here are some examples: ```r # March, 2017 x["2017-03"] # [,1] # 2017-03-27 0.25155453 # 2017-03-28 -0.09379529 # 2017-03-29 0.44600926 # 2017-03-30 0.18095782 # 2017-03-31 -1.45539421 # March 30th through April 2nd x["2017-03-30/2017-04-02"] # [,1] # 2017-03-30 0.1809578 # 2017-03-31 -1.4553942 # 2017-04-01 -0.4012951 # 2017-04-02 -0.5331497 # Beginning of the series to April 1st x["/2017-04-01"] # [,1] # 2017-03-27 0.25155453 # 2017-03-28 -0.09379529 # 2017-03-29 0.44600926 # 2017-03-30 0.18095782 # 2017-03-31 -1.45539421 # 2017-04-01 -0.40129513 ``` You can aggregate a univariate series, or open-high-low-close (OHLC) data, into a lower frequency OHLC series with the `to.period()` function. There are also convenience functions for some frequencies (e.g. `to.minutes()`, `to.daily()`, `to.yearly()`, etc). ```r data(sample_matrix) x <- as.xts(sample_matrix) to.period(x, "months") # x.Open x.High x.Low x.Close # 2007-01-31 50.03978 50.77336 49.76308 50.22578 # 2007-02-28 50.22448 51.32342 50.19101 50.77091 # 2007-03-31 50.81620 50.81620 48.23648 48.97490 # 2007-04-30 48.94407 50.33781 48.80962 49.33974 # 2007-05-31 49.34572 49.69097 47.51796 47.73780 # 2007-06-30 47.74432 47.94127 47.09144 47.76719 to.monthly(x) # result has a 'yearmon' index # x.Open x.High x.Low x.Close # Jan 2007 50.03978 50.77336 49.76308 50.22578 # Feb 2007 50.22448 51.32342 50.19101 50.77091 # Mar 2007 50.81620 50.81620 48.23648 48.97490 # Apr 2007 48.94407 50.33781 48.80962 49.33974 # May 2007 49.34572 49.69097 47.51796 47.73780 # Jun 2007 47.74432 47.94127 47.09144 47.76719 ``` The `period.apply()` function allows you apply a custom function to non- overlapping intervals. You specify the intervals using a vector similar to the output of `endpoints()`. Like `to.period()` there are convenience functions, like `apply.daily()`, `apply.quarterly()`, etc. ```r # Average monthly value for each column period.apply(x, endpoints(x, "months"), colMeans) # Open High Low Close # 2007-01-31 50.21140 50.31528 50.12072 50.22791 # 2007-02-28 50.78427 50.88091 50.69639 50.79533 # 2007-03-31 49.53185 49.61232 49.40435 49.48246 # 2007-04-30 49.62687 49.71287 49.53189 49.62978 # 2007-05-31 48.31942 48.41694 48.18960 48.26699 # 2007-06-30 47.47717 47.57592 47.38255 47.46899 # Open High Low Close # 2007-01-31 50.21140 50.31528 50.12072 50.22791 # 2007-02-28 50.78427 50.88091 50.69639 50.79533 # 2007-03-31 49.53185 49.61232 49.40435 49.48246 # 2007-04-30 49.62687 49.71287 49.53189 49.62978 # 2007-05-31 48.31942 48.41694 48.18960 48.26699 # 2007-06-30 47.47717 47.57592 47.38255 47.46899 ``` ###### Have a question? Ask your question on [Stack Overflow](https://stackoverflow.com/questions/tagged/r) or the [R-SIG-Finance](https://stat.ethz.ch/mailman/listinfo/r-sig-finance) mailing list (you must subscribe to post). ###### Want hands-on experience? - [DataCamp course on importing and managing financial data](https://www.datacamp.com/courses/importing-and-managing-financial-data-in-r) - [DataCamp course on manipulating time series with xts & zoo](https://www.datacamp.com/courses/manipulating-time-series-data-in-r) ### Contributing Please see the [Contributing Guide](https://github.com/joshuaulrich/xts/wiki/Contributing-Guide). ### See Also - [quantmod](https://CRAN.R-project.org/package=quantmod): quantitative financial modeling framework - [TTR](https://CRAN.R-project.org/package=TTR): functions for technical trading rules - [zoo](https://CRAN.R-project.org/package=zoo): class for regular and irregular time series ### Author Jeffrey Ryan, [Joshua Ulrich](https://about.me/joshuaulrich) xts/build/0000755000176200001440000000000014703504524012173 5ustar liggesusersxts/build/vignette.rds0000644000176200001440000000035214703504524014532 0ustar liggesusers‹uŽ»‚@E——ŠÆÄÄÒf@>ÀÎDil|¶« É&¼dI@+¿`ÅÄbgæÜ½“¹—1!D'¦©ÝÀјcà›µ:±±OŠL,}vwŽQ.¥!J öµLÝõAâqE·E‘à×虇@Orÿn$žÿ}£Æ¾ÓîÒHÁj²à0o\­[“ŸÆ3Ž¥D~,äÓMýkÅŠXØåHÑtyÊpæYÆ~ãÊQS‰†H ò„ÄÑyœ"÷Ùiœ;êØ´NöÂRUUù›è0¡)q챌9~ŠûH廟xðÊxts/man/0000755000176200001440000000000014702262124011643 5ustar liggesusersxts/man/tclass.Rd0000644000176200001440000000556514702273776013455 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tclass.R \name{tclass} \alias{tclass} \alias{tclass.default} \alias{tclass.xts} \alias{tclass<-} \alias{tclass<-.default} \alias{indexClass} \alias{indexClass<-} \alias{tclass<-.xts} \title{Get or Replace the Class of an xts Object's Index} \usage{ tclass(x, ...) \method{tclass}{default}(x, ...) \method{tclass}{xts}(x, ...) tclass(x) <- value \method{tclass}{default}(x) <- value indexClass(x) indexClass(x) <- value \method{tclass}{xts}(x) <- value } \arguments{ \item{x}{An xts object.} \item{\dots}{Arguments passed to other methods.} \item{value}{The new index class (see Details for valid values).} } \value{ A vector containing the class of the object's index. } \description{ Generic functions to get or replace the class of an xts object's index. } \details{ Internally, an xts object's index is a \emph{numeric} value corresponding to seconds since the epoch in the UTC timezone. The index class is stored as the \code{tclass} attribute on the internal index. This is used to convert the internal index values to the desired class when the \code{index} function is called. The \code{tclass} function retrieves the class of the internal index, and the \verb{tclass<-} function sets it. The specified value for \verb{tclass<-} must be one of the following character strings: \code{"Date"}, \code{"POSIXct"}, \code{"chron"}, \code{"yearmon"}, \code{"yearqtr"}, or \code{"timeDate"}. } \note{ Both \code{indexClass} and \verb{indexClass<-} are deprecated in favor of \code{tclass} and \verb{tclass<-}, respectively. Replacing the \code{tclass} can \emph{potentially change} the values of the internal index. For example, changing the 'tclass' from POSIXct to Date will truncate the POSIXct value and convert the timezone to UTC (since the Date class doesn't have a timezone). See the examples. } \examples{ x <- timeBasedSeq('2010-01-01/2010-01-02 12:00') x <- xts(seq_along(x), x) y <- timeBasedSeq('2010-01-01/2010-01-03 12:00/H') y <- xts(seq_along(y), y, tzone = "America/New_York") # Changing the tclass *changes* the internal index values head(y) # the index has times head(.index(y)) tclass(y) <- "Date" head(y) # the index prints as a Date head(.index(y)) # the internal index is truncated } \seealso{ \code{\link[=index.xts]{index()}} has more information on the xts index, \code{\link[=tformat]{tformat()}} details how the index values are formatted when printed, and \code{\link[=tzone]{tzone()}} has more information about the index timezone settings. The following help pages describe the characteristics of the valid index classes: \code{\link[=POSIXct]{POSIXct()}}, \code{\link[=Date]{Date()}}, \link[chron:chron]{chron()}, \code{\link[zoo:zoo]{yearmon()}}, \code{\link[zoo:zoo]{yearqtr()}}, \code{\link[timeDate:timeDate]{timeDate()}} } \author{ Jeffrey A. Ryan } \keyword{ts} \keyword{utilities} xts/man/split.xts.Rd0000644000176200001440000000257414702273776014131 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/split.R \name{split.xts} \alias{split.xts} \title{Divide into Groups by Time} \usage{ \method{split}{xts}(x, f = "months", drop = FALSE, k = 1, ...) } \arguments{ \item{x}{An xts object.} \item{f}{A character vector describing the period to split by.} \item{drop}{Ignored by \code{split.xts()}.} \item{k}{Number of periods to aggregate into each split. See details.} \item{\dots}{Further arguments passed to other methods.} } \value{ A list of xts objects. } \description{ Creates a list of xts objects split along time periods. } \details{ A quick way to break up a large xts object by standard time periods; e.g. 'months', 'quarters', etc. \code{\link[=endpoints]{endpoints()}} is used to find the start and end of each period (or k-periods). See that function for valid arguments. The inputs are passed to \code{\link[zoo:aggregate.zoo]{split.zoo()}} when \code{f} is not a character vector. } \note{ \code{\link[zoo:aggregate.zoo]{aggregate.zoo()}} is more flexible, though not as fast for xts objects. } \examples{ data(sample_matrix) x <- as.xts(sample_matrix) split(x) split(x, f="weeks") split(x, f="weeks", k=4) } \seealso{ \code{\link[=endpoints]{endpoints()}}, \code{\link[zoo:aggregate.zoo]{split.zoo()}}, \code{\link[zoo:aggregate.zoo]{aggregate.zoo()}} } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/xtsAPI.Rd0000644000176200001440000000304014654242576013316 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/xts-package.R \name{xtsAPI} \alias{xtsAPI} \title{xts C API Documentation} \description{ This help file is to help in development of xts, as well as provide some clarity and insight into its purpose and implementation. } \details{ By Jeffrey A. Ryan, Dirk Eddelbuettel, and Joshua M. Ulrich Last modified: 2018-05-02 Version: 0.10-3 and above At present the \pkg{xts} API has publicly available interfaces to the following functions (as defined in \code{xtsAPI.h}): \preformatted{Callable from other R packages: SEXP xtsIsOrdered(SEXP x, SEXP increasing, SEXP strictly) SEXP xtsNaCheck(SEXP x, SEXP check) SEXP xtsTry(SEXP x) SEXP xtsRbind(SEXP x, SEXP y, SEXP dup) SEXP xtsCoredata(SEXP x) SEXP xtsLag(SEXP x, SEXP k, SEXP pad) Internal use functions: SEXP isXts(SEXP x) void copy_xtsAttributes(SEXP x, SEXP y) void copy_xtsCoreAttributes(SEXP x, SEXP y) Internal use macros: xts_ATTRIB(x) xts_COREATTRIB(x) GET_xtsIndex(x) SET_xtsIndex(x,value) GET_xtsIndexFormat(x) SET_xtsIndexFormat(x,value) GET_xtsCLASS(x) SET_xtsCLASS(x,value) Internal use SYMBOLS: xts_IndexSymbol xts_ClassSymbol xts_IndexFormatSymbol Callable from R: SEXP mergeXts(SEXP args) SEXP rbindXts(SEXP args) SEXP tryXts(SEXP x) } } \examples{ \dontrun{ # some example code to look at file.show(system.file('api_example/README', package="xts")) file.show(system.file('api_example/src/checkOrder.c', package="xts")) } } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/first.Rd0000644000176200001440000000506114654242576013302 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/first.R, R/last.R \name{first} \alias{first} \alias{first.default} \alias{first.xts} \alias{last} \alias{last.default} \alias{last.xts} \title{Return First or Last n Elements of A Data Object} \usage{ first(x, ...) \method{first}{default}(x, n = 1, keep = FALSE, ...) \method{first}{xts}(x, n = 1, keep = FALSE, ...) last(x, ...) \method{last}{default}(x, n = 1, keep = FALSE, ...) \method{last}{xts}(x, n = 1, keep = FALSE, ...) } \arguments{ \item{x}{An object.} \item{\dots}{Arguments passed to other methods.} \item{n}{Number of observations to return.} \item{keep}{Should removed values be kept as an attribute on the result?} } \value{ A subset of elements/rows of the original data. } \description{ Generic functions to return the first or last elements or rows of a vector or two-dimensional data object. } \details{ A more advanced subsetting is available for zoo objects with indexes inheriting from POSIXt or Date classes. Quickly and easily extract the first or last \code{n} observations of an object. When \code{n} is a number, these functions are similar to \code{\link[=head]{head()}} and \code{\link[=tail]{tail()}}, but only return the \emph{first} or \emph{last} observation by default. \code{n} can be a character string if \code{x} is an xts object or coerceable to xts. It must be of the form \sQuote{n period}, where 'n' is a numeric value (1 if not provided) describing the number of periods to return. Valid periods are: secs, seconds, mins, minutes, hours, days, weeks, months, quarters, and years. The 'period' portion can be any frequency greater than or equal to the frequency of the object's time index. For example, \code{first(x, "2 months")} will return the first 2 months of data even if \code{x} is hourly frequency. Attempts to set 'period' to a frequency less than the object's frequency will throw an error. \code{n} may be positive or negative, whether it's a number or character string. When \code{n} is positive, the functions return the obvious result. For example, \code{first(x, "1 month")} returns the first month's data. When \code{n} is negative, all data \emph{except} first month's is returned. Requesting more data than is in \code{x} will throw a warning and simply return \code{x}. } \examples{ first(1:100) last(1:100) data(LakeHuron) first(LakeHuron,10) last(LakeHuron) x <- xts(1:100, Sys.Date()+1:100) first(x, 10) first(x, '1 day') first(x, '4 days') first(x, 'month') last(x, '2 months') last(x, '6 weeks') } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/axTicksByTime.Rd0000644000176200001440000000405014654242576014670 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/axTicksByTime.R \name{axTicksByTime} \alias{axTicksByTime} \title{Compute x-Axis Tickmark Locations by Time} \usage{ axTicksByTime( x, ticks.on = "auto", k = 1, labels = TRUE, format.labels = TRUE, ends = TRUE, gt = 2, lt = 30 ) } \arguments{ \item{x}{An object indexed by time or a vector of times/dates.} \item{ticks.on}{Time unit for tick locations.} \item{k}{Frequency of tick locations.} \item{labels}{Should a labeled vector be returned?} \item{format.labels}{Either a logical value specifying whether labels should be formatted, or a character string specifying the format to use.} \item{ends}{Should the ends be adjusted?} \item{gt}{Lower bound on number of tick locations.} \item{lt}{Upper bound on number of tick locations.} } \value{ A numeric vector of index element locations where tick marks should be drawn. These are \emph{locations} (e.g. 1, 2, 3, ...), \emph{not} the index timestamps. If possible, the result will be named using formatted values from the index timestamps. The names will be used for the tick mark labels. } \description{ Compute x-axis tickmarks like \code{\link[=axTicks]{axTicks()}} in base but with respect to time. This function is written for internal use, and documented for those wishing to use it for customized plots. } \details{ The default \code{ticks.on = "auto"} uses heuristics to compute sensible tick locations. Use a combination of \code{ticks.on} and \code{k} to create tick locations at specific intervals. For example, \code{ticks.on = "days"} and \code{k = 7} will create tick marks every 7 days. When \code{format.labels} is a character string the possible values are the same as those listed in the Details section of \code{\link[=strptime]{strptime()}}. } \examples{ data(sample_matrix) axTicksByTime(as.xts(sample_matrix),'auto') axTicksByTime(as.xts(sample_matrix),'weeks') axTicksByTime(as.xts(sample_matrix),'months',7) } \seealso{ \code{\link[=endpoints]{endpoints()}} } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/as.xts.Rd0000644000176200001440000000637114702267440013367 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Date.R, R/POSIX.R, R/data.frame.R, R/irts.R, % R/matrix.R, R/timeDate.R, R/timeSeries.R, R/ts.R, R/xts.R, R/yearmon.R, % R/zoo.R \name{as.xts.Date} \alias{as.xts.Date} \alias{as.xts.POSIXt} \alias{as.xts.data.frame} \alias{as.xts.irts} \alias{as.xts.matrix} \alias{as.xts.timeDate} \alias{as.xts.timeSeries} \alias{as.xts.ts} \alias{as.xts} \alias{xtsible} \alias{as.xts.yearmon} \alias{as.xts.yearqtr} \alias{as.xts.zoo} \title{Convert Objects To and From xts} \usage{ \method{as.xts}{Date}(x, ...) \method{as.xts}{POSIXt}(x, ...) \method{as.xts}{data.frame}( x, order.by, dateFormat = "POSIXct", frequency = NULL, ..., .RECLASS = FALSE ) \method{as.xts}{irts}(x, order.by, frequency = NULL, ..., .RECLASS = FALSE) \method{as.xts}{matrix}( x, order.by, dateFormat = "POSIXct", frequency = NULL, ..., .RECLASS = FALSE ) \method{as.xts}{timeDate}(x, ...) \method{as.xts}{timeSeries}( x, dateFormat = "POSIXct", FinCenter, recordIDs, title, documentation, ..., .RECLASS = FALSE ) \method{as.xts}{ts}(x, dateFormat, ..., .RECLASS = FALSE) as.xts(x, ...) xtsible(x) \method{as.xts}{yearmon}(x, ...) \method{as.xts}{yearqtr}(x, ...) \method{as.xts}{zoo}(x, order.by = index(x), frequency = NULL, ..., .RECLASS = FALSE) } \arguments{ \item{x}{Data object to convert. See details for supported types.} \item{\dots}{Additional parameters or attributes.} \item{order.by, frequency}{See \link[zoo:zoo]{zoo} help.} \item{dateFormat}{What class should the dates be converted to?} \item{.RECLASS}{Should the conversion be reversible via \code{\link[=reclass]{reclass()}}?} \item{FinCenter, recordIDs, title, documentation}{See \link[timeSeries:timeSeries]{timeSeries} help.} } \value{ An S3 object of class xts. } \description{ Conversion S3 methods to coerce data objects of arbitrary classes to xts and back, without losing any attributes of the original format. } \details{ A simple and reliable way to convert many different objects into a uniform format for use within \R. \code{as.xts()} can convert objects of the following classes into an xts object: object: \link[timeSeries:timeSeries]{timeSeries}, \link{ts}, \link{matrix}, \link{data.frame}, and \link[zoo:zoo]{zoo}. \code{xtsible()} safely checks whether an object can be converted to an xts object. Additional \code{name = value} pairs may be passed to the function to be added to the new object. A special \code{\link[=print.xts]{print.xts()}} method ensures the attributes are hidden from view, but will be available via \R's standard \code{attr()} function, as well as the \code{\link[=xtsAttributes]{xtsAttributes()}} function. When \code{.RECLASS = TRUE}, the returned xts object internally preserves all relevant attribute/slot data from the input \code{x}. This allows for temporary conversion to xts in order to use zoo and xts compatible methods. See \code{\link[=reclass]{reclass()}} for details. } \examples{ \dontrun{ # timeSeries library(timeSeries) x <- timeSeries(1:10, 1:10) str(as.xts(x)) str(reclass(as.xts(x))) str(try.xts(x)) str(reclass(try.xts(x))) } } \seealso{ \code{\link[=xts]{xts()}}, \code{\link[=reclass]{reclass()}}, \code{\link[zoo:zoo]{zoo()}} } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/timeBasedSeq.Rd0000644000176200001440000000634714654242576014531 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/timeBasedRange.R, R/timeBasedSeq.R \name{timeBasedRange} \alias{timeBasedRange} \alias{timeBasedSeq} \title{Create a Sequence or Range of Times} \usage{ timeBasedRange(x, ...) timeBasedSeq(x, retclass = NULL, length.out = NULL) } \arguments{ \item{x}{An ISO-8601 time-date range string.} \item{\dots}{Unused.} \item{retclass}{The return class desired.} \item{length.out}{Passed to \code{seq()} internally.} } \value{ \code{timeBasedSeq()} returns a vector of time-based observations. \code{timeBasedRange()} returns a one or two element numeric vector representing the start and end number of seconds since epoch (1970-01-01). When \code{retclass = NULL}, the result of \code{timeBasedSeq()} is a named list containing elements "from", "to", "by" and "length.out". } \description{ A function to create a vector of time-based objects suitable for indexing an xts object, given a string conforming to the ISO-8601 time and date standard for range-based specification. The resulting series can be of any class supported by xts, including POSIXct, Date, chron, timeDate, yearmon, and yearqtr. } \details{ \code{timeBasedRange()} creates a one or two element numeric vector representing the start and end number of seconds since epoch (1970-01-01). For internal use. \code{timeBasedSeq()} creates sequences of time-based observations using strings formatted according to the ISO-8601 specification. The general format is \emph{from/to/by} or \emph{from::to::by}, where \emph{to} and \emph{by} are optional when the 'length.out' argument is specified. The \emph{from} and \emph{to} elements of the string must be left-specified with respect to the standard \emph{CCYYMMDD HHMMSS} form. All dates/times specified will be set to either the earliest point (from) or the latest (to), to the given the level of specificity. For example, \sQuote{1999} in the \emph{from} field would set the start to the beginning of 1999. \sQuote{1999} in the \emph{to} field would set the end to the end of 1999. The amount of resolution in the result is determined by the resolution of the \emph{from} and \emph{to} component, unless the optional \emph{by} component is specified. For example, \code{timeBasedSeq("1999/2008")} returns a vector of Dates for January 1st of each year. \code{timeBasedSeq("199501/1996")} returns a yearmon vector of 24 months in 1995 and 1996. And \code{timeBasedSeq("19950101/1996")} creates a Date vector for all the days in those two years. The optional \emph{by} field (the third delimited element to the string), will the resolution heuristic described above and will use the specified \emph{by} resolution. The possible values for \emph{by} are: 'Y' (years), 'm' (months), 'd' (days), 'H' (hours), 'M' (minutes), 'S' (seconds). Sub-second resolutions are not supported. } \examples{ timeBasedSeq('1999/2008') timeBasedSeq('199901/2008') timeBasedSeq('199901/2008/d') timeBasedSeq('20080101 0830',length=100) # 100 minutes timeBasedSeq('20080101 083000',length=100) # 100 seconds } \references{ International Organization for Standardization: ISO 8601 \url{https://www.iso.org} } \seealso{ \code{\link[=timeBased]{timeBased()}}, \code{\link[=xts]{xts()}} } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/parseISO8601.Rd0000644000176200001440000000475414654242576014167 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/parse8601.R \name{.parseISO8601} \alias{.parseISO8601} \alias{ISO8601} \alias{parseISO8601} \title{Internal ISO 8601:2004(e) Time Parser} \usage{ .parseISO8601(x, start, end, tz = "") } \arguments{ \item{x}{A character string conforming to the ISO 8601:2004(e) rules.} \item{start}{Lower constraint on range.} \item{end}{Upper constraint of range} \item{tz}{Timezone (tzone) to use internally.} } \value{ A two element list with an entry named \sQuote{first.time} and one named \sQuote{last.time}. } \description{ This function replicates most of the ISO standard for parsing times and time-based ranges in a universally accepted way. The best documentation is the official ISO page as well as the Wikipedia entry for ISO 8601:2004. } \details{ The basic idea is to create the endpoints of a range, given a string representation. These endpoints are aligned in POSIXct time to the zero second of the day at the beginning, and the 59.9999th second of the 59th minute of the 23rd hour of the final day. For dates prior to the epoch (1970-01-01) the ending time is aligned to the 59.0000 second. This is due to a bug/feature in the \R implementation of \code{as.POSIXct()} and \code{mktime0()} at the C-source level. This limits the precision of ranges prior to 1970 to 1 minute granularity with the current \pkg{xts} workaround. Recurring times over multiple days may be specified using the "T" notation. See the examples for details. } \note{ There is no checking done to test for a properly constructed ISO format string. This must be correctly entered by the user. When using durations, it is important to note that the time of the duration specified is not necessarily the same as the realized periods that may be returned when applied to an irregular time series. This is not a bug, it is a standards and implementation gotcha. } \examples{ # the start and end of 2000 .parseISO8601('2000') # the start of 2000 and end of 2001 .parseISO8601('2000/2001') # May 1, 2000 to Dec 31, 2001 .parseISO8601('2000-05/2001') # May 1, 2000 to end of Feb 2001 .parseISO8601('2000-05/2001-02') # Jan 1, 2000 to Feb 29, 2000; note the truncated time on the LHS .parseISO8601('2000-01/02') # 8:30 to 15:00 (used in xts subsetting to extract recurring times) .parseISO8601('T08:30/T15:00') } \references{ \url{https://en.wikipedia.org/wiki/ISO_8601}\cr \url{https://www.iso.org/iso-8601-date-and-time-format.html} } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/period_math.Rd0000644000176200001440000000274114654242576014450 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/period.R \name{period.sum} \alias{period.sum} \alias{period.prod} \alias{period.max} \alias{period.min} \title{Optimized Calculations By Period} \usage{ period.sum(x, INDEX) period.prod(x, INDEX) period.max(x, INDEX) period.min(x, INDEX) } \arguments{ \item{x}{A univariate data object.} \item{INDEX}{A numeric vector of endpoints for each period.} } \value{ An xts or zoo object containing the sum, product, minimum, or maximum for each endpoint in \code{INDEX}. } \description{ Calculate a sum, product, minimum, or maximum for each non-overlapping period specified by \code{INDEX}. } \details{ These functions are similar to calling \code{period.apply()} with the same endpoints and function. There may be slight differences in the results due to numerical accuracy. For xts-coercible objects, an appropriate \code{INDEX} can be created by a call to \code{endpoints()}. } \examples{ x <- c(1, 1, 4, 2, 2, 6, 7, 8, -1, 20) i <- c(0, 3, 5, 8, 10) period.sum(x, i) period.prod(x, i) period.min(x, i) period.max(x, i) data(sample_matrix) y <- sample_matrix[, 1] ep <- endpoints(sample_matrix) period.sum(y, ep) period.sum(as.xts(y), ep) period.prod(y, ep) period.prod(as.xts(y), ep) period.min(y, ep) period.min(as.xts(y), ep) period.max(y, ep) period.max(as.xts(y), ep) } \seealso{ \code{\link[=endpoints]{endpoints()}}, \code{\link[=period.apply]{period.apply()}} } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/CLASS.Rd0000644000176200001440000000205014654242576013013 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reclass.R \name{CLASS} \alias{CLASS} \alias{CLASS<-} \title{Extract and Set .CLASS Attribute} \usage{ CLASS(x) CLASS(x) <- value } \arguments{ \item{x}{An xts object.} \item{value}{The new value to assign to the '.CLASS' attribute.} } \value{ Called for its side-effect of changing the '.CLASS' attribute. } \description{ Extraction and replacement functions to access the xts '.CLASS' attribute. The '.CLASS' attribute is used by \code{reclass()} to transform an xts object back to its original class. } \details{ This is meant for use in conjunction with \code{try.xts()} and \code{reclass()} and is is not intended for daily use. While it's possible to interactively coerce objects to other classes than originally derived from, it's likely to cause unexpected behavior. It is best to use the usual \code{as.xts()} and other classes' \code{as} methods. } \seealso{ \code{\link[=as.xts]{as.xts()}}, \code{\link[=reclass]{reclass()}} } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/reclass.Rd0000644000176200001440000000723714654242576013616 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reclass.R \name{try.xts} \alias{try.xts} \alias{use.xts} \alias{reclass} \alias{Reclass} \alias{use.reclass} \title{Convert Objects to xts and Back to Original Class} \usage{ try.xts(x, ..., error = TRUE) reclass(x, match.to, error = FALSE, ...) Reclass(x) } \arguments{ \item{x}{Data object to convert. See details for supported types.} \item{\dots}{Additional parameters or attributes.} \item{error}{Error handling option. See Details.} \item{match.to}{An xts object whose attributes will be copied to the result.} } \value{ \code{try.xts()} returns an xts object when conversion is successful. The \code{error} argument controls the function's behavior when conversion fails. \code{Reclass()} and \code{reclass()} return the object as its original class, as specified by the 'CLASS' attribute. } \description{ Functions to convert objects of arbitrary classes to xts and then back to the original class, without losing any attributes of the original class. } \details{ A simple and reliable way to convert many different objects into a uniform format for use within \R. \code{try.xts()} and \code{reclass()} are functions that enable external developers access to the reclassing tools within \pkg{xts} to help speed development of time-aware functions, as well as provide a more robust and seemless end-user experience, regardless of the end-user's choice of data-classes. \code{try.xts()} calls \code{as.xts()} internally. See \code{\link[=as.xts]{as.xts()}} for available xts methods and arguments for each coercible class. Since it calls \code{as.xts()}, you can add custom attributes as \code{name = value} pairs in the same way. But these custom attributes will not be copied back to the original object when \code{reclass()} is called. The \code{error} argument can be a logical value indicating whether an error should be thrown (or fail silently), a character string allowing for custom error error messages, or a function of the form \code{f(x, ...)} that will be called if the conversion fails. \code{reclass()} converts an object created by \code{try.xts()} back to its original class with all the original attributes intact (unless they were changed after the object was converted to xts). The \code{match.to} argument allows you copy the index attributes (\code{\link{tclass}}, \code{\link{tformat}}, and \code{\link{tzone}}) and \code{\link[=xtsAttributes]{xtsAttributes()}} from another xts object to the result. \code{match.to} must be an xts object with an index value for every observation in \code{x}. \code{Reclass()} is designed for top-level use, where it is desirable to have the object returned from an arbitrary function in the same class as the object passed in. Most functions in \R are not designed to return objects matching the original object's class. It attempts to handle conversion and reconversion transparently but it requires the original object must be coercible to xts, the result of the function must have the same number of rows as the input, and the object to be converted/reclassed must be the first argument to the function being wrapped. Note that this function hasn't been tested for robustness. See the accompanying vignette for more details on the above usage. } \examples{ a <- 1:10 # fails silently, the result is still an integer vector try.xts(a, error = FALSE) # control the result with a function try.xts(a, error = function(x, ...) { "I'm afraid I can't do that." }) z <- zoo(1:10, timeBasedSeq("2020-01-01/2020-01-10")) x <- try.xts(z) # zoo to xts str(x) str(reclass(x)) # reclass back to zoo } \seealso{ \code{\link[=as.xts]{as.xts()}} } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/rbind.xts.Rd0000644000176200001440000000320714654242576014066 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bind.R \name{c.xts} \alias{c.xts} \alias{rbind.xts} \title{Concatenate Two or More xts Objects by Row} \usage{ \method{c}{xts}(...) \method{rbind}{xts}(..., deparse.level = 1) } \arguments{ \item{\dots}{Objects to bind by row.} \item{deparse.level}{Not implemented.} } \value{ An xts object with one row per row for each object concatenated. } \description{ Concatenate or bind by row two or more xts objects along a time-based index. All objects must have the same number of columns and be xts objects or coercible to xts. } \details{ Duplicate index values are supported. When one or more input has the same index value, the duplicated index values in the result are in the same order the objects are passed to \code{rbind()}. See examples. \code{c()} is an alias for \code{rbind()} for xts objects. See \code{\link[=merge.xts]{merge.xts()}} for traditional merge operations. } \note{ \code{rbind()} is a '.Primitive' function in \R, which means method dispatch occurs at the C-level, and may not be consistent with normal S3 method dispatch (see \code{\link[=rbind]{rbind()}} for details). Call \code{rbind.xts()} directly to avoid potential dispatch ambiguity. } \examples{ x <- xts(1:10, Sys.Date()+1:10) str(x) merge(x,x) rbind(x,x) rbind(x[1:5],x[6:10]) c(x,x) # this also works on non-unique index values x <- xts(rep(1,5), Sys.Date()+c(1,2,2,2,3)) y <- xts(rep(2,3), Sys.Date()+c(1,2,3)) # overlapping indexes are appended rbind(x,y) rbind(y,x) } \seealso{ \code{\link[=merge.xts]{merge.xts()}} \code{\link[=rbind]{rbind()}} } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/xts.Rd0000644000176200001440000001453414702270377012770 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/xts.R \name{xts} \alias{xts} \alias{.xts} \alias{is.xts} \title{Create or Test For An xts Time-Series Object} \usage{ xts( x = NULL, order.by = index(x), frequency = NULL, unique = TRUE, tzone = Sys.getenv("TZ"), ... ) .xts( x = NULL, index, tclass = c("POSIXct", "POSIXt"), tzone = Sys.getenv("TZ"), check = TRUE, unique = FALSE, ... ) is.xts(x) } \arguments{ \item{x}{An object containing the underlying data.} \item{order.by}{A corresponding vector of dates/times of a known time-based class. See Details.} \item{frequency}{Numeric value indicating the frequency of \code{order.by}. See details.} \item{unique}{Can the index only include unique timestamps? Ignored when \code{check = FALSE}.} \item{tzone}{Time zone of the index (ignored for indices without a time component, e.g. Date, yearmon, yearqtr). See \code{\link[=tzone]{tzone()}}.} \item{\dots}{Additional attributes to be added. See details.} \item{index}{A corresponding \emph{numeric} vector specified as seconds since the UNIX epoch (1970-01-01 00:00:00.000).} \item{tclass}{Time class to use for the index. See \code{\link[=tclass]{tclass()}}.} \item{check}{Must the index be ordered? The index cannot contain duplicates when \code{check = TRUE} and \code{unique = TRUE}.} } \value{ An S3 object of class xts. } \description{ Constructor function for creating an extensible time-series object. } \details{ \code{xts()} is used to create an xts object from raw data inputs. The xts class inherits from and extends the zoo class, which means most zoo functions can be used on xts objects. The \code{xts()} constructor is the preferred way to create xts objects. It performs several checks to ensure it returns a well-formed xts object. The \code{.xts()} constructor is mainly for internal use. It is more efficient then the regular \code{xts()} constructor because it doesn't perform as many validity checks. Use it with caution. Similar to zoo objects, xts objects must have an ordered index. While zoo indexes cannot contain duplicate values, xts objects have optionally supported duplicate index elements since version 0.5-0. The xts class has one additional requirement: the index must be a time-based class. Currently supported classes include: \sQuote{Date}, \sQuote{POSIXct}, \sQuote{timeDate}, as well as \sQuote{yearmon} and \sQuote{yearqtr} where the index values remain unique. The uniqueness requirement was relaxed in version 0.5-0, but is still enforced by default. Setting \code{unique = FALSE} skips the uniqueness check and only ensures that the index is ordered via the \code{isOrdered()} function. As of version 0.10-0, xts no longer allows missing values in the index. This is because many xts functions expect all index values to be finite. The most important of these is \code{merge.xts()}, which is used ubiquitously. Missing values in the index are usually the result of a date-time conversion error (e.g. incorrect format, non-existent time due to daylight saving time, etc.). Because of how non-finite numbers are represented, a missing timestamp will always be at the end of the index (except if it is \code{-Inf}, which will be first). Another difference from \pkg{zoo} is that xts object may carry additional attributes that may be desired in individual time-series handling. This includes the ability to augment the objects data with meta-data otherwise not cleanly attachable to a standard zoo object. These attributes may be assigned and extracted via \code{\link[=xtsAttributes]{xtsAttributes()}} and \code{\link{xtsAttributes<-}}, respectively. Examples of usage from finance may include the addition of data for keeping track of sources, last-update times, financial instrument descriptions or details, etc. The idea behind \pkg{xts} is to offer the user the ability to utilize a standard zoo object, while providing an mechanism to customize the object's meta-data, as well as create custom methods to handle the object in a manner required by the user. Many xts-specific methods have been written to better handle the unique aspects of xts. These include, subsetting (\code{[}), \code{merge()}, \code{cbind()}, \code{rbind()}, \code{c()}, math and logical operations, \code{lag()}, \code{diff()}, \code{coredata()}, \code{head()}, and \code{tail()}. There are also xts-specific methods for converting to/from R's different time-series classes. Subsetting via \code{[} methods offers the ability to specify dates by range, if they are enclosed in quotes. The style borrows from python by creating ranges separated by a double colon \dQuote{"::"} or \dQuote{"/"}. Each side of the range may be left blank, which would then default to the start and end of the data, respectively. To specify a subset of times, it is only required that the time specified be in standard ISO format, with some form of separation between the elements. The time must be \emph{left-filled}, that is to specify a full year one needs only to provide the year, a month requires the full year and the integer of the month requested - e.g. '1999-01'. This format would extend all the way down to seconds - e.g. '1999-01-01 08:35:23'. Leading zeros are not necessary. See the examples for more detail. Users may also extend the xts class to new classes to allow for method overloading. Additional benefits derive from the use of \code{\link[=as.xts]{as.xts()}} and \code{\link[=reclass]{reclass()}}, which allow for lossless two-way conversion between common R time-series classes and the xts object structure. See those functions for more detail. } \examples{ data(sample_matrix) sample.xts <- as.xts(sample_matrix, descr='my new xts object') class(sample.xts) str(sample.xts) head(sample.xts) # attribute 'descr' hidden from view attr(sample.xts,'descr') sample.xts['2007'] # all of 2007 sample.xts['2007-03/'] # March 2007 to the end of the data set sample.xts['2007-03/2007'] # March 2007 to the end of 2007 sample.xts['/'] # the whole data set sample.xts['/2007'] # the beginning of the data through 2007 sample.xts['2007-01-03'] # just the 3rd of January 2007 } \references{ \pkg{zoo} } \seealso{ \code{\link[=as.xts]{as.xts()}}, \code{\link[=index.xts]{index()}}, \code{\link[=tclass]{tclass()}}, \code{\link[=tformat]{tformat()}}, \code{\link[=tzone]{tzone()}}, \code{\link[=xtsAttributes]{xtsAttributes()}} } \author{ Jeffrey A. Ryan and Joshua M. Ulrich } \keyword{utilities} xts/man/period.apply.Rd0000644000176200001440000000547314654242576014570 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/period.apply.R \name{period.apply} \alias{period.apply} \title{Apply Function Over Specified Interval} \usage{ period.apply(x, INDEX, FUN, ...) } \arguments{ \item{x}{The data that \code{FUN} will be applied to.} \item{INDEX}{A numeric vector of index breakpoint locations. The vector should begin with 0 and end with \code{nrow(x)}.} \item{FUN}{A function to apply to each interval in \code{x}.} \item{\dots}{Additional arguments for \code{FUN}.} } \value{ An object with \code{length(INDEX) - 1} observations, assuming \code{INDEX} starts with 0 and ends with \code{nrow(x)}. } \description{ Apply a specified function to data over intervals specified by \code{INDEX}. The intervals are defined as the observations from \code{INDEX[k]+1} to \code{INDEX[k+1]}, for \code{k = 1:(length(INDEX)-1)}. } \details{ Similar to the rest of the apply family, \code{period.apply()} calculates the specified function's value over a subset of data. The primary difference is that \code{period.apply()} applies the function to non-overlapping intervals of a vector or matrix. Useful for applying functions over an entire data object by any non-overlapping intervals. For example, when \code{INDEX} is the result of a call to \code{endpoints()}. \code{period.apply()} checks that \code{INDEX} is sorted, unique, starts with 0, and ends with \code{nrow(x)}. All those conditions are true of vectors returned by \code{endpoints()}. } \note{ When \code{FUN = mean} the results will contain one column for every column in the input, which is different from other math functions (e.g. \code{median}, \code{sum}, \code{prod}, \code{sd}, etc.). \code{FUN = mean} works by column because the default method \code{stats::mean} previously worked by column for matrices and data.frames. R Core changed the behavior of \code{mean} to always return one column in order to be consistent with the other math functions. This broke some \pkg{xts} dependencies and \code{mean.xts()} was created to maintain the original behavior. Using \code{FUN = mean} will print a message that describes this inconsistency. To avoid the message and confusion, use \code{FUN = colMeans} to calculate means by column and use \code{FUN = function(x) mean} to calculate one mean for all the data. Set \code{options(xts.message.period.apply.mean = FALSE)} to suppress this message. } \examples{ zoo.data <- zoo(rnorm(31)+10,as.Date(13514:13744,origin="1970-01-01")) ep <- endpoints(zoo.data,'weeks') period.apply(zoo.data, INDEX=ep, FUN=function(x) colMeans(x)) period.apply(zoo.data, INDEX=ep, FUN=colMeans) #same period.apply(letters,c(0,5,7,26), paste0) } \seealso{ \code{\link[=endpoints]{endpoints()}} \code{\link[=apply.monthly]{apply.monthly()}} } \author{ Jeffrey A. Ryan, Joshua M. Ulrich } \keyword{utilities} xts/man/firstof.Rd0000644000176200001440000000207214654242576013626 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/endpoints.R \name{firstof} \alias{firstof} \alias{lastof} \title{Create a POSIXct Object} \usage{ firstof(year = 1970, month = 1, day = 1, hour = 0, min = 0, sec = 0, tz = "") lastof( year = 1970, month = 12, day = 31, hour = 23, min = 59, sec = 59, subsec = 0.99999, tz = "" ) } \arguments{ \item{year, month, day}{Numeric values to specify a day.} \item{hour, min, sec}{Numeric vaues to specify time within a day.} \item{tz}{Timezone used for conversion.} \item{subsec}{Number of sub-seconds.} } \value{ An POSIXct object. } \description{ Easily create of time stamps corresponding to the first or last observation in a specified time period. } \details{ This is a wrapper to \code{\link[=ISOdatetime]{ISOdatetime()}} with defaults corresponding to the first or last possible time in a given period. } \examples{ firstof(2000) firstof(2005,01,01) lastof(2007) lastof(2007,10) } \seealso{ \code{\link[=ISOdatetime]{ISOdatetime()}} } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/apply.monthly.Rd0000644000176200001440000000465314654242576014777 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/period.apply.R \name{apply.daily} \alias{apply.daily} \alias{apply.weekly} \alias{apply.monthly} \alias{apply.quarterly} \alias{apply.yearly} \title{Apply Function over Calendar Periods} \usage{ apply.daily(x, FUN, ...) apply.weekly(x, FUN, ...) apply.monthly(x, FUN, ...) apply.quarterly(x, FUN, ...) apply.yearly(x, FUN, ...) } \arguments{ \item{x}{A time-series object coercible to xts.} \item{FUN}{A function to apply to each period.} \item{\dots}{Additional arguments to \code{FUN}.} } \value{ A vector of results produced by \code{FUN}, corresponding to the appropriate periods. } \description{ Apply a specified function to each distinct period in a given time series object. } \details{ Simple mechanism to apply a function to non-overlapping time periods, e.g. weekly, monthly, etc. Different from rolling functions in that this will subset the data based on the specified time period (implicit in the call), and return a vector of values for each period in the original data. Essentially a wrapper to the \pkg{xts} functions \code{endpoints()} and \code{period.apply()}, mainly as a convenience. } \note{ When \code{FUN = mean} the results will contain one column for every column in the input, which is different from other math functions (e.g. \code{median}, \code{sum}, \code{prod}, \code{sd}, etc.). \code{FUN = mean} works by column because the default method \code{stats::mean} previously worked by column for matrices and data.frames. R Core changed the behavior of \code{mean} to always return one column in order to be consistent with the other math functions. This broke some \pkg{xts} dependencies and \code{mean.xts()} was created to maintain the original behavior. Using \code{FUN = mean} will print a message that describes this inconsistency. To avoid the message and confusion, use \code{FUN = colMeans} to calculate means by column and use \code{FUN = function(x) mean} to calculate one mean for all the data. Set \code{options(xts.message.period.apply.mean = FALSE)} to suppress this message. } \examples{ xts.ts <- xts(rnorm(231),as.Date(13514:13744,origin="1970-01-01")) start(xts.ts) end(xts.ts) apply.monthly(xts.ts,colMeans) apply.monthly(xts.ts,function(x) var(x)) } \seealso{ \code{\link[=endpoints]{endpoints()}}, \code{\link[=period.apply]{period.apply()}}, \code{\link[=to.monthly]{to.monthly()}} } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/timeBased.Rd0000644000176200001440000000120514654242576014044 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/period.R \name{is.timeBased} \alias{is.timeBased} \alias{timeBased} \title{Check if Class is Time-Based} \usage{ is.timeBased(x) timeBased(x) } \arguments{ \item{x}{Object to test.} } \value{ A logical scalar. } \description{ Used to verify that the object is one of the known time-based classes in R. Current time-based objects supported are \code{Date}, \code{POSIXct}, \code{chron}, \code{yearmon}, \code{yearqtr}, and \code{timeDate}. } \examples{ timeBased(Sys.time()) timeBased(Sys.Date()) timeBased(200701) } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/coredata.xts.Rd0000644000176200001440000000401514654242576014550 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/coredata.xts.R \name{coredata.xts} \alias{coredata.xts} \alias{xcoredata} \alias{xcoredata<-} \title{Extract/Replace Core Data of an xts Object} \usage{ \method{coredata}{xts}(x, fmt = FALSE, ...) xcoredata(x, ...) xcoredata(x) <- value } \arguments{ \item{x}{An xts object.} \item{fmt}{Should the rownames be formated using \code{tformat()}? Alternatively a date/time string to be passed to \code{format()}. See details.} \item{\dots}{Unused.} \item{value}{Non-core attributes to assign.} } \value{ Returns either a matrix object for coredata, or a list of named attributes. The replacement functions are called for their side-effects. } \description{ Mechanism to extract and replace the core data of an xts object. } \details{ Extract coredata of an xts object - removing all attributes except \code{dim} and \code{dimnames} and returning a matrix object with rownames converted from the index of the xts object. The rownames of the result use the format specified by \code{tformat(x)} when \code{fmt = TRUE}. When \code{fmt} is a character string to be passed to \code{format()}. See \code{\link[=strptime]{strptime()}} for valid format strings. Setting \code{fmt = FALSE} will return the row names by simply coercing the index class to a character string in the default manner. \code{xcoredata()} is the complement to \code{coredata()}. It returns all of the attributes normally removed by \code{coredata()}. Its purpose, along with the the replacement function \verb{xcoredata<-} is primarily for developers using \pkg{xts}' \code{\link[=try.xts]{try.xts()}} and \code{\link[=reclass]{reclass()}} functionality inside functions so the functions can take any time series class as an input and return the same time series class. } \examples{ data(sample_matrix) x <- as.xts(sample_matrix, myattr=100) coredata(x) xcoredata(x) } \seealso{ \code{\link[zoo:zoo]{coredata()}}, \code{\link[=xtsAttributes]{xtsAttributes()}} } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/sample.data.Rd0000644000176200001440000000113314654242576014340 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/xts-package.R \docType{data} \name{sample_matrix} \alias{sample_matrix} \title{Sample Data Matrix For xts Example and Unit Testing} \format{ \preformatted{The format is: num [1:180, 1:4] 50.0 50.2 50.4 50.4 50.2 ... - attr(*, "dimnames")=List of 2 ..$ : chr [1:180] "2007-01-02" "2007-01-03" "2007-01-04" "2007-01-05" ... ..$ : chr [1:4] "Open" "High" "Low" "Close" } } \usage{ data(sample_matrix) } \description{ Simulated 180 observations on 4 variables. } \examples{ data(sample_matrix) } \keyword{datasets} xts/man/make.index.unique.Rd0000644000176200001440000000356314654242576015510 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/align.time.R \name{is.index.unique} \alias{is.index.unique} \alias{is.time.unique} \alias{make.index.unique} \alias{make.time.unique} \title{Force Time Values To Be Unique} \usage{ is.index.unique(x) is.time.unique(x) make.index.unique(x, eps = 1e-06, drop = FALSE, fromLast = FALSE, ...) make.time.unique(x, eps = 1e-06, drop = FALSE, fromLast = FALSE, ...) } \arguments{ \item{x}{An xts object, or POSIXct vector.} \item{eps}{A value to add to force uniqueness.} \item{drop}{Should duplicates be dropped instead of adjusted by \code{eps}?} \item{fromLast}{When \code{drop = TRUE}, \code{fromLast} controls which duplicated times are dropped. When \code{fromLast = FALSE}, the earliest observation with an identical timestamp is kept and subsequent observations are dropped.} \item{\dots}{Unused.} } \value{ A modified version of \code{x} with unique timestamps. } \description{ A generic function to force sorted time vectors to be unique. Useful for high-frequency time-series where original time-stamps may have identical values. For the case of xts objects, the default \code{eps} is set to ten microseconds. In practice this advances each subsequent identical time by \code{eps} over the previous (possibly also advanced) value. } \details{ The returned time-series object will have new time-stamps so that \code{isOrdered(.index(x))} evaluates to \code{TRUE}. } \note{ Incoming values must be pre-sorted, and no check is done to make sure that this is the case. \sQuote{integer} index value will be coerced to \sQuote{double} when \code{drop = FALSE}. } \examples{ ds <- options(digits.secs=6) # so we can see the change x <- xts(1:10, as.POSIXct("2011-01-21") + c(1,1,1,2:8)/1e3) x make.index.unique(x) options(ds) } \seealso{ \code{\link[=align.time]{align.time()}} } \author{ Jeffrey A. Ryan } \keyword{ts} xts/man/subset.xts.Rd0000644000176200001440000001263014654242576014275 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/xts.methods.R \name{[.xts} \alias{[.xts} \alias{subset.xts} \alias{.subset.xts} \alias{.subset_xts} \title{Extract Subsets of xts Objects} \usage{ \method{[}{xts}(x, i, j, drop = FALSE, which.i = FALSE, ...) } \arguments{ \item{x}{An xts object.} \item{i}{The rows to extract. Can be a numeric vector, time-based vector, or an ISO-8601 style range string (see details).} \item{j}{The columns to extract, either a numeric vector of column locations or a character vector of column names.} \item{drop}{Should dimension be dropped, if possible? See notes section.} \item{which.i}{Logical value that determines whether a subset xts object is returned (the default), or the locations of the matching rows (when \code{which.i = TRUE}).} \item{\dots}{Additional arguments (currently unused).} } \value{ An xts object containing the subset of \code{x}. When \code{which.i = TRUE}, the corresponding integer locations of the matching rows is returned. } \description{ Details on efficient subsetting of xts objects for maximum performance and compatibility. } \details{ One of the primary motivations and key points of differentiation of xts is the ability to subset rows by specifying ISO-8601 compatible range strings. This allows for natural range-based time queries without requiring prior knowledge of the underlying class used for the time index. When \code{i} is a character string, it is processed as an ISO-8601 formatted datetime or time range using \code{\link[=.parseISO8601]{.parseISO8601()}}. A single datetime is parsed from left to to right, according to the following specification: CCYYMMDD HH:MM:SS.ss+ A time range can be specified by two datetimes separated by a forward slash or double-colon. For example: CCYYMMDD HH:MM:SS.ss+/CCYYMMDD HH:MM:SS.ss The ISO8601 time range subsetting uses a custom binary search algorithm to efficiently find the beginning and end of the time range. \code{i} can also be a vector of ISO8601 time ranges, which enables subsetting by multiple non-contiguous time ranges in one subset call. The above parsing, both for single datetimes and time ranges, will be done on each element when \code{i} is a character \emph{vector}. This is very inefficient, especially for long vectors. In this case, it's recommened to use \code{I(i)} so the xts subset function can process the vector more efficiently. Another alternative is to convert \code{i} to POSIXct before passing it to the subset function. See the examples for an illustration of using \code{I(i)}. The xts index is stored as POSIXct internally, regardless of the value of its \code{tclass} attribute. So the fastest time-based subsetting is always when \code{i} is a POSIXct vector. } \note{ By design, xts objects always have two dimensions. They cannot be vectors like zoo objects. Therefore \code{drop = FALSE} by default in order to preserve the xts object's dimensions. This is different from both matrix and zoo, which use \code{drop = TRUE} by default. Explicitly setting \code{drop = TRUE} may be needed when performing certain matrix operations. } \examples{ x <- xts(1:3, Sys.Date()+1:3) xx <- cbind(x,x) # drop = FALSE for xts, differs from zoo and matrix z <- as.zoo(xx) z/z[,1] m <- as.matrix(xx) m/m[,1] # this will fail with non-conformable arrays (both retain dim) tryCatch( xx/x[,1], error = function(e) print("need to set drop = TRUE") ) # correct way xx/xx[,1,drop = TRUE] # or less efficiently xx/drop(xx[,1]) # likewise xx/coredata(xx)[,1] x <- xts(1:1000, as.Date("2000-01-01")+1:1000) y <- xts(1:1000, as.POSIXct(format(as.Date("2000-01-01")+1:1000))) x.subset <- index(x)[1:20] x[x.subset] # by original index type system.time(x[x.subset]) x[as.character(x.subset)] # by character string. Beware! system.time(x[as.character(x.subset)]) # slow! system.time(x[I(as.character(x.subset))]) # wrapped with I(), faster! x['200001'] # January 2000 x['1999/2000'] # All of 2000 (note there is no need to use the exact start) x['1999/200001'] # January 2000 x['2000/200005'] # 2000-01 to 2000-05 x['2000/2000-04-01'] # through April 01, 2000 y['2000/2000-04-01'] # through April 01, 2000 (using POSIXct series) ### Time of day subsetting i <- 0:60000 focal_date <- as.numeric(as.POSIXct("2018-02-01", tz = "UTC")) x <- .xts(i, c(focal_date + i * 15), tz = "UTC", dimnames = list(NULL, "value")) # Select all observations between 9am and 15:59:59.99999: w1 <- x["T09/T15"] # or x["T9/T15"] head(w1) # timestring is of the form THH:MM:SS.ss/THH:MM:SS.ss # Select all observations between 13:00:00 and 13:59:59.9999 in two ways: y1 <- x["T13/T13"] head(y1) x[.indexhour(x) == 13] # Select all observations between 9:30am and 30 seconds, and 4.10pm: x["T09:30:30/T16:10"] # It is possible to subset time of day overnight. # e.g. This is useful for subsetting FX time series which trade 24 hours on week days # Select all observations between 23:50 and 00:15 the following day, in the xts time zone z <- x["T23:50/T00:14"] z["2018-02-10 12:00/"] # check the last day # Select all observations between 7pm and 8.30am the following day: z2 <- x["T19:00/T08:29:59"] head(z2); tail(z2) } \references{ ISO 8601: Date elements and interchange formats - Information interchange - Representation of dates and time \url{https://www.iso.org} } \seealso{ \code{\link[=xts]{xts()}}, \code{\link[=.parseISO8601]{.parseISO8601()}}, \code{\link[=.index]{.index()}} } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/xtsAttributes.Rd0000644000176200001440000000227714654242576015046 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/coredata.xts.R \name{xtsAttributes} \alias{xtsAttributes} \alias{xtsAttributes<-} \title{Extract and Replace xts Attributes} \usage{ xtsAttributes(x, user = NULL) xtsAttributes(x) <- value } \arguments{ \item{x}{An xts object.} \item{user}{Should user-defined attributes be returned? The default of \code{NULL} returns all xts attributes.} \item{value}{A list of new \code{name = value} attributes.} } \value{ A named list of user-defined attributes. } \description{ Extract and replace non-core xts attributes. } \details{ This function allows users to assign custom attributes to the xts objects, without altering core xts attributes (i.e. tclass, tzone, and tformat). \code{\link[=attributes]{attributes()}} returns all attributes, including core attributes of the xts class. } \examples{ x <- xts(matrix(1:(9*6),nc=6), order.by=as.Date(13000,origin="1970-01-01")+1:9, a1='my attribute') xtsAttributes(x) xtsAttributes(x) <- list(a2=2020) xtsAttributes(x) xtsAttributes(x) <- list(a1=NULL) xtsAttributes(x) } \seealso{ \code{\link[=attributes]{attributes()}} } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/tzone.Rd0000644000176200001440000000530114702273776013307 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tzone.R \name{indexTZ} \alias{indexTZ} \alias{tzone} \alias{indexTZ<-} \alias{tzone<-} \title{Get or Replace the Timezone of an xts Object's Index} \usage{ indexTZ(x, ...) tzone(x, ...) indexTZ(x) <- value tzone(x) <- value } \arguments{ \item{x}{An xts object.} \item{\dots}{Arguments passed to other methods.} \item{value}{A valid timezone value (see \code{\link[=OlsonNames]{OlsonNames()}}).} } \value{ A one element named vector containing the timezone of the object's index. } \description{ Generic functions to get or replace the timezone of an xts object's index. } \details{ Internally, an xts object's index is a \emph{numeric} value corresponding to seconds since the epoch in the UTC timezone. When an xts object is created, all time index values are converted internally to \code{\link[=POSIXct]{POSIXct()}} (which is also in seconds since the UNIX epoch), using the underlying OS conventions and the \env{TZ} environment variable. The \code{xts()} function manages timezone information as transparently as possible. The \verb{tzone<-} function \emph{does not} change the internal index values (i.e. the index will remain the same time in the UTC timezone). } \note{ Both \code{indexTZ()} and \verb{indexTZ<-} are deprecated in favor of \code{tzone()} and \verb{tzone<-}, respectively. Problems may arise when an object that had been created under one timezone are used in a session using another timezone. This isn't usually a issue, but when it is a warning is given upon printing or subsetting. This warning may be suppressed by setting \code{options(xts_check_TZ = FALSE)}. } \examples{ # Date indexes always have a "UTC" timezone x <- xts(1, Sys.Date()) tzone(x) str(x) print(x) # The default 'tzone' is blank -- your machine's local timezone, # determined by the 'TZ' environment variable. x <- xts(1, Sys.time()) tzone(x) str(x) # now set 'tzone' to different values tzone(x) <- "UTC" str(x) tzone(x) <- "America/Chicago" str(x) y <- timeBasedSeq('2010-01-01/2010-01-03 12:00/H') y <- xts(seq_along(y), y, tzone = "America/New_York") # Changing the tzone does not change the internal index values, but it # does change how the index is printed! head(y) head(.index(y)) tzone(y) <- "Europe/London" head(y) # the index prints with hours, but head(.index(y)) # the internal index is not changed! } \seealso{ \code{\link[=index.xts]{index()}} has more information on the xts index, \code{\link[=tformat]{tformat()}} describes how the index values are formatted when printed, and \code{\link[=tclass]{tclass()}} provides details how \pkg{xts} handles the class of the index. } \author{ Jeffrey A. Ryan } \keyword{ts} \keyword{utilities} xts/man/index.xts.Rd0000644000176200001440000002006314654242576014076 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/index.R \name{index.xts} \alias{index.xts} \alias{index<-.xts} \alias{time<-.xts} \alias{time.xts} \alias{.index} \alias{.index<-} \alias{.indexsec} \alias{.indexmin} \alias{.indexhour} \alias{.indexmday} \alias{.indexmon} \alias{.indexyear} \alias{.indexwday} \alias{.indexbday} \alias{.indexyday} \alias{.indexisdst} \alias{.indexDate} \alias{.indexday} \alias{.indexweek} \alias{.indexyweek} \alias{convertIndex} \title{Get and Replace the Class of an xts Index} \usage{ \method{index}{xts}(x, ...) \method{index}{xts}(x) <- value \method{time}{xts}(x) <- value \method{time}{xts}(x, ...) .index(x, ...) .index(x) <- value .indexsec(x) .indexmin(x) .indexhour(x) .indexmday(x) .indexmon(x) .indexyear(x) .indexwday(x) .indexbday(x) .indexyday(x) .indexisdst(x) .indexDate(x) .indexday(x) .indexweek(x) .indexyweek(x) convertIndex(x, value) } \arguments{ \item{x}{An xts object.} \item{\dots}{Arguments passed to other methods.} \item{value}{A new time index value.} } \description{ Functions to get and replace an xts object's index values and it's components. } \details{ An xts object's index is stored internally as the number of seconds since UNIX epoch in the UTC timezone. The \code{.index()} and \verb{.index<-} functions get and replace the internal numeric value of the index, respectively. These functions are primarily for internal use, but are exported because they may be useful for users. The replacement method also updates the \code{\link[=tclass]{tclass()}} and \code{\link[=tzone]{tzone()}} of the index to match the class and timezone of the new index, respectively. The \code{index()} method converts the internal numeric index to the class specified by the 'tclass' attribute and with the timezone specified by the 'tzone' attribute before returning the index values to the user. The \code{.indexXXX()} functions below extract time components from the internal time index. They return values like the values of \link{POSIXlt} components. \describe{ \item{\code{.indexsec}}{0 - 61: seconds of the minute (local time)} \item{\code{.indexmin}}{0 - 59: minutes of the hour (local time)} \item{\code{.indexhour}}{0 - 23: hours of the day (local time)} \item{\code{.indexDate}}{date as seconds since the epoch (UTC \emph{not local time}} \item{\code{.indexday}}{date as seconds since the epoch (UTC \emph{not local time}} \item{\code{.indexwday}}{0 - 6: day of the week (Sunday - Saturday, local time)} \item{\code{.indexmday}}{1 - 31: day of the month (local time)} \item{\code{.indexweek}}{weeks since the epoch (UTC \emph{not local time}} \item{\code{.indexmon}}{0 - 11: month of the year (local time)} \item{\code{.indexyear}}{years since 1900 (local time)} \item{\code{.indexyday}}{0 - 365: day of the year (local time, 365 only in leap years)} \item{\code{.indexisdst}}{1, 0, -1: Daylight Saving Time flag. Positive if Daylight Saving Time is in effect, zero if not, negative if unknown.} } Changes in timezone, index class, and index format internal structure, by \pkg{xts} version: \describe{ \item{Version 0.12.0:}{The \code{.indexTZ}, \code{.indexCLASS} and \code{.indexFORMAT} attributes are no longer stored on xts objects, only on the index itself. \cr\cr The \code{indexTZ()}, \code{indexClass()}, and \code{indexFormat()} functions (and their respective replacement methods) are deprecated in favor of their respective \code{tzone()}, \code{tclass()}, and \code{tformat()} versions. The previous versions throw a warning that they're deprecated, but they will continue to work. They will never be removed or throw an error. Ever. \cr\cr The new versions are careful to look for the old attributes on the xts object, in case they're ever called on an xts object that was created prior to the attributes being added to the index itself. \cr\cr You can set \code{options(xts.warn.index.missing.tzone = TRUE)} and \code{options(xts.warn.index.missing.tclass = TRUE)} to identify xts objects that do not have a 'tzone' or 'tclass' attribute on the index, even if there is a 'tzone' or 'tclass' attribute on the xts object itself. The warnings will be thrown when the object is printed. Use \code{x <- as.xts(x)} to update these objects to the new structure.} \item{Version 0.9.8:}{The index timezone is now set to "UTC" for time classes that do not have any intra-day component (e.g. days, months, quarters). Previously the timezone was blank, which meant "local time" as determined by \R and the OS.} \item{Version 0.9.2:}{There are new get/set methods for the timezone, index class, and index format attributes: \code{tzone()} and, \verb{tzone<-}, \code{tclass()} and \verb{tclass<-}, and \code{tformat()} and \verb{tformat<-}. These new functions are aliases to their \code{indexTZ()}, \code{indexClass()}, and \code{indexFormat()} counterparts.} \item{Version 0.7.5:}{The timezone, index class, and index format were added as attributes to the index itself, as 'tzone', 'tclass', and 'tformat', respectively. This is in order to remove those three attributes from the xts object, so they're only on the index itself. \cr\cr The \code{indexTZ()}, \code{indexClass()}, and \code{indexFormat()} functions (and their respective replacement methods) will continue to work as in prior \pkg{xts} versions. The attributes on the index take priority over their respective counterparts that may be on the xts object.} \item{Versions 0.6.4 and prior:}{Objects track their timezone and index class in their '.indexTZ' and '.indexCLASS' attributes, respectively.} } } \examples{ x <- timeBasedSeq('2010-01-01/2010-01-01 12:00/H') x <- xts(seq_along(x), x) # the index values, converted to 'tclass' (POSIXct in this case) index(x) class(index(x)) # POSIXct tclass(x) # POSIXct # the internal numeric index .index(x) # add 1 hour (3600 seconds) to the numeric index .index(x) <- index(x) + 3600 index(x) y <- timeBasedSeq('2010-01-01/2010-01-02 12:00') y <- xts(seq_along(y), y) # Select all observations in the first 6 and last 3 minutes of the # 8th and 15th hours on each day y[.indexhour(y) \%in\% c(8, 15) & .indexmin(y) \%in\% c(0:5, 57:59)] i <- 0:60000 focal_date <- as.numeric(as.POSIXct("2018-02-01", tz = "UTC")) y <- .xts(i, c(focal_date + i * 15), tz = "UTC", dimnames = list(NULL, "value")) # Select all observations for the first minute of each hour y[.indexmin(y) == 0] # Select all observations on Monday mon <- y[.indexwday(y) == 1] head(mon) tail(mon) unique(weekdays(index(mon))) # check # Disjoint time of day selections # Select all observations between 08:30 and 08:59:59.9999 or between 12:00 and 12:14:59.99999: y[.indexhour(y) == 8 & .indexmin(y) >= 30 | .indexhour(y) == 12 & .indexmin(x) \%in\% 0:14] ### Compound selections # Select all observations for Wednesdays or Fridays between 9am and 4pm (exclusive of 4pm): y[.indexwday(y) \%in\% c(3, 5) & (.indexhour(y) \%in\% c(9:15))] # Select all observations on Monday between 8:59:45 and 09:04:30: y[.indexwday(y) == 1 & (.indexhour(y) == 8 & .indexmin(y) == 59 & .indexsec(y) >= 45 | .indexhour(y) == 9 & (.indexmin(y) < 4 | .indexmin(y) == 4 & .indexsec(y) <= 30))] i <- 0:30000 u <- .xts(i, c(focal_date + i * 1800), tz = "UTC", dimnames = list(NULL, "value")) # Select all observations for January or February: u[.indexmon(u) \%in\% c(0, 1)] # Select all data for the 28th to 31st of each month, excluding any Fridays: u[.indexmday(u) \%in\% 28:31 & .indexwday(u) != 5] # Subset by week since origin unique(.indexweek(u)) origin <- xts(1, as.POSIXct("1970-01-01")) unique(.indexweek(origin)) # Select all observations in weeks 2515 to 2517. u2 <- u[.indexweek(u) \%in\% 2515:2517] head(u2); tail(u2) # Select all observations after 12pm for day 50 and 51 in each year u[.indexyday(u) \%in\% 50:51 & .indexhour(u) >= 12] } \seealso{ \code{\link[=tformat]{tformat()}} describes how the index values are formatted when printed, \code{\link[=tclass]{tclass()}} documents how \pkg{xts} handles the index class, and \code{\link[=tzone]{tzone()}} has more information about index timezone settings. } \author{ Jeffrey A. Ryan } \keyword{ts} \keyword{utilities} xts/man/plot.xts.Rd0000644000176200001440000001440514654242576013750 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot.R \name{plot.xts} \alias{plot.xts} \alias{lines.xts} \alias{points.xts} \title{Plotting xts Objects} \usage{ \method{plot}{xts}( x, y = NULL, ..., subset = "", panels = NULL, multi.panel = FALSE, col = 1:8, up.col = NULL, dn.col = NULL, bg = "#FFFFFF", type = "l", lty = 1, lwd = 2, lend = 1, main = deparse(substitute(x)), main.timespan = TRUE, observation.based = FALSE, log = FALSE, ylim = NULL, yaxis.same = TRUE, yaxis.left = TRUE, yaxis.right = TRUE, yaxis.ticks = 5, major.ticks = "auto", minor.ticks = NULL, grid.ticks.on = "auto", grid.ticks.lwd = 1, grid.ticks.lty = 1, grid.col = "darkgray", labels.col = "#333333", format.labels = TRUE, grid2 = "#F5F5F5", legend.loc = NULL, extend.xaxis = FALSE ) \method{lines}{xts}( x, ..., main = "", on = 0, col = NULL, type = "l", lty = 1, lwd = 1, pch = 1 ) \method{points}{xts}(x, ..., main = "", on = 0, col = NULL, pch = 1) } \arguments{ \item{x}{A xts object.} \item{y}{Not used, always \code{NULL}.} \item{\dots}{Any passthrough arguments for \code{lines()} and \code{points()}.} \item{subset}{An ISO8601-style subset string.} \item{panels}{Character vector of expressions to plot as panels.} \item{multi.panel}{Either \code{TRUE}, \code{FALSE}, or an integer less than or equal to the number of columns in the data set. When \code{TRUE}, each column of the data is plotted in a separate panel. When an integer 'n', the data will be plotted in groups of 'n' columns per panel and each group will be plotted in a separate panel.} \item{col}{Color palette to use.} \item{up.col}{Color for positive bars when \code{type = "h"}.} \item{dn.col}{Color for negative bars when \code{type = "h"}.} \item{bg}{Background color of plotting area, same as in \code{\link[=par]{par()}}.} \item{type}{The type of plot to be drawn, same as in \code{\link[=plot]{plot()}}.} \item{lty}{Set the line type, same as in \code{\link[=par]{par()}}.} \item{lwd}{Set the line width, same as in \code{\link[=par]{par()}}.} \item{lend}{Set the line end style, same as in \code{\link[=par]{par()}}.} \item{main}{Main plot title.} \item{main.timespan}{Should the timespan of the series be shown in the top right corner of the plot?} \item{observation.based}{When \code{TRUE}, all the observations are equally spaced along the x-axis. When \code{FALSE} (the default) the observations on the x-axis are spaced based on the time index of the data.} \item{log}{Should the y-axis be in log scale? Default \code{FALSE}.} \item{ylim}{The range of the y axis.} \item{yaxis.same}{Should 'ylim' be the same for every panel? Default \code{TRUE}.} \item{yaxis.left}{Add y-axis labels to the left side of the plot?} \item{yaxis.right}{Add y-axis labels to the right side of the plot?} \item{yaxis.ticks}{Desired number of y-axis grid lines. The actual number of grid lines is determined by the \code{n} argument to \code{\link[=pretty]{pretty()}}.} \item{major.ticks}{Period specifying locations for major tick marks and labels on the x-axis. See Details for possible values.} \item{minor.ticks}{Period specifying locations for minor tick marks on the x-axis. When \code{NULL}, minor ticks are not drawn. See details for possible values.} \item{grid.ticks.on}{Period specifying locations for vertical grid lines. See details for possible values.} \item{grid.ticks.lwd}{Line width of the grid.} \item{grid.ticks.lty}{Line type of the grid.} \item{grid.col}{Color of the grid.} \item{labels.col}{Color of the axis labels.} \item{format.labels}{Label format to draw lower frequency x-axis ticks and labels passed to \code{\link[=axTicksByTime]{axTicksByTime()}}} \item{grid2}{Color for secondary x-axis grid.} \item{legend.loc}{Places a legend into one of nine locations on the chart: bottomright, bottom, bottomleft, left, topleft, top, topright, right, or center. Default \code{NULL} does not draw a legend.} \item{extend.xaxis}{When \code{TRUE}, extend the x-axis before and/or after the plot's existing time index range, so all of of the time index values of the new series are included in the plot. Default \code{FALSE}.} \item{on}{Panel number to draw on. A new panel will be drawn if \code{on = NA}. The default, \code{on = 0}, will add to the active panel. The active panel is defined as the panel on which the most recent action was performed. Note that only the first element of \code{on} is checked for the default behavior to add to the last active panel.} \item{pch}{the plotting character to use, same as in 'par'} } \description{ Plotting for xts objects. } \details{ Possible values for arguments \code{major.ticks}, \code{minor.ticks}, and \code{grid.ticks.on} include \sQuote{auto}, \sQuote{minute}, \sQuote{hours}, \sQuote{days}, \sQuote{weeks}, \sQuote{months}, \sQuote{quarters}, and \sQuote{years}. The default is \sQuote{auto}, which attempts to determine sensible locations from the periodicity and locations of observations. The other values are based on the possible values for the \code{ticks.on} argument of \code{\link[=axTicksByTime]{axTicksByTime()}}. } \examples{ \dontrun{ data(sample_matrix) sample.xts <- as.xts(sample_matrix) # plot the Close plot(sample.xts[,"Close"]) # plot a subset of the data plot(sample.xts[,"Close"], subset = "2007-04-01/2007-06-31") # function to compute simple returns simple.ret <- function(x, col.name){ x[,col.name] / lag(x[,col.name]) - 1 } # plot the close and add a panel with the simple returns plot(sample.xts[,"Close"]) R <- simple.ret(sample.xts, "Close") lines(R, type = "h", on = NA) # add the 50 period simple moving average to panel 1 of the plot library(TTR) lines(SMA(sample.xts[,"Close"], n = 50), on = 1, col = "blue") # add month end points to the chart points(sample.xts[endpoints(sample.xts[,"Close"], on = "months"), "Close"], col = "red", pch = 17, on = 1) # add legend to panel 1 addLegend("topright", on = 1, legend.names = c("Close", "SMA(50)"), lty = c(1, 1), lwd = c(2, 1), col = c("black", "blue", "red")) } } \references{ based on \code{\link[quantmod:quantmod-package]{chart_Series()}} in \pkg{quantmod} written by Jeffrey A. Ryan } \seealso{ \code{\link[=addSeries]{addSeries()}}, \code{\link[=addPanel]{addPanel()}} } \author{ Ross Bennett } xts/man/addSeries.Rd0000644000176200001440000000174614654242576014064 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot.R \name{addSeries} \alias{addSeries} \title{Add a time series to an existing xts plot} \usage{ addSeries( x, main = "", on = NA, type = "l", col = NULL, lty = 1, lwd = 1, pch = 1, ... ) } \arguments{ \item{x}{An xts object to add to the plot.} \item{main}{Main title for a new panel if drawn.} \item{on}{Panel number to draw on. A new panel will be drawn if \code{on = NA}.} \item{type}{The type of plot to be drawn, same as in \code{\link[=plot]{plot()}}.} \item{col}{Color palette to use, set by default to rational choices.} \item{lty}{Set the line type, same as in \code{\link[=par]{par()}}.} \item{lwd}{Set the line width, same as in \code{\link[=par]{par()}}.} \item{pch}{The type of plot to be drawn, same as in \code{\link[=par]{par()}}.} \item{\dots}{Any other passthrough graphical parameters.} } \description{ Add a time series to an existing xts plot } \author{ Ross Bennett } xts/man/isOrdered.Rd0000644000176200001440000000214114654242576014067 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/isOrdered.R \name{isOrdered} \alias{isOrdered} \title{Check If A Vector Is Ordered} \usage{ isOrdered(x, increasing = TRUE, strictly = TRUE) } \arguments{ \item{x}{A numeric vector.} \item{increasing}{Test for increasing (\code{TRUE}) or decreasing (\code{FALSE}) values?} \item{strictly}{When \code{TRUE}, vectors with duplicate values are \emph{not} considered ordered.} } \value{ A logical scalar indicating whether or not \code{x} is ordered. } \description{ Check if a vector is strictly increasing, strictly decreasing, not decreasing, or not increasing. } \details{ Designed for internal use with \pkg{xts}, this provides highly optimized tests for ordering. } \examples{ # strictly increasing isOrdered(1:10, increasing=TRUE) isOrdered(1:10, increasing=FALSE) isOrdered(c(1,1:10), increasing=TRUE) isOrdered(c(1,1:10), increasing=TRUE, strictly=FALSE) # decreasing isOrdered(10:1, increasing=TRUE) isOrdered(10:1, increasing=FALSE) } \seealso{ \code{\link[=is.unsorted]{is.unsorted()}} } \author{ Jeffrey A. Ryan } \keyword{misc} xts/man/addPanel.Rd0000644000176200001440000000367014654242576013667 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot.R \name{addPanel} \alias{addPanel} \title{Add a panel to an existing xts plot} \usage{ addPanel( FUN, main = "", on = NA, type = "l", col = NULL, lty = 1, lwd = 1, pch = 1, ... ) } \arguments{ \item{FUN}{An xts object to plot.} \item{main}{Main title for a new panel if drawn.} \item{on}{Panel number to draw on. A new panel will be drawn if \code{on = NA}.} \item{type}{The type of plot to be drawn, same as in \code{\link[=plot]{plot()}}.} \item{col}{Color palette to use, set by default to rational choices.} \item{lty}{Set the line type, same as in \code{\link[=par]{par()}}.} \item{lwd}{Set the line width, same as in \code{\link[=par]{par()}}.} \item{pch}{The type of plot to be drawn, same as in \code{\link[=par]{par()}}.} \item{\dots}{Additional named arguments passed through to \code{FUN} and any other graphical passthrough parameters.} } \description{ Apply a function to the data of an existing xts plot object and plot the result on an existing or new panel. \code{FUN} should have arguments \code{x} or \code{R} for the data of the existing xts plot object to be passed to. All other additional arguments for \code{FUN} are passed through \dots. } \examples{ library(xts) data(sample_matrix) sample.xts <- as.xts(sample_matrix) calcReturns <- function(price, method = c("discrete", "log")){ px <- try.xts(price) method <- match.arg(method)[1L] returns <- switch(method, simple = , discrete = px / lag(px) - 1, compound = , log = diff(log(px))) reclass(returns, px) } # plot the Close plot(sample.xts[,"Close"]) # calculate returns addPanel(calcReturns, method = "discrete", type = "h") # Add simple moving average to panel 1 addPanel(rollmean, k = 20, on = 1) addPanel(rollmean, k = 40, col = "blue", on = 1) } \seealso{ \code{\link[=plot.xts]{plot.xts()}}, \code{\link[=addSeries]{addSeries()}} } \author{ Ross Bennett } xts/man/xts-package.Rd0000644000176200001440000000163214654242576014362 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/xts-package.R \docType{package} \name{xts-package} \alias{xts-package} \title{xts: extensible time-series} \description{ Extensible time series class and methods, extending and behaving like zoo. } \details{ Easily convert one of \R's many time-series (and non-time-series) classes to a true time-based object which inherits all of zoo's methods, while allowing for new time-based tools where appropriate. Additionally, one may use \pkg{xts} to create new objects which can contain arbitrary attributes named during creation as name=value pairs. } \seealso{ \code{\link[=xts]{xts()}}, \code{\link[=as.xts]{as.xts()}}, \code{\link[=reclass]{reclass()}}, \code{\link[zoo:zoo]{zoo()}} } \author{ Jeffrey A. Ryan and Joshua M. Ulrich Maintainer: Joshua M. Ulrich \href{mailto:josh.m.ulrich@gmail.com}{josh.m.ulrich@gmail.com} } \keyword{package} xts/man/addEventLines.Rd0000644000176200001440000000274414654242576014705 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot.R \name{addEventLines} \alias{addEventLines} \title{Add vertical lines to an existing xts plot} \usage{ addEventLines(events, main = "", on = 0, lty = 1, lwd = 1, col = 1, ...) } \arguments{ \item{events}{An xts object of events and their associated labels. It is ensured that the first column of \code{events} is the event description/label.} \item{main}{Main title for a new panel, if drawn.} \item{on}{Panel number to draw on. A new panel will be drawn if \code{on = NA}. The default, \code{on = 0}, will add to the active panel. The active panel is defined as the panel on which the most recent action was performed. Note that only the first element of \code{on} is checked for the default behavior to add to the last active panel.} \item{lty}{Set the line type, same as in \code{\link[=par]{par()}}.} \item{lwd}{Set the line width, same as in \code{\link[=par]{par()}}.} \item{col}{Color palette to use, set by default to rational choices.} \item{\dots}{Any other passthrough parameters to \code{\link[=text]{text()}} to control how the event labels are drawn.} } \description{ Add vertical lines and labels to an existing xts plot. } \examples{ \dontrun{ library(xts) data(sample_matrix) sample.xts <- as.xts(sample_matrix) events <- xts(letters[1:3], as.Date(c("2007-01-12", "2007-04-22", "2007-06-13"))) plot(sample.xts[,4]) addEventLines(events, srt = 90, pos = 2) } } \author{ Ross Bennett } xts/man/diff.xts.Rd0000644000176200001440000000451314702273523013667 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/lag.xts.R \name{lag.xts} \alias{lag.xts} \alias{diff.xts} \title{Lags and Differences of xts Objects} \usage{ \method{lag}{xts}(x, k = 1, na.pad = TRUE, ...) \method{diff}{xts}( x, lag = 1, differences = 1, arithmetic = TRUE, log = FALSE, na.pad = TRUE, ... ) } \arguments{ \item{x}{An xts object.} \item{k}{Number of periods to shift.} \item{na.pad}{Should \code{NA} be added so the result has the same number of observations as \code{x}?} \item{\dots}{Additional arguments.} \item{lag}{Period to difference over.} \item{differences}{Order of differencing.} \item{arithmetic}{Should arithmetic or geometric differencing be used?} \item{log}{Should (geometric) log differences be returned?} } \value{ An xts object with the desired lag and/or differencing. } \description{ Methods for computing lags and differences on xts objects. This provides similar functionality as the \pkg{zoo} counterparts, but with some different defaults. } \details{ The primary motivation for these methods was to take advantage of a faster C-level implementation. Another motivation was to make \code{lag()} behave using standard sign for \code{k}. Both \link[zoo:lag.zoo]{zoo's lag() method} and \code{\link[=lag.default]{lag.default()}} require a \emph{negative} value for \code{k} in order to shift a series backward. So \code{k = 1}, shifts the series \emph{forward} one observation. This is especially confusing because \code{k = 1} is the default for those functions. When \code{x} is an xts object, \code{lag(x, 1)} returns an object where the value at time 't' is the value at time 't-1' in the original object. Another difference is that \code{na.pad = TRUE} by default, to better reflect the transformation visually and for functions the require positional alignment of data. Set \code{options(xts.compat.zoo.lag = TRUE)} to use make \code{lag.xts()} consistent with \code{lag.zoo()} by reversing the sign of \code{k} and setting \code{na.pad = FALSE}. } \examples{ x <- xts(1:10, Sys.Date()+1:10) lag(x) # currently using xts-style positive k lag(x, k=2) lag(x, k=-1, na.pad=FALSE) # matches lag.zoo(x, k=1) diff(x) diff(x, lag=1) diff(x, diff=2) diff(diff(x)) } \references{ \url{https://en.wikipedia.org/wiki/Lag} } \author{ Jeffrey A. Ryan } \keyword{chron} \keyword{manip} xts/man/dimnames.xts.Rd0000644000176200001440000000217514654242576014570 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dimnames.R \name{dimnames.xts} \alias{dimnames.xts} \alias{dimnames<-.xts} \title{Dimnames of an xts Object} \usage{ \method{dimnames}{xts}(x) \method{dimnames}{xts}(x) <- value } \arguments{ \item{x}{An xts object.} \item{value}{A two element list. See Details.} } \value{ A list or character string containing coerced row names and/or actual column names. Attempts to set rownames on xts objects via rownames or dimnames will silently fail. } \description{ Get or set dimnames of an xts object. } \details{ For efficienty, xts objects do not have rownames (unlike zoo objects). Attempts to set rownames on an xts object will silently set them to \code{NULL}. This is done for internal compatibility reasons, as well as to provide consistency in performance regardless of object use. } \note{ Unlike zoo, all xts objects have dimensions. xts objects cannot be plain vectors. } \examples{ x <- xts(1:10, Sys.Date()+1:10) dimnames(x) rownames(x) rownames(x) <- 1:10 rownames(x) str(x) } \seealso{ \code{\link[=xts]{xts()}} } \author{ Jeffrey A. Ryan } \keyword{misc} xts/man/endpoints.Rd0000644000176200001440000000345214654242576014160 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/endpoints.R \name{endpoints} \alias{endpoints} \title{Locate Endpoints by Time} \usage{ endpoints(x, on = "months", k = 1) } \arguments{ \item{x}{An xts object.} \item{on}{A character string specifying the period.} \item{k}{The number of periods each endpoint should cover.} } \value{ A numeric vector of beginning with 0 and ending with the number of of observations in \code{x}. } \description{ Extract index locations for an xts object that correspond to the \emph{last} observation in each period specified by \code{on} and \code{k}. } \details{ \code{endpoints()} returns a numeric vector that always begins with zero and ends with the number of observations in \code{x}. Periods are always based on the distance from the UNIX epoch (midnight 1970-01-01 UTC), \emph{not the first observation in \code{x}}. See the examples. Valid values for the \code{on} argument are: \dQuote{us} (microseconds), \dQuote{microseconds}, \dQuote{ms} (milliseconds), \dQuote{milliseconds}, \dQuote{secs} (seconds), \dQuote{seconds}, \dQuote{mins} (minutes), \dQuote{minutes}, \dQuote{hours}, \dQuote{days}, \dQuote{weeks}, \dQuote{months}, \dQuote{quarters}, and \dQuote{years}. } \examples{ data(sample_matrix) endpoints(sample_matrix) endpoints(sample_matrix, "weeks") ### example of how periods are based on the UNIX epoch, ### *not* the first observation of the data series x <- xts(1:38, yearmon(seq(2018 - 1/12, 2021, 1/12))) # endpoints for the end of every other year ep <- endpoints(x, "years", k = 2) # Dec-2017 is the end of the *first* year in the data. But when you start from # Jan-1970 and use every second year end as your endpoints, the endpoints are # always December of every odd year. x[ep, ] } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/ndays.Rd0000644000176200001440000000230714654242576013271 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/nperiods.R \name{nseconds} \alias{nseconds} \alias{nminutes} \alias{nhours} \alias{ndays} \alias{nweeks} \alias{nmonths} \alias{nquarters} \alias{nyears} \title{Number of Periods in Data} \usage{ nseconds(x) nminutes(x) nhours(x) ndays(x) nweeks(x) nmonths(x) nquarters(x) nyears(x) } \arguments{ \item{x}{A time-based object.} } \value{ The number of respective periods in \code{x}. } \description{ Calculate the number of specified periods in a given time series like data object. } \details{ Essentially a wrapper to \code{endpoints()} with the appropriate period specified. The result is the number of endpoints found. As a compromise between simplicity and accuracy, the results will always round up to the nearest complete period. Subtract 1 from the result to get the completed periods. For finer grain detail one should call the higher frequency functions. An alternative summary can be found with \code{periodicity(x)} and \code{unclass(periodicity(x))}. } \examples{ \dontrun{ getSymbols("QQQQ") ndays(QQQQ) nweeks(QQQQ) } } \seealso{ \code{\link[=endpoints]{endpoints()}} } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/print.xts.Rd0000644000176200001440000000211414702270377014112 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/print.R \name{print.xts} \alias{print.xts} \title{Print An xts Time-Series Object} \usage{ \method{print}{xts}(x, fmt, ..., show.rows = 10, max.rows = 100) } \arguments{ \item{x}{An xts object.} \item{fmt}{Passed to \code{\link[zoo:coredata]{coredata()}} to format the time index.} \item{\dots}{Arguments passed to other methods.} \item{show.rows}{The number of first and last rows to print if the number of rows is truncated (default 10, or \code{getOption("xts.print.show.rows")}).} \item{max.rows}{The output will contain at most \code{max.rows} rows before being truncated (default 100, or \code{getOption("xts.print.max.rows")}).} } \value{ Returns \code{x} invisibly. } \description{ Method for printing an extensible time-series object. } \examples{ data(sample_matrix) sample.xts <- as.xts(sample_matrix) # output is truncated and shows first and last 10 observations print(sample.xts) # show the first and last 5 observations print(sample.xts, show.rows = 5) } \author{ Joshua M. Ulrich } \keyword{print} xts/man/periodicity.Rd0000644000176200001440000000405314654242576014477 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/periodicity.R \name{periodicity} \alias{periodicity} \title{Approximate Series Periodicity} \usage{ periodicity(x, ...) } \arguments{ \item{x}{A time-series-like object.} \item{\dots}{Unused.} } \value{ A 'periodicity' object with the following elements: \itemize{ \item the \code{difftime} object, \item frequency: the median time difference between observations \item start: the first observation \item end: the last observation \item units: one of secs, mins, hours, or days \item scale: one of seconds, minute, hourly, daily, weekly, monthly, quarterly, or yearly \item label: one of second, minute, hour, day, week, month, quarter, year } Possible \code{scale} values are: \sQuote{minute}, \sQuote{hourly}, \sQuote{daily}, \sQuote{weekly}, \sQuote{monthly}, \sQuote{quarterly}, and \sQuote{yearly}. } \description{ Estimate the periodicity of a time-series-like object by calculating the median time between observations in days. } \details{ A simple wrapper to quickly estimate the periodicity of a given data. Returning an object of type \code{periodicity}. This calculates the median time difference between observations as a difftime object, the numerical difference, the units of measurement, and the derived scale of the data as a string. The time index currently must be of either a 'Date' or 'POSIXct' class, or or coercible to one of them. The 'scale' component of the result is an estimate of the periodicity of the data in common terms - e.g. 7 day daily data is best described as 'weekly', and would be returned as such. } \note{ This function only attempts to be a \emph{good estimate} for the underlying periodicity. If the series is too short, or has highly irregular periodicity, the return values will not be accurate. That said, it is quite robust and used internally within \pkg{xts}. } \examples{ zoo.ts <- zoo(rnorm(231),as.Date(13514:13744,origin="1970-01-01")) periodicity(zoo.ts) } \seealso{ \code{\link[=difftime]{difftime()}} } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/as.environment.xts.Rd0000644000176200001440000000201514654242576015732 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/as.environment.xts.R \name{as.environment.xts} \alias{as.environment.xts} \title{Coerce an xts Object to an Environment by Column} \usage{ \method{as.environment}{xts}(x) } \arguments{ \item{x}{An xts object.} } \value{ An environment containing \code{ncol(x)} vectors extracted by column from \code{x}. } \description{ Method to automatically convert an xts object to an environment containing vectors representing each column of the original xts object. The name of each object in the resulting environment corresponds to the name of the column of the xts object. } \note{ Environments do not preserve (or have knowledge) of column order and cannot be subset by an integer index. } \examples{ x <- xts(1:10, Sys.Date()+1:10) colnames(x) <- "X" y <- xts(1:10, Sys.Date()+1:10) colnames(x) <- "Y" xy <- cbind(x,y) colnames(xy) e <- as.environment(xy) # currently using xts-style positive k ls(xy) ls.str(xy) } \author{ Jeffrey A. Ryan } \keyword{manip} xts/man/xts-internals.Rd0000644000176200001440000000525514654242576014773 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/xts-package.R \name{xts-internals} \alias{xts-internals} \title{Internal Documentation} \description{ This help file is to help in development of xts, as well as provide some clarity and insight into its purpose and implementation. } \details{ Last modified: 2008-08-06 by Jeffrey A. Ryan Version: 0.5-0 and above The \pkg{xts} package xts designed as a drop-in replacement for the very popular \pkg{zoo} package. Most all functionality of zoo has been extended or carries into the xts package. Notable changes in direction include the use of time-based indexing, at first explicitely, now implicitely. An xts object consists of data in the form of a matrix, an index - ordered and increasing, either numeric or integer, and additional attributes for use internally, or for end-user purposes. The current implementation enforces two major rules on the object. One is that the index must be coercible to numeric, by way of \code{as.POSIXct}. There are defined types that meet this criteria. See \code{timeBased} for details. The second requirement is that the object cannot have rownames. The motivation from this comes in part from the work Matthew Doyle has done in his data.table class, in the package of the same name. Rownames in must be character vectors, and as such are inefficient in both storage and conversion. By eliminating the rownames, and providing a numeric index of internal type \code{REAL} or \code{INTEGER}, it is possible to maintain a connection to standard date and time classes via the POSIXct functions, while at at the same time maximizing efficiencies in data handling. User level functions \code{index}, as well as conversion to other classes proceeds as if there were rownames. The code for \code{index} automatically converts time to numeric in both extraction and replacement functionality. This provides a level of abstraction to facilitate internal, and external package use and inter-operability. There is also new work on providing a C-level API to some of the xts functionality to facilitate external package developers to utilize the fast utility routines such as subsetting and merges, without having to call only from . Obviously this places far more burden on the developer to not only understand the internal xts implementation, but also to understand all of what is documented for R-internals (and much that isn't). At present the functions and macros available can be found in the \sQuote{xts.h} file in the src directory. There is no current documentation for this API. The adventure starts here. Future documentation is planned, not implemented. } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/addPolygon.Rd0000644000176200001440000000265414654242576014260 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot.R \name{addPolygon} \alias{addPolygon} \title{Add a polygon to an existing xts plot} \usage{ addPolygon(x, y = NULL, main = "", on = NA, col = NULL, ...) } \arguments{ \item{x}{An xts object to plot. Must contain 2 columns for the upper and the lower y coordinates for the polygon. The first column is interpreted as upper y coordinates and the second column as the lower y coordinates.} \item{y}{\code{NULL}, not used.} \item{main}{Main title for a new panel, if drawn.} \item{on}{Panel number to draw on. A new panel will be drawn if \code{on = NA}.} \item{col}{Color palette to use, set by default to rational choices.} \item{\dots}{Any other passthrough parameters to \code{\link[=par]{par()}}.} } \description{ Draw a polygon on an existing xts plot by specifying a time series of y coordinates. The xts index is used for the x coordinates and the first two columns are the upper and lower y coordinates, respectively. } \examples{ \dontrun{ library(xts) data(sample_matrix) x <- as.xts(sample_matrix)[,1] ix <- index(x["2007-02"]) shade <- xts(matrix(rep(range(x), each = length(ix)), ncol = 2), ix) plot(x) # set on = -1 to draw the shaded region *behind* the main series addPolygon(shade, on = -1, col = "lightgrey") } } \references{ Based on code by Dirk Eddelbuettel from \url{http://dirk.eddelbuettel.com/blog/2011/01/16/} } \author{ Ross Bennett } xts/man/align.time.Rd0000644000176200001440000000222614654242576014202 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/adj.time.R, R/align.time.R \name{adj.time} \alias{adj.time} \alias{align.time} \alias{align.time.xts} \alias{shift.time} \title{Align seconds, minutes, and hours to beginning of next period.} \usage{ adj.time(x, ...) align.time(x, ...) \method{align.time}{xts}(x, n = 60, ...) shift.time(x, n = 60, ...) } \arguments{ \item{x}{Object containing timestamps to align.} \item{\dots}{Additional arguments. See details.} \item{n}{Number of seconds to adjust by.} } \value{ A new object with the same class as \code{x}. } \description{ Change timestamps to the start of the next period, specified in multiples of seconds. } \details{ This function is an S3 generic. The result is to round up to the next period determined by 'n modulo x'. } \examples{ x <- Sys.time() + 1:1000 # every 10 seconds align.time(x, 10) # align to next whole minute align.time(x, 60) # align to next whole 10 min interval align.time(x, 10 * 60) } \seealso{ \code{\link[=to.period]{to.period()}} } \author{ Jeffrey A. Ryan with input from Brian Peterson } \keyword{chron} \keyword{manip} \keyword{misc} \keyword{ts} xts/man/addLegend.Rd0000644000176200001440000000224614654242576014024 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot.R \name{addLegend} \alias{addLegend} \title{Add Legend} \usage{ addLegend( legend.loc = "topright", legend.names = NULL, col = NULL, ncol = 1, on = 0, ... ) } \arguments{ \item{legend.loc}{One of nine locations: bottomright, bottom, bottomleft, left, topleft, top, topright, right, or center.} \item{legend.names}{Character vector of names for the legend. When \code{NULL}, the column names of the current plot object are used.} \item{col}{Fill colors for the legend. When \code{NULL}, the colorset of the current plot object data is used.} \item{ncol}{Number of columns for the legend.} \item{on}{Panel number to draw on. A new panel will be drawn if \code{on = NA}. The default, \code{on = 0}, will add to the active panel. The active panel is defined as the panel on which the most recent action was performed. Note that only the first element of \code{on} is checked for the default behavior to add to the last active panel.} \item{\dots}{Any other passthrough parameters to \code{\link[=legend]{legend()}}.} } \description{ Add a legend to an existing panel. } \author{ Ross Bennett } xts/man/na.locf.xts.Rd0000644000176200001440000000270414654242576014311 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/na.R \name{na.locf.xts} \alias{na.locf.xts} \title{Last Observation Carried Forward} \usage{ \method{na.locf}{xts}(object, na.rm = FALSE, fromLast = FALSE, maxgap = Inf, ...) } \arguments{ \item{object}{An xts object.} \item{na.rm}{Logical indicating whether leading/trailing \code{NA} should be removed. The default is \code{FALSE} unlike the zoo method.} \item{fromLast}{Logical indicating whether observations should be carried backward rather than forward. Default is \code{FALSE}.} \item{maxgap}{Consecutive runs of observations more than 'maxgap' will remain \code{NA}. See \code{\link[zoo:zoo]{na.locf()}} for details.} \item{\dots}{Unused.} } \value{ An object where each \code{NA} in \code{object} is replaced by the most recent non-NA prior to it. See \code{\link[zoo:zoo]{na.locf()}} for details. } \description{ \pkg{xts} method replace \code{NA} with most recent non-NA } \details{ This is the \pkg{xts} method for the S3 generic \code{na.locf()}. The primary difference to note is that after the \code{NA} fill action is carried out, the default it to leave trailing or leading \code{NA}'s in place. This is different than \pkg{zoo} behavior. } \examples{ x <- xts(1:10, Sys.Date()+1:10) x[c(1,2,5,9,10)] <- NA x na.locf(x) na.locf(x, fromLast=TRUE) na.locf(x, na.rm=TRUE, fromLast=TRUE) } \seealso{ \code{\link[zoo:zoo]{na.locf()}} } \author{ Jeffrey A. Ryan } \keyword{misc} xts/man/tformat.Rd0000644000176200001440000000356214702273776013633 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tformat.R \name{tformat} \alias{tformat} \alias{tformat<-} \alias{indexFormat} \alias{indexFormat<-} \title{Get or Replace the Format of an xts Object's Index} \usage{ tformat(x, ...) tformat(x) <- value indexFormat(x) indexFormat(x) <- value } \arguments{ \item{x}{An xts object.} \item{\dots}{Arguments passed to other methods.} \item{value}{New index format string (see \code{\link[=strptime]{strptime()}} details for valid values).} } \value{ A vector containing the format for the object's index. } \description{ Generic functions to get or replace the format that determines how an xts object's index is printed. } \details{ Valid values for the \code{value} argument are the same as specified in the \emph{Details} section of \code{\link[=strptime]{strptime()}}. An xts object's \code{tformat} is \code{NULL} by default, so the index will be be formatted according to its \code{\link[=tclass]{tclass()}} (e.g. Date, POSIXct, timeDate, yearmon, etc.). The \code{tformat} only changes how the index is \emph{printed} and how the row names are formatted when xts objects are converted to other classes (e.g. matrix or data.frame). It does not affect the internal index in any way. } \note{ Both \code{indexFormat()} and \verb{indexFormat<-} are deprecated in favor of \code{tformat()} and \verb{tformat<-}, respectively. } \examples{ x <- timeBasedSeq('2010-01-01/2010-01-02 12:00') x <- xts(seq_along(x), x) # set a custom index format head(x) tformat(x) <- "\%Y-\%b-\%d \%H:\%M:\%OS3" head(x) } \seealso{ \code{\link[=index.xts]{index()}} has more information on the xts index, \code{\link[=tclass]{tclass()}} details how \pkg{xts} handles the class of the index, \code{\link[=tzone]{tzone()}} has more information about the index timezone settings. } \author{ Jeffrey A. Ryan } \keyword{ts} \keyword{utilities} xts/man/merge.xts.Rd0000644000176200001440000000711314702273440014053 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/merge.R \name{merge.xts} \alias{merge.xts} \alias{cbind.xts} \title{Merge xts Objects} \usage{ \method{merge}{xts}( ..., all = TRUE, fill = NA, suffixes = NULL, join = "outer", retside = TRUE, retclass = "xts", tzone = NULL, drop = NULL, check.names = NULL ) \method{cbind}{xts}(..., all = TRUE, fill = NA, suffixes = NULL) } \arguments{ \item{\dots}{One or more xts objects, or objects coercible to class xts.} \item{all}{A logical vector indicating merge type.} \item{fill}{Values to be used for missing elements.} \item{suffixes}{Suffix to be added to merged column names.} \item{join}{Type of database join. One of 'outer', 'inner', 'left', or 'right'.} \item{retside}{Which side of the merged object should be returned (2-case only)?} \item{retclass}{Either a logical value indicating whether the result should have a 'class' attribute, or the name of the desired class for the result.} \item{tzone}{Time zone to use for the merged result.} \item{drop}{Not currently used.} \item{check.names}{Use \code{\link[=make.names]{make.names()}} to ensure column names are vaild \R object names?} } \value{ A new xts object containing the appropriate elements of the objects passed in to be merged. } \description{ Perform merge operations on xts objects by time index. } \details{ This xts method is compatible with \link[zoo:merge.zoo]{zoo's merge() method} but implemented almost entirely in C-level code for efficiency. The function can perform all common database join operations along the time index by setting 'join' to one of the values below. Note that 'left' and 'right' are only implemented for two objects. \itemize{ \item outer: full outer (all rows in all objects) \item inner: only rows with common indexes in all objects \item left: all rows in the first object, and rows from the second object that have the same index as the first object \item right: all rows in the second object, and rows from the first object that have the same index as the second object } The above join types can also be accomplished by setting 'all' to one of the values below. \itemize{ \item outer: \code{all = TRUE} or \code{all = c(TRUE, TRUE)} \item inner: \code{all = FALSE} or \code{all = c(FALSE, FALSE)} \item left: \code{all = c(TRUE, FALSE)} \item right: \code{all = c(FALSE, TRUE)} } The result will have the timezone of the leftmost argument if available. Use the 'tzone' argument to override the default behavior. When \code{retclass = NULL} the joined objects will be split and reassigned silently back to the original environment they are called from. This is for backward compatibility with zoo, but unused by xts. When \code{retclass = FALSE} the object will be stripped of its class attribute. This is for internal use. See the examples in order to join using an 'all' argument that is the same arguments to join, like you can do with \code{merge.zoo()}. } \note{ This is a highly optimized merge, specifically designed for ordered data. The only supported merging is based on the underlying time index. } \examples{ (x <- xts(4:10, Sys.Date()+4:10)) (y <- xts(1:6, Sys.Date()+1:6)) merge(x,y) merge(x,y, join='inner') merge(x,y, join='left') merge(x,y, join='right') merge.zoo(zoo(x),zoo(y),zoo(x), all=c(TRUE, FALSE, TRUE)) merge(merge(x,x),y,join='left')[,c(1,3,2)] # zero-width objects (only index values) can be used xi <- xts( , index(x)) merge(y, xi) } \references{ Merge Join Discussion: \url{https://learn.microsoft.com/en-us/archive/blogs/craigfr/merge-join} } \author{ Jeffrey A. Ryan } \keyword{manip} \keyword{utilities} xts/man/to.period.Rd0000644000176200001440000001163414654242576014061 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/toperiod.R \name{to.period} \alias{to.period} \alias{to_period} \alias{to.minutes} \alias{to.minutes3} \alias{to.minutes5} \alias{to.minutes10} \alias{to.minutes15} \alias{to.minutes30} \alias{to.hourly} \alias{to.daily} \alias{to.weekly} \alias{to.monthly} \alias{to.quarterly} \alias{to.yearly} \title{Convert time series data to an OHLC series} \usage{ to.period( x, period = "months", k = 1, indexAt = NULL, name = NULL, OHLC = TRUE, ... ) to.minutes(x, k, name, ...) to.minutes3(x, name, ...) to.minutes5(x, name, ...) to.minutes10(x, name, ...) to.minutes15(x, name, ...) to.minutes30(x, name, ...) to.hourly(x, name, ...) to.daily(x, drop.time = TRUE, name, ...) to.weekly(x, drop.time = TRUE, name, ...) to.monthly(x, indexAt = "yearmon", drop.time = TRUE, name, ...) to.quarterly(x, indexAt = "yearqtr", drop.time = TRUE, name, ...) to.yearly(x, drop.time = TRUE, name, ...) } \arguments{ \item{x}{A univariate or OHLC type time-series object.} \item{period}{Period to convert to. See details.} \item{k}{Number of sub periods to aggregate on (only for minutes and seconds).} \item{indexAt}{Convert final index to new class or date. See details.} \item{name}{Override column names?} \item{OHLC}{Should an OHLC object be returned? (only \code{OHLC = TRUE} currently supported)} \item{\dots}{Additional arguments.} \item{drop.time}{Remove time component of POSIX datestamp (if any)?} } \value{ An object of the original type, with new periodicity. } \description{ Convert an OHLC or univariate object to a specified periodicity lower than the given data object. For example, convert a daily series to a monthly series, or a monthly series to a yearly one, or a one minute series to an hourly series. } \details{ The result will contain the open and close for the given period, as well as the maximum and minimum over the new period, reflected in the new high and low, respectively. Aggregate volume will also be calculated if applicable. An easy and reliable way to convert one periodicity of data into any new periodicity. It is important to note that all dates will be aligned to the \emph{end} of each period by default - with the exception of \code{to.monthly()} and \code{to.quarterly()}, which use the \pkg{zoo} package's \link[zoo:zoo]{yearmon} and \link[zoo:zoo]{yearqtr} classes, respectively. Valid period character strings include: \code{"seconds"}, \code{"minutes"}, \code{"hours"}, \code{"days"}, \code{"weeks"}, \code{"months"}, \code{"quarters"}, and \code{"years"}. These are calculated internally via \code{\link[=endpoints]{endpoints()}}. See that function's help page for further details. To adjust the final indexing style, it is possible to set \code{indexAt} to one of the following: \sQuote{yearmon}, \sQuote{yearqtr}, \sQuote{firstof}, \sQuote{lastof}, \sQuote{startof}, or \sQuote{endof}. The final index will then be \code{yearmon}, \code{yearqtr}, the first time of the period, the last time of the period, the starting time in the data for that period, or the ending time in the data for that period, respectively. It is also possible to pass a single time series, such as a univariate exchange rate, and return an OHLC object of lower frequency - e.g. the weekly OHLC of the daily series. Setting \code{drop.time = TRUE} (the default) will convert a series that includes a time component into one with just a date index, since the time component is often of little value in lower frequency series. } \note{ In order for this function to work properly on OHLC data, it is necessary that the Open, High, Low and Close columns be names as such; including the first letter capitalized and the full spelling found. Internally a call is made to reorder the data into the correct column order, and then a verification step to make sure that this ordering and naming has succeeded. All other data formats must be aggregated with functions such as \code{aggregate()} and \code{period.apply()}. This method should work on almost all time-series-like objects. Including \sQuote{timeSeries}, \sQuote{zoo}, \sQuote{ts}, and \sQuote{irts}. It is even likely to work well for other data structures - including \sQuote{data.frames} and \sQuote{matrix} objects. Internally a call to \code{as.xts()} converts the original \code{x} into the universal xts format, and then re-converts back to the original type. A special note with respect to \sQuote{ts} objects. As these are strictly regular they may include \code{NA} values. These are removed before aggregation, though replaced before returning the result. This inevitably leads to many additional \code{NA} values in the result. Consider using an xts object or converting to xts using \code{as.xts()}. } \examples{ data(sample_matrix) samplexts <- as.xts(sample_matrix) to.monthly(samplexts) to.monthly(sample_matrix) str(to.monthly(samplexts)) str(to.monthly(sample_matrix)) } \author{ Jeffrey A. Ryan } \keyword{utilities} xts/man/window.xts.Rd0000644000176200001440000000446514654242576014306 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/xts.methods.R \name{window.xts} \alias{window.xts} \title{Extract Time Windows from xts Objects} \usage{ \method{window}{xts}(x, index. = NULL, start = NULL, end = NULL, ...) } \arguments{ \item{x}{An xts object.} \item{index.}{A user defined time index (default \code{.index(x)}).} \item{start}{A start time coercible to POSIXct.} \item{end}{An end time coercible to POSIXct.} \item{\dots}{Unused.} } \value{ The subset of \code{x} that matches the time window. } \description{ Method for extracting time windows from xts objects. } \details{ The xts \code{window()} method provides an efficient way to subset an xts object between a start and end date using a binary search algorithm. Specifically, it converts \code{start} and \code{end} to POSIXct and then does a binary search of the index to quickly return a subset of \code{x} between \code{start} and \code{end}. Both \code{start} and \code{end} may be any class that is convertible to POSIXct, such as a character string in the format \sQuote{yyyy-mm-dd}. When \code{start = NULL} the returned subset will begin at the first value of \code{index.}. When \code{end = NULL} the returned subset will end with the last value of \code{index.}. Otherwise the subset will contain all timestamps where \code{index.} is between \code{start} and \code{end}, inclusive. When \code{index.} is specified, \code{\link[=findInterval]{findInterval()}} is used to quickly retrieve large sets of sorted timestamps. For the best performance, \code{index.} must be a \emph{sorted} POSIXct vector or a numeric vector of seconds since the epoch. \code{index.} is typically a subset of the timestamps in \code{x}. } \examples{ ## xts example x.date <- as.Date(paste(2003, rep(1:4, 4:1), seq(1,19,2), sep = "-")) x <- xts(matrix(rnorm(20), ncol = 2), x.date) x window(x, start = "2003-02-01", end = "2003-03-01") window(x, start = as.Date("2003-02-01"), end = as.Date("2003-03-01")) window(x, index. = x.date[1:6], start = as.Date("2003-02-01")) window(x, index. = x.date[c(4, 8, 10)]) ## Assign to subset window(x, index. = x.date[c(4, 8, 10)]) <- matrix(1:6, ncol = 2) x } \seealso{ \code{\link[=subset.xts]{subset.xts()}}, \code{\link[=findInterval]{findInterval()}}, \code{\link[=xts]{xts()}} } \author{ Corwin Joy } \keyword{ts} xts/DESCRIPTION0000644000176200001440000000231714703523232012602 0ustar liggesusersPackage: xts Type: Package Title: eXtensible Time Series Version: 0.14.1 Authors@R: c( person(given=c("Jeffrey","A."), family="Ryan", role=c("aut","cph")), person(given=c("Joshua","M."), family="Ulrich", role=c("cre","aut"), email="josh.m.ulrich@gmail.com"), person(given="Ross", family="Bennett", role="ctb"), person(given="Corwin", family="Joy", role="ctb") ) Depends: R (>= 3.6.0), zoo (>= 1.7-12) Imports: methods LinkingTo: zoo Suggests: timeSeries, timeDate, tseries, chron, tinytest LazyLoad: yes Description: Provide for uniform handling of R's different time-based data classes by extending zoo, maximizing native format information preservation and allowing for user level customization and extension, while simplifying cross-class interoperability. License: GPL (>= 2) URL: https://joshuaulrich.github.io/xts/, https://github.com/joshuaulrich/xts BugReports: https://github.com/joshuaulrich/xts/issues Encoding: UTF-8 NeedsCompilation: yes Packaged: 2024-10-15 15:25:09 UTC; josh Author: Jeffrey A. Ryan [aut, cph], Joshua M. Ulrich [cre, aut], Ross Bennett [ctb], Corwin Joy [ctb] Maintainer: Joshua M. Ulrich Repository: CRAN Date/Publication: 2024-10-15 17:30:02 UTC