doParallel/0000755000176200001440000000000013520737242012336 5ustar liggesusersdoParallel/NAMESPACE0000644000176200001440000000025313513447603013556 0ustar liggesusersexport(registerDoParallel) export(stopImplicitCluster) importFrom("utils", "packageDescription", "packageName") import(foreach) import(iterators) import(parallel) doParallel/demo/0000755000176200001440000000000013513447603013263 5ustar liggesusersdoParallel/demo/00Index0000644000176200001440000000006713513447603014420 0ustar liggesuserssincParallel computation of the sinc function doParallel/demo/sincParallel.R0000644000176200001440000000174513513447603016026 0ustar liggesuserslibrary(doParallel) registerDoParallel() # Define a function that creates an iterator that returns subvectors ivector <- function(x, chunks) { n <- length(x) i <- 1 nextEl <- function() { if (chunks <= 0 || n <= 0) stop('StopIteration') m <- ceiling(n / chunks) r <- seq(i, length=m) i <<- i + m n <<- n - m chunks <<- chunks - 1 x[r] } obj <- list(nextElem=nextEl) class(obj) <- c('abstractiter', 'iter') obj } # Define the coordinate grid and figure out how to split up the work x <- seq(-10, 10, by=0.1) nw <- getDoParWorkers() cat(sprintf('Running with %d worker(s)\n', nw)) # Compute the value of the sinc function at each point in the grid z <- foreach(y=ivector(x, nw), .combine=cbind) %dopar% { y <- rep(y, each=length(x)) r <- sqrt(x ^ 2 + y ^ 2) matrix(10 * sin(r) / r, length(x)) } # Plot the results as a perspective plot persp(x, x, z, ylab='y', theta=30, phi=30, expand=0.5, col="lightblue") doParallel/man/0000755000176200001440000000000013513447603013112 5ustar liggesusersdoParallel/man/doParallel-package.Rd0000644000176200001440000000271213513447603017053 0ustar liggesusers\name{doParallel-package} \alias{doParallel-package} \alias{doParallel} \docType{package} \title{ The doParallel Package } \description{ The doParallel package provides a parallel backend for the foreach/\%dopar\% function using the \code{parallel} package of R 2.14.0 and later. } \details{ Further information is available in the following help topics: \tabular{ll}{ \code{registerDoParallel} \tab register doParallel to be used by foreach/\%dopar\%\cr } To see a tutorial introduction to the doParallel package, use \code{vignette("gettingstartedParallel")}. To see a tutorial introduction to the foreach package, use \code{vignette("foreach")}. To see a demo of doParallel computing the sinc function, use \code{demo(sincParallel)}. Some examples (in addition to those in the help pages) are included in the ``examples'' directory of the doParallel package. To list the files in the examples directory, use \code{list.files(system.file("examples", package="doParallel"))}. To run the bootstrap example, use \code{source(system.file("examples", "bootParallel.R", package="doParallel"))}. This is a simple benchmark, executing both sequentally and in parallel. There are many more examples that come with the foreach package, which will work with the doParallel package if it is registered as the parallel backend. For a complete list of functions with individual help pages, use \code{library(help="doParallel")}. } \keyword{package} doParallel/man/registerDoParallel.Rd0000644000176200001440000000541513513447603017172 0ustar liggesusers\name{registerDoParallel} \alias{registerDoParallel} \alias{stopImplicitCluster} \title{registerDoParallel} \description{ The \code{registerDoParallel} function is used to register the parallel backend with the \code{foreach} package. } \usage{ registerDoParallel(cl, cores=NULL, \dots) stopImplicitCluster() } \arguments{ \item{cl}{A cluster object as returned by \code{makeCluster}, or the number of nodes to be created in the cluster. If not specified, on Windows a three worker cluster is created and used.} \item{cores}{The number of cores to use for parallel execution. If not specified, the number of cores is set to the value of \code{options("cores")}, if specified, or to one-half the number of cores detected by the \code{parallel} package.} \item{\dots}{Package options. Currently, only the \code{nocompile} option is supported. If \code{nocompile} is set to \code{TRUE}, compiler support is disabled.} } \details{ The \code{parallel} package from R 2.14.0 and later provides functions for parallel execution of R code on machines with multiple cores or processors or multiple computers. It is essentially a blend of the \code{snow} and \code{multicore} packages. By default, the \code{doParallel} package uses \code{snow}-like functionality. The \code{snow}-like functionality should work fine on Unix-like systems, but the \code{multicore}-like functionality is limited to a single sequential worker on Windows systems. On workstations with multiple cores running Unix-like operating systems, the system \code{fork} call is used to spawn copies of the current process. The \code{doParallel} backend supports both multicore and snow options passed through the \code{foreach} function. The supported multicore options are \code{preschedule}, \code{set.seed}, \code{silent}, and \code{cores}, which are analogous to the similarly named arguments to \code{\link{mclapply}}, and are passed using the \code{.options.multicore} argument to \code{foreach}. The supported snow options are \code{preschedule}, which like its multicore analog can be used to chunk the tasks so that each worker gets a prescheduled chunk of tasks, and \code{attachExportEnv}, which can be used to attach the export environment in certain cases where R's lexical scoping is unable to find a needed export. The snow options are passed to \code{foreach} using the \code{.options.snow} argument. The function \code{stopImplicitCluster} can be used in vignettes and other places where it is important to explicitly close the implicitly created cluster. } \examples{ cl <- makePSOCKcluster(2) registerDoParallel(cl) m <- matrix(rnorm(9), 3, 3) foreach(i=1:nrow(m), .combine=rbind) %dopar% (m[i,] / mean(m[i,])) stopCluster(cl) } \keyword{utilities} doParallel/DESCRIPTION0000644000176200001440000000156213520737242014050 0ustar liggesusersPackage: doParallel Type: Package Title: Foreach Parallel Adaptor for the 'parallel' Package Version: 1.0.15 Authors@R: c(person("Hong", "Ooi", role="cre", email="hongooi@microsoft.com"), person("Microsoft", "Corporation", role=c("aut", "cph")), person("Steve", "Weston", role="aut"), person("Dan", "Tenenbaum", role="ctb")) Description: Provides a parallel backend for the %dopar% function using the parallel package. Depends: R (>= 2.14.0), foreach(>= 1.2.0), iterators(>= 1.0.0), parallel, utils Suggests: caret, mlbench, rpart, RUnit Enhances: compiler License: GPL-2 NeedsCompilation: no Packaged: 2019-07-16 22:51:14 UTC; richcala Author: Hong Ooi [cre], Microsoft Corporation [aut, cph], Steve Weston [aut], Dan Tenenbaum [ctb] Maintainer: Hong Ooi Repository: CRAN Date/Publication: 2019-08-02 04:40:02 UTC doParallel/build/0000755000176200001440000000000013513452342013432 5ustar liggesusersdoParallel/build/vignette.rds0000644000176200001440000000035713513452342015776 0ustar liggesusersM0V-,,"r_=xfl*imU d<|} >~a<aHXY4 *E*t*ž,@-E^"g;Y; 0 | tmp$nErr > 0) { stop(paste("\n\nunit testing failed (#test failures: ", tmp$nFail, ", #R errors: ", tmp$nErr, ")\n\n", sep="")) } } else { warning("cannot run unit tests -- package RUnit is not available") } doParallel/vignettes/0000755000176200001440000000000013513452342014343 5ustar liggesusersdoParallel/vignettes/gettingstartedParallel.Rnw0000644000176200001440000003236113513447603021551 0ustar liggesusers% \VignetteIndexEntry{Getting Started with doParallel and foreach} % \VignetteDepends{doParallel} % \VignetteDepends{foreach} % \VignettePackage{doParallel} \documentclass[12pt]{article} \usepackage{amsmath} \usepackage[pdftex]{graphicx} \usepackage{color} \usepackage{xspace} \usepackage{url} \usepackage{fancyvrb} \usepackage{fancyhdr} \usepackage[ colorlinks=true, linkcolor=blue, citecolor=blue, urlcolor=blue] {hyperref} \usepackage{lscape} \usepackage{Sweave} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % define new colors for use \definecolor{darkgreen}{rgb}{0,0.6,0} \definecolor{darkred}{rgb}{0.6,0.0,0} \definecolor{lightbrown}{rgb}{1,0.9,0.8} \definecolor{brown}{rgb}{0.6,0.3,0.3} \definecolor{darkblue}{rgb}{0,0,0.8} \definecolor{darkmagenta}{rgb}{0.5,0,0.5} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\bld}[1]{\mbox{\boldmath $#1$}} \newcommand{\shell}[1]{\mbox{$#1$}} \renewcommand{\vec}[1]{\mbox{\bf {#1}}} \newcommand{\ReallySmallSpacing}{\renewcommand{\baselinestretch}{.6}\Large\normalsize} \newcommand{\SmallSpacing}{\renewcommand{\baselinestretch}{1.1}\Large\normalsize} \newcommand{\halfs}{\frac{1}{2}} \setlength{\oddsidemargin}{-.25 truein} \setlength{\evensidemargin}{0truein} \setlength{\topmargin}{-0.2truein} \setlength{\textwidth}{7 truein} \setlength{\textheight}{8.5 truein} \setlength{\parindent}{0.20truein} \setlength{\parskip}{0.10truein} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagestyle{fancy} \lhead{} \chead{Getting Started with doParallel and foreach} \rhead{} \lfoot{} \cfoot{} \rfoot{\thepage} \renewcommand{\headrulewidth}{1pt} \renewcommand{\footrulewidth}{1pt} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{Getting Started with doParallel and foreach} \author{Steve Weston\footnote{Steve Weston wrote the original version of this vignette for the doMC package. Rich Calaway adapted the vignette for doParallel.} and Rich Calaway} \begin{document} \maketitle \thispagestyle{empty} \section{Introduction} The \texttt{doParallel} package is a ``parallel backend'' for the \texttt{foreach} package. It provides a mechanism needed to execute \texttt{foreach} loops in parallel. The \texttt{foreach} package must be used in conjunction with a package such as \texttt{doParallel} in order to execute code in parallel. The user must register a parallel backend to use, otherwise \texttt{foreach} will execute tasks sequentially, even when the \%dopar\% operator is used.\footnote{\texttt{foreach} will issue a warning that it is running sequentially if no parallel backend has been registered. It will only issue this warning once, however.} The \texttt{doParallel} package acts as an interface between \texttt{foreach} and the \texttt{parallel} package of R 2.14.0 and later. The \texttt{parallel} package is essentially a merger of the \texttt{multicore} package, which was written by Simon Urbanek, and the \texttt{snow} package, which was written by Luke Tierney and others. The \texttt{multicore} functionality supports multiple workers only on those operating systems that support the \texttt{fork} system call; this excludes Windows. By default, \texttt{doParallel} uses \texttt{multicore} functionality on Unix-like systems and \texttt{snow} functionality on Windows. Note that the \texttt{multicore} functionality only runs tasks on a single computer, not a cluster of computers. However, you can use the \texttt{snow} functionality to execute on a cluster, using Unix-like operating systems, Windows, or even a combination. It is pointless to use \texttt{doParallel} and \texttt{parallel} on a machine with only one processor with a single core. To get a speed improvement, it must run on a machine with multiple processors, multiple cores, or both. \section{A word of caution} Because the \texttt{parallel} package in \texttt{multicore} mode starts its workers using \texttt{fork} without doing a subsequent \texttt{exec}, it has some limitations. Some operations cannot be performed properly by forked processes. For example, connection objects very likely won't work. In some cases, this could cause an object to become corrupted, and the R session to crash. \section{Registering the \texttt{doParallel} parallel backend} To register \texttt{doParallel} to be used with \texttt{foreach}, you must call the \texttt{registerDoParallel} function. If you call this with no arguments, on Windows you will get three workers and on Unix-like systems you will get a number of workers equal to approximately half the number of cores on your system. You can also specify a cluster (as created by the \texttt{makeCluster} function) or a number of cores. The \texttt{cores} argument specifies the number of worker processes that \texttt{doParallel} will use to execute tasks, which will by default be equal to one-half the total number of cores on the machine. You don't need to specify a value for it, however. By default, \texttt{doParallel} will use the value of the ``cores'' option, as specified with the standard ``options'' function. If that isn't set, then \texttt{doParallel} will try to detect the number of cores, and use one-half that many workers. Remember: unless \texttt{registerDoMC} is called, \texttt{foreach} will {\em not} run in parallel. Simply loading the \texttt{doParallel} package is not enough. \section{An example \texttt{doParallel} session} Before we go any further, let's load \texttt{doParallel}, register it, and use it with \texttt{foreach}. We will use \texttt{snow}-like functionality in this vignette, so we start by loading the package and starting a cluster: <>= library(doParallel) cl <- makeCluster(2) registerDoParallel(cl) foreach(i=1:3) %dopar% sqrt(i) @ <>= stopCluster(cl) @ To use \texttt{multicore}-like functionality, we would specify the number of cores to use instead (but note that on Windows, attempting to use more than one core with \texttt{parallel} results in an error): \begin{verbatim} library(doParallel) registerDoParallel(cores=2) foreach(i=1:3) %dopar% sqrt(i) \end{verbatim} \begin{quote} Note well that this is {\em not} a practical use of \texttt{doParallel}. This is our ``Hello, world'' program for parallel computing. It tests that everything is installed and set up properly, but don't expect it to run faster than a sequential \texttt{for} loop, because it won't! \texttt{sqrt} executes far too quickly to be worth executing in parallel, even with a large number of iterations. With small tasks, the overhead of scheduling the task and returning the result can be greater than the time to execute the task itself, resulting in poor performance. In addition, this example doesn't make use of the vector capabilities of \texttt{sqrt}, which it must to get decent performance. This is just a test and a pedagogical example, {\em not} a benchmark. \end{quote} But returning to the point of this example, you can see that it is very simple to load \texttt{doParallel} with all of its dependencies (\texttt{foreach}, \texttt{iterators}, \texttt{parallel}, etc), and to register it. For the rest of the R session, whenever you execute \texttt{foreach} with \texttt{\%dopar\%}, the tasks will be executed using \texttt{doParallel} and \texttt{parallel}. Note that you can register a different parallel backend later, or deregister \texttt{doParallel} by registering the sequential backend by calling the \texttt{registerDoSEQ} function. \section{A more serious example} Now that we've gotten our feet wet, let's do something a bit less trivial. One good example is bootstrapping. Let's see how long it takes to run 10,000 bootstrap iterations in parallel on \Sexpr{getDoParWorkers()} cores: <>= library(doParallel) cl <- makeCluster(2) registerDoParallel(cl) @ <>= x <- iris[which(iris[,5] != "setosa"), c(1,5)] trials <- 10000 ptime <- system.time({ r <- foreach(icount(trials), .combine=cbind) %dopar% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] ptime @ Using \texttt{doParallel} and \texttt{parallel} we were able to perform 10,000 bootstrap iterations in \Sexpr{ptime} seconds on \Sexpr{getDoParWorkers()} cores. By changing the \texttt{\%dopar\%} to \texttt{\%do\%}, we can run the same code sequentially to determine the performance improvement: <>= stime <- system.time({ r <- foreach(icount(trials), .combine=cbind) %do% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] stime @ The sequential version ran in \Sexpr{stime} seconds, which means the speed up is about \Sexpr{round(stime / ptime, digits=1)} on \Sexpr{getDoParWorkers()} workers.\footnote{If you build this vignette yourself, you can see how well this problem runs on your hardware. None of the times are hardcoded in this document. You can also run the same example which is in the examples directory of the \texttt{doParallel} distribution.} Ideally, the speed up would be \Sexpr{getDoParWorkers()}, but no multicore CPUs are ideal, and neither are the operating systems and software that run on them. At any rate, this is a more realistic example that is worth executing in parallel. We do not explain what it's doing or how it works here. We just want to give you something more substantial than the \texttt{sqrt} example in case you want to run some benchmarks yourself. You can also run this example on a cluster by simply reregistering with a cluster object that specifies the nodes to use. (See the \texttt{makeCluster} help file for more details.) \section{Getting information about the parallel backend} To find out how many workers \texttt{foreach} is going to use, you can use the \texttt{getDoParWorkers} function: <>= getDoParWorkers() @ This is a useful sanity check that you're actually running in parallel. If you haven't registered a parallel backend, or if your machine only has one core, \texttt{getDoParWorkers} will return one. In either case, don't expect a speed improvement. \texttt{foreach} is clever, but it isn't magic. The \texttt{getDoParWorkers} function is also useful when you want the number of tasks to be equal to the number of workers. You may want to pass this value to an iterator constructor, for example. You can also get the name and version of the currently registered backend: <>= getDoParName() getDoParVersion() @ <>= stopCluster(cl) @ This is mostly useful for documentation purposes, or for checking that you have the most recent version of \texttt{doParallel}. \section{Specifying multicore options} When using \texttt{multicore}-like functionality, the \texttt{doParallel} package allows you to specify various options when running \texttt{foreach} that are supported by the underlying \texttt{mclapply} function: ``preschedule'', ``set.seed'', ``silent'', and ``cores''. You can learn about these options from the \texttt{mclapply} man page. They are set using the \texttt{foreach} \texttt{.options.multicore} argument. Here's an example of how to do that: \begin{verbatim} mcoptions <- list(preschedule=FALSE, set.seed=FALSE) foreach(i=1:3, .options.multicore=mcoptions) %dopar% sqrt(i) \end{verbatim} The ``cores'' options allows you to temporarily override the number of workers to use for a single \texttt{foreach} operation. This is more convenient than having to re-register \texttt{doParallel}. Although if no value of ``cores'' was specified when \texttt{doParallel} was registered, you can also change this value dynamically using the \texttt{options} function: \begin{verbatim} options(cores=2) getDoParWorkers() options(cores=3) getDoParWorkers() \end{verbatim} If you did specify the number of cores when registering \texttt{doParallel}, the ``cores'' option is ignored: \begin{verbatim} registerDoParallel(4) options(cores=2) getDoParWorkers() \end{verbatim} As you can see, there are a number of options for controlling the number of workers to use with \texttt{parallel}, but the default behaviour usually does what you want. \section{Stopping your cluster} If you are using \texttt{snow}-like functionality, you will want to stop your cluster when you are done using it. The \texttt{doParallel} package's \texttt{.onUnload} function will do this automatically if the cluster was created automatically by \texttt{registerDoParallel}, but if you created the cluster manually you should stop it using the \texttt{stopCluster} function: \begin{verbatim} stopCluster(cl) \end{verbatim} \section{Conclusion} The \texttt{doParallel} and \texttt{parallel} packages provide a nice, efficient parallel programming platform for multiprocessor/multicore computers running operating systems such as Linux and Mac OS X. It is very easy to install, and very easy to use. In short order, an average R programmer can start executing parallel programs, without any previous experience in parallel computing. \end{document} doParallel/NEWS0000644000176200001440000000267013513447603013043 0ustar liggesusersNEWS/ChangeLog for doParallel ----------------------------- 1.0.14 2018-09-24 o Re-enabled tests. o Moved RUnit from Enhances to Suggests (request of Kurt Hornik) 1.0.13 2018-04-04 o Changes to support enhanced exports via future (if available). 1.0.12 2017-12-08 o Change test report path for compliance with CRAN policies. 1.0.9 2015-09-21 o Bug fixes to stopImplicitCluster functionality, courtesy of Dan Tenenbaum. 1.0.8 2014-02-25 o Modified vignette to use no more than two workers. 1.0.7 2014-02-01 o Modified to work better when a foreach loop is executed in a package (courtesy of Steve Weston) o Added unit tests and a minimal working example 1.0.6 2013-10-25 o Changed foreach, iterators, and parallel from Depends to Imports (request of Steve Weston and Stefan Schlager) 1.0.4 2013-09-01 o New attachExportEnv option for doParallelSNOW o New function stopImplicitCluster to stop the implicitly created socket cluster. o Updated inst/unitTests/runTestSuite.sh, bug report from Michael Cheng 1.0.3 2013-06-06 o New preschedule option for doParallelSNOW, courtesy of Steve Weston o Removed assignment into global environment to meet CRAN standards. 1.0.2 2013-05-29 o Efficiency improvements courtesy of Steve Weston 1.0.1 2012-04-09 o Updated to support RevoScaleR's rxExec function doParallel/R/0000755000176200001440000000000013513447603012540 5ustar liggesusersdoParallel/R/doParallel.R0000644000176200001440000004033013513447603014742 0ustar liggesusers# # Copyright (c) 2008-2010, Revolution Analytics # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License (version 2) as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # A copy of the GNU General Public License is available at # http://www.r-project.org/Licenses/ # .options <- new.env(parent=emptyenv()) .revoDoParCluster <- NULL # this explicitly registers a multicore parallel backend registerDoParallel <- function(cl, cores=NULL, ...) { opts <- list(...) optnames <- names(opts) if (is.null(optnames)) optnames <- rep('', length(opts)) # filter out unnamed arguments with a warning unnamed <- ! nzchar(optnames) if (any(unnamed)) { warning('ignoring doParallel package option(s) specified with unnamed argument') opts <- opts[!unnamed] optnames <- optnames[!unnamed] } # filter out unrecognized options with a warning recog <- optnames %in% c('nocompile') if (any(!recog)) { warning(sprintf('ignoring unrecognized doParallel package option(s): %s', paste(optnames[!recog], collapse=', ')), call.=FALSE) opts <- opts[recog] optnames <- optnames[recog] } # clear .options in case registerDoParallel is called multiple times old.optnames <- ls(.options, all.names=TRUE) rm(list=old.optnames, pos=.options) # set new options for (i in seq(along=opts)) { assign(optnames[i], opts[[i]], pos=.options) } if (missing(cl) || is.numeric(cl)) { if (.Platform$OS.type == "windows") { if (!missing(cl) && is.numeric(cl)) { cl <- makeCluster(cl) } else { if (!missing(cores) && is.numeric(cores)){ cl <- makeCluster(cores) } else { cl <- makeCluster(3) } } assign(".revoDoParCluster", cl, pos=.options) reg.finalizer(.options, function(e){ stopImplicitCluster() }, onexit = TRUE) setDoPar(doParallelSNOW, cl, snowinfo) } else { if (!missing(cl) && is.numeric(cl)) { cores <- cl } # register multicore backend setDoPar(doParallelMC, cores, mcinfo) } } else { setDoPar(doParallelSNOW, cl, snowinfo) } } "stopImplicitCluster" <- function() { if (exists(".revoDoParCluster", where=.options) && !is.null(.options[['.revoDoParCluster']])) { stopCluster(.options[['.revoDoParCluster']]) remove(".revoDoParCluster", envir=.options) } } # internal function that determines the number of workers to use workers <- function(data) { if ("cluster" %in% class(data)) { length(data) } else { cores <- data if (!is.null(cores)) { # use the number specified when registering doMC cores } else { cores <- getOption('cores') if (!is.null(cores)) { # use the number specified via the 'cores' option cores } else { # use 1/2 the number detected by parallel cores <- parallel::detectCores() if (cores > 2) { cores <- ceiling(cores/2) } cores } } } } # passed to setDoPar via registerDoParallel, and called by getDoParWorkers, etc mcinfo <- function(data, item) { switch(item, workers=workers(data), name='doParallelMC', version=packageDescription('doParallel', fields='Version'), NULL) } # passed to setDoPar via registerDoParallel, and called by getDoParWorkers, etc snowinfo <- function(data, item) { switch(item, workers=workers(data), name='doParallelSNOW', version=packageDescription('doParallel', fields='Version'), NULL) } comp <- if (getRversion() < "2.13.0") { function(expr, ...) expr } else { function(expr, ...) { if (isTRUE(.options$nocompile)) expr else compiler::compile(expr, ...) } } parSpl <- try(parallel::splitList, silent=TRUE) ## Use the "splitList" function from parallel if it's exported ## Otherwise, use the definition it had in R 3.0.2. "splitList" <- if (inherits(parSpl, "try-error")) { function (x, ncl) lapply(splitIndices(length(x), ncl), function(i) x[i]) } else { parSpl } doParallelMC <- function(obj, expr, envir, data) { # set the default mclapply options preschedule <- TRUE set.seed <- TRUE silent <- FALSE cores <- workers(data) if (!inherits(obj, 'foreach')) stop('obj must be a foreach object') it <- iter(obj) argsList <- as.list(it) accumulator <- makeAccum(it) # make sure all of the necessary libraries have been loaded for (p in obj$packages) library(p, character.only=TRUE) # check for multicore-specific options options <- obj$options$multicore if (!is.null(options)) { nms <- names(options) recog <- nms %in% c('preschedule', 'set.seed', 'silent', 'cores') if (any(!recog)) warning(sprintf('ignoring unrecognized multicore option(s): %s', paste(nms[!recog], collapse=', ')), call.=FALSE) if (!is.null(options$preschedule)) { if (!is.logical(options$preschedule) || length(options$preschedule) != 1) { warning('preschedule must be logical value', call.=FALSE) } else { if (obj$verbose) cat(sprintf('setting mc.preschedule option to %d\n', options$preschedule)) preschedule <- options$preschedule } } if (!is.null(options$set.seed)) { if (!is.logical(options$set.seed) || length(options$set.seed) != 1) { warning('set.seed must be logical value', call.=FALSE) } else { if (obj$verbose) cat(sprintf('setting mc.set.seed option to %d\n', options$set.seed)) set.seed <- options$set.seed } } if (!is.null(options$silent)) { if (!is.logical(options$silent) || length(options$silent) != 1) { warning('silent must be logical value', call.=FALSE) } else { if (obj$verbose) cat(sprintf('setting mc.silent option to %d\n', options$silent)) silent <- options$silent } } if (!is.null(options$cores)) { if (!is.numeric(options$cores) || length(options$cores) != 1 || options$cores < 1) { warning('cores must be numeric value >= 1', call.=FALSE) } else { if (obj$verbose) cat(sprintf('setting mc.cores option to %d\n', options$cores)) cores <- options$cores } } } # define the "worker" function, compiling expr if possible c.expr <- comp(expr, env=envir, options=list(suppressUndefined=TRUE)) FUN <- function(args) tryCatch(eval(c.expr, envir=args, enclos=envir), error=function(e) e) # execute the tasks results <- mclapply(argsList, FUN, mc.preschedule=preschedule, mc.set.seed=set.seed, mc.silent=silent, mc.cores=cores) # call the accumulator with all of the results tryCatch(accumulator(results, seq(along=results)), error=function(e) { cat('error calling combine function:\n') print(e) NULL }) # check for errors errorValue <- getErrorValue(it) errorIndex <- getErrorIndex(it) # throw an error or return the combined results if (identical(obj$errorHandling, 'stop') && !is.null(errorValue)) { msg <- sprintf('task %d failed - "%s"', errorIndex, conditionMessage(errorValue)) stop(simpleError(msg, call=expr)) } else { getResult(it) } } makeDotsEnv <- function(...) { list(...) function() NULL } .doSnowGlobals <- new.env(parent=emptyenv()) getparentenv <- function(pkgname) { parenv <- NULL # if anything goes wrong, print the error object and return # the global environment tryCatch({ # pkgname is NULL in many cases, as when the foreach loop # is executed interactively or in an R script if (is.character(pkgname)) { # load the specified package if (require(pkgname, character.only=TRUE)) { # search for any function in the package pkgenv <- as.environment(paste0('package:', pkgname)) for (sym in ls(pkgenv)) { fun <- get(sym, pkgenv, inherits=FALSE) if (is.function(fun)) { env <- environment(fun) if (is.environment(env)) { parenv <- env break } } } if (is.null(parenv)) { stop('loaded ', pkgname, ', but parent search failed', call.=FALSE) } else { message('loaded ', pkgname, ' and set parent environment') } } } }, error=function(e) { cat(sprintf('Error getting parent environment: %s\n', conditionMessage(e))) }) # return the global environment by default if (is.null(parenv)) globalenv() else parenv } workerInit <- function(expr, exportenv, pkgname, packages, attach=FALSE) { assign('expr', expr, .doSnowGlobals) assign('exportenv', exportenv, .doSnowGlobals) exportEnv <- .doSnowGlobals$exportenv parent.env(exportEnv) <- getparentenv(pkgname) if (attach) { attach(exportEnv) } tryCatch({ for (p in packages) library(p, character.only=TRUE) NULL # indicates success }, error=function(e) { # a character string indicates an error conditionMessage(e) }) } workerCleanup <- function() { if ("exportEnv" %in% search()) { detach(exportEnv) } } evalWrapper <- function(args) { lapply(names(args), function(n) assign(n, args[[n]], pos=.doSnowGlobals$exportenv)) tryCatch(eval(.doSnowGlobals$expr, envir=.doSnowGlobals$exportenv), error=function(e) e) } # This function takes the place of workerInit and evalWrapper when # preschedule is enabled. It is executed by the master via clusterApply # such that there is a single chunked task for each worker in the # cluster, rather than using clusterCall to initialize the workers and # clusterApplyLB to compute the tasks one-by-one. This strategy can be # significantly more efficient when there are many small tasks, and is # very similar to the default behavior of mclapply. workerPreschedule <- function(largs, expr, exportenv, pkgname, packages) { parent.env(exportenv) <- getparentenv(pkgname) task <- function(args) { lapply(names(args), function(n) assign(n, args[[n]], pos=exportenv)) eval(expr, envir=exportenv) } tryCatch({ # load all necessary packages for (p in packages) library(p, character.only=TRUE) # execute all of the tasks lapply(largs, task) }, error=function(e) { # only one exception was thrown, but we don't know which one, # so we'll return it for all of the tasks lapply(seq_along(largs), function(i) e) }) } doParallelSNOW <- function(obj, expr, envir, data) { cl <- data preschedule <- FALSE attachExportEnv <- FALSE if (!inherits(obj, 'foreach')) stop('obj must be a foreach object') it <- iter(obj) accumulator <- makeAccum(it) # check for snow-specific options options <- obj$options$snow if (!is.null(options)) { nms <- names(options) recog <- nms %in% c('preschedule', 'attachExportEnv') if (any(!recog)) warning(sprintf('ignoring unrecognized snow option(s): %s', paste(nms[!recog], collapse=', ')), call.=FALSE) if (!is.null(options$preschedule)) { if (!is.logical(options$preschedule) || length(options$preschedule) != 1) { warning('preschedule must be logical value', call.=FALSE) } else { if (obj$verbose) cat(sprintf('bundling all tasks into %d chunks\n', length(cl))) preschedule <- options$preschedule } } if (!is.null(options$attachExportEnv)) { if (!is.logical(options$attachExportEnv) || length(options$attachExportEnv) != 1) { warning('attachExportEnv must be logical value', call.=FALSE) } else { if (obj$verbose) cat("attaching export environment\n") attachExportEnv <- options$attachExportEnv } } } # setup the parent environment by first attempting to create an environment # that has '...' defined in it with the appropriate values exportenv <- tryCatch({ qargs <- quote(list(...)) args <- eval(qargs, envir) environment(do.call(makeDotsEnv, args)) }, error=function(e) { new.env(parent=emptyenv()) }) noexport <- union(obj$noexport, obj$argnames) packages <- getexports(expr, exportenv, envir, bad=noexport) if(obj$verbose) cat(sprintf('discovered package(s): %s\n', paste(packages, collapse=', '))) vars <- ls(exportenv) if (obj$verbose) { if (length(vars) > 0) { cat('automatically exporting the following variables', 'from the local environment:\n') cat(' ', paste(vars, collapse=', '), '\n') } else { cat('no variables are automatically exported\n') } } # compute list of variables to export export <- unique(obj$export) ignore <- intersect(export, vars) if (length(ignore) > 0) { warning(sprintf('already exporting variable(s): %s', paste(ignore, collapse=', '))) export <- setdiff(export, ignore) } # add explicitly exported variables to exportenv if (length(export) > 0) { if (obj$verbose) cat(sprintf('explicitly exporting variables(s): %s\n', paste(export, collapse=', '))) for (sym in export) { if (!exists(sym, envir, inherits=TRUE)) stop(sprintf('unable to find variable "%s"', sym)) val <- get(sym, envir, inherits=TRUE) if (is.function(val) && (identical(environment(val), .GlobalEnv) || identical(environment(val), envir))) { # Changing this function's environment to exportenv allows it to # access/execute any other functions defined in exportenv. This # has always been done for auto-exported functions, and not # doing so for explicitly exported functions results in # functions defined in exportenv that can't call each other. environment(val) <- exportenv } assign(sym, val, pos=exportenv, inherits=FALSE) } } # send exports to workers c.expr <- comp(expr, env=envir, options=list(suppressUndefined=TRUE)) # packageName function added in R 3.0.0 pkgname <- if (exists('packageName', mode='function')) packageName(envir) else NULL packages = c(packages, obj$packages) if (obj$verbose) { cat(sprintf('explicitly exporting package(s): %s\n', paste(packages, collapse=', '))) } if (! preschedule) { # send exports to workers r <- clusterCall(cl, workerInit, c.expr, exportenv, pkgname, packages, attachExportEnv) for (emsg in r) { if (!is.null(emsg)) stop('worker initialization failed: ', emsg) } # execute the tasks argsList <- as.list(it) results <- clusterApplyLB(cl, argsList, evalWrapper) # clean up the workers if (attachExportEnv){ clusterCall(cl, workerCleanup) } } else { # convert argument iterator into a list of lists argsList <- splitList(as.list(it), length(cl)) # execute the tasks results <- do.call(c, clusterApply(cl, argsList, workerPreschedule, c.expr, exportenv, pkgname, packages)) } # call the accumulator with all of the results tryCatch(accumulator(results, seq(along=results)), error=function(e) { cat('error calling combine function:\n') print(e) }) # check for errors errorValue <- getErrorValue(it) errorIndex <- getErrorIndex(it) # throw an error or return the combined results if (identical(obj$errorHandling, 'stop') && !is.null(errorValue)) { msg <- sprintf('task %d failed - "%s"', errorIndex, conditionMessage(errorValue)) stop(simpleError(msg, call=expr)) } else { getResult(it) } } doParallel/R/zzz.R0000644000176200001440000000007713513447603013524 0ustar liggesusers".onUnload" <- function(libpath) { stopImplicitCluster() } doParallel/MD50000644000176200001440000000176213520737242012654 0ustar liggesusersfeb5e9178558c0670eb510c6ef12bda4 *DESCRIPTION fb79212b5b9dc6ece74fe33fd609ed7e *NAMESPACE c3e7257d3042dad506b9b9c01dc7c838 *NEWS 79fc414268c56bae63ad3081b50405dc *R/doParallel.R 86f0e4745e79399332a21f661de57bbb *R/zzz.R 8d524fd555d56a6e715447fdcb9aa21f *build/vignette.rds 0004a14592476b09378f53e6d915d419 *demo/00Index 657dd86a2b23acaeb44861433300d2ca *demo/sincParallel.R 674625575a46e398efb8b965cebf67da *inst/doc/gettingstartedParallel.R 09654ec2bef8300c0ec42470cbe479e9 *inst/doc/gettingstartedParallel.Rnw 0a965581b17ab4c0f431abcd7bcb94ca *inst/doc/gettingstartedParallel.pdf b278debda756976016cf4fd810817a5d *inst/examples/bootParallel.R 9370fa8163f85d43e94b220a109cf32f *inst/unitTests/options.R 530a76cc5343e76d39c5aa6e2a469fba *inst/unitTests/runTestSuite.sh 0288e366be373ba1c6378cba2217e797 *man/doParallel-package.Rd e32ac0edf3d2b9cf40b27c65c55c046a *man/registerDoParallel.Rd c839b703f8dc3cb5c79d48385effe11c *tests/doRUnit.R 09654ec2bef8300c0ec42470cbe479e9 *vignettes/gettingstartedParallel.Rnw doParallel/inst/0000755000176200001440000000000013513452342013310 5ustar liggesusersdoParallel/inst/examples/0000755000176200001440000000000013513447603015132 5ustar liggesusersdoParallel/inst/examples/bootParallel.R0000644000176200001440000000504213513447603017676 0ustar liggesuserssuppressMessages(library(doParallel)) cl <- makePSOCKcluster(4) registerDoParallel(cl) cat(sprintf('doParallel %s\n', packageVersion('doParallel'))) junk <- matrix(0, 1000000, 8) cat(sprintf('Size of extra junk data: %d bytes\n', object.size(junk))) x <- iris[which(iris[,5] != "setosa"), c(1,5)] trials <- 10000 ptime <- system.time({ r <- foreach(icount(trials), .combine=cbind, .export='junk') %dopar% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] cat(sprintf('parallel foreach: %6.1f sec\n', ptime)) ptime2 <- system.time({ snowopts <- list(preschedule=TRUE) r <- foreach(icount(trials), .combine=cbind, .export='junk', .options.snow=snowopts) %dopar% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] cat(sprintf('parallel foreach with prescheduling: %6.1f sec\n', ptime2)) ptime3 <- system.time({ chunks <- getDoParWorkers() r <- foreach(n=idiv(trials, chunks=chunks), .combine=cbind, .export='junk') %dopar% { y <- lapply(seq_len(n), function(i) { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) }) do.call('cbind', y) } })[3] cat(sprintf('chunked parallel foreach: %6.1f sec\n', ptime3)) ptime4 <- system.time({ mkworker <- function(x, junk) { force(x) force(junk) function(i) { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } } y <- parLapply(cl, seq_len(trials), mkworker(x, junk)) r <- do.call('cbind', y) })[3] cat(sprintf('parLapply: %6.1f sec\n', ptime4)) stime <- system.time({ y <- lapply(seq_len(trials), function(i) { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) }) r <- do.call('cbind', y) })[3] cat(sprintf('sequential lapply: %6.1f sec\n', stime)) stime2 <- system.time({ r <- foreach(icount(trials), .combine=cbind) %do% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] cat(sprintf('sequential foreach: %6.1f sec\n', stime2)) stopCluster(cl) doParallel/inst/doc/0000755000176200001440000000000013513452342014055 5ustar liggesusersdoParallel/inst/doc/gettingstartedParallel.pdf0000644000176200001440000047623413513452341021274 0ustar liggesusers%PDF-1.5 % 1 0 obj << /S /GoTo /D (section.1) >> endobj 4 0 obj (Introduction) endobj 5 0 obj << /S /GoTo /D (section.2) >> endobj 8 0 obj (A word of caution) endobj 9 0 obj << /S /GoTo /D (section.3) >> endobj 12 0 obj (Registering the doParallel parallel backend) endobj 13 0 obj << /S /GoTo /D (section.4) >> endobj 16 0 obj (An example doParallel session) endobj 17 0 obj << /S /GoTo /D (section.5) >> endobj 20 0 obj (A more serious example) endobj 21 0 obj << /S /GoTo /D (section.6) >> endobj 24 0 obj (Getting information about the parallel backend) endobj 25 0 obj << /S /GoTo /D (section.7) >> endobj 28 0 obj (Specifying multicore options) endobj 29 0 obj << /S /GoTo /D (section.8) >> endobj 32 0 obj (Stopping your cluster) endobj 33 0 obj << /S /GoTo /D (section.9) >> endobj 36 0 obj (Conclusion) endobj 37 0 obj << /S /GoTo /D [38 0 R /Fit] >> endobj 41 0 obj << /Length 2373 /Filter /FlateDecode >> stream xYKoFW Q2ؙ`w8C,Ӷֶ([&l8$6YUՓMuY5Շ'o;_F`|uzQi㔎 6*Ruz^RfV𿾜m?a]w]{x[^6qfBM7,"k/pz8wfi*u y(׆j e\̤ aYNXfUj Wmikc:b_Z1ձwN /=P&S5^i/B^[76l4L7!ys  Zӳ۬?dԓ0<_dVhcZhE +Gus'ܵ|k5,X . 3O $[?\hcjψ20Rܠ{A#+"ҷ+5rebo+ /! xA^vZ[;A˦߉ IUqAz@VWQ8B N6R^QӡQ̍Wm/L̫]3+쓵<1{D4m$/hlm"ӍvR+og(* YjFm$X(U~NHt6)k6:"h1s S kqT nYmfM?_ \HgōqJP9Vbbqr^QoȬ?pddwb֠CP5f5# gdtP6 :5oL$U^ۯ Rq("2a^fLY7%Zr,;]e@2sd{w%h.gt"DFt~ U^Ar!ʦ0np6 @İ:LJFW 琼i-˯ELVl8j~/6| ~fMs#nUz)&G V"a9K$2rH~^y%Q-X?pooj+}S8!ۧQvsI, AjHk <7zb:%UʿJ"˼˫٠I'_NT>-ߚreTi-8o<)Md#[oabPA/) ħYrdǍġ79nUͪ a/BY'8 jUy땛;('H&p(߈"eՋ]GkA%z@v6H=6qjtk_ (@uE={,օ4 uXC!h Ĝ=VIxw,x ?Z&@M?8AezO#RgYm/XN8l5ֆqBȑb['& :XVe> >>L}X%KmY4.] X[/s]mƺMQ5# endstream endobj 38 0 obj << /Type /Page /Contents 41 0 R /Resources 40 0 R /MediaBox [0 0 612 792] /Parent 55 0 R /Annots [ 39 0 R ] >> endobj 39 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [137.873 387.235 144.595 400.954] /A << /S /GoTo /D (Hfootnote.1) >> >> endobj 42 0 obj << /D [38 0 R /XYZ 53 735.4 null] >> endobj 43 0 obj << /D [38 0 R /XYZ 54 697.538 null] >> endobj 2 0 obj << /D [38 0 R /XYZ 54 508.138 null] >> endobj 53 0 obj << /D [38 0 R /XYZ 71.933 191.043 null] >> endobj 40 0 obj << /Font << /F45 44 0 R /F20 45 0 R /F14 46 0 R /F52 47 0 R /F59 48 0 R /F31 49 0 R /F13 50 0 R /F8 51 0 R /F7 52 0 R /F67 54 0 R >> /ProcSet [ /PDF /Text ] >> endobj 58 0 obj << /Length 2415 /Filter /FlateDecode >> stream xڝYmo8_!,Xy$Eew{ksX,|pl9նRn3r4٢Dg3ϼHgW~={}~_ΌQ6;_g)TQNٺW039^7pບ wxv^0^m3[ 6|0kԙȺÉ->]g:?tf;.L/VL);ͼvޝL̦R~+_Al;c]O`f͉UxЭKx@xT͋B*}ݢ@#()+ D7)ҫ@܊'U~yPհ}8؉}t)4((nH.Q*}fs[)yH N|.q[`_*m)mĂiL5H2;  ͍SΕVk/[dӑ4m $&]za~!dہW :[M/pw۠|l؝X$>: DOaxK'ڒ-ƥ>L[S1Sa]YYoKp-?x"{Z[YcΏO%҅sYmrnIn;@E rK Zޑ}]:aLw8 nQomR9_R}#X0Fj֥\"#!<;t}"y!cpH"mxgy>xBXFr2 Á\*b%큚U%IGnTo cN02F`e@S[MA(]+mGQ|Vӯ}GA[~*hL,NQ|*.$A WFB\4. -tctc=X MHO`Ţ!z^7g:<[v]۱{FGS$Gi\61D>8-]ϛ!;1Wî1Sr3Imy>>C) dXHyu ["GS-c_ץļ)?a9ao =k/Zf5b+28^?#J!M>6r DQ-I=m-gKu}xF=f ""1fH.IRI +8)/*ם6n?ѓ©|R&M{Qf|4 )9 . W|bD{96 3ۑ-Mj8|LBⴇD3KZch!Xm5jTRNO9f"}EmȊK_2?ٟ&0ht[kKFLx>icA$B+1)*r 8 d'9/3e&;nI1 h\d( }Ttj4'^]LMh'1) Rm]?*cSj cKB7| !2%ɨR'4\͹XHj;bbFf'[5N[eˋO"( sYBTc?yH0*cH*Ś/Êr?R0 vбIy]t+$(TNPdo%!lǜG8"N>(MpL*)ѫn&McOt-ۨww л5mriaxtCo/QUkeǹ; L?x}d_0gp.́lm5?ACwe6`xӀ\wIF#ܹ$iNvG x}#aU9E M+08㑡~P#NvCP7Cg9a]k'A(,KˡDѠpӞӠp%}d;&j,teNGZS|ͽ-.YB>T:o{L$ 5 ?a&J#z1@̏^{^uOL狤w&%]LUv.RBf E,o־QO %4SCSS63E S*n c|}QWt'cß*|=2( endstream endobj 57 0 obj << /Type /Page /Contents 58 0 R /Resources 56 0 R /MediaBox [0 0 612 792] /Parent 55 0 R >> endobj 59 0 obj << /D [57 0 R /XYZ 71 735.4 null] >> endobj 6 0 obj << /D [57 0 R /XYZ 54 697.538 null] >> endobj 10 0 obj << /D [57 0 R /XYZ 54 588.464 null] >> endobj 14 0 obj << /D [57 0 R /XYZ 54 356.225 null] >> endobj 56 0 obj << /Font << /F20 45 0 R /F52 47 0 R /F59 48 0 R /F73 60 0 R /F75 61 0 R >> /ProcSet [ /PDF /Text ] >> endobj 64 0 obj << /Length 2723 /Filter /FlateDecode >> stream xڝZ[o~P,"!˹T-РIhE~%VWA{!M{}593s\3t>.÷6-B,\J3)lUMV7Lv6w6L$f4sfKle ]⼻\]0?= ~REC1Y.\0ɳŢ<nr?^"=;,VT.6~5 gݰ̓qSK '8sOvY/\*ܕxdUY0Av@v;oH<Ʃ4̑h|+z|;L"j 'V(hqV%Lv^Qef<21ѹ{Swظ9';Lj.MleoCD۳ϊnPrtUܢڽܰ%Dg~?ߛh8xhQ4OkuUuÁGl N`<1SlɩEՃ!|#:>|ġٜCSЅȣ%w-AEdS- ?WhF$2lUmʗ6YG/gk  !+5Wowr賮HE >E{SY#޹a{M2cfaYzJTG9aFeݱ$FL}Qfdz [l6/}5=xមqڨ8J+sF,ݙзVEYzHx*I8HA0Ѽ)ߟڮCh91plRKye{:$x4,q'ΔDc9u+UOۼNvň2ς+c{ұA(h9)' pܾ/3l3clQQ[NQͽͳj_IR-ҹ[r<xUCҴ S4A(*: ܊$n#c`,]14 *:4In DN"jk=+xec"ЦEUf"y:G!U%H !#"$fr)#26MZр6e.]^ /_!WzqY 6}R5p}니mյ@F~[(AoKcrӢD2]PRS\H)[LiьрMd҆S<? L\pѭ@v@N{Ekn="`3WDس 7;f ?PzAٯ*ŻYz]M3v/q<阡ݭKW]dR٬=m vb̚9w F_͍~gJu zmG9@\Znℭ׉V.Ú/8G*‹}ϤYo؜`0 aw3f]Vao۝$$7U!y{{H2̎oL/SM\`ٴ8ǞA.Sh*p3 @ 6[`S[͎\e DEXN:1SsC+޳Fc^u kζ#s.xKay[NүN [7?YsnnCCח֫r~4?kn~ j5]/)L1ɲB4SZrF5WLy`j rpf> endobj 65 0 obj << /D [63 0 R /XYZ 53 735.4 null] >> endobj 18 0 obj << /D [63 0 R /XYZ 54 316.682 null] >> endobj 62 0 obj << /Font << /F20 45 0 R /F59 48 0 R /F73 60 0 R /F52 47 0 R /F75 61 0 R >> /ProcSet [ /PDF /Text ] >> endobj 69 0 obj << /Length 2307 /Filter /FlateDecode >> stream xڍYKϯea fwl^؇Y,4GWΊǃgwS89Pd*&˳7W_^}3kM[.l덯mV¸nśn |v<\"ˣ|tkxIǖk<{ ^nϳB]8^۫OWjۚ<[CYnڶʞh!+엫eU7y?1df70EQT s:cmv S5/x;DQ҂)+ޛdޏ*gmf4+ti.{6H2AMê'L J&aGE)1hx>(ΩAKh~/l_IIX .f{Xa73eXiK@&SƢ/vs*YDBq'](A6QVxͦ}LB "j.T+acYpVW62'eTL L 0 [xՃ̫UzHy/odYgCd9A,L9}2G.ex#c%5ĽNXS |Np>s[>q b+@N^$K~& u wzzw4>`Ge81bcrɖ)p=:=exw݄#pO5uic Š󚝎jr1M)>UaH>F[#௧"` ҩ|RP;56 |93db8I<'F%boF ю<rmt헻$2 ]fklYlRX"&*Z#RB.ƚ q\s7-ogMo1{1o֍[sWÍTW7Ǎc^φ}g< IYQK([ZZ^e*PS [ollZ͉EE+_.(UU5sVۻ IfNӖ:͖AӀol5d# j4KG{Ϧ\bAglu-8JTl3b5U,c2I>ZV"3Yi*=_q'nܝ|=UU=$b Jw\.!>" 6r'kW  1Xf)m*=Pv>w1#lG'!sυ6)SJh|"vlÂՉv .d\ <gG!ѥ .C䴓pܣ~yY Ugq%Vy@y4|*̕1DkQp▢N i Ft${/8w&H%I endstream endobj 68 0 obj << /Type /Page /Contents 69 0 R /Resources 67 0 R /MediaBox [0 0 612 792] /Parent 55 0 R /Annots [ 66 0 R ] >> endobj 66 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [552.274 382.482 558.996 396.201] /A << /S /GoTo /D (Hfootnote.2) >> >> endobj 70 0 obj << /D [68 0 R /XYZ 71 735.4 null] >> endobj 22 0 obj << /D [68 0 R /XYZ 54 256.495 null] >> endobj 71 0 obj << /D [68 0 R /XYZ 71.933 119.535 null] >> endobj 67 0 obj << /Font << /F20 45 0 R /F59 48 0 R /F75 61 0 R /F31 49 0 R /F52 47 0 R /F7 52 0 R /F8 51 0 R /F67 54 0 R >> /ProcSet [ /PDF /Text ] >> endobj 74 0 obj << /Length 2201 /Filter /FlateDecode >> stream xڵY[oF~  9ئbvacEEdHT\pHӎlH z;4ZGi?.{mȘvFWY&*mتOM731>xg̺RGi4{Q%9$-3~u#<lI7/<и?}m6ݩOAn!#u3XR72pJ&(U) 1b,ļHjctw"^i8 D]Ox<cY2aMiROBQ)jpD&2^ŢV{:5d LXfrZ" G=U;.u)x 3{8d 7^I׋)ү!2 ) N yS|ד< lCج*&'Vլ6S8=+h<1 ,Xh$^NtthsS{9z>EhiC3 Va _x, OGOMA>|"36VוmdX%*9d*< 6+R+Hor+s`[Ӓqqd?L+F3-3{5MW( ed璌Z9I_`"/EblUߣ/`6ӥat8>!wwp(@K<m6ʊ +(/7\cu~r`]PxЋW}/oYqVn8E8piw/=L*n? ⠈~xMRsPSܺ"~MsCᵈ/0\ڡ2qSC;B8*`#5)he)䩀\ aOQqy688* RU!ZQ+*vS} f6\pDaHfGf66`nt~PL~h07ΰ%eX3,~k )f PeuƵlOTɤ*+&)"msuOmKB 0~Dæ&&Zk&9J`TBT^$KOSRZd=im-ZN.xs^(#Џ6}.F*BKŻz wj_%)1YIy&ۗEzo]?^-Fr_8q)Iwt^<})[WFGouss@ gӇyI?J+D{U+FϦ&+WTI6$X 5N?. endstream endobj 73 0 obj << /Type /Page /Contents 74 0 R /Resources 72 0 R /MediaBox [0 0 612 792] /Parent 55 0 R >> endobj 75 0 obj << /D [73 0 R /XYZ 53 735.4 null] >> endobj 26 0 obj << /D [73 0 R /XYZ 54 401.949 null] >> endobj 72 0 obj << /Font << /F20 45 0 R /F59 48 0 R /F75 61 0 R /F52 47 0 R >> /ProcSet [ /PDF /Text ] >> endobj 78 0 obj << /Length 1528 /Filter /FlateDecode >> stream xڝYD=GLgH<@U.8ۨI{kqֻxmF:z9fE#cT\ݬ"S*M'V%E,7871vH_quE䋻|-^ϓ+mlBd"`5}eߙA(7.;-H̢;FN[xn3Y,J +j5_$nreR]g7|ڃ-A/ q[aS ut*@]0  WZ%yԁҤyyA\@1ң^ 3zhHvM;(v'G~KK+,,r*[,:<4-D=ъ;DuF:dHDP$ʢ${ rN KP :VH :9h5C; j-<xK>&"FkLW}0*):.D|T6AInй%D,ҡS4#[*´j~܏QZ6J`6 XE]=[&ɝ0I_ߨvꝥ8IdrhQqase Y@ڛGʘz.-POE^6wq(AMISe :R[ن/HG ucGbtCN« *#~_=API^Dž 0#󜄫7DMKV2e RGg-[i{ax⒪:~ڈ,X%+ RJ |tǛ+'Iܼ&57nOCyRL!pɶ "RBr @Q KxKi=Ʃn|G|d:ec|fڧ3ϪVBwtoЕ]מYf ּ z-y, T7;QZpv^X/)Dy>º4~N ^{g~_zcS!QHuhQ~\|xPWi. 5O᫂ $a֒ nH)'Y凛PF_f{ <vһ?dh+ endstream endobj 77 0 obj << /Type /Page /Contents 78 0 R /Resources 76 0 R /MediaBox [0 0 612 792] /Parent 55 0 R >> endobj 79 0 obj << /D [77 0 R /XYZ 71 735.4 null] >> endobj 30 0 obj << /D [77 0 R /XYZ 54 549.913 null] >> endobj 34 0 obj << /D [77 0 R /XYZ 54 391.398 null] >> endobj 76 0 obj << /Font << /F20 45 0 R /F59 48 0 R /F52 47 0 R >> /ProcSet [ /PDF /Text ] >> endobj 80 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 81 0 obj [550 500 500 450 412.5 400 325] endobj 82 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 83 0 obj [569.5 569.5] endobj 84 0 obj [277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8] endobj 85 0 obj [585.3] endobj 86 0 obj [531.3 531.3] endobj 87 0 obj [514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6] endobj 88 0 obj [562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.3 531.3 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.8 312.5 937.5 625 562.5 625 593.8 459.5 443.8 437.5 625 593.8 812.5 593.8 593.8] endobj 89 0 obj [500] endobj 90 0 obj [571.2 544 544 816 816 272 299.2 489.6 489.6 489.6 489.6 489.6 734 435.2 489.6 707.2 761.6 489.6 883.8 992.6 761.6 272 272 489.6 816 489.6 816 761.6 272 380.8 380.8 489.6 761.6 272 326.4 272 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544 516.8 707.2 516.8 516.8] endobj 91 0 obj [726.3 693.3 327.6 471.5 719.4 576 850 693.3 719.8 628.2 719.8 680.5 510.9 667.6 693.3 693.3 954.5 693.3 693.3 563.1 249.6 458.6 249.6 458.6 249.6 249.6 458.6 510.9 406.4 510.9 406.4 275.8 458.6 510.9 249.6 275.8 484.7 249.6 772.1 510.9 458.6 510.9 484.7 354.1 359.4 354.1 510.9 484.7 667.6] endobj 92 0 obj << /Length1 1941 /Length2 12622 /Length3 0 /Length 13812 /Filter /FlateDecode >> stream xڍT #Ew;w@ww-nŊKEw̙33}kݻV{?MBM,r08ػ2 $$t9ll,llHԚW[H`g,$@WP f ` 8k,C@%=Zbi翏:sz;??/ӟq;3hPZ^3mruu`e`ڹ88[3< Vu  A EiqB  l!`{W7{!PqX?L`ga;_ 47ws{A-[0@EFӕ auqx!@W?KdWs1w8@lG6Kۃ$.H'q݋õw/؃,rsdղ8y!#xy`'܊^?_98:8,^i $;;;1w-!HD-_ 0`{?v^' `oG*..忕fnN37;8w!UOD9{ HvD ֆ^ g ٸ_?/.f(+qSO=b<_SZur ' q5^B.?.3;ѽzV+)@7 Bb{0nn뒂6J`ljp ^߈*8W߈5 `5XF0f f _ 5_ܜjb/`|e|-_r쯥7zuvkl\ WuX]krx-_> ǫs9;^^_ 6GZYt0 '`ޝJFB_V4|{Yoዻj{< Oes̱Z1Ayf $ 7_1s_c9 }79~-xWhrP`NH-ˇGY/6tjɻWƧM$wfն%Fm5r1syM \Ժq+糜CDl\OT9"lICoD"Rx h^9\ z}']0~Ӳ 5ND4gG)cV9'uF0_lDJcga'jw{+>2]5%䤹 *3eX ڿWxȯ1x4-a):QZ[]~I̧%l.S%j-|%ʕ͜7^U> :c.I.dgY'J$P=h uƧ#PB)Ҭo{k?Șۣb驁*G̶ᖎ2d!qng_ ;4yqK[ Rp28/ nwn$qC# 5n΋nVq s#RS+ym~-dp==H?K&rV/ UYEh'C[ܚd8cV[.#SH_(g9[|F=WFwyl=zQKأиyr Ap:/FYp$vx ArvP<[(d:Y^|2⏸>yYك +J7FGע6\ST3A t؃!zIhV'*sd +u0_iZ78 _ }-!]#sM"lRթU: (-Mynw*G8係4\_Bb˴e89k lMNmq3vo{Q ҩ&s@3stgG%UW?꿌 xĽ(U΍E+ _#M*WՌaXa:ј߶M-Nň,ًlnZw$ǝ4eߘgz0S0rSm̵~I)0tHGV1e8lF2UQp?/HMT>)p܉w-nU \Q){($jU^\iXφ+n.^`*5ky8G7ިr˜@W,8"Ba񺒝<28Yחw F$ !8'!YcNivzEg/_h~Ym`34]]>Ou[o n*SfO&o%D/ 5Q]NMS˺(x?+t}E=oLnJO"NL̙@B]p6P:ҟ-׾U%2O)p¼81:KPs؎lgkb'Cnʝw0z}\ JL|4@!O)Ʈ:A^ňW\-j >+“Pa:R vBULǕBH(3]L5I,޷[!MLUwZQ~ܝK =5Ⲃ zU&NyA+s醢^ic+FY+l0G_ݏnH=nض \-ޥ.ɸpSOa{1:J8 m5pSE+ ybQS&I5mF7xpYӝ*=.@e.xi.{T'IG㖖EGTSɴ̰DH8ʢ8e 5 i3V{(GE`ris3[nwy(h&TKȧ5< } j&HRv>xE-jsxiJ$g/P*jy\@K9ǔF$/|-]Y;pe9zm< uNjihUNBshа+@m*o>+oo:u`ަ}*D 8aU M"O]>M9kn»x}ec<З#G`GQmru!;OM0qG_7C~R=tSRg1lHI.,6,BRcrƑ0KPT=oCWK^>PXµ>+9.n8^P|8 ?fg$LAaM$~_E ءz|FMu+ċ6oaM.]F xzgXjhj@u,E?)ZDx'%h%t_iG]^_&ڡ!|nW|Tf"~ gXopVCۦ.6W9l؟|e􍟅cP}4jDw${ h":#QN`(϶aw%6e~-#opBZȴ4YH^Or倲dF{摉\+JgZc)vkF䴈h(4\''Z3\mP9_fL! 2l  a1DΆDM~bz #f|aʸyЂ(Nmӄ #T~@ÐIK!:&kbvw+uå '%FaNF4M)+Xg7 ;H8Ii$l͍r|=i=GFʷT'oW5ʸh wڞ"Q{X6cYbJ"Q$%J֝yQ&oYRaVH Şw<)]%QHkf2x =_Ar]3Sv#B%<&Vt[BA~"]R3k XhγGF!jtg{Ƨ5Do;gL8JT\D@qd䐚inYu1V#5 rXҭs!y5,WslM{jCI`WFcZ4So:>V˓g?'5~Gx#ϺG-4Z{[Q$n>gEE-୬!ElmypI#t1)>8΃*\|0*??6M{ b\}g.>\0Pc:n{}]t?7m"F^m.N./Юy2^{74g>WjQIN-H[bg;vL߭-PKeIT6Ue+d+`D  | /S lj:ۧ]gR$KjCmeA!d2#/lMD3g{ )1MͯPƗEF ddyeyOǍ c呰L|Y.E'6Իg} 2P|a& &@jK{@΁|Vw%m~rvx-`| yc+_eSj+; vǼܥ c?u#Ч 6,p%TV:hQqjBZ 6Sbrh''QRiwQ_IoL$A/Оƞhk\EB?G+xymX9l"i+=`̈́&$R0o}m{d|˘pn hDBl jLq#%kNxV}/ 8K}[&v|Mꉣ^6à&mMb',!A0fa7>v>CcWW( w>|}Lw|g#oy P(B j3> ϲ࠭ 0MgbE2qBq^x]F.uJFQR Ԯl Any_ N!:*w֛=)Si%D!ҥҵ93Qk-[}(M??{YthPtOoZujN:&9jX<Р$B'}ԸjS!>4ҕ16C bf9j Rg! Ի׮aI0yǹ}Kj~nE߽FxBM8V~L 8ek߂ Gx BS@W<i'=}|P sXh ^b( LZvyGy3d*I8m\ԝ7J ]~U2jy1ͪVS{Zzhrճ#㻏r!na B/(X`i*W5~R$R毗fNuX^aǾ8YLlwQ#+ {my)/fQU2UuްhDiX_G1:PjdhIy6Vz(Q*l8n&2e;*H1tdyʱtd (Nyg9q10(QSV0SpYf <<:pCȟBtXRƺ>IovbK!qF+-3-OY}"oTl) ~ fBB(fȬYs;v;>PGVcFg ruLh5Qc jj4whtzE3۠ %c[ɤ~ܮ7d~{tF=~RHDV!}lpwK4+;RWU23)`/5%;Z)^ҮI>\鱻03PI]̓  QrrJD`鳈=B+]˒ d6o~N\b辌95& !B()%^" _..p3Oקss'i$X[} 7p>ZtJ ![u(P/M6NވY[d(#Vt8[!ҕ^eFmH@ S_f"}kt@x07Uvg u k{.i-(ΌyB_Z wtQ{8hAIQ}Cu)0GSoo \w1 (!Ye1J4M.#%y;SOz0ϔ|B@+L5Mk} չΚ=RzSݢ胎3jTʉ-qQP&F #2Hw eEf< c)tnŅ z<+ 1>61y;t'K^kPɛ`O a;)PGu&)]Q#bbݔAIS 9?][e|\W9]`7؉WVKn0rDEy2,0 Wn{R_MsJF⺪9sMXgb1lh~J1qmZMICtB:f.yFc?ܖ?/?!YHuJi`g|%Cr3r.<=ETϩF25g+f[QL<." UN")GErp%oc*+7mlN|LWL*"6ɑQu#B Ӯx?S;(2|rt'(Z7X:́wVd1^z3+9 /Ru6"|6:eNgeF"h[Jp"P{ݤqU/SC\+CC9U~ȭ̹iه hC,cGa,YS7MvDF}nFkF>Hnx&f6[axއ>1r)04ނ/ev}4`6qR#mE|K-41?Ưa;n: O ,یs=5BE}>g蛗PjEVsZBnѯ:D3#}Xѻquv/)(3sk\qf''äO= 2|[-F*TNܹQ90BB*·w,*7&UO"ZYW%2:·yt\\Ŧb"l-xVhN\;fsF/将.N.G F L11H?9xIYxVR090>)~d(-PaF #(ܤ xUTcؘ%ߠOբ.mɓj?- xҤ+SqÉҼ5nfwpXFdر 5дNC Ky(ZwT3M9kMsAe%QÍ.1񝄴 h$Jm\%+<2r.:͗Cc6&10 IO$9<ήxUS5uE=:S\&OOPfϲӸՀ)Vi>y(WwoMt.4rf4A|_.=eB On/fl3AbDHZ|!lqeN];EW`§_3G/-K3'k`ٱS|{עQkU)EBL l~0OQhլ*ER]%֧9"c%4`b{ˌҲZƼ%B +Mso_q>%Q7'@.++㰨Flz$*ډV ;t$84 ^>bTG*>NW/^Z<UP,%Ń9Ɓ>h}9E`nݣ Ao0͐}Lu36.r(G>8IOSa#qr`T~wk?|J-+yė[|Q/5;nD4UVwVR6[y!)l<&j)N_r;~R8d_72ȖLX4p}φ޿EnYꖬֳmPaɪv_-k֘n־8v/O 7BD0MxFp;J ttಚuCV@Q}Yk"T}Nw b)!ݕOeۨAn2jZyuQwsJRӁ?kUXGejVoî֣4dwu%nWu?#5u3VU~k`T:"FE·QSkrJ^-׀XCx~PV5W͓Z~?1oS_ &F鬫F`ĘY$d3ǫ *f%yWHVni~GzS5[j4"ƈJ1`y &Pwx{;wd9)cj_5@wI㇟"&Cǣ9"{܀`qz$Qjs \Q'v6+ʶN/E_ooCjomJ &LRrs ;|B{ZLF# wrۦ*y]: 6Ʋj`ϛY\␈6[V1A"ghI޵{W  %jip)e\Ɣ1ΨfVj*wEb8xÒ6軗&*8VQ6єVj{GB/7D'5Rlb P^9*QKKy1])n$+.$|!~~ݸAG r1G|kޛg]kIwjgi<6R4)S=DǴT͆3wvKDronO$Y~sX\(MK'3C&6(D,YǜxWϮdZ`9Je|\r h9vtD-]qTg A\畃?1 c4@J}Nùξm`3\v.R60MC#J g&[nPP"V;-&}+f1W'hPar78H4.4.A2I GnM@Yȭo1B]VFhm+kU7/mptǂ+o.d.DAϖ.f,XM1&#Kf9ݛI# Xz}&n`l6g~e%\y'Y8$n o҈jɌN\RH}ņeŌ!ⵃ!!d)FmwqL#뜟mɕ{fs'֯,GwG4J0Gԗr(Z }DML*[(בjT)E#tX.'E^>vGW.e7cm"_pI6/` oʋXU!tcNbO&:|,0htj7|^ ]T7yTB6a`9Ry҉lT Pj{wX&d8PΝZ¾]Tk lM yFVNaəBwruW0GL?F$~\Hg/v.ث֟ɺ;R4UaZUto|WL4UFKTxWaY Ӊr:VTkFٟёK=_RV=|z?szcU}OՋgl ;=F;P smjY25gZVs 8`{rMp;{i(s ƸJ9Z2⦅k:%%PDwAZ+bn6@DԳ(/SI="vsbRSvpo~Ȟb_P+̝R50+셢x =KK ܵJiEZiib juz'xԇxɳqTL:QJ4*IX% F #3!ɑD0o3z&˜yQ?6fO7٦]'Zj#!_K("u|l4⸾2U)zS#ѢSȣ\}Re~Q؊ =nNlWnn܄>5'QdD[K*f(7<#Z١r -khMcWE7D#a_o4Cn!!پ8=Vps=Gn t.\YߡqlF=Z5dW+tڈ9%t@! OCBԣ0jZfm|)$fk-G%8⣴60¢˞z@lb>KY'v&AQЩMw[6j UćTB`[N+< Tt77B:y؜jöd'j&ŴpS=/טf&F#r|N[z?ӌq eܧېS+m]2#d~x\Bj> endobj 94 0 obj << /Length1 1891 /Length2 15170 /Length3 0 /Length 16339 /Filter /FlateDecode >> stream xڍP[ӆ 4h,0,Cp!aWv)๺{{grb%Uza3;ș *`bbe`bbA 'Wrی@tt 4v~;ہ2.6fV33'?v<1cW+3<@tB pt~?*Sj377'¶@G+Sc@h @ ?),ym-nVΖh`-_1 ,eW3wv3v 6V@ 9@UZh+X_t DV<@s+ @QBݙ` 2+}{ʍ]_%2Afv@_Ĭ sy̭@fabϨrpJ;݄ `gbbf@wSKƿҫyv2e~`^pvtx_B`fY:LV wr23鯟>鿷QSA]BD_'"bgcг3j2MO[- s;jx?ﶠPw^i}=&v&_%,oI6w{+8po&_,4r^igY$܁fJVΦ{z+Pꯗ }L?Po}wKq_0vt4@xwbx1O02ߗ9"uFѿL'+QzC\FQb0CYT,7Q3w0#MKll'b4?]|OgwYw]60}A ?]?Up{c|W+s8B]wP].o2uqt|=MLyk?NϐjR{-9v<"&QWg; ' nS-xÆ&(=y?ƩL!,Nb ,8OO& y Rƽ[]jYih(Y\9gz8 wٛo?߈dh|NY t6Xb<*Xppup oǦ(DeJ W[ }KYGe8`ɨR5ֺ-u2$)? `$Ԗ6}4t$QĬn3pe $84Yk6N_myT6<2@z?4Y,/oL#n“A]<ѥ J mx)ǼUĤ >ƞ}Spй1`ㆮġf#גU(3*7CKʼu٠2ƋJ,R"-AB6i݅@|3JX|e❓H񃆀!>[rC;JpM5/*ߺ$#!zMHOD\mh?nw=ѕIS.y// a}igPCD]![$5nҸ|vGֻ0=M<:MeSW eJ ^O^秊x5h&\_1;\?!`e(0q"((%WHm>!z3Kk3^ݯ7|!z]dbG{Iߦ%sA#pwXku~oQGh™EmQ~|*KLSF:),RW'*3&\F Q@1;u<7/5):tYbD=ۥj8w[2D "┑o#_!3S7\_ۡy}baˋ_9땇p 55øFלXc9кI\J|ls?Q>r48ʺ0>A[cK9WMzο;뵶)fI՜~3cZ'(yT1Ջc'q^a821KmZ[aUh[rD8\TGD2c 9B2EiF#CZ𱢙>{C x8>y?+;@BnhRv'3Fb+_҇%>-'l&Cχ7%}X8?6.,9WRnQ;vHk'1Sm(XV)TNt@,g6]wY1jH_)1S|vݠ?y_叩aL_,ve*AiQ\3 lfdd3!_%8r v+7R㙚lI#!vgKyEtr*3-&UCQɑmP\h%NA 9R*4ͣQ1l_nzMoM8K.0_;Fhp] oh"i4H&.,,Ke.O jPDONc~&Em?ǎyNAǝs6"q.c%Qb#!iڶ)¤d˚.m[( ?xtr* ԢWM|} XUա+\_*XXmуeJY rPSPE8Zh؃׿s?)ݸ< G_,\.chmwBxRJƮS㘆5?3Ҕ FW4Z+Tf:]mA^ȠaEU>Otb_CDbQV^-)5S# ƆƢ;kd2zl.ynToMfPνQ\($ 9 &6 !ehPx"ͲhcԹ (r(}쥑@_c,2(RNSN$ASju}`53̗7 *U%W*V%mDױ0yHT^TyaB\]<5bF6kE*A\GYhEziÙ<-9K9rT{M9bӨ{I72%Ab!Q% !N#T6(xJ4\|0::5ׇ[1.PozGw:[_mcK͜Jh+vg I_z7tsaD+cXT( AOp abbᤔjFF?w[=1A!g ɻ7a/|bӣ5hӰNijj$[oAv8^-p|b.ܹ[0 %bX{] xm!U}ːoi6v" DYLMHkgƺJlR!9G+Q1HXE~/]?oJ̔3'O+s pʴ\781BE4ZP.uTCvЭOto!R!HhQEmՀ:|hsY)ק"b@"bla΂vO|q5XJO~%O!K>ώ(4v敵Z`֋QƜ */AɨO@=p:>#S aX|omDX3yZ"+ؽJT׌ x`C>.IOfQU.|%^_B0*8"kLHp La+pXy^]\Mݻ8B*rCe%ZG~)d#YpiYݒo'O"KcUa3hcʡrey%mҹI^Bnh|})lm0!v)*<8Ĭޠa1)Ro Zn֝-vySᖍ FS-5"qNhT ݂p0%Mn.W\&emIE)'֭M;Bg|gA&%`קAp#{!sKk7/͜zDT%~R:pI5KB#ʉܵMX }nbzI@|/GK2:MB.k*6*7} 'w~frtXNͥP÷Q(:bBHw@oB|F;o yoS 19V-bQLj!!DsD%^v҉8&dG};H}}d7-kI0,)>!Gz+3a1,0WM#5ӠGⵈ wΪ9p9#i9Tr^2B-΅^F]ua10˳afMZRn 0XdE(AR6Id^.@;$'On^#߼lζG*"K?nܼwńgLXWX'8(0ΝSU]SUc2=tDW!?4~f">g(S \^4%ߨ?Uh[Qe]M;ߗ@}mTf Sq@bQرW۳01WLZcx5So e%"S f<@waMPuW)rJL2o9⤔g7v50}0|܂~ȗod`,|-{[{ۇc'5~˃^fEnS`VVGDvp܎ ^ QUk~%S/ jve5{B;EME2JS( Uj9Sw]"X4q)׵sL`: })ChcEWJUV/LB]pH[F& zq: ,)^C+ۈ곯=ОEdb SX>XR+WFm`mkEj39J' 2(8pIFnp萾| DB8nzMmtr2蓫>嶳,Gկ0rE~ȡ:ܫvWT\P϶9ᰊY˄[%B"Hu# [חgSb.tSURBlw0k_$E(4 Vty@XvKA[(+1+"<]OWB2'v]͖A]5d漹;ϣEGSlm,שõ{ac؈V:dܨzWhON` oPQQWPr57Ĩ.gHL u|y*a&0ۈ*&pO?_~`%begW ,Բr7ZlN(e9;y6?JID_rXI]%/5󊤿F<-z>U\c'E>9j&ux&fbAa+Q r9י~dvX߮X)_}P +0n?p1V엓Gpƫf'F(Z  ?9np1]b{'Ӥ鳮-}mf{q'Blwpea\WEK-m.G%Eso"@|ߪFmCyz?je6Cs|L#&t7T3r.+RtT]q\ڪT"ijP4]K}-fR2ڒ*^c< LCf磦DoFc_ޞ+TFia|lg(& Pu)\ z4)T ׷K-ڣfr "iF%>Qݫ&*Z ZŸLKPa.i*#Nsgc٬K#n,/:"LA)j)^)`a^f`p?/,pm'K,#+8gbMʗ kE| j14U|Quq/I~Bq$J> I$cQsIm`Bi蒑.&*/Q&M2j'Ok 3rMzz<i^̼Ԁ Tgx2T.85ls{Y"~9_>Q7 n~>斜6}3&:yb\a Y*`(WV GŁ^2#A#u]zbe;[gSn o%qut!ӴQw b(Pʜ<'-;~EI3+i8q_2y}8gQYπE센G: ۖ}0} >o SC?r3譼]&hgK^+o-pf^X.^(wcFv&VY=$)<{8QGPVAa40r#V Ot.eJG|{ҥ0.MC`:A$#bDiJ>TMa8׮F^RU5zfJUY3o}Iv9vEÎ6}q/RTD3אNf8 $reo%v(.y)(AR(Df*0pJjPRvvRcIRʧ|L9xPH w;e<s|׊i|Zt7Eo򨊱oD;6:]ϴ%c\UC>~~fA*+LuD69 fqq~53مدC&>P4/QM{:Ox'Wϒ0_ Yf-9f9.`db?<m 骶E"`9%Ī?b"7|UlžazD}ˏi1ܸI{bCڣomvvUa,K-ۗh8Y nt(CVy\K1/!i sC` 5l1ik)ejswSQ]`eH#qnm^^%Me3^ :/05tzs Jxȃ 5gDOcxE"5'HaBf< j+f"#KzN~spl>7iq{6.s{X\,sئ@{X=?_uA 8*G -9 bnB' +#v)SD\=ڡV=+K!ȑ!Ķ/Vd٩CNsVǺ 6qD>5>uhK!aV3AbղSH:u7ri?N8MpȶWQ<-zoĉ0! _sUdZu&~jg0/)A4M"p\._+T1<[=tjރ)P<U )ZF WÊD &-45sax_60IyS+[:Ur1="Tx UP4';lpDK*fL2ڊ*DRPj9eh4#~բ53GQfuv ,Q/L2;2L`҇YoMHH{4nHCz.Zuq_~Uk ͆~wԐN8; c~QՉ߉Ո{c {|B/`)evkaCUm{-tPd#ErJ<'U*+O~)3/LŬe`sSLۉk`"7untí!p^B m|mX:EMz$)1sG+Bيa.yEKz̯-!IIgNE:؏p<`Y϶O<wk3PJu)IT yX&ӼޭgP>ti;R=ـN ;,$# BAQ'wxc]bsdțümgZ h)|`&ܮ{[PE:B-s 'w /vNiL6j ǫǾtkS*˄1D0} @HU:p[Ԏɷj8 e)AGpFR8\Nm!ɨݔ󭎬u*x *hN_!8 _XϘ#`׭.쯕_/$:Xvm3d(HCðhjsEa;mOMˬ:r轶KD7RV画jȿn R1X7J :9:,;EQ".3͸Ig^5i}9I0LE1֬=3L<hx SQتXZ%/V Nd[IG񳋻S;"wNUa`QgsZ)X b%Kq4+ot\ìć/^#?-D&:̰ZA) &d6"ב!+׹kyJ­ZBA偌۹tfY־Z y~A]i=QU?#> Y?{+ g l3 5|3`(IjtGP/ ?*a0b樓AR2SzRЬk%xSokÙe3+o1XTv>WpƊ$yҗm:F*∜z2V## fe42*>72`B&CS߳XQ6XלiP4Ѫc8ɵSE|Ď9:8&̉mE{Rc;2\]Zp=@ F 8OXsG>̷iYU@-ΜhvU,lG!hW75SUS!PBllӌ'k4'&TW6s@#B7#2}ݮ [RR6i! HIq)XT<'F}bJ DK_)uu'Hms@u_h,*DTW:e Scad4Ig'"&ZF4LfL\ q:w<-2UEAQeywr͕x& S\=s!>kɉ/d^4%k7i;4O!pž삁_kJw2ɜR66Jn~v/M@"r U,MDS"xwx,V ?IYOiYH@6;=A.ohl<@-@x''Y!EǗa{.9WZUMyadxR~6#ɧ@C/{K!I@::BMgcflh.ȸ_Oje`mF;0StQ@%4. a)nKɼ0`I Ǫ,R"8gAc~xy3=룗9arư֏}Fn )MDZ4e~K{vv#5Rڡ0{t]\bwLRoOPbۑ6jj\|$M9|eȮׯiMŀU?2KoBKASPE,XPw_lt22V؜o#^BNR z*psvV29n+]}BEymxѾ\p H!hx |]ĥJh]{+tis$YfﺏjeMDkoPaHHc̛c\[$#«7̰vl'f ԑ~g5k0 $T ;e3gdy_,ibSN@]U|4 XItCZ/U=nPhZ4;wk;TÜ֨$ƺ3֚;hWT&S @%ء66 TNg,>OlQoMd `q<~]:&dl1>-^= E]tb;Kl4$ \;q-].>^t@v%6 eQv#7>%?SjsD,, UN<'Rk̶Xo&RcM\MJF\zvhe~^+gBz;pT3uݧ< 7|1|(Y`,9  i^=_~Z]nY$^QҜ}٫t0 -{T\åQ8%CIM~˕;}(~J%ufB 8"oZirEۘfpĺpQQ-PkmP2<;Q n .WD?RpjNHb5L#QؖNhw@lɪ]ΙVFrt\z!@8]9 xJ\#+Xr-{.8aq2P$p"-r4]_w uՠBɿ{q,Sp# @VAb~:aA@a273$P 3n~z݄.'~yG |$}Mex{nlg+:I-C;_c %4(>OZ᠁skT%pn{zVX4pJoM?>JE$S<1V} o8E3YlT] yん[;`.QN'CN VNh#t2]ZtjSc2. (l{:@G k(D͞j$'WRdWj u7%cudyhG!"1 endstream endobj 95 0 obj << /Type /FontDescriptor /FontName /WNUFBD+CMR10 /Flags 4 /FontBBox [-40 -250 1009 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/C/I/M/N/P/R/S/W/Y/a/b/c/comma/d/e/f/g/h/i/k/l/m/n/o/p/period/q/r/s/t/u/v/w/x/y) /FontFile 94 0 R >> endobj 96 0 obj << /Length1 2492 /Length2 18750 /Length3 0 /Length 20185 /Filter /FlateDecode >> stream xڌP -8Bpw N䮽9;9{UU={ 9 1P΅ *`bbe`bb''Wt Otr 4rČ\@<9{; `ab/މ ffi cE<,-\@e'ʄIw8@dibd3rڂ*TM,.Łݝ֙\nbP:܀l(c'ZX:cW7sq7r@K3(Hve!3W"KLLm<-f6@, /=(DF a%H98Y:838[%4.ۙ\:vO&kmgn`figjSWF5;KGW( o9:&Wtd R`0ZAཝ܀'WESK1wvh =f_?Z/S{;(%!G}""ozV6= ;3 ,F9vf$z_n jV2@{uؙL@0C_Y6Ho7Mvu 9{ݰT ?7Yhjj.F!lgno-%,=.&JociTw331辙XgЬvAKۙ؛uX9FNNFLbagx3.)02ٻB y3{'&`o `q2%~#fo`XҿQ7U@~#.o `Tq+FzʿoFzo/1~#71ME hedMFdcd7lA/ot]/A? (zf`Q 4F? [@PKl~!ԋߙAvUk0`q8v9>kv6@3VXy}m4 >􌎿 *j45*w_)S`5w'@A@[]&8@?fJ b Q˂^]F ' ꚋ@mh? (ӀBN 4?&w/@{`ja|w Y}TjzeקIUNwI=(kTB+/?ZaZ~<+O/Ma L~!\OG@*t` )C^1Oңtu,ta_頊#s }Zn@yq<zw4h?=nfr&߈ei}OY XbUYppq!oƦ)Ee 7R:Ʒm0Qy+?8_SOP0BbHlJ-"Ia&!}bL``YǮSuKYIlTGlFSG>`|9{Cwd}d8aKyf{*ǐܥL.  ΃qgS[\}$@֤1ZXuYw-xѤI- z?3Ov1JJ߄*r2QI<6AmbINmmm˄ǼR_kT\+gc(5WAF'{1Î]ߋS\>0ͻ7_ N˱[ÊI?GrR+f٧㐈vK\a^\Oa[f|,5C"jpAo]FצL}ޟ>̳$?bA&]?sKZGM]QL vA-`9|$sdu֗s+hFdWkо85!Ks 1u*pSԹۋ⬅?)4׶!{s3,-UZЇĄrl˨=(vc)X8 ,#'Q`-^/ &ua˯_`{dhM,|DNC>N\TJ`NyJaGͱ$ oĵO) 1Xr9dt]O8cIp0ȳB[^S!L-7V:;ñemPwh*D -_I}ncc'L/R=0'_4fě>qwT7Bmv~^G;ލ]:Բ0>8rtB^hϋh[L/?s)[)2JjГ]߄=h ȶỈ!qUxԶOIlE-O+2`q&<5O&~l,}nc]r+[n/i9Z׭e^po&㕛Gm>m'rXs@,o6Lkoݤش+S6ٺXEOnXu#l@X0Vi[90?>{$E$%J6;(%#⹈-U A *0Nl=cAP>K6Z+y UrU'%P1!o6'ai#yIoa-tb0O,j3H-: |ۀi{.hIg[śT9(ŘXĖ"bfa_sNgf-(*<҈x!=N  E4z~?'{[rՎIwN!ZBrvMxJ\70k6#px-,/j׷]; To)ofr J|e_ci~&(60 ca5ԗA<6DVe4_- 'ɜ KZ 5/L/739=!hG(Xi j*"N_znp2᪏+Qhӟjlo 80)qLZӨ"6RUe"s+/tSW ː:@iO _Kĝ姣lMJ/Vzg2:(Z=*x٥ -6sԠ_Nz pIue3u"pda)tY\H#qs$xV& 7d7]8RЭ]K~V&e` "4W' d5^ЍU5^mEj\WM}8w}Gea>$ōjf·,m2+N) ?w^^)XL׵ qyRJۺ4Vʓ^|?0R% y6%PF)<2&s [_z/Ir0T%ׂ!%'U!]HAU=j_G*pBa7N}DI&\G1^"C#&"Y$}ll=Ӳqy`Q#aQ ʑx"yg@IgrGɏԑɼg-u`hS|a'EPzaU.P z 6ó dcvSiq885U'uN6|j912ь(cTr1p+?'(8 0eWrk SS'3ˤ#P#Uw6rD͏ԭz<5`[&Q+tA@dC3 :.u$@b6%+@pǖ]q/17\ ~rVC^5V`Cvxb˶KCj3}ԩֻ1a.qFJv1#Rt٫ITe|1>q.@ET>Hu$^-xϮfBll&q؄f jGNmYFI7fsV.\|M#LU_V`á8 DsWBP=IC:O ([ư&N-Wx? شdnoc Hح J%/\ύm1>FP-{Ņ W>fA:Fl$KBjDgYz!q'I@0=_F eqUt![eK>o=NFXL?Iv"U2)40*aV ސJo50i 3'.xs3".V,^fK "*4<_%YN@}@ .V@̍v`dz4aD7lfG 3'NFv?&z,{N$DNb+Y`_o JqJ0 J+g#iۃ |hd:kO\nxіp(}\$dxu&Pŏjji #~ͨCxFޏ%?"~Q{w+|̡EDGVׄ)á,r7R6fWM~ۖS7Wί(f68grNcX#ɹ](dw"#H(1gs+ivOg>,G)hUY@uSNI/TVĵ=u0/)C|1]%HcR>Pj{ = NyСlϸF΂k†٭y^;>Z]V C=UM(6jAaq~D/p"=z?)YpCd&B0=Jd3^J%J.e+Vtvkq0] 2J{MhI5b5Bzi專J|CvñmƹNx#K?2%-a73SBCg ҘF]5:f |2Twեvh6 9z0aL+WR2+i吗b!Z ʈf Tk'EZf@o~!f$cC49K5FA.%3X&a.<+2#316=~e1[>}{lFZ0w9\=3}+Di MbugNZS_3В[( zp(P>jdQp%CSKcRlYgW.&,SCje7 AS&:(A{w;"RȔu?c5J1H49m׌|<dzϨV}#:S`]#n $ c?@zsm۪_BW~ S`|A}i6Ša["TQ,6F"Y.7!}TctH5 '*q%7-Paq74:oc{rlgFN0  @ɧ?^ ZScsEe߾3`f#|ܽLtN#VLӕ#?[ȘEXA\\|شT^j>JSAKŨLFL ·|VfƹPL,rj\SveJҐT9䯎K_ xx~; .XZg4ֽ=u^?hBSB@;eo!Иnc]XMgEX<4, a$0-z| Ew-E0x(JT`S "I;/ ۧ]I3(`^!PQ9)1VJw"nWp%Wr<"wۏUkgʆ{T`ʺEjsy!=&0zʳ^5a * [φp,AG^fV뉔a"|U31t$ȽynK2$54|5*C=rcܾ:ʬO,A?>츁Ip&\0 Mj[`Fx(>󙁝-lh-[P1tV̔qs[rBzgԨ/$E>%rNpdVe@֊3*rC+$DxCˡOGwvd;Ur֖?ݣƆB5r({+{k0Ȭ7nrGjᯓWW3nTah(;"u56H7 1zϙbmbfŢ`Dx. QNP 0vƲ4!mEՖx\^wt*#7KP} ؈D0K{Ob! \ReOYP#r7R)G-?sYҬ.*|Bz~,9 δ7񋋿NA pd 5ct73n yON)}qnikL=>^qc+J3Qz.Ѹs"Ϋ]QNTYH@d0.J'Y&N4YLA/arJS[e';~թCW|O|v:5CdӇn3GnH FkH3QUs|IQxy򥱰2 t:>>BC{\N*qj΃󧷚:]cSq_Sbm7ud3zͫSy; X 'cSH ?ŦB msE@v鄋2% W)<ꓲ $PPt.9݁5ƏwHULL0}ЦG5mWVhR蕏$ ,;#(3<{/za+$^^nS%xŹL^;`SVRھu ͐*$*|3SKH+1NHP+#c:[t^?h=X}0Ph&6 HX~*lg\䖔QHdNr,Nƀn=1 q†j0yZ*{ ȯѡN=E R0g)I{PO~W $&Y`T1ҥ:=OK}bR (3Ci>J:K[AE0)Fxgv (#ڝhXy[HBHGg빈~Рv6pP܁\ec@4URxQGC_]f#FB */eQB'; qUP9ԧO%!c!5礶5Y%;XU:iS g\R04-NOfDPq?y.zb^PƘJ+_z{(Ƙ ׸ܧnLصlYQ}O/>sid5kywڧXo.^ }hG=t<Yςk dٳX.ᙱґ@ fRz}'Xvw.&RXU L*/0;GjvrW!*t8 cՊ16rhf\aRA{FKo>#T/l-ҺLU"|N!e\ QT{(-gF1vFg1jn 86F*uWUɦ˙[מeFNif|}0: 7)0hY_gdExQz(_iZ40ˀUb|2ni*K#32ՐIF>~QD@ XQ*\ f$vCw^F[M/#6P.+Dr[n̔*x*tYçRKc6|Qŝ =ɔ*> ó+XtC`^Uh]ZGWq_N<_9\F(t$8#mթ XcyJj5-q)t> MDV#'f 9<\#iX[%ʌ~ARY.DW<ᕎÜfO\$9ډ(JFu@.1Jw'6?uP$q=L+vRAtۥR0徚etNߍEK=. 3 V%ʚnMPf:m; \|RYF (Aѩ\ CenJF5grӷ`k"){zȶ2q_"1N$ LU483E5 !e,!n|GtqhٶHףosmNyi=|˚$߅.9\Uo摚hEUdQv KCz xq{9CXw m>݆'S1=.Ђw ߧB2C?cL֭>Aw'HPD HwO}@b>di~5OrRLeԁ<E4@nm7a/~)P'u }XŊTm2x(C;bg~2`GV_}avON.z>T2N_A ˁذ^efnÓG95"ݻL7Bh'ƮWK5S:E 4$PJOn߽]2罇s iWRƈF" 2nvXI97 NhZ֣QrJ~hR/̊T[.d i/̑qўWC{VB.${6C6fK\͗\2 *.4Kj66)Y/B`BG3%ox"JYMd@F+ =P{e="ͻ{`rD= ?p"oq,tJuhvHcGpYMDP"%VajF{2g w4ՀMu8~O9' 4+XO3[?}Ja J.?A YS8 zF|ٟasTִڨ$ώiݴHJ|B*D#ߗ({>w;Ģ$w$܇$Nt{s'?& ,ih!:>s }{u[r|[.Oūںf7{^"?BSV-:&epi ϛMKݲVqR}]HPMF~8{67d1IE0B(Kru:'} ~]k}&NLZ jΟH*,܈ƏtBcs+U`=%Z=/xm\էlDi-ǠđG)Stj Ё$u x%9f 38\_8i5Ɇ`@p6sD~aj{ad5{^,9%z m۶LTcaŐJg'#[ 덉Q#xGMVe"u0I&Hx6[wsN29;%`R繻$,XEm^ 1 eN=-.d~9D0`W}*R?ߧ.2.k -d+_H[66]0 1 Y]aW~`:Jq*$({&bc@1ˈnl Kq꾡R & #lrSDmVF!wWPBp'NR&"#WN,ݦ+81jd+{ Rk&%S`~|oW(\q9' 1<&sH}IѸ?6Es Nxrd>7z`U>S+O&wD‹"f/Azuo5;h>?N(KؑeTsۤiLì&l،G)HojMeMQL /yQdI*);&-}˴j'H>9K<>9#%ؠ|@,񍦊<* +g)FiD,`Df9ERX(/uzwܮyr#6IeN.rJD&U4pGy@aa UM'k^6㹢ف޺f9;=sKH,) ?[y:xQaOe5>8`gDZmo%B=xTHE=|ݔ_6Z(D<qn`㶋SPw,]3VI5F?aG(lϭe!Ju eѳ}^^E 4E7{(5o%([m8_U6WyeDM$n&庶-\@')@qΪ!c*;#k/DQѷYq%Ji8ƒR|oDy$kA@zyd/?)tF%rNT2#Y5ٴU iڄLmRܕDc𵼂";g.m#6e' 8{?GqkW2a˅+Ax֚+3 eDO\݆vWO)ڸF+wjbr8I}ڌ%eb>Q\/\ـ׻j!vA%;E3@qJ`:){(A;>T AwGдQ7[:lZ/2L#gOb}o~F[dFIc8҆̂,#v Rfp/#z<p8iw3bV~c#E+E#bJ,:r rḒbCiK5%e1DktVWo;,ׁG8:·ꇚ/Ctg_̑ҩpK*֘%OMvi2ha[2qQ6d#ԚB=κ=*ѫsV>M4kձ)~s2V%ž H(YCNy3(Qb [H۷ZeixG `dhpY?"2D4M3F1-igB{% }|c'mkJ L_Ɛ==YIe׹3==E. GUi\w='.(4?3a߳jj>$#TFM[jmDyagz$=Ԉ#L3 ۏk ]c'εJj[!'T*!y%{Pt<7pZ@rRfUYW Xt`$5q=[]ZwYڴ[cf'I*41] oH fޅoj{ȁH0a_EFNna.EDɭK;PbN\&_L1W- tɑaC.KJ H)eLCʁ%]đu {u=|n+N9y|2DF5 z_#vhK?oyxgvhdjBNS>QTc{>6ڝIzUK*9KPG%!:]tO+)X}Au'?x.T,wl+#B˦M apTeW>|Q_9">R_N?*p6r:\w* vH`1cVVm [ T> +-]UݞP˽T: &ؒ,X;AIN y"=OeCD ,ZIΎg1Ocn"RrXA2D8|cE\W,zP]RkM svk>YkO˖kVp_v (2-oT)8x{5C,<6hS'YfAhv$hj58.nйY("U>J/ yqq:TQ>46<X:šf-pdoڥPB\AqC=4jkk+\Y9ӊ̊#pPy78OK ϵF.=g0;_Y`IW+`"]JyJ6U8CǰF}_W"eK㦲ۦe@̤ɡUNaUgOmbpTͿKֺL8l< 1Jǡͬˋ5=;[ks {f[*))Gt~QnA &@ޒ@dmHSӖa)CƆдS֦Kc$a4tQ77HM^rHge \1FQ@CkMLa(PP X klq5J:/B$:( HHbU?6ޫF;Ԥ=Tv{!K/;M`ƻF/܈DRc`nf6oRVnӨśEUG]~xlߌE (u#Eh J 4l.;sWsDY=윧k:P!1H#fsS|,q80DHwdD/ ho3ؔ:}|Y\0`0FG /.a\yjpiM";p5gV#kď3A1kf E_w>|a!+F췼L#)^cFjw<{ř U6ԵVD >,ުsލ3vsUR4C01 `i:b̰;C>i Jih=xryi P:$>~pX"KG&,εh`4P1Ыl'\2'˲1/hx; PR{轒ӈxҒ#82_8 B9򺀵1!mb-Z"gK9$ CicE@k,4WDg7FB| r%ܦs^ Gsӳ*uĕ+̹N_IG@՗a[\S)^18O*,ORώץa"E lnEЖ`3w I9OMo%%N<~I./>q.e{ۗJndsF>^9NV 9mwQz "6AxytvhGpqO[iDrd.y 5OD3'0)`ʠqJ6#H} 3u%Ogk̮wg+r-%l$ |MBqy5! $z$jƒ|]^uJpbM&}l;&+ԛx<>\âH؍TM Yqcב}kW6 6^T3l+N~/!sS7LyvX=,"V5oQЧYP}-/5$Is'[,O%Xw xT&K?9ְ1{x`S%k0pş:a4T]ͥLqO)ao [ܲ/|Tg"ȣ+oQDI"a(y2AT[~Ӽz]OǬ`I|'ũ\54q<?+ݻkDS6.cҋqSCpNX @pk=M4L(ynV|Ӆ+3xՕ\,mGmk3Y &H c MpbE$V@.c kIR*  ∶jAI^b[+xX@ Ցg̵Db&i:Swi_/}7>ĮUG)BBx\=ij.(ɛzGHutH<)IyZ>T꽣'pEтg ?8_,ypp!@CFkgj6 E7}DyɼEzMj)E-=4ŐN"B"B֟5*%KTDd5MlS~Qs;M#vGA$s*'e|8:>faZ9BtCŻI:PIV8mfǝ">}>6tݪcO|&ݸ_oh5Y9[5cyӾt2s7Mtr!o ܂wz לCE*'8O=,~u#J1"GX+ȑ, .R ??E; f XW 891[֜SwzShBkU/4`@* ue$_x(Ĩp:P\D_O#hLm_Y~%i2,P=mzgC!>9T:^4|aM$Lᜑwq(\$ZP1@8s~[yC:mY1 ; ;JbU~ :ļ:Kq3T 'Ke%"Z* ߁Jf_%(L*#I? .ynʺ&LWKϩTcwpH#nHqHT 0 zO=O[Z [jqkRZ}Pfeh2 +>ZaaEibTEJ_ JXD5iMzϑbک޸XF+y;/TI="ͿOCʾh\tͥE*iǙ{*@ 濸I\;*6A8J56khqls/2~[j %}ښ+Qn`^!`h-@"u6ϲVcxEIbj:T9mM!{G񤝈@O HH]U{CYFTú7J_Īf\f-M_[se8K p-FE>QkMd`$wG&v]2{\:c(qh9+S*1@z'r0Zp6%#@xL?>ӇlÁNy@#PB T7PI^R~ݤYKx\_L='9imYׂݫ(!Y1S`J{JC?Z endstream endobj 97 0 obj << /Type /FontDescriptor /FontName /BXYEWM+CMR12 /Flags 4 /FontBBox [-34 -251 988 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/A/B/C/F/G/H/I/J/L/M/N/O/P/R/S/T/U/W/X/Y/a/b/c/colon/comma/d/e/exclam/f/ff/ffi/fi/five/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/percent/period/q/quotedblleft/quotedblright/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/v/w/x/y/zero) /FontFile 96 0 R >> endobj 98 0 obj << /Length1 1620 /Length2 8902 /Length3 0 /Length 9947 /Filter /FlateDecode >> stream xڍTT6t!0tww7C! !)ҡR/kֺs<7;:=6^ A p{I[=ƩEw'7 ' C@ @bPa( `Wtz) _&3S@r#T,lA-vO &a[77'A ӓѕb# 4`a#fm[v- hpPP+ 8@KAG+89N_ ߋ-@ XC5Yev7/7VW+q1-Gs@\]!(y J ڟ4 zl7<>k +w'V3ф`/-Wzmo'o'/#?'b ~Cq\~>vsr 7%E'l~<|Q{_Le:x|::2`ORaqrxx|<f_[- 㟄 Pk@ ǟ`sb {29x9@g^'_Yo ɺ;8v3?8*ـoIV[A׫f8Pqx!n ?$)j|~B b-N'8t2gٍ gb?oJ19AwWJm.nR:RC s)ɽW >eobpG sLLw?M(H\lD3x;F?_!mGf #AKc^t^͹*NfA,8:Z㟺3 V${i-tG|o43_WK[.E׉sy6R8!l`yYmIݒ2yMڝ)oCTXjjK?{gy|,s;OUf5^ms -u WNX#¹'ܺ{YS(onaW#ujMTd?4ޮuƆ|gծD5_cѶF&{'0sm=k(yVle`<e#G:gfp(^e 26?돾Rw"hS={hKF+!3ۯ&QܺEz ՠ7 VGn3AW3HX~ eu2?Gr*9$$hˑk%6a,B[|fnɸuz4Jy,."՞s+㈘BW95TI6o4VmGr@D9l Ltgݦ+Oe_)x,Z| NO{/aP=yOvo*fՓz2U_E@edC ](u+TBr3}4;u@N(5͝\B5TNX@y!i6|t J3j%n T "ilmӸHbQx:_Y˗([ycx\oo_uCz6M̈́оGG<7ϚXE{R>p<8(Ʃ6IM4ǫy-99#lᶴ2R=޵#7CQXXpmyKlXռf"W2#;>hh1+%8a&ϧ L.V&T es(JkgŨ[8z=rc̷a}7}kI))k~:,=A7Ga{h 5aNmx][Jf]*gK:kobXYNzս;s](nOGIuhJ 1=.Ftcj!Ґ=]l*m2"Nʹm N 7kmㆁ{ѱXZF2dҦ\e $E^޷6/l"'fn 7HQIqۤז -fڎÆ E6n$QtMeWDB~B-Ͳc8ٕ~QF#/8 _;ZjO{e#;"$|f̈PĒKٵ}n1Nc?AD. r,GI{JBFcj;LB| 1"E--"YR/k9t瞕E_6Z-1}Q Efxn{;ٗgƸUun D.'=a`aVO_2*qgZ;l6H&JvЛf3^qAn8_+#WV1K)gfO'n8;Ω$.UK V=? (¾O72ILLD=RtX0h砸Z(|ո ׬rM-ZZ 5xL;vP]`k]avSmoi&LHC Ob\nvH?4JO+H~XܝeYV)k}/I(u*& #!Nw2up5ңnWİ!UU;=DdckC&4@lxRZhLyMzOpi_ک'v&L*5s0+!,gٙ|%/̸TD|?.0/UekN vNHw[kr;i|C_=¨Ek#xd5SC#%д {7s{zvqejwo\bFH1N.)bh~1&>UT&Șq-u 曆{>>x7".2u@X,}ÿ"֘>3cvB]7/,i|!ŒP+ qpH؍Kv8ʃ מ<ϔx|҉P>\!Nfǝ~[4 y!(p~2O/)߇ jN<&^_-"x,)G5G~~~jC녁XFRJ-!{p4 BPSX.f[9#q)!2 7|i5֓gY16DIԙK#TҥkAnDg\" "tm݅\1O -9Vp4pfyqc.C.;DBN_9/ ;o1a#}_91m`B*恕!4YCH_- HjSi="(ON84%LNMΪΊX|X}{K0]1}H/mEf-ogT}ǡbs >Mʭ{TŌﰨr{@hvQ|A7&u|3D%BpdB<׃E>!=1rxH#}(pC3/0 nDktA|`( aRa9sfM:ҟw?M9ηf땷PGBܭark԰8ֱ_O7jdLV5,b́[=ZXgeSRb -AL21 V*I{|#֖zeV҇OX#WR4ZX8Tt#nѣG)p2~Q`nuh(!Y-Hr*ՑV>꠆ 5pU0r1J4 }SxrJ{6|Snľps-Zq8ve s >Qz+2nc9&θ}J/ZbP?⭆=^frg& EsVtw4ٜWKKgL\E4&t-8/ɵ]Btt+_pmEz|iIEtqWbBqϳ, ͏ hD Ds^mk]V2MdzrtW3Qm\M+i%j`\d|6#o ko~Avr\$YYk|Y:Rr9vBMY6@<$90|Úl)d1xNJ[ u!imb~OFJybdyeKȫ6S د(^}D> :[&2MxN^'rpHܞ[{|2㗗 m OPp,z^Yx`՛W"ZUX)vp~")H$A!Z:d`yK(zKcB5#s-z̽u|V{sL|B<-^.^*'s;FYQsz /M̝n$O&e}ڸQ?y$#;?/&Zf >}L͙?X;ƹ!kt0{-CŌDtȷY9sP~'Ցz~ǡsA°mp/J=\e%:̮E,'ҵ8 8KWob J_o0}1^'Mr-MTLU Ө-CSC9ݧ\̺+LQ./?R G??H~F4[ J>Ss4 T#Xo˻LuoڹSge5b5eg+0NY[p^_u<þb4+U-8 p44S%>\L|a0JeH-^>Q G!rvdz ßUd4fp^#Ћbtr=~nfأ|n^ݾ`!'M'4㽰f35ug>l.G/_'H_E\Fx`vZ/|Y ȝs<*NYn_ ƚa2~ Xp ÿ+ cι1v3c+o yJ߃\cyP'χVELkԹǝɒ.'૊\]SvSY 3LWNI젩ᰎt©^0ÞEO74E:5ÑTq` k-**\{^sqbĕ/VП$my czE~ lȷOvqPHQј(BvZoY 2䃖rw|cEU\#Z>b!VM˞ϹʭM,խfڗVY(4g 4ͅNUxuM#ie%{F1vJھ$Rii\򋼋YW81֡L3ERZ]8MNmƨB &BؿxhZ[i-)(-kDQ ;^naρ|/|*I>}RUTS{ݲQꚾ[`(\a LU׋ uXT/Rn7o2y )QU[i_A~wowm^wMѕ3=_+67<)$[ u\D !ވnjl8:]P$HGK\PHVюV20'<hI)U,AWl^]M_ ?|T?)99skqL^GqvBXȶ2>7H~gbF;ޒV9H)nW{U$_}+@/r $ex c i!D#औQLͧ8"!lX1@^/l'qNW0|aaH0x3Zr{Nk' Y}X:=53˵pY ޓQ>yp +{i86yȔa)}~s6KکBJtyjp On;7lYepė,v޸,2q Fd? [s\Nu>m/A'Ax WIOƇW<+]oI , ?S=[]Օ5{%U%ʹ"HEt(dNL f530τkOOio TK9Az&f!O tLk^BUU¾& 2.aʲn-̑K'VFN; ڬ:RKE)[F`]-jֿa8c={iY b@9G!*۱#/ _p^Cң|gߦbGlVS}ch W[RdHJhQ drvC/ L#փ\Zn6a7-ԥheT e#TL=! J('̖_P3TkybL*Jg c/a>M?;#w~:˞GAv{=YaAj|omf/^Ɏo˙NO+\\:TkT_Զ5]Mte!c⬑ vtyZ+ "ӂ1[8,=uf:jն {K~@?~uJwLm#V0h< LV/1M.5S=') #pIFF`rV|::O^3>UnQ.(l'.)MozDwP ^m<0#~Ļ&OLI^.06谝ڶmvKW3r{(YGF8AjK<+i}+G_- g;2ͨg*rإ ?4XѦVtі;"8o%fܲkf39Zij|l'rqqM y[Ȁ14LtUSSo>%<W^Z+6y'0=kWSؗQpdP=*8}- y- 4}T;#̥y _+6k!藭 L7"&F7~^mWZ}ӬQc&Cvi&y0V4 1e9彗\v:&{;H:bDl9HG Dt~]f Š)?'JtN]. q`'>7)s|C4Bz^f~m P$|%a2F?3FJA`*s>]Xi ڵ.~O*bm.Cр/ˣnTu-1u:Z^c9Yylb띶Px6Qڭ&pW{DAHU>PExubo9m=)K`b,7f~釵i΋cQE :qqC3S؝(Ee@2o.QNdt6W0{" msl<2&NŜT53(y`$z5oOjC\DRyo-V $azژ?Q}Cܪ!{FB̠»P?_UAD?:sNKM~qiOT(!~?.=q*<{m-Qemմ@BʶM85XiەQxx%+G{aW[7-b*X mFꄶ_6&Wt4ݵZOOE,_ MX+sgw,NC9eT\CKapTs#U9Fj,Kkz|Hp]{R8F>`YZoyWU)s_+\Ż||(:'y&7ۇ ؘJ 0DS@zqo/Su54Bhn#1My5O( ^x-cDzb endstream endobj 99 0 obj << /Type /FontDescriptor /FontName /ULDUEX+CMR17 /Flags 4 /FontBBox [-33 -250 945 749] /Ascent 694 /CapHeight 683 /Descent -195 /ItalicAngle 0 /StemV 53 /XHeight 430 /CharSet (/G/P/S/a/c/d/e/f/g/h/i/l/n/o/r/t/w) /FontFile 98 0 R >> endobj 100 0 obj << /Length1 1395 /Length2 6090 /Length3 0 /Length 7032 /Filter /FlateDecode >> stream xڍVT컧$F42 tl1r4J  Ҋ( RJJ()W{νgl}~{TT D1PDK~~3FQrͮCx:w3@>@"-`_hPpu(7_ AbU:`@p A( G+ @S4 ++)Abhu_\! L 4sEx6E;c8@(o| kMu s^G`,a_<῍_j|8O'p8o/qo 0,@ɎWÝ wxA_Oxn9Q.HJK\7Mh NT\(*.B @!YZ#(dA9@_0|"wC4p?Ka/C7?meV(b,~# @%6;!|iB񛡂rޚ s@( ~`?&8~]RC;9q)i KR@Np߼Ph,> tFc)) _2-/o"Kp?@nu{ua (E(n sLC&";bsAiIC`_y ,1Ÿ$>dd 09vJu7JЙWpwV]|R/(+g"DR+P-W9C+ӧ2j]^ ʮ={sڗ[q[k-jۘZuH3yC(q_ *=&ŨH]xJ"kWQsDdg6®AbF8ݵlZ' "k")+Jaޟ𤠔-bRsRs3rS$wĥ9l&X?K=0eLPJ! }I]vA$o%|؎ >l2EkO>bw8̈r)dR'=m{|C[VMF |[H>IP{tϩ|ԝ&%2T٬M|$rJ;F s!-dXFu9NׂGCg]\h[-j2v}ÿ{CyL6kiW骹rtIh Y&0{6# ҷvifB5^L0wXYu\'cӠzH%%MuRFP'~fz'>t|Dn797]b4I:֙#@_㌠ԛ4B(zYs:I!l~W ]˹iYBuSqEiuԽ~v_S&&}SF$ED #ߌ6+Lb62ի^O*8ɫEJ56|2 $o*3#Ƅ8aC㳚nš yu=:'gj<ޞ<NXAtڭrHr8ž^_x9ӵ-yQ$7IT. >6 dWʞ?O}V mA=xAʧ<E7hWtuƸ5Ӭ4tHex|"\dn:EZ9~NܦΩSX>`">6E9#aIr<ŏ;4Zm {d_= Fx@NCx޵)msFi4ANvbkmۘؗi_*h%ku+alJi :Y?uf cT`39y}YW_?|W: U͸$,T ʮ?,pjUDOXt=0]P"a8":#Ȱ殪MyHF^0\?ד)~Hkr5$U>YH'i:2 ::7J_Q*y 윪G"M 1, $[܊cV5wfeF X#z=Ghls}Ix ĕC3^ԙ?KŽgj6oSچ'8wV9R1&sjk#dY) ? 8[t1s 7dc*DM]%?]rkJ:U+V& =mwЉNwEyZ)&/8m.®d4.q(zn^WY)5Jt'\ZxV{y#[E\MHiM;I }žO$䧗F~?a&}d^2^0'<휘hlN~-Ez xOHb,9}'[/Cvs^\ /jBl0V6c v,mFN:`r9 ^gC-86XNI3=k*bWEa2+=25k{L~\hbQ7zW(6>z~L )@y.qO"? cż[}6hހ`y.&2%ћ7jNJ[iӥ&iNu폥dܪQ֜!Fɯi4-Y KTi>0NcqDUϊۘȃ͸W&J_?k{]Vty2zfv !>mF9z}7w%ikU_DhEHI~a7<ӞJ@] *g$c'Ad籨k|YՔ+L6mî- {&ϗ>3-$j AfQafQ ݋Z xtHpgg~AIRvM;;-Syq߶ G눱SVmw3 uj#}Z5gm>5kWpdյUUj{@ pL׊Oc62hT ۵۷Biwt]iiOF+ uXhl$lai7%1؅Gy) ) WI|\@2EIp>d^j\Ml+8\^, 5_Ϳ5tPO! ιh37<#D}is§@O ϖEBfi FM2qpw'{ep\#pZ`G@T"0+'c3 Mɔ(g藥XvTr9 ا$Y-% f~Ga?@CT a(p).qGq%4#[ 3kE6aWكTӄ|WPr=EJp ~ZV XKAֆM=?ׯQhUJi49~RrH Ƙq٧ d8QR%=3=rU@Yֳy#IT:|Յ]تS0nv3!5nMN:[- eǠ{JsTi+.cRH"۬lFE}gZS}ĻSm)7QzsBL 0Y۬ngwX`mnjӍt`XnYWyRW+nXpIj9K 1fr.sT#ȪSJ$ (ie ǖDG69K*YYm_lF-ENCZPuj&ltW[@&uVXZ/c#"*¸|#8r {ւmߒE7;,oTw;㨊rQW^YPT?@4'AfTW>bΎxcUv\pmehTH<>ْdk#fVC =gqI[?֦ѝvcw%rm.RAF"Y;Yo $:A󰯒Sz/C)$Uٕ j7n{7zg+ؑO1EO2I2s?/Pzʷv-i)0M C)L7nZ]e2e =՗W_}C,n%(& 6Լ7-;LHCTA>gdg&%ed?xnB`w%tZ3u?%0LS=ɷ٘~7FsGQ v{ wmUh:n00& Ln_љyAPuٗBtjp:V$,e3V,mWH]6>{goϹ$5BVFw"-HT]W;-!w?x.}Yl&{}=Z K.9҉\B {>gkrQv6̛wrp鮉d`-}\\d4JJśv3ѱ?&pxK3ܚ$x o>[j^ F)pw ;~Y !;\w_%. HHF3zT)LE&Qvq-.a@Gͭdm$%:2O;__*m'?oCamޢ#gy߄1LŹ e.SP \<\s-34Zu:>cra6S +/l5zX8@ _å|6Y$"AL*yoRZv} n-Q`~mԓҗT*!4_iA.^ʜ ڰ[o j}I\TĮʾ UdBǑv/{"G 'ϧ}ynxFeb| ^k)Whu([/&\ޛ"hvp6&UpEܹ!~|l֔m3BwX0RTѷ'vY1x䷋F@LRb޺P,ұh CDF&||Cg;_ #a endstream endobj 101 0 obj << /Type /FontDescriptor /FontName /FYGEPU+CMR7 /Flags 4 /FontBBox [-27 -250 1122 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 79 /XHeight 431 /CharSet (/one/two) /FontFile 100 0 R >> endobj 102 0 obj << /Length1 1395 /Length2 6093 /Length3 0 /Length 7039 /Filter /FlateDecode >> stream xڍtTm.]%Ȁ9H#) 00--J#tJK(~uΚw׾Xt 6`e8 (h BPPZ"6c0 $]:E ݡ#PT(&)((< v-~:F)]GG-(!!; F@lA0vAWAp[Q(WIOOO~ px `$ 'b:B (O @+[0 pفtm&@ YO^_WIWD`-(ɏB@0_ (y P w :-B#!_~A_NDS [=VgUqs)VGFD$e(++ݿ+`؃DHB}آ6`?j2zLM< @[vp?+k?&yy(OHD &j0{8@O_k] G Em78+ݏ;XA._v4QЂ߮O.V5r0?A*Cv{P GB~=3>лf~JI6ѫJ0[ݯ7zhI D/708 @D),@?Vet'Bz~MDp[Pֳj9OQ)ͧ\|6 R4+>+q.0_~kÏhNkJҟl!8N7\m/!#ߵq3vf:[8nՙgWmopVƝI8XiW63tx(>&n/)ʗcIC6 nslj!v~ZIr `SĮ4&$ |R_R)dI@jHz&j3ڐR[iuӃr+Q^ujяza~(It)i/9K:*J(9镤+;xz$LiR8΀ہFmCRn|qnV.CǤ1K 2/tx;\<+1R]0sߕD55bM;EJp@*δ;3Ŧn(rD>IE7,(sA%V=0!J%a8.aS>h;Y&`=uʚK#H|!PSynf/1T4Shn^B!KIi!! 5J-#Q(ͼNqE3Ɠ#GZHLwW$wC>4l(B~ב:S6!U/~5&, YOlj hy̥U1 N\Id:v@ SQ/]tCG2uk@uѝ,$ ?c}Q0@u=44mg z{ I.DmX6WD(LkEhni(9}d{az 1,Ũe(ǻ3e,3&—$O^u'5oU;ЫM-([t` ?Rl}1Đ7N.ĩ2t7?ER=zYbf6]pD`@g31,ܹRo>3kMonFJy_^t.~X] |N"K#вMd Cb.ך"&z B##]],P A1±V^aV36~jzwQu0<~՚ζoULby[p#i:m:w \!ܾ-onVIz6(JhqSnuߧpk#Eq",_U@i CF)(؁XkaD5lPB- ^K=&j2}EHLjq2٩Y 13̾< fGSiU[x"5O-ݎ7u>1^E.)a&'ѩ' J:^DN.E\&mدg#bCbv^~v& -ޔ*,lc@+nNG)d_LQ0:}_U-!8]0ˎqksm1m 6. Ǒ$2Z{ګvZG7Ym&Ќw#0Gf}P${Ǖ])fDDzGbez"uO>sl"ɑÌ?xG^IĺO4Z >A[0OT_q"2Wng]ŸխTw ΧRټos`bA=swǴ-Wer{*RP)N{^Ou/|fYڏzΜ~4N NA)lV#xbg&G=We\[i3SSM/:Xа*s|^4OA#~kR2Vq`L׬=GY¨Eg dw%nMz.+1T SFv7rTr]LRSux·{pD+6:5YE#05.h߸=0п# lD)cZ͓_g)'IXg6}ܕM))=fL#C~}wiZ'I*屨{lּ.嵐]-u$#] pdi+t}%-ޮJ=ƭ? _(UwR&x@fTf֏;;Om-(a C䛨LQO'_y}#kjɔB̞UlU$uw:yx4tJlRB7Z+&2Y'cdy䴧}+ݔfmycj'DUzkɟX ܝ=XE-*b7x2G>[<9ЬOgș}u^=?XecYʀߨS0z@\)"Jҙ/~nwY1z:|wZpaťM*)j/b-HΫIƹ A’C _?cG>o\}ѭ$JrxdU=_!;YH}U, - o'PWoܳ L|] :Ut&UZl¥RFQ'iSW%bgGO i,CG_ޱwȓRi[J)`\R!zB+l[4Ct?4wSK5uƾ>VkS#9c^z`J"BNu0Y,e,5v;4fc>ج]™kXp8Hx>:4"9 P6!K@Hf./+w52:' 8G'0c@|#bySb?C(sv,l_}cu (g&1y6Qyt+z4TtHHVaGR#ikTʻe;m2 h v2\pIc!@ڻ˛xԑm Pܽwyn@.=| joKLy[0c-lrF2[f1*1^5$WlyNvGZm A>Nh$!JRt6ܴѵ)cԄC]7ĔgWGScmVKZeWІI3/}FUTּXkꋪO%y~@5drjoSXz_yecvФ%^Fw ΂4:[Ay~Q5ewWHG)]3YgwIR!&y:gB;!]| +V\8t\GuX mz}mNv-N?(mۇS3o ;z?lt `VɊen" eԭ$ca~f6Us< /Gl#ڿhD;M2slFp^b*U yµR69 }$ܓlF_7(u"R%k9y:t5׼I bKc`UGܾ̃#-EKqiDr&"ViJ|Yςc9(C"U)7ݣ6%{5!9i!E͘0o"ؒ]3{Vp_} v Jv|'n`#uAAUc?mͰw!}> _!1+m%O=XX%cpW/QjpAeRQ}zsJrKCy3PE5,('v\W`68cZ >,.hAQ Pgt}h=,J\"a.hR;LRXk:2#[\eCQiV[ٶ--dÛwQ+Bƒߕ^ȩԼUq)ey`ɖwڑ-^l7f@7-lHW0p+ YMyGQym!FF 2JcX>c3V<,oΦ jc-v/enHy.Qiʎ8UP*!ᅀfOnux\'x>|\vLgEO~ ͙T' CMk?n&_~5*^o5$ʽa]-M'}6qx,ez4rtxglޗt͛=!pk1!Z%xu@.;R Ϳ9sp Lo1;8!Z#xnÛxectk->g)6pzE ~F u`2٬ojrVS8tl-\5\KF PÑ4AM7=G6}S[C]IT"2VմV.^ۡ9 xW_-]` =1AD3M&ī^?-~){?g>cAM]Q?a|&_5jzhg4D\%&J=^Dt[)þN>ET mM$m}'݅{M0}C4C$M'{@͖L BN5S7R*9?ziZr. 8$x7{HH=5=ۊs]và)~YN8?S7 -) ʩb ?I#C>u"Љ*m9[OQE >OwmX3z`Ќ%}]nk;1Eq*- IuF%Jz{rAdEګgJ. Җ`^]e|lw3`(=y'Ǎ!գg'8Ы|[qM` e#&"VUp[&(D$_a1vy$J- endstream endobj 103 0 obj << /Type /FontDescriptor /FontName /PXOHER+CMR8 /Flags 4 /FontBBox [-36 -250 1070 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 76 /XHeight 431 /CharSet (/one/two) /FontFile 102 0 R >> endobj 104 0 obj << /Length1 2334 /Length2 14244 /Length3 0 /Length 15625 /Filter /FlateDecode >> stream xڍeTӸkpנhq <&';kA]zi4٤A@y3S aFӱ;kPn g?82n@ 0D&kPUAeG_K@)_"M kio Pe((t2 7{[;0$?\BBnVU   }"nrgbxكZ@w'W5 'űtQil^n@Dhotvy8[m% ?Vbrd`c˫ g뿈 %wy)MTnfvgwwJ@-l-rr:QO hǿG;[U PI?,qrr B z[qD/1? R 0n <~*pqK3o1 7{o1'd2g gGCCCJQFߢUKK~lܜ6n?_m[aaplS}?ao5d[`i{6Z؂ R_ '{Gp ,**gUNW,-dلyۻ{5VvrqPA6 q* d7MXYpBFYYkS`w!&H_G/KpFBD/ o x:C7pF"!qqCV8Z yX@7 +#?_co +?X @/yCN ;{d+l,-wT"¶u o $1iBabt!;I~HMo=1d 8 9@C5$cj r# (A[fv^H\=Hsvi tC.H ;(R۹QH@HQ;H}n8p4 ~@oJ$̡.Fԋmw_Ń%zћRR޼[ԏ#vUư rq^o;qpq`HNEՄ.'.9Hc? (S҉ˌhGߒ#RT"1  9SWt F%.UiAne'\4:ۙp݅%aph7OW]=Eѹ ׬E~,&Њ hG<ϝr*ũx0 ϡe8 x) Vd<3m?ݜfZ(AD;qCp]yf Ȇ) e}S +*l+ S ƬWsxr:Ƃ\) VSF{U>㪓\,' o)(a-`;%qIM"u ~^PG\|š5UȈA秦*7F‡"8.y e#HmoZH(T1L{ _O;{W0M5&sOXڽ?d91sbLݟe MTl] OYGN1;Re7G( Nq)|\2]aS])KP3NKJ_:[;>H4=!GƺdqAt:}p3^w~{]Wߠ&|NIar$DNg`st|v5y]LjfE;+Tzf.AM3 1Z 3 lQCJU*S\Ǧ0r0^^ dBVBWGfoܕQ b;.#L ,X cZՒWb olKLH#?}If``& \28x?Ncܳw^XaK)ykNYA58]tp/oI_O?T]_㈋~CI{d1-hpZ|/ZNw/g.]dID>j!iYة#V#u+H! &p,Fdjd=%5qn|̊V28A{Zؚ>2^ye:ƇVPX։:V6!A(>+I*2k n$Uvx UyJ>:e?-<;**k4A𩠹n_|8bu,Q?w4sf<þ>o_> '$TFٗ* K" )P/IBCh9Od CA}ɪ >/tJ5}D)dki7+8~P; Ǟ;7J{3+HLc9oq1F=e]a\Qw,Vs̙'f{X2.t5D OZ<լxfX;Βo#g=Ш"|&]6{ي-M|z ]LW,^.a[8bGֆpp-dZgYieUž~1'/y$-iM&CUѫ:aݨ^`qR9"ZJU1w#-4C6?KCxoe4J~rIPpEgRcۥA< ʯ9]>_S+ʊUqwX .Sm#h]&Z9Hme*~{Eަo̹Ȓ.Vx$لe9h"?f5C!BD>6qy@R88" VS"mj⃤2nqqvk5MsIsla&sfiL+swŨO&O i6P͕a5_*=ӛ|6" HgVl̮p[kVO@l;`V뮅ml!Oe[umCBq&F w&;a3̝w鬽Ya)NzĽKuQ{xh텞(%Qq?*vja<0ŝN}Eqzڶsh;Z ;Xj@D:-gAclĕ;U>f4a8o2[NFemޖ,ȼ9yѳ\D?51Y ~N-hXQsa%mIxPya28mwKNﯢ3yR8H RYU'vKs*6߻[γ)PN3鲭Hk6Vc.P?Qvyƍ4glyW&oFE ƒ \F tB#,+jc߸^1!U,ڍO틇8BX,uZ#3TpwZC1ArEw$1x۬a"+gq*h.y.^|V~k{<,td/X;i 6&B,?# ep㤈&KL^%to8! {|Yj[scP?{&Ф Voc4q @RU =+ﶄNψo/b`Vuo^}z?%b'c̓OqB =AC/ШӚIE;Հ6& N\?ezw*&%j^ze txI +m(M,[]~LzE%>}sF}ȃ7-cϵ陯r~dPiPfn[$<^X*Y>;pqAI6\X=ۗKqjt81T,[w9'FtirZ.]& *nV:Bb؍_ A*|yC/~i!Yi|5Xt*5eeJit肤o#uWH~e)^FB[]ҍ ŗkwl3pɔȄp2wh<+GNJ=zEb y&W͝w<0e=n)QD7>۠ͯTۭyljŧHBj\杮;aAIݰ+P{X۹~&B4X{ѸJ͓|Xw~a6;㐆gY2G"j v{ϳqUK0WsJ:X3qKra34Mvar}Z]X. \)PK{>sIfztsa!q޳@C>Pv3Oi$tzB^HPD_;_y؊.a8kVImxt!IZ\g&λu|c?wpTB HŽdϳ?Z{ M $:Eѝ'?4߸Ȧ+LnH3 ~Q\ĹX//f$tiJ:oPHV\,gn8IԈaP:,d^9e)dEuF#~y z;Lڰ`-laQd.#6j(o03*y)Y0cv ˚rs#J7lj:줔ĪGET/茅/=?IHsCi s"X<5`r{2D_6 }Lԏ \4ԴVZzB]t@sϭr/q&ybjk:UkSZj);N^?"q۝?<&ʾlIK^[qOBZAVR39a 6x#Qr( _jI7o=E*_HR Z*aȪrt)~J 'PZM 9jx5z$' 2M.AJ鎄dX!AhS!+H0"A[Rӱ広2c‡[ t| /K8n ӭt#`䱋=$2[M Yb?u[FJ` ;g~ YZ+#Klۙ֝7`5kI?6l'{)і _ nJTւ3ɼP`\2vc y]hBWwE!vOh1ZPHRS{oHvW+,qR%GMWTFu=J#?ȋ*0y5 r aB L50mVs }$+/C.̀Ш}/g9>y2MO4@;`OvK txg(Viɬ(cؔ?fPgKQp67`7G%X 0ƵP,t#6gF,od@e.Te%B ̏"%g ΧUTyF6k;n֏g9J•9$݄'mJwYzLzF`Cf ~ViIvD,yfݎiOT*dX1\5j\L;BB̮X7G˂Pl Q| ?bϮ_k&Ek&Z/מdBqTG,ò2G#'QݟgQC- >)KN";h..Z '_&4#ퟭ}=*MCJd}?vZM2ޞFi1A \YJuMjqf^L,۲2TJo8xg&8; w^"ޖ\o;QkA]auVC)Z6ǵ> #naĝG ZKr9CUDG/_WJ@i=7_az+O#x녡\},AKo^<8ErEr90Ht$M"՗w#>ڿ~Ba?'J&679 #eZүa)}Fډ?] BMT`/:r:o>SI1ډL5W1޲V.JKv/8K&`G6~>p*/eZwl/>@6%C_o ;A+߈x "V,?VDcgM/uSMOZ2 h/(p1G]uGn3?DMA<2pn6n4ei[WTKm@!%23ؓ.=%&![g^SA?.˦-ԝ鼟:ot[F(![vA-e臼?LLbz>ysF4ouo멬bǫȮdIxx :~b+i= \k=(lCF)׺h~B\BLJƱ; ^"OUHyky&JX_Q{X)ؒǏ .rmo<-Э\OYeAuYRM&fv$SĨ$Ch"gPKJ9p1Hv_zc Vŗ>&U?$B풂J~iQP}P (F^jp֖4pw)"tc\*X`{W'=\DepAH@۸sRߎ9Q4u;cLGRibR6t9#ou|fK<6KWwcٵt( 0 hT /-QN.( \xR7)chj8 2 3AABdh}2r2ef6")92(K܏ E8e_ntۧI< I}e#T֔&v|5̈U}kKcJ'yUߊ Rl▸nf25^.#5+5ﮜ!e60ۯuso೴#iw`:lXt9.'nm#p"iє>嗨cz"0ɬh#lr37J[Ҷ] D9iq]}JOj j! -dJ"6&F6q $)a0-I(z.1?DQm/;#2P韗;$\9Xˬ7ΙV9/Wz+~7VΣ>}jo-%Y:A$㈨Φ09j7O*ǖ0؟ 抜 e%Qwr$n78C~T`a6qɁnl9i,y6a0ꎝh!?vjZ<@a ][b=502ޘ\0P^ۘjRk)˰m ռ kYL +QڢM%c%nKK$t>A zˆjr`x.Jhdul[kkJ+BMe.EdM',*CxXA e[e{*_[8+ܒQ:a9>Zk{7qvDjheZ@O`zPlyi ]/႞TIߪ1u=3X ' j/0foXʰ Jxh[Qx}%n" K Ar4cV2, fJ8 Y\ɲ!U\n-E7B~U+2-d9cm`}ux(-F{3d7%;8 nF80qy:%.#)/p8rNf@ -y"Z< 6DU'(9.%\ʳq-[! &$OQ ~| Ov6eS\Xe*%N~b9¸7^QD\5/;=.Ǝa9 pG}ΨJ,I:|$?͎ ="sRpՉ;VHn`0rϬ֥G]QOx~H9h꛴F+1eCLu/TZrb5/*3ӑcJYh^щva8](2cJ xT|DymWjc76Lr QpHRatì3t9)Pue%p{az=J͒Sx=ClOC% >woJ ]ߠ<31{LJOGi#)Wg=ES|iB7$e^Ѽ5%5Ζ4&1#%8K nخ0n:ܥon #w}Tcg>(Vh'tye0(7ǘq$0w2F,56mo\Mad2BL|w1[;R1C_KLmtdVbؓ+t!Xw32yG31^$tݨUf-_>$YoT^YpaF;)Ԁ*~`#'ׄ˅+ŸA$J&8Us+iػLP͋7/(镖5Š|NYY1};?8$` *-_[zzBk}Щ:ݖ8UnlsHWLܑ|a:w]oF\w})z7CPp-g,4 &p=\6,Ӌ"ٷāzkEAX#C-R\I+q&YDXgqBY/ aStɸ!ʞ%k.wQw8M#{f(yy\ծv\_-T}zh q1t,6 x͆FY߆X,6ms7ϔfb0K0Ea;ZgިSՈStGٕ~ .Ʌh9r,YRұrRQ!UWlF _P \T+nޚq Em:!R,>s;I3oցf![q眯<&gl`j3:};KW/ɈY`} 5m#-[l2gX-xdq^\b7<L`B\ȿQay*0+B†Tz"키t(R[%|=#Zb}azm0إKf c"]"-Q[CY/fB*qLL(^S֯N*vPuMI[ b\̮>/B? џ۔OEnyXw;VܣTlL%VX)OS;EgqU1L"YX8&ȝ9XMFܼ1 vŽ.Ġ͊1f^*Hy3K6gCj\*7zޛǀ׻_4MmFgȪdZbW1¿]'!ݮeBf^L#cq c ^uv}3kG2$**8}K[EˣfSZq4SCizЛ^+FS04;o|qrʫ259ÜYjݒ6{f姨zl|WOMZLySī ݭm`ME^OK%}* p; gź9/psٍ- jldUڹSL(24&T`#J&z>]/W%v6H0%^}Xw1 e~Wҧ;!ӏ}ej*@Zv.4d]YyFT;T ,vpC[)p*l%\fB 6Gir-`} 0F'!mϩ`5\T)PV?QWdlQ218D ֓\g*=g=/a'~bϬĻ>ZH4iXćbtu ]ZMN=T[cP Xۊ. tt7y}=ْ.puq8v ZP=3R|؟I*a]uz%| ͘N h-J|_ p9PHHԑ^K`$h 0l]+>;7d+Dcsd3mLat)%7gý' <}zN65(Gj7Y[bM/+- Q"{s\BWʤ~eΔ`>ʴL^_'0K˒bː@}߁ޒ9S)(0/UGFYk,S&y-:zuS؉ zgz]mԅX^yu}kͱf3(!gDAUX˒#]8n(m3U (Y>+j6DlD߃vT:c52o8YCcᚲzfR<> p=-cmHd}b%< hMR<}O׵VQYu ڵf]N|6TYZҽst3΃OeS<}c9a ekB[lWg;53U'^Iщ>L ֡2PM*D2@(swV|ʛƟEFR?zw|Tv-^2tS3! (sU%d )*E zVyԿRcH(?8 H%/~L[UU ɤ\e$;l#gMX\R5P" ӟ cj\b٬"i+ ?zw,Eh3lA e/ӓf9i)a%3yKho"4G="yl&(*7P/kBPk>; O/>uR';AI VeQNy㝽oe{DklɰDݦuT1'U#.+?BCnr &3XN^"a-~R^^(KAcI?IMbn,&I5(TV|"kj:.Lq~-a[5K7ԯX~Ai}=՛I! Zx1e1ƂbwqxySAD73pIC^`9s:RI/I.lqHjȅbs#naCxۈm| ow#I8pJ֜_ufyǑ1p9Ex(  tiإFi+TJ"x[,V.Va=>F09*PMW9;+3T2Y#GnD} endstream endobj 105 0 obj << /Type /FontDescriptor /FontName /PPAHCI+CMSLTT10 /Flags 4 /FontBBox [-20 -233 617 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle -9 /StemV 69 /XHeight 431 /CharSet (/C/D/E/N/P/R/T/U/V/W/a/asciitilde/b/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/e/equal/exclam/f/five/g/greater/h/hyphen/i/k/l/less/m/n/o/one/p/parenleft/parenright/percent/period/plus/q/quotedbl/r/s/t/three/two/u/w/x/y/zero) /FontFile 104 0 R >> endobj 106 0 obj << /Length1 1408 /Length2 6039 /Length3 0 /Length 6998 /Filter /FlateDecode >> stream xڍxTS6Ҥ#H7 & wAjHB$t^7J](]zQA{oed3̼;W8 (:  *Ɩ EH89Mo;  G!c6U0 E!<($. "@@4@tPHSwr`} @RRJn08107lE0FA0?R:c0B`7IW 8`h Ev&D 0qr1`k@!0$≄<c-; X/@B+; H_8 G:Bh6#XףּJ0~hB8 J=f5$TCb$ A+H7# uE.l?i`M$901{@0uv6c9X@# C{OX:"P8p9$Ύ5ZcX>* B"| baS5(˩ Hā$3ϿNo`GF-#  M2x /PX=<5P ~C;_YW=~GA`Ά. ;!h]^- ;#JH'Awwp8#a(4};zWmo ;YFPDL`]AY|~K ,Da!,@#ʃWcE`43/'? @<=<3[ < Ϣ 2./;k?,-w$YGa=w!֘zlyl0W99|UnbfGUy_p+'+4.8fj/ِ ߊ;|"BGtg]R7@)%[&^)k%2fҚ2*DtiY*ى$5x1Td)DP^+ڶxKU]}#M[A?^q/-_*>^1Jmyw(2qMھΥȪHrf? ͡-Ovws,Fji%YӸ?V3կ謃tpAYJd*6=ZZe^)=֤u/#b\CUgiE;A\NWjxGĺֹ-nE}|6M TkHϕr&#5v(dx@_{|AuԲpWxUUa9NB,ͰTjE{OGy% p4;*o+,͆Kx%\ՠHU|"f/c^ұ-kX֪@V2IAA{S#M [*UDzkEYY+#[_EU|WjO?WJ!%p1|}qU_JYS@JGڣ[_\qfK=Z`#9<61mj}ІJ֌n %b˛f/Lv\u~~.ӘP&q#8DI0K\Y}}*QuVbx{Y90`Pbt#l8rx9~aӌ^y(Ξ3'[~>ݲ3еUf kcal RCL!"5әR8- =*|ŧ ;s3o|>'XZphgafVdtqގ7Fp CM)`:7& 5q6äg}ij/Rt Wmc".4aّ* ^z_5IKvȾ4 n%KXYk59X(BHj;2[(ە]qw$BPMߛ^'ioJ~x@k5ցߖjM) .GUE׿^fkQZKk}ՉAtՍi^ZᘄtX" b`%%]8ޮ Q ^ D8{D^(egHCe:h]r?Xzkh62Ã7N* G{s/۲I]ol$܇yؖܟy·X*nc|FQ!ʥtWǥMX`T;‴W+gxO4@:8䖝\"  $B~'w`ZWr."bT*C9'3){5)6˘ZGEX\!vfo3#C7Aڬ{Qں+- CneVRjEmtI.r$lyk(Dϊտ:MwSXQ*^|b|ɻQϒ&8ҿ%:5/?^YUW^H;~:9*` / ,l&և.Ѭ4Hm]vr}+G[ntV{I(?#t*qi=Tނ[:`Xq AGn~>eq'LuY\=O2pVqYgP.F/!UI&9EPqї+ˌyd#ch<AV Wm`2Dby(@vi.IZꫭ 4yuplC_nlf;]naw^FLyrї.6 #Q {~ rz:d,n9XȳKm<u-=GĞ|h%z< &dJ݆>WK.}2ϰE%Ak̈=spu尹]Cql)^Cٮox8rC4ma͓T/Y1eG0>Rķ9Dҍܦ1|KxU䦝'#;ӝOvjx3Nװ􀛏E5!Fi&PH\č7df7}yj=e)[!k0 z츮\_5hOmi 3यo; B*lAE!6[338|̽Y2*Ч˙ׇ<;jA7]. ԩ)!hLيuF;/~5)\TEu3SY,Ӥs]mbLh=7/W]^hq{Xd$eǔeLFXɓ~J21e48JLC??*c?CEiHSeKMPjJwؠd6f [o,r˵ (GΟjh8?kjۊV!7[r$^'HfTV\ahDL@Jd]L'X>Byޓ j8Z>~o;(.1\更9M*I-Vd+N!)I2X֒Q(`3y ь;5Y{"7ieX``]\M$j ^C[NL?G]!鼿$\NvXA*C{'twh2Uٓ}^Α څSMj Á ӕr!0=wlo/? >lQWQ7WU`7Ef?-]<ܗJhR"vbJG)#1qW@mbcw,ks kt>/”.Ƌ96c6o#ȅ&TYuݚDɺB;tTM3GR&6~nPdGzXpJs?.vS~yƳu Ÿ\4 7s@;P;SCO#>I)uF/eZ7XI4Bآ@~tL.ЃIK"06 Yԗq5Z\Tމ;bQ+K ].miwz%uPPw䢔QYw2&1PZ)~5}5,ha[kpÍw PF/G?o{i7ز $P}.R+9Rc &(&ꗧ~S!Zlh^ ߺ*'Kr;}hp_gzXpܫk;kx6%ė[v[";枊Zܺh{?q&k.naJ"g[V'{uibWcZE̥3˛}MǢʫBȒ҆/_fI hub p,iyPbK?SpjXTk>ŚTkQsGwKoqXt64OH7vlXl탷z0B:\_l`-ܻn"F ˦(31nyӃR:GwvÎwB9XboD)-KeZT2/UknV~6~뤊qQr O7Ŝ\dRG#d)I~p^1څpc52/Uc|f=t}n0V TuF1HiǞ?B?I|~u_/W߉~Ы)3ؗUv(Gq$_W,zN$-鹶e3=3p-{[Omgd 7'~4*iyMt;ڰ[i"y=?]"aO.SwZW#[1e͊=0OD31/},!F/+E=I2`)b}܌D7ZKO2?;D`<ޯ5FPp(Wr hY, _X=S"XLQB 4Lzt^dE~u*;Eyۓ0˓|~?ڄ -G.JKss4;[riY ĐZK¹ oblh=&mI&9)OnK*kO<*|0}k<y97{z6HF}i37PPM\8+z]Ώ>9 _;ĺKN"hj}~f~'=7pf ќBRK}w:-*WUҪu}}-f]Aj335],Xh()~{Vd{΋5b#CrcJdQer:o> endobj 108 0 obj << /Length1 1400 /Length2 6059 /Length3 0 /Length 7015 /Filter /FlateDecode >> stream xڍtTk.(1( !!!ݍH C0tw#!%%*(% -(9kz}|M׀Oa UFQ| I88 a('_f"#( K$B(tPwwD%$A $w ) P{lZuFġpFQ6  rP$ ({3#0@@`PJpI٣P.@'?ٍP7(j vAO0 lQ`$68 P:nEj(O柀fO'!  laNP&? u ;!`0 l}s0@YNF  sA~A*F ܈~OBc٬# ` a|C AAQ8 zA쁿z@;~}].[4?#u{@(;;}" (5': sF/ ~M/()A< ' b۪ u9? /Zp%n;h#\9HA?;_U_ );9vsn34QhYh!wc)kAm`UCۡ)' c)ü60^ E~}qY Ъ8*nvAѢw_%8aK}"0 &I&("@ ?B$ѯ `74f#z DjqG"tϿzA!Dȃ0r|xщ&Q"(ΉUF\luc>e);x.M5Թ,`7$L| ^bmBo M%΀324FT\n6V "Ĝ,inh +p.Gl;;ۓՙ.tRhy%=:[n_r7=uRzș«;EsUcLL  g@ C, 3s[}q_G7 [HT0G V.Mj^k>VYH tq)ǺֹYX |ªVDqt`ZOOtWx\)C㵉*^gLۏpPZ7[ԲT:k} \rɝ7UBg^}ARa19RfdxG<d|_ەn֏ê[}YEl@_#AH; p2,pv3h6)ua>^jQm_T;kBL ڪO)hShz)% ͈ מݞOx[Dx@>ͼL.ttZO!p:DrӇ$Wq|3CȮ~4\sSz[#^FbIK(Zu0~Na0Ҝdu*yQ{^+39IzLR^/)JA}> @/=KA:zKs_GEdTwL oR}+']`~̓Ne5 :\yݛ>:&%Fx'+*B\HSTJ ֑fš{q$YES?UFI蔨lcIBdXP8a s~0YMgl+M(Ұ&ˎ-ݪy؋ƍIH/&p߫V >2:B5 6"qΙo3:_"jWќ 0*tkT?h7ϻyg븨sƛ-;lJ6YRڜ 8ԛ 2YȭH7RO[uܴ=l,Kk=a\.fSv~=ʕVO3rF&"ư| 5 ~Hs.;6Jӵ>a K wd顨JSxGWiv'ݵZƢJlI'"Ln\*%HtMK 墈qT#}T=Y+!)kƋф Yr< {+SN0l=:zyMzV A2J/b>ƂOQ}a!|4c=;]0~oF\z?ÉW&B&F.<ʼEZ8v1Qy#pʆu#Lm>i2o6إ[Y<.uSOM6[л4cPw]Q Qj!ʚYq1L!v0ZeDEM@h U^LRqޭ灂`<}#Fm6}ϵq$8 _Kqcn}M_#FК&;p(&I#xU2ƹ7.-6KRS~ޘhLAYh5V /Jۇ0Ws|%ց}ܳEf]νΨ;.y+>l/F1Idڙ6gPsG xD3SY[瘸.ߑ,3U=9ͨ;n=J\)"]JiHJ\m繀U!/Cw^=!)3 mqlPDmFs|1)6\e"nOfGo0 e xs-⨊ |dcy{ t;$} P[4 mb%ul JZQd=4 RI@mktj}[8Y/RNoo (7b$s<:-q L8jE>/EZ4ۦbE"] Tfy ޽ (l=/ߠvzC]BǢxG3" Ӻ7GbjL_*d$<#[L$)äc ,e7L$vL :WZ[Ս9Kv,}R~u|XZk,wv-f% }k`Q?=9u1"Ԃ"?y(aCOܬ2v@6nwD$%#Jjs,HP}ц-]1Z?t 1˂J#tqSބĪbZ?'Q169_}14o[(J.x6)‡L VO-z%YpU"|p)i6G7OL樿M=x\%ǩֈuƷB1]LVZ;6A3aϾ{;|:dWobt%Uid޺qH00s96_X!Gv̀L $UGػZ .0ʾS>cso>nyM)xu2<%?eבRߩH;%5i OAͩ?7XW|[6ތ M<̬kX~Our6H]>}g NCT1%xa G6'}*JUc_s'jLU~aJ5Xin1D5E҈H"g\ 2)-j^myE^~[NInٟgN0V6\7z})nXa.aVIGMĶZcV ^Ӝ)L'Qӂ 96{ @%DVZSkk 7?]AcNLiSOdMrT=ì򍗋iZv5s>F˔R,dM/ou 7VbDB8?֗գm\|Ku!R42NZ=f%i6:3b组{[ ҷD;kIREP驓GPL^/'I7]mb*m \LJe圦Ԗ@ݎ+Ne?S'd{?8#b٦/{ߢʳO͐5-k';G} RXpQӆMe,? f lZ/%>h2Yؐ dSP?7kqJ첕NCQҒNg٣ly,]8t:? oF^31eXpHucx+"D_H5i،LIi?WW:5X1(*xZRӞ|VAUjr?s U9'QI<}X::Dh'V_5 |fD(ܲa57;bA$0M^v^VWz,g{i<:e|irFgV'Xbu!7Lg:HR2\$3A& >[mHjm8R\!s"Oc۝ol2C`!fwsduK֝Q_rV8Uu|>*Ͽ~AMu-5ͧR2Їq"}!7=Fn~ڰN.Y.-+kag]?QQ0"QRxEU@0PxjUɡG^6ʔt33#gpH#<Ƹ1|J Bd{cA>!f{PHU<]g"c˟vM|J{)#+BԼdo KƾQg'Bef G?#īy:jI!&їC~@ƺk'ǞELڮ9*s'n\&tUJ卑W3n^3ƥeyO1/pSFG0#EdW{[ar/rC!s'?NBܥ~gDR&%Ǭ#>z#OVyb<[EFzz1x8m'ΗhE=WњF[9R{ Jpte(tk2RNBߐA|ůl2' ÿS*S]'ERĔK &}Q>TPD7 I;sWS}əS[Yl 8,JLCIxDL4$FV.fӝMnwz&4oc(n߶o>/_ Xp)c ؒ[x&IdfKfxp[ɂ7CeR"J|8,K> endobj 110 0 obj << /Length1 1429 /Length2 6266 /Length3 0 /Length 7235 /Filter /FlateDecode >> stream xڍuT6 MZEJBH'*MJ$.H^A@"E)A@]FuZ73̼;|d7Pt@ԐX$ T1 $Li ǸpރyH =aP ֧`:HP ť P@@A&Cp*#Q~p'g ߏ@{^ XJJw:P ":P34Bau`PBB>>>Pw I8 ah72PCMh G0B:b|0 !/4hP0_`? UOBpd=EN@G -_@͇zCnP;,ѡ@5E ?'A n8 *fU2I~O ޻П">-G8 / `]$90@1$),yaB`_n,tҀa4xz3O :1@;AX7/;O/דVaH߿G, 10V3JJH_`8P@X A"@ 10uuՇ#( M2x /tX=À<}?/U_'Rrs ġp7?0Ab7PS_ s{wbwDչXT$V{翴0=> f@î+݂ƎwݬUE#~8 #au&,& cw[@!AMb9$ Pa0t.oy`-I'2.M'U >+¢]1Ħ˪kʲ"Smc[%?]hA_dJN68-?;Bk{ jZ؊ hw~9;Kﱷ2.yn[ o >趤^xbvskѱzT&^aŮeLMra|{qps$æ;t[CDAԇ>AːP䝸'{)'a3PŁJ1ԡ,x䔚/z$Bu iD3afv"z?Op]c!w_&}KnS5SsRd[?T/ ElC RDߌ'{8JѦ|O^Kiy$؆aRCYbV(N]@vL ,ZVXbFi?5)9w׀*EΰP˼,7*С0gh s/GwP8 u'ݴbe==@+Y6w:l*_7yMZ2eV)OnG8Z}*lRf%6ղ+H00/ w[0ۦV` 34!D7m c4ŽT:}i։dEʊ(5BL(?AޣnU_+ka۞QW8 q'dh~cWOtͱF-y+I*쟣C{P]4_b锘V\cD=M.H0F,0,vN%(PK;܇'dkU+6%:,K_k$*q.3ŠZQa5,; }>g.MSQe*JZm9V~ϘWH>ťTA&.OQ$i\UKx绎u}rTJaKZDPRR|җ:d pUp^D ]?J9e夣+S7Md'r~\ J,Nx'œ A. R7:t'x'*ɫϒɇUKx!hOxzh,)Is`T{3#+h2>cA{YW ݆4$lRyJe^oҜgBWNI-9wr}odn1@WۄL`qKIF\XiTV̭*ދX`LYMm](ʈ Ht`>vJ .l'im{A$ei3ou |z-VeV]Ṁ9duB{'=WdfIAu77dK'@EhȲ3C;ZQt8tg Lԃ W8 .ZojNyuي}:O]'"NUd _Fn]eޞ4{WT>̞ϔ;@dga*0V.KMsC3*uK➵0"%?kG NGZf 8I+'OP2.*i2!%!u2 {=9⧷bb$'qBwh<9E %*gnޏ4>5Lb{}9TgBb0FδG5;&( ^׶2|DukNh`q. =f )w~#MT]4w[mpQ PElkQ\AK)χ#/s)(`.5]!?`Giaf_IUu OZ{rГ02b%\\)ۗڛ*87.ո c}L4pňbawe3+oVq?M#lK/ߣr9aղcg× 3VraD몶iK!EۦVO\.l1JJ!ӟ;Ԏue)f5^i)n^`V?ׄ`2@HZ6G =9Qi͜LT {Z m `'}[x?(H9aR$ $XydN::&}8H_n|*9d7ςܝsⰰ{~j" G*8l\a!ar1]DM?hGZ]}<<($&edmC83c}4$ѣnEε^ oTmkQ/5ü#_-[rG8ZD.6'Oy6F~v;q9}lM̼wV=LJ?oxͧnӸCZ7ϋrcZcBKp'NGc2|_].O셮r hT YTৎf^k6͒oΆ1F67h8Keosy}S,!|dpc&}/(CtqΖCBpax/#܂x?4Z*Dwmxŝя̀.8gb"Eߑfoh^'E]+Ev/.յq:Ŧ=Cs:# ηfh/c,?hb<q&k <Ҍ\g$zu.Wճ/JQ",`.%:^!RЛwzM?pg ^(F?tPuvLn ^AfI;8Fڹ)FQp(dokӬnNAH^M\S8 ،NN`%8e;qvYj5brSyf n%~Pk'8"׼88x:AjQ\ LS(83~\nO_S 疛L^xtOGN+;/%JvLZ5)K wL[)ue|ےSh{|sScrJE}A6EyVpsZ%b'eJ hS=3opg9یj>\m.<W|8-QlR|Oh8Kab`}nF$*ZL88d~cێ,^3P}*<-c߃mA$z`2 3xRZ\"[`t}љfk?_[6> 췡uF:ѓK*[qGE>NIC$ص$bz˸Ǜil[5{ .ӦW`klq;7Cuh_*i% qQ2N`2I*48y\nhYVB0]t3&b#Wï%SaV|+:fiuE B7Gxk? >T!- `Pkǎ^"cnVHҁ'NSrH 3YK/3 wA9ٔ¿2]1j6H˜+M_N.gd8_|j\ϗDɽL3Ni&EOEb#t&GZ*rz% vxsGTEWq9fEܚڠ&sHYHM/tLonIR$}Qp\P0l)i$"E:9dλ򥋡MB´dfY,ĿX>tj }3 ok鼺7p46G}g ENǻ棶Z)(Xº4It-HH2p3C 3vqrc $"ӵx)kgos7 '?x^.1PscVyk;8 paQAEt_('Wl?(߽nk9'*_Qu@=Tt/9k@K!|eh2*WIJ'9~HN;ǮwW7$鞨x&Ҟ]ޛC3ѻa\&`7gZ3 '/ٟV/pzt7ثXirCMI76F0W:x4X{ٰ\auSėm&">aۃY7?M;+%~Ze7&zwбשw5;I/prSSagX YB lUˬQƘ.'ںMƫlx, vjg|=UΉֺq 0v[Zx2h/LZdHoM7ev%,Vs>ku˝|}us6|^Oƣ3*9JmKCXM|2AzCΛ\Bx/zm.%$ E!qM?ecӈt $[N7]9ER_&&kXAK k_@&/]3JImr鳣YS[EU,EJl8=ZmL =1)R^crۋ l)aP9"䶟lw)C4\@UtxH&AtNIW&|iOxBf(I]>ki`³sb";i>Dn^l "lSHʍӲRʠ+<{^]=>8@v-v7:wVgq+rDKyӵIQoSK ZORG$:3c4-Ne-zH/9MV~mԍJlxBC{Fe/hQ_<"^VD6Iπը^O"i#o_&!O ] l6D z xtB 4p +I4wyq 7UP yk߈cB7%CF-݈b#MKHpZd&F7> endobj 112 0 obj << /Length1 1523 /Length2 8402 /Length3 0 /Length 9411 /Filter /FlateDecode >> stream xڍT6L#- RKw, " , ,,ݍt HtHIIww(/gyf{fVFm]^9KT  H4!>A\VV=);JwG`QPu@Q HB@ ( <,|U#U䉀Y p 9(;4H]E HA"$.|p4'@]7%d&4>\V . F@w{rh EtUZNP?x^;ݟѿ!h CZJ|H$hwŃ0{%'?@0' F_iYRuD:# wO?kww Y-~ɰtuw9BUɹ3c""bB3U@ ewXɀ¬w.`7(pz_ ,a$j s'j?0? @7 ;{Cb~Ey-=UM?%픗{yBB!@T\,Ko6O C%Ϲsi8 f(. "{Ww=o?q7ͮȻЀR ^$nCHj CBl~O_mnsj]`7^VbwMqkon[Qz"0/A7nG-GGޅ_-k2F ?$~_ 6b~^Ȉ? ;( ]C$ClC>q}8źe뽀hq$N ZE%t_T8]d;)IϵYV38EXg:Z^=m>OQTYs]Hݻ{, n=ٮUû.я~X8͚k5Cń䥻E̓ht${A5 F護њˋ2=Avjj#*: 6oU9Շs8PV{|HP #6>5wvL8Gm8Ot?,m齽qbD1cAc  zG?Ý}4hlfTywَ8Myl{*~u%ON'O=u T9Nx NE%%>/FibjW^uIc*"$ /Feh<ف*sfY% ىf+Kbfkw?GbLeS h#5O"E 7{ws{Q)hGĨu ΜDJ!q4.d19C u+1SS\ 3ۆd|-Ҳ8'+oG>;{Y&6>c|:rީM;dڟ.,PFy}`尔.6fq&}@(NIO"-HB$qM'r%.Zy굤oukmg's ވ5;-ɫ|(XύP\瀜 @Pӧgtz%9>90&6SGzdE Ke[Hv(~h LA9GŜ/}'{?G[Qb]>GߟL,yX)2?70T ~bNjԉ!=~qJ{Ugq$XdJ,D^%ML oVrqg3Ei&U4lG=W 'AMt;kHo-(E C}%CGVYn;?|xW("[$<3óZ'ĭ"+6+)=wqL{.4]Fh/RyL|*) )FpGWl, qaZJi/Wc"+r9OV$d@(©̅Lqp{ٱ_orQVôR8/2}Yv8e% 9 طyQn{S"rÒg( aD!^6cJ,=`i_& ̐&>\R>Y4Rh^^c㕆x'32UI wƍT.݁zI(-$ Ma͉添[k6Xzz*/$<1'Y9 L 8[;Er<(56no(+?кe5g;RS8y(m(^O {Gl,4]Gr^bbř'EnWgGS̨1&}}_լFZ뫽iK~t4>l?V6(P.k/(@ #[& uݐ/}L"BE`[y98Ƨ߃Deܿ PQe)TFiC60>+obk1xuQ{#4N/'ݫ('"3f/sUXa`s!Uhmn"s4UTJh2Ǯĵ|b п7:\͋a&:?Ri{y5Yb{\c[/]eV# (b1k/c{GDͿ'ZTwHud}npY(8 ]+,]ot݌7W,ɞ~\/,(fvn_#H ɴg+iv/aB@*4ӎCV^N[ꞵ5O)I*B~0כitmn@=إ(hd DW;{Kon.ibq. <qLtެtG2{ nµ:͒| F7^Fr +k7P- iQdlï/ k1Hb*V0;t-b:Dw䌶'飉$z|lU DKW85e~r2.Ai1 YdjJ~~VUUԘW0cf̄!9FOt{_5HK{h0dg7 tZ> ubp ˃[$2R6 D}CޯאB&\ee! 4Zn6@;?YZjk;[ރ+4 u?X:"bCAgAa u7Qc?sʪj0[lR[T.nsb@̌kmē9L1T{udW6"? [dFe-dwx)j)'Q_ ''m^Ti63L1ONo1MSi.F>p_R^H@q:]&H g6M.rG-&eS$;f'<Hc֚8Iq~y܎o5ţa0ñL/c򦇉3sCWon\,ʦ< >!I?`?VEܼQjشƯC{4@m45eǚa裡D$2z}U_ƄgC;BיzPЉ_ǹRk,`" w0- yW\ILM* l|R pDž dQ7EAM2\UJ>RZ7>5ץULS]/|wKƚYhaF%u#IاX.FOLgh-#w.~ FS{?t~&C",oC2AjODm!i-ѝ+h cG-hmEMGb*,'yo5=}dRpB1?~Oyu ZWclyi:?qpUѕ0*pa>{D , U#0[a$l]rxi- .]XD+:Z_ׅx@^E>zfd[ˀlfS;;pvւeT|Qu p$k^7 -8Kk)}^ FNɵ>Bӗ#EE҉$KƨB6IA+iS)F ;*73I*_Q̙$_UbCc=/WCQɗ -4|t ]-^@d̬5DOE5V9a~_wJO_}ɾSim7`(FZ/=o7w*$]"p8e7}$ VQL͙g'! ^2YGՙ؆VIɯ,bs'҈`Vpƍd Ao*9,_OxPH4q?3Yy9uemwFCLJ9VYï ?\f,]bVfoJ@lK q5$$1ISɈ?l'LQ{]^j 5G?eUvt*z+xx/,byZ{;07T*%vpܰJ15#\o( 0#U] SE}`xlA UM' \tF Zup> ̀c)FgۛtCDFx}A/MR,vdpQ6(Tz"VcXip@B*@ĕz $DQ+3Є1x%1񴬃+>߳Oi Њꭀ<^ E>- ,e¨!ĠU̵kպ8}d%M1vB9diMK~ژ0MWzT|b!+c3 P~yRj#}LZbHw~XFY!*Ϲ7Noxʀ\2DKt?  Mo5pYҸT[ykH2CMͭc* 7F$Eg eץ_82SP*]o}sGU5Tq kEJ!CH}PyN<~5*Ũoc+cYrԩ7tNd@)Wsu3{Uaꉏ=Q{SD~XชrfoxL%sUN]^. Y=gc2,6_BI,mo/=QقaD0xgɭTE\>X4KfWN *eDޔpUNX W8eCR\5|Y~wd5:Z9x|T+#%r`fL^흤knUgZi]̞Rt.,U33j!OeUASMaƮ~S}j=XRKc߇u0;DB=Vj˃HTXmƍv}YT;z!ʪjªWĂ_{.J6F]9t 9R2Ɋz+U&g\Skj9gv_$&u*|YM<gQO*H8qt n7-7k4`e~*2J1t)Im%vTXO`a!ɰdQoiT3K_x )H ~AS(DBr ՝,a֠_U+mCWr?Se+2t`C =/u+=<…Gyh$&K (|]53d»@X G=jyZ7ι8Ll4n?HØ[%emSuʏtS?*ѻʬ\`UpjM;npVtȵa*Fs/zAY+qh<1rAeИ l&ngd>je"U>1XѺt0P05I3dl|ǃ!'BN#Z ";k{ m yғ'CGٸ Xf^Q\j;1Vlғ]NBe6Qh ]n @6ybvט'umv3;d%>H%"aڹc;nq= ìh_l8~ \ qUj ,Fߌ^TMܒ*z&T Qˈ &\5358()?qP&ᅀML;Q4!qrS3.ԱjUyU\Hlڕ v0ZfvGB*8Nȣ]j1-4u3:Wjjy]S #%QQ ) Fbl`V~ +&9䬪0|^޾GBzrXŨc2̖-YDآ%e}a*V93%feɼCLDr5=遏5yBZ0WupB<>fy}laա{*6$ <6dZ۷:cR/_:/ǎ5PX)q,V^eo,SyV>#XadM큘1$Bԓ^yjz3¨$cSJTU(}V% 5u]·>iK>Ȃ믦۱Á!bT#߭'oS8 / Czp尸q岼cm9hc(,!( B:ܼa fՆ;! VU%¿9! (* {> G_ ||ĨT@(GzH'8O> BPMt Q5an0G̫ w*||n~A @XL(O¥:пkSAb6  Znin(?o:[o=_+o 4{"QZgM=H[Ԇ\%PuHP]0pCu P[Fm3*@nV_H` Q/$C=hxy`nH ] uB^_W&xE"@ j TuPQE(:7{7U Be0 B峻Avp[3uC7r T*u:HI\]o:6^? *%_57^M T%׍/'UMA(f}?,P2EM9¨]~؍E CudG٢^?Ԩo(_w|KKLw0a*[u`[qb c>Pt( d&+E: b=(o ?{?0`f' ZW g@aNoÚ~Tzs$9|ztx]nwg3m7os6 tZH}&~w b0J.uPom5;ݯ>`8<,R_~Z渏ZC1 JTT#Y6\Jvcġ :ͳA~O=soС[[DG[SvӨی&;.B‚C:q4úOmư`xuRq#0<$srފak4V}$P@!ozJ?<5m8.L!伫7 K88˭Ďzzx>p.\]6@2 f_,|¶3MBǚ.qT68 ${C4|o>1s*Cȑ-Zim.o+r)/r\} R~C--[0~`2>hXaU:\_FැxYlxsKۈᨕpAm눴%jAtk0HZA4(*WI+ kzCh6ޗÍwWGFϞh4̃=iKXbuAG5^W0`}|ܱ=vW*,ӊ5JבJvY\)>=jydZ|oƗ댵wϢyzܻ?e[,۝x?&a%²,!_ս,T'߹ՑÜ}^}gEEI̞73UyzY/U[Bb6ep;`R-bb:KFc 90p.t~$ ]AJŬ!=X7?9&GmP&=S74~Sv/"V{ZcǧӚoҲ|=="U?!3VO4h(!ї&] B͘VA@\.c*$&r\Ҝ'nGgmJG;rq#'ݐ^+v=1\:ҬXŰ4#tgjOkJ`UZd1-gKAEq8-=o{c9Q'I?elR,浇+kD;DMMaVs)FDŽ 8BrLYTrpYcB|$>CZةI H>4' L\͓(abeLJ`%)0jtPΨbs'QP[tQ; HRGyPsc!ۋ{ý@2%9!8SO1!75~W]$XiOוtOUdXB[_jY'hSZ7/L'TQ] _y'C:1vtA%]]\^1`|8LwZL 1mhx=J!PӺ'},&4+_#ucS&ݞ?-NjB|Z+n/ڗVm3H= .W."9hk>YՈ >Czj4R]$@*n5dyCLet*<>#:ꑎ=o3)n_<06u _?>DoϯFz4^!U_e"}c9@gKQ,];U*V2< ϗ,OȹL@p։SZ?6ӰȎw flqyA9%)vw^޺!mJ&Y'aYOU-MNx"ؘ}'eamlÐv >Iyoc,&ct ޻n&ro+GluiPG?X=);Cv糂t*ņ<"2΃( XVe=L JXypJJWbBJfgq:֌x]^#]o:su:\iM _ٮׯåW%c6)+RMe(wEN5;GQ r(m7q&'VN 0>)Ur^[)Lkφs s=mZ,7|(@ {Gwb É&r!"Ϳ"d)ܡ:S>~iqڱW*k=ehNPYDȤC">m/jcqqejK eZܘos=/jzBa匃9U߿']pgʭEPWlB~ 9qwƎc3֕rMM^!X7:O[m2{]sF*m8UByv_e""wbCsg-7+pC_2&e1YjNYo9YJWJkj@HgY ^7*:v<r Z[wj\y354 wm89ٚW}ͅ'NHxmQ`G(`Ѕ(-!0_#q8GDDFciz^n\Pcū2Mܖk&)ɽŃL.Sc$&s[% Ǣm;Ea۵v~.I5FL`c_&/qmr׬QCF36c˦;.[_"\JkU@m#gm f< S6j :,qv9fsM9 SJX,w'+>ĩt0L&ӕMevhqY~6cl*O1 r۞~7nC˻tdT-v*urU%e>gi~|I,mk"'- Lf99y 򓏬J(z/9TK墻`DnEm&^cj:wU齷 VùH)ַ*d\žtĪX &IUNVE  )x_u#.VҊGoYX{qJZ \1[74}zۜ1Mڐ0*j^ŭY3BlĤD14U=L\LWDV> XdsN<"le80?Db;vtT8pn)/l>**3rZȕ f}gMԗ arZ4ߺLz<껌" l'_xױkܯ9LR'gT/N!;!\E5X jGeIf؄MIEIǽb48=z58Vby^)EYBpe˝٢H2䱃l:o ~_դcd"u8ܥ44 NxwP! ;d4 YI-a(/k YD2|˼)0uCOXs692L|6邧OGZc2{iDBKm`zU:)'ON46t#go7n2-V8,t)ط)͵߉4$ %-.WRf^O.bEd<&<пVtx9$&r{5UtO*Ѥzޝ7\cd% ˏ7F;ԦXs@ƚIU{Qbg)8Zo7RfbNu{0wyhC_*~_"ʲ{%|qܛكq#i*V괜lW'a9"Uz1+UU5_>̩F0!cY9d(ȟ% ެq}jVkuF$7@>6ZbwrG4uH(ǭ6Xy353etl!ksU@X,%UWeW,~<${#BuGP<{an.u'*.h|ZTpGtW4atI2%w^&l’^!,l qy#Z iJ{ZKMo]<. /a}~0'e2_@bϚ9zH P3kz==H,ƌ,Ɛщ}Q2*?Mov+?0Qˠu1ZX4枟{<'*Ec$qb=ճNLD"zܒKW!]\:!cw==C6!&:%FȃCSbsaAo>e85R2ij}jwG]{*a0feu-m[?3,k彋,vZYXMwzm|:^:o̘po~9z5}bѓ ƙ9tG%KMZ2Αߊ_B>q-#~~1g"] ҷ3'7kȆWF WBJGjqE$kp tk"$㧿?$R0Q,c*,Vᢏ&˶e0,!. lջeƭFrDMcs l 7:B+H5c 0pnS]1 R[yعQPv-ON |ѕ>5T)Ds80~% c른nf)/AH/Anнy)W%]]F5<*{J.}YM8א̈nOꭇs[MḢ`Q/1=7ǤY6&XXլaBr;%Kj؞.qfU!DA5-Eʱm4:++6)XJ(6v CI{9A K@)wƛ sIػvbgБ{k3wc(8<>1{5p=ʬW,P ?.*Wyma`"SJʴ ɽ/qX&m<00-YfӲ?frh:0tվm@n?=8:Jt0.&}{E2Y~g^^ϴ=&l6LKxlb|}20ݾ{﹍Ej/"d5@!}6Q?{؅ҕ?4?5tCGy/Ŝ`wŰ)|Z7]Tj<Ίԣ[z& %;=W;z>NǓ6Jq o~)*Wߓy_2R^*~MFQ:WtݗA.:$W~M.='p-@# 5v{JH endstream endobj 115 0 obj << /Type /FontDescriptor /FontName /DBSDIJ+CMTT12 /Flags 4 /FontBBox [-1 -234 524 695] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/A/C/D/E/F/L/M/N/O/P/Q/S/U/W/a/b/bracketleft/bracketright/c/colon/comma/d/e/equal/f/five/four/g/h/hyphen/i/k/l/less/m/n/o/one/p/parenleft/parenright/percent/period/q/quotedbl/r/s/seven/t/three/two/u/w/x/y/zero) /FontFile 114 0 R >> endobj 47 0 obj << /Type /Font /Subtype /Type1 /BaseFont /AIWORI+CMBX12 /FontDescriptor 93 0 R /FirstChar 49 /LastChar 121 /Widths 88 0 R >> endobj 51 0 obj << /Type /Font /Subtype /Type1 /BaseFont /WNUFBD+CMR10 /FontDescriptor 95 0 R /FirstChar 44 /LastChar 121 /Widths 84 0 R >> endobj 45 0 obj << /Type /Font /Subtype /Type1 /BaseFont /BXYEWM+CMR12 /FontDescriptor 97 0 R /FirstChar 11 /LastChar 121 /Widths 90 0 R >> endobj 44 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ULDUEX+CMR17 /FontDescriptor 99 0 R /FirstChar 71 /LastChar 119 /Widths 91 0 R >> endobj 52 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FYGEPU+CMR7 /FontDescriptor 101 0 R /FirstChar 49 /LastChar 50 /Widths 83 0 R >> endobj 49 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PXOHER+CMR8 /FontDescriptor 103 0 R /FirstChar 49 /LastChar 50 /Widths 86 0 R >> endobj 61 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PPAHCI+CMSLTT10 /FontDescriptor 105 0 R /FirstChar 33 /LastChar 126 /Widths 80 0 R >> endobj 46 0 obj << /Type /Font /Subtype /Type1 /BaseFont /UEIZYW+CMSY10 /FontDescriptor 107 0 R /FirstChar 3 /LastChar 3 /Widths 89 0 R >> endobj 50 0 obj << /Type /Font /Subtype /Type1 /BaseFont /SDVCAT+CMSY7 /FontDescriptor 109 0 R /FirstChar 3 /LastChar 3 /Widths 85 0 R >> endobj 60 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JIQTFW+CMTI12 /FontDescriptor 111 0 R /FirstChar 110 /LastChar 116 /Widths 81 0 R >> endobj 54 0 obj << /Type /Font /Subtype /Type1 /BaseFont /EBOTJN+CMTT10 /FontDescriptor 113 0 R /FirstChar 80 /LastChar 114 /Widths 82 0 R >> endobj 48 0 obj << /Type /Font /Subtype /Type1 /BaseFont /DBSDIJ+CMTT12 /FontDescriptor 115 0 R /FirstChar 34 /LastChar 121 /Widths 87 0 R >> endobj 55 0 obj << /Type /Pages /Count 6 /Kids [38 0 R 57 0 R 63 0 R 68 0 R 73 0 R 77 0 R] >> endobj 116 0 obj << /Type /Outlines /First 3 0 R /Last 35 0 R /Count 9 >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R /Parent 116 0 R /Prev 31 0 R >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R /Parent 116 0 R /Prev 27 0 R /Next 35 0 R >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R /Parent 116 0 R /Prev 23 0 R /Next 31 0 R >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 116 0 R /Prev 19 0 R /Next 27 0 R >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 116 0 R /Prev 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 116 0 R /Prev 11 0 R /Next 19 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 116 0 R /Prev 7 0 R /Next 15 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 116 0 R /Prev 3 0 R /Next 11 0 R >> endobj 3 0 obj << /Title 4 0 R /A 1 0 R /Parent 116 0 R /Next 7 0 R >> endobj 117 0 obj << /Names [(Doc-Start) 43 0 R (Hfootnote.1) 53 0 R (Hfootnote.2) 71 0 R (page.1) 42 0 R (page.2) 59 0 R (page.3) 65 0 R] /Limits [(Doc-Start) (page.3)] >> endobj 118 0 obj << /Names [(page.4) 70 0 R (page.5) 75 0 R (page.6) 79 0 R (section.1) 2 0 R (section.2) 6 0 R (section.3) 10 0 R] /Limits [(page.4) (section.3)] >> endobj 119 0 obj << /Names [(section.4) 14 0 R (section.5) 18 0 R (section.6) 22 0 R (section.7) 26 0 R (section.8) 30 0 R (section.9) 34 0 R] /Limits [(section.4) (section.9)] >> endobj 120 0 obj << /Kids [117 0 R 118 0 R 119 0 R] /Limits [(Doc-Start) (section.9)] >> endobj 121 0 obj << /Dests 120 0 R >> endobj 122 0 obj << /Type /Catalog /Pages 55 0 R /Outlines 116 0 R /Names 121 0 R /PageMode/UseOutlines /OpenAction 37 0 R >> endobj 123 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.14)/Keywords() /CreationDate (D:20190716155113-07'00') /ModDate (D:20190716155113-07'00') /Trapped /False /PTEX.Fullbanner (This is MiKTeX-pdfTeX 2.9.4902 (1.40.14)) >> endobj xref 0 124 0000000000 65535 f 0000000015 00000 n 0000003712 00000 n 0000159213 00000 n 0000000060 00000 n 0000000090 00000 n 0000006657 00000 n 0000159129 00000 n 0000000135 00000 n 0000000170 00000 n 0000006711 00000 n 0000159043 00000 n 0000000215 00000 n 0000000277 00000 n 0000006766 00000 n 0000158955 00000 n 0000000323 00000 n 0000000371 00000 n 0000009903 00000 n 0000158867 00000 n 0000000417 00000 n 0000000458 00000 n 0000012796 00000 n 0000158779 00000 n 0000000504 00000 n 0000000569 00000 n 0000015504 00000 n 0000158691 00000 n 0000000615 00000 n 0000000662 00000 n 0000017434 00000 n 0000158603 00000 n 0000000708 00000 n 0000000748 00000 n 0000017489 00000 n 0000158528 00000 n 0000000794 00000 n 0000000823 00000 n 0000003324 00000 n 0000003451 00000 n 0000003825 00000 n 0000000871 00000 n 0000003604 00000 n 0000003657 00000 n 0000157094 00000 n 0000156954 00000 n 0000157656 00000 n 0000156673 00000 n 0000158218 00000 n 0000157373 00000 n 0000157795 00000 n 0000156814 00000 n 0000157234 00000 n 0000003766 00000 n 0000158076 00000 n 0000158360 00000 n 0000006821 00000 n 0000006496 00000 n 0000004001 00000 n 0000006604 00000 n 0000157933 00000 n 0000157512 00000 n 0000009958 00000 n 0000009742 00000 n 0000006939 00000 n 0000009850 00000 n 0000012590 00000 n 0000012910 00000 n 0000012463 00000 n 0000010076 00000 n 0000012743 00000 n 0000012851 00000 n 0000015559 00000 n 0000015343 00000 n 0000013062 00000 n 0000015451 00000 n 0000017544 00000 n 0000017273 00000 n 0000015665 00000 n 0000017381 00000 n 0000017638 00000 n 0000018032 00000 n 0000018080 00000 n 0000018238 00000 n 0000018268 00000 n 0000018707 00000 n 0000018731 00000 n 0000018761 00000 n 0000019307 00000 n 0000019737 00000 n 0000019759 00000 n 0000020364 00000 n 0000020672 00000 n 0000034604 00000 n 0000034922 00000 n 0000051381 00000 n 0000051675 00000 n 0000071980 00000 n 0000072454 00000 n 0000082520 00000 n 0000082768 00000 n 0000089920 00000 n 0000090144 00000 n 0000097303 00000 n 0000097527 00000 n 0000113273 00000 n 0000113735 00000 n 0000120853 00000 n 0000121086 00000 n 0000128221 00000 n 0000128453 00000 n 0000135808 00000 n 0000136034 00000 n 0000145565 00000 n 0000145801 00000 n 0000156248 00000 n 0000158454 00000 n 0000159284 00000 n 0000159456 00000 n 0000159622 00000 n 0000159802 00000 n 0000159891 00000 n 0000159929 00000 n 0000160055 00000 n trailer << /Size 124 /Root 122 0 R /Info 123 0 R /ID [<4FECDD3307019BA1852BDE09B0153971> <4FECDD3307019BA1852BDE09B0153971>] >> startxref 160330 %%EOF doParallel/inst/doc/gettingstartedParallel.R0000644000176200001440000000406113513452341020705 0ustar liggesusers### R code from vignette source 'gettingstartedParallel.Rnw' ################################################### ### code chunk number 1: loadLibs ################################################### library(doParallel) cl <- makeCluster(2) registerDoParallel(cl) foreach(i=1:3) %dopar% sqrt(i) ################################################### ### code chunk number 2: gettingstartedParallel.Rnw:149-150 ################################################### stopCluster(cl) ################################################### ### code chunk number 3: gettingstartedParallel.Rnw:193-196 ################################################### library(doParallel) cl <- makeCluster(2) registerDoParallel(cl) ################################################### ### code chunk number 4: bootpar ################################################### x <- iris[which(iris[,5] != "setosa"), c(1,5)] trials <- 10000 ptime <- system.time({ r <- foreach(icount(trials), .combine=cbind) %dopar% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] ptime ################################################### ### code chunk number 5: bootseq ################################################### stime <- system.time({ r <- foreach(icount(trials), .combine=cbind) %do% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] stime ################################################### ### code chunk number 6: getDoParWorkers ################################################### getDoParWorkers() ################################################### ### code chunk number 7: getDoParName ################################################### getDoParName() getDoParVersion() ################################################### ### code chunk number 8: gettingstartedParallel.Rnw:274-275 ################################################### stopCluster(cl) doParallel/inst/doc/gettingstartedParallel.Rnw0000644000176200001440000003236113513447603021263 0ustar liggesusers% \VignetteIndexEntry{Getting Started with doParallel and foreach} % \VignetteDepends{doParallel} % \VignetteDepends{foreach} % \VignettePackage{doParallel} \documentclass[12pt]{article} \usepackage{amsmath} \usepackage[pdftex]{graphicx} \usepackage{color} \usepackage{xspace} \usepackage{url} \usepackage{fancyvrb} \usepackage{fancyhdr} \usepackage[ colorlinks=true, linkcolor=blue, citecolor=blue, urlcolor=blue] {hyperref} \usepackage{lscape} \usepackage{Sweave} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % define new colors for use \definecolor{darkgreen}{rgb}{0,0.6,0} \definecolor{darkred}{rgb}{0.6,0.0,0} \definecolor{lightbrown}{rgb}{1,0.9,0.8} \definecolor{brown}{rgb}{0.6,0.3,0.3} \definecolor{darkblue}{rgb}{0,0,0.8} \definecolor{darkmagenta}{rgb}{0.5,0,0.5} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\bld}[1]{\mbox{\boldmath $#1$}} \newcommand{\shell}[1]{\mbox{$#1$}} \renewcommand{\vec}[1]{\mbox{\bf {#1}}} \newcommand{\ReallySmallSpacing}{\renewcommand{\baselinestretch}{.6}\Large\normalsize} \newcommand{\SmallSpacing}{\renewcommand{\baselinestretch}{1.1}\Large\normalsize} \newcommand{\halfs}{\frac{1}{2}} \setlength{\oddsidemargin}{-.25 truein} \setlength{\evensidemargin}{0truein} \setlength{\topmargin}{-0.2truein} \setlength{\textwidth}{7 truein} \setlength{\textheight}{8.5 truein} \setlength{\parindent}{0.20truein} \setlength{\parskip}{0.10truein} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagestyle{fancy} \lhead{} \chead{Getting Started with doParallel and foreach} \rhead{} \lfoot{} \cfoot{} \rfoot{\thepage} \renewcommand{\headrulewidth}{1pt} \renewcommand{\footrulewidth}{1pt} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{Getting Started with doParallel and foreach} \author{Steve Weston\footnote{Steve Weston wrote the original version of this vignette for the doMC package. Rich Calaway adapted the vignette for doParallel.} and Rich Calaway} \begin{document} \maketitle \thispagestyle{empty} \section{Introduction} The \texttt{doParallel} package is a ``parallel backend'' for the \texttt{foreach} package. It provides a mechanism needed to execute \texttt{foreach} loops in parallel. The \texttt{foreach} package must be used in conjunction with a package such as \texttt{doParallel} in order to execute code in parallel. The user must register a parallel backend to use, otherwise \texttt{foreach} will execute tasks sequentially, even when the \%dopar\% operator is used.\footnote{\texttt{foreach} will issue a warning that it is running sequentially if no parallel backend has been registered. It will only issue this warning once, however.} The \texttt{doParallel} package acts as an interface between \texttt{foreach} and the \texttt{parallel} package of R 2.14.0 and later. The \texttt{parallel} package is essentially a merger of the \texttt{multicore} package, which was written by Simon Urbanek, and the \texttt{snow} package, which was written by Luke Tierney and others. The \texttt{multicore} functionality supports multiple workers only on those operating systems that support the \texttt{fork} system call; this excludes Windows. By default, \texttt{doParallel} uses \texttt{multicore} functionality on Unix-like systems and \texttt{snow} functionality on Windows. Note that the \texttt{multicore} functionality only runs tasks on a single computer, not a cluster of computers. However, you can use the \texttt{snow} functionality to execute on a cluster, using Unix-like operating systems, Windows, or even a combination. It is pointless to use \texttt{doParallel} and \texttt{parallel} on a machine with only one processor with a single core. To get a speed improvement, it must run on a machine with multiple processors, multiple cores, or both. \section{A word of caution} Because the \texttt{parallel} package in \texttt{multicore} mode starts its workers using \texttt{fork} without doing a subsequent \texttt{exec}, it has some limitations. Some operations cannot be performed properly by forked processes. For example, connection objects very likely won't work. In some cases, this could cause an object to become corrupted, and the R session to crash. \section{Registering the \texttt{doParallel} parallel backend} To register \texttt{doParallel} to be used with \texttt{foreach}, you must call the \texttt{registerDoParallel} function. If you call this with no arguments, on Windows you will get three workers and on Unix-like systems you will get a number of workers equal to approximately half the number of cores on your system. You can also specify a cluster (as created by the \texttt{makeCluster} function) or a number of cores. The \texttt{cores} argument specifies the number of worker processes that \texttt{doParallel} will use to execute tasks, which will by default be equal to one-half the total number of cores on the machine. You don't need to specify a value for it, however. By default, \texttt{doParallel} will use the value of the ``cores'' option, as specified with the standard ``options'' function. If that isn't set, then \texttt{doParallel} will try to detect the number of cores, and use one-half that many workers. Remember: unless \texttt{registerDoMC} is called, \texttt{foreach} will {\em not} run in parallel. Simply loading the \texttt{doParallel} package is not enough. \section{An example \texttt{doParallel} session} Before we go any further, let's load \texttt{doParallel}, register it, and use it with \texttt{foreach}. We will use \texttt{snow}-like functionality in this vignette, so we start by loading the package and starting a cluster: <>= library(doParallel) cl <- makeCluster(2) registerDoParallel(cl) foreach(i=1:3) %dopar% sqrt(i) @ <>= stopCluster(cl) @ To use \texttt{multicore}-like functionality, we would specify the number of cores to use instead (but note that on Windows, attempting to use more than one core with \texttt{parallel} results in an error): \begin{verbatim} library(doParallel) registerDoParallel(cores=2) foreach(i=1:3) %dopar% sqrt(i) \end{verbatim} \begin{quote} Note well that this is {\em not} a practical use of \texttt{doParallel}. This is our ``Hello, world'' program for parallel computing. It tests that everything is installed and set up properly, but don't expect it to run faster than a sequential \texttt{for} loop, because it won't! \texttt{sqrt} executes far too quickly to be worth executing in parallel, even with a large number of iterations. With small tasks, the overhead of scheduling the task and returning the result can be greater than the time to execute the task itself, resulting in poor performance. In addition, this example doesn't make use of the vector capabilities of \texttt{sqrt}, which it must to get decent performance. This is just a test and a pedagogical example, {\em not} a benchmark. \end{quote} But returning to the point of this example, you can see that it is very simple to load \texttt{doParallel} with all of its dependencies (\texttt{foreach}, \texttt{iterators}, \texttt{parallel}, etc), and to register it. For the rest of the R session, whenever you execute \texttt{foreach} with \texttt{\%dopar\%}, the tasks will be executed using \texttt{doParallel} and \texttt{parallel}. Note that you can register a different parallel backend later, or deregister \texttt{doParallel} by registering the sequential backend by calling the \texttt{registerDoSEQ} function. \section{A more serious example} Now that we've gotten our feet wet, let's do something a bit less trivial. One good example is bootstrapping. Let's see how long it takes to run 10,000 bootstrap iterations in parallel on \Sexpr{getDoParWorkers()} cores: <>= library(doParallel) cl <- makeCluster(2) registerDoParallel(cl) @ <>= x <- iris[which(iris[,5] != "setosa"), c(1,5)] trials <- 10000 ptime <- system.time({ r <- foreach(icount(trials), .combine=cbind) %dopar% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] ptime @ Using \texttt{doParallel} and \texttt{parallel} we were able to perform 10,000 bootstrap iterations in \Sexpr{ptime} seconds on \Sexpr{getDoParWorkers()} cores. By changing the \texttt{\%dopar\%} to \texttt{\%do\%}, we can run the same code sequentially to determine the performance improvement: <>= stime <- system.time({ r <- foreach(icount(trials), .combine=cbind) %do% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] stime @ The sequential version ran in \Sexpr{stime} seconds, which means the speed up is about \Sexpr{round(stime / ptime, digits=1)} on \Sexpr{getDoParWorkers()} workers.\footnote{If you build this vignette yourself, you can see how well this problem runs on your hardware. None of the times are hardcoded in this document. You can also run the same example which is in the examples directory of the \texttt{doParallel} distribution.} Ideally, the speed up would be \Sexpr{getDoParWorkers()}, but no multicore CPUs are ideal, and neither are the operating systems and software that run on them. At any rate, this is a more realistic example that is worth executing in parallel. We do not explain what it's doing or how it works here. We just want to give you something more substantial than the \texttt{sqrt} example in case you want to run some benchmarks yourself. You can also run this example on a cluster by simply reregistering with a cluster object that specifies the nodes to use. (See the \texttt{makeCluster} help file for more details.) \section{Getting information about the parallel backend} To find out how many workers \texttt{foreach} is going to use, you can use the \texttt{getDoParWorkers} function: <>= getDoParWorkers() @ This is a useful sanity check that you're actually running in parallel. If you haven't registered a parallel backend, or if your machine only has one core, \texttt{getDoParWorkers} will return one. In either case, don't expect a speed improvement. \texttt{foreach} is clever, but it isn't magic. The \texttt{getDoParWorkers} function is also useful when you want the number of tasks to be equal to the number of workers. You may want to pass this value to an iterator constructor, for example. You can also get the name and version of the currently registered backend: <>= getDoParName() getDoParVersion() @ <>= stopCluster(cl) @ This is mostly useful for documentation purposes, or for checking that you have the most recent version of \texttt{doParallel}. \section{Specifying multicore options} When using \texttt{multicore}-like functionality, the \texttt{doParallel} package allows you to specify various options when running \texttt{foreach} that are supported by the underlying \texttt{mclapply} function: ``preschedule'', ``set.seed'', ``silent'', and ``cores''. You can learn about these options from the \texttt{mclapply} man page. They are set using the \texttt{foreach} \texttt{.options.multicore} argument. Here's an example of how to do that: \begin{verbatim} mcoptions <- list(preschedule=FALSE, set.seed=FALSE) foreach(i=1:3, .options.multicore=mcoptions) %dopar% sqrt(i) \end{verbatim} The ``cores'' options allows you to temporarily override the number of workers to use for a single \texttt{foreach} operation. This is more convenient than having to re-register \texttt{doParallel}. Although if no value of ``cores'' was specified when \texttt{doParallel} was registered, you can also change this value dynamically using the \texttt{options} function: \begin{verbatim} options(cores=2) getDoParWorkers() options(cores=3) getDoParWorkers() \end{verbatim} If you did specify the number of cores when registering \texttt{doParallel}, the ``cores'' option is ignored: \begin{verbatim} registerDoParallel(4) options(cores=2) getDoParWorkers() \end{verbatim} As you can see, there are a number of options for controlling the number of workers to use with \texttt{parallel}, but the default behaviour usually does what you want. \section{Stopping your cluster} If you are using \texttt{snow}-like functionality, you will want to stop your cluster when you are done using it. The \texttt{doParallel} package's \texttt{.onUnload} function will do this automatically if the cluster was created automatically by \texttt{registerDoParallel}, but if you created the cluster manually you should stop it using the \texttt{stopCluster} function: \begin{verbatim} stopCluster(cl) \end{verbatim} \section{Conclusion} The \texttt{doParallel} and \texttt{parallel} packages provide a nice, efficient parallel programming platform for multiprocessor/multicore computers running operating systems such as Linux and Mac OS X. It is very easy to install, and very easy to use. In short order, an average R programmer can start executing parallel programs, without any previous experience in parallel computing. \end{document} doParallel/inst/unitTests/0000755000176200001440000000000013513447603015316 5ustar liggesusersdoParallel/inst/unitTests/runTestSuite.sh0000644000176200001440000000165613513447603020340 0ustar liggesusers#!/bin/sh LOGFILE=test.log R --vanilla --slave > ${LOGFILE} 2>&1 <<'EOF' library(doParallel) library(RUnit) verbose <- as.logical(Sys.getenv('FOREACH_VERBOSE', 'FALSE')) library(doParallel) registerDoParallel() options(warn=1) options(showWarnCalls=TRUE) cat('Starting test at', date(), '\n') cat(sprintf('doParallel version: %s\n', getDoParVersion())) cat(sprintf('Running with %d worker(s)\n', getDoParWorkers())) tests <- c('options.R') errcase <- list() for (f in tests) { cat('\nRunning test file:', f, '\n') t <- runTestFile(f) e <- getErrors(t) if (e$nErr + e$nFail > 0) { errcase <- c(errcase, t) print(t) } } if (length(errcase) == 0) { cat('*** Ran all tests successfully ***\n') } else { cat('!!! Encountered', length(errcase), 'problems !!!\n') for (t in errcase) { print(t) } } stopImplicitCluster() cat('Finished test at', date(), '\n') EOF doParallel/inst/unitTests/options.R0000644000176200001440000000467713513447603017152 0ustar liggesuserstest.preschedule <- function() { x <- list(1:3, 1:9, 1:19) cs <- 1:20 dpn <- getDoParName() for (chunkSize in cs) { ## preschedule is TRUE for MC by default and ## FALSE for SNOW, so we test by setting them otherwise if (identical(dpn, "doParallelMC")) { opts <- list(preschedule=FALSE) } else { opts <- list(preschedule=TRUE) } for (y in x) { if (identical(dpn, "doParallelMC")) { actual <- foreach(i=y, .options.multicore=opts) %dopar% i } else { actual <- foreach(i=y, .options.snow=opts) %dopar% i } checkEquals(actual, as.list(y)) if (identical(dpn, "doParallelMC")) { actual <- foreach(i=y, .combine="c", .options.multicore=opts) %dopar% i } else { actual <- foreach(i=y, .combine="c", .options.snow=opts) %dopar% i } checkEquals(actual, y) } } } test.attach <- function() { if (identical(getDoParName(), "doParallelMC")) { return(TRUE) } else { myFun <- function(x){ myFun1(x+1) } myFun1 <- function(x){ 2*x } testFun <- function(){ inRes1 <- checkTrue("exportEnv" %in% search()) if (!inRes1) { stop("Attaching exportEnv failed") } inRes2 <- checkTrue(exists("myFun1", where=2)) if (!inRes1) { stop("myFun1 not found in exportEnv") } myFun(1) } res <- suppressWarnings(foreach(i=1:4, .combine="c", .packages="RUnit", .export="myFun1", .options.snow=list(attachExportEnv=TRUE)) %dopar% testFun()) checkEquals(res, c(4,4, 4, 4)) } } pkgname.test.stress <- function() { if (!require(caret, quietly=TRUE)) { return(TRUE) } else { library(mlbench) data(BostonHousing) lmFit <- train(medv ~ . + rm:lstat, data = BostonHousing, "lm") library(rpart) rpartFit <- train(medv ~ ., data = BostonHousing, "rpart", tuneLength = 9) } } "test.pkgname.test.stress" <- function() { res <- try(pkgname.test.stress()) checkTrue(!is(res, "try-error"), msg="pkgname stress test failed") }