doMC/0000755000176000001440000000000012254240622011123 5ustar ripleyusersdoMC/inst/0000755000176000001440000000000012242610172012076 5ustar ripleyusersdoMC/inst/examples/0000755000176000001440000000000012242607506013723 5ustar ripleyusersdoMC/inst/examples/bootMC.R0000644000176000001440000000142411472541377015241 0ustar ripleyuserslibrary(doMC) registerDoMC() 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] cat(sprintf('Parallel time using doMC on %d workers: %f\n', getDoParWorkers(), ptime)) 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] cat(sprintf('Sequential time: %f\n', stime)) cat(sprintf('Speed up for %d workers: %f\n', getDoParWorkers(), round(stime / ptime, digits=2))) doMC/inst/doc/0000755000176000001440000000000012242610172012643 5ustar ripleyusersdoMC/inst/doc/gettingstartedMC.pdf0000644000176000001440000041455212242610172016621 0ustar ripleyusers%PDF-1.5 % 40 0 obj << /Length 2590 /Filter /FlateDecode >> stream xڥY[oF~(\xibdċ`d[%:7~m8Cvl\9+zg#?]ˋժ,m1W0Uʖ~v_Moww=_8OO_6~YK /?{xc,n\3+-rJ'BTx_gkΖ繇~/'p7XV)c`T/gfns͑mh7o貇vK94 e گ-nDVvI;$L om5 ?hK"vר(Hu*x\S% D'~~z:̽ ΋"k锅ǦI SVaM^->#dW---GY2uJ[:85)㪼T)ǜ^mat /FҼY bBhzMKW pX|Y6r%Jȵ%?Iipi~0* jZ|4c׊J(K@U^ǑtbI ZU @Wv@oVI>RS#-Ű\5z2w*gqK1(!l-,O)mWml[˦a{$m Dvaf=XS/\T 1lPSMn<%'&r-3Ednu1$2WE-\V^·mKM(' \f]S& a2X?sKUmi\X&kUc*.+>5^y68`SV$&.d$uRy"u\uBAE?CY{pL]T ڪc@^j}Mݯ#7e*1.pO2 ɺr8}~^q|ٸ*ִ1F  J7<2bMV4Bj"PuH& [ xzxr#Y(P(IW xrR`e01)RG0ZeyC{8Qa`9 As"&+p(Wx>|m5hJIVhld &wa1ޫ ~c}5bR9 m$&.n:QcT]q.Tl9 n9*) <\ DlRskSgW4c{8N~ĥPI(9!yTb~NG'Ǵ9s$~w>ʫd^֜Sk;6J/7iQ :{ѐ:AzSEʱ{<w? endstream endobj 57 0 obj << /Length 2426 /Filter /FlateDecode >> stream xڥY[~_"33%@ I8@4ޢ-?j%]P˵΃!9W9KTpPYY'=AWQ.գȝ6#_QAw O¡5Fء&ȵwS tZ3"M&%djױfj~쮒EXr\x< g۱a\u.auɀYiϐ:& )45[ TmR$| ̚9.c12;>h4/r2j:'9z>FiANҥj^Y tk}0y2\3I_cݘr6QoI#/WFrؾl9B7w߯&/Ag!XB5j Y0Y⦆P*~ib*0 1vGޠך0/'jG4%uuT Y *(83I,\KBo% ڦTSpGrp++s˒m8l8|`zVzM֨<Ϗ"$J={^Cn|-G styKD̴8״g}s!'SswqIX{ y9:˂e~rEdG?CV;8GL(s69W@e.cIQv@l}/T ILFqxeUAsnT7 ePަF#ڈ7Ws>&!# p>z~\MU21k@| hzxDH1JH 38%8$Wi`,pa0l"%&Y3` c!`ؾKs)ɤKۙ֎Ξ6lZ 8sm'Hțx+K-;?Ɇa[hO\E\Mf˜l;# ~ lpB(*IA- endstream endobj 63 0 obj << /Length 2051 /Filter /FlateDecode >> stream xYKoFW0>$N $H&s)ZYtDidͳ$_]YV}s <i xۣ؟v՛-=kT [ :;mj7ML PȪ#2fP@DK #H\}+vm'7\r,}x&bY lTyAi~#\۲ȸS1c_G!_p,yڟC=5 ,{sIZy.A[֒0uus5-8>i)ki`n1DwPlx A7>Iƛ n\.`Kj-6L3+(tOڶ _+|dIFup~92\To)ϵcTX4nb|;gr9:hcOSpA\&dx}:P"Q@]tP@ )R<*x- ޴,jI׀þ\/YoFܻfP놏yazx{Aٿ"~|[0NƻH*8Aad4.-u'x_\RwawK?,"#ttq(R2 +[gTy1Y4*c\ڿpV<"CEX@:{>O=T`8A_U%-Q_j ߩp!gEB|"9xeVFm('̕-qVrrtǨg:r5*7/j; 1̕)O[gOu >@z{8@cwq_d}=Ȣ(侊&M|.}Է& _^ S3_|)mm>RGPwͺC?5Z#;q_ɼTFSr⟑$sSzd޵ endstream endobj 68 0 obj << /Length 2408 /Filter /FlateDecode >> stream xڭYK@"n8C9VUN)&"ߧ+DZ$AOOO?i6IwW;&֚:]rI\ꍭeUUrN>.޵k~Gme9M;5ܞ[|. 8v%t_n>_YL,)mmHVd '"y$C\ɏWJMuI`VTޤ WP $H3N63YV0i/3Gg3&KWDy7wrl!Ͻqvₚ¥H_pEut;Qڑ'Ȅ ?^w pQ-&lHQ5T8cXrTXhcː"[µ{"]ŏaGq G;YPSEgUf2Ɍs/6Zfum\ vLYeq/eP^H`5#,q.a0( ds"?"ߊ#~tD/vbFv޶CZT;d'=5π&L$|8`@\pӤXV EoG~<5z I $)T?!̺)`'~(#iQmiYtT(*@Ä29ޭ+] " VsVyA;vvOZf.[MBѼ`hk+Fe/Y۱۟5a2pDV-BH(uyNgѺ1D@C2vͳ|x~prbf'2 $=#Apr7ɜ!ߪѺ̅9U"$GoK]1#G+2kySj=!u ^I圑mN$! :j4l"87ZB<$ͽ5%xC$ Ţ v]4\@LĖY(!N@ެ0k. zJL`/%N6酊#o(^<£MdE|sf ށs1 zoRJRi ؕDZlԇPJ,)҆ml^*\6y+fe^Xz;E"%$R}2ҙ/"-RcdoQK zM DUЋ+z-|\ϕ3FL Y( oI},ʟ<勝~:^#O ~fRtESn CD _M/ {LА"dvg$(3f(eE 7 dyP%ϖT7,=b9aK׃/==L[9%Yx^u>"X˥U' ֓ʯ  T3-<#EU0HN1us*7s*k~Z{q4{tͨTWP/WӳYėi1NfRwCFϵPzg%c EY/hV+ͬbD+=NE\Q gn|nM1TctYfn^kMe~Ct|ۄj2 .Do r:=5ޞLSI5jAI!@,Eq>/ f%9K%CC}0j.rYǖ‚tlO?Qnɱ~D1FW=dF`uPyK-Q%IYBʰљWSFx޶9 N*ĸtxHȊR 3_DBF7U0]3 N j7{ W5SJCegkhgyɇ(>^qvZ(YnF^Ik\!nE_Z[iV9tm*j.<|z[y1j i{;ۆL^JkFk+c/#—Ze:B_Ey]MR&jQ瘝6u @ō7k[o{#)JQe@!͈Nm05SA|n 9jYƐV! Te靖@krbHT/`ɡL4p%`E?5W$<#%JF2/TpwCu߳UKQs(_&> stream xXYoF~ׯ s')IڠZ@Q~PdJ,([,Ԣ7RFHFF?\ye(,GBytq]X,Y3'F'7~a[~ Oo='̇g2(qv:캾8zw12R (9e֥t5 (4*r2:6]%A9 ( in,W0'Ji߃< t1QP5x5%MĸH{5ci\  ~Թ` G+œ9 B j4y\=xl5`y8hq,1ܰ?^f}Q*62#^\j#sf*(tEygGǦ:lm[۴(==rūے<G)Qy:fYsD_ CtLW%%8 bPC8gOC:+4m gO 8I@G sD_&*jXgS^}5eA#ڀDisҶ)KNS='ysڛVI:#FqqCiY]a/͐]9h<EOh ILH"!3B4DDaB*0JhcV #k9V` T6ɒsUϣ c(ʯ4a)dV>g~xfFڶO2- K>K^^u I"w0Lp5S_I'aKƞ>t5\VטM e>m קG0*ъ޺,U9eB# /͹*Qp(^͋/ gE}'liGdE$Pp`f5)|_XJI!p)5gRfUhkSPN<]۝)eB٦yH~`-u;\5iEhyxCW;JD4hcoöI'I︆:I?t* tfjB;zlt[6K_3McQiކШ}65ף_IuB5PpJ|ϐ ol]oymhv-kb_$t/pڦD=p/QV}H3!/89P!kxIw:ͯ{n*AHu ?s ۫ܺ.o,ynkK?kV1&s AΕx֫s'<==/gE=cNKXE{uXs8{4 OA 6kwO6b&؛p\(iN7~s /?//n= endstream endobj 77 0 obj << /Length 916 /Filter /FlateDecode >> stream xڕVKs0W3FAfN2tЙ4jcScRcw_pL{H>}HZX}.>X[5[*;m25Yf u|* palaYvI`Z6xiia_V(yh'p~v=00 T>Q3ՉOռj*iT>NQ蘭ait<(6a }It"h?Lh ȵq0gh^Ř p=d,5]gZphՒYQc/")&-+L9I^UlNcw&7m1U_J.֝OQT]^vD 6~`/ڼ_#w&TkGY@'ǜ`?C`ˁ)eg̅gȚO=dϾ5!ɮXL;Ϣ<%A.cdhk o q1J&ÎfadMKJVΌ3(ŐN'><{:E96vZޮω#7?(Sz+2hw `cA4eDZ]a,}?LqHs$Qay.rSՖɨ]۝/9a2Jgej*LU"o rΛW3@jՔzI5}9ŠcnK)%^$5o-s-mWVI4SEf_4g^kx+xxA%SJA endstream endobj 89 0 obj << /Length1 1924 /Length2 12459 /Length3 0 /Length 13645 /Filter /FlateDecode >> stream xڍT #ŵNqwwmwEZ ŭ ŭK3gfֺwel}~RkJXBAPWVN6!>' VjV:! Ȥ/D@ pqpuH!6"J+urXY#)(9@ :T @;r ֮Bl@{6(# j A?JAƆJ жGzAb` rDh)(A!+9N6οe#ß@ # `C@5Ye6WOW"btB/?Sd%4 F?ܼYR jorpuA#?i3^ qQ# E  O k?h{9Tr!~A/>.@w o"TNN%`8E 3`2~?^?L%G̮& W+%%V^n+/'[_?w)UBʎ `(@?Etᅤ5  ##B_`g9x9,^8?/&f/3uSh2n/}Kg%vW | +qx,!‹s;HrrpYؾ\*./g RRjq@/Tp,%9@]_L/Pg?N.?.7_o$`F/^ ?Hn7bvKAi?/aY9b/`|/Kv/9_Rw|I7y|KKʒ%Ax}\柶3_xI/_rşןf6x?/}d:?xjSzS)A5*vK/g޹)"=xJ"q{iSR|砩)9AV 8Aط^r2VmmG'_ [&El'7L\r5ŋ3[|Jhœ1: hs3]YɑpN<.~d=S(~dFÝc{;\ILClHD3r}Euhy$.Jwu=THd&A }7b7io8Ws9.W.'a;ؘͩrх8 5pӚ2-Lrg[QXҢ 8%UoS[qtY'-9b#Dlbë!(j.J8bå*jB [Rd.=IcE:hD{= IO GaUK@ǜ%z _;#ن;f˧ȅU~SՉ:1LBNm0麲cNyx>D}3a&Ǡ;i|MaJB ۥH%\= U>az睠clߕF| uQtd|NsTiQC#Bg/Qo7ܥ;Wy![BpH-3#l'-< })&aH 6KUZJZ-3٠4!Jho"@(_Aw:af+[)M.];a!44*>h X>\&!!U611#X=̫ #ieXoaC)tB0,H'x$. c0* m}}~#7r|\&@̯(})ބFd2Bh_δٹƓG3YWڐ"_:dFc)m?0[‡Ɏ^$fb]YBm^!hֿZw$W[u W?0:Nr RhF,!3)6R*\ :+ǝ }%Un}"gVJZ$.%XLT}Y[U(v2nb}22OB+7NY51(iI?hkWIrYxfcS_nZS!۷0UE/zE KWbG6 awAI?~w4gWIFb$)!])Fhť;AחJCyx[ހm<7eGԜd}wd׻dEi *) l%['g;FNi l3Rnd:芷Y$&P5빡eIuDR|utwQOâ8&9yX"+~iX0RyȓLQ._~/8)b nnSf 7!Ϭ3P*@J5p[{/&[XLH.pƾ:]PTyzCu_)rMYuT<`lYQ*XAL4MۥM]\`q;RO4띖_^jhotIqo'*$}EIipT&M.dH|LƨB*16KX܉FLt3B7"zs(`@V)YCSJ =W~ F%ӗD4SWv=9D<J>"#0azҭ-Pa|" $%I<ηC)SB]h3?0b9萑PyN ƅ\`PՉ`=9d}8sC,imkG LV-}Ep"3mǽ[j3]/F" emED#!RQbz7*L#e9Xv@ +g(p2{ cCr;ظ0 t&{3Ϸ$iYYc/}Y@a~| ~x`֨r=+H(Am+ \U]V'cϰi%C?-ҐͲfmGC,PgU`NaeKF% uF[MYp+,ǯ_ekL dעrxs W0+56P-s^*?LdʺID(YO& 'm݉)+X=ϐK|B 4taAr|lӹT>G6^P7yF{C0;-!EfpM`Z ̇eak#/e?Vb~τuPSEpmO+МYCh8E2uc4- ¹lZ]UIe*jgL+?PRf1QHD~CgO:&xRGߤǽDHp#6mdOXYȫ_3_ߜrigg'NJ`emIoj*RjTDt䞯9 JmE`rT.7kO~{LzQ?Z>ucӺ Ãn#o~0/ mM.-eomed"W ؕv'u-[s`5Ų]e=? @ӢyE^ۺ{a?V| O]qzהOiPRjLK,Ul ΃FbNI(gɭ9KUT<Hy8k#g:\jggDh 9iń0gN8d4-_0l=pŒ3ugV璖٧UMKt-VN ;?5֞r?XaeD-sgI[1rv]=}{ i 5k?GʚMX^MEP8˽sşfJM\LvdgXR9ZG*'Ua էOvR^XKdOzӲj0x*)^exS;NmE ܰ ,!4&ϐ^$ H,+aZ.̔VdO j A嗭V0&3ZV8El#p>;IEAtΫ,*տB;T~2ҳ$c/Xύ GNhM>*FxMGMZ!D)\NSq0ќaVRT^"1':>7Jwq t=y+]T!m;"@U"NwD%+w@ Ou]6jl #0O<כh)>>1=+lDC? QjF̀V-曻JzS%:gWуW, qeNalbkx'3d?w5v6Z*B>Es8^X$n]@Xcdښx*]ҿǕ\ |"kynB}E6oh-GFdГЁ?\-I&圱||`.Pu !5ڲs)Fҗx K&\xkîSg*};OE4쫡x;H"<#L>3j#E>7[>f5dQ/mjp$SNWDX >:ODpHUNGiWͳ:Mu/0g6J,Z6oH^s&S&l褿z'/lܮI-KBI%F{-% GS*¢/J҃gjըʬz b+d~}:|sj;wkSz\U D7rjhLj^$cd⛇~K:&}?ðmNnF.#"ZIV&{*iyC`Ech9$'NP+r4LA7/5z!Tyw5~rڢj~e htn:pIZ\x0,*-f{eeB+LYo8 M-s/ Fxa C  ZXv-'";1ɇSsM$20rFؓ/@~}lthX=K=zE{KEc4)X lW*J5h BW]?Be5rV>$4[k!n/7=| -^>Qi-Mq cJZ=ۨ:b?MA+F L*X#/ m͆0Ԣ>v|v,n&6I/4䙼T>հ wI22.k~1R9!Ҁǭ&;ddz-wij^S] ]mIE+jX?q}iB\e3ʎ G$`3ԑV!-*_"Ʀ[MrHr:wǏn;X%w\ IϬa-2F/Q8Ľ? 0qf3\|8`E/Yz ]/.ӱuU=`.pg0a;ꃓ?tN̝~HLC%VfBm}|(q2̤ߞ&eUNp)3wXҪ&c|R_mfk$ 5[GqHS)f"RbXn6;yV0_%mŴ[GmEF19f+`8!<kfgt)c2Nwz(râgjX wmgE.\Ui~=$ Fij;J|DnpSϱJ.?7TÉQ]is,B/2@ˑ(Kzd_h^;{ Q-|:\JW-]:RM g㪒:~ދO T,P|cBmNfiv/nCJ7)ȃ5ʤ"w.0suIXҎV"a'ۄoD$jDUig`ZnJB3|#gy>z<>qMҩ&. ,P!xthLBͣ^(2w-rk1f^„btwghޜ-Ǵ{jsָa3DRK"Z)@ԧ/I~UX;3bZ0[X!Y9 3{qrqRw;}j6uù`Q"\mS%+n6 ϟ gKb s#cJg=54Ѯ 4?k`ܣL1ߍDjrh%iYrg 6Hh7WeN}}L3#PBI P{^ch7}Z/4_ + !ŽQ뱿YMb0_6P.TZ!b?=~!}</&jJٓoP=6sK7֒7_~Q ^A43wg4Q(J6fҬNI#"Ͻ{@go~L"PzPRYR?n;ng$N$c )aPDW>U_7Fr}LCuNROC`YV2jxS )C]POEX`UZeg:xbu5>ml1Ê릯\5է+bР7Ա24rъb'P{チDOqؗͅsU ?'hPas`ЗH75Vw!şJr'N`.yO(3]u?/}”`0=W$ RxאG|]V# ,•31w4>=Qou{eӊb' 7_X>T\0tojwC}"4/d~8+mb2%.K oUSO!Nto$lj>\ 1 &%MC*ԹKOO\L?0Mӕ8|" /`kM8*Gzlî[_6C7_Z%=n*_}sMK gMXK1O{΂iC薄92~/qw~cƐHA=P,4_Dn٨Hkqַkpf:@Z֚:+mPg{=soH{`[RF ʈ'Ysp3`{6}-MIe;vWr5jnM0kث9%"blz['1%R5-|Q|:p߭򓍄SYўkv*x}"T3U>x.*}%i w5z)"E|T}҇TJ YUW7QkǨޞKh|+Q)iSwv 5x;z95SmDIY[xdụGǎ (nH4Z랳߮ = wiIq$eNX܀\ P%b#LBG3LEP9 (ƛ-TVy8Zy;^QB0X(V>n)wYj HG0S)hf`WQ"S yW|s4WFm)>mNZr3Frx,@aLC3c,ɇm|J3e*sJS?϶wYͯ%`ynLu@LBo &+ŭpM4 %Z;yfѫÃ9KUN8C{(7i*}|C_ vW~bCR`Q_Ib+^F>L0Qb6vV6dhGY*ߦx\5 ̸\˾Q/ _@etVP@"1t@!{W^S(hGiР@1~!"jw;+`4Ȗ3u*U"m{X K3g0nuc@mBq$fc򵛎FD[Q;on餿,|DW|6?VoԚ@9J5>z5#T f5ڬt5/u$ٵ8dJmULOW+z%H49HjX"(<) ݃'lݍ[ m\MõYUrˤ"D9_~d x(@v{8\ \ŷ˳ʟ $1v:rzV p=xhM˚R#qYҨ}~G}lp 4 p;kϹ*R^+ͻ'Y,pw_w ߆܌$"b2(STUڛ'tDzUVg_24sׅl3EOX^hceHּES&l+ivߒոΩ7v,oB+y+l+2bff]cʹ5*|9g.Jm$Z}ʏML(CXU(^S8؇ɥĝ1*f)WM,ϱeG]vƉ wh-s;X?JT ƺ#6}@@AM% U@̭pu; [4sA=w׌5 nx-6+p/I[2K& E(t{L6y )Pe| ¹?#xA}4hB_}KvӑɬVu2GSնrcJOU]ſOTہRd Pc:x_۞aDLj5!$RQ ᚼmXM=bz1Mȃ[#~%y9kN)RDf`HEVG:ZO\fTؐka(*ʼnR7䷴iv6t̫@? u/X x?z 7z݀1JU%ݸS,a̙uŘt :`֓r>F6on/ʨ,2rIL.PB= Tk%Q7h nsʜ&%̜\Dp䢬fy - ^!Np߷MP$H(+{ũw'*҈ǭG[ccM{}`ȶv]umL ԻRNP~k~8]'fpʌEУgR!49DR.cWf[ am=~kmrԯVM;.6.Nj\t/+ 3+j(~f v uTa2]|ޒCC{ُ[x.I/[18P gG+JLq w<ŪlV!-u ju4_x=@j ӘͯE*sH2崟N-<#o߸˾"(Df7f(= }Su*;zP9չdK/+taڒ4B2=EiԵNY豢.8DE 6EQP3PAV[|oxOu*h@I5G.9ё|)i.}f+MPk!7S]YF};wn54OZ3I`+JȰt k$xH. TODKWN|iYQ3|: vU:9BGg0&_n\fJե;>xq12ݓgtuTnʯ(3arWa{FGԹ=4(>~)ٱH663&W@vNh[+})^/]}a&pmG0tu݇>R#^b{ɰ/֣c_> stream xڍP]҆ ,%hpwww['Xp.-n-1', EaSc3q{  #3/@TN GAj5BQg3##N j `app23Xy lfe cH;؛Q:8z:[YX?#ڄEr=@hif-@ ?)-@G^&&wwwF#;Fg zlbff `ٿ*cZZˮ`t7r6|lL]>Vڛ9>6H,zt^W"+89{Z[̭l Ⲍ@ =@#[FnFVF+7 +> wy.&V@F+ۿJd+)ٛ:ٙ]=u6s+{S0uudRrr5?6 3 `00d+Nz;:8?027bf:z_caZfVpd0?.{,~^}L2ڒt>7;3Wq}jkL\W h1=F+q+3SE+z?Lꯗ cLl>^(.wcwK1{ӿ`l qfPS3[hX(` ׍rr|t_ $qKܬ& K<>#?i_8~ ;_;u*L e~T`~??jlvǤ12TA?LN2?C~u?BAPϿht׷ _u]pC0;ħY}Te'$$M;]1[WӖzg86)ɂS B>N>6-?)r\?Ix/[ ]W:攁)aV (3Κ!2Т@E˙|'=f+b8^҅KC~66M-r,]R6_HHƀxĚQmi[6ɲ@K-m0p&Un3Dֲ٘uߩw[x!jY7w{?; 0܇> 7vj XЊYDf@4̤0PWܒ_ BDXv !{A.8r}V6ܚC]uG z7W%af(u^XwxF _Y\PӯJ,ϥIJ;KWRU֏<jmJ${g G C"A!}4p8J]OQoj+sfgCc"dlgR B:l,'OU.u!t@7? ~U;:xLʙS,OݳXH&YeNG[$;u: 9pT:$hN*Α~ܧ=Ap"~Я?&흿q)scFnf?LCCMM0 W)X.NR "?;<'$ 2"gZK+1s(U:V$nzhτBw_]ݍD'^{́Hv"5w8cQg$T霄9[+q~П06CY&UPr(OB  f)tȓ>ke@(X#kϡrNYp:[S-Psi*~z]R~{O .f2o iPE9D*wvb'Ԥ1ZSPifL Id~ ݗd~ۛeA(ƚK.L""t_u^&-yeW=OMֺ i/O  ݧMg X틌lA\;yn~ǽ0FH4) D8͓,mYNnqJ_u]ܮk2J ,mc9i@ĒH:M,ĚЪ.}eF2V3VaGx xYbQ,ĴD΄WTJՈnApf#o+xA_,\b l`͔b ̱9$7ܦp1 jr1YhѪcC`*ذǿ"!U)0*doYѷss/X|%D*$#gש͖֢;kx2zl>y~Twш]fPγ^\խq9{iHsU%`$K4o:&FmB`1\veq]&}Ek~Ρz3|9%uaMEcb(e`fy۰:EG凓RvݍEv_,Ni߬%Z),3"/͝:K _(.4}y>Dy٤m(KGF/w*oA3 Q?n1G0!^ѷ3,t^gL;څ' pyEW>lev0X<!SPc= |U}=dL=T(}d\VMoг,JpRR8mٚ*U< _0 TB| WL5 r™saːm?o{BaVo qP5g7oQfe%@&{ə]:%4\}/YZTsF=WT_6Ә easG* e6Wdo؟aV偶{|Es۹\k=Ξ% KF͵&8mZۧ_Bq 0$đ&0_.᷌C,\SMu'2(eB5#ۢ#es=1%7ҙO zyoԉxUftk;i] 5'Ɲ/K^ ñp_&yT K|uY8H%Nr#a~SZYur*<3Yl/n&^~ *[Pl!,>DJT~g\"Z,wNF1}fة dEOL47Yo6$:/ iؽF\ 'xdS1.YƬdžkh>h\*[= t G 1jfVU%'o6T-Qc\, }q8>)/Q.|E^?"a0qxrd$[rVa}&;Gy.PWե -jvh5ߟ}K0$ZIg' $sR0sZ%92G&bgDDǤUXd7Hc:JeZ ~*oF9E-)>"h=il-!ij<8ޠϒaQv]01=֒{V&mRVl(Wkbi̧Ľ2 JHR&C_@كpdזU xz^ad{L4{[f2eL8-%(MF<2s#P{}khjkև[$켌T|FlwV7q%nG-.@o | yJR0#?X異|J(' 6ݨޟ#MID豭hu 3HS1٪┽!-aa+m뗭ZYŞ3Pbթ&,Ol .2v*]=ȝo\}Mz8=H^泞ΐ+A;4V׹ !}Uf DŽoNSPXG[} _C2$u)bݖ@vqFE=)Uw>Tin aH?`1̲Z.J O4+3fܾQ1Q|n[|!Ju AZ•@"a5= n=g_G(2 Kr§~P=KG% ;>r6=)gK6sM-T+ ˳4-gcϷw1+Dʅa *)CY,=NQYp$\;!Lӡ/i' 1ltMJp!uhUA^Z"R, I#Е|6Y>oӭNOU 5lJ6}P0d8=! f[>SsS}/eT?r6QWR۽ZzFΑܒ5 \W~f[꟥}RZ[5}E#Tq^R} #Hgef&Tst^ `|Nu%]8ߕ_R؆<ȚYR4㠙F/2 7zp=jZhv.sm9:QtP)KЭJ#tk啺%Ow -_bʿChv3WдYni,@tnYe\ F9@bJU[Y sJw=|2YW/]%ۛ6a AGwtZO$f|`X .qZڝ ﰺ3ذ|/l.&%ڊհx9rAȭfXWn'w_Ns[d-k_- 3]Zd%bvI+}ʞ^.>!}*ev=l1 TY>-0mZJx]ETIper5 f>t~ꚮzv롗!LR߈̈́K}P YW%\Y4ت=o[Q }]MڻЗH}}O߸TjUpD!O\٫U_J'l*%o5;j{<)ÎG; ÀQ9^%\&AԇշcjfLuiJR\kOcN|ML.nQ/}H$|' D_`RhxK ʠit0!Փ  s¸ר/'EsU@RNqĽCgv%bʑ>^ |՚hpml! @YcX2;U&m_65?=[eXV^.`n3׉VV|";8~bd*sub`rK v>QHfWn™x\]$(HHKFXK0D+VV҄ʣ}g̙E=S+hJQ9Sd)L>}ҳ)Г;t'%>2Iq17󺂂nqThX&˽3 0sՔ!~Kőpxt =zx8,'P@uA<]Ozޖނֵ[Pl pɷ熣I$Xn8҈L'|@hud'C(zoMJs:;Cݷ,kqsjc~I4 ve\*޹a m{Eu6U& !'8+ 刺NVbyڐ,F͑ r77w,xD1ٗuDACA2Ok +[k9O%+3[5sDNב~B*ڧAC)Ak>!dܧ;C1e̹x$.[͔XDp[y~3/>ѫA<:&g5o~k&1fQ~7}eJ`IH"-^8<8"&*e* x-!!t$ܢ ߏ6P ()ñl9'R0'Vr"lV/W\w+tM*5>L@]l~Ml}=Iј I(0jy憋ja:Gۈ`󾶁H,_sEz{Z 8Th[!?yъpzۭPyس<'K&ccYm8݀wIF9=3{a٢_7&O!fSJqvٽ7Ȳ?\ϫnk-Д +ݻ.(fQq$ڧ`N,jǁ@"~XWilL{=Q2ctkI!Zױ"z`f -ehX;4碏H$G'iˆ;wA[툪 iȰX0ΨWS)w3eX<#J#uNs6$ճ74|'I1ѥ޿a-5 *VZhW|9͗v 'p1L+|iYlc"FIYT ȮoÒdq[k]A㥿ueT50_ C9kzjWg%4.eF%9Zأ#A $yש -&<%7eܸDڄ޾8DJګ}E5W \nd| zie8Q60 wVyxX{JkfUe s=KծqǠa3$,~Ш:Ǐ)d d>ՔމlOnGwk⛡E14⥁ "-_&}NtE'G: u|i2kC"ab:7B~E(.~U2I/ԻUwF^M]zG[~j 1BZ}Bm7 3p@!_R{Q=A:MW͡lF-7ɚvcoX/2yh1D O' R>꽝-^ngNۡxZ֢q";p[IZ+ &d|ێ{Jk0.# )2Y {! wipHQO`P`ܘՏ.Lg4?+N%X\iefLxm֦2 1C*uNP5nm܋kkל7NUiPDK[5Z+ܻt| 7RIiEp] x xZ.ݤۭ#>ߋ{wFz"8)XϾ2Zh&c[`͸.w곽N6Zi®Es\z#=\?L{+aH4+TlP ~e/JҎ9Ї cD8bV@Y$eT{rNV,1!,TCz6^C\ur^ {SZI~X+CFf}7Qo!>zq6!>b /ov.Btҷ0dAa坭/qh`$b,ď .WYK4[pq~DiWJEc%5'[_qXrEsDu +UbXC* ԡDuIA%CvUxNjLDlc+`GD6{1붭epYP3Cis"$)*s%.rqfj4úbS]b0DҴp#bP9!`1#7>$)ҷTqE nG :դVtX7q!-)4ɉ7-]@kD_4jO3+0y̖:#$I TBEzy*aԛ8╙a$O5o?&|כaofE;3-i'H}q~=Q_  mpirfu4{p w%~;?Y"O33pp$@|Y%I:.KueӼo:[ J=Q'~D|9mtM&ą:e?Jyb-$2@#QG \|OE%&8;b@w{<"gD}O9XDgo7JvaoG=E2ǠzqBHKREP/Bn 2vAYʅ+pmJ%oN#l'ΎKJqVU؍}SSy/wwOg gd<0uk0n~eɋXpAt\&r\^2R z, rO+mk(B:8D=`7}uy? +1/D[jwm@_'M:a 5'uk/1٨"I!_:  y̕<+>b5`6ltyL {]TsUi\䃅nc0G].[!^'#ൽ}#LBfpC%ł gm #!R`bIBdz%z{sҠb\!g|T BPqWp*L?mFF̴bU ~ QqyDHL/`jB btH|Ry 4ɦ9&V>+! ^z b %VK6-` g).go 2MEviQN ݵcdBJOtFM+be* 'puGHyȍ:L %FzA ߈'jYw<'Tc {xMV0c!J8\e7hҘ,~2D/jY.4XQ7:idBCD#0eEcw"EwcmEO*)=Whe˵ |JkbZ?hFD㯏Vք o!nj([LeaRMn=?m.I/ 욤 މ~&Wt` |}{7ήWaNw:R˟oPs+UQ7-:x gxAzdj4;ar  hK͍FKx ;y^8a; ٤]'Hy"ӕ`c 2k'3_8-Q; yjKOYnE|_gVUw΂k,#]k-Yw9TB B!nܜoU˗/.#J_a2,9ZM+~|y]Kd,PqhҘCq (A4u3{-Jtf Y5cZH/B7 Jʄ1MfDkWtY̬{R&=zWf(5 ۦ5 ]'ɽ"hSx1@m@kclq!(?oJ#VfFW7C߯\Ȑmwy'v jjd:~7wZȅ^:F!)-SC _u h7 џXj??"]bL~{ "gA]~+eQ`g>~%DY=K+4ۦW$ynSƿr]A;#&xbo8ќ/aAֻ"EQ aښ URBjQ'Q"7%S,AC׼zXԒ L]]L B+itU5y|MҸV׶jt¼ 7w1:ɩ5F(jm"Z:ŝR.r}? 7vO8 w1~ȕ+M2ᛠ n$%W7qQϙȲ`HF/ mEyݥEă*gϒSj1`~=d*ҝ\Rc ֩WR ((oGՄ D/$?`G9²:5T5wq0fS7DX<{t^TqG I }ԍhg&M`~ V>aOqf!kٟMwX RMEy":Mzr&涙mQ&"-&D'zG1"B?uT!W} ?$oô!?b )J2r(`WQrj~{$1=3NBQ f_!#t_%f(̘݊W;5Ezu7:?<7|wS\ZsWk¯_?&$႔ 0{( d:DnZ9ex{ޡ+/M)Y66.2Y,q,u}#wi9%6\\eP/Px,9Y`j&J߱ x0_l#VI4￲G9SF5RbSEĞ^Ё-բf!:36TpatHhRDÒL\:ٔB}ł{l# I2a7JTkeuw봛'\r0Wf{T}+p4Uodqq1aCO=ioX?xr8W[f04uI@cߥʜ4k!Әڴ?@th,ϟw@F9@c*)ݜ-:ns>* = Uzgt#1K6f*N ;H D̻N$[oꧏhTXjbt2u0ކ2g^';{|RC}II  Wx:3,+@8B2nHx-uFߤstd1|7ծ yAdf`V ܝu*8 u H"vMrA_mpg{ѷKjj/JxLV;׶O}="h=T Kmଖ&~jНҝLB0! ֜5BIūJiclbْ<_ۛ&h⼶I޳|qJ"kUZK*9 uDRcf?Qp=хHD c7:9鉭V fg3-͍&b7ͬqwƄ(恧icה1Qc따 = V]^w" l!9bz4'*kL'+pXsΕ??{K~EgJB^B DMW*੩J]/Fyҍ(a8:95jwR-bgW]XdX,8xb LC$8!]70!\(ZBINwLX =CJ.>j [$^tL9Zk`s?`IgM3a\ɍ|KY77F4Q̧)XOflpV2{#cX&z;B]0dZ@^_88TzԬUᵆ6D9y3"*X%hTcV iN ؖkMbIlE no.JPF`ivu7]YgfI$X`ʽ0$N?+|D0 $YiB9|?ŏ9\٬-"W1UpI #LJFe˶YhO D sHЮcAg6 w*LJI!cFct!r1f;+56C2U g&PH(Lj`a#"?5AtPo R  "=T~,mB?f endstream endobj 93 0 obj << /Length1 2489 /Length2 18911 /Length3 0 /Length 20343 /Filter /FlateDecode >> stream xڌPw! ]!Xpw.9߫emn(HDL WFf^* +BBb@h&7q}Spd,lN^.^ff+33 y&FO!lmi??f4."@gk3@ h`f t j~+WWG^&&F{FgKAz@tv*hb2Fx ?r5 Wg M`gmý΀5y#?{`ad/ݿYv613sw4yY,v@<+=dÛߙ$ET&o[ _%2Ee =W~@{13Y[_`a 2s7G& PF_7o%:fVLѫ{9V%~`Vb:|T/ga[L ob?m֞=c0/2wy6{L""rtT_'pq0&Pd Co P|}ff?,ok߄$VSQ[yknoBl📬4vZW!o]$=֮fVFog *;XuXپ'.o[|;NRd`׹c8;x3+퀚=l#Vrr-_'I70q1$#o `L2oƩq#[<-oA7b0FoiFo~xڿ[<"7KߵqV9FofEo:3 G7_e2E$loMXo @oot#_z7?L,oV+zkś쏀oEi|k֝oCVdޜGVoKZ(;˿Rm[,Gۋ)2k?39^Nn@sSvW_1_c ,oMu݉s=-;?(err1z8|-q?F;7Wo?sO9 h`jy_'BM`b_+gٹ6SHHڮ ɋI{lDG'gDKSCE'"Dp /NAݲyNnR *r3 1Asa\Ѣ{΢N&e+b{^Rgu#%A=JY)+tOضbwDz||iHI1K)!fC:ɾ4 =|MvS撫ԅ^)UɎCg1A6B +AHYo9?l>ƃl,Ac#x]td܅L.YP=!x EssQ]GJ8l"[vhXOylF '4YG=#bVhTVqB+{h؞pÖ@ؖE^pUw5̠RMQ#nRl~!OS?/RZhSIW(JD`ł&^ΓS'` aIj/*aQx#|x^#7mP؂Kk,Aju~ü%=&WV>0?sSñ,9!S?H[OgSE 3ﮄ['vpMAAŒte(^QjI {vZ=Ę!Yᚄ&|5Ey*ELheW;Kݟئ[6t0IOHʕ4T񔬜>Ǝ V(Q8wϨP/D a/43fpin z9$4dYjr&R0mZa ÃxlBEڳ`mLOprxǿvN˛€*YIւd7av@Zw[3"6s%zPVcW6'Q$&[ze*L"~hX\,Ǐmwm̝e T [Y )Ӯ2"ۤk$ҁj`|`?5ڕ*,WMZb(2bp%>xL&CK42ܱ)2CWH{+ESR웕4OQj6QYpn%^qb]QLҪ#Pהpr.1RKT%esҊ|_+GUU¥Iq:ƾlₑqA1/rJwe;Agx7(;2VIa9%)6ݑN7ϙʕ /kŲ%dϺϒ >|"̠GӤ! otiCy?п9MACmRn"p(+"r"yzT?axF|0Y9iNdZ ?Rnm >RjRVd8#Sа=w6J޵m\,-,g^?iس9i*Ǭfڋ<=<Aqs ۥ~$SG͋ CTv?+`↴btL1R+,'V1$]A#Ix|kw2O0Q%w [Ie[uxiouz/ /2?`!rdOo0r^?v .e"v>, F=UH 2ޝ7'bv2>1_cNJ˛sknYP l*J8uJ2 k.UrcL*Iq$ k[=۹w|&0'w:!BnS\Q~?:j&f1Ü7XQ#B=Hu"@_qV`$$mV_f̈}苟N~-]ن!tf !W/x4UַIcl.[PhKW B\U#H)sð cS!u_`KU!ؿ:ڜMCj0wn)~6GLڥO4[jI[En@3Ш閻!Z9& NXۛ*`D'ko>F䈃Ì5&(ǥ+/ޤ0@PhƵj:F&G*?wl3z /"?.p3g&hL )3OwRg4bHT*;)e"8q,$%I>R G`fyk)-C >i%y#+ cFcz2(8PLQ -?߾㧤wC(%FTX}*ۡk\XtJO]\(-*VYŢ#.o,+H,9 d㽑IM_VP*(Fر`hn./Fu0/%Kr6E-HsȡZ1&PNXQ8=3΢v`o!uz9k:3zzO֟_ 8lyue{8䳹zfߢ\8㡸"VhQ&MvL͍<pGd!F;JfVYJzd#K Q93}<3( ,$&$qǨ+ m6tYF׮AD<-PCJxi:0O)f;7t]:GT(k Ry)2-Q'|k XVloxӮnfa(ga͊!'U w}ȇT`͂D`YQ<"Xk=i&v+0<ANx/ qú&0~d>G`QGPH\]l|8o*S'b]f)bbr4Q޺Kv n|g 6E[E9mb]w^F@ 𒿽{0Fh8p!Zdih5ck%kKJ|e#WCcR+!A𥉉Њ}4fz(!ˬֵw2;n(T?p5*bH9瀙ڟ\&3RDbsYNs:9s.B/ˣ W ԇr+/E/mgER( sWޡ}Wƥ@i0Wr oŵGY n&k4lm}.¤<,&{XDC>z`mQ.ufLh vD 1-eQWܘp|xcq_(tolߙ|gT[cj8}s-/tnzv˯0sAv(?<[zBcW0ŵH0 rډMY HQMkUmOv4 z*V>LW6JPVdF_: rrsm򵁺sBڡ@]B2|?d6!@;\,Q=HdmQD+d U6x'{+L\r:j #(RZv)AB{%P唽Vn7`]"1sqo KXO_SϤB@aOHoUmQN1;$'M#JY]E`qݾC+\B_sCArۏXt!t쟽˰6DOtH:?U1?ŤD}LH$-.e-QTp3'GvT`4fDrI7ƽstbٷW[d= :_}Jnȶ`fsK"699^]PA(K<j&!NXjkUqEWYf3N@K8t㰷(r >)] 5p-v~w3soX#y؂ɫLgF2p Rp3G.ς$DPFr>|ZNZŋKgXX%\tW/Ϛ 8!ƊhAj5?&Z~ [Đ8Sg3!Q4#u䙹3䱐#?F(,MN  xJhԄs ݟjQZ4nk /f>˜6RJ)_am&r}cRz:-c, V' z7DF_L6] 35 NCdv;4^1`qPRcn9ɱ&3_W '=@B2od- &yb.0R *VgYpc¯b7NXx"*̪ʒ\PJ,2зFV]k <7Ci: _cjCH_uج"qf Jp4 {g%.v>p"RF؏uw@P.=4cJ<>VLwJ+·ѯuqT&¡C#~5]H =Lq3Ve* ^_ RXN!Cϣȥ|Gv1. I(e^w.q&3SJ[LUvFdž^UqwkPP2`3:>B7K|XZ$;ѶV_գXz_Rױ䤘^wf6lMK[BMe5arOQ֯Eܶ~M ,& ũiM l቗̵QG*KSsfxIPעBDgԜ(w~u;HOǧ=•xKL{fZk-䑶MK0Uk^탗Xz|g&]ږ}m]֠P'[㓅H! X ySU3W>ҺߐC&KZiY}۬ZFWd{fPp z`86tg9({f}B+;.WC_ۘ]lXRND>!^cyZU{BB'kg٣(?oP<r6V1pR`cK[%fbZ<+΄t6Xu֠CcVo_-%!BU$*~oA˝u,81x+h> <蠓tY(a8H\GS)@\ DD(#|+s~S4 Fg^/ t4 m)L"7 !.S<}{^ /f엒!uCQ2 B"u^W @.idH2`E*إt>@O+^=Z[9\{VvE/CutHiuJGp)8/ 㷥6ai l "wu#5$_ 6<[QT9fcP6i56D "+(W8z4 | nwI_k K)~^EɗaX#" mmGѤӄeUCEo'))R`>6uHw;ŻX4DTԹó$n7OOMh؋]v&CԢ֐)iҋ> QX@4%5 ]@\9#aFAITrꯏo{SL9y!AZl(wnU]w(,t[,'JmI48lF6-zɓsmd3sb|#;a֪ m?r/-x(z&@e0?:{UnKa,Yh??ڡdWk#̃j&tǃg 䂛zk1,[WH`!c-}$>+{M'BA= 6^k'kgzQ_W6cІbqٽ5QۆEX3.*Ww]X? #V.>G[VKF :"ĽLAXŴy4rQ~`$uӰby}h~tX5lͩqnV dN#N',(ܻA]H1ܤ:a%0cpݞlu퉟@^zff / VOG۴wM)`Lܔ!\z,zX^dFZ¿T3N؞TZuMbuMxNGLC\`~mxcFWz$?}?܆nV N:Jass[}}xnYF}bBo6R+(wLD"^nѴl&OPdTbG _3Hx`M%&pre$=}>{^4bP}ݏ9(YVʺk#^M|ףZ8屚|ЋQG#!(+(F%Ɩ~UH~:c'Rb񻵪>Qƹ,05$0Ԡ94F+)֒P[bi;d6{+لJi ̔FfZ̜Ĵ!!e!olJFq鸑;Ge ˎ06D7kx6>|Ϟ؅.)2j啞SbUrqAsђEl':]5^A[ (إEe'L+i'qrf)~OJRe='c#=Βô2'-:\z|5oA'c MkRj6B"PI"0^~űf_ ׂ,䛆J1Œ1fCf.>R1C5K7joaюXyn_nz t2@aAMv^>g/ , ӿL?H0'V.$ȪbR=HѸV_4]SOvCNX)bym}L"r^龬k")7J` vo.{]Uv1 I̼ %J#jH@:X9=SYF^)K 1/G؀s.6ˆ-t9'=̨;8ywB~v zFaO~n*Z:a<bRçFu* z ˤrS.$N]mr DJ,>L't+L|$wfϜa~a`h Dp@ ݡw+XX:: O{M)>28φf{I.,]wd_^ M8^MܑT?`bF%- 9iqH/m@S%l) 4BxIs@W1%ߕQ^O> B[VMgc;sԋ=y<ݥu}Cd'Ë~?5GN=E|-;+)=n߸W %[nJV<ՆՑtLO_c9N5%̎{Nf!ɥuٳS~bqe0t|.gNaY).x?so❧r~-}C̔]% ~L{ldqlVB0Щ"wڈdlF'V3&^ғ` v؈+/$χFg:9p.]$?o_xlEȠ+ ]Z@[ =T0nq}Z3yꂮ\{7TDX>"}63VҦԐ?gOxO櫘ROSg DY N^a©6{/*?4"^r>5kGh> i,jK`|F7"$||4Mn=n .G$^~aN"-᷇ٷs24X7''nU]hnGԈm47=(ĭ V©72J+~GA"GlެdPJ'|7zIQ[/Ȟɵ:Spw%*Ո*%e{\aH9fh mZ𸇾RPnjZ!{Ngܟ\''8NBq A/̘?z(FKJq60y([zAg[Ə½;h?( Mx䩵CW0h|lN̊eJM^9  j<07M*>N-򺶣g/jJي^8W ?Yᚇw>Y/_,iΨ F.扟v:r ۣJ[ oQw`g`>yQUک,b6tq2>S0jaXNl ~qL1qkw&nh썍޻';&1gtw$ ȑ71,6cl|j֋1ůk8&'UQPHv̂cz8\`V۴VfY|MKĜ !6blYQLA6kjIS4|GQDdȦlIICbr p'e x dBf qdWA/O_Bqf1rpm2s 2U~6 z!^x_v9վK&854)r]́z)E]Q3,R-p,`׍w;]FnO˲YQ0.= 1bnA])l;?Z%̋E84x~RQѢ#uKCy]O4)(S"rPT땜J?- RR}WdoJzا"4GM2V\\[LW%k9zl'/ qha燳gz By~{r L0ΓM]!]T|7񡑈3n!aA[T;ϟZAu9Y#BBk? P$[+_ ջ.i>23ѐ`1V‚xo9K焬*̑v1"ب*ᥱw|yչ=ήh &:j 4cUP[Eޔ2}L'lKABKdTL/Lez#2=sZt`?qi,Hrz30JM>U_|q2|c8{l5q܏~~81%dyFR$h<מJwĖߪ DufcGYs*2=_ӵbm;-߭ ȋq+Fi7yCAx?{/Np-i5?|[Z.8}V?>FC;>c1$;XSx/2PkLiMZ;+嘆.Ԉt{wH}=P@6Wq,%$y$?q86\N.hK;PM\&r}[2 4[T>lL$zXӀ;L'X=p$xMPKR[dUxFEjjXf4b D"5^,~*ن0Z>`>ѩjģׁtZ(e7q|,ǁjj?8ɮ C ʼn|v5ŅS~r'o4}˪/ ?Z69O rP42> t";E5U7@9X~ʟy&qC %\s;~22}(V/L{#*)q))~Cw1O׾&dҭ_zsX#N&^Z#(WrJhƗfQN=X߃"5@Η#ן%fngo"a=2Q@O'Na񕽊&v9m}cX : E-\$ШHǹ:["{:!Yty E6 JCbP/颥£T!j%āHD^z[ *vJ@iDQ#[ } 9>:vΊGHX65/c|Gxq l!"8|cGj*%|^%~s<="_B7UeJ(V̾C#@%|w#؍BۼJX'qrY-yk^(M-xc@.VBd1E8n 0%=|Z6Tv(w(5P%V0,~(q{Zh2 vʼ|x,F&IϺct-FJЩ̈5y7 qrFY$⮣* Ǣ|*:invȢT0YP^F1ٻ{+b|c:Ø+:50)Iq`"w{7'az_YGdHeAL q ,~*}ݎvVQI픈) 6Vȋ9,h\; ȖB\eo!9'G~cΪ8g[ gAAߩ6b(}J҂eYL_,/&K^rբh}X05aF)ρgaJA6/pYK䛢[x4=X ֟D]6Zi6>f$yzKQ>~ _0I*ܗ7X v 'fp>ZxWɵԲ6iqych S@~oLsW ъ׬wyЗ3Վ(uj߰o%u?ۯvZVbn,Q> }K}w+ ZPPz3Qe *D/iuW&}l3 w>T>j ]dD+g}W/ȝ?@ԯ~:kHkLAnakm/JEON% 5AZP7P.&i =4uJ>LF](15*BЪ%zA5*h@^p<Bgp$TugZ bM\1+9J3kMF^KbM|'%j'(#J||tn#J't!Iw,õ&X-npk-_<38qFLIRX."xQEUpINGQ0_)*\.@Gq؆-> DәHSrM8ֿ$W\]F1Wz,\'40-b!^\J: =68Z[Rv;x}8WO.5=l{~q- ?̗?Lsj+e_uk1b錚r%QRF~K aY2L%n@XB$3PT˴ϳT~nznf5tzctX+{ƭ&݅ 0q#$֡p0O-X[]rF 0ymʼ?č9ͦIz6^)hH7i!8`"pغ5 Ev(r~^2>~:\nM9)Κ?tրwkre{oV.'y~{t>dLpH>JyRzGk1;X 8)۟q~!JtM ?Z%J9O1t,jqh'nݎJҰk:(a"c\T1$SOOQ8'4D!)1eL1FF&vmӉ^5yC9ҩ&+aVCA,z?9=m|Y@ۃH Aim~D΂b(LQrM0"|GLԞו PWKh3.Ȃ*.A&McNM1ZcFRDw*ĊGEQiv^m1DkqAy@Ϝ.ݔU j [%;3"#DzMkDl@'KT@L~{OMNX IQOb{Mѯ3Lw%H:Ԟ ]PbVh<٠2;a {~wb"Exh0C7 U83BczόopD^|jcxdW #L Q-Rn]+!g3T4Jʊ\XxHZOO]27UL B0QCѳĕ2bd>xG [it-> ?+Akx욎-YVá۷[;dzӧȖxAbSc Gg,\k5V}ԦAchG"5C3(4PrlS4Ex$8_s1ب1BZ>V$se'6XL:TQ6I] J}o!jx4 x+?7|%~ůfp3CyFlSI_s'0zV r}^|P.f4>^k,Vi/EV'A D(}.[sP#=]d|KX$.&``) °ZX:cU36PCDٞAϡD" CLU=ԩ/X! 7=d$d tqPv Y=Ϲp@]m&0.eЪ0W sO e`3A vȌn*j4r9+$S%O}CUZEzjqG{)dU_OoL_njn=D@ŠIfוQ_\41u xSu`[0N𸵤]z5M ΡR UhmE!O_4c6 7!O2G^nDlqDNM`Wg(*X&X}n9e] E׆ /ǮZOveG'4:@kDTc 7S҈#n-B%AW[@?G eĀZckd44s -^m["ÞGlVf?M8e^NN8Fb6܉ V/u\d؎Nh9KfP>@+hT \0|@uZfɮzG$ݍ:f0_EE~O5üJx8N{_B'B䤲> 'XGXLe/ym3h ,_eG% >2PbKGΚxbGdxc4Plή v-]8VEk mwƠk:f[qD:m|Uחm)|\:! @"4yQzO. g(is_qx,$f*ȘQ~'u(XGDFƹ忊пT !5X(j/EM"mjK]` *' -.עE7V[8h:5(] #!hCE6k(qyJӶ@T$}Ctܷ6JAqD ko+qاI?|%?dfJU*%eX[ )ŦVf7`bΤ<Ǣ$zJxa^kSh{Y9z 䠒$ˌ/ywt`U%3 endstream endobj 95 0 obj << /Length1 1619 /Length2 9017 /Length3 0 /Length 10062 /Filter /FlateDecode >> stream xڍTT6L!!5H7HIwt33twt4 R )*t /5>;s}>kh(UԙE͡ )(ę(dcdachmA4o@N`(_ 'S"ss_9 :%L\@ErЈC=VO 30Nځf&iE3[: rk+gg{~VV777;'= lT9]A_J&v?hV`?P g7G` 6A2\ G@uY=GL?kdga_D`d33  ZmA@e)gwg& W)lkb{&@)QUɓ?99흝X$y$\jg8;~O2{*'kA`/. HVϐ'% 9AfV5^vف`3g) dYc{=v ۯ/2Bl= }򲒒('&uz1sr9ـ|\@.>YV{cPb!vp+zWP>2HOq=?ݐo7omb3੓]B4 1Ɋ szeMCbiwNR`w m 2il=A+8^Ojr@V)$hu:W<@V_߈*z)x9#'?j7_/d|Z rY@'fȿ3_)__in*ht_c ; 85 n%qcJgZtpDN \wMԃ-Iw!DCrXkj۝Qn`3Dh}?*)ȞO76`?ѼspTǻvv/[ Uݫ~%v_6P2Cg=Kə ;4n#\<#0KwͬjS15.K/)r^Q-,#? # rt^/A#{W>H(=PBtݻ[TIIpXu/?z_ϺMdM1F:>D}昊S⮾P2_?±QLGs]eZ8Yz)6J:O'jf^qi{1n]9) ŭ7E2pT;If?)5j7S|,mep 1/*z_ ]֚ݿ ze5վH&b1:Gw¯U?eYCW5 z[:~0iR kX š3%UyM_6w_Lڥxki2v"w;ilz?z=F0xՒ`2}Iө/*N_,k۳%cӓλ|-D,>(A03Ltz8504Բ[>C4Xگ,w:MDF z7_=@Y)=t5y%, wW9 ;`@:ێAT. n2%Ja&'aQNDٳk(x^ɪIvXnqҘ~_ W]Hyɺ^yU-a*[3qOr g2jɍr"IWOqx\m^EUEI |26Bl9˙4'c-B*l'}>a!lo D|"( b@aL_8M[zo%hh m;Szό[ 1"30M\Ҷ.3)±8"YfRvkXIp oYUUM=Ӗ,%,OK~s`vi2At)[= 3ow h@dX"r̬Ig".!;@R#[wEA;ː?&?"^V,ylEc6$ugw9 Q"S^sRBCVkmkPz8$+j#XUX=U*-y痋ޚkQ cG ߻T:sjmFNjk?P cuGw~U l 26teQh}-`$/SeQsh~dy8[02HEK_>s ~|"^'.RZ2|B.RC s b1b6 E]Ӆz?wBm!u7pE1<[HAo V" )noK2lFY.Ov%JVD'9NWyFvQl^\[Jͽk3s`nyL֧/`߀yCq݅.7Gy",shzG7_-lKbνl]j*t.|\eQ.s\>h AfKeW}^dL*dʳ,1S5xnreiz^DVI|;F`8l)!MP^%uQRжaN}fЭ=K' VUkƃ' cT5 w:ZMo͚۰#U97V[Ea*3nT03r\|V661+=V+k\eajL(^cujmG-gV^J궮| gKl0Z+Xj-1X3QWAFs[B?/ᾪܹ( d h6xYO&طb|K|XI&#UnR&4{GoD.D])WG{Jḧ́Ɍf]1n4<ǴÛ AϚBZl*5Dt(qIح GoۚW*g3+&7[p*!H|}{Es} M vA_kJ=n`'E UHʃJމW{s`hV@ucR\x{ Ro襎RrD#ki>ٌ}z~7$, EAo6,?(w#6T\M _WDD9Tϥ5+y?Il9SURxR8,+kmRR]D lyA6ɷP?؅D]H _Aio$mτ:k^{GQ48|lwXedz2"1-ǃbom qF`QW|I0L$H7>}nRSOVJ\?͛wMTGjd +K "ۙ$V_MF!ܭAX,\߄l]#\)tI\Æ/z$YT_/x4\-LJ#ͶK"K#1TZXgW$~`eS|vP!'ovtL p6h>/#\  mx }@FE#,lkqI:e$v;73}}˽\= kt,Uc#4Oȣ@ ôk&HTv!^'ݏO!fK9 &DWѬꞬ;n1e:0驾[V1/$}|S%7)pQuCA$뗍f$dN.t+ElI!!\\1˳2nR7+i(NV;$4 ʪq(j:hiː RK$.}$E-oQ(pߏ >o}a8xޥf&[lDk$R; IL!1Л L^EvBFZ>=~ާح_X#ާQ?`ydLi34ql*4L!]xIzQO#iZOd; 캳yPeiUдOnM*4VБKE-V25"N亞]h+O+bc )Ǒ ?[8c vZ=}rcvNf?hp5%/3HɌm'1_@9q^ﳍO n)Re-7eTtr1">{)tZ<(B]#ΰ# Ar햎+8#31=v)ԩ0'Qu |2obNom({ߏ1d$uc4 l6,u$1O߹,D (ǵ>G(_EI\Fd7$\D=Z4 9?( mpH:@W,+Q=3Ϩ2ȜnDﵶ8 Zӡ(e?V7g&1_NGdO ! tϻ#|΄XCI_D [QԮcF"$pnX753Zv^[W?,oo򵺛 +sKK]` 8wCKҷDۑR _Dtt] #]էe-ʗA&z%a=cMCoNg@.hrc C@é@`޲i <*l b,jD4Dc OFBP>ZL$qd|Pf+Wc1D7򅄩U Vj T)2g=[+Kحu^mIc|CM "$T,(&Yf%򾳕Ӥd۟'(8 .@tjU%B5⩂/Z;`j;;ax;8fzH"te7Oc }fPbA)#r$7qL#E'WCKލ˅$3 IxB9ZhHpO!#\ayyUs.cG&*W7ӡdJӀ=sV@k_M})HZ%-G4KPTdCy>t 䊥[Jd=}BZQv%ZTAҐLk5RaFUgձ2Oiоw 8N6s޵\\}oQ&Z.V kU8HFbqolȼ;),Y /*&GEwPF^P(\ґdkBIGNIY46;TKk619e*ƴƘ5"|1?:Mp]Ϸύj3"zb"p@# X] nW?)dK X$ȎL`Ĉ,W[#^:f < ` ⰡstnarRH=8@}J#A9d 置fq<; oC+BZ/W"%!>Mz{Y$ee@fL/?] ][,qfz O(#oY)j^$_i/*t-1FH2z6 ~7>^Ҭ4DQәAYF7]Ֆg>Ҷ:C[.th )qT K;s{(01}7ܡ CL^E+ zL#:Q .!=&ȹ!qR{Xsuv.fKPVMЬӭ+ s?&ZԩB\ QM.W [|=_*rÚ@`^v4U% |  R^dk^zS*@XcϘ%[ʙwlZcQc[MAqYW6*b_8nIuzVH31htFudnO[,G0x\vUx1#GZ"gy~QnHo=ZBN+yGsdu Uv,ٷvo_Z#EN ay$18rQǕ }|p/u]b+hh2}G`|$7+0n 4 DwUtzI۩_l#GVf/=u@RHM}D4TXs ltrD些QWC_>䞿f3JlvKȍ!9WQ>G6N%ck=m2u1 Kpw]oA#VVTb2@ݱxٶֺh(nA#pPre ZVo[7FIE+Sr۪LF* D  :{lot(w:C% iU &kx ^9g~ P9D TeI&ϠR:9Mw:= * qڽ*&eݾanLn֩Wx [i W'y`s몾7pnF4Fb|4XBf w6˦ߒ/l|?bS$\inv#hSL(Mst^;<Z#L}`{^qԜ EP|2KRhQ֌ᆎsKTIG$/;;RΛ5gV?N}9]qR~?x4w` 8=D W+y,vip0'vƅ;)G2p1&a@9N=-7O!~K?xpBp,ʊ5HQZ_ `6_N{;&4gyjHbq "CԺgqtSf;z9Y{U 4t}PFk1f4`^%k j\ed&kT?D=Ka; *cOŅϣ*=<m*P[N85'> stream xڍvT6%1:I(FݝRc  J" DJBBI)I%yw=ws_swLD D!1"`Q>s8 g CQHa ^ PH,K˃eA 8$# -T]@] SCyn|@~,''#;PhP 0AJ  |EQh7Ea`40/@C(hCmr@0 ^? a?py5@(tFJG@(7G]^0(&# ]~9B|Qx?q;nT1BD Eý1p_~_E @_hAbD ]H_\,p?x @2r  Jn mRzxP+ Ba@ Oÿ% tC1@g ';^ sCO ~}>Bz{b*ZBmRUE"2@q) 7C'''\+<H , M?/V_ AYo v0⿭:~3Tn^_"Ws1c{0c/3@e'ïҿKj (_;'.% ѐ ~xI @1Q$ ]QhyJ/o?1;^-4ƯojK0X GAoxua {ҀߒUvwLC."'r}AyQ_y 5YLcIIȩcR`bʻ*58N s3O7|>~4ƅ]Z5K&/(O+>Q;|t\.56i\;S\S\Z{UעŨL5i ^\W szRTS Ta]{$;ff?jb=G<V?lQx^N]vT 7z;tP20f*1vmggr|ib{If ԔJ鵤w!d_Ӗpn1U0ÖjZFI͂#FÍ,ʮL$y=S0'*9kD 56\I.@ʊa Ejq7#utO8:bԸ}` ıG:{q}0Fs½+OWx2^GU&Q$8R&6C-]s+g[8 Yu`B1@eRϪŲZt˸]]-4+o;Ͳh.Bp7<ҦT`B9^V瓊OCY4y9>v )Tm_D`>اJS>B('PަbX#%q](ܻGv8肣wc c]8vRJYm^*~咼NSBۅHg<t|RB&CWs%3箽~&v\%HX9xŦ 2]M2W"c8":#ȴqUץ&S+L67Lwg bk}_(""#"[ {&HO92}I/Nr$q>6 qE NzI:U% 6'p#p,6[ vCt4a(9DKdpDWAܚ7|^@p1vj;׵%?]fiDiRT+ÌքvR~a[K幄^i qFf!X3U0f!yi! .FmR|9!'DވG  O-=-sEK0/4߷؄fqmu̵O`$lT!Ѹo[}Ћ>w;o*XGYԵŲYc@en~j0#4{֍~ʧ6g۶,e)q{rd$_vwn+G;A+CʹF%l''!!:.Vr@eK]^媐W(d\9ˣpT.qHO)YiQzp_J5ȁ.4JqtD<(gOuTQ;w.9Z73o2~%PrQcOq*]=V9qHCХW!_6TT޶sW{N~j7J$b~rΉYF.aS]lCģvE%KD8kOl*lޕh!|N%H~xa7GxCELlyJƎۘ!TA^|z~ hE~=' g٘&3REv' T5tVv/_'*af6%xٝpT}Z gHr۾bgQ&٣xa&w3S E(r1%/Zn~aoF1~Ē\ݹQyf~F $_ 4s笰:NP}9,m|9;\/MHXJrM=m]N)Yv7~ NU7Z8_ʋ\.o\Dݷ/+ [aǜ6K y3?z߲pkkLhÜgHMObr] *g$r7՜mJy=q`+W齙 c6۸[g\FQSPNr,<3F ]޽Ș/S%:LE28cmC3_\o Hq%ϴk&LfniqI&܌flq?Zάh{g}VWF9c x::&ֈwreq0&YMk-iU:.\=8LIfv-;?t]5N?"ӫSތ4Wc! c <WEO&)?` S^}+~eP S|OUʗCB8ctbys5LJe#)EZhq'C,4ϔWϒd#Kn5 Wr7ݾ^W(+HoK"^!uc?6r8|U^ؿI^ $Qsi&lT[#OJd/r:_EDVe '4gm5\ Qk#~G SsPdޗhእ*C\}ekMaZ+ 5mNϐS/=bvIxcEv\hcyp3TǁxBسEIUvcy536+a!39̥m iS@Nqy9Svit5bFb9S %:k)z3/jPK8o)Vm7~o-ؑO6Çd~2oƿvf3`$RH)\/vz}U2u0=דW<_mì(YK$ )5D nsSq7բ`9Y}؉s }.6'5oMILd_rlM_oU]2ܣx{k<{y7X=^jM]/\} ;:/e\*E&r"FT-0kO0 y놚f{_![tY%zmA }u 7;ގԶ"Qe2qs]:pӗ%n0M$FBHχS6(fg^vjQ~0tKrљNB0y=l^FxaM( 76ra~()Ś`&iKh&Rk2v LE/ ^t SuzDqbwk6/!-U93ejzz|,xM#;mf%**ϏӦiw˽EoݲxC$f/Ol?>6+{9o+}ei+8bl6{ڧTr(Tb+2Ib,]]NU]HQ2".'.#zs;EOg\W+}v*bAI}Sŷ]/oKX_MTɧ <+~khf%62!-ؿ&j? IaQ0^5:v8o^y '!Oxl;F}촬E1J"uG1E G U[cph\4mNw.n8?7Du 0lu 1}x]pW%2ſs|#'hE{ _0~ű pYlzi1#IS2@ u>*P!Cn*L>7@zAaּ,-]cҬ;[$Avɡ\y")􃁷 l*_k5;Uwm"~\0Uq=0*vcb׵s jHY>5 mPLę錗v >> stream xڍtT]6H#]2 CJIw "%RHJHKt%SZ߷f{}}ʤk+g )àH^ @AK!@@@O@@0 *v8 )Z!QnZ0(@  @1 _0@l à > w@uppb<r 8 вB:Qm  W )$EÃ?x}w~h[9~g: `vH+8R@6 (5M '`hAPVV`5wVe9= ߟ6p C~!uJP[3DO ٠n݋X0g;0[7PHMO = @^.jT~>.0 lB A$ K@ lXP ?d`Ox@'slaP?od&yy'WH+(" Pg_ku&OF5 ONp.WІx pC{3&e_h(A  ӎbZ0^@ %قݜ۪Bm%`O.i*= _ ( _6Ԯ8jRM *fkEDVp>j(ID--7|P@),G=Ve|phPo_mp:߻ylf`6/k^WynHOn>y3os$I|?K@YDvkSNXs^˕ef 1тr= x[7FANM9nt=UI'Bj#ڧHʔ^q$I;} 2P$5ζI6B!2wFJ^]Є7rܸd{)ޣWuq $Ѥ;znh_ kTҶ0@\Lqb5Hjk)waPBݷs LF 3;ȫ[$~l.vv s1vWssl376Nu,ns!`/IZsGH^KOYo।bA1u#߹N\̤̯N53G Өy&X֤+ZmƐ@KئHUk{;Qu=R1Rx[)L^wMz8W+A4&~bOE Mz9`}*2Vjnm؎O!7q>^=ѭ5t+c|16p~9zo iSH7=j8\7;3Z09) T(2TAIS=Qٹ'@F.XX>>pBl6%A2֛+}hg#㼤y_ߵ][=cx`[H-̴cjTs4q2NbYңR}~#9 2k;;*lYkuIgwvu|l}I/%_wWxg{]S'D1memb\L1q/or{W};S^jхyWWo SB w;iz-"n2WnAT8'EXUp.&X=?ls83㢣将>uqC7)SeF.pIʫ֞ӓEo~=蛞/˳|VIFywǂL{EN "z2qG[)l,ES<} l{ʮcC\\ \qRH;dTWzJv پU[s(Y[8'oF`4xHi)&LjBM39Z\0O6~5I{9i&#Y~pt+77 0/%~A:F4s$7 c$L^ļX̉$QEbgyXG.vQY'ЕN((S<@ǙGej= /m_O޳DgQug&;{<.*iZ} HތHK|{5c9^ 鬣'n!dY&9b}Pb'FCX)X[fS:v쳱ͫQc8K%gg'r<)Ժ\YPu5N>Y"i{f{גMiI>-/tи /- (S;H7L"0 =_B 6BNls99#Gޛ&;3dl ያ4? M%>tgUO QTҤb2G(cu۰*,;hٰ)#B6qev*~}l f.k "i34j|nrڃ> G^oqKzteZ4u}[ob<5w>+6?J.S KnW|{#c49{j y}>[RgJgLsڂ̤X #|%a™N|Zp"M/UÞwZ#,6,a>3{|p>d//XDGT7Lxr>Ķ $gI6CK2%6Zˌri`ڕ7ʬʚg6JVqWBLOsf~JX;*,QWqۧ>h{VZ5!k~van<0=?/v݄}),43 Kw߁X2[ SMei%!=uF FO Np㥋ћE-Fi~`G'o콼5E8 ;5)>U7cv<b$Ʌ~q0ўmP i qloS)']|[qmmzؤ(P -pd$<廏Aa3HRhI6_P-"f]fDJDCmql6g$'߫BGRSl23mwǑm \'?1)89GJ1ҞsbN8| RH/^Q#ˊǥF^ؤ>qm?Cʘ\m&z-R{eK7N@&52Ǹn+t~ wVҾ&;,nϧW?kUgٜnog]#vPR-&7gOg7 DFQ!3+S>KȍԾ--EEzawsHjgX(JY|z{A "nBܥ3 6A'&DQSns-BU~QKAG>\pt,Dv% ߋNu &D9zݙ\0Dk֦S~;В=}^6%u[z0JNz#/bi )$.^28L2zgfxck^W; gBK68j@oi7䃑927 ? EA.;ZR@7 t+ǖ8?9h!H|g^OIf.JtuB* O-c4<ܧ.$Ֆ'_tv/YMhe#IEhmdaWtB| Y8ͱ20;*Lk+ڶEm}|Sڏ.wK"(yw `aJv{• yqQPb6!e 8x;EFrTrAWKIrr3H+ lC>t"9QIDyTlseV>SU3Ɔ] k[gpk-:a{Sd *7Uyn8BUu1;wseyEᢳas4`@Id+d7H%ri2`4Syeկ!QgKK?jd#c4CDgIG>{d[6> 5yo&+Ij_lGt %]S티mЂ鴪뇟|vw-SȺ~D<݇recnNA+:]QDj(jۅ0Vn  ?haM:_y;4dx쳱[ǷF%lEu1/@ڜȢƥC$h> k1'[Z䡆F_5vQ#r҆up(R?*:I[h7(9[tfm^m7Ea8~QheZb78gW'm2̇CD5 @4Vh,ir1&X5{pHmT;o6mNAYI/algjPZ-H|vVr~inu؉w%׆۱UHF1_nk#ZkL]gw50Vó׮Jl.:{d;77:U} xyT.Nu@!נ)3nYJiRW~lV84#`$cy8>˄) ܴQ JhoܴX=/8;Sk&|f#s:oټEx"Yy#^ꝴ+c/&{XORa#AR<7,bk=3{^;"]QNJt{zUWaHZzgI.C&6qDh_fp:%d`M"N(E2txxPIAj78DE2%2Fa`t],>Lx59rd34ݎ!&RJov endstream endobj 101 0 obj << /Length1 2421 /Length2 15243 /Length3 0 /Length 16657 /Filter /FlateDecode >> stream xڍeT\S;\. vr~QcT\{._kCA bh ttpc`ad)ɫ0Y((ԭ쀿O(4.֎p\&n2qw@`eef23 76(0dpbN.֖Vn@mF`[ bt63q(Y=ͬnc͉ӓޕRifP]<怿(Mneϑ .6:+;]j2%'?dheoe33G{'okK$)F0q0hboabmgbN;x =djbjmWLy/=ĭ]ffŶ_;1i8X;ezY:^fVL9Qv}=_'G'{*@k  ` vm] O@}Y}g>gv޿7IND[DDߤ=u22X,\NNMoà#,L<3zPt|k 3s0ޅUV/+?$ng7?vw{_UqT-?4v2n&"`> <]%nfVj``oS={@3KiJ89o8Qc9)01:83X8ZN_I70F<&3I70FV~w+"w=߈~#vooO7z/yG&"w{́YQzwmbbZ!qW-Wy/λWO n~;}+ܬ\=7O?cu}{y>@Eb^[;4[Yr4 x"p0ϩqNg֧c[^pǝ#QeQ5 S%i^.qftxG*Y]՝hƋK /Muʹx&Y:儻@{KoKFȃ' p`GRJ%'Yd <hx2l`-ýKK1vh:46~*"}\抧)#Uhd-E4V "R##$9tDu?/U^C_;ChKH""!* DyNc91oEe=ʹ*ļfpM8W.ԯ΋zGc(7 7w@jf+#=8 h1/0R1/ع˓gtue#1^pUDޕ~`@;Dwg dsKHw2 {aLեRR1S`EN/Pd]P:C݆e"GDd۠c8OiU ׂOL~=Qײo=Cw7:8t ӠTkG,Hbg:и(-NzB@133%f}AQɧd+_%щ|k,kb]as *])3Ղ/7ٜ(vvd 5VrFƺe0[tOX MΛo|sxFDoCO{N/lt$ZJMeqtzv={Zxuh 5%\tRv> r  js͑ rQ.ъJH&Eqfp2ك$W\ٖ @roĵn <-aa.= ى> v,izU{uaNz{fnf69C*; SFZE e3hӌDz=/*e -V_>nXJՄpG8MWCQm,v< ΆhPۓ>bi/;t9^zT} ]n~9uD&x+fvz#H2?gH>P96%PQL՝zeyޯgPɐ0;~lVEU>L"e.P;6@1OT7 a-02jֈ^'J**\œ|rx^VȬXg6O5#:qCfD-8+jp,dy(QlI5O!S$ա{G&-H^|wcƵ_^Hp"|rfsE(y :fY^=Qg8bv^L8O] \-7_/D3.5wALR_uz,5?k\.*EL7#ʏ*bHOedI<+.fΜ}G)pbZa*<G(jZ+ &__1^|5zD)dzwɶgxcYpR*Y( .̪]u&ֆ/g Gkjn] {b HG/ aT)2?;`qױI]Q9(ozp5ȱ)EҮ3Is)YUHLNN=Ҁ1l̍5a>$\n.Kl t&XX9_?4qlJvf/Q7 [.J]Fe*E|- :cBaJiS=0nL[>?\=Ha t<9BV|M6iwp]m5aXJP#@ɼ1v fBL?ÌlHdt=ĉ& ^'toCyP,oP)xR!4!|Uu|==GCVb*A/)}OHC(h2]\@cĪ 5%yB0Yd=jfp oxFL,\6cnknF^2)#AAj7\u'Bc2{2[gtkfp9InqQ/`֓,ԒcXv9= B.O?b->_{ !s}|'Nʪ >MLMjZ] ¶"Cu߱Dhj,rR?%U E+%hrڜx.7's?>Ԑԁ 괔`YM_A#*~ŃlX]N6p6J>JJ8M* ?cE4tYاɼb0uDsroˁYv F~d<(/4^tb1Q{RMSdX}V6`! %b5/?6xqְ.Wh7EI7͎m֫G\l:+9u~4$ :?U&l[LbrnlL/]=2V2賚\yflӰA'2<6qaz-%B,.z3$m)3ju\^#? ! y̍c/|{+? ayTdz4J?n4j;h஺ E߁SoWH|@Wk<.u>POkmU9:wfӱM NS ;^>M2 7BeIL7%R^M&QH:` >x7 .W\ EC4L}HoN% ׮1_}˅$1:\#d:|{0{;̊J8gj.c@./Į7ZxEpIUAdFo8B3ėg敤&25 "yZ> "F7wJ{,y>D, р6ʑ;CBfF86بZV]rv gE?{̣fcZ=b z̗!B ge*XW y" _ ԰I{t^":ywӍ s`J?eKi'$2`Ew(2A+/KXy wm+IEâ3".)nI}TVT.`/%S:/[L߸m6Q0/|Ҵ_K9c?ﲿrg,m67:Fخ0+b1tNZԎ)H_R0]zK7})b< k*''QCA G/K&ϛi L[@ a83fLpk$6.}MkGӹbk,2IKi ×ٹKPzS|IJǫu$uZikE`=WGpX7ou;w|oI傶x*hW|"_lAIfr|kq@AƖ'! 3H$lDId8*&{'_yNvDb{LlԄUZn:HIaN3fYU;kZi\>R2uSI+pK#ߣ5SH<>:bH|9eIJK'~'nX-~֕Q|7.x!y=vw|,Б,_GMk 5S5h,"ŭUt?|N[7Msaۊ_`/'2 <2%c|_f/c`ky'WDhcM%kzWBi'i3wF~_\Ea81+o1vY}R R4h' ͘1򌌃)HԨs[ӸVvUsvZ2A*\EAޱ@4QO@*EـziƞDBon"OQJr߶R]'A^ 9X酊:NU0dHmdHc[O͈$vԂz̡`u)y:cZBg|^"wR[J$i/J+z8ס'MX_b?VgĿh \'P\yv:I4ta#j#Sw* y|;h~(BLi gUa)& :3˾-֯f>2FrA6[^5{n!tWzC[lT@ע2S+vtdґ"sfCV5ǥA0nےtcg4,6I䵲2?}V͔ި`ZLbw5e-^yNҋw@RBAɽ/SK_El= Sjt@<w04^|yn>fY)'lbɎDID.X- ^_}7Wگo5I ~r\$bsEhc~7|#k(5D~hG5R0,s^#b >~t_}#cq *q(2a:kI'h݄ͻCOrLB]+pllL'B`ſ;s$XC}G_"82Z#P'$LqkbAQĩ ÜcVYbB]F&w)|c=hmHv0PnBSҷr)6 2ЬG#zAx|x6o.u/ɮDnxTϓK֋?A@ y洯i9o]@l#d(J3\6,6 g & YЬ ѢhLsT8w+E%i'.tJ 45$^6 O=mUCx,RwYӷ2bwj{qT$ӝGn3W1TĨ;ݺ6cY9hA|CTd`s\W}ZDn PxB/5+yTb.HCTB&EV;ﯫ5‘Nh 3rY2\e̤NwqĄ3lN# < 6Z#&QME5Sy$Gv6v/c^:>l.;1B&n{+go/WKth c akP<51{i= zƛG+CxJK!y <ҴQ #hT[xD(f鑮j[Т1~,zmEHv}?+[>'U բͱRr `abSlu[ #BT&~i;.H,w^f'6XRf$՟r] Ueu[V8 j_ ;^7:>>x,$zeoOÏ  *#V @JZwg~jt;{Q[師^>꿸U0 u" Zh?+>#7{]`@ae\dJQt=F*~0pdQ&Gc2 tHO"|cJ>X 1;XXZ_1 MfK=ĉ(e.514 $,&mmtOV}wYAo5/Ml.= ֱm"eW>()k2ؐ1Se-!<_SVPbm6 v^]|*HBkjS1>lI4Ol}+wBEmS9-K"tdt\n[{Dԛ>3Ti ]XxО۞<6t5BB~A jX.wW ,2@cF7O q9r٭b|nS׸<>mfvܳo#zXҿi}l"zY\AozLkl \]ttnyvhϛZJ//1 GO p}nABll0p3%yd%:S@k+zL[%/ʶ9Ћx[UqV IWjlgϬPe~͠[2j"Chh`LdGqm(dK.[0=|8F'p@ed#wv|J4z.{vd}va: ;G ]^Sm!_Ǽ:kp>iyqU1zm @@ޒ`b'  hA͝$VOTW/E+y x8*jwe<>MDơVa7T aOɯk5ޏǦ`cAwp=#ŠɃ G`!codXT~̥*6PNYNd[cܧ .ʲcⴄꭊǎQ/OQӢvX:oV_:Ŕr^և`Cs p~g0l%=0?BJĶablq JU34fwbN^U,!s]+ʍrbS)h|ݗ{*.{g SaiFԾ#;ujD! V@/Wm|c3m$w+c=|\Gk.w?N>'"?hMҽW13c7sw]Ёzkqvs!Τ4V>OҺ8mx~gj6ɬi&^>+SsPY?mb ˌ 5Q{bU7M" VӰst'[O{p%4ɺl>wGRg6GBB';JHcqR?~:[+QXAim{beKkD\e^Tk0YzMU2P3(~^U 7a;ǎ5-O]H!RޫCY1Vnta%kQ.pb| X%6VM\9p@S:o,CuN~8Ao!/dp/~GSNE[Ώ}CZY.:u^_P/}>Qь\+|0$*k!];]sL:PY`V@}ei(>nLϐmt le^8-LXQ GK䗶NhgKu\3X6)XmV7ǻ;;`% Rh~@$aG)*'S-"~-8X`#D7>ǃT&I턖.ަ2xN(YbQSAEDUs G% )JA}`>=kEei*ιj>TTѪo_AE/$VF]6w]Ve02P N9I[Kbx-3>5\=w td^A+XAٚ? 5_sa0ttKlZܑW@'x=>֡fZELl=bhm+w5 uy{[lǫo%t|꡶r$>K|.;)Nh@'xm/c陗 (2+c=יl*:64WMu jGtQ9?m6N()zj`G5 TRJ}Dhjڎn͹-57\BLRd.Yof6= *ˠ$54mgrk.?b jx"&Ƒ(?I"倶0L/K=#Z2 d+ M3~ͮJ{pBvmL F(v:C%M <wj8!q{( }fU>,FlBp~{ $ll *xP*QOQ<lSi@nE 0cP*Da^^8[i #Өr=vZRC''ŜtYKY}> 47*DKbEcΘi#s]h6'"9K{SbiRFYP@|` !E^7+Mrktxv ۯG5 3hU{ AkQzR#,?DyxBGxT/9&W:\enjٛ)Nڍ3S[=uYijAZ2zbݑS>_WCac*HAnT}NضfpR;.A.f:ua!z/!XP+f; al7TςNK?L7U'HwZLȍc RHýk]H"5Ԉ z@M5h Q}gs`Fĩ~x 1 ꀍ> k0ovS:r4 pBw'Ey8P777$>>l<=H"+QncH8ѦQLU*L&&J̜NR :ڍ"P8WY6B(G4IEqQW:z#{"9k@F)bbƉ1BDlpÛ.b.C՜Lz_62ekh`^KT /晸N.Ϭ$J^;Q(}(mI]%vxEdBOJ-;ŮNIu3Zb-ʶ J)|B3^ڣ~ Y )G|2 fMv9qMedFݢֈyL6䂾 v5n>q*}+;0!J-M,X{6ȠQ4N(WRt뭍ao?iW5dMO^Y# {楯s^b.0By@urcC=[?R;XкMv33mr+RsLr{*|6lq>? di'йG&{_(B]SPԸԔ$n E3[3Nʳ/Pi<Gm_Vof>ϚܦSyac|)P*Ԋ{f=*k bKG}#u(s*"31j&NNNTf њ xqyVy)9x`_Yf\ TT 1NxzPmзn}4u\*vت.M+3X4 tasnzNggg6UQt9V#7;N@׆@cA01D"mSG9Pyk,"nOMbniԯoR ._N}Io=g?aGR7b-W|%B\$,՝^4='Q)p*7J&[o :0pZPEhub 7ꙄE&^T. wr-|Pn7o@7Kԥ{A&)L!3%0c|Uh5֭{/?vRaɱV;^j+'`SěP.:E6̄VQ؞Z(.4igfp)}pIxİ&&[TZ1q>_)vq:" ):MY>PuZwiXƩ`]?.f3U"^lW3`&IFaԶ\5qkUyocYI5zɹ]Ri2,NHMxSn8'X'(ɿg&̗TóB͌ZɯZl %t J endstream endobj 103 0 obj << /Length1 1429 /Length2 6266 /Length3 0 /Length 7235 /Filter /FlateDecode >> stream xڍuT6 MZEJBH'*MJ$.H^A@"E)A@]FuZ73̼;|d7Pt@ԐX$ T1 $Li ǸpރyH =aP ֧`:HP ť P@@A&Cp*#Q~p'g ߏ@{^ XJJw:P ":P34Bau`PBB>>>Pw I8 ah72PCMh G0B:b|0 !/4hP0_`? UOBpd=EN@G -_@͇zCnP;,ѡ@5E ?'A n8 *fU2I~O ޻П">-G8 / `]$90@1$),yaB`_n,tҀa4xz3O :1@;AX7/;O/דVaH߿G, 10V3JJH_`8P@X A"@ 10uuՇ#( M2x /tX=À<}?/U_'Rrs ġp7?0Ab7PS_ s{wbwDչXT$V{翴0=> f@î+݂ƎwݬUE#~8 #au&,& cw[@!AMb9$ Pa0t.oy`-I'2.M'U >+¢]1Ħ˪kʲ"Smc[%?]hA_dJN68-?;Bk{ jZ؊ hw~9;Kﱷ2.yn[ o >趤^xbvskѱzT&^aŮeLMra|{qps$æ;t[CDAԇ>AːP䝸'{)'a3PŁJ1ԡ,x䔚/z$Bu iD3afv"z?Op]c!w_&}KnS5SsRd[?T/ ElC RDߌ'{8JѦ|O^Kiy$؆aRCYbV(N]@vL ,ZVXbFi?5)9w׀*EΰP˼,7*С0gh s/GwP8 u'ݴbe==@+Y6w:l*_7yMZ2eV)OnG8Z}*lRf%6ղ+H00/ w[0ۦV` 34!D7m c4ŽT:}i։dEʊ(5BL(?AޣnU_+ka۞QW8 q'dh~cWOtͱF-y+I*쟣C{P]4_b锘V\cD=M.H0F,0,vN%(PK;܇'dkU+6%:,K_k$*q.3ŠZQa5,; }>g.MSQe*JZm9V~ϘWH>ťTA&.OQ$i\UKx绎u}rTJaKZDPRR|җ:d pUp^D ]?J9e夣+S7Md'r~\ J,Nx'œ A. R7:t'x'*ɫϒɇUKx!hOxzh,)Is`T{3#+h2>cA{YW ݆4$lRyJe^oҜgBWNI-9wr}odn1@WۄL`qKIF\XiTV̭*ދX`LYMm](ʈ Ht`>vJ .l'im{A$ei3ou |z-VeV]Ṁ9duB{'=WdfIAu77dK'@EhȲ3C;ZQt8tg Lԃ W8 .ZojNyuي}:O]'"NUd _Fn]eޞ4{WT>̞ϔ;@dga*0V.KMsC3*uK➵0"%?kG NGZf 8I+'OP2.*i2!%!u2 {=9⧷bb$'qBwh<9E %*gnޏ4>5Lb{}9TgBb0FδG5;&( ^׶2|DukNh`q. =f )w~#MT]4w[mpQ PElkQ\AK)χ#/s)(`.5]!?`Giaf_IUu OZ{rГ02b%\\)ۗڛ*87.ո c}L4pňbawe3+oVq?M#lK/ߣr9aղcg× 3VraD몶iK!EۦVO\.l1JJ!ӟ;Ԏue)f5^i)n^`V?ׄ`2@HZ6G =9Qi͜LT {Z m `'}[x?(H9aR$ $XydN::&}8H_n|*9d7ςܝsⰰ{~j" G*8l\a!ar1]DM?hGZ]}<<($&edmC83c}4$ѣnEε^ oTmkQ/5ü#_-[rG8ZD.6'Oy6F~v;q9}lM̼wV=LJ?oxͧnӸCZ7ϋrcZcBKp'NGc2|_].O셮r hT YTৎf^k6͒oΆ1F67h8Keosy}S,!|dpc&}/(CtqΖCBpax/#܂x?4Z*Dwmxŝя̀.8gb"Eߑfoh^'E]+Ev/.յq:Ŧ=Cs:# ηfh/c,?hb<q&k <Ҍ\g$zu.Wճ/JQ",`.%:^!RЛwzM?pg ^(F?tPuvLn ^AfI;8Fڹ)FQp(dokӬnNAH^M\S8 ،NN`%8e;qvYj5brSyf n%~Pk'8"׼88x:AjQ\ LS(83~\nO_S 疛L^xtOGN+;/%JvLZ5)K wL[)ue|ےSh{|sScrJE}A6EyVpsZ%b'eJ hS=3opg9یj>\m.<W|8-QlR|Oh8Kab`}nF$*ZL88d~cێ,^3P}*<-c߃mA$z`2 3xRZ\"[`t}љfk?_[6> 췡uF:ѓK*[qGE>NIC$ص$bz˸Ǜil[5{ .ӦW`klq;7Cuh_*i% qQ2N`2I*48y\nhYVB0]t3&b#Wï%SaV|+:fiuE B7Gxk? >T!- `Pkǎ^"cnVHҁ'NSrH 3YK/3 wA9ٔ¿2]1j6H˜+M_N.gd8_|j\ϗDɽL3Ni&EOEb#t&GZ*rz% vxsGTEWq9fEܚڠ&sHYHM/tLonIR$}Qp\P0l)i$"E:9dλ򥋡MB´dfY,ĿX>tj }3 ok鼺7p46G}g ENǻ棶Z)(Xº4It-HH2p3C 3vqrc $"ӵx)kgos7 '?x^.1PscVyk;8 paQAEt_('Wl?(߽nk9'*_Qu@=Tt/9k@K!|eh2*WIJ'9~HN;ǮwW7$鞨x&Ҟ]ޛC3ѻa\&`7gZ3 '/ٟV/pzt7ثXirCMI76F0W:x4X{ٰ\auSėm&">aۃY7?M;+%~Ze7&zwбשw5;I/prSSagX YB lUˬQƘ.'ںMƫlx, vjg|=UΉֺq 0v[Zx2h/LZdHoM7ev%,Vs>ku˝|}us6|^Oƣ3*9JmKCXM|2AzCΛ\Bx/zm.%$ E!qM?ecӈt $[N7]9ER_&&kXAK k_@&/]3JImr鳣YS[EU,EJl8=ZmL =1)R^crۋ l)aP9"䶟lw)C4\@UtxH&AtNIW&|iOxBf(I]>ki`³sb";i>Dn^l "lSHʍӲRʠ+<{^]=>8@v-v7:wVgq+rDKyӵIQoSK ZORG$:3c4-Ne-zH/9MV~mԍJlxBC{Fe/hQ_<"^VD6Iπը^O"i#o_&!O ] l6D z xtB 4p +I4wyq 7UP yk߈cB7%CF-݈b#MKHpZd&F7> stream xڍP-3 dapw,@pww ܂@Hp{sޫbfuw.h(5Y$ Y+ + @JEKΉDCejێDb v! ڤD@dgp M; V"D#vrr}OC@p= PZ_+`3kruudc`ڻ-E֮V dC2@hK+ @?Mx5Y\^CA΀Me#?dtE`e` dY]=]@?@;k<hm4}%: +|U>3gkGWVk?4e̥ W?v_kpYX;[!͑M Մ agg O3+? hy9tra~vXY[^|\ w#$+dioW3?=`/ 3;yKٔu45SR aprqxiUZo,Hx=e5- +_w߱󰛽^?C&,ߎdbNf_:  p ]d=A֮fVNvpul_zݨ(`6c8yx@gg|q|8^whX!Wu~ 3W`'{E*"~? /ze^_$`3f1۽ N6  YlV@nWh=ݫ7Z7ڍu_~}P6ox_됂kkm^b5o|7ګǿ9?ݹsZϷ!,̈́BmC;ok%=XDht2X|VSjr7%R1weWɟ|N#ړt<>'ju - OH4 "h>9 nQwrGS/ľl*__{_ëX%V;]Чy p,XWsXy/䊉LH~\>[qw Z.ԄWX>iK>%1"K C侟{( W&:؂tPs4MOЖ,<n%Zfs2_^XR-yl)JMqy9&%SHˡI̼`@kKIN<ꮰ~paQAP2$d)X~ÅkԘopiV-U94xc5bJe '5ԃ[{_+Ew &HW k3&=Gkb#Fth  i(H:7{fW6OSɛ6co=TZ=[q&DOQY+-|إ{}y+>t[Nϰ~Ґ:V4mcwmN1CRxd/;Hq^A1xu!s+AV_/OOOb]AM-U(n#!F~:\.Wȯ>6gfHOJfɭ#HZBgvA&,MW,7|)^@ZVNי/cicsĬ~eFl?3BQ"DQP² aP(c+՞=.;n*rŘ7O/R33 _͉K:(&!lg-6H"٣6W/-⨳e4X>~/q 7ʡxb9-f+kyW> 9bxºy3(Z3X}'R,@skn 0%v+4O0"'ϫ^0nbAqt񏒇R Sǂajdt>e <*55At/?>4pNOVJ.bϰ`Bҿ!Х&TAfng=N lK̏2]mGA`eDKT[w\hx].U,cT$@KlIlD`}X<^>3tij\9 !s҄VAxu z$Z l+z[e&碘F&dUstpJtJ;sty92[̂*>Q\rhX.tcdX2`o.삁+ڎL~d}3QbA224%J4xLPlj0z#尨 >ndEK+^A=[s!fde@ nPF1r^Bm}vle)۩= )O(=Ґ ԩ@a <1Y^|JcT O;vD3.*&bLܦ~X9XXF_V??r@>.K$Pb#r2CVv~!@S2~~ON,zʧ}jv09 _AЪ>9uPut:JY*:7f:l&jijoeX8ŷL[h?DE?P|nK䙶Gl*p J9 2v=gVd Jb%a?*Ur_ToRpm(db PdJBW:/4)W0cFYSd,Zg9^z&t*MOU5g*TZ$10bgOI݃2#'Ȇʁ0(?Ĭi'p$!iM-*Cк]ԼԸ-~A:›6{;|Ou ATۛCpƥ?&ϥ'Y{j82 ?EPWT7kцxڮ͜B9*!9zT2ozjqw}Mn:;vy$m83Or)8| 1-m̶= FIf;𦶫ѯZROKT5 C;jH3jEos%5@vȏ*1 ܥ/[ R۬#C0drk.pM:o^AkhM3*7 ԑh,&`Bz*qQ$ӺJą/nshŞyc B]Gu}x:[Iѳ!itNdmϸƋn$1yӧ_4Gm\}a|Uɛ/3el+`/lzһ7Wu@D 3.e* oӣo3~m+{s6i/G92J6P駉7}h$mf-3sy΍]5–vK5:~ܱj |"p:!0<@nxxO0t`4Px)l+]!F'ti}f!Ko>k.i3ة/ǛbیE@yt}& a$*6f; xWůBt 0;bcN6?2Nr $FfIg w:xigRa}~F\*:?7 3llT?3 T:O߷w&95G̢,}5k-I7acVȗ?V@;in<4qb`$IH&fm2M1L߷Zj`:j t~{XW"[v[Z~YD~I󡗏T/,(/XYw^ D|zGTcOcb)Y;$~H+9ԗ /?q1uد?Ӳ^)%ǻ XQWdxM nHJ-b夝*F`TaHs H d% {K^=˒]@S#%Qٻ*TB3 昤VK¼% 谩Qݎڷ 'Ĭ3xWMdC졐 Pxґ PMFX[.J?$Hdʞԯ)W_(]4Dx<? SpP(|UT`}[HQaN(6S!:0=dl! TZ.`7i\u`&flbˣo|#)kb폿y&/:t2ɜ_ki;f%Ï"lTe3q~0si ]z`P|WHd̻{ )w{=Ecɚ-2ON?Q(X/G{{Un*GM{RJTӁ>`l}YPp+ǂ%%WRBoFE}>"XaA5CE-XM&Sp)ոkykz^ɣQ4)* DRMj䒒JRwm陏&߫|jSwpP@P̽`b8"㘵olqdl[pz&ބ{Ii37 &4Q6ggP{͔/=/~y@^$ԢH/56{xpoZm Ja{0?җ͈ߪ U1.? Y-^!w3PzgSICrކ2BǽKe=莄y!\:<cS "l6L׳V +(Zsz` ^tfְ@νKʣy̜t+f7Y+b#]MS,h *mq].訝]"B6iu&̣*%3T5X^/LLld|Dbd?1 ⫌_ \gg@S4ѕpy  8>!a(ӥ}L0(]g@@&ygjvCrUxUAe +ɯ#hpZUi֓"KmG ji71:吟`*qȪ]c8&-`hEӱWYӇ`i&|>db:=ӄ{Knţ25Ħlt8׷Tx\yR=x{A?t<{5\${jϢGHpEb:PSs*كYੇtsN~`@) XgcHiF_M[-- PǩLKaGAG_o:ăEJh\ $]Gn 7IH/J570?qNkm~gU(td(~/} rhUƇM`׶-_i> n^ΎzRb5ShG|Yc₲fQNI}޺td *ZKҭ'C-{lR.Ͽ0ꒁٔբ>Y!~ ѳ wm9@CВʈR:7׬GkH-Пg\3zDJcO~}zNU!*@h {0Qq4 -փryhpJYɎ4);97kYfNk' xS*zN*f ۂP{Tp|V^~ٶrKWFTȫC97L'8~k(.+l{0 <0Mxd҇En+mxFW0|dw7gy|(! +i@8^[)VJ\4'VloAXBP}l, L T`?uw̶G ڳAPpmAAb Na'3P}0/WYe)co>ͣ%+8h~>{N:/OIzJv*pf?y>l0SA"x8JVToKt&Fo EGG=E`VWRHݒI.rqBs%2H@P+z+c+3HJ4Z Jڹj`U4455Db/0uZd}WFMX{;_yx_,7* VOҦ[v Li%a"`!L.5'A9[=b*6^Uz0)yfwe?1q0a@ XG8A \ϸ60n(#|sd̓="5ȀIq3-+?てV$އ' ~l'Hf>tt 9e}xNH!u-LIHJ,\j=Xro车 pv)t'e|c锔8==TOeD CBBJp 0c|pM_/W>6i$w훼51m $E[y(]$ʋc}x8nTo4fJw~zWѪ0fOѤpOk!A0؄fezN$q g9Fa.55mu XLʨ:IsN"#NFbCYH-\~mn*k|^K}(ъrѹ! &@@x/³МnKFSN7 ox`xPk{V04@a-TU-fB.E~"x|7cEίYukqUCjOtA V,jXl}FX_NfNGb RZh Фջ, 2:`"AR.SA/\![jB._0⊻֜'ԗ~: > h~{XQ J\YU= |^/q9O% i֏mJG>4bH;=o hle/ɾ q8SE̷5L r$S9tZ̾h s]4ћփR-}@{W:.DpWK<"VJ>:Lcֵ_f(C'vF&C4R(,yWndV8eE J{V 9 m~ }'FH ~nx<9V;Qu0SK/ʄCC^H^jxi-e}PBSסh\ ޻l 1` pqJb+!G$\'^z$SZP븘4:z#2Yε_j+M_ĩNci)r̀^aB0?)odMjZDL@fcaDġ8wC8:V!k f؈BưhVN!H׾;%~B1WZ]2SZ9j0b('߆ Uu7i14̽w&p^Ch -Ѿb[d`p6V#yv[{oQt2-{S}6%͔<*QhT ӷL=*G2avwgyLWG4q}nv"C#9gڃ34wӟJ_w@%Df/懝 ԁόMm4@۶9N'A5K!L͞mj@[ty׿ߔIOQ7Fd:lJXo,!HJ5E"FGߦn%m-Ӈf޻E(<@Ϝ\RԜNVOVL$ nDDh/y c'SƗiMנ-(Sd#fD?a lW [=[yI Z$\O2_N;NP6F:z#&Q+yr/0(}io|o(hX0 ծ8,0;L1c=tbX c񞥦ji96vUMPy+[7erw&٬ªFr۪d@hbqN(_5t#e8uRHL:YI5ur4{Ă'%/H`o"Jos4u(D`٧k|Jd,(z=}ċ>Sg` e!2UmP|_\Sc.[>ʉKUQIdzns|noiY ɧbJR 1 ;yH]5gB6z!^q^WNse%C9B{wNI3{TE%*1fs}cq bJEf:| u9 yd+=/?_b)6U"zz5E ?\L R:se=G2%nH5Q;HVj6rQ okjY Y\ķDG"3[#Gń@IŠ}66N Z FStˢ&z o7Z֔9%++˧јLJ⟴q} ݰ t@"0Xt۽ oH*~^KZ`9a@  Wܢ:9}+ ~*[`= p#'?ђ+,44V͸8.l;s!!fH1i21(3ɨ$=(֖z~1*۪\i]%('ƥsFYJ1ƶJ%  cq^)*/mbWd Ui(BGX_/1-)۩WhsMdQ":sBƜQ:{Y@:ܣ)E*83'h<=,E-SܾT~Yv*,7^"z÷UUh ,*;e\͵"ɊN! &ʮaު_I"`0\{"mqvW`i5h{FƿVˬQ\Lom~}bZ5qi |/YDӈy*$).4KDb<'дځKy[p%oh'ħEa+LD~6}D}%TYO.DիFXʸC=7<~ffzF4}"Gjlr=T@g:yP;Z{!I3Ec:X{SWTPxpXV*YmZ͸~Syvd6lI i(Ly$vXpIn1pZ_u-5 >b{sxfey[6@GWY$ǁnbT[yຂ^P> stream xڍT7N* F`#6S$C:F$A:$w?}}n;Z*5MV sXErqT8l\8Z-_9AL@E'['7O C_C\ tT0(V fXZ!y `18tH؁ P"vȌ -@n l@ `pKQF a;`sʀg@;/jl8-+? M[ uD8Ap2;@SAjc Wsl `v@j ؂lW 5au!@- it @VBD2#!?8l \ fg"q~' AȾz\(/@-~0wg׆B ҿl"?2K0 ; + ??H^0{ bFp:o''B(ΟH1|8`ȁ?NǏߞ#'uc5$ Qp 狋QsAa `xRv?]FO*?]A\ 2o$D? ـ7G[8V F?nDUYȘ?zj/_n"h@ A$9 Adv 'B!;O2-/5Xߐ G?)j7 67,Np")9v3/y8 +86#y"\`9 wq!!l;#T9] IH(к2[.kC\<=G'X2RܹmKwv|ѻac2BLugϑ;";N\JPs]NIY&ҷKo Mύ,\&Y!16ޢH|Kc٭\+=E,NҷES6;(hW;dȮbObxXh9RTp}(v40vpVYqU$*:-iY6x'F(zHO149=GkEcD ɍ;:2q嫕izCB H2TGs>GmY1Z"q8g2zKm&Bo-g1qmM(#=<^в<g3*@TPs1dݣ%q_:W]Ÿ7tZ;.V%^lxʵ6?ƛMe=& e"3jm$B^[ovdw(S=M0iщ>%;{ K\7syC ʡdν;(_.ruMҎ&gD$a]i7£* pMԢXQJ&ҼYک2~qDQP' ӝ'5^de'G!EخV`[Q*,sTJXe~SU9ر.؍g2OJ&|mc 7_[KH1U)hGm(BLΉnM mA)ק3g7 z4H$2-C`Vz^lhM-B06kN~u)vC]\89 Rʤ 1.=Ri~i1!ZyEUzoJODC%> e(ke=bSte苶dPLX9C1A; ?I/sL>8e.kPGaH/#G" C#5wWi:c!Y QΠ+cƻGA֢D@JPnmΛޮ5)=,!߶ln(Shux֞S[gK4A͡qUؽף=䳖 XCNERoݙwÎP)6&itǻpiYd!!bzj;{n .A>b,If$Y쫩xa3 v:Z_ߗ& IgXڿħ8 8L2?Yp!#/ʔJ Hetኟ/-JƘO 6]~鋸>ū7@fRaAߘXEDZ^4BgK)g/<0b<܍pAj':+6g%Kn, {{ĉYXXA795dpD 䓺7C=ͬ:v5Ë:jSc:$-Ϫ_Z;/,+ctX-H> T)QcIaM.O\yjo';;m%uVV,A*?<])>j]tH=}^O(IO~Olm>_"IKs; !e5{Uwh3U$ZgMq"8f4D%Wheu[ rӼtH^`B'EEj;]PG;PorMn&ɐMV&, Z;7$ z=5 WűC+'~XrvR5ꇣ/wGߑzz l&qi+(Lvއw7O(Z8JM'zh粖[گ7E^bD4[axSb2nӁئ©!P{v3EGEl(`@w1M>GN. (uxvRيʃy _׌#G%*+7é;5%L(-ʵG2_abɰdMl\N)qYmlFĿ"SP=Ѝ{k4J#?DS"糿኉?fjy뚶XNiЊľd'첬WRCCf){yކ;ݱcUEJ0}MحI@Jt0^=_v/`y~p듢(w׶4["t_4 6xx1ПxQ vRPbV@R1EY\ɐjOJP[Jg j |={/("arΠC)Yցm/!>[ tStCyK`q:xOk ĹiG qL>u>xK*?iL8YZ6G|WKnW9 OP:]uBSn~s0޲9](wp(7c!IK悈qr^MwGFX Μ= :>+|;z4:֬n>2fNm% s$Qj,f3[qOzRbB5ZcD(∈9qyIq3FA#^[}4_-x/|ˋ7I6h66㴬Mv]&"$/RWרhdďxtc-Orx2q3ohȣc1#@RTrGXP ÉK>ذKS=wit^|6W79svR Wu6lA.:ꮐo!%ٻkJ[bo #S_UlD~qoB6ɘ513~OXMxP5 }^պNՐkPwY,yf+O«>ѷH&과ܚ;Me1ScfAԕ>͔_OU]1[꺶nLx(TL/ &l_?%siJ}d$KeM %xU$tG'/~$#:|-ĸIc[{kӥ3ٕB(Koc搒Nsu[<$k8\^]W3W=dci-2-(v)董vW;TO+ptoP ="n$VM>|%QjcdW l`]Bب gYU%V!konfmb\K {D>E ;> J\WsG SAxzk=fxa!/+ ÜpJzZ]m3T3{\''lQ1۲ݶ$?U`r bJ9aT{5RAQ=N{~2j.17"Y#~) =3ze84Ul̑.? $?ԑ :^br05~Ù==]7B[;1vsqlU-Okx32xc2aNAZ\sW ԓPEo l)L[ub}`S XP`xqD r̢1 9f #p=狣6RaW'T%!s2T]uĈ2וV)lGG78yi!7 94\L 2TO-;WcwJ^X[ OyKOX\ڡgy@B Ϙdo \[h=MIdzSYkY=YK=&==bgQ$VwLD#Xp}e7ƴ o<fRB/6Љ!>wwwNT}FտM.hC,aMU^-=z.鉋ɄRSS͵̩t072Pz*R/Q">i#,yA4%(_T&wA˰S< kúIw~2Vl*z1Qp5 4- ]2¢d/_H:N`JW;wN\+K7͓XX[PjToP sx#E`QYU]҂{dA[25[JU01qHO:3ts_8~њι t)YEeHRNSpMQv v8/}Ekȥ~ν$L bS՟ciK5KG!N+&˹Km4dU3w-TfWrr0^ ZўNij4vD>!@(—yQb,ᜆwEpۜ.~vb~*65\'$-X,4I MY,6{^MuW+-2١5 fEpPu^'2 UZL@Sbio9'?xn,  %=wʪ(u2XݹKV MڽםH r~gQ<%5l'K8)ԨOW;-MM7v+EM`5{sWf\&r/3İl1 endstream endobj 116 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.13)/Keywords() /CreationDate (D:20131119081714+01'00') /ModDate (D:20131119081714+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 2 0 obj << /Type /ObjStm /N 98 /First 780 /Length 3293 /Filter /FlateDecode >> stream x[Ys8~ׯc\[!JMO$c;$EmmdQ#9%aKSb}|h""X S)L1gHYR1!LX<陔?#zR2,e&3|z xaSYrٴ',u3 遈^LTJ; O {BG R(た*dx*Ӯ 8(&3p)\&aU *ZH3(H%#R P)R=_z >ݙrQ22"J[A R! (TI x A:XA=8D`#h|bg.lx x-QS EZh#pĐbD8z1~` {PjX~h\MзXF}^ G8$U>XuMhاs>XEr,ֿje^74tXܖ38i^Up|YLo?U0ڻt߉HbB$>>(ƃJk?" Rv:'Gz$gu*qqUbaeq;%s_ o#du<#)x\Gr$Y.<|x !OUh?cP> s"4HA>#ԣS(_c|eCMJ}eQTaS&f\8̾dw)"*J27sJV !e9>7&= ~~ߜ߃몚_&K1 ?# dPI%i2QI e>1X63Ddּ1GwoGuDX\2GL2LaIDDaW!L"UBMz B%Ug,4Zuz5Xh<-thULZRIU㯧4k2~ &!cIB 8m±ƧM"򩲉AAK`mAـ +& ~4YhԻ'B(^h4h!h%4n5%*'ښ4qRܱRJANp&yJ{d!P:!V;9٢Dvt[nI3 whw/d|;ݎ'wN*Qbg_94itD-K^3҅R;˺=]!kU!ݧ %QI^'.)+Qd0掵#ȟ~.! C:ѭJrH#͂:RL~ɺ6<5v ~!%)A~Y'4UR"GٮTQj ~x35ţ2c4U<ÙS2dHҔ6FD <2*Խ𖲦6Bt$X ZWcikMrڒEF[J44>8ywfГ)WS,h{mHC}AEb=lt!'?w Tۚ"Ό{ex-(TP,kދw&Gʙ6Wmͱ=d^r:,֢nU QfHqF8-i%kDg&-۵EDw,jM7RµSw3'xՍP",f%#'R0 DK;(і;hO|=C2ML)cMA1ѧd.z'r)UNEM=6=VqN]Vh4D*0dk7:+@t5N:%hOޅN mKU4(FM?@vфO;;T/˨db+T}QY=H5!zʟcD!~#z+:Jb u'!7 Gekȓa }[TŧQ 5"mhj;QDuA|ZܨqG~ָQ4RFƍF5ݘ6H 8LA+)0kNU e5fJWa!O W~S]ٲmcW?!Y^rϱ`VCtl]oV` ff 2smfʷ %ERyRj8ȑZ>MC3 QeZ&۲Eai\J-"jϳw5v=B =ZKBj]|)64uL~(28xpI1i6Bdi֕z5k6 [eՓg" k<,le91yzğZwkWshMo|N_z!tI+|8Nˊ`a_7wË꺤{^[ ;lNAv{ّ)V֨#ve[ה-lݭJGnӰZm/hK[~w|i_ 6Zs.^~wJ_ni >qڬvn*J_ :vXBjI_Uo)E9\S_o@O{hjWYjǐ6t34(?8"@ׇeOjZ6 mZl6TMCk]^7V%W1s>rg>bG |m|ћ&t9bFe6s7XxX$ laJ'i՟V{ta}QgNG;jnv "?6 1ͰȞQw nuF;k_dJLZhIƭc!,0.&v]]|ouy(,5d7*$#b<)7! ȄXI-z1/;T#\b1Ǯg7ef&8^ǤP M& endstream endobj 117 0 obj << /Type /XRef /Index [0 118] /Size 118 /W [1 3 1] /Root 115 0 R /Info 116 0 R /ID [ ] /Length 282 /Filter /FlateDecode >> stream x2CQKk!pSA! YDb7Yz1T(UZyV{_:uDQ @ A B' 'P~cpP#PjqCjH~!؆-؀؅h,lB4B]ŽG;`U@? AD{ (T"9 C*w; )$,<,_JhRy}ZRZVV+ojjU1ji!\%\5: e;L# endstream endobj startxref 137040 %%EOF doMC/inst/doc/gettingstartedMC.R0000644000176000001440000000400212242610172016232 0ustar ripleyusers### R code from vignette source 'gettingstartedMC.Rnw' ################################################### ### code chunk number 1: loadLibs ################################################### library(doMC) registerDoMC() foreach(i=1:3) %dopar% sqrt(i) ################################################### ### code chunk number 2: 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 3: 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 4: getDoParWorkers ################################################### getDoParWorkers() ################################################### ### code chunk number 5: getDoParName ################################################### getDoParName() getDoParVersion() ################################################### ### code chunk number 6: options ################################################### mcoptions <- list(preschedule=FALSE, set.seed=FALSE) foreach(i=1:3, .options.multicore=mcoptions) %dopar% sqrt(i) ################################################### ### code chunk number 7: coreoptions ################################################### options(cores=2) getDoParWorkers() options(cores=3) getDoParWorkers() ################################################### ### code chunk number 8: coreoptions2 ################################################### registerDoMC(4) options(cores=2) getDoParWorkers() doMC/inst/doc/gettingstartedMC.Rnw0000644000176000001440000002647712242610172016623 0ustar ripleyusers% \VignetteIndexEntry{Getting Started with doMC and foreach} % \VignetteDepends{doMC} % \VignetteDepends{foreach} % \VignettePackage{doMC} \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 doMC and foreach} \rhead{} \lfoot{} \cfoot{} \rfoot{\thepage} \renewcommand{\headrulewidth}{1pt} \renewcommand{\footrulewidth}{1pt} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{Getting Started with doMC and foreach} \author{Steve Weston \\ doc@revolutionanalytics.com} \begin{document} \maketitle \thispagestyle{empty} \section{Introduction} The \texttt{doMC} 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{doMC} 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{doMC} package acts as an interface between \texttt{foreach} and the \texttt{multicore} functionality of the parallel package, originally written by Simon Urbanek and incorporated into parallel for R 2.14.0. The \texttt{multicore} functionality currently only works with operating systems that support the \texttt{fork} system call (which means that Windows isn't supported). Also, \texttt{multicore} only runs tasks on a single computer, not a cluster of computers.\footnote{You can use the \texttt{doNWS} package to execute on a cluster using the \texttt{nws} package. \texttt{doNWS} also has good support for Windows. \texttt{doNWS} is available from Revolution Analytics: \url{http://www.revolutionanalytics.com/products/parallel-r.php}.} That means that it is pointless to use \texttt{doMC} and \texttt{multicore} 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{multicore} functionality 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. In addition, it usually isn't safe to run \texttt{doMC} and \texttt{multicore} from a GUI environment. In particular, it is not safe to use \texttt{doMC} from \texttt{R.app} on Mac OS X. Instead, you should use \texttt{doMC} from a terminal session, starting R from the command line. \section{Registering the \texttt{doMC} parallel backend} To register \texttt{doMC} to be used with \texttt{foreach}, you must call the \texttt{registerDoMC} function. This function takes only one argument, named ``cores''. This specifies the number of worker processes that it will use to execute tasks, which will normally be equal to the total number of cores on the machine. You don't need to specify a value for it, however. By default, the \texttt{multicore} package will use the value of the ``cores'' option, as specified with the standard ``options'' function. If that isn't set, then \texttt{multicore} will try to detect the number of cores, and use that many workers. Remember: unless \texttt{registerDoMC} is called, \texttt{foreach} will {\em not} run in parallel. Simply loading the \texttt{doMC} package is not enough. \section{An example \texttt{doMC} session} Before we go any further, let's load \texttt{doMC}, register it, and use it with \texttt{foreach}: <>= library(doMC) registerDoMC() foreach(i=1:3) %dopar% sqrt(i) @ \begin{quote} Note well that this is {\em not} a practical use of \texttt{doMC}. This is my ``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{doMC} with all of its dependencies (\texttt{foreach}, \texttt{iterators}, \texttt{multicore}, 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{doMC} and \texttt{multicore}. Note that you can register a different parallel backend later, or deregister \texttt{doMC} 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: <>= 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{doMC} and \texttt{multicore} 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{doMC} 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. I'm not going to explain what it's doing or how it works here. I 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 registering a different parallel backend that supports clusters in order to take advantage of more processors. \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() @ This is mostly useful for documentation purposes, or for checking that you have the most recent version of \texttt{doMC}. \section{Specifying multicore options} The \texttt{doMC} 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: <>= mcoptions <- list(preschedule=FALSE, set.seed=FALSE) foreach(i=1:3, .options.multicore=mcoptions) %dopar% sqrt(i) @ 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{doMC}. Although if no value of ``cores'' was specified when \texttt{doMC} was registered, you can also change this value dynamically using the \texttt{options} function: <>= options(cores=2) getDoParWorkers() options(cores=3) getDoParWorkers() @ If you did specify the number of cores when registering \texttt{doMC}, the ``cores'' option is ignored: <>= registerDoMC(4) options(cores=2) getDoParWorkers() @ As you can see, there are a number of options for controlling the number of workers to use with \texttt{multicore}, but the default behaviour usually does what you want. \section{Conclusion} The \texttt{doMC} and \texttt{multicore} 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} doMC/inst/unitTests/0000755000176000001440000000000012242607506014107 5ustar ripleyusersdoMC/inst/unitTests/options.R0000644000176000001440000000056211472541377015737 0ustar ripleyuserstest01 <- function() { x <- list(1:3, 1:9, 1:19) cs <- 1:20 for (chunkSize in cs) { mcopts <- list(preschedule=FALSE) for (y in x) { actual <- foreach(i=y, .options.multicore=mcopts) %dopar% i checkEquals(actual, as.list(y)) actual <- foreach(i=y, .combine='c', .options.multicore=mcopts) %do% i checkEquals(actual, y) } } } doMC/inst/unitTests/runTestSuite.sh0000644000176000001440000000152111472541377017127 0ustar ripleyusers#!/bin/sh LOGFILE=test.log R --vanilla --slave > ${LOGFILE} 2>&1 <<'EOF' library(doMC) library(RUnit) verbose <- as.logical(Sys.getenv('FOREACH_VERBOSE', 'FALSE')) library(doMC) registerDoMC() options(warn=1) options(showWarnCalls=TRUE) cat('Starting test at', date(), '\n') cat(sprintf('doMC 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) } } cat('Finished test at', date(), '\n') EOF doMC/tests/0000755000176000001440000000000012242607506012272 5ustar ripleyusersdoMC/tests/doRUnit.R0000644000176000001440000000534411722000047013774 0ustar ripleyusers## unit tests will not be done if RUnit is not available if(require("RUnit", quietly=TRUE)) { ## --- Setup --- pkg <- "doMC" # <-- 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 # ################################################################ registerDoMC(cores=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") } doMC/NAMESPACE0000644000176000001440000000010112233530232012326 0ustar ripleyusersexport(registerDoMC) import(foreach, iterators, parallel, utils) doMC/demo/0000755000176000001440000000000012242607506012054 5ustar ripleyusersdoMC/demo/sincMC.R0000644000176000001440000000166411472541377013371 0ustar ripleyuserslibrary(doMC) registerDoMC() # 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") doMC/demo/00Index0000644000176000001440000000006111472541377013212 0ustar ripleyuserssincMC computation of the sinc function doMC/NEWS0000644000176000001440000000323712233530232011623 0ustar ripleyusers NEWS/ChangeLog for doMC ------------------------- 1.3.1 2013-10-28 o Added iterators, parallel, and utils to NAMESPACE imports. o Removed restriction to Unix, since parallel exists on Windows. (However, as with parallel's multicore functionality, only one core is supported on Windows.) 1.3.0 2013-02-19 o Changed dependency on multicore package to parallel. 1.2.5 2012-04-11 o Moved vignettes to new preferred location. 1.2.4 2012-02-24 o Modified default cores computation to use parallel package tools from R 2.14.0 and later if possible. o Modified doRUnit.R to use two cores when run during R CMD check. 1.2.3 2011-08-15 o Added support for package options via registerDoMC o Added package option "nocompile" to disable compiler support 1.2.2 2011-05-16 o Added support for the compiler package in R 2.13.0 o Enhanced unit tests to enable running them under R CMD check. 1.2.1 2010-01-25 o Changed license to GPL-2 o Error handling for the doMC backend should now be correct. If .errorhandling is set to anything other than 'stop', it should return an array containing the results of all iterations which did not cause errors. (From a bug report by Brian Peterson) 1.2.0 2009-10-05 o added support for all of the mclapply options via the foreach .options.multicore argument o added a "Getting Started" vignette. o added examples directory 1.1.1 2009-06-29 o added cores option to registerDoMC o fixed bug that caused getDoParWorkers to report incorrect value 1.1.0 2009-06-26 o initial public release doMC/R/0000755000176000001440000000000012242607506011331 5ustar ripleyusersdoMC/R/doMC.R0000644000176000001440000001472412242556354012312 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()) # this explicitly registers a multicore parallel backend registerDoMC <- function(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 doMC 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 doMC package option(s): %s', paste(optnames[!recog], collapse=', ')), call.=FALSE) opts <- opts[recog] optnames <- optnames[recog] } # clear .options in case registerDoMC 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) } # register multicore backend setDoPar(doMC, cores, info) } # internal function that determines the number of workers to use workers <- function(cores) { if (identical(.Platform$OS.type, "windows")){ return(1) } 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 the number detected by parallel cores <- parallel::detectCores() if (cores > 2) { # try to use about half the cores cores <- ceiling(cores/2) } cores } } } # passed to setDoPar via registerDoMC, and called by getDoParWorkers, etc info <- function(data, item) { switch(item, workers=workers(data), name='doMC', version=packageDescription('doMC', fields='Version'), NULL) } comp <- function(expr, ...) { if (isTRUE(.options$nocompile)) expr else compiler::compile(expr, ...) } doMC <- 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) # check for errors before calling combine function if error handling # is 'stop' so we can exit early if (identical(obj$errorHandling, 'stop')) { errorIndex <- 1 for (r in results) { if (inherits(r, 'error')) { msg <- sprintf('task %d failed - "%s"', errorIndex, conditionMessage(r)) stop(simpleError(msg, call=expr)) } errorIndex <- errorIndex + 1 } } # 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) } } doMC/vignettes/0000755000176000001440000000000012242610172013131 5ustar ripleyusersdoMC/vignettes/gettingstartedMC.Rnw0000644000176000001440000002647712110733555017116 0ustar ripleyusers% \VignetteIndexEntry{Getting Started with doMC and foreach} % \VignetteDepends{doMC} % \VignetteDepends{foreach} % \VignettePackage{doMC} \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 doMC and foreach} \rhead{} \lfoot{} \cfoot{} \rfoot{\thepage} \renewcommand{\headrulewidth}{1pt} \renewcommand{\footrulewidth}{1pt} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{Getting Started with doMC and foreach} \author{Steve Weston \\ doc@revolutionanalytics.com} \begin{document} \maketitle \thispagestyle{empty} \section{Introduction} The \texttt{doMC} 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{doMC} 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{doMC} package acts as an interface between \texttt{foreach} and the \texttt{multicore} functionality of the parallel package, originally written by Simon Urbanek and incorporated into parallel for R 2.14.0. The \texttt{multicore} functionality currently only works with operating systems that support the \texttt{fork} system call (which means that Windows isn't supported). Also, \texttt{multicore} only runs tasks on a single computer, not a cluster of computers.\footnote{You can use the \texttt{doNWS} package to execute on a cluster using the \texttt{nws} package. \texttt{doNWS} also has good support for Windows. \texttt{doNWS} is available from Revolution Analytics: \url{http://www.revolutionanalytics.com/products/parallel-r.php}.} That means that it is pointless to use \texttt{doMC} and \texttt{multicore} 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{multicore} functionality 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. In addition, it usually isn't safe to run \texttt{doMC} and \texttt{multicore} from a GUI environment. In particular, it is not safe to use \texttt{doMC} from \texttt{R.app} on Mac OS X. Instead, you should use \texttt{doMC} from a terminal session, starting R from the command line. \section{Registering the \texttt{doMC} parallel backend} To register \texttt{doMC} to be used with \texttt{foreach}, you must call the \texttt{registerDoMC} function. This function takes only one argument, named ``cores''. This specifies the number of worker processes that it will use to execute tasks, which will normally be equal to the total number of cores on the machine. You don't need to specify a value for it, however. By default, the \texttt{multicore} package will use the value of the ``cores'' option, as specified with the standard ``options'' function. If that isn't set, then \texttt{multicore} will try to detect the number of cores, and use that many workers. Remember: unless \texttt{registerDoMC} is called, \texttt{foreach} will {\em not} run in parallel. Simply loading the \texttt{doMC} package is not enough. \section{An example \texttt{doMC} session} Before we go any further, let's load \texttt{doMC}, register it, and use it with \texttt{foreach}: <>= library(doMC) registerDoMC() foreach(i=1:3) %dopar% sqrt(i) @ \begin{quote} Note well that this is {\em not} a practical use of \texttt{doMC}. This is my ``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{doMC} with all of its dependencies (\texttt{foreach}, \texttt{iterators}, \texttt{multicore}, 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{doMC} and \texttt{multicore}. Note that you can register a different parallel backend later, or deregister \texttt{doMC} 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: <>= 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{doMC} and \texttt{multicore} 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{doMC} 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. I'm not going to explain what it's doing or how it works here. I 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 registering a different parallel backend that supports clusters in order to take advantage of more processors. \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() @ This is mostly useful for documentation purposes, or for checking that you have the most recent version of \texttt{doMC}. \section{Specifying multicore options} The \texttt{doMC} 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: <>= mcoptions <- list(preschedule=FALSE, set.seed=FALSE) foreach(i=1:3, .options.multicore=mcoptions) %dopar% sqrt(i) @ 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{doMC}. Although if no value of ``cores'' was specified when \texttt{doMC} was registered, you can also change this value dynamically using the \texttt{options} function: <>= options(cores=2) getDoParWorkers() options(cores=3) getDoParWorkers() @ If you did specify the number of cores when registering \texttt{doMC}, the ``cores'' option is ignored: <>= registerDoMC(4) options(cores=2) getDoParWorkers() @ As you can see, there are a number of options for controlling the number of workers to use with \texttt{multicore}, but the default behaviour usually does what you want. \section{Conclusion} The \texttt{doMC} and \texttt{multicore} 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} doMC/MD50000644000176000001440000000162212254240622011434 0ustar ripleyusersa1980cb20913406273b304c3039db011 *DESCRIPTION 7fe3d7214125288822cd4472ecc6c4a4 *NAMESPACE 68811110a6402fb7225506724b2fbea5 *NEWS 32dfc0390122f8f3211a9ad035402c3b *R/doMC.R 35784bb8d34be175d48ae0084e7cb326 *build/vignette.rds c09a9ac7a720c8ceb98ae815a5542092 *demo/00Index b6ddb31150961d04b467a413affde041 *demo/sincMC.R 3c49a2220fd6dbddff43c81cd052bf73 *inst/doc/gettingstartedMC.R e53634a5badb0c90bf01a844d0b33a6e *inst/doc/gettingstartedMC.Rnw 423c2d64f5ad42c1b453d67868da8aa8 *inst/doc/gettingstartedMC.pdf 794817093fdd85b71f892689a8ffe99d *inst/examples/bootMC.R ccb40b21ecc17bd71f764d7d67da9a7d *inst/unitTests/options.R 59f11a4ad61aea4c525507b6ac0ae4b2 *inst/unitTests/runTestSuite.sh 4065e26e2a11bd6bc313caaeefdc585a *man/doMC-package.Rd 9e2f90b44819dbc6b3ea34f5337d66d0 *man/registerDoMC.Rd c5f588d9abdde0c24dab0d36c163e497 *tests/doRUnit.R e53634a5badb0c90bf01a844d0b33a6e *vignettes/gettingstartedMC.Rnw doMC/build/0000755000176000001440000000000012242610172012220 5ustar ripleyusersdoMC/build/vignette.rds0000644000176000001440000000034512242610172014561 0ustar ripleyusersQ0,QHLx' x0$=xmhy$XHiB"blffg6:!eAl 4d".cR Description: Provides a parallel backend for the %dopar% function using the multicore functionality of the parallel package.. Depends: R (>= 2.14.0), foreach(>= 1.2.0), iterators(>= 1.0.0), parallel Imports: utils Enhances: compiler, RUnit License: GPL-2 Repository: CRAN Repository/R-Forge/Project: domc Repository/R-Forge/Revision: 15 Repository/R-Forge/DateTimeStamp: 2013-11-19 03:37:16 Date/Publication: 2013-12-18 07:32:50 Packaged: 2013-11-19 07:17:14 UTC; rforge NeedsCompilation: no OS_type: unix doMC/man/0000755000176000001440000000000012242607506011703 5ustar ripleyusersdoMC/man/doMC-package.Rd0000644000176000001440000000247712110733555014415 0ustar ripleyusers\name{doMC-package} \alias{doMC-package} \alias{doMC} \docType{package} \title{ The doMC Package } \description{ The doMC package provides a parallel backend for the foreach/\%dopar\% function using the multicore functionality of the parallel package. } \details{ Further information is available in the following help topics: \tabular{ll}{ \code{registerDoMC} \tab register doMC to be used by foreach/\%dopar\%\cr } To see a tutorial introduction to the doMC package, use \code{vignette("gettingstartedMC")}. To see a tutorial introduction to the foreach package, use \code{vignette("foreach")}. To see a demo of doMC computing the sinc function, use \code{demo(sincMC)}. Some examples (in addition to those in the help pages) are included in the ``examples'' directory of the doMC package. To list the files in the examples directory, use \code{list.files(system.file("examples", package="doMC"))}. To run the bootstrap example, use \code{source(system.file("examples", "bootMC.R", package="doMC"))}. 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 doMC package if it is registered as the parallel backend. For a complete list of functions with individual help pages, use \code{library(help="doMC")}. } \keyword{package} doMC/man/registerDoMC.Rd0000644000176000001440000000224012110733555014515 0ustar ripleyusers\name{registerDoMC} \alias{registerDoMC} \title{registerDoMC} \description{ The \code{registerDoMC} function is used to register the multicore parallel backend with the \code{foreach} package. } \usage{ registerDoMC(cores=NULL, \dots) } \arguments{ \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 approximately 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{multicore} functionality, originally written by Simon Urbanek and subsumed in the \code{parallel} package in R 2.14.0, provides functions for parallel execution of R code on machines with multiple cores or processors, using the system \code{fork} call to spawn copies of the current process. The \code{multicore} functionality, and therefore \code{registerDoMC}, should not be used in a GUI environment, because multiple processes then share the same GUI. } \keyword{utilities}