doParallel/0000755000176000001440000000000012304163234012357 5ustar ripleyusersdoParallel/inst/0000755000176000001440000000000012303225114013327 5ustar ripleyusersdoParallel/inst/examples/0000755000176000001440000000000012303222161015144 5ustar ripleyusersdoParallel/inst/examples/bootParallel.R0000644000176000001440000000471712154216423017730 0ustar ripleyuserssuppressMessages(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/0000755000176000001440000000000012303225114014074 5ustar ripleyusersdoParallel/inst/doc/gettingstartedParallel.R0000644000176000001440000000375012303225114020731 0ustar ripleyusers### 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.Rnw0000644000176000001440000003167012303225114021300 0ustar ripleyusers% \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 \\ doc@revolutionanalytics.com} \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/doc/gettingstartedParallel.pdf0000644000176000001440000044763012303225114021312 0ustar ripleyusers%PDF-1.5 % 42 0 obj << /Length 2406 /Filter /FlateDecode >> stream xYKoWPuM""tH'fd!˴=uKY΢ }w*>T S/. mFeB]]ۙ.fs[UO8~^Vk~~PҺ-_{KkxI\M׳ u yQ ꆩ#Rp3S-jl5]Ѩ& gE^*IV=tS!b\ЙLSkxi ==<-:Z>%6ڗv:ڃ0uk:)[~>twt8 zhì6e{zIGLp:>WKƛ6;\7AE h2@|tGki`lݽpװLsEӚRZ&)@AzPD-S{N,MS%2(2 fJW/׫6Lz[AYNɼՈø51  b=_utGJdxFxbfhU@Y=2U#ګd-ی@QՕY_c} LݔێW1Ys$tZ\L9sPG &mگ[ Kͥ!MxT`W>z[:;AKXRF/$#@$# 'p$^ >XiI!AaKy#gl"NJBxŐ ɝystd-lE =QD$K($Kvv}8Bjebzx6 <FdgU5Z 0%pόDgkek;ETO;y`OcjD X$a-dM;=3+.1pՊ`w_H ]Ȋ=ەrF4zpNXk@fS$)iKOAv+i &@%<rV\Q~7`f|T@FeÐOaX#vDb "! eŔu3aoñU.+G{;jZ~#]Gl"DF} B6?Oc9ߐeSu?Nq! dM{Y~=.waXǽ$S>b^N՜=Ktl)/z|_ꥒb__TQc?uB` H`<1g)m- C x8Z'uM:L R 0J퐯|8:{ɏk :u/? 0^9lkE!ԧɋ^` ާm0<ʄ)08> 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 65 0 obj << /Length 2728 /Filter /FlateDecode >> stream xڝZs_d樉_$u&i2IDD|o.viN,~t1/w(ϝӓDMn*5u]Oi2|๝Όv/.iawNuE <~ Q5:/#a w7۫ 'N*5ϭ+'b'E>OfOEzv7Oɋcs};ôeVәS&S9T  C8xad繶մFLUf0#>wK ?m d(ڋ8ƙMˍ9۰Mu Ϋ{B)8uv :{^39rYwt 瑈4\ 91;^fOxZbIgI)\o7(9Lun̼ Ԓ%X'z`8xP4fL:aOK#@?tX;zxx1 Oo̔[2b&q1;p"=Ottġ}=2NA ~-.)Cvgf*U憶6<6#+xIfL*4$^':î<n-x7GF6Yma-@FCL+Wl|⓬ Bh#ԻO*9whTgJ ;%Y] zq D͜y6;D|k rZ,"54'I_<5,P;ٌi{0_gp6u!PГ $ !{ mc>vu pF;C)_ڌ˕KVf /oh 't2۽~EFd(RBJIXmqe$rD~מ6 KpҚ. mR#8+5XV&4^6ٲ ,E[^}{)`I Ab k 2/Bl c5 hbM#lҽ|sv]9k4WWܗDgDUVRt5`# 2?7)mgGt}K{Lh)Ķu19j_ċq_'j k_Sx<^ ;"Muն5Nrf+lvMuFܻ!i׍.$։U!y{O2̎oD.SMX$tƒ/p=|X=&ДEa%;jĆnEMI $;\(K*_ oQMR$"mcXsvhGCc:CY>ojm?Jr l8(M~f\'W/-W#(!bxM+~72|i>\"neh&+f1Qh2> stream xڍ]D}~_VmwӁV}$N&q0:o>mBU/l 8H;HzC!lT];y}hT # EfHv 0pj$]!B%aS9 k-]zXϲzlLEj3ȬY:Uҁ;6‰WsKJ1ʲ+ܳ(9V@z;a6Eߐ|%QsQ~ "io]P>E*kP8D /H5Hn+Q`:dHi{tX8񳟁lGVrx& Hsu.zϹ.-jꆍXIf Ɲ,u"G\:cimɼ!AGOe?^_+JVXYiiV [GXD܏9h',)2Ns+}ȼh\ Z{EVvɿ~90V`^ Dt".Q 5{yІ?オrb#._f^I6 Ȍ_S@V܋='/&(I/r$wrA4g?Uڡ`+ݰ͙(*ޘQЯC)HUHGb#GMSc ^F5@0̙7x͜tzm1)ȩc#L8czyi+ o 6uZ %ɲZe915)etCb.ƑW$%Q=j"؇  s!T/m'@N!JKj k|(J܎mc&hofʛYL =I#_IR<$D0a $6)r)>GY&ThV#acg>hr#}nx ߀$h,JC0}`4G\AL/5fbUdX=gca^AjIxUTrNa_ TD%sOvYFҕ!yQ)$wQ:PЊ z|R .]j[CJ<e,i}Y0^dTT`ट^$yݰq/.nNOAWiOUQߨןjAc:slH1Hc\Y%%:@dApaQ> 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|U/ڐ.ʾIUa 4Ϡgm%A&" ImN[yjcu-a\*<*j8yEnrJyX|/VĬ҆ȱ=.M*\`vuțcGn::*4Ϲ3ʦIfI$Ay ¦IZF()"oE]EX5PZ w"p Z'KEfq&~3yQBd[)Tq ^u# ]WddEch2xf h>þ^ؔL*$f'"SI M  FT: ao-$ _0θ{"յ TVcZھT5|1eX$i|n.qQ/TW#uDdUk>M!g5@WUX J dIw*XJ_ ppr%vWzSomQ EރR&fhRQh)x\o`Ny?y; E|6& I0q2H=K؋EX4Y&N=A m4.k޺#Ebrj荮}|N `0>OP"'@zeaϽ}p}2d5^r?ߊ*1i&sݐ' endstream endobj 79 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 93 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> 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 97 0 obj << /Length1 2476 /Length2 18715 /Length3 0 /Length 20147 /Filter /FlateDecode >> stream xڌt Ƕf6ɎmFc۶FFMغo{Gsag$ BF6@1kGFf^ +BB h`fcG=P&'kc rX8yYx< ;dR6@8 a[7{3S2 6pڛ[dMV -6f@G7utebrqqaԷr`79@{g/9}+?(*fؕm]큀w!=hx/P 'oo,,7/"3뿓 ml̬Mf@ #=@@}K|}g}3K}OR W_yﲨ d-m\=fF0reR6sJnm3:8x@;Д/z7[N o ?4bQw9T? mM7~. Kߕs~SdJ@uٯx,'LkbU_/ d,d{#bw&N5X[tPo OV 4T1z awS(Qf/&SZrWHDJf]g5 m͊I#"%s}PLJgI~- RB^ޣ&%`ο֒@sh]Q xb}3iezP17biSx@kLy;;M'z-;"x>/+ؿ+Y/M5Re#P5_, yR]%:0sG[ z?UVzi7zⴣ䛐+x>6ɚ 82A9Rȩˢ(iVtUF &09Ij\:;Y7R|pr=_i z =BU '6FK,|8gL8!.o6~ώ%"rVN۱PQnA:o[,$DCЇ;wH %OtYPϋh)9\;w$5^#치-#;7̟zY3T3t^u"QPEyubsgci)[/lw\9D91:/uǣ-utƽVx>Mo6`?ֶA4{Ȇ'bl*`RnK,`JofOVZi誜ZSm\#] G'޳ C SF=`osΊLPsʢf)GYfIu=xȊ܄.l&|FP-kl`'ZY_Tnz8wR"(?P)]Gπd,ʖY{ɼЁ'ʿ62} 8͞eon(C 1>B^YFV(DŽKR+T')'򏏎Qvۣ1ؕ5DΉXx@-˅W|A9 QazQj-u91pYЪ 4QWjg#sr(-1|<"as \G|-uhj0^vȸ :{!Bي4Zw QRŇH UfA6:z[5/\'͘.2ajFA !4fQ!G t\ [p@r6ߌ+P`uG^'07 9Nr>2A< * o /ێX=$,#:g#]tKMq«7֨GJ'U~+G5ZxCk?|)B#QxsBh͌9BCҔ!O6ޗd)!0gO5D)% 3|7$?.pᚵd7&Sӽ/EQ4d ֐ KbRu63%b=c¬XE_JA0r^ZO(X߇&C{ T.:erJYM蟄?<("'85HLȬB$4ZN!+ :jÊ˿^ ZK0؋ F*+٭y]HDL@<(2X'h텴4Vsg  hC8u<$!Mk Fv 8?i^ya,9mlSu׉qjHW,QGnl/ho_Sº IbqF6 }I@0{EUYGaIw!Õ3(1=@VuːS X8v[/3Qhuļ> (G2@=y'Y{͈s&PI/1@kQ}λF" ]G㡄D0BnUnfp)2} $+,~/ty6W7W?R`x~one ƖMvcxe{4MRAWoQ򠪚,kH00|x"I[4$곍sKx6j="y*3xg73 ^kks/7C`G|ZqxBɤNfE^['bͳ, 'ktwXkL_6qؐ;oĴeY*U%AaMYG`#ON-.)#yq)Z䳹.(fOCa!B3H_rS"1R~?n-rMCS䡻OOrEr5ֆqXxvfؒ_ALqà % g*=Y䥘Ї$"?>f*Ay k`77bX^9$9lK%J^69#P_v.4W=*=#! .-n b<\raκCff|g֧Ej6jTKj@%o+ cao<*ctPƇs̸lYe l{>(i~Xbd5?e{ez䎓' dhA52H 9`FýDf)Ki's;'Ȱk|qDPlK)?+0 |ݜn4-\92hRZonQoҕ8+avhūwp(댵)b|bZvq,;,wrG>N5A^cP@=L.֤E.6;l l X'|51 e3Dz}eզWJ_ *yA?j>zkyR.QqʷOf{q=,6z"y<!CdSɴ0+@vd0JNjnQ d$lO+YfHjR>}G~K߻/6oPs~&x'. - t>F+1"NyYD`JĽ0ZҪ+wa2Zf.T[6_zxj_Գ  ΙBB}u򵶊sl@Ml5>:^EC@ p.0j`X(A,sɢ@fYrn#wM̔:2*GB  f=܅kC>ɷ)/0m=.`,2,X( tqܧQÎhM̅\C >)WDϒ :Y-KW2)ׁ Ȏxi~YUb~b 0:&qrƈ;9)'/Ow@lIv.} 1A-9+H@6s23__>t| d{FL w1GRXYz&k kDjuWRn:`cDtIù :mf3 [O2|ɬ~`l׀.; #YgTHqװL]M^^.̧_0)Aэ`D 4P%ɓ(]oan> '*` }(l{QsE7w!$cg5}cvjzE$pnIlOɄxDR m} aND"LZ֛&c6m=[Yؕ iӛK Sdӓ~3Sv JPt\5L_jLLMc,uqǹre1R6 _p.DTO2{nسx(zZ\ @k.%“{@5zh,̇K0Fzy^9A OA<@ׅMWHy?E_tή4! @E!jԚ?9边-6K~i#6lb b%;wCfr-|LV }G";`ҭ~D+,">UjQ鱣Ы?o=@d-5>Oyf$Бdf^a J6$JO1kn}8b^*h"i9yCGqo& >GQʜ@i ̄d<$`CE"#e:+9úѼA+OcxwDUn[ʙ)T{ &I]˕-$)Ϯ~\ Ԑg?dɭ<\ÆA&gV xsƶ;^~ Ht-+.H> ˦-نB|H'̀\i-ZVMYKT5E R÷NBp`ݗ*>uXvF(QagKkDX UESZ$n BZ{X7]Rbѭ7㜣wQ;δQm -kSh/"<-y;H$ufwX)dPs nKB}$@6&!e'_QW#3˚_$IT} z=ވaJgKI3bk H㈅P6iR`H32sVV|ŁEIivuzFZt:ᚔЏh%tVsH7)#kPB?}IYR|*2f,A܉^0Ne=y cw71WBן%M'#F4بWr=Ԝ);#r֮a9+;u( p^ľeF)Ezm"7o ż+hu 5~XUJB#{m2ļ,Ǽ$9/Դ+vh6 &Jjnˤ Skyg^&hDyĦH{S F }Vtѹ; EwdE󥐖* `mE)V}Tj6%"x_ǁ^6sEta>'-O<"Z6VTiP0zãYq%spt-w\Q藃rՓR[bxa傺(ӸmbBFd&.n$FcXБɆy%5η qסkbёWLUͷ(X LGT p}w P?e2gRV$@ -|!s#W~⯜[l4'Mi(/WyT+'e}F Ԙ0FMn cm/:z̭U}hnIQ,ȯ+3 c5`xVA{T4KÝ ~\]4r!mgYʴկ%Y䉾ۯI7X3uJ~uk!g8E;C2:{O-b05@8 a9Tx#OR*AǵtW4 BXskʼn:wh;FݴKŸY-1AAn]~n波B:` J`&rsIGuҪKF/SD)Ji$a O9BDT7o?HIY_i܀^Qx,AlAA JY-(\WĒ.'ITŴ)G;\ CD5vUēCy;uS:) z^pOT59Ȳm~{O#W9YSZ eЁhWnDL+^ FHsxM^;tz|>BjH36].6 Fɜt#Oe <ƻ AkӑBG72![gVd]\9lN>m TM<pY ڣ~p+H'~0"ݢO)mpf/+Ǎc ~ft0zIQt й0+_5'"h 5ɞ7d%M@vBwlgO gG RJHPYQY2mKP[5b,i4a @;ߥa-6M‰\0#KaǾҾ-tG b!/e%x~wH. Ew1w!'`oqK /7yΨ┹lة~p:;M +z ~w֬MaLe `bPv%pOBYD.u\ke` VxRFO"\?f2$ #lhd 8VWY7yZa҅&TMͲ։xa[0wO#2 VM(Zl.NNx,Q6.i qJlW=X.]~#U(x:I,pj+h91Js&_'IQ8RF~?"\AҳM3ZycB`_h{m`|AgVUC=% i7 WU`BڴvZYΡ+& #~Um܂kb::}VB*9~񭖺;!ߢURޏ- bw5&gXb\q)ԳLC9`x'z0//ևܧ0DŔ#.8ZIxS̑g,mŸT< W(>8nɳVKHWCG[j4ϙZAGz ǩNsx#eĜ T>!_d|5xDx1Ҵ)8"Mi<3%sҨE`ZU] ILCGIjOs }l =i5U fA&eW3`L i#YYmhOFM/!Ѹdq}\fьZMbTy緣<נ*~M`$N$X{iƂԁ!W *}|cW5 jnlGu.,dzM׬$7͏XML嫏-C <=ϰ{WB$ފe bU?CG\]Z離A@^L -@(ĈDMXu*rv. ֋ _*^R רAѫUAn<4&9to$jXP(oL۹^S<4+՞۝ӘM'.R4B~A/뗌7{Xr<"2>'177&ʾq5G-bڻOmA ֻʬNXbȰO:SEB·r7oU)bo1no]ێ`}|݈kEsF Wu5'*[ "CVx6D1oԭ?s#ڍ_?7NYժf6XlXb}lן@˷>l2Š4zvHyyX)4jI/bYYZW=_e{ÍE&:QA>4]9}%_4rETF:"YJcmJzU0q@wSk8hc6F"K)5)6[;iO 5+B}>= 1"lʂኘo r<ֳFdS1&e'sZtxVnÿڸ`QuoeΧ^ΌVAߙ>{/]]|Š\[/|e4VmRgx-%>{ MjR`Fް S,kkQD1I韯/ST^o5o y fKf\x]ǑaAG(nwq;W VZk?o)(\](^fn!Er`jawA{}6aiI]Gy tiI'c4ˏU9%v?Ճq;ˆ='(\AZgˠ't!⧃h`=Aǝmj_4V=Kd'SM*@Ϛ" "q3isјmљ´4V, Ľφ3,FAm  蹣Aȿ$Qt͐AV8Ϝ"ZsUroEØgФj-hT6ɗo{ΡTS:cHïet|>Z+L͖J=Ж`-y'Н$[p>3j\Njʵi@0UsRJhs{\YZB2M{Uio8',1"zƢV\BԽ b=gﮃy_VhV ?&GP V)*zш^,w l2b מ:& c/i'3}Jԡߏ@-J*Bd|ocd$_ YHaw_ƕ1Ӌ[ v)~;՜_: Qaӓ*- ALWVɘ*ssi:4hY3"ݱ p*3jōXޔyܳ9[}FxM~ÖBfELh4m =KQ/JѠ΄;>`G!n%߉XxR8j3?ۙ  =B{mfqVFR [rƒB:qD.YlP.Hr oxJ-RF9]+y?WcNh< bY~JBKbNߤd@X{VѠ3`yvn[5ͅW-.uK`탠ZHx-Q N꺢k;6zYMG7lc[wzAdB:ul_pnC(0{Ìy[鸵~2Y;;#|ܕ#G̈3[kC xl%HsڛWpAb~T͟%01}}CVW5ɖ, YeiA}j˟j&OTb';3'BВm`1? χF>fl'7|ӶX|s8v?ttg8g@P>oIL=Opq=6ݗ+i/xmqX@x 1{{1FNai]j2<#/uވo+.S3ZwsL2|RCR*oȻR-Dp;U f=7ydz2P(E-dbK3/kvFZ+T$(Kѡ& V(_TpTb5%1j-n2ΟA'-PwM!;<}t$Q[xsjq)O.%v jӖ#(M4wV t7#ߎdnC e ٿcIūL ,{4wG<bQEE6{b7tnTstj q;If6^_DCrh 5BWF[k޿Yj{W::w!CINː)%k]N脳F-E!ɏc ;y]TًlE.>'l/%R'[5^(>;f~ozr~P#, g>dڿxs%T".Wէ7@}ܮl.IgXbZ)!kJ'x4˘m1ͩ+m^gjg|XRׇvA(m8q&kiP&oh]0 MO6̉{$F>Gi׫ڙ&_B4:R%J` [ǒ=jC%xmkZ"lՉN ;Jo}Uz&=ψA5T"">94g| ]*I; kΐ()\| :FI|778>դ.Τ̈ iɤ>h:wZh6Ư^XAxi$UAҨlB)Hkͯ%+et6ha(yO=los?{lt;JBo$ms--Xn$6~=FPsG Ų a/3k v.&Խ^N LK[Ek 1+].LTA.QxmnHq[H,~ 8`8C&F XK{i:FVFGR-7uzoU5fԥE$ϯyt Y=d!SQt2H-nD_"4ԾUANJbݾ"RRLkPd`6֫@\s4~\wkR{}7T%Ӫ \amqT+%ByIXB}y_<g}0?coiXHPqm_lj9)x١T]k lzD"`p@AK;Zu*hrTƎȨ_YJ {⤱dGu焕w>o- 񤩉h:YLd x6UR8nˏ\OjdXoK̨7ǐ/a<9EbM`ElUGT[Po^qbR;E m/Fo6rr6+ĺ?p>4өSg߉#k-EdT>(S:a$>XSIŁKϬ_;P5JaV@c)Ks:YFjop 1_MzӇCr^|N*)G3"sB軫su6n4]UdV <8u=N&o2i77YCL%ψ(ѭxλgWt_3gB%*meWY /VB,pS;^GhR_]\:T;l{Y=R2B$(u*&Rh7un n]u- A.( oS 5%aZ! *}jy{5w?$@ؖ{d6Tz3H{zSٴr@׏j\ /?`>f ]kk\N+r+ %vL+b`abAvGM#ACeroe C}cLGùj&٩Iy橽i)S-KqmFE2bj̺y_6+8+SR:"Bqi8&- MVøe=@bq}[,N&)Bsʵ=mġ&):;Ļ]:_aH(\RkW dSȞ|m^а ->5ra@8^ =uU|2BD+kG Y5k r'>,'[:j65hOZ7U ү0ȉ&so@պ/o[C1EM,2Džy3횯yfCrxҬiQu7 zMa")7Vj>HmOŦC%HN+ô45eRFTCYL17a:r%| !E΅$uT3|:xi :}aM,bAe]`J龂ӫ‹2$nu+)cP*a{K.ݮ ?5^I~Dk>ei8C|Zj8ȺH:8%Q+0'ϰcP]ԯXmKvRqQia}ҫ7yS;|ly{.,PyNRY5*ɝ;1Iy1ۀ1Xoyd tc\2&'dj~->Z/UV16=O_ ԼM™ =\vb~vgQ{P(IWh:^%Zԍ&k{CuY>Ez'g @t{̍G}@ %"޵k>s$nJ 鵃/]0G"t!flp9Q*3^ VM3MdMkYך;<ԃaQb2H1gpAܻFՖ!tYp*d-fe=MeWGy(0®wZ_rz %K%V5wJ\5,7zwb&*SX8'QVтq9H6h< v4@F\ۡ}H=(ޔ., )&}ߣ y w}tX|lJq.pZ'{ZDȝ4e;־C~2%i>+. OR>)_䪿ɑS"4 ? T`^=#?Q Vguy=-X# -!ǂ']ܙ̑ҿv :6,dKFX2;1/*X;ob[$Sy.q1:츿ǐsL81 endstream endobj 99 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 101 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 103 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 105 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 107 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> 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> 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> 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(,!dCxH9lHXfg:.YGR{7i?pl~.go;ȟg~%7$c: d0uS+&8m9(rU tj=ߒI\C/R/~ KM'f8!]VɈ~/-/Du_zt617cs6kF.H~~_ zv6EtCQ3etzqJ3{cT7"V*?9SaNMv!۬ G '*TewFBQ5jxTo}/ߦҴ0AΦѥq#{ҳܹ㗾V;}0Zi 3mBoZ~{g4+}̥p{-n6$umrX]'O)o6k3tjH'Ó_Y7V*Oٳ_džpߜ Z3RH9N{;X8̛E䫯xuIV21eۥxt^t4GïKZɀLx&xQkh$ꘑ={IݼdC)nKjR`ŭ\ ]3U~Mr ͠@}moORH>te[P){s2UE/6E>]HB^yu)3U'"b$ BQ?3R0$(T`3q&[4T <8>o`C(Y2ɨ>}аg&G5=oFpu;muV=! Hiu2g}ÜJicM$FsSשs6.Cm!Esd_>)k @OjJU^ :0&zU׬1)!$n {$IWhcJEQtk #:, fQ~Cu J*DH @)ӹtr'qhn6KHZ4CZ`zre&E3fH\LeY%sC~yo+ ksw*1K/F6Ey$+iGbE-vmE9PuFNnt&ד]+Nt}Q,Y}BSPD*W;"\ Q_KBTdKj%?i[-be]]ܟ{!a>#1g0;IfDU4l·FpG 0iv,.sِZ)MơilВpm wPĜ=&s;WM~9J vѦ*$1s& ;?f[ ȆkiFeZ|Pu" t܃~ZX&]bywI[̡qw+g&vM}8mơ 5vh xԵ84"bdeY|}-W#$#xF䏛n-ƺTw5Uod,(af}Fzӹ)7,g}5ȗu#ZtO3[)LTPJ6s%%%5t*^햘N82UvkD6mƋ}”֮Cɥr*r!sڙ|Hg>ETo'X0"r"IσSNypB:$Fw!@"1iC6)z~6QTxmneMޢ\ 2so ~jh <}N_̥<ŖdJ=DbB/D-`/JWz H"% ;Ӵ;cA'~t NDL`-J zsTm#=.aƵxn׳e'+`f%S2훷<Ҵ@5z d`׾cT񗲦)QULrf(>/;uw F}ՈȗP@Wإv jt&Er`Z(^j?t ǗfxC^zT9aK<)hacP?, =hfz*yɠ'<)&V XBBINw!LIaI(8 wY] *9XύbcÉ D f=5/3&1p@qG5y gB7T h,sRG(Fw-t(3-O1d&fߠfƛ R߆. bsqlj&;Su(R>#a!]XgȤ՗{!7ڱ-fn_dHq6r׋fh vzW dG5ܿ9˳ /]{KMN 8~ ]"2Fbo`d/r^QODYZ $ɈxZ ~/fdABJizziDSwª 1?ᷯBf D.]W imZDT~L'⤕=uvO8VIc*e7 vQ/^,!ݜR(Wd/NP0Xŏm0 T4FJ8dTٞ}% ;xzHzVVߒ@aN91H{[~//9^x$70E[&g WAj\S\a\"0שOY@ö-m9M{9W)~qIg`'O>}cX(k ~STf ( 2#D m/K=4e^"ٖ< )8tγ#%Uj8yp xu0<]02] 7M8nn޴ ;"(7^f AhQ<^'2|M6SZA]^K)lGY$gNr^/)-dFc giq!Mq 6U6Q/?0v=QvK_e2ט8&=S?$7Q|Y;]Ѹ[ xlOqIQYг2S fx2Ң82fW?mRDU 0l[.8аSx =X0oG(ub P=O!dHq֮Q=8Qu1yǩR۴!Yl>"z`)5I)+k4r7odD [\& 55;?5~B!Tl˄sT 獤 U I{'4fnQq= 2p"C͇',Ę͂Z^/xd8aEwe f.,j%&g$^>VVjv~ZG<@ Mh30F VYl- ů3  0\nvFV{2' "_U47"ԡ{>AդkU jڒc^E(ϐ;2gǰxed} {v8pCZ *Pkpey=XCcfF\sC{13ա7FOp .ޠbP?a_9э%-&V`jJ{Fvses 闏Vwş.^2bSzBoٍ0%j9-jl/ z/Ds=!K!i; $@CV.JzP/=3BH;ۃ#@uFah#ҳuwtT!74φ{zy=~$2 pEо~(N]j4S*EiG~FT7w?=ްd9t}ӖDnY4)qMy8HиsDd2W6G~X{ڀ޶{lF^RQ<~2깄{9:֪ y0+F2  'PL: 1!n<O"6YUFd iI~jiTIZe7n78-9HZ-;I!mz#N6qB_ sZRIU Mۏ],3a)/:ЎW}̪1wy_.r 6~3`@֊{,Uܑ4uG= v.ʿj]b9̙rFZx4AApұ̺L9+lhdro.K) O$N3^~|[<5"3ަU<[)ϊd::;d Q_grb\zTHռėzDuM3>7'hBk/tWrUEGҢA<]T]?h@:7[H""(#;B;NJlgA'J}bi#}SgCOh74x_c괦3`ř.|믜uyAMA@nOq!A a- aC0ىpGqs2gG U6Dc=EuiO;Ó_֓|bՅ5rye,{2f>x2';W(lVKJV nuʷNO"m}*q Ag; M>R5IM7FDĴs^A*w/W[E %C<lsJ*svzF|ʒh=ڷﱈzD<>cDӯm3:iݴȵ:$: M+20tnj "Oy]<'2 c{m3=㗊gZqXL1Kt6lW=̪<6 +`ykҟ@Fwlޚȣve||C<(r6Cv:#ǷȤ[*=#E`4O $Ϣ3KGGwER\s:P݈c0[ ZW RxJ^h)R9 K0~Ϟ%\YY;,#KZ";υJ-m`Ⲵ[4ZG z7 T-8:C!z# s@ O?7\v` <zIfƈ{wo9(8j߁~ocDxKǀu{HX4c\ES3u>qW+&=FQ >YIO߳O%m 1E5s^ !n׶m7f|(5T+gN*qIAp{uLTIuI,/Ocϩ $uXJRpFv[ P<HA;baE& 0"3C'(?0WaʖO^%rEqOi[)7*S1If(0Z3ǀq;q;^H9FP!(fdPaý ogV]`3\(&STJxNȐ(R+*@ @x &?08wu~v\h#,.%⥸S׳ Ӻ[q>ckr%$ǧ$RX!5WCLMJSQCƽt|?]٬V?PY%MdLÛbpƣf*iVune7X=.Tm noAe "BRx+QBʖ6sؼjp#R*Ol#Fkfǧ]cGǎՑaRp:*\.Z1Gn9 /=%䍩$It:|jg̽N(% _0.bAv:V\=l4'ki;[. <0?mG$8v#2`I˽/src3hV Diay"BzU3 zX8zele ֜Ԟax+q-3(i  5:ְ!ӚpDf@>qSa8>JElvԏFW$FQ( ~a02` omc6:Meٝ%>X ݬ<뫩r3LE+Us~l.Cm~dd:~L]SyW77pHg@Y{Bwk4|1&?IB5Gq]ɕkx|TU*~p#z,GqT1Zʳv ,z S5UO.bgDbY>Υ @|޽QC: tݾ:xXGs>;LV;ł /,&tIC!c\ec18 ~ڼ'`:'i-p/$l?YcǗG q 5cĊ;ӆI`yYunQ2GQzrFL& 9lC4#;DB'+$@U ݋ ( KC[Ähm^)MbG铰/uaj#Pj#:8k0m5uŅcbϺv,kGTKUT:!ɥ W {t;x緣C2z=IE7BݬùAULXk$@D^,(.#J[Fy8MIi:Q]q?H}}#Kq 7eN_aY o~f`%(a'( kq ?LT f:ZE-xQ1g& UπbgW){qfhfj֓UWg?2VsuwaJ_"2v˘yȄrҳqT޸]$ƼHXr CHaa¡/uۦTT$PԔ`3~$"RdHsl,kͬ#ioFpCW~β:X.YxksL\7eW%NR+eIz.ˍ;Tސ,f&sRٍڪaXŤfw-xvE?'%Sy tOj׃93/*qdE8jұ d4COYzOfX4JQkOsi+@"2p}˪+rq#!?>lژMFqKNg5]TX7T}#8{ (eӼV Uh)J`}6[eH>n@b6_!я#$S;ir8x+sһR7*$eL'/yAn =2q1Fo?> stream xZ[o8~cEMN4mv{44"$:ǖ{_!Xc7N> P$ux.9<$- 1T,ӆ  (̈́g23IzR2у2eA 8jC3%Sgfiȶi|fk03 F+6fˑ 2d=A:CAC ͵#L a*X 2x2{e +)2˜fRB5g 450sD <L  =z9Py'h!R x *)b \`e^0F'HL`A3c AL0*"_`QD!3` Xqh z,Ҟ  H+˂*Ƒ&WC6Fr!@;vQ'hl"ߤ"@)Cu`z e18∿h5AD m4f%HD +={ /Ӓdޓq5-/og-LĻk9dG4]~]̪|ZYux0FMO||Ymp;l&fm9A>-li0ȫ/Wv@S99%v'|X\}'QU IrB$}=*'Op4'd׏ i~9&0w?{'9ǃ1 {]>a>D{^`>f谈ME IAv|>2EO柪~U?-FɏGɰbr}l+uiY3)@˺* zԊ48;fSx>]#>o0@CG HD?`N(h!2h=u(ՑŐz Ȝ&[+JZNkX].U$ Ji9<9b[b'hLq%(qLhc:d?䦌K,k:vKO`kM[-lqз4-}u!hAO4ғu2=ŵ^6l;c~d';I`iG"lu0iGO|/-.J#t~q+s=rמ 'ZbXV2{duɰ:u#? SAUPp>lc"kC[-i="T%vtJ KF4KKd_eqeRVqLYbDuE:eE)TEm}b}ql]Ya $Dg(zihր 2HV]eT_R^#fI((86^6$yWTRI-i2Nz'vRKX1^SBq!PGZѴ}.#x}McgӐucachWo) 8/[HHj*wwZbіR%F 3[?E7j%mz u/⻄PǒeTbyu" ) ʂ.Jޓȏ?v$mY[RTּ$6 ?S.ZoKNe!+-P[ĕq)8䗂FE*e8RCȚy3{0 nז-bܱ5HKm> 8*[8M廤nB@c/o0ɴGk'Sh:d4A,N FSH7z Vs,::xBcIuFӬK$ߢǦCH={ i47dk7F. څᴘT4 n{;/FӉb/+4}3tݝ ta(yq}8SA/G9p?g?a7)]_ć<+~U|@#~|\s^O/ϊo4yswy y@Z޼?;ZDv?X:#h[, l+%X ?h}5bvqT 2~8U=mP9?{}EDeM! PZPv9D5"@okN{tT5Vr@,EZm8R__3nOn`w~:y*զ!@'5/(.6R5mpNPɧeˋn/uY[Eb;hYEƋF550l(<_[vm<<=ٹL)LnESBNlZ#29go_>G5^_cΜ2}ZN^K۰HEԼHJٶixP=$Kddٰ(bt#|yȱ.U?]7=9`9i4 4 Q>mo&tԿ0dm~rZܙ[DSZ 7AuӶkxrikMfV9~Yfm y!hm{?:g<>y4j]U U.|oȠCaOeΎ &.i[ŗG/&JitNM۴JY񰱿?=6 WLW[N񀰚Ś#O#=|Ă,U>Z $J|{,6܄Yʛ@nb,bq?8)m,Oӓj0v&;rY;̥-O&,DU6khs*n#vAuU-fv>mwzl7.=vRtTj!A/# endstream endobj 125 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.13)/Keywords() /CreationDate (D:20140226004203+01'00') /ModDate (D:20140226004203+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012/Debian) kpathsea version 6.1.0) >> endobj 121 0 obj << /Type /ObjStm /N 4 /First 30 /Length 211 /Filter /FlateDecode >> stream xmK 0{M71mDo>q Vl<]S+F<-|b@!ISfJpR_L Nmrg׏y6A DIDA!J !"!d|n/hOقT-_ rU:}ss&٫ p:1'C%^Www%Ĵ!M]<Ua6lWSzY &Xi endstream endobj 126 0 obj << /Type /XRef /Index [0 127] /Size 127 /W [1 3 1] /Root 124 0 R /Info 125 0 R /ID [<4805611CA55241FFDEE185C2740D4D83> <4805611CA55241FFDEE185C2740D4D83>] /Length 309 /Filter /FlateDecode >> stream x.qs>CRXUsQSfj[ص hbiZZZJ]{ }'ߛ/9""#DKPp. r! SpC!t@ Bp%P a8xa P"JM؀]XC؆=X-H@3ԩ_z؇hh.4 */6 [? 0@Fa a&a 0WfTV1Y79ՠj^5ZPMUﬖTV˪կUu|!8$ Y2ٓZf8 Q'6*~ endstream endobj startxref 150883 %%EOF doParallel/inst/unitTests/0000755000176000001440000000000012303222161015330 5ustar ripleyusersdoParallel/inst/unitTests/options.R0000644000176000001440000000455412277005521017167 0ustar ripleyuserstest.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") }doParallel/inst/unitTests/runTestSuite.sh0000644000176000001440000000160012210726132020343 0ustar ripleyusers#!/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/tests/0000755000176000001440000000000012303222161013513 5ustar ripleyusersdoParallel/tests/doRUnit.R0000644000176000001440000000535212277005521015240 0ustar ripleyusers## unit tests will not be done if RUnit is not available if(require("RUnit", quietly=TRUE)) { ## --- Setup --- pkg <- "doParallel" # <-- Change to package name! if(Sys.getenv("RCMDCHECK") == "FALSE") { ## Path to unit tests for standalone running under Makefile (not R CMD check) ## PKG/tests/../inst/unitTests path <- file.path(getwd(), "..", "inst", "unitTests") } else { ## Path to unit tests for R CMD check ## PKG.Rcheck/tests/../PKG/unitTests path <- system.file(package=pkg, "unitTests") } cat("\nRunning unit tests\n") print(list(pkg=pkg, getwd=getwd(), pathToUnitTests=path)) library(package=pkg, character.only=TRUE) ################################################################ ## BEGIN PACKAGE SPECIFIC CONFIGURATION # ################################################################ registerDoParallel(2) ################################################################ ## END PACKAGE SPECIFIC CONFIGURATION # ################################################################ ## If desired, load the name space to allow testing of private functions ## if (is.element(pkg, loadedNamespaces())) ## attach(loadNamespace(pkg), name=paste("namespace", pkg, sep=":"), pos=3) ## ## or simply call PKG:::myPrivateFunction() in tests ## --- Testing --- ## Define tests testSuite <- defineTestSuite(name=paste(pkg, "unit testing"), dirs=path, testFileRegexp = "^options\\.R$") ## Run tests <- runTestSuite(testSuite) ## Default report name pathReport <- file.path(path, "report") ## Report to stdout and text files cat("------------------- UNIT TEST SUMMARY ---------------------\n\n") printTextProtocol(tests, showDetails=FALSE) printTextProtocol(tests, showDetails=FALSE, fileName=paste(pathReport, "Summary.txt", sep="")) printTextProtocol(tests, showDetails=TRUE, fileName=paste(pathReport, ".txt", sep="")) ## Report to HTML file printHTMLProtocol(tests, fileName=paste(pathReport, ".html", sep="")) # printHTMLProtocol(tests, fileName=file.path(dirname(dirname(getwd())),pkg,"gsDesign-RUnit-Test-Summary.html")) #paste(pathReport, ".html", sep="")) ## Return stop() to cause R CMD check stop in case of ## - failures i.e. FALSE to unit tests or ## - errors i.e. R errors tmp <- getErrors(tests) if(tmp$nFail > 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/NAMESPACE0000644000176000001440000000015312232550533013577 0ustar ripleyusersexport(registerDoParallel) export(stopImplicitCluster) import(foreach) import(iterators) import(parallel) doParallel/demo/0000755000176000001440000000000012303222161013275 5ustar ripleyusersdoParallel/demo/sincParallel.R0000644000176000001440000000170011664512336016046 0ustar ripleyuserslibrary(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/demo/00Index0000644000176000001440000000006611667450313014447 0ustar ripleyuserssincParallel computation of the sinc function doParallel/NEWS0000644000176000001440000000200712303167501013055 0ustar ripleyusersNEWS/ChangeLog for doParallel ----------------------------- 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/0000755000176000001440000000000012303222161012552 5ustar ripleyusersdoParallel/R/doParallel.R0000644000176000001440000003746612277005521015005 0ustar ripleyusers# # 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) 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(.revoDoParCluster)) { stopCluster(.revoDoParCluster) remove(".revoDoParCluster", where=.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) getexports(expr, exportenv, envir, bad=noexport) 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 if (! preschedule) { # send exports to workers r <- clusterCall(cl, workerInit, c.expr, exportenv, pkgname, obj$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, obj$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.R0000644000176000001440000000007712210726132013542 0ustar ripleyusers".onUnload" <- function(libpath) { stopImplicitCluster() } doParallel/vignettes/0000755000176000001440000000000012303225114014362 5ustar ripleyusersdoParallel/vignettes/gettingstartedParallel.Rnw0000644000176000001440000003167012303167501021573 0ustar ripleyusers% \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 \\ doc@revolutionanalytics.com} \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/MD50000644000176000001440000000176212304163234012675 0ustar ripleyusersb93dfdfbe44ac5e5833e09474285596f *DESCRIPTION 2487a1cceab205db3fd402409a00bf27 *NAMESPACE 3e9097f524dd2641cbfbb6b8bd1874c9 *NEWS 2453e843052f7f3d0e7e4f1c3857f052 *R/doParallel.R 86f0e4745e79399332a21f661de57bbb *R/zzz.R fe60b5a44e1d854ca36cce0d4f90ebcc *build/vignette.rds ad6e7aeda54fa895a60fd8c0c92a39bf *demo/00Index acd97a961dc67743d9ae85b28aa8fec1 *demo/sincParallel.R d1d107a8aed2c92fe6efa71cbc691831 *inst/doc/gettingstartedParallel.R bf3cfed8a81605cf697c7e1e95bd856c *inst/doc/gettingstartedParallel.Rnw 93dd5233c6ba1c1d5f3d382cbabf3502 *inst/doc/gettingstartedParallel.pdf 0a17c88eb4ddb5c75a71bd940627f1b1 *inst/examples/bootParallel.R f2621d4a791a20471698dfe4ceb351eb *inst/unitTests/options.R 59ecbac80339ba8a55adc7ec51ced837 *inst/unitTests/runTestSuite.sh 127e4697324d014bdf67e3e3c9ddf80f *man/doParallel-package.Rd 8f2ff4e8944398c34a7add4667cec738 *man/registerDoParallel.Rd 8a0378f6fce59830532f2880723693f0 *tests/doRUnit.R bf3cfed8a81605cf697c7e1e95bd856c *vignettes/gettingstartedParallel.Rnw doParallel/build/0000755000176000001440000000000012303225115013452 5ustar ripleyusersdoParallel/build/vignette.rds0000644000176000001440000000035212303225115016011 0ustar ripleyusers; 0ǯ_ApB?"zb*iիj# \dO?`7i =Y}nXK4x +R+T=Z$3ßIN2qѯrk;?@4)wΔNey}u"BnsZ`O&꼛Ծr:{ʭ+~Ɋ_͍Na6I'ew doParallel/DESCRIPTION0000644000176000001440000000132312304163234014064 0ustar ripleyusersPackage: doParallel Type: Package Title: Foreach parallel adaptor for the parallel package Version: 1.0.8 Author: Revolution Analytics, Steve Weston Maintainer: Revolution Analytics 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 Enhances: compiler, RUnit License: GPL-2 Repository: CRAN Repository/R-Forge/Project: doparallel Repository/R-Forge/Revision: 13 Repository/R-Forge/DateTimeStamp: 2014-02-25 19:30:09 Date/Publication: 2014-02-28 20:42:20 Packaged: 2014-02-25 23:42:05 UTC; rforge NeedsCompilation: no doParallel/man/0000755000176000001440000000000012303222161013124 5ustar ripleyusersdoParallel/man/doParallel-package.Rd0000644000176000001440000000264311667450313017106 0ustar ripleyusers\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.Rd0000644000176000001440000000532212277005521017212 0ustar ripleyusers\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}