RcppAnnoy/0000755000176200001440000000000013562516156012175 5ustar liggesusersRcppAnnoy/NAMESPACE0000644000176200001440000000022613132210432013371 0ustar liggesusersuseDynLib(RcppAnnoy, .registration=TRUE) import(methods, Rcpp) exportPattern("^[[:alpha:]]+") # export all identifiers starting with letters RcppAnnoy/demo/0000755000176200001440000000000012427557230013116 5ustar liggesusersRcppAnnoy/demo/simpleExample.R0000644000176200001440000000104612427546253016052 0ustar liggesusers ## cf the simple example at https://github.com/spotify/annoy library(RcppAnnoy) set.seed(123) # be reproducible f <- 40 a <- new(AnnoyEuclidean, f) n <- 50 # not specified for (i in seq(n)) { v <- rnorm(f) a$addItem(i-1, v) } a$build(50) # 50 trees a$save("/tmp/test.tree") b <- new(AnnoyEuclidean, f) # new object, could be in another process b$load("/tmp/test.tree") # super fast, will just mmap the file print(b$getNNsByItem(0, 40)) RcppAnnoy/demo/00Index0000644000176200001440000000005412427504071014242 0ustar liggesuserssimpleExample A first introductory example RcppAnnoy/ChangeLog0000644000176200001440000002655413562375340013761 0ustar liggesusers2019-11-11 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.0.14 2019-11-10 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * cleanup: Make safe for checkbashism by using only /bin/sh * inst/include/annoylib.h: New upstream v1.16.2 (plus up to pr436) 2019-09-23 Dirk Eddelbuettel * DESCRIPTION (Date, Version): Release 0.0.13 2019-09-22 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * src/annoy.cpp: Add unbuild() and onDiskBuild() functions * inst/tinytest/testOnDiskBuild.R: Add tests for onDiskBuild() * inst/tinytest/testIndex.R: Can now use tinytest::exit_file() * inst/tinytest/testSeeds.R: Idem * inst/include/annoylib.h: Use return code * inst/include/mman.h: Only conditionally define ftruncate * README.md: Small edits 2019-09-21 Peter Hickey * vignettes/rmd/UsingAnnoyInCpp.Rmd: Remove spurious comma 2019-09-21 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * inst/include/annoylib.h: New upstream v1.16 (plus up to pr410) * inst/include/mman.h: Idem * src/annoy.cpp: Add getNTrees(), use error message in addItem() 2019-09-15 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * R/annoy.R: Use a tempfile() in example to save + load an annoy tree * man/AnnoyIndex.Rd: Ditto 2019-05-12 Dirk Eddelbuettel * DESCRIPTION (Date, Version): Release 0.0.12 2019-05-11 Dirk Eddelbuettel * vignettes/UsingAnnoyInCcppWrapper.Rnw: Vignette wrapper with tip of the hat to Mark van der Loo for his January 2019 blog post * vignettes/rmd/UsingAnnoyInCpp.Rmd (vignette): Moved * vignettes/rmd/rcppannoy.bib: Idem * DESCRIPTION (Suggests): Remove three packages needed for vignette * .travis.yml (install): Idem * .Rbuildignore: Exclude vignettes/rmd/ from build 2019-05-10 Dirk Eddelbuettel * tests/tinytest.R: New test runner using tinytest * inst/tinytest/testIndex.R: New test file using tinytest * inst/tinytest/testAngular.R: Idem * inst/tinytest/testEuclidean.R: Idem * inst/tinytest/testHamming.R: Idem * inst/tinytest/testManhattan.R: Idem * .travis.yml (install): Add tinytest to Travis setup * local/: Old RUnit test files in source but not in package * .Rbuildignore: Exclude local/ from build 2019-05-06 Adam Spannbauer * R/annoy.R: Added documentation * man/AnnoyIndex.Rd: Rendered documentation 2019-04-12 Dirk Eddelbuettel * inst/tests/runit.seeds.R (test01seeds): Simplified 2019-04-11 Dirk Eddelbuettel * inst/tests/runit.seeds.R (test01seeds): Add tests 2019-04-11 James Melville * vignettes/UsingAnnoyInCpp.Rmd: Document setSeed 2019-04-10 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * src/annoy.cpp: Support setting of seed for KISS RNG 2018-10-30 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.0.11 2018-10-29 Dirk Eddelbuettel * inst/include/annoylib.h: Only define NOMINMAX if not defined * vignettes/UsingAnnoyInCpp.Rmd: Simplified by having C++ snippets typeset by pandoc instead of attempting OS-dependent compilation 2018-10-28 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * inst/include/annoylib.h: New upstream version 1.13 past pr325 * inst/include/kissrandom.h: Idem * vignettes/UsingAnnoyInCpp: Renamed vignette, one size_t use 2018-10-17 Dirk Eddelbuettel * README.md: Added dependency count badge 2018-10-16 Dirk Eddelbuettel * vignettes/UsingAnnoyInC++.Rmd: Renamed vignette, minor edits * vignettes/rcppannoy.bib: Expanded, sorted (thanks, Emacs) 2018-10-14 Dirk Eddelbuettel * vignettes/rcppannoy.Rmd: Minor edits 2018-10-09 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version 2018-10-09 Aaron Lun * vignettes/rcppannoy.Rmd: Minor fixes 2018-10-07 Dirk Eddelbuettel * inst/include/annoylib.h: New upstream version 1.13 plus two PRs by Aaron and Dirk, respectively. * inst/include/mman.h: Idem 2018-10-06 Aaron Lun * vignettes/rcppannoy.Rmd: New vignette on using Annoy from C++ * DESCRIPTION: Added required Suggests: and VignetteBuilder: * .travis.yml: Added r-cran-knitr and r-cran-rmarkdown 2018-09-01 Dirk Eddelbuettel * .travis.yml: Switch Travis CI to R 3.5 repo 2017-12-16 Dirk Eddelbuettel * inst/include/kissrandom.h: New upstream version * inst/include/annoylib.h: Idem; plus some small changes to avoid g++ warnings, also sent upstream * inst/tests/runit.euclidean.R: Relaxed one '<' comparison to '<=' * inst/tests/runit.manhattan.R: Idem * src/init.c: Added new Hamming distance measure (via template) * src/annoy.cpp: Idem; plus more use of template type * inst/tests/runit.hamming.R: Unit tests for 'AnnoyHamming' * man/RcppAnnoy-package.Rd: Documentation alias for 'AnnoyHamming' * .Rbuildignore: Ignore top-level *tar.gz file * .gitignore: Idem 2017-09-25 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.0.10 * inst/tests/runit.index.R (test03getVectors): New test function * tests/doRUnit.R: Small edits and improvements 2017-09-23 Dirk Eddelbuettel * src/annoy.cpp (getItemsVector): Initialized vector (#24) 2017-08-31 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.0.9 2017-07-21 Dirk Eddelbuettel * inst/tests/runit.angular.R: Additional tests from upstream * inst/tests/runit.euclidean.R: Idem * inst/tests/runit.manhattan.R: Idem 2017-07-18 Dirk Eddelbuettel * src/annoy.cpp (RCPP_MODULE): New Manhattan distance module * inst/tests/runit.manhattan.R: New test file * R/annoy.R: Load module AnnoyManhattan * src/init.c: Register module boot function * man/RcppAnnoy-package.Rd: Aliases for AnnoyManhattan 2017-07-17 Dirk Eddelbuettel * inst/include/annoylib.h: New upstream version annoy 1.9.1 * inst/include/kissrandom.h: Idem * src/annoy.cpp (Annoy): Update call to match updated interface * inst/tests/runit.angular.R: Update three tests as the returned distance metric is now the square root of the previous value * .travis.yml (group): Added per Travis blog 2017-07-14 Dirk Eddelbuettel * .travis.yml (before_install): Use https for curl fetch 2017-07-02 Dirk Eddelbuettel * README.md: Use alternate for img.shields.io GPL-2+ badge 2017-07-01 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * inst/include/annoylib.h (>): Ensure we write as binary 2017-04-09 Dirk Eddelbuettel * src/init.c (R_init_RcppAnnoy): Call R_registerRoutines() and R_useDynamicSymbols() * NAMESPACE: Use .registration=TRUE on useDynLib 2016-10-01 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.0.8 * .travis.yml: Switch to using run.sh for Travis CI * README.md: More canonical URLs * src/annoy.cpp: Use unsigned int for vector size * src/annoy.cpp: Added index admissibility test to addItem() * inst/tests/runit.index.R (test02badvalues): New test 2016-09-29 Dirk Eddelbuettel * inst/NEWS.Rd: Added 2016-09-28 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * src/annoy.cpp (RCPP_MODULE): New List returning functions from #12 2016-02-02 Michael Phan-Ba * src/annoy.cpp: Added explicit destructor 2015-11-17 Daniel C. Dillon * src/annoy.cpp: Templating Annoy classes * inst/include/annoylib.h: Ditto 2015-11-15 Dirk Eddelbuettel * DESCRIPTION: Version 0.0.7 * src/annoy.cpp: Changes to adapt to new Annoy interface 2015-11-14 Dirk Eddelbuettel * DESCRIPTION: Rolled Date and Version * inst/include/annoylib.h: Upgraded to new version from Annoy 1.6.2 2015-05-26 Dirk Eddelbuettel * DESCRIPTION: Rolled Date and Version * inst/include/annoylib.h: Upgraded to new version from Annoy 1.3.1 2015-05-03 Dirk Eddelbuettel * DESCRIPTION: Version 0.0.6 * inst/include/annoylib.h: Upgraded to new version from Annoy 1.2.2 based on our pull request (and fix) to support supplying an RNG * src/annoy.cpp: Supply R's own RNG instead of the default of rand * .travis.yml: No longer need BH, and install Rcpp via PPA 2015-05-02 Dirk Eddelbuettel * inst/include/annoylib.h: Upgraded to Annoy 1.1.1 (which no longer needs Boost) * inst/include/annoylib.h: Replace rand() with random() * src/annoy.cpp: Call save() + load() with use const char* arguments * DESCRIPTION: Roll Version: and Date:, remove BH dependency * cleanup: Clean a bit more in src/ 2015-01-22 Dirk Eddelbuettel * DESCRIPTION: Version 0.0.5 2015-01-21 Dirk Eddelbuettel * inst/include/annoylib.h: Synced once more with upstream; this version addresses the UBSAN runtime issue 2015-01-10 Dirk Eddelbuettel * inst/include/annoylib.h: Synced with upstream repo 2015-01-06 Dirk Eddelbuettel * DESCRIPTION: Bumped Version: and Date: * src/Makevars: One char correction requested by CRAN Maintainers 2014-12-07 Dirk Eddelbuettel * DESCRIPTION: Version 0.0.4 * DESCRIPTION: Added Depends: R (>= 3.1) as need for C++11 prohibits deployment on R-oldrel 2014-11-17 Dirk Eddelbuettel * DESCRIPTION: Version 0.0.3 * inst/include/annoylib.h: Updated to new version from Annoy 2014-11-16 Qiang Kou * inst/include/annoylib.h: Added Windows support for mmap * inst/include/mman.h: Windows implementation of mmap * src/annoy.cpp: Add two #undef needed on Windows 2014-11-16 Dirk Eddelbuettel * README.md: Updated to note CRAN package, possible Windows port 2014-11-15 Dirk Eddelbuettel * inst/include/annoylib.h: New upstream version 2014-11-14 Dirk Eddelbuettel * inst/include/annoylib.h: New upstream version with templated int * src/annoy.cpp: Updated for new Annoy library 2014-11-13 Dirk Eddelbuettel * DESCRIPTION: Version 0.0.2 * inst/include/annoylib.h: New version with verbosity toggle * src/annoy.cpp: Added setter for verbosity 2014-11-12 Dirk Eddelbuettel * .travis.yml: Enable binary index test 2014-11-11 Dirk Eddelbuettel * inst/tests/runit.index.R: New test against binary index * inst/tests/data/test.tree: Binary file used by test * inst/tests/runit.euclidean.R: Added more tests 2014-11-10 Dirk Eddelbuettel * tests/runUnitTests.R: Added RUnit unit test caller * inst/tests/runit.angular.R: First set of unit tests * inst/tests/runit.euclidean.R: Idem * DESCRIPTION: Added Suggests: RUnit * .travis.yml: Added to enable Travis CI 2014-11-09 Dirk Eddelbuettel * inst/include/annoylib.h: Updated to new version from annoy 2014-11-08 Dirk Eddelbuettel * DESCRIPTION: Initial version 0.0.1 RcppAnnoy/README.md0000644000176200001440000000424213541710456013452 0ustar liggesusers## RcppAnnoy [![Build Status](https://travis-ci.org/eddelbuettel/rcppannoy.png)](https://travis-ci.org/eddelbuettel/rcppannoy) [![License](https://eddelbuettel.github.io/badges/GPL2+.svg)](http://www.gnu.org/licenses/gpl-2.0.html) [![CRAN](http://www.r-pkg.org/badges/version/RcppAnnoy)](https://cran.r-project.org/package=RcppAnnoy) [![Dependencies](https://tinyverse.netlify.com/badge/RcppAnnoy)](https://cran.r-project.org/package=RcppAnnoy) [![Downloads](http://cranlogs.r-pkg.org/badges/RcppAnnoy?color=brightgreen)](http://www.r-pkg.org/pkg/RcppAnnoy) Rcpp bindings for [Annoy](https://github.com/spotify/annoy) ### What is Annoy? [Annoy](https://github.com/spotify/annoy) is a small, fast and lightweight library for Approximate Nearest Neighbours with a particular focus on efficient memory use and the ability to load a pre-saved index. [Annoy](https://github.com/spotify/annoy) is written by [Erik Bernhardsson](http://erikbern.com). See its page for more on features, its (Python) API, and the other language ports. [Annoy](https://github.com/spotify/annoy) is part of the esteemed _let us find other music you may like_ algorithm by [Spotify](https://github.com/spotify/). ### Why this package? It provides a nice example for Rcpp Modules and use of templates: Annoy uses a clean C++ core with templated data type, as well as several distance measures. This package shows that it is easy to wrap both aspects from R giving us multi-lingual approaches to data discovery and machine learning. ### Status The package matches the behaviour of the original Python package in the original Python wrapper for the [Annoy](https://github.com/spotify/annoy) library. It also replicates all unit tests written for the Python frontend, including a test for efficiently `mmap`-ing a binary index file. The package originally built on Linux and OS X, and thanks to a patch by [Qiang Kou](https://github.com/thirdwing) now also builds on Windows. ### Installation You can either install from source via this repo, or install [the CRAN package](https://cran.r-project.org/package=RcppAnnoy) the usual way from [R](https://www.r-project.org). ### Author Dirk Eddelbuettel ### License GPL (>= 2) RcppAnnoy/man/0000755000176200001440000000000013465270642012747 5ustar liggesusersRcppAnnoy/man/RcppAnnoy-package.Rd0000644000176200001440000000134413465270642016542 0ustar liggesusers\name{RcppAnnoy-package} \alias{RcppAnnoy-package} \alias{RcppAnnoy} \alias{Rcpp_Annoy} \docType{package} \title{ Rcpp bindings for the Annoy C++ library for approximate nearest neighbors. } \description{ Annoy is a small library written to provide fast and memory-efficient nearest neigbor lookup from a possibly static index which can be shared across processes. } \details{ Details about Annoy are available at the reference listed below. } \author{ Dirk Eddelbuettel for the R interface; Erik Bernhardsson for Annoy itself. Maintainer: Dirk Eddelbuettel } \references{ \url{https://github.com/spotify/annoy} } \keyword{package} \examples{ # Optional simple examples of the most important functions } RcppAnnoy/man/AnnoyIndex.Rd0000644000176200001440000001252413536720624015315 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/annoy.R \name{AnnoyIndex} \alias{AnnoyIndex} \alias{AnnoyEuclidean} \alias{Rcpp_AnnoyEuclidean-class} \alias{Rcpp_AnnoyEuclidean} \alias{AnnoyAngular} \alias{Rcpp_AnnoyAngular-class} \alias{Rcpp_AnnoyAngular} \alias{AnnoyManhattan} \alias{Rcpp_AnnoyManhattan-class} \alias{Rcpp_AnnoyManhattan} \alias{AnnoyHamming} \alias{Rcpp_AnnoyHamming-class} \alias{Rcpp_AnnoyHamming} \title{Approximate Nearest Neighbors with Annoy} \description{ Annoy is a small library written to provide fast and memory-efficient nearest neighbor lookup from a possibly static index which can be shared across processes. } \section{Usage}{ \preformatted{ a <- new(AnnoyEuclidean, vectorsz) a$setSeed(0) a$setVerbose(0) a$addItem(i, dv) a$getNItems() a$getItemsVector(i) a$getDistance(i, j) a$build(n_trees) a$getNNsByItem(i, n) a$getNNsByItemList(i, n, search_k, include_distances) a$getNNsByVector(v, n) a$getNNsByVectorList(v, n, search_k, include_distances) a$save(fn) a$load(fn) a$unload() } } \section{Details}{ \code{new(Class, vectorsz)} Create a new Annoy instance of type \code{Class} where \code{Class} is on of the following: \code{AnnoyEuclidean}, \code{AnnoyAngular}, \code{AnnoyManhattan}, \code{AnnoyHamming}. \code{vectorsz} denotes the length of the vectors that the Annoy instance will be indexing. \code{$addItem(i, v)} Adds item \code{i} (any nonnegative integer) with vector \code{v}. Note that it will allocate memory for \code{max(i) + 1} items. \code{$build(n_trees)} Builds a forest of \code{n_trees} trees. More trees gives higher precision when querying. After calling \code{build}, no more items can be added. \code{$save(fn)} Saves the index to disk as filename \code{fn}. After saving, no more items can be added. \code{$load(fn)} Loads (mmaps) an index from filename \code{fn} on disk. \code{$unload()} Unloads index. \code{$getDistance(i, j)} Returns the distance between items \code{i} and \code{j} \code{$getNNsByItem(i, n)} Returns the \code{n} closest items as an integer vector of indices. \code{$getNNsByVector(v, n)} Same as \code{$getNNsByItem}, but queries by vector \code{v} rather than index \code{i}. \code{$getNNsByItemList(i, n, search_k = -1, include_distances = FALSE)} Returns the n closest items to item \code{i} as a list. During the query it will inspect up to \code{search_k} nodes which defaults to \code{n_trees * n} if not provided. \code{search_k} gives you a run-time tradeoff between better accuracy and speed. If you set \code{include_distances} to \code{TRUE}, it will return a length 2 list with elements \code{"item"} & \code{"distance"}. The \code{"item"} element contains the \code{n} closest items as an integer vector of indices. The optional \code{"distance"} element contains the corresponding distances to \code{"item"} as a numeric vector. \code{$getNNsByVectorList(i, n, search_k = -1, include_distances = FALSE)} Same as \code{$getNNsByItemList}, but queries by vector \code{v} rather than index \code{i} \code{$getItemsVector(i)} Returns the vector for item \code{i} that was previously added. \code{$getNItems()} Returns the number of items in the index. \code{$setVerbose()} If \code{1} then messages will be printed during processing. If \code{0} then messages will be suppressed during processing. \code{$setSeed()} Set random seed for annoy (integer). } \examples{ library(RcppAnnoy) # BUILDING ANNOY INDEX --------------------------------------------------------- vector_size <- 10 a <- new(AnnoyEuclidean, vector_size) a$setSeed(42) # Turn on verbose status messages (0 to turn off) a$setSeed(1) # Load 100 random vectors into index for (i in 1:100) a$addItem(i - 1, runif(vector_size)) # Annoy uses zero indexing # Display number of items in index a$getNItems() # Retrieve item at postition 0 in index a$getItemsVector(0) # Calculate distance between items at postitions 0 & 1 in index a$getDistance(0, 1) # Build forest with 50 trees a$build(50) # PERFORMING ANNOY SEARCH ------------------------------------------------------ # Retrieve 5 nearest neighbors to item 0 # Returned as integer vector of indices a$getNNsByItem(0, 5) # Retrieve 5 nearest neighbors to item 0 # search_k = -1 will invoke default search_k value of n_trees * n # Return results as list with an element for distance a$getNNsByItemList(0, 5, -1, TRUE) # Retrieve 5 nearest neighbors to item 0 # search_k = -1 will invoke default search_k value of n_trees * n # Return results as list without an element for distance a$getNNsByItemList(0, 5, -1, FALSE) v <- runif(vector_size) # Retrieve 5 nearest neighbors to vector v # Returned as integer vector of indices a$getNNsByVector(v, 5) # Retrieve 5 nearest neighbors to vector v # search_k = -1 will invoke default search_k value of n_trees * n # Return results as list with an element for distance a$getNNsByVectorList(v, 5, -1, TRUE) # Retrieve 5 nearest neighbors to vector v # search_k = -1 will invoke default search_k value of n_trees * n # Return results as list with an element for distance a$getNNsByVectorList(v, 5, -1, TRUE) # SAVING/LOADING ANNOY INDEX --------------------------------------------------- # Create a tempfile, replace with a local file to keep treefile <- tempfile(pattern="annoy", fileext="tree") # Save annoy tree to disk a$save(treefile) # Load annoy tree from disk a$load(treefile) # Unload index from memory a$unload() } RcppAnnoy/DESCRIPTION0000644000176200001440000000175313562516156013711 0ustar liggesusersPackage: RcppAnnoy Type: Package Title: 'Rcpp' Bindings for 'Annoy', a Library for Approximate Nearest Neighbors Version: 0.0.14 Date: 2019-11-11 Author: Dirk Eddelbuettel Maintainer: Dirk Eddelbuettel Description: 'Annoy' is a small C++ library for Approximate Nearest Neighbors written for efficient memory usage as well an ability to load from / save to disk. This package provides an R interface by relying on the 'Rcpp' package, exposing the same interface as the original Python wrapper to 'Annoy'. See for more on 'Annoy'. 'Annoy' is released under Version 2.0 of the Apache License. Also included is a small Windows port of 'mmap' which is released under the MIT license. License: GPL (>= 2) Depends: R (>= 3.1) Imports: methods, Rcpp (>= 0.11.3) LinkingTo: Rcpp Suggests: tinytest NeedsCompilation: yes RoxygenNote: 6.0.1 Packaged: 2019-11-12 00:21:38.089155 UTC; edd Repository: CRAN Date/Publication: 2019-11-12 11:50:06 UTC RcppAnnoy/build/0000755000176200001440000000000013562375421013272 5ustar liggesusersRcppAnnoy/build/vignette.rds0000644000176200001440000000040713562375421015632 0ustar liggesusersQk0ӦvZ( EeC_=5`tt箵)3,\.:")nNdqiاBӫȶJ4S tRƑ>wҸ\|f9ms~$X)zA(~K=:>~CA*7X 0 ]NFZ?| ߺcD&<qpqJVd43RcppAnnoy/tests/0000755000176200001440000000000013465603623013335 5ustar liggesusersRcppAnnoy/tests/tinytest.R0000644000176200001440000000070613465565351015353 0ustar liggesusers if (requireNamespace("tinytest", quietly=TRUE)) { ## Set a seed to make the test deterministic set.seed(42) ## there are several more granular ways to test files in a ## tinytest directory, see its package vignette; tests can also ## run once the package is installed using the same command ## we need version 0.9.3 or later if (packageVersion("tinytest") >= "0.9.3") { tinytest::test_package("RcppAnnoy") } } RcppAnnoy/src/0000755000176200001440000000000013562375422012763 5ustar liggesusersRcppAnnoy/src/init.c0000644000176200001440000000167113215356603014072 0ustar liggesusers#include #include #include // for NULL #include /* FIXME: Check these declarations against the C/Fortran source code. */ /* .Call calls */ extern SEXP _rcpp_module_boot_AnnoyAngular(); extern SEXP _rcpp_module_boot_AnnoyEuclidean(); extern SEXP _rcpp_module_boot_AnnoyManhattan(); extern SEXP _rcpp_module_boot_AnnoyHamming(); static const R_CallMethodDef CallEntries[] = { {"_rcpp_module_boot_AnnoyAngular", (DL_FUNC) &_rcpp_module_boot_AnnoyAngular, 0}, {"_rcpp_module_boot_AnnoyEuclidean", (DL_FUNC) &_rcpp_module_boot_AnnoyEuclidean, 0}, {"_rcpp_module_boot_AnnoyManhattan", (DL_FUNC) &_rcpp_module_boot_AnnoyManhattan, 0}, {"_rcpp_module_boot_AnnoyHamming", (DL_FUNC) &_rcpp_module_boot_AnnoyHamming, 0}, {NULL, NULL, 0} }; void R_init_RcppAnnoy(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } RcppAnnoy/src/annoy.cpp0000644000176200001440000003055613541674477014635 0ustar liggesusers// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- // // RcppAnnoy -- Rcpp bindings to Annoy library for Approximate Nearest Neighbours // // Copyright (C) 2014 - 2018 Dirk Eddelbuettel // // This file is part of RcppAnnoy // // RcppAnnoy 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. // // RcppAnnoy 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 RcppAnnoy. If not, see . // simple C++ modules to wrap to two templated classes from Annoy // // uses annoylib.h (from Annoy) and provides R access via Rcpp // // Dirk Eddelbuettel, Nov 2014 #include #if defined(__MINGW32__) #undef Realloc #undef Free #endif // define R's REprintf as the 'local' error print method for Annoy #define __ERROR_PRINTER_OVERRIDE__ REprintf #include "annoylib.h" #include "kissrandom.h" template< typename S, typename T, typename Distance, typename Random > class Annoy { protected: AnnoyIndex *ptr; unsigned int vectorsz; public: Annoy(int n) : vectorsz(n) { ptr = new AnnoyIndex(n); } ~Annoy() { if (ptr != NULL) delete ptr; } void addItem(S item, Rcpp::NumericVector dv) { if (item < 0) Rcpp::stop("Inadmissible item value %d", item); std::vector fv(dv.size()); std::copy(dv.begin(), dv.end(), fv.begin()); char *errormsg; if (!ptr->add_item(item, &fv[0], &errormsg)) Rcpp::stop(errormsg); } void callBuild(int n) { ptr->build(n); } void callUnbuild() { ptr->unbuild(); } void callSave(std::string filename) { ptr->save(filename.c_str()); } void callLoad(std::string filename) { ptr->load(filename.c_str()); } void callUnload() { ptr->unload(); } int getNItems() { return ptr->get_n_items(); } int getNTrees() { return ptr->get_n_trees(); } double getDistance(int i, int j) { return ptr->get_distance(i, j); } void verbose(bool v) { ptr->verbose(v); } void setSeed(int s) { ptr->set_seed(s); } std::vector getNNsByItem(S item, size_t n) { std::vector result; ptr->get_nns_by_item(item, n, -1, &result, NULL); return result; } Rcpp::List getNNsByItemList(S item, size_t n, size_t search_k, bool include_distances) { if (include_distances) { std::vector result; std::vector distances; ptr->get_nns_by_item(item, n, search_k, &result, &distances); return Rcpp::List::create(Rcpp::Named("item") = result, Rcpp::Named("distance") = distances); } else { std::vector result; ptr->get_nns_by_item(item, n, search_k, &result, NULL); return Rcpp::List::create(Rcpp::Named("item") = result); } } std::vector getNNsByVector(std::vector dv, size_t n) { std::vector fv(dv.size()); std::copy(dv.begin(), dv.end(), fv.begin()); std::vector result; ptr->get_nns_by_vector(&fv[0], n, -1, &result, NULL); return result; } Rcpp::List getNNsByVectorList(std::vector fv, size_t n, size_t search_k, bool include_distances) { if (fv.size() != vectorsz) { Rcpp::stop("fv.size() != vector_size"); } if (include_distances) { std::vector result; std::vector distances; ptr->get_nns_by_vector(&fv[0], n, search_k, &result, &distances); return Rcpp::List::create( Rcpp::Named("item") = result, Rcpp::Named("distance") = distances); } else { std::vector result; ptr->get_nns_by_vector(&fv[0], n, search_k, &result, NULL); return Rcpp::List::create(Rcpp::Named("item") = result); } } std::vector getItemsVector(S item) { std::vector fv(vectorsz); ptr->get_item(item, &fv[0]); std::vector dv(fv.size()); std::copy(fv.begin(), fv.end(), dv.begin()); return dv; } bool onDiskBuild(std::string fname) { char *errormsg; if (!ptr->on_disk_build(fname.c_str(), &errormsg)) Rcpp::stop(errormsg); return true; } }; typedef Annoy AnnoyAngular; typedef Annoy AnnoyEuclidean; typedef Annoy AnnoyManhattan; typedef Annoy AnnoyHamming; RCPP_EXPOSED_CLASS_NODECL(AnnoyAngular) RCPP_MODULE(AnnoyAngular) { Rcpp::class_("AnnoyAngular") .constructor("constructor with integer count") .method("addItem", &AnnoyAngular::addItem, "add item") .method("build", &AnnoyAngular::callBuild, "build an index") .method("unbuild", &AnnoyAngular::callUnbuild, "unbuild an index") .method("save", &AnnoyAngular::callSave, "save index to file") .method("load", &AnnoyAngular::callLoad, "load index from file") .method("unload", &AnnoyAngular::callUnload, "unload index") .method("getDistance", &AnnoyAngular::getDistance, "get distance between i and j") .method("getNNsByItem", &AnnoyAngular::getNNsByItem, "retrieve Nearest Neigbours given item") .method("getNNsByItemList", &AnnoyAngular::getNNsByItemList, "retrieve Nearest Neigbours given item") .method("getNNsByVector", &AnnoyAngular::getNNsByVector, "retrieve Nearest Neigbours given vector") .method("getNNsByVectorList", &AnnoyAngular::getNNsByVectorList, "retrieve Nearest Neigbours given vector") .method("getItemsVector", &AnnoyAngular::getItemsVector, "retrieve item vector") .method("getNItems", &AnnoyAngular::getNItems, "get number of items") .method("getNTrees", &AnnoyAngular::getNTrees, "get number of trees") .method("setVerbose", &AnnoyAngular::verbose, "set verbose") .method("setSeed", &AnnoyAngular::setSeed, "set seed") .method("onDiskBuild", &AnnoyAngular::onDiskBuild, "build in given file") ; } RCPP_EXPOSED_CLASS_NODECL(AnnoyEuclidean) RCPP_MODULE(AnnoyEuclidean) { Rcpp::class_("AnnoyEuclidean") .constructor("constructor with integer count") .method("addItem", &AnnoyEuclidean::addItem, "add item") .method("build", &AnnoyEuclidean::callBuild, "build an index") .method("unbuild", &AnnoyEuclidean::callUnbuild, "unbuild an index") .method("save", &AnnoyEuclidean::callSave, "save index to file") .method("load", &AnnoyEuclidean::callLoad, "load index from file") .method("unload", &AnnoyEuclidean::callUnload, "unload index") .method("getDistance", &AnnoyEuclidean::getDistance, "get distance between i and j") .method("getNNsByItem", &AnnoyEuclidean::getNNsByItem, "retrieve Nearest Neigbours given item") .method("getNNsByItemList", &AnnoyEuclidean::getNNsByItemList, "retrieve Nearest Neigbours given item") .method("getNNsByVector", &AnnoyEuclidean::getNNsByVector, "retrieve Nearest Neigbours given vector") .method("getNNsByVectorList",&AnnoyEuclidean::getNNsByVectorList, "retrieve Nearest Neigbours given vector") .method("getItemsVector", &AnnoyEuclidean::getItemsVector, "retrieve item vector") .method("getNItems", &AnnoyEuclidean::getNItems, "get number of items") .method("getNTrees", &AnnoyEuclidean::getNTrees, "get number of trees") .method("setVerbose", &AnnoyEuclidean::verbose, "set verbose") .method("setSeed", &AnnoyEuclidean::setSeed, "set seed") .method("onDiskBuild", &AnnoyEuclidean::onDiskBuild, "build in given file") ; } RCPP_EXPOSED_CLASS_NODECL(AnnoyManhattan) RCPP_MODULE(AnnoyManhattan) { Rcpp::class_("AnnoyManhattan") .constructor("constructor with integer count") .method("addItem", &AnnoyManhattan::addItem, "add item") .method("build", &AnnoyManhattan::callBuild, "build an index") .method("unbuild", &AnnoyManhattan::callUnbuild, "unbuild an index") .method("save", &AnnoyManhattan::callSave, "save index to file") .method("load", &AnnoyManhattan::callLoad, "load index from file") .method("unload", &AnnoyManhattan::callUnload, "unload index") .method("getDistance", &AnnoyManhattan::getDistance, "get distance between i and j") .method("getNNsByItem", &AnnoyManhattan::getNNsByItem, "retrieve Nearest Neigbours given item") .method("getNNsByItemList", &AnnoyManhattan::getNNsByItemList, "retrieve Nearest Neigbours given item") .method("getNNsByVector", &AnnoyManhattan::getNNsByVector, "retrieve Nearest Neigbours given vector") .method("getNNsByVectorList",&AnnoyManhattan::getNNsByVectorList, "retrieve Nearest Neigbours given vector") .method("getItemsVector", &AnnoyManhattan::getItemsVector, "retrieve item vector") .method("getNItems", &AnnoyManhattan::getNItems, "get number of items") .method("getNTrees", &AnnoyManhattan::getNTrees, "get number of trees") .method("setVerbose", &AnnoyManhattan::verbose, "set verbose") .method("setSeed", &AnnoyManhattan::setSeed, "set seed") .method("onDiskBuild", &AnnoyManhattan::onDiskBuild, "build in given file") ; } RCPP_EXPOSED_CLASS_NODECL(AnnoyHamming) RCPP_MODULE(AnnoyHamming) { Rcpp::class_("AnnoyHamming") .constructor("constructor with integer count") .method("addItem", &AnnoyHamming::addItem, "add item") .method("build", &AnnoyHamming::callBuild, "build an index") .method("unbuild", &AnnoyHamming::callUnbuild, "unbuild an index") .method("save", &AnnoyHamming::callSave, "save index to file") .method("load", &AnnoyHamming::callLoad, "load index from file") .method("unload", &AnnoyHamming::callUnload, "unload index") .method("getDistance", &AnnoyHamming::getDistance, "get distance between i and j") .method("getNNsByItem", &AnnoyHamming::getNNsByItem, "retrieve Nearest Neigbours given item") .method("getNNsByItemList", &AnnoyHamming::getNNsByItemList, "retrieve Nearest Neigbours given item") .method("getNNsByVector", &AnnoyHamming::getNNsByVector, "retrieve Nearest Neigbours given vector") .method("getNNsByVectorList",&AnnoyHamming::getNNsByVectorList, "retrieve Nearest Neigbours given vector") .method("getItemsVector", &AnnoyHamming::getItemsVector, "retrieve item vector") .method("getNItems", &AnnoyHamming::getNItems, "get number of items") .method("getNTrees", &AnnoyHamming::getNTrees, "get number of trees") .method("setVerbose", &AnnoyHamming::verbose, "set verbose") .method("setSeed", &AnnoyHamming::setSeed, "set seed") .method("onDiskBuild", &AnnoyHamming::onDiskBuild, "build in given file") ; } RcppAnnoy/src/Makevars0000644000176200001440000000025112452775222014454 0ustar liggesusers ## We want C++11 as it gets us 'long long' as well ## If we uncomment this we fall back to C++98 and it is all tears CXX_STD = CXX11 PKG_CPPFLAGS = -I../inst/include/ RcppAnnoy/vignettes/0000755000176200001440000000000013562375422014204 5ustar liggesusersRcppAnnoy/vignettes/UsingAnnoyInCcppWrapper.Rnw0000644000176200001440000000042513465634510021423 0ustar liggesusers\documentclass{article} \usepackage{pdfpages} %\VignetteIndexEntry{Using Annoy in C++} %\VignetteKeywords{Rcpp, Annoy, R, Cpp, Approximate Nearest Neighbours} %\VignettePackage{RcppAnnoy} \begin{document} \includepdf[pages=-, fitpaper=true]{UsingAnnoyInCpp.pdf} \end{document}RcppAnnoy/vignettes/UsingAnnoyInCpp.pdf0000644000176200001440000060555513453657617017753 0ustar liggesusers%PDF-1.5 % 39 0 obj << /Length 5343 /Filter /FlateDecode >> stream x\ms6_1` Iod|؉T|8k9!9׍nMѫ6eFc[|̛^]/Zx e#-{웓g/b!0Z/FAE\gGKC벬p6/ME7SmZsVd@-BA! KϕQXJύ%uRIϩ`@F;Ŗ"pCCKTh\_.ƌF8&4Z,EJOn Skhn>a1+0Ɓ%|# +] uݶ˗yޝGBx_QIIjh`2\$r)X:Y nrWG"p~ n"[ѝ}m}9yABD8nK>$G0fapq{֮}#I?]_k`+;XaoxVđ!φ \峂%k[8-]Q>Ph#W{d`bߨ@gZyc.^*GBq`:z0)Lz@xgSC9O$à7Y]z4U9"S0/67m7"dezN]~0&@˄F;`$DQhLOTd2si3P>GPu~}VWMCVkzr=[u&Cȧ!!]U[b 0o_qo$Hjg;Ѭx(Dje O&RۇP \U'EP"a S.ڂ{4x5T&Q1|[gYTWMzR yn Fmx kYqZ2p SVAvC_,|f&epzb]!C]~-lMjQ%Blw1Fw㛷ޛQ"$7ĂSu_v槓7Q& BlBЅ`뇼wR:Zʍ_8Cb Vc V |WyQP_M.H 5: y;re4>gH??@AFNIKAGv8 hbz?n3i NJbP?AH?,% RZ-L]R=~X@efMC>}wCT ^-=Lç+uɧ|țXQm,1C jM~u㒔ӎ?/Za+av0jxKx cQVZR(X2B7 y:mq+to@~"\NZ)ՊShʖÃc&tCvqz,V{<)cb!6r98@zYUM^uxLt 01 5xe׹hL7eCy-]\k>TG'C/\){U{UmeL֚y[nz@~ ?H'(SV|@+e4VS]h3Juօ bYg@m_ sCT8s{^Z?Ai@CGƾHd@~]=o~!bf5{ ;l u! OwkqFF0{#&Nio3%&w i{:}Ozdj̭!QF!>ms9 ř5CSw1!B|L; ɮh_)`6 P]30,X4`0LUz66>hpUΊMj7B5l ڦRycj2v:6[1P0;&p5[-^Hi3n`K"}cU_ݞOE&WapC`EM|c4ڡGhV &4 {)A=.ncn,,bň2.餀L+eM{8Inj?G`XE!445IR @YMj\s^jHi9O懲0暪b< oc=bd-!v`9g&^Jڬ%KB#ڀAǜ-,w+9OHnIl BuӾ&+'DAjܳ[PwMv%4ڢO_bw@[qV Yx|_1-6Y\:> ~$HcCH qkrCu[nt |>\u[.v9nsotfd˩ SD}΍t;Pm;M#7;10 (Rfɤ@׃c+m59x86f}ˋ~8a3)oLYܘr$Su=eVK.%Ax~-R_zduu6)tȁx5j ޺B : ͏Ht!n6k,1 j8rTդ(A1O* S"3U۔7_tY~L ̓;9J/ ~rt9&ĸE\]FڹE"2<kxHOxO0a 0E_Qz7) sWxAu ͞R@wCMGv:(I/4_rK& _7u?ZLPVc2G*'ike31gf%,j|@ M.=N?7aPmVO d3j&9mL PBې^v8(bP lBF ]%*>^S]C ,5@L>uIeJ491 n OwP2K[8gHAt8U7G صxxѲ ]/6oyRQ @qN|lRNr P2S~dV#zGPq1Mj>l0.ڳ#e4}u{2@H` Afkempn~$Mm݄S0" 'h_3Hx;Emcxt`CTt_ҖmZ.Sۓ#M`x6::غ>+cLF_6=㕲Iٮx{Y=鐀=%`#Mwum+\}{̚JNN. ~ԥCJn"̑Ä!L*g x?4:V7gk<! 5S!0ZDWLEAIj04H>X9!Cap=I $qYÃq-pJWVMvO$qխA( |hHf|tvO|޼_|gPӨl#ϠY[TbG7},+]OSs<~Aãρ@T@t36MRPHi=zHEVtY!c r`~ԻÒ(9urϚsxOY 7]@A5YAJJLl&gJEuǝw$"Xgg+BP&ʇ#W" j+hq mDh#.c/#oGq5CV'=ce+|[os9!ʖ29qeiҭGH௓#K[/^vDt},ŸPrèqq?fEJqB&?D(@꽿K6|_F䖳G}CRG@,^?_) endstream endobj 75 0 obj << /Length 3891 /Filter /FlateDecode >> stream xZms6_O=@dzw3Id|LsmHx~=%i&$|$r0b&&Q( IdҠ@''YNPejr~9I(b1APdr;ț)E3ƼTS{)(b2h9ӫF0Z,EA4aQ1F^cwE}F_׌Zԭ[n҈biRe 3롬sؘrW) $e Kb04żfȋ9v "a,(  @#{A.,bRW[RVvq8Sa̹ ǡߪbu9fɊ_]¤/ g{J|$0B ffhmU"v‚=; M5vTiAp(<_ͷ+=:vYF']+¾IDl:SQ"o)!չ5O,9m7M~:#*?h` AS6@T.p22m{$!ɘ9Zge}, A{,.k}GrPȰmޔ+[ra-g#qI Dޘ59Eyee 65f q#&@KrN()~ۖq1k'XWgKI'#g )׎[؞85\c d|{9n岹udny*N 6pflRz:QKpݳ[^Dꔥ *θ@M ORLYnikX_mạ]6u&)cmM뺵eN#UW=E.ʮ,ڽ[-yW3ܦsç?3a3v2pC"2CubQ\pq:_mu~fHym#&o`T4M_mnyIh󲾡 -n)Bv^Hyk_EzF:'21k xj#ӟ}3DG 9vPP&5:.7RO61Y$v(Ӯ=OԵA ҁw[͕) s*}&ڷnf6A­ӆ8Zd'a^7QTo`ͭzzDu^G@r,~g#7^[[+džK\ '^vm(*ض{̀tS,:zӐ*~Ώ7SD1ְoL/XՕ U';P-uOr.B)6w/n7D©DEq}Ovd+E{hqݿGv w :Y"`dƻ]$%_'|l($jm\cD}hX q J<'GIS8>) ȘݽC.-y<͋MwYً]oSDe`R3j[iTUij.-RU=7m ,ߎK6q BxUu2mmȸ+[@8.' ~1xOܴP!jDyMy yPfPdB 5hmFЬgqO 1lӧGua#2UyDtLfpI'p|H%.*A>_hV]6iL0:=l vHLo;fseNЁ5M O i"$N0j :t<5ۋ1Ʃd:I'x&sJ7tR>p{yuߏVo]APd#gm\NxپC=5Mbwu\wB;,ە6/BzιWAV{]C,e.?9mB!ᤳ0GYg%}ۡLَaa)0NNy:iMd3Qp)ú:~=ɵ6v;" }^ N͝ȫŢX]"E:(6g~HNy!yL/A =Kdbb Z+wڴOrRROG! GTpꗁ]B8~ΈYpfcb!&f#dbx4a 6eWg/Nfәbw ~!?0%J!`,0}E*_Ty1ǮА3Q0@i%r,CX8^l&"A6O zCGvS 0v//kdNv;_@ez0Υ"јtب'goq8=V- zI d < ;^ԥMspE7Y"e$Ž"DDC4JfY4@8_X  KlpiƾU?Xǃ3[jo^>3-ּNLdg۶5}]W!qF_8'ƛ?PT<͢׫D^ a0x)hϝX~8SaJGÑ|g܍3 8עh X`ڵ]jp.{-Bو8q|,'IOt4ApUs4+4o_]a /^"쮜G G>ZM HŽ<@Da LF̓x%0MsJ'I$pLFƙh2w1ް6$g߀ϋΟI- endstream endobj 98 0 obj << /Length1 1456 /Length2 8804 /Length3 0 /Length 9772 /Filter /FlateDecode >> stream xڝwuT[}-b-V P ݭ@w(.EkZ8ܴ'}{we%=3{:ju-6 KsԙN 9C g@ Pupp@!nD$!pg=@ a {]q (bnۀ-n0[`gHaKk0+@E$agp0ljC! ;%A0?p:Z95]MUUm4@SAN^[ mVn  dmb @ZDgЁYH.v8 spà]߁ E: " D`g E p0d Bi(+ l\F &#Uy"tg  9gD~P_UdpkVwAxD O EAV.^ďBL? Y8;8APΈt' .^,wh! `dE02K=1r19\\Ҙ#ܡX\j1B4!W]@v?ĄY:@<`+,Ugp?n¿?e]TAU$,?bo ' gb$ֈa. q[C-lV ;=ׁZav(X/l\! ##9-'9 PO,'ݫ 0dB8">yeR%j= `u_h/6.>>}CwA0l5;`,Op[~J |6WBQ%[X\ȭV9+׏$7DZ.fcXeZ\G: Er&'PK9 $^-_r6oFW͈3N wvY&C5dtҕLca/5Z)t'o2Y|nACxGUlCV-|xmٔF?v35vi!g ZÉm\z⮆w- =f졊 _$ehJy6HIVfq>• L[Y+f%0HH:~UDX'2\堮Y(=(RUS0T л@Y\P׳h5g#TLU p~2עkw D,~$P ?2 H q[aQL3A7g~N6kz++k[w[~0Fȑ,6e55Sz$.28J~o筪3ԡb 7̼+~Zk3[,bSˆpU'y{klR˃& 3/Dٿ1>]VX=Z-+ ^j" ;cʂn_@ ]:茦~֬c x`B]0KC䗤{nH3Οga4߁~G}Ph!Q~QZlͿ{}Uޒ*:ˊ?G@mDF.UnJ+!,Zt2Ym5Cg9ӵ*f!(w&@j4kHƏln,Z.e.6?RmMQ4CfqtlV4z~Ҝ Ԋ,VkeqՠvԈϞb/Uz㹝\L6ytq̠e<:7x1U >?$vz36N{G GC˯kmBU{>1 (]&h;qM rZ)Tx[yKy\NoQ[ 乲8]t{Jyg.K楢,P rI4َhsqx$VSqVTH{`[~U#-OӍnYuoRMy 圵Ԣ,ߋ]Sv,4Hg{]/tĘ[!(kd,k\@@z'#ur+` 977 x;NkB'e\=[͞ع;s ,!5'$"Y#T*ur~#ȝxNfEE_Y(}hQtYaY ͂s62rdOHEN&wȜˤ0~y .{X%SǤB}QRJO, ǺPA*Ù>g3Ad/Acd#Ex_hN 6kḫݯG j!B~'K=uk[(d|sp]B9ܘJ{ ɈCܸ=z%VhwO549_zp5gu:hq:|"RmVU`eU"Ĵ{-)RsQSEoG9>?{l+}#T)a+_u}f~mbeXnL΅E ٺs'VG 3ҋET$"^@_\2)ݰЈ&GnfE!ѧm&E[qLoU/Sh mb}O׏j.ܩAٜ/yxag<5:C>mnr Ǩ'0(-:M4CFT7#ΨE\Dy  $FtE-Q5kPUToXYx(2{gLHMd;?%ے0٭Kk;W\{OqߙXv EF+vOVV2_ 3Yh&yVMVUme0+9U{| V2:(΅  -4NʓOGyl:e)EC9} ^NL  L-:s#2e ٴ|i]v+<-1lK"돝PRTa}} 1슡ݤr*Z!@ՋhOk &/KZi&\F-9:6G>:Ka+aw^a.C,?[V#Ve?L>t4@[bXtyE©.Rj=C}UW!544MF"j e^~RCbr7o lg x ./)2Ԡ'H6}Wz7&i= "R;Ɉ9ćQ.wZiD;+ 讱KbZKհZRujC(1!=*%GJ+f:Jgkg| s΃f1cq|vӇwV L52l039<7mp3ϋ9>ĐҦSdik$;' Ϛ^B[Ht +yih&53_>ׄC[Z\a~χ #,¸9m?^j@ꈭ/Ѣy<)jYbzIDMQ ݃՛=hid$_w|ޕ$/%ӦY٢cR ItO ,Z!W%cx_~[qeWj.Ӑ#`Gw6ig2Ka92m:WMN-ײ(uBuhֈ {>=JҐsޮ$~"M3(k&!u__E-5=SҙU=VtKuՔLL 3^߫Bj\g~GHe\#J=}m2ԉ!u܍p޺nn~tQmͮ ؊% Bg)ցZ rĤ/DB(ECQeUCMs^VJ+`JN4y' b+iI1V AB&pbg%NϷ^~'(.WnLqǸjig<_Z#aoRBtr}=:=$-[KfRǺW"M)MXb^ rEce?R/}8QP%4Nm^\7%C.ja&=XZ)[OH'(ʉIй.M3c=FE-2-%T]NUP)[a„2HY7iWAj8 ~K~Q 㻌gb147p1X7nՒW dWHDTLҤn4$ORS2~rb*(lwfo}Ջ!ַiztfn|hMę=$| )/XVG{Y DT'x"3 XZ޻fjzFɭ&e <"Ƕ^OQY[*w7VDF-.J0ё4%Hٍi4 pvOuqd&=yW6# >/)z7CoY:H ?70:pLLc8-u.5P .f ֗Oѥf RAd@| ֟?ͺ 4LeB-D2x&>9|ҡԮ+oY`!2R} lJ NSbQ'ZZ2fį鍱H/ieLbzX2=ܫyj fl!9#z a+oA 6UA<oXL2֤>ދ;3T6hdˍ|++L<9f8MO?DUU20x9l. #=/N7'&Y}G2>բ"nn:_>Mkk%hzQϷ>#h;Xn%ZNu٩k}Gâp1T?C|n^;-8?}dQA0JYJY>P   |OO_¤/>D%*w9<&ˌNMgղQaCW?6"ESЇGt6M@ڵ} ^`H/0t ӯH()76afxSYd}*]{Z-Uls0<8kbk",ڼRIMn tjDHLrlvXW9r->!egIObb>AB!HCtxw&%ݜ&Na%qk)4J(:x9[Clvcw~-Q}%N@Tc}`+D*)+%lY7"9/`&.+uFRsv+xA2&!SpژL̡ 2axaT,^*k@1s-O4'|W.= bP/ -Rȍ=cm!.y2'VZV<"^/cGT en{.>q1RA%\睬Ϲ*9DGsUx!vhЮ)%R|5QO*6>HKZTwrl% ߪG;lPd-6Wq\kˇ4`1n?|:E @zkҭ-)]z6h*&Òz*ix%`nqe+!;l&yKů~dV3 + #mz։| |d7躩NTrF˩,XJ]"j'#,99aSiDu|.xktZ#?P+Fy")-uܠz1SڃEcK x7nͥB_ &`6(;0ԯ_QEs!/;s;BՊiԨ~qNl ޽fbȉn l g=pwZ㱢6=ep+&8᭒vnZ_{xXfj];nOjmҧmA3S endstream endobj 100 0 obj << /Length1 1454 /Length2 14980 /Length3 0 /Length 15991 /Filter /FlateDecode >> stream xڝstd-cۨ8ض͎mRQ6;mO;?FYk͹0(IDM%@ ,b@sc1Ȝ (:X,<̼,l<~Qk d`P:Z?bN@kK+пc x?dLb&@k3Ksz'_$fn/ ttZ~|cTcH)iH**H(T%Ue%2Rj>V.G 1h3WSyI5`|s1D2su6G f9@`Y?.&6  Z 9sgo'9hn/? 4J8XYYXx4ϯ'hI`o~&v}s_U_.^r~"O..Oa|`f_QOVϙKME.hl r2;~:? @}A!3+ ;+'g-]@a~*P >Gce,rTQaCGf+Nx[L88n:Wm3j)$(I[ȓK}YS2')+6mcx{7E/AAA񵕰 aR;Brze/_j\eo&ѳPGs{|7<(R?HguyIEID`OM!N kK>ǒ?ܕ{MuW\j"_n uRSt%rw@W8|ǬZ.ԛp]C ̛JirRf\a=$HyDBR@>Y rޛOAk`EKEfmc6Ԩ95ΌEiN'4{fѩLd;yEӤYἱpd\ލ=/IkGŁ ѥ0'eA+$x}cV^ڨL9aMrQcNۛd$\^6[~)1s: Hc ~;N:'o%bN+~EO rxB $.9ttrZ8@\P?цϟխ(0UOm`0ĔRCk=H,ڈ }>:or+(?qnΊ-6RHGOdʲ>{f QЯh_C-lͳ G5\GBqo&ujB6zgT/v 7R aSʆm^vOdn>Gk76m 8Io.bs-#ʮ7SSr`«.UKьh:Z_Z>[]d;j"ˈo]_KhTSzY| kW ?xE\Dwe͈ *"D~r7iJk&r F x6zxau0+~gxF}>;r(%З'+] 2tbUj;it8ۈ(,"1nmOA3߇iր3j{.ch[fFZx K^# 3Y*E*VAL e~>ۇQQC AOJdPd˙hP8Z]"e}8zS9E P?ۘf@ŗƳE` 󄺙Y1K_Ff*|+N=]V:b"KZobEQ_ .9RI"XW2ZJ?dNL?^0hIHuΗ+_TȋU"/Mo9V\˗X^AM"u`rJ~ԸשMZ4]i TŖi&ÕاIEΣK =1x5}.=D<2$Lꃆ.$i . 'G ӐAQ~_O^غ'LYOJ"7i)< N#Id=j?<4ܙA# GLYZ "\ED%w˶Ŵ$toa,Rt0_MYOo H/pde0V2ּfu5}!=9'`^"څ(m 0 nj~0cq(m= 8|LJLQ2u|m -ġrDr4'wg>d C#Oq0Ĕj {sss%I 5U vi d闘SK+bg?Uc9%v)8vN;NT=5̯pе2B1K﬩E%:ԉ4LñSoMY5G7IVjoceHJ0YGkGٰ~ثYAieE } CsJ\؆<+dAY4izY4 ZS!{ۮԮ\D e΀WJ;~ޟSdl RUU4VY1?@$(V4_Ӳ q8($2B(%Ѻ-a &$c8,ݷ*|dޘNSt$Rp~LS4 Y&%g;Ht`<=U籖kJl>knԶlGr$D08ҹ $ /䐜|+cLT2~b w7r!&~ )VN=", ʡ5b(n5kGQ}OqIs>zc\+ ,7h65®ӗ\/.ێ}mxVR.@$RngY'cK/7_:Ҳŏ@OJHm넊~<ܒkqst~og9M| -Ǡkg9)U_4Ҝm[ (2GIZN:E` `ԚyF'Djifj{P?~"6z:M}9?T,@(rJ/jV;/4cl~{-iʿ|S6y.YM;noYggZ$CUETyW7mzMğ=Y4KP@nKgZwL#]n29]'c0Fw:Jj= d`4.Bh%w9i x* *yDrB*nFuItݭyRơ312dVP$xϨ~KDX=1b~Z> 5D8C0-Kt% ʺwroH3ZކU؂` FRd`e<%)0>taK ilja*, p4%4QY*3w EMIYȬ5DL~\,:0n;0d5Zݻ.QwܥH)|p)r! EBtuE\*SY#Zĕt4>m8S_1əkͅuxP{&3 `hH#s,}?H%+`kwR3y)UCȈ s\Kvh㑤\gϞ _fq~._#u1V% 8m{ wO:ZXV2. ȉDqcV/XJLlf?[d͕˹F5{<0@;Qf,Q|\-ԝDRi%O3My$l(tCp;l|7I1(MuB <6TigyL 9+24/u.k|n$ڣLΩR<7 M6dgҼTgҟth&qK?CLӊI5Σ\ӣ ޕTaPӤg҃&;+*H}Σt>8wv@kuCK hyGMud5YŶଢ଼…y}GXDEpʮ߷;OP@i=,e|zө?B]C^O_i/&kӹSq.[55nCK6ɗQl'FgTWw(sA`v-$l(E; "$)ňa8O$MYXaExY\g ( z(6k&R5mEVJ{i JʑDUӴF59)B|{ݑdڽn>}द:;Zl*9~FIw[L^]2g&e+c֓Hv+h!r6Eo 7c΍a^~IjDGs霹ؠ*?)v"}'Q^'󫹶EݸY K'Z^@Ce(NCCq_I([_%$bwm4e8U;]SNNfotA~%b6dX BY{]]'/V2yj!NxnU52dng+RAZY2YJƴwFU) gL4Qp@+x>Ӱ}e?90DeG:L7Vé0ݯ-p|憈ߐL4ҡ֩/ c}I58Z*٦6" x[VxME#} 0hY{-PR'86L$ `zTq8]v*ML \~[w#fGpx1as/[m^ɻfUy=O0ܒcP0,"㉿/FBЮ.j!Rae n#y6ٜߧ*oWǎ@5GA=anJ/lI?z2/(~wɃS7F2xC>QbMoU˽aeՆi} {r1,W}}b8 ye'{Ke~~HDD5t70ŷm/oիʀBX#F4uZbc;dcձt} `/wTe\ /ŦJڢR~q+G)7jNȨ<3ݦ "锔{ҷkF;;HU@}X's "FSf#^Ϸ-' ɥ}N9 hu!|'y2jvʐY@Ce.꛿'r|PUI_7  О)8Dz:zM0h_R\+++XE&̛5Wi#5uaW93O-v6RMT!A^ykZ::VEar8Oh~;905:E IڥĶBpM%L]WDW>뗖B?-Y_n^rByS/M{z)Bfo!~EG5"ן ei[#7}3HhBXҀQBWs)k/>҂90[A(ՐIL볌ZbK`) F >}R4VRlV?'y=Zݽ g". t4ЉD!9p' Q\.&F33v6T9ۆ8n@f)OU]AgɢjRVXYn:x>_5aa)<z+.,zdfZ)pͽu謘g@0\ ~G92?p|۫CL0ohdcmОHE`]jM\if|:.zٓAnŸ[+?=+QF+2V~*2V=k5m+0 Sz:[9o48̮l6AwFƺG" AVEqmd{q<`?G!yʶN I{ϓbqY}50%ڇ?{}륌{}+S 4Uݺ4jIIqlB9JKhO {cǜ|ycozuzkW⤄{2_o2ŋ$o.Y̰ AFϾtR cvX:{p>1 [&A* -J!ih?5WSA5R6.)AR΢Lt>UCf/acy J{2>o%Tpøإ ^+ۑZD&U&x^;q;^CSEVد.I)I! 7a+iye|zbnvSM'He+k N9*%ŵf\aF^3 }Uois!^EPy׊[,; –4I0}Sߚ3oDdG]lIL.aX}f(~=DptDi`0dNKIB(7N}ɭ%ID54N+\"7P#Q혆q߾Pu(@+5_;Rb#ġ )n]|AfUFx!~@Љ %# ~M *f[6=11v𧂋r}A:ÚP D Rk/R_vuB|}8X{VaъLg$gL M;iy^yVz":/Ɩ*ZD:+C;; P5#cQ&!3bgh:8X"OBrWI(#mL m1KCLpq"ٿ1}ipDl_Ep){Ik9<:@R&|4M%n.o*> *@TN9vbLVo89ݻ4iޕ/\ 8YkF`e#®}=H4H>mk} 9dQBEH sUɡᢐ,VS:Eeo&ȋR_&@ (F߼%cY@ ^w3s[O+_ګxl69̓)ӈ1>hհKb%3;pJs *V^#9 E*0Xv\B{281 RwxHѪ[}JWH q>(eY8`Ks(W;? t 'h]eAs(}^1,[cQDgMvcL kP w56j WnH}'7u|O>,}ZӘN hċQl( 05YUI2|+}-e#cJcGKc6SW}K*G Ss'?7ADƲ-[Ց%h3JWbލq-XSF q7yclFo*l|Le{Nw bg޸Pb{[V:5h{+ZK[5O0H P|_͗H]d X^. tZ'ӁO[ׂIXO x֊N{vOȉm_0^FՃKߑWɽ[A W*d@?"@XpCcBȃu+>AAs׏$9'iXə= m7 M 9>زƪyjMQ yt7N9z#9m4Ӑ=b8xM)7C3iYElwBar0N;${-T/vgJ•@ƖZ,I⍛/Pl7"mZEgIr}DTt%h\_gщ IwGOr;GskYap.NlB} mK;S*GG~nDpem WjHBid.6Zdunr+X6hgMp@C? `2)cmbr#;*>j\jfs#d dz1彣ku)s끍kr\]O.v19ަС+QUNpsCIQŃ4pFI Hh![wE9:/Ectn>N4!R l=l"Y:x^XĘ~va?ˬLnݕ2zg{Rz!D]/h :Q寉/)yR3vKUE|`3BOsdQߧ6eUs8!}n qZv,T@t=:+yb]1yN D3io,ó+pLIJEТ _U{8zJ,2 Qu0?tt,U&w3"58(1lEz aE &ՐN]_Qcr{A`y+܊!v poխGѺ 6@Z Hc|lm7 5β!5gd2ps#"f,&ә8O.wҼtcQY뺭N&eBϳu g+.R[#BճTѓ~|эtŪ)W^v Pu%0lDRtS'F:UN*74q3`%=]:jGGVKb),9C JTG߃0g kKA.m1)¡P7ӸîNrSOf~Avo R}Ujfe=38%ۅz둅2W>-2M?2h$BmY ['NN,)KOmI_sOw ioFAPmkFH~aWoid.^!1ay|/"iPE%l/YH{ʖ lۼWSSK=K 9LzĘZT gndS_%t2J(H=Tg}Q3 (0t6:QY#̞/QX%]jGsܭ<1Rq[2fբ5?c\&y~Ư5Br˶KD,jTow+gaTX.8د Շ0?~O ᷴOW+6%^QF~seci Ɨ!d!C0fA}6I o@/O{Zxܲ9rWc]uL&GcrbK-zGvm7 S )1aݹjW˓<,`)ؿc(w.F_TZgvO<>96$4DŦ4d%lBշIX=xQ55G/V3!Uկ'nה4~UC{'N `OG) %F b!K}egͬPGďΊL8{_eS6BVh$ILӅQ;?.?HOu8݆ZL R=Z/=-yNf{8~jv~ZDe^1`ex}*Fݧq_ѵz=Eqb#kn5t֘ c*,wZ̈(t2rXcvx;؃YidoIjfSs`8ufGKy]q9`[JI3!WKpڰfiJD("^"[J<oII74ms0]:$% eߛyGbEy/q~Ӽ/xKJ` j97вkA\=%'ua~{*pQ8xUoYj>eNDT^߱[ep"C|.y endstream endobj 102 0 obj << /Length1 1468 /Length2 9434 /Length3 0 /Length 10416 /Filter /FlateDecode >> stream xڝvuXT}.H %݈3C % !!!Hwww t>w93kZ׽b_ g-ZTn~>\E :+Y!@u%%7H?G }F^. ?@Y9!P/7`X9ܜ]ܬ!p;9/ ug.5 qyH򎎀Hp A@`䌀X9"!`^cC@@]HY `fd1p(aHe`+h 4"oݑ!0H@7GR0qݐH;@9;!Yۃ đ"0͟H8Y98CaH>X$2X@ 4xDl66Oʋ 1Q?y؁V.vD>J P__t/'I?DHB`B #/Ȟ8%cC?DّH  urvC6,O1/@`pi!1C>~!Y$ж8C6I9Y!')Ϗ5Hwg\?s ul .?ĎB@W@6&QQ PvV0j: aqWdOmŏ,/ ;9ύ #Cn7??lqp&r٢ x5u5 8#}#/7=+3ۋm_VeCϏtD~6P 9uon,Bq1>q;_Hy + ylpf6j7/sca=zo4e~9ɯ7 @Q*3½mvww¨[jN<ÇE5* zk)Ub*ئ(8<|XozZZg|$4lVs)qZنD\֛qv;{ މERX*.p1zqto p^#{& g{Nz8.חe(rǒ( WBi4fz'{zr"/~LLbe5Nt,aR9c{tׇoߘi .J&Ka›G(4ͯ{ĩd:0<(W%ā:I__d)?q&Ph\;Pj|y§l:)9qASs-lifi>I<[J6#}J@G'3GW.YUQsChWwjc^ $ ta!Sә˳4.Mcjm:l-zol*\? 9vUhn+G+xo#Q2./PV[-KK[<}l2+ykR?ǏX '8T>!5NB\hy;7?J(b6IC,!2KfQ1fiG">U^.S86yb ?6پrpgj m'CZc6f .Ƒ7 hP[qAPøaAs4|vieWABKtuYH_9K$[Dy|7<1I׋?dX0+ acwSaEzK$ᬳFy;v˸(?׹nj.ţc/n3vC80Ք5xO}W+ 4lG-g7\{pKVMQxDﭤK U76:B twX͘4Rzufqk xwFKB^+:BX eؿ9u!<RcB +B=Sץ`MtaPfyYF>D|?Sf4完FI>ڪ׸xg=;mC{yiU7^5f` Ʊ{K%\)M!aPnƣz#@bmo쌄 dx&@J0 4%6χ`+lyP9=n\GbLUد:SȺs\uxcd싦 Q. +ŻP Xg 4Q7 T^˱]xjgfNY4Ig]Ύ3E$hN鴘='nqoJ{7^E h F #)y1_w%Wy.}}!f)!}T2/Mw-F W^'5̍;s/AkXTعLa4 ?}W{2$DPlG1 86amF5#|m^~lCsP"x0״`{,q- WAѼǠ?ҹOߧ[@u1)uD q:S5/n13}cu*lۛ)Ll^y4 +L&e ߼YD_HTJ7YXe7 {}bDZ(tofڂ_ڟmM2!<\6luX ;ʿIß/V J҉l?2^o>R(r{tbWvP>Cx*QykNg<W7{Eu'A?ʞzRc.EX7b#%yXMpP^xVZxLK꾓OB}7FBq7194L=u9"x'$i5تf_3Svtdwdw\hBM#2BjDxhEXH>|鳭^,ߏPG\ْ jrV触66M\>GY>y{HoT}SOUC"IZ9A(ZtT'8^Y ~i&VbmKqCXe!i j|& BOyGQ>nmf*$<υ<esL޼c\zh8Uus+ #1> oЯHYZxa/,z*uV? x<+Ȣj|}сO5?k^gŬuhUnUGI!~ANSjei0Viux|QY&С`%V\EwYEFM`LT>+f7 Y]?~u+ՊL: *$~e*";L)Ra}gqM"r6bM޲ܕ v6z:v)((ow.2ޢ*_KF\,C{¤pð)} ʄ0/qƢߋաOf W,QB2э֜/BɆMe"6K 4w2w>3J}|ؤS2,ڲ hQeOކպ᪂Uw^;2'u+ ьmcUR3gSh$:3n2k#"oG$\eGݓ[]{nEJ5E HnXlִyFu< J#-~AtblrQso7.4kZ?ͷ=mw#Uߴ)z+5hgڰ r#FJC#NA'(3T=~)/GRNjRTM&\5%7'Ny Ǔk2('F(gvĨF@Rg}Z5 .I&c436<9b-mԖemK`)݃M:7&Rh)gw*Mjk\ICU`l}&`-X~:>>=X1F<z)8ҟddS_h}q [/m%ue,3MI{`I_{Fg N(%C\li(8o̡i J-Zj,JX1jRA"䰻}MqQD9ւ5*<[fGD415FXH2-$&jk̨e2Q$%t]PD^gҬWӈ|FmK`Sߢ7Mkw*TY2{QN=K0.迣^-y*&х,(-FGMϣx铧yQqP^59&քK/j>AW2,'NwƦ08F1 @qVN%0i:Ji|pAˎ#iqeRi 9"*&G^ njvqKy%z6;gyó Ĵ<VHK}á[;8++],zM$ ni˕8v*aySM֥ ilbɈbJ}&(?._ndk}Iݏţ/;<&VgA‚5X+1SO$<;n+О?K?Vyx0|FQ&%5<]bΊ v."iI^L˅g\)^ cv2G-q|"[ʼ9 ~YsN׻9x|x2Y$X۸`ra=kx[ը 9`+_11ePEdS/j5<2e< bPfDif'f=.ׯ#fm{ѳ{k] jovʅ"ٚb;m`3ۮOڻ옰ar߆"uߟFS3=?lbh\?dcnfz|y=׀%V6-[U1љ?%Ke,T%&qcqgيh7PvmïvW›U*I cc_fv&:-Vźv)떌 $K"([GqY*t]5{] "ƓV\kig8~BoRjqDҘLbSDnTqw iP早$ _R9eNs}u+齟˶8LG+Q&RӢ:+F [;`F[uIk1T/wXt~ ݻ8 zQP"w:'-E'Pr2\x)(eJ[knhygٽq`Ilq{11ik yTQN _4Ir;rI^ LSR*Z=URAH_8 j\r_~vN{h9H,ͯçʋu=Hgv,Ukcd?Ֆq=o3CW3U G2=(^HǀWFcL4Ub Nʌ[\{џ  {ǰ)P\1}$8 $f[' M-xwqVr]^Ja$N W1kaUVQ`yv-} NX0S6'~uMB="uB/Nߕc5vJN Ϯ~U+%m8Pfc{:qzT3x'7..#!B$W-(qEބi>s˛O?"9 oSJ;Fp?W anl_3 뽖}mo\YDofq+h~M&;8{ջV *1v ^?,r5VO3~xJ`k?- K`P1(XϫQ8Ddp\d8~dSvvUB!P۫iXo[@:XLWo yXt+jOڒc4ے׶S8H] 1lo @^ڷlԿ;/o#e]UZH-&u@ٛҁ87t\8- w7X2Wi^fJ)FE46̲o]r5F. l]|vȣH+=g;γP9>HS3 ڞxV.q ~tRG~`PP+x_͞ȳf^YsA5n7qpx%g=zV[lW$D/F&?7iCe^xbcmMm)[T% 2RF;FCWiY5́<#&]6Իvm3U/!]r7 5,6+AsDiWy0ɑ8vɅKpX*ؤ9a]OTR ls-}!?JokGﱹMs[JZʧu,tH隓L:iKw<9# cc}ؓ xsYeOOAlwER6Ҡ0{Zz{71Mmr/ ch:dMuFcrޟ/XT($?0 l>6h͙иKBYJ_,icS| j|c(a}ܿ2"]!ڈ QpT(PWޝ[Gg|5;؂;im!Xq"I. FE8JiUsy{!?JrQD0iB2[Yn*N8q=:4l8KbŌ4Ww.17UG6_hDm)$[XAIB}PP;7x{2%W:aMś׸H:v=I3VSc7ҵh~$`N?^ 9h'!SKe+\a?my0OO wtūw8=̂vyfA4zť1r Î,&޸&ϸ˚cئ)jUdXX36s{9ZnN "oJD咚 -:A yGoTWJ5- Hfy7Aӂ@_sN-A}l)LoZGhMGkTE&ض7w,_${|nD-б"TI=|JYqf"e7> stream xڴeT[5wwCEJbE;ݡXq}9od$;ҹ&WQg5@.L,|EugVF19Z 4q9H.Ve3<0 tߝSO"D 3]MM@Kk {8lmi;#JŘr&f wg[k9@I r7Z@Sd4%jʚ*L]A") !! j}Hkk:Px7]QRCTCWE=Xn@߶;3R{Oirqqcfvwwgtuva-ae pmW00rXÙIR9ߥ|Ozw!\ִW86V&*(M\&f.&.΀@s]=6M] ~gv>&wL\Mm3*v?6EQ%Y)Iu Fs`TOz |.+/}H%Aיִ'a Cmrw?F ks:2k:X;e%+݄6K t=̬6gNYv9,L윁> vx?"+7}߷ ?e,@ߙ-J?Avs"}a=?A&v"?r=*.fV_vYu?&Ϳ{}X a|W}/Y?1f skK' 6Ddy6NN7=3="'Y_,?ݧ?gl?lo 7`7^{a d0;x/h~tAl*8gu] [o̿(=Yއoрe<9Xlrrs3f\ylo@3ĥMRCpdT 5/i܏K)SmDY@ἯM4y >C߄:ԁ8v";&DZL%Gr93-?ZHmloW%-0s`;LEtvũvHѥsqG`;v!#kg mD.`!؇p+%)%;~'Gy$òry4NpQȧEhtQD垊Q]?);T,Y)TфWoP:pA<fB_ɰBwyyT쉑=zPw?S{w6ŜP#ݾD$Q~6z=vIs-C$" {]J^wOt*aNұ k9X!RKn>(l̕l MP|0IFx~ D_b"ْc©1ZTg :[{ ER#ڪJ r`SDgn~تo usc򣇡eb HÆktB,=D).=Қ,}~A9g".ϢW.Vҧ7'׸_np"[u&~/F'q5_Gq81r;#2 *~*⣠ {`ƩHc/wWK\Xf½Q4_NMVWKDvM$aj* A,8ΐy IOj:C#2P9~ 6P88+ ;Hy>A\/A}M1w);dA0%`d[jߎb ^^Y"lZ,Uq*MDCTh;YO?ʌmhBJd" ZIyQT ^{O^rn%׬(ڃɩAV\'}h0Rmp_QE?p4-ֽ 4;?YNH|n⿦+0;\&>U3)@)+_ "k9|9c@ [ޫg՗j$!Vj }uӈC]0IϚֶ6UI',d8iwt5)kͪ[\KJjP9ߎlJknxRصqόء^ STBW-Mm'ֺvGX,;{2XIƢsJB ]DS֌NŇy^SY^N e&ǢLhxD}:`2fvwBiABs)uc}!!EceY ʶyݩTr`GJr3`+'[Cا=`XҶEG^D}Awƭ[ۑ2nk}DLDz84O)qm0Dq1S铌va=N@9;|XMAbk$.e#ˠ9OI2ՕwM dsȄ] @wqd-d%n Ci~\5o|8mlR+YӖ+ SVa(6tV2[B{Y/^4O+W,BĂZ^*T[lKRyD_'{NW\A8$[ š2A~ }%ݥaxqxL! qqB*o}azm45mQ豪+i 'iH;M<(߾8CtQsᓻ2r[F.Ǡ{5==K?We(UURzj4x;{[r.1G4̸*SX٦Ni?̻ߨ:t^:?mJ/7(S,LcJC*0rKxT'$**`r!Y#^aO4#LvL A20MnRWMH'.r+WO 7mL8njx651lJt@0\[+xM9W>4gV= ?h%\T#fjE/RIE4?+eټ{#a $+qRkS&\WhuMˣ ~x:q(  iAaHs ܩǠxH\L^L{Wr9yiY49W6CrӖ{P)bRQRgJ=4bKpp;*dioz/;HCKȗq8ߓp}r!L] !wCP HŘمvv! Xy†S!1pw%|6گxY(hҡeᕊ:hNL/K<m?qt!ƴ,n#%vjKdReɮua ~hn%&Xk{5ͦwȑ`sUVT$,7jr=q V۶vn#L7FspamS ̶`?4lky#IQJ.Od&=+1zuie}**ao%̞ƿvt LC2!E b=rӅ^!ָ9M#w/։ ~M:G$]SP!ݒxe>-eڌgq*,I1DŽZ ` fZVa Sr' V3[sLlL^°ǪGG4m =ax~׫dAzzz_ oFll\wx_71 SoB셤FE>_*(AVECyW(6Y}W2>e]>$V= xKZ XF/V,v߸f V0/ByH &F(y=UQb ٵ¿y_"+f. >V G*iX:.g/5|_`Lئ8I?${d[02A&%X\:BigC{iq+Ї溑OȝN󜍣-Y!XBMza&>o*D+QNJwX8 t|:l!R5K30OAaHe#L٠KL0@ ph+'rH1 ?Qas;@T9nbuݺC7v&-[l?*vUIZ]"4#W 9($R]scͣ ?:zBbVuylvϺfjўdhfiKR^TV [,^F %Vqb\ֽI#-& āJ;QBawBdfC4 Kdx j΋4/EiWeU9}h{v{z?:Q"l_Rt $~=õ2 %׎8J ā+&3'[%զʵsP`H{)οU̍"%iȎ>rCco,f"/_sO8!I-_yα#u%`fͫQ#t)~C4J9%|P`:( TZL1w:Ys(|mx1_c>ӛ}Khkd{h&up# (HB!:6NPTʹY׆Rt7v7u=$MU((+Uߘbow*YBi{iLy '*HWWի7ÜrÄ~&Nv蓘3JӦE·ϠwWô՝ukIIuW^OKAo! Nt ęs)ʈkSS}OQXg쒤!(L4 .Z0Pkgo@$xdhH1 tQ^SVz^ߠb؟g4+uY$\֬H|E0E=}5>6Ԕ1#PgƢ8|-mJQخ۳FTH4W_bA:?+#'d?v^AyB_oDuߏhOtKQ5Vր"(9 7eNM h뚝­I,!^]3̠MqZKNPCFWy$#ٲSZDe֣>VJdN^ |G`1]Kg~I,,]B[%Bɏx$y5M $2Aʢ]ʉGECME{sCs {(7Th*juBbEK-mĂ 'HB8qHe͟I|>Kj8l'!R/:c~2FJ!H}UYPj`ckoAZ}3*ev)|_nrD[ڙ3q)u?ƑV;.nFen$kdB5E1ݮ|+mӧq끩udnmn(##9λ6܄z4]5I7Њ䟑l*Q0M`bE]4wH\1JRrwwC9yf}z>ړ5}|p}HP9nH3ʖg1yɜË+bmkw5 _#RgSսݸBL]w@Pm'6SUEFnŒ-PxV%g#+7`T}`! 1.#,.5b}Gܧtƾ,OwՁWL?[{.*l^jskv fDkb(8e՝(h,MG\)`1GNEe^Gu*PN"f@nbdX͗6U՚'Tjb9C͞t\j'EUȴ.]( *MWNt[eh2٢´Y= ^ e}k3U^Sڭ)}:Ym )ZƷk tBΦ!#67?"&qȘ&h̥BIyN*_krf qpK<.<}D_ut zRh(:؜ǙAߓ=%cq? XJ}#% M ^c_k3=\ sn/w[IqD]3vE&QsbT oiB8WM_/Ӭj`,4ܽLT_kT-ڨ!qqJ3\hw$, SJjk^|BD%dO1홗%ѡ[dJW6v2#,(nM $ASQ1DX?7)ϰ~)_14-&9JkŖoEC I E;qɧ!6!I)qa#5tO*U0\iPx=6U԰ZN9,0nLThC]7ZAa[ 0݆;&U/Ba7 ,3,LGOxt$~N.nZ&[o-ˉD $tq_z8$c8j]}&!UQxVwmyz[!z/gZNz͔qxUdf+pˆ 1vn( ݺΫ`Ux;rUL;U]iceSzXeUB'bM󷌄ΩtDI奍rƧ/xT4l i}q%suN6 T%8p en/ٹ' 490E}YHt\n>]xZ'rmRе@Zt5Q6j1SjmFG 6-AoܯdE‡fOL 7oOq_{X vYxSQ')H }l, K Bە4hL_\3`}ٔT\<`Oʎ5~xX|,Ls+@T"һ̒-;)ԃu?8w'/kkQZ2ңykVfIm=cZДo)!WP aQ1u)LC5Jūoؽi Iө+փx˕v3]ZO ( \U2~<%ĕk) &9Vw;z Kaz6^L(U/^)4G,dh:I(,S,Ȝ - ʪDoaZ9y9ZЯk.C933WL _Uv,.4-ыru5[V,|!0IMMLƍyO*}h>sAǀ)2 ,mWIٷu4l>ݢp͎arcϬ/~k4=?mЖpsefnHW-8vK'$fNnhf;HV=hW\h{afnP@O!/ : (Ud;?=$)tXS5 Pf.ٞ1t^EfJѣ w}K 9$;Rؔ雯'$Eaُw YԒҘSΩ0T+*HSkBʠ?yVqRE;Ho.$Ɖv%\{@q˓E JLǶ>geXũAQ)C'`o׉">޵ho_3T]*vA\$zd2zoƳ>m| < qwps^Fdzpf8^ғ£|n_:EvP#s2mK(4u(XrG/ÛoRU Abǚ|ҍ+?ϢYW4ib=-6o/-?7| @%>vk! TޯoR)vBwd} /!`JqCC8oj `$u=CG/ =1ad +K~2e"J$7⢖8k S oZ1?e*y %E 2zל&d"~>>VkS;E?j}sDNArf@uʊgkՅ ?([K߃@Pt^jY*rI֭# ,(q̜ >!x!~(,yd@,Ojɉ28+"ۉIUn|is'@ G{DS1w9Ԥ/Lׅ-4] ^~2 =!0?pqvЯqQ|X5ϰV66`4I}oIצն  xU5N!t M^˔йi)`vr /Z5_f@c.% ~or_|QX8P6kK|dr]fbې;VZ$!RH""L+Kp(wj]HD 9ߐJYC|HUJLiFCBϋQҗ1)OZIUB#v@v[D\f% 2 ɌIEZΆtE= 4{e-¿"=cҲ@8UWP۳肿ˠd>3)3&ŃltNL.IL}jK\xqď&CG( ;GlNAN.nAv8[- gvYgnxa.w O6*_EL" @i>7Vyd|Mv%AD|bW [@SF*l,mqXI;%y#0_읙V\<~#TSOv^A$QiQ &( $EpAuUX eKlGYscK.L,|k 2RH JϡuAֲ;vlһkXa@(6k| (ouy(6$*ε!XInѠFy qY o7‹(1J]>/JC3LO>:D퀒.NGxwcA\;ay` ԧ7!hdwɪ n]4@?eEZCIf]~NEGsEg05=6rc&>~N ^HB9̎[v8otO8s (WNv)H'ЃC8+s l1cK0.l|)0A%+ %z< y#4ݳ׫J NET~-6bn߄ ΐ1{5\ISY`;4rnǺH ¸VlWf'HQwUSARZkȷ;+ HL/ȓh CѮg삚>>4+oK鈚T ¹C8ˢ;L%ehtnmQOz@YMZv\b1-eTYc_g}ugY;Ecje+*>2ADqk_zGm&)fԇP/4~W?B>Z%2G0C ?yp 47eD OXNmTK'^=h< J8ynitdECT}N,`;J @Fg$0 E>uIe 5-AFYkxž$cڀ_*L?/s z,~_m?)`_DV,h*>7Xh"ԝ=2ظW˷0b* M3}5>Eφ6/XDkop:0GZLm\@;[5~mb/Ri*eکI-NN/kqV5_7qu&{l Éɇ|N;^q_kT{BBqo Ն6ѱ?gafi_yW 1LUvT#ˌX'D 4QҺaXOr[ңm$>uCSџ0€c#T-QbFD`eu杔%}]"OkbOofK5 D-E8Gs}+h1bvnȈkYdt~K+fT`k+W=.s9ҸPkgtF}n@EE-aˏ&GkFοXȯeO. Fy-qD@ X2*ط.9Gk:F[KeɐgF6ٝ[sYQ{'6W)eEȻv.]Vf;ߺ#kNgH_-+6hT=vuu}FڶNauCw[GbE1K몚ݔ5B8)'\1x U@2LTzӞrJzDk~Ӛ?.rwϗ 0 Ht31h԰> KjSP`7mqLJvV8B2^l}#\7272ǣ e w:K?Ea@U ِ&8*LY?IyzN+ ]ފzA`Jxe\^/&x^{;Ong=Ok k-E2R5 Q@ilpL}YlMo՛wʘ(nB,~M"+ l{ZkH+j)$˳('(_P%nХ 3}mRwgz3OxÁF"YX GhZHםu&JfŶSYdYW!3pI5lA!,a\|x`w-W8;|kx XḎN8m _a|rF O3ē?+kI@<~f*B}= ߐ #F{r ri@C͐gTxjjH!BWe=:W,@L_e](9IhVmu1>~DPw9|)򯄍"^g_@"$L6rڬ Dw#xA~wЩTIK "8#fѽl|D@);AxS;ogY;alBQty4_*OblQ,Է7'.llRr7`7cnr;#x+5BDKFS`o &;kTOB:R#R&CtO~9 8xKI#sֱaD7rܛ!$*|JNR uGeCӟU Ao TG =t8,YؐD^ok)@ 2ЌIu뷗[5ijz.B3sa1z쨿Bq qeVfXw(mHcfoul/=Y{Ps#(nƍ^v A ޽P".V4JΈVAHs69&fa@YW!bl%tt>>&TY/mf&,!>yq߉6>G-3_e:8<[i<|r /CvV cDH0g7l;)-TQ礟xWhԞY֮ E+kVƙWLS|*{N'#Q 4T{EG $غ x>C@܆ߘIG2Uγ]^4\JL!UdjHОvn{[^N`c)_Vۻ­]$ #4 Ae412Y|qDyunH4XMHA K7+$5n.@bPo6x0eM:,CGu`%~icCgĹ 74Nˎ/yR@[]gf^=bj%&]sF< c\:Aχ2SJ_v3b;]܊|Äҽ\'BH}ғ{G1KV {Y^uwQzS;}¤mD V80*F\VT*VBq ewO}TXfHloo w(/C'?H G?:X=g㨖}l;I዗$Pv&t/t55v}?)ߨDƲ]`)!3P ~ m"O~!1 ڐb3rv n:hOlUrxeƥkCW`l:A{FQ럺2r”b Rqs/( Mɩ ղ q7dYvrLaqu _lmDES9жEâΨ-R:|qc6׬uPqyi/)[bx9]'.S(1R20XiX \?rGh3R'Ί*nw>m;lAq 祫'>ijx}rJCwf`dnap7xLum{ó>DN2:&g!> AѴm^-  QC 'Dwjq]aű,2DAJnxqЈꥅn|>gAȔ;lcqHqvskI%$B 4*]>ɌC/\2B K ;^@W]Ve:J,܌b5?]ITTFѫ塪y,#q~:A纇G㒏(*0 Ѣu)ubٓ<Kg}Cd#MnɋuɑQow~V<6o}8A@FbkhǏ ܢb'b7&ȵpQd0w~y4 )7ꞹ}PæL7qu/(~؁1"Fy]Pʛc_vì0&U 5HHd1ŦG1'F+]$gT uc:[i8Q~`y)X x# iM^l:UFeR8i5D6) KѸt`wP8UJI1EۍE6yP"S. C ÒxK}HLQ 3Kp?>^7(F L FqZ|%@&%O ߮sc7ݑ^OuڀT(MpqNA^bIm8& #Ɇ&/AhhΞ@O͇C.SKk&teu;I5$Xga }ǡrP Lǔn=g8VMqK t!@uhJ 2N}M$HB2 31N$t\]t' = τlw8T"@jlBem>u#(xZ ?ĩ+3X9clN~,<ψoZHN %G.C'X,tA&Se8xv#aVBퟑ`wWjcPW"I޻3Z̻+b;sV3ev`ά-3,&Cz]>'v-bDCÉ ~_mhK fLOh$۠hG'ph Keןԭ[_[OP" vmD{^f>A0Jb[kn_md=D<US6.cPds<+eӚ=V8\t\I%`E/bFIwxr2`[84n2{{*u,9a3%YedSҌ肉 {X-хp^DJ9npxdW4tZ+*^SMwI DB3ܵ2rw4e`3c*Ϝa ~5e+ktZE XxKBfH?h -YǺ;? Tٸu\kޟ/pk?gi}/n6ny&WSd_gR=҄$PFXR#"K=yCAwl;?Ou Gqy;C=ҳ~ghj5s4b4 "Na^bWf9mS4$.iݳ3'뒭AN :lSk5UM23fDq#\CIV{NOQ1NHޭ=IT(UKܖOP>="a?s)i^P4/uZ/2 i)mrCIM K>!Pɶ`QJ~c!ӥn!^8_rA~*= xNʨHc9?uyQ!HRwb!%\5'pP5+DyʬxMV8[πE]R38׼)(u*0zV^Qj/a-HaA=Q3~>|Ba^!-;!mt+A_ Hu Mooe6ڣgy7 cfZ~Z]ZJE-a(o}JotX5"ޤ S^vU$5V}H>Rx4sP 0d5e9N> &^e_ U bCVSF{FbA@EzeV2#YnTw*<6 ͦsVH/I85D. Tzm}#SWF)xA $Őb%Z{?}=`k\04XxcB d?2KԱ:MSURDT}F̶a%!D=LkC#J8HUal͔Gedau;1VCR_Zo=av6tRwH|s j֍n›pa.͏v \.]douDr.&6 ]5yb# WwF '%ZaΒT \ppt)ݚl<,-cB8G尊0}$*KMzoLPցV#SW.+9}5`B:H6ašo!54X/@ŷQ{"AP2?a e۟wUιxwduZpmv5{qz?#b$b6~tY"2?cO1H,f~UOewVż 9zݓ(jM]77HSuQ=5*C=ً4%  8BJ_LFÍRs$дtĮ?~WݗWR>};'y#%Cq4 Geے dZ> stream xڴeXݶ;ŊXZ,8 ]S;os>ɓcXs'$J`C@rL"`+c 9 3pX@6j6@f?ށ )`W;sS3{ Vzf0d ,1@Av~T`hf`eԀ_*IEu%Ujª66`".IVP5j?Հ C)@A{tyq5a5-%qfƿk0v7wfjbٙށlg`c?53s{3Z#hp0șAI9G;տ@jcf`O `o1vv{mE+ӵr4p39ڻl {s{UḼ3s?ܻ@\[OXL`a0Sd, ~gmw|bsr۹2-A`g61 :(-_`@h 1mV!xۀm&V@Os psz[H̜cs#wKLL_RNc0` 4AbT;ˁS$ T1 36r%KdK`iw L[(Yk1{a9X.G#K >>lbʪ_iS0D S ;],ww9] vxO8:xLvH h/7h?&oL6ݿF1Ys]12?[l 47v0y;sw1Ϲl;=; XVnj[ݿ4BZX$5xM’s3|YJj" 6Qx|A_5WL+ mx{`PK_) >*bIki!ru>FLa\%ꖶ:17~tYD܎81*ܠGxfV?7gTΦ]6)WM+u1F>[ ^zT7F4paYjFU(\|, ΰA xJۭ\}^D<*)ѮH|/l3AkU3 k> LX 3_ܭ֬A=w* KeƐĐ ]r#}<{^n_1IS+8X$ DG22J/Y>Ԃw4R[7D0'\:Xb pcz2ejsVNL${ʕh1[k8/G$nuF<|t Hs@pȧ jK!O*fQNC_s>|Y,Ky"  V2mm\H9EBYV麫0>BLjwC|oLTF˭ߎ&{_ ɴO=D-VI`\ddȠj#X`i'?WSujD"_KG:ֽa}u_jO,4gX#:53 EO6ӘђS p'NAm9& [j~Ôi >a͵JaȂ4%̼˩(6E`p@b%juj7LZvm-Bt8u$)BWF?jPx&N~t#zmR94X/Qxd䁋nU3XV=}o%}Lz@7ڤR;ұmV~vVUY]@4O!q~@;"h]'NVKXg1K]:UQa+sF?c|ˉrhVmğBpiԯ;Ԅ ?C%" ƖiW5iFtheOe,ʤ2}4wՠ5Z)76,wc>i}},8&:@zmDZCKMo ^ԣF2T/7K(M ucSC/-"J-^(?-BAJN8z̅0ksxN_jwLz̹dY tFvCU(hw]cpT534gJBI-qD+,:l8ȾV3Ԍ,y)5}{BBkE[=kv~%Bz zٳNylc&DDvRTi*@z +"[ԍ3G<L'2M 1ߧhu4Wm1h=+<_\˃%uat KanԊƶxa#O {y3lb&tWZORܬXa3o ̈x-.K#L-U/s|TZ R5^4`܈&!w250*ӂdBj!q3ce QBgfݵOE,'xjvđ<X&.Z~`WӦ]9H[ђdΙz ENxèh]/Oϙ ao{D~izsآ^4WsnlerTmj m9~&2<)/j>T,TfHNdvfՐK]DK5x ﷈Jym_*+Q VmxLg\(CöO?R cbw5W'@k(l1qi y%ĠwTSLj !BAKdϩw/bcAq}? wEu11 פiǁPέ7vTרJDHilXdm&Њ/X-5j'@ Ś&uq} IFL "M; &G"-} 8P}v& &XYs\ ut*P[\;=In;{o\ߍ+G6xP>C(^q/pSbmo1,,*\${ͽ #:_6+ac~=\ALd(8e%,gv)ڊ+rำxC) qvjẗ_9Kc-c8TVPih1;/r2 h#q'=򳏨Z>Ee_U! aLQAp4s̢O[ꭿ-nM'jKcTj׿L֬aÓ,ysF 9J?zGLXG_>6R(~;Bc]$N[Q˄vpx(k;mZ){+kX贌L |Ɠ~H9Ӌ~+\= ahӰUBrA+M5C߂~"҄1s륻<3cTrua}~TGH\suyuZʦqa([Gy#Peyp< |L'R,]V79޷w1R.v_uqY3=Iwʻl nk: 4{]YqoC6бUZ;8T=msf׬-2=['3#>LDy4|*>qێ$Ţх+Q~R+ɞdUP[g5B{ xf'MXd%%䅒ƃ$w|@bG#e KOz2*nkSa=1f9Kf8g$9ߵ~(( `=ϣ93ft#R()?U(rxvfmDOT&Ha(r},šK'PM[ϧuc"mjV.zZ*!Nj b N@2˨!4dEV2*yESPm- (ՏJ2'zzYmNDu dU z6{<ę}3T:Ī)0Upoi:"Tk r{]ORz%Lh3UZTk|X6ȑpI.3 pOfɦoty⭢V|&>`M-q C9DĤhWUJiD:`kߧ_ g3nQL+4dԔY*"Q9=7 /JlgI1Ψ^wE1E%KɊֱ'L3].y9&cD$XJOe?{1:ZA J*.)^R#64OEX Cp,ב"h)=s3 H<YW_jzH/^{*Y{hpNJ!/  Vx~d&m%[l@=(~a" *d#\A鏙+7N}dm(v_Kԅ:b\/%eyO~ْZs8$X|\KzgqWD9rU_B%~02CgŐGŷ&t~jɏC?APuϋu2/JJVᬃ .XЊN&i%.5E2jm&\ <aoFʱ(W`uVN"յjt>kR—ahLbVKF# :oQ/3)-{25a#Dr6 ?2XpÓl,}&2]1DD#l8;ӏ{-!TxooLj#|+ (Wd5p}]+BZd݀DFr\CYLt[X?Zh^.@q?ECgxIѦ0חw|sOq'(58N#T?]* l%͂IMPjlq8,Q"v۾ tYwDfh =[-B6%\6v췅iH/!dDz@ $p hk,2\ %pVՏ(yf>Pz!{lQ0& Έ<+ȷNGi(($ .2s&ya3.D-@vc Yt(oR%XܛxW#_옋K#o6#?x_E')ϕ-G*Wg?[p [I{*a?ҜVݻwY? 8)[Eb41 d8j@wY!-[bwb=8Sq%:vH焦X}O)14IG:2:KtbK*7I2^l1M_(reռJ4!N/I9j?9j(_4zw IQ ;ed NE6M,vSW$ S28}Ҿ:eɼM^skCǽELNBqВyI%*]W[-3/Nf6[ VG'[)ҥ|Jpt!:`{>"_ܜwӖ#^Eg(;Ʋ ,P)F':duph%JT7m'8֞Cꁔ>ݎ1kZA1,"ɛq[?eex9N[t?rwW!@X T9 9?e=Mބ ZɈC:C$1hM K r*I SP7r+i)xM xGыPL$ ۻ`hEBC9M [8 *eD56͓bUq }h}ˡ޻}P"QWv&pڰ["w(GqRz3inJ'w2I #21kD1 Mnis,q҈v}z.0S8KakH,{4#c¡v)opMJΝ/qށ+3u3ZI9G08trumK`?2~GjW-^(ɧZia ;X-&(0dhL5[WKWB M0*Дx'37Ņdf,<ԚaWJOts* ^OߠNCԾPc9 !섿V#gIQl}+9P$ecMf{IgQXB84<-onFuNsLR]IDDXwQw#/cؾ5Ю2xs4; XPo\ C1[IX(H0J4L+?7k:G0C,L3L'6 0F ݐh2:/'ł7JXnNc׹@ BY"Q/gr~s9bЍt{!O{^23%*_| _N }9,>i_4actTFӸsyY!hva \{o%@vO~nc453 .eoݔF< A%}K=zm#/+<˪/`IF֖$A%OUv㲽R fX;C%:WM. =  idMt.'L„CE߮&Ebt1dY[sqF`>N$TKHLK,tB7tqyu95y'40dgS3*pv !`tPҨ(pM׾z[0y}S t#oۈܘEC2&J  ʬ4?puEgnڵM3=ew V\ k_mJ,ˍ9u1hm ާ&TSe8o4t{e/._1+VH~F r%IdF͵")ޝ3Zٰ,)ʂ(ctm3|{^`-RBV~ ٜBJiyɗ*T}.fH^̱3YU?AПVlYܖ)߬.췉_IO 5vbz,ԌN\W+:8Ӑ~yq@(0q12(gr%?¤Z|̓ jyެo8 ") c}7$S+EA'P`kwN] i^6R.kZ/P t!J[ZV6!!eH2q2 ྍ7^Gֹ3*\MΦT˲4(id`XF0y1 M@ "~/謍;C9]XV3]y*D间Ny g .2h>p !X@ܙ']ߵ"o:ŋa$UWj^ݘ9,G5zvH06j I`MAb[,+E^IoO=NW1Jnϖw%dA2SLYgd[#ݢ_b=uY_:㧯Nz5pV4˖9]<;|~OI=Bl?9)ԈaC>\hG20_k_eCIqAhU;o*BI V?z.(W D>%=l6.f@\ ɂ kwPܤ4$۞iJ9.pT_e0՜3*oS$1)ϩ˽8f~%3Gn&jܯy`AOZږ?FyŅt% c*d1heHpa.xfҳJ$]w DBBiLH߷ *˲4b+rb%VSutpyFcWDt"K<:C0%W qjqZc)svM&[.ba7b&0 L(1~i0cc@*;W/~!A? ̫vd?#v/I+)Š&PWd \DE;f}prJ{H+W-o>5W38 )pϕKF+vƂ iZ%ײ4|Xv&UAd1(Fhэ`6=kN1@-L/fښl;?w{^uW>ܘuOݟ}\vG8e%u({ܦta<. kB 7K;2&ߐQ7K5xYOM YWэ"l}D xۚQ?ac%b/ܤ<hjzk>?!87UM~~[ b#8]V^]ˍXWԠnDm0Op+5('hL{<>B5%J"6 &y9@,jYw1/HuZrq-o#a Eegh<n17+T%/`^ܻ' ;Yp(T'^ ^h2Dq/#G>҄cC$|9<? -AHUAܡxEdhon<M"ZV[s=p(9'+!\}Tny\Sٲ)'9,M{@sK.QCX2L!y$ DXoMeCG΢b~iY B[硻>'E3; gHƿtb'oa/-22I\]PN5yk&h)z}/{ mZԸQlY&(jZ# 0Hh."}$-˞HlEi>iLvVF - juyy⚈I>^SX16jL>=Cp7]0۴m~.,;6݊>ܨ.cV @Z mb&[DGcNv/ǭ5,ICy^Y8Zua{2Kiđ%aBc1u)/v>M&=N[*?Yo),aӼi֊9?`%K"#=}I7[ SOuر8[.j1 Eiԇ;G?ݴ?ϛeZH f5}} la IvmMN췄SaQ3*ht+Rm1F"ʜ=inChFzK aI{YieT3i<=JY [8NsaMQ0#D(؋=;}? s4ƚ?\iὝ0K!p.LA}M Yr8.W"f~q U/ Z~ Ozf?3]:Ј[jN<-K?9TУ`mra]+įdy#j׷B-{1{s?v:gZ`ٟG0]?7]c: )4yyNTᲬZsn6?_wO|] si('Jv R`a#R6ćܼmn%% 0JـV#KF/=fYe+_09\IZdUpQ6Ļ\=L\ -̋ "2Oya.)$3|JfalLFR guX1K)#U"zRZJT%F0}#t1'z951fmzmVmQ0zhnA@:%$%FC$FF钔8xúZ{o55Ԍ]iHKb}Tî5K\A۰W]f_ 8G:*:;.dHmA 04"%%,&tP&uICūl34+ʧp rx4x@x(44]$ O"GS[|[DWtPbp9;M4[x&HBER"՜岶 "z4Wq (Z Hsړzn>iB&9X=z /Ɠ3˼\r.I$0ZYwGy:OrI=V=Ll prDl믩9|]Y٧AG~EĿ~׀=3*iGh)ϸsg SҤTO ryBmLՄOGނa1URXTŭ+F 1p?0Q>RYHROtt^s=zz򡵚pfj2. 3z^S;[5p-ݕ̾Xh"?lCo0z0?vIbm?0m m)vNK}{. Hr-` ^a)n9 WTmcyy ߦ3=Oѷx8- gتO]IGwڌ嬆 !i"R٨/k HM耛 dr|;*LbGfv[Ըkg{R;^tuu0޹9$`6A>pS:|aF.)Nԑ Zxvs9թTWa<,BC1qDBnw9iD/%*z#~KS#݉¸=hmQ wi_ϤY7 VM1i(y ԈM?J"S[3*-&tB{sy{9݆/:/[#poK¿N1=] ;M4i#nϽVf6yH;g5qIKP. 'C'UBjD,ҙk۬*ut̞#2J3V_"x&l&gBQ޷;GG=wp~=,*b B^{RZlx;cz򱳘Yɑ{َ:1rLToƧh?TmZlftJK%\[` 0[k}#}۴#EXG[Amۆ F)1oSNG&G+xc QخH|lV, ;z,Gr/˱=(pj/c E>eI`/>v?S]) ߛFWUkuEۺL\QrG؛ؠQ"t {gMjEPEsM#c;Ýްgױ@Nh_ NCR>RvdҜʺto#Dު%0y7˷?V+JXg(ͽ`Ћc+Sr投 WR YE2N1 5.{_?P|;}H$i.KG~qYج`\74'Ex)!Zjki| Pu׸]B>E9 DgeCd⧰[G4УO:Q#326c/Fz0!(5\̟Bk"颼ϴDM K\x]R?YߒŦ۶&yqmL wjw+C}xt:M:)M6r;=hTtp"ϟ🥢m١Ί.7[bAZ1Rw}~`zK?2?Qz|uju6daا!A< _ K^bbx0 5B*:Vϐ"lY ڊ\*LUT2_GeܸD u~\kz|V¡nfSΚ_9@AO*#AP0r?D]mqTr>),n'z)B0M|tph1'9:[ kX+JwfXF={ѻfNeI)F7%p֗[egi5Lْ6zݝm ^P䈉n${uPLe{R!9]kjGƝW7N~H'XCxB60&mTapfՕPg$$PM ڬQTN`^{zΈb'|lZvw g/|J",(Qd6 ΈN375 Zqݔ>2ΓDt1 ҕjP}()s7;D&D_ZOLԄ (u#d=x4as;cR0JX/ڎjb? yrMoQ@CfTYΧh++pe E\W*+_6rp, nz{1nb2-=.;ǜO80%}h H+2uq~=Ԉ+B (f&lo f~6H'º{)>xsC5BMCƢ`Aڝ2\aΤA:B{*BF|Uh]TݭȒP E*(!7N0s2P0pxxCY2&]&=}Ѭפ3k֙/1F46+0 Pq 1g6H/Vz ŧVQNu= X!;_3< [pxp9›TvҤd-+* OԞ>TOzQ&kVq4sˆ$;ZY 8~4n<]4;#tF!]3w2! AOtcWOLm[zDZ&W?RtAv"!?"ڡ7RJH# KOP7#o3駘X-PVI8E{I^3&A26 *pS.P%Xȼne/teh* %0|;RP"_Ӯs!$.]zAssV@?KC۬t35}XzZD*̛ J&t'ˁ8௼;yO(֩i/*znZUaHT~@qq Rl|G)mGH.ѐ=49ZH'LܚKzw9)cȂљ,,+gTի!Ӱ: QM7ۂ! zp1.uk5/AnW76wca .h!$oXPoTX##h_n'sϓ\uYJF/呔;0-)b.̼IԔ 4mr89K;lfmb\?YWLdu"oI uXu7%qx1[ 45{ jFWpITwsVB]i")$4E^j\.%Z$T_GCoM6}>EOZKJiDOƢHNyiVP3@Q(<'-c!T bo_5#~V  ^wFŢ:iIVGOOсrIt~λb\&ɟJT9~S{ؐ[+lEp.q:^PŖ=߳#(s:]&A(̯H /.}nࢭ&v 0d o5N #e'c%M߭KMf)]jtt䭡dR;)}Ic@n>9jx +p(՘H9&>O›jwX))Q.Qz`ƛ!+(?=8Ge~9^|&>*qn)ZW4mh_O> 2EE.pl}D%7QܼItvU{-je*7a맔}[uVa%4 冫9Ca;%ݹݟ"s@0Zp}*7M?OE:R@~g }P=7b G鬘?8xO"CŨ# ~rF::oyp][3Wh ]jMTUaU`A0O̊hϢ`vdy)hibxob%yVr{ 2Tb4+{NGr8+!F{ ]moγvE#ٔxLz1<ːE[~o uYg|w.G<^% jr.69)JjHil|Ic{@3-)UR?YZ] endstream endobj 108 0 obj << /Length1 1850 /Length2 19051 /Length3 0 /Length 20226 /Filter /FlateDecode >> stream xڴeTݖ5 %h hC-NpkЗܧO`@=\**jL&`#։2̜vfVVND**ql+txN|Ti-i0r(v 6-g 5ѽ,̝`b[o3@hlvumMr̊%@ ֦́)@PTUH*k|Vc~/lgv/,jҌ Q%uIH :#@I{tEIuQuϒl,`-ljɎՕщ`lg>us G+ C;N{& c#o_Nw*ߓN5pOs? ?+lN [{`dB/ r6 ] 3]kOoqm uptrWE3Ǧ($+%Τ.<[&E;;NnND'*.E^;;;]&`wԎ铰x 򟲶zM-lMLnlǢaka wmf '+dmVIL֎ o S #prpy{o]!L,e>*T5e~G߮?cJ>&`[kw E .LrVڀh XXV `䳅?,|5D1i$wɾ_;o-hle rtpsp߉ -#/%z'Jlbak`"`xJ,̶`7$x,`w,lYWe[8,Jw~gcg_nv  j^7*@GǼu2w;p'}o /^+  (,tXnOy2qS x玍gEr#./,SB|$ aWk,gLuI>eRd|m_7Z&oLTD~}}Q%EGs452ʻrK8g2H|'ЯRu`]ؚ1ܖ: :!`FDg CpFzt˓dpqQi+Wrʅe5zyq0-~p6\FseJ@wbC A:Y0JU_l3z\GҔ |7fxþ Z&$46fBG8b ΥK1ad7/ٖЎ:{3cdeLb؃Y]՗bQ=3Y Dj;ytXM xc!_d\E]GiL:.gYN;yV ͛eu:}3\Á↛O v7/\"N]Sage0BK- -уqغfl6@ȫ v={ۉ{GC`^ 9%9cgBK!hchK_wЪhJT[ټǒm<֡|{]9LiZm/~wqPr"t` SVw3Vydlj5oë!Ǐj@ڕFͲzQ%ߒ[m`5(c5,%)jwH8W0&Ntr&P~3tg=@=S>O ZGN\rv5R^tTR[-%:7AdƾmD_qV6eT\^]=ٲ;QyJ9<1 ,>s쭎Gu!b♸"Y#oFKׄLڲrF-=ټz+/  [IoI( NGEZTUZᤕ zR`RGlE<$~ bY@dU/Xd#:)VE<:@W\bi0D';txV꛻N1-ccHj KtdǶTyB=@-WA%Ij9E*<>-ӓ!Oq١/B0)Q_0B DgUB~;W\U$8cw9tx\58>Cb{H"c6^[z(B$0;'QQ Tu*8 5U{ %.qi0b`{4莪1FuTT9<\zj^BT!XZieOt?΂^_xuD纼L>?0k{f4w;H̍N7%+v211dbg㞐q{Q dPIs:K"eg> ,x n&I8~z-xntC0#z&jnF2Bsv }'' 1J>%cF B=Ǥ?p(0n%=`Ϊ@.D"d2%3 9)lY)kYrE96BI.T>֪jUԚ%U_q)nVqQ(TE$g6Η`HſԿ=jQ$p1Ma2Z~("rp~C9[,R]t%TyeBÓ;TA4uBPM\SFPlP42h#_r#_V뢘U.`U:6 g$NYY{08^~L LJ:d0%he51ā+46Z3 ȏy^X' Y1V(hn9d: 얊DTYhG }.ۙ09Ae]LETsDK=Ki$u%8M!_&LV"O^.P=7hvmbpS99'%>RtSx\ƙqo222z)o P7~A Rnc;R._x6>)۝aʁfny 0 d 5IDP> ;p49RoCow!-}g,FÆV^R>b??Iuo7Y/l-6t?3*}|v3˜쭯1"}@hfT!3kə5mb? ;NE(7_Pct~˝ܕiGP'9ʾi2OdҐ&s-O^vXXL:e83 eX z% ڏPm0o&\^wSJBG!·ieNB_-~T>ӯ4^0PKhAʚ=L9 G{k `< v1+E7#5ۣ^0GT| Γ0ܮmo{uRQ +ʑNNQ&&W_oc ߳yfI& n"I:i3*ɏ0w xb eQOZG1BˋeG"QH g*Ƹ i }9ffyK]Ϡ5K~ײb67ɵ`~9'ur_9C0'WWH/dW}pQQ_W>%vs)]+F_)[,ׅũgO%9zH2ܫ[O$iAn87 :ͺ:=(l<;䨹:BYXE}B$Qn'}+dgiTT+4Wa-){ҺDOQQkWΎVq%i4Ĩk:?z@0 rs1fsT9Ucě#M tusZ 'ʆRF0k[_0vqfog H}No.2vԁY/_xUĊ oS%|iL/M) d?| Ob#߰(SwBNIV[.XyaI3B>=$LWquȝ;*ъ(WmQٍ+ZjgK^V@1d8u%+aiר̐yG0Ce fGeĄqi|S%f֣KM?f׺ -pzgŊJX4ˬhщ*Tjz)GeƾgN? Gf`S"hKRͽJ̰x1)U1aW Kc]F1ǣ}uL -@Sm z]?Բg7fVq.P3;֚M#"G@!{~Bʈ% d.̅u2]U{빥l~09Rn[u]i_$j9l|'FȈt6#::FV(:)o֮؛1:Hꦜd]`M,T+BtՑrG1Cw('5&CP~I7@` AULTKoʃ%6>NM] JGI!*Zь7>\I2FJ ߬jO4(]WƯDվ ]Q@RaE wa@۳TCE5_u2*,1ݨU p1j1ДP9dٮбb!TY =P$)a8*˔U/I6*Y<·v&fvψ䯆kXa䷥ D)̫^VVDgl3 d`މmE{#-}Dq?)^2_UN=@ZVc>eB{(cA2wk %ѓ*hV #I.*l?UV%^|eƅx #d9<:]d<,D`x\ V|S?R7Gcgo\prP)TuG4 Uh"Gx?a!Jl$(Lgw&mE0헁( J<9!Is,E21G T~@pbҙ}x*<]{\\z;^jF/z&>uO߼8 ZL{}ssB}#G ꩛ sȳcolTYӞe ,]vhe^Ҥuqov.PS>Ez*g# 7B4S9}x \.<gKl}tCP*֤rDW0cdڔAK`TY tBNB?^J6>mb>R7PB+'_Bg"MnJ[eKo yЅuBCN=.9(CH%~ \Ɂ5M f9Ez;6̬lL\ zn @ ZhƽFOvĨ}-IE;9{U0^J[l/@CQX*< Wj'w|-NQEkv@>㣛գ%gW!$ c.0s1јP^?p$(+(I ӇtVn+=d#B˺t}bj9D锱JB|EyBtRKuW@wQcRae` &ޓb}&K\ӞD` j,_>1 ,'JIApo'WlX9tc| ڜN$[\{yȦbԝ=WmU~F7aW/Dc9o?:)Fqղ۴=)f-w4W+?&gj b$9r\F5 bH8D"y3bJGaPsY)s[ pƿbhܧi&+w۰ж~ȇdm9%89Fw9.J|L sVcc`bzOC&QX% Z0Ht&Eb̿^Bjǣ/kp˪NbVYB}x~͔hf[M=@4p~z I)4r(Ec/遑J"!fDJ5#;Be#.Q fYfҺ"ZoFe:>S`VЪ'H=sf?;-dtš+uy9[c(˜rai*)愎H! 61sfZN8k?91DX=7DmoL YHY`kR$6ͺ|[qrQ>U/<3K>ҿT[=a2dİZls~\QX$Rg1t\A++5r}"}D>SGfzpD *%hC՟wIz'p:X@Z׹08ӏhO۲\C;d3= T  _= q%68+;Ԉvy1jb9~j qCaR?f,qv!=r6yߖl ke/bG&Aʘߨ,)sⰶI}PQbrBڜKȤHq@+mZ 8iUch28oQAA ImFEgt&D1+%^O_8=暤-Wjݎp(2')scTzT kq` iPxS:{ȋlP*}]!\n>G'Pʎg%{1j[+K-=lZJ\I/Vzk q#F9Q\ @Q] x!oI.{O_H.Q W;~M)P`#ߦ.bc+d?sxKD6x:I _I2)3C US?,–V )OS6g\3E>Ǜl(7p,dOI}KB-sH:Z+3DX.Oc֖ &گliIMbW!m68K2ăܢ* +/NhLf?-tJA>UXWKle]06 88e U4sa{JQx|}:vP069wv3Y "x:?Mc6Fj9aج~ CL?D^Lw{M̌㣌XtM*ppFA%^(1䣲%&iX*XE5ph?&3\pbv]뒈0\teBϵp 6"DžK6L|PG'\A^Zc-aJ%`P۳C~?x8MHwo}% )СX#cvXBя)dmm3|=F+Y ߟ+;AtDG`p"-&r솔[azی;kNLpoam~ZoM~| &8փ鉁D2/Bu;EgB<&ć}f/̈́M}t=gid0EaԯV`X2*>so%o0# _] D!@$|ocFۇa!u:/o@T0 qA(PQ7~lrV3`ݦ6C7NT"&I,,t/'ǟXj#8kƺ*-< ?(ڶ_s0-MK<"b{N̡ CG/K˿ ՕR:vn7SUr.Yl"<=(gJ7޶«MKH;:ՀJ]ei{:D ~W"0Vm+#lAM#?yXu:j`&*I(N*)q7\IB@Q,ywT^ao iQI-Q?AZ4ayrtA"<_U%MaF~k⭅sI!D5F-GG=gxcI9^gT e&F:f|f)3*@$lгfvA(pQdFRʲ²L֒x}$QWہ`7WUYuV!sO1U)#KN:C kV߯o TNʆ{~aG|&>*ʌV ׂ~G FwbTgŞEr`m0* = w]ѻ?dc\Q/,,ԥVc\_dl,=f럆}I3Z<x9}갩:4ڤQ,)7}Q]BoaYdq̒'Q31l>3Ɖa~5ݔt$XMgiH&qwxU] q$ԏ8L0 RGx6~y1t*{jPWmJ~|紋 .ޯEPHwLHGTp_!RW4m iivBvEj )~2-yo'^ydADe҇~ڙLCw6sJ21'2nL@m}`f+۞$dLyswUr(X0.U[9k^"WTtiѶ]8n<_:9E0LCxE,P`\E}uz8IuYMu"sn}梦}yĹx΢:vwL1ӳ/O#XOXRt< (_4#'˨yB@K0ua%Flo UPՙWASy ƗiaSm?Q0 sm\J?Cx,p3l Wj:Z,lϤ/ =3,ã(iG@yU(B_#V;Pt$ULs} SI[W*s,![t=bδ7/y懒Ӽ}s>j6,G<&כ{HE f Wun8lOvgNZɵٽDg@Vd6m+R]hUtU2ٔT XW؈( GjK06<-Y6m !(sU5{]gPWPai1f!CɛPV"kV+M8DnPi{ 7ᵝeo8ª+vFYhc5MeT[7 %(Ѻp r$5SԝJ{$\n[=^T bm£1np,"۔χ|<6qmNBe@iL[B;"FFƙ~Ik@)l"־p'Nom?*ŃR㜻ؓxY؆4 {XVC J :b;@߻BFOea <-wdau~zy%tQ>D94Sߪ}:1FcmXYX`s >(HGFBFm)A~*S$.OUKegjYCe(Ƣޖ4p%uHGNIUҤ}y;œ/Tm0զIsi 5߽˗nj׌yM xa!$e P!E&w[rO y1l4Fr"rX/^_>eXz\J@3\L% k,]0.-G8ƹ{D'cюHBh/iǼ*/Alww\K#"Hb,2i-9 #C1NsI?KQe >R)I>QQu8t] @TҒD8(۩Tkf:8Nd.(]^.3D H=h}> v&Wvq1N}*6 tOq#fI:zPBAA図 lxy5- +Z@PM*CALe`7͚aZp_ZjS`i? %RnPKZ=jHX i)㱗q#3r`pr,n6E8}J'u1f >c ݲΙYW my ]>e]Ll}%rLbbH_~0~,9fK~DEߟr}NF2z߆Y=ysL8l3@\sZMo+ "P -DϹR ;e5?NH!=jPuz!;V?WUB `(t?ztz;bG޷`;fȶ!g< y)AG# yځ#k׶iŲ/XϺUͩ"gABS\a:χӑj߄6)ca '` y+;\(Ͼ(ۂ 9+]u,L|5Sl1F(T=~GgMStN\ RH~+a2?|PNb]H^faď?3{&HډUd1x*4U 3̩@gHL`\zm \ۏY(s%+cFO嘀0=]IӌfS!o* 1Xu+?࿕Dwa`uf#*nQٲ+Ma1̸Sj|gY҈#p+ vɜ=-o mi 72>w'LΌp+e\=&ͅxtD;9\w{d\Meec&0ZRm.췻DذbFpzzМՎ*^z* Wd˳LR5VqPې=pp5VՋ(5|﷓'dqZ_˯0`h^-xgK;D!PPĵ@V4~Q:"uDfZw]it6ڊ1G|%HRa .nt$barXɸ@>rC|XLoъ|=d3Wށoz2K(!S\y94lګ"w=W&?vюw!1βߦCxwd{ZPcG'ph Ke.>*Q@pa@mƜׁǑ\̷CK̲'xy4N=#3/~(,eXfOIV eKSu(P 17dG/r-)2U`ԿǗSq^q9CTR>OɒL3RT+'M `r-/V_B9rM7{x(j! l%~#`~z~%L3W'j]6˾B]U3 %E~еqb%]k])*tÏ4%X^(U|8323uB&G}L܌uoGuJy'U( ^BR W+3/3eO,yPom1VeClbПϞ2 jIa Y,8;O&v7.5i,+xy./nQCqZ-86;ysFhfY(UK[@WX)͋ኲ:UƤqsVm<FCǓKB`!Y ]L' /Rz&F։%핌26z3HO ^thFvU#OͷRWu;Ո_z=<F+{%`Wx3eci/t.M/[MqjM)C'{nYxJ# /*s$IMP6 Y [$d ppW92wfM``c ^m^@?{/+G#ƈ3* ̅ݩ1/9AMG+u XbѩكO y QXH`S.TmWdY"{{ ɸv?AO7JW:8]FJ|u-3N-޽r= 9 %pkO?>oYECϘ-#{V ĬCD1/"JbJ,G]pW$~ʁΌ. LB2F?XN&xT8mIc7!G{EzsEREq|OgDm\f]7?֋$Q2햐dIs;1"i"& +~ՂS ';6a˔ QC0g̠zCih=\MNnd}ZT`< _ojd~'|ig8kyb{2,. umK?hcO蘠eit`RUg̹k ' WU"JdqY-oT[*?ڠ҇c+`Ҁ0:o&TP_ z0}c*U;,v9ܐAieiaIx)k2>G'=0qxG}-0dM]gld~l8f!!5Ç#7PIʉPQ endstream endobj 110 0 obj << /Length1 2670 /Length2 26364 /Length3 0 /Length 27902 /Filter /FlateDecode >> stream xڴuX %Ctwww7Cݭ4HHKHt7Hwsag$UVc1%A ,̼yAhfg `edffGsZM\.W++8̃@ :Ns@jdИA. &.`7H N9z9[[ZlQF-``eT`( ":,L`]nT`f? h\]y<<<-\\AΖvSvxmWgarZÙ.I9Rv ݿ.@2q'W^YY`ob t0q0"9;o(2};?17￴e\]\]Uf{Ϭ)(HJ3ȃρAVǁD `ee0T\ dof[>qkN g/k[la`n[ws7G& k'7Ml@W3zY1nϬ66Eq9,L\~@ ; `nm sOu _f0ohyLiϨ9 `@`RǁzI)iG 3;(Mg"i 4Wv5Ge\Mc/`i?&OxdǎS >4:]\\` .XdLJRRr;/DI8̭,gg/frp|XlgJL Wp `rF&ߦ!. `xLA\l&?\E0A  `RXL`R5 pM pw 6pw{G[LDp +p8@vAOG{?X7 L LOo7p埊`[wYy9Z۬ Ŷ 1'xv x͠?d _n&㿶;`5`q"82Nn aO0c<8$0?/7XR?sEbr[ Apk\`U`! t>_3{Vsu Q0quc_,`;߿W?_٢ Ovx\?~jw OU =fs 3Pr0㣺aOfE0lԚQO-4 ͹Zy*GPfXK"tt)e|؍Av =8rcK$R'M `CV_( )+:V?I"_G쎓6 R+:ïvzԾa7UѩSTNмǯtog'} _&$F9<^L_@Tt:9o!!twذnLOdS+@Ȃʢ(ojԝWVes"ɤS#GuSKÏ`7vL{ v}vɟ-كT@u FK+GNTE=ZwoyxOMPAeR-BԦWKш9<7&2}`\y;7SeP8+D!5@%6L0-LMwϝ[cb>$CcskMr4)'XkB䡂V:S诺/khlTЛq܎vbt @fb"CGG-F&?Ykm+|}A7-grJ5%#_Bl$-|UQKZ:7e&Nɹ޶qg;Toz'C]5`fL9ӦH^|GŰƖ*[Fv /|#F.Wf ]nv#4+5QR'Q|eLF"WGU#Wl]B㶰EJd8B]ObGC'j=l{?fl3 5T/^^'!ih˽Bu{h}r ԰.ΕSTYdcye30xut PB TSܞ>]{6,h שP<|h㑅syLM ؈W{$\igO[F7Ge&T([R}S ϞDJ>+#CʙQԔ}±LCĽ-Y9ٖ1lp—(, `3ʍH+j͍.PtBMq=ɑ dJQ쬱pMVI#](Mʸb)m:4w<77m*3T= wMc+ėH6"R._^%$?6IEA]k"(s }WߑKI%H9VrI=uP0XmA0@)O)ۆ _l3z?7KA@Ԟވ;y3*p;,_0\<$HCBBUK/BHMn 'ư %2@uސgZ(5I!_.fYVgӵW~}d:UN%.9~4Bʬ돑ydARawՋͤpzqhk.ϖv QΠa/c'&I8+6E5^}(A2R!Jx_o$jb5aqaQ= ?_I"{PM{.Dfi,քO.ĮFNb & z- }l+LdW_R C1w&5/MX)0 Ɗz68Qdt>)^YKȕ/[#*ïݺ3 ˿S/p `:KE<8,Ե!Z LJ pvZ7\ݦ|2ivf %mtlUūIw}t㳀z&pC+!A$@T[9ⴭ`M#jøTB[jח=vm*2\]Yy$CXQc#@Umm;qҤ}y ˹j搪]u?z9`}xjUk*V.Xv8qc}Ylh#-su \4!n:HOR)ʯۈ*G\.+0!Wu U\_9VXel+x## hA+R P2:&Q$׾a)LÛy&%yFW xHz`qۧ&,k yw1- +9PIwƱdXxԧ"}Ar %W R00U3K.4-g,qɇveR!zDD/[yC!ãg!7N5D&*ma2|@V]^7 R#kR&9TJ8C~\DҡM(i8OmB%CVKx.Xa lbZ_ _w֑ӥ~:-lȞ(6\<֛=mL,ՠEO tӁmiz2Ȥr!7BپAzߡMº~j.{#adw/g( Tty^&1dGjS3ilh9Nah=ۣ&ۜk&QpFS'*DI|`47kx f |6~)߭|6 P *W!ћRe+Zc)Muiⲁ.V]/ wvu*EL7ަKa<'yD X*yu ~OQוּ=긂nL+~AJ˂H0 >u(%J=YYK^7KtVaf|[k~)j) k}9 \rEs"sxcqg4u8RNѓ#f'm, ^gsg)oFS 5sdI/䖚 >(Aݎlg=ԒsL6FDG*ج}KѿsT"Љ\*/@4:$>F/q/N~)rH{ 3^JcU SW4f -L}hx7 dՍO{#4d96ԝm}![T! ߽EDwZ~>AV*oyp@ADV5[5>ɱЇRNm_kBudX󜦲2RON@OZwqq LE+u)=h-ΐO̪(m}rP&_ `S!i\ 0i c~13dK 1&Xe1nwNs▦'d8zN@/FOĹJN]"TNtB2q.w^e6ϪW;vtrV5qk^v|E{ˮ&A $4R&q@gwy lX''Y)ั0'*^zr,ceU3!r>z>2@2D8Gx YjK-}ϭ[J3M~6s`U;PT0g~o!W{2(Zh'5~u<*]vO RW#IzN.e'LW8#paQ`D@{-/D R-2%kPI9rxWh\fC`?Eu: }1 z~_k4ӡ1Br}P@5 R1l@>oZ5 [fߘr>Iszg KC.+T&%m^t*l gj2ywE5OH^3z1Q7` |HIYp W4b.{޷7FDL2|X;-7Moᤛ-#ͅvGL}=VdzӣWľm5?p&^ ɧQJ)!#$9 qH;Ck5>v->nc +/!MM#wJJu*Sv\0]uf7"}iR}m)@?$N-=l@?#z ʊ< URcjLJSOS8%k YE[hhE*øMufnU1s@3c,&p%qJ︸Uv1s. OO_Kz!, %>-dxܶռ`3v`ܜsw=|~+"f< GMنC䷗dwW1Cܦz3T~YzwݾqtwT:O%n$ oNNASxÇˬk_8 3$Q=olǩcȴ иUR rYmW= rQRiDz? o\,eFCOhK]ivKbw)}l316mϫhW.es}n6a-Lkd%*$B[mdz3UtLCä2|Ns`ڊk0G_J/B6^UaW/x|B+z9bzlT^4e\oC{$Mh埔,U>Iє XWJDQm zωƿXKh5 d6_FP ܓʣb>̤:od/cꞄUK\)<fV`7BJ'hjvC%FܭP6ٕE 3FwA{3 Iyѷr^ެ< lm1X 1~ri]j~p#>[H4qPqs+,wW'<5u<%"ka k1 u=Se>Oc?%CE:Csp֨sQjz S0x'kz:x>ЏO<=+^otL}F{Iu<q=dFFyISLy9I^r`ikMTF]`pfkaKXw =y@]/=ZͪNw>< 9~9mďU;8PtF @̹wo^7E mG6 Ҝ9T)Nƣ)[{i/~Q2 g @JxHfH^Q'\u0rz'v*32Q(#3yE]5}Y#I&@b˕|BA`I@Ʒ;ʦN8۹ylR6c/ ;*H7anL$i>ι@EX}0:H ܯSy_xbt9}>ne9 BD*2CҡIhyba'vr ^1\MBAdm7[:-H (4cNLZs-!u&/kO5aϖJvkۭAGuG("*:%COǃ1☆T(y' 0yikHLA^9M]ٴk>؈DsTcQ3sq$y7f }{":WЩ0 Nrê(%`M:ݸ6Z5N]ξ"tIe4ն(6i:52_e 5@5o 55@.'od "@D/̻s K볬nO"%W M{ 9v~J}&lܧ6Heu 7C>Z[5-Of?\\:4%;vɻB~`<]{|iG0tRИ5-bܩA |&V+NҔ\;~&|3O}Z Kh#!ίn895_%S+/YoklilEZ7P,5Vx`D  o$a1*O28tm9uH߂LRWnZ覆 *w>L"է[U=2ybJ&ʔ'L٭]jӣlÜ:r,aL⟀X DO#lڟB蕈ax c0a r%ߜ'zk-WhЌڏ?gПE7g; dDCNbCb[NeHG6De䕮Ӫdp {yLQtp;#z?iuX^a텗|7,Mu)G04Mc.@9!R%|G1.=-RQQŕcVIe2oarSt|:U 0^^̲ÁnSG/Cדbq `õߥo0@l&;a'OhۇH^W{]Yw s9BK7tfCCj}nRӏL>aZӟ?mZ~3r( "yCaw]zבPeQ2cqxk˵# iЭWzQa%O*Hoó^;)7F(HF ekmW=i<|>);oKѻ"1 MOVO"KIoRܘ`mKv`tׇsߑAOwR#q4w5\XnPI)ZdfvO9F4ՙ6luI"o f1As0]7gk+Ȟư{ ׿Hh j Beno!W7 ֆ*t|֡NBJW_"YSN/~%X∘ ^#qA":+~cHk21Q ̘xQz/>ͪU$ 0a h?mVeTKS =Z].;.h ܸ#%QXjll x:͚w9ig3c6dM,`›u˥Zx4 sdiF:#~ ^!F W@k/j9C#PvÉ;8% ݎM\?W=@AR NGU+狢E2%YJK z*j N`ÍX˛u*S|@VEfs-*63\~P x{.s'Ŀ2И^`8P,1f{-='鵓STG2aL`IN'1vI| hR- 3u9Duy+ꞝt^wy5} #wK_|9eܡ9H;KR0AsƬ)m.!KBUU6,4!(6T^Z(CͺLBe̵s2vV[34>)'l+ \ U :FOoI*W%A q|_wZ<9) J^.׮kbS[L50Wm~6r%_L'X)MKdQ:O„5z>^>1uɎ@C#-ٯJP.H>yщ zXo̼i҅TY{B`T͠"Gd8Af` XXk :w,~2O2;//WEoas 8oUS|IӅ)EaN0⾨m!&qdr״iK*@Ӽ_,n7~* "S;ye H܆E$:V/CBB % & Ii W ?7᮴;@|,(r}x~!$?LZu^ [dgRUUev2kaY*Ri CFk ۖ/,{ >:o'Uueom!YTu8:^󀪶W\Sh+SJ푓P#mA5]EVj!)7p?%O qc:j_RtPQӷ6~eUBޜ8ϯE.g5& 7osM9E4Di/YP5k5e\^:$}ms#hޑTN)*Nʳ*~\,M{Ϫ+6WϪx)}ǔxC)k1r3-؈fsk,21/Ta(gE8J"QPPIG13' r S\Y:!KЄh_56-n(!^ -FRѝgq}@׹ړar3UK==ZMޑSjw4YU9W,Cz BG" Algǚooi@;v:sy'9GbL_ O Ě6-k݁[.[|\kg`W^Ѭeě(6ȏ/)f`PQvXl i ۘ.o"j&~U,Dqu(]#x;qsw(+qjIjX| 'ZVMeG\K1%ـ_*)Qicq68YmU.Fc3vé/I2G45݊xo{~GOEU[<&?pejP?pEe}:cgXbi޲6uObA5W$䋐6\uhpFC\^9xL[c)פÂ'DH6|b[. &_v_HeO a,S3C-@x_l~{ctӾ[w,Gikq*5Prc_~u>@I*eK(s`ec. }!4q(]߮YZp%w.?(i|#A\we`PV%̻)./#TaDLH*Z]I!yP󣂧_a$ [4xaoD܁A>su L.#J5B*زyg0q06׷ёU#P A_轲RG69h6lȹ)X s)C/~{<<פbŠqG"c[bW'GrT+L R1JDuVqL2OLzzUDF\LSPj{!Awi$)Ì )0Z"^u_} 3?R[ZMDGonNC@N[K/wNn^:ƴ;">MB3z^kQد00,M1(E㚍v;>*ւ+{$9gBL:&t;М׮J)O z~d2u_GH%r׷?ۻ0}򫬼p _Y{L5!% U4vi[{;7:"΋=l'n*{nf{wYl %g]>\k:qZO2K I⇩DV^Ǝkӌ/g+_-{{2j"i0 _Aݿ?Xڶ4"'MPq8F]+yTwn@qH+tO1Ǩ-D*ѯ'xNbٞ ›DpA՞kHo3<*mfC=K>IcWV$nuu#F?TfůPs˺;b6%B3^Y Wxۓ9]ȦX-SH/]UvĢf$ׁqq*"I#} w'" p$OKe9s`Lmw7(T QNF,rh(j J 1E3rlCK\8ۭ#QV' .U$RLӽ>:Z삃5p A˖6FN$\gR MƥEIkB1o0:*Rs+nhŜrht SIZw|/sh;ī~+ҪH\RZžCRezٮ)b=r.5h_>~>wW(L.!?WWq lACRGkx( :t);D*Psqه6)(t3$pL1)n6ЊuӐ,JU\z|hm`gR׸RnlMff0 y]%[vt\":}K7Clw %5\Pg<5uy*'1C{Mn=Vikb":5)yUIyߓodGEy}֬<Y%d6>dz!o*bDQq=@Aο%:_|8z"4_ET g^O},^0 ktK > ֧T~8ehJŜ Nkz-M8w)B򥮑WQteZMe2=‡БhCt__ Ri泷D\MF&HF-q{Lek[?Lp&A!T[LLQdX{Gw7 ~ƭ'6tTc:VFxR$P ?KWߣ޷^DžAOb[)h(YȺ2ęxTZ/C.@%xү|0p75KWS h;,ܟ#+_J!gLD%C%tY돣ALGFBXx6utGH![źN"=,cf~_?TrukJmaF䡏ƒ/F z54jdK:+~<2,X=wob-3~9leT~bZucm0>Bѳu^50(KfslXK8$Joc.tSTڟضS}G6 ]ORyOf(F̅7ԥd ia$a />N7 { ΅*"#0m}* O{{<}$Cpb6Q@mhC;$s>ǒBN2ɫ !'5S=e'z7G J -L[e>byZKf瞥=]Me$yʮV`,U3t+ԂrgFUz\_2FVY*؜> ϜaVt1l#t,6pk7$R~&0I}8 z3ldgGjzԣ>;fkݵAq]/gxtO8߂9ԅݤf퇇<7rQiS y!w]'A%j%$4 8P,K=Yl_edE6~!8@{eנ[1ݖҀ OP]Mv%]{]Q4( hQ EHG2yƧ0kD_c}alpK%$Ӎ'alsm >Ih;*.&q'{XKٞ ЃVh z||@&`>xu2Svl_ hOI۠ vOF];H`(ڻ`1W2}j!"+x\&=gcN+S"_:FXz ᶗV)8j,Qq>XҐLGyyij&NZ7:GIV;SƪsQ{E;88YԠRICT+ǴeOϠ Q<)؞={Fw`heON]!6 x౧[wœX(RIie {S%΂O} miZa2Kn]-3ǽ;\ ` #\QZOh+P O@+mq[>wOfw9_<b>r5xg2X| ax@[9 9;sQEP/UNU:@~*j"MLqb;ٯ كcJZ(͖/:-(Ҵv$SQNڸMCI%YѢMCbWv;wvl>GDzZCz@A96]jo:Ywɾ7 W'>_3305_= 2Zg9<98|T JD@!qQ.}Kp\(8Z1*?z׸jGl*WʏZXOMx+Ե'˛Ҳgʫ 1QA\SWFKҺmSP&/qԙ% WIYYWYT% 10YK4y?B5#8%E7Sm^j.ͤ+@dͿ^*oŖ{I  - klvV%6/\ Vc57+5\s֨$a)=xMWgUwTuJ3OvQU<pہ3EoeKW8+G{ ^ӥTy*ah.G'_-rk͖7grEM/ {7B6rk'rMPMN/P[LЮrixcK]@m#{w4`hw2 |ɛP!,Q#7n8-Tg &]g'hF('M{0ipC& N|5LǶVnNuL}+Ac r 2 B6u{H\/@+6SG?~-ժީ|6,u/{>yA% &YIxj3?(zI٥,IieI~e}Hzp=*5+Kl`/Rs Q(bf$k)nd#t; Z ad<:hJ7S@%'o)N/~YG]AC}B.Ȏp$-'9N;Ypܗ{m5FC{v*%Y@ FBQAPS+ I 32p!qb16#&9蝆 ,M1[eC:/W&-e),VQ(dz0pD>6޹:ѮQO]2>"5 QU";) I~|׾m_ T7/+9Ct,Ǒ: ! ь¼@~Nzl8;,W+jtt|?υmf-6S+;WGM-ua40V\%Հtz6Js;bJS+taw?VhvO Pxڍ_-4juO3mOrDZ/nՃҺaFWLf%<@:|^6ՇZZ;ߦ~|ՍO&[=AI#_o\3jvcp] ?3apB,˷~+ I[?9/0y]0!9*[WgD)xo%8yBYݡؿ9C.Rgk+ 113I1(+Xg ^bӣJۈ }3#bZ xt?k—bb$ fsZMS=TQ}[#O`< L? f屖(\ma42o,uO=uqOB8Y -?gOIu$[2?[ HNN4'L3Z ;D̿{pdeUdª#gJ-zorب/|+;ݭ|b)]P07uDW7g|O T9޾h ,(S\)}Ez˞m _vw E[K"nW3}Ejs"2d#7phMqV]{JZjJOZ*=WI^zB=RHaCOwbh5Ef$ Y@Έ[:jo8[h/4b+5>+`:ڮRj*pY Y< ƍv)\\nGr.\gɟWZM+g.aGysPp'2p^ǻ5ۧŴ&1\լl`/BQRnJJ_t֖(Ð 5OTk #-$jO˟"sVFF s""K=A5oqW-@6&BK.,S&i3iZ:0Q6,%'f / e3XTm3(^S0/߿W$"]mM j k Q8[0qKf :҅1Ķ%9ۺD 'զ:CyXm@A[ "a9<2?y¦ Ԑ] .'ݝ2Gׂnxx7sRK '@dȀ YP pwSv6]p_8vͦзI,t G*D_콤֥,1:/߆T=|]w}k@!YkXtk}1; h䍯Vތ[EK,1{dA/pFΑ%xu_bd0H5[=p٘e ścgzOo2f0ibWeM< m !TL2&/njn0ߡJ0~LHEt'JQ8[_ր* .xEb7<ȓ>BGNư-9Wu43xN8d/k<MHF㹄j^)Ȓfp̟y(5 #lb/4CSُ^yMx=ِ*8H~9RV<_c M/Sׁ!W!6?sj9nȗ ̈́nG׉ۡ-\<akPgiv5n>3b8o|ׇ/&>Tgn#82y`t5,{[HwmѦQ8V|m2(1^5]i z M<E(O/?)*uWXh".Cf +}3W)f612ť<1J ؤk ;5VoKnqaW+‚ )rVn$̍FVqCG̳b,"Zٹ\=vjGJFYkHGDڧHgGb^vj2 gb2@z\--s4/T+dD΃o2Njs7%yӵ7 s|ܣ ,DV8.Ύwe)npoij?|wƞՙF?I꣊ki̭dT(lNT4|1 n f;Ž.{:Is+^ab$Mo Sh/ ֶAȾ^ _B23ڎ؈B{-+$PC(1!7xtJF̯?D@ZĤ9W#yAͬI`]mX؛lwj괺%?][{`95<(X.1A>&S Ir&b i?b4 5\p#!  d3PjH#œ'y_MJ;HzČn*WBXE+*&!Q@Woxܻ@WRԶE߲ aG/v`ȭ:cIZJJzVaJ?h'BkHT@X9M6m~״dN?4 HE#ڪWO_?ms(&-,|6`m ^eMܳdj:򎠇1p{y=uOUsP>jQ#SUSOVa5B|΃ƌ;&+Hм%&{. ]ɶUR&تPђ}X^1/2ZkC/K*~@DD"M7%Jpyl2?׬`w~Yv\tv$ߺl9NaPs>FvvwT^!-Ym"եVڣgPfb4_[U8J?#8K{B6Uۖt{4I 36Dt2ƚ=C yr >)Rƌ̕WN ZǙ2j*힞{5͐Tό"Ɖ:E-YуQK8QJ/PWqs)I! r9DC! 5!}}*EF" mN4{\ iM74@¢5EߔRNsO%AVT"6^SEGzd 4a%R:GAT_`' ߏ&?JԜ0i7EtzcvQu/XXFO4%sf2]*B':fj "o]N%Qx N8wgAw*\vjlIzDs)|lg%IA.ZDupOj$0p\{s b-=~m8Q?"*t}4.J+TeTНuu|3h\q6]|.ow͗pDUzܝm>w1ψ$ au|45 ?F䇙ꉎ9*/w*4ׯMC%s! j+Yӝv cb^V=W&\Bt4T+Zl]-bk{?`&ҔEE 4˓ipL_,ZKЅ<ֆZENNS//ǴVU&t:<.T\6>ߖ?!E#~!y{#h ^(/ йQV(cuLWwwb[Ks :Ȳɯ|dG;!Bym$ܕf=jEV2BׇTAS"*HLrw*u,{ǪMI sTZ _qrrLI#g8KTY}\tP]7ۭ9¼W 0fVlsD+k$i c`Y%aqn-c?k\ Bv/ݸܓod.sgl؀l>}B\Aeſh }f1BL9=6 MKʜh/O׾|6f ^duKxzSNۼ\Wn5O?ATmͭ3+ީ3dJGHs2*9&}Om`E q #`(oA(f_h ) xB싊 7M@xE# 0TPЀz## ck] AqAy.cy ܸ4(\wNp5WfawyGNg;ix?3^v@XŽ\'_/륂O>yGc6@rЩߤ ߻Icj$ZD8{>SR eJGB!z}- 3$7&4jVVp`ȈQ# %{Nڿ^3WM2+Htt٪C蘀"DgqMVwp:$vRҔ jTJG5Y:}AWu ƾSHt͓T\YX ~ ;H$i.1@lYBӤ"HfHB)}kɤ3[M^wpqXIƙQCWf;U_g7p@ͭht},UtH E>!#"C\jboH|E?B3 ǻ|7dZ5w OI #麖y!F g%nla#U`Va<;֥HzX.S_Zc=I2qˇ:$L?At$+]-dq`L(oR [~a T7$l=vW|ߐɩaM{j^)3L)1VX1(Rl&X<}JV~e^G5Xwq6t}ݸѧZtY "UB:hr]D@!JA!^i#8YcT 6#'XԎ'WI`o6^rq g%%=9ŸAMZ&7c6Fj%P}h*VA?w71aB٫so0p5'jW3S3*^0,hz{1GCqB|sG$Z1ho n,xZ귈,.jwJSwJZsntFZNۂf#FM"BsZinRo_HSuD3gu*8j*Ow52a{OլK㎩e-h91QJ8m2٥[3:J3Ӹ?0鳔L&R1w,觀 endstream endobj 112 0 obj << /Length1 2352 /Length2 17255 /Length3 0 /Length 18656 /Filter /FlateDecode >> stream xڴzeTK-4hh5wiB.!X k`Awfrg >]N^ݔJ"fv&@I;3#+ @N^l(ll21p QR9Av`qcg h`caEH@W t6VhJvNΌ&Nj Ҿ{8,,`gd鷷(@0d vnB 0Zۘj@-*@JEQ]I5㿸K1E$@ j@+ ګwWj"jJ̿`@7Wf?^]lJtvcfvsscpqrfs`% fh x}:mlZNgK~ @d ;;I}-ӫ?^ ;' X;+$5`c髡//Ќo@V9'ͿڽLwMN 'g# oN K&/ #)(x`FyꀙݝOD\ylll&ھvB]>qk=vn`Kl=: `@wSKb"x̍m> spvtxS`2u~mףWto+4S3jf͑_ہ)\.66 ƶ@ۂl<,4(9$ r)M-*3-lFV&v.5Ok뾎kWZNN.޿TZ M( *H} qr=X^f@s~uػ8~('Yo`xA,f?,e nSzSb0Af? f}Ek>?5+kBU_ O5^ב䕤?k5A_JwѿrY_ 쯡.&VK|eiu͝HY%GG~\^_GX_Y~8;0qspt)=+Qg5˟]|Edj c}/'IeפdsuU W07vv벼9WϿ&?EEܽ9xYap\>j}ׄ}ƿ/4EZZ3Jk (Kt WHK6f)sO< 8?NNO7%\Ec֚\LYxWޗMBd&McpF7wwwF}Z͝J=m)zؐ9!SsG)$qzXJ.61g=+Ʋ/&jc\. aI:؍:y{%(n"n eDaf&򷘤4_jb~4"e 6}(Z (c=O[{@_GA8Ô_؎+FWpwņ)U;L߹P@w' 3n(ʷy|.˻)r)v ѯfͤp3, SP:_7UtxfP\I N6!J׵^C8ho~~ul~{~c;يI11]JkqL!>yX{9 @n#_%%g\l$EN(eA 73"?D5HFtfd#1u;fc=Y9C`Hf3S{Eʁ w.,ϟ2&6%xu0q/>W`b{IҴU؀Y,jxSzL6|F/#tzjWmEHE\>bvpXd_bgZ.:6s2"\Vߙ,dՓ!3M6RiPbraMx6ChcxVwa#c*ٵd?M %O&'ή4G1i6L6U h0-}pIE]$OG]*"́|GHZi>ywoEaqK 14SD5;6s 1jЖmyҝ#5˪_ >Cdz~ p~sp|A )TzXN#8\5ö%T[ӎIOUI\&GhֳJNU|:c/.&< yːv|eS~\5_'sBqHΕRg+QEV6NMx K$sqJ#XYֿh5N#~VVkpeXE m[wj%W~|?ng 0g\9DLrzMQTJ=4)W.SxCv[Rʪȑ>}0ao]Vhp6J} E6@+]&.fO~b~ԇɗX0ECy 7𾓶83_k[rYA]SaQ+-7!cvm3K-hpKZG-t=0­0,C[= $-ORk9'xGh6Da3{+2Kd{ ^@b_b~\*6k"1蛆1y1ԥ 9=KhYbnQ}FθZŔoSkK{iGXmQ5kV' sφպQ$"7bp+x"ΐ~ї¥,'գ2gۿo G "}œ׷j aQ-حK }5ObLH""̺*Q}糩 Y'.GeLjyiiWMۿ[3\rـLZWɚ̝m)R&פooKm3 Ő}d~+wBv2*젽( ##OXm̀=ꪮd-[#H䆰vĢn]&*[wck'n]2)k{T\|,*<]7wlB6M\N0ԏAvyHdvewi|_ҳ{udmlm[{ty݊'[ˍZsr6~Ky2=| 6nć,irZ4m4YL_Bs^~AA/#1!)gu!»Dxy?ܶU?/%RІxa1x+#4ҏ"9!,ΔsW<45K IY7ωPuWkwJOih oU[ĠB`lZNjH` r/e#ݏ ؾElW5A(P`JGD)W3~pIXsEMXK C/AJWJm Λ6vSed @/5P}eL;/\_w;]q5*SX+ FO3jn )>onh\ 0]o_L)IH_X,jWSMC<%>؟~,:hn_1!ѾoZ rZ4xQ'yv'@ (}qN qeux->ϴW7j  ^cDzN+5doNκȘ]4ZՊc3G~ ȫcLвE[|3n1GM*0P܌Sf$ yHQFǤ5Hs_կhy{Tl`ؕXPY$8-C"1Bg<P-ei} OZUd|MֿSb9F\ǻHxoF^>=}m(jS >9in'SeAa6}%5/X~ٱD|$=԰$Ƶ $璯vwct"v% {:4"ծ^([a+PrR(0f !06@?BhkSZ4.ͱ˰x0T3$M8T zGTm/?X- _v>4th#Gy?lJQd w~9;oPG#hɱi92 E*GH'7߶ܒN &ųWW ˱#A9"#ڠsIX2Hu>dA#l 0nʄ[|~KZ}J_`>49-[Xhpg2ZP2s[\Y+Q(53*V4NDI*K{ 7@vo0+E,,aq|猌ӆyG"4>iBp@Κl&Ǒqvd,G@ekQDDyKk!|%ZF?PnV%(~bۺc|z{jUOɚ0f! {Tj·T=;1; 6x_ 'Ůh:2K?q1b/>e)<--{NlmЋ O /p*Y:uD"{߱V~Û67 WX1H #7pYWfƉ۾ YN=?&-򪈚/䅤Eveރp뚲V9NKU"`L*M^lznB2pV1O1udI!Iړ'.n,(68⮷NHw n9R8́fJ$fkYINɣ>}u>2-GO">h麻?-PO@5VQ/;H(zΐϑ/yOTb,ÕCg̴fdb@ݶq&O{c)뭛U}r )}Ug[? y ]_"fP6,xɹNiĘ;Č`lʺҭ-k!2)f|_%R\~ALPxHi"ou)N\)ZW: ](UVRip 3EP٣-un´^O.m#<:ifC񉼨 iIDzd'cVL_(נv2֠N#B@khu˾OV?]^d9x\5y H~LśIWdE; H.F[Fs>RѩWLj!kŐVP.k'[tLs{Ub\5 SJj80TQDܱ Fݵ$ Xd|r=w/r'0n L&ecn@s\;uaER/do-RAub?u[O˥mS["_0(}I_,# &eP.ⱉD@PEA)AS8Ӌp\P8hT#2DЬqn$E0Twu۷~\m_Mre 3 o^·eG3++/jo߱{l[CxRX 'ͼL_"7A훡]>1~;aéL6T̓c/~Yخ{`/ݴˆPtKn.L%'/k5 rl?)9;YzD ̌/re< _c|!āC@.%KNa~p2tc{;͈qe3#0x-NYX9~H2(9=3Eĝq;v|.'18!z Dʻ*62l)/n֛  7ۊLt ֲH9,[0n5l*_<=_. 3uYUajҔ'\h껕`ltAً;T|cy>>{D,|͚oYǏj WK_S`TA1,j_5s?Ŕ=ocuL2W4axP ss剬lE<=ٛW)L:$#̆Dq/H38IHʡ:kW}fE7 ZG ]!1ILv'x.2}ƊK)ߩ5ܩQ3O%A.)cp•~8:nGMY> v]*YA^v>-gZ:I/JH'mɡrVʤfm'J+lw+m)xnsdL\$Y=&fFICz2K=?ע_)jP^Fi˸s"=*:99لae?,5GU:8 c \@W7B.ex}K>Lȑ6ܢo8!A_p j*E|E ~ߗg`Z{{-"$a;tu+_vϖdxPLy$FE4h2}JJ!&bج.$bv1Ⱥyʤzw܅Ko|DQA _F-?]S+I_>PY1%NidE81(kae\gŇc5Xq󖾋F|~e. FA `/wy|Ey\S a9gګM 7Z:^S=Pw~)#նl Μekf;٧#Yɇ{"Y-=Bk H1T5Rz)k\]&Wb^F6m̽nuwo_!,օ, <_o З1m8ZdVUQ"bEZnJ^0™ dҫLe2l`"0F5j$?fTh!?et(j pZoqG!RMWyr$[3;<_ 'OXj!kp4O&? L]_&C:'3's"SvJjˬ{7?nf54D1҆l/&|B/"lyzz諽 ߁dHȍ0te; {Qn87~ 4^]F? P *MȎY$F=S{AGE/8V KTW/&)MUp!|iWOEj%(cS[ßZ@:z_j3톺i 4-⧩ǯJ32v!y7't;-`L9mIGkUL݋~kMjHݞȠz^ g݋3}X [=}HD1 {Q٨hx$۫g2 lZ_x.5ml]bTn^45{i[rNëc2- KYAb'SOt! vk7/"6m<}q; =o:hkx$sI>-%y@^_>c&qrIІ2fEqs;9|Ess=(0tdyDkfuo"O|%6N0>29 'ANCԺ A3X:_vPC!O+^.)**F{7l AS2Ǽor]Is ڋ@# i9} ʦ<C?~C7b9j W|;bYlsg\Wj7=;fU[+ɩR8nJ1zhZs?g)u 8?4mz9?=ӕM\ԕh8@C NjM /HkRjɫ3@u-׏U_v`#!Xdb/CO㰼9S6p50Z%|fakFÃW*ӽ5i*{~}WGHE{8 @MOSƩ~ThR!):r1OL,v۝;hiAo]8lPj(Kb&X!㳇.0t6;T_QP_+u G3P{{,R^{fJtv9ktL9AJ'U&=K'*Eגi>g5J8E@t4[I ?)|SEgԟ2:3d=|*Gֱ#.u*̇hs_\Nm O*2Nr4VhSZPR "ŵ3}93]KDw`79 z&wͯ=WG.XPL^5l? s"|ԮW?Y;@Y@ 'ݰ=lQuC(qdT GH&l 'Kiabхpo+=o}"jƾ1l#>ofLքRM )uV5-6v e a%Be "!2bu"䧱S Œ^I<؁V(Z{TxQć\9aPTɐ~v'c$`@&[~#wEmUfe oٗ8DK<ӚyD-΅Q9 7щMLV(sߣkFC@_"֝:RS 9ovB>Y wED TUH0'VkVNd B\Qs/09prv*N690 vyxhP\eʋKӘD?q3b{ɬB20aԝFUkMiqM/ًɪGU>W6 W: +xHml7}VCZP[tN w,K׼ `.}̃~!t {tAy YvYo3念lԒ[ˏc24m.Sh1h4"0U3!H: 3[b}?9Ƹ<Y9̢fV%Qs7j[ m:!8!r9`%cyqB=;D*|*>dwPZ~m͇8o}]1^NOg"tPRac %*u  de ^"H71fv/ؖo?xlqΎz#|XOBCςL5!{]@L^M 6_!hm$]d#>$zp<иu2Z`VDK3 }ur=lo! VHU]͜5!$f݉T⟜ +s\!!|W'ąKKvBzVTzFM*~ָ ]y:el=~.ǘ5 QLDeuɷ>2pԅOr R/yH%⳧pbxO#EUxϙ9¬PlODҾ5.B!3_B>b.;QBuOРFZۈ_qBבl_IguA6&rD((Y Iy7~i Pt&Jck^v?A恵Kb LtQ((# !?hh癅ح׽ P 7.w>y_Ufzә cj CXndqvF٥+S;ӏQpbth l~3%@{dO ZDϜonYtEoH;;` :% 91xx ~"t~$\m5E=9Pb$޾ZOU~֓@UK=+lG+j{NR]糲!8v@Qh$ɛhZASoBJ8 ,j)dtgA%&;ò&'1$ zq2dU1P>t3첳q>_{c/&!S9Xt[:yy9hN/,4PfYV M*skZ=!͉>rn)(|!PVҲ'r]N.(ib5:|b=U|@#r'$Gb7fgPt[D"X,P8:J!Z_?DxbF Cc&ukZlWN-t?8f=nS1j8f3͓ ]37\_)"3/ǑmFux;X?Y?IdGlc/wC u1W\:"l zEbTDV΋1嘍n| ;Ô0hڊGs?Z _<5v[EhJ֛&ņfp ³{Y\#s|`T,}Ybdv_#cq٬ۖ$^AiuK\~ytʳZN5;(L̍VZtZ9!%&߻BfY~Q_[p~}FV3k퐥(ꢿ9Id0l*γ`2L-\V`"֬WA9l!Kw1c7PX<0tӞiDMx2bP Ax aڕ49>"RzcUG{{{g0%hp;ʅ9 8Zh]'dCi$A4@JV`h,T_Fỗǔ#%f\'1_zu(3 ,iޜSm <~xi<|i`zb*5_V>cض}AɯMROE{v9]K%ê8IKۏ߸UA,j$tzv>_8 FO"Y31qg"ˏp|Dz"a`%\:8*O''jZE14BiN)c(t3i+o?}WKCsaFZg lMsUr¢u[nӑ"/~ee;ouX:$ej;XX?T\M?Q$d'D༗`}K^Al=a~u9_4v[])"mf[ sg6E3no9@١mE \ƛc@5W~AԳ@,-3_W%= 6@;}N#XaΊPj mk/W2ZM}ܯ'V8 m@:o0ڐNHAfd5hiΔ[w \C WR4UisT=T+"5{gW4|-vv%su@]7g̅ u"6X1UL†NTtCa~ʘƷk2⺣ԕ?P$- ȱ HٚQ$ =搙JKӏ #L;5U~Ł tH3!A^;2g!j v[%JJp Yk'Ѥh ,$=ץyJ1끓o@?S(6mwr"ŭO| YKc!9$^{Cʹg0cTV,xD"`ksȈf3ImOCxv'BddF }ڋK:%囌!PIoKvḆlecͱU[ioA/C1IPVg> tQUҎVé"E>-]#Eꨗ*A.׮8%^8~ĐGEiz!  u_.Rȏ_PLdm<,xPq}=?' ^(k}ښ: '};L„vb02c.H#Ž҅ڎ5~7EL>;慀ƧHzoh%]pʥRihWx{JvS+' )ᑖ R Ǭ dj޵SQɁ"8gm(z6?; ۂh?>\ҮuL/fl{`!»jbR[A30tPCxPsUi=?ďc:cͼ`>ojSY:VJ(! nho_|ΚwҔNrZrQpˬ@u8PU9$lE,$/G2쁠-3EQ-C1X=t{$}[K/`(*A+w6 " OnY_aQl$fxxרʚP%8zKg,_1^dK(۫9q*D.߯vYjWDFrs}lvN|Ik~Dl^bzXu6r95\R3W*l\䫟S,iV|tFSpHGe\4PFy}-޶)m-?X1(DSy3 >I#_-"\OӘ@n%NZ3Jr//Hz ;~WDow="|k3.4azw"1_U8d7@5mh:sw Rk_Z7'ojo?1̨G/yce6m-`иtB_yHNy*skA#Q^X\ $iWY\Gk.Y6bkpQ ONhWZMɥJma~wB9s8t.J'lxiDSt~(i8 NJݮ؋Ese4ǚ!vWcq7u7=jM8;R$I Ht\rE*+Ş?G?3]qvjs@!<}oVuDFjO[yv}s[A}9KZR7஻jYW^jG"VǢbU=6L<)SM 'h <$h^V0]`LW]·zzExP քCF}HW/Q|W:'ټeM,GK:naGFdNY1*H0*.pa8m~vv?vQACV n53*Q42#95[B~mb@20sBCJF;WA?\BIYD.n/mo{pN!paB$Z'칽E5w7mD߼{vej7 [`eQU]V w(ZA;`6kʲѧtz*i @<+~:λ+lR`0)F}u0ԋJZ"URuBlQM0kRc"'Eѐp nIʼnQ潤9XCl *6LOLBdpҞIs&DrpH05laf#75`?& bhBd2nLXmmBݧ5zĆ'UҖeTc%ɾVz)Qv8,aNӏ2RQh)a bӓqEy_?d^i`=)i\x(MV q@V ]@j]wViLDapO%ˤd#~J2TNHl¢1)+fx > stream x}R{\e+rb<~ mw щM`c{0N7m$C ~<089$qHQBq0D21Csr^N_ 10[b4b &BaB“4_0D0 *pv pkÍ`nw @EJpJγ(~E29N RTXHp bd2C.SHy WX01 D  (/a+$`^M.ApUˇa2i01> ĸf[!:1 /E#~~R%;3n. F/{,DnvKbOdt9ߴD]z6̙&Z}Tg0wblmߝzCt\Q[^IA nKmg9wLA6滟}ҫqʂD|NZ%etf|Խ]^y)?Ѡ7l`Ž&ZL;۸]u+fegw+ 3I=th5ϥl+3TdSq>^biX_:/x{SPlD'$ v3~Kb=tfxI9mfл d.ݔ~0wIvt6Zxr{φюCHScYej-:53]r両w\Xr  k? \3UQluF;0~|pSj}4E>)IPiS䷥7Bu%<{OB?/6j;^w}ϵɐJ-T+kRS5غa3se9UݼX=ULHPޫFKg'Ok4  6cI 62X|^eQJ~3~`L%N]r<dI uɬv$55~$N=1ٺR?+zhOv|yMeL$dչ-ŏ7F8T&=3 4v:V}J̄WvKrIv#(Jc$)7jY߶]{͝WɢlխGP^HLϓU>m93ztx}7.Gk-n/O~kܣ3Vk~lG,*llRUGxcds|꡻5,ԜAymմ•e VW.&Jz%EUA׽^sЪāR; 2ˡ& 9iJ+I>]v#;7Ͼֺ)}=Ri'F~}յ LM&=3sj>%~7qiۖڹuvkǗ;b['Mkț.YZҔP}vŒ%+ͅo|NJ]+U endstream endobj 116 0 obj << /Length1 1608 /Length2 8829 /Length3 0 /Length 9648 /Filter /FlateDecode >> stream xڭxUTђup -8wihƂ,A{p`!Xpw$wYy赾SUg׮uh5٥, y(%P;X!*P{KAdC!p@d <<naaaL lm0j3'`񟞧05 :: 'Em 5.@94\,@ @+3 ) %` rb807 X;CO=C`'/!GgSÓ L À`G8)?xmrOn) tS_̓np;O.  s7x KXdmli`t_uK掎oCF[q`r<Ÿr[! ?} b33O$-{% S J `''5/Z^i`OP1_㿉@}?w oOmX?I#&vYj@Su! g{06عͧcA4]@ wOͩ.-oƓp'bQ*?Pw'; /Kq|uV5;FOEsq-?~:3'psh tqv~Rk*?r1~@A)i${e:۹zurʠ|S~ ݕsԌ<4zL:o(l- tEMܑ,Ⱥ.Ӟ~є 갦ֻ;Tf^g+f?:l?"K>hg9{Wz{tlPfFc0$&=̜ϫne"#~TrzvzM) I*Cqޕ`ݼϔ(UK,a]P[`ݸM[x4wgK mUks ~TnWᖶcH^1'2|ly>maQbX-S"k4:vxP<懚Ŏ+ajdsoG̢|,lY!xk9O$^O5RͧR@)7%ʒ2 `)՚\KvuX2a-=D)31whF*&Hc<]:b pR2'dD<uOԇqY]Q'ܺ2WIP=K_#A^IuJG N!Փz2h'?!僝ߧ>B6Ifg 2vF&t=-\SvSnN}Y#`:|E7Bs5Ѡܹw^ΠfztD>MnYOLS%е3E>5QwE IF\G(w=˹EgHNCԉ;lQ-Eh( Na-x6%j $fZB/mT<^Z9 |3; cWl`P{m] lӒU:̺^7,ЃzoR~D+5I̓X/9!A6l5 A-N)%Eꒆر&Spts)KT¥6{ۭ~=7ݑE{Iq(>fk֔{ʶhXCWxhKAA҅>*~l*ל똽MH@dX4*s Pf^:7ւrԮ $ Jp5Q4YpvgI?? &>}f<u5\Rl1ޒ}[4P&[(7{"Yź|ς01>VԔp6\KUє&hgjr~O<M0Sc]<:;"-L]+Xg}窀Lқ#ډ(T=l8>ZL?I\XDecRDZ)hBV ^IB@K~IGW%$q[HCk DzJR$ArTeGg&N) YvەVRpPPgi3/0b-Un&  Ԏ1sg~ddH8!yo";YiCrttቋ=?\,@=k7ysgVBg5gE &SS|ɐH}nЇ]s]Ōzghz= }$v$5΄!OuؼB2M_7jeͿ!?F_ͧ>"D[ޓ8cN7aHېcih7X+w\5o7f"abzrUɚ㸄\ݵ |W$v>L;@G|nQ>CDp}fHLl63<ݤE(W"Dz(2q3թPϥlL_ؿs8 =Qn>FIDS*\M8CؔzPhD k7w/2,ȡ f25W/Z2(:lX[3(:VN9*|{L5Timx>3a^0DV |GB]܌,$wq;B9vy9z\?:5Bgvv|4[J.DmdkԳ+S2AWa(tڵzd+ &>jx -JX!tKFk댴{ڤtnADvRbM*BjIM|0}nvLi8v{'<z[ x&i$`iGSaI+mwж+yÅ*?.(lqW9C's (R 룅ލO9`V˔fb&_zJقHtBzV'&,>͡i?P9.tLOܩ/ۛeqTvaH֮.-+?XOVR.NVȅ zZ ajٶ lK.!Hĥ<8,BN'넮/4WWIx'{qCIqVhު1an *:zD٣# R- 3)x59Z ;MD}SxQ׳f"&C[8u/B˾PS ?^=sb2ښ&~졟p6[/a_nsx ۞)R%SO}ƴ/j` (⫨KvK4 &(%_׽/⼱Tt"T da CP`OqGP({ }PELNg-y7iv|B Fm&\lIݼ($i ͕ش *8f̽!5:+m{Ꙉoxt3žZhJzi7]IgQG.tEvWIrF*AWs[IJxjuo4YϾ #5C\vpCIo?irP +38ʊV^,^a:| d~c"є\,R,bNj!{;7P/Jgiw-f㾐Lä1%t1>b fsw]饱Row;;;)sZh6 LR^)ȻB!$a嵮 HY! ۩p7\ٛRN"(/^x]HhU'Νc2e¿T j x,",3!t+îZyN:JaDޏkL'UzRf-҅#RXpڷP[9'f%lVORj*K7Y1v$E)vEV/mpbh UGJ_&e0)^+ڛ$=b*U!0XtA|H 軒!LInio˝a/X(u#-/CzgR8 ꩱ/ s u;:8*q\QXq*ӆ$\, Z uzNmE%]Rhۍ gnHM:_vbAQ bjnVlQymLEpQSkB_y)ɘ_X ^oĐJ>BL+N$g%hf4!2dWcHU![Ѳ˭3a䊪'̾+y^[hd+pj nAb+ވwRc5V>y$xj`r}h9h4?%LgLbxhz)H?DpUO&Ж0Mw͌:̱x|ZN㽈lC>s{2: EVw OoA)u34hvl+nѸ#;24KBtN>S>^dBQs]lf@ŦOp\@n_ wH;%Tw;YY ү#{SIq0}o[”x?%v۾'Ue!m"7cDU5f\g/h,2N孂zo0DIu58gBR=)MzWUŦJT<7f;3 lĚ1ɨҵIe\:h&1 1J2B:d)_Zi!qܝC o jEqRIEG Y5/,-&$9B_:>mHH .{?c3#Ooѯ<_7UHa $ެ/< _£j^c\w cKqHYї6@){mV|˵ *mZ'nxHw~xY }q2 k+X@GIHD@2ˉ"e|q =V%AcL',񼐞Rlɪ?w^^A~f֦N#E8BSɱuY ûr(2fAnĬNYޣ>_?²a"&=r{n@Nm&j[p9Dw!H}o =SY,reD[63:5AqEjg?ÊןEKQ6~x,0%ߢК_ hb_t@Zo+({b3,n$%č~Knj-ms A#Si1<9@3vI7Տiz-U폂Syh+d4ןb&ĝcsؽWm@(/]Im=;zy ȪX y?="{^M fI^1*Uyba#594KR\sbͳTwAm±1/κAԦ>JBI#n hyN+'(T0#yx\QY0b*rNNw|+ :g=ϬuBÅ^g6)YY&~tSu'[0"RދA !\Yڄc᧴C~xHc4Wk5d "j0Q!1"!o:E\)iMv{M+ _.˾Ζ}/w;%;mU hwj)L"V50Jʭ|kyVCdwb+9WbXU(daBP= [23C %rI^W?%5!mm;U2UѠG~~n<_9{ʿIqm&}#<֍Dx"t`LtGM%M9w1y}"a}Q^muW񯆘M⳺V 9Ni܀xW^x+dHHțS$уT. Rnjliy\v,Ko{2iĚcY6-y\_ FH~89ۯʾJ_)v..11!;iM 95?!v'w anK=ګ7]!t*,j {y{YkmDw^_?sDG$<܄Z(٤&Bubx)d<ֺ_./d?n|ϣ ,4!9%tމ7m_aQ[`AuZ-,<AN5G%?DiD-Do{sik→Zd6# gn`<)j`dmqyYwһ&fǠk\a{=#xeU_ /aGV>Ԝ :d Lzy&b}em SLVr=.]JQtuL$Gwg#ruu >KFBy1|<9_*l"33VmjϽ̥)׎ wIhsooWL6ʫQWe]Vro_p77~,2'Xt*FOPP z__ɀ.Dju9UF5jh0Eaxq_u3(cU,m0O1*U J(Tuod|쏾ɳ|KYtƹ3:9]6>GIҍpx^LoQ$^aĖw_ 8tV/ &Pܝ ߍVx$$؝کփ^Q45Fzeě-Ʊ*ҚT,!fx?O endstream endobj 118 0 obj << /Length1 1625 /Length2 7025 /Length3 0 /Length 7850 /Filter /FlateDecode >> stream xڭVeXKCaafF@DIi$.TAZA>^^eg5S?a(>!~A)i` SC4PP ήۢ p- ,0 G!III|vqpDyxx%x q8>!qq$@HHP )*o|!Yxw<:YF-n) wig`/0z sJR6!Z0?/$YfsU_Y{rzMz_%=ޟcyq"X߃ E,31CzVW [AyAl'xhnp$}?=nyOv<-U@6s2=ړB*+)| k]Nq2b4~&`BivKgjK~~EBDB̶UOGLEWI !}9q1^[GnYdXsR>ᚑz9nѨ5Ul*ۯB *nP7DZI"'#s#@-LS>4oP6P ooi7{~@Onz–ViZ ^:x$&ނ2+rՠrKj6tga@_Z%0^d䓒PpSHu=n=Q3yÆ+٤Oc(tF{3Nˏ̰'>\\We*NQ Kfd,>fO EqvE.OYj̛MOByK_;htFKmڨ<- P7gSxh,+(ED%brD$c[P:۲x̌ +>滩"d!ƫ ڸRxσ=ώ[MItIyQ*ĵ%ZɸtYНyo豿>aQW4Jl?P'Qq5ރ^۔b𗺺4F$o-}:hL" 3nn])Umyq9*@æRapG=ë.WӘ $ԕi3F\LhrM$DLݷ;h#P7e|x׏#5)h5Or6^ʛ*n6~|1 \2)n< |4^Jl, کE=CrdķfN"sxX}U!Oh`5GoCZ &7*سs?.Tw1[dK[7^a= Sx,j‡*&ːcD!alè*_=GD|/z3Udi;唅mi#Zݓ#W'Dē5xTmͷtWǺnVo%u~~-w -O+! @:b1 % 9VII̒ ­AG![Ȥq9'vsY+=;nwe^A*#$'|uNO5B*t]<\F$N"#j?(z~/?I~.8=5{}g`ATݚBX:r\{wPMˆW9o'K|Cm{Ax<1[F%)RY BM)ާzzy&,k&)~ Zxw}Bc %Z)&,gW;_>Ě.[[y6lCdLْ"Jf=GPAUvo(fĝ-AW"9+9626؉WnĽ;ML,/rT_~sͣ.@ }ͽu^m#qQb񵼔" Mpʀ}{InaIdWgxN?MpjtƝdaJ) 3H|, 58_-t~t5 GIsܷ6Qg+h ϡ ޞxGS{ ;R7 x+6J'݌͇1UH txn%GTGN[_VIuPiM,)F8p`beoɣҁ++SVd{v5u$ܖ^r#$V:#͇m;|9WZ=5vDGJ}t 'z~ /rS^e8iEeQR;A`)['NGB!8vpAC~i͗fg9ɉ"E?MqΕ"p{EClV) vX'p1Ol]W. %a@TZj%ve:yl4e 9hl:T{yyR.@G";c9Ћ`(2L˭˝ \i6j=qjЄ =3YDj:Wy|R,#8pͯ:3sNO`xrdo,v5|6>!S|h^y zyWeVͺ?SC#/mukԺ!*m%ڋ1T_SKRyv+ cl T}.tkun`AЧi *n@[ԙ? ÓMvc\Ҝ;m̞YeNc5xLkveV{F AtO$DK"ÍYzXWʦ԰̙n$DYY*)Sf|x']ݯ .rpXq&RJN)\`Vm {:jH! (tiXVӏۇ1;_Ig[&~6c&˭V}GOHh3>ȹї9l>s! "r$Ote_*˶cyG9T{2^ ~(w>lY[UWW%) 5ju+p(Vp#[0ڙuηIą $)m#w]eϗKیK}h-1d{3"by)iQ]}Ӣu-dmPmѯiDP{HiV*-3Пmo?cwa`>iHK &[詞 E٥T3gj7*[;cF%hlq"6KߐЦ$cVzIIg+-.xAicU|:>l z};y[<99Ŀ4ň񜃸}1)"fXv\Je;OϢl$i41j>ˡ ]VfUgF EK!Qrù4U I)'1D],19s52ӊ_?6H/_\|3v/`eлy݀+z9;:ⴋGhYԹ_sT߶*#C ˞ݟUT_$Vǫ]{PegWn`606/(Ρ{iDg]#:CEtS:㫱!^>Pgغqa)8k, upu:Ȭo?KGO"mE{EC\ĩQZzoCpno~zt6F e_bMa6´ߌE)* b9"oR T_df]̗o}~|[cL,0H+7SɈ7Z}[&ϒD%¸O!]\CbalOX؋+^'}JklYYP$ Krdp_?PL1}Pc_cX_/_Q~*2 b.AQbi%t Ueǹ~ o~VxPn0/?=~;;w&>^$+\7lE{7=<9Ϻa]Sbl Q;s~f<)4R:T`B/Iq'xrS,:v|ޘV{JA;ԼAFV@yaH )9jPzn7PO%g6\Cw?NX\7}xMMZ43(EѤ<[2"'==$b 4&#(=|xv2ZN456 FY>찺g.B+!YSb,]~ YoG$Orŕ=v}ѕKx)D4,t\-DqɫUh֕*.#Mzs͢tf'"׹«J ;I4{ܚ; g@k;KSaУSDZ!YNH 1F|+A@T/! T<)J*8oD ΛI̦F$SvYmeUD? x !KQBٕfQAAcCe>6>pzV0k hSg/kcњꛜeX{FkU{,h8j?}Gv2;|\c[4چoݯbPmVIu鵝, Ո1!򏋕Ϋ}e'G(Bϒf*+V$OS/T89ƉPrvATe{Ţ]n ܡ3O(z^FK7MFMdĎ]_˄U=ݟc:g%qkk***?eߔppX[e*<6?L;f*쬒¶s MARixCSy:$Fv JiFo*kC"΅w hL& ^?^HrwR*O E&i5k 9^sZUǧ,DQ_l[YB~f<`''k6N] ,QC. b! endstream endobj 120 0 obj << /Length1 1144 /Length2 7977 /Length3 0 /Length 8745 /Filter /FlateDecode >> stream xusu\6%]̀4C7ݍ40CJK)") R(% !=gg=G<* SQ}XD*qb*х? O%M`$fxOZ9=?gqcuC+?3?:*P 1A! ;m_ 7@pwow:@Rf zv7m8?/`c 7{yn+u]'CŵP^;e@©Z B$%[^{A%*rxPOqkpe6% `ˏ#3 7e,v 41e%xt 2tFv"#C18S@< g7&8M$,cW}^88'Eg#5Gg6rxA5rRfcvYҜX6\)>56EEXc-3HSϗh.'^-VK73 ,5kFZ}[sRv\ϾH.IT3Xn'g$r!W}wGϙYZ!L\9Y<*)vv:n+xɔ$40Tk{bOS65m/_IB=$:sLj|]B"߼-v WuܳMj.R@o% q LgוY2qJJ1PGW<(LpUEBS^eT̾ *.#wcg}j14WŅ5l$ސ@CԇFkew_pBbC0Y&U=$w}ߤ\2w-kB$`wa*:/D0d6 J-`&lZ+b9)q‚#ir <~֙Ρ1,vh+4`#Rr1m+V-Xֹ -TS ޛl>ǍCW~He@RWm#nT׼Bhk^00AG=.:Bm)+ fW955"nCJ/pn[e·fv3'LiϞM@b[[el@? -B=Ɏߗ ;\S #*2m&O:n.!_6Vt6O(ěGt35ɦEnJBP~"M&#DE^c;`!O܇'/eg_/&%DڍiE sf<\an/hjE?8Y|oMxi )J Nj>.׵B$^*^=vl.b1N0y01o=}PW06%hqJ/z<Oֳ''}$qMZ,b?e%]gy]/uDbA}?3tXg(6,mcUL'*j cLdD?7M,|;mf*AX"(]l}:C1 PزeRu Pd-_kl0}Ez˟w=⃯L\qL ja ]nul0LܯSMrP1@|u YzF%`dB@آs'A*DJhD'ssJg*/R:@`ˇ(!4#W -‘v `J#uĠE#vzs A9st^\]ՅIv$U޵kϳ/^y#$^_^UX(oRQ^ AE9]r{4ۊޟ"hW!K`*"R f~HVԄIW'& '5!iJROj=}\hg:Kڼb =w@`"r ;n|̋ܗ^{dS~W-?&q X2隵LR?``z-ghf0,95x^;)~}J$bU$s}Pz`Y~*.$(bzqREX \lTjFf4 3)bi<q8@A25lW=Y(*6za{Wԡ O3\5~(TJ$}}}Ҁ_̬Q TgE.hät(crm8<SSpU}7>.a4dO:Y dJFڏ. [LJ3f]*܋5&'Ord #Rp~sLFǰk6!YbΞ aS">qMn29e`'l@ChM^Q*D$N~=LSw#"5i%5ԉǧsէP뼪m '5Z;7O' >́#Qnu#Hk 3 ˍt'G,xfW"uA8yBc875-ئPIv8'I!!eru eŊ Vi+e'U?Gx~po_#1Ļ3?iS3C mCd|H01tc#$3M!ƅ"䁹 Y%?j=- =jʯ4][}HVP?y^kW(d3jJ6VrhR?kT)ECXRZiF:5i TeHo ҉9DBB۟bETL3U|*,dwttF:6~_R ,K)udTz^w##vvz *N/:OMzD 4zHvY:Z2Jm;s?Pa^h^F]Ǥݥ6 D\]t4&eF~.j~L8{@>bd")[k>=1bKoӗp>CԎiF01*W@BGMJu!(J6k ys[8=ϥd:[#$5-ʠz0\;M她dV ֑/8:dl:.9GA=?`@9@ck k8}:_@nJG4ZIQ 6,zJV_@}]q(+O6Cw֠NPzWEE E?<͆Z)'Վ]YB|z[1%gO+z\=5X$^ I݀͠jQȗV3`WҟU[s&^7GKbhƇjAr1vee5G+36e5w_$k5-alK%/9/aʕ-Eܪ Pb_IH+/A d*]hO}O?P *Oi32`F3fPxCO)+Σ}jz,C>QW~8jCw@6Ìio~NIR xT_WMTuW,ޭ"t+=q67X_ ̾qyr~=1{9[xUܥj ;b[!/.[P`6X;u6ҏÅ/h`#D Y.뚲|.bÈ^՝6|Ʈܚ=~<*ɑ}v0ٳC Iz:n'c<ST Ҭ+E*Zg;2U-!/=;Q1k2¸ꧼĿ] `?΋--VuK p#I|:a [x06a[ S+3An塬UO1~)§ k#?KaZ+2Jw_EGNXʄrr+~m4} Olc[ sQjЭVS⧳9R25|DzNI6T+@+t`;ح :$V6њRR0W<9q3Vv3>ǖ}B:ㆲKs DPWŊ-EHH *S5ZdVQ&7"lv 4R'q4[ ;+D m.~ ݴtWx:RI^o!]e&9Q);˗v "{j̝%r+ra.^}Y1ryn%bőr=k:{QÍZ)"țV0ٹuF ]0{mvxЯlBĂ-F[$/yK $i5mw]7{oy>lgYl,jg]&>{aIIc@Yt|%i%)ڱcԯs~b P~U /X=ܫq%h$q2}yqg'.󉳩9a Pio y7bn|H\9KT1T3兒F&ҌWcu:f-MbM=d>mΔxCd=?uT{9<Q緙,aծi9d\1+R1lg. LXoQUj's TMGS,K6so+ޖTHhVyV>|RM&{S86dbBws(^bz'dЂM}z $b"PWf7 C3RVjfhuj0uw91_\bM\Ȗp^H0-~'m׾M ~3-Wj{YBpERXkFG- ~x3޲Yϰ80fEE?'e퓻A85wy놧jY>ZՎ!C AcsfKG u)/ h!UKF6e;̵bunaOdCzqsPcSbuMlK= 9 ai }YєeT1ʤ ӛ3-j_R~)w!ZWlۿO)1EHV"V>RnF)Zy\,ώ^(.j^O+L9@ܤX^w;v`af&S |*iֽc!.dk/+]=Xr{i8 qk!i 0uwuAO'~hJ _>.M 0 m}0+xK-ŭcY[btMs(VAy!jIȒ&a!-zEzng;G9W/y28? endstream endobj 122 0 obj << /Length1 1177 /Length2 5987 /Length3 0 /Length 6762 /Filter /FlateDecode >> stream xmsw<[K轌%D{  cFD/B =ZD%z肈|<<笵>{'#B"2]-hq@`;BDi E rG*yB@H( B;{t@QPDFDJF\n-"W S uC!H' `o7iB !^oO0Kx῟ PByBC3^~~4/ :\w  j8q߱ (l3.#,aB^BpRYw/SzBwmp/<_)G(y&p7DC? wߘ @<'`gGC a!(p APGݏ  =!A/; #+ qsBzBDDDW. ru ̵M#weRAQ)qxSZBUAt%w%uJ&o%] x6ȝW~5j 1?{@_ A E^'}(KM 1ߥH;Cpם p#p'Ό Oiݜܿл!'04 ¥!yQ&,q0Bti]+_H)룜Za`G&2IJ+v S<#PjՕ!:t$GKQ7~ZujPi(Atn塇\U\5+M}]Ol 39ܥ,A<~iIؼwFQIn75^X"d2Rph`Q!)5-zܩ GUL!G›aI"ڔ$E"Zڱ0 m`<쩢4 m 2I.xϗrwS@\mO|QlI خlL&h*;%=hr ГyB%2Q|t.B:N>J3 XFVB:_<)6|l#b>} .j[]͆ƗDZl&|t`UONGuF)!^rXA?7BRclY爣vfC<"NelS{!+|,6|@uhE7zəHoGkxƩ!)"S6KUr/AZVbbSP1$nƊҭsC-G;[z{HޛBFnYv]1{Z*m&).*)ACjWhO[&弰e{C ,+/BܤoPlJ LҎ]9+l'o[ҢjψAaRY|| r^hCwx =i- !0|8#"XL+;"]@b8nF;D|ۀjEA+3p -ҹw:O~3K\6+L҉/">h}൮H[ZV6<}\fɢ1MRlB$V=kK%{'{Vu>YOZ=V`Kّl[27vH:oeGcyxD쭍~Ӄ,VDMZm8x"7opؘF[[& [YJveTβnbQ1MAeҢkn* L.J 56<6{b47z`gzKy誚;3q4ɵ_HgB1ֶ ߲L(PyY8{uopmب8{N}W."UA==%>+Ҡd*4TtzG?l8QNGëcE=sHnM/fdg,iSvgt;ԠΗb01زELK`4]G/u}4 Alp?tOFikHOV+@qn`7_I~Oqɰz^yXg=,(~@>=#si5#a}ֶPmӲ?\_M##Gd(&H6&:@oPymM凩nhӶEx:=(OYm=A q[ZrKj҅J{\m+6OIMT`_0WmX =#w}o-FZ,X°TKx&1rW*$㷌LX'**\4 Dό< |Լ <=}!׆Oq ` Y3q%Xh$;eHg`l4I&N‡ ' gz\ݭ=󚐷h_1/H:gf q\ݨmnF9e8MAz%{ًM ~MMRu2{j]ek^K k&LvWz|Vu>q"ĆFS;bUFfjKgUq^TtC#5Lc]O]Oyg_w,qjkD%p4VU\jԥjPfAӕO"Z$ZNJU̹p~`澬3ץZԮ7ݝA 3MD$3bVw[:@[YŃ5P͒Fv8쓔YhC`֘x&,qL3۰FP[+Y]zCr>XGZ3ߑa2֌D#JQ*^-ʸAɥvWS1<[hEI_Z~!OҹߎE'JM,"F}AwD̪e2y4P9WM3󸙊wt/%m ݽ.̡{߰^ l3]ccr$~UjP_XJ-}s6mi:3>Ł-Vg̎U" ɦI.f F%4wƶbGp"sg,=hzw|i 9;&I_3cVmlwk\}T^]ZkA˃79îvBIY(shUI|>`Aj/r{B]^C4s73pm }WM=|LJ9C^ZhwNm_DZw{|dZ+ϧygxO79-mhڤZv3bM:v%::T“uly216󰞲*E{6.=刯2hO3b sLlJoT+F獩RJmcE1DE/:4)*zK4L:$[L/4lq~QJ :D1X^VMmpޒ^085S!<ڼ9W,u4*CKkMϢ[Fwo6Yb1--q`RTpv$dC~<`]X}qzB1?VFh4vf"9vmeV Ȏi[wSGndNٵ+LAa8"޻2;-%bQhFeOO$,Րm%rXPaE-2}kv#FfPKc_h{ l9k^H"Wfs8:R7V~ηcyvGAG:yKADeW{(JcR,[ Nse `*k?zM7'\],/uR=vDhPwr=ުWGDquj<~Óc۽_ |d>N.\qEs+/&e _q$c\ $@F":Z6u"ܱ9o I Fe"hG,֪qL'-d},V6%=}ꑑ ZWVYmgVzmS2PD:I2krW<\oq*zpc Ӑ 8(7xں'tc2o-$?yEmDH3~/.ZG; 8quߵ8pjl17) 0= VA4A/6hm̿b=S3Ϧ*f!ro1N+TU~ZZWH.kr)1jC>t ,$uf05=& s-ssZvdГ1KlŜ1lu2IJR=v.rsyA"T6L6Pn*)k)5hez˛`bOc9PZDyov}r[pF lG= Xɩ|("H]v}:Ә8]i)%.oBos& HhW9c%{n$\6Yڀh_%Vx9L`asq&drƈPᰒ{䒭*Aj/ KOT8b﫧z\VtcXZx<07(0(vQlZvMTK0[xF1GGvgG&91jh zt]= \:?MLLw!FE⪧f>&d4 v`xWZJ7P M9RH,j@ u:s4QTSX>LO5hB2ndhhE(>_)ZOo[K|)q>Dݖ85Nu2]}a+)ca A @<؍ VvfQTQW&|;­XRTke(k%qF' yMKUHE?nDL%wGðX_>o v:r7a, lUVdV;{eZdM>Ue'beA h:;{ӺŅUٮ[a&{%d% kObxg i{11rF%Sl<ͱ\>F5lof)g:x*ħk2͎ x̕ϾA4=$ 2lAIp+%f#W\л`,Tp'i&' 7ټ 9m+IOq"4MxWhY½* sٟ۵R"iGc9Gg>\\a5/Y]}>ө7xPhh=瘪]\d7)Tydk!9F`#mzҤe*( rfRSg SÉSכ JF- pnzCT~%pO`Ry|e@ȄrBQ?&*:40/BcqmP{ۙ KFcۻs^ו5"h_YH$oYR\Cmʓ6f8C9!.gŅdoQuY `)2) *Y sr >iCbfhv_Le,2G84veIƾ4?F endstream endobj 5 0 obj << /Type /ObjStm /N 100 /First 812 /Length 4544 /Filter /FlateDecode >> stream x[ms۶_tL@'%v8Nj;Ms2 ˴SYr%'9> %wvl >]f9L,0cS08&sI)qʤ=)D(4S S-35ǜf;ㆸC7&T.{ #k0tSͽ=Qpi~ JZBfF C4i`F΁N£ -`@dYPBPy.BL4HCiD _cP+ 28p6Bʞ7932Jq QUCTSh(@a&X]V'>0`CP0O@?&Vx9$Bc8t3'PQ"q8d)9j=DTGkΛFu H, kXdJA eIhmd`%DG75j@%JXI+hq?kH]P&̡tNx{3Ə&wYٟ?(ؗ|ųFKY_Sv5'WqsVV~{{(޲?fej2ecԊYrx}s1> p>)r8az=琇`'3Bj TMrߛ|fs|2'ωv Hnn)]*|*b!R!SRS4J|-aOG#Dr JѨlv!sd"df^~<w?7bw/,f?p~=,o`rˏϏwEUUaʁJI nR>|W p2sS Xy8]jaYdG 3[ÑЫ_x(2DKcD醳{nw3Bbu4|t'csft{lg2ML %،>g,(I̳@wa %mQ?UE,bXp҉%3dy A25z0폳t/ M׼Jga_O9J5 lSvlS ѿ~'#*:m0ahMyD5jx0Mm#G*gd봅BjԔ!]MgPhRҀ,,阥T\!G* R?DqH٩!geS! MQZUT|n@$s$ yӌ+ o[K!r5YIќYMќ&P6i*2.$I6rRSᒘN~S9Z3tO@יN.1NdUfhe Mbt1:)S۠*̃4 DiRHlb8LƗA9]ITV cbZt!2FXc7mlFh8< Qvs}&H MHm<rQQ )Nw~M _g* >)0(,h$wZAch&Z-V1$0y+r\`m !6}hS 8tA7,i %hHOi)ckXŭfL^5cl/ehd$AkoT8@E#8ħGƈ赌S5G+vImZ_O_ěl>6D@\r5 y Bo*F;&8U%t+Y T}GGB;4j]3/SYF<#[#m4:k̵ͯ۴.Q%eqB5&?g:QXȽC ( Q: _IdI|H6GJ{қDrƣ#!x 45f3cuRN61֒}bPd48O,=Iq L(-ݓʨ H"\kޚ!L: ^z䈭2CQW:)VV~RTv$Wլ8-)N1qԆr1a:ƫ' Sdҗ0sչ-;yQ9@Fg.3o)Hy&{zeʈ&8>[bt.rJNfAiZúbiL"!'cRtnMtNtoe-}6g:} -hwUW)Hd _lFA1Lwd6NrÛoӲMFh0_ϘN-׶#Oc>w|g˳pBzni[7/NN޷=]J`"p,pXv#Gqoϐy<\b>%(LF1>ooQM1kMgأLg'w|Rh*u]Ib-Bf0a*y ?gN׬Wo:Dv[aIc>_X1!u()6͚%Jbe o__3?2]5Zk Go d Y" jWedh-xڇq^FZ*JFDÃ~ԯ'qX(ڢwsZb˳6_֘~KjK媈v?Y%9-KDUB[eOLՖ1 (L*{V3g7Et'f解w*RS[+Q]uM$%ا,z[3/yFr9iPDϒwx>;WzZ1N۵+:Q1\\=~n|| ɴx̗|7:1s崸ڡ{4aɕj:wj# %u"lRA5ۊ o/@H>Ӭi͛(b ngz&휋?RAUm9ԚG:Γ* Σ˒m쟽xb>C<<~,yuB܏mVTpd1 bu XHf\MAt.dEI>$Ǥ-euvK7VҬ{sU&I.6IesG>iF~XʹngYJ2%ǧ{?)9ERfXC,!P]ͅT֋h]?tZ.,`mr8; uUQ{:WnVON}Ǭד4Yu'RԲ;XՊ+h6{k@Dx1Lt`xuU@gG t>$/ޝT-4uɌR2h5Q.fE21fMlՖ˜ovS2[ 7K f(^4s%-'?܉{$WfRf|ZC"3[Y_+?8upcSFsCJ澕%M*w`5~(9Ng]脿bZ:B!M mV*_БXxfZ?D.R%f~z=iIъ2*z!S,Wɥ͘'teЦ/af\f’??w8Ng%5?W!1ey3ةi9;RPu.WqU\vֹD_f۸D U .!Vq)ėY յ[ť2]z[յ +ӢB oju*skaJM u핯=mtXe@T*{vC[ֹ]=%۰B ˮ֣Uh ZuVpI(.Z[bZ;>zӉr .( endstream endobj 132 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.16)/Keywords() /CreationDate (D:20190411081857-07'00') /ModDate (D:20190411081857-07'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/W32TeX) kpathsea version 6.2.1) >> endobj 124 0 obj << /Type /ObjStm /N 14 /First 104 /Length 561 /Filter /FlateDecode >> stream xڅTMs0+H|ړɌL{hdA) NB@:6J#|cz)FCaD(`<)a)I`I@Fy8[==6*[;w7$4Ës{;a<ʐʺ`,o^МۅR{{yiYy4mwRE\M2rص5TBR Fh@r' -ݧk6psOK:8 ?b}dUaiw?5V[7i4FazInz/OUGu)JhQ{Ƕ,[1q646GBX|p endstream endobj 133 0 obj << /Type /XRef /Index [0 134] /Size 134 /W [1 3 1] /Root 131 0 R /Info 132 0 R /ID [<6160E59F57C2C2D8694B846E811811AE> <6160E59F57C2C2D8694B846E811811AE>] /Length 320 /Filter /FlateDecode >> stream x%G2DQsn{-4Zjв[ΡrΙeB( PeFaW}ȏaA} UI)8A*,=5bieCK6B ya(B(b(BCԩHNZ pgpP 'pGc)r\۹z FhfhVhtԫD&ln68]1 =iY̫ *7V*;Vi_]R Y-^}ZZ}XZK[m{Td+i#3HcX0>iK 9, endstream endobj startxref 198957 %%EOF RcppAnnoy/R/0000755000176200001440000000000013536720622012372 5ustar liggesusersRcppAnnoy/R/annoy.R0000644000176200001440000001347313536720622013651 0ustar liggesusers#' @name AnnoyIndex #' #' @aliases #' AnnoyEuclidean Rcpp_AnnoyEuclidean-class Rcpp_AnnoyEuclidean #' AnnoyAngular Rcpp_AnnoyAngular-class Rcpp_AnnoyAngular #' AnnoyManhattan Rcpp_AnnoyManhattan-class Rcpp_AnnoyManhattan #' AnnoyHamming Rcpp_AnnoyHamming-class Rcpp_AnnoyHamming #' #' @title Approximate Nearest Neighbors with Annoy #' #' @description #' Annoy is a small library written to provide fast and memory-efficient #' nearest neighbor lookup from a possibly static index which can be #' shared across processes. #' #' @section Usage: #' \preformatted{ #' a <- new(AnnoyEuclidean, vectorsz) #' #' a$setSeed(0) #' a$setVerbose(0) #' #' a$addItem(i, dv) #' #' a$getNItems() #' #' a$getItemsVector(i) #' a$getDistance(i, j) #' #' a$build(n_trees) #' #' a$getNNsByItem(i, n) #' a$getNNsByItemList(i, n, search_k, include_distances) #' #' a$getNNsByVector(v, n) #' a$getNNsByVectorList(v, n, search_k, include_distances) #' #' a$save(fn) #' a$load(fn) #' a$unload() #' } #' #' @section Details: #' #' \code{new(Class, vectorsz)} #' Create a new Annoy instance of type \code{Class} where \code{Class} #' is on of the following: #' \code{AnnoyEuclidean}, #' \code{AnnoyAngular}, #' \code{AnnoyManhattan}, #' \code{AnnoyHamming}. #' \code{vectorsz} denotes the length of the vectors that the Annoy instance #' will be indexing. #' #' \code{$addItem(i, v)} #' Adds item \code{i} (any nonnegative integer) with vector \code{v}. #' Note that it will allocate memory for \code{max(i) + 1} items. #' #' \code{$build(n_trees)} #' Builds a forest of \code{n_trees} trees. #' More trees gives higher precision when querying. #' After calling \code{build}, no more items can be added. #' #' \code{$save(fn)} #' Saves the index to disk as filename \code{fn}. #' After saving, no more items can be added. #' #' \code{$load(fn)} #' Loads (mmaps) an index from filename \code{fn} on disk. #' #' \code{$unload()} #' Unloads index. #' #' \code{$getDistance(i, j)} #' Returns the distance between items \code{i} and \code{j} #' #' \code{$getNNsByItem(i, n)} #' Returns the \code{n} closest items as an integer vector of indices. #' #' \code{$getNNsByVector(v, n)} #' Same as \code{$getNNsByItem}, but queries by vector \code{v} rather than #' index \code{i}. #' #' \code{$getNNsByItemList(i, n, search_k = -1, include_distances = FALSE)} #' Returns the n closest items to item \code{i} as a list. #' During the query it will inspect up to \code{search_k} nodes which #' defaults to \code{n_trees * n} if not provided. #' \code{search_k} gives you a run-time tradeoff between better accuracy and #' speed. #' If you set \code{include_distances} to \code{TRUE}, #' it will return a length 2 list with elements \code{"item"} & #' \code{"distance"}. #' The \code{"item"} element contains the \code{n} closest items as an integer #' vector of indices. #' The optional \code{"distance"} element contains the corresponding distances #' to \code{"item"} as a numeric vector. #' #' \code{$getNNsByVectorList(i, n, search_k = -1, include_distances = FALSE)} #' Same as \code{$getNNsByItemList}, but queries by vector \code{v} rather than #' index \code{i} #' #' \code{$getItemsVector(i)} #' Returns the vector for item \code{i} that was previously added. #' #' \code{$getNItems()} #' Returns the number of items in the index. #' #' \code{$setVerbose()} #' If \code{1} then messages will be printed during processing. #' If \code{0} then messages will be suppressed during processing. #' #' \code{$setSeed()} #' Set random seed for annoy (integer). #' #' @examples #' library(RcppAnnoy) #' #' # BUILDING ANNOY INDEX --------------------------------------------------------- #' vector_size <- 10 #' a <- new(AnnoyEuclidean, vector_size) #' #' a$setSeed(42) #' #' # Turn on verbose status messages (0 to turn off) #' a$setSeed(1) #' #' # Load 100 random vectors into index #' for (i in 1:100) a$addItem(i - 1, runif(vector_size)) # Annoy uses zero indexing #' #' # Display number of items in index #' a$getNItems() #' #' # Retrieve item at postition 0 in index #' a$getItemsVector(0) #' #' # Calculate distance between items at postitions 0 & 1 in index #' a$getDistance(0, 1) #' #' # Build forest with 50 trees #' a$build(50) #' #' #' # PERFORMING ANNOY SEARCH ------------------------------------------------------ #' #' # Retrieve 5 nearest neighbors to item 0 #' # Returned as integer vector of indices #' a$getNNsByItem(0, 5) #' #' # Retrieve 5 nearest neighbors to item 0 #' # search_k = -1 will invoke default search_k value of n_trees * n #' # Return results as list with an element for distance #' a$getNNsByItemList(0, 5, -1, TRUE) #' #' # Retrieve 5 nearest neighbors to item 0 #' # search_k = -1 will invoke default search_k value of n_trees * n #' # Return results as list without an element for distance #' a$getNNsByItemList(0, 5, -1, FALSE) #' #' #' v <- runif(vector_size) #' # Retrieve 5 nearest neighbors to vector v #' # Returned as integer vector of indices #' a$getNNsByVector(v, 5) #' #' # Retrieve 5 nearest neighbors to vector v #' # search_k = -1 will invoke default search_k value of n_trees * n #' # Return results as list with an element for distance #' a$getNNsByVectorList(v, 5, -1, TRUE) #' #' # Retrieve 5 nearest neighbors to vector v #' # search_k = -1 will invoke default search_k value of n_trees * n #' # Return results as list with an element for distance #' a$getNNsByVectorList(v, 5, -1, TRUE) #' #' #' # SAVING/LOADING ANNOY INDEX --------------------------------------------------- #' #' # Create a tempfile, replace with a local file to keep #' treefile <- tempfile(pattern="annoy", fileext="tree") #' #' # Save annoy tree to disk #' a$save(treefile) #' #' # Load annoy tree from disk #' a$load(treefile) #' #' # Unload index from memory #' a$unload() NULL ## ensure module gets loaded loadModule("AnnoyAngular", TRUE) loadModule("AnnoyEuclidean", TRUE) loadModule("AnnoyManhattan", TRUE) loadModule("AnnoyHamming", TRUE) RcppAnnoy/MD50000644000176200001440000000326713562516156012515 0ustar liggesusersad0c0b3412232e47d48dc8ba10e5a67e *ChangeLog f9dde79db4cd8c9449b59974558a2d87 *DESCRIPTION dae4f8ca1beeb667ee6121de3c975d2c *NAMESPACE e3b030f3dcc610550328f176e2ddd2f1 *R/annoy.R 636f5c2931bcc5b02891615687c88e08 *README.md f49053962749f8af3534deac8c26eb4b *build/vignette.rds febc42ec3b6fd6c342a9fd8d38f20cd0 *cleanup f6f2db8ee77cb1083ce50ea2ce613ca8 *demo/00Index 626d1ee412f1f366f860e2fa1b7e15a1 *demo/simpleExample.R 5758367f15ba9a2d3afa65082244ea5f *inst/NEWS.Rd 568dcf938bfd545c06324d487888e301 *inst/doc/UsingAnnoyInCcppWrapper.Rnw f2522ffa29aba41fcba91c19f0dddef9 *inst/doc/UsingAnnoyInCcppWrapper.pdf 8e37426ba4cc02258f5323117900b5ac *inst/include/annoylib.h edc6258dd50e674434465f4160b27447 *inst/include/kissrandom.h 61e2a44cbcf0bae5303c19db4505c007 *inst/include/mman.h 14c740fb1a1c4d78afc7d3b76641d9e6 *inst/tinytest/data/test.tree 4bb99f63e5ba7c7ae5b730625cf8e2eb *inst/tinytest/testAngular.R 56f9fece1ea637c58c269f6b530712b5 *inst/tinytest/testEuclidean.R 1ec108d7dc0af03ced95ccf131c6daf0 *inst/tinytest/testHamming.R 7d8dae4a58700885f9f424d9f38c63aa *inst/tinytest/testIndex.R bfc5aa0efdfe1fde02cc8fdb51e6b447 *inst/tinytest/testManhattan.R 15e6bfe848de489a6e6e0b972980c159 *inst/tinytest/testOnDiskBuild.R c31e274a819e1b945f2fcef39c3e9d51 *inst/tinytest/testSeeds.R f0b4c7a397ec71aa69f68829a3ef3f71 *man/AnnoyIndex.Rd a217c2244c13ad7cf558e7fde43d4796 *man/RcppAnnoy-package.Rd 52c711d73778c408c9d77e8c3b7c6bd5 *src/Makevars 3aef8a490f866fcad48fc0b4b8439ab1 *src/annoy.cpp 1dd101a42dc20a4f09947b3df22eb6cc *src/init.c c473b8f4e7d47b1b87cd6fa570f096c3 *tests/tinytest.R 568dcf938bfd545c06324d487888e301 *vignettes/UsingAnnoyInCcppWrapper.Rnw ee80e45cd0a3bb05d5955d4044a1da07 *vignettes/UsingAnnoyInCpp.pdf RcppAnnoy/inst/0000755000176200001440000000000013562375421013150 5ustar liggesusersRcppAnnoy/inst/doc/0000755000176200001440000000000013562375421013715 5ustar liggesusersRcppAnnoy/inst/doc/UsingAnnoyInCcppWrapper.Rnw0000644000176200001440000000042513465634510021135 0ustar liggesusers\documentclass{article} \usepackage{pdfpages} %\VignetteIndexEntry{Using Annoy in C++} %\VignetteKeywords{Rcpp, Annoy, R, Cpp, Approximate Nearest Neighbours} %\VignettePackage{RcppAnnoy} \begin{document} \includepdf[pages=-, fitpaper=true]{UsingAnnoyInCpp.pdf} \end{document}RcppAnnoy/inst/doc/UsingAnnoyInCcppWrapper.pdf0000644000176200001440000060416613562375421021155 0ustar liggesusers%PDF-1.5 % 7 0 obj << /Length 65 /Filter /FlateDecode >> stream x3T0BC]=CS0eaUeg```bQĆHBA=sM\@!(Nq endstream endobj 4 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rbuild21819de8f72/RcppAnnoy/vignettes/UsingAnnoyInCpp.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 10 0 R /BBox [0 0 612 792] /Resources << /ColorSpace << /pgfprgb [/Pattern/DeviceRGB] >>/Pattern << >>/ExtGState << >>/Font << /F21 13 0 R /F108 16 0 R /F109 19 0 R /F113 22 0 R /F117 25 0 R /F133 28 0 R /F141 31 0 R /F89 34 0 R /F95 37 0 R /F99 40 0 R /F128 43 0 R >> /ProcSet [ /PDF /Text ] >> /Length 5343 /Filter /FlateDecode >> stream x\ms6_1` Iod|؉T|8k9!9׍nMѫ6eFc[|̛^]/Zx e#-{웓g/b!0Z/FAE\gGKC벬p6/ME7SmZsVd@-BA! KϕQXJύ%uRIϩ`@F;Ŗ"pCCKTh\_.ƌF8&4Z,EJOn Skhn>a1+0Ɓ%|# +] uݶ˗yޝGBx_QIIjh`2\$r)X:Y nrWG"p~ n"[ѝ}m}9yABD8nK>$G0fapq{֮}#I?]_k`+;XaoxVđ!φ \峂%k[8-]Q>Ph#W{d`bߨ@gZyc.^*GBq`:z0)Lz@xgSC9O$à7Y]z4U9"S0/67m7"dezN]~0&@˄F;`$DQhLOTd2si3P>GPu~}VWMCVkzr=[u&Cȧ!!]U[b 0o_qo$Hjg;Ѭx(Dje O&RۇP \U'EP"a S.ڂ{4x5T&Q1|[gYTWMzR yn Fmx kYqZ2p SVAvC_,|f&epzb]!C]~-lMjQ%Blw1Fw㛷ޛQ"$7ĂSu_v槓7Q& BlBЅ`뇼wR:Zʍ_8Cb Vc V |WyQP_M.H 5: y;re4>gH??@AFNIKAGv8 hbz?n3i NJbP?AH?,% RZ-L]R=~X@efMC>}wCT ^-=Lç+uɧ|țXQm,1C jM~u㒔ӎ?/Za+av0jxKx cQVZR(X2B7 y:mq+to@~"\NZ)ՊShʖÃc&tCvqz,V{<)cb!6r98@zYUM^uxLt 01 5xe׹hL7eCy-]\k>TG'C/\){U{UmeL֚y[nz@~ ?H'(SV|@+e4VS]h3Juօ bYg@m_ sCT8s{^Z?Ai@CGƾHd@~]=o~!bf5{ ;l u! OwkqFF0{#&Nio3%&w i{:}Ozdj̭!QF!>ms9 ř5CSw1!B|L; ɮh_)`6 P]30,X4`0LUz66>hpUΊMj7B5l ڦRycj2v:6[1P0;&p5[-^Hi3n`K"}cU_ݞOE&WapC`EM|c4ڡGhV &4 {)A=.ncn,,bň2.餀L+eM{8Inj?G`XE!445IR @YMj\s^jHi9O懲0暪b< oc=bd-!v`9g&^Jڬ%KB#ڀAǜ-,w+9OHnIl BuӾ&+'DAjܳ[PwMv%4ڢO_bw@[qV Yx|_1-6Y\:> ~$HcCH qkrCu[nt |>\u[.v9nsotfd˩ SD}΍t;Pm;M#7;10 (Rfɤ@׃c+m59x86f}ˋ~8a3)oLYܘr$Su=eVK.%Ax~-R_zduu6)tȁx5j ޺B : ͏Ht!n6k,1 j8rTդ(A1O* S"3U۔7_tY~L ̓;9J/ ~rt9&ĸE\]FڹE"2<kxHOxO0a 0E_Qz7) sWxAu ͞R@wCMGv:(I/4_rK& _7u?ZLPVc2G*'ike31gf%,j|@ M.=N?7aPmVO d3j&9mL PBې^v8(bP lBF ]%*>^S]C ,5@L>uIeJ491 n OwP2K[8gHAt8U7G صxxѲ ]/6oyRQ @qN|lRNr P2S~dV#zGPq1Mj>l0.ڳ#e4}u{2@H` Afkempn~$Mm݄S0" 'h_3Hx;Emcxt`CTt_ҖmZ.Sۓ#M`x6::غ>+cLF_6=㕲Iٮx{Y=鐀=%`#Mwum+\}{̚JNN. ~ԥCJn"̑Ä!L*g x?4:V7gk<! 5S!0ZDWLEAIj04H>X9!Cap=I $qYÃq-pJWVMvO$qխA( |hHf|tvO|޼_|gPӨl#ϠY[TbG7},+]OSs<~Aãρ@T@t36MRPHi=zHEVtY!c r`~ԻÒ(9urϚsxOY 7]@A5YAJJLl&gJEuǝw$"Xgg+BP&ʇ#W" j+hq mDh#.c/#oGq5CV'=ce+|[os9!ʖ29qeiҭGH௓#K[/^vDt},ŸPrèqq?fEJqB&?D(@꽿K6|_F䖳G}CRG@,^?_) endstream endobj 69 0 obj << /Length 65 /Filter /FlateDecode >> stream x3T0BC]=CS0eaUeg```bQĆHBA=sM\@!(莓 endstream endobj 66 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rbuild21819de8f72/RcppAnnoy/vignettes/UsingAnnoyInCpp.pdf) /PTEX.PageNumber 2 /PTEX.InfoDict 10 0 R /BBox [0 0 612 792] /Resources << /ColorSpace << /pgfprgb [/Pattern/DeviceRGB] >>/Pattern << >>/ExtGState << >>/Font << /F108 16 0 R /F109 19 0 R /F89 34 0 R /F133 28 0 R /F113 22 0 R /F231 72 0 R /F208 75 0 R >> /ProcSet [ /PDF /Text ] >> /Length 3891 /Filter /FlateDecode >> stream xZms6_O=@dzw3Id|LsmHx~=%i&$|$r0b&&Q( IdҠ@''YNPejr~9I(b1APdr;ț)E3ƼTS{)(b2h9ӫF0Z,EA4aQ1F^cwE}F_׌Zԭ[n҈biRe 3롬sؘrW) $e Kb04żfȋ9v "a,(  @#{A.,bRW[RVvq8Sa̹ ǡߪbu9fɊ_]¤/ g{J|$0B ffhmU"v‚=; M5vTiAp(<_ͷ+=:vYF']+¾IDl:SQ"o)!չ5O,9m7M~:#*?h` AS6@T.p22m{$!ɘ9Zge}, A{,.k}GrPȰmޔ+[ra-g#qI Dޘ59Eyee 65f q#&@KrN()~ۖq1k'XWgKI'#g )׎[؞85\c d|{9n岹udny*N 6pflRz:QKpݳ[^Dꔥ *θ@M ORLYnikX_mạ]6u&)cmM뺵eN#UW=E.ʮ,ڽ[-yW3ܦsç?3a3v2pC"2CubQ\pq:_mu~fHym#&o`T4M_mnyIh󲾡 -n)Bv^Hyk_EzF:'21k xj#ӟ}3DG 9vPP&5:.7RO61Y$v(Ӯ=OԵA ҁw[͕) s*}&ڷnf6A­ӆ8Zd'a^7QTo`ͭzzDu^G@r,~g#7^[[+džK\ '^vm(*ض{̀tS,:zӐ*~Ώ7SD1ְoL/XՕ U';P-uOr.B)6w/n7D©DEq}Ovd+E{hqݿGv w :Y"`dƻ]$%_'|l($jm\cD}hX q J<'GIS8>) ȘݽC.-y<͋MwYً]oSDe`R3j[iTUij.-RU=7m ,ߎK6q BxUu2mmȸ+[@8.' ~1xOܴP!jDyMy yPfPdB 5hmFЬgqO 1lӧGua#2UyDtLfpI'p|H%.*A>_hV]6iL0:=l vHLo;fseNЁ5M O i"$N0j :t<5ۋ1Ʃd:I'x&sJ7tR>p{yuߏVo]APd#gm\NxپC=5Mbwu\wB;,ە6/BzιWAV{]C,e.?9mB!ᤳ0GYg%}ۡLَaa)0NNy:iMd3Qp)ú:~=ɵ6v;" }^ N͝ȫŢX]"E:(6g~HNy!yL/A =Kdbb Z+wڴOrRROG! GTpꗁ]B8~ΈYpfcb!&f#dbx4a 6eWg/Nfәbw ~!?0%J!`,0}E*_Ty1ǮА3Q0@i%r,CX8^l&"A6O zCGvS 0v//kdNv;_@ez0Υ"јtب'goq8=V- zI d < ;^ԥMspE7Y"e$Ž"DDC4JfY4@8_X  KlpiƾU?Xǃ3[jo^>3-ּNLdg۶5}]W!qF_8'ƛ?PT<͢׫D^ a0x)hϝX~8SaJGÑ|g܍3 8עh X`ڵ]jp.{-Bو8q|,'IOt4ApUs4+4o_]a /^"쮜G G>ZM HŽ<@Da LF̓x%0MsJ'I$pLFƙh2w1ް6$g߀ϋΟI- endstream endobj 80 0 obj << /Length1 1456 /Length2 8804 /Length3 0 /Length 9772 /Filter /FlateDecode >> stream xڝwuT[}-b-V P ݭ@w(.EkZ8ܴ'}{we%=3{:ju-6 KsԙN 9C g@ Pupp@!nD$!pg=@ a {]q (bnۀ-n0[`gHaKk0+@E$agp0ljC! ;%A0?p:Z95]MUUm4@SAN^[ mVn  dmb @ZDgЁYH.v8 spà]߁ E: " D`g E p0d Bi(+ l\F &#Uy"tg  9gD~P_UdpkVwAxD O EAV.^ďBL? Y8;8APΈt' .^,wh! `dE02K=1r19\\Ҙ#ܡX\j1B4!W]@v?ĄY:@<`+,Ugp?n¿?e]TAU$,?bo ' gb$ֈa. q[C-lV ;=ׁZav(X/l\! ##9-'9 PO,'ݫ 0dB8">yeR%j= `u_h/6.>>}CwA0l5;`,Op[~J |6WBQ%[X\ȭV9+׏$7DZ.fcXeZ\G: Er&'PK9 $^-_r6oFW͈3N wvY&C5dtҕLca/5Z)t'o2Y|nACxGUlCV-|xmٔF?v35vi!g ZÉm\z⮆w- =f졊 _$ehJy6HIVfq>• L[Y+f%0HH:~UDX'2\堮Y(=(RUS0T л@Y\P׳h5g#TLU p~2עkw D,~$P ?2 H q[aQL3A7g~N6kz++k[w[~0Fȑ,6e55Sz$.28J~o筪3ԡb 7̼+~Zk3[,bSˆpU'y{klR˃& 3/Dٿ1>]VX=Z-+ ^j" ;cʂn_@ ]:茦~֬c x`B]0KC䗤{nH3Οga4߁~G}Ph!Q~QZlͿ{}Uޒ*:ˊ?G@mDF.UnJ+!,Zt2Ym5Cg9ӵ*f!(w&@j4kHƏln,Z.e.6?RmMQ4CfqtlV4z~Ҝ Ԋ,VkeqՠvԈϞb/Uz㹝\L6ytq̠e<:7x1U >?$vz36N{G GC˯kmBU{>1 (]&h;qM rZ)Tx[yKy\NoQ[ 乲8]t{Jyg.K楢,P rI4َhsqx$VSqVTH{`[~U#-OӍnYuoRMy 圵Ԣ,ߋ]Sv,4Hg{]/tĘ[!(kd,k\@@z'#ur+` 977 x;NkB'e\=[͞ع;s ,!5'$"Y#T*ur~#ȝxNfEE_Y(}hQtYaY ͂s62rdOHEN&wȜˤ0~y .{X%SǤB}QRJO, ǺPA*Ù>g3Ad/Acd#Ex_hN 6kḫݯG j!B~'K=uk[(d|sp]B9ܘJ{ ɈCܸ=z%VhwO549_zp5gu:hq:|"RmVU`eU"Ĵ{-)RsQSEoG9>?{l+}#T)a+_u}f~mbeXnL΅E ٺs'VG 3ҋET$"^@_\2)ݰЈ&GnfE!ѧm&E[qLoU/Sh mb}O׏j.ܩAٜ/yxag<5:C>mnr Ǩ'0(-:M4CFT7#ΨE\Dy  $FtE-Q5kPUToXYx(2{gLHMd;?%ے0٭Kk;W\{OqߙXv EF+vOVV2_ 3Yh&yVMVUme0+9U{| V2:(΅  -4NʓOGyl:e)EC9} ^NL  L-:s#2e ٴ|i]v+<-1lK"돝PRTa}} 1슡ݤr*Z!@ՋhOk &/KZi&\F-9:6G>:Ka+aw^a.C,?[V#Ve?L>t4@[bXtyE©.Rj=C}UW!544MF"j e^~RCbr7o lg x ./)2Ԡ'H6}Wz7&i= "R;Ɉ9ćQ.wZiD;+ 讱KbZKհZRujC(1!=*%GJ+f:Jgkg| s΃f1cq|vӇwV L52l039<7mp3ϋ9>ĐҦSdik$;' Ϛ^B[Ht +yih&53_>ׄC[Z\a~χ #,¸9m?^j@ꈭ/Ѣy<)jYbzIDMQ ݃՛=hid$_w|ޕ$/%ӦY٢cR ItO ,Z!W%cx_~[qeWj.Ӑ#`Gw6ig2Ka92m:WMN-ײ(uBuhֈ {>=JҐsޮ$~"M3(k&!u__E-5=SҙU=VtKuՔLL 3^߫Bj\g~GHe\#J=}m2ԉ!u܍p޺nn~tQmͮ ؊% Bg)ցZ rĤ/DB(ECQeUCMs^VJ+`JN4y' b+iI1V AB&pbg%NϷ^~'(.WnLqǸjig<_Z#aoRBtr}=:=$-[KfRǺW"M)MXb^ rEce?R/}8QP%4Nm^\7%C.ja&=XZ)[OH'(ʉIй.M3c=FE-2-%T]NUP)[a„2HY7iWAj8 ~K~Q 㻌gb147p1X7nՒW dWHDTLҤn4$ORS2~rb*(lwfo}Ջ!ַiztfn|hMę=$| )/XVG{Y DT'x"3 XZ޻fjzFɭ&e <"Ƕ^OQY[*w7VDF-.J0ё4%Hٍi4 pvOuqd&=yW6# >/)z7CoY:H ?70:pLLc8-u.5P .f ֗Oѥf RAd@| ֟?ͺ 4LeB-D2x&>9|ҡԮ+oY`!2R} lJ NSbQ'ZZ2fį鍱H/ieLbzX2=ܫyj fl!9#z a+oA 6UA<oXL2֤>ދ;3T6hdˍ|++L<9f8MO?DUU20x9l. #=/N7'&Y}G2>բ"nn:_>Mkk%hzQϷ>#h;Xn%ZNu٩k}Gâp1T?C|n^;-8?}dQA0JYJY>P   |OO_¤/>D%*w9<&ˌNMgղQaCW?6"ESЇGt6M@ڵ} ^`H/0t ӯH()76afxSYd}*]{Z-Uls0<8kbk",ڼRIMn tjDHLrlvXW9r->!egIObb>AB!HCtxw&%ݜ&Na%qk)4J(:x9[Clvcw~-Q}%N@Tc}`+D*)+%lY7"9/`&.+uFRsv+xA2&!SpژL̡ 2axaT,^*k@1s-O4'|W.= bP/ -Rȍ=cm!.y2'VZV<"^/cGT en{.>q1RA%\睬Ϲ*9DGsUx!vhЮ)%R|5QO*6>HKZTwrl% ߪG;lPd-6Wq\kˇ4`1n?|:E @zkҭ-)]z6h*&Òz*ix%`nqe+!;l&yKů~dV3 + #mz։| |d7躩NTrF˩,XJ]"j'#,99aSiDu|.xktZ#?P+Fy")-uܠz1SڃEcK x7nͥB_ &`6(;0ԯ_QEs!/;s;BՊiԨ~qNl ޽fbȉn l g=pwZ㱢6=ep+&8᭒vnZ_{xXfj];nOjmҧmA3S endstream endobj 81 0 obj << /Length1 1454 /Length2 14980 /Length3 0 /Length 15991 /Filter /FlateDecode >> stream xڝstd-cۨ8ض͎mRQ6;mO;?FYk͹0(IDM%@ ,b@sc1Ȝ (:X,<̼,l<~Qk d`P:Z?bN@kK+пc x?dLb&@k3Ksz'_$fn/ ttZ~|cTcH)iH**H(T%Ue%2Rj>V.G 1h3WSyI5`|s1D2su6G f9@`Y?.&6  Z 9sgo'9hn/? 4J8XYYXx4ϯ'hI`o~&v}s_U_.^r~"O..Oa|`f_QOVϙKME.hl r2;~:? @}A!3+ ;+'g-]@a~*P >Gce,rTQaCGf+Nx[L88n:Wm3j)$(I[ȓK}YS2')+6mcx{7E/AAA񵕰 aR;Brze/_j\eo&ѳPGs{|7<(R?HguyIEID`OM!N kK>ǒ?ܕ{MuW\j"_n uRSt%rw@W8|ǬZ.ԛp]C ̛JirRf\a=$HyDBR@>Y rޛOAk`EKEfmc6Ԩ95ΌEiN'4{fѩLd;yEӤYἱpd\ލ=/IkGŁ ѥ0'eA+$x}cV^ڨL9aMrQcNۛd$\^6[~)1s: Hc ~;N:'o%bN+~EO rxB $.9ttrZ8@\P?цϟխ(0UOm`0ĔRCk=H,ڈ }>:or+(?qnΊ-6RHGOdʲ>{f QЯh_C-lͳ G5\GBqo&ujB6zgT/v 7R aSʆm^vOdn>Gk76m 8Io.bs-#ʮ7SSr`«.UKьh:Z_Z>[]d;j"ˈo]_KhTSzY| kW ?xE\Dwe͈ *"D~r7iJk&r F x6zxau0+~gxF}>;r(%З'+] 2tbUj;it8ۈ(,"1nmOA3߇iր3j{.ch[fFZx K^# 3Y*E*VAL e~>ۇQQC AOJdPd˙hP8Z]"e}8zS9E P?ۘf@ŗƳE` 󄺙Y1K_Ff*|+N=]V:b"KZobEQ_ .9RI"XW2ZJ?dNL?^0hIHuΗ+_TȋU"/Mo9V\˗X^AM"u`rJ~ԸשMZ4]i TŖi&ÕاIEΣK =1x5}.=D<2$Lꃆ.$i . 'G ӐAQ~_O^غ'LYOJ"7i)< N#Id=j?<4ܙA# GLYZ "\ED%w˶Ŵ$toa,Rt0_MYOo H/pde0V2ּfu5}!=9'`^"څ(m 0 nj~0cq(m= 8|LJLQ2u|m -ġrDr4'wg>d C#Oq0Ĕj {sss%I 5U vi d闘SK+bg?Uc9%v)8vN;NT=5̯pе2B1K﬩E%:ԉ4LñSoMY5G7IVjoceHJ0YGkGٰ~ثYAieE } CsJ\؆<+dAY4izY4 ZS!{ۮԮ\D e΀WJ;~ޟSdl RUU4VY1?@$(V4_Ӳ q8($2B(%Ѻ-a &$c8,ݷ*|dޘNSt$Rp~LS4 Y&%g;Ht`<=U籖kJl>knԶlGr$D08ҹ $ /䐜|+cLT2~b w7r!&~ )VN=", ʡ5b(n5kGQ}OqIs>zc\+ ,7h65®ӗ\/.ێ}mxVR.@$RngY'cK/7_:Ҳŏ@OJHm넊~<ܒkqst~og9M| -Ǡkg9)U_4Ҝm[ (2GIZN:E` `ԚyF'Djifj{P?~"6z:M}9?T,@(rJ/jV;/4cl~{-iʿ|S6y.YM;noYggZ$CUETyW7mzMğ=Y4KP@nKgZwL#]n29]'c0Fw:Jj= d`4.Bh%w9i x* *yDrB*nFuItݭyRơ312dVP$xϨ~KDX=1b~Z> 5D8C0-Kt% ʺwroH3ZކU؂` FRd`e<%)0>taK ilja*, p4%4QY*3w EMIYȬ5DL~\,:0n;0d5Zݻ.QwܥH)|p)r! EBtuE\*SY#Zĕt4>m8S_1əkͅuxP{&3 `hH#s,}?H%+`kwR3y)UCȈ s\Kvh㑤\gϞ _fq~._#u1V% 8m{ wO:ZXV2. ȉDqcV/XJLlf?[d͕˹F5{<0@;Qf,Q|\-ԝDRi%O3My$l(tCp;l|7I1(MuB <6TigyL 9+24/u.k|n$ڣLΩR<7 M6dgҼTgҟth&qK?CLӊI5Σ\ӣ ޕTaPӤg҃&;+*H}Σt>8wv@kuCK hyGMud5YŶଢ଼…y}GXDEpʮ߷;OP@i=,e|zө?B]C^O_i/&kӹSq.[55nCK6ɗQl'FgTWw(sA`v-$l(E; "$)ňa8O$MYXaExY\g ( z(6k&R5mEVJ{i JʑDUӴF59)B|{ݑdڽn>}द:;Zl*9~FIw[L^]2g&e+c֓Hv+h!r6Eo 7c΍a^~IjDGs霹ؠ*?)v"}'Q^'󫹶EݸY K'Z^@Ce(NCCq_I([_%$bwm4e8U;]SNNfotA~%b6dX BY{]]'/V2yj!NxnU52dng+RAZY2YJƴwFU) gL4Qp@+x>Ӱ}e?90DeG:L7Vé0ݯ-p|憈ߐL4ҡ֩/ c}I58Z*٦6" x[VxME#} 0hY{-PR'86L$ `zTq8]v*ML \~[w#fGpx1as/[m^ɻfUy=O0ܒcP0,"㉿/FBЮ.j!Rae n#y6ٜߧ*oWǎ@5GA=anJ/lI?z2/(~wɃS7F2xC>QbMoU˽aeՆi} {r1,W}}b8 ye'{Ke~~HDD5t70ŷm/oիʀBX#F4uZbc;dcձt} `/wTe\ /ŦJڢR~q+G)7jNȨ<3ݦ "锔{ҷkF;;HU@}X's "FSf#^Ϸ-' ɥ}N9 hu!|'y2jvʐY@Ce.꛿'r|PUI_7  О)8Dz:zM0h_R\+++XE&̛5Wi#5uaW93O-v6RMT!A^ykZ::VEar8Oh~;905:E IڥĶBpM%L]WDW>뗖B?-Y_n^rByS/M{z)Bfo!~EG5"ן ei[#7}3HhBXҀQBWs)k/>҂90[A(ՐIL볌ZbK`) F >}R4VRlV?'y=Zݽ g". t4ЉD!9p' Q\.&F33v6T9ۆ8n@f)OU]AgɢjRVXYn:x>_5aa)<z+.,zdfZ)pͽu謘g@0\ ~G92?p|۫CL0ohdcmОHE`]jM\if|:.zٓAnŸ[+?=+QF+2V~*2V=k5m+0 Sz:[9o48̮l6AwFƺG" AVEqmd{q<`?G!yʶN I{ϓbqY}50%ڇ?{}륌{}+S 4Uݺ4jIIqlB9JKhO {cǜ|ycozuzkW⤄{2_o2ŋ$o.Y̰ AFϾtR cvX:{p>1 [&A* -J!ih?5WSA5R6.)AR΢Lt>UCf/acy J{2>o%Tpøإ ^+ۑZD&U&x^;q;^CSEVد.I)I! 7a+iye|zbnvSM'He+k N9*%ŵf\aF^3 }Uois!^EPy׊[,; –4I0}Sߚ3oDdG]lIL.aX}f(~=DptDi`0dNKIB(7N}ɭ%ID54N+\"7P#Q혆q߾Pu(@+5_;Rb#ġ )n]|AfUFx!~@Љ %# ~M *f[6=11v𧂋r}A:ÚP D Rk/R_vuB|}8X{VaъLg$gL M;iy^yVz":/Ɩ*ZD:+C;; P5#cQ&!3bgh:8X"OBrWI(#mL m1KCLpq"ٿ1}ipDl_Ep){Ik9<:@R&|4M%n.o*> *@TN9vbLVo89ݻ4iޕ/\ 8YkF`e#®}=H4H>mk} 9dQBEH sUɡᢐ,VS:Eeo&ȋR_&@ (F߼%cY@ ^w3s[O+_ګxl69̓)ӈ1>hհKb%3;pJs *V^#9 E*0Xv\B{281 RwxHѪ[}JWH q>(eY8`Ks(W;? t 'h]eAs(}^1,[cQDgMvcL kP w56j WnH}'7u|O>,}ZӘN hċQl( 05YUI2|+}-e#cJcGKc6SW}K*G Ss'?7ADƲ-[Ց%h3JWbލq-XSF q7yclFo*l|Le{Nw bg޸Pb{[V:5h{+ZK[5O0H P|_͗H]d X^. tZ'ӁO[ׂIXO x֊N{vOȉm_0^FՃKߑWɽ[A W*d@?"@XpCcBȃu+>AAs׏$9'iXə= m7 M 9>زƪyjMQ yt7N9z#9m4Ӑ=b8xM)7C3iYElwBar0N;${-T/vgJ•@ƖZ,I⍛/Pl7"mZEgIr}DTt%h\_gщ IwGOr;GskYap.NlB} mK;S*GG~nDpem WjHBid.6Zdunr+X6hgMp@C? `2)cmbr#;*>j\jfs#d dz1彣ku)s끍kr\]O.v19ަС+QUNpsCIQŃ4pFI Hh![wE9:/Ectn>N4!R l=l"Y:x^XĘ~va?ˬLnݕ2zg{Rz!D]/h :Q寉/)yR3vKUE|`3BOsdQߧ6eUs8!}n qZv,T@t=:+yb]1yN D3io,ó+pLIJEТ _U{8zJ,2 Qu0?tt,U&w3"58(1lEz aE &ՐN]_Qcr{A`y+܊!v poխGѺ 6@Z Hc|lm7 5β!5gd2ps#"f,&ә8O.wҼtcQY뺭N&eBϳu g+.R[#BճTѓ~|эtŪ)W^v Pu%0lDRtS'F:UN*74q3`%=]:jGGVKb),9C JTG߃0g kKA.m1)¡P7ӸîNrSOf~Avo R}Ujfe=38%ۅz둅2W>-2M?2h$BmY ['NN,)KOmI_sOw ioFAPmkFH~aWoid.^!1ay|/"iPE%l/YH{ʖ lۼWSSK=K 9LzĘZT gndS_%t2J(H=Tg}Q3 (0t6:QY#̞/QX%]jGsܭ<1Rq[2fբ5?c\&y~Ư5Br˶KD,jTow+gaTX.8د Շ0?~O ᷴOW+6%^QF~seci Ɨ!d!C0fA}6I o@/O{Zxܲ9rWc]uL&GcrbK-zGvm7 S )1aݹjW˓<,`)ؿc(w.F_TZgvO<>96$4DŦ4d%lBշIX=xQ55G/V3!Uկ'nה4~UC{'N `OG) %F b!K}egͬPGďΊL8{_eS6BVh$ILӅQ;?.?HOu8݆ZL R=Z/=-yNf{8~jv~ZDe^1`ex}*Fݧq_ѵz=Eqb#kn5t֘ c*,wZ̈(t2rXcvx;؃YidoIjfSs`8ufGKy]q9`[JI3!WKpڰfiJD("^"[J<oII74ms0]:$% eߛyGbEy/q~Ӽ/xKJ` j97вkA\=%'ua~{*pQ8xUoYj>eNDT^߱[ep"C|.y endstream endobj 82 0 obj << /Length1 1468 /Length2 9434 /Length3 0 /Length 10416 /Filter /FlateDecode >> stream xڝvuXT}.H %݈3C % !!!Hwww t>w93kZ׽b_ g-ZTn~>\E :+Y!@u%%7H?G }F^. ?@Y9!P/7`X9ܜ]ܬ!p;9/ ug.5 qyH򎎀Hp A@`䌀X9"!`^cC@@]HY `fd1p(aHe`+h 4"oݑ!0H@7GR0qݐH;@9;!Yۃ đ"0͟H8Y98CaH>X$2X@ 4xDl66Oʋ 1Q?y؁V.vD>J P__t/'I?DHB`B #/Ȟ8%cC?DّH  urvC6,O1/@`pi!1C>~!Y$ж8C6I9Y!')Ϗ5Hwg\?s ul .?ĎB@W@6&QQ PvV0j: aqWdOmŏ,/ ;9ύ #Cn7??lqp&r٢ x5u5 8#}#/7=+3ۋm_VeCϏtD~6P 9uon,Bq1>q;_Hy + ylpf6j7/sca=zo4e~9ɯ7 @Q*3½mvww¨[jN<ÇE5* zk)Ub*ئ(8<|XozZZg|$4lVs)qZنD\֛qv;{ މERX*.p1zqto p^#{& g{Nz8.חe(rǒ( WBi4fz'{zr"/~LLbe5Nt,aR9c{tׇoߘi .J&Ka›G(4ͯ{ĩd:0<(W%ā:I__d)?q&Ph\;Pj|y§l:)9qASs-lifi>I<[J6#}J@G'3GW.YUQsChWwjc^ $ ta!Sә˳4.Mcjm:l-zol*\? 9vUhn+G+xo#Q2./PV[-KK[<}l2+ykR?ǏX '8T>!5NB\hy;7?J(b6IC,!2KfQ1fiG">U^.S86yb ?6پrpgj m'CZc6f .Ƒ7 hP[qAPøaAs4|vieWABKtuYH_9K$[Dy|7<1I׋?dX0+ acwSaEzK$ᬳFy;v˸(?׹nj.ţc/n3vC80Ք5xO}W+ 4lG-g7\{pKVMQxDﭤK U76:B twX͘4Rzufqk xwFKB^+:BX eؿ9u!<RcB +B=Sץ`MtaPfyYF>D|?Sf4完FI>ڪ׸xg=;mC{yiU7^5f` Ʊ{K%\)M!aPnƣz#@bmo쌄 dx&@J0 4%6χ`+lyP9=n\GbLUد:SȺs\uxcd싦 Q. +ŻP Xg 4Q7 T^˱]xjgfNY4Ig]Ύ3E$hN鴘='nqoJ{7^E h F #)y1_w%Wy.}}!f)!}T2/Mw-F W^'5̍;s/AkXTعLa4 ?}W{2$DPlG1 86amF5#|m^~lCsP"x0״`{,q- WAѼǠ?ҹOߧ[@u1)uD q:S5/n13}cu*lۛ)Ll^y4 +L&e ߼YD_HTJ7YXe7 {}bDZ(tofڂ_ڟmM2!<\6luX ;ʿIß/V J҉l?2^o>R(r{tbWvP>Cx*QykNg<W7{Eu'A?ʞzRc.EX7b#%yXMpP^xVZxLK꾓OB}7FBq7194L=u9"x'$i5تf_3Svtdwdw\hBM#2BjDxhEXH>|鳭^,ߏPG\ْ jrV触66M\>GY>y{HoT}SOUC"IZ9A(ZtT'8^Y ~i&VbmKqCXe!i j|& BOyGQ>nmf*$<υ<esL޼c\zh8Uus+ #1> oЯHYZxa/,z*uV? x<+Ȣj|}сO5?k^gŬuhUnUGI!~ANSjei0Viux|QY&С`%V\EwYEFM`LT>+f7 Y]?~u+ՊL: *$~e*";L)Ra}gqM"r6bM޲ܕ v6z:v)((ow.2ޢ*_KF\,C{¤pð)} ʄ0/qƢߋաOf W,QB2э֜/BɆMe"6K 4w2w>3J}|ؤS2,ڲ hQeOކպ᪂Uw^;2'u+ ьmcUR3gSh$:3n2k#"oG$\eGݓ[]{nEJ5E HnXlִyFu< J#-~AtblrQso7.4kZ?ͷ=mw#Uߴ)z+5hgڰ r#FJC#NA'(3T=~)/GRNjRTM&\5%7'Ny Ǔk2('F(gvĨF@Rg}Z5 .I&c436<9b-mԖemK`)݃M:7&Rh)gw*Mjk\ICU`l}&`-X~:>>=X1F<z)8ҟddS_h}q [/m%ue,3MI{`I_{Fg N(%C\li(8o̡i J-Zj,JX1jRA"䰻}MqQD9ւ5*<[fGD415FXH2-$&jk̨e2Q$%t]PD^gҬWӈ|FmK`Sߢ7Mkw*TY2{QN=K0.迣^-y*&х,(-FGMϣx铧yQqP^59&քK/j>AW2,'NwƦ08F1 @qVN%0i:Ji|pAˎ#iqeRi 9"*&G^ njvqKy%z6;gyó Ĵ<VHK}á[;8++],zM$ ni˕8v*aySM֥ ilbɈbJ}&(?._ndk}Iݏţ/;<&VgA‚5X+1SO$<;n+О?K?Vyx0|FQ&%5<]bΊ v."iI^L˅g\)^ cv2G-q|"[ʼ9 ~YsN׻9x|x2Y$X۸`ra=kx[ը 9`+_11ePEdS/j5<2e< bPfDif'f=.ׯ#fm{ѳ{k] jovʅ"ٚb;m`3ۮOڻ옰ar߆"uߟFS3=?lbh\?dcnfz|y=׀%V6-[U1љ?%Ke,T%&qcqgيh7PvmïvW›U*I cc_fv&:-Vźv)떌 $K"([GqY*t]5{] "ƓV\kig8~BoRjqDҘLbSDnTqw iP早$ _R9eNs}u+齟˶8LG+Q&RӢ:+F [;`F[uIk1T/wXt~ ݻ8 zQP"w:'-E'Pr2\x)(eJ[knhygٽq`Ilq{11ik yTQN _4Ir;rI^ LSR*Z=URAH_8 j\r_~vN{h9H,ͯçʋu=Hgv,Ukcd?Ֆq=o3CW3U G2=(^HǀWFcL4Ub Nʌ[\{џ  {ǰ)P\1}$8 $f[' M-xwqVr]^Ja$N W1kaUVQ`yv-} NX0S6'~uMB="uB/Nߕc5vJN Ϯ~U+%m8Pfc{:qzT3x'7..#!B$W-(qEބi>s˛O?"9 oSJ;Fp?W anl_3 뽖}mo\YDofq+h~M&;8{ջV *1v ^?,r5VO3~xJ`k?- K`P1(XϫQ8Ddp\d8~dSvvUB!P۫iXo[@:XLWo yXt+jOڒc4ے׶S8H] 1lo @^ڷlԿ;/o#e]UZH-&u@ٛҁ87t\8- w7X2Wi^fJ)FE46̲o]r5F. l]|vȣH+=g;γP9>HS3 ڞxV.q ~tRG~`PP+x_͞ȳf^YsA5n7qpx%g=zV[lW$D/F&?7iCe^xbcmMm)[T% 2RF;FCWiY5́<#&]6Իvm3U/!]r7 5,6+AsDiWy0ɑ8vɅKpX*ؤ9a]OTR ls-}!?JokGﱹMs[JZʧu,tH隓L:iKw<9# cc}ؓ xsYeOOAlwER6Ҡ0{Zz{71Mmr/ ch:dMuFcrޟ/XT($?0 l>6h͙иKBYJ_,icS| j|c(a}ܿ2"]!ڈ QpT(PWޝ[Gg|5;؂;im!Xq"I. FE8JiUsy{!?JrQD0iB2[Yn*N8q=:4l8KbŌ4Ww.17UG6_hDm)$[XAIB}PP;7x{2%W:aMś׸H:v=I3VSc7ҵh~$`N?^ 9h'!SKe+\a?my0OO wtūw8=̂vyfA4zť1r Î,&޸&ϸ˚cئ)jUdXX36s{9ZnN "oJD咚 -:A yGoTWJ5- Hfy7Aӂ@_sN-A}l)LoZGhMGkTE&ض7w,_${|nD-б"TI=|JYqf"e7> stream xڴeT[5wwCEJbE;ݡXq}9od$;ҹ&WQg5@.L,|EugVF19Z 4q9H.Ve3<0 tߝSO"D 3]MM@Kk {8lmi;#JŘr&f wg[k9@I r7Z@Sd4%jʚ*L]A") !! j}Hkk:Px7]QRCTCWE=Xn@߶;3R{Oirqqcfvwwgtuva-ae pmW00rXÙIR9ߥ|Ozw!\ִW86V&*(M\&f.&.΀@s]=6M] ~gv>&wL\Mm3*v?6EQ%Y)Iu Fs`TOz |.+/}H%Aיִ'a Cmrw?F ks:2k:X;e%+݄6K t=̬6gNYv9,L윁> vx?"+7}߷ ?e,@ߙ-J?Avs"}a=?A&v"?r=*.fV_vYu?&Ϳ{}X a|W}/Y?1f skK' 6Ddy6NN7=3="'Y_,?ݧ?gl?lo 7`7^{a d0;x/h~tAl*8gu] [o̿(=Yއoрe<9Xlrrs3f\ylo@3ĥMRCpdT 5/i܏K)SmDY@ἯM4y >C߄:ԁ8v";&DZL%Gr93-?ZHmloW%-0s`;LEtvũvHѥsqG`;v!#kg mD.`!؇p+%)%;~'Gy$òry4NpQȧEhtQD垊Q]?);T,Y)TфWoP:pA<fB_ɰBwyyT쉑=zPw?S{w6ŜP#ݾD$Q~6z=vIs-C$" {]J^wOt*aNұ k9X!RKn>(l̕l MP|0IFx~ D_b"ْc©1ZTg :[{ ER#ڪJ r`SDgn~تo usc򣇡eb HÆktB,=D).=Қ,}~A9g".ϢW.Vҧ7'׸_np"[u&~/F'q5_Gq81r;#2 *~*⣠ {`ƩHc/wWK\Xf½Q4_NMVWKDvM$aj* A,8ΐy IOj:C#2P9~ 6P88+ ;Hy>A\/A}M1w);dA0%`d[jߎb ^^Y"lZ,Uq*MDCTh;YO?ʌmhBJd" ZIyQT ^{O^rn%׬(ڃɩAV\'}h0Rmp_QE?p4-ֽ 4;?YNH|n⿦+0;\&>U3)@)+_ "k9|9c@ [ޫg՗j$!Vj }uӈC]0IϚֶ6UI',d8iwt5)kͪ[\KJjP9ߎlJknxRصqόء^ STBW-Mm'ֺvGX,;{2XIƢsJB ]DS֌NŇy^SY^N e&ǢLhxD}:`2fvwBiABs)uc}!!EceY ʶyݩTr`GJr3`+'[Cا=`XҶEG^D}Awƭ[ۑ2nk}DLDz84O)qm0Dq1S铌va=N@9;|XMAbk$.e#ˠ9OI2ՕwM dsȄ] @wqd-d%n Ci~\5o|8mlR+YӖ+ SVa(6tV2[B{Y/^4O+W,BĂZ^*T[lKRyD_'{NW\A8$[ š2A~ }%ݥaxqxL! qqB*o}azm45mQ豪+i 'iH;M<(߾8CtQsᓻ2r[F.Ǡ{5==K?We(UURzj4x;{[r.1G4̸*SX٦Ni?̻ߨ:t^:?mJ/7(S,LcJC*0rKxT'$**`r!Y#^aO4#LvL A20MnRWMH'.r+WO 7mL8njx651lJt@0\[+xM9W>4gV= ?h%\T#fjE/RIE4?+eټ{#a $+qRkS&\WhuMˣ ~x:q(  iAaHs ܩǠxH\L^L{Wr9yiY49W6CrӖ{P)bRQRgJ=4bKpp;*dioz/;HCKȗq8ߓp}r!L] !wCP HŘمvv! Xy†S!1pw%|6گxY(hҡeᕊ:hNL/K<m?qt!ƴ,n#%vjKdReɮua ~hn%&Xk{5ͦwȑ`sUVT$,7jr=q V۶vn#L7FspamS ̶`?4lky#IQJ.Od&=+1zuie}**ao%̞ƿvt LC2!E b=rӅ^!ָ9M#w/։ ~M:G$]SP!ݒxe>-eڌgq*,I1DŽZ ` fZVa Sr' V3[sLlL^°ǪGG4m =ax~׫dAzzz_ oFll\wx_71 SoB셤FE>_*(AVECyW(6Y}W2>e]>$V= xKZ XF/V,v߸f V0/ByH &F(y=UQb ٵ¿y_"+f. >V G*iX:.g/5|_`Lئ8I?${d[02A&%X\:BigC{iq+Ї溑OȝN󜍣-Y!XBMza&>o*D+QNJwX8 t|:l!R5K30OAaHe#L٠KL0@ ph+'rH1 ?Qas;@T9nbuݺC7v&-[l?*vUIZ]"4#W 9($R]scͣ ?:zBbVuylvϺfjўdhfiKR^TV [,^F %Vqb\ֽI#-& āJ;QBawBdfC4 Kdx j΋4/EiWeU9}h{v{z?:Q"l_Rt $~=õ2 %׎8J ā+&3'[%զʵsP`H{)οU̍"%iȎ>rCco,f"/_sO8!I-_yα#u%`fͫQ#t)~C4J9%|P`:( TZL1w:Ys(|mx1_c>ӛ}Khkd{h&up# (HB!:6NPTʹY׆Rt7v7u=$MU((+Uߘbow*YBi{iLy '*HWWի7ÜrÄ~&Nv蓘3JӦE·ϠwWô՝ukIIuW^OKAo! Nt ęs)ʈkSS}OQXg쒤!(L4 .Z0Pkgo@$xdhH1 tQ^SVz^ߠb؟g4+uY$\֬H|E0E=}5>6Ԕ1#PgƢ8|-mJQخ۳FTH4W_bA:?+#'d?v^AyB_oDuߏhOtKQ5Vր"(9 7eNM h뚝­I,!^]3̠MqZKNPCFWy$#ٲSZDe֣>VJdN^ |G`1]Kg~I,,]B[%Bɏx$y5M $2Aʢ]ʉGECME{sCs {(7Th*juBbEK-mĂ 'HB8qHe͟I|>Kj8l'!R/:c~2FJ!H}UYPj`ckoAZ}3*ev)|_nrD[ڙ3q)u?ƑV;.nFen$kdB5E1ݮ|+mӧq끩udnmn(##9λ6܄z4]5I7Њ䟑l*Q0M`bE]4wH\1JRrwwC9yf}z>ړ5}|p}HP9nH3ʖg1yɜË+bmkw5 _#RgSսݸBL]w@Pm'6SUEFnŒ-PxV%g#+7`T}`! 1.#,.5b}Gܧtƾ,OwՁWL?[{.*l^jskv fDkb(8e՝(h,MG\)`1GNEe^Gu*PN"f@nbdX͗6U՚'Tjb9C͞t\j'EUȴ.]( *MWNt[eh2٢´Y= ^ e}k3U^Sڭ)}:Ym )ZƷk tBΦ!#67?"&qȘ&h̥BIyN*_krf qpK<.<}D_ut zRh(:؜ǙAߓ=%cq? XJ}#% M ^c_k3=\ sn/w[IqD]3vE&QsbT oiB8WM_/Ӭj`,4ܽLT_kT-ڨ!qqJ3\hw$, SJjk^|BD%dO1홗%ѡ[dJW6v2#,(nM $ASQ1DX?7)ϰ~)_14-&9JkŖoEC I E;qɧ!6!I)qa#5tO*U0\iPx=6U԰ZN9,0nLThC]7ZAa[ 0݆;&U/Ba7 ,3,LGOxt$~N.nZ&[o-ˉD $tq_z8$c8j]}&!UQxVwmyz[!z/gZNz͔qxUdf+pˆ 1vn( ݺΫ`Ux;rUL;U]iceSzXeUB'bM󷌄ΩtDI奍rƧ/xT4l i}q%suN6 T%8p en/ٹ' 490E}YHt\n>]xZ'rmRе@Zt5Q6j1SjmFG 6-AoܯdE‡fOL 7oOq_{X vYxSQ')H }l, K Bە4hL_\3`}ٔT\<`Oʎ5~xX|,Ls+@T"һ̒-;)ԃu?8w'/kkQZ2ңykVfIm=cZДo)!WP aQ1u)LC5Jūoؽi Iө+փx˕v3]ZO ( \U2~<%ĕk) &9Vw;z Kaz6^L(U/^)4G,dh:I(,S,Ȝ - ʪDoaZ9y9ZЯk.C933WL _Uv,.4-ыru5[V,|!0IMMLƍyO*}h>sAǀ)2 ,mWIٷu4l>ݢp͎arcϬ/~k4=?mЖpsefnHW-8vK'$fNnhf;HV=hW\h{afnP@O!/ : (Ud;?=$)tXS5 Pf.ٞ1t^EfJѣ w}K 9$;Rؔ雯'$Eaُw YԒҘSΩ0T+*HSkBʠ?yVqRE;Ho.$Ɖv%\{@q˓E JLǶ>geXũAQ)C'`o׉">޵ho_3T]*vA\$zd2zoƳ>m| < qwps^Fdzpf8^ғ£|n_:EvP#s2mK(4u(XrG/ÛoRU Abǚ|ҍ+?ϢYW4ib=-6o/-?7| @%>vk! TޯoR)vBwd} /!`JqCC8oj `$u=CG/ =1ad +K~2e"J$7⢖8k S oZ1?e*y %E 2zל&d"~>>VkS;E?j}sDNArf@uʊgkՅ ?([K߃@Pt^jY*rI֭# ,(q̜ >!x!~(,yd@,Ojɉ28+"ۉIUn|is'@ G{DS1w9Ԥ/Lׅ-4] ^~2 =!0?pqvЯqQ|X5ϰV66`4I}oIצն  xU5N!t M^˔йi)`vr /Z5_f@c.% ~or_|QX8P6kK|dr]fbې;VZ$!RH""L+Kp(wj]HD 9ߐJYC|HUJLiFCBϋQҗ1)OZIUB#v@v[D\f% 2 ɌIEZΆtE= 4{e-¿"=cҲ@8UWP۳肿ˠd>3)3&ŃltNL.IL}jK\xqď&CG( ;GlNAN.nAv8[- gvYgnxa.w O6*_EL" @i>7Vyd|Mv%AD|bW [@SF*l,mqXI;%y#0_읙V\<~#TSOv^A$QiQ &( $EpAuUX eKlGYscK.L,|k 2RH JϡuAֲ;vlһkXa@(6k| (ouy(6$*ε!XInѠFy qY o7‹(1J]>/JC3LO>:D퀒.NGxwcA\;ay` ԧ7!hdwɪ n]4@?eEZCIf]~NEGsEg05=6rc&>~N ^HB9̎[v8otO8s (WNv)H'ЃC8+s l1cK0.l|)0A%+ %z< y#4ݳ׫J NET~-6bn߄ ΐ1{5\ISY`;4rnǺH ¸VlWf'HQwUSARZkȷ;+ HL/ȓh CѮg삚>>4+oK鈚T ¹C8ˢ;L%ehtnmQOz@YMZv\b1-eTYc_g}ugY;Ecje+*>2ADqk_zGm&)fԇP/4~W?B>Z%2G0C ?yp 47eD OXNmTK'^=h< J8ynitdECT}N,`;J @Fg$0 E>uIe 5-AFYkxž$cڀ_*L?/s z,~_m?)`_DV,h*>7Xh"ԝ=2ظW˷0b* M3}5>Eφ6/XDkop:0GZLm\@;[5~mb/Ri*eکI-NN/kqV5_7qu&{l Éɇ|N;^q_kT{BBqo Ն6ѱ?gafi_yW 1LUvT#ˌX'D 4QҺaXOr[ңm$>uCSџ0€c#T-QbFD`eu杔%}]"OkbOofK5 D-E8Gs}+h1bvnȈkYdt~K+fT`k+W=.s9ҸPkgtF}n@EE-aˏ&GkFοXȯeO. Fy-qD@ X2*ط.9Gk:F[KeɐgF6ٝ[sYQ{'6W)eEȻv.]Vf;ߺ#kNgH_-+6hT=vuu}FڶNauCw[GbE1K몚ݔ5B8)'\1x U@2LTzӞrJzDk~Ӛ?.rwϗ 0 Ht31h԰> KjSP`7mqLJvV8B2^l}#\7272ǣ e w:K?Ea@U ِ&8*LY?IyzN+ ]ފzA`Jxe\^/&x^{;Ong=Ok k-E2R5 Q@ilpL}YlMo՛wʘ(nB,~M"+ l{ZkH+j)$˳('(_P%nХ 3}mRwgz3OxÁF"YX GhZHםu&JfŶSYdYW!3pI5lA!,a\|x`w-W8;|kx XḎN8m _a|rF O3ē?+kI@<~f*B}= ߐ #F{r ri@C͐gTxjjH!BWe=:W,@L_e](9IhVmu1>~DPw9|)򯄍"^g_@"$L6rڬ Dw#xA~wЩTIK "8#fѽl|D@);AxS;ogY;alBQty4_*OblQ,Է7'.llRr7`7cnr;#x+5BDKFS`o &;kTOB:R#R&CtO~9 8xKI#sֱaD7rܛ!$*|JNR uGeCӟU Ao TG =t8,YؐD^ok)@ 2ЌIu뷗[5ijz.B3sa1z쨿Bq qeVfXw(mHcfoul/=Y{Ps#(nƍ^v A ޽P".V4JΈVAHs69&fa@YW!bl%tt>>&TY/mf&,!>yq߉6>G-3_e:8<[i<|r /CvV cDH0g7l;)-TQ礟xWhԞY֮ E+kVƙWLS|*{N'#Q 4T{EG $غ x>C@܆ߘIG2Uγ]^4\JL!UdjHОvn{[^N`c)_Vۻ­]$ #4 Ae412Y|qDyunH4XMHA K7+$5n.@bPo6x0eM:,CGu`%~icCgĹ 74Nˎ/yR@[]gf^=bj%&]sF< c\:Aχ2SJ_v3b;]܊|Äҽ\'BH}ғ{G1KV {Y^uwQzS;}¤mD V80*F\VT*VBq ewO}TXfHloo w(/C'?H G?:X=g㨖}l;I዗$Pv&t/t55v}?)ߨDƲ]`)!3P ~ m"O~!1 ڐb3rv n:hOlUrxeƥkCW`l:A{FQ럺2r”b Rqs/( Mɩ ղ q7dYvrLaqu _lmDES9жEâΨ-R:|qc6׬uPqyi/)[bx9]'.S(1R20XiX \?rGh3R'Ί*nw>m;lAq 祫'>ijx}rJCwf`dnap7xLum{ó>DN2:&g!> AѴm^-  QC 'Dwjq]aű,2DAJnxqЈꥅn|>gAȔ;lcqHqvskI%$B 4*]>ɌC/\2B K ;^@W]Ve:J,܌b5?]ITTFѫ塪y,#q~:A纇G㒏(*0 Ѣu)ubٓ<Kg}Cd#MnɋuɑQow~V<6o}8A@FbkhǏ ܢb'b7&ȵpQd0w~y4 )7ꞹ}PæL7qu/(~؁1"Fy]Pʛc_vì0&U 5HHd1ŦG1'F+]$gT uc:[i8Q~`y)X x# iM^l:UFeR8i5D6) KѸt`wP8UJI1EۍE6yP"S. C ÒxK}HLQ 3Kp?>^7(F L FqZ|%@&%O ߮sc7ݑ^OuڀT(MpqNA^bIm8& #Ɇ&/AhhΞ@O͇C.SKk&teu;I5$Xga }ǡrP Lǔn=g8VMqK t!@uhJ 2N}M$HB2 31N$t\]t' = τlw8T"@jlBem>u#(xZ ?ĩ+3X9clN~,<ψoZHN %G.C'X,tA&Se8xv#aVBퟑ`wWjcPW"I޻3Z̻+b;sV3ev`ά-3,&Cz]>'v-bDCÉ ~_mhK fLOh$۠hG'ph Keןԭ[_[OP" vmD{^f>A0Jb[kn_md=D<US6.cPds<+eӚ=V8\t\I%`E/bFIwxr2`[84n2{{*u,9a3%YedSҌ肉 {X-хp^DJ9npxdW4tZ+*^SMwI DB3ܵ2rw4e`3c*Ϝa ~5e+ktZE XxKBfH?h -YǺ;? Tٸu\kޟ/pk?gi}/n6ny&WSd_gR=҄$PFXR#"K=yCAwl;?Ou Gqy;C=ҳ~ghj5s4b4 "Na^bWf9mS4$.iݳ3'뒭AN :lSk5UM23fDq#\CIV{NOQ1NHޭ=IT(UKܖOP>="a?s)i^P4/uZ/2 i)mrCIM K>!Pɶ`QJ~c!ӥn!^8_rA~*= xNʨHc9?uyQ!HRwb!%\5'pP5+DyʬxMV8[πE]R38׼)(u*0zV^Qj/a-HaA=Q3~>|Ba^!-;!mt+A_ Hu Mooe6ڣgy7 cfZ~Z]ZJE-a(o}JotX5"ޤ S^vU$5V}H>Rx4sP 0d5e9N> &^e_ U bCVSF{FbA@EzeV2#YnTw*<6 ͦsVH/I85D. Tzm}#SWF)xA $Őb%Z{?}=`k\04XxcB d?2KԱ:MSURDT}F̶a%!D=LkC#J8HUal͔Gedau;1VCR_Zo=av6tRwH|s j֍n›pa.͏v \.]douDr.&6 ]5yb# WwF '%ZaΒT \ppt)ݚl<,-cB8G尊0}$*KMzoLPցV#SW.+9}5`B:H6ašo!54X/@ŷQ{"AP2?a e۟wUιxwduZpmv5{qz?#b$b6~tY"2?cO1H,f~UOewVż 9zݓ(jM]77HSuQ=5*C=ً4%  8BJ_LFÍRs$дtĮ?~WݗWR>};'y#%Cq4 Geے dZ> stream xڴeXݶ;ŊXZ,8 ]S;os>ɓcXs'$J`C@rL"`+c 9 3pX@6j6@f?ށ )`W;sS3{ Vzf0d ,1@Av~T`hf`eԀ_*IEu%Ujª66`".IVP5j?Հ C)@A{tyq5a5-%qfƿk0v7wfjbٙށlg`c?53s{3Z#hp0șAI9G;տ@jcf`O `o1vv{mE+ӵr4p39ڻl {s{UḼ3s?ܻ@\[OXL`a0Sd, ~gmw|bsr۹2-A`g61 :(-_`@h 1mV!xۀm&V@Os psz[H̜cs#wKLL_RNc0` 4AbT;ˁS$ T1 36r%KdK`iw L[(Yk1{a9X.G#K >>lbʪ_iS0D S ;],ww9] vxO8:xLvH h/7h?&oL6ݿF1Ys]12?[l 47v0y;sw1Ϲl;=; XVnj[ݿ4BZX$5xM’s3|YJj" 6Qx|A_5WL+ mx{`PK_) >*bIki!ru>FLa\%ꖶ:17~tYD܎81*ܠGxfV?7gTΦ]6)WM+u1F>[ ^zT7F4paYjFU(\|, ΰA xJۭ\}^D<*)ѮH|/l3AkU3 k> LX 3_ܭ֬A=w* KeƐĐ ]r#}<{^n_1IS+8X$ DG22J/Y>Ԃw4R[7D0'\:Xb pcz2ejsVNL${ʕh1[k8/G$nuF<|t Hs@pȧ jK!O*fQNC_s>|Y,Ky"  V2mm\H9EBYV麫0>BLjwC|oLTF˭ߎ&{_ ɴO=D-VI`\ddȠj#X`i'?WSujD"_KG:ֽa}u_jO,4gX#:53 EO6ӘђS p'NAm9& [j~Ôi >a͵JaȂ4%̼˩(6E`p@b%juj7LZvm-Bt8u$)BWF?jPx&N~t#zmR94X/Qxd䁋nU3XV=}o%}Lz@7ڤR;ұmV~vVUY]@4O!q~@;"h]'NVKXg1K]:UQa+sF?c|ˉrhVmğBpiԯ;Ԅ ?C%" ƖiW5iFtheOe,ʤ2}4wՠ5Z)76,wc>i}},8&:@zmDZCKMo ^ԣF2T/7K(M ucSC/-"J-^(?-BAJN8z̅0ksxN_jwLz̹dY tFvCU(hw]cpT534gJBI-qD+,:l8ȾV3Ԍ,y)5}{BBkE[=kv~%Bz zٳNylc&DDvRTi*@z +"[ԍ3G<L'2M 1ߧhu4Wm1h=+<_\˃%uat KanԊƶxa#O {y3lb&tWZORܬXa3o ̈x-.K#L-U/s|TZ R5^4`܈&!w250*ӂdBj!q3ce QBgfݵOE,'xjvđ<X&.Z~`WӦ]9H[ђdΙz ENxèh]/Oϙ ao{D~izsآ^4WsnlerTmj m9~&2<)/j>T,TfHNdvfՐK]DK5x ﷈Jym_*+Q VmxLg\(CöO?R cbw5W'@k(l1qi y%ĠwTSLj !BAKdϩw/bcAq}? wEu11 פiǁPέ7vTרJDHilXdm&Њ/X-5j'@ Ś&uq} IFL "M; &G"-} 8P}v& &XYs\ ut*P[\;=In;{o\ߍ+G6xP>C(^q/pSbmo1,,*\${ͽ #:_6+ac~=\ALd(8e%,gv)ڊ+rำxC) qvjẗ_9Kc-c8TVPih1;/r2 h#q'=򳏨Z>Ee_U! aLQAp4s̢O[ꭿ-nM'jKcTj׿L֬aÓ,ysF 9J?zGLXG_>6R(~;Bc]$N[Q˄vpx(k;mZ){+kX贌L |Ɠ~H9Ӌ~+\= ahӰUBrA+M5C߂~"҄1s륻<3cTrua}~TGH\suyuZʦqa([Gy#Peyp< |L'R,]V79޷w1R.v_uqY3=Iwʻl nk: 4{]YqoC6бUZ;8T=msf׬-2=['3#>LDy4|*>qێ$Ţх+Q~R+ɞdUP[g5B{ xf'MXd%%䅒ƃ$w|@bG#e KOz2*nkSa=1f9Kf8g$9ߵ~(( `=ϣ93ft#R()?U(rxvfmDOT&Ha(r},šK'PM[ϧuc"mjV.zZ*!Nj b N@2˨!4dEV2*yESPm- (ՏJ2'zzYmNDu dU z6{<ę}3T:Ī)0Upoi:"Tk r{]ORz%Lh3UZTk|X6ȑpI.3 pOfɦoty⭢V|&>`M-q C9DĤhWUJiD:`kߧ_ g3nQL+4dԔY*"Q9=7 /JlgI1Ψ^wE1E%KɊֱ'L3].y9&cD$XJOe?{1:ZA J*.)^R#64OEX Cp,ב"h)=s3 H<YW_jzH/^{*Y{hpNJ!/  Vx~d&m%[l@=(~a" *d#\A鏙+7N}dm(v_Kԅ:b\/%eyO~ْZs8$X|\KzgqWD9rU_B%~02CgŐGŷ&t~jɏC?APuϋu2/JJVᬃ .XЊN&i%.5E2jm&\ <aoFʱ(W`uVN"յjt>kR—ahLbVKF# :oQ/3)-{25a#Dr6 ?2XpÓl,}&2]1DD#l8;ӏ{-!TxooLj#|+ (Wd5p}]+BZd݀DFr\CYLt[X?Zh^.@q?ECgxIѦ0חw|sOq'(58N#T?]* l%͂IMPjlq8,Q"v۾ tYwDfh =[-B6%\6v췅iH/!dDz@ $p hk,2\ %pVՏ(yf>Pz!{lQ0& Έ<+ȷNGi(($ .2s&ya3.D-@vc Yt(oR%XܛxW#_옋K#o6#?x_E')ϕ-G*Wg?[p [I{*a?ҜVݻwY? 8)[Eb41 d8j@wY!-[bwb=8Sq%:vH焦X}O)14IG:2:KtbK*7I2^l1M_(reռJ4!N/I9j?9j(_4zw IQ ;ed NE6M,vSW$ S28}Ҿ:eɼM^skCǽELNBqВyI%*]W[-3/Nf6[ VG'[)ҥ|Jpt!:`{>"_ܜwӖ#^Eg(;Ʋ ,P)F':duph%JT7m'8֞Cꁔ>ݎ1kZA1,"ɛq[?eex9N[t?rwW!@X T9 9?e=Mބ ZɈC:C$1hM K r*I SP7r+i)xM xGыPL$ ۻ`hEBC9M [8 *eD56͓bUq }h}ˡ޻}P"QWv&pڰ["w(GqRz3inJ'w2I #21kD1 Mnis,q҈v}z.0S8KakH,{4#c¡v)opMJΝ/qށ+3u3ZI9G08trumK`?2~GjW-^(ɧZia ;X-&(0dhL5[WKWB M0*Дx'37Ņdf,<ԚaWJOts* ^OߠNCԾPc9 !섿V#gIQl}+9P$ecMf{IgQXB84<-onFuNsLR]IDDXwQw#/cؾ5Ю2xs4; XPo\ C1[IX(H0J4L+?7k:G0C,L3L'6 0F ݐh2:/'ł7JXnNc׹@ BY"Q/gr~s9bЍt{!O{^23%*_| _N }9,>i_4actTFӸsyY!hva \{o%@vO~nc453 .eoݔF< A%}K=zm#/+<˪/`IF֖$A%OUv㲽R fX;C%:WM. =  idMt.'L„CE߮&Ebt1dY[sqF`>N$TKHLK,tB7tqyu95y'40dgS3*pv !`tPҨ(pM׾z[0y}S t#oۈܘEC2&J  ʬ4?puEgnڵM3=ew V\ k_mJ,ˍ9u1hm ާ&TSe8o4t{e/._1+VH~F r%IdF͵")ޝ3Zٰ,)ʂ(ctm3|{^`-RBV~ ٜBJiyɗ*T}.fH^̱3YU?AПVlYܖ)߬.췉_IO 5vbz,ԌN\W+:8Ӑ~yq@(0q12(gr%?¤Z|̓ jyެo8 ") c}7$S+EA'P`kwN] i^6R.kZ/P t!J[ZV6!!eH2q2 ྍ7^Gֹ3*\MΦT˲4(id`XF0y1 M@ "~/謍;C9]XV3]y*D间Ny g .2h>p !X@ܙ']ߵ"o:ŋa$UWj^ݘ9,G5zvH06j I`MAb[,+E^IoO=NW1Jnϖw%dA2SLYgd[#ݢ_b=uY_:㧯Nz5pV4˖9]<;|~OI=Bl?9)ԈaC>\hG20_k_eCIqAhU;o*BI V?z.(W D>%=l6.f@\ ɂ kwPܤ4$۞iJ9.pT_e0՜3*oS$1)ϩ˽8f~%3Gn&jܯy`AOZږ?FyŅt% c*d1heHpa.xfҳJ$]w DBBiLH߷ *˲4b+rb%VSutpyFcWDt"K<:C0%W qjqZc)svM&[.ba7b&0 L(1~i0cc@*;W/~!A? ̫vd?#v/I+)Š&PWd \DE;f}prJ{H+W-o>5W38 )pϕKF+vƂ iZ%ײ4|Xv&UAd1(Fhэ`6=kN1@-L/fښl;?w{^uW>ܘuOݟ}\vG8e%u({ܦta<. kB 7K;2&ߐQ7K5xYOM YWэ"l}D xۚQ?ac%b/ܤ<hjzk>?!87UM~~[ b#8]V^]ˍXWԠnDm0Op+5('hL{<>B5%J"6 &y9@,jYw1/HuZrq-o#a Eegh<n17+T%/`^ܻ' ;Yp(T'^ ^h2Dq/#G>҄cC$|9<? -AHUAܡxEdhon<M"ZV[s=p(9'+!\}Tny\Sٲ)'9,M{@sK.QCX2L!y$ DXoMeCG΢b~iY B[硻>'E3; gHƿtb'oa/-22I\]PN5yk&h)z}/{ mZԸQlY&(jZ# 0Hh."}$-˞HlEi>iLvVF - juyy⚈I>^SX16jL>=Cp7]0۴m~.,;6݊>ܨ.cV @Z mb&[DGcNv/ǭ5,ICy^Y8Zua{2Kiđ%aBc1u)/v>M&=N[*?Yo),aӼi֊9?`%K"#=}I7[ SOuر8[.j1 Eiԇ;G?ݴ?ϛeZH f5}} la IvmMN췄SaQ3*ht+Rm1F"ʜ=inChFzK aI{YieT3i<=JY [8NsaMQ0#D(؋=;}? s4ƚ?\iὝ0K!p.LA}M Yr8.W"f~q U/ Z~ Ozf?3]:Ј[jN<-K?9TУ`mra]+įdy#j׷B-{1{s?v:gZ`ٟG0]?7]c: )4yyNTᲬZsn6?_wO|] si('Jv R`a#R6ćܼmn%% 0JـV#KF/=fYe+_09\IZdUpQ6Ļ\=L\ -̋ "2Oya.)$3|JfalLFR guX1K)#U"zRZJT%F0}#t1'z951fmzmVmQ0zhnA@:%$%FC$FF钔8xúZ{o55Ԍ]iHKb}Tî5K\A۰W]f_ 8G:*:;.dHmA 04"%%,&tP&uICūl34+ʧp rx4x@x(44]$ O"GS[|[DWtPbp9;M4[x&HBER"՜岶 "z4Wq (Z Hsړzn>iB&9X=z /Ɠ3˼\r.I$0ZYwGy:OrI=V=Ll prDl믩9|]Y٧AG~EĿ~׀=3*iGh)ϸsg SҤTO ryBmLՄOGނa1URXTŭ+F 1p?0Q>RYHROtt^s=zz򡵚pfj2. 3z^S;[5p-ݕ̾Xh"?lCo0z0?vIbm?0m m)vNK}{. Hr-` ^a)n9 WTmcyy ߦ3=Oѷx8- gتO]IGwڌ嬆 !i"R٨/k HM耛 dr|;*LbGfv[Ըkg{R;^tuu0޹9$`6A>pS:|aF.)Nԑ Zxvs9թTWa<,BC1qDBnw9iD/%*z#~KS#݉¸=hmQ wi_ϤY7 VM1i(y ԈM?J"S[3*-&tB{sy{9݆/:/[#poK¿N1=] ;M4i#nϽVf6yH;g5qIKP. 'C'UBjD,ҙk۬*ut̞#2J3V_"x&l&gBQ޷;GG=wp~=,*b B^{RZlx;cz򱳘Yɑ{َ:1rLToƧh?TmZlftJK%\[` 0[k}#}۴#EXG[Amۆ F)1oSNG&G+xc QخH|lV, ;z,Gr/˱=(pj/c E>eI`/>v?S]) ߛFWUkuEۺL\QrG؛ؠQ"t {gMjEPEsM#c;Ýްgױ@Nh_ NCR>RvdҜʺto#Dު%0y7˷?V+JXg(ͽ`Ћc+Sr投 WR YE2N1 5.{_?P|;}H$i.KG~qYج`\74'Ex)!Zjki| Pu׸]B>E9 DgeCd⧰[G4УO:Q#326c/Fz0!(5\̟Bk"颼ϴDM K\x]R?YߒŦ۶&yqmL wjw+C}xt:M:)M6r;=hTtp"ϟ🥢m١Ί.7[bAZ1Rw}~`zK?2?Qz|uju6daا!A< _ K^bbx0 5B*:Vϐ"lY ڊ\*LUT2_GeܸD u~\kz|V¡nfSΚ_9@AO*#AP0r?D]mqTr>),n'z)B0M|tph1'9:[ kX+JwfXF={ѻfNeI)F7%p֗[egi5Lْ6zݝm ^P䈉n${uPLe{R!9]kjGƝW7N~H'XCxB60&mTapfՕPg$$PM ڬQTN`^{zΈb'|lZvw g/|J",(Qd6 ΈN375 Zqݔ>2ΓDt1 ҕjP}()s7;D&D_ZOLԄ (u#d=x4as;cR0JX/ڎjb? yrMoQ@CfTYΧh++pe E\W*+_6rp, nz{1nb2-=.;ǜO80%}h H+2uq~=Ԉ+B (f&lo f~6H'º{)>xsC5BMCƢ`Aڝ2\aΤA:B{*BF|Uh]TݭȒP E*(!7N0s2P0pxxCY2&]&=}Ѭפ3k֙/1F46+0 Pq 1g6H/Vz ŧVQNu= X!;_3< [pxp9›TvҤd-+* OԞ>TOzQ&kVq4sˆ$;ZY 8~4n<]4;#tF!]3w2! AOtcWOLm[zDZ&W?RtAv"!?"ڡ7RJH# KOP7#o3駘X-PVI8E{I^3&A26 *pS.P%Xȼne/teh* %0|;RP"_Ӯs!$.]zAssV@?KC۬t35}XzZD*̛ J&t'ˁ8௼;yO(֩i/*znZUaHT~@qq Rl|G)mGH.ѐ=49ZH'LܚKzw9)cȂљ,,+gTի!Ӱ: QM7ۂ! zp1.uk5/AnW76wca .h!$oXPoTX##h_n'sϓ\uYJF/呔;0-)b.̼IԔ 4mr89K;lfmb\?YWLdu"oI uXu7%qx1[ 45{ jFWpITwsVB]i")$4E^j\.%Z$T_GCoM6}>EOZKJiDOƢHNyiVP3@Q(<'-c!T bo_5#~V  ^wFŢ:iIVGOOсrIt~λb\&ɟJT9~S{ؐ[+lEp.q:^PŖ=߳#(s:]&A(̯H /.}nࢭ&v 0d o5N #e'c%M߭KMf)]jtt䭡dR;)}Ic@n>9jx +p(՘H9&>O›jwX))Q.Qz`ƛ!+(?=8Ge~9^|&>*qn)ZW4mh_O> 2EE.pl}D%7QܼItvU{-je*7a맔}[uVa%4 冫9Ca;%ݹݟ"s@0Zp}*7M?OE:R@~g }P=7b G鬘?8xO"CŨ# ~rF::oyp][3Wh ]jMTUaU`A0O̊hϢ`vdy)hibxob%yVr{ 2Tb4+{NGr8+!F{ ]moγvE#ٔxLz1<ːE[~o uYg|w.G<^% jr.69)JjHil|Ic{@3-)UR?YZ] endstream endobj 85 0 obj << /Length1 1850 /Length2 19051 /Length3 0 /Length 20226 /Filter /FlateDecode >> stream xڴeTݖ5 %h hC-NpkЗܧO`@=\**jL&`#։2̜vfVVND**ql+txN|Ti-i0r(v 6-g 5ѽ,̝`b[o3@hlvumMr̊%@ ֦́)@PTUH*k|Vc~/lgv/,jҌ Q%uIH :#@I{tEIuQuϒl,`-ljɎՕщ`lg>us G+ C;N{& c#o_Nw*ߓN5pOs? ?+lN [{`dB/ r6 ] 3]kOoqm uptrWE3Ǧ($+%Τ.<[&E;;NnND'*.E^;;;]&`wԎ铰x 򟲶zM-lMLnlǢaka wmf '+dmVIL֎ o S #prpy{o]!L,e>*T5e~G߮?cJ>&`[kw E .LrVڀh XXV `䳅?,|5D1i$wɾ_;o-hle rtpsp߉ -#/%z'Jlbak`"`xJ,̶`7$x,`w,lYWe[8,Jw~gcg_nv  j^7*@GǼu2w;p'}o /^+  (,tXnOy2qS x玍gEr#./,SB|$ aWk,gLuI>eRd|m_7Z&oLTD~}}Q%EGs452ʻrK8g2H|'ЯRu`]ؚ1ܖ: :!`FDg CpFzt˓dpqQi+Wrʅe5zyq0-~p6\FseJ@wbC A:Y0JU_l3z\GҔ |7fxþ Z&$46fBG8b ΥK1ad7/ٖЎ:{3cdeLb؃Y]՗bQ=3Y Dj;ytXM xc!_d\E]GiL:.gYN;yV ͛eu:}3\Á↛O v7/\"N]Sage0BK- -уqغfl6@ȫ v={ۉ{GC`^ 9%9cgBK!hchK_wЪhJT[ټǒm<֡|{]9LiZm/~wqPr"t` SVw3Vydlj5oë!Ǐj@ڕFͲzQ%ߒ[m`5(c5,%)jwH8W0&Ntr&P~3tg=@=S>O ZGN\rv5R^tTR[-%:7AdƾmD_qV6eT\^]=ٲ;QyJ9<1 ,>s쭎Gu!b♸"Y#oFKׄLڲrF-=ټz+/  [IoI( NGEZTUZᤕ zR`RGlE<$~ bY@dU/Xd#:)VE<:@W\bi0D';txV꛻N1-ccHj KtdǶTyB=@-WA%Ij9E*<>-ӓ!Oq١/B0)Q_0B DgUB~;W\U$8cw9tx\58>Cb{H"c6^[z(B$0;'QQ Tu*8 5U{ %.qi0b`{4莪1FuTT9<\zj^BT!XZieOt?΂^_xuD纼L>?0k{f4w;H̍N7%+v211dbg㞐q{Q dPIs:K"eg> ,x n&I8~z-xntC0#z&jnF2Bsv }'' 1J>%cF B=Ǥ?p(0n%=`Ϊ@.D"d2%3 9)lY)kYrE96BI.T>֪jUԚ%U_q)nVqQ(TE$g6Η`HſԿ=jQ$p1Ma2Z~("rp~C9[,R]t%TyeBÓ;TA4uBPM\SFPlP42h#_r#_V뢘U.`U:6 g$NYY{08^~L LJ:d0%he51ā+46Z3 ȏy^X' Y1V(hn9d: 얊DTYhG }.ۙ09Ae]LETsDK=Ki$u%8M!_&LV"O^.P=7hvmbpS99'%>RtSx\ƙqo222z)o P7~A Rnc;R._x6>)۝aʁfny 0 d 5IDP> ;p49RoCow!-}g,FÆV^R>b??Iuo7Y/l-6t?3*}|v3˜쭯1"}@hfT!3kə5mb? ;NE(7_Pct~˝ܕiGP'9ʾi2OdҐ&s-O^vXXL:e83 eX z% ڏPm0o&\^wSJBG!·ieNB_-~T>ӯ4^0PKhAʚ=L9 G{k `< v1+E7#5ۣ^0GT| Γ0ܮmo{uRQ +ʑNNQ&&W_oc ߳yfI& n"I:i3*ɏ0w xb eQOZG1BˋeG"QH g*Ƹ i }9ffyK]Ϡ5K~ײb67ɵ`~9'ur_9C0'WWH/dW}pQQ_W>%vs)]+F_)[,ׅũgO%9zH2ܫ[O$iAn87 :ͺ:=(l<;䨹:BYXE}B$Qn'}+dgiTT+4Wa-){ҺDOQQkWΎVq%i4Ĩk:?z@0 rs1fsT9Ucě#M tusZ 'ʆRF0k[_0vqfog H}No.2vԁY/_xUĊ oS%|iL/M) d?| Ob#߰(SwBNIV[.XyaI3B>=$LWquȝ;*ъ(WmQٍ+ZjgK^V@1d8u%+aiר̐yG0Ce fGeĄqi|S%f֣KM?f׺ -pzgŊJX4ˬhщ*Tjz)GeƾgN? Gf`S"hKRͽJ̰x1)U1aW Kc]F1ǣ}uL -@Sm z]?Բg7fVq.P3;֚M#"G@!{~Bʈ% d.̅u2]U{빥l~09Rn[u]i_$j9l|'FȈt6#::FV(:)o֮؛1:Hꦜd]`M,T+BtՑrG1Cw('5&CP~I7@` AULTKoʃ%6>NM] JGI!*Zь7>\I2FJ ߬jO4(]WƯDվ ]Q@RaE wa@۳TCE5_u2*,1ݨU p1j1ДP9dٮбb!TY =P$)a8*˔U/I6*Y<·v&fvψ䯆kXa䷥ D)̫^VVDgl3 d`މmE{#-}Dq?)^2_UN=@ZVc>eB{(cA2wk %ѓ*hV #I.*l?UV%^|eƅx #d9<:]d<,D`x\ V|S?R7Gcgo\prP)TuG4 Uh"Gx?a!Jl$(Lgw&mE0헁( J<9!Is,E21G T~@pbҙ}x*<]{\\z;^jF/z&>uO߼8 ZL{}ssB}#G ꩛ sȳcolTYӞe ,]vhe^Ҥuqov.PS>Ez*g# 7B4S9}x \.<gKl}tCP*֤rDW0cdڔAK`TY tBNB?^J6>mb>R7PB+'_Bg"MnJ[eKo yЅuBCN=.9(CH%~ \Ɂ5M f9Ez;6̬lL\ zn @ ZhƽFOvĨ}-IE;9{U0^J[l/@CQX*< Wj'w|-NQEkv@>㣛գ%gW!$ c.0s1јP^?p$(+(I ӇtVn+=d#B˺t}bj9D锱JB|EyBtRKuW@wQcRae` &ޓb}&K\ӞD` j,_>1 ,'JIApo'WlX9tc| ڜN$[\{yȦbԝ=WmU~F7aW/Dc9o?:)Fqղ۴=)f-w4W+?&gj b$9r\F5 bH8D"y3bJGaPsY)s[ pƿbhܧi&+w۰ж~ȇdm9%89Fw9.J|L sVcc`bzOC&QX% Z0Ht&Eb̿^Bjǣ/kp˪NbVYB}x~͔hf[M=@4p~z I)4r(Ec/遑J"!fDJ5#;Be#.Q fYfҺ"ZoFe:>S`VЪ'H=sf?;-dtš+uy9[c(˜rai*)愎H! 61sfZN8k?91DX=7DmoL YHY`kR$6ͺ|[qrQ>U/<3K>ҿT[=a2dİZls~\QX$Rg1t\A++5r}"}D>SGfzpD *%hC՟wIz'p:X@Z׹08ӏhO۲\C;d3= T  _= q%68+;Ԉvy1jb9~j qCaR?f,qv!=r6yߖl ke/bG&Aʘߨ,)sⰶI}PQbrBڜKȤHq@+mZ 8iUch28oQAA ImFEgt&D1+%^O_8=暤-Wjݎp(2')scTzT kq` iPxS:{ȋlP*}]!\n>G'Pʎg%{1j[+K-=lZJ\I/Vzk q#F9Q\ @Q] x!oI.{O_H.Q W;~M)P`#ߦ.bc+d?sxKD6x:I _I2)3C US?,–V )OS6g\3E>Ǜl(7p,dOI}KB-sH:Z+3DX.Oc֖ &گliIMbW!m68K2ăܢ* +/NhLf?-tJA>UXWKle]06 88e U4sa{JQx|}:vP069wv3Y "x:?Mc6Fj9aج~ CL?D^Lw{M̌㣌XtM*ppFA%^(1䣲%&iX*XE5ph?&3\pbv]뒈0\teBϵp 6"DžK6L|PG'\A^Zc-aJ%`P۳C~?x8MHwo}% )СX#cvXBя)dmm3|=F+Y ߟ+;AtDG`p"-&r솔[azی;kNLpoam~ZoM~| &8փ鉁D2/Bu;EgB<&ć}f/̈́M}t=gid0EaԯV`X2*>so%o0# _] D!@$|ocFۇa!u:/o@T0 qA(PQ7~lrV3`ݦ6C7NT"&I,,t/'ǟXj#8kƺ*-< ?(ڶ_s0-MK<"b{N̡ CG/K˿ ՕR:vn7SUr.Yl"<=(gJ7޶«MKH;:ՀJ]ei{:D ~W"0Vm+#lAM#?yXu:j`&*I(N*)q7\IB@Q,ywT^ao iQI-Q?AZ4ayrtA"<_U%MaF~k⭅sI!D5F-GG=gxcI9^gT e&F:f|f)3*@$lгfvA(pQdFRʲ²L֒x}$QWہ`7WUYuV!sO1U)#KN:C kV߯o TNʆ{~aG|&>*ʌV ׂ~G FwbTgŞEr`m0* = w]ѻ?dc\Q/,,ԥVc\_dl,=f럆}I3Z<x9}갩:4ڤQ,)7}Q]BoaYdq̒'Q31l>3Ɖa~5ݔt$XMgiH&qwxU] q$ԏ8L0 RGx6~y1t*{jPWmJ~|紋 .ޯEPHwLHGTp_!RW4m iivBvEj )~2-yo'^ydADe҇~ڙLCw6sJ21'2nL@m}`f+۞$dLyswUr(X0.U[9k^"WTtiѶ]8n<_:9E0LCxE,P`\E}uz8IuYMu"sn}梦}yĹx΢:vwL1ӳ/O#XOXRt< (_4#'˨yB@K0ua%Flo UPՙWASy ƗiaSm?Q0 sm\J?Cx,p3l Wj:Z,lϤ/ =3,ã(iG@yU(B_#V;Pt$ULs} SI[W*s,![t=bδ7/y懒Ӽ}s>j6,G<&כ{HE f Wun8lOvgNZɵٽDg@Vd6m+R]hUtU2ٔT XW؈( GjK06<-Y6m !(sU5{]gPWPai1f!CɛPV"kV+M8DnPi{ 7ᵝeo8ª+vFYhc5MeT[7 %(Ѻp r$5SԝJ{$\n[=^T bm£1np,"۔χ|<6qmNBe@iL[B;"FFƙ~Ik@)l"־p'Nom?*ŃR㜻ؓxY؆4 {XVC J :b;@߻BFOea <-wdau~zy%tQ>D94Sߪ}:1FcmXYX`s >(HGFBFm)A~*S$.OUKegjYCe(Ƣޖ4p%uHGNIUҤ}y;œ/Tm0զIsi 5߽˗nj׌yM xa!$e P!E&w[rO y1l4Fr"rX/^_>eXz\J@3\L% k,]0.-G8ƹ{D'cюHBh/iǼ*/Alww\K#"Hb,2i-9 #C1NsI?KQe >R)I>QQu8t] @TҒD8(۩Tkf:8Nd.(]^.3D H=h}> v&Wvq1N}*6 tOq#fI:zPBAA図 lxy5- +Z@PM*CALe`7͚aZp_ZjS`i? %RnPKZ=jHX i)㱗q#3r`pr,n6E8}J'u1f >c ݲΙYW my ]>e]Ll}%rLbbH_~0~,9fK~DEߟr}NF2z߆Y=ysL8l3@\sZMo+ "P -DϹR ;e5?NH!=jPuz!;V?WUB `(t?ztz;bG޷`;fȶ!g< y)AG# yځ#k׶iŲ/XϺUͩ"gABS\a:χӑj߄6)ca '` y+;\(Ͼ(ۂ 9+]u,L|5Sl1F(T=~GgMStN\ RH~+a2?|PNb]H^faď?3{&HډUd1x*4U 3̩@gHL`\zm \ۏY(s%+cFO嘀0=]IӌfS!o* 1Xu+?࿕Dwa`uf#*nQٲ+Ma1̸Sj|gY҈#p+ vɜ=-o mi 72>w'LΌp+e\=&ͅxtD;9\w{d\Meec&0ZRm.췻DذbFpzzМՎ*^z* Wd˳LR5VqPې=pp5VՋ(5|﷓'dqZ_˯0`h^-xgK;D!PPĵ@V4~Q:"uDfZw]it6ڊ1G|%HRa .nt$barXɸ@>rC|XLoъ|=d3Wށoz2K(!S\y94lګ"w=W&?vюw!1βߦCxwd{ZPcG'ph Ke.>*Q@pa@mƜׁǑ\̷CK̲'xy4N=#3/~(,eXfOIV eKSu(P 17dG/r-)2U`ԿǗSq^q9CTR>OɒL3RT+'M `r-/V_B9rM7{x(j! l%~#`~z~%L3W'j]6˾B]U3 %E~еqb%]k])*tÏ4%X^(U|8323uB&G}L܌uoGuJy'U( ^BR W+3/3eO,yPom1VeClbПϞ2 jIa Y,8;O&v7.5i,+xy./nQCqZ-86;ysFhfY(UK[@WX)͋ኲ:UƤqsVm<FCǓKB`!Y ]L' /Rz&F։%핌26z3HO ^thFvU#OͷRWu;Ո_z=<F+{%`Wx3eci/t.M/[MqjM)C'{nYxJ# /*s$IMP6 Y [$d ppW92wfM``c ^m^@?{/+G#ƈ3* ̅ݩ1/9AMG+u XbѩكO y QXH`S.TmWdY"{{ ɸv?AO7JW:8]FJ|u-3N-޽r= 9 %pkO?>oYECϘ-#{V ĬCD1/"JbJ,G]pW$~ʁΌ. LB2F?XN&xT8mIc7!G{EzsEREq|OgDm\f]7?֋$Q2햐dIs;1"i"& +~ՂS ';6a˔ QC0g̠zCih=\MNnd}ZT`< _ojd~'|ig8kyb{2,. umK?hcO蘠eit`RUg̹k ' WU"JdqY-oT[*?ڠ҇c+`Ҁ0:o&TP_ z0}c*U;,v9ܐAieiaIx)k2>G'=0qxG}-0dM]gld~l8f!!5Ç#7PIʉPQ endstream endobj 86 0 obj << /Length1 2670 /Length2 26364 /Length3 0 /Length 27902 /Filter /FlateDecode >> stream xڴuX %Ctwww7Cݭ4HHKHt7Hwsag$UVc1%A ,̼yAhfg `edffGsZM\.W++8̃@ :Ns@jdИA. &.`7H N9z9[[ZlQF-``eT`( ":,L`]nT`f? h\]y<<<-\\AΖvSvxmWgarZÙ.I9Rv ݿ.@2q'W^YY`ob t0q0"9;o(2};?17￴e\]\]Uf{Ϭ)(HJ3ȃρAVǁD `ee0T\ dof[>qkN g/k[la`n[ws7G& k'7Ml@W3zY1nϬ66Eq9,L\~@ ; `nm sOu _f0ohyLiϨ9 `@`RǁzI)iG 3;(Mg"i 4Wv5Ge\Mc/`i?&OxdǎS >4:]\\` .XdLJRRr;/DI8̭,gg/frp|XlgJL Wp `rF&ߦ!. `xLA\l&?\E0A  `RXL`R5 pM pw 6pw{G[LDp +p8@vAOG{?X7 L LOo7p埊`[wYy9Z۬ Ŷ 1'xv x͠?d _n&㿶;`5`q"82Nn aO0c<8$0?/7XR?sEbr[ Apk\`U`! t>_3{Vsu Q0quc_,`;߿W?_٢ Ovx\?~jw OU =fs 3Pr0㣺aOfE0lԚQO-4 ͹Zy*GPfXK"tt)e|؍Av =8rcK$R'M `CV_( )+:V?I"_G쎓6 R+:ïvzԾa7UѩSTNмǯtog'} _&$F9<^L_@Tt:9o!!twذnLOdS+@Ȃʢ(ojԝWVes"ɤS#GuSKÏ`7vL{ v}vɟ-كT@u FK+GNTE=ZwoyxOMPAeR-BԦWKш9<7&2}`\y;7SeP8+D!5@%6L0-LMwϝ[cb>$CcskMr4)'XkB䡂V:S诺/khlTЛq܎vbt @fb"CGG-F&?Ykm+|}A7-grJ5%#_Bl$-|UQKZ:7e&Nɹ޶qg;Toz'C]5`fL9ӦH^|GŰƖ*[Fv /|#F.Wf ]nv#4+5QR'Q|eLF"WGU#Wl]B㶰EJd8B]ObGC'j=l{?fl3 5T/^^'!ih˽Bu{h}r ԰.ΕSTYdcye30xut PB TSܞ>]{6,h שP<|h㑅syLM ؈W{$\igO[F7Ge&T([R}S ϞDJ>+#CʙQԔ}±LCĽ-Y9ٖ1lp—(, `3ʍH+j͍.PtBMq=ɑ dJQ쬱pMVI#](Mʸb)m:4w<77m*3T= wMc+ėH6"R._^%$?6IEA]k"(s }WߑKI%H9VrI=uP0XmA0@)O)ۆ _l3z?7KA@Ԟވ;y3*p;,_0\<$HCBBUK/BHMn 'ư %2@uސgZ(5I!_.fYVgӵW~}d:UN%.9~4Bʬ돑ydARawՋͤpzqhk.ϖv QΠa/c'&I8+6E5^}(A2R!Jx_o$jb5aqaQ= ?_I"{PM{.Dfi,քO.ĮFNb & z- }l+LdW_R C1w&5/MX)0 Ɗz68Qdt>)^YKȕ/[#*ïݺ3 ˿S/p `:KE<8,Ե!Z LJ pvZ7\ݦ|2ivf %mtlUūIw}t㳀z&pC+!A$@T[9ⴭ`M#jøTB[jח=vm*2\]Yy$CXQc#@Umm;qҤ}y ˹j搪]u?z9`}xjUk*V.Xv8qc}Ylh#-su \4!n:HOR)ʯۈ*G\.+0!Wu U\_9VXel+x## hA+R P2:&Q$׾a)LÛy&%yFW xHz`qۧ&,k yw1- +9PIwƱdXxԧ"}Ar %W R00U3K.4-g,qɇveR!zDD/[yC!ãg!7N5D&*ma2|@V]^7 R#kR&9TJ8C~\DҡM(i8OmB%CVKx.Xa lbZ_ _w֑ӥ~:-lȞ(6\<֛=mL,ՠEO tӁmiz2Ȥr!7BپAzߡMº~j.{#adw/g( Tty^&1dGjS3ilh9Nah=ۣ&ۜk&QpFS'*DI|`47kx f |6~)߭|6 P *W!ћRe+Zc)Muiⲁ.V]/ wvu*EL7ަKa<'yD X*yu ~OQוּ=긂nL+~AJ˂H0 >u(%J=YYK^7KtVaf|[k~)j) k}9 \rEs"sxcqg4u8RNѓ#f'm, ^gsg)oFS 5sdI/䖚 >(Aݎlg=ԒsL6FDG*ج}KѿsT"Љ\*/@4:$>F/q/N~)rH{ 3^JcU SW4f -L}hx7 dՍO{#4d96ԝm}![T! ߽EDwZ~>AV*oyp@ADV5[5>ɱЇRNm_kBudX󜦲2RON@OZwqq LE+u)=h-ΐO̪(m}rP&_ `S!i\ 0i c~13dK 1&Xe1nwNs▦'d8zN@/FOĹJN]"TNtB2q.w^e6ϪW;vtrV5qk^v|E{ˮ&A $4R&q@gwy lX''Y)ั0'*^zr,ceU3!r>z>2@2D8Gx YjK-}ϭ[J3M~6s`U;PT0g~o!W{2(Zh'5~u<*]vO RW#IzN.e'LW8#paQ`D@{-/D R-2%kPI9rxWh\fC`?Eu: }1 z~_k4ӡ1Br}P@5 R1l@>oZ5 [fߘr>Iszg KC.+T&%m^t*l gj2ywE5OH^3z1Q7` |HIYp W4b.{޷7FDL2|X;-7Moᤛ-#ͅvGL}=VdzӣWľm5?p&^ ɧQJ)!#$9 qH;Ck5>v->nc +/!MM#wJJu*Sv\0]uf7"}iR}m)@?$N-=l@?#z ʊ< URcjLJSOS8%k YE[hhE*øMufnU1s@3c,&p%qJ︸Uv1s. OO_Kz!, %>-dxܶռ`3v`ܜsw=|~+"f< GMنC䷗dwW1Cܦz3T~YzwݾqtwT:O%n$ oNNASxÇˬk_8 3$Q=olǩcȴ иUR rYmW= rQRiDz? o\,eFCOhK]ivKbw)}l316mϫhW.es}n6a-Lkd%*$B[mdz3UtLCä2|Ns`ڊk0G_J/B6^UaW/x|B+z9bzlT^4e\oC{$Mh埔,U>Iє XWJDQm zωƿXKh5 d6_FP ܓʣb>̤:od/cꞄUK\)<fV`7BJ'hjvC%FܭP6ٕE 3FwA{3 Iyѷr^ެ< lm1X 1~ri]j~p#>[H4qPqs+,wW'<5u<%"ka k1 u=Se>Oc?%CE:Csp֨sQjz S0x'kz:x>ЏO<=+^otL}F{Iu<q=dFFyISLy9I^r`ikMTF]`pfkaKXw =y@]/=ZͪNw>< 9~9mďU;8PtF @̹wo^7E mG6 Ҝ9T)Nƣ)[{i/~Q2 g @JxHfH^Q'\u0rz'v*32Q(#3yE]5}Y#I&@b˕|BA`I@Ʒ;ʦN8۹ylR6c/ ;*H7anL$i>ι@EX}0:H ܯSy_xbt9}>ne9 BD*2CҡIhyba'vr ^1\MBAdm7[:-H (4cNLZs-!u&/kO5aϖJvkۭAGuG("*:%COǃ1☆T(y' 0yikHLA^9M]ٴk>؈DsTcQ3sq$y7f }{":WЩ0 Nrê(%`M:ݸ6Z5N]ξ"tIe4ն(6i:52_e 5@5o 55@.'od "@D/̻s K볬nO"%W M{ 9v~J}&lܧ6Heu 7C>Z[5-Of?\\:4%;vɻB~`<]{|iG0tRИ5-bܩA |&V+NҔ\;~&|3O}Z Kh#!ίn895_%S+/YoklilEZ7P,5Vx`D  o$a1*O28tm9uH߂LRWnZ覆 *w>L"է[U=2ybJ&ʔ'L٭]jӣlÜ:r,aL⟀X DO#lڟB蕈ax c0a r%ߜ'zk-WhЌڏ?gПE7g; dDCNbCb[NeHG6De䕮Ӫdp {yLQtp;#z?iuX^a텗|7,Mu)G04Mc.@9!R%|G1.=-RQQŕcVIe2oarSt|:U 0^^̲ÁnSG/Cדbq `õߥo0@l&;a'OhۇH^W{]Yw s9BK7tfCCj}nRӏL>aZӟ?mZ~3r( "yCaw]zבPeQ2cqxk˵# iЭWzQa%O*Hoó^;)7F(HF ekmW=i<|>);oKѻ"1 MOVO"KIoRܘ`mKv`tׇsߑAOwR#q4w5\XnPI)ZdfvO9F4ՙ6luI"o f1As0]7gk+Ȟư{ ׿Hh j Beno!W7 ֆ*t|֡NBJW_"YSN/~%X∘ ^#qA":+~cHk21Q ̘xQz/>ͪU$ 0a h?mVeTKS =Z].;.h ܸ#%QXjll x:͚w9ig3c6dM,`›u˥Zx4 sdiF:#~ ^!F W@k/j9C#PvÉ;8% ݎM\?W=@AR NGU+狢E2%YJK z*j N`ÍX˛u*S|@VEfs-*63\~P x{.s'Ŀ2И^`8P,1f{-='鵓STG2aL`IN'1vI| hR- 3u9Duy+ꞝt^wy5} #wK_|9eܡ9H;KR0AsƬ)m.!KBUU6,4!(6T^Z(CͺLBe̵s2vV[34>)'l+ \ U :FOoI*W%A q|_wZ<9) J^.׮kbS[L50Wm~6r%_L'X)MKdQ:O„5z>^>1uɎ@C#-ٯJP.H>yщ zXo̼i҅TY{B`T͠"Gd8Af` XXk :w,~2O2;//WEoas 8oUS|IӅ)EaN0⾨m!&qdr״iK*@Ӽ_,n7~* "S;ye H܆E$:V/CBB % & Ii W ?7᮴;@|,(r}x~!$?LZu^ [dgRUUev2kaY*Ri CFk ۖ/,{ >:o'Uueom!YTu8:^󀪶W\Sh+SJ푓P#mA5]EVj!)7p?%O qc:j_RtPQӷ6~eUBޜ8ϯE.g5& 7osM9E4Di/YP5k5e\^:$}ms#hޑTN)*Nʳ*~\,M{Ϫ+6WϪx)}ǔxC)k1r3-؈fsk,21/Ta(gE8J"QPPIG13' r S\Y:!KЄh_56-n(!^ -FRѝgq}@׹ړar3UK==ZMޑSjw4YU9W,Cz BG" Algǚooi@;v:sy'9GbL_ O Ě6-k݁[.[|\kg`W^Ѭeě(6ȏ/)f`PQvXl i ۘ.o"j&~U,Dqu(]#x;qsw(+qjIjX| 'ZVMeG\K1%ـ_*)Qicq68YmU.Fc3vé/I2G45݊xo{~GOEU[<&?pejP?pEe}:cgXbi޲6uObA5W$䋐6\uhpFC\^9xL[c)פÂ'DH6|b[. &_v_HeO a,S3C-@x_l~{ctӾ[w,Gikq*5Prc_~u>@I*eK(s`ec. }!4q(]߮YZp%w.?(i|#A\we`PV%̻)./#TaDLH*Z]I!yP󣂧_a$ [4xaoD܁A>su L.#J5B*زyg0q06׷ёU#P A_轲RG69h6lȹ)X s)C/~{<<פbŠqG"c[bW'GrT+L R1JDuVqL2OLzzUDF\LSPj{!Awi$)Ì )0Z"^u_} 3?R[ZMDGonNC@N[K/wNn^:ƴ;">MB3z^kQد00,M1(E㚍v;>*ւ+{$9gBL:&t;М׮J)O z~d2u_GH%r׷?ۻ0}򫬼p _Y{L5!% U4vi[{;7:"΋=l'n*{nf{wYl %g]>\k:qZO2K I⇩DV^Ǝkӌ/g+_-{{2j"i0 _Aݿ?Xڶ4"'MPq8F]+yTwn@qH+tO1Ǩ-D*ѯ'xNbٞ ›DpA՞kHo3<*mfC=K>IcWV$nuu#F?TfůPs˺;b6%B3^Y Wxۓ9]ȦX-SH/]UvĢf$ׁqq*"I#} w'" p$OKe9s`Lmw7(T QNF,rh(j J 1E3rlCK\8ۭ#QV' .U$RLӽ>:Z삃5p A˖6FN$\gR MƥEIkB1o0:*Rs+nhŜrht SIZw|/sh;ī~+ҪH\RZžCRezٮ)b=r.5h_>~>wW(L.!?WWq lACRGkx( :t);D*Psqه6)(t3$pL1)n6ЊuӐ,JU\z|hm`gR׸RnlMff0 y]%[vt\":}K7Clw %5\Pg<5uy*'1C{Mn=Vikb":5)yUIyߓodGEy}֬<Y%d6>dz!o*bDQq=@Aο%:_|8z"4_ET g^O},^0 ktK > ֧T~8ehJŜ Nkz-M8w)B򥮑WQteZMe2=‡БhCt__ Ri泷D\MF&HF-q{Lek[?Lp&A!T[LLQdX{Gw7 ~ƭ'6tTc:VFxR$P ?KWߣ޷^DžAOb[)h(YȺ2ęxTZ/C.@%xү|0p75KWS h;,ܟ#+_J!gLD%C%tY돣ALGFBXx6utGH![źN"=,cf~_?TrukJmaF䡏ƒ/F z54jdK:+~<2,X=wob-3~9leT~bZucm0>Bѳu^50(KfslXK8$Joc.tSTڟضS}G6 ]ORyOf(F̅7ԥd ia$a />N7 { ΅*"#0m}* O{{<}$Cpb6Q@mhC;$s>ǒBN2ɫ !'5S=e'z7G J -L[e>byZKf瞥=]Me$yʮV`,U3t+ԂrgFUz\_2FVY*؜> ϜaVt1l#t,6pk7$R~&0I}8 z3ldgGjzԣ>;fkݵAq]/gxtO8߂9ԅݤf퇇<7rQiS y!w]'A%j%$4 8P,K=Yl_edE6~!8@{eנ[1ݖҀ OP]Mv%]{]Q4( hQ EHG2yƧ0kD_c}alpK%$Ӎ'alsm >Ih;*.&q'{XKٞ ЃVh z||@&`>xu2Svl_ hOI۠ vOF];H`(ڻ`1W2}j!"+x\&=gcN+S"_:FXz ᶗV)8j,Qq>XҐLGyyij&NZ7:GIV;SƪsQ{E;88YԠRICT+ǴeOϠ Q<)؞={Fw`heON]!6 x౧[wœX(RIie {S%΂O} miZa2Kn]-3ǽ;\ ` #\QZOh+P O@+mq[>wOfw9_<b>r5xg2X| ax@[9 9;sQEP/UNU:@~*j"MLqb;ٯ كcJZ(͖/:-(Ҵv$SQNڸMCI%YѢMCbWv;wvl>GDzZCz@A96]jo:Ywɾ7 W'>_3305_= 2Zg9<98|T JD@!qQ.}Kp\(8Z1*?z׸jGl*WʏZXOMx+Ե'˛Ҳgʫ 1QA\SWFKҺmSP&/qԙ% WIYYWYT% 10YK4y?B5#8%E7Sm^j.ͤ+@dͿ^*oŖ{I  - klvV%6/\ Vc57+5\s֨$a)=xMWgUwTuJ3OvQU<pہ3EoeKW8+G{ ^ӥTy*ah.G'_-rk͖7grEM/ {7B6rk'rMPMN/P[LЮrixcK]@m#{w4`hw2 |ɛP!,Q#7n8-Tg &]g'hF('M{0ipC& N|5LǶVnNuL}+Ac r 2 B6u{H\/@+6SG?~-ժީ|6,u/{>yA% &YIxj3?(zI٥,IieI~e}Hzp=*5+Kl`/Rs Q(bf$k)nd#t; Z ad<:hJ7S@%'o)N/~YG]AC}B.Ȏp$-'9N;Ypܗ{m5FC{v*%Y@ FBQAPS+ I 32p!qb16#&9蝆 ,M1[eC:/W&-e),VQ(dz0pD>6޹:ѮQO]2>"5 QU";) I~|׾m_ T7/+9Ct,Ǒ: ! ь¼@~Nzl8;,W+jtt|?υmf-6S+;WGM-ua40V\%Հtz6Js;bJS+taw?VhvO Pxڍ_-4juO3mOrDZ/nՃҺaFWLf%<@:|^6ՇZZ;ߦ~|ՍO&[=AI#_o\3jvcp] ?3apB,˷~+ I[?9/0y]0!9*[WgD)xo%8yBYݡؿ9C.Rgk+ 113I1(+Xg ^bӣJۈ }3#bZ xt?k—bb$ fsZMS=TQ}[#O`< L? f屖(\ma42o,uO=uqOB8Y -?gOIu$[2?[ HNN4'L3Z ;D̿{pdeUdª#gJ-zorب/|+;ݭ|b)]P07uDW7g|O T9޾h ,(S\)}Ez˞m _vw E[K"nW3}Ejs"2d#7phMqV]{JZjJOZ*=WI^zB=RHaCOwbh5Ef$ Y@Έ[:jo8[h/4b+5>+`:ڮRj*pY Y< ƍv)\\nGr.\gɟWZM+g.aGysPp'2p^ǻ5ۧŴ&1\լl`/BQRnJJ_t֖(Ð 5OTk #-$jO˟"sVFF s""K=A5oqW-@6&BK.,S&i3iZ:0Q6,%'f / e3XTm3(^S0/߿W$"]mM j k Q8[0qKf :҅1Ķ%9ۺD 'զ:CyXm@A[ "a9<2?y¦ Ԑ] .'ݝ2Gׂnxx7sRK '@dȀ YP pwSv6]p_8vͦзI,t G*D_콤֥,1:/߆T=|]w}k@!YkXtk}1; h䍯Vތ[EK,1{dA/pFΑ%xu_bd0H5[=p٘e ścgzOo2f0ibWeM< m !TL2&/njn0ߡJ0~LHEt'JQ8[_ր* .xEb7<ȓ>BGNư-9Wu43xN8d/k<MHF㹄j^)Ȓfp̟y(5 #lb/4CSُ^yMx=ِ*8H~9RV<_c M/Sׁ!W!6?sj9nȗ ̈́nG׉ۡ-\<akPgiv5n>3b8o|ׇ/&>Tgn#82y`t5,{[HwmѦQ8V|m2(1^5]i z M<E(O/?)*uWXh".Cf +}3W)f612ť<1J ؤk ;5VoKnqaW+‚ )rVn$̍FVqCG̳b,"Zٹ\=vjGJFYkHGDڧHgGb^vj2 gb2@z\--s4/T+dD΃o2Njs7%yӵ7 s|ܣ ,DV8.Ύwe)npoij?|wƞՙF?I꣊ki̭dT(lNT4|1 n f;Ž.{:Is+^ab$Mo Sh/ ֶAȾ^ _B23ڎ؈B{-+$PC(1!7xtJF̯?D@ZĤ9W#yAͬI`]mX؛lwj괺%?][{`95<(X.1A>&S Ir&b i?b4 5\p#!  d3PjH#œ'y_MJ;HzČn*WBXE+*&!Q@Woxܻ@WRԶE߲ aG/v`ȭ:cIZJJzVaJ?h'BkHT@X9M6m~״dN?4 HE#ڪWO_?ms(&-,|6`m ^eMܳdj:򎠇1p{y=uOUsP>jQ#SUSOVa5B|΃ƌ;&+Hм%&{. ]ɶUR&تPђ}X^1/2ZkC/K*~@DD"M7%Jpyl2?׬`w~Yv\tv$ߺl9NaPs>FvvwT^!-Ym"եVڣgPfb4_[U8J?#8K{B6Uۖt{4I 36Dt2ƚ=C yr >)Rƌ̕WN ZǙ2j*힞{5͐Tό"Ɖ:E-YуQK8QJ/PWqs)I! r9DC! 5!}}*EF" mN4{\ iM74@¢5EߔRNsO%AVT"6^SEGzd 4a%R:GAT_`' ߏ&?JԜ0i7EtzcvQu/XXFO4%sf2]*B':fj "o]N%Qx N8wgAw*\vjlIzDs)|lg%IA.ZDupOj$0p\{s b-=~m8Q?"*t}4.J+TeTНuu|3h\q6]|.ow͗pDUzܝm>w1ψ$ au|45 ?F䇙ꉎ9*/w*4ׯMC%s! j+Yӝv cb^V=W&\Bt4T+Zl]-bk{?`&ҔEE 4˓ipL_,ZKЅ<ֆZENNS//ǴVU&t:<.T\6>ߖ?!E#~!y{#h ^(/ йQV(cuLWwwb[Ks :Ȳɯ|dG;!Bym$ܕf=jEV2BׇTAS"*HLrw*u,{ǪMI sTZ _qrrLI#g8KTY}\tP]7ۭ9¼W 0fVlsD+k$i c`Y%aqn-c?k\ Bv/ݸܓod.sgl؀l>}B\Aeſh }f1BL9=6 MKʜh/O׾|6f ^duKxzSNۼ\Wn5O?ATmͭ3+ީ3dJGHs2*9&}Om`E q #`(oA(f_h ) xB싊 7M@xE# 0TPЀz## ck] AqAy.cy ܸ4(\wNp5WfawyGNg;ix?3^v@XŽ\'_/륂O>yGc6@rЩߤ ߻Icj$ZD8{>SR eJGB!z}- 3$7&4jVVp`ȈQ# %{Nڿ^3WM2+Htt٪C蘀"DgqMVwp:$vRҔ jTJG5Y:}AWu ƾSHt͓T\YX ~ ;H$i.1@lYBӤ"HfHB)}kɤ3[M^wpqXIƙQCWf;U_g7p@ͭht},UtH E>!#"C\jboH|E?B3 ǻ|7dZ5w OI #麖y!F g%nla#U`Va<;֥HzX.S_Zc=I2qˇ:$L?At$+]-dq`L(oR [~a T7$l=vW|ߐɩaM{j^)3L)1VX1(Rl&X<}JV~e^G5Xwq6t}ݸѧZtY "UB:hr]D@!JA!^i#8YcT 6#'XԎ'WI`o6^rq g%%=9ŸAMZ&7c6Fj%P}h*VA?w71aB٫so0p5'jW3S3*^0,hz{1GCqB|sG$Z1ho n,xZ귈,.jwJSwJZsntFZNۂf#FM"BsZinRo_HSuD3gu*8j*Ow52a{OլK㎩e-h91QJ8m2٥[3:J3Ӹ?0鳔L&R1w,觀 endstream endobj 87 0 obj << /Length1 2352 /Length2 17255 /Length3 0 /Length 18656 /Filter /FlateDecode >> stream xڴzeTK-4hh5wiB.!X k`Awfrg >]N^ݔJ"fv&@I;3#+ @N^l(ll21p QR9Av`qcg h`caEH@W t6VhJvNΌ&Nj Ҿ{8,,`gd鷷(@0d vnB 0Zۘj@-*@JEQ]I5㿸K1E$@ j@+ ګwWj"jJ̿`@7Wf?^]lJtvcfvsscpqrfs`% fh x}:mlZNgK~ @d ;;I}-ӫ?^ ;' X;+$5`c髡//Ќo@V9'ͿڽLwMN 'g# oN K&/ #)(x`FyꀙݝOD\ylll&ھvB]>qk=vn`Kl=: `@wSKb"x̍m> spvtxS`2u~mףWto+4S3jf͑_ہ)\.66 ƶ@ۂl<,4(9$ r)M-*3-lFV&v.5Ok뾎kWZNN.޿TZ M( *H} qr=X^f@s~uػ8~('Yo`xA,f?,e nSzSb0Af? f}Ek>?5+kBU_ O5^ב䕤?k5A_JwѿrY_ 쯡.&VK|eiu͝HY%GG~\^_GX_Y~8;0qspt)=+Qg5˟]|Edj c}/'IeפdsuU W07vv벼9WϿ&?EEܽ9xYap\>j}ׄ}ƿ/4EZZ3Jk (Kt WHK6f)sO< 8?NNO7%\Ec֚\LYxWޗMBd&McpF7wwwF}Z͝J=m)zؐ9!SsG)$qzXJ.61g=+Ʋ/&jc\. aI:؍:y{%(n"n eDaf&򷘤4_jb~4"e 6}(Z (c=O[{@_GA8Ô_؎+FWpwņ)U;L߹P@w' 3n(ʷy|.˻)r)v ѯfͤp3, SP:_7UtxfP\I N6!J׵^C8ho~~ul~{~c;يI11]JkqL!>yX{9 @n#_%%g\l$EN(eA 73"?D5HFtfd#1u;fc=Y9C`Hf3S{Eʁ w.,ϟ2&6%xu0q/>W`b{IҴU؀Y,jxSzL6|F/#tzjWmEHE\>bvpXd_bgZ.:6s2"\Vߙ,dՓ!3M6RiPbraMx6ChcxVwa#c*ٵd?M %O&'ή4G1i6L6U h0-}pIE]$OG]*"́|GHZi>ywoEaqK 14SD5;6s 1jЖmyҝ#5˪_ >Cdz~ p~sp|A )TzXN#8\5ö%T[ӎIOUI\&GhֳJNU|:c/.&< yːv|eS~\5_'sBqHΕRg+QEV6NMx K$sqJ#XYֿh5N#~VVkpeXE m[wj%W~|?ng 0g\9DLrzMQTJ=4)W.SxCv[Rʪȑ>}0ao]Vhp6J} E6@+]&.fO~b~ԇɗX0ECy 7𾓶83_k[rYA]SaQ+-7!cvm3K-hpKZG-t=0­0,C[= $-ORk9'xGh6Da3{+2Kd{ ^@b_b~\*6k"1蛆1y1ԥ 9=KhYbnQ}FθZŔoSkK{iGXmQ5kV' sφպQ$"7bp+x"ΐ~ї¥,'գ2gۿo G "}œ׷j aQ-حK }5ObLH""̺*Q}糩 Y'.GeLjyiiWMۿ[3\rـLZWɚ̝m)R&פooKm3 Ő}d~+wBv2*젽( ##OXm̀=ꪮd-[#H䆰vĢn]&*[wck'n]2)k{T\|,*<]7wlB6M\N0ԏAvyHdvewi|_ҳ{udmlm[{ty݊'[ˍZsr6~Ky2=| 6nć,irZ4m4YL_Bs^~AA/#1!)gu!»Dxy?ܶU?/%RІxa1x+#4ҏ"9!,ΔsW<45K IY7ωPuWkwJOih oU[ĠB`lZNjH` r/e#ݏ ؾElW5A(P`JGD)W3~pIXsEMXK C/AJWJm Λ6vSed @/5P}eL;/\_w;]q5*SX+ FO3jn )>onh\ 0]o_L)IH_X,jWSMC<%>؟~,:hn_1!ѾoZ rZ4xQ'yv'@ (}qN qeux->ϴW7j  ^cDzN+5doNκȘ]4ZՊc3G~ ȫcLвE[|3n1GM*0P܌Sf$ yHQFǤ5Hs_կhy{Tl`ؕXPY$8-C"1Bg<P-ei} OZUd|MֿSb9F\ǻHxoF^>=}m(jS >9in'SeAa6}%5/X~ٱD|$=԰$Ƶ $璯vwct"v% {:4"ծ^([a+PrR(0f !06@?BhkSZ4.ͱ˰x0T3$M8T zGTm/?X- _v>4th#Gy?lJQd w~9;oPG#hɱi92 E*GH'7߶ܒN &ųWW ˱#A9"#ڠsIX2Hu>dA#l 0nʄ[|~KZ}J_`>49-[Xhpg2ZP2s[\Y+Q(53*V4NDI*K{ 7@vo0+E,,aq|猌ӆyG"4>iBp@Κl&Ǒqvd,G@ekQDDyKk!|%ZF?PnV%(~bۺc|z{jUOɚ0f! {Tj·T=;1; 6x_ 'Ůh:2K?q1b/>e)<--{NlmЋ O /p*Y:uD"{߱V~Û67 WX1H #7pYWfƉ۾ YN=?&-򪈚/䅤Eveރp뚲V9NKU"`L*M^lznB2pV1O1udI!Iړ'.n,(68⮷NHw n9R8́fJ$fkYINɣ>}u>2-GO">h麻?-PO@5VQ/;H(zΐϑ/yOTb,ÕCg̴fdb@ݶq&O{c)뭛U}r )}Ug[? y ]_"fP6,xɹNiĘ;Č`lʺҭ-k!2)f|_%R\~ALPxHi"ou)N\)ZW: ](UVRip 3EP٣-un´^O.m#<:ifC񉼨 iIDzd'cVL_(נv2֠N#B@khu˾OV?]^d9x\5y H~LśIWdE; H.F[Fs>RѩWLj!kŐVP.k'[tLs{Ub\5 SJj80TQDܱ Fݵ$ Xd|r=w/r'0n L&ecn@s\;uaER/do-RAub?u[O˥mS["_0(}I_,# &eP.ⱉD@PEA)AS8Ӌp\P8hT#2DЬqn$E0Twu۷~\m_Mre 3 o^·eG3++/jo߱{l[CxRX 'ͼL_"7A훡]>1~;aéL6T̓c/~Yخ{`/ݴˆPtKn.L%'/k5 rl?)9;YzD ̌/re< _c|!āC@.%KNa~p2tc{;͈qe3#0x-NYX9~H2(9=3Eĝq;v|.'18!z Dʻ*62l)/n֛  7ۊLt ֲH9,[0n5l*_<=_. 3uYUajҔ'\h껕`ltAً;T|cy>>{D,|͚oYǏj WK_S`TA1,j_5s?Ŕ=ocuL2W4axP ss剬lE<=ٛW)L:$#̆Dq/H38IHʡ:kW}fE7 ZG ]!1ILv'x.2}ƊK)ߩ5ܩQ3O%A.)cp•~8:nGMY> v]*YA^v>-gZ:I/JH'mɡrVʤfm'J+lw+m)xnsdL\$Y=&fFICz2K=?ע_)jP^Fi˸s"=*:99لae?,5GU:8 c \@W7B.ex}K>Lȑ6ܢo8!A_p j*E|E ~ߗg`Z{{-"$a;tu+_vϖdxPLy$FE4h2}JJ!&bج.$bv1Ⱥyʤzw܅Ko|DQA _F-?]S+I_>PY1%NidE81(kae\gŇc5Xq󖾋F|~e. FA `/wy|Ey\S a9gګM 7Z:^S=Pw~)#նl Μekf;٧#Yɇ{"Y-=Bk H1T5Rz)k\]&Wb^F6m̽nuwo_!,օ, <_o З1m8ZdVUQ"bEZnJ^0™ dҫLe2l`"0F5j$?fTh!?et(j pZoqG!RMWyr$[3;<_ 'OXj!kp4O&? L]_&C:'3's"SvJjˬ{7?nf54D1҆l/&|B/"lyzz諽 ߁dHȍ0te; {Qn87~ 4^]F? P *MȎY$F=S{AGE/8V KTW/&)MUp!|iWOEj%(cS[ßZ@:z_j3톺i 4-⧩ǯJ32v!y7't;-`L9mIGkUL݋~kMjHݞȠz^ g݋3}X [=}HD1 {Q٨hx$۫g2 lZ_x.5ml]bTn^45{i[rNëc2- KYAb'SOt! vk7/"6m<}q; =o:hkx$sI>-%y@^_>c&qrIІ2fEqs;9|Ess=(0tdyDkfuo"O|%6N0>29 'ANCԺ A3X:_vPC!O+^.)**F{7l AS2Ǽor]Is ڋ@# i9} ʦ<C?~C7b9j W|;bYlsg\Wj7=;fU[+ɩR8nJ1zhZs?g)u 8?4mz9?=ӕM\ԕh8@C NjM /HkRjɫ3@u-׏U_v`#!Xdb/CO㰼9S6p50Z%|fakFÃW*ӽ5i*{~}WGHE{8 @MOSƩ~ThR!):r1OL,v۝;hiAo]8lPj(Kb&X!㳇.0t6;T_QP_+u G3P{{,R^{fJtv9ktL9AJ'U&=K'*Eגi>g5J8E@t4[I ?)|SEgԟ2:3d=|*Gֱ#.u*̇hs_\Nm O*2Nr4VhSZPR "ŵ3}93]KDw`79 z&wͯ=WG.XPL^5l? s"|ԮW?Y;@Y@ 'ݰ=lQuC(qdT GH&l 'Kiabхpo+=o}"jƾ1l#>ofLքRM )uV5-6v e a%Be "!2bu"䧱S Œ^I<؁V(Z{TxQć\9aPTɐ~v'c$`@&[~#wEmUfe oٗ8DK<ӚyD-΅Q9 7щMLV(sߣkFC@_"֝:RS 9ovB>Y wED TUH0'VkVNd B\Qs/09prv*N690 vyxhP\eʋKӘD?q3b{ɬB20aԝFUkMiqM/ًɪGU>W6 W: +xHml7}VCZP[tN w,K׼ `.}̃~!t {tAy YvYo3念lԒ[ˏc24m.Sh1h4"0U3!H: 3[b}?9Ƹ<Y9̢fV%Qs7j[ m:!8!r9`%cyqB=;D*|*>dwPZ~m͇8o}]1^NOg"tPRac %*u  de ^"H71fv/ؖo?xlqΎz#|XOBCςL5!{]@L^M 6_!hm$]d#>$zp<иu2Z`VDK3 }ur=lo! VHU]͜5!$f݉T⟜ +s\!!|W'ąKKvBzVTzFM*~ָ ]y:el=~.ǘ5 QLDeuɷ>2pԅOr R/yH%⳧pbxO#EUxϙ9¬PlODҾ5.B!3_B>b.;QBuOРFZۈ_qBבl_IguA6&rD((Y Iy7~i Pt&Jck^v?A恵Kb LtQ((# !?hh癅ح׽ P 7.w>y_Ufzә cj CXndqvF٥+S;ӏQpbth l~3%@{dO ZDϜonYtEoH;;` :% 91xx ~"t~$\m5E=9Pb$޾ZOU~֓@UK=+lG+j{NR]糲!8v@Qh$ɛhZASoBJ8 ,j)dtgA%&;ò&'1$ zq2dU1P>t3첳q>_{c/&!S9Xt[:yy9hN/,4PfYV M*skZ=!͉>rn)(|!PVҲ'r]N.(ib5:|b=U|@#r'$Gb7fgPt[D"X,P8:J!Z_?DxbF Cc&ukZlWN-t?8f=nS1j8f3͓ ]37\_)"3/ǑmFux;X?Y?IdGlc/wC u1W\:"l zEbTDV΋1嘍n| ;Ô0hڊGs?Z _<5v[EhJ֛&ņfp ³{Y\#s|`T,}Ybdv_#cq٬ۖ$^AiuK\~ytʳZN5;(L̍VZtZ9!%&߻BfY~Q_[p~}FV3k퐥(ꢿ9Id0l*γ`2L-\V`"֬WA9l!Kw1c7PX<0tӞiDMx2bP Ax aڕ49>"RzcUG{{{g0%hp;ʅ9 8Zh]'dCi$A4@JV`h,T_Fỗǔ#%f\'1_zu(3 ,iޜSm <~xi<|i`zb*5_V>cض}AɯMROE{v9]K%ê8IKۏ߸UA,j$tzv>_8 FO"Y31qg"ˏp|Dz"a`%\:8*O''jZE14BiN)c(t3i+o?}WKCsaFZg lMsUr¢u[nӑ"/~ee;ouX:$ej;XX?T\M?Q$d'D༗`}K^Al=a~u9_4v[])"mf[ sg6E3no9@١mE \ƛc@5W~AԳ@,-3_W%= 6@;}N#XaΊPj mk/W2ZM}ܯ'V8 m@:o0ڐNHAfd5hiΔ[w \C WR4UisT=T+"5{gW4|-vv%su@]7g̅ u"6X1UL†NTtCa~ʘƷk2⺣ԕ?P$- ȱ HٚQ$ =搙JKӏ #L;5U~Ł tH3!A^;2g!j v[%JJp Yk'Ѥh ,$=ץyJ1끓o@?S(6mwr"ŭO| YKc!9$^{Cʹg0cTV,xD"`ksȈf3ImOCxv'BddF }ڋK:%囌!PIoKvḆlecͱU[ioA/C1IPVg> tQUҎVé"E>-]#Eꨗ*A.׮8%^8~ĐGEiz!  u_.Rȏ_PLdm<,xPq}=?' ^(k}ښ: '};L„vb02c.H#Ž҅ڎ5~7EL>;慀ƧHzoh%]pʥRihWx{JvS+' )ᑖ R Ǭ dj޵SQɁ"8gm(z6?; ۂh?>\ҮuL/fl{`!»jbR[A30tPCxPsUi=?ďc:cͼ`>ojSY:VJ(! nho_|ΚwҔNrZrQpˬ@u8PU9$lE,$/G2쁠-3EQ-C1X=t{$}[K/`(*A+w6 " OnY_aQl$fxxרʚP%8zKg,_1^dK(۫9q*D.߯vYjWDFrs}lvN|Ik~Dl^bzXu6r95\R3W*l\䫟S,iV|tFSpHGe\4PFy}-޶)m-?X1(DSy3 >I#_-"\OӘ@n%NZ3Jr//Hz ;~WDow="|k3.4azw"1_U8d7@5mh:sw Rk_Z7'ojo?1̨G/yce6m-`иtB_yHNy*skA#Q^X\ $iWY\Gk.Y6bkpQ ONhWZMɥJma~wB9s8t.J'lxiDSt~(i8 NJݮ؋Ese4ǚ!vWcq7u7=jM8;R$I Ht\rE*+Ş?G?3]qvjs@!<}oVuDFjO[yv}s[A}9KZR7஻jYW^jG"VǢbU=6L<)SM 'h <$h^V0]`LW]·zzExP քCF}HW/Q|W:'ټeM,GK:naGFdNY1*H0*.pa8m~vv?vQACV n53*Q42#95[B~mb@20sBCJF;WA?\BIYD.n/mo{pN!paB$Z'칽E5w7mD߼{vej7 [`eQU]V w(ZA;`6kʲѧtz*i @<+~:λ+lR`0)F}u0ԋJZ"URuBlQM0kRc"'Eѐp nIʼnQ潤9XCl *6LOLBdpҞIs&DrpH05laf#75`?& bhBd2nLXmmBݧ5zĆ'UҖeTc%ɾVz)Qv8,aNӏ2RQh)a bӓqEy_?d^i`=)i\x(MV q@V ]@j]wViLDapO%ˤd#~J2TNHl¢1)+fx > stream x}R{\e+rb<~ mw щM`c{0N7m$C ~<089$qHQBq0D21Csr^N_ 10[b4b &BaB“4_0D0 *pv pkÍ`nw @EJpJγ(~E29N RTXHp bd2C.SHy WX01 D  (/a+$`^M.ApUˇa2i01> ĸf[!:1 /E#~~R%;3n. F/{,DnvKbOdt9ߴD]z6̙&Z}Tg0wblmߝzCt\Q[^IA nKmg9wLA6滟}ҫqʂD|NZ%etf|Խ]^y)?Ѡ7l`Ž&ZL;۸]u+fegw+ 3I=th5ϥl+3TdSq>^biX_:/x{SPlD'$ v3~Kb=tfxI9mfл d.ݔ~0wIvt6Zxr{φюCHScYej-:53]r両w\Xr  k? \3UQluF;0~|pSj}4E>)IPiS䷥7Bu%<{OB?/6j;^w}ϵɐJ-T+kRS5غa3se9UݼX=ULHPޫFKg'Ok4  6cI 62X|^eQJ~3~`L%N]r<dI uɬv$55~$N=1ٺR?+zhOv|yMeL$dչ-ŏ7F8T&=3 4v:V}J̄WvKrIv#(Jc$)7jY߶]{͝WɢlխGP^HLϓU>m93ztx}7.Gk-n/O~kܣ3Vk~lG,*llRUGxcds|꡻5,ԜAymմ•e VW.&Jz%EUA׽^sЪāR; 2ˡ& 9iJ+I>]v#;7Ͼֺ)}=Ri'F~}յ LM&=3sj>%~7qiۖڹuvkǗ;b['Mkț.YZҔP}vŒ%+ͅo|NJ]+U endstream endobj 89 0 obj << /Length1 1608 /Length2 8829 /Length3 0 /Length 9648 /Filter /FlateDecode >> stream xڭxUTђup -8wihƂ,A{p`!Xpw$wYy赾SUg׮uh5٥, y(%P;X!*P{KAdC!p@d <<naaaL lm0j3'`񟞧05 :: 'Em 5.@94\,@ @+3 ) %` rb807 X;CO=C`'/!GgSÓ L À`G8)?xmrOn) tS_̓np;O.  s7x KXdmli`t_uK掎oCF[q`r<Ÿr[! ?} b33O$-{% S J `''5/Z^i`OP1_㿉@}?w oOmX?I#&vYj@Su! g{06عͧcA4]@ wOͩ.-oƓp'bQ*?Pw'; /Kq|uV5;FOEsq-?~:3'psh tqv~Rk*?r1~@A)i${e:۹zurʠ|S~ ݕsԌ<4zL:o(l- tEMܑ,Ⱥ.Ӟ~є 갦ֻ;Tf^g+f?:l?"K>hg9{Wz{tlPfFc0$&=̜ϫne"#~TrzvzM) I*Cqޕ`ݼϔ(UK,a]P[`ݸM[x4wgK mUks ~TnWᖶcH^1'2|ly>maQbX-S"k4:vxP<懚Ŏ+ajdsoG̢|,lY!xk9O$^O5RͧR@)7%ʒ2 `)՚\KvuX2a-=D)31whF*&Hc<]:b pR2'dD<uOԇqY]Q'ܺ2WIP=K_#A^IuJG N!Փz2h'?!僝ߧ>B6Ifg 2vF&t=-\SvSnN}Y#`:|E7Bs5Ѡܹw^ΠfztD>MnYOLS%е3E>5QwE IF\G(w=˹EgHNCԉ;lQ-Eh( Na-x6%j $fZB/mT<^Z9 |3; cWl`P{m] lӒU:̺^7,ЃzoR~D+5I̓X/9!A6l5 A-N)%Eꒆر&Spts)KT¥6{ۭ~=7ݑE{Iq(>fk֔{ʶhXCWxhKAA҅>*~l*ל똽MH@dX4*s Pf^:7ւrԮ $ Jp5Q4YpvgI?? &>}f<u5\Rl1ޒ}[4P&[(7{"Yź|ς01>VԔp6\KUє&hgjr~O<M0Sc]<:;"-L]+Xg}窀Lқ#ډ(T=l8>ZL?I\XDecRDZ)hBV ^IB@K~IGW%$q[HCk DzJR$ArTeGg&N) YvەVRpPPgi3/0b-Un&  Ԏ1sg~ddH8!yo";YiCrttቋ=?\,@=k7ysgVBg5gE &SS|ɐH}nЇ]s]Ōzghz= }$v$5΄!OuؼB2M_7jeͿ!?F_ͧ>"D[ޓ8cN7aHېcih7X+w\5o7f"abzrUɚ㸄\ݵ |W$v>L;@G|nQ>CDp}fHLl63<ݤE(W"Dz(2q3թPϥlL_ؿs8 =Qn>FIDS*\M8CؔzPhD k7w/2,ȡ f25W/Z2(:lX[3(:VN9*|{L5Timx>3a^0DV |GB]܌,$wq;B9vy9z\?:5Bgvv|4[J.DmdkԳ+S2AWa(tڵzd+ &>jx -JX!tKFk댴{ڤtnADvRbM*BjIM|0}nvLi8v{'<z[ x&i$`iGSaI+mwж+yÅ*?.(lqW9C's (R 룅ލO9`V˔fb&_zJقHtBzV'&,>͡i?P9.tLOܩ/ۛeqTvaH֮.-+?XOVR.NVȅ zZ ajٶ lK.!Hĥ<8,BN'넮/4WWIx'{qCIqVhު1an *:zD٣# R- 3)x59Z ;MD}SxQ׳f"&C[8u/B˾PS ?^=sb2ښ&~졟p6[/a_nsx ۞)R%SO}ƴ/j` (⫨KvK4 &(%_׽/⼱Tt"T da CP`OqGP({ }PELNg-y7iv|B Fm&\lIݼ($i ͕ش *8f̽!5:+m{Ꙉoxt3žZhJzi7]IgQG.tEvWIrF*AWs[IJxjuo4YϾ #5C\vpCIo?irP +38ʊV^,^a:| d~c"є\,R,bNj!{;7P/Jgiw-f㾐Lä1%t1>b fsw]饱Row;;;)sZh6 LR^)ȻB!$a嵮 HY! ۩p7\ٛRN"(/^x]HhU'Νc2e¿T j x,",3!t+îZyN:JaDޏkL'UzRf-҅#RXpڷP[9'f%lVORj*K7Y1v$E)vEV/mpbh UGJ_&e0)^+ڛ$=b*U!0XtA|H 軒!LInio˝a/X(u#-/CzgR8 ꩱ/ s u;:8*q\QXq*ӆ$\, Z uzNmE%]Rhۍ gnHM:_vbAQ bjnVlQymLEpQSkB_y)ɘ_X ^oĐJ>BL+N$g%hf4!2dWcHU![Ѳ˭3a䊪'̾+y^[hd+pj nAb+ވwRc5V>y$xj`r}h9h4?%LgLbxhz)H?DpUO&Ж0Mw͌:̱x|ZN㽈lC>s{2: EVw OoA)u34hvl+nѸ#;24KBtN>S>^dBQs]lf@ŦOp\@n_ wH;%Tw;YY ү#{SIq0}o[”x?%v۾'Ue!m"7cDU5f\g/h,2N孂zo0DIu58gBR=)MzWUŦJT<7f;3 lĚ1ɨҵIe\:h&1 1J2B:d)_Zi!qܝC o jEqRIEG Y5/,-&$9B_:>mHH .{?c3#Ooѯ<_7UHa $ެ/< _£j^c\w cKqHYї6@){mV|˵ *mZ'nxHw~xY }q2 k+X@GIHD@2ˉ"e|q =V%AcL',񼐞Rlɪ?w^^A~f֦N#E8BSɱuY ûr(2fAnĬNYޣ>_?²a"&=r{n@Nm&j[p9Dw!H}o =SY,reD[63:5AqEjg?ÊןEKQ6~x,0%ߢК_ hb_t@Zo+({b3,n$%č~Knj-ms A#Si1<9@3vI7Տiz-U폂Syh+d4ןb&ĝcsؽWm@(/]Im=;zy ȪX y?="{^M fI^1*Uyba#594KR\sbͳTwAm±1/κAԦ>JBI#n hyN+'(T0#yx\QY0b*rNNw|+ :g=ϬuBÅ^g6)YY&~tSu'[0"RދA !\Yڄc᧴C~xHc4Wk5d "j0Q!1"!o:E\)iMv{M+ _.˾Ζ}/w;%;mU hwj)L"V50Jʭ|kyVCdwb+9WbXU(daBP= [23C %rI^W?%5!mm;U2UѠG~~n<_9{ʿIqm&}#<֍Dx"t`LtGM%M9w1y}"a}Q^muW񯆘M⳺V 9Ni܀xW^x+dHHțS$уT. Rnjliy\v,Ko{2iĚcY6-y\_ FH~89ۯʾJ_)v..11!;iM 95?!v'w anK=ګ7]!t*,j {y{YkmDw^_?sDG$<܄Z(٤&Bubx)d<ֺ_./d?n|ϣ ,4!9%tމ7m_aQ[`AuZ-,<AN5G%?DiD-Do{sik→Zd6# gn`<)j`dmqyYwһ&fǠk\a{=#xeU_ /aGV>Ԝ :d Lzy&b}em SLVr=.]JQtuL$Gwg#ruu >KFBy1|<9_*l"33VmjϽ̥)׎ wIhsooWL6ʫQWe]Vro_p77~,2'Xt*FOPP z__ɀ.Dju9UF5jh0Eaxq_u3(cU,m0O1*U J(Tuod|쏾ɳ|KYtƹ3:9]6>GIҍpx^LoQ$^aĖw_ 8tV/ &Pܝ ߍVx$$؝کփ^Q45Fzeě-Ʊ*ҚT,!fx?O endstream endobj 90 0 obj << /Length1 1625 /Length2 7025 /Length3 0 /Length 7850 /Filter /FlateDecode >> stream xڭVeXKCaafF@DIi$.TAZA>^^eg5S?a(>!~A)i` SC4PP ήۢ p- ,0 G!III|vqpDyxx%x q8>!qq$@HHP )*o|!Yxw<:YF-n) wig`/0z sJR6!Z0?/$YfsU_Y{rzMz_%=ޟcyq"X߃ E,31CzVW [AyAl'xhnp$}?=nyOv<-U@6s2=ړB*+)| k]Nq2b4~&`BivKgjK~~EBDB̶UOGLEWI !}9q1^[GnYdXsR>ᚑz9nѨ5Ul*ۯB *nP7DZI"'#s#@-LS>4oP6P ooi7{~@Onz–ViZ ^:x$&ނ2+rՠrKj6tga@_Z%0^d䓒PpSHu=n=Q3yÆ+٤Oc(tF{3Nˏ̰'>\\We*NQ Kfd,>fO EqvE.OYj̛MOByK_;htFKmڨ<- P7gSxh,+(ED%brD$c[P:۲x̌ +>滩"d!ƫ ڸRxσ=ώ[MItIyQ*ĵ%ZɸtYНyo豿>aQW4Jl?P'Qq5ރ^۔b𗺺4F$o-}:hL" 3nn])Umyq9*@æRapG=ë.WӘ $ԕi3F\LhrM$DLݷ;h#P7e|x׏#5)h5Or6^ʛ*n6~|1 \2)n< |4^Jl, کE=CrdķfN"sxX}U!Oh`5GoCZ &7*سs?.Tw1[dK[7^a= Sx,j‡*&ːcD!alè*_=GD|/z3Udi;唅mi#Zݓ#W'Dē5xTmͷtWǺnVo%u~~-w -O+! @:b1 % 9VII̒ ­AG![Ȥq9'vsY+=;nwe^A*#$'|uNO5B*t]<\F$N"#j?(z~/?I~.8=5{}g`ATݚBX:r\{wPMˆW9o'K|Cm{Ax<1[F%)RY BM)ާzzy&,k&)~ Zxw}Bc %Z)&,gW;_>Ě.[[y6lCdLْ"Jf=GPAUvo(fĝ-AW"9+9626؉WnĽ;ML,/rT_~sͣ.@ }ͽu^m#qQb񵼔" Mpʀ}{InaIdWgxN?MpjtƝdaJ) 3H|, 58_-t~t5 GIsܷ6Qg+h ϡ ޞxGS{ ;R7 x+6J'݌͇1UH txn%GTGN[_VIuPiM,)F8p`beoɣҁ++SVd{v5u$ܖ^r#$V:#͇m;|9WZ=5vDGJ}t 'z~ /rS^e8iEeQR;A`)['NGB!8vpAC~i͗fg9ɉ"E?MqΕ"p{EClV) vX'p1Ol]W. %a@TZj%ve:yl4e 9hl:T{yyR.@G";c9Ћ`(2L˭˝ \i6j=qjЄ =3YDj:Wy|R,#8pͯ:3sNO`xrdo,v5|6>!S|h^y zyWeVͺ?SC#/mukԺ!*m%ڋ1T_SKRyv+ cl T}.tkun`AЧi *n@[ԙ? ÓMvc\Ҝ;m̞YeNc5xLkveV{F AtO$DK"ÍYzXWʦ԰̙n$DYY*)Sf|x']ݯ .rpXq&RJN)\`Vm {:jH! (tiXVӏۇ1;_Ig[&~6c&˭V}GOHh3>ȹї9l>s! "r$Ote_*˶cyG9T{2^ ~(w>lY[UWW%) 5ju+p(Vp#[0ڙuηIą $)m#w]eϗKیK}h-1d{3"by)iQ]}Ӣu-dmPmѯiDP{HiV*-3Пmo?cwa`>iHK &[詞 E٥T3gj7*[;cF%hlq"6KߐЦ$cVzIIg+-.xAicU|:>l z};y[<99Ŀ4ň񜃸}1)"fXv\Je;OϢl$i41j>ˡ ]VfUgF EK!Qrù4U I)'1D],19s52ӊ_?6H/_\|3v/`eлy݀+z9;:ⴋGhYԹ_sT߶*#C ˞ݟUT_$Vǫ]{PegWn`606/(Ρ{iDg]#:CEtS:㫱!^>Pgغqa)8k, upu:Ȭo?KGO"mE{EC\ĩQZzoCpno~zt6F e_bMa6´ߌE)* b9"oR T_df]̗o}~|[cL,0H+7SɈ7Z}[&ϒD%¸O!]\CbalOX؋+^'}JklYYP$ Krdp_?PL1}Pc_cX_/_Q~*2 b.AQbi%t Ueǹ~ o~VxPn0/?=~;;w&>^$+\7lE{7=<9Ϻa]Sbl Q;s~f<)4R:T`B/Iq'xrS,:v|ޘV{JA;ԼAFV@yaH )9jPzn7PO%g6\Cw?NX\7}xMMZ43(EѤ<[2"'==$b 4&#(=|xv2ZN456 FY>찺g.B+!YSb,]~ YoG$Orŕ=v}ѕKx)D4,t\-DqɫUh֕*.#Mzs͢tf'"׹«J ;I4{ܚ; g@k;KSaУSDZ!YNH 1F|+A@T/! T<)J*8oD ΛI̦F$SvYmeUD? x !KQBٕfQAAcCe>6>pzV0k hSg/kcњꛜeX{FkU{,h8j?}Gv2;|\c[4چoݯbPmVIu鵝, Ո1!򏋕Ϋ}e'G(Bϒf*+V$OS/T89ƉPrvATe{Ţ]n ܡ3O(z^FK7MFMdĎ]_˄U=ݟc:g%qkk***?eߔppX[e*<6?L;f*쬒¶s MARixCSy:$Fv JiFo*kC"΅w hL& ^?^HrwR*O E&i5k 9^sZUǧ,DQ_l[YB~f<`''k6N] ,QC. b! endstream endobj 91 0 obj << /Length1 1144 /Length2 7977 /Length3 0 /Length 8745 /Filter /FlateDecode >> stream xusu\6%]̀4C7ݍ40CJK)") R(% !=gg=G<* SQ}XD*qb*х? O%M`$fxOZ9=?gqcuC+?3?:*P 1A! ;m_ 7@pwow:@Rf zv7m8?/`c 7{yn+u]'CŵP^;e@©Z B$%[^{A%*rxPOqkpe6% `ˏ#3 7e,v 41e%xt 2tFv"#C18S@< g7&8M$,cW}^88'Eg#5Gg6rxA5rRfcvYҜX6\)>56EEXc-3HSϗh.'^-VK73 ,5kFZ}[sRv\ϾH.IT3Xn'g$r!W}wGϙYZ!L\9Y<*)vv:n+xɔ$40Tk{bOS65m/_IB=$:sLj|]B"߼-v WuܳMj.R@o% q LgוY2qJJ1PGW<(LpUEBS^eT̾ *.#wcg}j14WŅ5l$ސ@CԇFkew_pBbC0Y&U=$w}ߤ\2w-kB$`wa*:/D0d6 J-`&lZ+b9)q‚#ir <~֙Ρ1,vh+4`#Rr1m+V-Xֹ -TS ޛl>ǍCW~He@RWm#nT׼Bhk^00AG=.:Bm)+ fW955"nCJ/pn[e·fv3'LiϞM@b[[el@? -B=Ɏߗ ;\S #*2m&O:n.!_6Vt6O(ěGt35ɦEnJBP~"M&#DE^c;`!O܇'/eg_/&%DڍiE sf<\an/hjE?8Y|oMxi )J Nj>.׵B$^*^=vl.b1N0y01o=}PW06%hqJ/z<Oֳ''}$qMZ,b?e%]gy]/uDbA}?3tXg(6,mcUL'*j cLdD?7M,|;mf*AX"(]l}:C1 PزeRu Pd-_kl0}Ez˟w=⃯L\qL ja ]nul0LܯSMrP1@|u YzF%`dB@آs'A*DJhD'ssJg*/R:@`ˇ(!4#W -‘v `J#uĠE#vzs A9st^\]ՅIv$U޵kϳ/^y#$^_^UX(oRQ^ AE9]r{4ۊޟ"hW!K`*"R f~HVԄIW'& '5!iJROj=}\hg:Kڼb =w@`"r ;n|̋ܗ^{dS~W-?&q X2隵LR?``z-ghf0,95x^;)~}J$bU$s}Pz`Y~*.$(bzqREX \lTjFf4 3)bi<q8@A25lW=Y(*6za{Wԡ O3\5~(TJ$}}}Ҁ_̬Q TgE.hät(crm8<SSpU}7>.a4dO:Y dJFڏ. [LJ3f]*܋5&'Ord #Rp~sLFǰk6!YbΞ aS">qMn29e`'l@ChM^Q*D$N~=LSw#"5i%5ԉǧsէP뼪m '5Z;7O' >́#Qnu#Hk 3 ˍt'G,xfW"uA8yBc875-ئPIv8'I!!eru eŊ Vi+e'U?Gx~po_#1Ļ3?iS3C mCd|H01tc#$3M!ƅ"䁹 Y%?j=- =jʯ4][}HVP?y^kW(d3jJ6VrhR?kT)ECXRZiF:5i TeHo ҉9DBB۟bETL3U|*,dwttF:6~_R ,K)udTz^w##vvz *N/:OMzD 4zHvY:Z2Jm;s?Pa^h^F]Ǥݥ6 D\]t4&eF~.j~L8{@>bd")[k>=1bKoӗp>CԎiF01*W@BGMJu!(J6k ys[8=ϥd:[#$5-ʠz0\;M她dV ֑/8:dl:.9GA=?`@9@ck k8}:_@nJG4ZIQ 6,zJV_@}]q(+O6Cw֠NPzWEE E?<͆Z)'Վ]YB|z[1%gO+z\=5X$^ I݀͠jQȗV3`WҟU[s&^7GKbhƇjAr1vee5G+36e5w_$k5-alK%/9/aʕ-Eܪ Pb_IH+/A d*]hO}O?P *Oi32`F3fPxCO)+Σ}jz,C>QW~8jCw@6Ìio~NIR xT_WMTuW,ޭ"t+=q67X_ ̾qyr~=1{9[xUܥj ;b[!/.[P`6X;u6ҏÅ/h`#D Y.뚲|.bÈ^՝6|Ʈܚ=~<*ɑ}v0ٳC Iz:n'c<ST Ҭ+E*Zg;2U-!/=;Q1k2¸ꧼĿ] `?΋--VuK p#I|:a [x06a[ S+3An塬UO1~)§ k#?KaZ+2Jw_EGNXʄrr+~m4} Olc[ sQjЭVS⧳9R25|DzNI6T+@+t`;ح :$V6њRR0W<9q3Vv3>ǖ}B:ㆲKs DPWŊ-EHH *S5ZdVQ&7"lv 4R'q4[ ;+D m.~ ݴtWx:RI^o!]e&9Q);˗v "{j̝%r+ra.^}Y1ryn%bőr=k:{QÍZ)"țV0ٹuF ]0{mvxЯlBĂ-F[$/yK $i5mw]7{oy>lgYl,jg]&>{aIIc@Yt|%i%)ڱcԯs~b P~U /X=ܫq%h$q2}yqg'.󉳩9a Pio y7bn|H\9KT1T3兒F&ҌWcu:f-MbM=d>mΔxCd=?uT{9<Q緙,aծi9d\1+R1lg. LXoQUj's TMGS,K6so+ޖTHhVyV>|RM&{S86dbBws(^bz'dЂM}z $b"PWf7 C3RVjfhuj0uw91_\bM\Ȗp^H0-~'m׾M ~3-Wj{YBpERXkFG- ~x3޲Yϰ80fEE?'e퓻A85wy놧jY>ZՎ!C AcsfKG u)/ h!UKF6e;̵bunaOdCzqsPcSbuMlK= 9 ai }YєeT1ʤ ӛ3-j_R~)w!ZWlۿO)1EHV"V>RnF)Zy\,ώ^(.j^O+L9@ܤX^w;v`af&S |*iֽc!.dk/+]=Xr{i8 qk!i 0uwuAO'~hJ _>.M 0 m}0+xK-ŭcY[btMs(VAy!jIȒ&a!-zEzng;G9W/y28? endstream endobj 92 0 obj << /Length1 1177 /Length2 5987 /Length3 0 /Length 6762 /Filter /FlateDecode >> stream xmsw<[K轌%D{  cFD/B =ZD%z肈|<<笵>{'#B"2]-hq@`;BDi E rG*yB@H( B;{t@QPDFDJF\n-"W S uC!H' `o7iB !^oO0Kx῟ PByBC3^~~4/ :\w  j8q߱ (l3.#,aB^BpRYw/SzBwmp/<_)G(y&p7DC? wߘ @<'`gGC a!(p APGݏ  =!A/; #+ qsBzBDDDW. ru ̵M#weRAQ)qxSZBUAt%w%uJ&o%] x6ȝW~5j 1?{@_ A E^'}(KM 1ߥH;Cpם p#p'Ό Oiݜܿл!'04 ¥!yQ&,q0Bti]+_H)룜Za`G&2IJ+v S<#PjՕ!:t$GKQ7~ZujPi(Atn塇\U\5+M}]Ol 39ܥ,A<~iIؼwFQIn75^X"d2Rph`Q!)5-zܩ GUL!G›aI"ڔ$E"Zڱ0 m`<쩢4 m 2I.xϗrwS@\mO|QlI خlL&h*;%=hr ГyB%2Q|t.B:N>J3 XFVB:_<)6|l#b>} .j[]͆ƗDZl&|t`UONGuF)!^rXA?7BRclY爣vfC<"NelS{!+|,6|@uhE7zəHoGkxƩ!)"S6KUr/AZVbbSP1$nƊҭsC-G;[z{HޛBFnYv]1{Z*m&).*)ACjWhO[&弰e{C ,+/BܤoPlJ LҎ]9+l'o[ҢjψAaRY|| r^hCwx =i- !0|8#"XL+;"]@b8nF;D|ۀjEA+3p -ҹw:O~3K\6+L҉/">h}൮H[ZV6<}\fɢ1MRlB$V=kK%{'{Vu>YOZ=V`Kّl[27vH:oeGcyxD쭍~Ӄ,VDMZm8x"7opؘF[[& [YJveTβnbQ1MAeҢkn* L.J 56<6{b47z`gzKy誚;3q4ɵ_HgB1ֶ ߲L(PyY8{uopmب8{N}W."UA==%>+Ҡd*4TtzG?l8QNGëcE=sHnM/fdg,iSvgt;ԠΗb01زELK`4]G/u}4 Alp?tOFikHOV+@qn`7_I~Oqɰz^yXg=,(~@>=#si5#a}ֶPmӲ?\_M##Gd(&H6&:@oPymM凩nhӶEx:=(OYm=A q[ZrKj҅J{\m+6OIMT`_0WmX =#w}o-FZ,X°TKx&1rW*$㷌LX'**\4 Dό< |Լ <=}!׆Oq ` Y3q%Xh$;eHg`l4I&N‡ ' gz\ݭ=󚐷h_1/H:gf q\ݨmnF9e8MAz%{ًM ~MMRu2{j]ek^K k&LvWz|Vu>q"ĆFS;bUFfjKgUq^TtC#5Lc]O]Oyg_w,qjkD%p4VU\jԥjPfAӕO"Z$ZNJU̹p~`澬3ץZԮ7ݝA 3MD$3bVw[:@[YŃ5P͒Fv8쓔YhC`֘x&,qL3۰FP[+Y]zCr>XGZ3ߑa2֌D#JQ*^-ʸAɥvWS1<[hEI_Z~!OҹߎE'JM,"F}AwD̪e2y4P9WM3󸙊wt/%m ݽ.̡{߰^ l3]ccr$~UjP_XJ-}s6mi:3>Ł-Vg̎U" ɦI.f F%4wƶbGp"sg,=hzw|i 9;&I_3cVmlwk\}T^]ZkA˃79îvBIY(shUI|>`Aj/r{B]^C4s73pm }WM=|LJ9C^ZhwNm_DZw{|dZ+ϧygxO79-mhڤZv3bM:v%::T“uly216󰞲*E{6.=刯2hO3b sLlJoT+F獩RJmcE1DE/:4)*zK4L:$[L/4lq~QJ :D1X^VMmpޒ^085S!<ڼ9W,u4*CKkMϢ[Fwo6Yb1--q`RTpv$dC~<`]X}qzB1?VFh4vf"9vmeV Ȏi[wSGndNٵ+LAa8"޻2;-%bQhFeOO$,Րm%rXPaE-2}kv#FfPKc_h{ l9k^H"Wfs8:R7V~ηcyvGAG:yKADeW{(JcR,[ Nse `*k?zM7'\],/uR=vDhPwr=ުWGDquj<~Óc۽_ |d>N.\qEs+/&e _q$c\ $@F":Z6u"ܱ9o I Fe"hG,֪qL'-d},V6%=}ꑑ ZWVYmgVzmS2PD:I2krW<\oq*zpc Ӑ 8(7xں'tc2o-$?yEmDH3~/.ZG; 8quߵ8pjl17) 0= VA4A/6hm̿b=S3Ϧ*f!ro1N+TU~ZZWH.kr)1jC>t ,$uf05=& s-ssZvdГ1KlŜ1lu2IJR=v.rsyA"T6L6Pn*)k)5hez˛`bOc9PZDyov}r[pF lG= Xɩ|("H]v}:Ә8]i)%.oBos& HhW9c%{n$\6Yڀh_%Vx9L`asq&drƈPᰒ{䒭*Aj/ KOT8b﫧z\VtcXZx<07(0(vQlZvMTK0[xF1GGvgG&91jh zt]= \:?MLLw!FE⪧f>&d4 v`xWZJ7P M9RH,j@ u:s4QTSX>LO5hB2ndhhE(>_)ZOo[K|)q>Dݖ85Nu2]}a+)ca A @<؍ VvfQTQW&|;­XRTke(k%qF' yMKUHE?nDL%wGðX_>o v:r7a, lUVdV;{eZdM>Ue'beA h:;{ӺŅUٮ[a&{%d% kObxg i{11rF%Sl<ͱ\>F5lof)g:x*ħk2͎ x̕ϾA4=$ 2lAIp+%f#W\л`,Tp'i&' 7ټ 9m+IOq"4MxWhY½* sٟ۵R"iGc9Gg>\\a5/Y]}>ө7xPhh=瘪]\d7)Tydk!9F`#mzҤe*( rfRSg SÉSכ JF- pnzCT~%pO`Ry|e@ȄrBQ?&*:40/BcqmP{ۙ KFcۻs^ו5"h_YH$oYR\Cmʓ6f8C9!.gŅdoQuY `)2) *Y sr >iCbfhv_Le,2G84veIƾ4?F endstream endobj 94 0 obj << /Producer (pdfTeX-1.40.19) /Creator (TeX) /CreationDate (D:20191111182137-06'00') /ModDate (D:20191111182137-06'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.19 (TeX Live 2019/dev/Debian) kpathsea version 6.3.1/dev) >> endobj 8 0 obj << /Type /ObjStm /N 72 /First 604 /Length 3474 /Filter /FlateDecode >> stream x\Ys۶~ׯ[ɵ@x'/qqRٚ恖h$~\DqTN{"|g"ȰE)aZ+&"feR2BYB9 &$B 酠VQKTȄSwd0wa4 V aJMfaF2meF1N##M@0d08 -{IbidB+8A"RRM̢J iAXG=)rt"1GM d$ CQ J8LUQHСkHIG ICX/n_SPRB f<IHFF )+BݑH: kj`(d!A 􇄲= e8Q!l4O?fd(]eRd|/x ((0BȁO~C79Y[pg9.&O]-o~K >ΓxA-.l Tyܲy- u02-٢Kك vD6g2֛-"])?}GC!]n@WA uїiA,Hi/Z:_Y(KpEٴ.?CAI(D [h G 2 )nE"SJ~ѧv <)P`˟(Z8!do֏PћϞ~kXA}:;ۢ*QhNeUy>뾽ZZεv&uӢx!tA#R]["һϴ*CTd+FumFpuIWJڧ:[iu4[95~6{4`1MR`hhEhӨJT0ͰM;&+*h[m hWL>YP8"uBڎ|[I#Q^#jHA:x}`G4Z [s6f!7'mK]qz{mfVhoT֭R'm&[ye8"Rz)#fpӾ5\`LNʔQ}Ax3唣Ӆ4kn҄ڑ頂\[V4LJTf>SlD}W;&hF-PdSF kT֏u2:h5&+-ך>̶۴mINZ/kWY>3!rpN" X4:2]AEr{/h=RtG)\ w刱tT *Q:7  ʈF7.2AghTML*B+Z@Е ֖zbBQ!=L#ih$a4QZNM~hft*$ʊ;X R/fSWR;!HQJo>k ֳ*^56֩@[6ɓuQ]?C:TeH7>[Now4tL< t4^9O*UU|, Nc>4'3.lX$yƳY2Ioeo /ҏHރ&R4dliZ&IQe<#:'OhCc~Sa s_s_+~͟% "͗!xdy1Oo)<_%? !QXBK)}&i nTpvBH{g^A͓I<ݤ>&8'%4㶞m5W5 ]< YBJki:Hri)OUŨyKht2LjM Δ7KV<≯&hD};\ 9Χ'xe4[49j=WMY˓ِd:G#(|A`C&0`U(㊗4:7l2"-h8[%3`H6(aI1/,08I{i|Y>}3 }z=Sr[(cziC!EI<^ fR}W}Wub%]/Y@_ϩf1|AAC=C=?CihbM죉}4ubL3zZκGS* Ɵ:LԽFf#KPv۽tcW<\1mb۽tcW;$^"փj\lb~؍蚬i#2m>}a;ͯwI/]ӛewvBy!~H\F<϶V'Dh՟\\_>¢>vɷpf f "^5΢Eo[ +^_ <7DA3D292FC5B41DD668A7567033CCF5B>] /Length 243 /Filter /FlateDecode >> stream xѹ.qsX},ƾ}Wz M"Q4 #include #include #include #define PROT_NONE 0 #define PROT_READ 1 #define PROT_WRITE 2 #define PROT_EXEC 4 #define MAP_FILE 0 #define MAP_SHARED 1 #define MAP_PRIVATE 2 #define MAP_TYPE 0xf #define MAP_FIXED 0x10 #define MAP_ANONYMOUS 0x20 #define MAP_ANON MAP_ANONYMOUS #define MAP_FAILED ((void *)-1) /* Flags for msync. */ #define MS_ASYNC 1 #define MS_SYNC 2 #define MS_INVALIDATE 4 #ifndef FILE_MAP_EXECUTE #define FILE_MAP_EXECUTE 0x0020 #endif static int __map_mman_error(const DWORD err, const int deferr) { if (err == 0) return 0; //TODO: implement return err; } static DWORD __map_mmap_prot_page(const int prot) { DWORD protect = 0; if (prot == PROT_NONE) return protect; if ((prot & PROT_EXEC) != 0) { protect = ((prot & PROT_WRITE) != 0) ? PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ; } else { protect = ((prot & PROT_WRITE) != 0) ? PAGE_READWRITE : PAGE_READONLY; } return protect; } static DWORD __map_mmap_prot_file(const int prot) { DWORD desiredAccess = 0; if (prot == PROT_NONE) return desiredAccess; if ((prot & PROT_READ) != 0) desiredAccess |= FILE_MAP_READ; if ((prot & PROT_WRITE) != 0) desiredAccess |= FILE_MAP_WRITE; if ((prot & PROT_EXEC) != 0) desiredAccess |= FILE_MAP_EXECUTE; return desiredAccess; } inline void* mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off) { HANDLE fm, h; void * map = MAP_FAILED; #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable: 4293) #endif const DWORD dwFileOffsetLow = (sizeof(off_t) <= sizeof(DWORD)) ? (DWORD)off : (DWORD)(off & 0xFFFFFFFFL); const DWORD dwFileOffsetHigh = (sizeof(off_t) <= sizeof(DWORD)) ? (DWORD)0 : (DWORD)((off >> 32) & 0xFFFFFFFFL); const DWORD protect = __map_mmap_prot_page(prot); const DWORD desiredAccess = __map_mmap_prot_file(prot); const off_t maxSize = off + (off_t)len; const DWORD dwMaxSizeLow = (sizeof(off_t) <= sizeof(DWORD)) ? (DWORD)maxSize : (DWORD)(maxSize & 0xFFFFFFFFL); const DWORD dwMaxSizeHigh = (sizeof(off_t) <= sizeof(DWORD)) ? (DWORD)0 : (DWORD)((maxSize >> 32) & 0xFFFFFFFFL); #ifdef _MSC_VER #pragma warning(pop) #endif errno = 0; if (len == 0 /* Unsupported flag combinations */ || (flags & MAP_FIXED) != 0 /* Usupported protection combinations */ || prot == PROT_EXEC) { errno = EINVAL; return MAP_FAILED; } h = ((flags & MAP_ANONYMOUS) == 0) ? (HANDLE)_get_osfhandle(fildes) : INVALID_HANDLE_VALUE; if ((flags & MAP_ANONYMOUS) == 0 && h == INVALID_HANDLE_VALUE) { errno = EBADF; return MAP_FAILED; } fm = CreateFileMapping(h, NULL, protect, dwMaxSizeHigh, dwMaxSizeLow, NULL); if (fm == NULL) { errno = __map_mman_error(GetLastError(), EPERM); return MAP_FAILED; } map = MapViewOfFile(fm, desiredAccess, dwFileOffsetHigh, dwFileOffsetLow, len); CloseHandle(fm); if (map == NULL) { errno = __map_mman_error(GetLastError(), EPERM); return MAP_FAILED; } return map; } inline int munmap(void *addr, size_t len) { if (UnmapViewOfFile(addr)) return 0; errno = __map_mman_error(GetLastError(), EPERM); return -1; } inline int mprotect(void *addr, size_t len, int prot) { DWORD newProtect = __map_mmap_prot_page(prot); DWORD oldProtect = 0; if (VirtualProtect(addr, len, newProtect, &oldProtect)) return 0; errno = __map_mman_error(GetLastError(), EPERM); return -1; } inline int msync(void *addr, size_t len, int flags) { if (FlushViewOfFile(addr, len)) return 0; errno = __map_mman_error(GetLastError(), EPERM); return -1; } inline int mlock(const void *addr, size_t len) { if (VirtualLock((LPVOID)addr, len)) return 0; errno = __map_mman_error(GetLastError(), EPERM); return -1; } inline int munlock(const void *addr, size_t len) { if (VirtualUnlock((LPVOID)addr, len)) return 0; errno = __map_mman_error(GetLastError(), EPERM); return -1; } #if !defined(__MINGW32__) int ftruncate(int fd, unsigned int size) { if (fd < 0) { errno = EBADF; return -1; } HANDLE h = (HANDLE)_get_osfhandle(fd); unsigned int cur = SetFilePointer(h, 0, NULL, FILE_CURRENT); if (cur == ~0 || SetFilePointer(h, size, NULL, FILE_BEGIN) == ~0 || !SetEndOfFile(h)) { int error = GetLastError(); switch (GetLastError()) { case ERROR_INVALID_HANDLE: errno = EBADF; break; default: errno = EIO; break; } return -1; } return 0; } #endif #endif RcppAnnoy/inst/include/kissrandom.h0000644000176200001440000000447513365334011017117 0ustar liggesusers#ifndef KISSRANDOM_H #define KISSRANDOM_H #if defined(_MSC_VER) && _MSC_VER == 1500 typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #else #include #endif // KISS = "keep it simple, stupid", but high quality random number generator // http://www0.cs.ucl.ac.uk/staff/d.jones/GoodPracticeRNG.pdf -> "Use a good RNG and build it into your code" // http://mathforum.org/kb/message.jspa?messageID=6627731 // https://de.wikipedia.org/wiki/KISS_(Zufallszahlengenerator) // 32 bit KISS struct Kiss32Random { uint32_t x; uint32_t y; uint32_t z; uint32_t c; // seed must be != 0 Kiss32Random(uint32_t seed = 123456789) { x = seed; y = 362436000; z = 521288629; c = 7654321; } uint32_t kiss() { // Linear congruence generator x = 69069 * x + 12345; // Xor shift y ^= y << 13; y ^= y >> 17; y ^= y << 5; // Multiply-with-carry uint64_t t = 698769069ULL * z + c; c = t >> 32; z = (uint32_t) t; return x + y + z; } inline int flip() { // Draw random 0 or 1 return kiss() & 1; } inline size_t index(size_t n) { // Draw random integer between 0 and n-1 where n is at most the number of data points you have return kiss() % n; } inline void set_seed(uint32_t seed) { x = seed; } }; // 64 bit KISS. Use this if you have more than about 2^24 data points ("big data" ;) ) struct Kiss64Random { uint64_t x; uint64_t y; uint64_t z; uint64_t c; // seed must be != 0 Kiss64Random(uint64_t seed = 1234567890987654321ULL) { x = seed; y = 362436362436362436ULL; z = 1066149217761810ULL; c = 123456123456123456ULL; } uint64_t kiss() { // Linear congruence generator z = 6906969069LL*z+1234567; // Xor shift y ^= (y<<13); y ^= (y>>17); y ^= (y<<43); // Multiply-with-carry (uint128_t t = (2^58 + 1) * x + c; c = t >> 64; x = (uint64_t) t) uint64_t t = (x<<58)+c; c = (x>>6); x += t; c += (x #include #ifndef _MSC_VER #include #endif #include #include #include #include #include #if defined(_MSC_VER) && _MSC_VER == 1500 typedef unsigned char uint8_t; typedef signed __int32 int32_t; typedef unsigned __int64 uint64_t; #else #include #endif #if defined(_MSC_VER) || defined(__MINGW32__) #ifndef NOMINMAX #define NOMINMAX #endif #include "mman.h" #include #else #include #endif #include #include #include #include #include #include #include #ifdef _MSC_VER // Needed for Visual Studio to disable runtime checks for mempcy #pragma runtime_checks("s", off) #endif // This allows others to supply their own logger / error printer without // requiring Annoy to import their headers. See RcppAnnoy for a use case. #ifndef __ERROR_PRINTER_OVERRIDE__ #define showUpdate(...) { fprintf(stderr, __VA_ARGS__ ); } #else #define showUpdate(...) { __ERROR_PRINTER_OVERRIDE__( __VA_ARGS__ ); } #endif #ifndef _MSC_VER #define popcount __builtin_popcountll #else // See #293, #358 #define isnan(x) _isnan(x) #define popcount cole_popcount #endif #if !defined(NO_MANUAL_VECTORIZATION) && defined(__GNUC__) && (__GNUC__ >6) && defined(__AVX512F__) // See #402 #pragma message "Using 512-bit AVX instructions" #define USE_AVX512 #elif !defined(NO_MANUAL_VECTORIZATION) && defined(__AVX__) && defined (__SSE__) && defined(__SSE2__) && defined(__SSE3__) #pragma message "Using 128-bit AVX instructions" #define USE_AVX #else #pragma message "Using no AVX instructions" #endif #if defined(USE_AVX) || defined(USE_AVX512) #if defined(_MSC_VER) #include #elif defined(__GNUC__) #include #endif #endif #ifndef ANNOY_NODE_ATTRIBUTE #ifndef _MSC_VER #define ANNOY_NODE_ATTRIBUTE __attribute__((__packed__)) // TODO: this is turned on by default, but may not work for all architectures! Need to investigate. #else #define ANNOY_NODE_ATTRIBUTE #endif #endif using std::vector; using std::pair; using std::numeric_limits; using std::make_pair; inline void* remap_memory(void* _ptr, int _fd, size_t old_size, size_t new_size) { #ifdef __linux__ _ptr = mremap(_ptr, old_size, new_size, MREMAP_MAYMOVE); #else munmap(_ptr, old_size); #ifdef MAP_POPULATE _ptr = mmap(_ptr, new_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, _fd, 0); #else _ptr = mmap(_ptr, new_size, PROT_READ | PROT_WRITE, MAP_SHARED, _fd, 0); #endif #endif return _ptr; } namespace { template inline Node* get_node_ptr(const void* _nodes, const size_t _s, const S i) { return (Node*)((uint8_t *)_nodes + (_s * i)); } template inline T dot(const T* x, const T* y, int f) { T s = 0; for (int z = 0; z < f; z++) { s += (*x) * (*y); x++; y++; } return s; } template inline T manhattan_distance(const T* x, const T* y, int f) { T d = 0.0; for (int i = 0; i < f; i++) d += fabs(x[i] - y[i]); return d; } template inline T euclidean_distance(const T* x, const T* y, int f) { // Don't use dot-product: avoid catastrophic cancellation in #314. T d = 0.0; for (int i = 0; i < f; ++i) { const T tmp=*x - *y; d += tmp * tmp; ++x; ++y; } return d; } #ifdef USE_AVX // Horizontal single sum of 256bit vector. inline float hsum256_ps_avx(__m256 v) { const __m128 x128 = _mm_add_ps(_mm256_extractf128_ps(v, 1), _mm256_castps256_ps128(v)); const __m128 x64 = _mm_add_ps(x128, _mm_movehl_ps(x128, x128)); const __m128 x32 = _mm_add_ss(x64, _mm_shuffle_ps(x64, x64, 0x55)); return _mm_cvtss_f32(x32); } template<> inline float dot(const float* x, const float *y, int f) { float result = 0; if (f > 7) { __m256 d = _mm256_setzero_ps(); for (; f > 7; f -= 8) { d = _mm256_add_ps(d, _mm256_mul_ps(_mm256_loadu_ps(x), _mm256_loadu_ps(y))); x += 8; y += 8; } // Sum all floats in dot register. result += hsum256_ps_avx(d); } // Don't forget the remaining values. for (; f > 0; f--) { result += *x * *y; x++; y++; } return result; } template<> inline float manhattan_distance(const float* x, const float* y, int f) { float result = 0; int i = f; if (f > 7) { __m256 manhattan = _mm256_setzero_ps(); __m256 minus_zero = _mm256_set1_ps(-0.0f); for (; i > 7; i -= 8) { const __m256 x_minus_y = _mm256_sub_ps(_mm256_loadu_ps(x), _mm256_loadu_ps(y)); const __m256 distance = _mm256_andnot_ps(minus_zero, x_minus_y); // Absolute value of x_minus_y (forces sign bit to zero) manhattan = _mm256_add_ps(manhattan, distance); x += 8; y += 8; } // Sum all floats in manhattan register. result = hsum256_ps_avx(manhattan); } // Don't forget the remaining values. for (; i > 0; i--) { result += fabsf(*x - *y); x++; y++; } return result; } template<> inline float euclidean_distance(const float* x, const float* y, int f) { float result=0; if (f > 7) { __m256 d = _mm256_setzero_ps(); for (; f > 7; f -= 8) { const __m256 diff = _mm256_sub_ps(_mm256_loadu_ps(x), _mm256_loadu_ps(y)); d = _mm256_add_ps(d, _mm256_mul_ps(diff, diff)); // no support for fmadd in AVX... x += 8; y += 8; } // Sum all floats in dot register. result = hsum256_ps_avx(d); } // Don't forget the remaining values. for (; f > 0; f--) { float tmp = *x - *y; result += tmp * tmp; x++; y++; } return result; } #endif #ifdef USE_AVX512 template<> inline float dot(const float* x, const float *y, int f) { float result = 0; if (f > 15) { __m512 d = _mm512_setzero_ps(); for (; f > 15; f -= 16) { //AVX512F includes FMA d = _mm512_fmadd_ps(_mm512_loadu_ps(x), _mm512_loadu_ps(y), d); x += 16; y += 16; } // Sum all floats in dot register. result += _mm512_reduce_add_ps(d); } // Don't forget the remaining values. for (; f > 0; f--) { result += *x * *y; x++; y++; } return result; } template<> inline float manhattan_distance(const float* x, const float* y, int f) { float result = 0; int i = f; if (f > 15) { __m512 manhattan = _mm512_setzero_ps(); for (; i > 15; i -= 16) { const __m512 x_minus_y = _mm512_sub_ps(_mm512_loadu_ps(x), _mm512_loadu_ps(y)); manhattan = _mm512_add_ps(manhattan, _mm512_abs_ps(x_minus_y)); x += 16; y += 16; } // Sum all floats in manhattan register. result = _mm512_reduce_add_ps(manhattan); } // Don't forget the remaining values. for (; i > 0; i--) { result += fabsf(*x - *y); x++; y++; } return result; } template<> inline float euclidean_distance(const float* x, const float* y, int f) { float result=0; if (f > 15) { __m512 d = _mm512_setzero_ps(); for (; f > 15; f -= 16) { const __m512 diff = _mm512_sub_ps(_mm512_loadu_ps(x), _mm512_loadu_ps(y)); d = _mm512_fmadd_ps(diff, diff, d); x += 16; y += 16; } // Sum all floats in dot register. result = _mm512_reduce_add_ps(d); } // Don't forget the remaining values. for (; f > 0; f--) { float tmp = *x - *y; result += tmp * tmp; x++; y++; } return result; } #endif template inline T get_norm(T* v, int f) { return sqrt(dot(v, v, f)); } template inline void two_means(const vector& nodes, int f, Random& random, bool cosine, Node* p, Node* q) { /* This algorithm is a huge heuristic. Empirically it works really well, but I can't motivate it well. The basic idea is to keep two centroids and assign points to either one of them. We weight each centroid by the number of points assigned to it, so to balance it. */ static int iteration_steps = 200; size_t count = nodes.size(); size_t i = random.index(count); size_t j = random.index(count-1); j += (j >= i); // ensure that i != j Distance::template copy_node(p, nodes[i], f); Distance::template copy_node(q, nodes[j], f); if (cosine) { Distance::template normalize(p, f); Distance::template normalize(q, f); } Distance::init_node(p, f); Distance::init_node(q, f); int ic = 1, jc = 1; for (int l = 0; l < iteration_steps; l++) { size_t k = random.index(count); T di = ic * Distance::distance(p, nodes[k], f), dj = jc * Distance::distance(q, nodes[k], f); T norm = cosine ? get_norm(nodes[k]->v, f) : 1.0; if (!(norm > T(0))) { continue; } if (di < dj) { for (int z = 0; z < f; z++) p->v[z] = (p->v[z] * ic + nodes[k]->v[z] / norm) / (ic + 1); Distance::init_node(p, f); ic++; } else if (dj < di) { for (int z = 0; z < f; z++) q->v[z] = (q->v[z] * jc + nodes[k]->v[z] / norm) / (jc + 1); Distance::init_node(q, f); jc++; } } } } // namespace struct Base { template static inline void preprocess(void* nodes, size_t _s, const S node_count, const int f) { // Override this in specific metric structs below if you need to do any pre-processing // on the entire set of nodes passed into this index. } template static inline void zero_value(Node* dest) { // Initialize any fields that require sane defaults within this node. } template static inline void copy_node(Node* dest, const Node* source, const int f) { memcpy(dest->v, source->v, f * sizeof(T)); } template static inline void normalize(Node* node, int f) { T norm = get_norm(node->v, f); if (norm > 0) { for (int z = 0; z < f; z++) node->v[z] /= norm; } } }; struct Angular : Base { template struct ANNOY_NODE_ATTRIBUTE Node { /* * We store a binary tree where each node has two things * - A vector associated with it * - Two children * All nodes occupy the same amount of memory * All nodes with n_descendants == 1 are leaf nodes. * A memory optimization is that for nodes with 2 <= n_descendants <= K, * we skip the vector. Instead we store a list of all descendants. K is * determined by the number of items that fits in the space of the vector. * For nodes with n_descendants == 1 the vector is a data point. * For nodes with n_descendants > K the vector is the normal of the split plane. * Note that we can't really do sizeof(node) because we cheat and allocate * more memory to be able to fit the vector outside */ S n_descendants; union { S children[2]; // Will possibly store more than 2 T norm; }; T v[1]; // We let this one overflow intentionally. Need to allocate at least 1 to make GCC happy }; template static inline T distance(const Node* x, const Node* y, int f) { // want to calculate (a/|a| - b/|b|)^2 // = a^2 / a^2 + b^2 / b^2 - 2ab/|a||b| // = 2 - 2cos T pp = x->norm ? x->norm : dot(x->v, x->v, f); // For backwards compatibility reasons, we need to fall back and compute the norm here T qq = y->norm ? y->norm : dot(y->v, y->v, f); T pq = dot(x->v, y->v, f); T ppqq = pp * qq; if (ppqq > 0) return 2.0 - 2.0 * pq / sqrt(ppqq); else return 2.0; // cos is 0 } template static inline T margin(const Node* n, const T* y, int f) { return dot(n->v, y, f); } template static inline bool side(const Node* n, const T* y, int f, Random& random) { T dot = margin(n, y, f); if (dot != 0) return (dot > 0); else return random.flip(); } template static inline void create_split(const vector*>& nodes, int f, size_t s, Random& random, Node* n) { Node* p = (Node*)alloca(s); Node* q = (Node*)alloca(s); two_means >(nodes, f, random, true, p, q); for (int z = 0; z < f; z++) n->v[z] = p->v[z] - q->v[z]; Base::normalize >(n, f); } template static inline T normalized_distance(T distance) { // Used when requesting distances from Python layer // Turns out sometimes the squared distance is -0.0 // so we have to make sure it's a positive number. return sqrt(std::max(distance, T(0))); } template static inline T pq_distance(T distance, T margin, int child_nr) { if (child_nr == 0) margin = -margin; return std::min(distance, margin); } template static inline T pq_initial_value() { return numeric_limits::infinity(); } template static inline void init_node(Node* n, int f) { n->norm = dot(n->v, n->v, f); } static const char* name() { return "angular"; } }; struct DotProduct : Angular { template struct ANNOY_NODE_ATTRIBUTE Node { /* * This is an extension of the Angular node with an extra attribute for the scaled norm. */ S n_descendants; S children[2]; // Will possibly store more than 2 T dot_factor; T v[1]; // We let this one overflow intentionally. Need to allocate at least 1 to make GCC happy }; static const char* name() { return "dot"; } template static inline T distance(const Node* x, const Node* y, int f) { return -dot(x->v, y->v, f); } template static inline void zero_value(Node* dest) { dest->dot_factor = 0; } template static inline void init_node(Node* n, int f) { } template static inline void copy_node(Node* dest, const Node* source, const int f) { memcpy(dest->v, source->v, f * sizeof(T)); dest->dot_factor = source->dot_factor; } template static inline void create_split(const vector*>& nodes, int f, size_t s, Random& random, Node* n) { Node* p = (Node*)alloca(s); Node* q = (Node*)alloca(s); DotProduct::zero_value(p); DotProduct::zero_value(q); two_means >(nodes, f, random, true, p, q); for (int z = 0; z < f; z++) n->v[z] = p->v[z] - q->v[z]; n->dot_factor = p->dot_factor - q->dot_factor; DotProduct::normalize >(n, f); } template static inline void normalize(Node* node, int f) { T norm = sqrt(dot(node->v, node->v, f) + pow(node->dot_factor, 2)); if (norm > 0) { for (int z = 0; z < f; z++) node->v[z] /= norm; node->dot_factor /= norm; } } template static inline T margin(const Node* n, const T* y, int f) { return dot(n->v, y, f) + (n->dot_factor * n->dot_factor); } template static inline bool side(const Node* n, const T* y, int f, Random& random) { T dot = margin(n, y, f); if (dot != 0) return (dot > 0); else return random.flip(); } template static inline T normalized_distance(T distance) { return -distance; } template static inline void preprocess(void* nodes, size_t _s, const S node_count, const int f) { // This uses a method from Microsoft Research for transforming inner product spaces to cosine/angular-compatible spaces. // (Bachrach et al., 2014, see https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/XboxInnerProduct.pdf) // Step one: compute the norm of each vector and store that in its extra dimension (f-1) for (S i = 0; i < node_count; i++) { Node* node = get_node_ptr(nodes, _s, i); T norm = sqrt(dot(node->v, node->v, f)); if (isnan(norm)) norm = 0; node->dot_factor = norm; } // Step two: find the maximum norm T max_norm = 0; for (S i = 0; i < node_count; i++) { Node* node = get_node_ptr(nodes, _s, i); if (node->dot_factor > max_norm) { max_norm = node->dot_factor; } } // Step three: set each vector's extra dimension to sqrt(max_norm^2 - norm^2) for (S i = 0; i < node_count; i++) { Node* node = get_node_ptr(nodes, _s, i); T node_norm = node->dot_factor; T dot_factor = sqrt(pow(max_norm, static_cast(2.0)) - pow(node_norm, static_cast(2.0))); if (isnan(dot_factor)) dot_factor = 0; node->dot_factor = dot_factor; } } }; struct Hamming : Base { template struct ANNOY_NODE_ATTRIBUTE Node { S n_descendants; S children[2]; T v[1]; }; static const size_t max_iterations = 20; template static inline T pq_distance(T distance, T margin, int child_nr) { return distance - (margin != (unsigned int) child_nr); } template static inline T pq_initial_value() { return numeric_limits::max(); } template static inline int cole_popcount(T v) { // Note: Only used with MSVC 9, which lacks intrinsics and fails to // calculate std::bitset::count for v > 32bit. Uses the generalized // approach by Eric Cole. // See https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSet64 v = v - ((v >> 1) & (T)~(T)0/3); v = (v & (T)~(T)0/15*3) + ((v >> 2) & (T)~(T)0/15*3); v = (v + (v >> 4)) & (T)~(T)0/255*15; return (T)(v * ((T)~(T)0/255)) >> (sizeof(T) - 1) * 8; } template static inline T distance(const Node* x, const Node* y, int f) { size_t dist = 0; for (int i = 0; i < f; i++) { dist += popcount(x->v[i] ^ y->v[i]); } return dist; } template static inline bool margin(const Node* n, const T* y, int f) { static const size_t n_bits = sizeof(T) * 8; T chunk = n->v[0] / n_bits; return (y[chunk] & (static_cast(1) << (n_bits - 1 - (n->v[0] % n_bits)))) != 0; } template static inline bool side(const Node* n, const T* y, int f, Random& random) { return margin(n, y, f); } template static inline void create_split(const vector*>& nodes, int f, size_t s, Random& random, Node* n) { size_t cur_size = 0; size_t i = 0; int dim = f * 8 * sizeof(T); for (; i < max_iterations; i++) { // choose random position to split at n->v[0] = random.index(dim); cur_size = 0; for (typename vector*>::const_iterator it = nodes.begin(); it != nodes.end(); ++it) { if (margin(n, (*it)->v, f)) { cur_size++; } } if (cur_size > 0 && cur_size < nodes.size()) { break; } } // brute-force search for splitting coordinate if (i == max_iterations) { int j = 0; for (; j < dim; j++) { n->v[0] = j; cur_size = 0; for (typename vector*>::const_iterator it = nodes.begin(); it != nodes.end(); ++it) { if (margin(n, (*it)->v, f)) { cur_size++; } } if (cur_size > 0 && cur_size < nodes.size()) { break; } } } } template static inline T normalized_distance(T distance) { return distance; } template static inline void init_node(Node* n, int f) { } static const char* name() { return "hamming"; } }; struct Minkowski : Base { template struct ANNOY_NODE_ATTRIBUTE Node { S n_descendants; T a; // need an extra constant term to determine the offset of the plane S children[2]; T v[1]; }; template static inline T margin(const Node* n, const T* y, int f) { return n->a + dot(n->v, y, f); } template static inline bool side(const Node* n, const T* y, int f, Random& random) { T dot = margin(n, y, f); if (dot != 0) return (dot > 0); else return random.flip(); } template static inline T pq_distance(T distance, T margin, int child_nr) { if (child_nr == 0) margin = -margin; return std::min(distance, margin); } template static inline T pq_initial_value() { return numeric_limits::infinity(); } }; struct Euclidean : Minkowski { template static inline T distance(const Node* x, const Node* y, int f) { return euclidean_distance(x->v, y->v, f); } template static inline void create_split(const vector*>& nodes, int f, size_t s, Random& random, Node* n) { Node* p = (Node*)alloca(s); Node* q = (Node*)alloca(s); two_means >(nodes, f, random, false, p, q); for (int z = 0; z < f; z++) n->v[z] = p->v[z] - q->v[z]; Base::normalize >(n, f); n->a = 0.0; for (int z = 0; z < f; z++) n->a += -n->v[z] * (p->v[z] + q->v[z]) / 2; } template static inline T normalized_distance(T distance) { return sqrt(std::max(distance, T(0))); } template static inline void init_node(Node* n, int f) { } static const char* name() { return "euclidean"; } }; struct Manhattan : Minkowski { template static inline T distance(const Node* x, const Node* y, int f) { return manhattan_distance(x->v, y->v, f); } template static inline void create_split(const vector*>& nodes, int f, size_t s, Random& random, Node* n) { Node* p = (Node*)alloca(s); Node* q = (Node*)alloca(s); two_means >(nodes, f, random, false, p, q); for (int z = 0; z < f; z++) n->v[z] = p->v[z] - q->v[z]; Base::normalize >(n, f); n->a = 0.0; for (int z = 0; z < f; z++) n->a += -n->v[z] * (p->v[z] + q->v[z]) / 2; } template static inline T normalized_distance(T distance) { return std::max(distance, T(0)); } template static inline void init_node(Node* n, int f) { } static const char* name() { return "manhattan"; } }; template class AnnoyIndexInterface { public: virtual ~AnnoyIndexInterface() {}; virtual bool add_item(S item, const T* w, char** error=NULL) = 0; virtual bool build(int q, char** error=NULL) = 0; virtual bool unbuild(char** error=NULL) = 0; virtual bool save(const char* filename, bool prefault=false, char** error=NULL) = 0; virtual void unload() = 0; virtual bool load(const char* filename, bool prefault=false, char** error=NULL) = 0; virtual T get_distance(S i, S j) const = 0; virtual void get_nns_by_item(S item, size_t n, size_t search_k, vector* result, vector* distances) const = 0; virtual void get_nns_by_vector(const T* w, size_t n, size_t search_k, vector* result, vector* distances) const = 0; virtual S get_n_items() const = 0; virtual S get_n_trees() const = 0; virtual void verbose(bool v) = 0; virtual void get_item(S item, T* v) const = 0; virtual void set_seed(int q) = 0; virtual bool on_disk_build(const char* filename, char** error=NULL) = 0; }; template class AnnoyIndex : public AnnoyIndexInterface { /* * We use random projection to build a forest of binary trees of all items. * Basically just split the hyperspace into two sides by a hyperplane, * then recursively split each of those subtrees etc. * We create a tree like this q times. The default q is determined automatically * in such a way that we at most use 2x as much memory as the vectors take. */ public: typedef Distance D; typedef typename D::template Node Node; protected: const int _f; size_t _s; S _n_items; Random _random; void* _nodes; // Could either be mmapped, or point to a memory buffer that we reallocate S _n_nodes; S _nodes_size; vector _roots; S _K; bool _loaded; bool _verbose; int _fd; bool _on_disk; bool _built; public: AnnoyIndex(int f) : _f(f), _random() { _s = offsetof(Node, v) + _f * sizeof(T); // Size of each node _verbose = false; _built = false; _K = (S) (((size_t) (_s - offsetof(Node, children))) / sizeof(S)); // Max number of descendants to fit into node reinitialize(); // Reset everything } ~AnnoyIndex() { unload(); } int get_f() const { return _f; } bool add_item(S item, const T* w, char** error=NULL) { return add_item_impl(item, w, error); } template bool add_item_impl(S item, const W& w, char** error=NULL) { if (_loaded) { showUpdate("You can't add an item to a loaded index\n"); if (error) *error = (char *)"You can't add an item to a loaded index"; return false; } _allocate_size(item + 1); Node* n = _get(item); D::zero_value(n); n->children[0] = 0; n->children[1] = 0; n->n_descendants = 1; for (int z = 0; z < _f; z++) n->v[z] = w[z]; D::init_node(n, _f); if (item >= _n_items) _n_items = item + 1; return true; } bool on_disk_build(const char* file, char** error=NULL) { _on_disk = true; _fd = open(file, O_RDWR | O_CREAT | O_TRUNC, (int) 0600); if (_fd == -1) { showUpdate("Error: file descriptor is -1\n"); if (error) *error = strerror(errno); _fd = 0; return false; } _nodes_size = 1; if (ftruncate(_fd, _s * _nodes_size) == -1) { showUpdate("Error truncating file: %s\n", strerror(errno)); if (error) *error = strerror(errno); return false; } #ifdef MAP_POPULATE _nodes = (Node*) mmap(0, _s * _nodes_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, _fd, 0); #else _nodes = (Node*) mmap(0, _s * _nodes_size, PROT_READ | PROT_WRITE, MAP_SHARED, _fd, 0); #endif return true; } bool build(int q, char** error=NULL) { if (_loaded) { showUpdate("You can't build a loaded index\n"); if (error) *error = (char *)"You can't build a loaded index"; return false; } if (_built) { showUpdate("You can't build a built index\n"); if (error) *error = (char *)"You can't build a built index"; return false; } D::template preprocess(_nodes, _s, _n_items, _f); _n_nodes = _n_items; while (1) { if (q == -1 && _n_nodes >= _n_items * 2) break; if (q != -1 && _roots.size() >= (size_t)q) break; if (_verbose) showUpdate("pass %zd...\n", _roots.size()); vector indices; for (S i = 0; i < _n_items; i++) { if (_get(i)->n_descendants >= 1) // Issue #223 indices.push_back(i); } _roots.push_back(_make_tree(indices, true)); } // Also, copy the roots into the last segment of the array // This way we can load them faster without reading the whole file _allocate_size(_n_nodes + (S)_roots.size()); for (size_t i = 0; i < _roots.size(); i++) memcpy(_get(_n_nodes + (S)i), _get(_roots[i]), _s); _n_nodes += _roots.size(); if (_verbose) showUpdate("has %d nodes\n", _n_nodes); if (_on_disk) { _nodes = remap_memory(_nodes, _fd, _s * _nodes_size, _s * _n_nodes); if (ftruncate(_fd, _s * _n_nodes)) { // TODO: this probably creates an index in a corrupt state... not sure what to do showUpdate("Error truncating file: %s\n", strerror(errno)); if (error) *error = strerror(errno); return false; } _nodes_size = _n_nodes; } _built = true; return true; } bool unbuild(char** error=NULL) { if (_loaded) { showUpdate("You can't unbuild a loaded index\n"); if (error) *error = (char *)"You can't unbuild a loaded index"; return false; } _roots.clear(); _n_nodes = _n_items; _built = false; return true; } bool save(const char* filename, bool prefault=false, char** error=NULL) { if (!_built) { showUpdate("You can't save an index that hasn't been built\n"); if (error) *error = (char *)"You can't save an index that hasn't been built"; return false; } if (_on_disk) { return true; } else { // Delete file if it already exists (See issue #335) unlink(filename); //printf("path: %s\n", filename); FILE *f = fopen(filename, "wb"); if (f == NULL) { showUpdate("Unable to open: %s\n", strerror(errno)); if (error) *error = strerror(errno); return false; } if (fwrite(_nodes, _s, _n_nodes, f) != (size_t) _n_nodes) { showUpdate("Unable to write: %s\n", strerror(errno)); if (error) *error = strerror(errno); return false; } if (fclose(f) == EOF) { showUpdate("Unable to close: %s\n", strerror(errno)); if (error) *error = strerror(errno); return false; } unload(); return load(filename, prefault, error); } } void reinitialize() { _fd = 0; _nodes = NULL; _loaded = false; _n_items = 0; _n_nodes = 0; _nodes_size = 0; _on_disk = false; _roots.clear(); } void unload() { if (_on_disk && _fd) { close(_fd); munmap(_nodes, _s * _nodes_size); } else { if (_fd) { // we have mmapped data close(_fd); munmap(_nodes, _n_nodes * _s); } else if (_nodes) { // We have heap allocated data free(_nodes); } } reinitialize(); if (_verbose) showUpdate("unloaded\n"); } bool load(const char* filename, bool prefault=false, char** error=NULL) { _fd = open(filename, O_RDONLY, (int)0400); if (_fd == -1) { showUpdate("Error: file descriptor is -1\n"); if (error) *error = strerror(errno); _fd = 0; return false; } off_t size = lseek(_fd, 0, SEEK_END); if (size == -1) { showUpdate("lseek returned -1\n"); if (error) *error = strerror(errno); return false; } else if (size == 0) { showUpdate("Size of file is zero\n"); if (error) *error = (char *)"Size of file is zero"; return false; } else if (size % _s) { // Something is fishy with this index! showUpdate("Error: index size %zu is not a multiple of vector size %zu\n", (size_t)size, _s); if (error) *error = (char *)"Index size is not a multiple of vector size"; return false; } int flags = MAP_SHARED; if (prefault) { #ifdef MAP_POPULATE flags |= MAP_POPULATE; #else showUpdate("prefault is set to true, but MAP_POPULATE is not defined on this platform"); #endif } _nodes = (Node*)mmap(0, size, PROT_READ, flags, _fd, 0); _n_nodes = (S)(size / _s); // Find the roots by scanning the end of the file and taking the nodes with most descendants _roots.clear(); S m = -1; for (S i = _n_nodes - 1; i >= 0; i--) { S k = _get(i)->n_descendants; if (m == -1 || k == m) { _roots.push_back(i); m = k; } else { break; } } // hacky fix: since the last root precedes the copy of all roots, delete it if (_roots.size() > 1 && _get(_roots.front())->children[0] == _get(_roots.back())->children[0]) _roots.pop_back(); _loaded = true; _built = true; _n_items = m; if (_verbose) showUpdate("found %lu roots with degree %d\n", _roots.size(), m); return true; } T get_distance(S i, S j) const { return D::normalized_distance(D::distance(_get(i), _get(j), _f)); } void get_nns_by_item(S item, size_t n, size_t search_k, vector* result, vector* distances) const { // TODO: handle OOB const Node* m = _get(item); _get_all_nns(m->v, n, search_k, result, distances); } void get_nns_by_vector(const T* w, size_t n, size_t search_k, vector* result, vector* distances) const { _get_all_nns(w, n, search_k, result, distances); } S get_n_items() const { return _n_items; } S get_n_trees() const { return _roots.size(); } void verbose(bool v) { _verbose = v; } void get_item(S item, T* v) const { // TODO: handle OOB Node* m = _get(item); memcpy(v, m->v, (_f) * sizeof(T)); } void set_seed(int seed) { _random.set_seed(seed); } protected: void _allocate_size(S n) { if (n > _nodes_size) { const double reallocation_factor = 1.3; S new_nodes_size = std::max(n, (S) ((_nodes_size + 1) * reallocation_factor)); void *old = _nodes; if (_on_disk) { int rc = ftruncate(_fd, _s * new_nodes_size); if (_verbose && rc) showUpdate("File truncation error\n"); _nodes = remap_memory(_nodes, _fd, _s * _nodes_size, _s * new_nodes_size); } else { _nodes = realloc(_nodes, _s * new_nodes_size); memset((char *) _nodes + (_nodes_size * _s) / sizeof(char), 0, (new_nodes_size - _nodes_size) * _s); } _nodes_size = new_nodes_size; if (_verbose) showUpdate("Reallocating to %d nodes: old_address=%p, new_address=%p\n", new_nodes_size, old, _nodes); } } inline Node* _get(const S i) const { return get_node_ptr(_nodes, _s, i); } S _make_tree(const vector& indices, bool is_root) { // The basic rule is that if we have <= _K items, then it's a leaf node, otherwise it's a split node. // There's some regrettable complications caused by the problem that root nodes have to be "special": // 1. We identify root nodes by the arguable logic that _n_items == n->n_descendants, regardless of how many descendants they actually have // 2. Root nodes with only 1 child need to be a "dummy" parent // 3. Due to the _n_items "hack", we need to be careful with the cases where _n_items <= _K or _n_items > _K if (indices.size() == 1 && !is_root) return indices[0]; if (indices.size() <= (size_t)_K && (!is_root || (size_t)_n_items <= (size_t)_K || indices.size() == 1)) { _allocate_size(_n_nodes + 1); S item = _n_nodes++; Node* m = _get(item); m->n_descendants = is_root ? _n_items : (S)indices.size(); // Using std::copy instead of a loop seems to resolve issues #3 and #13, // probably because gcc 4.8 goes overboard with optimizations. // Using memcpy instead of std::copy for MSVC compatibility. #235 // Only copy when necessary to avoid crash in MSVC 9. #293 if (!indices.empty()) memcpy(m->children, &indices[0], indices.size() * sizeof(S)); return item; } vector children; for (size_t i = 0; i < indices.size(); i++) { S j = indices[i]; Node* n = _get(j); if (n) children.push_back(n); } vector children_indices[2]; Node* m = (Node*)alloca(_s); D::create_split(children, _f, _s, _random, m); for (size_t i = 0; i < indices.size(); i++) { S j = indices[i]; Node* n = _get(j); if (n) { bool side = D::side(m, n->v, _f, _random); children_indices[side].push_back(j); } else { showUpdate("No node for index %d?\n", j); } } // If we didn't find a hyperplane, just randomize sides as a last option while (children_indices[0].size() == 0 || children_indices[1].size() == 0) { if (_verbose) showUpdate("\tNo hyperplane found (left has %ld children, right has %ld children)\n", children_indices[0].size(), children_indices[1].size()); if (_verbose && indices.size() > 100000) showUpdate("Failed splitting %lu items\n", indices.size()); children_indices[0].clear(); children_indices[1].clear(); // Set the vector to 0.0 for (int z = 0; z < _f; z++) m->v[z] = 0.0; for (size_t i = 0; i < indices.size(); i++) { S j = indices[i]; // Just randomize... children_indices[_random.flip()].push_back(j); } } int flip = (children_indices[0].size() > children_indices[1].size()); m->n_descendants = is_root ? _n_items : (S)indices.size(); for (int side = 0; side < 2; side++) { // run _make_tree for the smallest child first (for cache locality) m->children[side^flip] = _make_tree(children_indices[side^flip], false); } _allocate_size(_n_nodes + 1); S item = _n_nodes++; memcpy(_get(item), m, _s); return item; } void _get_all_nns(const T* v, size_t n, size_t search_k, vector* result, vector* distances) const { Node* v_node = (Node *)alloca(_s); D::template zero_value(v_node); memcpy(v_node->v, v, sizeof(T) * _f); D::init_node(v_node, _f); std::priority_queue > q; if (search_k == (size_t)-1) { search_k = n * _roots.size(); } for (size_t i = 0; i < _roots.size(); i++) { q.push(make_pair(Distance::template pq_initial_value(), _roots[i])); } std::vector nns; while (nns.size() < search_k && !q.empty()) { const pair& top = q.top(); T d = top.first; S i = top.second; Node* nd = _get(i); q.pop(); if (nd->n_descendants == 1 && i < _n_items) { nns.push_back(i); } else if (nd->n_descendants <= _K) { const S* dst = nd->children; nns.insert(nns.end(), dst, &dst[nd->n_descendants]); } else { T margin = D::margin(nd, v, _f); q.push(make_pair(D::pq_distance(d, margin, 1), static_cast(nd->children[1]))); q.push(make_pair(D::pq_distance(d, margin, 0), static_cast(nd->children[0]))); } } // Get distances for all items // To avoid calculating distance multiple times for any items, sort by id std::sort(nns.begin(), nns.end()); vector > nns_dist; S last = -1; for (size_t i = 0; i < nns.size(); i++) { S j = nns[i]; if (j == last) continue; last = j; if (_get(j)->n_descendants == 1) // This is only to guard a really obscure case, #284 nns_dist.push_back(make_pair(D::distance(v_node, _get(j), _f), j)); } size_t m = nns_dist.size(); size_t p = n < m ? n : m; // Return this many items std::partial_sort(nns_dist.begin(), nns_dist.begin() + p, nns_dist.end()); for (size_t i = 0; i < p; i++) { if (distances) distances->push_back(D::normalized_distance(nns_dist[i].first)); result->push_back(nns_dist[i].second); } } }; #endif // vim: tabstop=2 shiftwidth=2 RcppAnnoy/inst/tinytest/0000755000176200001440000000000013541674477015045 5ustar liggesusersRcppAnnoy/inst/tinytest/data/0000755000176200001440000000000013465550702015743 5ustar liggesusersRcppAnnoy/inst/tinytest/data/test.tree0000644000176200001440000004461013465550702017610 0ustar liggesusers>?O>a8վ+x2;w? r[?vVz?| sT7>^C>3>L8?ɺUE!=?]=A>o?׿1UD A>V>i.<\;┿pњ}Ҋj鿫v^ j>?2T?M?'OV45@\?@Q e?5?<= &#?Q?{?iҾI?{Z忏??⼟]?-'?8%>Ԛ:o>\??bZ~ؾ>B` Pgmc?֤>6x??ޒ??z2 ?vUp?s? $>:?&$) >:=>>QN?ۿh}>0B?qLp>BI?k^>q(u?ޜ%>P%-K?@)B=5@Ym>yn>̔1>+-T+N? ?K{=kE>)=ntq?= N>#>e?ܻTu?e"=ܺ>< >EV{R{?#>?v>z{,=(?=E=D?ˎc~?D?a%濨4?-S tо~5(9)?)m>f>=␾$$̜پ?\?yCc=߉*ג>T>[@X> ?2/SKo->> =6?h,%?1ܿC(>IzffuBo-Կ I?(ҿ g>蝎?@]?s.?HBK>9?Kd- ??q[`?A{F?W @q>Mtal(W=n?R,?UqT͗ -R?⳿C7@phh?t>1>V?>8\?͓@褁=?t??:"T>@Y<,ǿ>??x6xþ>@gO>G?sm d==?7U"RB?x @LL *C?=T?#Y??iT >Zt? UjB?$""Of@!?-9oC`{?5=#? Yf>>jO @Ŀ>+p)VF>/|?E˽bz\?iɿ1}f>}aٿ*/o=$?bvɽҬ,?W=jLU?~qv? "r?>?e ?Ǔ@?ah^81?!s?J_)?-ξ݌?I+>G ¿:毲>̍?40?ж\jݮ:>W?3?l?>@ھ>B~0>)S= ?k?5K =v?J=*2ۿ`B?>d^UܿS[?v>Htk2h_@ɠ~Y=[\i:??n?{?bò>㳿biyqs?$)Ć?>`=c<0?sojg?*J?rfxT?'4>8M >y<q|.i?F79>wܾmKg> +?7r> 6>[ >ɪTU5?'?}}IokZ?@yKt?a?=?"U>: >jd?܈>Np??Mv;Ay*>f%AK?q+]?ϔ?V?^S[a*ayUa??>R>;NP?mƿMe,s>Z6þ{?8,)oUL4?!3>wzx?">=%??F2MM\?V_ƀO?Dd? ?)U uDZ~naF?f:?mDb?fkֿ\R?mB?Ͼ42 @(&>X-hSC? FQChj!"@ݬMh?>>ɑL0ռ(?x(?e@v=Ȣ?Yg=s?ܿ8ÞR}M?ys~ó?Ad˶6w??>lۂ>\sx[#!&ן=2#-?M?j>_+?4̽*doK>zȥb?νSQ?ty?w9>a4@r@T@4Xؾ8?x~d?ȗCK/>Ͽ ?K?پ?XF? =>?R?^ο`?;S^??g?@yn? `?oi?L!?3q惿2?{ ?=F=Av?h]?#=(?٭>bb?,> ȿQ?6=~!=/R&>.{>?>?޿A>X?7>/§?>s}?e=V!P{ƾ}B*>O=i:7?A<?a:^ _!/?: ϗyI<̿I1f[>j9.6.-?# A?\L?>{>_zXMk۾Y)<Ƿ?IV<{v>Ma$@ʰ?Yw"99>KAžO?5=&Z?.?Ů>? l?&3k>r񿧘,S?ڳ&ڎܼ}rcmǾƽA4=nZ3?)xH?f.?yJU>4?S" >ȆS?6Y?/?Kw>T0?򒗿u_vĿ"@?z<>Gb$?L n?@?stތ m4#W?X ?aZ>C:|]/%>{`#4+>쿺>P?8!?>1>?=.@[K:^a=m?b?#??cϾh=,S hB?U%>h@o߾ ` ި?lKWlտc?8=Z?yd/ ?Y?>5myo]?n>W?5?8b~a>࿁?{??E'X>yJ|\=c̍?͟k ?%?҇?߷?-\>ߚ>`!0o=<?y@Yu? rGVդ?RZ۾D?Ntֽj~17S$L><Ҿ֠)T?t@Ĉ|X̛N?ed?*m#!=܌6der8{=e *>q? ?92>׽+p* :5fi_@>F>Z=ʌ *Z?S%>8ֽgh!k>ܳ>%9?;k Ż=6 ;+x/==eU  #'+283@AOV%jk?< <=>kC>pa4t>Cٽ &146T[lo!Yk>w=>BL>\^Y᥾mn=Q(@km>+jR/%>> */;EU\b-57BLpq'罓˾J>i$=g)>>/=?>?MPQa !%KRXY`/sxc> ba{_:Q>=±>S>=twSo >J>(<]k^=>k> g,?uv:Jcy~ ?7¼5>/>Ĉ>>z{:A;8N>(N>BS(}< [= $9CFS|}q|;}>logڽw~ႾMY>1 ()G  ".:=^ZdN>r@AxlV>>>fI>Q]?5O>}{B}A>(=p;K=VC> ~>q= g>W>Հ_0f^= &*?MPUXbg=^>s\- O>?v"2;_ ,.BDQ[c0z}?%OyپrEB'>1>տ1̾=W)?9K=ϤY> -4:ENRTY\%9K`'/CHOVZa/>= ?=~Xq?žwpo=='oZY2̜Lo>7"^¾ lD4ᾝ$> ?>9=ݮ>> D iJ>+ď>  <JL  +F]^ !$1W'>蟢Ⱦ#Ž߲>, (?W>DѾΝ> `>NJ1>p4%?NK!&=:W=F%涽=R #6=>AI(57 )038@GSd5R>Cޅ>>l>bʻ= >,0߾M>>,l>??ol7> >G>>X> >xg=wٽ8fyW3dh(&>Ã>  <CDPVa^'>d&}FKAd]>;þcҊ> */?OU38@AM$?:>ö;=H@><>(> >^%=#?  '2W]c OK/>>u=#>;F>h \=y*WE<#)+>GI&(5J_4m=-о9)?v> MK!BE=.>D> >[@d;JQ'>~V|>_>s>.9QZ.xY>im>N!?Ru> L۽Ͼ yT>~= $6=KLT ,07:HS,=8>=LJ>p? >| =h ;?TO>  "1;FN[^>?d7 1zj4¼tRSj = (W!+τ>z 뾆6f>?nS !B %-4ERX`bY\dM >H>^8\o>MF=Ho>t(>.;ۚ>3`v)=)})[a=ꤾA >ˇ*> KS >eᘾ傼L7X'==>$=+qԀ½=@v=_cz۾2? >F]_ '2<GJNW^",9V>J-[=gX>Ǿ23Vd;y #+11=>SYb=!# =0< I>>X  $()DI0:=H6>GO>9=`> >FB>D =91?ˎоT2>)*b.^ >j>chܬ߾Q> 8>{>#J>.J>}BrTg>>F>yE\s>CF8f= %-CMY`c !57;?@L\7 XD= ̊NQOj=J$?Zx>hb> ?%>?>g9п *.KQRSX4BU[b TR#7?d8>Uy)>L>F7ؾO>q3=-5>ӵ &/368AEOPad" X/2P=*1D0\2.+QYt'>B\",>9-?Q?h=*>پxm*=μ$n=YJo'>c>2;?NW5Y^_c|Zݼ9"> ߽:B<>|W?<?zY{l?z>tֽz;.3=?Q(.GR ,7>KMUZ` "*BCQX !/9:S1֩>j>=x(L?V)C:">3>>E=}ü4]$?>9ؾF[=5>=kT=})gD>= )&  $'DJP]a >Nї><P>cK>?[*=f׾<%4OV[\b 038<AE>QB)?tZ>4뼬`CV%J>u?=  #+-1=IL )6@FHTd?5 R>)肾_>Oc=N>rk>᪾;<c5>gk>a=&3>#?3>A>}>aB4>I:ꮽ:.>$(#=&+IT쓹= |v#=C>>p*?2>0== #=BN > ?f׾~>&g=\b!>=c^>3= '1DJR["4PQX\b K美>Oz6lս&H>`ʽ(rL{'-?Гb>?pv=\ݎ>H=¾7> %(6:YZ^`*5OUck >UC>_$)>se>)?q{<C>-.2KM ,7;(͎>P>?d:>.5?-۾}g>Eb?>ؾdv>>aP$9a/?CEV]>ʽU>rbj2j}z[!"L̽a0k=zw>x>>7>+0x>3o>'>K\=s <q>]=>1B?W_ !)<>FGS038@AHdڟľB>=>Q\gL>㇙>D?>4}u/4?Q>">->R?h>(7T= >I> ,n}҂= >\~C=b t>6ͼr=4T@S?u > . -.5KMSY`c %36U!79Z4T?倽gkJ$Ͻq*>,35P>'> ;Nm?:BY>;M=7)>ey#(Gt=1Ћ<} >c.>n>m=>=3>> 0:@HTW^ )IL5+b=>:Hv>h ȾFо:= 𽷇 UXs &L;4U$Q?=>l> )K>BE  >4r\⾄L%>z$>)>p1P6 FJ   |>+ykxt>x>`>kܽ=Ƹ2?C "$+18<=>]=3> >k=ʉ%>Y>ϙ>]>'%>ga†=F8a>+`DV_ *,OQX[43Oa>P 5$hS>J$潉<>/4A\ab &'PRd! *婾pۼn=YC˾o !%?EZ>(ƴCd?3=?lV߽DA>¾>Խ>d=ܒQt;IF> H]> ?˲>'%;#i=U'i~<[_\='<D $)0:@IL i=ATYܽ`>*1=FGBZ=?UW=H>>þ!3=d>>(p?"QW_  8AFTaE<"%֐X*A-' >T>%+&[?Wp#$?H;\y\z>eH?Ƚ>=V=  .17Sc#(,5;G*&+uHo,IK-lj8>;u'(]i߾3Ymﵾnо>=ż= \>!/B)*VV{۾#<->Ze=B=(yɽ,IX> &?U 3Y^`,-M=r!=D7=n c46NZ./ _>WE=d5#=EԮ: ?Mžc%-KMRX\ *+2CJOPV[bd1>$.- 8A>ۛ6ৼTa>%>229 >L>!> dW{`⾿Q3=sdɾRS38'w'ML X;נ/ +Hi'Ͼ45i#?μ =g>>XI>a>6q9>A[>=(67$v>>32>< pw !7FS5=>B"KL:==NJ>2$o>Su% >c_>r>8 ?;<~/%dDq7>>=ns&{μ>bv/0;@ ,9:EQTXZ\ 6HUY_2?B*Nm=2l>wt/(i?Ʀ޾a@Ais>OJc>i>0JT(Q]+?\S>|r=).<G^%*34IOV$CFM<ȫ/ ;[>}:==s rP<0>DE(O4[jWT>-wcCřLk>&]b 28?ACJP[aGH7>;<Ҿ=?ʾ&P>vͼF8H>$=Ժ= DMNWc   #$'+-1R`dJQs> (\>z>„U쾤>$K=2Ӿ)KNf>VH=$>LM1>=+!f>7ARý%8>ϋ(86 z^>  "5BXZ )79;STW^OP=z5=$c>?0I>m>J姼 &*+?QUY_ (.28GMc;R]\ݼ>ᖾ彘?>iu>)r>i:?-SZ:- >S9J=ǧĽ4>=9fl?TW>F>z&4>P>o9>U>,OUV]4.<݅>x((?ᖾ<2;>y>M>Β=!%/0KL-E\`aXYNh>:`${.ɽҜ=.*ДƊE[a% =FHPVb 1:N[\Q>;> ?2ӭ)>>:>0B $'@A[,<>C]^_M;h~>ԨndE c{o=p>='4 #36I 4DJORder8{=e *>q? ?92>׽+p* :dN>r@AxlV>>>fI>Q]?d5R>Cޅ>>l>bʻ= >,dM >H>^8\o>MF=Ho>t(>d" X/2)肾_>Oc=N>rk>᪾;dڟľB>=>Q\gL>㇙>D?>4}ud! *婾pۼn=YC˾o !%?EZ>d1>$.- 8A>ۛ6ৼTa>%>dJQs> (\>z>„U쾤>$K=2ӾRcppAnnoy/inst/tinytest/testIndex.R0000644000176200001440000000215113541674477017136 0ustar liggesusers ## if this is set (eg .travis.yml) then run the test if (Sys.getenv("RunAllRcppAnnoyTests") != "yes") exit_file("Skip this test") suppressMessages(library(RcppAnnoy)) a <- new(AnnoyAngular, 10) a$load(system.file("tinytest", "data", "test.tree", package="RcppAnnoy")) ## This might change in the future if we change the search ## algorithm, but in that case let's update the test checkEqual(a$getNNsByItem(0, 10), c(0, 85, 42, 11, 54, 38, 53, 66, 19, 31), msg="check loaded index") a <- new(AnnoyEuclidean, 10) v <- rnorm(10) expect_error(a$addItem(-2, v))#, msg="check negative index", silent=TRUE) expect_error(a$addItem(NA, v))#, msg="check NA index", silent=TRUE) ## modeled after annoy_test.py() and its t i <- new(AnnoyAngular, 10) i$load(system.file("tinytest", "data", "test.tree", package="RcppAnnoy")) u <- i$getItemsVector(99) i$save(tempfile()) v <- i$getItemsVector(99) checkEqual(u, v, msg="getItemVector comparison") j <- new(AnnoyAngular, 10) j$load(system.file("tinytest", "data", "test.tree", package="RcppAnnoy")) w <- i$getItemsVector(99) checkEqual(u, w, msg="getItemVector comparison") RcppAnnoy/inst/tinytest/testOnDiskBuild.R0000644000176200001440000000211213541674477020233 0ustar liggesusers suppressMessages(library(RcppAnnoy)) f <- 2 # arbitrary a <- new(AnnoyEuclidean, f) diskfile <- tempfile(pattern="annoy", fileext="bin") expect_true(a$onDiskBuild(diskfile)) a$addItem(0, c(2, 2)) a$addItem(1, c(3, 2)) a$addItem(2, c(3, 3)) a$build(10) expect_equal(a$getNNsByVector(c(4,4), 3), c(2,1,0)) #, msg="getNNsByVector check 1") expect_equal(a$getNNsByVector(c(1,1), 3), c(0,1,2)) #, msg="getNNsByVector check 2") expect_equal(a$getNNsByVector(c(5,3), 3), c(2,1,0)) #, msg="getNNsByVector check 3") a$unload() a$load(diskfile) expect_equal(a$getNNsByVector(c(4,4), 3), c(2,1,0)) #, msg="getNNsByVector check 1") expect_equal(a$getNNsByVector(c(1,1), 3), c(0,1,2)) #, msg="getNNsByVector check 2") expect_equal(a$getNNsByVector(c(5,3), 3), c(2,1,0)) #, msg="getNNsByVector check 3") b <- new(AnnoyEuclidean, f) b$load(diskfile) expect_equal(b$getNNsByVector(c(4,4), 3), c(2,1,0)) #, msg="getNNsByVector check 1") expect_equal(b$getNNsByVector(c(1,1), 3), c(0,1,2)) #, msg="getNNsByVector check 2") expect_equal(b$getNNsByVector(c(5,3), 3), c(2,1,0)) #, msg="getNNsByVector check 3") RcppAnnoy/inst/tinytest/testSeeds.R0000644000176200001440000000152313541674477017134 0ustar liggesusers ## if this is set (eg .travis.yml) then run the test if (Sys.getenv("RunAllRcppAnnoyTests") != "yes") exit_file("Skip this test") suppressMessages(library(RcppAnnoy)) f <- 2 set.seed(123456) # R Seed for next two vectors n <- 100 x <- rnorm(n) y <- rnorm(n) v1 <- new(AnnoyHamming, f) v1$setSeed(123) for (i in 1:n) v1$addItem(i-1, c(x[i], y[i])) v1$build(f) v2 <- new(AnnoyHamming, f) v2$setSeed(456) # different for (i in 1:n) v2$addItem(i-1, c(x[i], y[i])) v2$build(f) v3 <- new(AnnoyHamming, f) v3$setSeed(123) # as first for (i in 1:n) v3$addItem(i-1, c(x[i], y[i])) v3$build(f) checkEqual(v1$getNNsByVector(c(0.5,0.5), 20), v3$getNNsByVector(c(0.5,0.5), 20)) # msg="v1 and v3 are equal") checkTrue(any(v1$getNNsByVector(c(0.5,0.5), 20) != v2$getNNsByVector(c(0.5,0.5), 20))) # msg="v1 and v2 are not equal") RcppAnnoy/inst/tinytest/testAngular.R0000644000176200001440000000374213465550702017454 0ustar liggesusers suppressMessages(library(RcppAnnoy)) f <- 3 a <- new(AnnoyAngular, f) a$addItem(0, c(0,0,1)) a$addItem(1, c(0,1,0)) a$addItem(2, c(1,0,0)) a$build(10) checkEqual(a$getNNsByVector(c(3,2,1), 3), c(2,1,0), msg="getNNsByVector check 1") checkEqual(a$getNNsByVector(c(1,2,3), 3), c(0,1,2), msg="getNNsByVector check 1") checkEqual(a$getNNsByVector(c(2,0,1), 3), c(2,0,1), msg="getNNsByVector check 1") f <- 3 a <- new(AnnoyAngular, f) a$addItem(0, c(2,1,0)) a$addItem(1, c(1,2,0)) a$addItem(2, c(0,0,1)) a$build(10) checkEqual(a$getNNsByItem(0, 3), c(0,1,2), msg="getNNsByItem check1") checkEqual(a$getNNsByItem(1, 3), c(1,0,2), msg="getNNsByItem check2") f <- 2 a <- new(AnnoyAngular, f) a$addItem(0, c(0, 1)) a$addItem(1, c(1, 1)) checkEqual(a$getDistance(0, 1), (2.0 * (1.0 - 2^(-0.5)))^0.5, msg="distance 1", tolerance=1e-6) f <- 2 a <- new(AnnoyAngular, f) a$addItem(0, c(1000, 0)) a$addItem(1, c(10, 0)) checkEqual(a$getDistance(0, 1), 0, msg="distance 2") f <- 2 a <- new(AnnoyAngular, f) a$addItem(0, c(97, 0)) a$addItem(1, c(42, 42)) d <- ((1 - 2^(-0.5))^2 + (2^(-0.5))^2)^0.5 checkEqual(a$getDistance(0, 1), d, msg="distance 3", tolerance=1.0e-6) f <- 2 a <- new(AnnoyAngular, f) a$addItem(0, c(1, 0)) a$addItem(1, c(0, 0)) checkEqual(a$getDistance(0, 1), 2.0^0.5, msg="distance 4", tolerance=1.0e-6) ## Generate pairs of random points where the pair is super close f <- 10 a <- new(AnnoyAngular, f) set.seed(123) for (j in seq(0, 10000, by=2)) { p <- rnorm(f) f1 <- runif(1) + 1 f2 <- runif(1) + 1 x <- f1 * p + rnorm(f, 0, 1.0e-2) y <- f2 * p + rnorm(f, 0, 1.0e-2) a$addItem(j, x) a$addItem(j+1, y) } a$build(10) res <- TRUE for (j in seq(0, 10000, by=2)) { #expect_equal(a$getNNsByItem(j, 2), c(j, j+1), msg="getNNsByItem check1") #expect_equal(a$getNNsByItem(j+1, 2), c(j+1, j), msg="getNNsByItem check1") res <- res && all.equal(a$getNNsByItem(j, 2), c(j, j+1)) && all.equal(a$getNNsByItem(j+1, 2), c(j+1, j)) } checkTrue(res) RcppAnnoy/inst/tinytest/testEuclidean.R0000644000176200001440000000506113465550702017750 0ustar liggesusers suppressMessages(library(RcppAnnoy)) ## getNNsByVector f <- 2 a <- new(AnnoyEuclidean, f) a$addItem(0, c(2, 2)) a$addItem(1, c(3, 2)) a$addItem(2, c(3, 3)) a$build(10) checkEqual(a$getNNsByVector(c(4,4), 3), c(2,1,0), msg="getNNsByVector check 1") checkEqual(a$getNNsByVector(c(1,1), 3), c(0,1,2), msg="getNNsByVector check 1") checkEqual(a$getNNsByVector(c(4,2), 3), c(1,2,0), msg="getNNsByVector check 1") ## getNNsByItem f <- 2 a <- new(AnnoyEuclidean, f) a$addItem(0, c(2, 2)) a$addItem(1, c(3, 2)) a$addItem(2, c(3, 3)) a$build(10) checkEqual(a$getNNsByItem(0, 3), c(0, 1, 2), msg="getNNsByItem check 1") checkEqual(a$getNNsByItem(2, 3), c(2, 1, 0), msg="getNNsByItem check 2") ### test03dist f <- 2 a <- new(AnnoyEuclidean, f) a$addItem(0, c(0, 1)) a$addItem(1, c(1, 1)) a$addItem(2, c(0, 0)) checkEqual(a$getDistance(0, 1), 1.0^0.5, msg="distance 1") checkEqual(a$getDistance(1, 2), 2.0^0.5, msg="distance 2", tolerance=1e-6) ## test04largeIndex ## Generate pairs of random points where the pair is super close f <- 10 #q <- rnorm(f, 0, 10) a <- new(AnnoyEuclidean, f) set.seed(123) for (j in seq(0, 10000, by=2)) { p <- rnorm(f) x <- 1 + p + rnorm(f, 0, 1.0e-2) y <- 1 + p + rnorm(f, 0, 1.0e-2) a$addItem(j, x) a$addItem(j+1, y) } a$build(10) res <- TRUE for (j in seq(0, 10000, by=2)) { #expect_equal(a$getNNsByItem(j, 2), c(j, j+1), msg="getNNsByItem check1") #expect_equal(a$getNNsByItem(j+1, 2), c(j+1, j), msg="getNNsByItem check1") res <- res && all.equal(a$getNNsByItem(j, 2), c(j, j+1)) && all.equal(a$getNNsByItem(j+1, 2), c(j+1, j)) } expect_true(res) ## test05precision precision <- function(n, nTrees=10, nPoints=10000, nRounds=3) { found <- 0 for (r in 1:nRounds) { ## create random points at distance x f <- 10 a <- new(AnnoyEuclidean, f) for (j in seq(nPoints)) { p <- rnorm(f, 0, 1) nrm <- sqrt(sum(p^2)) x <- p / nrm * j a$addItem(j, x) } a$build(nTrees) nns <- a$getNNsByVector(rep(0, f), n) checkEqual(nns, nns[order(nns)], msg="checking precision order") # should be in order ## The number of gaps should be equal to the last item minus n-1 found <- found + length(nns[ nns <= n]) } return(1.0 * found / (n * nRounds)) } checkTrue(precision(1) >= 0.98)#, msg="precision at 1") checkTrue(precision(10) >= 0.98)#, msg="precision at 10") checkTrue(precision(100) >= 0.98)#, msg="precision at 100") checkTrue(precision(1000) >= 0.98)#, msg="precision at 1000") RcppAnnoy/inst/tinytest/testHamming.R0000644000176200001440000000527113465550702017442 0ustar liggesusers suppressMessages(library(RcppAnnoy)) # test01getNNsByVector f <- 2 a <- new(AnnoyHamming, f) a$addItem(0, c(2, 2)) a$addItem(1, c(3, 2)) a$addItem(2, c(3, 3)) a$build(10) checkEqual(a$getNNsByVector(c(4,4), 3), c(0,1,2), msg="getNNsByVector check 1") checkEqual(a$getNNsByVector(c(1,1), 3), c(2,1,0), msg="getNNsByVector check 2") checkEqual(a$getNNsByVector(c(5,3), 3), c(2,1,0), msg="getNNsByVector check 3") # test02getNNsByItem f <- 2 a <- new(AnnoyHamming, f) a$addItem(0, c(2, 2)) a$addItem(1, c(3, 2)) a$addItem(2, c(3, 3)) a$build(10) checkEqual(a$getNNsByItem(0, 3), c(0, 1, 2), msg="getNNsByItem check 1") checkEqual(a$getNNsByItem(2, 3), c(2, 1, 0), msg="getNNsByItem check 2") # test03dist f <- 2 a <- new(AnnoyHamming, f) a$addItem(0, c(0, 1)) a$addItem(1, c(1, 1)) a$addItem(2, c(0, 0)) checkEqual(a$getDistance(0, 1), 1.0, msg="distance 1")# checkEqual(a$getDistance(1, 2), 2.0, msg="distance 2")# ## test04largeIndex <- function() { ## ## Generate pairs of random points where the pair is super close ## f <- 10 ## #q <- rnorm(f, 0, 10) ## a <- new(AnnoyHamming, f) ## set.seed(123) ## for (j in seq(0, 10000, by=2)) { ## p <- rnorm(f) ## x <- 1 + p + rnorm(f, 0, 1.0e-2) ## y <- 1 + p + rnorm(f, 0, 1.0e-2) ## a$addItem(j, x) ## a$addItem(j+1, y) ## } ## a$build(10) ## for (j in seq(0, 10000, by=2)) { ## checkEquals(a$getNNsByItem(j, 2), c(j, j+1), msg="getNNsByItem check 1") ## checkEquals(a$getNNsByItem(j+1, 2), c(j+1, j), msg="getNNsByItem check 2") ## } ## } ## test05precision <- function() { ## precision <- function(n, nTrees=10, nPoints=10000, nRounds=3) { ## found <- 0 ## for (r in 1:nRounds) { ## ## create random points at distance x ## f <- 10 ## a <- new(AnnoyHamming, f) ## for (j in seq(nPoints)) { ## p <- rnorm(f, 0, 1) ## nrm <- sqrt(sum(p^2)) ## x <- p / nrm + j ## a$addItem(j, x) ## } ## a$build(nTrees) ## nns <- a$getNNsByVector(rep(0, f), n) ## checkEquals(nns, nns[order(nns)], msg="checking precision order") # should be in order ## ## The number of gaps should be equal to the last item minus n-1 ## found <- found + length(nns[nns <= n]) ## } ## return(1.0 * found / (n * nRounds)) ## } ## checkTrue(precision(1) >= 0.98, msg="precision at 1") ## checkTrue(precision(10) >= 0.98, msg="precision at 10") ## checkTrue(precision(100) >= 0.98, msg="precision at 100") ## checkTrue(precision(1000) >= 0.98, msg="precision at 1000") ## } RcppAnnoy/inst/tinytest/testManhattan.R0000644000176200001440000000460113465550702017771 0ustar liggesusers suppressMessages(library(RcppAnnoy)) ## test01getNNsByVector f <- 2 a <- new(AnnoyManhattan, f) a$addItem(0, c(2, 2)) a$addItem(1, c(3, 2)) a$addItem(2, c(3, 3)) a$build(10) checkEqual(a$getNNsByVector(c(4,4), 3), c(2,1,0), msg="getNNsByVector check 1") checkEqual(a$getNNsByVector(c(1,1), 3), c(0,1,2), msg="getNNsByVector check 2") checkEqual(a$getNNsByVector(c(5,3), 3), c(2,1,0), msg="getNNsByVector check 3") ## test02getNNsByItem f <- 2 a <- new(AnnoyManhattan, f) a$addItem(0, c(2, 2)) a$addItem(1, c(3, 2)) a$addItem(2, c(3, 3)) a$build(10) checkEqual(a$getNNsByItem(0, 3), c(0, 1, 2), msg="getNNsByItem check 1") checkEqual(a$getNNsByItem(2, 3), c(2, 1, 0), msg="getNNsByItem check 2") ## test03dist f <- 2 a <- new(AnnoyManhattan, f) a$addItem(0, c(0, 1)) a$addItem(1, c(1, 1)) a$addItem(2, c(0, 0)) checkEqual(a$getDistance(0, 1), 1.0, msg="distance 1")# checkEqual(a$getDistance(1, 2), 2.0, msg="distance 2")# ## test04largeIndex ## Generate pairs of random points where the pair is super close f <- 10 ##q <- rnorm(f, 0, 10) a <- new(AnnoyManhattan, f) set.seed(123) for (j in seq(0, 10000, by=2)) { p <- rnorm(f) x <- 1 + p + rnorm(f, 0, 1.0e-2) y <- 1 + p + rnorm(f, 0, 1.0e-2) a$addItem(j, x) a$addItem(j+1, y) } a$build(10) res <- TRUE for (j in seq(0, 10000, by=2)) { res <- res && all.equal(a$getNNsByItem(j, 2), c(j, j+1)) && all.equal(a$getNNsByItem(j+1, 2), c(j+1, j)) } checkTrue(res) ## test05precision precision <- function(n, nTrees=10, nPoints=10000, nRounds=3) { found <- 0 for (r in 1:nRounds) { ## create random points at distance x f <- 10 a <- new(AnnoyManhattan, f) for (j in seq(nPoints)) { p <- rnorm(f, 0, 1) nrm <- sqrt(sum(p^2)) x <- p / nrm + j a$addItem(j, x) } a$build(nTrees) nns <- a$getNNsByVector(rep(0, f), n) checkEqual(nns, nns[order(nns)], msg="checking precision order") # should be in order ## The number of gaps should be equal to the last item minus n-1 found <- found + length(nns[nns <= n]) } return(1.0 * found / (n * nRounds)) } checkTrue(precision(1) >= 0.98) #, msg="precision at 1") checkTrue(precision(10) >= 0.98) #, msg="precision at 10") checkTrue(precision(100) >= 0.98) #, msg="precision at 100") checkTrue(precision(1000) >= 0.98) #, msg="precision at 1000") RcppAnnoy/inst/NEWS.Rd0000644000176200001440000001102413562375361014214 0ustar liggesusers\name{NEWS} \title{News for Package \pkg{RcppAnnoy}} \newcommand{\ghpr}{\href{https://github.com/eddelbuettel/rcppannoy/pull/#1}{##1}} \newcommand{\ghit}{\href{https://github.com/eddelbuettel/rcppannoy/issues/#1}{##1}} \section{Changes in version 0.0.14 (2019-11-11)}{ \itemize{ \item RcppAnnoy again synchronized with upstream to ensure builds with older compilers without AVX512 instructions (Dirk \ghpr{53}). \item The \code{cleanup} script only uses \code{/bin/sh}. } } \section{Changes in version 0.0.13 (2019-09-23)}{ \itemize{ \item In example(), the saved and loaded filename is now obtained via tempfile() to not touch user directories per CRAN Policy (Dirk). \item RcppAnnoy was again synchronized with Annoy upstream leading to enhanced performance and more features (Dirk \ghpr{48}). \item Minor changes made (and send as PRs upstream) to adapt both \code{annoylib.h} and \code{mman.h} changes (Dirk). \item A spurious command was removed from one vignette (Peter Hickey in \ghpr{49}). \item Two new user-facing functions onDiskBuild() and unbuild() were added (Dirk in \ghpr{50}). \item Minor tweaks were made to two tinytest-using test files (Dirk). } } \section{Changes in version 0.0.12 (2019-05-12)}{ \itemize{ \item Allow setting of seed (Dirk in \ghpr{41} fixing \ghit{40}). \item Document \code{setSeed} (James Melville in \ghpr{42} documenting \ghit{41}). \item Added documentation (Adam Spannbauer in \ghpr{44} closing \ghit{43}). \item Switched unit testing to the new \pkg{tinytest} package (Dirk in \ghpr{45}). \item The vignette is now pre-made in included as-is in Sweave document reducing the number of suggested packages. } } \section{Changes in version 0.0.11 (2018-10-30)}{ \itemize{ \item Synchronized with Annoy upstream (\ghpr{26}, \ghpr{30}, \ghpr{36}). \item Added new Hamming distance measure functionality; should be considered experimental as the functionality depends on integer values. \item Travis CI use was updated to the R 3.5 PPA (\ghpr{28}) \item New vignette about Annoy use from C++ via Rcpp (Aaron Lun in \ghpr{29} addressing \ghit{19}; also \ghpr{32}, \ghpr{33}) \item The vignette was rewritten using \pkg{pinp} (\ghpr{34}, \ghpr{35}). } } \section{Changes in version 0.0.10 (2017-09-25)}{ \itemize{ \item The \code{getItemsVector()} function no longer crashes (\ghit{24}) } } \section{Changes in version 0.0.9 (2017-08-31)}{ \itemize{ \item Synchronized with Annoy upstream version 1.9.1 \item Minor updates in calls and tests as required by annoy 1.9.1 \item New Manhattan distance modules along with unit test code \item Additional unit tests from upstream test code carried over \item Binary mode is used for \code{save} (as suggested by @khoran in \ghit{21}) \item A new file \code{init.c} was added with calls to \code{R_registerRoutines()} and \code{R_useDynamicSymbols()} \item Symbol registration is enabled in \code{useDynLib} } } \section{Changes in version 0.0.8 (2016-10-01)}{ \itemize{ \item New functions \code{getNNsByItemList} and \code{getNNsByVectorList}, from by Michael Phan-Ba in \ghit{12} \item Added destructor (PR \ghpr{14} by Michael Phan-Ba) \item Extended templatization (PR \ghpr{11} by Dan Dillon) \item Switched to \code{run.sh} for Travis (PR \ghpr{17}) \item Added test for admissible value to \code{addItem} (PR \ghpr{18} closing issue \ghit{13}) } } \section{Changes in version 0.0.7 (2015-11-15)}{ \itemize{ \item Synchronized with Annoy upstream changes \item Minor internal changes required by Annoy changes } } \section{Changes in version 0.0.6 (2015-05-03)}{ \itemize{ \item Synchronized with Annoy upstream changes \item Permit supplying our own RNG \item Minor internal changes } } \section{Changes in version 0.0.5 (2015-01-22)}{ \itemize{ \item Synchronized with Annoy upstream changes } } \section{Changes in version 0.0.4 (2015-01-22)}{ \itemize{ \item Synchronized with Annoy upstream changes \item Depends on R (>= 3.1) to permit C++11 builds } } \section{Changes in version 0.0.3 (2014-11-17)}{ \itemize{ \item Synchronized with Annoy upstream changes \item Windows support added (Qiang Kou in \ghpr{2}) } } \section{Changes in version 0.0.2 (2014-11-13)}{ \itemize{ \item Added verbosity toggle \item Added regression tests } } \section{Changes in version 0.0.1 (2014-11-08)}{ \itemize{ \item Initial release } } RcppAnnoy/cleanup0000755000176200001440000000024513562375422013552 0ustar liggesusers#!/bin/sh rm -rf *~ */*~ src/*.o src/*.so src/*.dll src/*.dylib src/symbols.rds \ vignettes/jss.bst vignettes/pinp.cls vignettes/auto \ vignettes/annoy.index