doMC/0000755000175100001440000000000012607127364011122 5ustar hornikusersdoMC/inst/0000755000175100001440000000000012606057735012102 5ustar hornikusersdoMC/inst/examples/0000755000175100001440000000000012606057534013715 5ustar hornikusersdoMC/inst/examples/bootMC.R0000644000175100001440000000142411472541377015227 0ustar hornikuserslibrary(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/0000755000175100001440000000000012606057735012647 5ustar hornikusersdoMC/inst/doc/gettingstartedMC.pdf0000644000175100001440000040327312606057735016623 0ustar hornikusers%PDF-1.5 % 38 0 obj << /Length 2346 /Filter /FlateDecode >> stream xڥY[o6~ϯ(VbVz`(IчLvFοs#E9J&>آC;WUǢ*ޞUO<8󅩔.. m[ԺQƇb]V<nqUU~Cx9\^vG~"W86jaz}cB;e7Ĉq*X:<<~_ 3ugLk0]73SKnH;eq<h5xlt?݆v^UK[+]~qb꒶d.5tU6؆Y-_k"XUuh`}Rpwĝ>4G&ɁU[$ x55 X] ~4AUMiEpt.ҴǦM.!./NnHϿDZt[+o|A̭a8r^պ`jw^βC 1DF6|x|{f\t| pʁ_Lj7"gQåU Q8.i'#M]>u;K3UHD>7x7("0ĭh)6Ɏ%y*FD\]c&=/)G s F/V*DZ9." 'BVE+z=`*bԳ'wQGim7ȞKSQƄnG *@Z9!r4倞~ݩF(8KU/f[#?įAp>/)T>-ope47]~><yᛑe% bBxbB4JZ&6Cͩ.@nm_F_59K ^<^4b8O=\\z ZS˚: ]DQ*=eݪѥ^=aHe%fpJ{50SW4ǝ{qMÇDQ5Ð"K9?&s%p-fqcN^~P,nNt7rnrZp1iN|0Z;iT3ҕ{%*i^($Dc+NһFU ̌cM%I8I$eŖE?'O ySn5+CR kO,96M䄿mr5zza&j5QL!x6&]"!&O#Ta -G&Hq> 9hjJ;"+8&"0;y^4\$`J܏x~2E:,4g'rssD8WQw>cw^-5bq h$:f g]U Yܨ_tއqH=DӰx}XVnT<G4hɱ S/"W7qe>;H.k~lZ ؼ#Jʐr.3w_67:5wem?c6ўn LBSUn;wĿOA}32EnKъ}| Q.zs[XPl4́s/T w\ 1tKV?d@P K^7_g9a²p97Q&M_d鮄dqΕ=@]g#cTcWFЦJ dܗow!ڇ(i<&\}:Rk]E9jsU~m(jҪnDwŇml 7(B[ZPh|Ѫ@`D dHy']/mB>sA$+B4{AL>234cuWfkB/ލO3VsʲW 0C#WCJK3;aG4ce8kPY:Âx?vlAHh͉D|g&v{[ 묢5RiO@A endstream endobj 53 0 obj << /Length 2557 /Filter /FlateDecode >> stream xڥZYoG~ׯ2qs: DbaLe(QaG~Y@q:*J.gjˋi]ޛzfu7kM.V7a+\>5- 0xUx+x𽩆@',_o˹iaۋuqL̻Yf9{VV0L}>ѪW7~9St[ d@Hte|qկ%2GG#yQֳ8#rUrrj[8?xqyu絬Cwgw 5xbju-jtkżCu/LWpu{]!m}?"‰trNwT#UuGdlbNmif678[+7Mu?7]=]u/GXF];3M1շuTsǡɰU 7"1Ri]]b&61p` Bڹ&p2{t-ȯ(uHI \<}[CP_51  w.` 4^]u+WFwLjsڮy'(2x. nirܓ 4+y4llaU6 =l/2'q=(i, 8vaw8dѹlϺp (*4s(W?fC6ּu)ZۂS dc](ԳBQ uᘃ˿ WX'#%DQ,it0ǹwQk%Fhآ&ȴƏ1A֗ @?#`b!M/uW!ı7M/\s2)] X SS_ZGN$t_d0]$3adEeV<]T(',zQ$U%ror{!2'!)E1;!VFܑÊL"Gb LE h.|86~ 6o& v{J<=ietl@u FT+|PoYR_E mDL:,h`,8@p}gT2xZx-$)lj\ǐ0 l(ۈi->rq;/JUhEuP9'K34ƚʃ~ 0Xie-RzLJrY@cl p3Y+SUnզ:^J(?_n0!.ېdžS6?qɺs2u0dD3 v>&dţ!'mS_z޶t;5 < :bUhXO!@q.)*MB^CrxyZqhTי4w_4rAl)MdmRjhooiӶw $-'i2$[<;/:*~J D (Q w^ 4a'֪ng$m7LSǰ̑nm2j ũ}.MX=J:G)6lA;"9oX5 A9^ٲp~q>%(E{ȵb%Jk>|Iݰ*!xmq7=kzLh17UV0p"JR`c(1x஭]gem诈 b "jQM21m&td*.k>+%b;гK =g]QE,e](tHx' B%\N\/C2X*!vRTc3bLII mӂÞ[z ܏ ;Qd&`H."|p-0,ܜGGjZuWJ2)˲uK$`Y`7܄L\ӥ6u9p1 sf6!M]Jbx5r( as9o:}SuI:C1#?KI&,!e֗&K>'MTK3 KͻlC RdOr>k&&o:uR/QdUlm[UD(o>8j4 CntΓ܎r aƒpȳJ| G}{_=t\ʐjgMSRJ[NצIKK_W!5%cX1& ?eѯ"@J)cl5/ݾVEF*{O_3 SMIhK;z5> stream xX[o6~ )Qavmb5} ۊcԎ\n o߹Qe%k >Ȣs΅E/FONG(Z֚<0Qtd&Q&σy.|Q:g %<$66|#V՜2qsziX !?A`ѳчEA&A 4G΢`/HE\:QUfzn$0KXEaYS¦j`ASjTW1U&-zk\4h":/T'q<(4#W?IUn&U6CA( F'nÈ܎AUYCpLu}8<~d *M2E+y:$ NL0щJ[HFٸp@G+vKqdH*Zx@Z.@݅`((=+/y@bFCR2r @qXn/Nq~Q|% 0^Lu-UlWqnɡҴOQGZeAz)=R4to*W\^h.ăBy%{5CE=`.X.[ s :,cӖI4Nr#l\䌄EȈ !H+/<%Е;K5lE\BtD>!i@vm|ׁitD<ٖZ!#5ی1~ '?'5].@@f]lOr6>9"d9c>JM}L5=R:1c+DgCA%f92U;O78Ўwk ֪?~ %fTzp)12WNw0.}ܕ5zX3yݟ;.Ԓ]F˷mR5;C /F+O=,S< ;cӬ÷xj9|u_#f}BVםג1>[A ]o&QGB@qrmds D\˶UaM'vIES9BC8NW@Sw UB@ cRC2֊mG:3L C⢽]:16ta8QNᆯYH5g'/AɋD'olKw ܳڥ3J#}ddN8 0a{ҮV[p w,{! wnb+_Yڬ:o#,(iwcfdMb&qͮ#,{a_{zjKk01Lq:w:Lx\7:NkF"jњvn#m7݆׺>F~nŧH&S ~vNss^S'oPL endstream endobj 64 0 obj << /Length 2378 /Filter /FlateDecode >> stream xڭYK6ϯ`bMECv˩ʖ֖4c,̿~ rMA4uD(]4,Ku&66eT.N2YEYo 6Kf>I]V:}#u|}Zmf}7W 0 F S.ˣfS(*je.ꇫ!2vgJ7w2n:l~gwH_E#zhof_ ?[rg6G/Xt;xDD'QƉ|vK4lLK lEgK%>I!@ZfU zŖ89͚*Gߪ`Մ tP&MRi4` ZT=Z ;ҁGILѼ Hk#ԍ^I9K%8_')Y8L<]1 {xKC[u$;9i3-s{!읏FLDJ!w\訰zD7X!* >6ffy)_GJG?g D2.TiI{3Vj+2sI:I#s3N%zANd@4n*J\4%XC75ł :S.f?ld85/AͯxJ>KB_/Mִ^ evV ̽$ZRTK e-YVs. Zka_Vhni>i_ WV},gs0d<.]ز ȧ0O)[HeF^z3 E"ja OBs5tE5y#(z!)[dჺҿgNSeq"F^"s>EA̔ݷqw,ɟ,ᇙ;~2#OkOYM%HӘʀ͚ 3u%rhOQ4A۠fy Lȡk^2ʶ"~O<>?0A˜G5*LK3D#R<9CoO*NK_RI)̪Q!@hZwYoqց$!?EPXPn ^IG0u?-CVߏk2>(W54guWZa U]U!D+ <#i=2b'TKa*(qTQ &"&Y,[} j5{1Us;J'P0pusIPf2E\/ Xоaφp18]豽nyj8_Vʬשx±9*Tߝ("K wϾAM^,'ZA:SlKByhХ)GN`JΚɇINlJn|b98rbWș>Pc2? endstream endobj 69 0 obj << /Length 1622 /Filter /FlateDecode >> stream xXmo6_! (&W 뀮+!Q#ZNȱ1`y<=LLN~:|RrN'׉F2),"}[*g 43ڥxzA}ͼ|} _*ܙzSR!CDg J{.Y;ֿ7o@{52ND@êm{ / ,D҂y5$u#CjjSoKv:mz ;bLS)@zOrܨ#4OV5a?IuJup{J8Ng3l]E] ϐ1fOQy0mkx.7|J7ަ4>nvOm!py$YPSs&FӃDS:ހ6?ڧu.\' Ba?>{a73 pӚalNۺ>A3,?$7G4 z*CefڏG֯5|̼ BOT[YNe~z}/@{:m^K5^q ddIR* K SnbBP3.IH.#ehms_D׋.#\1b}N*7JS? |?_ endstream endobj 73 0 obj << /Length 915 /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>NQd:pԲw܇7.DE.~*tBk `ήѼ.1s1"{8Xҙ-k`0Ѫ%^D*ASLZV$s$̽6ٜ2Lob3ѿ\;+ l&._y'FL׎N9~l_Sb Ϧ5GGz7-Ȟ}kBi ]wEy.J8)\ǀi;e&[H\6ưYcaij3 J1dɄ:4Ng.k$gnsyNʹ+sb_͠= 5~ O"Ȕg9BAT ~&m8/6q'I g)_tbFX0\% Z24/rD K @3Gwꚤ_E%_uNPUmRHVF3$s!XҠ>4[vr }>_xwN "}W{;O XMQj*gu4wt mO1wC-IdX^\`nlpeA2jv'Kf iYZ ƿ7S[3z=; h|5zRt xNذRJ IM[ h\nujUUҁ 9}Ѥ6͙4 m~0* }J endstream endobj 85 0 obj << /Length1 1902 /Length2 12459 /Length3 0 /Length 13639 /Filter /FlateDecode >> stream xڍP.wwkwA--K={W[S53Ov[3ZPs,C "fBՆځcG9@BbH96i3QPtpr8888\!B@w%@ uJA!V֮+)(G8@ :T -v-_)]]=<<؀.lPg+QF r9,[AƆJ жЂ]= brpyqs9Oh)(A$tENq#haw:xA`&:X&\@w hLt @VB|\,!.l.=N.@w o#TNN%`8 3`,?NLf u#fWVSc忝PO+/7-wu :8UpC<ZFR>+`Gor#O忳_ɺg!v^1*]p_ՕYO Vv" YC\-˟vߋfqC] +'py.2P[:;P9 |^GK*9@]CPgO.'K9r ggH9 $`7 -F;f|>7|naCx>X0_P7p}Fuhy .Jwu=PH`*A }7b7io8WS9.W.'A;ؘrѹ8 5pӚ25⛃Lr'[QXҢ 8%Uo̧}SqtY'-9b#DlbË!(j.J8bå*jB KRd.=Icy:hD[= I aoUK@G%z ;#ن:f˧ȅU~QՉ:1LBNm0麴cNyx:D3a&Ǡ;i|MaJB ۥH%\= U>ar獠clߥF| uQtd|NsTiQC#BgQoWܥ;y![BpH-3#l'-< >}*&aH 6KUZJ}R-3٠4!Jho"@(_Aw:af+[)M.]+a!44*>h X>\&!ϭlbc2z󋹙Aj_Gb:`_Æ2 /lS}W`ܳY} N@\(2x`U\:A`ВwF8wE2]_* RelI{ܔ~Qsҫy;ƩaR!:VQ2Fosߤk]\FXp~bXQ}Cm[e>F'j˕o`Prb^.9TM G@Dvaw^H1$Wf09꛽u&i[gKx$QK~6aJĿ!~o$[]f%h]`oP ҷ695 eHq^j+Zd@`b橡Yl,B]Wb҃kp}a69gqEIq_E=UrW7\3EϲCcοgft,(>Vd6G S$#%ƍBTE2j;ZyH`Y cH"O2EH~Vc>/ *)HrһO`)܄<rL8ItJW(mon`1.#!r|XupwaloC RS՟NLnj"#fˊ(R b¼'yh.~noT۩3ڿ^_RDvM:;g~;Q&.JJ+;:5ir٥'CeSdB^6F}ER ׯ!A^*/5bZ3rƼԛFac;J?LjRTHX>1,i?-'yut|%*@>+iPa ӓnm~.9'@BYAX|K/:b0)V1 -&i j\XAkթZ ZSs@ֻS7t͒&wڶvkW'Y?2tܹUv1Z^k.PvH VD4B(u%~'zԌQ9:Te > bG(06$\x!|dOqOr[D0 6+⥏59 5Ty;;[\!֯ UNg'EYt-痧 KCIo* 7=C͚"p%pICEM;BE1yH+ .M{ᜫ\}d)V@;dȂEY3Ѭ3ҧ* )l@c ר$v?bCQ 2 Nu+6l)XYZBZTos*f{Цo`%vn_+^]&w AYw4i%a$8;4e+g}r钏iVέ;H.Tl:w H>-woF{%/rL+y=,lpe \>24T qi[r4 84')]Z9NQp-L`jKpC[*}}g22v)1(au$"ߏ ¡qtnz'Qv<)ϢDnR= $F6'u,QկߘoN\:3ų\ Aq%uemIoj*RjTDt/9 KmEcrT.7kO~{LzQ?X>ucӺ Ãn"0- mM.-eomed"W ؕv'u-/[s`4Ʋ^f='@ӢyEZۺya?T| S )᫟J-ԘX,B+'{*sl]PIs%,y<p GtNψ*rJ +HaΜ$q"hZ *~zʅg47 Ϭ%-O0cZ:v~l=&[U[,Β~cf)z $Aj~ 5HPMpx{>?ȕ ̈́}Fy/=r@CTZO#)0><))%Lmh)ieaTSv ( aA4YRCiL!Ž&w;I,XXWô$]) 0/Z` Mp:}FJm})v60 doYTry~x m׬<;_Rc~F6Ƌ5)א:+Dt٣iyȚhyV m8PlJϒygƾc=72p49sfFo@1m%bW2U@ FTT'gܠ[q0}BAhgl!W bUp"l̸#r.Y_'ا|ݟĶhs7i-4kZ)_0l DQ,bigLG;dB}Q5+pS e~(BB$B:.++P ?>ƚ0 yrasBJ~ 0k Hkeo7U~ {={ɢBPvDw-6?w"0IfO{]ng"Y8ǍE e 5y_JI"%+q\9'R:DXdl!r0~dDI=1a 咙KBXKL{ UGρR?@~ڹ攝@[v.zHxsaDKo 6ޣwu_o ҳ}6tr|CI']yȂG{C[mqxkܬ,YvF K2atJl{y3DX T-}t4".A!ߡVYʼ)[PK&?ûmҗJ? ᴘfi= BAdkIR 7Ti V4M=FC{|d ڊ"HOR$ |Q*JE[<@ܡw}]#;|-gּM}ȅ{Âb&]&”֌À4<~R8bРjwf/;(ࡠ%er"|P15׹D"-#7m= -7FǎEڳѣkQ(Pd?B" |T&`(tMޅ=o\V#gE(ZAB{CgH @ Q-c҄70TMӍz#!6}єkd:m0ʤ5r"6`lx C-j'gbƱmmhJKCn^@U Bq$#GH.˝}pm$x2&ɮJ4*ݓ^wrMd|մV޳n:8vRדfuԓ+D2/CAP˫z?=LcT"Il1q5?l440gsϳ}n=v>O2kGxR&*̦|WscW֙픵Z kڍ\^ȸHSl5/ޚ;n[Y*FR,͹{jO#&47k0T.}aKߢu<<)F4ŏe9?1~‾~gNKg᩹O o@n$Gm 8o>dkNmHd5FFLCZ { r{SnbxDP7&Be .['ՀO$: {3O'f}mZhŐ6V`vGHNEމy,nU(ۡ\'_hT?;~04Fz51U6j@x|K 6sH)lb٢rP,al/)#Qwyۯ QqWeP*,ܐdۏCl\m_H=rnGvڔ! e< $,]i~,핁e /*Y)]* I/549B-f @b MNrD{o)pCLib?Y's +Tr>V~Wf6߾R׃CP-, >jG;RI/3k<CPX)`V:WVb`1ܹBa>['ZuC&2\!}Ƌ: >8Y>野4?4A58+Xk+~zׁt9NTSՄع,o}5.DsJZ{lKBAlM(f\ or$;.$#9qlC+b.)_pUKW}TDٸ$޾b}6H + ρ1Uȶa'q4 'mH7!%~kyo7eeRB ry;ZQ$,iVmbpbfy"4a30-%ASّ?;❾v5Kr`Q"\uc% n6 Kb s#cJ=54/Ѯ 4'k`ܣL1ߎDjrh%iYrgl ]7nʯʜ$f`G: ,7 [/ ƈ/^h?VB~cq;`jc1/TQm\lC~|4Dy#<_LЗ4G_zl禗!(%#:?82igiPR3 mjͤY&F2~:wߵ< =0!BAIe-KM `]:Tl1lU C_h{P1sC*].vzϊQ eHɐ첄rxG[40l2ֺ\.0=VWal V\7}?Εu>/\SB姎V;n̆:؃  *}Hk.W]ľX40jZ.ACԝ cDC)Dp$;qv2[wȫxLEQpÆl}4D3p'"Qۆ< e@etI ry-Z/Z8pԚq B}D0*Ū)iKתOH[AL~Txu2EQGp5,I.o&f( 넖~!˧^)41y0EZ|~\ȶ%.=#Muo-i'`|UQrB5TS'^ 1ޞ9U֐n;ӟ8--Rf&:СG=ZTodYW~+_I22Q}|ziS5*3|CnlZ0Pp˻s&M .}|}O1wxż 5VLe)- Ap)ޜMAXä}uh^:wɾsQI|d_G&ixODp6p ['YVv-_ts@˖DմǍ:Y߲Oy  q)@^|Y79bhݒоX;G%Nv)G_J-z-nv άSg#?VZUg-Wlz 6z tKJݨںF$+z)3}(c% ޺ e_#|AKSRƨ.JOs_͏dlo*8bPGw4'?*~ȉ{^iu'aq{+~}U -5 CKw6QsE徜Qs|j\^Y-  #F` #$xz*8/v|nA2Ё3n5l$:|XSwGٮKvU<+LchnϾKa.,(sޥRjȪ𼰿Fo\Z;FLBG]^Qd6JI [Aѻo<<7!nr hʚ?GV<9z;Qyh J@aPƁD%a쀸9; ГxTVxkh)Y ~oϓΛOt W.kC1>V=a xô=%uSMNU"6r+4x4.OU\K uRKnha RMLmت/#XP %d C\b5c.Lޑr~|Q{@tt3mµnMa N n~YQ2~{50J#k{eԖwv%7c$LjOU{8Į936ɒ|ݾ4q^20ul{瘛X T /`BRj 7D0[r%0wn:<؜JT3ȹBy]!ٛ6Ǘ=`E+6$uƋk!: m!Od,eԯD x fH_ijKlUiC~! mea\ʵk2 pZFguy !Cj785Nv Z7"BviNl9:sPRI-v4>|f #V7i>&o)? kGb6(_hA4Z.r`|Rc n|.4\U.L*BO $ a ^|<Osj'(gm7,ִ i.5%*:gN$GfG3̄kcvrbfŕ_2,y>zv|0Q/CW2©O7ՏLDӮWQ -whe!SYLJ?R{Ro.lZKO^}śأ[;S8(bH~:qYjQ2>OV*5w]nOm1\ DoP_m0[+y@bPqS|NէJbX'mO]܀DH.jyؓ< t>Ȑ|J=[|*׭gI򨺄t2W# V }ۺq14Qnt|)8t~KW=캬Cv6] CeQRl4 P"ΥY{<ݺb!wKU9=ïCx~ ݗKm2ёĻ =[o~tT56gqQp?$/Tc$_Z{c|9ףԳpPe`Sߵky8+ؑv3밢DDB%º:bJ`V{".H Yua"1e h~aPYD)qOX=Q$~@eu,>zA(h"luo]0 ю4`N]Qd1]ɰ֦ ƸLԤL yQV? 3$@k)́ @4Wj\ԛi;6<IM6Zru1y3JĊ1fA?5*|9gKm$Z}^ˏML(CgXU(^S8K#;c%T)R^Y<f3Ocw}ܻ쾌/n(Zv򱾗B uGl!@ΛJ6-S}-򳘁[vFhLz,xg?k 8[l*^^׼e*_MUL<#P,τ9mba-S0sɿ}GhЄ$Y4 )C#Y[dxūm*:_Yթ!@@ALju=È6lռmBTI*v?s@5y;ڰ,z8ecFX pK/c,&R䅈 (TP6>闏u$;Λ!^QT/ȯil@zvv[o5Dnoc 0Kq)X03밋1wO%tra-'}0l^QYe e4]BšztVK(1BףůVѪ9MJ9qz EYZCިmʡ-HQV XSN U["409!Ltٵ23kSJ9 H@ S!w)3A H9dv@HU_]kn .9QX]7@ڸ0;yqsZ(HάU0۝zZ3Hԣ'RItyK Me?j9䷺ Oh C)rM(1y+ X 1w|ʚg %LLc6?[@).p&hv崶>{ye__${q&W16C!^GSC4̉K=t$BxYy'd]Ֆ,J'%vBuƑ%(Ҽ츟)2r { `ŮYG Oa=rpȩ,mwIsS[inG] rJ͒5OKq}]77͇yК^QBw81^"ACbuL*W#Zzw}[M^i^x"Й<,=mAeD^]#'G#3[ظvP8|R>oo@K" p|rĵ8ݸ>!'!6p J]LFE~6jy AQ'Z༃ް텵, p='|Uf%nYI3;T FJ8)ڙ@\k1$Ʀ|gUf9?>&#So #`8x }vA]տ_ I8쭋<]2` ~Rn .+ю}2 ՎkMY?h :- D)5KqY YJi4In.=RE'Y"5hMe>s^Xq\㯋/@!i;XA. ևʍZeF6Ln*l:y/d;;цtq 045Sn mk?oQz8KTEɻ+NT*Тx$KS}5z}K祈X593Xh,(8P\@w+y7 Uᣑ ű~S۲fYqւ%VU y:G/&[cuUiԿ!UZ9 ^>0#6H$OyB~1 }Fw&m]LE)?OD endstream endobj 87 0 obj << /Length1 1785 /Length2 13749 /Length3 0 /Length 14877 /Filter /FlateDecode >> stream xڍP;ݝ=@pwwwv{y~ݽZݫj(HTL Ff 3B d Bb`G3n3;d\m,lN.ff+33:8Čݬ{ %56pss lt25,vo45:ZArabrwwg4satp[,*@ Wc;?1"P,\:܍w)}r@hO? DV/665us4[r =@c[nV&+7H+ Wy.V F+ۿJd+.ۛ:A.ro'?'kcn/0733WG&u{+'WؿBMYAfff.n6 0d+#o'_ |E}́?.n@ `fe - 4{,>~o/3{[}L*2’tTo `ɸ|;տdVmnj  s)8w-@&c`6}bnu_YoMIqYz+i]A >;Tͬ\Wd>F+ +nǮהZ\V G|ej~u.+M1VN'!}̀71^/b0Ie>ML&n.=?iobgO_1,& `25Y,@.|e .|*8A~39ʜwe.{.| u ߅zu_@aq7غ6Za'4Ůf so4Uםo lS-xÆ&(=<ƩL!,LbL 2 8h@vrA)޽Oңtyܮ^,s/h(Y\2-478:ߓho ֘Yr5V.",[:{sd\V4+tn̠ۺq*H>?dzd7B.K[ l *e:ߨf+$X$/`ݝi[B+G2I$ACHPHmY֡y{p̦WpNxJ.TIH»^xj"nvM(j]bT|> bxB7M`H1{ː ;4.^ETs?zm&&+bkrDBQo]SGEG4 /֤ OƠD>v1c <Pea%dYoye =6Wծaui O=s~C2G~ -oǪb.1t~ A F7+ z4H[Ip$ƺ_T:(8eȗI\vhwV6ly^qP].8g$xŕth8 ꓇;,?h^ l 3Y֕)M] * ^ TQ;5{K\5Nڴ6B䲩7?dMipG'6-*(Kc&aԎ;ɳD.)Mhz|r"3UMpâ5$/TsxJ߭@~0y7@Wcj}smUߡwPi"(m9z#b[B\ɐ'箥5rq0=;e tuU}1.UKc":C UCaɑ]P  hGcؾ&L %qb aU9=RYywޣ][%`"R?y,8ģuPjC8#bM'ku {qetHYs2$.HT4Db5E}5hB-[c7ctIDBv(e2tAMxCCVήBVSzq ~@;.9[&<6'b_| 2Ƈ*}52d×ZW2vS2>9SBL[3^+O7h{t >B @Cw!}(M|y0fWfqo9i4] lNs]b?xuVeyǠ:#F)uFKrqKYR&/XlrzJ(6\++ ㎸}I_eKp;_OLsir7+9Pdo$ G`Tw6pOKlUkEi&.{{")T[kI(6VOJJSK娗%`!^9rNp%In0Xɶ c7'W+WۋdW^SmUC).5Y$<&~$,^<47I7Y?>5Ӈ[6Wo~Cw:[_ieOfI!p~ g^g6n!D;sTT$Q_xq1E)ŌaJL:(f[ $O}It?<݂H6 kE*GBfti8j7#7okH wϵ+-䩪w"Ad<$)Ӎ)B"3ucݰJR!X>G˒sdl"W{Rzde0,I?SOM9KXdD^\ G4ZP_x`) Vn}Oto!Q!Ĥ {󬤱jp>,S1 R1qQg=S!_T{,#:?d1w(&aPΜV 9z>H:hqQBh9 ~%Sy$ l,mm`l=mD\=yZ,+v k^!kFH<,KcCC%S4/*A JZӣ.HYrg+ֲDL`Uy*oW'@(KVc?)nWAN*]aK1pBuL&I~i$-t9q+pXyQC \Cӻf!T2]oS0E:t\nF{x;,ŁixU S:☴>A* t+1]/r T_=9Jڒ%PфP%S8`ؑ!BSqAMbR֡.XX=V{&窪r&l+lx)>/U_ҘOHx5 6 nK JQ&Aك}̔LQSe\!Lپs1MeJqdBu.|ܗm=)xppL$ b\e vDKSY!1`fz|T,RQ nx<1 ܖL[·@䋰(T|/DmB i _m4/ca>.Ok{[/BURIfoԐ?L+x'ˆWt4>0@ \ILnϼԂے豸\_LhW-/GLqԎәp1um4+՝ˎ_ΨDb75c-wF -HH=$@C"w>#Kp)LPe* z|l!a"Q)6A;]h2 ( rX Яni:ݠ`Љ3)J@YLaUW-})53~=I%s* qս\WNf9n"!d̸PAc =@bB,5) ~]u lꙹ=gkи:}}0ő3LTҊo BQCF#I _x0|-䦕fŞn#^;cS_vݑ0[QZ/ zAƣ;MF( φǂ0KXAĂvdxYHIm P]ΥOg߼>zUYaعsUD>~9:g :l Klӓ%܀QP5@kVeT+ޘ[,8e}7_3RӕuWԻx>/- Rl*rp."˨8P;l_10)쇃Y%DÔ`ED%l`*:Wj{|qN6%0b E`sz^DdȲӎ2ͯj*EW JRafFO NJܲiiI}8vR7qi۬}*9a\kԗSU_p;0A Ю\[qYh6Y/D?| l_/X"KZ icSk0ů h̤T翮IoŸ`NjYe{6-f66{R9DxƥVZbm 4|d))i/rjŮ~+&tۉ¤BVދgUiYY4űp\y-jVz4ozE@ cY} Q6о9(VN|Y*vqh-LO+#Գ $% 5(W}_+w)`O,z0KȂ-7DF³jW6kz ݟZߕ@.1JcXK)<nz9zLc8a`io mݝPSҁ EA\)e>{ P 0M#wDkKh@NM^]aQ~"!OlH .n<#ՍP&n%^?vqozmjO]J  n}e}/ ~ƃgr_}۶f%kmiqUըkY趻sXJbiGT!}q:}sfQfϔ@W9;rZvrTdp Y7~~}آr}}g<22d_/Kؾ8^vjNF+B*3U\ť9Եd-'gLVܮ.\pDIr-MؙT:h 22%jb YF+FwnyRBͶ}p*4osU4!A%1֣(ZǎCN4e"sR/NS}F40<{K156kc"~K-|񎽫E;ݟi _{Tw/ER*j.vmb!kD' r3b)DdFYrj*[O4Ѷeі9Ry|*$B6kI\ԁ*i} 꼄:7K~KG}j}CzX ~г&%45TPq"NFپ:Pm@nh*̮ha5ovRv 9_S!0ڥ<ڪoga&9]C!0J'V@sS_j>BAWX`v",kٽtt%MbSĜY7ЛvLJ]#5Hkgh]Éju~ <~h&+ u VF*[69Qֆcנ@" >EHOц>۝7nQV{8Zd7OiqokUb]yC]m|1m =HyklRnNQ9TD]I)9S d<ϡ k5 GgP [?ndDz#HwL#|Өaѭ77Hd)Q|pɬN/V"@8g[fC Q_xjoeF^2.PKg^Kr’  Jt6 з 'm!!06Uc$h0})M-50u|=ЃQp) pSzjas|<͌ɈY=:ܛlA^ dDWBq[eRhC>kP}5Z^vjdOTd7|HA-m4X`Iʩ7 u#?X28^U=WZŭ? ]#ʟA>=9}*" BvR&]HM*USvfKZ]dw/4ġ>yL&YNb3 ˑ·VJw}n]^Qod ǝ 'rsē4쑢VR0$(}_٧Ecج-Җ9 * q[^C ? C5挘lE BTG3Z8;V* hXA; @ckd~/w~)*pu>̔2v]Q[njxpG06o[\ޒʬf'e2]MXr@[1g/Am3]_!W^To '_ja_gVJ\WT{͉51nR>YTDaPcd_`l  V_q,^ Z^=(O1/\Y>'CL17t&u ompJq'ݢ{LV1΀!+I/#!46>-KgkOcw`90va?pNJYu7MkЅ% EʍUl(2lСwkj~k/K!x eҌ`Z :}tcg{H |5ONb~akPdLe EP6_C^[8fMV|kQh]w&݌k39RU3aTlMTdK4siFF6 W2_b]%!JOW5T7ǧ~6{{tp<3EDQ_ec7vsj<"U WjRi D"ijEf*l41evj28cմ94>j\!_w @>"/ӆ;E)-kB!%Yot)?>l\=ʃX}SaNZؕwV;佹np#0"F%;ߥU$0r4n.ȰLմAqekA,NE4N":vN8O3!yOXzo` tzNj_#yRϓc;y"rS2&%̢ԔRmf,*̙R11M8\pxoMC!KyOʅej@sum{+!z-Fh{VE3T" 8F+c꼦I8!e;?h{ ӷ^`¤g-c:A*An*rTո Mx3Rqh -;y4UkEfh;d(ZaRE kMIFsm_Bab+.^Nz0"bmeҍػՉ`ɐ =mᅩa |~C|Q%~o֗\Kvӵ`EwRͽ?Ve;HRYy|`Z jnۍ\0gJ 4v;<,jğ%Db5먳6,Xi>l PC(,]}VQ-#α#ReU <)V-A\bǕNCylhٚsg\&p}l l6"vԔDfwxmB){e2:٤Q|Nh&?z$tv)c}:jo4`Lx\:X[%~L2qf;%_r&{&} '%>"-3űoH|.wFll\WZjû)/ծU5-R?.mv7o"򈫄`s/.rv]\#d߅ a&Dna _)"c͙ j짱O`㠔'DrJ2֊ubDHۄD>G9uOpvQ>G'$e;Zw0~:ySljb;4cj~:m#G cUDFխ]5WVa Wth.'\_[cܧ喊sыݮY^W'!vO>SWV)2'}3p[ʡeQ `{hPd 瑙R樼:uXc-\uGZV7mnf# 51<"׬{xȀ:_PA)D43jE/܍r2>,5ٺR!=#VhrB-H_3V!B2#䟭i}"cIļb[Hȍ~tyRj:\4P՗A\p'ϵ >e V,F׆x| eIx餶e[+,զ/1}5]%l=ͮ N$#>ºRx<6bq<~T& Û)HƱwQR}o`$+W'hBEh`'Xq}ze%WGM!Ħ7j|f9)5OvǸLr-j}{xj͏!|Xwzo?Br]l<{@o[qT Tj7P&Łرԃ&*0k6DcQkg=vY`^wccr6ڡ}_g7ܮPOpsm܀TeUN.vr~v߷IqOg>o`-?@2e-LW~3RW %"r-=c)̔ AnX+(S,Rto]O4aqQ:n̠@tU%%Y"!2XjkF+J,z[U@: em !8kiM$$|8H?`FέO)X*Nb%@F}*XΉP%W`jϻ &4U,1a̡te2E'Bqk(FewGNÏTy꨹(MԪBGۻ'|xayu= CiܦԚ%Xʼ@-)!YUkAb,MzN҈q-}5u23M[nAىP=XJ_ P^lcu1(+0ԖXHą$bdRқ]\P;BNU*g,Fmc,4Sg% bY]Ά> CF)K!ȳUUC 5JйoKʭ!*t+\w۹c N.[ :16K",Y3%8O]֬kr)-Q8?Ȍub>-1jPX endstream endobj 89 0 obj << /Length1 2449 /Length2 18791 /Length3 0 /Length 20206 /Filter /FlateDecode >> stream xڌPNp0=ܝ![!H9߫emn(HDM Ff^* +BBle@ h&7vySd]m,lN^.^ff+33 xnVfF=@!fdea??Ԧ4."v@'+Sc@hfojt j~K^&&wwwFc;gF{' Az%@ tr*hl2F ?r5{swc' M`ke 9ỳN5y?{`ad/ݿYv665s0yZ,V@< =dɛߙ$ETo[3_%2Ee W~VN@ӷ{23Y;_`n233W& +PF_7o:Lѫ{:V%~`Vl8}T/B`aYLV ob?mNVo`_oefm|$$uu5:QQ{7; `/տY0vxIKIS{6h˥h@c`6}yvMHo5o; oMYʸh,i4Sr1gYkul@@e{gn 3ѽ,Sm#VڛuX98NNƞofy;f@wwys 0wBk&D No`/b0IF,&߈$d~7NS70)F<&"xʿ[-o`R*iFox:Eo-0 A/ߐ/GȿNпX-WTKOK 7ߊ$?[(;9\AoXɼ9727 d 4QvNX@SοeV gro]]f&WbXޚoJg࿙elkl[.X&K'~놋otc޼=oys:?[]~7ޮ =+K|! !]?D)2hW]m9I'A}'J 6#Y0Qu tɩH !{uC_>6=0~Hy4VM-r!>W1j-P.¸0Ѣ_y,Gϟ~%MC=e+f{XڨRgu#%C=NY./rH_ܱKa=:PTt݀b S&:fC:ɮ$ =j]vC;W3Rի-W#*"Ac~1,5V6m%Vj#1#<]Ds,Φްfs;# ] uukY=Z[̫[lIg3;<T 㺎|qD:h\B<d9YlʈÆ 4ٵǝ?#aVhTVp砕K=BLbKoFĽPhU|s_Xa&h 9_A`ԏ[&A s! X X{rf6H8MkP|?9? CUsi+|pDY?wƌr`ߟf|"?1 +Ԃc2(m !=Te@ ?,.rYO%l?<#m]A;Ks[qKLj@C$ k>1W-:Yᖘ&l5e? FI佅k]9ɶ L«'|;JǽxJVNo#%KHgTX+_ׄ zU7ﮉ4p<沵V2QNҹֿdPbgC ,ФGک Pap|)2>ρ%%f.kz6m/z9,4dQfr)a`&;*.8,G-o_Ѵ_̉ˉ#I>UГ9OER}C=НHh l?cj`=ټF|0UY=/cq9RT5۾cP3wuc$Q1lgjHuy(&!Y VĕP{_ɧڧ vp&Db1VajCx3T}+}:ٟFT n M`&;ӝ,_)2bo Jޏ%+>I D%5[EFmw9,8?l5'nifv)PhX%DG2F8¾w1$,hHʄ_V *hKM粖LJ `Mh\F!Ŏ( :}`(oΒʡjn#mR7A(zMj M7=Ƞ%p>?ӮG %FZp"XfwGcv /\']!)gKz?߆/kX)=]uUs|ҁF32{IH(cwjH3H(1 ,Q@wO8+Z](QT oݥ,^Jam'Y!%kܹrf-ESQ [ρ/*T|_y^&F*eޅ"EOW/Ic$[0c˨o?s.H :j;TSQiߺr4Vʭs'e=n&rbPΰЪ#P|GPZLD͙H+Rmx ZbD¹Iq6Ʈt⚑qA)KApvaӉv/Pƻ0:sG-_t?,mu ,]⧄xYK]VW<) $3I8_;dTi/KhT#68E'>W1IY@~~|k]Ǩv{LY}U?+e;@jSZKb0]xټ~b5'ɤF ?n'JӲ"ÙY]e8v*e"r:* B=UHT}I(Xez:11]XcAB˛>(HDQ$$&T~RO\9dkA9:,OF9N30ØUH@P|۰u$0X w:%DnS_ZU~ҌNRr(v13X,eΎh:I`BA¯H I8;E>|7d_!+SXKl$h`9,;B? $DX=BH`-B{8 &xW~(cܭVzu*~ِm׸ 94N&qi&\%1dt95x>!%' קڒ%~B:aV=Ө鑻yOOzB@\?T?S"/ZW9N&|{F考Ì5 EGKҕ'5.N5?a)/`O5D#'U 65 LWgGWq&N~$PZЀR=ڊ"i0&|D G1LXU5_PxfX<S%h^SJH@ [$>`4BU[Oc(@R 6ɀl:C;~H :l%.~0,ŞFgpftPZ|$xM :EavFHX- J19Q&M`M2ۿ%j᳼!iM\4wE>XpkxLNPC{6 Ip*.ĉ$eDTf&BlBHb &HcةZf<|:HBd4| CIVf\n{)=S!%+Gg"w#Rf^mJY{\TZI_|b2!$eøK4|~?뫔$8ICHzT:E?nu1b ##|y(asm;qtZ*L ~H PRu< H L#z=Z+[k`ָr59"uEb'YqJ 9ŏ?A5r&i o4*|V]+GiCi&57n"آ3,4Ƴ[鯨|:FR /r 0pWV,YNUcMnv8wsUb!놬 601(O OR\IХ2i?cU:G=m]fIv}X%gb@XlwR 4~6Y+ T"ekb; |E]ۨ3F)R( b}0<{Jc3bN13k7Y7JX-9rBQ/d/>o= )[}ww 䳾z2RSkсzW8箸K>oU섚ݴ"W# eIт8Ykғ$!|rl4Wnؼ$8lu5ggcV.ƽ16̣+o<1YR`Zڒ"_PЋ܊m&|Dj).Ạ8Pޫ{v:̮4 xUΠVV 60Kdn9/Ky7sJF̽+t-Qpg^ wY@ʭ^;H ,=(\bUe襲w?U^9ݔwi0jq)P)\pmͻDl`w GCw}[# [^?haR@=L-e,=␏&Zf~r4z/v2oJw8M<\s@v_79c?DvwcסTC Lʒq%ՠS)9z_iVofhvصB kx2ĴFcW 2&|"2 7wN!;w1)>2l"}&?4y? s-BsW:*3n9Ej5^#jWDarr9A-O!h :%V!ԡxHNflD?dc*-x@>ؠaOkV-$槅F2G^\< JWDYzZz&/ <ڄTvEXNIw$9%>\2N**}9"Ŋ)!F;䘋f䠖yĚ c\.ڄ΍]C֕r_E`x=HRZNUSތ:ҽQ{NMh;Ko2Dxˁ%5T =cn*AqWrU4*7UxJ#wh4uٷEjY0t#8”(Qz&Z[$E+XI]y X&c1'B3T(}c݉\fHlnoD;1|*./{jt*Ѭ|t U؉Gt_/pCo+sנnӏۯ 3/;}BB_фB1Z$$g w9}Yݍ%G[C_+~9ẁ}J͑ 4^2G 4!Vvn<99PrA$peCD˄| DҌhԍgΔBH WX!KNꐷ֜jMf>%4jB׹|N~qGY$[dˇ~GaFXtR%Xݸ:qDˮBŊxXY%>w>†#&[UNYj .B> du94~c湄 T779i:Xq^\+bt &h d-&yb&0ɗR {"9[1 V*_:K jYMeF.(RKZV]s3䔁™DgFh#:1W6wDe8} 'Gv]~P8qwrLaӧ>'x7i|ZW>!?p@8thDҏz{ňEvR3l#luhS1+RqY@/|?^VXLaEy[r3Ď^Wd nşƞKC,|%\ KÓ{L>GN*~6Z菒F ߥ`՞{Ohl]1G#{߸B!O(@=@5DAV{_3iA>E.?~&t6| [oF\#3|/Gh,؆* 3Nv:t*E=KY?X"E;ueǩd{E܇Q">WmSn(u0jj?Bf-7?f@Qzvـ\/M&Δ.^IRi(sk8̼;]x뵴_p@HtEQJket gພW TV" TI{v\hKA2aln'W C=yYebJ9q41u>8'}IXWA$\-yMv ] -.Fga ǀBs=~̡ni0tyq&](W (}AjtTm6Ezn՚ث#af n@wJRce+$u u]ά֦gzBȜjvWJ!In<'fGdzƈ$ &P n֮?D"Մ@{)r3ү,ҤK-?|^ok$w6xVsQ#eRCYܮug]+r8. Lujnx=o6sׯ9x]Ovr%B/G/oz M}&UX_ͺ)IDEaoZyF2!7gZu CY׍S6 Itm"cj2..KOTX]u )P+v2"7C-h'1xr_e%,"Y: _8D@ @\¼՜OʗM ,9w9_4ܸuAC.T̠1@'&h;4hi+o\Z@n/0ɧ?W-oEakTudkw_۩3 d%% d@=o+ =5`'2L <K(rTUMZz:&~ "c]+yn)T(X $Du8Y ރ:,1<4R%{02%Z/R=_込- QUeX1!3Ұ!@TJdFG^ e0\8Jtk-Yx3z);^Ȏ皞\E2IAr.j0RVXGՋ($B8RAg!NB=y7J*EU4'b'4m# *д@^Kz%N?^K*Of7F8XiQelF5S,wN̰cJ^: % wPg5fT9. &,1=b@گ [<(e'0gȏR4ׇ#-?E[%[p% qӟϹnbѮ6jmjOyȺ7\$bBzKD-\Eo'2Ցl~DM H漏:oc(&]7\Yk)ѫRTHMX/[ oQZGlRӾ\[}Jw~#ݚs$N[t퓒 ,vu6ؚF 1"FE'1AZUp=î uJpNFRJz[ _hȒKhy;Vl$WiJX ]Ut6#.?HF\gL5%v,jjtnJy m'%F^M4t_c˴u O2Go. o.3*|Z7e@KHʥJ%,!U<Y_#ʿЈS<':7;(r#K{f?"F$@RW%j,8Of-P&M N!k|zŲΙ7#?A7! ?ɞDrzook܏dh#|N^ռuIF[bRG˜v=נ ykawI0<8ĸ1Lw6`wcpQY:otD>Amc0Oj&Aߣt"B9a<ĭJ 7EnYݼY3 %YIqCiFGE90\~}4@cKgd8PT4M0}hlDu['%AX%|4nF8 ctߥ}ZFr\O 9 ӭ`(~lJ:n;,gZl*RcX8!Db P8/'lY2O'uN y3V5΅ʤ+'9%Csb9DgI9gR K1c,o²` Fڣc"Ŧ\hib,\N?A!Վݲf~[Cڀ Y07t@WƟƜQزd0(euGkLޕ_㖷s;l+i~M鈇5~f6]XLV>zpmvlkrrE8Lp}pe#XCE1}? [>H4FkMK O(?щEblMNt٥#<_Qʺ=\أOz",Z҆5W0WcƱV3{kn'|&Y^M U! :Ԟ&ʛ'Y  oz1r6Suy0(jER1S,PcClx\*,[_.1ks`vI!'b)[lqڒ|^ $K4`{Baz^P_CPiG҆ ^Y|/)OH4%#'>\4p (_Kh3:V#KSS;W]m4CJ5^G?P i՗E;pl֑> fG"1fp”^SԸM$#0gޗ2A|c89ʊX!M kZL,0 $%cDvU+hy 7d¼M5 +DIʛ0ROI m'VV\sAʍCKo΄+LרaaK`x rK-Ø5kɤJ:а\ˮH 4DψpUuD/9Ué-vC Ȭĭ7[;<ʀTG LRΙ|<-1^dbn,)[*cyuiN8^ ".71G!Nn1V7G^ϟ FdխthyʌgVE[)p~: A ]@i) _ԅ:;fMr0`fGyȒ%Z7d"ذ=6ٺq@1"5kY#m7B.>`\Ud(dz(6e3LYX :0Q.wSYru2!ʆ 2QGɇ[r/f0j۔G 8N߽b|?r:}7ß%TK;QC~þ;]!em1*,d|x<#Rz%# yV3#uq#6 ;QTyPޙ".fKnrdѶNh J'8ZY:ksgh+{/Cw,[c#3gDV/eDM~rQcy}u[ДF/u4*->g c*/yptx%煦/g%1O}36}$R[̨Ͼ߬KsKPWd*;H$;}X`e˘:,|=8e[;74Y]YTGnD-,2 {G-WW[\NPV%9|m.'+-R|Tj.dcT}BS-Ԣk? ЭClˋ=RkNyݞZ5\]YZK=n:e9c.傟)AU ;hƅk~Xzh6N;ډXx~RgG-XtzJAb2%Is>}Z&weҪ*f+`bxyxQ;>/Tf!fݒul`KsB:>'V]\n'ZGT6븦66t_awx+%%=2nZiI=v1ws6'9s#4,pN eT Dٮw^(|‰cnc.\bjZ.vǻ*S(XXO0SGl#e@8~-0R][JAMFojd'NѶ;YnȜs43)srcu3(L;RW^RWF)}#H#KvYLο8kO ǔ"튘SEsLċ.xa3!Kf޶ t&8~lq5&J|+ą')="4+3#P,@MM\ۮAKg$i !bHS$2:Uz!TxxR<3[ u0PGxaIWh 8۰{/{|.h7Yu̲6] OܚTcGħm(lㅊ3􊁠;>8 BWK$(aMWcLĕ9QܣS;Cı_ `i{">O;= lJBЃ#^9ʖjg{}[3S^ڋ--]7őoUb.һH,OXYyd;j963fȊK8@r>85a1;bY)_EYXeB MIk0iL:%^>bcV)J}/ qjh+xc~MLEM*s׾8yRPZ}\]Fh\ǨaI2 UY \4qipG͞*^k1D2Åԩ\eN#^(u'}@^1lq  ;c$.S. pm Z%ļ(\oNHų_H! t1M(+=_`%w,kB 0m/"6y`5e޾2ٕvZeh>eem]+ٖ s ` p^/L6e֧8qt0y 1e394:Ys 8b20 6w ~#'XJ: (˶.9=kT=J0!2%)j}DYqPN*)uMT2/83)ĩ4>zm.GX߭lvqتQFDWկʼcUkB=zWe@7z+ҬMOX0q֩JwytE_ܾ8%{Lz"'-y߬59]-miTL2- Ө30%k9O/\M)} l,TӁ+`qE HOO$K}d!{ h+ozR3SY` E_|۸a waYtPxyDyHճ{trIL8DfUHr5haK`Ap8.H=BJ"T 2G6:Vp"U^+l7D](dJ 2z莴FM:b(OANʀ e%KFa#-e{B6߄7Gkc4]k4Lhf2Oy >k#j?;PhS,)TftQBQ):ǝzTO $/\&^e _dPKQL1%$ _ &b>T#؝ĤYcMؗu_W>oYjdpE`Pj^>p%>+eqsuDÇ"q=ߍ}@0hd%ۘ p;[ G P`:V/Dwy8W!ZCO2&BA5/:EEu8'$ =sS]y;i!wVH1oy+B{~n%sj,.[8^zpN' .0_Y > Ɛ FH̥F}"v4l5jucl6[к]t9τX/) }InVٓNo=gٯU`vzb'O>Fڒ['6+m)7>tra 93E31%iܹxCJ1A^z,s׽ZC/k%Ǣ[>ʘh^^Z$ݦ8~xTgaxP>S~ U\:;eEt7:&z/}TЛ1_=(#iG@Ja-x՜ 61Q{QgUQ94}"&d&[o% i_IB)N[*QXFb;AJkېwy·Isա&*;ˋ 4J(a~}¨tܴaHPe,4eLXzҚRs U]Ql~Ȇh=^>:ȡxGE{V_Kx̂WA w?kf u%Jp_c(Xn㴖@qŒK^+-+fm 8 H]htUo3 q,M0v%bjJj`3| TZۗ2,.HxȦ2栩 K*Ak-)ex2LrG%6K?H/j7e,"H⦸lk&([tC =(ܳ[N܉ J9TpC yY"Dܛm55PD [+v4qg]:o bihڀ2b "q> *$"\߾3h]GצݫK]Q`"}%il: ^CzPl*%p.2aUKINVk]{Ť6jF],?YZ3X[kx1rvW#i9}$Ɛx# _5,B)PD̙
Jl 9+ _DS6e1*.R1Cs]X8 ] A2 _{άB_JWXC\uy|Ef>=(g=fEB ,>ܘɤ~\oDJr@)Y5 O,5%Oèb =)&]H99kyc-vJ8Pdz] c ѫTu9"alA~92JφY"-ZS|}зVPCֺv`R Ņ6=^GmyWԂ:jn[v4үRrPJ"7ne_>MW QA,U?UP‘uf##G" Wћrp7.͞m4 )[Cy>~ bI]?*0we>x_4M~#?P٧ey9 WSyK _$v}*Ì{r lvcBMs6ZmƣmBƎYF?@v[(EV{fMj)Ec3b̾e6i@ˆHGllf_J#OYo߂\lmpMſ/'Uo3YF`5|f rY-y-V@V?/ |u|du|._4sqt|Cx@ w`qj&l]~S#JƼ;.8MFrL_x%{e[RdDն{x6W~2TRf =_l?~‹w'^_<:WFl9F3Z?d&4{33 Ow˫i܉' xFa gY .bjb]"2K^bSJ[XF8eF( w{廑%6"_B;F}P~zJ7DiHw کBఘa^}u9, cu}|1@N7,·]}edc/oʴpRletNT!(#6bL7sR[Je6v'=t;N)5j7S},mep 1/*z݄֚ݿ ~e5վH&b16Gw;UdYB_W5 z[:N4g)LQX5,HЙߑʪ/{(xd &RNo`̵4_R;~6f=ˊ#Qd~jI0>TovYKI]>Ԗq" [&DOL:=YКvqj-ڡUp7{;T_C&Z|"=?PT¯ڞ*Jt]d;+҂en0f rh}G *< FeRwɥIXTdQ aj+~Ҷ)[4:lK.ÕRFn,E6*hަjUKuL\ܾwrH!UfSzW*}Yտ)DoQ11[ ~r&X $E;* OdXۆśjB3Qa$_c)bX !emN(d^[0j;yBAß8zgLJQ, ̙y*,rMHN1 $ޓM VY-݁ ڹAm[R#|wTh1&V|AїR-mcg3q!Fd_ |XV~f4E8VG$kڲE0 s LBۮW&H\!e+Zaa 3K[X.~#L!ѥ5d=R6jdsK2㎠zwG$B5ꗂh 0?v?6*[dkN[Hcjym J$}Gm S#j[E%ovYj[S"r-|6a숡g]gN#( Va <jb.n7׾ZjAVϠ, RۢEx5km.Gfj'#;|OT$H%s0+帹k,=y,e*'/N/50ɼ F#Ɗm[[5]q'T~v _g`[pga^tPn%B8")$f~WhKD[inaUύ܇63|<7斧d}Z wD0j8?\pAQ}'R2wt¶$F8iM.#iRn^(8]&tSiG_J_ḧ́Ɍf]1n4<ǴÛ A/CZ?l*5Dt(qIح GۚW*g3+&7[p*!H|}{Es}o M vAߵkJ=n`'E UHʃJ>W{s`hV@ucR\x{ Ro襎SrD#kiҾٌ}zq7$, EAo6"?(w#6T\M_wDD9Tɷ/5+yHl9SURxR8,+kmR^R]F lyA6ɷQ?؅F]H _Aio$mτ:k^@Q48|lT;BH2H]2m=PpiMG768πS] 0vmЍ+"Suf0))rQWr'+Q{wrox_ u>&J*#F|܄%e\{cՁɦaDBgV jZ.oB{ՍNvU:$.iC=N,\h<.Zf%O%Gˑ*-,I3իl xT?1ٲ) {D`7Jw:\eE RU8E4WA\Ip_D Bl6WAO>z}Ոz {Du1Z\gYm< C͌u_r/Ws>*~4mMhn0н+0m`7}D UA]GxP ASH'>YdJ U?Em4齺'[dLY$&4M~zU̫o uUjj \aGTImc+ <2+}g*o|'jH?&W(;d{L꼌`g";] $mڦfکxjFAY9XM*m؀@]Bj¥HU@E? @Q`^ݗ3 /ЌbKWГm r ҁXj!I){zSiKb:NȈ]~Tk3×T5bxDӇ6,;0O)m&MƘ)|(O:?["0I`$VklG؞]w90 MI::r*[BFT V\׳ m=``cEllS!%C8>gy @OvlNÙ'-WeB4?2ѳ3KX }Q~6Cl嶌N.Fk9)QAS2+Ԯ5:#hn鸲 Έ3x:"@(sᛱ [ f{B*PDf+TNyTܝ%V:u 1\c& r*C,3y?iRy _Ws :KҪI\ T-CA0hj0_=y3k}`jBӛ'1̎Otܷ 䊥렏[Jd=}BZQv%ZwTAҐLk5R_aFUgձ2Oi~v 8̺Hްسȇ(-PȂ0w5H[O dI9#w"1"˕Hoj=8l*ۄCkiR6P~Hxnw2pYyY㤭d'N) k˕DIOa^^I٧`١G9=Y O~Ki">aH'on,oW,W ]KQ'^ cl?;}4~- Qt&:bAnz &vz♏ΩV y5]-CJ+ɪ'D5 OL_)w,aAxBb2SgNTKj$~ rtH܏T\8d#}AkE64t =oqMAo$R}>N)^]@m&ڳ%Ĺ5(oR푧?z$YJVK>SUdɾ_~ͰV/r) n?@ = Gw׀ؖJ<>{Ѭ";X EcE3; YYqφO+`Ah>_VeT^%'r gr~ d?Xf9d:J-\!5(RaAl8/C*ئzmnG ;}{ ͔+.M"7p\EaW(:M7dE7r, 7,w1XYSejGȠteۢ3/Z~壸C˕1tkYIT"r|)'5M;[L!Cos]d?$)\؃oR챽`wVy,c=5,#{C5R%(KJYF79hXg,L/K inZ_w7#֧2YF_-lo9 d+=m $D\a`q <>a`A ՚K.`/&Gǿ)[MjFrЎrG+x.EħqW㩕K|7xD"fRrYЪ b?#eJ'uLS?uz c]m>Y󕀭A fٮkOX]!?v[ ]C{MjxSvǎFRi!ܺ;e+g]V#d%"["q:S7wG3 <yEQ%f \Dx &wK21wE1!Iw>!pBU ѶƝ-{x[^3s\s8L d0)!Kɀz$A^16 v9%p~DdPշF}]QPcsr:1@\+ aLC,*_ TaOJw#O׈9gg\ 9N:CPot敮n<5vK)!wv)"^ 5T2?hR/+N,L"߮#0wn9cJ"WWu?l-ǽx ry酃<՗j%I-vS бm!Q=;_NkZHXL-]_JFHiGsTurب!N)(C+5Ã?f$A^9 +/,(ԉȀ Cl{{Z,ް7½yʕk #AnTk֚36A[.^U5]4l)%RisW^vf$x$ʘpu~*cmטTE+k1e84qZ3>G$/;?RΛ5gV?N}=]qR~t Z<;0Go~_+ӕH(`v-THhc&2na4pΞ`„O 6OfȲ#@貢|GWq86ּӗLc͟3nK?҉u endstream endobj 93 0 obj << /Length1 1373 /Length2 6090 /Length3 0 /Length 7029 /Filter /FlateDecode >> stream xڍvTl7%1:I(nI 1 ch$$QA@$$.%E@RywW_}~uc3QUg\ ŠB@uCS ,!XO_Z8F/:uP,z!@.X(+<08rc@3]m/8/gD_ "w'BCa04 D\.O8𶖁6+;B=}x u;i R5B= <Oɚ(gu4 Ga}@`0G: P.GpY޾p]=*tp,P ȁpo << B{]#C.p_x) 3:](pd1]0x ';<(Y.HZ[B68Qqef1"X] (W[W~o_obG,(ۂ0BoGUBxb7DoWK_t5;#|mBPEz>Z1 s *-~}( /U0ODο%.% b0@~xI i ` H CB.h >% [Gab0x8 aI4=Wr)Zf 1-4d/s"1Gt5Uf/pobRMςRLGWS#mpQp_x߉ n$l1.d<驘=jRZhEmD8 VR(^C%^0 d+Qg t2幹O; +!Ç8 =O⹢q[ߒ8vڡK2 W}\nQ6 Dcf2]TUyIvp\ uyΟɨy|uI:.\:4=̃?nn jnj-7=. 5\<~UO9s}e}6aHB@: G!ZX1"-(q;E}Z5eРrz-i,l%mղݚr1SB sZmB8$)UrI1՝2v/GJފc{vmf |[˃(~)ҦPݯt/}5$Lȏ2l\}%6r:JGN~%@8>.X-z˰f7*sonή?,ʧ?tXFԐ!uxNMg@ϖFy=iK3n3CHxN~MsL`xm6agA8!ZЅ@q.ȧv!@+LkFm2~ϊe- ; , O}]F64]a4M:՛ @G+&IsFROr!_q*;0Z]ǹmUJM3 ΊMQc_SNF%ED"ߎ5+L㖷24jO+9kD 4w| $o"Dž8a#Ӌ؛zg]1<>^|HNTQ|ƽjHp8~D/g;oI*oސ^|bHC)پˡ3+~_: )Ip^ߓ{(Ux4ei zV[b[hwe9&Ӳ_>9.X4VwO&S ؜*> g}YsrN%XA{]c*cYJŏ4_^? AxBCy޷g{(rGBtY!NvV컘WCJ+ܒ7ȵ{1Ŷe4 %)Ԅ1jɰ|~̅o˃qlk]#fCpj7~`d.&sC'-M7-*2tS]mepWץ>D,OWniLT@FFD{kqOm.pf&P4J_M|EtjqAyM⊒UMTj~#.'1HcH,.[(vKl4i$1&DϘ)6< n˛][$g.7̓?>n~`Go*q/͎;*w5We`GuX5Zv("]zN|Hsu8nmrF^ɯs:Μ]~G[qU+ҟy ޥl]5jkܟ5ѻL&ܤҪ2#ygWxyAԶ._W}`2[hV%!Ҥׅx0;m lew|CwVs k1md!2U*f[GyYa;݌:# gD^`V gOl}wX`[^jo L6Zaumu}x_p$t\1x`Wcؓ`ܫ[l<{ySPen~ƀ(=4{ޕnһ6gצ,e9Ijl,_n Onkw^ޥ>Ǔt%G^w~_8?_֢[לT>͒@)5;J?v~ jcSۏ$SLʁJ5@+联Z=]Hxt50ꨢ\_|J>kdsۇEW*e'M}eRt8ݖ)"%W#_G|يVWlW;Q)zcK_ pu ;- D? gKB([;}r mEJ4>sYo0 ݼjl3r m#^lS4)JlٞPxy@c:xFf̽$K *!j eȀIe^+qzo3i);\bG?ӓ o*(>s?@2*1u>M NI6tB:S PBq3EKx_K^抠-/WCI\Ow8׼NK\AV EwMSG'gP;bەQ{m=X~y кDP˲B'XꝮVKZ&=߽'[vody_=0֛i27KUΝٵx/~MUCgiKyD%,, Wk;{ME^${3t\{͌TfKI{4'-Ʒ1Ē!ܳTŎFm`JHfj Ki Sh1z/>ɉ BJ{2 j~: 3WD m{1 ӷ1$桳! cR%0:߯:|^4ĵX: ;hFJMh(f7ɬE_6 鐤=!B(ټ nER 9N6 2_q|=9k^LuЉ#nf&/W6$~ ̣#̢{u=Gb# >=\/. ~esmZ ә[{wZ ~ p[<7?as:YgAh' {!Y/̻|,6nFdjxߨjK)q.יn9o gLvt옇麵j#ҫ3^4"rli ԣ3ˀkbgӃRk-ρu_2)K3&C)!1J66΁~ۅefR%|*\-ռJ՗ #^8UVWsJ`u T>&gb^pj娑dK{ugke"Kmi{ҷP_) EbVY-F] :qto/guxB3hFP%G`t0kˠ -䍝hFWeYOMTq:&[ovt% gu۬!'?gBCՊ.`)(p.iG:I4.#dŽdٖحbԝXpaAybFP,r%[L-x\^-eV吔UfޟIyM>ЪWgC?)$K|FTop\NSܳE}8 > ȅ9J*~|"UMcu%F%\A ]Uo*$Hh$ve{E6UY$erXIX!|?Fyj5`eBEd}Xܭr3Rl[5xZ=J?g^ 1JұI4B.c?3{ʽgìKmϝw#zQ.l[]\Rt|ҍKɭuB!,e>ʒ_%g>2>p |mS |^K-/kUj_[vd~Q36[Id<@ )=)5Vxv׫S(ȪpEHs\`~wdpu-.F>CY~MUq*kw ӚӖdZ,#9 wҎkz o~F_vzP܏X lzh׋LsNsig#:0{~D^ΌUP] Y,gu7]DhUrzb;@}M墄. _sO=yQ$% ewj:ԑ6#ٴ1+˥W|p{7UV^0k'لZNTC.#AlDu,"Gn,p|ωM0fy&)+n㽝pa+`Bե,S}w۷'[э/z!slUj944! JnX*ӝ}IP-GU):=@?[|;bL#Ykv/3|kWDtY h՗NZ!3k&5c:$j &.k@ǽVPfH)~ S#^ݭ*y}G$D B*^t7J5kǪ/q9:F1=P.O`$D,X-\:~⥙_mK BCL1+4:JJ9l7"P~g)8{n2ɞ N⑝4'B6RMT.XJVs09L,ųhnW'qG.Y,Dݟo;B=! &meE4E1RTmw$u[3xtGB<vMS㐟߹R.ѱ$CDE%~zKg?1P endstream endobj 95 0 obj << /Length1 1373 /Length2 6093 /Length3 0 /Length 7034 /Filter /FlateDecode >> stream xڍtT/]%Ȁ9H#) 00--J#tJK(ߨ9{Ͻkݻf<~mp/( P >"bc3?Z"6c0 $]:E ݡ#PT(&)(#! Py@Zu8 $bSz# (t\p Z #]m!`?Rp>vD\%<==A.H~8 /r胑`k\6{0~"6#GmGy`Z؂aHt;k 4:`g?;ѿA`ApWsC`&? ~9H8:@A6hߍrzzC" ($?54KV)]\0W} {|!0;_#ع  n`5ſ=*(vl~%7v6Vu#!`/`mD ( #OvlGFo dƖ *&yy(OHD̢ ݅b`pğfѷ=>36X0?7E0C,w?Po+/a@xuGG3߮OU Bs@%B/.e*Fp$׃ *[gD &?K*lv%$" ! o"ђ708 @#~SX ~~):(Ool4~ſߜDp[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\pI_c!@ڻ˛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`#uAAUcmͰ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$ê endstream endobj 97 0 obj << /Length1 2399 /Length2 15243 /Length3 0 /Length 16650 /Filter /FlateDecode >> stream xڍeT\Ӹ;\. qι${=FwϪY$j "掦@IG7Ff^: 3B[G tqvt#4q{Sv6 '/ /33DG^9@ tstvr{߿j3 {@ hhf tVnnNLL&.4Ok7+*4U6@oqpu+kTjn&.@ n`t! #˿c#kML,v@<=/㻽;M"*S+_U2b@7Wvwޛ#upt--*݉I(#ֻ`ff~?X3efWuo'Ju:9:,K[[|]M<7wEp,,sk37)w1>.^=!d0;:y}Lr"""tZT ``ecpp8y8H?a*`'F7g =f_,oay9I͠/0}A})/U +ͭV}-D,G\1GY;]j ,Gkf׉tFp0s4kX98&..&pCey_Ns `btpt{7Wpth99L"A\&߈$$E\&߈${Q޽(#Vo`RL{{<=ֿXXߩ&f=3fge=h?_cĶ@+?3q6s{?J,0CΞ/6o81ۙa]Qpvtwb;ȻO{V~ƻ~g^_[ީ?JxИ~29}~i?g{N@Tοe֎ρCNv$N{{݀vpޥCzx;]fpt=W?{8b>9+AUU*-`=P PZg Hn}Յo:^݉f4 A έ_kɪSN $:dQ#R奟>3`- J/Ҩ2/@$j<VTVnLkB;af TH cK}bLA꼨?Ox4}ps m2c@*Y#.S-{yYۍbgkAPkE/Lid+YSEU 7gHqa<&NA髅08`PA*a׳x!݌W;x>{Y3OXE'un룿* 0V=˰ Zz(d jYtgV'=HrŕmȐ iy D 6A\ IɳhݒBA߳# `6ήWqy^d(gyff3?H䡮"n[Fj(NْXh$YWMgt;EfO~yjHRj'p+Qa܂=eGM~W/˪c(O{S/foi4*:(E|,rKbqH;cz"]3{$%[Gk"?\#咭Rdq3"D_I_Fs!m̙yB' /&8CT ^/lF(ú$gze8HJM V{i MWQ}Lّ#B噘LZj?YEd0p΋Wu⛅~񺃗c~G}e 慪pGW#ע$XP%&7aIq=J麔 ҏ.1Xf|:A'*xqqJvϬOv N mdWvN iʖ@ k)D0NR%!Qzs"Hi5kT3]W&mADQ `d˹BZ ?+ C!p pHq*PپRoB _^o55 g_3N_G<{zlyv7'UyJo^ڎjȬ[\grkm@q0|oFo޵'tCrvj?WkO6OmI9<)J_t3l/4u0=8Y/nW|;c.5 #&/6zbw*#8MY C}}h ]de'p=2 [3ieqwZd~4{, K~ri*]iNeoK,;qJA*&tEOs*f nB\l\pZl`̖cegQFQ)S&|+A)x&\WoR!:ǜ4 [?gҚuQid {^# (F_M[CM6x+$O @ylccLh 8J?̦djzɱeZbI[$7?˜}1? YL/_o&H>ŋHݣ6̴#UڃVIǓ#ldy6[,V덥e_<"h' b&3ȆDOgC`uraJ=ԘB Hk ҏW,NW_Gms4hE*2ԫ>4.nhո4F R^'Q/yA#fg jTAk•o0ꖸl)s<T} _w"4O)/{F1Ofv wΝ*)2  ]/j=YK-9ye٣P:=,#*_x>xװ:YA[2w봨Z yە l[->P; HIV/(S\ZTR+͙+lrsr)0GHN MNK9147[ng6 ;{j(3kRM^[ͯ] (LW)#f.G9AGsD`#F X ?vg o[|V[:QaVsGo7k`qKI[>EAj_8D( bz9|#^Ĵ}]"5(8d sʉ7p ra|uykh(p^T:DÔHЇTpJ:^w\JrcЭ>BJW{sϬJ$ksqVP9 B}eW i Qd q@at=VKC-4A|yvk^IjB S by "͜#N.btsN1nWBOlLĢ hn|Aa3N3$nf1caeuх+gp~_[>E;Nڶ+ncb'M[9{:f {.K+w記+ rdmFD3.m繖NR9`=״vq4+B-T&o9|8Xz<<ŗjIK\wMY6Vԙ# ud+ KuVs>WT.h*x'R eęm&WhW9dl>zґB(8A"FDbBpxxdG'6==_'/$FMXŮ妃8cƛUcv5ꛦoU9s0-(,Y7eH;Ͼ4= YN=Us#t^A\4t~}\.&_g]wҙ'O؃a.{'WP~$@0_ԺR3U[>M˂.R_Z_e@7duC 4ihy1K:zXjzQ+y(c_2&ȝgg2F6xZ1|u)Z @;F4!_"'|e|- v~6SpWoT_n|\,!QCo*'r# .n ިq'E]б5$OZ}T[sy҄EU.jz\qM;Ou՚g{ΚOO?FZj;b?%zv";Ov`}Vbp< ђQ mjf\A_ݮ*3h-jJ9}lnEZkO >`}5Ρ79fIet-*3bLG&I)2g>de]ӈ{q\J-A7vAbsH^+ -S0olLI荊a $v0xW],/xW $%;4 XVѓ0K;z1Iw 4s|C͗G>#jeqrIy[82]fW]SHF{T+"ኊ9e1"ܰ#A7~5';={*fHpbɊvM~мk9D.ǔ*ԵǶζMϤ-q.TVx3'M5wU1+"#? xMOK  v9AZ 0̉a9o5!!*]`d|'Pbɧ<ֳLڦ鏄h 6]/4Z!}+b(S  DM61qQK4#_MUKzjslp|g&-Gn꣐*Ϟ@-F΄:7KeqǼj]]bqJN#mQXCe#?TӖYu ?āǢɮLa+p/5}+#vwGE<}6}%_CNۭ+aS1v)1h?DL=U~هN]n'T2XG/&_Jt0OE i_TkZ[[#YZ 2#%ZLJP{7_OLȭ14!l0Rq ): zmDǧ|Dw+C[ؼ_#BVRS+1"q\ş%H벧Ca쾪d0yv+!ӿcpq#IHU8r6}\iL2 "mf)rWtlGjmF9ry >َCEJ`#;r鬣Eo$urދpnQu$b[Dߚ*_J0E3$9Z*??7K^pr@BcJjN @2TmJz~=g0@鎈G:*f*G,^L=ۯ;er6j0!)d\(j=}]to YYQ(5j l7&|> ˷==&VĆϣ`?bTT3GGqDigc23 Nn#dϽrXkqVIr~D) 4@߫R=1>bq*}~h 5qqgXIG-%[[# R,𧅁Cm\c=rۅFOV>[9}.@yE6t)NcĬ a{ 9Ium"~4**N/7#YPa3p%ϭDnf C_FRJÐN2XAmfFkd/gyVtb;/ b &RvÌ&S i3Ubr5k)!;mÛ`Oŧ$ <Ö4|O3/6٧:|G0*T6Ӳ$B~pʎHFYIuָźGKi3N& hg Y-YoɃhCWc /-TҨս`rwr,4vn\~ӯ#*V;6uyff=k6ҩ+&ҮGǴlEGfng]j%\p}7$VF7;QRGV-?~d;<_Brls/ uPlmې|uv̊U %SV9+2Da1 ƴLaxT׆B4Y Cmχ+lzB= [F6B{lg鯉ʊ1$H'hjLgѰC0X8U?Ֆ|̫')gўƘYUl_!׶W)-9zL ,vFIbjDu9kQr.聣P/yav'\sK$ A@djvIy{s/MIx6[~lj 8.xw#>2\ -jf-SLy!m}(6<w0z& VjCO -!ȏpMlQ6~n/F&ΐTe=Ccq-U2u"('V<%_y1QipHr'ȿ25{rwDs"(C/yqE33v{3w7?j7LJcT >)#іW~8mמfbߏ??wH_V.pP+Qu$r( Hl8 Y8Gwu^qIswy)zfy$D(t24Qg-EZ㧳OQuQݶG.FY湴ƣpg(Wi2R:ob@ߚpz[MXŖO(;OQFRն؁+0!PWZƦfg[xۆԺI%_=Έ7pҐwFɄsF4"H;n (Ŷ4tRO\h˫*{J%tC8OŇ~@0g=I7e+,l ?{/kq<|q] #h؀Fwj[pgQP-1 +|w[C$\OAaQ8ؿlØ',ܴ^%50rUpCq9*~^=^ڲE+:k5iFVfu-ޘ`Yn[q`Uɕ$;n|B?4Pt*`^T\RbK6 '40] Uq~Xk7A NS皹UXE<9ҧEΞȕW8YIO2Rk%5DŽ#  fY]1ԇX} نI Sg7]C&$ح̒҃YV-*$e w }G ,8uW? ? rVﺌ8=S9$\ ZV\„pI~in_v^ɥ;%hk?/6aqO| ~ӻ\pz,g ObAvbޫ q2""C;B䯊}s<(O`dNh鲙m*ꔙ%?]DDX%P>9pQp^=rDo+ Ʊ PV~Y֡h✫CEETBBa%lhSz{ׅl^QV ##yP; Z4廤(ƍ~,?SUhYs@GVޑ1[ P^5cH]Oy; tgc*~mUȆ#[Q۶py'kY !XPGvVbYH'hʧj+IsőfWa ' v2,IъG-B0ܽp!P& >đ{"hױZi:'{ C =ҋdݢT><|̷]»[v t"܏g>kf2yܐҘ):Cq)rmC~9XB[vOgUs#z.ic䉌{zkzY>دHɰ@%%GT֪ܯ֜R#{x3n͵.$/Kofnߣ x AJR, Lvށ(w6ႉ#'i2iij9b(Rj/YQh 3U,S@&=@4 ڡtm!dɁܖΑ{t`za |bo:kG*^p>TҤ -ͳpG |*]^ׁзoV:i+ T 緧Ojq"NƠRH%CϳHt%:1qgḼd!}G?(ԇ$]>I۔C!_q0^C7LCoe;ͧ[Gđhg:'j tmQ.YdEcmW F(C4(/SΧEԬԳ_\o`%`??>Kde[/V1#<5 [O>&M)0B:Q!kOa%?tJyR]AiMo E0ڕ퉾>ofgj'|[<`'M `>C2yrM&ϙNM}n7y @IҜ %$n*9,Z8ȋ l?#x6]@`S\ XQu]s'-/^]:* C8EOA^k  菺qÅѼB3NYdY]mPk,Pf}Tgt4 Kzo#n/?(n7tfCQ"ĉ{1q&朡]oUCF< m9/ [uoqC*b6]?RcGSu c>wr [ nS~\ePCx)яS]B*8`gM>.Gtw'J)C5wV~j21vf#$֟fHjwaֽ{]P[7Rʌ#P"VKd)L}3NF qNբQ"\O"xŤEXijQFs`㖁hO㘋Iy&G3(3QQQ{l?FS+O8VWJ*gȫR" ͜Kʥ.$ XV2ab!aN2=x,~"lj"d[mTL(•^K>J ~qx;0UOuJ6W*a-q7JjHqu:r(?D&)^; W }/@-_X4dX3-Cq}1efNflܛׅf*zk-Sоw;'&o Z4u#?8 7FLggΰ~d_s0i;yVh)HdEQ{!\;RrCA'~tGu)Aa{SϥL]_fX/+ݘ9_E!,9Su5?JJZ=4)l[hk .!aS6<Re b)yvNu0,t^+~2ZpWńщ\< EM>(xёօd+{P#+ .MHtT pw< Ƙ(i<0HoY9'ks߭i=E#L#)ɠW.t{ XtjW8NusszI[Ksmsx3z,n[^m6Fm 8љm5\%a"0Jd ab$:Ѯy(as5e`($|TH*YYu}e hc ά72 *"zs d"&fH9X +\O!,KT 1(o(2߈Pʫ[esX*\ 浄IOA 2g O<4ꅻsVcÄn+$Xҗi|aaUh/y\a G+CP]j$4Z7s%,{Ѣlk'4蕑=1obՐpd!'nhٔ>Ahky~ITF&Kj4-ZjșIm3H.0kX/K"ݗKbS h|NĂg A3Čr9z1iQ*E'hv%\O655g^:>W@)f,R# 4Y.'<6:c]a+#αs܁ d^.13f +5w$ZXgmY@} 롻|qd∰.d5EuN;IM H\>5}Ҵ>?M/M0NJv~=6Gltv!poPE7h5ryt tmx$)?&T C$Z86uu'!f3jo-orQqUJjxٜ*mjO\^#$ښHj&>)aaP#zv;s཯z$(y#ṙ]"EREs0 R{dƠ˪ZĽV])JkaM r3IXp`c¿y|ڻMT*`]2c&@@IMQŸYɺx!0)]39&q8b$`\;XkWwRPv;dbI[)o'rpRuuOѾrޑd;E>$":H/]8'$ѸJ \"FlOWD5X1Q#WQӦBRaGCu>s\Ӳj'K= 癥3܃y9uk{$s4$JuT& R֬yd>IL߉vWd{mh&df|P#n2ׯS9^Y,QЮ/q6W( kH!} D˶yMK>@wE7⬭B*Z~dQ\xm{V:PZ̰}I^Npz’v!'bgfLkp|`E)`Ykv\^,mk^WEX}Iuw| g"f& -εS҅^a~An]"WʴܪǽOLh`B6>HÅ[0g&hᆐ +'׸?P{Tkg ǗV@?@f!CXt& WRvG͔ ,;8RWVa%kEV^Pg7ݣ)oyݷ`, ³NH@ .5f^ L^S]Ph=|47yY4:⠳\a,,aq)ͬ(lȳ >^ aL/\EIݦdMg@?U]$iFI yQ_$~, q~]{scSeϰ+fJl%jk9)6K` {/KΠw:Ri֦`/t ֩yhCa>`Dc3KhFnuLfEpk) 6K}D;pӍ$H]4h 0QB >ƷQYSnݺc/kHv:q o8E ެsX^oCLnuIލBcv}(n pJ(.O jiOj_Zb'1#RH۴Uz﨑ŏo9 &Npݱb6;]%q5 m2Da4Fm^&[6i\鮗>%+SJO476sr%-o\|RXј>~g|I5<+̨U5hP"K$ % endstream endobj 99 0 obj << /Length1 1407 /Length2 6266 /Length3 0 /Length 7225 /Filter /FlateDecode >> stream xڍuXm> %%H3RJ:  6ZNA$$FD[VZ}ǎc]u^u'=CEL A@e#X@$Fpo? }'DHB`}*P D5܀` X\,! A HOi j"04 2 wr`$ap{(8ܱn@C=G Yg %-$#uG "=y>p3yzVBaV$9 ' ua46 b !@= X/?;jotGA~pi b|1@(FbP =:b7 p_; *=fU2I~ͧcO">-G8^(!c QHsab HRX |흅~50C~PH,0 Z$`0nWǺa-@X_=YaD4!Fj&w "`PB  g{P9@΅ @Ş#{YKe. o[@/S,U%O;Cn~Xza*Abo /^`X5(" Djp_=8/7778vz`@aEf}a5Ͼ{/ P?Qbb0V0d "l c Ib !~`?Lq^X vz|a$SH{pƓJE~aQCbeUz5PeIy-u W2cij  R˝mWZZmEN; >[PzW~\C]-HKt[RR /I1\h3[*ifGbt)?.|!asu)Ae;\z<'1<k( QP;CæO2$)!"y'n^ʉE Ty?B u( >K3a7Cq^Gjx{-ayN-EYT>N'k!0r]Q6C嚡L)3Vp@gJO; YwߘWcѴGt_4f6`.|ME !<5cC߲QWJ3a {A b*u)Jxt5A. 7AGwKPJ͂YN=~p!Ĥ狗R\{9ۿ5-7>P h\wd9ȭ˝).i |#f4vl? !5,(~R!Rn$vc˨S3n6~X2 75,HS %ߟWΣ4R4p j{~mCT&PE7=`wZh^/{IɎ4<l0. ,6-{x. ;m .+,{RL#ܔ;G"_}oPe^apd[B` 3G4;@({nJ"K,n `"QvWĹMn~ݪV`U Cu:ֹ Z93kx5 &; LKw)Vn'L8Xpr.hzM/#4 )(C/n$99b6R ~#N_}u"YC"k % c(,[*0w[[ĶḙBɪF-~vؕ9gsѴiKZdm($nk7Tg͗:%>+ SAv7J,Ҏ!E o Z F 9hךyɡJK]VT" ,FOa*KSTTʩVN>0f#?ohvi;U UT/NZ4עE]4}>f9xDEQ0D-ݜ7|"pENLh(E )>H_vO\*8l"ќ2rSVguepG?. C} v~ɆD Nn)da'^E;(ڋ2MuJ\"̈{,EZ*TWHq@^Vƕehyչ[M*2w DI4+\U\Lmg-oSzvt%\Z9PV6'0Rn'VB8=(ssz7!0:sD"!S96nVSv45Aˋn/4dGOR/Hg[^I~̝p߾^Cz}CCc'-Wx.`āZYݠP<+>y9'` Rssթ!$[eL7;龸t,=)k S*U VzQLŅ*DX{>۪YsR 2ڻ;{ʹmOY!Yx%6xW8C|2Hf=bBnW/:- ^-ψXE0˕E=_/6j:"o[uh5V_.8i>&*@%oiVL# Gނ__ җ`u|tPٝ:Ȣ}|#.\|ncɂܕsⰰ{~j<G*(trZEJӇ0vע& Z#.¦; H-cަl0;mrgrL㹯ӵ$z픿6ձ#Vu-*&tvue GgV'xM!c@u= "±]"N\NӗM?p*'J~<;x,FyQnLKlkphT\)ٖYF! $^kY<}-g4m1/ݟ5 vGH1-)ؘI +]<>⻳мbJg!7'+,V~ Qn/"qqg7}/%% 0'<&hwd&[>gqWJQu9Q \NbӖѮz2O1x'42ytʨFpmy(cu.Nf>oV+?xW-LbBZL5뮸)_ 5Z5\V:TǚfWEm҆~?34\u vOdIq 277I)|ELtםILL2JHV3=cH[WO^wͽD;볣W9氙t$~| s) t:Tg(_D ~pe:.t aC_jP݈J:h)^PvPs#<ϱkr)@,Zkh O"ڠ&֘0l64c(^ˁUwgls󊹒;mzNWd=&/uc Ken+n֎yFjLE@mƭ&vjmQ5xo1J'8"[t$N?9:,cϲ;,jK\mI(_zu1|9^.uO?IW ZvֹAɒ1CR _%smzkө)H 3e 3gیꯪ<\m*8<-Q"lRlOh8+!b`„}.Fg!H"q}7Upp&jɢǶAif@}{YvOwƒ#Kw7-Eg~%6]Q :a` 3Y\*Uʔ; ,grT$%SEX=LcےyhV0 Wwiw6\@^eECsPIYጋQHqBV uw̒@q~-ɮ s_|1N+Z9Mz9[q !oT ZS8z4vVsu\<tږb8KUFjB\*a{u𵽫 ʉi zd]K&~ J^X?-s 7uUpn Fk-Ͼ|OGT㺿$LN=`Z\wH+p71)|~G(.EȀgE.+4>%@Pk.IHt^}Û;/}?~ )>P^yJ:fM"!p7$iJ 'esoN"n3qgu YvnY)ۤ(wm2.3Qѻ+"~;^CoOZ;{R:8hes@g 3Fu9]fo;5^bcw5f~)Lu"b? [G;P'w/Kjǫ>Ri/!ܮT-aɆ09IAeVvR͘2Ww;'Z+h#oi 0 0nNz r[ P5՘ٙ(*[>b騯Z];GOzke9jl4QG-9=+~\Fz,3*8JlKBXM蓂|2AzΛ\Bx/{lj.%% D!q봍f]?ecӈt $u[NF7]9DR_%&kXA,G$@5/jm ./_6qgQsƬQ_Ѣ6O w^_y.U&%x{)1E_0YC(Z䶟lW C4\@UtxH&A<똔RMH73ßna|ג$Dȭw`nM9հX0ѽд&w2:!ǐ@.RHixW|jI3IFWOOzhnl~F`sȚ^a. 38]t)Gqߛ,d ҽOdN=X%W,_TG0z*l_a endstream endobj 101 0 obj << /Length1 1500 /Length2 8527 /Length3 0 /Length 9532 /Filter /FlateDecode >> stream xڍT6LtԀt 1 0t7%HJ7HtH{yo=k=s}}}׾td`E#(S@~n IˎwC@<@T9T\^!1^a1 AnP+:7@qb9y¡6u `xEE9d p(P!l!+A AxW V [Iݝ Hqܡ[6wX~ 9@n k uˡF 8<:ZA:jM'_d7tGNu aN GO jh*q#<o"rAA?2/ :!\]{a`G pa=y>\;G5wVN(OP0V?"p;!|08#6AHHD<ߵXx |@?ZG}} L k~yURʝks$Ӧ~< 3"3h~&qza*b-HM:ٌ(DTݩ< -^H?Gr& V]4/ɻ"|jQ}^$ڔQV8ȿ!U:R$RIАgaC¨/{~^xo"2Qe.g0R)l"42doO*lUkL_ILj5v~dx;q޴_ڰdќGEtux@}fy fiqQP-K߶ +nј܅!%eǭ݋>؁IIvi-Ta%\n&8'ko|tvN.OE8E ׁJ)TL3%f޴ n{,dզS-L))}&YR‹4 3N&zkhp0ZJ8YOky:\a1@0RԴ>akw,Oƈ/) k3lG6ZfݱӠ0`Y}dhf $`=.f{S7qWmMqYJ,_ J*}1#Sp';dlCuDY ˱o RAg0AK/%JFؔI@xJ۽J&4ql1zA  ز^㠾 }ҳ"v'm81ԣܷl_$bwlS)bR.4K> ձBDi#Ԃ-tbV =G{2)6鸢rQ+lDGܬbX뇥(LN%$?Jxyp.x%MB򆰺ӼJKrcdMq@SKF7uGGFE/i0%{UYmusl`/fʪ9rŋ_ls /S[.)@uR LV,Q)Yp̱x|+գl_$DBdIm5nrA {c*_L;M7]&pǠ0 ݻ\25'mS[,lqbCLOLb+HKٹYrlx(Cvꩊ/zm1CoeN<ö&kpd[/05^аBuYtD~9ഒji.zs԰Ke-oIyQ3?|YǓ6/+5W)3xм<#TytWD*+3!:Y,9O),>L,"a󪺺/ F6'CpuK'9?~E_dVHI|]6< plen|iTYM+vm{XKW$(潅 Py8Ujk1c w-RίJٰ콝Ȯϓ!'v_iP&^!['@|\YG J Uw_.|є/dܟ"0 VߐB]Qt3-}h$v;)-e|Csҟ|P3ھ!`A:nEm/mF&=VFf<}Ι|?n| |P g{5Ulz7K8(S1i7,ՆD ͧulaAky!1=^۪&Oda--NIdr= ာnC <{]c;7{F2>t"&x;71,kQyRly,UqDJž6Bsr_ܯw˓N_o\2FuʷPu}Ĺ62*eTKNH%yG67i&tXЧU^7+`YBd2%E}G0u1mCtK-Ԇ2`)su;A#XluQNM0T?]S7su{#96lLQDPr,@<Nۣ;||PԢ+cV q$S\hc7D\T$& --Te+Vim wEpO>S|aٞTJ 򶄩f(o9NܧmhN:c|ۜiJYuf`3/Mz0M36Q1+Fu¨% WhG0ar(EcE26N% < qX8WAbN,]VΒ=Oi2!ìl`/s>^W䰠_Yai$ԉʼnk 1HH>k %LR{\]D֟1m9fS|Xyi<f,z~֡dԦy'RUzot5$q@mP92P~YVbJc=LZBl;4#ἐBv']u{Λ_\2PvJ/[kUUs#j*8:U9Ő!p9iv}λR3o\'X wUIf>^  ,'C{ݵ~2놜#&lu*n/ol&ϙ 7`j5A[[$/^qlE3"GtLR~`5Pb",}%xCpI^;)y7c˦NzK$5WGK8_~X*Y?Qh_k(W1):zvh{UWˆ%j˛it=8mb4.UӪ!/U/'Ì]"YgvG$XGb˷!V/ԱD0FEn\'Ok Jŋ_BKda;h1W}^d;帱~jª|q޽W%t.oYRwJ 0K !{+V$Pjh:eȿ 2RY)R2VLNoZܓ>5'4]c̚jpI r5G⪑ 71ekO`rF@_MVM6/q4PmY kcJ+RY{I3 e6:)g4 pr`c]WRg!up3XAʋi' # Cį/[HAu~_ kaXds+GÌӌx/4mSQDXGo)2n8mؿO[Gv7kUi3sc]lm[i:1wRW՜r®0P!@̉14EsoԢ(>vP>bRF4+rPki)Fh٠ges`'xkzd$'U9'"!q uvKFVUmCD[Pyk }EZzmmtyF6tHwrF U|OE4846g6 &ӬC$xR f{Ө?㵵w]NŖw%U)%K<}Gy}"ZaT|JKwf٢llAQ[B3-{u3Ԗmo&uYX80"-dI7Q}^O+~]! x°(}"4ruSp) YR@&۝.|D.D2 W22C0Vx&lh+[0>>S41K #.IMw[غZ/u oJD*W/pHKCP91ӶtfW*涕`ʦi}vtJtkة_R_e6t}wl2Us{҂% *DA.`74G9ZiT"ߡtйDO+mXm5\'X}eKzG%C) ^<>@oNs@|ɓ9>nUqٞa".OBµyQE81;8}d>pb;2d{g\>/^{fFY)-U}3>Z\~U t 04127Y%6OUH)4Stm7F~;߼D(?0LEkN#LZ~EE{oޛ }B;;m˾ѐ۪Cyj=pzFIPgvU*0j[4*zb{_A͑bGFR ~ӟ b؋s$ U$_S@)y&Q=JlwQB40e BP癴%8D] oǏL3G\b^n */ݧ, :a8ErqKzK/{g "KT*4*[h")rc,TZ)#"|˓^4% /"MC XtLnQVf$s3 vB>/DKxս?~T~o'M{ٜ bd$[XBKo^,4|4i溫|)N@όohn])Su.sX\Oae^ci%m6tYzH⦆C _fE?_' =eJKYΦ O ~Ví\uQ#X+Yt9uïIVkvd8⍋ʨ ϪMIkk3)6]_p-u xop3 #{'-'Kê>YiVtݲ/1ƽų!TRG9~^ɂY1}幩 DiʚLQɻxto^t@/Gխ=-4 lWxs{yyZȦbԯo߁@^JpV ϫ;&" endstream endobj 103 0 obj << /Length1 2143 /Length2 8060 /Length3 0 /Length 9336 /Filter /FlateDecode >> stream xڍ46(jUFމ a*kw(ADD B=zD%ŷ[}gyf{fy 쐶0u$+UtML@HLps.n3G"dPA XL"@-w X Kɀ@@QHC$Z uZH VApG,^P> XZZJ CáPuNB\H( ^9G,%#") q# |@O8h0;ϔzWߩ &p_ c=q8(;;hGe 8@0_w:#~!P(Ax@{ # ! LJx@.[!@u%C ah8 ]~( j;+ ~Ƨ Gà{}'dGL%b4Ue0,P܀0/LQ_JO1.?_ǥp_ Ģa~*`0mapwf? vavHo_W,of/w*^@_!0PHTL(!*׋wLM=(W*xK[w[$@P(=7"uw_z޿ ?z+o \ߺcq3MM\]Xn.Q{ XKls\YB`t:גT0D5isD%$4 :ITB MWEH,eG?TR (S Q"j")&(b"P7qxhۿr5п \Hςq`B\=D`aKԻ7E(b;񇏟j;GƇi"qK7H[d? (@-".gWe"}C [pjbP04na*KGQuGP7 ; #0NG1<( sG#"XG4{%DA9>0_L+ č? AHlSUhiꀨ8EAɝ5FO*rgb1SJck1gKԛEut bdk.~|0D-q]niC9u{) g|-wqvK` 6M1rf2Jѱ7\Ł$VgiD%;gҘ76(PG mL6CQ65 GMA~q&{w} tvՊя#LB, S(^F֒$6RWv({]by>I!^>1?p8-Wq9ᇃ(Lյ{)q+C˶wSAl'yys"[kF䨢Xn=ΜvSEs{?.7wiy-)?N5?<]L4S#t|}QRG1뤈/؏Zg*6ܽĮCU{\n^10K©&۪ZŽ@8cgGN%*$HH֞ߪV1gm'eǰB6}j4ԍ,pg N)c'p0t݃Wߏ s$L:ҖA~%7u:AG5?<!h&2bQG>ŒՎ~b[יM<<ɷ@!\<"O}׽Q%1}b-"0f[2s;1K2x님;\ ʯG:}Dr=eWl>@aɛè4B6t#GvbeEgg&T 5=>n=u72T7I^<0(r.v47ʸTs9R7ђ`&InE[Uúm{AYㅘ LSw$d*-7Kc \"n;7F8[;K>\;  f?H=]|(56u8`6{ |yic;\X澓鶌 >Wӛ9͎Ъ*[iޙ1 T`AhT^kF3Dteȕi"b|~J66rhΓ93V{h;\|Yʟ*K+޼/mVvR*^@_V!׃XF@ơò-lG_m dfIS2JOtz˿r=R\R?sE,j5;(Y4u$غhwI@مeHx'kl^J 1l9\=?&t;>gy$UNR$M_a\jh %9uD*Ŵ 'E7ݲ`(\"RJ=qɽMpơ×| N];/t#v`Tt5*uG !d p7cjʊ]Jk.1h[CT艏thIخ\Gys_$iu) rQn? >c.҈Qawُ8K&\԰3OnIv%HS95W(޺:D&`d9}@NM|OGB‚H oV&x_(ʯ -? muϠWc/%rb%Xވdzɵfk:QҢZUd;d=z|U-60&mbI[~!5d*g؇ v3$ϞڼB˥WӖBLG9{'2i捗/n)W]fzaI=itӒd[Qq'"ARpCqs?Zm*r)w84뫣}Xμ6W@|Ig=Eu J N^NeĜrF͖9[[y{ $Yd2"7 Ou BRGP{*C@T6 DpAD'/|@t.+O}A @ޫI 8n;ܓIHj)8jlQ%FQ3ػ-3}>2&C\&?vJx2 3^!}GiwL'ucl\JZ@𝚤e{mIr]4O7IQ0~"w{0Jûd^eG/j=HSBZHP:-Ad}h^c+e8BNyG8Ykȗf{MO+)Usu>:֎(|%z5fgĵ/6i ."&ʉv % ?R1̑gQ7Q ?t ߎ4W:$JLӃRb,??5<A% ZOf'Fer|(~)^*U=nٽ;B)x>u&sy;NVC0{Yև!qwh3@x±7Y0YmkgQ;MU]f{ \g'"RWGsӑMgF,;b]Sy};覗 &6+gl$@fS3twx-nEڂswq*=?+KfjCE^dfgZUo囨 9d~bK<Skj^f^{kO'S}B-M@eqhGQ֨K|*Ë́ /`K%V`H@{j-%Lw5i"c3AywWSE/]cz؋<CRG Q*_)%,6rU;^J,M&@bh`g"۝5Ξ W6+f<{9JEw]((s^Gl>Fr_ Ҽe?!tvgK~YQɓZ23I0tW6`){G-34=>⎤BLGɜ?g & &P,=?fʞaʇ~Zu bU7V0=i2K;k><QHAq"Q-rd'GE>:g&Y9\X/{o3XB ϘLkYsctU|э29БHw2MŁŏ(_"zRnŮ}AmtmEpT''Zam⹺y& ,l2 5֕n"izy,ԭ ᄾVba= +t^,Bph? ;V.uO /#H]@:Ch򺊰˔1Ê7P+#6k#9_6s/HM</02{Ëe7s /?՟MJmplƊy8YkmƼ`GS ST~3#mTE)kW=\,۴L[ul ʮl'(J*hKNU0'^ ώҿH֡i|oG A6귫ÊOFtx,fE D%k]uᏋlo[k{[|vH\c~ey3iȯg`er\!uhk|!Yk_Ԁ,?B] .hR_ t*dh;Qr^U˪=ET' 5>/ߒ8A*XH&C-.UeA!. p7C|2)D_|H<~IQ3*o) lz^g1ϭń4)xJ*hIf3d"BLEiBAb;9s7 36-kaaVP1ȥgs #aӒovw]z Irî~ҲTb&K]rM<) 6~[&z;kϴyG-'\?ãB(Howw.ѷ&TƋ/G{ZJS]$uDбp 2*:V7+s,%;OʱcV-"tUzL44&'VfMR?G G|c8PM.'ݜW&=g¥e9o~y:.0:qbœ)"6 ,=4Vn6W+Z5HˡܫZsFd& h4bٞS+H#ؠEIf}W W_/6V2XD׏)Kej[55wQH{~H,Y`:6#yd@B|Vqwil|yMwX:cpy>q] U.[<{BG?R$yAXiX찷*ـFIX# 2$y0B6T~@-eJtyLruKd޴i*R|ï4*Y@ ˟ǷADP7_?{Nm^lWom%Ϗgc=][Ѻ~Eox#W sJ7n9$ DoT{aH_˟XoǦ>tJد@zsDK ] >FD#2p=ڍ*qϭ%XX')r3j؋}g>Ab"s0LA-MoE^?o]>:ZPAPcYj|>c)/Wb9 rc_ endstream endobj 112 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.15)/Keywords() /CreationDate (D:20151010024620+02'00') /ModDate (D:20151010024620+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2015/dev/Debian) kpathsea version 6.2.1dev) >> endobj 2 0 obj << /Type /ObjStm /N 94 /First 734 /Length 3105 /Filter /FlateDecode >> stream xZ[o8~cEMNiڴ٦MIg):JcylR%;]`l;D2fʘeڰa"cWńM3aqsLPgR F?#:R2,菛e&S>r-iw<0Le6LA 1.yacހr,H$!,]Y mBYԵc<:0& 8$R[Yf: -`4 XAyЩf2EHA(d\&U9܁@, woa?,2%dߊ+Y7C' +osvU>bޤ7C6sѕ˿Ê4NJ7s}IɠM<6wۋ,I躘}.fe4aw]bw>n6,}ҩtsg:pO%{$'O:8gm&p-Q9E6"O٤O)Ėՠ>eFG0's$; DyD^v?}.ct0O+$2.K~>X!M%dJ€4wƮtCuQW\)R?Sh6^n"Bk=d&s]xtN9 H/][h&*"Q0aV*یNE)ArYʞR!.@<;f"^ "Ad>A:U'fun@i,44Z!DM.]Ш#PGm|X1{^:D<ؠ:{rlv:Ū]YQ͓nwc=FX$zxÊAD,qVҥ{`tKJBurۭF>K 0YkC[LŞ5K]!vs]GU;dZh2)NV` .)+H픭Wmo]Ya $Dgh#MpihT 2Zwu )K *<|4, y$d@*" lRĕjJ:td׿t"cwUvk<~:׆ޖܜ}:NZ֢LT)\TRF=e{Ԝ_Y4oR: \TL e$w,Ku7Rҵu>XPgs'|MxE0Y$ KFJOda*BDvQ"Д|sjU 4@22QBL׀iG&95zK3 zM75NjqNUN[i4D*0dk*ןF.k Z?˧`\vӻÓ'/q!`ػ2(mc,K& (. mz}\ʣe>E[챠'eo8n9˰.Ur:a C~_`N8:LJa:o ~qw׋0]2cz]}ؔ$>H'KIN-]ewv[J7R5|̂'Y~ a|*|6>'[gvm 1k0^@,3ҚY|^&ьֹ/ڍ1TZ]!tp7([bTmb>Kn怎.zj@%lRbEՊR4yB5MNtqt8oKBO*ê!R`J ;aZtR.[ZtElr Oe:(hWesR endstream endobj 113 0 obj << /Type /XRef /Index [0 114] /Size 114 /W [1 3 1] /Root 111 0 R /Info 112 0 R /ID [<700C166EA5B22AD5A3931C6BC2F7C2C8> <700C166EA5B22AD5A3931C6BC2F7C2C8>] /Length 272 /Filter /FlateDecode >> stream x.PR5jy汈x+o WXz+;/_ι暙&&S 'AcȇHPmpPi؇R( Aʡ*Ffs` VamXZYޟJlB+4C,GZd;S G~Y/  Ä,w'e7^SoiWkFyJ!9)5/=z-H/iEk v !p Wϛ)|J$ endstream endobj startxref 132267 %%EOF doMC/inst/doc/gettingstartedMC.R0000644000175100001440000000345612606057735016252 0ustar hornikusers### R code from vignette source 'gettingstartedMC.Rnw' ################################################### ### code chunk number 1: loadLibs ################################################### library(doMC) registerDoMC(2) 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: coreoptions2 ################################################### registerDoMC(2) options(cores=4) getDoParWorkers() doMC/inst/doc/gettingstartedMC.Rnw0000644000175100001440000002575012606057735016620 0ustar hornikusers% \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 \texttt{parallel} package, originally written by Simon Urbanek and incorporated into \texttt{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. 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. \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 approximately half 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(2) 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: \begin{verbatim} > registerDoMC() > getDoParWorkers() [1] 3 > options(cores=2) > getDoParWorkers() [1] 2 > options(cores=3) > getDoParWorkers() [1] 3 \end{verbatim} If you did specify the number of cores when registering \texttt{doMC}, the ``cores'' option is ignored: <>= registerDoMC(2) options(cores=4) 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/0000755000175100001440000000000012606057534014101 5ustar hornikusersdoMC/inst/unitTests/options.R0000644000175100001440000000056211472541377015725 0ustar hornikuserstest01 <- 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.sh0000644000175100001440000000152111472541377017115 0ustar hornikusers#!/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/0000755000175100001440000000000012606057534012264 5ustar hornikusersdoMC/tests/doRUnit.R0000644000175100001440000000534411722000047013762 0ustar hornikusers## 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/NAMESPACE0000644000175100001440000000010112233530232012314 0ustar hornikusersexport(registerDoMC) import(foreach, iterators, parallel, utils) doMC/demo/0000755000175100001440000000000012606057534012046 5ustar hornikusersdoMC/demo/sincMC.R0000644000175100001440000000166411472541377013357 0ustar hornikuserslibrary(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/00Index0000644000175100001440000000006111472541377013200 0ustar hornikuserssincMC computation of the sinc function doMC/NEWS0000644000175100001440000000360112303167452011614 0ustar hornikusers NEWS/ChangeLog for doMC ------------------------- 1.3.3 2014-02-25 Modified so that vignette uses no more than two workers. 1.3.2 2013-11-18 Modified to check for errors early to avoid calling combine function when errors occur. 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/0000755000175100001440000000000012606057533011322 5ustar hornikusersdoMC/R/doMC.R0000644000175100001440000001472412242556354012300 0ustar hornikusers# # 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/0000755000175100001440000000000012606057735013135 5ustar hornikusersdoMC/vignettes/gettingstartedMC.Rnw0000644000175100001440000002575012303167452017076 0ustar hornikusers% \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 \texttt{parallel} package, originally written by Simon Urbanek and incorporated into \texttt{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. 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. \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 approximately half 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(2) 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: \begin{verbatim} > registerDoMC() > getDoParWorkers() [1] 3 > options(cores=2) > getDoParWorkers() [1] 2 > options(cores=3) > getDoParWorkers() [1] 3 \end{verbatim} If you did specify the number of cores when registering \texttt{doMC}, the ``cores'' option is ignored: <>= registerDoMC(2) options(cores=4) 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/MD50000644000175100001440000000162212607127364011433 0ustar hornikusersa93a8e6051b93c2f0b1854918e56f386 *DESCRIPTION 7fe3d7214125288822cd4472ecc6c4a4 *NAMESPACE feeb8fb6dd6f6b8426d2450f60348093 *NEWS 32dfc0390122f8f3211a9ad035402c3b *R/doMC.R f3b6a0af4d22fdd6d4e48d1bd2fc96d2 *build/vignette.rds c09a9ac7a720c8ceb98ae815a5542092 *demo/00Index b6ddb31150961d04b467a413affde041 *demo/sincMC.R 64cace2ee0f1986d1baf44199b483faa *inst/doc/gettingstartedMC.R 0b3be19ecbd467c465d6264bf6768e7e *inst/doc/gettingstartedMC.Rnw f43dfa3d074de6a41148b8a908a709fa *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 0b3be19ecbd467c465d6264bf6768e7e *vignettes/gettingstartedMC.Rnw doMC/build/0000755000175100001440000000000012606057735012224 5ustar hornikusersdoMC/build/vignette.rds0000644000175100001440000000034712606057735014567 0ustar hornikusersQ 0LhA?RR54jZ@旫[kƃnYrvB&P)B6r 3u!F3 [zA-tNyINJ <50_qpcݩA_dY(j!y׾PϷe׶RgQQATσ]ZGU?hR\L3?U|?doMC/DESCRIPTION0000644000175100001440000000165612607127364012640 0ustar hornikusersPackage: doMC Type: Package Title: Foreach Parallel Adaptor for 'parallel' Version: 1.3.4 Authors@R: c(person("Rich", "Calaway", role="cre", email="richcala@microsoft.com"), person("Revolution", "Analytics", role=c("aut", "cph")), person("Steve", "Weston", role="aut")) 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 Author: Rich Calaway [cre], Revolution Analytics [aut, cph], Steve Weston [aut] Maintainer: Rich Calaway Repository: CRAN Repository/R-Forge/Project: domc Repository/R-Forge/Revision: 17 Repository/R-Forge/DateTimeStamp: 2015-10-10 00:31:58 Date/Publication: 2015-10-13 09:12:51 NeedsCompilation: no Packaged: 2015-10-10 00:46:21 UTC; rforge OS_type: unix doMC/man/0000755000175100001440000000000012606057534011675 5ustar hornikusersdoMC/man/doMC-package.Rd0000644000175100001440000000247712110733555014403 0ustar hornikusers\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.Rd0000644000175100001440000000224012110733555014503 0ustar hornikusers\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}